From 805637d104bc9a18e6d4d376521687b289b5d856 Mon Sep 17 00:00:00 2001 From: n1gp Date: Sat, 4 Apr 2015 16:53:58 -0400 Subject: [PATCH] first commit --- README.md | 7 + Source/bin/settings.ini | 1080 + Source/bin/windowsSettings.ini | 3 + Source/cudaSDR.pri | 145 + Source/cudaSDR.pro | 88 + Source/cudaSDR.pro.user | 208 + Source/res/cusdr.qrc | 36 + Source/res/cusdr.rc | 1 + Source/res/img/MainBkg.png | Bin 0 -> 13973 bytes Source/res/img/VolumeIcon.icns | Bin 0 -> 118027 bytes Source/res/img/VolumeIcon.psd | Bin 0 -> 698469 bytes Source/res/img/bottomBorder.png | Bin 0 -> 164 bytes Source/res/img/close - Kopie.png | Bin 0 -> 396 bytes Source/res/img/close.png | Bin 0 -> 409 bytes Source/res/img/close_high.png | Bin 0 -> 439 bytes Source/res/img/cuSDR.ico | Bin 0 -> 165662 bytes Source/res/img/cuSDR_32.ico | Bin 0 -> 4286 bytes Source/res/img/cuSDR_64.ico | Bin 0 -> 16958 bytes Source/res/img/cuSDR_big.ico | Bin 0 -> 165662 bytes Source/res/img/cudaLogo.xcf | Bin 0 -> 746448 bytes Source/res/img/cudaSDRLogo.png | Bin 0 -> 254302 bytes Source/res/img/cusdr2.png | Bin 0 -> 15101 bytes Source/res/img/cusdr3.png | Bin 0 -> 1331 bytes Source/res/img/cusdr4.png | Bin 0 -> 2046 bytes Source/res/img/cusdrLogo.png | Bin 0 -> 135278 bytes Source/res/img/cusdrLogo2.png | Bin 0 -> 107663 bytes Source/res/img/cusdrLogo2_org.png | Bin 0 -> 137548 bytes Source/res/img/cusdrLogo3.png | Bin 0 -> 105130 bytes Source/res/img/cusdr_hpsdr.png | Bin 0 -> 42676 bytes Source/res/img/down_arrow.png | Bin 0 -> 133 bytes Source/res/img/down_arrow_off.png | Bin 0 -> 123 bytes Source/res/img/drawer.png | Bin 0 -> 192 bytes Source/res/img/hide.png | Bin 0 -> 435 bytes Source/res/img/hide_high.png | Bin 0 -> 394 bytes Source/res/img/hpsdr4.png | Bin 0 -> 24878 bytes Source/res/img/hpsdr5.ico | Bin 0 -> 4286 bytes Source/res/img/left - Kopie.png | Bin 0 -> 94 bytes Source/res/img/left.png | Bin 0 -> 184 bytes Source/res/img/leftBottom.png | Bin 0 -> 193 bytes Source/res/img/leftMiddle.png | Bin 0 -> 126 bytes Source/res/img/leftTop.png | Bin 0 -> 162 bytes Source/res/img/left_arrow.png | Bin 0 -> 197 bytes Source/res/img/maximize.png | Bin 0 -> 417 bytes Source/res/img/maximize_high.png | Bin 0 -> 398 bytes Source/res/img/minimize.png | Bin 0 -> 499 bytes Source/res/img/minimize_high.png | Bin 0 -> 467 bytes Source/res/img/record.png | Bin 0 -> 670 bytes Source/res/img/right - Kopie.png | Bin 0 -> 94 bytes Source/res/img/right.png | Bin 0 -> 144 bytes Source/res/img/rightBottom.png | Bin 0 -> 200 bytes Source/res/img/rightMiddle.png | Bin 0 -> 133 bytes Source/res/img/rightTop.png | Bin 0 -> 166 bytes Source/res/img/right_arrow.png | Bin 0 -> 197 bytes Source/res/img/settings.png | Bin 0 -> 3649 bytes Source/res/img/splash.psd | Bin 0 -> 300778 bytes Source/res/img/topBorder.png | Bin 0 -> 144 bytes Source/res/img/topBorder2.png | Bin 0 -> 282 bytes Source/res/img/up_arrow.png | Bin 0 -> 125 bytes Source/res/img/up_arrow_off.png | Bin 0 -> 126 bytes Source/res/img/upd-error.png | Bin 0 -> 1089 bytes Source/res/img/upd-info.png | Bin 0 -> 955 bytes Source/res/img/upd-warning.png | Bin 0 -> 853 bytes Source/res/img/warn.png | Bin 0 -> 219 bytes Source/res/img/warning.png | Bin 0 -> 853 bytes Source/res/img/warningMediumIcon.png | Bin 0 -> 592 bytes Source/res/qrc_cusdr.cpp | 20963 ++++++++++++++++ Source/src/AudioEngine/cusdr_audio_engine.cpp | 1465 ++ Source/src/AudioEngine/cusdr_audio_engine.h | 442 + .../cusdr_audio_settingsdialog.cpp | 226 + .../AudioEngine/cusdr_audio_settingsdialog.h | 100 + Source/src/AudioEngine/cusdr_audio_spectrum.h | 142 + .../cusdr_audio_spectrumanalyser.cpp | 422 + .../cusdr_audio_spectrumanalyser.h | 229 + Source/src/AudioEngine/cusdr_audio_utils.cpp | 155 + Source/src/AudioEngine/cusdr_audio_utils.h | 96 + .../src/AudioEngine/cusdr_audio_waveform.cpp | 484 + Source/src/AudioEngine/cusdr_audio_waveform.h | 237 + .../src/AudioEngine/cusdr_audio_wavfile.cpp | 165 + Source/src/AudioEngine/cusdr_audio_wavfile.h | 83 + Source/src/AudioEngine/cusdr_fspectrum.cpp | 94 + Source/src/AudioEngine/cusdr_fspectrum.h | 103 + Source/src/CL/qclbuffer.h | 167 + Source/src/CL/qclcommandqueue.h | 120 + Source/src/CL/qclcontext.h | 202 + Source/src/CL/qcldevice.h | 208 + Source/src/CL/qclevent.h | 230 + Source/src/CL/qclext_p.h | 131 + Source/src/CL/qclglobal.h | 92 + Source/src/CL/qclimage.h | 214 + Source/src/CL/qclimageformat.h | 167 + Source/src/CL/qclkernel.h | 480 + Source/src/CL/qclmemoryobject.h | 128 + Source/src/CL/qclplatform.h | 117 + Source/src/CL/qclprogram.h | 137 + Source/src/CL/qclsampler.h | 137 + Source/src/CL/qcluserevent.h | 87 + Source/src/CL/qclvector.h | 228 + Source/src/CL/qclworksize.h | 126 + Source/src/DataEngine/cusdr_audioReceiver.cpp | 116 + Source/src/DataEngine/cusdr_audioReceiver.h | 87 + .../src/DataEngine/cusdr_chirpProcessor.cpp | 576 + Source/src/DataEngine/cusdr_chirpProcessor.h | 145 + Source/src/DataEngine/cusdr_dataEngine.cpp | 3761 +++ Source/src/DataEngine/cusdr_dataEngine.h | 534 + Source/src/DataEngine/cusdr_dataIO.cpp | 661 + Source/src/DataEngine/cusdr_dataIO.h | 120 + Source/src/DataEngine/cusdr_discoverer.cpp | 271 + Source/src/DataEngine/cusdr_discoverer.h | 86 + Source/src/DataEngine/cusdr_receiver.cpp | 772 + Source/src/DataEngine/cusdr_receiver.h | 231 + Source/src/DataEngine/datatypes.h | 51 + Source/src/DataEngine/fractresampler.cpp | 352 + Source/src/DataEngine/fractresampler.h | 35 + Source/src/DataEngine/soundout.cpp | 583 + Source/src/DataEngine/soundout.h | 76 + Source/src/GL/cusdr_oglDisplayPanel.cpp | 2827 +++ Source/src/GL/cusdr_oglDisplayPanel.h | 345 + Source/src/GL/cusdr_oglDistancePanel.cpp | 2760 ++ Source/src/GL/cusdr_oglDistancePanel.h | 318 + Source/src/GL/cusdr_oglInfo.cpp | 180 + Source/src/GL/cusdr_oglInfo.h | 82 + Source/src/GL/cusdr_oglReceiverPanel.cpp | 4486 ++++ Source/src/GL/cusdr_oglReceiverPanel.h | 432 + Source/src/GL/cusdr_oglText.cpp | 282 + Source/src/GL/cusdr_oglText.h | 63 + Source/src/GL/cusdr_oglUtils.h | 899 + Source/src/GL/cusdr_oglWidebandPanel.cpp | 2074 ++ Source/src/GL/cusdr_oglWidebandPanel.h | 290 + Source/src/QtDSP/fftw3.h | 412 + Source/src/QtDSP/qtdsp_agc.cpp | 303 + Source/src/QtDSP/qtdsp_agc.h | 116 + Source/src/QtDSP/qtdsp_demodulation.cpp | 274 + Source/src/QtDSP/qtdsp_demodulation.h | 90 + Source/src/QtDSP/qtdsp_dspEngine.cpp | 392 + Source/src/QtDSP/qtdsp_dspEngine.h | 133 + Source/src/QtDSP/qtdsp_dualModeAverager.cpp | 116 + Source/src/QtDSP/qtdsp_dualModeAverager.h | 64 + Source/src/QtDSP/qtdsp_fft.cpp | 90 + Source/src/QtDSP/qtdsp_fft.cpp.orig | 91 + Source/src/QtDSP/qtdsp_fft.h | 64 + Source/src/QtDSP/qtdsp_fft.h.orig | 64 + Source/src/QtDSP/qtdsp_filter.cpp | 682 + Source/src/QtDSP/qtdsp_filter.h | 153 + Source/src/QtDSP/qtdsp_invsinc_coeff.h | 141 + Source/src/QtDSP/qtdsp_powerSpectrum.cpp | 212 + Source/src/QtDSP/qtdsp_powerSpectrum.h | 108 + Source/src/QtDSP/qtdsp_qComplex.h | 146 + Source/src/QtDSP/qtdsp_signalMeter.cpp | 74 + Source/src/QtDSP/qtdsp_signalMeter.h | 69 + Source/src/QtDSP/qtdsp_wpagc.cpp | 630 + Source/src/QtDSP/qtdsp_wpagc.h | 178 + Source/src/Util/cusdr_buttons.cpp | 223 + Source/src/Util/cusdr_buttons.h | 100 + Source/src/Util/cusdr_colorTriangle.cpp | 1523 ++ Source/src/Util/cusdr_colorTriangle.h | 140 + Source/src/Util/cusdr_cpuUsage.cpp | 316 + Source/src/Util/cusdr_cpuUsage.h | 87 + Source/src/Util/cusdr_cpuUsage_unix.cpp | 42 + Source/src/Util/cusdr_cpuUsage_unix.h | 24 + Source/src/Util/cusdr_highResTimer.cpp | 109 + Source/src/Util/cusdr_highResTimer.h | 72 + Source/src/Util/cusdr_image.cpp | 96 + Source/src/Util/cusdr_image.h | 52 + Source/src/Util/cusdr_imageblur.cpp | 139 + Source/src/Util/cusdr_imageblur.h | 57 + Source/src/Util/cusdr_led.cpp | 91 + Source/src/Util/cusdr_led.h | 63 + Source/src/Util/cusdr_painter.cpp | 239 + Source/src/Util/cusdr_painter.h | 105 + Source/src/Util/cusdr_queue.h | 135 + Source/src/Util/cusdr_splash.cpp | 62 + Source/src/Util/cusdr_splash.h | 40 + Source/src/Util/cusdr_styles.h | 439 + Source/src/Util/qcircularbuffer.h | 1294 + Source/src/cusdr_agcWidget.cpp | 642 + Source/src/cusdr_agcWidget.h | 165 + Source/src/cusdr_alexAntennaWidget.cpp | 491 + Source/src/cusdr_alexAntennaWidget.h | 116 + Source/src/cusdr_alexFilterWidget.cpp | 1045 + Source/src/cusdr_alexFilterWidget.h | 160 + Source/src/cusdr_alexTabWidget.cpp | 86 + Source/src/cusdr_alexTabWidget.h | 69 + Source/src/cusdr_chirpWidget.cpp | 1103 + Source/src/cusdr_chirpWidget.h | 231 + Source/src/cusdr_colorsWidget.cpp | 711 + Source/src/cusdr_colorsWidget.h | 141 + Source/src/cusdr_displayTabWidget.cpp | 198 + Source/src/cusdr_displayTabWidget.h | 106 + Source/src/cusdr_displayWidget.cpp | 1056 + Source/src/cusdr_displayWidget.h | 196 + Source/src/cusdr_extCtrlWidget.cpp | 474 + Source/src/cusdr_extCtrlWidget.h | 93 + Source/src/cusdr_fonts.cpp | 224 + Source/src/cusdr_fonts.h | 89 + Source/src/cusdr_hamDatabase.cpp | 25 + Source/src/cusdr_hamDatabase.h | 1404 ++ Source/src/cusdr_hpsdrTabWidget.cpp | 212 + Source/src/cusdr_hpsdrTabWidget.h | 105 + Source/src/cusdr_hpsdrWidget.cpp | 1023 + Source/src/cusdr_hpsdrWidget.h | 144 + Source/src/cusdr_mainWidget.cpp | 2710 ++ Source/src/cusdr_mainWidget.h | 433 + Source/src/cusdr_networkWidget.cpp | 600 + Source/src/cusdr_networkWidget.h | 129 + Source/src/cusdr_radioParameter.h | 35 + Source/src/cusdr_radioPopupWidget.cpp | 2670 ++ Source/src/cusdr_radioPopupWidget.h | 314 + Source/src/cusdr_radioTabWidget.cpp | 185 + Source/src/cusdr_radioTabWidget.h | 100 + Source/src/cusdr_radioWidget.cpp | 2301 ++ Source/src/cusdr_radioWidget.h | 209 + Source/src/cusdr_receiverWidget.cpp | 125 + Source/src/cusdr_receiverWidget.h | 98 + Source/src/cusdr_server.cpp | 495 + Source/src/cusdr_server.h | 134 + Source/src/cusdr_serverWidget.cpp | 334 + Source/src/cusdr_serverWidget.h | 118 + Source/src/cusdr_settings.cpp | 4627 ++++ Source/src/cusdr_settings.h | 1586 ++ Source/src/cusdr_transmitOptionsWidget.cpp | 369 + Source/src/cusdr_transmitOptionsWidget.h | 97 + Source/src/cusdr_transmitPAWidget.cpp | 228 + Source/src/cusdr_transmitPAWidget.h | 88 + Source/src/cusdr_transmitTabWidget.cpp | 164 + Source/src/cusdr_transmitTabWidget.h | 88 + Source/src/exception.h | 151 + Source/src/helper_cuda.h | 1185 + Source/src/helper_functions.h | 42 + Source/src/helper_image.h | 1110 + Source/src/helper_string.h | 498 + Source/src/helper_timer.h | 499 + Source/src/main.cpp | 385 + 232 files changed, 95906 insertions(+) create mode 100644 README.md create mode 100644 Source/bin/settings.ini create mode 100644 Source/bin/windowsSettings.ini create mode 100644 Source/cudaSDR.pri create mode 100644 Source/cudaSDR.pro create mode 100644 Source/cudaSDR.pro.user create mode 100644 Source/res/cusdr.qrc create mode 100644 Source/res/cusdr.rc create mode 100644 Source/res/img/MainBkg.png create mode 100644 Source/res/img/VolumeIcon.icns create mode 100644 Source/res/img/VolumeIcon.psd create mode 100644 Source/res/img/bottomBorder.png create mode 100644 Source/res/img/close - Kopie.png create mode 100644 Source/res/img/close.png create mode 100644 Source/res/img/close_high.png create mode 100644 Source/res/img/cuSDR.ico create mode 100644 Source/res/img/cuSDR_32.ico create mode 100644 Source/res/img/cuSDR_64.ico create mode 100644 Source/res/img/cuSDR_big.ico create mode 100644 Source/res/img/cudaLogo.xcf create mode 100644 Source/res/img/cudaSDRLogo.png create mode 100644 Source/res/img/cusdr2.png create mode 100644 Source/res/img/cusdr3.png create mode 100644 Source/res/img/cusdr4.png create mode 100644 Source/res/img/cusdrLogo.png create mode 100644 Source/res/img/cusdrLogo2.png create mode 100644 Source/res/img/cusdrLogo2_org.png create mode 100644 Source/res/img/cusdrLogo3.png create mode 100644 Source/res/img/cusdr_hpsdr.png create mode 100644 Source/res/img/down_arrow.png create mode 100644 Source/res/img/down_arrow_off.png create mode 100644 Source/res/img/drawer.png create mode 100644 Source/res/img/hide.png create mode 100644 Source/res/img/hide_high.png create mode 100644 Source/res/img/hpsdr4.png create mode 100644 Source/res/img/hpsdr5.ico create mode 100644 Source/res/img/left - Kopie.png create mode 100644 Source/res/img/left.png create mode 100644 Source/res/img/leftBottom.png create mode 100644 Source/res/img/leftMiddle.png create mode 100644 Source/res/img/leftTop.png create mode 100644 Source/res/img/left_arrow.png create mode 100644 Source/res/img/maximize.png create mode 100644 Source/res/img/maximize_high.png create mode 100644 Source/res/img/minimize.png create mode 100644 Source/res/img/minimize_high.png create mode 100644 Source/res/img/record.png create mode 100644 Source/res/img/right - Kopie.png create mode 100644 Source/res/img/right.png create mode 100644 Source/res/img/rightBottom.png create mode 100644 Source/res/img/rightMiddle.png create mode 100644 Source/res/img/rightTop.png create mode 100644 Source/res/img/right_arrow.png create mode 100644 Source/res/img/settings.png create mode 100644 Source/res/img/splash.psd create mode 100644 Source/res/img/topBorder.png create mode 100644 Source/res/img/topBorder2.png create mode 100644 Source/res/img/up_arrow.png create mode 100644 Source/res/img/up_arrow_off.png create mode 100644 Source/res/img/upd-error.png create mode 100644 Source/res/img/upd-info.png create mode 100644 Source/res/img/upd-warning.png create mode 100644 Source/res/img/warn.png create mode 100644 Source/res/img/warning.png create mode 100644 Source/res/img/warningMediumIcon.png create mode 100644 Source/res/qrc_cusdr.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_engine.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_engine.h create mode 100644 Source/src/AudioEngine/cusdr_audio_settingsdialog.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_settingsdialog.h create mode 100644 Source/src/AudioEngine/cusdr_audio_spectrum.h create mode 100644 Source/src/AudioEngine/cusdr_audio_spectrumanalyser.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_spectrumanalyser.h create mode 100644 Source/src/AudioEngine/cusdr_audio_utils.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_utils.h create mode 100644 Source/src/AudioEngine/cusdr_audio_waveform.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_waveform.h create mode 100644 Source/src/AudioEngine/cusdr_audio_wavfile.cpp create mode 100644 Source/src/AudioEngine/cusdr_audio_wavfile.h create mode 100644 Source/src/AudioEngine/cusdr_fspectrum.cpp create mode 100644 Source/src/AudioEngine/cusdr_fspectrum.h create mode 100644 Source/src/CL/qclbuffer.h create mode 100644 Source/src/CL/qclcommandqueue.h create mode 100644 Source/src/CL/qclcontext.h create mode 100644 Source/src/CL/qcldevice.h create mode 100644 Source/src/CL/qclevent.h create mode 100644 Source/src/CL/qclext_p.h create mode 100644 Source/src/CL/qclglobal.h create mode 100644 Source/src/CL/qclimage.h create mode 100644 Source/src/CL/qclimageformat.h create mode 100644 Source/src/CL/qclkernel.h create mode 100644 Source/src/CL/qclmemoryobject.h create mode 100644 Source/src/CL/qclplatform.h create mode 100644 Source/src/CL/qclprogram.h create mode 100644 Source/src/CL/qclsampler.h create mode 100644 Source/src/CL/qcluserevent.h create mode 100644 Source/src/CL/qclvector.h create mode 100644 Source/src/CL/qclworksize.h create mode 100644 Source/src/DataEngine/cusdr_audioReceiver.cpp create mode 100644 Source/src/DataEngine/cusdr_audioReceiver.h create mode 100644 Source/src/DataEngine/cusdr_chirpProcessor.cpp create mode 100644 Source/src/DataEngine/cusdr_chirpProcessor.h create mode 100644 Source/src/DataEngine/cusdr_dataEngine.cpp create mode 100644 Source/src/DataEngine/cusdr_dataEngine.h create mode 100644 Source/src/DataEngine/cusdr_dataIO.cpp create mode 100644 Source/src/DataEngine/cusdr_dataIO.h create mode 100644 Source/src/DataEngine/cusdr_discoverer.cpp create mode 100644 Source/src/DataEngine/cusdr_discoverer.h create mode 100644 Source/src/DataEngine/cusdr_receiver.cpp create mode 100644 Source/src/DataEngine/cusdr_receiver.h create mode 100644 Source/src/DataEngine/datatypes.h create mode 100644 Source/src/DataEngine/fractresampler.cpp create mode 100644 Source/src/DataEngine/fractresampler.h create mode 100644 Source/src/DataEngine/soundout.cpp create mode 100644 Source/src/DataEngine/soundout.h create mode 100644 Source/src/GL/cusdr_oglDisplayPanel.cpp create mode 100644 Source/src/GL/cusdr_oglDisplayPanel.h create mode 100644 Source/src/GL/cusdr_oglDistancePanel.cpp create mode 100644 Source/src/GL/cusdr_oglDistancePanel.h create mode 100644 Source/src/GL/cusdr_oglInfo.cpp create mode 100644 Source/src/GL/cusdr_oglInfo.h create mode 100644 Source/src/GL/cusdr_oglReceiverPanel.cpp create mode 100644 Source/src/GL/cusdr_oglReceiverPanel.h create mode 100644 Source/src/GL/cusdr_oglText.cpp create mode 100644 Source/src/GL/cusdr_oglText.h create mode 100644 Source/src/GL/cusdr_oglUtils.h create mode 100644 Source/src/GL/cusdr_oglWidebandPanel.cpp create mode 100644 Source/src/GL/cusdr_oglWidebandPanel.h create mode 100644 Source/src/QtDSP/fftw3.h create mode 100644 Source/src/QtDSP/qtdsp_agc.cpp create mode 100644 Source/src/QtDSP/qtdsp_agc.h create mode 100644 Source/src/QtDSP/qtdsp_demodulation.cpp create mode 100644 Source/src/QtDSP/qtdsp_demodulation.h create mode 100644 Source/src/QtDSP/qtdsp_dspEngine.cpp create mode 100644 Source/src/QtDSP/qtdsp_dspEngine.h create mode 100644 Source/src/QtDSP/qtdsp_dualModeAverager.cpp create mode 100644 Source/src/QtDSP/qtdsp_dualModeAverager.h create mode 100644 Source/src/QtDSP/qtdsp_fft.cpp create mode 100644 Source/src/QtDSP/qtdsp_fft.cpp.orig create mode 100644 Source/src/QtDSP/qtdsp_fft.h create mode 100644 Source/src/QtDSP/qtdsp_fft.h.orig create mode 100644 Source/src/QtDSP/qtdsp_filter.cpp create mode 100644 Source/src/QtDSP/qtdsp_filter.h create mode 100644 Source/src/QtDSP/qtdsp_invsinc_coeff.h create mode 100644 Source/src/QtDSP/qtdsp_powerSpectrum.cpp create mode 100644 Source/src/QtDSP/qtdsp_powerSpectrum.h create mode 100644 Source/src/QtDSP/qtdsp_qComplex.h create mode 100644 Source/src/QtDSP/qtdsp_signalMeter.cpp create mode 100644 Source/src/QtDSP/qtdsp_signalMeter.h create mode 100644 Source/src/QtDSP/qtdsp_wpagc.cpp create mode 100644 Source/src/QtDSP/qtdsp_wpagc.h create mode 100644 Source/src/Util/cusdr_buttons.cpp create mode 100644 Source/src/Util/cusdr_buttons.h create mode 100644 Source/src/Util/cusdr_colorTriangle.cpp create mode 100644 Source/src/Util/cusdr_colorTriangle.h create mode 100644 Source/src/Util/cusdr_cpuUsage.cpp create mode 100644 Source/src/Util/cusdr_cpuUsage.h create mode 100644 Source/src/Util/cusdr_cpuUsage_unix.cpp create mode 100644 Source/src/Util/cusdr_cpuUsage_unix.h create mode 100644 Source/src/Util/cusdr_highResTimer.cpp create mode 100644 Source/src/Util/cusdr_highResTimer.h create mode 100644 Source/src/Util/cusdr_image.cpp create mode 100644 Source/src/Util/cusdr_image.h create mode 100644 Source/src/Util/cusdr_imageblur.cpp create mode 100644 Source/src/Util/cusdr_imageblur.h create mode 100644 Source/src/Util/cusdr_led.cpp create mode 100644 Source/src/Util/cusdr_led.h create mode 100644 Source/src/Util/cusdr_painter.cpp create mode 100644 Source/src/Util/cusdr_painter.h create mode 100644 Source/src/Util/cusdr_queue.h create mode 100644 Source/src/Util/cusdr_splash.cpp create mode 100644 Source/src/Util/cusdr_splash.h create mode 100644 Source/src/Util/cusdr_styles.h create mode 100644 Source/src/Util/qcircularbuffer.h create mode 100644 Source/src/cusdr_agcWidget.cpp create mode 100644 Source/src/cusdr_agcWidget.h create mode 100644 Source/src/cusdr_alexAntennaWidget.cpp create mode 100644 Source/src/cusdr_alexAntennaWidget.h create mode 100644 Source/src/cusdr_alexFilterWidget.cpp create mode 100644 Source/src/cusdr_alexFilterWidget.h create mode 100644 Source/src/cusdr_alexTabWidget.cpp create mode 100644 Source/src/cusdr_alexTabWidget.h create mode 100644 Source/src/cusdr_chirpWidget.cpp create mode 100644 Source/src/cusdr_chirpWidget.h create mode 100644 Source/src/cusdr_colorsWidget.cpp create mode 100644 Source/src/cusdr_colorsWidget.h create mode 100644 Source/src/cusdr_displayTabWidget.cpp create mode 100644 Source/src/cusdr_displayTabWidget.h create mode 100644 Source/src/cusdr_displayWidget.cpp create mode 100644 Source/src/cusdr_displayWidget.h create mode 100644 Source/src/cusdr_extCtrlWidget.cpp create mode 100644 Source/src/cusdr_extCtrlWidget.h create mode 100644 Source/src/cusdr_fonts.cpp create mode 100644 Source/src/cusdr_fonts.h create mode 100644 Source/src/cusdr_hamDatabase.cpp create mode 100644 Source/src/cusdr_hamDatabase.h create mode 100644 Source/src/cusdr_hpsdrTabWidget.cpp create mode 100644 Source/src/cusdr_hpsdrTabWidget.h create mode 100644 Source/src/cusdr_hpsdrWidget.cpp create mode 100644 Source/src/cusdr_hpsdrWidget.h create mode 100644 Source/src/cusdr_mainWidget.cpp create mode 100644 Source/src/cusdr_mainWidget.h create mode 100644 Source/src/cusdr_networkWidget.cpp create mode 100644 Source/src/cusdr_networkWidget.h create mode 100644 Source/src/cusdr_radioParameter.h create mode 100644 Source/src/cusdr_radioPopupWidget.cpp create mode 100644 Source/src/cusdr_radioPopupWidget.h create mode 100644 Source/src/cusdr_radioTabWidget.cpp create mode 100644 Source/src/cusdr_radioTabWidget.h create mode 100644 Source/src/cusdr_radioWidget.cpp create mode 100644 Source/src/cusdr_radioWidget.h create mode 100644 Source/src/cusdr_receiverWidget.cpp create mode 100644 Source/src/cusdr_receiverWidget.h create mode 100644 Source/src/cusdr_server.cpp create mode 100644 Source/src/cusdr_server.h create mode 100644 Source/src/cusdr_serverWidget.cpp create mode 100644 Source/src/cusdr_serverWidget.h create mode 100644 Source/src/cusdr_settings.cpp create mode 100644 Source/src/cusdr_settings.h create mode 100644 Source/src/cusdr_transmitOptionsWidget.cpp create mode 100644 Source/src/cusdr_transmitOptionsWidget.h create mode 100644 Source/src/cusdr_transmitPAWidget.cpp create mode 100644 Source/src/cusdr_transmitPAWidget.h create mode 100644 Source/src/cusdr_transmitTabWidget.cpp create mode 100644 Source/src/cusdr_transmitTabWidget.h create mode 100644 Source/src/exception.h create mode 100644 Source/src/helper_cuda.h create mode 100644 Source/src/helper_functions.h create mode 100644 Source/src/helper_image.h create mode 100644 Source/src/helper_string.h create mode 100644 Source/src/helper_timer.h create mode 100644 Source/src/main.cpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..e712f2e --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +This is a copy of VK5ABN, Berndt's cuSDR source +derived from his post: http://www.ping.net.au/20140126_cuSDR64src.tar.gz + +I added local sound and up'd the number of recievers to 8 +for librtlhpsdr. + +I have only compiled and used this on linux. diff --git a/Source/bin/settings.ini b/Source/bin/settings.ini new file mode 100644 index 0000000..f849c40 --- /dev/null +++ b/Source/bin/settings.ini @@ -0,0 +1,1080 @@ +[General] +cudaSDR%20BETA%20=v0.3.2.13 +saved=Friday 03 April 2015 20:53:23 + +[ChirpWSPR] +chirpAmplitude=75 +chirpBufferDurationUs=10000000 +chirpBufferLength=4096 +chirpChannels=1 +chirpFilterLowerFrequency=500 +chirpFilterUpperFrequency=2500 +chirpSamplingFrequency=48000 +lowerChirpFrequency=500 +upperChirpFrequency=2500 + +[alex] +amp6m=off +amp6mHi=54000000 +amp6mLo=50000000 +bypassAll=off +hpf13MHz=off +hpf13MHzHi=18168000 +hpf13MHzLo=14000000 +hpf1_5MHz=off +hpf1_5MHzHi=5500000 +hpf1_5MHzLo=1500000 +hpf20MHz=off +hpf20MHzHi=29700000 +hpf20MHzLo=21000000 +hpf6_5MHz=off +hpf6_5MHzHi=7300000 +hpf6_5MHzLo=7000000 +hpf9_5MHz=off +hpf9_5MHzHi=10150000 +hpf9_5MHzLo=10100000 +lpf12_10m=off +lpf12_10mHi=29700000 +lpf12_10mLo=24890000 +lpf160m=off +lpf160mHi=2000000 +lpf160mLo=1800000 +lpf17_15m=off +lpf17_15mHi=21450000 +lpf17_15mLo=18068000 +lpf30_20m=off +lpf30_20mHi=14350000 +lpf30_20mLo=10100000 +lpf60_40m=off +lpf60_40mHi=7300000 +lpf60_40mLo=5330000 +lpf6m=off +lpf6mHi=54000000 +lpf6mLo=50000000 +lpf80m=off +lpf80mHi=4000000 +lpf80mLo=3500000 +manual=off +state10m=33 +state12m=33 +state15m=33 +state160m=33 +state17m=33 +state20m=33 +state2200m=33 +state30m=33 +state40m=33 +state60m=33 +state630m=33 +state6m=33 +state80m=33 +stateGen=33 + +[colors] +distanceLine=#f61b2d +distanceLineFilled=#e81d56 +gridLine=#076060 +panBackground=#664508 +panCenterLine=#f60713 +panLine=#f6a44c +panLineFilled=#f69f07 +panSolidBottom=#666008 +panSolidTop=#e6f6cc +panWideBandFilled=#89ac3e +panWideBandLine=#496f07 +panWideBandSolidBottom=#e8861d +panWideBandSolidTop=#ec2610 +waterfall=#f69206 + +[graphics] +dBmDistScaleMax=100 +dBmDistScaleMin=-20 +sMeterHoldTime=10000 + +[hpsdr] +alex=false +checkfw=false +excalibur=false +hardware=1 +interface=hermes +mercury=true +penelope=false +pennylane=false + +[network] +audio_port=15000 +hpsdr_local_ipAddress=192.168.1.1 +listen_port=11000 +metis_port=56389 +server_ipAddress=192.168.1.1 +server_port=52685 +socketBufferSize=32 + +[penny] +OCenabled=off +rxState10m=0 +rxState12m=0 +rxState15m=0 +rxState160m=0 +rxState17m=0 +rxState20m=0 +rxState2200m=0 +rxState30m=0 +rxState40m=0 +rxState60m=0 +rxState630m=0 +rxState6m=0 +rxState80m=0 +txState10m=0 +txState12m=0 +txState15m=0 +txState160m=0 +txState17m=0 +txState20m=0 +txState2200m=0 +txState30m=0 +txState40m=0 +txState60m=0 +txState630m=0 +txState6m=0 +txState80m=0 + +[receiver0] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=87 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=31 +averaging=on +averagingCnt=9 +centerFrequency=3909142 +clickVFO=on +dBmPanScaleMax10m=-18 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=-17 +dBmPanScaleMax160m=-4 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-22 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax40m=-39 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-34 +dBmPanScaleMaxGen=-33 +dBmPanScaleMin10m=-128 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-114 +dBmPanScaleMin160m=-74 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-84 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-104 +dBmPanScaleMin40m=-95 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-90 +dBmPanScaleMinGen=-89 +dspCore=qtdsp +dspMode10m=USB +dspMode12m=LSB +dspMode15m=USB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=USB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28908896 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21213461 +lastCenterFrequency160m=1901555 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14141881 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10112146 +lastCenterFrequency40m=7199791 +lastCenterFrequency60m=5399971 +lastCenterFrequency630m=477624 +lastCenterFrequency6m=50995823 +lastCenterFrequency80m=3799975 +lastCenterFrequencyGen=3909142 +lastVfoFrequency10m=28825000 +lastVfoFrequency12m=24923770 +lastVfoFrequency15m=21005700 +lastVfoFrequency160m=1828000 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14056500 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10119000 +lastVfoFrequency40m=7184000 +lastVfoFrequency60m=5399417 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50990500 +lastVfoFrequency80m=3799983 +lastVfoFrequencyGen=3940500 +mouseWheelFreqStep=500 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=3940500 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver1] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=off +agcMaximumGain=98 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=25 +averaging=on +averagingCnt=5 +centerFrequency=10014453 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=0 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-9 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-31 +dBmPanScaleMax40m=-7 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-10 +dBmPanScaleMaxGen=-19 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-89 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-100 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-122 +dBmPanScaleMin40m=-98 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-120 +dBmPanScaleMinGen=-110 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=USB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=USB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28000158 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21000158 +lastCenterFrequency160m=1810196 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14232965 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10149614 +lastCenterFrequency40m=7149614 +lastCenterFrequency60m=5406760 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency80m=3799728 +lastCenterFrequencyGen=10014453 +lastVfoFrequency10m=28999770 +lastVfoFrequency12m=24890000 +lastVfoFrequency15m=21001023 +lastVfoFrequency160m=1810000 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10139000 +lastVfoFrequency40m=7139000 +lastVfoFrequency60m=5407160 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency80m=3799728 +lastVfoFrequencyGen=9980000 +mouseWheelFreqStep=1000 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=9980000 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver2] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=67 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=27 +averaging=on +averagingCnt=5 +centerFrequency=1591296 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=0 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-22 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax40m=-11 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-10 +dBmPanScaleMaxGen=-11 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-109 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-100 +dBmPanScaleMin20m=-131 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin40m=-89 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-120 +dBmPanScaleMinGen=-89 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28000000 +lastCenterFrequency12m=24891024 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1965264 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14258266 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10108302 +lastCenterFrequency40m=7000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=475328 +lastCenterFrequency6m=50000000 +lastCenterFrequency80m=3799678 +lastCenterFrequencyGen=1591296 +lastVfoFrequency10m=28000000 +lastVfoFrequency12m=24891024 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1979460 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14282804 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10102279 +lastVfoFrequency40m=7000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472224 +lastVfoFrequency6m=50000000 +lastVfoFrequency80m=3799678 +lastVfoFrequencyGen=1611668 +mouseWheelFreqStep=100 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=1611668 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver3] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=86 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=50 +averaging=on +averagingCnt=5 +centerFrequency=15000160 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-57 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-37 +dBmPanScaleMax40m=-5 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-10 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-136 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-147 +dBmPanScaleMin40m=-88 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-120 +dBmPanScaleMinGen=-101 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810000 +lastCenterFrequency17m=18068208 +lastCenterFrequency20m=14000160 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10100000 +lastCenterFrequency40m=7000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=15000160 +lastVfoFrequency10m=28000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1810000 +lastVfoFrequency17m=18103800 +lastVfoFrequency20m=14017828 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10101540 +lastVfoFrequency40m=7000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=15017828 +mouseWheelFreqStep=100 +panLocked=off +panMode=FILLEDLINE +vfoFrequency=15017828 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver4] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=88 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=43 +averaging=on +averagingCnt=5 +centerFrequency=15014483 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=-19 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-29 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-25 +dBmPanScaleMax40m=-2 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-10 +dBmPanScaleMaxGen=-29 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-109 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-118 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-115 +dBmPanScaleMin40m=-91 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-120 +dBmPanScaleMinGen=-118 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810000 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10100000 +lastCenterFrequency40m=7156815 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=15014483 +lastVfoFrequency10m=28000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1810000 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000000 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10100000 +lastVfoFrequency40m=7178741 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=15047293 +mouseWheelFreqStep=1 +panLocked=off +panMode=LINE +vfoFrequency=15047293 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver5] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=82 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=25 +averaging=on +averagingCnt=5 +centerFrequency=1599540 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-28 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax40m=-3 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-10 +dBmPanScaleMaxGen=-8 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-110 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin40m=-85 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-120 +dBmPanScaleMinGen=-90 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1894564 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10120916 +lastCenterFrequency40m=7000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=53994564 +lastCenterFrequency80m=3672000 +lastCenterFrequencyGen=1599540 +lastVfoFrequency10m=28000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1898300 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14000756 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10121756 +lastVfoFrequency40m=7000756 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=53998300 +lastVfoFrequency80m=3672000 +lastVfoFrequencyGen=1594683 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=1594683 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver6] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=117 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=10 +averaging=on +averagingCnt=5 +centerFrequency=14992688 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-23 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax40m=-8 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=-10 +dBmPanScaleMaxGen=-12 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-112 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin40m=-97 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-120 +dBmPanScaleMinGen=-101 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28074490 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810000 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14000000 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10100000 +lastCenterFrequency40m=7000000 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency80m=3567030 +lastCenterFrequencyGen=14992688 +lastVfoFrequency10m=28074490 +lastVfoFrequency12m=24890000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1810000 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14012300 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10100000 +lastVfoFrequency40m=7000000 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency80m=3580100 +lastVfoFrequencyGen=15004988 +mouseWheelFreqStep=100 +panLocked=off +panMode=LINE +vfoFrequency=15004988 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[receiver7] +agcAttacktime=1 +agcDecaytime=250 +agcFixedGain=30 +agcGain=100 +agcHangTime=100 +agcLines=on +agcMaximumGain=66 +agcMode=MED +agcSlope=0 +attenuator10m=off +attenuator12m=off +attenuator15m=off +attenuator160m=off +attenuator17m=off +attenuator20m=off +attenuator2200m=off +attenuator30m=off +attenuator40m=off +attenuator60m=off +attenuator630m=off +attenuator6m=off +attenuator80m=off +attenuatorGen=off +audioVolume=33 +averaging=on +averagingCnt=5 +centerFrequency=10000000 +clickVFO=on +dBmPanScaleMax10m=-10 +dBmPanScaleMax12m=-10 +dBmPanScaleMax15m=-10 +dBmPanScaleMax160m=-10 +dBmPanScaleMax17m=-10 +dBmPanScaleMax20m=-33 +dBmPanScaleMax2200m=-10 +dBmPanScaleMax30m=-10 +dBmPanScaleMax40m=0 +dBmPanScaleMax60m=-10 +dBmPanScaleMax630m=-10 +dBmPanScaleMax6m=-10 +dBmPanScaleMax80m=0 +dBmPanScaleMaxGen=-10 +dBmPanScaleMin10m=-120 +dBmPanScaleMin12m=-120 +dBmPanScaleMin15m=-120 +dBmPanScaleMin160m=-120 +dBmPanScaleMin17m=-120 +dBmPanScaleMin20m=-103 +dBmPanScaleMin2200m=-120 +dBmPanScaleMin30m=-120 +dBmPanScaleMin40m=-90 +dBmPanScaleMin60m=-120 +dBmPanScaleMin630m=-120 +dBmPanScaleMin6m=-120 +dBmPanScaleMin80m=-110 +dBmPanScaleMinGen=-100 +dspCore=qtdsp +dspMode10m=LSB +dspMode12m=LSB +dspMode15m=LSB +dspMode160m=LSB +dspMode17m=LSB +dspMode20m=LSB +dspMode2200m=LSB +dspMode30m=LSB +dspMode40m=LSB +dspMode60m=LSB +dspMode630m=LSB +dspMode6m=LSB +dspMode80m=LSB +dspModeGen=LSB +filterHi=-150 +filterLo=-3050 +framesPerSecond=25 +freqRulerPosition=5 +grid=on +hairCross=off +lastCenterFrequency10m=28000000 +lastCenterFrequency12m=24890000 +lastCenterFrequency15m=21000000 +lastCenterFrequency160m=1810000 +lastCenterFrequency17m=18068000 +lastCenterFrequency20m=14075076 +lastCenterFrequency2200m=135700 +lastCenterFrequency30m=10100000 +lastCenterFrequency40m=7159744 +lastCenterFrequency60m=5260000 +lastCenterFrequency630m=472000 +lastCenterFrequency6m=50000000 +lastCenterFrequency80m=3799201 +lastCenterFrequencyGen=10000000 +lastVfoFrequency10m=28000000 +lastVfoFrequency12m=24890000 +lastVfoFrequency15m=21000000 +lastVfoFrequency160m=1810000 +lastVfoFrequency17m=18068000 +lastVfoFrequency20m=14084870 +lastVfoFrequency2200m=135700 +lastVfoFrequency30m=10100000 +lastVfoFrequency40m=7137860 +lastVfoFrequency60m=5260000 +lastVfoFrequency630m=472000 +lastVfoFrequency6m=50000000 +lastVfoFrequency80m=3799201 +lastVfoFrequencyGen=9999810 +mouseWheelFreqStep=10 +panLocked=off +panMode=LINE +vfoFrequency=9999810 +waterfallMode=ENHANCED +waterfallOffsetHi=20 +waterfallOffsetLo=-5 + +[server] +10mhzsource=mercury +122_88mhzsource=mercury +class=0 +dither=off +mic_source=penelope +mode=sdr +random=on +sample_rate=96000 +timing=0 + +[user] +callSign=N1GP + +[wideband] +averaging=on +averagingCnt=5 +dBmWideBandScaleMax=-10 +dBmWideBandScaleMin=-140 +panMode=LINE +widebandData=on +widebandDisplay=off + +[window] +minimumGroupBoxWidth=230 +minimumWidgetWidth=235 +multiRxView=0 diff --git a/Source/bin/windowsSettings.ini b/Source/bin/windowsSettings.ini new file mode 100644 index 0000000..d266c25 --- /dev/null +++ b/Source/bin/windowsSettings.ini @@ -0,0 +1,3 @@ +[General] +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x1\0\0\0\0\x2\x82\0\0\0\x18\0\0\a\x11\0\0\x3\x1a\0\0\x2\x8c\0\0\0\x44\0\0\a\a\0\0\x3\x10\0\0\0\0\0\0) +windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x2\x11\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\xa5\0\0\x2\x11\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xa5\0\0\x2\x11\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\0\0\x3\x81\0\0\x2\x11\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x2\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) diff --git a/Source/cudaSDR.pri b/Source/cudaSDR.pri new file mode 100644 index 0000000..860c8d4 --- /dev/null +++ b/Source/cudaSDR.pri @@ -0,0 +1,145 @@ +HEADERS += \ + ./src/Util/cusdr_buttons.h \ + ./src/Util/cusdr_colorTriangle.h \ + ./src/Util/cusdr_highResTimer.h \ + ./src/Util/cusdr_image.h \ + ./src/Util/cusdr_imageblur.h \ + ./src/Util/cusdr_led.h \ + ./src/Util/cusdr_painter.h \ + ./src/Util/cusdr_queue.h \ + ./src/Util/cusdr_splash.h \ + ./src/Util/cusdr_styles.h \ + ./src/Util/cusdr_cpuUsage.h \ + ./src/Util/qcircularbuffer.h \ + ./src/AudioEngine/cusdr_audio_engine.h \ + ./src/AudioEngine/cusdr_audio_settingsdialog.h \ + ./src/AudioEngine/cusdr_audio_spectrum.h \ + ./src/AudioEngine/cusdr_audio_spectrumanalyser.h \ + ./src/AudioEngine/cusdr_audio_utils.h \ + ./src/AudioEngine/cusdr_audio_waveform.h \ + ./src/AudioEngine/cusdr_audio_wavfile.h \ + ./src/AudioEngine/cusdr_fspectrum.h \ + ./src/DataEngine/cusdr_audioReceiver.h \ + ./src/DataEngine/cusdr_chirpProcessor.h \ + ./src/DataEngine/cusdr_dataEngine.h \ + ./src/DataEngine/cusdr_dataIO.h \ + ./src/DataEngine/cusdr_discoverer.h \ + ./src/DataEngine/cusdr_receiver.h \ + ./src/DataEngine/soundout.h \ + ./src/DataEngine/fractresampler.h \ + ./src/DataEngine/datatypes.h \ + ./src/QtDSP/fftw3.h \ + ./src/QtDSP/qtdsp_demodulation.h \ + ./src/QtDSP/qtdsp_dspEngine.h \ + ./src/QtDSP/qtdsp_dualModeAverager.h \ + ./src/QtDSP/qtdsp_fft.h \ + ./src/QtDSP/qtdsp_filter.h \ + ./src/QtDSP/qtdsp_powerSpectrum.h \ + ./src/QtDSP/qtdsp_invsinc_coeff.h \ + ./src/QtDSP/qtdsp_qComplex.h \ + ./src/QtDSP/qtdsp_signalMeter.h \ + ./src/QtDSP/qtdsp_wpagc.h \ + ./src/GL/cusdr_oglDisplayPanel.h \ + ./src/GL/cusdr_oglDistancePanel.h \ + ./src/GL/cusdr_oglInfo.h \ + ./src/GL/cusdr_oglReceiverPanel.h \ + ./src/GL/cusdr_oglText.h \ + ./src/GL/cusdr_oglUtils.h \ + ./src/GL/cusdr_oglWidebandPanel.h \ + ./src/cusdr_alexAntennaWidget.h \ + ./src/cusdr_alexFilterWidget.h \ + ./src/cusdr_alexTabWidget.h \ + ./src/cusdr_chirpWidget.h \ + ./src/cusdr_displayWidget.h \ + ./src/cusdr_colorsWidget.h \ + ./src/cusdr_hamDatabase.h \ + ./src/cusdr_hpsdrTabWidget.h \ + ./src/cusdr_hpsdrWidget.h \ + ./src/cusdr_networkWidget.h \ + ./src/cusdr_mainWidget.h \ + ./src/cusdr_extCtrlWidget.h \ + ./src/cusdr_radioTabWidget.h \ + ./src/cusdr_radioWidget.h \ + ./src/cusdr_agcWidget.h \ + ./src/cusdr_displayTabWidget.h \ + ./src/cusdr_radioPopupWidget.h \ + ./src/cusdr_receiverWidget.h \ + #./src/cusdr_server.h \ + ./src/cusdr_serverWidget.h \ + ./src/cusdr_settings.h \ + ./src/cusdr_fonts.h \ + ./src/cusdr_transmitTabWidget.h \ + ./src/cusdr_transmitOptionsWidget.h \ + ./src/cusdr_transmitPAWidget.h \ + ./src/Util/cusdr_cpuUsage_unix.h + +#win32:HEADERS += ./src/Util/cusdr_cpuUsage.h \ + +SOURCES += \ + ./src/Util/cusdr_buttons.cpp \ + ./src/Util/cusdr_colorTriangle.cpp \ + ./src/Util/cusdr_highResTimer.cpp \ + ./src/Util/cusdr_image.cpp \ + ./src/Util/cusdr_imageblur.cpp \ + ./src/Util/cusdr_led.cpp \ + ./src/Util/cusdr_painter.cpp \ + ./src/Util/cusdr_splash.cpp \ + ./src/Util/cusdr_cpuUsage.cpp \ + ./src/AudioEngine/cusdr_audio_engine.cpp \ + ./src/AudioEngine/cusdr_audio_settingsdialog.cpp \ + ./src/AudioEngine/cusdr_audio_spectrumanalyser.cpp \ + ./src/AudioEngine/cusdr_audio_utils.cpp \ + ./src/AudioEngine/cusdr_audio_waveform.cpp \ + ./src/AudioEngine/cusdr_audio_wavfile.cpp \ + ./src/AudioEngine/cusdr_fspectrum.cpp \ + ./src/DataEngine/cusdr_audioReceiver.cpp \ + ./src/DataEngine/cusdr_chirpProcessor.cpp \ + ./src/DataEngine/cusdr_dataEngine.cpp \ + ./src/DataEngine/cusdr_dataIO.cpp \ + ./src/DataEngine/cusdr_discoverer.cpp \ + ./src/DataEngine/cusdr_receiver.cpp \ + ./src/DataEngine/soundout.cpp \ + ./src/DataEngine/fractresampler.cpp \ + ./src/QtDSP/qtdsp_demodulation.cpp \ + ./src/QtDSP/qtdsp_dspEngine.cpp \ + ./src/QtDSP/qtdsp_dualModeAverager.cpp \ + ./src/QtDSP/qtdsp_fft.cpp \ + ./src/QtDSP/qtdsp_filter.cpp \ + ./src/QtDSP/qtdsp_powerSpectrum.cpp \ + ./src/QtDSP/qtdsp_signalMeter.cpp \ + ./src/QtDSP/qtdsp_wpagc.cpp \ + ./src/GL/cusdr_oglDisplayPanel.cpp \ + ./src/GL/cusdr_oglDistancePanel.cpp \ + ./src/GL/cusdr_oglInfo.cpp \ + ./src/GL/cusdr_oglReceiverPanel.cpp \ + ./src/GL/cusdr_oglText.cpp \ + ./src/GL/cusdr_oglWidebandPanel.cpp \ + ./src/cusdr_alexAntennaWidget.cpp \ + ./src/cusdr_alexFilterWidget.cpp \ + ./src/cusdr_alexTabWidget.cpp \ + ./src/cusdr_chirpWidget.cpp \ + ./src/cusdr_displayWidget.cpp \ + ./src/cusdr_colorsWidget.cpp \ + ./src/cusdr_hamDatabase.cpp \ + ./src/cusdr_hpsdrTabWidget.cpp \ + ./src/cusdr_hpsdrWidget.cpp \ + ./src/cusdr_networkWidget.cpp \ + ./src/cusdr_mainWidget.cpp \ + ./src/cusdr_extCtrlWidget.cpp \ + ./src/cusdr_radioTabWidget.cpp \ + ./src/cusdr_radioWidget.cpp \ + ./src/cusdr_agcWidget.cpp \ + ./src/cusdr_displayTabWidget.cpp \ + ./src/cusdr_radioPopupWidget.cpp \ + ./src/cusdr_receiverWidget.cpp \ + #./src/cusdr_server.cpp \ + ./src/cusdr_serverWidget.cpp \ + ./src/cusdr_settings.cpp \ + ./src/cusdr_fonts.cpp \ + ./src/cusdr_transmitTabWidget.cpp \ + ./src/cusdr_transmitOptionsWidget.cpp \ + ./src/cusdr_transmitPAWidget.cpp \ + ./src/main.cpp \ + ./src/Util/cusdr_cpuUsage_unix.cpp + +#win32:SOURCES += ./src/Util/cusdr_cpuUsage.cpp \ diff --git a/Source/cudaSDR.pro b/Source/cudaSDR.pro new file mode 100644 index 0000000..aa4dc4c --- /dev/null +++ b/Source/cudaSDR.pro @@ -0,0 +1,88 @@ +QT += core gui network multimedia opengl + +TARGET = cudaSDR +TEMPLATE = app + +CONFIG += qt warn_on +CONFIG += console +CONFIG += mobility +CONFIG += $$QMAKE_HOST.arch +message(CONFIG: $$QMAKE_HOST.arch) + +MOBILITY += multimedia + +include(cudaSDR.pri) + +RESOURCES += res/cusdr.qrc + +#DEFINES += AUDIO_ENGINE_DEBUG +#DEFINES += _WINDOWS +#DEFINES += _CRT_SECURE_NO_WARNINGS +#DEFINES += QT_LARGEFILE_SUPPORT +#DEFINES += QT_DLL +#DEFINES += QT_MULTIMEDIA_LIB +#DEFINES += QT_OPENGL_LIB +#DEFINES += QT_NETWORK_LIB +#DEFINES += QT_HAVE_MMX +#DEFINES += QT_HAVE_3DNOW +#DEFINES += QT_HAVE_SSE +#DEFINES += QT_HAVE_MMXEXT +#DEFINES += QT_HAVE_SSE2 + +unix { +# CUDA_DIR = $$system(which nvcc | sed 's,/bin/nvcc$,,') + +x86_64 { HOST_ARCH = x86_64-linux } +arm7 { HOST_ARCH = armv7-linux-gnueabihf } + + INCLUDEPATH += \ + ./ \ + src/ \ + src/AudioEngine \ + src/CL \ + src/DataEngine \ + src/GL \ + src/QtDSP \ + src/Util + + LIBS += \ + -lfftw3f -lpulse-simple -lpulse -lasound +} + +# ******************************************************** +# The WIN32 configuration needs to be checked and updated +# ******************************************************** +win32 { + RC_FILE += res/cusdr.rc + + INCLUDEPATH += \ + ./ \ + src/ \ + src/AudioEngine \ + src/CL \ + src/Cuda \ + src/DataEngine \ + src/GL \ + src/QtDSP \ + src/Util \ + $(CUDA_PATH_V6_5)/include + + LIBS += \ + -L"$$(CUDA_PATH_V6_5)/lib/x64" \ + -L"./lib" \ + -lwsock32 \ + -lVersion \ + -lPsapi \ + -lQtOpenCL \ + -lopengl32 \ + -llibfftw3f-3 \ + -lgdi32 \ + -luser32 \ + -lKernel32 +} + +OBJECTS_DIR = ./bld/o +MOC_DIR = ./bld/moc +#UI_DIR = ./bld/ui +RCC_DIR = ./bld/rcc +DESTDIR = ./bin diff --git a/Source/cudaSDR.pro.user b/Source/cudaSDR.pro.user new file mode 100644 index 0000000..af95a52 --- /dev/null +++ b/Source/cudaSDR.pro.user @@ -0,0 +1,208 @@ + + + + + + EnvironmentId + {974be962-b6da-4db1-b656-2716ea8841ad} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Qt 5.3.2 (qt5) + Qt 5.3.2 (qt5) + {c28b2f69-26d0-4219-96bf-795edbc3bba5} + 0 + 0 + 0 + + + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + false + + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 1 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + cudaSDR + + Qt4ProjectManager.Qt4RunConfiguration:/home/mh/RTL/LATEST_RTL/BETTERCODES_SVN/cusdrk/Source/cudaSDR.pro + + cudaSDR.pro + false + true + + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 16 + + + Version + 16 + + diff --git a/Source/res/cusdr.qrc b/Source/res/cusdr.qrc new file mode 100644 index 0000000..f5ff076 --- /dev/null +++ b/Source/res/cusdr.qrc @@ -0,0 +1,36 @@ + + + img/close.png + img/close_high.png + img/hide.png + img/hide_high.png + img/minimize.png + img/minimize_high.png + img/maximize.png + img/maximize_high.png + img/leftTop.png + img/leftMiddle.png + img/leftBottom.png + img/left.png + img/rightTop.png + img/rightMiddle.png + img/rightBottom.png + img/right.png + img/topBorder.png + img/bottomBorder.png + img/drawer.png + img/left_arrow.png + img/right_arrow.png + img/up_arrow.png + img/down_arrow.png + img/up_arrow_off.png + img/down_arrow_off.png + img/cusdrLogo.png + img/cuSDR_32.ico + img/cuSDR_64.ico + img/cusdrLogo2.png + img/cudaSDRLogo.png + img/cusdr4.png + img/hpsdr4.png + + diff --git a/Source/res/cusdr.rc b/Source/res/cusdr.rc new file mode 100644 index 0000000..5fa5e34 --- /dev/null +++ b/Source/res/cusdr.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "img/cuSDR_64.ico" \ No newline at end of file diff --git a/Source/res/img/MainBkg.png b/Source/res/img/MainBkg.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6294941c4f15dee1c35fa41b47682519270cda GIT binary patch literal 13973 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 z zCViQOiC^9whwbY*gx#|WVl+N3+tb>g`RaD68%JE^xaO6AdG!N&TX-h`kkN zS=a-l^yil=0E( z1)|-Lq*vw-uH{e&?`cyWdM*JTa^fbj`U~I4U1Wj06MKnK86fu?_g}c7ANjL0l>L}Q zu{FwX+&>P=6>RdTYoyF5ootQDCvV2+cG9-{qBSsBy%_%MU)!tcG5B}GAMxina0a@a z!ogCoRCQmzcH9lrF8(o+QNYV|RuuJPRwrI1zE>FMX6bhEhiN2pOZZ5%RVsO$hgOr= z&xQR`kWa}eT2klTdWYb|Y1`gej~aOJEeZaB6*G-@pt^(WN_I+qP+Orm1;JqCO`mmK zrr@HnPFttTjAqMe!;5tmVC2T{sBz8mxT(83h$LgQ^w`ahHCldWvn|HRP`dzSCtU4D znJeE@63^1@dn3Bl*1%T!zi!h{#Z+P033~=N<@dLQ4Ra-wO5_3TZ9-#8I5i-VO>)V& zf_&~7lnOCU?&c{@J|XUxbHaTXP_5| zqon@k?Ja%@wz|n_<l zC15{+daHBqeLjO{PzaK9g6R)>>b_&CXpVe}8LT{ST(0``Ru?;e)+lP2#xFt=w^P3< zp@$LX!XFrNyH`C`R%^B|t6k-FZs_3<#38AR)jihG@76ce8Sj650#Liv-A(^?WbQ#4 zHPh@9LTHF<#e~nP!?eP;;x`|e@2n`Nbeh{+HFt?3sh2e3)k?gxEOejN)GL}zwz?y( zLEW6pV6}Hr8~Pi?C2g#t-I2~%<3YMN5F0rR|E~CDnPZ3A31N=A z=HG2S8sm8=Nmu(@D^}GKK!x**NBSPKT#6Afxy=`xl%A;dIo$O_3+c$54~<6^6Uj!f z7b`Gru^DvnOW2TWfn{&Oy*Yjh{lf4<@v?FPXB|(RY@*1>Ci9I31sc@e+mqBEFy{h{TgEJXctw zGCmWmwfj-krr4gqCTV~P9z4M&CbKnIosbw;4>}yochgrHbM7J0+y8`j(^0^7!P(s6 zC9QBOodpFwh>IZsMn2Yq24{+E3f5cSxBlu4R(8^V^Oi~t_W8b>KyW3Ph1)zRcQYZZ zoSR}aTV>@6oRT;^py=x$GoewjT2DCKvwny{JhY(g%_~%V%HPbV5SQWZ+gC(F%z6!4 z5U2JI^;M_X^gM$6JdYEWKY#j`UKDU zfObaTm=c;^Uz<}r%><4cg#rDT(dwFW2yJz})Ug07up0(D@dFk^d}a9`<5lrHrntK3 z2C)~rzOsH)ywd0h8a^7`DG52cqnDL zQqi3!W9uQ0q&FLefS-RDSvSbo%bdIeWs)MK>f40m zTiHQ!@kiqh@5$gcBd!bhcUbc~F+=0ETj%p%P56Zb^DZ>UP!0FxJ76(4EFK#+x* zUn+bWHK^~&mrMo{7JahnKY@C(g<_oJNj`rU0ZUdq%<9U^X|Cx6qiQx`FJwrlBIEbm zX7==GNX!!*c+*4kQ{ar06R-P;(wlZM6yHJD{P7$Ys?f8630J^j(%<-zb2;P(Lc@*U z=zt8)v$-2`?Vb0on~xC>yDsDojO#n)RdHHFUET8>G_&kf#c29*ZlD5o>ylQFKTPRX z9jd07&vk^L-3BV%%?GOG=;735EzY<4Y{Kj3j>7m$e{x}eZJM~mEp?}rJvP00@dp<< zzv;nLDioh~MLY}no?_~HW>3rD!NJB==DcHPu1j{hJJOhv{QYC^m&pt((x8n}!#^3y zhANkba4^3!J7gjmj!K^Lhg}ka*zK!3#(U;qg7u{T#WOL6Nyn)CiA4db6 zhALPvY=yM)lfP5Xuv;H^)R0sfjh!jmbN9e>Bp6^=sx3lpvj@Qw?)Ov(zVJ4*ceLG< z1ynYz{x%FGc2xsNn9YvZUW^)ra!h0^hCuXx?KT_Q)^mO+o0EBK%6~KMw3kJZ za5^-b-%F8X5prHWGEh&uhP*`|;umT}tr|l*54- z!grDe0O0fg_bvc{Z{h*^X{|!{ggsCnRug=*<^6ySWvXK73OWv~n5vE zS?i|pjPLAzrMG?B9;V~Y8ZdI}xU8uud91-O1O2UwkPec4@3hRmZ+{_zLd(!nrT5XyX5tkSVU%anL@DLXKi<>yQg!O~?(YuN48xX~4o*1DWE z>*ok@mJG0#(_YKASS;GvDfp%+at%C7E!)|) zFmd?{Dp~O6r{p>33VBKHa$M@^k>nSNws&y2g;?H1i>`&qCYn4bRcPNwcU@7=(HEzQmeVTapLi0fd z;*PKdDM_tk=B!)R0`xK-gAiFrvPrJa#uvem=}mk5>!()*gkTyNcne9+Hx0Njr>2&% zdYv(fU$vf76|^HV60`RTum}r6v$02HSki!*)$L6E_A9Uv5zSPrrK{)4ob+8Wr%83P zV7I{m+!E>++XM`+3Aoc8!;l8Y>o>p7UKFS%E)JOFW%2x@<9Bve zUPwAl99FAQQ})QWb0;B7)f&c+O^u1I%uw%hmKzRDL9mw3{=kaem)ZGOy&8{akab$& z*g4<_h50=Qk!R&o3CQQ0^a#V!edFy3fyr1!Ka(h?5A36%TlN!I(lSX`^I?WyUSxu` zZ1Rg&AwFDLvsI_-_cR2G`y^TUfjh=(R_^ob)N0@+vFa7WKtd!64;yD%QncrR5` zh2_hs`^Bhjz$5)cb5LB)&GQKtL%uP;KGNN5=0sT1urw61r-WJCWvaAZX=Jz(uPa1V z$msoHHm(Du!9s`v;c6^4FB(l6_`8Z>SsowN&-AOhrr78Op_Bn}(0!0fkYLl}yijw*K~SeYni95<0>h#4axIi$fxtj*E8 zaR8K^)IsI`kWKc{_(L_9_Xzre_H~)HagjL9)_uv6I55jEKuUU6+?BF1Ze#qn$T~n` zup@iDTK_!6upXp*zwhFnv2nwFzf}D;EXpD&fz`Dq8jejfITN8w=Ba+qFEkzZs+%|7 zjJ3mbJbA_jwe6GUA!@&~VZotA{50rTz>=sVeA<54WAX1S?;*ga_o21p+RAKOzFJDw za{{_q>j}P|n@5J^K$&<+#MY)NQ0WJMdE$Slorm_Y#y4lpre~xCbA$GNv%PihPUQ|1 z3G5I`dAr?u;~ZL2<&7VoFBoalwNN``P<1#h`Qb0|=T2xMVaijXe`(8YYG^uX z3o*8!3Tq`9$)BvJz&iB_&!cqdpW6wszrin|6Xrj zcW`pFvM*HGNwP6HWKDtW)M6yPSP-w}CNas}BU0`ZYD;(%bx1v>a5mR&{&_KN!;8|j ze0nRH59kvi1gdbPD&%=o-Mo!K3jrpSc`tW$8JY?@_L<;}$5R5|lyCf20%uIX9lA@( z#=JC@zq;4IC+BSA&0LC+sn3`))HvC31YNhR-!b|`y~3OLVYx;EDw!y4kpao z6U|5z(Dt3KwTkknETky7#XX8k2$Fu}TY}2jAvX$-}~jmoWSz zT%IKJ#}OeH8B{t{eYugK>fhte6EtKVwNZLp!eo>B(QN(D%}~p7L~)%?7j;w5rbT?a z;PiJ*EZ7`f3yJ7FVjEKLahkRSi!&0D8#tVMN{0daJ2zauxu)}kM!12Ln zN$>dd@9oK(h8L{P^J30antHGBhrSByR)|;)CA6i5Vfq>^BYcY%yFW;m-3ujmO;DG$ zl|CQ*WqIWPSwgk_Z;gU$DkFlEcG}=A#qgOq*!$_br6o^}YkkRI%AVbMbjE-7qH-C4B8~XWxb% zzpVVgavSx}`*i2x1+s&G z!~L(-K$FUS2xQ#Xc_G+VoA+ke|Ga6I%I;enoy{w!UK*YPrHPuyDZq?znTU+;XwiGJQDpyX$js-X;e5tlG&D$v6n>QCm(5WBR>@3 zNJ_m}trk@gy0h7^iz&{Nhw0c6Oww>M{*KqE)v^0YC5I%qCm*P~#8-sd6F*7vRmo{f zI4k#XCk&~}_x3nlDcKlG;b5NDjBYXfP-SGNcy!^TdJwCn^I&QSMv^VpFt3QpY3 zAp-Lhhcycyt_@y^MzbxXeK7m01~1DPZjNKUiBe5QGP^a8Afy%^V<*@Q7Gelxl&#L| zp}M`<&A}{ulglu2AvyJaGs8K1utHd{P4uJCqpYolLO;km^ps<=(5NSZ$#kD0yKi3$ z4Eusw-l_IsQ4eoLp6OlwLG6ej5QY;a&Bu%K2fYv7;7@uc|I7^2)%U_tMzurBOSL*k zrapW4{`HG*7GHZfC15kIn^STX1W};}LGF4~&CQE6<0FYGKEASnHmhP486+zW1@g*B z@-$ya`6Tp@rGzEJloY`1)k;?~_X}`-{$yXXLR_$_=vUH;H&bu4>Q%TVjqhC-cquA^ zg;w=jFWza&iOWk3cJVUT zx7BbdfkH8e0^={S)OwT)kyYP(6aS-a6;gDw%whuFh|Q(lE=JjuBb$6%&0rN7$Iik^ zaV41L@|)wr+oNCD2k)-4wke9cjU?(S>M?{Wkz6X?JgnP$Od0pjuUvujkkdqQ0v0i> z@H-h^KDYZ6vjKggA%ZwYKdKs~2^nccSFNMbY)c^UQtO&kU`bv`L6;<9k0MvlI~+93 z%&Mwbe@4DGo2NkcXE1ou>MYi`K%e>zZnM`^{aH-H647A{N9n%8=YGUru8bjQTVwLQ zA&c43i&b%u*fkVitg81)8Y zBThQU=~nph&`s*~2HY4MKe}Lb4oOV55r+#$_-2mR-MX!>T&BN%;EGtVQSGYVDNLEb zBy#a7HS(fp`%SWZu^xFfHN3bw)SK>}QB-zRaB~(sxnUu8)2Mq=F^*eF8EL85`q6^< zQ*w1iPr}6UW(%Iz+_p#-f^4&$b_jd%+>NBqn)sn<#9K{cDlj z2nD@fE_l--?XQ8N!@b$J6Z#OEI*5Ra7>%iZ%cFv_Y)DifHT!u=L4QJ(N|K9pcy3XY z34LMFjY({aL2_Qc_}U?5Pg0wf%I~(dnnxFP{O*#aPfiGB!p#*fgIEdRPm94i_2p*j4Fr;@9y|s;TIVVHqbG`uA}Ex zZ!6TH2Oc~5yTrPLsM=aNCV3swFjKC`Xg9Q2#XN2RZ}MMGjTLwQmS@T)COt9U(C8k* zt+0&2y=dnCILge|9fZGn8Pt2FLbkXZpS3@!zkscF>ag%=bRiM@CMQ@1J92(TtFDH@ zJH1G2v3f>5MrX#ki=GCXf@iS zcGTR-mOIWwj(@Cq*-D9&tJsaJTV$NWW(V=fVj^stIA>p^uQ(dWk%tG zUl&x}E@NmNH@fTxBd;Ls_@#XFEPHc;9=Xcv#7qCiylT?KmY>+Oc&D|&$t#==$Q^nw zLwfOie82YFS8_dS=?HAKSNjQ7TWUq!SovWvm1HM-Al}iC8qU(Cj$~U5@E)DncW!p4 zDZ_B2E0=xT$GRX;*FfxtfT#Ke`Ppc-UTt+X9eHV4eDNo9zAX2sgP?@E_=RgwF=WwU z@8YHV)6$!n)*1LsfPLprbTU4YGZsr*xB9M2t|^bcJ^pEU_VAVkMGA=72EaTY$WY4h zryiWzPg)DR144Wv<{wA8=>|XWDEblA{8e)tFtu_c%>{P4g7#F-*1H~_q4ON8Z z=!R5cx};45JF*_|Ou~nLV75T13K!zP;)8~3&s^TLfgHKXTB4JGITDWIR02;jrEyns zZ+3&Ay5RHbjQ%Yfa^7br$rT}C(Wx6evG`fp znn&`wz=3GzoIW~BUFVK?E!fdVhxOzC9@EC1YuRlpvO9?rc|vpzsIZPOX9C*ZqJ|h;ltq~E8|l5e2`)fyS+c&a$Nir z5Saou26N6v&G?tul?(c1M;vCmlHtmRE)5H=r(%beff$zr#zcinKSjk0KUNWM)mE;_ z0PFG)4PP3aO^Gwt#;gu;=@%O101@Vd1cm;}Hi5#sUZz(XLLbatOk(>H4`t_(#SPK% zcFQ3%637D?z?`bv4svUOG*UX|Whgt;kq6BDt=zDhLnIOfH7@q#+H{?rt=A5lwe-5H z)7j49&8+c7v|C$S1Qkv{hL46@WU;&rOa(x?tGqY;N|lGcJ>={M<6B{HA`OsMeSbM> z6QPx}|BtRp^3u9E7L&esjs7NEM@@6vedlr|`f7iM%`f}nYahj;H~)k>hu*W2Jr&Kr zU}uL?>^sy7&Isk^P!mo2xY=h_#eJbLcwpl+7dxL0aFE|9Ao;B}x;y&io~x8tA(^ri zg}Gm;41=m9+_Bjs*JxOp6=YLAv%$Gn>TM@(uz()zXLENSd{cK-A7eW7*2Y=toH1FV zy5P@72Crn4dSKkNqOXViqB}Y{Unb4fRsjN? zeq04yVnRJ=(G^5Wb{1NPrZ4#Ab+RNGIW^0`w)A?hnA1*TbXM%e@Fzr!ev62WIJM2Q z-Un!%X5XB!92Y8fY`7ub2LF4>sQ1Ay1rf8ZST(C?dx`v#3wXT@z$0-t{?h>d%ht7w z8Nxma28uN~QuO+M5st zkLS|UR9fcBJT21*b3qs%t<6_2Y`vo5e$ASWO0bB={+?RL3@xnY$Q;U!R+J;O;s-}g zKkHu>x(!$MMFy?>W^E#mF6toSxP_Gn0Tw8qcx zwg?;H8stG_7ABhQe%=YJ9ie1@qd;ZZyPfjI595v+>620M)EBq>q21Un@#M3ut^DE^ z><_fc28YBV-u5Apr`PKQMp^=6ZlsE(q-Ms~V5h%`=nr`+R9WRNOOvW&!6+~QCj5FxjnUpL_ zHaSN%E3Fw9!(TJ5XPiMNW{%3v$<52lFDNW3Dk&{3FK%@3gJWV`fFFCqZeVdZY!-{n z<#M=9B%Yjri-%mq`9!>j5WntGQ&m@4UC(4O8yYzrB3Ge_*UZ5q^zmjQe!dwu_{glQ z<8i8r3W^)*E2^uit7~fNtD0$6I3LHG7xmbaQq#bWf9C4oVjYkY6cZ5{6%`p17GATf z+gcpwkH8LR)UY0tOw7&i7`#eLNT;RI(o!-a^LPibDUg2@rkm09_&8Bl?~>k0*JQt_ zFml9f|0b>;HWiKz#VFa+XajrQw2^R|nW0s9Bv(_wK zv1Y-%DQBXbUcUH1e1GdXS0uQHO~l2*fim})mxj$6KXt^)w_%Bei3JayK6&jDj`PIt zu<^J^q}A;eYnQyHvh<(|P*oFNZQ*El*QOp92t%dE;v&3ne{cQ)OhyJf%w-hUR8;vH zIog{&WtMP-$=yfcLcG_Q5aDf1Rt`H_5S5fymg#I|=V%ytE4x@I$Qv*mexNx$i5V|1 zEsYIJ&CjnXkF&6Iv~)<%VB^h|6NaGUOLNMK4`6aq*yLxgAK^4Z2OCSOt${zzVb33o zj&I9rNdLGIQ&7d^u`~F4oBK}p?>@MlhjW`Z4T9snkC!wsqx^NJ4;?&qz&rfD^&M-Q zJGL{dYoLlp2SW||>s2)JIGM?Q&L*a=8F<>e4<7G7y!*(6#=ABQ7mEg&R5Cdn0js{D zp^?cG5V?Juns_|E2yDlEG>!{KIn{Fce4bDw6pDyqL%fdwzdsSjnu>oP|CuN6{f7m)xYm<3X_;VZbsmo;f?bR?sXIif`j8;>@wp zc);X*W)rumiO4hKD>ZX#N4~({tZkr`n-x=vRLfHv7CpnCEG$oT)4g@w>_(64w{+cT zrGGxfpH41{xxW9{5woMJM~?0PJ2r2`3;b=5?BXIK-Hg$VPG=OBrYHsBKGyMf8W%g!pGk3|1$;M)ygIiF|P3&9exc%lg*Y z&f;N7>9h<+UPR#+&KBL`Y+4@pJ8v&fuMa-YsygvC+M9Q8-oAeu$oksXhz+vH*SJk& zo@Vp^JnbJkwV|Iowc-vswH8k!atTd55?@Z(^i8J*(Fr;=7MsM8=knRDp4R;fPpfaN zA=M42uV>bM+ojpNSO$ey-*+N9-*UQV`@Vi>w>4jOX|~k&{$y)Y3v+W*EB#F9D!%H{ zt{r>irE}x5uI`m<=WN8RYhOFsnQeBSTaNGEe_-$7zhZEX#n+wM{E3%ej9s^U<+4?` z<{uR|3p?u7^88Ep44pJ}$P1ieXt?YM)?IvKUcZz!QA# z)!G~_si3g*Fa*l(d&AQ@^t8OX;{dr(Gl}fp95zoZ?xa)e-ASj$CUZ2o|DSYfr)Hc!iD5Dd7={rr#j)eQO=F-t zgrksD;$UbY#@i<}kPMcEV+80Y7voK0f$*yYhV~~W3&$0(ojC8S>^S_-$5){~7E{D7 z;oJ_6H{pj+j||7nIy}zB|Au3z{Kqg<`||Wq`CR;tFBr!uTq5{$Y5yX*kR&pgK#-)eh1>w?}hjz zH~|H0YX{Y9Il<*n0Y&U=2kJq`oAAAmTM;wtO=XP@ia_I3e#-tKz-=A2rpL#^^FjBqCRNi{&0G8Iuzfc zz&}7in>##xB!G`Eg$kVNu=*_(+zkq#LLe21zfB_e{xamh@eldW!0{6}8zvCnCIRH% z4GLNTmh`ptwwQ|up92oo&AKSRsPNlVlwW9~3iuU@viLb!UBd$yHXBU_K{|fy+dLP z8)^;f2=(=54Tg>SObUz0HsMg9Lfv>xLQYz!r;QSpi44HHC7T;I-O=4UEWWs|M!%L= zXHaj@pbz=Tkk1UJR0K3FQf(6Q(?h)OX-nsPk#osici*tY(z+T7K4s(L4=}y^uRlgHYKX1E+OnBQ&QV{Its>sXXK!0J_~>SuwI#NCm5J7c%+zYmVhssr0J zgp5*Po5V&UQ@>FL=DAEzt|^Qq$y^GkNExqB4)D2&Wr1yrNMZ}ro*djs%KpA*Xl!nM zZJkj)u|cuE9>$<-7=<Ab{qqj+mVVL8Xm?Thb z#v5_l?ymQJLgVu5YfbC>HbNnF;5)ET13m&pHrCZtH^8b+J*C#Tj#N)+pf-}3Dr_+~ zE!fLJk%n_c%|rnvw7{Y9IJjM3w+Fsq@kI@F#`XOhS@o6GjeN0Kz^KW3=s;Oj&MfG(5 zr*~~kEN=aM&D6r!%FgX|W>aHRqECRIzrSe!C6M}&8l)DSf%CH>Jf9DISCW>Uk(rf| zuaC>2J~b1QB4R42+g$nZX+T7Bc>_4XU{-Av4=?wzrCh&mWbJt0?a9+8kKOJ&+uXUV zE2`&QGrMC+w8E_0o+K+NYb$Gt715e()$5Mwy?qWiry$bn%>*bFhMv%+;35j%t3{j) zK}rhs!do6a3yeysY^bButJgI&R&vFu_Lr`hI=er6;`ZR43(>ioi_5(S51&1{)x_jD z6jzm-R$%3~D|%IyK@h=(1<_s~W>V7P?%s8FzI)fn$==cGI)}+MjZRK*PVAGA5|!s{g|qOYSa0t& z&{KRq_s?Z3NMUCmzYdC~*P!!e)-*OhJaF^geLE`~DA~c@o@%FRZ)fLV_jdz}XA_rA z&u~ufok=UWoCN{1EZ)a=XNTodFnO74Zf}EQ(`(7~-Rqdu+=`1w9Gxu8t?$@agI3Ab z1S?Rtg7uXuHs3Ook!YHNC6nQ4n9_$9pZm%XXT$I((ckaH7baSLE=45u473VWACtpyoS2^y2e^=*4i6JHw;K*3YkJ7 z!z-CWBxCSVnR?6ka4t{e@GdPX-Z8FUY+_i>tpJ=2vkVR`#ODqgt9~-RLG1*{U}Kyf z`$i-bf&d6Gbz3gz>yobP-^6a1+*H1GO@Du86YlCx509h7NXN#;#1dnq;FT1E#ZqJB zVxtlR&o+Z+_YgNR!n|G8U_kmw%D^wA%y50;ACXktSXa-i5?|U&y>R_1QBO)&PmidJ z!BbjKS67dutE#7~clp-dR37g9C^a<3A*z35Y;XqkDcGSvAZpHt@P0A?bn;1t_7^gi zJ$xD%nOxdX%c{hmt+;ja@_E|}$`{Y-?TqE)PaIP}M(KykMTEm(Av}T_J_x;`zp&%= z;%2m@D9nlSdNU5$Oq-YX`=a3+3Yv@1z8VhlYj` zLos*~!r(K>@LcW@%}I!S$&&`_F9t04!FGxilJ3DKn2WJ zUO04IN9Pz(2RlZFCs9ZC82qcFLp-LUbL`OBO+Etr>Fq?nP={dokdF~MMX~6p;DH1CsRyuw)C1D+@gV7d%E3J+R=yG8 z?+oI+g97XVwSv6ktjR5dNRben*4KA?M}?EI?ozss--g7c*Kn%v2lI|>-A&m=*twIm zOLph3UGO07?6GSnyzkz6c#%7fdr)IM1MU5_0==SiQd(wkP<$mgtxiY96EQUcrbK=G zJ~TeFj#b;dZ^h0{TZvn+zo_su+oG~{9#kXHpLL(+%Yw?$DUyc*^PBg>GL+OC9aoWw;ul1tzS=EM_9j(v|buM zt|PARxncc=HQVOce7wEAygm@Ul>ZRoA`zGS(N9g4QLZS%v zG#XNZ{HX06H5*+C7>-qM@2eWrdZ$CT_ zJ@!n}@FY|VE+fpxr90Sdo8b;<^9^LmQ|~?Tk4!3L*EVgLv~bqk*>h$a&lx&<&YZck zXD(ViYr@!Z<0p)sq4VNcW!9<4`oAVeD5`}kFGEUl_e5H|FW(WJ42apQ<% ziDQUkH9%=&Cl4L>UV!r&P;7=LhuB2mvS293WbzttJ%jgdFNn{mPZgg$f8c$Y3auqH z5Oot5LI_yaPTUuUe$xGQa9mn#jo732*r6kdBZ$L$juoBP8PZQ% ztAB5eZc1{}6tt}(i}~U;0vN4QVZcn}De`%u2HgDc4W-$QCoVs*axkzPX6tC-zSW$UQ&C(3 zyIW=DRSn!`kqGCdNBO$-hH_-Tig)nE!Uw3AE`}*d!&vxN$_R;4z_ypuax(R^G_rH@ zE9x8TD~s}Sa&mL>X{&AQZH?^YZS8FqrxxcH5cB&K6cm+KGhvre1ha$~pI0NGJ{`ze z>-GY=>QW}V244&1x5?2dOU`2GXY|a>$}6n}IfXe{nYr|eXX_qWI@s#lq2_sf;A%r! zK@KrjJ}K~ zq~&IkvSf0LYuL?1n1!koLsZ!OS&rH#dmvz!o_K(#)(}~;>~d{Tun_?k=;g5KnF%yv z3OQASMoUZ2udJ^x&r45ZB_>i6-0&$9asbb>t_7KD?BN?j>Y6uai4uw9w{p- zDV~%_N>WRvWtG;}mFJ`-(_-`XU%hYT0D^2CEZtVw6~)n0Qfc(8l18W!1qrH63HB#~ ziMKk_r;bnx>udGICn7ng0nNG#v;P1|V0=pO!{Kq!3GuOUu=>>_Au&0Y7Upj*{b@w{Ns=@++yT1vlsuU2*HxwGQ$fKX zX)tQ2z1hJD32|}p@rj8^Nwn;un!1YIG+Jzd>l$QwR68{khBn>I35}16j!s~dG~u{D zsuhbK;pe3CDeSclB2X>=aD~o2wSdKHtS!!ni<^k5WenAl#s1EVj!VlaC?b}s73b&H zG&1YTi^{V3H;+K@22twvwhq=SgIeEpk{N}n)4-pl~;-V;_i6W|GP}EM=ya&%d z#?Xq`%*N^hdPJfvl4U{|0B^^OIkgoP)vzYmD8L(X&uR`MKWl*WA+@y$*z>oRm=lt ziFjfr{#X*o!76MW@4LD_aC3Km?Do*rc2za3dQrtH!n_1O@A;T?tC&x{tTd+M{x&p$ zQNd<4LUkg71H)cv5>PKrCSXz&=%QrhsaSUc*0)5=6Y#}s{NkmDRu0B?vbNSX)|QsU z+X~iZ_pY9Yju0A2MN|YM{*9l+3~lpUDeS^ikFdn_Dh`WTQLK<_Xo4V6CK)OvJNQBshTk&-e*(+>sgD9#k4 zDt$yoeur#Jf^N{k5v`yQofTbNT<<>ks|>nvDuh_PBKc#$*-yh&Wct<2> z*KycvXs3jb0G|NQ&__cRv^9J7=}YWAvX`cYx>|Qt6=kTLoSc*jhK8zqoQWGAeq!m= zD$d!(#mH6Ro|C%~Oaf5tKwwQuNWjfc_BXOsAOY)T`P4TuC8q&kF)UQSKwoeF4wz1YOWlA3Acdw)Vh5 z#KDw7YJ&$48mKkA6z2 zX>2?S6tsL6h+#8p3R1%Sygj`=Jwn|!_vGr~&Tsm8dxno(ILI6|yND4T%~0 zdw=lsdgB}7xN~%0?GfXN6G?xNCiWjSN@X**vZ+bL!7r>lwsYU!J?O9HVX#+m-|oZf z4rkLVSprErHD$*7y%-FGABn8)t=f~uRzjGFqZjLQG+A|}nXy4Wo-pHk;}`P$=9U@5 z2M!!e8j1}e4w4_UA+krBzoOo0d$F35%8Fb8(0B!#zj>)`r_p8&8ey`0N7;K;KZs|y)% zq5ec~`S)+$din>2gpfX}2Zx0O`FnXs=hikg3!6FRv``=0_i`V6qqA$8plDSb7ZoN3 z_^tc8Yyx)nsRuY|6_-r~5SJQ<&8#cSO^XW)^!M}idjIb2Tk5;+@4W&dQi~hmr1^~{ z^r&F{K=Y4sAyH|iEOgpXwzxPsFaYhUwLfn#lbT=4Z59gn%!*tFjgo3XlY@S=tdS31LB^HJQi1|cw<)|;C(@XT z;ZyI(l&o4*Hd^oR2NNCW32G`z3UjkFGc#cIIXkbQq@tGD)Jzo02>4t!i^|kz8M0+K zXjH8)CZdgts?^ZH8*Mhz>Txod#_gxRQK>ogT(V?W2M|1bgl*%(iaZ-_UU300fTnL$ zAweV}3ynmUVhSp)mKGLh42~t~L0U_b#Rl0w4Tw(5YvhtzOEZEEFN#24XfCp8$=5)S z^tYF9?crMU$zfw$pfjcCGr4HqLjoL;5uXTK2`%{uIOqmMvKZ0+54vM5B3q4K4x91d zIjlw%f-951$Y}u*sVEyaBi8S^7KRN+k>*pjWo|EFp{bZn>>!&VuEfiV_wyKoVZ%@+ zn3$u9l^nL|$*Zu0jMC3}NRpGZ5LtM8;wz5m;d0w)SE& zFe!rGQ_m={KOW5FNU#xOjJ6qxLMd32B!O*t;EE-wK_7M63(5ds0QH%7SZYoslM35q z1Qyr~1$Ot|ag{`sDZznPTXhE8PzWl3b+>TyO(dlnrdXz$&U9uEu}? zF8t9_lY{&yQtdRIPQbJ+-^EA8Gs@=&3% zi2{<43|ahf<>tKPz_+uok@PYgToN(~aoP=nRF_HkWNpf5$NeuMsIp%YT)4ZzdC|p)1s0y z^ce(NMrtl0gJ!_cOnIv=(@x-C3>y`YltE=k)3c+VCc4VHxIT@{hH`t+lO8I5t_Bz1 zhe-|ikeE(p$fncNT@P+g-XgpGpeuYP!3;eu$)2FluGoE;O!w!BWQJTiE$8v3efyIS z%I)8`$t{PLPGs~>rzIJ;Q#C4DPX2x(Ouyy8Symnk(Pe$ z!0EHem&ctuec&tuzDc7ol4AFOWgYsY-2EU;FCm$c2FH?fpB*zYO|}?nYIN*rZZZQ9 z^^C-*4ecxum9L5&k56LIh-q^4)SOqQ7M6)ta+VgRuX0l9#I$}iMnc#E_>ECJ3Ei-* zF_43tCPT}Oef1#mzRZJHvAHx#S|3KD{{;B){dPZA!Nz?|Vo=khQZn z-q&Rjh!{aex&Z4fgUaaOI2o1}b7lHMW;oi>55S8Eg|O}jC8>9ipMvEPC>e3!*^h^6z*eYAs2ECo%-M4Z;(d zLcZ_A6OkdOe!XFXK|4GV8Yg`RoCrWSMgR;l01VR?cp|}f;fWAX2jRdFGKd8Irz-zn z0Yydt(`i93wE>FsAshdD07Wg?C~RZNSQGWu%J>(6A^^@HlvxX)s1}rhFhRy}jtISE zA{ml>Cz!~%p4-n^7HNiKsB-MFT@Bj0*o9OH>C~B3Q?4 zsQrW`0%TKTeJhrTRAU15BttzZjjGK51SYBiFj4a_1`~Pt`S|%7`4Rm6DE`kOLWkInfK|SSYl?7_YFzLmsG+)l zMh$Vyb4!byi~AIn<*;AghSjQHg&Mk(&#I}vTi2(yp^|q!6FlIjVMB@%*pO9veOcAr z%0A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∓P}B^BJ)AgL1*q*9 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

&y7k+*n)$w^DG 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 s2 zxjSe9fp4<>qyd|uA+~y`#;VS9Fq!9qp|AwcVP!!JMX`NLQJU3Ii!iAVV}|BMUq4r1 z7z#Kr$AIb390Qx@5(ya%y@eDB=?*xW=W0L^t7Zlf1ehh3w>mB*_~HTjuD-nA88}!t zFc836M*~-jPQBkd)QB|!!Zg9<3-1{FVtW8~ClwBb$?ZaSmm@v&bF2)NEPdV#v(Kl)YMvkFUh(t6FxbrV3L`)4`R9jWt^>#=US?Qc z=5!dmwXmq5ur?U*z>Dkjc?-{+__Pbr)LBHG+OX$iIBN_d6tTlKF9J0YKW@_Z3Q){}^fW}zu`x;nlGpGOo|e*Ao`L*SJRQ^R~` ztZM-v-vU>%%gZ+nAUr^Z7jna282*A8 z9>1W5n-}cxuGkHK!M(A9jrI^GBWvcL{PtwXZYb2QA|4uK-%_&3PQ7O zY>S&y^6{$py?sf&s9(D6#g|@u@uipAk669*V)|0S+4M_AS-b>h2u}Kvd9hX~V7+Ld zU|y4>SmzStzKU%k zdZbV{U{3Z$Oj$hIBavWvNY15aSQ3{SbSr_XFLf16a*#tuuE>v)EW@Yja<>RaUHf7v z4X`hEa_NaS*a}JN7h@s0Vq3)K*0wz)li^FftX~OVe&yxll^PuJe&yx#6^lWj_T^V# zpxL~fmsJ9L`bvSkS3n@izMP|%!Gwk)bDL+Fr?F^>XYc zMz2U(RBOV>LRGOYkwiC{%qw|jBMhQO{90e>>=I{59%VMSk}5Bn-Ei45d&$APQuG`b zREm8Wb(og}S7w?;CLd;tuw{tH(nF|bt;zCcJ&AMx^9cQ_9Z`67#H%AlysAgoSK|>O zHe6Z1%3=R%Izqh~!Dui7;$k(hlA2)VIvNp!XRw$TqlixLHSGcAXf`;_4y4}r)ks=Jvxyl5n zP5}!w)@-4mkO-6skeiMva)TGWN}!+;de||YodA!bLbB8i6*}>)y`>|6shbY0ml2{d zc3e1i+}NgZ!Ps$TtRAPv8W~++96N3t-yB9*1{6E48z6akbZk1#!kl@!b&7q{IO7p5 z?y>Cb*wVP7moQv00s@$^&G2Cc5eEI87xRf_XU3{=3076;G>al5H;>D~U(zN(LQ2y( zELmFYv*22ft09-!n+`X|bd`6dTl(}z*UmHLEwRpUJEyb`h6!v83*Yx<@YvW&g&0woBXihM=PsWFUQmoSP#Hyr@ zhnMx5kuw+==%>dQ!3P6jMYIfKWqiRIoes5}dIes=co%ou8$ zq|)mJ@`+h&6F(f2drH~~o!dh}#;a3HO-O-~t-)k=d8UP(OPU$j38DBP5F=@rkgbp; zYmxEw#bC!!D`R+5;@Prwv11Wo%o|$6a+y%VTxZ%hO= zomj`&z0Aa-7$?G^G%|o*>&6rZCCzvhf6b>-!iNPBa z3lakcJ2A&)*-cC=gpiR~OpO9DBOsxy6h;LL-s!|H%+!VE0{TWm8h9zJT_8!TDhAhq z*u~Ql$1z=!W@1;TDA5>^C>xbbOyo$_baHOe%y4Hd6*|psz5RpS?(uI){~l?1VNvY zk6L|(nyRPRso|8VQ_R%j zl&Mp(m};gd3_I0MNv0~;bF>>-lBlst0UA$IQxhS_VpCJ9z$3_}!1dI0N-QBLRDicc z>dY`)%Vgl_L=7C3tTnR{x|x#WBAyydff%{WOa_iwLJ5L#(9Xo_+tpc5>Qhcx%M=8t z5oyGy2Q-kPh9`MOG}EbhP^KauH#0w1FeApaLde{N5@DOz96R++sZK;#CJPq}8-r5V zWJY8dq+E)im>F3}z}!^=3u9>V!lTh7ep0 zI0ZGq&_Yp|iNvr}1!Xu2aS&;pR=`mxE)zO3PL2sUE_uncJdV?*FG*_!QRT+Vh-P$?yVNA0(N4sZ<*=(tpqeP zJx8ONUW5`>Fq`Q$ehn855$7gL#xNK(!Hq$kihWB-;NY$4=?(Fj3v-BlMn$;MGn!sY z1$k@6mY0PX(wUAFTtS>W3CVM5u#$lRm&vKO%9#(VxpANj=T;DTxV6hm(MeWDGQAV1 zE(vKy)=E~V-^z=-d8;bH?OVZgG=>ULWFO6RRxP2ipsmZy8S?T6J=4y}aUIQ6Gq^Dr zYNnYHW41H%LQXshW&>I}vxa8A4LEj2ICI8~#Dm)Vm>G4H6&}0_Zmq#r;C2)D88A9K zLJMOi77FyD$MwumqGVZFzqd0xi(_`6mkcDw8knS=Q7h4TFf)RgVvYq;Gb(^@VS4V( zVi+=&=uRuilFkdn6hwr5sqt{$>B>)pN zGtyc1?T^iR`|VjAJj%gsXI0D@q!$m8f;4*@5&EI+e&_ zG-i}wW;HA`X8kS^CT-qMK}!H9vjXUgsg8Q0`F3H>?Adc>&oQ%$IL@9kXLdBl&bD(x zY?3+2>>O1Zos;97 zIN=T<_%V`#m?mZRoQN(o8`x7Pq~|DX1vXe%2{;F6fgW>UDoPZtkU0yG1W4slNeCCl zcR<5C70}N4xKm-!>D+Xlo!f=mxo%)GbJe^GIc}NE ztp|>my!G79entMgxds|)UNTohr`EA>q=bQfz-1>G+*=eaBB$^$m_y+fMA0)P3h5F2 znPZOLM&uG~6+-E`;xccpMI6RAFs1f6`EYx@!Wvv<|UA;kX0z@v_QW9>`@|Qz@cbMv5=Xs z-ia}i`SzV){yXXX@SXYZXl!US+|4%ti>@c*w^6iU6Wk&e@pM5!bQYEXR~FQDh$f7=a6z&_FSHAa-p+(5CJ8Nsx0WsAJ3SIu zK~@PYuE`D#ZeorlK^`jYc$&a@8&R}&3;~2*2_Zn~{z5*kC zuL;L82HE6ohvm=`wYY*&!Z_g9$&!;x!o^D#H!sO8Ub1Adfw_v2V5ArtgSKlJr6pWZ zfO8om#vp^^oXmD{6Xs}%#gS;HmoCX8$P&>e`#8pVjJ74esFDskbq#tng@N^(lYi2`zAr7Wx>*Abf#nD4Rhkx@v_{~Wy=JniJlb<7o3)4 z8FZH|UD}K_MVOEl?Q7Ukn*5~Ql48d}CATKut&?T7)WU1o(l(zrIoB~oV;+~G zaFDp}syQHIn5ZLyg5T~7aZmPXEK(fd-i{-7w;eSn?R<}sGwTBturfibNV zwmd^gflN7F9(=gmd>AbM&@8tY#SfP+|M0`*A12s^Sn1{6vBTRPWH!r_57Xr#Oet7- zL7aD2dOHESEY}~}U0tD}xmPa{yLqaLkGtF8NBajYP>fGp!`o z3oNXaA@rTLS=rV30d*2F;%bSl!C?-00gR7?Y+%#K$08Uoykh1kp=pIWGNguGnfKA{ z%34`5K7FYhI2uxSuT(0_Jb-HUf*!2iX=Qn{CwgU$u)ZO@UQwhLYSCGf)XFlVY0%pH z*3ncgiJKLjoL3f&Oo4nI>;v+NRu~OI`*RpGxr<`+^?^yBL^=K4GdKQoOU+>94HK`kfc`?oR`KXMm995)fIsi z))urP9Qlq{i&0ZX@U?dpVFsRai zL51cub{!B5jgewRvd^tuw{C4!Om=OsPSB=xcC8TVnrXN3cMu4rAsxPC3H>%&<|(G^jN0$ zd5R2*wQF02Y}e)`b(U|Kf3(hk+-1Z14eQr$z>(AXWJ9oigIQlkt23GnwGIOwZ?Nk% zh62TI2*EKMs#q1t21{d|7q;2Z-FZ=zD;y2At#`k}d3Z=Rq*6WIpfGFjYXlZoyFOqv z$CYG5Op`Y2xnfchkUpsdRhuHr zj^;9B^aur@13sFhtKh&ox@B=ChG^y(Pj9T{B)QfJCi$67A<}VOf_Ez6D;opa9Adah zrC=B~Rit>s@XXSJCrg*O=1JJd6bZUnZ3;Gjlx$WXX^d2c{V3jC_-OM-coQgdvl*Kh zn>LIHbGQuKmbBAFOW4!b!| zrXN0cu9&=?IEDY#|Kv=gVDzT9)PV9?%%kzml~a2KnJeaT~OTZmGvB>7aZ zqTX?g)D@6PG1cmpEFt5-aO<|MW}Drb-?nwzwynuFwKc-vY_{pGcALRm00*GK#%{}D zvo+n;jTXMQy0>6;-UyT4M&)E1Ok|MDFj_`!JI`zl0T~DqlR#UsP(sYnFY_{z64S9V z0tazxw*}N-;*M1#5pkeWijlaq<8AdYX2H{KMJ^?V+S*D=N4TnZS=O0VC{>7DCfg!K zx^!L2$ST@~@QzEwY(ur)V7As}%Z^BF3EaHOcC#bKsBF*g*p64a-R{V7VYVv_yTbwu zw(ro}>tNim9S}(lBPYhFY!AJM$be_IYq3?g*NP83cO+0V+Y2It1zj|pg@_;)aLg>k zJ=<$AbF?v+Of!;ouw%OxFPAD)Qj-7ek|cFp#+a~REF)DqKSp+Cq*+p|%hiUEJ7k%< z=z4osNerTV<6yiy+Tv`i#u+(VNR_wWlChbJdqn{3jyyLzqV1?5*tx55r`mM^;{e9# zo#C#XJKx1>KZe1$h;ag=g3*F;4P(zvyQ>Xz!_FMoyN+X-?kwSGcG}%)m);%j+P&NC zD(=R#Yxk~ncMXoacj2vf7iq()3}SV6tpEfy9Q1Cx%ZLEidBIZH0&3*wXm&F|3a*9S z?(Wv^PYod;3s4LwZe~6PE}TUpb;`R_>PEsWJeMva?Me{7 zMvxnVCLkp&9-#`%h6&S0*1N%{Z8tdRf*9L6U`f$1vV$T-(7Wr!#U0olg^aSka?iXp zMI@J9yEBa5UH0tVyJwHQ_hPB{*u8d-*&FXsd(%B#VR9g+y?fHV!JfTsfXto{kcNTe zbWaU^NlCG_dy3u*JCL0wbvrv5FKYG{u)@nAXxdJMv%Jzhd70_1_GrlDu$Ks0$iZHT z%}i2Bn;{A=gn?*xy30G8G#rXP(`3&bVs?2;NQb!ET;ig}LapQq7RzD%c5fZ&PD1ag zXKH@u1QO6#6scy9;EL%6f?c5hyUTpV$<(r%{IuuttTVYFc!#5lU| zG>#EQj8WNV_g}?)4TFqm-ys}{(0X*A-Iv?HZ{Pm?*qp<-j6tzzpOKY4VD{SsdcQef zG3WOmz)K%c7zM2GP7Z`P8h`Xg*}_waH@rYi#X}bK&=AbLawIT92zljWb*2$7dBes$ zIGDqJtSDd))O!kf%*!08$t+G?OJ+ButB^9iSpyO|ke2{X-|jE^h-QB$DGysp8<9qy z`@N@;ESWEJvik#a%>IHnVTnd?sR0(w~qjp|A5XhwQ<;I8_f89MK-kaY4Ka{TQ?H7#0jqgFTdB1k3^cc$GWcn!rez&JC|a z7N!se>Q!%8DOfU$@r+=)y+-nNM{ZO``SM~z%t0fKNqicvEZWtf266S0;FUZl_91-1 zt|(u0a0pIKhmqCc+@ZsV52aY1b;|@xeKdV@#3MOu z4_To&uLhv>CNqMav+>MUtP@JfI$krbvJeA)%u zky?pIJtL0dz*3MYUn#1olSJu`4Kj_6z)QAA5t_L&D|P|iOq=B^03lqWBXy1n514$R z3`Q2Dof6}tcDxMLNfy3T>&((LQpiCyjFUBrk$5tsuJSQ;^b|&lu?izO79Krz>^xR0 zFfL=H$6_4c$2fcJ;xT)47gjruH62Tj+Y{!vK2bP+;>7V2Sg7OXL=h{#wO^e$UOi!t z=Rg3r$O*7pah<|RV{cFB;|jAUrtoPOCT36MC5mJCSQhbW5KJO!xY!fv@kG+lfSgC- zNMtb_rI0X^kfn<*p=dM^Nlt_SO_t7aXxbCC5}jVm6$D7}$fz|w19-CoBy@6g>B|Xb z(9xO`*aZ~LOWLjiC^_Y-PY?S9nfNYb*?xgMY((81|HFnjq9TAfUT_RneDI_?m0~oX z%$+)U^3)D2V+?aLJazI^gjEHj1>=ZV)u}@#w>xSB3<-wDXvK(59`=?pl-Z-RUi^Yy;z&a6d@6)HvDeED+Y8mEK!TD;@B0--HPMy}L zLb#>a#@xDSF%&Hzg+1L9VRx1APK8Si)aQiQMtq6{AV@Ff%#ovug^Am|h?rAV5DWwY za&t5q1dLA?1jka7iWjSN+U*(J)6ChPilE5Un7tNT0*gIe1C+k#lWbgP%xNS?b>TA_ zORRBJ=Fhev6D|Wb#==4udJ%J}H=R*un=vk69L2bJW)Y6N&s1@2@Z&sYgK_>$BaR8i zGTD(6pDCO>d+zMnbNZ}3XEDrKg<-Kb*yjjwn-@}gHia=y4_NiN;Ox2NtO%St7l}g+ z5P_Y42!DM}VHBwZBs~iooUzC2+}TK?hS(&~%F)JDpv->Y;qOjl1Vk!Y{54AKyvwXj6a+DEtG#J(HM%%3Zv4>0-(W{k#-nGM7*iMuMR+suB1J!ik1ElVc`MkUNUfQn^$s!c-)a$!K5stxgH$yXc&q zlDSxL8MrpMUNQrp1(bY@tdWOUpHfpF`~;S{7Pf4T(%hM${CE3>=PU> zVo;+AW9Q{6j;ApeV(80Fm-Q8UHN0~5ioR;EgjcUz)mL&j$~Mo%6(g{@YCue`1Xp25 zt_UP1_+l=A3a-AIf)!s;0@*8_s30l;6|^}lB9V}hAgSSFujWW4$6V>^oZ#jB89qy= z-YXK6$lNo#8V?}D6eFNj-H@!3>=d9Pn9fUGtw=&HDUD3B#Js!9*C$6=!!})E*%~|D z-U>EPuyzHu)u31;E~|FMta5bPwXb>R}lfD*;2%Wg1L0QL&R`fi##4)ri{mfCzFG@x&oZow-W-z?^!igV2=~NEK9caC$8-)Pyy&Km>6X zrem%JXaX}u)S}NMy;dVGIB3@?tjb_luhj~`&>9X*H`lRovTUIALwdxPb+nKj8F+o* z^^q7&*KI?gv7xb{p)qZ+jd@w=h8#?dNrP&vaM{opVW}}pLmkPDw85dCv$)W`=ypPk z-3}JhXvMkKJ2p0G$WRUzuM}g?@T#2+EqTQaA!Z|(ZVVcbRL}^Pf(nym7GS_)gsH*Q z4QXSJS<%=bYG6(gD0T{DG**E#y|kewOD1w~kpk2JL#WKJGkwI&W7$=}y~{%6Bk;(z z9%YWMb*#iyDoqq6WXQ(2H(kS~#wN6^DQs+NN-?8U4AYcr6d-M?1;BM^|mvZ*-G9Kuh4*)g{2- z@^%7F*fbW!)`Sq2A8LGNDhuKTorl>hD zQBpuoTs5^d7sS@&)EJu)gJvugjPPh~LO^=xCM$uB_vf5P+RZ*Kdgx};u3ZHVA=Y>u zODiz*k7Z{eTa@7BVCAK3Q!`}$V>gKTMl7Gd)*4KBwU)}jQjBvL zrNLO@400e6BSpwZ>SaAW)WrP8=l(K^oC3t({#21YxAIm%I)<5@rc2 z`d4MwEUS)$Q%NQfjxCusUCOnUN^Pd3Fv2#s(xn28rM4=}Rhq%f(Li2OvY0IZ+h$9( zjtRP!y~0c<)fNj^wMB4FM4Jc|Dl+KZ9-Ph;E+9&&O|*iNNTlKlOyn6lXoF&l^G%p4 zT_R|5lx1cmC6NRE!WB#d+dr1z)F=94Be*7xi%OhY|^$+NVZ&bE)YOzj)0KZSYAAsa@TBwxdI0* zq_l!Ai*o`2WDR==*gz<#l=JijtSc#C6pUeoj!Fn=31=(yAWAkuua{VIC|4^5mj%N> zTGW^&E*<)qa$Z~mrerg+u3&GxI8)T+TE>%if_!M>a7wxo0*T87i3yq&Lt2Izq!h#J zB@Blb`^7#{qbSMK#u&&6FD;d3>XJE_D1|r^wV*(g(k@SiNdck%Ra94vD`B-#)s-TS zl}fdWa|64n+DcqCmAu%DaF7Ko92O|O$PFqm)R0Dh`gIl`x39v2E>treT@4Y#DWugL z)|IqfjLwinQYgBeSWhLdpHvG@S6B10Ak{jZh$irqC>^X)DZm@&P&gH|3r-Xe5_BS4t&OVH2(M~{`l7t75G9JMK?DPeb(6(11z$%w z^3!(52)-sNRx!(pFjzRZ!sgsXR2hRD1j^xviF%O-i1VT4MY_s;t)G3 z^MMS#Bu7T0Y^Cd&L}CWCQ`UKndmNB zoQreC&cEp{damAjHwl;Z*3geTmd`90ur4!l%LLJM6cmLq+7uU~IF7JN;}DaHZB*nQ zFCEpw&bPCx*hH1MyI7o)c*aSj;xd#JG!$kN<>(KoI8Plop`S7G18hLgi#$@0z4dM` zA>s^V;p1fr5)A1m4BCzOF`NU@37svS+K&3D|KX@H9xWK2Kbe zF!Kx<2^qu*_!uTpahlk;YZ51MoVX*F8g>IaImAOj(cwhHra;Znfsn-@m6Q|;3IppT zph_odiY_c^T#F<3C^`wTWCECRWI9eOP3pzLd1;#IjvvH01V5y<+8zxyq45?vO5*Alz(w*|6A_pv~?ph48 z>$WRJCwbxE%=%uE$O@ifTpA-sY?^Sk~B@)u+3rPrUa8pQCk{{NvA=Atxj=v zz^`$BkWGoDk4_c;*Gtu#1=i9Eu|&b$5PDg#)iBDL6q~EooI0 zx`_brl})nFv-pJb2lHtm$v##~IA*QwU2(Wp}gDK3`oVvs|s zQwIWolD6RGX~E2Ok!yJqMHaf7Y~jUs=H10@#R68r0ZFPLnjTglIM<33 z4<@a5u^0geszVMgCtL(DLW&HWY>;cX;oE7&V5DH9iSQzuWxAJVN`-Vru}K;*I(MiS zN7lw2BLe4^L!vMa*|#yAyy@YVQ2PI>N)%#p+Mrm&CBhiwh;?d8I=~4P6yM`4p3pVI z12=L|UL0fawayVsu#7PBaD=Nf;%v)S>kxCI3l6OKt-)7!>x0r;gm41z-N+h55FyFL z(nA+$Vqh{viyKO(FtzDBoqWb3S4JC^xh!%kZ{&qlKr2hARHX&M&V1<5Tz@Y4P5WuSlR>7tj z!!ZqD$cjgkDZm#{1qKSXz#nH2A4p1U#?%o8NBk+xL4VG%sd1RGSK8B{4*lCqk#2N1 zKIcYkm~#t8guz^#j+?9AP8+ev1h}pw)kO61e?bC4g%1X0CfNfxUcmSWzkVVz66;qm z+OTi**aFz!vpHsQ)^3EcjM3pRP+ZT$HVs4DRXAS8Xv0Y0+GLkwwaM@L_M9#?${QgPdkKHleQmnRNbwXxdmsDpfCx}vl74u{pw_C<# z)Q`k>unlqfWapAOuqE5uErWQgkv`M1M@*;%AcGq_8Ao=HontrW+DSMvKpBAEG>82V{?@v?V-oz2gxslZl7|LkF0gOl zcoDulZCPhpB_?yDg%<{&f-j5pb*wJ=`*jJ{+hOH1fw>))yO&oX`?>%#J6Hw7UApel z9_b%z?rvIs<>+V7&Bp!_GRlV9>S*GaroCfwA)+;Qz%ynGz5_V%e98 zKt{?L(?x!dn$Anw|ybp)&}asg3skv#Kx#`Z{Oc^|#&?vA~1?F5d)kt{!A`R_Y?jKs3$`5cG8WW?(+>n(3XUia*yv4?TY zuAB4l<=NmhM8+=vG#@DsEk1#HUfmTt5dYC%#|>GPPlgq+T=Z8dKeZ>}ugxp`8!dBT zjhEVUpjLL}@v(f>e;Tn)p7Zx__%vFLJs-V1ukT8uHy{hw4_DKRKq_({Hp{00PX^V` zdLFM?=D?58Cb`RAupeT-86Bg=eTFbDdvYCv9f;+GZNMM(;%65hQceDeFc5#^jybz4 ziMg=P9Q^ztca&Jh$(i9*Xz*uX*&C{44@O3oPbapDBsO9PQsT$+RDcIC&$BH5IL0Np zh32=TOp{MQmVhT51uF6lX}u+#-P+{y9O%yppJTkz&q#JW)3fCBpU_23bK>H2MTYNwLm$u z{m11|I|m3a05*z`VwS}KhGIMo^Fd&L#$zNPQ1&Ic;_0#-L)(csR(xNw&j!~w4TSxl zDH*aWvD}lFeIoR)-0*1Od6_L=H|TW?EZ5fs*zFbGc;6vDlQm+l!@L?i_cS;!--D@| z`ZGOHo{J;osh8mI+%g~MyVrk4EVjHWcpn~;N>^ZY$w`-D5ttFP{lD(Mkzc`S`dsnV{wu~}7Gwv%tdVd@n>K>OT z`N12ydt*d)X9~sz|5?cEj9oq=eD;tU%=MCdI`R6B{8KQ?VW3>abp5cZdP`a&&?LQ4aZ{`4e}9@-2+FUG0@*zBjt%e4_<(b z#tX0o_(-`sc|NGn49f}3?C&=D96TeDuVX(}o~-Qf%W_5RmOE%X^xSlVlJ+1(Q7h{moR^b!CNV@366^~ z_S=m(?r8s#IncIZ&pXzCk2wl`UQ0}zGLtZ$m(P?J{L^4(qHy1PrrnGP>d-gT*eQZl2meC)8LeD+?F@8XO7$2ha& z4|bz4H_4^wTl%4ovJ?P+C_aRFIl3ahVi-L-wPb~yj7YxPWwyEOVB2{lIJ2Eztz5hIZKnj z!&oCbm&OY0c?DgPUN7`KUY{)R7)G1xCIzxDG?aT?ocN(~1mije@AtxrQVe%kQUX`p=-E7lrG=4<^U(Eaqm zN78)%^BNyDyf(An;4$YV*l(9kmF0U6&)-g|hIM5pi21ijtX)`T7c0LKK8HQO%kz?z zn`$(S*@eUF>@@yFyOPpEq`77Wgdg(xo=*V86> zaK7q~quuW%TIJJXEJ%#NlXVjFV##F{R{V;+-J{#ubK>R9OQM-g9)u|Fy2#StEz8ax zmYZcER;@SX!6(tn@(pH-+;;3Pze~Gh+(*qN*m#Tc`zo&^cK97|vNrL2W*uD%>lo}C z9NJ_dg*ALu^-N6M3ov1a(^9DhU{C$|q*M?{$y$ZBb`{}vIb-&5bfxJP|X zeHO1z;q~eN@VZBR2Dp2D2G~6^vg1AC^GWqd@pMdbI+&lvI#Y1opY>`Tk*MxipY>es z=ta)&BFCSqpQs}Hk|E1xoQEgT8)E#$x_IH2qi~rH*iB~31TC!o|N2eQ_8ym0Vzx~Aj zkfbqaJ==ZTrj1)x&zwB<)joZG`P0At>gR7ADW31C&bh94eeO$N|9Ssc-`sJzaumO7)@AjCqVc)4Mt?6D|rNQCvgK+C`61Lmm!t52Q=2PGO_hGZw9>-q>f`UHr zBM@%S2(!PrMisk!=8u2=@`~%5iJOZ*1>U6}1$Nl5)LX4rg+iyh|DVxE)?3^u|Ffjj zuROT&I|RQyV#meiM8N+A@aG=vQL8qo{8xHU-*kO79q$MBGh(}JJ~@7$Qd?C1?(g@S zeRT!V-vIqPk2Veem{QwSzHrCa2A%qVD0MUR(0zG9zdY`IITiHZGjuo7Ur=wLTSRo+$IyzO z>gh;&j}2NMOo4`fIIV3V!LfI?sqhEQcp?b8?Axh2pmMhlIncbI9sbtg)Wf|xrRtE% z)%|kH)%k=+-U9D$>`Dml!+AaPokSg0;TQXyoJ;u4&jbGE-VCk`|74<$s<7sFXU`_Q z9_KKF_oL`@zaJC+)kh_P*ZuG&xN+ibu{y58dtcc%i{5Mh@+SDukBhN7p~63!h+lKG z!}}yQz6I*pw}!DgrNYkNST&vanjgUZ8+$w+oPVIIPODt*2RmbdSK|T<@7olyvI91F z@4l)!qry%P?43sEGd+NQ;mtOWK2l#*XI0qkp(Ae+ZFvUhXI^b3dI)vx`DR6(Q{nBu zIX#td!;^qNH>Tv__^~@H>bweX`S%M`{xck0`lGVCpu+kG&P@J~=wTZ+&-`RrT~uM$ zhYn35eEqQwZNMkLUsG0>RCwzHCngduJx_S7gg#=!XkoEUT~^_3|9;^Oeh;2cbhJl< zL%2x*{_S}!;5>l$yd*^(vBB)SOX`XWezbi89p?hO<$pD@qN6sbKH93Ts^A+d$7fjW z-(B zBk=I9m+*h83V8Ql)s|Io+j);J{(7ToRbl>T_$mwZ#DkrH-gSZKDLm>P4haYMEgC`e zc#jVBG;g`@H>i>divwC6{J>3c`T4sD2jAQJsyN?&6MErmL4ztI@A^rR;3sYnKV!pq zao6j_JN@{85&X=G)#r+;s^C*& zUliY&^u2YafalS)!#@)E=lcbYB(nECXM?BjxT0dzT{|`w+-$y+?oRsxuEeWfy$nKF z{KG9T*sC_Ubk|LA+uXYa?)>OkfiK<+AOD+rf$!K734DR@ZS(MdSJa4~(!wR3gUc#W zVeJpvhEx2)#{qYLt&uSP;qYSbi$w38P;%%efOdZ5v`1(Ej-cN1pSLOf?oeceFu64 z4ZU>Vc{)E@{y)MkGwwaFj0yww`cR5r|NFX|+%NulQSk87O9gNEZxX!c2__DHyrljd z{qz60SMX*&6vO&oA8~ka;$P1aF1*?(aB1AVfNOuai|{pky`TTdQ2cYtwIhuE90-N4 zZghmOrEl)6vdHhAgU>NuX^h}sTIcX!?RU-)uK&qd2aozJ-G6Vrho87r;7<&`>frGV z@8JeC=j=C5)BU#=lmxFV_`RF((umIp{`-fu;L+AUz6rnlr$yqyx5`7L8Ta%}}Zxyqf?A@lJap%Uh3#LqZ=O%nl7C@v=e_ibNljiY5nre+qP}l zb?VfmwiG{$r9Xz`{K(#xHl07a_oH=77mgV)@E?EtgRgw@t~+xrD)_|(>fs;F;(oOh z{N=?FwzEm9rRM9aCJuS<7vKC!_y=FlrK)@Q#jpOsm%r8Pq37nVyVP8&=)Y@I-Damz zwba_&aA?is{(b-Qcka5Nf^f)Q=(XSs?fWx)bx^-ap_go%{NT4gclVvQcI{MCu=v){ zEng@WYPxm1_2YMc_Pf2tAO9=Qn>R2Y&sqv9@sT{ZYTZ zFDR*nD(HWSFn-K!n|(XjUl=#u=HttI`hT`bEkfq+>~ZLUKd%G&?dd>w{N_`2IYDpR z6R6Q*a($!}I1{75r{xw}UqQ08sxeQ*G|r!=J^| z<~=-|{$KpnNAVkQ3&5B6y=lXp|J3a~vCoahpI&Ul&!3^W{=Gvgn0tPj4R-$HSz_Pb zsy)^+`IErbv`n{Qa{O=45d4)f9z6c-BEVJ608jq7{)}3TpDYIKbfO!&27=A7;o-l* zJp}CDw}@3ye6Is^n~860zd1?d?{_*RoPT$4kPv>OTN-kL&~t5sA{$it@At@@uM0BI zcx27@1(}Vnl9zs5b3!duVeWJ5b~v}Ex_U4yJ=OU*vHJgUm{@{O=!<{8kD7DvC1Z8> zV+6ZTZ1!Mz;kBc5h zh;{w9W{;itbuF+pEx=}cNwD9Z(&n)xw}rr#H_pSY`0K;;`_5tcfeQC#Jbbqb#vPuI zbFlkcg8d>k^aHl?Pk}wV9aw4HXAZ0PRnYmVtqyv;6QHNJ0&4nMCxN~?hmgf7KlQy` zDj2x^9WL)VM7Lia^;q=MXMqjc0j%=QZGt_OdhGgla=?DJ5ZHwQT@I-aR8Tv43p8`K zvizQ%D)^JP0PX(k+C%C?6^370;jpv+*a_G-rU6^=shnWBe>p@fOy95Bfg5<#JNT-4 zfKJ8N@RySt(Y=1#RZtuP`vkFf#a}F@{e!QF%r{#WwPR1lg01*;AXxb2y~(={T#28b zU*E{bNYeo0zD8KwHhbxPYwxu`KO&dTo`m2 z@VXxfe9OaUH}GkbuI!dN@7zD{1H9_b1-^S$N#LXZQs?3DQ%e9J`&WVg%X$2BFua%F z9uiKKdJSOo+yS))51qeR$H&U`L9sx=V^v@i@FZD-FZP4u^#m9Hkq7^F%X|3#+X+u6 zp!Y3H1${2>(T|M)y8a7!L4SNrugAZehWhwVA}A+H{SxTmU)B>4@eIHCR@-759Q>G|f4NrB%F=s0TJw|E#rRhExAlkV z{8*#F=l-oLVSL%WdxwU0+pBjIR#Vncdc((a9_=*z8qj$6w-4jDC1H5msx^2J1r3AB z&bj8#wxJ!57LE|D`@4ODF8Y0s26c0RuKuo|UHhFAbWo9KRRs^8LDHom0(M&-t>F{r z0KO>*`1#53-29cJ&<#F+VKuQqpCDFI!GEtVwz<-juEBA&0bd7y-mqF8J8j=72_F9G zN9b109Q#q75bk-gRS2a;UvPw=>w{=@vhBA8zHfUh@WsEXC5$iDzjH7}@R6TBLHQq7 z@M}^0htlgiw>q?2pY!mJp1%F0+Ngq>hgRbGbm7U+qrqLvaZR7-Dc~0;6I^_+fcU94 z=yejV>4y7G(e*FZt+b&XnQwtEepdU`taowwFZ6Rdvp(s&guJ zRdsb8Y)&cas#BISJNgm!0X$*V8no@daQ~NU8_6YQ<;5l#FTCu&!>%CLghOX6h5x|X z;nD#Xtm;m8P-sNG!A0jDVFUZk`&eaaTC2Zc08qW3jgwKduGbO8yPG{lQG#OXcOA9p zz+b=l?h(%ED-Sx~r&Vpp_>x1G`q#o*-%=)8&I82wy43^5S#)rv*jmrM(5c_p39~nC z+VR2Jn_u2De3;N4sB@n^!ffO)%(SVSIz;`G_7dWPzrjF%2KxT_MXQEUORM=*vku~U zwZlvOt-&EfCM?b`*!1D)bHD%gyK=nOemFerJ}t>RT{>WCUye@>`5s#bx*lC~SQ<8J z)U>~yLC5&vjIwc+u~u8N;l!7?pY$(x@rptDw%$*Os5<8HgO+YSxcIv32Z~xV^Ye{$ z5jA|sU5J2>#JuGOeX8j<@pT2oyB_xwZ6Ks=+HdLnFMHlfrDR+Yz1Cj&u54jt#7xS+ z{}G-MSouC!8U7RPMYR8HuciNW>!hyLAEI#e#8z*vxGErfM<>|pe(DRbfBv$Y*wxTs zw|85vFPFa7q()qbUdDXPt%O!eYt%jCBYZ!i+)n<6u?{EfEZz@Qexl71EF5=PPV?UJ z1-+VJ$>wJct$M$y@Be_&=yIjoOmVzvM_|Q2(8f#h{vB3O*>`{c)3tp$`Qu-IjrX(q zd3uk{EPDU)?{9ru>V@p9BM_~|DvE|h`d4rLK$|&j&TqE#hmXJd>?Z%z`c%9Ax1XNi zIrR0U5b$>WBEY+=)(=#Xeg96ILh8+qZV)G7casugQ@;mI3mN?guSG#U8L$3>DO%of zP_bYaWql-Fsj~P1(Ut8QB0qgFKsK*q{)&yPDw_?tk>$%qTY2r%0F^IG`JQ&cTI?v5 zyI{B81U379fa>k#{+_nb8twPWEwtmUk+S~LF=UL@IR9J9cc5x|lM6n%|F*g^w(``} zYXSPhO_jf+?K$oF-%Ijb9pun~Uj@itzY+c&_WqPUS7~pLy@`5F*!U%- zxmvOXxnZF0j!@0N;BAgv>KljeVbf8q|9&~`8LQ@*mXNHa_oz+1H;bs6)@Z-nyH$-1 zwUKqy1S3Gd@!CCh3p=^%TKlJHkw`nP;8a5W}&<7vb3}vTl-^Cua8q^5WIV5nkk^;J;$;Scu zPdQ0kj*rY2nWk;K)cu1-8x3} zv(JN`Fz-o#{^#MKUt?PQ_+#IkAo~0DL2r1<8=#-4g>4MHQHX!%_a(+DV%U-Zh8OSg z0K;Zgkql~h>c~$dL%Mc{DZ??$lK?F9HodM0YyI|mJSy>~ZwiRfnTJ3`m%2CVHlCt- z^|5%%q` z&cOD@$R52qG_98q%;rnJP1ux5>F}hT`eHp#X#j_%K>}XfJ%g8dYw?Qb1FVogLA8Fy zzCgG50=Tto2%E_A*t={VsORxizldgW7##c9C^inSDR+S9DC+7MTMyc|Yz-UDCa{$l zX+B5cUBsevFx$jNBE!k-9i((YaiO#S9Z%Sk;G4pxvbjiOE6W9D5Ayy3zDyL`RZJSL zGSgS$Z`mH+t*g7wb6UjA_a+YN(WhJMhINu+qr-xns{NjHKMM<~ z@^tIY11Cz<1pE7ay ztF7wBxr$}hAFwcIOwAUZy7e0|cG}#m;-$sLQb+O9qN3trv6K~?OGPnT%Hg+)m8He3 zm@f@qwsh$-{N>D>I(AgI8bP|@G<28dOnC8?P8~b)PNJg$Fi|g}liINp{AKWSfM4RY zj$r$tlhP5C(oPm?&j7xp6Y!lR+x&W5NB)(4Y+Dy5d;ifwtU%&70Z_`EnYRRU9{5(Hr&CE;D(vI z_wU)WckiCPFn7M!4}dZAy?ex7SP$Q8?s4t4iF@b^EdlU;r2%uR3|_o8x`o@hZz*5h^1&f$Am~Q~6G5Qh6JK%g3PdHp zbqg0*OBa`ce{<__uTX|XVzi>_?xg13M@*cxWW|~l%ZmyM^771lB`+UuP9S-CK7*hv zkHc>Qtb7w8Z@wdMO-8#2&2%%55#|baC(S(f#iutPeadbM39vRJZYrN5q}}}VQ%wBW zO+PSr^(`5=jrJl4<19Bn^;7sJSYY=A7#u*7jMhyr!o&rJFV4IZCm?c=E2&ARf$wCZ z1ycioQ2ty!FE=+YkLNBC(Sj+p6Z|8(=F zxZ${Y<0k(34So}5dv4#Wy_Wp<(KD1=j7(d|J=YYIU*0o^>eIT z2kDrbBXSu)$<5)pVL60>o;kT|7PpDe47cG5b}JE6&;E(@AVo+>Q@WhQl7d?|oi~Vj z12h#LR10XNXsJ}3_;~=Jpo+AlPGBlWVy29sQ3~RQ_WAWW@f;7MI6bU#qaG9H=B-@2 zvM4VnJ3F93w#els2flVPWF=J*}W4zJX8$}aTv}Z7B%(spQI+THBkjnOS8px*jkXtzfy=)WwJfl)kIpE z6f2+?TAI{MBl(Gy-;`e8&5%H;z;@GT*>!1SDqM-E-eyF4VR3%;k|kMLOO}W%wuEO{ zOO&i7UO4_NvBUv1NJf^n1U^5o3;_$^$Slqtl&Tqu!gSN&Vv+Bj{*yFP^=mU;9A>j% z%BuoZ;TqCh71`#JmcC4I;egH!CeadQk+CiWDF!E-Rb-0GwzXy1_OVPmuC%WO(^jbb z>-uLmPV~W++;tYDg{F0yusA2bATQg@w6bu1Gm8V1%q(A~ActpisF0PFnVDr|IBuO|=vVdEa{hsGE)C>JIa4ks#KWsJ_(g!GTn7pU*?`ie zu*8NU42bQNxnH}+rEaJV;3*MOhx|N{uzvINlfz>TOi9s4Yjqfvy|y@O@#6G!Uxt>R zk&(_bSb8Y{Ti4S6V}^jMWTcxJ{&Z(XdVc!P!lMOEKJmFMS>H8>T^0`mxs^lCGMOWj zGMA970Fsi*%)C~94GM|tu#X4*G{Qo!&puw!L^CiIb}6ptrXw;7mONg}7Wn};7b}Yw zl`M8F%3b_=ie}fcgGG!!c>UVFtKypfs&(xrfO(Z&D}n33ikAx4%B~8834DNiSG7N$ z7+cv-$%oWm@N`AO9QUH zV9}z5$WU7d*I2~it&l-1^2?B(kv^#bURYAocCe6_S6#Vod}3Yo1NbM})laTo{r(en z6_yzh#5bRxh^vp`KKcX}B8m72h>}nA-=BZClH$jT0Z*By`z=_WJ8#~@1#IEN1^WC2 z3+6Apy#Q)2z*kfAwFL|3&o>r0<}Xfvx6v=zc1E`MV8M}WJN{Ezaw0QErl*Hw0ln>OE#wDRX@)R=s=#zVr zqRdG4B7di&#-Mqb3y_L6*P6%X@_CNA^XB4T%rgNR1#Fr%7x{vR1H@dPdwaUQ>`UejYc*y;*1}n{=lbVBnmGbs%`FEgbLNUU?zwa3;(yMZ zxn7_QfS98Z&Ns&)(eOCu&RMWvTt$(&Sx9F{3B#lYOpso_d_~$6<*+LXGo+VIh)w`g zq?b7;B-mx&74`DR_=U`uZR@2tdrTo|kW~5jviR76bUwZU9xinfSMHTHH*(?v&3w5*6i7QmJ?X~BkZ<4_!YA(00-3qw-w-Iz-izF zt2K++QRgn0+SFxt3Kt9MwEWW5OE6Ch*)Cg`tjn%Tm#FfV%rR%ruCAt#O`gRX#n`O=lE zCk927W9!YOI8*x0OP?`Q%ra*}4Y;0}vu4r%%vlI9AkCTnS$rl+Vx|SZkgkQWPvVT3 zI`M*{&sdn=8be5+=XYFo@e>203Noro8URcwta-0 zYb!_AhV8iJm-(e2O6$_48|QNxX;KOG=@GML&zw0!%rs}Pnf@6Hc^N>TF>}U@nFf4f zhBkA?OgI*JbixA3XE+EsW2SG03Y0QqW(hFwEy!vYWUGNT*s1vZ$B^7F#UqQuB$a`% zv=}TPpe+~=xE02UsrpD8yBf(tG65o8LR?!bD_{b+?2;4cKb#nbLsqw#)7=Ex%$Q#G zo;6(n%HLCGOrP$3kIlIAo;G9pj2VP@?>*x^2BbcHenwjoRx|Zr#nWiciBB$Gx^(g4 zCD@DxSeIZR`;v9hyrf*bWL(rPfk;^Mq7Oh6lq_6v5yDCE$uNv{gB9!-FTsX4*py2$ zJ(w=OX#1R(E?&8|_8FWJ{F-^9nva?@Yx*?&iD~9^HqAd>A+Iuhnt_m*uD>^Z`m||$ zx&{^m1-$w+px`s6TkrX&bLja9xOwSq0?IfPca3*H`~Weo)&N$S2FE{5Oog6Pt!etZbL~EW`hW_xrXBs*8xRt< z#367+dE2ga(fC;qss{(u4CqO$B^OB#lH9n6m%>zuumMhv_oDWP)z7&~>6Ke#+qb7p zzx6I;d3S2ryKJft@b$YUe#_t0-!GyJ(Xr%s*n&h{yfrZ^_gnAOqRD<~tu; zxp3ikzmq2J$;`b0EAsk<-(9$H9){3{m{E|ncdu;S1- z%G*_A^7~hIoqurt>+`O2=g(ifIwcL~n7+j*7u{y$)G3oD`mkZgCs`AJfGZ|x6DLiC zV@*^hO)Q(FO+e`JBz5A1iRL6RQJVyhF^Nxf!83Jcm&%$EB(rhKY%ZVkooDCxd2!A- zZ^5Pj1b@bcMn=gywRf5|x~Irtan*xAx^cy)cwI*UR*YXGcsK{lgg;o#ush>p*iK;viC zb7#-7bLLqc?m3Aykph8rPCt9&Siktkcp2w#JTu~*iQ|0`?(R4?7VcOJ!YSj%igDWb zabw4tc8HH-2^3n zx^KJ$SCg^;O0Ixo7 ze7`zQY*#p3B(f{4`}&Iz5|xiUNd_u4684ucDL|#k0*Y90iH>sQ(8xONlp3K_$p@9s zoGAyM5`ea6PfmzXAK~Rms1ozyxUpm28aQ~b0z z1=RrNDHQW5$OarcWuC^XLFk~KLSq7_atcJKC7G1dr#LvQQ_j<;&YU@Q=ClW?$^X-* zy{Axd6{+fHF0FmZ@eoG{9BN3bQ4>e;H`%E2H`P&ZzA50>;f@;Rd(%Pgo1@A=B!>Hd z5`h0r|C<)b`k1$S*QyZT0r9)7yXgB!JN412Qx863r#N{(I%UFZd}N&xa7zIu{AB@9 z!OCQau)dF6h@kAMh+!s(`iSAfM-2CmP=+I*B4EIE3>!gc0e;5_kjZNST;v@&sBsVu^8|HW zbKX43Pn4guP8a|`;O5CkCzTT?OW-w6Y9~&f1Xer0uX7X(+c3AM$?!Kv3>`LfC?94G zWy8c!&#Jo+&tg(s#mh^2CXgB-4qL;siTs089Y+ag0RzeJAvj$B&4Yr0j2M-xK+}2d$c39zx_;y5B9J!pWa#G_G| z($$Y&+|d_jz8|q*J?h0bhYTJxXfU9Bur=uMU^eIhTtA>3elb`Kg4lyf0lvWx2kS$I z4QdvGx$9)}f#Xk+)iN&}7rk2!ydcd@WeC`s=Ks@eOk0RzPVb08Z~3fCHF4JZK! zfHhDXFmS+tA3!oeQU(IcB$N##e&0aXfPn)C4Su~zFw_Y*Q$1DHy6NYR9zAyKs5s_0 zdJH~zaPQ7B<>)aJUVc;s(uCh3i4p}-kFsN4_?ZmjiV?}ifv;c#13$`TQvRbs$0&!R z9~~GKjIW#?<2%p9F2jeIkW3jc(1h43#43f0VCew%`V*;@HLwh>Ie-o1zySu94?yU3 z?*Qk(0fPqjZxZ~NIqNSzOKF<{QII`CQgo8dBSQhTa47?1BAv)(#|%LEQ44YTQH7ES zwpAoij~(?P5mHS1U2$9WN1RA=C{ay^j_9}Tb=Kc}UF-k)>-~+_AH1#&7}_!n2m790 zbe130DEA+btSko-#E-yVkO!qiIhr7W>nObZSlLni!;i+q$<%dM&8`Cm82wp40WkYp z0M^gfU-bJLes6!)*M~5dVD+=$8vP&lclPVwukYv=A|XKCg=hJP+R+b>9xeZn9pxWF z(+`m^T;;=~et2zH zq>8vFd<-hF!a?jw4$K4x#x$KTuPqxA0MgX0D2G2AD;c^?kHAHaLN z`tSvb>h1>*KDhURFCw77yf-ct=>AQy?SvFO@IL?1t^l(%O;vVHR3UQie8VAkUF#t zve&DP-gWrMpOERFWv1Gx^`k?fE>+t>e&BNk-cGwRv0pus(0G!u4Y`k9v zpYgtd-%^12zJBCbdUbsISH>KkTCeo&*@Jf%xROBhu)1qKx_3vA^(gDkd+6PJbnnr_ zL`Za3dUW^qaCC=^-Fx_n%_hj0Jt;Qt;Ra5|pwtje^e}+c2DDFbm{>65C5StI=+;B; zA3l8OkpD0{^avmTT!J{{m9BBfcNo`i9o7zk51IjqLt}_w9V(Lqfw1HF=0PF4@;we$ zW1r^P?!CKp?<%_KUAuMb+THACb=A9f>)N#&?`m}uT^;1@2D0d?bnD7N4F-3&Zr!_e zCoV!Tuu7Wf>g*2guHCu|8{OT}wR`ujl(>p0KPMFm9+^bfuKhYxahe__2xsP9af7#z zdI!Cb-#mmW0GRMQ4?^X`2M>!w>>vPmAyrWh9R$lke57$uJ$y)#h%63i2cbPbHaQUmEi}Gq0 z^Hr@2xWubEIlwW11|J+^;jgOjo8YTp2oNnG)mOWK!Rn&*X9 zv<@f-51G(GJ$MK~RO>yYmtJHQXR4jnjn@Q|btN8HCg26{raiuRv|M z>=iG-kRW6X!ZXknVwEvOAcocj@hPJIO7FIb4%4N$sU~9wZaQ%Az=4C}0LuG-3a>b* zK>;Yj53qyfa3Qwz3%KHd26f;F8N)`ggXRHZGJ)kthe^OSvIv(RunuWCEtvXGd|04s zNo~8mDqd!tZLm6*!(Z|;wCr34pYgKU+5589S$P?b=|2F)!!6yS&ns_$hD zfzIa3TCdg#dZ5#3u>&{mhaUT_1AM;$5C@F?+JXK1;l=%V``H2ie)9kWTG@Y~6hT5e z_a7h*_<-a<3JD5fOt9*p9RR@v=ivKCCZ&7}J=~%7I=|BSrI$LtBsw#I^-?)pAAol@ zU-BYs1YD&v(EKGR4B#)hDUt+^Xp*QA!tAW|XoE^Y_rmK;cif;&`$#G&B?3&_xEg+l2#t|dm&!K?|l3zva%j66y`gmen;lO z4wUcrp`iTx%P3#u2NCzZzkPD@U7UT_v47a1O9_sv{T1+?bRTuJI_Vu>X2h`~7e%pnUt3{rkwn_i;i>RM`G~`|-bz{@-8O0Y{0E zry5rO#m>eH){Eu~>_so!k{6U0U*HH@FA6{zpd8=_ST6{$FyQXLpm%OpGZ=fQdT_f% zyZ8I|vVGqHe1O|~t$p6T%D%lgvbN6x!n^k|e$Bo5p}n(`RXf+jXFI-Vc3>~~JE$*o zz^^6Y9x$SV_Cg06B@iqF$?70p@WRiDxq|^;X$SqKwl#t%e^2X$$RB6oz61CGU(lgD zjstRZaL!A|=XRIEXYSFCtm+wjhm>~JYS*#7@x0ZZKhN3=fbV&&{qybHn=)v?C6d)% z12g3}AmPOZ~ysh(S~dw=+onz1wrw7^wc1z!6X0*l5EgBewt=8UUZbsF(pekcR`2j!%@C?YcdL0j z_o6&@`H&lmYZr=Z7m5qHOJPU|DlTo;?p?s~UAS9ym%e+~?%lgecWZkN&T4oY!e~Kt zTD9eEtk&K(thInE+NiDDv@u&NZCXD>(9s5=*1+=Ctc{St)~yk+5FjMjDrkh#CA(rABo4Vm@33Iz!&fUIe*RGwr#7+~S?Ai&Db{f0bPA`IfxB_7!d3NpGNsN-$ z3j#4(aE)CmuoT4r#s&KB-TQ~eNIfDNwQkFwvs#xt$69lM`JC4Jx#wE{^c;s*v@Qb( zNun@oU2c<&=lqCc0IcV%Hfp^HNUD2U&E3A+haAnFY!?TJo!Sm$T)xxVVaXt>8PfW9 zs=IdX@bA>{yFu1K5;QIJ&$YJx^=5oEn6C`td>?Q zCSBf2ZP^MwrDZD)q_ZV4v}z?=bat4nyh)b$5c~ z+o9~-VQnWG-{}Y4glp_@?A)<$^RR?(po`O0wK)mOTR`X*R!asqxJAnr_-~2-7A?${ zN()e}mQF$d$S+YUg5CXIs>!Cavq$hi~3#Z0Fl7K*aWK+qQ4pF8^&0->xEz zduF#Q+u*S6zHJ&YncK<$%61SO6oD|fk7=6$7O_nQLV&P)!^EnJ6egzrv(G>T@r!6Em)~GWYZ2~8{cYeb8g+XZR@tJTlqGf zd|OMmG5D3O+r(C}&48B!Wo}irftPJH5rjJMThcWU>rnBFL0{wJK253I^jXo|YQ~$J z&B~hln_10`W)v3989;5;yt!y*fM!V^*34|q!Rtd5lf1mS)(l=I(Oio$BF1%Vg@Bp^wwpIsmP1_UR%34hsE`mG2Nr$);9w`n`yO~yqSkXoT1@sX*2u* zp^?Ly5S~k3y-BOam252rZ{7thd|Ne?yA+l~*b)F$hb(CUuPwieq$NJTRD=}ZTUFpJ z$v}$gyYpXm+NyY}HEAjuD@_`UCaf`UA{tvwEC7>X0YBjd@L=Ka8j{U|-)d|E$R##Y z;3st($?gX43Dk}YU5TcWmZ*^2)y_?IsIl!788 zXoNN4H4(u8;J(eRzAY;F4Pd=nv;)&>E4T3Nx2}ZOXwpP9QW`fBjaeh!STuqN04Bpw zD&R^M-k3EsB%1|RtC0yH7mC17(X~d68#nSx6l>%In%KRK^+qikQibSh)qxwf^Uc;4 zb2Hn*H)~rqZ{7kEGF#YYvBli(-ifENC3;00Jqp;fR)&Nn^nX#z~JAk zL#x+9zLLsRs*SR4=xEfi5&lI(*2rvVH7aSS5rV^83KRzr=@;IG08pb?fj&NwFw! z<>3T(*1QRLkLl^#rCZl7J%_)ya`WFd=^Hm~+PLZACbp4nEZL-OTh}9ohpTMz6qDXwWMqN?Jz{B#{d>+L|5zAgUb+C$oPJl28C^YqrOf_2h!4- z){7uCX3sS8JYy6)3Yd+V~NxsBoQ8g+@$1eHl39QjQ|G-U$B9`kj-o=#8o?EOk)f)(ue2Rzz%YK?VG82QL;gI;x5K({*3q>fS7B19eWv{vWoI(1B-NOzPBNE+hQ z5p^APC^nQ1mL3Wq$f19Dy*hPj*Q#E%a;5N)AeXMHmdbSQP@E1^4RW|WArUcEl4IOX z6K8__tV(d*7n;^e3JZ3-T^hreKe)U|cS2={!Z54mF3V}TgxlkEID@N=TeW$^dOs?c zZ*V|iXk8|2(OMrw0V)RohxRH0VndKbt>3U|N}@(uJGH2^x^-&T=5^HCb?Wfi20%x+ z4t!Q^R!7tpbvy`xNdG97+GZUSu2mZ)0+%Bk6ks3+(dxR>5-WuTxp3za%=aM^#T6tx zO0dg-IX@`la=ZNwhRq_UGu-2HI^EnE1>F=k2u`;X94Z01q%PRHew}x{ zSZA(h>q-G)y<^?_b?erzH`iP1xCFM&l7t{hShsCayC6k2V@G`TeNVC4kDiLE^K^r! zswUuKC^xqMR2N_aM!;VFx=w=j}p;5XWP29YuBw?E7n^f9DhYwIUEVqpQ`ngS&KbYT1z~| z07|W=3`R!1N^l(QH1o`D6>{Pan!C`J0&?b%%iEc`2Su@#z;#=)dae_ z$1VQ7nr_9Ra;7KsE!qN=Q2J0wto5zapw?P*oq?dTb{&^^KLRo+q-IOI1u3MN)0tSk zR?V6?N46q9s93W0!CD{cN!>WU_Ft%GTvgL* z)Tmxw!ve7Ck7{Vu5iCW}3s7rRuWkhVqK30(t?HG-+&Ci;r2X$m$?&y=Th$uptXYdc z6#W_pJoq=)SZkFvYs=OsYu9+!aD)x=inZ#RS8-bx^}cHU>MTuEH_}*jf10CuT6H|B zM0G38s;;C}=WvAW6=^CcytsDhn16aM9uko(7*09x3Y&BcM;kQ;RYgYT=h&8ws9wY%KYqh>^<@^T9Uzm=| zs;WW{k*cMorly#wEX|t=?NUXWS%K11($Z4W44_=8DPT%TgO>rUR4WCL#!^HoPjgkT zQN3zxh^BgfgNm{L!yx8zx$#kiTTOUv{n}NlRtz^=dyf5BdeO+5!)1 z6QHbGtr0U{rLW$!sICWhL*QI))zTDJ?KTwsTZ&c9OmS9A!Jro6DEZ%!7NZ76cui9~ zEHX`B+$fSi;5!HBAty{?~TH(EN189Wi(lUv8~%tX#1IQVWP{ zuCP{?0IU_t$`xXTfQLS$w^rgh`<2EDZP(;D7m4nSPAtV8?LNRG=~~GTt5~?9-GJnf zx{8`yrHV+>5~JM8qu(HL*ng4uF^kZvjar_Yhfl)sF?#ULlABhMRl0+46k^`73iB&iP zEXfaos1lZxSUDjsF1Avo=%|PgCr-}&=dI?yD)NZw%_ilfXYfpxC9*yAk+Q9mD0V@o z70dDQK9x6H;a~oExrzmvv0PiRad?$K%2KZ^aHl>&3E&Zc%dnMb{Os2;!>?RfBt*u? zLiCvE$nfy6(BL4C+lliu|L+RWb})83FZYXJ=VmEe=3D*% zGV3eWb_r4b#N5mkod9_f6V1vzQB?LNDwPwB%DP1PDywjLqLpMNs*su|Sn^^|G zR9jp4a?BqfydyF`J^^cC2}Znzg>ixzZzhO%3$A5T65?gch>DB|4Z)Jtg=LPaV9B8P zRZC;40DSiwgbxk~k2R8x&Z40*TAJf@lzF12~+ZOmdA45)IVG%>~)>dTokN8}Q8_VNZY)PCIYryrz@mLpH zf@}y}Q*=$JC{k5}Y*d^=#XM3q;s57vC{~v(qsR3lQj&pKdc?Cs9 z>!;TVmO@2T^2M?^0u#Vvt+?3OxR}UD6j`tv%@d1vl^Un2aTJ(A&tX-T9WW*u>~9y& z?ZDWgY4sOne}VGjkgq&l#YfN7W*u2M#X~&0lrTI-#IhJ3%PPUjdyI}6jjbeNBQQ## zEry3+GJ_d{rZ9mHWNBEh2P9=ELMlc}lfpCQ-ft*J%ssHEbYeVlhIUxABt4xfI^$tL z;3w(UVzF4wna~KgRN(|$jHm=jC5RZv8)HR>(6AKbb~#amit-rJl>kUG0|04%lUNQC z%Zc+{&cq>$vI0{5kp3WDq^m_;+@CQAq=|}&5z)RF7A<1jQ4!&xxC;eKXw`wmCjL#? z{{5OCV)$gCkyuoCcYi}UDGunNJw1DI25#NXxQ+55S(N`G% z(GrSb8cj9jsHKa$O6ligFRx2kJ zgdQ3h$s?R-5Ma_x)Pb-YrzNxf@4}#mfr4v}sj_g}*njdUCP^^S*GZCULvu+IEi+?E z+D#V59HA(W;2?~Mv_B`?p;nGOOca1O&_W>F!$4F0PqWr3YsX!tHJ_55@d%CKp6oCX zAa_PP&rRmSEAk*}0$dg|^#t@$FC0>o!0xip9Ut_O?jX^CjjK8T<8pv79v!u)zLu9E z3!!jwvUU@b3=C^J4QB#5Q!%4mz;E{fDS=QG8jYRQ5&$GXK(2D!m-wI5g{B4R3NAKO zLf%;VlN{-25Gg~cnCUE2O@GaC1MkDQEdBpb6v(dpXTqo$IZ!uR+Sr2sCQF_&uI}}K zC=5>@DsTdhlA(c%O3H8d3~HN%M$!C70^DMntL?O$o9P%u3zY62%8o&Ei%OfCBIQO& zGdV6%eU#cH>IoFItH?=12cAs-iSo!hXy~F$dSKs6f0V9dELK`7w!WmR(0-E1lg>X2 zLn>286>3F}w{dp_GXB5X(88sV2~%@!q+7_cG+oVH(vQVolLc%dMO&Z8(xpu80uKxe zcBV913H25xTF(Eg48LZYqyC)S-=memnq45*tfow*Tq#HU3CU^bL)Dc6Lq%ON`4Dmp zu&bTABUQxT@LAITdGAg`&S4$rF0pfdg286tgsNAODfJzC%3x1S_9J@sP&W3U_wxg( z97uZvw0r#jIae&x;)g8Ax{;2|a%Qv%rp#yzqlA%_25-Re17k=^pkgUAhomZhhj#A& zpPfkq9Smle>Ml&r@S#w@M5{?JN!J$_&aA1~Ibu+-t5UWZ@MEZus@fA0yJ8`a3K{GY zrFvF0%39Gd4F1m>+l*1xP*Q7MnBleSGvfzYqqYcH3;KmH5}{(g$n949NY3p5Y$t0#dIvChsaz)v^|jN}!A0akdEKA62+l#fsBzT{L~5 zp^}PvWQ zKecf2eY5~S;5($LWzT+9UQAC#XpfszI+Q&<3uL>Zxgsrpsg1!)PeYnU+SyRDnydcw zTzbgziP3#IKZOY*P zWss3#)LNLCagBP5AMJSQ0N8`Gl`_>(nbfb+q)N4CdZejcI(Fyzb(*K};Ce1Q>nf$` zOIH@Q3|zA>+lSr9NF;hnlS|3?RG$>tRWTgU*lUk2zsLQNT6DL}%#YL2+Az;lb}YM(Z*Aej4ek+cD7oS45?(x zNom=5s=bQhWyZPrt6uD@tN)abK0;davH~~dMy8!#I@X+9b9BO zz=r{YWc!yQwVRr0Z$3cnKpUjSTuK3|NJ>_X8Bp*sRgRgi<&R5}wg|jv#Z-Q@a zDICav&{W)Va!=!m@&`($)?2xk(>X?yjDD~RM|K4Q-G?3%c02!NYGgmF0wPgzG&GpD zJTK14qJ-4karJHE1q{#EUlQTJe(sf3sP#)44C0(&nsazwhD>Hzf7oM_;!ua6=0%y8 zQFFFCI2xJk=G4f3f+!3-e`g_l{G_5wC=}M-wuC?f?$2c?i$cD=p!GwU?2Umz6RFt= zxav>I`!ia>LrmAKOr?Loq5=v`woAJ~RSXCi&1hV-XX0gW%P~iga)i7(I~(&%46cs! z#aa37acK$}W?%}J^&p$KRK!c;Cn0|&rJM`VG)8KTrxg^7dnY5qP7q7#MdMR!I}Mf` zE~pp-&lOs|(-TBCDoeH(Dj|9X(8TE+2L75EITx`m&z<$0wB}ICDmw7b^9B@5UVr3W<_0z*8Cx57&!DYa(m5i}rzjXDWUE}&%f$%`^BrmF>GYuTnF zki>tG2q`R+X`YoXlj(!|FvtQ$U=2#8Nh#XpOydkKnyJfCkC8KL&{d>y9>eI%MM#5X zDKlF>LLyHB4={UFqn1OX0PS>8cS2jBwk7KiD?GfUJ7^;jq?GC1LcQ4go!4StUoTBb^*RlS2C9>ZLv*FNm|(W{%=Xj z2X;kaLunF_rtg#&6*uTI#jY8d=ye%C0ep7%!7ieTmdaq^;VQmm_Swo&V>2Kab!Y0< z)X1sgs03x1lKwK$3%Eai#Bu|P-T5WK?77b}Hzf$0Xo}n=p#<&K6D4N`CM>+71xs=1 z;Y7lctrQFqZx*6$|)*ODLpB9R@oWvVv$zQt<${)1r!^GGQvEsJr^iU4kbOEg7jW ztqhT_6-`Wou}ez6qC-&8{c8qx{r_w7G#1!1{;w$M$nja3|B|$Y=~_;ImqKa7$Y;g$ z)ZXf{*ZfqhR6}UjQhu5nQ&q{Lk+UY{7Q2XYtuYG)p=VEN#*h?@3MxO~LI>1kppIpi zAbz`^sF*Eu-HLUlU1avEUc-5Ar08xwC+BmNL20_4-#5xmRdIz=vZ#Ej83-hkqsV~< zMkrf+xq&aqCCJ6DOs3qXlw1q7rH}X#2{5DS3r?IZF!Kd=J|sZj?P02d&9y z%%WoP+8qPfz_OSKw1T554b-m*TML&kUG9*J&0{O$TNMAR9x5oo67|T~*p!CNo_(QL zpCPm7&Y3%J{sLUxjwR0G_v%uf_VgT@PzN_}EFL6LN zmVETgWEuZV*Ry5}d%3Anqnbz+XMZIH52zp6UG0C(01MTKiNI@G6wigS#pDcisS2aH6tsV<$Cj2j=4n1!jQl+ zzE4-PW~Y9K3#X`uQx~yDsHHPZRr*L`^}i{H5X~6T@u;=u0X_GEH&yFTRV? z{~NZZ@6i)@Smbx;8PI`-=ASojnDzic%8U}H?u(%n!^dOV_du_dNyU#Sq$k#;^v94p zos!F)-pWJC(MU~F1fEP44V@+fqynMs%`n=fvXC~W2zDFhIP*bs6**WlY=dbEMqbM1 z4&ZJetMAis1#f!cq$G`Ui;&YJy9?NR(T|;7#W;Z{kPk~T&ivR}w8!ti z;#uB*QP$sNZV%GGPj?`v{82&wWZ%kxlLlmxH87yTrHm`4pU9PhG=njIexU)3J-XV@ z!9Y{M8d3!M5#=pA42;S|yi-UM(|ed@TNo05#IJ=Gu&CQTShDay;6M+yhgbWFRnh2v znJ84u2JJ^CH8^@?+G|sLNS0-*R(m&}+Wi#(r_JFEdbaZnEpJj&^pHFF3I*>f=v_H& z-cbjtcrapr%dWDDQ3vvyc!1hl2vo^|X&{Yyb_2C4cJ-<81h<}LW{Cx(sO+_}$ui)$4%M^H$p2noe0bb3EVN3~IyR7<6*-BhV`E2emq_|H>ldTQBa zjC}2mBl{Z8kg5$cv(6)HQ&uFs(q&nE32t@gxbK~3Te->`H7Iu#)@#gA9>TDr6>1Bh zX?Q1vQ@x}bH6|L>OGpN)R2xOoQJV|QG3}`^x~J#)tSlP4E?@%zuj5g$xT9QMlD&lI zXt--W*O!f}{Gm}K1aqSz~Z`AY*)UK6{OW&cpfVBah%d*WJi|(=~>jaHq z(DoKXK~%`XLwUFe3knSh#t|I6OhhYm(6IH(2u`(3Wn&iv)dKnLM?1FKLA9q&RA`*U zYC1b3<10Cga5QmwIX%xI6ArL@;3rRxFV~49F8MjLU_AOO=5_{$g@@r3P&f~>!p$&$ zcu<)9Sb^SdI!zso5_>Py^6YxBMex%wBWnuzR>($A2!rO=Fpk@~_%_PsAE+2X^+MH= z%kxy6XEJd>CD(v$87^&31W7Xtd3i;d!;(lIO>u;T^9Tm8V8MXn*8Ol1VT4;@3`M1* zsDeE5pgpx68YToXl;bu%m`D_Q0LoE#~c$CIK0T zAQKCI6cEfsz)TEeWRQ{s43olW6|hC|AjPqPBDYXPAlW_~`ZG#{ar^PYmy@4w<^q@b`!h+;-+ zB<GPwMC->NS77K8!xrReGkwXo>9}|vkDhZN-FT$+70Ew8|z?}BZXf;=EZzCu=7^gJ@t!t-HN1fUfxpAvV6;Vp#f z4vP|zW|STo6%`rzB+80pQ5+y5E%+_l#R-C-NP3SCF@uBfl>!Dwyw0Z=*w`?}yY-5O zh<+hw1bs3y?+1p~P-$oa^@-wughJYmG4mN@B)NG3#6vk2e8>nBIpiq_aQgGL z;;jCmcNh*ZtM2fa7&BUripJ3bUo-@b*65VM6L|g67J?+Nh%!;gN_b#cQGz@cnx}9v zCqAdpzJisbu+fDX8DuyCH{NrM3}y~Bw0urQNyUTWVgLhjkxL@;fVmqInZl;zVFid~ zOD_tHd~Nyc4k35gpINx-3XR4gnV6U;oRo=*##s=YNx=yW3lb_Z(Iz}NtRgiKF%TLd zGunz#qJabgT;PsUQRWs}u0{>o2-m_QLiAhA5mIOR3Ybnov-9Vr;x12z_gGk z{S5dftU95p67+NxxMz+!xr)VK&IUiHTHTD;sSL@gIOig19e zu*io1(l3A&$I(0y zu@8}%zmkY~0-%iV%FL};2oUS9q{UVW)nP_naimT!EG|T9MiHe4b>RvCGB1J*UZ8|T zv%(UD8At}g#LkN77e^!u6<9qgQkNFN9QPmSZDm+&d|U~RYk6^8%LusTu>!}pSX?=9 zIL3uv3n5>u8XW>j9ICTH?uw$v#mKwZDl&`dXqpY>2>T_DTn1VNT`4LqL%=B3iy5MGgcN{;u;SF15bYa`kdZGG zt|%@p@8m+3|%}ji-!#H z$SfWQ*W&NRsWX)3iVUWb5=&sP1L>wGWFmXnd zz^cp=44fM+g=9C5T;TF&gyS%fRf9hvv z+yvZ(Un&VKl*F&LI=>%`vwn;ZKrsR)B$-u|q(n2xs)DrOt>RC@X=j|H~bX`{(nj?P1dVciSeMP;?vCN zN!#f|9RpwHc=0LDcL1F}+FA1$K4bNR)g^E(fI2$`n_m}jpvf5=8J|=IpKs8I5XoxQ z%)AGA z5Am4K8I$lecF3KI!xI*rkSwajr=~z;`bSRmfra!}O-Yd-W0W9sEd?lERS$fW;jWgF znv$9v_rs0xGHKs|I-nf#@>Ph#=(S35FM+jXlhuhhD_QVZtJvm+WChwjTJw$ih zLxV=E`) zI~=uIDn8^fs#z&|wG;?nUX7)2gv@FvixhbA0ogj@? zbp9ab@da@Y%xD6brxd`0{4zvX=3$;Pgv=n-<5IuDD`Zr%D?BCv)so87Il(07#x=*c4Eg# zOcTBL-izo(h%Q9$O@J}DJBd@Ba?`Gz#LjhMC$=S!kOV>q)F?vq4l3vDy=Ufo*X$$g z-0#o5i2>W+^Zbvr&djV?v*ulEW_I6uWg{9TzU>?t6JNhkla{y?1{Lk_l36>BH_^}v zFQsv)bnyO|wUUoSx8?^&$oi-6x6Hg3|a1^m%gw7c0BuL!nn z)2by_ccc1N0-oLVX`dSc-2A}N`m%F zrVi`z@~6)qi34mLxZ<#p*QpbazX+dtPKi#0SXllIdbYyERUVK!v#bnPtPiK33LyGh z>|Q^B|1z-}3UTrJM{oq*szA8Q*$8Mkou#v%vsV!QaybHiZd3IW5uEea_)f{|2s@g` zeuuZ-58~R)Z}6Leqs1EJUP2(yw^)0G@0`M(hxBUp3-pnTkDb#6=PdM*j$Yn`^f9)A z{gmM|c#xZbaGO6yyB}enTZ*Hga_A|;6|dXiP;B z2@;T?)N3iB)z`g8pZgtCH1f$EZ@)($CZ_K$)904OJNWD}K1giQ=akDWOhXiG;b;tsb%j%7PG{soxAL8xZOb{&%va2Z%c zn(a^{?zm{Eqf*+;5hxRnQm+A(U66!gpRhk1e*eOZ#v#n;s$*4`FJHL=!oPDFajU~* z-^~jIk{4H~9K38@Az>6ulE30!=3v{XmY1nfFopTXk8x0tPujX_8lJNE=xy zkTtJX|9QXz4K=znztS5HavZ^@j;j?$1u29qyUf*))F36K@H~D^)sCY94U_=auf_;$ z(nZ5V<7i&KUa_s=gN-m6zvM{R3Wb2o;J_O6Tq%GA&i%v^PT19uc=m8L2zO1gNm@0b ziAJs2WjAatDaMF7SB$H7GDbYWFr#s-?vf)_VTXECpRkZoo^OHCn_{#UXvsK8*_B%a zPt?vK=ZX#$)X0-^koQ{AJqq|pUIx6I$m+mSgT83! z$XhhJmB^ECfR)e!SB-L}ni6-Epn2o$&!5)+jd-7NGyit=3iV5KMPLBPRn!RqsJ>)S zPc(d9--N?Oi3DhZq56`7r`$%EJghXHSYG7I%EL>V-fMu+nBl)Wf93W?d8zy&yHtGf z#zhBd4az~JL8S7cd8zu39Rl}1GH9PS&tCcSMRDm4dX?zy7U;@F<3{QFgwSUX{Midy zKY%9pu4Z|u>Y{P!;>Al2%yCf_x@g?~Z4Z3Y;sFKv?EUkKE96cA;^^}Zb${v7Ic4P? zFxjPQpt}L0YW@7?W}i>cPx8(6uoGOQTsecmKjaj4=_aTWe4&tDyQsr!LYZM-G_PFz zaJ2P60(~M%Y_B)VFJHePFS-{PNM7VfL!hc~dJ}0S_~L>@?%D{;<7efUKfEB%1I~HCJYRF+#)WF6=P#I-E+3s1_kbg7cK>nte zSE??UH%@;4Deb|=!i3#D-#B@t2pwJm-MFA#yg(yx=R)xXqx$IF#`hGw(n9dcZAY&< z=jAz~%jeB=7cQJXCy?hL`@A@3od@Uqx!dQp3+KgocHz$XkdpSD1NZznRG62p{N}q4 zEF`5*3$$I8dlg6+h)~`>&wz|6l=3`3N93YTqK;%dp27!=!7x_{{&QlBpcbeI}jy=cYdAt?}eVE z=!C0tuLhx`5;|y9uZHzqJAdPRtse=FxS(%tp#N_nC)=&cxl&Pa?py`TsyN3h+;g&m zpJNpc(wcKVsySDI5(8IOz(5F+gscdj^L}**FmMI9CdpUWkPazn^Wv5FM*2Q`Bud1@ zY`gN%K~RV3_5zM0b&y=!S_&o8lhLiKZTPl5EVYv;@mk`SxU&Ml{{x$yuALQ zJGi`dzr$QA8$!y5LV1=vNBFCey5M6LS6oJ3I|oR2-3kUjXTUhL5%4J4jS;zU_RwJK zK7_e!n|A05^+lZ%1(BzL7U5y645wEK!#UvOKmdef2sz9N*VA;d;Y>e(UM=4H6dr23 zKVdEdy1&h`16R&gRJdm=E3~snLlM>G%QyFHF99B z)5G|^uJ~E4;_R)vJp;Hm%<~?+CXs)@LZ6CyiG7GksgJavi$3YU_ee zI%K(Z_WX&oSlleS`ndAAHK2Lt8-Cb*~#o-rv28%0LCXRrY{qk}6T4z{0hravO&T=7chd>fF;*%RSsMD(v6$ zxr-z5`LFvLs`Js8uAMq{`m}QjJ%Zd*3?xqnPjRHyY1Ewpo1Zc%d%8NDa)?NX@-T^0 z+UZk572t6QhE7GCMsn)Z&0lv{p)~*JK%I}gaIFR^bD-h!savG1;*?RovXN?f&rvwP zvj6H0Xubs^j5c~Y3$jn$ICWcKLc|Mk#Gb}D$1mGP5+e6sB1Dd!~mFO#RlNm=HiQh@kL zqwM6#Qz2BjRE;WmvQquBQ^qM&T|Mc;@MQFh!aGd&Il!jTX4~nqn+hUzE6aiknJl{l z-WBAvlVyZOoV;+-I#;l--2)G~*=*UNGFU9jZU8|cs2b#;d*jmk!|UD8;G4b%^A41p zEGrF`$x;|!%0YTrX{lZ2mWncl)K^-Da+xZLyHX-7t(BHlt7dpkrPM`(Dv(=do;>rz zc6cxA^N-6}f8K%8Q-s(CkXsxv_#}YeKPM zYCd6L49apCz{-Ro%c~Wbe8i#&>8dnTYN{%?RHDW~ja#afA;J6;P(kueDVmq1#_3-` zl+8$(S6o(7Qd(M40*oc1)Sx^sGm5>=SxE>WY!De%1H@WsxF|}DQUE8ovc#lpiBn2; zk&R?GBo%V96b>mtLWUcs&uw|=a|p9(Cd@fdtl(7w4lnT+6U36@Vplm@7HcKN4nU$T ziv1?DyL*ciC$VZFE-n@&=E;)35A@%2)J3aH%^=+Hwfh$>Yw`KaGe9P6c#|!f!O(!i2S7Lt{cO{4Q0>uyyScwA&_NQTxmqKAE{Df9?LKH=j|H4j$->}-k5E&{Z z@;Yh>sEfRI0wQL~vA25QouJPvvZ(3rw4ZD-2<4SeS>OPnrQjbY&>na)k4gkPR14WS zowuyn7aBj*dUE5j(!U&Mg*T7iIDYfEdE(RueIow#(4RiN-O{6_Cr(^Hjv)aF(6Qs} zgne8)as2ji{lxL(4vGTg95>5ycD2P@9*8UYZ-(-`!>rZ|sh?`-cfx(?$4?v=CvKo* zgIshG`p2FLl2CoS$IZfve;E>W8ee>Ppy4|Kv{lN{(!xT(DdeEa1!eau-4Ufyf1?NuTtwQ6}pT^=9Re1GtjLC_wW3@`jFR_7FfI=Y3Uj-}JT^Px^N+eoHYMj5ivo7cDX@+e6do@s!pX@= zy5=a()-Nx~Igpi|{a^q2_FHeglYvX^x+8D^bu=$8^P>+x5byclefvM({@qV@ZW3FfW{;gXVcgWT z*D{Y67KDx&WG6P?c46c+@KwJkW7`-dO@ zcthIKq~Sw{_WZ^Z{}`OJ;p5*wcH$TY2kTxDvC8CmwCvs%hf}b@7=JGe954 zwF6dkt5qMB92EubQTQ1okavz^WgT@<)(XI)Dxp}wg&Z&N9W6LolCkz773}bfi`nVx z`pX~g*|KcTgn^x(eY8bGyzS>V@TFpWr0V~Q*%{Mj$@?Wom7Uliz?h&ih>U}cmC8bL z0M^b?t04c}d);HnxGznRPJiUr2e*H;S%5y}gEu27tmQw6(HYr#=b;k?7$mNYp^=1z zHELklQ8lDA!a|KUgPefz=CQ&Tni*vA7aO3{ABT^a|4RWn{cV3)QUEI$<|$b~lhnYp zM3I4QQMLeE3lqObVWk>pS)d(-bb#uPmi>BgB*lr;KWns3Of-S-eEpBnIw|Z5LQ=;k zzH{=Zn=g*mlymZ}qxlzKe#HFp$LMS||L>*B7Q)T*Lr1lI zWnvJj_)2hdL&;QVfi&jWWIJJKZI=c5iS2n@QBEFj?^46jvh%$AiUa_ zJw7L5oeaaV3=FsdTR76NUC5DHoXiqOc)mPh799HJcks2>FMmi*Q)`-h{8%LnlAxe6 zBO?Due*O_fSS1)I3F1d|u*p)RCZ9dre&~^e>rlb@bHbpp~J?p0~`Jyh^>jQxv+UB95|~KpxKciK`;AR zw-}1)_(cZKtis1->#RA=^G+PD1UhlpK5XV)e7VUN6dKbozWRJI&o&R`96FT4bIrWm z+`Pj)FL+qwVe;kK_;vHdVVURTS%>rAn`G$Zz%Nx$%)r2(AI{7?a3J%5ILNcC?5wQp zLx%*60q|UrCv$n8mYe4yBSAJSF%Fk(eCW#)6f;6gc|SWNBQrB2gJ;SNkttw_%wpN% zkj!Q|ZZ3_3%yshg+&qQ8aC*$KFHLkzqwdQE2i#0k;SXi<3QSOK$d_BzMR~g zoZP%zEhjga$6$q9fB6i{r3DU<6o(3lgx#%mnLWo)M#F7|pYT zxRjvgmsIl$gOcm!8Yd1;Y49ZrqUnns`nx0lU{J^#CYU8NwG3q)mdyc~6?qWL23vqb z7%HB_a%oGD|GOu?H1Rdfh8zBpgVjM}A^={3C~st7(FE0Si3}|>Tq6${7$nR-{ZMwU z%(ZfIkNtI7-J{rW`QpEz;G2)Wb4Y}pFEVZ`{8FuUndwt2Co|Ixb9Kx(agb&CvoIcI zKYiv)5unp=bonTkwo!ss1iVgbgrmeTi@b56@sM6^CePF%%V~rTV9m$_*1@cTtzWK4 zp8ohLA08r;oD72&Ij#GDVvn+nW*u#xX?(2Ak2CUq-1CbH_h~$m{?S33WWqvN3nIU$u%KQ3oN<7rjjh%zVWcTz(Gt#tXT2E%FMF$+CX)jR z+OZT&{5<1_j?bsQ!@Dvy!C9sYq=c3TTTYrM4um}4f?;MJ{Al~5UxH|({yIx(CzheG zax6hLx7`dHd;F8{Z2+eYs8G{c*<)tpW)Js&k+DhrU*Apps#@G?YLjg+Gcz`_f`b6EE9C+%C5J9&6J z0kke1VUk}lHL~=Kwf@gNW~ya<;|B$q{}#{!?T4Knd_dKR@xMLndXr9M)?gFhZMJB{ zyb1&%DegH05}n|<1hW*u73T0h|6tpQ)x_l~G7HhGM; z+QNgyGi|I{f<-%ib*zZIk&%_%_j8Hu>Z>>Hy&Scn3)LRE0#ASjP5IDUowQX^$L4e# zVrFLj{U=|gAe#6Dqw#=3zy==L@waT6IdD^S7>fcFo@Oq2Ol>(_Z+o4Yk@tr&bqE!G zL!UlePoG^!Hk{mhtXQ-2hX6!pCsk_vXc5|=NDr3+DQU+{um#QhjN^a$mgzwX2a8Zq zv?w~peGeu(y6_fd?&D12WH!ZsSZZMBqWLmr+kp7}mn zO&`A4?jGXl8e@KQm>ftue%hse;$Qeyor2S%_0Db8Wgi-UBk#QtvG*Ey*NlAr&_VJW zZN4y%sxi8BgyGG5fWZMJYUq$no#$o0*-pEc=)9KR>bJ);l#$`yXiiZ#;U3i`7R+?7 zPuijxxqn(1Mc>l9m+-xTh_1i)PEKe6lZCZ&nNp4;txq=Ug>O7*-cw*-U&4%c^04`! zYjmXCBQnxEW>Q+%8#EK#j^W&TYW1?&OqR2kAq20VdK3D^5g%n@A5MnSFA`cW9(k92fQC*|Xl8q}o2E4e=io;_dPKWt5W0$2Y%Mv(@2-=7 z9fX;2_zzQ}?mb*`lg))8ZwncMmEN3EH%Z9jG~a2o$#{%&X8s#r!AIvP`tZLUP}%(M z%lWkBvz1S2C`m0>yC08NyRD$Hz&<(az=puR1YVAu@oo;elc)wA-90O(e%1cKvn)K) zxWJeHM%R0Y&>Yxv1e*=1`Xb|M4`$%Tf9Qzn^phLnK1&p5Q*ZOr;}{jsRch8^f~v!p z+A9!h`|qf&C2bmLb3Caw#By!OJ*)>6Q}cg`_#DyYS4U|xcX#hao}&dqn_)T~jqz3u z4H!Av^Kp0^c`$3^!(P7>=rl-+PAy6=6qkx*`%fZ7$1iv%kGiD+^A1j^Pg;rU!VtRh zmZ-PIpcxyaOUF3{69ct|e#ThRR;yoR9;Bl(H@xMe?HrAycPWyNj)J(9n)Tt2p7`uh zrk}~oBXys2L9>x21)a}ahHsDjaa0tkzc2BpeUZcdPRqdClG8yfIg=JT?Veqv-k{QK z#Y{Cb@_*h=zlS*0R;!gC;jTqk9rYw@FQL~S{di|?-ndbgJ}cFZQI~P((DVNE?fVh*J2KGk7nnh0f!YSBBUu!I1KthaoQ0L) zqLXRlzPmKRi{I@-fT60?Et;aAJb53& zhZ~K4lzou8pt(tx_`Dk!;lo#N-O@JKJaBkJK)d&l;y&$L?;e4jwRa_H*AYHkBNQ~r zXwONPe7u#6J!j4@2ZjTMYx=#$ACDgRXY8VJ6cQe4@5Yi%M+(IA`i!RRT?seCELhz* zj38146u-An->NP5P`_GD2#ot>HbVD0lgflm?5-ZKY7 z?fQ4&6S`@AXpk2wy$Q~VD2#7Re0;qoP1`=*ZS1_wzsf&ea5$%MEFuHoy&GI{rmN04 ze5;LY`)|Zbk4VbLU3ImqtWw(_4;D?4@FM|gZPs4(E?A7fArw!&zSXcr%ddCqJ1{A2 zRr5!pz`|xpQ zb{-z;#)|^h+X4>Lw|niJ_T;~YZ04@Xz%VV1&)og*9mP4 z=sp#;2g(o|$1*?+E}b{glM^t^YlhVm#MplDT;tCg@?CGew=f8`bVTf3nxg}6ZyT)+ z1iS+`2OjgTfl`@-Y3oHCb;y;GdE|G)qwjN^cuODf^CNVhSe*@fw^Y3Av(z_%BpiO) zrjwsOxs?$~tT55=Gt5yE4xg509DnmG40t08dmSb_UH>S7uosGBTl_p|Cfc{$t9iHdM7N{RC^av>DqL7500evu_N53 zq?;1n+ONG7NCQKAcRaU|k^T3@4cbZm%9SB_qsJ$>3K|2-NwbbreaM{w;9UT987Y2B3 zGInc!eYPrpP2_}v4mk12YGa==Iy4!_sLkMn!@4JZ*d@m$HcWi z4LFal=NndJG~#y0sL1s`3$Hg4K)PmIr3VyLg6jadH`cc9R~`eGoafC6K!+i!0(`B6 z={>V>F79osYL6xqmf8y&UX}MamiK50r0Ez@UGqft0LMf5p@T+N_MUGNP8|W#-54It z@Ct1VqR0cP7mrcXY7c&FfUYF8G+jR(;GRxh$mcMEW_l@$iJ5dL{Ny}&(S|>3cX_mh z@*Xdtr9{h_F2B+}GVkEo$e_E+crq1_3LgYSmL1CS<00sSIe9Y^&a=~asWCE!Ldql1 zcsP7_9pziU539|@Zx2my zJ%4&|X~Rq8;^|p>>^w`*I{{e+z2V?yMN)!C(Q~tVXy@4}2EW$AuiGPc{#9-QK&VPhctUfyVOia(ESgll58=^?eGY9qT7SX++>Pii2nwSw+cIJDGCnKrk?+iZSv6dazv0O>um z9A1628t<|WXa^6lgCa|2Ygw2OT6WfLKvr*+9R6U-Lxk5rAo4g~hk;}qtHa~8I&lIa z(Pb=y(@i)%5;5K*XkODiF%1DgDpqNA*x_`e1mF>y6er>?wi%kPmEtoMsl{;SCn#&w zc9!;D-khe%K$}w99K(VG@}Qq40L=m;`%pGswb1Zh0umkXzpz7YHao<#V-KN#_Z289 zcxPO_a|j>m$5g2kA5XAj;t|fBLb}Hzgeoyuyjw>iX1#^j(5355bH> zz+Y>FJYbJ0$z?>fUyWG3mVh^u(1VA&|1xl%2DDwO$;ZIBX5;&Eg*`ZLjb|_nw z?ChAke$LK0_TwfMte6=H&|X)>yLC+jrj3ukQ&+~bx*R0pCGyfs6L{UocnkqHGci$- zk%D$HK8xm!=^D~xX6>xUa>cIA(AH#Th3_YMXob3cfY+bggF2>y0|(NZLj*enbau9z z%?~;BDg=-dw=&zv|NF|g3Wk?H^*~&`dTxSQHzA>J-B1GXB^Y&)y@RZsAW)G^e^oPc@}4R504IEReF-;a-}U?*6djtJiM>m}5ySGOL(CDaoM zq8>}&^(5eF^%7iUSUs-bi+VtelA9pwX$fG00Vzn=)!}D}nQhR7cjAoLI??z*j1~RN ze-ve9+3*>?ZN&kJfDknIkV~gh;92x$%pp|Jxs?Nwz%7uP^xhnD+Myi3l2Ik9i|{Nd z``$PF6^QR;VY5-UUj5tkSbYvU4^+Uf^1Plvs?|rL*Gou{^(87;y-`X15>PScF4$AI205|c}9fC58Ay^3jqlYuLRkO7Zq-!97|Ia!{-@8Zp5Z3=g4n| zmLm#tK=Vb{ZP>VRg9f37tihdzMuUb8)jLJkP!u2+fPxKWL!qD%JlRmM7j2w@ZxhBI zDu6b6BMC2BQLDq@X9W1~^y z#z+L%RAfkXu!2anMvZwRU*kq3(MUEHO`;pCY~#jFn#TL_!8A)_iEkdt6FFpU5Z!s8 zA_$DKSD|xJQ3g7LZpl*tzl*VWT4OLJgbXm6R5mf1HmieKW*BVr5poTY$kl;HD3{T2 zqECU*BTS!+D!s)?IH-v?%6K)E#*+-e$fXks;O z0?18869zJ<0Px|W->YlV#BIu&h^9fvP^CuVvMKO`06h+K(6HhbmWA*hCcPLd)%%$6 z4)S-9Kl`b-WF_7@_1>5@^0U7GtuqKH9)lCjsD#E%n>BCNtZB1mZd0vUlTcF=P?|O4 zUfPs5lT9tu;!iYl(67@}N1S)JsYC^caKs{@yKRWrRwH1%Q( z`PFd_%c{`B&HuZ%TmwDjR;vzAd^oJ`8J3CdPDD)IhRs9^ySZ$E{#xkGTeNUKl@iYd z+0C^U&7Brn^AUomQ>Zqe! zb)Hf5m+x3-aG@tc(|s`sjheM;)v}}oYk93jRSUCa^Li2bS*)#ygqJI7@Qte=zUOql zz@RT3T`ss$aI?TTUigcLPb2bsq~VK-Z`7=LtJbYsiI%|LvPFv;q*}`sRV}qvEjaQv zh_?*kSGF`-x2hMogC_@WGAp6;8@cbl?|vZO7azDt&G$d};Qjac2Rc%YvhhBO?gy4) ze^3P}`9A(2FOjo95XkvI@M@7YKK#qB=BL@;m`}4JViOv-5Um=uX$`yRAMjeWZ0Y4& zwr<^$w_+_Tf!Jt`YTnYMN)!XFTDNK4rbS(!UTHGp7F5;iIC<{OnS7QzQ-atmG1Hhe za~2XgODdK?%4Su8Dm|Vm$ysb>2xWVwIeU8l1bpf5FZgmwbbNy*E!v3IdaE{Vcx$JX zY;Cq`4Qw^7SZj`w+Y0_^jjTW+imKYQY1OQLl%d_hy;0MMj*al0^BX>#r`R|c3i-KD z`Xz|@szBUts}gaUkNK)mazP9;^F11Ae_XxB7^^n?A<;&M?#kAz&BfNDjeIDg%|mTk zHgDE2K0-Uqey`oou4$*(pYhou!}LYgZO{}xYt!bTwr#1U0Ux#IZP-IKZDeZ)jm@?X zJ=C^cOuM!ZwQ1F=MdNyL0n60(;G%yv`vb!#o^U6kexoKW#X|;Ev=ePvJKk2cYTNc9 z4wY^@+15g9=#OaAqG_Xgb)qAD#!jW+_bgWPMZj?l8#igz0uE^_+TCo++XdRTY1I-7 zy-|HDAr9i&Rwe!)*l1XRsJQrq22ESgxRaAZtz^r{RxO$|YLE~Y6J@dWO7xdZoh143 zT_%4d&PH$;kK<-ur%pWnB78U~#zhS}X$s4~L2nb7+z=p~X_-c4xMF=cWg2VDzRJGM zy0h1@G=9N;z&5itan$<}jxPR+`~jBE_OrLx7M9AMXMcpuUvRMbH*9!w*ss_=)c%S6 z5SySMq3!D!vG*YHH?+*fPUHwQy@&O>hW!WI%YF^r*^p01`yME3k1b+Tq4y)4 zGyVd#KfxBXg!N~A*~i#H<1iWhUqEg%yMspx^VzFFb%OmKmr9G_kDs9L581om6`&s+ z2e9|i7wzV-<-od)eV?sk z8`(;vFR?e!&kM-Cf#1Er{(GQ#k-d%byFi!2R<2jWQNudPHM?x|$ikWlXnOv~Kug>o;inl_wtmdi$PN zyBUe!`PyRsG9O;g{EcEPrBr zf6vP0byluOnJ{F;ppH*I)~rE7Y@|}8I;@#4PS>G8XE@7%m`)5bMvsY_C(4ru>)L;pUd<82n}tM~ACdkq?$ zG;jIZ?fdrcbM{;N_CNppzI|dp+vn~V``CVtyxgbl-^cdx{c$hs-~R&s($_7UH)Bw{ zNYn8-CblPydk!AZzds)!`a2+Z0P8OX==}#EUyVEm*@|cMhuDwO3zyVc+w6#U8oa*%Nw>?GewJd!Bo4&vSf_@!Xz0 zyTzX1o~Ye>_B^+5{|i6d*`uE2M%q#SK-3eve)!sJuLfUpUlp$zuOcg6W3Rfe39wLn z^;PFJ`Kt74Lde>v4ZbFkbKlj}3-R>T3_a3oZ0&dM726SvUN8Sa=JuXVYJ=X5mwkFmw+yIMkV(}rj zW@}#9vwKevGGe!}XE!xxdmM-dskmoPC5j;wZKT27q=!QBx)SCd!{q8F+FR-_3SG<1X{H zEuHF^3Td2K$Evq_KL__xSmF%Q>${0lwfi<&+}SO51wq#CJRm$4H?Kn3}|?slR(8D?Q!?Gj;0>XgK^ zbg+~u>GrM&v;jiUPQJ^atgD11B+Px=yW_q-c0LVsGxp(bV;1gw{k8q++js6zixyC6 z)zQ+n$X1w{UX4|bH7jVL6NmnH?$l_3+dKW~J9oUeb9mDT9;3%bTaM3Q32A#px9ZfEmmP5FwQZ-Q zEqnLv*|}rK_U$`%i0y0#-!6A(+jj(!*xSVp3v5(5+l?K_+2Ar1B*@yfZ|8(IhNEfB zbS*!tyJGK7i1Hm0TEuo6X#};|9#$>E)R7nH!bPP7IXj{}{YnN^QdN0kthW0dkOdCF z0LN4fTqqGcn3A?pxogknp0O@=nUO}!L%kMkPT%v~?w#&7^aA1_ZQJ(HHbDvB#({nN z_HEm?JKL=7Dkqejz0Kb4+qQM@_HnJT!z8OL7N7duj%_e_8ytf6s^NBI7?{3oq{J(U z?f!5H>PeD$y@_o#N;iXU0UTcHf)@f+DN%D*`r@x**PX|rjp#=Q&R_fd%X_zP-LmzA zZMU~sTla1q-7*X(3UKzIOZwklvyH(Pw$(xEptBpuS0nF&MA$G0h;8QfZCgp)KqE+N z1URG`k$aR+NPb89+F=bG9DiYjeWlxsov-iPzIpSOEupQ(maSX2@U3i16-a<6e|4)s zs%_okZnd}gwr<(8YVuAuzZE!#MH(6?+u zilKs(>do2eNBeE)x3(4<*fwLEYRtB|XdJV3+ZIB$1)hSiyH#vs_%(NJpZBES!7-#? z^Cvu=wC%Yaw>Ps*HYjhiws}+KW^2=~&0|{|wIf_-K74(3Gfdmew>X=Dcr$RIT)o-Y z0tavuE5j_l*;P3SLAC|eo6(9|S|sTeNP^UGV(!{Bx{*y-qT7vJgBiS~a+BP6a}(Pr zK(|0H$~K5^qMTG5YvYbBGaj)#fF_F_vu10}Cb3y;lAHM^wz&praFexp(`NkN2s7_& z3Zcs01Pe(j!mA|_vDpDj+k`f9vk#o~r5yq`JH{flCVi5(>`C9WVZ+8Mbj~&j1%vty>m8;j8sx%)r#G=z(o^K|wSiQv@{0uvyili&V0W zgw(U!vst1C1}}Iu6=nXIKTDR`z2Db6$26O#} z4eK|SZ-Dx-_09%s{pKx8zwrsS{>wLS3Zemr;O!0OMi{)Y5_xxnu@PAp zRqh6{u~y{P28qfls@$;AK?PKA3~exWEqm4q;RGn4MKo%^c<=UgYwh*=y7lY%IXT$c5t5&bI*PyR80)*xuZOvM-Ca`wRTKunBvo;8p0}^Wt;)T{&ij9nK z?V1f6=GQvH4-8AzqlM#Xu&D9cHPvekl6RrrrtI1^L8u~i?%F_YA3(s?RIP<(>XWUh zL6KMjbYrcxdgG3nZM7gP#W$6k^<2DT)9RJ0SFLtdxvS+WzM8EPtMyf@SMyaqaPg0F zz{}uQtdby(S_x?xmSo@=kc6mQ#k{6#H!OSF?=1@0(r?kaHLF%RtF=`SwIB)2)vHw- z>ei<0>QzBhk_xxBNAL(y6^K%{ss_IoR$HsqY*;-oz6NK+e$Cf<)VeKcE5#~zB~T%a zSh;Ey{jXew0t3@sX|LidVc1Hj29HvSa!B!UbDk4;{c>OztXCO8bKOm&tAmZd^RD%5f1 z3e+eWnW`-V1EZuwDV3=@`U7v7q&}1qoBS$Ksigvs1zpfa{g6|k7f{UQTjoE7x5jW~ zJihbX<*BEZ0_)Oc)wmQD0-av!;9V%qYhOJNL1EOn6bWgIO7 zOP4KMs)&dA?lP0gC;>U7B9@Xsn58XSD#4S`Vh|t7luBP%je|xU0@Ro7s=MJ>~jBZ4rc_z**=^QM^TBAzQ@3 zbX6x-%0kGYno)&f!hGst5n(`c9ragH?E;Bh2>GQe6Jzh-N~>Rs?>KAG;*vQ^W$mT@XTEruY^lFI~~Ek?sU)2YxIp1|}j09m*7p1A4dvFj@+- zY+*H-xo}|+StwKe+em={Y>0AH5D9pV1YG5frHdy$W)VPN%y*}!EL<@EcCwuBCbRjK z$$Y*@Hs&YKpYNdPf-RH9e2(-w$|BiD&Q7-GFJ9ief$q&vpYDHn%;E*fVu4JCb;%1L z4ZCDATOhzNlNT&VMkP-+k*0uWEl5cQlS9BsHWnnOqy&>Os*r{I@Jp@G>jE7@ly^YP zE2nU9v;|NvlKm;kbJJ40Hqh>{i_EgVowPV5IRv=p=CgT7=SjfT=Fb!JjpX_B=DA*p z&u7U&2=V#GJQxW}lTi_x?@OM)Xjz{|h7-Z?@J_(=HyyfY0V=O4`(<(sX_*gKu;j~N zX_V#3&U~qSqjaJw1hPS5zDd%kH|M3!do*yHU1Db7kx5Gzxbw`p^XAQ+YtNH&FMt43 z<(+v9DVyt}d~;qke#Ja%Zpz|8E&NU_3%Ixw;jhy#C7I8=jW!ImBvGUC?mP!6kqy%3 z&J%Mv74b_#ilNOzj+*hg4E43-0~Ejk*Ib<3w}Ez>U1kx!heszbm@{|ooH+x)%?(0I zn=_Xqu|W=4&KwifbCHsAG4~cyIVT9+q>?y6NL7OP95Zcly9kBNY%yrT{MqgtHai4D zEmApKfV4R(L2t92ImYZcvuC5H+30vSdPNJxVyY>hBOq(ePagf44_9I=+(PqN{+>eMHaed~^4$U&C!yC}dDLZSni>#wsu-R3} zyU171s>CnBU=WpP<)4k4oXOL^8@S1?;Rbbd`xz-S_)IpVW~M%4=1hUSiFC${&`gWc znKP=Fdx}z)2CNY6DZ2*!D(^^o5rVGkefaoOpe=NVwy!V(@;-!+B9kj z(xy)ffhR!%qB>-pX+Fr!T<{&=4R#&(ep?K~w3#N8+-WQcjTGHM`8G(K2DVpaPxB{D zOG=ssvZo2KMG~Jz?I43pk{=Z_XOF_<$3%fK5t#fvXHBC9e43L4M;M5!SCA+Uo<1}SrreAAMq&lvMC-o?Dmthya%&YqIQr^+Nb70{<@ zNmB)~P7<5SlZ>fJQ>NTTQA?WQqS8#7IyGskouo}gK}W$sYE4NZwt&2qglftH!c;$H zr%(81BtmjU_nI{gx~G6`Oqn`mico#YDJ~V0l7ds&l**|RYzZhjIwe5bR4_eB{}k}1 zs)jXF11d))j&{yebIPpg-%YrVJ8yxAr>4$KnmlFlWIjbsW>duEh$)k&;GcfP6b807 z8C;Gm6>Uh_Q}|>TshDDtRJhJk%^*r*Vv0pNsHF_+HK!y^dL|kpwe~f4m$|-C`{_ws zbqGL8NJ6biZKedlzXTl|eDq#9Stvn`5IK`;CI^%hNshUYM>cEgh= zO{|{8CW=YM#7UDTa%8JOw?ILVJxQX9s@cTbck=={jfCYyImtJ1(&VWg)*o<3nk~LM zb+XbUCh1Tq(3VmTQIoouWKU$1Lf}$ki9Da^AQh8hCr+A(fA0sWoTN=eb9Cg8hKUYk zYn#bQmXd^koMcR!)HVJZyTzi+x;*$t~%minGLF^ic2}N?EIb&GcXze;+T9FSApEYj080U^>NfL#XVUnw9xiL# zSabn76Y1FT?pS~f69FR)a;!dn+*oIvHFn%swBlpgI6hXwTF6mGj=alW+HWo#xSd==dimD}ujR|@p?%1fYq|l==A*G0+m6_DFfuUVP z@23CZf#b$GW7uc`a>qyz8yy-WMxRDLIEIZ1q0AM@(GsaM=Jpuh=rN;5&F&t5n+2Yk zFcx|ISB-{dNb=G8n9+Vud@-7hqJkW) zjZ&ES7=7}Sc(oj!ihFj-*pVZzjAA20prfFQQP)T5Gr9tZ{;lz&LnF0OBgLqQk)uY@ z|Hx4z?NJg8rihOcBRTR8coL*!IkIA8gpyY+h@qpktz_gVDw|3hM?OG;qeu2_tzBW2 zxN`K^;PInIjNl{LsGB3%h!E&JLTDyN=p#qq zH-KOKj~FqMk1#0jjsWJ`EE=mK$vP@W9G}+!E#ycYO@bo?n!zkmsFXM)GkWwl>i}#O zE`K-ZI&t`j;loFW;cSFET#T@X%Mse}5g{Z&ux=y0Gn|j$$lD-3+&^OY2x@?=^kgfC z>q&`qZZqS_kt2px50}FrJj@wx3>!Xdm_X4PE{3^aiQ!yTQ@(O|HGZK&alKk<6c{#q z_^=T}TNnzSKjM*r6NU~OI+PESLnTOuN_VI=Z0Iojhla}GCTfQbhWf%B5!U4!Iz;s((5@OhlHx-H!@wr~ z&>(m|PXw*e&CnrA3Dqeu=Fs7TJH=mO)i_LQ*m3v>7xi)oY#G9a+Mr70%^{@DMaf0U z0abx&?$+Evo7+S9P<>J-OlhNakD-InZ1D9V?qD&54ThS*Xsq&7=AaqUaHSmJ_Se<3 zQL?`=qDynj#l0+LMIyCj1MZ-!Aks=u5P1hAKpbTvl5zX1N2L^3(t}iZyow&HqDQQ3 zaG`qWcM^>Pcp_NF*+v?*j3DCJ8~Dqg2@sP5Sk}gC^9BtCaN* z_M;wL;35w2sT_lxG3YTvzlbl%nMSkDg9eDctdB>sPYv>weIeYZ8ab!0+b7sp_R;zx z5q+$_efsq6i@JcyP=TW*YD0Yu6#BS*jbR-do8fuxZ;{xqFR?k=vVL5tm3>7&-bX?y zLt`%$)Pa2$MGXm~%13Scc+Jra4V0kltMx%n^tDh25z5MbdfzTh&%>lZ%-8z#>(je; zpWbKylD(m>cL>D$xV?iYJK{Xr?L+Vz_;bA)PP`SQEHy?Qfab zH>}<5ZS;Wv?=7KFLNTSJ4Q+u54Yl5Vs=%qf%cUyb$A+Y>c&6%4^!AgYzWu)%c^*$U z`nAUG2lVRIvuCgu>wU2o>nT8?UV86dJ+FWRZcn$D?5XwYdA--IUb45@YhYq)TzXR5 z7OPqNUJ!IuGplE>o>1iW5+K9Nk}BEL2AQhT@lIrNcLdec~7fH&z?Pc z_HevRkDdZqPf{SQfu!ug@mmRjUcI|M5vh9AW53>`kJBBhy0acZq?O&Z9^E;LvWEaw zgK9uFNOl(xVc=cwZuUuhI7+KzM*NdKdfezPyIttcx}mb$+3q*GU+r%8?A@V><@M0? zJ3V{2-B@?Ko8G+}ex;%d;D~NU_ii3bpjeG6*-dm0BF{;AMr#U@|0{_-yEt8C7v7b15ui|4 zqf6H=U0hXkkW!WGqJtOeYN4uYS5@gifRn6Oq^8wfYbAq_?A7rh0va3pc$aRf6(pg= z>B_sXuCD6KR-Ldel_*Q(YtWHFvI0ffMRYM$LxSdZB?Mg6a5M&zZqK$cD)88{UypyX zYq!p*O$6RV*2PY=I(O-;7{Hilcae#*Ge-qatkXHMOP9nhiRxcv(3NTu(WNuET@ulb zMD0Wa)m_jP+PYn|L}bh!9h6CdxW^N_Qsd5$B8An7vWuCB4ig0$$}S9jx_A46Mp6vT z9J)lJ);Uoo3S>+IseoBt=We1!01{CPH+((rEUYtqEuKkCywKU#sdJ}JojZ5B*;#gy zAQxnJW+;nJTIX<4Qr78gt9sUncQ(6qcsN>3m&ZCMa)=U9vruP)v^kKh0tv7vkLDyH z6ie&W8F;~vomgiV(uckidH9-I)ckPvQ9!3J9b0?ohv59YU_w)Dsg~CQ`X6bn3>q=@i^T5(PAETRXZ0A zs4Lbn)X5;_PAA!cb*xbewT?&_y637Wpg<}zIzTjtDnEKawgY4$h)4h5Y*0?7)cHoo z&b)){SP69;(6M8OjvXAu(L1&$ekc9e)`4<-Njji4e7Yle z&pzw4m(N0*N_l(z+4jh3&$j1a`kp0$_U*;9F3MG4cMy%C>APAt8~YKna0Bz`%raW=_uC z)!*|}^%+p`ewNnv_x*D@)O2@sb=6yMy{X!@)D2wP%=_pl0$}o-O1R*v%JKM>gn1QwKH3l)I^SaZC_%1_L8Im z!^T$<(YzKaa1=b&XIYNPbOctX08&wo_-s~XgCx^N7O`rc;^7xxa!Kl9F+GCt`o(g3 z4A-oB?!VacnM+2Kq+Pz|>0!imUu;j$Ae_Q|=whZyUu<9EnlJ7I+HUwrX&>*5pB#l>NSPJ|>vY`Tr_k?$BbpUX3J+9T6L(=Eg%r+Y4$KBB-lCAhnO z{Y9UV)9q>2baPsAdUl#UJvWWda=JipO`ASlPRrq)tIRb^fIQPLYA?|>Dr}j0k(^>oog$}-Db`du#hz*-2=y#+ z&v=P=B(ZRtQ^{=H+fz&gUYX2P@$M;8r%uV@kvU}W6_cl@dZv7Kauq7%^)yVqXsY^7 zXUif5J`ht9Q@vBBPQia>W=}Py;NuM9nJ&Rc7R222dmAtPENuFudiP1}>*g`ahEJU; zCmT~H%PC^AHAPNFJ_tfRqh8KcC9$T6Nja6wMpApSiNGuBf_r}Mo;+pBPBA6}Sb@}Ha$<^i@|4N=&jM|{!Iv4t^F1=2nqw48Vs<)> zjRZcFHg)Q#$`h(4)uVyyN#4nmCgZ=HgfA!AljD=zjIeNdNZ})FxRtoi zF-H{SQ!x`J5?DWzu}r=YNQA#g?4N)fCr=qs{vN7XU^Gpbi0mhfHz$bka)LG9nqcB8 zaJAJ{-|J^UI$j{yc*plHKxQE=(4xN2syz6t)8{65n6;Ca`=aqRBtCE5_=yw7rzW@n zM{c4qVWK&ya2%H|wl!fTxvX_Jw2hyr!Li3POMNfKXLNQGl1>}}CLn&G2U)fjy@zw& zvEsIM{P^|bJmY~I5bAlUFo>i*Wzxi{jGK~}gSx{)*dHuHOAuNMk9_(j}_xA9b@4(H$hqYocYJK(K z%8HUwETJm!Vx%5REGfLvVxPafW$c7;BHTVb36s<;6mK(^cdx zC@e0oYHX@1@R^wKl@*PpBSwzE64;u`@{&SS*z587JU-rFAyom!^|{zr7GTPPx2$YXlFpaUtdd7?&RpU91s{7oP!^VyoJ=z-M z8a-x=H9Cjj!Sfj0*`vi6Ia-b>#1mffKX5bJ9An~Yj|N(BweVczB;W;~jV&0~P+eMt zNeEtSxrRave~~OS24RtbL<9QJpxDO+?kAtGd=U4GvV4`OpizJqz5*XoxbWcAc2Gf~ zAL}to8pn(sJvxmdyHwE$+*t@>bQaIPF{8(hX)3`!OrT$HZTn-R#OTPV$}!_6j%u!} zEFDzf##&#sqW6Q~VDT?zO5kM%3q}mLS0Y)V<^S{06k(+?W(}6NjRJy3*`re^D2=O$ ztA(KNB<>_)#i-OM@90tEN7i_c0WwIB_E958nIpxh#7Lw;Fh-8b;n5uF9yN00s0?l` zgzQL*Z=|}_QRc{6rWieTbZb*hDfglxN&FXe5<=Apn^l3M3$c05pRH7Z;dM#udr$?~ zMx~rG(<5y_{!QM?s^&K^bB>{0ee_qeuFgLU%x8rnyW7%@CO!X9pn7@i#=hMOZK zg2+e75x(I_pwhU9j~I@3SiY?y5I0P1^tx1)u;ThJs22$9&)3WJyRd7T zg%Lhq?bwlkN)ES1c!!S|Ida5EQ$ad10|>1Ve8`M&0Xj>iagQ86#Q!ea%HKR}`0)1B za2r9iM~1uG@tDA48o@QZy*=mL%i+EeBirjs3oxak$nF2DK#y(3;OZFEFlOZN;ebnw z030KX;UhA*O%l&(;4L>iHQX~|RAY&Y02}_6Y`YjH+jGN2dv=(&9jobw;n5yuw;RLS zEnK9&mBU6iY#&-N$YW&xO4X5mqW}XGUQb!m2o`9w zTvGuixpx5I>dY*BZNplzsf{c7DJod~(F$UBJa5Ku3x8cZ z3&Oq+tsc~_6>x~w3_=z$Xxdgb2;e{iv5l-Yqji{jm{TcFds|I`aTEumdn%d}t)k^L zYI?lYZZTVZEv=Aj#oqW|2V4ky2z6|k(KrGSYIxBE3R*tPwj7Ekv_O@G7oyEgY)ZUw zHI}*F0gUd_Mv2Wq+}t+AZ1$?%Lz*Ra4l!G7Y;J;Eqq#+5FA+=aCn8(C&CWg|HWFYD z51q(rE>zKNje`p@U-hpbBU}Zp6l9yfqIozVf3GFfl4T{idz4%xAC)zQGNNM$wc(h^VXG6mGPe1h&5c zzMJeuS5sr79O`bUEHEOU0`k%iK^_$q*fXZ092xJ5P%g00$& z64igJ$pT2S(c(@#gvo01G`0*WFy02>{;CGqXfyyeSL0CRAcy)IhvJUVqBcWiV|u6; zF^vt479PaVEMCaQ(xKQL3j2Ch!{jY5_8H;7N}Y;b9&8m;fDILk2B9xdTB_<-U5y>Y zP(kdW)aU{v7V5(K*g!C9MlhR1Q?Ak7)KKnyOEpHl9Ex3_5aI|C1WP^J4Y`4P?2gn> zUoYz_YHLu9s=?Uju@w6YVnaks82aR-_2CA>?l&I4-{<2VfYM(9``3r66%HCyTvAeA zQ8Bn$*0@k9S#LA|o!Eb<5w-K7c0|27)NYiGem*tV6uI9L1;USQrRvq5R#tw@KvhUOj3tE!(?5C`-bJ} zTzHgt%&INB?7I5;+S;0Gv;-OgRyH~f*yqvhf{E)gELhmRpP~xI163%*uDv0ce}3*p zbYajoNp3z=APZ#?_gMwSRk=|gz-eQzFss2;-%xK7)3qgTR>oVQH)G?5Y<0O> zH}_*RYfW^eu~Qm?dRtekXsWWJyrdYLB4bBfR0Ed0k#*T_;gSeFpQ18@oXT+TRGi@f zoAHB{iTiWDA`lvg&ClkkC@ujDVOL0S5Wr*u*!6x~8|tBF-z2M43<2QS_D%;Mw!N!` zG%<(dRE)*Pn(7+tELjd(8U*f8`MabeM*VpR`H0$D47Yh#e{h62CF!j6L2!>=ZXYi5X5;|BpL`mwlmwzFj~ zU?tYM4K8_{F)vi{Aw;%A5l+yk*90MNgGF?_)P+0|(*OdD; znB~>Q)t%u^e%0V}tf&bdJKE`?phn4tVm4{m|i z736TWL-Hj141(0)^Oke(@z#&MxIj;S>GPmhTZj!zy@N{1N(((li085@S%VEkYp^$G zjjZy3Bx)eR${{yF4!DM2f213E^qAPJIG(>xmjbWd>IhlCeER#ssX z*91!ECL|2U_I&j z)IfRNq%0*4l77SIheU8Nrmu*~B0@`Z0Ov6dVIw(D3AgB#g9lY|-(XTFh%*P4()`6{ z^(ZiTXDbK^B?%Rd3S9vMQxHChjPS!}0o%n#Ou7pQ5FsSi^gU;$3;@q<@7VMv5Gq^; zflm((zp=`FAVOs0;jY(ehkSC=$Ab&8fH(R`0%3H1Vp!2T@<6V@PpQ@5c~}WAfg_M< z1i($w6y5`(RCpm1u;(@O0NtC4HL$Bc_n^11;k@4RAE1XF?)jvUd4REdd{8*}1M9Q;N!;xDdY0|h5bqreY09QPKRcl}BEt~hB5O094 z&;z>gctKHUTg@Iol!lV*p*J_g9f0)ihv5dX?x8s6e*A1P5Fze0uPWfw0rpn@Sc$yU zhrI*5p7})0>UI}-P$S1kBP;_TvK`sZY)FTx386x)0@MoM>Ec1mjEHmezzjKOGN`V)b6LKq%z5;!8?f-w;WRD4Rc zYZ!K-@azK^JSfg~VcU8#0HM$ln39++o6xVwo_y4e?W0(Pj{hX+!l4C*m*k~)#*|8T zlPRb_oaW;#Kz0)@OQA-(`&6k!(EyCZ5QU0#c;j!$YwwT_?Gj?_UUu-vy;Wy+HCw`Lh}oPHQ0b^R%L)Q`tY8fhToFYLGfC3_e0!r&4=kOGsSff>ymR-cu(l;N*#I;bz|pNiDl*g& zJcgU*^M45imV5&WDqqzQc~DG%MLe0>mIQV@fXWBdxV%C^mhUoH8ZaD+fZ{dr@PtU5 z9;8|h7$HsZP!@2y@h&!1{_}_dqJbF0ql*3zL^KE)@({5jl=TDU8XOj;t4~~ki`f)t zk_(iabF1Z$KCFaaXd(2Dz!=P*LzRi{AP6T1xfe#Uwqs!PS-|SD(6_ODZXgI5yDfH0zn zRzeaE0}&YNc$mRj9b_EdMI2j9vz3NLz~yDLAMOnB6&GOC!UNjyU>wI{SB=cugC>w4 z=wLVuOva&NuxV$qWbVcK7Z!Y26*@>3VKzQS72)*Uhtgn1`~{_f>{Masb!sf07g&m8 zP}97c(PkKF)Zr(V>-E8?Ds*pCTDJ#CB%#x&Q=S}DhZRdhG`Ms*KBxs!SK6fyIzpi| z@u)$FWHvkVS7$aI#=Hj0cm;duY08zLV7AVA5~Av25l)jDJ~wwJG+`JiYSuo4yjCZz zQuLCRRG~=47No*8$%co;bHeQd-Uif-(v74}U8}TeAd-mFhAv&4k{|5OWgP|F0^ev!XDBJdPi)X+!k)zac@a#=VS^~XC)C(v zLbr*wJ&1owiXzrY2Ni>X)dG$TYJ8cl5>?~{Ws~xB-+@TfIMY(&gJla>`aHtUQ-rQ5 zYp7*6wTpA_%BWJcS4RsVR?k)~u8qbF4sK%g{dp-$<)?Z1F!u8`47aMU&ldv{bB;`6 z5%4rAw8ENTDH&){=A%(*DVG2njc3Lw>7comHI$$M zObQ4~gG1R0^nqyMNyH5FNGSy<4O9ccn&F=7ZWkOyx<#}i&RZ*_DG)u-fn9r;03 zuUXr4D1ha$ft(7k6v{Ib(7y!T3x%V4e#E}^NICsM_{!ic)R_xdTIX}NE;MzLAI(@O z(1q$eDKE{(7ob!?fj6PSrvMq3J(IcA&Y`_RoIp$nRC9fQ1hH{YORyr8iUYeKa_f*YD*%1eREKQbB^E!8E9>q(V z%=4lZ8icw^_da=cSqkRgo8o1P#0+vFdTGOfrBZlg6UIOv0`u}T$QEkvFsOnxO%2D$ z0phc@!L1cMPzBrZWljuxDdZ84Z=(!Q6Z2udP<6=H zF?Mth5IP8B2h1K*Xg^WzM4`^V;J?ftYa=5nd&il?resOFktv|{fsk5Os6MA^6z1)? zSlIx?cxT=}1YONMV_+?Up>+poof4DoQpy$3E4e|@68tcjDX}e&aN0_FmF4J{nAV^y z3RI+X2O^1XML4R}NK^zpe-fuQ{+x#9O)nnT;3E+j<;PTW-#K`S|L66!)| zx)G4MNmAY7p8#nzAtX_D4<;m+GELl_H2g{}8)E(>- zs!YZ8DY(U04n@B9A?h+bJW75q!a(0m`|a5XnhZz+`Y2J<5wYZ3g;ZtR8z*%c`354{ zv9kfWsLc)ZIZ&*w?ttwJhXG6NM~6?zLEufXJG0b;!8WuZ$MW7KjdqX;i#JZOP!}qu zkw}d~bActYfq_RP%Q;K zl1H^MogR>mj$e!~=y+jc0T&vue?bEH8f zo-nqxgXT2xKr&Vu*#RqwHql^dsi3>4=)C)EkBy1m7%ukc4n43`;LqUX3}&I=S9Fir z8@=ouJB1UH^SvJ8gZe|$3foHC-_)5(_!pxMuuh zj6B4MHF~g%q?RD8It3T4Xf0J(GF7rx^BQ}gUxg+@Dlj9UAN-B!(C93YSg5VY?Amvt z+yeSmIscGAi%x>Yq$$X3FF@d!F_6u=lM)pQLU^P|BM=lX&^1sZQ7{Fjs`J2X;Yqs4tr0X^tZHO>Mo#WmVe#~ddm*_CaGd%PlH=N+SL3_V0j6*B-G zRs(?WxV~MPiM{KZn)qtZeUqPrDip@cb zP4{6w4m1a5@FZNEU67;HLL?T#bly!%`0~9cz{p1$zPW+HaKuoi=jFOX(uN7&pB5E_ zQpp53zv-M~s}X_J98|*?Im>$#a7Wrg>#BEJEMcq!@SVkxZ;DO{g4R>ouE_J&c{4HJ zU(v=6sh`G<_DyNs#)gHzNKa<~*#HFyboy&z)_N5EGJv6lPQU8(71)K?LZTa63Ztik zL2fnGiG#PAohbp~_y?GPF)yT1brU8KDUQrI;Dw{U(A;R}$9G{9K`A?6(HufwP7@lf zN{nRzKWm8!*AXi1V!!lfCKO`Gp|5Tt?bB(;xjU=RYtns$x5l}K})QP5FJ<>eRQ zp^@{sJ4b3|(kRSt81^rP&e;1rR8Vg%2`ItYU%Dff5ZDtOEQDaI3ZesE6YO zjfAG72()HM5~C8sX^v82*^r`hGM)}ZpT4(!rvMNM4J=q-7l}dkAc=XlvMg0<<7yN@ ziN6nTOA#JCL|Z9d7u$o%6~Zu$5mOl)Rl9qT ztTI_zghS>rmlyMKP@0#z;k-g7sc9)l1hP>n5w(Gb!7IdQb6g9d) zR0=lY^kbmN^niKb8K!xqn^;4cr9f6h06Ng^uWgGQ`;Et`%?a3mqfBc|h4Q?1$KXr> z)>m>CGGVkTT!1o*L%;oHJo6hNhIN>O+yoMn)`|hRK(J8>3x`RSNgNAqmkOZR0~8k( z$^y|MKN>16(9w%4;IQk7jjuuT!p%RND2_pjMt?H&P;1qB$ za9LTdT$G0^dMaFH1;#n?9;C8&kix7iFTuPsf?QsK(=Z8}s4&az3JGvQF(m~Au#l7b zq*r=`D`lv;s~9vf^HAyDBTS*=s4d(?QqiHdK+-kAQ&!|WMkrBQ~tOfWFKMWuKwH!Iu(Jz8OxTNT+#ff-*eh$mU> zW6NW@vk5?RP!-@U{45yA7{UZ_Tw+KBv3X%@a4tDgBL?p0f^4CixI&fDN(3T@lihJ( zJs_|MV6xI(p`gj3M9ESsZNSW{QG%&?(AhXiyi!(}l^z9m4DWH!y{ZoChP0A(#C*RZ z91u^g!$f%u`9scQUL7ZbVLTpF*z&Xr?gGs8WNVX^O#n_*6Z_>LQDT+4Ic;1bOHq{@ z3{cfx zK7L+S7vLWAysN7agGstorMSa?q+)axrn>?JOnH^n09xJi>enx;)r?qK4IpH-7s<EM6#ys1aOm%*? zaID&m^&*JSlW$`R(nz&YRgEueI3G7!ZIrq?1tyLd?!xk#Ffz>|6;rZ+v#JoghRL(c ztOPrcaQV)VArfWv;e}P>u0|noHBnjMifj>`!*fo3$G-&3sHrwFa%X#1Zs0CJMk2^r#Gr z(!o_#>^=ovDy`-`{dBDylEF2DW9ntC2Q&3~MtvMlItEA91AattLcgp{;e|DjwA^<_ ze42yrQM|9B?l9)vpR0}38g;dSTF8wv;;(<0J=(I0>sJI8hcI9bMx9-sMlkD)dbL)> z!$k~8!o%oQ6jlQuZKlqvUewvV!Rho!%zW_OkfOiNnf6$kH>43e0SGL-VZeeLED=c~ zm{`P9FR?5~ug5X#P28&}95#=%8JnpscaTxS}>TxX@m&swRU!z+3*3=Yhbk&!*Pm7(96@?|0LxxHm zZjbef2reueWcvJ-aVA2x(P+ZzKP3N9lYi0&&HTsstN6puBD=Dwyxlc%|{s*ux!T}4$*t<7BZ zhxLhOvzvETGnXlPv3LYTqe% z^NZZRK^3(_8?p8k3rSIHBv0Xr<&p_39z|-@9KmYFLQQ1qZf&V5h{5H=^>F14!`ic0 z%8I4WtypOrYZI+~`qsj&r53q*_y$W_xkQ&sTNxY20@q52+*jao!>Y%@SgqMo+t$jZ zn)nY$xLQ@+i&$ZX!{6(h0KKcF4J)E^ zEm(Nm(h4|JEvO})%od;pC(^fI#ck^#zG`c08CpHaZNz{lx4XEqvQt}%*$Ppfft3gw z3_+A95MVi~C&mgG$4NYy6|Pdh>lCKQfJXdfRdr~gHfxw#X5AKV6>Z%>r9G^$ZCD%j zDH&2xXuL0;GD1cW*XM9btlQ%&s;p@M`mhMPT`yP%y3i(KSPCtW!^c?oKCFFs3HFX@ zYiVh!t182K6l1mW{{LR!43(miit5_>W;x7_EQVv5{%{M6)gUTuf*EBSd1c>7dmM<5zG}YJE49031uXD!zqeAsaFfrBVFG4o~7B_5M3+5+& z>>y#PCi{NENq;w|^m*VtL{OdZxbtFxa~1ekE`)9K2LGna$Dhx9rC4MbR?7(^O zYj9@$Vm#l7_?0*t9w%XoTM^%Z=Y=?9eldQ_5Wfj$%&!r*m%_?y- zzFdbKSBUlaay9N(BjvL=_WWUyHk!}_5=Ny_Ycw0!tic$M6M%x^L7Y*47$ZUZFq5Fx z_?%H{w8Dei4AB>t1-oBH|mXIu*p`j3va?G=Ut;hBmhGTdh*8&17!^{h9Zwrqeh%DCL4bP zc*2GY=Kc|sKiC*5evf7S=P*7HhWF$>P(&22r|mfJv8Ysb%0}-G1VAlU?nc@>Vbh$V6Y5RvEG9L+lO9X0zUfV@U$O8h$ClsBaJen z3V&gg7@tA8C<8FR1DFCBPsjpFmpF%X-$0I|jM2tO0qY$YKqX0Ed zp~Xsp{c^(#C_^aod9fL-vKlSC5%jZ0%t8yVMOcs4zfIf?dRU6NFMrRNpF2O^Uor6G z6Y2XZffHo##lMLk2pkolem}>X{{{O0jreErUGXjP_u}uwSHzdaR}sD}z9hbgr|*jI ziyz|mZ{lCX_XPG5SHExLi|^t0UGYsk{|Nd1Li}2B&(-3W_~D=-ak=<+RniYo@_*p_ ze@6~~C;k?{uZpkXhy9iD!v^bk_y6Dw&Lx233gmMQIPglq`)dSVuNF8I58)d1`z@Xs zccu6h%F*@uG4lQa;QX%mHgf%BXL?xC?l@9RzU&jB}qK#%Ke!USbb1Pbe zQeY)obs^dkr*q?XGx&QpT5Ty>u>)Mb7;<1P{xWtE+MKdtt>W@IVjg1GqIT<$W)t$6 zi|;og%~rJPv*ICe#aN>n)HE2hGzz@g2WmS9&N(KY#P4bFrvR5815X`Mycz~y9|l(? zLAzO_67rx6bUgwbRSE7GWqeujr3G4D0h)XQ)bkel3Q5BcuKpb89$g5ecn5ML3JPxl z$40?{S$NzZM!Gmwfy5vUMuP{Yh(2SCafvYr{E-F(TvlR(-XBKV7oqGD_!3he@kI{2 z;WtXa2U*Ahi8}O&AWFcJ7-N#rhP);k(~;|?kWQnFAELgM#y^1z8;$Q9Es!x)DCfsW zRcrhV*l0KY9&hT5ui@QLd{Y2uzJ>eo#y=pR&lr~(pNCZXhVflo|JL||@lC{Bg8NqF zJ{5VDK!y&1lqg3|EhwuNxwJsCwxgtrfvZxaxCmHCfw!9gVI$tvLAv;jBJmdTn1uMD zNIlZ{AIP%?T<%9*rQt!%Ox_#iDs?$ZffpJ4e+IaD1?_ULcmy=F3KX#k_iOQY1!C4B zhO~4iXkk4h!;NA-c)SB|S1DRpftdA>1?v#E2H(yArDgsv|NsBQ|1-dy%OQ{177Nf~ zY!OQ4n-ISSEi(tLg~Q#|ZzWogVJ+U?i#OMU|8IxHScSJbei8Cn4(?yBzFC8I-iW8` zkn`_A8E@gM5cFII+WU3z-B8eGGql)2qZ*R`3?#uDm?m@%+N~0ACV-Mb$KXZiUGQND zsm?-+b%His;Qb0nkp{?-A$a4%yWQZ%QwY7F^3&pN(0L>B83uh8gGKN=aRO=Epc(5> zavdbdo#IxM(g2PbiZ`EwY3Q8lsH(``nz~v3!X1k+PNGlCm@yE z_zM1xhV&=|RMU~$1mjEK<8grN+u+o{MVJi9(1iSp!1u-YTY`Li$j6{eLOz9fYC+v= z@Z3lli8_A<680!ULhM3ZDQuL9zN*Y7y%2w+6qD`&)}x{`emL#0!4#86xJxaUYI> z0}wyv{lOn&KlrUq`N33wF7Csy@T-rH`)J7@tqDu{=+_@#zmNO+qj>oET7R_0y5tYn z`M+P657+wR>Y_{eXd8U^Tc#tNAB6Jb+VA62el$OwTfL${Qlb9AAt&Je63zIvh*tdC z)U^%QHqk!t8!>Q)?fsnJNHJ0jS3kyJ-$nHsjadE5$6%*Pyg46-4KbZxK1Kd{w7_nm zANY-jUCkdh*!`Fv_8R`kZ=#s&{P=DPeiz|44Zn-UB?7zL!&?6v^fE3*--A7ge@0*8 zdi0O}kJ$eU>;?8(gb2cab@za6%ahguYpr#_vgNZ#|0rga=W>~3tiR{|t_59dyAE~v zd-|fuOg3jdhxd=!#a1>QIsVG#d+)gOz6b6P-Y4!)-1F;96e$e;OgAYE0U-v`e;VeQ1K|W+XY(LcdaM2?V-TT1i7vBx1 zv(}3!<_WtbmyW#o_-%JT@#6MSXx+(5dw4(3x~+_-y)I zq$}PndSrLHC)R5OdNYA&(Cka}8U1~k{&dJ44uwOpaBfO+>(DC$pp%a;t_WP0d)2AXR zGJ_&B=fYjGJJy})38OSSSQ^eqTc#sjuRnRu) z@|cN6O7)$3>(K6}@7xwnTdyMb-`N$p#L+u$e{A!XCw}+G7Xba9L+>Qs?E{X|$NS$) zo#;QAM)sl8=`-QZ^w}^nPj`oVGQHtICYb8W_J#X1p>WuUnbI!KMb5snZ`+G6Zod1S zMD8`@{(HMJ6MBCAgAY8o`SEA|@F!-!_w}PmWN#nOd?b5uHlqs2pn$Y0AlaAeivacE zuqzVHNwj6O`@O?EU;M-Ge|P8e;mmdv@dvv~rh4z&boX8NJ@WWdzx%^;FKm5v$KJz0 zdfzd5Jc~lo7t|rtX`juV4WSk+gtbTq6MdFb3mGw@S&7*Vv7Qre?0xmQ-#zxk{SS7f z)k@+;`+?1_hbN&EtI^C@9=%oi#s%u2`RR3bJ%T z>d>MygkH> z{bAwK73*(Nr9Jt~vwwX4rES~yynfU~Y3bwQBc)}|iUAC2(hm38{V_#(nTQ=#;b>ko7=3ZT1@|^`YELpwrmOJl#@R7%!M2o%f5-9!fQHk>60NP-og-X_E~W*cGiZIBzDdoAbw)i z>Q6Z3=Ar_{4$g%;iPabW_`4?`d*uE*Hg3A3Kf4d*zG&CW#I6~$7p+*k>DIgM1;GHb zD41Mu@=V|9SUf6cEx18JMK!v<7Ps{Gl_JvHU)`kM$Z8THu{r~J^J81x2;=!d&qQP zNWFc{wR3J zFxcOh?01LyLm|6g;tc1WkPM4Ze>eq-6OkSQ)fba7cRUscY<8?Ko=&7RR939(`0Kkg zDL(q(y|-`ZxbdA7p?b+~uwsw@;@WvjR;}H5%N_SV_~>I#LMTFj?ArfU7XY$*C4$`} zdaPcHpe1{|1MXlT0O-yFPp)8Jp9~s(!BAhU-w5@e4h6$W4UCM5Xn)L(*?=XWFqKXu zlXa<_ZCi23<=xv}0G75q^5DI9+_Y-ZQ!(p+0;oRMzw+1D&0n%g)9a&Jc)s%5u7mG% zpX~AW_5dn?lIlGh@DUFDazIgEQ1qpNqIka*Iu~+Tqb1f#B4G};YFWL&7`i6xB` zG)Pr4a1siH(1397x%1|=%NL!^5Sp!EqU1YQ{O0-vOICt*@464lgc2U$>^b=E`)m+R zI0>LbHH!=!M_a`E?T`nQ(jV#xiLeAN6a>9d5woJfn25^(80@4-#FGMGRHuXQzq$9d z7ytD8r%1bZ+`Mk(?4wC}P{Gk4;|G6s^~?oJR;{~9!J)+eR>;Xi$9n^ykyMY_E6^lHo7bz4H$bGAlI2Z~&1%jMV1Ubw7d0~O^30`~B!-UOgX^tiz;pjc9e z2wH(GTBJMZg)DKzi3nLrn&v{0knKPd0&Zl~j- z3M2_C5YO=vK zzxwT*8fXGX=H#&QJ0YnZIYxMM{AkFNcR85pcGj*elB-$tiNKAzpNj?H6 z^?_{Tkuwk^9^fJlnHB*!-2eqr|Ga#K>b?K&+ctJAzN0ToP+qo&%1rOF-&{NQhUIIN z#((rNnw?6*zIj%`LWv>~GC&Dwg(#ss2`XS9Tl+z`B9sN~_9_8N;BYryKmpPdim<$04%AqbFR8>9u%Q61}I!9OkUe{0Mfpj(v{*>_GWv} zP_TiCB>*}F2!gO~fCe;(W?eQ4G)@o1y9?-uKn0#lHl!2;=Y=c9+3lNFuUy%kmWLEN z8f5b1)mL9PZ?Q59D9;AO>pR_NDbUQ`9E1qT)eaT_3F<$DYp5^U?}O$C82zbGOwmXf z%7)sn8$@D)dkm_+7zkA)A>xxpnqn>4d-BMhS6}=S&4LH-x&5X!9ShE+^59tUBfq+8 z#{9(}6|YCTV`vmh1rPbCC)aBNGTTwiCxMlIXkrO_2#5h@Y;aAF7HTmx4}h`aaR5W2 z?M}K<3K|MoEz}@np?TJ>ns+Q=Y2?&fv0ay6eLa*Pg{(5?l~99_J(eVeH~`6>Y_DXW zvrCx?0u+1#{1Z|XYeBkXLQ#N}gp9M40#qi88KY?m@t=t&0hK2Sb)4u;dQwRZS>^(9 z`_R32-n?$roY&)dJeiTL|LKVT4@f+U|B$j>V!bw~Mkygn(eD{FS(rwF1+GqnQcjD7 z(OLlGOe_~q4Un!Yl}uWxdSb|?DK~ z4kZ9d7zAUXUC2iwmX2qk{p_TjFp_}83#8z`Of@7^8H(Kq#4ZfnXP#Rg+hD^u9Y{wOS5LSaLsXzQR~AtV{k0TQ1g zkz^u}%%B*9;MwM zA?+U3!gpC$I*$u0apG53&zScSX}9|zXD6I4((t`v1paTk<`Wy>Sq#^NhAPkX`0Kg4?AqbGQ zZ|ps9K;E>rW6tq}rRf44pWQ#b8iqAxEeuGwPP75J=g`saI8l*8UyuS;qT5MrOscR$ zK24X}_QIvB)@k{sdh0LK5q6BUnuRTw33l;&!9uT_9;d5T-&fXOp04n^<&+i3kOUR?z?iZCRu7txeP=2GHl1G)b2JJ^f=AJ_jJbfX zK2TK-Z3q?%pb0IomtX_JPfYVyxjd9-M@hj|3!V<=VaxX2@r!F_FZz%iehqT?B>G5% zP4uQUV4y6vAGK7kqU>&{$S4|*eb%064yHFe$nk8#N_dqdhNKcH6AD3q$Qu+ameL8j zYp*5p!Usb+c^Fb>8>CJ)u5Bl9w(Q7`{tj__CE)c)DldZ?2tlf#6j=S2_$&!{Bvz zT(y%8lmt|NpbM%gq(}!)bcd{P9CVZCvCb%+3J^h51ZG|7KAVDg+534CVF6de^B_s^369!;>53^0tSR{z6TAz=2@uc6r`?zcdt(=A+k`H zhN3T&4JV-hwA`hEDPY8fp#W^K4_vh%P^nCoaLUM1?j?KS-GIfbI?l9sSKR=M*8#(d zzw-f$*O7bhZ@hgD!aoJUPehpL429s<6yRj9GP^+(nQ$6JL8}tT=mjL2SHe(VD~wc4rhQM_DpCoSV|*B69tee_zx?Wy4pJ5FwuS8u@`E=Vc-5hG|wnw2tq&THl)l;OPLKMo4!?eyv&1}y74X1@|K zHCpP;@IzDq=X>>e^YZoMNpy-biglFa!&i zFp$)xWNjL)lz@1ZP)sCf5>Ic`t8{=8yZvA;-AC$922(N(Tl>+_;AQU zQbRVlR!Li@r$5lUhU^by0G0*6ZVC`(m2ZrF{0QLb)@&XKMZ+T8quNUgx&%n34^XJ? zKp*e}yC#Vivj_{NZ}i+TSmX5g=cVtReOWdbag^y@c;!c>@Ah5$kDLOIDDi>{7^&n< z4_d2Nb(KiM?9Yk|5YwX^hjd>?K|^7{WU5|m2)f7wM7eZc3d0bmTUB}BDTOyc3LkMG zN}Zj1)wOg!U_jskPv-6eZ=4C3y)O9RI|J!JA&E!-Cx$`*tV=0uSbM6KOwdn23F4R{ zXe((XlG-uk^q4}a3;?1voKPmYwuaI7hbv-PPi6ohxFS9%kacf+_klM7h!V%W0SIN~ zicsW3k$6^F5PiUq9qD&eldT9^!2Dy2u>&WP6w3mXlTJHASsUh#H~0xi4CvDVco* z02N38OG&y!QqbKg2c&dfIHRYneG&6dCI>)@9k}Ad!kL0_&%w950=eGPz>MQ@W;68y zo=zqD2#bl48M1ko>Le($IEl9ES45Lb_QM&HOa@X(wh}F3Esz~!4;FF9?6>2VCYzB~ z^wpnIAS)>dN3Y{ggg}0$o5MEvuP$8>Lbg^C>{F7{JK+cs7{v)=s3?J^$~h{6&LUb7 zK{S&EHLlPSfj2^fGa!`F&!$jbziRIOm;+9W8Gat%CPS&K}~G=*@rDo^t%DkF#uzsrDUK;u@pIrf;rUZp#uOCnr=>rXAY#< zm}HoX1YqMt0Z2rlhLo&L&tz{hl8O*P$^g!fq|)E1T(5tOm~5}t>|rt&x)TmyWdS?F zS@{?toZn+}v9(SI5|qZ|ZL`0uYv&VBt-k)ctH1Nb&wl>%Uz${feGr?zlKXto#oxN} zx*1n3c<`ymc8B4VRy|M9_E}|s^{BoKX^CC%SSswmW<@%clZ3;dkH8tQp<}`3a8A=w zQ#QCsxrGN@0eOq`$O(dVB9J9m7IXy#bM?`K+qc}YVbR=Q{`hDA^o{TR>sLPawSWB9 zxBo8wRq-9`TUFoq>h!<)r+@k0-~GdnFaKY^TE6J!`ybwR;A94_{3tCoFrn^#(NRi- z_A1wfm5eGAi7>|jvz@8WX-Q7M%7E)&W58??3WB zbcul5Eu%bcA*dJ(i+9cX#g9HSyt!rU^sj#ByFa*c{`GS-sBy^pF4i?JrCkGqh#WN07mt0$4dP!~-FZFJ#&KWx`VX(XcE+rEi*8uFTz0rN+;Wq=S=?ma zEN>DwTez>^w7z5Is*V*mF1lgS+?g}3x$?)~{M^_fe)r$MqUv$#>a}9OXe!TO0uj3h zjvmNc#B@nR59INiJVoEkVhqi~>-x}nPr!jUPQ#)R%FPPO2;f0Um;lHl)i?O9rEkC%|MJ(r{r#W(^16A;)^Av!+u&WlVcoj*>*WTq-rOM9iwzd;?e(q=>(^Tw$~JD; zuo1tN^RNBo<=-AY?g@;`y?>Rr?rYz;?9xlE%jBgw1oJX+sl3c}>1DW2;@(2YsyO$h zNEW!vxD;;^m)V!vmoaVpGQ?k|lJ#Ha{kv~`b8zkVWX4uKfxOb;C>FfUYgXNOF74F2 zK_=dX(qX+X9L1u9fAcK6sr02PKWbkv+gE$|sa3!J_E)BloA%Z3T|N`TvuoFF*tqGY zO`A4a8+_~6ty{Zh&04v}Mv!Z5TytxzwZ=MBxn$#}jW^x2Y2$|Vx6J?Yq{mR<6TdB- zwDi%(H*emuW%Cwmv)GbFkeiJyo8=aPU~cwr(J!}THk&Gn(O#zK2Xc$;q%=0;TO?L5 z@CMIvv!!0!n{8yoeC;hc#JP~j-0XewzH92fx7EQ;O7)Xo;us$~0(acJcGW`YKZh!; z*x@T2|IqE6?~>O$dk(&J4%C}fT>yyFM9}K1J$3L;cm4cpt#zZm^gpgz2n*+?TW`Dd zrj6^@t(B|oj@;_Z8nIfg@vL66X7w6twR_F#)g6h|gF05PUbB9~#(P#=I{E>i|*dCcMi6OYyjypty^ zB$fD5s5CjeU|Q>h_teR!zc*yL1@fqsO7qe~cA@4yns6}CWJR~r=dZd#dVEojtii z{jY;@OH%;G8lHDXdDTQDrRud}J=*4q+2O(Sg;#+%dzFO=>seeqw=Mo+`5GYMK5x~Gm)|;gP#*9eJa7>I zF-!8GK(G&>(gy^dG1huO;$B~E6$gwRFb=9@se>N%p@|PnBy=4-Z~!BtxMLP3?j`O8 zLhgX?&^wQO!@DMu#|TUf=nu!#xE~|VtLD5G9l%KVN%R7t+SlKV$s&(%C{wwUX#AXn zY}6yEVGu+4%ZvW$Gs8xH@rTzh>sY&SzBAT(wgDU*-JeMRv$l_DXw|m*`rx zQewG>r9$aSMgU_gSKW5w7t1?!PT+fDgWuW*Q^>T9Qp^`L$ae4=oT&4)-J$2BNBnEpX`V-+!m&8_J9uF(@Y_}UE?5-;~G^Fe4>lXkKe4g{k9D&m#tX7f;d8uz=^d|uJGz-xiY!JUTLgAOo@&`BHkcT zc7=cCishSD{8Pg^qNlL(+Lzu^h*50A)+bA8EO<3ih=B|6L(B=qIhyf^Byx{XbeBB{ zc1s_06B|rt>D$b~G6%y44<34b#n=(ACCrSro2}^CqnI5AGf(%AF%RpW{v2tDNXqms zzw)(#!eu#tpXx;s2 zUEEu^8v6&L@~?7uW#g5^6|XU^O+5+~Ef4tiBcp-5to^P7`wsvq$XBOy^R=nJmHRy^ zF=%qX@AU)E{d3VbL%B?Yw$)NOoJ%%%1+8^J;_mM+UImAqI>Eg)stvZYIx z<(7JvsXM9CWtV1``IjzPyX*(8GlS?s-si8l=EXPn?c2ZK+=qJabM4=^Pwp?oGvoH{ z$AjEw?Kk$}f~xK-V4QjjoZ_Xu4+umM`!M}Z-7}6k+5AXnXYKRjGxep3l-d3M^O^YG z*tc;?+b!tpytp`5)K(>uFTfmCZSp>|y$}F+i2K zWHGL(sbZ*19K&$pyu}#H8*n6RUj;1qZV&~#;TY6}bV&uvy7q4PO3BEtUcTb?^~-L& zaq;5J68GXIOBP#8#Nq^kMBsgJiCk>rYA(qx_Agnydhz$0e{u}SxZgMUs^^ZN9&&$X zpI0|k*nvNVdM8yKgu+1__e7Ns^=6ai_NDg$LHtqxUv9?Aecso1-!!#sbtYd|$1Y`E z>6d|By699gUso&k#xKs>rJT#Ey~42CJACrj5XkKQP5$RZp- zh~MbDVbzWQv-N);M@1g@4E_0&`}cM2mHV=L?R|X+=3cQcj%z{(JV}HMLf2mJo6r5S z{%bE}$fxw$DDTm0oTouI383tl`)=Yql)HaE;I$cWlf1Tb&mmaPoadwoFB>d6`kN88 z!~bP2MAhQ>4fdk&4Puc*h#;7F&LX4{Z1wD0w0!a9qb?`(fACED*L(Ktj{;Il!6)|Z z+-vT2@7udiRVR(eG+x?!ef!?N?{kGK`_p-&w+~Zrwr^GAcY1=!91OrZq+~^2fd4=5 z-%+y|lxvwrF96R5bHS3%P2V3}|Mg!jUcK^$g$oxY0G+r&DyVa~dKTVr!=gpj4emv_ z=5DZXtE-W{A*=4aOBVlT;?GZ^4$pa}fAf}I`*VBjy_k%?*V^OWyJzp--aTS(0>MI* zy+`hi;u_v#>X#8j#P@g)Z~JX+(Qbrpm)WRXdNh&*{PL1Fn;^?g&k<{}t z^qjAKuOIE!BgtwGD_SHMG=oJu7c`ZR`~JdBtLD!SFBFTy3q1=KE?lta^g>i(p}oMp zaM6MVxrM$3H!l9|nnqv-G#e$@7}j}%Xf$T`?>R2P+l#VJM?NP=MYDSZ@e#*(^#On)A8#MnmY~_ zjvVi~a1bCHEDrAb*{IUb{e0oFMYHG3%g#j==Sl>7UJAjOJ5SCnm^XJG{?DB|FO8@i zf}HDSTzamDvGX!>{qyE7TzJLAFFuyTuo$QQKId1J-?eLZZkK2G&YinZQ#3F_ZkO0; z0wW9=+*^3V8t=^Pa_!uWzo3Dg_UJGslh^T5Gn zV@5n4OJ#;aZqgYA1Lu&|*)(u&+tji27ED)qOHoGy44irA4V-~#Dcg4+ICA0)Y`@|^ z{lGo+(yN!>FlW}B*>iHU%{lgLYmS&L=eTCinPbiNAr}AfT%d38SI)K(EWEXm+ICV3 zJiF%1MoN1&@BMRT&s%uyMPGU>8^I9EbH1s6ziG$b9XqU@_Ab-3iF#oaFKWOf(fw`km2Xm(r<__m_szDU4bm7e7 z9eWPE@jix**~j3>KrU#Ude;AWU+cflUp#Y`oNdkmUT`g(HG4My&zg+~fk<;!cD6MO zsGViwUaG5&=L|x6mWL@3@1415@fW`QxDprBzP@q$o*XJJcN72tM8eLUCh%he5iwj1 zRC)&p3L%YTCIYatGqVFI;8$*b;nkn=HNQ+D`5;E^*l}Rn%E?35VlrS>dH3km-1F*7 zc{>5#y(O@T^4LhccQt3W=53-2?1WRWiL`;73%Yt99q0Ft`^oG%vu4edv&@-dR(7Vr zTY=!2Icw(3SvlOvneJILXW?Qajfb&_v}Sr4IdfJ9pGk!HOy8{Q7cTpouRdYwsWtF~ zZ}ora8|%021}3tqx;E8w|%)7U=A%!_;c?8AZ{JAouFo|D{s>Qv%t&7^W_Diho;hRY%oJ`j*9$~>v3BH3?JKev z+`%%${YC$F$=v7mY~QhC`}Q4jyF@@W5$x^e4rBX{+;;a4ykxAoJ%hkELOsjvsIUqd z^=#{;e4SOvj2$XJYlmyQzAMI*FD_UX%4V`45qkL20W40Wm8Lyhu+ruo8$bak zU^rIVz+e`~(f1yDs}r^|?PU(`<$|6QH?~zy_g_AD_KfTBlh>Iu#C6#j25*fS*X8ge zXLzokG2^=HtQl@3!K1{j=Q>2;E;qxzK0Cv@J~YD%2K{2q^|=V9?;Y`6G4Z$0?lDz` zl!voNW+bk}<|6=WG*gvWb#NA}FAMB!VK!tFSBW?o9XGw|Zs; zKKJ`^zvn(|t9yESmaXdQ>UXNEyTo&`Ug$5&*#s7gjxl)^5^p%pY!?P)_m=A>u29Y4Gj63RhVhn7SnN} zWk$EpPh4{u6mvn1R~YnMi&bjLBB8N@c7tiu+>R<@f+yCA666cJUMX|M`rcVTATTNy zgmbrxhzI1Ng-){d)xyRVU&HCoAYLv1>%C8P*!YCQYRuIe32E@x74KAFfV;$&xx7h( z!5@Au{rkaZAn>#K)i_Jajg)~@^O^rAUoGe#@-?kXi{(x%c_#YK==RyMt1&ULv5pu> zI8t^DOdv?vD7%q(j43uIrT{f`SBJ?v~tMLAE z#lH73Sk!k+5xxRgyjxJ>z%O@E*Lg~Oa+ZYE8}R=8`SPcq{Q9YF-haP&A>tcA12=x6 z-;A!G{B<=tIws~4$C4K%C0e^=iH?bmzLbjvuu5FfVweMEH!X-on{dmCT3k{47&Y4O zQgn3e)m@{4U%SuTPUEMmi<%4^>9`2qG3a z@6W5hUdp-@hy}gaxKATm9;*aybnc7=Z46>=&mhKGx=Q5l=S z43CMMNg3ExMKi3Y#4lq>i-v=y&;NAp9QRyl4x6jZDMrrcn&-@&gG`$v&z(~}*ZeWA zD(9N!d^|^;%jcNqqM*!WbLyZl|BDe3^WbHS)n2HHMC%9m%~vkEFG*O3C(lE)yP%UbEG1aE%*VeujIBudoslSSwa;6WcSFK$4$aiQ{tb#Jfy+E59WOWG8}WX zkMoc?l04_*>N(QKWhkn1_{SjkV>im$9RH7JfA*i3Lq?J_HA$RhX5_r1mx(T-g^~+p zMU*W>%tgl~JulITbAcW~u6*$lu|hF!Gd$wCq+awz-PJQcbnCE|yDLFyC}Gc907YgL zxCXBLadokqr;6?k<28Ao>kFY?0A-jKZr!=Bds5Mi;41Oo5mK-3^f_}so;7>6W41O+ zoh{9B%x1IrZ1b$yvt}u{R8g(X=Cc^`GF;an_ssU4^~vYM8jnK1x+8OW@NrzUQHBq{C|z(~1Yr z`mm&0^tP+SXK$qS>1m(L0mTeN=FO5ma?jE}(m=mF>mxqPJbTthAF28kn)}ZYO7zIKd0ugySl)9UtJ^VbW(Gs~<@p zf(;*fkRBm<%L?i}NGj^`koZT|59fR`D*RPYUu@moa?F-1_~rb9eC~q#T+Ml(3+KwAKLI6de#_yb<{=$WG=RBxzpErY|b1I%OpFyrHt7pr{8h`p&8+q^fK}a^0f0!JM*XfKaW}!wF(m2 zdd?}Lfgq0_bfPssXFGp$byxqT#g!h9fdC)e@tV5~h?DH7rLi&^b~?k{McY!04S@my zR)R*K+==zVM}0hNhB{N8G1D_sn&Cil&(vmcBzdODII5JH<{2|*%d$SXS;Cbx;&kXi~gj}A1yV?gD5*N1^ zZc$l7Q|SX0xeebyU&L|6(URk??W0+*cYNkfnJyf}qH|}@@^ji*c8;HgTqCJxC6qxS z>ZG&kIpr)#yXh>32U^N!ag%u)AqQvA`kXs^{`^_u(^(t7?;P5?&O(U1UurvldE>B# zGqb8ZE`7aIH!12aNm$T>N%2CZmsN`W0J)s~xRSP!K8dgr((=J7nkAeiw*8$0`@c8m zJ@&qYq`Yr>@BQ~VN*3hrz2|=4O8NWmRg2rwdu7NSNLBA^xM`dD;kfqwqDzPgmTlpq zHpROCHlM|bIrhJ$vy6&=pH)#*{?^WN}D-v98OQQ zz&R?d=RN_$ep&JLv2xWA1*L2Q{EGz)BZsTnMW&mCAmJKQqF`j$N@GU{cAhwwPuJd+ zr@zOhyQYJ@>8AIlBd?(xSK7PkbnAQ5-+g!bdu7w5_uM!m);-;fTkma?kzY4TKDm~f#Ww@#Tx)qJWt&4RmB(vbY9IQ^X- zL$6U66j;`Uj@)obJ;P4doY77zNFJo~XH2KhoN=P0o-w0@O53Fa!-HPT!>d%K4y<&e z9yU6N^(g_YuxgoRbd4)tUxk zC?U5^nKr4<;20vi+?w9$>7Op0ai8`(bNcidqVV(?jzh2&Bo&Fu>S;}s-KQ;QPMta< z>hw0+nVQo!s>6c{T4{n^)l@PPKW#mCa!IS8Z>l{NaLaB?FcceQbiX6vm$qyvHp=MS z!WQv|pFRP?biW%|C9dDTbH4_R;-x+*GwZe;H+#~=>PgZ>KFK_B(xizDMJG}Pk_*W* zNy9C=ElsR6$_jFsnraiZNxl;&O`bZbPw(H0s^Nm$yH!;5DR!El@;iO%G(M;Bm!Fc5 zG|ErvWy|SPCr_VdXeggN!VEYfYv@?uhKWyVRz)J72n>k zt{q2J@gF=!WLTUt{A}Xl0ZDalw3-sN)aT4F|90a(czXhWTb&@i%_g`}(k5tcJCHb% zHo^S%gty-=#!VHsA&#C*9S#Qwc;d>19*(t=rAo|>WNQ< z0TVE!rbH>V9qt~~Yx1-=D&P9+E$L15E%Tdiz4d0{Th_NH_j_u&pvjUE^3;M0jJoCI z$zuFOP8~@^d2o>`eir?9qFB>APeHd;pRgVOduEfS*I;eMkA+1|A&Xk=X;{K8b+OX; zvCUNbf%mReBocBct(=Q!HPC(uMY&T(HoAsx5s^$IE#d=EcvJ8^8|VC(P_)nigTnByfC?--z4 zC41aI(9}1_D^$Icnk!}7{ufQ*@GZh6cOR7q%@t5mTAH(~UHyJj-g@n|%GW)wORu?+ zl8_Q!x4idE=kN1X?1u$moqo9BJ|-QnItF@5=h@-qJD7Hf>0gkq;}e znZ8|nn zv6En~?xC-r`k^18a|J7VK#C=KkpxL0w-$68+*PV9uV!H*jxBpc+Zp?g9!miY zv7o`{?B(dlYy6n>g<1j8pCxK#)LcfU`1DO z0unE^uJ;WYIBvW;hL6?8fDFWLU}HG`I&ftfGj`0_u_~@qTq#ISq?+10Rd}j$3>#~i zG^pvTSuUI?V#|58^^{#l{&N1Q9WDD)J<9)-j(U((Bq~#4NG{wjNACHP?l_UuKYfm! zjB4Y*m;_8xIfyh&XV+`jlE~v{L0*kPAnhiYXPArr*IIJlQ&L^(lQ`9{{mZY99m7V0 zA|!3JWz6W&V@C7Q(wOSeY>WlvF=JF*@zL^_(Vj8Z(V%$r7|&?4_l9_MEIrP~_@c3R z0%a9nr_fitJ+w8P#z4A%&bU^ScOLok=+PrbJV&J?6-XS3iNue%M6MihAH{*JN6kmj z&W$P+m(*N3QY~(9)YwjKf2VH8qmWivRop7gNwlu0gA|&PY1QbPht*z2Fh_#!`s7_T z5+Eh^DnQCZthbhyU`nRW_TADk_+O*PjT$|YkFty$HEQH&b(A(z9*sZJC^k|X#Yb94 zjiehKMS0XnhC2ahK5EqHQKLuW7FAGFagUF*jYjK{qegSRdbD-q=+PtT+a)9oUr2df zG!fr0a^xG&wjP`9!68L{Ij^>yxPzE=*adE=M<5nRD$2IQVBpciNBI%yFcRvyV2pg^ zFq#~8AJGn*jvf)W=r%uMJ`7&6BR)rorALk)k&lS);`lD@FeT~-?TGcllJ4ej@(ac2 zfpCeb-bL0p0y^YlEr8CqX-@9|VwKlseELtIV@&laSvcB(ju7*d`j_NS4Q%_us8O%H zGD3MpLefTPNYX1zmF39cLx+#>!UaaY-L_yI?2Fq~%uqSlzhLayCa-ilIq;Ouv4qrYaICu2|Iy#w z>-8QrYQ%__UsgtFFMCGFFOSehm|qsx$VR*jwjuGC!A9iL%Pu5EBrYDIdI|SsYAT-K z#uMfdc%B}#zC3PlSkp|kO2rXJ5VaN)wh@(w`5_3zArp%Huo>I{SJ)xxa1C+|IhDCc zX7C0@E}qbCzI!bNX-!^YHc+@NWC26>xwBhcTG+a4el3wP+ zt5H&3Qir=<(uT_~A>+fXFAX35(o4AKD++YMhBLHtzhp*vxcZXi)q$Z+GZk>eO8nS* z5WG039byL+Bz{OaXg+lCAc`8Qr9+;B>LCf$^1(w+TvE0F!9&!7{^D9X#6>dUN;;&X zsYTpl2mMiV_|Ic=TeUh^QLI>KwuR{6;8wvIv5HElO?S|uBlNJ3Q<;S!QI%spH~$&JK@tHWHVQH)$3j%qdx97JNn zeCaWf7@E=}X1Z2~+r|tEYnE9h4yRNd{@EkL-`RG62o;1Akrjea4J@(=>WL*5!3qvW zfNh6BKkl!m!ptPq>^q!-*TnufiI{d!a-Q1Kzyq<=I7e5FNOGP4Qq=xsRkFKS1b`0>}pqV13W0Dn4of?HHldSPX$^~S^o zZJ!_4;vF61h5 z4SCHURpQEa@e^Lkn_9rMsl`ttz!;&hcqK{ReCIOTW92?EAIf9mqM7g0j3Hne@98$+e%0YU}U&f8W0!t!%#^`zpe`AUB^7 zolDSL4OhA+5FNQm!R6kdmpKwY!choV2&}cSh=~-7WcN#|N_`LXZ_w?TX9o`*%7%cj zArg`{#5#EBU{M8fhIoc*L$tvRx7d*SgNFoz60+4+CF*zzK8pzePF^qP`s}aRSdZYdG-FX z{ni89->@~gTu8J!bo44rY_*=&gkG`fQ>QfyFpJJNsI@26f(D>hNa?qA!}|;wQaD%} zY#TIq(4fJC2bB-j25Cqtk_RE}$_Mj7@?hgqqoPCHl?JiFwr2;lYqqTr2OXmO+V}r< z?;kbzm2Ui6bl*O7-#&C7s1QUEG0y$wef#&JhV9dEX~o6<{iwD5e)!97b>6sJ2C-$2 zDRaZw4eNWfXr=qXulOq7!Mv2=2unIOOl;DlMJxThx2reeQ?fA6mz2Ka->Ls#Hb@)j z8YB(m$T@NlHc%ckupF1xK?4U38i-nks2W^c4jhOJ4Hs02X5M>LWf9G5@SrrvgGSaN zgF3g^QC#Ej2krg7+5P*zeS7!uy(*HtZ!ZYktL&5Zx^U@1&T&n*{PykLOASR^7j95P z4LLRD`&3cV5XoXMICF4vqmYwMJ29k8$38Hg>GmkG;|w$Wm)IC!h_zaAMA)NfSDt}= zgkuY^Pj;EJ)K;AEZ2j&72eSd%K*s=SAVX3Im!enA-xnF;VYFj^Q(!W3N zr{da)>H!>WRXn32XZ@uCyq~APMKojLn|QyP{yzQs4;c7Vvjq=o9DYT=bpF?WcJD`c z628}W4~Ru+?_Rb?+Recd3o7>FjwE80P}~v?aZ4z6i6R&V-tEOL_a5tBJh&J2OvE=) zkt=(A_U<{beM)G{wWQcpoja9+JBF!FcXopN`I;5qVyC9T9Z%_c+Nk+|06J;;;Er#> z`@t>x5aFyZn9x`2Cn2}??bjC{t)H0+YCpLzZfpH)efv?pD2pl+E?wTcCfwnDE#gT| zmAtQlZl-A_XV2=Jk@l15>#Hv!Jd&H?cB$A^F8wJJ?d@^N!g?AmiO$gMg}3; ztr|I1YkSPQ!BV!zgiPHn?cu26Xre#Kkn=sZ-`5QE8;xT-gdQm)Fv7?t_ym^vb;W|6 zWs1QccQHXJafF*##{-lie_24OyN_td6b-7|_UXQTYo3<+R6VWXZ^F|YC8>`G>HgE! zfA#Gc`W_KukL}lH>h`_LZnjH9s=s^JuHCzKi;rGlyG^*}xGV2MChd0bGE*aUS2dE~ z@|8Ki!8tt@U}>M|!#( zDHo|4sj82LT9DhR>HC7*xPC1sZQG+DIFGi=wsY66ox67KWV+UZ2t9=1!~xr-xu zkAfmYmAcb{M!R;ZxB`z56Mj>dk=I#h<+UsAukJg*@QF~V-S9@!Hl-^Xs`$$Np-hKM; z-U{w&qLtKJ?ZeR8jceZ9)Tg&-%lcS)qbO>bxMS(pwfP5kFyigk`nH&~ZST&VyK2A( z6-057D0q>EvYxwDCYK^%wl3d^1Q~)dp^y3^Ip8S+Dq&0->Y}ep1phH z)2kO<*hNJU~uZd~(TK6t7({-MG`Sx>5FqN%lK{~j%-K`sPC zCT`ycn%q0h)Zaum1KkcJk`H?osb<>FwDAtYx&c!1&elB)$MrZ6=ZftJ+PPyVK0ELcIsI|s4j0KxwJM4#9#D`tl3U!OTGtNi zq0c)8ew68?SwMk8fVk*v5o@jF4rRclpI3a1v&eOEX~wGJaQcS;g2Mk>z$Lgd11{ai zIYZWqZ5p)g*^_sddvxbLr0%Q-?+%iXBykNU8M$b}dPvUL=d+iu>meftiMOKCgbq3-tG z3#7Pz|DK&YoVd+JLX#avYraE4Q)=!Ox9B@O+kL>**8&^=?Q}v{!ao%Hq)<$g*xgF5 zV)|ZvY^elq5*!9^0Fo~~wyYUYl00p0B&0la;FZ)bxFaN?o3(ql?)dO-Qg^kR)?Ml5 z>1L)Xh6^Vu84}%moc#1Bx_0f>P3^9U=ct+1UGCQ1Bc1@4yHTRAvvz$tGNjWP;?326 zHGf<1W}9cb3GyJ2!an|c&>z3=*|dJchK;M}+=!LycI@1~t!BHl4eUWOZ`;0Y8yK-o z5lP$T5Y>8(&$eAVzV7b#azQys%p<`SI;joNiY!J4v0w%~NoTX`5`*(n{(@K7W3Q=N zi%~*qmb0{O@g}+HQ{B5ocI_J34fH8pd8F1=>!wCZUA3-Kq}tUdvRk*VxZSO$s}?DD z?I!L=26gQg8QHZPp29~w8QIN)=d`YJw@B92SKR5=EwUTKmoPl(LZX~^we;>1(&g_O zhmZY6zh-Z4*}0W%)6oCgPH54sn>OL_qSgE-pA|S=V#&83!!OhC^%0{+ju<=jKWn#V zZZmJ)wr#6@o3_=l&9-aPm_}`ORF&&EszlXTsESojv46q4-H@Hn~6Zzu)RL~Rt}Hs+NDcmWEZfY3y)-7SftuTiqvq$A~n=dEtU0a zP=vd@i-vo2-xS$J+*46U-{3LYQkk> z=AawX{91MClK0f1rz~9{2~Yx$^=&|p?$8n4y7uhSyyrO=PW|rXu)h-U-1a~A|8Zc) z+9hB9cji0epC8<}XV=bcTZK0b2@a|g7#QH+qGQ{(tzMk;=9?4V8q#vwnw^{Z7Im|- zg(K&i*%ocHyk)bB%y-M?En7BIa&F zRx9aT$scg)GIjh7fGAJN@{a{bq{UYFkn4x!2#}Zu8qH@%)@jY2(mHb_?J162?u^X( zROhFj>fG7WS$c};bqqzNGc{FlUlNJxsI1~qReS|C4}2=JD~49*_7SaGHgBeev8J9d z|K{N>T1B*r?A)x)sTv#@-*b%LfCXRAn>p#V5ksHu(JnkR&@Z5AaPR&DM@^bEdG?~k zivR&Mjb)wprUEA@>0{@Y!N;O%au9Z3F#U17~fUeqYtE z&I{Kog+|q7f((@Zgq@2wmU_Gla~1vrb=G<|2~=HO8gQUbz1B~4?$oI>7zEaIk_`5A z0y8=(oi(cH#Gf*Eda6?=6;;GOuot(?c%~Cr+lihA-vUH|E^x`f!k{jlI(2N{rbW}> zhD}?v?bx+vkM7U1VGV{q*QZC1UR_(a4G(VEsCjs!fIk$6*@+{U!yV3%0iB=g)xKHX zfPls=!aMcuKWyZTufEuE;ON!N`&m^K#=>V;>z1?DZQrul14(0BtRz!gHdhOo(l-0k zg)V4b@#9+pMa||d+dd8R{jSP^dB{xgg)|MB7K1qjULe!rV`%$RvD?c(9B(a%^&12=89I6X@~vksU%FVq9YIx&%3HC~S5GflHh=8Eutq`k ze0D1ihLfs;#`-m?*Pubekj_IUf4kuDt$R3{nTyy3KF-hmT7SQD^Cs73zDY&UW+xKg zY~Hka(-SlKCao3xG6Cbp3w*EXq0lv_7$(rOcDvRxYfVP155BR)B^ z7;kiCUt2@lbZFl}Z7+3jw&#dk%R9*JJ1DqR+nYPIZ{NX;k8Yv33D-21D~S5%3JCB>Mcu;%G3chUjZ z<%l0({kn1c`M+(c0B!QdO>R)1wULOlZk^rHf7~OdLTd^6YB*ErAG(%S#A{LLE<&N- zBsppcLkKjlL6huvUc3bqdY>FFu1)c25z)47o0_&7lGKK^b+$FPL4^|)E+kXiHff04v-k}(CO$wSZx3CH9j5O0m2bCkKqvJD&Y58buFiUL0B25qCf zVPo|MX=BX>wo%!jZjh;gb;BzSI-IO@Dki*h|?^ZNQfvuV?MAZVoZ>)8g^dJPfhLH2rS14CI`FK<}yLB=<5ajBt^w%%vc+V8r` zgG)V#h^3lfnj{`*DiaFIQ;IWM1#SdF(sAR3N>vwEuwY*;ZWP-M4HFZrvRUp@UpiF% z#Or}AKq_x-j%eMwmD*a0aJ2>lTJs3iTV-h#5z#6_L6uMIR%p~J0!0Z)Ypu0HijZ3I z)-1xmP1`mt8V8z(uD+DTa6mjoCbUCjxdSX<&PtpD%+dR<8voKi+J(NhdE>fu>(?vm zwDrEosl09-UvFNAjIB2z^Q@OdV#t;C8fvw5)~!Fk5f&arx|;lmtY8MFHairyDtMw2 zqEgBb2=+?t3g(72E5F08SYre$Wm`Uc5;WEVs>HOMGFIA$Ak;I2e~7i;!s!CmG;3Y2wqi8r+zTEE@{j`=;Vp(YR(B=8Kmw4SZAt>3nw zv){{iYw(IL;r-kK?l9FQ&?bTa!XjyS%M;rCevjSD8&Ap42G}%KN6D%cE5Ig>zb>_b zF>|^$XyI%nwY0Z#fEk&sw3ccs->Ne*sSqpQ^7A;$eHe=TTBN`Hio1O5N$ zT|Z0>*IH;ua(D|Wa&gI9Na2ofjvA>2Lk;B>;qDe%D_ir1z6}>8*%h2QO@YmHNv(#I z5`EU<^#S!KZezb{zggG*_8W-fpi2EsTkAm5jH8wHTw6;=ElX>a->m!QHSzhXh@2%f zLzxu_v_--RqbrW<^P(;I!mWkP5nDODRO(wf=m=RlL4kso)}pO~GEXThGtcPKFwEIp z3U?#9ntMb^3omc3g-gv95D5aCo5Gtn=gq8PLB5fjb3K(#A+RD4V{H#sfkH=3P|63s zE#Lcf`3fAZixY}}#%arIJipR`(Wc+l3QBQ^^smxyRloAzH0086>{r`w>wX+&ZFHIo zFbT&BQctRZC`oApXSj7>iNp4YRI$8BdlQx~#QqF}ROU#ZEzF4e8K7c$QP_mylVM-R z*Oi%HY0)T*HZ0DW(sm!^JXX!brR9uj5l{Rv!bqfSaXI8shJ12c=LMA!kUIQ zY0@}2xM5KJKwIQyH$oJZI(#6!PP~>lT=+vh?B}XE)5Fwz?y{&wY_YV2FZH8SRCR9f z)jr_HZ@=O&W`^#Tek%q8_^&D$uytzlIujotei%k^Hql!x=oP^7A2zVB?mHjT8$XL+ zm9d;kd*lpQm7H0G0qiL=_X}#+6oiFQav-^ydGMEs8ZAtzEnAv{yrw*~QAlHu*r;KH zdiCno3GnyxwV5m}_qcK1yXG)sv{n^iYGP1Qq;M;1tQ%$1E8i`tj^Yagae&|AB|qYD zRCN7M>}S4O`$bxlFNoVXBCz#2ry`~ww@_0IXhiSPTHr_?P&>B*Utwzn(|fcT&Og=< zPBYd=1-^=b-+BUoqY46j2Q+FJieDZUrZ#0^ys0}(Zi-iLt*J#+x|^DivoNih7G?s4 zEK~~#0DVCX>eUSl^z*U0ELM{&h3_l$AmRwcb<>Bd1A(V1h(5=cQl0l#mg0cIpv9n# zy7H%0t5*Mlqr`EBxP1*<~=MX zgL5Fj;}3Mwgznx2q(v)PAnrb#DP3iC1~d!`X&M^Zlu~FYL;tv&%ArI>s0kGu6`rQ( z+@>1ZgoHE>M!%uk{Cs?DHml8QHk)MGWRjW5DoawEy(J1nw#Z>6am7E-Sc#AV*5o(M zt>&#Nic%KxD87ge=ahfMDY#~IZL~E%SlExOpg-dst-+( z1eA4Y^}rYMAE;{O7ub8DlM6pT3X-5(Oi-RkN$BZ{N?CKa6rOlos*D^&q%HZb@U|40#-yjx*KQe%sbI`k{v) z6RBNc4=BY1gP9hzI|OK=-6l_fCiw3iFINqHq?Bz1Xc9}g#!{u>HkFu`B|?c0XxN|$ z57C-{I+1K4O`5>$7os*%L=B_M#=(snHEdKL@*05QXwkb=t}!vQ0&>kJ$^TQDPpx7; z74Wf;pkozwtX3e>h|TqxfBiSU{jn%YT2vCHE;L7BlyaO~4E?+c)biEV-87+r@wd6{aw#bTsxor6g-=BW|dGo(J1q?jyL0?I*mIJ?`tL!vI>efQtctiX8 zeq9;01<@Vu0|?v#5O5bodDmP881e!EfT3KwlgOwa>~1VIp`;?Q#u|tTZqleh1N2LP zFGiciik`t(GnpBBMKPgcOrnEOqna$TsqwyI)zC4z4kcw1^=Ewz0 zQ_)cjbk#(ea55^6LS5{?c*(NWll&~-m(slWkYzlUx1WAoQ|uw( zBcfc7yyym-0cfM1?s^<|JLzt|PE@@{ys^}XHI{-|W8TODL2De$8{44%F|_LW1^W3y zkyy>L#GyhovxctGiIdPx)K!{U&})$;|F0gY7;Xa8K@iKt3k^5E-OV8<-TG1oCm5&Gsjn&vfMb|f0C3>d=k2}f ztj}S46K6ySfJ072v=Ri{+ap0}5C{zhp(61{Ah(g$(1)e~e_tpMbeb$zf;a~f5vCw% zCbR4_AcvyVmV{2Pu*4uIElP{>`FVt|--ns1c+Vms zBu!CFa{;*~dZEjKy*mlIL}BZOmk4JDg*qS`k$0)jJC$b?fC%e=pn5@#8u5niMp8rG z$Tz5dy*dE_zE%r2$!5JDRAiFLWA@rsBTb07G!GJs3B|Q2aHh%b1()Ehg=CVs_@$@K!*p~0OBRd<8tU{ z>o}S^z<~%x5`Mg$a8`}0IyzJuvf^x%|Kf%3G&c{(^{TI2@smr$PbPpt1{^wC2n%NG zRtk3Gzxn@7i7Li~CTPVtm&RS=0RM6&Li{`!9Rj;Qcj8UPa>03>jG-NB9Opd$kOF&SFS77LA4$y@`e(M%ltcbTlja}y{l z7eAh(10?g$9LGF~7@9edCyImRfE1Y^Ma*S8)7H}G)1`|lApVb#ile0Emj4d%vwq^i zdXvOFs+r~zU7m#LNT2c#{l0q}EjgYlS9N)6rr5X56jMGOUPQlMw*|!AN=$nQM91tt zQ`-Cblgu+A9HeTXLtV&7wNer)RUf+gkS2vh#A#-$Z0URghgDG^t#YNp4tgL>2qumQ zTJ-ioVM&!5>kg~@+KNT!f>nO=!p%d@;G`XoCmU|XG#A3ogN>rXmO=A5*)qQSL;wA^ z=>&_?wX5g+~ZKSZvWW$rA8pJbS4N?nrM?b6%`e+acu zEvEi*tma)KKO;F0ZA3xjdWOS@EUxeUNF!VIH27pawHku=G3Y@TH zcwg^-T1G*l9vEcR0`^GFw?4|t%g@Uz&v!qP3V8vi(CNiK=+-g{Mvjw3G4v>c zrc~imQBILiOJOjoDs>}VD=)KtVfLTAU@>9t)F{)Uh5amYgX8v!Y;Z}e##BS+yU?E= zQ0`%&SZ06`hnCFX?ILDYT0){YQC`xWnR9F5fqoiJEj)N+=Vdi^^Y-D?qtu(E_jJmr zUu!u*ol5GSo9Y_GN=@e7&CScrXC>~maI}IVKpAv1NAgEHqR{=L$%8|GMNS4R5_F#!uhZ@A zPlt)Rovt)Pwv9PXr=8|)LKdcuo74G25ypw%XZNi4@7>48bx*r*x_AGc`@a0}0e={j z^)Nd-Cnpz-C@3t_xxg#63Uj%=45#806&4gcDtPqhQNAtr`~Yj@*UJ;3sF=ZoCB00h zrt2Q?!h#|k(}pu<5JR`L4oOcXxIj#xS1lR%P)v%|1q4$r8ZZU>2v>fIEde?o5T^I~ zhh!?i9yxfjV4bOUMIt4$$c`wg=2Ndpl1?ex)j2w;#GzR_HZmucxmc9*4jQcWpoX-cY;;z-rfv{Z9i zYFZjLET(H2O)~G@yZp`_g;{cT7Rzp$qsthCjARTff%Qp92iaD_IODVm zNlSJB9SHRR;0MsL@*Bj2G8lq$V!f7?T04WV zsKbJ;5D1|wh$VjFzATMTNx7FSrFfFH6rRe{>fTMy$h`kR5D!U!=0{xW(&EAbzx>?n z?1!Km0+ZoRw`HVfq~qhsu-%T7JO2>1$PGzI$H1tHvMyZpMLY8V)1UY5WI2Tf(1>+Es6f92({|ka$YgT@REd^c<*munoy933Uk>X$;fm&`8 zXsoo`z9ss_zz4O0N(GWn$@@~Pj|i1onZOTyV30P&`>$nMa&q+@DTyI*q#7jm9iD8u zlYECI*H1}JO#@@Vm)!hR+1lUi=bO*cW9c!mbz zgYQ28>A8<+NZ zf;FzvZrv14TEozYAjf8qs3UU&l^Xz^-meXfDxNT=TS@MAdl&QX z@^tAg_6mXaMuyUP+~>67$C%6+1MRwn>j_)XuPYZ*%%+Eec$_{`@Ex7Y|0E(5DZ~kQ+X3{&~iNNO8RCsS~y#_60r=tJgdq5ukNf*PU&K^nt{3Qq~})HZRbZx z5DJ)DbmUAqO{(Grt^)EwT%$x)^yb`uYfZd0As$?ce*ms%Nr5CAnL=woo&g$5OGq^8 zEynV_ju6jaeydW~3u>5e#YNYYlyepG(b8l|gNqcDG4ddU__v zCEbij(B8p8B4Pr$3dl9kwHIP;A&3dDES=ouy!zg!UWlo0MZ;M;ICdAtoAkVL=+ML& zVp{$GOz((45vDC(y`2%y6STy}Nq3S{Ne|=*Js@Hq7YQ{0YSZtgrhr(UBqt`ZL`RbK z@<($0DXYCYF)zv&;jns}Lf73&DM^u15k4RlLnf7_HKqya9`*4fIE9s0>KZ`>)f$&{ zqRH$Ad`X+F417tEoV-LkQVCx!)-6`TLs&PNV8!qeh_>YaC`qz0TRKHgWA-pWwRqLl z-zf-FxkvzzIN2X0>GktQG&;%<5tEBxm?D@ah0xSvYf87Pi91OF$*FfUz#C|Z;u2Ph zFoim6pdv^PlE4+8q{O6z#H7RomK1<2DKT-+^K$!{D=tR)F8SfTP;=k7lw_VFCu970 zQcTGy$!dyEa!P746bu;EOz;U46eJDvt9Q;2LxE#3gpv}W#YR|{06~um*YedXu^GY3 zDpqy#2?+WGs}fQ&3h+WN;f3CB7q}%}o52kq(jcTn6al;F^@C(bM;bI|2sVxX+jGl? zV3GLTDuKL+P@~RxEul_gQZh8fJ!lH3PAvABi@}q?+$`b=qy-ZU6pEBkk!W2OCJ&sy z>?%fv66L$}oBsZx^AeJi^OIX+W`?$*$@v})jDjLDYY1>fXp^XS(ZqpM|Na3tfxQuq z%8(IOc~P8Y|I-?A__%J6B2S3~VDIt@yX9mcCJvf6$V@}8pZZI+5EO#iLY0zz3Ib!m zP~?L8ac2-;4iWkg*6^nNmJ#;Sd7H)8Nl1dCgr3wf1~M`HsIZ1wC(EML) ziojWh{3!N)GrX=-;?M!z{~`|9^nOXX8v};{qTB7a#s$jy8yx8nEPr6`Fs%FZ%0g?K zG~J@88)}#rt4KcMPU|5K3vVKt=FN&*+UAkz2&m`zL4Y#u()dYa z&`5~VTNQ8J`m|5vzn7B%O6Q98r&+DdeYUZr(j@JU2HZ<94j>ocpEzEms}Kt8jp?O| zI6y{GAWmc7+jbm(@$J!aRp&r6rEL92hD{NGlg>wk2g+qKN2NU|b=XdH&0#)zBO_0XHZ6$?wLn#PUQl=~oWAwd8OCSMMIbr!avhKhEs1de zYH!`L-?omk1b^_ul1ovxALsWo2d|E2iDh0g(Z$J)beNhY=21gOkh_tYXmo(a#=@{l z7DwGSx9PW)B4$>WL8QBIffryJi*Pzv0>I2Fa|;274G3?Hb?$cXQc9Doz(Za!!ItVs0?NH=7ucd?yhTO4%*j z#a>eT9~Lhn`;wc5#FqvG?^QtK! zF;N9@(-I`(jRp`tDd-L`1zu>NRch4$`A0ATxT^k-C{u*Q^2$l|gZcl1GSBJjZOQ4m z<<)k%+^&{ei$4tpS9CR}gDNss5x7DEcibko5F8)xy9&L@*S>>wTZw3T2oz{1X2pSP z()Efsc7xvxCSd^zy(g3yteRrh$nyhx?hy1slW0izL zupt!Ml*9zHz@tKXoAADSGFYz#-7w%LUXL}-JP_Lzzt5>Qq@+1_rs=L)Yp^sbR<-n9 z>o*gUGxEz_5EBM5v6ZarK$Z#`6#Bqmpp|U#WRn*Ff~pBZk+7gFS$nL$ir{w?GqB>C zgs_OF>({PPgi4GMklg52e8QcSyO{*L$&L$(3m)YKWIxDEPZiqX)=m2j+ld$aT25KC zC}ZDHX`HhenE5k@(6|*nh5GyFyX_e6JB-@aLLxRlClv5?|EomTT7$3X@+$KuL_8VBm^` zB(Uc`#F>n5uuK#_%JT<%?xrLq#mC=5XjnN8(M=H|80~qS?dJYqx&K1AWmJP%cQI;FlHn%X7D0ft6&H}D0oQ`(%7?o&4T{~rf!CdoPp zf&U7xmR+NGsM?K2H*bMOsp${0$T|lRDkc^MWcmHAU5#FF+|3I7o=&NG{X|UlB7|wg;(UO zSL|0^*Xm!7yFo&dOf!sl5kYWJSoZSjWxrqBMsNRg4N{>* zSy#?#W*)HJean8U72pP8R_IO|M?!%ZNCH3tx|8b+AS3T%6DNVFug_N+3}}g?i$4I2 zgr}7V1tUOIG=V6<$YNSv;dZwm-def?tC;YGBfUXRVx$;#hY+DbXnG+qNuZME9=xc@ zQr~m2ml4qqK>@E&bVLtDLsazGl2;j+fkDKt)gxxyPP~Io)L-KbUIYMjr==t%+$LVA z*BfAr(J;fGxa(W~WorMy^6035C5zs$NmH&1c&~>!mu`6;2O*DdEaq|X&4pyY@V=sQ zRz$)f%)bW2q65m-tfZJ-#t0ExTJ=S1xH<_JXWhD$lm>_mi9pgN!>_a?SzjIi^~4lX zA0#9~-x8;ETc#lx#3!0?pnN1#Z{td;OpQ;t!@SMD8c(F21YjEb@H8r z+czN<*PYkcb?fqarsuz25*=k-J}c4`w%m1-kehb95zW=~iU-|OOz&mFj>}<6Fi3_K zS4WkExUk0i>q?3PMkFU{?P0|=P^G@cOPk7cU+1K|4@-qgC82<3paJ1SCfC)l-zZNK zE$sY4<{|gh^hQd!_V(;(P+pe34q4L zU;xqln(L~1%{ouAOqZ6UBkfibXk5%l8TavCPig>UyKy7}y-Cz+ z0=OKe(dxEgm?NyYq12$fExh%X%r#cGVVCoIJzodl0@M^l3!tgm17T?f8a@Oil7LT8O)suph^E?OHGRkGCLXlaZb8&eTm zb-6yG>|T$f5s+$VM&d!?qg)yQfEMw$Zd|9B#aEQ8)}OlhM1Hy=4QdfD-is}7HnsIV zS`$|l7fOM`#T0C)6b$@Yx;0_9B-&|mXiUD23D?OJUbo}HeeTBsH`i%L(6B56R@SZ) z8?H~u={d|$jDfy24iMxBQA2JW^%k9}h}L4H=<*l` zVmUTJuU@;3QBbP~i;BrKg+cHjBP}@*BOjFWE6Qch73+tAfvE%*P2}E~+j;6_cNvM)+a$DBv0V%v>JMYdF%j4u8 z|JYY54yZCcm)SjH><3`R#t_ZAAJYl0;9__SwXgTP$wTX5RQ-e;SoNWytHV07@3?~q zqj*VA?2-vZ4u;6lG1bv30z|4YVHhv56u%iF5uZpDkzodW!4k2UDh<9MsPJVBCFQcu zmCG+lO+Hz)NM}vm#S3P)k|K{^xvozgh-wWrB3(!5YXL&S2&W|rNi%fi6K~=9G(X_v z@1(dVAn4C4zPnd#h(~Kym576jbx(Wmim`BNN=(VfqhX-~hX%AV1#koScYA7mxX#le zGQn+wRZb`hvh>n?fqEJhq&EneVv#Unbrl7jyi^fg854RL5kZL^n4Xipx{{>;;Xv@8ZQ#Fqnn>r8cCqj{qd<`;-Z>fL(}bxny^4jp%A6T!k? z;Id(^6OfTYQs{ya!N{#qhm2&dqaYoIxsEV5$Q2rr+p%wtycqIx0C*ENcESV!ng}4& zE`JfF-lZ@>HNAic`4QSvx7ip#0u~vpb9`{N@?tr-z+&rO1`@vk6#?)><``CFqG6JK zA8+Of&<~&=@pxn0v9@yyTlw_;;YZ>Ctd|3JIIq^wE6w#rm~C`~j`hP@?Z8wk8E?sc zE9vNfpyQ1v7KgE;75gl7X0%c(PK!fPR{i=IIZ^KeIb{}z`GR4fpz~><xL3g&28tY4X7Q8FvkOA|^VzI>vUgm$l8j1&d;_ zDEd)*spV3~mFg=^@K#p~MYEoOPxMwwFIA6dgt&{nHp#!p6_DUG;*047hb#8&AJ*C= z0U6;mUJDrkrxlRg*qA42aHJ&NzH#7XS^)dMpjo`aOLE5z&hr%)DiBbVN7vH{hwLTm zFXgNdVFU{ZG|JBgZmiuib_ZCwLJ%H=wFZ64NKd;H zk8%2?70bh7njl?=*?~G&bS+sW$cI(8*>ZCOT^?{>l6+tM>l^|;D(5JEB)?!ePoXf` zd5*Z4^2H18i|QpUIvD)GSh$53EMv|fbtLd4m{ zreE;uD-__0o3Ljt8`IFY|DLK?CAO75@zf%-C$y$8)*DKb_#iC0Pr^xTA6Z@E<~e|q z#0VGmj}V+BZ_EFIlMl-XT7-DT1lBY36(sk>$NKu8F?&E3#1Oy?LL#FGJW0BN7Rd~O zG8Bl%U&4x&kp_J!1`Ug0 zvGU~@e%ZRQy(MziQgRZ&^3LL42AhI@JXaN?0?lien?mW_xCO-v8z9t%Fylc$#M=ky z4Z#<(_X?<~FB!uXbJ;RLO)p=na}b|a->HERe{>LeE!51`Ay;W*vcc=W?&ft!@TINc zv~3GC3#XDN_yXC03$vjzX(j=8$RCRsMoLpy{m1MiIt8aD1KSaspg_Zv!*TOT#Lv5&?My}9YYgmQh44){f` z=Zv`e|8VvmU{zh|-uR}2*hK`zt}}DX+$neF-nri`Q|?SAiDnX0Cv7IlWMX<#lUPtO z7LblD)@Y(2MMc0)5k!y z6$J0sE;{pE`3h7G+A$MARd8mLu|Wb!-m{g>fKW^V?dVko@tW1wjqRQt*8x58C6`Zw zi>0!vbfe(&m%}blsBfG~zR^2=;Xm)KLgO77)TeD6q~QRM)Qx(Cm!xJQ44H$c0#eG9 zQ3-=gnfFxS&O;a{@L6l$glrKm15^SJ-7UJEpPTj*fD)eQz?3g{kr4o;KsBPvM9dO5 z`Vb4jauM=gu9&w3Jd|HhfG)>?BT%~lA=pNlLxp({tuPid_u0diHWpB!rS4rrnt=Y^ zE?A2j;61R{Oe5E8eb$qnA?p*NjbpZb-|H7Cw~a+Ibh$z#;c^P34$Y&3GlgP15#riJ ziWg>L#1~A4tUDfB#z|rxZef68_K~sSf%knO=Vfhox+0r+?#I` z5aH~=LX@yAvE&@E3^5PsA2iCsdu|VOTaOh=$@_17`ZQ<)? z2+tJQi_jLjNGb{e&F^wq0_N%F5REwz2(%!KtCdK^48c=?>{hf|Q&o>-%w?%D<3QF8 z(g0*N1~PCh9G9nN2!91?+i$$19HaC1wGwN+@5S_2V-)P+!CH4f4fTZBLDVh9dx zNBE-9N+FEXJ1LB>d)q9(=XUIe5uG9+NgFBqz-QP)AMJH-TY*)fhx-xP-e^3dEz zd!`}09-Kr`w0ha#i4bCccKjGXJie<}?wj6^Xjo1EE5e))qavr!NTCh?ML&->vJB`r zt`sUoOF<@Z76Vc6{0%c>qGP13I{)m}r&hmF#aWA4mzf2X%!$l`dd(oJbaIU*Qvj_R z97%AP+_#`SEU3ebPKyxnO}iS2Uv1^RyF~?gxggWEvwsBo8ILE%eny&zo13|&MhrG1 z7lq2P69UO3ZF$RZWcp!L9(#6d%60IPG$B%_gQ8mz3ykUO2PySp7P%c*)&&v>(74_Z zzyhwd!#Fa?gUXPkRYqXoY<$df^)?8ePxQv0d(KMGgE(`UTo;$zLlj$mV=FUC$lAc+ zq3Tob|L06(#2gCXzcz&2lCH?RM}I5v-6wuDG~#E@B|S%fn~oC-*>pxc476 zw@_SP53&$www@ry80s(~WnL$bc~Me@6D5PZKo>aEd`9VLPyQf-pK&bp$NvAaJ*FPQ zWr089g}FYzI->`)S_R%Lx&xMhb>blks`U>w-%UO6`5#uIf|#G+H%pj(1$eoQQHE^L z+~mmmY#oW;cV?7P=7F+Ac4%WbR%Q{BtiGn(;@CN2pi?!Zi;j(bT{uGBhjiV!olnAr zR)-nu{XrYz1#kyQGR`@8!%vSq^^m)2h-7Ab&UN}?7^eT23FA8syU0ucr;xD;IadfT z#(`c!Z*zwM6fvO;nqm>Hl$XS+SGbI`sOSt5Nv&4XN3(*Si-;=OJ1yq_cq~YQdc&8L z??o>%V8n7z>DHAismG5Ti4G6n@a*&J9{G=dTD8Di5CWI{c+J1h4|uYkF^@RPjMXf` z6cL6f`AmKDhIQiw`Colm z=Jo$Qg>WDd<~;dz1%=N66v92hXd@da1CnK-Im`iS>5?ujk_Kg~(~1l{l*vOnr2fBz z)m!%L!zLE_Lt%0BH{ZCLdg{Azj zLRbCxKi2%|sP(!OD%3X_?6(v1cY9MA*D6_FyCY2V&Xm`7^LON)U9 zZ(P560wnV6F{8qHS_0R_3K8F z*am7)!Mp*hkL~`3e|V)Dd1{oSXLlh_&sTdg)bGDzktMDmJl{9|i2x68A77V`C(0kd zzJsSwgeBf{f`ga;_~*a)?K98)Ief?V9Xlg-eYtxt;&=CK{s-Zw8lncO#B*%SvsuX9 zP0jl_HNs@`1C~WjWl^}ho7YGO5Nz#rF=EUmVhqq$R9{^VosxI+#x?1Rl;eH;H=qRR z6fgiL1`^=8FjK-j697;(Nf87x;&(;QX{Z1oc&>ahz7BcKl!%JD8QykG9SO~TgDJ25 ze15>@PJ9a*csiU2fAH=6aL%HaqY;X(z||}48-!tE%j=K-Z1pmEg}l;h`Kq7%TK=Wi zuOE5o4du0g&l1Yd$8 z)OSy%h-9pIdnz=h_&KJ%2^tf7j8o*{{pzxkq5^QoHEL<9WGgv7dzVqfl{-uVa0Y@w zaxy^`q7IpLz!%(dL3SO!PvcVvjrWQdB2(|n5RoC9kG-Sd;9vh)7CdL=810ms3W^90 z(dk?JPrg6d6vg7yB}4+yITMuG6C1zllegZG(d^#qjW<8qDsS=Hx+DIOd_Ye0i;s(q zjfswqvOu`@{)^8)=2#nP+p!=Xf?`ow0t>~W#&4@JOXK9AfLto8a)RftOu}>noE*Wr z5sp>Zro+eqVadr6v!|tf6vTlYO%ra}3+wsXAO!FosLc+pXh(l*sbwCOKRqMaK zd%tVggzRyD>u_(wy|j(L_7(+?uvU^3r$csngB}it%jt7n@c4ZcOYI>h>DueHFDg3L z9w)?z`#q!fq0WM^Zy1~tzCu`Qkl4hnECzx{5^|emIJ(8CdO|d0^GH$xv&?3xCM48z z{6C>5y4z{H1xU-kb>rIAD>>OYt}O4AM+4mlYqrXSYbnf*!!?>U9kf}>9MdH%!G&=I zu?Mt@;On*Ex0_Q+bb1sCprO#oP!37>pht26@IppE@;(>lhM%muM zy*^R9UY{ep-$1L12;&A8B+BiQ6eN1XAgYsdjh%mI3IcV*too+*A;2sJ_NFlw!b+2? z!{iVybN%|&oSf`zXO_pwf0Joh$sa>2M+%ND>=+)M>;*JE!diS0rv=Pk{)3-9`O*6^ zr_Z{+2}q9H@b2UP@{dbHrpY)c$tX(WG5d`{r(MFNEKZ+?Z+e9MC6SD6*RWzT%_{bb ze-BuGn9YirnI|9;tgYzg;&RVw^!SGq`^mr~SrgU#RRWKMtJPTz5B7I=U{=`v3$goO z!-{2PIWGI}C6^3Mg>7{BAK=KnrI7=I7?+rn=X-K@m4n<8Yymwb4^i-%HDehHlY9Mm z#hmFb0oF)5E~7xwlKmrSyycJ_UQlQ>%ZuOlz`>Pf*@x>Po2iyEFZL#W66W=MBb%&q z#El2xhJ_3INWvbpxl<>Ls@ur0LfW}%F?3tT;DBaGc>zIFI_1zQf-fN^d-Y1ToMpcp zxG99R6c!E_rQNajBDVI)6ZL00ivA<747anArUG3Y9yY-VHO|kquzLI`M=xUElAyJ{ zFh%0cXfK}^cSp5he)sok_xfRO@o!BNA|DWUqAmgj9ZbS;QAc!6npy+lxS>7&1INLV z1y5^p*NDN1g$x>{w6-2vMgZNy{9D+cv$L$1y;I+w=7AFu1Guy>D&WT}O>x}2$O}S{ zC&lFsMWSCI%|sV*fU1!^9O^DdlVzJ3X8W6Nt7LaN6p}&->KL=NeI(4@kVt-aitID* zr2uaQ61n?HkAPH~Gns&=K(wQPXb5fXS0~Lfpvcszx|iL>onXFW;5EcR&Qo>XEsX&9 zOygkQ&dV|yrUqU*`CK5N39TwqrCiN&bBtTZfCotP#AVAYr=;-IhQWTD%xEi>T6ujrWP4G5~BE*CjN_y$6o z2+yR&I?}q+`eD6Ljh4wQZ7!(I#>qp|<2qR3IvDwszMn`0IvjeZPx3zn{^!=1w7p}P zpcLsFb?EgF&v)BtZj{zVmd5em!K8R;P;je2Ai`bvG7bOKz`AUkK2DB6%o%9DEzjP~`t!bd`J~JXxhaErzBq_C6 z)Y&eTOqGZ=lgbAAD;l! zlvDf#KiSvQ#~W;?E)cCMaVRMrs=mgBkqO`!engAyB-JYjzeSB~t3#%FnVr7Y-v~># z>}9d%U3*31%gCrGKtKtVA*ov8j(_!B*?yli5I`VMkD9j2P!ILaQ-x79+<9jcp&obq zpIYm&2Ae-(7+jcH@Yv`m*=V{unn=6efhxP2jhUG)`DMiXowv`l=`-Z%Go}Tw8b;pU zJ~S~>D;7_#R!L0VP8xMGOmf+h(I!JaEe9`agdYI!ztM^1!v^ATDh{L5*WQdCGm*$L zpb|RJH7F)1L`nNSqGP0J8J804{pRXff9hkiBtICQIBEy%FI@S7SL@f3237jF#kfsZP^0XOz%3fY5 z7=$_|v~;9?h$YQ5MRrvCk$fI}q zcE36^?A6FfnlFL7c3hr&_d!IJXoZ$ofq6iPkz$2tF-D1=7DFV6`KjkWbvW775q|Kn z<{k@PQ*&e}C*3`D^dw;^GE}3M!6Y>e6EJDe&R3gZzaC(}+6rdvy^?+TGMX=6G+pr8 zu+q;5%dAcwi#|)9Ic>)DKol_b^FzTd*@r;W1hVJop6{uoju^U9NkRSz>q1;@|ZnK zp6!~Y%oM;B-e8Jp0kVGpEEW(6+OuWA6NZWDAVjlQBZA3MLN59|G>I+sIm(q(Y^ z490r>WeAb} zzxMYDoQ)clpuh}N+d~1nS+nP$1qgj0%n@fRb7W9So~g|6C%ObsIYik<_7*&C9<0zP za`Hq%ETsI&7evJH+0o}>2Y!&E?nUoqZ^rlUwW4$^QXwLJ_G4#@j+SD)*-YhlF;0p1 zh>LeJN_bIGXkQQlrB*>6kR(1HA`*}9zS{W%-{*RXBpj1Y!D_KlNK+qB1qJ1-r(!j- z4iTOqOv-2yGKQugWRUM{dsxpU4m@({(ghI3FYfn2KGSB-!NkQmUPK$?9A&mN$2nI( zT|Cd3GoUzqNnU(?d=X{l?Ly%z%pdHFQL>Q5bLfUn@WYnlBF4_ZdVj?l2vD^TJjP&r+d_D2t!pG6_>X+ zH`D^t0UbhFT)c20BO~3I;g@mdl|XO*nRDei;#}`JbLY;PW16eX5#~y`zt?HTcV6SR|E@r%u;t+0fdqLWk12!NmZAB*vP;i z9m7PY(K*u|?m6?F#C`jsq9P;rM*$Jh9!V-9ULrQ3wFfT{Ke)g$^hy+x+%!%|(IOx${tr6tz_6 zQ7u(vu1C;35pPgrl~GI%0+H~YI8O=kn1>JX0e%a=&E!m(7m_4n%aIuq`6Mn{ z@XVgWu0#k;qE8YkHzy`J@C~MvfQctbiC#&GiTKtxDS`dajwyp0Np@UPq9;C+L6@W? zXQG_sn|R`l8JUg}7(R@&BZJ5}2jw_3kak4jf+vvIO9rfQWY#`l zH;9~Z$TzH-K1%Q0zIFXd7Pg=a8I9guX}(`QxzI0QcCdcF66BmO2bpjwc;Al;uffWE zA=o+JKY0F(WwC=`0TEK;a$20zTu#Rao-4jcJdlVdcO_x%ldz(Am2qLRNtl)$AIa=v zA<<0J1PxsHp8vXtUqmJPM2{r=lFz{;*geXsXwhwmg{@{_^hzeoSg_eeAYEOZvTO9r zdjO-XVFCrdkr|5xEg}32INXIP6AmHAW`9?EQ$tNT4&Umcr_1P^E~LrmqAsU;q^3!! z0q4(bTJ7mSGdN^{8KtA`C>`xmUv0rMN=XX~Z0s|X0LObruNW-lJf6hz9TJGrF7$yhB3g zP5YJ1j*?c!>$=z_%U?}Aj7j&hsVGTJY+|Dae2%>syeQdVL0B2k(ImjgJc*Qyu63fK z9$!HFz)nJp@dv3+AST8=i3p-0@sS;`9wDJph`+mTf2h209u@AVGX4wEkLy|3 z=*S;p!`ed`Q1=A$A^D()*IrzD>ZEYUg8$`1zK0Jb{+sY` zMi?`l3KFVise@J+wo0<+sQ`x|zujmi$EUhfvb26Q1^JCTzaF*%|H6T*7(&6hFa&9s zb^`b-%D-_X8#{S=8d%nuVoI5Ia@SMSeWuTzzi4roywGP6+Gi|87YXVl;YHtI=IXb8 z{AUXnii?DW@*+Eahkocmzpg9-0dQgVv;Oh83>OfeA(~WV-mgjc!q3%w*WqhXQx(}y9IrrZCu(f9t(Jq)Nor>u= z*x!xd2{u!}T+9?ADxY_y7*b{(djHoU-ht>561F%jY*AR4xX2@Hp<|IZW*HVH@z+HX z+JpGur}!s_xiBTyBD8&BT|>}0geExim#D-`IvI|V?rn2cz5O*-_b^uXFjn`lh^rs( zvAT!Z>f$H9$KwCEWc9%jQ6C7Wx|vEYQQWL7(aaGYN@$IYUkJuxroQbBW{I!yVr1{Q zO?~5jJ~!&<85=b&G-3AOW@hUnD<(fJWoMEOPF2o}DMGRnmn$VOIVI)DYd;DGatjR; z7kh*)62p|mm=oSEc7~zr3;Nu+)Q{*#&M=R~VJ`ZqCCqE#^fl#9xWHw=GCNq**IDtK z8Nb?j!j7&rW^^!;ad{j*;=qf6zjfj#7F^cD`oq2_<9|Kpmv<4gG?N8z=?zrslhc6W ztXZW(X7Z$R_P!ba+$v~=?E*FGJ!pSzWVfIM#Ti&s$WQi(DZk=BS?hI z;5V)jYE7p;swq(wz0a#id8|Sc2d|jm_mH6hE0F@@G(2uGf~?nG&1_CAD73GublYE zg3EeDe`L|Am>>DBL+lm;{&*2OR68XKK&i1vb4CH+Pd5}nb&+pQqON73L3C3RvK;>EfV(Pe&*>l$aD{X>FLK0EImr=*xL*`n*q)sq>!em~h;FOgTP; z%lp`Id}PGC!DANuui)|uU+(c2xnUkJ6fr4X4KwXV{Zb0jRIPu^_(g#03ZG>YUqkzKgRc(KKR)XErrdCsf`G~#*?jpO_Rqi;A-<3M%;>#T7962%>cA@0`1RNRE8CTKN`P@fYTtjC|1HAiW z-zT6=3yn!@k^|yj``1;o0%pz&T_P_FS+N|;OkbEjHD6=zmo8t<8nu~05wGR=NLuQx zHf&qC488YOESVb^Nd=Dw5#>y^u2`jF=sm?HIel;aCg`8nKKr!1PI+2nmw@-vpI-O$ z)9cnf_4LzE;f=ITcuIa+Sw}ySpHkK-PkF3kzwBD)iC>Y{c|5%iKgUm`rxf-o;6wRo z&vj2dC9ey6`pN&8^V7s))XzZ+hK8p0ZWcwZlCuX}E))kkpf{?fzbp#4`znF@+7T(6 zSpLp_m=MWl`L_rNhE#*mo3Ro4Ok(#~sG3M9sH)m+OS}kPg68N?4m`8%k;Slk%n4q& z1Z@aCm#si2L)S88x%aZ=ps8({uw24-;xaG#)`_>^G|+IxvatDqD-Ke@Fsez!s7T7+ z0Vg!_H=X{FEXU!cbAskLW{u4BB741arZB@XQ<|Z`5(h)&3=1wRd(S_k_u|Zj)2FRV z&dV>nL#+iH+Ymyo)3cmVaM}>sAIS*aK@D|T35JoiiLkHg5=5oPXoMspdX$sMKFC3$ zJ1Ya_xLCgw0*S-aQ~-j;DFi1ASxXR`*vM21^fWl`LPlz8ibryaoIL$p^0{-#bkUcX z9K_#zbNavs|GB`^Z&pw!#BYVPk~MZ*VO}n*7(~BEW#!@(D_1OC9JXLifXDCBP)z_S z_u0ng!-W3Aw>9KN!xYBn8 z8m8lR_LZ(xhSj#!_Eo`)Kgqd4Ef~u{ruLqG#6z2Hs4*ZTiyjmr5`l{dY5`1>TbMyD zH>w=6t8`i-+j=&Sqe_-U>!#DgmM*OcX9Oz$4%Otq1s^ff!iWM!vLN$Eks2o9^f;d) zCTq{h$@5OdMZELK_xydQ%?(}zNyKBXT1CY1g5)iiFelpzWw{IV`TnYvE2&NF$`#9& zEeQ>pEhs`D+|{hiw3Kg79Xos=F)lWG ze^fs_aAKq(%C(>Qq{!Z6hY?ARH^ha+oV!Bx)bEzpz|GR589}-R*IQb~O~g^qU&K&| z6KI+6x-v{kefKy+Es-s4D5PmvNCwuj5+f|7A{3h9cZ;0J!Dr)Xf*51dd^CqorvDK zKLDLT$Q4T#g#^u>9y62@>cDmXcfxz*RP@*)Tdh0N8k+ zdY-bSx+tZ4q@`-olyo6&G+oM&FUS|gOU_JOmuwe9FJ)fN0=>Xj6%_w4&Q_At&(Ms> ziWGoMlZo_Nbn`mS zpMe=rPsvdCkhHV%Iq$RQ@J~ADiT_>63-KXIV)O^k{%~1nFxpcEF9=;2wgg&fmAqPy z_QO9|wPM-QutkeP(1L4jQ0U_C{hz<=PriQRW-eB&6b-3c#>qukM~1pu7Fox$r*kZGGKScmvq60 zzY{=QkBkd)#`1KslV#wimo8^hminE0RS5X%9RxF~TECAmAyF5WUk;i97RmLGsK7?E zq-r(ESjJrcEGlrS_Y}tkJNh*kjgrY*r7)@gAUY5ZlXe4iMCcV6MXqN1GMP<*a+A-Q z&+5+wB_G@J^6!2)*Tcs@aMql8!HbsAmP-481Kmyke%X?RA;I%z%?R`ne3$+Bk-tV} zT)v!@m7T*lrKEyUbdZ&`uo1A5TwySAIcye_K}YP@NbEwz9hhMuHLVByHZ77C3S`q#RFgh6-kpjomvg5#1Rd*kp{Cnn%BN2 z*RtD+*VxuGW@lPV2eu0$*<|O6-cAJ9BG2PaLEeo(ex{;rF&R{`o;92c2BV!hdN6L^ z&Np6M^Yg!76y)#gHw~U8_)y?YkY)$ZnLTHAfG>I_Ee!s_FMjp>n_Hq24<0?8CSOo4 zEy%o_4c;#-sXzg%?!KWBs@qE&B#}pPE_B$fW|iR{z*JSh^(gp0^?ZM7O_~`3s$_&* zymUF|+D-5anzVKF4kFh~<(DxiFNf?$lp(rE6jy<0QnL0Tp_6C6Y%4O3lSZG7jy=eH zf$RBit$lrZGnBl5u8BcL6FYLT@(>7Kqdbp01v8kfmmRDLfl23_U>JMyjMK*wcZYBM zX#Gnsz4*khek1)_#--rs^!OiNdF9o&HhdbsFXrgCV%kEIlZ*=&FJX~yQAVK4Wy4Hz8c_0! zN|f2eFo-&#BN%5G>70Ca?A&Ow=eLPltlQ*p&n^4Uh$;5-9yp$)E`p-Cfcam&Sx{Vt zhHagYd{zSn?BH6A*}EVvj32a`-uC7P)n(+#%7Kh#q-kJi6;lvco@U2PA^;-#K%z$zk)jap`0_Jp>rPqU`U=~#0pPDoQx zX(dYW_Gq-@oA@x~Kx7-a$TWl<JW>_KFyvf!FFgq0Otzf!NIv&4*_5KBE&!)vb=-Uo zxB(19_5j$-*u;ZrnGIuF4g62_)Vu&f8*HI(v{3pcjI7C30b63^xRH2H}W+XS(A z26NI)X2tw6W5}=B{K10G@EJIoX~fonM*)>u_2+6Gt#Md%`}(*f?Lq0)o>N z({qq(w$iPLX@TR2_IKi)w6p=X%r)+*(h}dy=L&-1wDALx6(CmE)5Jh5S<%v{L{RL0 zq}lLw1&Hn4x^Z&^OTlK9VBGdXWPWuHo8Z4;3#(-dOAT;Q?G=LU&p{ey9g5Nv&6G*b zqRFqrR15~kyfJYZU`;vaOPB+Aq$Sys;(0!W3pMBQ!jj6mMp9`^JL4>kMr4vRn4>RR z=_a<)s_#U`v`Lz)(i~}v2}P)DoQpMfZ-1&j(;{Ypfq2sKB-aofw~ctR;gmWox(Q)z z{}hH(s-k$>4N_I~MQGk`9AYF;%xLTclMfNWmk~ibv`EvBm@9Sdiz%`fR3I{Ni>eGW zlX9*p*_=WSfnYbI=ku)zj80_+AmN0j#>JZ)&}6qmJu5;}P?p0GXN7^!s&pIQ{MiI=1@>1eBu#EHdkjZnHxXgxbp;+UuLuuO}xENIQp1{MJ4Q~n;pB@x$5F(x$qR1p^C4yZRQJ)6Ih zwg@_j)TX*@*x(J=hbR#o>U)7EX$SUk)0)HhvZzn zhM049l5e8TZ5+@HAR0S#)~P8bPBkegk^fiWaBVo-idac z)Xa@e^WQh%)J4i3vjxvnHKr;oJaIiT53x*azRa~Prnype=bhM_lyoo1JWe!jXp3pX z^w5kF2vB^~cEsrvq3~(txx(*mYlhLDCp6wbrm*H($#utd`9{diTX_Y@phb^f6$!fW ziwUc3g&mQ!o*>&<*g^w~ZNjv<2YdTXgUF}7+%=YhY;J;ZDBVJ>8VJHrDFs;6`rr&R z8GG3pk0Lu(#>9U}s|?)FYVS}<16pUAIc38m9UjSKl#zlMX~bJzz_Crj0Yy$Xrb+1{ z<}H9zmCS{gv$C&Th2f>B1okOBfB!I96yWpW)1RkKe^`T%T{>G(WfZy4i>dluV4dn$|QhY=7ZB6nTTv-!6u%VpQ-abP$Q zfZ_;MHz-S(YiRE1Cj!vYlakk&Wi-Q;%s&U;6Ajqmhtxd^B!dWb)x5e4t2J>8EI@3U z4N7EXW?st7#JnxIq)hp;oTX$h&Ot)vwd-`4rjRtGy^yVDWE56^?)Xxi^GW*Ybc1jS zFc^xavI4Slc{QrtIZ^Sv z+u+Br-5zwkjf0u&^|!_1@zbQLXC+BLk+fuAS$py z&6H4bb6BkuNmjife%K=Cr9Tjy|3LfDCDsF_>^@`um_4(6ov=2~fG)3RcALZtLR7X= z^5s0ET2e$VTzUt^GEh;3%FeJleyn!*FgL1$0@w~0Fbk*MYB3r02xcDwmC=N;qqB3Y zL+C{7I9&amLKixBb$NGo;onG?txG|Zy;*4g!#0oF2<$d;eBK=!}sO)L>Xb z?7;{_jeJl@9i*v5CD<}l04+r&Hy5jBC$eHZO4$l3u*1rSP){J#RHt@&s2HLfHDZ%s zep1i|rvm3(2U2jYSOSbhwP=P0hcq&-UerNQ2E`#^P&?!pl7jB$15v&~>C!iq}37H@Q5DUYxK?+h_8jW02WIGsoO9a~TLJ z*uD5#+A^pMWM3a~uH30~DCkuuwTdk+D)rLgjd~|tU2^yAi8h+dzlIs1p*o+i&4rqM zh;s9>JCJ#Al`WoDi+PxF8s1rkt$z3vKe1W+ZDzG)EDlgGYZ%!)1<;E;AJB$69zH=< zLUIfu(Ev~|VH*;JRDPFC)$eZ_hk`tujmLHY3XWi@hfKp}JEm&FRB3eD9?4ip9a>Ov zV+5@{(I8gPhyzl;sgJr@`fI4b0*bY1<&hw8A+?7kUn+GvbvQ`SEiQBnaR!j#4=Ze^ zWZ7Y)UJCX>hd(}}FQ)_PrdWDvT{Xl`HaNu6R!>rFB!COsC$nK)ze4E~)c&x}1kNX| zwp=n6y-VSp%)B=>Vhz9!D+pw-MVDxoMQ@dC0yr3*Ef~I2z*!1<=gK;1MAXW|qE;MH zbn>V~{hSP#I9LliB)s3AkVUcyn=lz~5fj3iInhfP4VYcdc9)0f>J>pVJUuN0T`oNO z7!Vp+Cdt~w5!$y@hq1){=u1TXb(Zu(39`)m=0<36rXpZ>06R22x54T~4B)a+l?vJH zM^!u^89?ro3xwn+qYsFV4_w&3WK5EG7Dm#>n9E8J=MYE1GKz~j!$Unvir5P(w34lW z$V>`T%PoaKRg_hrqAF@KsfvoIPv@wLfr?An6kDZ&iuPVT-$5lP$}z0Hh$kMiIq+p{N2u(^C?3a$Vu78GQP_rD z&QX`0o=M9Zv5TnbA%RK~9tjRlqLc=G7U+rkm0;Mo8d(?+Y$59AkL(hxEIrb47=0pD zqYsaoCtCB52wb3jRMOwjAf$OF+uF6rRtQMSkM8D4ZdN_JwPac z8;Rf^ptMQ00cz|jVUPgZ^*KD9s%?aYhx0lS_1GO7SNdVJoGxdD?9@1D2|n zNFsuljWFX0B2+nhD3UOg@CI#kAdSebb~J}1vh?x|dHldm&vPK|%O30a^H^F~((05= ziJ{2G)~;b4ott%Z+-3JKAkIEE)Ml3s*b(%QUGEd=D?oH9fv zO(KgH1c4gFMf^exOkJ-9aR^*OW&S(xaNg|ENdI7&5c@Z-=9#Mkc8q!x3S1HYA};Li zdmFb=kuJnTaW&75bpY4cyv9r(W@t-2)Ss#?M{I&!W>3X({0EuYkxY*xppzG*+%<$p zlEhA_Nv7&^Fel0UP(e;#CQxKh7+2mG*ztP%J@*4Gkx*HA;&{zEg9vP=RCWLlGbQ(8lL~0b0Fkgrbd`FjVnTu^$xTJ<<4lL7k@UBrj5?P zleG2rJcCLsY%G`FVQ!3xBcN)}h9v=+ASN$jYSPyhtfgc%qb0q_HIN?(B@P{~z2epF78UaLHatA+_PtwpQk0el=3ch}*IeZ#fj{9P# zYG^upz_gThW21=vj2&Dddw7GF0~tt;-uvL~BS2KmuE7&_RJ| z#Adk%599=)B-%mR)Z_Amszx+4B_GmrwUMgU9sEd*nL)*!@k0@n816vtPi8BiBLGp# zWwp>U%5HUSup7yS4~+!z$3iNi7m;WXoJCMn5Va`3K@SLFBsLp&%n{3XE5Wph;Jn6y zK$*%;h&%?BJ)%CEV;JE)>UoV~FeX8Boa8M8PrzY%ixZDUTZj(qC4uK1jB1oipk)+; zG-|+Pq%jEsKvCfuq=&MCySn5)6-tsxjdZ5~LJOp+)GdX~bgFqhI!Wsoe?GfrJN2`Q zMZIEFe|SDCN}>TR zTL(cY3$&Gh$Li&Jlfe;BmBIUn!BtXqgN^VOtn-k}^4Mtzv@_(3%$kDt=Yw(2<>zhtB8{i-*3%eXJ3ZYTzD2Vsl)zHTP;0HFMEzUnHz^l z{%iTc;XxG{%DADB?4uPXNfj@uC^}hzPe58I$q}=S?I&ie6C{2R;DbWd1xG)DMLfh1 z+iWGV51c~qrw;4kz|;x&w{v4O^fSxRRnhd0+Xna0tTHFrDF26kZf@_@K^eN3%|VZo z7*6nD6A?=>YSY`z;8+T!bBr)1(YpLe3o;(*XA0R)Qce8v0K!BjQsBklmO+HZk^*D~D@s(^eSXx5qpSf( z>1DEGE-2(ow z4t0{bjAK(WmnERp4j;V(qf7STSm@tz_n}+A)zvq)K>wOW*bDVIR1j1iBpD`J2u_g{ ziw+tN*=x84u`5Un1IeOZgba&dSr=2l@KED%xUmNIO!{ZTa|(l?dGy@%5}49!>FkHcn)#~9c7X=9e7%T=&Aj4~-WkZ`h@4XRH_Fto zfSpSgJzRK7L2_b4CAKE%7O`%mo9UckWzQEv{$;mDMmQ2_b0d2~0RV~g;RudEeACx3cL}zxLB>Q*aSUw4fX5J?3_F;5 z=BSp*KY#+}s>7cdhGn^q;r?b8+CnYY-2pp3=rZLjfX497ac2Dul;@F0%k=kgGGM>H!6L!6bpQR11>172yWZ4+FM%CnFH0ZT73X7(`GaROG^=8HoKmaZF(~pKIh1H{d3v z32nd(J(HB?i9-onD-7sgV8DWPV{cg|>hs?toy{yJP9z zT+g=pemazJ)j&$gil^}*VH8zP_ojVJDwoN>Y-ey=f}jCGf|HPUjgx?CeBd6Z9ff+= zqz7}3X03N4?r{SISE21aI#7!%DPOYY;omS<7dBEA!>akAUqvBin3DY1li@!C*%GRp zVQD1ko@`_fMn+QFWC0TE9k$;&0j$X6dy<{|kX7@o~_$AGrbK114S4EhxNt;;s50!9;#wxmjj zNSW(J3)qRQp9HOGKPkqJFQGmY=}vl(8da+^i-X%Tv+tyK@`Ef9ZG%wkJGmod99W~C z85DbGpPrVAYjv4UxHbcXO<{Vemu+#q>O!HoF0l~)aq`f~O_Yjc>e+?o!PAr|3v67I zv-P0}6-4437_x(>8C`lom!%RQ&X>qs#74uzGZ!uSQ_;a%nU?F z#q<4yWf3yvLnP6daM)lcj4>OcZ&2wGXKP$`vQ-fpv9QCL4o@OT&_W;w*F6p}EQ`xO zi?GEImhD4A#0^wb*5S(@Gd;)T2QiUKcAH~}U#Z?_c{TN}?dTeEj11^JQ1xR}8PknP z@C9h}BL*Kz{WBUmStuvAKBLprgu@Zqi$X;en{Dv)!e;?Xq+oI3)dj0AOxqSO*ecCk zmc@2#aEg=aGoo}IMUmqub_QOO9c?D!cJ<*PaZ;$uSdaRw4C9}s`mEVdK*ePUO^2(4 zwG&rrMrwtcp;||+7uv7aNwuyz0qzgf)32+w@)z0tqST_lF#84irG8vPb!PlOf=g!K z3HTfO4ff|yMEC^hubFCK|ZNk|i)VOdtYdvaeAr5#e@wY;)h`y{& ze7hKt^xaycuBQ>EX_Np%6iyli&ctnhU>u)uA6Qe7!kqf@x5s@XshIJ#yka=@;NwE? zQyJ}rEv!|UP;OFRop_bt#zhM&xOC~ASSFP#=szptRaRg5Z;0yW^oqXD>hJMa7yDhh z2i=R`f&Ya6Cf$kd%J1a9`Q<{T|RzcDJw%A_~*dNCtUCEcvF z6#mh>MNafVFyNAksARo2YmO!3om7YhS=21+YGGnw9{Oj|2h=J79ZMFJfx;y$Zudee z`0-#|`0dfjgA+rp79F~5H26ZXFlvySd?~*ikqZc2fYTlhYWSe>UtXRoSGXnR3V9}6 zW4YdWxp}#{VxEvI#=mkXB;#p`8s67xeRG3q6D+g|uRR?EI9@7Aqr*RJ2lzg<{-r=;{w9&(s3q*5$= z?Dia;W74`1X;z7LZ8BNtsE*p#XRnl$VJU8-I(;63G%Bj=Te~_tJ34J0a;IlUXNSGh z(dFHZ>ib=eZttG%p6+f}kKCj5diM18n0jq}9{qjRe#?MO<2k6&mVX_pI4MmACk!BV*!LxdajIL!i`1^Vq zN^a#`p#YfMMR_@yG%2k2j#Mq>fJ^W}5wp>xmW#IGV;`VYEY|yI^6j$HyG1DQi@c~3 zC?O=W^bZY<4%&zG!$z%uM>6W{>}eip7KY#&0?7}d)+u^bChAYm2;O#qk)ic8cZCV-4= z#n^ZjI<*~jcW&flUk8P=&a=5iCTgq{94=3q+cME*>HG2%npbLq&1km7FVAZ{=m9EA*kb{n3493hJKv z+)h*XmJOfp*b|#sQg}P>a{5K=OSj?LrN{2*88kTAvB3eimt=F`jO>8J!T@W$5odu! zB~1x6546_aE5yEh`RetXIj4^uj*r>hZJHQpfN`H9E_E8(KH2caj>xRLMS0mNXVWj| z+(2wDf|bx#s-t(v;8I62*<^JjtTP*_g^je(uI;F=xRVPPRc2Pst;@$T(zZ4O%NUh$ zx-=*gL+R^3+VI8p^t%OlslbaDaXPzQ%#TB@9lgWI(i;O%b68C{eeg*cFexXxva3U( zhw#Jd(t=x85HX*5^~Qz6aWUKK$NtAq%i$m$Eq`~zrc=cQIbR<=lahWJ5&0}I23f7G zoqZ^ZfuRhr9vW?s<#GDaP|bW+l7TuN6&KvdzLc7b)A+f#n62eHJLj;8Sz##qNa5Qb z$J{Q;I&%2rH|H;8UCVWQn{edpA3;D8pA}A1;32)bR5Vl*A4)b+$(oYeH*+%6lFy}Q zUpuycYvBlnBBq!a3e0TNX0QJ&tKdR>(y`O$(l6y8?c{DL^|PYpdHo}kMuJ35W{O62 zB=cY=HDS)Xo^$d1*{_o?r^kfnXl*!Wj*rAu!cv!QIOQ+Li!!2O51#lY1=(G0M>Y-B zJ)o0St{^1sWJ9^R;vt4gRTf%?x|)zxG+;&$AQ=%lZ{J`3vruparm$*_z>#DOusProO1$)0=n495@EwRwm-Izu7+Y@)_IAS9STO$CB z>c=tZ9n_Pxh)5^eA)bm$~g24r^-0Y7?(lK~L{d?2?vy3Yn$>>TZDqf_mjf*U!P&VO?} zDe`1|%NPyho|1-6SkekCl5O?xF5dj%mfbN2A-ZW7$33xJcKfvO zMiBw^f1~)^0~s|P$d)2o)Aj5N=T9R^JiKt&O0i+s@rcLW$w3FwQ8q@nmUrH|K$3OJEF*D$AWDqiEewhX4J;k$$&{oz&37{FrXPc8_A~aCLO`U zNG>FwIusNBbsvqyWS5V$n!tg}VKer|z5m(H{YhW35EmZ2>6Tq63H$g+BEr=sMyli^ zk&>W>AaVhQW$pbN;*J~}5Jw=P<1gj4-K*k3f zE_r7|_+IFArYcyLHi;G6<_WyOsK(_A(_(`WATz*bM=Th|w9z|f?}Mf4yVQji78mzmV690rD^&+GshWuiaYpjjhhsP29yGbx&^@!&U=A#} zNt3mH(~d~E5GE-M+J7Imw3BXY)@>`$nj7peL8RJ_cHv5r@u`CX8(!}nvv6jj}Fn|?YXJlohoIV=AExq4> zj5nrp$JY!q!(diJ?}@iRkAUA{s@9-=7=!6lBHH14MH`NB^;C?pQj{fxU?!9X1T104 z>0Sc`ma_xRBqD+pt@@t0557=^*}dg+VJ2)rwoclJ?c`bq%%@!$B*t9rR))Ak8-ITPvbc37G3MMPp~&~r7>y8C$u!6HCW)1u)ypuV#Bh* z8EHg(K?_WLY$T?gxXM5@SnAmm2cmbi!rQB&7(NnViyIK42(+$`iQBY-EY22$s z2?SP%LZ`PQJen-zV=yw7Svsr(K<%~mQk?m2Iw_bC6oP=M2!l)Ww_Hkp}vlXYBXym0hsvD%La+@ri}4DVsSf!H~+0oq$wD%xRP6pJVvAi zsY3wuXkCq>Q;bCYPP^13_PAE#k1X&3Alw~kcU=f?DrJs)Xo(~7n{N*oD2)tZHB%`D z=IzgU`!iKbT)2{lj8m3-q8Zj9W6CKNC=posOUf!)M3OCTk23Q8Jsm*ICCIM7oRNI` zNWzvYeN*nPg?3#bVSl2#C$Cr4LRwDl9ppAqp`(EzWbj&CdFGbSdlyZ&u z$ewo6g02*LI|9kUi>xP10FM7LRMgf@b4#Z3f7CjP_1nT8rjbPt|M$FdRc zL1d9=!IE$w?M_!S)Ix=HO}-|#N=;I;_yhP;ShWGxS^?<{o$W0T?^l)HzLpM=4R07k z3MT2JiIEm_bz~f@`C#L=nByszZx(V{rHW@m!w9QH$h>u=T<6q19L*lf9_t*nkKWN) zDUcr5Vt2|}8)_;bx&Kzy*+X$#YBXR)K8^_0pjE;M{}I0!G?3begWp`ZT7cYQVisgj zpkCa7CsGjFd%OE0`V#x<@J{LT>>t2S77z3xcek~PDmE17Urjp}_jzeQRF$e#`R%_q ze*6Bs^`GxQaX#zT9aJMgOZx7f-o9R>Hgt9%>!-P+sk=F%IkCA8@4k;5j&|zHiC(4j z3n)N{j=LqduU|Zq_(cICGu*g{4-q;(L~qWU+Yg+%aE(u(trOW1(~whyC#4=ld1MgZyqtV^b575gnj$B| zwnijdfB|XmGmmwrytD6U^5vUFR1c}8P44h%Z>7w}>s5xT#OlQA^Hn}LX5+qcM+h>! z2q72V%sPKOJPlQ8taJ>-decou7`mHBoMqN^p7=QKWLi!hN|Rv6mRr5hajfP_m8R-= z_3>(3)wwD!iffcx7f`=gWVheSPCK>xOot8`fqavmxMK+8)sgn3&7jNm+oh=d)!2+& zu=<+ps^+TH>eT9?s&A{pYA|^u)}Ur7EI-+4r=t(Gk5Ec5+w$Fa3*r1|*0$~4b@*K7 zjiP&1_tB#G;e*=CRi#z8s&7>{R-LI@Sc`tV4;yflD!iGUemWtx1t(YV1c3+loffE^ zJ=7e&_h<@n1T1_F5AIiIR$Z#9udc5ys5)I0s(uE}#S04KCrGQWb=#Y)s<#&OHwX z+{xbX`Ljs`;R#^qu$aaM8Y92>DkVGj4!Um*RF<&6zlwMBk(hiZH#_C4&HEeh=Vstx zQdIQkIxy~BT2A_VP1C_o4xEKJl$N(wRM4 zHjWK6o%kUB^u_D9OUfH6T~%$B5tWHZXA`R$a0in9)A1jkdf10%@T&Z~$Dapj1hg@Z zX`0Wy9ZMvi^5UwS*{I4P}r6-|}C6=kKxXcsT#Nx8jw5qXJu^?4$kT)yNpLQ-ur?t2f4 z_WbdfcP}>$P?L6=D+MudO0oN*7KcvLeC6%^$4I4@R^Odm{sayYP%xUXp|`QXdL-(sgODetHZ zC@;O8m-Xdyk371jX>G*X#I>bs1J*qH$g{gH=VA0tx@*DpOWz*e^z=dByj-al?Cs`SFiGcAwp_aINx~ zcWi#)y^5a7;Csb+S2Ip0e*R@;`+!;wbK-`ij&MUrf^M*@I{K4@uhXwU8{qGJ%8Lt+ zt$nPH-SGBWpU2mHRd}bow{iik;Fa{R6F%8r)iD5g&SY!+2`6r-9qg(}`Y`?!q11a7 zy_G&_W03jBM{C&)3)cEP`us&WYWmm>b92&8#eaAhH{{hxCQX@c$YoVK&{=!(z1S0} z*}3?`-b!yg;pX4fu>0k&_5R&wg~jD`yV4>k?-Q}_ovdl6f<99zIQ4etxTqGEmb)s3 z@r3v8rvBk^_Z@xKJdpx>ptjOgv7o%Pkc2e)opaUgC}s2=lcr}x#hii8`x)!GoR*ZE zD-4z16(uF%zpG|XnTMy`dbgy)SZT&B2`xZ2-@aJ;zu!{RRiCpy@+kJt!jkfl3I`@$ zn)}M5Jjz+$fT?fzW|MHZYt_L^Q?}fxeD$52c6x^~bZOt0@ zEq&HJo>E?3IZ&~njKuKVS9{;SS^vM>(TGYxT@3~A?LK^#FmqX7g;!a{;YX_2q;uDL zJ#wI;tRFYK3+X$1c=reS6E~a6it0jZx*y*8DB=(aU@^N{Wz_GiYnz^kcp~wM(kHBI zy?(d1lHIVFgzr$qhlLHD?%JeNZ^(IDJJ{1$vMF2@KRjJ|)$ZRp*UC@Ge~_PSe=6ds z#HT8slApwPPdIV&h^lgWS}us;pWk_idMDpSOn&o`!JeklZJQyABsp~R+Q{EZxVi5i zo_zADr`D~LpYC`j;+e!}s-B@*tf;p7q=12>wO+s7Q%eJpJY}3t`eNtZ#{d6;c-6m_ zvOODA5$&z;t~>aodfF_BWA_sBpLInm}%j3E57L`innu@t~=O0`9#1j|_BR&7Z zA76aw<(J!EiFhUPmC9F?muJ89;vZjl9^+xSC!SdQXmZ_Pg;c%(l1PI6QDPYl$4l`} ztk0C;+A5E{8+$U94sw=qeZ{=W+QR47(8Qj3?u8d$dgawWzxMj;?QcZ9k@!aC8_Mf* zUi!crbwT68Nr^<>=pUzNA80Xh5|SMWg+SDvsNv{jv6 z&$j8plF@P-#;dO1@Ow<|*%w}X`PJ9nc=NAst$(}yorrf5->H0O-rMWn`s#Hm66{F?Ba1heg{m$u%)*cNe_&4LtcWeKlzV_ z^|d$Gzx)1&AAh=GRc=x?&ff6p#~;1_?)o=hd-bK~pM10Weq}$#x(ne? zJ{r0HQgs_E+{p@{OyGx!vHCmiU;FF6ug-DlFP~dc-Ew~2OMiOft#>~7_|uJ_eg4Jf z&Fxzvwj^$;+@frr{l({>ZT$4(58i$2jX%Bg)VY@G3N{vW0~F0$S8Hi3l$~Q|iSeal zV_8w5Yj~iuKKE^Cnv0}qddp{5)wk?=;Vh6pKso>b=$VK@QCol@QQF{+sv(7 zHh;e9(~sU;|CbkbG}l-4(VPmdUxW^N@7Db`lx}6?OvYR4I8=|c^FhJ;ObO)|-@`Z+ zHO)1jzVZIY8$a8;bzAuM9Xr}~M(j-7S+P^uF>`zPwym2#-}v$SZ+u+UTvLH@?iJ@V z)$~EZeN+k}d_)+20x!J>@g1>e}yq`u?UbwqlH(JLQP> zT@kwycUA6^Bb1$iJGO^!{bJMmpWNxVU)76I?&JY191P!3^x%IPg{rG+x*JP2LrJmi zy{CLS0*<=wZriYpdcsFEvmx&7QX;19+_8Pz#;td{>Z>dG{ja2-PTCw^+|b$2YC}%U zVg$jyv^5ie)M~n$OLviK%E8{;T^>+T^Psyr_KWQi5smELCAhcWjxS=Wy5Sz_;hKRd zqLPPQY^NgFs~!;CHzrh~)%3KK#k>~>6amf9RqkI|^PsEk{Elto_w|nm-;vVR)lgH} zO}D)Tg%kIFY-!VX+?Eb+OaY8(q2DSGycK;CI2|tZEWc325cF|}sGp2}>qz;8>YRAuiCaT;wpE^feJ_pxfYW82o8KAEC0=`=7xR)h)t+*WhxwH-%c zsDpI3mrn;>TKY6CMX87P?}_MSoLRkddc>anhf@n%G<_`(YAQQ003`Zy%F!LKU8>{* zs0!=`D&5X}X$-JI<7g>1K)s(`4(zPqad~p4KVEwGI$8HvK zhQX!R@G2hsP-jlnCE4c|j7=nQ;X-ObdgCk1xPUxQSC&C(a*++>1MgE!;^GMCz^d=quzCJ|i=;EGs@M zCF@3(mTAhsBKzuCTUpB|uZocMFc{NXE)UCYNe!ffNV9wht?4Cso&tn)vQnzH;mh=s1S)9f3+ z!Ep4^OJ|RMw|vUTAJ5**#~@&CpP2f9+F|8`maY28iDypQ->bfywdU887i!Z|*(Z*q z*QPys;pDGtW__7(=u%bz^K6b)=^dXSIt)u{l_h!CPyIA`?EFoCp1oX_c9VVMOnO;b zlgnrS*ff9agzt}E$>HwN!wUu8j@!g+t*a`_&$x7G+puYITMu8%PrJoFaw)wat;xm1 zTjQn;-E{E$4fxZ96vkKbU=;i#P~6Z_0 zTQYmtoLzsMxss(jXbuk|-X`{`FqtDdY{uo2zigi|V$R}C2QQpX^RiD>rJqh~e(~U@ zC9{W5+xpY7i`R3wYwR#V>#fq%=C^6Dq9h-NYKOnuG-cSF#cO{!bvgYg%z_C-d-^e0 zCAUaD^~1VFbB0Y>zwggespO^aP9mgT9V;|1E!YQ{zis%CMug+zzwcQ$WALm+NjuSj zhtoo73HV|t{nxa|FQ5JM+obqegQu>6isgKICV9EPgCxUWBprX4o)8P+X4;t}KYyDt z`?D!=2^;nwI&&#CO-VhKW=q?cz7a;wzv4+td*bq$L;E)-#7+KmW-@7CE|H&Uozl3j zEBtksPk_{z^otJ8&A1B9-1pm8FC07)Rzq74{BZ(Wl(b;#rL>~71L+6SZE1(`q@_KD zRqvk%wk9u~KjQQGt4Ihs3mvlV1&$FSdk>7vVy?OQ01(QDc6j(@Fw`uFn-TS{M z2fCEv%zkc`a=G7}=XN~`)|A?836IQKRw_(%fE%Mg1ZSmVu zwjJFjZ`HQEuxZ1(HLF%Eo;AGxN8@JFp5e~@(0QGrJp%GiN6X%@x|1VWQ=e-fBI;ml zho!<|?BLJ)cfudp;(6ap7}~$z7n9~KUY3w}epTwKV@b!7@>c!1>czx_WsBxb8q&A# z7Zaw>#j)~@+xPzX+h51HA4T|P*H<)5H5;z#MNUghP{oL4PTH{n`orFxn^IOSjhj1T z^4MV?_3b-o@bJ;&An>P6N}eQ4_DxEebOcW?kNbM~;DLSm3>rFS(zMwNm(XFw-QST- zCi5tKN8kOU&KFQ8?>(?|xH2Wb)F;^X_>L{>k`tCJocqnxNfXA59QygkgF*xH5Dp~J zKN)|0{Zsm%>@N;zg%#arLr0DoKXK}eISb;KuS(gpZ5Q@oVM+`AIBj0u(S;4PtEn&Z zdYK133i(5OMyF`E_rUHQo7b;ST()T8{Mp}3n>u;o#PQ?DjZ0IIX5jY!=tfP!mKdpxX%&DSQwlQ00R3S_RN{e4BzyeY4Ouird^oko374y=^Ly<=FVFXyJ#8cYW=2dh&4whsGu8&XV}fA zFb>4X8D_(F1cX_pXmk*na{riQh5hsQ`*v;LvT^O|RSCHBZM|CeTgfeX$MQ~&Qo;yiSV!qq^ zE$TxUiB*X!mM>efc=4h|@k-p)*!b9#*psnRoVG|?{KArD%T}yROj@&c{idxu;9VA` zQpcb`xsE}|JQiZ|)Hi6Dp#<3nJx?_4biutY z0z_E)kbCKazy5H5V8rO=HLj%CtShcAk6)g${P=Qpg_fYLd=AwmqrUYUH*edC3V)*W zP82eO+ap*VZ0O(aLNm6Y+2GJ2tgFK4Cug6`%l|Jw9@x8U$JWgVfR}>6zz7ztCaNp1 zCB!GBB%Dl8Rw9)8DlO^Ru|dss~pS7jx}C#EExOB4~kTT6b4;;XJ(k2<&Q z*tKW>4{#dFf-!I>mM~bj4JT?1>9uMKP|G%qU7%KsM{E|eQ+7B`^((RHT|2gI-MneT zdW1Ek@U7D7%;fmwl;m^CBI4J+hzOpja^t2gTLI|a1MFlKB0yZmjv}^RX+UyNId-Yi zx_^M`vJ(LzTx|w-aB%p~-+un#z`i}-?%cj@%jQiRH*8qHUR@Vjo0Afsl9F;ECA3yu zr>%cs!^Vx9HgDawW9P2Dm|T86NauP{DPrNmM27+qZ4qvU&5SP4dQ@8{#*lY&g9^L1Z*-^YdE}GYd8D-n;+1AAcr4 z=ydLr>ckc{LoX4oZpayil+{V33-*I}e&jI}fhypI8RuPC3;@)+e=n-txdRn%Q?}mN z62B#7%c(8uR&ATM{rMd`zumQa&%XWN{qQqEc?@0+`FRMK0dVAE*3#kRc9vl{$wN0> zQj(PjZER;;C!gmyJINiCqt<)UUYoi}&H??~BkdWW)8`&Qfa{O&z__Z|4| zhaXYnpNGkv1P;Yu;}*th%xNb>Ewo1rx3}xm~ct!ViOvbXHA#PDmRnl-_{i&Pal)rUF(Z%%kvC@+eHcbjfS% zv7_n{_3w7|Po zFI-U0XPk>amvZjRIrThj2`@ekU$EHMg)`WUEZ8@YAKS`m-HB@$k*qE{S4k(5Rpl9w z3nNjlhX^KISs}cv!v8GuvU>Fj{H!Wz8L9E9DXC|0Y*T}#_djqOOuC1xoZLKEsql&z z2H|{{cNuDuaR8VfOQ$n!n)C#(3hqXk7i0pAT>g?%-t4T*%#52jODkO$uBq4a*sl3y z*rW*8MA)U!q1=CG!kcR@+_}Ok2L4>DYtdzPCt1=#0w6BKYNXTFbR_?d8p-=D8N7i~ zV5@^VOUQw0-mP1?a0aYo-(>2O(^*QkmZRmiga_b)!Xm1oqKfLUq7IyIU_OPZ5=i;% zRCzfnfr?3f0;EAB4&EYpC1gMa6%VQ@E-ET4EGSU&Z|244rR1H40hCst6>3F~!>)&Y zA3kiFuE>eJQmCtHiD*Ze3x8vZH}!eaL5;ap|rmZb>ar9*v9h-_Jt8Q!^LZMX`yT4l=( zbG$jle9DZNG_U~E><=@KsR(e$qfZhJST{<{15RN>OL1&4bRP~t!Y3t7vd)*7E7`n;58(!`ddWMZ3P0k(`fN|UC&hCC2Raql zrh-k8=LEP-qC=0c$YR03a`7Y3DVjlkZ&f%fll|9y@vvw;35N0p5F8x3wM-O-%`oi8Me%wlK9mwViRLSG zph5|PM%);$0ab)Ypes_mlp-C&Ay^S_%JAkY+U!%V%kgrGd`c!~s>R4ng-_V)N<8dT zPvNj^9&*lT=hS#LMg0R#gxqlWoz9+)!J^&`^GY%|jsO4cZa-EHrL6YrI3{`+-~CaG z1~@qP=rEVn#@D9Q-mHx_+dXu^LOF)_zi4+OWUagC>`!}k?A*J5pKY(OFSu9QtM1eG zR_qh@OZ&9_8p5XuNXkCL{(ZL)yinL*f8dV;Q3&Mp9sbpQCm^zg@O=mg5k3%I)bf4f zAHLhO|EH4$uAr!#L^Z!@_uzb8&ac~c{dV%=)tk2p?FIfqp~zVjD0Y+tN?m2n@?eFt zGFauR4%WD9y>$YdWe4G6*kHwRX^%~|`^b|+$Psi#k|*hU*WG?aQ(QTRcmJH_4oRm` z$3g9WIcPt(W7nT2PM*Z!yQ^8bxz3zGu6oOTE0E{N4-_~HokhW7XGsX0#a$LGccaP> zstnb*;4QnpE@XD0HqCagD+CWAL3eG&@4HW1gYsE?{ZH+F^2| z+J%n?>s;oL#bpiI0x%hM;n1|pWvIu5aku2I&bxZ<b^;2jgrEr8e0D{L zLd8*OQPu8~>&+$ESI!?h^viGi4%7zJ%c$pw_J|s++_+)OHXOaxWp%{k%gPU-BDqK| zvj3wZSCvvN{};OI?W$gp!YjI8@mflAu98*_v5 zRcWj$#3k6cdJUQJe@|;3gz~@&YItwL4t^}Aus3_b`j&c`B%~>Vt6@|Mg zWOLaChno>w$o(jMl`>+k%)1U1A>2OxuxH1PJx(zll^xd}mFxdrv?6ic7FHWVmjSGE z7t=HHWz-fd68@*QP_@v2K~CB(yXL58lo!H0!^r!=5PW0ZfXNT4gSG$G4M)846<(h| zFMbKm5Nz4GhnC0`R)xGbWag`=FHj^DJO5`O2{mpul-!_n>M<9lMz0Q?g8D%04~kBJ zcNw}Ycu9xV`<69%0jlqW_Ne6CxDbbcHf*H|p$It4hgO!FZ!ZXf>|NkC4tR@jGWO;I zdsD0H;Rs!*t*_AEgi~@xMnO9^Y~0}xucFqIS~Jy`I(t4G ze{J0Q?H-T|1+v3n!x$*7w1fSqm4>QHI99HVfXox9vV#*v)k4yte~fAP;eRsUPd1uf)|bbyEd;)O!wnl zB5RQ3TtACD6@eD!2iBmIXwbE+YHOJ#XfYyEw8i4LmO_Rx*&y85ZIyN>m|?xM4(<^G zF4-;MNUsB-#Nc_8{LGT4ypX>M{2pksrv~*>Xa5eB(C%$(S8sR9dcA>LGiFje!i|i; z$lDB^98SHKQ)8(%3l>FBs@Y&M`z&Uw0LSenh*tPthE@a|0>q*cxS&bhe!kkRln41OxE>l@s6u8mNV2%%d`xzRz?dy}5<^`xNr?lou{jcN6V{OWYE%3+o z<1cXW%d`mBa%(MR<|s&t7X0&As^R-yvl?vHYFo731~>V@hXYN4ClJLM0lCsl{^Xqo zh?r;=xs5QhU_<0_n;J%L1Ot%Rng%2|^YnrZr=5d;gx{gg*|TF)(&B^l%5~PFW|CtS z+#xPc;^g@w=apwKq~6G@D+6X^a|9aYv(zxOL;xpMHUYlvHM?MQ+WpiZA_*dm8mAp? zsfNdYcyzAEK{^fIE(7qk$r^#fY$aLg(1c=m{IDO5SiNGsL*k8S8mgW(b$0x6B38tg zK_iH@!T$9|eidtjh8edCC=skh=#e0arKr;2a9SXrqJAV7>Q>?X!^ymVP;gQkbNESJ zgph1#kPD6R!VwtejE6yHm@=p_Ak*F0Ls+@EIz){*je+COn>ck2snDU)hK3pLyIE_} zZxm2#7@cTlH--hL5}djqyp%D#I5B^-P9l7edlDzydg#8SsA)XZBSnYfo}`?h9oa9y zhYD-hBSBjkx#u9?qD%$9cGdiRKU^+R%bKg+8)LAGu{>$5uKT8zK_irYv&dpKM}l-L zAu~iGi)Qv)YSCjVk&pzmm7%kIVZSM=v(9OA`9U(|D21rmPD6@tWYtNz-ro$71T`%P z0R%H1nnTLu9h=v!ntRO~ZjR!)@b&b0tU24^xe617&e?93u#v?uMa?0PHdVAZVO>}Q z|1gn6(++#RLq<;uARdP^0?Q98IGKw?NM5&zwb08Ht>f?2MH7a1z`W zL~1~6Tm0kr;k0b`Hx0pqpG2&lPI^Hp3#~pjXcnAy%X&K`=g*^O%wLp{yq>1dI~Z?f zxuwc%r15R>p?5$$#AMVv2uA}lL?FXDo^A;k`)Sp7|dXp8Ks&cA_K z74D>{E#%S(Aq>K8aqJ*BQVFYBTbMo=?1m5lg&Gz2y+hI)CEC_Z zLe#XCtJi}EVuz!F2WD4+Y)nMOW(&MnTPrc5L=divMpTfsfW}k6Z3G+kfD!YksnMWY z=4IG{0d57U1Ti7pX2NWv2VQQL?XZi~f-^Y$6tW~tok@FhObGb#m#{MTT28g49(eJw zajqh!Kndb^2tbBYM@D!KRN*SlfuRk*aBeFbM^^4jlROT&&^;!sgRvHNGY_OqgJ8pI zm<^MFuzwdE2d`XhYiLrSdcib!+eu7eVgm7DVmcR6uVZF#qB#;xPc)QNiwHUf$H6pJ zhB4#?`D&OZp|?TT&{SZd*vuH&h^%VHLG1mle?^cSi2XG%5~J5`kk0XbCZ1 z&gsB-F+HUu#TNP$-jZfYed_4xb1+L1<7Hw#<8)xWgGD$pOI)r4^5%LngK!oO`APyZP z+6pk^@V8{XvZxgrab8-FaE=Ggn>;VoqhqJJ?EVe&0CC>UtQESbiN#}y#m)MOP!zBf zSixm%7}f~%%ZSzo+0F&m{3KS1n7b`RvbK7^mwcSnKyTBO<{-%x=C+K(ZCRHTd(tiI zG$J|okDW0u%x&-BaG40kin`gbAyKxJ%{?SSn88+LMkX4#n+)z2bOzb<<8pa0fH=#w zGTJrMG!*cPXph@Lj!CqJ7K684HN->M|!2^T2m8 z2iTcJ6+n!wa?H>Q8^aEU4&E_-pu~k{z@HfoNTU_B!0^)p-(>lKow%wX{p zr??hATNG5!DYP2y)0%}imo0>-%O%TwHEM|X(E)ZRp^uu*qRH? z5S%hvBLW)^8oCZP10$v<5aQHhxOlu8#tWD|={+5c+4B%4GB89;-)}A^4tE3`4jw>> z*CrrNjE*72S278n&;EzQrQHD6uV;kfw}{qCCd!eJSq=2mL0FO)k)TcF@D5!GFSi2P z0e{zUWSgfkY)~)RlQkY zy4g5I92PG(r6eza`|5DB>eIf4J95T!Aznha!o|zh|L#zC5Qe9$M`&_N22(+vI%H0=)73ekyJ>%vU0UVAgyeHOCzq7_MN zIa6cH_A{grD-1zuQXpabfD>9Q@>P+;?qK3lol|3-1HOs@Z057D6YgPyECL(QU`E#n zU?a`Ktd*&HZnM_;2nfS*&`fsyIVQ|n8y3y*uXQD(NMzhCV2Qx0Ibf~RyM>r55w1up zM6|<+!J~q5!9qw_qt1|hJ}wVn9~IvFcq_O_dj?H-2hJf{lm45Haz2(-j(OkDx}YABrHB|bTVo~~ z;SX?uu$uN7Mk8!!zD_Cg}(Ke^miFPTBgNR_TwCo}VD?94o>(~n% z3D~NsKZ6te%=e9Mxxr zHshZh71As3D+Ej_nG7!9z)_i&l#C{>=T=*o6rzHgQSw^NG-l9GumG}~IUD2D<93QJ zzuq8p7p(;aM!h}+e5>}u;W|kH=pfEq{T668AjGmoG6}IsOCZGR#G`og{vpKbTnxI6 zTQ!V}kgHd>)r}4c0y#{0v}5+EBq7!Tude|nlxPe)3L|4$wcCNBdIVKtR0GPfFrMNF z7_j3BcF)us|KO{|KD|YcQ}pg>oUi^+-(=Jl) z5MDx-MN|Hlw_Z%WmQ{{+R9XWJDV#1z2ylS6LY;-#FNVf0<8L0!fr87bFU-TjqZ{o} zct5eYH#T^!Y^F0>NYtbzWeRj+wCllWv-B1Psuxb1Nm>GZZLX^(Vc}b8l`N4E1rT%8 zjD``x65B_}aO_oRSoSrdNr)QdgoF<}5=Oc3mCV%z9tUX0O0yzKkR&BhOe;81)0^dE zk~J4&u}~*57D120&4S9{pG=o8kJGN_RH0d<*(VzEvLPgMDWM*OWF~5MU=c5U!zKXI!q<%EVdB0U}rnb)g&0Dg&0>uvl<_#{ut*&qWgzft2vqjlEi3p0pr< zQb2D@FwAqI6yyqoxKe*ZTk5Y*{BNF1d?x+Ity;9D)avJJW77IN(S&M;k#!g8FcfGH zXoXzM=4d;^2&>-OS;w)B|-yq8-&%fnWc>lCiJm-< zb<{Ul`(RAfSVJHg2`t}1o9H#H2}CTk+he0Xsb&%s0*rg96$&WW;Wx3#5H2>odP^Gk zEi-ur!%JFttzK^lf(RZ*OBlbU-9BCS2V>EUd^2c-hIX|z2=%N6LB)yvE&(i$xE<*# zM2u<@R;Wiv{|LJzmIMzDm2%>h(IU=nD4rhTZRw3dylUt#XtfUA8{@(Y&Uy4kVG{Tm z?(Y97Vq%qyMinwD@uO8vAcv+O5@B3unUTbO$WoYusChIaK;z^Jp^3V-pS0@=V?7i> zQezXNHWHP?A*Cqn}_{^;qf=6&W&H|GiBE7Y4HaR z{*ne;05|aJV;o!qwbRT_v%1#M)tXOWlM2nNq9-}48?$>V== zNu2VY5N#WouJ?bW)2tHWRTe0whq-SUYSJG|9zz~Cuya~5p)(E)?nraM>9n>BCF zlrQ>!)VE8U7g{{grtQaL;`W`oUW?Wn?6>Mq!KK_O3nCb3r&WY2s6AsoYdCi{c+PQ7 zJ1?B8Jpb4QX7UH=x4xFo4_L`_-EG1qn;0gRV9h_KhXz^mdUm;LjihFmTNQn!=&*V1 zkJOysH0gsEqVIm}r7pdOOqn@*UhLu}%T}t%5$m^XQa1~mMlwEA{CjEE1E38Pf$v?&GSzoHQ}Z zuq6v^Dvof37xtLNY!)cDY2wl#b_VPZxFePEYgMb3huRa5wMF_*53y!^$qy9DsJY4(S4tO>350`0EI-^w1}oX-}k+( z^i<#0dTMVAxC%X`x7D5jJj+P*9D3W>^X<2L_7wH^AzYQWWxN-98hWCzf`SUJBD?Y* zYWQf>+dX@I_)wF9uwG-DZLaqr!+oYtUX!%6Ca7beIl?+(Y9b8WxmQKgK~5Es6_k~1 zL=(rUw~6*9nFo_5_kFX&OYPqpIC?HNYg5*)hn@e%jT@BpQR~*?6v7&u2GEey6b)Bt zjgn$m3tZg4VdI8PFx+3iZcAK`Hov&s*s?H`%xKhR<)ITtj~qRE?3i*?KvIv$M};Hm zQPUBa5g)~k5tn1fRF-Ktc0@fU9o3E*k5I03R6J(H%cDnCo`d4rG4W_544aP{jvkZo zq#af0$4G`FdWLo^f`1Xurc=Ls({$iz9aRCgemX_ldRQLp*qoBI2s0-qmKI8V=0sf! zgrIM?=dSb{xiz-(@J2m}J50Ik!scR=@*79L9oO^8rq6ZzY}z6SOPjWC+loUeYg5$K zTC%h{v_`;b3FGQDYgVsOR!7na4&Um#l2@-@gVPhc6W@9M0JgZQ<4vu%)M+@4Aq8P; zNcM&lx>gZGk_qAM@E-^7kRmB&k}MhNf?OV-k7D%EYXmOB?^qEMSny1FbmisgnFnxC zM3X9>AN1%-1?1C&Pw1o?yK_R%_l4;Pfs0A+&(=(QkC9F2IOuV!wg5wi3!|F-Uv-t) zTSq+;)1pJakyGZc+_Y`e#7%b zS3=SQ6dkl&bHk$Uo$HiqYo^DkZ>J zSHl&%;J6PV`ABnQjpCSKZvyl!vg%c>0ZWw4f9ylk8h02a5MnUN=t9gsY&$0{xZr6( ziR*VPB_StJ7(3WC(J36-KP1Vj5FAxwb^tyYZrp!n@u1hAdbaD3ISI)rIMTCrbs*`X zRX93D|C98;bWw4xiH=X12vtcq)+DS_Sh^SGk_lU@lC~}FdVeyovaiwo-(-4k_b6e4 zpzt$r8J-ZJ9juMm8vzFnk7vp=vR^4EE>M6Oyp@O?DA&r+MkGf+in2JWRy2R|f=ok% zEv+kIyhg@GTyVlR{4uwzlZfQ}mgFYdW#)1d*Na`g3Zag4{4!T(6Ne>A@!6VX|GacS z%Vur+PmWFAyd47csze-BV<<^flay6aI(np4LZSq$$g3Vs3Ku|8{uVdNs%RXx+p_$f zhf;`I?tNfJhK?5o6Cp+c^g-U!u+<-=^)$k!jh>>*+ z(s!{|m#k5?`b!_(H?1;^C)r(<2TM3+nFa}M>xQKGUtJ7O7a?FmM4L!^L`+1}ZEsE^ zMEkYO;v&XK6d(vaWoufSe|p9f_dfI1XHyfmZ(F}AArVIhfg>apI8j!qi6;K6uJYsD zogoo9_wXDPq8k(v6QfrpuH2Y7sQFrko(E@SK#$HkoBk5bs0=*Q4HjTTy=5ZfSu z7ZH-IZX`DD=occg2%)@)gnRxI`dO6CvE}7wF8JgSgl#7FRp-M{3}PQ&U&AcJ#cP#(kEXZ9HohKiiRrvRiHriTThe=_0OLUsJ$z3AF3O_MTR3 zwux$v4s5V)0aw~`GpF0aVpbX7nN)2a+uaAgY~SLkcPB4hwR%l*qD)6PkrX7uiiFS# zl`hH(1pp-^tXPpCtuQ69JC&6aSBMGGE0(7u41RL14U3Gu(f3cg=_MF_Xt9K(BFSXa zfJAv@krL4HfPh#GW-24$UNz$%`<2YFg5kk_O>Y_jBktP$ul{>WumOBuE$s$2=w)d) z&=S(Yr|rNwVVwoj4siR(OHiehL$1(lM$+G-tNph7YW|-4`rXg>nHakkhs~ESTYhjw z6i&2$+VblPz_f>8@`YhCm>CEhECr3d4HkPvZRNeJnj6E;h5g4x4e!fy;)9B17ePN6} z=8!Gs_{aA@^yqy?EQA?7Re*WaBA^`HMvH6&@HY)+aHyU|IQi};1 zKR2}_Qsscqu;c&{Nz-s8Kmh}Xjzdk93(jVawwS#)XEg75B1FTKbT>?Mbb*X3NJ9~{$DMQ2gCRk9py}JBKub;Sjd3nl1FbZls~k?%9TIdM1tF0 zUCqd^s{tFpJcFdt283*Dd^!H{`(OHW(Z-~>IM*U!v1^er9;f&hSK#Qr2yal4ix$Vn zON*l7moEFJ?T{O2;ZftO@1uoh&@h>`G6I_#zPd=92s2B-E@3-VXY%~k^R8(nyv4d? zLz@O+$p%J!C*0u{OU}Jx?~rW5n{BCAGYiai3~7Z+Hhcw%c*wTKHRt;_YSL+XNo@5I0csg9&xycB_-YjzfcU9M3obNLZfs~_bnL=Kizc@2`b&`1ehk(MivuSU0dX>pR8`ow=JPL!AKNx2 zuh?Q2)m+xs&0!oAdt3Zyug83+^&8Pe51@mJU&3v`nFCyER zF?fy{+r4+7!g3y-?{Pk`22j^j)dujl1_$9RSzkRcuomY@Nej@FK=VQi_fOGc4MYnL z8bpgKh!$kG$TlA6#0OKir(e%5vzgg!MBC1y%}{^ z^nc!bJP62?=ZWx40n$c^%T9dP6XS-%8uwMfl*d`_|T{_&o=yNKzPnJV;2t(m3o=(=6VbS4^IkntI z+tpA#gVzLY5#}FXijID1pW3P{Ge^XAT-C*e+=8#!<8JX|!C zF;XrvmANL$oI5XspQ%XRxl!}xEK2D9)^Bv)gDLw@8@s;0tHhcQ7zhq0AR@~2)E3s7 z{8{6h_PP)RL@HC81W4@`R-14!0ftUtki0qLn3w<)akl%w#RRyG$f>ZAEf3=@qAju_ z;rSR-J3usdwttQ`TSW@YiGWj@;2dFY)ttz=v**qY;5IZzK$Zzd7rOl?Q31~|66UWN zhrY2Q%O=&}^cs?-##mijTT`v#UO^IT)M^tB+0@ijdvL}_LGsjytZ)?08duj;BR|S) z{q>EQ1SiH4`ic}nK`TzVk(9s{B9Ibd3mYJ#J$+qDXxLYw9b90H?rU)@l?SX2JnGyh9{TR)*&p3EXPG zo(J6MUodcFX*H3A3_^`u6IJcXnEmKWr|IBugNCd@452+8*raCFD|%Nep3{6|AC~WT zOzWf}tA?;k0&mb}%1?a!ksjkB=g*rt(?3g?sUZ1gX)`r~e&$ShR^-fCGiTN!S3<5~ z)=cj#btaHBQ=4V_CU#kuCJXhwX4pbxn#Q(Xc!O|&*4F`a9};ypr2rCv{{Ia&1DWt8 zRO8SWgSY;d?sqS%f*TKl7eWDTtdaVsL5xXW2tzR)UfFeM^b9V>++o~!0da-$YHcJH z=%gK0l=SEW-Nw%nW|w{gkiMDe|3;V@LMlWGeA9UPf+d}rEJVk8$Ran>IJVV->$V_T zz=dWkZG|ZU3aYmzQb7S9mDwf(s?g%hnWi}eyYW_8ARaJF0 z&dV99sudiq)NqhfpmUE^f$AuFgCqSCazKGNORAwDmC&lZNWtnzdaYKg$TCvlDiK9P zc%@ZG)mcw`{LsfG3Zg1=^vh(1e23;>Lvrk&E?GyvHjVzzUeNpbB|M%nhxO%o zS1mfMK?Vwt&cLBSEdc;;#Fa3?0lX7f{)XVvL5={hYE=~bL3Opva7JjL9}(!5_@`R_ ziXj2SRr}(EvPR5gGYQ&VuQ{<`Yl*p;Lk)|qB zVsJBaUhk)-!j_SCe_^(eX&S>&g2SL_zsmZYdX~`P$5lo?_z{kjXcTC>0s87HD$jae z!p}lTYV}=keNlO}-(9^CxG_|(L#=vnmJy~Hw>Pn1+^j<4$pc-+Oq&iUyi>Hv)krFmVajCx6k)Ohw=&#B1KPi^N?;Kvl!CY?f>w2k_3Bp}fmDsxDu)*1fiNNIuW3|>=;_AD zvlXPYdvMhp2&DB8lEWTM67H0IN_4Vu$0+b|x#(SIG z_r|Cxa1u9Zl6R6eQJy4B^iEPHs*@roPMSDT!lR6AZIU`s!PSB10IuSs=!w&3z4x!a z9&CmSInh&Inwe^?tg4bLy;X)vT+}K7M^v>+3CC1HnU&}{+$*?`Kryw_h@-1?h*dzY zhSKozg110UrA+VO&4cn}dPZuD((ddpn++@_*x?L<3qa)WP8WbSu1O-}Yz}z~9EAA> z_9J9}jGd>jQsDw^(&5|<^d-^Xw=%spa{3fNssOm^iNb`?L~ViwxD690s1qaM|9gVW zpOlHhq#z0@6Acr91`Q}sCxs?PPntMwX0Imw+?$MuTrUbnh&NiLDf~%{3Wig{D^D?q_Eh!DEB7o1Mr6VW zwBfi`T>=+E0>gl=&w(W8wr`$$1M{Mb714TqZVes6rZzjtVgz>=0 zcoC@Uqq6TSB<1jh#5a+df&$fLVOB(1gr5t%YlE|srSM(pre8}TcN|t?gl7; z1AdM$$u~EnNKH89!Jg+$B$RWYvYQLwDH0?5h*lY z9cLInPQk5xd;|)}c%_X~$48BuH2I@vJ|;3S8+SJ!c*q{ALbnllhua*Yu2w4v8au$0 zk%;O=T)VbI5*{K}#CJ>GZn#If=?!`N}+IAN?8DKt(St0Ec3v5Sf)9V3oa#t66?#^S9uMnh8BD+RCUUPDn~jErj(zCa&R@uZ@pinmb{CVuk#o7oO9 zNf5_l0}t5<2N?A_4kQl00uYUeo>l>bPys>=N1Rq+L~f;yF0H~qw*tcmeFeORXK59n z8T_s>VXw-5sLuoA%Dsp=$u`@#5{=u-U=s;Sv@@PCmL%sdWI?rZH68T1Q=rSptASaw zPBiu(U%b21=qaO>uLUIO>xj``f34!qi0kOlp|4GJ{d%;Yy%t70aP=b9f34wV)VT43 zp6z(v7DmFK3<)8C5dsK+NC6Zf-tiJ64MFdE&_X2u15kj9B?i5RLCy%pQ+W@)ARJXM zXwmY57f1P-;3GS+!+3|xw?28{UoKfE4au<$RAu#9UspGbq}Q=Y=c z34M=BG7@6Bn0PCqs>?3CAKlvtYy7Y%$o3L%>#r95=#&T}siePSM|-(YwD&vi>Vkx# zYY>BBl1!c*zKVQ&AO^`-+DQ2;VWg_3dOUlO3|}FezY@QS9{JVCkzXN+U#ZAeab+bG z+%`h?*JD3o5J-};fO;W1DS)`5FU5qc3Bc?yz| zeq5oVlv*AEPh%qTg5fWLYn0a(tZn=JPDGNczeACCTRPmZdii#Tj)=$9ka-13hwS7k zGq|KE)UfYCgaQjxThL$zV44t}^5lbEz8*V#q%uMqsf{p<9KrsmxR*u>Bb1SmBSsD% z?qRQn%Olkh#*rgNj2t13G>pJQ1Rf+@O~Xf0wmL!{X~bK)(~ug`?Wiwa>7GWkQ`cxq z)BXo-0E{pLdMQ^c4CR0v-Oe5v2JkjmZlppwmI!NdIhZWNiHhG$S;R~`K2;k`_eG{OYO@>!x2yhIryUv7m#oGa=40%z#c^u6Nf8b z%DAe-jZ{j1XJS7?QT{8u`jURAp`d_k)bNqRI&`~0SaTT*Uu?g}&L{$5B^#AhRFstg zJ7whx9^tXB0;$|oR!+I0vPN`88ThFKNtF?5G-MKC(F^<}66MO|a8r#EO*?!PY;?jY^Z;jFjO5DIds^tp$cw&NN%Jck~mDmD|#&q_2~B!t_CWq4b_Il z3?266h+!St|77udOy2g*H#!*jzzg6}(Re>n5WslZ6;y?*p$u7?4&z-!RM62rkDq^(S7^7wf-oI6ZOjw|u&5Vlb3Z;rVwW@7(Lw_CY#6Ee1pE>-N& z$KPxG%%CxYhp2<)A;Mr~NClsG0A%0xt!NL#)c}PP% zxCRHu3>o~z(9Z|~As9Nx6gGK&lfAUGtV}8efJkzwfTWcLOBGyAWq4PLY^Bslw`G3) zs-TF5qKcl>(g?igIUoj<43*whhD&Lw>zB9hno%x-$eYV-*HZ*hq?oeqtVeH3 z3)%V0*J0U?skZd99ZUkI@dkplRegTmYgAS7 z;^&^*?^eY+Fmqsm6Ys~yQExsztU~dK^~QpS zo?h<=l?bK55}{ZrQA;CBic3l*@}OF*mBN#1v5c20l2Q^`TvAdR!Yi3xSYP4qFHJtGt(*@qUHKBu1CT-Ran#$Y-yw=v?Owgh^vtrc9X7W6`1`n zac*4m!`=USbLgOt1`Ya19VC1t4^ltU2FZi8j|_u83gHq&rU%#hLCQx8?nNYJQ1nNL znTMZzB=M5oLB^5YAMI17dP4Q4k{6#^QC93?(6ZLU=^p{971txrimRcd*o%u&QdeTC z&R+NQBTE%9X-!sj4DP3LOLl&Ck-PJ{jGewBOVDPp1F%M^ z0~A-ThMUATH{p8H6#po3cPAi4tTqHk|2%w_Prw2XU?}{kaND++f zJi>M^b#a2G*EOq>VVNI>$6xUeaY8pDg^nY;7+Tzb-Ly5PNtZz%$q0yuFo;OP0Hwc* zzg|2U`w!?pV1SG#8BY?D4=K>_rXIiY^j8KLhjnc>usjI2FfkPaTTVzVgy-O3u~vjG zDpHUl;7C|3mW$M40oSOaVmueKC-_d)OR4%*fDd5)D;cGINOEyhN%`)l8?C^Y6VQ?H z`Ks@9Hf)}eiOrJgfDScT<4@DoTK}!tDIuVvGeMvy6KxD-`(|HW(JF&yT(L`9E-8 zQb5mRh^m@KyQ5t4pvjlE%wo&@VKgY-3~p%@-ZJCxi$3EEZ?8@4YC(zR;)7r*HjxKm}Mb`F!#=svP*(xXTPx zgn<%Zz=^9|tT5^z%n;TjB(<1mM??x1M;E#Gy%G^y1Jr1;04Kyv2{%Df{*hop*2GLO ziOcha2ZrKF8$08lf{8vK=a$2n3Dw34Go=p&B(1lGBp^;GT{T>l z57pj=4|~fWMj{YrZ}meXU63arMdA(@Dx!QCfqNO{!Ugn~8Zsk3?2Q6iZ{tTj9)G=5 zW)8trZ&c;L7Go|JmZ(LIXt=N;1E?eERslkUVwEKmf2(4AQ5KCknO#FgM)pcXzJz?4 z#$hof6(69|Qc)D1X5atF6)U5u$3Rzb5Ke~=;TM(54>$t$EjIh+-KdB2Z^rpytFNDN zCPQrUrgxO1F5^}Ob0o-o!O8ZGx-n~EgKO74wcsULoypc^p*{_gIT=eLqy+7kcre^$NYO;mP~H@PXRPk2~poxmWOgt(W0_ zT-08s_j~nv|9!lRVK?-k^iohR^nN7nd&%z`2X<-7(PRRe#$GDmPziAVDgYq@!&d-^ z0KoiFEsQJzJ_rw5p^i(1isBGNTEtz))Bq0YP|H3!)1P@QS@eIeI7p-9!`>6o`f7 zCErj`7=c{1AVhd9C{PQdOA62RiGI&1)^f~f+9OXx}i2_F?rM z$p#4v;$tlky<>Ry zosxI8_wISOPxmKV789?f|Ef2pdSuIC#|qGDg<2c}XfhfvaR5|Yv;qM@$n-XdM-zcu z2xt_-23-Ipu%fbJ5_^)78-ox9m6^+)Xp%_t6=M7{LSP%uv<1tIn|H%y-m<+825-9d zI5wVF{zIhX!WSvo3e0r6(R6j_15dxz+xw32Zt$Hd{52z8c}IIU`kfDYJpE*W7v9dI z&C8zevoF7xHBBpwLR+bG{Ajug7&YXJ1(B3VzzKK+U?Sk7HymCg`-uV|2>J*VrMn08 zFA?;Gm8W{&Jt)gc{piJ_&Pn{9SRnpx07 zsKkc4YV+Gohn{+%RnJ}$P9V~;#2~KTw{bX8(N8gIJ^jd{Q;i~$_O^;5LeI*#jlH@* z^F)SPAM!RfCq4h}uDlZJ9Nrbwb___sETenm0uzG@KoUR_>n&bHyZx%6a~m41 z)*Vu4k=0{2ZH{XG`a3=4w}iLFw<6wt3x741YLTP975VmCJWIu+AFs5x)VG7USCB$T zzPC*8b$hz`FSY>Cu=<&|cHAm1$j5-oNAFU=3YJ0z5%~rADsqhUGGC_Wf&j`WxYzR0 z#ds^=D&&XQRmMA^z@IM`MCI3>8hUrD!&b>ij9&6H36u^aKmuiZizIg^EysD#FvPy% zX-th5-dp6N7ni&1?NLQjqMz;lP7mo#t%vfa&_hMS{hN_J-t5ssW*HK$^it~)fxOV0 zCcJv{P4-ek0fox)NBXfxFBg0>s>i!so@%z;9Pr+6P9|Iw5w!F_KVM?_PynNtZy;nC zDHjL;N>D^W4k3XfBa-7#L$+2BLtkJCGVLGH{a^kqleNR_~ikR#f;kF=(qnsGQDq*Qn-`Uzm!F@Pm#^jt`6bBl;wt9V?(9oaaC~z3|$OeySVUZ>e{7i*DlCax(HoW_SmHh9yB~qCW?jM zQI?Sv58#JFR}qCw-MhZna<7%a`E>VfxrHKN3Fd*U^GpoZ{3>Jw0ICNGnoGRU@oU&onC%{veO$xFj-5fGnU5m~I$6u^gG|FlC-8JhkC_rd(yMUz z>`~T?x9)G-rJK@O>*DP!bWxDx&XHX@ckW{Etl(Dd;zv^1D|!~X1o&$&ejy=gowcr! zFSp!@Q66PZeEQApIfW7c67K|x`Y)sdrsNs&^VIyisAu)=&6n^FDnSOYfR_YxB;FF- z(6{B|BIQLD=KR?+>OHqz(&R|ctyItDIodm>;CZ^y`}*YA<8E+K>hBhk^SiPCw>)>N z3eYz;Z+qdm=w`ty4tDPPjL8?4%$&sv{NY)Jg3qGLK(n;v7b`(1qSuuruN$nWu6y32?=PoZjwzw3yv8;c->w3aXBtdPx10xb3HZgSE zA|wzpd^$oH62veDOl3D_ws>L_G>Z&!T|LQd$Y2A%Avq35FLlU8`&K%6`F{v(c{PAM zrta%UT6Q3yls5q28(K#JSJN9E-@t#ZVonLA;DhsHv{o1z8;+&$Bw}jkc1V)L@D?QVzalg`# zm*zD5Q_;hM`da^q~+G`z@*R&309fa3hNL5IFr1}mT za?$V?ntjb0e&vlPr&7cHXfXDNS>q#a<=s;AoOlwEsNo?b4oV~&6ij|!Lsyo}1N zJK6uP&L>?`6cZ<8$-!hO$dF8iV#lyZqDV}F*Wi-jA!?Uh5#WryR9|fE3ZbLkG3Jgtr0oS+ zTb8S^H^z>w9~+ZReU|q66H~H^a&rM-u7c#frR9ch8FFvIAfMevVo?OR zcyJ@T$VxEhO#9bk?Os#ctFNl<QI)mNkOtM>SZ3?p6IQMSU0n%Z@GrR7N0{e*+e!kipASIB|=bB+%wlxxVz z#Q{IuO1K(wb5vZMJlBXQZMiv~Tu-j4^zYB3TAcG@_N3t!fpKRI3rTmX@n{3FJfLHt zh2qVf%r_9ZkQ5dIpvEi4BG7cD*F#UVdsThK(C!tro$!j%PJKmdry&XKS;al&tH?(Y z1-B9_rr}6MOcn}3)V@)~^JC`JjHg(7gE zB88CX-Ub9HfV>X(F5C;be*D#PO;sD)+%=)d%_dPZ1DVM^WTd5w3~Q4Y!aX{9(={r_Kh~p+MNRT1iURLXBH?3wfxM;Z$T|zsE2m*>jZ^%^HODaGGRlP7><(!CYiq{vJgNq>t?-Zn%Y(()J+vr~> zdfTw`n7{)!6T-nAX4VtBlTjf6cz1AIuW-qmE)2emrR&4;X)LLz&wbt6m zt%TNEYoV3gI=WSxHm&ixO`x^b%FwzEd*AB8)@@p~YTX9E!hiP5R&7N5PHSyw(@JR_ z!``%M)2fYvk0|(M5Q(m8Yh(MDo4kAis|?qbHy$6KQ2_A4AeFpESchfZxN#X#;?)z; zM-TmR==XhzOVnj|js1M+7lTL4-F6xAEJHbwgg4L~1$qQ|QBpxxEIX9rM@Ce^^^uSK zXK%fq>0GK9ir6s|U0C}OIwmM3;ci_YX|nUXF%Z_^AOW`iv_+{KgCj_M1vqTuvN*%z zty=#-(%u8SuIfq~KDX+scUfJsB!df>5+IEX36n_=AsJFX(kFogLP97r37v!lLNPT! z5)vTb4#wRET-AFowk%h5SzTARo$|f!+ULr0X1?c{{QrZF@71~2iT8WfTKipVuX6Fl zt5;tPTrM_O8y6d^^^3LD7Jf5UTe!o!e6N1TGV!T-v4zk0xpVc!@|li%{9g#$-{*UN z9$D??|G2z2SG%vcIF|s$%pCc6?hjj!b_6@iIy#$n{{8O{|N5>U-td*LeCo1GF1=`3 zS!roWVNP~VcJ`7btNz;A(+M14esL+4(-&T?4mZ`U!`~T0@bFH)XmrNm*RGD8A9H+a z90`$(P|;@{{0EXJ2cIB$4{e=_B8J|YC~1|bTr|T;2oS=R{oIopei*y-;)@3^+H#Tm zVu%h*$vKN0fB9vwG?!lTfr|@1us=NK^w0T=W+%Sj`%=%)>4CxS>TR$5>EYXdeEnyy z{peMftSBqa%gIWMH{()$h0Dvzia-6GZ+!E{Z(UP-Z$)oA9(y~)0GEmPk#?A*b~FHK zcXhOP$VaB!!dLJGqr=zU(cWA2Kxxiz72N~h!wx*E7OU8veIUwCkiS8zWQs=vSXB7z zlRv-ve!KD!Df6lcjnKUTtk$*fy2KLWB5Re2%eu(Kt78>jJQuCH=%Q7t!mG5440X@I z+sG<@RmbO=T)fBkI{vCI{}cRr!bPhufmW`%uykp0LB5`67VbOPRfGa+7;qR;jrYrfk0a(1e;V<~r0Cs5?uUxs}!m^^=%=Fx%Wh*ZE zz~z_ytMQrC&wlc%%P+s;l9FYGndun?g&Fai19OFQ{_EmaU;oh+`95z z>wa?IJ%8W4t>)PAQ?v7E$QkqI(xs0#^mIUQ3;~4F<>+V+h_IP_OPNFODu9Pyu#Evh zZ)evF`M!r{&p8xhx@myzAv(&D28<4#W42F^g`&Wr*R&AZXa<;_8G|EgMbux+Nh@8o za>WW`rE|r~mBxw)E;oK(iFeitZKb)wTp5es@F9PI>%+EpLquH&nA7 zVCn4;GzuHO8;3g`?R{@upRjW8Y~&OGW6X@fR7Hy4VLt|vVpOplvjuJb#O-&WKvl{X zn9m>0Bx*)9nJW3XFT3o_^7`f4is|J`R$g?;@}iuyr1*pn-1x+vj-zUR`}nv%n>sg( zVPoiKK6vJMZ|CmEeo*q3z1lhdO~qgQ_T#Vb?CLpoa$xZ6^lSuUZ}fn-=WD4S-*dcO zZ!_BiZCDvDboj-kwHvs{SKdQk>UOKm!n;UYOnck#OUu1?oD9=-qnk-HJD^*T3@#NF z%ZmBRAuUtqeuMH9wNx_nhmS2R)o2T~JKAK`L9E){*51|zEVT9z z@QAd<;n$A#^8fH9?F%Z_e@4&6^kVzqUPa7sQV4>#=Dt2Z4jE}nu!Lr~5)-uNh%fc6E%k&FOTw3&&d4YEsz98RmExTYDJ~Nj2 zwFyJ09KOiTsE2Xw>8;nH~SzQA4IBzJwFeQsfC7%>(N1~N1jrDWi) z$B~)go2dPMOi}5wWo3b77A~#KSms~mD#HywZUk{Tmz9-8?Dyuf*b6Q!%S}qmU3E{p zi3Ytht?jLCW~mquoxDyU^yG|mrW@3E%4Kc;x zGOg4si?f?S1Io5Wl5!F z7nbFx#=9?hs%vC&2JLZuG9!y;c%yT=-!bPOSI=zVL$Uu38jaOWVzCBZ`QDFFnA zfjCOJq#XxBj1%12z31x*MOdF%;wmjES*n+4rNI)cy2LEiqqp2kOG}rQMsO>pWGTM1 zv=nbOTvmy-6j!OX)GRSdrKXv9C^pP3H^yyKgf z<=xiZIfq4CxPr3Sgtk^pWshDkORXj#aPe-a)ze#fdtu@4{360Q#~asuh7K9#PXwMt zW@G}RRI3-xD*yb#nukyyY^!Kw;%~PsW`PU5sIBMB1P5&=jZeJzZz)As7nfF2Vsc4K zgCz!EOXAdB{)taK>Puz`SL|78f8Q)|;;n(dW#hyD5noB^(!A7|<+tpJAX7}6Gou5i z&O!_?agz(vCZE|RzYceENDdez!B8-8t=D6z@m!uZ? zmukh6OXsliV@s`KeW|Z_DU5DH=GD)IAD- z@|JLmr?ckal-T`ubHZ+QxsRPJAuK7LszS|EgG`c{|)bS(!orf!{ z>p{&1CPH{vuK&C|slY5Yid@A-#l?D&hc87%X0cYJ7h6S+V!U+}6`Mr{zGL97S?npo z7m9Jq!WYcwmyDu#xm{9_9_#%u5 z2DrAqwf~yX@nBjcTe51_2~ zTq6AfjcPwSq!#(BD^v3HLaWHa8P`C23$I{ux<|XYA$pl>1K_&GlH0(GqF#HV?m)8*|@iKn{q8^;yVK zmdVz2QBH$QwU@wYQ1uY~$E&Ibwm)Ta2M*{|DMjEk!;mCn!u6Aj)ARfVT44xRuplh& ztiq`Rt57S5;NOmacY(98puo)c_O`UW|6O;+yEBn~eO~b~9QE?wF2`HU?|9-7Ubtg@aiqd$2pv-3}C*?999vSxEWCFYV1c=2PDXYX7MYQrnw*@J7#|nw^E%zd>q2;n)|?Zo z9fj0sb3wl!E1n6&|Ha|_#ew>&s_N>hDx=z}GOJCj+N#s)%?7JpYt);ju*e7&te$Dt zj}n*e_cQG3P=_5BygKR@H@uLnSduBZVxDTf@hXT5DjAT!O8qKEhhEiI%s$f-;!=Us z^Hy-OiE+-T_g$Tlo`bdI<$>honYp1nM=rcqE7vVIL%B}88hKW}mFL8ojT|dG9xF~u zO-@Qkh>h_C-5#eyE8H*=!4tOTJRE{K2b1W+QS@RrpBfqAP6@b%`xqDf4$22;qkBvpY>y()ATu6I6BcF z-H*q4ve7eb4F$7m;rU4S17rIQJ7K8wEU+9N_+a73k(?ErNW3~dEju?SCzn@Fj)7+x z%5~&$eK}6tFmWTC3qi=W@SW`JtV}#(JmT1x7_Zmk^|)M4hr{V~7*3Bv)5_MLJ8mku!)DQRq41)EZkj^*}^25k>JdfwBxd+t}YWWy&z*zz+K&A@XRPGJ}WGC^| z16Y1qYIb%GVo`EMvRw#F<>=XZj+Sj@TX<)w&vLRwzSB}u5)Fp4fU_7 ztE+|f!_YNA3XDdp$!v;gZhPkv@AW6~{N>mQC=5dQozQq%=uD{@Swwe`qql1cS-7&h zL?&JZ-I0?``_#|QU~20*HIAXXuB+2imzdes60BG*FCuf)G z6i9nK)Z48dyCdKvAkMh;!&#fjiyJpS1L#@h$HcgHPxcwZy*osZtc zlF?*N-n*(`27)3LCL}?$!WIRngR7ywsmTXj=-hvIn(x5~jDQw7E#zTFk(|@risT4+ zAj#P{X)hhKYcTPEm7lD0VDgrbhZ>NFo-=c@@GN7AmNmD;%8KCCSc3nuVj$xp;)cuN zc9~8*YNre9YC`((yOUGqoSy*u9l8n?;Jkxj|wAt;!Q-v-& zT?U?L#EFOMl!uEuy3_4&W^EYLXXtBEz%>|k15{$huZvMn3S#)mT=z#@pQvb}WjCqZ zc(PP?1HWmIZ}sf?{H-dixGGZZ#5WE6?ylhz_d)$Tejn?8cs!y`wj(24KO<2(4BkAS zw*>OQq~!1k4LVeimcNC;|e=#GjX?e!skdfJCZXlx-To|Bgl!E9!)j5czUUWmWUvKjq5aLwc_P zjTmn7{BM#n!OTTP%OT>jlO7pD%$U2wqb3CBh6Ic>fRPC>UhzdVOJRI49SD%xY|%a^7`O`7l(TgWqQ6Co#p!d*&+b6Yo~l zP~^j6&$vK}yN4#O8uG8?-5?}YxNkuP_{iNI-_bHFbQQy(cZ50_2)zlRpOI~DfzS!P zVO)mujO>+jG&AcVNaz;FWf~D`8^OxmSEnVVr5kC^^o(>PBNikr5tIcQZ$h+X?Xy_$ zG!`F*nS+FDjvLMxAa5|{G;bqf+AzyZb}~mWUQ&ai;pG(oyXk zkzubJ5}Cd+EYW*)YGPV?TAG<2pO%sW0frhwizBq$qQ4YhH%*!dvL)-}TB*?qG<5jH z<#1?Ao-i;l%}a`o2Yq(V4VCs|KG+Ocj1wl#2*!=Rkd$&4xeT8mjhmq~Tc;%Rx$@bE zao57~6}`pMtGrG12r0chYlQyD5tR{7u8u8UGzf)0$Cc0;WR_Cf|T$HOhm z)xyXz$h8&3l(t}8`;Bp{pCW&Wu3EI3Pc~}RLyMMeVfhgKT3_|X%e2o7qX#LoCj0dv zdDIe_W8tM*?4O@sb6@$4z1VzxYAYjia;nM2Mx!$zZ70B1tjVNnG7|BG+%C79 zHc4{@AikE<#DfhwJ$#r>05BzMH1T9L*R$sI+)ONohT#X-u+%O2v1McMDyAc*&<_i| zx6FP0rUtH3ZCz1aHmYM~?fgIISKo;yUgaq`r!4|2njNSxwk zTQ;qIjYqh9r%?9D4GZ~pul-cG8M|6>u__8v-_+J~67<}djQReBzPK3Zsv$y33yke2 zh!^fkyks|0c1qbV+G%28xjYW{s@>BVy=tn-QWKcQG>16ryx+terb!%tV4zzd=IaFMI=6GvsYZ~ZFw$KMY}A}H!JarlamM@Tj#gxyd8EDv%!VZ6Fa3;cOttWmVtO_jBpW*w#MCa|U6(q+w&ckL<;g*Nu~ORvbERUd z4VPD*uPe$<40--8E$#=c;i*}Suj52!FS~!@M@My$4m*trY5p+iiZzc2$h_r`#RR(t z94XKDR$+Z1JVy9qc(`OK@@#D*ZNQ}QG2;>AgSx7?2V%5GCc+`~rVE`7BNI66h=ff5 zFvo|jLT)i+uP)OxLnN5b^PgCJ z5cEt-dhLwC@Fgayqf0hk$KlF5F{{m(#@Jz?K)PnlolzV;rt*5vWq<3a{wEgS@mlP^ zI0|<|O@hGy0ze@%sD;AtNpzc510$SF5|61B z>@SabaFdfJ#usW>IrcDkVjQCeBruhd^ZOz*oblz%=e?~<$HX-b&4%zmZww4Cv+&>zow3#|_9ql77L7AK{RD?>ov;@lICBrq z{g^9%J~wIZ053Hrf|Kq$S8Ey`y~PcgOXkwKN{yBrfAaFH56MBJw+v^TGIoxb&-S1n zwlNg3`?gx>2I?OS4Y3Kfj`0Qn27@OjF=N=A!3bTFcr-SQnZ{H@49`O#bsFO`t?|f2 z%ssB8C(9d%NtB-u2buvIdvF;LHoUQ_yu#cRx3g*-m0xu^Qg=?EMW*yjJPYU@GqVw} z2WvhCG6S6n11|~KAg0K3(rCbjhld==6~)Vc?DhpNr)H8ZaJivLb0RS5di}E$777Z@ zyn=%wvj89Eg`1%1OtKNumi+QaKYA{jXM)moNIMxk6+m+(_Mk*V*r5b8O&7sTudeRLYr1kgx)H2%ytw6b@aYk&cL7ZN-jpx`v0A z`eOd21rGrK4Pq0sCQ>n=eF`m9XXh|Z6YZ>l4Fg(*reT<-!Q)j#F6$K`Qpb!>aT1q8 zs0d@?Z&jR6rKvObM@4oz!FDGwywkP&s|um0xXd{zRs7Ae70l)c3MDcnazE#aSB|33 z$_dADbRU>Nn*nFv@xBn64Hzd=(LD!U@CF8lhDSyfPLQQ(7tW%`eP>4@XhXw8=%pOr zf8c8GwePob6BQ{UBQh08Ms*mwizxynUN7lyRbBn(oSxj5Phwuh$Y?%C(5N9a3qm^s zln4@ughK!VLYec!)7bzgn!bt z_iLJ_@Svs{B#5xOU=p_WMSXu0f<)CMa@=_NZA){1xZ=n$R2rfNja6F)%W_6prgjYB zW#AQm@-!Mc4vmbAot>D{r`{!gmFuG36cxlFeyx%CiB2?|A zdI7gcwa=THsxb6{0j)!Ih6v4^{YpaXX87R}(4r?4-B#M=($>@r``;_RF|{36F_1 zL{VwQyZ~X8ZIhB9IHY~rK*0iXswMq+s@uc7>TZ-gn?O0#m@sp>{3=k~*>oFNm zz#2&y9zxqi^lLhC;&|WjK%et?UtjQe{E=_PmHy#SJ?#*LDnalPql7<{q0)tXbKlmh z! zY7PRo<^fFlvMm)_Jx4=~3&Axxo@(npes*eZ(lhc)O>+S!A|y_R9(_S13HRXhiCl@@ zB5twrxkLMER~NESyH4UVI$hme%t22&abnKXk zdP!9U8R?B_UhTN19Lr~T%`ZwwcQcF&bXMU)Cr!EFcoPFGyLVsdzFOOk)+2pqj%rmdJ!Th9P)6QX-;L#1j^AKEe{D7G+>Z~WybaXvq|2QOh_X43VPHyWE1f8KP> z!i0&D5*$sKdq|ZyxezW|yf8k7JUX=8dvzqlINFi&VzoJu@^Yr#?8xry>H>Jjj-Na| zI85`!N!7$|5N&%;9q;Qsic+KQV3(u2%iry*`mglN+glL8Ti>hA8EN4e+F_GnAc&oI@(&pNJ5Gruf=F{wIaPk z<#m|tiO4(eIeP5GX)5bE_=bG_r%&`9JKBTF6sWbQ9Vx(_9Zb;YWp;Yr&UfChx0bO* z0vc<}8+281colLak7YnY!)6h#_SV1sMMvDLomw|4>~O_*Lzd+S56NVKXm3^@B#{3U z3ZT6ssD0F>sK*lN!rp>&WmPuGGw~>iPkTpoWsH}>;BF8p}(|4UgmMpR+*p{ z+#1REsgMXEK^Kkccy5p7e_ZDJa6QYbq~I#t~l84L%F1?%4?btBKMLHSV>Q)9Mq5$j)sX=_*S@YM8V?3;j8Vk>|wh6ar` zEg~G2E+eH+F*5Fwg5_7=4>Y-eWYcJ~s|A?(Va^iU+B;#f`e3nO@W*smdq5ViAcL#{ zBBOPx&GST_>zi-4P}LY{pl+R0JE$DbzGTZ($0On}n$^DM_rIEy^UK!G&S9Wsb?3o2 zb_1I}D&O#^?21BDqskW)XK1AFJa!Lf2$SG!Q8Q)^$&`<$Uyun2Dyqsfs#Z8dfW^Hh z0lOkMMFtNUiBM4(kvIB2V*43nh1}V!AFqPX4ex~-T{xj_9By(nH~Ar9iLLE0=&U|J{O|DLn3cUbOvO; ze%&(12j7Ef8|n~2%7*nmDrAL*X(GxPaBgTKNMslS4&&<}@yvzeTm?j7AE=&*f}>CE zVs{^goTJCYDlpmB-8VKBn#9ENNpIx}aSs_?4W9!iY&(sLPACdt;R`nZ(tJ0($8-FK zCS>v?10rU2@TZACW@DtujbECPfLaIqp@MA5vf9rbI6TK z#wH2b>*?(~c^W>;*jaPJEut3-(d#`z&1^GZ1ua-Xe@on}AB??rt2)&n&!X5xw@1Dj zhzeTO3AU@$_3EYWt6nqO&$deyMRsQg?G|VsiZAf2MwQ7zj6xR@HZSfG@^C@y?IPLN z(KP45ZBuCHN~)S4nfTMKc0e4w-mV6yVo0>-#CT{j5doq}`8oPvrsjw$rV4B+0ki#W zDrA(EFigF>>T30bSc?H31;h1;J*2-%vl zCiSVf;mvts;{gO69SNJxLyCBoO%!dre#5(Zz0si64>e3RT1`p7g^H()76fP9O-?o7 zJ9Dz{C}3%WvT02d%^5eii(Woluc#*0%QdTG19gC4E`&wH)iL~#pDQ}*ZG8I%SLSmq zM%y@DF1kNFkX z1dl(3NU1hu0GFi6Bg>A@?=q2xqty-9I~(fjryGpM ztfpp&5R?pZPaQ*GS)htPO{h9M+PF(jGY(pt_@Nx!5aM{MRMo13iNgiaLd+?urVJAcag~Ie}p9Eqf}y^z`G; zfR!txFbZ%`Sh+;uqfup~0XDRB96b{jYh+Gov`CYmc7t{$DtCv*M?r>!AOtJqmnd39 zOl^k?=Tw^e+BfU#naNk@Vj8DWXVi!4-1QB3Z#L-l7A~zJ(wNxP0!t4Lagr3mmbak+ zA3UC;-JR{Nuu^8Dm%9b_ibx}JplbhG?D<-Aeb|n{!;W)f{D0u7c!mwHucoT}1}$w( z4LmNb)rll}T|6?aEh1$F`V68VgYdYudiMLlotC2MMtAy+$G=LERZ zP++q$lky1m-$(M#0H_j2B6&n1*)-YcJ#fd8ykFMAS@eola-*cw;kQL9suC7tqr`3H zQr1;GxYT)NWu$ckn5AQPp(tWM92%i}NJC~a@1Bx4MTl^;(N$d)B;*h33UD%-T3S20jx5GzcxWK;^oe6fyJ6IjW{On9>4wut zre{?Mn#fGjw9A3UqVV%`Pd#|dAH~I(ZDEFoMC%uFHF-GP)^%)XYJM^@6+1cJ@kt37 zinK&ULRl>w1px@!EnAKNjQWJy8MSy`hnDwW)wN7EuJP3(-xfc$wUHVNm`MV1tzPG@ zt%HD>wUIgt>Y9l}+}8Fkh9(B&&;wzxk)eS&!q?T_*3#0{Xf`lXS5jp~j>oS*Q%{?7+h<3{sYG9-gJBYJr{EhXJ5~;W@ z9D!kQ-4Hlg%*6Np|KaR$YM$@bRF4R-Q?+40X*FatHUY_=-V>)7Ooo<@5y^y8CypKI z?q~&&5X6~!Z$s@y>OW)dzD z$-u~hTY%&Y)Yq@Mzi!rss?Z4{Ukn)~F5GQ5#C8?ZR%Uzb#mQsc|c6HmU7kaLKJ=8SWlnZx*-UiG* zbymz-l$Y@&5*UqBoOu3mF2YX=d;ftM8>6LYNPjaZJ~C`ogr7ML<)pBn_+x^RiR}~? z%@mkC<9|nv1G1)R$Cx@yv#wI@7BX4L_sRRY*TO@0Xdm8RS%tuYIxSSDhilRhM75A? zXVqv>VY4=wxHY$R*!#f9m-vuS@(MTFT zVr7WoQ}=jMV)Hn?I=-&vVW0N>I`QI6&_)ZcN4U`~PMy(YwWJF(lC5ZjQ8I~P7#KGW zB;~Bc=C+LTzp#c=E0tmvOK$>|9fQzWguRmNlQZ-#Y5ADpXgQ#(PIA+Jq&LWHfr96GSx2Llm zIte+e^P?ao@yTT8kM}kz4p&tb0745{F$7Ga*-FkNo)M|`w7q(*Gw;b@<0MgPPAA!6 zNC0+pj7~ZaK@432s$&EPM<9y$ljS0@_m68h*OK70Sxa#QViSLrJ;G{YRjAW`mNE0zUs(22u#K>Z34N!E!Bug#r|fK12T&VM0~(9Dg`j`_`^t!!)*L zt0@DU3()U9jxZ8!6i**{#BIW#gI^^2hqh%sOsla&&7}W-9=CyE;`d{>+i5k3G)Ieh z>cDA_oWz-zV+sZexEPZOIKhEGvn2;|q9Q#ulOWF}6aba9xLT!wCM+0`;EZE8x+Z*X0 zL}c2IP?)-#d!jK4;mSf=G&%;VDUUb?GFJ1nNLLB!@9t%|UQ&nc!e&XP0Enk2#03vS z{o)mZg9omUWmI;-l1F1=3dM+XUYyJzGjrsYLo3=gRxw>Ui{nBTxHLAmc68ge-Nq^b zq1GPQsHTQGkdk0^q{j2~rLmvb)XuXDI}oOhF-RlmXfpR?p;$r)tgVvDt@75^{pJGi zhqndlXX|so17$~Pw{0T~(*j7QF$m7etoqivh59K(?w|a_aLA0}Gk?ma^$W=+Do)+n zdGrj^SSCTwXqFP>6r#WPr8v#u5|*kMS#%qe<4HynRXP{bx&lmHOaA?PljV~YbCnir zV1N-+Z^4d3o}9yj1M#O%z%6QPrZmCo^C-u2OJeHJ_cRk28Y9J32@uJZBrpn_Rd=E> zj6iivRb$6@e3`#G5U862O%`TC34-fSMpR=HK-D6g0=*DI__y&?~q3Ryr6QGH`e8y5tJh+Iq2hvRV0 z1we9BC~<@*W}nlFH&oa1Bt*A8BF4a|eJXpIvHU=FQeFA$Xo<9|n!XoyPk0$}MQTk& z?nsk6MXHr~N46IYnb3$q+IP&lXs=(y{-1s7p}u)r!q7CV4K4jup;|QgL{dZBx_So< zYK5P|3){=>Vf51Uc9JI0^(}rV0)!!1?F*j@SH(HX$x$2KY=1QZ&;LB zg8mJtY*auM>C^8@d$4Ezc#d~cV8A=!#!N-!g*rFbkEm34d)>dnCfNz36q`lL2TMiG zW8_&*gt!d?Pe60Y(+3X)4qAs|4jwvu=rDf5hdg{!UQYef51Zv?MKV+lTVP{L)To=I zE}X^o!=_W31hvXaqe8=#P>JpI-5+Nb-&292AkqZcLJ5?;@kL|wD$j&uo?D?+9aq2q z9uUuRR0vlas1~)bnS%N9eeDwNDJ_s@J~hD-28B1)?87p=1=z zsVz6DK)sD-v{IfB$ke0&BPLfcEjw*O>!oXK|Gp*$Dx$61qEO__}j=`yOB*^7UI50`=hLsH9rp=3~?FZJe<4=46&l5U8A8?ad8ueVzx} z{{%)7=g}N1{v0`A9kdQO4j!03IDN=G2NvYJ)8^`<$hREqPbOF$EsgcHHC2@Wt0GkH zttelgu3cZRQc?eRXx$g1eQ(=bRhSA4fy$vgiEh${NmLqn-r_l*q%bWwGQ!mvqei4WEfsZ!(pJ>3Xk@5w7{s`>p`Z8Y=5-X*!3tnA~+0m zvF1UYd6=#wC2jaz(|n)avEMup*{>Zm510qt2M!)Mc+fat9x@I(4jl|1iePihgor^k zo8U{s&?7d8{8E5Mj}Q_D(5kDjcUl$k`+t+@`PmWiZU6y8(6nW&Sfa#1p2P#R$-H70 zlD<^8>)#!|=do3It12t2Dyym-RiMV)Vyx<1#r62WunpT02$lE+6K6s2#LUTo$9eSr z_kW!bEZe27^YLG(&Jau_QS@GNCP44U!=UvU>U0o$A}w@%P1SQNoSGb`si+`e4FNz^ z@kB2WH+Wbi+aywg9iH6Z@7}-vfWCj0@@Bx;X$M1x!jQS-D0^wzZ8o$LGPy4lJ| zWg)SvCT&sN_}rEd&0y6q$I?CvSxn?n{`uV55C-o~qi+=&X`ud-M4ox}|3KtVPLRWA zM`aI@;r14sJ6G=hxk?DIH&6(eXdyOH%3(yfJk1%;#BC|HZ5}oghwFmZBKrdSBL}pD zL4c-1m@H-4MD9AeNiZ1h!ahU_+uMU3L6p^?H&p>t{&J!F+E<$>dknZncTwwHRv32D zs6;ZgBBrXg_gl`iKkT2a(BYMl&5$r-`#IW2`-YgbBnOy!Sn^N?h#OBvgy5^7H1h4A zz_`T)+~&{RCG`nXK`4`77YP1om^V#@Z^pBDAf^`4SO?uX{AwW!!GVh;(JjIbQWjo- zj{7MPWU?zkeZuRwy{490svtxv0driHTW~&lDRt$4|A2P!dk|dw@IRwms|Z&VQvkV( zx6{D(52+Z1xB)!>z*cdBzQFXr(SPs-9!3djRQ&wCciizS6k8C5_AoQyDzw;$W=MJ4vc;-v5>O^dBFZDL3)ha=4pAe}z=j-Yvv$57|uWc|z% zCU)oYJ5{ie;)gPa>|5T~_Z9Bnw{QP}0|yV0)4|-q27xXhFo-S`Oxu{p@rj(5Gjb*A zQ7A7O8ySinICB!`C!NS*2{y;KAU&#m+m~F$FLnWc?idu!=dVI5LhS&LHylL5CrI8t}uei}MrYJuUVe9_aGh_`!3i!=wg@ z>!0%+5QydZ$v^}fMUHZwAbH&#%`klBhYsw2|J|EOjeg5H>p4TIY)Hx8*(lkJ45E79Y1eyUQfkbUM_ zh9i?Jp4f+-7}9tci=aF(YQqSN8Y&9x%9VFhcvLyLTW}e z{N>h8dbRNH?PCIjwX4@{=s8M6;jN)cVsWC&1E}e>4WmBwj`A;Lh7b~67Wgx~wQ1^h zq3p}hDsGUCwN({|4!r-~yLSn+TQA{yqPNQ0K!Y4lCAnL>-XUu+cz#8%n+^A*0USCVB!lKp@ z+C@mEeI%;bB0XPlnumRkA8eaGs2#EnS%-@N9i&kRC|sOT34Djn9&6hF#y!_B`(dNe zOYG!?Ma~5n`j&Hn-P5{_U1VY{Ybfk=cKRMn@4(Z*xxk2EmxsC{?#tBdmWGn<@$h3#*utn`DsN)d`nTaf}8`YieTQOYUiyzx3|8_8oR-8KaApP(- z%NS4#GB7lBb~qVfrLl<#)Ducc^|W2!WR6-R=CC!A0?Nb8kh9&NbzHf(6~Y(oe!!>+ zyk2fHM3k?L+%Xkiosc5p*|_mKXY$iiKru~hOGQ-;@`T&FdnKS{qRw-q>94nbEXjd= z@Wms##5<&p70%)!&7>D4W1Lyin@**W#;s0l+FKan-xXX) zPgBZG1qa>sbljKY`S@#7prlJ7{)fvUfrxc=p?~ba$dSqo&;93hrD&TPqs3)vDLWN- zJbO{$ahXN>;+o&THX-13$Y{4Gln)}w?9ygD8XZ4zb{aVk)LscOo`m1q2JJ0BxSz_q zd)KbbH~9b`b=eZPrX{cZ z^v}Ou7<+xYfT>T&d5v_kK>i0>0CP$)C9y+1l;4Vn67AKo+ipqKN{5b?ut2c1Sq`+h z{2(Q9H?Z8f_Jdw&O7qV{36D@q{nFp+nXf#EDnVAcip4W$wHa212XMLOPmZBat~no` z*ZrRP0LoI)@4`3rFWOZ*E8!~tQy_Y4uGI=2fBp5yYp&N{eentNN!JsP-TN!+SMj%f z`|Dr-+()mx;)1O77(+|*q-2*~`RT9U_So7Z_ogQQWfHFOG3Yb<9UW;|ltlxF-yZM zKagh@y7J*8m|7wJ8J^gm!@m82{<|mX_0M^r)kpqpfmWfmCN6 zS3LXFBXCio!1?>`xYKq~B+wqE*+@S+4VF#dvSd3sa{@7v=DO+%knFvCcJ17`%iNi` z^;_5(U=AsPbVXF{CsjDO-~!s6qi7{rH^hy_-et(U6I@AGzBDi{`v#O1tw!ek_$_=~+@(wEAB^cij(veeV-{-+%AD_YWL^88d4VXF3cGxBu0#6lu$!Jrol)t`pxC`%x?qCIz6m1s`Pl7Ua0WxOlZ$94#0YGdxrF;;|762L+fV$e6YO4+(fN1SD zcUn8F?bZ&@?~0kC8co*%;e!rRCC`CGuoxeNP^p*}1B8mT;4bvjUGnuuH?$F`2%0p^ zpbb?Z(0AauAAP{ooXI<8g6vok(!xe481}ZT_I~!QdVz`IsdI2e6_lFN@X5JLbDdO8m&gV%33^ zb+YPU&ArWY#sXR_$zWf;zo@FtMWlF8iIdVqh?DH9f)*5U#}0ja+{T}0C}vC~AXJnV z+AMY6#dHwDLZPA}DuGkJ3BrK@DyHnFzgM=M9G#g6_~u8?bk=OV^Am1ebL96@`vM^+ zWGWQ)?$I1SX{f={aOMnpVH4iyzDY+{kq|aXVWdwK5MM=UNi*C(e}I% zfybS*UZ?1qHG&K8e{b*ZT|0Md-x1m7UiX>!Xrx8Nhb{#Zo)s%5UW~j*b-P$Nsr(dC zqujyPX?h+yxuZetRe zT>q2v{DUaBZSU!$e;}Ah2?Q}|1t!Q0+_Q&Lygj_l@ydry$`KDrDJrzqB1w~2F>Mi1 zA;DEr6BnDgbopgp`uVL-y!uAu_1Lvf-SN}UU3F1WcAN><*F?KSN6HU|BSAf+hi1Z_ zuK#c@eWojj_3@-j6<2Vriu6l_Ndi{*m?_~ZN{oY6`wP4iPflA^-TKZA2}}PdV8}tu zIj)Mc2TbvcM8TN&^KGmT5Teg;x!o0mM1K@u7?W9a?*>jC2NWPzhrq3NLpru?3vKoN zj>oB7zYqib362`206ZI{dQpW`qX>2Q9O8+g2#eEj=$b1zvH0TfYS*PDsROVy4`+#r5psk>v*DPxFLZu!eJlM($(vGD<*GC+N<)cQj9NU8SW{(VBNn2E)J1-i z$+!_IP~j)t>n?PCty@qEpN%qlBq1Z=<;ABT!LVig9t2%$6od%#GM?ec> zPg8Lb#NjU4F{KA1fJO_OA%8gLaaYX46=)8;fQ?uT07at{wI4)>nN{5CkOd>)*w7Fb zek58X7*@Bxkf=S{K}|yCICH5Mar4Js91jzgPB=Qjkw^X;H%IsusT@a6o}CUul`dY^9R;o@N@m4cF0bc!gq%0atjd`HrP8y+rulo%!BEsWq{-S%;TOH67njIiO6GO`*U?_tWHPD2MQp4X#$0Im3 zCcz988m;g^ar22^{*S!6t@G$IL41T+Hvtb+ z^z7QPZJW6@@J{SsKF&CU8=i=TuDU$&RJ%8KaMcn7azeSHd1cYKe1EJpLhpf9O~mVel4gh2m)!$~E_a=TY?2{c=C z6g_VS10fB3+9FQBOwE6MKNMO5GAF5fv}Jce6j_fq5hM{cyx|<>-&3m@7T6=>pSoG zx5Pa8ArHO7Sj(rym|myH4aKk}Lmi}(=$JSyp{=HPiDj9Tw~X^+E7P=3?n8Gs7-I`a zXfVjB^Vez@ZL6+XwD&On&h!ggyVUuvaV{#wQ%u!0&+aRrG>m@*f5)r|q0_N@_ZOX| zeQh+#@F~EO?dB)Kk~x9eHZ=Nl`A_a5OO7U(+s*2mLHP!zrXs*33;nJb06lfQhuc*- ztoyF*z+`qy%;qOnxIJ+RiDp7#T&(m2b-O);gqGItRQnW7Q1qPFhC!^7h=2v zC_aEU`GXUH$O1$&VQ=ur<=Us}kZqxS(x^WwD~~2YsgG1s%!SHH2BAU>CzBV~7|0z9 z)q3md*Ib_boqoYZc@HY2zIh#6>)ea^h_*86)4MRK8KdkLQ(=ZQfy>}j7_j637VcIU z5!Kb+SX+SvMkOj+w)o%nZhol9;fYT)5{(26bLtWmI4&1DYNDwg#e+teiZVwq#A}sX zL{9BhwA_#|u~nM$-Z_|FR~UWFrot)XuNEhMx4~}lPeEa3NtF6?+g9D=XmJ_)W!(bn zk8fk3ZVxeBxZbUc<9WjKAeTsVPkrC_m1sb-`O(#w)@Uf%@e03nn~`& zq@=_o6QX0qr-<;t^q@N>EHoBw^4Rwul-L9TfsnjuFvOGNaHT`QfG4xLC7Pr7<4JjExW^DA`PkOH7Ez;D?wP^xZW*WXFndGRNn4<7A(vMvzjG4DuL~W|j7(-1KM$9f0C(I1#YE4op<2 z4b??Nh%}U9dg~i&x2|@7v4w^Qu0(f}xDqx=Uh`Yj8WW^0u)*-zHK;ZIN0yAU9I)h( znGj%FA{sU_gbf|x3^6=_>76Za``^+w8*e$Ey29i0#wR5wVJt?nkz^(7N#W$Uq(t=4 zXP4d>ukMDCMztd?vC=7pPMG9Sv<`}=6i)f@5yIyBmxC&XVL{d0hhnr_dKG;+7Y(zm z5U}8B3t6&QY_)&ew`!ayeq;8oqYfIzYRXx_WYopf*R>q{U1|2if)OT=b|VfO?O*~& zf|I(V7_sdY$d#2@qJojskQJ${%6KZ3Xco$z zrO1!NIauV!`dypXJetN=!#8jm^|+~LJGZF&2x$<5lMzEAi(@hRxp4~!Dg$Q!+`lT%WY)eS9G zPq9)>;AkdUi9RA1%SP^|$8>AXfJ25hppAe|{>Xie=gx%7^FY5Y?w6Z^L;&V#{igfk zXWNypP7|cE8dS!!CNT_Tv*IqwCeh{DL@_1P!eN7uPp=C`E&{`PNClY(C;_YUQS06H z0qZ=j_^(#>uOg@4ME$oz(!AX5x$vJE5%3+r)lV!?MzC9k@r$1y&kU)up;Oz3yAQa;h1E7f_uX( zoOhTc1K_0WxWM^;-f2=~hE_??q3lqxSmJ_h4YtRqQ*y$3Z@0*bEkqj1SXi6OD_ox} zABiY6cK$urabJ@J@r6iBuE!Si17{8K>42%=C@}m-K%^gj49#5ZTo1dkKZxR~iTUXq zG*Gl%uf8LlEuhgLr>3Q)rp~5Wsal$W%S^TK-cqk< z86TI*Zt4IiJ}%CT^+{88=pg!wo9?K=LeR*e#kU!D$Pm)=qUN~2y3VdiRKTdlW=LMv zYn{-l$RbTbO;3X#b=(oo`e}c%`=-~H*NgO?Ms}#7V@EV zK#}fZH~Cq-4X0c9m57*WIt0j(Y;yt)fS5irM)QU_2It~#st)|};C;^YKXuhW2w0TJ zDhW~;9R{`mOGLkkMguJr)T@Q!VYAW2Oe0i-F>wYT=?%PXHF6e+{4_=yJY8FFO#JY> z0><1R(tyqjD&LPjKT$Ads%}0j+qG<4w25`5LTKaBVETEOpOqn%nU$- z-}H1V!;y}gxPfos+oD@mvWpfflI%%JNl3ooINeYq6ba9TVe)HiJPeNKo=8R0y&@u-B0|3KB4NlcCaXB*a5}T2po|&1Efh&~h zUXqggi!(+@tS&%-Gx1Db-fi!7VyRj~Fe(>Vo2Vn8jt`{Qxe!W?7k9Ryfm> zm6=%l6-iNZ>=?NFTH*FG(KsbUH^F}x=5)Ms&-hFjdo4q`& zH6n6g+WLX@DXjBr$_il&(d-ge7N+EJ6w^2^6PFG!=9icN20|j2J0s!B0i3e%U@91% z5BnlvfAv-A-)iXKj4Y27WTOcb8$oGJP?9DM7mSHqI_^Ob&_;!yS@N0D=uv&R)L%je zv&JTi{kU+K-;I<1$&Tkfn0CkMcFg+HDL9O)+i3|nU1xH~qpysIZQ~mn{XJXUgAHTa znj|GGkh|lfXg)s=aEfhkDSHU-d5>3ki90(dJ?`Uj$e@F)=rptAPZln}udWS? z3jzsVM8?1s0TL5UF0Plif^yr!N9rBF(Rxp`}+{pgPij<$%|N@fAO>x_lXAzL(p zgAbD0u6dsAwy}DZS%3u8&Z8&BW;lIAL}MKJvpj$4Yz4VJw|a9!aJ_%M_tziH^u?!V z8Br^&QDrgrG*u|mGqbJcQAK;kK8}O9T5$wxH zu`jC~e(T$m40A(h{oMNaH-D1riAl`J!%)c_9TWL@S-DzHB-hOG<5kb~a*`iDH8{l2 z#D`XnBR6Lz*OQl@lKM-DZ6Z+x83SilYTsz36!0>eus*De(n0-kP$FPs<)f$?aV#SN z;9pT{g}Ic`{zSMhii6M0##jQ{RQoyY!!sdzVXS9I_Pi-o2#gQgL{4b!Z!t1lfmCGp zdw+f&tz9?}@9G81N1~wxYOA7J11I}>$ZQYq-@9`=xXY%E(3|kO*>!QRJbZnECm|&> zuOQ#Vx-ro)7vl>#!qCNEfSLVkjQT7$SI^UO&AcGK!w((&x|Ij$a3$pBCtvhu#Lp4i z3d8IK!Z9E(dvlU+?+eLzO13sob2&|ntenOB<9M}jp>0c())cUR^S0If^~(6~PDd~c z!G{bNHa}y1-f8@QvC$Xn3K$rUW(uHrW1oKkn7P*5&S$t$f`Y*L1QG{l@-XFPa#Hek zP9Zy9fWeLgU|?3v^^tYc>ylr%^%L3dcucv>$LP|${Cqvnk)IpNa|4w8d_%qF85nTs z!Ke7o%#Q$pNFIin%G^uLzRdOIp@)Ms!eL|>uX^HGpDfvG8o}#SGv+on z1C3a`bXMM3y6pM0`cynp9p~876KluHPeD8}(+d%CuvrE6^*=(@Z>+7_&VO)`Q@oU$ud-1!M zWP#e|({L_)=sRAUH9UR1+npoX-o3W!Y~H!V(Ep>g2KYcqF3J2afJ&Ug$0p9M?qnrz*AVT zB>tPn3>o5KA@_(3K1B8&3hl~^{jd6VU6yY&O*gxx*=%%1E%m~Wi+V5vSTL%$X}&q{ z$i5GGzKmp8q+hEJ%a~O_Bw$NbYCfoXl$xQ3+v~5Oq5Pp~J&MHC79=}JZ6PC<80316 znhi`(G8=RzA0hz{hn3>MqZ6kjbfdw}HgCoTYp%1_POi1qC9ZwtnIDxoy@~1B`Ir~o zTc{PCDoiUX$cX*rS?1tUSTS-UfCX!?nC?F%q`%aU4)dKsR5J{AxY&uhyJNb;)7`b< z0_}%pXS!;AwNUiUHjpSS)i5N6gmdJ$9gmezBMIkDwW=PlD%6+$^gPBH4Wof^4o;uN zycTN)2deUr`*Hfbuy<~K`>jnR3=r{|wOpFDE_v-M_kZu2bZ>lWc76edb#u&hp|hy4 zFo0J_QK26ru?r2n599LVvWn7|7H9Y#9KqBLq=iy6Ico#?EMZ@0@Q(CrUTr#XK$jv* z9j_>~Jczv5gHF5}_}zuVOT2jG_CY_Yk))VQ3Rpu2QPy=JhLxEpYrxz5@_kPhr2iVs z6ZNGi%0x~)3$5nS3kGNn*qbR6;=w@~bljz~7uGzyVKSm*AU}Ne#l;j9^TE!stl{w) z$LtJ8+Z0F$M9S5Ub|Mo9r$XYHPzKhmT|2ZkcFp%bSe6`{l%7*)7H5|%g%I!ufN=`A zyf0e1R3?Vc0YleP+%k&X_T=!~V$63hDNKuhl=D!A(Z7$aQDsI6OoSD&!f`N-?|vfV zW8b^wrkjkL^_whQ+Rf%ouA6VV886n&mfSM&s@?3zHHY5~dC$+n_$_=>{!f1Nh4jmx zsX&)P%)0CB={qI0K{j4vz$;`L2xOl<*=+|`w=w1TrKdSTop|*~4e1{cq~%flKN2$r zvPHPUKnz~49W-L*XH$LUVH_B37YTzE8CVb>`ZHH`l)T=2~9-(bs0EH?P0?+|NF?#2J&Ekpo36F-px6C(xK%s+9~c zHA}40f|AmbqJsP-sj-fK+oalQO5Ljz&ILmSpso?n1Q3tV(AE%_9C~uvKHXqyYXrqB$W{?!6yl~xoBLB^ve$1p(84_liPHA=`WgO(vM z0+of#K+7EK*Xe7=-Za;y|MjVde)6dceBQXUtURa`{=H>oM8gFYT56PNrGXM_X#{{= zSXNqEhP9QJ6c-ofWF-4Mnb+R-MmbuUbfT7vg-13tPIlA?=R?Cn!QKOhk!HJV+dCWA zz5drf{qebHo_g}}KRov6V}p-skC~5JxcrYr{@{B2i6@>ko-)@2pElQ+Yo?#de&WrY zoS9Tv*NjuI(?e%jakpTzO#q~ku_6mb5i^;)D~y%%|d6#|s8+X0*-eC|UB-)}v#;#ojMMGD9 zSfb2OV190TVssD;sSTanNRXh`<|YTY;YMx4$VP3GvC*+TbY+U~&?0$UzbuvH*by$^;>atc*a?QAP-q zHT^Ru6N;!!ltouzr;#sB*2e{4T{@nUIdSvjl6?Pivyh0&!*nlHhA(NB~> z1pQtoDd2t55<*hK!wlB7P~u>Rvrs|U%v|IsPCx}C#md>I&z&!Ucq*WCXof&K=VSB5 zKGh6XIjG%J;sS9O$Ghq|QuPS^k#v+~+E#U%pTGCW_a6Di186@x`-z|aAOHUL-&gO_?a#_7I)DD$dF-SzD1YtkW}t13 z8mtaj2-dpl%&ceDE29Qfw@Hn~w!ZVVC$=Y2cph;DP*(uH&1d+*&>|NXy7|F4XX^54Gw z@4x@^U;gsfIZGC&ZA;HOohXuuXP+f8l;K^XuA%h~IW(du66%6Se{!6jj$-eTy5L54 zzmxivk>kb@GE3ofY&Kby#nTw7WRg5hb~ga@aK=fJgU>kHLSYp9qBNC*y@Y+h!QKrh zuS{wPT2uk8WFpu*$@Mm(O(fkY=wtIg>ht5O4I8Cmm#{=0Atix1rQ4QJ5-C@PNMd=K z+(6#+)4J86wQ}0@)jLln@`KRzXNs`*G5^cgtLvN4hpJG#6S7Z(Q~qHJOygVjkVJYS?dY&~fD^kJQ#D@Zc1 z3#Yn}V%`94VKMZ=NsKv<%vZA=5ZI;u5d6Z5=w0uiDeRl!_xaH>m(29HAp*kTLa`*F z+&qG6NgTjfqmm2f5QZsWQ=-Z9!sZqhSTXY%^yQtR5Y8zqJ$Y=0>FMw&&brJ`- zC=b2&D4B+OL~39>`H~Ip@?&`+OjpU3Fy#SE`6bv3gmSUi=P%G39P2u~40tf)`^MnE zD6!{x);OBob~E1Mx{yIaYmG=bt#x669S;d{UU8bVLX$pUQi?O922RV=gV=#JCVyoH z3?k-DW&pNPi8>~GzsN<=CvqgL%=HDD`B!IBOh&O}RGwF1;A6n(%G+&}eU za`%KJhMpoL2^0oOx4TLYs^{oxMSCEg7lV=1@Mj<|nEzsdkOl8n=sh!U5XXdwgweL2 zJ)r>oNIJq38$jGkSQJGD_$dl6JxhU>{(6ZuKwNew>Ij7fz{wq7vvie~5jz-fEg5n|x$H2Rz=!Dcd5}@|UD8s^W`cO(I zo(3EaeBX8|yoOTHQ!1TpP*ubl5;!xa<>lVXi{#HDmB=rU3!f?~7F(hAc1!1dGJv?Z zU@OF;a$E!F;|bxekxulmPQbp9d6BUFn~S1F&lMMu1Hr0L0aZwzkE-eOV$VnLiNo|I zqtcTDu3J$In4EoRa4`a|gays*`RK7&^~=b`$7aVThU3wW8fBXG13YWH^%=7fxpSld zfPtx}GF0;aY?LH@*Ms1hd^HUp!l1LZ=FKQqYy&^tZC-@*Wpmq0$M zh5XZ&;;?WH_yoi_@SJc0PIyjqAtv`t1GkqdNZBW)&>|(68{VOrHyGY}{go&O{Pahrh$;8LwY(=FnhhQ%|pvltm=nEVWK zA6w5x&MN1W^G~MSi4NR1aF8aCKLQ$LQxHYW-D~KF)0Iq>q$0F6y#XmH27e3MB~5z! z=2S^aa>I?TWXG4BzaXD?oSOmf>0IOa*m>!~ z)0lPn6>LZD(iyft{&R=q;%&X$TI!Yg!P zyJOyb;JHPwY=wUF@ecS2#};7%Ex@WkyA*&Vw*toJCRZ0zGC!sNK@YH7<-&M@IX_gO zDU^zyEyTL<{I7~F+c%;f{IvMeRPzTX8R@zReo=8r8T@POMWuB5#nOvXspeuwX}ok= zS*cw1RQcsA+$|m#{2n?1Q_hc7o=F#cHh^RZ6OaezSd+_7{$K$?Or!yxLny%yD3^GO zKRC$;8uzdT9P_)#`td376R+w4Km^zagmKskHK3hO#F2(Am{Kx!cTfYE_o#Phju`^L3vSFYNw%tRUd)hmrxqgUl? zPhG!JN%gzUz`;q%s~ihb~U zCCvPX*vJ=X_9Yif%Pw6;aHj4yB3B&KQ?E>92XFyZa0Un|*v!b@W}vc$TlICdz_!y= z-L3{so1-QMz$~Q>Ac}-9LS7mPGIbXq4=^sz5@PVM4@?nNdK{q$AwZ-zp7XF6`Y8VF zItu3xa-cL$_34)DcHsvZ5l*Ep>KdOzbPb0&a04ws2}*(gMRktYCeWFHt_au?&NMiY-6cJz9^R}WzUtPwEW6dx{p&zA8ODj)PwdB+-M4} zp=uiFYJ@x!DBQiS&i2+;xS3uu)ziAc8~X{-J_jwmb%99Iw9SiiPluzcU|4# z?#H+fE_IH>!vt#?&}iWvyPzLvsD}^T8QEP9Do;>Cbcdemcdn?>(jC+>)CPyKPx&Dn zMqpRqg&W2XK$X1(@zi1$RaIA2$(23;ODR==z^r`{xKi~5EJa{ujH}C?S8Ry3)Aa$)LoEIz zhZrKEpx@^qKiy<7jE;^B4G&v~W)9=GA@i^@g0A2rnqkXG7!8e;vG1ZAZ?eBE0ntMu zK%PJvHeH{|fpjYzI-cq|rf0%)6vB8>ju_V@vEGE|IN>{yFd&Hs0&o{$Kb#OnIH(C> z&%lcOf{Y0cW<3OgWrJN%`lrV);f(Q*Qop2%v+i5}&BR1%S zi4a<_Ph!xA1dv5Y2((v_2}8~Vke8_?x?zmuFhH$^@82VZMh8W?Q|^ejOVmO34)vt# zevaUq1b!3Ho4C6=9#h?3(UuzN4N=^oDSW3y9u9|skUdN`;j=o?-6`QVc{C{gm!_F5SYLYz)x==8jJ?RkN{mFWG`NANefsFNC1ZMF{mxn6-~~muY95}jxN8-;EW+W zm!iGp=u=|^z67``?w-O+#!q#G0TGS^+zbV@N<=|DKcHIxs}T&?g46Naa3}#R1REep zB$W1ZkcGo&NIRe@qOh@#LW~5Ck6IBph!V4}4&;+I-zX+jDDhrDvq4fdSCsIin=eQg~m$}FTkS-(~b;qM95TM)?BsnB} z%)f-M#}m_}#E29EI8XB6Fo`H5oGW_tQ6p>A{9Q=mun-XbOuV~?0N@da7%A6c24sh$PZJB_3rzxF;bTIvM0F(0C18*$cI4T1h|aw$~sl{XlA zW|WvT%Xj5zurA6&?4=U7R?bKzhlElUaP(5y$d=RYIEk{K(=PW3kA$9Z&s{9%cSCO!HE-;AyNX0QNms@ryv*5tTG4#$*Va??R^j?Kzoe)C{&YSHq|R5 zln_y~`W30EG%4KVp!SXdcno(~?POGROUz`|~D zGK+OA>I5_5>DL{PFhfRCFC#=GLBTpz^Go-5J3VfXas)>lKNP`9-(!mk$pG;etvfh? zbMyqBmN?%%8NwL0I9bU^D&BxMs0n&Q)1g?Vum|Ova%=|ayoUutc}(J`Coabyq76WM zAZ{Zi!|II!ubFx}kH~lAL2?a5PzjF?sT0v0Q3Zrr@R1dGIaR|doP#g$((o!cY_ap5 z!X5B1KQI=g>@tJZXd)68EWpOi4Zfl=JFMSK=7w~Nxk(sUOr-L|au0SRrQ~R!>-?UZ zy6Mw7y)SdqSSZC+u#c;+r<_&nXWs7z3=FFf-F6bJL*Opt4b5To(3Z4-Khb%&AMMn|Rg|uwqjZ|mQNy_y;-~?>5{?>Gu_S-z%i^4;xVlX|M%t5EvyHCZZ1Dl=9mh?1Upe4X*$&U0@BD>|lGLjW_z#xz^fj(4e5L|?XDVUYCSsFT#DSDAQ z1kUkoeO==OS7?1Oaa-q3&T1_b4gnVe*6eq}3=msV$j?U01UU&%9}_>aOp8Oe67eyy z??{KTk68>ngoT0VR-*#g8Ww_eM2-j);UCtfrKg(<0!SV(3e|F9OU6SX!XlHfkXDu$)xcX> z+bw+R%pj{^NW{S!9X-UCjO=IvmF07Xe~0J>)hqXeMMtVQRhJS&17y*i`xmN7IlvN2 z-K7Y1f5_+wun`p;1=%`~%mPuPy79yzI4vR0WfGKu-g)>S9FY5=STaXJm?tbF>K*Rk zV#oQVY|-~@KLU&HP??F^kRhaA>=<}p!i66)dLvjy2}iXj7=w6>Y(42r8H-tI|HlEf z9EUTc!QQ9+Kf>!oGI;>x!4-t0$o;8fg#vqOD1O&odo;yF#JrArhwesE8(H#+B!T;M ztb|#Ygems~qtGHVA8>&5VtYvoWr;zpP3*rYkPIE%t7XbRtH;MVAs*cS0Wmg4eEJtu#mGy znP8fjfsGId19k!1-^zMJM;)yg^#SOYN6Br0r1+Qn>Xj=Qv@Oo(*fkQR#d@KKXdmMC zldl~UhH}IjBxQzm!c`-RvyM!+@B-whodh(<>?D%xjFTsDH>JS}8qPnFaEy?9pmKdB`mc)5alZnK z0xJcVjklAX*9dkRmf9ANCP<0JAvVT((;=H#Z%B72DiBvcILhdzaaSZf@vAaLRGa;h zx}yj}da{k4@O@zz9f3Ie01ogI06*kZl6?-bB2(ptJx10BRwm(0JOBp-SDeHUty3q2 zg3W|0u0|dZ2L-G%XI-fd`1%@ek_kp#rs(EZtaI<+xHAw!jK&l6hoqzilht!WgQLiJ zjnNV2pnI2)jc`H|2{ZU;V7`&IGL? z384ZeZrmM!mk0-&E+OQed2nxJPT0MMG<@(`p{ti$QB*gqo61cn2ua?9U5BhwT%x4pSHn_&&nW9o~bEeS(`I^fHtpwhWlt)T3k4 z(sg#-?}NDwKs_i%;sZapanR~G!ZVR_AHmuL>Hbb@<4Ow0N)946Q8eMgmX_H)lqJ1P zZ((HdWMZyWc`{;Sr+$j{wM8V^1sM(FzdbL7%^TSO^J`!dHG^$l->{L=WUykSGVYMf zI%{QqRG*&wRWiN`d@hm`Z6x8THuEN;A{h;yBsFrc@|1Ath4DpJ6B*x~<}el)z{kwY zkEGBz70kegMn@vfY?@@^%m_8&_R1$VuIbE-4W=bZf}w@8;l{1O9wMJBlJJu1^h-^$ zjc+=1Xp2|kJM78#axN4FKU70&2!RtqY#M>^UXTL)h;PBz0%!$Aka#0Va?;a3V)5f- zbOqdyiH1D+5KP=OTBi_>YWSlNh(F=sb)iGr!LIv*Wcon@MP^<|B_hJ~Z2Q4j7g_)D zUc7*D_6|p6$ovK;G4(^q-$j8ZpuaGJ2bCz2XUfeNMy(WdqzJ4V`Xh%WHoLehx*yX17DJOB^S1!mC1jG=R6>~2$h78(CU95#@-paXjtyNY{Xwu2K=7c3G-btaj) zV+Z!EY4)Nqf)|T43Z;J`;i>wZ>@5dI=mBHmCO-)KkK>SJAq*VdvRr%tRNygCL>|8(sJMe2W1QeV2oQbHaeTuE#9`Hlp1%~@B9XPiMw?SMx=fT#ZY*?0 zA!tMhl`*X152dK%@B%8Jqz4A}Ln~7G2z+8dnTR7dOHB$pu#Up}qlkh;7BPW+?}W%C zR&hT>MmBK(=pJtQArcPzShrOhjpXO*8_9Ufwru-kZeB`+Eils?#B)c=D+U@M%=9oW z4Sqhg#0th)IvRE=EFxaTzHx#zD-1Re1;UycBw8;?s)uNjkF*-}@Od&UtTV3`rKuoO zXP-3!6=&&;V-hb(iI8yhI^v=(1V%LoOgeC5Fp`$w6$*Dx7lKhm!O9AcnF0oMyxT1(P>3w*5MvUpuf*IlV7L8{`;wb z(9J-YYMKxL4F_i8jVg#Z>D}OS5vuZy5#B1`9VPLze8zvbZFYG9Z@`BNNC?qJ;^ordPYZQXGciz)ALwJm$J!aduMT|Z+vwv|e~;n!_|$KdL19`a{+B`@_5aD8UN9ix69+R1d@xSC z!hbid9balXP`!l)^HRriNUhCf9j^h_l7z&Wz=&J-kF_fkRgJa0*@8W+X z`0oh~O~FU}o=|^}IaJ1`oH;wAs)t-2T*)_C!e>Zni1Ol~eo5BgFq8cb5N$;-96 z+REBk4gCf6v;l73lTDEDZO-XER|vJ-pP5$UnoOMZ^2dp&vkbj40S$NX=!r9V7pn9~ zQK0wdT2yMGzYP6SSsAa;+>k0Xm41BO6*DU>dZJ7q2Fn$f;6UWDiMj*0i!&y^XgP)Pwf8o9$b(J@6 zASdKnRZVUE&D#w(D^aj?u8_(|GuD+mqm$N!MDwFW#GXg7GeXTfapuzPCM-n_I(<|k z6{ESWtDj!qhQmYh@bsbKp~!G_WacPZo{U6CXO4~HaV|b4k16BR$HvF}<6*-zqakDr zn!@JkcvkhJIiALXgbJI+8n$Wdk}YbFI1-MiGw7P;cKO^%G3vPF3d;-kC_*Xi_+*Y)9q; z0UGO_l~>c$aH|eL;i!wc4O@iL7NgbbvP7&X6SZr=lFu1oZoFQ0nn;T0_|!JpD`2Pw z%Qq^^@@P$V?lJ@@>w7BSG5_f5B`el%$tby9TT^+l_&koM8bs5H?V&M?H^%;F6z^D4 zI2!Td?GNZ30J-uZQm0djl&1rx{*K04oWU0_U%g(QbL8Oe^v$FG2|^~;J|*!&%scSq zl9lVXm!e>>EdNaL#qw*&%|%WU8WIkTTfK3Wl0Ph~l(5cBsgEhmj@XB~nr~L%t*NB6 z{KmzjptN?t%e7cCZkk?Yf|RFg;gXf>if>g{7Q#b3kIPt1y}0)D4~^U4fYSXm3P)N= zk@6;Dl2=wq#hs(~+8U~FTtd}L$>nS34rZpW?Q(yG)JyQ&T>8(JEIVFbU4A0#WPb5Q zB_TB4ZqvD$>1*`Ph|sW! zS%Fl{z-FuJZw2|oXERaoSs&0591b>q9jbh3-Pcm|8Ga@&hE(Af9zB~YQBSiBNmva!FC{@gw;q$JZ8GL+Vn6St|so zm*OGw(dCtwcW&3I^5ZN%3S8VnE}6;YS4nw5Dn5l&w;&a=jnaJ^rw87EP9DuFDA{q` z9He{@%xZ!ZmMRu7WgM%?T)%7Y;S*;N41mi=Z`u?WMunouE!5A02ld1hLU#qBuzd_^ z{!R5&*UK*yoz6aR@O;i*Q{d|eMg4{y6*;Rmr|&z0r>7F6T0#9#m`a3DN8qN*V-&8n z6p>UyLeEt~5yw~`pm*THUcOk2Y`@GCWxK|G)DwEjjFk8bQQz>Mt83P7$vkirDUjqx zi_XSk_gXv@nIl38`0%66z$z{8#0~5oMI6T<`lu4 zggxpMq!Mo900FR2sO)0VnPdBRW$x*60*mQuNJX6b^aU$7?cAGnLWHR%lY*HD@T@%8 zw?vA>CrEV&QZN#OlprMQMwmSJks%`_+qi3_3D=k*KEl+ zfPfc;_b2aM7zq#}!{>p8)kJ~tl2VCwF(+7~VL=L^`U{1pvi59GyJ89c6DiV(STtxk z`}vn^w`LxMjbKu0DL-~D3c4LMB~rd9u8)3|5*<-(OzC+!KsJIpT7XhX(W#^RcC0P3 z1XN16bBb9BQUP<`oF(hFL;XNXMJJlrxz13Elnhb;!BkJfR*))Co(tNDl8E>;OIa3T^Nv~EQI%2zE?8)i zN;C^fQKxDpC?bBo;AB?j)}13Bp?!jq1)KLraMXZ#<{DVJXw|0leOVj>N(RRXE`scY zCzc`w0Zh^fy&wfU(GLt1-n`=&vcC=i-L3fdQT-e0_U_2!IyN02*`40uzB zj_m|I7bZpOhw8LRq?%MxWG9#ug2%Au$8@{WdYqFo>g&t}%7{|Lpjwk=)*xmk`BlrroA_+riGvxdYApVw8YXAl-B7Btwj1W}#?YB}T{9Z9$A}lZsP-LWsPa!=)@GcCTo%km605$iI+^N3eOT<}4#i!H&hHih9&8q5w!G0k6j%zn_RD zwo5v=wLOWk_>b{T$l~@A9qM_}-PS->0vq?lq1~%$OkUJH!c~%SKPLOfM+hmn*H}Jp zxoRcOU8+RIDOZ)4ZB7(P#iVLQi1obqEdGYU`wK2>R;khAqRT=8=- z0(;Vm#@wvNWVnfO8XD1k7@VMcOf>?>^DkbjMQt-K>!{oSXpTQt!6Tnlek6r?V1}gW zzmGfS4eY~{S-K6!N8Bm^&cwhkih-TOx-V$UXPr5Jr3!^}UGRhP`F<&s$W8dac;21a@Y%A=S|#+d~e$Gv>VKDsz{)hg}iZO=k#yOaJm* zvbJmhfD5SozfpSTK<4UpGgMK~NwB^=Oa33}i`R@@tKEO<+~sN%6O*!_C<3r?rs=3B z7#trpXbn0;C%#e)(~Tzl%X21_-=K1hzzgcDE*BliT+v{JsZy<~82(>U!y7B-uGo33 zp!CK~fEDzh^k!__FpfHf;UOwn8R{AB)%NOoJMq;|P?o_xj!~mP{{bk3XpMfm=IZ&A zx|P*PvPk+xg2dA)66586U$^h%xhrA<1H&Wo=))+80f(Ky5NtEG_O*opB-htg)n0{P zkLXZl>48g zCf%rRzfo3neDld6Cp1qS(i0;-#k%Sk+`9^Lxmwcz;II3=y|iRyt-Y;73y<$!-esci7srvri}r*V02e;Xon_mP64;Z-}k@$CWl!(^!F+nrF{@6&S9_nUk6f4T1r zwnKw{u%(T^y{dJvYV$q^@bQb+WSfu%Gj_T;JL4I?)JmECD(xsG|=)bj9pV%QJTGJ{s(XWVeobB>$=xlUjNn~ z-u__zremcyDp5M!JczMjm`ZXFZ=YAuYeH=&-3BL*EzUfz%RF%N^DT$Ylw89i4Yqt6 zv#qQs-t^(izy8f{fB*Zzm$fhJUT%3=`TaM4`S4w!5Obp?MSo;$S>?a^IRX{QwO}2ML*cF(7Sy+BiP& zIMk|Lu{Y=J<;wcTQ4H8vTebW5zq`W&*1n?rZe~VRZDaFT%M*?Dm6y-v=vHiM88oSI zmlFe$Il_S02~NvM+paJ7oG88oYk=>YrLV6&^2+ZzdBB=iX8r!!XP|2|)@Z!tAL*+kng_wd$v*Sr3c5q-cA z8tJb7eDlFGp-s4ZSksS6f?nz1@v4l^br|{~r?)cz}IPTb8I>bi8?H=l);40y+=9_WB!d{^6}Z{^?Kh z+e7bY-_gC(`i}gz@}~#>_|_lZeB*V{QeK(@4frycisj) zkbCvjSALt7(=J&iTjRKl$jd@4x%bA2G$>Eb3}&i8Q=8 zQQIPU;iC)YfAQI;bN=@62k-y+?YG|i-N~M|mS(da8&X(}xkar5Dx%kvbN6w&XE20` zVX))EKXzp0VUJ@+>c8L8**@pBx8MEiM}MFD*%u2IEnc#8>EJT$GTpM4Wy;b=mMmVh z@Qcsp{{5rBzW4U)e{Z|fVg#*Q*!+1}+vi?r8(>^dMtGa>A0}uShwfbY$F{?{V)yI6 z-`v($@aB6Td@|?L`HL1WUA|)Fs#SxlwX1cjTUINp9$C3!`O?LU=6^QllMmi|Be$=u znQ6f`z|hRO+(EPmmF}za3IU?cW*Y9QmZ|8rgFe4;XTV?)bSC>-JSTV- z04yE8Tm1zap{n{u&}nY(ZD0J!7mJoIU$tg!+Pd}Y2R3Lo=r%NOP}YBEUE10;t5z&s z^u;HOT6^1@L8r04icQn}>N@}lBL9ed_z8dUaU4U42@su;dpDP)?T2ds^D(CXc5CP0 zt;Js~Te$`_Hf)f!gB!IQbsJkY%35W^H`lLATeEW67hm2Sy3;xiDmN?PEbLEPQg`=1 zp+fMh=F$7NSHVc}@jj;i77~s|ZmnIi7BsZlUMA7FQPDoUVg0(bOV`{S0R*!c|59<8Dc zOm7{<^T?R63~Y#Q-y0EVd?Lai?iZ5|Y4ccLQ~Kwb@FHLtM)VK0wBH>WC|JKXHSR;& zwDtJ|Bi-#SqcrRd7@W*6G8%fmW>~tsu>o+~Vc%Nz&DoU=KOIl#BVf3#YrxoiWPRF( zq%gj*A#Ht@-Z*%-t$9@cRMYJ`Z1wD2a}MbzOlR^+f;oU7y4%^_(%es*iX4btpRTLE!v-m7BvRvZkcDv^hwt6W{&3xK z@*o=TqpKugzIWcaGt#B)(si|WDR*Xd;*#Cc+{2?@xo~{_hsWyg0tt7*BqT?DGC3+B zWP6&+=Y5%3e5LAULsQdT{a~}US%=<&-N@&B5>14!6z~3WUTNdKVKy!5tvfl6*z&l_ zVVwT<%Jh%d9>c}CA>4FTuhr}H1^O_JQBjt?_T!z`TYE7^(riq`L6T!&Lyz@$-8}n` zMceY>7J8bhd5jB49DVY3?X~=Ei~d$r+tG_nK+w`6d_a8I#ir$3A7OlUH(g2pXvLoM zmG$PPMjqm--rV$LedYN*D?Zv$e!HuWk1YRtq#PRKZ;O){iV~ZKU%r@$fX9P&DwaRK793z zzTxuG%_~1#l~Y>N+@+#7CpVGciHAz6IePqdHdLNFw)B%#n+{#9uWkzPPzHT<(=)d& z9@@O}a?g7WiIg3nFs`$9AuK|8K||I+9mffhbB-r15ssKvSMRPw!~Dj6W$&Kg6xKEbmC> zmbIU}w>F)epjyO`1>T#uyulAm(x68uK?A*^2>-63`pSjeBbgiLzOzufU3cU(dG@y( z6HW2P5K_SVn!1{d@KFc!1NhabA4fuWLLb7vCYpW%G(LFqr;q5iYZtyfXG8koQ}||j zYMP`g$&kHG`DIG&oIn=?GB!|HE6VZhyEiR=|J@~3 zNII(O(-pI!x+B=p^!!p^b+x4Mc&WBjSK3u- zxcFZPcefxH;P;32Wo*|jdgtx=Yc^*bJduC?QbjE=mbo>8uwxv@Aeq~gUnJwC(4sSiN-Nryu_5_1FLS{>O7ZgTvpn zAaj9cVQ_(N!Bza}m!Hl3`2DwDd+m=O%v-Q{<+{yOfOs;Waxxidc+%QUq4{&r6srf5 z4*XJrt*+qb@$9U9nL9SGTfOYd1z*hj+XwHx{m1AZdfwFhA^c`0eht2RV9OaAE-pojJn>ASXX z+q!wvri~l5(uS7x+V#5imFwdhl#R-!pKso}b^Fd;8GH8bKXfD;xUxu<0^l)TO77EZ zJ;(mk2O3V4p!}ep5k(d$e0Z86<#E(-Ra)LDBDr6;Co>~`*N*Mm zOIwt!%C?_?T6)IrJ$nxjJw|b+!w2_+zSj0s-iv(25h;(NBiwNY)1Xg0zN6@-n6-i5)4P@d&5td{O?HlgE#N z=z)EEL3MX#rkoK=@7kr^rQ21vE0!*2D4GAddyh`HZ$D@r&CWTMTL^4WZq*>*DUq-+ zF;7s9s#FyTqU8r;5408g5s$@OK!;FiWy(}NPEsH=V(ApP1eeP$ zoGr{dbLzzLV@IcafEko^EGP&Bdt1~ckixJ3Y{=AH)GP&X$fVCzPC@oji5=OkRFr5h#{jCKL!1#o*x<$!d(p$)ZJ+g_T$2 zb`nh`@pH@*sV{gGpwtw8+-^r~95cN}2;+c=FGBx?+}tx~PM?mS>N=@CsXJMBGI2^i zt(^H;ZXN*FK~i)WQCre*9vSyv0@0*wC3T`y*Y{JhL!9l9B6=?g@Lh2o(6%bTH#HQL z@;mdidAhusJc+=q3x7s!4TxSjCP_f9lx;|*m?C+FR+B}`^As8NM3S}(ucw-VGXhL; zx@k5MqHg7lYXE=-YAk~ZpOemZ7Hf-j#Wf73`*Vg7CLCQL$5w$L*TLTF#r>7jWtgI> zKq9}{#KnuyT9qUoaO?udngC_nnn4qe4>!iusy zMuok8O$ID%=Vk3>-R0WL5<|lNHt35(4=o+ z1YP7nj8NVR49~>mcy^-v45m*?&5kw*IwB(-XJiN{!1wOn0lI4oaDWNj^;UhobhEQg zTc@k5sgrLam+;n)0qTl(U7)&lb|JrkAZo{rDkf`EkW7o}Dyi65mi`6m!YUd-(?_7m zs>J$%oeC`34uHwFv;YIy+E68|N0OJ^X6kz|B!($V;JG z-XGinNGsqSS)d9^R0g8H`P*J73 z9UMNX?veoXtK545c&L5-14LrXKs4;2L1?hF!D(9X^0|V16hshWO1ucwpdE)odO?H| zs1V`-nZbd9{{Fr`skfs?+oS8LMgo-5rvQTVdF1u*_<+m>0dxoi_O6hdDmcPn7*Q!a zBi4vX5W*?pn-aV!h>QY-R~`xt_6}$VbOTKTL8RCyz~y~e$DwuT9JP+P6GinXvHZT5u|AnUo;Ncnu)q4y zoDvoIQ1)*VgEX8NPe!-uh^O1Fb?e->fC(h2_@=0s4?T>`U@Q&F7irhTfjmgP^pXSN z3kIR3!bd3(@!$1neL7z~3OcEWD9jXL5)ghi0GJ2*j%g@Xi`)rok)B!y=8(#c|4fCHQQ3(9 zdm4P~O2F>aCaAf|(SOqX@UtTpS*9p(qEP9GImNZ0Z2=ag?rD6$)< zEk2cf{B-Ua$7#)($m#fL`HXUU?2INien!bv&|6J|k91~Q?wR{&W2njX=auF?fG$t@ z_+ddK3ui$3-RF0X#}l6TDJQgvNPZe z01YVYdBmTcyv`GmZesLu<$Lj9Z}zcs#b+-Ncn1J0I(mYAPRJ-S;2I1M zxrQSc-aQr>_ZT8Z4+f7|Jl3eqV~;w*NE!8@XxihM2Amq@TXCmGJzI-|$3lfy5Q$orP_u59XXWUC1spl{PisfzX}(@<0qkB9rFeHYmop5vbc{ zB0{r>ID$?|orR22>6om1H{rJq-EF>kz5LvTGkNAPkj`oUJT6DZ4<5)miqc!vS4XqH zuHGmJB?b}$&MAaE2FaNCCvo|mvPwu2gdULsw&Cs;imIV4ay9_WX>VQwuus?^ANcN} zgS+=o8h-)ZdCucs+If1_MLkUQv^aKREr?Qy*TC+1)=0Jxkf!uHMb$A z5=t&p)ZuYzTwYeTsP{<#db2W*_p~8I2rQVwQ`y<4+%Y|f-B6xP_^)i-zH46=Q$uGn zOsnpezOy$0YLNlWSExmenv?{EYI~fD%g>q@#W}<3{rxB~u-cLG19HgrKXTw|Aki%7 zg?hA`QA3b*{1jc0A;tdpGI|=ll?B9>M zF+DULqBi8nde7R^6DE2U%9C;T!F4DCI&g#tA`oy{Y^^T2*Vz|=+IwJaTtJI(vw8Et zyeUSF$!}Cl8nfS|q?DheD!GCxT|gax?4xmyfuu_4W7L-8z`<-+tOax{mDzHzaphV- zd>uS;;uI8yI^AKrVHXUKJ7Iv7ag9M9pJ70{wQSJ99=VKRP*Y3^vy9(0CN~39kO2wW z60mq0%suSz0)Rnr&vXHU0iFgy;fENv0EGa6T6hZTt0d5jzM}yvT@Eab+?>OEcj-f@ zPGqLy?)@tSv1Z+DB|5+jKM=2-(Mgi!SqLniGDA#$k23$t()1ZUI_C z#3OrW5Y&4NO}kBu0~jE{2TNc&uy{hK3VI572ui|d0w<&dB?uLrJi2%HF?T}cBz%AA za_V7tkQI+mXb8Znv9;S|GXjPKa2z)Dw*ef7#E={&d)zS-{u=Q1nKQ+iaJZde$U<>x z+_GEavbi6kLkB<0d&KBhX6)kg1Pna01 zQl63g=RYT`S>1swfU^~y141u{8d~p}ZDw#KTc^XNRG2^dDrmFVHOT$H2Y!Ms$ql#= zH`)~tJciy z)W+P*j=RzUeYh<{=x>oQrnU8r?L8KQbtcH$zzW_2tTMzDvKa}~9-`9N#~m&lW)KZT zq;WZz8wnhFJs}{-YrIb1gM=cFA3nD~#{2{YKPY?~>e3@>img?j8S5s8rv$=Gyls~6kX_UP2ta`V?A$rqiX|b8Fh4 z7_mR#u+tB_#euyfJEuFGtR@=x`ZI7raT}npVd$zxRTHZ}LAr{13jk`)2Fy7C2H}R_ z+yg)7p{v=4_oc6H4J7%IeD!metYLnR0mcf)g=*hAhHNI**5sOmZBFQ^M7I=tWcze* zWfojvshp5egw+N58w2nbHQaDRd&jVa2su*Yw?Ra1m8X~sNKS{3nvL5t_Z<>EC2el!h;5vCnr6ec8RKn33uJ_jXj1wbb5pwy85$DtPRGq? z9AF)a&&!~i0#n8fOc^I}0%YPi8Gfq!LWmYIemvKtReKXECvo@LIZM}W+>yDT4%10S z_|B-!4NiirF+tm?eVW5QD5MZ}eMcBqwy;8sl^v`63JyIKc=;;U; zNqCIC?Koh8EJchEx)WLzBpGpK6Qb0P-OLDwhGA6bG#H0bnE|y`_l*f_^9@oMm^%C% z#-S6!vPe)}4eo=}!Hyr&k=&9;gY^j!-j3JC7KU0fC|D~6+CyB;4l`RR8+-w8F2vS` z0#{sRE9Tg<0G-r!?%oeuhv$xzt-EWmdC0urhr}xe7Ol2$YRwe8fu!Yz#~E~cdASrY zH3 z0bCJB0H6;#NJ!-BCrvPU54kx21KzpYk>V$8Oj`^no?SZjA;<=k#i?&>!-+urB(Qcd z+n{|&h$KKen=bPaD6$8;TjNU*u87 zG?8_YaRx<#CS2yHMc~Ce92FqEBZndH>XXhY-LueSBOvgqZ1rH8B`+`^xQU`{Z66cQw>k&htafCYV03*w$;)y;@ zjF63`TZpi1u(6qI8hxrjo=JEw!0wZcJ;4i>t@`Y z`{~j(NfSHCvfUYG6DxxejeQW7jO~RlWz0|!4{>;TV_JN(SUc2KD3L%6E0Yw)^Mn}& z&@J|CajAfb#e1%5%V1(vMqZ0pHI3Q?fKV4p$ORZbl~BpVwq zP{18xj>bjzNC$0|P#_L)NhLI$SLX%7FGB#Bcp z14v-ZIiALBpIDL2Gw>10+P^K3u{U&JUc4P zX+PXq;X$4uP%&-~(1{hQg*}Z}0D-n{GvM9m4#Ykr+pktw`C!U<4BHa+an_hwf+185 zIqfVMk2?at(a)Sn;K%`PW{~FysN#SOR|T8M2oSobi5b|^0di-B_m%@Vuw9w8XZLsZ8NG5_+irYuoLm~gogagn)5PS}I3=(m9XZWD3E(Vz+eYFBn zR)M}g1c*7_La^!3+z13iW;J9TB+G_Y#OI2HS>1s~FREaq;LrjfpMAx$HMPUA`*|ma zaq%*+s=z_Ood`RLESzwwWvo*iOa=LXu`*9aptx#SV>Cbq2H+RKjp*?r7QW69uIA1GKNbu&Cj{CWG#!gTAPy{;1$Q8FmOOM8(Bz{ylDq(j z4#Ms-;gCvLc(*k;160$Sxenf~sxAq4?!2!zy+hd7VVmD>Ru7>V2xAAqxG3&vE?k6c zIGpj~;1v_Mf_NOnEvy$oqRkF1$2K^G!xk<>Tk1*Djybc@TW8ZhS=)M8+hMpPA=nZH zTZib2I~bZ*!pidLqkt2Q2k*Ch`Z!c@U+PfmRe}6tXe#y%v72dAJJeHAgY|fZSpxt^ zD!L?$@5VfL99ZLCr4B|WX3zL%^D7Kq*C-npED6a*am->j8zBW^ZYH~q4tUl`kK!wt zFf-Hyk8bbK6&%!T>>MFN{0;%A5TarO%!dIPU<$dw0B?goOUp#;M64UXT#kOlDf`Pd zk3xszxG#omZo8B2i8urtxC)^~onQsaWCb$;s0qa~Ox(oP2`0i2j|T5EHxxPOyU~ z6L?7g@Z8G=7+wRNN_O?$fwV6)tW(f!kKG1Hg^h2}inzv9;|rfwEYeGIaA+Y;f|T*) zfGXuzwB0k3L9s!B75j9s;F$33CsX+V}2xIL^uXvL0BZzf>H zi!OA2)$WFDh-tvZ==FU_JKnH%`#zd?Xa?<$$>9<2ylF3inSdKs?4BcW6S4@g|(gP zVz&2~A($YfqOrN`KJ|!H*ts*f>~26yLL%hRffXAy31rl4H#8>1`a-XN8sM;!FXLcP zQ(w}!BILooH<=muyt>SF-2q9JPQq6=hq5=(W;x|*Qc_AY%sb#05S#PHF0E=}}pTk=xDQE?GK?C{RBZ!NN1tIFal-dAq{I zQcR9aY(FAB6t#5NJ$&ZSxg$(0-vsGg^q_Y@0{qNmKbQ7&ob}d)H9}Xp5N#z3Z|E>u zrQx)J?TfqNd#jiE0&uf0b8W3RA-I9T&nJUFahXqgnwxZ=jXKXYS&TNTJNF^7)rt$JZkU664Y*l|I`Q9wHDw1?QFkT{U`2Qx>a zpy;GTojKjuNj{IlDx84+D%jJsja<-LBjh0wCuD1VjBHDh{-muv?u^mWkU*lgjf=i& zYi~8Sc8!7+_#`&7J(#=#Acw?h;6})-xfYDZtn;k>_DI6BqInNOf|FO z;@s5MZGd*jq^&l5VTV+bJ{!e#%vcl!{;kKOfES8SI(^@uJDRwsQS$^lB06@KicpnE z1ijBGnjm~`)t4kwyVVd@`FUOn^v++x(F9~jPx2+~P6wx7oSQojC>^D*?mpHTKK>~(gDUvj}2oj3e!iM3H%F+vHkvspN z4K5iMefxbgWP@cQ^KZ4|S85y!c5JwmfE^pNLkdiCN_goWFq5v*!US7Y=i3MN+|VKk zT4V{ia5i4+%AfD$`X>!LoVr#7&2h5^_O45*kGXR5ntEmy@Jn>N3`~`c*d2 zvGxYoV8cuAgKB^fIjx<&R@NKbqY?k{vV9w2-Hmx2;w+@=8Ce%I<9~;2WbwUWze+aF z(G9xG!=SK*O{?>%WMS{m0s?=kcZvHm$oAX%?ILzfW<;FAu=MP@!GL%W({Sq0b^B6bm`Ish8kc@)|e*La&^KxajZC)E0Z< zLS>$hISz6#_bYB@*AVzsL$?Xu<#a+m-rIibZ1(<5>%RD8-XC9n>z)7hfBovs*Ixf^ z;6F5PNUuHi@_+nq|Nh6f-}>zhSqOwcSvPifRsHX& z?kkx6zvub>|It0FbgH_}>FVmYPo=+qdsl}owZXc%gt!P0SJ0dw%<`$ii@XjqgHkYS zP4&@a9BH%xVCVTCRvY4yQf_;6(nktxgG6Kq2ZO+$eeuo3d#EW@mWDg4)yJe|sG(*~ zaI_9H5R#tI==`65xO>g~7qc?j=JpvrY0BJ!{X6%*`Lk+FpH2LJ$?omDcNV-ddHTeG z`8la=^SjSjx&KFh`LuleX3^s!JN=w_xbpGx2&`$-mcWGCIguN=sR70BZ&O=(*4StPpwZ4 zbRe~rzN*%bK6!in*c@-uv@Qe3%q!ToV|U@9!$(hwV&@z0zAfHiZ=3Ikx7j-!{-n2F zFFsvVeCo)d!-w|m+Oefz@%a9^ZM?3R|Aw34xWD;T_6E?KbqyRUcP}*(&i@etlw2pRRd*hK`vyYsuQ}g(qHr z<8|W=?e#Y>&HZ)p27BGaY;^VphhM(##GH8kMhnbPe-nSF_itOfd}3CYU-|1C_cm!s zBPWd?H;#`N;|!2Fo?*)cC$>Tm;{xz=kgnofP_P-FDLV2f)F`h123|EJ?(@S?)URJItE5+r!~g!J-4hxO^wd-&AlyD;MV>T5Kc|E;&)w^Z)YBt3?O#zO$M^Ti$SCoo&v+;cU-dEnl9!@`xTkGF_{Otr|y3B;G&!haapS z(Jrae;MtoF0?)kt-uv%iiOFlPiV|6Dl!VVPtbK5ooH0T9?-fKeenMK?}e}cO}y`V4_@&;d(V7dAPT|v-ZS2pnB}ih!tm-y4Z!8# zaJ&yj_8xmLY-iC`0(;L7S9|~a$0sJ8-l%;b-yim3a|f+jQ8q8#u^P& z?^G<%xLSS#kW^MBJbrNLy=B=^seL9bDcE!J?f2h)>$Njyii^z>M{$WLmJm5u!ioim z!*7Cg_(LUH@%zVyw0zT7$KKac_q|zCToOX6D0X3a3LI8qAajU~WRJV5sYB{z zZM`+GKd!ushK>Pw9PWrtR8%$l&GNjoj(tYW+k704Gc|0IrN~`eR8(Bdv4lnzIpG(@ zZiJtA8RBFSFJ?ukVv+m(qk~$Wf!H59TkU;=Bc{Smy$|;Z$XDC|-Uckv34y%DC9mxr z*0#{V8=;Tes)@3vWMHbp zt!w$$L(^W&>^NxN&J)G2VyVn)CBdTj(^!&3zaslTIRe$7Wl0)|T7>07>@-)@9DKzj z?dhWTj|^&A45@w;9lPfZ;yZo1*o0D?NUnu@Pn95{C^Q6w4Y&prqZc`fibF*%WH}vH z4%j`#ufMq@t=*?4wNdqL`2e%NXnu|bJTPMY$2!xxhbczQ4+wYAh^&P>EL+h(zXtNT zfm_JXS0!Ki`H?9Z$=xS!C@g;Gd%%s^E&!bO-Yh!s%UY$I z&oB%MgtLx@RTRRpC!c(bGseHUaQmJD3xEifWPSEkCY4|RcuU*n*~4dVJoUZz-#C5Z z6js_PDu^fn3V@(I)oBx(bvp!g@2Bw!P{mkvQQkUglc!f@XMgH9!+?7V zMm@Za`BQ*V);A`mDSc3FP)i|g;MC^=IydOdvrkM+8YL8Uhfw)FdO#}iby;5-`}ajj ziP?je9DViml2f!S@Z?Exf}P}85a>8@G6Y9IAx>(DMv`&DbrL>`F_2=M(2l=;>Xr7Y ziFo36zIqBwSlWmD;)D)2nz&Ecg-S#^;TI^}M4|*4C!1I$D;^|Cm1MCoggsUPCp}g% zh;ge7CJGTJnc~(@dQTLU92wbSe2rm)OwsV@hWY}hu@p79bNro3U0hb`p;52BmZ8&{ zC-e-CUA$XqwHABwK%lbePZsu0%^bDi$mxge z!Z@y-P(Gpf^yB&o@9|@=o|xNiSEU~hk~?$#QjREFO`^H*y7RecfHuO^MrMUuVH2Pv7^U+ecXfPqq8zrltQw9 zjfve+g4)yXMDRF+QrIyAu7P^jz#o9$1PNP1C-mcPEPSigd!l?-}OCgREOA{70Vm?5lk<|KTzf_7>on<+o z;di~VMfq263~SbL`0`WVd;P?bBS(*hkGYN>J9d;GV@LfU0V01T*5{gV&13pe@3EsL zM`vX$xe1|vjtVJPg3V$PDw{@Z zN01+)Ac4x@N4!Um6dj(GIO0!XdXC8uqO3EY(nJR`{X(eXeK-8ig!*E2qamcx0)f*j z&Ru;}`H()p)vy3r1B}X;>l?EZvu5l=Pjl3FSRSf9%nk`q9mqsj2ZcaVg*}H(9$nsP zIZ69_SN`06$AX8&5ph@^;fL9gAl%Sl?a1LH_|@2vPm!P>b|Qv>DcVXT4spZ)i{mh| z$RkmRIlXm2)amL*5yMq5uzyBd;s5IA%DP>=7o(SUW9D^#f`L6^WKpvPlo6M3X{9x} zl*T_qrBT_e?5$bx$z#?Z#c5s#4<7PE7Is)D84bAZgNL!Qoga1`f@>V+@LEFahjr!G zjvd|DZS{Rf{73f-lXo0Lec2Hc6aq78MW7UEYbZeFP;u-~Sg}cUK}t3bI}RN->;%%V zskCCMy2wM?$-}eK(>@AC?yz2cU!gpj;tE>}%^>+leMEd~{M0h`Sd%5J=~Z8!2W%~i z*hdARYs^0nq_^xc>)=~O`}fx#WQS@Gx({F(|DjT>-Pf@ll)=2{^0ICar=?OA+U3>)gN?Y<^Q2WKKRXpu0!yeNHPzKLlKtRgHFWyDe>ST0|^4W z;e%Sywtmev-LYh{VH^z+L|`1|`~9iTmI*NK!&T40xX38m=U-pAQBkJ4r%E(eQ5o~- zlZnxZ{WrgQVt=82z=_SRI5sSk`yB`Nb2vc+vGPa}KcHb#ssji1`wp=EAr&e1vjbwk z_rU(cM>cgE@Eo)F}T!gQ(SSt&M;!Yo6^NEO>F@CPrHdW3LvlpD*`r0)EBlWh zM15qT+|LU6eywnSA%0@N335@uN|S|bzX2W&5`|&K>nMcRN~Uc4_ZOP`J%xu3ZO9+^ zbKM@(`lGAY#H|OvMEOBb0Q3}j#r~iwfqbm6X1}-a(9vx}QWri75ZsP{D6&NIXVR)anaNog$>$(m4g-MMQ%k-l2Ix0`JnMf0*k^ z9l81B;k~=}?%8YXF|kD;-^=!hy-w`c!S{F&iyy*KmIwdE9tq+|mEe{(Cqvk|cMmw_ z9`bwl?kPODt=HgRglU|vz8+ecunAj{>@oH__8`9oUKAbJ>q7DBx;lCH?g=503Na&> zL>yJg58{Xq!YxPIzJq%w#7`{`621syIbt#aY&D4UUCeX_n90%zCM%TzGttaPHC91u zN0bfz%Wp5;t1MTq9(wzjm5%$r^A7N|o4Nn!uH9mfxf`OwjmA!j^xM4$0ftC(w~jqd zpsn4gF5<|Q2!}zT-EQJUyteDm(SbvMY1Vnwcx8S4M_TXkn+l=S-6o3Bkwxxtp-_|{ zcN-wbp55U+QH@sCnGEfMo>!3)wJQTJI`bNBpgU>`w!ic3h;Ld=TD%qNXG|m;VHCb2;Q@JAA@?Bo7uo&jRtAP^> zi(!w9%cYgpM0~Pb=#{S06P=^9o>11V9f6&4hX4h4I8^6n6bpyJsMN-%d) zm>4v=z)l1>0(_SXr63J_ASaRnJL3^UrJz{FN~N!2+qd%_F0ddd;B{|D6nw@Gxl@O@H9Iss#)A@e8aTg? zUGl8&v2gEB%FlP2J6!N>=MZ%#ie@{*>Jrh=Afic;f;e`dR0;LT?Gh0ZA-3H>nC(O* z;5NY(DFZIM6Gb?7qG(iT2g=v>@0^mF_puHWeWQ)C5ew4D7v}X|Y~Xgg;q@O|Gaax{ z;5jfvHp++43EoEdk7lD?Kb78k=xW!V-P^VWwzF*<e?o^$80S;IxuOUn)FMN}^FovI{mM#^QaLac3*Zto`rhTgWbG8OdyP^(l^Vx`z3ggh~9Bo?At2 zVh685`EBD^!VvH9(ctfi){kty?y4-MVGV)~&`Cxz({{tAHc7L~lk6 zV(}AOJeF^>zJ+f!w?HXdS|FFowt4Gj?0vj-tG-2UmRqA#hAk*jY;hu!M7*0y+FZ58 zyLs!b4TDo=+~HxrEul%X$)7W7y;)rNn_APpvqtqhYcYviS@>vsG1^&3*|dP0D;uYQ zsm>wl?vW00{g+{P;_xQ6@gYcnDnT`y9 z-n41+=9*1xb6}HeGrVGx++2&G55(d3gB+VS>zkb5l!!#(D#6^O5&x#m!A;(RZ3kzz zYxmoF5%!UA1UA(GZ3Jw7fQf*Ie_CUZaQ~#qDNiv^Mp^8v&C{&$H?r8>REx6+VnyFP zkr6*=*|sek3&I;&0pBPKp28IyT?HEp;K%~U#)7~`*9L^@H#!S86qp-Dfomf?#ztP? zg=gFDahV&{EHEA7#;oi<7hA}Y8Vag6IyQkDB^Vn$1uAZn*vK|GE zBHaa>HWkn{Hc=&EfBW}9mL!yN{k)2a?@rA9C}?-<<^?%9?}%_cq*bVzCITr8Nroy+Ei5_t z`qQwus_uD;2tM3yjk!iJq-~S=_R^g?^%WJWjQKFJMc-uw*yV5idf$4v&Royd`PTDw zV!dnK`gQ9J1WiQC^}gVlYw@3Q;i?;)U=m;= zHo1XWF$ElPjt#hgSRY-me$B2O!xE<54cF2}9~P9Py$o$b)mvwZXyU!4lvJ!|+KNd) zG@%?LkP$=Gr!+Eq4jcd*j?Z+Y4aOEwok4;-RDT*uai*U7aKT5+sfE7rNNz580z z3h{MpeF#i^ontMO1c4DBUgufAZqv3giIe^HtknBjrzx9A!Bt9+a($3Wz>e|A`UFu9 z@^WM%4Kt)7A`FiX66@T=y53mlS-WFx=N8ApbvXDPLIMF^XheX@a7F8;B0~DFtW`^v zXxgN0xKg8WXD{Ec45$w()nSJ!J--_e)oH=j4dz<51`@8(LFJ%`-$1+$G7B-VP@ z6l|WDKDE9sSkIoif6{I&)U>u985k0YA*lT3S_3YT4sxtnE7tI}VGyyXpmXh-wN@^^ zh9NmZp0#V%tVJ4MqitUQa>9VW;5>H=+&!_t9Sm7&8vd(A`)>szB4Z}iDu7;^w4}hD zy->~qy?!M!?ro^D+4a$$>{;tKtfoyZ*R0`dxrVLQLE$xGwPVd{)M$0p8YdV` z+V66;Sfj08zhQdz4BXEO?+0lwZ&-`$0?cep2po>pYd9PoWFX2|?N+552s5zN!405L z6KN=2AP-yP1M$_`u7z1Kr=Hg9x(#6OUWyp&Y=Cyz*C=ECC$LA_#yYi_#HEAL$$H_r&z^Sn{a)$OL=vK{Rr!zFet)Vtpn?QK0-OS=QES)D>^$sJwR)#lxS^f3tHLW?bh#Ro%gMWPl?kt*ajO2c zkVy2bUNfy@zfUUha92b@ur|6z}_Ot!Xy}qxyYJ zJyuXn?F8EhW(bT5vIhW-;vb-R)n}8M=FZV#kuj>Ysq$Si%k*NsG)SVzGP4;>AlA>q{Jq5pW`4z||Hl zp=hz#T;fJ5`5@WiX!0(5rN_`OsF6H&znd~@qN*gqX$1#utYcM=75bVvCH$-bE{y^^G6(FdWkBpSP`I zO@|t;R45RG(X_YN=MuKnN7m>oX5P^*4UM)lfZia^6O~m>D!+L#rsv`nOBOC#xR5WB z3muCV%7xL3aA*%=@J}pah<7YpB;YU=)WN1N;tNf@-bf1FMw_Ned~X1S5m% zS+rz9pTVD!nrhuQa{Dh^!c{yZQ#=xdx+%+|5aKIP3P(JyU8mSkHL*xv7+M&mc!-bk z8w<6?E9RuPDh%qiSbLd3##OBUu_j}w*?Ff=Vf{};C4qZep2L9FWF;7aaMte~nrSWY zz=$gEmDSC&rmbHvKd^w!7YkhT7c7|1;q`;+Kp~L6Kq85f+5CFjZ@_gBtDG+vM9p8Y zaPfjZz5nA$pkDL!>auvDDnl%AqBwzk{&srUu@e6}ErSjsBl=kuvFv7p)f1@rN< z{w+X+V?J`@DhAbS{(O`Ck!*5-rZ~X?@6rXsV#oY5q+^YmnzU%4MuJeZ(7pHo=EqxV zNfrKU1)FH0yS35_RU9Atn(2us8}Q80%~ zamFjr^XWS3pNVKEuF2=S5b=unii@IyU=xbud~NyE4$V(v^-8ruQ#51^bD*`15DPb7 zE#7}8&?s)hxs}flBZfZh=}upr14vfl1}k}$_oLA<+0$0eohRm+^VnQIFASfYC+GS= z0wm|T=FXct_bC!hBsu0GmMN-(8=e?*>is*Bj%%g(m&RaIRW%_T! zdQ~H){7MY~({%SA!05O4iZ7xCUjGlml-Q<3Z8@auSqfF1yHbh=fo6S$D$OcS`L>oR z;}$P4Q5VNtRa+-6<;PVK^v`8;8dUA%yZ~Gh2(_O>64b*D&5fEj_m%mxNeMa@G)CV{ zd~w0NIhL5(+&QQ*c-?U4%roaeW}8S(Dn-t5&YL^On5)g1I|sS=9NdUG63PP~dE^`& zWa*1|=S2Ldg_zR>r6Own%pNVa+&8dW1X+r8S^@EF2o!)K$;;1aU~bL4Et90a9`BG*t!lq^APcF1Be=EP8$7R?T;au_mcONJ$+e1Ux? zpIC^Itd))1fGMlp-|8C$srki<2x3$=Eqeuy!pzjonN{A(vN=t&C(NB|%x1F$$eb-f zY*u)-m~{{S&}=p{j4)RuXGyq~v!iC=(707E<(+^4S#2nU`LPByBd9{f1FWxqvpX3VIcsn29H z!k~+w^E2Jchvgo8WY!xExQV^z%?i(O%$y-+M$eczlYTR1&d_H{L@-4h2ljFJ4a7;1 z;^pv)8BvO#a+nA^ky(e!W{{6K+^RSZe++TXn(=bG&Off>`eOxo$XtmTiOQH|E$uz< z^BTi`iRo3ZV#$S#_>?W{kII$>0U!G@r#$M$$Ywc{=FOZwozGx1gERCQY9&W=lKApp_gZMP>bezJ7EYl5((>KktWJsF{_v-6I4ceXD?lY!O4NQ|$ zkzuMa%{6t})TshNW15(1B1%l-Dw+HhAdWOPO(NDxrA$#%r%jtWeM)+pBSL@pUF>EV zs|dTj0ql0&mK5tcHd?DDtmUuPesKT9DDbT(Bx&^LQ)4 ze(GeDXcfW00$Hbc>=+!1sS5N=!6BAl5y%`s9C2~tnv9$(#%nQ5og(Q{Q*f{*QmLwT z{%Mm2#ZLN4;GM-xVMq}0in4FoFplubnbXBsQxefmp!7R1&Yq$Tlh38wm}q8VUoT#z zy%&`@aN2Ye*TeChAU1_h7WnT&$UT|rXCh=GWPtpjU}H)Ha@9}fQ``#%B~QH{#0FQ| zgQ=ZIOqqntld311lTgqk9fTs3pTZmzLV7J+eKMu^LB?dyj4_!_j_Uwo%rvmau(gat zje9qaSkeTv!w-YDgek&*W0P&i``<>bJ9=fH%6nmPbjPtXr%dMd)#W7jWSm+$Nlaps z1E`4`{>i8(n=B?dCZjqU4jV<3KFJkHP+6x~6^{b5%7LsToIyp*9ol|osZJX$Hu&5R zrgeI0@~4y7#2Qffq>4$=lV=QRk@H_L(c#4^Ozcc)Mh2)Y;pmXaNCrz6;X@Z#O#yPALCYclE1ji)&V-xuVIZ;f|CQhIP zI`-8uaRNt56R_jRRvg-jB#Izbl_n;5CV?C0kqRq%k~U$|qzP0y&T>VRI@5JxbFioq zCQO($y#18YFzpCIH@xGpi4%Qbs-9rta%`eL!DC$=KDr2-7({BF@;i}Ys>{oXChA0$ zoG|(2TzBEahfob>egJ!f$dE~ZjAr30K(_yyKhmms{THjYd>4?}*yGCmDvp~TQ~79d z)2xvbCypOK&cGriLoHX5;}}k*mCDbtVo8j1j2~xO>zBlMH!WjA90R%FgF`G_t%Wkd z7h$jyvHWSAQ!Sj52;|#*W36$Lix8W5>yHuCXc%XWUp+ z1|-H}kr!Mx7D9lPNT@6nk7Z(G9mJ|~KrEHRH4gbHqc(Qh;FRQBq!SnICK6Ajuqydw{SUE0vFdOPiR}Z0bF{2f3MIV4HM6 z)kcJesrax7!W8ydeWONde}!!Zv5g*Vf{h686O8Mfzgng=;wjyqmO6Oic=0kDW04#a zepw>qdzpCQFPmdRFUv8Gm*I#p+RJ0cy!$lIF%0=FSI{-|#;OE~8A%?>JI2b6Y{($S zI8h*xK(#fbfrY$stoHKIly<+Yd#YX(VY6}QnyiJ^L_6AP5DRLpMw4Px|9G`Mu&bGK$ba)KvjsI*kA7hRVA;z#>#~4KO(NHId zkB*{jia1y)i;KeM8298sDXCDBphnW*i!PmzJ>+Hk8s=!%7;y2?5`{_>PA-**!XYJc zJ4TQ3BPP&z9i;FvIvCk#Lq)pPMaAeCD(U5MU1CPp096=DAr^GBtz~Lgn8IJw8n#08 zsyEluSg<_|+K8V39m_cs60C}T^dB)v{l||QHF9KV6dN5HRX2)_6rk`Z=jc%*pQ<=E z(i|m6I!2AWGfIwbI%>j@b{V(vj)16W6W)hQa{7+~uc>lsBS(!yY33*aa#>y~O^(z- zZk1?QrExeCnaB;or2;5~Tq67N>w4B(4!0{JxRi z5u-*A>lQQZ;uG95X3%yDtwjSyuPw6`EuO@F3be?V?%J0!O@zu1T40dY9jNv2YN|HC zAcpV--VEA*XU67@7-PJII=#e3gy8yKa*TM1BPd4*PyiGJ=^*)%01F%O;3fB%A=z!u zb3Dri>Lt&}(F2mT6QN4O4e(;3b7F9mrR@=hpb4Vc zCZ#i{2%_Ckb;f9G=~miRj7D2&D%x`p?bZ{4riMzt<4JjO0B*wCS-iZI|(q8#c(TzHs=&IsGstnc1Y2OL=PQ|*r7v^k685~j-e<}Ag4LhF$5lM#DL7? z51s^lF%`vmxkH9g?!o#H7nK+oB8R$%;EF>8a>}6$7d0C%h9aqC6wOhb7{WjTkmPqHf(5KY@2^n8Pyi}Rc6P=>G=eHu@czQ5LNXcR z5;=p1aPSgQzVKid6=#6i4-$wXKk^fYu%jR;!g3HBY~rdK>VQ0gDx+#625CbEwr@G> zdOcbNSD$IpbOEOrco7qN!vxH)KU161TdOUK_n!0di0IhCls1i1bLVLM(%Q@K^RLfc zx$mp;R93wblhc1NA0!8c2C;zxu7C^42Ra4~tVK{8G;q+Mfr#Y;*&v~U0|z1iX;dWG zB54%mR_sA!WP@}tX+s9(W_s7iDUgu`%s zu7Uz(NJXvzU=6|R8A#U{0G6f{MZX>iiT~rTGQ1{f1^q}sy`9M3XqoBMdP*RaJy?cf zDJIRV`?WID(c)4Y#96i+z}jl`k)EgLhqvrLa4;Vr2l`Mu4l)P01`Zf7uxbE@R}2h* zgi4|?1hA5Q$YFrw06ECjHRJmgB>br^Ibi8;sx;Q0vIRik>rWY_UA`QsTO3qye_R_m zy!{6Z95?_MrULi?=fM7yFv#7nU9-_ZWEx3q8h$0RL1WqfQ06POThbfFg&);w1U-m=IY*+So_UjM7qhEiHXiq<4>EB=UGZFS9 zdVm10i99A;-k%K+{q+8B#l}@hqF=DTw;u%Ql6Lqm9+f9=bn8roQ9gl!Ag8*Pqd&@v zWTc`bGPq=>$5l~Yip=xd-vD8Vk-L|F8Nh6i*>UUm_hs{Cc| z4pg$@HgN&skbNEf`UX^0Br*y_lN+t7)Q@Vw`_ZLLRkE}haErjGt1?jk-W{7vx*M(` zbb+U)hQJUf>*sTL?ycg(KdLrtEm?3*?ck>dH38>nDmUQV^>S#*^JGx-tQY$B4Zgto zG`t}3|NILAKGsJE-FZQKv2W+3kI+T+6;x7pi&sQFj+NE)HdYS?Wm z&trk7rG@o4_DOCv-ZTq3rP(Ge`yT?(xfr0D>(rGXKMqy@D@A+aM+#L9_N7t z@zzt)#^p^3X+2*+ReFiuW-r-0rdRKtJ$v`YuU9V$8;F-626Fa-Wjw%}+jgH8mmEZF}|-JsdrIh@Pwm?)8W8Do^%w z^g#YF;)%}>qRUZvl+1cM!5Z!vO&9EwpWJ-ytpFZx(p3cI+d!BW~G!vZik&JzIU4k_ht9b&V3_7vS6J-Uk?tUK=^x}!cIrovE>?J5@D zgXJ5FO@dW+H$mh=E$~xzSN9%0y6Y;6bq^z&*h4+E?tSx+T0rkM8)

DzIgEHpN7+58Ai5s8#KL+w!5;1rjVt!-*(omJPk!oG1T^Es z3tc@+v{)LeM+n@JA&Lf)_nr6Ix&f~J`!my=4en?L(%0v&-1FhnG`e+Xw1a%DdwzHP zL_V&ckL%~_`7Vm$2>21nL6rE6qOBa=y5;Aa-KEM$Y_hu}zq_t-K+E|=RGilBg}lU^ zkMOdp`MiHpe)q5{i>```1oCQLAv(Z1+9=;@F4!plzcF9$*)+9A!_)bz_x)AP zpZ<#@xl8x_yl&m{@*$kjP2|aLGT+Q&-DEeGXLj@E<>z-pa(=Lz%yV?hSLu0i-SYGD zy5%Dmekx~PzK(pdn!W7i@K7D$74REWE-t637!)h>y~ITq=86N= zhZ~cJ;=1?9ZrS0(hM;Op=#@=$KWI&jW=#to{tPB6m^HDrzx||{H9uVmc!&)~uv~#g zH|?qG-&_D9h7J7Qen)yQ~pHI#OL?pm3DeE@osECUg-{L{9|$JVS|U z3=}Bwz^`i~`oZR_SRt)Uc#%n63je^SSw=6eua`u(>)Q2UmtS>pcg20fbN;M{ZbBVH zkNj>uyQWbm678!QAK#^Gmo9m@x3S&v_~&=&l-;3i+tj3_HVN@@qGih#&D!U7>X0s`r{={}RuLAemD zwK7hA{&#zZK5ZL%2wP~=o&OrxNv|y0ux+2c@)Z;Gt&Nuyw0j8ATz{U>tUd1{b5Vy} z*+sy0ba~7x8gXwMlP|MNN0*Dj{GLFnyLt5ZwlG*Am(<=Y}Ym|)lA{Z zdP+=MdPcj2b(|l@gI@pkW@$OOojZqcrE*-c0WOEDgS91N@L8}fT zlcCPS?o1Elsi?#b4?2C-iFK~))F!7(w@w*Jam|}F?K$uC|6ICpr}R-pB~C*Y4e>D0 z`f!*PHZOnl;Lgp**FN+K!)p`orH|xpwQ`!$*~M4LS}XGlQOM zvs$+A1nqW`orAbS2(Ag2cM{4K@C(GrPN7cT&Yik;Oz>{L=a0OjAK;4!;$e*40=jCv zm8Jn6!de+iJOJHm1zX5sX-|NQ0Nt<8UB2}cUy^&Zqz;`rb}~D%PX3O#9LUkJlYyYw z(bcJA$4+5*IY{rwDMcu+6=imeBaY6wo!g}+G>^_4xBn-9_~t>q8aDI$T&3rKb6fa4 zI0^_VfDW`T{_7uS%c^~}8FpR32zvgjUn^X?Q_wCl)KTK1Zi+%Js77J9I$~u7p+>W@4$l}>rR(8jZ*&R)F<&I(disXuH z{1HdTtTwUJ%Il0WjFi$h4Gpa~Lew7jjATq zIHlr?Mc$0etgH^fED2&Ac$PoQ)d3NHM1(-jtPULv+b^=BvpaT3Zr&_8clSks4RqOELg^+bDDX8ZQ-%=RoZ)E<(z7nx=x%H1wAvt6cvC~y0AU}~2M zF9XT;vK=UswG-`mW=w~y4jBneT|;00`+bfbrmX|T%5k`NwUXOg_4AIc+IMJ=jJ$my zQ){2u9;ncyQczkwh^oOe9hvxt$PTWIxOPVa*4v5mWE?Aw0|2UVH19tf2QuG(v*Z9) zDcjGhQT>B8&jY_kbadg`gK8b8(>AMmdqm3&h(J=HB2@c!q4u2I_Ayp0{YQ#sF^Tph zoYv0f7ww(!a^$jAL4`!M&uo_x>+Q7WzYXjbO*dWmoEUJc!O1ZUgoB81LW;X|OG;7) z%4&ezki8vBX6?ct9WgSqSvwU8z0eO=aYFI9o~ozTp?yNsxa)=yLq=p}J~xdD(}{j8 zq;Mn7TZBc>p4Csd@!(HuY{jJMm9N>b(HAYcR>?6OAYk9x@RLU1 zW{s6Xg1>+E&#wU79^%%@YOShzdynR6qAkyGwasYT*38hz$;c3GS%%qGW;oiy>&R#; zGB|iRVntgm0}O2uCBYyfOgy8Bif*44AMIKEm5!TAopBX}7ii54R0jq4gW5MOVl%QJ z-j{9lwpzQ4Hck5eR<{R%O9{@S<4ppF;Pnr$!|bR=N`J1V>Ybvc$aLiWH)IffREVX> z&z2T6;;M@`%B#&PCwg8{?b_M9Wr~?DGbG57o|%{k??=Zg&@5R)h0jfIR5Z(aONOWKHi=D27pYNc>FH^tv9?A#6N*YVQ4%zh z?#@V0&q#;LP_96XfQw{G(%PrB@a%gMKwl*B0b}<^32Fz(2xh_zw|9V^6H0YpMYn~D?)8lGU<*Kf#uEH^_tGdRg_|sT=7!*p=l~1PErpa`cX5jLWHO-lx zmL^iQl(?w8@0U>{t@Op%kiinN0YdtM@mE$xM>mfJjEswK)w)e$Vp4KSs*$GTYb(;5 z;BzJeC8-}z=eU$e~Yp>^woHf^AV)Ks44MBy9)vvd=>h486ixJH^cJ*8#b z{JVyU`HRXh;RYh+WepU3>5NpGkji9pNT>ER(kQv~d$)BU-dk?dlg7p9~RG zhs*e9$#mE$+(eF-!pvfYsRbm2!Z51EeqDAv&O=6;>JWhAppXzwY;*o49_k|#E zU7$Yb{TGMB?e%&*!plIh9!>K={^%x6nl@|JGB!58wMcM6a*^yvff{AHBMmC>Kn0|9 zlcLh1DU^{A)8Q|E1GikDvy~V?KLO1Y9Y7gbg=Y)uh20MS)Cjz)r+S>^-(Zk;Ye+z53OMjV_H-Y+VFct zRBCioG@3z+mMvrBTO}kWC*eUz!LyL6e!&zYMN5s<`c~08dfaouS1@#f!b)mvA%yvd zWR_AugJ#=d4YDP52Ie0EK^~$#LaeD|z*#ix1gU`_tExiP%?8BBscX`8lae^@YdG1F zMB*hm5g`zvC!eOg@ zP7Qz-HT)o+__|=s<=KpRytwrq4~OukY7PO9^s*=sE$}cjZ-FPF6_kK_$P@-`yOK%i z$y!QsVzahIVKv@nSTM_{#Md$X(i*h2aaPH0EGMzVPqog*u&i>{QbKD660CCfZ~%F; z0dcYDcam%}5?wHdC7Fq45=)ec5tnDO_$R zW2wb@eWm?6uJea+s~dvNLc!pVyD{hglG^7rJZX3c@E~~U?l*0QE+D>DEA#-U0Nsh? zm}Iyq$+6za_wcOWQ?KNDdLa@Kn34JM0KLxyyjSE+>oG zqT6V)0lgbOiT%EMEc~rgry#kv#W*xiz$@v_s)yc$Kcwz>7;(*_W12Ko0#laJj$fzJ?|_9H!Sr&6zs3YRE_}y2i_+w3w!Np5vlgLA->P-a)_P_CPT`z?Ha{ z_*SqV;s(f=U>O)K8xO5>e5>T>4{!#^9e|N<0Y<`4jz&gj70`-+5df{S8b68IvUNCt zwIMP=JV8R()@@qF#^N3}i9$njYq*PeOr0){J7_p@6P@a2BF1#O9nOS*e`@0F8#=xm zeb-~)DT%kWscvaZDCoc1k2xX_Ep z{gEYji&i3mwc-h^HBS(&+-SH7c$;|eR>H&DBD!gG6e_K`9892xk}iqcYbk)?R@3d4 zE~OKz2oX(kSuX${RN60M-0Rx;j8@2Z$6^j~NR4o5w- z;RBH-43KoX9NqyBOx1%+;5LCqP=mwH>Xqn{#DBb?IUa5gy}SfkJT(Ol*MRF+aaPkX zyfNtLT`YRdEg%&^AB^hTxRN?;0sCD9r~TsJendF!C>D`KWb@yoGdIY<6&bXQAeEbs zA)7WJt_5BaB0k)T#fw%^aWMBcX%eNmh121(?xzWdIdzu~p~C8xlaT7xGiRrFtLd~f zjn;?I=aVve&?!RFdP{|Z^l(4ugI=4SXP@f3?AEOulG#9P*ekv6C>Lw}DOYc1dbppc zuRjwHcddFoHDWS_NyxrKr)k-e(sALmbb>J1^Y)!@V9Kk2r0xN6&Ew*EoHM>vJZ}{Z zoYf3K15dL+BUZ9DK)^Z(tE2luTV{@F4>(>z6+TUUP|#Ug5UM)JLLwOTNfL9>>60?Lr1l z1=cVZ;jNk=PVjU0YuPL|mbdiaL4?e16Wy<{`XH&q`+o~#?-4kfKbw@Zf@`c#M0R6U8fhaY9RovOPb5K&{_ zzc966fm_KfiQFC+(>8O%MaGy1Xs67qBmki-aTZ|u)qnit0~)veL#=7G(^RA8gVhQ! z(e7F#5dZ|NFkgLp;o3c*V_xH3)G-QOnMdQQ(NQ;v7e)vUy+?@D`@`yAtbT_&QxX_R z$>GlZeLd|ziv9F(9&D|S?RxQotygW;05TTpT-qjdQu>FQL&HOWdt<*mbX(XU1STY< zLt5t5aNmY}qys1E6>8F^GCYON8U+qYb!Ce zfdFlZNNDMPsM@TF+M4eK8dA3>q;3zMMo4ORog}I1W4X(tZlWuKAh^28E*7)+yk6_C ziKbB#>sMPV=oH*K++AIn-f*%Xa1=FJ?MY$eGlg>g955m<( zjcaFj#<*&tbT9vZ2p$4_V$DA&jdt4SiMfAuN*hu z(Eyy~@qIRl;hsm{rT=#gMB(Xir2k$7%W-@h`t-02(GJb{A_RyCkPcw5yMFEqnm-2E zpzsu}$RHh@B|PT1i`mLR>YrKu1H@37lC< z#~~Z_?)Ta=w-&&SrcT+!U49NsQ&%J@&@ zw-N~|MxwYg#_Gl#-Z9rI_+wr!9yKk0^yuNkM-TBIKmVg}xqNI^&~dKbN(|G~;PJ=N z)CyqJNx$B@T529-My!Kn%?bM&42rv54vijr`gkIh5VWQ~k06$M2rMr&=89smzr~JT z=ve4fbdFsrOz2q#yunZ?9M*N{NErxV_@lv6%z{!7ghmtT;J1j5{I@nXf-UQqyGF28 zjw5G7HLiahLrsF319jS#3aDW;s*G9%y~KpGxvdq}X4Cbuhh=5rfnF-_yG!riFD(t; z50>%=vP?dVEqnB+y!Xi1@pXzO6>3OM2k1Gyi}Vh;8G z3gGJ*${;;iU8B;Cg zH75#5`&qJI^p>g!=MZ9ZcK-eiaZlWJ+_@|6h})h!x9{A(edkW-w!GtnH++ZRmG@$y zzXuP>9zKHBo>)3VTdH%RpRJ0jd{XiFarxu&^72Pb%03>zoPclVN1xN+0GftAQNj+-~cO$?Jmb@FbLd!-M` z9+g*AJguy*HS63^RpnD}#p7~3q-768spCFcq^tCP>3vbk?(@d~|; zET{l~HG;wm1DDG&_>L$O4_R6HL-9!936EEexTY433i?5dLPw15iH3GDGxIw@5x4^j zgDnN6^16?$6%;s->UkvfE#c#a8qfJ<=$KsU118FT*V2c&z-J9%4hsicSPDvuKxM)o zu+Fei{5roDzACRdu3o9W>b!RKD!-O-{o3{GH*Va#c?<39-u(v;NjFtE1-7nM>87IT z({;p26liy%BgE#b>-m`fQdeS_l zz@L_FOLaqJ>Y`Q@1*AT}{Tn>Ww;$aRclkYezZF^}w2qUszpDnj1Hy`%D;P#q6MYD$ zzFD#t%TMg~V%Ge4wORtJc7at}T`A~xmXLRSjb}gUK=mk)SV?N&Q6Y+$Jgi5^BrYd( zVm(RJtHV0tUUK`#6g)V8AFI~KR>5{nI^2*h#*PtCJr|i+=Cr_(@YBcoJ zPac;?Jw%JSbL%D^z3ZWC>}vSBye6;5T>5#k>W7pG#Qt`smpr}IEX#@MZKCu~#U#tzp;9TkIwV7;lDevD^ABemn8jo!fWsQG3OemFDOB^-(Qc4d{eaH=}eX(0ilBs4q@5 z9O|=lB%`f4Sn?k8V(@~z$S&N6-V)K0pr%`Q?v*}#O#Kc4K+@8qn6d}=@7%t5Rt>ku(t0%xZ%8c1HD`#J;d}BmzC2) zT-V?asLmOk51uJCiHHu3CN!+Jg;#5HkNj(mLCr}i`xy1>xV2Xc6Y6E*bsp^dc9*@;O89|&WA6s^N%i=7h7Dq zd>JabdHXK9AKXqr9$DqWBlalfAvGf?=<3xg;mh(0yX?Q>{{2hQ4$S}zs)Y(*Yf*hO zg&8atWS5}_&CMLk|Mu{@xRHMS2HNP&Tes})?OAIfEJSlTQ&ekF#@6Rdj&GG5r?c?x zDa~NBp2r91Ad}}YvKl1>XnastpaMH3a*9M|zLDe}g+edq2yssyz(tN#|J2f9=pxN2?6j0V;nc?TGK#ai4n{Nl}{H5jEy7S4*#^SPDS{Q*VhUm5mP`o;!iB zA#Oi>_IF7HbN_%aHzp`r>PQoT+gl=-+gd&O$3OoSJ9@+HcjF;GpJlDL=He>#{{R21 zl5xK=&dPHFB+uS~R^)|*iWiR|8`rO1p|1U+sd}%#Meje> zGUkT);s34;7fX8g+bfk<*j3{S@CCn?09bJgopdQWBkG|eeUX4!6mzIW8_VDea7`-+ zZE#Iz@kR9EyGr2txMc=abLTCi83yLdYwK&=k4`e?u;1!_)kyG$vp+zTO~U$6BcK?f zwgVDmXku*U$Na48+p}lCi-b{y|+HnunG^yg%sQlGQ&I&s{KEXlU4Y88u;*wn3FECK}Bdj$ay zy%4>S1RHwC?QQOq{l4>`djUG$-}~)*0*1J_fG{&>PWevn?1+(MJ-K}YR|i2b=q7Cc zo%1NwJp{c(_UQq!in@BbA)?(q-97lkM|atOqYFO;sq#XYvY@mjt1Egv4#Vd5e6F>> z&+2#eL0a{GPhWrEfYI;97qh?UikMZ<4t5nx3s@k=&4RXy!LD)1P!D2_z}Uy6TjRyu zXzodo%?w>$gs~Tqt*d`<5@cI4zZYbaNCwD~MJ+`|l@tI;pN-6=pb<@)(Ccq5B-&ja z?V}wbD5quJJ$+C>H=ux^tY<)w8Sqc;s1O9~0}@zWnL>}Qu4uPs$2!fc?3M*}L+5ot zYtx~1azqBG1RnZPS6|;)UrGM}lpMhYh%hoXIW5LaAfiEVh@hcm>ZC<<>c$;#8vX{> z0y->Y25V&7$DWsEQGyCgGK|*+e*+?=`7NLK%u?7inly&z==Q51hwu_z3{m8aRf4A+ zsEw~em%Gm=E?e!I9CPjNj`sEl7zo?|6%7sTz#_^Rbk5k45!kY;SNi+FAJFQZ!LH2j zd9_SPmj#aCXO?*QjC3ikiGy4w4l8R3f9Tded%mZ)cdFOh*9%U;qNFSKwUq)aCScZ5 z=H7rSMx~P^eOO5f5Y1vU?p8pU^U=m&iav(_6sPVe5Uuj0D)QGoaAQVPj_u2=|EM@& z3}5OCw9y^cOkn|K|84w&gORk%yU$;4YrEWLfjBEJx8p;7w&NvUo9%W-2H);zH##=r zUwlC3AVMN+LrObQIZ<0@11AkaH}!&UR;QPSQtV`&*v!tZhX0NV0^~FAq$9l#VoOC! z9pHepq>Brhd$pzChQ@b8`9s}_xpejPnmr}Zf3yjGeFFmkZH^2QnhTUNO_v48peg1< zRQ%VmITjc?%$M|)e=AkuC^JJ;?NlqUIXsk*FT?L^zk8`mdAn3i$fCfSIq538ax5bt zK)_2CY%^2POUu3c9EdBQm)oW1-OnO+l9f3FLeY(5u9|L~nYEPg8=rJne(ycAXVSs3P)u-!_;jX~T7v6O za2X`4F`^EslJyOt0^qm&4lt6Kxm%zDE;U7k{E^!?2Cwvk z2;E)O@9kEH29eGB@j4fbJEO_Y7ex;;&kzozbG@4OuXSd(zk4hGU#fZV4N)tR7=ir+ zG!)e|Lm{;KwizZ#SOW{RO_Ct)$_)Nfdwofgq>C;HYdr;RFOItk+P;n0k?CLR^G_aF zC)yf!OaDTmj#2Ohle8q2qoMCUXS8OvwYIk5m}`SZYV%*V+w(vO3Y4fKa>E?f`a%=s zfezO|2U3Be=kM^`?R9x6Fkx}T7UikQ7}Q9V8-*4#fcgtx>@>S0-5Fx+dMto=8*p>A zLh(al@f~%9w2NW-L5w2I!oSkNAhbe*Z@s!(mM0E5)JRM{nL^l3?pmQiAnYMzAvC|~ z)BSnAs~<_xgJx?%dXf$}B;SxpNTdZ1&en4N`cz9xYimnuOUrm`pv}CT*WLjxfvk|9 z7ZGRKFp1OG+fCZEclg`AHJ^r93(Y#;W+tSi(w%RQo zP^#5zFIy%V|`FyQtGT{gv86Jy!%L9Pw-^#Fo**zH-O z^P%OFmowWhH^03}bH`I;B)U#nJyMdfY(+`(o6s7W54W~*cN5$mt;^lj-E9EC+Fe?A zvdgU;qMkw+LZCCMyG1Gq(a1UCOO*#$gtuiIV~V2DTR;9aynRvSqWi9mMtukk`uvRc z%-mN9$|(h`P$WZ+M3Xo`!Gt>@Y?zhu`xstHIlG=u?rv@#ZSl35u!M!=IG}IPjPVl0 zP(>O^v#W|`?Y_(2svoU(d4$_CGeaVD%EP6*M(-9LZ-&eLnfhec6v(j#>b{@uAcc;O zn4^PCGXX0VAr%nm?{2AA9jdC|`SFpc!&fDkmaYmwUq-Qk<6eKEhBE#Z8HviTh^OhuI&2MtqyFk<5kHn&(q5HZ@H*XSOuAG~+V>CUUp6f(ixg zon5{CR~Hjua$;=h@U83D2B48TIxe@h`rEvxzm((ls^B7BQzrhv6e@m=Fh9eJiWsOAJ)C&GL*lowGATNrs4OkR`2DCLYHS0tV42A&IrNjkuaB(i2}{fR=0N= z9a*r5`0VV|J2Z$d0}&u3?5N1sVx@(#X&@t&dLiQd#NP^EvhHE`gS}zX(di~O{cvtK z+n+z!Cv|uVUjlzmf{3B3U>Cmm~R|k5#xrqXB|MFnUE-~C8SC`}EFV^5)N1qjcl(e@NXE$Qg+dH184n&O%}6py?G7D8d3 z!#)l!qHc<~bL35cp)c1@HDYB(W1uPCyu78g4GaUV16dG%&6@QfKs%ZTez`gTJ>3o% z3Edt6;WAEt4Y7}GC0Yssv3kuhcVwI(4rm|kKfj-7_q7)TI}o!&2UFBU0i{5YWq9eR zne${4M)DV8*zaSe;UiVS6j={ zrQ%`HDYdLBZL@J)bi-+ouvoAPnh61w_^oT}~pZ(6z%(Bq0qO z)R*S|L|N^8Lq=mm13m+dQRt+?7Ep^C{JIlEnuY&Q1%4CIx~Hq1?9>uzHe0+q^AT~J zf{qb=&9o4WzG!in_UsI|d)?0XWgn^2Q9w9Brx{vphOVrH^DP8#C|$PcBRvq&S8$pL z5@igp?B;Gr(xcnnfQY^Wr&SpPJ785KN6*#Ub6})QKhj$GBr9bx0RJL_Y01R|kt7f` zGmj{JeB!4CdLYVJ@^GcUUTd)G?FOwr&=701n)1OAZK7}-oovmBh~=gzav21%n&VAI zvj<5jDQ=KDyWd0@Q`{~jJ^t}jye$B8X}1?Z--FzPHxY25?qRBoMgNvLMWSH9!WGtb zI6+pz>Nn;bqOeH#nR}et4#Zef{T(fUjaP32Rl|%~R6C|`sq(cCuLWnQc!*=%2_;De z5{3UV5TJSHz$7`Y+&?*6S65$OS8vr>_0c*5lreD_^%OOu!PVGcHRd-pEBT^6rV2`t z2kQ7rUk?;eYYU8>yRoUsXf&EK&-@i=l$FAOR7T^_I&t`-S&-+vS6kZ>tyJ>1;0cp% zpVd|bCD-Yo`O$HNU>$#*=-LMRz-ylau>i71SO}wrzevB6tePAa7TSjXu7?8XkqzIODN5w~rvo1v5a%mfn&C~_zLk-It zo4_^{q?Be>WDzTMrLViQy{!dcAl{g4^6vQ^6rEE2QpKoRYSGGcIKmJwnstM9nVFwE z7HbW)ZUfGu)(6`todyl#&;te51VGfxvqBHdVCZULcaRFfqUQG5$%LiovB`=KIS@Hr z-{90O_FWqxJf?28M4*-mJw^wAxkPh$1QROclQLS8L}NHjl?$q@{HM>)*ZS+i z;2689pt%Ktlvc#kGmI>bK@VTM(%aoZK54QVlMQ;K=R3<>-UM!)Dur%3G)xTNQuq3@ z&~{PyKvk?I49qEDfSjQK(+p$t^wJ4oEEMR7moSJD58`8nQ{Q<_Z4*)?*kDDj-XkR* zY!F(gZEOWTzBWn>sQj+^Twn~C)uEepzlE+B(HUZb6l=J3W?%XCB38*zGNttIGFSH9 zhc4CDUQ&m7NvpLk*|m0^tF|s$Yt-5GM%_9HT79EpoX&3E5&Q_?8#yx!I=oh)Qd1+8 zwNamJ$Z2f&Ge&s8Ck%aoNc7~H@1ZA8x{+XhgnL}tCr&lO@gvl^~LC=3`IYGZLn@_Lp_WZ zgsctd=Zd45XAu3E7=^Df2prgP8T{1PkgV4myme&me%aR|%`|Go zFn(aC0r)RU8#6A5m=A;sVx@tjKo2Q`X>fwB0*bk+NO9C=lQqx^6tg)6cqat|=~>W3 z5fZNwT1<|Q0H$@l`CG75xLZ2x>7*-ZkV?P`J?Mc6&xxv5aWn@AA^nI1**7Z_HQFVk z#&;=Dt3hGsH8eIO+SJvH7zhJp*0cw~*3n$yBpC7*P{)F5Pt@mP92@l#a z&=Dm0ZxOcN9Ulmi?7bb)d!%4YlS{Z5?RT z+;X|2r(cDGra&S5{XCpt0QSAL8S1F6wl-SlJ^Selw-A5?v4tQ42UU8EVKjOdo1P0d zMjMOa2d9Dg&>~bQHf)H5NX(=n&L>#fOTPl!H68Xz`riLeI^wK`+@p6&CRqOuh#}Ds&GpeY^eVGjs|r;6AYxW+zM=_uwNK$>YYLcfd^Ddl>FvDS z+T7Go51P~^pyIvzR%z~R^2Ps#ED}uAw67iuH|Px(oxA2@vIxTfqJ|{as_XDZnQ<1{ zqg#C$Tnz*k0PA*Rkpf(NAo$zLiC4v*=oN&;v}*k)i1}VZ^TVb+xxPHN5yyH*5dGj7`t-$%RmR0om8%+DW!Grc@tP#KDor0~Y$hEX`iP+QDnYBOtF6;( zbAc2N{6mgXL`T6z);o3pV5g`R9l;uR)zpT4w_IV72H3*@mvB|* zikPvHOYXkh0s*-6?gn<=f)Y}FwTN0^Bt1k?2at5RTTP~l1xS*y6>Rlv$NP|IwDd)Ju97-jR0OfZ+k?@2B?Cn@wq z+on7c3F0$E63@y*^7`ZF!JGKxhY0|p*R3W*qjBw_mK>c>jz9QK5W*nAd0_0?uYvQ& z(G!>=Uu5v!dmlijoYWILjYka90-TQ^o@V)0D_aL#eyzW^qqQ02t3LjXRhpJiVy8m0 z6h3;p3SaT7>U;zZ+2~@D(ufp(^^jhfyl6v%xoRMd;4vr{s$(GLrdabbh|VJK#hP(L z)=!CI@< ztSh9Uh2j@LOC6@-Bp7-i8ti5&+J7e&XKSG%7^Z~ve8=%-RDJOR_8c5t5Kf{_C@-*E z{iW)Q7b<=i$Vzo?8 z<}AKfs44^K;rGj`gO`-=1bR90462=qkb_qAZ z$InOzgVZWr4}x5a4rc< z8XH(}BS;4B6BLN-^0Y*Q6SLRbFMjaQU)}Y!%ZmLZry#L$#)2g_emY<{^h(Z`vM%1K zV?N|ewZT(BY*8NMC5up`kwaiueer*-xj= zp&S*h+MVzbW)#m6=_2NJ1BpjSFj%hg{Mj>SPM_Sd&ci4mh1hiFXwYLw)f zUG{1 z5+RraMPjy8xR&umx4LU?m+)M5znntJ7ylW64iP3O{txS|4W9J?O+O7fMTC@^e>yjuv3RxMYe__{Ca0F7+iQKsNKF1M|7;_5OqKai0@l;Z$ zNGW`TetSAv8tZ^-&z?DT^5iM&M?eBQ1v@@ zfKYd-C+{=A9Gja*J1+=iV9<6nG8fgrH+Ib1eeZ97r9Bqc67jejM-sit-kG;Bc7rC7 z+8l~K)oP%0zJeP5tjuimv3N5wlL(t-coBHRbtbiJX6P`w$BX|YzhG$L4#ABxigHAodk$-pZr-or4Nf(v*TvgO_K zciYRmEsT5Mn2wCtjjETv{vRyOoqr-22fHK^VLh|+6PbYT&Xbm4sY9M9L`soI0Z{tg zHs%LnjE^@1V{bBSuc~&ov$d>5wn7V1r6|_Vt$pl7bbwYZf)XB3S)Dbq* zRALD|M~A(s+T<1?&vC^sO0a}VuxUai$kmAx#_=T;KPXV}lN12gD4|j~fUg;!P%4OW zr8r7~e}u?Dpsa1*_*H%P?dgy&mJ^RokMuQF-1h~qp}E!%#-V58kR(Wzo_Pl4Lonzm zA(~O)Et-8w2yY#B4f+HVg{Y3!1o}fik3V2k(u8Jr>jQwVgmN5dy zRYf;ZxI~nlekGuAIyItYq}+N)3_MWf#q(!RpE`Ns_=)5(Z`q&Zrs5954+Pn)Q&sqq zgkT&(`g$Fvf|eHEAtOO2Y1y9DfAm0E{ag%lP%^^3??3fttCAXqHfg^%n!wlxBcbUQ zWGN%^GV7YCS(q^<5@II-CQMO=)JyhaD84bX7)9kTBCy43ul8NZxq>7EDX|6v(h0ChiLT2{^{5a#bLP~E6UUG1$6RlH&LUed zc}FgwF2xtk8i8

;+gEejV3IXQiq2+6>$=$Z#_~SZV+C;YrJPfbvV-L{;3LacsL*) z!4n_q?=6}jBq5uyk-rNVm;eD9>4&>$e34=+TNqnQqyozp3+h*3oxs~Zvt!_}lE=v8 zdGA9#>tzY|QiRD`4K$45fP&v!PQ_-q8&r2Etv&JNc6WYLuyV7taf7pEg}Hm)+d1a! z8;p0?D|@R0yMnP@!Ne)rvhD8rb=LM3-u5|n-*~iVAl%o?Cj=j*P0CIFgGAJe|ZAN=2kIFbd(%qyG^hl7$qv zV9lG8pjGk)(E37{p8g2PRz$>b@`K?GdKv&Ydb(b6Vm7e#!g!Qpu~ zA&BK5KTFy%x?9k#iL4@y@^qn)|75k$88P#LFf~*Eq9xA4UO^JM3;juwMp=Ru5M4>k zFU+7aS4c-g6pEaQa#EAH7T)MV1$3A}xnwth`6I#}68Avo3gDeg1|VaG%Q8(#`dO7Q;O}cBu@Z-jYsH`nG95KV%czvWm`q~BggbR; z&zGShi7ykHCvYlXy`fS8G65_uv-q79xTAU<RM#9IuFP)o{-pi!nO!USj@ps2&OBJY4bb{G+AQI zAXo(PTbvgWY*8KQEfjQzkhg@cIRue)E=2;?@)MToy@jdF3$QmmmIH!waUGW8umlU0 z=`Vn55UMtjYhlmm?Vv1@$JT>iU{qPiDmXep0pyg&I=xkT3yXdD=mZ`#g+SVf@VL0o z0UVUt@{K^NM&A*bojgUI!VU8&@AE$&n%z@~^oACgrl4m6bjWZ#llz8sCl_^sY;;g2f9EjCdY$vN1GpC`f_@yb49J4lxj>~=p?G1( zaP-J#{-bxoTqd=2ac9{~Q3#cE_K!lT1074{5PTq$eTi?V41DBTq%L{T5d6wnf?>S( z_0gq^>j>HL=0L9!Wdy4e_V;z_m=E|No2D(UEsa7DunE`)loiOypV+YlBE6!iZx`nJ zjTz<7q-x`8tQ$;>C;*eCRW)a;WqM}5zpylG&ZnYz)tpizld3ZymckF>p__4SO1t%NAiBi9X#ZfT~t-xo(tMN7Kvu=-L0y^)lN7ZY| zLjDi;idKuz<IVW)ch3H2LFMf?$ARr;uPkcHrgJahcTg8?um zYEtkieK_i=5@?`^9s#hz0Yb&2qykr5h9|{K2$BYiv|NFjRP4`Z9+)W>H0@!tR49); zkZzXy_uVRJ*7X-<3VC(^CatVz9;%j#di7xheo7nfroaZzghSTU!ZBnXaJeN_z;~yh zN+6O&js2D~8NH8YB)g#gA4_GK*9K5U^bFQc+EkivXnkeo`e=LvU4=_^vt_N6Mj;Kl zv5?Y={kq+!7fV{Qh2(}PUoMvLlrZr7@s(Bvs!_#aziamA3n{XRffM0UbAZ!%uDPbC z`?2N%l!U2npAH->iz!oD4Y~m|WhmX@o{Sen4j@t*AvmE^IY&wz4={m(3PoC+oNAp8 z?Ni1*5)U~VFv?R}H}Ox(g1^dx{4J0jl?U750(+f;)Ecq$qJx208`(C>>d4J;m*J1F zMdXl+b*S89q^JatI@CTMBNkwHg^-XzU6Hl;N{!EoNE8hWE4|J4tn(^0E0u0iS4D1y zO8pKsNFMAX^ak+RvO6l>8`D##Qv3P7n0Z<7ASxg<8ynE%(Bfd(18vl+!F=%w2b&wd zgxVo;O9d>>U|?w{MGENX764e;!>S73PP0N;As{wWJ;WxG!BEJ)D?RTU^t^dN=|mKZ zqyu2OBM{V7K-r@IWnp_~{f|hl1&In+0dh`KzKH%%x#>t2)Pq_j-4Ds^C@oNiovzSZ znkp)*IImVZALinMLM~86TNy#xbkmltY(x2aF(QGbFP&sTh5Pi(27ZEP_D3dtQ&AZO zWUES(1`uPqMDr%SM}I-n4awZdjc|vMSfk@aJ`j?M9`90QxF`V(BVoOyr~P-zZijvO z_y+zhowtqs&=!!CA~)eJie6fomtmv%j!RAFP9i->{hvH=$kg?kAWAH!_UI?CUwXb$ z+edC6I*wLo1;Ci>s>;eor1`uPJ0|sS(m>@8oTt<=Bh;l+X1RUBpZ`4TtK;*>pP#>8 z={KooljF}`b@q+aw&PdQ^-wqdl@7dk)*-b54Krlb3deJ#yOz|TF1ukxxXKsPsgoZW zO+|;a`4hIUQ43vln(^S)F{Rx*uodG@rP+l&OGebgr$I&DHyDI#7T7_jt&%fpQ_r^w zn-g_lS=URIZ|1r{;;Mr4{qD;7Th&=iszm3`wkDQryI3m1zYJEEow2^Urm*6}YII{| zn_AQKR-LRQ5ddn#%20__5_AgHd|5tDD9LaUbe{bKu4^b)gbDD9?Q*X$e&Y0=m0co*k zuHv>ZXb|EKG?+FZmHBIW1JF2{Y^r2Ut+`BoleRgH7c2W$r_XPe8xxCw)6mA=Km}n& zRnjF}gZ@7ALmpvFNz-LLO?AA6{sr!j15w);5~}e8JemfPp=XYMj!vBhSDrZ9R{r56 zeyNdrQv@cZtsfC-KytPiZZS>~rj(wYkyn#ezW2cPS?mB`x4atRKtQpqg_PPmJYzBn zP-yIP>g<-*|M2^$YW8iG@>oF}syDSr#sewFJ^U*`Dxzv^()&oi#xp8|g2P9@!;Q4} zYadO;BFPE7n0~2Oo4HPIK<^%?M24soTsr*=xi5>K-a=W<-_j8dbBBcJr|&OP)6utN zNl%3>l%Ybb5*a3psps=^8Dl=7F2qCesZg1gt)jHo{)aZ5)hM{0z*l2PD8>9vVXb)83*%|TOfmAexw%EHyL88 z7F~9aOQi-2waEdf7e_z6vXr5L4A^BX!a|xue!?ho7If+~WsDaXnsBG-p=h^74^uEw z8IVZV#Q=3eA#OA2LFp-E;3B$lQfR+plN@Ov zlo>mrOW+Fn-WK;!{->x&koi!nk_#aOu;g=aEp%ZZ+Bv=Czk$3k@<)h&>3-3B*~DL6 zWN5H~;XO3%vO*9~b@07rqL>x_=!R$oZk$ zY0aK2&EozR)UQJbQkhFfgekzpp+4X>fKb6plc348EnaEN?2@G`iUG{rH)FS5LC@YJ z%e@%|jUb-$!kKbo-W-@H56n!?4Vt5)rTMBe*(@({!`aZC*K6~3W4hd#*T+WnsR?I# zwLj485`dWtz?#je!C&yxWvYS~V^;A*lgy9ISZ9jHtRQKI z{F#q85XxFmfzW{jO~su~+}MCEiO>TSLDz|sIfa7|oBF>X8OUD;Y3=$6QYXGVjyB1;%RKB8a+9m-t9a(GLoESSduPQ&lTMtTM{C#W+5 z=zyh=mO7$Qjt*M}17r{ywuG_r2!6wxmKx~yxU8bfD&qTvnhhi+6dht6&|Bc81cR9m zBW^(q8>k5+idC3Yu`NF-42f5sEEED2;_-+Xjtl{6WWX{HW1>@A!bN9@Y9B$bs$zz4 zk{&ijHtG7Bhy+{m?VZl1(lf`Q2yiJ>1#cBcV4!5pyW!;9S6iJ~xA>8Q6q5CvG-5 zB&&|-QD+FuE9(?Jl&3OCOT9@xbZrvgDr<|V)f;eBOw}=El6LyBrlKA*kC;X@=`aEj z@Nq(oru^SS#tDuomD(R;`jE3rW0>}{_rB#HHj_FcA7sjcW&A5ge4B5ezPY+lz(vc; zQZ8>$eacJZB-2h7t+OA>v>v=NALi7m5CovMB3I4*>V1UlM5>GrHfI2`+-qHwz0k1g zeVV&!-5ue?j&R9lZ}a+*ts9N4OO2h=&h8O!UpLuZtM9E0?(ipecuO{0Yd1No*ElOT zl($blCPGzORHSfpzW_{a!BpVW1f7r+>K$-{ zVo;#U2-m@kXdl)8_Q0>eIRL)$-0&duyy8$6m!^ZuqwIK&*aSBnliz{wVCifGd`zwl zTBt{_Ow_D$R6_X&q6B5GqQEl%6_^^Kk_29%BeUhsJ0VPjTY!hKkiY7In><@(c?wfM zuOKE5QUSYVxV`}m2x%skN9a6RU>jJt@hFXz0p?^a9woOVwO$7lgGuQ}C<4zQbl?n) zwRz~c6OK+wJl;_y&e|*^Ma6-2S*48novS~(45Gw(La2|a$F=d$Jo)aFY36Ub1Z*eu z_znX)^2s(r_w6V0usGWu?ANVj7avTQ&A$6jCR#^24#=LJV-rXd#PFSRzg;Z2WHOst z4augQ>E?AS=URQHPNH_dUUFLbtkGZaig_!i6a36WO8b7P4%@^esZN^_BxRu?Cr^sJ zTvZn48zq`5yo0I6qJC-3PP33U;wdk0k?$l#D z4ZM+Pf3&h4Z@>_#SQaX$Wa=nAfNw&yM6fA-E6ikL7K{hSwa zo6LmxqFwMnh72?C^AeYI614FUqDLEnHk3w1XAa+SH(tEM4oW7vj977nDDV|rP#SE~ zsz3L{% z9seleUl2PiJZy?0CeT;P#JGv`>Ct3;))CK~f<%TCdlfIOQ?`8$!7jEaTCY%2_6E`V z637XuE7QmtSu^Fn+WRC@kX3@+-abG zIquF6m%ANjxMqyi%>z^4g~%KU!fCTM zk1oZuw8;~XM5vMQ=m57Bt{VFIDVH^@{K$QmP}!^+qFfp?;tmF9k@PS_^j!%35uqMD zcx{ZHTRChs>8SAOLgq0Huj|}(*_roP*4ewBTYiyNFC3c;SfbxHQ#J&$3ZGwNlo_gI zfC=uqKjU7!z7p22+ePiHnmom$;f}M?==Lt%W0j`~3ZY9< zz2*7piI>@hEo=R;8y~i{PaQiN*`M1uy`(|u`p%^cbN4Fs{N*Q=-Op|8Zn)q@t@*;bjq&7dYc~IIlXuQ^=BE8C$HML> z8)8o}5QMV(v#}vHWHNgwtkq?hVLjv21$b)nY#8vw+1>_q+hVsItMlSFRb+ zZ9Oo`3~l^mQ!x;ZK{rj{Oxj$i%$LfvR?vBQ^!R*t4NsvVd_II_8Za|$9QKP-Sn$b{ z>6lsT2!fE>iV_4T?&o^hc-bs^%_dK?(3u$1newE)PD7?u2B}L%&iIeTC5x=40a#u{ zDw9X>_wSLNwEVtV;FNes-!{?bD_L*qQ!%z}{j?smID9B(t6&`oG{awQnf)fPsXXX! zgyn9zr|1aKZ}-7^zR8%SILRXob!z<)Xj8XMLq4$YA_1r#7uFB`zD0Bst-c=GsZ#}P zT}N>cD3JcqWa0&2v}`8ZyvBBSc(XCR$y~91c++xy{Y+`=n7*}H+SRbPy8ceDzDXO} zVoa^guUMxoTV*X@U*0-Y*g2qYi_BeQqHu%)s;#zJ*7X*rlkOWyV~jvQ z7Gj#`>A)shnf?phmcGI$a?RyZNv<%z6djoW2pHm1q#ZR~j){&SDmr?}Drve9xU(i> zV`?wi22hW(PzT-AN(Kh3c(Rrai|R$rgk_QVD)6iZ^T{ej-6|u7sdWm7NkV@17NVET z`58Dp@`V9;gKH<55b}^9CdmlKD50`yuy+rP6tQ*tdvRXH2(k}M_usH;G~9{0 zh8(0>LWR;R@(}h}KVuZZXs3WmYKf-BST4u6HF_~mhtsDH|H8ym(k~m#vq^H8A>^}N zz(z$VePHj{qv<$>PGK zHa7%?XMm0!#=km>w+WT9xC}uwr-zlj(j%_KWUm6LSBQ_0K!~9bEAmQLAFMZkCcCxv zKy{$m=nO}L?aB}|XS+U()=;A{RId*t^-j|4B&~Mbt;18s1F)2J4D~95wdRUSeYx9R z8H~-jqf6#ijQKOu*6L0?*R@tg)uq*Fxzkz^49wd@%bn>dXKp%}TOZGim@BKv(w4s} z=zz2U4z_?J!NuBfr5$tx)#RPB7D8QO`qRKx4;is0G*{iN*|ll~V6`4~Vsr?RoPrU9 z0>dDv)(H_*6Pgn#JdiweE~_y(q}WD*ukuPq$QoV@p~n%V4_VGZ06H6xsxd4q0Ao98 ztsdt0S|=7?x)!EkV4G;4arB5!E5@TMs?^s4`m}&cdq5{p02~y+6v>S+Ny#FuDae>G zo1rk90GJR^5OL^?;TdS-f-DQ`fh@!^kp%#oP-&IgP$#4$dZ?x_n=qz}KquDf7AAG2&Gp<~Niga{K@s7&STrt? zYQ#Ph6ZuL~OCoLydV-7vD@@mjkSS}`SjhVuKK24kko+0W4}>mf18X4cOa(hASVE>v zfNv$+5%`ZZ*p*S8g&dt+*B&X1++Wy;TzT43ueMPjq;iAp`3dA8##YcUqzuQ1U7~Ob zXT@%&;d_{fN!$o>gX~>$er+1O#3{F;HrPuet}-}hno8zYP}=vXR!q6{BnZnj(lvY+ zfk=`6<4y4C)y&}d&yZLcEqU6Wt@>wvC{LN)ex+Wi7oXZmqi;Va+K!{o8c5mid&2O; zwO8K>U1WUt1E}QdB>0v*uYh{AWESGp1&nVRF{92X=+Z^>yQm~H4#vFKH!7l47Y&;X zi)odNm;p{DEH**Z!g5pNVfSJSp}h*Nu$v65IH&IS)g72tqifM@xm{CQf{N3?MiG`f z*4toJ03v`n%r()JxU&GMupol6c%5yBA~F*If`z)|QV|+wq9UqoAwd`_2sVW&Ai$+c zT&Aj2*hAEX9fB-jUd*a=cHT?v1+8tEJe@|OaXa8j8aj`XQ>)s@qE`~$FacC*Mh!i6 zF?3{}&2EC;ILOEzd*ktBSBD+4y)n}=QP|{};Avn21+BQc%?y_d2$O|+f}NZjrk4`Y z##h2*;FJpwLH_XA2mQh8B5w+gxjvwA$p-H(ZgIqF`*_d-WxfpSIdI0s4=~Y38$%Z1 zn^o$)v_z~N2YGh>CN-9Iv+*mA-~Pb4&r&JGgN;@BzW&~RqY#22I#LOiHmM%Ko)l00 zyyL%0;e!4YgCiA~oGtI|H`|)JZn2x)%!O(27X40D)tIQ4gV|D-X)ju9-R>qR*ig;+cGCbuB4Ep1f?#zHU zTCYxG=GXG(yr5<_W?GlbR$5)VKD?&WO4>vEWS5?1=B&+Mn~Yl%Re!KGGSqGiG{x3n zsM6U$E~JJAD!*bEVKvEDer9dhNd}qkq=k3UafDh5>|5vm{DOm{ae3y+gDpA^ES`O< zF<8X}53ZaVISqv+g0Nn5=I+}EYfje=+ZZoEvvKpiM(g&u$8WmqBXMxii7#%xHW+qJ zZH-|Y(TJBb)dN=5d~qB3?MMrZRfeB>+UXqJ*NR&=>|^?~#Y|CsN&D`Zho4*anPl=4 z-rsJx^}ciO{S?^|H=S9JSJM9AB06&4UksjcUDH2q&)~WTpBrd=?ZA?1@E2Q`tnPZ~ z0#rWut&=AAeRKZI8!tXZ`?DRTLz7>-`n2}^m$#m`vK!O}hej?vWn1Bk2hVLZzrKI| zxEubeHv8TE$8=VFX#4(u+}pfzjd}NJ+m;W^esR279Z&pajcRN^b@~h8BTMGCEPv?K zZ6}_2#UmIQ*EVmw=-x}WT)*YQzi*xJ!PU16UvegWrk$F&`!Vif4TJnpL=v0#1XTdUj)SsrQ-5yMlq?ukLFN3^b4Z z_*k{t4r_LunI6bd4aeWpbXU>IJZXW(f!t9P7wfcCPu5--Tc zj`PTd2qE|y8b+YZ)Y(ja{*6G%cjCnIz6L)%r`5^lH+s$ngrQ)vb)FBws0}!SN`bw<#9>dA*{~%fvQsvYL%0 zU)IkC#2ON3olM5lf}yaG@=D=hGwKc!Tj)*96rFdy#YdD2ZBGb;nPr_qBfFk>nSq*t0>_)56!hWlaW6;LjeDu|37tBUQ^yHu}94I8Gy&B!@#zt&D?9 zAAT-=#hB}znD+2e{VBk$`A4nWxmsL zn|qS(-gt7Sw{(ZUe%IXY4Z*hM_U>74_n>u5H{2ap_9p{7?1^1W(dz5A*sIohtGC#@ z#*O`>-ma>6uV6wl2DIGvBtNGA{BM%wQ0pk@vpLb)2(2A z!8|;@rbCXlr>`N;tir1*?}og(IFjpJW~!ZAD&Y>Mb|bSIuHXP{$J98SqZASK5HcTa zik4j`H{K*T0e34Z`n;DhnZ^VVLnYpbX?DWM8RH$XXPC*1x{o_1$_}uO(s}s|h?yru zUEiRb@wws7n7Yrfih(BMb*7f9P?Hr>Fi0N;z{Hzmk*s95Xb)7D3^AP+`&Q%{V3zcj zLiN&VU@FOcazM8Q*hy`q=|i%BggZF~*Nz`N1%rGxuA_BeTL}74ZbWHTt83UMHW7^f#e zR|2I7_dqKU1-(IS5hmjufJq|9MAPLT`JI0jqs;`gv+DN}X(ph`^@zF_1;PKa{|5Gv zDXTlw_Pmg1lrhMRY$?2gs6`S;X1#X>(flkiUD!-wqmY7KRd+D7pb zVkHhuIZC)yBDSo8#L7oYk*B*P+{naji8A`(a>TI(|@kiOJi>Nte_iqLElWJWhoP#$5{a+r9fV(6tj z7JOm~_bY^r`iXu?ExALTP-H#OAlOq8$9pA%c3>(u1A_$1NKNa1i=P54U^mwXtO{zv zF%HRgf`Ll?=p(@WcZ8T>zNnQb@Cli*_~EAUC54{La+=^ix2qG8;}dZ|QDZ7*Uo8kJ z)}r3^iPj+st?IX$s`ldG3mk-M-@7k31WMpq9hnBa5V^yY)Xm>;O6(}7ZdE4|u@MHV9=^**J+MfPC{sYVH)bLnQ^OE9w; zTLT;HZIS9La@s(k{fGrFsC&?Hf=n9$4}bv^l!FKIKR=@VBoTjP7Uhbu*_5I}r;Js4 zEAs<=F6t=-L|u?F66oOQN9uP7uBDKkJQmqBkjh@|d~dmM0aAvk5pGB-ZKXgdppSY7 zy-w{zsIrIIyqm_vjvJ>`hy6i)n8J5tMH!6-VzkBgzx&CFag+0>h z#{k6aTbNJa3lW7C)ZlWpxxzuXZ*nv=yrh2fe-Yb4>5ugwKg4|&z%xUcLDlgjQN`q9 zf!A=Y+gzs#mqYrxS^)p@uxeOIUr5pWqe zI=7FOQ+CEr4k%~z?j)!1S+?bI6|5O<2#`^v#&ne}V`Qre7pQejfHJvz)G^T*;|#&m zq%8Yk$T%A~HUe=VBRO`XG&JzIe8CRYLh9bU($7@9s5tdos#NYeLlSB=~rDbl*{=asc1#5^Wn5s(stbq-PwQj z)#?7SdT0mHK>!ijX;6CD4%%cy0THWBrEpV)PrO()8U-^8ESlCpBJ*h-qt`5Eg_#2Q zlnrtR@CnJ6(F%nOz-K;R@KPm=acOsoX{U6d+OU)2Ll7`XmB2hb(7nF0lPQ%8MP1+; zCs*tNpEQ8zuZfr+bzhX%1_Wg(oufw9rj-MwBj_guDVPjxJKQ69)+#`INE>%)&d3AQ`N*43X^LDdF{1$Y)^A0I8{l6rs>p#_k{XHLXeIVLJhVN=7rk9 z4lYuSJ<`zsjC+(r*j0!k1vW@CCl%A6Pes^OD%5+5r9YG3`4l06TrNtvXQ}cTA1Kos z)5i*p`3LAp6NXqEHtAtz**ltl(roptd|yI{k*bi&e5QT^1wOTg8p?4wEMNA$qKrH% z2u39I8xLfrl=%rQ1t$YO>{QF@Oz-RyDe`2)?bGTjmg={{y9{EzD4EVd%u#s}<)kG6 zyv+PJHl!iDeCB|Ax>~ynI94^r_gpr-N(Gx&?`ly2f)%HaTRdATJue#pyJ<9O-^=Am zI8e{1hf#rCzfv*~RQkXP#gz}7cGe~rE_K}%7p+@YrAkTehR|YuPCQI zzf4t6&7ZY2r`B&%Q0!*r1D1ZdIyg0;mR`HPvrcKt2ZsBVmoww#%QoS}djq7a zv{d3M%>yn1!#yQ$>Alz);;IAt&by|Q=xqBjxq0dzM^`-+tiT`0VCs5Jb->J6 zfJiTr!6v=1G#o>j6>}=Prwzt`x z-rLSLY1LL;maJw;mSxH6TJ>UER&lqnF~wAyPy#7jE+LSFR4(bikQ;~-Cjm^rBEf=~ z-+j)=KyK{O?C#8WzH<6`&-4D@p)rHhrdA&|lzWxZ!@b8N^axUhX$GB>7^MNrA%PM3 zM@g9GK(B}HEQCE@?jLG9Wr`2Rn=cRSGd1)Nw<+##5l$jp;cY*Z8q6VtBV7p(^7}%D zk%3ltNibay6-~1CODor|ZR)6%#x9_?O!s65t<-=~bL&XE3t?f9cOhJ9klv+HH^^d1 zKCWtefZyK)(Z1J<<1Yb~P4GX`;HjhutAkPKwbCme=E)&C{_DXKF1 z{4`=QEHu1Z#3D!J)wc!x$!`sak~x~V02NCswa__>j}=Wz(zEme_YM&EIdFw8#A|tj}pbeASlGig@7oPjk+SHb;21%(3}igbpEWrBoRNF$%cpojbb$8 zKdSp^daDutq-PRWVMrH|q18l}W(sIvMWbx!mLl&=)op6}7ONXh%dafsMD%O=F`6Fih#gXE>Y3#gh>dB=4uYP+kD2(AX{cu--lX`p>yIF8w)t>M}R=Z z3qmv$G80;?#pjE-1EbEsu(@T-x~$*QHEbU4w2idM%d){}*wOQ`w$tsQF=u$x-Zo%v zA4Q;4?&&j)w%GgI^ikLBV9-7$BX)sV0f$XCDs0$fUDyd+Hg5-ZE&YevkN4QDCX6Gv z2)o$Sa0l&Zkh&sR7ae{gSwV=h-HUnPUc6foXw(BaDm&Y}Eq0&r*E}aXeL+Nspdg5B zi;)7#R0NnoRsrQz_81T_ga8$gr{5_cPt4xfxIB(1+a6x^r@fD~xd6{FQ*e|Efl|C^ zLpZu(M)BL{F~RKg}UPf+Zlo!=t88yWO?0vsu{x=<{fNRnDPj|i>EVK3^ozjzMN8a zTfwVTE|v2w5xmCP-|n+p%%60gL^A`z!trB|m0glNj0qx5;y^X^3?9J77L>*O3D+t1 z1H^H6t>9(oJt-XTvQMsdefu6z*}y@)fLa9LbyzK*aGdJEAzuJm7RP_E`)waXo)goM zfgAV+_vbT>W8bmLpRk|o64GHp&69Vi7{MFx!e7*GFQ5npI4Xkds-6EDVy7IeR;03> z?8dk#m{C#qjyq%*CbS0l3EJoQJ|D|NSo&;^_uEc(V7h}9Q#cg%@BZovTnhD77*$M; zYKPJO7EkBviolCGU$h->M{3N9Ar4H;X#cSn1E((~4#foJ_yG_bVRon8PLL;1IRE9B(5awJQ9pHf^CDy> zT&VNkT(+Qfn5ab_?@P8r!%m+Os*c+*I{yyN*J)327vz?e+Y($URh;Z1o8gNQIkO3p zQrYp6?Et7HF*lJ{6X@x^7icPIA-TZEvOO~8>6~)+m+jG_J(ZD(h*n5jW@du9Ws&H! zj*F9_e5kGJ7^*mRlZ4T7gq7v#>gs&vdu{j8iYxAIR!d9Zi z(ekuoSC*2u3pqCfn^e$(M$l9=J>8%l<2JO!G_-4hXyXgdV`0g|2J2z#kq-l&+w!hF z$PzdreHBeu+&@-BC_rEn{vkK)KwC~|G=kBALxYC6Og^2@JdTQ&%YR$m854OU;3OgC zg?g8ph?ow&-3~2M2FejMD+GWv zOwGfG)h4&<`2}__wOaNltyY!AqH$Q1R-?vYlmK5_O$ON%cuY6E+~qT9&9cS;>}1k9 z%xarK=g_NRP;FtYO#_SN)JA|~oyG`Sa}IkLyi_m3YdN(o?bmGUc3^$+JM|Hv#b=Ee zz|K8k9vRChF+%}Ukwjxm5*UsdmWiK&jj?%$McClTCF}IIptDCW3WF~p-^l_xIRQVJ z?X!AH!Q_TAbLl;LhA0z6G9#AHg1OjjH-*}ltTX#90b|er{I27+=#Y44tImQfC^D+- ze`)|rji@09Q6u$WPKWT-0=!^CcUr?Y^ub!s>I%?1=j;hAi04!05Z z7}%6X`-_)|()$f4TIY~IVAS90e5J+b4CquhX8rJ24pR$E8qdtu^q=t4WjEbg|LE{B-?qax zOURh0K5%2j7IW{uore-cLhM^}X7w_NBMWM-9L&v{tly+lHrfndl74;OA@8`)?$;7S z^Ty@Y#V=mJb$IA@P`~BYjXgW!#FKT%$?ue)I7g^zhl{lN3CrErv-{1HARz&eI|Axm;ewI*9CrNK_7PCnddUmu7FSZ zC3DDSkf&C^J~Z8P=Jc*ZA(PSYatjh?3E>&t6inH1vj8v+re4pBU$P8nr5Ip{H~-iI=w#!OQMe%G6Q zrt7N;A8cE@YBBcl`J01&SuOjobv&Lx=}_=y-EgG*1f7LSr=)&r2J94r(O*)-K=Flh zfv0QQc<985aDLa$nOBJq>~NU|Y`p@lr!#bSg~iatBYfi*yrV!Kp->HuqS@8=tUPwb z;o{NYbHNDgx?q@|K4IieUnkEuIoPL2lPaB(;6^a+#WSDlJpVW zufpDByMw0WFJEjiev288!J5`v+$z6pP$3)Th3RzR+k^xb?Zam46B3FFC_RJxEwaX9 zPKX;}Adu;D&Fow0>;@hj!q132riFvwwG!{y^sm5=zkESH+D&A*#b|`j`?&>$P=)1P zvxP44KTH;6+eHhJVGjQdty1vIkI~KdqAV=wg zaBYC<`yMCwZ!d?{B*1QkO)2ZGKl$Z1P4eH`%zB@h2NT>W?0DnVAXWKI;I)ncw8%u` z`}_az+Xm|@j%ElV4ear6LGSRR|}Wn0(Q^2;AMkOlfC8pLq7;lVlvT(wpkJYJ)_*ClYFO z7^$v^j5-L4tv8!0R5&^Z;UZzRm<(i(mC9qcD1$hUcx@s`w)m2^X68%CdGRF*r09@p z&G^)`Av|ipl?ts;@J^?|qnY0sWv|XA5O7901AZ}9Gvq1cvPlSzB3|lfsFXTP2Ijjo zHTK{I?X9qWS4={1F~P+HO4l`lMiN)1F8^PukzF<*U#et&Vy5#lh?4af_45Wb*-hJM zvi^&mTxCHgn{Y_Op~m7gLESq1gvqe{lV0HWfUGLvF9tSiC;lD+?Ckndu>)_iDea0x zfPQ?wPfT7Snl!3jVPXM$K}qjI>V+JwpiXZR%d^FwL}uO_cy07zuTTQ|ofD4He&^t@HQwPJ@3AKRE5};Aad(@5RD&VJ zOsWlW|WR+gF2$Y2TH7F6i|8=(s781nK8iMSsv;XxMO?(mm7 zulKePm%0T?7Ya|{6DV-OWPz%z0I$;T^|O20KnuH8`l)VeoX;|=cm{XGEM+lwfpBj zB0|4|)xpy-)CJFSxApb*$4A2Aw|kGqFTK#X*phMwFuqA)n>ur}}A>=H7b>a|t7AOmPt|{;?Iilxyx3k3; zqooGgUvE914u&lVdx|{f%O&amz?AwuIe~~GG7GuE8HjH!fLThxBcsC!#p!Q-y=5sI z2pOT!0vIa@0@HW_q(Dv!WC%z!*u4-LSZE%rdlEHIzUZuF+{LVI_3D;>?Qi02B>mvGpAH>dTxBW)jw z9GyiKKNy4tL#GTkDnv;`baTy6lt_PpfB9KMvRo$!5Ty~ql7zpp31vW5tbwi%w;U}) zv{EgQNNWOOfqy~&42d&tnK_xG$`T!i9j71ZFj!fti5E8jZ^+c<=C}R z5eTr9f%SpOAlc5SX~H$yZF_MNNGkL)W#mggr^CXt^9i-vGIZu4L!j&G3)hlvIq)n+ z8XA4s29bj@>$=q zpvSR=sQ@+>xHq0o|{hWQ~1X9)RW@3^A&_b0l zUxaKH!76bJT^>KaXlRGhxhcHg5VR94Q@}gc(&ckUp9u9`yu2K3Zo#KB2%|IHhMOKG ziT}R4ZpYs9E`*d(kn{@oUs`+wnr`#PaRZv9p?7@iz_ZD3h@uh;&*#dcBgtQ{g1 z7c#lO$wEEgaXh#E+5Dr+_Mh@P+U%v($6wyE&li2>Z!o_7(al5j-ww}|{az}g z`>*L3p;N72RsGJkj_|<;JOM*XxbJ;W4etE?=UzA+e}9knz$@=Nav*OfBmRp880m0P z4E6hv=WZGEEFbVMk2*(kYc{vmuZ>>czN~HcVOMWQV65$SZsMc8pW3lLaNmcIEbMXg z-9KM$vk$lS4u!l!erJa{+~*bYrEQV6)-K=kxl3C<7B7r<`@O5S4-B}1ecsV!J?C3; zJpp%n{tJOVSAX@$mgY#iYg2n5v|NoJh&$4HxuZ8+=;~*F|OYB#pLRdix&@^#QN*{XisYf z2N|rLjLxVNwxA=gZ!yz?JKRhgFcP#aTb?+czx_z~zMadP6N5b;?A}uCa({5~!|6a* zYxA~98&gNo{DjLoc0@bGRa z=b@F-KlGuoi2aVqEQV&`*@*tX4U6kHg;5UIFfso1t#+Qd^6237Ll3U{q|Q!vX&rJ5 zfc9Z4clwvN3d=k(S6Rp@9DhYu6 zuZ4<<=p)vD$U%hv-J^JeG{hqG_>}*ZaO1bq`}F=s0$K<&A?8WKjbK#*)o}jIYKwZ=qcJ;vEu4mqxJWK5MHvhi^b$F z_DULdWp02M@)~S2U}SN)Lp4YHw7aipj+Skyl(Cew7Blvlm65qF*Q&0-w6}TAzpQE- zsyiohrd-~dpR`~%p6au%3C~v}!8zu1=ujX)jsL#G#559zb8Eoa)=aPnua#j6qbhR* ztN;`+_G%PgsoV%`utKJH$Hq-VV_HRlGbglLePFJ1**<={LMWBX#DqgV0Hu8&gIf>= zn*Wg$WuAh&2F;8$5A~i1W7s26G{BOF8-l%a0wpPN@XV682--!mUXhFCTx$6 zX|xE?w#M8cKxf_=HxcG=>LLbQHDF;mp9m9y7pMppfhQ|pHUgqC!XTU8jg~2fdNF>W z)j_-?T&K~)c7-hr##AXba|Ed@q(HpF<2Qiv1VFA(`XCgZjr~6c0NSe9(SX!tVacul z@!80f;A9K80Bn2Dp2-uESL%l08S4$3M066?)fnMzVLh(6Z#t2Qu_4Ng^egT;Vgl=M z2K=oeGL_>Etn_TRx!iso^D1`GEEw$#OxTdzb-D!)dq?cgvXOdSS_B?LBTdRlk*C&= zj3v`!>2%VN{PBRKnogG4p@p?;QV9*UMuJP2BhVl0 zl7j!R>Hl7Wr=%4!Th6*)Tw-)Gl^n@rQu@@7)5|4wwF^-=*cq`AyCj{3e}xEnMw+uD zj0Y1%bZm$&sVKEPwQ(e#%}%CM*;G24%w|%VOd`8n(v%|$FiJ%5RjXyC+AA4}%lfo5 z?U8IQA+&}vX+S5{rSMZ*2dkMvA)m=b)1}E`dLmaGEA>m-nrp43@T*l`r8A5p#kkrD+G7 z#|r8Hi1cEoJ}>p&T9}AsGoz_wBAu9sClaanL_FFfscYV?>>>-YQ)JrTL5(2dbz7Qt zu_+Gr3PlCWCS|1Mw^zsW#lmDd5l=KFelHp49P!B>Ni*Zx301;QyILni5!tL)Nl!^L z9#IV9`hvisq`IHo6iei@V<|=I*-Sc>Nu|Vlg6vyx>?QX=YhdzJ8a)DnYU!p_YY|bm z^@x?CAgkgD+MeDxmdR(vv$;$zog{fKl}x94721`?0}xk&Fd#rZOs591#cNWIIPiMy z9TK)ay)jxY7h|c6KJ)E#vX8*Q1`+&S?6ZT^Hd1J%tCA>6f0A@LoNU==sf5M6^>5p1PsQKzKwC@0XV{*5PTyS^s{K82_>%LfOl1BVTsYbd-xk)GpB}F1Q2za%_ zQh!d=a6vUtMHNz}sr|~z*M!ZMd;U)2KfE{F=I1udfpww4{hWO8n)N*BI zYV(2NSW`?9e=`=3H(ry=M6z?>MPNjB<%*^V-OTBL@CSTP41Xlaa4+|l6t$P;SOmeDA?E)x|Sz5B(@)(T$#$xq${(@ z*;=|j7hi}=rVY|*m9f{{Q(l+0`4S!l{4lexd7)OV>qyY=i)a#A$s zSTYt*#$u@`eaQ;x5rI*1s9?dl9{s^SNwu8}5g>YlkEK@hU7ng+yyTL6p|cr1(#MJz49wyBG5i`4h@re`-lFp*vLLaD2m zSbTP3U@G81c`6VkI!MKm^j4FiEV<9m z?qB=x@K`aKOB9RgbS_ybBxz`Yth7mH$Wk9b`xi`C^a2Lri{BQ-0%iqk1QnZ?0vD$D z4}35bjU{v0LbM*s=d#i1i9X3!mevH}t(F~zOC{T>1{&=yiEg<`1PTW+LIqQ*NbYmf zCrif$#|o)xG@HyM%2B$OTASo8N^7k2!fQ6z=|{ky6;j&2QKB_!V80rqCXG2S$(Kr( z@;7_NE7?poolZ?=Q^WCCs#OZ-rIHUi=|JCrq&5-lULpO%&A=u}v@ggc6A+xiWR^;j z`)d6{>apHfEuTp%(o2fRlj-qvJWIV=)*YAX4rU9GN@;62H6uwo#)A~> z4OvQ6=__K=Gp|fPHgJ4^k>b7d$s3bkF_ejzqWo}+-+S;Es zNhhm0Yq>Y8pc#DZ)%lA9kHm7>Y%Nu+O;!riTMs0%)9aciBxl!lX*@=$YxdtF{V6E} z3bqh=2rbg)gEX4+j3$u*^wK`Feym)+&3|^xP0r-);>z@ zU!Ij77JdtbcI{M`GH3LWHR?J5yqp7acQ2*Y< z%Qq zINSTeT>jd8CizfoxthtF;EPER&0G+`B|S1u2=qvT2o%4d>nN3_W!Imbjvm-sSXivz ztUaFDcYAO+d1SJO3jpK^nq4RP_P_u##1gWcjupa?Sq_rn;M(ecq#pM^d!>@v_E2Vg zeRbdA`@2u=SvKB1IoS_R2pjnp7jbWe)Kv({djpW3U>5OYfQcm3O2zkpV2MNC0}Uur)3qU3Eyh~T_m3JLKlsYR@_J%ya&qI& z(ca;BZz9&0jFVh|(Ld!u1*Isx&ESrJujm+YY2y0dQg8;Q7+gR2(u(0)aiWsmyt{X_ zG>|GLOLPW(jWO%{3Jo&YN)yS2W`gWeb={s~p6{-2@6~l?)QaoQ+=w%d*#c2dN zlF~q>w**KlIxI#)BsLjLM25o9Gl;3aPxsOM^xDy4Asx*z1|=ARm>Me5KZ%QMYj`6m z-$kb#`PE-I<7iYr0MAv45`SvlSf-d8rPV3Z%9J8`H`Yga3Vin+`dD_ML>B)8kNB(C zz2EL79vO-!$5N?;Dxr%1jGex@myQ!0u(SP2n&alF$hTge%f9YImB$bFMW2(uYPK+(%96H?5n8CQE?`4@_t{ojq zr$!R7#`Gf^oro%;?+$m;r+t))ZXS_bQY)s?({mHE32De9joYM2YtyLOkj4XqK3^!DHfB#;Tg-!+q;F>>*E8#eJhO5mtfIA}(GotuEh z)!`O_gM*H-u%>K&czrdRD8?p}@l-UQ%4Oo|u}uF6qS|=EH7S0|V9jG-?m-6AaaaD5 z=In$Bd-}FxuU9u1uTEtO>Enzy0b+8lI6U}pW!g8}_;vbs>HOjj%QO08a*nyS>M z%F}Ug%i-E-rz6PzpUXvvwo!Me-|YEA)zPZ8bI>^4ZtLwdjs@%|oAsl)>bBDK`nlT&_?oRq}c9ULH619!;FH8L@a_+Gp1rtEaI+!J2aInTEBQ{I+z?=+E zuPISJ`EsdLDU}=Vg{Zydk>Mu{0;Bo~U8!6v7K*x} zqVz`8-gctxc{n5NxX>jWM;g2Rv#K5IWONSSw(W6i`X@>=x!P1APfdAa!q#>&{Ic=C zCBTYhcYRvDeGABh zv&W{2rq?cAs8FV~`=6Aej`nlrPa0{CZ;1zk!XWPmi2Hucs)vo_#oyca*wxYWx}`^{ ziqvIZ;$Njwns9WUH-CbAgj^JQ0Xz<9C319a@6)V2q6dW%FTqbacH7kBsSTHJ70WfM zV5MBWcbY=f*?HdbG1-MrJpGQz7OA+Gm7HB4X{uh(r&BVGr7~ol?sZ;nRTrx3F5jHJ zZ+cOXFH#jeKn-y!R5YA2?2+1dWGYWxaC&Hkkz*};5w z*(_rddzPN3glgqlxmckmD3)sZxUK&Y+e=;7VUKO~L=daZStX z!`CIVQNR7PWHc);98_rsN1tAIw3MtqSzTU9vrHbWCJx*PsZu+SJ`R^;xH6CPr&%px zgqXTF%C6T`O4*>X>y=im&aU2~)DHF>uI;ZB$8+5ywHcPl+HX)IC5m2xA=;`Fe#v`hO~ z0BJv;UdTY81;|tM-O^jW2udYtq=4#d@-C-gG_kb(`PGGbwv?{Ws~5A?N~SQRPjA#- zXr?dlJkvuNQs+T;`_Gt6U)G^n=t2G$UdiaV-(im>FQooBS1#m=g>q~zT`3n+E0R$; zvt7M32B%egmFRyux@M!z+x?72_f@soW6|MA;WO(!hP_tvSn`P#FE8Y$vh^4}X%>rg zDKj@{$#1k?>P36{_!DvBU_Yof`ywO;jSrXH7!pAnQM`}&M0Zii``tc#7^&VQ_$ ztz`3sro!)*vs2Z%{M7u)bt~md3Afh#ne;`iO=XcH&diG&&Nn$e+KKj{S>^OZ(OY*IpWT%INalm9riwX{zLcxY+&Ev2ANwf%;N#;)#uhNOqFMI^@Y;vRa=i- zTDkbp6Em~+#M-mIt-Axi;p%(tH%5)_&)WALl0#?nulQEZP9DB86*`zX`QeF|)=hnC z#Zzn7F)yj)7n0Lc4<90U8wKVaLD8{4~o z;|25an%#CXb#~2Bh{`4D(@pLEuB)z7CmxPnx-k93u07is+3V4{Lhk&+{d-UBHf(7J z<-fM#5v}>kCQ`^_Pv}?`EEAZsXZszfSHb$i(|zMsR1~eY~KZ(1=}>~1>*`|Zv?;PmJ|(jSBt{(ZL?{YT{SpS zUp&yk z8mpwT^_|ITu~^6!^XWo1+Bk#2|53CJa=%>n9hhM8;uD4CE%Qzrv#jdsVxA1RH-M<} zcXLrB(2)bT{FljSK?CiPRks@-y<@(58JXrvV z>BV(>?3&@>DieS#Gk`KP>tc!bQgy^)K#E>xc7WOPPK&)KX={h(&G~v0VW$I)k`k2D}#|GR(5U00mbr!SMW;6q0>rD3>)Y0L@#(X@RFDFWc zsTjj>s+up3a12f{O7qt&Dkv|59{kPVf_ulc5>ElGO=q&%eY%}ZO{GjRn=PlNW(uYB zRH;_Umy^|4N=aN!v&#H4Hp{A5)1L`K^{nPNHnO~%6HD=TG`&ZS9^D|XL^=>k}{K~$Q2%O`T z?Y{%5$?=|VgfAD~JN{CuF_W&Xtrd$a=Q#ey$(Ci8?mH`>*)SJalHQ1P`GOsO-(UML z*1T;%#;t*d3~uDn4r4A`+cY;-TQN5?Ju_3Eo378!)MnGIz310nCS)~nQi8#bU|UQM zMfJ`9*M4E8d-u4m%GAF3nN_P7)=aNjKeMUC$Oa`lb)KdPAv$^L39f6?WoBfeyf!J7se`7j3OL&w35_S&4%(|M-2IOpJcKu8_H(js) z@-;J^3U*vhzb_1BiI*>MTQFkxMy!E9mrtz|7&EXblAA9L+n)NeLHxrS)Znsti-5M7xjuuc3&EM zHPjveF;aS{S0Y9Dj~s{Z7u50FfwLk(ZT;+YxjrQl)YJa%%LAVXzL$WiD-yJP-SyC3 z7jl(9atD?gm)M5+VS1W%?Az6;w72I<*Qfn$;6<>=Z{JJO_IvIJAH?vWb^pk9FU^XJ zD@jvtq^YGnJy)B*KpKPvm9D?Lm!{*Z-UEjSGJ~`7z1O{jtDc!Jm1m|Z`pO^HQm)=> zzAr+fLj-{#p~UL+Haj|h*R}6q7%FHW*grtj;MtHan^|*XTdrE4sp_iVsmvrCz1Q4d z6JFj#6z4Ef`kI|xUvcg|EFz4*-AIyMd*fiSS`$frRGW$02CiCv-|1;4B7zYA#3O*r zSoXi2yNbnBs@3C; z!K>CUdyypub|OjOKTs#M^?t#%ZOQtpB#T#`C=_PzU4#jdp-@Ib&uU5(RT{F(oHO>F(3C?!7W}71`2%aR{ z1KPpgw$0p-Z4n#XCvg-)a`V}+CX?B6>B&s3RxcGQ^{QCuR*UtNX>!T*xv;K-^|j09 zHzR`W4LbTi@5tYlVUGoYEK~p^OCei&a_^Owv&H&swO(bRT&b1I)77*scFOUY4z&Ml zjW$fs6`b0;KkJUYOb~UzW8Tp=wqI~t)6v~$U(A%MwHihgY-ZJpqVk9JxFvDY^r;R+ zUh&HU_=Y<|!f)i)TqB>rg+q|Xc!L18pL1KXsRO58%2lVTm|heWMU{W$CB-|_lXB*? z{Ms@@1jk+=T8L-rqh2a=)n+pBX}FTVEdLzFS{9VeR^C_IWiHvj?tdapSysSvEv-AK7uS9$WQFy}zE@ z^kQOkCil?Q7H{Q&)9-I}Xf4ld#4VYbsmtVcFJJToK0{b0tJ!BYfb4nYLnh7e#HH0I z>goJUUvy?gwzxboKa(HsaF_O(pNy~`Bie=4-9!}gHre0#g30$KGj*p`#$O>!q^aXx z^+@shhA+knxpK8OnW46qCbH$iSa^QF<)vQaczQ5wAjC<)48L>mw#)OoF#j&(1OUze z)sOkr!=>wcUs;IFRi_H{8kJgUW;&l7kJPqXo*eM$0$nc-5;U9`9!S=XoDVp^=JA`* zOh&>mKR^gkOL}{v4t*00A^{HBRA)4r{?={~jI8@$MA4e(Oibk-_-#+-F z$NqIYLxYK%06`A9PJ0dG<(C#;T{$^holn=We$HnZsO!=8xt+e-6G6M{+O14D6oNGi zdv?~J_FBIf0i;8?-sx|KVmr~^6idIl@Y~giS;m2yqW0C&Og%GIDWpQ{?zdkqd90p~ zZQJZ=>GXum&GJ{)Jn!;;o`~BFl^!Ha2`qLZY)lnDJoCBA9-bEI#Tc7q?vn6_nOJ~_4Zgt=(7_S zZ+W_(U%xlz{rJ({@q>%|yPKa`_SyS4d|~E;>nby|3$>N&rZz6_IQi(>t*76&VMC;} z?eW%w$GW~89{=E1%Pn1B?!=|D>r(x-&TX5guDrNuaB1d=->rUR*SgE!U*6csM>iUL9SG6^J{?PfF&-1!>-)!#0(%u`v zi*sS$Qt8U(vpBw3hdYOFw?F&XiSn(-=ihf=%U()UCNhlg*sb(o40j3TinaPJ~m+u;+N!D<~~2FOJ6&*?&f3rK3HB`E}h>$e|l+d z+w*(pO|2Gh$Z_OaVwwAD?PkaFt?nR5_>*QVrp=zFfb4TvQC4*ZmOPfRk3TeZ`N<8R z-&EUO{*C=xKJwt^^-rvbd(cnzL`*Ya+Kc-?6K)1>#di%c1~yNSI<*p33S++egvZwN z_>qOD9$P$mYVT`1KfeCT>r>O~Zd9WU_dDm?en`wvAa)Zn8_$R)my)%@Ke!%oS_h6D zSbhG+!pc*-9=mlm|IE4UOm?<7fpeyiwNSYJ6J)dhe5eI=2ZQ5pf1wBAI_}l~xds9lyJ^hR8U7=v{vco8Nf(9`PtA^7Zxe#bo8- zb2EkNe5zWWEEftBI3nIl_)`(zN+x8I1|s=8zLS1+G&{F?9gDVymI}4S%+y?II$L0g z_lpGo>BU)upk>@I&*jm3|I!mU9n=q}W~MRg4KmMkh`(kkPdg5 zT>pA+5`sjE|BPP~i&ZyF7m{^mVojB%a#QJUC1JxKM#%b7(!?Y5FZncyiPGXsi4Llw ztf>_}<4f44miXryjuq6l1cr|eridjM|*VY#|mhPLgl>6kVPRm?}YufLhgBnLMh1mcy0uIP#^gy(Ji_;J}>upL-=2w?; z#px>M;%cdwV^l5{GlT+k8W2V>U{%E4jc1iR1P?F6{o{DT{{h(s+~kpKnJY>{(Z@-jrW(=&z1{JLRsh* zu(h&ot&jO+;t&W|e71OqJxN#-5$+E78KD{Bj_n4SWLTUHPw7!noTIS-7vPZ z{Z&i`;I*Nm@d!p`U-;7@c5KB_3mFB-W`t-^xObX;$9>A&WTuX-V5Y{-nK1Z@&9B-d zk+wjY@ktg^Mpm4Mh^gZih92V1AVLkJPXU=74|?2{cy{|-d8$%PSIaX=Hig(3Dv!!m z9jjqsoB5hk(9beq@I11g4JhHbNZcxKLM0do1A+JJzeMA%!S0WnC08FU$L46#J5MpjB2 zrOlutHuj)Z>@%YYY19!SUFcpK(ZCgCnA+Q-LAuu`xgC<-B?Um2jgmt{Aa-RyEiE?H zoRTr3ZE;Fgm*kQqr&WsRBv~uDRZR}=mc9Qb>4zW~Z1_VB15*gvP$B&@>VK#=N}HuU z(&IuLk|@ibfy=F#%IWOmvuB!JB|&6L?tKAkF2{gBr6Rd_Y{2D6gDT7vk9*Km{5N zP@o_dh4>h>f;e@fIK;bTez3nTO(zEiEP{uDd2O&1++3{ymj~Jgr2}T>1eJtbfDwl&q`rWgIOKatl8f(;+aN~5c_HN?vlD@*_{`gVvIGGA*)u^0E z|2d=|6?MA?l|xhdX$6coq1dGt9`i)WdvS8)se4CkBT@ue-~p+>OB!vHMm*ZVV+4smAw^O?9op5(h4MeMLJo67}z>r!v3W(|_V6CR_bNE`*)}Uf| zwRXlpDT(d`jY@91SP32RkIb*Ji;BmYrEXv&QLEoZ+>#%HKB9E_<_C+Gw5Mr!K{MZ^ z?R@%ne0V$mDVI06o48f++e3xTe-)fswQujEO-_O z>Q?%JO4`)h^^kk{t{lPI#WV2XUjU~nO;BU#%&MS;!JAQRg&|sS(XsVUYNp`*6dILG z)93Id>8BeyIv=$4?2Gz^uZ2>2JhV(@_CJN9pDBA)((5%l4@q{DbZ(1Ex7PebO6ngp z-n6KClp{A$OEhjdChf2%k016wka0XwHB-aMLWR=Skp9(4CZQcKSr`yR4?pi!Sq$wd z{W>+`wT31h+G^5Ddo9^x3dhC1h|Xd`a}}Lkyc+ZdO+y{nJ8-ZsXkdSarXi#=sk&O^bI}>3e-nbu4O**WqSI+jsyAzB z3TS6iIe?+0N7SWlw(wIuVMG`COriLsN%YF7#|kBFEmWt1eo=^kH%%GovV9rNYTBlx zMdlEtagB6ZUEgI1Jh42?C_`;FftR7iDuRw{ghvB8LO~!riFj*?Fz!+y-n2ousOSN| zC9L(*dCg+o*>`ZX1qo3JxnL!|vuK`5#m~7N#n-7|f?kDKn-#I={bSO+(b6Xnc$yE_ zc}TNzmE3=1v_%NT>$Fb6fm(!E`5!1WHVYLHG0VD%Glpu)HKyDqgm&pQP)(K&spnT% zqKAhg3IOpY!#Py=wPrB}H2ndsqRFVLW?}4B!K^84!>U>R+6{1*^tKvYkoK!)3zqZ) z17TH*c$gV~54UKf>;EBjRx52o^HwpZRgggn>02}EW9w-hWU$t(mhM-r=(eO6d;J|J zpq5pgo#ca-hhLIDFPfscm|HF_^oj)Fa7?>$`3=UHBbWH{$UE$w0ZbaMPK6jbo zmn6G|3IxMQWkkzXT&9IdOe;VCZocH(COu|2KIVA}0a!%;5w~TUA?7N6GR;D#C@yzb zq1G6A3T~Kb5*@H9KnE)P5&lccZ{Xvf?UOFF^Yb05Fg{9RJbhQlqAK3?(V(S&=d>cT zH6mOD?UwOI{c~}b|6&BsmlTuu-ZkBadNp$8;sgx;5U47Iw?)tQr=rUhvm23;v6`6# zQwNSRXuEhojqsSU80ZkuF;_JpQpElh%6BMVO;d|#&p*W%LNBiOUtpq4oqsM)`-X7H zQuK2Mvrf#K3`n`trWubERvIe!!XPaZa~HM2XyhUIU-2{Me&VryhI^Jc>-Y6^ z<3?_WzJ^oLoDr&3s1V)fMmg?nq=ykOR%q}-5mOm-_PGnbxGVgba0Jt;?V!#-=DR^g zEoKDb`MD^0aEDXyo7OExX+qcVT+BFp!mklwaSnQ;F(5GtA%QGz`n?wqAb#UND$HAG z#{Pd_@F_DX#Xpjk3?S=7o%_{GJf!%T9`I*MsZFdee)K=S)kr@NAsWmGBHcwyTqN)b z?ciWzYT=bWVeT2W4k9`(En}k4E+z`&9%<4oMGdN$!7wJ-#wAa;w7gr$3lA)lhJ(_$ zUmCL@FRU6>8lya5gX1Ss28Al#g>w-ls3HIOK^@@7Psl}t!W&bC|GGDeAmoRrsQh)W zu$rWQz<&VrUDPy?_Qt#L))J8%sFDphn9=pS9K;|ZNM!~L5>SFvJ1RRlL?=vvF=Q~@ z0OrH$lC|*0%)JF4Eg4Zu=XY|0r2{=7b8ayPFxjBWxT&_BiZy~5tSDJg#mQXZL?B$@ zaFkJ+n7oR~sd(p0%8TYj8HxD=&!>h(7UwlkU+8NoQoK^h0h|fNyJ%5#id+uYOFvre@ z@qk=JAL0X-Sc7f&t`&9L;`b#0MKp*dhN-*V#^j#5w(JAq5?wkh3{}4saaeI2IBfU_U7nlE&-<)M@#(rrsbtsMjU!7h1Or##W@ z8Ekd-d;Ftb�NOk|C@T>wOt!OKkGqZ@IW#5v#&A7H-HY81EEqcf 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

  • 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

    cZngq!j$kLbfR>S!f=$ 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�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

    L~q_cSC;-(VajQ~CxV^`T&!P{ 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�|89e_aDiVEp1Q9F+*IAW^(s$aexS564Lr^AC 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/cusdr3.png b/Source/res/img/cusdr3.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ba633962dc15a445081b8d764d1e537e705d1b GIT binary patch literal 1331 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/cusdrLogo.png b/Source/res/img/cusdrLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..92135a324d8d15234c75cb44c7187b16ccee0468 GIT binary patch literal 135278 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–R*RirkqP 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

    gsF)Bz_o)inA0X{$#w&xKXcO*zjJPRU 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/down_arrow.png b/Source/res/img/down_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..83dce263c3863e285cf0b4c4140a51725e1b0556 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^{2KAtX)Ar*73Uf3zvz`)^h@vn38 z6t~Qhw#L5ijT0XqdoQf;w>Ts;Ui!hiwTBaC-sEKPRC{SC@p8%g=9zlGv?4C|+Ob(z h?dz!cdd=UAVdZ)8BIEQ;d_Z#b|fr3Sz zE{-7;bCS1g+?aTP&1I>mk1vn7UW|&?f$phiUFMkuGREmxbzW4{THCO0vPbSRwKkt8 zna&^8J#Pv8Qwf#6GCw85*wipZ$^Z7D*6tZ6E~{xBIQ{3zPj90wh6V-(6PNckHZ}@Q m%8Rf6!6UBJcJ{yl28KGGIU2X;>zDy;XYh3Ob6Mw<&;$T~OF}9D literal 0 HcmV?d00001 diff --git a/Source/res/img/hide.png b/Source/res/img/hide.png new file mode 100644 index 0000000000000000000000000000000000000000..9c85ed4e0b5241829ca243fac60ee7114b0813b8 GIT binary patch literal 435 zcmV;k0ZjghP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0Z2(iK~y+Tl~O@V z0znvkGupbHDi8$eP%aoN9XfT#9({&xGbQ+}5xQe8+QYphcE-MGwuRV0Ty`)aZ zlPP}aV&(@*jwkM~-YLl0`9+faHJibYDN(DPqTPN;o-^@rH)BeqSV-@*j4sj`3jsm} ztJM<}3;4 literal 0 HcmV?d00001 diff --git a/Source/res/img/hide_high.png b/Source/res/img/hide_high.png new file mode 100644 index 0000000000000000000000000000000000000000..c062a8abfe7076b5f7eaf97e439ec841e797bd86 GIT binary patch literal 394 zcmV;50d@X~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0Ut?3K~y+TW2~>Q z|F5a3$?)>!O9olfIJpFe*x{Q2_- z&IU35{{0J9!^Fe{W-~5ZzWo2)yLXAT6s(SegM)#Yg@u8!xVYp$OlL?)FoT7K1x|xb zoH)U-X3bi-Jkz`P9~oen80(SMGX@3)!)^Zl;|Ie}Acldq))t1U>KZto9q3$6Acg@( zRdwzEGBPq4mQI<}2N%o9E5eX}^5h8vql|(Q+-8`Hom)3!D0cVu#SmjuRMW!H3{$mb z{b~lEz)+k)!NkVK#()chbm5a{!WY7zgo6*@)l4Yr7}a$QaQc~$W+p8)Wd;^jHmvwR o10zm3kUp@@AO@-6+O4|`0Pb#W2f^kw_y7O^07*qoM6N<$f)ur?cK`qY literal 0 HcmV?d00001 diff --git a/Source/res/img/hpsdr4.png b/Source/res/img/hpsdr4.png new file mode 100644 index 0000000000000000000000000000000000000000..9d8397744fb89e7e4dbf0a1c2b0553f5cb3cc04d GIT binary patch literal 24878 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 (Ga1xVi%)%bbp6uts>CgoFFyB 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%0A`u|>6ZcE*B?>& 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/left.png b/Source/res/img/left.png new file mode 100644 index 0000000000000000000000000000000000000000..83afbf1ffb98b031b9501d7faf86a35900be464b GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^96&6}!3HF&-PfN3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBj({-ZRBb+KprEg(i(`mJaB@mQ!Vh`L`G-EdxR}g#?0$S> z49A4fYYbhsDG5!S3f_l886^u?|3~hec=Tb;4yHAmPN?y4va%d*EQ;spoUp`3hNDV& bx+ufvNRivqZ>!k?4QB9k^>bP0l+XkK83Z>< literal 0 HcmV?d00001 diff --git a/Source/res/img/leftBottom.png b/Source/res/img/leftBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b42f5f7eacc90e0cfb661d0708fc2153227aa1 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^96&6=!3HFc-`pbrq!^2X+?^QKos)S9a~60+7BevL9RXp+soH$fK*2Ci7sn6_|KyZ}gdg&f^ACOa@s3wPm@#Fl z=>Zuvkw6tbkHd@I`31TDZ7xa<~eNiCOl6J5ae;sTdO4(Bs_ kZFSpA%*r}9AA8+psP_=w_+f$hS)dIJp00i_>zopr0MBnap8x;= literal 0 HcmV?d00001 diff --git a/Source/res/img/leftMiddle.png b/Source/res/img/leftMiddle.png new file mode 100644 index 0000000000000000000000000000000000000000..1f47f5912cf364cefdf90acf7243c56a4c676ce2 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmSN`?>!lvI6<0o-U3d z8o|ja2?;;sCFdXd@Zw@J+p+ucjWHY(La#M!cI5gOZN2ON_Kh149#9B%4re@(uE4`^ X-5@pVgV-TApaBe?u6{1-oD!MY<@Cl9a)|2==I_bSH@rkF6EB}|d2ylj@1m23=;o^b9ld2`JcXas|&tDnm{r-UW| Dc*rk9 literal 0 HcmV?d00001 diff --git a/Source/res/img/left_arrow.png b/Source/res/img/left_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..329fb230df5f2398a3ab26593e56421599666a28 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{P^M z#W6%9I5|P$&V&E|{~xguSTQBys=!j0m2KLpYosDI)uiuA^YZeZ=xT^bX*hcMgj5HY o@D8>`AmzPgg&ebxsLQ0GP))Q2+n{ literal 0 HcmV?d00001 diff --git a/Source/res/img/maximize.png b/Source/res/img/maximize.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc9e425a9f1547202f578a80b06e45f6e33bf68 GIT binary patch literal 417 zcmV;S0bc%zP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0X9iQK~y+Tos!E+ z!$1^<|Cvrh-XIXN5Cs(xQ85c~p?wwc1*E=*;M&X1ZbWe%B)V`FQ4j^8WEZG$QIjB) z+;swmB-2IPfgjF%^Pe+kE~MK%%5{AUuIpmbp(qM0>j}g#j9gV!1VMl-%Me9TQ6mgP zBuP@nJV?{D@K8#Nm|XUHxoz8%Zd&+cSw@R75Z?AwnH4h|e*3lDPG=WuJ9|RC*T;L9 z=0lBB&l{quWqtea+@T=On_l+z{sB$X%8F4GsGNM&Ss3yI(>- z@Gg{>?ufVHJkISAr75yW}b$Mc9bH=pa98&fx6J-^@=OAMR>JO1#=00000 LNkvXXu0mjfSmCsU literal 0 HcmV?d00001 diff --git a/Source/res/img/maximize_high.png b/Source/res/img/maximize_high.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5d64b42a176046a8828b941021de8c95c3f173 GIT binary patch literal 398 zcmV;90df9`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0V7F7K~y+TV=OK% z`EP1!!tnCtO9oClfIJpFe*x{Q2_- z&IU35{{0J9!^Fe{W-~5ZzWo2)yLXAT6s(SegM)#Yg@u6;Y_UPniJ zhS->B4D%K*S<0|~|3MUS#=xLp6q^?=UV_sh@v$)|ax7P_-e8cCkwFo3c67!tVDJ9D z3?Dvzfr~$R@`Qm=MnMV1=AHYGFt|I~U}(lB&cw>b!GMfGy3oZyd~D)OY;0@{$QYyu zT@1v>CeDKHzJ)WVGOXLY4a32v290QFIBRSvNN2mk;807*qoM6N<$g5+wcO8@`> literal 0 HcmV?d00001 diff --git a/Source/res/img/minimize.png b/Source/res/img/minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..6a39d90fdc34f4903af9f1740911257ecee8195a GIT binary patch literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0f=X~GCoy++B+jXaN9H~?a-NI_MA|8JM6OBgeHk%Fkd>*x0 z4YDlL9+D(MQ501ZQLR>~hhA}FUfIw-k`3Q z`_99+;nl1fIK7|&fr%5)BKiL2P002ovPDHLkV1g&u*O34K literal 0 HcmV?d00001 diff --git a/Source/res/img/minimize_high.png b/Source/res/img/minimize_high.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc7a0a46906604553568b2837747140ccbad2ff GIT binary patch literal 467 zcmV;^0WAKBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0cc4?K~y+TV=OK% z`EP1!!tnCtO9oClfIJpFe*x{Q2_- z&IU35{{0J9!^Fe{W-~5ZzWo2)yLXAT6s(SegM)#Yg@u6;YRy?(x4 z3;_WF7;+mnY+%^5c^g=qF)%0?tIdw?-a!BV#L!%vlfe)a90Jj-s;>QCMn(qA2@4Hm z$VgAe&@g%O6owr;c7VlKtXR(A9~jE;F0}O*CxOw<6FtRv^4O7pA)17D%r;ie7WRQ<;4I1002ov JPDHLkV1g&cz_S1V literal 0 HcmV?d00001 diff --git a/Source/res/img/record.png b/Source/res/img/record.png new file mode 100644 index 0000000000000000000000000000000000000000..e7493aad92f4ba1bcaa0c32fd14aaed5674abb63 GIT binary patch literal 670 zcmV;P0%84$P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igM? z4+1YxdT7f400JIKL_t(o!`+v^ZWBQe#(#TfAxlYd;0`1E8c6HH5>QdNbm4TN<25J{ zufP)koe@Z&NRS7JD2xyV9f2VE!XF_Aq&txR5OmH^cn=JS+ugH~B}V!RpLf6cZf0(0 zR*49!G>;Wq$!3vK%8Aq^swEre?RNXe?^dhz%m1}njcT<@xm;#E9@FV`P)ga05RqJD zYmSfqMD~0#`O080AWc(xy`D9had5MpJua3x7)Q&oic?=DaCXu zh=5;G0T61`fj}=yfCC@`qS0`eJlfge^469y6;=Y$RPakG1U7+7b0X#iL>jxm_GmbY z*4Nj}wO~~P&=9yG(3e@{^U&988PV4KLoDm&<74j zL7?{}@-sb-C!taqiL3M9MQmy==c72BE4ZR&cmvG#NMFrHCD4+w15G_$aR8+w3f+CC@UQU-vfNhPWVD4x8XI#a);iApR z*lqu1JGOa2tEu>XEYGVaRW|il4J5ClcM;*4<&0$gPr}hR*f?!BlAXVBF?sr=XEmZ* z33wX|Uq;}2;3R9d zXTr}%!sBNzxO(k6XU}c8eMJUXrC^b(*TO~k-`|eE15@~ZBSeaL!~g&Q07*qoM6N<$ Ef+of#;s5{u literal 0 HcmV?d00001 diff --git a/Source/res/img/right - Kopie.png b/Source/res/img/right - Kopie.png new file mode 100644 index 0000000000000000000000000000000000000000..85c64287681ea06f4995f6e0f84f436daaa3c199 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^>>xG=6Oeqh`tc(mrRwS87*a7O*~Dyn#rJn>H_f^> sT|ZtzLSl)E>h-k|hmJJx_Sgh6?2qDFVdQ&MBb@0GaO`CjbBd literal 0 HcmV?d00001 diff --git a/Source/res/img/right.png b/Source/res/img/right.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb1d39ea6ed43865b00777bdfb8544e835a582a GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^96&6}!2~3~s9MYfQk(@Ik;M!Qd`Cc-ajG_-G*HmV z)5S5QVovgwvXZHjC)d|}XJh6$p_Q!@Z_(b#DEcS;X`8_XRf+ogqk4?&F4C>R?4qh3 n<$8Xdj9=Mb3R%?heP?G_VkKaC&b!JSXc~j3tDnm{r-UW|uazff literal 0 HcmV?d00001 diff --git a/Source/res/img/rightBottom.png b/Source/res/img/rightBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..04384a2fe1fbc88aa24396587ea915ae8cb9ead2 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96&6=!3HFc-`pbrq!^2X+?^QKos)S9a~60+7BevL9RXp+soH$fK*3l~7sn6_|Ky$?|DWd>So+`JV+brzSiR=p zhMI>mY|GsH<&r#_vD|*zI0xe?jboFyt=akR{0N++aGXMYp literal 0 HcmV?d00001 diff --git a/Source/res/img/rightMiddle.png b/Source/res/img/rightMiddle.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff3bddcef25e163ee3fc32b88074132b2ff37b8 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmSN`?>!lvI6-wo-U3d z8o|juJ^nw>GqCi(zsC@m@L~Sc*^YjG(-MCkvgF}0Gc)^tapTs-zw1{V`|s?`cw(zU f&l};Ccm{^A%hLR&M=m=JG>5^{)z4*}Q$iB}h*>O< literal 0 HcmV?d00001 diff --git a/Source/res/img/rightTop.png b/Source/res/img/rightTop.png new file mode 100644 index 0000000000000000000000000000000000000000..27177f18ca1d66d57cf21eddfecdaba6bb1181f8 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBptYxqV~9p@a!-%{&+`q;I`J0mjZZHwZs+OQ zzdu=HV(2x7Zo|aOf96k>*6Rsn+@w~eF=6uL^oE@hvzr-}gSZ~AT{*u7Xbgj=tDnm{ Hr-UW|Y^yQ$ literal 0 HcmV?d00001 diff --git a/Source/res/img/right_arrow.png b/Source/res/img/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b9288f36fbcdd8f6b993b2481da37a355f5cbbc8 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{P^M z#W6%9I5|P$&V&E||EpLCteC~ZD{%ElR>SIJ>lh=YCilK;XA5aq!>HkW;CR8+mZ?m> oO)J#AG+j(LdUmdKI;Vst0JAwcBLDyZ literal 0 HcmV?d00001 diff --git a/Source/res/img/settings.png b/Source/res/img/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..12179dc9ab98b30180cab5ec880b923c06858379 GIT binary patch literal 3649 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/splash.psd b/Source/res/img/splash.psd new file mode 100644 index 0000000000000000000000000000000000000000..1390d20b38bc9f2f8c3ff679f68dfe34f63075f9 GIT binary patch literal 300778 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/topBorder2.png b/Source/res/img/topBorder2.png new file mode 100644 index 0000000000000000000000000000000000000000..39632d3c195bac376cab3c1d7c0507e3e1e6847a GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0y~yU{(OKIXKvWBxCyQbs(xZ$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAE+-w_aIoT|+y4HR7O>Eakt5%>1aM&1Js9Lx?UVst)THNRQk zn!;@^!yRFDF~Z}^&iCPM42(=H90Cds4L}BC<2*@L6$afVgka+;b|xehEI~|M9$ry= zNJ4rFWgxv!LmKBaaC@AK5<&=kW#T&VOOyd@0a%fO`h|NRo^4PSgjfm`yP@}i`TQr= V?>D*(l7UWV@O1TaS?83{1OOc(MScJP literal 0 HcmV?d00001 diff --git a/Source/res/img/up_arrow.png b/Source/res/img/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e66a2a93a331aeb559bf5f2f4d4cb1832ac847ec GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^{2E}kxqAr*73p5D#Npupqo=pLuD zINdmSiDOGVr{3D?1KN+jOif7>EW9>}VMjHu+gy`y=5;Sj9<*I+sJ3FUxn#FN`qy76 YjwmgW^cKy(K=T+pUHx3vIVCg!05E|kZ2$lO literal 0 HcmV?d00001 diff --git a/Source/res/img/up_arrow_off.png b/Source/res/img/up_arrow_off.png new file mode 100644 index 0000000000000000000000000000000000000000..7a863b22051a210a6a765c8409494fae21115c89 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^{2R(5|M&{j%i!ti=d#Wzp$Pz&b|!!T literal 0 HcmV?d00001 diff --git a/Source/res/img/upd-error.png b/Source/res/img/upd-error.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea1fabcd34ba02474e0fb5f2c50c2a1d1bf836c GIT binary patch literal 1089 zcmYLI4NOy46h7@M4=63zf}=yA-6RNpu>b^F&nx$Dec0f zfJ`we)g>@AW>aR6AqhWOg(9FGP5~WL=b$Zg?P!aXU};NB-`*>Zo#ft=^YeY@oO^QX zJ{0FL=}~k5V2W~udkDRbJV7XNa~E+8fEFYYX6`-SR4lnnh5*Nlg^@jTZTmc#x$zc$ z!&xeVAb|)n81`bzd~A@q;#S@<>q_ZS$7*ub2K&>Zr|v82@uY&p>^Bm#%27&D09p_# zRvyZb3uH1`i{Y6&oYCJhsn~?u4_vZMbyr}^uPR9;63KC6oK2ShtE~RQcW>3Go8Lpi z2NkGN*U$0co_iYY(2zzma@RhuQz-9UYe-3ZS8c6%bo+ez=N_K&6$^%8hMrAVyFVED zU6nPUIce}!KV~o#@>K24+JR=beVC7;uN9!#yFOJaGWyE@@;EBjhup_zGZa4WDg|Uh zA5I;6KlTLebsjrrV;rm)Cm}2$1&}wBLHA?=d^WRRlQ!um<76J0PvS@(LU5cm(7^;2 z=j-v&>K*Q!%=WF&n8=X7bNOsSGOyP-RdJ@#B-1}X{|j0i(XsdFi2C-`kK$FQIKv0O zIg;NL7R_hs14$ZxN3?&Ckc2n}9h|0V@HrO1bwdS=T^R7vgb>P&19l7#mLA@Lmz^#C z@>J&%goZ`HBLe4l`1k2vvThq3&F6A_eJ4ij^UotuLX`W%Eu0IVTuaUUsZ5a8U)gMU zadJCalrFBN9O_T;Vp7aSz=+)=$bWMMYj_da<2&PjJ_aG(p9OYzu^-pgKA73as&87f zmA@UlKm4?~m3dK+F6{G7XAS+3*UCJ7rmaq7E2p?9YeP|)u7yd1We!{(FDzQjz$^I@ zlJ^{h*{&bq;l8bYP1>ZNjFWi=iw#KJ+EAHs=f38F-89vfzZ>V?5OF!ZNnrh;i&zg&nL#r(UD|C^{XSMyZ|V(S&BZWgoH=Eij_slKG7 zR3dSWYJSsd?FKVf8F^$X)hl;e%9B0Tl;#=T7n+x3apK2HOG{OlRBDtE=h^kaq{^8s zhyR>YM0d60o%A~qbpoHfUF%x8#IibrzrTp9-OhPk4NeI0|H#!490+t?FJ$!QnKgt7 MqHMA7<_<~Kze42RM*si- literal 0 HcmV?d00001 diff --git a/Source/res/img/upd-info.png b/Source/res/img/upd-info.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c5d239ab10b9aa23d76a036993fb2fb2ccddfc GIT binary patch literal 955 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~cksaSW-Lla#OkB*pOmf0B#% zg!!fW!sflKp2BfipLfQM+4VW*a{nI3d^0$^K{D1Btg1=+fc@jH&6cNkhfbQK9l?`pJIyth>Kto^Ad2#~8|udlJYck08-@9TNejF@;l^`7wr$?)*R|NE2tASpR@!o-QG0Ybu0 zKpMKHPMzA^*x1Mj_5y<=!@mDaGLw#0iLx^Z35ZKE{QJ+q@aD%~hUZ`ZFzBc%F|e?( zFj#1-g83kEkUYPbBm+o2NFT^OKmZIg!GE7Mr%d;s@bLZq|2+Ep|0OlBo;tWZUQ%Ue zgv7bMKM#KRb6TGb2-^Ph@bIkh>EZcPvxn!<{QIr<(i2uNL(F*i`=4KPbMUN(Z?DVq z+^_rJ+Mf6QS8&0$30-`1&YnGW=D@j=M-P1e+sDQX1Q0Dh|30=p{C)m@$+)_|hdw+$ zU%%r}tmVFfZMRRYE-+)~R&KU99p84}exI=c5I~&TB=O;`^x@m`K0Nd5{vDhaCNXdS zf0p#mn>HJKC{*Bqs7b0kf1>XD>)Fpw)!%551S)X5z@Vq7*QOtT&uCA2%Kp;_4jh1} z3^}97#h}3BaIwE|#@_#?WeXZJH?Xot`LMm_UcZy4H?xFqx0qa~d)>j!vEAnsmp?QT zdB6k?uqt(h`(NHX-tIqV{d?mV-9<(P#(xrj{Qqp-#rVG-mg0i+zw8cg z?!RxhS9n5xQbIxk#9DCFfnt$?qxZPG;*IT_4V)w%iHQ3k3iFH$7+lHZNIjlDOHLNe|KZrdvpID_aTwLPeiKzhXy=5k#5=C_y6oZ|Nnn~f1lUb`0)6DAb>c4 YnPIY!=F9-uOTHk!r>mdKI;Vst0Nr)Dl>h($ literal 0 HcmV?d00001 diff --git a/Source/res/img/upd-warning.png b/Source/res/img/upd-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..3cde5d0b9f67066ce55c6abc7cb16365f27aed74 GIT binary patch literal 853 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV3zT8aSW-Lla#OkB*pOmf6@`v z!nbpN{_&3&RsQ!k`RRkl`?fnCf0ChKRti;cNUh@aq`bG&<=r?xecC1C<(0*=|DPm# zjCH!5{Ol-*qC*A`PWlRdv4A=upS^PecSv{p(~ zRMr_<>{ypNA!Nqk5C8A0vn3{mwVjWDI!7*cx=SG|Ov_*ORz9;bL%z6o=Xw7Bt8MK5 z|Nnn;WA|TMX8rX7hgX+NeVzbyOOy1653^d{t=@i$bI~Fhp8ERzNk6`S7mv9(-~PVj zzdv<{6|_Fhe|TA3bMo!!B8L)-AU*)<`m*$oOPHA)o7uB;9{YX!6My{ttbO>l`Ev=N zrh^|o9~Ww52AD%4!={Ca-qMN~yVc&ly5c~E;DVJw2MI8kN{xf|4 z_MGASkFN||oIe>@nEx~U`uU9E$B)lov9DjAF$fC$VR-*hME&w9#axhHAOJ>QVnRZ~ zjym@;DSmTvX70MVruN(9hmWVnv9VSPw!Ob^=lJ&b@dJl`O>hiwXnJ@| zcBUFz+waMY5JPs>c&WX*Qdt)&yY@ZLeEWOJKYo7~XI55LKD^xDUebm+4QSrKbc^Z` zd8rxyB_$;H8+`b*!O*7Sgm%HF1wq14LyBUzOq|_4_2K#Tzd<3Anvl@2B+u~Tf1Vzm z{}TWHrziaQ_0>3N2axgm^909+_?Zt+m0q-g`lIqskMGed9aA4ZZeI?Jvj2{rD!a{2 z8zwN@*V&{Chy|rp{Armk54K6=m?2k#1CQ&$>3sZZ`b5i|C3E_oMi_G*u`rV*Q$T~_&#aA{mh#iqT1PSMD3do b2?u5dR$eaKA9=RlK#uZs^>bP0l+XkK9G8d^ literal 0 HcmV?d00001 diff --git a/Source/res/img/warn.png b/Source/res/img/warn.png new file mode 100644 index 0000000000000000000000000000000000000000..26a212e827df4873fea5605fe2531ac2cc9085bd GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYh#0(@Ejy=)_k~{%EA+A7r=FFM@|1}%WQW4jCaU<_x1(BA->t6(|_oy1RPMs83;5=7!LG`Y{7n|K%rtozp%yZ<_ zo3wxD`u$6L{yqL|CGoyl#4dwBZG)vT8}Z2>f@V&?78NO%y*gyyti1jF70mfJbhDv4A=upS^PecSv{p(~ zRMr_<>{ypNA!Nqk5C8A0vn3{mwVjWDI!7*cx=SG|Ov_*ORz9;bL%z6o=Xw7Bt8MK5 z|Nnn;WA|TMX8rX7hgX+NeVzbyOOy1653^d{t=@i$bI~Fhp8ERzNk6`S7mv9(-~PVj zzdv<{6|_Fhe|TA3bMo!!B8L)-AU*)<`m*$oOPHA)o7uB;9{YX!6My{ttbO>l`Ev=N zrh^|o9~Ww52AD%4!={Ca-qMN~yVc&ly5c~E;DVJw2MI8kN{xf|4 z_MGASkFN||oIe>@nEx~U`uU9E$B)lov9DjAF$fC$VR-*hME&w9#axhHAOJ>QVnRZ~ zjym@;DSmTvX70MVruN(9hmWVnv9VSPw!Ob^=lJ&b@dJl`O>hiwXnJ@| zcBUFz+waMY5JPs>c&WX*Qdt)&yY@ZLeEWOJKYo7~XI55LKD^xDUebm+4QSrKbc^Z` zd8rxyB_$;H8+`b*!O*7Sgm%HF1wq14LyBUzOq|_4_2K#Tzd<3Anvl@2B+u~Tf1Vzm z{}TWHrziaQ_0>3N2axgm^909+_?Zt+m0q-g`lIqskMGed9aA4ZZeI?Jvj2{rD!a{2 z8zwN@*V&{Chy|rp{Armk54K6=m?2k#1CQ&$>3sZZ`b5i|C3E_oMi_G*u`rV*Q$T~_&#aA{mh#iqT1PSMD3do b2?u5dR$eaKA9=RlK#uZs^>bP0l+XkK9G8d^ literal 0 HcmV?d00001 diff --git a/Source/res/img/warningMediumIcon.png b/Source/res/img/warningMediumIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..6a92f67074961f81d2483c5011fa7d623ac2625d GIT binary patch literal 592 zcmV-W0Px%3Q0skR5;6>P~A(DaTI>ucN3&=AF-gjy6rL$AtbAg}sXp)Hkc)HPo=AkRNY_y_T@*PdP-SCdx!mzcbn@_^H>vCbwj@-KgFjk^kVPg`s z8pU!?J36+#g~tQWqmVvCsYa`uyH1qSt+4@p+goVee)vn%j!%?5MeyDzXniictxOZRF*oJ(DCfAl88!vDp+y%k4_llY(( zYh-%Mc)^%pJZB^wc3t|#7;>`h_bo(i*s^$vp3l1!GW`WT)G&<)4onb1ihUY@9p>roPX;H ePxyOx;m}v5@J_s~q7&f&0000 + +static const unsigned char qt_resource_data[] = { + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/drawer.png + 0x0,0x0,0x0,0xc0, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x13,0x0,0x0,0x0,0xd,0x8,0x2,0x0,0x0,0x0,0xc4,0xee,0xc2,0x70, + 0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4, + 0x1,0x95,0x2b,0xe,0x1b,0x0,0x0,0x0,0x72,0x49,0x44,0x41,0x54,0x78,0x9c,0x63, + 0xb4,0xb1,0xb1,0x61,0xc0,0x6,0x44,0xa5,0x15,0x4c,0x4d,0xc,0x17,0x2e,0x5c,0x24, + 0x2a,0xc0,0x8b,0x95,0xcd,0x44,0x9e,0x36,0x51,0x1,0x5e,0x2c,0x3a,0x89,0xd1,0x26, + 0x2a,0xad,0x80,0xae,0x93,0x48,0x6d,0xa6,0x26,0x86,0x4c,0xe4,0x69,0x43,0xf1,0x27, + 0x49,0xda,0x10,0xfe,0x24,0x55,0x1b,0xd4,0x9f,0x64,0x68,0x33,0x35,0x31,0x64,0x22, + 0x4f,0xdb,0xc2,0x85,0x8b,0x98,0xc8,0xd3,0x26,0x2a,0xc0,0xcb,0xfc,0xe4,0xf9,0x4b, + 0x32,0xb4,0x31,0x30,0x30,0x30,0x91,0xa7,0x8d,0x81,0x81,0x81,0x11,0x92,0x6e,0x5f, + 0x7f,0xf8,0xc,0x17,0x22,0x86,0xcd,0xc0,0xc0,0x0,0x0,0x7e,0xc,0x9c,0x28,0xdb, + 0x9f,0x2c,0x36,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/close.png + 0x0,0x0,0x1,0x99, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x2,0x0,0x0,0x0,0xb4,0xb4,0x2,0x1d, + 0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4, + 0x1,0x95,0x2b,0xe,0x1b,0x0,0x0,0x1,0x4b,0x49,0x44,0x41,0x54,0x78,0x9c,0x8d, + 0x8c,0xd1,0x4a,0xc2,0x60,0x1c,0xc5,0xcf,0xbe,0x7d,0x2e,0xcb,0x1b,0x85,0xcd,0x75, + 0x31,0x8,0xb1,0x1c,0x4b,0x6b,0x5d,0xc6,0xae,0xa2,0x10,0xba,0xb6,0x27,0x30,0xe8, + 0x11,0x7a,0xa,0x1f,0xa2,0x27,0xc8,0xeb,0x50,0xda,0xa5,0x44,0x24,0x34,0x48,0x47, + 0x60,0x78,0x23,0x12,0x6e,0xe8,0x8a,0xca,0x6c,0x6b,0x74,0xa1,0x7c,0xad,0x28,0xf4, + 0xf0,0xbf,0x39,0xbf,0x73,0xfe,0x87,0x2b,0x1f,0x9f,0x14,0x8b,0xfb,0xce,0x60,0x80, + 0x79,0xba,0xb5,0xee,0xb8,0x7a,0xbd,0x9e,0x17,0x37,0x10,0x7c,0x0,0x21,0x82,0x9, + 0x0,0xf8,0x13,0x84,0x3e,0x0,0xf8,0xef,0x0,0x10,0x6,0x8,0x43,0x4,0x2f,0xad, + 0x78,0x92,0x3a,0xae,0x8b,0x87,0xeb,0xb9,0xc3,0x58,0x4a,0x38,0xf1,0x80,0x36,0x6f, + 0x9a,0x7b,0xd2,0xdb,0xfc,0x36,0xd0,0x74,0x7a,0x74,0x38,0x7a,0x2,0xe7,0xce,0x40, + 0xa5,0x8a,0xd3,0xd2,0x8f,0x4a,0x84,0xc,0x47,0x22,0xf5,0xbc,0x21,0xc2,0xc7,0xa9, + 0xb7,0xd,0x4d,0x6b,0xd8,0xdf,0xf,0x95,0xaa,0x6d,0x68,0x9a,0x9a,0x9a,0x3a,0xef, + 0x99,0x70,0x6a,0x61,0xe7,0x32,0xf3,0xca,0xb6,0xee,0x5d,0x5e,0x6b,0xd8,0x28,0x1b, + 0x38,0x6b,0xd8,0x86,0xa6,0x8a,0x9f,0x2c,0x3a,0xe8,0x26,0x28,0x80,0x7e,0xbb,0xcb, + 0x90,0xba,0x99,0xb1,0x74,0x45,0xb7,0x7a,0x96,0xae,0x6c,0xad,0xad,0x44,0x23,0x2c, + 0x17,0x28,0x0,0x42,0x9,0x23,0xfd,0x76,0x57,0xef,0xf8,0x17,0x49,0x7a,0xe8,0x5, + 0xbd,0xf5,0x58,0x34,0x2,0x40,0x0,0xf0,0x3c,0x61,0xa7,0x74,0xfc,0x9a,0x18,0xdb, + 0x5e,0xe5,0x6b,0x62,0x4c,0xe9,0xf8,0xd1,0x68,0xd6,0x66,0x92,0x5b,0x63,0x53,0x12, + 0x74,0x99,0xf2,0x3c,0xd1,0x65,0x6a,0x4a,0x82,0xdc,0x1a,0xff,0xde,0x66,0x32,0x25, + 0x21,0x9f,0xe6,0x99,0xcd,0xa7,0x79,0x53,0x12,0xfe,0x6d,0x47,0xab,0x7f,0x12,0x92, + 0xca,0x65,0x9,0xc7,0x2d,0x72,0xa9,0x5c,0x96,0x3,0xb0,0x5b,0x3a,0xc2,0x2,0xba, + 0xaa,0x9e,0x7f,0x1,0x93,0xf4,0x70,0x7a,0xbe,0xa3,0x9a,0x2e,0x0,0x0,0x0,0x0, + 0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/leftMiddle.png + 0x0,0x0,0x0,0x7e, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x8,0x8,0x6,0x0,0x0,0x0,0xc4,0xf,0xbe,0x8b, + 0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5, + 0x0,0x0,0x0,0x35,0x49,0x44,0x41,0x54,0x28,0x53,0x63,0x64,0x60,0x60,0xf8,0x1f, + 0x19,0x9f,0xc2,0xf0,0xe8,0xd1,0x63,0x6,0xc6,0xdf,0x5f,0x81,0x5c,0x8,0x90,0x55, + 0xd6,0x80,0xb3,0x41,0xa,0xfe,0x5b,0x3b,0xba,0xff,0xb7,0xb1,0xb1,0xc1,0xc0,0x20, + 0x55,0x43,0x57,0x1,0xc8,0x67,0x20,0xc,0x0,0xd7,0x30,0x65,0x6a,0xf0,0x16,0xc2, + 0x46,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/maximize.png + 0x0,0x0,0x1,0xa1, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x36,0x49,0x44,0x41,0x54,0x38,0x4f,0x9d,0x92,0xcb,0x4a, + 0xc3,0x40,0x14,0x86,0xff,0x99,0x4e,0x43,0xde,0x20,0x10,0xb2,0x10,0x5,0x15,0x11, + 0x51,0x31,0xb,0x71,0xa1,0x7d,0x15,0xf1,0x5,0xa4,0xbe,0x87,0xe0,0xda,0xcb,0xce, + 0x6e,0x44,0x71,0x1d,0x24,0xba,0x70,0x15,0x51,0x10,0x5,0xa1,0x64,0x17,0xa8,0x71, + 0x51,0x93,0x20,0x94,0xdc,0x75,0x2,0x86,0x24,0xd3,0x45,0xdb,0x81,0x1f,0xce,0x7c, + 0xf3,0x9f,0x33,0x67,0x2e,0xa4,0xdb,0x3d,0xca,0x75,0x7d,0xb,0xae,0xeb,0x62,0xd2, + 0xa1,0x28,0xa,0x2c,0xeb,0x9,0xc4,0x30,0x8c,0x5c,0x55,0x55,0x4,0x41,0x80,0x2c, + 0xcb,0x10,0x45,0x51,0x51,0x23,0xc,0x43,0x24,0x49,0x52,0xc6,0x3c,0x48,0xd3,0xb4, + 0xf0,0x50,0x4a,0x8b,0x98,0x5c,0xf6,0x7a,0xb9,0x6d,0xdb,0x93,0x6e,0x5a,0xf8,0x64, + 0x59,0x46,0x8b,0x31,0x10,0xde,0xf6,0x54,0x99,0x15,0x33,0x1b,0x7e,0xfb,0xb5,0xdc, + 0x4e,0x67,0x17,0x6b,0x3b,0x7b,0x42,0xbd,0xd7,0xc7,0x7b,0x98,0xe6,0x43,0x8d,0x53, + 0xcf,0x1b,0xa2,0xaa,0x65,0x7d,0xfb,0xef,0xdc,0xa1,0x20,0xce,0x9b,0x5e,0xf6,0xf6, + 0xfe,0x1,0x4d,0xd3,0xca,0x8a,0x51,0x14,0xe3,0xf0,0x60,0x5f,0xd8,0xf9,0xf8,0xf4, + 0x1c,0x9e,0xff,0x53,0x72,0xc7,0x71,0xc0,0x46,0xe1,0x8,0x7d,0xbb,0x5f,0x42,0x3f, + 0xf0,0x31,0xf8,0xfa,0x14,0x92,0x39,0xaf,0xfa,0xb8,0x81,0xb6,0x25,0x19,0x55,0xd1, + 0x16,0xab,0xcd,0xff,0xd7,0xc6,0x71,0x2a,0x49,0x12,0xaa,0xe2,0x15,0x9b,0x8c,0xcf, + 0xc7,0x71,0xd6,0xec,0xcf,0xbc,0xbd,0xc6,0xc9,0xd9,0x85,0xd0,0xf6,0xdd,0xcd,0x95, + 0xc0,0xc8,0xd2,0xea,0xfa,0xcc,0xef,0x4c,0x67,0xfd,0x20,0xc5,0x85,0xad,0x2c,0x2e, + 0x80,0xb5,0xa5,0x52,0x39,0x8,0xe2,0x38,0x11,0xc4,0x79,0xd5,0xc7,0xf3,0x88,0x36, + 0x37,0x9f,0xeb,0x9b,0x1b,0x53,0x37,0x60,0x3d,0xbf,0xe0,0x17,0x4b,0xc,0x9c,0x2, + 0x3b,0xfe,0xf0,0xc9,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/cuSDR_32.ico + 0x0,0x0,0x10,0xbe, + 0x0, + 0x0,0x1,0x0,0x1,0x0,0x20,0x20,0x0,0x0,0x1,0x0,0x20,0x0,0xa8,0x10,0x0, + 0x0,0x16,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x40,0x0,0x0, + 0x0,0x1,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf7,0xf6,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf6,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf6,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf8,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf8,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xef,0xea,0x4, + 0x68,0xef,0xea,0x4,0x68,0xef,0xea,0x4,0x68,0xef,0xea,0x4,0x68,0xef,0xeb,0x4, + 0x68,0xf0,0xeb,0x4,0x68,0xf0,0xeb,0x4,0x68,0xf0,0xeb,0x4,0x68,0xf0,0xec,0x4, + 0x68,0xf0,0xec,0x4,0x68,0xf0,0xec,0x3,0x68,0xf0,0xec,0x3,0x68,0xf0,0xec,0x3, + 0x68,0xf1,0xed,0x3,0x68,0xf1,0xec,0x3,0x68,0xf1,0xec,0x3,0x68,0xf1,0xed,0x3, + 0x68,0xf1,0xee,0x3,0x68,0xf1,0xed,0x3,0x68,0xf1,0xed,0x3,0x68,0xf2,0xed,0x3, + 0x68,0xf2,0xee,0x3,0x68,0xf2,0xee,0x3,0x68,0xf2,0xee,0x3,0x68,0xf2,0xee,0x2, + 0x68,0xf2,0xef,0x2,0x68,0xf2,0xef,0x2,0x68,0xf3,0xef,0x2,0x68,0xf3,0xef,0x2, + 0x68,0xf3,0xf0,0x2,0x68,0xf2,0xf0,0x2,0x68,0xf2,0xf0,0x2,0x68,0xe1,0xd4,0xb, + 0x68,0xe2,0xd4,0xb,0x68,0xe2,0xd4,0xb,0x68,0xe2,0xd4,0xb,0x68,0xe2,0xd5,0xa, + 0x68,0xe2,0xd5,0xa,0x68,0xe2,0xd5,0xa,0x68,0xe2,0xd5,0xa,0x68,0xe3,0xd5,0xa, + 0x68,0xe3,0xd6,0xa,0x68,0xe3,0xd6,0xa,0x68,0xe3,0xd6,0xa,0x68,0xe3,0xd6,0xa, + 0x68,0xe3,0xd6,0xa,0x68,0xe4,0xd7,0xa,0x68,0xe4,0xd7,0xa,0x68,0xe3,0xd7,0xa, + 0x68,0xe4,0xd8,0xa,0x68,0xe4,0xd8,0xa,0x68,0xe4,0xd8,0x9,0x68,0xe4,0xd8,0x9, + 0x68,0xe4,0xd9,0x9,0x68,0xe4,0xd9,0x9,0x68,0xe5,0xd9,0x9,0x68,0xe5,0xd9,0x9, + 0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x8, + 0x68,0xe6,0xda,0x9,0x68,0xe6,0xdb,0x9,0x68,0xe6,0xdb,0x8,0x68,0xd4,0xbd,0x11, + 0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbe,0x11, + 0x68,0xd5,0xbf,0x11,0x68,0xd5,0xbf,0x11,0x68,0xd5,0xbf,0x11,0x68,0xd6,0xbf,0x11, + 0x68,0xd6,0xbf,0x11,0x68,0xd6,0xc0,0x11,0x68,0xd6,0xc0,0x10,0x68,0xd6,0xc0,0x10, + 0x68,0xd6,0xc1,0x10,0x68,0xd6,0xc1,0x10,0x68,0xd7,0xc1,0x10,0x68,0xd7,0xc1,0x10, + 0x68,0xd7,0xc2,0x10,0x68,0xd7,0xc2,0x10,0x68,0xd7,0xc2,0x10,0x68,0xd7,0xc2,0x10, + 0x68,0xd8,0xc2,0x10,0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc3,0x10, + 0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc4,0xf,0x68,0xd8,0xc4,0xf,0x68,0xd9,0xc4,0xf, + 0x68,0xd9,0xc4,0xf,0x68,0xd8,0xc4,0xf,0x68,0xd9,0xc5,0xf,0x68,0xc7,0xa8,0x18, + 0x68,0xc7,0xa9,0x18,0x68,0xc7,0xa9,0x18,0x67,0xc8,0xa9,0x18,0x67,0xc8,0xa9,0x18, + 0x67,0xc8,0xa9,0x18,0x67,0xc8,0xaa,0x18,0x67,0xc8,0xaa,0x18,0x67,0xc9,0xaa,0x18, + 0x68,0xc8,0xaa,0x18,0x68,0xc8,0xab,0x18,0x68,0xc9,0xab,0x18,0x67,0xc9,0xab,0x18, + 0x67,0xc9,0xab,0x17,0x67,0xc9,0xab,0x18,0x67,0xc9,0xac,0x17,0x68,0xc9,0xac,0x17, + 0x68,0xc9,0xac,0x17,0x68,0xca,0xac,0x17,0x68,0xca,0xad,0x17,0x68,0xca,0xad,0x17, + 0x67,0xca,0xac,0x17,0x68,0xca,0xac,0x17,0x68,0xca,0xad,0x17,0x67,0xcb,0xad,0x17, + 0x67,0xca,0xae,0x17,0x67,0xcb,0xae,0x17,0x67,0xcb,0xae,0x17,0x68,0xcb,0xae,0x17, + 0x68,0xcb,0xae,0x16,0x67,0xcb,0xaf,0x16,0x68,0xcc,0xaf,0x16,0x68,0xbc,0x94,0x1e, + 0x68,0xbc,0x94,0x1e,0x67,0xbc,0x94,0x1e,0x68,0xbc,0x94,0x1e,0x69,0xbc,0x96,0x1f, + 0x6a,0xbc,0x95,0x1e,0x6a,0xbc,0x95,0x1e,0x69,0xbc,0x95,0x1e,0x68,0xbd,0x96,0x1e, + 0x68,0xbd,0x96,0x1e,0x68,0xbd,0x95,0x1e,0x67,0xbd,0x96,0x1e,0x69,0xbd,0x96,0x1e, + 0x6a,0xbd,0x96,0x1d,0x69,0xbd,0x96,0x1e,0x69,0xbe,0x97,0x1d,0x68,0xbe,0x97,0x1d, + 0x68,0xbe,0x97,0x1d,0x67,0xbe,0x98,0x1d,0x67,0xbe,0x97,0x1d,0x68,0xbe,0x98,0x1d, + 0x69,0xbf,0x9a,0x1e,0x6b,0xbf,0x99,0x1e,0x6a,0xbe,0x98,0x1d,0x69,0xbf,0x99,0x1d, + 0x68,0xbf,0x99,0x1d,0x68,0xbf,0x99,0x1d,0x6a,0xbf,0x9a,0x1e,0x6b,0xbf,0x9b,0x1e, + 0x6b,0xbf,0x9a,0x1c,0x69,0xbf,0x9a,0x1d,0x67,0xc0,0x9a,0x1c,0x67,0xaf,0x80,0x24, + 0x67,0xb0,0x80,0x25,0x68,0xb3,0x84,0x26,0x6d,0xb8,0x8a,0x29,0x76,0xbc,0x8e,0x2c, + 0x7d,0xbc,0x8e,0x2b,0x7d,0xb9,0x8b,0x2a,0x77,0xb6,0x87,0x27,0x70,0xb2,0x83,0x25, + 0x6b,0xb1,0x82,0x24,0x69,0xb2,0x84,0x25,0x6b,0xb8,0x89,0x28,0x73,0xba,0x8d,0x2a, + 0x77,0xb8,0x8a,0x28,0x74,0xb5,0x87,0x26,0x6f,0xb3,0x85,0x24,0x6b,0xb1,0x84,0x24, + 0x69,0xb1,0x84,0x23,0x68,0xb2,0x83,0x23,0x68,0xb3,0x85,0x24,0x6a,0xba,0x8c,0x28, + 0x75,0xc1,0x93,0x2d,0x83,0xc1,0x94,0x2d,0x82,0xb9,0x8c,0x27,0x74,0xb3,0x86,0x24, + 0x6a,0xb4,0x87,0x24,0x6c,0xbb,0x8f,0x29,0x77,0xc2,0x95,0x2d,0x84,0xc1,0x95,0x2d, + 0x83,0xba,0x8e,0x27,0x74,0xb4,0x87,0x22,0x6a,0xb3,0x87,0x22,0x68,0xa4,0x6d,0x2a, + 0x67,0xa6,0x6f,0x2b,0x6b,0xb6,0x81,0x32,0x83,0xc3,0x92,0x3a,0xa6,0xc8,0x97,0x3a, + 0xb8,0xc9,0x97,0x3a,0xb8,0xc6,0x94,0x3a,0xad,0xc0,0x8d,0x37,0x9a,0xb7,0x84,0x33, + 0x86,0xb0,0x7b,0x2f,0x78,0xb3,0x7f,0x30,0x7f,0xc0,0x8f,0x37,0x9b,0xc6,0x94,0x3a, + 0xad,0xc4,0x93,0x39,0xa6,0xbf,0x8d,0x37,0x96,0xb8,0x84,0x33,0x86,0xb1,0x7c,0x2f, + 0x79,0xaa,0x74,0x2b,0x6e,0xa6,0x71,0x2a,0x6a,0xad,0x79,0x2d,0x72,0xbf,0x8d,0x36, + 0x95,0xcb,0x9a,0x3c,0xbc,0xca,0x9a,0x3b,0xba,0xbf,0x8d,0x35,0x94,0xb2,0x7d,0x2f, + 0x78,0xb6,0x84,0x31,0x82,0xc4,0x94,0x38,0xa3,0xcc,0x9c,0x3b,0xc0,0xcb,0x9c,0x3c, + 0xbb,0xbe,0x8c,0x34,0x90,0xac,0x78,0x2b,0x6f,0xa8,0x72,0x29,0x68,0x98,0x5e,0x2b, + 0x67,0x9f,0x66,0x2e,0x70,0xbc,0x88,0x3a,0xa4,0xca,0x98,0x3e,0xda,0xe0,0xc1,0x85, + 0xf2,0xdc,0xb9,0x75,0xf2,0xcd,0x9b,0x3e,0xe9,0xc9,0x97,0x3a,0xdb,0xc6,0x93,0x3e, + 0xc3,0xbd,0x8a,0x3b,0xa8,0xbe,0x8c,0x3b,0xac,0xc9,0x96,0x3c,0xd1,0xd4,0xa8,0x58, + 0xea,0xca,0x96,0x34,0xe5,0xca,0x97,0x3a,0xd8,0xc7,0x95,0x3e,0xc6,0xc0,0x8c,0x3c, + 0xac,0xb3,0x7f,0x36,0x90,0xa9,0x71,0x31,0x7b,0xac,0x75,0x33,0x80,0xc2,0x8f,0x3b, + 0xb4,0xd5,0xaa,0x5a,0xe8,0xd7,0xb0,0x65,0xea,0xc5,0x93,0x3e,0xbe,0xbb,0x87,0x39, + 0x9e,0xc2,0x8f,0x3d,0xb4,0xcc,0x99,0x3d,0xdb,0xe2,0xc5,0x8d,0xf4,0xcd,0x9c,0x3f, + 0xdf,0xbe,0x8a,0x3a,0xa5,0xa5,0x6c,0x30,0x73,0x9c,0x62,0x2d,0x68,0x8e,0x55,0x27, + 0x67,0x97,0x5f,0x2a,0x71,0xb9,0x86,0x37,0xaf,0xd1,0xa9,0x5e,0xe9,0xf7,0xf0,0xe4, + 0xfe,0xf6,0xef,0xe0,0xfe,0xfb,0xf8,0xf2,0xff,0xf0,0xe3,0xc8,0xfd,0xd7,0xb3,0x6e, + 0xf2,0xc6,0x95,0x3a,0xe1,0xc7,0x97,0x3f,0xdf,0xce,0xa0,0x4a,0xf1,0xff,0xff,0xff, + 0xff,0xf9,0xf3,0xe9,0xff,0xef,0xe0,0xc2,0xfc,0xdc,0xbb,0x7c,0xf5,0xcc,0x9e,0x4a, + 0xe6,0xc2,0x91,0x39,0xcc,0xb9,0x86,0x39,0xab,0xb3,0x7f,0x36,0x9c,0xc1,0x8e,0x39, + 0xc3,0xd8,0xb2,0x6e,0xf3,0xe5,0xcc,0x9d,0xfb,0xc9,0x98,0x3e,0xe5,0xc6,0x95,0x3e, + 0xd6,0xca,0x9a,0x40,0xe6,0xe6,0xcd,0x9e,0xf9,0xed,0xde,0xc0,0xfb,0xc7,0x96,0x3e, + 0xda,0xb3,0x81,0x36,0x9d,0x9a,0x62,0x2b,0x71,0x91,0x58,0x28,0x67,0x83,0x4d,0x23, + 0x67,0x8a,0x54,0x26,0x6d,0xa9,0x77,0x32,0x99,0xbb,0x8c,0x3a,0xc7,0xc4,0x95,0x40, + 0xe3,0xc8,0x9a,0x42,0xf3,0xcb,0x9e,0x45,0xfd,0xd2,0xab,0x61,0xff,0xfa,0xf5,0xee, + 0xfe,0xee,0xdf,0xc2,0xfd,0xc8,0x99,0x40,0xfa,0xc6,0x95,0x37,0xfd,0xf9,0xf5,0xed, + 0xff,0xd6,0xb1,0x6c,0xff,0xd5,0xb0,0x6a,0xff,0xf2,0xe7,0xd3,0xff,0xfd,0xfc,0xfa, + 0xfe,0xda,0xbd,0x82,0xf7,0xc1,0x90,0x36,0xe2,0xbe,0x8e,0x3b,0xcb,0xc0,0x91,0x3c, + 0xd5,0xca,0x9e,0x48,0xf3,0xf6,0xee,0xdf,0xff,0xc5,0x93,0x34,0xf9,0xc7,0x97,0x3c, + 0xf7,0xf4,0xeb,0xda,0xfd,0xe5,0xce,0xa3,0xfd,0xc4,0x94,0x3b,0xe6,0xb7,0x86,0x39, + 0xb7,0x9f,0x6a,0x2e,0x83,0x8a,0x54,0x25,0x6c,0x87,0x50,0x25,0x68,0x79,0x45,0x1f, + 0x67,0x7b,0x46,0x20,0x69,0x8d,0x5a,0x27,0x7c,0xa5,0x74,0x31,0x9f,0xb7,0x88,0x38, + 0xca,0xc0,0x92,0x3c,0xec,0xc2,0x92,0x35,0xfb,0xc4,0x95,0x3b,0xff,0xcd,0xa6,0x58, + 0xff,0xff,0xff,0xff,0xff,0xdd,0xc2,0x8d,0xfe,0xc2,0x92,0x35,0xfd,0xdf,0xc4,0x93, + 0xfe,0xe3,0xcd,0xa3,0xff,0xc4,0x95,0x3b,0xfc,0xc0,0x8f,0x32,0xf5,0xcd,0xa8,0x61, + 0xf5,0xee,0xe3,0xcc,0xfd,0xef,0xe3,0xcb,0xfc,0xc2,0x94,0x3e,0xf0,0xc2,0x93,0x3d, + 0xed,0xc4,0x97,0x40,0xf7,0xf5,0xed,0xdf,0xfe,0xe5,0xcf,0xa7,0xff,0xfb,0xf8,0xf1, + 0xff,0xdd,0xc2,0x8e,0xfe,0xc3,0x94,0x39,0xf8,0xbd,0x8e,0x3b,0xd8,0xa8,0x78,0x32, + 0xa1,0x8d,0x59,0x27,0x79,0x7f,0x49,0x20,0x6a,0x7d,0x47,0x20,0x68,0x6e,0x3b,0x1a, + 0x67,0x6f,0x3c,0x1b,0x69,0x81,0x50,0x22,0x79,0xa3,0x73,0x30,0xa7,0xb7,0x89,0x38, + 0xdb,0xc5,0x9c,0x50,0xf6,0xed,0xe0,0xc7,0xfe,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfe, + 0xff,0xfc,0xfa,0xf7,0xff,0xc7,0x9e,0x51,0xfa,0xbf,0x91,0x3b,0xf5,0xc2,0x97,0x43, + 0xfa,0xfb,0xf8,0xf3,0xff,0xbc,0x8e,0x34,0xf7,0xba,0x8c,0x3a,0xe1,0xb7,0x89,0x39, + 0xd8,0xbc,0x8d,0x37,0xeb,0xdd,0xc4,0x96,0xfc,0xf1,0xe7,0xd5,0xfe,0xbd,0x8f,0x35, + 0xfb,0xc0,0x92,0x3c,0xfd,0xe0,0xc9,0x9e,0xfe,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, + 0xff,0xf0,0xe5,0xd1,0xff,0xc6,0x9c,0x4c,0xfb,0xbc,0x8e,0x3b,0xe8,0xaf,0x80,0x35, + 0xbf,0x99,0x69,0x2c,0x93,0x7f,0x4c,0x22,0x74,0x72,0x3e,0x1c,0x68,0x65,0x33,0x17, + 0x67,0x67,0x36,0x18,0x69,0x86,0x55,0x24,0x86,0xaa,0x7d,0x33,0xc4,0xd3,0xb8,0x85, + 0xf4,0xff,0xff,0xff,0xff,0xda,0xc2,0x94,0xff,0xcb,0xa8,0x66,0xff,0xc5,0x9f,0x55, + 0xff,0xbc,0x8f,0x39,0xfc,0xb8,0x8b,0x38,0xee,0xb4,0x87,0x38,0xdd,0xb9,0x8c,0x3a, + 0xed,0xf4,0xec,0xde,0xfe,0xd7,0xbd,0x8b,0xfa,0xb3,0x86,0x34,0xe0,0xae,0x81,0x35, + 0xcd,0xb4,0x87,0x37,0xdf,0xba,0x8c,0x37,0xf7,0xfb,0xf9,0xf6,0xff,0xd0,0xaf,0x72, + 0xfe,0xbd,0x90,0x3b,0xff,0xc2,0x98,0x48,0xff,0xff,0xff,0xff,0xff,0xcb,0xa8,0x64, + 0xff,0xd8,0xbe,0x8d,0xfe,0xfa,0xf7,0xf2,0xff,0xec,0xdf,0xc7,0xfc,0xbc,0x92,0x46, + 0xeb,0xaa,0x7c,0x32,0xc3,0x8c,0x5c,0x27,0x8b,0x67,0x36,0x18,0x68,0x61,0x30,0x15, + 0x67,0x64,0x33,0x17,0x6a,0x86,0x57,0x24,0x8a,0xaa,0x7d,0x33,0xcb,0xe5,0xd5,0xb8, + 0xf9,0xf3,0xeb,0xdd,0xff,0xbc,0x91,0x3e,0xff,0xbb,0x8d,0x39,0xff,0xba,0x8c,0x36, + 0xff,0xd0,0xb2,0x78,0xfc,0xb5,0x89,0x39,0xe7,0xab,0x7e,0x34,0xcb,0xb2,0x85,0x36, + 0xdf,0xde,0xca,0xa4,0xfb,0xfb,0xf7,0xf1,0xfe,0xbd,0x93,0x46,0xf4,0xb6,0x8b,0x3d, + 0xe9,0xb9,0x8d,0x3d,0xef,0xc1,0x99,0x4d,0xfb,0xfd,0xfc,0xfa,0xff,0xd0,0xb2,0x78, + 0xfe,0xbb,0x8e,0x3b,0xfe,0xbc,0x90,0x3b,0xfe,0xed,0xe2,0xcd,0xff,0xe2,0xd0,0xab, + 0xff,0xb8,0x8a,0x32,0xff,0xb8,0x89,0x2f,0xff,0xeb,0xdf,0xc6,0xfe,0xfe,0xfd,0xfc, + 0xff,0xb6,0x8a,0x3f,0xe0,0x96,0x68,0x2b,0xa0,0x63,0x32,0x16,0x68,0x5d,0x2d,0x14, + 0x67,0x5f,0x2f,0x15,0x69,0x79,0x4b,0x1f,0x7f,0x9f,0x72,0x2f,0xb5,0xb7,0x8d,0x42, + 0xe6,0xe7,0xd7,0xbb,0xfc,0xfb,0xf8,0xf3,0xff,0xf0,0xe6,0xd4,0xff,0xf0,0xe6,0xd3, + 0xff,0xf7,0xf2,0xe9,0xfe,0xb4,0x89,0x3d,0xe3,0xa4,0x77,0x31,0xbe,0xab,0x7e,0x34, + 0xcf,0xd1,0xb6,0x85,0xf5,0xff,0xff,0xff,0xff,0xfb,0xf9,0xf5,0xff,0xf7,0xf1,0xe8, + 0xfe,0xf7,0xf2,0xe9,0xff,0xf8,0xf3,0xeb,0xff,0xd5,0xbb,0x8b,0xf9,0xb6,0x8a,0x39, + 0xf1,0xb8,0x8c,0x3b,0xf4,0xed,0xe2,0xcd,0xfe,0xfe,0xfe,0xfd,0xff,0xff,0xff,0xff, + 0xff,0xef,0xe5,0xd3,0xff,0xf1,0xe8,0xd7,0xff,0xfb,0xf9,0xf4,0xff,0xf6,0xf1,0xe8, + 0xfe,0xb4,0x89,0x3f,0xdf,0x94,0x65,0x29,0x9e,0x60,0x2f,0x15,0x68,0x5a,0x2b,0x12, + 0x67,0x5a,0x2a,0x12,0x68,0x66,0x36,0x17,0x70,0x84,0x56,0x24,0x8c,0x9f,0x72,0x2f, + 0xb9,0xaa,0x7c,0x2c,0xd9,0xb6,0x8c,0x41,0xea,0xce,0xb1,0x7e,0xf4,0xdd,0xcb,0xa9, + 0xf7,0xc2,0xa0,0x63,0xec,0xa6,0x7a,0x31,0xc8,0x91,0x63,0x2a,0x9f,0x98,0x6b,0x2c, + 0xaa,0xa8,0x7a,0x2c,0xd3,0xbd,0x98,0x55,0xec,0xb9,0x90,0x47,0xed,0xbe,0x99,0x55, + 0xed,0xb8,0x8f,0x46,0xea,0xab,0x7c,0x28,0xe2,0xa8,0x7c,0x2f,0xd1,0xa4,0x77,0x31, + 0xc1,0xa8,0x7c,0x33,0xcc,0xaf,0x81,0x31,0xe3,0xca,0xab,0x73,0xf2,0xda,0xc5,0x9e, + 0xf6,0xdd,0xcb,0xa7,0xf8,0xd7,0xc0,0x95,0xf6,0xc4,0xa1,0x63,0xf0,0xab,0x7c,0x29, + 0xe0,0xa2,0x75,0x30,0xbc,0x80,0x52,0x22,0x89,0x5b,0x2b,0x13,0x68,0x57,0x28,0x11, + 0x67,0x57,0x28,0x12,0x68,0x59,0x29,0x12,0x69,0x63,0x34,0x16,0x71,0x78,0x4a,0x1e, + 0x83,0x8c,0x5f,0x27,0x9b,0x99,0x6c,0x2c,0xb0,0x9f,0x72,0x2e,0xbd,0xa1,0x74,0x2e, + 0xc1,0x9c,0x6f,0x2c,0xb6,0x8a,0x5c,0x26,0x97,0x70,0x41,0x1b,0x7b,0x74,0x46,0x1d, + 0x7f,0x8c,0x5e,0x26,0x9a,0x99,0x6c,0x2c,0xaf,0x9a,0x6d,0x2d,0xb3,0x98,0x6c,0x2b, + 0xb0,0x97,0x6a,0x2b,0xac,0x91,0x64,0x29,0xa2,0x85,0x57,0x24,0x90,0x7a,0x4c,0x1f, + 0x84,0x83,0x55,0x24,0x8f,0x95,0x68,0x2b,0xa8,0x9f,0x72,0x2d,0xba,0xa2,0x75,0x2f, + 0xc2,0xa3,0x76,0x2f,0xc4,0xa1,0x74,0x2e,0xc1,0x9d,0x70,0x2d,0xb7,0x92,0x66,0x29, + 0xa4,0x7e,0x51,0x21,0x88,0x65,0x36,0x17,0x71,0x58,0x29,0x12,0x67,0x54,0x25,0x10, + 0x68,0x54,0x25,0x10,0x68,0x54,0x25,0x10,0x68,0x54,0x25,0x10,0x68,0x59,0x2a,0x12, + 0x6b,0x64,0x36,0x17,0x74,0x72,0x44,0x1d,0x7f,0x7b,0x4e,0x20,0x89,0x7d,0x50,0x21, + 0x8b,0x76,0x48,0x1e,0x83,0x67,0x39,0x17,0x75,0x5c,0x2d,0x13,0x6d,0x5e,0x2f,0x14, + 0x6f,0x67,0x39,0x18,0x76,0x6e,0x40,0x1b,0x7b,0x6f,0x41,0x1b,0x7d,0x6f,0x41,0x1b, + 0x7c,0x6c,0x3e,0x1a,0x7a,0x65,0x37,0x17,0x74,0x5c,0x2e,0x14,0x6e,0x59,0x2a,0x12, + 0x6b,0x5d,0x2f,0x13,0x6e,0x68,0x3a,0x18,0x76,0x71,0x43,0x1c,0x7e,0x76,0x48,0x1e, + 0x83,0x77,0x49,0x1e,0x84,0x75,0x47,0x1d,0x82,0x6f,0x41,0x1b,0x7c,0x66,0x37,0x17, + 0x75,0x5c,0x2d,0x13,0x6d,0x56,0x27,0x11,0x69,0x55,0x26,0x10,0x68,0x51,0x23,0xf, + 0x68,0x51,0x22,0xf,0x68,0x51,0x23,0xf,0x68,0x51,0x23,0xf,0x67,0x55,0x27,0x11, + 0x6b,0x6b,0x3d,0x19,0x7b,0x83,0x56,0x24,0x95,0x8e,0x61,0x28,0xa4,0x8d,0x61,0x28, + 0xa3,0x84,0x57,0x24,0x96,0x76,0x49,0x1e,0x86,0x72,0x45,0x1d,0x82,0x7b,0x4e,0x20, + 0x8b,0x7c,0x4f,0x20,0x8c,0x75,0x48,0x1e,0x85,0x78,0x4b,0x1e,0x88,0x7f,0x52,0x22, + 0x90,0x78,0x4b,0x1f,0x88,0x62,0x34,0x16,0x74,0x54,0x25,0x10,0x6a,0x51,0x22,0xe, + 0x67,0x52,0x23,0x10,0x69,0x52,0x23,0x10,0x69,0x54,0x25,0x10,0x6a,0x55,0x26,0x10, + 0x6b,0x55,0x26,0x11,0x6b,0x54,0x26,0x10,0x6a,0x53,0x24,0x10,0x6a,0x52,0x24,0x10, + 0x69,0x52,0x23,0x10,0x68,0x52,0x23,0xf,0x68,0x52,0x23,0x10,0x67,0x4e,0x1f,0xd, + 0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xd,0x67,0x4e,0x20,0xe,0x68,0x5d,0x30,0x13, + 0x73,0x86,0x59,0x24,0x9b,0xa2,0x76,0x2d,0xce,0xaa,0x81,0x3c,0xe3,0xaa,0x7e,0x33, + 0xe2,0xa5,0x79,0x2d,0xd6,0x9e,0x73,0x2e,0xc5,0x9d,0x71,0x2e,0xc1,0xa1,0x76,0x2c, + 0xcd,0xa2,0x75,0x2c,0xcd,0x9e,0x72,0x2e,0xc3,0x9f,0x73,0x2f,0xc6,0xa3,0x76,0x2d, + 0xd0,0x9a,0x6e,0x2d,0xbc,0x78,0x4c,0x1f,0x8b,0x55,0x28,0x11,0x6d,0x4e,0x1f,0xe, + 0x68,0x4d,0x1f,0xd,0x67,0x4e,0x20,0xe,0x67,0x4e,0x1f,0xe,0x67,0x4e,0x20,0xe, + 0x68,0x4e,0x20,0xe,0x68,0x4e,0x20,0xd,0x68,0x4e,0x20,0xe,0x67,0x4f,0x20,0xe, + 0x67,0x4e,0x21,0xe,0x67,0x4f,0x20,0xe,0x68,0x4e,0x20,0xe,0x68,0x49,0x1c,0xc, + 0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc,0x67,0x4b,0x1e,0xc,0x69,0x61,0x34,0x16, + 0x78,0x91,0x65,0x29,0xaf,0xac,0x88,0x50,0xeb,0xb5,0xa4,0xa1,0xff,0xb5,0x9e,0x8f, + 0xff,0xb3,0x98,0x79,0xfc,0xae,0x86,0x3d,0xf4,0xae,0x83,0x33,0xf2,0xb1,0x94,0x6a, + 0xf9,0xb2,0x96,0x75,0xfb,0xae,0x84,0x36,0xf3,0xae,0x83,0x32,0xf3,0xb2,0x94,0x6d, + 0xfa,0xa7,0x7e,0x38,0xdd,0x84,0x59,0x24,0x9c,0x57,0x2a,0x11,0x71,0x4b,0x1d,0xc, + 0x68,0x4a,0x1d,0xc,0x68,0x4a,0x1d,0xc,0x68,0x4a,0x1d,0xc,0x68,0x4b,0x1d,0xc, + 0x68,0x4b,0x1d,0xc,0x68,0x4a,0x1d,0xc,0x68,0x4a,0x1d,0xc,0x68,0x4a,0x1d,0xc, + 0x68,0x4b,0x1d,0xc,0x68,0x4a,0x1d,0xc,0x68,0x4b,0x1d,0xc,0x68,0x46,0x1a,0xb, + 0x68,0x46,0x19,0xb,0x68,0x46,0x1a,0xb,0x67,0x47,0x1b,0xb,0x69,0x5b,0x2e,0x13, + 0x76,0x89,0x5e,0x26,0xa7,0xa7,0x7d,0x34,0xe3,0xb2,0x9b,0x86,0xfe,0xb0,0x89,0x42, + 0xff,0xb0,0x87,0x39,0xff,0xb1,0x8c,0x4e,0xff,0xb0,0x87,0x3a,0xfe,0xb3,0xa2,0x9d, + 0xff,0xb1,0x90,0x5c,0xff,0xb2,0x9d,0x8d,0xfe,0xb0,0x85,0x35,0xfe,0xb2,0x9a,0x84, + 0xfe,0xa8,0x7e,0x38,0xe4,0x87,0x5b,0x25,0xa3,0x57,0x2a,0x11,0x73,0x48,0x1a,0xb, + 0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb, + 0x68,0x47,0x1b,0xb,0x68,0x47,0x1a,0xb,0x68,0x47,0x1b,0xb,0x68,0x47,0x1b,0xb, + 0x68,0x47,0x1a,0xb,0x68,0x48,0x1a,0xb,0x68,0x48,0x1b,0xb,0x68,0x43,0x17,0x9, + 0x68,0x43,0x17,0x9,0x68,0x43,0x17,0x9,0x67,0x44,0x17,0x9,0x68,0x4c,0x20,0xd, + 0x6d,0x71,0x46,0x1c,0x8b,0x97,0x6c,0x2c,0xc1,0xa9,0x7f,0x37,0xeb,0xb1,0x9b,0x8d, + 0xfd,0xaf,0x8c,0x54,0xff,0xaf,0x86,0x3a,0xff,0xaf,0x83,0x31,0xff,0xb1,0x9d,0x91, + 0xff,0xb0,0x8b,0x4d,0xfe,0xaf,0x8b,0x4e,0xfe,0xb1,0x9b,0x87,0xff,0xb1,0x9a,0x84, + 0xfe,0xa7,0x7e,0x39,0xe7,0x87,0x5d,0x26,0xa7,0x55,0x29,0x11,0x73,0x44,0x18,0x9, + 0x69,0x44,0x18,0xa,0x67,0x44,0x18,0xa,0x68,0x44,0x17,0x9,0x68,0x44,0x17,0x9, + 0x68,0x44,0x18,0xa,0x68,0x44,0x17,0xa,0x68,0x44,0x18,0xa,0x68,0x44,0x18,0xa, + 0x68,0x44,0x18,0xa,0x68,0x44,0x17,0x9,0x68,0x44,0x18,0xa,0x68,0x40,0x14,0x8, + 0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x8,0x68,0x40,0x15,0x9,0x67,0x41,0x16,0x8, + 0x69,0x51,0x26,0xf,0x73,0x75,0x4a,0x1e,0x92,0x95,0x6a,0x2a,0xc0,0xa5,0x7c,0x35, + 0xe6,0xad,0x8e,0x61,0xf8,0xb0,0x9a,0x89,0xff,0xad,0x88,0x48,0xfc,0xad,0x87,0x47, + 0xfb,0xaf,0x92,0x6c,0xfc,0xab,0x81,0x33,0xf7,0xac,0x89,0x4f,0xf9,0xb0,0x9e,0x96, + 0xff,0xa5,0x7c,0x39,0xe3,0x85,0x5a,0x24,0xa5,0x52,0x27,0xf,0x73,0x41,0x15,0x9, + 0x69,0x41,0x15,0x9,0x67,0x41,0x15,0x9,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9, + 0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9, + 0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9,0x68,0x3d,0x11,0x7, + 0x68,0x3d,0x12,0x7,0x68,0x3d,0x11,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x7, + 0x68,0x3f,0x14,0x8,0x69,0x4d,0x22,0xd,0x72,0x6d,0x42,0x1a,0x8c,0x8b,0x60,0x27, + 0xb1,0x9a,0x6f,0x2a,0xce,0x9e,0x73,0x28,0xda,0x9f,0x74,0x2d,0xda,0x9f,0x74,0x2f, + 0xd9,0x9e,0x72,0x2a,0xd6,0x9b,0x71,0x2e,0xd0,0x9d,0x72,0x2d,0xd4,0x9e,0x73,0x28, + 0xd9,0x95,0x6a,0x2b,0xc4,0x72,0x48,0x1c,0x92,0x48,0x1d,0xc,0x6e,0x3d,0x12,0x7, + 0x68,0x3d,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3d,0x12,0x7,0x68,0x3e,0x12,0x7, + 0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x7, + 0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x39,0xf,0x6, + 0x68,0x3a,0xf,0x6,0x68,0x3a,0xf,0x6,0x68,0x3a,0xf,0x6,0x68,0x39,0xf,0x6, + 0x67,0x3a,0xf,0x6,0x68,0x3b,0x10,0x6,0x69,0x45,0x1a,0xa,0x6f,0x59,0x2e,0x12, + 0x7c,0x6c,0x42,0x1a,0x8e,0x76,0x4c,0x1e,0x98,0x75,0x4a,0x1d,0x97,0x73,0x49,0x1d, + 0x96,0x72,0x48,0x1d,0x94,0x6d,0x43,0x1b,0x8e,0x71,0x46,0x1c,0x92,0x76,0x4c,0x1e, + 0x99,0x6b,0x41,0x1a,0x8c,0x50,0x25,0xf,0x76,0x3c,0x12,0x7,0x6a,0x3a,0x10,0x6, + 0x67,0x3b,0xf,0x6,0x68,0x3a,0x10,0x6,0x68,0x3a,0xf,0x6,0x68,0x3a,0x10,0x6, + 0x68,0x3a,0x10,0x5,0x68,0x3a,0x10,0x6,0x68,0x3a,0x10,0x6,0x68,0x3b,0x10,0x6, + 0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x6,0x68,0x3a,0x10,0x6,0x68,0x35,0xc,0x4, + 0x68,0x37,0xc,0x4,0x68,0x36,0xc,0x4,0x68,0x35,0xc,0x4,0x68,0x36,0xc,0x4, + 0x68,0x36,0xd,0x5,0x67,0x36,0xb,0x4,0x67,0x36,0xc,0x4,0x68,0x3a,0xf,0x5, + 0x6a,0x3e,0x14,0x7,0x6d,0x42,0x18,0x9,0x6f,0x42,0x18,0x9,0x6f,0x41,0x17,0x9, + 0x6f,0x40,0x16,0x9,0x6e,0x3f,0x15,0x7,0x6d,0x41,0x17,0x8,0x6e,0x44,0x19,0xa, + 0x6f,0x3f,0x15,0x8,0x6d,0x39,0xf,0x5,0x6a,0x36,0xc,0x5,0x68,0x37,0xd,0x4, + 0x67,0x36,0xd,0x5,0x68,0x37,0xd,0x4,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5, + 0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x4, + 0x68,0x37,0xc,0x5,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x32,0x9,0x3, + 0x68,0x32,0x9,0x2,0x68,0x32,0xa,0x2,0x68,0x32,0x8,0x2,0x68,0x33,0xa,0x4, + 0x68,0x32,0x9,0x2,0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3,0x67,0x33,0x9,0x3, + 0x67,0x33,0x9,0x4,0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3, + 0x68,0x33,0x9,0x3,0x69,0x32,0x9,0x4,0x67,0x33,0x9,0x3,0x68,0x33,0xa,0x3, + 0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x4,0x67,0x33,0x9,0x2,0x67,0x33,0x9,0x4, + 0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3, + 0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3,0x68,0x33,0xa,0x3,0x68,0x33,0x9,0x3, + 0x68,0x33,0xb,0x3,0x68,0x33,0x9,0x3,0x68,0x33,0xa,0x3,0x68,0x2f,0x6,0x2, + 0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2, + 0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2, + 0x68,0x2f,0x6,0x2,0x67,0x30,0x6,0x2,0x67,0x30,0x6,0x2,0x67,0x2f,0x7,0x2, + 0x67,0x30,0x6,0x2,0x67,0x2f,0x6,0x2,0x68,0x30,0x7,0x2,0x67,0x30,0x7,0x2, + 0x67,0x30,0x7,0x2,0x67,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2, + 0x68,0x30,0x6,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2, + 0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2, + 0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x2c,0x3,0x0, + 0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0, + 0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x0, + 0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x1, + 0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0, + 0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2d,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2c,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2d,0x4,0x1,0x68,0x2d,0x4,0x1,0x68,0x2d,0x4,0x1,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x3,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x3,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2b,0x2,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2b,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xe7,0xc0,0x60,0xf0,0x83,0xc0,0x0,0x20, + 0x3,0xc0,0x0,0x0,0x3,0xc0,0x0,0x0,0x3,0xe0,0x0,0x0,0x7,0xe0,0x0,0x0, + 0x3,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xe0,0x0,0x0,0x1,0xe0,0x0,0x0, + 0x1,0xf0,0x18,0x0,0x3,0xfe,0x3f,0xff,0x1f,0xfc,0x0,0x3f,0xff,0xf8,0x0,0x1f, + 0xff,0xf8,0x0,0x1f,0xff,0xf8,0x0,0x1f,0xff,0xf8,0x0,0x1f,0xff,0xfc,0x0,0x1f, + 0xff,0xfe,0x0,0x1f,0xff,0xff,0x80,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/rightMiddle.png + 0x0,0x0,0x0,0x85, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x8,0x8,0x6,0x0,0x0,0x0,0xc4,0xf,0xbe,0x8b, + 0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5, + 0x0,0x0,0x0,0x3c,0x49,0x44,0x41,0x54,0x28,0x53,0x63,0x8c,0x8c,0x4f,0xf9,0xcf, + 0x0,0x4,0x8f,0xef,0xde,0x0,0x51,0x60,0xf0,0x9f,0x95,0x9b,0x41,0x4e,0x4e,0x96, + 0x61,0xf9,0xc2,0x39,0xc,0xc,0x36,0x36,0x36,0xff,0xd1,0xb1,0xb5,0xa3,0xfb,0x7f, + 0xa8,0xc6,0xff,0x43,0x43,0x1,0xc8,0xb5,0x20,0x8c,0xec,0x13,0x64,0x5f,0x0,0x0, + 0xf5,0xa6,0x66,0x4e,0x97,0x59,0xa6,0xcb,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44, + 0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/rightTop.png + 0x0,0x0,0x0,0xa6, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x8,0x8,0x6,0x0,0x0,0x0,0xc4,0xf,0xbe,0x8b, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x3b,0x49,0x44,0x41,0x54,0x28,0x53,0x63,0x8c,0x8c,0x4f, + 0xf9,0xcf,0x80,0x3,0x2c,0x5f,0x38,0x87,0x81,0xe5,0xd1,0xa3,0x87,0xc,0x8c,0xbf, + 0xbf,0x63,0x28,0x91,0x55,0xd6,0x0,0x8b,0x31,0x61,0xd3,0xfc,0x9f,0x95,0x1b,0x2e, + 0x8c,0x55,0x1,0xb2,0x26,0x7a,0x28,0x90,0x93,0x93,0x67,0x80,0xb9,0x18,0x9b,0x83, + 0x1,0x23,0x52,0xa,0xe3,0xad,0xa9,0x9f,0x7c,0x0,0x0,0x0,0x0,0x49,0x45,0x4e, + 0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/minimize_high.png + 0x0,0x0,0x1,0xd3, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x68,0x49,0x44,0x41,0x54,0x38,0x4f,0x63,0x2c,0x2e,0x2e, + 0xf9,0x6f,0x6a,0x6a,0xc2,0xf0,0xf2,0xe5,0x4b,0x6,0x62,0x81,0xb8,0xb8,0x38,0xc3, + 0xe9,0xd3,0x67,0x18,0x18,0x77,0xef,0xde,0xfd,0x5f,0x4a,0x4a,0x8a,0xe1,0xd3,0xa7, + 0x4f,0xc,0xff,0xfe,0xfd,0x63,0xf8,0xf5,0xeb,0x17,0xd8,0x8c,0x9f,0x3f,0x7f,0x32, + 0xfc,0xf9,0xf3,0x7,0xce,0x6,0x31,0xfe,0xfe,0xfd,0xb,0x56,0xc3,0xc4,0xc4,0x4, + 0x66,0x33,0x2e,0x5b,0xbe,0xfc,0xff,0xdd,0xbb,0x77,0x89,0xb5,0x14,0xac,0x8e,0x83, + 0x83,0x83,0x81,0x99,0x85,0x85,0x81,0x11,0xe4,0x6c,0x92,0x74,0x22,0x29,0x66,0x79, + 0xf7,0xfe,0x23,0x56,0xbd,0x7e,0xbe,0x5e,0xc,0x1,0x1,0x1,0x18,0x72,0x1b,0x36, + 0x6c,0x60,0xd8,0xb4,0x79,0x1b,0x58,0x9c,0x31,0x30,0x28,0x18,0xab,0xcd,0x8e,0xee, + 0xde,0x40,0xff,0xff,0xc4,0xd0,0x5c,0x9c,0x93,0xc1,0x10,0x14,0x1c,0x2,0xd1,0xac, + 0xaa,0xae,0xfd,0x5f,0x46,0x46,0x6,0xcc,0x9,0xb,0xd,0x64,0xc8,0x48,0x4f,0xc7, + 0xd0,0x30,0x79,0xf2,0x14,0x86,0x1d,0x3b,0x76,0x80,0xc5,0x57,0xac,0x58,0xce,0xe0, + 0x1f,0x18,0xca,0xf0,0xe4,0xc9,0x13,0x6,0x46,0x19,0x5,0x25,0xb8,0xcd,0xd7,0x2e, + 0x5d,0xc0,0xe9,0x7d,0x90,0x6,0x10,0xd8,0xb8,0x7e,0x35,0x83,0x96,0x9e,0x1,0x98, + 0xcd,0xc4,0xca,0xc6,0xc1,0x0,0xc3,0x20,0x1,0x15,0xd,0x2d,0xc,0xc,0x12,0xbf, + 0x7d,0xf7,0x36,0x18,0x83,0x0,0x4c,0x3d,0x13,0x1b,0x1b,0x1b,0x3,0xc,0x83,0x24, + 0xb8,0x79,0xf8,0x30,0x30,0xb2,0x38,0x88,0xd,0x53,0xcf,0x84,0xd3,0x9d,0x68,0x12, + 0xa7,0x8f,0x1d,0x62,0x0,0xe1,0xfa,0xc6,0x16,0xb8,0xc,0x5c,0x33,0xb,0x2b,0x1b, + 0x58,0x10,0xd9,0x25,0xc8,0x2e,0x32,0xb5,0xb2,0x63,0xd0,0x33,0x32,0x61,0xd8,0xbc, + 0x65,0x2b,0x3,0x48,0xad,0xb0,0x90,0x30,0x3,0xb,0xcc,0x98,0x3f,0xc0,0x64,0xd9, + 0xda,0xde,0x5,0x36,0x1d,0x1d,0x80,0xc4,0x41,0x1a,0x60,0x16,0xf0,0x70,0x71,0x32, + 0xbc,0x7d,0xf7,0x16,0x92,0xc2,0xb6,0xec,0xdc,0x43,0xac,0xeb,0xe1,0xea,0x7c,0xdc, + 0x5d,0x18,0x18,0xd5,0x75,0xc,0xfe,0x83,0x18,0xa4,0x2,0x90,0x85,0x0,0x1,0x1a, + 0x7c,0xb9,0xe4,0x54,0xe5,0xc5,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42, + 0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/leftBottom.png + 0x0,0x0,0x0,0xc1, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x18,0x8,0x6,0x0,0x0,0x0,0xc7,0xd9,0xbc,0x10, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x56,0x49,0x44,0x41,0x54,0x38,0x4f,0x63,0x64,0x60,0x60, + 0xf8,0x1f,0x19,0x9f,0xc2,0xf0,0xf8,0xee,0xd,0x20,0x13,0x1,0x64,0x95,0x35,0xc0, + 0x1c,0x26,0x14,0x51,0x24,0xe,0x48,0xc3,0xa3,0x47,0xf,0x11,0xa,0xfe,0xb3,0x72, + 0x63,0x55,0xb,0x37,0x81,0xf1,0xf7,0x57,0xc,0x5,0x8c,0xbf,0xbf,0xe3,0xb6,0x2, + 0xa6,0x1a,0xa7,0x1b,0x46,0x15,0xa0,0x6,0xe8,0xd0,0xa,0x28,0x6c,0x9,0xe6,0x3f, + 0x2b,0x27,0x3d,0xd2,0x3,0x23,0x2c,0xd9,0xe3,0x4a,0xdd,0x0,0x7f,0x48,0x13,0xb1, + 0xf0,0xa0,0x37,0xcd,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/left.png + 0x0,0x0,0x0,0xb8, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x15,0x8,0x6,0x0,0x0,0x0,0x7b,0x47,0xaf,0xce, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x4d,0x49,0x44,0x41,0x54,0x28,0x53,0x63,0x64,0x60,0x60, + 0xf8,0x1f,0x19,0x9f,0xc2,0xf0,0xe8,0xd1,0x63,0x6,0xc6,0xdf,0x5f,0x81,0x5c,0x8, + 0x90,0x55,0xd6,0x0,0x8a,0x3d,0x64,0x60,0x82,0x9,0x20,0x4b,0xc2,0x55,0x1,0x19, + 0x70,0x5,0xff,0x59,0xb9,0x91,0xc5,0xe1,0x6c,0xb8,0x2,0xac,0xb2,0xc8,0x26,0xc, + 0x9,0x5,0x4,0xc3,0x81,0x72,0x5f,0xc,0x89,0x90,0xa4,0x3c,0x1c,0x8,0x7a,0x13, + 0x97,0x15,0x0,0xf3,0x59,0x14,0xdb,0x97,0xdb,0x26,0x3d,0x0,0x0,0x0,0x0,0x49, + 0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/hide.png + 0x0,0x0,0x1,0xb3, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x48,0x49,0x44,0x41,0x54,0x38,0x4f,0x95,0x52,0x41,0x4b, + 0x2,0x41,0x18,0x7d,0x33,0xda,0xba,0x9d,0x2a,0x10,0x4,0xe9,0x50,0x2e,0x18,0x2b, + 0x1d,0x3a,0x75,0xd1,0x5f,0x90,0x18,0x54,0xbf,0x43,0x8,0xec,0x10,0x44,0x6c,0x10, + 0x41,0xc7,0xc0,0xff,0x90,0xf7,0x3c,0x7a,0xd5,0x4b,0x3f,0xa0,0x2d,0x73,0xbd,0x7b, + 0xd1,0x75,0x2f,0xb9,0x8b,0xb3,0xdb,0xce,0xc0,0x6c,0x81,0x8d,0xda,0x83,0x7,0x6f, + 0xf7,0xfb,0xde,0xf7,0xe6,0x9b,0x5d,0x62,0x59,0x56,0x64,0x9a,0x26,0x46,0xa3,0x11, + 0xd6,0x45,0x2e,0x97,0x83,0x6d,0xdb,0x20,0x9d,0x4e,0x27,0xca,0xe7,0xf3,0xf0,0x3c, + 0xf,0x61,0x18,0x22,0x8,0x2,0x31,0xc3,0xf7,0x7d,0xcc,0xe7,0xf3,0x44,0x73,0xc1, + 0x18,0x13,0x3d,0x94,0x52,0xa1,0xc9,0x73,0xab,0x15,0x39,0x8e,0xb3,0x6e,0xa8,0xe8, + 0xd3,0x75,0x1d,0xa9,0x74,0x1a,0xa4,0xd1,0xb8,0x8a,0xa4,0xb3,0x52,0x29,0xc3,0x3c, + 0x2e,0x2b,0x7,0xd9,0xaf,0x3d,0x74,0xbb,0xbd,0xa4,0x4e,0xc7,0x93,0x29,0x7e,0xe8, + 0x62,0xe6,0x7,0x4a,0x8e,0x27,0xee,0xaf,0xde,0x29,0xc8,0xd9,0xf9,0x45,0x92,0xfc, + 0x35,0x9b,0xc1,0x8f,0x29,0x51,0xab,0x9d,0xa2,0xdd,0x7e,0x49,0x9e,0x33,0xf1,0x71, + 0x37,0x63,0x4a,0xa4,0x58,0x48,0xef,0xb4,0x8c,0x2e,0xd2,0x18,0xb,0x1,0x42,0x5, + 0xab,0xd5,0x13,0x14,0xc,0x3,0xd9,0x6c,0x16,0x9f,0x83,0xa1,0x78,0xc7,0xeb,0xf2, + 0x64,0x3,0x67,0x8,0xb2,0xbb,0x57,0x48,0x92,0xe5,0xc4,0xcb,0x7a,0x5d,0xc8,0xed, + 0x9d,0x2d,0xb8,0xf1,0x5a,0x1c,0x4f,0xcd,0xe6,0xc2,0x5d,0x90,0xfd,0x62,0x69,0xc1, + 0x2c,0xbb,0x6e,0x6f,0xae,0x71,0xff,0xf0,0xa8,0xbc,0x40,0xaa,0x69,0x1a,0x54,0xe4, + 0xae,0x65,0xf5,0x78,0x41,0x35,0x3e,0xde,0xfb,0x4b,0xbf,0xff,0x52,0xf3,0xaa,0x3f, + 0x87,0x1c,0x1c,0x1e,0x29,0x77,0x5e,0x65,0xa6,0xa5,0xa2,0x81,0xf4,0x86,0xf6,0x27, + 0x23,0x10,0x65,0x8d,0xfb,0x44,0x32,0x17,0xff,0xc5,0x5b,0xdf,0xc1,0x37,0x4b,0x2f, + 0x9a,0x4b,0x30,0xf6,0xb7,0xd4,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42, + 0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/right_arrow.png + 0x0,0x0,0x0,0xc5, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x2,0x0,0x0,0x0,0xb4,0xb4,0x2,0x1d, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,0x26,0x0,0x0,0x80,0x84,0x0,0x0,0xfa, + 0x0,0x0,0x0,0x80,0xe8,0x0,0x0,0x75,0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a, + 0x98,0x0,0x0,0x17,0x70,0x9c,0xba,0x51,0x3c,0x0,0x0,0x0,0x43,0x49,0x44,0x41, + 0x54,0x28,0x53,0x63,0x60,0x18,0xdc,0xe0,0xff,0xff,0xff,0x24,0x38,0x10,0xa8,0x9a, + 0x4,0xd,0x10,0xd5,0xc4,0x6a,0x80,0xab,0xc6,0xae,0x1,0x59,0x1a,0x93,0x8d,0xee, + 0x87,0x6,0x54,0x80,0xac,0x1,0x28,0x43,0xc0,0xc7,0x70,0xd5,0x84,0x95,0x2,0x4d, + 0x82,0xa8,0x26,0x4a,0x29,0x44,0x35,0xb1,0x4a,0x49,0x88,0x17,0x6a,0x2a,0x5,0x0, + 0x91,0xc9,0x67,0x27,0x3c,0x15,0x75,0xd8,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44, + 0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/minimize.png + 0x0,0x0,0x1,0xf3, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x88,0x49,0x44,0x41,0x54,0x38,0x4f,0x95,0x52,0x4b,0x4b, + 0x2,0x51,0x18,0x3d,0x33,0x8e,0x93,0xf9,0xa8,0xa5,0x20,0xee,0x23,0x6a,0x21,0x94, + 0x15,0x84,0x64,0x51,0x48,0x51,0x41,0xb,0xa3,0xbd,0xb4,0xf,0xec,0x87,0xb4,0x69, + 0x15,0xb6,0xa8,0xe8,0xfd,0x0,0x93,0x30,0x8d,0x68,0xd3,0x46,0x5b,0x16,0x5,0x32, + 0xab,0xdc,0x18,0xa8,0xa3,0xf9,0x68,0xc6,0x51,0xf3,0x5e,0x73,0x90,0xc6,0x85,0x1e, + 0x38,0x70,0xe6,0xbb,0xe7,0x7c,0xdf,0xc7,0x9d,0xcb,0xf8,0xfd,0xdb,0x75,0xa7,0x73, + 0x1c,0xa9,0x54,0xa,0xdd,0xc2,0x6a,0xb5,0x22,0x1e,0x7f,0x1,0x13,0x8d,0x46,0xeb, + 0x36,0x9b,0xd,0xf9,0x7c,0x1e,0xb5,0x5a,0xd,0xb2,0x2c,0xd3,0x1e,0x92,0x24,0x41, + 0x51,0x14,0x55,0x13,0x51,0xad,0x56,0xa9,0x87,0x65,0x59,0xaa,0x99,0xe3,0x93,0x93, + 0xba,0x20,0x8,0xdd,0xe,0xa5,0x3e,0x83,0xc1,0x0,0x1d,0xc7,0x81,0x21,0x6b,0xf7, + 0x94,0x6c,0x33,0x73,0x99,0x6c,0xae,0x63,0x76,0x75,0x65,0x9,0xc3,0x13,0xd3,0x9a, + 0xb3,0xf7,0xd8,0x33,0x82,0xb7,0x77,0xb4,0xce,0x89,0x62,0xa6,0x63,0xf8,0xf3,0x2b, + 0xb,0xe1,0xfa,0x4a,0x73,0x36,0xeb,0x59,0x84,0x78,0x78,0xd4,0xc,0xbf,0xbe,0x7d, + 0xc0,0x6e,0xb7,0xd3,0x8f,0x75,0xef,0x1a,0xc6,0xdc,0xb,0x54,0xd7,0xfe,0x2e,0x8b, + 0xe8,0xd8,0x63,0x4,0xe1,0x70,0x98,0xd6,0xa7,0x66,0xdc,0x10,0x73,0x5,0x24,0x93, + 0x49,0xb0,0x65,0xa9,0x8c,0x84,0x90,0xa0,0x1c,0x99,0x74,0xa1,0x58,0x2c,0x51,0x96, + 0x25,0x59,0xa5,0xc3,0x35,0xd7,0xd0,0xa,0x65,0xa5,0xa2,0x50,0x2f,0xc9,0x71,0x7a, + 0xde,0xa0,0xae,0x96,0xfb,0xce,0xc3,0xb7,0xe1,0xd5,0xac,0x1a,0x38,0xbd,0xa0,0x1, + 0x82,0x42,0xb1,0x80,0x56,0x86,0xe5,0x79,0x1e,0x2d,0x32,0xc,0xb,0x93,0x79,0x40, + 0xc3,0xf6,0x7a,0x63,0x9a,0xea,0x67,0xbb,0xfd,0x4d,0x3b,0x7b,0x1,0x10,0x46,0x2e, + 0xcf,0xd4,0x8,0xd7,0x52,0xa4,0xa3,0x8e,0x65,0x68,0xd7,0xff,0x20,0xf5,0xad,0x4d, + 0x1f,0xa4,0x9f,0x12,0x38,0x9d,0x1e,0x7d,0x46,0x13,0x6,0x2d,0x16,0xa8,0x61,0xa5, + 0xf1,0x2c,0x9f,0x42,0x41,0xec,0xee,0x1f,0x68,0xc2,0xd1,0x9b,0x73,0x72,0x39,0x94, + 0x4,0x66,0x63,0x3f,0xd2,0x99,0x74,0xf3,0x85,0x85,0xee,0x1f,0xba,0xdd,0x5e,0xf5, + 0x2d,0x7b,0xe6,0xc1,0xc,0x8d,0x3a,0xea,0x44,0xf4,0xa,0x32,0xf0,0x17,0xe8,0x5a, + 0xa7,0x49,0x36,0x8e,0x3f,0xd9,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42, + 0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/close_high.png + 0x0,0x0,0x1,0xb7, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x4c,0x49,0x44,0x41,0x54,0x38,0x4f,0x63,0x3c,0x5b,0x3c, + 0xf3,0xbf,0x9c,0x9c,0x1c,0xc3,0xa3,0x47,0x8f,0x18,0x88,0x5,0x30,0xf5,0x8c,0xff, + 0x97,0xec,0xf9,0xcf,0xa0,0xad,0xc2,0xc0,0xf0,0xe7,0x17,0x50,0xef,0x3f,0x20,0xfd, + 0x13,0x62,0xc6,0x6f,0x20,0xfd,0xef,0x37,0x94,0xfd,0x3,0x42,0xff,0xfb,0x3,0xc4, + 0x20,0x35,0x5f,0x18,0xbe,0xdd,0xf8,0xcc,0xc0,0xf8,0x7f,0xf3,0xda,0xff,0xc,0x4f, + 0x6f,0x10,0x6b,0x29,0x44,0x1d,0x3b,0x37,0x3,0xc3,0xff,0x3f,0x40,0xcd,0x1d,0x59, + 0xff,0x49,0xd3,0x89,0x50,0xcd,0xf8,0xbf,0x24,0x10,0x55,0x73,0xf7,0x3a,0x6,0x86, + 0xd2,0x20,0x4c,0xf3,0xb0,0x88,0x33,0xfe,0x4f,0xb0,0x44,0xd1,0x7c,0xfd,0xe6,0x7b, + 0x6,0xcd,0x63,0xd7,0x51,0xd,0x0,0x6a,0xbc,0x6e,0xa5,0xc9,0xa0,0xa9,0x2e,0x88, + 0x62,0x28,0xe3,0x2b,0x3d,0x9e,0xff,0xc2,0xf2,0x92,0x28,0x82,0x37,0xdf,0x30,0x43, + 0xc,0x48,0xb4,0x62,0x60,0x98,0x7f,0xc,0xac,0x51,0x5d,0xe4,0x2f,0x8a,0x9a,0xb7, + 0xf,0x9f,0x33,0x30,0x3e,0x56,0x66,0xc1,0xf0,0xb3,0x94,0x96,0x22,0xc3,0xe5,0x87, + 0xdf,0x18,0xf4,0x2f,0x3e,0x61,0xb8,0xa8,0x2f,0xc3,0xa0,0x2b,0xcf,0xc5,0xf0,0xec, + 0xda,0x7d,0xc,0xaf,0x30,0x3e,0x55,0x67,0xc3,0xd0,0xfc,0xef,0xcf,0x3f,0x6,0x99, + 0x3b,0xbf,0x19,0x76,0x8,0xb0,0x30,0x78,0x7c,0xf8,0xc3,0xf0,0x44,0x85,0x95,0x81, + 0x89,0x85,0x9,0x43,0x33,0x13,0x33,0x33,0x13,0x3,0x3a,0x6,0x69,0xdc,0x25,0xc2, + 0xca,0xa0,0x27,0xc1,0xc,0xa6,0x41,0x7c,0x6c,0xea,0x30,0x8c,0x13,0xbf,0xfa,0x9d, + 0x61,0x9f,0x28,0x1b,0x83,0xbe,0x38,0xb,0x58,0x3,0x88,0x6,0xf1,0x41,0xe2,0xe8, + 0x0,0x43,0x33,0x48,0xa1,0xb6,0x18,0x33,0x8a,0x3a,0x10,0x1f,0x24,0x8e,0xe,0x18, + 0x5f,0x68,0x71,0x90,0x9d,0x48,0x98,0x32,0x35,0xbc,0x19,0x98,0x18,0x19,0x49,0xc6, + 0x20,0x7d,0x8c,0x40,0xa7,0xfc,0xf,0xc,0xa,0x26,0x39,0x85,0xae,0x5f,0xb7,0x96, + 0x1,0x0,0xbb,0x6c,0x75,0x2f,0x3f,0x1a,0x4c,0x30,0x0,0x0,0x0,0x0,0x49,0x45, + 0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/cusdr4.png + 0x0,0x0,0x7,0xfe, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x37,0x0,0x0,0x0,0x19,0x8,0x6,0x0,0x0,0x0,0x95,0x7d,0xb6,0x0, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1, + 0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdb,0x8,0x1d, + 0xe,0x24,0xf,0x4d,0xe7,0x53,0xf2,0x0,0x0,0x7,0x7e,0x49,0x44,0x41,0x54,0x58, + 0xc3,0xed,0x97,0x5b,0x8c,0x5d,0x65,0x19,0x86,0x9f,0x77,0xad,0xb5,0xf,0x73,0xd8, + 0xb3,0x3b,0xb4,0x43,0x4f,0xd3,0x13,0xb6,0x85,0x82,0xd0,0x52,0x15,0xea,0x21,0x1a, + 0x4c,0xc4,0x8,0xd1,0xc4,0xa4,0x8d,0xa7,0xb,0x2f,0xbc,0x50,0x2f,0x24,0x41,0x23, + 0x1e,0xe2,0x5,0x6,0x4d,0x20,0xea,0x95,0xc4,0x60,0xb8,0x96,0x84,0x80,0x9,0x89, + 0x8a,0x31,0x62,0xd5,0xc4,0x3,0xd0,0x52,0x66,0xea,0x60,0xe9,0x71,0x9c,0xce,0xb4, + 0xd3,0xc3,0x1c,0x3a,0xb3,0xf7,0xcc,0x3e,0xad,0xb5,0x5e,0x2f,0xe6,0x1f,0x32,0x94, + 0x86,0xc4,0x4,0xb9,0xea,0x77,0xb5,0xb2,0xd6,0xff,0xff,0xf9,0xdf,0xef,0x7b,0xbf, + 0xf7,0x7b,0x17,0x5c,0x8f,0xeb,0x71,0x3d,0xde,0xcd,0xd0,0xff,0xeb,0xe0,0xfd,0x43, + 0x2d,0x1,0x92,0x84,0x6d,0x49,0x32,0xe0,0x67,0x76,0x17,0xbd,0x72,0x8d,0x24,0x1, + 0xb6,0xcd,0xd2,0x23,0xac,0x5c,0xb3,0xe2,0xac,0xe5,0xfb,0x46,0xcb,0x67,0x11,0x36, + 0x3e,0xbb,0xa7,0xe4,0x77,0x5,0xdc,0x81,0xe1,0x76,0x4,0x24,0xb6,0x4b,0x40,0x59, + 0x52,0x9,0x88,0x81,0xe,0xb0,0x60,0x7b,0x11,0xc8,0x80,0x38,0x7c,0x2b,0x6,0xf0, + 0x79,0xb8,0x70,0x66,0x3b,0x5,0x3a,0x1,0x44,0xc,0x94,0x81,0xb2,0xed,0x92,0xa4, + 0x38,0x24,0x22,0x3,0x5a,0x40,0x13,0x68,0xda,0xee,0x5c,0xd,0x52,0xef,0x30,0xb0, + 0x82,0xed,0xa,0xb0,0x56,0xd2,0x6,0xdb,0xeb,0x80,0x7e,0x49,0x5,0xa0,0x6,0x9c, + 0xb6,0x7d,0x52,0x52,0xd,0xe8,0xb7,0xbd,0x45,0xd2,0x8d,0xb6,0xe3,0x0,0x26,0xd, + 0x17,0x9d,0x5,0xa6,0x25,0x35,0x80,0xaa,0xed,0x41,0x60,0xbd,0xa4,0x55,0xb6,0x8b, + 0x81,0xd,0x6d,0x60,0x4e,0xd2,0x24,0x70,0x16,0x98,0xb4,0x5d,0x7f,0x76,0x4f,0x29, + 0x7b,0xc7,0xc1,0x1d,0x18,0x6e,0x17,0x6d,0xf,0x48,0xba,0xd,0x78,0x9f,0xed,0x5d, + 0x92,0xd6,0x3,0xd5,0x50,0xc9,0x79,0x49,0x47,0x6d,0xff,0x59,0xd2,0xa4,0xed,0x9d, + 0xc0,0x3e,0x49,0x5b,0x6d,0x27,0xa1,0x9a,0x29,0xd0,0x0,0x2e,0x49,0x1a,0xb5,0x3d, + 0x23,0x69,0x2d,0xb0,0xb,0xd8,0x6c,0xbb,0x22,0xa9,0x60,0x9b,0x90,0x8c,0x9a,0xed, + 0x9,0x49,0x43,0xb6,0xff,0x26,0xe9,0x75,0x60,0x7e,0x99,0xd6,0xc9,0xff,0x70,0x79, + 0x5d,0xdd,0xb,0xcb,0xef,0x81,0x8,0xa8,0x4a,0xda,0xd,0xdc,0x67,0x7b,0x5f,0x7f, + 0x41,0x9b,0xee,0xe9,0x57,0x75,0x77,0x25,0x2a,0xdc,0xd4,0xa5,0xe8,0x1f,0x73,0x79, + 0xfb,0x89,0x89,0xbc,0xf,0x68,0xd9,0xbe,0x0,0xec,0x95,0x74,0xd7,0x67,0xd6,0x68, + 0x63,0x33,0x57,0xd4,0x15,0xe1,0x1c,0x31,0xd6,0xc8,0xdb,0x47,0x17,0x98,0xb5,0x3d, + 0x5,0xcc,0x1,0xd5,0x4a,0xcc,0xc6,0x4f,0xad,0x89,0x6e,0xd8,0x5b,0x51,0x72,0x63, + 0x51,0x11,0x98,0xe9,0xe,0x3e,0xb6,0xe0,0xf4,0xf9,0xa9,0x7c,0xe6,0x42,0x9b,0xf5, + 0x40,0x1b,0x98,0xb2,0xbd,0x10,0x92,0xf4,0xf6,0xe0,0x56,0xf4,0x4f,0xd1,0x76,0xbc, + 0x7f,0xa8,0x85,0x24,0x87,0xcc,0xe5,0xcb,0x3d,0x61,0xbb,0x2c,0x69,0x33,0x70,0x57, + 0x4,0x1f,0xde,0xbf,0x2e,0xbe,0xf5,0xd3,0x6b,0x54,0x1c,0x6f,0xc1,0xb1,0x5,0x33, + 0xde,0xcc,0xf9,0x68,0x7f,0x5c,0x7c,0x69,0xce,0x83,0x47,0xe6,0xbd,0x35,0x50,0xf5, + 0xd6,0x87,0x6f,0x8a,0xb7,0xdd,0xda,0x1b,0xc5,0xd3,0x1d,0xbb,0x96,0xda,0xb9,0xe1, + 0xde,0xd5,0x49,0xa9,0x2f,0xa1,0xef,0xe9,0xb,0xd9,0x86,0xe7,0xa7,0xdd,0xb0,0x9d, + 0xdc,0xd3,0x1f,0x95,0xef,0x5b,0x13,0x45,0x5d,0x11,0x8c,0x35,0x61,0xa4,0x96,0x53, + 0x8e,0xa5,0x3b,0x2b,0x51,0xe1,0x93,0xab,0xa3,0xb5,0xf,0x9f,0x4e,0xd3,0x63,0x8b, + 0x1a,0x6,0xfa,0x42,0x8f,0xbe,0x3d,0xb8,0xfd,0x43,0xad,0x62,0xe8,0x9f,0x75,0xc0, + 0x3a,0x49,0x3d,0x41,0x9c,0x96,0x39,0xdd,0xb4,0x9d,0x86,0xf7,0x15,0xdb,0x1b,0x80, + 0xdb,0xb7,0x77,0x6b,0xd3,0xfe,0xb5,0x71,0xf1,0x47,0x67,0x52,0x86,0x6b,0x39,0x80, + 0x25,0x69,0xb8,0x96,0xe6,0x67,0x1a,0x64,0x40,0xaf,0xa4,0xa2,0xed,0xea,0xaa,0x84, + 0xe8,0x62,0x2b,0xf7,0xf7,0x4e,0x65,0x33,0xb5,0xd4,0x97,0x80,0x58,0x30,0xb0,0xbb, + 0x12,0x55,0xbf,0xbb,0x2d,0x2e,0x9c,0x58,0x4c,0x93,0x93,0x8b,0xf0,0x9b,0x29,0x2b, + 0x56,0xc6,0x17,0xd6,0x27,0x3c,0x39,0xd1,0xe1,0xc4,0xe2,0x92,0x50,0x7e,0x6b,0x8b, + 0xb4,0xb6,0x14,0xd1,0xcc,0x69,0xd9,0x6e,0x6,0x50,0x6f,0xb0,0x2b,0xb9,0x96,0x84, + 0x2f,0xa9,0x98,0xd7,0xda,0xbc,0x37,0xd0,0x67,0x7,0xb0,0x2a,0x5c,0x34,0xb7,0x9d, + 0x4b,0x5a,0xc,0xa,0x58,0x91,0xd4,0x13,0xfa,0x66,0xcd,0x44,0xcb,0xce,0x6d,0x3e, + 0x3b,0x20,0xce,0x36,0x60,0x36,0x5d,0x3a,0xf7,0x70,0xd,0x87,0x35,0x3,0xb6,0xa3, + 0x75,0x25,0xf5,0xaf,0x2e,0xa0,0xa7,0x2f,0xe6,0xad,0x7a,0xc6,0x38,0x70,0x4a,0x52, + 0x9f,0xed,0xae,0xe1,0xba,0x7b,0x58,0x12,0xe,0x49,0x60,0x9b,0x3b,0x2b,0x31,0x27, + 0x16,0x72,0x4e,0x36,0xe0,0xde,0xd5,0x91,0xbf,0xbc,0x21,0xd6,0x5c,0xc7,0xfe,0xf6, + 0xf1,0xf6,0xe4,0x58,0x4b,0x47,0x80,0x63,0x92,0x66,0x56,0x24,0xff,0xcd,0xe0,0xe, + 0xc,0xb7,0x15,0x24,0x7c,0x10,0x74,0x37,0xf8,0xe3,0xc0,0xde,0x5d,0x3d,0x6c,0x1e, + 0x2c,0xa9,0xeb,0xe0,0x8c,0x5b,0x31,0xd6,0xed,0x7d,0x8a,0xe,0xcf,0xbb,0x21,0x29, + 0xbb,0xa9,0x8b,0xee,0x9d,0x5d,0x2a,0xfe,0x61,0x86,0xa9,0xdc,0x9e,0x5e,0xcc,0x75, + 0xfe,0x7,0xa7,0xd2,0xf8,0x8b,0xeb,0xe2,0xea,0xcf,0x6f,0x49,0x22,0x24,0x4d,0xb5, + 0xcc,0x89,0x6,0xf1,0xef,0xa7,0xd2,0xbe,0xd1,0x6,0x5b,0x24,0x45,0x77,0x56,0x54, + 0x49,0xd,0xbf,0x9d,0x72,0x23,0x88,0x49,0xb7,0xed,0x7e,0xa0,0xfb,0x1b,0x9b,0xe2, + 0xc2,0xc8,0x2,0x3e,0xbd,0xe8,0xc,0xd0,0xc6,0xb2,0xa2,0xc1,0x32,0x3a,0xbd,0x68, + 0x7e,0x71,0x4b,0x42,0x66,0xf4,0xcc,0x85,0xac,0xf3,0xdc,0xe5,0x7c,0xc,0x38,0x4, + 0x3e,0x28,0xe9,0x30,0x30,0x13,0x46,0xca,0x35,0x2b,0x97,0x0,0x6b,0x6d,0xef,0x93, + 0x74,0x7f,0x51,0xdc,0xf5,0xd0,0xb6,0x64,0x4b,0x6a,0xa2,0x17,0xaf,0xe4,0xe4,0x76, + 0x79,0xdf,0xaa,0x88,0xfb,0x7,0x22,0xbd,0x52,0xcb,0x7a,0xb6,0x77,0xc1,0xf7,0xb7, + 0x25,0x51,0x6f,0x22,0x5e,0x98,0x69,0x97,0x2c,0xcd,0x1,0x73,0x27,0x17,0x9d,0x3f, + 0x72,0x26,0xdd,0xba,0xbe,0xa4,0xbe,0xfe,0x2,0xba,0xa1,0x20,0x7d,0x6d,0x30,0x66, + 0xa0,0x98,0x14,0x1e,0x1d,0xcd,0xfa,0x33,0xc3,0x9e,0x5e,0x45,0xcf,0x5d,0xb6,0x43, + 0x32,0x37,0x2,0x3,0xd5,0x44,0x95,0x7,0x36,0xc7,0xd5,0x4a,0x8c,0x1f,0x19,0xcd, + 0x66,0x73,0xc8,0x81,0xde,0x1d,0xdd,0x2a,0x17,0x4,0xbb,0xfb,0x62,0xc6,0x16,0x73, + 0x1e,0x1e,0xcd,0xf2,0x7a,0xea,0x3a,0x30,0x26,0xe9,0x45,0xdb,0x2f,0x2,0xe3,0x40, + 0x73,0xa5,0xe8,0x45,0x57,0x55,0xad,0x1b,0xd8,0x9,0x7c,0xac,0x37,0xf2,0xdd,0x3f, + 0x7c,0x4f,0xbc,0xed,0xd0,0x5c,0x1e,0x3d,0x3a,0x9a,0xea,0xaf,0x57,0x2c,0x4b,0xfa, + 0xc4,0xea,0x48,0xbf,0xbe,0x98,0xd3,0x17,0x13,0x7d,0x67,0x5b,0x12,0xfd,0x6a,0x32, + 0x23,0xcd,0x73,0x3a,0xa6,0x14,0xa8,0xbb,0xa,0x28,0xe4,0xc0,0xb9,0x96,0xfd,0xda, + 0x2,0x6a,0x64,0xa6,0x10,0x89,0xd7,0xea,0x76,0x2b,0xb7,0x7a,0x13,0xa2,0xf5,0x25, + 0xe9,0x4f,0x33,0x39,0x92,0x4a,0xa5,0x48,0xab,0x3f,0xb7,0x2e,0xde,0xf8,0xcb,0x5d, + 0x71,0xff,0x5c,0x4a,0xfa,0xd0,0xc9,0xf4,0x64,0x3d,0x63,0xc4,0xf6,0x59,0xa0,0x71, + 0x77,0x9f,0x78,0x62,0x22,0xcb,0xbf,0x32,0xd2,0x4e,0x8b,0xb1,0xfc,0xe0,0xe6,0x58, + 0x92,0x62,0xa0,0x14,0x6,0xbb,0xae,0x76,0x3f,0x6f,0xaa,0x9c,0x6d,0x1,0x3d,0xc0, + 0x16,0xe0,0xe6,0xaf,0xe,0xc6,0x9b,0x8e,0xd4,0xe0,0xe0,0xac,0xb5,0xab,0x47,0x6, + 0xf9,0xd8,0x42,0xee,0x6a,0x4c,0xbc,0xab,0x47,0xfe,0xd2,0xfa,0x58,0x4f,0x4e,0xa4, + 0xd9,0xa9,0x45,0x48,0xa2,0x28,0x6,0xba,0xb1,0xb7,0x6e,0x2c,0x2b,0xb7,0x49,0xca, + 0x91,0xca,0x1b,0xca,0x8a,0x3e,0x52,0x95,0x37,0x94,0xc5,0x93,0x13,0x69,0xe3,0x8f, + 0x33,0x9e,0x97,0x54,0xbe,0xb1,0x40,0x25,0x35,0xf1,0x87,0xaa,0x62,0x4f,0x25,0xd2, + 0x8e,0x1e,0x15,0x26,0x1a,0x79,0xf6,0x93,0xb1,0xec,0xd2,0x91,0x1a,0xc7,0x80,0x91, + 0x30,0xc8,0xef,0x90,0xbd,0x69,0x63,0x49,0x9c,0x6e,0xb0,0x50,0xcb,0x75,0xe5,0x9b, + 0xc7,0x3b,0xc9,0xd7,0x7,0xe3,0x81,0xc7,0x76,0x24,0x95,0x9f,0x8e,0x76,0xb6,0x5f, + 0x4e,0xf5,0x1,0xe0,0x3f,0xc0,0xa5,0x3,0xc3,0xed,0xe6,0x33,0xbb,0x8b,0x6f,0xa5, + 0xe5,0xb2,0x7,0xc,0x52,0xca,0xfb,0xab,0x51,0xb2,0xbd,0xdb,0xde,0x50,0x8a,0xb3, + 0xe1,0x5a,0xde,0x1c,0xae,0xe5,0xf3,0x40,0xfb,0xa9,0x8b,0x79,0xf5,0x83,0x55,0x75, + 0x3d,0x3e,0x9e,0xd5,0x4f,0x2f,0xba,0x2e,0x28,0xe,0xcd,0x67,0x6b,0x24,0x35,0xcb, + 0x11,0x85,0xc7,0x76,0x24,0xdd,0xb9,0x8d,0x80,0xd1,0x86,0xf3,0xbf,0xcc,0x7a,0xe1, + 0xd5,0x73,0xf9,0xf9,0xd9,0x94,0xd3,0xb6,0x17,0x24,0x6d,0xee,0x2f,0xb0,0x6b,0x75, + 0x51,0x95,0x3b,0x2a,0x51,0xf6,0xca,0x7c,0xde,0x78,0xea,0x82,0x67,0xcf,0xb5,0x18, + 0x33,0x1c,0x7,0x86,0x80,0xe3,0x41,0x5c,0x36,0x6f,0xef,0x91,0xea,0x39,0xf9,0x64, + 0xcb,0x67,0x24,0x1d,0xcd,0x50,0xfc,0xf8,0x44,0x7e,0xcb,0xbe,0x3e,0xef,0x7c,0x70, + 0x4b,0x32,0xf0,0xb3,0xb3,0xd9,0x6d,0xd3,0x1d,0x86,0x80,0x61,0x60,0x86,0x25,0x2a, + 0xbf,0xa5,0x72,0xe,0xee,0xe0,0x2c,0x30,0xf2,0xf9,0xa3,0x9d,0x8,0xe8,0x91,0xd4, + 0x4,0x2e,0x83,0xce,0x83,0xdb,0x87,0xe6,0xbd,0xea,0xd0,0xbc,0xbb,0x6c,0xd7,0x81, + 0x3a,0xa2,0xf2,0xe3,0xd1,0x6c,0x8d,0xa4,0x72,0x33,0xa7,0xf7,0x81,0xd7,0x3b,0x37, + 0x54,0x13,0x95,0xce,0x34,0x5c,0x97,0x74,0xc5,0xf6,0x39,0x49,0xc7,0x81,0xd7,0x81, + 0xb6,0xed,0xbd,0x2f,0xcf,0xab,0xfe,0xd2,0x48,0xa7,0xa,0xd4,0x25,0x5d,0xb0,0x3d, + 0xe,0x9c,0x2,0x4e,0x84,0x3e,0xaa,0xd9,0xde,0xa,0x4c,0x8e,0x37,0x39,0xff,0xbb, + 0xcb,0x79,0x23,0x8,0xc6,0xb,0xb6,0x5b,0x92,0xf6,0xfe,0x73,0x2e,0x9f,0xab,0x65, + 0xec,0x8c,0x71,0xdb,0x5e,0x72,0xe8,0x61,0xfe,0xbe,0x95,0x96,0xcf,0xee,0x29,0xf9, + 0xc0,0x70,0x7b,0x1,0xf8,0x77,0x58,0xf4,0xaf,0x60,0x58,0x1b,0xc0,0xe5,0xe0,0x2a, + 0xda,0x61,0xa6,0x95,0x82,0xef,0x6b,0x86,0x3e,0xed,0xf,0xc6,0xb6,0x3a,0x93,0x6a, + 0x60,0xba,0xe3,0xa2,0xa4,0x86,0xed,0xcb,0xc0,0x39,0x60,0xdc,0xf6,0x25,0x49,0x91, + 0xed,0x8b,0xb6,0x47,0x25,0x75,0xd9,0x9e,0xb5,0x7d,0x9,0xb8,0x0,0x4c,0x1,0xf3, + 0xc0,0x62,0x30,0xd2,0x93,0xb6,0x5f,0x6e,0xe6,0xe8,0xef,0x73,0x8e,0x6c,0xbf,0x2a, + 0xe9,0xb0,0xa4,0x3a,0x70,0x5e,0xd2,0xc5,0x91,0x7a,0x7e,0xb3,0xa4,0x86,0xc4,0x31, + 0x60,0x7e,0xa5,0x52,0x5e,0x4b,0x2d,0xdb,0xb6,0x27,0x25,0xcd,0x7,0x70,0x71,0x70, + 0xe8,0xd,0xa0,0xb9,0xc2,0xa5,0x47,0x41,0xbe,0x73,0x49,0x89,0xed,0x82,0xed,0x58, + 0x52,0x39,0x80,0x8d,0x6d,0x77,0x80,0x45,0x60,0x21,0xec,0xed,0x84,0x7d,0x75,0x49, + 0x67,0x6c,0x47,0x40,0x2b,0x24,0xa1,0x15,0x6,0x70,0xbe,0xec,0xec,0xf7,0xf,0xb5, + 0xa6,0x81,0x97,0x6d,0x8f,0x85,0x7d,0x17,0x97,0x18,0x44,0x27,0xd0,0x7b,0xa,0x38, + 0x6c,0x3b,0xb,0xd5,0x9f,0xbd,0x1a,0x9c,0xde,0xee,0x5f,0x2c,0xfc,0x3b,0xe5,0xcb, + 0xac,0xd,0xd5,0xd5,0xa,0x2a,0xbf,0xf1,0xf,0x6,0x28,0x64,0x3c,0x5a,0xfe,0x16, + 0xc0,0xe7,0x2b,0x55,0x6c,0xd9,0x8b,0x86,0xbd,0xbe,0x96,0xca,0xad,0x30,0x13,0x71, + 0x18,0xfc,0xa,0x86,0x21,0x5b,0x71,0x87,0x24,0x7c,0x23,0x24,0x2e,0xbb,0xd6,0x39, + 0xd7,0xe3,0x7a,0x5c,0x8f,0x77,0x2f,0xfe,0xb,0x93,0x15,0x70,0x93,0x8,0xc6,0xce, + 0x44,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/cuSDR_64.ico + 0x0,0x0,0x42,0x3e, + 0x0, + 0x0,0x1,0x0,0x1,0x0,0x40,0x40,0x0,0x0,0x1,0x0,0x20,0x0,0x28,0x42,0x0, + 0x0,0x16,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x80,0x0,0x0, + 0x0,0x1,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf6,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf6,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf6,0xf6,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf6,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf6,0x0,0x68,0xf7,0xf6,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf6,0x0, + 0x68,0xf7,0xf8,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf6,0xf6,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf6,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf6,0x0, + 0x68,0xf8,0xf6,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf6,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf6,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf8,0x0,0x68,0xf8,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf8,0xf7,0x0,0x68,0xf8,0xf8,0x0,0x68,0xf8,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf8,0xf8,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf8,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf8,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf8,0xf7,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf8,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf8,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf6,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf8,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf6,0xf6,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf7,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf6,0xf7,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf6,0x0,0x68,0xf7,0xf8,0x0,0x68,0xf7,0xf7,0x0, + 0x68,0xf7,0xf7,0x0,0x68,0xf8,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf7,0xf6,0x0, + 0x68,0xf7,0xf6,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf6,0xf7,0x0,0x68,0xf2,0xef,0x2, + 0x68,0xf2,0xef,0x2,0x68,0xf2,0xef,0x2,0x68,0xf2,0xef,0x2,0x68,0xf2,0xef,0x2, + 0x68,0xf2,0xef,0x2,0x68,0xf3,0xef,0x2,0x68,0xf3,0xf0,0x2,0x68,0xf3,0xf0,0x2, + 0x68,0xf3,0xf0,0x2,0x68,0xf3,0xf0,0x2,0x68,0xf3,0xf0,0x2,0x68,0xf3,0xf0,0x2, + 0x68,0xf3,0xf0,0x2,0x68,0xf3,0xf0,0x2,0x68,0xf3,0xf1,0x1,0x68,0xf3,0xf1,0x2, + 0x68,0xf3,0xf1,0x2,0x68,0xf3,0xf1,0x1,0x68,0xf3,0xf1,0x2,0x68,0xf4,0xf1,0x1, + 0x68,0xf4,0xf1,0x1,0x68,0xf3,0xf2,0x1,0x68,0xf3,0xf1,0x1,0x68,0xf4,0xf2,0x1, + 0x68,0xf4,0xf2,0x1,0x68,0xf4,0xf2,0x1,0x68,0xf4,0xf2,0x1,0x68,0xf4,0xf2,0x1, + 0x68,0xf4,0xf2,0x1,0x68,0xf4,0xf2,0x1,0x68,0xf4,0xf3,0x1,0x68,0xf4,0xf3,0x1, + 0x68,0xf5,0xf3,0x1,0x68,0xf4,0xf3,0x1,0x68,0xf4,0xf3,0x1,0x68,0xf4,0xf3,0x1, + 0x68,0xf5,0xf3,0x1,0x68,0xf5,0xf3,0x1,0x68,0xf5,0xf4,0x1,0x68,0xf5,0xf3,0x0, + 0x68,0xf5,0xf3,0x1,0x68,0xf5,0xf3,0x1,0x68,0xf5,0xf4,0x0,0x68,0xf5,0xf3,0x0, + 0x68,0xf5,0xf4,0x1,0x68,0xf5,0xf3,0x1,0x68,0xf5,0xf4,0x1,0x68,0xf5,0xf4,0x0, + 0x68,0xf5,0xf4,0x0,0x68,0xf5,0xf5,0x0,0x68,0xf5,0xf5,0x0,0x68,0xf5,0xf4,0x1, + 0x68,0xf6,0xf5,0x0,0x68,0xf5,0xf5,0x0,0x68,0xf5,0xf4,0x0,0x68,0xf5,0xf5,0x0, + 0x68,0xf6,0xf5,0x0,0x68,0xf5,0xf5,0x0,0x68,0xf6,0xf5,0x0,0x68,0xf6,0xf5,0x0, + 0x68,0xf6,0xf5,0x0,0x68,0xf6,0xf5,0x0,0x68,0xf6,0xf5,0x0,0x68,0xec,0xe4,0x5, + 0x68,0xec,0xe4,0x5,0x68,0xec,0xe4,0x5,0x68,0xeb,0xe4,0x6,0x68,0xec,0xe4,0x5, + 0x68,0xec,0xe4,0x5,0x68,0xec,0xe4,0x5,0x68,0xec,0xe5,0x5,0x68,0xec,0xe5,0x5, + 0x68,0xec,0xe5,0x5,0x68,0xec,0xe5,0x5,0x68,0xec,0xe5,0x5,0x68,0xec,0xe5,0x5, + 0x68,0xec,0xe5,0x5,0x68,0xed,0xe6,0x5,0x68,0xed,0xe6,0x5,0x68,0xed,0xe6,0x5, + 0x68,0xed,0xe6,0x5,0x68,0xec,0xe6,0x5,0x68,0xed,0xe6,0x5,0x68,0xed,0xe6,0x5, + 0x68,0xed,0xe6,0x4,0x68,0xed,0xe6,0x5,0x68,0xed,0xe6,0x4,0x68,0xed,0xe6,0x4, + 0x68,0xed,0xe7,0x5,0x68,0xee,0xe7,0x4,0x68,0xed,0xe7,0x4,0x68,0xee,0xe7,0x4, + 0x68,0xee,0xe7,0x4,0x68,0xee,0xe7,0x4,0x68,0xed,0xe8,0x4,0x68,0xee,0xe7,0x4, + 0x68,0xee,0xe8,0x4,0x68,0xee,0xe8,0x4,0x68,0xee,0xe8,0x4,0x68,0xee,0xe8,0x4, + 0x68,0xee,0xe8,0x4,0x68,0xee,0xe8,0x4,0x68,0xee,0xe8,0x4,0x68,0xef,0xe9,0x4, + 0x68,0xee,0xe8,0x4,0x68,0xef,0xe9,0x4,0x68,0xee,0xe9,0x4,0x68,0xee,0xe9,0x4, + 0x68,0xef,0xe9,0x4,0x68,0xef,0xe9,0x4,0x68,0xef,0xea,0x4,0x68,0xef,0xe9,0x4, + 0x68,0xef,0xea,0x3,0x68,0xef,0xea,0x3,0x68,0xf0,0xea,0x3,0x68,0xee,0xea,0x3, + 0x68,0xf0,0xea,0x3,0x68,0xef,0xea,0x3,0x68,0xef,0xea,0x3,0x68,0xf0,0xea,0x4, + 0x68,0xef,0xea,0x3,0x68,0xf0,0xeb,0x3,0x68,0xf0,0xeb,0x3,0x68,0xf0,0xeb,0x3, + 0x68,0xf0,0xeb,0x3,0x68,0xf0,0xeb,0x4,0x68,0xf0,0xeb,0x3,0x68,0xe4,0xd9,0x9, + 0x68,0xe4,0xd9,0xa,0x68,0xe5,0xd9,0x9,0x68,0xe5,0xd9,0x9,0x68,0xe5,0xd9,0x8, + 0x68,0xe4,0xd9,0x9,0x68,0xe5,0xda,0x9,0x68,0xe5,0xd9,0x8,0x68,0xe5,0xda,0x9, + 0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x9, + 0x68,0xe5,0xda,0x9,0x68,0xe5,0xda,0x9,0x68,0xe6,0xdb,0x9,0x68,0xe6,0xdb,0x9, + 0x68,0xe6,0xdb,0x9,0x68,0xe6,0xdb,0x9,0x68,0xe6,0xdb,0x9,0x68,0xe6,0xdb,0x9, + 0x68,0xe6,0xdb,0x9,0x68,0xe6,0xdb,0x8,0x68,0xe6,0xdc,0x8,0x68,0xe6,0xdb,0x8, + 0x68,0xe6,0xdc,0x8,0x68,0xe6,0xdc,0x9,0x68,0xe7,0xdc,0x7,0x68,0xe7,0xdc,0x8, + 0x68,0xe7,0xdc,0x8,0x68,0xe7,0xdc,0x9,0x68,0xe7,0xdc,0x8,0x68,0xe7,0xdc,0x8, + 0x68,0xe7,0xdc,0x8,0x68,0xe7,0xdd,0x8,0x68,0xe7,0xdd,0x8,0x68,0xe7,0xdd,0x8, + 0x68,0xe7,0xdd,0x8,0x68,0xe7,0xdd,0x8,0x68,0xe7,0xdd,0x8,0x68,0xe7,0xdd,0x8, + 0x68,0xe7,0xdd,0x8,0x68,0xe7,0xde,0x7,0x68,0xe8,0xde,0x8,0x68,0xe7,0xde,0x8, + 0x68,0xe7,0xde,0x8,0x68,0xe7,0xde,0x8,0x68,0xe8,0xde,0x8,0x68,0xe8,0xde,0x8, + 0x68,0xe8,0xdf,0x7,0x68,0xe8,0xdf,0x8,0x68,0xe8,0xdf,0x7,0x68,0xe8,0xdf,0x7, + 0x68,0xe8,0xdf,0x7,0x68,0xe9,0xdf,0x7,0x68,0xe8,0xdf,0x7,0x68,0xe8,0xdf,0x7, + 0x68,0xe9,0xe0,0x6,0x68,0xe8,0xdf,0x7,0x68,0xe9,0xe0,0x7,0x68,0xe9,0xe0,0x7, + 0x68,0xe9,0xe0,0x7,0x68,0xe9,0xe0,0x6,0x68,0xe9,0xe0,0x7,0x68,0xde,0xce,0xd, + 0x68,0xde,0xce,0xd,0x68,0xde,0xce,0xd,0x68,0xde,0xce,0xc,0x68,0xde,0xce,0xc, + 0x68,0xde,0xce,0xd,0x68,0xdf,0xce,0xc,0x68,0xdf,0xce,0xd,0x68,0xde,0xce,0xd, + 0x68,0xde,0xcf,0xc,0x68,0xdf,0xcf,0xc,0x68,0xdf,0xcf,0xc,0x68,0xde,0xcf,0xc, + 0x68,0xdf,0xcf,0xc,0x68,0xdf,0xcf,0xc,0x68,0xdf,0xd0,0xc,0x68,0xdf,0xd0,0xc, + 0x68,0xdf,0xd0,0xd,0x68,0xe0,0xd0,0xc,0x68,0xdf,0xd0,0xc,0x68,0xdf,0xd0,0xc, + 0x68,0xdf,0xd0,0xc,0x68,0xe0,0xd0,0xc,0x68,0xe0,0xd1,0xc,0x68,0xe0,0xd1,0xc, + 0x68,0xe0,0xd0,0xc,0x68,0xe0,0xd1,0xc,0x68,0xe0,0xd1,0xc,0x68,0xe0,0xd1,0xc, + 0x68,0xe0,0xd1,0xc,0x68,0xe0,0xd1,0xc,0x68,0xe0,0xd1,0xb,0x68,0xe0,0xd1,0xc, + 0x68,0xe1,0xd2,0xc,0x68,0xe0,0xd1,0xb,0x68,0xe1,0xd2,0xb,0x68,0xe1,0xd2,0xb, + 0x68,0xe1,0xd2,0xb,0x68,0xe1,0xd3,0xb,0x68,0xe1,0xd2,0xb,0x68,0xe1,0xd2,0xb, + 0x68,0xe0,0xd3,0xb,0x68,0xe1,0xd3,0xc,0x68,0xe1,0xd3,0xb,0x68,0xe1,0xd3,0xb, + 0x68,0xe1,0xd3,0xb,0x68,0xe1,0xd3,0xb,0x68,0xe1,0xd4,0xb,0x68,0xe2,0xd3,0xb, + 0x68,0xe1,0xd3,0xb,0x68,0xe2,0xd3,0xb,0x68,0xe1,0xd4,0xb,0x68,0xe1,0xd4,0xb, + 0x68,0xe2,0xd4,0xb,0x68,0xe2,0xd4,0xb,0x68,0xe2,0xd4,0xb,0x68,0xe2,0xd4,0xb, + 0x68,0xe2,0xd5,0xb,0x68,0xe2,0xd5,0xb,0x68,0xe2,0xd5,0xb,0x68,0xe2,0xd5,0xb, + 0x68,0xe2,0xd5,0xb,0x68,0xe2,0xd5,0xb,0x68,0xe2,0xd5,0xa,0x68,0xd7,0xc3,0x10, + 0x68,0xd7,0xc3,0x10,0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc3,0x10, + 0x68,0xd7,0xc3,0x10,0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc4,0x10,0x68,0xd8,0xc4,0x10, + 0x68,0xd8,0xc3,0x10,0x68,0xd8,0xc4,0x10,0x68,0xd8,0xc4,0x10,0x68,0xd9,0xc4,0xf, + 0x68,0xd9,0xc4,0xf,0x68,0xd8,0xc5,0x10,0x68,0xd9,0xc4,0x10,0x68,0xd9,0xc5,0xf, + 0x68,0xd9,0xc5,0x10,0x68,0xd9,0xc5,0xf,0x68,0xd9,0xc5,0xf,0x68,0xd9,0xc5,0xf, + 0x68,0xd9,0xc5,0xf,0x68,0xd9,0xc5,0xf,0x68,0xd9,0xc5,0xf,0x68,0xd9,0xc5,0xf, + 0x68,0xd9,0xc6,0xf,0x68,0xd9,0xc6,0xf,0x68,0xd9,0xc6,0xf,0x68,0xd9,0xc6,0xf, + 0x68,0xd9,0xc6,0xf,0x68,0xda,0xc6,0xf,0x68,0xda,0xc6,0xf,0x68,0xd9,0xc6,0xf, + 0x68,0xda,0xc6,0xf,0x68,0xda,0xc7,0xf,0x68,0xda,0xc7,0xf,0x68,0xda,0xc7,0xf, + 0x68,0xda,0xc7,0xf,0x68,0xda,0xc7,0xf,0x68,0xda,0xc7,0xe,0x68,0xda,0xc7,0xe, + 0x68,0xda,0xc7,0xf,0x68,0xdb,0xc7,0xe,0x68,0xda,0xc7,0xf,0x68,0xdb,0xc8,0xe, + 0x68,0xdb,0xc8,0xe,0x68,0xdb,0xc8,0xe,0x68,0xdb,0xc8,0xe,0x68,0xdb,0xc8,0xe, + 0x68,0xdb,0xc8,0xe,0x68,0xdb,0xc8,0xe,0x68,0xdb,0xc9,0xe,0x68,0xdb,0xc9,0xe, + 0x68,0xdb,0xc9,0xe,0x68,0xdb,0xc9,0xe,0x68,0xdb,0xc9,0xe,0x68,0xdc,0xc9,0xe, + 0x68,0xdc,0xc9,0xe,0x68,0xdc,0xc9,0xe,0x68,0xdc,0xca,0xe,0x68,0xdb,0xca,0xe, + 0x68,0xdc,0xca,0xe,0x68,0xdc,0xca,0xe,0x68,0xdc,0xca,0xe,0x68,0xd1,0xb7,0x13, + 0x68,0xd1,0xb8,0x13,0x68,0xd1,0xb8,0x13,0x68,0xd1,0xb8,0x13,0x68,0xd1,0xb8,0x13, + 0x68,0xd2,0xb8,0x13,0x68,0xd1,0xb9,0x13,0x68,0xd2,0xb9,0x13,0x68,0xd2,0xb9,0x13, + 0x68,0xd2,0xb9,0x13,0x68,0xd2,0xb9,0x13,0x68,0xd1,0xb9,0x13,0x68,0xd2,0xb9,0x13, + 0x68,0xd2,0xb9,0x13,0x68,0xd2,0xba,0x13,0x68,0xd2,0xb9,0x13,0x68,0xd2,0xb9,0x13, + 0x68,0xd2,0xba,0x13,0x68,0xd2,0xb9,0x12,0x68,0xd2,0xba,0x13,0x68,0xd2,0xba,0x13, + 0x68,0xd2,0xba,0x13,0x68,0xd2,0xba,0x12,0x68,0xd2,0xbb,0x13,0x68,0xd3,0xba,0x12, + 0x68,0xd3,0xba,0x12,0x68,0xd3,0xbb,0x12,0x68,0xd3,0xbb,0x12,0x68,0xd3,0xbb,0x12, + 0x68,0xd3,0xbb,0x12,0x68,0xd3,0xbb,0x12,0x68,0xd3,0xbc,0x12,0x68,0xd3,0xbb,0x12, + 0x68,0xd3,0xbb,0x13,0x68,0xd3,0xbc,0x12,0x68,0xd3,0xbc,0x12,0x68,0xd4,0xbc,0x12, + 0x68,0xd3,0xbc,0x12,0x68,0xd4,0xbc,0x12,0x68,0xd4,0xbc,0x12,0x68,0xd4,0xbc,0x12, + 0x68,0xd4,0xbc,0x12,0x68,0xd4,0xbc,0x12,0x68,0xd4,0xbd,0x12,0x68,0xd4,0xbd,0x12, + 0x68,0xd4,0xbd,0x12,0x68,0xd5,0xbd,0x12,0x68,0xd4,0xbd,0x12,0x68,0xd5,0xbd,0x12, + 0x68,0xd4,0xbe,0x12,0x68,0xd5,0xbd,0x11,0x68,0xd4,0xbe,0x12,0x68,0xd5,0xbe,0x11, + 0x68,0xd4,0xbe,0x11,0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbe,0x11, + 0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbf,0x12,0x68,0xd5,0xbe,0x11,0x68,0xd5,0xbf,0x11, + 0x68,0xd5,0xbf,0x11,0x68,0xd5,0xbf,0x11,0x68,0xd6,0xbf,0x11,0x68,0xca,0xad,0x16, + 0x68,0xca,0xad,0x17,0x68,0xca,0xad,0x16,0x68,0xca,0xad,0x16,0x68,0xca,0xad,0x17, + 0x68,0xca,0xad,0x16,0x68,0xcb,0xad,0x16,0x68,0xca,0xad,0x17,0x68,0xcb,0xae,0x16, + 0x68,0xcb,0xae,0x16,0x68,0xcb,0xae,0x16,0x68,0xcb,0xae,0x16,0x68,0xcb,0xae,0x16, + 0x68,0xcb,0xae,0x16,0x68,0xcb,0xae,0x16,0x68,0xcb,0xaf,0x16,0x68,0xcb,0xae,0x16, + 0x68,0xcb,0xaf,0x16,0x68,0xcb,0xaf,0x16,0x68,0xcb,0xaf,0x16,0x68,0xcb,0xaf,0x16, + 0x68,0xcc,0xaf,0x16,0x68,0xcc,0xaf,0x16,0x68,0xcb,0xaf,0x16,0x68,0xcb,0xaf,0x16, + 0x68,0xcc,0xaf,0x16,0x68,0xcb,0xb0,0x16,0x68,0xcc,0xb0,0x15,0x68,0xcc,0xb0,0x16, + 0x68,0xcb,0xb0,0x16,0x68,0xcc,0xb0,0x15,0x68,0xcc,0xb0,0x16,0x68,0xcc,0xb0,0x15, + 0x68,0xcc,0xb0,0x16,0x68,0xcc,0xb1,0x15,0x68,0xcc,0xb1,0x15,0x68,0xcc,0xb1,0x15, + 0x68,0xcc,0xb1,0x15,0x68,0xcd,0xb1,0x15,0x68,0xcd,0xb1,0x15,0x68,0xcd,0xb2,0x15, + 0x68,0xcd,0xb1,0x15,0x68,0xcd,0xb2,0x15,0x68,0xcd,0xb2,0x15,0x68,0xcd,0xb2,0x15, + 0x68,0xcd,0xb2,0x15,0x68,0xcd,0xb2,0x15,0x68,0xce,0xb2,0x15,0x68,0xcd,0xb2,0x15, + 0x68,0xcd,0xb2,0x15,0x68,0xcd,0xb3,0x15,0x68,0xce,0xb3,0x15,0x68,0xce,0xb3,0x15, + 0x68,0xcd,0xb3,0x15,0x68,0xce,0xb3,0x15,0x68,0xce,0xb3,0x15,0x68,0xce,0xb3,0x15, + 0x68,0xce,0xb4,0x15,0x68,0xce,0xb3,0x14,0x68,0xce,0xb4,0x14,0x68,0xcf,0xb4,0x14, + 0x68,0xce,0xb4,0x14,0x68,0xce,0xb4,0x14,0x68,0xcf,0xb4,0x14,0x68,0xc4,0xa3,0x1a, + 0x68,0xc4,0xa3,0x1a,0x68,0xc4,0xa3,0x19,0x68,0xc4,0xa3,0x1a,0x68,0xc4,0xa3,0x19, + 0x68,0xc5,0xa3,0x19,0x68,0xc5,0xa3,0x19,0x67,0xc5,0xa3,0x19,0x67,0xc5,0xa3,0x19, + 0x67,0xc5,0xa3,0x19,0x67,0xc5,0xa3,0x19,0x67,0xc5,0xa4,0x19,0x67,0xc5,0xa4,0x19, + 0x67,0xc5,0xa4,0x19,0x67,0xc5,0xa4,0x19,0x68,0xc5,0xa4,0x19,0x68,0xc5,0xa4,0x19, + 0x68,0xc5,0xa4,0x19,0x68,0xc5,0xa4,0x19,0x68,0xc5,0xa4,0x19,0x68,0xc6,0xa5,0x19, + 0x68,0xc5,0xa5,0x19,0x68,0xc6,0xa5,0x19,0x68,0xc6,0xa5,0x19,0x67,0xc6,0xa5,0x19, + 0x67,0xc6,0xa5,0x19,0x67,0xc6,0xa5,0x19,0x67,0xc6,0xa5,0x19,0x68,0xc6,0xa5,0x19, + 0x68,0xc6,0xa6,0x18,0x68,0xc6,0xa6,0x18,0x68,0xc6,0xa6,0x18,0x68,0xc6,0xa6,0x18, + 0x68,0xc6,0xa6,0x18,0x68,0xc6,0xa6,0x19,0x68,0xc6,0xa6,0x19,0x68,0xc7,0xa6,0x19, + 0x68,0xc7,0xa6,0x18,0x68,0xc7,0xa7,0x18,0x68,0xc7,0xa7,0x18,0x68,0xc7,0xa7,0x18, + 0x67,0xc7,0xa7,0x18,0x67,0xc7,0xa7,0x18,0x68,0xc7,0xa7,0x18,0x68,0xc7,0xa7,0x18, + 0x68,0xc7,0xa7,0x18,0x68,0xc7,0xa7,0x18,0x67,0xc7,0xa7,0x18,0x67,0xc7,0xa8,0x18, + 0x68,0xc7,0xa8,0x18,0x68,0xc8,0xa8,0x18,0x68,0xc7,0xa8,0x18,0x68,0xc7,0xa8,0x18, + 0x67,0xc7,0xa8,0x18,0x67,0xc7,0xa8,0x18,0x68,0xc8,0xa8,0x18,0x68,0xc8,0xa9,0x18, + 0x68,0xc8,0xa9,0x18,0x68,0xc8,0xa8,0x18,0x67,0xc8,0xa9,0x18,0x67,0xc8,0xa9,0x18, + 0x68,0xc8,0xa9,0x18,0x68,0xc8,0xa9,0x17,0x68,0xc8,0xa9,0x18,0x68,0xbe,0x99,0x1c, + 0x68,0xbe,0x99,0x1d,0x68,0xbe,0x99,0x1d,0x68,0xbe,0x99,0x1c,0x68,0xbe,0x9a,0x1c, + 0x67,0xbf,0x99,0x1d,0x67,0xbf,0x99,0x1c,0x68,0xbf,0x9a,0x1d,0x68,0xbf,0x9a,0x1c, + 0x68,0xbf,0x9a,0x1c,0x68,0xbf,0x9a,0x1c,0x68,0xbf,0x9a,0x1c,0x68,0xbf,0x9a,0x1c, + 0x68,0xbf,0x9a,0x1c,0x68,0xbf,0x9a,0x1c,0x67,0xbf,0x9a,0x1c,0x67,0xc0,0x9b,0x1c, + 0x68,0xbf,0x9a,0x1c,0x68,0xc0,0x9b,0x1c,0x68,0xc0,0x9b,0x1c,0x68,0xbf,0x9b,0x1c, + 0x68,0xc0,0x9b,0x1c,0x67,0xc0,0x9b,0x1c,0x67,0xbf,0x9b,0x1c,0x69,0xc0,0x9b,0x1c, + 0x68,0xc0,0x9b,0x1c,0x68,0xc0,0x9b,0x1c,0x68,0xc0,0x9c,0x1c,0x67,0xc1,0x9c,0x1c, + 0x67,0xc0,0x9c,0x1c,0x67,0xc0,0x9c,0x1b,0x68,0xc1,0x9c,0x1b,0x68,0xc1,0x9c,0x1b, + 0x68,0xc1,0x9c,0x1b,0x68,0xc0,0x9c,0x1b,0x68,0xc1,0x9d,0x1b,0x68,0xc1,0x9d,0x1b, + 0x68,0xc1,0x9d,0x1b,0x68,0xc1,0x9d,0x1b,0x68,0xc1,0x9d,0x1b,0x67,0xc0,0x9d,0x1b, + 0x68,0xc1,0x9d,0x1b,0x68,0xc1,0x9d,0x1b,0x68,0xc1,0x9e,0x1c,0x69,0xc2,0x9d,0x1c, + 0x69,0xc1,0x9d,0x1b,0x68,0xc1,0x9e,0x1b,0x68,0xc2,0x9d,0x1b,0x68,0xc2,0x9e,0x1b, + 0x67,0xc1,0x9e,0x1b,0x68,0xc2,0x9e,0x1b,0x68,0xc1,0x9e,0x1b,0x67,0xc2,0x9e,0x1b, + 0x68,0xc2,0x9f,0x1b,0x68,0xc2,0x9e,0x1b,0x68,0xc2,0x9e,0x1b,0x69,0xc2,0x9e,0x1b, + 0x69,0xc2,0x9e,0x1b,0x68,0xc2,0x9f,0x1a,0x68,0xc2,0x9f,0x1a,0x68,0xc3,0x9f,0x1b, + 0x67,0xc2,0x9f,0x1b,0x68,0xc3,0xa0,0x1b,0x68,0xc2,0x9f,0x1a,0x68,0xb9,0x8f,0x20, + 0x68,0xb9,0x8f,0x1f,0x68,0xb9,0x8f,0x1f,0x68,0xb9,0x8f,0x1f,0x67,0xb9,0x8f,0x1f, + 0x68,0xb9,0x90,0x1f,0x69,0xb9,0x90,0x20,0x69,0xb9,0x90,0x20,0x6a,0xba,0x91,0x21, + 0x6b,0xba,0x92,0x21,0x6b,0xba,0x91,0x21,0x6b,0xb9,0x91,0x20,0x6b,0xba,0x91,0x20, + 0x6a,0xb9,0x91,0x20,0x69,0xb9,0x91,0x1f,0x69,0xba,0x91,0x1f,0x69,0xb9,0x91,0x1f, + 0x68,0xba,0x91,0x1f,0x68,0xb9,0x90,0x1f,0x67,0xba,0x91,0x1f,0x67,0xba,0x91,0x1f, + 0x68,0xba,0x91,0x1f,0x69,0xba,0x91,0x1f,0x69,0xba,0x92,0x1f,0x69,0xba,0x92,0x20, + 0x6a,0xbb,0x92,0x1f,0x6a,0xba,0x92,0x1f,0x69,0xba,0x92,0x1f,0x69,0xb9,0x92,0x1e, + 0x69,0xba,0x92,0x1f,0x68,0xba,0x92,0x1f,0x68,0xba,0x92,0x1f,0x68,0xbb,0x93,0x1f, + 0x67,0xbb,0x92,0x1f,0x67,0xbb,0x93,0x1e,0x68,0xbb,0x93,0x1e,0x68,0xbb,0x93,0x1e, + 0x68,0xbb,0x93,0x1e,0x67,0xbb,0x93,0x1f,0x68,0xbb,0x93,0x1e,0x69,0xbb,0x94,0x1f, + 0x69,0xbc,0x94,0x1f,0x6b,0xbd,0x95,0x20,0x6c,0xbd,0x95,0x20,0x6d,0xbe,0x96,0x21, + 0x6d,0xbd,0x95,0x20,0x6c,0xbc,0x95,0x20,0x6a,0xbc,0x95,0x1e,0x69,0xbb,0x93,0x1e, + 0x68,0xbc,0x94,0x1e,0x68,0xbc,0x94,0x1e,0x68,0xbc,0x94,0x1e,0x68,0xbc,0x95,0x1f, + 0x6a,0xbe,0x95,0x1f,0x6b,0xbe,0x96,0x20,0x6c,0xbe,0x97,0x21,0x6e,0xbe,0x98,0x20, + 0x6e,0xbe,0x97,0x20,0x6c,0xbd,0x96,0x1f,0x6b,0xbc,0x96,0x1e,0x69,0xbb,0x95,0x1e, + 0x68,0xbc,0x95,0x1e,0x68,0xbc,0x96,0x1d,0x68,0xbc,0x96,0x1d,0x68,0xb2,0x85,0x23, + 0x68,0xb2,0x85,0x23,0x68,0xb2,0x85,0x23,0x67,0xb2,0x85,0x24,0x68,0xb3,0x86,0x22, + 0x69,0xb5,0x88,0x24,0x6c,0xb6,0x8a,0x25,0x6e,0xb8,0x8b,0x26,0x71,0xb9,0x8c,0x27, + 0x73,0xba,0x8e,0x27,0x74,0xba,0x8d,0x27,0x74,0xb9,0x8d,0x27,0x72,0xb9,0x8b,0x26, + 0x71,0xb8,0x8a,0x25,0x6f,0xb6,0x89,0x25,0x6c,0xb5,0x88,0x23,0x6b,0xb3,0x87,0x23, + 0x6a,0xb3,0x87,0x23,0x69,0xb3,0x87,0x23,0x69,0xb3,0x87,0x23,0x69,0xb4,0x87,0x23, + 0x68,0xb4,0x88,0x23,0x6a,0xb6,0x89,0x24,0x6c,0xb8,0x8c,0x25,0x6e,0xb9,0x8b,0x26, + 0x70,0xb9,0x8d,0x25,0x70,0xb9,0x8b,0x25,0x6f,0xb7,0x8b,0x24,0x6d,0xb6,0x89,0x23, + 0x6c,0xb5,0x89,0x23,0x6b,0xb4,0x88,0x22,0x6a,0xb4,0x88,0x22,0x69,0xb4,0x88,0x22, + 0x69,0xb4,0x88,0x22,0x68,0xb4,0x88,0x22,0x68,0xb5,0x88,0x22,0x67,0xb4,0x89,0x22, + 0x67,0xb4,0x89,0x22,0x68,0xb5,0x89,0x22,0x68,0xb6,0x8a,0x22,0x6a,0xb7,0x8b,0x23, + 0x6d,0xbb,0x8f,0x25,0x72,0xbd,0x91,0x28,0x77,0xbf,0x94,0x28,0x7a,0xbf,0x92,0x29, + 0x79,0xbd,0x91,0x27,0x76,0xba,0x8f,0x24,0x70,0xb8,0x8c,0x23,0x6c,0xb6,0x8b,0x21, + 0x69,0xb5,0x8a,0x22,0x69,0xb6,0x8a,0x22,0x69,0xb6,0x8b,0x22,0x6b,0xb9,0x8e,0x24, + 0x6e,0xbc,0x91,0x26,0x72,0xbe,0x94,0x27,0x77,0xc0,0x95,0x29,0x7a,0xc0,0x95,0x28, + 0x7a,0xbd,0x93,0x27,0x76,0xbb,0x90,0x25,0x71,0xb9,0x8e,0x23,0x6d,0xb7,0x8c,0x22, + 0x69,0xb6,0x8b,0x21,0x69,0xb6,0x8b,0x21,0x67,0xb6,0x8b,0x21,0x68,0xac,0x7b,0x26, + 0x68,0xac,0x7c,0x26,0x68,0xac,0x7b,0x26,0x67,0xad,0x7c,0x26,0x6a,0xb0,0x7f,0x28, + 0x6d,0xb4,0x84,0x2a,0x73,0xb8,0x88,0x2c,0x7a,0xbc,0x8c,0x2e,0x82,0xbe,0x8f,0x30, + 0x86,0xbf,0x8f,0x30,0x88,0xbf,0x8f,0x30,0x87,0xbd,0x8f,0x30,0x85,0xbc,0x8d,0x2e, + 0x82,0xba,0x8a,0x2d,0x7d,0xb8,0x88,0x2c,0x79,0xb5,0x85,0x2a,0x74,0xb2,0x82,0x29, + 0x70,0xb1,0x80,0x27,0x6d,0xaf,0x7e,0x26,0x6b,0xaf,0x7e,0x26,0x6a,0xb0,0x80,0x26, + 0x6b,0xb3,0x82,0x28,0x6f,0xb7,0x87,0x2a,0x76,0xba,0x8a,0x2d,0x7c,0xbc,0x8c,0x2e, + 0x80,0xbc,0x8d,0x2d,0x80,0xbb,0x8c,0x2c,0x7d,0xb9,0x89,0x2c,0x79,0xb7,0x87,0x2a, + 0x76,0xb5,0x85,0x29,0x72,0xb3,0x83,0x27,0x6f,0xb1,0x82,0x27,0x6d,0xb0,0x80,0x26, + 0x6b,0xae,0x7f,0x26,0x6a,0xaf,0x7f,0x25,0x69,0xae,0x7f,0x25,0x68,0xaf,0x7e,0x25, + 0x68,0xaf,0x7f,0x25,0x68,0xb0,0x80,0x25,0x69,0xb3,0x83,0x27,0x6e,0xb7,0x88,0x2a, + 0x75,0xbd,0x8e,0x2d,0x80,0xc2,0x93,0x30,0x8a,0xc4,0x96,0x32,0x91,0xc4,0x96,0x32, + 0x91,0xc1,0x93,0x30,0x89,0xbc,0x8e,0x2c,0x7f,0xb7,0x88,0x29,0x74,0xb2,0x84,0x26, + 0x6d,0xb0,0x82,0x25,0x6b,0xb2,0x83,0x26,0x6c,0xb5,0x86,0x28,0x71,0xba,0x8b,0x2a, + 0x79,0xbf,0x91,0x2e,0x83,0xc3,0x96,0x31,0x8e,0xc5,0x98,0x32,0x93,0xc5,0x97,0x31, + 0x91,0xc2,0x94,0x30,0x8b,0xbc,0x8f,0x2c,0x7f,0xb8,0x89,0x28,0x73,0xb3,0x85,0x25, + 0x6d,0xb1,0x82,0x24,0x69,0xb0,0x82,0x24,0x67,0xb0,0x82,0x24,0x68,0xa6,0x71,0x29, + 0x68,0xa6,0x71,0x29,0x68,0xa7,0x71,0x29,0x67,0xaa,0x76,0x2b,0x6d,0xb0,0x7c,0x2d, + 0x75,0xb6,0x84,0x31,0x82,0xbd,0x8c,0x35,0x90,0xc3,0x91,0x37,0x9d,0xc5,0x95,0x38, + 0xa4,0xc6,0x95,0x39,0xa8,0xc6,0x96,0x39,0xa7,0xc5,0x95,0x38,0xa4,0xc3,0x92,0x37, + 0x9f,0xc1,0x90,0x36,0x98,0xbe,0x8c,0x34,0x90,0xba,0x88,0x32,0x87,0xb6,0x83,0x30, + 0x7e,0xb2,0x7f,0x2e,0x78,0xaf,0x7a,0x2c,0x72,0xae,0x79,0x2b,0x70,0xaf,0x7b,0x2c, + 0x73,0xb4,0x81,0x2e,0x7c,0xbb,0x89,0x32,0x88,0xc0,0x8f,0x35,0x94,0xc2,0x92,0x36, + 0x9b,0xc3,0x92,0x36,0x9c,0xc1,0x91,0x36,0x98,0xbf,0x8e,0x34,0x92,0xbc,0x8b,0x32, + 0x8b,0xb9,0x87,0x31,0x84,0xb6,0x84,0x2f,0x7e,0xb2,0x80,0x2e,0x78,0xb0,0x7d,0x2c, + 0x73,0xae,0x7a,0x2a,0x6f,0xab,0x77,0x29,0x6c,0xa9,0x76,0x28,0x6a,0xa9,0x75,0x28, + 0x69,0xa9,0x75,0x28,0x69,0xab,0x78,0x29,0x6c,0xb0,0x7e,0x2c,0x74,0xb9,0x87,0x30, + 0x82,0xc1,0x91,0x35,0x95,0xc7,0x97,0x38,0xa7,0xca,0x9b,0x3a,0xb1,0xca,0x9b,0x39, + 0xb1,0xc6,0x97,0x38,0xa4,0xc0,0x90,0x34,0x93,0xb9,0x87,0x30,0x81,0xb2,0x7f,0x2d, + 0x75,0xaf,0x7d,0x2a,0x70,0xb2,0x7f,0x2b,0x74,0xb7,0x86,0x2e,0x7e,0xbe,0x8d,0x33, + 0x8d,0xc4,0x95,0x36,0x9d,0xc9,0x9a,0x39,0xac,0xcb,0x9c,0x3a,0xb4,0xca,0x9c,0x39, + 0xb2,0xc7,0x98,0x38,0xa5,0xc0,0x90,0x33,0x92,0xb8,0x87,0x2f,0x7f,0xb0,0x7f,0x2b, + 0x71,0xac,0x79,0x28,0x6a,0xab,0x78,0x27,0x67,0xab,0x78,0x27,0x68,0xa0,0x67,0x2c, + 0x68,0xa1,0x67,0x2c,0x68,0xa0,0x67,0x2c,0x67,0xa9,0x72,0x30,0x73,0xb2,0x7c,0x34, + 0x82,0xbc,0x88,0x38,0x96,0xc3,0x91,0x3c,0xac,0xc8,0x96,0x3e,0xbe,0xcb,0x99,0x3f, + 0xc8,0xcc,0x9b,0x40,0xcc,0xcc,0x9b,0x40,0xcc,0xcb,0x9a,0x3f,0xc8,0xcb,0x99,0x3f, + 0xc3,0xc8,0x96,0x3d,0xbb,0xc5,0x93,0x3c,0xb1,0xc2,0x8f,0x3b,0xa5,0xbd,0x89,0x39, + 0x99,0xb8,0x83,0x35,0x8d,0xb3,0x7d,0x33,0x82,0xb1,0x7b,0x32,0x7d,0xb2,0x7d,0x33, + 0x81,0xb9,0x84,0x36,0x8e,0xc0,0x8e,0x3a,0xa1,0xc6,0x93,0x3c,0xb2,0xc9,0x97,0x3d, + 0xbd,0xca,0x98,0x3d,0xbf,0xc9,0x97,0x3d,0xbc,0xc6,0x95,0x3c,0xb3,0xc4,0x92,0x3b, + 0xab,0xc1,0x8e,0x3a,0xa2,0xbe,0x8b,0x38,0x98,0xba,0x85,0x36,0x8e,0xb5,0x80,0x34, + 0x85,0xb0,0x7b,0x31,0x7c,0xad,0x76,0x2f,0x75,0xa8,0x72,0x2d,0x70,0xa6,0x6f,0x2c, + 0x6d,0xa6,0x6e,0x2c,0x6c,0xa8,0x72,0x2d,0x70,0xb1,0x7b,0x31,0x7b,0xbb,0x88,0x36, + 0x91,0xc5,0x93,0x3b,0xac,0xcb,0x9b,0x3e,0xc4,0xce,0x9e,0x3f,0xd0,0xce,0x9d,0x40, + 0xcf,0xcb,0x9b,0x3e,0xc2,0xc5,0x92,0x3a,0xab,0xbc,0x89,0x36,0x92,0xb4,0x80,0x33, + 0x81,0xb1,0x7c,0x31,0x7c,0xb5,0x81,0x33,0x84,0xbc,0x89,0x36,0x93,0xc4,0x92,0x3a, + 0xa8,0xca,0x99,0x3d,0xbc,0xcd,0x9d,0x3e,0xcc,0xcf,0x9f,0x40,0xd4,0xce,0x9f,0x3f, + 0xd0,0xcb,0x9a,0x3d,0xc0,0xc4,0x92,0x3a,0xa5,0xb9,0x86,0x34,0x8b,0xaf,0x79,0x2f, + 0x76,0xa7,0x71,0x2c,0x6b,0xa4,0x6d,0x2a,0x67,0xa4,0x6d,0x2a,0x68,0x9b,0x61,0x2c, + 0x68,0x9b,0x61,0x2c,0x68,0x9a,0x60,0x2c,0x67,0xa8,0x70,0x31,0x79,0xb5,0x7f,0x36, + 0x8f,0xc0,0x8c,0x3c,0xac,0xc8,0x96,0x3f,0xc6,0xcc,0x9a,0x41,0xda,0xcd,0x9b,0x3d, + 0xe4,0xcd,0x9b,0x3c,0xe8,0xce,0x9c,0x3d,0xe8,0xce,0x9c,0x3e,0xe5,0xcd,0x9c,0x40, + 0xe1,0xcc,0x9b,0x41,0xdb,0xcb,0x99,0x40,0xd2,0xc8,0x96,0x3f,0xc7,0xc5,0x91,0x3e, + 0xb9,0xc0,0x8c,0x3c,0xab,0xbb,0x86,0x39,0x9d,0xb7,0x82,0x37,0x94,0xb9,0x84,0x39, + 0x97,0xbe,0x8a,0x3b,0xa5,0xc5,0x93,0x3e,0xbb,0xcb,0x98,0x40,0xd0,0xcc,0x99,0x3e, + 0xdb,0xce,0x9c,0x41,0xde,0xcd,0x9b,0x41,0xdc,0xcc,0x9a,0x41,0xd5,0xca,0x98,0x40, + 0xcd,0xc8,0x96,0x3f,0xc5,0xc5,0x92,0x3e,0xba,0xc2,0x8e,0x3d,0xaf,0xbd,0x89,0x3b, + 0xa1,0xb9,0x83,0x38,0x95,0xb2,0x7c,0x36,0x88,0xad,0x75,0x33,0x7e,0xa8,0x6f,0x31, + 0x75,0xa5,0x6c,0x30,0x72,0xa8,0x6f,0x31,0x76,0xb1,0x79,0x35,0x84,0xbd,0x88,0x3a, + 0x9f,0xc7,0x94,0x3f,0xbf,0xcd,0x9b,0x41,0xd9,0xd4,0xa9,0x56,0xe8,0xd2,0xa3,0x4a, + 0xe6,0xcd,0x9b,0x41,0xd8,0xc8,0x95,0x3f,0xc1,0xc0,0x8c,0x3b,0xa6,0xb9,0x83,0x38, + 0x94,0xb7,0x82,0x37,0x90,0xbc,0x87,0x39,0x9b,0xc3,0x8f,0x3c,0xaf,0xc8,0x96,0x3f, + 0xc5,0xcd,0x9b,0x41,0xd8,0xcf,0x9e,0x3f,0xe5,0xd5,0xaa,0x57,0xeb,0xd2,0xa2,0x4b, + 0xe5,0xcc,0x9a,0x40,0xd1,0xc4,0x91,0x3d,0xb3,0xb8,0x83,0x38,0x93,0xac,0x74,0x33, + 0x7b,0xa2,0x68,0x2e,0x6d,0x9e,0x64,0x2d,0x67,0x9f,0x64,0x2d,0x68,0x96,0x5c,0x2a, + 0x68,0x95,0x5c,0x2a,0x68,0x95,0x5b,0x29,0x66,0xa8,0x71,0x31,0x7f,0xb6,0x82,0x38, + 0x9a,0xc2,0x8f,0x3d,0xbb,0xc9,0x98,0x40,0xd8,0xcf,0xa2,0x4c,0xeb,0xf3,0xe7,0xcf, + 0xfb,0xfa,0xf5,0xec,0xfd,0xf3,0xe7,0xd0,0xfc,0xe6,0xcf,0xa1,0xf9,0xd7,0xae,0x62, + 0xf5,0xcb,0x9a,0x39,0xf0,0xcc,0x9b,0x3e,0xeb,0xcc,0x9b,0x41,0xe3,0xca,0x99,0x40, + 0xd8,0xc6,0x95,0x3f,0xcb,0xc3,0x90,0x3d,0xbd,0xc0,0x8d,0x3b,0xb2,0xc0,0x8e,0x3c, + 0xb3,0xc3,0x91,0x3d,0xbf,0xc8,0x97,0x3f,0xd3,0xcb,0x9b,0x3e,0xe5,0xe5,0xcd,0x9e, + 0xf5,0xcf,0xa0,0x45,0xf2,0xcc,0x9a,0x38,0xf1,0xcd,0x9b,0x3c,0xed,0xcd,0x9d,0x40, + 0xe8,0xcc,0x9c,0x41,0xe2,0xca,0x99,0x40,0xda,0xc8,0x97,0x3f,0xd0,0xc5,0x93,0x3e, + 0xc3,0xc0,0x8e,0x3c,0xb5,0xbb,0x88,0x39,0xa5,0xb5,0x80,0x37,0x96,0xae,0x79,0x35, + 0x88,0xaa,0x72,0x32,0x7f,0xa9,0x73,0x32,0x7f,0xb1,0x7c,0x35,0x8d,0xbd,0x8a,0x3a, + 0xa9,0xc7,0x95,0x3f,0xcb,0xcd,0x9b,0x3f,0xe4,0xf1,0xe2,0xc7,0xfa,0xe8,0xd2,0xa6, + 0xf8,0xcc,0x9a,0x3c,0xe8,0xc9,0x98,0x40,0xd4,0xc4,0x91,0x3d,0xbd,0xbe,0x8c,0x3b, + 0xad,0xbf,0x8b,0x3b,0xac,0xc2,0x90,0x3d,0xb9,0xc8,0x96,0x3f,0xcb,0xcb,0x9b,0x41, + 0xde,0xce,0x9d,0x40,0xec,0xdb,0xb6,0x70,0xf6,0xfe,0xfd,0xfa,0xfe,0xd6,0xae,0x61, + 0xee,0xcb,0x99,0x40,0xd7,0xc3,0x8f,0x3d,0xb8,0xb6,0x81,0x37,0x95,0xa8,0x71,0x32, + 0x7b,0x9d,0x64,0x2d,0x6d,0x99,0x5f,0x2c,0x67,0x99,0x5f,0x2c,0x68,0x90,0x57,0x28, + 0x68,0x90,0x58,0x28,0x68,0x8f,0x56,0x27,0x66,0xa5,0x6f,0x30,0x82,0xb5,0x81,0x38, + 0x9f,0xc1,0x8f,0x3c,0xc1,0xc6,0x95,0x39,0xdf,0xe9,0xd4,0xad,0xf7,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xfb,0xf8,0xf2,0xfe,0xea,0xd7,0xb0,0xfb,0xd8,0xb4,0x6e,0xf6,0xca,0x98,0x3b, + 0xee,0xc9,0x99,0x3f,0xe5,0xc8,0x97,0x3f,0xdb,0xc5,0x94,0x3e,0xd1,0xc5,0x94,0x3e, + 0xd0,0xc7,0x97,0x3f,0xd8,0xca,0x9a,0x40,0xe5,0xd0,0xa3,0x4d,0xf2,0xfb,0xf8,0xf1, + 0xfe,0xff,0xff,0xff,0xff,0xfc,0xfb,0xf7,0xff,0xf0,0xe2,0xc7,0xfc,0xe4,0xca,0x98, + 0xfa,0xd8,0xb3,0x6d,0xf6,0xcd,0x9e,0x42,0xf0,0xca,0x98,0x3b,0xe9,0xc9,0x99,0x40, + 0xe0,0xc7,0x96,0x3f,0xd4,0xc3,0x91,0x3d,0xc6,0xbe,0x8c,0x3a,0xb5,0xb8,0x85,0x38, + 0xa4,0xb1,0x7d,0x36,0x95,0xaf,0x7a,0x34,0x8f,0xb3,0x7f,0x36,0x98,0xbd,0x8a,0x3b, + 0xb1,0xc6,0x95,0x3e,0xd0,0xcb,0x99,0x3d,0xe9,0xf2,0xe6,0xcf,0xfc,0xfc,0xfb,0xf7, + 0xff,0xcd,0x9d,0x41,0xf2,0xca,0x9a,0x40,0xe4,0xc7,0x96,0x3f,0xd3,0xc4,0x93,0x3e, + 0xc9,0xc5,0x93,0x3e,0xca,0xc7,0x96,0x3f,0xd5,0xca,0x9a,0x40,0xe4,0xcc,0x9b,0x3d, + 0xef,0xe1,0xc3,0x8b,0xf9,0xff,0xff,0xff,0xff,0xf3,0xe7,0xd2,0xfc,0xcc,0x9e,0x46, + 0xea,0xc7,0x96,0x3e,0xd2,0xbe,0x8c,0x3b,0xb2,0xb0,0x7c,0x35,0x92,0xa2,0x6c,0x2f, + 0x79,0x98,0x60,0x2b,0x6d,0x94,0x5a,0x2a,0x67,0x94,0x5a,0x29,0x68,0x8c,0x54,0x26, + 0x68,0x8c,0x54,0x25,0x68,0x8a,0x52,0x26,0x66,0xa0,0x6b,0x2e,0x81,0xaf,0x7d,0x35, + 0x9c,0xbd,0x8b,0x3b,0xbe,0xc4,0x94,0x3d,0xda,0xd1,0xaa,0x5f,0xef,0xe5,0xcf,0xa4, + 0xf9,0xe5,0xcf,0xa4,0xfb,0xe6,0xcf,0xa4,0xfd,0xef,0xe2,0xc7,0xfe,0xfd,0xfb,0xf9, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfe,0xf7,0xf0,0xe2, + 0xfe,0xcf,0xa3,0x50,0xf5,0xc9,0x9a,0x3e,0xef,0xc9,0x98,0x3f,0xe9,0xc8,0x98,0x3f, + 0xe7,0xc9,0x9a,0x3f,0xec,0xca,0x9b,0x40,0xf3,0xcf,0xa2,0x4c,0xf8,0xfa,0xf5,0xed, + 0xfe,0xfe,0xfe,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xfe,0xfe,0xfd,0xfe,0xfd,0xfc,0xf9,0xfe,0xe5,0xcd,0xa1,0xfb,0xca,0x9a,0x3e, + 0xf2,0xc9,0x99,0x3f,0xeb,0xc7,0x97,0x3f,0xe1,0xc3,0x93,0x3d,0xd3,0xc0,0x8e,0x3b, + 0xc3,0xba,0x88,0x39,0xb2,0xb6,0x84,0x38,0xa7,0xb6,0x84,0x38,0xa8,0xbc,0x8b,0x3a, + 0xba,0xc4,0x93,0x3d,0xd3,0xc9,0x99,0x3e,0xea,0xe8,0xd3,0xac,0xfa,0xfe,0xfe,0xfd, + 0xfe,0xd7,0xb3,0x6c,0xf9,0xca,0x9b,0x40,0xf0,0xc9,0x99,0x3f,0xe7,0xc8,0x97,0x3f, + 0xe2,0xc7,0x98,0x3f,0xe4,0xca,0x9a,0x40,0xea,0xcb,0x9a,0x3e,0xf2,0xec,0xdb,0xb9, + 0xfc,0xff,0xff,0xff,0xff,0xf1,0xe5,0xcf,0xfd,0xca,0x98,0x3b,0xf0,0xc7,0x97,0x3f, + 0xe0,0xc1,0x8f,0x3c,0xc6,0xb5,0x84,0x38,0xa6,0xa7,0x73,0x32,0x89,0x9a,0x63,0x2b, + 0x75,0x92,0x5a,0x28,0x6b,0x8e,0x56,0x28,0x67,0x8f,0x56,0x28,0x68,0x86,0x4f,0x24, + 0x68,0x86,0x4f,0x24,0x68,0x85,0x4e,0x23,0x66,0x98,0x63,0x2b,0x7c,0xa8,0x74,0x32, + 0x92,0xb5,0x83,0x37,0xb0,0xbe,0x8d,0x3b,0xca,0xc2,0x92,0x3b,0xdc,0xc4,0x93,0x38, + 0xe7,0xc6,0x94,0x39,0xee,0xc7,0x96,0x3a,0xf4,0xc7,0x96,0x38,0xf9,0xc8,0x96,0x37, + 0xfc,0xd1,0xa9,0x5b,0xfe,0xdf,0xc3,0x8d,0xfe,0xf3,0xe8,0xd4,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xe7,0xd3,0xab,0xfb,0xc9,0x9a,0x40,0xf7,0xc8,0x99,0x3e, + 0xf6,0xc9,0x9a,0x3f,0xf7,0xc9,0x9a,0x40,0xfa,0xca,0x9b,0x40,0xfc,0xf5,0xed,0xdc, + 0xfe,0xfc,0xfb,0xf7,0xff,0xcf,0xa3,0x4e,0xff,0xd8,0xb5,0x72,0xfe,0xe5,0xcf,0xa4, + 0xff,0xf5,0xec,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfb,0xf8, + 0xff,0xe9,0xd4,0xaf,0xfb,0xce,0xa4,0x54,0xf3,0xc5,0x95,0x3b,0xea,0xc4,0x95,0x3e, + 0xde,0xc0,0x90,0x3c,0xcf,0xbc,0x8c,0x3a,0xc2,0xbb,0x8a,0x3a,0xbd,0xbd,0x8d,0x3b, + 0xc6,0xc3,0x93,0x3d,0xd8,0xc7,0x98,0x3f,0xeb,0xda,0xb9,0x7b,0xf9,0xff,0xff,0xff, + 0xff,0xe6,0xd0,0xa5,0xfd,0xc9,0x99,0x3e,0xf9,0xc9,0x9a,0x40,0xf5,0xc9,0x9a,0x40, + 0xf2,0xc8,0x98,0x3c,0xf3,0xd0,0xa7,0x57,0xf8,0xf3,0xe9,0xd6,0xfd,0xff,0xff,0xff, + 0xff,0xec,0xdc,0xbc,0xfd,0xc9,0x9b,0x42,0xf3,0xc7,0x97,0x3f,0xe4,0xc0,0x90,0x3c, + 0xce,0xb8,0x86,0x38,0xb2,0xab,0x78,0x33,0x96,0x9d,0x68,0x2d,0x7e,0x92,0x5c,0x28, + 0x71,0x8c,0x54,0x26,0x6a,0x89,0x52,0x25,0x67,0x8a,0x52,0x25,0x68,0x80,0x4a,0x21, + 0x68,0x80,0x4a,0x21,0x68,0x80,0x49,0x21,0x67,0x8e,0x59,0x27,0x75,0x9b,0x68,0x2d, + 0x85,0xa8,0x76,0x32,0x9c,0xb3,0x82,0x36,0xb2,0xba,0x8a,0x39,0xc4,0xbe,0x8e,0x3b, + 0xd3,0xc2,0x92,0x3d,0xe0,0xc4,0x95,0x3d,0xeb,0xc6,0x97,0x3e,0xf4,0xc7,0x98,0x3f, + 0xfb,0xc8,0x99,0x3f,0xfd,0xc8,0x99,0x3f,0xfe,0xc6,0x96,0x39,0xff,0xdb,0xbb,0x7f, + 0xff,0xfd,0xfb,0xf8,0xff,0xff,0xff,0xff,0xff,0xfb,0xf8,0xf4,0xff,0xcb,0x9f,0x4c, + 0xfc,0xc8,0x99,0x3f,0xfd,0xc8,0x99,0x40,0xfd,0xc8,0x98,0x3d,0xfe,0xe0,0xc7,0x95, + 0xfe,0xff,0xff,0xff,0xfe,0xe1,0xc8,0x97,0xff,0xc7,0x98,0x3a,0xff,0xc8,0x99,0x3f, + 0xfd,0xc7,0x97,0x3a,0xfd,0xcc,0xa1,0x4e,0xfd,0xee,0xe0,0xc6,0xfe,0xfd,0xfc,0xfb, + 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xc1,0x8b,0xf9,0xc6,0x96,0x3e, + 0xf0,0xc3,0x94,0x3d,0xe6,0xc1,0x91,0x3d,0xdb,0xbf,0x90,0x3c,0xd3,0xbf,0x8f,0x3b, + 0xd5,0xc2,0x93,0x3d,0xe0,0xc5,0x96,0x3e,0xee,0xcb,0x9f,0x4b,0xf9,0xff,0xff,0xff, + 0xff,0xfb,0xf8,0xf2,0xff,0xc6,0x96,0x38,0xfc,0xc8,0x99,0x3f,0xfb,0xc8,0x99,0x3f, + 0xfb,0xd5,0xb1,0x6d,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xd3,0xad, + 0xfd,0xc7,0x96,0x3b,0xf7,0xc5,0x96,0x3e,0xeb,0xbf,0x90,0x3c,0xd6,0xb7,0x87,0x39, + 0xbc,0xac,0x7b,0x34,0x9e,0x9e,0x6b,0x2e,0x86,0x92,0x5c,0x28,0x75,0x89,0x53,0x25, + 0x6d,0x85,0x4e,0x23,0x69,0x84,0x4d,0x23,0x67,0x84,0x4d,0x23,0x68,0x7c,0x47,0x20, + 0x68,0x7c,0x46,0x20,0x68,0x7b,0x46,0x20,0x67,0x83,0x4e,0x22,0x6f,0x8d,0x59,0x27, + 0x79,0x99,0x67,0x2c,0x88,0xa5,0x73,0x31,0x9b,0xae,0x7e,0x35,0xaf,0xb6,0x86,0x38, + 0xc2,0xbb,0x8d,0x3a,0xd4,0xc0,0x92,0x3c,0xe5,0xc3,0x94,0x3d,0xf1,0xc5,0x97,0x3e, + 0xf9,0xc6,0x97,0x3f,0xfd,0xc6,0x98,0x3f,0xfe,0xc6,0x98,0x3f,0xff,0xc5,0x96,0x3b, + 0xff,0xce,0xa7,0x5a,0xff,0xfc,0xfa,0xf6,0xff,0xff,0xff,0xff,0xfe,0xf3,0xe9,0xd5, + 0xfe,0xc5,0x96,0x3b,0xfe,0xc6,0x98,0x3f,0xfe,0xc6,0x98,0x3f,0xfe,0xc8,0x9a,0x44, + 0xfe,0xff,0xff,0xff,0xff,0xfd,0xfc,0xf9,0xff,0xc5,0x96,0x3b,0xfe,0xc6,0x98,0x3f, + 0xfe,0xc6,0x98,0x3f,0xfc,0xc5,0x97,0x3e,0xf9,0xc3,0x94,0x37,0xf8,0xcb,0xa3,0x54, + 0xf9,0xe0,0xc8,0x9a,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xea,0xd9, + 0xfd,0xc8,0x9d,0x4c,0xf4,0xc2,0x93,0x3b,0xed,0xc1,0x92,0x3c,0xe6,0xc1,0x92,0x3c, + 0xe5,0xc2,0x94,0x3d,0xea,0xc4,0x95,0x3e,0xf2,0xc3,0x93,0x35,0xfa,0xf3,0xe8,0xd6, + 0xfe,0xff,0xff,0xff,0xff,0xda,0xbd,0x83,0xfe,0xc5,0x96,0x3b,0xfe,0xec,0xdd,0xbf, + 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xc2,0x8d,0xfe,0xc6,0x97,0x3d, + 0xfb,0xc5,0x96,0x3e,0xf4,0xc1,0x92,0x3c,0xe4,0xba,0x8a,0x3a,0xcc,0xb0,0x80,0x35, + 0xaf,0xa3,0x70,0x30,0x93,0x94,0x60,0x29,0x7e,0x88,0x54,0x25,0x71,0x82,0x4d,0x22, + 0x6b,0x80,0x4a,0x21,0x69,0x7f,0x49,0x21,0x67,0x7f,0x49,0x21,0x68,0x76,0x42,0x1d, + 0x68,0x77,0x42,0x1d,0x68,0x76,0x42,0x1e,0x67,0x79,0x46,0x1f,0x6b,0x81,0x4d,0x22, + 0x71,0x8d,0x5a,0x26,0x7e,0x9a,0x69,0x2d,0x8f,0xa7,0x77,0x31,0xa5,0xb1,0x82,0x36, + 0xbe,0xb9,0x8a,0x39,0xd4,0xbe,0x8f,0x3b,0xe6,0xc1,0x93,0x3d,0xf2,0xc2,0x95,0x3d, + 0xfa,0xc3,0x95,0x3b,0xfd,0xc3,0x94,0x3c,0xfe,0xc7,0x9c,0x47,0xff,0xca,0xa1,0x52, + 0xff,0xcb,0xa4,0x56,0xff,0xf9,0xf4,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xc2,0x92,0x36,0xfd,0xc4,0x96,0x3d,0xfd,0xc4,0x96,0x3d,0xfd,0xc2,0x92,0x35, + 0xfd,0xf1,0xe8,0xd5,0xfe,0xff,0xff,0xff,0xff,0xd6,0xb6,0x79,0xfe,0xc4,0x96,0x3d, + 0xfc,0xc2,0x95,0x3d,0xf8,0xc2,0x94,0x3d,0xf3,0xc1,0x92,0x3d,0xef,0xc1,0x92,0x3c, + 0xee,0xc0,0x91,0x3a,0xf2,0xc7,0x9c,0x4a,0xf6,0xf2,0xe9,0xd7,0xfd,0xff,0xff,0xff, + 0xff,0xff,0xff,0xfe,0xff,0xcc,0xa6,0x5c,0xf8,0xc2,0x93,0x3c,0xf4,0xc2,0x94,0x3c, + 0xf1,0xc2,0x94,0x3d,0xf3,0xc2,0x94,0x3e,0xf7,0xc2,0x94,0x3a,0xfb,0xd6,0xb7,0x7b, + 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xfe,0xfe,0xfe,0xfe,0xff,0xd6,0xb6,0x78,0xff,0xc4,0x96,0x3c,0xfe,0xc4,0x96,0x3e, + 0xfb,0xc2,0x94,0x3d,0xf4,0xbf,0x90,0x3c,0xe4,0xb8,0x88,0x39,0xcc,0xad,0x7d,0x34, + 0xb0,0xa0,0x6f,0x2f,0x96,0x93,0x60,0x29,0x82,0x87,0x53,0x24,0x74,0x7f,0x4b,0x20, + 0x6d,0x7b,0x46,0x1f,0x69,0x7a,0x45,0x1f,0x67,0x7a,0x45,0x1f,0x68,0x71,0x3d,0x1c, + 0x68,0x71,0x3d,0x1c,0x68,0x71,0x3e,0x1c,0x67,0x74,0x40,0x1d,0x6a,0x7b,0x48,0x20, + 0x70,0x88,0x56,0x25,0x7d,0x98,0x68,0x2c,0x92,0xa8,0x78,0x32,0xad,0xb2,0x84,0x37, + 0xc8,0xb9,0x8c,0x3a,0xde,0xbe,0x90,0x3c,0xed,0xbe,0x8e,0x35,0xf7,0xc3,0x98,0x45, + 0xfc,0xe1,0xca,0xa0,0xfe,0xf5,0xec,0xde,0xff,0xf9,0xf4,0xeb,0xfe,0xfc,0xf9,0xf5, + 0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xed,0xdf,0xc6, + 0xfe,0xc0,0x92,0x3a,0xfa,0xc1,0x93,0x3d,0xf9,0xc1,0x93,0x3d,0xf9,0xc1,0x93,0x3b, + 0xfb,0xda,0xc0,0x8d,0xfe,0xff,0xff,0xff,0xff,0xeb,0xdc,0xc0,0xfe,0xc1,0x93,0x3c, + 0xfb,0xc0,0x92,0x3c,0xf4,0xbe,0x90,0x3b,0xea,0xbb,0x8d,0x3a,0xe1,0xba,0x8c,0x3a, + 0xde,0xbb,0x8d,0x3b,0xe3,0xbd,0x8f,0x3a,0xeb,0xc0,0x92,0x3c,0xf4,0xdc,0xc3,0x92, + 0xfb,0xff,0xff,0xff,0xff,0xfc,0xfa,0xf7,0xfe,0xc4,0x9a,0x48,0xfb,0xc1,0x93,0x3c, + 0xf9,0xc1,0x94,0x3d,0xf9,0xc1,0x94,0x3d,0xfb,0xc2,0x94,0x3d,0xfd,0xc4,0x97,0x41, + 0xfe,0xfc,0xf9,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xfd,0xfd,0xfb,0xff,0xea,0xda,0xbc,0xff,0xc5,0x9a,0x48,0xfd,0xc0,0x91,0x36, + 0xfc,0xc1,0x93,0x3d,0xf6,0xbe,0x90,0x3b,0xeb,0xb9,0x8a,0x39,0xd8,0xb1,0x82,0x36, + 0xc0,0xa7,0x77,0x31,0xa8,0x9a,0x69,0x2c,0x92,0x8c,0x5b,0x27,0x7f,0x82,0x4e,0x22, + 0x73,0x79,0x45,0x1f,0x6b,0x74,0x40,0x1d,0x67,0x74,0x41,0x1d,0x68,0x6b,0x39,0x1a, + 0x68,0x6b,0x38,0x19,0x68,0x6b,0x39,0x1a,0x67,0x70,0x3e,0x1b,0x6b,0x7b,0x48,0x1f, + 0x74,0x8a,0x5a,0x26,0x85,0x9d,0x6d,0x2e,0x9f,0xab,0x7d,0x34,0xbd,0xb5,0x87,0x38, + 0xd8,0xba,0x8b,0x37,0xeb,0xc9,0xa4,0x5e,0xf7,0xe9,0xd9,0xbd,0xfd,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xfb,0xf9,0xf4,0xfe,0xf5,0xee,0xe1,0xfe,0xea,0xdc,0xc1,0xfe,0xc3,0x98,0x49, + 0xfa,0xbd,0x91,0x3b,0xf4,0xbc,0x8f,0x3b,0xf0,0xbc,0x8f,0x3b,0xf1,0xbd,0x90,0x3b, + 0xf5,0xc9,0xa4,0x5c,0xfa,0xfd,0xfc,0xfb,0xfe,0xfe,0xfe,0xfd,0xff,0xc1,0x96,0x43, + 0xfb,0xbd,0x8f,0x3a,0xf2,0xb9,0x8c,0x3a,0xe4,0xb6,0x87,0x38,0xd6,0xb3,0x85,0x37, + 0xcf,0xb4,0x86,0x37,0xd2,0xb8,0x8a,0x38,0xde,0xbb,0x8e,0x3a,0xec,0xbb,0x8b,0x31, + 0xf6,0xdf,0xc9,0x9e,0xfd,0xff,0xff,0xff,0xff,0xf2,0xe9,0xd9,0xfe,0xc0,0x94,0x3e, + 0xfd,0xbf,0x93,0x3c,0xfd,0xc0,0x93,0x3c,0xfd,0xc0,0x93,0x3c,0xfe,0xc0,0x93,0x3d, + 0xfe,0xec,0xdf,0xc6,0xff,0xff,0xff,0xff,0xff,0xfa,0xf7,0xf0,0xff,0xf3,0xec,0xdd, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xe6,0xd4,0xb3, + 0xfe,0xca,0xa5,0x5d,0xfb,0xbd,0x8e,0x37,0xf3,0xbb,0x8d,0x3a,0xe8,0xb6,0x88,0x38, + 0xd6,0xaf,0x80,0x35,0xc1,0xa4,0x75,0x31,0xab,0x97,0x67,0x2b,0x93,0x88,0x56,0x25, + 0x7f,0x79,0x46,0x1f,0x70,0x6f,0x3b,0x1b,0x67,0x70,0x3c,0x1b,0x68,0x67,0x35,0x18, + 0x68,0x67,0x35,0x18,0x68,0x66,0x34,0x17,0x67,0x6c,0x3b,0x1a,0x6c,0x7a,0x49,0x1f, + 0x78,0x8e,0x5e,0x27,0x8e,0xa1,0x73,0x2f,0xae,0xaf,0x81,0x35,0xce,0xb6,0x89,0x37, + 0xe6,0xd1,0xb3,0x7a,0xf7,0xfd,0xfc,0xfa,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xfe,0xf2,0xe9,0xd9,0xff,0xd9,0xc0,0x90,0xff,0xcc,0xa8,0x66,0xff,0xc1,0x97,0x46, + 0xff,0xc0,0x95,0x44,0xff,0xbf,0x93,0x40,0xfe,0xbd,0x91,0x3b,0xfb,0xbb,0x8e,0x3b, + 0xf5,0xb9,0x8c,0x39,0xeb,0xb7,0x89,0x39,0xe4,0xb7,0x89,0x39,0xe4,0xb9,0x8b,0x39, + 0xec,0xba,0x8d,0x38,0xf6,0xfa,0xf6,0xf0,0xfe,0xff,0xff,0xff,0xff,0xe5,0xd5,0xb5, + 0xfd,0xb9,0x8a,0x33,0xf3,0xb7,0x8a,0x38,0xe5,0xb2,0x85,0x37,0xd5,0xae,0x80,0x35, + 0xc9,0xae,0x80,0x35,0xca,0xb3,0x85,0x37,0xd5,0xb8,0x8b,0x39,0xe6,0xbb,0x8e,0x3b, + 0xf3,0xbe,0x92,0x40,0xfb,0xf3,0xeb,0xdc,0xfe,0xff,0xff,0xff,0xff,0xcb,0xa6,0x62, + 0xff,0xbe,0x90,0x3b,0xfd,0xbe,0x91,0x3c,0xfe,0xbe,0x91,0x3c,0xfe,0xbf,0x92,0x3b, + 0xff,0xd7,0xbc,0x87,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0x95,0x42, + 0xff,0xc6,0x9f,0x54,0xff,0xed,0xe1,0xca,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xfd,0xfc,0xfb,0xfe,0xeb,0xdd,0xc5,0xfc,0xbd,0x90,0x3c,0xf5,0xb8,0x8b,0x39, + 0xe9,0xb5,0x87,0x38,0xda,0xad,0x7f,0x35,0xc5,0xa1,0x73,0x2f,0xaa,0x92,0x62,0x29, + 0x90,0x7c,0x4b,0x20,0x77,0x69,0x37,0x18,0x67,0x6a,0x38,0x19,0x68,0x63,0x32,0x16, + 0x68,0x63,0x32,0x16,0x68,0x62,0x31,0x16,0x67,0x6b,0x3a,0x19,0x6e,0x7b,0x4a,0x20, + 0x7c,0x91,0x62,0x29,0x95,0xa4,0x77,0x31,0xb7,0xb0,0x83,0x36,0xd8,0xba,0x8f,0x40, + 0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xef,0xe4,0xff,0xca,0xa7,0x64, + 0xff,0xb8,0x89,0x30,0xff,0xba,0x8d,0x35,0xff,0xbb,0x8e,0x38,0xff,0xbc,0x90,0x3a, + 0xff,0xbb,0x90,0x3a,0xff,0xbb,0x8f,0x3a,0xfd,0xbb,0x8e,0x3a,0xfa,0xb9,0x8c,0x39, + 0xf1,0xb4,0x88,0x38,0xe4,0xb0,0x84,0x36,0xd8,0xb1,0x84,0x36,0xd7,0xb4,0x87,0x38, + 0xe2,0xb7,0x89,0x34,0xef,0xda,0xc1,0x94,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xfe,0xc0,0x97,0x4b,0xf7,0xb7,0x8b,0x39,0xeb,0xb3,0x86,0x37,0xdd,0xaf,0x82,0x36, + 0xd2,0xaf,0x81,0x35,0xd0,0xb1,0x84,0x36,0xd9,0xb6,0x89,0x38,0xe7,0xb9,0x8d,0x39, + 0xf3,0xbb,0x8e,0x3a,0xfb,0xe2,0xcf,0xac,0xfe,0xff,0xff,0xff,0xff,0xea,0xdd,0xc3, + 0xfe,0xb9,0x8b,0x32,0xff,0xbc,0x8f,0x3a,0xff,0xbc,0x8f,0x3b,0xff,0xbc,0x90,0x3a, + 0xff,0xbe,0x92,0x3e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xd0,0xac, + 0xff,0xbc,0x8f,0x38,0xff,0xb9,0x8a,0x31,0xff,0xc6,0xa0,0x57,0xff,0xe2,0xd1,0xad, + 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfd,0xfc,0xfb,0xff,0xd6,0xbb,0x89, + 0xf9,0xb5,0x87,0x32,0xec,0xb2,0x84,0x37,0xda,0xa8,0x7b,0x32,0xc0,0x99,0x69,0x2c, + 0xa1,0x80,0x50,0x22,0x7f,0x63,0x32,0x17,0x67,0x65,0x33,0x17,0x68,0x61,0x30,0x15, + 0x68,0x61,0x30,0x15,0x68,0x61,0x30,0x15,0x67,0x6b,0x3a,0x19,0x6f,0x7b,0x4c,0x20, + 0x7d,0x91,0x63,0x29,0x98,0xa4,0x77,0x31,0xbc,0xb1,0x83,0x34,0xdb,0xd2,0xb7,0x85, + 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xce,0xae,0x72,0xff,0xbb,0x8e,0x3a, + 0xff,0xbb,0x8e,0x3b,0xff,0xbb,0x8f,0x3a,0xff,0xbb,0x8f,0x3a,0xff,0xbb,0x8e,0x3a, + 0xff,0xbc,0x8e,0x3a,0xff,0xbb,0x90,0x3c,0xfd,0xbb,0x8e,0x3a,0xfa,0xb8,0x8a,0x39, + 0xef,0xb2,0x86,0x37,0xdf,0xad,0x80,0x35,0xcf,0xad,0x80,0x34,0xcd,0xb1,0x84,0x36, + 0xd9,0xb6,0x8a,0x38,0xeb,0xb7,0x8b,0x36,0xf7,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe, + 0xff,0xd9,0xbf,0x91,0xfc,0xb8,0x8c,0x38,0xf4,0xb6,0x89,0x39,0xea,0xb3,0x86,0x37, + 0xe3,0xb4,0x87,0x38,0xe1,0xb4,0x88,0x37,0xe6,0xb6,0x8a,0x38,0xed,0xb9,0x8d,0x39, + 0xf6,0xba,0x8e,0x3a,0xfc,0xe5,0xd4,0xb4,0xfe,0xff,0xff,0xff,0xfe,0xef,0xe6,0xd3, + 0xff,0xb8,0x8a,0x31,0xfe,0xbb,0x8e,0x3b,0xfe,0xbb,0x8f,0x3b,0xfe,0xbc,0x8e,0x3b, + 0xff,0xb9,0x8c,0x34,0xfe,0xe1,0xce,0xaa,0xff,0xff,0xff,0xff,0xff,0xf8,0xf4,0xec, + 0xff,0xbf,0x95,0x45,0xff,0xbb,0x8e,0x3a,0xff,0xbb,0x8f,0x3b,0xff,0xbb,0x8f,0x39, + 0xff,0xc0,0x96,0x48,0xff,0xf6,0xf1,0xe6,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff, + 0xff,0xe2,0xcf,0xae,0xf9,0xb5,0x89,0x38,0xe7,0xad,0x80,0x34,0xce,0x9e,0x71,0x2e, + 0xae,0x84,0x54,0x23,0x86,0x61,0x30,0x15,0x66,0x62,0x31,0x16,0x68,0x60,0x2f,0x15, + 0x68,0x60,0x2f,0x15,0x68,0x5f,0x2e,0x15,0x67,0x69,0x38,0x18,0x6e,0x78,0x49,0x1e, + 0x7c,0x8f,0x60,0x28,0x96,0xa2,0x75,0x30,0xb8,0xaf,0x83,0x35,0xd9,0xba,0x90,0x43, + 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf2,0xe9,0xda,0xff,0xc1,0x9a,0x4f, + 0xff,0xb7,0x88,0x2f,0xff,0xba,0x8d,0x38,0xff,0xbb,0x8e,0x3a,0xff,0xba,0x8e,0x39, + 0xff,0xb8,0x8a,0x33,0xfe,0xe3,0xd2,0xb1,0xfe,0xed,0xe1,0xcb,0xfd,0xb6,0x8b,0x39, + 0xf0,0xb2,0x85,0x36,0xdd,0xab,0x7e,0x34,0xcc,0xa9,0x7b,0x33,0xc7,0xad,0x80,0x35, + 0xd3,0xb3,0x87,0x37,0xe5,0xb8,0x8c,0x39,0xf4,0xf7,0xf3,0xea,0xfe,0xff,0xff,0xff, + 0xff,0xfa,0xf7,0xf2,0xfe,0xb7,0x89,0x33,0xfa,0xb4,0x86,0x2f,0xf6,0xb5,0x86,0x32, + 0xf1,0xb4,0x86,0x31,0xf0,0xb5,0x87,0x32,0xf2,0xb6,0x87,0x32,0xf6,0xba,0x8d,0x39, + 0xfb,0xdb,0xc4,0x98,0xfe,0xfd,0xfc,0xfa,0xff,0xff,0xff,0xff,0xff,0xcf,0xb0,0x76, + 0xfd,0xba,0x8d,0x38,0xfc,0xba,0x8e,0x3a,0xfc,0xbb,0x8e,0x3b,0xfd,0xb9,0x8a,0x33, + 0xfe,0xc2,0x9b,0x50,0xff,0xc7,0xa2,0x5c,0xff,0xfd,0xfc,0xfa,0xff,0xff,0xff,0xff, + 0xff,0xd4,0xb9,0x84,0xff,0xb9,0x8b,0x35,0xff,0xbb,0x8f,0x3b,0xff,0xbb,0x8f,0x3a, + 0xff,0xba,0x8d,0x37,0xff,0xb8,0x8b,0x34,0xff,0xf1,0xe9,0xd8,0xff,0xff,0xff,0xff, + 0xfe,0xfe,0xfd,0xfc,0xff,0xb9,0x8f,0x43,0xee,0xaf,0x82,0x35,0xd6,0xa1,0x74,0x2f, + 0xb5,0x86,0x57,0x24,0x89,0x5f,0x2e,0x15,0x66,0x61,0x30,0x15,0x68,0x5e,0x2d,0x14, + 0x68,0x5e,0x2d,0x14,0x68,0x5e,0x2d,0x14,0x67,0x66,0x36,0x17,0x6d,0x73,0x43,0x1c, + 0x78,0x88,0x59,0x25,0x8e,0x9c,0x6e,0x2d,0xad,0xaa,0x7d,0x34,0xcc,0xb2,0x86,0x36, + 0xe5,0xc9,0xa8,0x6b,0xf5,0xfb,0xf8,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xfe,0xe9,0xdc,0xc4,0xff,0xca,0xa8,0x69,0xff,0xc0,0x98,0x4c,0xff,0xc1,0x9a,0x4f, + 0xff,0xd1,0xb3,0x7b,0xff,0xfa,0xf6,0xf0,0xfe,0xff,0xff,0xff,0xff,0xbd,0x96,0x4e, + 0xef,0xb0,0x83,0x35,0xdb,0xa8,0x7b,0x33,0xc7,0xa5,0x78,0x31,0xc0,0xaa,0x7d,0x33, + 0xcb,0xb1,0x84,0x35,0xdf,0xbf,0x99,0x51,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xf0,0xe7,0xd6,0xfe,0xe1,0xcf,0xac, + 0xfc,0xe1,0xd0,0xae,0xfc,0xe1,0xd0,0xad,0xfc,0xe5,0xd5,0xb6,0xfd,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfe,0xe9,0xdc,0xc3,0xfd,0xb9,0x8d,0x3a, + 0xf8,0xb8,0x8c,0x39,0xf7,0xb8,0x8c,0x39,0xf8,0xb7,0x89,0x33,0xfa,0xdf,0xca,0xa5, + 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xf4,0xed,0xe1,0xff,0xc7,0xa1,0x5c,0xff,0xc2,0x9a,0x4f,0xff,0xc1,0x99,0x4e, + 0xff,0xce,0xad,0x71,0xff,0xe6,0xd6,0xb9,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff, + 0xff,0xfd,0xfc,0xfb,0xff,0xb9,0x8f,0x42,0xed,0xae,0x81,0x35,0xd6,0xa1,0x73,0x2f, + 0xb4,0x84,0x56,0x24,0x89,0x5e,0x2d,0x14,0x66,0x5f,0x2e,0x14,0x68,0x5d,0x2c,0x14, + 0x68,0x5d,0x2c,0x14,0x68,0x5d,0x2c,0x13,0x67,0x61,0x31,0x15,0x6b,0x6c,0x3c,0x1a, + 0x73,0x7e,0x4f,0x21,0x84,0x91,0x63,0x29,0x9d,0xa2,0x75,0x2f,0xba,0xac,0x80,0x34, + 0xd4,0xb2,0x84,0x34,0xe6,0xbe,0x97,0x4e,0xf3,0xe1,0xcf,0xad,0xfb,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xe9,0xdc,0xfd,0xb0,0x82,0x2f, + 0xe9,0xad,0x80,0x34,0xd4,0xa4,0x77,0x31,0xbe,0x9f,0x72,0x2f,0xb4,0xa4,0x77,0x31, + 0xbe,0xad,0x80,0x34,0xd3,0xb2,0x85,0x35,0xe7,0xcb,0xac,0x73,0xf6,0xf9,0xf5,0xee, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xe2,0xd2,0xb1,0xfb,0xc5,0xa2,0x62,0xf5,0xb5,0x88,0x37,0xf0,0xb4,0x88,0x38, + 0xea,0xb4,0x87,0x37,0xe9,0xb4,0x88,0x38,0xeb,0xb4,0x87,0x34,0xf1,0xd0,0xb4,0x7f, + 0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xce,0xb1,0x7c,0xf5,0xb3,0x86,0x37,0xe5,0xaa,0x7d,0x33,0xcd,0x9c,0x6d,0x2d, + 0xac,0x80,0x51,0x22,0x85,0x5c,0x2b,0x13,0x67,0x5e,0x2d,0x14,0x68,0x5b,0x2b,0x13, + 0x68,0x5b,0x2b,0x12,0x68,0x5b,0x2b,0x12,0x67,0x5d,0x2d,0x13,0x69,0x64,0x34,0x16, + 0x6e,0x71,0x42,0x1c,0x79,0x83,0x54,0x23,0x8b,0x94,0x67,0x2a,0xa3,0xa2,0x74,0x30, + 0xbb,0xaa,0x7d,0x33,0xd1,0xb0,0x83,0x36,0xe0,0xb1,0x83,0x30,0xea,0xb3,0x87,0x33, + 0xf1,0xcd,0xb0,0x79,0xf7,0xe3,0xd3,0xb5,0xfb,0xf0,0xe8,0xd8,0xfd,0xf5,0xf0,0xe5, + 0xfd,0xf7,0xf3,0xea,0xfd,0xea,0xdf,0xc9,0xfb,0xb7,0x8c,0x3f,0xee,0xaf,0x82,0x35, + 0xdd,0xa6,0x79,0x32,0xc6,0x9a,0x6e,0x2d,0xae,0x95,0x67,0x2a,0xa4,0x99,0x6d,0x2c, + 0xac,0xa4,0x77,0x31,0xc1,0xad,0x80,0x35,0xd7,0xb1,0x84,0x33,0xe7,0xba,0x91,0x46, + 0xf1,0xe6,0xd8,0xbe,0xfa,0xb8,0x8e,0x40,0xf5,0xc7,0xa6,0x69,0xf7,0xcf,0xb4,0x80, + 0xf7,0xcf,0xb3,0x7f,0xf7,0xcc,0xad,0x76,0xf6,0xbf,0x98,0x51,0xf3,0xb1,0x82,0x2d, + 0xef,0xb1,0x83,0x30,0xeb,0xb0,0x84,0x36,0xe3,0xae,0x81,0x34,0xdb,0xab,0x7f,0x34, + 0xd3,0xaa,0x7d,0x34,0xd0,0xac,0x80,0x34,0xd5,0xb0,0x83,0x36,0xdf,0xb2,0x84,0x33, + 0xea,0xba,0x92,0x48,0xf2,0xda,0xc4,0x9b,0xf9,0xee,0xe3,0xd1,0xfc,0xf3,0xec,0xe0, + 0xfd,0xf6,0xf1,0xe7,0xfd,0xf7,0xf2,0xea,0xfe,0xf6,0xf1,0xe8,0xfd,0xf4,0xee,0xe2, + 0xfd,0xf1,0xe8,0xd9,0xfd,0xe6,0xd7,0xbc,0xfb,0xce,0xb0,0x7b,0xf7,0xb2,0x85,0x32, + 0xef,0xb1,0x84,0x34,0xe5,0xac,0x80,0x34,0xd4,0xa2,0x75,0x30,0xbb,0x91,0x63,0x29, + 0x9e,0x77,0x48,0x1f,0x7e,0x5b,0x2a,0x12,0x67,0x5c,0x2c,0x13,0x68,0x59,0x2a,0x12, + 0x68,0x59,0x2a,0x12,0x68,0x5a,0x2a,0x13,0x67,0x5a,0x2b,0x13,0x68,0x5d,0x2e,0x14, + 0x6b,0x65,0x35,0x17,0x71,0x72,0x44,0x1c,0x7b,0x82,0x54,0x22,0x8b,0x91,0x63,0x29, + 0x9f,0x9c,0x6f,0x2d,0xb3,0xa5,0x78,0x31,0xc5,0xaa,0x7d,0x34,0xd2,0xad,0x82,0x35, + 0xdc,0xb0,0x83,0x34,0xe3,0xb1,0x84,0x34,0xe8,0xb3,0x87,0x38,0xeb,0xb6,0x8c,0x3f, + 0xed,0xb6,0x8d,0x41,0xec,0xb2,0x86,0x37,0xe7,0xad,0x81,0x35,0xdc,0xa7,0x7b,0x32, + 0xca,0x9b,0x6e,0x2e,0xb1,0x8d,0x60,0x27,0x9a,0x86,0x58,0x24,0x90,0x8b,0x5c,0x26, + 0x96,0x96,0x69,0x2b,0xa8,0xa1,0x75,0x30,0xbd,0xaa,0x7d,0x33,0xd0,0xae,0x81,0x35, + 0xdc,0xaf,0x82,0x34,0xe2,0xb0,0x84,0x36,0xe4,0xb0,0x83,0x35,0xe2,0xb0,0x83,0x35, + 0xe2,0xaf,0x83,0x35,0xe0,0xae,0x82,0x34,0xdf,0xad,0x81,0x35,0xdc,0xac,0x80,0x34, + 0xd9,0xaa,0x7e,0x33,0xd1,0xa6,0x79,0x31,0xc7,0xa1,0x74,0x30,0xbb,0x9c,0x6f,0x2d, + 0xb2,0x9a,0x6e,0x2d,0xaf,0x9e,0x71,0x2e,0xb6,0xa5,0x78,0x31,0xc4,0xaa,0x7e,0x34, + 0xd3,0xaf,0x82,0x35,0xde,0xb1,0x84,0x34,0xe5,0xb2,0x86,0x36,0xea,0xb5,0x8a,0x3d, + 0xec,0xb6,0x8c,0x41,0xee,0xb7,0x8e,0x41,0xef,0xb7,0x8d,0x41,0xee,0xb6,0x8b,0x3e, + 0xed,0xb4,0x88,0x3a,0xeb,0xb1,0x84,0x35,0xe8,0xb0,0x83,0x35,0xe3,0xad,0x81,0x34, + 0xdb,0xa8,0x7c,0x33,0xce,0xa1,0x74,0x2f,0xbb,0x94,0x67,0x2a,0xa3,0x83,0x55,0x23, + 0x8c,0x6c,0x3e,0x1a,0x76,0x5a,0x2a,0x12,0x67,0x5a,0x2a,0x13,0x68,0x57,0x28,0x11, + 0x68,0x58,0x28,0x11,0x68,0x58,0x28,0x11,0x67,0x58,0x28,0x11,0x68,0x59,0x29,0x11, + 0x69,0x5c,0x2d,0x13,0x6b,0x64,0x35,0x16,0x70,0x6f,0x41,0x1b,0x79,0x7c,0x4e,0x20, + 0x86,0x89,0x5b,0x25,0x95,0x93,0x66,0x2a,0xa4,0x9a,0x6e,0x2d,0xb1,0xa1,0x73,0x30, + 0xbd,0xa4,0x78,0x31,0xc6,0xa7,0x7a,0x32,0xcd,0xa8,0x7c,0x33,0xd1,0xaa,0x7d,0x33, + 0xd4,0xa9,0x7d,0x33,0xd2,0xa7,0x7a,0x32,0xcc,0xa2,0x76,0x30,0xc1,0x99,0x6c,0x2d, + 0xaf,0x8c,0x5e,0x26,0x99,0x7d,0x4f,0x21,0x87,0x74,0x45,0x1d,0x7e,0x77,0x49,0x1f, + 0x81,0x84,0x55,0x24,0x8e,0x91,0x63,0x29,0xa0,0x9a,0x6d,0x2d,0xb1,0xa0,0x74,0x30, + 0xbe,0xa3,0x77,0x31,0xc4,0xa4,0x77,0x31,0xc5,0xa4,0x78,0x30,0xc4,0xa2,0x76,0x31, + 0xc2,0xa2,0x75,0x30,0xc0,0xa1,0x75,0x30,0xbf,0xa0,0x74,0x2f,0xbc,0x9d,0x71,0x2e, + 0xb7,0x99,0x6c,0x2d,0xaf,0x93,0x66,0x2a,0xa5,0x8d,0x5f,0x27,0x9a,0x86,0x59,0x25, + 0x91,0x85,0x57,0x24,0x90,0x8a,0x5c,0x26,0x97,0x93,0x66,0x2a,0xa4,0x9b,0x6e,0x2d, + 0xb3,0xa1,0x75,0x30,0xbf,0xa6,0x79,0x31,0xc9,0xa9,0x7c,0x33,0xcf,0xaa,0x7d,0x33, + 0xd3,0xab,0x7e,0x33,0xd5,0xab,0x7f,0x33,0xd6,0xab,0x7f,0x33,0xd5,0xaa,0x7e,0x33, + 0xd4,0xa9,0x7d,0x33,0xd1,0xa7,0x7b,0x32,0xcc,0xa4,0x78,0x31,0xc5,0xa0,0x73,0x2f, + 0xbb,0x99,0x6c,0x2c,0xae,0x8f,0x62,0x28,0x9d,0x82,0x53,0x23,0x8c,0x73,0x44,0x1c, + 0x7c,0x63,0x33,0x16,0x6f,0x58,0x29,0x11,0x67,0x59,0x29,0x12,0x68,0x56,0x27,0x11, + 0x68,0x56,0x27,0x11,0x68,0x56,0x27,0x11,0x68,0x57,0x27,0x12,0x67,0x57,0x27,0x12, + 0x68,0x57,0x28,0x11,0x69,0x5a,0x2b,0x12,0x6b,0x61,0x32,0x15,0x6f,0x68,0x39,0x18, + 0x75,0x72,0x44,0x1c,0x7e,0x7b,0x4d,0x20,0x87,0x84,0x56,0x24,0x91,0x8b,0x5e,0x27, + 0x9a,0x91,0x64,0x29,0xa3,0x95,0x68,0x2b,0xaa,0x98,0x6b,0x2d,0xae,0x99,0x6c,0x2c, + 0xb0,0x99,0x6c,0x2c,0xaf,0x96,0x69,0x2b,0xaa,0x8f,0x62,0x28,0xa0,0x85,0x58,0x24, + 0x93,0x78,0x4a,0x1e,0x83,0x6b,0x3d,0x19,0x78,0x64,0x35,0x16,0x71,0x67,0x38,0x17, + 0x74,0x6f,0x41,0x1b,0x7b,0x7b,0x4d,0x1f,0x87,0x85,0x58,0x24,0x92,0x8c,0x5e,0x27, + 0x9b,0x90,0x62,0x28,0xa1,0x90,0x63,0x29,0xa1,0x8f,0x62,0x29,0x9f,0x8e,0x61,0x28, + 0x9f,0x8d,0x60,0x28,0x9d,0x8d,0x5f,0x27,0x9c,0x8a,0x5d,0x27,0x99,0x86,0x59,0x25, + 0x94,0x83,0x55,0x23,0x8f,0x7b,0x4e,0x20,0x87,0x74,0x46,0x1d,0x80,0x6e,0x40,0x1b, + 0x7a,0x6e,0x3f,0x1b,0x79,0x73,0x44,0x1c,0x7e,0x7c,0x4e,0x21,0x87,0x86,0x58,0x25, + 0x92,0x8d,0x60,0x28,0x9d,0x93,0x66,0x2a,0xa6,0x96,0x69,0x2b,0xab,0x99,0x6c,0x2d, + 0xb0,0x9a,0x6d,0x2d,0xb2,0x9a,0x6e,0x2d,0xb3,0x9a,0x6d,0x2d,0xb2,0x99,0x6c,0x2d, + 0xb1,0x98,0x6b,0x2c,0xae,0x95,0x68,0x2b,0xa9,0x90,0x63,0x28,0xa2,0x8b,0x5d,0x26, + 0x9a,0x83,0x55,0x23,0x8f,0x79,0x4b,0x1f,0x84,0x6e,0x3f,0x1a,0x79,0x63,0x35,0x16, + 0x71,0x5c,0x2c,0x13,0x6b,0x57,0x27,0x11,0x67,0x57,0x28,0x12,0x68,0x54,0x25,0x10, + 0x68,0x54,0x25,0x10,0x68,0x54,0x25,0x10,0x68,0x54,0x25,0x10,0x68,0x54,0x25,0x10, + 0x67,0x55,0x25,0x11,0x68,0x55,0x26,0x10,0x69,0x57,0x29,0x11,0x69,0x5b,0x2c,0x12, + 0x6c,0x60,0x31,0x15,0x6f,0x67,0x39,0x17,0x75,0x6e,0x40,0x1b,0x7b,0x75,0x47,0x1e, + 0x81,0x7b,0x4d,0x20,0x87,0x7f,0x52,0x22,0x8d,0x83,0x55,0x23,0x91,0x84,0x56,0x24, + 0x92,0x83,0x56,0x24,0x91,0x80,0x53,0x22,0x8d,0x79,0x4c,0x20,0x86,0x71,0x43,0x1b, + 0x7e,0x67,0x39,0x18,0x75,0x5f,0x31,0x14,0x6f,0x5b,0x2c,0x13,0x6d,0x5d,0x2d,0x14, + 0x6d,0x61,0x33,0x16,0x71,0x68,0x3a,0x18,0x76,0x6f,0x42,0x1b,0x7c,0x75,0x47,0x1d, + 0x81,0x77,0x4a,0x1f,0x84,0x77,0x4a,0x1f,0x84,0x77,0x4a,0x1e,0x83,0x76,0x48,0x1e, + 0x83,0x75,0x48,0x1e,0x81,0x74,0x46,0x1e,0x81,0x72,0x44,0x1c,0x7f,0x6f,0x41,0x1b, + 0x7c,0x6a,0x3c,0x1a,0x78,0x66,0x37,0x17,0x73,0x60,0x32,0x15,0x70,0x5e,0x2f,0x14, + 0x6e,0x5d,0x2f,0x14,0x6e,0x61,0x32,0x15,0x70,0x67,0x39,0x18,0x75,0x6e,0x40,0x1a, + 0x7b,0x74,0x47,0x1d,0x81,0x7a,0x4c,0x1f,0x87,0x7e,0x51,0x21,0x8b,0x81,0x53,0x22, + 0x8e,0x83,0x54,0x23,0x90,0x83,0x56,0x23,0x90,0x83,0x55,0x23,0x90,0x81,0x54,0x22, + 0x8e,0x7f,0x52,0x22,0x8c,0x7c,0x4f,0x20,0x89,0x78,0x4a,0x1f,0x84,0x73,0x44,0x1c, + 0x7f,0x6c,0x3e,0x1a,0x79,0x65,0x36,0x17,0x73,0x5e,0x2f,0x14,0x6e,0x5a,0x2b,0x12, + 0x6b,0x57,0x28,0x11,0x69,0x56,0x26,0x10,0x67,0x55,0x26,0x10,0x68,0x52,0x24,0xf, + 0x68,0x52,0x24,0xf,0x68,0x53,0x23,0xf,0x68,0x53,0x23,0x10,0x68,0x53,0x24,0x10, + 0x68,0x52,0x23,0xf,0x68,0x52,0x23,0xf,0x67,0x53,0x24,0xf,0x68,0x54,0x25,0x10, + 0x69,0x58,0x29,0x11,0x6b,0x5d,0x2e,0x13,0x6e,0x63,0x35,0x16,0x73,0x6b,0x3d,0x1a, + 0x7a,0x71,0x43,0x1c,0x80,0x76,0x48,0x1e,0x84,0x78,0x4a,0x1f,0x86,0x79,0x4b,0x1f, + 0x86,0x77,0x4a,0x1e,0x85,0x74,0x45,0x1d,0x81,0x6e,0x3f,0x1a,0x7c,0x67,0x38,0x18, + 0x76,0x60,0x32,0x14,0x71,0x5c,0x2e,0x14,0x6e,0x5c,0x2d,0x14,0x6e,0x5e,0x30,0x14, + 0x70,0x61,0x32,0x15,0x71,0x65,0x36,0x16,0x74,0x66,0x38,0x18,0x76,0x67,0x38,0x17, + 0x76,0x67,0x39,0x18,0x76,0x67,0x39,0x18,0x76,0x69,0x3b,0x18,0x78,0x6a,0x3c,0x19, + 0x78,0x6b,0x3d,0x19,0x79,0x68,0x3b,0x18,0x78,0x65,0x37,0x17,0x74,0x60,0x32,0x15, + 0x71,0x5d,0x2e,0x13,0x6e,0x59,0x2b,0x12,0x6c,0x57,0x28,0x11,0x6a,0x55,0x26,0x10, + 0x69,0x55,0x26,0x10,0x69,0x57,0x28,0x11,0x6a,0x59,0x2a,0x12,0x6c,0x5d,0x2e,0x13, + 0x6e,0x60,0x31,0x15,0x71,0x63,0x35,0x16,0x73,0x66,0x38,0x18,0x75,0x67,0x3a,0x18, + 0x77,0x69,0x3b,0x19,0x77,0x69,0x3a,0x19,0x77,0x69,0x3b,0x19,0x77,0x69,0x3b,0x19, + 0x78,0x67,0x39,0x18,0x75,0x65,0x37,0x17,0x74,0x62,0x33,0x16,0x71,0x5f,0x30,0x14, + 0x6f,0x5b,0x2c,0x13,0x6d,0x59,0x2a,0x11,0x6b,0x57,0x27,0x10,0x69,0x54,0x25,0xf, + 0x68,0x54,0x25,0x10,0x68,0x53,0x24,0x11,0x68,0x53,0x25,0x10,0x68,0x51,0x23,0xf, + 0x68,0x51,0x22,0xf,0x68,0x51,0x23,0xf,0x68,0x51,0x22,0xf,0x68,0x51,0x23,0xf, + 0x68,0x51,0x23,0xf,0x68,0x51,0x23,0xf,0x68,0x51,0x23,0xf,0x68,0x53,0x24,0xf, + 0x69,0x56,0x28,0x11,0x6b,0x5f,0x30,0x14,0x71,0x69,0x3c,0x19,0x7a,0x75,0x47,0x1d, + 0x84,0x7c,0x4f,0x21,0x8c,0x82,0x55,0x23,0x93,0x84,0x57,0x24,0x95,0x84,0x57,0x24, + 0x95,0x82,0x54,0x23,0x92,0x7d,0x50,0x21,0x8c,0x77,0x49,0x1f,0x86,0x6f,0x42,0x1b, + 0x7f,0x6a,0x3c,0x19,0x7a,0x67,0x39,0x18,0x78,0x69,0x3b,0x19,0x79,0x6d,0x3f,0x1a, + 0x7c,0x70,0x42,0x1b,0x7f,0x71,0x43,0x1c,0x80,0x70,0x42,0x1b,0x7f,0x6d,0x3f,0x1a, + 0x7d,0x6b,0x3d,0x19,0x7b,0x6c,0x3f,0x1a,0x7b,0x70,0x43,0x1c,0x80,0x74,0x46,0x1d, + 0x82,0x75,0x47,0x1e,0x84,0x72,0x44,0x1c,0x81,0x6b,0x3d,0x19,0x7b,0x62,0x34,0x16, + 0x73,0x5a,0x2b,0x13,0x6d,0x54,0x26,0x10,0x6a,0x53,0x24,0xf,0x68,0x52,0x23,0xf, + 0x68,0x52,0x24,0xf,0x68,0x52,0x24,0xf,0x68,0x53,0x24,0xf,0x69,0x54,0x25,0x10, + 0x69,0x55,0x26,0x10,0x6a,0x56,0x28,0x10,0x6b,0x57,0x29,0x11,0x6b,0x59,0x2a,0x11, + 0x6c,0x59,0x2a,0x11,0x6c,0x59,0x2a,0x12,0x6d,0x59,0x2a,0x12,0x6d,0x59,0x2a,0x11, + 0x6c,0x57,0x29,0x11,0x6c,0x57,0x28,0x11,0x6b,0x56,0x27,0x11,0x6a,0x55,0x26,0x10, + 0x69,0x53,0x25,0x10,0x69,0x53,0x24,0x10,0x69,0x52,0x24,0x10,0x68,0x52,0x23,0x10, + 0x67,0x52,0x24,0xf,0x67,0x52,0x23,0x10,0x68,0x52,0x24,0x10,0x68,0x4f,0x21,0xe, + 0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe, + 0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x67,0x51,0x23,0xf,0x69,0x53,0x25,0xf, + 0x6a,0x5b,0x2d,0x13,0x70,0x68,0x3b,0x19,0x7a,0x79,0x4d,0x1f,0x8a,0x87,0x5b,0x25, + 0x9c,0x91,0x64,0x29,0xa9,0x96,0x6a,0x2b,0xb3,0x98,0x6c,0x2c,0xb5,0x97,0x6b,0x2b, + 0xb5,0x95,0x69,0x2b,0xb1,0x91,0x65,0x29,0xaa,0x8c,0x5f,0x27,0xa1,0x84,0x58,0x24, + 0x97,0x7e,0x52,0x22,0x8f,0x7d,0x50,0x21,0x8d,0x80,0x53,0x22,0x90,0x83,0x57,0x24, + 0x96,0x87,0x5b,0x25,0x9b,0x87,0x5b,0x26,0x9b,0x86,0x59,0x24,0x98,0x82,0x55,0x23, + 0x93,0x7e,0x52,0x22,0x90,0x80,0x53,0x22,0x92,0x85,0x58,0x24,0x97,0x89,0x5c,0x26, + 0x9e,0x8b,0x5e,0x27,0x9f,0x86,0x5a,0x25,0x99,0x7c,0x4f,0x21,0x8d,0x6e,0x40,0x1a, + 0x7e,0x5f,0x31,0x15,0x72,0x56,0x27,0x10,0x6c,0x51,0x23,0xe,0x69,0x50,0x21,0xe, + 0x68,0x50,0x22,0xf,0x68,0x50,0x21,0xe,0x67,0x50,0x21,0xf,0x67,0x50,0x22,0xe, + 0x67,0x50,0x22,0xe,0x68,0x51,0x23,0xe,0x68,0x51,0x22,0xe,0x68,0x51,0x23,0xf, + 0x69,0x52,0x24,0xf,0x69,0x52,0x23,0xf,0x69,0x52,0x24,0xf,0x69,0x51,0x22,0xf, + 0x69,0x51,0x22,0xe,0x68,0x51,0x23,0xe,0x68,0x51,0x22,0xe,0x68,0x50,0x22,0xe, + 0x68,0x50,0x21,0xf,0x67,0x50,0x22,0xe,0x67,0x50,0x22,0xe,0x68,0x50,0x21,0xe, + 0x68,0x50,0x22,0xf,0x68,0x50,0x22,0xe,0x68,0x50,0x22,0xf,0x68,0x4e,0x20,0xe, + 0x68,0x4e,0x20,0xd,0x68,0x4e,0x20,0xe,0x68,0x4e,0x20,0xd,0x68,0x4e,0x20,0xe, + 0x68,0x4f,0x20,0xe,0x68,0x4e,0x20,0xe,0x67,0x4f,0x21,0xe,0x69,0x54,0x28,0x11, + 0x6c,0x62,0x34,0x15,0x76,0x76,0x48,0x1e,0x87,0x89,0x5d,0x26,0xa0,0x98,0x6c,0x2c, + 0xb8,0xa1,0x75,0x30,0xca,0xa5,0x79,0x31,0xd4,0xa6,0x7b,0x32,0xd7,0xa6,0x7b,0x32, + 0xd7,0xa5,0x79,0x31,0xd3,0xa2,0x77,0x30,0xcc,0x9e,0x72,0x2f,0xc3,0x99,0x6d,0x2c, + 0xb9,0x94,0x69,0x2a,0xb0,0x93,0x67,0x2a,0xae,0x95,0x69,0x2b,0xb2,0x99,0x6d,0x2c, + 0xba,0x9b,0x70,0x2e,0xbe,0x9b,0x70,0x2d,0xbf,0x9a,0x6e,0x2d,0xbb,0x96,0x6b,0x2b, + 0xb5,0x94,0x68,0x2a,0xb0,0x95,0x69,0x2b,0xb1,0x99,0x6d,0x2c,0xb8,0x9c,0x71,0x2e, + 0xc0,0x9d,0x72,0x2e,0xc1,0x99,0x6d,0x2c,0xb8,0x8e,0x62,0x28,0xa5,0x7c,0x50,0x21, + 0x8f,0x68,0x3b,0x18,0x7b,0x59,0x2b,0x12,0x6f,0x51,0x23,0xf,0x6a,0x4f,0x21,0xe, + 0x68,0x4f,0x20,0xe,0x67,0x4e,0x21,0xd,0x68,0x4e,0x21,0xe,0x68,0x4f,0x21,0xe, + 0x67,0x4f,0x21,0xe,0x67,0x4f,0x20,0xe,0x67,0x4e,0x21,0xe,0x68,0x4f,0x21,0xe, + 0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xf,0x68,0x4f,0x21,0xe, + 0x68,0x4f,0x21,0xe,0x68,0x4f,0x20,0xe,0x67,0x4f,0x21,0xe,0x67,0x4f,0x21,0xe, + 0x67,0x4f,0x20,0xe,0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe, + 0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x68,0x4f,0x21,0xe,0x68,0x4c,0x1e,0xd, + 0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd, + 0x68,0x4c,0x1f,0xd,0x67,0x4c,0x1f,0xc,0x68,0x4f,0x21,0xe,0x69,0x56,0x29,0x11, + 0x6f,0x68,0x3b,0x18,0x7c,0x80,0x53,0x22,0x94,0x94,0x69,0x2b,0xb3,0xa2,0x76,0x30, + 0xce,0xa9,0x7d,0x31,0xe2,0xad,0x85,0x40,0xed,0xae,0x87,0x43,0xf0,0xae,0x85,0x3e, + 0xef,0xad,0x81,0x33,0xeb,0xab,0x80,0x31,0xe7,0xa9,0x7e,0x33,0xe1,0xa7,0x7b,0x32, + 0xd9,0xa3,0x78,0x31,0xd2,0xa3,0x78,0x31,0xd0,0xa4,0x79,0x31,0xd4,0xa7,0x7c,0x32, + 0xda,0xa8,0x7c,0x31,0xde,0xa9,0x7d,0x31,0xdf,0xa7,0x7b,0x32,0xdb,0xa5,0x79,0x32, + 0xd6,0xa4,0x78,0x31,0xd2,0xa3,0x78,0x31,0xd3,0xa6,0x7a,0x32,0xd8,0xa8,0x7d,0x32, + 0xde,0xa7,0x7c,0x30,0xdd,0xa4,0x79,0x31,0xd3,0x9a,0x6e,0x2d,0xbc,0x88,0x5c,0x25, + 0x9f,0x71,0x44,0x1c,0x84,0x5d,0x2f,0x13,0x73,0x51,0x23,0xf,0x6a,0x4e,0x20,0xd, + 0x69,0x4d,0x1f,0xe,0x67,0x4d,0x1f,0xe,0x68,0x4c,0x1f,0xd,0x68,0x4c,0x1f,0xd, + 0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xd, + 0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xe,0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xd, + 0x68,0x4d,0x1f,0xe,0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xe,0x68,0x4d,0x1f,0xd, + 0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xe,0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xd, + 0x68,0x4d,0x1f,0xd,0x68,0x4d,0x1f,0xe,0x68,0x4d,0x1f,0xd,0x68,0x4b,0x1d,0xd, + 0x68,0x4b,0x1d,0xc,0x68,0x4b,0x1d,0xd,0x68,0x4b,0x1d,0xd,0x68,0x4b,0x1d,0xd, + 0x68,0x4b,0x1d,0xd,0x67,0x4b,0x1d,0xd,0x68,0x4c,0x20,0xd,0x6a,0x57,0x2a,0x11, + 0x70,0x6b,0x3f,0x1a,0x80,0x85,0x59,0x25,0x9c,0x99,0x6e,0x2d,0xbe,0xa7,0x7b,0x31, + 0xdb,0xb0,0x8f,0x61,0xf4,0xb4,0xa2,0x9a,0xfe,0xb4,0xa2,0x99,0xfe,0xb4,0xa2,0x99, + 0xfe,0xb4,0xa1,0x95,0xfe,0xb2,0x94,0x6d,0xfa,0xae,0x84,0x37,0xf4,0xad,0x82,0x33, + 0xee,0xac,0x81,0x34,0xeb,0xab,0x80,0x34,0xea,0xac,0x81,0x34,0xec,0xad,0x81,0x32, + 0xef,0xaf,0x8c,0x53,0xf5,0xb0,0x8f,0x60,0xf6,0xae,0x83,0x38,0xf1,0xac,0x81,0x34, + 0xed,0xac,0x80,0x34,0xea,0xac,0x81,0x34,0xeb,0xad,0x82,0x34,0xee,0xaf,0x87,0x41, + 0xf2,0xb2,0x9a,0x81,0xfa,0xa9,0x7d,0x2d,0xe2,0xa0,0x75,0x2f,0xca,0x8e,0x62,0x28, + 0xa9,0x76,0x4a,0x1e,0x8b,0x5e,0x32,0x14,0x75,0x51,0x23,0xf,0x6c,0x4c,0x1f,0xd, + 0x69,0x4b,0x1d,0xd,0x67,0x4c,0x1e,0xd,0x68,0x4b,0x1e,0xd,0x68,0x4c,0x1e,0xc, + 0x68,0x4b,0x1e,0xd,0x68,0x4c,0x1e,0xc,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd, + 0x68,0x4c,0x1e,0xd,0x68,0x4b,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4b,0x1e,0xd, + 0x68,0x4c,0x1e,0xd,0x68,0x4b,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd, + 0x68,0x4b,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xc, + 0x68,0x4b,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x4c,0x1e,0xd,0x68,0x49,0x1b,0xc, + 0x68,0x49,0x1c,0xc,0x68,0x49,0x1b,0xb,0x68,0x49,0x1c,0xb,0x68,0x49,0x1c,0xb, + 0x68,0x48,0x1b,0xc,0x67,0x4a,0x1c,0xc,0x68,0x4c,0x1f,0xd,0x6a,0x56,0x29,0x11, + 0x71,0x6c,0x3f,0x1a,0x81,0x85,0x5a,0x25,0x9e,0x9a,0x6f,0x2d,0xc2,0xa7,0x7c,0x33, + 0xe0,0xb1,0x95,0x73,0xf9,0xb4,0xa2,0x9b,0xfe,0xb4,0x9e,0x90,0xff,0xb2,0x90,0x5b, + 0xfe,0xb2,0x92,0x63,0xfe,0xb3,0x98,0x78,0xfe,0xb3,0xa0,0x95,0xff,0xb2,0x97,0x76, + 0xfc,0xaf,0x85,0x3a,0xf9,0xaf,0x85,0x35,0xf8,0xaf,0x85,0x36,0xf8,0xb2,0x98,0x79, + 0xfd,0xb4,0xa3,0xa1,0xff,0xb4,0xa3,0xa1,0xff,0xb3,0xa0,0x95,0xfe,0xb1,0x8c,0x4f, + 0xfa,0xaf,0x84,0x33,0xf8,0xaf,0x84,0x36,0xf8,0xaf,0x84,0x32,0xf9,0xb2,0x96,0x71, + 0xfd,0xb5,0xa4,0xa3,0xff,0xab,0x7e,0x2c,0xea,0xa2,0x77,0x31,0xd3,0x91,0x65,0x29, + 0xb0,0x79,0x4c,0x1f,0x8e,0x60,0x33,0x15,0x77,0x51,0x23,0xe,0x6d,0x4b,0x1d,0xc, + 0x69,0x49,0x1c,0xb,0x67,0x49,0x1c,0xb,0x68,0x49,0x1c,0xc,0x68,0x49,0x1c,0xc, + 0x68,0x49,0x1d,0xc,0x68,0x49,0x1c,0xc,0x68,0x49,0x1c,0xc,0x68,0x49,0x1c,0xc, + 0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc, + 0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc,0x68,0x49,0x1c,0xc,0x68,0x4a,0x1c,0xc, + 0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xd,0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1d,0xc, + 0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc,0x68,0x4a,0x1c,0xc,0x68,0x47,0x1a,0xb, + 0x68,0x47,0x1a,0xb,0x68,0x47,0x1b,0xb,0x68,0x46,0x19,0xb,0x68,0x47,0x1b,0xb, + 0x68,0x47,0x1a,0xa,0x67,0x47,0x1b,0xa,0x68,0x4a,0x1d,0xc,0x6a,0x54,0x27,0x11, + 0x70,0x68,0x3c,0x18,0x80,0x82,0x56,0x23,0x9a,0x97,0x6c,0x2c,0xbd,0xa5,0x7a,0x32, + 0xdc,0xac,0x87,0x47,0xf1,0xb4,0xa2,0x9e,0xff,0xb3,0x9e,0x8e,0xff,0xb0,0x84,0x32, + 0xfe,0xb0,0x85,0x37,0xff,0xb0,0x85,0x35,0xff,0xb0,0x85,0x35,0xfe,0xb2,0x94,0x6a, + 0xfe,0xb2,0x9d,0x8d,0xfe,0xb0,0x85,0x32,0xfe,0xb0,0x87,0x3d,0xfe,0xb3,0x9f,0x93, + 0xfe,0xb4,0xa2,0x9b,0xff,0xb2,0x96,0x70,0xff,0xb3,0x9e,0x8c,0xfe,0xb3,0xa1,0x9b, + 0xff,0xb0,0x8d,0x50,0xfe,0xb0,0x85,0x35,0xfe,0xb0,0x84,0x33,0xfe,0xb2,0x98,0x78, + 0xfe,0xb4,0xa3,0xa0,0xff,0xab,0x7f,0x2c,0xed,0xa3,0x78,0x31,0xd5,0x91,0x67,0x2a, + 0xb3,0x79,0x4d,0x1f,0x91,0x5f,0x33,0x15,0x78,0x50,0x22,0xe,0x6d,0x49,0x1c,0xc, + 0x69,0x47,0x1a,0xb,0x67,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x47,0x1b,0xb, + 0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x48,0x1a,0xb,0x68,0x48,0x1a,0xb, + 0x68,0x48,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x48,0x1a,0xb,0x68,0x48,0x1a,0xb, + 0x68,0x47,0x1c,0xb,0x68,0x48,0x1b,0xc,0x68,0x48,0x1b,0xb,0x68,0x49,0x1c,0xc, + 0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x48,0x1c,0xb,0x68,0x47,0x1b,0xb, + 0x68,0x48,0x1a,0xb,0x68,0x49,0x1c,0xb,0x68,0x48,0x1b,0xb,0x68,0x46,0x19,0xa, + 0x68,0x46,0x19,0xa,0x68,0x45,0x19,0xb,0x68,0x46,0x19,0xa,0x68,0x46,0x19,0xb, + 0x68,0x46,0x19,0xb,0x67,0x46,0x19,0xa,0x68,0x48,0x1b,0xb,0x69,0x4f,0x23,0xe, + 0x6e,0x60,0x34,0x15,0x7a,0x79,0x4d,0x1f,0x92,0x8f,0x64,0x29,0xb2,0xa0,0x75,0x30, + 0xd0,0xa9,0x7c,0x30,0xe8,0xae,0x8b,0x52,0xf7,0xb3,0xa1,0x9d,0xff,0xb2,0x98,0x7c, + 0xfe,0xaf,0x85,0x34,0xfe,0xaf,0x85,0x36,0xff,0xaf,0x85,0x35,0xff,0xaf,0x84,0x33, + 0xff,0xaf,0x84,0x31,0xff,0xaf,0x85,0x36,0xff,0xb0,0x87,0x3c,0xff,0xb2,0x9e,0x92, + 0xff,0xb2,0x9e,0x90,0xff,0xb0,0x85,0x36,0xff,0xb0,0x86,0x3a,0xff,0xb2,0x9c,0x8d, + 0xff,0xb3,0xa0,0x9a,0xff,0xb0,0x8f,0x58,0xfe,0xaf,0x83,0x2f,0xfe,0xb1,0x97,0x78, + 0xff,0xb3,0xa2,0xa0,0xff,0xaa,0x7e,0x2c,0xef,0xa2,0x78,0x31,0xd7,0x92,0x66,0x2a, + 0xb5,0x7a,0x4d,0x1f,0x92,0x60,0x34,0x14,0x79,0x4e,0x22,0xe,0x6d,0x48,0x1a,0xb, + 0x69,0x46,0x19,0xb,0x67,0x46,0x19,0xa,0x68,0x46,0x1a,0xa,0x68,0x46,0x1a,0xb, + 0x68,0x46,0x19,0xb,0x68,0x46,0x19,0xb,0x68,0x46,0x19,0xb,0x68,0x46,0x1a,0xb, + 0x68,0x46,0x19,0xb,0x68,0x46,0x1a,0xb,0x68,0x46,0x1a,0xa,0x68,0x46,0x19,0xa, + 0x68,0x46,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x46,0x19,0xa,0x68,0x46,0x1a,0xa, + 0x68,0x47,0x1a,0xb,0x68,0x46,0x1a,0xb,0x68,0x47,0x19,0xa,0x68,0x47,0x1a,0xb, + 0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x47,0x1a,0xb,0x68,0x44,0x17,0x9, + 0x68,0x43,0x17,0x9,0x68,0x43,0x17,0xa,0x68,0x44,0x17,0xa,0x68,0x43,0x17,0x9, + 0x68,0x43,0x17,0x9,0x68,0x44,0x17,0x9,0x67,0x45,0x19,0xa,0x69,0x4a,0x1e,0xc, + 0x6c,0x57,0x2b,0x11,0x74,0x6c,0x41,0x1a,0x86,0x83,0x58,0x24,0xa0,0x96,0x6c,0x2b, + 0xbf,0xa2,0x77,0x31,0xd8,0xa8,0x7e,0x33,0xec,0xaf,0x8e,0x61,0xf9,0xb3,0xa0,0x9c, + 0xff,0xb1,0x9a,0x87,0xff,0xaf,0x86,0x3b,0xfe,0xaf,0x84,0x35,0xff,0xaf,0x84,0x35, + 0xff,0xaf,0x85,0x36,0xff,0xaf,0x85,0x36,0xff,0xaf,0x85,0x36,0xff,0xb1,0x9b,0x8a, + 0xff,0xb2,0xa0,0x9c,0xff,0xb0,0x87,0x3f,0xfe,0xaf,0x84,0x35,0xff,0xaf,0x86,0x38, + 0xff,0xb2,0x9e,0x93,0xff,0xb2,0xa0,0x9b,0xfe,0xb0,0x8c,0x51,0xff,0xb1,0x97,0x77, + 0xff,0xb3,0xa1,0xa0,0xff,0xaa,0x7e,0x2d,0xef,0xa3,0x78,0x31,0xd9,0x92,0x67,0x2a, + 0xb8,0x7a,0x4f,0x20,0x94,0x5f,0x34,0x15,0x7a,0x4d,0x21,0xe,0x6d,0x46,0x19,0xb, + 0x69,0x45,0x18,0x9,0x68,0x44,0x18,0xa,0x67,0x44,0x18,0xa,0x68,0x45,0x17,0x9, + 0x68,0x44,0x18,0xb,0x68,0x44,0x18,0xa,0x68,0x44,0x17,0xa,0x68,0x44,0x18,0xa, + 0x68,0x44,0x18,0xa,0x68,0x44,0x18,0xa,0x68,0x44,0x18,0xa,0x68,0x44,0x18,0xa, + 0x68,0x44,0x17,0x9,0x68,0x44,0x18,0xa,0x68,0x45,0x18,0xa,0x68,0x44,0x18,0xa, + 0x68,0x44,0x18,0xa,0x68,0x44,0x18,0xa,0x68,0x45,0x18,0xa,0x68,0x44,0x17,0x9, + 0x68,0x45,0x18,0xa,0x68,0x45,0x18,0xa,0x68,0x45,0x18,0xa,0x68,0x42,0x16,0xa, + 0x68,0x42,0x16,0x9,0x68,0x42,0x16,0x9,0x68,0x42,0x16,0xa,0x68,0x42,0x16,0x8, + 0x68,0x42,0x16,0xa,0x68,0x42,0x16,0x9,0x67,0x42,0x16,0x9,0x68,0x45,0x19,0xa, + 0x6a,0x4e,0x21,0xd,0x6f,0x5e,0x32,0x14,0x7a,0x73,0x48,0x1d,0x8e,0x88,0x5d,0x26, + 0xa8,0x97,0x6c,0x2c,0xc3,0xa2,0x77,0x30,0xda,0xa8,0x7d,0x30,0xea,0xad,0x88,0x4d, + 0xf7,0xb2,0x9f,0x9b,0xff,0xb1,0x9d,0x94,0xff,0xb0,0x8f,0x61,0xff,0xad,0x83,0x32, + 0xfe,0xaf,0x83,0x32,0xff,0xaf,0x84,0x35,0xff,0xae,0x84,0x35,0xff,0xaf,0x8e,0x5c, + 0xff,0xb2,0xa1,0xa0,0xfe,0xb0,0x9a,0x84,0xff,0xae,0x82,0x30,0xfe,0xaf,0x84,0x35, + 0xfe,0xaf,0x87,0x43,0xfe,0xb1,0x9f,0x9b,0xff,0xb1,0x9f,0x99,0xfe,0xb1,0x9e,0x93, + 0xff,0xb2,0xa1,0x9f,0xff,0xaa,0x81,0x38,0xf1,0xa2,0x78,0x31,0xdb,0x92,0x68,0x2a, + 0xb9,0x7a,0x4f,0x20,0x96,0x5f,0x33,0x14,0x7b,0x4d,0x21,0xd,0x6e,0x44,0x18,0xa, + 0x69,0x43,0x17,0xa,0x68,0x43,0x17,0xa,0x67,0x43,0x17,0xa,0x68,0x43,0x17,0xa, + 0x68,0x43,0x17,0x9,0x68,0x43,0x17,0x9,0x68,0x43,0x17,0x9,0x68,0x43,0x17,0x9, + 0x68,0x43,0x17,0xa,0x68,0x43,0x17,0xa,0x68,0x43,0x17,0xa,0x68,0x43,0x17,0xa, + 0x68,0x43,0x17,0xa,0x68,0x43,0x17,0xa,0x68,0x43,0x17,0x9,0x68,0x43,0x18,0xa, + 0x68,0x43,0x17,0x9,0x68,0x43,0x17,0xa,0x68,0x43,0x17,0xa,0x68,0x43,0x17,0xa, + 0x68,0x43,0x17,0x9,0x68,0x43,0x18,0xa,0x68,0x43,0x17,0xa,0x68,0x40,0x15,0x8, + 0x68,0x40,0x15,0x8,0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8, + 0x68,0x40,0x15,0x8,0x68,0x40,0x15,0x8,0x68,0x40,0x15,0x8,0x68,0x42,0x16,0x8, + 0x68,0x46,0x1a,0xb,0x6b,0x50,0x24,0xe,0x71,0x60,0x35,0x15,0x7e,0x74,0x4a,0x1d, + 0x91,0x88,0x5d,0x26,0xaa,0x96,0x6b,0x2c,0xc2,0xa0,0x76,0x2f,0xd8,0xa6,0x7c,0x31, + 0xe9,0xaa,0x82,0x3c,0xf4,0xaf,0x99,0x86,0xfd,0xb1,0xa0,0x9e,0xff,0xb0,0x9e,0x98, + 0xff,0xaf,0x95,0x77,0xff,0xae,0x88,0x44,0xfd,0xad,0x83,0x34,0xfd,0xad,0x82,0x2f, + 0xfd,0xb0,0x9b,0x8f,0xfe,0xb1,0x9f,0x9d,0xff,0xae,0x8b,0x52,0xfd,0xad,0x83,0x35, + 0xfb,0xad,0x83,0x34,0xfb,0xad,0x86,0x3f,0xfc,0xb0,0x9c,0x91,0xfe,0xb1,0x9f,0x9a, + 0xff,0xb1,0xa0,0x9d,0xff,0xaa,0x87,0x4e,0xf2,0xa1,0x76,0x30,0xd9,0x91,0x67,0x29, + 0xb8,0x78,0x4f,0x20,0x95,0x5e,0x33,0x14,0x7b,0x4b,0x1f,0xd,0x6e,0x43,0x17,0x9, + 0x69,0x41,0x16,0x8,0x68,0x41,0x15,0x8,0x67,0x41,0x15,0x8,0x68,0x41,0x15,0x8, + 0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x9, + 0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x8, + 0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x8, + 0x68,0x41,0x15,0x9,0x68,0x41,0x15,0x8,0x68,0x42,0x16,0x8,0x68,0x42,0x15,0x9, + 0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x8,0x68,0x41,0x15,0x8,0x68,0x3f,0x14,0x8, + 0x68,0x3f,0x14,0x8,0x68,0x3f,0x13,0x8,0x68,0x3f,0x13,0x8,0x68,0x3f,0x14,0x8, + 0x68,0x3f,0x14,0x8,0x68,0x3f,0x13,0x8,0x68,0x3f,0x14,0x8,0x67,0x40,0x14,0x8, + 0x68,0x40,0x15,0x8,0x69,0x46,0x1a,0xa,0x6c,0x50,0x25,0xe,0x72,0x60,0x35,0x16, + 0x7e,0x73,0x48,0x1d,0x91,0x85,0x5b,0x25,0xa8,0x94,0x6a,0x2a,0xbf,0x9d,0x73,0x2f, + 0xd4,0xa4,0x79,0x30,0xe3,0xa8,0x7e,0x34,0xee,0xab,0x84,0x44,0xf4,0xae,0x93,0x75, + 0xfb,0xaf,0x9a,0x8b,0xfe,0xac,0x89,0x52,0xf9,0xab,0x81,0x33,0xf6,0xab,0x81,0x33, + 0xf7,0xac,0x86,0x45,0xf8,0xae,0x98,0x85,0xfd,0xab,0x85,0x43,0xf6,0xa9,0x7f,0x34, + 0xf3,0xa9,0x7f,0x34,0xf2,0xa9,0x7f,0x33,0xf3,0xaa,0x82,0x3a,0xf5,0xaf,0x9a,0x8c, + 0xfe,0xaf,0x9a,0x8d,0xfd,0xa6,0x7c,0x34,0xe9,0x9d,0x73,0x2f,0xd3,0x8d,0x62,0x27, + 0xb3,0x75,0x4a,0x1e,0x91,0x5a,0x2f,0x13,0x79,0x48,0x1d,0xb,0x6e,0x40,0x15,0x9, + 0x69,0x40,0x14,0x8,0x68,0x40,0x14,0x8,0x67,0x40,0x14,0x9,0x68,0x40,0x14,0x9, + 0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8, + 0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8, + 0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x8, + 0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x8,0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x9, + 0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x9,0x68,0x40,0x14,0x9,0x68,0x3d,0x12,0x7, + 0x68,0x3d,0x11,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x8,0x68,0x3d,0x12,0x7, + 0x68,0x3d,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x7, + 0x67,0x3e,0x13,0x7,0x68,0x3f,0x14,0x8,0x69,0x44,0x19,0xa,0x6c,0x4e,0x23,0xd, + 0x72,0x5e,0x32,0x14,0x7e,0x70,0x44,0x1c,0x8e,0x80,0x56,0x23,0xa2,0x8e,0x64,0x29, + 0xb7,0x98,0x6e,0x2c,0xc9,0x9f,0x74,0x2f,0xd8,0xa2,0x78,0x30,0xe1,0xa4,0x79,0x2d, + 0xe6,0xa4,0x7a,0x2b,0xe8,0xa4,0x7a,0x2f,0xe8,0xa4,0x7a,0x31,0xe7,0xa4,0x7a,0x31, + 0xe6,0xa4,0x7a,0x31,0xe6,0xa4,0x78,0x2c,0xe5,0xa3,0x79,0x30,0xe3,0xa2,0x78,0x30, + 0xdf,0xa1,0x77,0x30,0xde,0xa2,0x78,0x30,0xe0,0xa3,0x79,0x31,0xe4,0xa4,0x79,0x2b, + 0xe7,0xa3,0x78,0x2a,0xe4,0xa0,0x75,0x2f,0xd9,0x95,0x6b,0x2c,0xc4,0x84,0x5a,0x24, + 0xa7,0x6b,0x41,0x1a,0x8a,0x54,0x28,0x10,0x76,0x45,0x19,0x9,0x6c,0x3f,0x14,0x7, + 0x69,0x3d,0x12,0x7,0x67,0x3e,0x12,0x7,0x68,0x3d,0x12,0x8,0x68,0x3e,0x13,0x7, + 0x68,0x3e,0x12,0x7,0x68,0x3d,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3e,0x13,0x8, + 0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x8,0x68,0x3e,0x12,0x7, + 0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x8,0x68,0x3e,0x12,0x7,0x68,0x3e,0x12,0x8, + 0x68,0x3e,0x13,0x7,0x68,0x3e,0x13,0x8,0x68,0x3e,0x13,0x7,0x68,0x3e,0x12,0x7, + 0x68,0x3e,0x13,0x7,0x68,0x3e,0x13,0x8,0x68,0x3e,0x13,0x7,0x68,0x3c,0x11,0x7, + 0x68,0x3c,0x11,0x7,0x68,0x3c,0x11,0x7,0x68,0x3c,0x11,0x7,0x68,0x3c,0x11,0x7, + 0x68,0x3c,0x11,0x6,0x68,0x3c,0x11,0x7,0x68,0x3c,0x11,0x7,0x68,0x3c,0x11,0x7, + 0x68,0x3b,0x10,0x7,0x67,0x3c,0x11,0x7,0x68,0x3d,0x12,0x7,0x69,0x43,0x17,0x9, + 0x6c,0x4b,0x20,0xc,0x71,0x58,0x2e,0x12,0x7b,0x68,0x3e,0x19,0x88,0x78,0x4e,0x1f, + 0x99,0x86,0x5b,0x24,0xab,0x8f,0x64,0x28,0xb9,0x95,0x6b,0x2b,0xc4,0x98,0x6e,0x2c, + 0xcb,0x99,0x6f,0x2d,0xcd,0x99,0x6f,0x2d,0xcc,0x98,0x6e,0x2c,0xca,0x98,0x6e,0x2c, + 0xca,0x98,0x6e,0x2c,0xca,0x97,0x6d,0x2c,0xc9,0x95,0x6b,0x2b,0xc6,0x93,0x69,0x2b, + 0xc1,0x92,0x68,0x2a,0xbf,0x93,0x69,0x2b,0xc2,0x97,0x6c,0x2b,0xc8,0x99,0x6f,0x2d, + 0xcc,0x98,0x6e,0x2d,0xcb,0x93,0x69,0x2a,0xbf,0x87,0x5c,0x25,0xac,0x75,0x4a,0x1e, + 0x95,0x5f,0x33,0x15,0x80,0x4b,0x20,0xd,0x71,0x41,0x16,0x8,0x6a,0x3d,0x12,0x7, + 0x69,0x3d,0x12,0x6,0x67,0x3d,0x11,0x6,0x68,0x3c,0x11,0x7,0x68,0x3d,0x11,0x6, + 0x68,0x3c,0x11,0x6,0x68,0x3c,0x11,0x6,0x68,0x3d,0x11,0x6,0x68,0x3c,0x11,0x7, + 0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x10,0x7, + 0x68,0x3c,0x12,0x6,0x68,0x3d,0x11,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x7, + 0x68,0x3d,0x10,0x7,0x68,0x3d,0x11,0x7,0x68,0x3d,0x12,0x7,0x68,0x3d,0x12,0x7, + 0x68,0x3d,0x12,0x7,0x68,0x3d,0x11,0x7,0x68,0x3d,0x12,0x7,0x68,0x3a,0xf,0x5, + 0x68,0x3a,0xf,0x5,0x68,0x3a,0xf,0x6,0x68,0x3a,0xf,0x6,0x68,0x3a,0xf,0x6, + 0x68,0x3a,0xf,0x6,0x68,0x3a,0xf,0x5,0x68,0x3a,0xf,0x6,0x68,0x3a,0xf,0x6, + 0x68,0x3a,0xf,0x5,0x68,0x3a,0xf,0x6,0x67,0x3a,0x10,0x5,0x68,0x3b,0x11,0x6, + 0x69,0x40,0x14,0x8,0x6b,0x46,0x1c,0xa,0x6f,0x51,0x26,0xf,0x76,0x5e,0x34,0x14, + 0x81,0x6b,0x40,0x1a,0x8c,0x77,0x4c,0x1e,0x98,0x7e,0x54,0x22,0xa1,0x82,0x58,0x24, + 0xa7,0x84,0x59,0x24,0xa9,0x83,0x59,0x24,0xa8,0x82,0x58,0x23,0xa7,0x81,0x58,0x23, + 0xa6,0x82,0x57,0x23,0xa6,0x82,0x57,0x23,0xa6,0x7f,0x55,0x22,0xa3,0x7c,0x51,0x20, + 0x9e,0x7a,0x50,0x20,0x9c,0x7c,0x52,0x21,0xa0,0x81,0x57,0x23,0xa6,0x84,0x5a,0x24, + 0xa9,0x83,0x59,0x24,0xa9,0x7d,0x53,0x21,0xa0,0x72,0x46,0x1d,0x92,0x61,0x36,0x16, + 0x82,0x4f,0x25,0xe,0x75,0x43,0x18,0x9,0x6d,0x3c,0x11,0x7,0x69,0x3b,0x10,0x6, + 0x68,0x3b,0x10,0x6,0x67,0x3a,0x10,0x6,0x68,0x3b,0xf,0x6,0x68,0x3a,0x10,0x7, + 0x68,0x3b,0x10,0x6,0x68,0x3a,0x10,0x6,0x68,0x3b,0x10,0x6,0x68,0x3a,0x10,0x6, + 0x68,0x3b,0x10,0x7,0x68,0x3a,0x10,0x6,0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x6, + 0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x7,0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x6, + 0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x6,0x68,0x3b,0x10,0x7, + 0x68,0x3b,0x10,0x7,0x68,0x3a,0x10,0x6,0x68,0x3b,0x10,0x7,0x68,0x38,0xd,0x5, + 0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x6, + 0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x5, + 0x68,0x38,0xd,0x6,0x68,0x38,0xd,0x4,0x68,0x38,0xd,0x6,0x67,0x38,0xe,0x5, + 0x67,0x39,0xf,0x5,0x68,0x3d,0x11,0x6,0x6a,0x42,0x17,0x8,0x6d,0x48,0x1e,0xc, + 0x71,0x51,0x27,0x10,0x77,0x5a,0x30,0x13,0x7e,0x61,0x37,0x16,0x84,0x65,0x3b,0x17, + 0x87,0x67,0x3d,0x19,0x8a,0x66,0x3c,0x18,0x88,0x64,0x3a,0x17,0x87,0x64,0x3a,0x17, + 0x87,0x64,0x3a,0x17,0x87,0x64,0x3a,0x16,0x86,0x62,0x37,0x16,0x84,0x5f,0x35,0x15, + 0x81,0x5e,0x33,0x14,0x81,0x5f,0x35,0x15,0x82,0x64,0x3a,0x17,0x86,0x67,0x3d,0x18, + 0x89,0x67,0x3c,0x18,0x89,0x61,0x37,0x16,0x84,0x58,0x2e,0x12,0x7d,0x4d,0x22,0xd, + 0x74,0x42,0x17,0x9,0x6e,0x3c,0x11,0x7,0x6a,0x39,0xf,0x5,0x68,0x39,0xe,0x5, + 0x67,0x38,0xe,0x5,0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x5, + 0x68,0x38,0xe,0x5,0x68,0x38,0xd,0x5,0x68,0x38,0xe,0x5,0x68,0x39,0xe,0x5, + 0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x6, + 0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x6,0x68,0x39,0xe,0x5, + 0x68,0x39,0xe,0x6,0x68,0x39,0xe,0x6,0x68,0x39,0xe,0x5,0x68,0x39,0xe,0x5, + 0x68,0x39,0xe,0x5,0x68,0x39,0xf,0x5,0x68,0x39,0xf,0x5,0x68,0x36,0xc,0x4, + 0x68,0x36,0xd,0x4,0x68,0x37,0xc,0x5,0x68,0x37,0xd,0x5,0x68,0x36,0xd,0x5, + 0x68,0x37,0xd,0x5,0x68,0x36,0xc,0x5,0x68,0x37,0xd,0x4,0x68,0x37,0xd,0x5, + 0x68,0x37,0xc,0x5,0x68,0x37,0xd,0x4,0x68,0x37,0xd,0x4,0x68,0x36,0xc,0x5, + 0x67,0x37,0xc,0x4,0x68,0x37,0xd,0x5,0x69,0x38,0xe,0x5,0x69,0x3b,0x11,0x6, + 0x6b,0x3f,0x15,0x7,0x6d,0x43,0x19,0x9,0x6f,0x48,0x1d,0xb,0x72,0x4a,0x20,0xc, + 0x74,0x4c,0x22,0xd,0x74,0x4b,0x21,0xc,0x74,0x4a,0x20,0xc,0x73,0x4a,0x1f,0xc, + 0x73,0x4a,0x20,0xc,0x73,0x4a,0x20,0xc,0x73,0x48,0x1e,0xb,0x72,0x46,0x1c,0xb, + 0x71,0x45,0x1b,0xa,0x71,0x47,0x1d,0xb,0x71,0x4a,0x20,0xc,0x73,0x4c,0x22,0xe, + 0x75,0x4c,0x22,0xe,0x75,0x49,0x1f,0xc,0x73,0x44,0x1a,0xa,0x6f,0x3f,0x14,0x7, + 0x6c,0x3a,0xf,0x6,0x6a,0x38,0xe,0x5,0x69,0x37,0xd,0x5,0x68,0x37,0xd,0x5, + 0x67,0x37,0xd,0x5,0x68,0x37,0xd,0x4,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x4, + 0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5, + 0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x37,0xd,0x4,0x68,0x37,0xd,0x5, + 0x68,0x37,0xd,0x4,0x68,0x38,0xd,0x4,0x68,0x38,0xd,0x5,0x68,0x37,0xd,0x5, + 0x68,0x37,0xd,0x5,0x68,0x38,0xd,0x5,0x68,0x37,0xd,0x5,0x68,0x38,0xd,0x5, + 0x68,0x38,0xd,0x5,0x68,0x38,0xd,0x6,0x68,0x38,0xd,0x5,0x68,0x35,0xb,0x4, + 0x68,0x34,0xa,0x4,0x68,0x35,0xb,0x3,0x68,0x35,0xb,0x3,0x68,0x35,0xb,0x4, + 0x68,0x35,0xa,0x3,0x68,0x35,0xb,0x3,0x68,0x34,0xb,0x4,0x68,0x35,0xb,0x3, + 0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x3, + 0x68,0x35,0xa,0x4,0x68,0x34,0xb,0x3,0x67,0x35,0xb,0x4,0x68,0x36,0xc,0x4, + 0x68,0x37,0xd,0x4,0x69,0x38,0xe,0x4,0x69,0x39,0xf,0x5,0x6a,0x3a,0x11,0x6, + 0x6b,0x3b,0x11,0x6,0x6b,0x3a,0x11,0x6,0x6b,0x3a,0x11,0x6,0x6b,0x3a,0x11,0x6, + 0x6b,0x3a,0x11,0x6,0x6b,0x3a,0x10,0x6,0x6b,0x3a,0x10,0x6,0x6a,0x39,0xf,0x5, + 0x6a,0x39,0xf,0x5,0x6a,0x39,0xf,0x5,0x6a,0x3b,0x11,0x6,0x6b,0x3b,0x12,0x6, + 0x6b,0x3b,0x11,0x6,0x6b,0x3a,0x10,0x6,0x6a,0x39,0xe,0x5,0x6a,0x37,0xc,0x4, + 0x69,0x36,0xc,0x3,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4, + 0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4, + 0x68,0x36,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xc,0x4,0x68,0x35,0xb,0x4, + 0x68,0x35,0xc,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4, + 0x68,0x36,0xb,0x4,0x68,0x36,0xb,0x5,0x68,0x35,0xb,0x4,0x68,0x35,0xb,0x4, + 0x68,0x36,0xc,0x5,0x68,0x35,0xc,0x4,0x68,0x36,0xc,0x4,0x68,0x35,0xb,0x4, + 0x68,0x36,0xb,0x4,0x68,0x36,0xc,0x4,0x68,0x36,0xb,0x4,0x68,0x33,0xa,0x4, + 0x68,0x34,0xa,0x4,0x68,0x33,0xa,0x3,0x68,0x34,0xa,0x4,0x68,0x33,0xa,0x3, + 0x68,0x34,0xa,0x4,0x68,0x33,0xa,0x3,0x68,0x33,0x9,0x3,0x68,0x34,0xa,0x4, + 0x68,0x34,0xa,0x3,0x68,0x34,0xa,0x3,0x68,0x34,0xa,0x4,0x68,0x34,0xa,0x4, + 0x68,0x34,0xa,0x3,0x68,0x34,0xa,0x3,0x68,0x34,0xa,0x4,0x67,0x33,0xa,0x3, + 0x68,0x34,0xa,0x3,0x68,0x34,0xa,0x4,0x68,0x34,0xb,0x4,0x69,0x35,0xa,0x4, + 0x69,0x34,0xb,0x4,0x69,0x34,0xb,0x4,0x69,0x34,0xb,0x4,0x69,0x34,0xb,0x4, + 0x69,0x34,0xb,0x4,0x69,0x35,0xb,0x4,0x69,0x34,0xb,0x3,0x69,0x34,0xa,0x4, + 0x68,0x34,0xa,0x4,0x68,0x34,0xa,0x3,0x68,0x35,0xb,0x3,0x69,0x35,0xc,0x4, + 0x69,0x35,0xb,0x4,0x69,0x34,0xb,0x3,0x69,0x34,0xa,0x3,0x68,0x34,0xa,0x4, + 0x68,0x34,0xa,0x4,0x67,0x34,0xa,0x3,0x67,0x34,0xa,0x4,0x68,0x34,0xa,0x3, + 0x68,0x34,0xa,0x4,0x68,0x34,0xb,0x4,0x68,0x34,0xa,0x4,0x68,0x34,0xa,0x3, + 0x68,0x34,0xa,0x4,0x68,0x34,0xa,0x4,0x68,0x34,0xa,0x4,0x68,0x34,0xb,0x3, + 0x68,0x34,0xb,0x3,0x68,0x34,0xa,0x4,0x68,0x34,0xa,0x3,0x68,0x34,0xa,0x4, + 0x68,0x34,0xa,0x4,0x68,0x34,0xb,0x4,0x68,0x34,0xb,0x4,0x68,0x34,0xb,0x4, + 0x68,0x35,0xb,0x4,0x68,0x34,0xb,0x4,0x68,0x34,0xb,0x4,0x68,0x35,0xb,0x4, + 0x68,0x34,0xb,0x3,0x68,0x35,0xa,0x4,0x68,0x34,0xb,0x4,0x68,0x31,0x8,0x2, + 0x68,0x31,0x8,0x2,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x2,0x68,0x32,0x8,0x3, + 0x68,0x31,0x8,0x2,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x32,0x8,0x2, + 0x68,0x32,0x8,0x3,0x68,0x32,0x8,0x3,0x68,0x31,0x8,0x2,0x68,0x32,0x8,0x2, + 0x68,0x31,0x8,0x3,0x68,0x32,0x8,0x3,0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x2, + 0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x2,0x67,0x32,0x8,0x2, + 0x67,0x32,0x8,0x2,0x67,0x32,0x9,0x2,0x67,0x31,0x8,0x2,0x67,0x32,0x8,0x2, + 0x67,0x32,0x8,0x3,0x67,0x32,0x8,0x3,0x67,0x32,0x8,0x2,0x67,0x32,0x8,0x2, + 0x68,0x32,0x8,0x2,0x68,0x32,0x9,0x2,0x67,0x32,0x8,0x2,0x67,0x32,0x9,0x2, + 0x67,0x32,0x8,0x2,0x67,0x32,0x8,0x2,0x67,0x32,0x8,0x3,0x67,0x32,0x8,0x3, + 0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x3, + 0x68,0x32,0x8,0x2,0x68,0x32,0x8,0x2,0x68,0x32,0x9,0x3,0x68,0x32,0x8,0x3, + 0x68,0x32,0x9,0x3,0x68,0x32,0x9,0x2,0x68,0x32,0x9,0x3,0x68,0x32,0x9,0x3, + 0x68,0x32,0x8,0x3,0x68,0x32,0x9,0x2,0x68,0x32,0x9,0x3,0x68,0x32,0x9,0x3, + 0x68,0x32,0x9,0x2,0x68,0x33,0x9,0x3,0x68,0x33,0x9,0x3,0x68,0x33,0x8,0x3, + 0x68,0x32,0x9,0x3,0x68,0x32,0x9,0x2,0x68,0x33,0x9,0x2,0x68,0x32,0x9,0x3, + 0x68,0x32,0x9,0x3,0x68,0x32,0x9,0x3,0x68,0x33,0x9,0x3,0x68,0x30,0x7,0x2, + 0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2, + 0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2, + 0x68,0x30,0x7,0x2,0x68,0x31,0x7,0x2,0x68,0x31,0x7,0x2,0x68,0x30,0x7,0x3, + 0x68,0x30,0x7,0x2,0x68,0x31,0x7,0x2,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x2, + 0x68,0x30,0x7,0x1,0x68,0x30,0x7,0x3,0x68,0x30,0x7,0x2,0x68,0x30,0x7,0x1, + 0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x30,0x7,0x2,0x68,0x31,0x7,0x2, + 0x68,0x31,0x7,0x3,0x68,0x31,0x7,0x2,0x68,0x31,0x8,0x3,0x68,0x30,0x8,0x3, + 0x68,0x31,0x7,0x1,0x68,0x31,0x7,0x3,0x68,0x31,0x8,0x2,0x68,0x31,0x7,0x3, + 0x68,0x31,0x6,0x2,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3, + 0x68,0x31,0x8,0x3,0x68,0x31,0x7,0x3,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x2, + 0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x2,0x68,0x31,0x8,0x2,0x68,0x31,0x8,0x3, + 0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x31,0x7,0x1, + 0x68,0x31,0x8,0x2,0x68,0x31,0x7,0x2,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3, + 0x68,0x32,0x8,0x3,0x68,0x31,0x8,0x2,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x2, + 0x68,0x31,0x8,0x3,0x68,0x32,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3, + 0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x31,0x8,0x3,0x68,0x2e,0x5,0x1, + 0x68,0x2e,0x5,0x1,0x68,0x2e,0x5,0x1,0x68,0x2e,0x5,0x2,0x68,0x2e,0x5,0x2, + 0x68,0x2e,0x5,0x1,0x68,0x2e,0x5,0x1,0x68,0x2e,0x5,0x1,0x68,0x2f,0x6,0x1, + 0x68,0x2e,0x5,0x2,0x68,0x2e,0x6,0x2,0x68,0x2e,0x5,0x1,0x68,0x2e,0x6,0x1, + 0x68,0x2e,0x6,0x1,0x68,0x2e,0x5,0x1,0x68,0x2e,0x5,0x2,0x68,0x2f,0x6,0x1, + 0x68,0x2e,0x6,0x2,0x68,0x2f,0x5,0x1,0x68,0x2f,0x5,0x2,0x68,0x2e,0x5,0x1, + 0x68,0x2f,0x5,0x2,0x68,0x2f,0x5,0x1,0x68,0x2e,0x5,0x2,0x68,0x2e,0x6,0x2, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2,0x68,0x2e,0x6,0x1,0x68,0x2f,0x6,0x1, + 0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x1, + 0x68,0x2e,0x6,0x2,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x1, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x2, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x2, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1, + 0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2f,0x6,0x1,0x68,0x2c,0x4,0x0, + 0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x0, + 0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x1,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0, + 0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x1,0x68,0x2c,0x4,0x0, + 0x68,0x2c,0x5,0x0,0x68,0x2c,0x4,0x0,0x68,0x2d,0x5,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2c,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2d,0x4,0x1, + 0x68,0x2c,0x4,0x2,0x68,0x2c,0x4,0x1,0x68,0x2e,0x4,0x0,0x68,0x2d,0x4,0x1, + 0x68,0x2e,0x4,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x4,0x1,0x68,0x2e,0x4,0x1, + 0x68,0x2e,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x1, + 0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2e,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2e,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x1,0x68,0x2d,0x4,0x1, + 0x68,0x2d,0x4,0x1,0x68,0x2d,0x4,0x1,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2d,0x4,0x1,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0, + 0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x0,0x68,0x2d,0x4,0x2,0x68,0x2d,0x4,0x0, + 0x68,0x2d,0x4,0x1,0x68,0x2d,0x5,0x1,0x68,0x2d,0x4,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2b,0x2,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x1, + 0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2b,0x3,0x1,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x1, + 0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x1,0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2b,0x3,0x0,0x68,0x2b,0x3,0x1,0x68,0x2b,0x3,0x0,0x68,0x2c,0x3,0x0, + 0x68,0x2b,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x1,0x68,0x2b,0x3,0x1, + 0x68,0x2c,0x4,0x0,0x68,0x2c,0x3,0x1,0x68,0x2b,0x4,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2c,0x3,0x0,0x68,0x2b,0x3,0x1,0x68,0x2c,0x3,0x0,0x68,0x2b,0x4,0x1, + 0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0, + 0x68,0x2c,0x3,0x1,0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x1,0x68,0x2c,0x3,0x0, + 0x68,0x2c,0x4,0x1,0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x0,0x68,0x2c,0x3,0x0, + 0x68,0x2c,0x3,0x1,0x68,0x2c,0x3,0x0,0x68,0x2c,0x4,0x1,0x68,0x2c,0x3,0x0, + 0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x0,0x68,0x2c,0x3,0x1,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x3,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x29,0x2,0x0,0x68,0x2b,0x1,0x0,0x68,0x2b,0x1,0x0, + 0x68,0x29,0x1,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x1,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2b,0x2,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2b,0x1,0x0,0x68,0x2b,0x2,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x1,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x1,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x3,0x0, + 0x68,0x2a,0x1,0x0,0x68,0x2a,0x3,0x0,0x68,0x2a,0x1,0x0,0x68,0x2b,0x1,0x0, + 0x68,0x29,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x1,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x3,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x3,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x3,0x0,0x68,0x2b,0x1,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2a,0x3,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x1,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x3,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x29,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2b,0x1,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x29,0x2,0x0,0x68,0x2b,0x1,0x0,0x68,0x2a,0x1,0x0,0x68,0x2a,0x1,0x0, + 0x68,0x2b,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2b,0x1,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0,0x68,0x2b,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0, + 0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0x2a,0x2,0x0,0x68,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xfe,0x7,0xff,0x3f,0xff,0x83,0xf8,0x3f,0xf8,0x0,0xfc, + 0x3,0xff,0x0,0xf0,0x1f,0xf0,0x0,0x10,0x0,0x7f,0x0,0x40,0xf,0xf0,0x0,0x0, + 0x0,0x1e,0x0,0x0,0xf,0xf0,0x0,0x0,0x0,0x6,0x0,0x0,0xf,0xe0,0x0,0x0, + 0x0,0x0,0x0,0x0,0xf,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x1f,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xf8,0x0,0x0, + 0x0,0x0,0x0,0x0,0x3f,0xfc,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0, + 0x0,0x0,0x0,0x0,0x1f,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0, + 0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0, + 0x0,0x0,0x0,0x0,0x3,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xf8,0x0,0x0, + 0x0,0x0,0x0,0x0,0x3,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xfc,0x0,0x0, + 0x0,0x0,0x0,0x0,0x7,0xfe,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0x0,0x1, + 0x0,0x0,0x0,0x0,0xf,0xff,0xc0,0x3,0xc0,0x0,0xe0,0x0,0x1f,0xff,0xf0,0xf, + 0xf0,0x1f,0xf8,0x0,0xff,0xff,0xf8,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xf, + 0xde,0x1f,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0xf,0xff,0xff,0xff,0xff,0xc0,0x0, + 0x0,0x7,0xff,0xff,0xff,0xff,0xc0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0x80,0x0, + 0x0,0x3,0xff,0xff,0xff,0xff,0x80,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0x80,0x0, + 0x0,0x3,0xff,0xff,0xff,0xff,0xc0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xc0,0x0, + 0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xf0,0x0, + 0x0,0x3,0xff,0xff,0xff,0xff,0xf8,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xfc,0x0, + 0x0,0x3,0xff,0xff,0xff,0xff,0xfe,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xff,0x0, + 0x0,0x7,0xff,0xff,0xff,0xff,0xff,0xe0,0x0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/down_arrow.png + 0x0,0x0,0x0,0x85, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x2,0x0,0x0,0x0,0xb4,0xb4,0x2,0x1d, + 0x0,0x0,0x0,0x4c,0x49,0x44,0x41,0x54,0x78,0x9c,0xd5,0xd0,0xb9,0x11,0x80,0x0, + 0x8,0x44,0xd1,0xfd,0x43,0x63,0x94,0x46,0x69,0x74,0x86,0x81,0x8e,0xf7,0x81,0x91, + 0xe3,0xc6,0xef,0x13,0x20,0xfd,0x73,0x54,0x55,0x5f,0x1b,0xe0,0xee,0xad,0xc3,0x60, + 0x99,0xd9,0x9,0x0,0x49,0x26,0xe9,0x31,0x18,0xe9,0xa4,0xef,0x83,0x99,0x2e,0xfa, + 0x2a,0x58,0xd3,0x8d,0x3e,0x6,0x3b,0x7a,0xbe,0x88,0x78,0xf5,0xd6,0x4f,0x36,0x0, + 0xa9,0xcf,0x17,0x72,0x33,0x67,0xb2,0xe,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44, + 0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/cusdrLogo.png + 0x0,0x2,0x10,0x6e, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x1,0xf4,0x0,0x0,0x1,0x2c,0x8,0x6,0x0,0x0,0x0,0x35,0xbb,0x41,0xc8, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1, + 0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdb,0x8,0x1d, + 0x11,0x18,0x20,0x82,0xbf,0xf3,0x19,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78, + 0xda,0x94,0xbd,0x5d,0xaf,0x6e,0x5d,0x76,0x14,0x36,0x6a,0xb1,0x85,0x72,0xc1,0x2f, + 0x89,0x88,0xb2,0x13,0x23,0x1b,0x84,0xed,0xc6,0xbe,0x23,0x88,0x3b,0x2e,0xa3,0x28, + 0x96,0x83,0x8c,0xe3,0xf0,0x61,0xc7,0x49,0x24,0x64,0x84,0xc2,0x47,0x42,0x1a,0x6c, + 0xec,0x10,0x1c,0x22,0x4,0x52,0x24,0xee,0x72,0x15,0x21,0xe4,0xbb,0xa4,0x3b,0xb4, + 0x90,0x4d,0x2,0xbd,0x7f,0xd1,0xae,0x5c,0xec,0xb5,0xe6,0xac,0xaa,0x31,0xe6,0x73, + 0x5e,0xda,0x6a,0xf7,0xfb,0x9e,0xf3,0x7c,0xac,0x67,0xad,0x39,0xe7,0x18,0xa3,0x46, + 0x8d,0x2a,0xd4,0x1f,0xfa,0xf7,0x7f,0x5c,0x55,0x55,0x44,0x15,0xaa,0x8a,0x25,0xff, + 0x61,0xad,0x3f,0x5c,0x7f,0x87,0x2a,0x70,0xff,0xb3,0xbd,0x1,0xfe,0x9e,0xf1,0x25, + 0xf7,0x1f,0x10,0xf2,0x1d,0xf9,0x5e,0xf9,0x73,0x40,0xde,0x3f,0xbc,0x56,0x3f,0x1f, + 0xf7,0x3f,0xd8,0x6f,0xe1,0xe1,0xf2,0x20,0x7f,0x7e,0xff,0x9e,0xf5,0x5d,0xf9,0x7b, + 0xab,0x8a,0x72,0x3d,0x25,0xff,0xfe,0x5c,0xef,0xcb,0x7b,0xa7,0xef,0x99,0x7e,0x77, + 0xbe,0x2f,0xff,0xf3,0xea,0xf7,0x3c,0xcf,0x3,0xfd,0xfe,0xe8,0xef,0xa9,0xfc,0x2d, + 0xfa,0x3e,0x7d,0x1b,0x87,0x7b,0x9e,0xcf,0xa6,0xe2,0xf9,0xca,0x9a,0xb0,0x7b,0x2b, + 0x9f,0x85,0xef,0xf0,0xcc,0xed,0x37,0xc6,0xf5,0x21,0xde,0xd3,0x3e,0x6b,0x78,0xae, + 0xd3,0x77,0xd9,0x3d,0xc1,0xe1,0x75,0xc3,0xfd,0xa8,0x58,0x67,0xf9,0x3d,0xf9,0xfb, + 0xd6,0xb5,0xe8,0xbd,0xe7,0xf0,0x78,0x87,0xcf,0x19,0x7f,0xe3,0xfd,0xec,0x9e,0xf, + 0x68,0x4b,0x69,0xb8,0x1f,0xdf,0xba,0xbf,0x35,0xdd,0x87,0x1a,0xf6,0x77,0xfc,0x2e, + 0xfb,0xce,0x57,0xf7,0xb4,0x6a,0xbe,0xd8,0x5c,0x87,0xb9,0xee,0xf2,0xdc,0x99,0xd6, + 0x6d,0x9e,0x3,0xf7,0xff,0x52,0xd6,0x5d,0xf1,0x70,0x6f,0xa6,0x6b,0xac,0xbe,0xcf, + 0x99,0xfb,0xfa,0x70,0xe6,0xe8,0xf5,0xd,0x47,0xe0,0xfe,0x3c,0x9e,0xbf,0x7b,0xdd, + 0xc7,0xbc,0xf6,0xe1,0xc,0xc8,0xb3,0x60,0xfd,0xbc,0xdc,0x33,0x7a,0x4d,0x98,0x7f, + 0x6b,0xae,0x6d,0x3d,0xaf,0xaa,0xfc,0x7e,0xca,0xb3,0xf9,0xfa,0xd7,0xf8,0xa1,0x79, + 0xee,0xca,0x3d,0xfc,0x7a,0x64,0x3c,0x3f,0x33,0xc,0x47,0x4,0xe,0xff,0x5b,0x2f, + 0x96,0xef,0xf8,0xe8,0xb9,0xef,0x8d,0xbe,0x99,0xba,0xdf,0x5e,0x1c,0x1b,0xcf,0x6f, + 0x1e,0x8e,0xf0,0xe3,0xad,0xad,0xf3,0xf6,0x6a,0xcb,0x2d,0x8e,0x70,0x7f,0x24,0xfd, + 0xc7,0x9f,0x3e,0x1f,0x55,0x75,0xd9,0x62,0x99,0x36,0xe1,0xba,0xe9,0xf0,0x7f,0x7, + 0xe6,0xa0,0x83,0x6f,0x1c,0x58,0xe4,0xbe,0x91,0x78,0xb5,0xc0,0x25,0x8,0x42,0xff, + 0xec,0xb9,0x56,0xdd,0xd8,0xec,0x8b,0xd2,0x9e,0x2e,0xea,0x9c,0xb4,0x4c,0xd7,0x29, + 0x9b,0xb9,0x24,0x50,0xd5,0xb3,0x29,0x39,0xdc,0x2b,0xca,0x81,0x4c,0xbf,0x87,0xa4, + 0x27,0x43,0xf6,0x14,0x38,0x7,0x26,0x7b,0x2e,0xc3,0x77,0x2,0xfb,0xf7,0x64,0xe2, + 0xd0,0x72,0x3,0x59,0x81,0x19,0x4b,0xf5,0xb3,0x29,0xbf,0x11,0xf1,0x9b,0xe2,0xf6, + 0x7c,0xfd,0x17,0xbe,0x39,0x2a,0x12,0xa2,0xb5,0x62,0x75,0x43,0xb1,0xdf,0x6b,0xfb, + 0x7e,0xfa,0x7d,0x2f,0xbd,0xf7,0xf7,0xe7,0x13,0x1e,0x5c,0xa,0x43,0x2e,0xf4,0x2a, + 0x40,0x4f,0x87,0xa9,0x5e,0xcb,0xf4,0xfc,0xee,0x3f,0xb7,0xe7,0x25,0x7f,0xa6,0x6b, + 0xfa,0x79,0x36,0xcf,0x73,0x42,0x4,0x49,0xbd,0x6f,0x79,0x28,0xaf,0x7b,0x28,0xcf, + 0xde,0xe,0x58,0xd9,0x8b,0x9c,0x12,0x18,0xb9,0x5f,0x9a,0x40,0xeb,0xb3,0x40,0xec, + 0x55,0xf0,0x74,0xdc,0xec,0xef,0xd6,0xc3,0x97,0xba,0xff,0x31,0xec,0x27,0xce,0x27, + 0x6c,0xee,0xeb,0xca,0xc0,0x25,0x67,0x2,0xe2,0xb3,0x9f,0xe0,0x93,0xc1,0x3c,0xaf, + 0x3,0x7a,0xce,0xa0,0x47,0x1,0xa0,0x9f,0x11,0x76,0x7f,0xf6,0x1e,0x40,0xae,0x41, + 0xc0,0x6f,0xab,0x5,0x51,0xfa,0x3d,0x27,0xbe,0x42,0x0,0xca,0xaf,0xb1,0x86,0x7d, + 0x74,0xff,0xe,0x70,0xba,0x57,0xe8,0xdb,0xc5,0xce,0xe7,0xfb,0x7b,0x34,0x9,0xb4, + 0x67,0xb,0x3b,0xf1,0x91,0x5,0x8c,0xbc,0xc,0x38,0xd5,0x14,0xfa,0x7e,0xec,0x63, + 0xf0,0xfe,0x66,0xbb,0xce,0x75,0xe4,0xfa,0x6f,0x25,0x7c,0xed,0x3,0xf2,0xfe,0xe7, + 0xad,0xf1,0x9e,0xfd,0x31,0x28,0xe8,0xdf,0x1,0x85,0x7b,0xdd,0xeb,0x73,0xc0,0xfd, + 0x7,0xeb,0x94,0x41,0x5e,0x5b,0x4,0x28,0xb9,0x37,0xc8,0x9b,0xfc,0x5c,0xe7,0x3e, + 0xec,0xfc,0xfb,0xec,0xf9,0xe9,0x1f,0x21,0xb6,0x33,0xf6,0xa7,0x40,0xff,0x1e,0x45, + 0x7d,0x7e,0xeb,0x77,0x96,0x5c,0x3f,0xda,0x11,0x7,0xdc,0xef,0x8b,0x25,0xf9,0xbc, + 0xee,0xf2,0x43,0x6c,0xd8,0xd8,0x96,0xd9,0x50,0xe,0xd5,0xc,0x3a,0xba,0x21,0xb8, + 0x7f,0x2d,0xa7,0x85,0x25,0x87,0xb3,0x1e,0xe0,0x80,0x1f,0x2e,0xcf,0x7b,0xc8,0x8, + 0x12,0x1a,0x68,0xe9,0x8b,0x97,0x18,0xe,0x82,0xf2,0x80,0x96,0x41,0x92,0x99,0xb1, + 0x4d,0xc5,0xc9,0x84,0x46,0x20,0xaa,0xd4,0xf2,0xec,0xb8,0xe2,0xde,0xe9,0x2,0x6b, + 0x49,0xc8,0x21,0x48,0xd9,0x7d,0xe4,0x39,0x41,0x1a,0x77,0x62,0x6,0x2f,0xf8,0xfb, + 0x5a,0x1e,0x43,0x7f,0x76,0xfa,0xdf,0x15,0x44,0xb9,0xf,0x75,0xb,0x74,0xe5,0xc1, + 0xe2,0x50,0x84,0xf8,0x1,0x7b,0x48,0x14,0x58,0xfd,0x99,0x25,0xa,0x83,0x3c,0x94, + 0x23,0x20,0x23,0x6e,0xa1,0xde,0x1b,0x66,0x22,0x26,0x1,0x38,0x2b,0xe1,0x4c,0x60, + 0x29,0xf7,0x64,0xfa,0x33,0xc6,0x3e,0x58,0xf7,0x2a,0x7e,0x4f,0xe9,0xe7,0xd2,0x7f, + 0xf3,0xa,0x10,0xfd,0x76,0xed,0xfb,0xc4,0x58,0x67,0xf5,0x15,0x80,0x80,0xe1,0xb0, + 0x91,0x24,0xa1,0xe0,0xb9,0x8,0xf4,0x50,0xcd,0x84,0xb,0xc3,0x3e,0x47,0xdc,0x1b, + 0xfd,0xdf,0x29,0xb1,0xf4,0xc4,0x6,0xa8,0x1e,0xb4,0x57,0xad,0x80,0x7d,0x30,0xaf, + 0xbd,0x8d,0x82,0x24,0x13,0xa0,0x7c,0x96,0xee,0x3f,0xbb,0x34,0xd,0xa6,0x71,0xea, + 0xb1,0xe2,0x7b,0xf5,0xb0,0x86,0x7d,0x36,0xd7,0x3f,0x1f,0x70,0x34,0xf4,0x0,0xa0, + 0x67,0x2,0xf5,0x0,0x67,0x5c,0x87,0x6,0xd3,0xc2,0x5d,0xa1,0x45,0x10,0x59,0x7b, + 0xe9,0xb2,0x24,0xed,0xeb,0xed,0x97,0xc5,0xfe,0x27,0x98,0x1,0x53,0x78,0xd9,0x1f, + 0x45,0x9,0xca,0x90,0xbf,0xdf,0xc7,0x74,0x6,0xcf,0x5a,0xff,0x8e,0x8,0xea,0x99, + 0xcb,0xc1,0x92,0x8f,0x1d,0x48,0x81,0x48,0xa6,0xa6,0x1c,0xb0,0x45,0x46,0xdc,0xd7, + 0xf5,0xf5,0x23,0x9,0xde,0xbf,0xdb,0x13,0x4c,0xca,0xd9,0xe5,0xb9,0x17,0x64,0xed, + 0xf4,0xa0,0x98,0x99,0xc,0xed,0xee,0xde,0xdf,0x7c,0x79,0xf8,0x62,0xed,0x60,0x5a, + 0x99,0x30,0xe8,0xe9,0x73,0x7,0x5d,0xe0,0xb9,0xf6,0x48,0x2c,0x9e,0xef,0xb3,0xa3, + 0x12,0x52,0xa3,0xed,0x67,0xc0,0xaf,0x4f,0x5a,0x7b,0x95,0xba,0x7e,0xe5,0xbf,0xbc, + 0xd7,0xeb,0x5b,0x83,0xf6,0xac,0x92,0x90,0x4c,0x17,0x87,0x6a,0xa0,0x55,0x56,0xa, + 0x2f,0xc5,0x29,0xdd,0xe0,0x58,0x9,0xc,0x25,0xef,0x81,0x1e,0xe2,0x53,0x10,0x92, + 0x0,0xc3,0xac,0x3e,0x27,0x98,0x31,0x70,0x8c,0x6,0x35,0xc5,0xe1,0x58,0x13,0x14, + 0x7d,0x80,0x7b,0xad,0x52,0x3e,0xc1,0xd0,0x7,0xb4,0x1,0x99,0x4,0x55,0x7c,0xd6, + 0x0,0xa3,0x9f,0xa0,0xe4,0xf1,0x8f,0xd0,0x21,0x3a,0x43,0x1a,0x70,0xa8,0x94,0xca, + 0xa1,0x3f,0xbd,0xa7,0xad,0xbd,0x11,0xc9,0xb,0xb3,0xe5,0x12,0xd5,0x25,0xa2,0x92, + 0xe7,0x80,0xc6,0x20,0xd0,0x94,0xfb,0x7e,0x7c,0xdd,0x4e,0x9c,0x93,0x14,0xc5,0xec, + 0x24,0x20,0x68,0x62,0xf5,0x75,0x50,0x33,0x4a,0x7,0x46,0x79,0xe2,0x6b,0xe8,0x81, + 0x17,0x81,0xe7,0x0,0x19,0xd0,0x90,0x96,0xa7,0x33,0x2a,0xe,0xc8,0xa7,0x7e,0x5d, + 0x27,0x2b,0xda,0x3a,0xb9,0xb9,0xed,0x7a,0xe3,0xfa,0x88,0x86,0xf2,0x2a,0x12,0x85, + 0x40,0x9f,0xc9,0xa1,0x73,0x3,0x8,0xc,0xfa,0x54,0x3e,0xfd,0xb6,0x30,0x72,0x74, + 0x4d,0x7e,0x9e,0x43,0x8d,0x51,0x11,0x42,0xe0,0xcd,0xe7,0xa8,0x85,0xec,0x5,0xc4, + 0xf6,0x86,0x7e,0x46,0x7b,0xb6,0xd7,0x7a,0x7e,0xab,0x3a,0x21,0x64,0x89,0x3c,0xc7, + 0x3e,0xe4,0xa0,0xe7,0x50,0x39,0x7d,0x3d,0x13,0xdc,0xfb,0x80,0xe5,0x49,0xb7,0x1d, + 0xea,0xe0,0xfd,0x14,0x6b,0x5,0x93,0xcc,0xf4,0xb1,0xe,0xeb,0xe7,0xb6,0x70,0xb8, + 0xf6,0xfb,0xb3,0x1,0x9,0x4f,0x12,0x58,0xee,0x7d,0xb6,0xe,0x6e,0x5f,0x41,0xf2, + 0xbf,0x2,0x59,0xdf,0xfb,0x81,0xb6,0x25,0xb1,0xc2,0x1b,0xf2,0x37,0xd1,0xef,0xd2, + 0x73,0x6d,0xb4,0x5a,0x2f,0x61,0xff,0x5a,0x55,0x30,0x25,0x26,0x30,0x7e,0xdf,0xfe, + 0xdd,0xb8,0x7f,0xa,0x6,0x98,0x1e,0xfa,0xb1,0x2b,0xa0,0x95,0xc0,0xcc,0xfb,0xb7, + 0x42,0xc2,0x7,0xd6,0x75,0x2c,0x60,0xa8,0xf8,0x75,0x5d,0x80,0xff,0x6a,0x5b,0xdf, + 0x90,0x30,0x82,0x7e,0x8c,0xf1,0xa9,0x9c,0x9f,0xfb,0xe8,0xb0,0xb,0xee,0xd,0xb0, + 0xbb,0x40,0x88,0xe3,0x10,0x9e,0xe7,0xca,0x42,0x5e,0xfb,0x16,0x91,0x52,0xe1,0x80, + 0x1b,0xc2,0x1,0x4c,0xdc,0x51,0x3e,0x9f,0xc,0xac,0x42,0xaf,0x2,0x68,0x61,0xac, + 0x57,0xe8,0x18,0x2,0x6e,0x2b,0x8,0x29,0x50,0x79,0xd,0x95,0xf4,0xd0,0x5f,0x46, + 0x54,0xf6,0x60,0xeb,0xaf,0x78,0x25,0x54,0xe7,0x1e,0x72,0xf6,0xaf,0x31,0x54,0x5f, + 0x5a,0xb9,0x0,0xbd,0x2a,0x69,0x3d,0x94,0x44,0x10,0xe2,0xb3,0x18,0x48,0x0,0x10, + 0x95,0x1d,0x7,0xb8,0x1c,0x56,0xb5,0x40,0xab,0x68,0xa2,0x37,0x79,0x40,0xcf,0xee, + 0x33,0xb1,0xd1,0xdf,0x6f,0x88,0x1,0xa4,0x8a,0x49,0x48,0x51,0x36,0x38,0x87,0x7b, + 0x1,0xf8,0xcf,0x46,0xc0,0x61,0x79,0x2b,0x30,0x5,0xd2,0xbc,0xb7,0x88,0xa,0x71, + 0xff,0x1e,0x64,0xa5,0xac,0x95,0x25,0x12,0x56,0xc7,0xb0,0x14,0xee,0x8a,0x89,0x43, + 0xfb,0x5,0x9,0x33,0x3b,0xbc,0xa5,0xaf,0xb7,0x6c,0x99,0x30,0x78,0x10,0x4c,0xa8, + 0x7a,0x1f,0x62,0x18,0x70,0x4f,0xcd,0xa4,0x75,0x1d,0x1,0x18,0xe0,0x43,0x48,0xa1, + 0xfd,0xf5,0xf7,0x40,0x56,0x9b,0x68,0xb9,0xd9,0xfe,0xee,0xe7,0xa,0x2e,0xc9,0x69, + 0xbd,0x7c,0x24,0x2,0x1d,0xba,0xaf,0x8f,0x52,0xd,0x5b,0x25,0x26,0x9,0xde,0xe, + 0xb0,0xfa,0xdb,0x64,0x8b,0x5c,0xfe,0x5b,0xbd,0x6d,0xa9,0x6b,0xe,0xf6,0x67,0x5c, + 0xbf,0x20,0x2,0x36,0xf6,0xf5,0xc1,0xa1,0x94,0xfb,0xbd,0xf0,0xf7,0xdd,0xf7,0x6b, + 0x2f,0x7f,0x2e,0x44,0xe1,0x39,0xc4,0x1,0xca,0x6b,0xbc,0xda,0x65,0x4,0xfc,0x7d, + 0x0,0xd3,0xe1,0xd5,0xe7,0xb0,0x5e,0xff,0xeb,0xeb,0x1a,0x82,0x44,0xb0,0xb2,0x2a, + 0x7f,0xee,0x11,0x1a,0xda,0x1,0xab,0x8c,0xf7,0x81,0xcc,0xfc,0xed,0xab,0x12,0x94, + 0xbb,0xa1,0xf7,0xea,0xe9,0x5d,0x13,0x52,0x85,0xc6,0x7d,0xb3,0xea,0x15,0x92,0xb8, + 0xc4,0xef,0xc2,0xe,0xa0,0x9a,0x68,0x3f,0x48,0x1,0x9f,0x7b,0xcf,0x6b,0x57,0xe9, + 0xc3,0x96,0x53,0x48,0x99,0x59,0xd5,0x3f,0xeb,0x4f,0x8e,0x7c,0xb2,0x1c,0x82,0x5e, + 0xaf,0x87,0x3c,0xcb,0xb2,0x24,0xd1,0xea,0xe0,0x1,0x98,0x51,0x70,0x17,0xa5,0x9f, + 0xab,0xf8,0x3b,0xbc,0x8b,0xa1,0x49,0x43,0xec,0xb5,0xe7,0xbd,0x9a,0x84,0xe8,0xde, + 0x2,0x3b,0x4a,0x4b,0x85,0xef,0x5b,0xbb,0xb0,0x56,0xca,0x86,0x44,0xf7,0x4,0x25, + 0xdb,0xbf,0x52,0xce,0x4c,0x79,0xbe,0x5c,0xff,0x3f,0x90,0x86,0xfb,0x1d,0x97,0x55, + 0x99,0x46,0x58,0x88,0xa,0x96,0x1d,0xd1,0x5c,0xff,0x42,0x81,0x1,0x9,0xf,0x8e, + 0x3c,0x54,0x78,0x1c,0xfa,0xc1,0xeb,0x23,0x31,0x43,0xa5,0xad,0xd9,0x73,0xf7,0xba, + 0x10,0xd0,0x77,0x42,0xee,0xad,0xf7,0xb9,0xab,0x55,0xb4,0x2a,0x17,0x91,0x63,0xa0, + 0x41,0xee,0xc0,0x1c,0xb8,0x40,0x39,0x78,0xa5,0x5f,0xb3,0xf,0x5e,0x58,0x45,0xe2, + 0xc1,0x59,0xcf,0xb9,0x1,0xc2,0xcb,0xe0,0xaa,0x8b,0x4b,0x36,0x81,0x17,0xfb,0x68, + 0x68,0x72,0xe7,0x29,0xf5,0x4c,0x90,0x52,0xe5,0xe9,0x93,0x46,0xc0,0x61,0xbb,0x4a, + 0xcb,0x3e,0x1f,0xac,0xfb,0x34,0xf2,0x13,0x2a,0xa1,0x23,0xef,0xcd,0xef,0xdf,0xa4, + 0x3d,0xae,0x80,0x5a,0x23,0x14,0xc0,0x72,0x35,0x48,0xcd,0xe3,0xaf,0xca,0xdf,0xba, + 0xb6,0x10,0xfc,0x5a,0x1d,0xf4,0xcb,0xbf,0xdf,0x15,0x5f,0x5d,0xde,0x87,0xdb,0x21, + 0x4c,0xe1,0x53,0x46,0x55,0x2b,0x15,0x47,0xc1,0x10,0x71,0x64,0xdf,0x55,0x2,0xf6, + 0x57,0xd0,0xf2,0xdf,0xc6,0xe8,0xcd,0x69,0xf0,0x64,0xd0,0x5d,0x30,0xc0,0xcd,0x18, + 0x8,0x38,0xda,0xc7,0x7b,0xe,0x30,0x92,0x12,0xb2,0xb1,0xd6,0x29,0x2c,0x1,0xa0, + 0x7c,0xb4,0x6,0x1b,0xf,0x2e,0x4c,0x80,0x2a,0x2,0x1b,0x6a,0xe8,0x1e,0xd0,0x7b, + 0xc6,0xc4,0xfe,0xef,0xb3,0xf7,0x29,0xbf,0x1d,0x79,0x64,0xc8,0x7d,0x22,0x34,0x51, + 0xc2,0x8,0xb8,0x34,0x9a,0x80,0x42,0xf0,0xc8,0x9a,0x1d,0x76,0xdc,0x71,0x25,0x76, + 0xb5,0xaa,0xd7,0xf5,0xcf,0x12,0xa0,0xb3,0xbf,0xee,0xdd,0x43,0x49,0xc,0x57,0x55, + 0xbb,0x13,0x5e,0xea,0x77,0x1b,0x88,0xa,0x43,0x6c,0x10,0xad,0x3,0x18,0xdd,0x23, + 0x12,0x56,0x39,0x53,0x0,0xb6,0x1d,0x46,0xf6,0x56,0xc5,0xa,0x3f,0xf4,0x5f,0x81, + 0x95,0x98,0x50,0x60,0x66,0x3f,0x57,0x1e,0xe4,0xad,0x15,0x6d,0x6d,0x47,0x25,0xcc, + 0x9c,0xc4,0xb1,0x84,0xe9,0xe5,0xf5,0x97,0x20,0xc4,0xfa,0x1a,0x3d,0x5b,0xac,0x5d, + 0xc1,0xf1,0xde,0x65,0xf2,0x56,0x96,0x4,0x63,0xe8,0x34,0xc9,0xde,0xbf,0xf6,0xde, + 0xf3,0xc4,0x3e,0x8,0xbf,0xc3,0xbd,0xd5,0x73,0x3,0x96,0xa8,0x46,0x82,0x83,0xaa, + 0xb7,0x8a,0xec,0xa9,0x73,0xc6,0xd0,0xfb,0xba,0xab,0x5f,0x81,0x11,0x22,0x43,0x64, + 0x2c,0xd,0x6e,0x3d,0xf6,0x4d,0x36,0x94,0xf6,0x54,0xf4,0x50,0x68,0x8c,0x1,0x8, + 0xe8,0x1,0x8a,0x7b,0xb1,0x9,0xf4,0x6f,0xd9,0x9e,0x1c,0x66,0x94,0x9e,0x26,0x23, + 0x12,0x7c,0xbd,0xf6,0xd2,0xee,0xc5,0x82,0xcb,0x56,0xc5,0xb0,0x98,0x9e,0x6c,0x7, + 0xeb,0xdc,0xbb,0x4e,0x18,0xcd,0x39,0x53,0x23,0x8c,0x35,0x31,0x9b,0xf5,0xe8,0x45, + 0x7,0xdf,0x57,0x68,0xc8,0x40,0xa5,0xdf,0x10,0x30,0xab,0xc1,0x95,0xfa,0x54,0x31, + 0xac,0x83,0x5,0x3b,0xb,0xeb,0x33,0xae,0xff,0xeb,0x6f,0xbd,0xbf,0x85,0xcb,0xa1, + 0x7c,0x85,0x93,0x8d,0x28,0x2d,0x89,0x4d,0x83,0x53,0x49,0x83,0x66,0x41,0x9f,0xbe, + 0x78,0xa0,0xd4,0x5,0x97,0x45,0x7d,0xbb,0xef,0xd5,0x5e,0x54,0x9,0xd0,0x90,0xde, + 0x67,0xa4,0xb4,0x29,0xa0,0xd5,0x14,0x76,0x86,0xe,0x96,0x41,0xcb,0xf,0x44,0x4e, + 0x62,0x20,0x19,0x79,0x6b,0x3,0x72,0x30,0x5b,0x2,0x49,0xa9,0x72,0xe8,0x70,0x21, + 0xa3,0xa9,0x8b,0x8d,0x45,0x1a,0x18,0xd6,0xe0,0xbc,0x42,0x4b,0x28,0xb4,0x4b,0xb1, + 0xf6,0x9d,0x2d,0x9e,0x80,0x16,0x83,0x5c,0xaa,0xeb,0x6,0xd1,0x9f,0x64,0xd,0x40, + 0x4d,0xae,0x49,0x8,0x14,0xce,0xcd,0x3,0x70,0x6,0x6f,0xe7,0x18,0x28,0xad,0x67, + 0xad,0xf9,0x5,0xa3,0xd2,0xde,0x56,0x70,0x88,0x7c,0x27,0x9c,0x6c,0xbc,0x57,0x3f, + 0xab,0x5,0xbc,0x95,0x36,0x18,0xd,0x83,0xd8,0xd5,0x30,0x6c,0x85,0xc5,0x77,0x36, + 0xb4,0x26,0x76,0x2c,0x22,0x10,0x82,0x16,0xe,0x3d,0x46,0xcc,0x69,0xaa,0xb6,0x9, + 0xfc,0xbb,0xf7,0xa2,0xa0,0x75,0xb3,0xfc,0x4c,0x58,0x7b,0x8,0xf5,0x85,0x28,0xe6, + 0xa4,0x92,0x77,0x3e,0xe4,0xd6,0xee,0x27,0xda,0x10,0x44,0x70,0xaf,0x71,0xfa,0x1a, + 0x6c,0x49,0x44,0xe,0x46,0x3d,0x7b,0xcc,0x2,0x13,0x5b,0x40,0x5,0xf3,0xc0,0x1a, + 0x20,0xf6,0x86,0x79,0x4b,0x45,0x6c,0x44,0xe9,0x3c,0x94,0x31,0x9c,0xcb,0x35,0x12, + 0xf5,0xa3,0x7f,0x54,0xc5,0xeb,0x38,0x5c,0x91,0xa0,0x9e,0xa1,0xb6,0x13,0x55,0x4a, + 0xd7,0x36,0xe2,0x2,0x48,0x79,0x30,0xb8,0x3,0x3a,0x6,0x36,0x22,0x39,0x4c,0x64, + 0x41,0xb7,0x50,0x64,0xa7,0xdc,0x30,0x45,0x84,0x8,0x4c,0x4,0xf3,0xfc,0xf7,0xeb, + 0x39,0x54,0x3c,0xe0,0xd9,0xd2,0xc6,0x90,0x97,0x49,0x45,0xb6,0xfa,0x5e,0x31,0xba, + 0xc1,0x9a,0x89,0x6e,0x9a,0x41,0xb2,0xe6,0xfe,0x3f,0xef,0x5,0xce,0xb5,0xe8,0x9f, + 0x2a,0x9e,0x1,0x2b,0xd6,0x14,0x16,0x25,0x28,0xdd,0xef,0x80,0xb2,0x68,0x9f,0xca, + 0x8c,0x2,0xcb,0x70,0x57,0x76,0xda,0x87,0xe4,0xbe,0xd7,0xc9,0xd5,0xdb,0x13,0x63, + 0x7b,0x95,0x41,0xc6,0xbd,0xc,0x4a,0xa6,0x1f,0x1c,0x24,0x56,0x8f,0xc,0xc1,0x5e, + 0x45,0xb4,0x5b,0xa8,0xe8,0xc3,0xfa,0x78,0xae,0xe4,0xa,0xd4,0xea,0xda,0x3b,0x33, + 0x59,0x89,0xc5,0xa3,0xdc,0x9f,0x6d,0x44,0x2e,0x39,0xf0,0x34,0xb6,0x71,0x27,0x74, + 0x23,0xf4,0xb,0x39,0xc,0x99,0xc7,0x39,0x2,0x0,0xdf,0xcf,0x74,0x77,0x50,0x20, + 0xfd,0xeb,0x24,0x7d,0x7b,0xd2,0xc8,0x3c,0x54,0xaa,0xbe,0x80,0x2f,0x4,0x27,0xa0, + 0x60,0xd0,0xdd,0x94,0xd6,0xee,0x9c,0x17,0xd2,0x67,0x67,0x1,0x97,0x40,0xaf,0x1a, + 0x88,0xd0,0x47,0x35,0xe3,0xb0,0x76,0x14,0xac,0x5d,0xb0,0xe5,0xd9,0x18,0x98,0xd4, + 0x2d,0x7,0xbf,0xd7,0x17,0x15,0x81,0x41,0xef,0x19,0xa3,0xf5,0xb1,0x25,0xc0,0xb0, + 0x4f,0x20,0x0,0xfe,0x5e,0x47,0xe8,0x86,0x56,0x1c,0x7c,0x97,0x31,0xc6,0x8b,0xa, + 0xde,0x23,0xa6,0x62,0x11,0x43,0x7f,0x13,0x36,0x66,0x28,0x21,0x1b,0x3a,0xd1,0xa, + 0xa7,0xb7,0x44,0xff,0x99,0x8a,0x0,0x4d,0x63,0x6a,0xb8,0x51,0xe,0x20,0x26,0x49, + 0xb3,0x9a,0x42,0x8c,0x3d,0xe,0xd9,0x7f,0x4e,0x8b,0xb1,0x57,0x73,0xd9,0x5a,0x84, + 0xd1,0x68,0xd0,0x2,0x7,0x30,0x40,0x13,0x35,0xd,0x23,0x5d,0x92,0x1c,0x65,0x12, + 0x38,0xa1,0x6f,0x7b,0xed,0x76,0xa,0xa,0xe2,0x1c,0x9,0x40,0xd5,0xce,0x6d,0x9c, + 0xd7,0xb5,0x71,0x68,0x78,0x1c,0xa8,0x6e,0xd,0x6c,0xb0,0xb5,0x48,0xed,0x60,0x6a, + 0xe0,0x72,0x70,0xba,0x90,0xc4,0xf1,0x32,0x2,0x39,0x84,0xb7,0xc1,0xa9,0x40,0xe3, + 0xbc,0xbf,0xf6,0x9,0x45,0x69,0xf1,0x64,0xc,0x66,0x2c,0x9,0xd6,0x5b,0xd4,0x16, + 0xbd,0x2a,0x5d,0xcc,0x3a,0x8e,0xc,0x1b,0x92,0xc1,0x7b,0x42,0x9f,0x65,0xbe,0x37, + 0x31,0xa3,0xf4,0xcb,0xd1,0xef,0xb6,0xc9,0xee,0xef,0xa1,0xcc,0x31,0xc2,0x4b,0x5a, + 0xef,0xab,0xa2,0x7c,0xe3,0x6a,0xf5,0x9c,0xed,0x5b,0xcb,0xa9,0xd1,0xfb,0x2a,0xb6, + 0x46,0x9e,0x4a,0x4c,0x9,0x2e,0x90,0xf5,0xe3,0x87,0x75,0x3,0x11,0x65,0x3e,0xb4, + 0xf5,0x64,0x94,0xb2,0xd3,0x36,0x37,0xfa,0x28,0x6a,0x3f,0x23,0x6c,0xc1,0x67,0x32, + 0xa1,0x9f,0xd1,0x27,0x90,0xa4,0xc7,0x2a,0x23,0x2f,0xce,0x77,0xdb,0xcf,0x3b,0x89, + 0x19,0x5f,0x90,0xf3,0x25,0x93,0x8d,0x6c,0x77,0x7e,0x11,0xda,0x1e,0xe2,0xf,0x37, + 0xf3,0x13,0x36,0x65,0x3,0xb,0x24,0xda,0x42,0xd8,0xf4,0xa,0x7c,0x55,0xea,0x16, + 0x5c,0x6b,0x80,0xca,0x1c,0xc2,0x72,0x20,0x2e,0xc6,0xb9,0x22,0x70,0x6b,0x75,0xc6, + 0x40,0x55,0x0,0x44,0x95,0xd6,0x5a,0xf7,0xab,0xc7,0xb5,0xa0,0x3e,0x32,0xd9,0x33, + 0x9d,0x80,0xd5,0xe8,0x8e,0x6c,0x41,0x16,0x99,0xde,0x26,0xab,0xe6,0xd2,0xa,0x6, + 0x27,0xae,0x5d,0xfb,0x7e,0xb4,0xd3,0x4e,0xda,0x4a,0x6c,0xd8,0x46,0x63,0x14,0xd0, + 0x50,0x93,0x7e,0xa5,0x95,0x7d,0xc8,0xc6,0x3f,0xd,0x56,0x7d,0x83,0x8,0xd1,0xe, + 0x56,0xe4,0x8f,0x1b,0x3e,0xbf,0x6,0x4,0x48,0x9a,0xd4,0xd5,0xe7,0xba,0xfb,0x94, + 0x4a,0x9e,0xf1,0xe0,0x9,0xb9,0xac,0x2,0xaf,0xfb,0x20,0xd6,0xc0,0x71,0x65,0xd6, + 0xea,0xfd,0xd5,0x72,0xce,0xd2,0x54,0x1,0x2a,0x57,0xa6,0xcb,0x7f,0x40,0x90,0x82, + 0x1d,0x60,0x16,0xba,0x64,0x5,0x8e,0x93,0x2d,0x47,0x62,0xb0,0x20,0x11,0x6d,0x9c, + 0xbd,0x2a,0x26,0x84,0xfc,0x41,0x39,0x3,0x9b,0xd,0xe9,0x49,0x24,0x81,0x39,0x22, + 0x8a,0x8,0xc3,0xd1,0x4f,0xa6,0xa6,0x85,0xa3,0x64,0x81,0x4f,0x4e,0x3c,0x44,0x3d, + 0xc4,0x74,0x27,0xa4,0xa4,0xee,0x89,0xfe,0x94,0x90,0xec,0x64,0x93,0x41,0xf6,0xd5, + 0x76,0x47,0xa3,0x4b,0xae,0x1,0xad,0xa9,0xca,0x97,0x8,0x5,0x4a,0xc,0xf3,0x82, + 0xf9,0x41,0x2d,0x17,0x7a,0x29,0xe7,0x1e,0xd9,0x3f,0xb3,0x50,0xf5,0xb6,0xd7,0x30, + 0x5b,0x6f,0xc6,0x82,0x41,0xed,0xa,0x95,0x88,0x90,0xc9,0x80,0xd7,0x15,0xf,0xe4, + 0xa6,0xdc,0xb7,0xc9,0xa1,0x29,0x3b,0xb4,0xb5,0x7e,0x7,0x8b,0xc6,0xba,0xc4,0xc, + 0x5f,0xcb,0x35,0x7a,0xa6,0x3e,0xb7,0x8f,0xad,0x8a,0x5c,0xe8,0x80,0xdc,0xd4,0xa7, + 0x72,0x65,0xd,0x64,0x33,0x38,0xfb,0x15,0x68,0x63,0xd0,0x1b,0xda,0x82,0x43,0x68, + 0x2,0x2d,0x7a,0xdf,0x95,0xe,0x91,0x46,0xb5,0x45,0xab,0x3e,0x3,0x6a,0x46,0xcf, + 0xdc,0x1a,0xc3,0x37,0x2,0xa7,0x1,0x60,0xca,0xb4,0x8d,0xac,0x81,0xf0,0x4e,0xab, + 0xd7,0x3c,0xc2,0x1c,0xae,0xa8,0x9a,0x93,0x80,0x94,0xa8,0x83,0xcd,0xaa,0x57,0x10, + 0x8d,0x68,0x55,0x52,0x19,0x41,0xa8,0x56,0x0,0x4b,0x6e,0xb0,0x26,0x42,0x4d,0x7b, + 0x62,0xa4,0x6c,0x77,0xa6,0xea,0x9a,0xb,0x5e,0x2d,0x2,0x27,0xe3,0xa1,0xe,0xa9, + 0xbf,0x21,0x23,0xc3,0xeb,0xc7,0x80,0xd6,0x5a,0xec,0xb,0xa6,0x2c,0xd6,0x3c,0xef, + 0x8d,0xfe,0x1d,0x5f,0x7f,0x77,0x79,0x4b,0x66,0xd2,0x31,0xba,0xff,0xf2,0x9a,0x44, + 0x3c,0x4e,0x7,0x1b,0xbf,0x82,0x53,0xab,0xfc,0xd9,0xb8,0x42,0x7e,0x64,0xb1,0x3c, + 0xf9,0x68,0x63,0x8b,0x27,0x5d,0x88,0xc8,0x2a,0x27,0x61,0x1c,0xad,0x8c,0x30,0x40, + 0x93,0xd3,0x7d,0x22,0x87,0xaf,0x1c,0xa2,0x35,0xb4,0x52,0x72,0xdc,0x80,0x49,0x12, + 0xae,0x1c,0x4d,0xe2,0x30,0xa9,0x82,0xc5,0x6,0x57,0x16,0x76,0xad,0xa0,0xbb,0x7b, + 0xf0,0x56,0x8c,0xc7,0x73,0x69,0x83,0x37,0x60,0xfc,0x3b,0x5a,0xa1,0xe4,0xed,0x41, + 0x9,0x4a,0xda,0x8a,0x88,0x11,0x30,0x94,0x9f,0x85,0x8c,0xfb,0xd8,0xa6,0x2a,0xda, + 0xf2,0xc6,0xb0,0x94,0x58,0x99,0x5a,0x67,0xab,0xa2,0x9d,0xa5,0xd1,0x66,0x92,0xa5, + 0xd8,0xb7,0x5f,0x16,0x53,0xcf,0x3c,0x3a,0x5d,0xcb,0x6c,0x5,0x48,0x45,0x5b,0x64, + 0x2a,0x83,0xe5,0xfb,0x6e,0x1f,0x4f,0xc3,0x3c,0xbf,0x8a,0xcd,0xd4,0xe6,0x8,0xa4, + 0x2e,0x52,0x7c,0x64,0xe8,0xdb,0xe4,0xba,0x82,0xd3,0xcc,0xc,0x35,0x65,0xd3,0x5d, + 0xda,0xf5,0xd6,0xd7,0x3f,0x5c,0x5f,0x17,0x77,0x15,0x78,0xad,0x7,0xe7,0x54,0x4, + 0x4,0x3f,0x7,0x6d,0x4,0x56,0x89,0x27,0x28,0x18,0xd3,0xf4,0x21,0x86,0x30,0x99, + 0xcd,0x71,0x10,0x33,0xc7,0x8d,0x57,0x25,0xa2,0xa4,0x37,0x48,0xc6,0x23,0x63,0xe, + 0x89,0xa2,0x4,0x73,0x13,0xc1,0xc,0x6b,0xd5,0x15,0x64,0x1,0xeb,0x98,0x71,0x5, + 0xa9,0x2c,0x72,0x69,0x44,0xb5,0xa7,0x5c,0x44,0xe3,0x89,0xdd,0x9c,0x3,0x22,0xd8, + 0xef,0xa5,0x50,0xa,0x8d,0x64,0xc4,0x60,0x2f,0x96,0x41,0x9c,0xc3,0x81,0x1e,0xc, + 0x65,0x9f,0x51,0xac,0xca,0x3b,0xee,0x7c,0xbb,0x10,0x57,0xc0,0xdc,0x17,0xf5,0xd9, + 0x58,0x38,0x94,0xbc,0x44,0x12,0xd8,0xb3,0xb4,0x81,0x1d,0xf,0xfd,0xa8,0x10,0x56, + 0xd8,0xec,0x57,0x44,0xa5,0x9a,0xf3,0xc4,0x68,0x90,0xf0,0xea,0x6d,0x23,0xe0,0xd4, + 0x69,0xa6,0x1a,0x18,0x49,0xfb,0x8e,0x2e,0x5d,0x4e,0xdc,0xc8,0xd7,0x1a,0xa,0x15, + 0x3d,0x44,0x56,0x17,0xe1,0x41,0x10,0x3b,0x9b,0x8,0xc,0x7a,0xdf,0x94,0x3,0x21, + 0x94,0xfd,0xde,0xb7,0xf9,0xfb,0x3,0xe1,0xd0,0x98,0xb5,0x3,0xfd,0x66,0x9c,0xbc, + 0x26,0x6b,0x18,0x3c,0x36,0xb6,0x2f,0x52,0xd5,0x4a,0x27,0x17,0x84,0xa5,0xbd,0x18, + 0xeb,0x94,0xbd,0x9a,0x82,0x51,0x31,0xbf,0xbe,0x13,0xcf,0x1a,0x7a,0x4,0xce,0x44, + 0x77,0xf2,0xe3,0xa0,0x6b,0xa1,0x67,0x4c,0x26,0xbe,0x39,0x97,0xae,0xbf,0xb,0x74, + 0x32,0x2d,0x90,0x35,0x52,0x67,0xe3,0xc9,0xc2,0x44,0xf9,0x14,0x9,0x64,0xde,0x1d, + 0xad,0x8d,0x70,0x28,0x1a,0x23,0x79,0x52,0xce,0x2,0x1a,0xff,0xc5,0x99,0xe3,0x29, + 0x7b,0xb2,0xcf,0xb7,0xc3,0x24,0x7,0x76,0x92,0x80,0x89,0xc3,0x6b,0x4b,0x18,0x73, + 0x67,0x64,0x5d,0xd5,0xd5,0xce,0x5,0x8,0xc7,0x8f,0x75,0x6d,0x76,0x3d,0xc6,0x7a, + 0xc0,0xda,0xb6,0x1c,0xaa,0x69,0xd8,0x3c,0x8,0x36,0xaa,0xc6,0x98,0x62,0x1d,0x18, + 0xf3,0x8b,0x85,0x4e,0x8f,0x17,0x26,0x1f,0x0,0xda,0xb7,0x7c,0xc9,0x70,0x8,0xa1, + 0x6e,0x38,0x4e,0x7c,0x12,0x25,0x34,0x19,0xca,0x49,0x48,0x30,0xcd,0xf,0x84,0x10, + 0xe,0x9d,0x48,0x19,0x49,0xc4,0x42,0x92,0xf1,0xf6,0x47,0x7f,0xfc,0x82,0x2,0xdd, + 0xd2,0x8c,0xec,0x5b,0x2a,0x1,0x1c,0xa3,0xcc,0x64,0x64,0xc8,0x4d,0x2,0xd2,0xc5, + 0x5d,0x28,0x44,0x8a,0xa,0xc8,0x7d,0x66,0xc,0x44,0xa6,0x9c,0xa4,0x88,0xe2,0x41, + 0xe,0xf4,0x95,0x1e,0xdf,0xd4,0xaf,0x83,0xdc,0x3,0x51,0x5c,0x1a,0xe,0xb9,0xfe, + 0x7e,0x47,0xb8,0x66,0x25,0xa6,0x49,0x2e,0x34,0xfa,0x47,0x83,0xb4,0x64,0x4e,0x1a, + 0x36,0x28,0x36,0xc9,0x45,0x89,0xe8,0x4d,0xdf,0x27,0xf0,0x20,0x53,0xaa,0xb3,0x55, + 0x22,0x7c,0xad,0x24,0x2a,0xdf,0xdd,0x6e,0x57,0x8e,0xed,0xf1,0x86,0xa0,0xb4,0xb, + 0x2b,0x3,0xd1,0x30,0xbe,0x42,0x90,0xcc,0x10,0xbf,0x83,0xfa,0xb9,0x41,0x52,0x8c, + 0x9e,0x57,0xb6,0x9,0xb4,0x1,0xd5,0x3e,0xcb,0x68,0x51,0x4e,0x9a,0xe2,0x20,0x7f, + 0xd0,0x24,0x6b,0x5f,0x11,0x20,0xa7,0x85,0xf3,0x6a,0x79,0x4a,0xc5,0x1a,0xa9,0x94, + 0x71,0x3c,0xa6,0x7f,0x4f,0x45,0x67,0xe5,0xb7,0xf3,0xb8,0x37,0x7c,0x2f,0x8d,0x5b, + 0x5c,0x5b,0x29,0xc1,0xf1,0x61,0x20,0x12,0xac,0xfa,0x4e,0x7b,0xb0,0x9f,0x37,0xcf, + 0xda,0xf8,0xe,0x5b,0xd7,0x5a,0x59,0xe,0xdd,0x4e,0x17,0xc1,0xe9,0xbd,0xdc,0x30, + 0x2e,0x6,0xe1,0xc8,0xfc,0x67,0xb6,0x3d,0x3a,0xa1,0x89,0x4e,0xc6,0x4b,0x4e,0x84, + 0x7f,0x2e,0xa2,0x62,0x8f,0x33,0x72,0xbd,0x86,0x86,0xe,0x3a,0xfd,0x0,0xab,0x3d, + 0x4a,0x42,0xb8,0x35,0x73,0x2b,0xc6,0xc9,0x94,0x8c,0x1a,0x9a,0x83,0x5c,0x3,0x82, + 0xc4,0x2a,0x82,0x40,0x15,0x8a,0xbc,0xb2,0xaf,0xc,0x84,0xa,0xed,0x8b,0x87,0x6f, + 0x40,0x8d,0x1d,0x60,0x9b,0x23,0xb7,0xb3,0x59,0xd1,0x4f,0x8d,0x29,0x86,0x2b,0x6, + 0x57,0x8d,0x3,0xb8,0x52,0x35,0x2f,0xc,0xf8,0x9,0x31,0xb5,0xcc,0x26,0xc5,0xda, + 0x69,0x75,0xbd,0x52,0xb3,0xad,0x57,0xa8,0xf2,0x8b,0x48,0x6,0xbc,0xfd,0x7,0x3f, + 0xfe,0xa6,0x56,0xee,0x69,0xb7,0x1c,0x37,0x63,0xea,0xbf,0x1f,0x36,0xec,0xab,0x20, + 0x30,0x9d,0x18,0xa7,0x83,0x3b,0x21,0xb3,0x97,0x92,0xc9,0x18,0xc6,0xe1,0x7c,0x2e, + 0x7c,0xd2,0x29,0x5e,0x7,0xfc,0x44,0x73,0x6c,0x52,0xa4,0xd3,0x63,0xed,0xac,0x5b, + 0x3b,0x6c,0x39,0x11,0x55,0xe6,0x80,0xd2,0x55,0xd,0x86,0xb9,0x7a,0x9,0xb8,0x90, + 0x76,0x82,0x77,0x8e,0xa4,0x27,0x5d,0x15,0xaf,0x1b,0x8,0x1e,0xa0,0x6f,0xea,0xef, + 0xf4,0x30,0x7b,0x90,0xd1,0x23,0xa2,0x82,0xcf,0xcb,0xc3,0x7b,0x12,0x1b,0xf1,0x20, + 0xe6,0xa3,0x5f,0xd3,0xb4,0xa3,0xea,0x16,0x9d,0x96,0x6d,0x45,0xce,0xb4,0xee,0xdd, + 0x77,0x58,0xee,0xaa,0x55,0x8d,0x43,0x3e,0x35,0xd9,0x4,0x14,0xcf,0x21,0x7c,0x56, + 0xfe,0xf,0x32,0x4c,0x6,0x94,0xe4,0xa4,0x60,0x68,0x69,0xa6,0x4,0x82,0x36,0x6b, + 0x2c,0xc7,0xde,0xb0,0x39,0xcb,0x55,0xb7,0xfc,0x7c,0xbb,0xfb,0xa2,0x2c,0x13,0x78, + 0x49,0x89,0x76,0xa3,0x2b,0x3d,0x87,0xf2,0x13,0x64,0x87,0xad,0x44,0x63,0xc1,0x2b, + 0xfb,0x99,0xdd,0x8a,0xe1,0xd1,0x7b,0xb0,0xe0,0xe9,0xf,0x74,0x4f,0xb9,0x30,0xa4, + 0x46,0xe5,0x78,0xa6,0xac,0xb7,0xb5,0xbd,0x28,0xd0,0xaf,0xee,0x37,0x6e,0xf8,0x96, + 0x1b,0x89,0xc3,0x14,0xf8,0xd6,0xe7,0xef,0x49,0x8b,0x36,0xf,0x30,0x9c,0xda,0x34, + 0x5c,0x70,0x6e,0x25,0xb1,0x8e,0x4e,0x18,0x7b,0x42,0x4,0x51,0x88,0x51,0x66,0x99, + 0xe9,0x4c,0x7c,0x6d,0x4b,0x2b,0x1c,0x8f,0x81,0x20,0x3b,0x5f,0x83,0x4f,0x3,0x9c, + 0x92,0xd3,0x97,0x25,0x56,0xec,0xd7,0x31,0xb8,0x45,0x4e,0x96,0x42,0x80,0x53,0xe1, + 0x34,0xa6,0xab,0xc3,0x6b,0x79,0x68,0x2c,0xb4,0x50,0x85,0x1e,0x7a,0x5a,0xcb,0x8b, + 0xdf,0x4a,0x5c,0x4f,0x1e,0x28,0xe8,0x8,0x13,0x63,0x7e,0x7,0x3e,0xa2,0xf1,0xe6, + 0x30,0x8,0x5b,0x6b,0x6b,0xda,0x18,0x27,0xe5,0x33,0x90,0xc2,0x4d,0x80,0x8d,0x8, + 0xcd,0xa3,0x5c,0x91,0xe2,0x2a,0xf4,0x1c,0xf2,0x3f,0xaa,0xbc,0x65,0x84,0xd,0x1d, + 0xa1,0xa3,0xf7,0x2,0x16,0x73,0xd2,0xe6,0x1c,0x55,0x96,0xb6,0xf7,0x92,0x58,0xd5, + 0xc9,0x1d,0x56,0x15,0xd,0x83,0x7d,0xc1,0xb8,0xe6,0xc,0x92,0x5,0xbb,0x96,0x6, + 0xd2,0xd7,0x28,0xc6,0x87,0xa1,0xe2,0x46,0x1b,0x75,0x53,0x82,0x45,0x9,0x61,0xe2, + 0x9,0xc0,0x5d,0xe9,0x4a,0x47,0xdc,0xe4,0xb,0xaf,0x53,0x0,0xc3,0x8d,0x3c,0x43, + 0x2,0x2,0xc6,0x25,0x3f,0x4d,0x19,0x24,0x44,0x3c,0x12,0xc2,0xa6,0x65,0x82,0x60, + 0xda,0xde,0x3d,0x62,0x65,0xfb,0xd7,0x90,0x79,0x8f,0x67,0x24,0x4b,0xc6,0x22,0x69, + 0xc5,0xfb,0x94,0x3f,0x7f,0xbd,0xf6,0x6a,0xc1,0xb3,0x8c,0x4,0xb9,0xab,0xc4,0x35, + 0xfa,0xb5,0x12,0xbf,0x1d,0x0,0x21,0xfa,0xf3,0xa8,0x1c,0xcf,0x12,0x16,0x30,0x77, + 0xe0,0x64,0x54,0x6b,0x63,0x79,0x4e,0x2f,0x2f,0xa0,0xa4,0x99,0xf5,0x76,0x6e,0xe2, + 0xe6,0x82,0x2e,0x37,0x3,0x77,0x5f,0x9,0x65,0x86,0x79,0x5f,0xcf,0x82,0x96,0xe9, + 0xdc,0x9a,0x45,0x14,0x8a,0xdf,0xb5,0x82,0x0,0x21,0x33,0xf0,0x43,0x7f,0x52,0x67, + 0xeb,0xb3,0x52,0x6d,0x0,0xb0,0x33,0xf2,0x19,0xa2,0x41,0xb4,0x2e,0x4,0x8d,0x78, + 0xb6,0x20,0x69,0x38,0xf,0xc5,0x97,0x26,0x62,0xb9,0x25,0xf9,0xf0,0x49,0x50,0x2, + 0xf5,0x50,0xc9,0x50,0x54,0xab,0xc5,0x90,0xc4,0xb9,0xa,0x7e,0x4f,0xae,0x5d,0x9c, + 0x61,0xf6,0xad,0x9a,0xf6,0xa,0xbf,0x19,0xcf,0xfe,0x5d,0xe5,0xea,0xb1,0x2d,0x1, + 0x9e,0xf,0x3f,0x2,0xf3,0xfe,0x63,0xc0,0x39,0x49,0xa,0xed,0xc5,0xba,0x4f,0x97, + 0x74,0x83,0x2f,0x1f,0xb1,0xd5,0x64,0x6b,0x6f,0xa8,0x43,0xa9,0x80,0x4d,0x32,0x76, + 0xc5,0xe1,0x41,0x81,0x14,0x6c,0x1c,0xc,0xd4,0x94,0xf1,0x96,0x17,0x85,0x44,0x48, + 0xea,0xa3,0x27,0xc8,0xd1,0x7a,0xb1,0x35,0xab,0xd3,0x24,0xaf,0xf8,0x29,0x2d,0xd7, + 0x99,0xd4,0x38,0x93,0x66,0xf,0x97,0x69,0x8e,0x62,0xf2,0xad,0x5,0xa8,0x26,0xaa, + 0x4f,0xbf,0x19,0xa6,0xec,0x7,0xa3,0xcc,0xfb,0x7b,0xbb,0x7a,0x9b,0x6d,0xc2,0x4b, + 0x63,0x37,0x86,0xaa,0x87,0x36,0x33,0xa9,0x1,0x44,0x49,0x79,0x56,0x33,0x5c,0x25, + 0x73,0x91,0xae,0x9c,0x35,0x8a,0xa8,0xa2,0x7,0xb9,0x7d,0xb,0x30,0xc0,0x89,0x30, + 0xb2,0xa0,0x2e,0x5e,0x4c,0x44,0xbf,0x3,0x68,0xa0,0xcc,0x78,0x63,0xc9,0x37,0xf7, + 0xa4,0xa,0xf7,0x20,0x8c,0xb0,0xcb,0xfe,0x7d,0xd7,0xaa,0x52,0xd0,0x31,0x47,0xc9, + 0x77,0x30,0xf2,0x8f,0x8a,0x97,0xcc,0xd5,0xb2,0xa3,0xea,0x8c,0xba,0x38,0xf7,0x90, + 0xac,0x13,0x6a,0x52,0xa7,0x1,0x20,0xba,0x2f,0xa0,0x12,0xc1,0x94,0x64,0x84,0x40, + 0x6,0x7a,0x9b,0x46,0x67,0x98,0xed,0xf3,0xe1,0xdd,0xbb,0xfd,0x98,0x18,0x73,0xf7, + 0xcf,0xc1,0x47,0xa9,0xfc,0x62,0x56,0xdc,0x88,0x33,0x8e,0x49,0x52,0x11,0x90,0x65, + 0xb0,0x51,0x9d,0xb5,0xb,0x84,0xa4,0x8d,0x54,0x75,0x77,0x20,0x7d,0x82,0x28,0x92, + 0xb7,0x12,0x7,0x96,0x56,0xad,0x36,0xa1,0x10,0xad,0x2e,0xa4,0x96,0xb8,0x8d,0x9a, + 0x89,0xbc,0x24,0xd8,0x89,0x99,0xc3,0x4c,0xf9,0xea,0xf7,0x56,0x8c,0x1c,0x21,0xd2, + 0x33,0xe3,0xc9,0x54,0x23,0x4a,0x1e,0x15,0x95,0xf5,0x3f,0x17,0x5a,0x9,0x8a,0xc6, + 0x3a,0xae,0xc1,0xd7,0x46,0x45,0x58,0xf8,0xb2,0x89,0xd1,0x44,0x22,0xd7,0x5a,0xbf, + 0x5a,0x3d,0xfa,0x70,0x29,0x16,0xd0,0x4a,0x5a,0x67,0x5a,0xe1,0x5,0x88,0x6e,0x41, + 0x7,0xff,0x1e,0x14,0xa1,0xc6,0x31,0xef,0x97,0x83,0xce,0x3c,0x9c,0xf,0x72,0xe, + 0x65,0x5b,0x12,0x81,0x8b,0x38,0x2b,0x7e,0x67,0xb4,0x68,0xb2,0xdd,0xb5,0x83,0x6, + 0x43,0x1c,0xb3,0xe0,0xb0,0xf9,0x42,0x27,0x92,0xfa,0x90,0xb0,0x90,0x13,0x10,0xd1, + 0xa4,0xae,0x87,0x5e,0xd0,0xd7,0x0,0xa8,0x24,0x26,0x31,0x11,0x61,0x9,0x97,0x9c, + 0x6d,0x29,0x47,0x3d,0x49,0x79,0x37,0x8b,0xb6,0xea,0xd7,0x8b,0x3,0x54,0x9d,0x23, + 0x81,0x1a,0x7,0xa0,0xbd,0x7e,0x1c,0x6a,0xfe,0x3a,0x70,0x8b,0xf2,0x3c,0xf,0xf2, + 0x40,0xf4,0xff,0x39,0x4c,0x11,0xbc,0x61,0x60,0x1d,0xd2,0x92,0x4,0x67,0xef,0x29, + 0x57,0x88,0xec,0xc,0xcb,0x6a,0x15,0x1c,0x66,0xd4,0xa1,0x69,0x3,0xef,0x83,0xcb, + 0x7,0xce,0xd0,0x21,0x98,0x16,0x48,0x30,0x3b,0xb6,0xae,0xca,0x64,0x68,0x92,0xb0, + 0x69,0x0,0x6e,0xe9,0x7a,0xdd,0xa3,0xca,0x76,0xd7,0x8e,0xe7,0xa9,0xe1,0x71,0x50, + 0x2b,0xb1,0x44,0x40,0x36,0x1e,0x38,0xa8,0xbe,0x49,0x65,0x54,0xb5,0x67,0x57,0xd7, + 0x31,0xd5,0xa,0xe0,0x80,0x7a,0xa5,0x61,0xe0,0x55,0x1,0x6f,0x2,0xc,0x17,0xf1, + 0x3,0x2d,0xcd,0xf6,0x43,0xb1,0xa2,0x8f,0x6e,0x7,0xc3,0x38,0x1b,0xc5,0x78,0x7e, + 0x49,0x33,0x90,0xea,0x56,0x9e,0x1b,0x95,0xdd,0x1d,0x13,0x1,0x3c,0x8,0x74,0x70, + 0x40,0x31,0x22,0x17,0xa,0x9c,0x44,0xc6,0x72,0x34,0x66,0x88,0xdc,0x67,0x8e,0xa2, + 0x98,0xd8,0x7,0xe3,0xbb,0x82,0xe4,0xd9,0x50,0x85,0xf6,0x84,0xe6,0xde,0x2e,0xe6, + 0xc6,0xb8,0xbf,0xe3,0x8a,0xe4,0xe,0xd7,0x42,0xa0,0x5c,0xa5,0x68,0x27,0xb6,0x36, + 0x90,0x73,0x3b,0x54,0xa9,0xe6,0xc0,0x5a,0xd3,0x96,0xe4,0x63,0xe8,0xcb,0x9d,0x6c, + 0x4d,0x65,0xe6,0x5e,0x53,0x6b,0xfa,0xc0,0x91,0xdf,0xd,0x86,0x89,0x4a,0x2d,0x78, + 0xbe,0x5b,0x5c,0x72,0xa8,0x92,0x44,0xc3,0x7a,0xb2,0x74,0x5e,0x9,0x36,0xf6,0xe8, + 0x6b,0x1e,0xcc,0x94,0x24,0x49,0xd0,0x24,0xe5,0xc5,0xac,0x3d,0xa8,0x7,0xb2,0xa0, + 0x8f,0x9e,0x9,0xc,0xcf,0x2d,0x78,0x43,0x50,0xe3,0x23,0x1c,0x90,0xc8,0x74,0x8f, + 0x93,0xc3,0xdc,0x5,0xb6,0xd8,0x25,0xa6,0x83,0xaf,0xb1,0x10,0x4d,0x43,0x54,0xfd, + 0x3c,0xb0,0xfb,0xda,0x8c,0xa9,0x44,0x28,0x26,0x47,0xfb,0x4e,0xcd,0xe6,0xec,0xa9, + 0x73,0xeb,0xbc,0x67,0x31,0x93,0x86,0x7a,0xad,0x20,0x50,0x2e,0x40,0x4b,0x8,0xca, + 0x88,0xc5,0x1c,0xfa,0x56,0xc8,0x39,0xa2,0x54,0x8d,0x26,0xa2,0x85,0xb7,0xdb,0x44, + 0x35,0x81,0xed,0x99,0x61,0x93,0xdd,0x17,0x22,0xc8,0xdf,0x20,0x6d,0xfa,0x29,0x3b, + 0xb3,0x1b,0xd5,0x73,0x9f,0x89,0xdd,0x46,0x48,0x31,0x99,0x40,0xbb,0xd0,0x8f,0x8c, + 0xb7,0x84,0xe1,0xf9,0x40,0xe7,0x32,0xce,0x60,0x87,0xef,0x22,0x2,0x5,0xc,0x4c, + 0x9f,0x27,0x84,0x11,0x99,0x6a,0x43,0x70,0x4f,0xff,0x8b,0xae,0x28,0xb7,0x42,0x25, + 0x10,0x10,0x29,0x77,0x65,0x9c,0x1,0x6b,0xcd,0x36,0xef,0x31,0xb2,0xd2,0xb9,0x71, + 0xba,0x42,0x1,0x74,0xa4,0xed,0x79,0xad,0x11,0x2c,0x4a,0x86,0xfa,0xa7,0x81,0xef, + 0x1a,0x7d,0xb0,0x2d,0xff,0x95,0x51,0x35,0x37,0xf4,0x68,0x9,0xf0,0x8,0x9a,0xbd, + 0x1a,0xc1,0x40,0x28,0x49,0x9d,0xea,0x8e,0x1,0xf8,0x33,0x3b,0x3e,0xe,0x63,0x25, + 0x39,0x86,0xbb,0x92,0x38,0xf4,0xcf,0xb7,0x19,0xe3,0x81,0x54,0x36,0xd5,0x44,0x93, + 0x9c,0x4a,0xca,0x2c,0x3b,0xbc,0x76,0xed,0xc3,0x9e,0x9b,0x12,0xbf,0xfa,0x81,0x3c, + 0x20,0x59,0xf4,0x8d,0x79,0x64,0x49,0x8d,0x55,0x1a,0x4c,0xff,0xc0,0x61,0xb8,0xcb, + 0x36,0x13,0x52,0xc1,0x8c,0xa,0x21,0xf,0x55,0xd8,0xc0,0x89,0x43,0xea,0x9f,0xba, + 0x16,0x6a,0xf7,0x2e,0x28,0x3d,0x88,0x12,0x11,0xa0,0x33,0xd1,0x95,0x99,0x46,0xd8, + 0x8c,0x72,0x22,0x1c,0xfe,0x5d,0x2,0x93,0x13,0x41,0x56,0x42,0x48,0xb4,0xb0,0xb3, + 0xe1,0x2c,0xf9,0x12,0xf2,0xd6,0xb8,0x56,0x79,0x10,0xd,0x19,0x0,0x5d,0x9,0xec, + 0xeb,0x49,0x8,0xcc,0xd3,0xb5,0xe2,0x27,0xc4,0x71,0x54,0x58,0x9,0x68,0x16,0x86, + 0x4e,0xf4,0x8a,0xad,0x46,0xd4,0x2f,0xef,0x61,0xd7,0x52,0xe,0xb5,0x31,0xe,0xec, + 0xe7,0x2e,0x44,0x6d,0xf1,0x76,0x5f,0xfb,0x25,0x90,0xaf,0xb6,0x14,0x5c,0x89,0xad, + 0x5d,0x27,0xb2,0x56,0xaf,0xa6,0x84,0xb9,0xf,0x31,0x57,0xa5,0x74,0x91,0x9d,0x2b, + 0x4c,0x7d,0x26,0x84,0x57,0x2,0x51,0xce,0x63,0x7,0x5a,0x97,0x84,0x43,0x56,0xca, + 0x98,0xa0,0x7,0x32,0x66,0x95,0x1e,0x4a,0x8b,0x92,0x74,0x93,0xa9,0x65,0x79,0x8, + 0xec,0x12,0x98,0xa0,0x45,0x29,0x6,0x7f,0x2b,0xf9,0x5,0xbb,0xd8,0x55,0xb2,0xdf, + 0x89,0x10,0x1,0xb,0xcb,0x29,0x60,0xb5,0xf8,0x20,0x46,0x1a,0x56,0x43,0x27,0x38, + 0x5,0xfc,0x69,0xd5,0xdd,0x5f,0xf5,0x66,0xba,0xca,0x39,0x34,0xcf,0x79,0x8c,0x2d, + 0x9d,0x6d,0x1a,0xd1,0x40,0x7a,0x71,0x65,0xaa,0x67,0x30,0x53,0x90,0xe1,0x58,0xe9, + 0x56,0xe0,0x18,0x82,0x6a,0xa,0x1c,0x62,0x2b,0x77,0x9f,0xfa,0x6c,0xf6,0xbb,0xca, + 0x8d,0x12,0x74,0xf,0xc2,0x16,0xf5,0x10,0x88,0x5a,0x5b,0xfb,0x20,0xc3,0x18,0x55, + 0xaa,0x3b,0xf0,0x74,0x82,0x83,0x1e,0xfa,0x98,0x5,0x78,0x13,0x34,0x13,0x89,0x52, + 0x1d,0xe1,0x53,0x5,0xb4,0x6b,0x5,0x17,0x98,0x8b,0x92,0x9e,0xfb,0xd2,0x8f,0x92, + 0x60,0x94,0xd0,0xf3,0x1e,0x81,0xa3,0x13,0x69,0x8c,0x5b,0x41,0xe3,0x2e,0x94,0xba, + 0x14,0x39,0x7c,0x23,0xd2,0x8d,0xf4,0xbe,0xf4,0x82,0xa7,0xe2,0x73,0x39,0xd4,0xe0, + 0xa,0x27,0xa5,0xb9,0xcf,0xb6,0x2f,0x72,0x97,0x3e,0x79,0x1f,0x12,0xce,0xcc,0xca, + 0xe9,0xc0,0xb8,0x81,0x1a,0xdc,0xc0,0x77,0x79,0xf6,0x7d,0x73,0x6,0xda,0xe1,0xa5, + 0x84,0x83,0x10,0xdf,0x93,0x8e,0xc4,0xb3,0xaf,0xf6,0x6a,0x5b,0x25,0x5f,0x41,0xff, + 0x7c,0x8a,0x76,0xe2,0x64,0xa5,0x44,0xc0,0xc9,0x37,0x5a,0x93,0xe1,0x53,0x7b,0x6e, + 0x32,0xb6,0x29,0x1c,0xb8,0x47,0xd3,0xbe,0x56,0x53,0x99,0xf2,0xea,0x66,0x44,0x5e, + 0xd6,0xdf,0x5f,0xce,0x48,0x80,0x77,0x4,0x1a,0x0,0xad,0x2d,0xaf,0xe7,0xef,0xae, + 0xce,0x54,0xd4,0x60,0x37,0x69,0xbd,0xa8,0x4b,0x97,0x31,0x9e,0xaf,0xec,0xb5,0x9, + 0x5e,0x81,0x13,0x81,0x76,0xae,0xda,0x19,0x21,0x3a,0x95,0x2d,0xd9,0xe,0xcf,0x7d, + 0x76,0xab,0x99,0xe5,0x13,0xd8,0xb2,0x5b,0x92,0xa0,0xfc,0x26,0x41,0xf6,0x22,0x46, + 0xb,0x14,0xc8,0xf5,0xea,0x1c,0xf4,0x22,0xce,0x72,0x22,0x3,0x50,0x66,0xef,0xb3, + 0x1d,0x57,0x71,0x2f,0xcb,0xf5,0xd2,0xf5,0x34,0xe7,0x44,0x32,0x45,0x9b,0x2e,0x50, + 0x65,0x3e,0xaa,0xe7,0x87,0x70,0x41,0x94,0x4,0xc,0x71,0x5e,0x53,0xb5,0x41,0x65, + 0xe3,0x33,0x12,0xc5,0x87,0xd4,0x69,0xfa,0xfe,0xc2,0x4,0xa5,0xb4,0xd1,0x72,0xa, + 0xe6,0x89,0xbd,0x46,0x85,0x11,0x45,0x52,0xa0,0x5c,0xf0,0xd,0x7d,0x86,0xdd,0xc7, + 0xd6,0xaa,0x70,0xfd,0xe1,0xff,0xf0,0xc7,0x27,0x56,0xed,0x79,0x38,0x2c,0x9c,0x68, + 0x62,0xf8,0xe6,0xbb,0xb0,0x17,0x47,0xae,0x37,0x36,0xe3,0xbb,0x13,0x22,0xf0,0x42, + 0xd2,0x52,0x45,0x48,0x64,0xb9,0x91,0x5e,0x49,0x35,0xae,0x28,0x87,0x7e,0x4c,0xd, + 0x92,0xba,0x7,0x96,0xf9,0x44,0xb5,0x6c,0xf0,0x1f,0xdb,0x9f,0x1b,0x84,0xac,0xd5, + 0x54,0x93,0xb9,0xe4,0x50,0x42,0xb3,0x4f,0x12,0x54,0x67,0xaa,0x3a,0xfe,0x39,0xcc, + 0x64,0xa4,0xbf,0x7a,0x6a,0x5a,0x32,0xb5,0xe4,0xb3,0xfa,0x60,0xb2,0x6c,0x24,0x60, + 0xe3,0x88,0x1c,0xb7,0x95,0xc4,0x51,0x6d,0xc1,0xdb,0x5b,0x38,0x8c,0x52,0x4d,0xd7, + 0x72,0xca,0x8c,0x71,0x60,0x13,0x9f,0xd8,0x45,0x29,0xa4,0x75,0xf8,0xfb,0x6f,0x11, + 0x59,0xcf,0x64,0xda,0xb0,0xe1,0x3c,0x7e,0x8e,0xec,0x80,0x64,0xe1,0x67,0xc0,0x1d, + 0xae,0x56,0x3,0x58,0x82,0x89,0x11,0xa6,0x1a,0x4c,0xc9,0xc6,0xf5,0x7d,0xc1,0xc0, + 0x8d,0xd4,0xdf,0x7e,0x59,0x58,0xe6,0x36,0x6d,0x34,0xd5,0xca,0x1f,0x55,0xeb,0x92, + 0x43,0xc0,0xe0,0x83,0x4c,0x7,0x86,0x99,0x4,0x84,0x64,0x73,0x9d,0xd8,0x28,0xf7, + 0xeb,0xe8,0x86,0x47,0xec,0xa,0xed,0xe3,0x59,0x86,0xd3,0x64,0x27,0xcd,0x16,0x74, + 0x1f,0x1b,0xaa,0x12,0x46,0x57,0x5b,0xe3,0xd0,0x9,0xcb,0x9,0x52,0xf4,0xf1,0x20, + 0x52,0x90,0xcb,0x72,0x1,0x15,0x2a,0xfa,0x84,0x3,0xf,0x6b,0x68,0x23,0x32,0xcf, + 0x93,0x10,0x7b,0x62,0x10,0x60,0x3b,0xc9,0x71,0x9e,0x22,0xc6,0x21,0xf0,0x44,0x97, + 0xa0,0x66,0xc5,0xb8,0xf3,0xcc,0xcb,0x8c,0x4f,0x2a,0x39,0x9a,0x23,0x60,0xf3,0x92, + 0xb3,0xc6,0xfa,0x16,0x51,0xbf,0xa5,0x5e,0x59,0x98,0xf1,0x5,0x96,0x5a,0xa1,0x86, + 0x57,0xc5,0xf1,0x3d,0x33,0xbd,0x4e,0xa2,0xe8,0xf5,0x87,0xdf,0x7f,0x1c,0x2e,0x28, + 0xa1,0xd2,0x34,0xc1,0xcd,0xec,0x55,0x88,0xcd,0x3a,0xc,0xc7,0x18,0x7b,0x5,0x3f, + 0x4a,0x9,0x72,0x68,0x86,0x3,0xf3,0x59,0x1d,0x2c,0xdf,0xf1,0xb5,0xaf,0xe,0xf9, + 0xd3,0xa9,0x3b,0x5,0x9c,0x64,0x1d,0x12,0x73,0x30,0x38,0x6c,0x98,0xf1,0x50,0x3f, + 0x64,0x40,0x40,0x7f,0xd,0xcc,0xc0,0x42,0x8e,0x4c,0x6e,0xd6,0xb2,0x6b,0x70,0xe3, + 0x1b,0xc1,0xe6,0xb0,0x82,0xbf,0xb5,0x68,0x59,0x47,0x31,0xb1,0xd3,0x9f,0x7d,0xd7, + 0x80,0x57,0x43,0x78,0xe0,0x8b,0x77,0x4e,0x24,0x13,0xc8,0x61,0xce,0x21,0x74,0xfa, + 0x4c,0x6d,0xf7,0x6e,0xdf,0x63,0x54,0x61,0x5a,0x64,0xe3,0x4c,0x6c,0x85,0xbc,0x2f, + 0x73,0xf7,0x3e,0xa7,0xf6,0x14,0x93,0x4d,0xc,0x45,0x58,0xa2,0x32,0x64,0x3a,0x5d, + 0x73,0x3e,0x35,0x4b,0xdb,0x53,0x65,0x86,0x31,0xa5,0x1a,0xd2,0x79,0x18,0xd3,0x27, + 0x47,0x36,0x54,0xda,0x7f,0xbb,0x55,0x4b,0xa4,0x13,0x64,0x23,0x10,0x50,0x39,0x7, + 0xe5,0x2d,0xb3,0x5d,0xbc,0x44,0x2,0x21,0x9a,0x13,0xde,0x7d,0xa7,0xc9,0x2f,0xb7, + 0xbc,0x79,0x90,0xb3,0x4f,0x83,0xc7,0xdc,0x73,0x7,0xf9,0x6f,0x41,0x98,0x32,0xaf, + 0x55,0x9d,0x84,0xc3,0x61,0x5f,0xd,0x60,0x99,0xf,0x72,0x76,0x5e,0x9,0xea,0xcc, + 0xc7,0x21,0xbe,0x1d,0x8,0x19,0xda,0xe8,0x94,0x2f,0xd2,0xb1,0xbf,0x46,0x9a,0xc, + 0x32,0x29,0x4e,0xc7,0xe6,0x14,0x30,0xc7,0x69,0xd9,0x6f,0xed,0x7a,0xd7,0x24,0xcf, + 0x55,0x3d,0x7f,0x4e,0x68,0x44,0x34,0x79,0x9,0x4e,0xe3,0x41,0x9d,0xec,0x26,0xad, + 0x2b,0x93,0x29,0x86,0x56,0xe5,0xc3,0xdc,0x67,0x9c,0xa3,0x18,0xce,0xc,0x45,0x2b, + 0x19,0xd3,0x48,0x56,0x4c,0x10,0xe3,0xad,0xb1,0x29,0x7f,0xe3,0xaa,0xa9,0xc,0xec, + 0x5c,0x6c,0x59,0x3d,0x58,0xcf,0xd8,0x1a,0x2,0xf2,0x11,0xa9,0xc2,0x93,0xc0,0x4c, + 0xab,0x6,0x51,0xbd,0x4a,0x6c,0x64,0x8a,0xa,0x3b,0xd6,0x25,0x2,0x1e,0xa2,0x15, + 0x87,0x9d,0x31,0x49,0x5b,0x85,0xbb,0x84,0xf6,0xe2,0xa7,0x37,0x8e,0x6c,0xf4,0x3, + 0xc0,0x8d,0xb0,0x62,0xe4,0x60,0x55,0xca,0xb1,0x1f,0x75,0x4c,0xa5,0x3c,0x5c,0x81, + 0x3,0x4b,0x79,0x1e,0x4c,0xde,0x56,0xa2,0x34,0x15,0xa8,0x93,0x6b,0x1b,0xb,0x43, + 0xd6,0xd7,0x96,0x4f,0x93,0x1d,0x9c,0xbc,0xd3,0x2a,0xe5,0x70,0xe3,0xa5,0x5a,0x7d, + 0x8c,0xe4,0x4d,0xba,0x5f,0x40,0xd,0xe4,0xab,0xbd,0xa4,0x28,0x52,0x8b,0x22,0x84, + 0x21,0xff,0x9c,0x63,0x5d,0xb,0x3e,0xd5,0x39,0x64,0x75,0x64,0x9b,0x64,0x80,0x97, + 0x7,0x1,0x17,0x3c,0x69,0x87,0x7,0xbb,0x37,0xc6,0xd6,0xd3,0xf6,0xcd,0xca,0x81, + 0xf1,0xac,0x33,0xd9,0x60,0xf4,0x41,0xa9,0x28,0x92,0x8e,0x76,0xf9,0x38,0xa3,0x92, + 0xae,0xd4,0xf3,0xfb,0x91,0xd7,0xda,0x52,0xa2,0x1b,0xa3,0xeb,0xb3,0xdc,0xa1,0x44, + 0x15,0xa3,0x4b,0xb9,0x6,0x50,0x18,0x82,0x4a,0xb4,0xc5,0x92,0xe3,0x31,0x0,0x49, + 0x6a,0x47,0xdb,0xe6,0x83,0xad,0x1d,0xb5,0xd9,0x7e,0x4c,0x9e,0x8b,0x42,0xa9,0x55, + 0x3d,0x40,0xd,0x1d,0x8,0xc6,0x19,0xdb,0xbb,0x75,0x2,0x95,0x22,0x49,0xcb,0x58, + 0x5c,0x9f,0x32,0xfd,0xfe,0x6a,0xec,0x7e,0x5b,0xc7,0x48,0xea,0x23,0x4f,0xf5,0xd3, + 0x90,0x10,0xc8,0x7e,0xcc,0x63,0xef,0x72,0x12,0x20,0x5a,0xef,0x18,0xd1,0xba,0xa7, + 0x29,0x94,0xad,0x33,0x3c,0x85,0x58,0x20,0x93,0xf,0x78,0xd4,0xd1,0x2,0x4d,0x58, + 0xfc,0x20,0x57,0x89,0x9b,0xb4,0x34,0x36,0xe7,0x62,0x30,0xc1,0x62,0xaf,0x36,0xd3, + 0xfa,0x13,0xf4,0x8a,0x96,0x22,0xf3,0x5d,0x75,0xf0,0x7c,0x21,0x7,0x5e,0x8e,0xac, + 0xa3,0x2a,0x9f,0x87,0xd5,0xf1,0x43,0xa2,0x9d,0xc3,0xe6,0x33,0xac,0xb6,0xd1,0x49, + 0xa4,0x67,0x27,0x7a,0xba,0x2c,0x78,0x23,0x3e,0xf4,0x98,0x16,0x3d,0x56,0xc,0xd9, + 0x60,0x63,0x1e,0x89,0xa6,0xff,0x24,0x21,0xbd,0xd,0xf1,0xd4,0x0,0x2,0x38,0xb0, + 0xfc,0x70,0xec,0x9d,0x35,0x36,0x6c,0xf6,0xe8,0x72,0x13,0x23,0x18,0xc2,0xba,0x51, + 0xc3,0x33,0xfc,0xd8,0x33,0x1c,0x7a,0xda,0xee,0x58,0x5,0x67,0xc9,0x3f,0x32,0xab, + 0x2a,0xad,0x9,0x97,0x46,0x35,0x9,0xca,0xfb,0xef,0x89,0xae,0xf1,0xc3,0x46,0x60, + 0xab,0xc1,0x6c,0xbe,0x5c,0xe6,0x51,0x7b,0x1e,0xc0,0xb1,0x16,0x35,0xdb,0x59,0x95, + 0xc8,0x94,0xfe,0x75,0xf6,0x27,0x77,0xf7,0x7,0xe2,0x43,0x8e,0x25,0x99,0x8b,0x36, + 0xeb,0xed,0xbe,0xd9,0x79,0xff,0xd4,0xc9,0xbb,0x46,0x4d,0x7c,0xb4,0xd7,0x98,0x8a, + 0x95,0xd9,0xd1,0x3f,0x19,0xb1,0x64,0xac,0x40,0x76,0x1,0xef,0xdf,0xf5,0x68,0x0, + 0x20,0xe,0xc,0xc8,0x18,0x61,0x8c,0xb6,0x11,0x41,0xce,0x7b,0x66,0x9f,0x61,0xf7, + 0xb0,0xa0,0x93,0x1b,0xb8,0x93,0x82,0x47,0x46,0xd8,0xe7,0x94,0xb,0x4e,0xae,0x72, + 0x6d,0x67,0x34,0x33,0xa0,0x22,0x96,0x44,0xe8,0xf6,0xff,0x7e,0x24,0x8f,0xd1,0x24, + 0x65,0x81,0x4d,0x36,0x24,0x74,0x44,0xf2,0xb2,0xc9,0x3,0xf3,0x92,0xd7,0x25,0x7b, + 0xb3,0xca,0x9,0x37,0x96,0x0,0x54,0xeb,0x1f,0x5d,0x69,0x56,0xfa,0x75,0x63,0x50, + 0xae,0xc1,0xf3,0xf9,0x40,0xfe,0xda,0x9e,0xe6,0x2a,0x2b,0x8b,0xe2,0x85,0x14,0x56, + 0x9e,0x5c,0x9d,0x25,0xe1,0xcc,0xe0,0x86,0xf9,0xcc,0xa8,0x3e,0x69,0xd4,0xc9,0xa5, + 0xf0,0x7d,0xdf,0x48,0x62,0x92,0x30,0xdb,0x3a,0xdc,0xfe,0x10,0x2a,0x88,0x33,0xb6, + 0x12,0x95,0xdf,0x6,0x55,0xb,0xe4,0xb6,0xbb,0xad,0x2d,0x19,0xdb,0x25,0x7d,0x19, + 0x4a,0xbc,0xfb,0x5a,0x10,0x1a,0x20,0x4a,0xb3,0xd8,0x72,0x9f,0x18,0x1c,0x75,0x38, + 0x9c,0xaf,0xaa,0x1b,0x8e,0x4d,0x6e,0x6d,0x8e,0x3f,0x30,0x59,0xe,0xb4,0xd3,0x15, + 0xdb,0xa4,0x87,0xc2,0x6,0xcf,0x83,0x77,0x55,0xbb,0x71,0x9d,0x56,0x6c,0xb9,0x4c, + 0x31,0x51,0xb3,0xfd,0x66,0x12,0xa0,0x33,0x4,0x51,0xf9,0x2b,0x97,0xff,0x26,0x31, + 0xcd,0xf2,0x9b,0x70,0x2e,0x0,0xdb,0x4d,0xa7,0x4f,0x4,0xb4,0x5d,0xb2,0xf6,0xef, + 0x35,0xc0,0x35,0x91,0x91,0x4d,0xa4,0x47,0xd4,0xe0,0xfb,0x5e,0x7,0x99,0xec,0xbc, + 0x37,0xb4,0x98,0x36,0xed,0xae,0x37,0xb5,0xa2,0xa7,0x9c,0xcc,0x68,0x4e,0xd9,0x9e, + 0x3e,0x3c,0x50,0xaf,0x4a,0x88,0x76,0x7f,0xaa,0x38,0xd8,0xad,0x94,0x4c,0x86,0xa0, + 0x8c,0x8d,0x10,0x6,0xdb,0x25,0x44,0xe3,0x3d,0x64,0xac,0xca,0x6c,0x50,0x59,0x37, + 0x38,0xd,0x4a,0x6e,0x10,0xb2,0xd8,0x73,0xed,0x50,0x42,0x84,0x3c,0x24,0x83,0x19, + 0x2b,0x46,0x31,0xb2,0xfa,0x42,0x90,0x28,0x4a,0x3d,0xc8,0x85,0xf4,0x86,0xac,0xc, + 0x11,0x24,0xa5,0x4d,0xaa,0xd0,0x3,0xca,0x78,0x1,0x5,0x77,0x8a,0xd3,0xdf,0xcb, + 0x20,0x3e,0xa9,0xc7,0x7,0x31,0x33,0xd3,0x87,0xd6,0x37,0xd4,0x6a,0x36,0x5a,0x1, + 0x6a,0x6,0x31,0x8e,0xb0,0xd4,0x25,0x46,0x36,0x87,0xd1,0x94,0xc4,0xe,0x16,0xb9, + 0x6,0x96,0xf0,0x2f,0x74,0xe2,0x71,0xb5,0x12,0x27,0xab,0x3e,0x42,0xda,0x21,0xbb, + 0xec,0x1c,0xf9,0xf3,0x71,0xdb,0xf1,0x9e,0x8c,0xe6,0x58,0xd3,0x86,0x80,0x1,0xce, + 0x55,0x44,0x52,0x49,0x2d,0xeb,0x11,0x56,0x76,0xe0,0xc3,0xb8,0x34,0x59,0xa1,0x8f, + 0x57,0x3d,0xbc,0x90,0xea,0x3a,0xec,0xbe,0x7f,0x14,0x1,0xe1,0xd8,0xe3,0xce,0x8a, + 0x71,0x97,0xc7,0x42,0x5e,0xd5,0xf1,0x36,0x15,0x8b,0x9,0xd7,0x33,0xd7,0xde,0xe6, + 0x82,0x0,0x30,0xa0,0x75,0x4b,0x53,0xfb,0x81,0xe2,0x6d,0x74,0x8e,0x67,0x74,0x8e, + 0x7d,0xbe,0x69,0xb0,0x4a,0x6f,0xbc,0x1a,0xab,0x22,0x39,0xd8,0x89,0x3e,0x8,0xcf, + 0x30,0xb6,0x59,0x13,0x19,0xab,0xa1,0x6c,0x41,0x57,0xa9,0x61,0x21,0x75,0x78,0xa2, + 0xa3,0x9c,0xc0,0x81,0x27,0x37,0x28,0xd3,0x64,0xa0,0x98,0xec,0x3b,0x87,0xae,0xe8, + 0x84,0xab,0xab,0x73,0xa2,0xa1,0x92,0xa,0x71,0xc0,0xc7,0x1f,0xc3,0xff,0xd4,0x91, + 0x46,0x4e,0x53,0x4,0xd5,0xdf,0x33,0x55,0x84,0x74,0xdf,0x81,0xe6,0x26,0xfb,0x8a, + 0x6b,0x13,0xcf,0x3a,0xdb,0x4c,0xad,0xa5,0x8a,0x43,0x47,0x5a,0x99,0xf9,0x2b,0x47, + 0x78,0x50,0xc3,0x9,0x81,0x81,0x7f,0x26,0x61,0xce,0x87,0xe7,0xe6,0x41,0xf7,0x4a, + 0xa1,0xb8,0x5d,0xf6,0x16,0x5b,0xd3,0xcc,0xae,0x34,0xbe,0x62,0x55,0xe1,0xf,0xfd, + 0x7b,0xef,0x3f,0x5e,0x87,0x33,0x1d,0xbe,0xd9,0xf1,0xf5,0x5,0x5b,0x20,0x86,0xfe, + 0x4d,0xe0,0x8d,0x1d,0x4d,0xdf,0xed,0xa8,0x18,0x69,0x79,0x25,0xd1,0x7d,0xe8,0x43, + 0xb5,0xf9,0xc5,0x57,0x1c,0xab,0x98,0x1d,0x33,0xc2,0x4f,0xf0,0xc6,0x12,0x35,0x3a, + 0xc9,0xc1,0x9b,0x2e,0xf2,0x40,0xc4,0x98,0x5b,0xe4,0xdd,0x4d,0x7e,0xfe,0xd1,0x7c, + 0x41,0xa4,0x98,0xb8,0xaf,0xbd,0x47,0x8c,0x80,0xd8,0x27,0xe1,0x48,0xd5,0x98,0x46, + 0x18,0x6,0xbb,0x62,0x31,0x7,0xe2,0x87,0x83,0xf7,0x4d,0xbf,0x5b,0x68,0xda,0x49, + 0xc5,0x4a,0x5,0x1e,0x75,0x14,0xaa,0x14,0x30,0x9,0x2,0x5f,0x3b,0xbf,0x4e,0x8d, + 0xd3,0xe7,0x17,0x24,0xeb,0xbe,0x82,0x83,0x31,0x8a,0xe1,0xe7,0xe7,0x4d,0x7a,0xa9, + 0xa8,0x97,0xb2,0xc9,0x6b,0xbd,0x6a,0x70,0xa3,0x9,0xfd,0xe0,0xbb,0x90,0x18,0x86, + 0x9e,0xdb,0x51,0x65,0xb8,0x62,0x74,0xf3,0x5b,0x2,0xd1,0xa7,0xd6,0xd0,0x91,0xe1, + 0x3a,0xf4,0x56,0x5e,0xe8,0xf7,0x1f,0xbf,0xfb,0xf8,0xfd,0xdf,0xba,0xa1,0x3c,0xd2, + 0x62,0xda,0x4d,0x4b,0x82,0x43,0xd,0xd8,0x7f,0x13,0xfc,0x80,0xb4,0x63,0x6,0x42, + 0xa0,0xed,0x34,0x7e,0x83,0xd5,0x31,0x6b,0x47,0xf2,0xa8,0xd2,0xed,0x4,0xb0,0x4e, + 0x3,0x4b,0xf6,0xc7,0xc4,0xbb,0x38,0xdf,0xf0,0x7e,0xaa,0xcc,0x85,0x50,0x97,0x9b, + 0x9d,0x64,0xb0,0xb3,0x3d,0x3d,0x8d,0x70,0x29,0xec,0x2f,0x30,0x3f,0xd3,0xf0,0xa3, + 0xd4,0x59,0x96,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x20,0xdb,0xa1,0x3,0x49, + 0xf8,0x95,0x6c,0x73,0x93,0x6c,0x1e,0x7c,0x4,0xe,0x4f,0x4,0x43,0x5f,0x3e,0x11, + 0x20,0x72,0x38,0x15,0xd0,0x65,0x94,0x5f,0x5a,0x31,0xc,0xca,0xae,0xae,0x17,0xd4, + 0x7d,0x31,0x10,0xc6,0xe6,0x15,0x84,0xc7,0x2a,0x84,0xe3,0x24,0x6f,0xfc,0xee,0x51, + 0xb2,0xb2,0x8c,0xf7,0x49,0x93,0xae,0x7d,0xc3,0x9,0x43,0x90,0xdc,0x38,0xca,0xa1, + 0x31,0x13,0x61,0xc0,0xa4,0xd,0x0,0x77,0x5,0x12,0x58,0x68,0x55,0x6a,0xc0,0xb8, + 0x5b,0xa1,0x5f,0x3c,0xf4,0xc1,0xd6,0x3f,0x5f,0xf2,0xf9,0x17,0xda,0x34,0x4e,0xba, + 0x2a,0x3d,0x1a,0x19,0x70,0x50,0xcc,0xc5,0x24,0xa,0x93,0x71,0xce,0x77,0xd8,0xe8, + 0xe9,0x76,0xa4,0xd7,0x23,0x16,0x8c,0xea,0x80,0x86,0x84,0xbe,0x37,0xc9,0x88,0xe2, + 0xd8,0x3,0x74,0x6b,0x52,0xa8,0x7f,0xfd,0x91,0xb4,0x92,0xfa,0x14,0x68,0xb5,0xa6, + 0x8e,0x4f,0x50,0x6e,0xb6,0x3b,0xbf,0xa1,0x19,0x8d,0x5,0x6a,0xbe,0x3d,0x8a,0x50, + 0x1d,0x8a,0x5e,0x4e,0x5c,0xda,0x97,0x63,0x4b,0xc2,0xba,0x76,0x4b,0x58,0x6c,0x22, + 0x60,0xaf,0xb8,0xdf,0x86,0x7e,0xd6,0xc,0x41,0xb6,0xef,0x83,0xc3,0x86,0x66,0x11, + 0x85,0x57,0x4c,0xbd,0x6d,0xc4,0x6c,0xf5,0x34,0xe1,0x4a,0x6c,0x18,0xe1,0x90,0xe8, + 0x23,0x1d,0x10,0x5c,0x43,0xdb,0x14,0xd6,0xbb,0x36,0x2c,0xc7,0x58,0xe7,0x49,0xa4, + 0xc3,0x80,0x67,0xf7,0x7c,0x4b,0xf6,0x89,0x43,0xd6,0xed,0xb6,0xb5,0x72,0xb0,0xda, + 0xeb,0xed,0x75,0xe3,0x16,0x1f,0x2a,0xce,0xdc,0x4b,0xad,0xdf,0xe9,0x37,0x27,0xb, + 0x62,0x6f,0x89,0x64,0xc0,0x4a,0x88,0x5c,0xa5,0x85,0xe7,0xc4,0x82,0x35,0xaf,0x2f, + 0x59,0xe9,0x51,0xc9,0xa3,0x8d,0xd4,0xf9,0xfd,0x42,0xe8,0xa9,0xef,0x91,0x2a,0x74, + 0x89,0x9b,0x2a,0xbb,0xbe,0xc9,0xe3,0xcc,0x85,0x7c,0x32,0x98,0x23,0xd6,0x38,0x9b, + 0xa4,0xb4,0x8c,0xd,0xc2,0x7f,0x9b,0x8e,0x70,0x91,0xc2,0xc7,0x50,0x5f,0xd3,0xe7, + 0xf3,0x4c,0x2a,0xd9,0xe7,0xd1,0xa1,0x2d,0xa2,0x4a,0x9e,0x84,0x57,0xaf,0x40,0x2c, + 0x23,0x2b,0x5c,0x5d,0x1a,0xf8,0xb9,0xc0,0xb4,0xc7,0xf0,0x56,0x5c,0x79,0xeb,0xa, + 0x2e,0x45,0xd0,0x92,0x9b,0xb5,0xec,0x94,0x44,0x2a,0xed,0x4b,0x3a,0x9a,0x9e,0x2d, + 0x9f,0x3c,0x4e,0x98,0x2,0x48,0x36,0x6a,0x9,0xb1,0x1f,0xd6,0xbc,0x74,0x22,0x6a, + 0xbb,0xd3,0xdb,0x5b,0x49,0x46,0xd5,0x21,0x46,0x6e,0x22,0x10,0xaa,0x3a,0xc5,0xa5, + 0xf,0xcc,0xb2,0x41,0x33,0x25,0x82,0x1d,0x91,0xae,0xd8,0xf8,0x2d,0xdb,0x28,0x4c, + 0x72,0x22,0xb3,0xda,0x84,0x7b,0x69,0xc6,0xdb,0x23,0x5b,0x65,0x87,0x97,0xed,0x73, + 0x1f,0xa2,0x51,0x3b,0xe7,0x23,0x5c,0xd3,0x85,0x18,0x9e,0x59,0x6e,0xe6,0x56,0x42, + 0xf8,0xd2,0xb5,0xa4,0x58,0x4,0x53,0x84,0x61,0x5d,0x70,0x3f,0xe9,0x60,0x1a,0xed, + 0xcd,0xd1,0xa5,0xe0,0x3a,0x4e,0x35,0x70,0x1e,0xba,0x64,0xe1,0x55,0xa3,0xed,0x96, + 0xf5,0x21,0x79,0x1e,0x39,0x2e,0x47,0x5e,0xa,0xe2,0xca,0xad,0xf6,0x99,0xeb,0xe1, + 0x5f,0x8e,0x50,0xe4,0xdc,0x4f,0x60,0xde,0x36,0x76,0x85,0x1a,0x44,0x2c,0x42,0x93, + 0x9f,0x23,0xb9,0x63,0xc4,0x8,0xc,0x6b,0x8,0xbd,0xeb,0x4a,0xc7,0xb5,0xc8,0xe8, + 0x2b,0xb8,0x23,0xf4,0xc8,0x37,0x20,0x79,0x83,0x6f,0xf6,0xa8,0x27,0xed,0x75,0x99, + 0x7d,0x16,0x3,0xde,0x84,0x92,0x5,0xa7,0x51,0xb4,0xfa,0x92,0x51,0x95,0xcc,0x3e, + 0xd7,0x82,0x53,0x15,0x11,0x88,0x35,0x97,0x2e,0xfc,0x26,0x9,0x63,0xb0,0x7c,0x8b, + 0x5f,0x64,0x63,0x57,0xa3,0x98,0xb9,0x8c,0x9f,0xa1,0x57,0x4a,0xc3,0x3c,0xf0,0x38, + 0x78,0x42,0x74,0x11,0x16,0xe,0xba,0xe2,0x8a,0xb2,0xc6,0xb5,0x37,0x6f,0xc,0x43, + 0x5e,0x60,0xcf,0x57,0x6b,0xe7,0x4a,0x3,0x1b,0x21,0x6f,0x32,0x2f,0x9c,0x3,0xc4, + 0x4e,0xd,0x70,0xe2,0xc7,0xad,0x5a,0x10,0xc6,0xb9,0xc9,0x59,0xb0,0x34,0x5f,0x46, + 0x97,0x66,0x58,0x7f,0x1e,0xc9,0x7e,0xb9,0x7c,0xf7,0x49,0xa9,0x6e,0x4f,0x68,0xd4, + 0x6a,0x81,0x11,0x1c,0xc0,0x15,0x2c,0x2e,0x81,0xb,0x58,0x25,0xd4,0xce,0x86,0xff, + 0x3b,0xf9,0xfa,0x91,0xd6,0xdd,0xad,0x23,0xd2,0x35,0x1a,0xc,0x57,0x8c,0xc1,0x74, + 0x4d,0x5e,0x74,0x9c,0x1,0x70,0x59,0x63,0xca,0x74,0x50,0xce,0x75,0xf7,0xb1,0x4a, + 0x97,0x4d,0xae,0xaa,0x10,0x3a,0x9b,0x11,0x25,0xe,0x84,0x48,0x8f,0x2d,0x34,0x68, + 0xde,0x9e,0x8c,0x78,0x2e,0x40,0xfd,0xd2,0x55,0xc6,0xdb,0xea,0xf7,0x5a,0x7b,0xfd, + 0xed,0xe9,0x55,0x37,0x46,0x70,0x39,0x44,0x9,0xc3,0xd2,0xb1,0x32,0x86,0x3d,0x3a, + 0x80,0x6c,0x93,0xb4,0x11,0x6b,0x34,0x62,0x42,0x9,0xeb,0x10,0x26,0x19,0x58,0x62, + 0x34,0x91,0x6c,0x6a,0x44,0xbf,0x5,0x15,0x92,0xaa,0xa2,0x4b,0x8b,0x20,0x2e,0xec, + 0x16,0x14,0x1c,0x1e,0x44,0xb2,0x57,0x6b,0x86,0xea,0x92,0x81,0xd8,0xce,0x64,0xed, + 0x25,0x4d,0x26,0x36,0x53,0x34,0x3c,0x64,0xda,0xa7,0x1,0xfe,0x5c,0x48,0x18,0x23, + 0xf1,0xd9,0x76,0xac,0x54,0x70,0xc5,0x2d,0x46,0x37,0x93,0x1d,0x75,0xf6,0x85,0x1d, + 0xf4,0xc3,0xe5,0xa9,0x87,0x3f,0x5d,0xd3,0xc6,0xcf,0x24,0x81,0x35,0xdb,0x99,0x9a, + 0x46,0x36,0xd4,0x54,0x64,0x30,0x29,0x5a,0xc1,0x87,0xc7,0xa6,0x3e,0xaa,0x4f,0x15, + 0xf0,0x80,0x3,0x37,0x11,0x14,0x56,0x68,0x63,0x3b,0x23,0x1d,0xa1,0x40,0x97,0x2c, + 0x2a,0x5a,0xa4,0xd4,0x1e,0xba,0x5c,0xfb,0xe2,0xe,0xa0,0xbb,0xc6,0xad,0xb8,0x90, + 0x6a,0x7f,0x10,0x3f,0x8b,0x3c,0xec,0xbd,0x3d,0x69,0x22,0x32,0x5a,0x12,0x4,0xcc, + 0xa8,0xbf,0x92,0xda,0xe3,0xd0,0x40,0xa,0x91,0x60,0x95,0x60,0xa2,0x86,0x35,0x9d, + 0xf7,0x52,0x96,0xd0,0x3c,0x6a,0x80,0x34,0xd1,0x91,0x79,0x32,0x60,0x39,0x20,0x6a, + 0x97,0x3,0xd2,0xa0,0x61,0x19,0x27,0x5,0x70,0x8b,0xdb,0xae,0x47,0xbe,0xdd,0xd5, + 0x76,0xcf,0xd4,0x5d,0xda,0x74,0xaa,0x63,0xb,0x91,0x68,0xc0,0xd0,0xd6,0x2f,0x2c, + 0x1,0xe6,0x12,0x50,0x29,0x33,0x48,0x42,0x1b,0x7c,0x66,0xb4,0xbf,0xd8,0x64,0x5, + 0x91,0x22,0x46,0xd1,0x4e,0xd0,0xeb,0x31,0xb2,0xe1,0xc3,0x7d,0x40,0x35,0x6e,0x93, + 0x8b,0xb4,0xf7,0x3d,0x3f,0xe2,0x7a,0xe8,0xa5,0x55,0x47,0x0,0xb3,0x5f,0x1c,0xed, + 0xbb,0x76,0x56,0xc8,0x6b,0xe0,0xa2,0x65,0xca,0x58,0xdf,0xe7,0x36,0x43,0x77,0x61, + 0x40,0x9e,0x9c,0xc6,0x63,0x7a,0x29,0x2a,0xef,0xbb,0x44,0xc9,0x96,0x40,0x57,0x15, + 0xa6,0x79,0x5,0x38,0x5f,0xaa,0x77,0x97,0x60,0x53,0x23,0xd9,0x20,0xc1,0xd8,0x26, + 0xe,0xd,0x7c,0x4d,0x16,0xb2,0xd8,0xca,0xcf,0x56,0xc3,0xb1,0x48,0x96,0x2f,0x24, + 0x66,0x1d,0x55,0x85,0x31,0x24,0xd,0x17,0xc0,0xc8,0x56,0xb7,0xf7,0xf2,0xaa,0x67, + 0x30,0x5,0x47,0xf6,0xfa,0x75,0x28,0x22,0xd1,0x20,0xc8,0xb,0xc1,0x98,0x68,0x23, + 0xe2,0xf9,0x1e,0x34,0xd8,0xf,0x6,0x89,0x5,0xb3,0xdd,0x18,0xb3,0xd1,0x69,0x1, + 0x6c,0x81,0xda,0x9f,0x4f,0xa6,0x34,0x26,0x9d,0x88,0xf8,0x11,0x6c,0x2c,0x5e,0x73, + 0xef,0xa9,0x1,0x46,0x5c,0x2c,0xe9,0x9,0x6f,0x75,0x6,0xf1,0xbe,0xe,0x3a,0x53, + 0xba,0x42,0xd,0x4f,0x58,0xf0,0x75,0xc1,0x82,0x39,0xe4,0x10,0x80,0xf5,0x34,0xf0, + 0x1a,0x1e,0x1e,0x60,0x56,0x5a,0x55,0xcb,0x1d,0xc0,0xb4,0xd7,0xaf,0x53,0x7,0x83, + 0x64,0x24,0xf3,0xa9,0xc8,0x4,0x7,0x6,0x8,0xb2,0x21,0xb1,0xba,0x31,0x11,0xd3, + 0x7,0xf0,0x43,0x4,0x37,0xeb,0xdc,0xdd,0x99,0xb4,0xc5,0x73,0xf5,0xc3,0x8d,0x7d, + 0x52,0x5,0x75,0x20,0x42,0xc9,0x88,0x16,0xee,0xcf,0x7b,0x5a,0x2c,0xd,0x8f,0xd2, + 0xe9,0x8,0x81,0xd7,0x86,0x9,0x1b,0x5b,0x82,0x2e,0x80,0x22,0x7,0xe6,0x48,0xc0, + 0x82,0x1d,0xcc,0x5b,0xd4,0x31,0xb4,0xd6,0xa3,0xf0,0xd4,0xa0,0x69,0x2c,0xdc,0x85, + 0x2d,0xb2,0xb6,0x68,0xd8,0xd6,0xbc,0x7f,0xe0,0x4a,0x45,0xfe,0x98,0x89,0x2d,0xf6, + 0xbe,0xc1,0x40,0xe9,0x8b,0x1,0xbf,0xfd,0xdc,0xf0,0x30,0xd6,0x7d,0x4f,0x70,0x75, + 0x4a,0x20,0x55,0xe9,0xe0,0xd9,0x51,0x43,0x3b,0x44,0xdb,0x4f,0xc6,0x2c,0xf7,0xb6, + 0x20,0x93,0x1d,0x6e,0xa4,0xd5,0x4d,0xee,0x61,0x1d,0xce,0xcc,0x80,0x23,0xf6,0xfd, + 0xaf,0xc6,0x58,0x99,0x5c,0xdb,0xf2,0x4,0x58,0x70,0x3a,0x22,0x18,0x23,0xa6,0x7a, + 0xd0,0x21,0xf0,0xa6,0xe9,0xf,0x34,0xa2,0x3c,0xaa,0xb7,0xa8,0x46,0x47,0x39,0x48, + 0xf2,0x85,0x98,0xa6,0x0,0x5a,0x97,0x45,0x91,0x15,0x54,0xc2,0xe4,0xd1,0x2e,0x4a, + 0x8e,0x53,0xc6,0xa9,0xe9,0x78,0xe7,0x25,0x7f,0x75,0xd9,0xfa,0x63,0xb9,0x76,0x7e, + 0xf7,0xad,0x87,0xf5,0x9c,0x31,0x1a,0x6,0xa1,0x51,0x63,0xa1,0xf1,0x32,0x20,0x79, + 0xf3,0x52,0x11,0xc5,0x38,0xa4,0xdf,0x33,0x23,0x6e,0x41,0xf6,0xda,0x5d,0xd1,0xbf, + 0xb9,0x2b,0x9a,0x7,0x5c,0x26,0x23,0x76,0x82,0x1b,0x87,0xc9,0x62,0x2e,0xd8,0xa9, + 0x57,0x71,0xee,0x1b,0x4d,0x39,0xc8,0x52,0xa1,0xaa,0x57,0x51,0xfb,0x20,0xef,0xb2, + 0x88,0xa3,0x1e,0xb1,0xf5,0xc8,0xca,0x60,0xf2,0x5d,0xfc,0xa9,0x82,0xd5,0x26,0x99, + 0x31,0xb4,0xad,0x19,0xfd,0xdc,0x49,0x3d,0x88,0xd1,0x5a,0xa0,0x64,0xfe,0xb,0xe, + 0x33,0x34,0xa2,0xc3,0x98,0x54,0x56,0x7a,0x34,0x81,0x80,0x2e,0x13,0xcb,0xc9,0x25, + 0x48,0xe6,0x4e,0x19,0xae,0x78,0x8e,0xbe,0x75,0xd9,0x5e,0xb4,0xf9,0xcb,0x69,0xbc, + 0x82,0xc3,0xd3,0x57,0xa5,0xbe,0xeb,0x76,0x30,0xb,0xf8,0x75,0x70,0x7e,0x2b,0xb5, + 0x77,0x45,0x54,0x64,0x61,0x7c,0xfc,0x8,0x61,0xa4,0xc0,0x3,0x11,0x55,0x73,0x38, + 0xcb,0xa5,0x81,0xc2,0x32,0x29,0x69,0x7,0xf,0xad,0x62,0xc4,0x0,0x83,0x63,0xc0, + 0xdf,0x81,0x9a,0x9,0x43,0x56,0xd5,0xb0,0xa1,0x2a,0x6c,0x24,0xa8,0x92,0x6a,0xe9, + 0x49,0x26,0x28,0x52,0x99,0x4e,0x38,0x4b,0x7,0xb2,0xb9,0x6d,0xe6,0x22,0x2e,0x50, + 0xb2,0xa0,0x24,0x58,0xbd,0x87,0xdc,0x13,0x4e,0x93,0x32,0x86,0xeb,0xba,0x77,0x80, + 0x51,0xd1,0x83,0x3e,0xb3,0xbd,0x26,0xf0,0x38,0xbf,0x77,0x35,0xd4,0xae,0xcd,0xae, + 0x77,0x59,0xe4,0x70,0xae,0x43,0xd5,0xd1,0x51,0xc0,0x8c,0x7f,0x2a,0x5c,0xc3,0x1c, + 0x39,0x42,0x92,0x26,0x5f,0x99,0xd7,0x78,0xe7,0xa3,0xf9,0x70,0xa3,0xc9,0x27,0x6f, + 0xfb,0x5f,0x97,0x5e,0xae,0x3d,0x99,0x82,0xd4,0xe5,0xf0,0x8a,0x1d,0x8c,0x59,0x6a, + 0x70,0x44,0xf0,0xc0,0xf2,0x56,0x23,0x18,0x88,0xbd,0x1b,0xd0,0x6c,0xc0,0x54,0xd5, + 0xfb,0xd4,0xbf,0x63,0x12,0xe5,0x62,0xcd,0x35,0x69,0x20,0x88,0xdc,0x63,0x7d,0x24, + 0x43,0x31,0x39,0x6f,0xa0,0x73,0x8a,0x50,0x2a,0xb5,0x1c,0x28,0x8e,0xc5,0xec,0x2d, + 0x43,0xdb,0x12,0x15,0x4a,0xa6,0x9a,0xba,0xc0,0xbd,0x11,0x31,0x73,0x43,0x38,0x81, + 0xa8,0xe8,0x3d,0xa1,0x71,0x54,0xe1,0x90,0x7d,0xaf,0x4,0x58,0x60,0x77,0xb5,0xaf, + 0x9e,0xc6,0xee,0x72,0xaf,0xca,0xfe,0xbd,0xdd,0xd6,0x3a,0xf7,0x79,0xf,0xee,0xc3, + 0x64,0x23,0xdd,0xe1,0x92,0x4d,0x3f,0x97,0x44,0x83,0x1a,0x21,0x4d,0x1d,0x37,0x17, + 0x71,0xd8,0x9a,0x1a,0x80,0x2c,0x80,0xfb,0x5c,0x60,0x85,0xb0,0x7,0xe4,0x50,0x25, + 0x11,0x5,0x11,0xcc,0x75,0xad,0x52,0x6a,0x12,0xba,0xd8,0x25,0x70,0x72,0x2f,0xc, + 0x22,0x11,0xee,0x34,0xa2,0x29,0xe9,0xfb,0x44,0x3,0xd1,0x82,0xab,0xfb,0x92,0x3b, + 0xd1,0x41,0x75,0x96,0xc5,0xa8,0x60,0xb2,0x14,0xe7,0x3c,0x9e,0x7f,0x54,0x91,0x95, + 0x79,0x54,0x36,0x49,0x2a,0x76,0x48,0xac,0xfa,0x38,0x65,0xf6,0x77,0xcb,0xd4,0x8b, + 0xe4,0xf0,0x45,0xd5,0x34,0xb4,0xe5,0x3d,0x2c,0x9f,0xfb,0x46,0xf4,0x72,0x1f,0xd1, + 0x17,0xa,0x49,0x2e,0x8d,0x63,0x50,0x65,0x33,0xc3,0xfe,0x3b,0x7a,0x55,0x83,0xb1, + 0x87,0x75,0xa0,0x75,0x43,0x94,0xd1,0x62,0x8f,0x62,0xa,0x3d,0x70,0x21,0xc,0x67, + 0xcc,0xb2,0xd,0x98,0x69,0x58,0x4c,0xf9,0x64,0xd,0x5a,0xa6,0xe,0x5,0x4f,0xb0, + 0x9a,0xb6,0xf5,0xe0,0x9c,0xd6,0x41,0xcf,0x43,0xe8,0x4d,0xa5,0x38,0x84,0x52,0xee, + 0x5a,0xfb,0x97,0xa1,0x4f,0xd9,0x87,0x35,0xf8,0x7a,0xc1,0xbf,0x12,0xc8,0x9e,0x84, + 0x8c,0x11,0x80,0x6,0x76,0xaf,0xda,0xa5,0x52,0x38,0x23,0x30,0xf3,0xa5,0x48,0xee, + 0x64,0x9f,0x75,0x16,0x3e,0xa6,0x1f,0xe4,0xf7,0x47,0xad,0x73,0xad,0xd2,0x4e,0xe5, + 0xc7,0xe8,0x5e,0x22,0xe0,0xeb,0x30,0xc4,0x21,0x5c,0x99,0xcf,0x2,0x1f,0xd3,0xc9, + 0x90,0xad,0xf,0x8b,0xd1,0x14,0xa,0x3d,0xc2,0x4c,0x1c,0x80,0x2c,0xc8,0x6,0xee, + 0x47,0x9f,0xd7,0x7c,0xf1,0x1d,0xc8,0xad,0x2,0x63,0xb8,0xb7,0x28,0xa8,0x7e,0xa, + 0x55,0xd,0x3a,0x9e,0xc5,0xbf,0x6a,0x58,0xad,0x9d,0xc0,0x7a,0x55,0xce,0x11,0x45, + 0x10,0x56,0x5b,0x60,0xf4,0x56,0x6f,0xba,0x8c,0x56,0xd5,0x10,0x90,0x3b,0x18,0xbb, + 0xf2,0xd3,0xab,0xa2,0x16,0xbe,0x36,0x47,0xe6,0xd4,0xe5,0xcc,0x13,0xc7,0x59,0x88, + 0xae,0x73,0xc0,0x3c,0xdb,0xd3,0xa6,0x5b,0xdb,0xde,0x1b,0x19,0xbb,0x18,0x8c,0x3f, + 0x3b,0x1c,0xaa,0x6,0xf1,0x7c,0xb9,0x18,0x43,0x5f,0xd1,0x67,0x44,0x93,0xb9,0xb8, + 0x34,0xa,0x7c,0xe9,0xd6,0x30,0xcf,0xcc,0x1,0x4e,0xd7,0x1e,0xe1,0x12,0xb7,0x28, + 0xc9,0x6a,0x45,0x60,0x62,0x43,0x40,0x9b,0x74,0x2,0xec,0xf1,0xa1,0xa6,0x7e,0x25, + 0xfd,0x1d,0x56,0xef,0xdd,0x2b,0x24,0x4a,0x74,0xa3,0xa,0x20,0x14,0xc6,0x42,0xb8, + 0xa5,0xab,0xb8,0xd5,0xf2,0xc1,0x7e,0x20,0xe8,0x4e,0x8e,0xa,0x8,0xba,0xe4,0x3e, + 0xa8,0x20,0xce,0xc4,0xf2,0xbd,0x1e,0x42,0x8d,0xb3,0xfb,0x61,0x4c,0xe0,0xd0,0x1d, + 0x46,0x76,0xf5,0x26,0x92,0x39,0xda,0x6f,0xf1,0x1e,0xde,0xfd,0xdf,0xab,0x27,0xa7, + 0x14,0xe8,0x13,0x61,0x8,0x64,0xae,0x74,0x3,0x21,0x91,0x91,0xad,0x42,0x1b,0x2, + 0x40,0xeb,0xbf,0x73,0xa0,0x53,0x3,0x8d,0xcb,0xd5,0xb3,0x6d,0xe2,0x28,0x68,0x94, + 0x4c,0xeb,0xe9,0x39,0x9b,0x1d,0xe9,0x90,0x61,0x37,0x7f,0x96,0x90,0x9b,0xf7,0x91, + 0x18,0x78,0x7f,0xda,0xa8,0xa0,0xcf,0x73,0xd5,0xf1,0x34,0xb8,0x43,0x93,0xc0,0xc6, + 0xb4,0xfd,0x53,0xc1,0xd8,0x17,0x68,0x56,0xa6,0x59,0xda,0x50,0x7e,0x8,0x62,0x40, + 0x26,0x2f,0xcc,0xde,0x36,0xba,0x2e,0x30,0x17,0x36,0xa9,0x96,0x5a,0x1b,0xe,0xf6, + 0x9b,0x57,0xf2,0xf,0x2f,0x2,0xba,0x8a,0x58,0x67,0xa9,0xbb,0x88,0xd4,0xd4,0x1b, + 0xd2,0x5d,0x93,0xcc,0x6f,0xc,0xf,0x2b,0xc8,0x9a,0x38,0x8c,0xd5,0x69,0x2,0x30, + 0xb5,0x36,0xe2,0x35,0x40,0x2,0xdc,0x69,0xf1,0xfb,0xba,0xb5,0x85,0x69,0x6c,0x60, + 0xf0,0xf3,0xc6,0x39,0x6e,0xce,0x95,0xe7,0x90,0x2,0x66,0xbb,0x87,0x59,0x74,0xe5, + 0xf7,0x5d,0x5d,0xa4,0xe8,0xe8,0x1,0xfe,0xa2,0x89,0x38,0xb5,0x40,0xb8,0x12,0x45, + 0xd7,0xe9,0x80,0x68,0xa6,0xf9,0x94,0xd2,0x10,0x20,0xa5,0x3d,0x84,0x6c,0x1f,0xb7, + 0xbe,0x96,0xa0,0xab,0x8f,0x0,0x14,0x74,0xd9,0x72,0xf1,0x4d,0x72,0xb9,0x3d,0xe4, + 0xe7,0x75,0x36,0x22,0xc7,0xfe,0xe4,0xc,0x13,0x11,0x34,0xac,0xf6,0x5f,0xcc,0x28, + 0xe8,0xc4,0x4,0x9d,0x98,0xfb,0x66,0x8f,0x80,0xce,0x6a,0x35,0xf2,0x7e,0x18,0x42, + 0x59,0x5,0xac,0xb,0x12,0x1c,0x2,0x35,0x65,0x53,0x8b,0x36,0x36,0x30,0x77,0x1c, + 0x31,0xe8,0x26,0x34,0xa9,0xc3,0x4e,0x50,0x41,0x63,0xba,0xbb,0x9d,0x69,0x83,0x95, + 0x53,0xd4,0x46,0x5,0x76,0x22,0xe8,0xa3,0xbf,0xca,0x49,0x77,0xa5,0x8c,0xca,0xee, + 0x66,0x95,0x9e,0xd9,0xca,0x62,0x67,0x16,0x29,0x4d,0xda,0xf,0x9d,0xa5,0x1f,0xac, + 0xf6,0x56,0xb,0xb2,0xef,0xb3,0x74,0x2b,0xda,0x9f,0x89,0xce,0xf8,0xe4,0x59,0x40, + 0xa1,0x9,0x6d,0x3c,0x50,0x17,0xbb,0x82,0xd7,0x1e,0x57,0x9,0x1,0x96,0xa8,0x4e, + 0x9c,0x68,0x3f,0xa9,0xe1,0x55,0x38,0x55,0xa1,0xc1,0xe2,0x8a,0xb0,0x54,0x3a,0xa9, + 0x4d,0x2d,0x3,0xa9,0x68,0xa8,0x53,0x9,0x3,0xf3,0x75,0x32,0xc0,0xe9,0x9a,0xd7, + 0x52,0x4a,0x47,0x83,0xaf,0x8d,0x3f,0x27,0x43,0x57,0x20,0xc5,0xd1,0x72,0x94,0x5a, + 0x75,0xa4,0x7c,0x52,0x6e,0xa3,0x3e,0x85,0xd2,0x3,0xc6,0xcc,0x99,0x99,0x44,0x50, + 0xba,0x41,0xcb,0x61,0x9e,0xce,0x48,0xaa,0x6c,0x4c,0x14,0xed,0xd3,0x33,0x78,0xf6, + 0x3,0x74,0x30,0x6,0x17,0xe,0x1e,0xd0,0xf3,0x75,0xd6,0x8b,0x64,0x2c,0x3,0xf1, + 0x65,0x62,0x28,0xe0,0xd9,0x74,0x47,0x7,0x2b,0x16,0xf2,0x46,0x91,0x25,0xae,0xc1, + 0xe2,0x13,0x2e,0x22,0xb0,0x48,0x54,0xba,0xa6,0xad,0x7a,0x84,0xb5,0xa4,0xa6,0x21, + 0xe6,0x2c,0xfa,0x7d,0xca,0x13,0x4d,0x2,0xdb,0x74,0x45,0xa2,0x67,0xb7,0x65,0x1c, + 0x7c,0xa8,0xda,0x2,0x5c,0xb8,0xf3,0x36,0x4,0xe4,0x41,0x2f,0xb0,0x1d,0x38,0x4d, + 0x4f,0xfe,0xfe,0x67,0x6d,0x1,0xa2,0x14,0x55,0xf5,0xf,0x7f,0xd8,0xef,0x4b,0x6f, + 0x9e,0x3,0xa2,0xb4,0xfe,0xfe,0xae,0x52,0x5d,0xbb,0xc9,0x3c,0x14,0xf4,0x70,0x52, + 0x62,0xa8,0xb5,0x58,0x9,0x71,0x38,0x53,0xc2,0x1b,0xe3,0x5c,0x1b,0xa,0x3a,0xfd, + 0x73,0xe2,0x80,0xc0,0xfb,0xe7,0x7a,0x1,0xc2,0x66,0x6d,0x44,0x37,0xcd,0xf6,0x82, + 0xf3,0xd1,0xb6,0x50,0xd7,0xb5,0x52,0x52,0x5c,0xd5,0xad,0x52,0x15,0xfa,0xc2,0x41, + 0x60,0x0,0x5e,0xcd,0x23,0xbb,0x5d,0x1c,0x6,0x62,0x8a,0x9b,0xd3,0xcf,0x23,0xc0, + 0xe3,0x26,0x2a,0x9d,0x99,0x74,0x98,0xd9,0xa5,0x85,0x60,0x90,0xd2,0xd7,0x1f,0x5d, + 0x8d,0xaf,0xa0,0x15,0x11,0xea,0x12,0x45,0xc0,0xab,0x59,0x95,0x96,0x42,0x9d,0x2b, + 0xa9,0xb8,0x76,0xc6,0xa5,0x6c,0x66,0xb8,0x4,0xa3,0x67,0x5d,0xe5,0x33,0xdf,0xa8, + 0x3e,0xb3,0x2f,0x7d,0x35,0x4e,0x52,0x82,0xb5,0x25,0x48,0x7d,0xbe,0x96,0xa,0x52, + 0x74,0x32,0x56,0xd,0x15,0x8b,0x54,0x4b,0xc8,0x67,0x9a,0xfc,0x7,0x6d,0xc2,0xc7, + 0xf8,0x4c,0xa9,0x3c,0x65,0x55,0x23,0xe2,0x3d,0x8,0x84,0xcd,0x3c,0x3f,0xec,0x52, + 0x4d,0xfb,0x6d,0x4e,0x18,0xae,0x5c,0xa6,0xd8,0xc0,0x1a,0x80,0x3d,0x94,0xbf,0x98, + 0xca,0x44,0xa3,0xa8,0xec,0x2c,0xbb,0x91,0x96,0x2a,0xc5,0x5,0xca,0x65,0xa3,0xaa, + 0xed,0x9,0x17,0x66,0x18,0x4a,0x70,0x1c,0x74,0xc5,0x2b,0x3,0xe7,0x4d,0x9a,0x9c, + 0x5a,0x6e,0x83,0xf6,0x29,0x32,0xca,0x34,0xa2,0x56,0xbc,0xe6,0xaa,0x79,0x30,0x1, + 0xaf,0xaa,0xa8,0x5c,0x3e,0xf1,0x99,0x8d,0xdc,0x19,0x72,0xab,0xcd,0x6,0x19,0x21, + 0x18,0x75,0xbd,0xe8,0x31,0x66,0xbb,0x62,0x92,0x55,0x75,0x72,0x67,0x12,0xbb,0x5c, + 0xcf,0x62,0xef,0x68,0x60,0x60,0x4f,0xc7,0x8f,0x4d,0x2d,0x8,0x34,0xa4,0x43,0xb8, + 0x29,0x8a,0x72,0x0,0x36,0x14,0xe0,0x5a,0xdc,0xca,0x9,0xba,0x83,0x8d,0x4d,0xc4, + 0x28,0xb9,0x6d,0x4a,0xd8,0x76,0xd5,0x46,0x95,0x66,0x8d,0x41,0x67,0xf5,0xd,0x58, + 0x64,0xb3,0x69,0x34,0xb4,0x2a,0xf4,0x20,0x3a,0xa1,0xb5,0x6a,0xa3,0x9b,0x59,0x3d, + 0x2a,0xd9,0x4f,0x13,0x95,0xad,0xbf,0x10,0xf3,0xf2,0x4f,0x80,0x74,0xef,0x53,0x27, + 0xec,0xa9,0x76,0xc5,0xe8,0x99,0xba,0x91,0x5e,0x83,0xf2,0x95,0x24,0x8b,0x89,0xc7, + 0x32,0x9f,0xb7,0x9,0xd7,0x4f,0x2c,0xf6,0x87,0xbc,0x9d,0xe8,0x31,0x47,0x4,0x26, + 0x92,0xae,0xab,0xf3,0xf2,0xba,0x36,0x6,0x5a,0x42,0x86,0xba,0x22,0x60,0xb,0x89, + 0xf,0x8,0x66,0x3,0x16,0x2e,0x31,0xed,0x70,0x63,0x4,0x27,0xa3,0x70,0x2d,0xb7, + 0x65,0x9d,0x8c,0x36,0xbb,0xd9,0xd8,0xea,0xc2,0xec,0x43,0xe8,0x5b,0x3b,0x33,0x19, + 0x43,0x40,0xf0,0xbe,0x8c,0x6e,0xea,0x5c,0x80,0xd0,0x9,0xff,0x95,0x45,0x73,0x7, + 0xb,0x4a,0x25,0x1d,0xec,0xdb,0x49,0x92,0x11,0x76,0xdd,0xb0,0x1,0xff,0xb5,0xa8, + 0x25,0x4d,0xee,0x8c,0x70,0x57,0x2a,0xdb,0x37,0x62,0x98,0xa7,0xb6,0x73,0xc7,0x3, + 0x76,0xb2,0xfb,0x75,0x66,0xfd,0x89,0xf8,0x57,0x1d,0x60,0x46,0xfb,0x3e,0xbe,0x24, + 0x6d,0xb4,0xea,0xd8,0x18,0x9d,0x1c,0xa6,0x1d,0x38,0xcc,0x7c,0x1f,0x86,0xd6,0x47, + 0x71,0xe6,0x99,0x61,0x8c,0x26,0xb6,0x81,0xce,0xb2,0x6f,0x6c,0x56,0xd5,0xef,0xff, + 0xe,0x90,0x1e,0x6,0x1,0x2a,0x85,0xbe,0xf4,0x79,0x5c,0xd5,0xd7,0xe9,0x8,0x5f, + 0xea,0xa9,0x70,0x5,0x7b,0x39,0x75,0xe3,0x3b,0xed,0x4c,0xfc,0x91,0x64,0x8c,0x67, + 0xd0,0x45,0x27,0x6c,0x42,0x40,0xff,0x17,0xa9,0xe7,0xa0,0x24,0x4e,0x26,0x84,0x8b, + 0xd6,0x1e,0x80,0x32,0xb5,0x31,0x91,0xcc,0x42,0x1c,0xc7,0x6c,0x52,0xfd,0x35,0x2c, + 0x95,0x2f,0x86,0xf5,0xc6,0x37,0xf4,0x9e,0xe4,0x4f,0xf1,0x7e,0x6,0xec,0xcf,0x64, + 0x42,0xbb,0x9b,0x7f,0x98,0xb1,0x94,0x13,0xa6,0x60,0x1d,0x29,0x38,0xdf,0xe7,0x91, + 0xa1,0x6d,0xda,0xfb,0xfd,0x1c,0xf3,0xc6,0x1e,0xed,0x90,0x70,0xf6,0xfe,0x16,0x7f, + 0xb2,0xc4,0x86,0xf0,0xe5,0x8b,0xd4,0x5d,0x97,0x16,0x89,0xb2,0x98,0x31,0xeb,0xef, + 0x3b,0x47,0x5,0x7d,0x19,0x6a,0xeb,0x11,0xa1,0x37,0xa0,0xc2,0x2d,0x6e,0xef,0x11, + 0x41,0xe,0x86,0xc6,0x56,0x22,0x21,0xd8,0x81,0x26,0x7,0x98,0x52,0x82,0x7d,0x4d, + 0x79,0xc0,0x27,0x5c,0x30,0xea,0xeb,0x8b,0x88,0x4e,0x16,0x45,0x15,0x9e,0x9,0x5, + 0x87,0xd2,0x9b,0x94,0x96,0x1a,0x6e,0x25,0xd1,0xd3,0x93,0x54,0x46,0xb0,0x4d,0xc9, + 0x59,0x20,0xef,0x35,0x1c,0xd5,0xc8,0xb3,0x83,0xdd,0x2f,0xa2,0x72,0x5a,0x22,0x8f, + 0x6b,0xd4,0x80,0xc2,0xf5,0xce,0x3f,0xe0,0x54,0xdc,0xcb,0x52,0x55,0xab,0x32,0x6, + 0x61,0xe2,0xa5,0xce,0xa6,0x6c,0xca,0xb0,0x94,0xcc,0x1e,0x96,0x69,0xa7,0xe2,0x8, + 0xd3,0x5,0x26,0xd5,0x99,0x8,0x2,0x89,0xb4,0x6b,0x23,0xe6,0xa6,0xd0,0x64,0x84, + 0x2,0xfa,0x8,0x1a,0x26,0x22,0x48,0x45,0x4f,0xfb,0x24,0x48,0x93,0x7,0xdc,0x81, + 0x54,0x71,0xe1,0x98,0x34,0x8d,0xd,0x9e,0x88,0x77,0xaf,0x5c,0xa3,0x7c,0xd6,0xf3, + 0x1c,0x46,0xcb,0xec,0x6a,0x7c,0xc1,0x22,0x36,0xee,0x54,0xc5,0x6f,0x7d,0xe4,0xa0, + 0x56,0x3d,0x23,0x5c,0x18,0xc4,0x97,0x3,0x76,0x1f,0x62,0xaf,0x23,0xfc,0xa,0x21, + 0x1,0xf1,0xeb,0x52,0x61,0xed,0xd0,0xae,0x29,0x9f,0x4e,0xf0,0x71,0xc3,0x61,0xde, + 0xb,0xa2,0xe2,0x54,0xae,0x9f,0xce,0x27,0xf9,0xa3,0xce,0x86,0x32,0x44,0x73,0xd5, + 0xd4,0x48,0x93,0xb8,0x74,0x88,0x2b,0x9b,0x7f,0xd5,0xfb,0x3e,0x2b,0x18,0xa2,0xf5, + 0x4f,0x76,0xb,0x8,0x56,0xd0,0x41,0x2b,0x9c,0xc5,0x66,0xdf,0x89,0x34,0x6d,0xec, + 0x8e,0x86,0xb2,0xa1,0x14,0x2,0x45,0x67,0x4f,0x33,0x93,0x6e,0x4f,0xb0,0x58,0x79, + 0x9f,0x7d,0x96,0x16,0x31,0x17,0x5d,0x8d,0x98,0xd8,0xcd,0x34,0x28,0xc4,0xae,0x69, + 0x8,0xf3,0x6b,0x3e,0x17,0x3d,0x19,0x37,0xb4,0x33,0xfb,0xa9,0xd1,0x3b,0xbd,0x74, + 0x6d,0x5e,0x5a,0xbb,0xf,0xf9,0x99,0x2b,0x36,0xaa,0x39,0x8d,0x9d,0xdb,0x17,0xbc, + 0xea,0x7,0x5e,0xa0,0x21,0x88,0xeb,0x9d,0xa8,0x0,0x38,0x51,0xc4,0x5c,0xe9,0x2d, + 0xf6,0x15,0x1b,0x32,0xd1,0x5b,0x13,0x6a,0x9b,0x4a,0xf3,0x6b,0xe0,0x42,0xfc,0x94, + 0x4f,0xe5,0xc5,0x1d,0x8c,0x15,0x3e,0x4f,0x39,0xc0,0x9e,0x1b,0x80,0x81,0xaf,0x20, + 0x5,0x17,0xf5,0x9,0xd0,0xd4,0x25,0x3d,0x64,0x61,0xbb,0xb3,0x81,0xb,0xe9,0xb3, + 0x33,0x48,0xd4,0xde,0xca,0x46,0xaf,0x3,0xe9,0x8b,0x42,0xd3,0xd4,0xe5,0xb0,0x35, + 0x21,0xd4,0x70,0xa9,0xdf,0x44,0x93,0xa2,0x8b,0x6a,0x21,0x46,0xcc,0x9a,0x24,0xdc, + 0x9e,0x68,0xc8,0x71,0xea,0x1c,0xcd,0x46,0x20,0x30,0x88,0x64,0xf1,0x39,0x2f,0xdf, + 0xb2,0x3f,0xfa,0x9a,0x8,0x54,0xe7,0x53,0x39,0x9,0x37,0xd6,0xb,0x81,0x9b,0x39, + 0x54,0xb5,0x66,0x7f,0x23,0x46,0x5d,0x71,0x39,0x26,0xa,0x76,0xdd,0x3d,0x9a,0xfb, + 0x45,0x57,0xcd,0x5e,0xc9,0x2a,0x4c,0x52,0x69,0xe,0xd3,0xcd,0x41,0x95,0x1a,0x4e, + 0x72,0x86,0x45,0x49,0xf7,0xa1,0x4d,0x7f,0xea,0xd4,0x5,0xef,0x66,0xd9,0xfe,0x7d, + 0xd,0xd5,0xde,0xf,0x98,0xab,0x4f,0xa4,0xfd,0xfd,0x9a,0x3c,0x5b,0xcd,0xf,0x7b, + 0xb,0x9c,0xf4,0x99,0xf8,0x4d,0x2c,0xe2,0xce,0x92,0x9b,0xa,0x59,0xc9,0x78,0x19, + 0xb6,0xc,0xeb,0xe3,0x17,0x1e,0xfe,0xd6,0xcf,0xa6,0x24,0xd1,0x24,0xc3,0xba,0xb2, + 0x99,0x78,0x65,0x23,0x4,0xfb,0x8d,0x39,0xbc,0x9f,0xd5,0x7a,0x29,0xd1,0x6c,0x62, + 0x2b,0xc9,0x7a,0x88,0x63,0x26,0xa6,0xc5,0xb4,0x7f,0x45,0x1d,0x5d,0x8c,0x4,0x24, + 0x8d,0x94,0x56,0xae,0x9c,0x4c,0xd9,0x75,0x8,0x74,0x9b,0x50,0x93,0xc9,0x2c,0x76, + 0x67,0xb8,0x0,0xc6,0x19,0xf0,0x5a,0x83,0x9b,0x57,0x24,0xea,0xde,0x89,0x9d,0x4, + 0x98,0xdf,0x3f,0x29,0x1f,0x66,0x52,0x85,0xa3,0xa2,0x2c,0xc2,0x37,0x20,0x9,0x88, + 0xae,0xa2,0xc5,0xf0,0x41,0xb9,0xab,0xe0,0x2b,0x19,0xd2,0x61,0x0,0xa2,0x53,0x26, + 0x31,0xfb,0xce,0xf2,0x39,0x6d,0x2a,0x61,0x77,0x99,0x2f,0xa9,0x8f,0x3c,0xc7,0xbe, + 0xbf,0xb5,0x6d,0x6a,0x96,0x84,0x5f,0x23,0x79,0xac,0x2e,0x47,0xbf,0x2c,0x74,0xc5, + 0x8b,0xe2,0xe1,0x87,0x8,0xdb,0xf8,0xb6,0xe,0x14,0xb4,0x2d,0x6b,0xe8,0xda,0xe3, + 0x67,0x93,0xc1,0x8b,0x72,0x83,0x98,0x43,0x93,0x6c,0xbc,0x1a,0xa5,0x8c,0x6c,0x7b, + 0x60,0x69,0x1,0x3e,0x7f,0xc6,0x90,0xbe,0x4d,0x25,0x42,0x19,0x9d,0x4d,0xd6,0x26, + 0x4,0xd6,0x62,0xb6,0xe,0x4b,0x2d,0x79,0x85,0x6a,0x3b,0x14,0x2b,0x86,0x2a,0xb1, + 0x46,0xa4,0x8d,0xec,0xf9,0x8,0x12,0x5a,0x63,0x1d,0xb4,0xb8,0xd2,0x56,0x36,0xc1, + 0xde,0x6b,0xf0,0xa7,0xf0,0x55,0x8e,0x53,0x1c,0xc4,0xb7,0xfe,0xec,0x5,0xc9,0x63, + 0xa4,0xce,0xf3,0xc5,0x87,0xea,0x5e,0x9a,0x8d,0xb,0xae,0x38,0x73,0xde,0xfa,0xbc, + 0x5a,0xdc,0x5b,0x76,0x77,0x5f,0x54,0x48,0xdc,0xe8,0x3,0xd6,0x99,0x72,0xf8,0xa6, + 0xd2,0xa1,0x2d,0xca,0x7b,0x37,0x3f,0x23,0xa4,0x12,0x9f,0x1e,0x50,0x6d,0x96,0xe1, + 0xe3,0x94,0xb6,0x5c,0x70,0x44,0x55,0x6a,0xc1,0x14,0x4c,0xd7,0x9d,0x98,0x7c,0x87, + 0xab,0x50,0x31,0xc5,0x40,0xdb,0xb0,0x77,0x99,0x1,0x8,0x59,0x27,0x9,0x65,0x21, + 0x87,0x84,0x16,0x34,0x3c,0x85,0xe8,0x49,0x84,0x4b,0x70,0xea,0xc,0x36,0x2,0x5b, + 0x9b,0x85,0x91,0xc4,0x1d,0xf,0x33,0x39,0xc8,0xf4,0x89,0x31,0x39,0xa4,0xbb,0xf, + 0x3c,0xb2,0x57,0xe5,0x71,0x32,0x36,0xd,0xca,0x11,0xe2,0x64,0xca,0xaa,0x4f,0x71, + 0xaf,0xac,0x92,0x77,0x9c,0x41,0xcb,0x7d,0x50,0xfa,0x1c,0xc8,0xb4,0x35,0x57,0xf2, + 0xb0,0x60,0x3d,0xe,0x1e,0xc5,0x34,0x9d,0x69,0xe7,0x8f,0xc,0xc4,0x33,0x44,0x32, + 0xc6,0xc1,0xd3,0x9d,0x7e,0xb4,0x30,0x64,0x8a,0x91,0xc2,0x6,0x72,0xe8,0x33,0x69, + 0x98,0xa0,0x23,0x61,0x7a,0x7f,0x75,0x8e,0x78,0x52,0xd9,0x48,0x37,0x32,0xe3,0x8e, + 0xb8,0x2e,0xb9,0xd0,0x83,0xc,0xda,0xb5,0x0,0x91,0xec,0x1f,0xd0,0x7b,0xb3,0xba, + 0x4d,0x94,0xd5,0xce,0x24,0xca,0xd2,0x8,0x59,0xa5,0xfe,0xd7,0xc1,0xda,0x85,0x28, + 0xe9,0xed,0x9c,0x38,0x13,0xbb,0x1a,0x3c,0x74,0x20,0xea,0x96,0x33,0x49,0x8d,0xa1, + 0x78,0x3a,0x11,0x32,0x4b,0xc9,0x7b,0xc4,0x5c,0xcb,0x68,0x50,0x1b,0x80,0x36,0x43, + 0x1f,0xe8,0x6b,0x84,0xc1,0x63,0x4,0x7a,0x60,0x62,0x1b,0xb3,0x1c,0xa2,0x1c,0x93, + 0xc7,0xe9,0x81,0x7e,0xb8,0x68,0x4f,0xe,0x87,0x5e,0x73,0xe7,0x33,0x44,0x55,0x9e, + 0x2d,0x80,0x81,0x81,0x8f,0x30,0x98,0xc1,0x40,0x8,0x9d,0x48,0xab,0xc0,0x29,0x6a, + 0x72,0x8e,0x8f,0x46,0xc,0x8c,0x44,0x4b,0xcb,0xa8,0xbb,0x58,0x13,0x45,0x80,0x7e, + 0x9e,0xaa,0x6a,0xea,0xc5,0xc1,0x8c,0xc,0x87,0xf8,0x1d,0x49,0xd7,0x35,0xb8,0xc6, + 0x84,0x79,0x54,0x73,0x15,0x33,0x44,0x5c,0x4d,0x6d,0x9c,0xab,0x95,0xaf,0x7b,0x92, + 0x3e,0xbc,0xfd,0x91,0x9f,0xfc,0xb1,0x79,0x71,0x71,0xf,0xe8,0xe7,0x34,0x46,0xca, + 0xf6,0x69,0x76,0x49,0x1d,0x82,0x36,0xa8,0x8c,0x6d,0xf4,0x8d,0xe4,0x38,0xf,0xf8, + 0x40,0x2f,0xc4,0xb7,0xf3,0x1b,0xa6,0x96,0xeb,0x50,0x14,0xf3,0xcc,0x13,0xad,0x74, + 0x8,0xac,0x1a,0x88,0x40,0x87,0xef,0xe7,0x37,0x78,0xb4,0xe3,0x6b,0x52,0x84,0xe6, + 0xf8,0x19,0xe1,0xa6,0x93,0x7c,0xe0,0x41,0x8d,0xf6,0x6c,0xaa,0x35,0x89,0x9d,0xa6, + 0x5e,0x45,0x77,0x5c,0xdb,0x81,0x9,0x71,0xd8,0x37,0x5d,0x99,0x55,0xc1,0x27,0xc7, + 0x5,0xd3,0x26,0x3c,0xfc,0x36,0x62,0x23,0x6,0x68,0xdf,0xb9,0xf5,0x9e,0xdd,0x8f, + 0x5,0x26,0x35,0x6a,0x36,0xa3,0x84,0xaf,0x12,0x4d,0x6,0xa8,0x2,0x2b,0x65,0x9a, + 0xdc,0x7a,0xd,0xfa,0x63,0xda,0xf4,0x81,0x7a,0x17,0x28,0x93,0x36,0xe5,0x70,0xc9, + 0x50,0x6c,0x73,0x3b,0x40,0xe6,0xbe,0xb0,0x75,0xb9,0x17,0x31,0x13,0xa6,0x8c,0xb4, + 0xd0,0xd4,0x1,0x54,0x9e,0xb4,0x2d,0x10,0xd5,0xc4,0xe6,0x42,0x98,0x92,0xc7,0x77, + 0xda,0x3b,0x2f,0x17,0xee,0xd1,0x9d,0xcd,0xf3,0xc,0x7c,0xc7,0xfd,0xf3,0xdd,0x5e, + 0xf4,0xfa,0xfb,0x8e,0x2e,0x6c,0x47,0xe,0xfb,0x21,0x78,0x1c,0xff,0x73,0xfa,0x8c, + 0x93,0x4c,0xf2,0x49,0x3a,0x39,0x9,0x9e,0xfc,0x77,0xb8,0x1e,0x7c,0xe3,0xf5,0xc3, + 0xdf,0xdb,0x40,0x35,0xfc,0x30,0xe4,0xec,0x38,0xa8,0x76,0xc6,0xde,0x4a,0x62,0x30, + 0xf2,0xe3,0x4,0x55,0x6e,0x4,0x43,0x32,0x76,0x5a,0x58,0x22,0xb6,0x1,0x32,0x90, + 0x4c,0x61,0xe4,0xeb,0x74,0xc8,0x74,0xaa,0xc4,0xa5,0x34,0x99,0x7e,0xcd,0xae,0x72, + 0xe6,0x3b,0x1d,0xd1,0x98,0x2,0x4d,0x91,0x33,0xa4,0xea,0xb6,0x29,0xcb,0x45,0xd1, + 0x39,0x16,0xeb,0x1c,0x4,0xbd,0xe,0x6e,0xa9,0xf9,0x44,0xe3,0xef,0x2e,0xd4,0xac, + 0x4e,0x83,0x2e,0xdf,0x1c,0x2d,0x9e,0x1,0xea,0x23,0x86,0xca,0x6f,0x16,0x34,0xf8, + 0xfa,0xbf,0xcb,0x88,0x26,0x29,0x93,0x38,0x70,0x75,0xa3,0x6,0xbb,0xfa,0x98,0x69, + 0xcc,0x6d,0x2b,0xbc,0xc3,0xe6,0xbd,0x5d,0xf3,0x3c,0x72,0x72,0x62,0xa2,0x3f,0x37, + 0x12,0xd5,0x94,0xd8,0x54,0x2e,0xc9,0x57,0x2f,0xbe,0x8b,0x6d,0x1,0x6a,0x8f,0x33, + 0xb2,0xf4,0x81,0xc5,0x6f,0x95,0x6d,0x38,0xd9,0x29,0xa4,0xe6,0x4,0xbb,0x80,0xfd, + 0x80,0xb6,0x7,0xb5,0x87,0xc3,0xec,0x43,0x9b,0x14,0x2e,0x83,0x5a,0x12,0xec,0x56, + 0xa4,0xc6,0x74,0xef,0x23,0xad,0x67,0x44,0xb8,0x9c,0xa1,0x48,0x5f,0xda,0xa8,0x61, + 0xac,0x29,0xe8,0xbc,0xfd,0x3,0x4f,0x62,0x13,0x9d,0x76,0xaf,0x16,0xf2,0x7b,0x95, + 0x1d,0x1c,0xb2,0x97,0xe8,0xe4,0x38,0xd5,0x99,0x26,0xf5,0xfa,0xa2,0xa2,0xc9,0xe9, + 0x6,0x4,0xfb,0x5d,0xa1,0x7d,0xc,0x5,0xd2,0x4a,0x32,0x2f,0xb9,0x45,0x31,0x21, + 0x30,0xf4,0xdb,0x90,0xf7,0x73,0xc4,0x2a,0xaf,0x20,0xe,0xa2,0xb7,0x59,0x51,0x8d, + 0xbb,0x80,0x63,0x9b,0x2d,0x2b,0x54,0x74,0x92,0xa7,0xbd,0x4,0x3,0x12,0xd3,0xdb, + 0x76,0x5e,0x21,0xa2,0x66,0x1d,0xdf,0xc3,0x35,0xa4,0x3d,0x57,0x63,0x1a,0x71,0x73, + 0x9,0x6,0x57,0x34,0x67,0xf1,0x77,0xc4,0x27,0xef,0xef,0x49,0x6b,0xa0,0xff,0x46, + 0xfa,0x59,0x86,0x1e,0xa8,0x3a,0xf1,0x70,0xb0,0xdc,0x33,0xa2,0xf1,0xfe,0x3d,0x90, + 0x7d,0xe3,0xad,0x5e,0xa,0xf7,0x29,0xd9,0xcd,0xf,0xf9,0x90,0x47,0x3d,0xf4,0x42, + 0xc,0xed,0xc2,0x11,0x44,0x9b,0xcd,0xe,0xb6,0x96,0x9d,0xe3,0x56,0x10,0xa2,0x69, + 0x70,0x81,0x5e,0xd5,0x17,0x53,0x12,0x15,0xbd,0x58,0x50,0x52,0x76,0xf9,0x96,0x56, + 0x6e,0x86,0x49,0x1c,0xb4,0xa0,0x5,0xdb,0x67,0xd9,0xde,0xa6,0xa2,0x4f,0xf7,0x64, + 0xd3,0x3e,0xec,0xd1,0xc6,0xd6,0x79,0x40,0x2b,0x1a,0x3f,0x82,0x35,0x8a,0x4e,0x6d, + 0x69,0xe8,0x9c,0x26,0xc1,0x20,0x12,0x85,0xa6,0x2b,0xf2,0xa6,0x4c,0xe5,0xee,0x58, + 0x39,0xbb,0xe4,0xee,0xec,0xc9,0x15,0xd4,0x9e,0x31,0xa3,0x45,0x68,0xca,0x54,0x47, + 0xaa,0xf3,0x55,0x5,0xb1,0x1,0x4c,0x92,0x15,0xc1,0x5c,0x72,0xcc,0x2c,0xe6,0xb6, + 0x7,0x5,0x67,0x7b,0x56,0x5a,0xd2,0x27,0x6e,0x3c,0xa5,0x42,0xfc,0xcf,0x73,0xa1, + 0x90,0x13,0x22,0xe1,0x97,0x72,0x16,0x81,0xaf,0x6e,0xc7,0xa8,0xf4,0x4c,0x81,0x18, + 0x23,0x18,0x84,0xe1,0xc3,0xfc,0x15,0x33,0xd3,0xcd,0xec,0xa0,0x82,0x3,0x20,0xea, + 0x69,0xcf,0xe8,0x47,0x6,0xe3,0x11,0x32,0xb4,0xb4,0xd4,0xf,0x4c,0xd5,0xe,0x1e, + 0x8a,0x0,0xc,0x59,0x60,0x4d,0xb3,0xe6,0xa3,0x9e,0x7f,0xef,0x67,0xd,0x83,0x4, + 0x75,0x30,0x7,0x1f,0xfb,0x53,0x78,0xd1,0x7f,0xca,0xe0,0x8f,0xa6,0x10,0x56,0x2f, + 0xc8,0x98,0x53,0x35,0x35,0x59,0xe6,0x42,0x44,0x4e,0xaa,0x66,0x9f,0xd1,0x43,0xe5, + 0x34,0x95,0xa7,0x69,0x9c,0xa1,0x9a,0x9d,0x2f,0xca,0x4d,0xd5,0x3a,0x3b,0xfd,0x20, + 0xa0,0xbb,0xaf,0x1d,0xd,0x3a,0x2,0xdd,0x80,0xba,0x86,0x85,0xe3,0x95,0x56,0x13, + 0x23,0xf6,0x18,0x92,0xbd,0xda,0x1e,0xa0,0x19,0x5d,0x78,0x42,0xf8,0xf4,0xc5,0xbb, + 0xc,0x0,0x4,0x3d,0xc2,0x88,0x38,0x28,0xda,0xc0,0x41,0x92,0xf3,0x71,0xd7,0x32, + 0xa7,0x35,0x78,0x8b,0x62,0x79,0x75,0x8f,0xfb,0x46,0xa,0x83,0x4c,0xee,0xca,0xdb, + 0xd,0x93,0x2a,0x6b,0xd1,0xc7,0x76,0x73,0xef,0x12,0x6e,0x16,0x85,0x9c,0x1c,0x60, + 0x10,0x55,0xf3,0x9a,0x88,0x7e,0xfb,0xb,0xdd,0x14,0xb3,0xca,0xd4,0x8,0x4d,0x1a, + 0x1a,0xe9,0xb1,0x1e,0x23,0x86,0x36,0xc8,0x74,0x59,0x4b,0x2b,0x47,0x89,0x75,0x0, + 0x81,0x8,0x85,0x40,0xad,0xea,0xe1,0x3a,0xe9,0x44,0x75,0xa5,0xbf,0x5c,0xed,0x40, + 0x1b,0xad,0x56,0xf9,0xe5,0x96,0x7c,0x44,0x79,0xa4,0xa3,0xc5,0x86,0xd6,0xd,0xc6, + 0x34,0x5f,0x31,0x81,0x8b,0x57,0xb1,0xfd,0xc8,0xd1,0xbc,0x37,0xdc,0x1c,0x93,0xc1, + 0x3b,0x99,0x12,0x25,0x8d,0x7a,0xa3,0x9c,0x97,0x35,0xc6,0xa8,0x16,0xda,0x45,0xf1, + 0x3a,0xd8,0x48,0xc6,0xdb,0xfe,0x7c,0xed,0x39,0x8a,0x20,0xc,0x27,0xd2,0x83,0xc3, + 0x36,0x8b,0x8,0x33,0x10,0x1f,0x12,0x4b,0x74,0x12,0x6,0x6,0x9d,0x7,0x34,0x19, + 0xd2,0x74,0x84,0x6a,0xd9,0x51,0x8b,0xb,0x5b,0x72,0xb0,0xb9,0x7f,0x8f,0x8e,0x95, + 0x31,0xa0,0x4f,0xcc,0x59,0x56,0xc8,0x2c,0x22,0xfa,0x79,0x1a,0x74,0xbd,0xce,0xe7, + 0x76,0x80,0x83,0x7b,0x87,0x7,0x2d,0xb6,0xf5,0x92,0x4e,0x8a,0x55,0x38,0xf4,0xbf, + 0xce,0xa,0x68,0x3b,0x29,0xfa,0x5f,0x3e,0x7e,0xfc,0x5e,0x55,0xf5,0x5f,0xbd,0xff, + 0x47,0x1f,0x4d,0x99,0xc5,0x3e,0xd6,0x93,0x19,0x25,0xdc,0xa5,0xe3,0x54,0xf7,0xb0, + 0x3e,0x34,0x4d,0xb0,0x7b,0xb2,0xa3,0x43,0x9c,0x75,0xb0,0x6b,0x12,0xd2,0xbf,0xbf, + 0x87,0xad,0xb5,0x50,0x13,0x2,0x93,0xb,0x6c,0xad,0x43,0xc9,0xbe,0x99,0xbd,0xec, + 0xcd,0xe7,0x0,0xbb,0x84,0xed,0x80,0xe3,0xdb,0x21,0xd9,0x9b,0xba,0x98,0x7a,0x56, + 0x65,0x26,0x35,0xc4,0x40,0x70,0x7c,0x7a,0x63,0x62,0x33,0xb9,0xd,0xea,0x2d,0xc1, + 0x64,0x30,0x8c,0x55,0x1f,0x41,0xc9,0x78,0xac,0xee,0x51,0x0,0x60,0x18,0xaf,0x81, + 0x3b,0xbc,0xd2,0x95,0xdf,0x2b,0xe,0xed,0x42,0x97,0x8f,0x2d,0xb8,0xe5,0x30,0x83, + 0x6b,0xb0,0x89,0xab,0x8e,0x7e,0x4e,0x6a,0x7f,0xe0,0x5c,0x35,0xa7,0xc3,0x30,0x23, + 0x87,0x86,0x28,0x74,0x21,0x8e,0x59,0x6f,0xdd,0x28,0xf,0x24,0x1d,0xf5,0x2a,0x4, + 0x73,0x4a,0x7c,0x10,0x20,0x79,0xb,0xad,0xa7,0x45,0x4c,0x62,0x30,0x7b,0x4f,0x51, + 0xe0,0x6b,0x4,0xdf,0x4b,0x7f,0xe1,0x76,0x96,0x53,0x4d,0xfe,0x89,0x6b,0xb1,0xcf, + 0x6d,0x9a,0xa8,0x57,0xd0,0x6e,0xa5,0x50,0x23,0x52,0xb5,0x3f,0x49,0x61,0xce,0x0, + 0xb1,0xf6,0xec,0x77,0x68,0xa,0x58,0xbc,0x58,0xe7,0x8b,0x48,0xea,0x4e,0xc9,0x2a, + 0xd2,0xcf,0x90,0xdd,0xac,0x44,0xb4,0xae,0xcd,0x6a,0xb7,0x2a,0xc8,0xa7,0x7a,0x6e, + 0xfb,0xa8,0xe3,0xc3,0xbe,0xb7,0x36,0xb7,0xdc,0x5b,0x3c,0xe3,0x95,0x89,0xc7,0x87, + 0xbc,0x6d,0xdb,0xf,0x55,0xcd,0xb3,0x3c,0x63,0xb9,0x91,0x91,0xe7,0xb2,0x39,0x42, + 0x5c,0xba,0x2a,0x68,0x6f,0x60,0x13,0x76,0xd7,0x3c,0x7,0x87,0xa,0xc6,0xb5,0xa1, + 0x2f,0x93,0x43,0xad,0x9a,0xc7,0xa1,0xc6,0xe9,0xe2,0x23,0x29,0x63,0x86,0xa3,0x51, + 0xc3,0xdc,0x25,0x30,0xaf,0xa0,0xc9,0x3b,0x4,0xfb,0x6a,0x50,0x83,0xfc,0xe2,0xf5, + 0xaa,0x2b,0x16,0xc1,0xf5,0x1a,0xf1,0xc8,0xe,0xd7,0x4,0x37,0xb1,0x7,0x57,0xc6, + 0xcc,0xa7,0x40,0x26,0xd7,0xf4,0x23,0x86,0x6b,0x43,0x32,0x5d,0x87,0x9b,0xd8,0x5c, + 0xf0,0xd8,0x20,0x3c,0x7e,0x56,0xf1,0x33,0x20,0xd0,0x50,0xaf,0x43,0x4,0x25,0xe6, + 0x22,0xcd,0x2d,0x64,0x70,0x1f,0x4,0x15,0xd4,0x86,0x2e,0x5d,0x10,0x6,0xcd,0xc, + 0x54,0xaa,0xa7,0x10,0x8,0xc2,0x3c,0x72,0xc6,0xb0,0x4d,0xa1,0xea,0x89,0xb4,0x16, + 0x8f,0x4c,0x5a,0xb0,0x43,0xb8,0x88,0x29,0x48,0xb3,0x7b,0x44,0x28,0x9e,0x99,0x4c, + 0xf5,0x86,0xfc,0xd1,0x4,0x58,0xd0,0xc9,0x46,0x32,0x1b,0xcc,0x9a,0x49,0x56,0x14, + 0xf7,0x30,0x99,0x8b,0x72,0x66,0x3b,0xf0,0xba,0xa3,0x23,0x37,0x82,0xd3,0x3e,0xe0, + 0x25,0x4,0x51,0x78,0x95,0x18,0x4b,0x8a,0x2a,0x66,0xa4,0x64,0xb6,0xac,0xa4,0x26, + 0xbe,0x16,0xaa,0x89,0x4d,0x35,0x3,0x3b,0xf4,0xa4,0xc4,0x44,0x6a,0xd0,0xdb,0x71, + 0x9a,0xf0,0xa7,0x2,0x97,0x6,0x67,0x44,0xb2,0xdd,0xf0,0x23,0x64,0x95,0xc5,0x32, + 0xa6,0x42,0x24,0x5,0x56,0xf5,0x2d,0x43,0x9f,0x5d,0x41,0xc1,0x66,0xb0,0x11,0x12, + 0xce,0x41,0x86,0x2b,0x1d,0x97,0xb,0x18,0xdf,0xe,0x78,0x85,0xbe,0x35,0x61,0xa8, + 0x36,0xed,0xd0,0x35,0xfb,0xfb,0xa8,0xa1,0xc,0xfa,0x87,0xc,0x36,0xc6,0xd0,0x4e, + 0x34,0xff,0xc6,0x6a,0xfd,0xc4,0x25,0xa1,0x8a,0x58,0x7b,0xbd,0xde,0xac,0x4a,0x7, + 0xc0,0x7e,0x8e,0x10,0x68,0xa9,0x44,0x3b,0x29,0x8,0x9f,0x5,0x4f,0xa7,0x3d,0x3a, + 0x7c,0x60,0xa6,0x53,0x43,0x78,0xda,0xef,0x71,0x4d,0x8,0x9f,0x80,0xe8,0x9,0x8, + 0xb4,0x1d,0x48,0xdf,0x3b,0x48,0x90,0x5c,0x84,0x64,0x2c,0xdf,0xa9,0x41,0x98,0x46, + 0xe,0x0,0xca,0x28,0xdc,0x83,0xde,0x30,0xde,0xf7,0xe6,0x2,0x11,0xcd,0xb1,0xba, + 0x72,0xee,0x47,0xc5,0x1d,0x92,0x59,0x34,0x53,0x44,0xd2,0x7f,0x7b,0x8,0x8,0x47, + 0x96,0x5f,0x75,0xb5,0xfa,0x93,0xb,0x49,0xe2,0x4a,0x32,0x5e,0x12,0xba,0xa0,0xdd, + 0xcd,0x28,0xf,0x9,0x85,0x85,0x52,0x60,0x7c,0xcd,0x17,0x33,0xc4,0x29,0xf2,0x27, + 0xf7,0xcf,0x67,0x73,0x1e,0xb,0xf1,0x90,0xc8,0x14,0xcb,0x8c,0x67,0xaa,0xe9,0x5e, + 0x6e,0x2,0x19,0x1a,0xfd,0x85,0x71,0xbd,0x9a,0xb2,0x32,0x31,0x4d,0xe3,0x17,0xa2, + 0x58,0x9d,0x45,0xd7,0x90,0xd9,0x15,0x93,0xdd,0x3c,0x84,0x40,0xe3,0x13,0x34,0x91, + 0x86,0xc,0x38,0xba,0xe7,0xb2,0xd7,0x66,0xda,0xf8,0x6e,0xee,0xa2,0x56,0x8d,0xbb, + 0x95,0xc2,0x5d,0x3d,0x61,0x20,0xc9,0xb0,0x46,0x7d,0x7d,0x84,0x1f,0x7b,0x4d,0x8f, + 0x5e,0x4d,0x43,0x9a,0x90,0x4a,0xef,0x98,0x52,0xd0,0x0,0xef,0x23,0x8b,0xb1,0x91, + 0xad,0xbb,0x74,0xde,0x71,0x61,0xe5,0x12,0xfd,0xfb,0x6,0xcc,0x37,0x76,0x3d,0xad, + 0x7a,0xf5,0x9e,0x64,0x69,0x23,0x4f,0x50,0x9,0x17,0xa0,0x5c,0x86,0x47,0xe2,0xd2, + 0x66,0x86,0x25,0x26,0x58,0x59,0xcb,0x7b,0xda,0x24,0x36,0xf,0xc4,0xc2,0x5,0x63, + 0x1a,0x2f,0xc1,0xa1,0x73,0x87,0xb7,0x65,0xc2,0xa4,0x30,0x54,0xef,0xb0,0xfd,0x6b, + 0x9c,0x19,0x91,0xb,0x65,0x8,0xa6,0xe4,0x71,0x63,0x15,0x97,0x76,0xa4,0x64,0x5f, + 0xb0,0x7c,0x12,0xa4,0x4a,0xef,0xa1,0x67,0x31,0xa6,0x4,0x4c,0x7f,0xe6,0x45,0x41, + 0xda,0x12,0xc5,0x41,0x87,0xe5,0x3d,0xe9,0xbb,0x36,0xe9,0x92,0xd5,0xc,0x7c,0x72, + 0x3c,0xcf,0x34,0x3,0x48,0x47,0xda,0x72,0x7a,0x74,0xc9,0x80,0xb,0x44,0xcf,0xe8, + 0xc9,0x8e,0xa2,0x5f,0x3,0x67,0x22,0x64,0x53,0x61,0x8a,0x9a,0xe5,0x2,0x41,0x30, + 0x6c,0x36,0x5a,0x83,0xc,0xc4,0x94,0xbd,0x7f,0x37,0x6,0xc7,0x74,0x86,0xcc,0x40, + 0x4e,0x49,0x4,0x5d,0x2a,0xd7,0x90,0x8,0xb0,0x17,0x3a,0x7a,0x60,0x61,0xd2,0xd5, + 0xaf,0x3a,0x51,0xbb,0x51,0xc3,0x35,0x62,0x50,0xd1,0x6f,0x3a,0x6d,0x83,0xfc,0xb3, + 0x2c,0xbc,0xab,0x11,0x4a,0x0,0x83,0x83,0x5e,0x42,0xa8,0xd0,0xaa,0x51,0xc4,0x2a, + 0x9a,0xb4,0x68,0x88,0xa0,0xa0,0x42,0x97,0x5d,0xb9,0x14,0x88,0xdf,0x39,0xc8,0x42, + 0x4e,0xde,0xb7,0x51,0x35,0x6d,0xa2,0x5f,0x66,0xbd,0x5d,0x2a,0x34,0xb5,0x75,0xa8, + 0xe2,0xc,0x89,0xe,0x84,0xd9,0x47,0x85,0x3a,0x93,0x41,0xc5,0x61,0x90,0xd1,0xe4, + 0xb4,0x7,0xf,0xc,0x8e,0x3e,0xcb,0x82,0x36,0xe4,0x35,0x2d,0x8f,0xe7,0xc8,0x72, + 0x57,0xa0,0x82,0xb,0x2e,0xdc,0x15,0xfa,0x5f,0xfe,0x63,0xff,0xf1,0xc7,0x6f,0xff, + 0xeb,0x7f,0xfb,0x9e,0x84,0x47,0xa,0x44,0xea,0x15,0xc6,0x86,0x3f,0xdc,0x94,0x44, + 0xc5,0x18,0x44,0x1a,0x32,0x68,0x5b,0xcd,0x8f,0xbd,0xca,0x8e,0x5d,0x8c,0x26,0x27, + 0x38,0x26,0x8,0x7e,0x78,0xbb,0x34,0xa8,0xc2,0xab,0x34,0xf4,0x8,0x26,0xb,0x8a, + 0x16,0xc0,0x5d,0x56,0x33,0x47,0xee,0xea,0xda,0x88,0x0,0x9a,0x2f,0x75,0x8a,0x42, + 0xdc,0xf5,0xcc,0x75,0xf2,0xae,0x2f,0xeb,0xdd,0x99,0xae,0xb7,0x5e,0xf,0x5c,0x0, + 0xc8,0xfe,0xac,0x10,0x52,0xa8,0x7d,0x2c,0xd1,0xaa,0x83,0x7b,0xbf,0x6a,0x45,0x41, + 0x6e,0xd3,0x24,0x1b,0x7,0x7c,0x84,0x9c,0x4a,0xcd,0x94,0x5c,0xfe,0xd8,0x94,0x1a, + 0xa5,0x37,0x6b,0xbe,0x2b,0xf4,0x6b,0x57,0x94,0xc3,0xb4,0xc,0xa4,0xaf,0xac,0x2e, + 0x87,0x1b,0x31,0xba,0xbc,0x62,0x52,0xf1,0x90,0xb0,0xac,0x6f,0x6e,0xc2,0x3c,0xdd, + 0xf7,0x48,0x84,0xa8,0x55,0x15,0xbc,0x17,0xad,0xa8,0x4,0x30,0x90,0xe3,0x62,0xbc, + 0x4c,0xd4,0x25,0x19,0xe8,0x23,0x88,0xde,0x32,0x4c,0xd,0xf,0xd6,0x8b,0x43,0x22, + 0x41,0xb7,0x10,0x50,0x29,0x36,0x34,0x69,0x9f,0xd5,0x1c,0x4,0x1b,0xdd,0xbf,0x9d, + 0xc6,0xe5,0x41,0x37,0xd1,0x41,0xca,0xe9,0xa1,0xdd,0x5c,0x26,0xfa,0x15,0x25,0x2b, + 0xe,0xa8,0x27,0xea,0x5,0xff,0x64,0x52,0x9a,0x4,0x5e,0x20,0x9b,0xac,0xa6,0xaf, + 0x7d,0x75,0x7a,0xf8,0xb4,0x47,0x31,0xaa,0x36,0x60,0xc6,0xc2,0xb2,0xae,0x1b,0x25, + 0xa2,0xa7,0x36,0xc4,0x84,0xaf,0x61,0x1c,0x95,0x9d,0xdd,0x75,0x7a,0xc5,0x72,0x21, + 0x95,0xbf,0x18,0xd2,0x8f,0xaa,0x28,0x6,0x34,0x27,0x2c,0xaa,0xe4,0x5f,0xa8,0xee, + 0x2c,0x85,0x2d,0x33,0xee,0x80,0xc9,0x23,0x7d,0x65,0x95,0x97,0x25,0x12,0xab,0x47, + 0xa5,0x4e,0x38,0xc3,0xcc,0xf2,0x94,0x11,0x11,0xe1,0x2,0x4,0xf4,0xcc,0xcd,0xe, + 0x9b,0xde,0x6e,0xc0,0x88,0x7e,0xfb,0x75,0xb4,0x9,0x47,0x53,0x38,0x43,0xe7,0xcb, + 0x9b,0xcc,0x6d,0x8d,0x90,0x3b,0x6,0x7e,0xac,0xb9,0xcf,0x81,0x36,0x27,0x4c,0x13, + 0xda,0x48,0x5d,0x5f,0x4c,0x86,0x9d,0xeb,0x80,0xa3,0x54,0x3b,0xbf,0xfd,0xfb,0xff, + 0xf6,0x7d,0x3b,0x0,0x51,0x34,0xf0,0xd1,0x48,0x5e,0x8d,0xf9,0x2f,0x9e,0xf3,0x98, + 0x34,0xc0,0x55,0xad,0x49,0x36,0x97,0xba,0xde,0x2d,0xe2,0xa2,0x4,0x32,0xe,0x6d, + 0x10,0x17,0xdc,0x40,0x53,0xd2,0x1a,0x10,0xf9,0xad,0x50,0x85,0x6c,0x25,0xc4,0x81, + 0x2b,0xec,0x60,0x25,0x48,0x33,0x38,0x23,0x4b,0x59,0xd,0x1,0xbf,0x85,0x6b,0xe4, + 0xa3,0x65,0xcd,0x81,0x21,0x6e,0xd5,0xb9,0x7c,0x7,0xa2,0xda,0x68,0xc5,0xba,0x29, + 0x47,0x5d,0x3,0x34,0x0,0x33,0x2b,0xa3,0x6,0x19,0x74,0x1b,0x43,0xad,0x1c,0x9b, + 0xf0,0x92,0x92,0xae,0x54,0x57,0xdb,0x18,0xc5,0xa1,0xeb,0x3f,0x39,0x82,0x2d,0x5b, + 0x63,0x4d,0xde,0xfc,0x9e,0x20,0xd8,0xf6,0x14,0xd8,0x72,0xcb,0xc5,0xb2,0x79,0x5, + 0xa0,0x3a,0x94,0xef,0xf2,0xbc,0x15,0xf2,0xc5,0x2f,0xa4,0x84,0x87,0xd6,0x1,0x6, + 0x42,0x24,0xb,0x7,0x96,0xa3,0xfc,0xb2,0x5c,0x9b,0x96,0xa4,0x33,0xb2,0x5c,0xb6, + 0xf5,0x51,0xaf,0x94,0x3,0x9f,0xf9,0xe6,0x49,0x71,0x53,0xaf,0x5,0xa7,0xca,0x41, + 0xde,0x73,0xe1,0x0,0x9e,0x63,0x68,0xbf,0x1e,0x90,0xc8,0x64,0x62,0xa3,0x3f,0xf, + 0x14,0x46,0x7,0x45,0x23,0xb1,0xe2,0x94,0xed,0x62,0x6e,0xdf,0xe6,0x7b,0xb3,0x35, + 0x5c,0x27,0x7f,0x85,0xe1,0xfc,0x9d,0x6e,0x65,0x53,0x3b,0x45,0x1f,0xb4,0x80,0xb7, + 0x24,0x14,0xe5,0xb1,0xb5,0x66,0x62,0x66,0x61,0xf3,0x5,0x51,0xd1,0x93,0x16,0x5, + 0x42,0x39,0x33,0x27,0x30,0xfc,0x7d,0xfb,0x7a,0x2f,0xa,0x4b,0x14,0x42,0xd2,0xc9, + 0x83,0x85,0xe5,0x36,0xa2,0x4f,0xef,0x48,0x69,0xf3,0x1b,0xda,0x91,0x59,0x5b,0xeb, + 0x7f,0x42,0xec,0x10,0x61,0x7,0xd,0xac,0x77,0x15,0xb4,0x8b,0xab,0x3b,0x9,0x65, + 0x60,0xc7,0x18,0xe4,0x69,0x36,0x9b,0x55,0x88,0x8c,0x56,0x49,0x10,0x69,0x51,0xb9, + 0x33,0xd6,0x7d,0xe3,0xb8,0xe,0x48,0xb4,0x3e,0x28,0x62,0x5d,0xa8,0x78,0x7e,0x2a, + 0x55,0x39,0xe1,0x8f,0x56,0xb9,0x73,0x41,0x9f,0x29,0x13,0xba,0x48,0x1c,0xa0,0x49, + 0xe1,0x9a,0xf6,0x79,0x64,0xb6,0xb4,0x31,0xbe,0xbb,0x12,0xfc,0xfc,0xfa,0xb7,0x5f, + 0xfd,0xa9,0x9f,0xf8,0xf8,0xfb,0xbf,0xff,0x6f,0xde,0xff,0xca,0x9f,0xf8,0x89,0x8f, + 0xbf,0xff,0xaf,0xfe,0xcd,0x3b,0x52,0x53,0x5e,0x51,0x3b,0x15,0x78,0x99,0xb8,0xd, + 0x8,0x32,0x5a,0x8c,0x6c,0x35,0xdb,0x59,0x25,0x5b,0x11,0x12,0xe0,0x2f,0x9f,0xb0, + 0x49,0xd9,0xc4,0x81,0xa9,0x6e,0x7e,0xc7,0x39,0x4e,0xf9,0x20,0x35,0xea,0x7,0x8f, + 0xcb,0xd,0x29,0x56,0x8b,0x3f,0xc6,0x50,0x34,0xb0,0x54,0x4c,0x3e,0xb5,0x3,0xbb, + 0x6c,0x13,0x63,0x3c,0x43,0xd1,0x74,0xbf,0xdd,0xee,0x77,0x40,0xa3,0x98,0x9,0x9, + 0x6c,0x36,0x57,0xd7,0x1e,0xc9,0x18,0x6a,0x13,0xb6,0xb4,0x29,0x97,0xc,0xe3,0x73, + 0x1a,0x20,0x71,0xe6,0xac,0xe0,0xd8,0x7f,0x3e,0x90,0x31,0x17,0x44,0xcf,0x20,0x48, + 0x4d,0x6f,0xee,0xa3,0x38,0x5e,0xe5,0xd0,0xd1,0x31,0x60,0xf0,0x84,0x98,0x2a,0xc9, + 0x57,0x55,0x4e,0x24,0x5c,0x38,0x78,0x48,0x80,0x87,0xa2,0xca,0xcf,0x49,0x4c,0x3c, + 0xaf,0x61,0xd4,0xb4,0xd9,0xd8,0x56,0x8e,0xc6,0x1d,0x94,0xab,0x70,0x9e,0x2a,0xd1, + 0xbf,0xcb,0x61,0x9,0xa4,0x44,0x76,0xf8,0x6c,0x38,0xea,0xda,0x7f,0x27,0xd1,0xf9, + 0x1f,0xa3,0xdb,0xd8,0x64,0x3b,0x3a,0xd,0x55,0x6b,0x71,0x37,0x31,0xb0,0x34,0x28, + 0xa6,0x77,0x83,0xc5,0x8f,0x18,0x5,0x5c,0xd2,0xdd,0xec,0x6b,0x8,0x21,0xf4,0x63, + 0x50,0x12,0x7c,0x9,0x3c,0x33,0x6b,0x6d,0x72,0x65,0xf3,0x57,0x9a,0xcc,0x79,0xc4, + 0xc6,0x7e,0x10,0xc8,0xa4,0x85,0x59,0xd0,0xaa,0xf3,0xa8,0x78,0x8e,0xac,0x67,0xb9, + 0x25,0x71,0xa9,0x6,0x56,0xcc,0xe2,0xad,0xea,0xfa,0xa,0x96,0x30,0x77,0x9d,0x91, + 0x48,0xd6,0xc8,0x28,0xb3,0x6d,0xa2,0xfe,0x46,0x26,0x5f,0x15,0x7d,0x16,0xdc,0x46, + 0xc7,0x24,0xeb,0x60,0x48,0x70,0xea,0x3,0x4d,0x12,0x49,0x23,0x56,0x14,0xec,0x81, + 0xeb,0x4f,0xe8,0xa3,0x36,0x27,0xf,0x9c,0x4c,0x10,0x9c,0xf0,0xe0,0x84,0x4b,0x98, + 0x2e,0x37,0x1b,0xca,0xed,0x55,0xd,0x2b,0x17,0x21,0x96,0xb9,0x41,0xe1,0xba,0x4d, + 0x1a,0x10,0xac,0x6a,0xb7,0x3c,0xd,0x27,0xea,0xbe,0x49,0x73,0x3d,0x9,0x11,0x43, + 0x7b,0xe8,0xbf,0xfa,0xc7,0x7f,0xe2,0x43,0xd5,0xbd,0xda,0x7b,0xb1,0x1d,0xa1,0x88, + 0x20,0xfc,0x1,0x83,0x63,0xd1,0xb6,0x94,0xd4,0xc3,0x6c,0x5,0x18,0x6,0x7a,0xa2, + 0x7d,0x62,0xd4,0x50,0x69,0xe1,0x58,0x19,0x70,0x72,0x77,0x4b,0x8,0x3c,0xdc,0x9b, + 0x7a,0x85,0x56,0xbd,0x2c,0xaf,0x98,0x59,0x1e,0x85,0xe8,0x39,0x10,0x8e,0xd8,0xe1, + 0xc5,0x48,0x15,0xad,0xb5,0x54,0x3,0x77,0xb2,0x50,0xb3,0x81,0xfa,0x8c,0xfc,0xd8, + 0x5a,0xbd,0xfa,0xf4,0x78,0x27,0x98,0x55,0x35,0x59,0xb2,0x1a,0xee,0x5b,0x1d,0xaa, + 0x24,0xc,0xa0,0x24,0x6a,0xca,0xc0,0x7c,0xa6,0x3d,0xd0,0x8c,0x1e,0x4f,0x22,0x40, + 0xc,0x55,0x33,0xa4,0x37,0xc4,0xd1,0xbf,0x61,0xba,0x74,0x44,0x8b,0x0,0xad,0xc2, + 0x6a,0xba,0xdc,0xa7,0x2a,0x59,0x91,0x4,0x8a,0x5b,0x9f,0xf4,0xa1,0xd3,0xcf,0x7d, + 0x22,0xad,0xed,0x44,0xcd,0x7f,0x83,0x31,0xf4,0x35,0x21,0xb6,0x9e,0xff,0x46,0xc3, + 0x9a,0xd9,0x95,0xa2,0x40,0x91,0x3c,0x51,0xa,0xa9,0x49,0x49,0x68,0xb5,0x63,0x6, + 0x3f,0x87,0xc9,0x52,0x89,0xed,0x7c,0x43,0xb4,0x1f,0x21,0x9f,0x5b,0xc3,0x2c,0xfc, + 0x3d,0xd,0x74,0x17,0x7d,0x8c,0x24,0x9,0x47,0x25,0x23,0xbf,0xbf,0x7d,0xde,0xa5, + 0x62,0xe8,0xae,0x2a,0xed,0x86,0xd1,0xb4,0x1a,0xd0,0xd7,0xa0,0x9c,0x6f,0xbf,0xf9, + 0xa3,0xff,0xef,0xfd,0x37,0x7f,0xf4,0xff,0xbe,0x77,0x16,0xfd,0x44,0x7e,0x8e,0x69, + 0x17,0xc,0xb8,0x3c,0x30,0xb6,0xc4,0xac,0xac,0xbd,0x2a,0xc,0x63,0xbe,0xd0,0x70, + 0x8b,0xa8,0x57,0xb7,0xdc,0x7a,0xc3,0x4c,0x61,0xf3,0xa,0xa5,0xd0,0x58,0xda,0x14, + 0x92,0xc2,0xa6,0xe1,0xcb,0xf0,0x10,0xd9,0xe5,0x1,0x4d,0x34,0x23,0x3c,0x82,0xf5, + 0xcf,0xc2,0xa1,0xcc,0xc7,0x35,0x14,0x96,0x63,0x9b,0x55,0x1c,0x9c,0xec,0x6d,0xce, + 0x1b,0xe6,0xa1,0x37,0xc0,0x47,0xac,0x6f,0x78,0xb9,0x96,0x90,0x3,0xe5,0x50,0x7, + 0xcb,0x47,0x3f,0xd2,0x80,0x3c,0x6d,0x45,0xa5,0x6a,0x57,0xe1,0x62,0xd3,0x82,0x9c, + 0x24,0x26,0x59,0x2e,0x27,0x1b,0xd5,0x3f,0x92,0x33,0xe0,0x29,0x14,0xae,0xaf,0x1e, + 0x7a,0x56,0x92,0xfc,0xec,0xbd,0xa5,0xcc,0x24,0x70,0xd4,0xf9,0x82,0x8b,0xde,0x60, + 0x83,0x4b,0xbc,0xaa,0x8d,0x70,0x18,0xec,0xd,0xf7,0x8e,0x6f,0xe5,0x60,0x53,0xee, + 0x1c,0xb4,0xa5,0x5f,0x14,0x89,0x51,0x2a,0x38,0x86,0x31,0xf,0xc5,0x37,0x8d,0xfc, + 0x24,0x17,0x15,0x7a,0x1f,0x9f,0x4a,0x8c,0xa,0x42,0xdb,0x63,0xe1,0x4b,0xa6,0x9e, + 0x82,0xd4,0xce,0xa9,0x51,0xcf,0x94,0xdd,0xeb,0xae,0xe4,0x93,0x44,0x20,0xd5,0xb, + 0x5a,0xd0,0x37,0xeb,0xad,0x3e,0x6c,0x79,0x3a,0x9a,0x55,0x3a,0x7,0x6c,0xe3,0x7c, + 0x41,0x96,0xb5,0xb1,0xb0,0x9c,0x3a,0x85,0x79,0x67,0x97,0xce,0x29,0x7,0xea,0xd3, + 0xc6,0xfc,0x9e,0xf1,0x3f,0x6c,0x72,0xa3,0xcb,0x89,0x47,0x1,0x41,0xb9,0x83,0x92, + 0x30,0xd0,0xa4,0x9e,0x73,0x13,0xd3,0xbc,0x1a,0x36,0x13,0x2e,0xef,0x60,0x5b,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x3e,0x55,0x2a,0x61,0x92,0x11,0x6d,0x4,0xea, + 0xb9,0x9f,0xe6,0xa1,0xcd,0x86,0x64,0x90,0xb4,0x0,0x65,0xc6,0x3a,0xc6,0x58,0xaf, + 0xc6,0xf,0x51,0xf2,0xdd,0x20,0x39,0xe1,0x2d,0x8f,0x98,0x1e,0x48,0x16,0x1d,0xe, + 0xf3,0xcd,0x34,0xb4,0x28,0x3,0x1,0x84,0x18,0x59,0xcd,0xde,0x8d,0x39,0x17,0x1f, + 0xee,0x77,0x56,0x98,0xd5,0xa4,0x44,0x79,0xdb,0x56,0xd3,0xa7,0xb5,0x5d,0x79,0xfb, + 0x92,0x89,0x2,0xe1,0x44,0x5c,0xfb,0x6c,0xef,0xa,0x92,0x7b,0x54,0x18,0xba,0xe6, + 0x75,0x32,0x88,0x6c,0x6e,0x75,0x19,0x85,0x17,0x32,0xfd,0x59,0x5e,0x51,0x31,0xd6, + 0xbb,0x11,0xe7,0x20,0x92,0xb3,0xaa,0xf4,0x28,0xa3,0x87,0x74,0x39,0xba,0xbd,0xfd, + 0x28,0xc4,0x4d,0x91,0x4f,0xb7,0x51,0xd6,0xed,0x33,0xe0,0x6b,0x2,0x62,0x70,0x7, + 0x18,0x19,0xb,0x52,0x89,0x51,0x60,0x69,0x96,0x1b,0xd9,0xf7,0x2b,0xa,0x45,0x2f, + 0x9c,0xc6,0xb1,0x2,0x7,0x98,0xd4,0x4b,0x70,0xa2,0x42,0x4d,0x44,0xa,0x1c,0x8, + 0x6,0xa7,0xfe,0xc9,0x89,0xe8,0x10,0x96,0x8e,0x2d,0xc3,0x1f,0x88,0x13,0xa3,0xd3, + 0x1a,0x6,0x41,0x14,0x77,0x28,0x32,0x45,0xaa,0xab,0x43,0xbd,0x47,0x56,0x44,0x83, + 0xbc,0xe,0x54,0xeb,0xaa,0x81,0xd0,0x27,0x87,0x6d,0x54,0x41,0xe4,0xe1,0xbb,0x5a, + 0x9f,0xeb,0x9a,0x7b,0x8f,0x6c,0xb1,0x21,0x46,0xcf,0x6a,0xa8,0x24,0xae,0x60,0xda, + 0x8f,0x4d,0x78,0x27,0xfe,0xd1,0x7b,0xe6,0x13,0x4,0x8a,0x56,0xcd,0x96,0xbb,0x8a, + 0x69,0x5f,0x78,0xfa,0xee,0x80,0x40,0x75,0xc,0xc5,0x12,0x33,0x8a,0x54,0xad,0x90, + 0xcb,0x64,0x9e,0x6d,0x13,0xbc,0x18,0xe,0x52,0xf0,0xb1,0xa3,0xd9,0xc6,0x55,0xcd, + 0x6e,0x82,0xf1,0xce,0xec,0xf3,0x62,0xc1,0xaa,0x5e,0x9c,0xdd,0x2d,0x1c,0xe,0x4, + 0x1d,0x30,0x3e,0x43,0xa1,0x71,0x36,0x98,0x7a,0xcf,0xc4,0x23,0xec,0x38,0xbd,0xba, + 0x70,0xe3,0x46,0xd8,0xa1,0xe,0x23,0x7b,0xf6,0x9e,0xa9,0xda,0x7e,0xa2,0xb5,0xf4, + 0xd9,0x89,0x96,0x46,0x50,0xe3,0xe0,0xb4,0x26,0xaa,0x78,0x25,0xd3,0x1f,0x57,0xef, + 0x67,0xba,0x12,0x5f,0x67,0x1d,0x73,0x3a,0x1,0xa0,0x95,0x53,0x10,0xe9,0xac,0x1a, + 0xf4,0x60,0xed,0xbd,0xd7,0x59,0x3f,0xc2,0x99,0xfa,0x15,0xc6,0x92,0xc1,0xd6,0x6f, + 0x2e,0x71,0xee,0x92,0xcd,0xe4,0x83,0xc4,0x5a,0xa6,0xa2,0x64,0xe3,0xe4,0x8e,0x2b, + 0xac,0x41,0x3c,0xdf,0x41,0x4d,0x68,0x67,0x1b,0x5d,0x23,0x39,0x63,0x7,0x3a,0x1b, + 0xf7,0x32,0x22,0xb1,0x8c,0x67,0x4d,0x7d,0xef,0x35,0x6,0x5b,0x81,0x18,0x96,0xfb, + 0x2d,0xac,0x3d,0x41,0x11,0xf8,0x61,0x90,0x1,0x1d,0x79,0xb4,0xd8,0x75,0x8b,0x84, + 0xb9,0xd6,0xcd,0x83,0x16,0xc1,0x92,0x51,0xc6,0xe8,0xac,0x9f,0x7d,0xd8,0x62,0x69, + 0x8a,0x58,0x30,0xd,0x79,0x1b,0xc3,0xce,0xe1,0x76,0x2b,0x3a,0xa3,0x2d,0x57,0xcf, + 0xd8,0x1a,0x6b,0x8,0x8a,0x59,0xe4,0x88,0x53,0x4f,0xf3,0xbe,0xfc,0x72,0xd1,0x65, + 0xe4,0x9d,0x9d,0x89,0x37,0xfc,0x3b,0x30,0x16,0x85,0x47,0x2b,0x52,0xf5,0x8c,0xe6, + 0x94,0xb1,0xd7,0xec,0xcb,0xbe,0x76,0xda,0x55,0x2a,0xf4,0xd2,0xc4,0x42,0xc2,0x19, + 0xad,0x30,0xa8,0x2e,0x65,0x11,0x79,0x12,0x55,0x57,0x21,0x82,0x14,0x1,0x88,0xd1, + 0x27,0x2b,0x8,0x93,0x1,0xcb,0x74,0x90,0x60,0x13,0xf4,0xa0,0x8d,0xd4,0x49,0x5, + 0x45,0x9d,0x4f,0xe5,0x62,0xb9,0xbb,0x93,0x1a,0x5a,0x16,0x3a,0xb,0x79,0xdc,0xd0, + 0x5d,0x85,0x1f,0x3a,0x75,0xfe,0x37,0xe6,0x7c,0x65,0x12,0x87,0x91,0xcc,0x70,0x1a, + 0x39,0x14,0x3d,0x67,0x17,0x1a,0xe1,0x46,0x81,0x88,0x30,0x6d,0xa1,0x5,0xb9,0x76, + 0xa8,0x86,0x67,0x1a,0x2b,0xc9,0xa1,0x5a,0x9,0x8a,0x4d,0xc9,0xfa,0x8e,0xe,0xe2, + 0xb9,0x38,0x88,0xf4,0xee,0x9a,0xa,0x5b,0x27,0x11,0xba,0x9b,0x76,0x26,0xb9,0xc3, + 0x7c,0x9,0xd0,0xd,0x92,0x4e,0xaa,0x77,0xe8,0xcc,0x21,0x41,0x6b,0x6d,0x4c,0xa9, + 0x7,0x56,0x6d,0xf3,0x98,0xa5,0x45,0x5b,0xa7,0xb3,0x20,0x6,0x9a,0x3c,0x6,0x6b, + 0x16,0xce,0x40,0x73,0x91,0x13,0xbe,0x83,0x28,0x51,0x3a,0x28,0xd5,0x4d,0x67,0xdc, + 0x23,0xa,0x65,0xaa,0x62,0x5a,0x11,0x9a,0x8b,0xd8,0x17,0xdf,0xa0,0x4b,0xa4,0x6c, + 0xe3,0x9c,0xd5,0x56,0x64,0x8e,0x47,0xd1,0x46,0x49,0xd7,0x3c,0xf0,0x1a,0xed,0xdc, + 0x1a,0xe3,0x4b,0xf0,0x85,0x15,0xd6,0xab,0xdc,0xd5,0xbd,0x7c,0x7e,0xf7,0x4f,0xd8, + 0xeb,0x7d,0x35,0x1b,0xa9,0xcf,0x83,0x36,0xee,0xd7,0xc4,0xba,0xd4,0x3c,0x27,0x41, + 0xbe,0xd2,0x56,0x75,0xe,0x8b,0x71,0x3f,0x31,0x66,0x30,0x76,0x32,0x6c,0xb5,0x29, + 0x62,0x17,0x5f,0xb1,0x16,0x2d,0xd9,0x85,0x99,0xaa,0x8b,0x56,0x1a,0x1e,0x72,0x7, + 0xc2,0x55,0x99,0xaa,0x1e,0x82,0x55,0xb7,0xbd,0x8,0xa1,0x4c,0x5c,0x28,0x6f,0x9, + 0x83,0xa3,0x61,0x6a,0x1a,0x18,0xa9,0xf3,0xb3,0x8e,0x45,0xd3,0xe0,0xa1,0x37,0x10, + 0x65,0x31,0xb5,0xd3,0xcb,0x8e,0xfa,0xa6,0x42,0x89,0xaa,0xcb,0xfd,0x1e,0xb2,0x2f, + 0x8f,0x42,0x33,0xb7,0xb9,0x6,0x69,0x9f,0xde,0x5b,0x8a,0x4c,0xa2,0x33,0x15,0x85, + 0xdd,0x3d,0x31,0x35,0x5b,0xcb,0xee,0x40,0xfb,0xaf,0x63,0x91,0xde,0x24,0xaa,0xa0, + 0x2a,0x1e,0xa,0x1,0x89,0xa6,0xfc,0xd8,0x4b,0x10,0xb6,0x8,0xc,0xdb,0xda,0x9e, + 0xd5,0xa0,0x54,0xc2,0xdc,0x9a,0xe4,0xd6,0x97,0x2d,0x81,0x7f,0x90,0x69,0x99,0x88, + 0x98,0x4,0x8d,0xd2,0xad,0x3e,0x21,0xc4,0x25,0x2c,0x28,0x96,0xe8,0xee,0xe5,0x5e, + 0xa0,0xfb,0x7c,0x2d,0x75,0xf6,0xbe,0x5c,0x6f,0x9e,0xd0,0xa9,0x1c,0x84,0x9a,0xde, + 0x43,0x9a,0xa3,0xa9,0x0,0x6e,0x5b,0xd0,0xe4,0x29,0xc,0x3d,0xf3,0x56,0xa9,0xb9, + 0x97,0xdc,0x34,0xf3,0x5d,0x82,0x4c,0x60,0x79,0x77,0x47,0xe5,0x75,0x75,0xf4,0xa4, + 0x79,0x8,0x20,0x60,0xb6,0xab,0xc3,0xc2,0x7a,0xed,0x3c,0xa1,0x28,0x98,0xaa,0xc4, + 0x94,0xff,0x71,0x55,0x32,0xd7,0xb3,0x77,0x6,0x6b,0x61,0x4f,0x7f,0x30,0x5b,0xcb, + 0xca,0x3,0xb1,0x56,0xf3,0xfd,0xfa,0x1b,0x1,0x59,0x28,0x2,0xf6,0x75,0x67,0xb5, + 0xc7,0x8,0xc6,0xd6,0x65,0x2a,0x17,0x42,0x51,0x1c,0xb7,0xad,0x46,0xe9,0xd,0x33, + 0x7b,0xbb,0xad,0xf5,0xd6,0x47,0xf4,0x8c,0xe0,0x39,0xea,0x79,0x23,0xd8,0xd7,0xca, + 0x8a,0x46,0x64,0xb3,0x10,0xb6,0x3f,0x7c,0x9f,0x8b,0xf8,0x8d,0xc5,0x4,0x61,0x58, + 0x3f,0x63,0xb4,0x18,0xb4,0xe0,0x97,0xfc,0x6b,0xec,0x2b,0x42,0x2c,0x2a,0x49,0x4f, + 0xa2,0x4c,0xf7,0xa0,0xcf,0x31,0xaf,0xdd,0x3b,0xcc,0x44,0x43,0x84,0x5b,0xb4,0x4f, + 0x31,0x55,0x62,0xd0,0x16,0x89,0xf0,0x5d,0x5c,0xfb,0x3,0x3e,0x8d,0x21,0x95,0xf2, + 0x0,0x29,0x78,0xd5,0x59,0x83,0x97,0xf7,0x40,0xbe,0x63,0x55,0xe3,0x41,0x0,0x75, + 0x14,0xff,0xd2,0x18,0xd0,0x49,0x62,0x3,0xd9,0x2f,0x39,0x2d,0xed,0xd8,0xef,0xdc, + 0x8e,0x2f,0xe,0x2b,0xd6,0x1e,0xc1,0xcb,0xe0,0x31,0x73,0x16,0x6b,0xbe,0xa2,0x3a, + 0xd1,0x24,0xd3,0x3d,0x70,0x72,0xd3,0xb6,0xdf,0xfc,0x8a,0x68,0x39,0x21,0xc8,0x39, + 0x81,0x31,0x81,0xc6,0xac,0x98,0xf0,0x38,0x78,0x35,0xc8,0x6d,0x78,0xd3,0xbe,0xc0, + 0xc6,0xf8,0x4b,0x5c,0xac,0xe0,0x7d,0x19,0x73,0xbc,0xf1,0xea,0x5a,0x33,0xcc,0xc6, + 0xe4,0x92,0x8a,0x74,0x67,0xfd,0xb4,0x43,0xd7,0xe,0x62,0xb1,0x46,0xdd,0x45,0x9b, + 0xbe,0x9e,0x16,0x5c,0x19,0xbd,0xc,0x6,0x92,0x10,0xc4,0xe1,0x26,0x38,0x82,0x71, + 0xa1,0xba,0x9f,0xb0,0x4b,0x40,0x96,0xbb,0x5f,0x5d,0xfe,0x81,0x3a,0xc7,0xdd,0x24, + 0x52,0x87,0x76,0x6d,0xf6,0x64,0x18,0xfa,0xcf,0x59,0xd1,0x30,0xc9,0x4f,0xd0,0xbc, + 0x9a,0x23,0x58,0xb0,0x9c,0x69,0x3f,0x3d,0xab,0x27,0x77,0xd5,0x9e,0x2c,0xd9,0xaf, + 0x97,0xec,0xfe,0x93,0x56,0xb,0x93,0xec,0xa7,0x9,0x1d,0xd8,0x7a,0x28,0x9f,0xb5, + 0x5e,0x9f,0x7f,0x99,0xf6,0x96,0xe9,0x70,0x21,0x7e,0x8d,0xf8,0xbd,0x6f,0x6b,0x5e, + 0xbd,0xe6,0x9c,0x92,0xa8,0x32,0x1,0x94,0x85,0x26,0xf4,0xfb,0x5d,0x22,0xaa,0xc2, + 0xe5,0xd,0xaf,0xba,0x14,0xca,0x86,0xa7,0x99,0xdf,0xe8,0xeb,0x50,0x3d,0x29,0x58, + 0x2e,0x86,0x41,0x90,0x82,0x59,0xfb,0xd2,0x5f,0xd7,0xec,0x72,0x45,0x86,0xf7,0x66, + 0xdf,0x82,0xbd,0xa5,0xc4,0x84,0xe7,0xe,0x20,0x2e,0xa3,0xc2,0x59,0x5a,0xd5,0x6, + 0xd4,0x28,0x9b,0xde,0xef,0x29,0x6,0x32,0xac,0x5,0x58,0x3a,0x7f,0x9,0x8c,0xd9, + 0xe6,0x9a,0xcb,0x94,0x1c,0xa0,0xb0,0xea,0x3a,0xd4,0xff,0x1c,0xf3,0x68,0x4c,0xad, + 0x76,0xbf,0xf3,0xba,0x1b,0x1,0x18,0x7,0x74,0xb2,0xf0,0x8d,0xb1,0xad,0x93,0x69, + 0x8c,0x26,0xbd,0x4f,0xa2,0x70,0x19,0x6a,0xf4,0x75,0xc9,0x57,0xe7,0xff,0x44,0x4b, + 0xc,0x13,0x11,0xc1,0x7e,0x1f,0x7,0x72,0x48,0x85,0x1f,0x7b,0xd,0x4,0xce,0xd6, + 0x2c,0xad,0xa3,0x3d,0xe3,0x2,0x1d,0x7,0xe7,0xb8,0xd6,0x24,0x57,0x2e,0x8,0x9a, + 0xec,0x6a,0x83,0xc,0x28,0xec,0x93,0xe9,0xfd,0x4b,0xdc,0x9,0x33,0x19,0xc6,0x44, + 0x6f,0xa2,0x47,0xcd,0xcd,0xad,0xd8,0x49,0x9d,0xaa,0x19,0x9d,0xf8,0x77,0x30,0x7e, + 0x51,0x23,0xbb,0x85,0x25,0xe9,0x8a,0x95,0x64,0x8b,0x13,0x3b,0x39,0x7b,0xe2,0x5a, + 0x4a,0x4a,0x63,0x44,0xc7,0xa9,0xfb,0x6,0x94,0x49,0xb3,0x9d,0xa0,0x2f,0x25,0x43, + 0xd4,0xa3,0xe5,0xde,0x9d,0xba,0x42,0x6b,0xa1,0x29,0xfc,0x22,0x82,0xe5,0x2a,0x74, + 0xaf,0xe7,0x50,0x42,0x64,0x7c,0xd9,0x37,0x62,0x48,0xc,0xe,0xdf,0x85,0xd0,0x7d, + 0x4e,0xd3,0x2,0xe,0x1,0x4b,0xf5,0xc6,0x1d,0xc7,0x6e,0xac,0x8b,0x54,0xd8,0x52, + 0x7b,0x52,0x68,0xf0,0x5a,0x5a,0xdd,0x65,0xa4,0x3d,0x36,0x76,0xf0,0x10,0x48,0xd, + 0x4a,0xee,0x4a,0x7c,0x4f,0xcf,0x9,0x74,0xc,0xbf,0xaf,0xb1,0xc9,0x12,0x14,0x36, + 0xd,0xa2,0x35,0x9b,0x2e,0x2e,0xa3,0xc7,0xdd,0x89,0xda,0x26,0x2,0x6d,0xb3,0x1a, + 0xdd,0x6c,0x34,0x62,0x22,0x4d,0xeb,0xff,0x49,0xf4,0x1e,0x92,0xc6,0x13,0x68,0x97, + 0xbe,0x30,0x5,0x3a,0x6a,0x68,0xb,0xcd,0x98,0x86,0x41,0x26,0xd9,0x89,0xd0,0x86, + 0x9b,0xba,0xd3,0xd5,0xde,0x5e,0x14,0x74,0x6,0x6a,0xb0,0xc3,0xf0,0x92,0xc6,0xe0, + 0x43,0x1c,0x8a,0x79,0x86,0xa8,0xb0,0x4f,0x37,0x6f,0x98,0x11,0xcb,0x16,0x78,0xdd, + 0x6b,0xd3,0xf3,0xde,0xd5,0x18,0x81,0x46,0xe,0xc5,0xc1,0x70,0x6,0x3,0x92,0xc4, + 0x51,0x84,0x3,0x67,0x4a,0x48,0xdc,0xa7,0xb9,0x47,0x1c,0xd6,0xab,0x90,0xf5,0x3e, + 0xb1,0x72,0x83,0xf0,0xe6,0x24,0x50,0xe,0xac,0xd2,0x53,0x35,0x77,0xe0,0xcc,0x34, + 0x73,0x22,0xca,0xdc,0x2e,0xc7,0x19,0x66,0xf,0x56,0xf7,0xbf,0x5e,0xd8,0xd6,0x9a, + 0x72,0xe8,0xa1,0x9d,0x2e,0xaa,0xb2,0xc5,0x81,0xfc,0x3a,0xb5,0x4d,0xd8,0x3,0x5b, + 0xd,0x41,0xcb,0xfa,0x74,0xbd,0xdd,0x66,0x4f,0x85,0x9c,0x7,0xbf,0xd0,0x94,0xe4, + 0x2d,0x9,0x1b,0x18,0x70,0x23,0xb7,0x68,0x43,0x88,0xd2,0xbe,0xa2,0xf3,0x1e,0xb6, + 0x40,0x1d,0x85,0x27,0x11,0x4,0x2d,0xd1,0xa8,0x6f,0x6d,0x2a,0x6d,0xb2,0x21,0xda, + 0x33,0xec,0x3d,0xff,0xf1,0xdc,0xe2,0x4e,0xda,0xf9,0xa2,0x74,0xb6,0x73,0x8f,0x11, + 0xbb,0x29,0xed,0xb8,0x64,0x10,0xca,0x6b,0xec,0x98,0x5,0x1a,0x9f,0x6f,0x52,0x3b, + 0x65,0x8a,0xee,0xc9,0x33,0x77,0x26,0xba,0x7,0xf8,0x47,0x35,0x91,0x60,0xe2,0x96, + 0xed,0x77,0x8e,0xce,0x17,0x83,0x73,0xa9,0xdd,0x43,0x30,0xac,0x59,0xd0,0x54,0xc4, + 0xab,0x4f,0x2f,0x4d,0xba,0xc3,0xc1,0xb4,0x4,0x4c,0x19,0xaa,0x13,0xb8,0x2,0x3a, + 0x7a,0x22,0x7f,0x72,0x62,0xd4,0xf5,0x47,0x93,0xa,0xb,0xc0,0x34,0x42,0x46,0xa7, + 0xde,0xa,0xa9,0x82,0xcf,0xcd,0xa4,0x8f,0x93,0x84,0x9d,0x1e,0x51,0xe5,0x63,0x48, + 0x1d,0xa7,0xe1,0x41,0x15,0x9,0xe5,0x95,0xc,0x9a,0x8a,0x1d,0x83,0x9d,0x9b,0xda, + 0xde,0x41,0xc6,0x8b,0xe6,0xfd,0xba,0x2f,0x39,0x93,0xad,0x57,0xc5,0xcd,0x70,0x5f, + 0x84,0xe,0x61,0x81,0xef,0xb1,0x10,0xae,0x8c,0x33,0xb9,0x34,0xfc,0xdc,0x56,0x84, + 0x34,0x61,0x99,0xde,0xf,0xb2,0x8a,0x8c,0xd5,0x82,0xae,0x8d,0x74,0xa4,0x42,0xb7, + 0xe9,0xf,0xd0,0x2,0xa0,0x8f,0x93,0xe0,0x4c,0x60,0x4f,0x91,0x8f,0x66,0xb9,0xd9, + 0x3f,0x82,0x26,0xe0,0xdf,0x95,0xad,0x3c,0x5e,0x42,0x66,0xd5,0x27,0x5b,0xda,0x67, + 0x4c,0x2c,0x62,0xeb,0xe5,0x1d,0xfb,0x2f,0x96,0x6d,0x9d,0x4f,0xa8,0x81,0xd0,0x54, + 0x46,0x3e,0xac,0xc1,0xfe,0x76,0x78,0x1f,0x9a,0x26,0xdc,0x71,0xac,0x70,0x2a,0x3, + 0x47,0xd,0x87,0x69,0xa4,0x8d,0xdd,0x9f,0xc0,0x2a,0xc4,0x94,0xae,0x4d,0x21,0x17, + 0xd5,0xf4,0x4f,0xb1,0x3,0x3d,0x5,0x9,0x63,0xc8,0x1f,0xd7,0x3,0x7d,0x4e,0x99, + 0xa2,0xa5,0x81,0x81,0xef,0xe2,0x15,0xa5,0x4c,0x0,0x88,0x1,0x0,0x86,0xa0,0x6b, + 0x49,0xca,0xfa,0x2e,0x58,0x42,0xa7,0x7,0x17,0x74,0x42,0x45,0x26,0x58,0x9a,0xd0, + 0x13,0x64,0xbe,0x5e,0x21,0x58,0xc2,0x24,0x66,0xab,0x5,0x73,0x1f,0x99,0x6b,0x3a, + 0xe0,0x21,0xc,0x54,0xc0,0x30,0x62,0xb5,0xa3,0x17,0xdb,0xd4,0x86,0x13,0x7e,0x31, + 0xc8,0x5b,0xf6,0xb9,0x73,0x74,0x5b,0x17,0x11,0x58,0xd2,0x9f,0x99,0xfc,0x26,0x86, + 0x68,0x99,0xef,0x86,0xcb,0x68,0x9f,0xc9,0x19,0x55,0x32,0x1d,0x63,0x88,0x1e,0x96, + 0x83,0x46,0xab,0xf4,0x30,0x39,0x31,0x11,0xab,0xb7,0xf7,0x85,0xec,0x47,0xf8,0xb4, + 0x2,0x13,0xad,0x28,0xdc,0x2d,0x45,0x29,0x92,0xef,0xb,0xfa,0xdb,0xbf,0xf7,0x7, + 0xef,0x7f,0xfb,0xf7,0xfe,0xe0,0x1d,0x4d,0xbb,0xc5,0x45,0x5d,0x9,0x37,0xdd,0xd5, + 0xb6,0x27,0x1b,0x5f,0xf1,0x2b,0xa1,0x79,0xdb,0x22,0x17,0x32,0xf4,0xce,0xb8,0x1, + 0x7c,0xb2,0x81,0x1,0xbe,0x23,0xad,0xb7,0xd5,0x24,0x74,0x15,0x6,0x64,0xdc,0x84, + 0xc8,0xbc,0x55,0x29,0x4b,0x39,0xbd,0xc,0xbf,0x71,0x25,0x68,0x6c,0xa4,0x45,0x8c, + 0x44,0x98,0xc2,0x2,0x1c,0x98,0x8,0x74,0x62,0x92,0x90,0x4c,0x10,0xf0,0xdf,0xa4, + 0x82,0x96,0xc6,0x24,0x2c,0xc,0x8,0xdc,0x94,0xc5,0xd,0xca,0x48,0x47,0xf2,0x0, + 0xa6,0x6f,0xbb,0x2f,0xf7,0x6a,0x50,0x3e,0xe3,0xad,0x7f,0xeb,0xf7,0xfe,0xf5,0x7b, + 0x55,0xd5,0x6f,0xfc,0xe9,0x9f,0xfc,0x68,0x99,0xa3,0x1d,0x94,0x93,0x5,0xac,0xf2, + 0x2d,0xbc,0xc7,0xb6,0x8d,0xde,0xae,0x1a,0xf4,0x53,0x87,0x8a,0x2e,0x1b,0xdb,0xec, + 0x3d,0x28,0x76,0xff,0x5e,0xa4,0x16,0xbd,0xb1,0x62,0x67,0xb2,0xcf,0x44,0x1e,0xfb, + 0x12,0x5c,0x99,0xe6,0xf,0x39,0x40,0x87,0xb9,0x5e,0xa6,0xd9,0x25,0xaa,0x59,0xf2, + 0x46,0x70,0x74,0x9f,0xb0,0x6,0x28,0x28,0xe0,0xa4,0x4a,0xb2,0x63,0xc0,0x78,0x49, + 0xc6,0xa,0x82,0xcd,0x53,0x1,0x58,0x91,0xd9,0x2,0xae,0x4b,0xd8,0x21,0xd6,0xa1, + 0x69,0xa3,0x3,0x73,0x33,0x48,0x6d,0x88,0x1b,0x34,0xcd,0x2d,0xff,0x1c,0xfa,0x0, + 0xc5,0x72,0x19,0xd7,0x48,0x22,0x58,0x8e,0xa0,0x21,0xc6,0xc6,0x46,0x5e,0x6d,0xc2, + 0xe2,0xc3,0x18,0x15,0xab,0xe5,0xc5,0xa6,0x42,0x49,0xd5,0x37,0xf,0x33,0x42,0x1e, + 0x12,0xad,0xfd,0x6c,0x91,0x9c,0xae,0x16,0x6c,0x29,0x3c,0x1e,0x88,0x45,0x27,0x1b, + 0x45,0xb3,0xda,0x8,0xe4,0x71,0x82,0xac,0xba,0xad,0x2d,0x17,0xf9,0x4e,0xf7,0x13, + 0xa5,0x90,0x48,0x2c,0x90,0x87,0xa2,0x1e,0x4e,0xc2,0xd3,0x35,0x3d,0xd0,0x41,0x93, + 0x3,0x12,0x94,0xd7,0x46,0x5e,0xa5,0xb6,0xdb,0xd0,0xa9,0xa0,0x76,0xf,0xc8,0xb6, + 0x77,0xd7,0xe7,0x87,0x98,0x8,0x84,0xec,0xfb,0x54,0xf9,0x10,0x4b,0x5b,0x6b,0x67, + 0x2a,0x32,0x69,0x73,0x9f,0x83,0xc5,0x75,0xdc,0x7d,0x72,0x22,0xcf,0x6d,0x2e,0x92, + 0x12,0xc7,0x73,0xdb,0x2b,0xc2,0xb2,0x12,0x28,0xdb,0xaf,0x8f,0xb0,0xd8,0xfa,0x25, + 0xc3,0x8c,0x4e,0x47,0x3c,0x60,0x14,0xc2,0xdd,0xde,0xbc,0x72,0x31,0xaa,0xab,0x55, + 0x77,0xc6,0xec,0xd9,0x3e,0x35,0xb3,0x8a,0x2,0x82,0x51,0x7d,0x27,0x29,0xce,0x9d, + 0x74,0x3a,0x31,0x1d,0x28,0xa7,0xf3,0xc7,0x8,0x47,0xeb,0xdb,0xa9,0x44,0xe5,0xf0, + 0x1d,0x4a,0xcc,0xa8,0x20,0x9d,0xad,0x2c,0xf5,0xaa,0x81,0x6c,0x30,0x8f,0x88,0x4d, + 0x89,0xf1,0x28,0x82,0x30,0x54,0xdc,0x7,0xa,0x47,0x40,0xf8,0x75,0xf6,0x8,0xb7, + 0x54,0x13,0xbd,0x33,0x79,0xb3,0x33,0x7f,0xe3,0x3f,0xf9,0xc9,0x8f,0xbf,0xf9,0x2f, + 0xbe,0x2,0xbb,0xb3,0x36,0x3d,0xeb,0x7e,0x66,0xd3,0x4d,0xa5,0x88,0x5d,0x20,0x5, + 0x2a,0x1b,0x85,0x10,0x57,0x99,0x30,0x41,0x81,0xb3,0x73,0xd4,0x68,0x33,0xb1,0xd0, + 0xe1,0xa1,0xce,0x4,0x14,0x94,0x9c,0xfe,0x6c,0xe0,0x6a,0x6b,0x48,0xa7,0xa7,0x51, + 0x15,0x4b,0xe5,0x8c,0x31,0x8c,0xcf,0xb1,0xba,0x58,0x9,0xa3,0x82,0x44,0x53,0xfc, + 0x82,0x9,0xa0,0x8,0xa1,0xf4,0x64,0x6a,0xa1,0xf7,0x56,0x2a,0x4e,0x34,0xab,0x5a, + 0x58,0x9e,0xd1,0xb6,0x23,0xa6,0x11,0x29,0x34,0xa2,0x88,0x8e,0xc0,0xfa,0x60,0x47, + 0x30,0x75,0xd9,0xa5,0x2e,0x51,0x68,0xf2,0xc4,0xcf,0x28,0x5b,0xe7,0xad,0xc2,0xd8, + 0xf9,0x10,0xd4,0xa2,0x82,0xb8,0xa9,0x48,0x52,0x93,0x57,0x45,0x1f,0x7d,0xcb,0x19, + 0x42,0xd6,0x96,0x10,0x16,0xba,0x6f,0xa0,0x8c,0x8,0x32,0xea,0xbe,0x8a,0xed,0x1, + 0x90,0xfa,0xec,0x6c,0xda,0xec,0x49,0xee,0xf3,0xe0,0xee,0x6,0x20,0x84,0x5f,0x7f, + 0x6a,0xf8,0x69,0xe0,0x72,0xf4,0xcb,0x7d,0x1c,0x86,0x93,0x64,0x8d,0x16,0xd2,0xe4, + 0x74,0x77,0xc8,0xa7,0xa0,0x5,0x3e,0x51,0xe1,0x63,0x87,0x86,0x22,0xaa,0x2,0x1a, + 0xd1,0x84,0x98,0x4c,0xd5,0xc,0xc2,0xa3,0x51,0x92,0x1d,0x68,0x91,0x47,0xe7,0xb3, + 0x61,0x16,0xbd,0x58,0xe2,0x39,0x3a,0x79,0xa0,0xea,0x98,0xf,0xda,0xa,0x51,0x57, + 0x54,0x12,0xe4,0x4a,0x50,0x99,0x28,0xcd,0x24,0x47,0x85,0xd8,0x1f,0x5f,0xa8,0x9d, + 0x12,0x16,0x91,0x64,0xb5,0x1b,0x61,0x7b,0x2a,0x74,0x6d,0x13,0x90,0xae,0x84,0x69, + 0xa2,0x66,0x4a,0x94,0x5,0x6e,0xde,0x4,0xec,0x5c,0xe6,0xa7,0x17,0x4e,0xd0,0x6b, + 0xa0,0x4c,0xaa,0xa2,0xa3,0xdd,0x14,0x12,0x6d,0xe6,0xd8,0x17,0xaa,0x86,0xfe,0xe4, + 0xc,0xcd,0x4d,0x55,0xe4,0x8,0x53,0x17,0x86,0x5e,0x61,0xe6,0x77,0x68,0x3d,0xbf, + 0x3e,0xea,0x16,0x96,0x82,0x93,0xee,0x6f,0x25,0x85,0x3f,0xa1,0xc9,0xea,0xf3,0xb4, + 0x4d,0x2,0x53,0x25,0x3e,0x67,0xef,0xf3,0xa1,0xd1,0xd6,0xe6,0xd3,0x4d,0x93,0xd7, + 0x74,0xcb,0x6b,0x8d,0x87,0x99,0x2d,0x5f,0x88,0xcf,0xa8,0xf4,0xaa,0x8e,0xb0,0x21, + 0xc,0x14,0x40,0x1f,0xf5,0x6a,0xaa,0x58,0x88,0xea,0x8b,0x9e,0xc8,0xb0,0x37,0xfa, + 0xeb,0xaf,0xfd,0x99,0x9f,0xfa,0xf8,0x1b,0xff,0xfc,0xf,0xde,0x33,0x63,0x6e,0x12, + 0x95,0x8,0x2,0xa4,0x5d,0x27,0x3a,0x74,0x68,0xb3,0x9d,0x7,0x16,0xaa,0x6d,0xa2, + 0xb9,0x4c,0x1,0xdd,0x8c,0x4,0x9,0x1b,0x46,0x2f,0xac,0x12,0xb6,0x43,0xb0,0x68, + 0x85,0x88,0x62,0x88,0xcf,0xa4,0xdd,0x1f,0xf0,0xa2,0x1e,0xc,0xd9,0x91,0xde,0x1, + 0xe3,0xf2,0xa0,0x34,0xc2,0xeb,0xbe,0x19,0xd9,0x12,0xe9,0x40,0x86,0xae,0x9e,0x88, + 0x6a,0x32,0xfc,0x4,0x36,0xfd,0xae,0x9d,0xa0,0xa2,0x21,0x4f,0xbd,0xe5,0xa5,0x3d, + 0x3e,0x9,0xdc,0x10,0x83,0x96,0x6c,0xc7,0x0,0x2d,0x75,0xde,0x76,0xa3,0x1c,0x12, + 0xff,0xa4,0x32,0xee,0x60,0xf2,0x95,0x20,0xea,0x8c,0xf0,0xcc,0x80,0x46,0xf4,0x41, + 0x9f,0x40,0x82,0x50,0x33,0x34,0xa2,0xed,0xad,0x4a,0x86,0xb0,0xe6,0xec,0xe2,0x20, + 0x82,0x62,0x50,0x66,0x86,0xdb,0xe3,0x63,0x53,0xc6,0x83,0xc8,0x37,0xe7,0x1d,0x58, + 0x53,0x35,0xe8,0x30,0xf0,0x34,0xfb,0xee,0x3e,0x4,0xe9,0x1f,0x31,0x19,0xa7,0x40, + 0xfa,0xc0,0x88,0x33,0xc1,0x3b,0x20,0x4a,0x83,0x80,0xb4,0xba,0x58,0x2e,0xfc,0xc2, + 0x4c,0x56,0x25,0xe1,0x47,0x55,0xb,0x90,0x7e,0xbe,0xea,0xa5,0x5e,0xa1,0x51,0x3e, + 0xe5,0xb6,0x77,0x0,0x1d,0x7c,0x39,0x92,0x8f,0x95,0xca,0x98,0xa,0x45,0xb7,0x20, + 0x8b,0x3,0xb,0x1d,0x62,0xdf,0x8c,0xe4,0x91,0x39,0xc2,0x4a,0x56,0xfd,0xb5,0x3f, + 0xfb,0x27,0x3e,0xfe,0xc6,0x3f,0xff,0xfd,0xf7,0xc5,0x2f,0x2,0x3b,0x64,0xaf,0x48, + 0x2c,0x92,0x1d,0xb6,0x87,0x11,0x39,0x6a,0x81,0x38,0x92,0xab,0x49,0x5b,0x61,0x9a, + 0xf6,0x71,0x72,0x2d,0xd7,0x49,0x87,0x92,0x4c,0xae,0xe,0x76,0x44,0xba,0xf3,0xa9, + 0x8d,0xf,0x27,0x96,0xa4,0x17,0x37,0xb3,0x42,0xd5,0x1b,0x4f,0x87,0xcd,0x82,0xaf, + 0x8f,0xd6,0x2f,0xa4,0x30,0xa6,0xb3,0xdf,0x85,0x4e,0x9e,0xac,0x94,0xc1,0xec,0x82, + 0x6,0xd6,0xd7,0x31,0x4a,0xae,0x3e,0x6c,0x77,0x59,0x82,0x66,0xa2,0xda,0xc7,0xb, + 0x74,0x56,0x21,0x63,0x77,0xa1,0x2b,0x9f,0x5b,0x4d,0xd3,0xb,0xeb,0xc,0xe4,0xc8, + 0x49,0x45,0x3f,0x17,0xad,0x5a,0xb3,0x11,0xa8,0xbb,0xef,0xf3,0xd7,0xff,0xec,0x4f, + 0x7d,0xfc,0xf7,0xff,0xe7,0x1f,0xbc,0x6b,0x4f,0x8,0x8e,0xb8,0xdb,0xbc,0xe5,0x73, + 0x20,0x30,0x7a,0x4a,0x29,0xeb,0x60,0x23,0x3d,0xf6,0xda,0x4b,0xbb,0x36,0x2f,0xff, + 0x83,0xa9,0xb7,0x2b,0x87,0xf2,0x9a,0x1b,0x35,0x3f,0x66,0x8,0x97,0xc3,0xd2,0x52, + 0x63,0xff,0x1b,0x8d,0x10,0xf9,0x77,0xd2,0xfb,0x83,0xc2,0x92,0xba,0x49,0xe8,0xbf, + 0x23,0x7c,0x91,0xfd,0x37,0xf8,0x6c,0xbc,0x12,0xe8,0x9c,0x40,0x4a,0x77,0xa4,0x13, + 0x21,0xb,0x1f,0x91,0x83,0x7,0xb1,0x9a,0xfb,0xe1,0xeb,0x5d,0xd2,0x53,0x35,0x32, + 0xe7,0xd4,0x6a,0x11,0xdf,0x6a,0x9b,0xd1,0x65,0x24,0x6d,0xc2,0xcb,0xd8,0xd2,0xbd, + 0x6c,0xe4,0xcc,0x92,0x20,0xcf,0x1,0xa1,0x5a,0xb2,0xd9,0xd5,0xfb,0x8f,0x7b,0xc4, + 0x53,0xea,0x2a,0xf6,0xb4,0x65,0x18,0xaa,0x89,0x99,0x6a,0x34,0xe9,0x63,0x6d,0xe1, + 0x3d,0x9e,0x1,0xcd,0xa6,0x57,0xc5,0x48,0x6,0x1b,0x4e,0xe8,0x58,0x2b,0xe3,0x79, + 0xab,0x14,0xf8,0xaa,0x98,0x20,0xf7,0xec,0x92,0xdf,0x7c,0x19,0x84,0xb,0xbc,0x36, + 0xd1,0x52,0x7e,0x1d,0xb3,0x6f,0x9c,0xbc,0xa2,0xe,0xb8,0x55,0xd5,0x59,0x49,0x71, + 0x94,0xd2,0x17,0xa4,0x53,0xd1,0xa,0xa,0x70,0xcc,0xca,0x56,0xe4,0x7c,0xde,0x56, + 0xd6,0x2a,0x42,0xd4,0xad,0x13,0xd2,0xa2,0x58,0xc4,0x95,0x9,0x35,0xd7,0xf8,0x5a, + 0x1d,0xdf,0x77,0x2e,0x46,0x11,0xa3,0xb2,0x3d,0xd,0xf,0x3e,0x48,0xec,0xb3,0xe7, + 0xbc,0xfc,0xaa,0xaa,0x9b,0x1c,0xd1,0xe0,0x3e,0x47,0xf3,0xc,0x31,0x8d,0x77,0x60, + 0x55,0xe8,0x91,0xed,0xcf,0xce,0x71,0x29,0x2,0x84,0x89,0x4b,0xb3,0x7f,0xe3,0xa5, + 0x92,0x79,0xdd,0xcc,0x20,0x4c,0xb,0x12,0xf6,0xae,0x59,0xe9,0x88,0x96,0x54,0xb8, + 0x26,0xb1,0x5,0x34,0x9d,0x61,0x36,0x9f,0x5,0xc,0xad,0x3c,0xc,0x44,0xa7,0xae, + 0x95,0xbe,0xc8,0x4c,0x23,0xa3,0x58,0x5e,0x23,0x19,0x2d,0x53,0xf8,0xff,0xb9,0x35, + 0x2f,0xa2,0x11,0x1f,0xc2,0x93,0x28,0x5a,0x55,0xcc,0x18,0xd7,0x10,0xd4,0x70,0x69, + 0x1f,0x13,0xcd,0xdc,0xa5,0xc1,0x71,0x95,0x6d,0x4,0x25,0x2,0x49,0xef,0xcc,0xb4, + 0xf8,0x1f,0xef,0xe8,0xdd,0xc1,0x21,0x37,0x3c,0xc6,0xc6,0xd0,0x2c,0x83,0xbc,0x9c, + 0x55,0x9,0x63,0x5c,0xb7,0x31,0x3b,0xdd,0xe0,0x49,0x3c,0x19,0x18,0xa3,0x30,0xa3, + 0x95,0x44,0x72,0x76,0xa0,0x31,0xc5,0xb5,0x20,0x78,0x59,0x3b,0x6,0x63,0xc3,0xa1, + 0x57,0xa5,0xe5,0xb0,0x1a,0x97,0x94,0xe2,0x46,0x47,0xda,0xd4,0x93,0xb6,0x4,0x9e, + 0x9,0xb,0xb3,0xe9,0x1d,0xac,0x31,0x75,0xd,0xc7,0x28,0xd,0x2c,0xab,0xee,0xc7, + 0xcd,0x24,0x4f,0x4e,0x19,0x49,0x69,0x8a,0xc2,0x8a,0xe4,0x4c,0xbc,0x82,0x70,0x34, + 0xcb,0xa4,0x32,0xd1,0x2c,0xad,0x6e,0x51,0xa,0x61,0xf6,0xb5,0xd,0x35,0xb5,0x71, + 0xd4,0xb3,0x32,0x3f,0x37,0xcd,0x0,0x5c,0x36,0x6e,0x93,0x95,0x2f,0x7,0xb3,0x10, + 0xc6,0xec,0x35,0xf,0x8c,0xfe,0x76,0x78,0xc3,0xcf,0x2b,0x6,0x4a,0xd3,0x7d,0x3, + 0x18,0xf7,0x41,0x90,0x23,0xed,0x77,0x5c,0x61,0x30,0xa2,0xfb,0xe5,0x42,0xc7,0x4f, + 0x4c,0xe2,0x70,0xb0,0xd4,0xc5,0xd0,0xda,0x6a,0xe7,0x2d,0x8e,0xe8,0x67,0x8e,0x3c, + 0x35,0xb5,0xb1,0x46,0x8e,0x1c,0x7a,0xa4,0x71,0xf6,0xe7,0xde,0xde,0x5a,0xfc,0xec, + 0xab,0x3d,0xb,0x40,0x43,0xe7,0xe4,0xb7,0xf0,0xd0,0xfe,0xc2,0x40,0x67,0xcf,0xea, + 0x9a,0xbb,0x95,0xd5,0xc,0x8f,0x46,0x6a,0xd3,0xa0,0x8b,0x72,0xc2,0x13,0xcc,0x91, + 0xaf,0x5f,0xde,0x23,0xd9,0x4c,0xd2,0xe6,0xe1,0x9b,0x49,0x91,0x58,0xef,0xb6,0xe0, + 0xc1,0xdd,0x56,0x23,0x79,0x4b,0xa7,0x77,0x7,0xc4,0x6c,0xb7,0xb5,0x8f,0x38,0x8d, + 0xd9,0xdd,0x17,0xf1,0x56,0x21,0x3f,0xd9,0x44,0x40,0x40,0x99,0xba,0x82,0x91,0xd4, + 0x36,0x97,0x49,0x46,0xb6,0xae,0x7b,0xae,0xd9,0x34,0xbe,0xca,0xc7,0xcd,0xd4,0x12, + 0x31,0x68,0xfa,0xf,0x39,0x4f,0xfb,0x25,0x6c,0xcc,0x0,0x79,0x38,0xd7,0x26,0x33, + 0x40,0x2a,0xaa,0x62,0x97,0x97,0x4,0x3d,0xcc,0xb0,0x92,0x11,0x83,0x57,0xfc,0x5b, + 0x41,0x1,0x42,0x4c,0x1f,0xca,0x86,0x15,0xf5,0xb5,0xf5,0xbd,0xa9,0x81,0xd4,0x15, + 0xee,0x64,0x56,0xae,0xd2,0xb2,0x51,0x33,0x1e,0x68,0xf,0xe7,0xb9,0x57,0x76,0x6e, + 0xec,0xef,0xfd,0xfc,0xdc,0xd7,0xf8,0xfc,0x33,0xf8,0xfc,0x73,0xd4,0xc7,0xd0,0x3f, + 0x67,0xf8,0x55,0x7b,0xd0,0xa1,0x7a,0x43,0x33,0x6c,0x4a,0x28,0xbf,0xe9,0x55,0x42, + 0x54,0x6e,0x3b,0x8b,0x41,0x7,0xda,0x7b,0xf3,0x4e,0xe,0x63,0x9b,0x28,0x72,0xb2, + 0xe4,0x12,0xca,0xe1,0x79,0xca,0x6b,0xcf,0x79,0xc3,0xc8,0x90,0x15,0xc2,0x38,0xe9, + 0x98,0xfe,0xf4,0xe,0x47,0xab,0xc9,0x47,0x66,0xf5,0xe9,0xf9,0x21,0xe7,0x24,0x73, + 0x70,0x8a,0x73,0x6b,0x5d,0xc4,0x44,0x19,0x1,0x5f,0x3f,0x13,0x72,0x5f,0x88,0xd9, + 0x50,0x73,0xa5,0x78,0x57,0xc5,0x1c,0x30,0xaa,0x8e,0xc0,0x21,0xaa,0xd2,0xaa,0x17, + 0x5a,0xa1,0x43,0xf6,0x5e,0x4c,0x5e,0xe8,0x62,0xb1,0x8d,0xc4,0xf6,0x1c,0x63,0x4e, + 0x74,0x26,0x3,0x5,0xdb,0x16,0x3a,0x43,0x9c,0x4c,0x5c,0xd6,0xf9,0x13,0x6c,0x8e, + 0x8a,0x35,0xc8,0x20,0x7a,0xa1,0x96,0x82,0x15,0xc3,0x5b,0xc1,0x48,0x23,0x78,0x26, + 0xcf,0xb6,0x7b,0xd0,0x45,0xfc,0xab,0x26,0x45,0x4a,0x22,0x95,0x74,0x66,0x2,0xea, + 0x7d,0xcf,0xaf,0x87,0xf8,0x77,0x54,0xde,0x1c,0x38,0x2f,0x8d,0xa8,0x39,0x5c,0xbf, + 0x8d,0x64,0x86,0xe4,0x1c,0xd2,0xc5,0x40,0x88,0xc7,0xcf,0x5c,0xb6,0x18,0x33,0x3d, + 0xba,0x4,0xd4,0xea,0xb8,0xcd,0x9f,0xeb,0xfd,0xd8,0x23,0xb2,0xf,0xa2,0xcc,0xc9, + 0x93,0x43,0xaf,0x5,0xe1,0xab,0x80,0x24,0x61,0x96,0x7d,0x66,0x1b,0xce,0xbe,0x3f, + 0xfb,0x39,0x3b,0x3f,0x3f,0x4b,0x66,0xcc,0x3,0xfe,0x8f,0xe0,0xbf,0x13,0x4f,0xf7, + 0x2c,0x61,0xed,0x73,0x96,0x23,0x5c,0xc2,0x7e,0xaf,0x4b,0x55,0x3a,0x7,0xa8,0x45, + 0x1e,0xe1,0x9b,0x4a,0xf3,0x3d,0x15,0x9d,0xd,0xc4,0x43,0xd9,0x7c,0x2a,0xe6,0xc2, + 0xad,0x4d,0x1b,0xb,0x71,0xf5,0xb6,0x28,0xe2,0x19,0x72,0x70,0xaa,0xb0,0xfc,0x13, + 0x10,0xb2,0xd2,0xa1,0xba,0x0,0xa5,0xe2,0x5a,0x8c,0xae,0x6a,0x16,0xbb,0x7f,0xf, + 0xf7,0xdc,0x25,0xfc,0x3b,0x69,0x73,0xea,0x15,0x3e,0xec,0x4a,0x78,0x84,0x77,0x13, + 0xd8,0xf7,0x2,0x22,0x48,0x53,0x66,0x31,0x55,0x94,0x24,0x2d,0x77,0x81,0x39,0xb8, + 0x68,0x25,0x84,0xc1,0xa7,0x97,0x9,0x9e,0xc4,0x5f,0x1a,0xa4,0x18,0x4,0xce,0x87, + 0xa9,0xeb,0xda,0x25,0x77,0x30,0xb0,0xd7,0xc3,0xc,0x77,0x30,0x49,0x18,0xa,0xcb, + 0x1b,0x41,0x91,0x57,0x13,0x9d,0x91,0xd1,0x87,0x66,0xb9,0x33,0xb2,0xa7,0x6d,0x4e, + 0x3f,0x8f,0x68,0x38,0x42,0x3,0x69,0x9,0x2d,0x49,0xdb,0x3c,0x98,0x10,0xf0,0xdf, + 0x93,0x25,0x83,0x4d,0x0,0x68,0x92,0x5,0xf5,0xf5,0xc6,0x70,0x75,0xa0,0xdf,0x9f, + 0x66,0x12,0xc4,0xb9,0x88,0xb0,0x3,0x3c,0x3e,0xd3,0xc6,0xf,0x39,0x1f,0xf8,0x49, + 0xae,0x62,0xa8,0x39,0x98,0x41,0x51,0x36,0x49,0x85,0x86,0xe,0xce,0x63,0x58,0xfd, + 0xd6,0x85,0xc0,0x6,0x66,0x52,0xe8,0x24,0x87,0x9c,0x52,0x9c,0x83,0x30,0x4e,0x47, + 0x4d,0xdd,0x46,0x92,0xa7,0xd7,0x2a,0xab,0x16,0x33,0xec,0xea,0xb7,0x6c,0x9b,0x41, + 0x35,0x4d,0x96,0x71,0xcd,0x4e,0xa2,0x17,0x87,0xf7,0xa4,0xb6,0xf0,0xea,0xef,0x47, + 0xb9,0x90,0x22,0x49,0xec,0x64,0x5f,0xe6,0xf4,0x47,0xbb,0xaf,0xa2,0xfd,0xb0,0xb6, + 0xa5,0xca,0xc9,0xe2,0x3c,0x1d,0x20,0xb2,0xc6,0xe3,0xf4,0x45,0xea,0x87,0xd8,0xcf, + 0xe2,0x88,0x8b,0xb0,0x30,0x24,0xaf,0x88,0xc7,0x43,0x43,0x66,0x3b,0x2f,0x8b,0xc2, + 0x27,0xe1,0x42,0x3e,0x28,0xd7,0xc8,0xb0,0x46,0x62,0x8b,0x1c,0xd2,0xb5,0x56,0x72, + 0xa6,0x3e,0x3,0xb0,0x53,0xb6,0x1e,0x1e,0xc6,0x1d,0xb,0x7f,0xe3,0xff,0xf8,0x57, + 0xef,0x7f,0xf3,0xcf,0xfd,0xc9,0x8f,0x75,0x46,0xea,0x78,0x35,0x5b,0x8e,0xd0,0x4, + 0x9d,0xa0,0x93,0x14,0x52,0x8c,0x94,0x20,0xd1,0x14,0xf5,0x24,0x13,0x33,0xe3,0x50, + 0x9d,0x2b,0xca,0xc8,0x4e,0x39,0x7a,0xcb,0x66,0x7c,0x31,0xab,0x7d,0x34,0x47,0x97, + 0x36,0x57,0x8e,0xbe,0xa7,0x5c,0x93,0x41,0xcc,0x3e,0x47,0xa1,0x1,0x5f,0xac,0x7c, + 0x7a,0x4e,0x53,0xa3,0x48,0x32,0x1,0x6a,0x5,0xc4,0xa,0x21,0x12,0x9a,0x96,0x8, + 0x83,0xa9,0xaf,0xb3,0x7b,0x3d,0x96,0x74,0x61,0x14,0x95,0xb7,0xcc,0x6a,0xd,0xa3, + 0x41,0xd,0xbb,0xb8,0x86,0xef,0xa6,0x6a,0x73,0x8b,0xe0,0xb8,0x10,0x1a,0x76,0x72, + 0xa5,0xbf,0xb0,0x92,0x8a,0x76,0xf0,0xd8,0xae,0x6a,0xdc,0x4a,0x70,0xd8,0xba,0xed, + 0x29,0x22,0xb2,0xd8,0xef,0x18,0xf4,0xf8,0x2d,0xf9,0xa5,0x1b,0xe6,0xc1,0x2b,0xa6, + 0xb4,0x2,0xc4,0xe8,0xd0,0x56,0x75,0xd0,0xd,0xdb,0x30,0x21,0x19,0xc9,0x11,0x9b, + 0xa0,0x91,0xa9,0xb,0xb5,0xbe,0x16,0xe3,0x90,0xcf,0xca,0x2,0xc1,0xa2,0x4b,0xf1, + 0x97,0x6c,0x60,0x4e,0x70,0x76,0x85,0xfa,0xb,0x3c,0xf0,0x85,0x24,0x28,0x2a,0x2d, + 0x7c,0xe3,0x33,0x59,0x7,0xcd,0xca,0xec,0x77,0x60,0xae,0x6,0xa7,0x8a,0x32,0xad, + 0x25,0x25,0x99,0x61,0xd,0x58,0xfe,0x41,0xc7,0x7f,0xa9,0xa,0x62,0xe,0x2e,0x3b, + 0x68,0x69,0x92,0xc5,0x4a,0x39,0xa5,0x3d,0xba,0x29,0xe2,0x52,0x52,0x79,0x15,0x87, + 0x31,0xad,0xea,0xc5,0xb5,0xf7,0xd7,0xd9,0x9a,0xcf,0xe3,0xd1,0xbf,0x8a,0x2f,0x6, + 0x3f,0x85,0x83,0x73,0x5c,0xc2,0xd7,0xbe,0xfe,0x54,0x4c,0x4,0x86,0xfa,0xa9,0xce, + 0x39,0xbd,0x35,0xd9,0xe,0x7b,0xf1,0x6c,0x84,0x4f,0x6f,0xf2,0xd6,0x69,0x30,0xcd, + 0xf4,0xe7,0xcf,0x2f,0x19,0x59,0xc3,0x41,0x63,0x1b,0xf9,0x7c,0xe4,0xf1,0x5e,0x91, + 0xa0,0x5d,0x5b,0xbc,0x4b,0x6f,0xf6,0xbe,0xf,0x8c,0xb9,0xf7,0x5a,0x22,0x3e,0x7a, + 0xaf,0xfc,0x31,0x60,0x40,0x94,0x69,0xd6,0xd8,0x31,0xf9,0xe9,0x6d,0x1d,0x7a,0xdb, + 0x27,0x9f,0x23,0x24,0x1e,0xa8,0xea,0x65,0xa,0xb8,0x20,0xb9,0x5a,0xd8,0xc1,0x77, + 0xf1,0x2b,0x2c,0x29,0xde,0x5,0xe9,0xe6,0x1b,0xe1,0xfe,0xe7,0xc,0x7a,0xb4,0x49, + 0x56,0x55,0xa5,0x2b,0xd7,0x98,0x5a,0x89,0xb2,0x6a,0xc3,0x33,0x25,0xa8,0x85,0xfb, + 0x41,0x71,0x7,0xb5,0x31,0x35,0x8a,0x20,0x58,0xb9,0x30,0xff,0x95,0xc0,0x77,0xef, + 0x49,0x62,0x2e,0xd,0x63,0x90,0x85,0xa1,0x7d,0x8d,0x41,0xe4,0xc3,0x99,0x7a,0x83, + 0xcf,0x2d,0xd0,0x2b,0xa2,0xc9,0xb7,0x7a,0x40,0x1c,0xb8,0xb4,0x93,0x39,0xb2,0x3f, + 0x94,0x44,0x86,0x64,0x13,0xe7,0x77,0x5c,0xf4,0xbe,0x92,0x69,0x1e,0xd3,0xaa,0xee, + 0xc6,0x74,0x1f,0x85,0x3c,0x5e,0xc8,0xbf,0x62,0x78,0x2d,0x12,0xf2,0x8d,0xcf,0x67, + 0x8d,0x15,0x6d,0x13,0x6c,0x90,0x93,0x50,0xb8,0x4c,0xee,0xbc,0xb5,0x60,0xcc,0x90, + 0x5c,0x3c,0x42,0x9,0x81,0x26,0x8c,0xaf,0xeb,0x3a,0xcf,0xdd,0x26,0x1b,0x1d,0xb, + 0xc7,0xd4,0xfb,0xd,0x32,0x8,0x21,0x1b,0xf0,0xe6,0x75,0x2a,0x8b,0x9f,0x43,0x85, + 0x39,0xde,0x33,0xcc,0x53,0x10,0x93,0x7,0x41,0xa2,0xc5,0x19,0xf0,0xa7,0xc7,0x3b, + 0x24,0xc6,0x96,0x77,0xb4,0xb1,0x37,0x77,0x99,0x42,0x1b,0x1b,0xaa,0x26,0x65,0xac, + 0x23,0x77,0xc8,0x8b,0xc4,0x50,0x5d,0x46,0xd2,0xc0,0xf0,0x7c,0x47,0x10,0x4e,0x33, + 0xfc,0x98,0xad,0xb2,0x4e,0x1c,0x0,0x31,0x76,0xda,0x15,0xae,0x66,0xb5,0x3f,0xd, + 0x5c,0x1b,0x95,0x61,0xf3,0x9b,0x4f,0xd7,0xbf,0xcd,0x17,0xd9,0xf9,0x56,0x8a,0xec, + 0xd0,0x68,0x88,0xad,0x25,0x71,0x85,0x30,0x51,0x38,0xf5,0x51,0xb5,0x35,0x86,0x24, + 0xb5,0x9a,0xdf,0x38,0x9c,0x23,0xd2,0x38,0x23,0x35,0x4f,0xe7,0x0,0x83,0x9f,0x8e, + 0x8f,0x3d,0x35,0xb1,0x2f,0xb8,0x75,0x6f,0xca,0x5f,0xdb,0x67,0xb0,0x4f,0x81,0x7e, + 0x5,0x85,0xab,0x27,0x19,0x12,0x50,0x90,0x3c,0x61,0x21,0xa6,0x7a,0xee,0x70,0x35, + 0x6f,0x70,0x5a,0x1c,0xa9,0xe0,0x50,0xc9,0x98,0xb2,0x9a,0xd6,0xc,0x4e,0x86,0xda, + 0x62,0xd2,0x9,0xe,0x36,0x42,0x4f,0xea,0xa0,0x48,0x5f,0x9c,0x49,0x76,0xe,0x69, + 0x6e,0x6d,0x3,0x94,0xa3,0xa,0xb,0x51,0x7e,0xd6,0x3,0x95,0xa8,0x9c,0x52,0xce, + 0x10,0x24,0x82,0xe2,0x7a,0x18,0xb3,0x32,0x50,0xf7,0x36,0x29,0x90,0xe9,0xd3,0x19, + 0x8c,0xb5,0xbc,0xc6,0x42,0x49,0x13,0x61,0x43,0xf0,0x41,0xde,0x7a,0x47,0xb8,0x4c, + 0xe0,0x2,0x1,0x93,0xe,0x14,0xc6,0x1e,0xa0,0xc9,0x5e,0xfd,0x34,0x13,0xe7,0x93, + 0x72,0x15,0xf,0xfe,0xbc,0x43,0x3f,0xd5,0xfa,0xd6,0x26,0x9,0x3c,0x54,0x5f,0x65, + 0x52,0x91,0x99,0x89,0xda,0xdf,0xd5,0xe1,0x92,0x25,0xe5,0xb,0x5b,0xf2,0xd4,0x3f, + 0x19,0x61,0xf4,0x13,0x94,0xd8,0xf6,0x14,0x5d,0x9c,0x23,0x83,0xfc,0xd8,0xa6,0x63, + 0xdf,0xd8,0xfc,0x14,0xd4,0xe3,0xb3,0x4c,0x15,0x6e,0xf7,0xa1,0xf6,0x7b,0x57,0xe6, + 0xc8,0xb2,0x3e,0x55,0x8a,0xfb,0xe4,0xef,0x80,0x40,0x32,0x8f,0x24,0x2a,0xa2,0xa9, + 0xee,0xd2,0x8e,0xb6,0x5b,0xd,0xce,0xd9,0x49,0x59,0x80,0x67,0xec,0x3e,0xf2,0xda, + 0x4b,0xd7,0xea,0x53,0x5d,0xec,0xa,0xd9,0xad,0x76,0x0,0xcb,0xc4,0x37,0x62,0xa2, + 0x60,0x59,0x77,0x42,0xa1,0xbd,0x1b,0x22,0x55,0xe9,0xdb,0x84,0xf5,0xe4,0xf7,0x50, + 0xf4,0xde,0x35,0x30,0x70,0xd8,0x39,0xd4,0xe6,0x8d,0x55,0x6e,0x30,0x13,0xa0,0xa6, + 0x3f,0x18,0x2e,0x75,0xc6,0xc7,0x40,0x47,0x2f,0x8,0xf,0x28,0xd9,0xae,0x54,0x9, + 0x65,0x7b,0x3b,0x53,0x46,0xa4,0x8f,0xda,0x98,0xe4,0xae,0x1c,0x5a,0xde,0xd2,0x45, + 0xe3,0xa2,0x4c,0xd6,0xa4,0x34,0x9e,0x35,0x44,0x22,0xb4,0x4c,0x2,0xdc,0x2b,0x37, + 0x3a,0xaf,0x3,0x7a,0x78,0xc2,0x7d,0xe1,0xc3,0xa5,0x8c,0x48,0x73,0x16,0x36,0x60, + 0x87,0x26,0x20,0x43,0x1f,0x41,0xad,0x6e,0xce,0x46,0x19,0x99,0xa4,0xca,0x3c,0x87, + 0xdc,0x2d,0x52,0x64,0x0,0xe9,0xae,0xb5,0x45,0xaf,0xd2,0x37,0x1,0x21,0x77,0xfb, + 0x8,0xb4,0xec,0x40,0x45,0x63,0xcd,0x27,0x4d,0x9e,0xb6,0x25,0x9f,0x7b,0x98,0x59, + 0x29,0x85,0x17,0x23,0xeb,0x3e,0xd6,0x81,0xee,0x34,0xf5,0xee,0x6,0xd0,0x24,0xbf, + 0xbd,0x4b,0xe1,0x2e,0x79,0xe6,0x15,0x5f,0xa1,0xb3,0x17,0x8e,0x80,0x1b,0x8d,0x75, + 0xfb,0x54,0x8,0xa2,0x82,0x49,0x22,0xd7,0x50,0x50,0x4f,0x5a,0xd7,0x75,0x89,0xc7, + 0xc5,0xaa,0xd6,0xb,0xdf,0x30,0x1a,0x1b,0x32,0x28,0x15,0x36,0xfa,0x9c,0x5a,0xa8, + 0x98,0x35,0xd0,0x1a,0x69,0x13,0x35,0x77,0x2a,0xbe,0x20,0x96,0xab,0x5,0x1b,0x84, + 0xd7,0x2b,0x6,0x48,0xaf,0xa5,0xd8,0xf3,0x1c,0x7a,0x22,0x93,0xc9,0xac,0x6c,0x4a, + 0x7b,0xea,0x94,0x96,0x2c,0x46,0x95,0x96,0xb,0x26,0xe3,0x62,0x78,0x23,0x5e,0xc3, + 0x61,0x74,0xaa,0x79,0x38,0x2b,0x21,0x6b,0x6b,0x1b,0x1b,0x9b,0x16,0x43,0x3b,0x2d, + 0xae,0x15,0x89,0xcd,0xf7,0x39,0xa7,0xaa,0x93,0xe0,0x41,0x1e,0xf6,0x36,0xeb,0x59, + 0x21,0xee,0x80,0xc9,0xef,0xce,0x5d,0xbc,0xb4,0x12,0x7f,0x32,0x47,0x3d,0x5c,0xe9, + 0x99,0x68,0x69,0x2f,0x67,0xe8,0x49,0xa7,0x54,0xad,0xcb,0x8b,0x50,0x24,0xa,0x85, + 0xe9,0xdc,0xe6,0x34,0xbd,0x27,0x6,0x93,0xba,0xd,0xab,0xce,0x8a,0xf9,0x5f,0xcd, + 0xf8,0xb3,0xf7,0x26,0x33,0xd2,0x95,0x58,0x11,0xd2,0xdd,0xce,0x25,0x54,0x39,0xf9, + 0x21,0x97,0xb3,0xb5,0x11,0xdf,0xa3,0xa7,0x20,0xa3,0xa7,0x35,0x3a,0xa1,0x45,0x75, + 0xc2,0xe8,0xe5,0x3a,0x2f,0x49,0x5,0x60,0x50,0x6d,0x4,0x9a,0x3a,0xfa,0x3,0x17, + 0x2e,0x91,0xbe,0x9c,0x49,0xe8,0x72,0xcf,0xe1,0x57,0x6e,0x2f,0x25,0x5,0x96,0xf4, + 0xb5,0x6b,0xf,0x18,0x50,0x89,0x91,0x93,0x66,0x80,0x60,0xc5,0xcc,0x4a,0x5a,0x45, + 0x9b,0xa8,0xf7,0xad,0xa3,0x13,0xa5,0x8e,0x6f,0xf0,0x79,0xf3,0xcd,0xa5,0xe0,0xf6, + 0x49,0xa7,0x1f,0xd4,0x3a,0x83,0x6d,0x92,0xc9,0x4c,0x99,0x91,0x6d,0x8e,0xb1,0xad, + 0xe6,0x7d,0xe2,0x62,0xf3,0x64,0xd5,0x5d,0x31,0xa4,0x49,0xe9,0x42,0x3b,0x8a,0xb2, + 0x2c,0x29,0x53,0x26,0xf7,0x1c,0xe6,0x72,0x98,0xea,0xdd,0x6c,0x7f,0xef,0xe3,0x8b, + 0x80,0x53,0xb0,0xa9,0x6d,0xc1,0xd0,0xf2,0x68,0xeb,0x0,0xf0,0xbd,0xb,0x97,0x41, + 0x1,0xfa,0x24,0x48,0xde,0xcb,0x9a,0x74,0x1,0xe,0x4,0x46,0xea,0x77,0x5f,0x3, + 0xb9,0x71,0xa8,0xf,0xc,0x45,0xdd,0x23,0x5,0x75,0x54,0xf1,0xbd,0x12,0xdd,0x9d, + 0xda,0x6e,0x93,0x49,0xcf,0x14,0xde,0x26,0x77,0x4b,0xd7,0xec,0x60,0xc8,0xe9,0x4e, + 0xb7,0x60,0x98,0x9e,0xb6,0xf5,0xfd,0xdf,0xfd,0xb3,0x1f,0xbd,0xff,0x9d,0xff,0xf4, + 0xa7,0x3f,0xd8,0x1c,0x48,0xe3,0x47,0xc2,0xa7,0x49,0x0,0xe,0x9a,0x20,0x3e,0x12, + 0xf7,0x74,0x63,0x5b,0x96,0x4f,0x4,0xab,0x3a,0xcc,0xe0,0x5b,0x20,0x69,0xc5,0xf4, + 0x30,0x7a,0xf2,0x6c,0x82,0xec,0x2f,0xa6,0xe2,0x59,0xb,0xc0,0x7d,0x68,0xd3,0x42, + 0x23,0xd2,0x80,0x82,0x1e,0xa8,0x7,0xf1,0x5,0x98,0x38,0xc4,0x26,0xd1,0xa1,0x69, + 0xbb,0xc7,0xb8,0x98,0x9,0x56,0x20,0xe6,0x22,0x69,0xc2,0x2e,0x15,0xe,0xc3,0xca, + 0xae,0xcb,0xd1,0x1f,0x86,0x8d,0xa1,0x8a,0x7c,0xf0,0xc5,0xc4,0xe6,0x16,0xe,0x41, + 0x4f,0xd,0xae,0xbb,0xe7,0x73,0xf7,0x30,0x75,0xee,0x51,0x33,0x4d,0x3b,0x50,0x3e, + 0xcb,0x66,0xdb,0x79,0x27,0x77,0x26,0x26,0xc2,0xe8,0x7,0x22,0x49,0x30,0xcf,0x3f, + 0x5c,0xee,0xac,0x17,0x5b,0x66,0xcd,0x3d,0x3f,0x15,0xc,0xa2,0x82,0xa4,0x54,0x78, + 0x7a,0x5f,0x59,0x2e,0x6e,0xd1,0x46,0x4,0xd1,0x4c,0xa9,0x8c,0x30,0xd9,0x2,0xac, + 0x56,0xf,0x2e,0x3a,0x63,0xa,0x65,0xf2,0x7d,0xc,0xa1,0xe,0x87,0x82,0xcb,0xe, + 0xc1,0x74,0xd2,0xd3,0xdf,0x89,0x90,0x3e,0xdf,0x42,0x40,0x31,0xd3,0x4b,0x88,0x58, + 0xc5,0x7e,0xa3,0x8d,0x8e,0x19,0x17,0x5,0x4b,0xe8,0x47,0x2d,0x81,0x95,0xf5,0x41, + 0x4d,0x0,0x19,0xf0,0xa4,0x91,0xdd,0xe0,0xea,0x8a,0xd4,0xea,0x1a,0x1,0x35,0x33, + 0xf4,0xff,0xe9,0x2,0x2e,0x8d,0xe0,0xa8,0xda,0x14,0xb4,0xf5,0x3e,0x77,0xe2,0x94, + 0x71,0xcf,0xb6,0xe6,0xc2,0xe1,0xc0,0x84,0x4c,0x54,0x7a,0xd5,0xfc,0xa7,0x2f,0x84, + 0xe5,0xac,0x27,0x13,0xad,0x25,0xf6,0x7c,0xe0,0xe5,0xc7,0x56,0x79,0xba,0xba,0xb8, + 0x2e,0x68,0x6c,0x66,0xff,0x2e,0xe,0x41,0xe6,0xfc,0x1f,0x44,0x3f,0x1e,0x7,0x52, + 0x7d,0xeb,0x6f,0xc5,0x64,0x1a,0xe,0xa,0x2f,0x7,0x9,0x92,0x76,0x2f,0x2e,0x57, + 0xe8,0x9c,0x2,0x1b,0x4f,0x88,0x5e,0x44,0xba,0x43,0xa0,0xcd,0xd6,0x11,0x62,0xc4, + 0xcf,0x7b,0xd9,0xa7,0x11,0x38,0x29,0x79,0x31,0xb9,0xbc,0xe5,0xf5,0xa7,0x90,0x8b, + 0xf2,0x8a,0x54,0xa7,0x23,0x48,0xa9,0xf4,0xf1,0x3c,0x44,0x3b,0x7a,0x4d,0x4f,0x3c, + 0xae,0x96,0x94,0xcf,0x6d,0xfe,0xca,0xd1,0xb3,0x5b,0xa6,0x39,0x13,0x32,0xc0,0xb8, + 0x3f,0xa8,0x37,0xd5,0xe4,0x7d,0x8,0x16,0x58,0x4c,0x68,0xe7,0x22,0xd3,0xd,0x41, + 0x5,0xce,0xa,0xd8,0x5,0x1c,0x86,0x6a,0x2b,0x88,0x54,0x25,0x96,0x79,0xae,0xe1, + 0xcc,0x68,0xd,0x2f,0x28,0x74,0xcd,0xee,0xd,0xb4,0x54,0x65,0x9,0xca,0xe7,0xf3, + 0x44,0x18,0x9a,0x1a,0x6,0x2b,0xd1,0xb9,0xc4,0x79,0x2d,0xd8,0xfb,0x2d,0x86,0x63, + 0x5b,0xdc,0x71,0x20,0x7c,0x61,0x67,0xf3,0x54,0xeb,0x41,0xc2,0x61,0x29,0xcb,0xa, + 0xbb,0x13,0x54,0x9f,0xdc,0x42,0x93,0x2,0x5f,0x4,0x8f,0x87,0xf8,0xfa,0x29,0x87, + 0xf8,0xa7,0x40,0xc8,0xa,0xb9,0x2b,0x8c,0xf6,0x29,0x35,0x2e,0x44,0xe6,0xb1,0x61, + 0xb2,0xb5,0x74,0xad,0x11,0x9c,0x5,0xf3,0x1c,0xea,0x6,0x57,0xc3,0xc6,0x16,0x62, + 0x94,0x9,0x82,0xac,0x8e,0xaa,0xac,0x43,0x6d,0x87,0xdd,0xf7,0xc9,0xfc,0xaf,0x15, + 0x36,0xa6,0x98,0xb8,0xc8,0xef,0x32,0xa6,0xac,0x6b,0x40,0xab,0xe7,0xbd,0x5b,0x74, + 0xfb,0x41,0xad,0xeb,0x14,0xcd,0xc2,0xcf,0xe8,0x51,0x9d,0x18,0xc4,0xd0,0x59,0xf8, + 0xd6,0xe4,0x83,0xa1,0x5c,0x87,0x13,0x1f,0x90,0xb1,0x16,0xb4,0x73,0x61,0x94,0xe9, + 0xb5,0xaf,0xc8,0xf7,0x85,0xcf,0xb0,0x3e,0x2b,0x95,0x1b,0x6b,0xed,0x79,0x6c,0x18, + 0x3c,0x75,0xe6,0xaf,0x30,0x54,0xaa,0x8a,0xbd,0x8c,0xd1,0x55,0xd0,0xe,0xf2,0x75, + 0x5e,0x5c,0x8b,0x89,0xac,0xb2,0xd4,0xcc,0x73,0xb9,0xf,0xe1,0xc6,0xd9,0xb3,0x67, + 0x8b,0x55,0xf3,0x5b,0xf7,0xd7,0x5a,0x77,0xd9,0x53,0x1b,0xf8,0x15,0x66,0xb1,0x2b, + 0x6d,0x22,0x30,0xf5,0x8,0x68,0xeb,0xbc,0xbb,0xb3,0x89,0xaf,0xfb,0xd0,0xc6,0x7b, + 0x46,0xbe,0x40,0x77,0x95,0x33,0xf6,0x17,0x6b,0x78,0x86,0xa9,0xd7,0xae,0xb7,0x23, + 0x19,0x91,0x75,0x20,0x68,0x8a,0xe2,0xe5,0xe4,0x8f,0xb0,0xf8,0x38,0xee,0xd2,0xb6, + 0x51,0xbb,0x20,0x68,0x12,0x87,0xda,0x16,0x7e,0x8f,0x93,0x3c,0xd8,0x8e,0x11,0xf9, + 0x6e,0x1c,0xe,0x1c,0x83,0xe4,0xb3,0xfd,0x3a,0x94,0xcc,0xf0,0x42,0xe8,0xfb,0xff, + 0xd9,0xcf,0x7c,0xfc,0xb7,0xff,0xfb,0xbf,0x7c,0x27,0xab,0xfe,0xee,0x2f,0xfc,0xcc, + 0x47,0x6a,0x22,0x4c,0x9d,0x62,0xbd,0xcf,0xac,0x2d,0x4e,0xa3,0xc4,0x64,0xe,0x7b, + 0x9c,0xea,0x11,0xa2,0xe8,0x20,0x20,0x63,0xe2,0x68,0x52,0xd0,0x57,0xc2,0x34,0x9d, + 0x96,0xd8,0x75,0x6e,0x4b,0x61,0xb8,0x72,0xb8,0xac,0x59,0x1a,0xe,0x84,0x60,0x3b, + 0xee,0xe0,0xf,0x49,0x35,0xa2,0x1b,0x88,0xfa,0xe8,0x40,0x13,0xad,0x35,0xcd,0x10, + 0x9e,0x31,0xa2,0x54,0x55,0x53,0x55,0x53,0xd7,0x2f,0x46,0xa5,0xe3,0x6a,0x78,0xc3, + 0xef,0x30,0x88,0x9f,0xee,0xeb,0x91,0xa4,0x1f,0x19,0x75,0x68,0xa9,0xf2,0xc3,0x4b, + 0x20,0x86,0xf9,0xcb,0x6a,0xe2,0xc,0x76,0xaf,0x10,0xc2,0x3c,0xb6,0xe1,0xb8,0xe7, + 0xa1,0x65,0xc4,0x61,0x65,0xf5,0x9c,0xf8,0x6b,0x90,0xd7,0x6c,0x63,0x6,0x58,0x56, + 0x3c,0xb,0x10,0x32,0x38,0x11,0x1b,0x8a,0xf,0x29,0x3a,0x74,0xe7,0x73,0x4c,0xd4, + 0xc4,0xa3,0xfc,0x95,0x6a,0x5c,0x33,0x64,0x60,0x13,0xea,0x42,0xb,0xb7,0x8,0xe6, + 0xda,0x82,0x14,0x2f,0xd8,0x6f,0x18,0x39,0x87,0x3,0x9b,0xdc,0x14,0xc2,0xea,0x52, + 0x50,0xb5,0xed,0x97,0x93,0xe,0x46,0x23,0xe3,0x1d,0x54,0x1a,0x59,0x89,0x8a,0x6c, + 0x88,0x80,0x21,0x48,0xe2,0x9d,0xaa,0xcb,0x12,0x1b,0xa3,0xe9,0xac,0xef,0xbb,0xaa, + 0xfb,0x54,0xd6,0xa0,0x38,0x76,0x75,0x76,0xfb,0xb0,0xc9,0x31,0x54,0x75,0x18,0x60, + 0xcf,0xe2,0x30,0xfa,0x65,0x2c,0x79,0x59,0x6d,0x29,0xbe,0xc1,0xde,0x8b,0x47,0xb6, + 0xba,0x92,0x67,0x8b,0x3c,0x68,0xd8,0x92,0xab,0x9c,0xfb,0x44,0xf6,0xef,0xd8,0xd7, + 0xa2,0x6b,0xaa,0x96,0x8d,0x43,0x15,0x6b,0x50,0x2,0x43,0x8f,0x61,0x27,0x2b,0x54, + 0xbd,0x28,0x38,0x83,0xff,0x34,0xf1,0xe7,0xf0,0x7c,0x56,0x94,0x2a,0x79,0x2c,0x86, + 0x20,0x74,0x48,0xc4,0x8,0x9a,0x3,0xff,0x15,0x21,0x3c,0xd6,0x9c,0xc3,0xd0,0x51, + 0xd4,0xbe,0x9e,0x63,0x8b,0x5f,0x29,0x9c,0xf5,0x1c,0xc3,0x97,0x21,0x37,0x6c,0x94, + 0xec,0x24,0x23,0xce,0x22,0x4e,0xbb,0xeb,0xef,0x53,0x5,0xcf,0x18,0xe3,0xe4,0xd6, + 0x41,0x7a,0x9b,0xee,0xfb,0xff,0xf9,0xcf,0x7c,0xfc,0xdd,0x5f,0xf8,0xd9,0x8f,0x5f, + 0xff,0xa7,0xff,0xf2,0x9d,0x55,0x3,0x9a,0x13,0xae,0x6c,0xd1,0x5a,0x75,0x39,0xee, + 0x6a,0x5,0x27,0xc3,0xbc,0x7,0xb1,0xce,0x18,0xc,0x9a,0x25,0x8c,0x76,0x3f,0xf3, + 0x4b,0xf,0x7,0x5a,0x1c,0x4b,0xd5,0x2f,0x81,0x1c,0xb,0x83,0x47,0x31,0x9c,0xe8, + 0x84,0x72,0x32,0x90,0xf4,0xb3,0x90,0x2c,0xd6,0x41,0xe6,0x8e,0x9,0x63,0xda,0x22, + 0x80,0xc3,0x63,0x19,0x62,0xc2,0x74,0x0,0x8,0xc5,0x35,0x86,0x3a,0x1d,0x14,0x86, + 0xc4,0x76,0xe4,0x81,0x58,0x1f,0xe0,0x60,0xe1,0x8,0x4,0x74,0x18,0x3d,0x2b,0xc0, + 0x44,0x14,0xcd,0x5a,0x71,0x82,0x9d,0x10,0x7a,0xc4,0xe7,0x6e,0x53,0x70,0xdf,0xbd, + 0xc7,0x6,0x85,0xd6,0x35,0x23,0xc,0xf8,0x5d,0xbf,0xfa,0xef,0xfd,0xc2,0x4f,0x7f, + 0xfc,0xd7,0xff,0xe4,0x47,0xef,0x0,0xc2,0x92,0xf3,0x0,0xeb,0xa1,0xd7,0x8d,0x1c, + 0xd8,0xcc,0xa8,0xd4,0xe5,0xc6,0x6b,0x38,0x2e,0x89,0x1f,0x9c,0x2c,0x6f,0x7a,0xb4, + 0x9c,0x38,0x19,0x30,0xc,0xe0,0x1a,0x98,0xc6,0x91,0xb0,0x56,0x12,0xc1,0xb2,0x8d, + 0x84,0x91,0xc7,0x5d,0xea,0xbb,0x3e,0x69,0xd2,0xf,0xf3,0xb6,0x35,0x24,0x35,0x8d, + 0xab,0x62,0x6b,0x82,0xce,0xac,0x4f,0x8d,0x41,0xe4,0x5e,0x84,0x89,0xa9,0xf8,0xc1, + 0x43,0xa7,0x2c,0xe3,0xd0,0x8f,0x4,0x6,0xb9,0x43,0x58,0x2b,0xc4,0x49,0x5e,0xca, + 0x2c,0x9e,0xad,0x61,0x4d,0x29,0x30,0x54,0x28,0x4f,0x49,0x1,0x51,0xa3,0x3d,0xee, + 0xee,0x27,0xd7,0xe0,0x58,0x33,0x24,0x41,0x63,0x60,0xdd,0x8,0x8d,0xf7,0x51,0x60, + 0x68,0xc2,0x90,0x57,0x36,0xc5,0x45,0xef,0x77,0xeb,0x57,0x5e,0x33,0xe4,0x7c,0xe9, + 0xbd,0x1c,0x92,0x3e,0xdb,0x6b,0x97,0x15,0xaf,0x8f,0x5a,0x25,0x5a,0x72,0xa1,0xe, + 0x91,0x77,0xcb,0xec,0xaa,0x9e,0x80,0x5c,0x52,0x34,0x5d,0x9d,0x63,0x5b,0x95,0xa, + 0x98,0x15,0xba,0xf2,0x99,0xa8,0xce,0x44,0xe7,0xd6,0xaf,0xf,0xbe,0x48,0x95,0x56, + 0xcc,0x61,0xe,0xc6,0x81,0x6e,0x21,0x6d,0x23,0xda,0x80,0x63,0x9a,0x4d,0x94,0xdb, + 0x64,0x37,0xa1,0x16,0x57,0xb0,0xf3,0x16,0xe7,0x3d,0x52,0xf8,0x59,0xa6,0xef,0xbf, + 0xca,0x89,0xcf,0xce,0xb7,0x78,0xb8,0x67,0x4b,0xaf,0x7d,0xb5,0x57,0xb7,0xc4,0xf3, + 0x43,0xb2,0x7b,0xa0,0xf7,0x3d,0x29,0xb2,0x89,0xb7,0x10,0x59,0xe8,0x87,0x2b,0x1, + 0xd5,0xa4,0x8,0xde,0x8f,0xe6,0xa9,0x6f,0xc6,0x2a,0xc4,0x34,0x32,0xb6,0xd5,0xc8, + 0x68,0x1,0x0,0x6d,0xc4,0xd7,0xe7,0x97,0x75,0x6e,0x93,0x6,0xef,0xd1,0x18,0xa7, + 0x39,0xce,0x80,0x93,0xd5,0x4b,0x28,0x46,0xb9,0x6d,0xdd,0xaa,0x9a,0x39,0xbc,0x67, + 0x50,0x4c,0xb2,0x3f,0x47,0xf4,0x6e,0x75,0x74,0x21,0xd1,0xac,0x55,0x91,0x29,0xf9, + 0x8a,0x65,0x63,0x87,0x81,0x52,0x2b,0x75,0xb3,0x11,0xe6,0x95,0x6e,0x3b,0x19,0xc0, + 0x73,0x86,0x58,0x6d,0xfe,0xda,0xe6,0xc0,0xe9,0x3d,0xd9,0x20,0x77,0xfc,0xda,0x3f, + 0xfe,0xd1,0xfb,0x6f,0xfe,0xe2,0x4f,0x7f,0x44,0xca,0xba,0x3e,0xe3,0x3c,0x23,0x1d, + 0x7d,0x90,0xaa,0xb1,0x69,0xd6,0xc,0x76,0x96,0xd5,0x68,0xac,0xab,0x14,0x52,0x49, + 0xef,0xd3,0x49,0xf,0x35,0xe7,0xf7,0xf5,0x3a,0x98,0x76,0x9f,0x1b,0x13,0xbe,0xd6, + 0x6c,0x73,0x2b,0xf1,0x84,0x11,0xcd,0xd6,0x4a,0x69,0xd,0xb3,0x5,0xa1,0x62,0x2b, + 0x57,0x8d,0xfd,0xcb,0x68,0x6a,0x4f,0xf2,0x93,0xcf,0x9a,0x31,0x4e,0x2,0x7,0x73, + 0x19,0x84,0xfa,0x96,0x38,0x32,0x61,0x26,0x9f,0xfa,0x60,0x49,0xe8,0xb5,0xc3,0xc7, + 0x74,0xd8,0x88,0x86,0x99,0x4,0x25,0xa,0x8a,0x5e,0x5c,0x5e,0x5f,0xff,0xf,0xa2, + 0x16,0xa9,0x96,0xcb,0x44,0xb2,0xf9,0xf,0xda,0x2c,0x97,0xce,0x11,0x67,0x40,0xcb, + 0x49,0x87,0x74,0x9e,0xc3,0xb8,0x5c,0x17,0x99,0xcf,0x8,0xdb,0x6d,0xbe,0x41,0xe6, + 0xe8,0xb1,0x44,0x45,0x60,0xc2,0x2b,0xd6,0x4c,0xf2,0x2e,0x9e,0x20,0x75,0x4b,0xcc, + 0x4a,0xac,0x3c,0x51,0x3e,0xca,0xf4,0x8c,0x1e,0x19,0x51,0x35,0xb9,0x38,0x74,0x4a, + 0xe9,0xd2,0xcc,0x60,0xc0,0x9,0x22,0xc0,0x42,0x96,0x59,0x61,0xef,0xdf,0xe5,0xea, + 0x93,0x6b,0xe2,0x84,0x93,0xd1,0xd6,0x6e,0xa7,0x55,0x85,0xd8,0x54,0x12,0x5d,0xd1, + 0x74,0x83,0x5a,0x1b,0x4d,0xcf,0x3c,0x22,0x94,0x4c,0x90,0x64,0xd5,0xbb,0x5,0xb8, + 0x7e,0x83,0x5a,0x3,0xb,0x5f,0x8a,0xbb,0x3d,0x46,0x20,0x8c,0x62,0x4b,0xae,0x1b, + 0x5d,0xaf,0xa9,0x7c,0xf2,0x8,0x60,0x6b,0xdb,0xaa,0xfe,0x3f,0xe9,0xf7,0x79,0xb5, + 0x95,0x58,0xed,0x77,0x20,0xda,0x17,0x66,0x78,0x3,0xd7,0xa0,0xa0,0xf8,0x50,0x9b, + 0xab,0x68,0x8c,0xe9,0xf2,0x8e,0x39,0x29,0xd6,0x85,0xb8,0xf7,0xcf,0xef,0xbe,0x74, + 0x53,0x4f,0x1c,0x46,0xd,0xde,0xf3,0x84,0x35,0x3c,0x83,0x4,0xc6,0x2a,0x6e,0xa7, + 0x6a,0xd7,0x5c,0xf7,0x41,0xec,0x2c,0xab,0x3a,0x61,0xa1,0x7a,0x55,0xd9,0x4e,0x33, + 0xc6,0xd4,0x1f,0x30,0x54,0xd2,0x92,0xe7,0xd,0x2a,0x56,0x4d,0x7f,0xb8,0xc2,0xdc, + 0xa5,0xdd,0x26,0x1a,0xfb,0x7b,0xcf,0x41,0x86,0x60,0x3f,0x7b,0x75,0x72,0x79,0x7f, + 0xa0,0x13,0x35,0x1c,0xdf,0xea,0x9a,0xce,0x9c,0x2a,0x1,0x31,0xa1,0x11,0x21,0x84, + 0x87,0x84,0xf1,0xf4,0x70,0x6c,0x81,0x6a,0x7e,0xf0,0x19,0x2c,0x4a,0x64,0x1f,0x23, + 0x82,0xf5,0xa,0x8c,0xe1,0x55,0x2c,0x3d,0xfd,0x65,0xa9,0x98,0x10,0x1e,0x26,0x7d, + 0xe7,0x9c,0xc9,0xa7,0x13,0xcf,0x3a,0x46,0x3d,0xb7,0x7d,0xcc,0xd0,0x12,0x42,0x86, + 0xc3,0x5c,0x2d,0x63,0x26,0x84,0xa1,0x7a,0x95,0xcd,0x30,0xf2,0xc0,0x21,0xf5,0x4c, + 0x27,0xb2,0x5c,0x4f,0x6c,0x2e,0x6c,0x5e,0x21,0x4c,0x9d,0xe5,0x4d,0x58,0xec,0xc5, + 0x7c,0xce,0xff,0x4f,0x6d,0x84,0xe4,0xda,0x8d,0xac,0xa9,0xa1,0x68,0x66,0x79,0x2, + 0xa1,0x2d,0x1f,0x9f,0xfc,0xc6,0xa,0x7e,0x40,0xe2,0xde,0x9a,0x90,0xf8,0xfc,0x2c, + 0xd1,0xc0,0x64,0x7,0xaf,0xe8,0x3,0x6e,0x7b,0x30,0x5,0xbd,0x52,0x54,0x64,0x4c, + 0xd7,0x16,0x87,0xa5,0x66,0x3a,0xf2,0x33,0xfa,0x96,0x81,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x65,0x6a,0x98,0xfb,0x5c,0xd8,0x5e,0xe8,0x8f,0x73,0xa2,0x57,0x8d, + 0xdc,0x48,0x5,0x7b,0xe2,0xc4,0x25,0x3,0xac,0x82,0x20,0xca,0x42,0xa7,0xb1,0x24, + 0x11,0x8c,0xf9,0xd,0xd7,0x4a,0x9b,0xa5,0x2,0xe6,0x2f,0x21,0x4e,0x2e,0x22,0xa2, + 0xf0,0x3a,0xe0,0xee,0x77,0x53,0x22,0xe8,0x3,0xe8,0x3b,0xb6,0xa5,0x47,0x7c,0xf2, + 0x94,0x9b,0x6d,0x6e,0x94,0xf0,0xdd,0xc9,0x32,0x70,0xa,0x6,0x6d,0x5d,0x9c,0xe6, + 0x18,0xd3,0x7,0xb6,0xf,0x1b,0xc4,0xae,0x2d,0x87,0xcc,0xa1,0xf,0xee,0x7a,0xb6, + 0x3f,0x2e,0xa9,0xe6,0xef,0x4,0xf3,0xb3,0x46,0xa2,0x26,0x45,0xbe,0x75,0x50,0x54, + 0x71,0xa4,0x46,0x91,0xee,0xfb,0xf3,0x94,0xb0,0xec,0x82,0x56,0x81,0xf8,0x1a,0x4c, + 0x31,0xb4,0x36,0x6d,0xfd,0xe3,0x51,0x8a,0x7b,0x21,0x63,0x18,0x44,0x8e,0x4a,0x92, + 0x14,0x8d,0x85,0x12,0x7,0x34,0x5d,0x99,0x8b,0x87,0x40,0x6c,0xa9,0x5c,0x27,0x32, + 0xf4,0xca,0xcd,0x52,0xdf,0x79,0x66,0x0,0x13,0x29,0x22,0x8,0x78,0x39,0xa,0x47, + 0x74,0xee,0xdc,0x94,0xc5,0x62,0xb3,0x83,0x7d,0x76,0x94,0xcd,0x1d,0x2a,0x21,0x56, + 0x8,0xb9,0x83,0x87,0xcd,0xd5,0x60,0xe7,0x2a,0x1b,0xd,0x9b,0xb2,0x34,0x36,0x4d, + 0x39,0xac,0x16,0xa5,0x2a,0x8f,0x92,0x9d,0x26,0x64,0xe,0x63,0x3c,0xb5,0x8c,0x31, + 0x90,0x3e,0x20,0xd6,0x9a,0xf4,0x19,0xf8,0x27,0x98,0x5e,0x7c,0x4a,0xb8,0xde,0x3a, + 0x49,0x1e,0x84,0x3c,0xdb,0x45,0x36,0xc,0x8b,0xd4,0xac,0x9a,0x16,0x7d,0x2a,0x64, + 0x59,0x29,0xd9,0xf2,0xaa,0xb8,0xe4,0x35,0x4e,0xb5,0x63,0xab,0x85,0x9b,0xc6,0x73, + 0x5b,0xde,0x22,0x99,0x6b,0xe3,0x59,0xbe,0xa6,0xbd,0x45,0x4a,0x9f,0x65,0x8e,0xbd, + 0xb1,0x2b,0xb9,0x69,0xbd,0x27,0x61,0x8b,0x41,0xd0,0x54,0x42,0x16,0x4c,0xfb,0x97, + 0x61,0xa4,0xb2,0xc7,0xc1,0xf6,0xec,0xbd,0x5e,0x97,0xda,0xca,0x5a,0xb,0xd8,0x88, + 0x2b,0xb4,0x1e,0x1f,0x73,0x16,0x5b,0x5a,0x78,0x9b,0xa3,0x44,0x57,0x52,0xe3,0x26, + 0x85,0x52,0xfa,0x95,0x29,0x7d,0xd9,0x26,0x5,0x6c,0x59,0x6c,0xd,0x0,0xf3,0x2f, + 0x6f,0xc4,0xae,0x6a,0x2e,0x6c,0x49,0x99,0xe9,0x1,0xc3,0x8b,0x1a,0xad,0xc0,0x9b, + 0x2,0x58,0x85,0xf9,0x4b,0x1e,0x49,0xc2,0x27,0x61,0x3b,0xf9,0xa4,0x25,0x54,0x4a, + 0x86,0xa3,0x1c,0xda,0x9c,0x8f,0xce,0xf1,0xf8,0x43,0xd7,0x9,0xb0,0xbe,0xae,0x92, + 0x7e,0x18,0x67,0x88,0xcc,0xc4,0xd3,0x5b,0xa3,0xeb,0xe4,0xba,0x6a,0x76,0x92,0x56, + 0xa4,0xf,0xc1,0xc1,0x69,0x44,0x69,0xf1,0xa1,0xc8,0x6e,0xf,0x47,0x8d,0xca,0x9a, + 0x6c,0x68,0x58,0x5e,0x90,0xac,0x7a,0xbd,0x11,0x37,0xb9,0x10,0x1b,0x17,0xe3,0x2f, + 0x27,0x28,0x2e,0x45,0xca,0x9b,0xab,0xc5,0x89,0xae,0xa9,0x52,0x2b,0x83,0xd4,0x71, + 0xe8,0xb1,0xff,0xe5,0xdf,0xfd,0x7f,0xde,0xab,0xaa,0x7e,0xe7,0x97,0x7f,0xf6,0x83, + 0x6a,0xd9,0xa1,0x7a,0x1d,0xc,0xd,0x8f,0x20,0xb5,0xa2,0xa2,0xdc,0xcf,0x9e,0xc4, + 0xfd,0x95,0x6f,0xa3,0x85,0x93,0xc1,0x96,0xad,0x41,0xd4,0xd4,0xda,0x58,0xd9,0xdb, + 0x83,0x5,0xb0,0x9,0xee,0x73,0x36,0xb3,0x43,0xf8,0x27,0xb9,0x6a,0x44,0x1f,0x7d, + 0x2c,0xf4,0xe1,0xd9,0xe2,0xde,0x9c,0xac,0x36,0xe6,0x1,0x8c,0x62,0xe,0x7c,0xd1, + 0xdf,0x65,0xcd,0xd2,0xae,0x67,0x6,0x55,0x4a,0x9a,0x5c,0xb,0x6,0x53,0x13,0x83, + 0x21,0xf7,0x10,0xff,0x69,0xe,0x92,0xa1,0x5d,0x2,0x7,0xa9,0x59,0x1f,0xa3,0x6a, + 0x4f,0x86,0x98,0x42,0x38,0x4b,0xe3,0xbd,0x42,0xea,0x90,0x6c,0x4d,0x7,0xd8,0x61, + 0x1e,0x89,0x5b,0x85,0x44,0x78,0x5c,0xdb,0x5e,0xcc,0x4a,0x53,0x63,0x74,0xa,0x38, + 0x64,0xde,0x74,0x71,0xcd,0x25,0x31,0xca,0xde,0x12,0x56,0x7,0x2c,0x3e,0x41,0xa4, + 0x8c,0x39,0x6a,0xc7,0x83,0xf8,0xd,0x18,0x14,0x47,0xca,0xbd,0x77,0xb3,0x4,0xa6, + 0x1f,0xfb,0x6a,0x2b,0xe8,0xa1,0x51,0x1,0x73,0x3e,0x41,0x53,0xe,0x48,0x39,0xbc, + 0x9e,0x83,0x6c,0x38,0xf7,0x84,0x30,0x8d,0xc6,0xd0,0x4d,0xdd,0x9d,0x7,0x62,0xe6, + 0xe0,0x7b,0xde,0x40,0xa9,0x9,0x3e,0x3e,0xac,0xfd,0x6e,0x88,0x85,0xa3,0xd1,0x95, + 0x4d,0x22,0xa8,0xdb,0x18,0x3a,0x82,0x61,0x13,0x32,0x88,0x14,0x4b,0x39,0x10,0x83, + 0x11,0x48,0xb6,0xf7,0xf4,0xa0,0x20,0x3b,0xc1,0x12,0xa6,0xd5,0xef,0x81,0x8d,0xb2, + 0x7f,0x34,0x79,0x48,0x1,0x9f,0x47,0x1e,0x15,0xad,0xc5,0x34,0x7,0xf3,0x89,0x6f, + 0xd1,0x44,0x58,0x30,0xec,0x6b,0x38,0xe4,0x5c,0xed,0x9d,0x73,0x51,0x4,0x23,0x9d, + 0xaa,0xf7,0x5,0xbb,0xcc,0xb1,0xc7,0x75,0xf,0xca,0xc3,0x3d,0x58,0xc4,0x44,0x7a, + 0xcc,0x0,0x7b,0xe2,0x94,0x1,0xb2,0xf7,0x67,0x39,0x34,0x34,0xb5,0xef,0x79,0x98, + 0x9f,0x4b,0x7b,0x85,0xc9,0x2f,0xa0,0x15,0x8f,0x74,0x67,0xc7,0x9c,0xde,0x60,0x75, + 0x2d,0x8,0x3d,0x43,0xe3,0xa8,0x5d,0x3c,0xa4,0x9,0xb6,0xb6,0x8c,0xf9,0x4b,0xec, + 0x85,0x9f,0x55,0xff,0xf3,0xaf,0x7c,0xef,0xe3,0x2f,0xfd,0xc3,0x1f,0xbe,0xeb,0x39, + 0x5c,0x36,0x1,0xc5,0xba,0x6e,0x68,0xdd,0x99,0x7f,0x21,0x81,0x4e,0x9c,0xb,0x56, + 0xde,0x8a,0x13,0x68,0x40,0xc1,0xc0,0x32,0xcd,0xc5,0x69,0xa2,0xf,0x32,0x96,0x16, + 0xc,0xa5,0xa4,0xed,0x1b,0xd3,0x11,0x30,0xab,0xc2,0x34,0xb7,0xaf,0xe1,0x0,0x46, + 0x40,0xee,0xee,0x9b,0x1d,0xac,0xed,0x55,0x3d,0xb0,0x93,0x46,0x6c,0xae,0x36,0x2c, + 0xf4,0x1a,0xc1,0x45,0xd1,0xef,0x7d,0x48,0x35,0x46,0x36,0x10,0x2a,0x5c,0x52,0xa5, + 0xc1,0xfb,0xed,0x8d,0x15,0x29,0x3e,0xd0,0xe6,0xbf,0x7e,0x7,0x24,0x13,0xbf,0x88, + 0xa4,0x64,0xb5,0x4c,0xcc,0xe6,0xb3,0xba,0x28,0x2,0x5c,0x6c,0x66,0xc3,0x5a,0x52, + 0x69,0x71,0x5b,0x76,0x42,0xa0,0x77,0xc2,0x33,0x42,0x85,0xed,0xdd,0x98,0x86,0x1, + 0x8a,0xd3,0x8,0x8c,0x7a,0xaf,0xd5,0x8,0x6,0x3a,0xf7,0x3d,0x55,0xed,0x2a,0x16, + 0x2,0x65,0x74,0x3b,0x11,0x6,0x49,0x18,0x97,0x9,0x1,0x37,0xfe,0x42,0x8c,0x9c, + 0x5e,0x5b,0xab,0x3c,0xe0,0xf2,0x2a,0x31,0xf4,0xd1,0x14,0x6d,0xcd,0x8b,0x5f,0xe, + 0x75,0x86,0x4c,0xa7,0x55,0xf0,0x6d,0x9f,0x65,0x17,0x5,0xc1,0xca,0x85,0x23,0x24, + 0xb5,0x65,0x29,0x73,0x14,0xb7,0xd0,0x7b,0x6b,0xe5,0x64,0xf0,0x2e,0x96,0x52,0x18, + 0x28,0x26,0x30,0xef,0xf2,0x13,0xdb,0xbe,0xcf,0x58,0x27,0x63,0xcc,0x39,0x34,0x93, + 0xbc,0x73,0xff,0xb5,0x9b,0x50,0x6b,0x53,0x23,0xe6,0xfa,0xb6,0xfd,0x12,0xcb,0x8c, + 0x9d,0x36,0xb1,0x15,0x27,0xc2,0x21,0xd1,0x59,0xf7,0xb6,0x86,0xb7,0xd6,0xc4,0xe2, + 0xe6,0xc0,0xf5,0xbf,0xdd,0xe0,0xa3,0xb3,0xb2,0xbd,0x65,0x34,0x88,0x64,0xc1,0x67, + 0xfb,0xd1,0x88,0x90,0x18,0x61,0xe4,0x66,0x75,0x8a,0x81,0x99,0xd6,0xe6,0xfc,0xa7, + 0x96,0xa3,0x57,0x7f,0x36,0xb,0x3d,0xc4,0x51,0x30,0x9,0x81,0x38,0x60,0xcc,0x27, + 0x93,0x9d,0x2b,0xdc,0xe9,0x4,0x5e,0x17,0xbd,0xa,0x85,0xdb,0x5f,0xa,0x95,0xd1, + 0xf5,0x27,0xfa,0xad,0xc0,0xb,0x24,0xb8,0xfa,0xd4,0xc,0x72,0x7d,0xc8,0x7a,0xa, + 0xf6,0xb4,0xe,0x68,0xe4,0x19,0x51,0x7,0xe,0xac,0x9e,0xbd,0xd6,0x43,0x4f,0x2, + 0xa0,0x92,0x5b,0xaf,0x8e,0xac,0x28,0x39,0x77,0xfc,0x5e,0x54,0xbd,0x4d,0xe6,0x12, + 0xa4,0x13,0xdc,0x4c,0xe0,0x2f,0xe6,0x4b,0xd5,0x31,0x48,0x7b,0x67,0xa,0x7b,0x70, + 0xa8,0xae,0x17,0x7a,0xf8,0x54,0x2d,0x54,0x88,0x2e,0x34,0xb2,0xdb,0x48,0xc8,0xae, + 0x64,0x38,0x12,0x63,0xb6,0xd1,0x2,0x3,0x1a,0x2e,0xba,0x25,0x24,0x38,0x41,0xeb, + 0x5a,0xfd,0xb0,0x59,0x5,0x9a,0xb6,0xb0,0x55,0x4,0x94,0x91,0x3a,0x38,0x4f,0x8d, + 0xe,0xc9,0x72,0xc8,0x18,0x31,0x58,0xb1,0xa4,0x5,0xa8,0x39,0xc3,0x25,0xe9,0x2f, + 0x46,0x85,0x9e,0x1e,0x3a,0xb1,0xfb,0xe9,0xda,0xfb,0x1,0x83,0xc1,0xaa,0x15,0x7a, + 0x3,0xf1,0x3c,0xfb,0xcc,0x9a,0xbd,0x84,0x38,0xc9,0x48,0xaa,0x1e,0x95,0x23,0x4c, + 0x91,0x6,0x53,0xcd,0x8,0xab,0x64,0x13,0xe2,0x45,0xf3,0xaf,0x94,0xfe,0x6a,0x94, + 0x99,0xee,0xe7,0xe6,0xa4,0x4f,0xa4,0xdc,0xe4,0x9a,0xff,0x1d,0x2a,0x9f,0x6b,0xb0, + 0xec,0xbc,0xc4,0xe5,0x4a,0xdc,0xce,0xc,0xa8,0x22,0x7,0x60,0x4b,0x2d,0x56,0x39, + 0x42,0x8a,0x39,0xed,0xae,0xd5,0xd7,0x42,0x32,0x10,0x55,0x13,0x4e,0xf3,0xe6,0x94, + 0x3d,0x24,0xa3,0x2c,0xee,0xe2,0x20,0x4,0xaa,0x3a,0xd0,0xad,0xd9,0xd9,0x0,0xb1, + 0x47,0x4d,0xca,0xb2,0x86,0x8a,0x2f,0xda,0x8,0xd1,0x3,0x8,0x94,0x30,0xd,0x63, + 0x30,0x76,0x4d,0x91,0xf6,0xc2,0x89,0x8f,0x8e,0x56,0xa5,0xf3,0x21,0x9f,0x45,0x81, + 0xd9,0x4e,0x3e,0x8e,0xb1,0xcd,0xd6,0xb7,0xda,0x58,0x9d,0xb9,0xac,0x64,0xb,0xb2, + 0x11,0x71,0x9b,0x70,0xc0,0xb7,0xf5,0x1b,0x52,0x90,0x85,0xe9,0x31,0x94,0xd6,0x1d, + 0xb9,0xf6,0x27,0xcb,0xed,0x59,0xb6,0xc,0x60,0xac,0xbe,0xbe,0x1e,0x68,0x9d,0xf4, + 0xa9,0xec,0xd7,0x62,0xb3,0x41,0x21,0x5b,0x12,0xba,0xa1,0xf9,0xa8,0x6c,0xa4,0xa1, + 0x41,0x26,0x2e,0x1d,0xeb,0xed,0xc3,0xee,0x9f,0xfc,0xac,0xf1,0xf4,0x30,0x29,0xf2, + 0xee,0xe,0x7e,0xfd,0xaa,0x5f,0xf9,0x9d,0x1f,0xbc,0xff,0x83,0xbf,0xf8,0xbd,0x8f, + 0x9,0x13,0x35,0xcd,0xe,0x6d,0xe0,0x3d,0x5a,0xed,0xf7,0xa5,0xfd,0xca,0xef,0xfc, + 0xf0,0xfe,0xc,0xd4,0x3f,0xf8,0x4b,0xdf,0xfb,0x40,0xca,0x6c,0xaf,0xa4,0x54,0x3e, + 0x27,0x4d,0xc4,0x42,0xb9,0x54,0x5b,0x58,0xea,0x3e,0xca,0x52,0xa5,0xb8,0x1,0xe2, + 0xdc,0x6d,0xed,0xd,0x57,0x13,0xd5,0x33,0x65,0x71,0x61,0x2,0xba,0x84,0x5e,0x9b, + 0x88,0x51,0x32,0xa1,0x92,0x57,0x10,0xba,0x5,0x91,0x99,0x27,0x41,0x9,0xd5,0x6, + 0x8f,0x5a,0xff,0xb9,0x8f,0xa1,0x86,0x2f,0xb9,0x4a,0x7b,0x8e,0xa2,0x0,0x5a,0x21, + 0xe5,0xcc,0x34,0xe6,0xd,0xa6,0x6,0x5,0xc9,0x2b,0x43,0x2d,0x5,0x29,0xcd,0xe2, + 0x39,0xe0,0x96,0x48,0xa2,0x44,0x4d,0x99,0x7b,0x6f,0x83,0x30,0xe5,0x40,0xab,0xf7, + 0xd0,0x11,0x73,0xcf,0xb0,0x19,0x75,0x95,0x13,0x74,0x49,0x59,0x4e,0xbd,0xff,0x46, + 0x91,0x44,0xb,0x48,0xe0,0x44,0x42,0x8b,0xdf,0x86,0xe1,0x90,0x56,0x6d,0xf2,0x21, + 0xa9,0xe8,0x82,0x7,0x49,0xaa,0x73,0xe5,0xc2,0xe4,0x2a,0xea,0x88,0x11,0x86,0x91, + 0x97,0xa1,0xc4,0x15,0x98,0x7f,0xe9,0x4,0x8b,0x98,0x4d,0x54,0x87,0xd3,0x68,0x16, + 0x1f,0xf4,0x65,0x20,0xe3,0xe1,0x90,0xe6,0xcb,0x6f,0xb9,0x4c,0xa2,0x39,0x9f,0x3f, + 0x3c,0xd3,0x1d,0x49,0x37,0x15,0xa4,0xc7,0x6b,0xb0,0x99,0xad,0x2e,0xac,0x15,0xd5, + 0xe6,0x74,0x9b,0x80,0xd9,0x37,0xbc,0xad,0x6a,0x31,0xcb,0x40,0x6b,0x81,0x75,0xc4, + 0x6e,0x1a,0x4d,0xec,0xb3,0xd0,0xb9,0x6,0x86,0xf5,0x61,0x85,0x19,0x6,0x49,0xd3, + 0x90,0x10,0xc5,0x30,0xf6,0x16,0xbf,0xd7,0x66,0xe0,0xa1,0x4e,0x72,0x15,0x92,0xac, + 0x7e,0xff,0x56,0xea,0xd5,0xa4,0x51,0x5d,0xd2,0x3a,0xd5,0xdd,0x50,0x9d,0x64,0x48, + 0x60,0x46,0x47,0x67,0x1a,0x5a,0xff,0x1c,0x3b,0xfb,0x65,0x3f,0xeb,0xb3,0x46,0x22, + 0x61,0x8f,0xe0,0x98,0x90,0xce,0x82,0x4c,0xac,0x44,0x63,0xb5,0x6b,0x36,0x1d,0x8, + 0xe8,0x1c,0x79,0x90,0xd7,0x42,0xab,0x7f,0xfb,0x2b,0x28,0x77,0x4,0xad,0xb2,0x27, + 0x2b,0x24,0x54,0xb5,0x35,0x87,0x4e,0xbd,0xa,0x5d,0x3,0xa,0x3f,0x2,0xe5,0xc8, + 0x60,0xe1,0xda,0xe7,0xa8,0xfe,0x1d,0x3c,0x18,0xaf,0xcf,0x50,0xcf,0x82,0xfb,0x7b, + 0xff,0xe1,0x5f,0xf9,0x53,0x1f,0xbf,0xf2,0xdb,0x3f,0x78,0x57,0x2b,0xd6,0x2a,0x27, + 0x0,0x22,0xc6,0x99,0xb,0x1d,0x95,0x85,0x3c,0x7f,0x0,0x75,0x51,0xe1,0x90,0x80, + 0x71,0x77,0x26,0x77,0x55,0x3f,0x2e,0x31,0x6f,0xe6,0x60,0xec,0x62,0xb2,0xd0,0xc3, + 0xd4,0x5f,0xba,0x5f,0x7b,0x45,0xff,0x5b,0x59,0x9e,0x31,0xbb,0xcd,0xaa,0x79,0x26, + 0x6f,0xe8,0xf7,0x79,0x20,0xc2,0x6c,0xe4,0x66,0x7,0xb1,0x9f,0x48,0xc,0xe8,0xcf, + 0x32,0x50,0x71,0xca,0xda,0xfb,0x9a,0x7d,0x13,0xa1,0x33,0xc1,0xdd,0xb0,0x60,0x57, + 0xe3,0xc,0x85,0xae,0xc2,0xf0,0xcf,0x40,0x8c,0x4e,0x5,0x7c,0xf8,0x29,0xaf,0x93, + 0xf9,0x47,0x85,0xe7,0x15,0x52,0xda,0x7d,0x77,0x76,0x3f,0x6c,0xc,0xbc,0xef,0x26, + 0x75,0x3a,0xb0,0xa6,0xc7,0x49,0x83,0x43,0xf3,0x35,0x45,0x38,0x2,0x93,0x6,0x26, + 0x98,0xed,0x0,0x23,0x4e,0xee,0x56,0x38,0x54,0x80,0x3c,0x9f,0xd9,0x3e,0x2f,0x5d, + 0xd5,0xa7,0x1d,0x34,0x5b,0xbb,0xfa,0xf9,0xa9,0x68,0x1,0x53,0x2e,0x37,0x6c,0x1b, + 0x6d,0xfd,0x4e,0xd2,0x98,0x87,0xfb,0x86,0xc3,0x99,0x3d,0xb4,0xd1,0xd8,0x48,0x9a, + 0xd5,0x9c,0xf1,0x74,0x6a,0x0,0x56,0x40,0x87,0x1f,0xb3,0x48,0x21,0x2b,0xd9,0xca, + 0x5c,0xdb,0xe2,0xc6,0x52,0x61,0x75,0x25,0x20,0x42,0x35,0x25,0x74,0x3c,0xca,0x93, + 0xa4,0xc9,0xc1,0xee,0x99,0xd5,0xe1,0x2a,0x5f,0xe8,0x5a,0xe6,0xe8,0xf3,0x11,0x26, + 0xa5,0x6b,0x57,0xcf,0xd1,0x76,0xb6,0x94,0xb,0x61,0xe2,0x2b,0xe,0xa5,0xab,0xb5, + 0x27,0xcd,0xc1,0x8b,0x7e,0x46,0xaa,0x9e,0x7e,0x6b,0x53,0x38,0xbb,0xbc,0x31,0xa5, + 0x63,0x20,0x84,0xd9,0xf5,0xc8,0x75,0x94,0xfe,0x19,0x70,0x76,0xb6,0xe7,0x94,0xe8, + 0xf9,0xf5,0x30,0x3e,0xab,0xcc,0x77,0x6d,0xbf,0xad,0xb6,0x68,0xb8,0xa8,0x6d,0xf4, + 0x17,0xc1,0x5,0x91,0x62,0x63,0x98,0x3c,0x50,0xee,0xb,0x1f,0x2d,0x93,0x74,0x2b, + 0x46,0x4f,0xc0,0x0,0xe9,0xed,0x27,0x83,0x18,0xd5,0x7d,0x32,0x52,0xfb,0xe3,0x3e, + 0xb,0x29,0xfc,0x95,0xe7,0x79,0x81,0xdc,0x8a,0x6f,0x48,0xf,0x88,0xfd,0xac,0xfe, + 0xcb,0xdf,0xfa,0xc1,0xfb,0xef,0xfe,0xea,0xcf,0x7d,0xe4,0xa4,0xd2,0x2a,0x53,0x3e, + 0x7b,0x8b,0xa0,0x4b,0x33,0xd7,0x1,0xb5,0xe8,0x32,0xc9,0xac,0xaa,0x37,0x14,0x1b, + 0x21,0xdd,0x4c,0x26,0x20,0xda,0x35,0x74,0x72,0x89,0xcd,0x28,0xee,0x74,0x64,0xc1, + 0xb9,0x66,0x50,0x30,0xb1,0xd5,0x19,0xce,0x50,0x46,0x52,0xaa,0x18,0xc,0x77,0x57, + 0x2f,0x23,0x3f,0xc,0xd0,0x60,0x15,0xea,0x97,0x7f,0xeb,0x87,0xef,0x55,0x55,0xff, + 0xeb,0xaf,0xfd,0xec,0x47,0x25,0xe4,0x68,0xce,0x18,0x4c,0xd9,0x39,0xf7,0x44,0x3f, + 0x42,0xdb,0x83,0x21,0xfc,0x84,0x81,0x9d,0x54,0xb5,0x54,0x28,0x80,0xd9,0xd3,0xb, + 0x28,0x32,0x74,0x7d,0x99,0xf6,0xa4,0x4a,0x70,0xab,0xaa,0x5f,0xfe,0xad,0x1f,0xbe, + 0xff,0xee,0xaf,0x7d,0xef,0xe3,0xf9,0xaa,0xdf,0xfd,0xb5,0xef,0x7d,0xfc,0xf2,0x6f, + 0xfe,0xf0,0x9d,0x86,0xdb,0x94,0xf7,0x38,0xa9,0xf3,0x9b,0xe1,0xd5,0x9e,0xb0,0x64, + 0xcc,0xaf,0xaf,0xcf,0x1c,0x50,0x43,0x75,0x6e,0x53,0xe2,0xdb,0x62,0xfc,0xd3,0xa1, + 0xb9,0x33,0xd9,0x90,0x35,0x5a,0xd3,0xcd,0x74,0xdb,0x9a,0xdd,0xe9,0xd4,0xd,0x8a, + 0x51,0xf1,0x9f,0xdc,0x4,0x2b,0x9d,0x87,0xcf,0xa8,0x6d,0xe5,0x38,0x98,0x48,0x27, + 0xc3,0xc9,0x7d,0x6b,0x8d,0x5f,0xfb,0x3e,0xb8,0x65,0xa7,0x3a,0xc7,0x9,0x24,0x27, + 0xd0,0x21,0x6d,0x8e,0xdf,0x95,0xc1,0x1a,0x98,0xbf,0x5c,0xb4,0xca,0xe6,0xa4,0x4b, + 0x89,0xab,0xcf,0xcc,0xb2,0x7d,0xf6,0x46,0x20,0xb6,0x34,0x33,0x4,0x51,0xe6,0x7d, + 0xd8,0x26,0x4b,0x99,0xd1,0x1b,0xf7,0xb6,0x9a,0xa2,0xd2,0xce,0x67,0xd0,0x35,0xde, + 0x45,0x94,0x18,0x1e,0xdf,0x4e,0xaa,0x45,0x20,0xeb,0x49,0x2,0xf3,0x9e,0xfb,0xd7, + 0x1e,0xbf,0x76,0x42,0xc0,0xde,0x15,0x40,0xd2,0xba,0xad,0xa5,0x24,0x73,0xc4,0xaa, + 0xf2,0xa8,0xce,0x65,0xc3,0xec,0xfe,0x38,0xeb,0x74,0xff,0xc1,0x5f,0xf8,0x7b,0x3f, + 0x78,0xaf,0xaa,0xfa,0x47,0xbf,0xfe,0x73,0x1f,0x2c,0xda,0x39,0x78,0x9c,0xb5,0xe, + 0x7f,0xf9,0x2f,0xa5,0x48,0xf3,0xa1,0x2b,0x93,0x66,0x35,0xb7,0x45,0x87,0xbd,0x51, + 0xee,0xb4,0xa8,0x2d,0xb0,0x74,0x80,0xdb,0xae,0x74,0xb0,0xb5,0xc8,0x9,0xc1,0x79, + 0xae,0xab,0x64,0x2,0xa5,0x37,0x19,0x5b,0x46,0xac,0xa2,0x2b,0x36,0xb5,0x61,0x73, + 0xfa,0x9,0x7f,0x6b,0xde,0x4d,0x91,0x35,0x77,0x26,0x3a,0x12,0xf1,0xd3,0x64,0x84, + 0xd5,0x39,0x20,0xb5,0xf9,0xaf,0x7b,0x72,0x86,0xa3,0x21,0x38,0xb3,0x7b,0x47,0xfa, + 0xc,0xff,0xd2,0x6b,0x1d,0x98,0xfd,0x1a,0xf3,0x0,0x6b,0x2b,0xd4,0xa9,0x55,0xcc, + 0x12,0xb7,0x35,0x4,0x44,0x28,0xa3,0x2b,0x3b,0xcd,0x42,0x8c,0xd1,0xc,0xbd,0xaf, + 0xf4,0x71,0x56,0x58,0xd7,0x1d,0x46,0x5c,0x32,0x31,0x58,0x6d,0xb6,0x70,0x78,0x90, + 0x58,0x2c,0xcc,0x5e,0xd6,0x32,0x87,0xed,0x4a,0x3f,0xfe,0x1e,0x8c,0xa6,0x33,0x72, + 0x2d,0xda,0x5f,0x18,0x2d,0x59,0x7,0xf7,0xb7,0x74,0xc1,0x69,0x66,0xc6,0x87,0x8a, + 0x31,0xe2,0x99,0xb,0xb4,0x48,0x0,0x9e,0xde,0x97,0xac,0x28,0x51,0x89,0xd3,0x79, + 0xe6,0x75,0x3f,0x4e,0x4c,0xf9,0xdb,0xd0,0x65,0xd6,0x96,0x19,0xd4,0xf8,0x1e,0xa5, + 0xa9,0x2b,0x4c,0x14,0x52,0x89,0x2b,0x3,0x6c,0x5a,0xc,0x5d,0x8a,0xd1,0x4c,0x33, + 0xdb,0xc,0xe,0x43,0x2e,0x17,0x47,0x47,0x12,0x82,0x87,0x40,0x98,0x5d,0x31,0x5a, + 0x5a,0x3,0x70,0xfb,0x1b,0x5f,0x4e,0xb1,0x4e,0x80,0x80,0xd,0xb7,0xdf,0x1,0xd0, + 0xe7,0xd6,0x31,0xea,0xc0,0xc6,0x64,0x3a,0x60,0xc0,0x6,0x27,0x29,0xd8,0x27,0x6f, + 0xa2,0x13,0xe8,0x94,0x18,0x9a,0x5b,0x96,0x49,0x1e,0xdc,0x8c,0x83,0x7a,0x64,0x5f, + 0x41,0x45,0x7d,0x36,0x2b,0x1f,0xc6,0x69,0xb9,0xc2,0x8c,0x46,0xaa,0x14,0x66,0xeb, + 0x4d,0xaf,0xfd,0x6a,0xce,0x72,0xa5,0x7a,0xef,0x43,0xcf,0xbe,0xdb,0x5a,0xde,0x33, + 0xde,0xc,0x27,0x38,0x15,0x84,0x19,0x98,0x8,0x6d,0xd2,0xc0,0x66,0x92,0x93,0xbf, + 0x21,0xe,0x6f,0x26,0xe,0xc2,0x68,0x19,0x21,0x8c,0x43,0x3b,0xe2,0xc2,0x3,0x6a, + 0xb6,0x9e,0x33,0x52,0x66,0x78,0xde,0xa7,0x50,0x2d,0x86,0x38,0x44,0x1,0x15,0x36, + 0x61,0x79,0x5a,0x9a,0xa4,0x3b,0x1d,0x69,0x43,0xc0,0xea,0x58,0xea,0xbf,0x49,0xa8, + 0x6b,0x8c,0xc,0x74,0xeb,0x6b,0x84,0x4b,0x61,0xde,0x53,0x86,0x16,0xc1,0x42,0x33, + 0x1f,0x5b,0xe6,0x36,0xfd,0x70,0x68,0x6b,0x26,0x30,0xa5,0xc8,0xe,0x9a,0x6a,0xc8, + 0xf9,0xec,0xa,0x74,0x51,0x35,0x50,0x4c,0xa6,0xe4,0xf3,0xd0,0xaa,0x1,0xea,0x1f, + 0xfd,0xfa,0xcf,0x7d,0xfc,0x85,0xef,0xff,0xdf,0xef,0x65,0xc4,0x55,0x3d,0xea,0xaf, + 0x8d,0x8a,0xb2,0x44,0x23,0x45,0x4e,0xde,0xcf,0xea,0x42,0x56,0x72,0x2c,0x5b,0xd7, + 0x31,0xb4,0x51,0x3a,0x2,0xf7,0x48,0xbf,0xca,0xa6,0xee,0xf7,0xe0,0xab,0x5f,0x70, + 0x50,0x94,0xf1,0x3,0xfc,0xe0,0xc8,0x86,0xa8,0x8b,0x9a,0xdc,0x6b,0xf6,0x25,0x27, + 0x17,0xa0,0xb5,0xa0,0xe9,0xfd,0x32,0xcd,0x7e,0xb3,0xf,0x13,0x46,0xf2,0x1c,0x18, + 0x8d,0x6c,0xce,0xd2,0x7,0xf2,0x8e,0x9,0x2e,0xe8,0xd0,0xbf,0x3b,0xf3,0x20,0x12, + 0x11,0x48,0x75,0x6a,0xe2,0x31,0xcd,0xe6,0x93,0x2b,0x40,0xa2,0x20,0x22,0x1e,0x68, + 0x26,0x8a,0x36,0x21,0x32,0x8,0x6e,0x2c,0x31,0x88,0x38,0x3d,0x29,0x2c,0x4b,0x64, + 0x62,0xf3,0x5c,0xf,0xab,0xfe,0xb7,0xff,0xe6,0x4f,0x7d,0xfc,0xd2,0xf7,0xbf,0x90, + 0xd,0xef,0x8b,0x75,0x34,0xfd,0x97,0xfe,0xa7,0x1f,0xbc,0xff,0xd2,0xf7,0x7f,0xf0, + 0xae,0x28,0xc,0xd5,0x5e,0x53,0x19,0xd9,0xed,0xa0,0x73,0x21,0x12,0x19,0x38,0x68, + 0xd4,0x2b,0xd,0x9e,0x96,0x60,0x57,0x2a,0x90,0x21,0xd4,0xa0,0x9c,0x7b,0xf5,0x30, + 0xf8,0x15,0x46,0x27,0x36,0x22,0xb1,0xd8,0xf6,0xf1,0xf7,0x64,0xd5,0x8,0x6,0x99, + 0x1f,0xb5,0xa4,0x7,0xa,0x58,0xa8,0x61,0x89,0xe8,0x2e,0x9b,0x95,0x68,0x70,0x14, + 0xd6,0xff,0x12,0x21,0x9b,0x1b,0x86,0x7,0xd9,0x62,0x49,0xbb,0x4d,0x73,0xa4,0xa3, + 0x8b,0x6c,0xb4,0xce,0x46,0x84,0x38,0x49,0xec,0x9,0xf5,0x7b,0x97,0x35,0x6a,0xa6, + 0x39,0x30,0x8,0x39,0xb8,0x64,0x8d,0x59,0x91,0xbd,0x5e,0x84,0x27,0x3a,0xac,0x65, + 0xc7,0x95,0xd4,0x21,0xa4,0x47,0x77,0xd5,0x49,0x53,0x13,0xe8,0x2,0x53,0x68,0xf4, + 0x2a,0xaf,0x43,0x50,0xae,0x12,0xee,0x8a,0xe1,0xaa,0x72,0x46,0xa9,0x96,0x47,0x38, + 0x54,0x7b,0xeb,0x15,0x3c,0x14,0x95,0x24,0x7d,0xce,0x29,0x9b,0x12,0x71,0x36,0xb4, + 0xf5,0xdb,0x5f,0x58,0x5a,0xa3,0xc9,0x4f,0x57,0x13,0x3d,0xc2,0x70,0x8e,0x23,0x8d, + 0xd9,0x30,0x7b,0x2b,0x70,0xe2,0x26,0x60,0x18,0xd5,0x38,0x2a,0xed,0xe,0x37,0xc, + 0x10,0xc4,0x28,0xe,0x86,0x10,0xe6,0x79,0x61,0xac,0x10,0x88,0xc7,0xac,0x80,0xd6, + 0xb9,0x3a,0x8a,0x7e,0x6,0xe2,0xf8,0xec,0x4d,0xe,0xb1,0x4a,0x93,0x1d,0xd6,0x90, + 0x88,0x8,0x4a,0x71,0xbf,0xff,0xa,0x7b,0x60,0x63,0xca,0xb3,0xc6,0xe2,0xb7,0x1e, + 0xae,0x8c,0x7d,0xbf,0xdb,0x33,0x82,0x95,0x3d,0xb1,0x7a,0xeb,0xe6,0xf4,0x51,0x8c, + 0xb2,0x2,0xbe,0x4c,0xe1,0xc,0x8c,0xf8,0xd1,0x23,0x92,0x41,0x69,0x96,0x2c,0xe6, + 0xb7,0x42,0x98,0x12,0x94,0x18,0xb8,0xa5,0x7b,0x17,0xf8,0xec,0x23,0x15,0x26,0xa2, + 0x2,0x37,0x1b,0x96,0xf4,0x6a,0x34,0xc8,0x58,0x52,0x51,0xa8,0xf0,0x4a,0x6b,0x34, + 0x55,0xb5,0xc3,0xc6,0x21,0xaf,0x7d,0xa3,0xa9,0x12,0x8b,0xa6,0xc3,0x3,0x53,0x76, + 0x55,0xe2,0x85,0x32,0x32,0x53,0xb5,0x8f,0x1a,0x98,0x5,0x4e,0x57,0x49,0x43,0x86, + 0x45,0xa9,0x2a,0xbe,0x3d,0x87,0xd4,0x9a,0x69,0xff,0x9c,0x2b,0x73,0x6,0x59,0x70, + 0x3b,0xb3,0xc1,0x46,0x29,0xc8,0x12,0xd8,0x58,0x18,0xf3,0x70,0x3f,0x8a,0x84,0xbf, + 0x29,0xd5,0xa7,0xb9,0x92,0xb1,0x9a,0x20,0x8c,0xeb,0xec,0xf,0xda,0x56,0x51,0x41, + 0xb5,0x75,0xa9,0xb0,0xf6,0x23,0x70,0x81,0xa4,0xc,0xf,0xfe,0x22,0x39,0x73,0x5c, + 0x89,0x88,0xd0,0x92,0x23,0xe5,0x74,0x2c,0x38,0x32,0x5,0x40,0xf2,0x40,0x61,0x99, + 0x68,0x7,0x2f,0xc6,0xba,0x40,0xb7,0xe,0xb6,0xde,0xa0,0xf,0xe1,0x22,0x7b,0x99, + 0x6,0xe5,0x57,0x83,0xf2,0x28,0xb0,0xa5,0x33,0xb3,0xe1,0xd5,0x6e,0x85,0x9c,0x33, + 0x85,0x49,0x7b,0xc3,0xf6,0x8f,0x84,0xa9,0x2a,0xb0,0x51,0xb4,0xa8,0xd,0xe1,0xeb, + 0xc0,0xaf,0x11,0x37,0xc7,0x31,0x3d,0xd5,0xae,0x62,0xaf,0x32,0x31,0x8,0x55,0x24, + 0x51,0x9c,0x3,0x81,0xde,0x94,0xc2,0xe8,0xf2,0xa6,0x4,0x44,0xc9,0x2d,0x25,0x9a, + 0xf5,0x1e,0x5c,0xa6,0xd3,0x61,0x46,0x69,0xac,0xed,0x86,0xa5,0x2,0x39,0x46,0xcb, + 0x9,0x91,0x94,0xf5,0xbe,0x72,0xee,0x4b,0x25,0x8b,0x9e,0xcd,0x41,0x2f,0xe7,0x53, + 0x9b,0x3,0x60,0x2e,0x46,0xc8,0x29,0x3f,0xb5,0xcc,0x62,0x32,0xc7,0xa6,0x98,0x82, + 0xdd,0xce,0x75,0xf3,0x38,0x4,0xd2,0x13,0xb3,0x32,0xc8,0x25,0xa0,0x25,0x9c,0xd4, + 0xd6,0xe2,0x3,0x67,0xe3,0x5b,0xbe,0xac,0xce,0x64,0x87,0xb2,0xe6,0x81,0x93,0xc9, + 0x66,0xfd,0xf9,0xff,0xf1,0xab,0xc2,0xfe,0xc7,0x7f,0xf5,0xe7,0x3f,0x5a,0x66,0x90, + 0xfe,0x17,0x43,0x96,0xa0,0xd6,0xaa,0x36,0xca,0x9,0x34,0xcf,0xc,0xad,0xe4,0x4b, + 0x98,0xf2,0xa7,0x79,0x7b,0x8c,0xa4,0x46,0x34,0xe8,0xdf,0x7,0x2b,0x58,0x6f,0x18, + 0x9c,0xf1,0xc0,0xe8,0x1,0x84,0xc5,0xa9,0x9,0x5d,0xb0,0x4c,0xad,0xc7,0xb4,0x7, + 0xe8,0xd9,0x68,0x99,0xf0,0x96,0x18,0xa8,0x84,0x8c,0x60,0x5b,0xb3,0xd2,0x47,0x30, + 0x7b,0x4f,0x6a,0x1f,0xac,0x44,0x79,0xea,0xeb,0x35,0x9f,0x94,0x3e,0x31,0x59,0xbf, + 0x78,0x3f,0xc0,0x7f,0xf2,0x57,0x7f,0xfe,0x83,0xa2,0xf5,0xcd,0x74,0x55,0xa3,0x67, + 0x96,0x76,0xd0,0x5b,0x9b,0x75,0x43,0x8a,0x5f,0xbd,0xb4,0x2d,0xc,0xa0,0xea,0xf7, + 0x10,0xb8,0x5c,0x6d,0x40,0x2b,0xc7,0xa6,0xa6,0x2d,0x80,0x6e,0x2,0xd2,0xa8,0x8, + 0xf7,0x75,0xfc,0x17,0xff,0xc3,0xff,0x75,0xff,0xbe,0x9f,0xfb,0xf8,0xa4,0x8f,0x3c, + 0x15,0x6b,0xdd,0x8f,0xf4,0xd1,0x65,0x8c,0x8e,0x7d,0x92,0x26,0x51,0x91,0x70,0xda, + 0xf3,0xea,0x4f,0x23,0xf7,0xc5,0xf8,0x46,0xcc,0x4d,0x33,0x75,0xa9,0x23,0x73,0x5f, + 0x9,0xdb,0x55,0x6d,0x3c,0x6c,0xe1,0x28,0x88,0xd1,0xaa,0x3a,0xb5,0x68,0x6a,0x56, + 0xad,0xab,0xc9,0xd6,0xd6,0xeb,0xb2,0xb6,0x61,0xa8,0x42,0x3b,0x33,0x17,0xad,0x4d, + 0x3b,0xb0,0x83,0xb9,0xa4,0xeb,0x58,0x53,0x2,0xa,0x6,0xd2,0x11,0x2a,0xe0,0xfa, + 0x8c,0x4e,0xc0,0x30,0xd2,0x59,0x32,0x5f,0xaf,0xc1,0x52,0xf,0xc8,0x83,0xe3,0x97, + 0x8a,0xa6,0x54,0x88,0xec,0xac,0xc4,0x97,0xe1,0x8e,0xa7,0xa4,0x4a,0xb1,0x19,0x65, + 0x3f,0xb8,0x61,0xe2,0x47,0xfb,0x69,0xe8,0xde,0x6d,0x2c,0x7c,0x72,0xbf,0x76,0x84, + 0x26,0x65,0xc0,0x37,0x85,0x3d,0xa8,0x3a,0xdd,0x14,0x3f,0x77,0x49,0x61,0x24,0xe1, + 0xcd,0x76,0x96,0xc6,0x8d,0xab,0xca,0xfa,0xc3,0x18,0x26,0x20,0xb6,0x8d,0x2f,0x1b, + 0x57,0x23,0x35,0xfc,0xd5,0xab,0x59,0xad,0x9b,0x75,0xff,0xe5,0xe4,0x4a,0x23,0x32, + 0x56,0xca,0xf0,0xed,0xa2,0xc9,0x77,0xdc,0xc1,0x98,0x7c,0xac,0xfa,0x6a,0x8f,0xa8, + 0x61,0xab,0x1b,0xf6,0xe9,0x7,0xd9,0xdb,0x57,0x67,0x69,0x67,0x1,0xd5,0x68,0x15, + 0xd9,0xa,0xe1,0xde,0x5f,0x48,0x45,0xcc,0xcb,0x51,0xaf,0xd3,0x4c,0x7a,0xe6,0x21, + 0x7e,0x76,0x34,0x7a,0x95,0x9d,0x87,0xde,0x18,0xdc,0xbf,0xed,0x93,0x74,0x1e,0xb, + 0x5d,0x85,0xf2,0x93,0xfd,0xde,0x3e,0x9a,0xfd,0x4,0xef,0xf7,0xbb,0x1d,0xb5,0x26, + 0xf0,0x9f,0x71,0xa0,0xa0,0xe2,0xfe,0xea,0x1e,0x62,0xca,0x11,0x85,0xb6,0xee,0x8d, + 0xe6,0xbd,0xad,0x3a,0x88,0x3e,0x72,0xe1,0xe2,0x1a,0x3a,0xf6,0xa4,0xb3,0xae,0x65, + 0xb2,0xb0,0x5b,0x16,0x91,0x21,0xea,0xe3,0xe4,0x1e,0xc2,0x15,0x8d,0xbe,0x8,0x6, + 0xc,0xc5,0x57,0x27,0x65,0x35,0x52,0x1a,0x73,0xe6,0x96,0x1,0x31,0xd1,0x67,0xae, + 0x55,0x7f,0x97,0xb9,0x3e,0x3d,0x0,0x69,0x75,0xa8,0x20,0x66,0xfa,0xa,0xef,0xd, + 0xe1,0x81,0x2c,0xab,0x34,0xd2,0x49,0x1c,0x4,0x26,0x3c,0x43,0xe6,0xfb,0xbb,0xac, + 0x2d,0x43,0x3c,0x67,0x22,0x92,0x25,0xab,0x9d,0xe1,0x78,0xb6,0xef,0x47,0xc0,0x72, + 0x74,0xe3,0x83,0xa7,0x42,0x7f,0xbe,0xff,0x17,0xff,0xd6,0x9d,0x28,0xfc,0xc6,0xcf, + 0x7f,0x0,0x43,0x25,0xa1,0x23,0x58,0x2a,0xfb,0x59,0x5d,0x93,0x3c,0x3b,0x6c,0x79, + 0xd,0x49,0x60,0xda,0xe7,0xfb,0xe5,0x38,0x64,0x1c,0x10,0x34,0x4b,0x69,0x41,0x16, + 0xe8,0x55,0xb8,0x91,0xc,0x2b,0x24,0x61,0x7,0x45,0xa8,0x51,0x24,0x85,0xbe,0xe6, + 0xa8,0x84,0x28,0xa6,0xbe,0x0,0x7b,0x53,0x98,0x2e,0x1f,0xbb,0x27,0x4b,0x38,0x5a, + 0x5b,0x77,0x45,0xc3,0xc,0x14,0xec,0x24,0xd2,0xa,0xe3,0x89,0x46,0x1a,0xac,0x56, + 0x51,0x6c,0x45,0x31,0x34,0x9d,0xe9,0x36,0xfb,0x5b,0x7e,0xe,0xb8,0x34,0x70,0xa8, + 0xba,0x91,0xfb,0xd0,0xb9,0x51,0x93,0xee,0x86,0x46,0x39,0x30,0xbb,0xc1,0xd,0x1a, + 0xc3,0x7d,0x12,0xb6,0xd1,0x3d,0x96,0x83,0x58,0xf7,0x35,0x5d,0xc,0x17,0x38,0x88, + 0xda,0xe5,0xd0,0x63,0xad,0x2e,0xba,0xc3,0x21,0x99,0x64,0x38,0x39,0x22,0x5a,0x4c, + 0xa8,0xd4,0xc4,0xf0,0x3,0x4d,0x1f,0x9f,0x56,0xe8,0xa3,0x3a,0x66,0xcc,0xd6,0x3b, + 0x92,0xea,0x67,0xe,0x6d,0x8f,0xd,0xc1,0x2d,0x4a,0x29,0x6f,0x43,0xd2,0x27,0x41, + 0x18,0x5,0xc0,0x6d,0xe6,0x84,0xf0,0x3,0xd7,0x31,0xd9,0x44,0x1f,0x1a,0x52,0xa4, + 0xf6,0xd3,0xa5,0x44,0x48,0xae,0xb6,0x13,0xe5,0xb5,0x10,0x44,0x8c,0x46,0x42,0xdd, + 0x89,0x81,0x49,0x35,0x4b,0x82,0x4a,0x6,0xa4,0xff,0xa9,0x68,0x1f,0x1d,0xa5,0x7e, + 0x38,0x58,0xd6,0x36,0xf5,0xa0,0x6f,0x3d,0xf6,0xa8,0x94,0xf7,0xf9,0x18,0x5e,0x19, + 0x9a,0x84,0x7c,0x4a,0xb2,0x5c,0x3a,0xf1,0x34,0x87,0x1b,0x43,0xa5,0x97,0xa6,0xca, + 0x6e,0x7d,0xd5,0xee,0xa1,0x7b,0xf,0xcd,0x47,0x4e,0x4a,0x20,0x53,0x98,0x99,0x84, + 0xf5,0x2c,0x4d,0xbd,0xa,0x55,0x6d,0xaa,0x51,0x7b,0x74,0x21,0xd8,0x88,0xff,0x9f, + 0xb1,0x37,0x6b,0xba,0xec,0x3a,0xcf,0xc3,0xde,0x67,0x75,0xff,0x83,0xfc,0xc,0x57, + 0xa2,0x9d,0x8a,0xe3,0xb2,0x2d,0x91,0x92,0x8,0xa2,0xbb,0xbf,0x1e,0x31,0x35,0x66, + 0x70,0x2,0x7,0x11,0x12,0x67,0x4b,0x16,0xc5,0xc4,0x56,0xac,0xc8,0xb6,0x44,0x29, + 0x24,0x25,0x8a,0x83,0x28,0x42,0x9c,0x0,0x90,0x98,0xd1,0xdd,0xe8,0xe1,0xeb,0x6, + 0x7,0x50,0x94,0x15,0xab,0x4a,0xda,0x94,0xa5,0x8b,0x54,0xca,0xf7,0xc9,0x4d,0x2e, + 0x53,0x95,0xb,0xef,0x37,0x17,0x7b,0xd,0xcf,0xf3,0xbe,0xeb,0x80,0x66,0x49,0x64, + 0xf7,0xd7,0xe7,0x3b,0x67,0x9f,0xbd,0xd7,0x5a,0xef,0xf4,0xc,0x64,0x19,0x97,0xc, + 0x25,0x30,0x65,0x1f,0x85,0x75,0x66,0xcc,0xfb,0x75,0xe2,0x54,0x3f,0xfd,0x3f,0xbf, + 0x63,0x7d,0xdf,0xef,0xec,0x1,0xa9,0xcf,0xa6,0xa2,0x77,0xee,0xc4,0xcb,0xc5,0xc2, + 0xb5,0x44,0x61,0x19,0x65,0x2,0x60,0x5a,0xe1,0x89,0xe4,0x2d,0x66,0xc0,0x32,0xaa, + 0x50,0x11,0x67,0x22,0x98,0x8b,0x19,0x21,0xf3,0x54,0x9a,0x1e,0x75,0xff,0x7e,0x1e, + 0x8a,0x16,0x8c,0xd6,0xa2,0x13,0x8b,0xc0,0xeb,0x85,0x39,0x72,0xc1,0xd3,0xdb,0xe0, + 0x84,0x45,0x40,0xd4,0x20,0x70,0x9e,0x3,0xc5,0x87,0x83,0x0,0x8c,0x9a,0x72,0x64, + 0x82,0x62,0x95,0x91,0xfa,0x1a,0xde,0xc2,0x8b,0x1c,0xa9,0xdf,0x24,0x40,0x99,0xa, + 0x41,0x6d,0x15,0x70,0x99,0x1a,0xde,0x10,0xe6,0x23,0x2a,0x66,0x41,0xaf,0x1,0xc9, + 0x45,0x2d,0x52,0x2a,0x3d,0x78,0x94,0x87,0xe7,0xeb,0x8a,0x23,0x60,0x7b,0xdf,0x8c, + 0xdd,0x0,0x39,0x33,0x23,0x5,0xab,0x3,0x7c,0x4b,0x63,0xae,0xf0,0x41,0xb3,0x98, + 0xc4,0xd1,0x87,0xc5,0x10,0x65,0x71,0x84,0x63,0x9e,0xd6,0xd1,0xc,0x4c,0xe3,0xb3, + 0x67,0x64,0x3a,0x57,0xb7,0xa2,0xa6,0x36,0x69,0x63,0x17,0x3d,0xce,0x38,0x89,0x48, + 0x6c,0x44,0x4c,0xf0,0x37,0xac,0xe9,0x80,0x5c,0xad,0x91,0xa3,0x8b,0x9c,0x2a,0xfb, + 0xeb,0xcb,0x54,0xec,0x6c,0xa2,0xc2,0x9b,0xc6,0x9a,0x71,0x1c,0x9b,0xd6,0x18,0xd1, + 0xb7,0x62,0x75,0xef,0x13,0x91,0x2b,0xc5,0xfe,0x4c,0x66,0xe1,0xcc,0xef,0x36,0xb3, + 0xf7,0xfc,0x2f,0x6f,0x2c,0xef,0xfd,0x37,0x6f,0x2c,0x8,0x1a,0xf8,0x91,0xf5,0xa8, + 0xe3,0x8a,0xa9,0x88,0x40,0xb0,0x1,0x66,0x6c,0xc4,0x18,0x2f,0x22,0x8c,0x6e,0x2c, + 0x9e,0xc1,0x6,0xa5,0x98,0x46,0x5c,0x35,0xfb,0x7e,0x47,0x2d,0x8,0x3f,0xd0,0xc5, + 0xeb,0x49,0x2f,0x6b,0x19,0x4,0x53,0x56,0xa8,0xda,0xa0,0xb,0x2,0x83,0xc0,0x78, + 0xe4,0xcc,0x39,0x92,0x8d,0x80,0x6b,0x89,0x3a,0x52,0x3d,0xc1,0x86,0x34,0x90,0x26, + 0x69,0x7f,0xb7,0x52,0xf5,0x98,0x7c,0x43,0x31,0x49,0xee,0x4c,0xc9,0xb,0x5d,0xa2, + 0x9,0x53,0xe3,0x10,0xde,0x81,0xf5,0x55,0xa,0x73,0xec,0xfc,0xa0,0x4f,0x8,0xf2, + 0x5e,0xb5,0xc3,0x8a,0x79,0x9,0x18,0x36,0x43,0xae,0x22,0x50,0x4,0x26,0xfc,0x43, + 0x6,0x8c,0xf0,0x7b,0x24,0xa0,0xcd,0xc4,0xfa,0xb8,0xcd,0x30,0x3c,0x38,0x8d,0x75, + 0x7,0xb2,0x74,0x61,0x7a,0xd0,0x78,0x77,0xe9,0xe2,0x88,0x8c,0xc0,0xe5,0x45,0x32, + 0x70,0x8b,0x77,0x1e,0x11,0xc0,0x20,0x80,0x23,0x4b,0x3c,0xfa,0x64,0xff,0xc4,0xea, + 0x7c,0x8,0xad,0x55,0x45,0x35,0x11,0xaa,0x7f,0xf8,0xed,0x72,0x4a,0xce,0xff,0xce, + 0x72,0x8e,0x8,0x3a,0xfc,0x3d,0xf3,0x84,0xd9,0x7b,0x7e,0xfb,0x8d,0xe5,0xcf,0xff, + 0xd5,0x5d,0x6b,0x9f,0x17,0xd1,0x6,0x62,0x16,0x41,0xd4,0xef,0x8f,0x9d,0x93,0x79, + 0x60,0x57,0x84,0xfa,0xf8,0xfa,0x6e,0x53,0x69,0xa0,0x60,0x99,0xcb,0xf7,0x52,0x18, + 0x9e,0x20,0x66,0x0,0x53,0xf0,0x66,0xc0,0xc7,0x88,0x74,0x9d,0x2,0x9d,0xe,0x39, + 0xc3,0x67,0x30,0x65,0x4,0x76,0x22,0x56,0xb7,0xa9,0xa,0xcc,0x33,0xb4,0x99,0x8b, + 0xec,0x34,0xca,0x70,0x22,0x89,0x49,0xf0,0x92,0x3,0x42,0xe5,0x2b,0x85,0x62,0x7, + 0xd1,0x99,0x4c,0xc1,0x39,0xd3,0xfe,0x4c,0x78,0xd4,0xe2,0x76,0x37,0x29,0x6b,0x63, + 0xec,0x78,0xcf,0x6f,0xbf,0xb1,0xbc,0xe7,0x5f,0xbf,0xb1,0x48,0x8b,0xbb,0x39,0x92, + 0xd1,0x9a,0xf0,0x8,0xe6,0x55,0xa1,0xb5,0x3,0xf8,0x1b,0xde,0x93,0xc1,0x1,0x51, + 0x14,0x5,0x5d,0x2,0x58,0xa3,0xde,0x49,0xfb,0x9d,0x28,0x7a,0x43,0x8e,0x16,0x8a, + 0xdc,0xe,0xb3,0xdb,0x24,0xb0,0x2f,0x46,0x56,0x10,0x8f,0xec,0x78,0x5e,0x38,0x31, + 0x54,0x7a,0x97,0x6c,0x56,0x6d,0xa0,0x5e,0x2b,0x14,0x15,0xef,0xad,0x3a,0xa4,0x6b, + 0xec,0x49,0x3b,0x3d,0xa3,0x21,0x7a,0x35,0x14,0x3,0xc7,0xa8,0xc0,0x33,0x2b,0xc3, + 0xf2,0xf9,0xe7,0x33,0x67,0x41,0x4,0x7c,0x59,0x40,0xb8,0x8b,0xdf,0x38,0x54,0x3, + 0xae,0x55,0xca,0x51,0x57,0x23,0x36,0xa8,0x0,0x9b,0x88,0x78,0xcd,0xb0,0xec,0x51, + 0x51,0x2e,0x89,0xfe,0xe9,0x79,0x18,0x98,0x22,0x8c,0x42,0x7,0xe8,0x7b,0x13,0x48, + 0x91,0x55,0x35,0x3d,0xd4,0x27,0xc3,0xfb,0x5c,0x13,0x79,0xde,0xa3,0xfc,0xfb,0x59, + 0xfe,0x2,0x86,0x89,0x53,0xa2,0x20,0xfb,0x13,0x42,0x1d,0x56,0x10,0x10,0x87,0x40, + 0x84,0xa7,0x86,0x8c,0x3a,0x54,0x64,0x90,0xac,0xce,0x26,0x2,0xfd,0x41,0x7,0x17, + 0x73,0xdb,0xbf,0x83,0xb4,0x1e,0x8,0x84,0x3d,0x58,0xb6,0x4e,0x68,0x5b,0x7c,0x30, + 0x51,0xfb,0xf7,0xdd,0xbf,0xfd,0xfd,0xe5,0x1b,0xbf,0x7d,0xd7,0xea,0xc9,0xae,0xd3, + 0x82,0x88,0xc,0x7a,0xeb,0xf,0x16,0x9d,0x89,0xc2,0xc2,0x49,0xc8,0xf5,0x3,0x2a, + 0x63,0xb2,0xe1,0xdf,0x2,0xa9,0x79,0x48,0x8,0x5,0xd1,0x9d,0x4d,0x5,0x3,0x40, + 0x98,0x82,0x9e,0xd9,0xbb,0x25,0x21,0xb,0xee,0x50,0xf8,0x44,0x50,0x44,0x54,0x96, + 0xe4,0xcf,0x96,0x5c,0xd8,0x1a,0x1a,0xf7,0x1b,0xbf,0x7d,0xd7,0xfa,0xee,0x7f,0xfd, + 0xc6,0x62,0x41,0x8f,0x3c,0x3d,0x2b,0xfb,0xd9,0xc1,0xcb,0xf4,0xc8,0xb5,0x99,0xb, + 0x6e,0x4e,0x8a,0x82,0x81,0x5,0x26,0xaa,0x68,0x16,0x53,0xdb,0x48,0xc7,0x81,0xbd, + 0xd5,0x18,0xd0,0x82,0xc8,0xc7,0x9c,0x5a,0x47,0x16,0xa3,0xae,0xeb,0x3d,0xe9,0xc9, + 0x10,0x60,0x2c,0x8a,0x9d,0x58,0x50,0xb5,0xf3,0xe4,0xa9,0xe,0x75,0x56,0x9b,0x64, + 0xb4,0x4e,0x6b,0xcd,0x2b,0xda,0x16,0xb4,0xae,0x1d,0x79,0xbf,0x80,0x12,0x23,0x48, + 0x45,0x30,0x2,0x7,0x48,0xf4,0xa8,0x4b,0xa,0x7,0xd8,0xea,0xd0,0xce,0xa7,0x49, + 0xae,0xab,0xca,0x59,0x5b,0x87,0x1e,0x92,0x11,0xb6,0xb9,0x85,0xb1,0xcd,0x2f,0x6, + 0x63,0x80,0x3,0xa0,0x30,0x5c,0xa0,0xd8,0xa,0xe1,0x6e,0x43,0xed,0x4c,0x63,0xb0, + 0xe2,0x6a,0xe,0xfa,0xfd,0x21,0xaa,0x68,0xed,0x3a,0x69,0x27,0x3a,0x77,0x2c,0x4d, + 0xbb,0x98,0x93,0x44,0x36,0xb3,0x6c,0xf3,0xe,0xd1,0xfb,0xc3,0x49,0x15,0x12,0x12, + 0x3d,0x75,0xde,0xac,0x64,0xbb,0x6b,0x8c,0xbe,0x4f,0x96,0x6c,0x6e,0xdf,0xb7,0x48, + 0x27,0x35,0x8e,0x9c,0x9c,0xe8,0x8c,0x39,0x78,0x96,0x94,0xec,0xcd,0x60,0x5e,0x59, + 0xef,0x48,0x7f,0x1f,0x93,0x60,0x16,0x93,0xd5,0x1c,0xdc,0xb8,0xe3,0x68,0x93,0x60, + 0xa7,0xf7,0x99,0x65,0xcb,0xfb,0x7d,0x86,0x2,0xda,0x8c,0x3a,0xbc,0x7d,0x67,0xb, + 0xed,0x6c,0xe8,0xb0,0x38,0x8b,0x72,0x11,0x7d,0xf2,0xdd,0xff,0xea,0xf6,0xf2,0x8d, + 0x7f,0x73,0xf7,0xaa,0xf2,0xbc,0xae,0x82,0x91,0x2a,0xd9,0x99,0x84,0x6a,0x64,0xdc, + 0xc4,0x6b,0x3a,0xce,0x37,0xba,0x72,0xa4,0x57,0x94,0x3b,0x3c,0x71,0xde,0x82,0x5d, + 0xce,0x7c,0x5e,0x35,0xd1,0x2,0x56,0xdc,0xd,0x12,0x4a,0x5c,0xda,0x96,0x69,0x1e, + 0x1d,0x7,0xe5,0x7a,0xf4,0xbb,0x1d,0x0,0x89,0x98,0x4d,0x35,0x8b,0xc5,0xd9,0x86, + 0x90,0x85,0x5a,0xaf,0x91,0x8b,0x17,0x14,0x7c,0x1,0x42,0xb8,0x7a,0x14,0xb1,0x98, + 0x7e,0xf6,0x1c,0xd4,0x64,0xae,0xa0,0x2a,0x9b,0xb4,0x44,0xa7,0x31,0x89,0x1,0x81, + 0xd1,0xb1,0x28,0x5a,0xbd,0xfa,0xec,0x7b,0x16,0x45,0x67,0x6f,0x73,0xf0,0x63,0xbc, + 0xf5,0x43,0x3,0x3e,0xdc,0x43,0x6,0x42,0xb6,0x7f,0xab,0x99,0x28,0x3b,0xe7,0x71, + 0xa0,0xf1,0xe,0x24,0x22,0xfd,0x64,0x76,0x54,0x72,0xb,0xf8,0x2,0x5a,0x1,0x1e, + 0x64,0x1c,0xd5,0xbf,0xcd,0xc4,0xea,0x34,0xda,0x45,0x76,0x84,0xac,0xd9,0x13,0xff, + 0xd3,0x9d,0xc5,0xcc,0xec,0xdb,0xbf,0x73,0xd7,0xea,0x98,0x20,0x6a,0x7d,0xd0,0x20, + 0x13,0x98,0x87,0x2c,0x1a,0xdd,0x63,0x2b,0xcc,0xa5,0x53,0x2,0x77,0xa9,0x72,0x19, + 0x28,0x28,0x6b,0x8b,0xe6,0xed,0xe,0x85,0x5d,0xf6,0xfb,0xd8,0x2a,0x54,0x1e,0x63, + 0x42,0xdb,0xfb,0x8a,0x27,0x83,0xb6,0x27,0xdd,0xb2,0xeb,0x1a,0x72,0xf2,0x82,0x3, + 0xbe,0x5d,0x5c,0x21,0xbb,0x23,0x28,0x90,0x21,0xb1,0x0,0xa6,0x6c,0x61,0xe4,0xf1, + 0x1a,0xcf,0x2e,0x93,0x93,0x5f,0x38,0xb8,0xf5,0x18,0x21,0xb9,0xcb,0x84,0x35,0x8b, + 0x1d,0x9c,0x22,0x62,0x39,0x49,0xb8,0x19,0x13,0x97,0xe5,0x38,0xf2,0x9f,0x7d,0x1d, + 0x9f,0xa1,0xb5,0xe7,0xa7,0x90,0x82,0xb,0xe7,0x1a,0x48,0xd1,0xb1,0xb0,0x9,0xc1, + 0x24,0xe,0x7a,0x6a,0x83,0x12,0x8d,0x15,0x1,0x2b,0x44,0xeb,0xb2,0xfb,0xbb,0x73, + 0x46,0xe9,0x24,0x14,0x23,0x63,0xec,0xe1,0x7f,0x1,0xf2,0x58,0x46,0xc0,0xb2,0xc8, + 0xe1,0x41,0xbe,0x5,0xa0,0x79,0x1c,0x7c,0x2,0x72,0x6f,0x82,0x32,0x8a,0x9a,0xe, + 0xb8,0x80,0x8,0x30,0xd,0xd5,0x76,0xa6,0xf6,0x8c,0xe6,0x6a,0xf7,0x13,0xf1,0x30, + 0xd2,0x42,0xf6,0xd9,0x24,0x9d,0x12,0x9b,0xb4,0xaf,0xf9,0x1c,0x4c,0x33,0xf,0x27, + 0x37,0xc6,0x2d,0xc,0xcb,0x38,0x69,0xdc,0x4c,0xa8,0x8f,0x72,0x53,0x12,0x6,0x29, + 0x4d,0xcf,0xd2,0x3d,0x40,0x14,0x72,0x38,0x60,0x73,0x5e,0x32,0x2f,0x15,0x49,0x90, + 0xc4,0x66,0x1c,0x47,0x59,0xcc,0x25,0xb7,0xd5,0x73,0xc1,0x6c,0xa4,0x5e,0x60,0x82, + 0x21,0x9d,0x38,0x11,0xc5,0x8e,0xa6,0xb7,0x4b,0xd,0xf3,0xb2,0x88,0xfa,0x8e,0x15, + 0x3a,0x57,0xa6,0xa0,0xca,0x95,0x67,0x39,0x46,0x5c,0xe4,0x58,0x15,0x72,0x30,0x37, + 0x9a,0x7,0x22,0x2a,0x52,0xf1,0x18,0x81,0xf0,0x5,0xbd,0xe2,0xf1,0x89,0x7b,0xd5, + 0x6c,0x36,0x66,0x16,0x68,0x37,0xa0,0x79,0x36,0x9b,0xb5,0x20,0xb5,0xc5,0x46,0x5, + 0xae,0x6,0x3b,0xe2,0xdd,0xed,0x44,0xc3,0xa9,0x15,0x91,0x93,0x92,0x9,0xc8,0x47, + 0xfd,0x89,0xcf,0xbc,0xb1,0x7c,0xfb,0x7f,0x7d,0xe7,0x6a,0x80,0x7d,0xeb,0x77,0xee, + 0x5a,0x9f,0xf8,0xcc,0x1b,0xb,0x4b,0x21,0x8a,0x3e,0xbc,0xf0,0xce,0x89,0x92,0x44, + 0x73,0x4b,0x39,0x5c,0x9b,0x35,0x29,0x9c,0x46,0x29,0xb1,0xdb,0x11,0xfe,0xe8,0x8c, + 0x59,0xf0,0x54,0x49,0x20,0x82,0x64,0xea,0x33,0x55,0xec,0x84,0x5e,0x9b,0x53,0x76, + 0xef,0x41,0xb0,0xc3,0xc2,0xb4,0x55,0xb,0x7e,0xea,0x7c,0xc0,0x26,0x8a,0x53,0xb9, + 0xfa,0x7,0xb2,0xac,0x6b,0xf6,0x21,0xd0,0x1,0x4c,0x76,0x68,0x9c,0xe8,0xfe,0x23, + 0xa,0x1d,0x22,0xf0,0xf9,0xf,0x50,0x60,0x90,0xdb,0x96,0x91,0xcb,0x3d,0xae,0x7b, + 0x3c,0x43,0xf,0x73,0xcf,0xc7,0x3f,0x73,0x67,0x79,0xfc,0x33,0x77,0x96,0x43,0x98, + 0x7,0xf,0x17,0x38,0x2a,0xd0,0xe0,0xdd,0x76,0xc0,0x29,0x8c,0x9d,0xee,0x3c,0x76, + 0xe6,0xe,0xf0,0x8e,0xb5,0x9d,0x7e,0x68,0xe6,0xbe,0xff,0xe9,0xf1,0xcf,0xdc,0x59, + 0x9e,0xf8,0xcc,0x9e,0xf4,0x8d,0xe0,0x5,0x6d,0x85,0xfb,0xa4,0xef,0xeb,0x33,0x8e, + 0x30,0x27,0x5b,0x8,0xe3,0xba,0x91,0xac,0x1,0xd1,0x82,0x77,0xec,0x6f,0x5e,0xaf, + 0xd9,0xf1,0x4b,0x16,0xb2,0x54,0xf4,0x8a,0x99,0x23,0xd6,0x1,0x75,0x50,0x10,0x75, + 0xec,0x1b,0x3,0x20,0xea,0xc4,0xcf,0xf4,0x40,0xe4,0x43,0xe3,0x48,0xc3,0x72,0x27, + 0xd7,0x42,0x52,0x10,0xbb,0x8e,0x33,0x59,0xe8,0x43,0xc5,0x62,0xd0,0x66,0xb7,0x98, + 0x90,0xce,0xac,0xb,0x27,0x75,0xba,0xb4,0xbf,0xdd,0xec,0xdb,0xbf,0x7b,0xf7,0xfa, + 0xf8,0x6f,0xdd,0x5e,0x26,0xe1,0x63,0x54,0xd0,0xb3,0xef,0x57,0xf5,0xdc,0x33,0xe6, + 0x82,0x3b,0x9b,0x45,0x8a,0xb6,0xe8,0x59,0xe0,0x7,0x5b,0x82,0xb3,0x80,0x6e,0x13, + 0xe9,0xec,0x4c,0xfa,0x2f,0xaa,0x7,0x8e,0x7e,0xb0,0x26,0x8e,0xdb,0x44,0xa1,0x46, + 0x81,0x8,0x5c,0xbd,0x59,0x2,0x8d,0x75,0xc,0x25,0x5b,0x4c,0xb6,0x23,0xa2,0x66, + 0x5e,0x8f,0xff,0xd6,0x1b,0xcb,0xe3,0x9f,0xbe,0xb3,0x58,0x3c,0xa0,0xd,0x49,0xa1, + 0x4a,0xcb,0x13,0x12,0x93,0x8,0xb3,0xa5,0x38,0x3b,0xfe,0xf6,0xef,0xbe,0x73,0x7d, + 0xec,0xd3,0x75,0x7e,0xd7,0xde,0xdd,0x77,0x8d,0xe0,0x8,0x4,0x63,0x41,0xfe,0x2e, + 0xbe,0x5f,0x67,0x4c,0x8e,0x61,0x69,0xa,0x83,0x58,0x67,0x4a,0x9,0xe1,0x2e,0xed, + 0xda,0xb8,0xa9,0x9c,0x13,0x89,0x6e,0xf,0xa,0x12,0x9d,0xc8,0x33,0x58,0x1c,0x50, + 0x9d,0x1b,0x18,0x1,0x13,0x8e,0x24,0x18,0xf9,0xbe,0x59,0xe,0x44,0x61,0xb1,0xfa, + 0x66,0xf6,0xf8,0x6f,0xdd,0x59,0xbe,0xfd,0xbb,0xef,0x5c,0x39,0x3,0xd7,0x79,0x93, + 0x25,0x8f,0x75,0x13,0xc1,0x91,0xd4,0x25,0xb6,0x99,0xa2,0x56,0x53,0xa8,0x43,0x15, + 0x2d,0xc4,0x5b,0xe1,0x30,0x0,0x51,0x62,0x9a,0x22,0x9e,0x2d,0x52,0xd1,0x68,0x56, + 0xc6,0x1b,0xc,0x53,0xe8,0x63,0x48,0xe2,0xf7,0xf,0x7b,0xec,0xd3,0x77,0x96,0xc7, + 0x3e,0x7d,0x67,0xf1,0xd8,0x3e,0x4,0x26,0x7a,0x17,0xd1,0xe5,0x20,0xb6,0xfa,0xc9, + 0xa2,0x93,0x5a,0xf2,0x59,0x4d,0x2e,0x28,0xb1,0x89,0x8d,0x2c,0xb5,0x41,0x2d,0xfb, + 0x51,0xb3,0x9b,0xc2,0x78,0x1f,0x76,0xcf,0xaa,0x7b,0xc4,0x5d,0x83,0x4d,0xfd,0xbd, + 0xc7,0x3e,0x7d,0x7b,0x79,0xec,0xd3,0x77,0x96,0x21,0xed,0x39,0xc4,0x5b,0xc0,0x46, + 0x3b,0xae,0x33,0xdf,0x5e,0xc9,0x8b,0x30,0x8f,0x8b,0x56,0x3,0x78,0x9d,0xc6,0x71, + 0x1c,0x89,0x2c,0x21,0xa2,0xc8,0x81,0x94,0x0,0x27,0x40,0x97,0x47,0xd5,0x8e,0x0, + 0x9f,0x86,0xc9,0x4c,0x17,0x80,0x3d,0xf6,0x9b,0xb7,0x97,0xef,0xfc,0xdb,0xbb,0xd7, + 0x3e,0xef,0x44,0xae,0xc0,0x11,0x3,0x86,0x1f,0x1a,0xff,0x1c,0x0,0xd5,0x5,0xe1, + 0x71,0x4c,0xc6,0x43,0x12,0xbb,0x58,0x29,0x2e,0x52,0xf5,0x26,0x76,0xb0,0x71,0x5f, + 0xa3,0xa9,0xff,0xc5,0x96,0xec,0x41,0x1c,0x8,0xe6,0xd9,0xe1,0xb4,0x3,0xb,0xad, + 0xc8,0x71,0x0,0xe3,0x11,0xf3,0x32,0xfc,0xac,0xcf,0x8d,0x38,0x7,0x3b,0x80,0x37, + 0xc9,0xf6,0xc3,0x36,0xb1,0xd9,0xc5,0xc,0x52,0x3d,0xd1,0x6a,0x1f,0x1d,0x23,0xb6, + 0x3d,0x26,0xb5,0x4d,0x4c,0x52,0x83,0xda,0xe5,0xeb,0x78,0x2c,0xcb,0x95,0x7c,0x56, + 0xe4,0x8c,0xe2,0x40,0x8,0xce,0x96,0x93,0xcc,0x1c,0xa0,0x22,0x86,0xee,0x70,0x6b, + 0x21,0x9,0x2d,0x73,0xdf,0x37,0x27,0x67,0xad,0x6e,0x76,0x92,0x12,0x7d,0x24,0xb0, + 0x7c,0xa7,0xb,0xa8,0x29,0x4a,0x18,0xe,0x8d,0xe7,0x10,0x9e,0xdd,0x29,0xf3,0xad, + 0x7,0xc8,0x6f,0xde,0x59,0x60,0x66,0xcf,0xfc,0xdb,0xbb,0xd6,0x47,0x3f,0xfd,0xc6, + 0x92,0x5c,0x7e,0x2,0xf0,0x60,0x56,0x8d,0x59,0xe0,0x19,0x3f,0xfa,0x9b,0x77,0x96, + 0x67,0xfe,0xdd,0x3b,0x57,0x98,0xd9,0x33,0xff,0x6e,0x4,0x26,0x99,0xb,0x4f,0x36, + 0x6e,0xa4,0x38,0xc9,0xd0,0x1,0x66,0xf0,0xc1,0x35,0xef,0xde,0xe8,0x25,0xb6,0xaf, + 0x21,0xe2,0x30,0x36,0xe5,0x19,0x8f,0x76,0x3c,0xca,0xce,0x53,0x96,0x20,0x44,0xdc, + 0xdf,0x19,0xa5,0x6a,0x50,0x85,0xd1,0x2d,0x3a,0x65,0x84,0xe8,0x59,0xf0,0x45,0xe8, + 0xad,0xae,0x8b,0xc6,0x89,0xdf,0xfd,0xcc,0xbf,0x6f,0xf7,0xab,0x5d,0x23,0xdb,0xfa, + 0x51,0xe2,0xe7,0xec,0xe2,0x7,0xb2,0xa,0x45,0x4e,0xad,0x3d,0x2,0xe5,0xb8,0x72, + 0x20,0x47,0xb6,0xd9,0x17,0xe9,0x5a,0xc6,0x44,0x77,0x4c,0xfa,0xd9,0x10,0xbd,0x71, + 0xa6,0xa2,0xb9,0x7,0x20,0x9d,0x5b,0xa2,0xcc,0x8c,0x96,0x39,0x42,0x65,0xe1,0x74, + 0xdf,0x90,0x7,0xeb,0x7,0xe,0x36,0xbc,0x5,0x90,0x2c,0x8d,0x5c,0x78,0xcc,0xe5, + 0x48,0x4c,0x6,0x1c,0x98,0x4c,0x41,0x7c,0x38,0xed,0xad,0xfa,0x76,0xc9,0xae,0x20, + 0xe1,0xd,0x58,0x30,0x27,0x18,0x5a,0x60,0x7a,0xf1,0xe3,0x20,0xf3,0xa0,0xdb,0x90, + 0xbb,0x77,0xca,0x6d,0xd1,0xd1,0x53,0x31,0x11,0x40,0x71,0x4,0x12,0x3,0xa6,0xa3, + 0x81,0xa9,0xb,0x6a,0xa8,0xda,0x67,0x66,0x4a,0x49,0xa0,0x28,0xfa,0x53,0xc7,0x68, + 0x5d,0x42,0x72,0xc0,0xfd,0x73,0x51,0xa4,0x3a,0xe0,0x45,0x10,0xc0,0xa1,0x6a,0x81, + 0x3b,0x8a,0x84,0x68,0x97,0x39,0x7d,0x96,0x41,0x9d,0xaa,0x8f,0xc5,0x3c,0x8f,0x5, + 0x3c,0x38,0x7f,0xcd,0xa1,0x96,0x2e,0x1f,0xc1,0xda,0xef,0x79,0x4,0x1,0xd5,0x9a, + 0x31,0x35,0xfc,0x81,0x7b,0x12,0x27,0xe2,0x96,0x77,0xe0,0xf1,0xd6,0xf7,0xde,0xf7, + 0xea,0xa3,0xbf,0xb1,0x57,0xc8,0xcf,0xfe,0xde,0xa9,0x55,0xaa,0x51,0x96,0xf8,0x75, + 0xd3,0x31,0x1d,0xa1,0xe2,0x9d,0xd9,0xa4,0xf4,0xfd,0x1e,0xfd,0x97,0xc7,0x8b,0x99, + 0xd9,0x73,0xbf,0x7f,0x6a,0x65,0x8a,0xb4,0xc1,0xec,0xd1,0xdf,0x38,0x5e,0x9e,0xf9, + 0xbd,0x53,0xab,0x88,0x2,0x89,0xf4,0xb0,0x8f,0x19,0x79,0x48,0xf2,0xdb,0x6a,0x7e, + 0xf6,0xdf,0x9f,0x5a,0x1f,0xf9,0x97,0xc7,0xcb,0xb3,0xbf,0x77,0x6a,0xed,0x53,0x51, + 0x77,0xe1,0xd4,0x1f,0xc2,0x4a,0xc1,0x33,0xb7,0xfe,0xd1,0xdf,0x38,0xee,0xf7,0xa1, + 0x63,0xa2,0x92,0xfe,0x80,0x25,0x8a,0x35,0x3f,0xaf,0x93,0xb3,0x20,0x16,0x3,0xa7, + 0x80,0x3d,0xbc,0x4c,0x8c,0xad,0x83,0xcb,0x52,0x54,0x0,0xd6,0x15,0x40,0x59,0xc5, + 0x98,0x65,0x3c,0xfb,0xfb,0xef,0x5c,0xad,0x70,0xa6,0xe9,0xc9,0xb3,0x39,0x82,0xe9, + 0x1e,0xa9,0xb,0xe1,0xb9,0xdf,0xbf,0x7b,0x1d,0x74,0x5,0xf,0xf3,0xe4,0x61,0x4a, + 0xd1,0xd,0x29,0x28,0x23,0x1b,0x87,0x91,0x2b,0x2b,0xc8,0x91,0x16,0x3c,0xb7,0xd6, + 0xe0,0x1e,0x3e,0x3f,0xf6,0x86,0x48,0x5e,0x85,0xe,0x69,0x56,0xa,0xeb,0x82,0x14, + 0x22,0x84,0xe2,0x79,0xe,0xc5,0x54,0x12,0x37,0x51,0xee,0x12,0xe0,0xc8,0x66,0xf6, + 0xdc,0x67,0xdf,0xb9,0x3e,0xf2,0x1b,0x77,0x96,0x3e,0xd7,0xb6,0x80,0x5e,0xb7,0xb8, + 0x40,0x3c,0xf8,0x72,0x87,0x3,0x84,0x5c,0xae,0x7a,0x46,0x9,0xed,0x2,0xa4,0x59, + 0x53,0xe2,0xb8,0xb9,0x8,0xa0,0x24,0xd,0xf2,0x30,0x8f,0x8e,0x1,0x99,0xe7,0x6b, + 0x6e,0x1,0x95,0x2f,0x80,0x83,0x68,0xc7,0x19,0xb3,0xe5,0xfd,0x7,0xfd,0xb9,0x7d, + 0xb6,0x3e,0xb7,0x39,0x6f,0x51,0x32,0xe9,0xb7,0xec,0x8a,0xfd,0x8c,0x7f,0x49,0xff, + 0x1e,0xb6,0xcf,0x23,0xbf,0x71,0x67,0x5c,0xcf,0x3c,0xf2,0x4f,0xf0,0x28,0xec,0xb9, + 0xe9,0x99,0x49,0xe6,0x39,0x98,0xbc,0xd5,0x55,0x8a,0xe8,0xe9,0xa6,0x50,0x8d,0xb9, + 0x39,0xb7,0xf7,0x80,0x17,0xef,0x6f,0x74,0x4e,0x9,0xf9,0xa3,0xe8,0x17,0xc8,0xfe, + 0xf6,0x21,0x32,0x24,0xe,0xf0,0x51,0xf1,0xd0,0x26,0x38,0x18,0xca,0x44,0x44,0xd7, + 0x32,0x5,0x48,0xf4,0xae,0xdc,0xc3,0xbf,0x7e,0xbc,0x3c,0xf7,0xfb,0xf5,0x50,0xdf, + 0x4c,0x94,0xd2,0xd0,0x3c,0xeb,0x5d,0x3b,0x76,0x4c,0xab,0x6a,0x2a,0x66,0x3c,0xdd, + 0x12,0xc4,0x8f,0x48,0x10,0x40,0xc6,0x3e,0x2e,0xa0,0x9c,0xb1,0xef,0xdd,0xe3,0xfd, + 0x21,0x59,0x67,0x9f,0x29,0x76,0x2a,0x36,0xc6,0xe,0x30,0x90,0xfa,0xf9,0xd7,0x3, + 0xac,0x27,0x16,0x3,0x48,0x0,0x4c,0x3,0x88,0x4b,0x70,0x77,0x64,0x3f,0x7a,0xb7, + 0x0,0x8e,0xe,0xeb,0xdf,0x25,0xb1,0x14,0x93,0xee,0x34,0x4b,0x76,0x57,0xdd,0x11, + 0x40,0x4d,0x6e,0x78,0x4d,0x7a,0x38,0x23,0x7d,0xb2,0xef,0x7d,0x2,0x7a,0xe5,0x35, + 0xdb,0x18,0x2,0x10,0xe0,0xd9,0xa8,0xa0,0x1d,0x6a,0x56,0xc3,0x54,0x69,0xe6,0xa2, + 0xb,0xc4,0x69,0x13,0x85,0x1,0xb,0xb6,0x4c,0xfd,0x3c,0x95,0x9f,0x6f,0x11,0xff, + 0xa,0x61,0xc7,0xbb,0x3c,0x7b,0x4f,0x31,0xb1,0x1b,0x21,0x3,0x13,0xa0,0x88,0xa9, + 0x89,0x86,0x8b,0x33,0x93,0xa2,0x97,0x1d,0x41,0x32,0x33,0x18,0xb2,0x30,0x82,0xd7, + 0x99,0x18,0x6f,0x6e,0xf,0xff,0xfa,0xed,0xe5,0xb9,0xcf,0xbe,0x73,0x75,0xe2,0xe6, + 0xf5,0x4b,0x17,0x34,0x36,0x52,0x60,0x1d,0xb3,0x26,0x4f,0x60,0x3d,0x8f,0x2d,0x10, + 0x9a,0x3f,0xbb,0x87,0xef,0xa,0xcf,0xa8,0xf9,0xd4,0x6,0xc9,0x99,0xbf,0x7,0xeb, + 0xbf,0x84,0xf2,0x97,0x9b,0x69,0x41,0x97,0x99,0x84,0x3f,0x12,0x7f,0x78,0xd6,0xca, + 0xd2,0xd9,0x59,0xd2,0xcc,0x34,0x45,0xb8,0x47,0x4,0x25,0xcf,0x2e,0x67,0x68,0x73, + 0xf5,0xed,0xe,0xb3,0xdd,0xfa,0xb1,0xdf,0xfd,0xec,0xdd,0xeb,0xc3,0xbf,0x7e,0x67, + 0xb1,0xd0,0xd5,0x7c,0xee,0xb3,0x77,0xaf,0xf,0xff,0xfa,0xed,0x3e,0x43,0x7d,0xf8, + 0xd7,0xef,0x2c,0xf,0xff,0x8b,0xdb,0x4b,0xfb,0xc5,0xfe,0xf7,0x83,0xf4,0xf2,0x68, + 0x29,0x39,0x19,0x11,0xd,0xb8,0xd3,0xe1,0x2a,0xe8,0x80,0xde,0x33,0x7f,0x6f,0x65, + 0x3,0xcc,0x6a,0xea,0x88,0x15,0x41,0xba,0x6f,0x79,0x2e,0x8b,0x9c,0xc0,0xd2,0xda, + 0x79,0xf8,0x5f,0xdc,0xae,0xf7,0xc3,0xc8,0xd4,0x46,0x65,0x8c,0x5d,0xb0,0xa2,0x44, + 0xe5,0x9b,0xb5,0x26,0x67,0x93,0x8b,0x94,0xf4,0x42,0x7c,0xe,0x4,0x83,0x11,0xcc, + 0x7c,0xd8,0xbc,0x25,0x69,0x89,0x8b,0xfa,0xba,0xae,0xd7,0xde,0x29,0xea,0xaf,0x7f, + 0xb,0x55,0xb2,0xb6,0xff,0x6b,0xd0,0xfa,0xee,0x67,0x4f,0xad,0xf,0x7f,0xea,0x78, + 0x89,0xd7,0x89,0x30,0x23,0x76,0x1,0x8e,0xf2,0x99,0x33,0x11,0xc6,0x6,0x8d,0xa9, + 0x2c,0x83,0xe5,0x78,0x6e,0xcd,0x8e,0x59,0xfd,0xd7,0x83,0x7f,0x27,0x26,0x8b,0xd5, + 0x39,0x30,0xc4,0xf3,0x91,0xba,0xf,0xed,0xbd,0xc4,0x6,0x13,0x21,0x71,0x71,0x8, + 0x5,0xd7,0xc8,0x87,0x61,0x6c,0x6f,0xe2,0xdb,0x40,0xc7,0x4e,0x8e,0x8c,0xd6,0xf6, + 0xba,0x43,0x7c,0x32,0xa,0x50,0xcf,0xf6,0x62,0xd1,0x6b,0x43,0x12,0x7d,0x10,0xaa, + 0x1f,0x6a,0xae,0xa3,0x10,0xc3,0xf1,0x9e,0xf,0x7f,0xea,0x78,0x79,0xa8,0x3e,0xd3, + 0x88,0xf9,0x10,0x9d,0x8,0x4a,0x22,0x18,0xe3,0xc2,0xd2,0xbf,0x3d,0x18,0x16,0x8, + 0x16,0x83,0x53,0x36,0x3f,0x20,0x56,0x5,0x33,0x7b,0xe8,0x53,0xc7,0xcb,0x77,0xff, + 0xe0,0xf4,0xea,0x44,0x85,0x7c,0xf8,0x53,0xc7,0xcb,0xc3,0x9f,0x3a,0x5e,0x86,0xe4, + 0x30,0xc7,0x1c,0xf5,0x2d,0x78,0xe8,0x53,0xc7,0xcb,0x73,0x7f,0x70,0x6a,0x65,0xe1, + 0xb4,0x21,0x20,0xd6,0x2e,0x63,0x48,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x34, + 0xe8,0xd2,0x2e,0xa0,0xde,0x11,0x70,0x7d,0xa2,0x15,0x62,0xd1,0x24,0x8a,0x9f,0x31, + 0xe2,0x39,0x83,0x20,0x75,0xc3,0x3e,0x25,0xfb,0xdf,0x1e,0xfe,0xd4,0xf1,0xf2,0xf0, + 0x27,0x6f,0x2d,0x1c,0x62,0x44,0x4d,0x1,0xc1,0x88,0x17,0xb4,0x10,0x40,0x33,0x5d, + 0xe5,0x6c,0x7b,0xe0,0xba,0x26,0x39,0x2c,0x9b,0x36,0x1a,0xa5,0x6a,0xa4,0x59,0xc1, + 0xa6,0x75,0x8,0x84,0x78,0xae,0xf4,0x30,0x99,0x1d,0xc5,0x79,0xc5,0x66,0x49,0x17, + 0x9e,0x33,0x32,0x1c,0x8c,0x9e,0x7,0x8c,0xdb,0x3d,0x7f,0x17,0xe5,0x31,0x8e,0xdb, + 0xfe,0xd0,0xa7,0x6e,0x2f,0xf,0x7d,0xf2,0xf6,0x62,0x98,0xcf,0x94,0xa,0xe7,0x53, + 0xf4,0x4f,0xf,0x7d,0xf2,0xf6,0xf2,0xd0,0xa7,0xee,0x2c,0x87,0xf4,0x7d,0xf3,0x1c, + 0x7d,0xbc,0xee,0xa1,0x4f,0xde,0x5e,0xbe,0xfb,0x7,0x7b,0xc5,0x29,0xae,0x6a,0x85, + 0xc0,0x5a,0x74,0xbd,0x73,0xb0,0xe4,0xcc,0x30,0x27,0x6c,0xa8,0x80,0xa4,0x37,0x53, + 0xbc,0x42,0xfa,0xfc,0xc0,0x57,0xc7,0xc4,0xa1,0xc9,0xc4,0x58,0x35,0xcc,0xeb,0xa0, + 0xb7,0xde,0x5,0x59,0xbd,0xff,0xf0,0xa1,0x4f,0xd6,0xfb,0xcd,0xb4,0x1e,0x68,0x85, + 0x3d,0x54,0x2,0x67,0xeb,0x26,0xd2,0x82,0x42,0x73,0x69,0xcb,0x55,0x13,0x5b,0x7b, + 0x82,0xdb,0xfc,0xc1,0x48,0x46,0x7f,0x1f,0xc9,0x46,0x77,0x7f,0x6e,0xa7,0x3a,0xcf, + 0xbf,0x3,0xc0,0x82,0x4f,0x7d,0xe7,0xd4,0x3,0x66,0x33,0xe4,0x7a,0x3,0x5a,0xd1, + 0xde,0x75,0x68,0x32,0xe4,0x2a,0xdf,0x98,0xdc,0xe9,0x40,0xb3,0x45,0x99,0x29,0xcf, + 0xb8,0xd3,0x3c,0x6e,0x23,0x7d,0x7,0x4,0xe0,0x12,0x60,0xf6,0xe0,0x27,0x8e,0x97, + 0x87,0x3e,0x71,0xbc,0x80,0x14,0xba,0x1c,0xfc,0xc,0x90,0x5d,0xbe,0x3c,0x60,0x1b, + 0xdc,0xec,0xa1,0x4f,0xee,0x1,0xe3,0xc1,0x4f,0xee,0xad,0x49,0xb0,0x6e,0x37,0xb4, + 0xbb,0x33,0x34,0xfc,0x4b,0xaf,0xb2,0x5c,0x41,0xd7,0x52,0x19,0x72,0xa5,0x25,0xa2, + 0x42,0x13,0x3c,0xc8,0x6c,0xef,0xc,0xac,0x54,0x0,0xd7,0x9a,0x5,0x35,0x3d,0x2a, + 0x68,0xe,0xec,0x73,0x5d,0x9f,0x1e,0x8a,0x80,0xec,0xe,0xc7,0xd8,0x19,0x31,0x83, + 0x89,0x34,0x4d,0xa8,0xe1,0xcd,0x43,0x9f,0x38,0x5e,0x1e,0xfc,0x44,0xd,0x70,0x48, + 0xb5,0x34,0x51,0x16,0x7d,0x8,0xa6,0x48,0xd0,0xa5,0xf3,0xe7,0x13,0xc7,0xcb,0xf7, + 0xfe,0xf0,0x74,0x5d,0xc7,0x6e,0x98,0x8e,0x32,0xd5,0xb6,0x19,0x54,0xa1,0xf,0xef, + 0x89,0x90,0x8c,0x79,0x9c,0xb8,0x53,0xc5,0x4b,0x85,0x90,0x83,0xfc,0xe7,0x7b,0x57, + 0xcd,0xd3,0x79,0xd5,0xf9,0xfa,0xdb,0xd8,0x8e,0xbd,0x3b,0x13,0xba,0x9d,0x40,0x9c, + 0x81,0x73,0x33,0x65,0xff,0xc7,0xef,0xfd,0xe1,0xe9,0xf5,0xc1,0x4f,0x1c,0x2f,0x51, + 0x58,0x8a,0xbb,0x99,0x69,0x21,0x38,0xf1,0xd4,0x6d,0x72,0xce,0xc8,0xfe,0x64,0xd0, + 0x6e,0xc6,0x0,0xf4,0xee,0x28,0x38,0xa2,0xc4,0x1c,0xa7,0x66,0x64,0xf,0x7e,0xe2, + 0xf6,0xf2,0xe0,0x27,0xee,0x2c,0xf,0x7e,0x62,0xa0,0x0,0xe1,0x7,0x78,0xd6,0x69, + 0x79,0x97,0x29,0x0,0x23,0xce,0xd9,0xb8,0x72,0x9a,0x6a,0xf6,0xb2,0x53,0x4d,0x0, + 0xe,0xc4,0x4c,0x96,0x4f,0x63,0x71,0xca,0xe1,0x4b,0x29,0x61,0x46,0x78,0xe8,0x3b, + 0xd0,0x35,0x5c,0xfe,0x78,0xb,0xce,0x9e,0x50,0x92,0xc2,0xd9,0xb6,0x88,0xaa,0xf7, + 0x79,0x0,0xee,0xb4,0x40,0x97,0x4d,0xe6,0x6e,0xf6,0xbd,0x3f,0xbc,0x7b,0x5f,0x20, + 0x16,0xd1,0xf0,0x81,0x1f,0x4c,0x54,0x8,0xc4,0x2c,0x33,0x55,0xa0,0xae,0xd7,0x4b, + 0x8a,0x68,0x6e,0x48,0xdd,0x1,0xa9,0x43,0x67,0x5d,0x0,0x40,0xfe,0xec,0xa6,0xa, + 0x7c,0x11,0x55,0x2e,0x8a,0x72,0x32,0x79,0x19,0x8,0x7b,0x9f,0x88,0xf2,0xb4,0x2e, + 0x4c,0x14,0xa1,0x11,0x8f,0x69,0xb8,0xae,0x3,0x99,0x2d,0x8f,0x8e,0xcc,0xf7,0x3e, + 0x77,0xaa,0xde,0x57,0xad,0x88,0xd,0xc1,0xd2,0x30,0xfa,0x8f,0xc6,0x8a,0xde,0xd9, + 0x23,0xfb,0x0,0x7a,0x3a,0xa8,0x8b,0xa,0xa,0x99,0x9a,0x2c,0xf,0x7e,0xfc,0x78, + 0xf9,0xde,0xe7,0x4e,0xaf,0x9c,0xe9,0x77,0xa4,0x73,0x84,0x21,0x90,0xc8,0x10,0xd8, + 0x4a,0xd4,0x72,0x77,0x40,0xe4,0x5c,0x3d,0x82,0xcb,0x26,0x73,0x68,0x42,0xaf,0x67, + 0x1e,0xb4,0x76,0x23,0x30,0xa9,0x86,0x14,0x95,0xbd,0x7f,0xaf,0x7,0x3f,0x7e,0xbc, + 0xcc,0xd8,0x17,0x8c,0xe9,0x51,0xad,0xf9,0xcc,0x31,0x7e,0xe0,0x63,0xfb,0x41,0x9, + 0x7a,0xe,0xcf,0xff,0x6f,0xa7,0xd6,0xe7,0x3f,0x77,0x7a,0x7d,0xf0,0xe3,0xc7,0x8b, + 0x47,0x7b,0x5c,0x55,0xae,0x17,0xd4,0xbf,0xd6,0x94,0x30,0x2f,0xa,0x7c,0x75,0xd7, + 0xf1,0x4f,0x16,0x4f,0x1,0xbb,0x33,0x24,0x65,0xb0,0xc,0x9d,0x52,0x30,0x54,0x37, + 0xee,0x81,0x13,0xf,0x86,0x9c,0xfe,0x24,0x99,0xc9,0xf4,0xd9,0xa8,0xc3,0xdf,0x6a, + 0xc1,0xcb,0x1f,0x3f,0x5e,0x9e,0xff,0xdc,0xe9,0x55,0x3b,0x72,0x46,0x6a,0x72,0x2e, + 0xec,0x19,0x4c,0x2a,0x63,0x17,0xf8,0x46,0xdb,0x93,0x8c,0x92,0x67,0xe1,0xa7,0xec, + 0x73,0x7e,0xb9,0xae,0x63,0xd5,0x65,0x47,0x70,0x9c,0x24,0x69,0x5c,0xcc,0x3b,0x68, + 0xa2,0x89,0x42,0xb7,0xf4,0xf2,0xc7,0x6f,0x2d,0x97,0x3f,0x7e,0x6b,0x61,0xfb,0xd2, + 0x29,0x17,0xab,0x2e,0xe0,0xcb,0x1f,0xbb,0xb5,0x3c,0xff,0xf9,0xd3,0x2b,0x53,0x85, + 0xd5,0x6d,0x12,0x49,0x9a,0x36,0x16,0x8d,0xee,0xb1,0x80,0x8c,0x9d,0x44,0x88,0x62, + 0x26,0x9f,0x37,0xf,0xb6,0xcf,0xf,0xb1,0xc4,0xc9,0x32,0x5c,0x19,0x57,0x8,0x9d, + 0xae,0x78,0xe,0x46,0x95,0xd6,0xf1,0x19,0xf2,0xdc,0x45,0xfa,0x95,0xde,0xa4,0xe9, + 0xc2,0xfa,0x66,0xf6,0xfc,0xe7,0x4f,0xad,0xcf,0x7f,0xfe,0xee,0xf5,0xf2,0xc7,0x5a, + 0xcb,0x54,0x5b,0x33,0xd2,0x6,0xc0,0xa4,0xa,0x43,0x74,0x3d,0x19,0xa0,0xa8,0xcb, + 0x1f,0xbb,0xbd,0x3c,0xff,0xf9,0x53,0x2b,0x6f,0x20,0xad,0x20,0x61,0x62,0x60,0xd2, + 0x6f,0xa6,0xf7,0xdf,0x1d,0x9a,0xe5,0xb4,0x70,0x3b,0x47,0x3a,0x54,0xd6,0x4d,0x35, + 0x69,0xb3,0xa9,0x9c,0x65,0xd0,0xf7,0x32,0x98,0xd9,0xe5,0x8f,0xdd,0x5e,0x5e,0xf8, + 0xfc,0xa9,0xf5,0xf2,0xc7,0x8e,0x17,0x2e,0x6b,0x2e,0x7f,0xf4,0x78,0x79,0xfe,0x73, + 0xa7,0xd6,0xe7,0xeb,0xbf,0xd,0x94,0x3f,0xb2,0x2,0x11,0x60,0xf7,0x7f,0xf4,0x78, + 0xb9,0xfc,0xf1,0xe3,0xe5,0xf2,0xc7,0x6e,0x2f,0xce,0xf7,0x86,0x47,0xea,0xb5,0x2a, + 0x7a,0x3e,0x7e,0x9e,0x33,0x8,0x6d,0x64,0xf9,0x20,0xbd,0xe6,0x56,0xf5,0x58,0x44, + 0x11,0x13,0x2a,0x99,0x15,0xa8,0x10,0x69,0xa0,0xd0,0x56,0x9b,0x76,0x71,0x4b,0x42, + 0xb6,0xf7,0x67,0x97,0xe6,0xa2,0x5a,0x31,0xb4,0xbf,0x3f,0xff,0xb9,0xd3,0xfb,0x77, + 0x62,0x8e,0x75,0x3c,0x8e,0x23,0x8d,0xab,0x56,0x9d,0x97,0x3f,0x7a,0xbc,0x5c,0xfe, + 0xe8,0xf1,0x12,0x81,0x97,0x7d,0x84,0x13,0x32,0x5b,0x3e,0xce,0x2f,0x7f,0xec,0x78, + 0x79,0xe1,0xf3,0x63,0x4e,0xca,0x15,0x8d,0xa0,0x49,0xa1,0xad,0x59,0x41,0xa6,0x8b, + 0x72,0x97,0xd,0xa3,0x5,0x10,0x70,0x8a,0xaa,0xfc,0xcb,0x1f,0xdb,0xaf,0xd7,0xcc, + 0xec,0x81,0x8f,0x1e,0x2f,0x2f,0x7c,0x7e,0xaf,0x5c,0x3c,0xa4,0xea,0xad,0x8a,0x18, + 0x1d,0x25,0xda,0x7f,0x91,0x5,0x50,0x86,0x44,0x72,0x9f,0x1d,0xc6,0x71,0x14,0xb5, + 0x93,0x5b,0x55,0xe5,0xa4,0xbc,0xe7,0xe9,0x95,0xda,0xc2,0xc3,0xb4,0xf3,0xe5,0xb2, + 0xa7,0x67,0xa8,0xe8,0x51,0xf9,0xc4,0x75,0x6,0x7b,0xe0,0xa3,0xf5,0xe0,0x99,0x74, + 0x73,0x64,0xc6,0x49,0xea,0x66,0x70,0xb3,0x7,0x3e,0x7a,0x6b,0x79,0xe1,0x8f,0x4e, + 0xaf,0xf,0x7c,0xf4,0x56,0x3f,0x77,0x7a,0x97,0x7,0x41,0x4f,0x22,0xe6,0xca,0x98, + 0x81,0xbe,0x20,0xf6,0xce,0xdd,0xb3,0xa0,0xb6,0xda,0x5f,0xf8,0x7c,0xfd,0x2c,0x1b, + 0xe,0x8c,0x39,0xdf,0x87,0x28,0x81,0x5,0x8,0x74,0xe8,0xec,0x41,0xfc,0xb3,0xe3, + 0x68,0x29,0xc9,0x9f,0xd5,0xbf,0x3e,0xf0,0x91,0x5b,0xcb,0xb,0x5f,0x18,0xf7,0x4b, + 0x40,0xb0,0x13,0xe4,0xb8,0x22,0xb5,0xc3,0x38,0x0,0x46,0x6b,0x60,0x22,0xbf,0x2a, + 0xe8,0xf8,0x99,0xa0,0x4c,0xb4,0x2e,0x45,0x1e,0x49,0x81,0x3b,0x9e,0x3,0x4f,0x73, + 0xb0,0x56,0x4a,0x6c,0xe,0xed,0x8,0x1,0xf9,0x86,0xfa,0x66,0xf6,0xc2,0x17,0xce, + 0xac,0xf,0x7c,0xe4,0xd6,0x92,0xeb,0xcf,0x18,0x63,0x26,0x5d,0x44,0xc2,0xfc,0xbc, + 0xf0,0x85,0xd3,0xeb,0x3,0x1f,0xb9,0xb9,0xf0,0x6b,0x5e,0xf8,0xc2,0x99,0xfe,0xec, + 0x2d,0xe8,0xb0,0x8b,0x9f,0x8,0x7c,0x56,0xf2,0x58,0x7c,0x56,0xea,0xc2,0x16,0xbb, + 0xaa,0x1e,0x3a,0x9c,0xc8,0x9d,0xc4,0x89,0x2c,0x34,0x17,0x6f,0xfb,0x1a,0x39,0xb3, + 0x66,0x7c,0x8f,0x57,0x12,0x38,0xb8,0xed,0x6d,0xc2,0x5b,0xee,0xd4,0x8,0x8f,0x73, + 0x46,0xef,0x33,0xa0,0x19,0x25,0x83,0x54,0x5,0x2d,0xab,0xa8,0x8d,0x8c,0x84,0xf9, + 0x9a,0x30,0xb3,0x17,0xff,0xe8,0xd4,0xfa,0xc0,0x47,0xc6,0xfc,0x15,0x81,0xf3,0xcb, + 0x33,0x8a,0x5e,0xd1,0x3b,0x29,0x19,0x5,0x5b,0x46,0x44,0x1,0x15,0x98,0xbd,0xf0, + 0x85,0x53,0xeb,0xfd,0x1f,0xdd,0xbb,0xe,0x71,0x6f,0x39,0x6d,0xc4,0xfb,0x3f,0x7a, + 0xbc,0xbc,0xf8,0x47,0xa7,0x56,0x6,0xc5,0xf0,0x3c,0x1a,0x50,0x44,0x39,0x8b,0xa9, + 0xb0,0x90,0xfe,0x3,0x1f,0x39,0x5e,0x5e,0xfc,0xa3,0xd3,0xeb,0xb,0x5f,0x38,0xb5, + 0xea,0x7d,0xd4,0x44,0x8c,0xc7,0xe2,0xfb,0x61,0x56,0x13,0x5,0x2,0x49,0x8,0x97, + 0x1a,0xea,0x7f,0x1e,0x95,0xa6,0x62,0xfb,0x3c,0xce,0xfc,0xe3,0xd8,0x21,0x63,0x28, + 0xe6,0xdd,0x7,0x4,0xc4,0xbb,0xaa,0x2a,0xb1,0x12,0x58,0xb0,0xa7,0x74,0x4b,0xf8, + 0xb,0x99,0x3e,0xb5,0x8e,0x30,0x75,0x54,0xee,0xff,0xc8,0xf1,0xf2,0xe2,0x1f,0xd7, + 0x59,0x98,0xe8,0x5,0xd0,0x6c,0x75,0xe2,0x7b,0x1f,0x11,0xdb,0x2d,0x21,0xba,0xff, + 0x23,0xfb,0x33,0xf5,0x99,0x38,0x9,0xdc,0xee,0xff,0xc8,0xf1,0x72,0xff,0x47,0x6e, + 0x2d,0xf7,0x7f,0xe4,0x78,0xe9,0x92,0x8f,0xd1,0x3,0x0,0x41,0x9b,0xdd,0x21,0x88, + 0xdf,0xa4,0x7,0x40,0x9d,0x6,0x36,0xe6,0x88,0x73,0x3c,0xa3,0x39,0x23,0xba,0x57, + 0xbb,0xee,0x2f,0xa5,0xe8,0xe8,0x2f,0x32,0x47,0xbc,0xb7,0x4b,0xa5,0x15,0x8,0x51, + 0xf,0xf4,0xc8,0x1e,0x9,0x7e,0xdc,0x8c,0x36,0xd6,0xf3,0x1c,0xf3,0xd7,0xd3,0xfa, + 0x7f,0xf1,0x8f,0x4f,0xaf,0xf7,0xff,0xda,0xad,0x45,0x99,0x10,0xca,0x3a,0xf0,0x89, + 0xc3,0x1a,0xd0,0x9e,0xf9,0x99,0x95,0xf7,0xb7,0x56,0x4d,0x1,0x73,0xe0,0xd9,0x3a, + 0xb5,0x71,0x85,0x93,0x5a,0x1b,0x59,0x3b,0xa,0xcf,0x98,0xfe,0x1e,0x5b,0xad,0x71, + 0xa3,0x2,0x98,0xd0,0x2b,0xb9,0x4b,0xac,0x58,0x82,0xfb,0x7f,0xed,0xe6,0x72,0xff, + 0xaf,0xdd,0x5a,0x42,0x17,0x39,0x43,0x27,0x9,0x99,0x1e,0xfd,0xd0,0x93,0x59,0x10, + 0x20,0xaf,0x73,0x67,0x76,0x8d,0xb6,0xce,0x31,0x1b,0x6b,0xd0,0xbe,0x29,0x7,0xf0, + 0x2c,0x8a,0x5f,0x99,0x0,0x2b,0x4b,0xd6,0x34,0x7f,0xf1,0x8f,0xcf,0xac,0xf7,0xf7, + 0xc0,0x3b,0xd3,0xc2,0xa3,0x99,0x47,0xe8,0xb4,0xce,0x95,0x32,0xf3,0x1e,0x4a,0xc8, + 0xfd,0x30,0x8a,0xe0,0xd7,0xc9,0x4c,0xda,0x33,0x26,0x86,0x75,0xd5,0x63,0xf7,0xf7, + 0xd0,0x8,0x36,0xe9,0xf1,0x73,0x77,0x50,0x10,0xee,0x93,0xa4,0xf,0x50,0x9c,0x17, + 0xe,0x75,0x32,0xa3,0x56,0x49,0x5c,0xa7,0xba,0x87,0x5a,0x42,0x56,0x8c,0x66,0x72, + 0x4e,0xfc,0x68,0xf4,0x4a,0x16,0x89,0xab,0x37,0xd5,0xe6,0x26,0x54,0x5e,0xef,0xf7, + 0x3b,0x52,0xd5,0xce,0x62,0xff,0x3a,0x37,0xc9,0x1c,0xbe,0xc4,0x27,0x9e,0x20,0x65, + 0xc7,0x6c,0x36,0x70,0xa1,0x29,0xfb,0xf7,0x58,0xc5,0x48,0x66,0x3,0x5,0xe0,0x71, + 0xeb,0x6e,0x23,0x0,0xde,0x16,0x14,0xcd,0x52,0xc5,0x31,0xde,0x4d,0x78,0xa4,0x11, + 0x35,0xbc,0xf1,0xf8,0x21,0x80,0xa3,0x36,0x4d,0x3a,0xbb,0x12,0x1b,0x18,0x78,0x43, + 0x55,0x34,0x83,0x8d,0x26,0xb3,0x22,0x6,0x6b,0x89,0xf6,0x3a,0xb7,0xaf,0xd,0x19, + 0xec,0xc5,0x6d,0x42,0x4c,0xe6,0xa5,0xa6,0x3c,0x62,0x37,0x97,0xce,0x8a,0xf0,0xe1, + 0x63,0x15,0x91,0x30,0x16,0x22,0xe2,0x69,0x66,0xb0,0xfb,0x9e,0xba,0xb5,0xdc,0xf7, + 0xab,0xc7,0xcb,0x7d,0xbf,0x76,0xbc,0xbc,0xf4,0xc7,0xa7,0xd7,0xa1,0xda,0x14,0x8c, + 0x11,0xe8,0xf3,0x5e,0xfc,0xe2,0xe9,0xf5,0xbe,0x5f,0xad,0x0,0x11,0x2,0xee,0xc, + 0x4c,0x6,0x64,0x56,0xd7,0xd5,0xf0,0x68,0xae,0x7d,0xdf,0x53,0xc7,0xcb,0x4b,0x5f, + 0x3c,0xbd,0xbe,0xf4,0x45,0xaa,0xa8,0xdd,0x32,0xcf,0xda,0x26,0x9c,0xe3,0xfa,0x4f, + 0xf7,0xff,0xea,0xad,0xfe,0x1e,0xf7,0x3d,0x75,0x6b,0x69,0xdf,0xf9,0xa5,0x3f,0x3e, + 0xbd,0xde,0xff,0x54,0xd,0x70,0x30,0xbb,0xef,0x57,0x6f,0xed,0xdf,0x8d,0xb3,0xfa, + 0x9,0x4e,0x83,0x51,0x58,0xe2,0x79,0xf,0xb3,0xfb,0x9f,0x3a,0x5e,0xee,0xfb,0x55, + 0xee,0x5c,0x14,0xda,0x87,0x91,0xfc,0x3e,0x7,0x8a,0xc5,0x8a,0x2c,0x6b,0xf4,0xcf, + 0xd0,0xff,0xa3,0x5c,0x6c,0xdf,0x97,0xe7,0xe1,0xbc,0x37,0x63,0x5,0xd9,0x3a,0x58, + 0x63,0xcd,0xc6,0x5d,0x8e,0x49,0xe7,0x82,0xe7,0xa1,0x2e,0x58,0x9b,0xa9,0x8,0x4a, + 0x12,0x2c,0xe1,0xd1,0x97,0x27,0xc,0x88,0x60,0x6b,0xc2,0x4e,0x98,0xcb,0x9e,0xcd, + 0x83,0x15,0x26,0xff,0x7b,0xdf,0x53,0xb7,0x96,0x97,0xbe,0x78,0x66,0x9d,0xee,0xfb, + 0x49,0xcc,0x68,0xdf,0xf7,0xe5,0xba,0x7e,0x66,0xed,0x5e,0xf1,0xb0,0xdc,0x26,0xc, + 0x96,0x4,0x7e,0xb4,0x74,0x6f,0xb8,0x42,0xf7,0x89,0x56,0x8f,0xf9,0xc4,0xf8,0xc6, + 0x2d,0x7c,0x5b,0x4,0xfc,0x81,0x9e,0xc9,0x62,0x49,0xc1,0x5d,0x12,0xaa,0x28,0xf2, + 0xb9,0x14,0xf4,0xda,0xe9,0xfd,0x5e,0xfa,0xe2,0x99,0xf5,0xbe,0xf,0xdf,0x5c,0xc2, + 0xdc,0xae,0x17,0x9c,0xb3,0xca,0x77,0xe8,0xb1,0x4f,0x3c,0x3d,0xd8,0x3d,0x6d,0xd3, + 0x52,0x43,0xbe,0x53,0x8c,0x8b,0xc1,0xae,0xf9,0xe5,0x2f,0x9e,0x59,0xef,0x7d,0xea, + 0xe6,0xb2,0x33,0x9,0x10,0x94,0x10,0x8d,0xba,0xa4,0x38,0xb0,0xde,0xc6,0x99,0x24, + 0x1d,0x6a,0xe8,0xbd,0xef,0x6d,0xf9,0x6d,0xdc,0xff,0x97,0xff,0xe4,0x68,0xbd,0xef, + 0xa9,0x9b,0x8b,0xd,0xb7,0x35,0x4f,0xf8,0xde,0x2e,0x2e,0xef,0x11,0x35,0xee,0x1, + 0xe5,0xab,0x33,0x26,0xd7,0x24,0x7e,0xcf,0xe0,0x30,0xa5,0x61,0x4b,0x95,0xdd,0x1a, + 0x84,0x4e,0x28,0xdb,0xf6,0x6d,0xee,0xfd,0xf0,0xf1,0x72,0xef,0x53,0xc7,0xb,0x8b, + 0x71,0xdc,0xfb,0xd4,0xf1,0xf2,0xf2,0x9f,0x9c,0x5e,0xe3,0x7b,0xf0,0xd,0x90,0x99, + 0x58,0xe0,0xf0,0xe9,0xdc,0xc3,0x87,0x7a,0x13,0xcd,0x6e,0x11,0x66,0x23,0x23,0x7b, + 0xa7,0xec,0x36,0xa2,0x24,0x53,0x45,0xc7,0xdf,0x87,0xee,0x69,0x14,0x74,0xe6,0xc, + 0x92,0x4a,0x9f,0x97,0xbf,0x74,0x7a,0xbd,0xf7,0xc3,0xb7,0x16,0x44,0x87,0xa5,0xfa, + 0x9d,0xef,0xfd,0xf0,0xad,0xe5,0xbe,0xf,0xdf,0x1a,0x73,0x61,0x20,0x65,0xa0,0x7e, + 0x0,0xed,0x3d,0x3,0xed,0xc8,0x61,0x18,0x33,0x28,0x42,0x34,0x1b,0xcd,0x9d,0xd4, + 0x2b,0x9c,0xaa,0xf3,0x4e,0xf3,0x41,0xcf,0x3a,0xdb,0xf7,0x99,0xce,0x90,0x48,0x89, + 0xd0,0xdd,0xec,0xe5,0x3f,0x39,0xbd,0xbe,0xfc,0x27,0xfb,0x5c,0x4e,0xaa,0xa9,0x68, + 0x1e,0xed,0x81,0xf,0x1f,0x6d,0x31,0x3d,0x57,0xce,0x8,0x5a,0xf7,0x2e,0xca,0x4d, + 0x9a,0x75,0xdf,0xfb,0xd4,0xad,0xe5,0xe5,0x2f,0x9d,0x59,0x25,0xeb,0x4e,0xfc,0xda, + 0xa0,0xd6,0x57,0x2f,0xfa,0xe5,0x2f,0x9d,0x5e,0x5f,0xfe,0xd2,0x99,0x95,0xf7,0x10, + 0xaf,0x1f,0xee,0xeb,0x72,0x75,0x78,0xef,0x87,0x6f,0x2e,0xfb,0x73,0x9f,0x14,0x89, + 0xa1,0x3a,0xe3,0xca,0x78,0xb4,0x33,0x5d,0x59,0xc3,0x98,0x1,0xb0,0xdc,0xee,0x7d, + 0xea,0xd6,0x72,0xef,0x53,0xb7,0x96,0x7b,0x7e,0xe5,0xd6,0x22,0xad,0x40,0x41,0xad, + 0xcf,0x5a,0xed,0x48,0x2a,0x66,0xdc,0x5d,0x6a,0xf7,0xf1,0xe5,0x2f,0x9f,0xd9,0xbf, + 0x3f,0x54,0xed,0x8c,0x2b,0xae,0x7b,0x3e,0x7c,0x73,0x11,0xb1,0x1f,0x64,0x2f,0x1, + 0xa4,0xb9,0xa6,0x9b,0x4f,0x1d,0x6c,0x98,0xae,0x13,0x9c,0xfc,0xcc,0x4,0x54,0xc8, + 0x7e,0x7,0x32,0xbb,0x9e,0x74,0xae,0xe,0xb5,0x77,0x63,0x95,0xee,0xa1,0x4d,0x7f, + 0xcf,0x87,0x6f,0x2e,0x2f,0x7f,0x79,0x7f,0xfe,0x2f,0x7f,0xe9,0xcc,0xbe,0x97,0xe5, + 0x31,0x14,0x5,0xc6,0xb2,0xd3,0x2c,0x7f,0x5f,0xc7,0x5c,0x0,0x8a,0x5,0xb0,0x22, + 0x17,0x3d,0xca,0x84,0x42,0x2a,0x82,0x9,0x9b,0xc1,0x26,0xb6,0xb0,0x1c,0xc0,0x46, + 0xd1,0x73,0xcf,0x87,0x6f,0x2e,0xf7,0x7c,0xf8,0xe6,0xd2,0x70,0x16,0xb1,0xdb,0x15, + 0xbb,0x4d,0xc3,0xe1,0xce,0xc8,0x4b,0x1d,0x22,0x89,0xfd,0xf2,0x97,0x8f,0xd6,0x7b, + 0x7f,0xe5,0xe6,0xa2,0x6e,0x9d,0x10,0xbb,0x7b,0x90,0x3f,0xc7,0xf0,0x11,0xf1,0x20, + 0x66,0x94,0xad,0x5b,0x3b,0xa0,0xb7,0x32,0xa2,0x22,0xa6,0xa7,0x73,0xf9,0xe1,0xdd, + 0x4f,0x20,0x56,0xf0,0x2c,0xb5,0xb,0x76,0x49,0x63,0xdc,0x54,0x64,0x1b,0x45,0xe6, + 0x4b,0xc3,0x4f,0xd4,0xa4,0xe6,0xe5,0x2f,0x9f,0x59,0xef,0xf9,0x95,0x9b,0x4b,0xee, + 0xac,0x22,0x81,0x33,0x7b,0xec,0x1,0x88,0x9d,0xe1,0xfd,0xfe,0xb7,0xe7,0x53,0x0, + 0xd8,0x3d,0xbf,0x72,0xbc,0xdc,0xf3,0x2b,0x15,0xa9,0x47,0xa,0x6e,0xa9,0xea,0x63, + 0x6a,0xb,0x73,0xc9,0x2d,0xd2,0xcc,0x77,0x50,0x4,0x28,0xe8,0x61,0x62,0x59,0xca, + 0xfc,0x3f,0x31,0x41,0xa8,0xd9,0xd3,0x3d,0x1f,0x3a,0x5e,0x5e,0xfd,0xf2,0xe9,0xf5, + 0x95,0x2f,0x9d,0x5e,0xef,0xfd,0xd0,0xbe,0x19,0x80,0x5c,0xf1,0x7a,0x68,0x49,0x2, + 0x19,0x2d,0x98,0xda,0xcf,0xe4,0xf9,0xcd,0x26,0x19,0x7d,0x91,0x5,0xa4,0x7c,0xab, + 0x10,0x99,0x43,0xd8,0xce,0x86,0x57,0xbe,0x74,0x7a,0xdd,0xf,0x45,0x48,0x45,0xc7, + 0xd5,0x57,0x43,0x20,0x8f,0xeb,0x8d,0x2d,0x2e,0x4c,0xb5,0x85,0x65,0x1e,0x43,0xaa, + 0x74,0x9,0xbd,0x1d,0xba,0x29,0xfb,0xe7,0xb8,0xa8,0x54,0xbe,0xf2,0xe5,0xd3,0xeb, + 0x2b,0x5f,0xde,0xc1,0x22,0xf1,0xa1,0xe1,0x0,0x35,0x4f,0x1,0x8d,0x50,0x25,0x3a, + 0xb8,0x54,0x75,0x31,0xf3,0x57,0x4,0x71,0xe8,0x7a,0x0,0x59,0xf1,0xe,0xb1,0x72, + 0x9b,0x54,0x6d,0xe0,0x75,0xa7,0xf7,0xad,0xfd,0xef,0xa5,0xf,0xdd,0x5a,0xee,0xf9, + 0xd0,0x1e,0x28,0x3a,0xea,0x76,0xe6,0x46,0x47,0xa8,0xda,0x7b,0x3e,0x74,0x6b,0x79, + 0xe5,0xcb,0x67,0xd6,0x1e,0x30,0xa4,0x3,0xe4,0xd2,0xa1,0xba,0xa7,0xbe,0x7f,0x84, + 0x88,0xdd,0xf3,0xa1,0x9b,0xcb,0xab,0x5f,0xde,0x5b,0xc5,0x8c,0x17,0x81,0xdc,0x23, + 0x9f,0x56,0x87,0xaf,0x7c,0xe5,0xcc,0x7a,0xcf,0x87,0x6e,0x2e,0x1e,0x3a,0x2c,0x36, + 0x81,0xa1,0xa1,0x7e,0xd6,0x2b,0x5f,0x3e,0xb3,0x8a,0x42,0x58,0x7d,0xe9,0x7e,0x7d, + 0x5c,0xdd,0xcd,0x0,0xac,0xfb,0xf5,0xbc,0xf2,0xe5,0x33,0xeb,0xab,0x5f,0x3d,0xb3, + 0xde,0xf3,0x21,0x9d,0x55,0x37,0x65,0x3d,0xc0,0xe,0x6b,0x4d,0x87,0x4e,0x99,0x63, + 0x36,0x1b,0x1c,0x5d,0xe,0x7e,0x7f,0xa0,0xd8,0xab,0x5f,0x3e,0xaa,0x9f,0x5d,0xf, + 0x72,0x37,0xbb,0xe7,0x83,0xfb,0xf7,0xea,0x14,0xb4,0x6d,0x98,0x6e,0x8c,0x35,0xe, + 0xd9,0x7f,0x91,0xef,0x88,0xe8,0x74,0x7,0xc2,0x67,0x38,0x61,0x45,0xb6,0x20,0xb1, + 0xbd,0x85,0xc0,0xc6,0xad,0x75,0x20,0xb9,0xb7,0xb1,0xc4,0x6e,0xb4,0x11,0x35,0xea, + 0x70,0x22,0xae,0x7d,0x1b,0xe8,0x71,0x71,0xd,0x24,0x2c,0xc,0x77,0x21,0x1,0xef, + 0xa8,0x7d,0x98,0x9a,0x3,0xb5,0xd7,0xbc,0xf2,0x95,0xa3,0xb5,0xaf,0x79,0xa1,0xa7, + 0x41,0x81,0x8d,0x8,0x6e,0x94,0x5b,0x3,0x7a,0x46,0xb3,0xa3,0xd0,0xa1,0x60,0x0, + 0x6e,0xc0,0xe8,0xa8,0x83,0x25,0x72,0x87,0x35,0xe4,0x59,0x3d,0xb8,0xf1,0x59,0x6c, + 0xcc,0xcb,0x56,0x26,0x5,0x3f,0x97,0x57,0xbe,0x72,0xb4,0x5e,0xfa,0xe0,0x8d,0x25, + 0x9a,0xbe,0x48,0xdf,0x22,0x7a,0x5a,0xd0,0x5c,0x1c,0x80,0xbd,0xf2,0x95,0xa3,0xf5, + 0x95,0xaf,0x1c,0xad,0x9d,0x3e,0x6a,0xb0,0x57,0xbf,0x7a,0xb4,0xde,0xf3,0xc1,0x9b, + 0x8b,0x74,0x80,0xa1,0xb8,0x14,0xa6,0xd2,0xa9,0xc0,0xd9,0xe4,0xfc,0x9b,0xf1,0xbb, + 0xa0,0x9d,0x60,0x3d,0xeb,0x2,0xc6,0x49,0x1b,0x10,0xca,0x56,0xd9,0x88,0xc4,0x2b, + 0xdd,0x2f,0xb3,0xc2,0xe8,0x3a,0x27,0x8a,0xd8,0xa5,0xf,0x1d,0x2f,0xaf,0x7e,0xe5, + 0xf4,0x6a,0xe4,0xed,0x2a,0x63,0x1,0xec,0x9b,0xd2,0x23,0xc7,0xd1,0xb,0xad,0x4f, + 0x4,0xa1,0x96,0xf1,0xba,0x4b,0x1f,0xbc,0xb5,0xbc,0xfa,0xd5,0x33,0x2b,0x26,0xd5, + 0xaa,0xcc,0x85,0xa2,0xf7,0xb6,0xe9,0xec,0xeb,0xd5,0xaf,0xec,0x87,0x91,0xc3,0xed, + 0xd2,0x87,0x6e,0x2d,0x97,0x3e,0x38,0x2a,0xd6,0x99,0x94,0x5e,0x1a,0x3d,0x46,0x6d, + 0x60,0xcc,0xfc,0x6e,0xd9,0x64,0x4,0x76,0x4f,0xbd,0x76,0xb3,0x58,0x75,0xe4,0x6b, + 0x5,0xcd,0x80,0x58,0x75,0x69,0xd6,0xc6,0x9b,0xcd,0x6d,0x52,0xa5,0xd4,0x29,0x4c, + 0x9e,0xdd,0xd5,0x42,0x85,0x55,0x12,0x88,0x45,0x71,0xc0,0x19,0xb0,0x98,0x59,0xd8, + 0x9,0xa0,0x12,0x2a,0x82,0x66,0xea,0xf0,0xea,0x57,0xcf,0xac,0x97,0x3e,0xb8,0xdf, + 0xff,0x57,0xbf,0xca,0x15,0xad,0xa5,0xf9,0x7a,0xe0,0x3d,0x84,0xee,0xca,0x9c,0xd3, + 0x9c,0x31,0x1c,0xa1,0xaa,0xa9,0xef,0x7d,0xe9,0x83,0x37,0x97,0xd7,0xfe,0xf4,0xcc, + 0x2a,0x9d,0x84,0xfa,0xe6,0xaf,0xfe,0xe9,0x1e,0xbc,0x6c,0xe2,0xe3,0xce,0xa8,0xfc, + 0x34,0xcb,0xf4,0x3,0x1d,0x88,0x50,0xbd,0xb9,0x67,0x1b,0x4f,0xb1,0x9c,0xf4,0xda, + 0x16,0x8f,0x5e,0xcb,0x13,0xd5,0xb2,0xd7,0xbe,0x7a,0xb4,0x5e,0xfa,0xc0,0x1e,0xe8, + 0x10,0x5a,0xfc,0x8e,0xa8,0xd9,0x3f,0x28,0x79,0x16,0x66,0xf8,0x56,0xef,0xc9,0xa5, + 0x7a,0x58,0xb5,0xb7,0x69,0xf7,0x49,0x5b,0x96,0xaa,0xf9,0x9f,0xcc,0x76,0x22,0x6f, + 0xcb,0x70,0x70,0xfd,0x25,0x70,0x55,0x7d,0xdd,0xa5,0xf,0xdc,0x58,0x5e,0xfd,0xd3, + 0x33,0xab,0xd3,0xc8,0xe5,0xd5,0xf6,0x5d,0x79,0x16,0x4c,0xd5,0x1f,0x7c,0xfc,0x5e, + 0x3c,0x23,0x72,0x49,0x48,0x89,0x83,0x8d,0xcf,0xbc,0xf8,0x81,0x9b,0x4b,0x3,0xbb, + 0x39,0xa3,0xf3,0x91,0xd7,0xa6,0xb8,0x95,0x21,0xa3,0xd7,0xfb,0xe8,0xad,0x1d,0xea, + 0xbb,0x9a,0x87,0x5d,0xfa,0xc0,0xcd,0xe5,0xd2,0x7,0x6e,0x2e,0x40,0xbe,0xac,0x51, + 0x59,0x5,0x8f,0xee,0x48,0x85,0x75,0x92,0x84,0x16,0x5,0xb3,0xf1,0x9a,0x8b,0xf5, + 0xfb,0xe8,0x39,0x16,0xf7,0x4d,0xc0,0xbe,0x4,0x5c,0x38,0x77,0x12,0x1,0x4d,0x80, + 0x7c,0xe2,0x9c,0x38,0xf7,0x8c,0xa0,0xf3,0x86,0xc0,0xa5,0xaf,0x7d,0xad,0x3d,0x4f, + 0x44,0xd1,0x43,0xea,0x98,0x22,0x30,0x67,0x44,0x14,0xb2,0x1f,0x4f,0x17,0x3f,0x70, + 0x63,0x79,0xed,0x6b,0x47,0xab,0x73,0x3b,0xdc,0x99,0x21,0x13,0x74,0x9a,0xb8,0x13, + 0xd6,0xf4,0xd6,0x2b,0xcd,0xc9,0x49,0xc7,0x7,0x18,0xe0,0xc7,0x59,0xa7,0xaf,0xe3, + 0xbb,0x10,0xdd,0xda,0x4c,0x4,0xb2,0x5c,0xb0,0xf,0x93,0xb3,0x8a,0x71,0x60,0xd2, + 0xd5,0xf4,0x84,0x45,0x9a,0x9e,0x2b,0xce,0x9c,0x8,0x97,0x6e,0x65,0x14,0x2c,0xaa, + 0x2d,0x77,0x24,0x14,0xaf,0xa0,0x6e,0xe1,0x82,0xa6,0xe4,0xaa,0xe9,0xe2,0xfb,0x6f, + 0x2e,0x97,0xde,0x7f,0x4b,0x85,0xed,0x31,0x71,0x85,0x4f,0xb3,0xad,0xf8,0x7e,0x1, + 0x99,0xb9,0x99,0x5d,0x7c,0xff,0xad,0x71,0xe0,0xf4,0xaa,0x3d,0xcf,0xd8,0xb8,0x2, + 0x66,0xd4,0xe6,0x54,0x27,0x37,0x54,0x27,0x11,0x1d,0x99,0xe,0xd8,0x38,0xfb,0x6, + 0x26,0x9c,0xd5,0x90,0x15,0x86,0xeb,0xe0,0x6c,0xcf,0x2d,0x54,0x16,0x50,0xca,0x18, + 0x6b,0x3,0xb7,0xc3,0xe4,0xb5,0xaf,0x9d,0x59,0x2f,0xbe,0x7f,0xef,0x4e,0x5c,0x7c, + 0xff,0xcd,0xe5,0xe2,0xfb,0xf7,0x59,0xcd,0xc5,0x27,0x6f,0x2d,0xaf,0x7d,0xed,0xcc, + 0xfa,0xda,0x9f,0x9e,0x59,0x2f,0xbe,0x7f,0x47,0x6d,0xb6,0xdf,0xb9,0xf2,0xa7,0x67, + 0xd6,0xd7,0xbe,0x76,0xa6,0x8b,0xf5,0x70,0x4b,0xd6,0xa3,0x78,0xc,0x2,0xff,0x37, + 0x8d,0x1f,0xf4,0xd1,0xe9,0xcc,0xae,0x18,0x6b,0x14,0xcb,0x6c,0x6a,0x53,0x77,0x2d, + 0x8f,0x8,0x50,0xb,0xc8,0x5b,0x57,0xa7,0xa2,0xe,0x68,0x62,0x24,0x35,0x2,0xf5, + 0x11,0x5a,0x1d,0xb6,0xef,0x6d,0xb6,0x1f,0x2a,0x17,0x9f,0xac,0xf7,0x85,0xbc,0xb6, + 0x2d,0x56,0x7b,0x66,0x76,0xf1,0xfd,0x37,0xfa,0x5a,0x6b,0x2d,0xd9,0xd7,0xbe,0x76, + 0x34,0xee,0x2b,0xeb,0xd8,0xcb,0xac,0x4b,0x85,0x56,0xfa,0x67,0x4d,0x12,0x21,0x5e, + 0x7,0x17,0x9f,0xbc,0xb9,0xbc,0xf6,0xb5,0xa3,0x35,0x96,0xbc,0xdc,0x3d,0x70,0xf8, + 0xfe,0xec,0x9f,0xbc,0xb9,0xc4,0x5a,0x84,0x7f,0x7f,0x7c,0xf,0x74,0x4a,0x94,0xcc, + 0x24,0xd3,0x6c,0xe,0xa4,0x52,0x45,0x15,0x60,0xc0,0x7c,0x5c,0xf9,0xda,0xd1,0x7a, + 0xf1,0xc9,0x1b,0x4b,0xc4,0x7a,0xb0,0xaa,0x24,0x42,0x7,0x3,0x86,0x9d,0x87,0xbd, + 0x11,0xe,0x23,0xbc,0x3f,0x63,0x1a,0xc6,0x8,0xcc,0xc3,0xfd,0xb6,0xde,0x4a,0xbd, + 0xf2,0xb5,0xa3,0xf5,0xc2,0xfb,0x6f,0x2c,0xc3,0x1,0x70,0x82,0x9d,0x11,0x7b,0x65, + 0x24,0x59,0xd2,0xbe,0x2e,0x8b,0x56,0x8e,0x7c,0xef,0xcc,0xcc,0xae,0x7c,0xed,0xec, + 0xbe,0x66,0x8c,0xe8,0x5b,0x16,0xa8,0x5e,0x66,0x76,0xe1,0xc9,0x9b,0xcb,0x78,0xdd, + 0x58,0xbb,0x91,0xdd,0x22,0x98,0x98,0xfe,0xfe,0x37,0x16,0x1,0x71,0x21,0xe8,0xef, + 0x6d,0xa3,0x20,0x16,0x87,0xc3,0x50,0x1,0x47,0x2c,0xb,0x8c,0x67,0xab,0x7a,0xac, + 0x5d,0x78,0xdf,0x8d,0xe5,0xe2,0x93,0x37,0x16,0xf,0x63,0x22,0xdf,0xcc,0x5e,0xfb, + 0xb3,0xb3,0xeb,0x85,0x27,0x47,0xc5,0x6b,0x6e,0x76,0xf1,0xc9,0xfd,0xf5,0xdd,0xb6, + 0xd6,0x6,0xaf,0xff,0xc2,0x93,0x37,0x96,0x2b,0x5f,0x3b,0xbb,0x46,0x6c,0x4a,0x77, + 0xf,0x74,0xea,0x52,0x32,0xd6,0xc7,0x60,0x17,0x9f,0xbc,0xb1,0x5c,0x78,0xf2,0xc6, + 0xd2,0x29,0x78,0xe,0xc1,0x43,0x88,0xa6,0x3a,0x75,0x39,0xf4,0xc,0x83,0x5d,0xf9, + 0xb3,0xa3,0xf5,0xc2,0xfb,0xae,0x2f,0x60,0x45,0xbb,0xf6,0x19,0xef,0xbb,0xb1,0x5c, + 0xf9,0xb3,0xa3,0xb5,0xcf,0x9c,0xb7,0xf1,0xe4,0xe4,0x79,0xbb,0x3a,0x21,0x72,0xb5, + 0x8c,0xc0,0x3a,0x19,0xc8,0x4b,0xc5,0x25,0xc0,0x42,0x97,0x1,0xba,0x8f,0xcd,0x2, + 0x46,0x29,0x3,0x15,0x52,0x5c,0x51,0xd5,0x45,0x24,0xd1,0xa8,0xfd,0xfb,0x9d,0x5d, + 0x65,0x5d,0xd2,0x5e,0x2e,0x17,0xde,0x7f,0x73,0xb9,0xf2,0x67,0x67,0x56,0xf7,0x19, + 0xdf,0xd8,0x3,0xea,0x4f,0x3f,0x20,0x2a,0x70,0x49,0x7d,0x7,0xe5,0xd0,0xc5,0x6b, + 0xe3,0x19,0x46,0x7,0xd,0x4c,0xdc,0xd1,0xda,0x7f,0xae,0x7c,0xfd,0xcc,0x7a,0xe1, + 0xc9,0x9b,0xcb,0x85,0x27,0xf7,0xeb,0x15,0xeb,0x51,0xaa,0x6c,0xae,0xfc,0xd9,0xfe, + 0x3a,0x51,0x83,0x9b,0x18,0x11,0xcb,0xe7,0x7b,0x0,0xe6,0x79,0x91,0xb9,0xa0,0x23, + 0xf0,0x90,0x39,0x93,0xf,0xd5,0x7c,0xe4,0xe5,0xc6,0x19,0x87,0x20,0x88,0x5d,0x79, + 0x9e,0xdc,0x79,0x60,0xd,0x7c,0x8f,0xfe,0xbd,0xa6,0x33,0x1e,0x56,0x8a,0xea,0x12, + 0xb2,0xac,0x7d,0xdc,0x9e,0x1,0x65,0x88,0xea,0x65,0xa1,0xc8,0x5e,0xb8,0x89,0x61, + 0xcf,0x18,0x77,0xc1,0xae,0x7e,0xfd,0xcc,0x7a,0xe1,0x7d,0x37,0x16,0x99,0x7f,0x77, + 0x69,0x4a,0xb,0x33,0x55,0x62,0x33,0xc8,0xdc,0xdc,0xc9,0xb5,0x2e,0x57,0x7e,0xdd, + 0xce,0x91,0xdb,0x54,0x9e,0xbd,0xa6,0xdd,0x98,0xd1,0x10,0x55,0xbe,0xdc,0xae,0x7c, + 0xfd,0x68,0xbd,0xf2,0xf5,0xa3,0x35,0xfb,0x60,0x7b,0xaa,0x30,0x50,0x32,0xf0,0x8b, + 0xf9,0xd8,0x43,0xc1,0x30,0xce,0x1e,0x5d,0x90,0xea,0x1e,0x29,0x9d,0x54,0x29,0xba, + 0x9b,0x9d,0x7f,0xdf,0x8d,0xe5,0xca,0xd7,0x8f,0x56,0x4b,0x5c,0x7f,0x4,0x6,0x1, + 0x3d,0x5b,0xd6,0x7b,0x2a,0x10,0x46,0xc3,0x95,0xaf,0x1f,0xad,0xe7,0xdf,0x77,0x63, + 0x69,0xef,0xd1,0xde,0x7f,0xd6,0xb1,0x69,0xf7,0xfb,0xc2,0xfb,0x6e,0x2c,0x57,0x9e, + 0x3e,0x5a,0x85,0x65,0x30,0x59,0xeb,0xbc,0x86,0xbb,0xa7,0x76,0x74,0x76,0xe3,0xce, + 0x45,0x58,0xdf,0x40,0xc6,0xcb,0x78,0x30,0x9b,0xe0,0x59,0xc1,0xd5,0xa7,0x8f,0xd6, + 0xab,0x4f,0x1f,0xad,0xfd,0x59,0xa5,0x75,0x3f,0x96,0xf4,0xd5,0xaf,0x1f,0xad,0xe7, + 0xdf,0x7b,0xa3,0x8b,0x30,0xc1,0x61,0x17,0xde,0x7b,0x63,0x39,0xff,0xbe,0x1b,0xb, + 0xe3,0x71,0x2f,0xbc,0xef,0xc6,0x72,0xf5,0xe9,0xb3,0xab,0xa8,0xc2,0x19,0xf6,0x7b, + 0xd0,0x9f,0x3,0x9,0xb6,0x72,0xb1,0xcf,0x37,0x7a,0x86,0x45,0xc1,0x18,0x3f,0xca, + 0x3e,0x74,0xe5,0x1d,0xb3,0xa8,0xca,0xd5,0xa7,0xeb,0x75,0x1b,0x39,0x29,0xb6,0xbd, + 0x1,0xed,0x1c,0xd,0x7e,0xf4,0xf0,0x20,0x38,0xff,0xbe,0xeb,0xcb,0xd5,0xaf,0x9f, + 0x5d,0xaf,0x7e,0xfd,0x68,0xec,0xc3,0xfa,0xe5,0x3c,0x3a,0x92,0x41,0xcf,0x23,0x46, + 0x39,0x9d,0x7f,0xef,0xf5,0xe5,0xca,0xd7,0x8f,0x56,0x84,0xbd,0xd0,0xaa,0xcd,0x2b, + 0x4f,0x9f,0x5d,0xcf,0xbf,0xf7,0xfa,0x22,0x3a,0x19,0xd4,0xd5,0xc8,0x9d,0x1,0xad, + 0x46,0x79,0xee,0x1d,0xf7,0x13,0x3b,0xc7,0xf9,0x84,0xf5,0x30,0xe,0x3f,0xf,0x7c, + 0x70,0xad,0x66,0x93,0x16,0x4a,0x54,0x8,0x9d,0xe1,0xa0,0x8,0xa1,0x1f,0xb9,0x75, + 0x33,0x26,0xc6,0xa1,0x4e,0xa5,0x4d,0x3a,0x2b,0x66,0x99,0xa1,0xf0,0xd6,0x5e,0x6a, + 0x25,0x55,0xf6,0x57,0x9f,0x3e,0xb7,0xdf,0xf7,0x49,0x1f,0xd3,0x42,0x47,0xa6,0x5d, + 0xff,0xd5,0xa7,0xcf,0xae,0x17,0xea,0x9a,0x3a,0xb9,0xd5,0xc,0x61,0x23,0x85,0x36, + 0x87,0xd9,0xb6,0x69,0x39,0xbf,0x31,0x3f,0xae,0xbe,0xfb,0xc6,0x73,0x52,0x9e,0x61, + 0x74,0x51,0x2,0x6,0xd7,0xf9,0x58,0x9b,0xfd,0xfd,0x4c,0xad,0x42,0x6b,0xdb,0xf0, + 0xea,0xd3,0x67,0xd6,0x61,0x86,0x32,0xe8,0x6f,0xdb,0x16,0x9f,0xdf,0xbe,0xc8,0xda, + 0xcf,0xdb,0x7b,0x5e,0x7d,0xfa,0xcc,0xa,0xf6,0xa0,0xed,0x9b,0x64,0xf0,0x78,0xb7, + 0x2d,0xd3,0x24,0x44,0x85,0xbd,0xdf,0x13,0xfe,0xae,0x90,0x3f,0x77,0x27,0xb6,0xfe, + 0x7e,0xae,0xf7,0xa5,0x5e,0xe3,0x46,0x1c,0xdd,0x6d,0x53,0x9a,0xd4,0x90,0x30,0xac, + 0xaf,0x73,0xb,0x42,0x2f,0xfb,0x7b,0x9f,0x7d,0xcf,0xcd,0xe5,0xda,0xd3,0xfb,0x1, + 0x74,0xee,0xbd,0x37,0x96,0x8d,0x78,0xb8,0xdb,0x96,0x1a,0xd1,0x41,0xc0,0x87,0x94, + 0x95,0xd8,0x7b,0x7b,0x32,0x18,0xed,0x46,0x66,0x51,0xcf,0x99,0x7a,0x61,0xdb,0x16, + 0x71,0x73,0xfb,0xf5,0xf2,0xf3,0xd9,0xba,0x62,0x54,0xfb,0xfe,0xfb,0x35,0xf1,0x7d, + 0x4,0x87,0x43,0xa,0xae,0x1b,0xb1,0x1f,0xda,0x72,0x93,0xb5,0xd6,0x4d,0x6b,0xf4, + 0xf9,0x5b,0x62,0x89,0x1e,0xf0,0x4f,0x71,0xbe,0xa6,0xb2,0xff,0xbe,0xfa,0xc5,0xe8, + 0xf7,0xe4,0xf5,0xef,0x7c,0xbf,0x8b,0xe8,0x95,0x6f,0x1b,0x77,0x3d,0xdc,0xa2,0x21, + 0xd0,0x35,0xa,0xa2,0x9d,0x6d,0x1e,0xf6,0xc4,0xd9,0xf7,0xdc,0x58,0xae,0x3d,0x7d, + 0xb4,0xb6,0xdb,0xbd,0x6d,0x39,0xd1,0xe6,0xfb,0x29,0x9f,0x5b,0xaf,0x19,0x30,0xbb, + 0xf6,0xe7,0x47,0xeb,0xb9,0xf7,0xec,0x9b,0xbc,0x7d,0xee,0xb9,0xf7,0x5c,0x5f,0x5e, + 0xff,0xe6,0xd1,0xba,0x6d,0x62,0xd4,0x34,0xf6,0x3f,0x60,0xe7,0xde,0x7d,0xbd,0xaf, + 0xb3,0xfd,0x75,0xaa,0xaf,0xde,0xee,0x79,0x5b,0x4b,0x7c,0x7e,0xb4,0xb8,0xb3,0xb1, + 0x46,0x35,0x9d,0x15,0xde,0x5e,0x67,0xea,0x84,0x6,0x52,0x1e,0x13,0xda,0xab,0x85, + 0xfb,0xdd,0x82,0xa3,0xeb,0x1a,0x33,0xc0,0xce,0xbe,0xfb,0xfa,0x72,0xed,0xe9,0xb3, + 0xab,0xc3,0xec,0xdc,0x7b,0xae,0x2f,0xd7,0xbf,0x79,0x76,0xb5,0x70,0x36,0x80,0x9c, + 0xa9,0xf4,0x59,0x8d,0x56,0xf5,0xb6,0xa9,0xa7,0xc5,0xb9,0x77,0x5f,0x5f,0x5a,0xb2, + 0xbd,0xbf,0x27,0xaf,0x7f,0x95,0x9c,0xe6,0xeb,0x94,0xbf,0x1b,0x44,0xff,0x7c,0xdb, + 0xe6,0x8d,0xc3,0x76,0x56,0x18,0xf2,0x59,0xd1,0xf6,0x33,0xff,0xec,0xda,0x9f,0x9f, + 0x5d,0xf9,0x3d,0xb6,0x6d,0x4e,0xfc,0xde,0xb6,0x8c,0x9,0xd8,0xa8,0xe3,0xb9,0x6d, + 0x26,0x95,0x68,0xbb,0x37,0x7a,0xae,0x8c,0x9f,0x95,0xfe,0xfb,0x63,0x3d,0x42,0x79, + 0xca,0x61,0x4f,0x82,0x62,0xc,0xff,0xb4,0xd8,0xd9,0x77,0xbf,0xbe,0x5c,0xfb,0xf3, + 0x73,0xab,0xb5,0x67,0xc2,0x2d,0x7f,0x7,0x3d,0x37,0x13,0xbd,0xfe,0x2d,0xfa,0xd, + 0x84,0x3d,0xdb,0xe2,0xc7,0x46,0x9d,0x1d,0xf9,0xfc,0x34,0xde,0x1c,0x31,0x1,0xfd, + 0x73,0xa9,0x2b,0xe8,0x3e,0xcc,0xb4,0x90,0x83,0xeb,0x46,0x1e,0x24,0xed,0x7e,0x74, + 0xed,0x75,0xf,0xbe,0x2,0x74,0xd1,0x1c,0x57,0xdb,0xe7,0x8f,0x7b,0x8b,0x2e,0x9c, + 0xd5,0xf6,0xcb,0x46,0xba,0xfd,0xe,0xfd,0x5d,0x0,0x56,0x18,0x71,0x3a,0xe6,0x4b, + 0x34,0xef,0x41,0xe6,0x19,0x1b,0xbf,0xc6,0x95,0xd6,0xa4,0x7a,0xe5,0xec,0x86,0x45, + 0xdc,0x69,0xa9,0x42,0x8c,0xac,0x16,0xb3,0x9b,0x9a,0xb1,0xec,0x2c,0x55,0xee,0xc2, + 0x88,0x4f,0x8e,0x49,0xc1,0x65,0x3a,0x30,0x78,0xf8,0xfb,0x20,0xc8,0x74,0x5a,0xe4, + 0x13,0x17,0x48,0x95,0xac,0xfa,0xbd,0x3a,0x73,0x85,0x5,0xff,0xed,0x9,0xc7,0x98, + 0x3b,0xf,0x2c,0xec,0x71,0xf6,0xdd,0x37,0x96,0xd7,0xbf,0x71,0xb4,0x36,0x66,0x80, + 0x9b,0xbd,0xf5,0xcc,0x8a,0x90,0xa5,0xd7,0xbf,0x71,0xb4,0xbe,0xfe,0xcd,0xa3,0x55, + 0x2d,0x1b,0xf9,0x2f,0x85,0x2a,0xd8,0x32,0x5,0x2d,0x47,0x65,0x32,0x16,0x58,0xf1, + 0xd0,0x22,0x17,0x9e,0x79,0x98,0x7d,0xb7,0xff,0xbf,0xfe,0x8d,0xa3,0xf5,0xe8,0xdd, + 0x37,0x97,0xa3,0x77,0xdf,0x58,0xae,0x7f,0xe3,0x6c,0xf,0x50,0x8c,0xc5,0x90,0x39, + 0xb8,0x29,0x62,0xd4,0x44,0x6a,0x52,0x91,0xa3,0x7c,0x7f,0xce,0xbe,0xfb,0xc6,0x72, + 0xfd,0x1b,0x47,0xab,0x73,0xe2,0x21,0x60,0x25,0x4c,0x50,0xbc,0x34,0x67,0xb,0x15, + 0x95,0x9b,0x22,0x88,0xf3,0x8c,0x18,0xea,0x21,0x40,0x6a,0x60,0xce,0x3d,0x58,0xa1, + 0xaa,0x4,0x49,0x54,0x51,0xdc,0xc2,0x9c,0x8f,0xdb,0x40,0xa5,0xa4,0xc,0x7,0xaa, + 0x34,0x38,0xc1,0x72,0x4a,0x58,0xe3,0xba,0x8b,0xa,0x6d,0x67,0xdf,0x75,0x63,0xf, + 0x76,0xa1,0x9d,0x98,0xb8,0xbe,0xd0,0xaa,0x1b,0xc4,0x8,0x89,0x15,0x3a,0x98,0x65, + 0x11,0x79,0xb8,0xf5,0xff,0xaf,0x7f,0xf3,0xec,0x7a,0xf6,0x5d,0xd7,0x17,0xf7,0xc3, + 0x74,0xb8,0x43,0xe,0x75,0x71,0xbd,0x47,0xef,0x82,0xa3,0x77,0xd5,0x0,0x4e,0xbc, + 0xe8,0xa3,0x27,0xae,0x2f,0x47,0xed,0xf3,0xa4,0x6a,0x8a,0x8c,0x12,0x4b,0xdc,0xec, + 0xf6,0xd7,0xb3,0xef,0xba,0xbe,0x5c,0xff,0xd6,0xd9,0xf5,0xf5,0x6f,0x9c,0x9d,0x76, + 0x3c,0x10,0xd5,0xf9,0x82,0xd2,0x17,0xaf,0x19,0xee,0xc4,0x5c,0xff,0xe6,0xb9,0xf5, + 0xe8,0x5d,0x37,0x96,0x61,0xa7,0x81,0xfc,0xf9,0x36,0xab,0x12,0x3,0x93,0x3,0xb9, + 0x63,0x1a,0xef,0x63,0xbb,0x37,0x91,0xe7,0xcd,0x1d,0x26,0x27,0x4d,0xd3,0xa3,0x77, + 0x5d,0x5f,0xae,0x7f,0xeb,0xdc,0x6a,0x66,0x76,0xe3,0x5b,0xe7,0xd6,0xa3,0x77,0x5d, + 0xef,0xdd,0x9f,0xfe,0x5e,0x41,0x9b,0x61,0x9c,0xc9,0xae,0xbc,0x6e,0x62,0x5d,0x1c, + 0x3d,0xf1,0xfa,0x72,0xe3,0x5b,0xe1,0x3e,0x62,0xac,0x3b,0xb,0x5d,0x18,0x8b,0x9d, + 0x9f,0x60,0xfa,0x34,0x53,0x90,0xd4,0x9f,0xfb,0xe8,0xa,0x30,0x43,0xc7,0x10,0x18, + 0x21,0x15,0x34,0x7,0xdb,0x9f,0xcb,0x13,0xd7,0x97,0x84,0xdc,0xa7,0xa2,0x6b,0xac, + 0x1f,0x2,0x28,0xba,0x6a,0xf8,0x73,0xa7,0x4e,0x46,0x72,0x91,0x25,0xd2,0xf6,0x4a, + 0x60,0x8a,0xf0,0xd9,0xea,0x61,0xee,0x29,0xac,0x16,0xee,0x47,0xd6,0xcf,0x3f,0x79, + 0xe3,0x9b,0xb5,0xed,0xb2,0x8d,0x8a,0xe2,0xcc,0x13,0xfb,0x42,0xe6,0x42,0xd2,0xb7, + 0x1,0xe3,0xe8,0xa2,0xfd,0x9b,0x87,0xd6,0x73,0xcb,0x62,0x68,0xe5,0x14,0x3a,0x78, + 0x6a,0xf6,0x73,0xe6,0x89,0xeb,0xcb,0x8d,0x6f,0x9e,0x5d,0x59,0xb3,0xd9,0xcd,0x62, + 0x24,0x4b,0x4,0xfe,0xb6,0x20,0x9a,0xed,0x5e,0xef,0x44,0x6d,0x6e,0x47,0x4f,0xdc, + 0x58,0x6e,0x7c,0xeb,0xec,0xca,0xd9,0x3d,0xe8,0xa9,0xf4,0x36,0x32,0xfd,0xce,0x58, + 0x4,0x18,0xea,0x5f,0x3e,0xee,0xc1,0x8d,0x6f,0x9e,0x5d,0x7,0x72,0x9c,0xf4,0xc6, + 0x37,0x4f,0xe7,0xd1,0xb8,0x7f,0xfb,0xbf,0xdf,0xf8,0xf6,0xd9,0xf5,0xe8,0x89,0xeb, + 0xcb,0xcd,0x6f,0x9f,0x5d,0x7d,0xf3,0x81,0x89,0xd8,0x86,0xe4,0xfe,0xd1,0x13,0xaf, + 0x2f,0x66,0x66,0xfd,0x35,0x16,0xbc,0x94,0xea,0x8d,0xb9,0xfe,0xcd,0xa3,0x71,0x1d, + 0x70,0xbb,0xfe,0xad,0xa3,0x75,0x14,0x82,0xe4,0xf6,0x14,0x14,0x36,0x5c,0x12,0x2a, + 0x9f,0x54,0xef,0xae,0x6e,0x68,0xbd,0xcd,0x45,0x4f,0xd9,0x65,0xb0,0x50,0xf5,0x9, + 0xd4,0x7d,0x69,0xe0,0x3,0x5c,0xaa,0xab,0xf6,0x77,0xc6,0x1b,0x5c,0xff,0xd6,0xd9, + 0xf5,0xe8,0x89,0xd7,0x97,0x9b,0xdf,0x39,0xb7,0x32,0xb5,0x0,0xd4,0xe7,0x1a,0xf7, + 0x9a,0xda,0x86,0xdb,0xa8,0xe6,0xce,0x3c,0x5e,0xef,0xdb,0x77,0xce,0xad,0xfb,0x67, + 0x20,0xa1,0xaf,0xe1,0x10,0x1d,0xeb,0xd0,0x20,0xa3,0x6b,0x73,0x79,0x6f,0xf1,0x48, + 0xda,0x46,0xfb,0xa8,0x7f,0xe,0xe8,0xe7,0xf1,0x40,0xdf,0x2,0x67,0x79,0xa6,0xf8, + 0x74,0xe0,0x4f,0xbc,0xae,0x74,0x5e,0xea,0x49,0x3f,0x7d,0x5c,0x3b,0x64,0x2d,0x9f, + 0x79,0xfc,0xf5,0xe5,0x46,0x3d,0x8c,0xf5,0xfd,0xac,0xaf,0xe1,0xc0,0x5c,0xa3,0xf9, + 0xbd,0xeb,0xe7,0x39,0x3d,0x7,0x70,0x9f,0x92,0xd3,0xe2,0x32,0xd6,0xf3,0xe6,0xa4, + 0x5e,0xe6,0x52,0x3e,0xd,0x37,0x29,0xcf,0x94,0xc8,0x78,0x2d,0xd5,0xc6,0x97,0x1, + 0x3f,0xf1,0xf7,0x7a,0x72,0xbf,0xf9,0xb8,0x1f,0x54,0xf5,0xdc,0xf8,0xd6,0xd9,0x55, + 0x11,0x4c,0xfc,0x8c,0xe7,0x6b,0xb5,0x9d,0x94,0x72,0x2e,0x6c,0xc3,0xe5,0x8a,0x9f, + 0xed,0xd8,0xc3,0x34,0x2b,0x85,0xcb,0xf3,0x3b,0xf3,0xd8,0xb5,0xe5,0xc6,0xb7,0xce, + 0xaf,0x23,0x2b,0x83,0x3a,0xb9,0x6d,0x3,0xe1,0x3e,0x8c,0x6,0x61,0x7c,0xe,0xf0, + 0xb5,0x98,0xb9,0x9d,0x79,0xec,0xf5,0xe5,0xc6,0xb7,0xcf,0xaf,0xc6,0x14,0x2e,0x72, + 0x4f,0xdb,0xcf,0x19,0x75,0xbc,0xe3,0xe7,0xda,0xec,0x56,0xf9,0xe7,0xb2,0x9e,0xeb, + 0xf7,0xef,0xb4,0xb9,0xf6,0x5d,0x1d,0xb4,0x7e,0x40,0xd7,0x5f,0xbf,0x27,0x5d,0x13, + 0xaf,0x3d,0xee,0x4c,0xc8,0x75,0xb0,0xbb,0xdc,0x46,0x31,0x65,0x53,0x5b,0x9d,0xd3, + 0x8f,0x5f,0x5b,0x6e,0x7c,0xfb,0xdc,0x9a,0x19,0x84,0xba,0x7,0x3c,0xad,0xf1,0x51, + 0x68,0xdc,0xfc,0xf6,0xb9,0xf5,0xcc,0x63,0xd7,0x96,0x5b,0xdf,0x39,0x2f,0xe7,0xf0, + 0xc0,0x25,0xe8,0xf9,0xd1,0xd6,0x49,0xfb,0x7e,0x51,0x89,0x7c,0x8c,0x58,0xb4,0xc3, + 0x36,0x3b,0xe3,0x6d,0x42,0xd7,0x16,0xe6,0xad,0x9b,0xec,0xef,0xb8,0x97,0x4e,0x3f, + 0x76,0x6d,0x3f,0xe7,0x9e,0x39,0xbf,0x82,0x62,0xae,0x0,0x4,0x6d,0x9c,0x3d,0xde, + 0x71,0xef,0x9c,0x1d,0x98,0xea,0xea,0x3a,0xc9,0x8e,0x5a,0x45,0xb5,0x3,0xc1,0xb5, + 0x4a,0x0,0x5e,0xb0,0x33,0x8f,0x5f,0x5f,0xce,0x3c,0x7e,0x7d,0x39,0xfd,0xd8,0xf5, + 0x45,0xc6,0x33,0x6e,0x76,0xfa,0xf1,0xeb,0xcb,0xcd,0xef,0xd4,0xc0,0xeb,0x96,0xb5, + 0x78,0x3,0xd7,0xcc,0xdd,0x72,0x59,0x6a,0xc1,0xe0,0x85,0x50,0xcb,0xad,0xf5,0xa3, + 0x6d,0xd7,0x71,0x6d,0xed,0x56,0xdc,0xfc,0xf6,0xd9,0xf5,0xf4,0x63,0xd7,0x17,0x76, + 0xfa,0x3d,0xf3,0xd8,0xf5,0xe5,0xf4,0xe3,0x75,0x6e,0x24,0xf3,0x2f,0x97,0xea,0x2b, + 0x3a,0x99,0xf5,0x39,0x6e,0x33,0xbe,0xf7,0x10,0xec,0x68,0x7e,0x79,0xf3,0xdb,0xe7, + 0xd6,0xd3,0x8f,0x5f,0x5f,0x58,0x83,0x5c,0x54,0xaa,0x3c,0x97,0xcf,0x2c,0x19,0x18, + 0x69,0x2b,0xd1,0xc,0x2e,0x4d,0x76,0x83,0xf,0xe9,0x18,0x13,0x18,0xd1,0xfc,0xa2, + 0xc4,0x61,0x18,0xb,0xf0,0x46,0x8d,0x15,0x53,0xe0,0x8f,0x4f,0xb1,0x4,0xf1,0xec, + 0x3e,0x34,0x9f,0x42,0xa9,0xeb,0x83,0x83,0xbd,0x4d,0xbb,0x1c,0xd2,0x95,0x29,0x76, + 0xc0,0x29,0x63,0x96,0x18,0x46,0xde,0x6e,0x51,0x6d,0x0,0x20,0x75,0x1c,0x9a,0xfe, + 0x3f,0x92,0x6b,0x9d,0xfd,0x57,0xcc,0xf5,0xaa,0x7e,0xd3,0x8c,0xf3,0x15,0xbe,0xff, + 0x4c,0xcb,0xf9,0xd6,0x77,0xce,0xaf,0xa7,0x1f,0x7b,0x7d,0x61,0x36,0x82,0xfa,0x1f, + 0xec,0x9f,0x7b,0xfa,0xb1,0xd7,0x97,0x9b,0xcf,0x9c,0x5f,0xed,0x80,0x62,0xa1,0x1, + 0x76,0xf3,0x3b,0xe7,0xd7,0x5b,0xcf,0x9c,0x5f,0x95,0xf4,0xe1,0x72,0x3f,0x66,0xda, + 0xb,0xc,0xde,0x64,0xd3,0x8e,0x53,0x8f,0x5d,0x5b,0x6e,0x3e,0x73,0x6e,0x45,0xa8, + 0x68,0xa4,0xad,0x48,0x3c,0xe1,0xac,0xe9,0x3f,0xf7,0x37,0x70,0x11,0x8a,0xf1,0xa4, + 0xa0,0xe5,0x96,0xd1,0xd1,0x5d,0x9a,0x93,0xab,0xaf,0xc0,0x5f,0xee,0x1a,0xe,0xae, + 0x7b,0x98,0x7,0x40,0x8c,0x14,0x67,0xf4,0x76,0xdb,0xd3,0xa7,0x1f,0xbb,0xb6,0xdc, + 0x7c,0xe6,0x7c,0xaf,0x78,0x51,0x37,0x44,0x7b,0xe,0x37,0x9f,0x39,0xbf,0x9e,0x7e, + 0xec,0xda,0xa2,0x1c,0x77,0xd6,0x34,0xa7,0xe,0xa5,0x8f,0xaa,0xf,0xcc,0x50,0x48, + 0xba,0x8,0x66,0xa7,0x1f,0x7d,0x7d,0xe9,0xcf,0x8e,0xf9,0xcf,0x30,0x59,0x7,0x6e, + 0x21,0x51,0xab,0xd7,0x71,0xf3,0x99,0xf3,0xeb,0xa9,0x47,0xaf,0x2d,0xe2,0xfd,0x0, + 0xe5,0x91,0x9f,0x7e,0xf4,0x9a,0xae,0x21,0x1b,0xdf,0xe7,0xf4,0xa3,0xd7,0xf6,0xcf, + 0xaf,0x5d,0xbe,0x29,0xbb,0x21,0x11,0xf,0xf6,0x37,0x39,0x55,0xdf,0xd7,0xd,0x72, + 0x1d,0x6d,0x5f,0x79,0xd9,0x9f,0xd1,0xcd,0x67,0x2e,0xac,0xa7,0x1f,0xbd,0x26,0xa, + 0x8d,0x6a,0x87,0x3c,0x40,0x7d,0x37,0x9f,0x39,0xbf,0x9e,0x7e,0xf4,0xda,0x12,0x37, + 0x7c,0x2b,0xf8,0x24,0x0,0xfb,0xbe,0x56,0x6f,0x3d,0x73,0x61,0x15,0x25,0xfd,0xa2, + 0xb9,0x65,0xbb,0xbe,0xd3,0x8f,0xd6,0xe7,0x67,0x59,0xb6,0x37,0xa9,0x7c,0x3a,0x75, + 0x65,0x83,0x9e,0x8,0x2b,0x0,0x26,0x1,0x22,0x57,0x57,0x36,0xee,0x8a,0xbb,0xc7, + 0xce,0xd4,0xfe,0x7b,0xa7,0x1f,0xb9,0xb6,0xdc,0x7a,0xf6,0xc2,0xca,0x7e,0xe8,0x8, + 0x9d,0x9d,0x62,0x88,0xe8,0xd3,0xa8,0x58,0x46,0xca,0x68,0xee,0x52,0xc5,0xf8,0x66, + 0x76,0xeb,0x99,0x73,0xeb,0xa9,0x47,0xae,0x2f,0xac,0x30,0xd6,0x7e,0x7e,0xeb,0xd9, + 0x73,0xeb,0xe9,0x47,0x6a,0xd0,0x84,0xd9,0xa9,0x47,0xaf,0x2f,0xb7,0x9e,0x39,0xb7, + 0xaa,0x24,0x1e,0x5,0xd,0xe8,0x9c,0x5b,0xb4,0x7d,0xa1,0x96,0x92,0xce,0xc2,0x3, + 0x49,0xd9,0x4a,0x81,0x3,0x59,0x94,0xc1,0x93,0xba,0xda,0xa9,0x47,0xf6,0x6b,0x8b, + 0x9c,0xe6,0xf6,0x79,0xed,0x7b,0x1e,0xf2,0xc7,0x8e,0xee,0x62,0xed,0x7f,0xdb,0xfb, + 0xa,0xc0,0x2c,0x28,0x16,0x29,0x4a,0x3e,0xfc,0x6f,0xa1,0x4e,0xc7,0x5b,0x82,0x34, + 0x2c,0x20,0x30,0x67,0xad,0xcd,0x92,0xf5,0x6c,0x2,0xca,0x1f,0x81,0x33,0x39,0xe4, + 0x33,0x15,0xf1,0xaf,0x5c,0x71,0x13,0x1e,0x65,0xfe,0x7b,0x56,0x48,0x9a,0x5,0x3e, + 0x46,0x2f,0x8b,0x59,0xc2,0x5b,0x28,0xe1,0xb1,0x82,0x5c,0x46,0x3e,0x86,0xd4,0x3a, + 0xb9,0x31,0xd9,0x40,0x9a,0x72,0x12,0x5b,0x3f,0xfa,0xd6,0x33,0xe7,0xd7,0x5b,0xcf, + 0x9e,0x5f,0xe1,0xb0,0xe3,0x67,0xcf,0xaf,0x77,0x3f,0xb2,0x1f,0x20,0x82,0x66,0x26, + 0x5e,0x6d,0xf6,0x5,0x47,0xf2,0xa4,0x57,0xf1,0x9e,0x11,0xb4,0x0,0xd8,0xf1,0xb3, + 0xe7,0xf6,0xcf,0x8b,0xb6,0x9c,0x1b,0x19,0x52,0xb0,0xf2,0x5e,0xdd,0x8b,0xc7,0xcf, + 0x9c,0x5f,0x6f,0x3d,0x73,0x6e,0xb5,0x60,0x80,0x73,0xfc,0x6c,0xb,0xe0,0x4e,0xad, + 0x43,0xb7,0x24,0x64,0xe4,0x7a,0x3f,0x55,0xb7,0x9f,0xd0,0xa0,0x8d,0xf,0xdd,0x66, + 0xe9,0x84,0x66,0x3f,0x7e,0xf6,0xfc,0x7a,0xea,0x91,0xd7,0xfb,0xfd,0x41,0x72,0x48, + 0xcc,0xda,0xe1,0x71,0xc4,0x16,0xc7,0x5f,0xed,0x30,0x3b,0x7e,0xf6,0xfc,0x7a,0xfc, + 0x6c,0xd,0x26,0x81,0x3,0x7f,0xf7,0xc3,0xfb,0x21,0x67,0x16,0x3c,0xc2,0x89,0xae, + 0xe5,0xf5,0x5e,0x9c,0x7a,0xf8,0xda,0xc2,0x1a,0xe,0xc9,0x36,0x9e,0x38,0xd5,0x30, + 0x5d,0xe3,0xc7,0xcf,0x9e,0x5f,0xef,0x7e,0xf8,0xda,0x40,0xdb,0x6f,0xb5,0x43,0x41, + 0xf4,0x5d,0x61,0x29,0x6c,0xfa,0xc8,0xdd,0x54,0x85,0xee,0xd6,0xb3,0xe7,0xd7,0x53, + 0x8f,0xec,0xd7,0xc3,0x1a,0xeb,0xdd,0x35,0x8d,0xae,0x51,0x78,0xd1,0x40,0x74,0x45, + 0xcd,0xe7,0x4a,0xfd,0xe0,0x53,0xf,0x5f,0x5b,0x8e,0x9f,0x6b,0xeb,0x89,0xbf,0x33, + 0x92,0xb2,0x63,0xd2,0xd6,0x37,0x4a,0x14,0xb6,0xe0,0xdd,0x8d,0x76,0x3f,0xaf,0x2e, + 0x89,0x6d,0x20,0x6c,0x16,0x53,0xd,0x7e,0x63,0xc6,0x8,0xba,0xf3,0x21,0x4b,0xaf, + 0x25,0xe,0x79,0x13,0xb6,0x41,0x10,0xa3,0x37,0xc8,0x1e,0x64,0xed,0x14,0x77,0x15, + 0x3a,0x8b,0x4a,0x74,0xe3,0x9c,0x23,0xa6,0x14,0x8d,0xc,0xd4,0x9d,0x91,0xa9,0x7b, + 0x71,0x4c,0x8,0xf1,0xab,0x60,0xd,0x14,0x68,0x1f,0x40,0x7f,0xf,0xc3,0x3b,0x23, + 0x32,0x80,0xa2,0xa2,0xdd,0xf1,0x73,0x17,0xd6,0x53,0xf,0x5f,0x5d,0xee,0x7e,0xf8, + 0xea,0x72,0xfc,0xdc,0x85,0xd5,0x42,0x1,0xed,0xe1,0x19,0x9e,0x94,0x8a,0x25,0xba, + 0xc2,0x50,0xd7,0xea,0xf8,0xb9,0x73,0xeb,0xdd,0x8f,0xbc,0xbe,0xdc,0xfe,0xee,0xb9, + 0x35,0xce,0x86,0x5d,0x31,0x2e,0x79,0xe,0x54,0x2c,0xc8,0xf3,0xc1,0xb2,0xa,0x95, + 0x72,0xc5,0x93,0x25,0xcf,0xc1,0x70,0x16,0xb9,0xcd,0xa1,0x9f,0xc7,0x32,0x4e,0xa6, + 0x2d,0xcd,0x76,0x60,0xdc,0xfd,0xc8,0xeb,0xcb,0xf1,0x73,0x7b,0xd0,0xd5,0xac,0x5f, + 0xaf,0x35,0x71,0x9b,0xb9,0xb5,0xd5,0xf9,0xa3,0x9e,0x51,0x9b,0xd2,0x2f,0xb4,0xa9, + 0x5e,0x73,0xd2,0x6e,0x96,0x2e,0x63,0xb0,0x44,0xea,0x7d,0xba,0xc9,0x98,0x82,0x5f, + 0x1a,0xf2,0x38,0xe7,0xd1,0x83,0x79,0x50,0x5d,0x73,0x5a,0xdf,0xad,0x82,0xf7,0xc4, + 0x81,0x8f,0xdc,0x57,0xbe,0xa7,0xb7,0x9f,0x3b,0xd7,0xf,0x5d,0x24,0x24,0xf8,0x0, + 0xba,0xb1,0x1a,0x96,0xb4,0xb8,0x9,0x9f,0xe0,0x50,0xcc,0x82,0x93,0xbe,0xc5,0xb4, + 0x1a,0x24,0xa1,0x23,0xd6,0x21,0x77,0x79,0xf6,0xde,0xc7,0x2e,0xdd,0x75,0xc9,0x22, + 0x17,0xd7,0x33,0x9b,0x3,0x1,0xa1,0xed,0x66,0xb7,0xbf,0x77,0x7e,0xbd,0xfb,0xa1, + 0x6b,0xcb,0xed,0xef,0x9d,0x5f,0xe1,0xf9,0xda,0x7,0x98,0x2c,0x3b,0x4e,0x7b,0x40, + 0x80,0xd3,0xd4,0x5d,0xdb,0x68,0x88,0x7e,0x5,0x66,0x77,0x3f,0x74,0x6d,0xb9,0xfd, + 0xdd,0xf3,0xab,0x78,0xf,0x98,0x7a,0x54,0x8b,0x98,0x6a,0xc5,0x50,0xb0,0x99,0x4c, + 0x7f,0x5f,0x54,0xf4,0x63,0x31,0x3b,0xfe,0xee,0xfe,0x7d,0x98,0xab,0x2b,0x6a,0x59, + 0xce,0x3,0xa1,0xbc,0x66,0x3d,0x9c,0x7,0xd,0xb0,0x3,0xd7,0x3d,0x32,0xba,0x16, + 0x4e,0x77,0xdb,0xe5,0x1e,0x38,0x6,0xc2,0xbc,0xe3,0x1c,0xa4,0xd5,0x1f,0xbc,0xc7, + 0x65,0x4c,0x14,0xc0,0x93,0x3,0x9a,0x64,0xf9,0xbb,0x99,0xaa,0x43,0x6,0xf,0x6, + 0xa9,0xd6,0x27,0x9c,0x6f,0xa7,0xea,0x7f,0x7f,0x2e,0x17,0xa4,0x5b,0xe1,0x9d,0x31, + 0x62,0x92,0xd8,0xb1,0xe3,0x17,0x8b,0x6f,0x99,0xbb,0x74,0x12,0xda,0x9f,0xdf,0xf9, + 0xe0,0xd5,0xe5,0xf6,0xf7,0x2e,0xac,0x16,0xe0,0xac,0x8,0xe3,0xa,0xc1,0x5f,0xc8, + 0x75,0xc4,0x4e,0x6,0x75,0x34,0xad,0x5d,0xff,0xfe,0x19,0xa2,0x1b,0x52,0xbf,0xe3, + 0xed,0xef,0x5e,0x58,0xd5,0xbe,0x38,0x62,0x4,0x7c,0xea,0xd3,0xc1,0xfb,0x55,0xce, + 0x9f,0xf8,0x1c,0x90,0x9f,0x8b,0x47,0x0,0x19,0x32,0xb3,0x98,0xef,0x95,0xc1,0xec, + 0x9d,0x97,0xaf,0xed,0xdf,0x21,0x64,0x52,0x1e,0x12,0x75,0xc6,0x16,0x39,0xdb,0x7f, + 0x47,0xcc,0x13,0xe6,0x7b,0x36,0xee,0x67,0xf0,0x99,0x6,0x23,0xfc,0x99,0x1e,0xff, + 0x7d,0x8f,0x8f,0x19,0xa9,0xf0,0xdd,0x63,0xdc,0x68,0xff,0x7b,0xfb,0x7b,0x17,0xd7, + 0xe,0x2a,0x9f,0x8c,0xa9,0xbc,0x63,0xe0,0x60,0x27,0x99,0xf,0x27,0xd9,0x9b,0x59, + 0x80,0x9f,0xdb,0xd4,0xbf,0xd5,0x2c,0x3b,0x33,0x39,0x21,0xfe,0x66,0x95,0xab,0xce, + 0xef,0x74,0xde,0xa6,0xe2,0xed,0x9e,0xe3,0x3f,0xcf,0xdc,0xeb,0x7f,0xdf,0xfe,0x6e, + 0x9b,0xe1,0xf8,0x8,0x62,0x8e,0xd4,0xd5,0x94,0x20,0xe2,0x51,0x5,0x8c,0xae,0xd1, + 0x55,0xc7,0x9d,0x33,0xe0,0x77,0x5e,0x7e,0xbd,0x1e,0xa8,0x3e,0x6c,0x2,0x6d,0x28, + 0xb3,0x71,0x95,0xe9,0x9b,0xa5,0x99,0x68,0xbf,0xd7,0x98,0x54,0xf5,0xa1,0x9b,0xe0, + 0xd0,0x60,0xe3,0x93,0x7b,0x7,0xcf,0x4a,0x97,0x30,0x13,0xd0,0xc7,0x30,0xed,0x8, + 0xa,0xe,0xfc,0x3b,0xc8,0xad,0xcc,0x7e,0x98,0x72,0xb2,0x66,0x59,0xe5,0x2c,0x44, + 0xf,0xcd,0x5a,0xe9,0xbd,0xf9,0xf7,0x1d,0x50,0x94,0x7b,0x58,0x53,0x2c,0x60,0x3a, + 0x2a,0x17,0x24,0x67,0x29,0x79,0x7d,0xfb,0xe,0xa5,0x72,0x58,0xcd,0xa5,0xcb,0xc2, + 0x94,0x32,0xe6,0x6e,0xb2,0xb2,0x93,0x9a,0xde,0xf2,0xba,0x9,0x19,0x34,0x3b,0x7e, + 0xb1,0x86,0x7d,0xbb,0xe7,0x65,0x34,0x9e,0x44,0x16,0x35,0x5,0x5c,0x1a,0xeb,0xb0, + 0xfb,0x1e,0x7,0x3a,0xe2,0x23,0xf7,0xb5,0x55,0x9f,0x3d,0x83,0x4d,0x39,0x71,0x85, + 0x8c,0x58,0xa8,0x62,0x76,0xf5,0x73,0x6b,0x8,0xde,0xd4,0x5,0x71,0x88,0xf3,0x93, + 0x1e,0x68,0xb0,0x77,0x3e,0x70,0x75,0xb9,0xf3,0xbd,0xb,0x7d,0xdf,0x75,0x97,0x41, + 0xe6,0xec,0x4b,0x72,0xe4,0x53,0x25,0xc4,0xc6,0x84,0x41,0x46,0x2c,0x9a,0x84,0x53, + 0x4e,0x92,0xea,0x3d,0xba,0xf3,0xfc,0xf9,0x95,0xf5,0xfd,0x95,0x42,0x49,0xde,0xdb, + 0xee,0xaa,0x57,0xe1,0x2e,0x67,0x91,0xd0,0x4a,0x19,0x45,0x1c,0xf6,0x64,0x56,0x20, + 0x53,0xfe,0xb8,0xc7,0x75,0x3f,0xb,0x22,0x41,0x73,0xfc,0xae,0xcb,0x57,0x3b,0x8a, + 0xfe,0x8d,0x17,0x2f,0xac,0x49,0x9d,0x32,0x9c,0x13,0xe6,0xc1,0xe9,0xd3,0x2,0x87, + 0xdd,0xf4,0xf7,0x9d,0xac,0x53,0xf3,0x7b,0xef,0x9,0xdd,0x9d,0xe7,0x2f,0xae,0x8c, + 0x86,0x75,0xcb,0xd2,0x1c,0x51,0x6e,0x4a,0xcf,0x48,0x35,0xed,0x2,0xd4,0xa7,0x5b, + 0xf6,0x17,0x7b,0x85,0x5b,0xf8,0xb3,0xcd,0x78,0xfc,0xc3,0xe5,0x2c,0xea,0x3b,0xb4, + 0xcf,0xbf,0xeb,0xf2,0xd5,0xc5,0xcc,0xec,0xce,0xb,0x7b,0xe0,0x93,0x1d,0x86,0xb0, + 0xee,0x52,0x93,0x3d,0x97,0x88,0x77,0x9e,0xbf,0xb0,0xc6,0xc0,0x13,0xe4,0xb5,0xb4, + 0x8b,0xd9,0xee,0x45,0x21,0x17,0xbf,0x29,0xcc,0xd3,0x53,0x9b,0x40,0x38,0xeb,0x21, + 0x6e,0x78,0x60,0x2d,0x88,0x1d,0xb7,0x4b,0x2f,0xa5,0xbf,0xcf,0x49,0xf1,0xb0,0x6e, + 0x80,0xd,0x57,0xb5,0x24,0x9f,0x71,0xfc,0xdc,0x26,0x3a,0xc2,0x8,0x15,0x3a,0x3, + 0xb3,0x59,0xb7,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xec,0xce,0xf3,0xe7,0xd7, + 0xbb,0x2e,0x5f,0xab,0x37,0xbc,0xce,0x67,0x7c,0x0,0x21,0xac,0x3,0xc,0x40,0x6d, + 0x41,0x45,0x10,0x20,0x76,0x55,0xb9,0x85,0xea,0x5c,0xc9,0xc4,0x43,0xb,0x52,0xb5, + 0x3a,0x90,0xfc,0x80,0x79,0xfe,0xed,0xf5,0x1a,0xef,0xba,0x7c,0x6d,0xa0,0x71,0xe9, + 0x34,0x16,0xa4,0x7b,0xcf,0xb4,0x28,0x43,0x8b,0xda,0xed,0x3e,0x3,0xf3,0x42,0xb8, + 0xcd,0x6f,0xd0,0xe7,0xf1,0xb5,0xb1,0xe4,0x62,0x82,0x55,0x5,0x93,0x96,0xb8,0x74, + 0xf8,0x67,0x8e,0x60,0x7e,0x81,0x99,0x89,0x26,0x13,0xf6,0x2c,0xb5,0xde,0x61,0x46, + 0xbf,0xe7,0x1,0xf1,0x3f,0x0,0x85,0x1e,0xe,0x6b,0x45,0xf9,0xba,0x24,0xc,0x30, + 0xb3,0x77,0x3c,0x70,0x6d,0x79,0xe3,0xa5,0xba,0x79,0xdc,0x15,0x69,0x4e,0x8,0x8, + 0xae,0xc6,0x1a,0xc2,0xf6,0xfb,0x2f,0x9d,0x5f,0xef,0x7a,0xe0,0xda,0xc2,0x94,0xe, + 0x18,0x12,0x80,0xcc,0x24,0x38,0xe6,0xf7,0x63,0x2f,0xf9,0x56,0xc5,0xc2,0xe9,0x1e, + 0xb9,0x1b,0x83,0x90,0xfa,0xba,0x89,0x95,0x46,0x58,0x47,0xb0,0x3,0x11,0xdc,0x7, + 0x2d,0x92,0xf2,0xaa,0x9e,0x18,0x8e,0x69,0xd3,0x78,0x97,0x37,0x5e,0x3c,0xbf,0xbe, + 0xe3,0x81,0x6b,0xcb,0xf7,0x5f,0xba,0xb0,0xf3,0xa9,0x39,0x21,0x73,0xe,0x9e,0xd, + 0xf8,0x9,0x15,0x3e,0xe2,0x3d,0xd2,0x6c,0x77,0xe1,0x16,0xad,0x8f,0x64,0x1f,0xbb, + 0x2a,0xfc,0x21,0x38,0x85,0xd,0xbf,0x74,0xad,0x68,0xef,0xba,0xff,0xea,0x72,0xe7, + 0xc5,0xb,0x53,0x2f,0x68,0xa9,0x18,0x2d,0x69,0x4d,0x75,0x60,0x64,0x92,0xe6,0x9, + 0xa3,0x34,0xcc,0xc,0x72,0x22,0x69,0x91,0x68,0x6f,0xac,0x15,0x21,0x7e,0xd8,0x13, + 0xb0,0x7d,0xd4,0xe4,0x86,0x8f,0x4,0x2a,0x75,0x1e,0x5d,0xf5,0xe7,0x67,0x74,0x26, + 0x4c,0xe9,0x69,0xfb,0x1f,0xde,0xe0,0xfb,0x64,0x66,0xef,0xb8,0xff,0xea,0x32,0x63, + 0xc7,0xf0,0x1a,0xdf,0x83,0x6,0xf1,0xa7,0x7c,0x28,0xd6,0xb9,0x67,0xad,0x8f,0xb8, + 0x1f,0xdf,0x71,0x7f,0xd,0x7e,0x2f,0x5e,0x58,0x83,0xdf,0x1e,0xed,0xa3,0x59,0x46, + 0x1b,0x6c,0xb2,0x82,0x66,0xba,0x4d,0x54,0xf1,0xb8,0x33,0x8b,0xc4,0xd9,0x46,0xfa, + 0x6e,0xb0,0x3d,0xa9,0x69,0xd7,0x38,0xee,0x8f,0x6,0xe1,0xf6,0x9f,0x37,0x5e,0xba, + 0xb8,0xde,0x75,0xff,0x95,0xe5,0x8d,0x17,0x2f,0xae,0x6c,0xba,0xc3,0x85,0x5f,0x52, + 0x15,0xc,0x49,0x66,0x2f,0x10,0x29,0x70,0x89,0x51,0x98,0x43,0x3b,0x93,0x68,0x63, + 0x0,0xef,0xcc,0x92,0xfe,0x7d,0x1d,0xf6,0x8e,0xfb,0xaf,0x2c,0x6f,0xbc,0x74,0x71, + 0xed,0x14,0x61,0x36,0x94,0x62,0x60,0xa4,0xab,0x4b,0x61,0x8c,0x1b,0xef,0xb8,0xff, + 0xea,0xf2,0xc6,0x4b,0x17,0x57,0xc5,0xde,0xaa,0x37,0x47,0x1b,0x47,0xb0,0xf2,0xe5, + 0xc9,0xa8,0x9a,0xc4,0x59,0x52,0xbc,0xd,0xc3,0xf7,0x36,0x54,0x28,0x94,0xb9,0xfe, + 0xf2,0x7d,0xd7,0x96,0x37,0x5e,0x6c,0x73,0x1b,0x1f,0x3e,0xdf,0x13,0x5a,0x58,0x2, + 0x5,0x21,0xe6,0x51,0x31,0x3b,0xb3,0xc0,0x5f,0xa5,0xac,0xa8,0xde,0x25,0x6e,0xed, + 0x72,0xa5,0x2b,0x10,0xc3,0x8e,0xd4,0x9c,0x64,0xd4,0xa9,0xea,0x2b,0xbd,0xa5,0xa7, + 0xfe,0xcd,0xda,0x76,0x9e,0x65,0xe8,0xea,0xe8,0xe6,0x9d,0xc6,0xe7,0x9b,0xd9,0x3b, + 0xda,0x7d,0x2a,0xfa,0xbe,0xa8,0x4f,0x1a,0x95,0xd6,0x31,0xb2,0x31,0x6d,0xdd,0xd, + 0xa1,0x1a,0xa7,0xb6,0x24,0x5,0x1f,0x73,0x49,0x3a,0x42,0x36,0x62,0xce,0x22,0x94, + 0xb4,0x5a,0xd1,0xe9,0x24,0x84,0xe4,0x24,0x85,0xf,0x18,0xec,0xfb,0x2f,0x5e,0x58, + 0x77,0x93,0x82,0xc1,0x6d,0xef,0xa0,0x1e,0x4e,0xa0,0xb6,0xc9,0xd8,0x83,0x2a,0x59, + 0xdf,0xcc,0xde,0x71,0xef,0xd5,0xe5,0xfb,0x2f,0x9f,0x5f,0xfb,0xb8,0x62,0x63,0x4a, + 0x96,0x56,0xd4,0x5d,0xf4,0x66,0x33,0x55,0x91,0xa,0x15,0x9f,0x85,0xb6,0xb5,0x89, + 0xa7,0xc0,0xfe,0xbf,0xdf,0x7f,0xe9,0xc2,0xfa,0x8e,0xfb,0xae,0x2e,0x3f,0x78,0x79, + 0xaf,0x8a,0x1c,0x79,0xee,0x2e,0xf3,0xe2,0x49,0x47,0xca,0x89,0x9b,0x8e,0xc9,0x3a, + 0xc2,0x44,0x67,0x21,0x6,0xa3,0xa0,0xdf,0x34,0xe1,0x66,0x31,0x56,0x40,0x15,0xa9, + 0x62,0x96,0xd7,0x9f,0x20,0x32,0x12,0x51,0x1a,0xff,0x92,0x40,0x5b,0xf7,0xac,0x8d, + 0x73,0x46,0xee,0x84,0x68,0x2a,0x1c,0xce,0x82,0x49,0x77,0x25,0x66,0x31,0xe2,0xc1, + 0x80,0x59,0xfa,0x69,0x6f,0x19,0xa0,0x67,0xf6,0x4e,0x93,0xf6,0x9d,0x3c,0xf4,0xa8, + 0xc0,0xbb,0xab,0xc5,0x29,0x66,0x20,0xbe,0x2d,0x2b,0x2e,0x46,0xbd,0xff,0xef,0xbf, + 0x74,0x61,0x4d,0x58,0x8f,0xe4,0xa,0x37,0xab,0x5c,0xed,0x40,0x8b,0x86,0x5,0xa0, + 0xcc,0xbe,0xff,0x12,0x55,0xca,0x16,0xbd,0xce,0x83,0x47,0x2c,0x74,0xad,0x22,0xa8, + 0x30,0xfe,0xf2,0xbd,0x57,0x16,0xbe,0xde,0x7d,0xcd,0x8f,0xf7,0xef,0x3e,0x16,0x3c, + 0x5a,0x50,0xb5,0xa9,0x14,0xa4,0xe3,0x81,0xca,0xe,0x7a,0xd2,0x2a,0x74,0x76,0xf, + 0xc,0xea,0x77,0x30,0xfb,0xfe,0xcb,0x17,0xd7,0x5f,0xbe,0xf7,0xca,0xf2,0x83,0x57, + 0x2e,0xae,0x3c,0x6b,0x4f,0x78,0x24,0x1c,0x96,0xa0,0x6e,0x98,0x97,0x37,0x5e,0xba, + 0xd8,0xd9,0x52,0x82,0xfe,0xaf,0x9d,0x18,0xed,0x14,0x6a,0x4d,0xbe,0x7f,0xff,0xd1, + 0x21,0x1b,0x42,0x4e,0xa,0x42,0xf6,0xc6,0xba,0x18,0xda,0x5c,0x15,0x3f,0xa1,0x5e, + 0x16,0xda,0x75,0xd,0x1d,0x55,0x68,0x61,0xea,0xf5,0xc6,0x8b,0x47,0xca,0x24,0x9e, + 0x1a,0x3f,0xa7,0x28,0xeb,0xdb,0xe3,0xdd,0xf8,0x9d,0x93,0x5a,0x7d,0x98,0x6a,0x1c, + 0xbb,0x92,0x54,0x78,0x36,0x34,0x66,0x52,0x48,0xba,0xe5,0x60,0xad,0xef,0xe4,0xda, + 0x86,0x8e,0x83,0x23,0x22,0x48,0x82,0xf5,0xf7,0x2a,0x1b,0x71,0x2e,0xac,0xd2,0x1c, + 0x70,0x6d,0x20,0x8e,0x80,0xc5,0x95,0xa5,0xb6,0xab,0xa2,0xbf,0xb2,0x87,0x59,0x34, + 0x57,0x83,0x70,0x17,0x57,0x35,0xe1,0x26,0x62,0xa8,0xaa,0x45,0x65,0xb4,0xa8,0x4c, + 0x84,0xa4,0x7f,0x9d,0xdd,0xa9,0x74,0xc0,0x69,0x42,0x13,0x4,0xfd,0x79,0xc6,0x37, + 0xef,0x73,0x5b,0xd3,0x16,0x6b,0xb,0xbc,0xa9,0xc2,0x69,0x9b,0x92,0x2,0x92,0xfe, + 0xae,0x8b,0x9b,0x5a,0x3e,0x9f,0xa2,0xb,0x95,0x8e,0xd5,0x13,0x96,0x22,0xa8,0x1d, + 0xfd,0xf2,0xbd,0x57,0x97,0x1f,0xbc,0x72,0x61,0xfd,0xa5,0x7b,0xae,0x2e,0x20,0x77, + 0x27,0x9f,0xb5,0x23,0x26,0xca,0x6e,0x1e,0x3a,0x43,0x1e,0x2a,0x8b,0x6e,0xc4,0x41, + 0xb,0x3f,0x66,0xfb,0xca,0xa3,0x9d,0x9c,0xc1,0xa4,0xde,0xd2,0xae,0xad,0x5d,0xb7, + 0xfc,0x5e,0x70,0x1e,0x93,0x6f,0xb,0x9f,0x20,0xdc,0xf9,0xf9,0x4d,0xdc,0xb1,0x5, + 0xee,0x11,0xf4,0x9b,0x99,0x8f,0x6f,0xb9,0x2a,0x11,0xba,0x5c,0x5c,0x2c,0x6e,0xd3, + 0xf6,0x9d,0x7c,0x6,0x1,0x17,0xd4,0xbf,0x7e,0xfc,0xf9,0x97,0xee,0xd9,0xf,0x63, + 0xbd,0x51,0x11,0xa1,0x1f,0x80,0x10,0x36,0xe7,0x55,0x27,0x8b,0xae,0xe0,0xa4,0xa7, + 0xc5,0x1f,0x72,0xcb,0x33,0x7e,0x8e,0x67,0x1c,0x8a,0x85,0x2a,0x26,0xe3,0x40,0x2, + 0x8f,0x1c,0x79,0xcd,0x5,0x21,0x8b,0x70,0xaf,0x4c,0x28,0x64,0x3f,0x78,0xe5,0xe2, + 0x9a,0xf2,0x92,0x99,0xf,0x34,0x7d,0x7f,0x75,0x30,0x1f,0xd7,0xf3,0x4b,0x97,0xae, + 0x2e,0x3f,0x78,0xf5,0xe2,0x9a,0xf6,0x1a,0x8f,0x20,0x3,0x63,0x66,0xac,0x6d,0x58, + 0xe0,0xd7,0xa9,0xd8,0x96,0x45,0x3e,0x37,0x9d,0x8f,0xb0,0xf9,0xa6,0xb0,0x5c,0x51, + 0x92,0x36,0xac,0x62,0x8a,0xc2,0x73,0x17,0x91,0x96,0xc0,0x4,0x4a,0x58,0x25,0x9b, + 0x3d,0x7b,0x22,0xf5,0x62,0x74,0xde,0x58,0x89,0x2f,0xab,0x4f,0x7a,0xc2,0x32,0xf5, + 0xd3,0x42,0xa,0x16,0x2a,0xba,0x46,0x88,0x1f,0x33,0x76,0x1d,0x52,0xa5,0x74,0xf2, + 0x7,0xaf,0x5e,0x5a,0x7f,0xe9,0xd2,0x6b,0x8b,0xc6,0xc8,0xb4,0x6c,0xb4,0xe9,0x51, + 0x20,0x1a,0xf,0xd1,0xbd,0x8e,0x15,0xef,0xcc,0x75,0x9d,0x20,0xfe,0xac,0xde,0xc7, + 0x12,0xb5,0x91,0xd9,0x85,0xa8,0xa1,0xfb,0x30,0x71,0xff,0x89,0x59,0x49,0xf4,0x10, + 0xe7,0x3,0xe3,0x87,0xaf,0x5c,0x58,0x7f,0xf0,0xca,0x3e,0xef,0xe2,0x3d,0x8,0x71, + 0x93,0x19,0xe0,0x1b,0x50,0xb0,0x69,0x60,0x1f,0xb8,0xa,0x74,0x80,0x8d,0x54,0xd2, + 0xdf,0x9,0x7d,0xcc,0xb4,0x2,0xb8,0xfc,0xbb,0x6f,0x66,0xbf,0x78,0xf1,0xea,0xf2, + 0xc3,0x57,0x7,0x7a,0x10,0x30,0xfb,0xe1,0xab,0x17,0xd6,0x1f,0xbc,0x5a,0x1,0x2e, + 0x50,0x8f,0xdc,0xa4,0xe3,0x1e,0x74,0x97,0x3b,0x2a,0xd9,0x2d,0xf9,0xdb,0xba,0x2b, + 0xa,0xd6,0x91,0x5d,0x76,0x38,0x93,0x83,0x29,0xc2,0x7f,0x50,0x95,0x62,0x72,0x63, + 0x41,0x6e,0x57,0x41,0x18,0xaa,0xd7,0xa9,0x62,0x3b,0xb0,0x19,0x62,0x36,0x78,0xdf, + 0x46,0x7b,0xca,0x74,0x56,0x5,0x9e,0x58,0xc9,0xa8,0x77,0x8e,0x67,0x3f,0x7c,0xf5, + 0xc2,0xfa,0xc3,0x7a,0x48,0x4d,0xbd,0x94,0x2d,0x63,0xf,0x7e,0xf0,0xea,0x85,0xf5, + 0x17,0x2f,0x5e,0x5d,0x2c,0xac,0xbb,0x69,0x95,0x1e,0xa4,0x7e,0x93,0xc0,0x50,0x74, + 0xd7,0xa,0xee,0x6e,0xc3,0xeb,0x19,0x16,0x75,0x97,0xa7,0x98,0x90,0x30,0x7f,0x8d, + 0xa7,0x1f,0x98,0xcd,0x91,0xda,0xaf,0xe2,0x76,0x34,0xf,0x76,0x6,0xfb,0xe1,0xab, + 0x17,0xd7,0x5f,0xbc,0x78,0x65,0x49,0x55,0x30,0x58,0x9b,0x9a,0x87,0x91,0x81,0xf1, + 0x60,0x93,0x43,0x3a,0x74,0xae,0xf4,0x7e,0xa2,0xef,0xf,0x44,0x11,0xa2,0x2d,0xde, + 0xcb,0xa1,0xbb,0xcd,0x33,0xe8,0x18,0xc0,0xa2,0xd6,0xb9,0x76,0x2b,0x30,0xe5,0x6d, + 0x38,0x6c,0x2a,0xca,0x23,0x32,0x57,0x80,0x14,0xe8,0x39,0xe6,0xeb,0xbc,0xf2,0xed, + 0xf5,0x3e,0x26,0xde,0x8,0xea,0x7d,0xbe,0x70,0x65,0x31,0x2f,0xf2,0x5d,0xd8,0xa5, + 0xd3,0xc2,0x99,0xd7,0x7d,0xc,0x78,0x24,0xc6,0x67,0x1a,0x20,0x5,0x3,0x26,0x36, + 0xe5,0x2c,0x87,0xca,0xf7,0x59,0x1c,0xda,0xa2,0x24,0xb2,0x91,0xbf,0x3b,0xcc,0x7e, + 0xf8,0xda,0xa5,0xfd,0xda,0xc3,0x6c,0x7a,0xac,0x41,0x17,0x31,0xab,0xc1,0x1a,0xf2, + 0xe4,0x96,0xcc,0xfb,0x20,0x59,0x88,0x4e,0x58,0xb,0x20,0xa0,0x23,0x63,0xa,0x3c, + 0x5e,0x8b,0x91,0xf7,0xb7,0x31,0x92,0xdf,0xe7,0x6c,0x88,0x20,0x23,0xc6,0xdd,0xd7, + 0xd1,0xc5,0x85,0xae,0xa5,0xc2,0x6b,0x2c,0xa2,0xf4,0x23,0xab,0x42,0x25,0xa5,0xd9, + 0xc,0x7,0x16,0x9d,0x3a,0x33,0x85,0x98,0xa9,0xc3,0x91,0xe5,0x43,0xac,0x50,0x3d, + 0x67,0x89,0x5e,0x18,0xcf,0x13,0x66,0x15,0xe0,0x40,0xd3,0x4a,0x74,0x5b,0x28,0xe6, + 0x18,0x60,0x27,0x45,0x6f,0x3b,0xcc,0x38,0x10,0x2a,0x46,0x51,0x9d,0xa2,0xa4,0xfa, + 0x47,0x57,0x2e,0xac,0x6f,0xbf,0x70,0x75,0x79,0xf3,0xda,0x85,0x55,0xe7,0xa6,0x9c, + 0x91,0x14,0xa9,0x96,0x95,0x49,0x17,0xc0,0x71,0x36,0xc9,0x46,0x7e,0x36,0xdc,0x7d, + 0x54,0xed,0x22,0xee,0xc1,0x1,0xb2,0xd8,0xd4,0xdd,0x6c,0x82,0x5a,0x41,0xac,0x64, + 0xe0,0x21,0x73,0x72,0xd9,0x1,0x9e,0xb2,0xa5,0x3c,0xbb,0x89,0x33,0x36,0xcc,0xbc, + 0x9d,0xd3,0xf4,0xd7,0xa7,0x0,0xb,0x71,0xe1,0xb2,0x89,0x21,0x8e,0x0,0x8d,0xfc, + 0x0,0xbb,0xc0,0x42,0xfb,0xce,0x14,0x49,0x3f,0x5d,0x4e,0x9e,0x5a,0x89,0x8,0x9d, + 0x88,0xcc,0x14,0x98,0x5f,0x7f,0x67,0x3e,0x84,0xee,0x88,0x80,0xbc,0xa8,0xbe,0x97, + 0x99,0xa2,0x1f,0x60,0x6,0x48,0x2b,0x32,0xb7,0x26,0xa5,0xc7,0x12,0xd1,0xc1,0x61, + 0xfe,0x68,0x1,0x8b,0x10,0xdd,0xb8,0xf8,0xf7,0xde,0x7e,0xfe,0xca,0xf2,0xa3,0x2b, + 0x7b,0x92,0xc2,0xb3,0x2d,0x41,0x3b,0x37,0xe2,0x2b,0xaf,0x4b,0x82,0x3e,0x23,0x34, + 0x68,0x70,0x0,0x1,0x6c,0x98,0x54,0x1c,0xe0,0x79,0x6f,0xc0,0x2c,0x4e,0xd6,0x61, + 0x28,0x30,0xf5,0xfd,0xeb,0x75,0xfc,0xe8,0xea,0xa5,0x15,0xe6,0xf6,0xb6,0xf3,0x57, + 0x16,0x5e,0x42,0x3f,0xba,0x7a,0x71,0xd5,0x8a,0xc9,0xa6,0xee,0x62,0x16,0x40,0x40, + 0x1e,0xf0,0xaf,0x16,0x6a,0x1f,0xf,0x2,0x48,0xbd,0xf2,0x4f,0xa1,0xcf,0x7b,0x57, + 0xc6,0xa6,0x58,0x1c,0x5,0xd5,0xf1,0xb9,0xf6,0xf6,0xf3,0x57,0x96,0x1f,0x5d,0xbd, + 0xb4,0xc6,0x13,0x23,0x34,0x27,0xec,0xed,0x17,0x5e,0x5b,0x7e,0x74,0xf5,0xe2,0xa, + 0xaa,0xe4,0x18,0x9,0xe2,0xae,0x23,0x42,0x3f,0x58,0x41,0x91,0x10,0x56,0x57,0xbc, + 0xf0,0x9,0xcc,0xca,0xa9,0x76,0xc4,0xb4,0xb,0x30,0x1c,0xb6,0x4c,0x24,0x45,0x59, + 0x30,0xeb,0xcd,0x6b,0x97,0xd6,0xb7,0x9f,0x1f,0x95,0xe2,0xb8,0xe6,0xac,0x87,0xe, + 0x4e,0xe6,0x26,0xe4,0xa0,0xce,0x36,0x60,0x1a,0x18,0x72,0xa7,0x91,0x3,0xb5,0xf9, + 0x1,0x44,0xbd,0x88,0x5a,0x99,0xbd,0x79,0x75,0x5c,0xa7,0xa3,0x10,0x16,0xc0,0xec, + 0x47,0xd7,0x2e,0xad,0xf0,0x3,0x41,0xcc,0x14,0x6b,0x84,0x7a,0xe,0x7b,0x90,0x6d, + 0x66,0xe9,0xe5,0x99,0xca,0x20,0xb7,0xe6,0x3c,0x22,0x76,0xa0,0xf8,0x91,0x34,0xc2, + 0x7,0xc4,0x83,0xac,0x8f,0xe5,0x5c,0x41,0xc0,0x8c,0xd9,0x19,0x5d,0x1,0x4d,0xa0, + 0x98,0x21,0x16,0x75,0xf2,0x59,0x2a,0x3d,0x6,0x43,0x4,0x51,0xb0,0x37,0xaf,0xde, + 0xb3,0xbe,0xfd,0xfc,0xab,0xcb,0x49,0x93,0x79,0x59,0x70,0x80,0xe1,0x94,0x37,0xa0, + 0x60,0xdf,0x7e,0xee,0xea,0xf2,0xe6,0xd5,0xb,0x5d,0x73,0xfd,0xcd,0x6b,0x17,0xd6, + 0xb7,0x9d,0x6f,0xbc,0xc4,0x3,0x6d,0x2f,0xe1,0x1b,0xc,0x2a,0x91,0x45,0x75,0xb9, + 0xd8,0xf6,0x94,0x56,0x91,0x4f,0x1e,0xef,0x8,0xba,0xc5,0x43,0xdb,0xc8,0x43,0x7b, + 0x53,0xd4,0xb1,0xe6,0x15,0x95,0xae,0x90,0xec,0xf3,0x3b,0xde,0x2a,0xf0,0x2e,0xeb, + 0x77,0xcb,0xe8,0x54,0x1d,0x3d,0xc4,0xcf,0x7d,0xf3,0xea,0xc5,0xf5,0xf0,0xd4,0x30, + 0xb7,0xd8,0x74,0x8d,0x5,0x15,0xb7,0xd0,0x82,0x99,0xa0,0xdc,0x94,0xfd,0xc6,0x6d, + 0x7c,0xd7,0x54,0x62,0xa,0xce,0x45,0xee,0x21,0xd,0x1a,0x8b,0xcb,0xc1,0xf0,0xe6, + 0x55,0x6a,0x15,0x62,0xd2,0x6d,0xc4,0x7e,0x0,0xbd,0xed,0xec,0x6b,0xcb,0x8f,0xaf, + 0x5f,0x5c,0xdf,0x76,0xf6,0xca,0xf2,0xe6,0xb5,0xfa,0x3b,0x82,0x9c,0x2a,0xb4,0x2e, + 0x47,0x36,0xfa,0xe6,0xd5,0xa,0x3e,0x9,0x46,0x31,0x62,0x74,0xe3,0x8,0xf4,0x3a, + 0xb,0xcf,0x2c,0xb0,0x11,0x8,0x18,0x98,0xc0,0x86,0x5b,0x98,0x8a,0x90,0x3e,0xb8, + 0x78,0xbe,0x13,0xa0,0x51,0xb,0x62,0x17,0xf7,0x25,0x8f,0xb3,0xdf,0xd0,0x99,0x18, + 0xa3,0x96,0x3c,0x9b,0x25,0x6c,0x7c,0x70,0x83,0xe2,0x51,0x4d,0x6c,0xf7,0xc7,0x46, + 0x3d,0x8d,0x93,0x10,0xaa,0x73,0x2a,0x27,0x7f,0x7c,0xed,0xd2,0xea,0x14,0x0,0x15, + 0x46,0x49,0x2d,0xfa,0x2d,0x7,0x11,0xfe,0xe8,0x37,0xaf,0x5d,0xc,0x20,0x27,0xa7, + 0x71,0xc6,0xa8,0x1e,0x7d,0x8e,0xab,0x56,0x6c,0x32,0xc6,0x68,0x8,0x4e,0x26,0x29, + 0xa1,0x3f,0xc8,0xc9,0xc3,0x8f,0xaf,0xd5,0x40,0xde,0xc6,0x50,0x50,0x20,0x6d,0x6f, + 0xb3,0x6e,0xa1,0x73,0x21,0xd5,0xf5,0xe8,0x66,0x20,0xac,0x85,0x69,0xe4,0x71,0xb5, + 0xe9,0xdc,0x2f,0xa5,0x8c,0x44,0x3d,0x60,0x62,0x3a,0xef,0xda,0xd4,0xe7,0xba,0xaf, + 0x6d,0xca,0xbe,0xe,0x51,0xd8,0xde,0x7c,0xfd,0x92,0x88,0x7,0xf1,0x7b,0x76,0x84, + 0xba,0x0,0x5e,0x4d,0x30,0x3b,0xfd,0x1e,0x8b,0xc2,0x5d,0x3b,0x57,0xc6,0x5a,0xfd, + 0x71,0xfd,0x9c,0x8c,0x88,0x67,0x8c,0x5,0xa4,0x2b,0x23,0xc0,0xb9,0xcd,0x12,0xda, + 0x5c,0x4d,0xc0,0xdc,0xa6,0xf8,0x74,0x2,0xe8,0x1a,0xb5,0xc5,0x3d,0x74,0x26,0x61, + 0x2e,0x58,0x1b,0x5,0xb5,0xb8,0x30,0x80,0x83,0x60,0x4,0xbd,0x34,0x80,0xe8,0x48, + 0x85,0x93,0xd0,0x51,0x69,0x7e,0x9e,0xca,0x52,0x64,0x4e,0x8f,0x30,0xc5,0x48,0x77, + 0xe0,0xcd,0xd7,0x2f,0xad,0x60,0xaa,0xb1,0x4d,0xa7,0x51,0x19,0x8f,0xb3,0xd9,0x4e, + 0x5b,0x3,0x21,0x22,0x9d,0xfc,0xbb,0xa7,0x5e,0xd8,0x52,0x55,0x32,0xcc,0x16,0xf6, + 0xe3,0x6b,0x17,0x57,0x99,0xf5,0xf6,0x3d,0x31,0xb4,0xad,0xdd,0xe3,0x9a,0xaf,0xe0, + 0x5,0xa9,0xa6,0x7c,0x72,0xa2,0x86,0x4a,0x4b,0x10,0x83,0xe8,0x92,0xb3,0x9e,0x7, + 0x54,0x69,0x7e,0x9c,0x79,0xe2,0x8,0x15,0xa,0xa6,0x1,0x48,0x79,0xb7,0x20,0xb4, + 0xe3,0x8,0xd6,0xbf,0x70,0xf6,0xea,0xf2,0xe3,0xd7,0x2f,0xae,0xb1,0x32,0x72,0xca, + 0x2c,0x62,0x65,0x9,0xb,0x5c,0x54,0x53,0xf5,0x27,0x6,0x3a,0x39,0x22,0x62,0xa5, + 0xd4,0x77,0x1f,0x20,0xd,0xe7,0x43,0x97,0x50,0xf2,0x31,0x51,0xe7,0x83,0x1b,0x29, + 0x87,0x19,0x46,0x18,0xce,0x20,0xc4,0x3e,0x6b,0xe2,0xc,0x36,0x1c,0xce,0x50,0x99, + 0xc9,0xe,0x1c,0x8c,0x33,0xec,0xd0,0xa1,0xe0,0xb5,0x1,0x84,0xa0,0x90,0x30,0xf, + 0x71,0xa1,0x43,0xc1,0x5b,0x72,0xd,0x16,0x18,0xde,0x23,0x3b,0xfe,0x85,0xa3,0xd7, + 0x96,0x1f,0xdf,0xb8,0xb8,0x72,0x75,0x34,0xf0,0x23,0x3e,0xa9,0xe8,0xc7,0x7b,0xfd, + 0xc5,0xf5,0x4b,0xeb,0xcf,0x1f,0xbd,0xb6,0xfc,0xe4,0xc6,0xa5,0x35,0xcf,0xe9,0xb4, + 0xbf,0x12,0x84,0x5,0xc6,0xa7,0x41,0xf9,0xca,0x3d,0xcc,0x52,0x90,0x6a,0xbf,0xf3, + 0x17,0xd7,0xe9,0x0,0xe5,0xa0,0xda,0xf6,0x80,0xb0,0xd9,0x15,0x5c,0x38,0xe6,0x97, + 0x3c,0x62,0xd7,0x2e,0xc6,0x8f,0x6f,0xd4,0xca,0x88,0x5e,0x6b,0x81,0xc9,0xc1,0x4e, + 0x69,0x2e,0xaa,0x63,0x8,0x28,0x76,0xed,0xec,0x21,0x8e,0x3e,0xa8,0xb2,0x36,0x55, + 0x46,0x1d,0x18,0xe,0x5a,0xb3,0x82,0xdb,0x12,0x7c,0x58,0xb1,0x24,0xb3,0x1b,0xab, + 0xab,0x6,0xda,0xec,0x46,0x3a,0x54,0xbd,0x3,0xa4,0xcb,0x1f,0x3a,0x68,0x4e,0xf4, + 0x40,0x58,0x62,0x49,0xb4,0xc3,0xf6,0xe7,0xcf,0xbc,0xb6,0xfc,0xc5,0xf5,0x4b,0x1d, + 0x8,0xc,0x3e,0x71,0x31,0xeb,0x38,0xb8,0x24,0xfa,0x5c,0x40,0x38,0x89,0x9e,0xfc, + 0xf8,0xc6,0xa5,0x15,0x74,0xf3,0x5b,0x1b,0xbf,0x3,0x61,0xfb,0xb9,0x6a,0xa3,0x8b, + 0x20,0x81,0x3f,0xa3,0xbb,0xdb,0x99,0xc0,0x50,0x7e,0x74,0x1c,0xd,0x3a,0x32,0x1b, + 0x10,0xca,0x85,0x98,0x56,0xb9,0xf9,0x81,0x26,0x30,0x44,0x3b,0x41,0x7c,0xe7,0x15, + 0xe7,0x9e,0x31,0x49,0x53,0x79,0x7f,0x4c,0xda,0xcd,0x9e,0xd0,0xf4,0x48,0x7e,0xf5, + 0xfe,0x16,0xd8,0x8d,0x6c,0x5b,0x9b,0x19,0x8,0x36,0x5a,0xf7,0xb1,0x5b,0x89,0xd8, + 0xfd,0x9c,0x38,0xa1,0x5,0x7e,0xcd,0x60,0x6b,0xe5,0xb1,0x67,0xea,0xec,0xb6,0xf6, + 0xbf,0xe7,0xee,0x67,0x1c,0xf,0x85,0x4a,0xcc,0xdc,0x2b,0x6d,0xcd,0xcc,0xec,0x2f, + 0x6e,0x5c,0x5c,0x7f,0xfe,0xcc,0x95,0xe5,0x27,0xb7,0x2e,0xae,0x8c,0x96,0xe4,0xf6, + 0x5c,0x9c,0xaf,0xf5,0xd,0x5,0xed,0xa5,0x71,0xd2,0xeb,0xe,0x51,0xc8,0x61,0xac, + 0x4e,0x3b,0xb4,0xe2,0x40,0xa9,0x7,0x23,0x2,0xa7,0xa5,0x80,0xef,0x83,0x36,0xe5, + 0x98,0x88,0xa2,0x20,0x42,0xf4,0x83,0xfe,0xae,0xc1,0x7e,0x72,0xe3,0xe2,0xea,0xb4, + 0x90,0x19,0xf1,0xc8,0xc0,0x23,0x37,0xad,0xd0,0xc7,0x5b,0x8e,0xa0,0xa1,0xc8,0xe7, + 0x76,0x4f,0x2f,0xad,0xdc,0x72,0x6b,0x3f,0xff,0xc9,0x8d,0x8b,0xab,0x4f,0xbb,0xc, + 0x44,0x7d,0x6b,0x4d,0x3a,0xca,0x54,0x95,0xda,0x17,0x2,0x23,0xe9,0x66,0x3b,0xa2, + 0x99,0x4e,0x4c,0xae,0x22,0x59,0x4d,0x5b,0xdc,0xde,0xab,0x98,0x31,0x34,0xf4,0x90, + 0xe0,0x81,0x10,0x34,0x1e,0xb3,0xda,0x8e,0xde,0x86,0x64,0x92,0x7c,0x10,0x8f,0xcd, + 0xbe,0xdf,0xb3,0x9f,0x3f,0x7d,0x65,0xf,0x8c,0x16,0x44,0x4d,0x66,0x15,0xf2,0xf6, + 0x16,0xe2,0x16,0x24,0xf8,0x21,0x88,0x5c,0xcb,0x74,0x25,0x5e,0xcf,0x51,0x2e,0x94, + 0x87,0xce,0xce,0xdc,0xda,0xd0,0xa9,0x10,0x5f,0xea,0x34,0x8e,0x99,0xf9,0xce,0x7, + 0x40,0x9f,0xd,0x73,0x86,0xc1,0x34,0xe0,0xea,0x9a,0xf,0xcb,0x11,0x90,0x98,0xa5, + 0x20,0x15,0x71,0x1c,0x41,0x61,0xf8,0x13,0x8c,0xbd,0xe9,0x2a,0x4d,0xc9,0x35,0x3b, + 0x8d,0x72,0xfb,0xed,0x73,0x48,0x87,0x6b,0x50,0x45,0x79,0x94,0x84,0xe0,0xff,0x3d, + 0x2a,0x3c,0xb8,0x4f,0xb8,0x4d,0xba,0x57,0x99,0x1e,0x86,0x28,0xa0,0x64,0x79,0xac, + 0x23,0x9d,0x16,0x2e,0x21,0x62,0x29,0xda,0xf1,0x10,0x9e,0xe6,0x77,0x48,0x4d,0x27, + 0x4c,0x7d,0xcc,0x53,0xab,0x1a,0x9e,0x71,0x43,0xa4,0x15,0x81,0xf4,0xf9,0xb9,0xc0, + 0x40,0x1c,0x61,0x61,0xd2,0x4e,0x8e,0xed,0x6f,0xb3,0xd4,0xf6,0xee,0xda,0x1f,0xd1, + 0x89,0x0,0xd4,0xb2,0x2d,0x3,0x30,0x8b,0x8,0xce,0x44,0x2e,0x9c,0x80,0x3,0x1, + 0xd0,0x73,0xa2,0x18,0x6f,0x22,0x3c,0xec,0xd1,0xc9,0xc,0xbd,0xfd,0xed,0x27,0x37, + 0xef,0x59,0xa3,0x34,0xf5,0x74,0x32,0x18,0xc1,0x77,0xc6,0x4e,0x8c,0x3e,0xe9,0xc7, + 0x2b,0x18,0x50,0xf5,0x40,0x5c,0x5b,0xe7,0x12,0x4b,0x2c,0x77,0xcc,0x30,0xab,0xc2, + 0x3c,0x77,0x75,0xa9,0x43,0x25,0x9a,0x27,0x50,0x30,0x22,0x42,0x17,0x73,0xb0,0x2d, + 0x5c,0x98,0x66,0x71,0x5c,0x65,0xd1,0xe4,0x6c,0x64,0x9d,0x72,0x3e,0x9e,0x14,0x81, + 0x12,0xae,0x94,0x10,0x17,0xa0,0x4f,0x39,0x73,0xd1,0x19,0xcc,0xd8,0xa2,0x13,0x16, + 0x9b,0x73,0xfd,0x26,0xba,0xf0,0xdc,0x3d,0xcd,0xc1,0x8d,0x2b,0x3c,0x6,0x5b,0x14, + 0x45,0xeb,0xc6,0x7e,0x8f,0x8e,0xb,0x3d,0x65,0xd6,0x96,0x2,0x53,0x6c,0x5e,0x47, + 0xec,0x7d,0xf6,0xbc,0xed,0x47,0x28,0xcf,0xb6,0xa6,0xa,0x73,0xa1,0x45,0x68,0x99, + 0xbf,0xbb,0xb7,0x6f,0xe8,0x61,0x4f,0xe,0x2d,0x17,0x5e,0xa4,0x27,0xbd,0xf1,0xd8, + 0x61,0x69,0x3c,0x6a,0xf,0xd3,0x8f,0x8,0xbb,0xc4,0x81,0x8c,0x55,0xe,0x7f,0xf, + 0x89,0xda,0xa4,0xc2,0x89,0x6a,0x4a,0xb1,0x8d,0x9f,0xfc,0xb1,0x1d,0x59,0x9,0x6d, + 0x32,0x99,0x31,0x6a,0xe5,0xb7,0x7b,0xfc,0xcf,0x4f,0xbd,0xb6,0xfc,0xe4,0xd6,0xa5, + 0xb5,0x3,0x4,0x5b,0x87,0x64,0x82,0x83,0xc8,0x15,0xac,0x1a,0xca,0x6a,0x7,0xc5, + 0xfa,0x33,0x1d,0xd5,0x33,0x37,0x72,0x7d,0xaa,0xfc,0x97,0xd1,0xba,0x79,0xa3,0x7, + 0xa1,0xc9,0x61,0x62,0xa4,0xcd,0x28,0x85,0x85,0xf5,0xaf,0xa5,0xa2,0xa1,0xd3,0xf1, + 0x81,0xbb,0x50,0xc1,0xa4,0xb1,0xee,0x8a,0xc6,0x49,0xd5,0xbd,0x71,0x7,0x48,0x2b, + 0xb1,0xbe,0xfa,0xa0,0x58,0x82,0x91,0xe6,0x68,0xdb,0x37,0xa1,0xe2,0x31,0xb8,0xd3, + 0x9e,0x12,0x11,0xde,0x49,0x66,0x56,0xd8,0xc7,0xc0,0x6c,0xcc,0xce,0x26,0xb3,0xf, + 0x4c,0xc6,0x69,0xe9,0x75,0xe1,0xbe,0xc7,0x99,0xba,0xc2,0x69,0x12,0xb,0x23,0x63, + 0x33,0xf4,0x70,0x89,0xb3,0xcf,0x4,0x1d,0x10,0xb9,0x43,0x8d,0x59,0x88,0x80,0x88, + 0x9,0xf2,0x1d,0x9e,0x13,0xfd,0xd6,0x35,0xd0,0xb9,0x1f,0xb5,0xef,0x13,0x9e,0xc5, + 0xd4,0x93,0xc1,0xf1,0x16,0x62,0x5d,0x2e,0xe3,0x13,0xcd,0xce,0xa5,0xe7,0x3e,0x19, + 0xc,0x22,0xb5,0x72,0x5a,0x6e,0x4a,0x71,0x85,0xb3,0x7e,0xe7,0x80,0xec,0xdc,0x22, + 0x4,0x25,0xa8,0x3e,0x19,0xf3,0x51,0x4c,0xf1,0x48,0x4f,0x89,0xf,0x30,0x56,0xe8, + 0x30,0xed,0x86,0x86,0x39,0xb7,0xb4,0xd5,0x7d,0x28,0x10,0xee,0xd2,0xcc,0xa1,0x7, + 0x0,0x1d,0x3d,0x25,0xcc,0x54,0x33,0x19,0x8a,0xb8,0x1d,0xe4,0x98,0x6a,0xe6,0xf6, + 0xcf,0xee,0x7e,0x75,0xf9,0xf,0xb7,0xef,0x5d,0xfb,0x68,0x2e,0x26,0x9e,0x50,0xd5, + 0x80,0x2c,0xb2,0xd6,0x2a,0x74,0xda,0xa4,0xa2,0x31,0x2e,0x99,0xd9,0x98,0x2d,0x39, + 0x57,0xe8,0x71,0x1e,0xc0,0x80,0xf,0x4,0x7,0xb5,0x9e,0xd,0x71,0x6d,0xe1,0xc9, + 0xe2,0x12,0xac,0x2f,0xdd,0xe7,0x8,0xd0,0xf5,0x12,0x1b,0xa8,0x88,0x89,0xc8,0xa8, + 0x84,0xc6,0x3a,0x41,0xa2,0x13,0xf8,0xc,0xf8,0x67,0x98,0x68,0x30,0xef,0xb,0xec, + 0x3f,0x1c,0x5f,0x5a,0x59,0xb6,0x92,0xf,0x94,0xbf,0x3c,0xbe,0x67,0xfd,0x67,0xef, + 0x7c,0x75,0x68,0x3d,0x3,0x39,0x99,0xe1,0x6a,0x2d,0x8a,0x78,0x84,0x43,0xb0,0xcd, + 0xb0,0xc0,0xe3,0xc6,0x99,0xb9,0x7,0xcf,0x66,0xc8,0x89,0xce,0xa8,0x75,0xd9,0x8f, + 0x6a,0x4e,0x70,0xfa,0xbe,0xf5,0x84,0xc,0x66,0xe0,0x4d,0x97,0x2f,0x45,0x44,0x34, + 0xd1,0xb5,0x45,0x3,0x18,0x1,0x44,0xba,0x1c,0x4e,0xa3,0x2,0x1f,0xf7,0xf9,0x2f, + 0x6f,0xf3,0x2c,0x6e,0x54,0xc4,0x31,0x1e,0xa9,0xbe,0xbe,0xa7,0x7a,0xc6,0x15,0x71, + 0x15,0x78,0xc8,0xae,0x32,0x9f,0xa6,0x3c,0x6b,0xd,0x45,0x50,0x74,0x6b,0xe8,0xd0, + 0x38,0xa2,0xaa,0xe2,0x44,0xdf,0xbf,0x85,0xe7,0x92,0xe2,0xa2,0xb6,0xe4,0xa2,0x77, + 0xba,0x22,0xf3,0x11,0x2b,0x67,0x6a,0xb2,0x9a,0xa8,0x2a,0xa5,0x8a,0x50,0x79,0xf7, + 0x87,0x2a,0xc4,0x69,0xf5,0xc8,0x33,0xe3,0x19,0x90,0x2a,0x8c,0xbc,0x84,0x2b,0x9f, + 0xe6,0xc8,0xa,0x86,0x12,0xa,0xa5,0x97,0x4,0xf0,0xc9,0xc,0x87,0x1c,0x33,0xcc, + 0xa6,0x8,0xa9,0xc9,0x78,0x2e,0x8f,0x3f,0x61,0x93,0x2a,0xcc,0xa9,0xe3,0xc4,0xca, + 0x91,0x1e,0xd8,0x9,0xdc,0xde,0x8c,0x3c,0x6b,0xb,0xb8,0xa3,0x28,0x1f,0xa,0x11, + 0x91,0xd5,0xbd,0x15,0x3,0x68,0x7,0x2e,0x46,0xed,0x56,0x93,0xa,0x13,0xc6,0xdd, + 0x49,0x1e,0x5d,0x68,0x72,0x36,0x89,0xf0,0x69,0xcf,0x38,0x41,0x51,0x9d,0x85,0x8a, + 0xb2,0xb4,0x61,0x86,0x3c,0xf1,0xa4,0xd4,0x54,0xe5,0x8d,0xbd,0x8,0x68,0xbc,0x87, + 0x6e,0x51,0x2c,0x38,0xd6,0xfd,0xb,0xa,0x50,0x16,0x33,0x28,0x90,0x8a,0x7,0x65, + 0x45,0xbe,0xac,0x4c,0x39,0xeb,0x38,0xc4,0x24,0xd5,0x2d,0xe3,0x8d,0xc,0x39,0x1, + 0xb6,0x90,0x14,0xdb,0xe4,0x73,0x18,0xa3,0x90,0x96,0x2f,0x7d,0x77,0x8d,0xb9,0x3, + 0x40,0xae,0x48,0x97,0x9,0x8,0x96,0x63,0x2c,0x57,0xe8,0x9c,0xf0,0xbb,0x9b,0xfd, + 0xd3,0xbb,0x5e,0x5b,0xfe,0xea,0xe,0x81,0x2a,0x5c,0x11,0xc9,0x8c,0xc0,0x44,0xe8, + 0x30,0x4a,0xa6,0xe2,0xb9,0xcd,0x31,0xc0,0x2c,0x9c,0x26,0xc7,0x6a,0x42,0x37,0xab, + 0xa7,0x99,0xc4,0x1c,0x95,0xee,0xce,0x52,0x92,0xa3,0xe2,0x9d,0x81,0x8,0xd0,0xab, + 0x9a,0x7c,0xba,0x8d,0xec,0x90,0x84,0x6a,0x68,0x26,0xc5,0xf,0xa,0x22,0xe6,0xe2, + 0x59,0x31,0xcf,0x46,0x4b,0xc7,0xa1,0x47,0xf4,0x44,0x99,0x36,0x67,0x6f,0x98,0xb4, + 0xc0,0x82,0xa3,0x9a,0x3e,0x6b,0xf,0xc1,0x22,0xda,0x79,0x5a,0x76,0xb,0x32,0x6d, + 0xe9,0xea,0xc8,0x22,0x58,0xb,0xfa,0xc4,0xbe,0xc,0x93,0x60,0x68,0x3a,0x36,0xf4, + 0x82,0xc0,0xd8,0x82,0xce,0x4c,0x6d,0x62,0x7e,0x10,0xda,0xd5,0xea,0x70,0x86,0x8, + 0xc5,0x9d,0xb6,0x50,0xed,0x40,0x67,0x22,0x66,0xee,0x7,0x49,0x14,0x98,0x73,0x8f, + 0xc1,0xa,0x86,0x99,0xcf,0xb,0x6d,0x23,0xe5,0x6a,0x20,0xd,0xef,0x30,0x14,0xdd, + 0xc4,0xa1,0x2c,0x82,0xa1,0x2c,0xb0,0x95,0x1c,0x5a,0x92,0x1e,0x24,0x3d,0x20,0x8c, + 0xa9,0xe6,0xc1,0x50,0x71,0x14,0x34,0x63,0x95,0x4e,0xc9,0x18,0x4d,0xa8,0xc,0xdb, + 0x84,0x19,0x30,0x7a,0xf6,0x84,0xd0,0xa2,0xd4,0xe,0x6e,0x6f,0x8d,0xc0,0x1c,0xe7, + 0xc7,0xf0,0x20,0x30,0x5,0x0,0x76,0x65,0x9e,0xc9,0x93,0x4c,0xdc,0x6d,0xf,0x87, + 0x2c,0x28,0x90,0x8c,0x4,0x69,0xce,0x26,0xd0,0x64,0x91,0xfd,0xbe,0x5d,0x88,0x22, + 0x48,0x78,0x60,0xcf,0x78,0xc7,0xf1,0x5d,0x64,0xc,0x90,0xb8,0x35,0x4,0xb2,0x74, + 0xa5,0xeb,0xc1,0xd4,0x31,0x51,0xaa,0x3a,0x25,0x93,0x47,0x97,0x2,0xd1,0xcc,0x8f, + 0x0,0x5c,0xae,0x26,0x29,0x68,0xee,0x94,0xad,0x19,0x23,0xa7,0x8c,0x74,0x94,0x46, + 0x17,0x33,0xdd,0x7b,0xe3,0x2,0xed,0xc0,0xb3,0x46,0x30,0xdd,0x9c,0x28,0xd2,0x79, + 0x62,0xb0,0x8,0x8b,0x22,0x4,0x42,0x98,0xfd,0xd5,0xf,0xee,0x5d,0x99,0xaf,0xf, + 0x8b,0xf8,0x6a,0xc8,0x28,0xb2,0xe1,0x15,0x86,0x6,0xfd,0x88,0x25,0x88,0xc0,0xd9, + 0xa9,0xc7,0xc4,0xe0,0xb4,0x9b,0x58,0x78,0xcb,0x0,0x37,0x39,0xab,0x19,0x69,0xa7, + 0xb8,0x1c,0xc1,0xaa,0x87,0xc2,0x20,0x6b,0x10,0x8,0xd7,0xbd,0xda,0x6f,0x35,0x23, + 0x85,0xc4,0x13,0xd5,0x31,0x8d,0xfd,0xef,0xdf,0xbf,0x67,0xfd,0x27,0xbf,0xfc,0xda, + 0xe2,0x89,0x77,0x39,0x40,0x14,0x3d,0x68,0x13,0xf7,0x31,0x81,0x7,0xc4,0x9c,0x3d, + 0x6a,0x30,0x92,0x13,0x13,0x5b,0x85,0xc2,0x83,0xf9,0x4,0xa4,0xa9,0x3c,0xa8,0xda, + 0x4e,0xbf,0x3,0xa,0x8a,0xc8,0x15,0x46,0x40,0x43,0x8,0xdf,0x12,0xea,0x8e,0xa4, + 0x3c,0x70,0xef,0x1b,0xd,0x65,0xb0,0x19,0x85,0x87,0xc8,0xd9,0x64,0x9,0xa8,0xe4, + 0x59,0xd0,0x11,0xda,0x77,0xb6,0xea,0x9b,0xb0,0x4e,0x32,0x97,0x77,0xda,0x97,0xe4, + 0x19,0x2e,0xe,0x44,0x2f,0x48,0xb0,0x87,0xcd,0xfc,0x58,0xb,0x7d,0x56,0x70,0xd2, + 0x8a,0x96,0x42,0xa2,0xcb,0x8f,0x80,0xb4,0x1e,0xcf,0xb8,0xc0,0xe,0x88,0x6d,0x94, + 0xf4,0x75,0x8a,0x1d,0x72,0x79,0x6b,0x37,0xcf,0xd4,0xf6,0x75,0xf2,0x45,0x67,0x5a, + 0xd4,0x52,0x5d,0x41,0x1d,0xde,0xe2,0xfa,0x18,0xfc,0x50,0x74,0x41,0x80,0xba,0x5f, + 0x50,0xe7,0x84,0xe3,0x48,0x5,0x72,0xe2,0x3,0xd7,0xca,0x19,0x48,0x9a,0x6,0xe9, + 0xbe,0x52,0x20,0x6,0x3,0xdb,0xfa,0x65,0x3a,0x31,0x59,0xc4,0x9a,0xb0,0x9e,0xf3, + 0x98,0xcc,0x17,0x99,0xbf,0xae,0x3f,0x43,0x40,0xd1,0xef,0x7b,0x28,0x63,0x5d,0x5c, + 0x78,0xcc,0xe9,0xfe,0x54,0xd,0xb,0xa8,0xb5,0xb2,0x13,0x86,0x46,0xfc,0x6a,0x67, + 0x2e,0x74,0x8,0x2d,0xce,0x3,0x9d,0x6,0x68,0xe0,0x42,0x40,0xf6,0xf3,0x5e,0xd6, + 0xb6,0x7b,0x3e,0x3d,0x10,0xdd,0x1b,0xa5,0xdb,0xc1,0xe,0x64,0xc4,0x90,0x30,0xd6, + 0x45,0x9f,0xd3,0xab,0xf4,0xca,0x4b,0x77,0xda,0x32,0xa0,0xfe,0x1a,0xd2,0x24,0x81, + 0x41,0x95,0x60,0xab,0x66,0x4c,0x72,0x35,0xc4,0x62,0x0,0x66,0x56,0xfa,0x49,0xe8, + 0x7c,0x7b,0xb8,0xab,0x8a,0x5c,0xfd,0x49,0xce,0xc,0x8,0x48,0xaf,0xaf,0xc,0x3a, + 0x4b,0xa2,0x3b,0x63,0xbb,0x93,0xac,0xf8,0x38,0x53,0x1e,0x35,0x2,0xe2,0xf1,0x5a, + 0x72,0x3a,0x3f,0xd0,0x99,0xc,0xa3,0xa3,0xe8,0xbb,0xbb,0x49,0x5b,0xf5,0x0,0x8d, + 0xf0,0x50,0x5d,0xb,0xdb,0xb3,0x6,0xd9,0xd2,0x4a,0xf7,0x9,0x11,0x1f,0xe6,0x51, + 0xd2,0x41,0xf0,0x5b,0x6d,0x4e,0xef,0xa8,0x78,0xa9,0xce,0xbb,0x27,0x3,0x26,0xd6, + 0x17,0xa9,0x1d,0x16,0x88,0x15,0xee,0x70,0x15,0x45,0x70,0x20,0x64,0x4d,0x17,0x56, + 0xb5,0xec,0x7c,0xf8,0x96,0x88,0x62,0x10,0x77,0x4c,0x8e,0x89,0xa1,0xa0,0x59,0x8c, + 0x84,0x3,0xa2,0x7f,0x32,0x7,0xd8,0x96,0xc1,0xca,0xcc,0x16,0xd9,0xbf,0x1c,0x71, + 0x76,0x23,0xc4,0x9b,0xec,0xe5,0x9d,0x2d,0x3e,0x4d,0x2b,0xc9,0x4,0xd6,0x50,0x61, + 0x84,0x14,0x48,0xc2,0xa2,0x44,0x56,0x86,0xd6,0x52,0x6e,0x76,0xf0,0x5a,0x44,0xc9, + 0xc6,0x58,0x58,0x28,0x9b,0x53,0x14,0xbc,0xfb,0xa4,0x4a,0x12,0xfe,0x20,0xe6,0xad, + 0x59,0xa7,0xc3,0x55,0xcf,0xe5,0xac,0x42,0x31,0xf3,0x65,0xa4,0x83,0x33,0x1b,0x81, + 0x23,0x97,0x9,0xe1,0x4c,0xb5,0xb0,0x31,0x27,0x42,0xdb,0xa1,0x1a,0x1a,0x41,0x2a, + 0x2a,0xd1,0x8d,0x9e,0x3d,0x42,0xcf,0x18,0x61,0x8a,0xad,0x81,0x7f,0x7c,0x77,0xf, + 0xea,0x53,0x3,0x48,0xe6,0x11,0x18,0x20,0xde,0xc7,0xc1,0xae,0x14,0x13,0xd,0xe9, + 0xa0,0x14,0x18,0x3d,0x97,0x61,0x51,0xa4,0x64,0xa8,0xbf,0xb8,0x73,0xb5,0xb1,0x1f, + 0xcb,0x8c,0xbc,0x77,0x53,0x70,0x52,0xea,0xd,0xa3,0x0,0x65,0x3f,0x69,0x1c,0xfb, + 0x7f,0xf6,0x8c,0x10,0x70,0x94,0xfe,0xe7,0xf6,0xff,0xa8,0x3f,0x43,0x29,0x70,0x0, + 0x26,0x89,0x2a,0x7a,0xa0,0x73,0xd3,0x64,0xa6,0xe5,0x9e,0x1e,0xbd,0xed,0xad,0x24, + 0x4a,0x1e,0xb8,0x6a,0x86,0x1e,0x26,0x98,0xae,0xfd,0x91,0x24,0x5b,0x90,0xd2,0xf4, + 0xe0,0x84,0x7,0x84,0x1,0x0,0xb0,0x97,0x10,0x90,0x97,0xf4,0x45,0x2f,0x69,0x1e, + 0xf8,0xe4,0xeb,0x5f,0x5e,0x8c,0xa5,0xf7,0x1c,0xa1,0x74,0x5d,0x29,0x97,0x83,0xab, + 0x74,0x33,0x66,0xf3,0xfd,0x7e,0xfb,0x50,0x55,0x11,0xe3,0xe6,0x11,0x34,0xf7,0xbb, + 0x4e,0xdf,0x3,0x1e,0xf3,0xab,0x7a,0xbe,0xfc,0xf5,0x9b,0xf7,0xae,0xff,0xe3,0xdb, + 0x5e,0x59,0x46,0xf7,0xc8,0xf,0x27,0x4d,0xc9,0xf2,0x94,0x19,0x2d,0x2a,0x60,0xc2, + 0xf3,0x7e,0x40,0x3b,0x2b,0x29,0x93,0x7,0xdd,0xa6,0x1e,0x1c,0xf7,0xef,0x59,0xf1, + 0x25,0x30,0xb4,0x75,0xa,0x49,0xc4,0x78,0x7f,0x79,0x12,0xf8,0x2a,0x30,0x2b,0x35, + 0x36,0x17,0x78,0xa9,0x6b,0xd4,0x4a,0x5d,0x97,0x36,0x59,0xc7,0xfb,0x7a,0xf5,0xba, + 0x86,0xff,0xe3,0x8f,0xef,0xff,0xbb,0x7f,0xfc,0xb6,0x97,0x7f,0xe,0xa5,0xb4,0x3d, + 0x52,0xd7,0xf1,0xfe,0x7e,0xfb,0xcb,0xcb,0xfe,0x11,0x7d,0xdd,0x17,0x40,0xa8,0x8e, + 0x3,0xc4,0x39,0x1e,0x38,0x34,0x1d,0xab,0x9f,0xde,0x9f,0xbd,0x8f,0x89,0xb7,0x5b, + 0xd8,0x13,0x5d,0x7,0x60,0xa0,0xb4,0x11,0x97,0x9a,0xd,0xb1,0x27,0x30,0x3,0xc9, + 0xa3,0x8,0x4d,0xec,0x1e,0x8f,0xf3,0x44,0x4,0x67,0x2c,0x8,0xd7,0x84,0xf0,0xf0, + 0xd7,0x6f,0xde,0xb7,0xfe,0xe3,0xb7,0xbd,0xbc,0x30,0x5d,0x4f,0xca,0x39,0xd8,0x44, + 0x88,0x25,0xf8,0x15,0x50,0xc7,0xe1,0x24,0x7,0x85,0x6d,0x9b,0xfd,0x9e,0xfa,0x42, + 0xb6,0xd7,0x6c,0x9b,0x65,0x37,0x2,0xc2,0x4d,0x60,0x62,0xb2,0xa1,0xdd,0x5f,0xe4, + 0x4d,0x30,0x13,0x2d,0x8f,0xb3,0x34,0x72,0x5e,0x72,0x96,0xe1,0x89,0x1d,0xfe,0x24, + 0xd6,0xef,0x13,0x6d,0xc3,0x9,0xc5,0xad,0xb7,0x50,0x9c,0xe6,0x5b,0x36,0x93,0x65, + 0x4b,0x63,0x82,0x6d,0x9b,0x34,0x8d,0x93,0x2,0xa5,0x87,0x1a,0xc8,0x43,0xf5,0xa1, + 0x8d,0xb1,0xec,0xa6,0x6c,0x8a,0x56,0x80,0x25,0x4,0x7a,0x44,0xfb,0x8f,0x45,0x19, + 0xdf,0x9b,0x4,0x5b,0x70,0x80,0xfb,0x49,0xf4,0x31,0x83,0x8a,0x89,0x28,0x42,0x1e, + 0x61,0x36,0x68,0x9,0xb3,0xa0,0x9d,0x16,0x64,0x56,0x3,0x82,0xac,0xf,0xd4,0x30, + 0x73,0xdb,0x66,0x9d,0xd9,0xd0,0x26,0x2c,0xaa,0x3,0x2f,0xae,0xc4,0x9d,0xfa,0x47, + 0x6b,0x98,0x2b,0x4e,0x17,0x26,0x64,0xca,0x81,0xf4,0xf3,0xf7,0xb6,0xfa,0x5f,0xbf, + 0x79,0xef,0x4f,0xff,0x87,0x5f,0x78,0xe5,0xe7,0x36,0x46,0xcc,0x97,0x31,0xd8,0x93, + 0xf9,0x9f,0x33,0xa5,0x30,0xc3,0x2f,0x87,0x79,0x90,0x8a,0x46,0x74,0x50,0x60,0xd6, + 0x85,0x35,0xb8,0x7b,0x76,0x24,0xf3,0x5e,0xe1,0x98,0x3b,0x20,0xa5,0x88,0x25,0xcb, + 0x5c,0x90,0x77,0x2d,0xcf,0x25,0x79,0x62,0xdf,0x44,0x46,0xba,0x33,0x1a,0x14,0x44, + 0x5,0x8c,0xb3,0xc1,0x65,0xe,0x17,0x2c,0xd2,0xf6,0xd6,0x27,0x44,0xfe,0x3b,0x1c, + 0xb8,0xfd,0x6c,0x80,0x62,0x19,0xc6,0x88,0xc3,0x6d,0x26,0x5,0xca,0x89,0x85,0x98, + 0x75,0xf8,0xa0,0x2,0x8e,0x4a,0xf,0x23,0xfd,0xa,0xd4,0xcc,0x4d,0x5c,0x2,0xeb, + 0x53,0x71,0x42,0xf9,0xd7,0xcf,0xdc,0xb6,0xfd,0x9e,0x6c,0xac,0xdb,0xe1,0x61,0xe4, + 0x4,0xe5,0x8a,0x3a,0xb4,0xb1,0xee,0xdc,0x4a,0x87,0x5b,0x76,0x2e,0x23,0xef,0x5, + 0x24,0x8d,0x32,0xa2,0xc7,0x1f,0xf6,0xf7,0x8a,0x9d,0x3c,0x7,0x20,0x5b,0xde,0x90, + 0xc6,0x3,0xc,0x1e,0x4b,0x2a,0x8c,0x31,0xf9,0xb5,0xb9,0xca,0xdf,0x56,0xbb,0x1c, + 0x12,0x2b,0xa2,0x80,0x13,0x88,0x33,0xbe,0x83,0x23,0x61,0xa2,0x14,0x6a,0x6c,0xe, + 0xe1,0x3,0x63,0x53,0xec,0x90,0xf,0x40,0xd4,0x1e,0x44,0x57,0x6d,0xa,0x52,0x46, + 0x25,0xa1,0xcc,0x2,0xbf,0x3b,0x62,0x5b,0x26,0x67,0x31,0x8d,0x8d,0xb6,0x4d,0xe3, + 0xc3,0x5c,0x2,0xc3,0x13,0xe8,0x71,0xdb,0x66,0x60,0xda,0xf0,0x3b,0xb3,0xfe,0x94, + 0x83,0x30,0x0,0xfb,0xfb,0x9c,0x94,0x83,0xce,0x2d,0x36,0xdc,0xd2,0x40,0x4e,0xd5, + 0xba,0x78,0xae,0xe3,0x34,0xac,0x47,0xc0,0x19,0xe7,0xd8,0xe9,0x4,0x94,0x73,0x8f, + 0x8b,0x39,0x5c,0x43,0x3,0x7b,0xd1,0x67,0x31,0x58,0x8d,0xe7,0x6b,0x89,0x16,0x85, + 0x10,0x58,0x11,0x14,0xda,0x10,0x2a,0x2a,0xb8,0x74,0x25,0x54,0x18,0x60,0x32,0xfa, + 0x99,0xcc,0x7a,0x38,0x60,0x4a,0x5,0x83,0x19,0xaa,0x3c,0xda,0x5e,0xd8,0xbc,0x7d, + 0x2e,0x8c,0x8b,0x98,0xe9,0xe5,0xc5,0xe3,0xd3,0x31,0x22,0xb2,0xe,0x1e,0xe3,0x6, + 0x84,0x4a,0xa8,0xed,0x51,0xe,0xa0,0x3e,0x49,0x5a,0x5a,0xab,0xc8,0x79,0xb1,0xc2, + 0xb3,0x4f,0x92,0x63,0xe2,0xfd,0x10,0xe5,0x14,0x7d,0xac,0xa6,0xa4,0xbd,0x9f,0xc8, + 0x6c,0x63,0x25,0x60,0x30,0x5,0xd8,0xcd,0x6c,0xac,0x5b,0x8,0x50,0x4f,0xf2,0x49, + 0x8a,0x81,0x66,0xea,0x62,0xd5,0x3b,0xa,0x91,0xb9,0x52,0x0,0x9e,0x1d,0xef,0x15, + 0x87,0xb6,0x3,0x9c,0x93,0x43,0x12,0x41,0xd9,0x8f,0xd4,0x2,0xf5,0x37,0x20,0x7f, + 0x80,0x32,0x62,0x21,0x0,0xb3,0xad,0x1e,0xeb,0x6c,0x8b,0x5b,0xdb,0x64,0xe2,0x2c, + 0x56,0x54,0xa2,0xda,0x19,0x4b,0x2,0x3,0x63,0xf6,0x59,0x6b,0x60,0x80,0x17,0x33, + 0x75,0x8a,0xe7,0xea,0x3d,0x98,0x3b,0x57,0xf0,0xca,0x2,0x68,0xc5,0x2e,0x6f,0x7d, + 0x9e,0x9b,0x7a,0xc4,0x59,0xb4,0xdb,0x55,0xa0,0x23,0x8b,0x83,0xd3,0x21,0xe8,0x7c, + 0x5d,0xa3,0xb9,0x23,0x2,0x99,0xa0,0x6b,0x1d,0x91,0xc2,0x16,0x6d,0x8b,0xa3,0xf2, + 0xa1,0xa9,0x84,0x6c,0xf,0x41,0x5e,0x83,0xa3,0x13,0xa0,0xbb,0xc8,0xf6,0xcf,0x70, + 0xfa,0x19,0x46,0xa3,0xaf,0xe2,0x92,0x2d,0x36,0xb9,0x7f,0xe1,0xa1,0xc5,0xed,0x7e, + 0xe0,0x2e,0x69,0xba,0xbb,0xa7,0x74,0x90,0x84,0x24,0x25,0xf6,0x7e,0x60,0x9c,0xe1, + 0xd4,0xe6,0xec,0xc5,0x50,0xd1,0x8a,0x2d,0xd7,0x8e,0xe2,0xf7,0xd4,0x96,0xa9,0xcc, + 0x88,0x1d,0x66,0xb6,0xf9,0x48,0xa8,0x20,0x4c,0x2a,0x44,0xbc,0xe,0xed,0x17,0x78, + 0xe2,0x24,0xfb,0xd0,0x4c,0x98,0x14,0x61,0xe,0x16,0xaf,0xf0,0xdc,0xb1,0xe4,0xa3, + 0x1,0x22,0xd3,0x8,0x1a,0x7b,0xa9,0x10,0x42,0x3e,0x9f,0xa3,0x97,0xc1,0x4c,0xf8, + 0xd0,0x93,0xa3,0x11,0xa6,0x71,0x43,0x41,0x81,0x14,0x4f,0x3d,0xe5,0xf4,0xe3,0xfc, + 0xda,0x51,0xee,0xae,0x2e,0x6b,0x66,0x53,0xd5,0xaa,0x76,0x5f,0xff,0xe6,0x27,0xf7, + 0xae,0xff,0xfd,0x3f,0x7f,0x65,0x11,0x3f,0x60,0x98,0x54,0x1c,0x33,0x81,0x57,0x31, + 0x0,0x88,0xd5,0x17,0x6d,0x38,0x1,0x90,0x7,0x68,0xa0,0x80,0xb3,0xfa,0xef,0xb3, + 0xeb,0x8d,0x4f,0xb7,0x4e,0xac,0x75,0x95,0x26,0x13,0x90,0xd4,0xfc,0xde,0xce,0x82, + 0x1c,0xd0,0x2c,0x39,0x64,0x7b,0xe2,0x2e,0x56,0x37,0xb1,0x47,0xe,0x78,0x0,0x8a, + 0x20,0xd7,0x19,0x79,0xdc,0xe9,0x3a,0xc7,0x51,0x9e,0x37,0xf9,0x71,0x4,0x99,0xd0, + 0xee,0x6c,0xc6,0xb4,0x29,0x42,0x3d,0x75,0xd3,0x92,0xe0,0x52,0xe4,0x54,0x15,0x74, + 0x57,0xae,0x83,0xa6,0x34,0x1,0x9b,0x66,0x84,0x56,0x75,0xcd,0xde,0xa2,0xd0,0x4c, + 0xc5,0xb3,0x8a,0xea,0x97,0xf3,0x90,0xb5,0x49,0x3a,0xfa,0xdc,0x7,0x1d,0x41,0xea, + 0x94,0x35,0x3,0x10,0xaa,0x23,0xa5,0x61,0x8d,0x3,0x82,0xde,0xf,0x88,0x5a,0xe2, + 0x93,0x36,0xd7,0xdf,0xfe,0xe5,0x7d,0x3f,0xf5,0x36,0x40,0x2f,0xe3,0x33,0x58,0xf1, + 0xaa,0xad,0x21,0xe,0xee,0xe,0x4c,0x64,0x24,0x91,0x7c,0xad,0x7,0xde,0x60,0x52, + 0xcd,0x94,0x38,0x40,0xe8,0x22,0x23,0x9e,0xa8,0x89,0x2d,0xc8,0xbb,0x9a,0x6a,0x6a, + 0x4e,0x8d,0x80,0xc3,0x2c,0xa,0xc6,0xb1,0xb1,0xe6,0x90,0xdb,0x5f,0x13,0x39,0xe6, + 0xa2,0xf7,0x33,0x63,0x62,0x19,0xfd,0x1b,0x74,0xa,0x61,0x28,0x22,0x50,0x61,0xa1, + 0xbd,0x94,0xfa,0x31,0x4e,0x36,0xb7,0x5a,0x5d,0xd1,0x47,0x83,0xed,0x58,0x5d,0x19, + 0x26,0x25,0x98,0xf2,0xc,0xb0,0xaf,0xff,0xcd,0x5f,0xde,0xf7,0x53,0x81,0xce,0xc9, + 0xa1,0x6e,0x3a,0xff,0x64,0x17,0x39,0xe5,0xaf,0x7a,0xd4,0xe,0x8,0x3,0x41,0x9, + 0x3e,0x8,0x9d,0x87,0x34,0xae,0x63,0x61,0x7,0xb,0x3c,0x49,0xcc,0xa4,0x9f,0xbb, + 0xf3,0xc7,0x34,0x58,0x8f,0xe0,0x80,0x89,0x92,0xc9,0xc4,0xf7,0xc1,0x2,0x4f,0x79, + 0x18,0x37,0xc1,0xe,0xa8,0xaa,0xf9,0x66,0xb6,0xfc,0x93,0x17,0xff,0xdb,0xbf,0xfd, + 0xab,0xcb,0xff,0x29,0x76,0x7d,0x61,0xd6,0x3,0x74,0xef,0x44,0xf0,0xc8,0xac,0xa4, + 0xb1,0xa5,0x4f,0xe8,0xa,0x3,0x40,0xd0,0x96,0xc1,0xe6,0x9e,0x19,0x18,0xd2,0x51, + 0x45,0x12,0x6a,0x9c,0x51,0xdf,0xa2,0xba,0x26,0x66,0x26,0x41,0xfa,0xe7,0xa9,0x52, + 0x1c,0x54,0xda,0x78,0xa6,0x93,0xa6,0xa,0x90,0x2d,0x6,0x29,0x98,0x1c,0xe6,0x3a, + 0xe6,0x82,0xa7,0x4e,0x49,0xe7,0xa1,0x7b,0xca,0x4c,0x9b,0x72,0x9a,0xa7,0x4a,0x4d, + 0x94,0xbd,0x64,0xb6,0x4a,0x19,0x16,0x5,0xde,0x11,0x0,0x7d,0xa2,0x6a,0x15,0x9a, + 0xdf,0x9e,0xc1,0xb7,0x16,0x2a,0x40,0x26,0x35,0x3a,0xa9,0xea,0x38,0x57,0x68,0x84, + 0x7e,0x86,0x78,0x22,0x7,0xd2,0x30,0x3c,0x49,0x99,0xcf,0x4,0x16,0xba,0x7d,0x9e, + 0xe4,0xa0,0x4e,0x8,0x49,0xad,0xe0,0x54,0xab,0x9a,0xc1,0x7c,0x2e,0x49,0xa3,0xf9, + 0xe0,0xb2,0x23,0x88,0x4b,0xf8,0xa4,0xe,0x6f,0x95,0x1d,0x88,0xa2,0x2b,0x88,0x58, + 0x12,0x2f,0x6e,0xad,0xf8,0x81,0x86,0xd4,0x60,0x2a,0x15,0x7a,0xf0,0x37,0x37,0x7e, + 0x7e,0x36,0x3,0x89,0x4c,0xf6,0x7e,0xa4,0x56,0x40,0x67,0xe9,0xdc,0x49,0x98,0xd2, + 0x45,0xb8,0xf2,0xc4,0x1c,0xb4,0xec,0x87,0x4c,0xb6,0xb8,0x3d,0x38,0x6d,0x8d,0x61, + 0x7a,0x8d,0x82,0x5a,0x8f,0xc9,0x9f,0xa8,0x78,0xb0,0x68,0xab,0x6e,0x26,0x45,0xf4, + 0x16,0xc8,0xec,0x73,0xc4,0x56,0x7d,0xef,0x62,0x59,0xbb,0x42,0xb0,0xaf,0xf1,0x3c, + 0xf,0x7c,0x76,0xdf,0x46,0xc9,0x5d,0x3a,0x91,0x62,0x27,0xfc,0x30,0x6d,0xaf,0x55, + 0x35,0xb5,0x55,0x9,0xd7,0xce,0xb,0xba,0xb,0xf4,0x58,0x25,0x20,0x35,0x33,0x78, + 0x2c,0x5,0x3c,0x8,0x4c,0x2b,0xbc,0x7f,0xfd,0xab,0xfb,0x7e,0x9a,0x80,0x52,0xd, + 0x6c,0x23,0xc2,0x23,0x2a,0x29,0x1a,0xdb,0x9e,0x49,0xae,0x18,0x89,0xde,0x11,0xb8, + 0xe7,0xac,0x98,0xc6,0x3c,0x22,0x2a,0x24,0x3c,0x50,0xbc,0x4c,0xd,0x41,0x68,0x7b, + 0x40,0xf4,0xff,0x47,0xfb,0x80,0xe,0x31,0xea,0x68,0x7a,0x98,0xe6,0x45,0xfd,0xc2, + 0x21,0xd5,0xec,0x6e,0x39,0x48,0x43,0x46,0x61,0x76,0x0,0x5e,0x1f,0x9c,0xa0,0x42, + 0x74,0x80,0xc3,0xbc,0x20,0x73,0x7f,0x10,0xc1,0x12,0x76,0xd0,0x3d,0xe,0xa5,0xc0, + 0x52,0xc7,0x92,0xd7,0x3,0xb2,0x58,0xd7,0x21,0xcb,0xdf,0xa8,0x4b,0x50,0x80,0x19, + 0x79,0xa1,0x27,0x5,0xc5,0xc7,0xf9,0x5f,0x34,0x1a,0xba,0x6f,0xde,0xba,0xc,0x9c, + 0x64,0xd6,0x73,0xd9,0xd3,0x58,0xb0,0x8c,0x47,0xb8,0x67,0xbb,0x3e,0xe9,0xa8,0xb2, + 0x2a,0x52,0x10,0x82,0xe7,0x7c,0xaa,0x9f,0x81,0x91,0x2d,0xa4,0xe2,0xc6,0x29,0x7e, + 0xf2,0xe8,0x2b,0xc2,0xf4,0xdd,0x3,0x6a,0x3e,0xe8,0x37,0xc0,0x85,0x2a,0x3e,0xa6, + 0x61,0x3c,0x60,0x19,0x5d,0x69,0xa6,0x17,0x7a,0xf3,0x43,0x6f,0x87,0xfc,0xa8,0xd0, + 0x23,0x77,0x39,0x7c,0xa5,0xe8,0x57,0xb,0xe7,0xe9,0xd7,0x98,0x4f,0x4d,0x6c,0x3e, + 0x29,0x93,0x16,0x60,0x14,0x2,0xa9,0xbf,0x1f,0x97,0xe0,0x76,0xf0,0x98,0x37,0xfb, + 0xc,0x58,0x96,0xaa,0x1b,0xe8,0x48,0x5e,0x2a,0xa0,0x20,0x3c,0x11,0x32,0x3a,0xef, + 0xed,0x1f,0x4,0xb1,0xfd,0x40,0xf4,0x4f,0x9c,0x64,0x9b,0x4b,0xba,0x6,0xa0,0x11, + 0x2c,0x53,0xd9,0x74,0x4b,0x60,0x7a,0x98,0x79,0xad,0xa4,0x70,0xa0,0x98,0x54,0x3a, + 0xca,0x5c,0x1d,0xea,0xe0,0x3e,0x4c,0xe8,0xfb,0xac,0x7,0x8e,0x89,0xaa,0xd8,0xc, + 0xd1,0xeb,0x31,0xb0,0x4d,0x14,0x4,0x9a,0xc6,0xc4,0xcc,0xf5,0x2a,0x11,0x60,0xa5, + 0x12,0x9e,0x85,0xe9,0xcc,0x1f,0x89,0xc9,0x13,0xa0,0x43,0x7d,0xdf,0x2c,0x7d,0x97, + 0x3d,0x6,0x96,0xd1,0xaf,0x9f,0x16,0x41,0x35,0xc8,0x93,0xeb,0x60,0x1f,0x64,0xf6, + 0x4b,0x2e,0xdc,0xa6,0x3,0xcf,0x43,0xad,0x1e,0x62,0xc9,0x79,0xc8,0xb3,0x69,0x7, + 0x98,0xde,0xd5,0xf7,0x58,0x99,0x1c,0xcc,0xee,0x7b,0xc7,0x16,0xfb,0xa1,0xb8,0x51, + 0x79,0x86,0x7a,0x58,0xef,0x54,0x1,0xf,0xc6,0x1c,0x40,0xec,0x94,0xb9,0xa5,0x76, + 0xba,0x4,0x1d,0x4f,0x2,0xfa,0x81,0xd9,0x30,0xd9,0x98,0x9,0xcc,0x8,0xa4,0x45, + 0xec,0x93,0x4e,0x9e,0xcd,0xf4,0x14,0xa9,0xa9,0x40,0x5d,0xb5,0xb4,0x10,0xd3,0x25, + 0x23,0x19,0x5d,0x8c,0x25,0xb1,0xb9,0x8e,0x17,0x6c,0x42,0x29,0x29,0x60,0xfa,0x98, + 0x6f,0xfb,0x5a,0x19,0xce,0x89,0x9e,0x5a,0x83,0xbd,0xa0,0x35,0x5,0xb5,0x10,0xe6, + 0x6b,0xdf,0xd3,0x8a,0x38,0x22,0x50,0xd7,0xcc,0x40,0x74,0x4,0xe9,0xac,0x5d,0xe0, + 0xfc,0x9a,0xac,0xa6,0x0,0x55,0x71,0x70,0xd9,0xdc,0xaa,0x48,0x68,0x14,0x48,0x60, + 0x6a,0x15,0xe6,0x60,0x70,0x58,0x3a,0x3c,0xa3,0x2e,0x1,0x3c,0x6,0x38,0x40,0x64, + 0xa9,0xd3,0x77,0xf3,0x9a,0x2a,0xd7,0x44,0x63,0x40,0xab,0x4b,0xd,0xe4,0xde,0xd7, + 0x90,0x37,0x14,0xe0,0xd6,0x1c,0x1,0xea,0x3d,0xa8,0xf3,0xf8,0xfd,0x53,0x37,0x77, + 0xf,0xb2,0xd0,0xbe,0xe3,0x6,0x1b,0x53,0x6d,0xe0,0x45,0x54,0x98,0xcb,0x65,0x2f, + 0x92,0x38,0x18,0x20,0xff,0xf6,0xd3,0xff,0xf8,0xc0,0xda,0x35,0x4,0xda,0x78,0xd, + 0x3a,0x82,0x60,0xbd,0x11,0x4,0x1d,0x83,0xa1,0x97,0xe2,0x13,0x4c,0x98,0x5,0x96, + 0x97,0xa9,0x6e,0x8,0x60,0x7f,0xf7,0xd7,0xf,0xac,0x27,0x65,0x3,0xb9,0x4a,0x8c, + 0xa6,0x20,0xd6,0xb9,0x73,0x3e,0xdb,0xa5,0xbd,0x82,0x33,0x9b,0x88,0xbf,0x84,0x80, + 0x23,0x4b,0x10,0x73,0xb5,0x27,0x44,0xfa,0x91,0xb4,0x6b,0xc8,0x58,0x22,0x98,0x51, + 0xa4,0xd6,0xa9,0x4f,0xcc,0x2f,0x8,0x41,0xd8,0x67,0x97,0xb4,0x81,0x60,0x87,0xdc, + 0xe1,0x92,0x84,0x6e,0xba,0x7f,0x73,0xca,0x4a,0x6b,0x2b,0x86,0x20,0x57,0x3b,0x21, + 0x5a,0xcb,0x7,0xb4,0xab,0xc7,0x5c,0x70,0x2a,0x57,0xa0,0x80,0xb,0xc4,0x59,0x9e, + 0x85,0xf9,0x8c,0x67,0xc5,0x86,0xd0,0x26,0x81,0x7,0x4d,0xfd,0x80,0x12,0x47,0x9a, + 0x11,0x28,0x98,0x6b,0x48,0x7f,0xc6,0xb6,0xcb,0xc4,0xaf,0x3b,0x72,0x8b,0x63,0xb, + 0xc0,0x19,0x44,0xc9,0xc6,0x11,0x2e,0xec,0x9,0xd6,0x27,0xef,0x7a,0x3,0x1e,0x2a, + 0x14,0xee,0x8a,0xf6,0x4a,0x4,0xb0,0x83,0x2d,0x77,0x3a,0xbd,0x7a,0xcb,0x19,0x74, + 0x18,0x84,0x52,0x7f,0x56,0x59,0xb6,0xa0,0x4a,0x23,0x11,0xc7,0x1,0x10,0xaa,0x80, + 0x20,0x26,0x9e,0x6,0xd8,0x42,0x75,0x65,0x66,0x5b,0xa5,0xef,0x15,0xdf,0xf,0xbc, + 0xd2,0x79,0x75,0xce,0x55,0x83,0xef,0x41,0xc9,0xf3,0x56,0xd8,0x8f,0x57,0x1e,0xf3, + 0x71,0xc5,0x39,0x10,0xb5,0xa3,0x9d,0x24,0x9d,0x11,0x6,0xa2,0x36,0xd0,0x55,0x68, + 0xf5,0x3,0x80,0x87,0xe3,0x1b,0x0,0xa2,0xb0,0xda,0x80,0x1d,0xfa,0xb4,0x10,0x94, + 0x6b,0x61,0x34,0x7d,0x71,0x55,0xa4,0x83,0xf2,0x8b,0x77,0x1e,0xb2,0x3b,0x77,0x77, + 0x48,0xf5,0x31,0xc,0xee,0x28,0xf1,0x6c,0xc9,0x57,0xb7,0xb0,0x68,0xe,0x95,0x5e, + 0xe7,0xc1,0x7d,0x48,0xcc,0xdd,0x38,0xef,0x52,0x1,0xc,0x1a,0xa6,0x71,0x42,0x10, + 0x62,0xec,0x87,0x39,0xb,0x61,0x45,0x76,0x41,0xcd,0xcc,0x46,0xf0,0x35,0xa9,0x28, + 0xe1,0x3d,0x91,0x34,0xc9,0xd4,0x24,0xb1,0x38,0x78,0x72,0x14,0x53,0xc8,0x50,0x93, + 0x54,0xe0,0xce,0x5a,0x1,0x8a,0x6a,0x1a,0xf5,0xbb,0xdc,0x4,0x51,0x40,0x18,0xf, + 0x33,0x2b,0x38,0x51,0xbc,0x25,0x93,0xcd,0x5d,0x2d,0x60,0x20,0x64,0xd,0xc,0x21, + 0x38,0xa4,0xce,0x87,0xf,0x3e,0xc4,0x98,0xa0,0xef,0x4f,0x15,0x65,0x50,0x3e,0xe0, + 0xee,0x26,0x92,0xf5,0x5,0x49,0x42,0x3d,0x96,0x2,0xed,0x1f,0x7c,0x54,0x4c,0xec, + 0xd2,0xc9,0x8c,0x4,0x19,0x31,0x3b,0x59,0xa8,0x3a,0x48,0x82,0x9b,0x92,0x2c,0x2e, + 0x6e,0x88,0xc2,0xb6,0x2f,0xaa,0x50,0x24,0x89,0x33,0x69,0x3e,0x82,0xb5,0x79,0x54, + 0x64,0xc5,0x9e,0xe4,0xc6,0xa4,0x7a,0x2d,0x8f,0xc,0x24,0x9,0x57,0x4a,0xcf,0x5f, + 0x83,0xaa,0xc8,0x17,0xf8,0xa4,0xfd,0x66,0x41,0x95,0x29,0xcd,0xb1,0x7c,0x54,0x54, + 0x2,0x15,0x53,0x64,0xe1,0x68,0xed,0x13,0x29,0xce,0x27,0xa9,0x79,0x6c,0x93,0x26, + 0x70,0x3,0x9b,0xda,0xab,0xfd,0x1f,0x62,0x10,0xea,0x46,0xf,0x16,0x84,0x41,0x3c, + 0x74,0x2e,0x6c,0x2e,0xfb,0x38,0x5,0xae,0xa0,0x7b,0x0,0xc8,0xf7,0xf4,0xd9,0x20, + 0x26,0x2a,0x81,0x4c,0x3a,0xa2,0x9,0xb0,0x91,0xdb,0x79,0x59,0xfe,0xd0,0x6c,0x32, + 0xfd,0xc,0x41,0x9c,0x38,0x94,0x8,0xe8,0xf0,0x78,0x8f,0x1c,0x53,0xd8,0xa9,0x3a, + 0xc5,0xe5,0x68,0x6,0x8f,0x5a,0x29,0x41,0xb3,0x5b,0x14,0xbc,0x8a,0xa9,0x71,0xc4, + 0x68,0x81,0x52,0xe6,0x2c,0xc3,0xaf,0x1e,0x80,0xe3,0xf3,0x2a,0x40,0x1a,0x95,0x60, + 0x40,0xfa,0x40,0xe5,0xb7,0xb3,0x84,0x5a,0x5d,0x43,0xff,0xf0,0xd3,0x87,0xff,0xc1, + 0x7,0x8f,0x73,0x46,0x2f,0x41,0xe,0x8a,0xa0,0x34,0x21,0x2,0x28,0x83,0x3e,0xbb, + 0xbb,0xab,0x70,0x71,0xc1,0xe6,0x8c,0x64,0x6a,0xd5,0x79,0x6f,0xc3,0x93,0x86,0x3d, + 0xfb,0xb5,0xef,0x20,0x24,0xef,0x65,0xda,0x46,0xa9,0x79,0x1a,0x3a,0x39,0xeb,0x78, + 0xd4,0xf1,0xb,0xe4,0xbc,0xe0,0x6e,0x8,0x40,0x15,0xec,0x28,0x1b,0xdc,0x52,0x67, + 0x8e,0xf1,0xe5,0xd6,0x50,0x51,0x4e,0x87,0x60,0x4,0x10,0xa9,0x6b,0x1,0xeb,0xf1, + 0xf,0x97,0x41,0x4d,0xf0,0xf7,0x68,0x5e,0xc7,0xce,0x2e,0x79,0x24,0xa,0xe0,0x51, + 0xe8,0xe,0xa2,0x5f,0x3f,0x18,0x22,0x3b,0x46,0xa1,0xdf,0xcb,0x1e,0xaf,0x20,0x6a, + 0x71,0x3,0x4f,0xc4,0xb8,0x9c,0x8a,0xb3,0xd8,0xdc,0x19,0xc8,0xc5,0xdd,0x84,0x58, + 0x98,0x8c,0xa8,0xec,0x13,0x0,0xe1,0x8,0x56,0x81,0x2e,0x25,0x75,0xf,0x42,0xd5, + 0x6e,0xd3,0x52,0x66,0xb4,0xaf,0xbd,0x32,0xce,0x7a,0xc8,0x6a,0x53,0x1a,0x1f,0xad, + 0xf2,0x80,0xf3,0xcc,0xa3,0xfd,0x5e,0xdc,0x23,0x69,0x8b,0x5b,0x7,0xe5,0x99,0x59, + 0x39,0x89,0xb4,0xf3,0x9,0x3,0xe2,0xd8,0x93,0x38,0x6b,0x8d,0x23,0x67,0x41,0x6b, + 0xa3,0x21,0x39,0xa5,0xbe,0xbe,0x37,0xd4,0x44,0x61,0x6f,0x73,0x77,0xea,0x96,0x41, + 0x24,0x37,0x7,0x62,0xd3,0x6d,0xf3,0xd4,0x85,0x87,0x71,0x3f,0xc7,0x6c,0x2a,0x13, + 0x1b,0xd0,0xf2,0xc8,0x66,0x3b,0xc2,0x14,0x41,0x80,0x32,0x63,0x3e,0x7b,0x47,0x88, + 0x49,0x59,0x7e,0x4f,0x4d,0xa6,0x82,0xa0,0x9e,0x99,0xc1,0x4e,0x86,0x8e,0x9f,0x5, + 0x8,0x36,0xf3,0xfd,0x7a,0xdb,0xf2,0xef,0xff,0xe6,0x81,0x35,0x7d,0x55,0x4e,0xeb, + 0xe1,0x73,0x34,0x8c,0xa4,0x60,0x5a,0xe5,0xc5,0x18,0x18,0x65,0xa,0x15,0x34,0x8f, + 0x24,0x7a,0xe3,0x52,0xe1,0x21,0xa6,0x90,0x7,0xfa,0xc3,0xa9,0x77,0x30,0xe,0x91, + 0x83,0x96,0xae,0xc8,0xf6,0xe1,0x13,0x2d,0x6b,0x46,0x9d,0x32,0xf,0xff,0x16,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xfb,0x44,0x4a,0xd0,0x66,0x12,0xb7,0x1e,0xf8, + 0xe1,0x2c,0xab,0x9a,0x6d,0x80,0x42,0x1a,0x9e,0xf5,0xcc,0x59,0xe5,0x29,0x51,0x1f, + 0xa6,0x36,0xe1,0x59,0xb8,0x67,0xc4,0xe6,0x22,0x46,0x35,0xa9,0x11,0xca,0x98,0x81, + 0x30,0xef,0x53,0x5a,0x9a,0x7,0x8d,0xf5,0xb1,0x7d,0xfc,0x60,0x8d,0xa4,0xb3,0x6a, + 0x0,0xd2,0x95,0xc9,0xf3,0x7c,0x25,0xcf,0xf5,0x4d,0x6,0xea,0x54,0x2,0xf6,0xf7, + 0xeb,0xe5,0xbf,0x93,0x24,0xa7,0xa0,0xb7,0xf7,0xda,0x41,0x47,0x17,0x9,0xb6,0x14, + 0xad,0x3f,0xda,0x69,0xd3,0xee,0x15,0x4,0x47,0x6b,0x88,0xa4,0x9c,0xa0,0xd5,0x36, + 0xd8,0x8c,0x44,0x9c,0xb,0x67,0x92,0x24,0xed,0x34,0xdf,0xd1,0xb0,0x3,0x67,0x5c, + 0xb9,0x5d,0xc3,0x72,0x7b,0x6f,0x45,0xec,0xaf,0x19,0xcd,0x83,0xc6,0xab,0xde,0x3b, + 0xbb,0xa5,0x7a,0xdc,0x36,0x2c,0xd1,0x9e,0xc9,0xf8,0xb6,0x8d,0xa9,0x34,0x8,0x6d, + 0x12,0x30,0x5a,0x1e,0x93,0x7c,0xb9,0xa1,0x1,0x9b,0x50,0xd0,0x23,0x69,0xa1,0xca, + 0xc9,0x89,0xd9,0xe5,0x34,0xe2,0xf0,0x19,0xcd,0x2f,0x36,0x2b,0x68,0x3f,0x4f,0x45, + 0x6c,0x41,0xa,0xdf,0xde,0x45,0x38,0x10,0xf5,0x73,0x99,0x2a,0xe5,0x11,0xbf,0x40, + 0x6b,0x8b,0xaa,0x14,0x9a,0x16,0x70,0xc7,0xc8,0xec,0x1f,0xfd,0xdc,0xb,0xff,0xdd, + 0xdf,0xff,0xdd,0x43,0xff,0xa9,0xe6,0x80,0xca,0xa7,0xf0,0x96,0x4,0x94,0x9d,0x7d, + 0x60,0xde,0x2b,0x47,0x99,0x7f,0x23,0x4a,0x59,0x93,0x7e,0x22,0x2c,0x94,0xab,0xa3, + 0xdd,0x4e,0xaf,0xd7,0xd9,0x6,0x2,0xef,0xa9,0x26,0x5a,0xe8,0x9d,0x28,0x1a,0x6e, + 0xdb,0xc4,0x8b,0x3,0x89,0xfb,0xa3,0xa3,0x2,0x2,0x99,0x82,0x48,0xd,0x56,0x5d, + 0x1f,0x25,0xf1,0x6a,0x47,0x87,0x94,0x67,0xce,0x76,0xb1,0xe0,0xc0,0xde,0xb4,0x15, + 0x50,0x33,0xa,0x6b,0xd8,0x90,0x7e,0xcd,0x27,0xea,0xcd,0xf0,0xa0,0x8b,0x3f,0x2, + 0x41,0x4f,0x44,0xf6,0x31,0xdd,0xb8,0x58,0xef,0x83,0x75,0xc2,0xd,0xf8,0x20,0x8c, + 0x90,0x61,0xb1,0xa2,0x8b,0x38,0xfd,0xa,0x3c,0x79,0x8b,0x85,0x9f,0x82,0x3d,0xd, + 0x38,0x3c,0x33,0x22,0xe0,0x6f,0xca,0x92,0x3c,0xc8,0x9c,0x4b,0x81,0x49,0x3e,0x29, + 0xe,0x49,0x14,0x4e,0x4a,0x55,0xba,0x85,0x71,0x56,0x44,0xa4,0xcf,0x48,0x12,0xc8, + 0x5d,0x5d,0xa5,0x47,0x5,0x94,0x1,0xe2,0xe2,0x88,0x63,0xf3,0x20,0x54,0xe3,0x18, + 0xa8,0x3e,0xf9,0x42,0x63,0x6,0x99,0x58,0x7a,0x3d,0x98,0x53,0x68,0xa,0x49,0x86, + 0x36,0xbe,0x7d,0xcc,0xa7,0x29,0xff,0x43,0x0,0x3f,0xb1,0xfe,0xfc,0x30,0x98,0x71, + 0x8b,0xfe,0xea,0x49,0x44,0x7f,0x96,0xcb,0x94,0x9,0xfd,0xa1,0x78,0x32,0x9e,0x41, + 0x60,0xae,0x7b,0xd8,0x16,0x46,0x1d,0xb,0xb,0x57,0xdb,0x9c,0xb6,0x92,0xcc,0x25, + 0x4b,0x10,0x12,0x10,0xae,0x7f,0x27,0xfe,0x79,0xa4,0xa7,0x10,0xa7,0xbf,0x83,0x6e, + 0xa3,0x91,0x4c,0x18,0x20,0x7a,0x43,0xbd,0x7a,0x18,0xe5,0xf4,0x4,0x77,0xb4,0x19, + 0x1d,0xd9,0xbc,0xa5,0xbd,0xdd,0x3f,0xfc,0xf4,0xf2,0x6a,0xb2,0xf1,0x18,0xcb,0xe0, + 0xed,0xff,0x74,0xf4,0xcb,0x5e,0x2,0x4c,0xdb,0xea,0x3f,0x83,0x6a,0xd1,0x0,0x88, + 0x92,0x32,0x4e,0x33,0xd4,0x7e,0x3b,0xca,0x88,0x62,0xd,0x50,0xd4,0xc1,0x2b,0xc5, + 0x85,0x9b,0xd8,0xb,0x62,0xaf,0x8f,0x9d,0xf3,0xec,0x50,0x6,0x9,0xc6,0xd8,0x1b, + 0x86,0xa6,0xcb,0x66,0x74,0xb5,0x6b,0x6f,0x8d,0xd4,0x3a,0xf0,0x4,0xd7,0x1a,0x2d, + 0xf0,0xef,0x43,0x5e,0xab,0xfc,0x26,0xf8,0x56,0xf1,0x6f,0x80,0xd9,0x36,0x66,0xc6, + 0x40,0x41,0xff,0x1c,0x47,0xe0,0xb3,0x33,0xc8,0x5a,0xf1,0x4,0x28,0x10,0x14,0xa3, + 0x1b,0xb,0x2e,0xd6,0xe0,0x1,0xef,0x2c,0x2,0xa2,0x7f,0xc1,0x87,0xd6,0x7d,0x17, + 0x94,0xf4,0xa2,0xa3,0x2d,0x1b,0x53,0xd3,0x74,0xde,0xd8,0x6c,0x34,0xc5,0xf5,0x60, + 0xa7,0xe2,0x35,0x62,0xac,0x27,0x1c,0x88,0x8b,0xf4,0x34,0x57,0xce,0x45,0x56,0xb3, + 0x7,0xa8,0x75,0x8f,0xb1,0x5b,0xdb,0xca,0x5,0xd,0xa4,0xe5,0x0,0x3d,0x4,0x90, + 0x20,0x69,0x1f,0xeb,0x29,0x90,0x66,0xdb,0x74,0x87,0xd6,0xf7,0x92,0x7d,0x4a,0x64, + 0xc3,0x3d,0x3b,0xea,0xac,0x49,0xc,0x3b,0x54,0xce,0x76,0xc0,0xc5,0x3b,0xe9,0x2c, + 0x83,0x7b,0xc3,0x3,0xdb,0xd1,0xe5,0x55,0x26,0x8,0xe1,0x46,0xcd,0xac,0xd0,0x8c, + 0x50,0x47,0x4c,0x4c,0x65,0x90,0xdc,0xc7,0x50,0x4e,0x14,0x1d,0x37,0xa5,0xee,0x9f, + 0x5b,0x1,0xe2,0xb1,0x41,0x73,0x65,0x95,0xa5,0x2f,0x0,0x86,0x2f,0xb2,0x52,0x52, + 0xcd,0x64,0x9c,0x47,0x4c,0xe7,0x81,0x8a,0xea,0x18,0x13,0x93,0x74,0xc4,0xb8,0x2e, + 0x14,0x7e,0x68,0x92,0x3a,0xa0,0xf7,0xcf,0xe6,0x63,0x41,0xb,0x78,0x8a,0x45,0xec, + 0x94,0x46,0xc6,0x6,0xc5,0xf1,0xb0,0x5b,0xf0,0x96,0x8,0x37,0xd1,0x61,0xd1,0xf5, + 0x6b,0xca,0x43,0x8f,0x88,0x40,0x9f,0x60,0xf1,0xb9,0xd,0x16,0x47,0xb5,0x9e,0x44, + 0x50,0xb4,0xbd,0xee,0x82,0xf9,0x8e,0xb3,0x75,0xed,0x21,0x6b,0x55,0xe4,0x4,0xd9, + 0xcf,0x3e,0x8f,0xe0,0xd1,0x6c,0xb1,0xe4,0x84,0xa6,0x9e,0xb4,0x41,0xd3,0x4b,0xdc, + 0xd9,0x4c,0xdc,0xd4,0x10,0x38,0xf6,0xa3,0xaa,0x74,0xb9,0xf3,0x3e,0xf3,0xc8,0x5, + 0xb9,0xea,0x90,0x9e,0x70,0xb4,0xe7,0x92,0x81,0x4f,0x3d,0xc9,0xc1,0x7c,0x78,0x36, + 0x99,0x41,0x64,0xd,0x58,0x4e,0x3c,0xc2,0xb3,0xeb,0x89,0x80,0xab,0xcc,0x2b,0x3f, + 0x13,0xd1,0xca,0xe6,0x83,0xdd,0x54,0x45,0x6c,0xa,0x46,0x4e,0x92,0x3,0x8,0x5d, + 0x17,0x74,0xfd,0x7e,0x49,0x3,0x3c,0x9a,0xe8,0x98,0xf9,0x84,0x26,0x2a,0x6a,0xb3, + 0x86,0x9,0xe7,0x3e,0x6b,0x53,0x77,0x51,0x8e,0x82,0xd0,0xda,0x1e,0x6d,0x76,0x77, + 0x58,0x29,0xf4,0x76,0xdd,0x3a,0x9b,0xad,0xb1,0xc6,0xe1,0x59,0xcf,0xb8,0x2c,0x98, + 0x50,0xcc,0xa,0xcd,0x36,0xb9,0x95,0x4f,0x18,0xa,0x24,0x7d,0x6f,0xea,0x68,0xf9, + 0x84,0xd6,0xd4,0x27,0xa7,0xb4,0x39,0x5a,0x38,0x74,0xdf,0xbc,0x5e,0x17,0x29,0xd0, + 0x44,0x1e,0x39,0x71,0x74,0xea,0x17,0x75,0x3a,0x40,0x77,0x4a,0xb0,0x53,0x22,0xd3, + 0x6,0x9f,0x1e,0xcb,0x5b,0xed,0x16,0xa1,0x20,0x98,0x4d,0xec,0x32,0x5d,0x3d,0x20, + 0xb5,0xe9,0x14,0xa8,0x8a,0x1c,0xf,0xa5,0xa0,0x65,0xb5,0x4,0x70,0x6b,0x78,0x8, + 0x46,0xee,0x93,0xc5,0xa2,0x47,0xdd,0xbf,0x19,0x1a,0x19,0x85,0x44,0x62,0x1a,0x80, + 0xb4,0xa0,0x8d,0xf2,0x8a,0xb3,0x54,0x6c,0x8b,0xb5,0xb1,0xfa,0x72,0x63,0x3d,0x55, + 0x27,0xf6,0x40,0x6b,0xe9,0x76,0x68,0xb,0xc5,0x20,0x61,0x34,0xf4,0x46,0x55,0x19, + 0x2b,0xd6,0xe5,0x80,0xa9,0x6b,0xbf,0x40,0xfd,0x24,0xb5,0xb0,0xe9,0x53,0xdb,0x42, + 0x7a,0x5,0x4,0x46,0xc0,0x0,0x85,0x81,0xa,0xf2,0xa,0x8e,0x24,0x9,0xd0,0x13, + 0x85,0x3a,0xc0,0xc0,0x18,0x29,0x17,0x84,0x60,0x2,0xe9,0x60,0xee,0x2,0xe1,0x35, + 0x79,0xec,0x31,0x48,0x3b,0x89,0x8a,0x70,0x18,0xb4,0xb5,0xd1,0x99,0x2a,0xda,0x52, + 0xe5,0xfe,0xbe,0xf5,0xa4,0x61,0x8,0x93,0x7b,0x17,0xb9,0x45,0xcf,0xf8,0xd,0xd, + 0x1f,0x52,0xf1,0x12,0x64,0x10,0x27,0xce,0x2f,0x30,0xaf,0x6a,0x14,0x95,0xaa,0x51, + 0x8b,0x1b,0xa7,0xc4,0xba,0xae,0x7f,0x36,0xe3,0xf0,0xc9,0x5c,0x58,0x5a,0x43,0x2e, + 0xe0,0xd5,0xa8,0xa5,0xcf,0xb6,0xe1,0x48,0x88,0xfa,0xb0,0xeb,0x41,0x40,0xf2,0x30, + 0xd0,0x27,0x31,0xb7,0x68,0xf7,0x1c,0xcb,0x3a,0x6,0xe5,0xb5,0xdf,0x3b,0xc9,0xcf, + 0x51,0xfc,0xbe,0x63,0xac,0x53,0x7f,0x3,0x55,0x98,0xe2,0x56,0x6c,0x74,0xea,0x3, + 0x8b,0xf0,0xc6,0xee,0xae,0xfa,0x9e,0xb,0xad,0xd,0x1,0x34,0xe7,0x6c,0x43,0xa, + 0xe1,0x3d,0xf6,0x76,0x9,0xdb,0xef,0xa5,0xf1,0x46,0x16,0x78,0x1,0x45,0x24,0xf, + 0x8d,0x5a,0x31,0x98,0x89,0x22,0x25,0x51,0x9a,0xd6,0xc7,0x2c,0x2d,0x66,0xaf,0x48, + 0xc6,0x2c,0x38,0x60,0x10,0x45,0xde,0xdb,0xe4,0xe1,0x1d,0x49,0xbd,0x9e,0x44,0x17, + 0x4c,0x54,0x9c,0x34,0x2f,0xd1,0x56,0xb3,0x4d,0xa4,0x49,0x33,0x4c,0x69,0xb4,0x8a, + 0x98,0x22,0x12,0x7b,0x33,0x1e,0x67,0xe1,0x4d,0x1,0xce,0x4d,0xb2,0xc9,0x9c,0xe8, + 0x79,0x0,0xfa,0x50,0xfb,0x4d,0x78,0xcf,0xc1,0x6b,0x5d,0x12,0x47,0xae,0xe0,0x3d, + 0x89,0x31,0x52,0x2,0x1,0x91,0x47,0xec,0x1,0xa7,0x7d,0xaf,0x12,0x20,0x59,0x30, + 0x52,0x7d,0x34,0xc3,0x89,0xe1,0x34,0xdd,0x3,0x52,0x4f,0xd1,0x6a,0x71,0x39,0xa8, + 0x32,0x6a,0x58,0xcd,0xf3,0x81,0xf1,0x7c,0xf6,0xf6,0x73,0x10,0x90,0x90,0xa4,0xc5, + 0x67,0x1c,0xca,0xbd,0xa8,0xb6,0xcd,0x87,0x73,0x85,0x7b,0xd,0x9e,0x8e,0x1,0xe3, + 0xdf,0xd3,0xc5,0x6d,0x7f,0x1e,0xc5,0xb,0xd3,0xfa,0x3b,0xf9,0xb2,0xd4,0xb5,0xb6, + 0xb9,0x3b,0x8a,0x61,0x17,0xad,0xe1,0x13,0x63,0x7f,0x29,0xef,0x9,0x38,0x82,0x4e, + 0x2c,0x45,0xb1,0x1e,0x58,0x4b,0x74,0x19,0x19,0x1a,0x70,0x60,0x24,0x81,0x66,0xd7, + 0x5c,0xbe,0x7b,0x72,0x44,0x46,0x50,0x81,0xe,0xb2,0x94,0xed,0xf0,0x2b,0x31,0x8, + 0xb6,0x9e,0x50,0xe1,0xa3,0xc3,0x32,0x25,0xad,0xc6,0xfb,0x1e,0xa1,0x6b,0x4,0xa3, + 0xb6,0x68,0xe9,0x43,0xe5,0xfa,0x9b,0x5,0x70,0x77,0x1f,0x15,0x68,0x17,0x71,0x18, + 0x5d,0x41,0xa6,0x42,0xb6,0x84,0x40,0x47,0x38,0x66,0xd8,0x1c,0xa9,0xe2,0x6d,0x95, + 0x38,0xe1,0x3a,0x6a,0xc0,0x6,0x3c,0x2,0x61,0x46,0x4f,0xa9,0xd3,0xce,0xaa,0x7c, + 0xd0,0xc0,0x66,0xd,0x4d,0x4,0xc,0xf1,0x8d,0xda,0xb0,0xaa,0xbb,0xaa,0xb0,0x55, + 0x9b,0x95,0x52,0x30,0xd4,0x7,0x89,0xad,0x71,0x82,0x51,0x20,0x7,0x9d,0x80,0x3a, + 0xff,0x8c,0xee,0x4f,0xa1,0xef,0x42,0xd1,0x28,0x5,0x13,0x73,0x42,0xf6,0x8e,0x39, + 0x77,0xef,0x4,0xb9,0x20,0x51,0x3b,0xfe,0x82,0x39,0x96,0xa2,0xe5,0x0,0xf7,0xad, + 0x6a,0xd8,0x60,0x82,0x77,0xf5,0x21,0x1f,0x35,0x0,0x8f,0xad,0xdd,0xea,0x59,0x91, + 0xa1,0x4d,0x7,0x61,0xda,0x85,0xb1,0xc1,0x78,0xa1,0xab,0xe0,0x89,0xa9,0x76,0x49, + 0x4d,0x0,0x8d,0x73,0x37,0xb8,0xa8,0x9e,0xc9,0xc7,0xa,0x2c,0xb9,0xf4,0xd6,0xb5, + 0x7f,0x92,0x41,0x44,0xe2,0xf7,0xed,0x1a,0xe4,0x84,0x10,0x1f,0xfd,0x7f,0x6d,0x62, + 0xf7,0x16,0xe6,0x6e,0x19,0x69,0x65,0x53,0x3a,0xaa,0x99,0xae,0x79,0x91,0xe4,0x84, + 0x25,0xa1,0x9a,0x88,0xc,0xd8,0xd1,0x41,0xd6,0x29,0x11,0xd3,0xd1,0x1,0xcd,0x38, + 0x1a,0xa0,0x51,0x67,0xf2,0x10,0x91,0xd,0x67,0x9f,0x5f,0x44,0xcf,0x68,0xef,0xf4, + 0x2e,0x2e,0xd8,0xbb,0xe1,0x0,0xb,0x5a,0xa4,0xbe,0xd3,0x84,0x8a,0x30,0x21,0x78, + 0x77,0xb1,0xff,0x89,0xf5,0xeb,0xa4,0x19,0x18,0x86,0x9f,0x91,0x47,0x19,0x1b,0xe3, + 0xec,0x52,0x9d,0x67,0xb8,0x6a,0x76,0x8b,0x38,0x49,0x4a,0xd4,0xb1,0x91,0xa8,0x81, + 0x13,0x6e,0x53,0xaa,0xd4,0x90,0xad,0xc5,0x4c,0x63,0xde,0x66,0x9d,0xe,0x64,0xb3, + 0x3d,0x4b,0xe4,0x7d,0x4e,0x62,0x20,0xcc,0x81,0xaa,0xc9,0xda,0x5a,0xe4,0x6e,0xa6, + 0x42,0xa,0xb5,0xf5,0x8d,0xb4,0x58,0xb,0x79,0x7c,0x20,0xd8,0x7c,0x34,0x64,0x31, + 0xcd,0x2,0xb,0x74,0x4,0x59,0xc,0xa9,0x3f,0x8c,0xe8,0xae,0xe0,0xed,0xc,0xaf, + 0x71,0x77,0x8e,0x9f,0x2c,0x9d,0xb0,0x4b,0x69,0xd3,0xe6,0xbe,0x97,0x9d,0x80,0x6d, + 0xd5,0x42,0x7,0xee,0xbd,0x7e,0xc1,0x48,0x48,0xf6,0x1b,0xb3,0xf5,0x96,0x59,0x31, + 0xc0,0x7d,0xf3,0x1a,0x90,0xbc,0x83,0xd,0xd1,0xb0,0xbd,0x1e,0xd6,0x64,0x40,0xdf, + 0xd7,0x8e,0x23,0xb5,0xde,0xc1,0x6,0x5f,0x3d,0x52,0x16,0x6,0x8d,0x34,0x6c,0x82, + 0xd3,0xc8,0x63,0xe0,0x8c,0xc1,0x23,0x3b,0x9f,0x61,0xb2,0xb9,0x1c,0xe3,0x43,0x89, + 0xf9,0x95,0xaa,0x7a,0xb0,0xdf,0x82,0x32,0x1,0x88,0x9a,0x99,0x6d,0x9e,0xbd,0x34, + 0x35,0xb8,0xc0,0x9c,0x24,0x85,0x3b,0x38,0xb4,0x57,0xe8,0x5,0x5,0x9b,0x6d,0xe3, + 0xca,0x14,0xd0,0x53,0xf3,0x1c,0x41,0xfb,0xd5,0x86,0x4b,0x1,0xa3,0xbc,0xd5,0x51, + 0x6d,0xc,0x30,0xca,0x90,0xd9,0x25,0x2d,0x63,0xd0,0x6c,0xda,0x69,0x9d,0x55,0x60, + 0x47,0xeb,0x4c,0x74,0xe4,0x18,0x86,0xf1,0x3c,0x5,0xf4,0x51,0x80,0x21,0x59,0x79, + 0x1,0x85,0x4e,0xa9,0x13,0x50,0xea,0xe4,0x8c,0xdd,0xa2,0x74,0xcb,0x31,0x43,0xa7, + 0x96,0x7b,0xe9,0xd0,0x36,0x9,0x98,0x6c,0x4a,0x49,0x63,0x40,0x87,0x9f,0xa0,0xfa, + 0xb6,0x95,0xc6,0x5e,0xd7,0x2c,0x6f,0x74,0xef,0x8a,0xe3,0x7b,0x86,0xdb,0x3a,0x38, + 0x27,0xfa,0xd8,0xa2,0xe6,0x50,0x54,0x43,0x96,0xf6,0x76,0xfb,0xa8,0x84,0x4c,0xd8, + 0xf7,0x31,0x94,0x3b,0xd3,0x5e,0x19,0xab,0xe9,0x7d,0xe3,0x13,0x4b,0xa9,0x7,0xf3, + 0xb1,0x73,0x32,0xc1,0x2a,0x14,0x28,0x41,0x61,0xae,0x39,0x78,0x8e,0xae,0xa9,0x36, + 0xc7,0xd2,0x7e,0x34,0xb2,0xd1,0xb5,0xa6,0xe5,0xde,0x16,0xed,0xa6,0xd5,0x73,0x6c, + 0x7c,0xba,0xb7,0x1d,0x1c,0xe5,0x47,0x27,0x5c,0xe3,0x24,0x7f,0xea,0xa1,0x46,0xb4, + 0xe8,0xeb,0xa2,0xc8,0x4f,0x46,0xb1,0x4e,0x6,0x2f,0xb4,0xae,0x93,0x7e,0xb8,0x25, + 0xca,0xbf,0xce,0xf7,0x19,0xd1,0x16,0xab,0xc1,0x1,0x7d,0x82,0x28,0x81,0xf,0xa0, + 0x8e,0xcb,0x1c,0x71,0x38,0xfd,0x40,0x66,0x21,0x98,0x79,0x3b,0xbb,0x22,0xf9,0xa4, + 0x55,0xce,0x1a,0xf4,0x3e,0x3,0x25,0xea,0xc8,0x1d,0xd3,0xd9,0x55,0x2c,0x9f,0xf, + 0xb9,0x5e,0x23,0xd1,0x53,0xe0,0x39,0x54,0xa,0xbe,0x46,0xae,0x17,0x13,0xde,0xb, + 0x72,0xce,0x62,0x33,0x93,0x1d,0x9e,0x9,0x4d,0x3e,0x33,0x80,0x1f,0x59,0x48,0xc8, + 0x54,0x60,0x5,0x92,0xb8,0x70,0x8b,0xd1,0x46,0xcf,0x76,0x37,0x7e,0x18,0x94,0x9b, + 0xf6,0x45,0x21,0xe2,0x4,0xe0,0x8e,0xb0,0x8,0xe3,0xd,0x91,0xec,0xce,0xe5,0xee, + 0x7d,0xfc,0xbd,0x12,0xea,0x48,0x3a,0xfe,0xb2,0x90,0x32,0xa8,0x7d,0xa7,0x13,0x81, + 0x38,0xc3,0xb3,0xb0,0x62,0x83,0x77,0xe3,0x41,0xa5,0x68,0x7c,0x77,0xef,0x9c,0xd9, + 0xba,0xf3,0x71,0x62,0xdf,0xcd,0x30,0xb3,0xad,0x78,0x3d,0xcf,0x6a,0x41,0x54,0x36, + 0x27,0x99,0xf2,0x7a,0x20,0x94,0xda,0xfa,0xdd,0xeb,0xb7,0x32,0xc2,0x45,0x3b,0xb8, + 0xdc,0x4,0x7d,0xed,0x99,0xf2,0x8,0x12,0x77,0x5,0x97,0x8a,0xd,0x91,0x14,0x9c, + 0x88,0x0,0x94,0x1a,0x48,0x6,0xe2,0xd9,0xc8,0xb7,0xb0,0x60,0x78,0x11,0x95,0xe1, + 0xab,0x28,0xe,0x66,0x2e,0x53,0x75,0x5e,0xe,0x7b,0x5,0xec,0x48,0x48,0xcf,0xa0, + 0x68,0xa8,0xb3,0xb5,0x5e,0x81,0xe,0x37,0xf0,0x31,0x33,0xf2,0x96,0x96,0xf5,0x82, + 0xb9,0xf7,0x7a,0x7,0x21,0x8b,0xf8,0xc3,0xfb,0x32,0xd8,0xaa,0x93,0x75,0x23,0x26, + 0xec,0xc,0xc3,0x91,0x96,0xa0,0x47,0x1b,0x64,0x9c,0x0,0xe1,0x41,0x42,0xf5,0xc1, + 0xed,0x5,0x14,0x42,0xf7,0xf4,0x44,0xb3,0xa0,0x2b,0xe7,0xf6,0xb9,0x3a,0x4b,0xd2, + 0x62,0xf,0x5d,0xc3,0x84,0xa5,0x1e,0x2b,0x6d,0xed,0x8e,0xf9,0xb,0x8,0xf,0x86, + 0xa1,0xbd,0xbf,0x3f,0x5d,0xe7,0x13,0x84,0x11,0xdf,0xa5,0x16,0x30,0xea,0xd,0xc0, + 0x15,0x7a,0xb4,0x5d,0x2d,0x6,0xc2,0x0,0xd3,0xd8,0x74,0xa8,0x0,0xdb,0xb6,0xb9, + 0x77,0x3d,0x1f,0xc6,0x19,0x6f,0x7b,0xe6,0xb7,0x35,0xc1,0x24,0xdb,0xbc,0x65,0xc3, + 0x3b,0xdb,0x76,0xef,0xf1,0x6e,0x6d,0x80,0xd6,0x9f,0xe7,0xfe,0x53,0xd2,0x1d,0x68, + 0xa3,0x89,0x26,0xd6,0xb4,0x27,0x7e,0x75,0xdb,0x58,0xeb,0x6c,0x6c,0x9b,0x58,0x1a, + 0x72,0xdf,0x1d,0x1e,0x83,0xb4,0xe2,0xaa,0x2c,0xc6,0x10,0x57,0x69,0x71,0x41,0xb9, + 0x9b,0x65,0xa1,0x36,0x8a,0xa5,0x5d,0xd9,0x93,0x35,0x56,0x48,0xa2,0x1a,0xd6,0x66, + 0xe8,0xf5,0x3f,0xff,0xe7,0xff,0xf1,0xe0,0x6a,0xd4,0x46,0x90,0x16,0x90,0xb8,0x9d, + 0x99,0x98,0xac,0x73,0x30,0xf0,0xf4,0x3a,0x48,0x47,0x93,0x55,0xcd,0x52,0x8d,0x2a, + 0x65,0x8f,0xf2,0x31,0xe3,0x42,0xca,0x75,0x27,0xd3,0x4,0xd4,0xbb,0x7d,0x3a,0xc6, + 0xe0,0x76,0xaf,0xf0,0xaa,0xe5,0x8c,0xa,0xc2,0x22,0xea,0x13,0x1c,0x93,0x11,0xd5, + 0xfa,0xe,0x6,0x3,0x16,0x69,0x5d,0x13,0x91,0x5c,0xc4,0x60,0xab,0xa6,0xca,0xb0, + 0x43,0x68,0xe8,0x3,0x7e,0xd0,0x11,0x1d,0x1f,0x87,0xd4,0x98,0x18,0x58,0x23,0xcc, + 0x5a,0xe2,0xbf,0xb9,0x1f,0x50,0xf0,0x9a,0x91,0xdf,0xa3,0x2a,0x8b,0x2b,0x6e,0x71, + 0xfa,0xfa,0xfc,0x5a,0x99,0x1c,0x21,0x7e,0x32,0xcf,0xc4,0xf9,0x66,0xb1,0xac,0x64, + 0xc1,0x40,0x9,0x8c,0x98,0xbf,0xd7,0x3e,0x10,0xd1,0x74,0xa9,0xe1,0x86,0x90,0x48, + 0xb5,0xe9,0x28,0x43,0x39,0xbd,0x10,0x1e,0xbc,0x5,0xa1,0x16,0x1c,0xa4,0x39,0x8a, + 0x90,0xe7,0x40,0x62,0x4e,0x41,0x68,0x52,0xd0,0xa2,0x72,0xd7,0x58,0xe4,0xed,0x48, + 0xed,0xed,0xc0,0x1a,0xc8,0xf7,0xf2,0x7a,0xaf,0x5a,0x36,0xf3,0xbd,0xea,0xec,0x65, + 0x5b,0x8d,0xd2,0x3e,0x46,0xed,0xdb,0x48,0x2a,0xba,0xc6,0x5a,0x87,0xa8,0x80,0xcb, + 0x8e,0x51,0x98,0x33,0x0,0x4e,0xe9,0x51,0xbb,0x78,0x47,0x41,0xf,0x2a,0xc3,0x9f, + 0x4,0xc3,0xf7,0xcb,0x46,0xb7,0xc2,0x2b,0x6a,0x9f,0x26,0x1e,0x30,0x39,0x2e,0x8b, + 0x9c,0x6d,0x1e,0xf6,0x1e,0x17,0x86,0x28,0x7b,0xdb,0x4c,0xe6,0x8d,0x4c,0xff,0x6a, + 0xdc,0xef,0xad,0x2a,0x9f,0xbb,0x52,0xc0,0xb8,0xb,0x50,0xdc,0xf7,0xca,0xb1,0xd4, + 0x60,0xd8,0x15,0xb9,0x84,0x6,0xd5,0x43,0xf2,0x68,0xfe,0x97,0x1d,0x71,0x50,0xbc, + 0xab,0x94,0xb7,0x8e,0x49,0xef,0x7e,0xd0,0x45,0xb3,0xbe,0xbe,0x5b,0x98,0x23,0x10, + 0xee,0x87,0x5a,0xba,0x74,0x6f,0xc7,0x7a,0xad,0x9d,0x87,0xaa,0xbf,0x32,0xea,0xf8, + 0xb6,0x6e,0x4b,0x75,0x3a,0xab,0x13,0x6c,0x10,0x7c,0xdd,0x50,0x8,0x6a,0x7,0x72, + 0x6b,0xf1,0x86,0x9,0x2c,0x84,0x50,0x37,0x41,0xa6,0x33,0x87,0xad,0xf7,0xac,0x7c, + 0xd8,0xa0,0xee,0x23,0x10,0xc8,0xc,0x1d,0x1,0x77,0x45,0xe3,0x41,0x57,0x2a,0xd8, + 0xd6,0x7,0x27,0x3b,0xcb,0x8d,0x5c,0xce,0xbd,0xe,0xce,0xf7,0x8e,0x94,0x95,0x13, + 0x15,0x11,0xe1,0xc5,0x5b,0x90,0xb6,0x21,0xa0,0x56,0x61,0x1d,0x3b,0x6f,0xb0,0xe5, + 0xa,0x38,0x51,0x6a,0x65,0x5f,0x48,0xa8,0xb9,0xb6,0x3b,0xd0,0x92,0x43,0xe8,0xd4, + 0x39,0x28,0x52,0x4e,0x4c,0x34,0xc7,0x1d,0x2a,0xa3,0xc8,0xe3,0xe8,0xc6,0x22,0x57, + 0x49,0x84,0x2b,0x78,0x92,0x71,0x23,0xa6,0x61,0x48,0x3c,0xdc,0x7f,0x11,0xcd,0xa2, + 0xf7,0x3a,0x99,0xe,0x66,0x87,0xf0,0x31,0x1b,0x90,0x89,0x45,0x43,0x46,0xf6,0x9b, + 0x11,0x7d,0x29,0x18,0x6,0x31,0x90,0xa4,0x6c,0x84,0x59,0x5f,0xdc,0x95,0x9a,0x96, + 0x76,0x72,0xe0,0x6a,0x4f,0xee,0x70,0x61,0xce,0xef,0x44,0x9e,0x98,0x0,0x27,0x13, + 0x5a,0xdc,0x4,0x8e,0x9,0x95,0xda,0x81,0x43,0xbc,0x74,0xa3,0xf2,0x58,0x9f,0xa5, + 0x39,0x32,0xad,0xe,0x71,0x35,0x44,0x66,0xa3,0xbe,0x56,0x5a,0x72,0x36,0xd0,0x95, + 0x4e,0xf4,0x10,0xa6,0xca,0x79,0x44,0xa9,0x49,0xab,0x11,0x73,0x66,0xaa,0x5,0x7a, + 0xdd,0x4,0x94,0x16,0x79,0xdf,0x16,0x68,0x8b,0xd1,0xfd,0x4c,0xc7,0x8,0xb9,0x43, + 0xa1,0xcc,0x58,0x88,0xa1,0x49,0x4c,0x5f,0x9c,0xa8,0x16,0xc2,0x36,0x40,0xee,0x7, + 0x38,0x55,0xdb,0x4a,0xab,0x18,0xd5,0xb,0xd9,0x31,0x57,0x84,0xc,0x24,0x52,0xf9, + 0x30,0xf5,0xd6,0xe0,0xd5,0x3,0x7d,0xf7,0xe0,0x44,0x2b,0xdc,0x7d,0xa0,0x88,0xb1, + 0x77,0x39,0x83,0x32,0x76,0xa6,0x8,0xc3,0x93,0x76,0x37,0x68,0x74,0x31,0xc0,0x5f, + 0x6,0x32,0x5d,0xb1,0x13,0xe6,0x1b,0xdc,0xb0,0x79,0x87,0x2f,0xb4,0x71,0x61,0x31, + 0xb8,0x97,0x7d,0x67,0x6e,0xee,0xa8,0x8d,0xc3,0xd2,0xad,0x5f,0xdd,0xca,0x89,0xb2, + 0x23,0xde,0x2b,0xb0,0xae,0xc6,0x86,0xe,0xea,0xda,0xab,0x95,0xd1,0x65,0x10,0x21, + 0xa8,0x71,0x34,0x93,0x2d,0x66,0xbf,0x6d,0x35,0xff,0xde,0x4f,0xf0,0x3e,0x28,0x62, + 0xb,0xf7,0x66,0x77,0x59,0x6b,0x26,0x2f,0x4,0xc8,0xdb,0x83,0x28,0x3c,0xa0,0x87, + 0x19,0xbb,0xe3,0x41,0xe2,0xb5,0x1f,0x74,0xdb,0xb0,0x60,0xb7,0x38,0xd0,0x2,0xcc, + 0x4f,0xc,0x8a,0x80,0x80,0x58,0xb,0x11,0xd8,0x76,0x40,0x81,0x37,0xc4,0x7d,0xd, + 0x9a,0x3e,0x1a,0x9a,0xf5,0x7e,0x95,0xbd,0x2a,0x64,0x1d,0x83,0x62,0x7b,0x49,0xb9, + 0x57,0xb2,0x1d,0xb8,0x35,0xd2,0x52,0x6f,0x65,0xf,0xb9,0xd4,0x55,0x1a,0x1b,0x1b, + 0xe2,0x39,0x6,0xde,0xc0,0xfb,0xda,0x63,0x8d,0x3,0x5a,0x93,0xa5,0x1f,0x76,0x95, + 0xb9,0x5c,0x58,0xe0,0xa6,0x12,0xcc,0x41,0x4d,0x38,0x42,0xd1,0xd3,0xd8,0xa8,0x60, + 0x20,0x43,0xac,0x25,0x1,0x35,0x41,0xe5,0x91,0x1b,0x83,0x22,0x5d,0x11,0x9f,0x73, + 0x9c,0x4d,0xef,0x58,0xa,0x22,0xcf,0x50,0x83,0x29,0x86,0x78,0x95,0xa3,0x2b,0x19, + 0x9e,0x30,0x91,0xe8,0xaa,0x2d,0x53,0x50,0xcb,0xbd,0x74,0x5,0xb4,0x9e,0x6e,0x36, + 0x0,0x62,0xb3,0xaf,0xb3,0xd,0x9b,0xef,0x74,0xb7,0x42,0x78,0x6a,0x17,0xe0,0xa8, + 0xf8,0x68,0x34,0xe9,0x7d,0x3,0xb6,0x66,0x51,0xb8,0x55,0x24,0xc9,0xbe,0xdf,0xcd, + 0x7c,0x73,0x88,0xae,0xae,0x9a,0xc,0xc0,0xd5,0x71,0x92,0x79,0xe3,0x98,0x30,0xd7, + 0x30,0xad,0xd0,0xfb,0x3e,0x20,0x20,0x9a,0xfa,0x6b,0x88,0x56,0x41,0xe8,0x9e,0x9d, + 0x4c,0xc3,0xf1,0x18,0x45,0x69,0xe,0x97,0x5b,0x9,0x16,0x2,0x4f,0x60,0x9e,0x45, + 0x73,0x18,0x64,0x4a,0x93,0xcd,0xf8,0x0,0x81,0x13,0x1,0x6a,0x37,0x48,0x60,0x9b, + 0x71,0xc5,0x7d,0xcc,0xb4,0xf3,0xcc,0xec,0x80,0xf8,0x38,0x66,0x0,0x8f,0x59,0x16, + 0x30,0xa3,0xab,0x8d,0xf7,0xfb,0xcf,0xff,0xf9,0xa1,0x35,0x5f,0x77,0x80,0x87,0xc5, + 0x7,0x13,0xe7,0xd8,0xa2,0xdb,0xb,0x53,0x9,0xc2,0x51,0xa9,0x3a,0xb3,0x0,0xe8, + 0x14,0x73,0xba,0x2f,0x6a,0x80,0xa3,0xc2,0x39,0x46,0x59,0x35,0xe3,0x25,0x7c,0x32, + 0x6d,0x11,0xb5,0x26,0xf,0xda,0xee,0xc2,0xe1,0xb5,0xe0,0x61,0x81,0xae,0xdd,0xad, + 0xf8,0x6b,0xa1,0x77,0xf7,0x32,0xcc,0xc3,0x6c,0xae,0x3,0x82,0x8,0xdf,0x4d,0xe8, + 0x95,0x2e,0x40,0x1,0x16,0x32,0x81,0x2a,0xc3,0x69,0xfb,0x17,0x18,0x44,0x5,0x8a, + 0x2f,0x3,0x9,0x4f,0x41,0x9d,0x82,0xf8,0x3e,0x4f,0x23,0xf4,0xb0,0xf7,0xcc,0x80, + 0xa2,0x74,0xfd,0x59,0x85,0x9c,0x95,0x36,0x98,0xac,0xf7,0xa6,0xb5,0x98,0x39,0xb2, + 0x89,0xe6,0x70,0x90,0xa5,0xac,0xe7,0xdb,0xd6,0x6f,0x3d,0x8,0x60,0x5,0x43,0xd9, + 0x7c,0x3f,0x8,0x1b,0xf9,0xda,0xbd,0x9c,0xa8,0x95,0xfb,0x56,0xd,0x19,0x5b,0xa1, + 0xeb,0xff,0x65,0x33,0x14,0xb3,0x13,0xd6,0xd0,0x5c,0x8e,0x4a,0x49,0xc7,0x86,0x21, + 0xab,0x4c,0x87,0x9a,0x95,0xf9,0xf1,0xc3,0x9a,0x61,0x28,0x9d,0x9b,0xd6,0x79,0x6a, + 0x5,0xad,0x42,0xac,0x73,0xd,0x6f,0x41,0xa5,0x95,0x4c,0x68,0xaf,0x1b,0x6d,0xb1, + 0x70,0xb,0x67,0xff,0x41,0xd2,0x28,0x72,0xb5,0xdd,0x3c,0xb1,0x2f,0x21,0x17,0xd8, + 0x1d,0xb8,0x98,0x64,0x6e,0xaf,0x8f,0x1a,0x54,0xfb,0x7b,0xb0,0x13,0x7d,0xe2,0xb7, + 0xef,0xb3,0xad,0xf,0xa8,0xdd,0xdc,0x4b,0x8f,0x4d,0x27,0x9c,0x2b,0x74,0x33,0xf7, + 0x8a,0x24,0xdf,0x75,0xbe,0x36,0x6f,0x7d,0xea,0x61,0xd2,0xd2,0x12,0xa2,0xad,0xd7, + 0xdf,0xdd,0x61,0xa7,0x39,0xbb,0xb7,0x25,0xa1,0x75,0xb,0xc6,0x28,0xa2,0xd9,0xbf, + 0x77,0xa0,0x7e,0x8b,0xec,0xd,0xa1,0xde,0x92,0xc9,0x3e,0x8d,0x6e,0xbc,0x88,0x56, + 0xeb,0x57,0x84,0x5a,0x43,0xad,0xb7,0x79,0xf9,0xd0,0x40,0xdb,0x61,0x23,0x75,0x1d, + 0x7b,0x9,0x14,0xd4,0x2,0x98,0x72,0xe2,0x93,0x74,0x76,0x80,0x2f,0x96,0x82,0x13, + 0xa3,0xf3,0x6a,0x2e,0xb8,0x1e,0x78,0x4f,0xd,0x59,0x4d,0x18,0x5d,0xba,0xb8,0xe, + 0xdc,0x1,0x2b,0xd,0xe0,0xe6,0xc5,0x87,0xbb,0x53,0x75,0x54,0xad,0x22,0x40,0xbb, + 0x7c,0xfb,0xe,0x18,0x85,0xbb,0x6f,0x35,0xa9,0x6d,0xd4,0x37,0x67,0x68,0x1a,0xda, + 0x47,0x57,0x16,0x49,0x23,0x78,0x14,0xec,0xda,0xc,0xd2,0xad,0x6a,0x12,0xca,0xad, + 0xd3,0x65,0x3a,0xee,0x23,0xcf,0x70,0x87,0x4d,0xbb,0xce,0x71,0x14,0x2c,0x14,0x5a, + 0x29,0xd1,0xc3,0x3c,0xda,0x27,0x19,0x53,0x64,0xfb,0xd4,0xd,0x72,0x12,0xe4,0xc4, + 0x35,0x13,0x5e,0x6e,0xdd,0x61,0x57,0x25,0x95,0xec,0xb0,0x25,0xdc,0x60,0x27,0xb9, + 0xc0,0xcc,0x2c,0xf5,0x58,0xf5,0x1d,0x74,0xd,0xd2,0xc0,0xee,0x13,0xff,0xde,0x84, + 0x6f,0x6,0x2,0xbb,0x3c,0xa0,0xe7,0xe3,0x31,0x25,0x2a,0xa8,0xf9,0xb3,0x19,0xb4, + 0x90,0x73,0x2d,0x6d,0x44,0x44,0x99,0x42,0x77,0xe,0xae,0xa3,0xd5,0xed,0x44,0xc5, + 0x19,0x1f,0x50,0x14,0x7a,0x16,0xa8,0x61,0x1d,0xbf,0x50,0xb9,0xf2,0x90,0x79,0x9b, + 0x36,0x4a,0x64,0xbe,0x1f,0x24,0x22,0xb3,0x65,0xad,0xc0,0x58,0x68,0x96,0xe5,0xda, + 0x73,0xf2,0x80,0x40,0x87,0x93,0x29,0x1a,0x4b,0xbd,0x9a,0x64,0x90,0x2d,0x11,0x53, + 0x53,0x85,0xac,0x4,0x16,0xf9,0x95,0xe8,0x9f,0x87,0x8e,0x7c,0x11,0xca,0x47,0xaf, + 0x34,0xfa,0xc,0x9a,0x6a,0x43,0xe2,0x22,0x75,0x1d,0xf5,0x82,0xee,0xd5,0x58,0x8f, + 0xbb,0x16,0x78,0xbc,0xf8,0xe,0x24,0xf2,0xf1,0xba,0x1e,0xa7,0x80,0xe1,0x47,0x85, + 0xa6,0x24,0x63,0x2,0x42,0xea,0x19,0xc4,0xc0,0x6c,0xe9,0xec,0x9e,0x7b,0x65,0x25, + 0x5a,0xc1,0x94,0xa4,0xde,0x2e,0xb3,0x46,0x6f,0x14,0xb2,0xfe,0xc8,0x6a,0xf3,0xa0, + 0x78,0xf,0xf0,0x7b,0x67,0x76,0xef,0x45,0xba,0x39,0x4a,0x29,0x15,0xa7,0xbe,0xcf, + 0xd4,0xcb,0x89,0x3a,0x2,0x6e,0xbd,0x9c,0x32,0x4c,0xa9,0x4a,0x75,0x6c,0xe3,0xa6, + 0x35,0x44,0xc4,0x57,0x34,0xf0,0x9d,0x62,0x78,0xd,0x2c,0xe8,0xee,0x19,0x2d,0x88, + 0xa0,0x96,0xfb,0xed,0xcb,0xa2,0x91,0xfd,0xfa,0x6f,0x12,0xf8,0x9d,0x21,0x20,0x41, + 0x6a,0xaf,0x4f,0x3b,0x46,0x0,0x1c,0x58,0x32,0x56,0xb0,0xab,0x17,0x58,0x4,0x21, + 0x3a,0x30,0x30,0x83,0x43,0x46,0xd8,0xa,0x33,0xdf,0xa4,0x9b,0xcf,0x88,0xde,0xd1, + 0xbd,0x2f,0x27,0xfa,0xa0,0xb2,0x2a,0x31,0x7a,0xff,0xdd,0x5e,0xa1,0x97,0xd2,0xba, + 0xb5,0xbd,0x2,0x2c,0x55,0x13,0xb6,0x0,0xbe,0xb9,0x17,0x14,0x6c,0x55,0xfa,0xd4, + 0x5a,0x8f,0xc2,0x3b,0x68,0xe,0x6c,0x95,0x19,0x7d,0x33,0xc7,0x5d,0x2b,0x20,0xb9, + 0x19,0x5a,0x99,0x35,0x53,0xe8,0x71,0xb8,0xee,0xc8,0x5a,0xc6,0x57,0x99,0x7f,0x78, + 0x4f,0x5,0xea,0x28,0xa9,0xd0,0x60,0xbe,0xef,0x97,0x22,0x4,0x83,0xd8,0x16,0x95, + 0x51,0x6c,0xc9,0xad,0x78,0x9e,0xf3,0xf2,0xfd,0xd1,0xfb,0xcb,0x2d,0xa8,0x21,0xd1, + 0x2c,0x94,0xb1,0x42,0x2e,0x81,0x65,0xdb,0x9b,0x5f,0x5b,0xf1,0x21,0x5a,0xb0,0xb7, + 0x5a,0x8a,0xb5,0xae,0x3a,0x6a,0x58,0xde,0x23,0x7a,0xcb,0x85,0xca,0x9,0x77,0x11, + 0x7f,0xdf,0x17,0x83,0xef,0x73,0xf2,0x6d,0xa6,0x46,0x58,0xa7,0x67,0x85,0x13,0x68, + 0x4,0x14,0xbc,0x6b,0xd5,0xc2,0x12,0x87,0x99,0x73,0x8e,0xa4,0x79,0xaa,0xe8,0xac, + 0xe8,0x8d,0x12,0x5b,0xfd,0x73,0xd3,0x1e,0x4c,0x21,0x5a,0x27,0x3d,0xcd,0x7c,0x47, + 0x25,0x16,0x98,0xa9,0xc6,0xf2,0x9c,0xb1,0xef,0xef,0xd5,0xc6,0x14,0x33,0xde,0xba, + 0x40,0xf5,0x5d,0xde,0xbf,0xcd,0x7,0x4,0x28,0x15,0x6c,0x4d,0x9b,0x5e,0xad,0x6, + 0xf5,0x31,0xbb,0x1f,0x42,0xf8,0x72,0x9b,0xd4,0x5e,0x96,0x1a,0x67,0x82,0xc2,0xf7, + 0x70,0xe3,0x9d,0x38,0xc,0x33,0x43,0x28,0xd9,0x78,0x9c,0xfb,0xb8,0xe2,0xd,0x7c, + 0x50,0xea,0xba,0xd,0x29,0xdb,0x53,0x82,0x51,0x90,0x8,0x15,0xbb,0xc9,0x7c,0x6a, + 0xf0,0xc0,0xf7,0xa4,0x54,0x84,0x34,0x90,0x25,0x0,0x7,0x15,0xac,0x65,0x8c,0x2e, + 0x4a,0x72,0xce,0x5a,0x13,0x61,0xe,0xe3,0xb1,0xb2,0xa7,0x1a,0xc1,0xa8,0x9d,0xf, + 0xe2,0xec,0x2a,0x16,0xcc,0x95,0x76,0x11,0x3a,0x3b,0x88,0x28,0x7c,0xf6,0xa9,0x26, + 0xf9,0x48,0xa2,0xc3,0x65,0x9c,0x3e,0x71,0xa0,0xbd,0x6,0x4e,0x44,0x40,0x5b,0x3d, + 0x5,0xab,0xe4,0x3a,0x29,0xb0,0x17,0x2,0xe,0xb5,0x63,0xb2,0xa2,0xde,0xf7,0x33, + 0xb1,0x75,0x95,0xfb,0xef,0x38,0x81,0xc0,0x80,0x80,0x9e,0xe8,0x27,0x2c,0xea,0x48, + 0xb3,0x25,0xfd,0x5,0x62,0xe9,0xc9,0xe7,0xa5,0x47,0xf3,0x1c,0x84,0x95,0x5b,0x41, + 0x58,0x7d,0xda,0x45,0x3a,0x82,0x50,0x2a,0x7b,0xf1,0xbd,0xe6,0x6e,0x50,0xde,0x8a, + 0x5b,0xaf,0x1,0x7e,0xdb,0xed,0xa6,0x6c,0xdb,0x60,0x65,0x8f,0x40,0x8d,0x5f,0xee, + 0x7b,0xf9,0x8f,0xd0,0x29,0xf2,0xda,0x6,0x6,0x1f,0x4d,0x4e,0x72,0x9c,0xf5,0xe, + 0x99,0x7b,0x3d,0x4d,0x6b,0x92,0x73,0xc2,0xa8,0xd3,0x51,0xb1,0x5b,0xa5,0x29,0x93, + 0xa0,0xfe,0xb9,0x85,0x77,0x40,0x44,0x54,0x5a,0xac,0x22,0x43,0x24,0x73,0x8a,0x64, + 0x55,0xa3,0xbd,0x58,0x21,0x8c,0x8c,0xbb,0x98,0x14,0x79,0xac,0x68,0xba,0xcd,0xaf, + 0xbb,0x45,0xc0,0x66,0xfd,0xb6,0x27,0x5a,0x1f,0x3a,0x14,0x12,0xc5,0x65,0x9,0x3a, + 0x23,0xb2,0x51,0x83,0xfd,0x89,0x21,0xd3,0x57,0xa,0x8a,0x6f,0x6d,0x29,0xee,0x83, + 0x78,0x3,0xb0,0x2b,0xf0,0x35,0x6a,0x3c,0xbc,0x94,0x13,0x5d,0x4,0x7e,0x67,0xe2, + 0x33,0xc2,0x1e,0x92,0xe4,0xd5,0x8,0xbc,0x3,0x29,0x9d,0x35,0xd,0x7a,0x5a,0x44, + 0x68,0xd5,0x66,0x53,0x52,0xe7,0x7,0x56,0x6,0xc1,0xb0,0xf5,0x9a,0x50,0xc7,0x2, + 0x9d,0x7a,0x59,0x88,0xa2,0x15,0xa8,0x48,0x60,0xca,0x9c,0x49,0xc2,0x31,0x6d,0x62, + 0x6,0x7b,0x88,0x3e,0xa1,0x1d,0x4e,0x6e,0x45,0x15,0x81,0x87,0x6,0x7b,0x1a,0xd9, + 0x31,0xb2,0xbc,0xc7,0xb5,0x9a,0x54,0x9d,0x0,0xf9,0x79,0x55,0x58,0xc3,0xe6,0xbe, + 0x63,0x2,0x61,0xbe,0xb,0x22,0xfb,0xbe,0x5,0xbd,0x42,0x15,0xe0,0xfb,0x7f,0xef, + 0x7b,0xa4,0x17,0x3e,0xc5,0xcd,0xac,0xaa,0xce,0xf5,0xb5,0x24,0x82,0x72,0x1d,0xc3, + 0xb9,0xb7,0xbf,0x80,0x61,0x78,0x94,0x54,0x47,0xe0,0x18,0xb2,0x90,0xac,0x7e,0x19, + 0xe1,0x9c,0x21,0x1b,0x98,0x99,0xb1,0x4d,0xfc,0x28,0x8c,0x3a,0xce,0x23,0x36,0x38, + 0x53,0xb7,0x6b,0xc,0x3c,0xa9,0x73,0x11,0x65,0x4e,0xb4,0xa,0x6f,0x24,0xc9,0x98, + 0xf2,0xd4,0x99,0x2a,0xe5,0x91,0x63,0xc6,0xdc,0x5a,0x4c,0x60,0xf7,0x33,0x19,0xc7, + 0x80,0x96,0x94,0x6b,0x71,0x55,0x7d,0x53,0xa7,0x85,0xac,0xdf,0xee,0xc1,0xcf,0x98, + 0x84,0x30,0xfa,0x77,0xc2,0xac,0x4b,0x80,0x44,0x1c,0x1b,0x34,0x2c,0x6e,0xb5,0xc0, + 0x53,0xe,0xcb,0xed,0x73,0xcc,0xd1,0x65,0x93,0x44,0x2b,0x0,0x21,0x66,0xd0,0x1, + 0x31,0x68,0x80,0x74,0x11,0xd4,0x28,0x26,0x0,0x12,0x2d,0xc7,0x5b,0x7d,0x9d,0xa6, + 0x7a,0xa4,0x30,0xcf,0x6e,0x18,0x33,0xf8,0xa1,0x2c,0xae,0x68,0x56,0x1a,0x6d,0x9c, + 0xa3,0x23,0x5e,0x45,0x63,0xcb,0x8,0xa5,0x7f,0x36,0x5a,0x37,0xd,0x2a,0xa8,0x50, + 0xc0,0x7a,0xda,0x34,0xf8,0xb6,0xde,0x7f,0xaf,0xd4,0xdb,0x8e,0x4a,0xdf,0xd1,0xed, + 0x14,0x88,0xcb,0xae,0xac,0x81,0x32,0x88,0xfd,0x18,0xe1,0xba,0xbe,0xb6,0xbe,0x41, + 0xb1,0x8e,0xd0,0x66,0x5c,0xf1,0xc8,0x41,0x58,0xa0,0xb3,0x16,0x49,0x65,0x60,0x8c, + 0xa8,0x55,0x3a,0x24,0xad,0xa,0xeb,0xb4,0x77,0xf6,0x4c,0xb8,0xbb,0x65,0x3f,0xac, + 0x6,0x76,0xc1,0x79,0xaa,0xde,0xad,0x52,0xf7,0x76,0xa2,0xef,0xa0,0xaf,0xbd,0x44, + 0xdc,0x1b,0x92,0xee,0xee,0xc5,0xb1,0xf9,0xe6,0x28,0x7b,0x48,0xd9,0x87,0xba,0xee, + 0xf6,0x5f,0xb6,0xc6,0xe2,0x1b,0x5d,0x1c,0x6b,0x41,0xde,0x5b,0x1b,0xd6,0x2,0xa0, + 0xb3,0xe8,0xe3,0xa8,0x46,0x1d,0xa3,0x2a,0xe7,0x64,0x68,0x4,0x9a,0xe6,0xa4,0x41, + 0xd5,0x79,0x87,0x76,0xb3,0xaf,0x2a,0xb1,0xd6,0x93,0x9f,0x2d,0xcf,0xcd,0xc1,0xf, + 0x62,0x14,0xd4,0x89,0xbd,0x8,0x85,0x8c,0xc,0xa1,0x72,0x9d,0xfa,0xb5,0xae,0xee, + 0x10,0x5e,0x96,0x48,0x4e,0x4d,0x1e,0x57,0xaf,0x19,0x66,0xb5,0x94,0x82,0x13,0x4d, + 0x43,0xd4,0xdc,0x76,0x8c,0x9c,0xe1,0x44,0x45,0xc9,0xd,0x71,0xbf,0xae,0x33,0xdf, + 0x66,0x38,0x26,0x9c,0x2c,0x23,0x0,0x27,0x31,0x24,0x6b,0x12,0x38,0x0,0x87,0x6d, + 0x52,0xe4,0xad,0x30,0x1f,0xf7,0xbb,0x4f,0xc4,0xdb,0xb6,0x28,0xc3,0xa7,0x75,0x32, + 0x87,0x1f,0xb5,0x3c,0xd9,0x53,0x43,0x1a,0x71,0x3,0x57,0x42,0xc1,0x3a,0x62,0x7c, + 0xbb,0xc1,0x20,0x75,0xf7,0x48,0xa3,0xbc,0x74,0xdb,0x72,0xd6,0x72,0xc1,0x80,0xc5, + 0x8d,0xdc,0x15,0x4e,0x55,0x3b,0xf9,0x6e,0x6e,0xac,0x1f,0xd5,0x13,0x35,0x2b,0x2d, + 0x99,0x75,0xc3,0xe,0x9a,0xf3,0x6,0x9a,0xdb,0x69,0x9c,0xbd,0x3a,0xdf,0xa9,0x1d, + 0xd8,0xf6,0xfd,0xd2,0xe4,0xf5,0xb6,0x26,0x2b,0xbd,0x8d,0xeb,0x77,0xb2,0x73,0x35, + 0xf7,0x3a,0x25,0xa9,0x48,0xbf,0x4d,0xb,0x75,0x17,0xb8,0xae,0xf7,0xd3,0xdf,0x83, + 0x94,0xaf,0x67,0x8,0x51,0x23,0x67,0xb0,0xc2,0xe8,0xb0,0xec,0x26,0xa7,0x53,0x2, + 0x49,0xf,0x54,0x7b,0x0,0xeb,0xd5,0x8e,0xf8,0x49,0x75,0x7c,0x37,0x55,0xfb,0x82, + 0x6a,0xd7,0x32,0x9,0x4d,0xb4,0xc3,0xa1,0x9c,0xe5,0xe,0xca,0x82,0xf2,0xb8,0x91, + 0xda,0xf,0x6e,0xea,0xca,0x34,0xd8,0xd5,0x82,0xce,0x87,0x6,0x77,0x46,0xce,0x47, + 0xca,0x5a,0xc4,0x8e,0x23,0xba,0x83,0x99,0x52,0x4e,0xdb,0x52,0xf2,0xe0,0x80,0x16, + 0x55,0xc8,0x24,0x58,0xd5,0xae,0x1,0x57,0xd5,0x33,0x34,0xfc,0x8c,0x4c,0xac,0x48, + 0xd1,0x20,0x3c,0x40,0xbe,0xef,0x59,0x54,0x15,0x1,0x1c,0x41,0x48,0x65,0x86,0xa, + 0x78,0x4,0x59,0xb1,0xce,0xbe,0x49,0x12,0xc4,0x62,0x2d,0xea,0x33,0x13,0x2a,0xed, + 0xa1,0xa9,0x21,0xb3,0x33,0x38,0x32,0xc8,0x3e,0xba,0xa0,0xb1,0x9e,0x39,0xc8,0x7b, + 0x90,0x69,0x18,0x36,0xe3,0xe2,0xf1,0xb9,0x3e,0xb8,0xa1,0xc3,0xd6,0x94,0x66,0xe4, + 0xae,0xe2,0x52,0xa5,0x1d,0x6a,0xfd,0x15,0x85,0xe4,0x62,0x6a,0x10,0x39,0x51,0xf9, + 0x2a,0x2d,0xb0,0xcc,0x2,0x4f,0x6f,0x1d,0x34,0x78,0x71,0x7d,0xdc,0xa3,0x62,0x21, + 0x60,0xdc,0xde,0x60,0x76,0x8f,0xac,0xbc,0xe1,0x57,0xd9,0x4,0x3e,0x7c,0xb0,0xb6, + 0x60,0xd3,0xa7,0x3c,0x72,0xbc,0xa1,0x67,0x40,0x67,0x42,0xb7,0xf9,0x6a,0xa7,0x9e, + 0xbb,0x9d,0x30,0xaf,0x90,0x8a,0x76,0xc6,0x38,0x76,0xc8,0x70,0x29,0xad,0x44,0xd9, + 0x6c,0xdb,0xaf,0xf4,0x44,0x71,0xdb,0xb6,0x48,0xe2,0x32,0x8c,0x18,0x23,0x2a,0x54, + 0x83,0x2f,0x4f,0x80,0xab,0x42,0x18,0x83,0x1a,0xcc,0xb,0xe0,0x7b,0x2a,0x35,0xee, + 0x75,0x4b,0x91,0xac,0x6,0xa3,0xa,0xd5,0xee,0xdb,0x77,0xb0,0x0,0x8,0x70,0x48, + 0x43,0xb5,0x20,0xe6,0x24,0x6e,0x2,0x3c,0x82,0xdb,0xdc,0xe3,0x19,0x96,0xb0,0xad, + 0x1,0x4a,0xe4,0x33,0xec,0x72,0x6d,0xa9,0x47,0xef,0xd2,0xde,0x48,0x6c,0x7a,0xec, + 0x2c,0xc4,0x75,0x2,0xc5,0xb6,0xea,0x10,0x5a,0x67,0xb6,0x6,0xd8,0xe6,0xe6,0xbe, + 0x91,0x42,0x71,0x9b,0x1d,0x79,0x97,0xcb,0xa8,0x7e,0xdf,0xa0,0xa1,0x52,0xbb,0x96, + 0xa2,0x59,0xf9,0x9,0x87,0xd7,0x75,0x5d,0x7a,0xf9,0x54,0xe8,0x1e,0x87,0xf5,0xdd, + 0xd2,0xa3,0x1d,0x24,0xb9,0x9f,0x76,0x63,0xd4,0x3e,0x28,0x84,0x34,0xf,0x1a,0x73, + 0xf4,0x36,0x65,0x60,0x19,0x59,0x57,0xb5,0x11,0x72,0x67,0x64,0x5a,0x71,0x61,0xf2, + 0xf1,0x0,0xd,0x16,0x2e,0xb2,0x40,0xb3,0xdf,0xcd,0xeb,0x50,0x9f,0x6c,0x4b,0xfb, + 0xc8,0x64,0x63,0xc1,0x92,0xd2,0x3,0xfd,0x66,0x4e,0x16,0x65,0x3b,0xa0,0xae,0xf2, + 0xce,0xdd,0x6d,0xbf,0x9f,0x95,0x6e,0xe0,0x5e,0x46,0x75,0xde,0x92,0xdc,0x3a,0x81, + 0x71,0x73,0xf3,0xd,0xb6,0xa1,0xb,0xe8,0x54,0x99,0xdd,0xa,0xf8,0x6e,0xec,0x35, + 0xef,0x7d,0xcb,0x36,0xa7,0x70,0x8e,0xd9,0xaa,0x4a,0xb1,0x43,0x45,0x86,0x68,0x4c, + 0x4c,0x2c,0x63,0xbe,0x8a,0x0,0x8a,0x13,0xdf,0xb,0x48,0x52,0xa0,0x8d,0x14,0x24, + 0xa9,0xee,0x7d,0x86,0xe,0xa4,0x92,0x7f,0x5a,0xcd,0x1,0x2,0xc7,0x17,0x4,0xb2, + 0x71,0xb0,0x46,0x2,0x70,0x25,0x5d,0xa,0x31,0x70,0x67,0x29,0xbb,0x32,0x40,0xbd, + 0x5c,0xf5,0x91,0xd2,0x4e,0xea,0xf9,0x23,0x8c,0xe3,0x2d,0x3a,0x65,0xbb,0xf8,0xa1, + 0xf3,0xb0,0x39,0x29,0xa1,0xb9,0x5,0x31,0x0,0x4a,0x8,0x10,0x9c,0x7b,0x23,0xc4, + 0xde,0x7,0x8a,0x80,0x34,0xab,0x35,0xa3,0x8a,0xda,0xa4,0x36,0xb0,0x6,0x60,0xff, + 0x75,0xb,0x80,0x8b,0xa8,0x22,0x65,0x91,0xcf,0xee,0x91,0xcc,0x6e,0xea,0xe7,0xcd, + 0xf,0xb5,0x5,0xd9,0x20,0x10,0xe1,0x36,0xd,0xaa,0x23,0x89,0x88,0xb3,0x8e,0xf8, + 0x59,0xd4,0x4f,0xb3,0xc0,0xeb,0xf3,0x60,0x6f,0x35,0xed,0x20,0x90,0x9a,0x20,0xe2, + 0xa0,0x63,0x28,0xbe,0x38,0x2b,0x42,0xe,0xcd,0x6a,0x48,0x80,0xa7,0x99,0x6d,0x6b, + 0xe7,0x7a,0x6c,0x57,0x7a,0xd9,0x4b,0xce,0x32,0x2,0x79,0xb,0x3c,0x5c,0xcd,0xf4, + 0xbf,0x8f,0xd9,0xf7,0x1e,0x8f,0x8a,0x88,0x72,0x77,0x5a,0x9b,0x81,0xd2,0x51,0x88, + 0xcb,0x51,0x98,0x4a,0xf6,0x4e,0x53,0x30,0x3,0x24,0xcb,0xd3,0x42,0x50,0x25,0x6f, + 0x36,0x1e,0xb5,0x9b,0xd9,0xe0,0x2a,0x5b,0xb3,0x3c,0xeb,0x68,0x9d,0xbd,0x4a,0xd9, + 0x6c,0x77,0xeb,0x2e,0x3b,0x19,0xb,0x6e,0x9b,0x15,0x2b,0x12,0xd4,0xe1,0x6e,0xdb, + 0xb6,0x9,0xbe,0x27,0xf0,0x29,0x4c,0x6c,0x3d,0x51,0x55,0xe1,0x6d,0x4,0x91,0x2a, + 0xc9,0xe3,0x4d,0x9f,0x6c,0x0,0xe5,0x8a,0x8d,0x9,0x3a,0xbc,0x94,0x5e,0x16,0xd6, + 0x19,0xfb,0x28,0x15,0x79,0x25,0x74,0x1,0x14,0xf4,0x2a,0xc6,0xaa,0xb,0x57,0x25, + 0x2b,0x8d,0xe4,0x83,0x5b,0xbe,0x27,0x2a,0xbf,0x3e,0x24,0xd4,0xf0,0x2a,0xa,0x43, + 0xa9,0xbb,0x55,0xb0,0xa1,0x91,0x8b,0xb,0x5,0xf4,0x5a,0x65,0x87,0xe0,0xe2,0x3e, + 0x66,0xbf,0xdb,0x7e,0x9c,0xff,0xdf,0xff,0xdf,0x53,0xff,0xd7,0xfe,0x25,0xb6,0x52, + 0x99,0x7b,0x3b,0x56,0x6e,0x38,0x88,0xf9,0x68,0xcd,0x57,0xdf,0xb6,0x46,0x2e,0xa8, + 0x3f,0x2a,0xe5,0x4,0x5a,0x7c,0x77,0xb7,0xe0,0x67,0xc7,0x14,0x10,0x74,0x68,0x7b, + 0xd7,0x6f,0x6d,0x89,0xaa,0x39,0x7a,0x97,0x9d,0x6,0xeb,0x55,0x73,0x5,0xad,0x63, + 0xd4,0xdb,0xf4,0x28,0x90,0x3a,0x24,0xa8,0x29,0xb9,0x60,0x49,0x6d,0xb0,0x37,0xda, + 0x36,0x2f,0xb3,0xa9,0x3a,0x26,0x55,0x23,0x75,0x30,0x2c,0xcb,0xdb,0x7a,0x5d,0x4d, + 0x61,0xe4,0x38,0xa6,0x2e,0x27,0xa,0x2b,0xb6,0xf5,0x4,0xb6,0x39,0x22,0x75,0xf3, + 0xd1,0xb1,0x3f,0x7c,0x27,0x1f,0xd6,0xd1,0xc7,0x9,0xf7,0xce,0x0,0xd9,0xcb,0x6e, + 0x2f,0x66,0xdb,0x46,0xe7,0x6a,0x29,0x56,0xf6,0x9a,0x7d,0x7,0x99,0x60,0xc3,0xe6, + 0xb6,0xed,0x50,0xc3,0x5d,0xa9,0x8e,0x4,0x49,0x1d,0xc,0xb0,0xe0,0xde,0xa4,0xf3, + 0x34,0x4c,0x3a,0x4a,0x7e,0x60,0x4a,0x41,0xf8,0x26,0x8f,0x8c,0x23,0x37,0x1d,0x52, + 0x6a,0xf,0x57,0x4b,0x56,0xad,0xfc,0x4f,0x9a,0xc7,0xf1,0x89,0x67,0x44,0x76,0x2f, + 0x47,0x7c,0x72,0x28,0x9b,0xb4,0x9f,0x59,0xe5,0x50,0x51,0x78,0x1,0x6e,0x3f,0x8e, + 0x26,0x63,0x86,0xe,0x17,0x2e,0xaa,0x6c,0xea,0x61,0x56,0x66,0xca,0xa7,0xf6,0xe8, + 0xda,0x10,0xed,0x96,0x7c,0x2,0x97,0xc5,0x54,0xe,0x6f,0x6,0xe6,0x97,0x36,0x5d, + 0xfc,0x2c,0xb9,0x4e,0x88,0x8f,0x38,0x66,0xbc,0xee,0x80,0x4c,0xc7,0xa4,0x3d,0x2e, + 0xb3,0x92,0x80,0x43,0xc8,0xa8,0xb,0xd5,0x6f,0x9f,0x3,0xfc,0x22,0x1b,0x3a,0xd1, + 0xf2,0x2d,0x93,0xcf,0x2d,0x0,0x2f,0xba,0x54,0x64,0x0,0x33,0xe2,0x20,0xdb,0x6d, + 0x76,0xcf,0x93,0xc3,0x53,0x7b,0xaf,0xc2,0x74,0x8,0xe6,0xe3,0xef,0x6d,0x6b,0xaf, + 0xe1,0xa3,0x33,0x8c,0x7c,0x54,0x75,0xa5,0x29,0x8e,0x15,0xae,0x52,0x7a,0x85,0x2, + 0xa9,0x1a,0x9b,0xf6,0x69,0x3d,0xd8,0xd0,0x28,0x6a,0x0,0x87,0xaa,0xbd,0x22,0xea, + 0x87,0x27,0x5a,0x3c,0xad,0x94,0x55,0xaa,0xaa,0x9c,0xc0,0x49,0x3d,0xf9,0xe8,0xc8, + 0x2c,0xb4,0x2e,0x44,0xb5,0x5a,0x26,0xc9,0x88,0x62,0xca,0x4f,0x6e,0x33,0xc8,0x2, + 0xf1,0x6c,0x7,0xaa,0x40,0x9,0xba,0xe,0x7b,0xa9,0x35,0xc2,0x86,0x36,0x3d,0xaa, + 0x73,0xf3,0x9d,0x4e,0xb5,0xa1,0x66,0xc7,0x5e,0xcc,0xb1,0x95,0xcd,0xe1,0x5,0x9b, + 0x6f,0x28,0x5b,0xd9,0x36,0x6c,0x23,0x20,0x56,0xab,0xa,0xaa,0x52,0xc6,0x9a,0xf3, + 0x2e,0xb6,0xc9,0xf9,0x10,0xd1,0xd0,0xd1,0xbc,0x2b,0x1,0x2b,0xbb,0xae,0xed,0x48, + 0x88,0x0,0x14,0x6f,0xb3,0xdb,0x1a,0xf0,0xd1,0x1,0x73,0xa6,0x70,0xb8,0xe1,0x10, + 0x7,0x5,0xcb,0xe,0x7d,0x8,0x1a,0xa1,0x13,0x28,0x4b,0xb7,0xb1,0xf,0xe8,0x42, + 0x14,0x7e,0xeb,0xba,0x10,0x15,0xc8,0xdd,0xa3,0x2b,0x22,0x4f,0xd8,0x9b,0x67,0x1d, + 0xc6,0x11,0x5e,0xc8,0xdc,0xee,0xc4,0x2e,0xe5,0x33,0x8c,0x57,0x8a,0xa3,0x8c,0xa6, + 0x23,0xa9,0x17,0xf9,0x48,0x8,0x76,0x7c,0x83,0x77,0x10,0xd7,0xb0,0x76,0x55,0x80, + 0xad,0x48,0xee,0x12,0xdc,0x12,0x4,0x7a,0xeb,0xe3,0xf,0x78,0x13,0xed,0xa1,0x31, + 0x7,0x97,0xda,0xe8,0xd,0x91,0xba,0xc8,0xa5,0x4b,0xd4,0x2f,0x14,0x11,0x64,0x9e, + 0xd8,0xae,0xed,0x77,0x44,0x88,0x27,0x50,0xb,0x43,0xc7,0xe3,0xff,0xc1,0x27,0xff, + 0xdf,0x1a,0xdc,0x4a,0xec,0x82,0x98,0x5,0x61,0x22,0x2f,0xd,0x38,0xec,0xcd,0x7f, + 0xbe,0xcd,0x14,0x6a,0xc2,0xe3,0x32,0x50,0x1e,0x58,0x6e,0xb6,0x3c,0x77,0xdb,0xbc, + 0x63,0xb1,0x6b,0x5b,0xbe,0x16,0xb1,0x9b,0x63,0xdb,0x29,0xb,0x95,0xc,0xb3,0xa7, + 0x6e,0xdb,0xb6,0xd,0x98,0xa,0xc,0x27,0xbc,0xd8,0x56,0xbc,0x65,0x12,0xb0,0xb2, + 0x4b,0x3b,0x78,0x6f,0xcc,0x77,0x8c,0x9c,0x77,0x98,0xdd,0xb0,0xb7,0x6a,0xd4,0x38, + 0xe2,0xf8,0x5b,0x32,0x8b,0x89,0x78,0xa5,0x2d,0xb3,0xbc,0x10,0x63,0x4f,0xb4,0xcc, + 0x96,0xb0,0x32,0xa,0x2c,0xfc,0x37,0xff,0xe8,0xd1,0xbf,0x15,0xb8,0x3a,0x26,0x6f, + 0x32,0x99,0xe6,0xda,0xa1,0x97,0xd9,0xcf,0xa0,0x88,0x1d,0xfc,0xf9,0x1,0x24,0xfc, + 0xcf,0xf8,0xcf,0x5b,0xbd,0xf6,0x67,0xbd,0xcf,0xe4,0xde,0xfc,0x57,0xbf,0x47,0xd4, + 0xd2,0x85,0x5b,0x50,0xd6,0x9a,0xfc,0x46,0x74,0x2e,0xb3,0x9,0x35,0xcc,0x7f,0xd6, + 0x5,0xaa,0x2d,0x69,0x7,0x0,0x5,0xed,0x26,0x34,0xfc,0x80,0x33,0xf8,0xc2,0x63, + 0xf,0x52,0xbd,0xa6,0x5d,0xd5,0x14,0x20,0xa2,0x8b,0xa1,0x23,0x80,0x6c,0x30,0x2, + 0x12,0x2b,0x99,0xad,0x15,0xc8,0x7e,0x46,0x66,0x4d,0xf4,0xb4,0xd7,0x7b,0xd2,0x34, + 0x0,0x63,0xde,0xa0,0xc3,0xd,0x64,0xd6,0x51,0xe5,0xad,0x32,0x71,0xaa,0xd6,0x4b, + 0xaf,0x6,0x4b,0xab,0x19,0xe1,0xf0,0x1d,0x0,0xe7,0x90,0x0,0xdf,0x18,0x3a,0x52, + 0xdd,0xf,0xe6,0x4e,0xb,0x36,0xac,0xd2,0x2d,0x82,0xd1,0x46,0x28,0xf8,0x19,0x19, + 0x92,0x51,0xee,0x2e,0x55,0x8f,0x49,0x26,0x3f,0x4c,0x42,0x9c,0xee,0x15,0x93,0x48, + 0x9c,0x1c,0xa2,0x6d,0xc0,0xe1,0xba,0x4d,0xb4,0x6f,0xd6,0x7e,0xd6,0x2a,0xf6,0x6d, + 0xdb,0x6a,0x65,0xb8,0xd5,0x8e,0xe4,0x66,0xe6,0xbe,0x6d,0xbe,0xb5,0x36,0xe5,0xd6, + 0x10,0xf0,0xed,0x37,0x6d,0x22,0xb1,0x68,0xd,0xe8,0xdd,0xee,0xfb,0x1e,0xbd,0x5b, + 0x90,0xae,0x8e,0x6d,0xc0,0x89,0xee,0x23,0xdb,0x12,0xa4,0x32,0x2,0xd,0x55,0xe9, + 0xc6,0x4e,0xde,0xb0,0xcc,0x58,0x84,0x26,0x39,0x6e,0x41,0xd,0xf2,0x2d,0x78,0xbd, + 0x62,0xc4,0x8a,0xe4,0x34,0xcf,0xaf,0xdd,0x7c,0xf3,0x43,0xc2,0x98,0xf9,0xbf,0x87, + 0x6d,0x67,0xbd,0xc1,0xcd,0xcb,0xad,0x8f,0x69,0xf7,0xc4,0xab,0xcd,0xb6,0x36,0x6f, + 0xda,0xc7,0x9b,0x99,0xa3,0x75,0x5e,0x88,0x3f,0xed,0xdc,0x6d,0xe0,0xeb,0x6b,0x3e, + 0x6a,0xcd,0xc,0x97,0x1,0x84,0x3d,0x68,0x43,0xfe,0xcc,0x63,0xe,0x1f,0xa6,0x34, + 0x0,0x71,0x9,0x82,0x91,0xb,0xdd,0xa6,0xa1,0x68,0x42,0x96,0x40,0x63,0xdd,0x4e, + 0xe8,0xad,0x9,0x67,0xd,0x8b,0x34,0x9b,0x4e,0xe2,0x4f,0xd6,0x3a,0x54,0xc,0xba, + 0x8f,0x9c,0xb1,0xb7,0xdd,0x37,0x8f,0x39,0xbf,0x6a,0xf0,0xf4,0x1,0x48,0x4d,0xaa, + 0xf6,0x40,0xee,0xbd,0x4d,0x53,0x81,0x71,0xa8,0x50,0xb8,0x5d,0x79,0xbf,0x22,0xde, + 0x6b,0x30,0x87,0xfb,0x56,0x47,0x35,0x6e,0xbe,0x6d,0xde,0x22,0x77,0x87,0x99,0x56, + 0x2b,0xbc,0x7d,0x6f,0x39,0x41,0x24,0xab,0x54,0xe0,0xc0,0x5d,0x30,0x8e,0x23,0x58, + 0x62,0xea,0x29,0x8b,0x9f,0x15,0xfd,0xec,0xb0,0x3c,0x3e,0xe,0xd8,0x89,0xd3,0xeb, + 0x4f,0x6a,0x73,0xdf,0x26,0xcd,0x81,0xb9,0x7c,0x0,0xfa,0xc2,0xc6,0xb0,0xfd,0x94, + 0x0,0x54,0x2c,0x9a,0xb3,0xab,0xcc,0x17,0x68,0xc,0x62,0xa2,0xfd,0x1e,0xb7,0x6a, + 0x34,0xe,0x61,0x7a,0x57,0x6a,0x67,0x90,0x95,0x68,0xa4,0xa6,0x25,0x85,0xb2,0x4e, + 0xa7,0x1a,0x5e,0xef,0xc3,0xba,0xd3,0x6d,0xb8,0x2b,0x77,0x51,0x8a,0xa4,0xcd,0xdb, + 0x25,0xb6,0xe4,0x43,0x6c,0xfe,0xb3,0xe0,0xb2,0xcb,0xdc,0x7a,0xe1,0xf8,0xcb,0x9c, + 0x1,0x42,0x53,0xeb,0x78,0x67,0xfc,0xff,0xdc,0xbd,0x57,0x93,0x65,0x57,0x76,0x26, + 0xf6,0xad,0x7d,0x6d,0x7a,0x6f,0x2b,0xb3,0xbc,0x41,0xa1,0x50,0x28,0xb8,0x46,0x77, + 0xb3,0xd9,0x6c,0xb2,0x87,0x43,0xce,0xc,0x29,0xf2,0x41,0x13,0x13,0xa,0xc5,0x88, + 0x8a,0xd0,0x1f,0xd3,0x8b,0xa4,0x27,0x29,0x82,0x31,0x33,0x9a,0xa1,0x46,0x24,0x41, + 0xb6,0x41,0x37,0xba,0xe1,0xb,0x28,0xa0,0x50,0xde,0x64,0x65,0x56,0x7a,0x9f,0x37, + 0x6f,0xde,0xbb,0x97,0x1e,0xb6,0x5b,0x6b,0x9f,0x73,0xab,0x6a,0x28,0x2a,0x44,0xa9, + 0x9a,0x20,0x50,0x69,0xaf,0x39,0x67,0xaf,0xb5,0xbe,0xf5,0x19,0xb9,0x77,0xca,0x2f, + 0x4,0x2e,0xa6,0x9f,0x49,0x7,0x22,0x96,0x8c,0xf7,0x0,0x50,0x65,0x47,0x5e,0x26, + 0x29,0x94,0x31,0xab,0x9c,0x67,0x97,0x9,0x84,0x84,0xb3,0x2e,0x92,0x4a,0x2e,0x50, + 0x12,0x21,0x50,0xc9,0x5b,0x40,0x1e,0x20,0x1,0x99,0x10,0x6c,0x5b,0x32,0xb2,0x7e, + 0x53,0x8,0x6,0xf1,0xda,0xdd,0x50,0x53,0xa4,0x2c,0x8a,0xa2,0x5d,0xbc,0x43,0x2a, + 0xd,0xe0,0x25,0x69,0x26,0x1d,0x86,0x52,0x1b,0x1d,0x89,0x6e,0xfe,0x63,0xb2,0x88, + 0x23,0x70,0xc0,0x14,0xf5,0x21,0xce,0xa9,0x24,0x24,0x82,0x84,0xac,0x68,0xeb,0xe0, + 0x5e,0x7d,0x55,0xe7,0x69,0x74,0x25,0xb1,0xc3,0x69,0x7b,0x93,0xf2,0xe3,0x52,0x7a, + 0xb7,0x97,0xdf,0x92,0x31,0x6e,0x1e,0x8f,0x8c,0x5e,0x62,0xb0,0xb5,0x30,0xc6,0x90, + 0x65,0x47,0x73,0xb7,0xe,0x76,0x87,0x25,0x4b,0xc6,0x1a,0x37,0xc9,0xfb,0xad,0xa0, + 0x85,0x38,0xbb,0x93,0x5e,0x85,0xf5,0x1e,0x2e,0x41,0xba,0x62,0xd2,0xf6,0x53,0xa0, + 0xf1,0x20,0xbb,0x2e,0xe2,0x20,0x22,0x27,0xeb,0xa,0xce,0x35,0x8a,0xad,0xcd,0x5a, + 0xbc,0x40,0xf9,0xe9,0xa5,0x73,0xd7,0x19,0x65,0x9e,0x49,0x62,0x85,0xc9,0x85,0x8, + 0x7a,0x81,0xf7,0xc9,0x38,0xe1,0x60,0x14,0x12,0xdc,0xd7,0xc8,0x67,0xdb,0xca,0xdb, + 0x3c,0xd1,0x54,0x7c,0xb,0x1a,0x93,0x44,0xd9,0x73,0xbc,0xe2,0x94,0xc6,0x89,0x79, + 0x1f,0x62,0x68,0xc1,0xc,0xc3,0x61,0xaf,0xe7,0x49,0x70,0x4c,0x4c,0xb0,0xc6,0xb7, + 0xc7,0x36,0x1a,0x47,0xab,0xa0,0xb2,0xc0,0x9d,0xe4,0xa4,0xfa,0x4b,0x45,0x5b,0x15, + 0x75,0x7f,0x3d,0xeb,0xe9,0x3d,0xd,0xd9,0x46,0x70,0x3f,0xbc,0x87,0x42,0x72,0x8a, + 0x8b,0x7c,0x8f,0xa4,0x54,0x4b,0xd6,0x9,0x5,0x57,0x34,0x12,0xef,0x91,0x5a,0x23, + 0x96,0x8e,0x3d,0x2,0x39,0x4c,0xf6,0xb4,0xe9,0x5c,0x62,0x41,0x5f,0xca,0x56,0x53, + 0x2e,0x56,0xce,0x72,0x4a,0x48,0x4c,0x9e,0x74,0x2a,0xa8,0x85,0xa2,0xa5,0xb1,0x3, + 0xef,0x2a,0x14,0xb4,0xff,0xae,0x39,0xd,0xc1,0x96,0xe,0x35,0xb7,0x3e,0x68,0xcf, + 0xad,0xa4,0x9c,0x9b,0xa2,0xf5,0x80,0x83,0x2f,0xf6,0xc6,0x90,0xb1,0xd6,0xf1,0xd, + 0xac,0xfb,0x66,0x1b,0x6d,0x8a,0x3d,0x49,0xcd,0xb2,0x32,0x90,0x88,0xfc,0x3f,0xce, + 0x82,0xad,0x38,0x1b,0xbe,0xf2,0x11,0xa7,0xc4,0x25,0x54,0x22,0x1e,0x85,0xf5,0x2e, + 0x65,0x2c,0x77,0x14,0xb8,0x6a,0xe1,0xa3,0x55,0xc5,0x20,0x16,0x1d,0x96,0xb6,0xa5, + 0xcb,0x8b,0x9d,0x88,0x2b,0x14,0x93,0x45,0x64,0x30,0xb2,0x94,0xe8,0x72,0x26,0x5f, + 0x82,0x28,0x94,0x50,0x52,0x2f,0xd9,0xa9,0x92,0x0,0x76,0x24,0x43,0x2e,0xad,0x71, + 0x29,0x8b,0xeb,0x2c,0x81,0xa9,0x59,0x13,0x36,0x62,0xfc,0x6a,0xee,0x8f,0xce,0x89, + 0xb5,0x42,0x99,0x8c,0x4f,0x5a,0x4a,0x32,0x93,0x2e,0x76,0x4c,0x2a,0x66,0xb5,0x90, + 0xf1,0xa0,0x62,0x9e,0x50,0x94,0x2a,0xb0,0x8e,0x17,0x55,0xb7,0x4,0x4b,0xd2,0xa1, + 0x8e,0x41,0x95,0xae,0x52,0x4a,0x2,0x58,0x6,0x69,0x53,0x81,0xc3,0x22,0x1a,0x3, + 0x48,0x43,0xb0,0xe0,0xab,0x5d,0x70,0x9a,0xcb,0xed,0x4a,0xb,0x6b,0x1,0x59,0xb9, + 0xb,0x96,0xb8,0x8a,0x66,0x9c,0x41,0x4b,0xc8,0xa8,0x86,0x5a,0xbc,0x29,0x5d,0xc2, + 0x3,0xf1,0x9b,0x38,0x4d,0xe2,0x9a,0x51,0x1d,0x90,0x34,0x23,0xd,0x4e,0x8c,0x9b, + 0xca,0x3d,0x6b,0xdd,0x90,0x98,0x1e,0xd,0x9,0xca,0x9b,0x82,0x2b,0x4d,0x74,0xaf, + 0x8e,0x9,0xea,0x59,0xcc,0xb7,0x1c,0xa2,0x4c,0x6c,0x3d,0x48,0xb8,0x70,0x15,0xf6, + 0x5c,0x52,0x7e,0xa7,0x1a,0x5c,0x22,0xa8,0x0,0x9b,0x78,0x73,0x73,0x16,0xbd,0xe3, + 0xea,0x87,0xf1,0x66,0x6a,0x41,0x9e,0x61,0x39,0x1c,0xce,0x7e,0x42,0x71,0x8b,0xf1, + 0x60,0x78,0xc2,0xd6,0x5a,0x97,0x46,0x63,0x63,0x31,0x67,0xc3,0x86,0xac,0xb1,0x54, + 0x61,0xc3,0x5d,0xb6,0xfe,0x50,0x7,0xdb,0x24,0xc9,0x11,0xeb,0xfd,0x94,0xd1,0x96, + 0xd2,0xeb,0x5c,0xc0,0x97,0x13,0xeb,0x6,0x35,0xa0,0x49,0x6b,0x8e,0xf0,0xdf,0x10, + 0x53,0xa4,0x27,0xcb,0xb1,0xe0,0x39,0x8,0xd,0x60,0xb8,0x2e,0x83,0x5e,0x5a,0x25, + 0x56,0x19,0xa9,0x81,0xf7,0xa8,0x5,0x17,0xc5,0x23,0xa4,0x5d,0xa7,0x75,0x39,0x12, + 0x93,0x76,0xa,0x14,0x37,0x24,0x82,0xf7,0x14,0xbf,0x37,0x5e,0xa9,0x96,0x39,0xba, + 0xe3,0x31,0x87,0x2c,0x4e,0x4,0x21,0x9d,0x9f,0xba,0x39,0xaa,0xe9,0x4c,0x1c,0xb9, + 0x1d,0x9b,0xda,0x23,0x2b,0xde,0x7e,0xcc,0x6f,0x85,0x82,0x31,0x5d,0x85,0x51,0xda, + 0xf0,0x42,0x48,0x36,0xa2,0xc7,0x82,0x54,0xee,0x8b,0x6b,0x35,0x9a,0x94,0x27,0xe, + 0x48,0x62,0x4,0x93,0x1a,0x8b,0x8d,0x34,0xfc,0x91,0x9,0x78,0xfe,0x99,0x47,0xc3, + 0x24,0x39,0x57,0x68,0x62,0x1c,0x9,0xdb,0xb2,0x5,0x30,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x2e,0x8e,0x2e,0x30,0x6,0x8c,0x12,0x63,0xb2,0x2,0xb1,0x52,0x1e, + 0xde,0xc,0x42,0x9e,0xb4,0xe3,0x33,0xdf,0x99,0x59,0x6b,0xe8,0xc2,0xee,0x5c,0x7a, + 0x27,0x4a,0xd0,0x3b,0xf4,0xfc,0xce,0x5a,0x6,0x6c,0x9d,0x9b,0x13,0x5b,0xb0,0x71, + 0xdd,0x2e,0x79,0x1a,0x1e,0x1b,0xb6,0x81,0x8a,0xe7,0x78,0x71,0x64,0x18,0xb0,0x2e, + 0x63,0xd6,0x5a,0x9f,0x77,0x10,0x7b,0x83,0x40,0x8,0xb4,0x30,0x91,0xdf,0x42,0x86, + 0x9,0x36,0xfa,0xb8,0x89,0x22,0xca,0xc5,0x1c,0xd,0x4a,0xb1,0xef,0x2a,0x8e,0x54, + 0x4c,0xed,0x12,0x19,0xd1,0x88,0xb9,0x8c,0x22,0x12,0xbe,0xee,0x3d,0x12,0x19,0xab, + 0x6a,0x12,0x96,0xf2,0x2f,0x41,0xe3,0xe5,0x3c,0x53,0xa2,0x68,0x33,0x20,0x26,0x41, + 0xca,0x5c,0xe3,0x92,0xa9,0x48,0x28,0x52,0xac,0x9c,0xc,0xa5,0x79,0x85,0xce,0xb4, + 0xa6,0x12,0x8c,0x82,0x45,0x1a,0x5a,0xa1,0x88,0xaa,0x41,0x95,0xa,0x8f,0x31,0x25, + 0xa5,0x91,0x92,0x50,0xa9,0x59,0x9f,0x50,0x42,0x6a,0xcb,0xed,0x38,0x49,0x91,0x1a, + 0x48,0xb1,0x70,0xc5,0xe3,0xc8,0xd7,0xfa,0x59,0x71,0xcc,0xa1,0x2b,0x95,0xca,0x46, + 0x42,0xd3,0x8,0xcd,0xf0,0xcd,0x19,0xfd,0xb1,0x83,0x93,0x64,0x43,0x82,0xea,0xf8, + 0xa4,0x46,0x94,0x95,0xb2,0x90,0x54,0x48,0x69,0x9e,0x16,0x9f,0x90,0x71,0x16,0xc1, + 0x89,0xa4,0xfd,0x21,0x62,0x7a,0x9a,0x30,0xad,0x1,0x84,0xa7,0x1d,0x15,0x1b,0x4f, + 0x79,0x51,0x46,0x0,0x24,0x4c,0xad,0x26,0xcd,0xaa,0x26,0x18,0xbe,0x80,0x54,0x52, + 0x14,0x19,0x17,0x17,0x96,0x12,0xca,0xd3,0x7e,0xdc,0xc0,0x78,0x6b,0xca,0x50,0x67, + 0x8c,0x80,0xd7,0x8d,0x84,0x2d,0x93,0x5c,0x8d,0xc5,0x64,0x2f,0x9c,0xe2,0x98,0x44, + 0x9,0xcf,0xec,0x9b,0x2a,0x81,0xd6,0x6e,0x44,0x6e,0x2d,0xe9,0x8e,0x4,0x99,0x6b, + 0x6c,0x4a,0x9d,0x12,0x7b,0x72,0xe3,0x53,0x2a,0x39,0x4e,0x32,0x14,0x36,0xb0,0x19, + 0x9b,0x84,0x92,0xd9,0x95,0xfb,0xa2,0x4a,0x16,0x76,0xea,0xcc,0x71,0xbc,0x14,0x17, + 0x96,0xc8,0x18,0xb,0xb6,0x44,0xc6,0xc0,0x5a,0xcb,0x15,0x18,0xb2,0xb0,0x5c,0x71, + 0x13,0x3b,0x55,0xfc,0xe4,0x2,0x58,0x17,0xf4,0x92,0x3c,0xb8,0x62,0x1d,0xd0,0x16, + 0xba,0x61,0x29,0x1e,0x21,0xf5,0x88,0x74,0x50,0x20,0xc2,0x85,0xa2,0x1e,0x9d,0xcb, + 0xc4,0xe,0x38,0xed,0x78,0x43,0x2e,0x8,0x47,0x66,0x5d,0xa2,0x2e,0xe6,0xe1,0x41, + 0x10,0x53,0x21,0xf5,0xc8,0xec,0x96,0xdc,0x1c,0x62,0xe6,0x7c,0xdd,0x95,0x1c,0xf0, + 0xb2,0xce,0x58,0x85,0x73,0x8b,0xbb,0x3f,0xe8,0x8f,0xa1,0x9c,0xd6,0x15,0x31,0xb, + 0x54,0xa1,0x94,0x97,0xce,0x9c,0x86,0x78,0xe2,0x64,0x6c,0xc9,0x1c,0xe3,0x49,0xe2, + 0x5e,0x3d,0xc4,0xf0,0x70,0xf4,0x79,0x29,0x18,0x4d,0x19,0x3f,0xd8,0xfb,0x3f,0xd1, + 0xf6,0x47,0x9a,0xc8,0x70,0x6c,0xa8,0x28,0xb1,0x6a,0x3d,0xe8,0x1e,0x7d,0x64,0x15, + 0xa1,0x7,0x29,0xf2,0x37,0x97,0x94,0x90,0x3e,0xd,0x24,0x1d,0x5d,0x5c,0x87,0x46, + 0x2e,0x43,0x24,0x5,0x86,0xa9,0x98,0x82,0x87,0x92,0xb9,0x2d,0x1a,0x5d,0xa9,0x45, + 0x15,0x47,0xec,0xc3,0x37,0xef,0x6e,0x60,0xf2,0x84,0x83,0x18,0x6b,0x1e,0x3e,0x27, + 0x34,0xc7,0x1e,0x46,0xf2,0xdb,0x6c,0xef,0xe7,0x66,0x1c,0x28,0x6e,0x5d,0x88,0x30, + 0x47,0x75,0x1a,0x59,0x43,0xce,0x2d,0x82,0x2d,0xfb,0xc9,0xdd,0x5a,0xc3,0x64,0xac, + 0x6f,0x7e,0xfd,0x7f,0x44,0x67,0x15,0xf6,0x6c,0x3,0xb2,0x4,0x76,0xe1,0x2d,0x49, + 0x44,0x6f,0xe0,0x34,0x6d,0x59,0x6c,0x2a,0xb2,0xa0,0x4e,0x1d,0x7b,0x6a,0x44,0xda, + 0x67,0x40,0x29,0x53,0xf2,0x27,0x17,0xec,0xc6,0x8d,0xa,0xd,0xcb,0xcd,0x64,0x64, + 0xe1,0xab,0x7a,0x2f,0x6b,0x5,0xc8,0x73,0xb1,0xbf,0x85,0xf6,0x9c,0xa6,0x12,0xf0, + 0x30,0x9f,0xc2,0xf5,0x25,0x20,0xf7,0x82,0x44,0x65,0x20,0xbe,0x28,0xfe,0x12,0x1e, + 0xb,0x14,0x27,0x96,0xbb,0x45,0xe9,0xf9,0x1d,0x8d,0x26,0x74,0x3e,0xbb,0x60,0xc1, + 0x72,0xa9,0x30,0x48,0x96,0x2e,0x4d,0x0,0x54,0x12,0xac,0x60,0x91,0x59,0x8,0x17, + 0x65,0x25,0xd5,0x2b,0x48,0xcb,0xfd,0x89,0x18,0xe1,0x3c,0x41,0x2a,0x94,0x6,0x2, + 0x54,0x80,0xcc,0xb9,0xd0,0xdc,0xe6,0x1b,0x11,0x69,0xd,0xab,0xf2,0xaa,0x73,0xde, + 0x1f,0x53,0x26,0x45,0xcb,0x3d,0x2c,0x58,0xaf,0x82,0x5,0x64,0x4f,0x65,0xa9,0x9f, + 0xa9,0xa7,0xd6,0x8d,0x91,0x42,0x74,0xa8,0xf0,0xfb,0xf3,0x8f,0x43,0xeb,0xd4,0x3, + 0x66,0x9e,0xc9,0x24,0x29,0x42,0x13,0xd1,0xd8,0x42,0x44,0x4a,0x31,0xa5,0xa2,0x62, + 0x42,0xa1,0xa9,0x78,0xa8,0x17,0x1e,0x62,0x67,0x31,0x9,0x9a,0x30,0x4d,0x82,0x9c, + 0x92,0x2b,0xd,0x9d,0xb1,0xc0,0x44,0x83,0x93,0x64,0x4e,0x23,0x22,0xfd,0x48,0x1d, + 0x73,0x9c,0xa4,0x5c,0x7a,0xfb,0x2b,0x15,0x6b,0xd0,0xfa,0x14,0x2a,0x7b,0x43,0x93, + 0x13,0xa6,0x58,0x6d,0xa,0x29,0xb5,0x96,0x53,0x3a,0x68,0xdc,0x89,0x77,0x48,0xa, + 0x5d,0xc8,0xb8,0x4d,0xad,0x63,0x61,0x87,0x43,0xd4,0xc0,0x90,0x35,0x6c,0xd,0x33, + 0x5b,0x9f,0xd6,0x61,0x3,0xd3,0xcd,0x11,0x83,0x8d,0x73,0xaf,0x6,0x99,0xb8,0x23, + 0x8e,0x7,0xe,0x67,0x90,0xa8,0x44,0x34,0x8c,0xfb,0xe9,0x9e,0x83,0xe0,0xac,0x50, + 0x4c,0x20,0xca,0x19,0x5f,0x70,0x8c,0x37,0x46,0x75,0xd0,0xba,0x49,0xc4,0x42,0x48, + 0x81,0xa0,0x84,0x89,0x88,0xa9,0x40,0x95,0xa6,0x12,0x9f,0xa,0x69,0x7a,0x63,0xa0, + 0xd7,0x53,0xd1,0x57,0x5f,0xee,0x73,0x49,0x99,0x21,0x82,0xb2,0x3,0x33,0x69,0x14, + 0xa3,0xc2,0x9,0x49,0xff,0x15,0xdc,0xd9,0xfd,0xdd,0x69,0x39,0x41,0x19,0xde,0xdc, + 0xc4,0xe9,0xcf,0x53,0xec,0x3c,0xac,0xdb,0x7f,0xc4,0xcb,0x3f,0xb4,0xab,0x96,0x61, + 0x29,0x11,0xb7,0xa4,0x2d,0x9f,0x5a,0x45,0x47,0x83,0x43,0x8,0x4,0x9,0x52,0xcb, + 0x1f,0x5e,0xfb,0x24,0x1,0x34,0x82,0x89,0xec,0x7d,0x16,0x90,0xf2,0xe6,0xa5,0x90, + 0x33,0xdb,0x90,0xaa,0xc3,0xa1,0x10,0xf7,0xc9,0xca,0x26,0x41,0x17,0x96,0x92,0x1f, + 0x94,0x1c,0x24,0x4b,0xe8,0x40,0x72,0x98,0x48,0xe2,0x9,0xff,0x42,0xfa,0x52,0x47, + 0xe9,0x4c,0x65,0x36,0xa4,0xd5,0xc3,0xe1,0x9d,0x10,0x42,0x29,0xf8,0x32,0x1e,0xb0, + 0x1b,0xf2,0xc4,0x3,0xb,0x76,0x3a,0x42,0x30,0xac,0xe3,0x91,0xa0,0x52,0x31,0x60, + 0xeb,0x60,0x78,0x3,0xc3,0xcc,0xd6,0x38,0x13,0x78,0xeb,0x24,0x21,0x6c,0xd9,0x54, + 0xc,0x71,0xd7,0x32,0x3b,0x64,0x8b,0xd9,0x80,0x6d,0x97,0x25,0x7f,0x28,0x66,0x14, + 0xd8,0x8,0xdb,0x38,0x4f,0x7d,0x66,0x56,0x83,0x19,0x4b,0x70,0x22,0x3f,0xe,0x8a, + 0xe,0x9c,0x72,0x6d,0x2c,0xd3,0xe7,0x19,0x25,0x96,0xe1,0x1,0x4d,0xf,0x88,0xad, + 0x83,0xdc,0xa9,0x64,0xd8,0xce,0xfd,0x4e,0x73,0x2,0xbd,0x74,0x30,0x84,0x12,0xa9, + 0xc5,0x6c,0xf5,0xe0,0x85,0x2f,0x4d,0xea,0xa3,0xee,0x18,0x5,0xe8,0x95,0xe5,0x3e, + 0x3b,0x3c,0xd,0xca,0x25,0x68,0x61,0xda,0xc,0x92,0x63,0x4e,0xba,0x39,0x25,0x9f, + 0x52,0xa8,0x8e,0x9a,0xe8,0x59,0x16,0xe2,0x78,0x55,0xe5,0x4e,0x13,0x9c,0x3d,0x67, + 0x2a,0xc9,0x9a,0x21,0x5,0xfd,0x13,0x6b,0xb8,0x4c,0xa5,0xac,0x11,0x21,0x6f,0xab, + 0xd4,0xb4,0xaf,0x20,0xf3,0x92,0x73,0x94,0x35,0xc2,0x50,0x64,0xb1,0xf7,0x78,0xff, + 0xa8,0x7,0xcb,0x9d,0xf3,0x5b,0xb9,0x24,0x20,0x84,0xca,0x7f,0x34,0x65,0xe6,0x8, + 0x79,0x85,0x22,0xe2,0xd2,0x6f,0xa4,0x3c,0x32,0x54,0x7e,0x5c,0x66,0xfb,0x92,0x3e, + 0x3c,0xc,0xc9,0xa8,0xc8,0xc4,0x56,0x4f,0x93,0x75,0x5c,0xad,0x9b,0x0,0x3d,0x86, + 0x7d,0x39,0x2a,0xf0,0x53,0xa2,0xf1,0x93,0x24,0x49,0xc3,0x13,0xa3,0xc,0x50,0xa0, + 0x8b,0x77,0x94,0x9,0x49,0x67,0x13,0x32,0x89,0x84,0x10,0xa7,0x18,0x13,0xfd,0xff, + 0x28,0x9f,0x7a,0x44,0x6,0x78,0x28,0xde,0xfd,0xfd,0x75,0xc,0xf6,0x35,0xa8,0xaf, + 0xaf,0x8e,0x81,0x46,0x1d,0x7d,0x8d,0x3a,0x9a,0x8d,0x1a,0xfa,0xfb,0xea,0xd4,0xdf, + 0xa8,0xa3,0x5a,0x21,0xe7,0x94,0x49,0x40,0xb7,0x6b,0xd1,0xe9,0x58,0xde,0xd9,0x3f, + 0xc2,0xfa,0xf6,0x1,0x9e,0xad,0x6e,0xf3,0xd6,0xfe,0x41,0x8a,0x41,0x2d,0xb8,0x2a, + 0xf8,0xa9,0xc4,0x58,0xeb,0x4f,0x78,0x30,0xac,0x1,0x19,0xeb,0x42,0xac,0xfc,0x4e, + 0xde,0x1a,0xa7,0xde,0x21,0x72,0x7b,0x75,0xef,0xa9,0xe0,0xea,0x50,0xb2,0xa8,0x55, + 0x4f,0x23,0x4c,0xe5,0x50,0x70,0x79,0xdc,0x9c,0x7,0x85,0x94,0xc0,0x3e,0x4c,0x80, + 0xe6,0xc3,0xae,0xdd,0x19,0x72,0x27,0x12,0x63,0x61,0x8d,0x98,0xf6,0xbc,0xd2,0x6e, + 0xc0,0xf9,0x7f,0x19,0x21,0x22,0x14,0x10,0x3a,0xe7,0x13,0x8b,0xca,0xd9,0xcc,0xec, + 0x85,0x49,0xeb,0xa2,0xd4,0xdd,0xc0,0x19,0x1a,0xe9,0x5d,0x5,0x38,0xed,0xb0,0x23, + 0xd3,0xd9,0x23,0x45,0x69,0x92,0xf0,0xaa,0xac,0x90,0xe0,0xed,0x3f,0x48,0x29,0x93, + 0x1e,0x6c,0x10,0x7c,0xca,0x8c,0x33,0xed,0x4b,0x1c,0xc7,0x18,0xc,0x28,0x91,0xb2, + 0xf8,0x7a,0x50,0xa2,0xb8,0x9a,0xa0,0xe5,0xf,0x13,0x7a,0x82,0x22,0x3,0x0,0x4f, + 0x1e,0x6b,0xf0,0xea,0x83,0x84,0x5,0x7a,0x34,0x2b,0xd3,0xb9,0xb0,0xc4,0xf1,0xc1, + 0x0,0x6a,0xb5,0xa,0x6,0x9b,0x75,0x34,0x1b,0x75,0x6a,0x36,0x6a,0xe8,0xab,0xd7, + 0xd0,0xa8,0x55,0xd1,0xec,0xab,0xa3,0x5e,0xad,0x50,0xad,0x6a,0x50,0x31,0x6,0xc6, + 0xb8,0x7f,0x93,0x21,0xd4,0x8c,0x47,0x98,0x1c,0xd5,0xc,0x96,0x2d,0x6c,0xf0,0xc7, + 0xb0,0x8c,0x2e,0x5b,0x74,0xba,0x8c,0x4e,0xa7,0x8b,0x93,0x4e,0x17,0xed,0x93,0xe, + 0x77,0x3a,0x16,0x27,0xdd,0xe,0xda,0xed,0x2e,0xb5,0x3a,0x1d,0xb4,0x5a,0x27,0x38, + 0x68,0x1d,0x73,0xeb,0xf8,0x4,0xdd,0x2e,0xcb,0xa6,0x2a,0x1a,0x1a,0x71,0xcc,0xe9, + 0xc8,0x38,0x56,0x24,0xc2,0xc3,0x4c,0x60,0xff,0xb9,0xcb,0x1a,0x20,0x22,0xb,0xeb, + 0xd4,0xf,0xd6,0x13,0xfb,0xd,0x93,0x89,0xec,0x45,0xb8,0xd9,0xdb,0x7a,0xd8,0x9d, + 0x45,0xbc,0x97,0x5,0xd8,0x90,0x31,0xc,0x8b,0xb0,0xd7,0x8a,0xc2,0x37,0x90,0xcc, + 0x2e,0x15,0x39,0x2,0x3a,0xd,0x56,0x57,0x3c,0xbd,0x88,0x83,0x34,0x9c,0x52,0x48, + 0x72,0xbe,0xd4,0x64,0xb5,0x86,0xd6,0x8,0xab,0x3c,0x97,0xab,0x2c,0xa1,0x6d,0xa5, + 0xa1,0xa3,0x82,0x23,0x90,0xca,0xe9,0x2e,0x21,0xd2,0x91,0xb2,0x74,0xa5,0x42,0x1, + 0x28,0xc5,0xa0,0x95,0x40,0x97,0x94,0x56,0x91,0x44,0x71,0x92,0x30,0x38,0x51,0x89, + 0x46,0x1b,0x72,0x9f,0xdc,0x23,0xdb,0x26,0x7b,0x1e,0xc5,0xc9,0x5d,0x1a,0xda,0xc8, + 0x6a,0xc4,0x99,0x49,0xb,0x17,0xf7,0xf,0xaa,0xe7,0x35,0x2f,0x72,0xb0,0x57,0x49, + 0x6c,0x4c,0xac,0xa5,0x6d,0x65,0xeb,0xc,0x92,0x40,0x7f,0x1e,0xc9,0xca,0xe5,0x94, + 0x78,0x42,0x76,0xe9,0x48,0xfb,0xe1,0x5e,0x54,0xfa,0x2,0xcb,0x48,0x1,0xf0,0xc5, + 0xb5,0x4d,0x4e,0x49,0xe4,0x22,0xb,0x51,0x12,0x3e,0x73,0x6d,0xba,0x9c,0xa,0x2, + 0x21,0x47,0x98,0xc8,0xb0,0x40,0xe5,0x54,0x21,0x50,0x76,0x97,0x70,0xa4,0x2b,0x7, + 0x9a,0x1b,0x27,0xcb,0xf1,0x90,0xaf,0xdf,0xdd,0x26,0x6,0x7b,0x28,0x3e,0x71,0x8f, + 0x6e,0x48,0x76,0x66,0x71,0xc2,0x49,0x1a,0x34,0x82,0x49,0x68,0x79,0xf0,0xc1,0x14, + 0x65,0x3e,0xf7,0x3d,0x20,0xe1,0xe2,0xc3,0x51,0xb0,0xb,0x6a,0x36,0xaa,0x18,0x1d, + 0x1c,0xc0,0xa9,0xe9,0x11,0x9a,0x9b,0x1c,0xc5,0xdc,0xe4,0x30,0x66,0xc6,0x87,0x69, + 0x6a,0x62,0x10,0x53,0x63,0x43,0x98,0x1e,0x1b,0xa2,0x99,0xf1,0x61,0xf4,0x35,0xaa, + 0xa8,0x54,0x2a,0x20,0x22,0x74,0x3a,0x1d,0x1c,0x1e,0x77,0x70,0xef,0xf1,0x73,0xfe, + 0xfc,0xbb,0x25,0xfc,0xf2,0xf3,0xbb,0xf6,0xeb,0x7b,0xcf,0xb0,0xb2,0xb9,0x1b,0xe8, + 0x3e,0xd1,0xe9,0x4d,0xf1,0xb8,0xc9,0x18,0x66,0x77,0xea,0x18,0xe7,0xdb,0x4e,0x64, + 0xc8,0xed,0xd3,0x3d,0x5a,0xcc,0xb6,0x42,0xc4,0xc,0x4b,0x36,0xb9,0xe4,0xf8,0x4b, + 0x97,0xc5,0x96,0x52,0xc8,0xe1,0x3,0x61,0x2a,0xc2,0xe7,0x9,0xf5,0x30,0x26,0x70, + 0xe,0x9c,0x8f,0x3c,0x87,0xa4,0x78,0x13,0xc8,0x73,0xd1,0xe7,0x2c,0x8d,0x88,0x4, + 0x4a,0xf9,0xe8,0x71,0x53,0x67,0x4,0xbc,0x1e,0x1a,0x7d,0xc3,0x14,0x77,0x45,0xa2, + 0x71,0x74,0x4f,0x8b,0x33,0xc2,0xac,0xb8,0xae,0xbc,0xe7,0xbb,0x36,0x3a,0xc,0xde, + 0x7d,0xc2,0x4d,0x25,0xf5,0x94,0xa1,0x28,0xfb,0x62,0x60,0x2,0xef,0x4d,0x49,0x6a, + 0x59,0xb0,0x7a,0xe5,0x72,0x20,0xa8,0x95,0x38,0x4c,0xde,0x3e,0xb9,0x53,0xdc,0x94, + 0xd2,0x64,0x6,0xae,0x55,0x11,0xa,0x11,0x71,0x58,0x9b,0xb4,0x9b,0xf1,0xad,0x96, + 0x91,0xec,0x38,0x9f,0xc1,0x2e,0xf8,0x23,0xfe,0xf4,0xa,0x2b,0x2a,0x8e,0xc,0x38, + 0x12,0x11,0x46,0x1c,0xd7,0xf1,0x9c,0x11,0xb2,0x4c,0xc5,0xd0,0xd8,0x50,0x1f,0xa6, + 0xc7,0x87,0x68,0x76,0x7c,0x18,0x13,0xa3,0x3,0x18,0x1f,0x19,0xc4,0xc4,0xe8,0x0, + 0x4d,0x8e,0xe,0x61,0x62,0xa4,0xf,0xc3,0x3,0x7d,0xe8,0x6b,0xd6,0xa9,0x5e,0xad, + 0xa0,0x5e,0xab,0xa2,0x5e,0x73,0xff,0x6e,0xd4,0xab,0xa8,0x57,0x2b,0xb0,0x96,0x71, + 0xd2,0xb5,0xe8,0x74,0x2d,0xd8,0x32,0x3a,0x5d,0x8b,0x4e,0xb7,0x8b,0x4e,0xd7,0xa2, + 0xd5,0x3e,0xc1,0xe1,0xd1,0x31,0xf6,0xe,0x8f,0xf9,0xe0,0xa8,0x4d,0xfb,0x47,0x2d, + 0xec,0x1f,0xb6,0xb1,0xbb,0x7f,0x84,0xed,0xfd,0x23,0xde,0xd8,0xda,0xc7,0xca,0xc6, + 0x2e,0x2d,0x6f,0xec,0xf2,0xfa,0xf6,0x3e,0xe,0x8e,0x8e,0x5d,0x78,0x1d,0x92,0xc7, + 0xf,0x89,0x70,0xa3,0xd0,0xc6,0x5b,0x4e,0x2b,0x8e,0xd0,0x26,0x86,0x28,0x17,0xcf, + 0x31,0x61,0x36,0xae,0x9c,0x93,0x35,0xce,0xea,0xc7,0x10,0x60,0x8d,0x67,0x8d,0xb0, + 0x8f,0x68,0x33,0x6e,0xd6,0x76,0x41,0x3b,0x36,0xb4,0x12,0x1c,0x49,0x3b,0x22,0xdf, + 0x8f,0xa2,0xe0,0x30,0xdc,0x19,0x2c,0xf2,0x3a,0x48,0x67,0xa5,0x27,0xf3,0x3d,0x16, + 0xab,0xe7,0x38,0x5a,0xca,0xa0,0x29,0xd6,0x0,0x14,0x67,0x41,0x5a,0x9a,0xb0,0x2c, + 0x51,0x69,0xb1,0x96,0x9a,0x7c,0xe3,0x2f,0x3e,0x2b,0xa5,0x22,0xe7,0xf4,0xf8,0xd2, + 0xf3,0xbf,0x34,0x48,0x53,0x89,0x47,0x72,0xd7,0xb2,0x34,0x81,0x53,0x4f,0xc9,0xbd, + 0x9e,0x32,0x8b,0x5f,0x5f,0xfc,0xaf,0x17,0x89,0xca,0xd0,0x43,0x76,0x97,0x6b,0x28, + 0xf3,0xe2,0x5f,0x7c,0x55,0x9,0x59,0xc,0xaa,0x5c,0xec,0x17,0x8,0x5f,0xa1,0x48, + 0xe5,0x7a,0x1b,0xd6,0x3c,0xa8,0xa2,0xb9,0xab,0x60,0x8a,0x97,0x18,0x8,0x20,0xf, + 0xc4,0xc1,0x8b,0x65,0x80,0xa5,0xa,0x82,0x7c,0xd5,0xc1,0x5,0x14,0x86,0x7b,0x91, + 0x57,0x55,0x48,0xf,0x95,0xff,0x9e,0x1e,0xf1,0xe6,0xb9,0x34,0x8f,0x4,0xe7,0x11, + 0x22,0xdf,0x4,0x46,0xe4,0x92,0x8b,0x54,0xa8,0x68,0x7d,0x49,0x26,0x4e,0xde,0x6e, + 0x63,0xee,0x77,0xb9,0x1e,0x6a,0x4f,0x66,0x96,0xa2,0xa8,0x93,0x37,0x6d,0xf,0xcc, + 0xea,0xe4,0x70,0x1d,0x68,0x3a,0xa4,0xf2,0x56,0x3,0x32,0x10,0x81,0x9c,0xf8,0xd0, + 0x62,0x56,0x76,0xa0,0x3e,0xb,0x4e,0x1b,0xa6,0x46,0x7,0x69,0x72,0x6c,0x10,0xd3, + 0x63,0x43,0x34,0x35,0x36,0x84,0xc9,0x31,0x77,0x28,0xe,0xf,0xf4,0x61,0xa8,0xbf, + 0x89,0xfe,0x66,0xd,0x3,0xcd,0x86,0x9b,0xc8,0x9b,0x75,0xf4,0x37,0xeb,0xe8,0x6b, + 0xd6,0xd1,0x57,0xaf,0xa2,0x56,0xab,0x4a,0x31,0x53,0xb4,0x7a,0x3c,0x38,0x6a,0x63, + 0x7d,0x7b,0x1f,0x6b,0x5b,0x7b,0xfc,0x78,0x65,0xb,0xf7,0x9e,0xac,0xf2,0x47,0x5f, + 0x3d,0xe0,0xcf,0x6f,0x3f,0xb1,0xdd,0xae,0xd,0xea,0xa0,0xc4,0xdd,0x74,0xa3,0x92, + 0xd,0x26,0xb1,0x96,0xd9,0x3a,0x6c,0x10,0xd6,0xa7,0x51,0x59,0x76,0x49,0x21,0x9e, + 0xbb,0x6b,0xad,0xb7,0x90,0xf0,0x74,0x2f,0xe6,0xc8,0xcb,0x90,0xf9,0xe1,0xe1,0xd5, + 0xf4,0xd3,0xb8,0xda,0x9b,0xbb,0xd5,0x87,0x71,0xaa,0x28,0x63,0xa4,0xe3,0x1e,0xbb, + 0x98,0xe8,0xa0,0x87,0x8e,0x43,0xa1,0x34,0x66,0x9e,0x9d,0x1c,0xa1,0x6b,0x17,0xe6, + 0xe9,0xfa,0xa5,0x79,0x1a,0x19,0xec,0xc7,0xfe,0xc1,0x11,0x7e,0xf3,0xf5,0x23,0xfe, + 0xfa,0xfe,0x12,0xb6,0x76,0x8e,0x14,0x9d,0xb5,0xfc,0x8a,0x27,0x19,0xf,0x95,0x35, + 0xc4,0x81,0x9b,0x9e,0x7f,0x35,0x94,0xc9,0x9,0x14,0x7,0x48,0xa8,0x5c,0x52,0x32, + 0x83,0x8a,0x7a,0x10,0xcb,0x24,0x1f,0x43,0x2b,0x28,0x5e,0xcc,0x89,0x22,0x9c,0x32, + 0xbf,0xd3,0x67,0xc5,0xd7,0x50,0x16,0x36,0x95,0xf8,0xc2,0x3a,0x38,0x80,0x49,0x13, + 0xde,0x44,0xaa,0x20,0xe9,0xbd,0x5,0x44,0x28,0x51,0xca,0x2d,0x8,0x8a,0x9c,0xc1, + 0xfe,0x26,0xcd,0x4d,0x8e,0x60,0x66,0xc2,0x35,0x91,0x33,0x93,0xc3,0x98,0x1a,0x1b, + 0xa2,0xf1,0x91,0x7e,0xc,0xf6,0x35,0xd0,0xac,0xd7,0xd0,0xd7,0xa8,0xa1,0x51,0xaf, + 0x51,0xb3,0x5e,0x45,0x7f,0xb3,0x8e,0x46,0xcd,0x5d,0x9f,0xd5,0x8a,0x41,0xc5,0x10, + 0xaa,0xd5,0x8a,0x5a,0xbf,0xb3,0xc8,0x98,0x90,0xd7,0x2f,0xe0,0xc2,0xff,0xba,0x5d, + 0x1b,0x8b,0x7d,0xbb,0xdd,0x71,0x93,0x7a,0xa7,0x83,0x93,0xae,0x45,0xbb,0x7d,0x82, + 0xd6,0x71,0x87,0xf,0x5a,0xc7,0x68,0x1d,0x77,0xb0,0x7f,0xd4,0xc2,0xfe,0x51,0x1b, + 0x3b,0x7b,0x47,0x58,0xdf,0xde,0xe3,0xd5,0x8d,0x3d,0x2c,0x6f,0xec,0xf0,0xf2,0xda, + 0x2e,0x56,0xb7,0x77,0x99,0xbb,0x71,0xd1,0xc9,0x5a,0x53,0xc8,0x88,0xa,0x73,0x82, + 0x10,0x97,0x39,0x71,0x66,0xd4,0x9e,0x3b,0xff,0x3e,0x8e,0x32,0x4e,0x76,0xa6,0x7e, + 0x60,0x6b,0xb9,0xb,0xb,0x74,0xad,0xff,0x6e,0xcb,0xb6,0x6b,0xc3,0xbd,0xe4,0x3e, + 0xe7,0xfc,0xe2,0xad,0x92,0xc4,0x45,0xdf,0x38,0xe,0x26,0xf5,0x7a,0x60,0xcc,0x8, + 0xae,0x92,0x70,0x8a,0x5c,0xb9,0xa1,0x17,0xba,0xc5,0x9a,0x85,0x62,0xad,0x11,0x83, + 0x76,0x95,0xa,0xb6,0xa9,0xe5,0x39,0xab,0x4a,0x15,0x6a,0x74,0xb1,0x29,0x17,0xc5, + 0x91,0xf2,0x45,0x57,0xd3,0x9e,0xec,0x5a,0x4a,0xa3,0x65,0xb8,0x60,0x76,0x52,0x90, + 0xfa,0x30,0x9,0x2f,0x71,0xa1,0x5b,0x16,0xc6,0xf8,0xba,0x38,0x66,0x26,0x2d,0x4c, + 0x8a,0xa8,0x57,0xa4,0x71,0xb,0x63,0x0,0xce,0x8a,0x39,0x17,0xb,0xa5,0x2e,0x56, + 0x32,0x66,0xb4,0x18,0x70,0x9f,0x18,0xbb,0xe1,0x71,0x53,0xc2,0x6c,0xf2,0xec,0x70, + 0x92,0x42,0x22,0x8,0x9a,0x99,0x4c,0x8f,0xd0,0xc1,0x2f,0xcc,0x45,0x17,0xb7,0x3c, + 0x5d,0x2d,0x34,0x93,0xb9,0xc2,0x82,0x45,0x95,0x25,0x70,0x66,0xab,0xab,0x13,0xd9, + 0xf4,0xde,0x2d,0x38,0x89,0x41,0xe9,0xd4,0xd5,0x1a,0x94,0xf2,0xde,0x45,0xd8,0xbf, + 0x9a,0xb8,0xbd,0x29,0x68,0xb7,0x61,0x1c,0xb5,0x2d,0xf8,0x58,0x7,0x66,0x2f,0x67, + 0xae,0x70,0xce,0x46,0xc6,0x10,0xf9,0x7d,0xae,0x31,0x30,0xc,0xc9,0xba,0x76,0xa5, + 0xd9,0xf8,0x82,0xe3,0x6c,0x9b,0x49,0x84,0xa0,0x32,0x85,0x85,0x7d,0x32,0x41,0xd1, + 0x10,0x25,0x33,0x83,0x2a,0x86,0x1a,0xd5,0xa,0x6a,0xb5,0x3a,0xb9,0x83,0xce,0xa0, + 0xbf,0x51,0xc7,0xc4,0xe8,0x20,0x2d,0x4c,0x8f,0xe2,0xd4,0xf4,0x28,0x9d,0x9a,0x1e, + 0xc3,0xc2,0xf4,0x8,0x4e,0x4d,0x8f,0xd1,0xdc,0xd4,0x8,0x1a,0xbe,0x58,0xcb,0x43, + 0x2f,0xff,0xef,0x18,0xf3,0x2c,0xe,0x44,0x22,0xc2,0x60,0x7f,0x3,0x83,0xfd,0xd, + 0x9c,0x99,0x1b,0xa7,0xf7,0x5e,0x3f,0x83,0x47,0xcb,0x9b,0x34,0x31,0x32,0x60,0xeb, + 0xb5,0x8a,0xb9,0xf3,0x78,0x9d,0xb7,0x76,0xf,0xd0,0xb5,0x5d,0x78,0x7,0x8c,0xb4, + 0x9c,0xf5,0xe9,0xce,0xee,0x25,0x36,0x88,0x4e,0x73,0xee,0x56,0x70,0x4b,0x77,0x76, + 0x94,0x1f,0x1b,0xf6,0x92,0x61,0xb5,0x2e,0xd,0xfa,0x42,0x35,0x31,0x51,0x3c,0xe6, + 0xcb,0x76,0x68,0x9e,0x3c,0xf4,0xce,0x62,0xf5,0x21,0x34,0xea,0x46,0x85,0xb3,0x24, + 0xa,0x7b,0x70,0xd1,0x9d,0x1c,0x1b,0xa4,0x1f,0xbe,0x79,0xce,0xfc,0xfe,0x7b,0x97, + 0xe9,0x87,0x6f,0x5e,0xa0,0xc9,0xd1,0x1,0x6c,0xee,0x1c,0x62,0x7a,0x62,0x98,0x9b, + 0x8d,0x1a,0x7f,0xf4,0xf5,0x3,0xec,0x1f,0x1c,0xa3,0x56,0xad,0xa0,0x52,0x31,0xa8, + 0x1a,0x83,0x4a,0xc5,0xa0,0x56,0x31,0xa8,0x54,0x2b,0x71,0x4d,0x51,0x9,0x5b,0x17, + 0xb1,0x2e,0xd4,0x32,0xd3,0x70,0x17,0x73,0x30,0xcc,0x5,0x23,0x4c,0x92,0x96,0x6c, + 0xd7,0xa2,0xdb,0xb1,0x7c,0x62,0xbb,0xe8,0x76,0x2c,0x3a,0xd6,0xa2,0xd3,0xe9,0xa, + 0x5e,0x6c,0x50,0x76,0x8b,0xfb,0x23,0xd0,0x11,0x5d,0x63,0xe8,0x73,0xa4,0x3c,0x76, + 0xc0,0xce,0x71,0x8c,0x6d,0xa0,0x7b,0x45,0xcc,0xde,0x81,0xc4,0x36,0xcd,0x7e,0xf1, + 0x34,0x8b,0x29,0x9d,0x9e,0xe7,0x17,0x50,0xab,0x8,0x93,0xe8,0xac,0xb5,0x94,0xd0, + 0x2a,0xb3,0xb,0x1c,0x0,0x2,0x76,0xb9,0x2,0xcd,0x46,0x1d,0x8d,0x7a,0x95,0xfa, + 0x9b,0x35,0x4c,0x8c,0xc,0xd2,0xfc,0xd4,0x30,0xce,0x9e,0x9a,0xc4,0xe9,0xe9,0x31, + 0x3a,0x3d,0x3f,0x81,0xd3,0xb3,0xe3,0x34,0x3f,0x39,0xac,0x42,0xd1,0x7a,0x5d,0xab, + 0x52,0x76,0x2d,0x8b,0x79,0xfe,0x75,0xb2,0xc8,0x1b,0x77,0xbb,0xc5,0x86,0x15,0x3, + 0xfa,0x9a,0x4f,0x3c,0x76,0x7d,0x1f,0x6c,0xef,0x1e,0x62,0x69,0x6d,0x9b,0x1e,0xaf, + 0x6c,0xf1,0xc3,0xe5,0xd,0x7a,0xf8,0x6c,0x83,0x9f,0x3e,0xdf,0xa6,0x95,0x8d,0x1d, + 0x3e,0x3a,0x3e,0x41,0xbb,0xdd,0xa1,0x56,0xfb,0x84,0x8f,0x4f,0x3a,0xe8,0x74,0xba, + 0x91,0x9,0x1,0xc1,0x5b,0x12,0x1e,0x16,0x62,0xe5,0xcb,0x86,0x43,0x60,0x11,0x59, + 0x77,0x19,0x5a,0xb8,0xbc,0x54,0xc3,0xc4,0x1c,0x88,0x53,0x1c,0xd6,0x18,0xfe,0xd, + 0x49,0xac,0x6d,0xb2,0x89,0xd1,0x9e,0xc4,0x5c,0xdc,0x63,0x55,0x49,0x5,0x15,0x56, + 0x8e,0x9f,0x16,0x14,0x1b,0xa5,0x6d,0x6b,0x89,0xe8,0x8d,0x34,0x72,0x4a,0x93,0xd7, + 0xff,0xe2,0x33,0x12,0x32,0x2c,0x2e,0x90,0xbb,0x4a,0x48,0xa1,0xc8,0x4c,0x6,0x4a, + 0xed,0xfe,0xf4,0x54,0x96,0x85,0x91,0x95,0x1a,0xdf,0xa8,0xe1,0x1c,0x3d,0xec,0x62, + 0xa9,0x80,0x82,0xab,0x9d,0x1b,0x4a,0xe0,0x8a,0x5c,0x18,0x96,0xc,0x57,0x38,0x23, + 0x7a,0xe8,0xc7,0x29,0x33,0x6f,0x65,0x2a,0x1a,0x73,0xb6,0x2f,0xce,0xa,0x2e,0xa, + 0xd2,0x3a,0x2e,0xcd,0x34,0x47,0x8e,0x37,0x70,0x6a,0x56,0xa4,0xbb,0x9d,0x36,0x8d, + 0xc9,0x5e,0x6b,0xca,0xe6,0x77,0x9,0x8,0x88,0xdf,0x4f,0xf9,0x5c,0xcf,0xba,0x18, + 0xa3,0x44,0x19,0x59,0xc4,0x3a,0x24,0x71,0x32,0x31,0xda,0x74,0x83,0xc1,0xa5,0x97, + 0xb3,0x9a,0x87,0x94,0xfd,0x58,0x16,0x5f,0x47,0x32,0x6f,0x85,0x28,0x6a,0xcd,0xe3, + 0xcd,0x45,0x64,0xc,0xdc,0x8e,0xdc,0xef,0xc5,0x49,0xfe,0xdd,0x38,0xd3,0x67,0x63, + 0x8c,0x71,0xb6,0xca,0x26,0xb0,0xb0,0x1d,0x1c,0xcf,0x50,0x21,0x2c,0x9c,0x3c,0x35, + 0x83,0x1,0x34,0x45,0xad,0x2d,0xca,0x8,0x6e,0x84,0x91,0xe1,0x3e,0x3a,0x37,0x37, + 0x81,0xb,0x8b,0x53,0x74,0xfe,0xd4,0x24,0x9d,0x9e,0x19,0xc7,0xc2,0xec,0x18,0x46, + 0x87,0xfa,0xa9,0x56,0x35,0xa8,0xd7,0xaa,0xa8,0x55,0x5c,0xf1,0x69,0xd4,0x2a,0xa8, + 0x56,0x2b,0xea,0xa0,0xcb,0xf,0xc5,0xb2,0x3,0xf4,0x45,0xc5,0xff,0xe4,0xa4,0x83, + 0xa3,0x76,0x7,0x8f,0x57,0x36,0xf9,0x2f,0x3f,0xf8,0x9c,0xff,0xee,0xe3,0xef,0xec, + 0xfd,0xa5,0x35,0x66,0xcb,0x2c,0xa6,0x75,0xe,0x2,0x1e,0x8,0x53,0x19,0xcf,0xac, + 0xb6,0xfe,0x4b,0xac,0x65,0x96,0xba,0x5c,0xb0,0xd,0xc,0x6c,0x1b,0x8,0x5b,0xc4, + 0xce,0x7a,0xd5,0x93,0xda,0x4c,0xe0,0xb4,0x9b,0x90,0xac,0xe6,0x8e,0xc1,0x50,0xcc, + 0x95,0x99,0x89,0x60,0x63,0xfb,0xf7,0x30,0x98,0xee,0xf9,0x56,0xfb,0xca,0xb9,0x59, + 0xfa,0xa3,0x1f,0x5c,0xa5,0x3f,0xfc,0xfe,0x55,0xba,0xb8,0x38,0x4d,0x8d,0x5a,0x5, + 0x95,0x4a,0x5,0xdd,0x6e,0x17,0x27,0x5d,0x8b,0x8f,0x6f,0x3d,0xe2,0xff,0xf1,0x2f, + 0x3f,0xe4,0x27,0x6b,0x5b,0x68,0xd4,0xaa,0x18,0x1f,0x1e,0xc0,0xe4,0xe8,0x0,0x26, + 0x46,0xdd,0x44,0x39,0x31,0x3c,0x80,0xc9,0xb1,0x41,0x8c,0xd,0xf6,0x61,0x60,0xa0, + 0x49,0x15,0x32,0xa5,0xa8,0x5d,0x78,0xd,0x2d,0xb3,0x9b,0x16,0x4f,0x3a,0x7c,0xdc, + 0xee,0xe0,0xa8,0x7d,0x82,0xdd,0xfd,0x16,0x36,0x77,0xf,0xb1,0xb9,0xb3,0xcf,0x1b, + 0xdb,0x87,0xd8,0xd8,0xde,0xc7,0xda,0xce,0x3e,0x6f,0xee,0x1c,0x62,0x75,0x73,0x17, + 0x7b,0x7,0x2d,0xce,0x32,0x92,0xf5,0x31,0x17,0xa7,0x73,0xe6,0x3c,0x9f,0x12,0x82, + 0x2,0x1f,0xc9,0x45,0x60,0x4d,0xd0,0x93,0xb9,0x59,0xa9,0xf1,0x16,0x91,0x88,0x94, + 0xb7,0xc2,0xbd,0x52,0xff,0xa4,0x24,0x9f,0x0,0xc2,0xe4,0xe8,0x10,0x5d,0xbf,0x38, + 0x47,0x6f,0x5c,0x3c,0x85,0xd7,0xce,0xce,0xd2,0x99,0xb9,0x31,0x1a,0x1b,0x1a,0x40, + 0xb5,0x6a,0x50,0xab,0xb8,0x6b,0xb3,0x51,0xab,0xa0,0x5e,0xaf,0x15,0xae,0xc9,0xfc, + 0x7a,0xcc,0x3f,0xfe,0xb2,0xcf,0x95,0x35,0xab,0xa5,0x20,0x62,0xf6,0xf3,0xc2,0xdf, + 0xc3,0x35,0x70,0xdc,0xee,0xa0,0xd3,0xb1,0x38,0xe9,0x74,0x71,0x74,0xdc,0xc6,0xee, + 0x41,0x8b,0x1f,0xaf,0x6c,0xe2,0xce,0x93,0x55,0xfe,0xfa,0xfe,0x32,0xbe,0xb9,0xbf, + 0xcc,0xcb,0x6b,0x3b,0xcc,0x2c,0x19,0x51,0xc9,0xbf,0x3d,0x7e,0x20,0x5e,0xf7,0x62, + 0x52,0xb7,0xee,0xae,0x71,0x9,0xe8,0xfe,0xef,0x96,0x2d,0x82,0x29,0x13,0xac,0x65, + 0x66,0x4b,0x5d,0x77,0xf,0xb1,0xd,0xc8,0x97,0x47,0xb4,0xd8,0x6,0xb3,0x60,0x56, + 0xab,0x2a,0x8e,0x76,0x43,0x40,0x6e,0xda,0x4d,0xd1,0x74,0xa7,0x58,0xc4,0x94,0x1, + 0x99,0x9e,0x1a,0x75,0xfe,0x48,0x21,0x0,0x4,0x20,0x42,0xb5,0xb4,0x8b,0x60,0x91, + 0x77,0xad,0x2d,0xbe,0x34,0x6f,0x2a,0x2b,0xca,0x8a,0x8d,0x1b,0x9,0xc,0x89,0x49, + 0x1d,0x18,0xd1,0x9c,0x4d,0xdf,0x6a,0xfa,0xa7,0x92,0x5d,0xb3,0x22,0xb,0x24,0x16, + 0xbc,0xdc,0xf0,0x2a,0x1d,0x34,0xb,0xd9,0x16,0xe7,0x53,0x3c,0xab,0x69,0x91,0x73, + 0xb,0x5b,0x49,0xae,0x51,0xd2,0x30,0x9d,0x2e,0xa6,0xaf,0x48,0x46,0xc6,0x53,0x2c, + 0x36,0xa,0x48,0x50,0x1e,0xb,0x1f,0x2b,0x2e,0x1a,0x31,0x20,0x8b,0xc0,0xd1,0x52, + 0xbc,0xcc,0x30,0x47,0x96,0x4a,0x15,0x8b,0x9a,0xc5,0xa3,0x26,0x44,0x84,0x75,0x57, + 0xc8,0x89,0x89,0x4f,0x2f,0x28,0xc2,0xfa,0xf7,0x93,0x88,0x49,0xa4,0x8c,0x38,0x49, + 0x5,0x7,0x3d,0x45,0x31,0x50,0x1e,0xbb,0x61,0x7,0x1c,0xf8,0xdc,0x86,0x52,0xd8, + 0x12,0x11,0xab,0xb7,0xd3,0x84,0x14,0x74,0x2,0x55,0x1c,0xf5,0xc9,0x24,0xcf,0x70, + 0xb7,0x3d,0x8c,0xfe,0x32,0x8e,0xf0,0x46,0x95,0x60,0x68,0x62,0xa4,0xaf,0x3b,0x60, + 0x4c,0xc2,0x5b,0x4,0xcb,0x9d,0x92,0x91,0x78,0x34,0xc2,0x30,0x44,0x3,0xcd,0x3a, + 0xe6,0xa7,0x46,0x69,0x72,0x74,0x80,0x26,0xc7,0x6,0xb1,0x30,0x3d,0x4a,0xb,0x33, + 0x63,0x98,0x9f,0x1a,0xc5,0xec,0xc4,0x8,0xcd,0x8e,0xf,0x61,0x6c,0x64,0xa0,0xf4, + 0xf0,0x92,0x53,0x8,0x3b,0xa7,0xc9,0x38,0x9,0x11,0xd1,0x4b,0xf,0xb8,0x7c,0xa, + 0x2,0x80,0x5a,0xad,0x8a,0x7a,0xbd,0x86,0xeb,0x17,0x4f,0xd1,0x71,0xbb,0x3,0x0, + 0x66,0x6d,0x6b,0xdf,0xee,0x1e,0xb4,0x40,0xce,0xc2,0x5d,0xec,0x8e,0x3d,0xc0,0xc7, + 0x6,0x6c,0x2c,0xa9,0x4e,0xcf,0x72,0x64,0x71,0x83,0x9d,0xb7,0x3b,0x99,0x80,0x58, + 0x26,0x8b,0xdd,0x48,0xc1,0x97,0x3e,0xee,0x46,0xb9,0xbe,0x91,0x50,0xfa,0x45,0x2e, + 0x42,0x72,0xde,0x73,0x72,0xb5,0x10,0x2a,0x12,0x6e,0xa1,0xbe,0x46,0x83,0xde,0xb9, + 0x72,0x9a,0xfe,0xf9,0xf7,0xaf,0xd2,0xeb,0xe7,0xe7,0x48,0x4e,0x88,0x95,0x4a,0x5, + 0xc6,0x18,0xbc,0x79,0x69,0x81,0xfe,0xf4,0x27,0xd7,0xb1,0xb1,0x7d,0x80,0x5a,0xad, + 0x8a,0xa1,0xfe,0x6,0x46,0x7,0xfb,0x30,0x34,0xd8,0x47,0xc3,0x3,0x4d,0x8c,0xe, + 0xf6,0x61,0x64,0xa8,0xaf,0x80,0x80,0xf4,0x2a,0xe8,0xea,0xae,0x65,0x47,0xd4,0x3a, + 0x3c,0x3e,0xc1,0xce,0xfe,0x11,0x76,0xf,0x5a,0xb4,0xb3,0x7f,0xc8,0x3b,0x7b,0x2d, + 0xec,0x1d,0xb4,0x68,0xf7,0xb0,0x85,0xad,0xdd,0x3,0x6c,0xed,0x1e,0xf2,0xee,0xfe, + 0x31,0xb6,0xf7,0xe,0x78,0x7d,0xe7,0x0,0x6b,0x5b,0x7b,0xb4,0xb5,0x7b,0x98,0xd2, + 0xd5,0x64,0xa2,0xd,0xc4,0xc1,0x7,0xe9,0x19,0x43,0x21,0xd8,0x4b,0x2c,0x98,0xbc, + 0x97,0x59,0x74,0x68,0xcb,0x64,0x5d,0x52,0x2c,0xa9,0x33,0x76,0x65,0x8b,0x99,0xe0, + 0x78,0xff,0xf9,0x99,0x89,0x11,0xba,0xb8,0x30,0x49,0x73,0x53,0x23,0x58,0x98,0x19, + 0xa3,0xb3,0xf3,0x13,0x38,0x7f,0x6a,0x12,0x8b,0x33,0x63,0x34,0x32,0xd8,0xa7,0xae, + 0xa7,0x7c,0xc2,0x76,0x1c,0x3f,0xf3,0xc2,0xeb,0xf1,0x55,0x3f,0x97,0xf5,0xe7,0x78, + 0xd9,0x1f,0xeb,0x7a,0xca,0xf8,0x98,0x8c,0x31,0x68,0x18,0x13,0xdf,0x5b,0xc9,0x53, + 0x39,0x33,0x3b,0x8e,0xb3,0xf3,0x13,0xb8,0xb8,0x38,0x8d,0x1b,0x17,0x4f,0xe1,0xe1, + 0xb3,0xd,0x5a,0x5a,0xdd,0xe1,0x67,0x6b,0x5b,0xfc,0xf4,0xf9,0x36,0x47,0x86,0x8d, + 0x4d,0xa6,0x11,0x4c,0x30,0x64,0x7d,0x70,0x5a,0x54,0x6,0x90,0xd3,0x9e,0x73,0x10, + 0xa,0x7b,0xec,0x8e,0x3,0x85,0xc2,0x10,0xb1,0x75,0x68,0x20,0x33,0x9c,0x76,0x8d, + 0x39,0x31,0xcb,0x21,0x7,0x61,0xb1,0xf2,0x67,0x21,0x93,0xce,0x6,0x20,0xe6,0x2, + 0xb,0xbe,0x40,0x74,0xb,0x83,0x58,0xee,0x65,0x12,0x4d,0xc6,0xf2,0xa9,0xdf,0xfd, + 0x96,0xaa,0x24,0x58,0xa5,0x4d,0xbf,0x40,0xf0,0x49,0xb8,0x89,0x89,0x7d,0xb6,0x2c, + 0x3c,0x24,0xa,0xa2,0x43,0x90,0x73,0x1b,0x7e,0x2a,0x38,0x41,0xe4,0x8d,0x1,0x45, + 0x28,0xbf,0x54,0x9d,0x8d,0x22,0xf0,0x4b,0x25,0xa4,0x2d,0x6d,0x92,0x22,0x9,0xb1, + 0xc1,0x1d,0x8e,0x44,0x94,0x1d,0x49,0xc8,0x59,0x34,0x6,0x94,0x11,0xc4,0x89,0x33, + 0x96,0x3b,0x9,0x53,0x96,0x2c,0x61,0x34,0x16,0xb4,0x52,0x31,0x22,0x92,0x29,0x65, + 0x86,0x5a,0xe4,0x44,0x3c,0x2a,0xb,0xb5,0xe7,0x4c,0xaf,0xce,0xd2,0x13,0xde,0x68, + 0xe8,0x4,0x82,0x9c,0x28,0xc8,0x13,0x45,0xf9,0x1d,0xe9,0x38,0xd6,0xa8,0x22,0x60, + 0xa1,0x9d,0x66,0x95,0xee,0x96,0xc3,0xe7,0xa4,0xfb,0xaf,0x84,0x94,0xb0,0xce,0xd3, + 0x56,0x6f,0x1a,0x9,0x9,0x82,0x38,0xb0,0x94,0x8f,0xb4,0x9,0x61,0x14,0x9,0x76, + 0x8f,0x1a,0x24,0x5f,0xbc,0xc3,0x1e,0xd7,0xc4,0x9d,0xb9,0x31,0xce,0x38,0xdb,0x18, + 0xf7,0xf5,0xc6,0x90,0x89,0x93,0xa2,0x91,0x31,0x93,0xd1,0xba,0x34,0xa0,0x6,0x48, + 0xc0,0x1,0x19,0x7,0x5,0xc,0xf7,0x37,0xe9,0xf2,0x99,0x19,0xfa,0xd1,0x8d,0xf3, + 0xf4,0xf6,0xd5,0xd3,0xb8,0x72,0x7a,0x86,0xc6,0x87,0xfb,0xe3,0xd4,0x1d,0xe,0xc1, + 0x1c,0x42,0xcc,0xe1,0x47,0x9,0xa1,0xff,0x43,0xfe,0xf4,0xfa,0xbe,0x77,0xaf,0x9e, + 0xa6,0x4e,0xd7,0xe2,0xa3,0xaf,0x1e,0xd2,0x37,0xf,0x56,0xd8,0x76,0x53,0xc,0x5b, + 0xd2,0x4e,0x50,0xd0,0xd1,0xc6,0x8b,0x86,0xc9,0xb1,0xb3,0xfd,0x7b,0x6b,0xd8,0x5a, + 0x4b,0x52,0x1a,0xc5,0x1c,0x98,0xe5,0x31,0xc7,0x33,0x32,0xdd,0x23,0x83,0x8b,0x54, + 0x48,0x8b,0x70,0x33,0x13,0xc5,0x5c,0x1b,0x9e,0x84,0xf7,0x77,0xa0,0xaf,0x49,0xaf, + 0x9f,0x9f,0xa3,0xef,0xbf,0x79,0x8e,0xae,0x5f,0x5a,0xa0,0x32,0x58,0x97,0x88,0x30, + 0xd4,0xdf,0xc0,0x9f,0xff,0xe4,0x6,0x95,0xad,0x27,0xf2,0xd7,0xf9,0x55,0x5e,0xbf, + 0x7c,0x52,0xac,0x56,0x2b,0x18,0xae,0x56,0x30,0xd4,0xdf,0x8,0x3f,0x8f,0xf2,0x9f, + 0xd7,0xe9,0x74,0x69,0x75,0x6b,0xf,0xf,0x9e,0x6d,0xf0,0xe7,0xb7,0x9f,0xe2,0xf3, + 0xef,0x9e,0xf2,0xad,0xfb,0xcb,0x58,0xdb,0xdc,0xe3,0x4e,0xb7,0x4b,0xca,0xff,0x7, + 0xc6,0x3f,0x17,0xe1,0xd4,0xe0,0x67,0x35,0x81,0x99,0x7b,0x32,0x97,0x11,0x7e,0x84, + 0x36,0x86,0x7c,0x44,0x93,0x5d,0x88,0xc4,0x73,0xef,0xc8,0x49,0xec,0x29,0x7d,0x62, + 0x49,0x24,0xcd,0x89,0x87,0xfa,0x1b,0xf4,0x3b,0x37,0xce,0xd1,0x7f,0xfd,0xcf,0xde, + 0xa1,0xab,0x67,0x67,0x69,0x7c,0x64,0xa0,0x74,0x9a,0xce,0xe3,0xcf,0xc3,0xeb,0xf8, + 0xf,0xbd,0x3e,0xff,0x31,0xfe,0xc8,0x46,0xe2,0x45,0x8d,0x19,0x33,0x63,0x78,0xb0, + 0x89,0xeb,0xc3,0xa7,0xe8,0xfa,0xc5,0x53,0xe8,0x76,0xbb,0xb4,0xbd,0x77,0x84,0x4f, + 0xbe,0x7d,0xc2,0x3f,0xff,0xf4,0x2e,0xff,0xcd,0x6f,0xbe,0xb5,0xcb,0xeb,0xdb,0x41, + 0x68,0xa5,0xe8,0xcc,0x30,0x6c,0x88,0xc9,0x86,0x60,0x35,0x98,0xe8,0x8,0x47,0xcc, + 0x11,0x85,0x32,0xb0,0xdc,0x85,0x75,0xca,0x2,0x4b,0x44,0xf0,0x46,0x32,0x6e,0x85, + 0x12,0x1a,0xb0,0xe8,0x20,0x48,0x59,0x0,0x5b,0x66,0xd3,0x4a,0x52,0x89,0xa8,0x8c, + 0x8f,0x58,0xa5,0x9b,0x52,0x46,0x4f,0x22,0x85,0x7e,0x27,0xdf,0x94,0x32,0xf9,0xb7, + 0xbb,0xc,0xab,0xca,0xe4,0x8c,0x75,0x90,0x41,0x31,0x5f,0x3b,0x3b,0xc1,0x73,0xb2, + 0x56,0x34,0x95,0xa7,0x6c,0xaa,0x96,0xbb,0xea,0x62,0xdc,0xa8,0xf2,0x9,0xa6,0x4c, + 0xe3,0x8,0x8d,0x3a,0xc9,0xa6,0x35,0xc5,0xf2,0x64,0xd0,0x33,0x17,0xb2,0xba,0xd2, + 0x5e,0x9b,0x85,0xdc,0x55,0x75,0x4a,0x2,0x42,0xd7,0x6,0xed,0x9a,0xad,0x4d,0xba, + 0x1e,0xc9,0xaf,0xa7,0x6c,0xc2,0x8f,0xe,0x81,0x2c,0x76,0xea,0x32,0x32,0x36,0x6a, + 0xed,0x49,0xc7,0x2d,0x97,0xa1,0xd1,0x52,0x53,0xcf,0x5c,0xca,0x7a,0x53,0xe3,0x8f, + 0xaa,0xd1,0x1,0xe2,0xa1,0x10,0xa1,0xad,0x74,0xaf,0xf9,0xd5,0x51,0x48,0xf5,0x21, + 0xca,0xde,0x7,0x46,0xa9,0xbe,0x5a,0x75,0x32,0xa4,0xd3,0xdb,0xb,0xb1,0xb2,0x9c, + 0xbc,0x3e,0x55,0x32,0x5c,0x28,0x1e,0x72,0xe2,0x83,0xb2,0x74,0xa5,0x40,0x85,0x53, + 0x45,0xc5,0x6b,0xcb,0x25,0x7b,0x3d,0xb0,0xda,0x33,0x89,0x9a,0x92,0x5e,0xc5,0xe, + 0xc7,0xc4,0x20,0x8c,0x8a,0x31,0xb8,0x7c,0x76,0x86,0xde,0xba,0xbc,0x40,0xd7,0x2e, + 0xcc,0xd3,0xd9,0xf9,0x9,0x4c,0x8e,0xe,0xd2,0xec,0xf8,0x30,0x46,0x86,0xfa,0x7a, + 0x4e,0x7d,0x11,0xd6,0x15,0x53,0xf8,0x3f,0xf6,0x1f,0xd9,0x3c,0x84,0x7b,0xee,0xd4, + 0xf4,0x28,0xfd,0xf4,0xbd,0x2b,0xd4,0xe9,0x5a,0x73,0xfb,0xc1,0x8a,0x95,0xd3,0xa2, + 0x23,0xe9,0x4a,0xc,0xdf,0x25,0xbd,0xb8,0xd5,0x7a,0x8,0x64,0xb1,0xce,0x87,0xc7, + 0xb2,0xb0,0x4d,0x50,0x81,0x29,0x48,0xab,0x9,0x10,0x93,0x89,0xc5,0x3d,0xac,0x38, + 0xfc,0x5a,0x3e,0xda,0xed,0x92,0x71,0xe1,0x36,0xe4,0x79,0x9,0xcc,0x8c,0xb1,0xa1, + 0x7e,0x7a,0xed,0xdc,0x2c,0x2d,0xcc,0x8c,0xd1,0x99,0xb9,0x71,0xba,0x72,0x66,0x6, + 0xd7,0x2e,0xcc,0x45,0xb2,0xb9,0xb5,0xb6,0xf0,0x7a,0x86,0xfd,0xab,0xfc,0x7b,0xfe, + 0xfc,0x7b,0x41,0xb6,0x65,0x3b,0xdf,0x7c,0x2a,0xed,0xd5,0x7c,0xc9,0xaf,0xad,0xd5, + 0xaa,0x98,0x9f,0x1a,0xc5,0x60,0x5f,0x93,0x66,0x27,0x47,0xf0,0xfd,0x6b,0x67,0xf1, + 0x7c,0x73,0x97,0x9e,0xae,0xed,0xe0,0xe1,0xb3,0x75,0x7e,0xb0,0xb4,0x81,0xbb,0x4f, + 0x56,0x79,0x73,0xf7,0x20,0x86,0x99,0xa5,0x91,0x4d,0x99,0xc1,0x11,0xb3,0x61,0x6f, + 0x91,0x94,0xc,0x69,0x12,0x25,0x5f,0xc8,0xe3,0xe3,0xbc,0xe8,0x3f,0xec,0x9,0xe, + 0x7e,0x8f,0x9b,0x52,0x72,0xd2,0x91,0x3f,0x3e,0x3c,0x40,0x7f,0xf6,0x93,0x37,0xe9, + 0xf7,0xdf,0xbd,0x44,0x6f,0x5c,0x98,0xa7,0xe1,0x81,0x66,0x81,0x8f,0x51,0xb6,0xd2, + 0x79,0xd5,0x9,0xfa,0xff,0xcd,0x3f,0xf9,0xb5,0x91,0x5f,0x13,0xe3,0x23,0x3,0x78, + 0xf7,0xb5,0x45,0x9a,0x9d,0x18,0xc2,0xbb,0xaf,0x2f,0x56,0x3e,0xfc,0xe2,0x3e,0xff, + 0xfc,0xd3,0x3b,0x76,0x65,0x63,0x2f,0x70,0xd5,0x42,0x5b,0x15,0x15,0x0,0x40,0x32, + 0xdf,0xf1,0xae,0xd,0x64,0x6c,0x88,0x48,0x77,0xc5,0x3d,0xda,0xf3,0x12,0x83,0x9d, + 0x5d,0x1c,0x3b,0xf4,0xce,0x8a,0xdc,0x99,0x18,0xb6,0x23,0x56,0xaf,0xfe,0x9b,0xb, + 0x61,0x54,0x32,0x35,0x34,0x67,0xbf,0x6b,0xb2,0x79,0x31,0x34,0x48,0x60,0xca,0x24, + 0x73,0x33,0x52,0xed,0xaa,0x4a,0x29,0x96,0x8a,0x2c,0x45,0x6,0xbb,0xcb,0x3,0x5c, + 0xc6,0x37,0x50,0x8f,0x3c,0x17,0x86,0xb2,0x7e,0x4d,0x93,0x6e,0x71,0xab,0x50,0xaa, + 0xfc,0x92,0x85,0xaa,0xe8,0xef,0xa6,0x8b,0x6a,0xc1,0xcd,0x20,0xf3,0x25,0x97,0x5e, + 0x15,0x79,0x80,0x80,0x78,0x12,0x85,0xdf,0x90,0x11,0xc9,0x50,0xaa,0xfd,0xe6,0x92, + 0xef,0xd7,0x7d,0x58,0x4a,0x9a,0xcb,0x8c,0x1b,0xd4,0xdf,0xa9,0x4c,0xbc,0x5d,0x22, + 0x5d,0x93,0xd3,0x6d,0xde,0xe2,0xf6,0x20,0x42,0x52,0x5e,0xe8,0x95,0xbc,0x87,0xb, + 0x5f,0x4c,0xe5,0xcf,0x97,0x7a,0xa,0xcc,0xa1,0xbb,0xce,0x2,0x89,0x43,0xbf,0xfe, + 0x51,0x7c,0x9b,0x5a,0x73,0xe5,0x0,0x7,0x91,0x54,0x6,0xa4,0xa8,0xc7,0x10,0xa2, + 0x12,0xd,0x61,0x4c,0x28,0xe2,0xb1,0x1,0x30,0x61,0xae,0x2f,0x91,0xa8,0x51,0xd0, + 0xbf,0x41,0xfe,0x2f,0xd,0x3b,0x54,0xaf,0x55,0x31,0x31,0x36,0x44,0xe7,0x66,0xc7, + 0xe9,0xfd,0x37,0xcf,0xd2,0x8f,0xae,0x9f,0xc7,0x9b,0x97,0x4e,0x51,0xad,0x56,0xed, + 0x39,0xe1,0x95,0x1d,0x86,0xc6,0x99,0xb2,0xf5,0x2c,0x38,0x65,0x45,0x45,0x16,0xeb, + 0xb2,0x89,0x45,0xfe,0x2e,0x59,0xfc,0x98,0x19,0x23,0x83,0x7d,0xf8,0xbd,0x77,0x2e, + 0xd1,0xfd,0xe5,0x75,0xbe,0xfd,0x60,0x25,0x4d,0xc,0x1c,0x88,0x40,0x69,0x52,0x21, + 0x9f,0x5a,0xe1,0x1d,0xdf,0x0,0xe7,0x72,0xe5,0x50,0x46,0x23,0xbc,0xa7,0x38,0xd0, + 0xda,0xc,0x45,0x4f,0x2e,0x12,0x9e,0xf7,0x59,0x82,0x9a,0xe,0x64,0xe1,0x94,0x70, + 0x7,0xa2,0x6a,0xc5,0xd0,0xe4,0xf8,0x10,0xbd,0x73,0x79,0x91,0xde,0xbf,0x7e,0x96, + 0xae,0x9e,0x9d,0xc5,0xe9,0xd9,0x31,0x9a,0x9d,0x1c,0x89,0x6b,0x88,0x40,0x9e,0x7a, + 0xd9,0xea,0xe1,0x1f,0xa,0x1,0xf7,0xfa,0x59,0xbd,0xbe,0x27,0x27,0x7a,0x11,0x11, + 0x46,0x86,0xfa,0x30,0x3c,0xd8,0x4,0x2d,0x4c,0x11,0x33,0x63,0x67,0xef,0x8,0x77, + 0x9f,0xae,0xe1,0xcb,0x3b,0x4b,0x98,0x99,0x18,0xc6,0xed,0x47,0xcf,0xb1,0xb3,0x77, + 0x84,0xc3,0xa3,0x63,0x1c,0xb6,0xda,0xe8,0xb2,0x2f,0x23,0x24,0xf1,0x71,0x31,0xc4, + 0x19,0x22,0x6f,0xb2,0xab,0xc2,0xfa,0x84,0x2b,0xb0,0x9a,0xa1,0x58,0x7a,0x1a,0x90, + 0xbc,0xe3,0x5c,0x59,0x9f,0x99,0x18,0xa6,0x3f,0xfe,0xc1,0xeb,0xf4,0xce,0x6b,0xb, + 0x24,0x77,0xe2,0xf9,0x75,0xf6,0x4f,0xbd,0x78,0xbf,0x6c,0x7a,0xef,0x75,0x2f,0x4d, + 0x8c,0xe,0x62,0x62,0x74,0x90,0xae,0x5f,0x3c,0x85,0xd9,0xf1,0x11,0x0,0x64,0x3e, + 0xfa,0xea,0x81,0x7d,0xbc,0xbc,0x85,0xd4,0xd3,0x46,0xf5,0x82,0xd7,0xf5,0x71,0x52, + 0xc2,0x71,0xf2,0xb8,0xe0,0x88,0x34,0x31,0x59,0x97,0x90,0xeb,0x48,0x8e,0xae,0xd, + 0x20,0x16,0x59,0x79,0x41,0xa,0x93,0xec,0x86,0x7a,0x7b,0xe1,0xb3,0x58,0xb,0x87, + 0xe2,0x9f,0x85,0xdb,0x65,0xe7,0xbc,0x5e,0x75,0x4b,0x72,0xae,0x48,0xb6,0x8f,0x3f, + 0xaf,0xa,0xd2,0x7b,0x51,0x69,0xe6,0x5b,0x9c,0xac,0x38,0x8b,0xf0,0x2c,0x67,0xc4, + 0xe7,0x55,0x97,0x4a,0x76,0xcd,0x5a,0xf6,0x96,0x39,0x40,0x11,0x7a,0x30,0xe8,0x4b, + 0x3a,0x87,0xc2,0xa4,0x99,0x95,0x20,0x92,0x8e,0x57,0xe5,0x8c,0xc2,0x82,0xfc,0x5b, + 0x26,0x84,0x66,0xfb,0xe6,0xa2,0xfc,0x8b,0x64,0xb6,0x4b,0x91,0x25,0x98,0x55,0x63, + 0xf5,0xfd,0x9e,0xba,0xcd,0xf2,0xb5,0x2d,0x68,0xcb,0xb2,0x6,0x4a,0x49,0xea,0x4a, + 0x2a,0x79,0xc1,0xc8,0x5d,0x59,0xd3,0x15,0x82,0x72,0x84,0x71,0x6c,0xd9,0xb7,0xe7, + 0xda,0x1e,0x91,0x98,0x20,0x47,0xb7,0x24,0xea,0x61,0x49,0xb6,0x63,0x4e,0x4c,0x7f, + 0x8a,0xa4,0x4b,0xed,0x8c,0x20,0x8a,0x6a,0x5a,0x69,0x78,0x56,0x7b,0xfa,0xa5,0x29, + 0xdf,0x3c,0xf1,0xaa,0x7c,0x31,0x21,0x43,0x9,0x2e,0x4f,0xfb,0xdb,0x98,0x73,0xe, + 0xe3,0x95,0xc7,0xb1,0x98,0x53,0x32,0x1d,0x10,0x11,0x9e,0xc0,0x7b,0xd7,0xce,0x9a, + 0xdf,0x7f,0xf7,0x22,0xfd,0xf8,0xed,0x4b,0x34,0x33,0x36,0x84,0x46,0xa3,0x86,0x7a, + 0xbd,0x56,0x7a,0x28,0xe6,0x13,0xc3,0xab,0x4c,0xd6,0x65,0x44,0xb7,0x7c,0xe2,0xfe, + 0x87,0x40,0xf1,0xc3,0x3,0x4d,0x5c,0xbb,0x38,0x47,0x67,0x67,0x27,0x82,0x1d,0x68, + 0x4c,0xf1,0x4a,0x86,0x2d,0x72,0x48,0x9,0xe1,0xaa,0x21,0x46,0xda,0x15,0xfe,0x98, + 0xb1,0xa4,0xef,0x43,0xe5,0x7a,0x1f,0xa1,0xf5,0x50,0xdc,0xc3,0x36,0x38,0xc2,0x29, + 0x7e,0x32,0x17,0x99,0xf2,0xe7,0x17,0xa7,0xe8,0x7f,0xf8,0xb3,0x1f,0x9a,0xb7,0xae, + 0x2c,0xd2,0xcc,0xd8,0x10,0xea,0x5e,0xb7,0xdc,0x4b,0xf6,0xf4,0x4f,0xe1,0x4f,0xaf, + 0x89,0x5e,0xbe,0x77,0x83,0xfd,0x75,0x5c,0x3d,0x37,0x47,0x17,0x16,0xa6,0xf0,0x47, + 0x3f,0x7c,0x9d,0xd6,0xb7,0x76,0xf9,0xe6,0xdd,0x65,0xfc,0xe6,0xeb,0x87,0xfc,0xd1, + 0xcd,0x7,0x58,0xdf,0x3e,0x10,0x41,0x62,0xd4,0x3,0x3e,0x90,0x6a,0x39,0x52,0x69, + 0xd0,0xf9,0x7e,0x8c,0x62,0x34,0x48,0x1c,0x74,0x22,0xb7,0xb7,0x42,0x86,0x66,0xc7, + 0x87,0xb1,0x38,0x37,0x46,0x52,0xfe,0x58,0xc6,0x40,0xff,0xff,0xd3,0x9f,0x5e,0xab, + 0x9a,0x77,0xaf,0x2e,0xd2,0xdc,0xd4,0x8,0x8d,0xc,0x36,0xf1,0x1f,0x7f,0xf1,0x95, + 0x5d,0xd9,0xd8,0xf3,0x4d,0xb6,0x98,0x89,0x9d,0xd5,0x5b,0x2c,0x80,0xde,0x18,0x8e, + 0xdc,0xe2,0xdd,0x5d,0xce,0x6c,0xc,0x99,0x2e,0x13,0x1b,0xeb,0x8e,0x19,0xeb,0x97, + 0x92,0x1e,0xcb,0xa2,0x2,0x35,0x3d,0x99,0x6c,0x94,0xbd,0xda,0xa4,0xe6,0x3c,0x52, + 0x21,0x6a,0x65,0x59,0x8d,0x54,0x98,0xe6,0xa,0x1f,0x85,0xc,0xff,0xaa,0x96,0x4d, + 0x5f,0xca,0x58,0x94,0x34,0xac,0xac,0xca,0x70,0xc0,0xf3,0x45,0x61,0x89,0xc5,0xa1, + 0xc4,0x1,0xa7,0x17,0xd,0x5f,0x3d,0x9,0x2e,0xde,0x40,0xde,0xe8,0x3a,0xf3,0x13, + 0x2c,0x4e,0x8f,0x5c,0x5e,0x6e,0x4b,0xd8,0x84,0x28,0x84,0x89,0x14,0xdd,0xf1,0x0, + 0xe5,0xf3,0x23,0xe5,0x5f,0x32,0x18,0x9d,0xca,0x33,0xe1,0x14,0xe6,0x2f,0x8a,0x2a, + 0x4b,0x16,0x23,0x8b,0xc4,0xb5,0x42,0xd3,0xa4,0x77,0xd6,0x2a,0x6e,0x50,0x53,0xcf, + 0x12,0xd8,0x21,0xe4,0x6b,0xca,0x71,0x8f,0xf5,0xe3,0x51,0x31,0xa6,0x2a,0xdf,0x9d, + 0xf3,0x29,0x3b,0xd9,0x20,0x49,0xc2,0x9d,0xb,0x2d,0x12,0x1,0x3d,0x4,0x16,0x4, + 0xe,0xa9,0x26,0x0,0xb3,0x8f,0x3a,0x36,0xde,0x1b,0x43,0x4e,0x20,0xfe,0x32,0x34, + 0x32,0x9a,0xd4,0x97,0x68,0x3f,0xb0,0xb3,0x9,0x71,0x90,0xbe,0x40,0x57,0x9c,0x4, + 0x2d,0x24,0x77,0x51,0x30,0x36,0x91,0x86,0x27,0x21,0xed,0xcb,0xcb,0xd7,0x18,0xc9, + 0x5d,0xcb,0x6b,0x79,0x63,0x1,0xaa,0x56,0xc,0x9d,0x9e,0x1b,0xa7,0x37,0x2f,0x2d, + 0xd0,0xf,0xae,0x9f,0xa3,0x77,0xaf,0x2e,0xd2,0xc5,0xc5,0xe9,0x9e,0xd3,0x78,0x3e, + 0x31,0xc8,0x49,0x39,0xc0,0xc1,0x72,0x92,0x96,0x7,0x6a,0xcb,0x11,0xd8,0x84,0xdb, + 0xa0,0x27,0x80,0x11,0xd0,0x68,0xd4,0xb,0x53,0x54,0xce,0x6e,0xcf,0xa7,0x77,0x39, + 0xdd,0xf6,0x35,0xea,0x98,0x9f,0x1a,0xa1,0xc5,0xe9,0x51,0x3c,0x5b,0xdb,0x45,0xc7, + 0x76,0x21,0x75,0x5b,0xc9,0x26,0x3a,0xde,0xb4,0x1c,0x5e,0x7c,0x8e,0x61,0x2c,0x7e, + 0xb9,0x1e,0xbd,0x96,0x4d,0x2c,0x20,0x49,0xbf,0x1f,0xa2,0xea,0x82,0x9d,0xab,0xd8, + 0x97,0x13,0x15,0x8c,0x9f,0x2f,0x9f,0x99,0x32,0x7f,0xf8,0xbd,0xd7,0xe8,0x47,0x6f, + 0x5d,0xa0,0x53,0x53,0xa3,0xa5,0xc5,0xfb,0x9f,0x62,0xb1,0x29,0x43,0xb,0xf2,0xc6, + 0xae,0x52,0xa9,0xa0,0xbf,0x52,0xc1,0x40,0x5f,0x1d,0x63,0xc3,0xfd,0x38,0x35,0x35, + 0x42,0x63,0xc3,0x83,0x98,0x9d,0x18,0xc1,0x85,0x85,0x49,0xfa,0xea,0xfe,0xa,0xdf, + 0x79,0xf4,0x9c,0x9f,0xae,0x6e,0xfb,0x24,0xd5,0x80,0x6d,0xb8,0x17,0xdb,0x5a,0x66, + 0x32,0x86,0x54,0x5e,0x84,0x2,0x14,0x63,0xf3,0x1e,0x0,0xe2,0x28,0x91,0x8b,0x64, + 0x79,0xdf,0x9,0x8f,0xc,0x36,0x31,0x35,0x31,0x44,0x3,0xfe,0x3a,0xea,0x85,0x7a, + 0xfc,0x63,0x40,0xdf,0xf9,0xeb,0xf3,0x2a,0xcc,0xf8,0x5e,0x7c,0x86,0x17,0x29,0x3b, + 0xf2,0xd5,0x4b,0x2f,0xb4,0xaa,0xec,0x31,0x54,0xab,0x15,0x9c,0x9e,0x1d,0xc3,0x1f, + 0x7d,0xff,0x2a,0x75,0xba,0xd6,0xfc,0xfb,0x9f,0x7d,0x69,0x37,0xb6,0xf,0xa2,0x9f, + 0x1,0xc5,0x9b,0xd3,0x10,0x60,0x93,0x5f,0x70,0xb0,0x35,0x76,0x59,0xaa,0xa5,0x83, + 0x9f,0x57,0xdd,0xb0,0x60,0x69,0xfb,0x8f,0xb3,0xca,0x40,0x40,0x4f,0x8a,0x71,0xf, + 0x74,0x5b,0xbd,0xe7,0xd9,0x17,0x15,0x7c,0x49,0x32,0x28,0x36,0x40,0xee,0x19,0x8f, + 0x5c,0x0,0xc6,0xc1,0x99,0x27,0xc1,0xd6,0xc1,0x3b,0x9d,0xa3,0xd3,0x1a,0x17,0xf6, + 0xed,0xac,0x26,0x54,0x2a,0xd5,0xa4,0xa9,0x98,0x91,0x62,0xd2,0x88,0xfa,0x56,0x3d, + 0x65,0xe6,0x26,0x64,0xd9,0xa1,0x10,0x2d,0x57,0xc5,0xc4,0x98,0xf1,0xb0,0xb8,0x4, + 0xee,0x66,0x31,0xc0,0xc7,0x9e,0x2b,0x58,0xc5,0xca,0x64,0xb5,0x40,0x76,0x61,0x91, + 0xdb,0x1,0xfd,0x78,0xd2,0x7a,0x81,0xa3,0x26,0x32,0x4b,0x7c,0x89,0x72,0x67,0xce, + 0x1d,0xd4,0x44,0x2e,0x61,0xa1,0x31,0x50,0xbf,0x47,0x5a,0x72,0x50,0x21,0xdd,0x8d, + 0x54,0x52,0x4f,0x26,0x37,0x2c,0xeb,0x2,0x33,0xc6,0x3f,0x17,0xb0,0x10,0x2a,0x80, + 0xe8,0x5,0xbe,0x83,0x8f,0x32,0x8,0x33,0x9d,0x82,0xfa,0xb3,0x55,0x7b,0x66,0xef, + 0x2a,0xa2,0x48,0xd,0x29,0xa5,0xbd,0x89,0xf1,0xa8,0x90,0xa9,0x68,0x61,0x3a,0x17, + 0xa4,0xb8,0xa8,0x7f,0xe,0x3c,0xf8,0x64,0x85,0x99,0x5c,0x66,0x38,0x2c,0x37,0xfd, + 0x3,0xa8,0x55,0x2b,0x34,0x3f,0x3d,0x4a,0x7f,0xfe,0x7,0x37,0xcc,0x9f,0xff,0xde, + 0xd,0x9a,0x9d,0x18,0x42,0xc3,0x4f,0xe4,0xf2,0xb0,0x78,0x15,0x88,0xb7,0x97,0x2c, + 0xad,0xd3,0xe9,0xe2,0xa0,0xd5,0xc6,0xce,0x7e,0xb,0x7b,0x7,0x47,0xc9,0x12,0x53, + 0x5c,0xd6,0xf5,0x5a,0x15,0xa3,0x83,0xfd,0x18,0x1b,0x6a,0xc6,0xc2,0x9e,0x6b,0xd2, + 0x7b,0xc1,0xc6,0xf2,0x63,0x73,0x93,0x23,0xb8,0x76,0xf1,0x14,0xed,0x1d,0x1e,0x63, + 0x7b,0xaf,0x5,0x38,0x16,0xf,0x27,0xb2,0x2a,0xb9,0x30,0xa9,0x60,0x5,0xda,0xf5, + 0x3e,0xa1,0x5e,0x9a,0xe6,0xfc,0x45,0xc3,0x1d,0x24,0xf6,0x7c,0xa9,0x86,0x7b,0xb7, + 0x37,0x93,0x92,0xb7,0x99,0x24,0xa6,0x9c,0xec,0x61,0xd,0x51,0xb3,0x5e,0xa5,0x7f, + 0xf1,0x3b,0xaf,0xd3,0xbf,0xfa,0xd1,0x75,0x9a,0x19,0x1b,0xea,0x9,0x77,0xff,0x7f, + 0x65,0x72,0xcc,0x1f,0x6b,0x59,0x53,0x72,0x66,0x6e,0x1c,0x67,0xe6,0xc6,0xe9,0xa7, + 0xdf,0xbb,0x84,0x4f,0x6e,0x3d,0xc1,0x7f,0xfc,0xd5,0xd7,0xf4,0xd7,0x1f,0x7d,0xcb, + 0xcf,0xd6,0x76,0x38,0x71,0x4a,0xdc,0xc9,0x1a,0x39,0x89,0x24,0xe9,0xa9,0x1e,0x4f, + 0x12,0x33,0x83,0xb2,0xb4,0x4b,0x14,0x2f,0x19,0x9a,0x80,0xe1,0xc1,0x3e,0x1a,0xee, + 0x6f,0x26,0xb2,0xef,0xff,0x43,0xaf,0x69,0xaf,0x2,0x5c,0xa6,0x47,0xef,0x55,0xd4, + 0xf3,0x62,0xdd,0xab,0x90,0xff,0x97,0x20,0x37,0x65,0xd,0x98,0xb5,0x16,0xef,0x5d, + 0x3b,0x43,0x8d,0x46,0x15,0x5f,0xde,0x5d,0xa2,0xcd,0x9d,0x43,0xff,0x16,0xd8,0x94, + 0x7c,0x4a,0x0,0xd9,0x90,0x56,0x28,0xea,0x45,0x58,0x2d,0xb1,0x5c,0x3c,0x3b,0x1e, + 0x23,0xa4,0x7f,0x0,0x31,0xa1,0x9b,0xd1,0x7e,0x39,0xd7,0x58,0xcb,0xe2,0x8,0x15, + 0x37,0x5d,0x88,0xd9,0xd6,0xa8,0x6f,0x69,0xad,0x8f,0x68,0x8e,0x20,0x28,0x87,0xe1, + 0xaa,0x9a,0x4f,0x6e,0x32,0x51,0x4b,0xb1,0xa8,0x73,0x12,0x54,0x66,0x82,0xc2,0xf9, + 0xc7,0x2,0xf6,0x4f,0xa4,0x62,0xe3,0xe4,0x6e,0x81,0xe5,0x8e,0x5c,0xa0,0xc8,0x5c, + 0x98,0xe0,0x49,0x33,0xfc,0x4a,0x92,0xca,0x74,0x21,0xcc,0xb3,0xc3,0x20,0xa3,0x26, + 0xa,0xc4,0xf1,0x3c,0xea,0x33,0x3e,0x46,0xb9,0xbb,0xca,0xb,0x36,0x32,0x0,0x81, + 0x55,0x11,0x26,0x69,0xce,0x4e,0x62,0xea,0x56,0x28,0x3e,0x51,0x66,0xb9,0x4e,0x5, + 0x1a,0x41,0x41,0xef,0x1f,0x59,0x4b,0xe9,0xb,0xa5,0xbc,0x90,0x64,0x58,0x8d,0x5a, + 0x71,0x17,0xe5,0x6f,0x62,0x82,0xe7,0x32,0xa7,0x3e,0x52,0x1d,0x54,0xb6,0x60,0x31, + 0x44,0xf2,0x1,0x8,0xfd,0x83,0x92,0x3,0x90,0x82,0xcd,0x49,0x11,0xfb,0x48,0x38, + 0x41,0x4,0x99,0x61,0x40,0x6e,0x39,0x66,0x9b,0x23,0x45,0x73,0x1a,0x91,0xf0,0x15, + 0x5d,0x4a,0x42,0x64,0xa7,0x9,0xc9,0xce,0x11,0x6e,0x67,0xf,0xbd,0x13,0xfb,0x49, + 0xdf,0x97,0x35,0x0,0x18,0xe8,0x6b,0xd0,0x3b,0xaf,0x9f,0x36,0xff,0xd5,0x8f,0xaf, + 0xd3,0xbb,0x57,0x4f,0xd3,0xc2,0xf4,0x88,0x92,0x93,0xf5,0x2a,0xa4,0x12,0x6a,0x2f, + 0x3b,0x68,0xb6,0x76,0xf,0xf1,0x6c,0x7d,0x7,0x4b,0xab,0xdb,0x58,0x5a,0xdb,0xc6, + 0xca,0xfa,0x2e,0x56,0xb7,0xf6,0x70,0x70,0xd4,0x46,0xb7,0x6b,0x95,0xc8,0x30,0xbc, + 0x42,0x86,0x8,0xf5,0x7a,0x5,0x83,0x7d,0xd,0x8c,0xc,0xf4,0x61,0x7c,0x74,0x0, + 0x93,0x23,0x3,0x98,0x9b,0x1c,0xc6,0xa9,0xa9,0x31,0xcc,0x4f,0xe,0xa1,0x5e,0xaf, + 0x95,0x4e,0xeb,0x72,0x7a,0x99,0x18,0x19,0xc0,0x85,0x53,0x53,0x74,0xf3,0xce,0x12, + 0x6f,0xef,0x1f,0x5,0x34,0x29,0xb5,0x9d,0x1c,0x51,0x72,0x96,0x83,0x1f,0x8c,0xb8, + 0x10,0xa5,0x43,0x70,0x30,0x9b,0xc9,0xe2,0x79,0x23,0xb1,0x30,0xb9,0x1c,0x93,0x44, + 0xc3,0xc8,0x3,0x74,0x8b,0xb3,0xe3,0x74,0xfd,0xe2,0x29,0xba,0x72,0x76,0x86,0xf2, + 0xd7,0xef,0x55,0xb,0x8e,0x44,0x40,0x5e,0x75,0xef,0xfd,0x8f,0x9,0xe1,0x97,0xa1, + 0x24,0xb2,0x78,0xe4,0x13,0x6b,0x78,0xc,0x95,0x4a,0x5,0xd7,0x2e,0xce,0x53,0xa3, + 0x51,0xc5,0xdc,0xe4,0x30,0x7e,0xf6,0xe9,0x5d,0xfc,0xea,0xcb,0x87,0x21,0x59,0x35, + 0xb9,0x5c,0xe4,0x41,0x3d,0x19,0xcf,0x86,0x72,0xaf,0xab,0xc0,0x63,0xcc,0x66,0xbb, + 0x4e,0xd7,0xa2,0x1b,0xb2,0x47,0x4a,0xae,0x8d,0x7f,0xcc,0x82,0xce,0xcc,0xd8,0x3b, + 0x3c,0xc6,0xf2,0xfa,0xe,0x9e,0xad,0xef,0x60,0x7d,0xeb,0x0,0xfb,0x87,0x2d,0xec, + 0x1d,0x1d,0x63,0xef,0xe0,0x18,0x7,0x47,0xc7,0x68,0x77,0xba,0xe5,0x9e,0x20,0x2, + 0x9d,0xaa,0x18,0x42,0xb3,0x5e,0xc3,0xf8,0xc8,0x0,0x26,0x86,0xfb,0x31,0x3e,0x32, + 0x80,0xe9,0xb1,0x21,0x4c,0x8d,0xd,0x62,0x66,0x7c,0x8,0xcd,0x46,0xad,0x74,0xdd, + 0xf1,0x22,0x46,0xbe,0xfc,0x7c,0x40,0xb1,0xe6,0x26,0x47,0xe9,0x77,0xdf,0xba,0x40, + 0xad,0xe3,0xe,0xdd,0xba,0xbf,0xcc,0x9a,0xa8,0x10,0x52,0x1d,0xe1,0xd8,0xeb,0xd1, + 0xb1,0x2c,0xf9,0xd0,0x19,0x43,0xc4,0xd6,0xc1,0x85,0xec,0x5a,0x72,0x8f,0xd6,0xfb, + 0xb7,0xc1,0x10,0x73,0x84,0xda,0xbe,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xc1, + 0xca,0xcd,0xa9,0x70,0xa3,0xe5,0x68,0xa2,0x46,0xe9,0x27,0x4b,0x76,0x3b,0xa9,0x7a, + 0x23,0x13,0x43,0x25,0xf3,0x3a,0x7c,0x4d,0x9e,0x28,0x2a,0xb8,0xcf,0x4e,0x87,0x9e, + 0xc7,0x14,0xca,0x74,0x34,0xc9,0x6e,0x96,0xa8,0x3b,0x41,0xaf,0x70,0xa3,0x69,0xbc, + 0xd2,0x86,0xa7,0xe9,0x94,0x62,0x62,0x99,0x48,0x5d,0xb,0xd9,0x73,0x48,0x29,0x6a, + 0xfa,0x35,0xa6,0x12,0xb6,0x5f,0x2a,0x4b,0xca,0x50,0xe6,0x25,0x0,0x7,0x4b,0xb3, + 0x66,0xc1,0x46,0x7,0x17,0x57,0xd4,0xa4,0x4d,0xe5,0xa5,0x99,0x4,0x18,0x5a,0x67, + 0x9e,0x60,0x67,0x61,0x1a,0xaa,0x12,0xcb,0x42,0x20,0x4c,0x7a,0x1e,0x24,0x50,0x8c, + 0x90,0x96,0x93,0x6f,0x13,0x58,0x6,0xcc,0xc4,0x86,0x20,0x11,0xc,0xe5,0xf3,0x11, + 0x49,0x93,0xa2,0xf5,0xe1,0x12,0x8a,0x82,0xf6,0xfe,0x65,0x29,0x89,0xf5,0x56,0x5e, + 0xb9,0xbf,0x73,0xfc,0xa1,0xa1,0xd0,0x1,0xc8,0xfc,0x97,0x54,0x7e,0x3c,0x9,0xb6, + 0x9f,0x1b,0x3f,0x90,0x91,0xe,0x7d,0xda,0x7a,0xb4,0xc0,0x50,0x27,0x97,0xb7,0x7, + 0x95,0x59,0xe5,0x94,0x9a,0x23,0x52,0xc9,0x68,0xae,0xa6,0x9b,0x24,0x99,0x22,0x6, + 0xa1,0xe2,0xf7,0xe2,0x1c,0x8a,0xbf,0x8,0x71,0x49,0xb2,0x2a,0x8c,0xe,0xf5,0xd1, + 0x8d,0xcb,0xb,0xe6,0x8f,0x7f,0x70,0x95,0xfe,0xec,0xc7,0xd7,0xa9,0x5e,0xaf,0xbe, + 0xd2,0xa1,0x2d,0xf,0x89,0xf0,0xf1,0xa3,0xe3,0xe,0x8e,0xdb,0x27,0x68,0x9f,0x74, + 0xb1,0xbe,0xbd,0x87,0x7,0xcf,0x36,0x71,0xff,0xd9,0x6,0xee,0x3f,0x59,0xc3,0x9d, + 0xa7,0xeb,0x78,0xf2,0x7c,0x13,0x7,0xad,0x76,0x91,0x30,0xda,0x63,0xeb,0x54,0xaf, + 0x56,0x30,0x3f,0x39,0x8a,0xf9,0xa9,0x11,0x9c,0x99,0x1b,0xc7,0x85,0x85,0x49,0x5c, + 0x39,0x33,0x8d,0xf3,0xa7,0x26,0x31,0x36,0xdc,0xaf,0x34,0xb9,0x39,0xac,0x3f,0x34, + 0xd8,0xa4,0xd9,0xa9,0x61,0x34,0x1b,0xf5,0xac,0x21,0xb,0xa8,0x89,0x4d,0xf2,0x86, + 0x20,0x77,0xb0,0x72,0x9b,0x27,0xee,0x66,0x49,0xc8,0x91,0x64,0x38,0x9f,0x21,0x9e, + 0x3c,0xe4,0x62,0x66,0x4e,0xe2,0x27,0x10,0x68,0x7c,0x64,0x90,0x2e,0x2d,0x4e,0xe1, + 0xf4,0xcc,0xb8,0x2a,0x74,0xaf,0x5a,0x60,0xe4,0x6b,0x9e,0x93,0x1,0x4f,0x4e,0x3a, + 0x38,0xe9,0x32,0xba,0xd6,0x99,0x8d,0x9c,0x9c,0x74,0x9d,0xab,0x5b,0xd7,0xc2,0x76, + 0xbb,0xbd,0xb0,0xcc,0x97,0xff,0x4e,0x76,0xbd,0x4d,0xb5,0xe2,0xcc,0x56,0xfa,0x1a, + 0x75,0x34,0xea,0x15,0x34,0x3c,0xc1,0xac,0x6c,0x8d,0x52,0x36,0x5d,0x86,0x7f,0xf, + 0xf4,0xd5,0x71,0xe3,0xf2,0x2,0x26,0xc7,0x6,0x69,0xa8,0xbf,0x89,0x8d,0x9d,0x43, + 0xbe,0xfb,0x64,0xd,0xd6,0xed,0x68,0xa1,0xbd,0x14,0x5,0x9a,0x15,0xc9,0x4b,0x86, + 0xa,0xe7,0x1a,0x65,0xb4,0x1f,0xff,0x82,0xef,0x1d,0x1d,0x63,0x73,0xe7,0x10,0xbb, + 0x7,0x2d,0xc,0xf,0x34,0x5f,0xd8,0x98,0x96,0x41,0xdd,0x2f,0x93,0xad,0xc9,0x46, + 0x8c,0x88,0xb0,0xb9,0x73,0x0,0x27,0xe1,0x5b,0xc2,0xa3,0x95,0xd,0xec,0xec,0xb5, + 0xb0,0xb9,0x77,0x88,0xed,0xdd,0x43,0x1c,0x77,0xba,0xb9,0xeb,0x73,0x4f,0x10,0x9a, + 0x0,0x4c,0x8f,0xf,0x61,0x6e,0x62,0x18,0xb3,0x93,0xc3,0x38,0x35,0x35,0x82,0xc5, + 0x99,0x31,0x2c,0xce,0x8e,0x61,0x7a,0x74,0x10,0x43,0x3,0xcd,0x14,0x60,0x24,0x72, + 0xe,0x7a,0xc1,0xff,0xf9,0x7b,0x4,0x0,0x7d,0x8d,0x1a,0x7e,0x78,0xfd,0x3c,0x2d, + 0xaf,0xed,0xd2,0xad,0xfb,0xcb,0xaa,0x3b,0x71,0x39,0xf5,0x21,0x1d,0x3a,0x26,0x7c, + 0x3a,0x44,0xcf,0xb1,0xda,0x93,0x54,0x19,0xd2,0x8,0x94,0xa2,0x97,0x50,0xaf,0x85, + 0x79,0x48,0xe7,0x21,0xc5,0x5c,0xd7,0x12,0xee,0x54,0xf7,0x58,0x91,0xaa,0x35,0xc3, + 0x22,0x8b,0xab,0xce,0xa,0xbe,0x44,0x61,0xab,0xc5,0x9d,0x34,0x27,0x4f,0x4,0x15, + 0xb6,0xce,0x2a,0x7b,0x9b,0x38,0xe5,0x81,0x23,0x42,0xd1,0x92,0x1f,0x90,0x8,0x69, + 0x1a,0xca,0xcd,0xb5,0xd6,0x5c,0x20,0x7,0xa4,0x89,0x94,0x35,0xc3,0x5d,0xc6,0x7d, + 0x72,0x19,0x80,0xc0,0x29,0x61,0x29,0x90,0x75,0x43,0x21,0xec,0x91,0x70,0xc6,0x9c, + 0x40,0x30,0x48,0xe4,0x1b,0x5a,0xe,0x97,0x80,0x9,0x93,0xd8,0x5b,0x61,0xf9,0x9b, + 0xf1,0xc5,0x5d,0x9c,0xb1,0x89,0xa2,0xc2,0x20,0xdb,0xe5,0x8c,0x0,0x28,0x15,0xfc, + 0x99,0xf9,0x8a,0x92,0xe3,0x73,0x82,0xe9,0xb,0x72,0xc0,0x2,0x23,0x81,0x49,0x87, + 0xab,0x99,0x12,0x66,0xaf,0x4c,0xb1,0xb,0xb8,0x93,0x2c,0xf6,0x92,0x79,0x5f,0xb4, + 0xa8,0xd7,0xa4,0xc,0x5,0xaf,0x43,0x34,0x4d,0x48,0x5c,0xe8,0x2,0xe7,0x9d,0xb2, + 0x28,0xbc,0xc4,0x34,0x8f,0xc5,0x43,0xc8,0xd4,0x52,0x4e,0x39,0x52,0x34,0x6a,0xa4, + 0xd4,0x89,0x53,0x6,0x51,0xa0,0x26,0x3d,0xc7,0x85,0x46,0x9a,0x31,0x3b,0x31,0x4c, + 0xdf,0x7f,0xe3,0x9c,0xf9,0x37,0xff,0xfc,0x6d,0xba,0x71,0x79,0x91,0x1a,0x8d,0xda, + 0x2b,0x11,0xd3,0xca,0x20,0xf8,0xdd,0x83,0x16,0xbe,0x7b,0xb4,0x8a,0x2f,0xee,0x2c, + 0xe1,0xf3,0x3b,0x4f,0xf1,0xf0,0xd9,0x6,0xb6,0xf7,0x8e,0xd0,0x3a,0xee,0xe0,0xa4, + 0xd3,0xc1,0xf1,0x49,0x17,0x27,0x9d,0x4e,0x46,0x6a,0x11,0x21,0x1f,0x25,0x47,0x5e, + 0xfb,0xa4,0x8b,0xa7,0x6b,0xdb,0x58,0xdd,0xda,0xc5,0xcd,0x7b,0x4b,0x68,0xd4,0x6a, + 0x98,0x1a,0x1b,0xc4,0x9b,0x97,0x4e,0xe1,0xbf,0xfd,0xa3,0x77,0x71,0xfd,0xd2,0xa9, + 0x9e,0xb2,0xb8,0x66,0xdd,0xf9,0xc4,0x57,0x2a,0x49,0xb6,0x92,0xc6,0x88,0xd4,0x2, + 0x8b,0xd5,0x52,0xd8,0xc,0xb,0xfd,0xa7,0x86,0x93,0xc8,0x18,0x8a,0xa1,0x39,0x1c, + 0xfd,0x4f,0x95,0xa9,0x38,0xa3,0xc8,0xb3,0x99,0x9e,0x18,0xa2,0x2b,0x67,0x67,0xa8, + 0xd1,0xa8,0xf5,0x94,0xa5,0xbd,0xca,0x24,0x98,0xef,0xaf,0x5b,0xed,0x2e,0x56,0x37, + 0xf7,0xf0,0x7c,0x73,0xf,0xab,0x5b,0x7b,0x58,0x59,0xdf,0xe1,0xa7,0xcf,0x77,0xf0, + 0x74,0x7d,0x1b,0x6b,0x9b,0x7b,0x38,0x6a,0xb5,0x3,0x71,0x5f,0xad,0x4,0x4b,0x74, + 0xa6,0x72,0x50,0x20,0xf6,0xe9,0x76,0xd5,0x8a,0xc1,0xdc,0xe4,0x8,0x2e,0x2e,0x4e, + 0xe1,0xfa,0xc5,0x79,0x7a,0xe3,0xfc,0x1c,0x2e,0x9d,0x9e,0x7e,0xe9,0xe4,0xde,0x4b, + 0xcb,0xcd,0xcc,0x38,0x35,0x35,0x8a,0xdf,0x7d,0xeb,0x2,0x31,0x80,0x7f,0xf7,0xb3, + 0x9b,0xf8,0xed,0xd7,0x8f,0x38,0xbb,0x23,0x88,0x33,0x54,0xb6,0xac,0x42,0x94,0xa9, + 0x64,0x1,0xc0,0x2,0xd8,0x3b,0x68,0xe1,0xbb,0x27,0xab,0xf8,0xe6,0xe1,0x73,0x8c, + 0xc,0x34,0x31,0xe8,0x75,0xf5,0xbd,0xa,0xfb,0xff,0x5d,0xdd,0xf9,0xf3,0x8d,0x3d, + 0x7c,0xf4,0xf5,0x23,0x7c,0xfa,0xed,0x63,0x2c,0x6f,0xec,0xc5,0x2,0xdb,0xb5,0x2c, + 0xb1,0xbf,0x9e,0x51,0x10,0x2c,0x86,0xad,0xf5,0xed,0x3,0x6c,0xef,0x1f,0xe1,0xee, + 0xd3,0x75,0xd4,0x6b,0x15,0x54,0x2b,0x6,0xd5,0x4a,0x5,0x23,0x43,0x4d,0xcc,0x4f, + 0x8d,0xe2,0xb5,0xd3,0xd3,0x78,0xeb,0xf2,0x29,0x7c,0xef,0xda,0x59,0xc,0xf5,0x9b, + 0x9e,0x64,0xc5,0x5e,0xef,0x4f,0x7f,0xb3,0x86,0xd7,0xcf,0xcd,0xd2,0x6f,0x67,0xc6, + 0xfc,0x5,0x6b,0x90,0x8c,0x7f,0x39,0xd1,0x82,0x85,0x1d,0xb8,0x4d,0x37,0x40,0xda, + 0xa7,0xab,0xec,0x34,0x9b,0xee,0x65,0x96,0x30,0x75,0x66,0xf5,0x45,0x3a,0x1a,0xab, + 0x90,0x91,0x11,0x25,0x28,0x22,0xc0,0xf,0x24,0x90,0xd9,0x44,0xb8,0x63,0xce,0xf8, + 0x60,0x72,0x85,0xed,0x2f,0x8a,0xaa,0x4c,0x85,0x89,0xfb,0x5d,0x95,0xf,0x5e,0x64, + 0xab,0x13,0x67,0x82,0x77,0x7a,0x71,0x94,0x27,0x95,0x5c,0x9f,0xd2,0x77,0x9c,0xca, + 0xc,0xe2,0xa0,0x13,0xd9,0x39,0x2b,0x26,0xaa,0xd6,0xb0,0x82,0x3,0xf5,0xd4,0x98, + 0xeb,0x9f,0x4b,0x78,0x78,0x39,0x10,0x4f,0x94,0xe3,0xe3,0xa5,0xb1,0x5a,0x2,0xb2, + 0xa7,0x72,0x32,0x22,0x6b,0x68,0x5a,0x53,0x19,0xa8,0xbc,0x6d,0x55,0xad,0x77,0x68, + 0x81,0x8c,0x7a,0x81,0x64,0xcd,0x2e,0x7c,0x2b,0xe5,0x8c,0xb,0xcd,0x9e,0x2f,0x90, + 0x36,0x4c,0xc,0xde,0x28,0xb8,0xb0,0x66,0x17,0x46,0x96,0xc2,0xaa,0xaf,0x2c,0x52, + 0x49,0x69,0xf2,0xc1,0x10,0x21,0x7,0xec,0x23,0x1c,0x64,0xd4,0x65,0x95,0x1c,0xc6, + 0x52,0x16,0x79,0xb2,0x65,0xd,0xda,0xe7,0xa8,0x3d,0x37,0x52,0x97,0xae,0x5c,0xcb, + 0x5c,0x74,0xa5,0xb8,0xfa,0xdd,0x6b,0x31,0xd8,0x6c,0xd0,0xfb,0x6f,0x9c,0x35,0x7f, + 0xfa,0xe3,0x6b,0xf4,0xce,0xd5,0xd3,0xd4,0xc8,0xc2,0x50,0xf2,0x49,0xb0,0xec,0xe0, + 0xdb,0xdd,0x3f,0xc2,0xe3,0x95,0x4d,0x3c,0x59,0xdd,0xc6,0xa3,0xe5,0x2d,0x3c,0x78, + 0xb6,0x8e,0x7,0x4b,0x1b,0xf8,0xee,0xe9,0x1a,0x76,0xf7,0x5b,0x3a,0xb3,0x86,0x4b, + 0xee,0xd,0x75,0x55,0xe7,0x86,0x4b,0x88,0xb1,0xa9,0x87,0x5d,0x77,0xa4,0xec,0xa1, + 0x8d,0xf5,0x9d,0x7d,0xec,0x1d,0x1e,0xe3,0xea,0xd9,0x19,0x8c,0xe,0xf7,0x63,0x6e, + 0x62,0x28,0x22,0x5,0x92,0x8c,0xd7,0x3e,0x71,0xd6,0x98,0xdd,0xae,0xd,0x91,0xe9, + 0x2a,0xcb,0x20,0xdc,0xc6,0xd1,0x2a,0xcb,0xba,0xc6,0xd3,0xb9,0x9c,0x24,0xf7,0x20, + 0x89,0x96,0x85,0x12,0x6f,0xc8,0xad,0x2d,0xdc,0x65,0xe1,0xd2,0xcf,0xa3,0x83,0x72, + 0x58,0xd,0x71,0xf0,0x6c,0x7,0x3a,0x1d,0x8b,0xd6,0xf1,0x49,0xec,0x6b,0x5f,0xe6, + 0x46,0xd6,0x6b,0x1a,0x3c,0x3e,0xe9,0xe0,0xc9,0xca,0x16,0x9e,0x6f,0xee,0x62,0x63, + 0xf7,0x10,0x6b,0x9b,0xfb,0xd8,0xdc,0x3d,0xe0,0xcd,0x9d,0x43,0x6c,0xee,0x1e,0x62, + 0x6b,0xf7,0x10,0x6b,0x5b,0x7b,0x58,0xdd,0xda,0xe3,0xd6,0x71,0x57,0xd1,0x39,0x23, + 0x32,0x96,0x5b,0x4a,0x17,0x40,0x12,0x12,0xe1,0x2f,0x84,0x27,0x2b,0x5b,0xf4,0x74, + 0x75,0x1b,0x8f,0x57,0x36,0xf9,0xd6,0xfd,0x15,0x9c,0x9e,0x1d,0xa3,0x99,0x89,0x61, + 0xcc,0x8c,0xf,0x62,0x66,0x7c,0x18,0x93,0x23,0x3,0xa8,0xd5,0xaa,0x85,0x86,0x23, + 0x7f,0x4e,0xf2,0x1a,0x3a,0x3d,0x3b,0x8e,0x1f,0xbf,0x5,0xda,0xd8,0x3e,0xe0,0x27, + 0xcf,0xb7,0x69,0x75,0x63,0x97,0x2d,0xa3,0x50,0xf4,0xa0,0xf2,0x1f,0xa,0x3e,0xda, + 0x4a,0xc0,0x96,0xfb,0x53,0x3e,0x5b,0xdd,0xc1,0x7f,0xf8,0xf9,0x97,0x58,0x59,0xdf, + 0xc1,0xe5,0xc5,0x69,0x8c,0xc,0x35,0xd1,0x6c,0xd4,0x60,0xc8,0xc0,0x18,0x77,0x4d, + 0x5b,0x66,0x1c,0xb7,0x3b,0x38,0x6c,0x9d,0xe0,0xf0,0xb8,0x8d,0xa,0x11,0x2e,0x2e, + 0x4e,0x61,0x72,0x74,0xf0,0x95,0x89,0x6c,0x0,0xb0,0xb9,0x77,0x88,0xdb,0x8f,0x9e, + 0x63,0x69,0x75,0x17,0x96,0xb9,0xe4,0x8,0xd3,0x6a,0x29,0x49,0xe6,0x65,0x85,0x70, + 0x32,0xac,0x5,0xda,0xed,0x2e,0xda,0xd4,0xc1,0xfe,0x51,0x42,0x8,0x97,0xd7,0x77, + 0xf1,0x78,0x79,0xb,0x4b,0xcf,0xb7,0xf0,0x70,0x65,0x13,0x77,0x9f,0x6e,0xe0,0xfd, + 0xd7,0x17,0xf1,0xd6,0x95,0xc5,0x97,0xae,0x55,0xe4,0xfa,0x8c,0x88,0x30,0x3c,0xd8, + 0x87,0xd1,0xa1,0x26,0xb4,0xbd,0x1e,0xc0,0x8e,0x94,0x18,0xd3,0xd2,0x92,0x9b,0x68, + 0xfa,0xef,0x98,0xe1,0x9b,0x14,0x3e,0xce,0xbc,0xba,0x2c,0xa8,0x2c,0x37,0x3c,0x95, + 0x3,0x59,0x56,0x6a,0x38,0x97,0x2a,0xb2,0x18,0xf1,0x64,0x4,0x30,0x48,0xbb,0xb2, + 0x66,0xf6,0xe9,0xd2,0xed,0xb4,0x5a,0x8e,0x87,0x50,0x9,0x76,0x2d,0x6d,0x5c,0x11, + 0xa1,0xf9,0xa2,0xee,0xab,0xec,0x2f,0x52,0x1a,0x27,0x6e,0x2,0x1,0x21,0x14,0xbf, + 0x97,0x33,0x6f,0x13,0x2a,0x2e,0x62,0x14,0xb,0x30,0xeb,0xc6,0xb3,0xec,0xed,0x62, + 0x42,0xa9,0xb6,0xc4,0x41,0x49,0xe7,0x94,0x7e,0xb1,0x98,0xaa,0x59,0x70,0x26,0xb2, + 0x5a,0x45,0x6a,0xac,0x67,0x8,0x56,0x9c,0x82,0xb2,0x35,0x1c,0x95,0xf1,0xc,0x20, + 0x9e,0xb,0x89,0xd7,0x97,0xd3,0xf3,0x37,0xd1,0x55,0x2a,0x91,0x33,0xd3,0xce,0x9a, + 0x33,0x62,0xa2,0x7a,0x4d,0x7c,0x46,0x7,0x17,0xa7,0xc6,0x2,0xbb,0xd2,0x63,0x50, + 0x62,0x5f,0x9f,0xec,0x2c,0xb8,0xc8,0x99,0x48,0x12,0x30,0x14,0x19,0xe,0x9a,0xe9, + 0xe8,0x42,0x3e,0x82,0xcd,0xb2,0x91,0x56,0x96,0xde,0x1e,0x54,0x10,0xdf,0xc,0x91, + 0xf,0x9c,0xa6,0x60,0xcd,0xce,0x32,0x42,0x55,0x90,0xb0,0x10,0x19,0xec,0x9e,0xc6, + 0x6e,0x10,0xf5,0xa4,0x83,0x7d,0xd,0xba,0x2a,0x7c,0xc3,0xe5,0x61,0xd0,0x8b,0x41, + 0x9b,0x4f,0xe6,0x1b,0xdb,0x7,0xf8,0xf6,0xd1,0xa,0xfe,0x8f,0x5f,0x7f,0x8b,0xdf, + 0x7c,0xf5,0x8,0xf7,0x9e,0xae,0xa3,0xcb,0xb6,0x98,0x61,0x20,0x7d,0xf9,0x8b,0x9a, + 0x8b,0xac,0xa8,0x50,0x89,0x52,0x43,0x2b,0x6,0xdd,0x14,0xb3,0x8f,0xaf,0x1f,0x2c, + 0xe3,0xf4,0xec,0x18,0xa6,0x46,0x7,0x50,0xa9,0x14,0x49,0x49,0xbb,0xfb,0x47,0xfc, + 0x6c,0x6d,0x87,0x5b,0xed,0x8e,0xe6,0x7a,0x94,0xa8,0x1e,0xe5,0xa,0x9d,0x13,0x12, + 0x17,0x2e,0x24,0x79,0x7d,0x44,0x4f,0xfd,0xe0,0x68,0x22,0x5b,0x4a,0xa,0x5e,0x1, + 0x91,0x4c,0xe7,0xc0,0xc8,0xd5,0xad,0x3d,0xbe,0xfd,0x78,0x8d,0xb6,0x77,0xf,0x79, + 0x61,0x7a,0x94,0xfe,0x4b,0x4c,0x4c,0xe4,0x73,0x5a,0xdf,0x3e,0xc0,0x7f,0xfa,0xf0, + 0x1b,0xfc,0xea,0xcb,0x7b,0xfc,0xed,0xe3,0x35,0xec,0x1d,0xb4,0x9c,0x51,0xa7,0x2a, + 0xf,0xfe,0xce,0x32,0x9c,0xd1,0x3d,0xa4,0x24,0x8c,0x4b,0x1a,0x69,0xcf,0xde,0x67, + 0xbd,0x42,0x3a,0xe9,0x32,0x3f,0x5a,0xde,0xc2,0xa3,0x95,0x4d,0xfa,0xe0,0x93,0xbb, + 0xa8,0x56,0xc,0x5f,0x98,0x9f,0xc4,0x9b,0x97,0xe7,0xe9,0xfd,0x6b,0x67,0xf1,0xd6, + 0xe5,0x53,0xb8,0xb0,0x30,0xf5,0x42,0x4f,0xf3,0xb2,0xeb,0xea,0xf4,0xec,0x38,0x7e, + 0x78,0xfd,0x1c,0xad,0x6c,0xec,0xf0,0x7,0x9f,0xdc,0xa5,0xd5,0xcd,0x3d,0x15,0x90, + 0xa4,0xa7,0x74,0xa9,0x33,0x96,0x2b,0x3f,0x31,0xe0,0x8,0x76,0x10,0x81,0xb0,0x77, + 0xd8,0xa6,0xff,0xf0,0xf3,0x5b,0xf8,0xf8,0xd6,0x13,0xbc,0x76,0x6e,0x16,0xe7,0xe7, + 0x27,0xe2,0x2e,0x3a,0xf4,0xeb,0x47,0xad,0x13,0x6c,0xef,0x1d,0x62,0x79,0x7d,0x17, + 0x3b,0x7,0x2d,0x8c,0xc,0x34,0xf1,0xdf,0xfd,0xc9,0xfb,0x98,0x18,0x19,0x78,0xe5, + 0xf7,0x85,0x99,0xb1,0x77,0xd0,0xc2,0xd2,0xfa,0x2e,0xba,0x92,0x98,0x85,0x32,0x13, + 0xac,0x4c,0x93,0x4d,0x65,0x1,0x58,0x1,0xcc,0x25,0x99,0xdb,0x4,0x30,0x70,0xd8, + 0x3a,0xc1,0xed,0xc7,0x6b,0xb8,0xfd,0x78,0xd,0x1f,0xfc,0xf6,0x3b,0xfc,0xc5,0x9f, + 0xbe,0x8f,0xb7,0xae,0x2c,0xbe,0x32,0xff,0xa1,0x70,0xbd,0x85,0xba,0x63,0xf5,0x31, + 0xef,0xce,0x26,0xab,0x14,0x44,0x2a,0xe3,0x22,0x9e,0xb1,0xc6,0x1b,0x36,0x41,0x57, + 0x58,0x16,0xe6,0x98,0x99,0x69,0x3b,0x95,0x32,0xd7,0xb9,0xc0,0x65,0xa,0x77,0x9f, + 0x52,0x10,0x51,0xfe,0x78,0x48,0xc9,0x4a,0x29,0x33,0x84,0xa9,0x16,0xa0,0xa8,0xfc, + 0x17,0xc7,0x64,0x35,0x16,0xad,0x3b,0x4a,0xa,0x2b,0x50,0x1e,0xf3,0x26,0xa,0x2, + 0xe7,0xa2,0x26,0x2a,0x8f,0xe1,0xcc,0x13,0xbd,0x84,0xdf,0x5,0x40,0x19,0xd1,0x2e, + 0xbc,0xa0,0x62,0x2d,0xc5,0xc5,0x2e,0x11,0xe8,0x35,0x28,0x65,0x31,0xa7,0xf1,0xaa, + 0x13,0xf6,0xb6,0xb1,0x3e,0x19,0xca,0xc8,0xfb,0x91,0x97,0x9d,0xae,0xa,0xd2,0x64, + 0x83,0x40,0x1c,0xa,0xdc,0xa1,0xa8,0x76,0xc8,0x7c,0x80,0x73,0x54,0x40,0x2e,0xdc, + 0x49,0xef,0xda,0x9c,0xb,0x51,0xc8,0x6c,0x12,0x8,0xa,0x85,0x94,0x25,0xc5,0x94, + 0x70,0xdf,0x69,0x65,0x3b,0x4b,0x1a,0xbb,0x23,0x56,0xc7,0x5d,0xb4,0xc1,0x61,0xb1, + 0x18,0x4f,0x77,0x2d,0xb1,0x1e,0xf,0xd2,0xa7,0x42,0xf3,0xa3,0x89,0x3d,0x44,0xa2, + 0x8b,0x8c,0x96,0x95,0xe1,0x82,0x4c,0x50,0x7a,0x7a,0x12,0x3e,0x8a,0xc5,0x65,0x5b, + 0xb9,0x4d,0x3,0x7b,0x1b,0x58,0x16,0x4b,0x71,0x44,0x46,0xbb,0xb4,0x38,0x45,0x34, + 0xa2,0x9,0x24,0x3d,0x26,0xc6,0xc2,0xcc,0x18,0xfd,0x37,0x7f,0xfc,0x9e,0x79,0xff, + 0xda,0x59,0x5,0x1,0xf7,0x3a,0x7c,0xe5,0x64,0x7e,0x74,0xdc,0xc6,0xa7,0xb7,0x9f, + 0xe2,0x57,0x5f,0xde,0xc7,0x67,0xdf,0x3e,0xc5,0xa3,0xe7,0x5b,0x58,0xdf,0xda,0x43, + 0x97,0xad,0x20,0x4a,0x6a,0x8f,0x7c,0x75,0xbb,0xc6,0x74,0xae,0x32,0x25,0x1,0xf7, + 0xb8,0x83,0xb4,0xfe,0xc4,0x32,0x30,0x3e,0x3c,0x88,0x89,0x91,0x81,0xd8,0xbb,0xe4, + 0x64,0xa1,0xfb,0xcb,0x1b,0xf8,0xd5,0x97,0xf,0xb0,0xbd,0x7b,0xc8,0xfa,0x56,0xce, + 0x92,0x6,0x43,0xe1,0xe6,0x62,0xe,0x2,0x93,0x27,0xf8,0x90,0x42,0xfb,0x90,0x54, + 0x1d,0xb2,0x49,0x23,0x2a,0xb6,0xee,0xee,0xad,0xd8,0x3d,0x68,0xd1,0xed,0x47,0xcf, + 0xf1,0xeb,0xaf,0x1e,0x62,0xa0,0xbf,0x81,0x85,0xa9,0x91,0x94,0xb6,0xf5,0xa,0x70, + 0xbb,0xb5,0x16,0xed,0x93,0x13,0x7c,0xf7,0x64,0x15,0x7f,0xf3,0xdb,0xdb,0xfc,0xcd, + 0xc3,0x15,0x74,0x1c,0x6a,0xc1,0xaa,0x3d,0x8e,0xbd,0xb8,0x3,0xda,0x51,0x6c,0x5c, + 0x5c,0x2e,0x4d,0x74,0xb1,0x4c,0xb,0x18,0x5f,0x24,0x59,0xa0,0x51,0xa4,0xdb,0x19, + 0xf7,0xa,0x76,0xbb,0x96,0x1e,0x3c,0xdb,0xc0,0xee,0x61,0x8b,0xbf,0x7b,0xbc,0x86, + 0xbf,0xff,0xf4,0xe,0x5d,0x39,0x3d,0x83,0x1f,0xbf,0x73,0x1,0xaf,0x9d,0x9e,0x46, + 0x30,0x1e,0x2a,0x23,0xfc,0xe5,0x6,0x43,0xaf,0x9d,0x9b,0xc5,0x9f,0x74,0xde,0xa0, + 0x7,0xcf,0x36,0x79,0x75,0x6b,0x4f,0x5b,0x73,0x64,0x8c,0x58,0xa5,0x98,0x95,0xeb, + 0x48,0x19,0xa4,0x18,0x9a,0x7e,0x4e,0xae,0x7e,0x2b,0x1b,0x7b,0x38,0x6a,0x9f,0xe0, + 0xfe,0xd2,0x3a,0xfa,0x9a,0x75,0x54,0x4d,0x2a,0xa6,0x9d,0x8e,0xc5,0x51,0xbb,0x8d, + 0xfd,0xc3,0x36,0xe6,0x27,0x87,0x71,0xfe,0xd4,0x4,0xfa,0x1a,0xb5,0x57,0x86,0xde, + 0xbb,0xdd,0x2e,0xb6,0xf7,0x5b,0x58,0x5a,0xdb,0xc1,0xfe,0x41,0x4b,0x4d,0x9c,0x24, + 0x1a,0x28,0x15,0x30,0x45,0x59,0x98,0x96,0xc,0xbc,0x22,0x94,0x22,0xb8,0x94,0x8f, + 0xb9,0x7e,0x12,0xa8,0x98,0x57,0xbb,0x86,0x64,0x21,0xb7,0xd6,0xe2,0xb0,0x75,0x82, + 0xbd,0xc3,0xb6,0xde,0xc,0xb1,0xb3,0xd3,0xd,0xf6,0xd8,0xb1,0x58,0x86,0x17,0xde, + 0x19,0xc2,0xa5,0xf5,0x6f,0xd8,0x89,0xfb,0x24,0xf5,0x28,0x29,0x26,0x6d,0x19,0xce, + 0xa4,0x7,0x40,0xe6,0x72,0xb3,0x2e,0x69,0xf1,0xa,0xa1,0x2a,0x8d,0x6f,0x24,0x65, + 0x86,0x29,0x4c,0xd1,0xc7,0x3d,0x45,0x64,0x19,0x55,0x4f,0xab,0x71,0x9f,0x27,0x6c, + 0xe5,0x38,0xb3,0x5f,0x25,0x19,0xc0,0x5e,0xc8,0xb,0x15,0xf3,0x7b,0xbc,0x89,0xa8, + 0x50,0xdf,0x3,0x2,0xaa,0x22,0x3e,0x21,0xe8,0x38,0xd2,0x69,0xb5,0x97,0x99,0xb, + 0x51,0x41,0x4c,0x9f,0xa6,0x7d,0x3d,0x9c,0x83,0x62,0x16,0x64,0x86,0x3c,0x70,0x40, + 0x7b,0xb2,0xc7,0x19,0x2f,0xfa,0x58,0x14,0x53,0x91,0x27,0x22,0xb9,0x96,0x8c,0xd8, + 0x44,0x94,0x54,0x29,0x41,0x56,0x24,0x8,0xa6,0x53,0x47,0x47,0xb9,0x66,0x86,0x39, + 0xa9,0xa0,0x96,0xc9,0xf5,0x20,0x7c,0xf4,0xe3,0x4f,0x57,0x79,0xb9,0x54,0x7a,0x23, + 0xe8,0x29,0xd9,0x54,0xbc,0xc6,0x80,0xc3,0xb9,0x97,0x2e,0x3a,0xe,0x38,0x29,0x5c, + 0xe5,0x57,0x95,0x57,0xa0,0x33,0x9,0x28,0x20,0x92,0x52,0x37,0xdf,0xb7,0x26,0xcd, + 0x7a,0xb6,0x1b,0xc9,0x87,0x57,0x45,0x3e,0x4,0x47,0x5d,0xad,0x97,0x41,0xc7,0x5c, + 0xce,0xe0,0xf6,0x16,0x1d,0xe2,0x32,0x8f,0x70,0x4e,0x7c,0x2c,0xff,0xfd,0x61,0xcc, + 0x34,0xc1,0x40,0x9b,0x98,0x40,0xf5,0x6a,0x95,0x5e,0x3f,0x3f,0x47,0x3f,0x7d,0xf7, + 0x32,0x8d,0xe,0xf7,0x17,0xa6,0xa9,0x5c,0x53,0x2b,0x61,0xec,0xa3,0xe3,0x36,0xbe, + 0xba,0xbb,0x8c,0xbf,0xfa,0xf0,0x16,0x3e,0xf8,0xf8,0xe,0x96,0xd7,0x77,0x45,0x1a, + 0x1f,0x29,0xbd,0x4a,0x92,0x62,0x92,0x22,0x1d,0xa8,0x15,0x55,0x41,0xcd,0x92,0xa3, + 0x33,0xfa,0x58,0xb,0x7c,0x8e,0x7a,0xcd,0x60,0x71,0x66,0x4,0x8b,0xd3,0x63,0x31, + 0x8b,0x3a,0x14,0xf5,0xc3,0x56,0x1b,0xcf,0xd6,0x77,0xf0,0xd9,0xb7,0x4f,0xf8,0xd6, + 0x83,0x65,0x3e,0x3e,0xe9,0xea,0x86,0xb2,0xb0,0xc2,0xf7,0xb4,0xd0,0xe0,0x19,0xe7, + 0x5f,0x58,0x16,0xd2,0x88,0x34,0x5d,0x5,0x8e,0x82,0x68,0x9a,0xd,0x29,0xde,0x64, + 0x48,0x8a,0x7,0x69,0x58,0x7b,0x79,0x7d,0x97,0x3f,0xf8,0xe4,0x3b,0xd4,0x6b,0x55, + 0xfc,0xc9,0xef,0x5e,0xa3,0x89,0x91,0xea,0xb,0xb,0x47,0xfe,0xda,0x3f,0x5c,0xde, + 0xc2,0x97,0xdf,0x2d,0xe1,0xdb,0x87,0xcf,0xd1,0xb1,0x36,0x2a,0x65,0x55,0xa3,0xc1, + 0x3e,0x29,0x23,0x87,0xe9,0x38,0xb8,0xa3,0xa3,0x8c,0xc8,0xc1,0xd1,0x67,0x89,0xa1, + 0xf9,0x3,0xce,0xe0,0x5b,0xd4,0x7e,0xf7,0x2b,0xdb,0xb6,0x8b,0x95,0xcd,0x3d,0x2c, + 0x6f,0xee,0xe1,0xcb,0xbb,0x4b,0xfc,0xc5,0x9d,0x67,0xd4,0x72,0x39,0xde,0xb8,0xb8, + 0x30,0x89,0x91,0xc1,0x66,0xb4,0xa9,0x95,0x64,0xad,0xfc,0xda,0x1a,0xea,0x6f,0xe0, + 0xed,0x2b,0x8b,0xb8,0x76,0x71,0x9e,0xee,0x2d,0xad,0xf3,0xe6,0xce,0x11,0x2c,0xb8, + 0x2c,0x5e,0x58,0x30,0x1f,0xf4,0xc4,0x18,0xcd,0xdd,0x63,0x6f,0x68,0x28,0xb8,0x8e, + 0x85,0xcf,0xef,0xec,0xb7,0xb0,0xb3,0xdf,0xca,0x3a,0x6e,0xbd,0x4a,0x3d,0xbf,0x30, + 0x81,0x1b,0x97,0x16,0x30,0x3e,0x3c,0xf0,0x4a,0x4c,0x7f,0x66,0xc6,0xe1,0x71,0x7, + 0x5f,0xde,0x5d,0xc2,0xbd,0x67,0x1b,0x60,0xa2,0xa2,0x1b,0x88,0x57,0x76,0x27,0x22, + 0x79,0x9e,0xaf,0xa1,0x9b,0xcc,0xb2,0xb9,0x8b,0x4,0x17,0x27,0xfc,0x65,0xa8,0xbf, + 0x89,0x77,0xae,0x2c,0xe0,0xf2,0xe9,0xc9,0x9e,0x91,0xad,0xf9,0xba,0x23,0xbc,0xf6, + 0xc7,0x27,0x5d,0x3c,0x5a,0xde,0xe0,0x95,0xcd,0x5d,0x56,0xa8,0x8a,0x24,0x5e,0x11, + 0xe5,0xa1,0x38,0x22,0xd,0x21,0x3a,0xfe,0x85,0xb,0x8e,0xc3,0xe5,0x6e,0x99,0x44, + 0xd6,0x85,0x6f,0x7a,0xad,0xf5,0xcd,0x0,0x31,0x53,0xe6,0x96,0x19,0x65,0x6a,0x12, + 0xbc,0x65,0xb1,0x9b,0xf7,0x9e,0xfd,0x5,0x95,0x59,0xe6,0xb2,0x9a,0x2c,0xa,0x54, + 0xa8,0x6a,0x55,0xae,0xfa,0x24,0x16,0xcf,0x2a,0xc1,0x8f,0xf5,0x4e,0x97,0xa4,0xff, + 0x2c,0x9,0xe6,0x65,0x2a,0xa0,0xc2,0xd7,0x53,0xe0,0x7e,0xa4,0x53,0x4b,0x14,0x64, + 0xc6,0x51,0x5f,0x7,0x15,0x55,0xa4,0x4d,0x4d,0x72,0xd8,0x9f,0xb3,0xe2,0x26,0x59, + 0xf7,0x3a,0xd2,0x34,0xc3,0xa1,0x65,0xbe,0x78,0x94,0x1c,0xa,0xca,0x86,0x21,0xca, + 0xf6,0xf5,0x5e,0x8d,0x90,0x4e,0xb3,0x98,0x72,0xa4,0xa8,0x35,0x41,0x58,0xed,0xa7, + 0x79,0x13,0x16,0xd7,0x9e,0xd1,0xef,0x67,0xfa,0x34,0xa5,0xe6,0x68,0xbf,0x17,0x1b, + 0x31,0x8a,0x33,0x73,0x7c,0xbe,0x62,0xb7,0x9e,0x55,0x9,0xce,0x33,0xde,0xa3,0x68, + 0x49,0xc4,0x5a,0x27,0xa6,0x3b,0xab,0xa9,0x32,0x90,0xf9,0x2c,0x73,0x2e,0xa7,0x48, + 0x7c,0x7,0x26,0xc5,0x9f,0xf2,0x5,0x39,0x5f,0x4,0x12,0xa9,0x66,0xa7,0xb8,0x49, + 0x8e,0x26,0x24,0x46,0xd8,0xba,0xa6,0x20,0x10,0xf6,0x52,0x35,0x32,0xd2,0x75,0x5d, + 0xff,0x43,0x31,0xa0,0x5,0xce,0xda,0x3d,0x14,0x9b,0xf8,0xb8,0x9,0xf5,0x5a,0x15, + 0xef,0xbd,0x7e,0x86,0xde,0x7d,0x6d,0x91,0x9a,0xcd,0x5a,0x69,0x7,0xdf,0x8b,0x4c, + 0x63,0xad,0xc5,0x5f,0xff,0xe6,0x36,0xfe,0xf3,0x47,0xdf,0xe2,0xa3,0x9b,0xf,0xb1, + 0xbe,0x73,0x98,0xf1,0x4,0xc3,0xde,0x4d,0x2,0x1e,0xa4,0xae,0xfd,0x74,0x20,0xeb, + 0xeb,0x4e,0xca,0x34,0x12,0x8a,0xad,0xf3,0xea,0x25,0x3a,0x62,0x8c,0xc1,0xec,0x84, + 0xf3,0x92,0xcf,0x77,0xfb,0xb7,0xee,0xaf,0xe0,0x7f,0xfe,0xab,0xdf,0xf2,0x6f,0xbe, + 0x7e,0x8c,0xe3,0x28,0x17,0x4a,0x5e,0xcf,0x94,0xe3,0xb9,0xe4,0xfa,0xb6,0x18,0x64, + 0xca,0xd1,0x51,0xbf,0x0,0xef,0x89,0x11,0xca,0xcb,0x1,0x41,0x6a,0x69,0x14,0x1e, + 0x3c,0x1,0x45,0xe1,0x2b,0xd1,0xaf,0xbf,0x7a,0x4,0x6,0xe1,0xad,0x2b,0xa7,0x30, + 0x32,0xd0,0x54,0xcd,0x48,0x2f,0x88,0xd4,0xed,0x55,0x19,0x1f,0x7f,0xf3,0x4,0x1f, + 0x7d,0xf5,0x28,0x91,0x80,0xa1,0xe2,0xfb,0x58,0xd4,0x62,0x96,0x8,0x5e,0x3c,0xbd, + 0xa8,0xdc,0x38,0x51,0x2e,0x37,0x28,0x78,0xaa,0x23,0x2d,0x71,0xdc,0x99,0xcb,0x24, + 0x92,0x2,0xf5,0x6e,0x8e,0xc,0x56,0x36,0x76,0xf9,0x7f,0xfa,0xab,0x8f,0xf1,0xf9, + 0xdd,0x67,0xf4,0xaf,0x7f,0xfa,0x16,0xde,0x7f,0xfd,0x34,0x66,0x27,0x86,0xcb,0x61, + 0xde,0xec,0xb9,0xd5,0xab,0x15,0xfc,0xf0,0x8d,0xb3,0xd8,0xde,0x3b,0xa4,0xbf,0xfa, + 0xd5,0x37,0xdc,0x6a,0x75,0xb4,0x1a,0x58,0x82,0xeb,0x9c,0x5b,0x83,0x52,0x21,0x72, + 0xa3,0xc4,0x54,0x2e,0x11,0x87,0x91,0x23,0x2c,0xa9,0x2f,0x3b,0x3d,0x33,0x8e,0xef, + 0xbd,0x7e,0x1a,0x13,0x23,0xfd,0x2f,0x2c,0x8e,0xb2,0x1,0xde,0x3b,0x68,0xe1,0x83, + 0x8f,0xef,0xe2,0xeb,0x7b,0x2b,0xa9,0x48,0x73,0x86,0xf2,0x84,0x3d,0xb4,0x18,0xa8, + 0x24,0x1c,0xcf,0x19,0xd1,0x28,0xae,0x7e,0x4,0x5d,0x3b,0x12,0xa2,0xfd,0xef,0xb8, + 0xb8,0x30,0x89,0x7f,0xfb,0x2f,0xbf,0x87,0x77,0xaf,0x2c,0xaa,0xcc,0x84,0x57,0x81, + 0xdd,0x8f,0x8f,0x4f,0xf0,0xd9,0x77,0x4b,0x7c,0xef,0xe9,0x26,0xb2,0xb0,0xc7,0x12, + 0xab,0xf2,0x30,0x99,0x3b,0x92,0x9,0x87,0xa4,0x1d,0x3,0xb0,0x85,0x3b,0xc7,0xd9, + 0xc6,0xf1,0xdd,0xd,0x6e,0xc6,0x75,0x8f,0xb0,0xfa,0x9e,0x31,0x28,0xac,0x98,0xbd, + 0xa4,0x48,0xf9,0xaa,0x38,0xa4,0x40,0x36,0x5d,0x6,0xc5,0x2e,0x88,0x41,0x6c,0x94, + 0x9f,0x47,0x38,0xf2,0xe4,0x2a,0xa6,0x5a,0x84,0xfb,0xe4,0x64,0x58,0xdc,0xfe,0xea, + 0x4c,0x6e,0x5d,0x34,0x49,0x4c,0x73,0x59,0xb8,0x69,0x76,0xd0,0x69,0x82,0x40,0xee, + 0x64,0xa6,0x7c,0xc7,0x55,0xb8,0x2a,0x89,0xb0,0x97,0x2,0x80,0xa1,0xf6,0x17,0x9a, + 0x7a,0xcd,0x45,0x54,0x27,0x95,0x65,0xf5,0xa5,0xec,0x2b,0x82,0xd0,0x44,0xc7,0x42, + 0x48,0x42,0x92,0x25,0xf8,0xee,0xfe,0x82,0x26,0xa,0x1d,0xa5,0x7,0x8d,0x43,0xf0, + 0xa,0x45,0x1f,0x53,0x39,0xd9,0x29,0xd6,0x78,0xc9,0x3,0x33,0x72,0x82,0xcb,0x90, + 0x6f,0xeb,0x90,0x41,0x26,0xe8,0xee,0x4f,0xae,0xb0,0x18,0x2a,0x5f,0x35,0x37,0x77, + 0x89,0x33,0xb8,0xcb,0xf,0x50,0x4d,0x9d,0x31,0x1c,0x8b,0xa2,0x11,0xef,0xa2,0x91, + 0x84,0x8e,0x4,0x23,0x92,0x28,0x54,0xc9,0xb5,0xda,0x13,0xa9,0xd4,0xc8,0xa6,0xd8, + 0xd2,0x0,0x19,0x26,0xc9,0xc2,0x4b,0x41,0xaa,0x2a,0xb1,0xcb,0x48,0x12,0x1c,0x49, + 0x46,0xbb,0xdc,0x33,0x98,0xb0,0x36,0x37,0x81,0xac,0x45,0x20,0x50,0xbd,0x56,0xa1, + 0x37,0x2f,0xce,0xd3,0xf5,0x8b,0xf3,0xa8,0x55,0x8c,0xd2,0x70,0xbf,0x68,0x77,0xde, + 0x3a,0x3e,0xc1,0x9d,0x27,0xab,0xf8,0xbb,0x8f,0x9d,0x7e,0x78,0x6b,0xef,0x30,0x5f, + 0xff,0x29,0x84,0x5,0x65,0x59,0xf0,0xaa,0xfe,0x94,0x8c,0x5f,0xd0,0x5d,0x7a,0x61, + 0x4c,0x11,0x24,0x44,0x66,0x60,0x63,0xe7,0x10,0x1b,0x3b,0x7,0x38,0xe9,0x74,0xd1, + 0x6a,0x77,0xb0,0xb1,0x7d,0x80,0x47,0xcf,0x37,0xf1,0xc9,0x37,0x8f,0xf9,0xc3,0x2f, + 0x1f,0xf0,0xfa,0xce,0xbe,0xdb,0xbc,0x19,0x8f,0x24,0x6a,0xd6,0x4a,0xd0,0x42,0xba, + 0xf7,0xca,0xc8,0xd5,0x88,0xf5,0x87,0xa,0x11,0xd8,0xa6,0x1e,0xd5,0x88,0xe6,0x93, + 0x2,0x31,0xd3,0x24,0x38,0x30,0x22,0x35,0xe9,0x63,0x71,0x3b,0x28,0x9e,0xa6,0xa9, + 0x18,0xf4,0x35,0xea,0x2f,0x85,0xdc,0x65,0x31,0xd9,0xde,0x6f,0xe1,0xe6,0xdd,0x67, + 0xfc,0xf5,0x83,0x65,0x74,0xad,0x8d,0x36,0xe6,0xd1,0xd4,0x23,0xc9,0x86,0x2,0x6b, + 0x3f,0xeb,0xdb,0x99,0xf3,0xc4,0x44,0x96,0x7e,0xde,0xec,0xa6,0xda,0x68,0x13,0x15, + 0xfa,0x5e,0x31,0x99,0xc4,0xce,0x95,0x48,0xc,0x35,0xee,0xe7,0x74,0x2d,0xb0,0x7b, + 0x78,0x8c,0x4f,0xbe,0x79,0xcc,0xf5,0x6a,0x95,0x3a,0x9d,0x2e,0xfe,0xe0,0xbd,0xcb, + 0x18,0x19,0x68,0x28,0x4d,0x7a,0x4e,0x26,0x33,0xc6,0xa0,0x52,0x31,0xb8,0x7e,0x61, + 0x1e,0xcf,0x37,0xf7,0xf0,0x77,0x9f,0xde,0xa3,0xa3,0x76,0x17,0x79,0xe0,0x79,0x99, + 0x67,0x86,0x9e,0xc5,0x8a,0x4,0x63,0x2a,0xe1,0x20,0x95,0x71,0x64,0x2b,0x44,0x18, + 0x1b,0xee,0xc3,0x99,0xb9,0x71,0x4c,0x8d,0xd,0xbe,0x94,0x60,0x26,0x39,0xd,0x4b, + 0x6b,0x3b,0xb8,0x79,0xef,0x19,0x96,0xd6,0x76,0xc2,0x2e,0xd1,0x5d,0x6c,0x9e,0x2c, + 0x19,0x8f,0x9d,0xb8,0x58,0x33,0x7a,0x47,0x60,0x28,0xca,0x79,0x21,0xe9,0x18,0x90, + 0xc1,0x4f,0x69,0x6d,0x31,0x3c,0xd8,0xc4,0x8d,0x8b,0x73,0xf8,0x83,0x77,0x2f,0xe1, + 0x9d,0x2b,0x8b,0x31,0x1c,0xa9,0x17,0xb1,0x52,0xbe,0xce,0x92,0xc0,0xf7,0xf1,0x37, + 0x8f,0xf9,0xee,0xd3,0x35,0x16,0x53,0x48,0x42,0x4d,0x63,0x9e,0xaa,0x9,0x21,0xb7, + 0xae,0xbd,0x20,0x30,0x91,0x1,0xfb,0xd5,0x1a,0x91,0x85,0xd2,0x3a,0x87,0x19,0xc4, + 0x72,0xa9,0xc9,0x56,0xbc,0xa,0x4d,0xa8,0x5e,0x62,0xe0,0x65,0x52,0xc9,0xd3,0xd1, + 0x3f,0x44,0x84,0x7a,0x85,0x95,0x7d,0x4e,0xec,0x8e,0xbe,0x27,0xb9,0x6f,0x1b,0x1, + 0xd5,0x2,0x31,0x41,0x32,0x2d,0xb3,0xdd,0x75,0x22,0x5b,0xe5,0x7,0x45,0x66,0xf4, + 0xc6,0x84,0xd2,0x10,0x54,0x82,0xca,0x2,0x97,0x5,0x8d,0x4a,0xd6,0xdd,0x4c,0xc8, + 0x8c,0x68,0x50,0xb2,0xd8,0x2b,0x61,0x7d,0xb,0x60,0x9a,0x39,0xa5,0xf,0xea,0x8a, + 0x46,0x42,0x72,0x1e,0xe,0xad,0x4a,0x88,0x93,0x24,0x23,0x2c,0x51,0x20,0xa0,0x78, + 0x63,0xc2,0xeb,0x6d,0x92,0xfb,0x72,0x38,0xf8,0x4c,0x3a,0xad,0xd,0x74,0x15,0xf7, + 0xa6,0x5a,0x8e,0xf2,0x15,0xf2,0xda,0x9,0x4a,0x3e,0x63,0x14,0x29,0x8e,0x39,0x94, + 0x53,0xe9,0x5a,0xe7,0xcf,0x4f,0xca,0x43,0x67,0xc4,0xe6,0x1b,0x29,0xb2,0x49,0xaf, + 0x3,0xa5,0xd3,0x14,0x8c,0x3b,0xcc,0xb8,0x22,0xb6,0x32,0x2c,0x26,0xf6,0xcc,0x5e, + 0xb6,0x70,0x58,0x18,0xd5,0x45,0x64,0x3b,0x12,0xa3,0x16,0x96,0x30,0x22,0x7f,0x36, + 0x4c,0xe4,0x22,0xd1,0xcb,0x5f,0xa4,0x24,0x86,0x8d,0x0,0xf5,0x9a,0x24,0x82,0x8e, + 0xd3,0xa1,0x20,0xc5,0x85,0xf2,0x6f,0xa2,0xf4,0x8d,0x43,0x75,0xf,0xb6,0xaa,0xd5, + 0x2a,0x2e,0x9f,0x9d,0xa1,0xb3,0xf3,0x13,0xd4,0x6b,0x5f,0x5e,0x76,0x78,0x3d,0x5c, + 0xde,0xc0,0xcf,0x3e,0xbb,0x87,0xdf,0x7e,0xfb,0x18,0x5b,0x7b,0x47,0x59,0x1a,0x1d, + 0xf4,0x40,0x28,0x5e,0x33,0x83,0x32,0xcb,0x7c,0x2a,0x45,0xd4,0xb,0xe4,0xb8,0xdc, + 0x48,0x48,0xf0,0x58,0x3a,0x1d,0x8b,0xcf,0xef,0x2c,0xb9,0x33,0xd1,0x38,0xb2,0xd8, + 0x9d,0xc7,0xab,0xfc,0xd1,0xad,0x47,0x58,0x5e,0xdb,0x61,0x52,0x68,0x98,0xd,0x16, + 0xa1,0x2e,0xe,0x94,0x99,0xa5,0x76,0x55,0x86,0x24,0xb1,0x7f,0xd4,0x49,0xe7,0x1a, + 0xe3,0x6a,0xe1,0x70,0x25,0xa3,0xf4,0xfc,0xa1,0xa9,0x62,0x70,0x46,0x74,0x93,0x3a, + 0x45,0xd7,0xe2,0x54,0x8d,0x73,0x4e,0x7b,0xe7,0xd2,0x2,0xe6,0x7c,0x10,0xcb,0xab, + 0xb8,0xee,0x1d,0x1d,0x9f,0xe0,0xd1,0xca,0x26,0xee,0x3d,0x5d,0xc7,0x41,0xeb,0x84, + 0xcb,0x55,0x2a,0x11,0x43,0x14,0x74,0x1a,0x8f,0x7d,0x1a,0x44,0xa5,0x91,0x44,0xfd, + 0x54,0x40,0x83,0xf2,0xe1,0x96,0xf6,0xde,0x2c,0x13,0xa,0x1c,0x1f,0x53,0xfc,0x2, + 0x41,0x2,0x1,0x11,0xa1,0xdd,0xb1,0xf8,0xfb,0xcf,0xee,0x81,0xc1,0x18,0x19,0xec, + 0xc7,0xdb,0x57,0x4e,0x61,0x62,0x64,0xa0,0xe7,0x5a,0x27,0x7c,0x7c,0x6a,0x6c,0x10, + 0x17,0x17,0xa6,0x30,0xd4,0xdf,0xc4,0xf6,0x7e,0xeb,0xc5,0xdc,0xe2,0x12,0x9e,0x29, + 0x71,0x89,0xbb,0x74,0x61,0xb0,0x2a,0x4b,0xed,0x2,0x6,0xfa,0x1a,0xb8,0x71,0x79, + 0x11,0xe7,0xe7,0x27,0x5e,0x38,0x99,0xcb,0xf7,0xa5,0xdb,0xed,0x62,0x65,0x73,0x1f, + 0xb7,0x1f,0xaf,0x62,0x69,0x7d,0x57,0x98,0x82,0x25,0x24,0x4a,0xef,0xbc,0xe5,0x8a, + 0xd3,0x24,0xd2,0x17,0x74,0xac,0x75,0x71,0xb7,0x9c,0xee,0x95,0x91,0xa1,0x26,0xde, + 0x38,0x37,0x8b,0x7f,0xfb,0x2f,0xde,0xc3,0xef,0xbd,0x75,0x1,0x95,0xca,0xcb,0xe3, + 0x55,0xf3,0xc2,0x7e,0xd8,0x3a,0xc1,0xbd,0xa5,0xd,0xfe,0xfc,0xbb,0x67,0xbc,0xbe, + 0x73,0xc0,0xc9,0xb9,0xd3,0x5f,0x1e,0x71,0xe5,0x68,0xd9,0x21,0x35,0xc4,0x16,0x3a, + 0x3d,0x4d,0xa6,0x80,0x85,0xa1,0x92,0xd8,0xa,0x43,0x95,0x18,0xc6,0x2a,0x20,0x74, + 0xb9,0x94,0x35,0xe9,0xa,0xcb,0xee,0x19,0xcd,0xdd,0xd6,0x83,0x6e,0xe4,0x44,0x1b, + 0x14,0xe3,0x48,0x94,0x7d,0x7c,0xba,0x3e,0xaa,0x44,0x19,0xdb,0xaf,0xa0,0x9,0xd3, + 0x76,0xa2,0x2c,0x76,0x30,0x54,0xd8,0xd1,0x9,0xe6,0x7a,0xd0,0xa9,0xb,0x14,0x3b, + 0xee,0x96,0xb3,0xc9,0x94,0xa8,0x18,0xd5,0xa9,0xb6,0xaf,0x2c,0xa0,0xca,0xec,0xb8, + 0x8b,0x56,0xaf,0x2c,0xa2,0x5a,0x15,0x5,0x4b,0x14,0x6d,0x22,0xc5,0xd7,0x12,0x83, + 0x63,0x2c,0xce,0x69,0x25,0x61,0xd4,0xfa,0x2d,0x96,0x14,0xa1,0x98,0x56,0xbf,0x21, + 0xc0,0xce,0xd2,0xe9,0x85,0x74,0x5c,0x52,0x2,0xaf,0x33,0x14,0x81,0xb,0xc2,0x39, + 0x50,0x12,0xfe,0x27,0x3f,0xee,0xec,0xe,0x17,0x29,0x1c,0x19,0xc1,0xca,0x28,0x53, + 0x1c,0x8a,0x47,0x5d,0x64,0x34,0x47,0xda,0x8d,0x1b,0xc6,0x2d,0xb3,0xda,0x70,0x73, + 0x94,0x2f,0xe6,0x7b,0xb2,0x42,0x98,0x5b,0x64,0xd,0x4,0xcb,0x98,0x68,0x5e,0xa9, + 0x62,0xb3,0x59,0x26,0xe1,0x19,0x71,0x69,0xc4,0x80,0xf,0x90,0x92,0x33,0x44,0x5b, + 0x77,0x44,0x16,0x7b,0xf0,0x76,0x8f,0x1e,0xd6,0x8e,0x1,0x1f,0x78,0x24,0x7e,0x88, + 0x4f,0xcc,0x6c,0x80,0x60,0x2a,0x44,0x13,0x23,0x3,0x18,0xec,0x6b,0xbc,0x50,0xb7, + 0x9a,0x1f,0x4,0xdf,0x3c,0x7a,0x8e,0xbf,0xfd,0xe4,0xe,0xd6,0xb6,0xf,0x52,0x94, + 0x80,0x5c,0x7,0xb1,0xb8,0xe1,0xa,0xf7,0x41,0xd1,0x6f,0x1f,0xa5,0x57,0x6f,0x6, + 0x89,0x86,0xb7,0x4e,0x24,0x15,0x86,0x3f,0x27,0x5d,0x8b,0xf,0xbf,0x78,0x80,0x5b, + 0xf7,0x57,0x60,0xa8,0x82,0xa3,0xf6,0x31,0xef,0xec,0xb5,0xb0,0xba,0xb9,0x5f,0x50, + 0x6,0x92,0x28,0x5c,0xe,0x41,0x8e,0x19,0x9c,0xac,0xe4,0x35,0xf2,0x18,0x35,0x7e, + 0x94,0x10,0xae,0x8e,0x86,0xd,0x41,0xb,0x35,0xc4,0xdb,0x64,0xe2,0xb5,0x4e,0xd2, + 0x6d,0x4a,0xdc,0xdf,0x64,0xc,0xae,0x5f,0x9c,0xa7,0x1b,0x97,0x17,0xa8,0x5e,0x35, + 0x8a,0x24,0x96,0x1b,0xf7,0xc8,0xdb,0xe9,0xe1,0xb3,0xd,0xfc,0xf2,0x8b,0x7,0xbc, + 0xba,0xb3,0x9f,0xa5,0x13,0x32,0xeb,0xb1,0x3c,0xd0,0x52,0xa2,0xbb,0x7,0x7,0xf2, + 0x92,0xe3,0xb7,0x71,0x2a,0xfd,0xc2,0x41,0x2a,0x7c,0x5,0xf2,0xb5,0x94,0x13,0x23, + 0x45,0xc,0xd8,0x21,0xef,0xcc,0xe1,0x2c,0x60,0x81,0x97,0x85,0x2f,0xb,0xc3,0xd4, + 0x17,0x77,0x9e,0xa1,0x59,0xff,0x82,0x26,0x46,0xfa,0x31,0x31,0x32,0xf0,0x52,0x24, + 0x82,0x99,0x31,0x36,0xdc,0x8f,0xb,0xa7,0x26,0xb1,0xb5,0x7b,0x88,0x83,0xd6,0x49, + 0x7c,0xac,0x5,0xfa,0x43,0x76,0xc1,0x30,0x95,0x28,0x71,0x29,0xd7,0x48,0xe4,0x59, + 0x5f,0xe9,0x23,0x3,0x7d,0xd,0xbc,0xff,0xfa,0x69,0x5c,0x5c,0x9c,0x8a,0x8f,0xa5, + 0x97,0x47,0x7b,0x98,0x84,0x8d,0x31,0xf8,0xe2,0xce,0x12,0x3e,0xbc,0xf9,0x8,0x7, + 0x47,0x27,0x48,0xa6,0x60,0x88,0xb2,0x63,0x2e,0x95,0xe3,0x52,0xae,0x7e,0xce,0xd6, + 0x4a,0xac,0x89,0x17,0xfe,0xcf,0xf5,0xb,0x73,0xf8,0xc1,0x1b,0xa7,0xf1,0xa3,0x37, + 0xcf,0xe3,0xda,0xb9,0x59,0x54,0xab,0x95,0x42,0x98,0x51,0xae,0x32,0x28,0x8b,0x8a, + 0xfd,0xf0,0xcb,0xfb,0xfc,0xef,0x7e,0xfe,0xb5,0x5d,0xdf,0x39,0x10,0x5c,0x30,0xf6, + 0x89,0xd5,0x2e,0x6e,0x10,0x11,0x65,0xb2,0x9,0x55,0x60,0xcb,0x82,0xd,0x1e,0xc0, + 0x1c,0x16,0x94,0x74,0x61,0xd,0x47,0xa2,0xc4,0x91,0x20,0x6f,0x8,0xd2,0x1a,0x95, + 0x53,0x19,0x8c,0xf0,0x7d,0x52,0x8d,0x99,0x54,0x9b,0x96,0xa8,0xc8,0x15,0xdf,0x8a, + 0xb2,0x9,0x5d,0x4f,0xf4,0x9c,0xe1,0xf7,0xac,0x74,0xc9,0x5,0xe9,0x1,0x95,0x48, + 0x25,0xa3,0xa2,0x8d,0x4a,0xc8,0xe,0x54,0x4c,0x3b,0xcb,0xfd,0xdf,0x95,0x5a,0x5b, + 0x74,0xd7,0xc2,0xc6,0x27,0xe9,0x63,0xf5,0xab,0x25,0xfb,0x8d,0xd8,0x19,0xc6,0xbd, + 0x4,0x9,0x9e,0x37,0x47,0xb4,0x36,0x6d,0x9f,0x8d,0xc,0x90,0x22,0x16,0x24,0xb8, + 0x0,0x38,0xb,0x56,0xb5,0x20,0xcb,0x26,0x70,0x2e,0xd6,0x28,0xe,0x6b,0xe,0xe1, + 0xd9,0x1e,0xcc,0x9b,0x91,0xe7,0xdc,0x2a,0x79,0x4,0x28,0x52,0xd2,0xc5,0x3e,0x89, + 0x8a,0x37,0x8c,0x9b,0xd6,0x90,0x8,0x7c,0x6c,0xb4,0x2d,0xae,0x88,0x6e,0x22,0x23, + 0xd5,0x68,0xe9,0x65,0x71,0xd8,0xac,0x89,0xdd,0x26,0xb1,0xb2,0xc7,0x4b,0xaf,0x4e, + 0x64,0xa4,0xb2,0x38,0xd,0xa1,0x70,0x7d,0x23,0xb9,0x47,0x64,0x48,0xfa,0x21,0x29, + 0x9e,0xa5,0x74,0x88,0x45,0x8c,0x45,0x27,0x2d,0x13,0x74,0xf8,0x79,0xca,0x30,0x4f, + 0x96,0x64,0x69,0xdf,0xee,0x64,0xd4,0xa9,0x73,0x95,0x5a,0x42,0x77,0xe6,0x18,0x54, + 0xd0,0xac,0xd5,0x5e,0x69,0x12,0x91,0x87,0xed,0xf3,0x8d,0x3d,0x7c,0xf7,0x78,0xd, + 0x9d,0x8e,0x45,0x84,0x5e,0x38,0x97,0xc0,0xe4,0x10,0x54,0x2,0x3f,0x7b,0x45,0xe2, + 0x12,0x34,0x22,0x55,0xc,0x45,0x62,0x5,0xc7,0x93,0x30,0xf,0x79,0xb2,0xb6,0x8b, + 0x27,0xab,0x3b,0xac,0x20,0x2,0x27,0x1,0x50,0xf7,0x6e,0xde,0x50,0x30,0x85,0xfd, + 0x9b,0xf5,0xc,0x76,0xdf,0x60,0xda,0x0,0xed,0x91,0xef,0xdd,0x48,0x87,0x15,0x13, + 0xa7,0xc,0xf5,0xc4,0x10,0x22,0xa5,0x4c,0x20,0x49,0x54,0x74,0x3b,0xc6,0x30,0xa8, + 0x37,0xeb,0x55,0xbc,0x7e,0x6e,0x16,0xaf,0x9d,0x9d,0xe,0xd4,0x86,0x52,0x74,0x44, + 0x4e,0xaf,0xcc,0x8c,0xbb,0x4b,0xeb,0xf8,0xc5,0x97,0xf7,0xb1,0xbd,0x7b,0xc4,0x2, + 0xb2,0x66,0xe1,0xf,0xcc,0x94,0xf6,0xb5,0x1,0xce,0x72,0xd,0xb,0x53,0xd6,0x2a, + 0x73,0x1a,0x67,0x19,0x59,0x36,0xb4,0xe7,0xca,0x84,0x1f,0x2e,0x9d,0xac,0x2,0x13, + 0x90,0x34,0xb5,0x15,0x3e,0x9c,0x4e,0xaa,0x4f,0x18,0xc0,0xce,0x41,0xb,0x1f,0xde, + 0x7c,0x84,0x9f,0xbe,0x77,0x19,0xaf,0x9f,0x9b,0x41,0xfd,0x5,0xeb,0x85,0x70,0x1d, + 0x36,0xeb,0x55,0x2c,0xcc,0x8c,0xe1,0xc1,0xca,0x16,0xe,0x56,0xb6,0x2,0x91,0x5b, + 0x13,0xb2,0xb8,0xec,0x8c,0xcd,0x88,0x73,0xc9,0x42,0x40,0xa1,0x7d,0x9c,0x1,0xf5, + 0x81,0x6a,0x33,0x3a,0xdc,0x8f,0x6b,0xe7,0x66,0xb1,0x30,0x3d,0xfa,0x52,0x7,0xbf, + 0x0,0x5d,0x1f,0xb6,0x4e,0x70,0xf3,0xde,0x32,0xbe,0xb8,0xf3,0xd4,0xa9,0xd,0x48, + 0xdf,0x2,0xfa,0x4c,0x28,0x1e,0xef,0xf9,0xa,0x4a,0x66,0x41,0x84,0xaf,0xa9,0x54, + 0xc,0x9a,0xcd,0x1a,0x2e,0xce,0x4f,0xe2,0xa7,0xef,0x5d,0xc4,0x1f,0xbc,0x7b,0x11, + 0x57,0xbc,0xa9,0x8f,0x2c,0xe6,0x65,0x8a,0x14,0x79,0xff,0x86,0xfd,0xfa,0xd3,0xd5, + 0x1d,0x7c,0xf0,0xe9,0x3d,0xfe,0xc5,0x17,0xf7,0xb9,0xd5,0xee,0x78,0xba,0x15,0xa5, + 0x78,0xe,0xe3,0x93,0xa3,0xac,0x65,0xeb,0x8e,0x62,0xaf,0x48,0x77,0x8d,0xa3,0xf5, + 0x10,0xbc,0x5c,0x47,0x72,0xa0,0x66,0xc6,0xac,0x13,0x62,0x1d,0x47,0x4d,0xc8,0x17, + 0x96,0x85,0xd0,0xcd,0x2,0xe9,0xb1,0xe4,0x7d,0x95,0x83,0xb6,0x11,0x92,0x3e,0x52, + 0x4c,0xab,0xc4,0x6d,0xb,0xc6,0x32,0x85,0xc0,0x7,0x91,0xe9,0x25,0x19,0x74,0x2c, + 0xa0,0x13,0x96,0x64,0x86,0x4c,0x75,0x86,0x92,0x6e,0x8c,0xb,0x24,0x3d,0x51,0xc4, + 0xc,0xd2,0x85,0xac,0x24,0x5a,0x7e,0x9a,0xa,0xe8,0x6a,0x98,0x29,0xc5,0xbe,0x6, + 0x24,0xc3,0x53,0x22,0xdc,0x4f,0x79,0xb7,0x9a,0xac,0x43,0x85,0x5e,0xd8,0x18,0x1, + 0x12,0x86,0x2b,0x86,0x20,0x17,0xe3,0x62,0x31,0x2b,0x46,0x6c,0x9,0xc1,0x8b,0x69, + 0x90,0xe4,0xda,0xdb,0x50,0x59,0x7c,0x49,0x50,0x5a,0x2b,0x3d,0x3b,0x4a,0x26,0xa0, + 0x94,0x31,0xca,0xd2,0x12,0xaa,0xf0,0x4e,0x19,0xe1,0x6e,0x4,0x41,0xf4,0xd,0x6, + 0xdc,0x86,0xf4,0x4e,0xc2,0xcd,0x30,0x81,0xde,0x17,0x61,0x76,0xd5,0xa2,0x59,0xc9, + 0x94,0xe3,0xd2,0x9b,0x94,0xa,0xa9,0x7e,0x1e,0xa8,0x94,0x5b,0x30,0x45,0x2c,0x2e, + 0x88,0xfb,0xd4,0xe2,0x83,0xf2,0x6d,0x74,0xc,0x56,0x61,0xd2,0xe,0x72,0xc6,0xb8, + 0xd5,0xa6,0x9,0x2d,0x54,0x24,0xcc,0x25,0x17,0x78,0xa8,0x66,0x90,0x88,0xbd,0xbc, + 0xec,0xd5,0x3c,0xbe,0xe5,0x1,0x57,0xab,0x56,0x7d,0x42,0x9a,0xf0,0xc8,0xcf,0x50, + 0xf6,0x32,0xd1,0xd9,0xcb,0x5,0x40,0x9a,0x0,0xa7,0x29,0x8f,0xa4,0x8e,0xc2,0x94, + 0x99,0xc,0xf5,0x77,0x77,0xae,0x18,0x8,0xc0,0x45,0xb0,0x83,0x4d,0x50,0x59,0x80, + 0xad,0xdf,0x91,0x3b,0xd7,0x78,0x97,0xd8,0xc5,0x92,0x55,0x6d,0x88,0xc,0xb3,0xfb, + 0x12,0x8a,0xa,0x1e,0x2a,0x5c,0x98,0xd1,0x89,0x4f,0xef,0x3f,0xe5,0x2d,0x27,0x4d, + 0x1b,0x88,0x30,0x34,0xd0,0xc4,0xb9,0x53,0xe3,0x74,0x6a,0x6a,0xe4,0x95,0x5e,0x73, + 0x22,0xc2,0xfe,0x51,0x1b,0xf,0x96,0x36,0xf8,0xab,0xfb,0x2b,0x7c,0xd2,0xb1,0x69, + 0xa,0x27,0x82,0xb3,0xe9,0x8c,0x7,0x47,0x28,0xd6,0xc,0x36,0xbe,0xc0,0x73,0xb4, + 0x64,0x31,0x4c,0x2c,0x5f,0x39,0xdf,0xbd,0x26,0xb1,0xa8,0x60,0x9a,0x5,0x2,0x25, + 0x23,0xd1,0x5e,0x90,0x19,0x4a,0x84,0x68,0xa6,0x90,0x75,0x13,0x56,0x70,0x9,0xc1, + 0x25,0x1c,0x77,0xba,0xb8,0xfb,0x74,0xd,0xdf,0x3d,0x59,0xc7,0xa5,0x85,0x89,0x68, + 0x19,0xdb,0x8b,0x74,0x59,0x35,0x6,0xa3,0xc3,0x4d,0xc,0x34,0x6b,0xc8,0xfc,0x7f, + 0x4,0xf1,0x49,0x79,0xfc,0x15,0x52,0x22,0x3d,0x91,0x55,0xc5,0x18,0x43,0x6e,0x8, + 0x64,0xd8,0x86,0x61,0xd4,0x6b,0x15,0x9c,0x9e,0x1e,0xc5,0xe9,0xd9,0x31,0x34,0xeb, + 0xd5,0x57,0x6a,0x6e,0x4f,0x4e,0x3a,0x78,0xba,0xb6,0x8d,0xbb,0x4b,0x1b,0x58,0xdb, + 0x3e,0x54,0x90,0x37,0x97,0xad,0x9,0x4a,0x3e,0x1e,0xef,0x1b,0xa3,0x37,0xa6,0xb1, + 0xb0,0x19,0xc2,0xec,0xc4,0x30,0xfe,0xf4,0x47,0xaf,0xe3,0xc7,0x37,0xce,0xe3,0xec, + 0xfc,0x38,0xc6,0x6,0x9b,0xa5,0x6e,0x7c,0xbd,0x5e,0x53,0xd9,0x18,0x7e,0xf3,0x70, + 0x15,0xff,0xeb,0x7,0x5f,0xd8,0x8f,0xbe,0x7e,0xc8,0x7b,0x87,0x6d,0xce,0x74,0x9b, + 0xcc,0xd1,0x28,0xc2,0xef,0xca,0x99,0x18,0x30,0x1e,0x92,0x71,0xff,0x18,0x62,0xb6, + 0xd6,0x15,0x78,0xa7,0x58,0x73,0x0,0xa1,0x25,0xdf,0xd,0x4,0xbe,0x49,0xc9,0x92, + 0xb2,0xc8,0xa9,0xe1,0x17,0x22,0x9d,0x44,0x3d,0xd2,0xad,0xb,0x1b,0xc,0x99,0x37, + 0x62,0x40,0x2,0xb,0xe5,0xb8,0x43,0x2f,0xdc,0x6b,0x72,0xa3,0x5b,0xc,0x3a,0x29, + 0x88,0xb1,0x33,0x59,0x98,0xb6,0x4f,0xc9,0xa2,0x0,0x63,0xcd,0x36,0x8a,0xe1,0x98, + 0x34,0xef,0x94,0xb1,0x1f,0x65,0xb1,0xca,0xe4,0x27,0xd1,0x7e,0xd6,0x24,0x2a,0x4e, + 0x9a,0x17,0x33,0xfe,0x5d,0x30,0x35,0xf1,0xf6,0x6d,0x45,0x98,0x17,0xc1,0xff,0x3b, + 0x16,0x21,0xe1,0x70,0x29,0xa7,0x71,0x29,0xdc,0xa,0xae,0x66,0x1e,0xd6,0x8e,0x65, + 0x26,0x1a,0x96,0xb,0x8d,0x13,0x29,0xf6,0xbe,0x7e,0xab,0x55,0x34,0xaa,0xe1,0xe4, + 0xe,0xe4,0xc6,0x8,0x21,0x6d,0x62,0x21,0x5e,0x2b,0x51,0xfc,0x7,0x3d,0xa5,0xc9, + 0x38,0xbf,0x2,0x99,0xb0,0x32,0xf8,0x2f,0x5,0x31,0x86,0x9f,0xcd,0x2a,0xd5,0x27, + 0x9d,0x5,0x4a,0xc9,0x58,0xd8,0x2a,0x88,0xc2,0x9d,0x36,0x13,0x31,0x16,0x2a,0xcb, + 0xbd,0x53,0x1c,0xd7,0xa4,0xc2,0x91,0xcb,0x78,0xe7,0x5,0x9f,0x7e,0x94,0x63,0xd7, + 0x44,0x6e,0x7b,0x2c,0x32,0xc6,0x83,0xa0,0x46,0xe9,0xb,0xe3,0x55,0xd0,0x5,0xb0, + 0xb9,0x7b,0x88,0xf6,0x49,0x7,0xb5,0x6a,0xe5,0x95,0xcd,0x33,0x2e,0x2e,0x4c,0xe2, + 0x77,0xde,0x3c,0x87,0x5f,0xde,0x7c,0x80,0xfd,0xc3,0xe3,0x78,0x3d,0xe5,0xcc,0x58, + 0x53,0x16,0x3e,0x91,0xc1,0x8a,0x9c,0x39,0x3c,0x95,0xb1,0x12,0x54,0xd2,0x20,0xa0, + 0x88,0x90,0x52,0x12,0x24,0xcd,0x86,0xe2,0xb5,0xc3,0x99,0x44,0x48,0x62,0x39,0x4e, + 0xaf,0xef,0xd5,0x88,0x14,0x62,0x23,0x45,0x67,0xeb,0x8b,0xa0,0x71,0xa4,0x4e,0xca, + 0x91,0x7,0x79,0x4f,0x85,0x86,0xc6,0xa4,0xdc,0xb5,0x2,0x59,0x8b,0xa2,0x2b,0x1f, + 0x2e,0x2c,0x4c,0xd2,0xcc,0xd8,0x70,0xa1,0x68,0xe7,0xf2,0xa2,0x30,0x55,0xed,0x1d, + 0xb4,0xf0,0xd5,0xfd,0x15,0xdc,0x79,0xba,0x81,0x4e,0x57,0xaf,0xe0,0xc8,0x1f,0xbc, + 0x51,0x76,0x93,0x7e,0x22,0xa7,0x33,0x5f,0xa4,0x1f,0x90,0xed,0xb5,0x95,0x56,0x50, + 0x70,0xbc,0x98,0x42,0xeb,0xac,0x17,0x66,0x69,0x29,0x2f,0xb8,0x39,0x50,0x4a,0x37, + 0x51,0x70,0x2d,0x63,0x7d,0xe7,0x10,0xcf,0xb7,0xf6,0x70,0x7e,0x7e,0xa2,0xf4,0x5a, + 0x53,0xd3,0x25,0xb9,0x70,0x92,0x5a,0xad,0x26,0x1,0xf,0x69,0x6a,0x25,0x50,0x33, + 0x6f,0x38,0x92,0x3b,0x7b,0x2a,0x63,0x2d,0x92,0xb4,0x77,0x45,0xd2,0xa,0xa3,0xc5, + 0xf9,0xf9,0x49,0xbc,0x76,0x6e,0x6,0xc3,0xfd,0x8d,0x97,0xca,0x7,0xc3,0xe3,0x5f, + 0xd9,0xdc,0xc7,0x27,0xdf,0x3e,0xc5,0xd2,0xda,0x6e,0x81,0xc5,0x4b,0x78,0xc1,0x30, + 0xc7,0x45,0x42,0x9e,0xac,0x3,0xec,0x9,0x7a,0xa7,0x67,0x46,0x71,0x71,0x71,0x12, + 0x6f,0x9c,0x9f,0xc3,0xef,0xde,0x38,0x8b,0xd7,0xcf,0xcc,0x44,0x35,0x44,0x59,0x6c, + 0x70,0x59,0xf3,0x1d,0x57,0x53,0x27,0x1d,0xdc,0x7e,0xbc,0x86,0xff,0xf3,0xb7,0xb7, + 0xed,0xcf,0x3f,0xbb,0xc7,0x4f,0x57,0xf7,0xd8,0x9f,0x44,0x7e,0xa1,0x6d,0x53,0x43, + 0xe8,0x1a,0x40,0xa7,0xe8,0xf1,0x72,0x5d,0x2b,0x87,0x4d,0x22,0xc0,0x18,0x46,0x97, + 0xe3,0xb7,0x5b,0xf7,0x7d,0xee,0x7d,0xf1,0x3c,0x13,0x75,0xeb,0x67,0x7,0x9d,0x10, + 0xe,0x3,0xda,0xc5,0x3d,0x33,0x99,0xd2,0x94,0x73,0x52,0x1c,0x69,0x56,0xfe,0x66, + 0x80,0x50,0xd1,0x89,0x4e,0x90,0xc0,0xa8,0x6,0xb6,0x2b,0x97,0xd9,0xb5,0x66,0xc, + 0x35,0x39,0xa5,0x14,0x72,0xbb,0x15,0xc5,0x46,0xfc,0x17,0xc9,0x3d,0xaf,0x70,0x32, + 0x4b,0x79,0xa5,0x8e,0xbc,0x23,0x7f,0xa6,0x8c,0x13,0x94,0x9e,0x68,0x1e,0x56,0xd6, + 0x46,0xf5,0x26,0xda,0xc9,0xb3,0x62,0x1c,0x93,0x82,0xbe,0x93,0x34,0xca,0x7f,0x87, + 0x89,0xc5,0x59,0xe5,0x17,0x1a,0x16,0x1f,0x33,0x81,0x1,0xe1,0x67,0xd0,0xc0,0x6c, + 0x33,0x24,0x58,0xee,0x59,0x13,0x80,0x28,0x51,0x8c,0x12,0xb7,0x24,0xc0,0x30,0xa5, + 0x7b,0xd5,0xf4,0x46,0x4a,0x2a,0x1e,0x9,0x4c,0x5c,0x13,0xb,0x15,0xfa,0xc0,0x45, + 0xca,0xa0,0xfe,0x7a,0x56,0x8d,0x59,0x68,0xf,0x92,0x8d,0x93,0x71,0x93,0x4f,0xfa, + 0xd9,0xac,0x60,0x61,0x41,0x6e,0x4e,0x8c,0x7e,0x75,0x66,0x10,0x58,0xb2,0x8,0x49, + 0x7b,0xe7,0x46,0x1e,0xb4,0x51,0x4a,0x7c,0x31,0x80,0xf8,0xd7,0x49,0x3e,0x7c,0xdf, + 0xb2,0x18,0x8a,0x19,0xe6,0x21,0xfe,0x94,0x92,0xa9,0x3d,0x45,0xbb,0x3e,0x23,0x7, + 0x4a,0xed,0xc2,0x64,0xbb,0x8c,0x7,0xcf,0x36,0xf1,0x64,0x75,0x7,0x67,0x67,0xc7, + 0x50,0xad,0x9a,0x57,0xda,0xa1,0xbf,0xfb,0xda,0x22,0x4c,0xc5,0x60,0x65,0x63,0xf, + 0x5f,0xdc,0x5d,0x8e,0x5e,0x1,0xe9,0xf2,0x22,0x8d,0x9f,0x87,0x96,0xc8,0xe8,0x22, + 0xcd,0x46,0x9b,0x9,0x91,0xb4,0x6e,0xa3,0x32,0xda,0xa,0x69,0xe8,0x15,0x22,0x36, + 0x38,0xc7,0xe8,0xa4,0x54,0x51,0x89,0xf,0xc9,0x53,0x75,0x2,0xb2,0xcc,0xda,0xce, + 0x98,0x82,0x5e,0x96,0x93,0xfe,0x25,0xae,0xa5,0x73,0xf5,0x61,0x98,0x67,0x25,0x39, + 0x2e,0x5c,0xd0,0xc6,0x8b,0xec,0x63,0xc8,0x6d,0x6c,0x9c,0x17,0x67,0x46,0xf1,0xce, + 0x95,0x45,0xc,0xf9,0xc2,0xf1,0x32,0x6,0x35,0x0,0x6c,0xed,0x1d,0xe1,0xe7,0x5f, + 0xdc,0xe7,0xbb,0x4f,0xd6,0x3c,0x41,0x8d,0xa4,0xd8,0x38,0xd5,0x71,0x8e,0x6a,0x7a, + 0x46,0xcc,0xb7,0xf2,0x19,0x1b,0x3a,0x8,0xa2,0x7,0x0,0xec,0xc5,0x86,0x24,0xe3, + 0x95,0xd2,0xb1,0x8,0x12,0xf3,0xad,0x8c,0xb,0xe4,0x38,0xcc,0xfb,0xb7,0x34,0x28, + 0xf0,0x63,0xcc,0x2c,0x8e,0x4f,0x3a,0x38,0x6e,0x77,0x5f,0xba,0xe2,0x61,0x29,0x57, + 0x2c,0xac,0x31,0x25,0xb,0x4a,0xc0,0xd9,0x4c,0x99,0x62,0x88,0xd3,0x2,0x1b,0x3d, + 0x1c,0x5a,0xc4,0x7b,0x5e,0x31,0x84,0x6b,0xe7,0xe7,0xf0,0xf6,0xe5,0x53,0xa8,0x54, + 0x2a,0x2f,0x7d,0x5f,0xc2,0xe7,0x1e,0x3f,0xdf,0xc2,0x7,0x9f,0xde,0xc3,0xfa,0xf6, + 0x41,0x99,0x2c,0xa7,0x88,0x3e,0x21,0xdf,0x2b,0x89,0xe9,0x20,0x83,0x21,0x4e,0xcf, + 0x8e,0xe1,0x5f,0xfe,0xf0,0x35,0xfc,0xfe,0xdb,0xe7,0x71,0xe3,0xe2,0xbc,0xa,0x57, + 0x51,0x31,0xd,0xaf,0x20,0x4f,0x23,0x22,0x3c,0x58,0xd9,0xc2,0xff,0xf2,0x9f,0x3f, + 0xb3,0x1f,0x7e,0xf5,0x90,0x97,0xd6,0x76,0x3d,0x46,0xef,0x5f,0x2f,0x6b,0xd9,0xe1, + 0xec,0x96,0xa3,0x52,0xce,0xaf,0x6c,0xa2,0x5c,0x31,0x6,0x93,0xc4,0xf8,0xf9,0x24, + 0x19,0x61,0x62,0x81,0xd0,0xe8,0x2,0xce,0x19,0x29,0x90,0x23,0x1d,0x5b,0xc,0x5e, + 0x26,0x26,0xb1,0xe9,0x89,0x32,0x15,0x7d,0x2a,0x49,0x6e,0xa2,0xcc,0xa0,0x2d,0x20, + 0xd6,0x51,0x65,0x16,0xcd,0xc1,0x8,0x55,0x2e,0x13,0xfe,0x73,0xbe,0xfe,0xa6,0x82, + 0x99,0x9b,0x36,0xae,0xcb,0xe2,0x33,0x73,0xa,0x50,0x61,0x72,0x28,0x28,0xf7,0x5, + 0xa,0x29,0xf2,0xc2,0xc4,0xc1,0x4c,0x99,0x66,0x5b,0x6,0xa3,0x73,0x20,0x3a,0x4b, + 0xa6,0xa0,0x21,0xd2,0xc4,0x3d,0xa1,0xa9,0x91,0x24,0xf7,0xa8,0xad,0xf2,0xac,0x74, + 0xa3,0x27,0x70,0x57,0x63,0xbd,0xc7,0xb8,0x64,0x62,0x83,0xa2,0x76,0x9a,0xc4,0xa4, + 0x1f,0xa,0x1e,0xc7,0xfd,0xb9,0x49,0x50,0x7c,0x4e,0x5c,0x2b,0x70,0x5,0x42,0x71, + 0x37,0xa2,0x79,0x4a,0xfd,0x9d,0x2d,0x43,0x63,0x48,0x13,0x53,0x20,0xf2,0xda,0xb3, + 0x51,0xce,0x4f,0xda,0xee,0xe7,0x43,0xfa,0x6a,0x55,0xd2,0x45,0xe9,0x77,0x72,0xac, + 0x7c,0x83,0x8d,0x36,0x6f,0x54,0x2,0xc6,0x80,0xb7,0x1b,0x29,0x5d,0xf6,0x5c,0x22, + 0xaa,0x90,0xba,0x99,0x41,0x99,0xd3,0x0,0xe9,0x19,0x90,0x85,0x27,0x3c,0x55,0xc4, + 0x62,0x97,0x92,0x43,0x5c,0x2c,0x28,0x86,0xa,0xb,0xa9,0x38,0xb8,0x9b,0x78,0xcf, + 0xb4,0xbb,0x8c,0x5b,0xf,0x56,0xf8,0xec,0xdc,0x38,0xce,0xcd,0x8d,0xd1,0xcb,0xa2, + 0x25,0xc3,0x61,0x32,0x32,0xd8,0x87,0x37,0xce,0xcd,0xe1,0xbf,0xff,0x93,0xef,0xe1, + 0x6f,0x3e,0xbe,0x83,0xbf,0xfe,0xf8,0x2e,0xda,0xed,0x4e,0xd1,0x66,0x58,0x5d,0x9b, + 0x5c,0xe8,0x56,0x48,0xde,0x48,0xc9,0xd4,0xb,0x5,0x1f,0x68,0xc1,0x77,0x70,0xcd, + 0x93,0xf8,0x1d,0xa6,0xe4,0x8e,0x93,0x8a,0x3f,0x65,0x25,0x16,0xf3,0x9e,0x5,0xd, + 0x51,0xfa,0x4c,0x27,0xc2,0x23,0xc5,0xa9,0x3c,0x2c,0xa8,0x35,0xc1,0x29,0xbe,0xbd, + 0xe9,0xba,0xf,0x4c,0x13,0x4d,0x98,0x35,0x89,0xdc,0xe8,0xff,0x4e,0xf3,0x53,0xfb, + 0xd5,0x81,0xf3,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x23,0xf4,0xce,0x6b,0xb, + 0x34,0xea,0x75,0xf3,0xbd,0xa,0x9c,0xdc,0x8d,0xae,0xed,0x1c,0xe0,0xa3,0x5b,0x4f, + 0xf0,0xf0,0xf9,0x8e,0xe8,0x5a,0x39,0x45,0x1e,0x89,0x75,0x3e,0x9c,0xfd,0x5b,0x98, + 0x96,0xd8,0x9f,0x6c,0x1c,0xe8,0xa4,0x89,0xb0,0xe6,0xcd,0x34,0x29,0x13,0x77,0x85, + 0x62,0x6a,0x84,0x2e,0x87,0xa8,0xe8,0xc5,0x99,0x65,0x15,0x45,0x21,0x6,0x5,0xde, + 0x8a,0xf0,0x6a,0x20,0x83,0x5a,0xb5,0x82,0x7a,0xed,0xe5,0x5a,0x7b,0x0,0xe8,0x74, + 0xbb,0xd8,0x3f,0x6a,0xa3,0x75,0xd2,0xd5,0x36,0xcf,0xe2,0xf7,0x28,0xde,0x46,0xbe, + 0x6b,0x55,0xab,0xf,0x2e,0x49,0xb7,0x12,0xc8,0x27,0x18,0x15,0x63,0xf0,0xda,0xe9, + 0x69,0x5c,0x3b,0x37,0x8b,0x7a,0x95,0x5e,0xda,0x64,0x31,0x33,0xba,0xdd,0x2e,0x1e, + 0x2c,0x6f,0xe1,0xcb,0x7b,0xcb,0xd8,0x3e,0x3c,0x2e,0x38,0xc4,0x94,0xa5,0xa9,0x15, + 0x6d,0x8d,0x49,0xf9,0x9c,0xf4,0x35,0xaa,0x78,0xfd,0xec,0x2c,0xde,0xbe,0x3c,0x8f, + 0x6b,0xe7,0x66,0x70,0xf1,0xd4,0x4,0x4e,0xf9,0xf8,0xe2,0xdc,0xfd,0xb0,0x97,0x9e, + 0x3f,0xff,0xd8,0xea,0xd6,0x3e,0x3e,0xfc,0xea,0x21,0xff,0xe2,0x8b,0x87,0xfc,0xc9, + 0xb7,0x4f,0x78,0x79,0x63,0x4f,0x23,0x3a,0x9e,0x95,0x1e,0x98,0xec,0x89,0x99,0xce, + 0xec,0x67,0xce,0xb8,0x43,0xf,0xff,0x8b,0x1f,0x83,0x61,0x27,0xe7,0xc,0x96,0x22, + 0x4,0xee,0x5a,0xff,0x39,0xcf,0xb2,0x33,0x41,0xfa,0x23,0x10,0x6a,0xd6,0xe1,0x86, + 0x72,0xdd,0x56,0xac,0x9f,0xd4,0xa3,0xf,0xd3,0x23,0x61,0x44,0xd1,0xc,0x65,0x21, + 0x68,0xee,0x7a,0xa9,0xca,0xd8,0x4f,0xbd,0x94,0x27,0x15,0xbe,0x6e,0xe2,0xce,0x8e, + 0xb,0x72,0x1d,0x15,0xd9,0x59,0xec,0x86,0x63,0xd6,0x58,0x94,0x37,0xc8,0x7a,0xc, + 0x2a,0xa0,0x7b,0x2c,0x8b,0x3b,0x65,0xa4,0x21,0xd5,0xc8,0x66,0x6e,0x38,0x62,0x12, + 0x97,0x2e,0xee,0x6a,0xd,0x6f,0x48,0xee,0xc3,0x53,0xe4,0x88,0x30,0x36,0x9,0xfb, + 0x59,0x3f,0x90,0x53,0xc8,0x88,0x44,0xf2,0xcc,0x8a,0x2b,0xf6,0x50,0x67,0x38,0x4a, + 0x7e,0x82,0x4f,0x9a,0x89,0xe9,0xed,0xa4,0x21,0xbe,0x82,0x8f,0x5b,0x1e,0xcb,0xea, + 0xf0,0x51,0x83,0xcc,0xea,0x47,0xf4,0x6f,0x7a,0xbc,0x33,0x65,0x4,0x45,0x94,0x10, + 0xac,0x85,0x74,0xd2,0x5d,0xce,0xcc,0x9a,0x14,0x21,0xdf,0xf,0xcb,0xe5,0xdc,0x6, + 0x35,0x73,0x93,0x30,0x43,0xf0,0x1c,0x10,0x56,0x5c,0x68,0xf9,0x0,0x49,0xb,0x57, + 0xd2,0x8a,0x41,0x66,0xd6,0x32,0x9,0x2e,0x24,0x91,0x49,0xdb,0x91,0xf0,0xc6,0xf9, + 0x0,0x10,0x99,0xc8,0x96,0x27,0xf6,0x24,0x72,0x76,0xb7,0x6b,0xf1,0xed,0xa3,0x35, + 0x9c,0x3b,0xb5,0x8a,0x9f,0xbc,0x7d,0x1,0x3,0x7d,0xf5,0x82,0x36,0xb8,0x8c,0x2d, + 0x4b,0x44,0x98,0x1c,0x1d,0xc0,0x1f,0x7e,0xef,0x32,0x6,0xfa,0xea,0xd8,0x39,0x68, + 0xe1,0x9b,0xc7,0x6b,0xd8,0xde,0x39,0x84,0x2d,0x75,0x14,0xa6,0xf2,0xbf,0x1b,0x14, + 0xac,0x8d,0x23,0x99,0xc3,0x10,0xb4,0xff,0xa5,0xbc,0x31,0xa2,0x98,0x3c,0x39,0xdb, + 0x32,0x40,0xb0,0x1a,0x4,0x89,0x13,0x9d,0x74,0x36,0x33,0xe5,0x47,0x85,0x47,0x53, + 0x22,0x13,0x3c,0x51,0x6b,0x54,0x9a,0x0,0x93,0x6a,0xb5,0xd2,0x2b,0x4a,0xb1,0xd1, + 0x75,0x9c,0x5,0x83,0x10,0x51,0xa1,0xbe,0x8,0x0,0xe6,0xa7,0x46,0x70,0x79,0x71, + 0xa,0x83,0x7d,0xf5,0xd2,0xc3,0x59,0x1e,0xcc,0xd6,0x5a,0x1c,0x1c,0x9d,0xe0,0xc1, + 0xf2,0x6,0x3f,0x5c,0xde,0xe4,0x8e,0xb5,0xa2,0x6d,0xa4,0x48,0xfc,0xf0,0xdd,0x18, + 0xfb,0x63,0x95,0x3d,0xd2,0xc0,0xfe,0x25,0x89,0xc,0x78,0x75,0xe3,0xf9,0x3,0x5d, + 0x1d,0x98,0xe1,0x21,0x1b,0x71,0xea,0x51,0x26,0xb,0x21,0xea,0x41,0xcd,0x26,0x81, + 0x8c,0x49,0x12,0xaa,0xfb,0xd6,0xc1,0xbe,0x3e,0x8c,0xc,0x34,0x51,0xa9,0xf4,0xe6, + 0x6b,0xc4,0xdd,0x74,0xa7,0x8b,0xd5,0xed,0x7d,0xec,0x7a,0xb,0x55,0xca,0xe6,0x33, + 0xbd,0x72,0xc8,0xa2,0x13,0xb2,0xf3,0xb2,0xd4,0x6a,0x4d,0x7d,0x2f,0x61,0x6a,0x74, + 0x10,0x8b,0xb3,0x23,0x18,0x13,0x4d,0x56,0xaf,0x49,0xd7,0x85,0xfd,0x74,0xf0,0x78, + 0x75,0x7,0xf7,0x9e,0x6d,0x38,0x69,0x5d,0xc6,0xa8,0xe7,0x8c,0xce,0xa9,0x56,0x19, + 0xd9,0xdf,0xab,0xd5,0xa,0xfa,0x1b,0x35,0xf4,0x37,0xab,0xb8,0xb2,0x38,0x85,0x1f, + 0x5c,0x3b,0x83,0x9f,0xbc,0x7d,0xe,0x17,0x4e,0x4d,0x16,0x82,0x7b,0xca,0xa0,0xf4, + 0x9c,0xdd,0x1e,0xbe,0xe6,0xa0,0x75,0x82,0x67,0xeb,0x3b,0xb8,0x79,0x6f,0x99,0xff, + 0xf2,0xe7,0xb7,0xf8,0xb7,0xb7,0x9e,0xb0,0xb5,0x96,0x39,0xa6,0xa,0x7a,0x5a,0x88, + 0x33,0xfa,0x67,0x61,0x93,0x12,0x4c,0x59,0xd9,0x8f,0xb7,0x42,0xa3,0x1e,0xbc,0xd2, + 0x2,0x1a,0xc4,0x21,0x2e,0x83,0xfd,0x6a,0x85,0x9d,0xca,0xc3,0x22,0xb,0xfb,0xe4, + 0x8,0xe1,0xc0,0x4a,0xb,0x26,0x8e,0xdd,0xb0,0x70,0x8f,0xd4,0x5e,0x9a,0x5,0x56, + 0x41,0x36,0x1c,0xa7,0xb5,0x4b,0xd1,0x2b,0x38,0x7d,0x7d,0x35,0xdd,0x34,0x48,0x16, + 0x74,0xc1,0xdd,0xcc,0x18,0xc1,0xa4,0x23,0xd,0x37,0x82,0xb,0xce,0x3f,0x54,0x48, + 0xca,0x96,0x7c,0x5b,0x52,0x11,0x2d,0x39,0xa5,0x93,0x4a,0xe4,0xd,0xda,0x4a,0x96, + 0x4b,0x28,0x5a,0xfa,0x3,0x61,0x52,0x90,0x73,0x93,0x4,0x34,0x5d,0x30,0x49,0x18, + 0x31,0xa2,0x3b,0x49,0x4,0x17,0x7d,0x49,0xf6,0xc5,0xdb,0xb,0xa1,0x42,0x82,0x94, + 0xd8,0x9d,0x27,0x77,0xc8,0x8,0xf7,0xfa,0xda,0x62,0x28,0xdd,0x5e,0x26,0x0,0x77, + 0x24,0x5f,0x17,0xa7,0xb5,0x62,0x21,0x1,0xe2,0x2,0x3f,0x81,0x39,0x1a,0xe8,0xeb, + 0x1d,0x39,0x67,0x3,0x69,0xf9,0xda,0x56,0xab,0xc7,0x25,0x14,0x2a,0x16,0x10,0x14, + 0x96,0x7e,0x8,0x4f,0x83,0x33,0x13,0xa7,0x2a,0x2,0xe9,0x83,0xe5,0x16,0x43,0xb6, + 0x6e,0x81,0x1b,0x5f,0xa1,0x6c,0xb5,0x90,0x42,0x57,0x22,0x54,0xad,0xba,0x33,0x2e, + 0x34,0x83,0x1e,0xb8,0x8c,0x7b,0x42,0x87,0x88,0x84,0x36,0xc9,0x63,0xaf,0x89,0xa0, + 0x48,0x85,0xa9,0x5c,0x61,0xb4,0xe9,0x51,0x74,0x19,0x78,0xb2,0xba,0xcd,0xb7,0x1f, + 0xad,0x61,0x75,0x6b,0x9f,0xce,0xf7,0x4f,0xc4,0xe7,0x9f,0x67,0x6e,0xe7,0x85,0x86, + 0x99,0xd1,0xd7,0xa8,0xe1,0xfd,0xab,0xa7,0x31,0x3b,0x3e,0x8c,0xff,0xfd,0xc3,0x6f, + 0xf0,0x9f,0x7e,0x7d,0x1b,0x4f,0xd7,0xb6,0x4b,0x56,0x4d,0x10,0x8e,0xf,0xd9,0xd8, + 0x62,0x4a,0x18,0x74,0xa1,0xe5,0x34,0xe2,0x7b,0x2,0x3,0xca,0x88,0x35,0x57,0x89, + 0xa7,0x3f,0x95,0xb8,0x80,0x15,0xb8,0x95,0x32,0x99,0xc4,0xb0,0xce,0x99,0xc8,0x5e, + 0x7e,0xca,0xb6,0xfa,0x69,0x33,0x48,0x9a,0xcb,0x2e,0x9b,0xb5,0x38,0xa9,0xba,0x66, + 0xce,0xf5,0x27,0xee,0x7,0xf,0xf,0x34,0x31,0x37,0x31,0x8c,0x69,0x6f,0x5a,0xf2, + 0x32,0x98,0xb4,0xdb,0xb5,0xf8,0xec,0xee,0x12,0x3e,0xfd,0x76,0x9,0xed,0x8e,0x8d, + 0x6f,0x63,0x6a,0x3b,0xa2,0xdc,0x86,0x83,0xf4,0xc4,0x8f,0x55,0x69,0xd2,0xa,0x7c, + 0x77,0xe1,0x70,0x2c,0x41,0x40,0x9d,0x40,0x2d,0x88,0x1e,0x49,0xcf,0x87,0x60,0x85, + 0xc7,0x92,0x75,0x43,0x62,0x3,0x4c,0x22,0x2a,0x43,0xbd,0x1a,0xe1,0xcb,0xc,0x4f, + 0x8c,0xf6,0xd3,0xe4,0xc8,0x0,0x2a,0x3d,0xa0,0x62,0x59,0xe4,0xdb,0x1d,0x8b,0xc7, + 0xcf,0xb7,0xb1,0xb9,0x7b,0x98,0xf6,0xf3,0xdc,0x63,0x2f,0x2d,0xed,0x41,0x65,0x7a, + 0xa2,0x56,0xb,0xa,0x98,0x4c,0x5f,0x6e,0x53,0x23,0x3,0xb8,0x7e,0x71,0x1e,0x13, + 0xc3,0xfd,0x2f,0x9c,0x80,0xe5,0xc7,0x77,0xe,0x8e,0xf1,0x8b,0x2f,0x1e,0xe0,0x9b, + 0x47,0xeb,0x6e,0x35,0x97,0xe9,0xaa,0x88,0x72,0xd2,0xad,0xb8,0xa8,0x4,0x1,0x87, + 0x88,0x71,0x76,0x6e,0xc,0xdf,0x7b,0x6d,0x1,0x3f,0x7c,0xe3,0xc,0xce,0xcd,0x8d, + 0x61,0x72,0x64,0x0,0x83,0xcd,0x5a,0x61,0xe2,0x7e,0x55,0x8e,0xb,0x0,0x1c,0x1e, + 0x9f,0xe0,0xef,0x3e,0xbd,0xc7,0x7f,0xff,0xf9,0x7d,0xfe,0xe8,0xd6,0x63,0xde,0xdc, + 0x3d,0x82,0xf5,0x90,0x79,0xf2,0xd5,0x40,0x9c,0xc2,0x3,0x5,0x8a,0x3d,0xa2,0xe3, + 0x4b,0xb,0x33,0x47,0x67,0x76,0x3f,0xa5,0x3b,0xf7,0x6,0x2,0xb1,0xb5,0x22,0x7e, + 0xc1,0x4d,0xb8,0xec,0x12,0x55,0xbb,0x4c,0x8,0x4d,0x42,0x88,0x2e,0xc,0xe6,0x47, + 0x96,0xbd,0x8c,0x57,0xe0,0xd6,0xac,0x58,0x81,0x92,0xb,0x91,0x5c,0x3c,0x65,0x31, + 0x37,0x4a,0x72,0x29,0x51,0x8f,0x32,0xee,0x54,0x90,0xc7,0x55,0x63,0xa6,0xb7,0x94, + 0x7c,0xab,0xe0,0x2c,0xa3,0xa5,0x6c,0x8a,0x8,0x23,0xa2,0x56,0x23,0x3c,0xa4,0x95, + 0xf0,0xc4,0x54,0x70,0x9d,0x2b,0x10,0x69,0xb4,0x18,0x4b,0x6d,0x9a,0x55,0x5e,0x4a, + 0x96,0x3,0xa5,0xa0,0x66,0x88,0x9d,0xb8,0x1e,0xdf,0xd3,0x38,0x6e,0x42,0x26,0x85, + 0xa1,0x24,0x95,0x4a,0x3b,0xf1,0x8a,0x9f,0x48,0x7c,0x30,0x88,0x49,0x70,0xbb,0x1b, + 0x15,0x3,0x45,0x1,0xc6,0x50,0x1c,0x76,0x4d,0x70,0x6d,0x37,0x71,0x65,0x1d,0xa7, + 0x75,0xca,0x37,0x5b,0x9e,0xde,0x60,0x4c,0x46,0xa4,0x2a,0x4e,0x8a,0x1,0x1b,0xa6, + 0x1e,0x70,0x56,0x8e,0x81,0x8,0xba,0x5d,0x49,0x58,0x86,0x9c,0xc,0x84,0x74,0x91, + 0x2b,0x9c,0x95,0x7f,0xd6,0xeb,0x9a,0xa,0xb4,0xd7,0x3f,0x4,0x43,0x3f,0x9d,0xed, + 0xc6,0x4,0x36,0x11,0xc5,0x41,0x8a,0x84,0x9d,0x2e,0x15,0xfa,0xab,0x4,0xc3,0xb3, + 0x98,0x5,0xf3,0xc2,0x92,0x82,0xb7,0x13,0xc1,0x4e,0x4a,0x2f,0xa2,0x5c,0x8a,0xd5, + 0x6e,0x29,0xb2,0xeb,0x92,0x69,0x83,0xc1,0xc3,0x95,0x4d,0xfc,0xfc,0xcb,0x7,0x5c, + 0xa9,0x10,0x9d,0x9e,0x19,0xeb,0x79,0x60,0xe4,0x6,0x20,0xcc,0x8c,0x81,0xbe,0x3a, + 0x5e,0x3f,0x37,0x83,0x93,0x4e,0x17,0xfd,0xcd,0x3a,0x6e,0xde,0x5f,0xc6,0xbd,0xa7, + 0x1b,0x58,0xde,0xdc,0x43,0xbb,0xd3,0xcd,0xa6,0xa3,0x62,0xfe,0xd,0xca,0x98,0xab, + 0x25,0x3a,0x96,0xb2,0x78,0x45,0x29,0xdf,0xf7,0x10,0x71,0x21,0xb3,0x27,0xec,0xc2, + 0x39,0x1b,0xe1,0xfc,0xe1,0x25,0x13,0x9b,0x3,0x99,0xc7,0x83,0x33,0xe4,0x78,0x64, + 0x16,0xea,0x64,0x17,0xcb,0x15,0x21,0xd9,0xc,0x93,0x5b,0x48,0x56,0xf3,0x11,0xb5, + 0xe1,0x75,0xab,0xb8,0xa,0x37,0xd0,0xac,0xd1,0xc5,0xc5,0x49,0x9c,0x9a,0x1a,0x29, + 0xd5,0x7,0x97,0xfd,0xe9,0x58,0xc6,0x97,0x77,0x56,0xf8,0xb3,0x3b,0xcb,0xdc,0x8d, + 0x9a,0xf4,0x4,0xad,0x53,0x68,0x7a,0x52,0xac,0xa8,0x23,0xc0,0xf9,0x3,0x16,0x86, + 0x99,0xa3,0x6f,0xb6,0xe5,0xb8,0xf5,0xe2,0xc2,0x66,0xcf,0x95,0x45,0x3f,0xa7,0xb9, + 0x79,0x22,0x2a,0x34,0x64,0xe4,0x32,0x27,0x67,0xc3,0x2,0x49,0x37,0xb9,0x92,0x92, + 0x26,0x2a,0x56,0xab,0x15,0xcc,0x8c,0xd,0x62,0x7a,0x6c,0xd0,0xfb,0xd1,0xbc,0x78, + 0xc5,0xb0,0xb2,0xb9,0x87,0xb5,0xed,0x7d,0x74,0xac,0x60,0x1e,0x11,0x95,0x2f,0xc0, + 0x33,0xb9,0xa4,0x41,0x51,0x83,0x6c,0x32,0x9c,0x54,0x2e,0xf5,0xa6,0xc7,0x6,0x71, + 0xe3,0xe2,0x5c,0xd4,0xc8,0xe7,0xc4,0xb7,0xb2,0xc7,0xb7,0xbd,0xdf,0xc2,0x6f,0xbf, + 0x7d,0x8a,0xfb,0xcf,0x36,0xf5,0x2f,0xa5,0x12,0xd4,0x42,0x6,0x93,0x30,0xa3,0x56, + 0x33,0x98,0x19,0x1f,0xc2,0xec,0xf8,0x10,0xe6,0x27,0x86,0x71,0xe5,0xf4,0x24,0xae, + 0x9d,0x9d,0xc1,0xf5,0xb,0xb3,0x18,0xf0,0xa8,0x4d,0x59,0x4e,0x7b,0x19,0x61,0x32, + 0xdf,0xe9,0xef,0x1f,0x1e,0xe3,0xe1,0xca,0x16,0x6e,0xde,0x5b,0xe1,0x5f,0xde,0x7c, + 0xc8,0x9f,0x7e,0xb7,0xc4,0x1b,0x3b,0x87,0xbe,0xed,0x8b,0xd5,0x80,0x7d,0xb,0x14, + 0xb2,0xd0,0x1c,0x74,0xee,0xaa,0x2d,0x13,0xb3,0x25,0xa2,0xc8,0x62,0x7,0x60,0xbd, + 0x9,0xb0,0x37,0xe1,0xf4,0xa1,0xaa,0x6,0xec,0xba,0x84,0x30,0xa5,0xbb,0x17,0x87, + 0x4,0x5f,0x27,0xd8,0x97,0xe5,0xaa,0x25,0x4a,0x53,0x72,0xec,0xd2,0xd3,0x31,0x2a, + 0x1c,0xe4,0xa,0xe6,0x6a,0x22,0x8c,0xc5,0x94,0x46,0x9d,0x95,0xcc,0xee,0x21,0x3e, + 0x95,0x48,0xec,0xfb,0x32,0x2d,0x77,0xb6,0xa0,0x95,0xec,0x5b,0x96,0xbe,0xb3,0x62, + 0xe0,0x4e,0xec,0x5c,0xb1,0x43,0x20,0x2a,0x4c,0x99,0xc5,0xa0,0x7b,0xf9,0xf0,0x62, + 0x6e,0x44,0x89,0xdd,0x66,0xf6,0xdc,0xbd,0x4,0x4d,0xce,0xef,0x4c,0x4c,0x22,0x32, + 0x24,0xa6,0xd6,0xb3,0xdf,0x93,0x1b,0x5,0xa5,0x7,0xe8,0xb6,0x22,0x8a,0x79,0x80, + 0x16,0x89,0x60,0x60,0x1c,0x7c,0x9e,0x52,0xba,0xa3,0x83,0x21,0x85,0xc2,0xee,0x27, + 0x47,0x91,0xdb,0xa9,0x9,0x5e,0x42,0xa3,0xc5,0x2c,0xf0,0x7f,0x56,0x7a,0x7f,0x65, + 0xfa,0x11,0xe0,0x26,0x71,0xc5,0xe7,0xda,0xe5,0xa2,0x60,0xa2,0x87,0xfe,0x53,0x7e, + 0xd,0xe9,0x40,0x5c,0x72,0x62,0x4c,0x21,0x48,0xe3,0xcc,0x17,0x5b,0x2b,0xe,0x74, + 0x87,0x95,0x88,0x6f,0xc2,0x7c,0x25,0xf4,0x74,0xee,0x5f,0xa1,0x43,0x54,0x4,0xd, + 0x23,0x61,0x78,0xe4,0xce,0x3,0x5c,0x4c,0xb7,0xcd,0x46,0x80,0x28,0x8e,0x16,0xba, + 0x67,0x3f,0x9f,0x18,0x29,0x82,0x4b,0x27,0xdb,0xea,0xf6,0x1,0xfe,0xfd,0x2f,0x6f, + 0xf1,0xc4,0x70,0x3f,0xce,0xcc,0x8e,0x93,0xc,0x1,0x79,0xd9,0x24,0x10,0xde,0x86, + 0x37,0x2f,0xce,0xe1,0xca,0x99,0x29,0xdc,0xbc,0xb7,0x82,0x5f,0xdc,0x7c,0x88,0xf, + 0x3e,0xb9,0x8b,0xc7,0xcf,0xb7,0x71,0x78,0xdc,0xc9,0x90,0xa7,0x30,0x41,0x73,0x16, + 0x87,0x9a,0xa7,0x45,0x67,0xa8,0x93,0xec,0x77,0xf2,0x17,0x47,0x2a,0xf,0xa3,0xa6, + 0x42,0x92,0x3d,0x3d,0xc7,0x5b,0xb8,0xa,0x22,0x5e,0xf8,0x16,0x11,0x30,0xb2,0xc6, + 0x77,0x0,0x51,0xa4,0xc1,0xa8,0xc8,0x7e,0x33,0x8f,0x8e,0x11,0x4a,0x83,0xe8,0x27, + 0x60,0x22,0x99,0x35,0x67,0xf5,0xd,0xd,0x34,0xf1,0xd6,0xa5,0x39,0x9a,0x9f,0x1c, + 0xa6,0x5e,0x39,0xe1,0xf2,0x80,0x66,0x66,0xec,0x1d,0x1e,0xe3,0xd6,0xa3,0xe7,0xb8, + 0xbf,0xbc,0x11,0xf9,0x24,0xc,0x99,0xcb,0x99,0xa6,0x70,0xe,0xb1,0xf,0x94,0x18, + 0x1f,0x6e,0x6a,0x42,0xf4,0xdd,0x26,0x39,0xa4,0xc6,0x6f,0x77,0x63,0xbd,0x21,0xcf, + 0x6c,0x22,0xed,0x98,0xec,0x8f,0xd,0x61,0x14,0x15,0x18,0xfb,0xb2,0x33,0xa4,0x88, + 0xb8,0x28,0x53,0x69,0xdf,0xdb,0x8e,0xe,0x36,0x31,0x3d,0x3e,0x88,0xc1,0x17,0x30, + 0xc8,0x89,0x8,0x9d,0x4e,0x7,0x4f,0xd6,0x76,0xf1,0xdd,0x93,0x75,0xec,0x1e,0x9e, + 0x40,0x27,0xad,0x94,0xde,0xb5,0x45,0x49,0x1b,0x65,0x3a,0x66,0x92,0x24,0x59,0x28, + 0x4f,0x75,0x0,0x98,0x9d,0x18,0xc6,0xf5,0xf3,0xb3,0x18,0x1d,0xe8,0x2b,0x14,0xc8, + 0x32,0x86,0x3b,0x33,0x63,0x79,0x63,0x17,0xdf,0x3c,0x5e,0xc3,0xde,0x51,0x3b,0xc5, + 0x78,0xaa,0xf7,0x52,0xc2,0x49,0x89,0xac,0x55,0xaf,0x57,0xb0,0x38,0x3d,0x82,0x1f, + 0x5c,0x3b,0x8d,0xdf,0x79,0xe3,0xc,0x6e,0x5c,0x9c,0xc3,0x48,0x7f,0x23,0x32,0xd7, + 0x15,0xf,0xf9,0x25,0xe,0x75,0x39,0xff,0x62,0xef,0xe0,0x18,0x77,0x9f,0xad,0xe3, + 0x7f,0xfb,0xe0,0x2b,0xfe,0xbb,0xcf,0xef,0xdb,0xcd,0x9d,0x43,0x74,0x39,0x7a,0x27, + 0x25,0xde,0x85,0xe7,0x54,0x70,0x84,0xd2,0x5d,0x3,0xe8,0xaf,0x16,0xcf,0x19,0x65, + 0x76,0x92,0x4d,0xa,0x45,0xdf,0x46,0x8,0xde,0xc9,0x77,0x93,0xb4,0xcd,0x2d,0xda, + 0x98,0xc4,0x2f,0x71,0x1c,0x6d,0x83,0xb8,0x49,0xf,0x6f,0x8e,0xb1,0x2a,0x4a,0x47, + 0xda,0x32,0x92,0xe8,0xc8,0x88,0x65,0x2e,0x3a,0x94,0xbf,0x4a,0xd0,0x41,0xb,0x8b, + 0x81,0xa2,0xba,0x41,0x62,0x30,0xfe,0x12,0xad,0x92,0xd1,0x3f,0x91,0x24,0xc6,0x1f, + 0xf7,0x9f,0xc2,0xb4,0x44,0x25,0x6f,0xa,0x5f,0xf5,0x58,0xda,0x34,0x6,0x48,0xe5, + 0x2b,0x21,0x2d,0xff,0x29,0xcb,0x39,0xcf,0x2c,0x2a,0xf3,0x76,0x50,0x1c,0x37,0x62, + 0xa3,0x9b,0xc0,0xb2,0x24,0x3b,0xb,0x93,0x9d,0x21,0x13,0xaf,0x22,0x26,0x13,0x8a, + 0x31,0x79,0x8b,0x51,0x37,0x55,0x1b,0x4a,0xcc,0xf6,0x24,0x81,0xa,0x41,0x21,0x2a, + 0xaa,0x33,0xe5,0xb0,0x85,0xd3,0xce,0x21,0xe5,0x26,0xc,0x85,0x1a,0x10,0x8e,0xf4, + 0x3d,0x93,0x6c,0xbd,0x3,0xd4,0x22,0xea,0x3f,0x33,0x79,0x89,0xbc,0xd4,0xbb,0x16, + 0xb5,0x8d,0xba,0x0,0x72,0xa1,0xa4,0x53,0x11,0xe3,0x15,0xff,0xdf,0x72,0x54,0x21, + 0xc4,0x89,0x3d,0xc6,0xed,0x25,0xf9,0x92,0x2a,0x4e,0xca,0x6c,0x4b,0xa5,0xf1,0x12, + 0xb1,0x18,0xe9,0xa2,0xff,0x6,0x4c,0x81,0xc6,0x29,0x1c,0x6b,0x33,0xa8,0x81,0x4a, + 0x44,0x9a,0xd1,0x8,0x36,0xfe,0x62,0x43,0x49,0xcb,0x20,0x44,0x73,0xf1,0xae,0xf, + 0xcd,0xa6,0x91,0xb,0xa,0x26,0x2,0xb5,0xda,0x1d,0xbe,0xf3,0x64,0x83,0x7e,0xfd, + 0xd5,0x63,0xcc,0x4d,0xe,0xe3,0xcd,0xf3,0xb3,0x2a,0xf6,0xf2,0x45,0xbe,0xd0,0xf2, + 0x4f,0xa3,0x56,0xc5,0xd5,0x33,0xd3,0x18,0x1d,0xea,0xc3,0x8d,0x8b,0x73,0x78,0xf2, + 0x7c,0x1b,0x8f,0x56,0xb6,0xf1,0xe8,0xf9,0x36,0x9e,0xae,0xed,0x60,0x79,0x63,0xf, + 0xc7,0x9e,0x3c,0x47,0x7a,0xe1,0x59,0x32,0x9b,0x53,0x71,0x75,0x1e,0xc1,0x25,0x2e, + 0xc4,0xd3,0xca,0x43,0x33,0x67,0x26,0x51,0x64,0xd4,0x7,0x9a,0x22,0x53,0x14,0x9c, + 0x53,0x85,0x5c,0xa0,0x4,0xb1,0xf3,0x71,0xf0,0x4b,0xc,0xe,0xab,0x2c,0xef,0x4c, + 0x64,0x98,0x62,0x0,0x84,0x30,0xfa,0x53,0x8b,0x67,0xe3,0xe9,0x60,0x54,0x21,0x75, + 0x93,0x7b,0x74,0x7e,0xa0,0x59,0xc7,0x9b,0x17,0xe6,0xe3,0x84,0xde,0x8b,0xd4,0x14, + 0x8a,0xf9,0xd6,0x5e,0xb,0x37,0xef,0xaf,0x60,0x75,0xeb,0xc0,0xc1,0x86,0x2a,0x29, + 0x45,0xd8,0xb7,0x4a,0xa2,0x9e,0xf3,0x74,0x47,0x88,0x55,0xe1,0x84,0x9a,0x7b,0x23, + 0xc4,0x30,0xa7,0x85,0xdf,0xe5,0xae,0x7,0x36,0xc9,0x10,0x4e,0xea,0xcd,0x52,0xd8, + 0x94,0xc0,0x48,0x21,0x15,0xb0,0x4,0xce,0x41,0x4f,0xe1,0xc9,0xd,0x6,0x46,0x86, + 0xfa,0x70,0xed,0xdc,0x2c,0x4d,0xf8,0x34,0xbf,0xdc,0xf3,0x40,0x5e,0x4b,0x95,0x4a, + 0x5,0x37,0xef,0xad,0xe0,0xd3,0xef,0x9e,0xe1,0xb8,0xdd,0x4d,0x11,0xa8,0x8a,0x6e, + 0x58,0xb2,0x12,0x2f,0xc1,0xe8,0x8,0x7a,0x32,0x2e,0x1,0x29,0x1,0x0,0x33,0xe3, + 0x83,0xb8,0xb4,0x30,0x81,0xc1,0xfe,0xfa,0xb,0xb,0x79,0xf8,0xdc,0xed,0xc7,0xeb, + 0xf8,0xfc,0xce,0x32,0xf6,0xf,0xdb,0x51,0x6,0xab,0x42,0xbb,0x2,0xc4,0xe1,0x1f, + 0x4a,0x5f,0xa3,0x86,0x73,0x73,0x63,0x78,0xed,0xf4,0x14,0x2e,0x2d,0x4c,0xe2,0xf4, + 0xec,0x8,0x66,0xc7,0x86,0x30,0x33,0x3e,0x88,0x89,0xe1,0xfe,0xd2,0xe9,0x3b,0xdf, + 0x93,0xe7,0x51,0xb3,0x72,0x82,0xdf,0xda,0x3b,0xc2,0xa7,0x77,0x9e,0xf1,0xcd,0xbb, + 0xcb,0xf8,0xfa,0xe1,0x1a,0x7f,0xf7,0x64,0x8d,0xd7,0x77,0xe,0x3d,0xc7,0x94,0x52, + 0xe8,0x5e,0x78,0x2a,0x5e,0x5b,0xee,0xfe,0x2f,0x14,0x77,0xb2,0xfe,0x15,0xf1,0x53, + 0x3a,0x2c,0x18,0xd6,0x26,0x6b,0x25,0xf6,0xd6,0x4b,0x9c,0xf2,0xc2,0x2c,0x5b,0xd7, + 0xa,0x2,0xb0,0x6c,0x61,0x18,0x64,0xd9,0xa9,0xad,0x98,0x11,0xec,0xe,0xac,0x5f, + 0xad,0x79,0xb8,0x5d,0x6e,0xfe,0xa2,0xee,0xc4,0xa4,0x46,0x5f,0xba,0x60,0x13,0x97, + 0x10,0x1e,0xa5,0x9f,0x9a,0x28,0xc1,0xf2,0xeb,0x19,0xa9,0x46,0x86,0x7b,0xa6,0xaa, + 0xfd,0x2b,0x95,0xc4,0x5b,0x97,0xb,0xca,0xba,0x9,0x96,0xcd,0xab,0x7b,0x73,0xa9, + 0x64,0xe7,0x9b,0x5b,0xaf,0x27,0xf9,0x49,0x3e,0xf9,0xa7,0x88,0x55,0x99,0xe,0x84, + 0xc2,0xc,0xa0,0x3d,0x63,0xf5,0x52,0x58,0x9a,0x86,0x5,0x1a,0xa0,0x89,0xbb,0x71, + 0xaf,0xae,0x71,0xf2,0x27,0xc9,0x9e,0xe,0x0,0x1a,0xb9,0xfc,0xc3,0x4,0xa3,0x27, + 0x99,0x4e,0x0,0xed,0x9d,0x35,0x19,0x94,0x9,0x2c,0x48,0x18,0x58,0x7,0x6b,0x52, + 0x13,0x47,0xcd,0x62,0xcb,0x2d,0x1d,0x93,0xb2,0x9e,0x25,0xb6,0xb,0x96,0x38,0xac, + 0x2,0xf4,0xfe,0x9c,0x32,0xaa,0x93,0x20,0x4f,0x70,0x96,0x37,0x4b,0x54,0x32,0xaf, + 0x5b,0xaf,0xfe,0x74,0x27,0xa1,0x94,0x3b,0x93,0x72,0x99,0x9,0xb6,0x85,0xa1,0x51, + 0x4b,0xd2,0x9c,0xe4,0x2a,0x9a,0x45,0xa2,0x4a,0xd2,0x9f,0xdc,0xc8,0x94,0x21,0x6, + 0xc2,0x59,0x90,0x95,0xbc,0xa5,0x60,0x5,0x2c,0x8a,0x75,0xf0,0x89,0x4f,0xd,0x66, + 0xfa,0x32,0x13,0x65,0x24,0x44,0x49,0x9c,0x4c,0x42,0x1e,0x79,0xdc,0xee,0xf2,0xa7, + 0x77,0x96,0x30,0x34,0xd8,0x44,0x5f,0xbd,0x4a,0x57,0xcf,0xce,0x14,0x60,0xc6,0xfc, + 0x40,0x91,0x7,0x4d,0x38,0x80,0x6,0xfb,0x1b,0xb8,0xd4,0xdf,0xc0,0xa5,0x85,0x49, + 0x1c,0xb4,0x4e,0xf0,0x70,0x79,0x3,0xb7,0x1e,0xae,0xe1,0xee,0xd2,0x3a,0x1e,0x2e, + 0x6f,0xe1,0xf9,0xe6,0x3e,0x76,0xf,0x8f,0xd1,0xb5,0x16,0xb6,0xcb,0xe8,0x58,0x8b, + 0xae,0xb5,0xe8,0x76,0x19,0x96,0xfd,0xdf,0xbb,0x16,0xd6,0xa6,0xe6,0xac,0x48,0x58, + 0x16,0x1c,0x14,0x12,0xaa,0x8f,0x18,0x68,0x44,0x5,0xd7,0xba,0xc0,0x7f,0x61,0xe9, + 0x1f,0x4a,0x44,0x64,0x1d,0xab,0xd5,0xdd,0xaa,0x26,0x30,0x7d,0x43,0xee,0xa3,0xb7, + 0xb3,0xf6,0x12,0xcf,0xf0,0xfe,0x1a,0x16,0xcb,0x7f,0xe9,0xaf,0xaf,0xf6,0xe8,0xda, + 0xa9,0x9e,0x8,0xe3,0x23,0x3,0x74,0x71,0x61,0x82,0xa6,0x46,0x7,0x7a,0x92,0xe, + 0xe5,0x74,0xf6,0xf8,0xf9,0x16,0x7e,0xfb,0xcd,0x53,0x5e,0xdf,0x3d,0x64,0x49,0x22, + 0xf2,0xae,0x38,0x61,0x72,0xe6,0xa8,0xdd,0x8,0x82,0x22,0xb2,0x4e,0x72,0x44,0x9, + 0x8c,0x70,0x6,0x3a,0xe9,0xef,0xec,0x13,0xcf,0xa3,0x23,0xa4,0x83,0xb,0xf2,0x5b, + 0x92,0x35,0xe7,0x85,0x72,0xd3,0xa4,0x44,0xbb,0x9,0x81,0x1a,0x42,0x7d,0x12,0xb8, + 0x74,0x8b,0x33,0x23,0x78,0xff,0xea,0x22,0x26,0x47,0x6,0x7b,0x12,0xe1,0xc2,0xf3, + 0xdf,0x3f,0x6c,0xe3,0xeb,0x87,0xcf,0x71,0xf3,0xde,0x8a,0x37,0x3d,0x12,0x52,0x2d, + 0xc5,0x93,0xe6,0xb2,0x33,0x50,0xa0,0x9f,0x32,0x2e,0x82,0x91,0x3d,0xf4,0x78,0x5f, + 0x8c,0xd,0x35,0x31,0x3f,0x31,0x84,0x51,0x1f,0x6c,0x52,0x96,0xdb,0x2e,0xaf,0xfb, + 0x93,0x4e,0x7,0x5f,0xde,0x7f,0x8e,0x8f,0x6f,0x3f,0xf3,0x9c,0x6,0x28,0xb6,0x7a, + 0xf8,0xb9,0x7d,0x8d,0x1a,0x1a,0x15,0x83,0xf1,0xe1,0x3e,0x9c,0x99,0x1d,0xc3,0xf5, + 0xf3,0x33,0x78,0xfb,0xd2,0x29,0xbc,0x71,0x6e,0x3a,0xc2,0xea,0xf2,0xb9,0x97,0xc5, + 0xca,0xbe,0x28,0x2c,0xe9,0xa4,0xd3,0xc1,0xee,0x61,0x1b,0x5b,0xbb,0x47,0xf8,0xf6, + 0xf1,0x1a,0xff,0xed,0xa7,0xf7,0xf8,0x37,0xdf,0x3e,0xc5,0xfa,0xf6,0x41,0xa,0x58, + 0xf1,0xe5,0xd2,0x2b,0x10,0x43,0xca,0x3a,0x47,0xdf,0x2,0xe,0x26,0x32,0xb0,0xfe, + 0xa4,0xb5,0x4c,0x96,0x61,0xd9,0x7a,0x52,0x11,0x93,0x13,0x10,0x59,0x26,0x62,0xb2, + 0xcc,0xec,0x72,0xd5,0x7c,0x47,0x6c,0x98,0x60,0xa3,0xb4,0x8d,0xe0,0xa4,0x6f,0x30, + 0x81,0x37,0x4c,0x61,0x89,0x23,0x8a,0xb4,0xe6,0x42,0xa8,0x74,0x35,0x53,0x84,0x9a, + 0xd9,0x94,0x34,0xf5,0x2a,0xb7,0x86,0xa0,0x3c,0x5b,0xa2,0x3f,0x41,0x0,0xcb,0xc, + 0x7c,0xde,0xb4,0x33,0x96,0xd1,0x81,0x88,0x54,0x10,0xb6,0x53,0xc6,0xce,0x92,0x6b, + 0x72,0x52,0x24,0x51,0xe8,0x53,0x9c,0xb2,0xbd,0xa0,0x24,0x83,0x9,0xa6,0x8a,0xa, + 0x75,0xa1,0x8c,0xc7,0x2d,0x31,0x2d,0xf5,0x20,0x88,0x20,0x6,0xc3,0x60,0x11,0x9e, + 0xaa,0x4e,0x32,0x1f,0x9,0x6e,0xdf,0x4,0x43,0x1e,0x40,0xf,0x2c,0x3f,0x32,0xbe, + 0x88,0x47,0xe1,0x7a,0x8,0x4,0x49,0x5b,0x32,0x47,0x7c,0x73,0xdf,0x6e,0xf4,0x82, + 0x24,0x65,0x73,0x7b,0x24,0xd2,0xfb,0x8d,0xa7,0x72,0xcf,0x2a,0xbc,0x91,0x42,0xdc, + 0xad,0xf7,0x35,0x8,0xbf,0xc2,0x72,0x2c,0x6c,0xe1,0x5d,0xac,0x68,0xe5,0x9f,0x61, + 0x88,0x20,0x36,0xce,0xf8,0xef,0xa4,0x38,0xb,0x9c,0xf9,0xf3,0x73,0x8c,0x42,0x63, + 0x30,0x2a,0x14,0x56,0x25,0x24,0xa4,0x6b,0x2c,0xe3,0xe5,0x42,0x6b,0xc8,0x25,0x45, + 0x18,0x81,0xc7,0x25,0xad,0x73,0x59,0xec,0x22,0x85,0x12,0x5c,0xe5,0x4e,0x16,0xd2, + 0x62,0x14,0x69,0xc4,0xa3,0x13,0x1c,0x1d,0xce,0x72,0x82,0x90,0x57,0xac,0x89,0x58, + 0x5f,0x2a,0x4c,0xc1,0xe2,0x82,0x2f,0xe9,0x7d,0x89,0x9,0xb8,0xb7,0xb4,0xc5,0x7, + 0xad,0xdb,0x30,0x64,0x70,0x7c,0xd2,0xa5,0xb7,0x2e,0xcd,0x97,0xba,0x51,0xe9,0x10, + 0x85,0x72,0xd2,0x1c,0x11,0xa1,0xaf,0x5e,0xc1,0xb9,0xb9,0x9,0x2c,0x4c,0x8d,0xe2, + 0x27,0x37,0xce,0xe2,0xb8,0xd3,0xc5,0xc1,0x51,0x1b,0xdb,0xfb,0x2d,0xac,0x6e,0xed, + 0x63,0x6b,0xef,0x8,0xdb,0xfb,0x2d,0x6c,0xed,0x1d,0x62,0xe7,0xe0,0xd8,0xff,0xfd, + 0x8,0x3b,0xfb,0x2d,0x6c,0xee,0xb5,0x70,0x7c,0xd2,0x29,0xf1,0xe,0x28,0xd9,0x8f, + 0x51,0x76,0xf9,0xcb,0x1b,0x4c,0x91,0x5d,0xd,0xb4,0x73,0x3e,0xc9,0xc0,0x2,0x19, + 0xa7,0x90,0x2a,0x40,0xe0,0x46,0x9a,0x0,0x48,0xb1,0x77,0x9b,0x4b,0xaa,0x38,0x13, + 0xd7,0x51,0x14,0xd0,0xf6,0xd0,0xd,0x6,0xe0,0x89,0x9a,0xf5,0x2a,0x4e,0x4d,0xd, + 0x63,0xc2,0xe7,0x6b,0xbf,0x8a,0x3b,0xdc,0xa3,0x95,0x6d,0xfc,0xfc,0xe6,0x23,0x1f, + 0x80,0xe3,0x16,0x96,0x9,0x18,0x22,0x41,0x87,0x8d,0x35,0x8c,0x75,0xc0,0x2b,0x85, + 0x6b,0x37,0x91,0xa,0x81,0x44,0x2c,0x80,0x11,0x67,0x92,0xc9,0xa6,0x23,0x61,0x2d, + 0x49,0x31,0x82,0x4b,0x70,0x8,0x32,0xd6,0xb9,0xa1,0x4c,0x5d,0x1b,0x1e,0x9d,0xc1, + 0xe9,0x99,0x31,0xfa,0xf1,0x8d,0xb3,0x98,0x18,0x6e,0xf6,0x5c,0xe3,0x30,0x33,0x8e, + 0x4f,0x3a,0x78,0xb0,0xb2,0x89,0x3b,0x4b,0x9b,0x58,0xdf,0x3b,0xd2,0x56,0xf9,0x54, + 0xc0,0x6d,0x50,0x8c,0xb9,0x92,0x99,0xe8,0x3a,0xd2,0xba,0x88,0x74,0x12,0x6,0xfa, + 0x6a,0xb8,0x7e,0x61,0x16,0xa7,0x67,0xc6,0x5e,0x98,0x65,0x20,0xdf,0xab,0xf6,0x89, + 0xc5,0xd7,0xf,0x57,0xf1,0xc5,0xbd,0x67,0x38,0xe9,0x48,0xf8,0x38,0x3d,0x8e,0xf1, + 0xe1,0x7e,0xbc,0x79,0x7e,0x6,0xef,0x5d,0x39,0x85,0xd7,0xce,0x4e,0x63,0x7e,0x62, + 0x8,0x23,0x3,0x4d,0xd4,0xab,0x15,0xf4,0x35,0xaa,0xa5,0x8d,0x4c,0xaf,0x6b,0xa2, + 0xec,0x6b,0x98,0x19,0x8f,0x9e,0xef,0xe0,0x97,0x37,0x1f,0xf1,0x87,0x5f,0x3d,0xc6, + 0xed,0xc7,0x6b,0xbc,0x77,0xd4,0xe6,0xd6,0x71,0x3b,0xf2,0x23,0xdc,0x84,0x6c,0x2, + 0xb2,0xce,0x9c,0x7c,0x4,0x9c,0x2d,0x9,0x5b,0x26,0x76,0xa6,0xec,0x7e,0xa,0x70, + 0xd3,0x38,0x93,0x75,0xf8,0xbb,0xb5,0x51,0x35,0xe1,0xde,0x48,0x9b,0x48,0x96,0xd0, + 0xb2,0x36,0x6f,0x21,0x17,0x7,0x60,0xff,0x31,0x25,0x21,0x64,0x66,0x86,0x41,0x16, + 0x4a,0xa9,0xc,0xba,0x90,0xad,0x4f,0x94,0xb,0x25,0x33,0xe4,0x16,0x4b,0x42,0xec, + 0x2c,0xc4,0x3c,0xf9,0x9a,0x4e,0xca,0x66,0xab,0x44,0x54,0x2e,0xbc,0x29,0xa1,0x4d, + 0x2b,0x47,0xb8,0x2c,0xbf,0x94,0x20,0xad,0xe8,0x49,0xf9,0x9,0xc7,0xcc,0xe8,0x10, + 0xc1,0x18,0x8e,0x1a,0xe3,0xf,0x8e,0x94,0x69,0x16,0xed,0xec,0x54,0x47,0xc8,0x81, + 0x0,0x47,0x1,0x79,0xa5,0x48,0xc0,0x33,0x22,0xcf,0x26,0x38,0xb4,0xc7,0x4c,0x6c, + 0xc4,0x22,0x1e,0x8e,0x24,0x3,0x43,0x30,0x64,0x18,0x29,0x61,0xdb,0xb1,0x6e,0x5c, + 0xa1,0xf7,0x66,0xa2,0x86,0x22,0xa1,0x1d,0x9,0x6a,0xcf,0x65,0x3b,0x24,0x65,0x3d, + 0x91,0x29,0x1f,0xfd,0xce,0xc3,0xb7,0x6,0xf4,0x81,0x8c,0x37,0xae,0x8c,0xfb,0x28, + 0x72,0xc5,0x9d,0xc,0x45,0x5a,0xc,0xe5,0xbb,0xd4,0x40,0xc0,0x60,0xa5,0x3b,0xd6, + 0x5a,0xa1,0xf4,0xd,0xaa,0x6b,0x57,0xac,0x67,0x99,0x7a,0x14,0xe4,0x96,0x46,0xa9, + 0x97,0x8b,0xfb,0x91,0xfc,0xee,0x27,0x2a,0x63,0x54,0x33,0x91,0x24,0xc1,0x43,0x4e, + 0xeb,0x79,0xd8,0x4e,0x6e,0x3,0x4c,0x9a,0xc4,0x45,0x88,0xb2,0x90,0x4c,0x6a,0x2b, + 0x7,0x76,0x71,0x1f,0xa9,0x4c,0x60,0x8a,0x96,0x4a,0x9c,0xf3,0x10,0x23,0xd8,0x65, + 0x88,0x9e,0x6f,0xed,0xf3,0xcf,0xbe,0x78,0x80,0x93,0x6e,0x17,0x7,0xc7,0x27,0x74, + 0xed,0xec,0x4c,0x94,0xf2,0x48,0x2f,0xe8,0x30,0x31,0xbc,0x48,0x6e,0x65,0x8c,0x41, + 0x7f,0xd3,0x0,0xa8,0x1,0x68,0xaa,0xcf,0x6d,0xef,0x1f,0x63,0x7b,0xff,0x8,0x7, + 0xad,0x36,0xf6,0xf,0xdb,0xd8,0x3f,0x3a,0xc6,0xee,0x61,0xb,0x7,0xad,0x13,0xec, + 0x1f,0xb5,0xb1,0x77,0x70,0x8c,0xfd,0x56,0x1b,0x47,0xed,0xe,0x8e,0x8f,0x4f,0xd0, + 0x6a,0x77,0x70,0x7c,0xd2,0xc5,0xf1,0xc9,0x9,0x5a,0xc7,0x1d,0x1c,0xb5,0xbb,0x38, + 0x3a,0x3e,0xc1,0xd1,0x71,0x1b,0x47,0xc7,0x27,0xb0,0x10,0xb6,0x74,0x44,0x22,0xc3, + 0x3e,0x9,0x45,0xb4,0xfd,0x64,0x8,0x8c,0x4a,0xe3,0x9f,0x2b,0x8a,0x2,0x8b,0xf5, + 0x53,0x2b,0x2b,0xde,0x41,0x70,0xcb,0xa,0xe2,0x10,0x16,0xe1,0x84,0x2,0x3f,0x49, + 0xe,0xc,0xa8,0x18,0x83,0x73,0x73,0xe3,0x38,0x37,0x3f,0x8e,0xa6,0x3f,0xd0,0xcb, + 0xbc,0xb7,0xe5,0xeb,0xbb,0x7f,0xd4,0xc6,0xc3,0x95,0x2d,0x7e,0xb4,0xb2,0xcd,0x36, + 0xa6,0x5f,0x99,0x78,0x3a,0x12,0x49,0xca,0x67,0x8a,0xe0,0xd4,0xbc,0x43,0x4e,0x36, + 0xc9,0xf2,0x3e,0x8,0x24,0xe,0x75,0xf2,0x49,0xef,0x49,0x11,0x32,0x23,0x3b,0x4e, + 0xa2,0x18,0x6,0xab,0x14,0xa,0x99,0x75,0x74,0xf2,0xbb,0x37,0x98,0x9b,0x1c,0xc0, + 0xb5,0x33,0xd3,0x38,0x33,0x33,0x82,0x5a,0xb5,0xda,0x13,0x6a,0x27,0x22,0x2c,0xad, + 0xef,0xe1,0xd7,0xb7,0x9e,0xe0,0xe9,0xea,0x6e,0xe6,0xa3,0xa4,0x8b,0x99,0x3e,0x7f, + 0x65,0x46,0x45,0x6e,0x43,0x46,0x85,0xc3,0x9a,0x4,0x1,0xab,0xbf,0xaf,0x81,0xeb, + 0xe7,0x67,0xb1,0x38,0x3d,0x52,0x5a,0xcc,0x73,0xe2,0xd9,0x41,0xeb,0x4,0xb7,0x9f, + 0xae,0xe3,0xfe,0xf2,0x26,0x1c,0xdf,0xd3,0x9d,0xe8,0x7d,0x8d,0x1a,0x26,0x86,0xfb, + 0x30,0x3d,0x3a,0x80,0xe9,0xf1,0x41,0x9c,0x99,0x19,0xc5,0xe5,0x85,0x9,0x5c,0x5e, + 0x9c,0xc4,0x99,0x99,0x11,0x54,0x2b,0x95,0xd2,0x46,0x21,0xdc,0x23,0x39,0xe2,0x55, + 0xc6,0x5f,0x21,0x22,0x6c,0xef,0x1d,0xe1,0xd9,0xc6,0x1e,0x1e,0xae,0x6c,0xf3,0xd7, + 0xf,0x9f,0xe3,0xf3,0xbb,0xcb,0x7c,0xeb,0xc1,0x2a,0xbc,0x17,0x7b,0xda,0xaf,0x78, + 0x18,0x9c,0x61,0xd9,0x2d,0xb6,0x3d,0xa3,0x3d,0xfc,0x13,0x24,0x8e,0xee,0xd0,0x65, + 0x27,0xe9,0x21,0x26,0xb0,0x4d,0xcc,0x76,0x62,0x30,0x5b,0x87,0xa1,0xbb,0x1d,0x95, + 0x5,0xd9,0x60,0x2e,0xc3,0x48,0xc5,0x3c,0xfd,0x7c,0x62,0xcd,0x22,0xd7,0x6f,0xb, + 0x95,0x8,0xf3,0x95,0xca,0x42,0x20,0xdf,0x28,0xc4,0xa2,0x66,0x2a,0x19,0x2a,0x59, + 0x49,0x4a,0x8e,0x1a,0x69,0xce,0x24,0xc3,0x38,0x52,0x5c,0xd1,0x20,0x6,0xe5,0xda, + 0x47,0xe9,0x7,0x93,0x99,0xcd,0x48,0xee,0x12,0x67,0xf,0x20,0xfd,0x42,0x1,0x3b, + 0xf8,0x68,0xa9,0x50,0x8e,0x53,0x4,0xaa,0x38,0x58,0x42,0x5e,0xab,0x89,0xe8,0xa0, + 0x4c,0xe2,0x53,0x3,0x74,0xc8,0x95,0x74,0x28,0x4c,0xa8,0xc8,0xa1,0xde,0x19,0xe3, + 0x3f,0x6d,0xdc,0x18,0xe2,0xb7,0xe5,0x50,0x24,0x38,0x83,0xec,0xbf,0x5,0x13,0x48, + 0x4f,0xe3,0x14,0x86,0x71,0x29,0xa1,0x92,0x2f,0xb3,0x49,0x56,0x28,0x9,0x95,0x90, + 0x9b,0x39,0x31,0xee,0x86,0x74,0x1f,0x68,0x57,0xb7,0xf0,0x46,0x99,0xf8,0xdc,0xe2, + 0x24,0x9d,0x4c,0x64,0xb5,0x34,0x24,0x2c,0x9,0x83,0xab,0x2e,0x43,0x58,0xb3,0xb1, + 0xca,0x31,0x27,0xcd,0xdd,0x62,0x4a,0x1e,0xa6,0x32,0x50,0x8f,0xa,0xc,0x7,0xcd, + 0xd1,0x52,0xa4,0x39,0xca,0x90,0x15,0x42,0xf4,0x21,0x57,0x76,0xb,0x82,0xa9,0x4b, + 0x3a,0x76,0x31,0x6c,0x38,0xd,0x65,0x36,0x4,0xac,0x3c,0x3f,0x14,0xa3,0xce,0x8b, + 0x50,0x44,0x9c,0x2b,0xc7,0xa4,0x6c,0xdf,0x44,0xb9,0x5,0x9b,0x51,0x8c,0x8f,0x3b, + 0x4b,0xeb,0xbc,0xb6,0x73,0x80,0x27,0xab,0x3b,0xf8,0xf3,0x1f,0x5f,0xc3,0xef,0xdf, + 0x38,0x4b,0xcd,0x46,0xed,0xa5,0xf2,0x99,0x5e,0x93,0x7b,0x99,0xec,0x67,0x6c,0xa8, + 0x89,0xd1,0xc1,0x46,0x81,0xd1,0x2b,0x51,0x0,0x66,0xc6,0xc1,0xd1,0x9,0x76,0x8f, + 0x8e,0xb1,0xbe,0x73,0x80,0xcd,0xbd,0x23,0x6c,0xef,0x1e,0x62,0x73,0xaf,0x85,0xf5, + 0xed,0x3,0xac,0x6e,0x1f,0xe0,0xf9,0xd6,0x1,0x56,0xb7,0xf6,0xb1,0xba,0x7d,0xe0, + 0xf6,0xf3,0x92,0x4c,0x97,0x67,0x49,0x13,0x44,0x4b,0x69,0x7c,0x28,0x58,0x8,0x1f, + 0x9,0x1a,0xca,0x34,0x5b,0x73,0xc9,0x5c,0x18,0xa7,0xd4,0x54,0xb5,0x0,0x5d,0xb, + 0x29,0xb,0x69,0x22,0x53,0x31,0xb8,0x74,0x7a,0x92,0xae,0x2c,0x4e,0x91,0x21,0xbc, + 0x94,0x78,0xb5,0x7f,0xd4,0xc6,0x57,0xf,0x9e,0xe3,0xc1,0xca,0x16,0xba,0x21,0xee, + 0x9c,0xa8,0xa8,0x6e,0x66,0x1,0x57,0x52,0x59,0xec,0x54,0x9e,0xb6,0xc8,0x10,0x18, + 0x4e,0xb6,0x9b,0xa4,0x74,0x25,0x89,0xdb,0x96,0xa1,0xcf,0x33,0xa7,0x54,0x85,0xe, + 0x88,0x95,0x74,0x1c,0x91,0x28,0x37,0x31,0xd2,0x8f,0x7f,0xf6,0xce,0x5,0xdc,0xb8, + 0x38,0x8b,0x6a,0xa5,0xf2,0x42,0xed,0x39,0x0,0xdc,0x5b,0xda,0xc0,0xdf,0x7e,0xfa, + 0x0,0x1b,0x7b,0x47,0x41,0x40,0x93,0x52,0xd,0x95,0x80,0x5e,0xbb,0xab,0x31,0xa4, + 0x81,0x32,0x43,0x22,0x7a,0xf9,0xc4,0x27,0x77,0xfd,0x3,0xcd,0x3a,0xae,0x9e,0x9d, + 0xc2,0xe2,0xf4,0x48,0xe9,0x7b,0x22,0xb,0x2b,0x33,0xe3,0xe9,0xea,0x36,0x3e,0xfa, + 0xe6,0x29,0xb6,0xf6,0x5b,0x71,0xf0,0x18,0x1e,0x6c,0xe2,0xdc,0xcc,0x18,0xae,0x9f, + 0x9f,0xc6,0xdb,0x97,0xe6,0xf1,0xf6,0xc5,0x39,0x4c,0x8d,0xf6,0x47,0xb7,0xb9,0x5c, + 0xfe,0x99,0xaf,0x55,0x5e,0x76,0xf,0x25,0x4d,0x79,0x1b,0x5f,0x3f,0x58,0xc5,0xcf, + 0x6e,0x3e,0xe4,0xbf,0xf9,0xe4,0x3e,0x3f,0xdb,0xd8,0xd,0x4e,0x9,0xc9,0xbe,0xd5, + 0x1f,0x94,0xe9,0x88,0xa,0xd2,0x31,0xe3,0x89,0x6b,0xe4,0xf6,0x5a,0x9e,0x7e,0xee, + 0x31,0x79,0xeb,0xd,0xd8,0xad,0x27,0x5e,0xc4,0x5d,0xba,0xf3,0xc2,0x6,0x1b,0x22, + 0xb6,0x1c,0xfc,0xc,0x5c,0xc1,0xf7,0x13,0x12,0x6b,0x27,0x9f,0x0,0xd,0x44,0xab, + 0xe0,0xe2,0xfc,0x9b,0x11,0x98,0xa8,0xa0,0x25,0xa5,0xa4,0x52,0xe5,0xe4,0xa8,0xa, + 0x41,0xb2,0x4b,0x1c,0xe5,0xc4,0x86,0xe7,0x3c,0x63,0xd7,0x7f,0x2e,0x69,0x58,0xa8, + 0x7c,0x42,0xef,0x5,0x1,0x6a,0xa2,0x14,0x2b,0x59,0x84,0xdc,0xe2,0x53,0x30,0xc4, + 0x80,0xb6,0x25,0xd4,0x2e,0x23,0xac,0x4c,0x31,0x42,0xce,0x88,0xd2,0x54,0x1a,0x35, + 0xa7,0xf9,0x49,0x96,0xe3,0x9a,0x3a,0xb4,0x4,0x20,0x22,0x36,0x21,0xc2,0xd6,0x24, + 0xb,0x18,0x24,0xf3,0x17,0x12,0x5a,0x72,0x43,0xc6,0x84,0x49,0xdc,0x24,0xb8,0xdd, + 0xc8,0x20,0x10,0xe,0xb9,0x5e,0x1,0x6c,0x14,0x5,0xdc,0x97,0x2a,0x41,0x13,0x16, + 0xbe,0xee,0xb9,0xdd,0xbe,0xa9,0xc8,0x23,0xa3,0x60,0x72,0x5c,0x30,0xb,0x13,0xfb, + 0x30,0x46,0x9,0x9c,0x16,0xa5,0xc9,0x1,0xa6,0x9,0xd7,0x34,0xc1,0x8,0x5b,0x5e, + 0xa2,0xa4,0x57,0x88,0x56,0x57,0x36,0x12,0x47,0x20,0x3d,0xb1,0x22,0x74,0x64,0xc4, + 0xbb,0xcd,0x42,0x4f,0x97,0xb4,0x8e,0xa,0x68,0x24,0x31,0xa2,0x17,0xb4,0xbe,0xa4, + 0x61,0xe2,0x38,0x15,0x6,0xb0,0x86,0xa8,0x68,0xa8,0x43,0xd2,0x4,0x57,0x82,0x14, + 0x99,0xe2,0x42,0x75,0x16,0xd2,0x94,0x3e,0xc5,0x67,0x44,0x67,0xd8,0x80,0xfe,0x27, + 0xf2,0x7c,0x74,0x61,0xdf,0x3e,0x38,0xe6,0xcf,0xef,0x2e,0xbb,0xe2,0x72,0x7f,0x5, + 0x3f,0x7c,0xe3,0xc,0x5d,0x3b,0x33,0x15,0x77,0x8d,0x65,0x44,0xae,0x17,0xfd,0x29, + 0x93,0x2,0xe5,0xd3,0x69,0xbe,0x2f,0x24,0x22,0xc,0xd,0x34,0x30,0xd8,0x5f,0xc7, + 0xe8,0x40,0x13,0xc7,0x9d,0xee,0xff,0xc5,0xda,0x7b,0x36,0x47,0x76,0x66,0x69,0x62, + 0xcf,0x79,0xd3,0x67,0x22,0x91,0x99,0xf0,0xb6,0x0,0x94,0x77,0xac,0xa2,0xeb,0x66, + 0xb3,0xd9,0xd3,0x9c,0x76,0x33,0x3d,0x3b,0x76,0xb5,0xbb,0x1f,0x24,0x6d,0x48,0x21, + 0xe9,0x83,0x7e,0x96,0x36,0x42,0xa,0x4d,0x48,0x11,0x8a,0xd5,0x8e,0xeb,0x9d,0x9d, + 0x76,0x64,0x37,0x9b,0x6c,0x7a,0x56,0x15,0xcb,0x1b,0x14,0xbc,0x37,0x9,0x20,0x13, + 0xe9,0xee,0xd1,0x87,0xfb,0x9a,0xf3,0xde,0x7b,0xb3,0x58,0xb3,0x1a,0x44,0x47,0x13, + 0x85,0x42,0xc1,0xdc,0xbc,0xf7,0x3d,0xe7,0x3c,0xe7,0x31,0x68,0xb7,0xbb,0x38,0xed, + 0x74,0xd1,0x6c,0x75,0xd0,0x38,0x6d,0xe3,0xb4,0xd5,0x45,0xa3,0xdd,0xc1,0x51,0xb3, + 0x8d,0x83,0xa3,0x53,0xec,0xd6,0x1b,0xd8,0xde,0x3f,0xa1,0xad,0x83,0x13,0xac,0x6e, + 0x1f,0xf0,0xe6,0x7e,0x3,0x9d,0x5e,0x2f,0xd4,0xf2,0xb3,0x91,0xd7,0xba,0xd8,0x46, + 0x63,0x91,0x15,0xe,0x2b,0xe1,0xab,0xa5,0x53,0x73,0x65,0xbe,0xb2,0xa5,0xb6,0x28, + 0x21,0x35,0x67,0x72,0xd,0xa0,0x24,0xe0,0x4a,0xc3,0x7,0xe,0xfd,0x1f,0x70,0x71, + 0x66,0x14,0x97,0xcf,0x8c,0x22,0xdd,0x27,0xb9,0x4b,0xa2,0x1e,0x47,0xcd,0x36,0x3e, + 0xba,0xbb,0xcc,0x8f,0x57,0xf7,0xb4,0xb3,0x1f,0x7b,0x36,0x54,0x3e,0xaa,0x23,0xa4, + 0x92,0x2c,0x9a,0x3a,0x12,0x3e,0xdf,0x64,0xa9,0xfe,0xce,0x90,0xc6,0x43,0x93,0x48, + 0xd8,0xc5,0xd8,0xf7,0x49,0x48,0x21,0x49,0x90,0x3,0xc0,0x52,0x2c,0x19,0x3f,0xc, + 0xed,0xd,0x3a,0x3f,0x51,0xc5,0x8f,0x5e,0x3f,0x47,0x57,0xe6,0xc6,0x3c,0x7f,0x83, + 0xa8,0x7d,0x69,0xaf,0xd7,0xc3,0xe1,0x49,0x1b,0x8f,0x56,0xf6,0xf0,0x68,0x6d,0x2f, + 0x54,0x46,0x90,0x3f,0x29,0xc5,0x82,0x7e,0x62,0xac,0x52,0xd1,0x4e,0x5b,0x8f,0x2, + 0x72,0x52,0x68,0xa9,0x3c,0xd2,0x5f,0x6d,0xa4,0x5a,0xc4,0xdc,0x78,0xcd,0x5a,0xf0, + 0xf6,0x93,0xaa,0x99,0xb7,0xa5,0xad,0x43,0x7c,0xfa,0x70,0xd,0xb5,0x72,0x1,0xe7, + 0xa7,0x46,0x70,0x6e,0xba,0x86,0xe9,0x91,0x41,0x8c,0xd5,0x4a,0x18,0xad,0x14,0x31, + 0x52,0x29,0x61,0xa4,0x52,0x4c,0xbc,0x97,0x93,0x62,0x4d,0xa3,0x1c,0x94,0xa4,0x86, + 0xf8,0xf1,0x6a,0xc8,0x41,0xb9,0xfd,0x6c,0x93,0x9f,0xae,0xef,0x63,0x79,0xf3,0x90, + 0xd7,0xf6,0x8e,0xcd,0xd1,0x64,0x86,0x42,0x9b,0x2a,0x64,0x3c,0xfb,0xd9,0xe8,0xcb, + 0xc3,0xd1,0xda,0x98,0xad,0x73,0x28,0x65,0x60,0x46,0x48,0xb4,0xd0,0xc6,0x32,0x8, + 0xf4,0xed,0x12,0xe8,0x7d,0x7b,0x10,0x98,0xfd,0x39,0xd9,0x22,0x1f,0xc0,0x8,0x24, + 0x59,0xa7,0xfd,0x28,0xd6,0x1c,0xe,0xeb,0xfb,0xee,0xac,0x62,0x85,0x1b,0xb3,0x78, + 0x11,0x12,0xc2,0x59,0x10,0x59,0x5b,0xc8,0xce,0x58,0xd4,0x2,0x25,0x88,0x8d,0x14, + 0x31,0x64,0x81,0x33,0x32,0xf2,0x65,0xe4,0x42,0x6e,0x49,0x8,0xb,0xba,0x24,0x5c, + 0xf9,0x76,0x75,0xdc,0xc7,0x79,0xdc,0xdf,0xf7,0x44,0x33,0x65,0xa4,0x19,0x46,0x74, + 0x32,0x31,0x5,0xc6,0x9f,0xa3,0xcc,0x29,0xa2,0x2f,0x1b,0x79,0x11,0x5,0xd6,0x2, + 0x46,0x2a,0x71,0x64,0xad,0xb6,0x4,0x39,0x16,0xee,0x55,0x4a,0xd8,0x85,0xba,0x4c, + 0x6d,0x45,0xd6,0x28,0x46,0x29,0x5d,0xf8,0x95,0x81,0xe6,0x49,0xc1,0xee,0xd3,0xc9, + 0x16,0x76,0xa5,0xc8,0x2e,0xbb,0x5,0xf,0x2c,0x9c,0x9c,0x23,0xb1,0x22,0x4c,0x11, + 0xea,0x88,0xad,0x21,0x4a,0x29,0xa4,0x53,0x84,0x6c,0x2a,0x8d,0x4c,0x26,0xec,0x1d, + 0x7a,0x41,0x68,0xa2,0xde,0xed,0xf5,0xd0,0xed,0x5,0xdc,0xed,0x6,0xda,0x85,0x2c, + 0x49,0x65,0x18,0x99,0x54,0xbd,0x94,0xb5,0xa8,0x96,0x31,0x3c,0xf8,0x52,0x8a,0x90, + 0xcb,0xa4,0x91,0x4a,0x85,0xe1,0x1c,0xa7,0x9d,0x2e,0xf5,0x7a,0x6c,0x53,0xd4,0xad, + 0x74,0xcd,0x7a,0x5a,0x47,0x49,0x6b,0x4e,0xd0,0xed,0xe5,0xca,0x43,0xa0,0xde,0x24, + 0x29,0xd1,0xfa,0x6b,0xe9,0x9f,0x2d,0x9b,0x4e,0x61,0xb0,0x94,0xa3,0x5c,0x36,0x85, + 0x94,0x52,0x50,0x4,0x74,0x3,0x50,0xb7,0xd3,0xc5,0xc9,0x69,0x87,0x1b,0xa7,0x6d, + 0xf4,0x7c,0xeb,0x40,0xd1,0x1a,0x58,0x97,0xfa,0x98,0x93,0xa4,0xf4,0xb1,0x90,0x84, + 0xcd,0xb0,0xe3,0xd5,0xd1,0x9a,0xca,0xc1,0x18,0x24,0x41,0x2b,0xb2,0xe1,0x87,0xc, + 0x80,0xe,0x8e,0x5b,0xfc,0xe9,0x83,0x75,0x3c,0x5e,0xd9,0x43,0xbd,0xd1,0xc2,0x49, + 0xb3,0x85,0x4b,0xb3,0x23,0x34,0x3c,0x58,0x42,0x3a,0x5,0xe4,0x73,0xd9,0xd8,0xe4, + 0x11,0x25,0xc9,0x25,0xc9,0x6c,0x5e,0xc6,0x18,0x43,0xc2,0x9d,0x0,0x50,0x2a,0x64, + 0x51,0x4c,0x70,0x54,0x93,0x7f,0x6e,0xb5,0x3b,0x58,0xdb,0x39,0xc2,0xea,0x4e,0x1d, + 0xcf,0x37,0xf,0xf0,0x6c,0xfd,0x80,0x9e,0x6d,0xec,0xf3,0xd2,0xe6,0x21,0xe,0x4f, + 0x9a,0x68,0x9e,0x76,0xa9,0xab,0xd9,0x76,0xb1,0xa1,0x80,0xed,0x76,0x84,0xa5,0x3d, + 0xb2,0x35,0x89,0x23,0x49,0x52,0x44,0xfc,0x99,0x83,0xf0,0xa,0x94,0x3b,0x40,0x6, + 0x6,0x7,0xa,0x74,0x66,0x7c,0x90,0xa6,0x46,0x6,0x63,0xbf,0x57,0xd2,0xef,0xbe, + 0x7d,0x70,0x82,0xcf,0x1f,0x6d,0x60,0x65,0xe7,0x28,0x5c,0x3d,0x49,0x12,0xad,0x99, + 0x40,0xed,0x59,0xa4,0x5c,0xa4,0x1,0x8b,0x3c,0x59,0x72,0x1e,0xcb,0x80,0xa6,0x3d, + 0x85,0xf2,0xd3,0x24,0x75,0x8d,0xb5,0xe5,0x89,0x98,0x33,0x44,0x8b,0x8c,0x6b,0xda, + 0x4d,0x14,0xba,0xdb,0x3e,0xd8,0xd5,0x9f,0x2,0xd1,0xc2,0x64,0x15,0x6f,0x5e,0x9e, + 0xa1,0xeb,0xb,0xe3,0x28,0x15,0xb2,0xb1,0x15,0x83,0x9c,0x7c,0x8f,0x1a,0x6d,0x7c, + 0xfe,0x68,0x15,0x5f,0x3f,0xdf,0x42,0xe3,0xb4,0xcb,0x4e,0xe5,0xc2,0x9,0xcf,0xb8, + 0x4f,0xd7,0xb3,0xa1,0x60,0x26,0xca,0x20,0xca,0x46,0x11,0xc7,0xd,0x8b,0xce,0xa4, + 0x3a,0x90,0xc7,0xec,0x58,0xd,0x43,0x7a,0x9d,0x94,0xd4,0x70,0x26,0x45,0x8f,0x56, + 0x4b,0x5,0x9c,0x39,0x5b,0xc1,0xf5,0xf9,0x31,0xbc,0xb2,0x30,0x8e,0xb1,0x5a,0xe9, + 0x85,0xe6,0x4b,0x49,0xd3,0x78,0x34,0x50,0x45,0x7e,0x5e,0xb7,0xdb,0x43,0xb3,0xdd, + 0xc5,0x69,0xbb,0x8b,0xe5,0xed,0x43,0x7c,0xf1,0x68,0x1d,0xbf,0xbd,0xb3,0xc4,0x9f, + 0x3d,0x58,0x47,0xb7,0xd7,0x63,0x21,0x80,0x35,0x28,0x85,0x33,0x85,0x31,0xfe,0x3, + 0xae,0xbd,0xd3,0x7f,0x67,0x9,0x70,0x1,0x9,0xeb,0x56,0x80,0x2,0xd,0xb9,0x33, + 0xb3,0x9e,0xc8,0xc3,0x56,0x36,0x84,0xdf,0x35,0xec,0xe,0x3b,0x99,0xc3,0xee,0xd0, + 0x75,0xc1,0x66,0x3,0xc7,0x93,0xe,0x82,0x82,0x5e,0x7e,0x59,0x2f,0x43,0x41,0xb1, + 0x17,0x3f,0x2f,0x8c,0x62,0x24,0x16,0x52,0x16,0x5b,0x52,0xbb,0x21,0x86,0x35,0x9b, + 0x9a,0x3d,0x6d,0x7f,0x14,0x27,0x55,0xe2,0xfc,0x13,0xa,0x27,0x62,0xd,0xb9,0x7b, + 0x23,0xb9,0x92,0x16,0x9c,0x9,0x6e,0x66,0xdc,0xc7,0xe4,0x32,0x9e,0xca,0xe6,0xa1, + 0xd1,0x91,0x5c,0x4d,0x27,0x3c,0x52,0x7e,0x96,0x3a,0xc5,0x95,0x3a,0xfe,0x1,0x62, + 0xe8,0xe6,0xba,0x68,0x3b,0x7c,0x8d,0xac,0xe4,0x2c,0x45,0x64,0x83,0x56,0x42,0x28, + 0xd6,0xc2,0xe9,0x48,0x85,0x9,0xda,0x46,0xae,0xa6,0xff,0x52,0x39,0x6,0x7c,0x88, + 0xd6,0xc3,0x39,0x86,0xeb,0x7d,0xb9,0xb2,0xf3,0x8a,0x8,0x7d,0x77,0x41,0x2d,0x20, + 0xb7,0x76,0xf4,0x72,0xd6,0xc3,0xff,0xc,0x16,0xf3,0x98,0x19,0x1b,0xa4,0x99,0xb1, + 0x2a,0x26,0x87,0xcb,0x54,0xc8,0xa6,0x50,0x6f,0xb4,0x71,0xd4,0x38,0x45,0xfd,0xa4, + 0xcd,0x1b,0xfb,0xc7,0xb4,0xb9,0x77,0x8c,0xfd,0xfa,0x9,0xcb,0x1d,0x7,0x27,0x98, + 0xc4,0x78,0x70,0x34,0x21,0x51,0xa7,0x9a,0x4e,0x2b,0x8c,0xd,0xd,0xe0,0xc2,0xf4, + 0x30,0x55,0x4a,0x39,0x9c,0x76,0x7a,0x78,0xb0,0xb4,0xcd,0xcf,0x37,0xf,0x42,0x80, + 0x9e,0x23,0xf2,0x1b,0xd1,0xea,0xfb,0x3b,0x3c,0xe9,0x4b,0x0,0x7f,0x3d,0xa0,0xb3, + 0x6a,0x28,0xb2,0x23,0x37,0x1f,0x3a,0x3b,0x3d,0x4c,0x7f,0xf1,0xdd,0x4b,0x74,0x71, + 0x76,0x84,0x42,0xc2,0x8c,0xa,0xe3,0x31,0x37,0xf6,0xf9,0xc3,0x3b,0xcb,0xfc,0xe9, + 0x83,0x15,0xde,0x3a,0x38,0x31,0x6c,0x7b,0x7,0xdb,0x73,0xc0,0x70,0x62,0x9e,0x58, + 0x6e,0xa2,0xe8,0x2d,0xe2,0xaa,0x5d,0x4d,0x8f,0x74,0xcf,0x58,0xec,0x1a,0x92,0xb5, + 0xef,0x13,0x54,0x95,0x7a,0xb3,0xcd,0xff,0xf0,0xd1,0x43,0x7c,0xfa,0x60,0x15,0xe7, + 0xa7,0x47,0xf0,0xf6,0xb5,0x19,0xbc,0x75,0x65,0x86,0x16,0x26,0x87,0x12,0x27,0xec, + 0x97,0x99,0xd8,0xbf,0xe9,0xed,0x65,0xe0,0xfb,0xe8,0xa1,0x99,0xcd,0xa4,0x31,0x35, + 0x52,0xc6,0x68,0xb5,0x84,0x6b,0xb,0x13,0xe8,0xf5,0x7a,0x38,0x38,0x39,0xa5,0xa5, + 0xad,0x43,0xbc,0xff,0xe5,0x22,0xff,0xf6,0xce,0x73,0xac,0xed,0x1c,0x41,0x8a,0xb6, + 0x8c,0x8f,0xb5,0x2e,0xcb,0x2e,0x23,0xc7,0x38,0x5,0x2a,0x45,0x9e,0xf1,0x8c,0x34, + 0xb0,0x61,0x63,0x51,0x4d,0x22,0x26,0x97,0xd,0x75,0xe,0x0,0xa1,0x98,0x4f,0xd3, + 0xc2,0x78,0x15,0x23,0xda,0xb4,0xa4,0x5f,0xb6,0xb6,0x69,0x62,0x9a,0xad,0x2e,0x96, + 0xb7,0xe,0xf1,0x7c,0xeb,0x10,0xad,0x4e,0x8f,0xad,0xb6,0xdd,0xba,0x6d,0x91,0x17, + 0x5e,0xe2,0x7e,0x7f,0xcb,0x5b,0x87,0x9,0xbd,0x62,0x25,0xec,0x92,0x94,0x58,0xc2, + 0x20,0x66,0x7a,0x6b,0x75,0x2,0xb6,0x15,0x75,0x59,0xef,0x91,0xaa,0x6e,0x10,0x42, + 0xe5,0x47,0xab,0x9,0xcf,0xc7,0x74,0x26,0x85,0x9f,0x7e,0xfb,0x22,0xfd,0xe9,0x77, + 0x2e,0x22,0x97,0x49,0xbd,0xb0,0xc0,0x11,0x11,0x76,0xea,0xd,0xfc,0xc7,0xdf,0xdc, + 0xc7,0xe7,0xf,0xd7,0x9d,0xff,0x95,0x8,0x67,0x21,0x4a,0x70,0x8a,0x11,0xd6,0x10, + 0x6,0xc9,0xb4,0x76,0x4d,0x7d,0x57,0x42,0xee,0x7e,0xba,0x38,0x33,0x82,0xab,0x73, + 0x23,0x48,0xa7,0xd4,0x4b,0x91,0xd2,0x82,0x20,0xc0,0xb7,0x2f,0xcf,0xe0,0xf2,0x99, + 0x11,0xe4,0x33,0x19,0xe4,0xb2,0x29,0xe4,0x33,0xa9,0x97,0xbe,0x87,0xbf,0xe9,0xf3, + 0xac,0x4,0xed,0xf8,0x14,0x9f,0x3d,0x5c,0xc7,0xef,0xee,0x2e,0xe1,0xeb,0x67,0x5b, + 0xbc,0x5b,0x6f,0xe2,0xf0,0xa4,0x85,0x9e,0x6d,0x44,0xc9,0xc9,0xd1,0x60,0xe1,0x73, + 0x5d,0x2e,0xd9,0x92,0xd1,0x38,0x70,0x5,0x9d,0x81,0x20,0x2c,0xf7,0x8a,0x43,0x59, + 0x39,0x82,0xd0,0x30,0x49,0x8b,0xc8,0x3,0xad,0x43,0xf,0x35,0xbb,0xc,0x26,0xd, + 0xa9,0x7,0x81,0x3e,0x4b,0x2,0xcd,0xe1,0x60,0x4,0x41,0x10,0x28,0xdd,0x14,0x4, + 0x8,0x1b,0x8,0x22,0xfd,0xfd,0x8c,0xc1,0x8c,0xb,0x58,0xf1,0xd3,0x45,0xc9,0x21, + 0xa2,0xe4,0xd8,0x64,0x3e,0x3,0x9c,0x63,0x2e,0x22,0x49,0xef,0x71,0xc4,0x1a,0xd6, + 0xe3,0x91,0x1,0x9e,0xaa,0xd4,0xc8,0xcf,0xd3,0xce,0x24,0x42,0x8,0x97,0x48,0x32, + 0xdf,0x29,0x32,0xab,0xc7,0x95,0xcf,0xe,0x50,0xa6,0x3e,0x4a,0x68,0xdf,0xe8,0x83, + 0x21,0x33,0xd1,0x7d,0x39,0x1c,0xa2,0x12,0x65,0x8f,0x84,0xe3,0x5a,0x4,0x16,0x3b, + 0x6b,0xcf,0xc,0x46,0x3b,0xc2,0xb1,0x66,0xa5,0x87,0xd5,0x5f,0x91,0x5e,0x8b,0x59, + 0xc2,0x1b,0x87,0xef,0xa9,0xd0,0xf1,0x8a,0x43,0xc9,0x1a,0x64,0xa1,0xb7,0xd3,0x38, + 0x19,0xf6,0xba,0x47,0x29,0x94,0x1e,0x90,0x20,0x11,0x8f,0x4a,0xc8,0x66,0x52,0x54, + 0x2b,0x17,0x30,0x52,0x29,0xd2,0xe8,0x60,0x9,0xc3,0xd5,0x2,0x8d,0x56,0x6,0x30, + 0x5a,0x2d,0xd1,0x68,0xb5,0x88,0xa1,0x72,0x1,0xb9,0x6c,0x1a,0x27,0xa7,0x5d,0x34, + 0x5a,0x2d,0x9c,0x34,0x3b,0x74,0xd4,0x6c,0x63,0x65,0xfb,0x80,0x3f,0xbe,0xb7,0x4a, + 0x8b,0x1b,0x7,0x7c,0xdc,0x6c,0xfb,0x3b,0x75,0xa1,0x3,0x4c,0x6c,0xa8,0x74,0x79, + 0xca,0xa4,0x15,0xa6,0x47,0xcb,0xb8,0x36,0x37,0x46,0x97,0xce,0x8c,0x62,0x7a,0xb4, + 0x42,0xc5,0x5c,0x1a,0xad,0x6e,0xf,0xd7,0x16,0xc6,0xf9,0xce,0xd3,0x4d,0xfe,0xf4, + 0xfe,0xa,0xef,0x1f,0xb7,0x34,0x89,0xd3,0x48,0xd3,0xdc,0x29,0x21,0xa7,0x92,0x98, + 0x45,0x2b,0x9,0x58,0x8f,0x25,0xb7,0xdd,0xd0,0x1d,0x8,0xe5,0x62,0x96,0x5e,0x39, + 0x37,0x49,0xef,0x5c,0x9f,0xa5,0x77,0x6f,0x2e,0x60,0x6a,0xb8,0x4c,0xf9,0x9c,0xb3, + 0x79,0x9c,0x1e,0xad,0xd0,0x48,0xb5,0xc4,0xd3,0x63,0x83,0xfc,0xeb,0x2f,0x16,0xf9, + 0xd9,0xc6,0x3e,0xba,0xdd,0xc0,0x76,0x8b,0x64,0xf3,0xab,0x3c,0xdf,0x6a,0x32,0xee, + 0x79,0x91,0xb4,0xd0,0xa8,0x7c,0x9d,0xc9,0x57,0xb,0x47,0xe8,0x0,0x64,0xaa,0x2, + 0xbb,0x43,0x9a,0x10,0x30,0x53,0xe3,0xb4,0xc3,0x8b,0x1b,0x75,0xda,0xad,0x37,0xf9, + 0xf0,0xa4,0x45,0xab,0x3b,0x47,0x7c,0x7e,0x6a,0x88,0x66,0xc7,0x2a,0x18,0x1f,0x2a, + 0x63,0xb4,0x52,0x40,0x36,0x93,0x8e,0x4d,0x1c,0xff,0x5c,0xfb,0xca,0x17,0x7d,0x5e, + 0x3f,0xe7,0x2e,0x59,0x2c,0xb2,0x99,0x34,0x72,0x59,0xf7,0xbd,0x87,0x2b,0x45,0x4c, + 0xe,0x95,0x31,0x90,0xcf,0xd2,0x50,0xa5,0x88,0xdf,0xdd,0x59,0xc2,0xe3,0xd5,0x3d, + 0x9c,0xb4,0x3a,0x6c,0x3,0x6e,0x58,0xda,0x26,0x42,0xd2,0xda,0x23,0xee,0x53,0xca, + 0xb,0x2a,0xf3,0x9d,0x94,0xcd,0x9e,0x4b,0xd9,0xed,0x3b,0x33,0x63,0x7c,0x68,0x0, + 0xd7,0x16,0xc6,0x50,0x1d,0xc8,0x27,0xc2,0xeb,0x72,0xc7,0xda,0xeb,0x5,0x78,0xb8, + 0xba,0x8b,0xaf,0x9f,0x6d,0xf1,0xd1,0x49,0xcb,0x93,0x28,0x5a,0x48,0x91,0x39,0xe2, + 0xc7,0xa4,0x6f,0xc6,0x40,0x23,0xed,0x81,0x48,0xf1,0x33,0xd5,0xdb,0x24,0xee,0x45, + 0x5c,0xef,0x60,0x27,0x78,0x96,0x92,0x34,0x72,0x89,0xc8,0x26,0x3e,0x50,0x69,0xcb, + 0x77,0x45,0xd2,0x96,0x47,0x4,0xa,0x91,0xc9,0xa0,0x1f,0x1d,0x2c,0xd2,0xb7,0x2e, + 0x4f,0xe1,0xed,0x6b,0xb3,0x98,0x9b,0xa8,0xc6,0xa6,0xdf,0xa8,0xc6,0x7a,0x6b,0xff, + 0x18,0x9f,0x3f,0xda,0xc0,0xd7,0x21,0x53,0xdb,0x23,0x35,0xb1,0xcd,0xcc,0xf0,0x30, + 0x4e,0x5b,0x14,0x2c,0x4a,0x0,0x5b,0xdc,0xec,0xc,0x4f,0x1c,0x41,0xac,0x22,0x51, + 0xbd,0xe7,0xa6,0x86,0x70,0x75,0x7e,0xc,0x99,0xb4,0x7a,0xa9,0xa6,0x91,0x99,0x51, + 0x2e,0x66,0x31,0x58,0xca,0xc5,0xf8,0x1e,0x12,0x7d,0xe8,0xb7,0x1f,0x97,0x64,0xb7, + 0xe8,0xb3,0xb1,0x77,0xd4,0xc4,0xfa,0x4e,0x1d,0xab,0xbb,0x47,0x78,0xba,0xb6,0x8f, + 0xbb,0x4b,0xdb,0x7c,0xfb,0xd9,0x16,0xb6,0xf6,0x4f,0xc,0x64,0xc6,0xb0,0xc6,0x9c, + 0x6,0x94,0xb0,0x8c,0x73,0x63,0x78,0xc5,0x42,0x1c,0xc3,0x30,0x9a,0x71,0xb3,0xfb, + 0x36,0x10,0x79,0x10,0x4e,0xe0,0x5a,0xf7,0xc8,0xcc,0x8a,0x89,0x42,0x83,0x77,0x4, + 0xa1,0x7c,0x8d,0x42,0x34,0x3e,0xd0,0x9e,0xd,0x81,0x6,0xef,0xc3,0x71,0x3b,0x94, + 0x89,0x84,0xf,0x81,0xa,0xe5,0x93,0x1c,0xf9,0xde,0x64,0xc8,0x4a,0xcc,0xac,0x24, + 0xa7,0xc9,0x1a,0x96,0xb2,0x6f,0xb8,0xc1,0x6e,0x6,0x14,0xb2,0x9,0xc8,0x15,0x26, + 0xa2,0x84,0xcd,0x28,0x2a,0x8e,0xfe,0x81,0x7a,0x36,0xf,0xdd,0x9,0x95,0x4c,0xff, + 0xaa,0x5c,0x51,0x87,0xb8,0xa9,0x88,0x12,0xba,0x8a,0x88,0xf3,0x95,0xb5,0x4f,0x56, + 0x62,0xf2,0x93,0x1b,0x51,0xc4,0x24,0x71,0x91,0x0,0x9,0x55,0x26,0xdf,0x91,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xc9,0xed,0xf1,0xb4,0x4e,0x8e,0x52,0x46,0xe4, + 0xf9,0xc7,0x3a,0x41,0xb9,0x2d,0xe6,0x60,0x22,0x95,0x52,0x4a,0xf4,0xe1,0xca,0x1a, + 0xc4,0x84,0x5,0xd8,0x4c,0xe9,0xa,0x50,0x44,0x4a,0xc7,0x2e,0x85,0x4b,0x62,0x32, + 0xd,0x83,0x47,0x86,0xb3,0x4f,0x99,0xcd,0x53,0xd7,0xe7,0xf,0x59,0x77,0x5b,0x6, + 0x21,0x97,0x4e,0x61,0x7e,0xa2,0x4a,0x57,0xe7,0xc7,0xe8,0xd5,0xf3,0x13,0x74,0xe3, + 0xdc,0x4,0xe6,0x27,0x6a,0x94,0x4d,0xab,0xc4,0x2c,0x5f,0xe9,0xa6,0xb5,0x5f,0x6f, + 0x52,0x31,0x9f,0xe5,0x5f,0x7c,0xf6,0x14,0xf7,0x97,0xb6,0x99,0x59,0x18,0xd7,0x32, + 0x33,0xf7,0xb1,0x9d,0x90,0x8d,0xd5,0xe4,0x70,0x99,0x7e,0xf2,0xe6,0x79,0xfc,0xd1, + 0xb7,0x2e,0xd0,0xb5,0xf9,0x31,0x6f,0xdb,0xd9,0xed,0x76,0xe9,0xde,0xd2,0xe,0x1f, + 0x35,0xdb,0xfc,0xfb,0x7b,0x2b,0xec,0x8c,0xb,0x14,0x3b,0x7c,0xdb,0xe9,0xe4,0xd8, + 0x92,0xed,0x4,0x2,0xef,0xf4,0xcd,0x12,0x75,0x21,0x7,0x1b,0x67,0x70,0x75,0x61, + 0x9c,0xfe,0xe7,0x9f,0xbe,0x4e,0xaf,0x5d,0x9c,0xa0,0x9c,0x28,0x80,0xe6,0x6d,0x7c, + 0x68,0x0,0x13,0xc3,0x65,0xba,0x71,0x6e,0x92,0x3a,0xbd,0x20,0x68,0xf7,0x7a,0x58, + 0xde,0xaa,0x87,0x7e,0x9e,0x1a,0x25,0x50,0xe6,0x11,0x26,0x84,0x3a,0x6a,0x82,0x19, + 0xb9,0x5d,0x7,0xc1,0x2,0x2b,0x16,0xe2,0x3d,0x8e,0x66,0x92,0x93,0x4f,0x4b,0x85, + 0xb3,0x36,0x26,0x17,0x96,0x65,0xa5,0xca,0x7c,0xd4,0xec,0xd0,0x27,0xf,0x56,0xf9, + 0xb3,0x87,0xab,0x18,0xa9,0x94,0x70,0x75,0x7e,0xc,0xdf,0xbf,0x31,0x47,0xaf,0x5d, + 0x98,0xc0,0xd9,0xc9,0x1a,0x32,0xe9,0x74,0x5f,0x9,0xd0,0xff,0xdf,0xa9,0xfd,0x45, + 0x85,0xbf,0x9f,0xa4,0xce,0xd8,0xd3,0x7e,0xfb,0xca,0xc,0xae,0xcc,0x8d,0xa2,0x52, + 0xca,0xd1,0x3f,0x7d,0xfa,0x84,0x6f,0x3d,0xdb,0xa6,0x6e,0xb7,0xcb,0xca,0x9e,0x32, + 0x9e,0xca,0x15,0x5e,0x1a,0xb2,0xc7,0x92,0x86,0xbc,0xaa,0x62,0xcc,0xd5,0x9e,0x2c, + 0x52,0x56,0x46,0x44,0x93,0xc3,0x83,0xb8,0x71,0x76,0x82,0xca,0x85,0x5c,0xdf,0x55, + 0x84,0xf9,0x6f,0x37,0x60,0x7c,0xf9,0x78,0x3,0x5f,0x3c,0xd9,0x44,0xe0,0xd,0xc8, + 0xfe,0x74,0x6c,0x8e,0x70,0x1b,0x99,0x4c,0xc6,0xf,0x87,0x43,0x7f,0x21,0x67,0xd4, + 0x4d,0x14,0x4,0xae,0xe0,0x29,0x38,0x28,0x82,0xa4,0x5a,0x5c,0x64,0x36,0x93,0xe5, + 0x5a,0x90,0x49,0x7f,0x35,0xb1,0x7e,0xce,0x6f,0x1b,0xce,0xee,0x56,0xc,0x36,0x4, + 0xe0,0xcd,0xcb,0xd3,0xf8,0xf7,0x3f,0xb9,0x41,0xe7,0xa7,0x86,0x12,0xad,0x49,0xe5, + 0x33,0xde,0xe9,0xf6,0xf0,0xe1,0xd7,0xcb,0xf8,0xd5,0x17,0xcf,0xb8,0x7e,0xdc,0x42, + 0x54,0xd3,0xe4,0x13,0xf4,0xfa,0xc8,0x15,0xed,0xa5,0x31,0x5a,0x61,0x49,0x8c,0xf1, + 0xcd,0x48,0xcc,0x67,0x67,0xd2,0xa,0xb,0x93,0x35,0x5c,0x98,0x1e,0x46,0x26,0xa5, + 0x5e,0x8a,0xe4,0x99,0xf4,0x9a,0x45,0x5f,0xbf,0x97,0xbd,0x4f,0xe5,0x35,0x38,0x3c, + 0x3e,0xc5,0xad,0xa7,0x9b,0xf8,0xdd,0xd7,0xcb,0xf8,0xed,0xad,0x25,0xac,0xee,0x1e, + 0x85,0x1,0x3c,0x76,0x1e,0xb7,0xb7,0x95,0x73,0x40,0x74,0x1,0x80,0xae,0xb0,0x8b, + 0x34,0x3d,0x36,0x70,0x39,0x99,0x9,0x5e,0x4f,0xe5,0x1a,0x32,0x27,0x36,0x6c,0x76, + 0x4,0xfa,0xf4,0xd1,0x24,0x38,0xad,0x45,0xf,0xdc,0x54,0xe,0x27,0x87,0xd4,0xb0, + 0xbc,0x6e,0x2a,0x98,0x61,0x2d,0x63,0x35,0x24,0x40,0x50,0xd6,0xb7,0x8a,0x5,0x81, + 0x98,0x84,0x47,0x81,0x78,0x5a,0x1c,0xf8,0x43,0xf1,0xb5,0xb5,0xaf,0xd4,0x50,0x7e, + 0x43,0x96,0x28,0x42,0x44,0x44,0x3c,0x18,0x2f,0xea,0x69,0xff,0x66,0x52,0x5e,0xc4, + 0xa9,0x99,0xc3,0x1d,0x9f,0x29,0xce,0xc3,0xf7,0x3c,0x41,0x94,0x8c,0x72,0xa7,0xbe, + 0xa,0x38,0x24,0x96,0xf7,0x8,0xb7,0x5a,0x47,0x3b,0x46,0x68,0x38,0x82,0xb,0x6b, + 0x36,0xe0,0x9a,0x4d,0xa0,0x6c,0xd2,0x2,0xa9,0x94,0x95,0xa5,0x29,0xa3,0x9d,0x62, + 0x5,0xa5,0x7,0x6d,0xc5,0xa1,0xb2,0x4d,0x59,0x6b,0x57,0xf3,0xb5,0x8c,0x63,0x44, + 0xb8,0x50,0x17,0x32,0x35,0xb6,0x42,0x40,0x56,0x26,0x5f,0xd5,0xc6,0xdc,0x13,0x11, + 0x70,0x76,0xaa,0x46,0xd7,0xe7,0xc7,0xe9,0xca,0xfc,0x28,0x4d,0x8d,0x94,0x31,0x5e, + 0x29,0x61,0xa8,0x52,0xa2,0xe1,0xc1,0x2,0xf2,0xd9,0x74,0xec,0xb7,0x4e,0xea,0x64, + 0x8b,0xf9,0x34,0x6,0x8b,0x79,0x14,0xf3,0x59,0x28,0xa5,0x28,0x60,0xc7,0x6a,0x65, + 0x52,0xf2,0x60,0x8d,0x10,0x11,0xc3,0xd7,0x6b,0xac,0x56,0xc2,0x77,0xae,0x9f,0xa1, + 0x3f,0x79,0xeb,0x12,0x9d,0x9f,0xaa,0xc5,0x1e,0xae,0x54,0x2a,0x85,0xd9,0xd1,0xa, + 0xfd,0xc1,0x8d,0x39,0xb4,0x3a,0x5d,0xdc,0x7a,0xba,0xc9,0x41,0x90,0xa0,0x37,0x93, + 0xa,0x4,0xa2,0xc8,0xd1,0xee,0xeb,0xe1,0x24,0xec,0x32,0x3e,0x32,0x40,0x3f,0x7c, + 0x75,0x81,0x7e,0xf8,0xda,0x2,0xae,0x2d,0x8c,0x51,0x21,0x97,0xed,0xab,0x7b,0x5, + 0x80,0x6a,0x29,0x87,0x77,0x6f,0x2e,0xd0,0x49,0xb3,0x83,0xb5,0x9d,0x7b,0x1c,0x7a, + 0x5a,0x93,0x8b,0xd6,0x50,0x9e,0x6,0x2e,0x34,0x65,0x32,0xd7,0x84,0x8c,0xd1,0x3, + 0x85,0x21,0x32,0x92,0x8a,0x12,0x23,0x62,0x4a,0xed,0x7,0xf9,0x92,0x2e,0x57,0xda, + 0x1d,0xd8,0x63,0x4a,0x9,0x33,0xb6,0xe,0x4e,0xb8,0xf3,0x74,0x93,0xb6,0xf,0x8e, + 0xf9,0x37,0xb7,0x9f,0x63,0x6a,0xb8,0x8c,0xf9,0x89,0x2a,0x9d,0x9d,0x1a,0xc2,0xc2, + 0x44,0xd,0x13,0x43,0x3,0x7d,0x23,0x1d,0x5f,0x44,0x14,0xfa,0x97,0x80,0xe9,0x93, + 0x76,0xb6,0xe5,0x62,0xe,0x3f,0x79,0xe3,0x1c,0xd2,0xa9,0x14,0x6d,0xd7,0x1b,0xbc, + 0xbc,0x75,0x24,0x5d,0xb,0x9c,0xc9,0x94,0x34,0x75,0x15,0x4c,0x19,0xeb,0x34,0x24, + 0xe5,0x95,0xfe,0xbf,0x95,0xab,0x34,0x2,0x80,0xa9,0xe1,0x1,0xbc,0x72,0x76,0x1c, + 0x83,0xa5,0xe4,0x64,0x35,0x39,0xe5,0x35,0x5a,0x5d,0xdc,0x5f,0xda,0xc1,0xc3,0xd5, + 0x5d,0x4,0xbd,0x20,0xb2,0x8e,0xf3,0x55,0x5c,0x2e,0xb5,0xca,0x7c,0x73,0x66,0xe9, + 0x4b,0x4d,0x86,0x32,0xa9,0xa3,0xcd,0x28,0xca,0xb1,0x34,0x37,0x90,0x50,0x67,0x92, + 0x18,0xa,0x44,0xa4,0x3b,0xc1,0x5a,0x37,0x43,0x32,0x29,0x45,0x17,0x0,0xe4,0x73, + 0x19,0xbc,0x7b,0x73,0x9e,0xfe,0xf8,0xcd,0xb3,0x74,0x71,0x66,0x4,0x85,0x5c,0xba, + 0x2f,0xaf,0xc2,0xbc,0xfe,0x1b,0x7b,0x27,0xf8,0xfd,0x83,0x35,0x7c,0xfa,0x68,0x1d, + 0xad,0x5e,0xe0,0xa0,0xf3,0x8,0x61,0xff,0x45,0x77,0x87,0x69,0xa2,0x59,0xec,0xdd, + 0x99,0x44,0xe0,0x5a,0x24,0xee,0x9a,0x99,0x30,0x31,0x54,0xc6,0xe4,0x48,0x19,0xa5, + 0x7c,0xe6,0xa5,0x88,0x9c,0xf2,0x3c,0x4a,0x92,0x1b,0xf6,0x5b,0x9f,0xf4,0x2b,0xf4, + 0xf5,0x93,0x16,0xee,0x3e,0xdf,0xc6,0x83,0x95,0x1d,0x3c,0x5c,0xd9,0xc7,0xda,0x4e, + 0x1d,0xab,0x7b,0x47,0xd8,0xd8,0x3d,0xe2,0x5e,0xe0,0xdd,0xcb,0x9,0xf,0x8f,0xc9, + 0x1b,0xd7,0xe0,0xb8,0x38,0x63,0x34,0xb6,0x16,0x90,0x21,0xc9,0x21,0xcc,0x37,0x87, + 0x76,0x7f,0xf3,0x26,0x77,0x20,0x0,0x14,0x33,0x71,0x10,0x26,0xf2,0x19,0xe9,0x5a, + 0xc0,0x0,0x69,0x63,0x99,0xc0,0x85,0xfb,0x58,0x97,0x33,0xeb,0xe5,0xcf,0xee,0xb8, + 0x1,0x5b,0x22,0x47,0x58,0xa8,0x6d,0xb3,0x29,0x4c,0x60,0x62,0xfa,0x8b,0xa4,0x78, + 0x78,0xaf,0xa5,0x93,0x4c,0xf0,0x88,0x73,0x64,0x4c,0x2e,0x1e,0xfd,0x73,0xa4,0xcc, + 0x5b,0x63,0x19,0x52,0xee,0xb7,0x60,0x2f,0xaf,0x55,0x5c,0x48,0x95,0x2c,0x65,0x8b, + 0x5a,0xd4,0x71,0x5c,0xdb,0x4,0x9f,0x16,0x20,0xf3,0xe0,0xdd,0xd1,0x6a,0xed,0x96, + 0x1,0xcb,0x66,0x27,0xb1,0x80,0xf,0xf7,0xb5,0x66,0x73,0x94,0xd2,0x73,0x37,0x5b, + 0x2,0x1c,0xc,0x6b,0xdd,0x4e,0xd7,0x1a,0x6e,0xa7,0xb0,0xb8,0x2b,0x82,0xd2,0x11, + 0xa9,0xca,0x4a,0xce,0x74,0x51,0xa7,0xd0,0x45,0x4e,0x49,0x56,0xbc,0x10,0x78,0xbb, + 0x85,0x22,0x69,0xc7,0x39,0xfd,0xcb,0xe5,0xd3,0x69,0x2a,0x95,0x32,0x34,0x3f,0x5e, + 0xc3,0xab,0xe7,0x27,0xe8,0xf,0x5e,0x99,0xa3,0x57,0xce,0x8e,0x53,0x21,0x97,0xe9, + 0xb,0x9b,0xbe,0x68,0xf2,0x6a,0xb6,0x7b,0xa8,0x9f,0xb4,0xd0,0x38,0xed,0xf8,0x9d, + 0x8c,0x83,0x8,0x22,0x2b,0x10,0xd7,0x3e,0x15,0xf2,0x59,0x7a,0xe3,0xd2,0x34,0xbe, + 0x7f,0x63,0x9e,0xae,0xcc,0x8d,0x7a,0xf,0xab,0x3c,0x60,0xf3,0xd9,0x34,0xae,0xcc, + 0x8d,0xd1,0xe2,0xe6,0x21,0xee,0x3c,0xdb,0x6,0x2b,0xf3,0x5c,0x40,0xb0,0x67,0xcd, + 0x2e,0x9d,0x2c,0xe5,0x9d,0xc5,0x8,0x40,0xbe,0x39,0x28,0x8,0x8c,0x99,0xd1,0x2a, + 0xde,0xbc,0x32,0x45,0xff,0xea,0x3b,0x17,0xe8,0x8d,0x8b,0xd3,0xde,0xf7,0x95,0xdf, + 0x5f,0x32,0x80,0x99,0x19,0xaf,0x2c,0x8c,0xd3,0xf3,0x8d,0x3,0xfc,0xcd,0x47,0xf, + 0x8,0xed,0x1e,0xcb,0x71,0xc3,0x22,0xf,0x6,0xf0,0x51,0x64,0x2d,0x3f,0x9d,0xa9, + 0xa2,0xb5,0x4b,0x62,0x93,0x6b,0x47,0x1e,0xad,0x88,0xdc,0xee,0x3f,0x3a,0xa9,0x3a, + 0x46,0xbc,0xae,0xe8,0xec,0xec,0x8d,0x6c,0x26,0x1e,0xb0,0x7f,0xd4,0xe4,0xfd,0xa3, + 0x53,0xdc,0x5d,0xda,0x25,0x45,0x84,0x2b,0x67,0x46,0xf8,0xda,0xfc,0x18,0x5d,0x9d, + 0x1f,0xc5,0xd9,0xc9,0x2a,0xc6,0xaa,0x3,0xc8,0x67,0xd3,0x48,0xa7,0x53,0xc8,0x28, + 0x42,0x2e,0x9b,0xb2,0xba,0xdc,0x7e,0x7e,0xf1,0xb2,0xe0,0x7f,0xd3,0xde,0xf9,0x45, + 0xc5,0x3d,0x7a,0x6f,0x31,0x33,0xa6,0x46,0x6,0xf1,0xbd,0xeb,0x67,0x70,0x6f,0x79, + 0x7,0xbd,0xde,0xa,0xad,0xef,0x1d,0x99,0xeb,0x65,0xbc,0xe,0xc4,0xc8,0xa0,0xf1, + 0x5e,0xc9,0x71,0x74,0x44,0x1c,0xa2,0xd8,0x34,0xe1,0x7,0x3c,0xa7,0x55,0xa,0x93, + 0x23,0x83,0x34,0x33,0x3a,0x98,0xa8,0xd3,0x97,0x3f,0xe7,0x69,0xab,0x83,0xe5,0xad, + 0x3,0x2c,0x6f,0xd5,0xb9,0xdd,0x9,0x1c,0xec,0x66,0xa3,0x50,0xd,0xd,0x49,0x16, + 0x3b,0xa5,0x19,0x9b,0x1c,0xe5,0x85,0xb2,0xf3,0x87,0x65,0xdf,0x68,0xc7,0x5f,0xe1, + 0xc1,0xf9,0x17,0x2a,0xcf,0x14,0x4a,0xdb,0x97,0x92,0xc1,0xd8,0x58,0x59,0x93,0x44, + 0x63,0x8e,0x6b,0x37,0x3d,0xb9,0x6c,0x6,0x37,0xcf,0x8d,0xd3,0x9f,0x7e,0xe7,0x2, + 0xbd,0x7a,0x6e,0xc2,0x33,0x4f,0x91,0xaf,0xa1,0x74,0x3e,0x5b,0xde,0xae,0xe3,0xc3, + 0x7b,0x2b,0xb8,0xfd,0x74,0x8b,0x9b,0xad,0xae,0xb7,0x69,0x35,0x5,0xc0,0x77,0xff, + 0xf7,0x2f,0x33,0xb3,0x33,0xe9,0x62,0x9f,0xb1,0xef,0x78,0x8a,0x8c,0x10,0x51,0x16, + 0x1e,0x5,0x43,0x83,0x39,0x9c,0x9f,0x1e,0xc2,0x70,0xb9,0xe0,0x31,0xef,0x5f,0xe4, + 0xa9,0x1f,0x3d,0x8f,0x5e,0x24,0xc9,0x34,0x9f,0x23,0xef,0xed,0x5e,0x2f,0x40,0xab, + 0x13,0xe0,0xe4,0xb4,0x8d,0xfd,0xe3,0x26,0x16,0x37,0xf,0xf0,0xf1,0xfd,0x35,0x7c, + 0xfe,0x68,0x1d,0x8f,0xd6,0xf6,0xd,0x91,0x91,0xcd,0x95,0x77,0x6,0x58,0x62,0x6e, + 0x65,0xb6,0xa8,0xa4,0xd7,0x97,0x87,0x95,0xdd,0xea,0xc1,0x45,0xd7,0xce,0x6c,0x82, + 0x55,0x42,0x48,0x31,0x70,0x91,0xa7,0xa4,0x9d,0xe1,0x82,0x40,0xe7,0xb4,0x4,0xa1, + 0xef,0x71,0xc0,0xc4,0x14,0x32,0xdc,0x29,0xb0,0xf6,0xb0,0xac,0x29,0x95,0x26,0xd1, + 0x8f,0x15,0x6b,0x27,0x42,0x9b,0xda,0x66,0x7f,0x20,0x63,0x93,0x2f,0x87,0x61,0xc1, + 0xe4,0x75,0xcf,0xf,0x47,0xf8,0xe,0x46,0x81,0x61,0x37,0x97,0x32,0x7c,0x85,0xe2, + 0x19,0xf3,0x24,0x88,0x93,0x24,0xc1,0x50,0x86,0x34,0x6a,0x93,0x63,0x5e,0x5a,0x4e, + 0x5d,0x51,0xf6,0xa4,0xef,0x4c,0x15,0x21,0x5e,0x88,0x94,0x15,0x91,0x82,0x6a,0xdf, + 0xa7,0xa8,0x1c,0x2b,0x69,0x27,0x4b,0x2e,0x7d,0x39,0x1e,0x7a,0xaa,0xbc,0xc9,0xdc, + 0xa3,0xe1,0x92,0xe5,0xc0,0x11,0xa7,0x42,0x28,0x9c,0x4c,0x41,0xd6,0xa5,0x5e,0xdb, + 0xaf,0x2b,0xcd,0x6d,0xb1,0x90,0xbb,0x8e,0x39,0x57,0xba,0x23,0x37,0x6d,0x41,0x68, + 0x79,0x23,0x2,0x5b,0x74,0xc8,0xa,0x99,0x1,0xcb,0xac,0x97,0x75,0xe3,0x41,0xf9, + 0x4c,0xa,0x57,0xe6,0xc6,0xe8,0xcf,0xbf,0x7b,0x49,0xdd,0x38,0x37,0x4e,0xa3,0x95, + 0x12,0x4a,0xf9,0xc,0xa,0x9,0x5a,0xe6,0xe8,0x81,0xdb,0x6f,0x57,0xda,0xee,0x74, + 0x71,0x77,0x69,0x1b,0x4f,0xd6,0xf,0x10,0x90,0xf0,0xdb,0xd6,0x87,0x56,0xe8,0xde, + 0x15,0x69,0xb6,0xf4,0xcb,0x54,0x2b,0xe5,0xf1,0xd3,0x6f,0x9d,0xa3,0xb7,0xaf,0xce, + 0x24,0x3e,0x80,0x6e,0xa6,0x61,0xe4,0x32,0x29,0xe4,0xb2,0xa9,0xc8,0xd9,0xec,0x4d, + 0xdd,0x31,0xbd,0xe,0x79,0xc7,0x8e,0xff,0x42,0x9e,0x99,0xa8,0xd2,0xf,0x5f,0x5d, + 0xc0,0xbf,0xfb,0xfe,0x35,0x9a,0x1a,0x1e,0x88,0xfd,0xee,0xdc,0x87,0xb9,0xad,0x94, + 0x42,0xa9,0x90,0x42,0xb5,0x5c,0x80,0xa2,0x94,0xd3,0x8c,0x47,0x48,0x42,0x6e,0x1b, + 0xee,0xfc,0x90,0x5d,0x67,0xe8,0x24,0x77,0x4,0x6,0x2,0x3,0xdf,0xd9,0x75,0x81, + 0x90,0x33,0xfb,0xac,0x68,0x2f,0x9,0x90,0x9c,0x7c,0x82,0xc3,0x4c,0xb1,0x30,0x93, + 0xc9,0x4d,0x69,0xa1,0xc6,0x85,0x81,0x47,0xab,0x7b,0x58,0xda,0x3e,0xe2,0x5f,0x7f, + 0xb5,0x88,0x52,0x31,0x4b,0x23,0xe5,0x12,0x2e,0xcc,0xd4,0x70,0x6e,0x72,0x8,0xb3, + 0x63,0x15,0xcc,0x4f,0x54,0x31,0x51,0x2b,0xc6,0xe,0x50,0xd9,0xe0,0xf4,0xbb,0x3f, + 0xfe,0x6b,0xde,0xe4,0xd7,0x35,0x87,0xec,0x68,0xad,0x84,0xff,0xf6,0x7,0xd7,0xa9, + 0xd3,0xd,0xf8,0xef,0x3f,0x7a,0x64,0x7d,0x50,0x59,0xa4,0xe7,0x59,0x1a,0x84,0xf4, + 0x88,0x88,0x7a,0x4a,0xc7,0x49,0x99,0x96,0x16,0x97,0xcf,0xa4,0x70,0x76,0xb2,0x86, + 0xa9,0xa1,0xf2,0xb,0xf9,0x4,0xe6,0x67,0x5b,0xde,0xa9,0xe3,0xf3,0xc7,0x9b,0x38, + 0x68,0x9c,0x5a,0xab,0x5e,0x69,0x7,0x68,0xae,0x7d,0x98,0x30,0x1c,0xc6,0xc0,0x9, + 0xb8,0x39,0x7c,0xf1,0x2,0xb8,0x50,0x2d,0x83,0x7a,0xb2,0xdc,0x47,0x3,0xf1,0xa0, + 0x49,0x7d,0xe4,0x8a,0x1c,0x5e,0x23,0xad,0x21,0x21,0x44,0xb7,0xa6,0xf4,0xca,0x9f, + 0xb7,0xb2,0xd9,0x34,0xfe,0xe2,0x9d,0x4b,0xf4,0xa3,0xd7,0x16,0xe8,0xfa,0xfc,0x28, + 0xaa,0x3,0x79,0x6f,0x32,0x4f,0x6a,0xac,0x4e,0xdb,0x5d,0xfc,0xee,0xee,0xa,0xfe, + 0xf7,0x7f,0xba,0xc5,0xab,0x3b,0x47,0x90,0xe1,0x21,0x14,0xc1,0x2b,0x89,0xbd,0xcd, + 0x86,0xe8,0x5c,0x1c,0xf9,0x90,0x12,0x64,0x50,0x6e,0xad,0xa9,0x20,0xd,0x3e,0xc6, + 0x6b,0x65,0xbc,0x7a,0x6e,0x2,0xb5,0x81,0xc2,0xbf,0xf8,0xfa,0x27,0x89,0x15,0xcf, + 0xcc,0x38,0x6c,0xb4,0x71,0x67,0x71,0xb,0x9f,0x3e,0x5c,0xc3,0xed,0xa7,0xdb,0x58, + 0xde,0xa9,0xa3,0xd9,0xee,0xa2,0xd9,0xea,0x3a,0x3e,0x95,0xcc,0xac,0xa0,0x88,0xb0, + 0xcb,0x65,0x87,0x58,0x6b,0xa,0x9b,0x92,0x66,0x7d,0xd5,0x49,0x7b,0xb4,0xdb,0xc8, + 0x33,0xed,0x4,0x17,0xa6,0xa8,0xd9,0xf4,0x3d,0x6d,0xef,0x6a,0x24,0x6a,0xe1,0x18, + 0x6e,0xe4,0x66,0x30,0xc0,0xa7,0x6,0xd5,0x35,0xf8,0xe,0x5,0xa,0xc9,0x19,0x1c, + 0xfe,0x5b,0x65,0x3b,0x6e,0x97,0x83,0x4d,0x56,0x61,0x21,0x83,0x9f,0x24,0x55,0x8c, + 0x22,0x6b,0x10,0xc7,0x85,0x10,0xcc,0x4c,0x6f,0xfc,0x66,0x2f,0xd7,0x24,0x9e,0x31, + 0x4f,0x11,0x7f,0x6d,0x19,0xa4,0x45,0x9e,0xd3,0x11,0xb1,0xf4,0x72,0xb7,0xf,0x83, + 0xf,0xdf,0xc4,0xb2,0x9d,0x25,0x1c,0x46,0x11,0x5b,0x3b,0xc9,0x42,0xd2,0xa3,0x80, + 0x95,0x10,0x7a,0x34,0x6c,0x86,0xdf,0xb3,0x38,0xa8,0xc8,0x18,0x84,0x90,0x51,0x51, + 0x99,0x24,0x35,0x49,0x64,0x31,0x16,0x64,0x46,0x4e,0x96,0x52,0x8a,0xcc,0xb2,0x82, + 0xf4,0xfb,0xca,0x4c,0xdf,0xa4,0xf4,0x39,0xad,0xf7,0xe5,0xa1,0x22,0x5d,0x53,0xe2, + 0x48,0xd3,0xee,0xf4,0x5e,0x5d,0x14,0x74,0x67,0xc1,0x22,0xb1,0x37,0xca,0x65,0x14, + 0x16,0x26,0x6b,0x74,0x75,0x6e,0x8c,0x5e,0xbb,0x30,0x41,0x6f,0x5f,0x3b,0x43,0x53, + 0xc3,0xe5,0xd8,0x4e,0x3c,0x2a,0x4b,0x8a,0xea,0x52,0xe5,0xdb,0x49,0xb3,0x8d,0x9d, + 0xc3,0x6,0x3e,0x7b,0xb4,0x86,0x67,0x9b,0x7,0xe8,0x72,0x10,0xe1,0xc8,0xcb,0x46, + 0x87,0x22,0xb4,0x38,0xc6,0x50,0xb9,0x88,0x1b,0xe7,0x27,0x70,0x71,0x66,0x4,0xc5, + 0x7c,0xd6,0x23,0xa8,0xc4,0x27,0x38,0x60,0x65,0xbb,0x8e,0xf5,0xdd,0x13,0x71,0x87, + 0x52,0x4,0x2a,0x62,0x13,0xf4,0x11,0x67,0x62,0x8a,0xf,0x67,0x33,0x29,0x9a,0x1f, + 0xaf,0xe2,0x7,0xaf,0xce,0xe1,0xdd,0x9b,0xf3,0x74,0x66,0xbc,0x92,0x88,0x46,0xc8, + 0xc2,0x26,0x89,0x52,0xe6,0xdb,0x1b,0x96,0x30,0xd9,0xd6,0x57,0xec,0x68,0xad,0x67, + 0x35,0x83,0x35,0xbc,0x26,0x44,0xef,0x4e,0xcb,0x64,0xee,0x35,0x65,0xfc,0x76,0x59, + 0x30,0xf4,0xad,0xb9,0x27,0x33,0xc2,0xf3,0x9a,0xc5,0xfa,0x96,0x85,0x23,0x8b,0x75, + 0x52,0xa3,0x18,0x3d,0xc0,0xaa,0x82,0xda,0x3d,0x46,0xa7,0xd9,0xc6,0x51,0x13,0xa0, + 0xc3,0x26,0x3f,0xdf,0x38,0xa4,0x8d,0xfd,0x13,0x3c,0x59,0x3f,0xc0,0x64,0x6d,0x0, + 0xa3,0xd5,0x12,0x86,0x7,0xb,0x18,0x2a,0x17,0x50,0x2e,0xe6,0x50,0xca,0xa7,0x31, + 0x50,0xc8,0xa1,0x98,0xcf,0xa0,0x98,0x4d,0xa3,0x54,0xc8,0x20,0x97,0x49,0x7b,0xf7, + 0x43,0x12,0x7b,0x3e,0xda,0x0,0xf4,0x83,0x37,0xa3,0xbe,0xd8,0x44,0x84,0x62,0x2e, + 0x83,0xab,0x73,0xa3,0xb8,0x72,0x66,0x84,0x7e,0xf7,0xf5,0x2a,0x1f,0x1c,0x35,0xbd, + 0x2f,0x1c,0x6d,0xa0,0x9d,0x81,0x45,0xbf,0x42,0xee,0xdb,0x5a,0x11,0x42,0x17,0xb2, + 0x8b,0xb3,0xc3,0x34,0x3e,0x34,0xd0,0xb7,0x61,0x95,0x3f,0xfb,0xea,0xce,0x11,0x3e, + 0x79,0xb0,0x86,0xfd,0xe3,0xb6,0x48,0xe3,0x14,0xec,0xf6,0xd8,0xa4,0xed,0x84,0xb9, + 0xa4,0x53,0x5b,0xb4,0xe9,0x10,0x2b,0x10,0x5,0xde,0x81,0xc7,0xba,0xe,0xb3,0xe7, + 0xce,0xcc,0x16,0x65,0x60,0xb1,0x3d,0x52,0xd6,0x51,0x82,0x99,0xc3,0x38,0x63,0x37, + 0xca,0xdb,0x45,0x4c,0x3a,0x45,0x74,0x66,0xac,0x82,0xd7,0xce,0x4f,0xd2,0x8f,0x5f, + 0x3f,0x4b,0x37,0x17,0xc6,0x30,0x50,0xcc,0x7a,0xc8,0x97,0xf9,0x1d,0xe5,0x3d,0x7e, + 0x78,0xd2,0xc2,0x7,0x5f,0x2f,0xe3,0xfd,0x5b,0x4b,0xfc,0x7c,0xab,0x1e,0x9e,0x6c, + 0xe4,0xfb,0x2c,0x24,0x60,0x1e,0x1e,0x9b,0x88,0x5,0x28,0xb,0x19,0x89,0x19,0xdb, + 0xc0,0xfb,0xc6,0x38,0xc4,0xc0,0x58,0xb5,0x84,0x1b,0x9a,0xa4,0x68,0x5e,0x87,0xff, + 0x1a,0x4,0xe8,0x45,0xa8,0xd0,0x51,0xa3,0x85,0xfd,0xe3,0x53,0xec,0xd6,0x9b,0xd8, + 0xd8,0xb,0xd,0x9a,0x1e,0xae,0x86,0x1a,0xfb,0x67,0x1b,0x87,0xa1,0x80,0x82,0x22, + 0x6a,0x27,0x8b,0x32,0xb,0x2b,0x5f,0x57,0xe0,0x4d,0x51,0xb5,0x9f,0x20,0xcc,0xc5, + 0xcc,0x3,0x6d,0xf5,0xe1,0xa1,0xbf,0xb1,0x91,0xb3,0x69,0xa8,0x8e,0x55,0xe8,0x8, + 0x17,0x3e,0xc5,0xa1,0x79,0x8c,0xb6,0x77,0x25,0x36,0x4,0x39,0xed,0xff,0x6f,0xa6, + 0x79,0xdd,0x39,0x99,0x6c,0xb,0x8d,0xcf,0x68,0x8f,0x22,0xcb,0x16,0x77,0x63,0x8c, + 0x45,0x2,0x63,0x91,0xf4,0xce,0xe5,0x33,0x6a,0x93,0xe,0x2f,0x15,0xc1,0xb2,0x38, + 0x95,0x8a,0xec,0x4a,0x22,0x48,0xba,0x3,0xd2,0x94,0xad,0xa1,0x32,0xc4,0x8b,0xe0, + 0xdf,0x53,0xa4,0x2c,0x29,0x8e,0xc0,0x91,0xc3,0x5a,0xba,0xa,0xb2,0x2f,0xa,0x8f, + 0x7,0xc3,0xa9,0x48,0xd6,0x97,0x64,0x6c,0xda,0xdd,0x3c,0x5c,0xe5,0x17,0x39,0x71, + 0x24,0x1e,0x48,0x73,0x90,0x3a,0xe2,0x92,0x70,0x82,0x83,0x95,0xa0,0x85,0x93,0xb9, + 0xb2,0x2d,0xb7,0x2e,0xba,0x29,0x2b,0x43,0xd3,0x9,0xdd,0x3a,0x6c,0x25,0xfc,0xaf, + 0x81,0xdd,0x59,0xc8,0xd5,0xc2,0x2f,0xa5,0xf3,0xce,0xd,0x95,0x94,0x84,0xaf,0x26, + 0xd9,0x10,0x45,0x3b,0xb5,0x9e,0x9f,0x1d,0xa1,0x3f,0x7b,0xeb,0xa2,0xfa,0xfe,0x8d, + 0x39,0x5a,0x98,0xac,0x7d,0x23,0x43,0xb9,0xdf,0x81,0xdc,0xeb,0x5,0x68,0x75,0xbb, + 0x38,0x6e,0xb4,0xb1,0xbe,0x77,0x8c,0xdf,0xdc,0x5e,0xc2,0x7,0x5f,0x2f,0xf3,0xd6, + 0x7e,0xc3,0x5f,0x26,0xc6,0xb8,0x8,0x52,0x61,0x10,0x2,0xcc,0xd7,0xe7,0x47,0xf1, + 0xee,0xcd,0x39,0x1a,0x28,0x66,0x13,0xf,0x18,0x79,0xd8,0x36,0x5b,0x5d,0x7c,0xf1, + 0x64,0x93,0xef,0x2c,0x6e,0x1,0x81,0x5b,0x2e,0x30,0x4b,0xe1,0x32,0xc5,0x64,0x70, + 0x1c,0x53,0x50,0x86,0x2c,0xda,0x1f,0xbc,0x3a,0x87,0xbf,0x7a,0xe7,0x32,0x4d,0x8f, + 0xc,0xbe,0xb4,0x1,0x4b,0xf4,0xc0,0xef,0x6,0x9e,0x47,0xbf,0x7e,0xbe,0xf4,0x2d, + 0xab,0xcc,0x3e,0x26,0xc4,0xdd,0x29,0x30,0x9b,0x52,0x12,0xd4,0x29,0x5,0x97,0xf1, + 0x42,0x7e,0x9b,0xe8,0x49,0xa6,0x15,0xd9,0x65,0x2b,0x91,0x73,0xc1,0x25,0x15,0x4d, + 0x85,0x3,0x47,0xf3,0x50,0xc9,0xef,0x9d,0xbd,0xdc,0x1,0x2,0x56,0x76,0xeb,0x58, + 0xd9,0xad,0xcb,0x79,0x12,0xb5,0x81,0x3c,0xc6,0x6a,0x3,0x38,0x33,0x36,0x88,0xc9, + 0xa1,0x1,0x4c,0xf,0x97,0x31,0x3e,0x54,0xc2,0xd4,0xd0,0x0,0xc6,0x87,0xca,0x18, + 0xc8,0x67,0x90,0x4e,0xa9,0xbe,0xd7,0xa5,0x5f,0x51,0xef,0xf7,0x16,0x25,0x5d,0x12, + 0x11,0xe6,0x27,0xaa,0x78,0xfd,0xc2,0x4,0x3e,0x7d,0xb4,0x8e,0xc3,0x93,0x53,0xc3, + 0xed,0x24,0x4b,0x98,0x96,0x9b,0x9b,0x68,0x6a,0x2d,0xb,0x52,0x5c,0xd4,0xa1,0x8d, + 0x80,0x72,0x31,0x4b,0x17,0x67,0x86,0x31,0x5e,0x2b,0x25,0xae,0xe,0xa2,0xf7,0xc1, + 0xca,0x56,0x1d,0x5f,0x3d,0xdb,0xe4,0xe3,0x66,0x3b,0xe2,0x4f,0xa7,0x24,0xec,0xe8, + 0x9c,0xec,0xec,0x49,0x6e,0xb7,0x6e,0x9a,0x1,0xcd,0xc6,0xc,0x89,0xc8,0xb1,0xbf, + 0x3d,0x7b,0x68,0xb2,0x1e,0xf4,0x24,0x5d,0x35,0xc2,0x7a,0xad,0xcc,0xfe,0xdd,0xb5, + 0xf0,0x96,0x13,0xa0,0x6f,0xf4,0x4c,0x5a,0xd1,0xd4,0x50,0x19,0x7f,0xfa,0xd6,0x5, + 0xfa,0xab,0x77,0x2e,0xd1,0xc8,0x60,0x1,0xe9,0x74,0x2a,0xd6,0x94,0x47,0x57,0x27, + 0x40,0x68,0x94,0xf2,0xd7,0xbf,0xfa,0x9a,0xbf,0x5e,0xdc,0x36,0x96,0x3e,0x16,0x31, + 0x22,0x90,0x47,0x36,0xb5,0xa7,0xbd,0x8,0x7b,0xf3,0x1d,0x21,0x34,0x20,0x41,0x31, + 0x5f,0xce,0x58,0xef,0x65,0xce,0xd2,0x89,0xa1,0x1,0x5c,0x9c,0x1d,0x46,0xb9,0x98, + 0xfd,0x67,0x3d,0x93,0xff,0x9c,0xb7,0xc3,0x93,0x16,0xbe,0x7c,0xbc,0x81,0xdf,0xdd, + 0x5b,0xc5,0xad,0xa7,0x5b,0x58,0xdf,0x3b,0x46,0x2f,0x70,0xc9,0xcb,0xb6,0x2f,0x62, + 0xb9,0x57,0x60,0x1d,0x74,0xa3,0x3c,0x29,0x22,0xb,0x56,0xb5,0x70,0x9e,0x60,0x76, + 0xc1,0x2a,0x32,0x51,0x59,0x17,0x64,0x63,0xf9,0xea,0x1c,0xe0,0xb4,0x40,0xdc,0xb1, + 0xdc,0x39,0xfc,0x38,0x21,0xd0,0xde,0xed,0xa1,0xa5,0xab,0x7e,0x45,0x38,0x80,0xcd, + 0xd9,0xe,0xf5,0xed,0x8a,0x39,0x8,0x2c,0x45,0x87,0x99,0xc8,0x57,0xf1,0x32,0x9b, + 0x4,0x6e,0xc8,0x90,0x33,0x8e,0x12,0xd5,0x64,0x73,0x26,0xce,0x8,0x12,0xd7,0xc6, + 0x1f,0xe7,0x1d,0x81,0x93,0x38,0x42,0x5b,0x27,0x3f,0xd6,0xdc,0x6f,0xf1,0xcc,0x59, + 0xe7,0x9e,0x39,0x4b,0x8a,0x33,0xce,0x9f,0x2a,0xc6,0xb0,0x73,0x18,0xbe,0x47,0x6a, + 0x26,0x27,0x4,0x26,0x16,0x58,0x89,0x35,0x29,0x62,0x38,0x8e,0x99,0x74,0x85,0xb3, + 0xd4,0x5a,0x21,0xf4,0x22,0xeb,0xff,0x66,0x1d,0x2f,0x34,0x2e,0xa2,0x8c,0xf,0xbb, + 0x7e,0xfe,0x94,0xd9,0x73,0xb,0x83,0x18,0x3,0xb3,0x93,0x49,0x68,0x20,0x3b,0x89, + 0x2b,0x63,0x28,0xa3,0x44,0xf8,0x8a,0x2d,0xe6,0x9e,0x53,0x94,0x9c,0xce,0x25,0xd1, + 0x37,0xfc,0xf4,0x5a,0x39,0x47,0x3f,0x7e,0xfd,0x2c,0x7d,0xe7,0xca,0x34,0x5d,0x3e, + 0x33,0x42,0xd3,0xc3,0xe5,0xbe,0x26,0xb,0x49,0xd3,0xc9,0xce,0x61,0x3,0xab,0x3b, + 0x75,0xac,0xed,0x1e,0x63,0x6d,0xf7,0x8,0xdb,0x87,0xd,0xd4,0x1b,0x2d,0x34,0x4e, + 0x43,0xdf,0xee,0xd5,0xdd,0x23,0x6c,0xee,0x9f,0xa0,0xd5,0x9,0x3c,0x6d,0x7e,0x8c, + 0xde,0x68,0xaf,0x67,0xf8,0x39,0x69,0x5,0x5c,0x9d,0x1b,0xa7,0xef,0x5c,0x99,0x45, + 0xa5,0x98,0x8b,0x91,0x90,0x64,0x53,0xd1,0x38,0xed,0xe0,0xe1,0xea,0x1e,0x1e,0xae, + 0xec,0x62,0xa7,0x7e,0x2a,0xc8,0xbf,0xf0,0xac,0x55,0xbd,0xda,0xe6,0x71,0x21,0xc2, + 0x1f,0x2a,0x9b,0x56,0xb8,0x3a,0x3f,0x86,0x3f,0x7e,0xe3,0x2c,0x7d,0xef,0xfa,0x2c, + 0xa6,0xf4,0xb5,0xf8,0xe7,0xe8,0xb4,0x43,0xb8,0x32,0x6c,0x30,0xf6,0xea,0xd,0xaf, + 0xa0,0x7b,0xb8,0xaf,0xe1,0x41,0x69,0x8b,0x44,0x56,0x1,0x9c,0xd3,0x6,0xb1,0xc, + 0x75,0x84,0x4d,0xc3,0x21,0x89,0x50,0xd9,0x7d,0x57,0xd8,0x7c,0x2a,0x9b,0xf8,0x1e, + 0xf3,0x1b,0x25,0x49,0x6c,0x26,0x6d,0x10,0x65,0xb2,0x48,0x49,0xb8,0x79,0x13,0x45, + 0x30,0x69,0xcf,0x2,0xc2,0x74,0xe1,0x7b,0x47,0xa7,0x38,0x3e,0xed,0x60,0xfb,0xf0, + 0x4,0xa5,0x5c,0x16,0xa5,0x42,0x6,0xa5,0x5c,0x6,0xf9,0x5c,0x6,0xa5,0x7c,0x6, + 0x3,0x85,0x2c,0x2a,0xc5,0x1c,0xaa,0x3,0x39,0xc,0x16,0x73,0x18,0x2c,0xe5,0x30, + 0x58,0xc8,0xa1,0x52,0xca,0xa1,0x98,0xcb,0xa0,0x56,0x2e,0x60,0xa0,0x90,0x49,0xe4, + 0x62,0xf4,0xbb,0xb6,0x51,0xa2,0xd2,0xfc,0x78,0x15,0xdf,0xba,0x3c,0x45,0x8f,0xd7, + 0xf7,0xb9,0x7e,0xd2,0x76,0xdb,0x36,0x52,0x8e,0x6d,0x15,0xc9,0x26,0x25,0x44,0x61, + 0x6b,0xb3,0x58,0x96,0x4,0x1a,0x46,0x3e,0x9b,0xc1,0xe5,0xd9,0x11,0x8c,0x55,0x4a, + 0x2f,0xe4,0x89,0x74,0xba,0x3d,0x6c,0xee,0x9f,0x60,0x79,0xe7,0x8,0x47,0x8d,0x76, + 0x3c,0x3b,0x17,0x9e,0x9b,0x50,0x4,0x1e,0xb4,0x96,0x8b,0xfa,0xc7,0x61,0xf7,0x1f, + 0x65,0xc8,0xc6,0xe4,0x1b,0x1d,0x92,0x58,0xb6,0x9b,0xfd,0x82,0x4,0xda,0x3c,0x2b, + 0x2e,0x21,0x44,0xd5,0x3f,0xca,0xf4,0xc8,0x0,0x5e,0x3f,0x3f,0x41,0xdf,0xbd,0x3a, + 0x8b,0x1b,0x67,0xc7,0x68,0x5c,0x18,0xab,0x7c,0x53,0xc0,0xc9,0x7b,0xb7,0x9e,0xe3, + 0x9f,0x3e,0x5f,0xe4,0xa7,0xeb,0x7,0xdc,0xe9,0xb1,0x60,0x74,0x38,0xc6,0x36,0x9, + 0x67,0x2f,0x39,0x3c,0xb1,0x74,0xb0,0x91,0xa8,0xa5,0x16,0xe8,0xc9,0xb6,0x32,0x52, + 0x42,0x18,0x60,0xa4,0x88,0xa8,0x36,0x90,0xc7,0xe4,0x70,0x19,0x95,0x52,0x2e,0x51, + 0x15,0xf1,0x2f,0x5,0xbb,0x2b,0x15,0x2a,0x16,0x16,0xb7,0xea,0x58,0xd9,0x3d,0x6, + 0x18,0xd1,0x55,0xaa,0x54,0x93,0xc0,0xbd,0xa,0x70,0x66,0x41,0x2c,0x86,0x56,0x6d, + 0x61,0xca,0x96,0x4a,0x21,0xdd,0xef,0x5c,0x9c,0xa9,0xf6,0x79,0x61,0xc3,0x20,0xd0, + 0x45,0x3d,0x94,0xc2,0x98,0xec,0x73,0x3d,0xbd,0x87,0x5f,0x8e,0x58,0xef,0xd7,0x99, + 0xc8,0xb1,0xe1,0xd9,0x4c,0xe1,0x6,0xd5,0xf,0x1b,0x2f,0x6f,0x32,0x27,0x29,0x8f, + 0x65,0xf6,0x6c,0x15,0xc9,0x6a,0xbd,0x85,0xbd,0xb5,0x20,0x91,0xa9,0x8,0xdf,0x89, + 0xe4,0x4,0x4c,0x24,0x32,0xcf,0x59,0x24,0x27,0xc6,0x1c,0x33,0x1c,0x91,0x40,0xc0, + 0xea,0xc6,0x32,0xd6,0xd3,0xab,0xdb,0x3c,0x74,0xf2,0x5,0xe0,0x2c,0xe3,0x84,0x2c, + 0xbe,0xaf,0x22,0x50,0x91,0xf9,0x7c,0x3f,0x81,0xdd,0xb7,0x36,0x25,0xb1,0xd3,0x12, + 0xb6,0x15,0x4a,0x79,0x9a,0x66,0xb2,0x8a,0x31,0x44,0x82,0xb2,0x52,0x9a,0x67,0xae, + 0xef,0x80,0x94,0xf1,0xc,0x21,0x6d,0x1e,0x63,0x64,0x67,0x5a,0x6f,0xe,0x41,0x72, + 0x13,0xc5,0x9c,0x28,0x61,0x7f,0xee,0xb2,0x44,0x48,0x3c,0xe9,0x9e,0xfb,0xbb,0x79, + 0xb8,0x33,0xe9,0x14,0x46,0x2b,0x5,0x7a,0xf5,0xfc,0x4,0xfd,0xd5,0x3b,0x97,0xe8, + 0xfa,0xfc,0x18,0x99,0x4e,0x3d,0x6a,0x69,0xe8,0x3b,0x7a,0x75,0xd1,0x68,0x77,0xd1, + 0x38,0xed,0x60,0xef,0xa8,0x81,0xa7,0x6b,0x7,0x78,0xb2,0xb1,0x87,0x67,0xeb,0x7, + 0x78,0xba,0x76,0x80,0xb5,0xbd,0x63,0x74,0x7a,0x3d,0x91,0x27,0x65,0xbf,0x88,0x20, + 0xbf,0x59,0x87,0xc,0x78,0xd6,0xf8,0x9a,0x74,0x9f,0x49,0x2b,0xcc,0x8c,0xc,0xd2, + 0x85,0x99,0x21,0x8c,0xd5,0x4a,0x1e,0x94,0x9d,0x74,0x0,0x3d,0x59,0xdf,0xc7,0x47, + 0xf7,0x56,0xb1,0xb2,0x7b,0x62,0xd,0xdd,0x10,0x63,0x5e,0x46,0x36,0x7c,0x4,0x8f, + 0x84,0x97,0x22,0xc2,0xc5,0xd9,0x61,0xfc,0xf8,0xf5,0x79,0x7a,0xf7,0xc6,0x1c,0x66, + 0xc7,0x6,0x13,0x77,0x6b,0x2f,0x73,0x28,0x74,0x7b,0x3d,0xac,0xee,0xd6,0xb1,0xb1, + 0xdf,0x8,0x3d,0x8c,0x8d,0x59,0x88,0xa4,0x57,0xc0,0xa5,0xc5,0xf9,0xe6,0xb2,0x64, + 0x38,0x71,0x2c,0xf8,0xce,0xb2,0x23,0x65,0x41,0xe6,0x34,0x11,0xa1,0xf2,0x1e,0x63, + 0x6f,0x70,0x37,0xe0,0x87,0x72,0x71,0x5b,0xee,0xf6,0x90,0x50,0x19,0x25,0x38,0xdc, + 0x23,0x62,0xb9,0xe9,0x8a,0x4a,0xbb,0x1b,0x60,0xb7,0xde,0xc2,0x2e,0x5a,0x9,0x82, + 0x13,0xc6,0x40,0x21,0x83,0x91,0x4a,0x9,0xa3,0x95,0x2,0x6a,0xe5,0x2,0x46,0xca, + 0x5,0xd4,0xca,0x79,0x54,0x4a,0x79,0xc,0xf,0xe6,0x31,0x5e,0x1b,0xc0,0x58,0xa5, + 0x88,0x6a,0x39,0x8f,0x6c,0x2a,0xa5,0xd3,0x3f,0xe9,0x1b,0xa7,0x74,0xd3,0xd0,0x8d, + 0xf,0x95,0x70,0xf5,0xcc,0x8,0xca,0xc5,0x3c,0x81,0xea,0xec,0xb2,0xb3,0x25,0x82, + 0x9e,0xb0,0x63,0x93,0x8d,0x95,0x3f,0x76,0xd8,0xbd,0x6d,0xb5,0x9c,0xc7,0xf4,0x48, + 0x19,0x25,0xdd,0x74,0xf4,0x73,0xb8,0x3b,0x6a,0x76,0x70,0xe7,0xf9,0x36,0x9e,0x6f, + 0xd5,0xc5,0xc5,0x57,0x3e,0xc9,0x93,0x3d,0x2e,0xbd,0x3d,0xd3,0xd9,0xa6,0xf1,0xb2, + 0x64,0x32,0xda,0x30,0xb8,0x58,0xc2,0x40,0xd4,0x72,0x83,0x64,0x79,0x24,0x8a,0x4, + 0xd7,0xb8,0x3e,0xf,0x40,0x36,0x97,0xa6,0xf1,0x6a,0x9,0x6f,0x5f,0x9d,0xa1,0xef, + 0x5f,0x9f,0xa5,0xef,0x5d,0x9f,0x49,0x8c,0xf9,0x4c,0x7a,0xb6,0x5a,0x9d,0x1e,0x16, + 0x37,0xe,0xf0,0x5f,0xbe,0x58,0xe4,0xf7,0xbf,0x7a,0xce,0xf5,0x46,0x1b,0x91,0x54, + 0x75,0xf7,0xbb,0x12,0x23,0x9a,0x6f,0xc9,0x90,0xd2,0x60,0x4b,0x54,0x94,0xc,0xe, + 0x93,0xe3,0x20,0xac,0xa0,0xe4,0x34,0x4f,0xc8,0xe7,0xd2,0x38,0x37,0x3d,0x84,0xe9, + 0xe1,0x72,0x6c,0xf5,0x17,0xcd,0x1d,0x4f,0x5a,0x1,0xf6,0xe3,0x78,0x24,0x21,0x48, + 0xf9,0x4c,0x1a,0xe3,0xd5,0x12,0x66,0x47,0xca,0x58,0xdd,0x3e,0xc2,0xd1,0x69,0x3b, + 0xe4,0x9a,0x8b,0x9f,0x47,0xd9,0x4a,0x6c,0xfc,0xa1,0x64,0x8a,0x10,0xb3,0x74,0x3a, + 0x52,0xd6,0xff,0xc0,0x90,0x1c,0x54,0x38,0x51,0x33,0x84,0xc7,0x78,0x10,0xa6,0xab, + 0x5,0x2e,0x5d,0x2d,0xfc,0x82,0x81,0x99,0xd4,0x9d,0x84,0x8d,0xc8,0x34,0x0,0x81, + 0x25,0x24,0x84,0xd6,0x83,0x2e,0x8a,0x17,0x6c,0x21,0x78,0xc7,0x44,0xf,0x23,0xcf, + 0x3c,0x37,0x4d,0xb6,0x56,0xaf,0xf2,0x9c,0xb4,0x16,0xd3,0x1c,0xad,0x89,0xe4,0x42, + 0xc7,0xbc,0x2b,0x61,0xd5,0xa2,0x76,0xdf,0xe4,0x37,0x7c,0x4,0xcf,0x21,0xe,0x88, + 0x36,0x63,0xe4,0x7,0xa,0x4a,0x14,0x95,0x84,0x97,0x3b,0xf7,0x11,0x90,0x59,0xb3, + 0x18,0x92,0xd4,0x29,0xf6,0xb9,0xea,0x76,0xea,0x96,0xbc,0x64,0x65,0x33,0x1a,0x7d, + 0xd6,0xb2,0x18,0x8,0x95,0x7e,0x88,0x95,0x43,0x34,0x59,0x59,0xca,0xbc,0x35,0x8f, + 0x62,0x8f,0x79,0x6e,0x25,0x68,0x66,0xda,0xd6,0x91,0xb0,0x21,0x8c,0xae,0xed,0xe3, + 0x54,0x78,0x77,0x84,0xbc,0x76,0xfd,0x99,0x51,0xa6,0xbb,0x4b,0x51,0xb3,0x39,0x2b, + 0x6c,0xcc,0x6a,0x6c,0xae,0x79,0x4a,0x11,0x16,0x26,0xaa,0xf4,0x97,0xdf,0xbd,0xa8, + 0x7e,0xf8,0xea,0x2,0x85,0x81,0x4,0xea,0x85,0x13,0x93,0xb9,0xd5,0x96,0x77,0xea, + 0xf8,0xe4,0xfe,0x1a,0x3e,0x7f,0xb2,0x81,0xc7,0x6b,0xfb,0x38,0x6a,0xb4,0xd1,0x6c, + 0x77,0xd0,0xed,0x85,0x11,0x8a,0x3d,0x23,0x61,0x61,0x3f,0x4b,0x5e,0x18,0xc4,0x3b, + 0xb3,0xc,0x5b,0xe4,0xd8,0x82,0x6,0x4,0x60,0xb4,0x5a,0xc2,0x1f,0xbc,0x72,0x6, + 0x33,0xa3,0xe5,0x44,0x98,0x36,0xfa,0x10,0x7e,0xfe,0x78,0x3,0x3f,0xfb,0xe4,0x9, + 0xe,0x4f,0x4e,0xe3,0x43,0x66,0xd4,0xc1,0x88,0x7d,0x9b,0x74,0x73,0xec,0xbc,0x71, + 0x69,0x8a,0x7e,0xf8,0xea,0x3c,0xfe,0xf8,0xcd,0x73,0x18,0xad,0x14,0xfb,0x1e,0x76, + 0x2f,0x3,0xb9,0xf7,0x2,0xc6,0xfa,0xde,0x31,0x36,0xf7,0x8e,0xd,0x81,0x82,0x41, + 0x46,0xe6,0x49,0x21,0x51,0x55,0xac,0x6e,0x38,0xa0,0x98,0xcd,0x91,0x34,0x7d,0x77, + 0xd6,0x66,0x48,0x82,0x1d,0x48,0x5c,0x44,0x6f,0x79,0xc4,0xa6,0x4c,0x18,0x9c,0x57, + 0x99,0x48,0x46,0x8,0x67,0x64,0x87,0xe3,0x33,0xa4,0x19,0x94,0x53,0x86,0x40,0x28, + 0x35,0x64,0xc5,0x90,0xbe,0xe,0x10,0xad,0x1a,0x93,0xc2,0xc9,0x69,0xf,0xad,0xee, + 0x31,0x36,0xf7,0x4f,0xa0,0x94,0x42,0x26,0x15,0x82,0x4e,0x69,0x22,0xa8,0x94,0x42, + 0x2e,0x93,0xc2,0xf,0x6e,0x9e,0xc1,0x1f,0xbd,0xb1,0x80,0xb3,0x13,0x35,0xc,0x68, + 0x8b,0xd1,0x97,0xd5,0x4,0xe7,0x33,0x69,0x8c,0x56,0x4b,0xc8,0x66,0x52,0xa2,0x10, + 0x21,0x9e,0x21,0xe0,0x5d,0x46,0x11,0x16,0x11,0xf1,0x44,0x37,0x9f,0x5b,0x2a,0x64, + 0x69,0x6a,0xa8,0x8c,0x1,0x91,0x7b,0xdd,0xef,0xed,0xb8,0xd9,0xc2,0x27,0xf,0xd6, + 0xb1,0xb4,0x7d,0x28,0xe0,0xf5,0xe8,0x2e,0xc7,0xe1,0x30,0x32,0x88,0x85,0xac,0xdb, + 0x95,0x22,0x7,0x7b,0x3a,0x74,0x9a,0x88,0x22,0xf1,0x18,0xc9,0x4c,0x3e,0x7f,0xee, + 0x89,0x7a,0x5b,0x30,0x8a,0xb9,0xc,0xfd,0xc1,0x2b,0x67,0xe8,0x8f,0xdf,0x5c,0xc0, + 0x85,0xa9,0x1a,0x8d,0x55,0x4b,0xb1,0xb5,0xd5,0x8b,0x62,0x76,0x3f,0x7e,0xb0,0x86, + 0xff,0xe7,0x83,0x7,0x7c,0xfb,0xe9,0x36,0x1f,0x36,0x5b,0x6e,0x2d,0x24,0x8f,0x7d, + 0x4b,0x8a,0x93,0x33,0x83,0xc4,0x69,0xc9,0xf3,0xb4,0x83,0x7,0x47,0xd8,0x9f,0x9c, + 0xe5,0xe9,0x2e,0x6f,0x83,0x42,0x2e,0x8b,0xcb,0xb3,0x23,0x98,0x18,0x2a,0xbd,0x70, + 0x55,0xd3,0x4f,0x2f,0x9e,0x64,0x62,0xd4,0x8f,0x14,0x57,0x29,0xe5,0x70,0xf3,0xdc, + 0x38,0x86,0x6,0xb,0xb8,0x3c,0x3b,0x8c,0xbf,0x7e,0xef,0x1e,0xb6,0xe,0x9a,0x31, + 0xaf,0x71,0x37,0xd0,0x45,0x3c,0x4b,0xc4,0x9a,0xd7,0xba,0xc0,0x9,0xfb,0x54,0x69, + 0x6e,0x64,0x18,0xb1,0x6c,0xa2,0x52,0xd,0x57,0x35,0xd0,0x8b,0x7a,0x56,0x1c,0x84, + 0x3c,0x5,0x6,0x98,0x3,0x92,0x96,0xb0,0xfa,0xca,0x7,0x5a,0x96,0xa6,0x34,0xdf, + 0x46,0xbb,0xca,0x19,0xdd,0xbb,0x26,0x61,0xda,0x9d,0xb9,0x48,0xeb,0x66,0x8f,0xc7, + 0x14,0xa7,0xf1,0x79,0xea,0x2d,0xb3,0xbf,0x22,0x19,0x4e,0x22,0x12,0xf0,0xc,0x64, + 0x1f,0x11,0x8b,0xf8,0x13,0x78,0xc,0x1a,0x8d,0xb,0xd5,0xcc,0xf4,0xee,0x40,0x36, + 0xcd,0x72,0xb7,0xd1,0x5c,0x92,0xcd,0x9c,0xb8,0xad,0x85,0x10,0xe8,0x1,0x3e,0x49, + 0xc3,0xc0,0xef,0x22,0x15,0xd,0x11,0x82,0xa,0x27,0x13,0xec,0x9c,0xbd,0xa2,0x15, + 0x7f,0x8a,0x27,0xcd,0x4,0x30,0xeb,0xb9,0xda,0xec,0xc6,0xc3,0xb8,0x34,0xe3,0xec, + 0xa6,0x8b,0xb4,0x49,0x49,0x53,0x26,0xea,0x54,0xbb,0xc4,0x69,0xa6,0x3b,0x19,0xa3, + 0x19,0x3b,0x7b,0x29,0x2f,0x21,0xcd,0xfa,0xca,0x84,0xa7,0x72,0x75,0x20,0x47,0xd7, + 0xe7,0xc7,0xe8,0x3b,0x57,0xa7,0xe8,0xdd,0x57,0xe6,0x68,0x76,0x6c,0xb0,0x6f,0x24, + 0xa2,0xf9,0xd8,0xfe,0xd1,0x29,0x96,0x77,0xea,0x78,0xb2,0xb6,0x87,0x47,0xab,0x7, + 0x16,0xde,0x3e,0x38,0x6e,0x45,0x77,0x62,0x0,0x29,0x93,0xe8,0x64,0xad,0x70,0x9d, + 0x19,0x86,0xd0,0xb4,0x44,0x53,0xea,0xc5,0xc9,0x3b,0x5e,0x2d,0xe1,0xed,0x2b,0xd3, + 0x98,0x19,0xad,0xc4,0xa,0xaa,0xec,0xc2,0x4f,0x3b,0x5d,0x3c,0xdf,0x38,0xc4,0xbd, + 0xa5,0x1d,0xac,0xef,0x9f,0x38,0xbe,0x9f,0xf7,0xfd,0x5c,0x6,0x3a,0x5b,0x84,0xd3, + 0x91,0xd3,0xb2,0xe9,0x14,0x2e,0xce,0xc,0xe1,0xc7,0xaf,0x9d,0xc5,0x3b,0xd7,0x66, + 0x30,0x5a,0x29,0xc6,0xa,0x79,0x74,0x9f,0x98,0x24,0xa9,0x92,0x13,0x4f,0xb7,0x17, + 0x60,0x73,0xff,0x84,0xb7,0xea,0x4d,0x8,0x42,0x8c,0x4f,0xa,0x91,0xe5,0x9b,0x44, + 0x18,0x42,0xe4,0x94,0xd1,0xdf,0x8b,0x23,0x46,0x49,0x6c,0xf0,0x72,0xc4,0xd2,0xc4, + 0xf5,0xdf,0x5b,0x62,0x49,0x68,0x7a,0x6c,0x55,0x9b,0xa,0x2e,0xfa,0x56,0x49,0xe7, + 0x27,0x78,0xf0,0x19,0x47,0x5a,0x55,0x26,0xc4,0xe3,0x6b,0xe5,0xc1,0x28,0x8c,0x79, + 0xcc,0xcb,0xdb,0xed,0x5,0x61,0x54,0x25,0x7a,0x51,0x3d,0x2e,0x0,0xe0,0xa3,0xfb, + 0x6b,0xa8,0xe,0x14,0x30,0xa2,0x95,0x14,0xff,0x5c,0x36,0x72,0x3e,0x93,0x46,0x4a, + 0x91,0xab,0x89,0x81,0x1e,0x4,0x58,0x6e,0x5d,0xc8,0x13,0xfa,0x4a,0x8f,0x69,0x61, + 0xe8,0xe,0x22,0x20,0xa5,0x80,0x99,0x91,0x41,0x9c,0x19,0x1d,0x44,0x26,0xa5,0x12, + 0x35,0xf1,0xf2,0xb9,0xd8,0x39,0x6c,0xe0,0xde,0xd2,0x2e,0x36,0xf6,0x1b,0x36,0x59, + 0x1,0xcc,0x6c,0xd2,0x1,0x85,0x60,0x26,0xe2,0xc,0x68,0x50,0x67,0xe7,0xbd,0xe5, + 0x9d,0xaa,0x94,0x9c,0xf8,0xcc,0xf0,0x51,0x25,0xf2,0x3c,0x17,0x5,0xa5,0x9c,0x80, + 0xb1,0x4a,0x91,0xe6,0xc6,0x2b,0xb8,0x34,0x5d,0xa3,0xb7,0x2e,0x4f,0xe3,0x8d,0xb, + 0x93,0x24,0xd7,0x1c,0xf2,0x39,0x92,0x72,0x2d,0xb7,0x4b,0x3e,0xc5,0x57,0x4f,0xb6, + 0xf8,0xbf,0x7c,0xf1,0xc,0x9f,0x3e,0xd8,0xe0,0xa3,0x66,0x1b,0xe,0xce,0x95,0x21, + 0x70,0x24,0xf,0x61,0xb6,0x26,0x62,0x32,0xf2,0x8e,0x1c,0x63,0x4c,0x46,0x1b,0x9b, + 0x19,0xc3,0xde,0x3a,0x5e,0xa6,0xb0,0xdb,0xd3,0xe6,0xb2,0x69,0x5c,0x98,0x1e,0xb2, + 0xaa,0x83,0xa4,0x9,0x3c,0xe9,0x63,0xcd,0x56,0x7,0xed,0x6e,0xf,0xa5,0x5c,0x6, + 0xa9,0x94,0x8a,0x71,0x7f,0x92,0xa,0x7b,0x2a,0xa5,0x50,0xca,0x67,0x70,0xe5,0xcc, + 0x8,0x32,0x99,0x14,0x9a,0xed,0x1e,0x3e,0xbc,0xb7,0x86,0x87,0xab,0xbb,0x68,0x77, + 0x5,0x13,0xcb,0x79,0x9,0xd8,0x2,0x67,0x76,0x61,0x24,0x55,0x2c,0x66,0x2c,0xd, + 0xe0,0xed,0x96,0x6d,0x5c,0xb9,0x9,0xfe,0x0,0x99,0x1d,0x3c,0xeb,0x50,0x1f,0x3d, + 0x77,0x5b,0xbf,0x38,0x56,0xe1,0xfe,0x98,0x3,0xe3,0x41,0xa3,0x39,0x2d,0xa1,0xdf, + 0x9b,0xc9,0x38,0xb7,0x93,0x3c,0x2c,0x54,0xf,0xc9,0xcf,0x61,0xfb,0xa3,0xb3,0xb4, + 0xbf,0x76,0xad,0xba,0x97,0x9c,0xea,0x3d,0x2f,0x42,0x3c,0xcb,0xb1,0x50,0x71,0x73, + 0xe6,0xaa,0x58,0x52,0x1b,0x93,0xef,0x2b,0xc2,0xbe,0x46,0xd3,0x5d,0xe,0x7b,0xfd, + 0x94,0x9b,0xf4,0x75,0xf,0x9e,0x76,0x9e,0x86,0x7e,0x8c,0x34,0xc5,0x58,0x95,0x7e, + 0x97,0x42,0x71,0x17,0xed,0x98,0x22,0x9e,0x12,0xc2,0x36,0x8d,0x56,0x88,0xbc,0x67, + 0x56,0x7c,0x9,0x4d,0x65,0x63,0x16,0xe9,0x66,0xca,0x14,0x5c,0x63,0xe4,0x42,0x76, + 0x1f,0x2e,0x18,0xeb,0xc6,0x20,0x46,0x19,0xd2,0x1b,0xe9,0xe0,0x95,0xf0,0x9,0xb4, + 0x96,0x3d,0x44,0xd0,0xb2,0x35,0x17,0xea,0x2a,0xac,0x64,0x15,0x15,0xf3,0x69,0xfa, + 0xf6,0xe5,0x29,0xfa,0xa3,0x37,0xcf,0xd1,0xf,0x6e,0x9c,0xa1,0x6c,0x26,0x1d,0x7b, + 0x40,0xa2,0x9d,0x6f,0xb3,0xd5,0xc1,0x97,0x4f,0x37,0xf1,0xeb,0x5b,0x4b,0xf8,0xcd, + 0xed,0x25,0xec,0xd4,0x4f,0x1d,0xa4,0xe8,0x1d,0x56,0xd1,0x13,0x49,0xb4,0x81,0x91, + 0x50,0x72,0x7b,0x63,0x58,0x5,0x85,0x54,0xfa,0x31,0xc6,0x6a,0x3,0xb8,0x3e,0x3f, + 0x86,0x9a,0xb6,0xdc,0xec,0x97,0xa4,0xb4,0xb5,0xdf,0xc0,0x7b,0xb7,0x96,0xf0,0x78, + 0xfd,0x40,0x18,0x79,0xb0,0xff,0xfd,0x28,0x82,0x2,0x58,0xf2,0x78,0xf8,0xa7,0xcb, + 0xb3,0x23,0xf8,0xf1,0xeb,0x73,0xf8,0xd1,0x6b,0x73,0x18,0xab,0x96,0xfa,0xc2,0x75, + 0xfd,0xc8,0x81,0x49,0xa8,0x41,0x10,0x30,0x76,0xe,0x9b,0xd8,0xab,0x9f,0x72,0xe0, + 0x4,0x9d,0xce,0x37,0x43,0xeb,0x5c,0x14,0x52,0x42,0x66,0xce,0x1,0xc9,0x86,0x91, + 0x85,0x69,0xa2,0x48,0x99,0x52,0x1e,0xba,0xc4,0xe2,0x95,0x96,0x7d,0xa9,0xd1,0x31, + 0x29,0xf3,0xfb,0xb3,0xe5,0xe5,0x85,0x10,0x20,0x93,0xb,0xc4,0x46,0x3c,0xa6,0x40, + 0x10,0x4a,0x5d,0xc2,0xad,0xdb,0x8d,0x9a,0x6b,0xcc,0xfe,0x9e,0x4b,0x4e,0xbf,0xa4, + 0x12,0x24,0x2b,0xd2,0x35,0x12,0xc0,0xda,0xee,0x31,0x3e,0x7d,0xb8,0x86,0x77,0xae, + 0x4e,0x63,0x32,0x12,0x94,0xf1,0x32,0x48,0x48,0xab,0xd3,0xd5,0xc7,0x95,0x72,0xe5, + 0x8c,0x12,0xfc,0xc3,0x6d,0xae,0x83,0x8a,0xf9,0x48,0x90,0x73,0x86,0x40,0x8a,0x14, + 0xe6,0x27,0x2a,0x98,0x9f,0xa8,0x40,0xa5,0xe8,0x5,0x56,0xa0,0x8c,0xd3,0x76,0x17, + 0xab,0xbb,0xc7,0x58,0xda,0x3d,0x42,0x37,0x80,0x34,0x61,0xf3,0x24,0xae,0xfa,0x98, + 0x34,0x7e,0x8c,0xb2,0xff,0x31,0xb1,0xf,0x82,0xc6,0x23,0x8e,0x57,0x9b,0x9c,0xea, + 0x8e,0x58,0xb2,0x75,0x48,0xc9,0xfb,0x3c,0xea,0x61,0x4b,0x95,0x62,0xe,0x6f,0x5f, + 0x9d,0xa1,0x3f,0xbc,0x31,0x8b,0xb7,0x2e,0x4d,0x91,0x41,0x1b,0x92,0xdc,0xd3,0xa2, + 0xcf,0x7c,0x10,0x4,0x8,0x2,0xc6,0xfd,0xe5,0x5d,0xfe,0xf,0x3f,0xbf,0xc3,0x77, + 0x97,0xb6,0x75,0xe8,0x8a,0x2d,0x58,0xec,0xc7,0xb,0x31,0xfb,0x26,0x97,0x92,0x38, + 0x6c,0xe0,0x4c,0x5,0x23,0xc1,0x90,0xfe,0x79,0x6c,0x9c,0x60,0xa3,0x3e,0x7f,0x26, + 0x5e,0x51,0x3f,0xa3,0xa5,0x7c,0x6,0xf3,0x13,0x15,0x8c,0xd7,0x8a,0xdf,0x8,0x99, + 0x9b,0xfb,0xb3,0xdd,0xe9,0xe1,0xc9,0xc6,0x1,0x8e,0x9b,0x1d,0x4c,0xd4,0x8a,0x18, + 0x1a,0x28,0xa0,0x5c,0xcc,0x7e,0x23,0xf2,0x23,0xaf,0xc9,0xc2,0x58,0x5,0xff,0xe3, + 0x8f,0xaf,0x63,0x72,0x78,0x0,0xff,0xd7,0x7b,0xf7,0xf1,0x7c,0xab,0x8e,0xd3,0x76, + 0x4f,0xfe,0x7e,0x2,0x84,0x20,0x27,0xc4,0x87,0x67,0x67,0xaf,0x69,0x31,0x2a,0x4c, + 0x3a,0xd,0x3c,0x12,0x9c,0x78,0xd5,0x9d,0x63,0xa6,0x29,0xe5,0x52,0x8a,0xcd,0x70, + 0x5,0x3e,0x7c,0xfd,0x3,0xb6,0x44,0x3a,0xdb,0x50,0xeb,0xc1,0x41,0x5,0x3a,0xd1, + 0x4d,0xa7,0xa5,0x2b,0xc1,0xf9,0x32,0xaf,0x9e,0x82,0x88,0xc0,0x6,0x8c,0x14,0xc4, + 0x86,0x7,0xb0,0xaf,0xaa,0xf0,0x66,0x76,0x46,0x1c,0x32,0x8f,0xb,0x85,0x11,0x63, + 0x8c,0xc8,0x6b,0xcd,0xf1,0x8d,0x58,0x6c,0xb8,0x13,0x4a,0xef,0x74,0xd4,0xd2,0xd5, + 0xcb,0x51,0x14,0xb0,0x80,0xb5,0xee,0x22,0x69,0xb1,0xc5,0x91,0xd8,0x16,0x17,0x5d, + 0xe8,0x63,0x9d,0x10,0xe4,0x17,0xff,0x4f,0x1e,0xbb,0x9f,0x1c,0xcf,0x5d,0xcf,0xd0, + 0x92,0xcc,0x12,0x1a,0xc7,0x68,0x73,0x18,0x37,0xbf,0x2b,0x25,0x2c,0x60,0xad,0xeb, + 0x1b,0x4c,0xbe,0xb9,0xdd,0xa5,0x2b,0x4d,0x98,0xd3,0xb8,0x81,0x89,0x2e,0x62,0xab, + 0x4f,0x25,0x10,0xb0,0x30,0x51,0xa1,0xef,0x5e,0x9d,0xa5,0xef,0x5d,0x9f,0xa5,0x6b, + 0x73,0xa3,0xb6,0x98,0x27,0x11,0xdf,0x4c,0x8a,0xd2,0xed,0xc5,0x6d,0xbc,0x7f,0x7b, + 0x9,0xf,0xd7,0xf6,0xb0,0xbc,0x7d,0x84,0xdd,0xa3,0x53,0x50,0x44,0xe3,0x4d,0xe2, + 0xb0,0xf6,0x6b,0x3,0x79,0xf2,0x6,0x7f,0x8f,0x29,0xcc,0x77,0x4,0xa7,0x30,0x95, + 0x26,0x4c,0xd6,0xca,0x38,0x3f,0x55,0x43,0x29,0x9f,0x7e,0x21,0x49,0x7,0x0,0xd6, + 0xf7,0x4e,0xf0,0xfe,0xd7,0xcb,0x58,0xda,0xaa,0x47,0xa4,0x24,0x72,0x70,0x55,0xae, + 0xf3,0x87,0x33,0x44,0xc8,0xa6,0xd2,0xb8,0x38,0x5d,0xc5,0x4f,0xdf,0x5c,0xc0,0x1f, + 0xde,0x9c,0xb3,0x30,0xbb,0x24,0xde,0x45,0x39,0x4,0xcc,0x8c,0x67,0x1b,0x7,0x8, + 0x18,0x98,0x19,0x29,0x27,0x3a,0xe5,0x59,0x8f,0xe7,0xe3,0x53,0xec,0x37,0x5a,0x7e, + 0x1e,0x91,0xbb,0x48,0x61,0x40,0xa2,0x67,0x4b,0x24,0x7c,0x1b,0x24,0xf6,0x6d,0x3a, + 0x5f,0x56,0xbe,0xc6,0x53,0xe8,0x29,0xc9,0x63,0x4b,0x89,0xd0,0x20,0x67,0x1e,0x61, + 0x13,0x31,0xd8,0x2d,0x73,0xe4,0x82,0x53,0xbc,0x6b,0x3d,0x48,0x1d,0xfb,0x8e,0x28, + 0x8c,0x7e,0x30,0x8d,0x2a,0xf9,0x39,0x5,0xa6,0x31,0xb3,0xcf,0x51,0x94,0x15,0x6b, + 0xaa,0xbe,0x8a,0xbd,0x90,0x0,0xa9,0x97,0x82,0xda,0xa3,0x53,0x58,0xb3,0xd5,0xc1, + 0xd6,0x61,0x3,0xad,0x6e,0x20,0x49,0x32,0x64,0x76,0x9,0x3e,0xad,0xd6,0x17,0xa1, + 0x2b,0x47,0x1,0xf6,0x59,0xee,0x2a,0x64,0xcf,0x2f,0x4c,0x54,0x91,0x4a,0xb0,0x3b, + 0x35,0x6f,0xdd,0x5e,0xf,0xf,0xd7,0xf6,0xf0,0x60,0x75,0x1f,0x2d,0x7b,0xc0,0xbb, + 0x62,0xce,0x88,0x3,0x57,0x10,0x81,0x6f,0x76,0x0,0xa1,0x50,0xa3,0x26,0xd,0xe2, + 0x5c,0x3a,0x9f,0x99,0xc,0xd8,0x71,0x76,0x84,0xea,0x86,0x49,0x45,0x28,0x78,0x44, + 0x73,0xa3,0x65,0xdc,0x38,0x37,0x46,0xaf,0x9d,0x1b,0xc3,0xf9,0xc9,0x2a,0xcd,0x8c, + 0xc,0x62,0xa0,0x90,0xed,0x3b,0xc9,0x46,0x79,0x29,0x0,0xb0,0xb9,0x7f,0x82,0xf7, + 0x6e,0x2f,0xf3,0xfb,0x77,0x56,0xf8,0xc1,0xea,0x1e,0x1a,0xad,0x1e,0xcb,0x94,0x59, + 0x32,0x42,0x3a,0x72,0xd7,0x2c,0x60,0xf6,0x82,0xb3,0x7c,0x6f,0x30,0x43,0xe9,0xb3, + 0x61,0x85,0xce,0x38,0xd4,0x64,0x19,0x53,0xe4,0xd5,0x27,0xff,0x65,0x19,0xad,0x94, + 0x30,0x32,0x58,0x48,0x6c,0xb2,0xa5,0xcf,0x7a,0xb3,0xd5,0xc5,0xc3,0xd5,0x3d,0xdc, + 0x5f,0xdd,0xc3,0xe3,0xd5,0x7d,0xac,0xed,0x9f,0xa0,0xd3,0xe9,0xa1,0x5c,0xcc,0xe2, + 0xb5,0x85,0x71,0x7c,0xf7,0xda,0x34,0x16,0xc6,0x7,0x13,0x99,0xfc,0xd1,0xa8,0x54, + 0xad,0x2c,0xc6,0x40,0x21,0x8b,0xef,0x5d,0x9d,0xc1,0x60,0x31,0x8b,0x5f,0x7e,0xb9, + 0x84,0x4f,0x1f,0x6d,0x62,0xeb,0xb0,0x81,0x58,0xec,0x2b,0xe2,0x19,0xc,0x9e,0x53, + 0xb9,0x87,0x32,0xb3,0xe4,0x34,0x72,0x84,0x7a,0x2a,0x51,0x63,0x31,0x31,0x53,0x24, + 0xbe,0x54,0x81,0x10,0x18,0xc3,0x22,0x67,0x15,0x6b,0x29,0xe0,0xe6,0x36,0xd1,0xd3, + 0xa6,0xe7,0x7f,0x21,0x8c,0x61,0xac,0xbb,0x8b,0xf1,0xbe,0x8a,0x38,0xad,0x51,0x64, + 0x38,0x13,0x82,0xc9,0xe8,0x1a,0xd3,0x4f,0x42,0x89,0x5b,0xba,0x46,0xd3,0xa1,0x39, + 0xa6,0x20,0xa7,0x88,0xff,0xbb,0xfb,0x1a,0x69,0xfb,0x64,0x9,0x27,0x18,0x6b,0xaa, + 0xe4,0x99,0xc7,0xc8,0x7,0x3a,0x29,0x5b,0x4d,0x1f,0xa6,0xd4,0x27,0x4f,0x9d,0x89, + 0x92,0xba,0x11,0xb7,0x33,0x66,0x21,0xd6,0x53,0xe4,0x2,0x14,0x74,0xe2,0x7,0x89, + 0xf8,0xd2,0x30,0x30,0x4d,0x14,0xf2,0x50,0x43,0xce,0x26,0x7c,0x45,0x19,0xf1,0x93, + 0x8b,0x3e,0x35,0xff,0x2e,0x84,0xdf,0x4d,0xa4,0x13,0x81,0x52,0x61,0x81,0x4f,0x29, + 0xc2,0x68,0xb5,0x44,0xef,0xde,0x98,0xa7,0x3f,0x7a,0x63,0x81,0xae,0xcc,0xe,0x93, + 0x81,0x9f,0xa2,0xa4,0x12,0xe3,0xd1,0xbc,0x5b,0x6f,0xe2,0xfe,0xca,0x1e,0x7e,0xf9, + 0xd5,0x73,0xfc,0xe3,0xa7,0x4f,0xc3,0xae,0x94,0xd8,0x6f,0x84,0x90,0xd8,0x86,0xc5, + 0xff,0x26,0x76,0x4e,0x2b,0x24,0x3a,0x7c,0x10,0x90,0x49,0x67,0x70,0x7d,0x7e,0xc, + 0x17,0xa6,0x6b,0x48,0x29,0xe5,0x59,0x4f,0x4a,0xf9,0x50,0xaf,0x17,0xe0,0xf8,0xb4, + 0x8d,0x27,0xeb,0xfb,0x78,0xb0,0xb2,0x8f,0x4e,0x8f,0x23,0x3a,0x57,0xa7,0x44,0x70, + 0x84,0x32,0x16,0x84,0x34,0xc2,0xc2,0x44,0x5,0x3f,0xb8,0x39,0x8f,0x77,0xae,0xcd, + 0x60,0x66,0xc4,0x41,0x79,0x51,0x17,0x30,0x73,0x8,0xb6,0x3b,0x3d,0xac,0xef,0x9f, + 0xe0,0xb7,0x77,0x56,0x50,0x2c,0x64,0x30,0x34,0x10,0xa6,0xac,0x25,0x15,0xa2,0x5e, + 0xc0,0x61,0xe2,0x5c,0xb3,0xed,0xe9,0xec,0x61,0xd,0x45,0xfc,0x2c,0x1,0x8f,0x42, + 0xc4,0xde,0x8a,0xc7,0x6d,0x9f,0x84,0xa4,0x8d,0x62,0xad,0x2d,0x25,0x5c,0x6f,0xdf, + 0xfa,0x58,0xb0,0xa3,0xdd,0x27,0xa9,0x68,0xfa,0xa0,0x68,0x8b,0x5,0x49,0x9c,0x42, + 0xb7,0x31,0x4f,0x4b,0x1f,0xad,0x55,0x7d,0x27,0x1f,0x44,0xf9,0x26,0xee,0xfe,0x18, + 0xab,0x94,0x70,0x7e,0xaa,0x86,0x81,0x42,0xee,0xa5,0xf7,0xe7,0xe6,0x35,0xd9,0x3a, + 0x6c,0xe0,0xee,0xd2,0x2e,0x8e,0x4e,0xdb,0x31,0x64,0xc1,0xa2,0x13,0x49,0xa2,0x44, + 0xc1,0xe0,0x85,0x95,0x66,0x1b,0xdf,0x80,0x34,0x66,0x86,0xcb,0x98,0x19,0x2d,0x5b, + 0x47,0xbc,0x24,0x1d,0x7a,0xc0,0xc0,0xbd,0xe5,0x5d,0xdc,0x5d,0xda,0x45,0x60,0xd0, + 0x8,0xdf,0xe3,0x9a,0x20,0x23,0xa,0x7c,0x60,0x9d,0xed,0x4a,0xc8,0x8,0xcf,0x6d, + 0x54,0x84,0xcb,0x40,0x37,0xc3,0x30,0x94,0xf2,0x5d,0xd,0xd9,0x77,0xde,0xca,0x65, + 0xd2,0x94,0xcb,0x28,0x4c,0x8f,0x94,0xf1,0xda,0xd9,0x31,0xfa,0xfe,0x2b,0xb3,0xf8, + 0xf6,0xc5,0x49,0x92,0x9c,0x98,0x24,0x48,0xda,0x3c,0x4b,0xe6,0xef,0x4e,0xdb,0x1d, + 0xac,0xed,0x9d,0xe0,0xab,0xa7,0xdb,0xfc,0xb7,0xbf,0x7f,0xc2,0x77,0x9e,0xef,0xb0, + 0x98,0xa6,0xd8,0x1,0x5,0x7a,0x25,0x23,0xa4,0x81,0xd6,0x23,0xc1,0x63,0x84,0x47, + 0xd9,0x95,0xae,0x8c,0x5a,0x19,0x90,0xc0,0x4d,0x2c,0x92,0xc8,0x3a,0x78,0x40,0x1f, + 0x84,0x23,0x83,0x79,0x4c,0xf,0xf,0xa0,0x98,0xcd,0x24,0xaa,0x1d,0xe4,0xef,0xb3, + 0x7f,0x7c,0x8a,0xf,0xee,0xad,0xe1,0xfd,0x3b,0x2b,0x78,0xb0,0xb2,0xe7,0x20,0x2b, + 0x6,0xd6,0x76,0x4f,0xd0,0xe5,0x0,0x8d,0xd6,0x38,0x16,0xc6,0x6b,0x28,0xe6,0xd2, + 0x90,0xa1,0x73,0xde,0xeb,0x1b,0x89,0xc9,0x1d,0xaf,0x95,0xf0,0x93,0xda,0x2,0xd2, + 0x2a,0x85,0x54,0x2a,0x85,0xcf,0x1f,0x6f,0x62,0x63,0xff,0x4,0xbd,0xc0,0x71,0x0, + 0x48,0x42,0xc6,0x5e,0xbe,0x3b,0xe2,0xce,0x71,0x5a,0x78,0x4e,0x81,0x1f,0x7,0xe6, + 0xa0,0x70,0xa7,0x5c,0x95,0x83,0x91,0x85,0x33,0x34,0xab,0xe,0x2a,0x9c,0xd4,0x11, + 0x28,0x80,0x2,0x2d,0x7d,0xd,0x5c,0x40,0x18,0xfb,0x50,0x54,0x38,0xc4,0x9b,0xee, + 0x41,0xf9,0xcf,0xa7,0x8c,0x1b,0x67,0x47,0x54,0x83,0x35,0xfe,0x8a,0xa,0x8d,0xc9, + 0x5,0x41,0xab,0x38,0xad,0xc3,0xdf,0xa7,0x73,0x84,0xd,0xe2,0xef,0xe6,0x39,0x26, + 0x73,0xa7,0xd8,0x7a,0x3c,0x2d,0x40,0x67,0xb,0xc4,0x87,0x1,0x2d,0x4e,0xd,0xef, + 0xd4,0x40,0x92,0x90,0xe4,0x33,0x34,0x20,0x8,0xe9,0x49,0x26,0xf2,0x4c,0x11,0xdb, + 0x57,0x87,0xfd,0x92,0x8d,0x2a,0x24,0xab,0x42,0xb6,0x98,0x7a,0x88,0x53,0x99,0xf4, + 0x4,0x3b,0x7d,0xb,0xc8,0x3d,0x84,0xd7,0x39,0x2c,0xea,0x4a,0xf,0xe3,0x8a,0xd9, + 0x5,0xa0,0x92,0x4b,0x5c,0x95,0x60,0x23,0x48,0x69,0x22,0x1c,0x3,0x17,0x67,0x87, + 0xe9,0xdf,0x7d,0xff,0xb2,0x7a,0xfd,0xdc,0x4,0xcd,0x8c,0xc,0x58,0xcd,0x69,0x3f, + 0x28,0xf9,0xe1,0xea,0x3e,0xde,0xbb,0xbd,0x84,0xf7,0x6e,0x2f,0xe3,0xd9,0xe6,0x21, + 0xda,0x7a,0x2,0xf2,0x7c,0x87,0x11,0xd7,0xee,0xfb,0xb7,0xab,0x5f,0xd8,0x23,0xb7, + 0x72,0x8c,0x4c,0x62,0x3e,0x2b,0x9b,0x51,0xb8,0xb1,0x30,0x86,0x4b,0x33,0xc3,0x89, + 0xe4,0x37,0xf3,0x73,0xb7,0x3a,0x3d,0x7c,0xfc,0x70,0x1d,0x5f,0x3e,0xdd,0xd4,0xf, + 0x95,0x13,0x59,0x98,0x31,0x89,0xd9,0xef,0x88,0x1d,0x1e,0xb,0x5c,0x98,0xac,0xe0, + 0x7,0x37,0xe7,0xf0,0x97,0x6f,0x5f,0xc0,0xb8,0x66,0xd1,0x47,0xf7,0xe3,0xd1,0xef, + 0xff,0xc5,0xd3,0x2d,0xfc,0xc3,0x27,0x9,0xe9,0x44,0x0,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x4f,0xf1,0xdb,0xaf,0x97,0x71,0xe5,0xcc,0x8,0xde,0x38,0x37,0x8e, + 0x4a,0x29,0xa7,0x3,0xba,0x38,0xb6,0x22,0x3e,0x6a,0x76,0xd0,0xea,0x6,0xe1,0x61, + 0x17,0x88,0xde,0xcf,0x62,0xd4,0xae,0xe8,0x28,0xeb,0xfd,0xe0,0xb9,0x63,0x11,0x7, + 0xcc,0x82,0x8d,0xaf,0x25,0xbe,0x2e,0xcb,0xd6,0x8f,0x4,0x17,0x39,0x82,0x2,0xba, + 0x77,0x3b,0x56,0xe5,0xb3,0xed,0x3c,0x83,0x7,0x61,0x77,0x2b,0x39,0x2f,0xf2,0x40, + 0x17,0x8d,0x3,0x47,0xe4,0x60,0xb1,0xee,0x2e,0x29,0x7d,0x21,0xe2,0xa8,0x8,0x0, + 0x17,0x67,0x86,0xf0,0xc3,0x9b,0x67,0x30,0x54,0xce,0x7f,0xa3,0x14,0x29,0x4a,0x6e, + 0x7a,0xb6,0x71,0x88,0xf,0xee,0xae,0x21,0x4c,0xd7,0xa3,0x3e,0x3f,0x0,0xc1,0xf7, + 0x3,0x27,0x70,0x2,0x84,0x68,0xfe,0x58,0x1b,0xc8,0x63,0xa2,0x56,0x42,0x21,0x9b, + 0xe9,0xfb,0x8c,0x98,0x3,0xff,0xe1,0xea,0x3e,0xee,0x2f,0xef,0xa1,0x17,0x4,0x88, + 0xe4,0x77,0x4b,0x40,0x24,0x42,0x5b,0x23,0x73,0x29,0xad,0x2e,0xd9,0x73,0x3c,0xf5, + 0x56,0x84,0x21,0x2b,0xd9,0x31,0x47,0x55,0xe8,0x8,0xad,0x9c,0x30,0xa2,0x50,0xc8, + 0xe0,0xda,0xec,0x30,0xde,0xb9,0x3a,0x4d,0x37,0x16,0x46,0x69,0x6a,0x68,0x0,0xd5, + 0xb2,0x7f,0x4f,0x26,0xf1,0x3d,0xa2,0xcf,0x7c,0xbb,0xd3,0xc5,0x97,0x4f,0xb6,0xf9, + 0xe7,0x5f,0x3d,0xc7,0x6f,0xee,0xac,0xf2,0x6e,0xbd,0x61,0x24,0xfd,0xec,0x2c,0x3e, + 0xd,0xc9,0xca,0x77,0x7f,0x73,0xe2,0x4a,0x16,0x9b,0x1f,0xf2,0xee,0xa,0xb6,0x5d, + 0x96,0xf9,0xc7,0x2e,0xbf,0x3e,0x44,0x77,0x85,0xb0,0x5b,0xe6,0x15,0x10,0x61,0x76, + 0x74,0x10,0xb,0x93,0x55,0x2f,0x2a,0x35,0x2e,0x13,0xd,0x7,0x93,0xf5,0xfd,0x63, + 0xfc,0xf2,0xab,0x25,0x3c,0x59,0x3f,0x74,0x56,0x3e,0xfa,0xff,0x1e,0xae,0x1f,0x60, + 0xe7,0x57,0xf7,0xf1,0xc5,0x93,0x6d,0x7c,0xf7,0xea,0x24,0xfe,0xe4,0xf5,0x5,0x54, + 0xb4,0x33,0xde,0x8b,0xc8,0x75,0x12,0xad,0x7b,0xfb,0xca,0x24,0xa6,0x86,0x7,0xb0, + 0x30,0x3e,0x88,0x5f,0xde,0x5e,0xc1,0xd7,0xcf,0xb6,0xbd,0x67,0xc2,0xcf,0x6f,0xa4, + 0xa8,0x6e,0x45,0xf0,0xad,0x44,0x5f,0x67,0xad,0xc9,0x2,0xb7,0x7f,0x31,0x34,0x82, + 0x80,0x6c,0xd8,0x34,0xab,0xc0,0x21,0x5d,0xc2,0x23,0x8c,0xad,0x64,0x40,0x3e,0xdf, + 0xcc,0x50,0xa,0x8,0x2,0x4d,0x64,0x93,0xa2,0x2d,0x19,0x4b,0xea,0xc3,0xfe,0x16, + 0xc1,0x54,0x12,0x6e,0x11,0xeb,0xb3,0x18,0xc,0x41,0x89,0x42,0xc,0x62,0xef,0x98, + 0x41,0x2c,0xea,0xd9,0xd1,0xf1,0x11,0x77,0x24,0xf1,0xbf,0x98,0x37,0xa1,0xbb,0x94, + 0x40,0xbb,0xb7,0xf4,0x7e,0x1e,0x8e,0x20,0xff,0x14,0xb5,0x84,0x95,0x88,0x49,0x4c, + 0x6,0x15,0x97,0x44,0x79,0xc8,0x11,0x6b,0x73,0x37,0x38,0x28,0xc3,0x41,0xae,0xca, + 0x39,0xb5,0x85,0xf0,0x3a,0xc1,0xe8,0xcd,0xed,0xdf,0x28,0x21,0x5b,0xb,0xc9,0x6f, + 0xac,0xed,0x5e,0x5,0x93,0x9d,0x34,0xf2,0x46,0x70,0x43,0x1d,0x81,0x40,0xf9,0x74, + 0x9a,0xae,0xcf,0x8f,0xd2,0xbb,0x37,0x66,0xe9,0xbb,0x57,0x66,0x68,0x7a,0xe4,0xc5, + 0x8c,0xf1,0xed,0xc3,0x26,0xee,0x2e,0x6d,0xe3,0xe3,0x7,0xeb,0xf8,0xf8,0xe1,0x6, + 0x1e,0xae,0xec,0xb,0x13,0x1,0x1,0x6a,0xf4,0x31,0xd1,0xa7,0xe4,0xd9,0xac,0xcf, + 0x7b,0x49,0xb1,0x36,0xa,0xd5,0x52,0x1e,0x67,0x27,0xab,0x98,0x1e,0x1e,0x30,0x72, + 0x96,0x44,0x28,0xac,0xd5,0xe9,0xe1,0xf3,0xc7,0x9b,0xb8,0xf3,0x7c,0xf,0x1,0xf7, + 0xb1,0xf7,0x8d,0x1e,0xa8,0xfa,0x61,0x98,0x19,0x2d,0xe3,0xf,0x6f,0xce,0xe1,0xdd, + 0x1b,0xb3,0x9e,0x71,0x48,0x92,0xcd,0x28,0x11,0xe1,0xa8,0xd9,0xc6,0x9d,0xc5,0x1d, + 0xfc,0xfc,0x8b,0x45,0x7c,0x78,0x77,0x15,0x3b,0xf5,0x53,0xd4,0x4f,0x5a,0xc8,0x64, + 0x52,0xb6,0xc3,0x8f,0x1d,0x30,0xc,0x34,0x3b,0x5d,0x99,0xe9,0x4b,0x1e,0x45,0xd6, + 0x36,0xf3,0x64,0xdf,0x71,0x46,0x24,0x81,0x7d,0x28,0x4d,0xde,0x85,0x9e,0xfa,0x2c, + 0x69,0xdd,0x33,0xf6,0x26,0x26,0x21,0x11,0x21,0x44,0x27,0x62,0x8a,0xe3,0x81,0xb1, + 0x70,0x5,0xef,0xdf,0xf9,0xd1,0x80,0xc2,0xff,0xdc,0x3d,0x31,0x82,0x70,0x1a,0x59, + 0x2,0x43,0x90,0x5,0x90,0x98,0xc0,0x0,0xa0,0x94,0x4f,0xe3,0xda,0x99,0x61,0xbc, + 0x73,0x75,0x1a,0x17,0xa7,0x87,0x50,0xca,0x67,0x5e,0x68,0x30,0x13,0x9d,0x98,0x36, + 0xf6,0x4e,0x70,0x6b,0x71,0x1b,0xf7,0x96,0x77,0x71,0x72,0xda,0x8b,0x4c,0x31,0xee, + 0x59,0x65,0x24,0x70,0x2f,0xe2,0xb,0x20,0x0,0xc0,0x60,0x21,0x8b,0xb9,0xf1,0xa, + 0x2a,0xa5,0xdc,0x37,0x3a,0xd9,0x6d,0x1e,0x34,0xb0,0xba,0x7b,0x82,0x46,0xbb,0x6b, + 0xf9,0x2,0x2c,0xe6,0x50,0x86,0xb1,0x7e,0x63,0xcf,0x4b,0x85,0x85,0x1f,0xad,0xa1, + 0xe9,0x81,0x48,0x70,0xc0,0x58,0xf4,0xc3,0xca,0x81,0xb3,0xca,0xbd,0xdc,0xf9,0x4c, + 0x1a,0xe3,0x95,0x22,0xa6,0x46,0xcb,0x74,0x76,0x7c,0x10,0x97,0x66,0x86,0xf1,0xca, + 0xdc,0x8,0xcd,0x8d,0xd,0x22,0x15,0xc9,0x7,0xf,0xb4,0xdd,0xb7,0xf4,0x26,0x8f, + 0x22,0x4f,0x2b,0xbb,0x27,0xb8,0xbb,0xb4,0xcd,0xbf,0xbb,0xbb,0xc6,0x9f,0x3e,0xda, + 0xc4,0xd6,0x41,0x83,0x59,0x48,0xc7,0xd9,0xcc,0x89,0x3a,0xa3,0x4b,0xa0,0xef,0x1e, + 0x5c,0x2c,0x9b,0xf,0xe7,0x80,0x10,0xd9,0x35,0x7b,0xb1,0x30,0xd6,0x69,0x26,0xec, + 0x45,0xd9,0x28,0xfe,0x9c,0x4,0x8c,0x8,0x98,0x19,0x2d,0x63,0x61,0xbc,0x82,0x74, + 0x8a,0x12,0xbd,0x30,0x4c,0xf3,0xba,0x79,0xd0,0xc0,0xe3,0xf5,0x43,0xac,0xef,0x9d, + 0x44,0xfb,0xdd,0xf0,0x8e,0xc,0x80,0x9d,0xe3,0x53,0x7c,0xfe,0x64,0x13,0xcd,0x76, + 0x7,0xad,0x4e,0x80,0x57,0xcf,0x8e,0x62,0x7e,0xac,0x82,0x41,0xb1,0x5b,0x4f,0x32, + 0xd4,0x31,0xd7,0x30,0x97,0x49,0xe3,0xe2,0x74,0xd,0x44,0x40,0x26,0x9d,0x42,0x3e, + 0x9b,0xa2,0x7b,0xcb,0x7b,0xdc,0x38,0xed,0x44,0xf8,0x5a,0x62,0xcd,0xe4,0xbc,0xfb, + 0xe1,0xac,0x5a,0x92,0x90,0x4e,0x45,0xda,0x54,0xc6,0xec,0x62,0x74,0x13,0x14,0x18, + 0xc3,0x9,0x1d,0xb1,0xab,0x99,0x33,0xa1,0x8f,0xbb,0xe7,0xb0,0x86,0x88,0xd0,0x25, + 0xbc,0x85,0x1c,0x1f,0xdf,0xa0,0x84,0xc,0x99,0xde,0x24,0x80,0x9f,0xa8,0x8f,0x80, + 0x58,0x21,0xc5,0xb2,0x4e,0xc4,0x4a,0x2d,0xb6,0xf3,0x8e,0xef,0xdc,0xbc,0xf3,0xc1, + 0x47,0x31,0x10,0xcd,0x10,0xf7,0xd8,0x42,0xe6,0xba,0xa5,0x65,0xc,0xa6,0xcf,0xae, + 0x76,0x5f,0x47,0xb9,0x73,0x3e,0x2,0xcd,0xb3,0x23,0x3a,0xc0,0x35,0xcb,0x11,0x79, + 0xbc,0x90,0x5,0x9b,0x43,0x4c,0x39,0x5e,0x3c,0xd9,0xec,0x5f,0xc7,0x6a,0x87,0x12, + 0x77,0xa5,0x2c,0xde,0x7a,0x7a,0x27,0xa5,0x98,0x44,0xfe,0xb9,0x99,0xd6,0xc3,0x96, + 0xce,0x9c,0xea,0xb6,0xb,0x30,0x31,0x3a,0xb6,0x77,0x31,0xf8,0x3d,0x29,0x9c,0x9d, + 0x1a,0xa2,0xff,0xfe,0x87,0x57,0xe9,0x5b,0x17,0xa7,0x68,0xb0,0x98,0x8d,0xed,0xc8, + 0xcd,0xfb,0xbd,0x5e,0x80,0xe3,0x66,0x1b,0x1f,0x3f,0x58,0xc3,0x5f,0xbf,0x77,0x1f, + 0x4f,0xd6,0xf6,0xd1,0x68,0x77,0xdd,0x5,0x66,0xf6,0x60,0x19,0x2f,0x9d,0x3b,0xa9, + 0x2e,0x27,0x30,0xfe,0xfd,0xf3,0x3c,0xaa,0x27,0xa,0xbf,0x4e,0x21,0x9b,0xc6,0xcc, + 0xc8,0x20,0xc6,0x6b,0xc5,0x17,0xc6,0x1a,0x12,0x11,0x8e,0x4f,0xdb,0xb8,0xbf,0xb2, + 0x8f,0xb5,0xbd,0xe3,0x17,0xc7,0x39,0x45,0x3a,0xc9,0x89,0xda,0x0,0xde,0xb8,0x30, + 0x89,0x3f,0xfb,0xd6,0x39,0x2c,0x4c,0x56,0x13,0xbb,0xf1,0x28,0xab,0xfd,0xce,0xe2, + 0xe,0xfe,0xc3,0x2f,0xee,0xe0,0xde,0xd2,0x1e,0xea,0x8d,0x16,0x88,0x14,0xaa,0x3, + 0x79,0xd4,0x6,0x5e,0x34,0x55,0x32,0x3a,0xbd,0x20,0xa2,0xa3,0x72,0xe4,0x28,0xab, + 0xb0,0xb4,0x1e,0xd0,0x1,0x87,0xe1,0x2c,0x12,0x5b,0x97,0x4e,0x46,0xa2,0x13,0x88, + 0xc0,0xeb,0x24,0x98,0x51,0x5a,0x9a,0x45,0x92,0xd5,0xc1,0x22,0x68,0xd6,0x8f,0x30, + 0x14,0x7a,0x60,0x8f,0xa1,0x23,0xac,0x6a,0x29,0xa1,0x5f,0x8e,0xb2,0x58,0x38,0x1a, + 0x19,0xa3,0x77,0xf4,0x5a,0xba,0xc9,0xec,0x20,0x70,0x26,0x20,0x45,0xc0,0xf5,0xb9, + 0x51,0xfc,0xf,0x3f,0xba,0x8a,0x6b,0x67,0x46,0x2c,0xbb,0xfd,0x9b,0xcc,0x7a,0x2c, + 0xd4,0x7e,0xd0,0xc0,0x7b,0x5f,0xaf,0xe0,0xf3,0x27,0x5b,0x38,0x68,0xb4,0xb5,0xe9, + 0x13,0xc1,0xeb,0x1f,0x8c,0x8e,0x99,0xbe,0x69,0x21,0xe0,0xb6,0x3f,0x13,0x43,0x3, + 0xb8,0x7a,0x66,0x18,0xc5,0x84,0xcc,0x2,0xf9,0xb6,0xb9,0x7f,0x82,0xfb,0x2b,0xfb, + 0xa1,0xc2,0x83,0x84,0x26,0x97,0x92,0x49,0xea,0x14,0x6d,0x30,0x3d,0x2e,0xad,0x37, + 0xa5,0xb3,0xb4,0xf4,0x75,0x72,0x41,0x77,0x48,0x65,0x52,0x84,0xf3,0x93,0x55,0xfa, + 0xf6,0xa5,0x49,0xfc,0xe1,0x2b,0xb3,0xb4,0x30,0x51,0xc5,0x60,0xc4,0xb2,0xb5,0x5f, + 0x6c,0x68,0x94,0xf0,0xc5,0xcc,0xd8,0x3e,0x6c,0xe2,0x1f,0x3f,0x7b,0xca,0xbf,0xfa, + 0x6a,0x85,0x1f,0xae,0xed,0x73,0xb7,0x17,0x88,0x61,0x8a,0xd8,0x13,0x3d,0x18,0xe5, + 0x4,0x4b,0x97,0x21,0x30,0x47,0x93,0xe7,0xc9,0x3,0x6e,0x5c,0x68,0x9a,0xb4,0x22, + 0x86,0xcb,0x66,0x86,0x48,0x72,0x66,0x4f,0xbb,0xc4,0x48,0x29,0x85,0x99,0xd1,0x4a, + 0xd8,0xac,0xa8,0xfe,0xc8,0x4d,0xc0,0x1,0xee,0x2f,0xef,0xe2,0xee,0xd2,0x5e,0x28, + 0x55,0xf0,0xc4,0xc8,0x10,0x79,0x1f,0x84,0x93,0x56,0xf,0x9f,0x3d,0xde,0xc6,0xdd, + 0x95,0x7d,0x7c,0xff,0xfa,0xc,0xfe,0xf2,0xdb,0xe7,0x70,0x75,0x76,0xc8,0xcb,0x4a, + 0x8f,0x72,0x67,0xa2,0x67,0xc4,0x85,0xa9,0x1a,0x86,0x6,0xa,0x38,0x33,0x36,0x88, + 0xff,0xf3,0xbd,0x7,0xf4,0xc9,0x83,0x75,0xb6,0x83,0xa3,0xd6,0xf5,0x18,0x9e,0xb, + 0x43,0xe,0x87,0x24,0xc8,0xc3,0x81,0xf3,0x1e,0x20,0x3,0x92,0xdb,0x27,0x8c,0xb4, + 0x23,0x8d,0x51,0xc9,0x84,0xc5,0x84,0xa3,0xc4,0x74,0x6d,0xdc,0x4e,0x96,0xab,0xc8, + 0xbe,0x5b,0xba,0xa1,0xc8,0x4b,0xad,0x9c,0xf2,0x92,0x6e,0x63,0xbe,0x2f,0x2a,0xbe, + 0x2e,0x23,0x44,0x86,0xda,0x24,0x77,0x55,0x69,0xbb,0x1a,0x8b,0x40,0x8f,0xa4,0x95, + 0x7a,0x19,0x58,0x52,0xed,0xc3,0x96,0xf3,0xe4,0xf,0x12,0x14,0x16,0x74,0xdb,0xa9, + 0x53,0x4,0xbf,0xa7,0x8,0x51,0x5f,0xf9,0x58,0x32,0x1b,0x4,0xdc,0xe0,0x24,0x9e, + 0x87,0x32,0xcb,0xa1,0x83,0x1c,0xe4,0x1,0x9f,0x54,0xa0,0x77,0xb6,0x24,0x75,0x52, + 0x21,0xcb,0xd8,0xd2,0xd7,0x6c,0x2e,0xb9,0x2,0xe9,0xd0,0x15,0x83,0xc3,0x3b,0x8d, + 0x45,0x58,0xd3,0x95,0xf6,0x93,0x53,0x26,0x4a,0x55,0x8c,0x55,0xb2,0xfd,0xa5,0x74, + 0x8a,0xf0,0xee,0xcd,0x33,0xea,0x27,0xaf,0xcd,0xd1,0xab,0x67,0x27,0x68,0xb0,0x98, + 0xf5,0xf6,0xc3,0xbe,0x49,0x4c,0x7,0x4f,0x37,0xeb,0xf8,0xc7,0xcf,0x9e,0xe1,0x93, + 0x87,0x1b,0x78,0xba,0x7e,0x80,0x46,0xbb,0x17,0x4f,0xac,0xf1,0xe,0x6c,0x8a,0xf, + 0xda,0x56,0x6a,0x6d,0x48,0x57,0x52,0x2e,0x24,0x1a,0x25,0x92,0xcd,0x8f,0xf,0x85, + 0x4c,0xd4,0x4a,0xb8,0x30,0x5d,0x43,0x31,0x9b,0x4e,0x24,0xbf,0x98,0x7,0xea,0xa8, + 0xd1,0xc6,0xb3,0x8d,0x43,0xec,0x1f,0x9d,0x46,0xa6,0xce,0x84,0xac,0x5d,0x71,0xf3, + 0x95,0x72,0x19,0xbc,0xfb,0xca,0x2c,0xfe,0xfc,0xad,0x73,0x98,0x1a,0x2e,0x25,0x22, + 0x15,0xf2,0x7b,0x1d,0x1e,0xb7,0xf0,0x5f,0xbe,0x78,0x86,0xf7,0xef,0xac,0xe2,0xfe, + 0xf2,0x1e,0xea,0xcd,0x36,0x8c,0xc7,0x0,0x29,0x65,0xf,0x98,0x7e,0x91,0x8c,0x64, + 0x21,0xd6,0x8,0x4a,0xc5,0x7e,0x92,0x85,0xf6,0x72,0xb7,0x4d,0x99,0xee,0x1c,0xc3, + 0x23,0x54,0x85,0xa9,0x29,0x6,0x77,0xe3,0xc8,0xfe,0x1a,0x62,0xa8,0xb3,0xbb,0x1e, + 0x86,0x49,0xce,0xa4,0x8,0x73,0xdd,0xde,0xa5,0x2a,0x4a,0x47,0xa5,0x58,0x5a,0xb5, + 0xb0,0x2a,0x71,0xd3,0xa6,0xd7,0xd0,0x89,0xa0,0x18,0x44,0xa1,0x7e,0xc1,0x91,0xd0, + 0xe,0xc4,0xa1,0x94,0x6a,0x30,0x8f,0x1f,0xdd,0x3c,0x83,0x77,0xae,0x4e,0xe3,0xda, + 0xdc,0x8,0xaa,0xa5,0x9c,0x37,0x4d,0x46,0x8b,0x50,0x14,0x1e,0xde,0xad,0x37,0xf1, + 0xc9,0xa3,0xd,0xfc,0xec,0xd3,0x45,0x3c,0x5c,0xd9,0x83,0xcf,0xf1,0x8e,0xae,0x82, + 0xa2,0xeb,0xeb,0x38,0x7e,0x14,0x5a,0x60,0xb2,0x26,0x5e,0x15,0x70,0x69,0x66,0x8, + 0x3,0x85,0x8c,0x77,0x1f,0x44,0x7f,0xae,0xf5,0xfd,0x63,0x7c,0xf5,0x6c,0xb,0x87, + 0x8d,0x96,0xd3,0x23,0x47,0xd6,0x51,0xf6,0x5e,0xc,0x8d,0x21,0x21,0x47,0x11,0x52, + 0xc2,0xaf,0xda,0x41,0x35,0x9a,0x39,0x6b,0xe5,0xd9,0xcc,0x96,0x14,0x43,0x38,0x37, + 0x55,0xa1,0x4b,0x33,0x35,0x5c,0x9c,0xac,0x61,0x76,0xb4,0x4c,0x33,0xa3,0x65,0x4c, + 0xd,0xd,0x78,0xcd,0x50,0x3f,0xc2,0x58,0xbf,0xa6,0xe4,0xf3,0x27,0x9b,0xfc,0xe1, + 0xbd,0x75,0xbe,0xb7,0xba,0x87,0x95,0xed,0xe3,0x30,0xc7,0xdb,0x12,0xa4,0x4c,0x66, + 0x53,0xc0,0x96,0xb8,0x15,0x28,0xe3,0x48,0x6a,0xac,0x50,0xd8,0x37,0x22,0x12,0xc2, + 0x6b,0xc4,0x7c,0x1,0xc8,0xd9,0xbc,0xba,0xf2,0xc6,0x3a,0x56,0x32,0xc9,0x5e,0x1, + 0x44,0x9c,0xcb,0x66,0x68,0x6a,0xa8,0x84,0x19,0x81,0x2e,0x26,0x11,0x79,0x53,0x4a, + 0xe1,0xf1,0xc6,0x21,0x6e,0x3f,0xdf,0x41,0xa7,0xd3,0x13,0xa4,0x50,0xb6,0x5c,0xf1, + 0x28,0x32,0xdb,0x68,0x75,0xf1,0xfb,0xfb,0x1b,0x38,0x38,0x6e,0xd1,0xeb,0xe7,0xc6, + 0xf0,0xc6,0xf9,0x31,0xbc,0x7e,0x6e,0x3c,0x71,0x4a,0x4f,0x8a,0x5e,0x1d,0x1e,0xcc, + 0xe3,0xc6,0xfc,0x28,0x3a,0xbd,0x0,0x63,0xd5,0x2,0xfd,0xea,0xab,0x65,0x6e,0xb4, + 0xba,0x9e,0xe6,0xda,0xbd,0xf4,0x4a,0xd0,0xa5,0xad,0x76,0xc4,0x75,0xf9,0x46,0x63, + 0xcb,0x76,0x57,0xa2,0x57,0xb4,0x4c,0x8,0x98,0x8,0xca,0x8e,0x98,0x8,0x33,0x1f, + 0x42,0x16,0x43,0xc0,0x4c,0x1e,0xd,0x51,0xff,0x8d,0x81,0xe9,0x3,0x8a,0x51,0xe9, + 0xfc,0xfb,0xdf,0xeb,0xdd,0x45,0x2e,0x9,0xbb,0x35,0xbb,0x2c,0xd4,0xe4,0xd3,0xd6, + 0x48,0xac,0xf0,0xac,0x64,0x8d,0x11,0x9f,0xc0,0xe5,0xeb,0x6a,0x55,0x20,0xca,0x1f, + 0xf2,0xe4,0xb1,0xa1,0xa4,0xec,0x4f,0x43,0xee,0x24,0x86,0x9c,0xa8,0xc5,0xac,0x81, + 0xdf,0x5d,0x8f,0x23,0xa5,0x6c,0x82,0xf9,0xaa,0x84,0x10,0xce,0x5e,0x8,0xe5,0x82, + 0x35,0x84,0x25,0x5e,0x38,0x65,0x8b,0x63,0x51,0x59,0x7b,0x34,0x92,0x3c,0x77,0x39, + 0xa9,0xeb,0x7f,0x23,0xd2,0xd4,0x48,0xec,0xd2,0x25,0x4,0xef,0xc8,0x73,0x8e,0x19, + 0xaf,0x8f,0x5d,0x72,0xb1,0xa8,0xe5,0x42,0x96,0x2e,0xcc,0xd4,0xe8,0xa7,0x6f,0x2c, + 0xd0,0xf,0x6f,0x9c,0xb1,0xce,0x6f,0x49,0x85,0xab,0x71,0xda,0xc1,0xa3,0xb5,0x7d, + 0x7c,0x78,0x6f,0xd,0x7f,0xf7,0xc9,0x33,0x6c,0x1f,0x36,0xe1,0x59,0xda,0x79,0x19, + 0x88,0x7a,0x79,0xa6,0x84,0x56,0x34,0x7a,0x9d,0x8c,0x26,0xd1,0x9b,0xe2,0x15,0x4c, + 0xb8,0x8f,0x70,0xd4,0xd1,0x15,0x47,0xb0,0x77,0x89,0x30,0x5e,0x2b,0x61,0x7e,0xbc, + 0x82,0x5c,0xb6,0xff,0x84,0xc4,0xcc,0xd8,0x3c,0x38,0xc1,0x93,0xcd,0x3,0x34,0xbb, + 0x3d,0x2f,0xf1,0x5a,0xf2,0xec,0xa2,0x2c,0xcb,0xc1,0x52,0x16,0xd7,0xe7,0x46,0xf0, + 0xee,0x2b,0xb3,0xb8,0x3e,0x37,0xf2,0x42,0x9b,0xcb,0x20,0x8,0xb0,0x7b,0x74,0x8a, + 0x5b,0x8b,0xdb,0xf8,0xbb,0x8f,0x9f,0xe1,0xd6,0xe2,0xb6,0x67,0xb,0x6c,0xa9,0x5d, + 0xfc,0x4d,0x7e,0xe4,0x86,0xa6,0xec,0xec,0x73,0xb4,0x35,0x13,0xec,0xc0,0x62,0xd8, + 0x15,0x6c,0x12,0x13,0xbd,0x69,0x3b,0xbc,0xc5,0x52,0x7a,0xd,0x20,0x26,0xd,0xc1, + 0x43,0xd1,0x29,0x9c,0x51,0xed,0x88,0x75,0x37,0x24,0xf2,0x59,0x4a,0x1e,0x4b,0xdd, + 0xa3,0x5e,0x27,0xb2,0x42,0x3c,0x39,0x94,0x73,0x7b,0x92,0x76,0xca,0x62,0x19,0x1a, + 0xa5,0x74,0x9b,0x7,0xbf,0x90,0x4d,0x61,0xa2,0x56,0xc2,0x2b,0xf3,0x23,0xf8,0xf3, + 0xb7,0xce,0xe1,0xda,0xdc,0x88,0xd7,0xc,0xf5,0x2b,0xe4,0xf2,0x30,0xad,0x9f,0xb4, + 0xf0,0xf9,0xd3,0x2d,0xbc,0x7f,0x67,0x15,0xb7,0x16,0x77,0x90,0x64,0x8d,0x47,0xae, + 0x72,0x33,0x13,0x49,0x53,0x4e,0x48,0x3b,0x66,0xfb,0x3c,0xc0,0xc9,0x26,0xc7,0xaa, + 0x25,0x9c,0x9d,0xa8,0xa0,0x98,0x4b,0xf7,0x8d,0xd2,0xc,0x95,0x15,0xd,0xdc,0x5e, + 0xda,0xc5,0x51,0xb3,0x1b,0x93,0xe3,0x48,0x7b,0x59,0x7b,0xf5,0x14,0x49,0x9b,0x6a, + 0xf6,0xd6,0x43,0xd2,0xbd,0x12,0x6e,0xf1,0x98,0xc9,0x2a,0x2a,0x64,0xd2,0x28,0xe4, + 0x32,0x98,0x1e,0x2e,0xe1,0xb5,0x73,0xa3,0xf8,0xd6,0xf9,0x49,0xba,0x76,0x66,0xc8, + 0x1a,0xf0,0xf4,0x6b,0x38,0x92,0x9a,0x4c,0xd6,0xaa,0xe5,0x66,0xbb,0x83,0xf5,0xfd, + 0x13,0xdc,0x59,0xdc,0xe5,0x9f,0x7f,0xf5,0x9c,0x3f,0xb8,0xbb,0xa6,0x35,0x10,0xb6, + 0x5e,0xb0,0xce,0x7,0xb1,0xc6,0x26,0xa1,0x91,0x48,0x18,0xbb,0x69,0xa7,0x72,0x10, + 0x14,0x2,0x17,0xe6,0x21,0x3c,0xdc,0x49,0xbc,0x26,0x1c,0x65,0xa,0x1b,0xc7,0x42, + 0x7b,0x6e,0x93,0x33,0x4d,0x8c,0x30,0x3b,0x89,0x8,0x23,0xd5,0x2,0x46,0x6,0xb, + 0x31,0x62,0x5f,0xb4,0x89,0xa9,0x9f,0xb4,0xb0,0xb8,0x55,0xc7,0xf3,0xed,0xe3,0xf0, + 0x65,0x15,0x26,0x2a,0x49,0x4e,0xf1,0x7a,0x53,0x85,0xfd,0x46,0xb,0xbf,0x7f,0xb8, + 0xc1,0x9b,0x7,0xd,0x3a,0x6c,0xb4,0x91,0x52,0xa,0xf3,0x63,0x83,0x28,0xe5,0xd2, + 0xd6,0x68,0x4b,0xee,0xe8,0xa3,0xe4,0xb9,0xda,0x40,0xe,0xdf,0xbb,0x32,0x85,0x72, + 0x21,0x8b,0x83,0xe3,0x16,0xee,0x2c,0xed,0xa1,0xde,0x68,0x4b,0x18,0xc6,0x99,0x3a, + 0x28,0x68,0x44,0xdd,0xf0,0x61,0x8c,0xd5,0xa9,0x4e,0x42,0x64,0x43,0xf6,0x67,0x93, + 0xa5,0x68,0x2c,0x3c,0x2c,0x65,0x2d,0xac,0xe4,0xca,0xb8,0xc0,0x6b,0x5c,0x57,0xd7, + 0x23,0xcf,0x1,0xce,0x20,0x80,0xac,0xbf,0x3b,0xc7,0xf6,0xd9,0xec,0xf7,0xe6,0xa2, + 0x6e,0x9,0xf9,0x25,0x25,0x8d,0xed,0xec,0x79,0x4d,0x38,0x54,0x9b,0x84,0xe2,0x45, + 0x9,0xbc,0x9e,0x23,0xcf,0x7,0xc5,0xa6,0x2f,0xa2,0x88,0x4c,0x8a,0xe3,0x24,0xdf, + 0x74,0xd4,0x68,0x89,0x15,0xbc,0xe0,0x9,0xfb,0xd8,0x9,0xeb,0x67,0xbb,0xd1,0x91, + 0x7,0x98,0x80,0xed,0x59,0xc0,0x4,0x51,0x4e,0x80,0x99,0xcc,0x49,0x60,0x47,0xb6, + 0xbc,0x9b,0xf9,0xda,0xaa,0xb5,0x94,0xe6,0xa9,0x1b,0x80,0x1c,0x12,0x62,0x77,0x45, + 0x5a,0xe9,0xec,0x73,0x17,0x9f,0x4a,0x36,0xe7,0xdc,0xd0,0x3d,0x84,0x99,0xe7,0xcd, + 0xf3,0x63,0xf4,0xbf,0xfc,0xe4,0x3a,0x9d,0x9b,0xac,0x51,0x3a,0x9d,0xea,0xb,0x5b, + 0x1e,0x37,0xdb,0xb8,0xb3,0xb4,0x8b,0xbf,0xf9,0xe8,0x31,0x7e,0x7b,0x77,0xd,0x47, + 0x8d,0xb6,0x25,0x8f,0x40,0xb4,0x6b,0x96,0x58,0x4d,0x62,0xa7,0x41,0xf0,0xad,0x35, + 0x4d,0xd3,0xe3,0x64,0x4f,0x8e,0xd9,0x41,0x88,0xeb,0xfa,0xd,0x1a,0x62,0x47,0xd2, + 0xf0,0xc5,0x1c,0x1e,0x2c,0x60,0x76,0x64,0x0,0x99,0xc8,0x1e,0x30,0xfa,0xb6,0x5d, + 0x3f,0xc5,0xd2,0xd6,0x11,0x5a,0x9d,0x9e,0xcd,0xb5,0x91,0xf4,0x5a,0xdf,0xaf,0x3d, + 0x5c,0xc9,0x5d,0x9e,0x19,0xc6,0xff,0xf4,0xe3,0x6b,0xb8,0x3c,0x33,0x9c,0x58,0x30, + 0x64,0xe1,0x68,0xb4,0x7a,0xf8,0xd9,0xa7,0xcf,0xf0,0xb7,0x1f,0x3f,0xc3,0xca,0x4e, + 0x3d,0xa1,0xf8,0x19,0x61,0x28,0x7b,0x93,0x65,0x62,0x3d,0x57,0xae,0x61,0x61,0xf8, + 0x6b,0x69,0x8,0xbf,0x29,0xf6,0x43,0x83,0xdd,0xe0,0xb,0x61,0xba,0xcc,0x1c,0x93, + 0x7b,0x98,0xde,0x40,0x66,0x6,0xc1,0xda,0x7e,0x8a,0xf8,0xae,0x98,0xd8,0x3c,0xd2, + 0xb3,0x7b,0xf,0xa8,0x6f,0xc8,0x24,0xc4,0xed,0x24,0xfd,0xac,0x29,0x42,0x65,0xa6, + 0x3e,0x1c,0x89,0x7c,0x36,0x8d,0xd7,0xcf,0x8d,0xe1,0x87,0x37,0xcf,0xe0,0x3b,0x97, + 0x26,0x30,0x32,0x58,0x78,0x69,0x1f,0x6e,0x67,0xb1,0xda,0xc6,0xad,0xe7,0xbb,0xf8, + 0x8f,0x1f,0x3e,0xc1,0x67,0x8f,0x37,0x19,0x91,0xe7,0x94,0x24,0xc9,0xc3,0x99,0x67, + 0x70,0xd4,0x42,0xce,0x47,0xd2,0x24,0xe9,0x87,0x31,0x52,0x29,0x60,0x6e,0x74,0x30, + 0xc6,0x8b,0xf0,0x8b,0x27,0x63,0x65,0xf7,0x8,0x8f,0x56,0xf,0xf5,0x4a,0xa5,0x1f, + 0x1f,0x84,0x7c,0x77,0x3d,0xd2,0xa6,0x9b,0xc2,0xfe,0x4f,0xc6,0x6d,0xca,0x9,0x97, + 0x40,0x98,0x1f,0xab,0xe0,0xf5,0x73,0x63,0x78,0xf3,0xfc,0x18,0x9d,0x9d,0xa8,0xa2, + 0x5c,0xc8,0xa2,0x94,0x4b,0x23,0x9f,0x4d,0x7b,0x4d,0xe4,0x8b,0xae,0x63,0xf4,0xe3, + 0xcd,0x76,0x7,0xbf,0xbe,0xbd,0xc2,0x1f,0xdc,0x5b,0xe3,0xaf,0x9e,0xed,0x60,0xe7, + 0xb0,0xc1,0x6c,0xd3,0x93,0x8d,0x37,0x81,0x2d,0xae,0x76,0xcc,0x13,0x5e,0x70,0x66, + 0x8b,0x61,0x16,0x96,0xc6,0xa1,0xdc,0xd2,0x0,0x3c,0xa2,0xa6,0x15,0x72,0x58,0x6b, + 0x29,0x93,0x28,0x67,0x97,0xaa,0xe1,0x8f,0x2f,0x27,0x35,0xb7,0xb9,0x1f,0x2a,0xe7, + 0xe9,0xe2,0x64,0xcd,0xdb,0x6f,0x27,0xbd,0x2e,0xcd,0x76,0x17,0x8b,0xdb,0x75,0x6c, + 0xed,0x37,0xd,0x2a,0x62,0x29,0xf8,0xd1,0x15,0xa9,0xbb,0x36,0xbe,0x9f,0xc8,0xf2, + 0xce,0x31,0xff,0xe7,0xcf,0x17,0x71,0xe7,0xf9,0x2e,0x7e,0x74,0x73,0x96,0x7e,0xfa, + 0xfa,0x9c,0xd7,0x48,0x44,0x51,0x1,0xf9,0x56,0xc8,0x65,0x70,0xed,0xcc,0x30,0xfe, + 0xd7,0x3f,0xb9,0x41,0xff,0xf0,0xe9,0x22,0xff,0xa7,0x8f,0x9e,0xa0,0xd9,0xe9,0xb9, + 0x25,0xb4,0xfd,0xe6,0x21,0xc2,0x21,0x21,0x6c,0xe,0x34,0x5e,0xa6,0x39,0xdb,0xa2, + 0xf1,0x93,0x72,0x6f,0x72,0x91,0x30,0x76,0xca,0xd7,0x4f,0x61,0x4a,0xe6,0x8c,0x7a, + 0xe9,0x2a,0x60,0x62,0x65,0x88,0x76,0x22,0xef,0x31,0xbc,0xdd,0x89,0x59,0x88,0x66, + 0x4c,0xe6,0x23,0xc1,0x33,0x79,0xf7,0x14,0x21,0x2e,0x50,0x54,0x9,0x35,0x7,0xc7, + 0x39,0x4b,0x4c,0x82,0xdc,0xe7,0x88,0xc8,0xde,0x75,0x24,0x3f,0x97,0xd5,0x23,0xc9, + 0x11,0x83,0xa3,0x1e,0xd6,0xc,0xa4,0xa1,0x28,0x12,0xf7,0x26,0xe8,0x77,0xe4,0x3f, + 0x54,0x9e,0xce,0x42,0x79,0x78,0xba,0xc7,0xc,0x96,0x9f,0x6f,0x8b,0xb3,0x27,0x51, + 0xb3,0x7,0x39,0x59,0x2c,0x5e,0x1e,0xa8,0xfa,0xe3,0xa4,0xdc,0x44,0xee,0x4f,0xe5, + 0x32,0x42,0xd5,0x8d,0xe4,0xb0,0x30,0xbb,0xd1,0x31,0x39,0x27,0x19,0x6,0x21,0x93, + 0x22,0xbc,0x7e,0x6e,0x5c,0xfd,0xf8,0xe6,0x1c,0x5d,0x9f,0x1b,0xa1,0x6c,0x26,0xdd, + 0x97,0x21,0x6c,0xa6,0xcf,0x5f,0xdf,0x5a,0xc6,0x27,0xf,0x37,0x71,0x64,0xf6,0x90, + 0xba,0x9b,0x32,0xdb,0xe,0xd6,0x1e,0xc5,0x96,0xfb,0x4f,0xec,0xfb,0x54,0x4b,0x2b, + 0x50,0x99,0x6c,0x17,0xe1,0x7a,0x32,0x92,0xfc,0x4b,0x84,0xc2,0x5f,0xff,0xfa,0x83, + 0xc5,0x1c,0x46,0x2a,0x45,0x64,0xd2,0xc9,0x6,0x37,0xe6,0x63,0x7b,0x47,0xa7,0x58, + 0xdd,0x3b,0x41,0x5b,0x48,0xd5,0xe4,0x1a,0xc0,0x13,0x2a,0x29,0xc2,0xcd,0xf9,0x61, + 0xfc,0xe0,0x46,0x38,0x99,0xcb,0x4c,0xf7,0xa4,0xa2,0xbe,0xb2,0x7b,0x8c,0x8f,0xee, + 0xaf,0xe1,0x57,0xb7,0x57,0xf0,0x78,0xfd,0x20,0xe1,0x28,0x70,0x3b,0x5a,0x49,0xa0, + 0xeb,0xbb,0xf7,0x85,0x2f,0x31,0xa,0x7b,0x6a,0x66,0x6f,0x73,0x25,0x14,0x76,0x7e, + 0xaa,0x34,0x3b,0x82,0x36,0x8b,0x3d,0x31,0xc7,0x95,0x69,0xf6,0xb1,0x54,0x4c,0x5e, + 0x2b,0x64,0x98,0x1c,0x64,0x4b,0x9c,0xc7,0xb7,0x88,0xb5,0x4d,0x9e,0xac,0x4d,0x90, + 0x77,0x98,0xbc,0xe9,0x93,0x45,0xc7,0x2e,0x7f,0x11,0xf9,0xa,0x67,0xd2,0xa,0x67, + 0x46,0x6,0x71,0x7d,0x6e,0x8,0xdf,0xba,0x30,0x8e,0xd7,0xcf,0x8d,0x63,0x72,0xc8, + 0x5f,0x75,0xc4,0xa7,0x48,0x8e,0xc9,0xa9,0xb6,0xf,0x9b,0xf8,0xfc,0xc9,0x26,0xde, + 0xbb,0xb3,0x8a,0x3b,0x8b,0x3b,0x1c,0xf6,0x71,0xe4,0x11,0x6c,0x84,0xab,0x72,0xa4, + 0xcb,0x37,0x9,0x38,0x7a,0x15,0x69,0x36,0x8b,0x2,0x27,0x49,0xa5,0x80,0xb1,0xc1, + 0x22,0x46,0x2b,0x5,0x3b,0x95,0x25,0x21,0x4,0xad,0x4e,0x17,0x6b,0x7b,0x27,0x58, + 0xdb,0x6d,0x84,0x32,0x49,0x22,0x4b,0x44,0x72,0x7d,0xa9,0xf2,0xf8,0x8a,0x1c,0x2b, + 0xd5,0xd6,0xec,0x14,0xc2,0x82,0x7,0xd5,0x81,0x1c,0x46,0xcb,0x5,0x1a,0xaf,0x16, + 0x78,0xbc,0x56,0xa2,0xf9,0xf1,0x41,0x5c,0x98,0xac,0xe0,0xf2,0x74,0xb8,0xdb,0x8d, + 0xed,0x8c,0x5f,0xb0,0x9e,0x88,0x23,0x5a,0xd,0x3c,0xdf,0xaa,0xf3,0xc3,0xd5,0x3, + 0x7c,0xf2,0x68,0x93,0xef,0x2e,0xef,0xf2,0xee,0xf1,0x29,0x10,0x68,0x83,0x12,0x98, + 0x28,0x31,0xeb,0xcc,0xc3,0xcc,0x9a,0x90,0x69,0x5c,0xc7,0x5d,0x4f,0xca,0xee,0xf0, + 0x64,0x20,0x20,0x76,0x16,0xb0,0xd6,0xe9,0xc8,0x8d,0x80,0x4e,0x58,0x4b,0x1a,0xc1, + 0x63,0x8f,0xbc,0xa9,0x44,0x77,0x43,0x9e,0x25,0xd,0x86,0x7,0xb,0xb8,0x38,0x5d, + 0x45,0x39,0xe2,0x20,0x18,0x5d,0x23,0xec,0x1c,0x36,0x71,0xfb,0xf9,0x2e,0x76,0x8e, + 0x9b,0x2,0xa7,0x61,0xcf,0x91,0x4c,0xa7,0x91,0x2,0x51,0x77,0x32,0xfd,0x7e,0x8f, + 0x81,0xdd,0xa3,0x36,0xf6,0x8e,0x77,0xc1,0xcc,0xdc,0xee,0x6,0xf4,0xda,0xd9,0x11, + 0x9c,0x9f,0xa8,0xa1,0x5c,0xcc,0x24,0x9e,0x47,0xf2,0x4c,0x2d,0x17,0xb2,0xb8,0x7e, + 0x66,0x18,0xa7,0xed,0x2e,0x75,0xba,0x3d,0xfe,0xf8,0xd1,0x16,0xad,0xec,0x1c,0xb3, + 0x97,0xe8,0x12,0xda,0x18,0x5a,0x52,0x6b,0x38,0xc0,0xea,0x28,0x36,0x97,0xe3,0x23, + 0x7c,0xf7,0x34,0xe1,0x26,0xc5,0xa4,0xa3,0x5a,0x48,0x60,0xe2,0xa4,0xbd,0x21,0x6c, + 0x6d,0xd1,0xe0,0xa,0xb3,0x87,0x8f,0x28,0x32,0xd2,0x18,0x2,0xc9,0x72,0x1b,0xf1, + 0x55,0x31,0xba,0x4,0x81,0xcd,0x19,0x62,0xb0,0x52,0xfe,0x99,0xa3,0x64,0x2d,0xa5, + 0x38,0xb7,0x46,0xd8,0xb6,0x42,0x4,0xae,0x58,0x79,0xb8,0x4a,0x6e,0x3a,0x29,0xc2, + 0x67,0xf6,0x82,0x20,0x15,0x90,0x86,0x6d,0x7b,0x64,0x27,0x2c,0x1a,0x76,0x6b,0x68, + 0x1d,0xd9,0x2e,0x90,0x8b,0x91,0xb4,0x16,0x98,0x66,0x77,0xaa,0xc9,0x36,0x91,0x9c, + 0x19,0x37,0x24,0x29,0x31,0x7b,0x91,0xdb,0x33,0xda,0x58,0x4b,0xd2,0x36,0x95,0x21, + 0x35,0x9d,0x4c,0x26,0xac,0x22,0x7f,0xda,0x86,0xa,0xf1,0x7a,0xf6,0x48,0x70,0x6e, + 0xdf,0x4e,0x22,0x7f,0x94,0x40,0x34,0x35,0x3c,0x40,0xff,0xf6,0x7b,0x17,0xe9,0xdb, + 0x17,0x27,0x28,0x1a,0x5b,0x29,0xdf,0x4e,0x4e,0x3b,0xf8,0xfd,0x83,0x75,0xfc,0xd3, + 0x97,0xcf,0xf1,0xfe,0x9d,0x55,0xbb,0x94,0x95,0x7,0xba,0xf9,0xcd,0x28,0xe6,0x12, + 0x44,0x11,0x30,0x35,0xce,0x6f,0xa7,0x4,0x6c,0xcb,0x4b,0x9c,0xe6,0xf8,0xee,0xdd, + 0x7c,0xbc,0x94,0xcf,0xa0,0x5a,0xca,0x23,0xdd,0xa7,0x40,0x9a,0x7,0xea,0xb0,0xd1, + 0xc6,0xe6,0x7e,0x13,0xdd,0xe,0x27,0x12,0xee,0x8,0xae,0x4b,0x1d,0xab,0x14,0xf0, + 0x57,0xdf,0x39,0x8f,0x77,0xae,0x4e,0x21,0x2b,0x22,0x22,0x63,0xba,0xf1,0x5e,0x80, + 0x23,0x7d,0x6d,0xfe,0xb7,0x9f,0xdf,0xc3,0xfa,0xfe,0x89,0xb3,0xaf,0xb4,0xcd,0x9d, + 0x6f,0x5f,0xfb,0x12,0xe3,0xa5,0xb5,0xfa,0x35,0xfe,0x4c,0x1e,0xaf,0xc3,0xf5,0xaa, + 0x6c,0x73,0x26,0x95,0x98,0x8f,0x94,0xf3,0x6e,0x14,0x38,0xa1,0x6b,0xae,0x9c,0x6, + 0x58,0xba,0x3b,0x90,0x62,0x92,0x97,0x96,0xd8,0x4,0x7,0x90,0xf7,0x4,0x91,0x67, + 0xee,0x43,0xee,0x3e,0x76,0xfa,0x78,0xe5,0x9,0x4,0x22,0x23,0x83,0x98,0x47,0xe3, + 0x42,0xb0,0x4c,0x9a,0x30,0x37,0x56,0xc1,0xbf,0xfe,0xce,0x39,0x7c,0xf7,0xf2,0x4, + 0xa6,0x86,0x4a,0x48,0xa7,0x52,0x7d,0xbd,0xf8,0x13,0x1f,0x70,0x22,0x6c,0x1f,0x36, + 0xf0,0xe1,0xfd,0x75,0xfc,0xc3,0x67,0xcf,0xf8,0xe3,0x47,0x5b,0x62,0xa5,0x42,0x1e, + 0x1c,0x68,0x25,0x43,0x24,0x90,0x37,0x8a,0xac,0xb,0x6c,0xeb,0x44,0x16,0x8d,0x22, + 0x0,0x3,0x85,0xc,0x2e,0xce,0xd4,0x30,0x5e,0x29,0xbd,0xf0,0xe7,0x3a,0x6a,0x76, + 0xf0,0xe5,0xd3,0x6d,0xac,0xee,0x9d,0xf8,0x8e,0x74,0x88,0x6,0xd7,0x44,0x9e,0x5, + 0x16,0x87,0x9c,0xf7,0x1c,0x84,0xc0,0xf5,0x44,0xad,0x48,0x57,0x66,0x86,0xf0,0xfa, + 0xf9,0x51,0xbc,0x32,0x37,0x4c,0x17,0x26,0xab,0xd6,0xb0,0x28,0xc9,0xa6,0x34,0xaa, + 0x25,0x7f,0xd1,0xdb,0xd6,0x41,0x3,0x1f,0xdd,0x5f,0xe7,0x5f,0xde,0x5e,0xe1,0xdf, + 0x3f,0xdc,0xe4,0x76,0xb7,0xa7,0xb9,0x41,0xc4,0xb6,0x98,0xb2,0x9e,0xce,0xd9,0xb2, + 0xf0,0x38,0xcc,0xf4,0xa,0xcc,0x7a,0x40,0xb,0x9f,0xad,0xff,0x10,0x1b,0xe8,0x27, + 0xd0,0xb1,0xa0,0xac,0x44,0x5f,0x15,0x39,0x95,0xb5,0x34,0xcb,0x92,0x33,0x6d,0xef, + 0xc5,0x11,0x84,0x82,0x7c,0x93,0x92,0xe1,0x72,0x1,0xe7,0x27,0x6b,0x24,0x3d,0xfe, + 0xa3,0xd7,0x83,0x99,0xb1,0xb6,0xdf,0xc0,0x57,0x8b,0x3b,0x38,0x38,0xe9,0x98,0xf0, + 0x11,0x7b,0xef,0x92,0xaf,0xe1,0xb0,0x8c,0x15,0x42,0xd4,0x8b,0xdc,0x29,0xf1,0x6e, + 0x2f,0xef,0xd3,0xe3,0x8d,0x23,0xfe,0xa3,0xd7,0x66,0xf1,0xa3,0x1b,0x3d,0x7a,0xfd, + 0xec,0x8,0x8a,0xf9,0x6c,0x8c,0x0,0x9b,0xf4,0x1a,0xbc,0x7e,0x76,0xc,0xd3,0xc3, + 0x3,0x94,0x4d,0xa7,0xf8,0xe7,0x5f,0xad,0x60,0xef,0xe4,0x34,0xb4,0x65,0x37,0x84, + 0xa,0x61,0xbf,0x2a,0xa6,0x59,0xb2,0xeb,0xa,0xf3,0x48,0x6,0xc2,0xd8,0x92,0xad, + 0x9f,0xb3,0xa6,0xc1,0x83,0x10,0xe8,0x7d,0x92,0xdb,0x0,0xea,0x52,0xa5,0x1b,0x6, + 0x17,0xe5,0xcd,0x8c,0x20,0x2e,0x19,0x26,0x10,0x82,0x4,0x7,0x15,0x12,0xc4,0x35, + 0xd1,0x23,0xc7,0x26,0x66,0x81,0x70,0x78,0xe3,0x87,0x40,0x66,0x4d,0x31,0xf7,0xa0, + 0x7b,0x69,0xf9,0xad,0xa4,0x76,0x1f,0x7d,0xa5,0x70,0x6,0x19,0x4f,0x4b,0xa3,0x9, + 0xa9,0x40,0xf5,0x74,0x7c,0x88,0x49,0x7a,0x63,0x32,0x1b,0x5f,0xf5,0xe3,0x24,0x24, + 0xc4,0x14,0xd5,0xea,0x46,0x71,0x1d,0x67,0xcd,0xa8,0x9c,0xe8,0xc8,0xad,0xc1,0xf5, + 0x97,0x53,0x2e,0x21,0x8d,0x48,0x85,0x3b,0x13,0xc1,0x7e,0x37,0xe3,0x30,0x91,0x74, + 0xfc,0x70,0xc7,0xf2,0xd5,0xd9,0x61,0xfa,0xd1,0xcd,0x59,0x75,0x6d,0x6e,0x84,0xaa, + 0xc2,0x2a,0x35,0x7a,0x10,0x2c,0x6e,0x1e,0xe2,0xf7,0xf,0x37,0xf0,0xcb,0x5b,0xcb, + 0xb8,0xb7,0xb2,0xe7,0x35,0x2f,0xec,0xc5,0xa,0xf8,0xee,0xf7,0x42,0x38,0xe8,0x35, + 0x32,0xa,0xc9,0xe,0x40,0x89,0x1d,0x97,0x79,0x10,0x85,0xa7,0x8c,0x7,0x1f,0x2b, + 0x20,0x9b,0x49,0xa3,0x98,0x4b,0x79,0xbb,0xab,0xa4,0xc3,0xbe,0x7e,0xd2,0xc2,0xf6, + 0x51,0x33,0xcc,0x1a,0xb7,0x12,0xf,0x1,0x47,0xeb,0x1b,0xe9,0xfc,0x64,0xd,0x3f, + 0xbc,0x3e,0x83,0x57,0xcf,0x8e,0x5a,0x7f,0x76,0x9,0x91,0xcb,0x83,0x71,0xeb,0xb0, + 0x81,0xbf,0xfd,0xe4,0x29,0xde,0xbb,0xb3,0x8a,0x4d,0xe3,0x2,0x45,0x11,0x2b,0x4b, + 0x2f,0x95,0xf2,0xa5,0x2a,0xba,0x34,0x2d,0x72,0x97,0x47,0x8b,0x84,0x49,0x3f,0x54, + 0x61,0xec,0x69,0xe0,0x5a,0x1b,0xa5,0x75,0x6f,0xb0,0x99,0x2e,0xd2,0xd5,0xc0,0xad, + 0x3f,0x84,0xa8,0x55,0x8e,0xf8,0x7e,0x27,0x46,0x4e,0xa0,0xe2,0x21,0xe2,0xce,0x6c, + 0xd8,0xde,0x2f,0xb2,0xa1,0x25,0x5f,0x86,0x65,0xfb,0x70,0x17,0xe1,0xe2,0x91,0xe0, + 0x4c,0x3,0x3c,0x50,0x48,0xe3,0x95,0xb9,0x11,0x5c,0x3f,0x33,0x8c,0x2b,0xb3,0x43, + 0x38,0x37,0x59,0xc1,0x44,0xb5,0x88,0x74,0x4a,0x25,0x12,0x33,0xfb,0x91,0xe1,0x82, + 0x80,0xf1,0xd5,0xe2,0x36,0x3e,0x7e,0xb0,0xc1,0x1f,0x3e,0xd8,0xc0,0xe3,0x8d,0x43, + 0xf9,0x44,0xda,0x9e,0x5a,0xf0,0x1,0x61,0x68,0x8,0xd1,0xae,0xdf,0x16,0x3,0x41, + 0x49,0x92,0x60,0x48,0x31,0x9b,0xc1,0xc5,0xa9,0x21,0x8c,0x55,0xa,0x89,0x64,0x28, + 0xf3,0x73,0x9f,0x9c,0x76,0xf0,0xe5,0xb3,0x1d,0xac,0xec,0x1e,0x87,0xc8,0x15,0xf9, + 0x51,0xcc,0x48,0x92,0xc3,0xb1,0xd8,0x49,0xea,0xcf,0x1f,0xaf,0x16,0x31,0x3d,0x5c, + 0xc2,0xf4,0xd0,0x0,0xcd,0x8e,0xe,0x60,0xb2,0x56,0xc4,0x44,0xb5,0x84,0xd1,0xc1, + 0x2,0x86,0x7,0xf3,0xc8,0x67,0xd3,0x7d,0xc3,0x43,0xe2,0x16,0xb4,0x41,0xac,0xc0, + 0xf4,0x7a,0x1,0x16,0xb7,0xeb,0xf8,0xea,0xd9,0xe,0xdf,0x7e,0xbe,0x8b,0x27,0xeb, + 0x87,0xbc,0xb4,0x7d,0xc4,0xda,0x7c,0xc9,0x16,0x6d,0x3b,0x1b,0xda,0x9b,0x4b,0xec, + 0xc8,0x55,0x18,0xf0,0xa1,0x33,0x3f,0x75,0xb1,0x37,0x77,0x32,0x33,0x3b,0x5f,0xe9, + 0xc8,0x6d,0xc5,0xf6,0x79,0x26,0x37,0xa1,0xbb,0xb0,0x15,0xa1,0x7b,0x32,0x70,0x3e, + 0x45,0x2d,0x68,0x42,0xa9,0x15,0x86,0x7,0xf3,0xb8,0x38,0x5d,0x43,0xa5,0x98,0x4d, + 0xb4,0x65,0xb5,0x4,0xbf,0xc3,0x26,0xee,0x3c,0xdf,0xe3,0xfa,0x49,0x5b,0x38,0x2c, + 0x7b,0x44,0x3d,0xf6,0x4d,0x8d,0xc8,0xf7,0x8b,0x8f,0xb3,0x43,0xf9,0xb4,0xd3,0xc5, + 0x7,0xf7,0xd7,0x69,0xef,0xb8,0xc5,0x8b,0x5b,0x75,0x7c,0xfb,0xe2,0x4,0x5d,0x9c, + 0xaa,0xf6,0x85,0xde,0xcd,0xc7,0x53,0x29,0x85,0x89,0x6a,0x9,0x7f,0xf1,0xd6,0x59, + 0x1a,0xab,0x96,0xf0,0xf7,0x9f,0x2e,0xf2,0xb3,0xad,0x7a,0x18,0x8d,0xc2,0xec,0xd4, + 0x89,0xe4,0x94,0x54,0x82,0xfb,0xc3,0x16,0x9c,0xd6,0xfc,0x2b,0xe,0x8c,0xde,0x81, + 0x4c,0xd1,0xf,0x27,0x42,0x15,0x10,0x3,0x4a,0x11,0x5,0x41,0xa0,0x97,0xb8,0xf6, + 0x65,0x32,0xd3,0x3a,0x73,0x0,0x2,0x21,0x15,0x7e,0x5c,0x2b,0xe2,0x64,0x36,0x83, + 0x19,0x78,0x39,0x26,0xf2,0x8b,0x1e,0x5b,0x5e,0x6c,0x94,0x17,0x23,0xe5,0x73,0xe6, + 0x48,0xf0,0x7c,0xfc,0x26,0x57,0x92,0xee,0x3c,0xb1,0x13,0x9,0x8d,0x7c,0xa2,0xbe, + 0x34,0x3c,0x77,0xd2,0xc2,0xf6,0x2d,0xf2,0x98,0xf9,0xbc,0x7c,0xbb,0xc5,0x54,0x14, + 0x59,0x83,0xf9,0x1a,0x13,0xcf,0xdc,0x8c,0x9d,0x4f,0x1b,0xcb,0x4e,0x42,0x9f,0xb5, + 0xca,0x46,0x12,0xd8,0x94,0x72,0xa1,0x51,0x57,0x2e,0xa9,0x58,0x85,0x7c,0x64,0x29, + 0x65,0xb3,0xe6,0xaf,0x26,0xb8,0x56,0x59,0x1d,0x32,0xe9,0x8e,0x57,0x6f,0xf7,0x15, + 0x55,0x4b,0x19,0x7a,0xe7,0xca,0x14,0xfd,0xe8,0xe6,0x19,0x1a,0xaf,0x16,0x12,0x77, + 0xe6,0x0,0x70,0xd4,0x68,0xe3,0x93,0xc7,0x9b,0xf8,0xd9,0x67,0xcf,0x71,0xe7,0xf9, + 0xe,0x7a,0x7a,0x2,0x93,0x31,0x78,0x72,0x9,0xc1,0xec,0xdb,0x10,0xca,0x28,0x3c, + 0x4a,0xb8,0xe6,0x9e,0xac,0x21,0xe1,0x85,0x71,0xa6,0x67,0x9,0x45,0x4f,0x9f,0x31, + 0xd9,0x74,0xa,0x39,0xb1,0x2a,0xe8,0x3b,0x4d,0x33,0xa3,0xd7,0x83,0x75,0xc2,0x8d, + 0x86,0xbc,0x90,0x62,0x54,0xa,0x39,0x7c,0xef,0xea,0x14,0x7e,0xfc,0xda,0x19,0x4c, + 0xf,0xf,0xf4,0x8d,0x5b,0xec,0x76,0x43,0xf7,0xb7,0x4f,0x1e,0x6f,0xe1,0x67,0x9f, + 0x2d,0xe1,0xf9,0x76,0xdd,0xfd,0x4c,0xc2,0x5d,0xd0,0xb3,0x64,0x64,0x4a,0x30,0x32, + 0xe9,0xb3,0x43,0x97,0x2d,0x10,0xc9,0x6,0x89,0xbc,0xa4,0xcd,0xf0,0x26,0x61,0xfb, + 0x9c,0x23,0x61,0xd7,0x4b,0x42,0x7a,0x93,0xd0,0x7e,0x11,0x39,0xaf,0x5,0x91,0xae, + 0x19,0x6e,0x46,0x43,0x15,0x99,0x79,0xc,0x8d,0x37,0x82,0x88,0x73,0x53,0x2a,0x59, + 0x99,0x6e,0xb9,0x8b,0x2a,0xd2,0x31,0x1b,0xb6,0x3c,0x21,0x97,0x56,0x28,0xe4,0xd2, + 0x28,0xe5,0x32,0xb8,0x30,0x55,0xc5,0x1f,0x5c,0x9d,0xc2,0x9b,0xe7,0xc7,0xb4,0x97, + 0x0,0xbc,0x46,0x2a,0x4a,0x2c,0x8a,0x6a,0xa4,0x9b,0xad,0xe,0x8e,0x5b,0x5d,0x2c, + 0x6d,0xd5,0xf1,0x8b,0x5b,0x2b,0xfc,0xe1,0x83,0xd,0x2c,0x6e,0xd5,0xf5,0x66,0x4b, + 0xee,0x9f,0xed,0x99,0xcd,0x14,0x63,0xe5,0x93,0xb3,0x10,0x87,0x8b,0x7d,0xd4,0x50, + 0x3b,0xeb,0xf8,0x63,0xfb,0x74,0xf,0x14,0xb3,0xb8,0x30,0x55,0xc5,0x68,0xa5,0x10, + 0x2b,0x8e,0xf2,0xd0,0xde,0x3b,0x3e,0xc5,0xa3,0xf5,0x43,0x6c,0xd5,0x4f,0xdd,0x23, + 0xcc,0x11,0x88,0x51,0x9c,0x1f,0x29,0x2,0xb2,0xd9,0x14,0xb2,0x29,0x85,0x6c,0x26, + 0x85,0x5c,0x3a,0x85,0xf1,0x5a,0x1,0xb,0x63,0x83,0x38,0x3b,0x51,0xc1,0xc5,0xa9, + 0x2a,0xce,0x4d,0xc4,0x75,0xef,0xd2,0xa9,0x2c,0xba,0xd2,0x49,0x72,0x49,0x23,0x22, + 0x74,0xbb,0x3d,0xb4,0xba,0x3d,0x34,0xda,0x1,0x96,0xb6,0xe,0x71,0x77,0x79,0x9f, + 0x7f,0x71,0x6b,0x99,0xef,0x2e,0xed,0x71,0x2f,0x8,0xf4,0x48,0xed,0x18,0xc0,0xe4, + 0x4c,0xed,0x4c,0x45,0x67,0x2d,0x24,0x33,0x7e,0xe1,0x7a,0x30,0xb3,0x6c,0x2b,0x53, + 0x59,0xd8,0x62,0xd,0x3a,0x34,0xc8,0x7,0xf0,0x5c,0x28,0x8d,0x43,0x76,0x8,0x91, + 0xbc,0x6d,0x3b,0xa3,0x44,0x0,0x2d,0x66,0x61,0x9b,0x30,0x32,0x58,0xc4,0xa4,0x96, + 0xb0,0xca,0xb3,0x40,0x5e,0xa3,0x46,0xab,0x87,0xf5,0xdd,0x63,0x6c,0x1c,0x36,0x85, + 0xf4,0x2d,0xe2,0x5a,0x4e,0xca,0xdb,0xc5,0x3a,0x14,0x40,0xb9,0xd5,0x8b,0xd8,0x24, + 0x1b,0x1e,0xc9,0xce,0x51,0x9b,0x7f,0x7b,0x6f,0x3,0x5b,0x87,0x4d,0x6a,0x76,0xba, + 0x9c,0x4e,0x11,0x8d,0x57,0x8a,0x28,0x64,0x53,0xf6,0x3e,0x96,0xfc,0x19,0xf3,0x73, + 0x29,0x45,0xb8,0x34,0x5d,0x43,0xa5,0x98,0xa3,0x7a,0xb3,0x8d,0x4c,0x3a,0xc5,0xcf, + 0xb6,0xea,0x68,0x77,0x7a,0xce,0x2a,0x41,0x87,0xec,0x89,0xc,0xb,0x1d,0xaf,0x0, + 0x10,0x1b,0x47,0x18,0x52,0xa4,0x2,0x33,0x47,0x87,0x4d,0x7e,0x88,0xd9,0x12,0x2, + 0xa5,0x42,0x65,0x3d,0x93,0x49,0x5e,0x62,0x62,0xa2,0xc0,0x44,0xd1,0x6,0x21,0x4f, + 0xcb,0xc2,0xed,0x66,0x2,0x53,0xd6,0xe3,0x95,0x14,0x13,0xb4,0x4b,0x11,0x71,0x5c, + 0x16,0x1f,0x17,0x5e,0xfa,0x5c,0x11,0x73,0x7e,0x58,0x22,0xbc,0x6c,0x9,0x54,0x2, + 0xb1,0x4d,0x32,0xd8,0x25,0xf9,0x9d,0xe2,0xc6,0x32,0xce,0xf0,0x8a,0xad,0x50,0x3e, + 0x6d,0xed,0x18,0x13,0x88,0x11,0x12,0xfd,0x4f,0xb2,0x20,0x4d,0xfc,0x43,0x42,0xb0, + 0x14,0x0,0x50,0x4a,0x7e,0x29,0xf3,0x83,0x28,0x2f,0xc,0x84,0x64,0x4a,0xaa,0x72, + 0x9a,0x74,0x22,0x33,0xc6,0xb9,0xbd,0xb9,0xbd,0x33,0xb5,0x8c,0xc1,0xcc,0xea,0xe, + 0x4d,0x8,0xdf,0x19,0xaf,0x16,0xf0,0x83,0x57,0x66,0xe9,0x9d,0x6b,0xd3,0x34,0x27, + 0x12,0xd3,0xe4,0x41,0x9,0x0,0x7b,0x47,0xa7,0xf8,0xe2,0xe9,0x16,0xde,0xbf,0xb3, + 0x86,0xdb,0x4b,0x7b,0xe,0xc1,0x89,0x4d,0x9e,0xc,0xea,0xeb,0x49,0xfc,0x32,0xd5, + 0x8b,0xa3,0xa1,0x69,0x88,0xd6,0x2f,0x39,0xda,0x47,0x3,0x6e,0xd2,0x8a,0x5e,0xca, + 0xcf,0xbb,0x5c,0xc8,0xa2,0x56,0xce,0x61,0xeb,0xf0,0x54,0xf8,0x11,0x3b,0x7d,0xcc, + 0x64,0xb5,0x84,0x3f,0x7b,0x73,0x1e,0x7f,0x70,0x7d,0x1a,0x67,0xc7,0x2b,0x5e,0xce, + 0x76,0x14,0xb9,0xd8,0x6f,0xb4,0xf1,0xf,0x9f,0x3d,0xc7,0xdf,0x7d,0xba,0x88,0xcd, + 0xfd,0x86,0x7f,0xf0,0x70,0xdc,0x34,0xc1,0x39,0x80,0xd1,0x37,0x4f,0xe7,0x3a,0xca, + 0x4c,0x64,0xa,0x90,0x48,0xc7,0xb6,0xcc,0x3a,0x6d,0xfd,0x69,0x49,0xd0,0x6,0x93, + 0x71,0x1e,0xe8,0xc2,0x26,0x41,0x53,0x63,0x94,0x21,0xc4,0xbb,0xcd,0x18,0x39,0x8d, + 0xab,0x5,0xf1,0x42,0x5f,0x4,0x57,0xe0,0xed,0xb7,0x37,0xb7,0x9f,0xc5,0xe6,0xe1, + 0x5,0xa8,0x7a,0x2f,0xba,0xd2,0xc6,0xe7,0x4c,0x32,0x41,0x83,0x35,0xef,0x21,0x8b, + 0xab,0x33,0x35,0xbc,0x7a,0x76,0x14,0xd7,0xcf,0xc,0x63,0x66,0x64,0x0,0xe5,0x7c, + 0x6,0xc5,0xdc,0x37,0xc3,0xeb,0xd1,0x62,0xde,0xeb,0x5,0x78,0xbc,0x71,0x88,0xf7, + 0xee,0xac,0xf1,0x7,0xf7,0xd6,0xb0,0x79,0xd0,0xe0,0xe3,0xd3,0x8e,0xf6,0x5d,0x4f, + 0xda,0xd7,0x24,0x48,0xed,0xec,0x11,0x0,0x2f,0x2f,0xdc,0x19,0xf8,0x90,0x88,0xe0, + 0xe,0x7f,0xa4,0x52,0x2e,0x83,0xf3,0x93,0xd5,0x44,0xb2,0x9e,0x9,0xda,0x69,0xb4, + 0x3a,0x58,0xdd,0x6b,0x60,0xe3,0xa0,0xe1,0x9b,0x58,0xca,0xbc,0x67,0xf6,0x80,0x1d, + 0xd4,0xca,0x79,0x2c,0x4c,0xc,0xe2,0xfc,0x44,0x5,0x67,0xc7,0x6,0x71,0x6e,0xa2, + 0x82,0x6a,0x29,0x87,0x62,0x2e,0x8d,0x4c,0x5a,0x21,0x9b,0x4e,0x21,0x9f,0x49,0xf5, + 0x85,0x6f,0xfb,0x35,0xb4,0x51,0x2f,0x9,0x66,0x46,0xbd,0xd9,0xc1,0x9d,0xe7,0xbb, + 0xfc,0xfe,0xdd,0x55,0x3c,0x58,0x3d,0xe0,0xcd,0x83,0x26,0xd7,0x1b,0x6d,0xf4,0x58, + 0xeb,0xe4,0x2c,0x43,0x4b,0xd9,0x9,0xdb,0xa4,0xa3,0xd9,0xdd,0xb7,0x2d,0xdc,0xe1, + 0xa8,0xc7,0x60,0xe,0xf4,0x2e,0x43,0x53,0xe4,0x64,0xf4,0x88,0xdd,0xb9,0x7b,0xd6, + 0xbe,0xee,0xd9,0x92,0x7d,0xb0,0xcf,0xf8,0x24,0xb9,0x8e,0x62,0x2f,0xe8,0x83,0x10, + 0x1a,0xb6,0x4c,0xd6,0x8a,0x9e,0x1f,0x45,0xd2,0xb5,0x69,0xb4,0xba,0xb8,0xb3,0xb4, + 0x8b,0xa5,0xdd,0x23,0xb6,0x2e,0x88,0xc,0x9b,0x40,0x2f,0xa9,0x20,0x2e,0x85,0xde, + 0x1f,0x48,0x54,0x44,0xf9,0x20,0x58,0xf1,0xf6,0x3b,0x3f,0xdd,0x38,0xe2,0xc3,0xc6, + 0x33,0xdc,0x59,0x3a,0xc0,0x7f,0xf3,0xd6,0x2,0x7d,0xeb,0xfc,0x28,0x8a,0xf9,0x6c, + 0xcc,0x78,0x26,0xda,0x78,0x8c,0xe,0xe6,0xf1,0xdf,0x7d,0xff,0x22,0x4d,0xf,0x95, + 0xf0,0xff,0x7e,0xbc,0xc8,0x8f,0xd7,0xf,0xa8,0xdd,0xd,0x98,0x24,0xcc,0xe0,0x8, + 0xa6,0xc4,0x76,0x7f,0xcd,0x0,0xa5,0x8,0x1c,0x98,0xbd,0x1b,0x1,0x50,0x9c,0xa2, + 0x80,0x82,0xc0,0xc4,0x59,0x6a,0xb7,0x19,0xfd,0x77,0x8,0x2,0x2,0x11,0xa5,0xf4, + 0xa3,0xc9,0xca,0x23,0x7c,0x22,0x20,0x30,0x5,0x20,0x22,0x8d,0xd,0xea,0xfc,0x75, + 0x8d,0xbb,0xb0,0x8a,0x21,0xe2,0xa2,0x74,0x73,0x2,0x22,0x49,0x31,0x53,0x65,0xdf, + 0xda,0x5d,0x6,0x77,0x99,0x73,0x5f,0x5e,0x9f,0x8,0x1f,0x81,0x10,0x63,0xe1,0xdb, + 0x41,0x53,0xab,0xa4,0xd2,0x24,0x27,0xf4,0xc8,0xf,0xa9,0x38,0x61,0x2f,0x90,0x50, + 0xa0,0xa2,0x3d,0x89,0xf,0x3c,0x8,0x69,0xe,0x9,0xd1,0x29,0xc9,0x5d,0xbc,0xb2, + 0xb8,0x92,0x11,0x95,0xfa,0xbc,0x60,0x63,0xee,0xa1,0x5c,0x2,0x9b,0x25,0xc7,0x39, + 0x5b,0x29,0xcb,0x81,0x67,0x45,0xc,0x50,0x29,0x9f,0xa6,0x9b,0xb,0x63,0xea,0x47, + 0x37,0x67,0xe9,0xfc,0x44,0x85,0xa2,0x10,0x9c,0x3c,0x28,0x9f,0x6e,0x1c,0xe0,0xe7, + 0xb7,0x56,0x70,0x77,0x65,0x4f,0xd8,0xdc,0xc2,0x4f,0xc9,0x82,0x14,0x23,0xc6,0xd6, + 0x81,0x9e,0x7d,0x26,0x43,0x38,0x72,0x81,0x90,0xcb,0xa4,0x30,0x3d,0x5c,0xc4,0xdc, + 0xd8,0x20,0x4a,0xd9,0x34,0x2,0x6d,0xcd,0xba,0xb2,0x7b,0x8c,0x7,0xab,0x7,0x9, + 0xbb,0x76,0xd7,0x7d,0xc9,0xef,0xa2,0x52,0xea,0x1b,0xad,0x3f,0x1,0xe0,0xc2,0x74, + 0xd,0xef,0x5c,0x99,0xc2,0xef,0x1f,0x6f,0x61,0x6d,0xf7,0xd8,0xde,0x6c,0xa5,0x7c, + 0x1a,0xf3,0xe3,0x83,0x78,0xeb,0xe2,0x78,0x58,0xcc,0x85,0x73,0x56,0x14,0xd6,0x65, + 0x66,0x3c,0xdb,0xac,0xe3,0x37,0x77,0xd7,0xf0,0xfe,0xdd,0x35,0xac,0xee,0x9d,0xc4, + 0xbf,0xa1,0x22,0x2f,0xf1,0xcc,0x73,0x6f,0x79,0x99,0xb7,0xf0,0x35,0xd7,0x23,0x6e, + 0x84,0x89,0x63,0xb5,0xfb,0x52,0x9a,0xcf,0x20,0x12,0xa5,0xda,0x46,0x65,0xb3,0x4b, + 0x33,0xb5,0xc4,0x4d,0x6d,0x43,0x41,0x2e,0x79,0xd,0x66,0x93,0xc3,0x62,0xd5,0x23, + 0x4a,0x7c,0xa8,0x81,0xb6,0x52,0xba,0x44,0x9b,0x73,0x99,0x8c,0xc7,0x7e,0x5e,0x20, + 0x32,0x2a,0x85,0x4a,0x31,0x8b,0xa1,0x81,0x5c,0x48,0xe2,0xaa,0x14,0x30,0x51,0x2d, + 0x62,0x61,0x3c,0x2c,0x5a,0xf3,0x63,0x65,0x64,0xd2,0x71,0xff,0xf3,0xe8,0xc1,0x67, + 0xa,0xb9,0x79,0x9d,0x3b,0xdd,0x1e,0x9e,0xef,0x1c,0xe3,0xd1,0xea,0x3e,0x7f,0xf5, + 0x7c,0xf,0x9f,0x3d,0xde,0xe2,0xa7,0x9b,0xf5,0x78,0xd9,0x26,0x5,0xb6,0xb0,0xa1, + 0x30,0x97,0xe2,0x88,0x84,0x82,0x5d,0x58,0x8d,0x29,0x2f,0x92,0xa3,0x23,0x88,0xb9, + 0xac,0x14,0x61,0xac,0x5a,0xa2,0xa1,0x81,0x9c,0x57,0x58,0xe5,0x24,0xdc,0xb,0x7a, + 0x58,0xdc,0x3e,0xc2,0xe3,0xf5,0x3,0x34,0x5a,0x3d,0xb7,0xb3,0x17,0xd7,0xaf,0x98, + 0x4d,0xa1,0x56,0xca,0xa3,0xa6,0xaf,0xcd,0x70,0x39,0x8f,0xb1,0xc1,0x2,0xa6,0x86, + 0x4a,0x98,0x19,0x2e,0x61,0x6a,0x68,0x0,0x13,0x3a,0x29,0x2c,0x89,0x5c,0x15,0xf5, + 0x59,0x57,0x4a,0xd9,0x9f,0x21,0x69,0x45,0x64,0x56,0x0,0xdb,0xf5,0x26,0x56,0x76, + 0x8e,0xf9,0xe9,0x46,0x1d,0xf7,0xd6,0xf6,0xf9,0xd6,0xb3,0x1d,0xde,0x3c,0x6c,0x4a, + 0x1f,0x61,0x1d,0xce,0x43,0x6,0x54,0x84,0xe,0x5,0xf2,0xa,0xb9,0xa9,0x24,0x7a, + 0x95,0x6b,0xe8,0xd0,0x4c,0x61,0x84,0x10,0xb3,0x17,0xc1,0xc9,0xae,0xbc,0xfb,0xa3, + 0x80,0xd6,0x47,0xbb,0xa6,0x52,0xac,0x2a,0x5d,0xb2,0xab,0x78,0xc0,0x5d,0xaa,0xb4, + 0x4b,0xcb,0xcb,0x67,0x53,0x38,0x3b,0x59,0xa1,0xb1,0x4a,0xe1,0x85,0x32,0xc6,0x46, + 0xab,0x8b,0x5b,0x4b,0x7b,0x58,0xdc,0x3e,0x71,0xeb,0x62,0x33,0xa5,0x5b,0xa6,0xb7, + 0x62,0x47,0xcc,0xf3,0x2c,0xfb,0xac,0x68,0xd1,0xcb,0x20,0x21,0x8f,0x85,0x3,0x6, + 0xa8,0xcb,0x8c,0xad,0xc3,0x53,0x1c,0x9d,0x6e,0x71,0x3e,0x93,0xc2,0xde,0x71,0xb, + 0xaf,0xcc,0xf,0xd3,0xcc,0x70,0x9,0x39,0x7d,0xbf,0x47,0xa5,0xc1,0x44,0x84,0x54, + 0x4a,0x61,0xb8,0x9c,0xc7,0x5b,0x97,0x26,0xa8,0x13,0x30,0xde,0xff,0x3a,0xc3,0x5f, + 0x2f,0xef,0xd1,0xc9,0x69,0x2f,0x6c,0x95,0xec,0x18,0x4b,0x22,0x39,0x4f,0x93,0x14, + 0x41,0x6,0xed,0x20,0x50,0xa0,0x48,0xbb,0xd0,0xe8,0x74,0xcd,0x0,0xc,0xa,0x2, + 0x3b,0x22,0x42,0x27,0xe4,0x58,0xf,0x8a,0xc0,0x28,0x64,0x4d,0x7e,0x1a,0x59,0xeb, + 0x67,0x3d,0x3c,0x28,0x27,0xc4,0x62,0x31,0x4b,0x3b,0x43,0x55,0xe1,0xb5,0x26,0x7, + 0x45,0x80,0xa8,0xcf,0x90,0xe7,0xad,0x24,0x65,0xdb,0xeb,0x46,0x72,0x8a,0xc6,0x10, + 0x26,0x94,0x70,0xbf,0xee,0x3a,0x24,0x2a,0x2d,0xc9,0x33,0x3e,0xa9,0xc7,0x6f,0xdf, + 0xfa,0xd4,0x7c,0x1f,0x1b,0x48,0xd8,0x30,0x47,0x25,0x3f,0x96,0x29,0xae,0x9c,0x56, + 0xc8,0x14,0x70,0x9b,0xb5,0xe6,0xf8,0x70,0x5e,0x8e,0x1a,0x83,0xac,0x3c,0xd3,0xe8, + 0xdb,0xb5,0x9c,0x21,0x34,0x1b,0x70,0xe9,0x59,0x94,0xcf,0xa6,0xe9,0xe6,0xc2,0x28, + 0xbd,0x73,0x75,0x8a,0x5e,0x3b,0x3b,0xe6,0x85,0x30,0x48,0x78,0xae,0x17,0x4,0xd8, + 0x3b,0x6a,0xe1,0xab,0xe7,0xbb,0xf8,0xf5,0xed,0x55,0xb4,0xbb,0x81,0x85,0x99,0x5c, + 0x9c,0x24,0x7c,0xc9,0x17,0x39,0x12,0x18,0x4b,0x25,0x71,0x94,0x50,0xa8,0xaf,0x44, + 0x26,0xad,0x70,0x76,0x62,0x10,0x3f,0x78,0x65,0x6,0xff,0xea,0xf5,0x33,0x98,0x1c, + 0x1a,0x40,0xaf,0x17,0x60,0xbb,0xde,0xc4,0xdf,0x7d,0xba,0x88,0xc7,0xeb,0x75,0x74, + 0x83,0xa8,0x80,0x84,0x23,0x5,0x92,0xc5,0x83,0x4d,0x2f,0x4c,0x58,0x63,0x66,0xdc, + 0x98,0x1b,0x42,0x21,0x9b,0x42,0xb7,0x17,0x9e,0x34,0x7b,0x47,0x4d,0x64,0xd2,0xa, + 0x97,0xa6,0xaa,0xf8,0xb7,0x6f,0x9f,0xc7,0x1b,0xe7,0xc7,0x30,0x34,0x90,0x17,0xc3, + 0xb6,0x8f,0x5c,0xf4,0x82,0x0,0xfb,0xc7,0x2d,0x7c,0xf8,0x70,0x3,0xff,0xc7,0xaf, + 0xef,0x63,0xf7,0xa8,0xe5,0xd9,0x3d,0x44,0x77,0xff,0xd2,0x94,0x44,0xea,0xd1,0x5f, + 0x62,0x83,0xee,0xb1,0xc6,0x49,0x3a,0x30,0x5a,0x87,0x2d,0xb2,0x54,0x17,0x52,0x5e, + 0xfd,0x25,0xe1,0x9d,0x6f,0xa1,0x48,0x8e,0xe8,0xc2,0xed,0xde,0x52,0x2e,0x93,0xc9, + 0x3f,0x68,0x25,0x80,0xcf,0x3a,0xbd,0xcb,0xf3,0x36,0x26,0xdf,0x54,0x59,0x66,0xc0, + 0x19,0xff,0x81,0x5c,0x3a,0x85,0x89,0x5a,0x11,0x17,0xa7,0xaa,0xb8,0x32,0x5b,0xc3, + 0xb5,0xd9,0x1a,0xe6,0xc6,0x6,0x31,0xa4,0xbd,0xec,0xfb,0xed,0x14,0x93,0xe0,0x6b, + 0x39,0xc9,0xb4,0xda,0x1d,0x2c,0xef,0x9e,0xe0,0x6f,0x3f,0x5e,0xe4,0xf,0x1f,0x6c, + 0xf0,0x62,0xb8,0x6f,0xb4,0x30,0xa4,0x1c,0xb6,0x6d,0x43,0xe2,0xfd,0xf8,0xcc,0x88, + 0x22,0xb7,0x14,0x23,0x69,0xb2,0x80,0xc9,0x6c,0x45,0x57,0x4,0xcc,0xc,0xf,0xd0, + 0xec,0xc8,0x80,0x87,0xe2,0x44,0x21,0xed,0x6e,0x8f,0x71,0x7f,0xf5,0x0,0xf,0xd6, + 0xe,0x5,0x69,0x31,0x7c,0x6d,0x53,0x14,0x92,0xea,0xe6,0xc7,0x7,0x71,0x65,0xba, + 0x8a,0x4b,0xd3,0x55,0x5c,0x98,0xa8,0x60,0x6e,0xac,0x8c,0x42,0xc4,0x20,0xa9,0x9f, + 0x14,0xb3,0x9f,0x52,0x42,0xda,0xf,0x47,0x77,0xc7,0x27,0xa7,0x5d,0x3c,0xdd,0x3a, + 0xc2,0x47,0xf,0xd6,0xf9,0x83,0xfb,0x9b,0xfc,0x74,0xa3,0xce,0xcd,0x76,0xd7,0x3c, + 0xb5,0x66,0x44,0xd,0x6f,0x69,0x4d,0x93,0x34,0x39,0x0,0x9a,0x4d,0xa5,0x73,0xb6, + 0x8d,0xc2,0x4b,0x85,0x25,0x5a,0x4c,0xe7,0x61,0xb5,0x51,0xc,0x32,0xf,0xb0,0xa3, + 0x2d,0x90,0xe3,0xb,0x1b,0x26,0x39,0xb9,0xdf,0xcf,0xdd,0x4c,0xb6,0x66,0x29,0x67, + 0xef,0x21,0x8d,0xc1,0x59,0xaf,0x43,0x58,0x8c,0x69,0x85,0x5c,0x1a,0xe7,0x27,0x6, + 0x31,0x5e,0x29,0x50,0xd4,0xa3,0x40,0x5e,0xc3,0xe3,0x56,0x17,0x77,0x9f,0xef,0xf3, + 0xca,0xce,0x89,0x21,0xf2,0xc5,0xf2,0x7,0xc4,0xb2,0x96,0xa3,0x1c,0x12,0x2f,0x3c, + 0x84,0x23,0xbc,0x2e,0x77,0x3c,0xd9,0xc3,0xb1,0xd9,0xe,0xe8,0x17,0xb7,0x57,0xf9, + 0xfe,0xea,0x3e,0xfe,0xe2,0xcd,0x5,0xbc,0x73,0x65,0x82,0x2e,0x4d,0xf7,0x77,0x9b, + 0x34,0x1f,0x9b,0x1e,0x2a,0xe1,0x5f,0x7f,0x7b,0x81,0x34,0x54,0xcf,0x5f,0x3e,0xdb, + 0xc1,0x69,0x47,0x37,0xf0,0x36,0xc5,0x41,0x1a,0x48,0x2a,0x45,0x1,0x7,0x20,0x5, + 0xa6,0x80,0xcc,0x1a,0x8d,0xc0,0x8a,0x3,0xa,0xc2,0x71,0xdb,0xd4,0xe,0x56,0x8, + 0x38,0xb0,0x26,0x34,0x8a,0x81,0x40,0x53,0x3,0xd,0x2a,0x1e,0xa4,0x40,0x29,0x6, + 0x7,0x30,0x69,0x2f,0x1a,0x37,0xd4,0x2e,0xb3,0x91,0xc6,0x9e,0x92,0x6,0x3a,0x24, + 0xd4,0x61,0x39,0xc,0x82,0x22,0xff,0x8f,0x8,0x6a,0xa6,0x10,0x4d,0x8d,0x93,0xf5, + 0x25,0x9a,0xb9,0x1e,0xd,0x66,0xe1,0xd0,0x29,0xce,0x11,0x31,0x8,0xe8,0x13,0x4a, + 0xd5,0xcf,0x6f,0x3c,0x5a,0xde,0x9,0xb1,0xbd,0x63,0x84,0x68,0x44,0x72,0x51,0xae, + 0xdf,0x65,0x81,0xa0,0xb3,0x9d,0xcf,0xc9,0x4e,0xf4,0x86,0x55,0xa4,0x48,0xda,0xc0, + 0x6a,0x16,0x9d,0x8d,0xa4,0x35,0x85,0x3d,0xfc,0xea,0xe3,0xd5,0x2,0xfe,0xf8,0xf5, + 0x33,0xea,0xed,0x4b,0x93,0x14,0x3d,0x4c,0xe5,0x61,0x71,0x72,0xda,0xc5,0x2f,0xef, + 0xac,0xe0,0xa3,0x7,0x9b,0x68,0x77,0xd9,0xbb,0x4b,0x1d,0xfc,0x25,0x63,0x61,0xa3, + 0xf,0x64,0xc2,0xb1,0xa8,0xdf,0xcd,0x66,0xd2,0xb8,0x34,0x55,0xc5,0xcd,0x85,0x61, + 0xdc,0x9c,0x1f,0xc1,0xc5,0xa9,0x1a,0x26,0x87,0x6,0xf4,0xe1,0x44,0x18,0xaf,0x16, + 0x8d,0x8e,0x93,0x65,0x90,0xbd,0xdf,0x46,0x79,0x18,0x25,0x5,0xdf,0xa0,0xab,0x35, + 0xbf,0x63,0x29,0x9f,0xc5,0xb9,0x89,0x2a,0xfe,0xcd,0x77,0xcf,0xe1,0xfb,0xd7,0xa7, + 0xd0,0x6c,0xf7,0x90,0x52,0x84,0x6a,0x29,0x87,0xf3,0x93,0x15,0xc,0x8b,0xa0,0x8f, + 0xa4,0xc9,0x7c,0x75,0xf7,0x4,0x7f,0xff,0xe9,0x12,0x7e,0x7b,0x7f,0xd,0xbb,0x27, + 0xed,0x30,0xc4,0xf6,0xb7,0x50,0x27,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x20, + 0xf2,0xbc,0xc7,0x46,0x71,0x4b,0x68,0x48,0x6e,0xfd,0xfa,0x4d,0xe8,0x24,0xcd,0x14, + 0xfc,0xdf,0xc6,0xa7,0x9e,0x98,0x24,0xcc,0xd0,0x6d,0x49,0xe,0xd0,0x22,0x5a,0x92, + 0xbd,0x70,0x6,0x19,0x38,0x43,0x71,0x46,0x22,0xc9,0xfd,0x16,0x3c,0xf7,0x5e,0xb9, + 0xcb,0x57,0x96,0x34,0x41,0x62,0xc7,0x39,0x51,0x2d,0xd2,0x44,0xad,0x84,0xc9,0x6a, + 0xb8,0xc7,0x1c,0xad,0x16,0x30,0x5a,0x2e,0x60,0x68,0x20,0x87,0x4a,0x29,0x8b,0xe1, + 0x81,0x7c,0x62,0xb6,0xb4,0xbc,0xee,0x51,0x39,0x9a,0x84,0x8a,0x83,0x80,0x71,0x77, + 0x65,0xf,0xb7,0x16,0x77,0xf8,0xf3,0x67,0x3b,0x78,0xbc,0x76,0xc8,0x5b,0x87,0xd, + 0x83,0x3,0x8b,0x20,0x19,0x17,0x10,0xe2,0x6c,0x3c,0x5,0x52,0x66,0x12,0x26,0x7c, + 0x35,0x10,0x62,0x3e,0x52,0x82,0xac,0x6b,0xf6,0x19,0x8a,0x14,0x26,0x6b,0x45,0x4c, + 0xd,0x95,0xb4,0x9a,0x97,0x13,0xc9,0x70,0xed,0x6e,0x80,0x2f,0x9f,0xed,0xe0,0xce, + 0xf3,0x3d,0x14,0x73,0x59,0xd4,0x4a,0x39,0x4c,0xd6,0xc2,0xe9,0x7b,0xbc,0x52,0xc4, + 0x64,0xad,0x80,0xa1,0x81,0x3c,0x2a,0xa5,0x2c,0x86,0x6,0xf2,0x18,0x2c,0x64,0xbc, + 0x58,0xdd,0xe8,0xb3,0x19,0x8d,0x2c,0x7d,0x91,0xc6,0x59,0x16,0x88,0x76,0xa7,0x87, + 0xc5,0xed,0x3a,0x1e,0xac,0x1e,0xf0,0xa3,0xf5,0x43,0x3c,0xdf,0x3e,0xe2,0x95,0x9d, + 0x13,0x6c,0x1e,0x36,0xf8,0xb4,0x1d,0xc0,0x52,0xdb,0x4c,0xe,0xb6,0xc9,0x2e,0xd3, + 0x1,0x3f,0x7a,0xcd,0xca,0x96,0x13,0x17,0x52,0x33,0x35,0x83,0x9d,0xd9,0xc9,0xd2, + 0xc0,0x7a,0xe1,0xa4,0xb,0xbb,0x32,0xbe,0xa2,0x6,0x8d,0x66,0x79,0x75,0x49,0x46, + 0x6f,0x4a,0x2a,0xb1,0x54,0xfa,0x32,0xc9,0x84,0x54,0x1b,0xfb,0xe7,0xb6,0xb0,0x6e, + 0x13,0x98,0x4b,0xa7,0x71,0x61,0xaa,0x86,0x89,0x5a,0x29,0xf1,0x2c,0x30,0xd7,0x6f, + 0xeb,0xb0,0x81,0xa5,0xbd,0x13,0x34,0x3a,0x3d,0x67,0x20,0x43,0xec,0x8a,0xb7,0x72, + 0x85,0xdc,0xba,0x3b,0xf9,0x36,0x1,0x3e,0xfb,0x9a,0xe3,0x7e,0x63,0x62,0xcd,0x69, + 0xbf,0xf2,0xfa,0x41,0x93,0x7e,0xf6,0xe5,0x12,0xaf,0xec,0x9d,0xe0,0xcd,0xf3,0x23, + 0x78,0xeb,0xc2,0x38,0xd,0x97,0xf3,0xb1,0xfb,0x5f,0x36,0x66,0xd9,0x4c,0xa,0xdf, + 0xbb,0x32,0x45,0xe5,0x7c,0xe,0x3,0xf9,0x34,0xbe,0x78,0xb6,0xc7,0xbb,0x47,0x4d, + 0xf8,0xc6,0xbe,0x76,0x6d,0x11,0x2a,0x99,0x98,0x34,0xe4,0xe,0x67,0x2d,0x18,0x6, + 0xd9,0x90,0x26,0xcc,0x2b,0xe,0x60,0xc8,0x16,0xc4,0xca,0x19,0xf2,0x85,0xdb,0x36, + 0xd,0xfe,0x91,0xb0,0x92,0x37,0x1b,0xb6,0x80,0x98,0x28,0x70,0xd7,0x40,0xfe,0x0, + 0x8a,0xa2,0x97,0x2a,0xb9,0xa2,0xb,0xcd,0x3b,0xc5,0x60,0x78,0x6f,0xb1,0xe1,0x6a, + 0xb,0x4b,0x1d,0x23,0x47,0x34,0x54,0x2a,0xe1,0x10,0x73,0x5f,0x2d,0x6d,0x49,0x6e, + 0x94,0x44,0x8f,0x97,0xf2,0x26,0x7,0xce,0xf9,0x12,0x21,0x82,0x67,0x5f,0x2a,0x64, + 0x70,0x96,0x94,0xc4,0x32,0x52,0xd4,0xb4,0x37,0x29,0x92,0x6c,0x61,0x48,0xd2,0x80, + 0x67,0xe7,0xa,0xb7,0x8f,0x95,0x52,0x14,0xc1,0x1e,0xf3,0xe2,0x2e,0x9,0x18,0x2c, + 0x66,0xe9,0xfc,0x64,0x8d,0xde,0x38,0x37,0x46,0xa3,0x95,0x42,0xdf,0x5d,0x9b,0x49, + 0x24,0xfb,0xec,0xf1,0x36,0xee,0xad,0xec,0xdb,0x93,0xdd,0xda,0x12,0x68,0x66,0xb8, + 0x95,0x6c,0x98,0xa2,0xce,0x91,0xfc,0x10,0xeb,0x72,0x40,0xc8,0x64,0x8,0xf9,0x4c, + 0xa,0x95,0x52,0x1e,0x33,0xb5,0x22,0xbe,0x7d,0x69,0x2,0x6f,0x5d,0x18,0xc3,0xa5, + 0xe9,0x9a,0x77,0x0,0x1d,0x37,0xdb,0xd8,0xaa,0x9f,0x62,0x75,0xf7,0x24,0xe2,0xfd, + 0xe8,0xed,0xd8,0x20,0x8d,0xfb,0x15,0x88,0x5b,0x9d,0x80,0x7a,0x41,0x60,0x63,0x2b, + 0xfb,0xd9,0x3c,0x32,0x33,0x6,0xf2,0x69,0xdc,0x98,0x1f,0x79,0x61,0x88,0x46,0x74, + 0xf2,0x69,0x77,0xba,0x58,0xd9,0x6b,0xe0,0xe3,0x47,0x9b,0xf8,0xc7,0xaf,0x96,0xb0, + 0xb2,0x7b,0xcc,0x88,0xca,0xae,0x88,0x23,0xc1,0xb9,0x92,0x94,0x6b,0xd6,0xcd,0xca, + 0x53,0x49,0x24,0x65,0x4a,0x7b,0x5a,0x4a,0x8f,0x74,0x3,0x88,0x2e,0x87,0x3d,0xe5, + 0x0,0x31,0x11,0x87,0x5a,0x5d,0x37,0x6c,0x38,0xc1,0xba,0x89,0xd9,0x72,0xd1,0x8a, + 0x42,0xfb,0x1f,0xf9,0xf6,0x1e,0xf7,0xc7,0x9b,0xe6,0x1,0xa5,0x14,0xa5,0x15,0x21, + 0xad,0x42,0x58,0x30,0x93,0x4a,0x85,0x2c,0xd2,0xb4,0x42,0x3e,0xad,0x30,0x32,0x98, + 0xa7,0x99,0x91,0x32,0xe6,0x47,0x7,0x30,0xaf,0x77,0xbf,0xe3,0x95,0x82,0x4d,0xf0, + 0x8a,0x92,0xda,0xa2,0x70,0x70,0x94,0xbc,0x24,0xff,0x7c,0xda,0xee,0xa2,0xd9,0xee, + 0xe1,0xd9,0x56,0x1d,0xbf,0x7f,0xb4,0xc5,0xef,0x7f,0xbd,0xc6,0x8f,0x36,0xea,0x76, + 0xef,0xa9,0x8d,0x78,0x3c,0xb3,0x54,0x97,0x65,0x22,0x9e,0x53,0xfb,0x35,0x35,0x96, + 0x21,0xed,0xe,0x3c,0x12,0xad,0xd0,0x4a,0xd9,0x70,0xce,0xf0,0x55,0x4c,0xa5,0x8, + 0x93,0x43,0x25,0x4c,0xd6,0x1c,0xb,0x3f,0xa9,0x80,0x74,0x3,0xe,0xf7,0xba,0x43, + 0x25,0x2c,0x8c,0xd,0x62,0x66,0xa4,0x84,0x33,0x23,0x3,0x58,0x18,0x2b,0x63,0x6e, + 0xb4,0xec,0x19,0x9f,0x44,0x77,0xdb,0x49,0xc,0xfe,0xe8,0x34,0x2e,0xf3,0xbc,0xa3, + 0x7b,0xd8,0xd3,0x76,0x17,0xa7,0x9d,0x1e,0x1a,0xad,0x2e,0x96,0x77,0x8e,0xf8,0xeb, + 0xa5,0x7d,0x7c,0xf4,0x68,0x93,0xef,0xaf,0x1e,0x72,0xa3,0xd5,0x91,0x40,0x68,0x38, + 0x7e,0xb9,0xfb,0xcd,0xfc,0x8f,0xa1,0xc4,0x15,0x35,0x96,0x84,0xac,0x9d,0xc1,0x9d, + 0x7f,0x7c,0xa0,0xbf,0x8e,0x65,0xbb,0x87,0x65,0x81,0x59,0x6b,0x27,0xd9,0x68,0x3, + 0x1d,0xdf,0xcd,0xb,0xb,0xf5,0x21,0x26,0xc1,0x6b,0x67,0x87,0x0,0xd9,0x30,0x4a, + 0x23,0xc0,0x17,0xb6,0xd9,0xf6,0x3e,0x2f,0x17,0xb3,0x98,0x1d,0x19,0xb0,0x45,0x32, + 0xfa,0x8c,0x5,0x41,0x18,0x9d,0xbb,0xbc,0x7d,0xc2,0xfb,0x27,0x2d,0x7b,0x86,0x86, + 0x3d,0x7,0x59,0x83,0x40,0xe7,0xa4,0xa2,0xc3,0xe5,0x2d,0xf3,0xda,0x86,0x6d,0xf8, + 0xc2,0x4b,0x8f,0x90,0x4d,0x2e,0xd2,0x8e,0x94,0x26,0x86,0x86,0x97,0x2a,0x60,0xf0, + 0xe2,0xd6,0x31,0xb6,0xeb,0x2d,0x6c,0xd7,0x4f,0x91,0x52,0xa,0xdf,0x3a,0x37,0x46, + 0xe5,0x42,0x1a,0x99,0x74,0x2a,0x76,0x66,0x99,0x67,0x64,0x68,0x20,0x87,0xb7,0x2f, + 0x8d,0x51,0xc0,0x8c,0x94,0x4a,0xe1,0xc3,0x87,0x9b,0xa8,0x37,0x3b,0x8e,0x3b,0x13, + 0x93,0x57,0x11,0x14,0x93,0x62,0xe2,0x30,0xad,0x29,0xa0,0x20,0xdc,0x9a,0xa4,0x94, + 0x7e,0x6d,0x3,0x4a,0x11,0x71,0xa0,0x3d,0x7b,0x18,0x4a,0x6b,0xd4,0xc8,0x48,0x5e, + 0xc1,0x60,0xa4,0x40,0x8,0x44,0x5c,0x33,0x9c,0xed,0x24,0xf9,0x44,0x2,0x4d,0x8f, + 0x11,0xf2,0xda,0x58,0xe2,0x91,0x7,0x55,0xfa,0xc8,0xad,0xf8,0x7c,0x1b,0xbb,0x4c, + 0xf1,0x25,0xb5,0xc7,0xd5,0x11,0x86,0x65,0xac,0xfd,0x2e,0x38,0xc9,0xca,0x19,0xac, + 0x9d,0xe2,0x1c,0x9b,0x8,0x32,0xbc,0xcf,0x4b,0x9d,0x88,0xe5,0x28,0x5b,0x4b,0x1c, + 0x13,0x76,0x11,0xc5,0xfc,0xcd,0x36,0x2a,0x14,0xdd,0x4b,0x46,0x80,0xc4,0xd9,0xe5, + 0x6e,0xd3,0x1c,0x4c,0x32,0x93,0xc5,0x16,0x78,0x67,0x31,0x63,0xba,0x2c,0xf7,0xef, + 0x85,0xbe,0x8d,0x40,0x57,0x66,0x87,0xe8,0x9d,0x2b,0x93,0x4a,0xa6,0x53,0xf5,0x9b, + 0x6a,0xbb,0x1,0x63,0xf3,0xb0,0x89,0xd3,0x4e,0x20,0xe0,0x2f,0xc7,0x4,0x37,0x19, + 0x99,0x12,0xfe,0x20,0x22,0xab,0xe9,0x95,0x1e,0x27,0x85,0x6c,0xa,0xe7,0xc6,0x2b, + 0xb8,0x39,0x3f,0x8c,0x57,0xe6,0x86,0x71,0x71,0xaa,0x8a,0x6a,0x29,0x87,0x6c,0xc6, + 0x87,0x5,0x9b,0xad,0xe,0x1e,0xae,0x1f,0xe2,0xff,0xfe,0xe0,0x9,0x7f,0xfe,0x74, + 0x3b,0x54,0x5f,0x29,0x88,0x17,0x8a,0x62,0x49,0x9a,0xe6,0xbb,0xd5,0x9b,0x1d,0x6c, + 0x1c,0x34,0x31,0x36,0x98,0x47,0x36,0x93,0x4e,0x94,0xad,0x49,0x22,0x55,0x3f,0xbf, + 0xe5,0xa4,0xb7,0x6e,0xb7,0x87,0xf5,0x83,0x26,0xfe,0xe6,0xe3,0x67,0xf8,0xcf,0x5f, + 0x2e,0xf3,0xde,0xd1,0xa9,0x78,0x5d,0xfd,0x89,0xdb,0x35,0x36,0xd1,0x4,0x37,0xcb, + 0x55,0x13,0x5e,0x42,0xf4,0x82,0xd7,0x40,0x39,0x79,0x18,0x93,0x7d,0x50,0xe0,0x22, + 0x18,0xb4,0xf4,0x57,0x7b,0x64,0xbb,0x34,0x40,0x99,0xe8,0xc2,0xc2,0x91,0x89,0xec, + 0xf4,0x6a,0x24,0x80,0xde,0x31,0xc0,0xbe,0x98,0x3c,0xe1,0xb1,0x28,0x17,0xb2,0x54, + 0x1d,0x8,0xa7,0xcc,0xe1,0x72,0x1e,0x43,0xe5,0x3c,0x46,0xca,0x79,0x1a,0xe,0xff, + 0x8b,0x91,0xc1,0x1c,0x6,0xf2,0x19,0x64,0xd3,0x29,0x64,0x52,0xa,0xd9,0x8c,0x42, + 0x36,0xa5,0xbc,0xf5,0x45,0x3f,0x18,0x38,0x69,0x5a,0x97,0xd7,0xe6,0xb4,0xdd,0xc5, + 0xc3,0xf5,0x43,0xfc,0xe2,0xd6,0xa,0x7f,0xf5,0x6c,0x8f,0xd7,0xe,0x4f,0x70,0x74, + 0xd2,0x61,0x72,0x9d,0x12,0xbb,0x38,0x2f,0xab,0xca,0xf5,0x64,0x2e,0x46,0xd5,0xc3, + 0xc6,0x31,0xd7,0x76,0x61,0xce,0x2a,0x9d,0xac,0xe5,0x19,0x5b,0xc7,0x62,0x4b,0x0, + 0x74,0x0,0x2b,0xa5,0x34,0x92,0x34,0x5e,0x2d,0xf6,0x7d,0xd,0x7b,0xbd,0x0,0xb9, + 0x8c,0xc2,0xbf,0xff,0xfe,0x5,0x74,0x7b,0x8c,0x72,0x21,0x83,0xac,0x26,0xb4,0x65, + 0xd3,0xca,0x12,0x39,0x5f,0x44,0x60,0xfb,0x66,0xbb,0x2,0x8a,0x15,0x73,0xcb,0x7f, + 0xd9,0x3c,0xc2,0x97,0xcf,0x76,0xf8,0xb3,0xa7,0x3b,0xbc,0xbc,0x7b,0x8c,0xfd,0x93, + 0x16,0x37,0x4f,0xbb,0x38,0xed,0xf6,0xe0,0xd8,0x3,0xae,0x4a,0x89,0xf3,0x98,0xdd, + 0x83,0x1c,0x32,0xd8,0x11,0x84,0xd7,0x54,0x6b,0xc7,0x8d,0x9e,0x9c,0x8d,0x64,0x8d, + 0xad,0x1b,0x9,0x19,0xf2,0x9b,0x7d,0x9f,0xc9,0xd2,0xc1,0x19,0x1e,0x77,0xd2,0x99, + 0x5a,0x5a,0xca,0xb6,0xf9,0xa3,0x35,0xda,0x24,0xa7,0x8a,0x22,0x69,0x50,0x44,0x4e, + 0x61,0xad,0xbf,0x78,0x5a,0x29,0x8c,0x55,0xa,0xa8,0x8a,0x30,0xa9,0xe8,0x35,0xa, + 0x38,0xc0,0xd3,0xad,0x63,0xdc,0x5f,0x3f,0x40,0xaf,0x67,0xef,0xe,0x87,0x4c,0x18, + 0x87,0x62,0x16,0xd1,0xc3,0x76,0xda,0x56,0xd6,0xf,0xc2,0x86,0xa7,0x68,0xa7,0x74, + 0x8e,0x45,0x88,0x39,0xcf,0x6b,0x32,0x4,0x1,0xfd,0xc8,0x42,0x31,0x9d,0xb4,0x7a, + 0x7c,0x7b,0x69,0x8f,0x76,0x4f,0x5a,0x7c,0x7f,0xf5,0x10,0xff,0xe6,0x3b,0xb,0x34, + 0x3b,0x32,0x90,0xf8,0x5a,0x9a,0xdf,0x23,0x9f,0x4d,0xe3,0x7b,0x57,0x26,0xa8,0x5a, + 0xca,0xa2,0x32,0x90,0xa5,0x5f,0xdd,0x59,0xb,0xb6,0xeb,0xa7,0xd6,0x87,0x34,0x44, + 0x9,0x94,0x43,0xc6,0x4d,0xcb,0xca,0x3a,0x6c,0x95,0x10,0x12,0xd8,0xb5,0xc4,0x84, + 0x3,0x76,0xde,0x25,0xa6,0xa3,0x61,0xd2,0xd4,0x7,0x63,0xcd,0x67,0xfc,0xf7,0xa3, + 0xe4,0x36,0x72,0x9e,0xd2,0x81,0xb3,0xa2,0xb1,0x68,0xa1,0x34,0x68,0xf2,0xa8,0x3f, + 0x51,0xc2,0x9b,0x5f,0x4b,0x63,0x26,0x5f,0xec,0xf2,0x2c,0x98,0x1c,0x43,0x9e,0x3d, + 0x28,0x84,0x22,0xa9,0x83,0xe2,0xdb,0x1a,0x96,0x7b,0x2c,0x8e,0x8d,0x9c,0xe9,0x81, + 0xce,0x29,0x37,0x27,0x88,0xf8,0x66,0x32,0xf,0x5a,0x85,0x2f,0x74,0x8c,0xba,0xcd, + 0x76,0x17,0xc4,0x31,0x18,0xc2,0xfd,0x42,0x96,0x7c,0xac,0x19,0xc5,0x2c,0x27,0x19, + 0x57,0xcc,0xed,0x4d,0x2e,0x21,0x2c,0x3,0xdf,0xbb,0x40,0xa2,0xf0,0x2f,0xe7,0x46, + 0xcb,0xb8,0x3c,0x53,0x45,0x3e,0x9b,0xfa,0xc6,0x43,0x22,0xa5,0x8,0xa3,0xd5,0x2, + 0x32,0xeb,0x87,0xe8,0xf4,0xd8,0xc9,0x9,0x8c,0x19,0x87,0xd4,0x11,0xc2,0x1,0x11, + 0x29,0xa5,0x50,0xce,0x67,0x31,0x58,0xcc,0xa0,0x52,0xca,0x61,0xa4,0x9c,0xc3,0x54, + 0xb5,0x88,0x33,0xa3,0x65,0x9c,0x9f,0x1c,0xc4,0xc2,0xd8,0x20,0x2a,0xc2,0xbd,0x8a, + 0x99,0xd1,0xed,0xf6,0xb0,0xb6,0xdf,0xc0,0xdd,0x95,0x7d,0x7c,0xfc,0x68,0x93,0x3f, + 0x79,0xb4,0x89,0xc3,0x66,0xc7,0x1b,0x97,0x88,0x39,0x96,0x7e,0x25,0x21,0x9a,0xe7, + 0xdb,0x47,0x7c,0x6f,0x65,0x9f,0xaa,0x97,0x26,0x90,0xcd,0xc4,0x9d,0xc4,0xfa,0xc1, + 0x94,0x49,0x87,0xa3,0xfc,0x77,0x8d,0x56,0x1b,0x8f,0xd6,0xeb,0xf8,0xe0,0xde,0x6, + 0x7f,0x70,0x7f,0x3,0x3b,0xf5,0x53,0xc1,0x56,0x17,0xe1,0xdf,0x9e,0xb4,0x82,0x12, + 0xf2,0xbe,0xdd,0x8d,0xcc,0xc,0xee,0xf4,0x2,0xca,0xbf,0xc8,0xe8,0xc3,0x7c,0xdc, + 0xe4,0x9,0x4b,0x9c,0xcf,0x9a,0x6d,0xa9,0xd0,0x41,0x13,0x8a,0x95,0x54,0x50,0xb8, + 0x6,0x88,0x72,0x69,0x85,0xca,0x40,0xe,0x33,0x43,0x25,0xd4,0x6,0xb2,0xc8,0xa4, + 0x52,0x48,0xa5,0x74,0x5f,0xeb,0x28,0x74,0xc4,0x71,0x4f,0x6,0xaf,0xa8,0xe7,0xb2, + 0x69,0x94,0x73,0x19,0x94,0xb,0x69,0x94,0xb,0x59,0xaa,0x14,0xb3,0xa8,0x14,0xb3, + 0x28,0x17,0x32,0xa8,0x96,0x72,0x31,0xa8,0xb8,0x1f,0x1c,0x9c,0xd4,0x68,0xc9,0x49, + 0x34,0x7a,0x90,0xed,0x1f,0xb7,0xb0,0xba,0x7f,0x82,0x27,0xeb,0x47,0xfc,0xf5,0xca, + 0x1e,0x3e,0x7d,0xbc,0xcd,0x2b,0xbb,0xc7,0x2c,0x66,0x25,0xb9,0xac,0x64,0x31,0xa0, + 0xb0,0xd4,0xcc,0xda,0xde,0xcf,0xc8,0x2d,0xd9,0xb9,0xf6,0x39,0xd4,0x2e,0x54,0xfb, + 0x1a,0x43,0x45,0x99,0x56,0x4a,0xa6,0x8a,0xe9,0x9d,0x2a,0xa5,0x14,0xd5,0x4a,0x39, + 0x54,0x4b,0x59,0xa4,0xfa,0x98,0x19,0x81,0x80,0x6c,0x2a,0x85,0xb3,0xe3,0x83,0x89, + 0x5,0x37,0x9,0xa,0x7e,0xd1,0x3d,0x9a,0x14,0x96,0x22,0xef,0xd9,0xa3,0x66,0x7, + 0x5b,0xf5,0x26,0xb6,0xf,0x1a,0xbc,0xba,0xdf,0xc4,0x93,0xcd,0x3a,0x1e,0xae,0x1d, + 0xf2,0xa3,0xb5,0x43,0x6e,0x76,0xba,0x5a,0x4,0x6e,0x38,0x94,0x22,0x6,0xd1,0x86, + 0x90,0x84,0x44,0x36,0xf1,0x78,0xb1,0x55,0xeb,0x29,0x1d,0xcc,0xa5,0x93,0xd3,0xf4, + 0xb5,0x67,0xfd,0x85,0x98,0x8,0xcc,0x3a,0x59,0x53,0xb7,0x5,0x3a,0xbf,0x8b,0xd, + 0x4c,0xc4,0x2c,0xb4,0x46,0x86,0xe6,0x60,0x1f,0x13,0x6d,0xa8,0x61,0xd0,0x27,0x53, + 0xc2,0x35,0x4f,0x9b,0x9,0x8a,0x38,0xaa,0x6f,0xf5,0xe4,0x6c,0xe1,0x3a,0x71,0x6a, + 0x78,0x80,0xc,0xfb,0x3f,0x89,0x7b,0x40,0x20,0x3c,0xdb,0xaa,0xf3,0x83,0xb5,0x3a, + 0xba,0xc6,0x2f,0xdc,0xda,0x83,0xb1,0xb3,0xaa,0xf5,0x95,0xa2,0x6c,0x92,0x43,0xc9, + 0x63,0x6a,0x9b,0x4b,0x21,0xcf,0x40,0x16,0xe4,0x3e,0xa3,0xd5,0x13,0x6c,0x1a,0x23, + 0x8a,0x54,0x44,0x8d,0x4e,0xc0,0x8f,0x36,0x8e,0xd0,0xe9,0x31,0xb2,0x19,0x85,0x6f, + 0x9d,0x1b,0xa5,0x4b,0x53,0x61,0x2,0x5e,0x12,0xba,0x68,0x8a,0xfa,0xe5,0xe9,0x5a, + 0x48,0x3b,0x8,0x40,0x1f,0x3d,0xde,0xc2,0xca,0xee,0x89,0x8d,0x5c,0x23,0x72,0x5, + 0xd6,0xcc,0x76,0x36,0x29,0x15,0xa4,0x58,0x71,0xa0,0x99,0x10,0x9e,0x5,0x78,0xb8, + 0x6f,0xf,0xdd,0xe3,0x42,0x98,0x22,0x20,0x4b,0x82,0x64,0xcb,0x12,0x75,0x45,0x5e, + 0xbb,0xd7,0x69,0x8d,0xa5,0x7d,0x85,0xad,0x19,0x9d,0x12,0x55,0xd5,0x73,0xc3,0x72, + 0x53,0x34,0x4b,0xb3,0x2d,0xdf,0xa2,0x2,0xd1,0xd,0xa5,0x64,0xa3,0x5,0xe8,0xe3, + 0xe1,0xa0,0x8f,0xe2,0x0,0x22,0xd7,0x35,0xcc,0x12,0x40,0xda,0x32,0x27,0xe1,0x8b, + 0xde,0xa5,0xdd,0x80,0x1f,0xd5,0xa4,0xc7,0x49,0x25,0x2d,0x61,0x23,0xdb,0x4f,0x91, + 0xdc,0xce,0xc2,0x98,0x43,0x1a,0xbe,0x38,0x82,0x1b,0xbc,0x94,0xd4,0xb8,0xd5,0x93, + 0x73,0xac,0x12,0x9d,0x2d,0x4c,0xcc,0x24,0x79,0xdd,0x4e,0xf8,0x81,0xe1,0xc1,0x2, + 0xcd,0x8e,0x94,0x29,0xf3,0x2,0x8,0xcf,0xdc,0x40,0x85,0x6c,0x1a,0x6f,0x9c,0x1d, + 0x43,0xbd,0xd1,0xc1,0x97,0xcf,0x76,0x23,0xe6,0x31,0x31,0xfb,0x9e,0xd0,0x5e,0x8f, + 0x28,0x64,0x2e,0x8f,0x95,0xb1,0x30,0x5e,0xc6,0xd5,0x99,0x1a,0x2e,0xcf,0xd4,0x30, + 0x5a,0xce,0xdb,0xc3,0xde,0x64,0x2c,0xcb,0x1b,0x76,0x75,0xaf,0x81,0xdf,0xdc,0x5b, + 0xe3,0x9f,0x7f,0xb5,0x8a,0x3b,0xcb,0xfb,0x6c,0x7b,0xf6,0x48,0xd4,0x5e,0xd4,0xf6, + 0x5a,0x82,0x71,0x4f,0x36,0x8e,0xf0,0xfb,0x7,0x9b,0x7c,0x65,0xa6,0x46,0xa5,0x5c, + 0xfa,0xa5,0xdd,0xb0,0x5e,0x34,0x1d,0x9e,0xb6,0x3b,0x78,0xb4,0x5e,0xc7,0xcf,0x6f, + 0xad,0xf2,0x7f,0xfa,0x64,0x11,0x8d,0xff,0x8f,0xb6,0x37,0x6b,0xd2,0x34,0xbb,0xae, + 0xf3,0xf6,0x3e,0x99,0x55,0xd5,0xd5,0x33,0xd0,0x40,0x3,0x60,0x83,0xc4,0x40,0x91, + 0x30,0x68,0x99,0x83,0x69,0x9b,0x8e,0x10,0x15,0xe,0x85,0x15,0xa1,0x4b,0x5d,0xf8, + 0x4e,0x3f,0xc5,0xbf,0x47,0x17,0xe,0xdb,0x57,0xba,0x50,0x78,0x64,0xd0,0x41,0x8a, + 0x92,0x48,0x2,0xe0,0xd0,0x4,0xd0,0x18,0xba,0xd1,0xd5,0x43,0x55,0x57,0x65,0x4d, + 0x99,0x95,0x73,0x7e,0x67,0xf9,0xe2,0x9c,0xbd,0xf7,0xda,0xfb,0xbc,0x5f,0x83,0xa2, + 0xc3,0x8c,0x90,0x50,0xdd,0x5d,0x5d,0x9d,0xf9,0xe5,0xfb,0x9e,0xb3,0x87,0xb5,0x9e, + 0x75,0x79,0x3,0x49,0x59,0xde,0x2d,0x89,0x3,0x57,0x9c,0x2d,0xc3,0xec,0xe2,0xc5, + 0xef,0x1d,0x72,0x79,0xdd,0xe5,0xd5,0x97,0xf6,0x9,0xc1,0xec,0xb9,0x1f,0x9a,0x16, + 0x77,0x6,0x34,0x49,0xe3,0x29,0x42,0x7,0xcf,0x9e,0x12,0xbe,0xf,0xb4,0x2,0xe8, + 0xed,0x37,0x5f,0x96,0xdf,0xfb,0xd6,0x5b,0xfa,0xcf,0xfe,0xf1,0x3b,0xf2,0x9d,0x77, + 0xde,0xd4,0x97,0x6f,0x1f,0xc8,0xdd,0xdb,0x87,0x9b,0x59,0xec,0xbf,0xcc,0xf2,0xb7, + 0xaf,0x83,0xde,0x27,0xec,0xf9,0xfb,0x76,0x9b,0xfb,0xe8,0x7b,0xcf,0xce,0xae,0xe4, + 0xdd,0x7b,0x4f,0xf1,0x7f,0xff,0xed,0x27,0xf2,0x57,0xbf,0x78,0x8c,0x7,0x4f,0xcf, + 0x60,0x6,0xe7,0x30,0xea,0xf9,0x57,0xe0,0x63,0x6,0xf5,0x63,0x8c,0x7b,0x26,0xd0, + 0x76,0xcc,0xc6,0xbc,0x39,0x8,0x3d,0x7a,0x81,0x49,0x4,0x73,0x93,0xc8,0xf8,0x1b, + 0xad,0xa9,0xc2,0x5d,0x0,0x4d,0x5e,0xbe,0x73,0x28,0xaf,0xde,0x39,0x64,0xb9,0x70, + 0xfa,0xbf,0x83,0xd6,0xe4,0xa0,0xed,0x57,0x5a,0xff,0xa7,0xd2,0xdb,0xb6,0x52,0xd1, + 0x4c,0x53,0xf0,0xe4,0xf4,0x4a,0xde,0x7f,0xf0,0x1c,0xdf,0x7f,0xff,0x48,0xbe,0xf7, + 0xfe,0x11,0xde,0xfb,0xf4,0x39,0x2e,0x26,0x13,0xdc,0x33,0xd8,0x48,0x8c,0x36,0x90, + 0x9c,0xa0,0xcf,0x13,0x86,0x61,0x85,0x78,0xe2,0xba,0xa9,0xd7,0x1b,0x20,0x1d,0x33, + 0x9f,0xdd,0x85,0x6f,0xb0,0x7f,0x3e,0xc7,0xed,0xaa,0x7d,0x5e,0xe4,0x24,0x8c,0x6b, + 0x2a,0xf4,0xfb,0x22,0x8e,0x94,0x78,0xc4,0x73,0x92,0x3f,0x6c,0x3,0x14,0x42,0x3f, + 0x36,0xbd,0x12,0x49,0x56,0x8d,0x97,0x78,0x9,0x79,0x4,0x6d,0xaa,0x5f,0x7b,0xeb, + 0x55,0xfd,0xd5,0xb7,0xb2,0x48,0xb1,0xae,0x78,0x76,0x80,0xfc,0xe2,0xe8,0x85,0xbc, + 0xff,0xe8,0x4,0xd7,0x1d,0xc4,0x9b,0xcf,0x97,0xb9,0x68,0x1b,0xb4,0xbb,0x46,0x6f, + 0x1c,0xe5,0xec,0xc,0x77,0x31,0xdd,0xf8,0x94,0x39,0xc,0xd2,0xa3,0xfa,0x83,0xe9, + 0xc2,0xa,0x49,0x42,0x4c,0x55,0xd5,0xf,0x1f,0x9f,0xe2,0x5f,0xff,0xe9,0xcf,0xe5, + 0xde,0xe3,0x53,0xf9,0x1f,0xfe,0xe0,0x9b,0xfa,0x9b,0x93,0x2f,0xb0,0xef,0x8c,0x7e, + 0xf5,0xee,0x2d,0xf9,0xdd,0x6f,0xbe,0xa5,0x2f,0xbf,0x74,0x4b,0xbf,0xf0,0xda,0x4b, + 0xfd,0x7f,0xf9,0xf,0x1f,0xc8,0xd3,0xb3,0xcb,0x91,0x60,0x27,0xa2,0x21,0xea,0xa0, + 0x20,0x36,0xf8,0x18,0xdd,0x43,0x5b,0xfa,0x44,0x3b,0xcf,0x9f,0xaa,0x9a,0x17,0x71, + 0x9c,0x24,0x73,0x89,0x3e,0xbb,0x75,0x1f,0x67,0xcd,0x42,0x70,0xbc,0x4d,0x23,0xf9, + 0x49,0x4b,0x37,0x6d,0x9c,0x85,0x48,0x4e,0x6b,0x2b,0xe4,0xd3,0x6e,0xbd,0x94,0x2c, + 0xb7,0xc7,0xc2,0x46,0x67,0x67,0x8e,0xb3,0x95,0x5,0xe1,0xec,0x57,0x42,0x43,0x7c, + 0xd,0x4d,0x66,0x7c,0xaa,0xf2,0xbe,0xb1,0xf4,0x84,0x1a,0xfb,0x1e,0x8f,0x74,0x3, + 0xe5,0xe8,0x2a,0x69,0x2c,0xc8,0xcf,0x2a,0x69,0xcf,0x2e,0x91,0x9f,0xb4,0xac,0xc0, + 0x63,0x7a,0xce,0x30,0xe,0x27,0x19,0xf1,0x3,0xeb,0xff,0x72,0xf3,0x8b,0x3e,0xd6, + 0xac,0x73,0x37,0xa5,0x2a,0xaf,0xdd,0xbd,0x25,0x7c,0xd9,0xed,0x1b,0x77,0x8a,0x88, + 0xbc,0x74,0xeb,0x40,0xfe,0xf0,0xbb,0x5f,0x95,0xb7,0xdf,0xb8,0x2b,0xdf,0xf9,0x95, + 0x37,0xe5,0x83,0x87,0x27,0xf2,0xf8,0xe4,0x52,0xae,0x6f,0xba,0xdc,0x3a,0x6c,0xf2, + 0xfa,0xdd,0x5b,0xa3,0xb,0x7f,0xf9,0x8e,0xbc,0xfe,0xf2,0x6d,0x79,0xfd,0xee,0x6d, + 0x79,0xe3,0xe5,0x5b,0x62,0x9d,0xdb,0x1b,0xaf,0xdc,0x91,0x37,0x5f,0xb9,0x23,0x5f, + 0x7c,0xe5,0x76,0xba,0x3c,0xd8,0x12,0x77,0xef,0xd1,0x89,0xfc,0xf9,0xcf,0x1e,0xe1, + 0xaf,0x3f,0x7c,0x2c,0x3f,0x7f,0x70,0x2c,0x1f,0x3d,0x3a,0x99,0xdc,0x12,0x84,0x8a, + 0x3b,0x28,0x15,0x29,0xdd,0x6a,0xb2,0x54,0x8c,0xff,0x2c,0xf7,0x9f,0x9f,0xc9,0xdf, + 0x7c,0xfc,0x54,0xff,0xfa,0x17,0x8f,0x71,0xf7,0xd6,0x81,0xbe,0xf5,0xfa,0xdd,0x4, + 0xd9,0xf8,0xbc,0x3,0x73,0x4b,0xcc,0xf4,0xf8,0xe4,0x42,0xfe,0xea,0x83,0x23,0xfc, + 0xd1,0xbb,0x9f,0xca,0x5f,0xfd,0xe2,0x31,0xce,0xaf,0x6e,0xca,0x9f,0xa1,0xb2,0xf5, + 0x57,0x5a,0x5c,0xf4,0x1e,0x4f,0x4d,0x3f,0xd4,0xab,0x5d,0x97,0x27,0x2f,0x2e,0xe4, + 0xcd,0x57,0x6e,0xc9,0x1,0x59,0xb0,0xea,0xe,0xdb,0x9f,0x41,0x52,0x8e,0x7a,0x2c, + 0xa1,0x78,0xf1,0x19,0x13,0x7a,0xde,0x8f,0xcf,0xbf,0xf8,0xed,0x6f,0xbe,0xa5,0xff, + 0xf2,0xbf,0xf9,0xa6,0x7e,0xf3,0xcb,0xaf,0xcb,0xeb,0x2f,0xdf,0xfa,0xa5,0xa3,0xee, + 0xbf,0xcf,0x45,0xb2,0xaf,0xd3,0xde,0xda,0xe9,0x6e,0x75,0x99,0x5b,0x4a,0x76,0xfb, + 0x73,0x2f,0xae,0x6f,0xe4,0x67,0xf,0x8e,0xe5,0xdd,0x8f,0x9e,0xe2,0x67,0x9f,0x1e, + 0xcb,0x7,0x8f,0x4e,0xf0,0xe0,0xe9,0x29,0x8e,0x5e,0x5c,0x6,0x1d,0xcc,0x1d,0x81, + 0xbe,0xaf,0xb3,0xee,0xf,0x61,0x7c,0xa0,0x90,0x15,0x14,0xb7,0x0,0xc2,0x74,0xac, + 0x98,0x81,0x9e,0x95,0x3b,0xa1,0x73,0xda,0xd8,0x54,0x69,0x71,0xe1,0x9d,0xba,0x8a, + 0xe0,0xee,0xed,0x5b,0x5a,0xad,0x76,0xfb,0xac,0x62,0x75,0xe7,0xfd,0xcb,0xc4,0x9b, + 0xfb,0x3e,0x3f,0xfb,0xfb,0x47,0xc7,0x17,0x72,0xef,0xe8,0x85,0x7c,0xfc,0xe4,0x14, + 0x1f,0x3f,0x39,0x95,0xfb,0x4f,0xcf,0x71,0x74,0x7c,0x2e,0x47,0x27,0x57,0xf2,0xe8, + 0xf8,0x1c,0x17,0x33,0x9b,0x3c,0xca,0xf0,0xd0,0x19,0x84,0x2a,0x68,0x46,0x7a,0x44, + 0xd8,0x21,0xdf,0x4f,0x10,0xbb,0xe8,0x47,0x5c,0xe5,0x4c,0x4c,0x93,0xde,0x23,0x90, + 0x7b,0xcc,0x63,0x61,0x77,0x78,0xb3,0x4f,0x13,0xf6,0xe1,0x77,0xdb,0xb7,0x53,0x37, + 0x85,0xba,0xec,0x69,0x1e,0x2c,0xe9,0x17,0x28,0x9a,0xe5,0xb0,0x8d,0xf0,0x11,0x37, + 0x55,0x35,0x21,0xc4,0x42,0x44,0x8e,0x34,0x55,0x79,0xfb,0xcd,0xbb,0xf2,0x2b,0x6f, + 0xbd,0xfc,0x39,0xd9,0xe7,0x22,0x9f,0x3e,0x3d,0x97,0x87,0xc7,0x97,0x62,0x97,0xb9, + 0x79,0xe9,0x66,0x2c,0x2d,0xc2,0x96,0x26,0xd0,0x36,0xa3,0xe2,0xfa,0x98,0x61,0x75, + 0xf1,0xe3,0x34,0x8d,0x31,0x98,0x44,0xcb,0x8a,0x2d,0x1e,0xd,0xfb,0xba,0x46,0xa1, + 0x48,0xa8,0xc5,0x31,0xce,0xb8,0xea,0x82,0xbf,0xf8,0xe0,0xb1,0x9c,0x5e,0x77,0xfc, + 0xd3,0xef,0x7c,0x45,0x7f,0xff,0x5b,0x6f,0xe9,0xaf,0xd3,0x64,0xa7,0xbe,0x6b,0xad, + 0xa9,0x7c,0xeb,0xcb,0xaf,0x88,0xea,0x57,0x5b,0x6b,0xda,0xff,0xf8,0x47,0xf,0xe4, + 0xc7,0x9f,0x3e,0x13,0x2b,0x46,0xfd,0x53,0x77,0x17,0x80,0xef,0x92,0x74,0xd6,0x66, + 0xf3,0x3,0x1f,0xac,0xf7,0xb9,0x1e,0x1f,0xf3,0x98,0x29,0xda,0xc2,0xf8,0x77,0x20, + 0x3a,0x16,0x2d,0xd2,0xc7,0xb3,0x0,0x90,0xcd,0xab,0xcf,0xfd,0xa,0x8b,0x2,0x23, + 0xca,0x3d,0xbf,0x53,0xf6,0xb0,0xc1,0x3a,0x69,0x3a,0xd3,0xad,0xd9,0x29,0x9,0x82, + 0xa0,0xe9,0x75,0x4f,0x17,0x36,0x39,0xdd,0xa1,0x4b,0xc8,0xda,0xe8,0xe4,0xd5,0xb1, + 0xeb,0x87,0xc1,0xe2,0xe,0x8d,0x3,0x68,0xe8,0xe,0x51,0x1a,0xa3,0x72,0x68,0x8b, + 0x26,0xab,0x70,0xb2,0xab,0xe5,0xa4,0xc4,0x69,0x66,0x9d,0xc1,0x97,0x1a,0x28,0x19, + 0xd5,0xcc,0x93,0x6,0x2f,0x5d,0x4d,0xe9,0xde,0xe2,0x32,0xcf,0x16,0xf5,0x59,0x86, + 0x6b,0x64,0x6a,0x47,0xb6,0x4b,0xfb,0x25,0x7b,0xdb,0xf8,0xbf,0xdb,0xb7,0xe,0xe4, + 0xd7,0xbe,0xf4,0x9a,0x7c,0xe5,0xf5,0x97,0xe4,0xeb,0x6f,0xbd,0x22,0x3f,0xb9,0xff, + 0x5c,0x3e,0x3a,0x3a,0x95,0xcb,0xeb,0x9d,0xdc,0x39,0x6c,0xf2,0x85,0xd7,0xee,0xc8, + 0x5b,0xaf,0xda,0xee,0xf4,0x25,0xf9,0xe2,0xab,0x63,0x7f,0xba,0x75,0x48,0xdb,0x7f, + 0xaf,0x77,0xc8,0xc5,0xf5,0x8d,0x9c,0x5d,0xee,0xe4,0xc1,0xf3,0x33,0x79,0xf7,0xde, + 0x53,0xfc,0x6f,0x3f,0xf8,0x48,0x7e,0xfc,0xc9,0x33,0x74,0x64,0xa3,0x94,0xf2,0x58, + 0x3,0x31,0x46,0x36,0x9e,0xad,0x8,0x15,0xbc,0xf3,0x7,0xf8,0xf1,0xe3,0x33,0xfc, + 0xe9,0x7b,0x9f,0xe9,0xed,0xc3,0x3,0xfc,0xc1,0x6f,0x7c,0x59,0x5f,0x7f,0xf9,0xce, + 0x5e,0x86,0xf3,0xbe,0x5f,0x3,0x22,0xcf,0xce,0xae,0xe4,0x2f,0x7f,0xfe,0x8,0xff, + 0xcf,0xdf,0xdd,0x97,0x3f,0xf9,0xd1,0x7d,0x8c,0x9d,0x63,0xcb,0x1c,0x24,0xcd,0x25, + 0xf8,0x32,0x4a,0x28,0x9,0xb1,0x2c,0xb4,0x3e,0xbf,0xea,0xfa,0xd1,0xd1,0xa9,0x7c, + 0xf1,0xd5,0x3b,0xe,0x24,0x59,0x4,0x62,0x4d,0xa5,0xda,0x2c,0xaa,0xd0,0xc3,0xfc, + 0xe4,0x1,0x27,0xe1,0xdf,0x31,0x4c,0xea,0xdf,0xf8,0xd2,0x6b,0xf2,0xdb,0xdf,0x78, + 0xeb,0x3f,0xa9,0x3b,0xfe,0xfb,0x4c,0x2f,0xf6,0xfd,0x35,0xaf,0x38,0xb6,0xfc,0xe3, + 0x5c,0xd0,0x19,0xa5,0xec,0xe2,0xba,0xcb,0xd5,0x6e,0x27,0xcf,0xcf,0xaf,0xe5,0x93, + 0xa3,0x17,0xf8,0xde,0xfb,0x8f,0xe5,0x2f,0xde,0x3f,0xc2,0x7b,0x9f,0x3e,0x3,0xc5, + 0x4f,0x88,0x93,0x66,0xd,0x34,0x11,0x1f,0xad,0x77,0x95,0xb0,0x51,0x85,0xfd,0x9b, + 0x8a,0xfa,0x33,0xcb,0x40,0x17,0xd2,0xca,0x80,0x8d,0xb2,0x4d,0x85,0x26,0x77,0xd4, + 0x84,0xcc,0xb8,0xca,0x83,0x61,0xbb,0xdc,0xfa,0xfc,0xf6,0x5,0xee,0xd4,0x82,0xf6, + 0xf3,0x8a,0xa4,0x28,0x90,0x20,0x57,0xbb,0x2e,0x57,0xd7,0x5d,0xae,0x77,0x3b,0x39, + 0xbb,0xde,0xc9,0xd1,0xf1,0xb9,0x7c,0xfc,0xf8,0x14,0xef,0xdd,0x3f,0x96,0x9f,0xdc, + 0x3f,0xc6,0xcf,0x3f,0x3b,0x96,0x93,0xf3,0x6b,0x1b,0xfe,0xfa,0xd4,0xd3,0x2c,0x67, + 0xce,0x60,0xd,0x21,0xff,0x3c,0xe2,0x3d,0x53,0xd0,0xfc,0x68,0x73,0x17,0x3e,0x27, + 0x1d,0x10,0xa0,0x35,0x78,0x3a,0x89,0x5d,0xf0,0x90,0x3e,0x9f,0xcd,0xe,0xa3,0x99, + 0x40,0x21,0xcd,0xc6,0xec,0x53,0x66,0x25,0xf0,0xef,0xe,0xe5,0xed,0x1,0x15,0xac, + 0x88,0x98,0xb3,0xb9,0x6a,0x9e,0x7a,0x37,0x69,0xe3,0xe0,0x4e,0xcd,0x4b,0xf2,0xe, + 0xc7,0x38,0xf4,0x40,0xe5,0xed,0x37,0xee,0xca,0x57,0xde,0x78,0x59,0xf,0x29,0x71, + 0x91,0xcf,0xb9,0x27,0x2f,0x2e,0xe4,0xe7,0xf,0x4f,0xf0,0xf8,0xf4,0x12,0xf0,0x54, + 0xb5,0x71,0xf,0x74,0x50,0xbd,0xe1,0xbd,0xa9,0x37,0x89,0xe8,0x1e,0x6b,0xe0,0x3d, + 0xab,0x3f,0x8a,0x1e,0x9c,0x13,0x38,0x27,0x1b,0xea,0x24,0x74,0x19,0x68,0xaa,0x67, + 0xc3,0x78,0x1a,0xcd,0xeb,0xb3,0x8b,0x6b,0xfc,0xfb,0x9f,0x3f,0x92,0xf3,0xeb,0x9d, + 0x5c,0xdc,0xdc,0x88,0xaa,0xea,0x3b,0x5f,0xb8,0x2b,0xb7,0x4b,0xd1,0x68,0x4d,0xca, + 0x9d,0x5b,0x87,0xf2,0x9b,0x5f,0x7d,0x5d,0x5e,0xbe,0x73,0xd8,0xa0,0xda,0x8f,0x4e, + 0x2f,0xf1,0xe8,0xe4,0xc2,0xf4,0xb1,0x11,0xdf,0xd3,0x7,0xe,0xd6,0x50,0x87,0x1a, + 0x7c,0xdb,0x79,0x91,0x8f,0xff,0x37,0x9e,0x82,0x36,0x7f,0xd,0x92,0x42,0xe,0x3a, + 0x8b,0x1e,0xcc,0x17,0xca,0x14,0xca,0x10,0x91,0x3,0x9a,0x98,0x26,0xc8,0x8b,0xa6, + 0x71,0x46,0x86,0x38,0x38,0xf9,0x8a,0x62,0x93,0x19,0xdf,0x98,0x71,0x34,0x9d,0x33, + 0x2c,0x54,0x58,0xdf,0xea,0x89,0xa7,0x89,0xed,0x4f,0xed,0x7c,0x9f,0xab,0xe2,0x43, + 0x8a,0x33,0x95,0xf4,0x73,0x61,0xb7,0x9b,0x85,0xad,0x6c,0xa0,0xd1,0xb8,0x7b,0xda, + 0xe7,0xc9,0xb,0x9b,0x3,0x49,0x35,0x13,0x4a,0x5b,0x89,0x2f,0xcc,0xe3,0xf5,0x49, + 0x92,0xf3,0x7d,0x94,0xc6,0x88,0xd6,0xf,0x73,0x49,0xf,0xbd,0x8a,0xc8,0x35,0x8d, + 0xbb,0x3f,0x4f,0x8c,0xc3,0x7f,0xff,0xf6,0xad,0x43,0xf9,0xd6,0xdb,0xaf,0xc9,0xaf, + 0x7c,0xe1,0x15,0xb9,0xba,0xd9,0x79,0x77,0x7c,0xd0,0x54,0xe,0x55,0xe5,0xe0,0x40, + 0xe5,0x40,0xd5,0xa1,0x20,0x5b,0x81,0x10,0xf6,0x7f,0xcf,0xcf,0xae,0xe4,0xdd,0x7b, + 0x8f,0xf1,0x1f,0x7f,0xf6,0x48,0x7e,0xf8,0xf1,0x53,0x7c,0xf2,0xe4,0x54,0x4e,0x2f, + 0x6f,0x6,0xfe,0x5f,0xd9,0x60,0x44,0xa,0x71,0x14,0x6b,0xdf,0x2c,0x26,0xc3,0xe3, + 0xde,0x3c,0xb7,0xe4,0x7a,0xd7,0xe5,0x4f,0xfe,0xee,0x3e,0xce,0x2f,0x77,0xf2,0xd2, + 0xad,0x3,0xf9,0xbd,0x6f,0xbd,0x95,0xc2,0x19,0xea,0xc5,0xb9,0xb5,0xd3,0xfc,0xe8, + 0xf1,0xb,0xf9,0xb7,0xdf,0xbf,0x87,0x3f,0xff,0xd9,0x11,0x7e,0xfe,0xd9,0xb1,0x5c, + 0xdc,0x8c,0x16,0x45,0xeb,0x3c,0x48,0xf3,0xae,0x19,0x31,0xbd,0x5,0x53,0x82,0x3b, + 0x56,0xe7,0xd9,0xd3,0xf3,0x2b,0xfc,0xed,0xc7,0x4f,0xe5,0x9d,0xb7,0x5e,0x51,0x8b, + 0x59,0x5c,0xc6,0xb0,0x89,0x42,0x98,0x62,0x48,0x25,0x98,0x50,0x8e,0x1c,0x86,0xbf, + 0x30,0x1a,0x0,0x5,0x90,0x43,0x62,0xb,0x48,0xf2,0xf,0xb9,0xd0,0xff,0x21,0xff, + 0xb7,0x45,0x50,0xf3,0xbd,0xef,0xc5,0x8d,0xbc,0x77,0xff,0x19,0x7e,0xf0,0xc1,0x63, + 0xf9,0xf1,0xfd,0x63,0x7c,0xf8,0xe8,0x44,0x8e,0xcf,0xae,0x70,0x79,0xdd,0xbd,0xe3, + 0xe,0xa1,0x1b,0x83,0xf,0x40,0xc9,0x5d,0xe2,0x8b,0x5e,0xf2,0xd0,0x81,0x42,0x1e, + 0xb0,0x51,0x6f,0x91,0x14,0x8e,0x8c,0xea,0x64,0x4e,0x71,0xbb,0x68,0xe6,0x48,0xcd, + 0x1d,0x68,0xd3,0xd6,0xfe,0xbe,0x1e,0x44,0xf9,0xdc,0xcf,0xfe,0xf3,0x7c,0xf7,0xc7, + 0x17,0x37,0x72,0xef,0xf1,0xb,0xf9,0xf9,0x83,0x63,0xfc,0xec,0xe1,0x89,0xfc,0xe2, + 0xd1,0x9,0x1e,0x1d,0x5f,0xc8,0xf1,0xf9,0x35,0xae,0x77,0x5d,0xae,0x26,0xb6,0x75, + 0x32,0xa3,0x46,0xd3,0x84,0xa0,0x49,0x85,0x40,0xb0,0x36,0x6a,0xf3,0xdc,0xc4,0x64, + 0xb4,0xce,0xfb,0x9c,0x82,0x70,0x1,0x85,0xa1,0x5a,0xed,0xcd,0xc1,0x54,0x83,0x61, + 0x4e,0x2d,0x0,0xa0,0x8f,0xc2,0xa1,0x1b,0xd,0x1f,0x72,0x40,0xf7,0x78,0xdc,0x23, + 0xc,0xa4,0x8a,0x4b,0xae,0xf9,0xc9,0x35,0xba,0xf2,0x9,0xaa,0x6,0x43,0x5a,0x54, + 0x63,0xd,0xad,0x2d,0x3b,0x3f,0xd4,0x2b,0x25,0x79,0xf3,0x95,0xdb,0xfa,0xc5,0x57, + 0x6f,0xf,0x1f,0x49,0xf1,0x74,0x3,0x90,0xcf,0x8e,0x2f,0xe4,0x6f,0x3f,0x7e,0x2a, + 0xcf,0x2f,0x6e,0x52,0xb4,0x35,0x75,0x12,0xb3,0x3f,0x1d,0xff,0x9f,0x5f,0x53,0x7, + 0xe2,0x5a,0x1,0x31,0xc9,0x3a,0x6b,0x55,0xe6,0x67,0x68,0x33,0xa0,0x3e,0x42,0x5f, + 0x35,0x44,0xfc,0x9c,0xea,0x67,0xbb,0x63,0xde,0x30,0x47,0x50,0x5,0x44,0xf5,0x6f, + 0x3e,0x7e,0x8a,0x47,0x2f,0x2e,0xe5,0x83,0xa3,0x33,0xf9,0xef,0x7f,0xeb,0x2b,0xf2, + 0x4f,0x7e,0xe3,0x2b,0xba,0x4f,0x50,0xda,0x5a,0x93,0x77,0xde,0x7c,0x59,0xfe,0xd9, + 0x6f,0x7d,0x55,0x6f,0xdf,0x6a,0xed,0xdf,0x7c,0xff,0x23,0xfc,0xe2,0xf1,0x8b,0x1e, + 0xc2,0x43,0xb0,0xf7,0xd7,0xa2,0xf0,0xe6,0x5e,0xa9,0xcf,0xcb,0xbc,0xa9,0xc,0xb9, + 0xe3,0x40,0xc1,0xcd,0x8e,0x5d,0x6d,0x2c,0x8a,0x3e,0x7f,0xe8,0xdd,0xdb,0x6a,0xf4, + 0x9c,0x38,0x27,0x59,0x45,0x94,0xc6,0x3d,0x9c,0x11,0x3,0x59,0x38,0x17,0xe9,0xef, + 0x73,0xf6,0x5,0xa0,0xcb,0x40,0x5b,0xb2,0x4f,0x2f,0x35,0xcf,0x5b,0x74,0x76,0x3b, + 0x29,0xe,0x39,0x88,0x21,0x2a,0x89,0xaa,0xfd,0xd5,0x94,0xc1,0xae,0xd5,0xae,0x94, + 0xdc,0xe,0x79,0xa4,0x8a,0x1c,0x8b,0x3e,0xdc,0x9d,0x8d,0x70,0x9c,0xa6,0x43,0x98, + 0x33,0x83,0x49,0xc9,0x81,0xe1,0x3b,0x6d,0x9c,0xa3,0xd4,0xc1,0x43,0x15,0x84,0x71, + 0xe7,0x24,0x22,0x88,0xa8,0x5e,0x5e,0xef,0xe4,0xfc,0xea,0x46,0x5e,0xbe,0x73,0x2b, + 0x9,0x92,0x6a,0x47,0x51,0xbb,0x88,0xa1,0xca,0x3d,0x10,0x91,0x5b,0x7b,0xad,0x60, + 0x5b,0x9d,0xff,0xd5,0xf5,0x8d,0x1c,0xbd,0xb8,0x92,0xa7,0x2f,0x2e,0xe5,0xc1,0xb3, + 0x33,0xdc,0x3b,0x7a,0x21,0x3f,0xb9,0x7f,0x8c,0x1f,0x7d,0xf2,0x4c,0x3e,0x7e,0x7c, + 0x1a,0x69,0x3d,0x1e,0x9f,0xa,0x70,0x90,0xc7,0x66,0xfe,0x1,0x18,0x93,0x3f,0x7f, + 0xd1,0xda,0x78,0x89,0xa4,0xc9,0x65,0x17,0x79,0xf7,0xe3,0xa7,0xf2,0xca,0x4b,0x87, + 0xf2,0xe0,0xf9,0xb9,0xfc,0xc6,0xd7,0x5e,0x97,0x2f,0xbf,0x7e,0x57,0x5f,0xbf,0x7b, + 0x4b,0x5e,0xbb,0x7b,0x7b,0x11,0xcb,0x5c,0x5d,0xdf,0xc8,0xf3,0xf3,0x6b,0x79,0x7c, + 0x72,0x29,0x9f,0x3d,0xbf,0xc0,0xdf,0x7c,0xf8,0x58,0xfe,0xec,0x27,0xf,0xf1,0xc1, + 0xa3,0x13,0xdc,0xec,0x3a,0x59,0xad,0xd,0x5f,0x91,0xa2,0xa1,0xb2,0x40,0x7c,0xee, + 0x6e,0xd2,0x43,0x3a,0x1b,0x3a,0xd0,0x96,0xf7,0xe9,0xd9,0xa5,0x7e,0xef,0x83,0x23, + 0x7c,0xfb,0xed,0x57,0xe5,0xdb,0x6f,0xbf,0x9a,0xe2,0x6a,0x81,0x29,0xaa,0x6e,0x2a, + 0x32,0xf,0xe9,0xfc,0x27,0x9a,0x28,0x4,0x2e,0xac,0x1c,0xd3,0x4e,0x25,0x44,0xa9, + 0x79,0xd2,0x55,0xae,0x76,0x5d,0x2f,0xaf,0xae,0x17,0xe5,0xff,0xe7,0x75,0x91,0xff, + 0x5f,0x2f,0xef,0x1a,0x6b,0xca,0xcf,0xd3,0xd5,0xcd,0x4e,0x9e,0xbc,0xb8,0x92,0x47, + 0x27,0xe7,0xf2,0xf0,0xf9,0x5,0xee,0x3d,0x7e,0x21,0xef,0x3f,0x7c,0x81,0x9f,0x3e, + 0x78,0x2e,0x1f,0x1d,0x9d,0xe2,0x72,0xd7,0xe3,0x8c,0x18,0x56,0x37,0x90,0x54,0x2, + 0x26,0x3a,0x56,0xff,0xa0,0x3d,0xe8,0x1d,0x7e,0x9b,0x63,0x9c,0xff,0x8,0xe1,0xfb, + 0x16,0x16,0x21,0x68,0xab,0xda,0xf2,0xb1,0x34,0x9f,0xc9,0x2e,0xb4,0xba,0xa,0xcf, + 0xd4,0xbc,0x5c,0x14,0x97,0x37,0x5d,0xb7,0xde,0x81,0x2d,0x11,0xdb,0xbe,0x4b,0xdb, + 0xc3,0x5b,0x2e,0x6f,0xe4,0xec,0xf2,0x46,0x5e,0x5c,0xdd,0xc8,0x8b,0x8b,0x6b,0x39, + 0x3e,0xbf,0xc6,0xd3,0xd3,0x4b,0x79,0xf8,0xfc,0x42,0xee,0x3f,0xbf,0x90,0x4f,0x9f, + 0x9e,0xe2,0xa3,0x27,0x67,0xf2,0xd9,0xf3,0x33,0xec,0x42,0x9f,0xe,0x37,0x9,0x2b, + 0x9d,0x42,0xc1,0x39,0x12,0x1a,0x51,0xf0,0xe7,0x85,0x79,0x99,0xda,0x2c,0xc3,0x46, + 0xec,0x32,0xf3,0xb8,0xe0,0xbb,0x74,0x0,0x5d,0x1d,0xf2,0x99,0x94,0xec,0x10,0x1, + 0xe,0x4,0x2,0xe3,0x8c,0x79,0x95,0x8d,0xe8,0xdc,0x7d,0x1f,0xe9,0x45,0x2f,0x48, + 0xd1,0x6e,0xeb,0x4a,0x78,0x84,0xdd,0x5c,0xb6,0xab,0x8e,0xae,0x78,0x2e,0xff,0xa7, + 0xd0,0xd8,0xff,0x3a,0xb2,0xe,0xe6,0xf1,0xd7,0x74,0x68,0x1a,0x6e,0x1f,0x38,0xe1, + 0xb1,0x4e,0x92,0x1e,0x9d,0x5c,0xe2,0xdd,0x4f,0x9e,0xe3,0xd9,0xc5,0x15,0x9c,0x4a, + 0xa5,0x8a,0xe1,0xa8,0x6e,0x73,0xba,0xa0,0xf3,0xe2,0xe,0xf1,0x9f,0x99,0x48,0x1c, + 0x10,0x37,0x5f,0x6c,0xcf,0xe3,0x20,0xa3,0x70,0x77,0xe2,0x5d,0x11,0x61,0x4c,0xb5, + 0x3e,0x84,0x2f,0x1c,0xc2,0x3a,0xdb,0x98,0x44,0x4,0x37,0xa2,0xfa,0xd1,0xf3,0x73, + 0x5c,0xbe,0xff,0x48,0x6e,0x0,0xbd,0xbc,0x1,0x7e,0xfb,0xeb,0x5f,0xd0,0x2f,0xbf, + 0xfe,0xd2,0xa6,0xf5,0xf3,0xe0,0xa0,0xc9,0x37,0xde,0x7a,0x59,0x55,0xbf,0x22,0x1f, + 0x3d,0x39,0x93,0xe7,0x97,0x37,0xfa,0xf4,0xf4,0x32,0xc6,0xdc,0x88,0x19,0xa1,0x9a, + 0x60,0xc2,0x2f,0x72,0xdb,0xa1,0xb7,0x51,0x93,0xd,0x96,0x9c,0xc7,0xb,0x5a,0xbc, + 0x8e,0x4c,0x36,0x8d,0x1f,0x62,0x4d,0x89,0x51,0x31,0xff,0x3,0x84,0xb9,0xc9,0x6a, + 0xd4,0xb2,0x4a,0xdc,0xfa,0x35,0x9f,0xf7,0xac,0x30,0x17,0xf1,0xf7,0x10,0x8c,0xfa, + 0x85,0xe1,0xef,0xc2,0x59,0x25,0xa0,0xdd,0x79,0x61,0x83,0x1c,0x72,0x5,0x7,0x66, + 0xfe,0x14,0x1d,0x9c,0xd2,0xc5,0xc,0xba,0x64,0x98,0x69,0xc3,0xe8,0x48,0x4f,0xac, + 0x88,0x50,0x3,0xf3,0x32,0xc4,0x8,0xb0,0x5c,0x74,0x72,0x30,0x2b,0x40,0x73,0x20, + 0xcc,0x1d,0x93,0x4e,0xee,0x7b,0xa8,0xdd,0xfd,0xc5,0x10,0x67,0x2b,0xa9,0x8f,0x2d, + 0x70,0x7c,0x7e,0x8d,0x27,0x27,0x97,0x38,0x6c,0x4d,0x6f,0xdf,0x3a,0xf8,0xdc,0xb1, + 0xfb,0x2f,0xdb,0x99,0x6e,0x29,0x6d,0xe3,0x20,0x83,0x5c,0xdd,0xec,0xe4,0xe3,0x27, + 0x67,0xf2,0xee,0x47,0x4f,0xf0,0x57,0xbf,0x78,0x22,0x3f,0xfa,0xf4,0x19,0x3e,0x7e, + 0x7c,0x8a,0xcb,0x9b,0x9d,0xef,0x7c,0x91,0xd7,0xc5,0x73,0x51,0xa6,0xe1,0x7,0x28, + 0xde,0xe8,0xa0,0x9d,0xcc,0x7,0xa,0x71,0xc8,0xfa,0xe5,0x2a,0x22,0xcf,0x2e,0xae, + 0xf5,0x7f,0x7f,0xf7,0x53,0xfc,0xcd,0xc7,0xcf,0xf0,0x9f,0xbd,0xf3,0x86,0xfe,0xfe, + 0x37,0xbf,0x24,0xdf,0xf9,0xda,0x6b,0xf2,0xf5,0xb7,0x5e,0xd3,0x37,0x5e,0xbe,0x25, + 0xb7,0xe,0x9a,0x5c,0xdf,0xec,0xe4,0xc5,0xe5,0x4e,0x8e,0x4e,0x2e,0xe4,0xc3,0x47, + 0x2f,0xf0,0xee,0xc7,0x4f,0xf1,0xef,0x7f,0xfa,0x10,0x1f,0x3d,0x39,0x95,0xeb,0x9b, + 0x59,0x7e,0x36,0x9b,0x6,0xa4,0x2c,0x64,0x8,0xc9,0xa7,0xc8,0xa3,0x93,0x19,0x3, + 0x24,0xa7,0x40,0x1a,0xca,0x43,0xcf,0x6f,0x80,0x1f,0xdd,0x3f,0x96,0x1f,0x7c,0xf8, + 0x54,0xbe,0xf5,0xf6,0x6b,0xf2,0xeb,0x5f,0x79,0x5d,0x99,0xc,0x76,0x76,0x75,0x23, + 0x3b,0xc8,0xc,0x95,0xe6,0xcd,0x43,0x93,0xfc,0xe1,0x20,0xa4,0xb8,0x5a,0x70,0xab, + 0xf3,0xb3,0x3c,0xbe,0xbc,0x96,0xa3,0xd3,0x6b,0xf9,0xf2,0xab,0xba,0xf8,0x5c,0xff, + 0xff,0xfa,0xbf,0x7d,0x17,0xdc,0xc9,0xf9,0xb5,0x3c,0x3c,0x39,0x97,0x77,0x3f,0x7e, + 0x8a,0xef,0xff,0xe2,0x9,0xbe,0xff,0x8b,0x27,0xf2,0xe8,0xf8,0x1c,0xd7,0xdd,0x7b, + 0x65,0x6a,0x26,0x82,0xbc,0x6a,0xce,0x0,0x2e,0x9f,0xe0,0xd8,0xd1,0xd9,0x81,0x77, + 0xb2,0x46,0xa9,0xa2,0xbb,0x5d,0x13,0xb1,0x47,0xd6,0x1c,0x47,0x63,0xaa,0xe4,0x41, + 0x29,0x75,0x35,0x6a,0x8c,0x60,0x3c,0x85,0xcf,0xe5,0xef,0x1e,0x36,0xb9,0x53,0xd1, + 0xa7,0xe7,0x57,0x72,0x72,0x7e,0x2d,0xaf,0xdc,0xd9,0x16,0x19,0xd6,0x75,0xcf,0x56, + 0x87,0x75,0xb3,0xdb,0xc9,0xe3,0x17,0x57,0xf2,0xc9,0xd3,0x53,0xf9,0xec,0xf8,0x12, + 0x9f,0x3c,0x3d,0x93,0xf,0x8f,0x5e,0xc8,0xcf,0x1f,0x9e,0xe0,0xa3,0x27,0xa7,0x38, + 0xbf,0xde,0x89,0xdd,0xb8,0x86,0x41,0xe5,0xf4,0x13,0x25,0xcf,0x4f,0xc4,0xec,0x1a, + 0xe2,0x2,0x40,0x13,0x19,0x20,0x10,0x5f,0xe,0xc3,0xbf,0xf5,0xa9,0x84,0x73,0x7b, + 0xbe,0x0,0x13,0xc,0xe2,0xdd,0xf6,0x14,0x22,0xfb,0x25,0x2e,0xd6,0xad,0xbb,0xcf, + 0x7c,0xfa,0x9d,0x6,0x34,0x1b,0xdd,0x31,0xb0,0x6a,0x96,0x3f,0x3b,0xef,0x62,0x46, + 0xd2,0x42,0x7,0xe4,0x4d,0x4f,0xf3,0x4b,0x30,0x7c,0x99,0x76,0x91,0x9b,0x15,0xab, + 0xb5,0x3c,0x72,0x57,0xa2,0x84,0xa9,0xca,0xad,0x5b,0x87,0x4b,0xe1,0xca,0xe7,0xd2, + 0xa3,0x17,0x97,0xf2,0x93,0x87,0x27,0x72,0x7a,0xdd,0x67,0xb1,0x2c,0xd1,0xc6,0x8a, + 0x5b,0xf5,0xa2,0x70,0x99,0x29,0xe2,0x26,0x12,0x10,0x96,0x48,0xce,0x87,0xb4,0xcf, + 0xe3,0xba,0x27,0x97,0xb4,0x52,0xf2,0xd3,0x78,0xa,0x7a,0x23,0xcc,0x70,0x23,0x82, + 0xa4,0xb2,0xc9,0x5e,0x9c,0xf1,0x21,0xa2,0xfa,0xf0,0xc5,0x15,0xfe,0xaf,0x1f,0x3f, + 0xc0,0xcf,0x1e,0xbd,0xd0,0x7f,0xf5,0x7,0xdf,0x94,0xff,0xee,0x37,0xbf,0xa2,0x2f, + 0xdf,0x6a,0x72,0x48,0x23,0x78,0xfb,0x5e,0xf,0xf,0xe,0xe4,0x5b,0x5f,0x7a,0x55, + 0xff,0xc9,0x6f,0xbe,0x2d,0x17,0xbb,0x9d,0xfe,0xf1,0x7b,0xf,0x71,0x7a,0xb5,0x1b, + 0xd2,0x7c,0x1b,0xd3,0xf5,0x89,0x1a,0xc0,0xdc,0x54,0xeb,0x6c,0xd,0xa6,0x28,0x42, + 0xe,0xe6,0xd8,0xbd,0x99,0x58,0xce,0x2a,0xe2,0x83,0xa1,0x87,0x54,0xf,0x7d,0x4b, + 0xe8,0xde,0x5c,0xb,0xeb,0x6,0xdd,0x3a,0x47,0xbe,0x8a,0x56,0x42,0x8f,0x1b,0xcf, + 0xe3,0xc,0x9b,0x21,0x37,0x9,0xa,0x50,0xef,0x63,0x17,0x67,0x68,0xb2,0xd,0x72, + 0x15,0x6f,0x37,0xf1,0xe1,0x50,0xa,0x46,0xc7,0xe5,0x97,0x95,0x14,0x5a,0x19,0x24, + 0x5,0xc3,0xf2,0x70,0xbe,0x67,0x86,0x5a,0x2c,0xf1,0xe7,0x41,0xd,0x25,0x29,0x15, + 0x47,0x33,0xaa,0x92,0x97,0x5b,0x47,0x23,0xa6,0x34,0x86,0x9a,0xc1,0x69,0x3e,0x3e, + 0x34,0x61,0x5c,0x13,0xb6,0xec,0x4c,0x9b,0xa4,0xba,0x2,0xe0,0x87,0xf7,0x8f,0xf1, + 0xce,0xcf,0x1f,0xe1,0x5f,0xfc,0xf6,0x3b,0x7a,0xfb,0xd6,0xc1,0x72,0xd8,0x30,0x2a, + 0x71,0x9f,0x2a,0x77,0x6b,0xff,0xa7,0xaa,0xf2,0xe4,0xc5,0xa5,0x3c,0x78,0x7e,0x2e, + 0xf,0x9e,0x9d,0xe3,0xd3,0xa7,0xa7,0xf2,0xd1,0x93,0x33,0x79,0xf8,0xfc,0x2,0x8f, + 0x4f,0x2f,0xe5,0xe8,0xf8,0x2,0x4f,0xcf,0x2e,0x47,0x64,0x69,0x6b,0xec,0x7b,0x8d, + 0x2,0xd0,0xc3,0xec,0x91,0x26,0xcc,0xc9,0xba,0xc0,0x5c,0x0,0x53,0x43,0x51,0x18, + 0x71,0x51,0xa4,0xc8,0x83,0x93,0xb,0xb9,0xfc,0x70,0x27,0x9f,0x3e,0x3b,0xc7,0x9f, + 0xfc,0xf4,0xb6,0xbc,0x7a,0xe7,0x96,0xde,0x39,0x3c,0x90,0x91,0x47,0x4,0xb9,0xee, + 0x90,0x8b,0xab,0x9d,0x1c,0x9f,0x5f,0xe1,0xf1,0x8b,0x4b,0x79,0xf0,0xec,0x1c,0xd7, + 0xbb,0x60,0x43,0xdb,0x4b,0xf,0x4a,0x4d,0x53,0xcc,0x57,0xa4,0xd1,0x36,0x52,0x57, + 0x20,0x8b,0x2c,0x71,0x82,0x98,0x18,0xa5,0xe0,0xb5,0xfd,0xc7,0xf,0x8e,0xe4,0xf4, + 0x7a,0x27,0xff,0xf4,0x3b,0x6f,0xcb,0x77,0xbf,0xf6,0xa6,0xbc,0xf1,0xf2,0x2d,0x7d, + 0x78,0x72,0x81,0xef,0xfd,0xe2,0xb1,0x3c,0x39,0xbf,0x1a,0xa,0x5f,0xf,0x94,0x53, + 0x46,0x1c,0x8c,0xdd,0x22,0x18,0xee,0x24,0x1b,0xd8,0x26,0x91,0x4f,0x9f,0x5d,0xc8, + 0x8f,0x3f,0x7d,0x86,0x37,0x7e,0xfd,0xcb,0x7a,0xfb,0x56,0x16,0xae,0xfd,0x43,0xfe, + 0xaf,0x52,0xac,0xb6,0x3a,0x54,0xfb,0xeb,0x67,0xa7,0x97,0xf2,0xd1,0xd3,0x33,0xf9, + 0xf4,0xe9,0x19,0x3e,0x79,0x7a,0x2a,0x9f,0x3e,0xbb,0x90,0xa3,0x93,0xf9,0x4c,0x9c, + 0x5c,0xe0,0xd1,0xf1,0xa5,0x71,0xb3,0xa7,0x37,0x9c,0xf2,0xab,0xd0,0x2,0x26,0x2d, + 0xd6,0x40,0x79,0xc7,0x9,0x97,0xd7,0x1a,0xcc,0xa4,0x39,0x13,0xcb,0xae,0x28,0x78, + 0x4c,0x14,0x89,0x2c,0x7d,0xe9,0xae,0x8,0x61,0xca,0x4c,0xe,0x33,0x1b,0x4f,0xac, + 0xd5,0x1b,0xb9,0x6d,0x9a,0x81,0xd4,0x44,0x45,0xb4,0xb,0xe4,0xde,0xe3,0x33,0xdc, + 0x7b,0x72,0x2a,0xdf,0xfd,0xda,0x1b,0xba,0x6f,0xc5,0x60,0xbf,0xbe,0xd9,0xed,0xe4, + 0xd9,0xd9,0xb5,0x3c,0x3b,0xbf,0x92,0x47,0xc7,0x17,0xb8,0xff,0xec,0x5c,0x1e,0x9e, + 0x5c,0xc8,0xe3,0x17,0x97,0xf2,0xfc,0xfc,0x6,0x2f,0x2e,0xaf,0xe5,0xec,0xea,0x46, + 0x4e,0x2f,0x6f,0xe4,0xe4,0xe2,0x1a,0xcf,0xce,0xae,0xe4,0x6a,0x17,0xa2,0xcf,0x28, + 0xe4,0x28,0x47,0x58,0x84,0x2f,0x4a,0xf8,0xc1,0x37,0xef,0x4f,0xd8,0x1e,0xbb,0x19, + 0x26,0x44,0xe7,0xaf,0x15,0xe8,0x9e,0x45,0x6e,0x83,0x77,0xf4,0xa1,0x65,0xe,0xef, + 0x38,0xa8,0x13,0x9f,0x4,0x38,0xfe,0xfb,0x22,0x32,0x86,0xb6,0xdd,0xce,0xfe,0x79, + 0x8d,0x5b,0x3d,0x39,0x8b,0x89,0x6a,0x37,0x63,0xbb,0xee,0xc8,0xf5,0xd2,0x41,0x3d, + 0x51,0xd,0xdd,0xf0,0x5c,0x3,0x58,0x96,0xe7,0x3c,0x37,0x74,0x8e,0xdc,0x27,0xce, + 0xb8,0x5,0x67,0xbc,0xe9,0xc2,0x46,0xf7,0x34,0xb9,0xdd,0x4e,0x9e,0x9e,0x5d,0xcb, + 0xfd,0xe3,0x73,0x79,0x71,0xb3,0xc3,0x64,0xbd,0xc,0x43,0x38,0x5d,0xd6,0x70,0xf5, + 0xc5,0xfc,0xfe,0xba,0xc1,0x74,0xd4,0x2,0x24,0xed,0xd7,0x3c,0x11,0xe6,0xf7,0x9e, + 0xd2,0x75,0x8d,0x74,0x60,0xb4,0x42,0x4b,0xba,0x8c,0xb8,0xeb,0xf0,0xb3,0x87,0x47, + 0x7b,0xf0,0x25,0x9a,0xd3,0xd6,0x2e,0x76,0x5d,0xdf,0x7f,0x72,0x8a,0xff,0xf9,0xfb, + 0xf7,0xe4,0xc3,0x27,0x67,0xf2,0xcf,0xbf,0xfb,0x15,0xfd,0x47,0x5f,0x7e,0x55,0xe, + 0xf,0xe,0xfc,0xcc,0x8e,0xd5,0x82,0xc8,0x7f,0xf9,0x6b,0x5f,0xd4,0xab,0x1d,0xda, + 0xf,0x1f,0x1c,0xe3,0x83,0xa3,0xd3,0xb1,0x7e,0x6d,0xb6,0x91,0x9a,0x47,0x9,0xda, + 0xe8,0xca,0xe7,0xbe,0x5c,0x1b,0xb4,0x4b,0x98,0xb9,0x6d,0xb9,0xd2,0x7b,0x4e,0xc8, + 0x6,0xcd,0xd2,0xb5,0x89,0x76,0x84,0x61,0x61,0x1d,0xb1,0xf3,0x5,0x1f,0x49,0xf7, + 0x49,0x7d,0x4e,0x7c,0x15,0x4d,0x61,0x1f,0x99,0x1a,0xe7,0x71,0xaa,0x94,0xf0,0xe9, + 0xdc,0x8d,0xb4,0x32,0xdf,0x32,0xdc,0xce,0x82,0x7,0xad,0xe5,0x81,0x7d,0xad,0xfa, + 0xcc,0x22,0x56,0xf,0xbc,0x72,0xa4,0x9a,0x76,0xa2,0x1b,0xd9,0x1e,0x8d,0x5,0xdb, + 0xf1,0x70,0x9b,0x53,0x91,0x78,0xd3,0xb0,0x7d,0x51,0xa3,0xb,0xdf,0xb2,0x94,0x55, + 0xed,0x65,0x47,0x17,0x45,0x33,0xde,0x8f,0x7b,0x48,0xc6,0x37,0xdf,0xdd,0x8f,0xab, + 0xf2,0xb3,0x87,0x27,0x78,0xf9,0xa7,0xf,0xf1,0xce,0x17,0x5f,0xc6,0x77,0xbe,0xf6, + 0xa6,0xde,0x99,0xe0,0x8f,0xc3,0xe9,0xad,0x61,0xe8,0xa,0x1f,0xd2,0xbb,0x5d,0x97, + 0x1d,0x20,0x37,0xbb,0x2e,0x1d,0x90,0x9b,0x2e,0x72,0xb3,0x1b,0x5c,0xf3,0xf3,0xab, + 0x1b,0x79,0x7a,0x76,0x89,0x7,0xcf,0x2e,0xe4,0x17,0x47,0x27,0xf2,0xfe,0xa3,0x53, + 0x7c,0xf0,0xf0,0x58,0x3e,0x38,0x3a,0xa5,0x55,0x87,0x19,0x9e,0x6d,0x94,0x1e,0xf6, + 0x2a,0xf1,0x88,0x26,0xf6,0xf6,0xa5,0x90,0xdc,0xc4,0x5a,0x21,0xa6,0xe9,0xc0,0x13, + 0x82,0x7,0xd2,0x1e,0xb2,0x6c,0x46,0x18,0x79,0x7c,0x7e,0x85,0xc7,0xe7,0x57,0x1b, + 0xb2,0x44,0xf6,0x89,0x9b,0x78,0x47,0x45,0xf,0x18,0xa3,0x98,0x3a,0xc2,0xf9,0x8e, + 0x6b,0x34,0xc8,0xaa,0x65,0x82,0xe0,0x52,0x4f,0x5e,0x8,0xf8,0x9,0xd5,0x8d,0xab, + 0x38,0xdf,0xf8,0xcf,0x4e,0x2e,0xf1,0xe8,0xbd,0x7,0xb8,0xb8,0xd9,0xe9,0x83,0xe7, + 0x17,0xfa,0xd5,0x37,0x5e,0x92,0xf7,0x1f,0xbd,0xc0,0x5f,0xdd,0x7b,0x2a,0xcf,0x2e, + 0xae,0x67,0x39,0x3d,0x13,0x2e,0x24,0xe7,0xc2,0xc3,0xa1,0x3b,0x31,0xd5,0xa1,0xc1, + 0xb0,0x7f,0x4d,0x1f,0x3d,0x3d,0xc5,0xf7,0xee,0x3d,0xd5,0x6f,0x7c,0xe9,0x55,0xf9, + 0xf5,0x3b,0x87,0xcb,0x45,0xbc,0x75,0x51,0x7f,0x9e,0x2b,0x80,0xb,0x1,0x0,0xb2, + 0xdb,0x75,0xb9,0x1,0xe4,0x7a,0x37,0x30,0xa7,0xbb,0x5d,0x97,0xab,0xde,0xe5,0xc9, + 0xe9,0x95,0xdc,0x7f,0x7a,0x86,0x9f,0x3d,0x7c,0x21,0x3f,0x79,0xf8,0x1c,0x3f,0xfd, + 0xec,0x44,0x3e,0x7b,0x7e,0x41,0x16,0x33,0xb3,0x4,0xcd,0x10,0x8c,0x78,0xf9,0x31, + 0x3,0x4c,0xf2,0xce,0x5c,0xdd,0x4e,0x35,0xf7,0xbe,0xd,0x73,0xb3,0x89,0x70,0x9a, + 0xcd,0xa,0xcf,0x14,0xdb,0x4,0x30,0x49,0xef,0x7a,0xcb,0xe7,0xc0,0xc4,0x6b,0x28, + 0x4d,0x57,0xe2,0x80,0x65,0x8d,0xf2,0x94,0x29,0x8b,0x8a,0xdc,0x88,0xca,0x8f,0x3f, + 0x3b,0x96,0xaf,0xbf,0xf5,0x8a,0x7e,0xe3,0xad,0x57,0xe5,0xd5,0x97,0xc6,0x67,0x7b, + 0x7e,0x75,0x2d,0x67,0x57,0x5d,0x4e,0x2e,0xae,0x5d,0x12,0x76,0x71,0xd3,0xe5,0xe4, + 0xfc,0xa,0x8f,0x4e,0x2e,0xe5,0xe1,0xc9,0x85,0x7c,0xfc,0xf4,0x4c,0x3e,0x38,0x1a, + 0xea,0xf4,0xa3,0xb3,0x2b,0x54,0x1a,0xaf,0xed,0x9c,0x39,0xec,0x23,0x76,0xd0,0x76, + 0x1c,0x6a,0x4c,0xf9,0x2,0xd7,0x32,0x76,0xe9,0xa0,0x78,0xbb,0xd9,0x65,0x7a,0x97, + 0x6c,0xaf,0x1d,0xb,0xd8,0xda,0x74,0x98,0x2b,0x30,0xf6,0xef,0xd,0x22,0x7d,0xee, + 0xce,0x63,0x67,0xde,0x25,0x2e,0xd8,0x40,0x2a,0x38,0x31,0x6e,0x74,0xfc,0xd3,0xd7, + 0xed,0x59,0xe8,0xd,0x52,0x63,0x80,0x19,0xd8,0x25,0xfe,0x99,0x9a,0x8b,0x40,0x47, + 0xfa,0xb7,0x42,0xed,0xa2,0x6,0xad,0xa2,0x63,0x8d,0xd8,0x72,0x83,0xd8,0x74,0x49, + 0x46,0xb4,0xff,0x3d,0xbf,0xee,0xf2,0x93,0xcf,0x8e,0xf1,0xc9,0xb3,0xf3,0x71,0x5e, + 0xce,0x8a,0xc,0x42,0xe7,0xad,0x5b,0x4b,0xad,0xa8,0x1,0xc6,0x73,0xa4,0x10,0x45, + 0x17,0x28,0xba,0x59,0xf4,0xa0,0xd3,0xea,0x9d,0xe2,0x59,0x32,0x32,0xd8,0x93,0x30, + 0x45,0x85,0xc0,0x69,0x95,0x21,0xae,0xac,0xd8,0x66,0x2d,0xed,0x10,0x19,0x2a,0x20, + 0xb8,0xda,0x41,0xff,0xf6,0xfe,0x31,0x1e,0xbe,0xb8,0x92,0x3b,0xb7,0x54,0xae,0x76, + 0xd0,0x6f,0x7f,0xe9,0x15,0x79,0xf5,0xce,0xad,0x65,0x22,0xf4,0xc6,0xcb,0xb7,0xe5, + 0x1f,0xbf,0xf3,0xa6,0xfe,0xe6,0xd7,0xde,0xd0,0x27,0x17,0x37,0x78,0x76,0x7e,0x65, + 0x48,0x3d,0x31,0x1c,0xff,0x38,0xc8,0xe2,0x24,0x92,0x9e,0x53,0xb,0x60,0xd8,0xa5, + 0x89,0xae,0x4a,0xcb,0x1a,0xbb,0xc8,0x14,0x61,0x6,0x45,0x76,0x86,0x97,0x89,0x64, + 0x58,0xb5,0x29,0xb7,0xb8,0xde,0x7f,0x48,0xcb,0x70,0x71,0x55,0xbb,0x8,0x37,0x71, + 0xae,0x3f,0x58,0x52,0x39,0x3b,0xdf,0x1,0x59,0x3a,0x3c,0xd0,0xaf,0x68,0x54,0x9a, + 0x48,0x2b,0xbb,0xf3,0x30,0x18,0xa3,0xfc,0x83,0x62,0x95,0xf6,0x97,0x90,0xd5,0x69, + 0xa1,0xcc,0x43,0xaa,0x4a,0xfc,0x21,0x6f,0x34,0xf6,0x6b,0x63,0xab,0x6a,0x53,0xb5, + 0xa9,0xb6,0x4,0x34,0x7b,0xcc,0xa1,0x49,0xbd,0x8b,0x89,0x53,0xf4,0xb5,0xaf,0x40, + 0xe5,0xd9,0xc5,0x35,0x7e,0xf0,0xd1,0x93,0xfe,0xe4,0xec,0x1a,0xbf,0xf7,0x8d,0x2f, + 0xb6,0x3f,0xf8,0xf6,0x5b,0xfa,0xab,0x6f,0xbd,0xaa,0x5f,0x7a,0xf5,0x8e,0xdc,0xb9, + 0x75,0xb0,0x8,0x96,0x44,0x44,0x2e,0xaf,0x6f,0xe4,0xec,0xaa,0xcb,0xf3,0xb3,0x4b, + 0x79,0x76,0x76,0x85,0x27,0xa7,0x57,0x72,0x74,0x72,0x29,0x9f,0x9d,0x9c,0xcb,0xfd, + 0xa7,0x67,0x78,0x78,0x72,0x29,0x4f,0x4e,0x2f,0xe5,0xec,0x6a,0x87,0x9b,0x9b,0x2e, + 0x97,0xbb,0x2e,0xd7,0x37,0xbb,0x29,0x12,0xe1,0x3c,0x78,0x7a,0x36,0x74,0x38,0x27, + 0xbc,0x7b,0x88,0xf,0x15,0xba,0xb1,0xf0,0x84,0x5,0x3b,0xa9,0x26,0x3b,0x7f,0xf, + 0x2b,0xb1,0xf6,0xd,0xf1,0x5,0x87,0x87,0x99,0xa8,0x92,0xc5,0x96,0xe0,0x2a,0x4e, + 0xc9,0x8e,0x92,0x18,0xcd,0x21,0xec,0x4,0x5,0x36,0x68,0xb4,0x83,0x49,0xe4,0xa1, + 0x41,0xaf,0x4b,0xa,0x23,0x4d,0x42,0xf,0xf5,0xa2,0x63,0x7,0xc8,0xf7,0x3f,0x7a, + 0x2a,0x3f,0x7a,0xf0,0x1c,0x87,0x7,0x4d,0x2e,0xaf,0x21,0xe7,0xd7,0xd7,0x63,0xec, + 0xdf,0xa8,0xf3,0xf6,0xd5,0xa7,0xc5,0x5a,0x59,0x62,0x79,0x88,0xf5,0xa6,0x40,0xd3, + 0xe6,0x85,0xa2,0x22,0xfa,0x8b,0xa7,0xe7,0x72,0xf3,0xb3,0xcf,0xf0,0xad,0x2f,0xbd, + 0x2a,0xaf,0xdf,0xbd,0xad,0x6f,0xcf,0x3d,0xdc,0x2f,0x13,0xc8,0xed,0xc3,0xe2,0xd6, + 0xee,0xe7,0xe4,0x72,0x27,0xf7,0x8f,0xcf,0xe5,0xe3,0x27,0xa7,0xf8,0xf4,0xd9,0x99, + 0x7c,0xf2,0xec,0x5c,0x3e,0x79,0x7a,0x8e,0xa3,0xd3,0xb,0x39,0x39,0xbb,0x96,0x8b, + 0x5d,0xc7,0xf5,0xae,0xcb,0xe5,0x75,0xf7,0x67,0x62,0x76,0xbf,0xee,0x2e,0x33,0x4d, + 0x75,0x27,0x97,0x8d,0xb,0xac,0x8c,0x27,0x19,0xc9,0x94,0x44,0x1f,0xf3,0x9e,0x6a, + 0x5e,0x4,0xd6,0x2d,0x68,0xe4,0x79,0x39,0x18,0x26,0x9c,0xcf,0xc,0x97,0xe4,0x5a, + 0xce,0x7b,0x3d,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xfc,0x77,0x26,0xf,0xf2, + 0xc5,0x1e,0x9a,0x14,0xab,0x24,0x15,0x37,0x80,0xfc,0xf5,0x27,0xcf,0xe4,0xf5,0x97, + 0x6f,0xf7,0xff,0xf6,0xdb,0x5f,0x3a,0x78,0xed,0xee,0xa0,0x2f,0xde,0x7b,0x72,0x86, + 0x3f,0xfd,0xd9,0x43,0xf9,0x3f,0x7e,0xf4,0x19,0x4e,0xce,0x6f,0xe4,0xf6,0xe1,0x58, + 0x4d,0xf6,0xe9,0x81,0xbe,0xbe,0xe9,0xb8,0xde,0xd,0xe5,0xfa,0xf5,0xae,0xdb,0x7b, + 0xf,0x32,0x74,0xd8,0x4,0xf,0x14,0xcb,0x4e,0xa3,0xa,0xb8,0xa5,0x58,0x63,0x4c, + 0x1,0xcf,0xf9,0x84,0x5f,0xe2,0xf3,0x4b,0xed,0x2e,0x7c,0x33,0x96,0x50,0xf7,0xf3, + 0x36,0x2e,0xe7,0x2e,0x93,0xcd,0xde,0xe0,0x60,0x18,0x23,0xc0,0x41,0x9a,0x35,0xe9, + 0x30,0x8a,0x5c,0x9f,0x2c,0xf7,0x61,0x4c,0x73,0x5b,0x1a,0x8c,0xda,0xd7,0x27,0xac, + 0xa6,0x3b,0xf1,0xa8,0x31,0x30,0x2b,0xe8,0xcd,0xd0,0xd9,0x6c,0x19,0x8b,0x85,0xb0, + 0xd9,0x1a,0x78,0x4f,0x18,0x2,0x51,0xfd,0x90,0x0,0x7,0x8,0xa2,0xe9,0x20,0xe0, + 0x6d,0x68,0x7b,0xce,0xaf,0x76,0xf2,0xc3,0x7,0xc7,0xf2,0xd1,0xf3,0x33,0xb7,0xc3, + 0x61,0x4c,0x60,0x61,0x81,0xa1,0x31,0x76,0x37,0x42,0x4a,0xb3,0x71,0x7b,0x9f,0xe3, + 0x69,0x47,0xa6,0xc1,0x62,0x31,0x91,0xd5,0x51,0xdd,0x9d,0x93,0x8d,0x88,0xcb,0x73, + 0x6f,0x3d,0xe4,0x56,0xd4,0xa1,0x5b,0xe7,0xe2,0x31,0x5b,0xca,0xe2,0xda,0x4e,0x1f, + 0x95,0x5d,0x9d,0x8f,0x4e,0x2f,0xe5,0x5f,0xff,0xe5,0x3d,0xfc,0xf4,0xe8,0x54,0xff, + 0xc5,0x77,0xbf,0xaa,0xff,0xf5,0xaf,0x7d,0x51,0x5f,0x9b,0xce,0x22,0x7e,0x4f,0x5f, + 0xbe,0xd5,0xe4,0xf,0xbe,0xf5,0x25,0x7d,0x7e,0x7e,0xa3,0x7f,0xf6,0xe1,0xd1,0x14, + 0xb0,0xf9,0x58,0x2f,0x56,0x9e,0x76,0xb8,0x1c,0xcc,0x83,0xb1,0x63,0xda,0xbc,0x6c, + 0x1a,0xaf,0x2e,0x9d,0x0,0xad,0x94,0x35,0xd4,0x83,0xf3,0xb1,0x6d,0x5c,0xf,0x94, + 0x11,0xb6,0x6e,0x2a,0xc2,0x79,0xba,0xa9,0x44,0xf2,0x49,0xe3,0xd8,0x96,0xef,0xdc, + 0xc5,0xfe,0x56,0x66,0x1,0x15,0x13,0xcb,0xbb,0xf9,0x43,0x34,0x52,0x17,0xb3,0xfd, + 0x68,0xd3,0x5b,0xe7,0xba,0x33,0x5f,0xe5,0xf9,0xf,0x39,0x7d,0x5b,0x9a,0xd3,0xc7, + 0xc0,0x22,0x91,0x10,0xb6,0xa8,0xb1,0xf5,0xc7,0xf8,0x45,0x9c,0x6d,0xd5,0x28,0x45, + 0x6b,0xb0,0x97,0xa3,0x3a,0xd6,0xc9,0x5d,0x9e,0xc3,0xb,0x18,0x87,0x76,0x7a,0x29, + 0xed,0x2,0x3b,0xbe,0xdc,0xc9,0xdf,0x7d,0xfa,0x54,0x8e,0xaf,0x6e,0xfa,0xe3,0xd3, + 0x4b,0xfd,0xca,0x1b,0x77,0xf5,0x8d,0xbb,0xb7,0xe5,0xe5,0xdb,0x4d,0x6f,0xcd,0x4e, + 0xbd,0xcf,0xad,0xd8,0x4d,0x1f,0x4c,0xf7,0xf3,0xeb,0x1b,0x39,0xbb,0xda,0xe1,0xc5, + 0xc5,0xb5,0x1c,0x5f,0x5c,0xcb,0xb3,0xf3,0x6b,0x79,0xf2,0xe2,0x2,0x47,0x27,0x57, + 0xf2,0xfc,0xe2,0x26,0x80,0x52,0x49,0xb9,0x36,0xa1,0xbf,0x3e,0x4e,0x77,0xa4,0xc5, + 0xd4,0x15,0x91,0x60,0x47,0xe9,0xf2,0x94,0x24,0x3d,0x46,0xb5,0x34,0x50,0x77,0x6c, + 0x80,0xce,0xac,0x8c,0x17,0xd2,0x4d,0x90,0x1a,0x16,0xa0,0x87,0xb8,0xa4,0x90,0xc6, + 0x2c,0x33,0x7c,0xef,0x3d,0x24,0xf,0x66,0xad,0x80,0x8d,0x86,0xe0,0x49,0x1e,0x91, + 0x77,0x1b,0xb6,0xa,0xa5,0xd,0x51,0xc4,0x3a,0xf7,0x79,0xa4,0xc1,0x9c,0x57,0x6, + 0x5d,0x84,0xca,0xe9,0xcd,0x4e,0x4e,0xaf,0x77,0x1,0xcb,0x30,0x63,0x2c,0x39,0x73, + 0x10,0xd6,0x8d,0x71,0x4,0xb7,0xf4,0xe1,0x84,0x86,0x42,0x12,0x59,0x1e,0x22,0x90, + 0x4f,0x9e,0x5f,0xca,0x1f,0xbd,0xf7,0x99,0x3c,0xbf,0xb8,0x92,0xdf,0xfa,0x95,0x37, + 0xe4,0x9d,0x37,0x5f,0xd1,0x2f,0xdc,0xbd,0x25,0xaf,0xdd,0xbd,0xc5,0xf1,0x0,0x4b, + 0xd7,0x7e,0x79,0x7d,0x23,0x17,0xd7,0x5d,0xce,0xaf,0x6f,0xe4,0xf2,0x6,0x72,0x7e, + 0x7d,0x23,0xe7,0x57,0x37,0x72,0x7e,0xbd,0xc3,0xd9,0xe5,0x4e,0x8e,0x2f,0xae,0xe5, + 0xc9,0xd9,0x95,0x1c,0x9d,0x5c,0xe2,0xe8,0x74,0x30,0xf8,0x8f,0x5e,0x5c,0xc8,0xa3, + 0x17,0x97,0xb8,0xe9,0x6c,0x69,0x56,0xb7,0xd9,0x25,0x62,0x58,0xc4,0x72,0x91,0xb, + 0xc5,0x28,0x66,0xd6,0xb,0x9,0xcc,0xfc,0x3d,0xa7,0xf0,0x7e,0x59,0xd,0x90,0xff, + 0xe8,0xcc,0xbb,0xad,0xc3,0xed,0xa1,0xf1,0xf1,0x72,0xec,0x26,0xe7,0x41,0xc9,0x60, + 0x5e,0xfb,0x58,0x43,0xde,0x64,0x7,0xb2,0x72,0x76,0x26,0x88,0xda,0x18,0x27,0xcf, + 0xe5,0xe,0xf2,0xde,0xc3,0x13,0xf9,0xa3,0xf7,0x3e,0xeb,0xbf,0xf3,0xab,0x5f,0xd0, + 0xbb,0xb7,0xe,0xe4,0xcf,0xde,0x3f,0xc2,0x1f,0xff,0xf4,0x8,0x3f,0x79,0xf4,0x62, + 0xa3,0xb4,0x27,0x18,0x56,0x28,0xf2,0xfc,0xa2,0x2e,0x2a,0x60,0xc4,0x54,0x8e,0x1c, + 0x40,0xf6,0x8e,0x34,0x18,0xa7,0xb,0x25,0x24,0xd7,0x86,0x8,0xb0,0x2d,0xf7,0x78, + 0xf7,0xfa,0xbc,0xb0,0xc9,0x77,0x8e,0x18,0x27,0xcf,0x7c,0x2d,0x1e,0x9b,0xa3,0x2b, + 0x59,0xd6,0xec,0xf7,0x19,0x60,0x70,0xaa,0x31,0xbb,0x34,0x78,0xd,0x9,0xdb,0x85, + 0xcc,0xaf,0xa7,0x95,0x35,0x2b,0x6c,0xd,0x38,0xc4,0xd2,0x23,0xba,0x9b,0x2a,0x26, + 0x6d,0x30,0x7,0x35,0x7c,0x22,0xa3,0x98,0x45,0x2a,0xaf,0x1d,0x11,0x99,0x1d,0xa, + 0x69,0x2a,0x5d,0x55,0x9e,0x5f,0x5c,0xe3,0xd9,0xe9,0x95,0xbe,0xf6,0xd2,0xa1,0xf0, + 0x46,0xe9,0xec,0x7a,0x27,0x3f,0x7c,0x78,0x82,0x8f,0x9e,0x5f,0xb8,0x5d,0x4d,0xd5, + 0x74,0x17,0xe3,0xbf,0x33,0x6d,0xe9,0x90,0x71,0x95,0x99,0x23,0xbb,0xcf,0xc7,0x11, + 0xa2,0xda,0xa5,0xcf,0x22,0x33,0xdd,0xbd,0xe3,0xc4,0x37,0x94,0xa7,0xcd,0xe8,0x89, + 0x24,0xe2,0x17,0xf8,0x8c,0x35,0x6b,0xb6,0x1a,0xad,0xcc,0x89,0x34,0x99,0x34,0xd5, + 0x7b,0x6c,0xe2,0xb5,0x8b,0xe0,0xf9,0xd5,0x8d,0xfe,0xf9,0xbd,0xa7,0x80,0xaa,0x9c, + 0x5d,0x77,0xf9,0x9d,0x77,0xde,0xd0,0x5f,0x9b,0x41,0x34,0xf6,0x90,0xdc,0xbd,0x7d, + 0x28,0xff,0xf9,0xd7,0xde,0xd0,0x1f,0x7f,0x76,0xac,0x7f,0x76,0xcf,0xce,0xa,0xb5, + 0xbb,0x17,0xd3,0xec,0xed,0x2,0x39,0x5b,0x70,0x60,0xa6,0xde,0x41,0xe3,0x22,0x4, + 0x81,0xac,0x24,0x96,0xea,0x69,0xc7,0xc0,0x77,0xb0,0xeb,0x0,0x1a,0x13,0xf4,0x2, + 0xde,0x84,0xd2,0xf9,0x5a,0xd7,0xae,0x34,0xf5,0x16,0x4b,0x58,0x9b,0xc3,0x83,0xad, + 0xb8,0x33,0x4e,0xa1,0xe7,0xc,0x15,0xad,0xea,0xf8,0xd9,0x4,0x1d,0x9a,0xe8,0xca, + 0xe6,0xf6,0x4,0x68,0x20,0x59,0x7d,0x2c,0xf4,0xdd,0x4f,0xa7,0x34,0x86,0xd7,0x52, + 0x3d,0xb0,0xb6,0xbe,0x74,0xa2,0xb1,0x47,0x48,0xf9,0xb3,0x10,0xd,0xe5,0xa4,0x78, + 0x30,0x81,0x9a,0x2f,0x82,0x46,0x54,0xf3,0xe1,0x17,0x41,0xb7,0xc6,0xcd,0xc1,0x56, + 0x2d,0x9,0xf7,0x76,0xad,0xc9,0x87,0x4f,0x4e,0xf1,0xe1,0x93,0xd3,0x4a,0xbd,0x8f, + 0x3a,0x7,0xee,0xc1,0xe2,0x51,0x5,0xd,0xcf,0x50,0xba,0x9a,0x10,0x7f,0x69,0xce, + 0xa7,0xa4,0xa4,0x10,0xe5,0xc,0x46,0x9,0xd7,0x7,0xc3,0xbe,0x62,0xd2,0x89,0xb0, + 0xe,0x95,0xe9,0x88,0x10,0x8b,0x3a,0xfe,0x11,0x21,0x98,0xa2,0x75,0x97,0x19,0x18, + 0x98,0xb2,0x36,0x52,0x72,0xc7,0xe8,0xc0,0x35,0x4e,0xff,0xac,0xfb,0x50,0xee,0x61, + 0x1d,0x46,0xe1,0xa,0x68,0x90,0x30,0x4d,0xd2,0xbf,0xe7,0xcb,0x4c,0x5b,0x4,0xf4, + 0xd1,0x1,0xa9,0x26,0x81,0x7,0xe9,0x3c,0x38,0x4c,0x99,0x1e,0x52,0xe4,0x22,0x6, + 0x3e,0xb1,0x48,0x9d,0x25,0x31,0xde,0x59,0x22,0x2a,0x2a,0x5d,0xa0,0xff,0xe1,0xde, + 0x63,0xbc,0xfb,0xe0,0x39,0xbe,0xfb,0xd5,0xd7,0xf5,0xf7,0xbf,0xf1,0x45,0xf9,0xdd, + 0xaf,0xbf,0x29,0xdf,0xf8,0xe2,0xab,0xfa,0xe6,0xdd,0x43,0xb9,0x73,0x2b,0x23,0x5b, + 0xaf,0xae,0x6f,0xe4,0xf4,0x6a,0x27,0x8f,0xed,0xb2,0x7e,0x71,0x29,0x8f,0x4e,0x2e, + 0xe4,0xe8,0xec,0x4a,0x8e,0x5e,0x5c,0xe0,0xd1,0x8b,0x2b,0xf9,0xe4,0xd9,0xb9,0x3c, + 0x3f,0xbb,0x32,0x55,0x3a,0x5b,0x44,0x6c,0xf2,0x62,0x25,0x4d,0x82,0x8a,0xd8,0xcf, + 0x6d,0xee,0xa5,0xa7,0x13,0x18,0x1e,0xaf,0x89,0xf8,0x11,0xd1,0xe4,0xe,0xb4,0x4f, + 0x75,0x5e,0x15,0x4c,0x0,0xe7,0xb3,0x43,0xf3,0x9,0x23,0xeb,0x10,0x91,0xa9,0x62, + 0x42,0x9c,0x46,0xed,0x71,0xdc,0xe8,0xc0,0xa7,0x8d,0x9f,0x5c,0x97,0xd6,0x75,0x2a, + 0xbd,0xdc,0x2a,0x45,0x70,0xa7,0x3e,0x2f,0xa3,0xfb,0x27,0x17,0xf2,0x3f,0x7d,0xef, + 0x5e,0xff,0xd1,0xc3,0x13,0x7d,0xe7,0x8d,0xbb,0xfa,0xef,0x3e,0x38,0xea,0x3f,0x7b, + 0xf8,0x42,0x52,0xf0,0x7a,0x61,0xe3,0x77,0x49,0x8,0x4a,0x27,0xb9,0xf5,0xd8,0x1, + 0x40,0xe7,0x74,0xd3,0x7,0x8f,0x4,0x5c,0x8a,0x4b,0x65,0xfe,0xb5,0xbd,0x66,0xee, + 0x35,0x57,0x74,0x58,0x3d,0x3d,0x8b,0x9d,0x31,0xc4,0x45,0x8c,0xdd,0x2d,0x96,0x7c, + 0x6a,0x12,0xd4,0x7,0xf5,0x2e,0x6c,0x13,0x83,0xc2,0x4c,0xfb,0x89,0x17,0xd,0xd, + 0x8e,0x79,0x9d,0x20,0xdc,0xe9,0xe3,0xa6,0x55,0x9a,0xdb,0xf,0x72,0x75,0xeb,0xb2, + 0x74,0x22,0x29,0x7a,0x43,0x22,0x92,0x71,0xd6,0x2e,0xf6,0xb4,0x73,0xc0,0x83,0x3d, + 0xd,0xac,0xe1,0xdd,0x12,0x54,0xe4,0xe3,0xe7,0xe7,0xf8,0xf0,0xd9,0x29,0xbe,0xf3, + 0xf6,0xeb,0x7a,0x87,0x38,0xf9,0xcf,0x2e,0xae,0xf1,0xf3,0xa3,0x17,0x38,0xbe,0xda, + 0x41,0x4c,0xee,0x65,0xa3,0x6e,0x4e,0x1d,0xf1,0xae,0x5c,0x30,0x1b,0x6e,0x2b,0x24, + 0x7a,0x8c,0xe0,0xe7,0xf3,0xe5,0xef,0x57,0x3,0xe2,0xd9,0xb0,0xd9,0x81,0x8a,0x3f, + 0x5b,0x33,0x9a,0x74,0x6,0x96,0x76,0xd5,0x3e,0xcd,0x51,0xde,0xa1,0xab,0xb4,0xe6, + 0x9c,0xf2,0x58,0x25,0x44,0x52,0xa2,0x72,0x44,0x1d,0xf0,0xec,0xf2,0x5a,0xfe,0xcf, + 0x9f,0x3c,0x94,0xfb,0x27,0x17,0xf2,0xe8,0xc5,0xa5,0xfc,0xcb,0xff,0xe2,0x1d,0xfd, + 0x22,0x41,0xa3,0xee,0x1c,0x36,0xf9,0xd5,0x37,0x5f,0xd2,0xb7,0x5f,0x7b,0x69,0x3c, + 0x87,0xcd,0xc4,0xa,0xd3,0x1a,0x7c,0x80,0xc8,0xc4,0xa3,0x33,0x75,0x60,0x83,0xe6, + 0x3e,0x82,0x76,0xc7,0x48,0xff,0x1b,0x63,0x6d,0xbb,0xff,0xac,0xb2,0x8c,0x14,0x2a, + 0x13,0x6b,0x43,0x18,0xda,0xb4,0x34,0xc3,0x2c,0x5e,0x4b,0x2f,0xa8,0xa6,0xbc,0xb6, + 0x3c,0x56,0x47,0xe9,0xd0,0x4b,0xe7,0xcf,0x3a,0x47,0x52,0xac,0x1f,0x4e,0xbd,0xc0, + 0xd8,0x43,0x7b,0xd5,0x20,0xce,0xd7,0x6,0x99,0xa5,0xdd,0xf5,0x42,0xf9,0xd7,0x9a, + 0xc6,0xa,0x9a,0x95,0x53,0x9c,0xa2,0x45,0x2,0x6a,0x34,0xa3,0xba,0xf1,0xfe,0x7d, + 0xac,0xc3,0xc7,0xd8,0x70,0xa6,0x37,0x2a,0x65,0x69,0xcd,0x46,0x75,0xa0,0x8e,0xe7, + 0xc5,0x9e,0x32,0x8d,0x5b,0xae,0x23,0xe,0x82,0x9,0xb0,0x84,0x88,0x6b,0xdc,0x1c, + 0x50,0xde,0xd7,0xc5,0x94,0x18,0x24,0xd9,0xe7,0xea,0x32,0xd6,0x50,0x74,0x12,0x1b, + 0xa2,0x33,0xfc,0x2e,0x74,0xb6,0x23,0x79,0x54,0x61,0x4a,0x23,0xb5,0xaa,0xc,0x29, + 0x1d,0xc,0x19,0x7,0xec,0x3,0xee,0x40,0x35,0x6a,0x28,0x91,0x79,0x1a,0x19,0x8e, + 0x6,0x63,0xfb,0x82,0xad,0x6f,0x76,0x58,0x74,0x95,0x44,0xd6,0x12,0xfe,0x98,0xd2, + 0x1e,0x33,0x1c,0xa,0xa8,0xb0,0xa0,0x99,0x19,0x2e,0x60,0xb7,0x48,0x7c,0x8d,0x38, + 0x50,0x8d,0x7c,0x72,0x89,0x11,0x63,0x50,0x2c,0xa6,0x67,0xd,0x2b,0xd0,0x20,0x79, + 0xb1,0xd5,0xa2,0x43,0x92,0xe0,0x92,0x7,0xd8,0x34,0x1c,0xf0,0x7a,0xed,0xe4,0xaa, + 0xcb,0xf,0x3f,0x3b,0xc1,0xd1,0xd9,0xb5,0x7e,0xef,0xa3,0x67,0xfa,0xda,0x4b,0x87, + 0x78,0xe9,0xd6,0x81,0xe5,0xfb,0xf9,0x7f,0x67,0x8,0x6,0xbb,0x5c,0xdc,0x74,0x39, + 0xbf,0xda,0xc9,0xf9,0xf5,0x4e,0x2e,0x6f,0x76,0x38,0xbf,0xde,0xf9,0x5f,0x9f,0x5d, + 0x77,0xe9,0xe8,0x8,0x0,0x13,0x82,0x5d,0x2d,0x2d,0x5c,0x4c,0xda,0x62,0xbf,0x3b, + 0x2a,0x71,0x70,0xa7,0xda,0x3d,0x99,0x4a,0x13,0x24,0x46,0x4d,0x81,0x6e,0x3e,0xe8, + 0x2e,0x90,0x66,0x6a,0xe9,0x18,0x95,0xaa,0xcc,0xce,0x3d,0x26,0x44,0x88,0x1f,0x5d, + 0x9,0x91,0xf7,0x2a,0x5e,0xa7,0x34,0x9b,0x5e,0xcc,0x31,0xe1,0xe8,0x83,0x8b,0x35, + 0x96,0x9f,0x68,0x43,0x1f,0x6e,0x12,0xee,0xc4,0x8d,0x9f,0xef,0xc7,0x55,0x17,0x79, + 0x70,0x7a,0x89,0xeb,0x7b,0x4f,0xf5,0x47,0x2f,0x9d,0xc8,0xc3,0x93,0xb,0xb9,0xa6, + 0x0,0x8f,0x82,0xa,0x93,0x94,0xaf,0x2d,0x69,0x3d,0x13,0x5,0x51,0x1b,0x3e,0xb0, + 0xf1,0xf6,0x4c,0xd5,0x9a,0xa,0xf9,0xc9,0x1d,0x41,0x19,0xe3,0xb0,0x18,0x1d,0xb, + 0x20,0xe8,0x4d,0xc7,0x32,0xc2,0xc0,0x55,0xc1,0xc4,0x83,0x7d,0x78,0x43,0x85,0x38, + 0x47,0xee,0x16,0xb2,0xd2,0x42,0xe4,0x66,0xd3,0xbf,0x1e,0x9b,0x28,0xf8,0x1a,0x53, + 0x7d,0x91,0x3e,0xff,0x3d,0xf5,0xb3,0x7d,0x52,0x4d,0x10,0xcd,0x4d,0xf4,0x53,0xa0, + 0x6c,0x73,0x1b,0xa3,0xcf,0x14,0x42,0x43,0x9b,0x8c,0x1d,0x7e,0x13,0xff,0xd9,0x7, + 0x7e,0x75,0xe6,0x2b,0x33,0x18,0x67,0xbe,0xc0,0x5d,0x5,0x7f,0x7b,0xff,0x18,0x6f, + 0xbf,0xf6,0x12,0xbe,0xf3,0xf6,0xeb,0xde,0x4e,0x1c,0x5f,0xdc,0xc8,0x87,0x4f,0x4e, + 0x71,0x7c,0xb5,0xf3,0x71,0x7b,0x38,0x2,0x42,0xc,0x17,0xfe,0xfa,0xf1,0x35,0xc0, + 0x42,0x69,0x46,0xfd,0x5,0x40,0xbb,0x9,0xe4,0x78,0x18,0x88,0xc4,0xcc,0xb0,0xca, + 0xca,0x72,0x58,0x28,0xc,0xbb,0xe9,0x4c,0x1b,0x1f,0xa,0xe6,0x3e,0x1e,0x43,0x7b, + 0x39,0xba,0x85,0x76,0xf8,0xb5,0xa8,0xcd,0x0,0x0,0x62,0x71,0x80,0x2d,0x87,0x54, + 0xe3,0xbd,0xa3,0x53,0xb9,0xc1,0x67,0x38,0xbb,0xe9,0xfa,0x87,0xdf,0x7e,0x4b,0x7f, + 0x87,0xc4,0x99,0x2f,0xdd,0x3a,0x94,0x57,0x5e,0xba,0xa5,0xbe,0x3a,0x3e,0xc8,0xc5, + 0xe5,0xcc,0x60,0x9b,0xdc,0x77,0x6a,0x3c,0xe7,0xf8,0x5d,0xf,0x62,0x1c,0xa3,0x63, + 0x34,0x11,0x78,0xd7,0xb4,0x3f,0x57,0x91,0x83,0x9e,0x4e,0x47,0x69,0x94,0xe6,0xa8, + 0xf1,0xf5,0xc7,0x2b,0x99,0xe,0xdf,0xd4,0x7e,0x24,0xb5,0xfa,0x96,0x2d,0x76,0xab, + 0x30,0x90,0x2,0xf0,0xa2,0x26,0xd9,0x1a,0xae,0x43,0x34,0x15,0xa8,0x2e,0x87,0x62, + 0x47,0xa8,0xe9,0x7d,0xc6,0xbf,0xe1,0x97,0x86,0x66,0x7a,0x4d,0x1a,0x1b,0x4c,0x82, + 0x8d,0x68,0x2c,0xc5,0x94,0x2c,0x67,0x69,0x37,0x3f,0xba,0x41,0xe8,0x30,0x44,0xfb, + 0x48,0x6a,0x8c,0xa2,0x1a,0x72,0xaa,0xa9,0xda,0x88,0xd2,0x8c,0xd2,0x88,0x3f,0x17, + 0x36,0xa6,0x95,0x36,0x84,0x75,0x6,0xc5,0x1c,0x14,0x21,0x9,0xf5,0x22,0x43,0xec, + 0x4b,0xf2,0x36,0xdd,0x1d,0x52,0xe9,0x1c,0x48,0x8a,0x6b,0xab,0xc6,0x1b,0xe3,0xe2, + 0x8c,0x4e,0x35,0x2f,0x5e,0x7,0x5,0xcd,0x19,0x61,0xb,0xa1,0x49,0x74,0x99,0xab, + 0x38,0xc1,0x46,0xa6,0x8,0x5,0xb4,0x22,0x45,0xe1,0x85,0xc,0x1d,0x9a,0xf6,0x38, + 0xa,0x6,0x53,0x34,0x2,0x3d,0xf2,0x24,0x85,0x32,0x80,0x81,0x84,0x30,0x44,0x59, + 0xb0,0x83,0x73,0x37,0x6d,0x79,0x1b,0xc9,0x78,0x91,0x28,0x38,0x5f,0x72,0xda,0x89, + 0xf9,0xe5,0x3e,0xd1,0xe0,0x14,0x41,0x4,0x75,0xb6,0x14,0xd8,0x2b,0x69,0xd9,0xd1, + 0xcd,0x5e,0x87,0xa0,0xb,0x22,0xf4,0x5d,0xea,0x15,0x83,0x86,0x4f,0xc4,0x7e,0x75, + 0x72,0xbd,0x93,0x17,0x4f,0x4e,0xe5,0xfd,0x27,0xa7,0x58,0x24,0xa9,0xa8,0xf8,0xc4, + 0xa2,0xd3,0xa7,0x87,0xc6,0x3,0x86,0xe0,0xdf,0x35,0x15,0x17,0x5a,0xd1,0x98,0xa9, + 0xa3,0x1c,0x2d,0x30,0xd0,0x99,0x6,0x8a,0xd8,0x8f,0xbb,0x4a,0xba,0x9b,0x20,0x5b, + 0x21,0x7,0xb3,0x50,0xb1,0x0,0x90,0x39,0x52,0xee,0x2a,0xe5,0x90,0x1d,0xcf,0xbf, + 0x15,0xf,0x48,0x9f,0x40,0x74,0x52,0xa3,0x4b,0x1c,0xdf,0x89,0x31,0xad,0x47,0xca, + 0x4d,0x13,0x51,0xe9,0x7d,0xe0,0x37,0xda,0x54,0x94,0xf5,0x9,0x3f,0x97,0x88,0x69, + 0x9b,0x5,0x42,0x53,0xd9,0x89,0xc8,0xa3,0xf3,0x4b,0x3c,0x3a,0xbf,0x22,0x9f,0x31, + 0xdb,0xc2,0xcb,0xce,0x4f,0xa9,0x50,0x84,0xaf,0xe6,0x49,0x32,0x32,0x6f,0x7,0x65, + 0xd3,0x4,0x67,0x8e,0x4e,0x78,0x17,0x38,0x3c,0x44,0x1,0x5a,0xb3,0xdb,0xe7,0x10, + 0x47,0x8c,0x84,0xbf,0x3a,0xbc,0x42,0xa0,0xb0,0x72,0xf,0x5b,0x99,0xcc,0x74,0x98, + 0x6a,0x6e,0xee,0x13,0x1,0xe9,0x18,0x25,0x8f,0x4a,0x6f,0x26,0x50,0x74,0x8b,0xac, + 0x7f,0x7d,0x36,0xf0,0x4f,0x17,0x45,0x64,0xe,0x0,0x2d,0x44,0x4c,0xdd,0xc3,0x58, + 0x8c,0x63,0x62,0x56,0x35,0xe2,0x7c,0xb7,0x39,0x2a,0xb4,0x95,0xcd,0x18,0xc3,0x4f, + 0x7d,0xd0,0xf8,0xc,0x77,0xa2,0xfa,0xd3,0x27,0xa7,0x78,0xeb,0xd3,0xe7,0xf8,0xc3, + 0x6f,0x9f,0xe1,0x1f,0x7d,0xe9,0x55,0xbd,0xba,0xe9,0xf2,0xde,0xa3,0x63,0xfc,0xe8, + 0xe1,0x9,0x2e,0xcc,0x5f,0xef,0x92,0xef,0x98,0x42,0xf8,0x7b,0x6e,0x53,0x67,0xe9, + 0x7d,0x7e,0xc0,0xe3,0x32,0x1f,0xb9,0xe1,0x20,0xb8,0xdb,0x9c,0x66,0x44,0x8c,0x9c, + 0x28,0xaf,0x53,0x4d,0x74,0x3e,0x76,0x1c,0xf3,0x63,0xef,0xfe,0xd,0xda,0xc8,0x54, + 0xfd,0x63,0x68,0x59,0x2f,0x44,0x20,0x2b,0x7b,0x32,0x41,0xcf,0xee,0xfc,0x39,0x5f, + 0x76,0xc8,0xf,0x1f,0xbd,0x90,0x67,0x97,0x37,0x72,0xdd,0xbb,0xbc,0x7e,0xe7,0x50, + 0x7e,0xe5,0xf5,0xbb,0x7a,0xe7,0xb0,0xc5,0x11,0xd5,0x1a,0xc,0x35,0xe0,0x9f,0x2f, + 0xba,0xe0,0x40,0x45,0xfa,0xfc,0x5f,0x90,0x90,0xd0,0x76,0x60,0xb6,0x3b,0x9f,0x76, + 0x5,0x1b,0x1d,0x32,0x7e,0xd5,0x2f,0x3f,0x34,0xbf,0x5b,0xec,0xec,0xe9,0x34,0xa4, + 0xee,0x4,0xbe,0x4e,0xce,0xae,0xe5,0xa2,0xde,0xd8,0x8c,0x6b,0xc4,0x8c,0x2b,0xb2, + 0xbf,0x1c,0xfc,0x3b,0x35,0x23,0x64,0x6d,0xef,0x6a,0xff,0xeb,0x2a,0xf7,0xe4,0x21, + 0x2f,0xf8,0xb9,0x74,0x0,0x2e,0x58,0x38,0x95,0x9a,0x1,0xe5,0x5f,0x5c,0xf5,0xac, + 0xda,0x5b,0x6d,0xb8,0x47,0x16,0x87,0x59,0x5b,0xae,0x53,0x1c,0xd7,0xcc,0x56,0x31, + 0xf6,0x87,0xd3,0x69,0x63,0x33,0xb7,0x18,0xbf,0x8f,0x53,0xa5,0x8f,0xd8,0x37,0x61, + 0xaf,0xaa,0xf1,0x72,0x21,0xcd,0xc4,0x64,0x7c,0xd8,0x8d,0xb,0x5e,0x69,0x7f,0x43, + 0xb3,0xcb,0x74,0xde,0x43,0x9,0x2c,0xa9,0x60,0xeb,0x2,0x54,0x4d,0x2e,0x63,0xdd, + 0x43,0x4e,0xc1,0x32,0x21,0x13,0xd2,0x84,0xa5,0x8,0x99,0xd8,0x6b,0x18,0xdc,0xee, + 0x18,0x98,0x9b,0xca,0x2d,0xa2,0x41,0x59,0x5f,0xa1,0x28,0x21,0x8,0x3e,0xf2,0x6b, + 0xf9,0x12,0xb3,0xdd,0x2e,0x81,0x10,0x78,0x1,0x44,0x44,0xd5,0xc8,0x56,0x42,0x75, + 0xa7,0x8d,0xb1,0x28,0x9d,0xd0,0xee,0x88,0x92,0xf9,0x79,0x62,0x1a,0xdb,0x23,0xc7, + 0x40,0x9,0xa2,0xa8,0xf6,0x35,0x4e,0xc1,0x2f,0x89,0x4f,0xe7,0x21,0xae,0xc1,0x19, + 0xc8,0xd3,0x8e,0x6e,0xab,0x6f,0x18,0x94,0x83,0x67,0x98,0x6d,0x8a,0x5a,0x79,0x7, + 0x4f,0x42,0x7e,0x90,0x18,0xae,0x49,0x7a,0xb0,0x5d,0xb4,0xe6,0xf0,0x12,0x56,0x93, + 0xda,0x17,0xdd,0x91,0xba,0xcf,0x90,0x8c,0xba,0x34,0x1,0xfe,0xc2,0xb5,0xe8,0xbc, + 0xad,0xa6,0xb4,0x54,0xf7,0xd9,0xf0,0x91,0x2b,0x62,0xec,0x3b,0x69,0xfd,0x37,0x26, + 0x18,0x76,0x59,0x35,0xc,0xf2,0x28,0x8f,0x93,0x7d,0xcd,0x3,0xf7,0x6e,0xc5,0xf3, + 0x64,0x45,0xed,0x5c,0x17,0x9a,0x1a,0xb,0x30,0x33,0x8d,0x34,0xd7,0x56,0x36,0x19, + 0x9c,0x8d,0xae,0x7,0xd2,0xfc,0x5d,0xb2,0x97,0xcd,0x33,0x3f,0xd9,0xa2,0xaa,0x8b, + 0x17,0xd7,0x5a,0xd1,0xee,0xda,0x4,0x45,0xda,0x27,0xfa,0xd0,0xab,0x89,0xf4,0x18, + 0x7e,0x75,0xf3,0x71,0xab,0xb0,0x81,0x9d,0xe9,0x46,0x43,0x71,0xd9,0x3c,0x9b,0xdc, + 0x27,0xa6,0x1e,0x77,0x1a,0xe5,0x17,0x40,0x97,0xb7,0x8f,0x94,0x63,0x6a,0x3a,0xbf, + 0xa5,0xf9,0x99,0xdb,0xf0,0x62,0x2c,0x96,0x47,0xd3,0x0,0xc7,0xb9,0x8a,0x1c,0xcc, + 0xbf,0x6a,0x10,0xe9,0xd,0x16,0x58,0x32,0x2,0xba,0x8,0xd9,0xc1,0x53,0x49,0xb2, + 0x67,0x93,0xbe,0xc5,0x38,0x19,0x6,0xd5,0x1a,0x2c,0xf8,0x46,0xf6,0xb0,0x26,0xbe, + 0xe3,0x96,0x83,0x81,0x16,0x97,0x3,0x16,0x82,0xab,0x23,0xde,0xbb,0xa8,0x9c,0xed, + 0xba,0xfc,0xe8,0xe8,0x45,0xff,0x37,0x3f,0x7c,0x20,0xff,0xf4,0xdb,0x6f,0xb5,0xaf, + 0xbf,0x7e,0x57,0xbe,0xff,0xc9,0xf3,0xfe,0x97,0x9f,0x3e,0xc7,0x55,0x7,0xc6,0x99, + 0x3e,0x31,0x6e,0xb1,0xa6,0x1,0xac,0xb,0xf,0xe6,0x8a,0x15,0x2b,0x43,0x14,0x37, + 0x74,0x48,0x9d,0xce,0x2c,0x47,0xc3,0x52,0x40,0xaf,0x78,0x2c,0xaf,0x8f,0xcb,0x9b, + 0x5,0x4a,0xab,0xea,0xf4,0xa2,0x53,0x48,0x47,0x1f,0xf6,0xfb,0x26,0x86,0x29,0x6f, + 0xda,0x38,0x40,0x8,0x29,0x81,0xb4,0x44,0x48,0xcf,0x47,0x58,0x44,0xe5,0xfe,0xe9, + 0x15,0xfe,0xed,0x7b,0xf,0xf5,0xde,0xf3,0x73,0xfd,0x57,0xbf,0xfb,0xf5,0xf6,0x5f, + 0x7d,0xfd,0xb,0x7a,0x71,0xb3,0x93,0x93,0xab,0xdd,0x8,0x90,0xe9,0x3c,0xda,0x76, + 0x70,0x3d,0x70,0xd0,0xe6,0xe1,0xdd,0x21,0xb1,0x8e,0x89,0xe,0x5e,0x3,0x23,0x34, + 0x84,0xf,0x88,0x77,0x29,0x92,0x1a,0x25,0xc1,0xed,0xdb,0x76,0x4a,0xda,0x36,0x54, + 0x86,0x9,0x98,0x34,0xc5,0x29,0x7f,0xdf,0x1c,0x5b,0xe1,0xe6,0x59,0xa9,0x63,0x5d, + 0x3,0x83,0xdd,0xb3,0x44,0x6d,0xc4,0xa7,0x8e,0x51,0x45,0xb4,0xf,0xf0,0x6c,0xea, + 0xea,0x89,0x96,0x1c,0x2d,0x2f,0x6c,0x21,0x6a,0xb,0x84,0xc6,0xc3,0xb,0x53,0x5a, + 0xf6,0xfc,0xb1,0x7b,0x7,0x6b,0x52,0x9d,0x16,0x7e,0xec,0xd9,0xa1,0x8b,0xcd,0x64, + 0x9b,0x6,0xf8,0x41,0xb5,0x2b,0xa4,0xa1,0xb5,0x79,0xc1,0x4b,0x17,0xd5,0xc6,0x97, + 0x6b,0x86,0x18,0x20,0xf6,0x33,0xf0,0xb5,0x88,0xa6,0x11,0x60,0xf2,0x57,0xcf,0xf, + 0xb6,0x69,0x41,0xee,0x21,0x26,0x2f,0x62,0xab,0x8,0xcc,0xcb,0xbc,0x23,0x44,0x50, + 0xea,0x69,0x4f,0xc1,0x98,0xb0,0x9d,0xe1,0xd8,0xf1,0x99,0x90,0x5b,0xc9,0xde,0xf, + 0xcd,0x3d,0xe2,0x4c,0xd3,0x20,0x26,0xa3,0x5a,0xb2,0xf,0xf,0xb1,0xcd,0x89,0x11, + 0xa5,0xec,0xb0,0xb7,0x81,0xf6,0x76,0x1c,0xce,0xe5,0x62,0x27,0xa4,0x12,0x3b,0x75, + 0x27,0x11,0xa5,0xcd,0xa2,0x73,0x76,0x31,0xd8,0xd,0x4f,0xc5,0x82,0x5d,0xd0,0x4d, + 0x9c,0x6e,0xa5,0xe9,0xdb,0xb1,0xdf,0xa1,0x8d,0xc6,0x11,0x4a,0x5b,0x19,0x57,0x33, + 0x4f,0x1d,0xc0,0xec,0x6a,0xa2,0x91,0x77,0x8c,0x5d,0xfa,0xf3,0x69,0x91,0x3,0x13, + 0xe0,0x45,0x21,0x33,0xa,0xee,0x8d,0x7d,0x95,0x7a,0x65,0xa3,0x2e,0xc5,0x5,0xea, + 0x74,0xab,0xec,0xaf,0x32,0xa8,0x1,0x5c,0x27,0x61,0xe,0x4a,0x7c,0xec,0xe1,0xdd, + 0x50,0x8c,0x7b,0xa3,0x3b,0x32,0xc5,0x9b,0xd7,0xa,0x73,0xf4,0xc9,0xf8,0x66,0xb8, + 0xa5,0xa,0x2,0xca,0xde,0x6,0x76,0xdc,0xc0,0x78,0x11,0xa9,0xe1,0x31,0xa5,0x50, + 0xf4,0x71,0x98,0xaa,0x11,0xc6,0xc6,0x1d,0x3a,0x84,0xbd,0x6d,0x64,0xb1,0x4c,0x7b, + 0xf4,0x81,0x4a,0x17,0xe9,0xd,0x73,0xd4,0x15,0x99,0x1a,0xc,0xaf,0x70,0x37,0x43, + 0x19,0x2e,0x47,0x3c,0x57,0x6b,0xec,0x8c,0xc,0x65,0xfb,0xd0,0xe8,0x8c,0x1f,0xfb, + 0x41,0xa3,0xd6,0x1a,0xd9,0xc6,0xe9,0xa6,0x8,0xd,0xdd,0x27,0xe5,0xbe,0x77,0xef, + 0xad,0xfc,0x19,0xf,0x9b,0xd9,0xec,0x9c,0x15,0x9a,0x48,0x6f,0xfe,0xf9,0x4,0x80, + 0xcb,0x3b,0x4f,0x2b,0x58,0xe7,0xc4,0xc,0x44,0xa5,0x41,0x60,0xc9,0x15,0x38,0x10, + 0x2b,0xcc,0xc7,0x21,0x7a,0x50,0x45,0xad,0xac,0x38,0xa2,0x9f,0x89,0x29,0x1d,0x5b, + 0x84,0x11,0x22,0x8,0xe3,0x13,0x9c,0x45,0x5b,0xa5,0x79,0xd6,0xa9,0xdb,0xc8,0x82, + 0xcd,0x15,0x45,0xfb,0xf8,0xbc,0x8f,0xce,0xaf,0xe4,0xdf,0xdd,0x7b,0xd2,0x9f,0x9c, + 0x5f,0xe3,0xab,0xaf,0xdf,0xd1,0xbf,0xfc,0xf8,0x59,0xbf,0x77,0x7c,0x81,0x6b,0x30, + 0xb7,0xc0,0x89,0x83,0x61,0xcd,0x1b,0x35,0x76,0x87,0x5f,0xd8,0x63,0xc4,0xe,0x4c, + 0x61,0xe0,0xb8,0x97,0xc7,0xfa,0xc1,0xc4,0x85,0x2,0x6c,0x5c,0x56,0x86,0x6d,0x84, + 0xb5,0xfc,0x6a,0x87,0xc8,0x38,0x4,0x47,0x12,0xf9,0x38,0xbc,0x5a,0xd7,0xa1,0x41, + 0xd7,0x7c,0xb1,0xeb,0x1c,0xd3,0xf9,0xc2,0x6d,0x4,0xd8,0x38,0x43,0x61,0x7c,0xb5, + 0xcd,0xe9,0x74,0x72,0xff,0xfc,0xa,0xa7,0x9f,0x3c,0xc3,0xeb,0x77,0x6f,0xe3,0x27, + 0x4f,0x4e,0xdb,0xc5,0x75,0xc7,0xf7,0x3f,0x7d,0xde,0xbb,0xd2,0xca,0x62,0xd4,0x8e, + 0xae,0x45,0x89,0x9c,0x84,0x16,0xa,0xb8,0xec,0x34,0xb,0xb5,0x2a,0xa7,0x3d,0x3a, + 0xbd,0x68,0xae,0x4,0xfb,0xf8,0x5f,0x57,0xc1,0xfb,0xef,0x45,0x22,0x7a,0x3a,0xdf, + 0x9d,0xd5,0xec,0x65,0x84,0x9e,0xd2,0x39,0x74,0x8e,0x73,0x8a,0x8,0x2e,0x81,0x66, + 0xca,0x2a,0x1b,0x45,0x41,0xe7,0x7f,0xd6,0x77,0xfe,0xc7,0xff,0xf5,0x7,0xae,0xfa, + 0xc5,0x3e,0x64,0x33,0xa4,0x2,0x8a,0x83,0xbc,0xb8,0xa5,0xcd,0x4b,0x63,0xc8,0x8c, + 0x29,0x17,0xba,0x7d,0x93,0x15,0x58,0xdb,0x84,0x28,0x4c,0xd,0x9c,0xce,0xe3,0xb8, + 0xb5,0x61,0xd6,0x68,0x2a,0x4d,0xda,0x30,0x6d,0xce,0xdf,0xb,0x6d,0x73,0xb2,0xdc, + 0x92,0x7,0x84,0xd2,0x5a,0xd4,0xdf,0xa5,0x65,0xae,0xa0,0xe0,0x5b,0x47,0xf9,0xb1, + 0x55,0xf2,0xc9,0x86,0x86,0xa5,0x23,0x5b,0x76,0x69,0xc3,0x7,0xbe,0x8,0x4d,0x64, + 0x13,0xb,0x28,0xd4,0x2,0x2e,0x7e,0x5f,0x99,0x10,0x6c,0xfa,0xc7,0x65,0xc9,0xa9, + 0x25,0xda,0x4b,0xe,0xb1,0x63,0x7d,0x83,0xd8,0xb,0xb1,0x44,0xd5,0x77,0x14,0xe, + 0xa0,0xc8,0x16,0x3b,0x2,0xd9,0x4a,0xa4,0x59,0x3c,0xa2,0x1a,0xd5,0x49,0x48,0x7e, + 0x94,0x81,0x78,0xe1,0xbb,0xf1,0x7f,0xc5,0x6f,0x2e,0xa5,0x2c,0xa9,0x4a,0xeb,0xa3, + 0x75,0x83,0xf2,0x6,0x55,0x95,0x3f,0x2b,0xa5,0x80,0x61,0xef,0xb1,0x95,0xd6,0x2a, + 0x8e,0x1c,0x23,0xad,0x87,0x22,0xdb,0xfd,0x56,0x81,0x76,0x75,0x78,0x82,0xf9,0xbc, + 0xb3,0x62,0xa2,0x59,0x4e,0x29,0xc8,0xd5,0x17,0x8e,0x28,0x2b,0xb0,0x81,0x3,0xe7, + 0xb1,0x3c,0xac,0x3,0x32,0x43,0x1b,0x20,0xcc,0x12,0xb7,0x79,0xe0,0xb8,0x4e,0x26, + 0xec,0xc4,0x11,0x1e,0x24,0xb7,0x40,0x26,0x5f,0x86,0xc6,0x88,0x65,0x33,0x3a,0x81, + 0x26,0x6d,0x8a,0x9a,0x54,0x21,0x6d,0xe4,0x54,0x4c,0xef,0x48,0xb3,0x77,0x52,0x5b, + 0x52,0x30,0x4b,0x74,0xea,0xa4,0x23,0xd,0x57,0x5,0x55,0xff,0xd1,0x96,0x46,0xad, + 0xcc,0x72,0x93,0x20,0x62,0x49,0x8a,0x39,0xd,0x55,0x7f,0xb0,0xd1,0xe9,0x3b,0x8a, + 0x15,0x2e,0xc4,0x23,0x4b,0x69,0x89,0x81,0x14,0xc,0x36,0x85,0x6b,0x88,0xbf,0x32, + 0x4f,0x52,0xa,0x65,0x61,0xc9,0xcb,0x10,0xd5,0x75,0xfe,0xfb,0x66,0x31,0x4f,0x7a, + 0xaa,0x84,0x34,0xe4,0xd1,0xa9,0x86,0xed,0x43,0x19,0xac,0x32,0x17,0xcb,0x96,0x36, + 0x80,0xa6,0xad,0x89,0x34,0xa8,0xb4,0x36,0xc2,0x2a,0xe8,0xd7,0xd2,0x74,0x70,0x5f, + 0x75,0x20,0x37,0xda,0xc4,0xb5,0x43,0x65,0x8,0xca,0x4a,0xe,0xf5,0xc2,0x28,0xe3, + 0xf7,0xd5,0xd9,0xf4,0xd6,0x1b,0xc0,0x92,0xe3,0x6,0xf8,0x16,0x32,0xec,0xf8,0x7d, + 0xc4,0x8c,0x75,0x84,0xf1,0x7,0xd0,0x81,0x9b,0x1,0xd7,0xd0,0xdd,0x9d,0xb,0x81, + 0x25,0xa2,0x81,0x58,0x9c,0xbd,0xe3,0x7b,0xb1,0x2e,0xbd,0x69,0xf3,0xe4,0xb5,0x36, + 0x87,0xa2,0xea,0x9d,0xba,0xdb,0x2a,0x28,0x62,0x33,0xee,0x6,0xbe,0x1,0x75,0xe3, + 0x9a,0x41,0x71,0xa4,0xfa,0xb3,0xa0,0x98,0x2,0xbf,0x1,0x66,0xef,0x32,0x4,0x94, + 0x7d,0xcc,0x57,0x86,0xc3,0x52,0xd0,0x77,0x18,0xdf,0x67,0xc7,0x40,0xb8,0x77,0xff, + 0x6c,0x26,0x72,0x6,0xc1,0x5b,0x85,0x93,0xee,0x29,0x1f,0x37,0xac,0x7d,0x9c,0x73, + 0x9d,0x5b,0xc1,0xca,0x76,0xaf,0x20,0x39,0x6,0xc6,0x68,0x15,0x99,0x6e,0x64,0xa6, + 0x6b,0xed,0x2a,0x88,0x50,0x72,0x38,0xea,0x23,0x2d,0xd5,0x41,0x41,0xde,0xd9,0x9b, + 0xdc,0x4a,0xd0,0x3a,0x62,0x3c,0xb2,0x97,0x79,0x2d,0x1c,0x8d,0x94,0x72,0x59,0x79, + 0x54,0xe8,0xdf,0x1e,0x6c,0xa4,0xdc,0x80,0xb1,0xb3,0x18,0xb8,0x45,0xf3,0x8f,0xcc, + 0x22,0xb0,0x8b,0x4a,0xc3,0x98,0x40,0x35,0xd1,0x16,0x23,0x44,0x4d,0x66,0x83,0xb9, + 0x37,0x8c,0x26,0xdd,0x56,0x56,0xb6,0x76,0x6,0x7f,0x90,0x15,0xbd,0xe7,0xef,0xe1, + 0x7c,0x60,0x1a,0x5d,0xda,0x81,0xc8,0xb,0xa,0x88,0xba,0xf0,0x1a,0xe1,0x74,0x50, + 0x48,0xd,0xcf,0x89,0x80,0x22,0xda,0x4d,0xe7,0xd7,0x32,0xee,0x90,0x1c,0x41,0x66, + 0x50,0x5c,0xcc,0x16,0x4b,0x9a,0xf3,0x2d,0x3d,0xe3,0x83,0xf,0xdc,0x82,0x6c,0x14, + 0x56,0xac,0xa6,0xe4,0x3e,0x49,0x4b,0x1b,0xf8,0x54,0xa0,0x7b,0x7,0x9f,0x3,0x0, + 0x1b,0xb1,0xa6,0xad,0xc5,0x60,0xaf,0xa1,0x2a,0xc9,0x2e,0x42,0x38,0x93,0x2a,0x22, + 0xd,0x6,0x29,0xab,0x35,0x67,0x67,0x3e,0x1,0x35,0x9,0xca,0xa0,0x31,0x32,0x87, + 0x39,0x50,0x28,0xa,0x50,0xa9,0xd9,0x8e,0x9f,0xb3,0xd,0x90,0x12,0x45,0x2d,0xeb, + 0x14,0xdc,0xa2,0x67,0x3f,0x56,0xaf,0x39,0x29,0x37,0x18,0x46,0x7a,0xf3,0x1f,0xa2, + 0xa4,0x88,0xd3,0x40,0xcc,0x8f,0x29,0xb7,0x20,0xec,0x67,0xe3,0x47,0xdd,0x2c,0x5f, + 0x9b,0x40,0x28,0x82,0x50,0xb8,0xab,0x45,0x5c,0x61,0xaa,0x54,0x89,0xde,0xe5,0xa3, + 0xe4,0x74,0xc1,0x81,0x5c,0x17,0x4,0x6e,0x42,0xc0,0x61,0x10,0x9,0x58,0xe3,0xa6, + 0xe9,0xd3,0x92,0xd0,0xa0,0xd3,0x85,0xab,0xda,0xa4,0xd,0xc2,0xf5,0x14,0x3c,0xda, + 0xd9,0x3d,0x7c,0x53,0x1a,0x2,0x2,0x76,0x33,0xa0,0xd6,0x9b,0x6d,0xb6,0x64,0xcd, + 0x17,0xe1,0xfe,0x8a,0x93,0x75,0x93,0xec,0x64,0x34,0x91,0xe1,0x49,0x11,0x28,0x44, + 0x24,0xaa,0xd7,0xb1,0xeb,0x6e,0xfe,0x2,0x21,0x7a,0x74,0x5b,0xbf,0x59,0xdd,0x64, + 0xda,0x66,0xff,0x4d,0x18,0xb1,0xa8,0x7d,0x46,0xad,0xb8,0xa8,0x76,0x6c,0x5a,0x69, + 0x9a,0xe6,0xd,0x26,0x55,0x97,0x3d,0x5b,0xed,0x10,0x7d,0x79,0x4a,0xbb,0x0,0x54, + 0x74,0x99,0xb0,0xd2,0x7e,0x53,0x62,0x7d,0x91,0x1c,0x3b,0x32,0xbd,0xee,0xa2,0xa4, + 0x7,0x70,0xdd,0x90,0x46,0xf0,0xe,0xcd,0xda,0x72,0xad,0xf,0xdf,0xeb,0xc6,0xbe, + 0x1f,0x3c,0x32,0x1f,0xbf,0xee,0xc6,0x45,0x13,0xcc,0x95,0x2f,0x66,0xcb,0x89,0xb1, + 0xe3,0xe9,0xb3,0x11,0xd1,0x3e,0xdf,0x2e,0x5a,0xeb,0xb0,0x16,0x4b,0x29,0x23,0x60, + 0x4,0xa0,0xf4,0x2c,0xde,0x9e,0x1a,0x72,0x9b,0xbf,0xcd,0x90,0x94,0x26,0xd2,0x2d, + 0xc6,0x6f,0x14,0x96,0x1d,0x6d,0xc2,0xa7,0x59,0x20,0x2d,0xb6,0x2a,0xa2,0x38,0x4a, + 0x4f,0x37,0xd7,0x6a,0x8a,0x94,0xc0,0xd4,0xce,0x77,0x64,0x8e,0x81,0xfb,0x74,0x33, + 0xcc,0xf,0xd6,0x9d,0xc,0xdd,0xd8,0xf5,0x46,0xca,0x9c,0xe5,0x9e,0xc3,0xb6,0xba, + 0x45,0xff,0xcc,0x14,0xbc,0x59,0xe8,0x29,0xf2,0xf9,0xa1,0xa9,0xc5,0xd7,0x85,0xa4, + 0x49,0x42,0xe3,0xd4,0x51,0x25,0xa6,0x7b,0xb2,0x56,0xe5,0x20,0x7a,0xd1,0x2a,0xa8, + 0x42,0x5d,0x1,0xc7,0x75,0x3a,0xc7,0xbe,0x43,0x14,0xc7,0xc2,0xd4,0x85,0xd3,0xce, + 0xca,0x6b,0x8a,0x77,0xe3,0xf6,0xad,0xc,0x8c,0x91,0xb1,0xb6,0xca,0x21,0x59,0xa0, + 0xf4,0x1e,0xcd,0xa4,0x9d,0xa9,0xec,0x74,0xb9,0xa0,0xe8,0x81,0xa3,0x94,0xc6,0xcc, + 0x72,0xec,0x1a,0xfb,0x14,0x57,0xf4,0x59,0xd1,0x76,0xa8,0xd1,0x1c,0x6c,0x37,0x8, + 0x36,0xd3,0x72,0xb,0xaa,0x9d,0x56,0xa5,0xbe,0xe4,0x9f,0xfb,0xbf,0x4,0x59,0x69, + 0xcb,0x5c,0x81,0xbd,0xe4,0x99,0x75,0xec,0x8d,0x8a,0xef,0x13,0x92,0x78,0xc9,0x38, + 0xdd,0x12,0xe1,0xa9,0x53,0xc9,0x6c,0xc8,0x6,0x5d,0x60,0x7e,0xa1,0x30,0xf6,0x10, + 0xb9,0x44,0xff,0x20,0x68,0x5,0x49,0x9c,0x5b,0xc8,0x8b,0xb5,0x52,0xfd,0xc,0xd4, + 0x52,0xac,0xee,0x91,0xba,0x13,0x13,0x5,0xe7,0x9c,0x4c,0x8b,0x37,0xa3,0x8,0x43, + 0xd0,0xe3,0xde,0x32,0x75,0x67,0x9b,0xad,0x50,0x54,0x49,0xa,0x90,0xd5,0x6e,0x29, + 0x52,0x88,0x67,0x7,0xba,0x39,0x9a,0x40,0xfa,0xbe,0x11,0x16,0x8c,0xb0,0x85,0xa9, + 0x96,0x77,0xc7,0xf2,0x1,0x27,0xbc,0x48,0xd3,0x38,0x9d,0x5d,0x1a,0x2c,0x72,0x63, + 0x15,0x3e,0xbd,0x98,0xf3,0x60,0xe3,0xf,0x8c,0x5b,0x4f,0x6b,0x5f,0xd2,0xeb,0x0, + 0xe5,0x48,0x4a,0x65,0x44,0x80,0x1d,0xdc,0x52,0x93,0xbd,0xbc,0xa3,0xa,0x38,0x11, + 0x22,0xbb,0xdb,0x84,0x5b,0x24,0xaa,0xcb,0x7c,0x20,0x24,0x61,0xa7,0x3a,0x64,0x78, + 0x1a,0x65,0x61,0x22,0x25,0x85,0x68,0x1b,0xb2,0x37,0xed,0x24,0x52,0x9a,0xbf,0x96, + 0x1e,0x7e,0xe2,0x29,0x49,0x1d,0xad,0xce,0xec,0xd0,0xfd,0x1,0xd2,0x24,0xe0,0x25, + 0x8d,0x8d,0x59,0xc2,0xad,0x53,0xef,0x31,0x8f,0x86,0x92,0xa8,0x34,0xf2,0xc7,0xa7, + 0x1d,0x8c,0x47,0xed,0x9a,0xa2,0x4,0xd0,0x27,0xc4,0xc5,0xc5,0xa4,0x3d,0x5f,0xd6, + 0x11,0x2b,0x3b,0x35,0x29,0x4d,0x90,0x23,0x67,0x23,0xa8,0x45,0xc4,0x7d,0xfe,0x51, + 0xc,0x45,0xda,0x9a,0x58,0x17,0x86,0x16,0x11,0xb6,0xa8,0xdd,0x38,0xc8,0x31,0x69, + 0xe1,0xf5,0xde,0xc6,0xcd,0x49,0xac,0x46,0x1,0x29,0xcd,0x3a,0xab,0xc6,0x23,0x3f, + 0xbf,0xcc,0x55,0xc6,0x4e,0x5d,0x8a,0x7f,0xde,0xb6,0xa5,0xf3,0xb5,0xee,0x31,0x8d, + 0x43,0xd0,0xa9,0x92,0xda,0x79,0x3e,0x67,0x43,0xcc,0xc0,0x16,0xeb,0xe,0x60,0x8, + 0x2e,0xfb,0xbc,0xa4,0xb5,0x43,0xa4,0x75,0x74,0xf4,0xe1,0x1c,0xea,0x5d,0x7a,0x43, + 0x57,0xf4,0x51,0xf2,0xd,0xa8,0x8e,0x24,0xeb,0xda,0x2a,0x23,0xf5,0xc8,0xd8,0x16, + 0x13,0xd2,0x71,0xb5,0x34,0x9d,0x31,0x5c,0xf3,0x36,0x8c,0xb,0x7c,0xee,0x5f,0xfa, + 0x98,0xd,0xa9,0xcc,0x4a,0x62,0xec,0xe1,0x55,0xd5,0x83,0xbc,0x5b,0x1a,0x32,0x93, + 0xf7,0x51,0x39,0xb2,0x1b,0x31,0x54,0x57,0xd3,0x44,0xce,0x77,0xad,0xc5,0x79,0x3c, + 0x46,0x6b,0xee,0x68,0x18,0xf1,0x79,0xb3,0xa0,0x6e,0x6,0xe7,0x9f,0x1a,0xd5,0x3, + 0x85,0x41,0x64,0xcc,0x9a,0xe6,0x19,0xe6,0x74,0xb7,0x76,0x42,0x50,0xa7,0xd2,0x4e, + 0x91,0x58,0x6a,0xc9,0x9e,0x46,0xe2,0x51,0x83,0xdb,0x48,0xd0,0x76,0x4,0x93,0xe7, + 0xcf,0xb1,0x87,0x5c,0xda,0x8a,0x37,0x1f,0x6d,0x53,0x19,0x3f,0x58,0xee,0xb,0x91, + 0x26,0x59,0x84,0xd2,0x8e,0x60,0x1b,0x3a,0x53,0x46,0xd6,0x6e,0xba,0xb7,0xd1,0x1a, + 0xc5,0x70,0xd,0x2e,0xf2,0xd4,0x96,0x10,0x4,0xc,0x26,0x18,0x99,0x3f,0xac,0xd6, + 0x4c,0xb8,0x26,0x5d,0xa4,0xab,0x6a,0xc3,0x70,0xd6,0xa5,0xcb,0x7c,0x37,0xc6,0x38, + 0x46,0xe3,0x9d,0x8b,0xe0,0x61,0xce,0x24,0x4,0xbe,0xc6,0x26,0x37,0x6a,0xa6,0xae, + 0xa6,0x27,0xcc,0x15,0xaf,0xef,0x3f,0xfa,0xc,0x5d,0xb0,0xe2,0x58,0x39,0x54,0x5, + 0x4e,0xc4,0x35,0x64,0x76,0x9f,0xe2,0x3d,0x6f,0xbe,0x69,0xac,0x7,0x1d,0xe2,0x9a, + 0x18,0xe3,0x92,0xa0,0x8a,0x41,0x45,0x7c,0x3d,0xa5,0x6a,0x81,0xb2,0x63,0xdd,0xb3, + 0x69,0x5f,0x37,0x1d,0x6d,0x31,0x6e,0x9,0xc1,0x4,0xa8,0x1a,0x69,0x61,0xab,0xe4, + 0xfd,0x0,0x41,0xe7,0x1,0xa1,0xbf,0x6e,0xba,0x2,0x6f,0xc2,0x93,0x3e,0x8b,0x87, + 0x16,0xd2,0x7f,0xf1,0x28,0x7b,0xf2,0x1b,0x69,0xda,0xa9,0xbb,0x7a,0x9c,0x66,0xf2, + 0x58,0x66,0x87,0xf4,0x45,0x39,0xa5,0x5f,0xfd,0xb5,0x4f,0x44,0x99,0xb1,0x8e,0x81, + 0xb1,0x6,0x47,0xb,0xd5,0x8c,0x82,0xf,0x8f,0x78,0xb2,0x8d,0x9d,0x90,0x38,0xb3, + 0x5a,0x37,0xb4,0x58,0xf8,0x83,0x27,0x2a,0xae,0x1c,0x4e,0x5d,0x3,0x79,0xc5,0xe8, + 0x33,0x9c,0xd3,0x13,0x4,0x7c,0x2a,0x8d,0x78,0xcd,0x2b,0x5,0x4a,0x5,0x2b,0x17, + 0x53,0x1e,0x15,0x4f,0xf1,0x1a,0x22,0x5c,0xcd,0xbf,0x7e,0x23,0xa2,0xb9,0xee,0x60, + 0xe,0x4b,0x2c,0xd4,0x5b,0x35,0xfb,0xa1,0xfb,0x6e,0xc4,0xb0,0x34,0x91,0x31,0xd9, + 0x82,0x5d,0xe6,0xce,0xe1,0x1e,0x4a,0x27,0x73,0xb1,0xba,0x40,0xce,0x26,0x42,0x94, + 0x9b,0x63,0xf1,0xc8,0x7e,0x44,0x34,0xf5,0x9c,0xc,0xea,0xb6,0xc,0x9a,0xee,0x6b, + 0x61,0x4c,0x6f,0x7e,0x8,0x4d,0xa3,0x2b,0x56,0xb2,0xf6,0xcd,0x14,0xcc,0xf1,0x47, + 0x5a,0x90,0x4f,0xb3,0xe,0x4b,0xa7,0x1d,0x10,0xbe,0x2f,0x9d,0x89,0x61,0x88,0x81, + 0xfb,0xb4,0x4b,0xd8,0xe7,0x9c,0x27,0x83,0x8,0x21,0x1e,0x57,0x47,0xb4,0xc3,0x17, + 0x49,0x13,0x6,0xb8,0x2b,0x24,0x1c,0x35,0x84,0xed,0xf5,0xbd,0x43,0x87,0x31,0xaf, + 0x8c,0x0,0x17,0x2c,0x2d,0x4f,0xd2,0x69,0x80,0xa2,0x4d,0x3b,0x62,0xb3,0xdd,0x79, + 0x47,0x9b,0xcb,0xe9,0x51,0x60,0x35,0x21,0xb6,0xcc,0xf8,0x19,0x7b,0x35,0x6d,0x17, + 0x69,0x1c,0xfb,0xc3,0x7f,0xd,0x16,0x2,0x9a,0xf8,0x52,0xa0,0x7d,0x82,0x76,0x3a, + 0xb4,0xb9,0x40,0x4e,0xfb,0x88,0x86,0x1d,0x17,0x59,0x87,0x1c,0x88,0x4d,0x92,0xe6, + 0x11,0x3d,0xbf,0x77,0x5f,0xd5,0x59,0xdf,0xd3,0x68,0x17,0xc5,0x45,0xf9,0xf8,0xc6, + 0xf2,0xe4,0x54,0x3b,0x20,0xda,0xda,0x30,0xc,0xba,0xe,0xc7,0x3,0x2b,0x7c,0x9a, + 0xda,0xe0,0x13,0x26,0xd8,0xf8,0x98,0x59,0x2e,0xac,0x3b,0x4f,0xd7,0x5d,0x5c,0xda, + 0xb1,0xae,0x4a,0x2,0x40,0xff,0xdf,0x62,0x6b,0x53,0xb7,0xee,0xc9,0x4e,0x1a,0x6, + 0x7f,0x81,0x4c,0xe7,0xbd,0xcf,0xcb,0x3b,0x2a,0x58,0xb0,0x20,0xd4,0xab,0x30,0xf5, + 0x6,0x4a,0x12,0x6a,0x37,0x3,0x73,0x4d,0xc8,0xe1,0x11,0x7c,0x86,0x7f,0x6d,0x51, + 0x28,0xa8,0xe,0x4b,0xa7,0xff,0xcc,0x91,0x37,0xae,0xb2,0x49,0x95,0x53,0x39,0xc, + 0x65,0x5d,0x13,0x56,0x1e,0x6a,0x99,0xdb,0x67,0x23,0x32,0xd8,0xb6,0x55,0x10,0x92, + 0x79,0xcb,0x83,0xb4,0x71,0xe2,0xb4,0x31,0xf,0x64,0x50,0xf0,0xc2,0xe1,0x20,0xbd, + 0x21,0x24,0x8,0xd1,0xf0,0xe7,0x8e,0x6a,0xb7,0x63,0x64,0x4b,0xf6,0x3e,0xaa,0x41, + 0xd,0x3e,0xaf,0x87,0xa7,0xdb,0xfe,0x34,0x5d,0xec,0xde,0x2a,0x28,0x71,0xab,0x9a, + 0xa6,0x50,0x14,0x4e,0x36,0x9b,0xc0,0x21,0x64,0x6d,0xb4,0xe,0x95,0x6e,0xda,0x11, + 0x46,0x70,0x4f,0x5c,0xa,0xae,0xbc,0x35,0xf6,0xb6,0xb5,0xdd,0xf0,0xa2,0x47,0x80, + 0xba,0xe7,0x56,0x86,0xdb,0x36,0xf1,0x64,0x59,0xf0,0xba,0x3c,0x62,0x93,0xd2,0x46, + 0xd9,0x4e,0x64,0xff,0xe2,0x22,0xf5,0xc8,0x85,0xd8,0xbd,0x85,0xdc,0xcd,0x6e,0x42, + 0xfb,0xda,0x54,0x2b,0x64,0xb1,0x48,0x25,0x38,0xf,0x96,0x72,0xc9,0x69,0x7d,0xa2, + 0x65,0xdd,0xa3,0x44,0x7c,0xf,0xb6,0xa5,0x2f,0xe2,0x33,0x81,0xc9,0x6d,0x93,0x24, + 0x4b,0xef,0xf3,0xb2,0xee,0x8e,0xb5,0xb0,0xdb,0x2d,0x74,0x9e,0x50,0x95,0xee,0xd1, + 0x3e,0x36,0x8d,0xf1,0xe,0x9c,0x40,0x50,0x2d,0x9b,0x34,0x12,0x40,0x29,0x6f,0x42, + 0x8,0xa3,0x7,0xcf,0x18,0x88,0x6b,0x2e,0x76,0x77,0x2a,0xa6,0x10,0xb0,0x3,0xd, + 0x51,0x1f,0x7a,0x4e,0xb6,0x7b,0xa4,0x1d,0x1a,0x64,0x8e,0x19,0xf0,0xee,0x73,0xee, + 0xd7,0x4d,0xb8,0x64,0xda,0x23,0x95,0x18,0xd7,0x27,0x6e,0x2,0x5b,0xff,0xbc,0x8, + 0x84,0xaf,0x34,0xe6,0x52,0x51,0x83,0xb9,0xdd,0xba,0xb4,0x3e,0xab,0xaf,0x36,0x58, + 0x40,0xb1,0xf3,0x9c,0xef,0x6d,0x97,0x94,0xa6,0x35,0xb6,0xba,0xd9,0x9d,0xe7,0x4e, + 0x12,0x56,0xda,0x42,0x8,0xd3,0x3b,0x4f,0x4b,0xef,0x82,0xf9,0x5d,0xef,0x94,0x5c, + 0x39,0x7f,0x9e,0x63,0x32,0x3c,0xd3,0xcd,0xec,0x1b,0xeb,0x76,0x3b,0xb7,0x40,0xbe, + 0x92,0x7b,0x10,0xee,0xfa,0x9f,0xdd,0xe9,0x2c,0x2c,0x5c,0xf8,0xe6,0x41,0x24,0x1e, + 0x3c,0x27,0x91,0x4e,0xa7,0xb1,0x3a,0xe9,0x92,0xd5,0xf6,0xa4,0xcd,0x4a,0x74,0x42, + 0x10,0x50,0xa8,0xec,0x35,0x1d,0xb8,0x3f,0x68,0x97,0x84,0x5b,0x8e,0xda,0x76,0x48, + 0xd0,0xe,0x66,0xdc,0xdb,0xb4,0x61,0x7,0xc3,0x7f,0x5c,0x88,0xe2,0x97,0xb9,0xc4, + 0x24,0x25,0x84,0x39,0x46,0x44,0x66,0x6b,0x6c,0xac,0x1,0x85,0x46,0xf4,0x98,0x2, + 0xcb,0xa1,0x73,0xc3,0xfc,0xb9,0xda,0xe5,0xd6,0x61,0xa,0xf8,0x61,0x9f,0xec,0x68, + 0x53,0x8c,0x89,0x31,0x31,0x37,0xed,0x87,0x15,0xc9,0x64,0x79,0x15,0x65,0xe3,0xa9, + 0x3a,0x5d,0x6a,0x78,0x20,0x5b,0x1b,0x6,0xba,0xa6,0xcd,0x87,0x84,0x4d,0xdb,0xe, + 0xda,0xe7,0xf4,0x22,0x51,0x2a,0x44,0x9b,0x75,0x3b,0x5d,0x1b,0x65,0xb6,0xa6,0xd4, + 0x66,0xa5,0x8c,0x14,0x46,0x7f,0x11,0x8c,0x69,0x1e,0xb,0xbd,0xcf,0x95,0xc2,0xa8, + 0x14,0x8c,0x37,0x30,0x4b,0xca,0x1e,0xd6,0xc6,0x3,0x9d,0xd4,0x5b,0x5b,0xa1,0xda, + 0xfc,0x83,0x82,0x81,0xdc,0x46,0xaf,0x5,0xfb,0x8a,0xd5,0xf2,0x2d,0x79,0x62,0x22, + 0xdc,0x34,0xd9,0xf3,0xd2,0xc4,0x55,0xbb,0x92,0x81,0x79,0x12,0x83,0x1,0x12,0xd1, + 0x81,0x1b,0xab,0x7d,0x93,0x12,0x4c,0xb0,0xcc,0x81,0xa,0x43,0x7e,0x75,0xcf,0x8e, + 0x91,0x55,0xc1,0xa2,0x89,0x61,0x99,0xb5,0x41,0x65,0x91,0xaf,0x5e,0x82,0x47,0xc4, + 0x91,0xcc,0xdc,0xd9,0x50,0x3e,0x5b,0xc1,0x3a,0x36,0x2b,0x36,0xe2,0x0,0x75,0xb1, + 0x50,0xe9,0x43,0x3b,0x32,0x84,0xdd,0x5d,0xed,0x7c,0x9f,0x84,0xa2,0xf1,0x22,0x8d, + 0x21,0x86,0x85,0x50,0xc,0x4a,0x81,0xf8,0x2e,0x26,0xf2,0x1e,0xe2,0xe4,0x6b,0x24, + 0x33,0xaf,0x5e,0xfe,0xcd,0x50,0x95,0xc2,0x9b,0x8e,0xa6,0x3e,0xa8,0x8f,0x53,0x4d, + 0x63,0xcb,0x58,0x53,0x2c,0x87,0x8f,0x1d,0xf6,0xd2,0xa,0xed,0xd,0xe3,0xb6,0x15, + 0xba,0xd0,0xdc,0x72,0x16,0xf9,0x87,0x91,0xa5,0xaa,0xa4,0xd8,0x57,0xbe,0x26,0x89, + 0x24,0xa4,0xd4,0xcc,0x25,0x55,0x24,0x23,0x2b,0x11,0xb3,0x2b,0x5b,0xec,0x2a,0x96, + 0x64,0x80,0x96,0x41,0x9,0x4a,0x4,0x79,0x4b,0xf0,0xa,0x9c,0xfc,0x6c,0x5b,0x95, + 0xb4,0xd7,0x13,0x22,0xe0,0x4f,0x55,0xa3,0x92,0x5b,0x69,0x2c,0xa0,0x34,0xe9,0xf1, + 0x1b,0x2b,0xa6,0x13,0xdd,0x52,0x2a,0x88,0x5f,0x1f,0xbb,0x62,0xcd,0xa8,0x36,0x1a, + 0xd6,0xb3,0x6d,0x11,0xc4,0x6d,0x17,0x16,0x58,0xf8,0x8e,0x2a,0x9,0xde,0xac,0x8a, + 0x4f,0x1a,0xa,0xd0,0x4e,0x5b,0x6d,0xf5,0x16,0x8c,0xe3,0xe9,0x6e,0x80,0x67,0x9b, + 0x83,0xe3,0x39,0x43,0x5d,0x84,0x89,0x69,0x77,0x80,0xde,0x18,0xbd,0x2a,0x5c,0x91, + 0x64,0x97,0xbb,0xb2,0xbb,0x30,0xc,0xa9,0xfe,0x9e,0x20,0x19,0x25,0xa2,0xa6,0x6e, + 0xcd,0x31,0x73,0xe3,0x5b,0x1b,0x74,0xb8,0xd9,0x3e,0xd9,0x28,0xb7,0x99,0xec,0x2, + 0xc2,0x8a,0x65,0x62,0x83,0xc1,0x51,0x8e,0x8c,0x54,0x14,0xf0,0x64,0x8b,0xd8,0xd, + 0x2,0x86,0xe8,0xa4,0x9d,0x27,0xfc,0x9f,0xfb,0x45,0x9a,0xf3,0xcc,0xa3,0x89,0x19, + 0xc8,0x53,0x93,0x24,0x79,0x33,0x44,0xa3,0xfb,0x80,0xf6,0x0,0xd2,0x46,0x37,0xde, + 0x41,0x2e,0xe3,0x49,0x5e,0x73,0xd,0x7b,0x2,0xfc,0x8c,0x36,0xbd,0x93,0x48,0x35, + 0x2e,0x12,0xc2,0x92,0x8a,0x46,0x4c,0x83,0xb6,0x2a,0x72,0x52,0xca,0xc8,0xb6,0xc0, + 0xc1,0x41,0x4c,0x74,0x27,0xa3,0x1f,0xcc,0xf1,0x73,0x9e,0xc5,0xe1,0xd0,0x8,0x9, + 0xa0,0xda,0xc7,0x92,0x48,0x5d,0xb2,0x33,0x9f,0xb3,0xf9,0x33,0x81,0xc6,0x68,0x9b, + 0x53,0x60,0x6c,0xcc,0xab,0x90,0x3,0x9f,0xed,0x60,0xba,0x2f,0x5c,0x7f,0x30,0x57, + 0x92,0xb3,0x43,0x57,0xb3,0xf5,0xf5,0x59,0xa0,0x76,0x39,0x30,0x2f,0x77,0xeb,0xa3, + 0x89,0x8e,0x33,0x4d,0x38,0x25,0x90,0x83,0x45,0x8c,0xb4,0xa,0x43,0x9d,0x7b,0xe3, + 0xd2,0x66,0x97,0xda,0xa7,0x48,0xd9,0x8a,0x93,0x71,0x68,0x6b,0x6b,0x10,0xf4,0x49, + 0x78,0x6f,0xd3,0x71,0x31,0xa9,0x62,0x6,0x8c,0x76,0x81,0x1c,0x2c,0x83,0x3d,0xed, + 0xe3,0x66,0x81,0xe8,0x60,0xb0,0x3e,0xa,0xa4,0x3e,0x32,0x8d,0xec,0x47,0xd2,0xfb, + 0x81,0xeb,0x51,0xfa,0x98,0x68,0x35,0xcc,0x8c,0xd5,0x39,0x3e,0x9d,0xd2,0xf5,0x3, + 0xe1,0xf3,0xd,0x5c,0xa6,0x61,0xc3,0xf5,0x23,0x8d,0x5,0x4b,0x8d,0x44,0x70,0xad, + 0x50,0xdd,0x5a,0x28,0x5d,0x28,0x10,0x49,0x19,0xaa,0x2a,0x65,0xec,0xa0,0x39,0x4d, + 0x32,0x3b,0x2a,0x74,0x55,0xf2,0x66,0x52,0xdc,0x86,0x6c,0xb0,0x20,0x52,0x93,0x7a, + 0x7a,0x73,0x69,0xaf,0x39,0xec,0xa9,0xe4,0xab,0xa3,0x69,0xb2,0xa,0x80,0x4b,0x15, + 0xf5,0x9f,0x3c,0x35,0x44,0x49,0x24,0x61,0xa0,0x8f,0xe1,0x37,0x1f,0x1f,0x60,0x77, + 0xa4,0x60,0x13,0xed,0x73,0xd8,0xd7,0x43,0xe2,0xae,0xde,0x88,0xcd,0x8c,0x5e,0xa8, + 0xdd,0x62,0x21,0x82,0xb,0x7e,0x35,0x55,0x5c,0x75,0x83,0xeb,0x59,0xdf,0x36,0x5c, + 0x87,0x77,0xe9,0x8,0xd9,0x36,0x5c,0x82,0x3b,0x6d,0x32,0x7a,0x10,0x8a,0x67,0xbf, + 0xe8,0x4d,0x1a,0xda,0x5d,0xe0,0x43,0xbe,0x74,0xa4,0xd1,0x2f,0xb3,0xd,0xd2,0xb8, + 0xdd,0x40,0x2b,0x8b,0x7c,0x72,0xcc,0x78,0x93,0x23,0x81,0xf9,0x2,0xca,0x58,0x57, + 0x84,0x4d,0x43,0xda,0x3c,0x84,0x3b,0x4a,0x6e,0xdc,0xc6,0x7a,0x3b,0x7c,0xb,0xdd, + 0xec,0xf6,0xc3,0xd8,0x8c,0x16,0x4b,0xad,0xf8,0x6e,0x8a,0xf8,0x17,0x2d,0x4a,0xa6, + 0x28,0x4b,0xe6,0xa8,0x78,0xee,0x51,0xec,0xb,0xee,0x24,0x6e,0x8b,0x9d,0x95,0xaf, + 0x67,0x55,0x25,0xc6,0xef,0x94,0x70,0xa1,0x6c,0x10,0x57,0xd3,0x47,0x68,0x62,0x37, + 0xad,0x3a,0x11,0x5d,0x52,0x94,0x28,0xb1,0x93,0x5e,0x6e,0x55,0xa4,0x12,0x88,0x4, + 0x42,0xa1,0x51,0xb,0x91,0xc9,0x38,0x84,0x1a,0x8f,0x70,0x23,0x5c,0xc5,0xa6,0xe2, + 0xce,0x58,0x98,0x83,0x4d,0xaf,0xaf,0x63,0x54,0xdc,0x1d,0x42,0x17,0x3c,0x53,0xe, + 0x7c,0xa4,0xef,0xc9,0xa5,0xb2,0x60,0x6d,0x86,0x46,0x95,0x3a,0x57,0xe,0xdd,0x8b, + 0xde,0xd1,0x1d,0xf5,0xd1,0xcc,0x34,0x8f,0x4f,0xb2,0xb1,0x14,0x62,0x2,0x16,0xc2, + 0x74,0xd5,0x15,0xce,0xa3,0x99,0xe8,0xeb,0x5e,0xc,0x1a,0xa5,0x23,0x9,0x30,0x67, + 0x91,0xd4,0x19,0xb0,0xa8,0xb0,0x55,0x1d,0xd2,0x7a,0x4a,0xdc,0x5a,0x9,0x1d,0xbc, + 0xb7,0xae,0xa1,0x51,0x8,0x11,0x1b,0x40,0x85,0x56,0x0,0x6c,0xba,0x5b,0xe9,0xc0, + 0x4,0xd0,0x14,0x8c,0xa9,0x5a,0x95,0xec,0x59,0x24,0xaa,0x9a,0xa7,0x96,0xc9,0x66, + 0x40,0xc4,0x19,0x77,0x20,0x45,0x44,0xad,0xe4,0x41,0x94,0x4c,0x68,0xcc,0xb0,0xc1, + 0x8f,0xf,0x77,0x30,0xcd,0x74,0x82,0x5e,0x54,0x5b,0x37,0xd7,0xe1,0xec,0x70,0xa6, + 0x19,0x7e,0xea,0xc8,0x8c,0xd1,0x16,0x85,0x89,0xc7,0x2c,0x7b,0xb1,0xae,0xe8,0xbd, + 0x63,0x64,0x44,0x39,0xcf,0xa0,0x8f,0xdb,0xce,0xf8,0xed,0x3d,0x9e,0xbf,0x31,0xa9, + 0xeb,0xe8,0x1d,0xc4,0x9b,0xf,0xcd,0x0,0x7f,0x4e,0xde,0x20,0x34,0x9f,0x62,0x4a, + 0xe0,0xca,0x55,0xe6,0xf3,0x35,0xb6,0x3d,0xad,0x75,0x41,0x6f,0xbe,0xe,0xc5,0xbc, + 0xcc,0x9b,0x8e,0xce,0xc6,0x2c,0x6d,0xe1,0xc,0x8,0xb5,0xab,0x68,0xfe,0xb4,0x95, + 0xc4,0xc5,0xd4,0x59,0xa9,0x8a,0x1c,0x8,0xad,0xb8,0x4,0xa2,0xad,0xcf,0x81,0x4d, + 0x17,0x4f,0xdd,0x9b,0x4c,0x7b,0x21,0x7e,0x3f,0x61,0x95,0xfb,0x90,0x4c,0xfa,0xb6, + 0xb0,0x4b,0x68,0x68,0x50,0x80,0x6a,0x6,0x97,0xa9,0xf7,0x60,0xb6,0x94,0x55,0x6c, + 0xb6,0x72,0xb3,0x22,0xc5,0xf,0x42,0xec,0x16,0xda,0x99,0x27,0x24,0x7b,0x15,0xf3, + 0x6a,0x92,0xab,0x1e,0xf6,0xd6,0x64,0x2b,0xe1,0x95,0xcc,0xcd,0x2,0x9e,0xa9,0x29, + 0x39,0x2f,0xfd,0x23,0x6e,0x11,0xbc,0x22,0x41,0x97,0x93,0x29,0x54,0xe7,0xbc,0x56, + 0xe5,0xb7,0x19,0x94,0x9c,0x9b,0xc1,0xef,0xa9,0x9c,0x89,0x6c,0x74,0x19,0x74,0x80, + 0x29,0x9c,0x98,0x1,0xc1,0xf6,0xaf,0x74,0xdb,0xff,0x75,0x7,0x5f,0x86,0x8a,0xc2, + 0x11,0xaf,0x4c,0xb2,0x50,0xcd,0x23,0x8b,0x14,0x13,0xca,0x7,0x38,0x2d,0xe,0x22, + 0x70,0xc1,0xfd,0xe5,0xa2,0x46,0xae,0xf4,0x2a,0x0,0x22,0x2a,0x3b,0x15,0xab,0x4, + 0xc7,0xf7,0x4b,0xc,0x77,0xb4,0x58,0xc3,0x29,0x75,0x7e,0xa0,0x91,0x32,0x2d,0x2a, + 0xc8,0xed,0xa0,0x59,0xf2,0xa6,0xaa,0xc2,0xd4,0x76,0x75,0xf4,0xa4,0xd3,0xf,0xa0, + 0x25,0x1,0x91,0xc7,0x88,0x1e,0x72,0xa4,0xe2,0x6e,0x82,0xb9,0x16,0x5a,0xac,0x5d, + 0x52,0xab,0x39,0x5,0x2b,0xcd,0x60,0x5f,0x20,0x51,0xb1,0x48,0x8c,0x19,0x3a,0xa, + 0x98,0x4a,0x3e,0x5f,0x34,0xa2,0x30,0xa2,0x56,0xba,0x70,0xe1,0xb8,0x9c,0x49,0x8c, + 0xf6,0x1f,0x6,0x66,0x7e,0x77,0x4a,0x51,0x8f,0x19,0x44,0x53,0xe5,0xe0,0x1a,0xd, + 0xb5,0x41,0x9e,0xca,0x80,0x81,0x4a,0x33,0x44,0x5e,0x95,0x3d,0xa3,0x84,0xa2,0x45, + 0x78,0x9e,0x85,0x3a,0x76,0x72,0x35,0xc4,0x56,0x89,0xba,0xee,0x18,0x36,0xcc,0xd4, + 0x34,0x1a,0xaf,0xf6,0x1e,0x9d,0x2a,0x1a,0xaf,0xfd,0x28,0x26,0x95,0x2a,0xcc,0x8e, + 0xf0,0xdc,0x16,0x81,0x8c,0x42,0x62,0x79,0x9b,0x1c,0xe,0x1c,0x20,0x60,0xdb,0xf0, + 0x51,0x60,0xc1,0x4d,0x10,0xcd,0xfe,0xe1,0x54,0x22,0xb7,0x94,0x90,0x44,0xdd,0xf8, + 0xe6,0x26,0xd3,0xbe,0xbe,0x6e,0xf3,0x2,0xe7,0xf7,0x2b,0x81,0xe7,0x39,0x8e,0x40, + 0x11,0x14,0x45,0x6f,0xef,0x41,0xeb,0xb8,0x28,0x62,0xa6,0xe7,0x68,0xee,0xd0,0x8c, + 0xed,0x1a,0xf9,0x41,0x54,0x81,0x93,0x6,0xda,0x17,0xe9,0x7a,0xe0,0xa,0x43,0x70, + 0x1d,0x44,0x70,0x18,0x68,0x71,0xfa,0xf0,0x37,0xc1,0xb9,0xb,0x93,0x37,0x2f,0x9a, + 0xa0,0x1e,0xb1,0x41,0x82,0x95,0xf0,0xad,0xe5,0xca,0xb9,0xb5,0xa0,0x4c,0x8c,0xb, + 0xb3,0xf,0xb,0x9b,0x76,0xf1,0xce,0x1c,0x7d,0x84,0xa1,0x8f,0xb,0x51,0x46,0xc8, + 0x49,0x77,0xfa,0xbb,0xce,0x5c,0xb9,0xc1,0x70,0x99,0x93,0x3c,0xc9,0xa6,0xbd,0x10, + 0x93,0xc1,0xba,0xee,0xf1,0x33,0x6e,0x61,0x8b,0x1c,0x17,0x78,0xef,0xda,0xa0,0x40, + 0x77,0xa5,0xbd,0x4c,0xea,0x1a,0x81,0xb1,0x4c,0x18,0x8a,0x56,0xd4,0xb6,0x9a,0xbb, + 0x50,0x25,0xb4,0x20,0x43,0x62,0xec,0xc2,0x9e,0xa4,0xc2,0xa9,0x81,0x8a,0xab,0x10, + 0xb3,0x88,0x74,0x90,0xf0,0x34,0x58,0x8e,0x93,0x53,0x3d,0x85,0x8b,0x34,0xef,0xb9, + 0xc9,0xe8,0x51,0x3c,0x9b,0x20,0xd2,0x78,0x4,0x1e,0x7e,0xd3,0xd1,0xe7,0xab,0xd1, + 0x43,0x30,0xd7,0x19,0xae,0x65,0x3b,0x5b,0x6f,0x7e,0x14,0x19,0xaa,0xb6,0x9c,0x85, + 0x8d,0x32,0x5c,0xb8,0x8f,0xa,0x41,0xdf,0x38,0xf4,0x5a,0x2b,0xee,0xd6,0x96,0x6c, + 0x6e,0x51,0x35,0x36,0x91,0xcd,0x6f,0xb0,0xaa,0xb2,0x4b,0xf3,0xdd,0xa2,0x90,0xf0, + 0xb4,0x35,0x5e,0xf1,0xc7,0xae,0x81,0xaa,0x7a,0x2d,0xd4,0x34,0xab,0x13,0xed,0xc0, + 0xd0,0x22,0xdb,0x37,0xab,0x86,0xda,0xcc,0x85,0x3d,0x29,0x55,0x15,0xaf,0x75,0x9a, + 0x10,0x2b,0xfc,0x4c,0x41,0xa3,0x8,0xd5,0xe9,0x4a,0x1b,0x3d,0xda,0x14,0x4f,0xc4, + 0x63,0xe4,0x27,0xa0,0x36,0xa,0x5b,0x85,0xd0,0xee,0x89,0x86,0x18,0xeb,0x87,0xe8, + 0xfc,0xed,0x62,0x9f,0xa7,0x33,0x89,0xf6,0x7e,0x31,0x9a,0x80,0xb,0x6d,0xec,0x63, + 0x6a,0x92,0xac,0x4b,0x6d,0xf8,0xd9,0xc9,0x8a,0x51,0x88,0x53,0xa6,0x84,0x6a,0x4c, + 0xe,0xf7,0xb,0xb1,0x91,0x8e,0x6f,0x80,0xed,0x87,0xfe,0x88,0x65,0x1,0xac,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x64,0x5e,0xc4,0xe9,0xd3,0x8b,0x35,0x54,0x66, + 0xf2,0xfa,0xa5,0xe4,0x5b,0xcf,0x58,0x29,0x74,0xdb,0xa1,0xeb,0x4a,0x48,0xad,0x71, + 0xd6,0x5c,0x80,0xe8,0x88,0x9a,0x4c,0xc,0xd6,0x9,0x64,0x70,0x1f,0x29,0x3,0x6f, + 0xd4,0x3b,0x6c,0x76,0xf1,0x71,0x16,0x36,0xdb,0xda,0x1d,0xa6,0x27,0x3d,0x74,0x74, + 0x34,0x55,0xd6,0x8c,0x6d,0x53,0x5f,0x22,0x6a,0x19,0x5f,0x69,0x6a,0xe6,0x13,0x26, + 0x55,0x66,0x54,0xad,0xe9,0x38,0xfc,0x3f,0x82,0x20,0x46,0x29,0x1,0x13,0x8d,0x8f, + 0x63,0x92,0xe9,0x8,0x5e,0xa1,0xcb,0x0,0x91,0xa2,0x22,0x1,0x43,0x89,0xeb,0xb, + 0xa1,0x5f,0x88,0xbd,0x38,0x66,0x28,0x11,0xd7,0xc8,0x82,0x80,0x51,0xe,0xb0,0x49, + 0x60,0x71,0xa8,0x1e,0x51,0x1e,0x2b,0x4,0x9a,0x32,0xa2,0x7d,0xd5,0x2f,0x6c,0x77, + 0x1a,0xf9,0x68,0x13,0x4e,0xf4,0xf2,0x97,0xcb,0x49,0xed,0x4d,0x43,0xae,0x9f,0xe7, + 0x19,0x8d,0xfc,0xfa,0x6c,0xde,0xd6,0xb4,0x9d,0xb2,0x22,0xc3,0x9f,0x35,0x0,0x6c, + 0xa2,0x97,0x46,0xbe,0x72,0xe,0x25,0xb2,0x65,0xf7,0x1,0x4d,0x35,0xb8,0x78,0x68, + 0x94,0x93,0x61,0xc5,0x4e,0x74,0xc5,0x19,0x67,0xac,0xb3,0xe5,0x4a,0xcd,0x9e,0x42, + 0x56,0x5a,0x24,0x52,0xc1,0x52,0xe3,0xa3,0x55,0x57,0xc3,0x37,0xe1,0x44,0xa8,0x49, + 0x40,0x8,0x71,0x13,0x59,0xe,0x14,0x70,0xe5,0x2b,0x0,0x15,0x3,0x65,0x85,0x3, + 0x41,0x55,0x7a,0xa7,0x48,0xd2,0xc0,0x4e,0x8a,0x86,0x40,0x2f,0xc6,0xbf,0x96,0xbd, + 0x24,0xc9,0xe,0xd9,0x26,0x21,0xf,0xe8,0xaa,0x7d,0x8,0x4d,0x3a,0xfa,0xa8,0x1c, + 0x47,0xf7,0x6e,0x35,0x17,0xd0,0x55,0x9b,0x3b,0xde,0x66,0x65,0x8c,0xc4,0x37,0x37, + 0x68,0xb9,0x86,0x5c,0x10,0x44,0xc5,0x53,0x86,0xb5,0xb8,0x3d,0xdd,0x1,0x1,0x5d, + 0xac,0x21,0x1b,0x3c,0x91,0xae,0x14,0xe0,0x2,0x76,0x59,0xd0,0x5f,0x83,0x96,0xa5, + 0xd5,0x74,0xaf,0xcd,0x36,0x3e,0x6e,0xf1,0x9c,0x3e,0x4f,0x9d,0x8a,0x7d,0x0,0x7, + 0xea,0x94,0x38,0xa4,0xce,0x7c,0x2a,0xfe,0xb5,0xa1,0x77,0xe4,0xcc,0xfb,0x36,0x15, + 0xdc,0xc9,0x22,0x9a,0x7d,0xe4,0x88,0xac,0xb2,0x29,0x5c,0xe3,0x9a,0x55,0x89,0xac, + 0x48,0x2,0xc9,0x18,0x53,0x53,0xc0,0xd7,0x6,0x1b,0xa3,0x68,0xd4,0x95,0x6d,0x6e, + 0x5a,0xe1,0x20,0xe3,0x1f,0x1d,0xda,0x5e,0x74,0xad,0xe,0x40,0x5d,0xb1,0xe4,0x7, + 0x3e,0xc1,0x4b,0x2a,0x71,0x41,0x23,0xd7,0x1b,0x99,0x3d,0x9b,0x67,0xa,0xdc,0xe3, + 0x5b,0x96,0xf3,0x98,0x44,0xbb,0x63,0xc6,0x8,0x51,0x4a,0x77,0xb0,0xad,0x8,0x6c, + 0xde,0x14,0xaa,0x5c,0xb5,0x41,0x7a,0x57,0x9b,0x46,0xc5,0xf5,0xd1,0x25,0x78,0x85, + 0x16,0xfc,0x92,0x68,0x64,0xac,0xdf,0xb2,0xc5,0x4f,0x20,0x28,0x67,0xc2,0x93,0x4f, + 0x2f,0xe0,0x1e,0x75,0x27,0x1,0xd3,0xc7,0x60,0xa,0xde,0x79,0x76,0x75,0x5b,0xbf, + 0x69,0xdb,0xc2,0x80,0xe7,0xe6,0x75,0xf,0x98,0xc7,0xa6,0xec,0x9d,0x77,0xdb,0x56, + 0xa7,0x34,0x32,0xf3,0x57,0xda,0x6e,0xd,0x45,0x77,0xdf,0x7c,0xfa,0x79,0x21,0x79, + 0xaf,0x50,0xa8,0x32,0xeb,0x4a,0x86,0xbe,0x78,0xd5,0x4e,0x7d,0xb8,0x67,0x10,0x44, + 0x31,0x11,0xc1,0x2c,0x11,0x99,0x36,0x47,0x56,0xe4,0x9e,0x57,0xcd,0x21,0xe1,0xf3, + 0x5f,0xef,0x21,0xc4,0x53,0x1e,0xe5,0x18,0xef,0x97,0xff,0x7b,0x4,0x95,0x49,0x60, + 0x7e,0x57,0x17,0x64,0x88,0x2d,0x4d,0x87,0x34,0x85,0xc4,0x6,0x9c,0x89,0x20,0x23, + 0x86,0x91,0x74,0xc3,0x74,0xd8,0xb4,0x2c,0xfc,0xd,0xee,0xf2,0x9e,0xea,0x2c,0x25, + 0x3e,0x81,0xbb,0x66,0xa6,0x12,0x79,0xda,0x94,0xb4,0x11,0x4c,0x5,0x1a,0x13,0x3b, + 0x5f,0x0,0xc3,0xbb,0xa6,0xba,0xdf,0xdb,0x58,0x95,0x71,0x18,0x8a,0x26,0x95,0x76, + 0x2a,0xa6,0x42,0xa9,0x9b,0x10,0x8,0x63,0xf5,0xd1,0xdd,0x3c,0x17,0xf6,0xa1,0xa9, + 0x90,0x2,0x5d,0x70,0xeb,0x34,0x2d,0xc0,0x18,0x74,0x91,0xa6,0x90,0x1a,0xc8,0x4e, + 0x63,0x13,0x63,0xfa,0x36,0xd0,0x4e,0x5c,0xbd,0xa0,0x81,0x61,0x61,0xc5,0x77,0x26, + 0x4a,0x41,0x81,0xe4,0x1c,0x74,0xbe,0xbf,0x88,0xe0,0x40,0x17,0xf8,0x8b,0xff,0x9c, + 0xe0,0xb1,0xb0,0x69,0x9d,0xe4,0xae,0xf,0xd5,0x9c,0xb2,0xe8,0x4,0x2f,0x2f,0x0, + 0x48,0x39,0xd4,0xfc,0x64,0x73,0x16,0x7b,0xe,0xe6,0x0,0xb3,0x7d,0x90,0x84,0x97, + 0x1a,0x89,0x45,0x31,0xc5,0xef,0x68,0xd3,0x23,0x30,0x84,0x89,0xdd,0x21,0x2b,0xaa, + 0xad,0xc3,0x35,0xb4,0xa4,0x88,0xe1,0x31,0x6d,0x8c,0x71,0x4d,0xb1,0x29,0x1e,0xcc, + 0xd2,0xa7,0xce,0xc0,0x26,0x22,0xe8,0x7d,0x6,0xc2,0x8b,0xd9,0x82,0x69,0xe7,0xde, + 0xe7,0x8a,0x62,0xe8,0x6c,0x68,0xa5,0x31,0x83,0xbc,0x3c,0x6f,0x6a,0x5a,0x1c,0x66, + 0x6f,0x87,0xd4,0x49,0xd2,0x78,0x74,0x7a,0xee,0x5c,0x94,0x39,0x1b,0xee,0x61,0x39, + 0x9e,0xd,0x59,0xc,0xaf,0x67,0x6a,0x8d,0x3a,0x9,0xd5,0x80,0x33,0xac,0xf4,0x8d, + 0x2e,0x9a,0x6d,0xcf,0xf3,0x23,0xee,0x70,0x2f,0x3a,0xe4,0x0,0xc6,0xab,0xb7,0x8f, + 0xc6,0x32,0x40,0xdc,0xbe,0x66,0xc9,0x50,0x23,0x95,0x4e,0xbd,0x42,0x72,0xc2,0x63, + 0x1,0xac,0x99,0x1a,0xa3,0xd7,0x8c,0x93,0x2,0x7a,0x81,0xb0,0x56,0xb1,0xe5,0xc0, + 0xd9,0x64,0x29,0xe6,0x2e,0x7c,0x51,0x67,0xb0,0xd3,0x76,0x36,0xf6,0xcd,0x73,0xd4, + 0xb3,0xd0,0x8e,0xd2,0xd6,0x22,0x67,0x15,0x9,0xa3,0x0,0x4a,0xc2,0x4a,0xf9,0x58, + 0xf5,0xd7,0xc5,0x7f,0x4,0x69,0xb3,0xbb,0x28,0x40,0x12,0x59,0x4c,0xc3,0x71,0x4a, + 0xb9,0x1,0xcf,0xf0,0xa9,0xe6,0x7d,0x1d,0xb,0x5a,0xeb,0x6a,0x74,0x30,0x91,0x95, + 0xd4,0x9d,0x8,0xf,0xa4,0x7,0xe0,0x28,0xc9,0x1a,0x45,0xb9,0x3d,0x22,0x94,0x8, + 0x98,0x4f,0xec,0xfe,0xce,0xf1,0x81,0x75,0xcb,0xcf,0x76,0x13,0x91,0xef,0x33,0x4c, + 0xff,0x5,0x67,0x7c,0xf9,0x88,0x18,0x24,0x90,0xf2,0x30,0xe6,0xc9,0x7f,0x86,0xe4, + 0xb4,0x2d,0xcd,0x28,0xb1,0x42,0xa5,0x50,0x4a,0x69,0x93,0xf8,0x24,0x2,0xd2,0xe6, + 0x52,0x4,0x4d,0x4b,0xfc,0xa4,0x43,0xf0,0x98,0x62,0x8a,0xb6,0x55,0x7f,0xfe,0x61, + 0xd2,0x54,0xea,0x12,0xa2,0x8,0x10,0xc3,0xd9,0x62,0x11,0x72,0xa8,0xab,0xd9,0xe6, + 0xcf,0xac,0x21,0xab,0x7c,0x7,0x67,0x94,0x35,0x6b,0xea,0xce,0x2c,0x9f,0xaa,0xab, + 0x26,0xab,0x1e,0x1f,0x1,0x41,0x13,0x14,0xe1,0x98,0xb2,0x2c,0x8a,0x51,0x14,0xc4, + 0x2c,0xb9,0xa4,0x5d,0x39,0xca,0x3e,0x7,0x54,0x76,0x61,0xde,0xa4,0xfb,0x6c,0xd3, + 0x84,0xb1,0xb1,0x8b,0x45,0xd8,0xd4,0x90,0x47,0xba,0xe1,0x8f,0x12,0xc8,0x81,0xb1, + 0x36,0xdb,0x6c,0x8e,0x62,0x34,0x3,0xc4,0xfe,0xdc,0x9f,0x66,0xe5,0x51,0xbc,0xdb, + 0xa0,0x85,0x2,0xed,0x96,0xc2,0xcf,0xf9,0x83,0xbc,0x13,0x97,0xa,0xe,0xf4,0x40, + 0xd,0xf6,0xe7,0xc7,0xcf,0x2f,0xdd,0x8e,0x3a,0x9b,0xb8,0xe4,0x10,0x31,0x89,0x38, + 0x5b,0x18,0x34,0x6b,0xd7,0xb4,0x4c,0x6,0x35,0x6,0x15,0x56,0xb8,0x35,0x67,0xad, + 0x85,0x75,0xcf,0x66,0xfc,0x83,0x41,0x6a,0x9e,0x6b,0x42,0xc1,0x52,0x52,0x98,0xce, + 0x4d,0x80,0x49,0xff,0x13,0x51,0x26,0xe1,0x62,0x7d,0x12,0xc8,0x11,0x44,0x1d,0xc6, + 0xd7,0x69,0xc4,0x8d,0x50,0xe9,0xe0,0x8d,0x5a,0xf3,0x7b,0x3b,0xb2,0x0,0x94,0xd5, + 0x79,0x29,0x25,0x96,0x3d,0xe7,0x81,0x26,0x4d,0xe,0x18,0xfe,0x94,0x62,0xba,0xe1, + 0xd1,0xb7,0x6a,0x53,0xfb,0xa1,0xdb,0x6d,0x3c,0xf5,0xb1,0x95,0xb4,0x2a,0x9a,0x53, + 0x4b,0xa6,0x91,0x67,0xde,0x42,0x36,0x7c,0xa7,0x1c,0x7b,0x47,0x94,0x66,0x1a,0x25, + 0x3c,0x89,0x72,0xe8,0xfe,0xd8,0x87,0xdd,0x8d,0x79,0xdf,0x4b,0x27,0x3e,0x3c,0xeb, + 0x8d,0x79,0x87,0x30,0xc0,0x4e,0xc4,0xc2,0xc6,0x8e,0x2f,0xc2,0x6a,0xd2,0xb5,0x30, + 0xb9,0xc2,0x9a,0x2e,0x2b,0xd,0xb,0x5f,0xb7,0xc3,0x5e,0xd4,0xd1,0xaf,0x6d,0x7e, + 0xee,0x3b,0xb1,0x5,0xf,0xf9,0xd2,0x11,0xee,0x4b,0x7f,0xf6,0x3a,0x77,0x2e,0x3, + 0x51,0x40,0x11,0xb9,0x1a,0xbc,0x7a,0xd1,0x8e,0xd0,0xb,0xf7,0x79,0xd9,0x38,0xef, + 0x1e,0x14,0xfc,0xa3,0x1e,0x7c,0x9f,0xd3,0xc3,0xfd,0xac,0x6e,0xde,0xd5,0xe6,0x4e, + 0xae,0x9,0x11,0x13,0xd7,0x4,0xcd,0x99,0x1e,0xb9,0xdc,0x85,0xd8,0x10,0xb7,0x31, + 0xe7,0x20,0x80,0x67,0xa1,0xa,0x41,0xa3,0xb3,0x92,0x2c,0x52,0x87,0x68,0x8d,0xc0, + 0x4c,0x76,0x81,0x87,0x8f,0xc5,0xc7,0x92,0x2d,0x94,0xed,0xaa,0x29,0xc4,0x39,0x1f, + 0x26,0x34,0x26,0xee,0x5,0x99,0x2,0xa2,0xbd,0x23,0xab,0xf7,0x60,0xfe,0xac,0x8, + 0xdd,0x98,0x44,0x51,0x2a,0x9a,0xcd,0x3b,0xec,0xa9,0x8d,0x71,0x20,0xfa,0x96,0xb8, + 0xf9,0x1f,0xae,0x2e,0x88,0x4b,0x6a,0x18,0x89,0xbd,0x62,0x2b,0x4c,0x58,0xf0,0x4b, + 0xa5,0x9e,0x31,0x2e,0x3c,0x32,0xc,0xe5,0x7a,0xdc,0x33,0x1e,0xdc,0x63,0xf3,0x6c, + 0x95,0x68,0x41,0xed,0xae,0x3d,0x58,0x3a,0xe3,0xd5,0xfa,0x2f,0x52,0x46,0xcf,0x49, + 0x70,0xe1,0x61,0x24,0x33,0xb,0x5e,0x88,0x79,0x2,0x86,0x7c,0x12,0xce,0xcc,0x7f, + 0xd8,0x4,0xb5,0x93,0x24,0xf0,0x9,0x83,0x6e,0x4c,0x3c,0x51,0x41,0x12,0xa1,0xb3, + 0xe8,0x11,0xc3,0x4a,0x82,0x67,0x35,0x1e,0x75,0x44,0xa8,0xda,0xba,0xdb,0x1,0x91, + 0x21,0x70,0xb7,0xdb,0xb8,0xfb,0xd3,0x55,0xf9,0x7,0xd0,0x62,0x76,0x94,0xf4,0x5b, + 0x67,0xdb,0x40,0x2a,0x7b,0xf5,0xc1,0x69,0x10,0x98,0xfc,0xd4,0x41,0xf3,0xc7,0x6b, + 0x3e,0x58,0x6d,0x8f,0xed,0x83,0xa,0x2c,0xa4,0x49,0x88,0x44,0xfa,0x24,0x5d,0x2e, + 0x2c,0x90,0x33,0x54,0x29,0xb1,0x2f,0xcc,0xa3,0xc6,0xf9,0xe6,0x61,0x6b,0x6e,0xfe, + 0x49,0x97,0x31,0xbd,0x68,0x52,0xd0,0x35,0xef,0x26,0x77,0xe3,0xfa,0x23,0x2b,0x94, + 0xd0,0x5f,0x7b,0xad,0x3b,0x4e,0xca,0xa1,0x91,0xe4,0xf0,0x84,0x31,0x79,0xb2,0x6a, + 0xa7,0x25,0x4b,0x90,0x9a,0xe8,0x65,0xfe,0x4c,0x69,0x9d,0xa8,0x66,0xf4,0x16,0x1e, + 0x1f,0x8b,0x6c,0xe4,0x34,0x49,0xda,0x99,0x8b,0x92,0x3d,0x37,0x34,0xb2,0x1,0x15, + 0xec,0xae,0x5,0x88,0xf0,0x0,0xd,0xe2,0xc,0x68,0x90,0x5d,0x12,0x7a,0xe9,0xc7, + 0x1c,0x7,0xa1,0x47,0xd7,0x7a,0x61,0xc0,0xd3,0x8c,0x26,0x35,0xe2,0x95,0xc4,0x64, + 0xf4,0x98,0x67,0x54,0x6d,0x6a,0x39,0xb8,0xb8,0xed,0x24,0x77,0x8a,0x62,0x17,0x5b, + 0x7b,0x39,0xed,0xa1,0x19,0x30,0x19,0xa8,0xf4,0x66,0x90,0x4,0xea,0xd2,0x54,0xfa, + 0x58,0x2e,0x87,0xe3,0xa0,0x63,0xd8,0xd,0xd5,0xfc,0xa4,0xea,0xbb,0x66,0x20,0xf5, + 0x74,0x9,0xc7,0xcd,0x1f,0x81,0xc1,0x8,0x86,0x92,0xbe,0x9b,0x18,0x4e,0x19,0x3b, + 0x6c,0xa7,0xd5,0xa8,0x27,0x5b,0xa6,0xf5,0xa9,0x5b,0x9,0x9b,0x7b,0xd3,0xc2,0x8b, + 0x4d,0x6d,0x27,0xd,0xc1,0xec,0x8,0xef,0xe4,0x8c,0x12,0x4e,0x75,0x85,0x89,0xe3, + 0x6c,0xc8,0xa,0x4b,0x40,0xa,0xb2,0xa7,0x75,0x40,0xee,0xf2,0xd1,0x34,0xe5,0xcb, + 0x56,0x5a,0x80,0xf6,0x89,0x94,0xac,0x27,0x30,0x83,0xd5,0xb0,0xea,0x6a,0x1f,0x6b, + 0x9f,0x6e,0x23,0xf7,0x38,0xd2,0x13,0xe6,0x1d,0x60,0x12,0xaa,0x65,0x73,0xf8,0x54, + 0xb,0x64,0x2a,0x69,0x99,0xe5,0x8e,0x72,0x71,0xc7,0x33,0xa3,0x99,0x2e,0x27,0x39, + 0xad,0xb4,0x5a,0x84,0xf9,0xcf,0x36,0x52,0x11,0x24,0xac,0x6d,0xc9,0xf2,0x26,0x76, + 0xa1,0x1f,0x88,0xa9,0x6e,0x72,0x9e,0x6b,0xe3,0x8e,0xae,0xd0,0x69,0xd1,0x36,0x68, + 0xaf,0x90,0xd8,0xcb,0x6e,0xa9,0xe5,0xeb,0x34,0x34,0xdf,0x64,0x94,0x92,0x25,0x11, + 0xfa,0x3c,0xbd,0xa3,0x8d,0x71,0x2e,0x1a,0x8,0x5a,0x9d,0x54,0x61,0x83,0xd1,0x4f, + 0x61,0x11,0x85,0x3f,0x2a,0x55,0xfb,0xca,0x5c,0x5d,0x58,0x36,0x38,0x42,0xd,0x9c, + 0xb8,0xee,0xc9,0xcf,0xa5,0x71,0xff,0x1d,0xa8,0x21,0x5,0x9d,0x57,0xe9,0xd5,0x7b, + 0x9f,0x69,0xa6,0x7e,0x77,0x69,0x6a,0xa8,0x34,0x15,0x35,0x14,0x62,0xa3,0x39,0xfc, + 0xc0,0xe1,0x29,0xa5,0x25,0x9d,0xe6,0xe6,0x4,0xe9,0x99,0x41,0x47,0xd4,0xc6,0xd9, + 0x1f,0xd5,0xca,0x10,0x36,0xfb,0x22,0xe3,0xa9,0x5d,0x4,0x18,0xa8,0x3f,0xdb,0x45, + 0x8c,0xc1,0x89,0x67,0x84,0xa4,0x92,0x83,0x44,0x37,0x62,0xf4,0x57,0x2c,0x68,0x94, + 0xe8,0x52,0x2b,0x6b,0x90,0x2e,0xf2,0xb4,0x29,0x57,0x17,0xcf,0x92,0xcd,0xc0,0xb7, + 0x22,0xda,0x54,0xa3,0x7e,0x1a,0x14,0x6c,0x8,0x2d,0xbf,0x9c,0xaa,0x47,0x44,0xb3, + 0x3a,0x25,0xd3,0x92,0x75,0x10,0xaa,0x92,0xee,0x25,0x56,0xc4,0x65,0x6a,0xb,0x7a, + 0x49,0xc4,0x61,0x37,0xc7,0x9d,0x76,0x86,0xcc,0x70,0x3d,0x39,0x93,0x26,0xd1,0xd9, + 0x1,0xd4,0x12,0x59,0x13,0x2c,0x80,0x9b,0x10,0x4a,0xde,0xb9,0x6e,0xac,0x40,0x6c, + 0x91,0x47,0xc2,0x6d,0x9,0x55,0x45,0x6b,0x1a,0x7d,0x3,0x83,0xd0,0x13,0xfa,0x9e, + 0xd8,0xc5,0x33,0xaf,0x33,0xd6,0xee,0x54,0x80,0x69,0x52,0xc1,0xcc,0x49,0x4c,0xc, + 0x2,0x9a,0x7b,0xe0,0x25,0xfc,0x9b,0x98,0xf1,0x92,0x6,0x64,0x9a,0xab,0x88,0x66, + 0x33,0x77,0x4d,0xb4,0x3b,0x1f,0x40,0x28,0x75,0xe9,0xcc,0xbe,0xc,0xfd,0x87,0x7d, + 0xb8,0x42,0xb6,0xbf,0x1c,0xa,0x53,0x4a,0xc4,0xe4,0xb0,0x5d,0x58,0x1b,0x5b,0xd2, + 0x27,0x6,0x24,0xd4,0x9b,0xde,0xc7,0xdb,0xca,0xfb,0x54,0x77,0xee,0x98,0x80,0x2f, + 0x72,0xa3,0xe7,0xaa,0xe,0xc9,0x52,0xea,0x79,0xe0,0x16,0x9e,0xe4,0x77,0xfc,0x18, + 0x11,0xc2,0x2d,0xa1,0xfe,0x2,0x29,0x4a,0xec,0x73,0x74,0xc5,0xee,0x74,0x0,0x69, + 0xba,0x2c,0xf2,0x7b,0xd2,0xf6,0x8c,0x14,0x1b,0xe,0x8b,0xee,0x98,0x0,0x16,0x2a, + 0x5a,0xf7,0xee,0x96,0x71,0xa0,0x7a,0x7a,0x87,0xd6,0xc7,0x19,0x4f,0xea,0xcf,0x84, + 0x51,0xa,0x63,0xdf,0xac,0xd2,0xd0,0xf,0x66,0xdc,0x2a,0x44,0x9a,0xb4,0x3e,0x33, + 0xde,0xbb,0x27,0xb1,0xc6,0xcb,0xcf,0x4c,0x7c,0xf3,0xd0,0xb0,0x52,0xba,0x64,0x96, + 0x64,0xec,0x76,0x68,0x35,0x4,0xd0,0x61,0xd3,0x53,0xb3,0xb5,0x99,0xb2,0xdf,0x52, + 0xf9,0x86,0x7a,0xdb,0x2c,0x91,0x34,0x22,0xa3,0x56,0xbb,0x91,0x98,0x4d,0x24,0x27, + 0xa2,0x6d,0x8,0xd8,0x56,0x38,0x9b,0x2c,0xbf,0x5e,0xfa,0xa5,0xd2,0xd7,0x30,0xaa, + 0x3a,0x59,0xdc,0x50,0x6,0x9a,0x64,0x71,0x3b,0x74,0xb9,0x45,0xb9,0x54,0xe3,0x8b, + 0xad,0xb3,0x14,0xdd,0xd4,0x3c,0xb3,0xaa,0x25,0xff,0xfd,0x75,0x37,0x50,0xe,0x8f, + 0xdc,0x81,0x3a,0x40,0x47,0x1d,0xef,0xd3,0x86,0x8f,0x36,0x1d,0xf2,0x48,0x11,0x1, + 0x2d,0x49,0xf1,0x38,0x5b,0x31,0xf1,0xf6,0x38,0x8b,0x37,0xa0,0x18,0x9c,0x85,0x9, + 0xd0,0xe2,0x9a,0x3f,0x50,0xf4,0xfc,0xed,0x43,0xd9,0xf5,0x62,0x97,0x7d,0xf3,0x8a, + 0xd5,0x47,0x57,0xf1,0x82,0xa5,0x71,0x5d,0x1a,0xb5,0x7b,0x12,0x8c,0x92,0x5c,0x6f, + 0x4e,0x9c,0xb9,0xc8,0x52,0x27,0x95,0xce,0x4a,0xbf,0x31,0xab,0x9c,0x1f,0x73,0x61, + 0x19,0xd8,0xaa,0x54,0x57,0x96,0x42,0xe4,0x95,0x7b,0xd1,0xd7,0xf3,0xba,0x19,0x25, + 0x4d,0x40,0xf9,0xeb,0x9e,0xe1,0x5f,0x8,0x3f,0x85,0xfb,0x56,0x35,0x61,0x78,0x93, + 0x4,0x40,0x4b,0xce,0x3a,0x18,0xbc,0x46,0x55,0x88,0xdb,0x3f,0x51,0xb0,0xc0,0xf3, + 0x2e,0xd4,0x48,0x9b,0x9b,0x62,0x29,0xc2,0xe2,0x12,0x17,0x5f,0x65,0x19,0x53,0xdb, + 0xb2,0x72,0x76,0xc1,0x14,0x65,0xef,0xb9,0xaf,0x94,0xb2,0x28,0xce,0x35,0xd7,0xd4, + 0xe5,0x4d,0x1c,0x76,0xf5,0xb0,0xc6,0x65,0xe5,0x45,0xd0,0xb8,0xc9,0xf5,0xc0,0xbb, + 0xf1,0x14,0x8e,0x13,0xef,0x1c,0xa8,0x3,0xa0,0x65,0xfd,0xda,0x11,0xa7,0x69,0x78, + 0x7a,0xd7,0x69,0xfa,0x87,0x40,0x89,0x6b,0x96,0xc4,0x68,0x55,0xdd,0x10,0x48,0x50, + 0x69,0xa0,0xd7,0x90,0xd0,0x40,0x50,0xb2,0x97,0xb7,0x78,0x4e,0x95,0x13,0xfb,0x5c, + 0x76,0x47,0x22,0x39,0xf5,0x4e,0x8a,0xf,0x2e,0x6,0x17,0x22,0x5,0xea,0xd1,0x3b, + 0xc,0x9a,0x60,0xa8,0xce,0x52,0x87,0x73,0xba,0xab,0xe5,0x6c,0x76,0x91,0x1a,0xcd, + 0x15,0x48,0x88,0xd4,0x5d,0x85,0xcc,0x76,0x3b,0x2c,0x97,0x24,0x38,0x3b,0x84,0xa1, + 0x5a,0x1,0xa6,0x1a,0x79,0xa3,0xc4,0x91,0x18,0xbf,0xb5,0x79,0x24,0x57,0x37,0xae, + 0x69,0x8b,0xc7,0xd5,0x7e,0xbe,0x99,0x11,0xa1,0x2c,0x68,0x34,0x59,0x82,0x7,0x9f, + 0xcc,0xf7,0x5d,0xeb,0xa2,0x25,0xa2,0x39,0x85,0x55,0x81,0x10,0xed,0x6e,0xc5,0xb2, + 0xb5,0x5a,0x17,0xc3,0xa0,0x4d,0xd1,0x98,0x84,0xa6,0x23,0x68,0xaa,0x1,0x63,0x91, + 0xa2,0xb9,0x59,0xa7,0x5b,0xbe,0x3e,0x54,0x90,0xbb,0x5,0x2d,0xf7,0x88,0x81,0x15, + 0x1f,0x9f,0xff,0x2e,0x6a,0x4f,0x9d,0x31,0xd0,0x11,0xa8,0x45,0x56,0x8,0x9b,0xb4, + 0x5a,0x27,0xa1,0x29,0x57,0x62,0xbe,0xc3,0xe4,0x28,0xb1,0x6d,0xad,0xc,0x4,0x9e, + 0x81,0x87,0xe6,0x71,0x69,0x91,0xc4,0x26,0x18,0x94,0xc1,0x27,0x6b,0x26,0xc7,0x50, + 0xf6,0x81,0x2e,0x7a,0x5b,0x3f,0x3b,0x91,0xed,0x6a,0xc0,0xbe,0xb3,0x56,0x8a,0x97, + 0x3c,0x27,0x57,0x66,0x3,0xba,0x86,0xc3,0xb5,0x8c,0xc0,0x52,0xc2,0x9b,0xe6,0x4b, + 0xa,0x94,0x83,0x31,0x54,0xee,0xb4,0xff,0xee,0x2d,0x76,0xe9,0x82,0x72,0xb1,0xd3, + 0x56,0x1,0xd9,0x20,0xb4,0xc1,0x22,0x47,0x4a,0x94,0x59,0xb5,0x1c,0x9a,0x3f,0x2, + 0x35,0x85,0x35,0x94,0xb0,0x69,0xc3,0x30,0xab,0x49,0xf9,0xa1,0x69,0x7c,0xe7,0x2d, + 0xb8,0x4e,0xf7,0x83,0xdb,0xb5,0x15,0x15,0x1d,0x12,0x82,0x86,0x21,0xf1,0x1d,0xa, + 0x7c,0xde,0x4,0x84,0xf8,0x40,0xc1,0xb0,0x8e,0x19,0x5f,0xea,0x11,0x8b,0x92,0xba, + 0x6d,0x9f,0x5,0xf4,0xac,0x53,0xd2,0x96,0xac,0x99,0xf4,0x19,0x62,0xd,0xae,0x77, + 0xa5,0x66,0xee,0xa8,0x23,0xbb,0xdc,0x87,0xb5,0x41,0xdf,0x12,0xd9,0xd4,0xac,0x51, + 0x5,0x1f,0x27,0x95,0x26,0xa1,0x1b,0xab,0x6e,0x13,0x3b,0xc0,0x7d,0xb2,0xe0,0xcc, + 0x9c,0x89,0x14,0x25,0x4a,0x8c,0xc9,0x53,0xc3,0xfc,0xbc,0x7c,0x29,0x1,0x2c,0x4a, + 0xbe,0xc7,0x5c,0x40,0xb0,0x52,0x9e,0xbf,0x26,0xd3,0xcb,0x85,0x16,0x20,0xdc,0xf5, + 0xd6,0xe,0x34,0xd,0x9b,0xd6,0xc8,0xd5,0x35,0x60,0x24,0xb3,0x16,0xf9,0xed,0xe4, + 0x5c,0x13,0xce,0x85,0x8d,0x96,0x9f,0x82,0x78,0x28,0xa8,0x5b,0x5c,0x30,0x61,0xba, + 0x88,0xf0,0x98,0xd2,0xbe,0xca,0xfd,0xbf,0x8c,0xfe,0x9d,0x1,0x24,0xf6,0xe8,0x36, + 0x41,0x1e,0xa5,0x8,0x71,0xc6,0xa5,0x88,0x20,0x62,0x97,0xa7,0xdc,0xfe,0x5,0xaa, + 0x2d,0xad,0xae,0x28,0xc5,0xae,0xc7,0xce,0x3c,0xf6,0xae,0x2,0x34,0x6b,0x43,0x7c, + 0x0,0xec,0x23,0x6f,0xcb,0xcf,0x70,0x83,0x1,0xed,0x83,0x73,0xc8,0xce,0x82,0xc6, + 0xd,0x1,0x61,0xbc,0x4a,0x4a,0x67,0x8d,0x27,0xaf,0x50,0xa7,0x91,0x48,0x84,0x25, + 0xfc,0x84,0x2e,0xab,0xc,0xc0,0x8b,0xcf,0x3e,0xe,0x5c,0xa4,0xe7,0x8a,0x7f,0xea, + 0xaa,0x59,0xa7,0x12,0x1,0x4b,0x5e,0x40,0x3a,0x1f,0xa3,0x14,0x38,0xd8,0x98,0x3e, + 0xf6,0x5c,0x33,0x53,0xd4,0x62,0x64,0x46,0x68,0x9d,0x64,0x5,0x93,0x40,0xd1,0x14, + 0x55,0x42,0xe4,0xaa,0xdb,0x66,0x82,0x6a,0x8f,0x89,0xd2,0x80,0x3a,0xbb,0x6c,0x46, + 0x3d,0xbc,0x4a,0x4a,0xde,0x6f,0xec,0x1f,0x65,0x86,0xac,0xcc,0xc9,0x52,0x9b,0x6c, + 0xfa,0xe1,0x43,0x37,0xb5,0xae,0x8b,0xce,0xf,0x52,0x64,0x2d,0x5c,0xb7,0xae,0x1e, + 0x1d,0xa,0xfe,0x39,0x67,0xa5,0x14,0xaf,0x11,0x5c,0x42,0xa1,0xce,0xda,0x20,0x77, + 0x40,0xd2,0x20,0x84,0xb5,0x45,0xcd,0x2c,0x15,0x19,0xf7,0x2d,0x72,0x9c,0xd5,0x2e, + 0xf7,0xa6,0x71,0x34,0xaa,0xc7,0x28,0xf5,0x94,0xa2,0xdc,0x22,0x8a,0xd0,0x21,0x59, + 0x61,0xd3,0x83,0x17,0x95,0x9e,0x78,0xec,0x96,0x36,0xef,0x32,0x3a,0xa5,0xa7,0xc9, + 0x56,0x94,0x72,0x9e,0x84,0x28,0xc9,0xba,0x91,0x96,0x20,0xab,0x67,0x8a,0xc7,0x45, + 0x76,0x96,0x5a,0xcc,0x42,0x72,0xe2,0x68,0xa3,0x59,0x1a,0xb,0x59,0xe7,0x28,0xbf, + 0x51,0xb1,0x6b,0xb1,0xae,0x34,0x45,0x3f,0xc4,0x41,0xcc,0x21,0x35,0x89,0x3b,0xaa, + 0x57,0x6e,0xdb,0x27,0x97,0x95,0xee,0x1c,0x68,0xd2,0xdc,0x87,0x5e,0xb3,0x5c,0x63, + 0xee,0xaf,0x8b,0xb2,0xc6,0xc2,0x2b,0xa0,0x6b,0x51,0x13,0xd7,0x87,0xd,0x5e,0x15, + 0xd0,0x44,0xd8,0x20,0xa8,0x99,0xa6,0xcc,0xf3,0x8,0x20,0x2b,0x1d,0xb3,0x8f,0x84, + 0x5a,0x52,0x3a,0xa9,0x8e,0xf8,0x29,0xfb,0x36,0x2,0xe3,0x18,0x54,0x83,0x8e,0xe, + 0x27,0xc6,0x4f,0xa2,0x95,0x26,0x98,0xb7,0x4,0x3c,0x87,0x3c,0x88,0x9d,0xef,0x3, + 0xbb,0x79,0x4a,0x4e,0x49,0x1c,0x7c,0x9a,0xa9,0xc5,0xad,0x15,0x1d,0x84,0xe6,0xf0, + 0x21,0x65,0xac,0x8c,0x4a,0x2,0xd6,0xa0,0xf9,0x5c,0x1a,0x74,0x4,0xb9,0x57,0x7d, + 0xaa,0xb3,0x19,0x25,0x9,0xe8,0x22,0x80,0x4a,0xd9,0x33,0x73,0xde,0xbc,0x64,0x39, + 0xae,0x95,0xfc,0x66,0xc6,0x2e,0x8b,0x87,0xe0,0x26,0xa9,0xc8,0x5b,0x7,0x73,0x19, + 0x4c,0x29,0xd0,0xec,0xcc,0x70,0x39,0xb4,0x28,0x54,0x77,0xd,0x60,0xe7,0x1c,0x1c, + 0xd1,0x1c,0x29,0x24,0xd6,0x75,0x77,0x1e,0xb9,0xb7,0xd9,0xf6,0x60,0xaa,0xb0,0x9, + 0xfe,0x4,0x7e,0x7,0x10,0xc8,0x7a,0x48,0x12,0x9e,0xa4,0x84,0x43,0xf,0x86,0x91, + 0xb0,0x11,0x25,0x41,0x5b,0x15,0xd4,0xf1,0x68,0x8f,0x62,0x43,0x73,0x26,0xf,0x6, + 0xd1,0x2a,0x25,0xde,0x52,0x7a,0x5,0x92,0x31,0xf,0x7c,0x93,0xc4,0x3f,0x6d,0x43, + 0x56,0x6c,0x4a,0x3d,0x4d,0xe,0xda,0xb1,0x86,0x5a,0x2c,0xa5,0xbc,0x36,0x54,0xe4, + 0x51,0x7d,0x8e,0xea,0xb3,0x2,0x1,0x59,0xa3,0x37,0x92,0x41,0x12,0x3c,0x4b,0x41, + 0x7b,0x50,0x16,0x20,0x11,0x71,0xb8,0xa5,0x49,0x18,0x24,0x61,0x36,0x9,0x8e,0x48, + 0x5c,0xc,0x46,0x36,0x73,0x10,0x94,0xbd,0x65,0xc4,0xe0,0x2f,0x1a,0xa3,0xad,0x15, + 0x26,0xfd,0xba,0x6d,0x5e,0xf1,0x22,0xba,0x48,0x60,0x9c,0x99,0x48,0x47,0x49,0x20, + 0x1b,0x34,0x1a,0xac,0x56,0x7c,0x7d,0xae,0xc,0x70,0x36,0x0,0x19,0xc5,0x98,0xf1, + 0xaa,0xbc,0x6,0xc9,0xa2,0x2a,0x1b,0x58,0xf7,0xc6,0x6c,0xf3,0xd9,0x7d,0xcf,0x6, + 0x23,0x74,0xbd,0x76,0x91,0x1,0xbc,0x52,0x34,0x14,0xf1,0xe2,0x9a,0x10,0x82,0x1, + 0xf2,0xea,0x74,0x2a,0x3f,0x41,0x4e,0x80,0xa9,0xcd,0x4d,0xab,0x5f,0x6d,0xe4,0x92, + 0x1a,0xff,0x8e,0xa1,0x3c,0x61,0x8d,0x75,0xe3,0x95,0x9b,0x5d,0x71,0x8d,0xc1,0x5, + 0x91,0x7,0x51,0xac,0x3c,0x94,0x78,0x3,0x69,0xae,0x50,0x32,0xb1,0x23,0x72,0x25, + 0xf,0x53,0xef,0xc3,0x3,0xa8,0x86,0x4d,0xcd,0x9a,0x30,0x96,0x85,0xd3,0x84,0x48, + 0x21,0xe9,0xbe,0x29,0xb3,0xf2,0x16,0x41,0x19,0x41,0xfe,0x5c,0x3a,0x28,0x7f,0xbc, + 0x73,0x72,0x69,0xde,0x23,0x70,0xc1,0x66,0x63,0x19,0x53,0xdc,0x63,0x31,0x58,0xf3, + 0xe,0xbd,0x45,0x1c,0x6d,0x46,0x83,0x96,0xc,0x6d,0x13,0x44,0xd0,0xad,0x93,0x44, + 0x6f,0x9a,0xa5,0xef,0x4e,0xe7,0x2c,0x89,0x4c,0xaa,0xe9,0x1e,0x11,0xf,0x86,0xb2, + 0xd6,0xa8,0xd5,0x19,0x4,0x7f,0xbb,0x3a,0x6d,0x6d,0x60,0xf5,0x76,0x54,0x84,0xd1, + 0xf,0x58,0xca,0x93,0x66,0xb6,0x35,0xb7,0xbe,0x4c,0xf,0x90,0xe0,0x9d,0x13,0x33, + 0x97,0xc3,0x90,0xb1,0x95,0x1a,0x2b,0x4d,0xba,0x48,0xa6,0x35,0x51,0x61,0xa2,0xa4, + 0xfc,0x45,0x21,0x51,0x70,0xb4,0x3c,0x88,0xe1,0x6b,0x4f,0x6b,0xf,0x81,0x3f,0xab, + 0x1,0x5c,0x5f,0x9e,0x97,0x81,0x53,0x37,0x1b,0x29,0xb1,0x62,0x5e,0x14,0x3b,0x90, + 0xbc,0x91,0x69,0xcd,0x45,0x46,0x96,0xf6,0xa3,0xac,0x44,0x35,0x1b,0xf2,0x1c,0xe7, + 0x9b,0x5e,0xa1,0xf0,0xba,0x59,0xea,0x3b,0xb9,0xf6,0x61,0x82,0xe7,0x64,0x40,0xd, + 0x6e,0xbf,0x26,0xc3,0x43,0x5,0x93,0xf8,0x94,0x88,0xd5,0xc8,0xa1,0x56,0xb7,0xfa, + 0xa2,0xf3,0xfe,0x81,0xe0,0x70,0x50,0x42,0xa9,0xc5,0xc8,0xdb,0xbd,0x50,0x1d,0xe5, + 0x70,0xa2,0xf1,0x80,0xef,0x6d,0xb5,0x14,0xa9,0x84,0x27,0xe5,0x5c,0x86,0xde,0x32, + 0xbf,0xbc,0x67,0x78,0x9b,0x7b,0xfc,0x55,0x80,0x4e,0x3c,0x1,0xe7,0xc1,0xf,0x8b, + 0xc,0x28,0x3c,0x40,0xfc,0xf0,0x11,0xa9,0x52,0xc1,0xb0,0x85,0xd9,0xb1,0xd5,0x54, + 0x4a,0xc,0xb9,0xcc,0x9c,0x3,0x21,0x38,0xa,0x90,0x8,0x12,0x39,0xd,0x2c,0xd, + 0xef,0x53,0x7c,0xb1,0xd0,0xbe,0x9b,0xec,0x15,0x18,0x6a,0x6d,0x3,0xd1,0x81,0x43, + 0xe6,0xd5,0x57,0x17,0x8,0x6b,0x69,0x50,0xe,0x52,0xa8,0x5e,0xce,0x93,0x4f,0x8f, + 0x71,0x4c,0x8c,0x80,0xba,0x1e,0xca,0x2d,0x1e,0x2d,0x15,0x3d,0xb4,0xa6,0x8c,0x3f, + 0x9b,0x6,0x6b,0x3e,0x7c,0x6e,0xb5,0x8e,0xdd,0xe8,0xc3,0x25,0x9,0x44,0xbd,0xed, + 0xa4,0xc3,0x9b,0xa4,0xdf,0x35,0xc4,0x72,0x3e,0x81,0x6d,0x16,0x46,0x94,0x61,0x33, + 0x58,0x11,0xb0,0x33,0xac,0x31,0xfc,0x7f,0x8d,0x38,0x46,0x18,0xb8,0x55,0x92,0xba, + 0x6a,0x52,0x57,0x92,0x61,0xc5,0xde,0x6f,0x84,0xa8,0xd9,0x82,0x4a,0x62,0x95,0x2f, + 0x6e,0xa2,0x70,0x9d,0x43,0xb3,0xf2,0x48,0xe1,0x4a,0x8d,0xc6,0xa0,0x47,0x2d,0xa2, + 0xd0,0x3c,0x15,0xc,0xda,0xe7,0x40,0xee,0xd2,0x3e,0xc4,0xab,0x8c,0xae,0x54,0xde, + 0x29,0xbf,0x9b,0x10,0x4,0x78,0xc7,0x98,0xdf,0x4e,0x76,0xd7,0x94,0x92,0xc9,0x5d, + 0x8d,0xea,0x52,0x58,0xa9,0x50,0x93,0x36,0x9e,0xb8,0x4e,0xd9,0x51,0xe2,0x91,0xbb, + 0x53,0x54,0x3a,0xe3,0x73,0xb5,0x47,0xea,0x65,0xd6,0xb1,0xb8,0x63,0x62,0xd9,0x7d, + 0x27,0xd4,0x5,0x5f,0xba,0x1a,0x97,0xb9,0xc6,0x7,0x2b,0xe,0x69,0xb3,0x96,0x42, + 0x4b,0xfe,0x79,0xf1,0x9f,0x6b,0xdd,0xb5,0x23,0xe4,0x3,0xb9,0xc8,0x54,0x22,0x49, + 0x85,0x60,0xf3,0x50,0x5a,0x73,0xda,0xd0,0x2a,0xa7,0x5f,0xc7,0x51,0x28,0x5b,0x7c, + 0xb0,0x33,0x18,0x39,0x10,0x93,0xf,0x46,0x4b,0x96,0x28,0x97,0x42,0xe,0xa4,0x9, + 0x40,0x8a,0x45,0x76,0xfa,0x47,0xe4,0xd5,0xa0,0x68,0x32,0x8,0x37,0x2e,0x30,0xe, + 0xc4,0xbd,0x4,0x81,0x83,0x52,0xe5,0xc7,0x1,0x51,0xf4,0x65,0x2b,0x82,0xae,0xbe, + 0xb,0x1f,0xb9,0x37,0x1e,0x35,0xad,0x59,0xb4,0x8e,0xe9,0xa6,0x31,0x7a,0x14,0x3, + 0x94,0x38,0xe2,0xf,0xf7,0x3c,0xb9,0xc3,0xac,0xc1,0x12,0xe1,0xdc,0x1d,0x6b,0x8a, + 0xf4,0x64,0x9c,0x5c,0x3a,0x91,0x23,0xac,0x8d,0x9f,0x9a,0x58,0x75,0xa6,0xb5,0x48, + 0xf3,0x54,0x20,0x6c,0xb5,0x27,0xe3,0xb8,0x19,0x5b,0xe,0xdb,0x2f,0xdb,0x61,0x13, + 0xcf,0x8a,0x30,0xb,0xdb,0x7d,0xb9,0x11,0x48,0x6a,0x5f,0xbb,0xe7,0x9d,0xa6,0xae, + 0xcd,0xbe,0x56,0x57,0xf5,0x33,0xef,0x60,0x10,0x30,0x1d,0x92,0xa2,0x1,0x2c,0xb7, + 0xb9,0x5c,0xc2,0x29,0xe4,0x5d,0x3f,0xf3,0x4,0xfc,0xbc,0xe4,0xb8,0x45,0x8d,0x97, + 0x4c,0x96,0x29,0x13,0x89,0x28,0x59,0x35,0x3c,0x26,0x5,0x9e,0x87,0xe,0xeb,0xa2, + 0x50,0x6c,0x8f,0x49,0x64,0x48,0xc8,0xb3,0x79,0x4f,0xf7,0x12,0xf0,0x90,0xd7,0x3d, + 0xa9,0xdd,0x9e,0x48,0xab,0x74,0xd8,0x63,0x65,0xd1,0x53,0xa4,0x67,0x5a,0xcd,0x18, + 0xd7,0xd5,0xf5,0xff,0xf1,0x22,0x78,0xc7,0x13,0x91,0xe5,0x4c,0x47,0x1b,0xc5,0x59, + 0xe4,0x1e,0x4f,0xcf,0xd6,0x40,0xf1,0x7a,0x2c,0x82,0x47,0xa4,0xb2,0xbe,0x43,0x88, + 0x32,0x6f,0xa9,0x66,0xcc,0xc8,0x2f,0xea,0x60,0xe,0x45,0xd1,0x7a,0xa1,0xf2,0x94, + 0x52,0x65,0xa9,0xc6,0xd4,0x30,0xb0,0xf6,0x87,0x2a,0xa9,0x45,0x1b,0x92,0xe8,0x76, + 0xa2,0x93,0x5c,0x79,0x92,0xad,0xb4,0x9b,0xe7,0x51,0x79,0x36,0x5a,0x51,0x6,0xb1, + 0x62,0x3b,0x5b,0x4f,0x45,0x78,0x2f,0xa7,0x61,0xaf,0x9b,0xf,0x51,0x9f,0xea,0x92, + 0x9d,0x8,0x1a,0xc2,0xea,0x84,0x22,0xc6,0x95,0x98,0x78,0xb8,0xb2,0x6e,0xe8,0xc2, + 0x2d,0xc9,0x69,0xf6,0x30,0xf3,0xd7,0x66,0xff,0xa3,0x75,0x83,0xb,0x12,0x45,0x15, + 0xa4,0x48,0xf7,0x0,0x21,0x9d,0x48,0x61,0xd3,0xba,0x20,0x24,0x4c,0x88,0xe7,0xde, + 0x3e,0xbd,0x32,0x32,0x8d,0xf5,0x65,0x10,0x43,0x9a,0xc3,0x3f,0xd5,0x83,0xb4,0xe0, + 0x11,0xc6,0x61,0x34,0x30,0x0,0x9c,0xee,0xa3,0x50,0x26,0xb5,0xbc,0x46,0xf4,0x2e, + 0x1,0x2,0x12,0xd,0x83,0x0,0x65,0x36,0xe1,0xf0,0xf1,0x9c,0x3a,0xd2,0x7a,0xc6, + 0xda,0xb9,0x84,0x61,0x4c,0xa7,0x31,0x79,0x11,0x16,0xd6,0xb9,0x91,0xd0,0x54,0x2e, + 0xef,0x64,0x7f,0xd6,0xf2,0x65,0x64,0xbb,0x23,0x19,0xa4,0xb7,0xfc,0xea,0x44,0xfa, + 0x13,0xd9,0x78,0xfe,0xc8,0x9b,0xac,0xba,0x14,0x94,0xe2,0xe9,0x33,0xb6,0x9d,0x6e, + 0x72,0x8,0xd5,0x45,0x4,0xa7,0x8b,0xb4,0xd,0xe9,0x7,0x97,0xd,0x1c,0xd4,0xfc, + 0x37,0x2d,0xf3,0xb6,0x3a,0xf6,0xd5,0x25,0xfc,0x25,0x61,0x3d,0x5a,0x20,0xa3,0x94, + 0x98,0x90,0xe2,0xb8,0xd3,0x26,0x91,0x6f,0x2b,0x33,0xd4,0x99,0xa0,0x5d,0x84,0x42, + 0x74,0x21,0x85,0xed,0x84,0x1b,0x7f,0x19,0x14,0x6c,0x2f,0x4a,0x62,0xa7,0xfc,0xfd, + 0xa2,0x4c,0x4b,0x20,0xc4,0x47,0x21,0x83,0x1e,0x94,0xd6,0x2f,0xf9,0xc3,0x5e,0x6c, + 0xcf,0xa0,0x99,0x11,0x8,0x96,0xb1,0xd8,0xa3,0xfd,0x20,0x54,0x2d,0x0,0xa2,0x3c, + 0xbd,0xa2,0xae,0xaa,0x16,0x27,0x2c,0x58,0x5a,0xc4,0x15,0x65,0x18,0x9b,0xd5,0xc0, + 0x4e,0x8d,0xb0,0x58,0xec,0x68,0xc6,0xcb,0xb8,0x51,0x43,0x43,0x41,0x73,0x46,0xd, + 0xd5,0x1c,0xaf,0x9f,0x93,0x68,0x58,0xe3,0x92,0x9a,0xdb,0x1d,0xcf,0xd0,0x71,0x1b, + 0x62,0x54,0x31,0xe,0x8a,0x9f,0x9d,0x39,0xe1,0x4c,0x53,0x15,0x6a,0xd3,0x1a,0xd0, + 0x8c,0xe,0xfc,0xdc,0xce,0x73,0xad,0x53,0x21,0x41,0xba,0x2a,0x36,0xc3,0x4d,0x16, + 0x41,0x13,0xca,0x20,0xf4,0xd4,0x24,0x2c,0x97,0x10,0xef,0xc3,0x4b,0xc8,0x8b,0xd0, + 0x5a,0x47,0xa4,0xd6,0x20,0xf1,0x75,0x48,0xa4,0x6c,0x42,0xb7,0xd6,0x12,0x61,0x55, + 0x63,0xa5,0x74,0x4c,0xb6,0xf2,0xb,0x19,0x2b,0x32,0x1e,0xa6,0xb4,0xa2,0x18,0x8f, + 0x4b,0x42,0x93,0x5a,0x70,0x16,0x3f,0x4d,0xe8,0x76,0x5f,0x55,0xac,0x2b,0x3e,0x40, + 0x53,0xd7,0x44,0x7b,0x57,0xbe,0x1c,0x81,0x22,0x6b,0x5a,0x80,0x45,0x42,0xb0,0x21, + 0x2f,0x3b,0x62,0x5d,0x1e,0xd1,0x92,0x74,0xb0,0x5,0xd1,0x8,0x2b,0xb2,0xb3,0x6d, + 0xa8,0xc2,0x29,0xee,0x52,0x73,0x22,0x64,0x29,0xd8,0xf9,0x82,0xa5,0x6d,0x93,0xa, + 0xf,0x2a,0x8,0x6b,0x1c,0xc1,0x97,0x6e,0x83,0x89,0xb2,0x1c,0x21,0x6d,0xca,0x27, + 0x35,0x2b,0xfa,0x5d,0xc,0x4f,0x91,0xac,0xce,0xbf,0xa0,0x91,0x54,0xa3,0xdc,0xcd, + 0xd0,0x9f,0xf0,0x4a,0x82,0x84,0x5e,0x1a,0x47,0xe9,0xdc,0xe0,0x98,0x1e,0xa7,0x13, + 0xcb,0x88,0x8a,0xd0,0x9,0xf6,0x8a,0x6f,0xd,0x25,0x78,0x2b,0x26,0x44,0xb3,0x61, + 0x73,0xda,0xf4,0xb4,0x38,0xc6,0xca,0x52,0x7b,0xa8,0xa3,0xc0,0x5,0x94,0x32,0xf, + 0x3f,0x78,0x74,0xd0,0x99,0x11,0xe1,0xe5,0x38,0x1,0x95,0x1a,0x1c,0x69,0xc9,0x7a, + 0x96,0x81,0xd2,0x8c,0x89,0x27,0x22,0x1c,0xcc,0x36,0xb4,0x1a,0x45,0xe9,0x58,0x2f, + 0x3a,0x36,0x38,0x9b,0xcc,0x4a,0xa4,0x32,0x89,0x38,0x5,0x75,0xc5,0xa8,0x21,0x83, + 0xa9,0x9c,0x7f,0x96,0xa6,0xb7,0x50,0xcc,0x43,0xb6,0x2f,0xe8,0xc5,0x61,0xe1,0xf1, + 0xac,0xe9,0x6b,0x49,0xd3,0x72,0x50,0xe0,0xc5,0xa1,0x1c,0x54,0xce,0x2c,0xfb,0xe5, + 0x74,0x7d,0xe9,0xa,0x7f,0x96,0x95,0xf,0xbd,0x6,0xaf,0xa7,0xf0,0x76,0xf5,0xce, + 0x62,0x8b,0x88,0xc6,0x79,0x8b,0xd5,0xde,0x16,0xc9,0x3a,0xac,0x79,0x23,0x5f,0xea, + 0x94,0x81,0x76,0xf6,0xab,0xf3,0xd6,0xb6,0x2a,0xd7,0xb5,0x8a,0x5b,0x24,0x9b,0x65, + 0x17,0x9d,0x0,0xa,0xcc,0x20,0xbe,0x94,0xd8,0xdd,0xb9,0xd7,0x75,0x39,0xb,0x40, + 0x97,0x5,0x95,0xbf,0x8b,0x27,0xa0,0x6f,0xe4,0xe8,0xa0,0x8a,0x84,0x72,0xa1,0x31, + 0xe3,0x44,0x67,0xe7,0x2c,0x65,0x94,0x9d,0xb1,0x67,0x71,0xf8,0x70,0x14,0x24,0xd9, + 0x2d,0x7b,0x2a,0xb7,0x94,0x34,0x78,0x92,0xb4,0x76,0xf5,0x67,0x98,0x88,0x76,0xb4, + 0x66,0x89,0xf5,0xde,0xea,0x1b,0x5,0x4f,0x74,0x9c,0x3c,0x86,0xd8,0xc1,0x26,0x20, + 0x4e,0x4c,0x2f,0x34,0xf,0xf2,0xb7,0xa5,0xa5,0x6,0xfd,0x61,0xa5,0x54,0x43,0xe, + 0x4e,0xb0,0x9f,0xa5,0x92,0xaf,0x56,0x8b,0xb7,0xc9,0xf2,0xeb,0x35,0x73,0x70,0x41, + 0x2c,0xdf,0xfa,0x33,0xb4,0x5b,0xa7,0x73,0x3d,0x6f,0x2c,0xca,0x16,0x8b,0xee,0x28, + 0xe2,0x92,0xe,0x72,0x25,0xda,0x69,0xac,0xba,0xed,0x57,0x5d,0x79,0xcb,0xb8,0x68, + 0x5a,0x36,0xf2,0x9a,0x78,0x37,0x83,0xe1,0xeb,0x53,0xda,0xd3,0x22,0x98,0x33,0xf6, + 0x75,0xb5,0xc8,0x82,0xdd,0x48,0xea,0xdb,0xb2,0xe7,0xc4,0xa0,0x3c,0xa,0x4e,0xa5, + 0x29,0x6,0xd,0x1a,0xcd,0xaa,0x7,0x54,0xe3,0x2d,0x69,0x1,0x48,0xb7,0xe0,0x90, + 0x3c,0xa5,0xea,0x55,0xb,0x3f,0x80,0x27,0x46,0x45,0x79,0xb6,0x21,0xd6,0xac,0x8b, + 0x45,0x48,0xe2,0xb2,0xa7,0x5f,0xdb,0xef,0xee,0xc8,0xf9,0xef,0xbe,0x2e,0x93,0x20, + 0x91,0xdb,0xb9,0x69,0xd4,0x94,0x9e,0xf7,0xf0,0x64,0x80,0x6b,0x1,0xa8,0xe3,0x1d, + 0x3a,0x1,0x7f,0x18,0xdd,0x5b,0xb0,0x23,0x8,0xe1,0xa7,0x86,0xc8,0x6c,0xf9,0x5d, + 0x62,0x58,0xe1,0xb8,0xb0,0x28,0x76,0xce,0x78,0x12,0xc4,0xbf,0xdb,0x38,0x96,0x35, + 0xa8,0x9f,0x7e,0xc,0x6b,0xc4,0x32,0x13,0x17,0x8e,0x6c,0x4,0xfe,0x1c,0x7a,0xe2, + 0x65,0x59,0x4b,0xc6,0x8f,0x7a,0x2e,0x74,0x52,0x7,0x6a,0x79,0xe0,0x42,0xda,0x6e, + 0x46,0x3b,0x4f,0x60,0x50,0xfd,0x29,0x5a,0xf0,0x4e,0xb,0x2d,0x96,0xc4,0x88,0x7d, + 0x4,0xa7,0xa6,0x41,0x67,0x43,0x5e,0x93,0x21,0x7d,0xdf,0x49,0xe,0xab,0x42,0x49, + 0x51,0xa1,0x59,0xea,0x9e,0x7b,0xd2,0x38,0xa3,0xcb,0xd3,0xf5,0x92,0x30,0xb0,0xd8, + 0xa3,0xb3,0x85,0x3b,0x4d,0xa7,0xa8,0xd4,0x2b,0x4d,0x5a,0xe8,0xcf,0x4c,0x4b,0xc6, + 0x8a,0x6f,0x39,0x44,0xdb,0x7a,0x49,0x35,0xe1,0x5d,0x75,0x69,0x33,0x6b,0x72,0x4c, + 0xcb,0x6c,0x6c,0x9a,0x8,0xaf,0x7,0xc1,0xe7,0xfd,0x5f,0x79,0x74,0x6c,0x4,0x68, + 0x43,0x56,0x90,0x72,0x95,0x5a,0xa,0xaa,0x7a,0x85,0xb5,0xe8,0x4e,0x30,0x6a,0x24, + 0xf7,0x5f,0x52,0xb5,0xaa,0x12,0x29,0xbf,0x40,0x8b,0xf1,0x40,0xc1,0x1f,0x32,0x58, + 0xd7,0x8a,0xd2,0xf1,0xf9,0xf9,0xd5,0x32,0xe9,0x67,0xcb,0xcb,0x9b,0xfe,0x7e,0x1a, + 0x9f,0x42,0x56,0x84,0x31,0x8d,0xf2,0x62,0x86,0x19,0x7,0x4b,0xcc,0x43,0xa7,0xc3, + 0xaa,0x69,0xda,0x5f,0x4e,0x48,0x78,0xe4,0xec,0x6,0x21,0x6d,0xf5,0xd9,0xae,0x36, + 0xa9,0x74,0x29,0x66,0x87,0x42,0xe4,0xbc,0xd4,0x15,0x4c,0xe3,0x61,0x16,0x3d,0x53, + 0xe1,0xaf,0x42,0x7a,0x89,0xd2,0x8e,0xb2,0x31,0x12,0x10,0x1c,0x11,0xeb,0xe5,0x9e, + 0x51,0x6,0x2,0x29,0x2b,0xba,0x3c,0xc3,0xae,0x1d,0x4e,0xc7,0x28,0x47,0xe8,0xf2, + 0x28,0x51,0xe,0x80,0xfd,0x6,0x14,0x95,0xbe,0x7,0xbb,0x2c,0xde,0x38,0x37,0x21, + 0xc7,0x5a,0x72,0x33,0x24,0x8e,0x7c,0xe9,0xfc,0xdc,0xd5,0x5,0xd,0xd,0x86,0xb6, + 0x34,0x8f,0xa8,0x5e,0xe0,0xe5,0x70,0x63,0x2f,0x8a,0x66,0x91,0xd8,0xe4,0x9f,0xab, + 0x48,0xc1,0xaa,0xd1,0xa8,0xad,0xfb,0x8,0x0,0x9b,0x85,0xb8,0xd2,0x51,0x2f,0x7b, + 0x38,0x5,0xf9,0xc2,0x9c,0x80,0x92,0xf9,0xb5,0x2a,0x9,0x2e,0xfd,0xc2,0xb,0xc, + 0xac,0x48,0x9,0x4b,0xca,0x5b,0x4b,0xcd,0x5,0x2f,0x74,0x59,0xaf,0x2e,0xcd,0x52, + 0x12,0x78,0x4a,0xed,0xbe,0xf2,0x99,0xa0,0x90,0x92,0xb7,0x2d,0xc9,0x64,0x22,0xb2, + 0x8c,0xf5,0x59,0xa0,0x58,0x8a,0xab,0xb8,0xd4,0x47,0xa5,0x3,0xd0,0x36,0xc3,0x61, + 0x29,0x8,0x73,0x80,0x10,0xa9,0xe,0x46,0xc6,0x24,0x60,0x13,0xd7,0x26,0x11,0xe3, + 0xd9,0x72,0x41,0xe2,0xf5,0x29,0x45,0xc7,0xce,0xa4,0x3a,0x7f,0x7e,0xe3,0xbf,0x85, + 0x30,0x5a,0x68,0x5c,0x60,0xf4,0x33,0xf4,0x88,0xd2,0xb9,0x7f,0xf4,0xd0,0x1a,0x49, + 0xca,0x70,0xc5,0xaa,0xef,0x26,0x8b,0xb2,0x6e,0x6a,0x38,0x3,0xf2,0xdd,0xd8,0xb7, + 0xaa,0x68,0x9e,0x83,0x53,0x86,0x4e,0xaa,0x49,0x60,0x4d,0x6a,0x21,0xb,0xd3,0x10, + 0xad,0xa2,0xce,0xe0,0x59,0xc3,0x61,0x60,0x3e,0x43,0x89,0xff,0x7e,0xda,0x8b,0x4b, + 0x1a,0x33,0x61,0x29,0xb,0x5b,0xe8,0x9d,0xe8,0xf9,0xe0,0x15,0x13,0x4f,0x72,0x7b, + 0x79,0x36,0x91,0x27,0xeb,0xae,0x55,0xf2,0xe7,0x6f,0x40,0xc,0xa3,0x21,0x6e,0x74, + 0x17,0xc0,0xac,0xb9,0xb9,0x4b,0x3a,0x44,0x6b,0xb2,0x17,0xa9,0x90,0xaa,0xd4,0x56, + 0x66,0xf9,0x84,0x6,0x22,0x3d,0x6d,0xfa,0x1f,0xcd,0x1e,0x49,0x3a,0xe9,0x96,0x60, + 0xb5,0x8d,0x24,0x19,0x4e,0xdd,0xcc,0x1,0xf1,0x3e,0x23,0x87,0xe7,0xfb,0xf9,0x4b, + 0xc5,0xbe,0xc9,0x0,0xa5,0x4a,0xf,0x43,0xb4,0xf0,0xb,0xa3,0x91,0xa1,0x9a,0xfe, + 0x78,0x1a,0xc3,0x25,0xad,0x47,0xf0,0xa0,0x73,0x95,0xce,0x3f,0x98,0x18,0xf9,0x65, + 0x5a,0x9b,0x44,0x51,0x92,0xbc,0xe5,0xbc,0x7d,0xc4,0x22,0x13,0x8f,0x87,0xa5,0x97, + 0xae,0x43,0xf9,0xcf,0xf1,0x8b,0xc3,0x89,0x42,0x64,0xed,0x33,0xd5,0x26,0x29,0xa9, + 0x93,0x21,0x39,0x3f,0xb0,0x5b,0xc0,0x15,0x29,0x94,0x1b,0x94,0xfd,0x95,0xdb,0x77, + 0x54,0xb2,0xf5,0x2b,0x49,0x65,0x4d,0xbd,0xe4,0xa3,0x94,0xa2,0x8a,0x47,0x2a,0x24, + 0xb2,0x4c,0x70,0x13,0xd4,0xc0,0xa0,0x69,0x92,0x9a,0x7,0xe2,0x8a,0x75,0x77,0x48, + 0x5f,0xbf,0x2c,0x3a,0x2b,0x7b,0x39,0xe3,0x3c,0xd0,0xc5,0x26,0x26,0xa4,0x7a,0xe6, + 0x70,0x94,0xa5,0xd8,0x13,0x42,0x22,0x83,0x8c,0x8,0x8a,0x32,0x7,0xc9,0x41,0x1f, + 0xc2,0xfa,0x47,0x37,0x46,0xe8,0x3e,0x96,0xc0,0x9e,0x2e,0x34,0xf3,0xb4,0x59,0xc6, + 0x80,0xc8,0x63,0x40,0x8a,0x75,0xd4,0x54,0x8d,0x23,0xe7,0x3c,0x9b,0xc,0x3a,0xdd, + 0xfe,0x20,0x51,0x54,0x36,0x3e,0x92,0x4d,0x20,0xbf,0xae,0x9a,0x9d,0x13,0x43,0xf7, + 0xe5,0x1e,0x7f,0xa4,0x8d,0x80,0xa6,0xc2,0x4e,0xeb,0x58,0x1e,0x36,0x11,0xd4,0x85, + 0x79,0x11,0x53,0x14,0x59,0x57,0x50,0xda,0x92,0x89,0x0,0xb6,0xc9,0xcb,0xe3,0x22, + 0x7f,0x9e,0x81,0xe8,0xbc,0x29,0xcc,0x28,0x8a,0xc7,0xe5,0xbf,0x9e,0x17,0xbe,0x1c, + 0x64,0x42,0x45,0x1b,0x34,0xb2,0xc9,0x7c,0x20,0x39,0x50,0xb8,0x22,0x83,0xbb,0x61, + 0xb7,0x4c,0x8b,0xf4,0x18,0x65,0xc4,0x8,0xf3,0xf8,0x91,0x2,0x3e,0x24,0x80,0x7c, + 0x12,0x2f,0xe4,0x24,0x9f,0x6a,0x73,0xea,0x99,0x8f,0xe0,0x13,0x9c,0xb1,0xec,0x49, + 0xa2,0xd8,0x44,0xd7,0x75,0x25,0xcb,0x9a,0xaa,0xc0,0xb,0x85,0x21,0xb2,0x8b,0x67, + 0xab,0xf8,0x42,0x9c,0x6,0x5c,0xa,0xf5,0xd4,0xca,0x18,0xf3,0xa8,0x8e,0xdc,0x58, + 0x81,0xec,0x24,0x65,0xd8,0x79,0x61,0x91,0xb5,0x58,0x6a,0x31,0x83,0x91,0x26,0xc8, + 0xa9,0xd4,0xf4,0x2b,0x52,0xaf,0x46,0x9e,0x15,0xb1,0xb1,0x6c,0xc9,0xe1,0x7,0x8b, + 0xae,0x3e,0xf2,0x7c,0x16,0x94,0xb0,0x94,0x4,0x81,0xe0,0x28,0x37,0x2d,0x2c,0xd9, + 0xa2,0x8,0x95,0x1c,0x66,0x13,0x70,0x37,0x95,0xfa,0x94,0xc7,0x64,0x68,0x7d,0x3f, + 0xe,0x3,0xc0,0x43,0x3b,0x12,0x1a,0xe3,0xb2,0x28,0x25,0xd4,0xce,0x6d,0x19,0x62, + 0xd1,0x68,0x3c,0x3f,0xa5,0xc5,0xf2,0xb6,0x88,0x5f,0x6a,0xca,0x8c,0xea,0x46,0xdc, + 0xb0,0xcd,0x44,0xb4,0xe8,0x1e,0x1d,0x63,0x89,0x3c,0x14,0x97,0x65,0xec,0x66,0x67, + 0x19,0xfb,0xb3,0x39,0xdd,0x73,0xd3,0x1c,0x2d,0x99,0x2c,0x56,0xb5,0x97,0x7e,0x5d, + 0xb4,0x7d,0x69,0xa7,0xba,0x2d,0x74,0x20,0x25,0x9d,0x2e,0xa2,0x1a,0xcd,0xf6,0xf1, + 0x2c,0xc0,0x48,0x91,0x2e,0xbc,0xfb,0xcb,0xa0,0x9a,0x5c,0x54,0xd9,0xc1,0xa4,0x95, + 0x92,0x6,0xb6,0xce,0x31,0xb2,0x17,0x45,0x4,0xb8,0xc8,0x87,0x14,0xad,0xa5,0x7e, + 0x39,0x7d,0xed,0x3c,0xc3,0xa5,0xf9,0xfb,0xfc,0x9c,0x92,0x5a,0x56,0x93,0xea,0x58, + 0xb7,0x40,0xc,0x39,0x7f,0x2f,0xc7,0x11,0x71,0x86,0x6f,0x2c,0xe7,0x34,0x2b,0x9a, + 0x53,0x75,0xad,0x21,0x74,0x4,0xb0,0xf1,0xc4,0xc4,0x4e,0x76,0x75,0x94,0xf2,0xf, + 0xb8,0x84,0xa3,0x14,0xa6,0x32,0xef,0x83,0xd1,0xca,0x6a,0x5,0x7c,0xe4,0x49,0xb2, + 0x6f,0x69,0xfd,0xc1,0x27,0xab,0x4a,0x7d,0xb7,0xb0,0x91,0x14,0x88,0xf0,0xe7,0x86, + 0x5b,0xcd,0x4,0x7a,0x8e,0xff,0xe,0x85,0x6d,0x7c,0x6f,0x2a,0x1,0xd6,0x57,0xb3, + 0x38,0x8,0xdf,0xf6,0x5a,0x7c,0xef,0x5a,0xec,0x36,0x69,0x62,0x56,0x34,0x1a,0x33, + 0xa,0x9b,0x3a,0x7a,0xfe,0xfe,0xa1,0xeb,0xa,0x4a,0xd2,0x4e,0xb7,0x94,0x2b,0x61, + 0x61,0x2b,0xcb,0x28,0x8d,0x9d,0x22,0x17,0x20,0x69,0xc7,0x4c,0xbc,0x9,0x2f,0xe0, + 0x43,0x91,0xa1,0xed,0xf3,0x68,0x5f,0xe1,0x47,0xf,0x11,0xaa,0x8,0xf1,0xe9,0x59, + 0xcc,0x21,0x60,0xec,0x3b,0x19,0x5d,0xe6,0xa,0x58,0x19,0x63,0x61,0x79,0xa9,0x3b, + 0x37,0x6b,0x68,0x61,0x59,0x1a,0x9a,0xb1,0xf9,0xde,0x38,0xb3,0x9e,0x78,0xa5,0x4, + 0x96,0x38,0x48,0x9f,0xad,0x1e,0x9d,0x8b,0xc0,0xba,0x8b,0xd8,0xf0,0x9f,0x22,0xa4, + 0xd4,0xdc,0xbd,0x24,0x4c,0x5b,0xe8,0x66,0xa0,0x64,0xdf,0x23,0x7,0x4,0xf1,0xfc, + 0xb5,0xc,0x94,0x7c,0x44,0x0,0xd,0xf6,0x1c,0x7f,0xe6,0x6b,0xd3,0xd1,0xca,0xcb, + 0x62,0x9a,0xea,0x45,0x42,0x3e,0xc0,0xed,0x6a,0x58,0x42,0x64,0x1f,0xbd,0x4d,0xc0, + 0x48,0x0,0xa7,0xfe,0xfe,0xf8,0xed,0x22,0x48,0x32,0x68,0x9e,0x44,0x29,0xfb,0x18, + 0xd6,0xc7,0x13,0x49,0x83,0xb4,0xa5,0x4a,0x93,0x7d,0x36,0xde,0xed,0x2,0x7d,0x1d, + 0xbb,0x23,0x9d,0xc1,0x2a,0x87,0x72,0x40,0x5f,0x54,0xaa,0xf4,0x2,0x98,0xe,0x32, + 0x17,0xb0,0x52,0xf,0x8a,0x3d,0x17,0x57,0x4d,0x93,0x59,0xff,0xba,0x6b,0x4e,0xdb, + 0xe0,0xcb,0x48,0x41,0xaa,0x6a,0x53,0x3d,0x4b,0xda,0xe8,0xf9,0xbf,0xdf,0x49,0x46, + 0x11,0x5d,0x6e,0x70,0x93,0xec,0x25,0xea,0xd5,0xef,0x20,0xf1,0xc2,0xf1,0x85,0xc8, + 0x2,0xb9,0xc4,0x18,0xe5,0x95,0xb9,0x50,0x50,0x89,0xac,0xdc,0xf5,0x64,0x49,0x28, + 0xf,0x98,0x6c,0x7c,0x46,0xd8,0x18,0xa7,0x8b,0x4,0x1f,0x3a,0x7d,0xe4,0x9,0x41, + 0x9,0x7a,0xa7,0xeb,0x8c,0x1b,0x75,0x9f,0x16,0x63,0x5f,0x21,0xce,0xbe,0x63,0xb4, + 0x5a,0xb2,0xa2,0x20,0x95,0xb6,0xb6,0xf2,0xd0,0xec,0x19,0xa7,0x94,0x29,0x4d,0x4f, + 0x7b,0x2d,0x2,0x22,0x58,0x52,0x37,0xbf,0x67,0x49,0x9d,0x6,0x78,0x77,0x6f,0x4, + 0xa8,0x6c,0x1,0x75,0xe3,0x2c,0x5f,0x18,0xa6,0xe8,0xcd,0x2f,0x13,0xaa,0x5f,0x2e, + 0x8d,0xcd,0xa3,0xf3,0xca,0xdb,0x2c,0xce,0x74,0x49,0xff,0x96,0x2a,0x47,0xcd,0x95, + 0xb7,0x57,0xf6,0x94,0x95,0x6b,0x75,0xcf,0x8c,0x84,0xba,0xe2,0x48,0xba,0xb9,0xf0, + 0xc,0xd0,0xbe,0x5f,0xf3,0xa8,0x6f,0xc9,0x56,0xde,0x76,0xa9,0x68,0x1a,0x1,0xab, + 0xa0,0x7c,0x22,0x1e,0x73,0x3c,0x9d,0xe,0x93,0xf3,0x54,0x3a,0x89,0x89,0x4c,0xa6, + 0xb6,0x93,0xc7,0x20,0x50,0x8e,0xe4,0xc5,0xe2,0xd9,0xee,0xf4,0xef,0x68,0x7c,0x76, + 0xe,0xe6,0x70,0xbd,0x57,0xb6,0xf4,0x65,0xe4,0x18,0x65,0x2,0x40,0x57,0x5f,0x78, + 0x14,0x72,0x2d,0x69,0x79,0x56,0x41,0x1f,0xb2,0x87,0x3e,0x62,0xef,0xf3,0x88,0xb1, + 0xfe,0x4c,0x84,0xd6,0x56,0x69,0xf2,0x28,0x6b,0xf0,0xf,0x58,0xf4,0xd5,0x9c,0xe8, + 0x12,0xf1,0xcc,0x8c,0x6f,0x1a,0x7f,0x4f,0xb5,0xa,0x67,0x9a,0x15,0xd9,0xea,0x17, + 0xbf,0x1b,0xad,0x69,0x9d,0x24,0xb9,0x38,0xc7,0xcc,0x2e,0xee,0x39,0x1e,0x7b,0xfe, + 0xbd,0xf4,0xfc,0x23,0x3d,0x81,0xe1,0x3b,0x45,0xee,0x82,0xc5,0xf7,0xb6,0xca,0xb6, + 0x9b,0x96,0x6d,0xad,0x34,0xd5,0xd2,0x8d,0xcb,0xb,0x4b,0xa2,0x88,0x50,0x90,0xba, + 0xad,0x2,0x24,0x6f,0x28,0x51,0x27,0xa2,0xad,0x62,0xc5,0x97,0x9,0x1f,0x72,0x28, + 0x4c,0x84,0x29,0x94,0xb3,0x7,0x59,0x84,0x1a,0x13,0x5b,0x58,0x6,0x82,0x8a,0xac, + 0x45,0xe5,0xf6,0x65,0xbc,0xae,0x45,0x65,0x63,0x6d,0x99,0x79,0x8d,0x5c,0xac,0x27, + 0x37,0x1,0x1b,0x4c,0x13,0xea,0x50,0x37,0xd6,0x80,0xe3,0xdf,0xf,0xf4,0x2b,0x72, + 0x9a,0x56,0xd2,0x10,0x53,0x60,0xbb,0x6c,0x79,0xe1,0x20,0x15,0xd4,0xb4,0xf9,0x31, + 0xd3,0xc,0x9b,0x3,0xcf,0xf3,0xcd,0xce,0xff,0x4d,0x2a,0xf1,0xe1,0x4a,0x9b,0x48, + 0x1f,0x23,0xb5,0x68,0x28,0xb3,0x95,0x55,0x81,0x59,0x1d,0x8c,0xcd,0x8f,0xbe,0x55, + 0x8f,0xb9,0xe4,0x30,0x70,0xcd,0xd3,0xb,0xaa,0x2,0x7b,0xba,0x23,0x52,0x90,0x9f, + 0x91,0x8b,0xb4,0x42,0x54,0x91,0x1a,0xfd,0xa8,0xa8,0xbb,0x84,0x19,0xcb,0xb2,0xe6, + 0x11,0x58,0xca,0x32,0x96,0x55,0xb7,0xf6,0x81,0xc7,0x9c,0x9b,0x7b,0x46,0x6c,0xf0, + 0x86,0xd9,0x45,0x90,0x47,0x39,0xbc,0x77,0x50,0x84,0xc5,0x2d,0x33,0x2,0xf6,0x46, + 0xbd,0xa2,0x74,0xb6,0x54,0x10,0xb7,0xd2,0x6,0x24,0x71,0x92,0x56,0x55,0x29,0x8a, + 0xb7,0xd7,0x7f,0xa6,0xa0,0x2,0xdd,0xed,0x59,0xe1,0x6f,0xa9,0x16,0xcb,0x7d,0x23, + 0x2b,0x56,0xa1,0xc6,0x69,0xd6,0x18,0xf0,0x96,0x58,0xdf,0x50,0x62,0x8c,0xa7,0x28, + 0x83,0x26,0x75,0xf4,0xac,0xb2,0xf,0x3c,0xc2,0xbc,0x71,0xb2,0x5e,0x94,0xf,0x54, + 0xa5,0xec,0xd5,0x83,0xd9,0xe0,0x9c,0x4,0xe5,0x39,0xfe,0x6,0xf8,0x24,0xdb,0x2b, + 0x93,0xd,0x12,0x9e,0x18,0x5d,0x74,0x2f,0x59,0xb7,0x31,0x16,0xc5,0xbe,0x3b,0xd1, + 0xa,0xa9,0xd0,0x35,0x25,0xa,0x6c,0xf,0x4,0x7d,0x36,0x5a,0x57,0xea,0x79,0xb9, + 0xd9,0xdc,0x5e,0x80,0xc4,0x28,0x47,0x3c,0xbd,0x5d,0x73,0xd1,0x5,0xd9,0x26,0x72, + 0xf5,0x75,0xe,0x66,0xd,0x81,0x64,0x36,0x42,0x1a,0x6f,0x11,0x1f,0x82,0x95,0xe9, + 0x95,0xc2,0x57,0xd4,0xcf,0x1b,0x2b,0x8f,0x85,0x98,0xa8,0x69,0x6e,0xeb,0x1f,0x46, + 0x3a,0x73,0x90,0xd2,0xa2,0xfd,0x32,0x45,0xcb,0x37,0x36,0xa8,0xbc,0xdf,0x28,0xe, + 0xcb,0x74,0x89,0x27,0xa3,0x33,0xed,0xcf,0x5d,0x39,0xc1,0xbe,0xef,0xe4,0x99,0xd2, + 0xe8,0x3a,0xa1,0x3c,0x19,0xac,0xc5,0xf,0xfd,0xf7,0xeb,0x7f,0xbd,0x6f,0xae,0xca, + 0x38,0x4d,0xc7,0xd6,0x1d,0x2d,0x55,0xac,0x5d,0x95,0x2,0x91,0x40,0xa,0x37,0x72, + 0x98,0xb4,0x55,0x29,0xa2,0x1b,0xd3,0xd8,0x74,0x94,0x41,0xd2,0x3b,0xc7,0x79,0x21, + 0xeb,0x3,0xa4,0x85,0x4d,0xbd,0x46,0x48,0x63,0x63,0x0,0x9f,0x9f,0xb6,0xd0,0xe8, + 0xb3,0x76,0xa7,0x67,0x5f,0xc9,0x64,0x7,0x24,0x8b,0x6b,0x72,0xb7,0xa0,0x4e,0x3, + 0x8a,0x66,0x68,0x5d,0x89,0x8e,0x7f,0x36,0x48,0x71,0xf4,0x3b,0x3a,0xb6,0x5a,0x7b, + 0x49,0xf9,0xe7,0x69,0x2c,0xb8,0x31,0x2a,0x48,0x56,0x9e,0x14,0xb,0xa1,0x1,0x3e, + 0x40,0x15,0xb6,0xe7,0x11,0x1c,0x77,0x24,0x48,0x49,0x3d,0xcd,0x57,0x95,0x2a,0x89, + 0x72,0xaa,0x55,0x30,0x93,0xc6,0xfe,0x49,0x5c,0x91,0x2f,0x8f,0xba,0xea,0xce,0x5e, + 0xef,0xd2,0xf5,0x72,0x8,0x3,0x77,0x17,0x52,0x7d,0xb,0x42,0x88,0x4c,0xee,0xba, + 0xa5,0xaa,0x5f,0xca,0xfe,0x8b,0x15,0xd7,0xd5,0x37,0xbb,0x5a,0xe9,0x64,0x63,0x2, + 0xc2,0x76,0xa8,0x5e,0x5e,0x3b,0x4d,0xea,0x92,0x5c,0x2c,0x7b,0xbd,0xd4,0xe2,0xb2, + 0xcc,0xaf,0x6d,0xbe,0xa4,0xb0,0x8c,0xa9,0xa5,0x88,0x8c,0x24,0xa9,0xc4,0x85,0xc5, + 0x69,0x99,0x8c,0xc4,0xbc,0x6e,0x66,0x14,0x69,0x8a,0xb2,0xac,0xaa,0xaf,0xbc,0x2f, + 0x6,0xb2,0x3c,0xdc,0x91,0x43,0xe9,0xf0,0x26,0xb9,0x45,0xd4,0x19,0x58,0x4,0x66, + 0x89,0x93,0xdb,0x78,0xb5,0xd4,0x16,0x71,0xa4,0x8b,0xef,0x66,0x41,0xdc,0x79,0x7, + 0x97,0xfe,0xf4,0x96,0x1d,0x8,0x52,0xec,0x3f,0x9b,0xdd,0x3a,0xf6,0x88,0x47,0xc9, + 0x62,0x87,0xac,0x94,0x35,0xb0,0x10,0xa5,0x7e,0x47,0xcb,0xc3,0x63,0xf4,0x78,0x96, + 0x35,0x6f,0x35,0x34,0xb1,0xc5,0x55,0xf6,0x84,0x4a,0xa4,0x4b,0xcd,0x22,0x91,0x50, + 0x58,0x15,0x61,0xa9,0xa2,0x2,0x5,0x1b,0x95,0x95,0x5d,0xec,0xc9,0xce,0x83,0x24, + 0x36,0xdb,0xd0,0xc,0x84,0xad,0x2d,0x41,0xf2,0x3a,0xad,0x71,0xc6,0xc4,0x4f,0x33, + 0xac,0x4b,0x65,0x39,0x20,0xf9,0x19,0xe7,0x89,0x2e,0xd6,0xc2,0xac,0x14,0x15,0xb9, + 0x7c,0xe6,0xfd,0xb3,0x12,0x2b,0xc9,0x44,0x14,0x83,0x4c,0xa8,0xca,0x3f,0x77,0xc3, + 0xd7,0x78,0xf4,0xb7,0xe3,0x38,0x36,0x18,0xf5,0x21,0x24,0x53,0x21,0xdf,0x87,0x54, + 0xdd,0x1f,0xaf,0x44,0x72,0x91,0x68,0x70,0x99,0xa4,0x5f,0x1,0xc2,0x39,0x84,0xb4, + 0xa,0x65,0x46,0x17,0x5,0x5e,0xa4,0x40,0xae,0xca,0x1,0x4b,0x67,0x8a,0x3f,0x12, + 0x98,0x38,0xb8,0x98,0x10,0x36,0xf,0xd7,0xa3,0x0,0x1a,0x2a,0x2a,0x5a,0x96,0x8f, + 0x69,0x8c,0xdc,0xed,0x74,0x84,0xb2,0x7a,0x50,0x13,0x4d,0x19,0x5c,0x64,0x9a,0x64, + 0x5d,0x79,0xc5,0x88,0xb5,0x10,0x73,0x70,0xa3,0x96,0xc2,0xa1,0x54,0xf9,0x7c,0x91, + 0xe5,0xcc,0x6a,0x37,0xdd,0x63,0x63,0x77,0x6c,0x42,0x91,0xfd,0xe3,0xf5,0x5a,0x8c, + 0xc7,0xe2,0xbd,0xd3,0xa7,0x44,0xa4,0x13,0x7f,0x47,0xc3,0x87,0x2e,0x9a,0x97,0x59, + 0xd,0x1b,0x73,0x7e,0x48,0xa,0x6e,0xdf,0x20,0xd1,0x67,0x8a,0x92,0x8d,0x70,0x5a, + 0xe2,0xa9,0x88,0xef,0x69,0x95,0x11,0x82,0xa1,0x1c,0x21,0xdb,0x4b,0xdf,0x1c,0x85, + 0xe6,0x2,0xa3,0x7,0x25,0xda,0x9,0x69,0x1e,0x4c,0x41,0x9d,0xb4,0x6a,0xfd,0x4e, + 0x38,0x8e,0xae,0xf2,0x7b,0xb6,0x2a,0x6e,0xda,0xcc,0xf9,0x58,0x97,0x84,0x33,0xc8, + 0x23,0xaf,0x6c,0x99,0xdb,0xf2,0x16,0x17,0xb,0x60,0x9,0x68,0xd8,0xe0,0x6,0x6e, + 0x8c,0x6d,0xc8,0x6a,0x67,0x86,0x4f,0x36,0xc8,0x90,0x40,0x83,0x3d,0xa5,0xfb,0xc6, + 0x46,0x75,0xf4,0xcb,0x0,0x85,0x45,0xf0,0x88,0x72,0x39,0xdb,0x77,0xd5,0x36,0x46, + 0x50,0x30,0x88,0x88,0xfa,0x74,0x60,0xdf,0x95,0x55,0x14,0xb1,0x92,0xe1,0xbe,0x99, + 0xe2,0xc9,0x9d,0xb6,0x81,0x6a,0xa2,0xc3,0x52,0xb,0xe4,0xb,0x95,0x5e,0xcb,0xfb, + 0xe9,0xad,0xae,0x2b,0x7d,0x7b,0xa8,0x23,0x32,0x9a,0x1a,0x70,0x72,0x56,0x7c,0x1d, + 0x70,0xa6,0x1,0xb2,0x62,0xda,0xf9,0xf7,0xc,0xbe,0xe6,0x62,0xa5,0xbe,0x5f,0x55, + 0x10,0x56,0xa0,0x14,0xbc,0x4a,0xc1,0xc6,0x3f,0xc3,0xd2,0x47,0x68,0x2a,0xec,0xc0, + 0xc,0x3b,0x89,0x1d,0x70,0x47,0x9e,0x39,0x6d,0xed,0xeb,0x53,0xcf,0x46,0xab,0xb8, + 0xac,0x7e,0x4e,0x81,0x10,0x25,0xd1,0x4c,0xca,0x34,0x49,0x53,0x97,0x58,0x38,0xb6, + 0x69,0x82,0x96,0xd3,0x65,0x1a,0xc5,0x70,0x3b,0x60,0x97,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x57,0x4e,0xdc,0x9e,0x16,0x8f,0x7b,0x71,0x6,0x64,0x30,0x7,0x36, + 0xa8,0x98,0xe5,0xf3,0xe3,0x9f,0xbd,0xd2,0x88,0x48,0xca,0x8e,0x38,0xd9,0x39,0x68, + 0x32,0x61,0x67,0x54,0x9,0x68,0xea,0x8b,0x34,0xd8,0xa2,0x3c,0x63,0x6d,0xd8,0x93, + 0x6f,0x2b,0x5b,0x99,0xd0,0x90,0xbe,0xb4,0xa,0xd1,0x2b,0x5a,0x21,0xac,0xb4,0xb1, + 0xb2,0x25,0x33,0x7b,0xd7,0xea,0x50,0xc8,0x7f,0xbe,0x6a,0x16,0xa0,0x96,0xe7,0x31, + 0xe9,0x5d,0x52,0x71,0x17,0x27,0x93,0x6c,0xaf,0xc1,0x52,0xf,0x1f,0x97,0x72,0x5b, + 0x7,0x20,0x4b,0xa4,0xed,0xd8,0xd,0xf7,0x96,0xef,0x15,0x2e,0xce,0x21,0xeb,0xe8, + 0x1c,0x84,0xe6,0xc6,0xc6,0x5a,0x6d,0x4b,0xdf,0x95,0xb4,0x22,0xf4,0xbc,0x29,0x22, + 0x5c,0x65,0x29,0xb0,0x4b,0x6f,0xbd,0x69,0x50,0x96,0x2d,0x57,0x7,0x81,0xc9,0x0, + 0x42,0x6d,0xe7,0x55,0xa1,0xad,0x28,0xe7,0xe,0xdd,0x5e,0xef,0x96,0x5f,0x7e,0xea, + 0x26,0xbc,0x53,0x2e,0xca,0x1d,0xb4,0xfa,0x33,0x59,0x47,0x38,0xfb,0x2f,0x8d,0xc, + 0xc0,0x43,0x75,0xed,0xa7,0x3,0x91,0x66,0x28,0xe2,0x6a,0x47,0x17,0x5b,0xa1,0xda, + 0x77,0x26,0xe0,0x1,0xf4,0x5f,0xe8,0x65,0xb8,0x8c,0x44,0x7c,0x53,0x76,0xc3,0xf9, + 0x44,0x10,0x1b,0x4,0x72,0xee,0xe0,0xbb,0x92,0x40,0xb8,0x65,0x4c,0x6e,0x16,0x9, + 0x41,0x6a,0x3a,0x3c,0xd6,0x39,0x42,0xea,0xcc,0x34,0x75,0xe9,0x4d,0x16,0x39,0x74, + 0xdd,0xd5,0x4e,0xc7,0xc2,0x18,0x8f,0x17,0xf7,0xc2,0x2f,0x49,0x3,0x2a,0xa8,0xb6, + 0x2a,0x3e,0x23,0x82,0x5f,0x79,0x6,0x2a,0x10,0xbb,0x24,0x21,0xf9,0x87,0xd8,0x48, + 0x3f,0x21,0x1a,0x97,0xfb,0x9a,0x5f,0x99,0xbb,0x2f,0x4f,0xae,0x93,0x6c,0x9,0xa0, + 0x57,0xdc,0x8a,0xde,0xee,0x93,0x1d,0x8f,0x7b,0x4c,0x90,0xa2,0x8a,0x5b,0x5c,0x5a, + 0xd3,0x32,0x66,0x83,0xb0,0x36,0x83,0xa2,0xa3,0xc2,0xde,0x23,0x11,0xb8,0x91,0x89, + 0x40,0x29,0x11,0xa8,0x6c,0xeb,0xd3,0xf3,0x96,0x15,0x7b,0x79,0x54,0xbb,0xee,0x61, + 0x25,0x53,0x3d,0xf6,0x4c,0x2d,0x96,0x35,0x96,0x2e,0xaa,0xa7,0xec,0x9d,0xf,0x7b, + 0x5f,0xfc,0x88,0x49,0x45,0x39,0x53,0x4c,0xc0,0xe4,0xbc,0x32,0xe6,0x9e,0x5,0x2b, + 0xb2,0x23,0x43,0x56,0xd1,0x6b,0x99,0x9e,0x61,0xa1,0x60,0xe4,0xbb,0x13,0x6b,0xd3, + 0x17,0x6b,0x92,0xb6,0x8f,0xf2,0xa6,0xb2,0x9d,0xd6,0x4e,0x87,0xa5,0xf2,0x2a,0x85, + 0x68,0x8c,0x28,0xeb,0xf3,0xaa,0x1d,0xda,0xca,0xa5,0x20,0x81,0xd5,0xbe,0x2,0x9c, + 0xcf,0xbb,0x2e,0x1e,0x19,0xe5,0x79,0xa5,0x4a,0x54,0x48,0x9d,0x55,0xb1,0xa5,0xc1, + 0x75,0xb5,0x69,0x8a,0xe1,0x6e,0xe7,0x27,0xad,0x9a,0x63,0x9e,0xd3,0xde,0xb6,0x90, + 0x19,0xb1,0x4d,0xc2,0xeb,0xfe,0xed,0x85,0xc0,0xae,0x4f,0x37,0x80,0x2,0x79,0x85, + 0xa1,0x12,0xca,0x75,0x80,0xa3,0x77,0x4b,0x81,0x90,0x27,0x82,0x20,0xf3,0xbe,0x69, + 0x24,0x14,0x5,0x98,0xa5,0x41,0x1b,0x81,0xae,0xe2,0x59,0xe2,0x99,0x5,0xc7,0x4d, + 0xdb,0x56,0xd3,0x55,0x2e,0xf0,0x2c,0x6a,0x86,0x20,0x13,0x39,0x29,0xd,0x20,0xbb, + 0xb3,0xe2,0x61,0x48,0xab,0x57,0x73,0x39,0x28,0x96,0x46,0x80,0xf5,0x40,0xaa,0xc2, + 0x39,0xb8,0x89,0x2f,0x90,0x6b,0x41,0x95,0xec,0x91,0x93,0x82,0xd7,0x5d,0x2f,0x79, + 0x6e,0x98,0xc7,0xdf,0x8d,0x4b,0xf8,0x70,0xf2,0x74,0xc5,0xf6,0x29,0xba,0x48,0xe9, + 0xb3,0x22,0x74,0x51,0x7e,0x12,0xa5,0x4a,0x37,0xba,0x2c,0xae,0x26,0xea,0x91,0x26, + 0x5c,0x6d,0xfa,0xe8,0x32,0x14,0x11,0x66,0xf,0x59,0x3b,0x93,0x5a,0xe5,0x48,0xd9, + 0x1f,0xb7,0xf2,0x5d,0xc4,0x5f,0x43,0x97,0x84,0xac,0x32,0x7a,0xc6,0x46,0xa8,0x9, + 0x8d,0xc2,0xa5,0xa4,0xa4,0xa5,0x0,0x9a,0x8d,0xfd,0x56,0xea,0x36,0x90,0x4,0x57, + 0xa9,0xf8,0x90,0x75,0x8f,0x8f,0xd,0x3b,0x4e,0x56,0x10,0xd7,0x82,0x67,0xbd,0x38, + 0x90,0x83,0xbf,0x18,0x81,0x4a,0x9d,0xe,0xed,0x57,0x94,0x7e,0x5e,0x8d,0x3b,0x4d, + 0x52,0x2d,0xfb,0xe8,0x36,0xa,0xd,0x5d,0xaa,0x5f,0x5d,0xb5,0x16,0x2a,0x8b,0x75, + 0x3,0x79,0x41,0x59,0x4e,0x8f,0xf5,0xa,0xd8,0x10,0x35,0x61,0xe3,0x72,0xd0,0xae, + 0x64,0x31,0x4a,0x18,0xb6,0xb6,0x5e,0x46,0xe5,0xc3,0x4f,0xec,0x92,0x79,0x51,0xa1, + 0x8e,0x31,0xb9,0x60,0x48,0x48,0xf3,0x28,0xc2,0xd8,0x10,0xd1,0xa5,0x5e,0xc,0x95, + 0xb,0x1d,0x6f,0x73,0xfc,0xa7,0xe0,0x3f,0xa7,0xb0,0xc,0x71,0xa9,0x48,0xef,0x17, + 0xad,0x3a,0x74,0x9,0x52,0xda,0x3f,0x89,0x90,0xad,0x60,0x92,0x85,0x56,0xc7,0xdd, + 0xd3,0x76,0x78,0x33,0x5c,0x61,0x9f,0x7a,0xb,0x52,0x5f,0x83,0xf6,0x18,0x59,0x3d, + 0xd5,0x59,0xb7,0xc2,0x5a,0x92,0xcf,0x89,0x13,0x4c,0x40,0x98,0xbc,0x33,0x95,0xc4, + 0x9f,0xca,0x71,0xe6,0x94,0xe6,0x87,0xd4,0x41,0x6a,0xc3,0xa6,0x58,0xb3,0xbe,0x53, + 0x1b,0xe4,0xf6,0xb2,0xd1,0xd4,0x74,0xa8,0xa7,0x2d,0x10,0x3d,0x3f,0xd4,0x5a,0xc3, + 0xcf,0x25,0x37,0x18,0x30,0x5f,0x79,0xd5,0x85,0x54,0xd1,0x91,0x4a,0x15,0x88,0x65, + 0x71,0xa6,0x6b,0x71,0xd2,0xfb,0x1e,0x28,0x6a,0x24,0x41,0x9d,0x2c,0xe7,0x18,0x58, + 0xc4,0xb8,0x8e,0xef,0xd3,0x4,0xa3,0xf3,0x8,0x8d,0x9e,0x5b,0x4a,0xdd,0xe3,0x11, + 0xb9,0xbd,0x5f,0xa4,0x8f,0xd4,0xbc,0xfa,0x94,0xf5,0x68,0xec,0x25,0x69,0x30,0x89, + 0x1a,0xb5,0x7c,0x26,0xa4,0xb4,0x77,0xd,0xbd,0x99,0xe,0x92,0xb0,0x73,0xc3,0x1a, + 0x3a,0x6d,0x94,0xeb,0x33,0xa7,0x6b,0x77,0x54,0x84,0x94,0xa0,0xc1,0x4,0xaa,0xbd, + 0x68,0x23,0x52,0x5c,0xf6,0x38,0x58,0x2a,0xed,0x7d,0x1f,0xa2,0xd8,0x45,0x71,0xb6, + 0x43,0x47,0x4,0xc9,0x3a,0xa1,0xc8,0xbe,0xd9,0xae,0x9b,0x3a,0x5c,0xa9,0xf1,0x60, + 0x5b,0x17,0x53,0xaa,0x4a,0xaa,0xda,0x9d,0x1b,0x4f,0x68,0x9,0x86,0xa1,0xb8,0xc2, + 0x6d,0xd7,0x6e,0xc1,0x38,0x22,0x55,0x2d,0x75,0x3e,0xa3,0xe,0x47,0xa0,0xbd,0x57, + 0x82,0xcd,0x24,0x50,0x42,0xb1,0xf4,0xc8,0x22,0x1e,0x4b,0x7c,0xa7,0x3a,0x7e,0xaa, + 0x87,0x7f,0x2b,0xda,0x2f,0xa8,0x50,0x78,0x18,0x61,0x3c,0xf7,0xed,0x53,0x36,0x26, + 0x96,0xe0,0xdd,0xd6,0x6,0x73,0x9f,0x33,0xbd,0x55,0x45,0x36,0x69,0x5f,0xf9,0xeb, + 0xd6,0x65,0xe4,0xb8,0x16,0x12,0x79,0x78,0x44,0xd9,0xcd,0xc8,0x7d,0xaf,0xad,0xc6, + 0x3b,0xb2,0xc2,0xcc,0x26,0x3a,0x29,0x38,0x2b,0x55,0xbc,0x20,0xa,0x9a,0x16,0xb7, + 0x67,0xcb,0xbb,0x13,0x9a,0x26,0x68,0x56,0xcb,0x85,0x76,0x21,0x92,0xb7,0x82,0x15, + 0xba,0x54,0xc1,0x39,0x75,0x6c,0xbb,0xdb,0xd3,0xbc,0x43,0x63,0x65,0x37,0x15,0x7b, + 0x14,0xe1,0x56,0x12,0x8,0x53,0x0,0x69,0xda,0xf3,0xf6,0x32,0x45,0xa8,0xa3,0x5f, + 0x4e,0x86,0x43,0x32,0x33,0x91,0xb0,0x8f,0x9e,0xab,0x4e,0x8a,0x64,0x2e,0xa,0x12, + 0x7e,0x98,0xd0,0xb1,0xb5,0x50,0xd2,0xcd,0xc3,0x46,0xb2,0x52,0x5,0x92,0x8b,0x23, + 0xdd,0xa3,0xb0,0x5f,0xf4,0x36,0x75,0x5a,0xa0,0x7b,0xf5,0x1,0x7b,0xce,0x2c,0x91, + 0x25,0x3a,0x98,0x46,0xe7,0x26,0xa4,0x6b,0x9c,0xbf,0xbd,0x45,0x87,0xab,0xd0,0x2b, + 0xa2,0xbc,0xc9,0x1a,0x9e,0x81,0xb2,0x75,0xcd,0x54,0xaf,0xc4,0xa5,0x5f,0xa,0x10, + 0x94,0xd5,0xab,0x1a,0xd4,0x3c,0x4d,0x16,0x91,0x9d,0x2c,0x29,0x6e,0x82,0xde,0x4c, + 0x84,0xe3,0x3,0x7c,0xee,0x6e,0x84,0x19,0xc6,0xcf,0xb8,0x65,0x47,0x5f,0xcb,0xe9, + 0x47,0xfb,0x45,0x5f,0x1b,0x8d,0x84,0x16,0x2a,0xc,0x17,0x7f,0x95,0x3b,0x2,0x2d, + 0x3b,0x7a,0xa5,0x55,0x2e,0xd7,0xb0,0x1a,0xc1,0x4a,0xe,0xa2,0x29,0xcf,0x24,0x65, + 0x7f,0xbb,0x3e,0x44,0x13,0xb5,0x31,0xe0,0x3a,0xcc,0x0,0x91,0x96,0x5e,0xf3,0xcf, + 0xa3,0x82,0x62,0xe3,0x27,0xdc,0xa5,0x14,0x88,0xa5,0xd1,0xe2,0xf7,0x39,0x2d,0xa5, + 0x58,0x5c,0x9e,0xce,0x77,0xa5,0xa7,0xad,0x6a,0xa6,0xdb,0xfa,0x99,0x4a,0xc9,0x91, + 0xdf,0x57,0xe5,0xcc,0xdf,0x73,0x28,0xad,0xed,0x71,0x91,0x6f,0x8c,0x9e,0x44,0xb6, + 0x3b,0x66,0x3a,0x3c,0xf7,0xf9,0x68,0xa3,0xa3,0x97,0x65,0xc7,0xb5,0x8c,0xdc,0x96, + 0x8e,0x8c,0xc2,0x60,0x94,0x53,0x42,0x87,0x70,0x2e,0x58,0xd8,0x4a,0x96,0x37,0xa5, + 0xf3,0x9e,0x2a,0xc3,0x32,0x22,0xa9,0x82,0x17,0xf0,0xb,0x5a,0x26,0x9c,0x35,0x3a, + 0x52,0x7c,0xfc,0xc7,0xf9,0x63,0x79,0x8f,0x12,0x40,0xc1,0x9,0xcd,0x10,0xec,0x41, + 0x67,0xb2,0x3e,0x60,0x43,0x60,0xb2,0x21,0xda,0xd3,0x82,0x24,0x5d,0xd6,0x31,0x4b, + 0x96,0x7a,0xdd,0x25,0x4a,0xbe,0x6c,0x5d,0x64,0xa4,0x1b,0xd6,0x5,0xe6,0xa8,0x53, + 0x6c,0x8a,0xb9,0x16,0x9a,0x8d,0xd0,0x1d,0x8f,0xeb,0xa3,0xa0,0x5a,0x74,0x2c,0x23, + 0xdf,0x54,0x9c,0xe5,0x68,0x53,0xa1,0x69,0x46,0x46,0x65,0x51,0xb0,0xa4,0x84,0x1d, + 0x4a,0xfc,0xb0,0xac,0xe3,0xe5,0x50,0xcb,0xe6,0xea,0x58,0xf3,0x3b,0x51,0x2f,0x6e, + 0x89,0x74,0x1e,0x45,0xe6,0xbc,0x4b,0x6b,0xcb,0x7b,0x91,0xf1,0xc2,0x5b,0xa2,0x32, + 0x5d,0x6c,0x2d,0xeb,0x48,0x54,0xcb,0xcf,0x21,0xbf,0x77,0x58,0x78,0x7,0x75,0x72, + 0xe1,0x5c,0xeb,0x65,0xa2,0x84,0xba,0xae,0x1,0x6d,0xd4,0x55,0x43,0xdf,0xc2,0x90, + 0x95,0xb2,0x5f,0x5c,0xb,0xc2,0xfc,0xa5,0xf4,0x65,0x6b,0xa3,0xc2,0x6,0xd0,0x25, + 0xcb,0xbb,0x8,0xde,0xfc,0xf0,0x76,0x1f,0x8b,0xd6,0xb8,0x8e,0x12,0x6b,0x2b,0x4, + 0xc4,0x5b,0x5d,0x2e,0xba,0x31,0x39,0x5a,0x9e,0x6f,0xc9,0x14,0x11,0x14,0xb6,0x3, + 0x4d,0x6b,0xd6,0xb3,0xb,0x4a,0xa9,0x33,0x15,0x3a,0x42,0x4f,0x9b,0x89,0x68,0x53, + 0xd2,0xa0,0x4a,0xce,0x27,0x88,0xf4,0x3c,0x91,0x44,0x14,0xa4,0xc4,0x79,0xa6,0x86, + 0xa9,0x8b,0x6c,0xd7,0x70,0x2c,0xad,0x0,0x42,0xa7,0x1b,0x6a,0x5d,0x29,0x15,0xf2, + 0x63,0xda,0xa4,0x2d,0xe2,0x39,0x8d,0xf5,0x53,0x29,0x5,0x91,0x1c,0x37,0x7c,0xc5, + 0xb5,0xe2,0xbe,0xd8,0xa2,0x5f,0x5a,0x4b,0x55,0x4c,0xf4,0x44,0xed,0xdf,0x67,0x91, + 0x6,0x9a,0xbf,0xf3,0x16,0x3e,0xb3,0x3d,0x17,0x5e,0x82,0x7b,0xf2,0xaa,0x63,0x36, + 0xe,0x51,0x18,0x84,0xb0,0x91,0x8d,0x7f,0x5d,0x65,0xf,0x59,0x33,0xfe,0x9b,0x15, + 0xed,0x9a,0xb,0x81,0xe2,0x18,0xe0,0x90,0x70,0xa,0xc5,0x2,0x68,0x52,0x5a,0xba, + 0x7c,0xa5,0xd1,0x93,0xfd,0xf3,0x43,0xb4,0x8,0xaf,0xb0,0x18,0x4c,0xab,0xec,0x97, + 0x3b,0x75,0x99,0xce,0x96,0x7,0x56,0x78,0xec,0xa1,0x7b,0x6a,0xff,0x2a,0xf4,0x41, + 0xc2,0xf1,0xe7,0xa2,0x85,0xd2,0x6c,0xb6,0xb9,0xd5,0xf4,0x82,0x66,0xe5,0xe0,0x7a, + 0x68,0x6a,0xd8,0xc3,0xa,0xe0,0x1d,0x54,0x61,0x87,0x6a,0xbd,0x64,0x80,0x13,0x4b, + 0x1b,0x45,0x21,0x1b,0x3f,0xe0,0x40,0xf0,0xad,0x63,0x23,0x5d,0xb,0x88,0x32,0xe, + 0xcc,0xda,0x1,0xaa,0xde,0x4b,0x9a,0x24,0x36,0xdb,0x96,0xda,0x1f,0x63,0xbb,0xdb, + 0x5a,0x26,0xd9,0x4d,0x42,0xed,0x3c,0x47,0x52,0xba,0x71,0x88,0x92,0x7d,0x4e,0x9d, + 0x5b,0xcf,0xaa,0xe9,0x2c,0x40,0xaa,0x21,0x7,0x19,0x25,0xb9,0x7a,0x48,0x84,0xe0, + 0xbb,0x49,0xab,0x91,0x3e,0xbb,0x55,0x71,0xbf,0x6e,0x60,0x37,0x5e,0xfc,0x45,0xc0, + 0xc7,0xe3,0x48,0x49,0x7c,0x74,0x56,0x35,0xf3,0x8,0x7e,0x29,0x3a,0x69,0x15,0xa5, + 0x7b,0x5,0x68,0x21,0x6c,0x92,0xd,0x37,0xbc,0xa7,0x7,0x25,0x3b,0x7b,0x2e,0x22, + 0x96,0xb1,0x8c,0xdb,0x49,0x59,0x3f,0xd1,0x24,0x7,0x26,0xe5,0xcf,0x21,0x69,0x59, + 0x50,0xde,0xcb,0x46,0xda,0x14,0x9a,0x2e,0xb8,0xf6,0x84,0xe,0x10,0x8,0x36,0x6d, + 0xa6,0x5b,0x7,0xac,0xb,0x54,0x89,0xac,0x66,0x2,0x33,0xcb,0x9e,0x5f,0x2e,0xd4, + 0x3a,0x21,0x62,0x2a,0x23,0x7d,0x7a,0x5e,0x20,0x7e,0x8e,0x3b,0x80,0x3f,0xb6,0xac, + 0x78,0x47,0xd6,0xca,0x24,0x3,0x8d,0x2e,0x13,0x95,0x9c,0xaa,0x90,0x87,0x3c,0xb9, + 0x38,0x28,0xa3,0xa7,0x1c,0xf,0xb6,0xae,0x93,0x28,0x41,0x64,0x5d,0xb7,0x49,0x54, + 0x85,0xd,0xd4,0x6f,0x4b,0x5a,0x23,0x4a,0xf2,0x8c,0x6f,0xad,0x91,0xb2,0xf8,0x2f, + 0x15,0xc7,0xdc,0xbd,0x67,0xc5,0xdb,0xc6,0xb3,0xbc,0x7e,0xbe,0xd8,0x8c,0x17,0x25, + 0xa4,0xb4,0x64,0x46,0x47,0xf6,0xbd,0x64,0x7e,0xfe,0x3e,0xf9,0x2f,0x92,0x4f,0x7e, + 0x41,0x85,0x6d,0x44,0x9a,0xe8,0x76,0x17,0x4c,0x2b,0x54,0x17,0xd8,0x15,0x8b,0xf6, + 0xfa,0xae,0xc7,0xef,0x5d,0xa7,0xf,0x1b,0x53,0x4e,0x29,0xeb,0x4f,0xe8,0xca,0x85, + 0xae,0xc9,0x6c,0xf5,0xbf,0x3f,0xbb,0xaa,0xae,0x9a,0xa4,0xab,0x79,0x7d,0x56,0xcf, + 0xbf,0xd9,0x38,0x29,0x91,0xe2,0x9c,0x67,0x5d,0xaa,0x7c,0x2c,0x3f,0xb6,0x32,0x4a, + 0x92,0xed,0x2a,0x45,0x58,0x2d,0x9b,0xc0,0x2d,0xb4,0x4b,0xd3,0xbc,0x57,0x61,0x51, + 0x80,0x83,0xf0,0x5d,0xf5,0x19,0x41,0x22,0x4b,0x6a,0xd9,0x86,0xb8,0x4d,0x37,0xc4, + 0xd,0x5e,0xe9,0x6b,0x1,0xe4,0x1b,0x19,0x6a,0xe9,0xe0,0x75,0xef,0xe8,0xbb,0xee, + 0xe5,0xd7,0x11,0x3f,0x55,0xec,0x15,0xc8,0x80,0xfc,0xb5,0x25,0x64,0xae,0x56,0x95, + 0xbd,0x6e,0x8,0x4d,0xea,0xf6,0x45,0x97,0xee,0xcc,0xf6,0xe4,0x29,0xf9,0x8c,0x3b, + 0xfd,0x96,0xa3,0xc8,0x9d,0x71,0xbe,0x74,0x4d,0xcd,0x62,0x11,0x53,0xa7,0x87,0x8d, + 0xbd,0x22,0xea,0xee,0x54,0x73,0x22,0x37,0x80,0x39,0x6a,0x6c,0x41,0xb2,0x96,0x56, + 0x3a,0x65,0x2d,0x16,0xae,0xad,0xe,0x80,0xbe,0xce,0x14,0xd2,0xae,0xfb,0x84,0x1c, + 0xfb,0xc5,0xfc,0x1c,0x31,0xbb,0x39,0x7a,0x94,0x8d,0x95,0x43,0x15,0xda,0x48,0xb2, + 0xf1,0x4,0x4,0x46,0x8b,0x12,0x3d,0x8a,0x33,0x10,0x10,0x26,0x71,0xa0,0x25,0x17, + 0xaf,0xba,0xa8,0x65,0xb7,0xf6,0xaa,0x2d,0xb1,0xe9,0x73,0xb7,0xd,0x9f,0x20,0x2d, + 0x64,0x2f,0x8e,0xa0,0x54,0xf5,0xf7,0x4b,0x1b,0x97,0x4c,0xad,0x40,0xf9,0x74,0x7d, + 0xc7,0x96,0x7b,0x9c,0x12,0x4c,0x36,0xf2,0x1c,0xb6,0x42,0x7f,0x64,0xaf,0xcb,0x1, + 0xcb,0x44,0xae,0x16,0xe8,0x4c,0x30,0x83,0x64,0x30,0x95,0x50,0xa,0x95,0x15,0xe9, + 0x3d,0x8d,0xb7,0x63,0x22,0x11,0xdd,0x6d,0x2b,0x85,0x81,0x96,0xa7,0xaf,0x15,0xea, + 0x60,0x4a,0x14,0xc8,0xe4,0x89,0x46,0xe2,0xb,0xad,0xbb,0xf6,0x96,0xc5,0x63,0x69, + 0x8f,0x8b,0x45,0xd,0x53,0xb9,0x1c,0x69,0x5,0xd5,0xb6,0x83,0xde,0x91,0x56,0x13, + 0xba,0x8a,0x2b,0xf7,0xae,0x44,0x56,0x7e,0x1,0xf6,0x94,0xcf,0x39,0xad,0x52,0x6b, + 0xb4,0x40,0xce,0x96,0xdf,0xf0,0xb3,0xc7,0x5d,0x82,0x3d,0x65,0x48,0xa3,0xf5,0xa5, + 0xfd,0x8c,0x5b,0x7e,0xf5,0x5,0x39,0xb2,0x92,0x34,0x3f,0x89,0x19,0x52,0xa7,0xb1, + 0xe5,0x68,0xe8,0xdb,0x1e,0x8e,0xd,0xf,0x84,0x2e,0x81,0x5d,0x71,0x97,0x21,0x83, + 0x8f,0xf6,0x68,0x2d,0x62,0x90,0x81,0x8d,0x22,0x4d,0x69,0x5a,0x54,0x47,0x42,0x45, + 0xbc,0x39,0xcf,0x50,0xfb,0x2c,0xe,0x71,0x50,0xab,0xc4,0x96,0x3b,0x6e,0xd9,0x27, + 0x52,0x2f,0xb9,0xe0,0x5,0x89,0xca,0x41,0x9b,0xf9,0xf7,0xa8,0xec,0xdb,0xc8,0xaf, + 0x55,0xaa,0x10,0x8e,0x74,0xed,0x52,0x3a,0xa9,0x5e,0xb3,0x9d,0xac,0x8,0x64,0x18, + 0x7a,0x41,0xf,0x42,0xe7,0x96,0xb7,0xc5,0xb8,0x45,0xdd,0xcb,0x8a,0x94,0x13,0xcd, + 0xa2,0xa5,0x34,0x4e,0xa4,0x51,0x68,0xd8,0xd5,0x5b,0x22,0xeb,0x68,0xcb,0x5f,0xc7, + 0x3e,0x84,0xe8,0x3e,0xab,0x4e,0x8a,0x30,0x4a,0x23,0x72,0xd9,0x8,0xa1,0x97,0x3c, + 0x65,0xa0,0x3c,0xf1,0xaa,0x42,0xdd,0x12,0x88,0x55,0xe2,0x42,0xe7,0x9a,0x97,0x27, + 0x1d,0xce,0xc5,0x5e,0x11,0x8d,0x32,0x23,0x4f,0x63,0xc2,0xa3,0x85,0x9a,0xb4,0x56, + 0xfa,0x9b,0x54,0xa5,0x42,0xf2,0x43,0x8a,0x37,0x6d,0x11,0x92,0x91,0xbc,0xa3,0x65, + 0xff,0xb,0x6c,0x78,0x2c,0x75,0xcf,0x82,0x56,0x97,0xbf,0x95,0x87,0xb,0x48,0xb6, + 0x16,0xe7,0x81,0x57,0xbb,0xd8,0xd2,0x3d,0x6a,0xe5,0x5e,0xfb,0xb3,0xb6,0x3d,0xe, + 0xce,0x85,0x12,0x24,0x63,0x8a,0x42,0xc3,0xa9,0xce,0x9f,0x4f,0xcc,0x5,0x2e,0x4c, + 0xcb,0xe5,0xd9,0xe5,0xf3,0xa7,0x5d,0x58,0xba,0x1f,0xa6,0x21,0x62,0x59,0xdf,0x14, + 0x68,0xac,0x7f,0x1e,0x79,0x13,0xba,0xa,0x6e,0xf3,0xe7,0xba,0x5,0xeb,0xd0,0xe4, + 0x76,0x88,0xf3,0x4c,0xa9,0xd0,0x6c,0x65,0x62,0xb1,0xa1,0x15,0xa9,0xd6,0xaa,0xc5, + 0xcb,0xae,0x44,0xed,0xca,0x72,0xa,0x6c,0xec,0x90,0x43,0x38,0x19,0x6b,0x97,0x8, + 0x60,0x29,0xee,0x83,0xa6,0xe5,0x2a,0xb0,0x77,0x8d,0x4,0xa5,0xa6,0xa7,0x28,0x93, + 0x8e,0xae,0xeb,0xbe,0x4c,0xcb,0xbe,0x3a,0x65,0x50,0x80,0x89,0x71,0x3c,0x36,0xaf, + 0x54,0xbc,0x3a,0xa9,0x42,0x50,0x31,0xe7,0x67,0x11,0xaf,0x32,0x9,0xb1,0x90,0xcb, + 0xf8,0xcc,0x40,0xd0,0x24,0xa8,0x5d,0x2d,0x18,0x5b,0x24,0xc3,0xfd,0xe7,0x5e,0x2a, + 0xda,0x44,0x16,0xe8,0x15,0x40,0xa2,0xe3,0xd,0x5b,0x98,0xff,0xec,0x36,0x2c,0xc9, + 0xeb,0xe4,0x82,0x5,0xcc,0xa0,0x7b,0x40,0x64,0x8b,0xee,0x9,0xda,0xbf,0x6b,0x99, + 0x4e,0x6,0xf8,0x89,0x68,0xa7,0x9f,0x93,0xbb,0xa0,0x89,0x3c,0x29,0x45,0x1f,0x84, + 0x7c,0x7f,0x90,0x6e,0x20,0x9,0x33,0xad,0x49,0x1a,0x69,0x6b,0xa4,0xce,0x4c,0x54, + 0x36,0x94,0xb1,0x28,0xb6,0xb0,0x49,0xf1,0x45,0xb6,0xb2,0x70,0xd6,0xad,0xec,0xf3, + 0x7d,0xad,0x52,0x11,0x66,0xa2,0x64,0xef,0xa2,0x86,0x15,0x6b,0x56,0xad,0x4b,0x8, + 0x43,0x20,0x1b,0xcf,0x12,0x1d,0x25,0x8b,0x3e,0x60,0x45,0x87,0xa6,0x1d,0xa4,0xe7, + 0x2e,0x3b,0xf8,0x1f,0x94,0xbb,0x4e,0x4a,0xcf,0xb6,0x25,0x22,0x91,0xe5,0xb2,0xca, + 0x3f,0x8a,0xb5,0xf2,0xab,0xd0,0xff,0x75,0x7d,0x91,0x41,0x46,0xac,0x13,0x90,0xb4, + 0xbf,0x85,0x8f,0xd3,0xd9,0x4a,0x96,0xf7,0x3a,0x1a,0x87,0x10,0xef,0xf,0x45,0x37, + 0x3e,0xbf,0x72,0x58,0xea,0xe7,0x88,0x97,0x36,0x96,0x2d,0x28,0x9e,0x87,0xba,0x42, + 0x0,0x72,0x22,0x56,0x46,0x81,0x22,0xf9,0xb6,0xa3,0x9b,0x35,0xeb,0x4a,0x74,0x4e, + 0x6b,0xda,0x93,0x48,0xe,0x0,0x58,0x1a,0xf4,0xe4,0xd3,0x8f,0x5a,0x35,0x3f,0x4f, + 0x48,0x21,0x29,0xf9,0x79,0x5b,0x64,0x9b,0xe6,0x7c,0xa0,0xcb,0x2a,0x8b,0x39,0x9b, + 0xe3,0xb1,0x37,0x29,0x7e,0x25,0x19,0xcc,0x30,0xbb,0xfc,0xe5,0x2f,0xf4,0xc0,0xa6, + 0x45,0x40,0xb3,0xe7,0xe7,0xa1,0x7b,0x1e,0x4e,0x17,0xea,0x71,0x3c,0x50,0x62,0x3a, + 0x6c,0x8b,0x91,0xdc,0xe5,0xd2,0x36,0xfc,0xf4,0xba,0x3d,0xe1,0x50,0xb7,0x63,0x25, + 0xd7,0xa5,0x8f,0xf,0x4b,0x2d,0x96,0xbb,0x14,0x95,0xb0,0x29,0x36,0xba,0xc4,0x91, + 0xc1,0x38,0x7b,0xf4,0xea,0xee,0x1e,0x48,0x2b,0x8b,0x6c,0x1d,0xd4,0xe4,0xa7,0xc7, + 0xca,0x96,0xf0,0xaf,0x76,0x6b,0x14,0xca,0xce,0x3,0x5d,0x6b,0xcb,0x2a,0x4e,0xe2, + 0x3c,0x71,0x29,0x29,0x4f,0xe9,0xe6,0x6d,0x31,0x89,0x54,0x95,0x7a,0xac,0xbb,0xf6, + 0x81,0xbe,0xe7,0x9e,0x9e,0xa7,0x66,0x9,0xed,0x69,0x57,0xaf,0x99,0xb5,0x9e,0x43, + 0x44,0x24,0x21,0x98,0x23,0x38,0xa4,0x14,0x12,0xfc,0x75,0xf4,0x4d,0xa7,0x3b,0x59, + 0xbe,0x8a,0xf0,0x1c,0x5b,0x71,0x8e,0xac,0xed,0x68,0x28,0x6f,0x32,0x28,0x25,0x52, + 0xb7,0xd5,0xe7,0xfb,0xce,0x23,0x7,0x64,0x68,0x16,0x9f,0xb1,0x32,0x7f,0xeb,0xac, + 0x93,0x2d,0x36,0xdd,0x5a,0x4,0xc8,0xd2,0xed,0x6b,0x1a,0x85,0xf6,0x74,0xbe,0x90, + 0x0,0x53,0x91,0x58,0xfc,0x5a,0x4,0xcb,0xaa,0x42,0xfc,0x90,0xe2,0x3f,0x27,0x21, + 0xed,0x60,0xb9,0xcf,0xf,0xa6,0xab,0x50,0x24,0xd0,0x7c,0x79,0x95,0xc9,0x59,0xba, + 0x71,0x16,0x68,0xe9,0x22,0xea,0x3,0xa6,0x6e,0xa9,0xa9,0x6c,0xff,0x54,0x74,0x31, + 0x39,0xcd,0x13,0x67,0xb2,0x78,0xcc,0x33,0x66,0xd3,0xce,0x6a,0x6b,0x5f,0x58,0xfc, + 0xdd,0xfe,0xe7,0xb6,0x5c,0x30,0x14,0xad,0x86,0xd6,0x2b,0x95,0x80,0x1,0xe2,0xc8, + 0xcd,0x95,0xda,0xb6,0xb5,0xaf,0xf,0xe,0x38,0x16,0xe1,0x9,0x57,0x6e,0xf5,0x6b, + 0x7,0xef,0x4e,0x45,0xf6,0xc4,0xa8,0xea,0x62,0xa3,0xc8,0xfb,0xc7,0x2c,0x5e,0xea, + 0x69,0xe2,0xa7,0xb1,0x23,0x4e,0x19,0xf6,0xc1,0x2c,0x47,0x92,0xf,0xa8,0x54,0x19, + 0x5f,0x15,0x11,0xb2,0x16,0x22,0xd9,0xa6,0xa6,0xca,0x5b,0xb7,0x2c,0x6a,0xc4,0xdf, + 0xdf,0x5b,0x9d,0xa7,0xef,0x55,0x23,0x64,0x64,0x4b,0x11,0xad,0x45,0x67,0x90,0x46, + 0x9f,0x58,0x5,0x3d,0xc4,0x3a,0xe8,0x58,0x45,0xd3,0x9d,0xb8,0xc,0x31,0xa1,0xc0, + 0xa6,0x80,0x2f,0x56,0x3e,0x15,0x0,0x53,0x84,0x8c,0x96,0x99,0x4c,0x45,0x44,0xcd, + 0x91,0x54,0x1f,0xf,0x6a,0x1a,0xc1,0x8a,0x6c,0xd0,0xa3,0xea,0x21,0x97,0x4,0x93, + 0xd1,0xd9,0x46,0x1d,0xdc,0x4,0x9b,0x8e,0xf0,0xea,0xc2,0x6d,0x92,0xa7,0xb7,0x5b, + 0x62,0x46,0xa6,0x64,0xb5,0xb5,0xdb,0xdd,0x48,0x5e,0xd4,0xa2,0x84,0x7,0xe8,0x70, + 0x6a,0x48,0xd9,0xce,0x8b,0xc8,0xa8,0x14,0xe6,0x9a,0xc4,0xb1,0xf9,0x22,0x15,0xfa, + 0xac,0xfd,0x1c,0x13,0x49,0xa3,0x71,0x9e,0xf2,0xa0,0x44,0x5f,0x4a,0x21,0xc3,0x81, + 0x19,0xf4,0x1b,0x5,0x92,0xa6,0xf5,0x92,0xa4,0x55,0x87,0x6c,0xc,0xcf,0x54,0xf7, + 0xa5,0xe6,0xd5,0x30,0x2b,0xd6,0x4a,0x44,0xe2,0x50,0x2a,0x96,0xd2,0xba,0x87,0x95, + 0xd1,0xba,0x58,0x20,0xad,0x8,0xef,0xfc,0x4e,0xf2,0x6b,0xd3,0xf2,0xcf,0x6d,0x71, + 0xdd,0x68,0x4b,0xbb,0xf7,0x14,0xce,0x27,0x4c,0xa8,0x24,0x3f,0x79,0xd1,0x6f,0xc0, + 0x27,0x2b,0xeb,0xd8,0x1b,0xb,0xec,0x54,0x32,0x52,0xd9,0xa7,0x92,0x9a,0xf5,0xaa, + 0x29,0x2,0x97,0xc1,0x94,0xfb,0x9d,0x1c,0x4c,0xfe,0xdc,0x1e,0xa6,0x6f,0x23,0x78, + 0x40,0xb4,0xd2,0x3c,0x2,0x57,0xd9,0x84,0xe5,0x95,0xe9,0x6a,0x42,0x9c,0xd6,0x69, + 0xc3,0x46,0xb1,0xce,0xdf,0xb3,0x88,0xac,0xa8,0xe5,0xd2,0xd4,0x8a,0x58,0x7c,0xaa, + 0xca,0xc6,0xe,0x19,0x9b,0x15,0x76,0x55,0xcb,0xfa,0xf8,0x1a,0xb9,0x4e,0x45,0x11, + 0x7e,0x10,0x97,0xb8,0x74,0xcd,0x9a,0x78,0xd9,0xfc,0xc3,0xe5,0x57,0xb0,0xcf,0xbd, + 0x89,0x24,0x48,0xc8,0xda,0x78,0xb9,0x58,0x29,0xed,0xe5,0xe9,0x43,0x17,0x3a,0x3c, + 0xa8,0x90,0x80,0xac,0x17,0xf6,0xfa,0x53,0xfa,0xbc,0x9,0x3,0xb2,0xed,0x80,0xc7, + 0xbf,0xd3,0x4e,0x11,0x21,0x14,0x1b,0x7b,0xab,0xd2,0x59,0x61,0xb3,0x2f,0xcf,0x5d, + 0xfb,0x42,0xe9,0x4b,0x23,0x30,0xa4,0x3,0xad,0xdb,0x88,0x50,0x9,0x6e,0x41,0x15, + 0x4d,0xbd,0xb4,0x72,0xa7,0x55,0xc4,0x4e,0x55,0x1c,0xc2,0xea,0xe3,0x74,0x88,0xd6, + 0xa9,0x89,0xd2,0x67,0x3e,0x3b,0x55,0x94,0x54,0x7a,0x91,0xc5,0x86,0xc7,0xaa,0xf6, + 0x0,0x43,0x6e,0x6b,0x1e,0x12,0x39,0x6b,0xb9,0x94,0xf6,0xed,0x6f,0xb1,0x69,0x51, + 0x64,0xd7,0x1,0x96,0x9f,0xad,0x2c,0x4e,0xf,0xf6,0x82,0xb3,0x5b,0x66,0x7d,0x16, + 0xd7,0x98,0x58,0x94,0x45,0x7,0x92,0x60,0x33,0x6c,0x97,0x34,0xca,0x48,0x60,0xa6, + 0xf4,0xd,0xb5,0x6a,0x17,0xcd,0xef,0x57,0x75,0x58,0xf4,0xe5,0x42,0xc9,0x13,0x2d, + 0x2d,0xef,0x3e,0x4f,0xcb,0x7c,0xfc,0x2d,0x48,0x6a,0xfd,0xbc,0x8a,0x40,0xfa,0xbe, + 0xd5,0x47,0x93,0x9f,0x3f,0xfa,0x67,0x2a,0x5a,0x7a,0x1e,0x69,0x7f,0xbe,0x58,0x19, + 0xa9,0x9b,0xd5,0x32,0x5d,0xb1,0xcf,0x3f,0x46,0xc9,0xf9,0xf9,0xdd,0xf4,0x5,0x17, + 0x56,0x2,0x8,0xf8,0x64,0x1a,0x8,0x21,0x2a,0xa3,0x29,0xae,0x8b,0x84,0x62,0x53, + 0x3c,0xb9,0x5a,0xc6,0x4c,0x5f,0xa1,0x89,0x8c,0x82,0x14,0xc9,0x5a,0x8c,0xc3,0x9a, + 0xe9,0x99,0xaa,0xb2,0xe8,0x39,0xb6,0x34,0x47,0x81,0x8c,0xc5,0xfa,0x73,0xe7,0xe9, + 0x18,0xef,0x80,0x49,0x47,0xe1,0x2a,0xfb,0x2d,0x97,0x4d,0x7a,0xf7,0x75,0x13,0xd7, + 0xbc,0xee,0xeb,0xd7,0xa2,0xde,0x75,0x6,0x1b,0x82,0x4e,0xc7,0xdf,0x5b,0xc4,0x62, + 0x13,0x17,0x5b,0x76,0xd6,0xd,0x2c,0xfe,0x2d,0x2d,0xc3,0xf,0xdd,0xd0,0x85,0x91, + 0xc5,0x19,0xec,0xbe,0xc8,0x15,0x1a,0x4a,0xb5,0x96,0xf2,0x91,0xe8,0x39,0x93,0x14, + 0x26,0xa3,0x1b,0xa7,0x7b,0x71,0xa6,0xab,0x16,0x34,0x3a,0x29,0xf3,0x92,0xc3,0xa5, + 0x2d,0x67,0xd6,0xa1,0x1c,0xb4,0xcd,0x3,0x4d,0xb7,0x90,0x9e,0x5c,0x1,0x16,0x7, + 0x38,0x5f,0x4a,0xcb,0xde,0x70,0x41,0x9a,0x6e,0x2d,0xf8,0xc9,0xf7,0x37,0x85,0x3e, + 0xf5,0x90,0x64,0x55,0x26,0x38,0xad,0x86,0xd8,0xb6,0x59,0xa9,0x5a,0xa3,0x5d,0x65, + 0xff,0x21,0x48,0x55,0x7e,0x95,0x6d,0xe4,0xd0,0x1a,0x2,0x33,0x2e,0xde,0x6d,0x1a, + 0xf6,0xf1,0xc2,0xbe,0xd5,0x3d,0x76,0x4d,0x56,0xd3,0x65,0xc3,0xa3,0x1b,0x14,0xb1, + 0x88,0x8c,0x45,0x70,0x9e,0x79,0x35,0x62,0xc2,0xbb,0x12,0xd9,0x87,0x2d,0xd1,0x5e, + 0x15,0x9d,0xcb,0xa,0x80,0x9,0x70,0x8a,0x16,0x5d,0x44,0xcc,0xcd,0xd6,0xc3,0x2a, + 0xa7,0x78,0xd5,0xfe,0x2f,0xd9,0x38,0x34,0xf6,0xaf,0xa0,0x13,0x9,0x64,0x38,0x91, + 0xc,0xa3,0x98,0xcf,0x57,0xf1,0x82,0xab,0x6e,0x2a,0xcd,0xeb,0xa5,0x59,0xe0,0x77, + 0x45,0x85,0xbc,0x7a,0xb6,0x63,0x4f,0x4e,0xcf,0x74,0xd3,0x4,0x77,0xd9,0x46,0x37, + 0xd6,0xbf,0xb7,0x7e,0xae,0x4b,0x8f,0xc6,0x97,0x14,0xf2,0x8a,0x20,0x8d,0x6e,0x4d, + 0xc0,0x69,0xf1,0xb5,0x44,0x89,0x72,0xb6,0x83,0xae,0x5f,0x17,0x52,0x31,0x96,0x31, + 0x4c,0x96,0x5e,0x18,0x23,0x48,0xcf,0xcd,0x4e,0x99,0xdb,0x86,0xd7,0x65,0x81,0x55, + 0x77,0x12,0x79,0x11,0x60,0xa5,0x41,0xf5,0x6,0xd1,0x8b,0xce,0x17,0x25,0x1,0xa9, + 0xb2,0xe,0xc7,0x2e,0xd4,0x12,0x98,0xb2,0xee,0xe4,0xdb,0x6,0x41,0x40,0x97,0x45, + 0x56,0xba,0xc4,0x73,0xa0,0x44,0xba,0x8,0xe3,0xb9,0x2d,0xa1,0x32,0x34,0x9e,0xb6, + 0xf7,0x4f,0x36,0xf9,0x1,0xfb,0x54,0xff,0x79,0xd7,0x97,0x77,0xb6,0xb9,0xb,0x16, + 0x95,0xc5,0x5e,0xa5,0xde,0x21,0x13,0x43,0xa3,0xa0,0x60,0x3a,0x89,0xf7,0xfc,0x27, + 0xee,0xd3,0xba,0xc2,0x90,0x60,0xbb,0xe4,0x46,0xfc,0x2d,0xa4,0x3c,0xaf,0xda,0xb6, + 0x35,0xe,0xb2,0x15,0xd3,0xb2,0xa7,0x1,0x4a,0x79,0x1,0x28,0xeb,0xb0,0x6c,0xf9, + 0xc1,0xc6,0x8e,0x88,0x27,0x44,0xeb,0xaf,0xf7,0xa8,0xd0,0xf5,0x73,0xd6,0x1c,0xa9, + 0xd0,0x5,0x4d,0x31,0xd9,0xae,0x9c,0x85,0xb3,0xeb,0x1c,0x78,0x6d,0x0,0xf3,0x24, + 0x89,0x84,0x83,0x64,0x7,0xcd,0xac,0x7c,0x22,0xbe,0x69,0xe,0x7,0xb,0x5d,0x56, + 0x76,0x15,0xe5,0x64,0xc1,0xf9,0x1c,0xbf,0xf6,0x17,0x3f,0xff,0x81,0x26,0x31,0x9, + 0x12,0x77,0x3c,0xef,0x5a,0xb2,0x46,0x43,0xab,0x30,0x6e,0xd3,0xf2,0x51,0x52,0x70, + 0x58,0x40,0x6,0x59,0x11,0x81,0x89,0x6b,0xbe,0xad,0x72,0xae,0x87,0xf9,0x2f,0xdb, + 0xc9,0xcb,0x3e,0xbc,0xe8,0x5e,0xe,0x6a,0x7e,0x44,0x45,0xb5,0x98,0xc0,0x74,0xd9, + 0xa,0xaf,0x7f,0xe0,0x1e,0x1f,0xb9,0xbf,0x90,0x34,0xc6,0x99,0x1f,0xbe,0x32,0xfe, + 0x4f,0xd6,0x51,0x30,0xf6,0x7c,0xd9,0xba,0xe7,0x9f,0xed,0x7b,0xbd,0x50,0x56,0xaa, + 0x48,0xac,0x79,0x1b,0xc1,0x63,0xe9,0xf0,0x72,0x8e,0xf6,0x3a,0xb7,0x59,0x7d,0xeb, + 0x22,0x5b,0x9,0x67,0x9b,0xc1,0x60,0xb2,0xa7,0x75,0xa9,0x19,0xf4,0x1b,0x44,0xa5, + 0x2d,0xc1,0x26,0x90,0x9,0xe4,0xca,0xc2,0xb1,0xff,0xb7,0xb4,0xab,0xeb,0x95,0x24, + 0x4b,0x6a,0xe1,0x62,0x16,0xd,0xfb,0xff,0xff,0xd7,0x7d,0x42,0x48,0x20,0x21,0xa4, + 0x11,0xcb,0xd7,0x2,0x2b,0x16,0x78,0x6c,0xf3,0xd0,0x5d,0x99,0x11,0xb6,0xe3,0x64, + 0xb5,0x40,0x42,0xbb,0x3b,0xd3,0x7d,0x6f,0x55,0xe6,0x39,0xf1,0xe1,0x70,0xd8,0x3, + 0xe7,0x6e,0xbf,0x76,0x74,0x18,0x97,0x33,0x4c,0x14,0xa6,0x55,0x7a,0xe4,0xf0,0x72, + 0x97,0x97,0x40,0x19,0x3d,0xcc,0xb5,0xa6,0x30,0x87,0x43,0xda,0xdb,0x2e,0xb3,0xd7, + 0x49,0x4e,0x86,0x46,0x30,0x33,0x36,0x78,0xd,0x9b,0x6b,0x55,0xd8,0x39,0x6f,0x4, + 0x2c,0xf7,0xc3,0x50,0xa5,0xfe,0xc7,0x28,0xcb,0xcc,0xf4,0x0,0xdf,0xd6,0x55,0x27, + 0x7a,0x31,0x2d,0x5a,0x61,0x88,0xa,0xa3,0x71,0xc,0xc,0x7b,0x99,0x1,0x36,0xd5, + 0x5c,0x28,0x47,0x29,0xe7,0x24,0x7e,0x6a,0x21,0x3a,0xb9,0x2f,0xc8,0xc2,0xf5,0x9f, + 0xd5,0x2d,0x62,0x21,0x9a,0x1c,0xba,0xd7,0x45,0x11,0xf2,0x59,0x1b,0xa2,0x33,0x5e, + 0x78,0x8d,0xfd,0x84,0x2e,0x50,0x91,0xb4,0x59,0x62,0x78,0xea,0x4,0x4d,0xd4,0x34, + 0xa9,0x1a,0xef,0x8,0x53,0xad,0x1d,0xda,0x88,0xf1,0xd6,0x17,0xb8,0x1a,0xb2,0xb0, + 0x2d,0x81,0x52,0x1e,0xa0,0x93,0x29,0x95,0x3f,0x66,0xeb,0xd2,0xe4,0xcc,0xdf,0xad, + 0x38,0xbc,0x38,0x20,0xa4,0x6c,0xc7,0xa4,0x35,0xc5,0x8a,0xa6,0xdb,0x75,0xd8,0xfc, + 0x42,0x46,0xeb,0x73,0x9d,0x5f,0x6e,0x9f,0x5a,0x86,0xa8,0x30,0x70,0x5,0x2e,0x2f, + 0xba,0x51,0x1c,0xa1,0xea,0xfb,0xc,0xfd,0x82,0x9c,0x5e,0x1c,0x6,0xe,0x13,0x16, + 0xf,0x33,0x85,0xf1,0x45,0x6e,0xdf,0xeb,0x7b,0x25,0xe3,0xf5,0x63,0x7d,0x8d,0x15, + 0xed,0x50,0xc7,0xf9,0xc5,0x80,0x48,0xbd,0x3c,0x48,0xd6,0x88,0x70,0xfe,0xac,0xa2, + 0x12,0xf5,0x1d,0xde,0x43,0x13,0x4e,0x89,0xc,0xe8,0xd9,0xe8,0x8e,0x19,0x2a,0x8d, + 0x11,0xa9,0x1d,0x70,0xb0,0x1f,0xad,0x7c,0x9,0xaf,0x79,0x89,0x2a,0xe3,0xb1,0x8b, + 0xd,0xa4,0x4e,0x33,0x98,0x64,0xf4,0x4e,0xba,0x89,0x70,0x70,0xcc,0x6b,0xd8,0xdc, + 0x86,0xe7,0x6e,0x39,0x51,0xe3,0xfd,0xc2,0xbc,0xed,0x33,0x1c,0xf5,0xd,0xea,0x43, + 0xae,0xc5,0xda,0x9c,0x11,0xd,0xc6,0x2f,0x9b,0x9d,0x5a,0x5,0xc2,0x4b,0x28,0xac, + 0x30,0x5c,0xac,0xd4,0x66,0x15,0x79,0x3d,0xad,0xa9,0xa7,0x8d,0xb9,0x6a,0x58,0xdb, + 0xd9,0xa1,0xd1,0x8d,0x91,0x2b,0x64,0xbf,0x2e,0xef,0x8b,0xbb,0x30,0xd6,0xd1,0x92, + 0x8f,0x9f,0xdf,0x6b,0x54,0x89,0x9f,0x70,0x77,0x87,0x14,0xb6,0xf3,0x7b,0xdb,0x80, + 0xb2,0x75,0x51,0xb7,0x3,0xe7,0x7c,0x36,0xaf,0x56,0xb0,0x2d,0x26,0x29,0x15,0x67, + 0xf4,0xc1,0xfe,0xb8,0x66,0x75,0xaf,0x9a,0x12,0xbd,0xab,0x29,0xd9,0xf1,0xcd,0x49, + 0xc9,0x3b,0xea,0x34,0xe,0x98,0x63,0xe,0x88,0xfd,0x70,0x3f,0xe7,0xed,0x4c,0xff, + 0xf8,0x67,0xdf,0x8c,0x43,0x30,0x27,0x92,0xae,0x80,0x48,0x11,0xfb,0x69,0x64,0xc8, + 0x1f,0x1a,0xe7,0x9d,0xb4,0xd9,0x45,0x46,0xde,0xeb,0x88,0xb4,0x6a,0x1c,0x93,0x70, + 0xba,0x22,0x48,0xf7,0x7e,0x39,0x44,0xb4,0x8a,0xc3,0x71,0xa5,0x43,0xf0,0x61,0x23, + 0xfb,0x8d,0x74,0xd,0x83,0xa6,0x76,0x87,0x5e,0x7b,0xb2,0x18,0x84,0x8e,0xf6,0xe0, + 0xd9,0x67,0xc6,0xa5,0xa3,0xc5,0x49,0xe4,0x22,0x9c,0x7,0xd1,0x25,0x50,0x55,0xb5, + 0xf3,0xe6,0xaf,0x68,0xf4,0xff,0xb1,0x97,0xcd,0xfe,0x4e,0xdb,0x48,0xf7,0xfa,0x7d, + 0x41,0xb1,0xf3,0x22,0x2c,0x4f,0xd7,0x3e,0x4,0x42,0xe3,0xfb,0x7b,0x81,0x13,0xc1, + 0xf0,0x4e,0xea,0x95,0x89,0x96,0x6d,0x54,0x31,0xe5,0x5,0xb0,0x6c,0xb2,0x94,0xf1, + 0x70,0xe6,0x86,0xcd,0xbb,0x48,0x79,0x45,0x75,0x44,0x6,0xa9,0x71,0x16,0xbf,0x43, + 0xee,0xbe,0x5a,0xd3,0x49,0x67,0x50,0x4b,0xcc,0x9a,0x58,0xb3,0xc0,0xb7,0x2f,0x11, + 0x14,0x69,0xf3,0xab,0x9,0x75,0x4d,0x58,0x56,0xbb,0x91,0xf7,0x85,0xf9,0x16,0x94, + 0x37,0xba,0x48,0xc5,0xf7,0xb5,0x9d,0x1f,0xc9,0xb7,0x41,0xa5,0xac,0xd9,0x81,0x7c, + 0xb3,0x24,0x11,0x20,0x31,0x7b,0xa0,0x2e,0x71,0x88,0xa6,0xbb,0xc9,0x30,0x2b,0xac, + 0xb6,0x42,0xd5,0x2d,0xee,0x92,0x40,0x88,0xa6,0xa,0xca,0x4c,0x9,0xa6,0xee,0xa5, + 0xb0,0xa5,0x4e,0x60,0xd2,0x4a,0xa0,0x13,0xcb,0x52,0x7b,0xcc,0x20,0x1f,0x8b,0x72, + 0xfd,0xa7,0x6f,0x3,0x22,0x2d,0x53,0xc6,0x7a,0x13,0x1b,0xfb,0xec,0xfa,0x6d,0x2c, + 0x11,0x5c,0x90,0x6,0xdc,0xdc,0x99,0xa1,0xa0,0xae,0xc7,0xdc,0x8e,0x7d,0xe0,0x14, + 0x85,0xb1,0x2,0x81,0xc1,0x6a,0xbc,0x8f,0x3e,0x56,0x2b,0xc8,0x3c,0x3f,0xae,0x6, + 0xb9,0xd9,0xf2,0xf5,0xe5,0xac,0x56,0x4d,0x50,0xc7,0x57,0x75,0xb8,0xc2,0x47,0xd5, + 0x82,0x96,0x6f,0x61,0x4c,0xad,0x80,0xbb,0x12,0xe7,0x5,0xbf,0x7f,0xff,0xc,0xdf, + 0xa4,0x21,0x36,0xbf,0xe4,0x6,0x9f,0x1b,0xb2,0xd0,0x58,0xb7,0xe3,0x7d,0xf7,0x75, + 0x2a,0x74,0x38,0x5f,0x8a,0x1a,0x4e,0x82,0x59,0x5c,0x3f,0x3c,0x41,0x68,0xc1,0x8c, + 0x5,0x74,0x43,0xd,0x55,0xdf,0x9b,0xb3,0xf9,0xd7,0xa8,0xf5,0xfa,0x2c,0x3d,0x17, + 0xa9,0xfd,0xdd,0xc1,0x2d,0x7a,0x7b,0x0,0xed,0x9c,0x9c,0x26,0xfc,0xd1,0x2d,0x48, + 0xcd,0xe3,0xa1,0xc2,0x28,0x6b,0x8c,0x3c,0xfa,0x3a,0xe0,0xec,0x78,0x2f,0x7b,0x4d, + 0x62,0xf0,0x94,0x38,0x40,0x97,0xee,0x4f,0xa0,0xd6,0xc6,0x10,0xcd,0x79,0x6d,0x80, + 0x1a,0xef,0xa5,0xea,0xe0,0x97,0x51,0x2d,0x9e,0xbd,0xe4,0x6e,0x57,0xb3,0x2,0xdd, + 0xe0,0x1c,0xf1,0x68,0x97,0x66,0x98,0x35,0xbb,0x7d,0x27,0xf6,0xcd,0x99,0x3c,0xc7, + 0xf8,0x4b,0x93,0xb4,0xba,0xea,0x79,0x2c,0xeb,0xa4,0x57,0x55,0x5,0x18,0x56,0xd8, + 0xd0,0x2e,0xbd,0xc6,0xb6,0x15,0xde,0xb2,0xce,0x43,0x7b,0xa1,0x13,0xc1,0x27,0xb5, + 0xf1,0xdb,0x10,0x48,0xbb,0xd1,0xd8,0xbc,0xae,0x26,0xe7,0xd,0x12,0xc3,0xe0,0xa0, + 0x7f,0xf7,0x30,0xf9,0xe5,0xdb,0xcb,0x61,0xe8,0x2e,0x71,0x79,0x5,0xcd,0x57,0xba, + 0x58,0x75,0xe8,0x27,0x1d,0x67,0x98,0x2e,0xb4,0x82,0x77,0x51,0xc5,0x60,0xe6,0xd0, + 0xa5,0x2b,0x11,0x8d,0x7d,0xf7,0xd7,0xe6,0xd5,0xac,0x33,0xe3,0xcc,0xa8,0xd6,0xcf, + 0xfb,0xad,0xc3,0xd1,0x2f,0x59,0x51,0xe0,0xac,0x5c,0x5d,0x2c,0xe1,0xe5,0x7a,0xe8, + 0xbd,0xba,0xac,0x1a,0xe2,0x14,0xc3,0x2a,0x32,0xc8,0x4f,0xde,0x84,0x20,0xb8,0xd5, + 0x70,0x27,0x5a,0xc5,0xa9,0x4e,0x7a,0x2f,0x8,0x10,0x39,0xdb,0x6e,0x2f,0xdb,0xeb, + 0x68,0x2b,0x4b,0x4d,0x10,0xa5,0x86,0x4f,0x73,0xd2,0xe3,0x5e,0xf6,0xe8,0x1b,0xb9, + 0x49,0x9d,0xb8,0x3a,0x9a,0x31,0x8a,0xb5,0xc6,0x60,0xe7,0xab,0x89,0x36,0x8,0x4d, + 0x8a,0x4d,0xfa,0xb3,0xc2,0x2c,0xcd,0xe6,0xb,0x4d,0x9a,0xb1,0xda,0xda,0x26,0x25, + 0x58,0x66,0xe3,0x9b,0x89,0x3a,0x4e,0xfb,0xd3,0x64,0xe,0x4,0xff,0xc,0xad,0x8b, + 0x85,0xf8,0x1e,0xb3,0x31,0xf0,0xa7,0x63,0xab,0xe8,0x55,0x57,0x2d,0xdb,0xe,0x4a, + 0x56,0x9c,0x10,0xec,0x5c,0x9b,0x42,0xc,0x1e,0xc,0x4,0xa5,0xcd,0xe2,0x56,0x4f, + 0x59,0x37,0xe7,0xf8,0xd6,0x46,0xa,0xdd,0xd2,0x17,0x32,0x53,0xe2,0xe0,0x65,0x4c, + 0x42,0x58,0x89,0x51,0x11,0xd9,0x35,0xd3,0xa7,0x9f,0x42,0x2f,0x4a,0x4a,0x7c,0xe2, + 0xfb,0xbb,0x9a,0x52,0xa7,0xc2,0x2d,0xb2,0x95,0xa8,0x53,0xfc,0x18,0x16,0x70,0xb3, + 0x20,0x92,0x19,0xe5,0x20,0x70,0x76,0xeb,0xe7,0x62,0x81,0xaf,0x46,0x64,0xf4,0xf9, + 0x74,0x49,0x91,0x96,0xc4,0xa2,0xde,0xbf,0xa3,0x4b,0x98,0x16,0x4,0x8e,0xa6,0xac, + 0xc3,0xe,0xd4,0x66,0x7a,0xd6,0xe3,0xbd,0x39,0xf2,0x83,0xb3,0xa2,0xc4,0x35,0x84, + 0x38,0x33,0x58,0xed,0x94,0xe,0x54,0x34,0x1d,0x54,0x43,0x3,0x69,0x3c,0xf5,0xd2, + 0x16,0x4c,0x5,0x5a,0x7a,0xf1,0x2f,0xcd,0x12,0x74,0xd3,0x62,0xfa,0xee,0x52,0x56, + 0xd4,0xaa,0x3b,0x54,0xea,0xaa,0x24,0xe6,0xef,0x64,0x1c,0xcf,0x2a,0x37,0xa4,0xf3, + 0x7d,0x9a,0xe8,0xd1,0x8f,0xef,0x7c,0x3b,0xee,0x71,0xf0,0xa,0xae,0x97,0xfd,0xe2, + 0xe2,0x1e,0xf8,0xb2,0xe2,0xb4,0x6f,0x27,0xe1,0xf7,0x7f,0xfd,0xdb,0x17,0x28,0x7a, + 0x36,0x28,0xab,0x61,0x1c,0x96,0x69,0x40,0x14,0xc4,0x32,0x35,0xe4,0x7c,0x2e,0x39, + 0xc6,0x9a,0xff,0x3,0x50,0xc1,0xe0,0xe9,0xa5,0x45,0xce,0xc,0x6,0x41,0xc8,0xfc, + 0x47,0xa4,0x44,0xdb,0xbd,0xb4,0x1,0x1a,0x8c,0xb2,0xf9,0x73,0xb3,0x14,0x71,0xeb, + 0x1a,0x95,0x11,0xcb,0xd7,0xf8,0xba,0xb2,0x5b,0x17,0xce,0x50,0x98,0x19,0x55,0xba, + 0x8d,0xee,0x53,0xfd,0x99,0x3c,0x2e,0xdd,0xe5,0xc6,0xfe,0x7,0xfa,0x5a,0x8c,0xa3, + 0xa9,0x5c,0x4b,0xb2,0x14,0xde,0x60,0x24,0xc5,0xbe,0x46,0x2,0x38,0xb3,0xdb,0xec, + 0xaf,0x42,0x81,0x18,0xfc,0x94,0xc2,0x7b,0xb4,0xb6,0x65,0xe7,0x46,0xf4,0x71,0x40, + 0x18,0x2d,0xd7,0x36,0xe6,0x32,0x62,0x1f,0xe4,0xec,0xdf,0x2b,0x3c,0x83,0x84,0xc4, + 0xbe,0x32,0x29,0xf3,0xf5,0x36,0x14,0x66,0x60,0x5,0xe4,0x29,0xbd,0xba,0xa,0x8b, + 0x34,0x31,0xa5,0xd0,0x67,0xa0,0x20,0x60,0x92,0x19,0xfd,0x45,0xeb,0x3c,0xb1,0x2, + 0xed,0x67,0xd9,0xf1,0xd6,0x79,0xa4,0x1a,0x97,0xf,0xab,0x51,0x6,0xcf,0xec,0xf3, + 0x8,0x5f,0x5a,0xcb,0x11,0x67,0xd9,0x9d,0x0,0xed,0xe5,0xb6,0xeb,0xa0,0x4e,0x67, + 0x68,0xe1,0xb8,0x89,0xe3,0xd0,0x8a,0x5f,0x4,0x9a,0x2,0x9b,0xc0,0xba,0xac,0xa4, + 0x89,0x55,0x31,0x84,0x44,0x3a,0x64,0xdc,0x9b,0x9c,0x6c,0x95,0x4b,0x7,0x9b,0x6f, + 0x10,0xe2,0xe0,0x7b,0x52,0x26,0x7a,0x56,0x34,0xa7,0x2f,0xe,0x57,0x49,0x2c,0xf, + 0x3e,0xa,0xe0,0x2e,0xa4,0x9c,0x41,0x2,0x96,0x31,0x2a,0x12,0xeb,0x84,0x6d,0x3c, + 0xb3,0x58,0x68,0x3b,0x3a,0xd8,0x88,0xbf,0x1b,0x22,0xd0,0xf9,0x5f,0xe1,0xe2,0x1c, + 0x29,0x53,0x4f,0x9c,0xa4,0x51,0x71,0x74,0xb2,0x1a,0x6d,0xfb,0xc4,0x50,0x8e,0x38, + 0xa7,0xaf,0x73,0x6c,0x53,0x9d,0x56,0x29,0xce,0x3b,0x6a,0xd6,0xd7,0x5e,0xf1,0xfb, + 0xbf,0xf9,0xed,0xeb,0x13,0x26,0xcc,0xb9,0x31,0x9f,0xba,0xdc,0x44,0xb,0x78,0x97, + 0x2e,0x7c,0xab,0xb0,0x48,0x81,0xf1,0x32,0x33,0x8a,0x63,0xb7,0xb9,0xff,0x73,0xb5, + 0x83,0xa6,0x75,0xb1,0xe8,0x3b,0x9a,0x70,0xce,0x3,0x3f,0x79,0xa1,0x42,0x8b,0x46, + 0x5b,0x2b,0xb8,0xe1,0x51,0xe,0xd8,0xfd,0x12,0x3e,0x58,0x9,0x5d,0xf9,0x19,0x6f, + 0x1d,0x97,0xfd,0x59,0x99,0x93,0x66,0x81,0x90,0xf0,0xd6,0xab,0x4c,0x87,0x5b,0xb1, + 0x93,0x60,0x3a,0x26,0x95,0x7e,0x2b,0x86,0xfa,0x1b,0x1d,0x12,0x7c,0xed,0x2,0xc6, + 0x67,0xcd,0x90,0xb8,0x5b,0x2,0xef,0xc5,0xa1,0x8c,0xfd,0x8a,0x73,0x4e,0x9f,0x5c, + 0x9f,0x44,0x34,0x7a,0x9a,0x19,0x48,0x85,0x6f,0x92,0x8c,0x43,0xbc,0x88,0xfb,0xfb, + 0x92,0x22,0x6b,0xc8,0x7f,0x2a,0xe9,0xa8,0x91,0x1d,0xeb,0x13,0xbe,0x99,0xde,0xab, + 0x71,0xc6,0x33,0xe3,0x0,0xf0,0xc2,0xa3,0x86,0xb5,0x2e,0x8d,0xeb,0x3d,0x9f,0x42, + 0x9e,0xa,0xb1,0x3c,0x21,0x40,0x51,0x52,0x62,0x98,0xdb,0x4d,0x49,0x4e,0x2f,0xfe, + 0xb8,0x9d,0xef,0xde,0x7e,0x93,0x61,0xb4,0xa7,0x1e,0x0,0xdb,0x8,0xeb,0x54,0x9a, + 0x7d,0x50,0x34,0xe8,0x35,0x19,0x6b,0x6b,0x5c,0x2,0x29,0xe6,0x38,0x23,0xf0,0xf, + 0xd3,0xb7,0xef,0xdb,0x33,0xf3,0xd8,0x72,0x98,0xe0,0x60,0xb1,0x92,0x75,0xa6,0xf3, + 0x53,0xe2,0x6a,0x6b,0xc1,0x51,0xa1,0xaf,0xc3,0x93,0xf7,0xe5,0x43,0xdf,0x36,0x42, + 0xda,0xe7,0x7e,0xa2,0xec,0x1e,0x1a,0x21,0xdc,0x26,0x57,0xd0,0x62,0x52,0x62,0xdb, + 0xfa,0xee,0xb0,0xfd,0x3b,0xa7,0x51,0xe,0xce,0x17,0x29,0xdc,0x84,0xe,0x86,0xf5, + 0x58,0xcb,0xe6,0x72,0x48,0xe3,0xd,0xf4,0xd,0xc,0xa4,0xf1,0xed,0x13,0x49,0x39, + 0xf5,0xba,0x9a,0x84,0x62,0x1d,0xf0,0xe3,0x4c,0xf5,0xe2,0xf4,0xaf,0xfe,0xf6,0xf, + 0x5f,0x5a,0x75,0x96,0xea,0xd4,0x4e,0x8e,0xbd,0xfd,0xe7,0x2d,0x1e,0xb0,0xc1,0xbb, + 0x38,0xcf,0x59,0xb6,0x4e,0x3a,0xd5,0xc,0x4b,0x9,0xd5,0x25,0x42,0x15,0xde,0xf4, + 0xd5,0x29,0xf,0x6a,0x57,0xf0,0xad,0xb4,0xf2,0xc3,0xa9,0xaf,0xdd,0x12,0x9b,0x31, + 0x53,0xb1,0x71,0xfd,0xf7,0xa2,0xc1,0xc8,0xc9,0x35,0xe5,0x34,0x19,0xf2,0x88,0x29, + 0x49,0x21,0x7,0x36,0x7,0xa8,0x97,0xcd,0x81,0x27,0x46,0xa5,0x69,0xa5,0x7f,0x12, + 0x1a,0xc3,0x35,0xee,0xda,0xdc,0x60,0x6b,0xd8,0xda,0xa,0xf,0xd2,0xaf,0x9,0x9d, + 0x46,0x48,0x5c,0x55,0x8b,0xc4,0xa2,0x3c,0x3b,0x2b,0xda,0xd6,0x75,0x82,0xc4,0xb2, + 0x34,0xa4,0x75,0x5,0xb,0x32,0x7c,0x74,0x6a,0x21,0x82,0xd2,0x4d,0x95,0x54,0xfe, + 0xe7,0xa2,0xc0,0x11,0x1b,0x25,0xb5,0x89,0xf7,0x8d,0xde,0x19,0x26,0x3a,0x31,0x7d, + 0x59,0x64,0x24,0x79,0xe9,0xfa,0x8e,0xdd,0x5e,0x2b,0xb4,0x4b,0x9c,0xd3,0xda,0xbc, + 0x7f,0x78,0x9a,0xb7,0x4e,0x3a,0x2a,0x8c,0x85,0x48,0xc3,0x63,0xff,0x1,0x8f,0x79, + 0xdd,0xcf,0x80,0xae,0x7f,0xbf,0x57,0xd1,0x87,0xf8,0x96,0x80,0xa8,0x51,0xf5,0xb0, + 0x8d,0x1e,0x4,0x1c,0x91,0x4b,0xd3,0x3d,0x1a,0xaa,0x19,0xdf,0xd4,0x50,0x1a,0x63, + 0xa9,0xfa,0xac,0xef,0x47,0x4,0x49,0xdf,0xce,0x4c,0x6f,0x31,0x9f,0x38,0x10,0x8a, + 0xcb,0xb,0xb8,0x11,0x53,0x64,0xad,0x66,0x2e,0x78,0x74,0xc1,0x1f,0x83,0x9f,0x72, + 0xa6,0xc3,0xa9,0xfd,0x42,0xa2,0xc8,0xb,0x91,0x54,0x9e,0xf1,0xba,0x90,0x34,0x89, + 0x9a,0x1e,0x22,0x3c,0xd7,0xd1,0xcd,0xba,0x4d,0x93,0xa4,0xdb,0xeb,0xcc,0x8d,0xae, + 0x50,0x41,0xea,0x33,0x1d,0x72,0xb3,0xb4,0x95,0xbe,0x2b,0xa7,0xfd,0xfa,0x77,0x7f, + 0xf8,0x2a,0xc0,0x83,0xc1,0xb5,0xdf,0xdb,0xc5,0x5f,0x68,0xe4,0x97,0x7a,0x9c,0x9c, + 0xcf,0x82,0x4f,0xbb,0xbe,0x59,0x8d,0xc7,0x16,0xb3,0x9d,0xfb,0xe3,0x92,0xc3,0x1e, + 0x38,0x51,0xcb,0x1b,0x14,0x38,0xfd,0x21,0x68,0xfe,0x74,0xf2,0xa,0x33,0xdd,0x91, + 0x6a,0x10,0xc2,0x4f,0x30,0x69,0xb9,0xd7,0x77,0xe6,0x2a,0x19,0xd6,0xf4,0x90,0x8, + 0x13,0x95,0xa1,0x28,0x51,0xf8,0xed,0x4c,0xd5,0xe9,0xa1,0x98,0x6e,0x42,0xe6,0x50, + 0xf8,0x8c,0x1e,0x79,0xa4,0x11,0x85,0xdb,0x27,0x24,0xbd,0xe1,0x45,0xab,0x6d,0xd0, + 0x76,0x51,0x4d,0x6c,0xc7,0xc5,0xfd,0x29,0xfc,0x82,0x5c,0xea,0x20,0xfc,0xd8,0x9, + 0xf9,0xcd,0xe1,0x77,0xb5,0xfd,0x53,0xf9,0xa8,0x36,0x76,0x69,0xc,0xf9,0xd4,0xa5, + 0x3c,0x31,0x57,0xba,0x62,0x59,0xac,0xf6,0x2b,0xaf,0x8,0x6e,0xdd,0x94,0x59,0x1, + 0x86,0x4a,0x66,0x43,0x18,0xb4,0xd0,0x95,0xf,0x4d,0x59,0xa9,0x8a,0x38,0x55,0xaa, + 0x23,0x7,0xe8,0x25,0xbe,0xa,0xe2,0xdd,0xac,0xf5,0xee,0x7b,0xec,0xb4,0xe5,0x8a, + 0x81,0x40,0x6d,0x85,0xd9,0x9,0xc5,0xd3,0xb5,0xa9,0x4e,0x6c,0xd,0xeb,0x67,0x6e, + 0xb5,0xf4,0xc9,0x8b,0x5a,0xdc,0xa,0xf5,0xef,0xe9,0xe1,0x6a,0xa3,0x51,0x3c,0x24, + 0xc9,0x53,0x89,0xe2,0x9f,0xfe,0x40,0x79,0x94,0x5d,0xfa,0xcb,0xcb,0x5d,0x51,0xa1, + 0x71,0xdd,0x29,0x6d,0x20,0x26,0x2,0x4b,0x4e,0xe1,0x30,0xca,0xfb,0x2f,0x54,0xf0, + 0x22,0x12,0xc2,0x6a,0x39,0xe9,0xed,0x33,0xb8,0xb3,0x4c,0x6a,0xd4,0x56,0xdf,0x2a, + 0xc1,0x33,0xe3,0xcb,0x32,0x9a,0x49,0xe3,0xb1,0x45,0xd2,0x8f,0xaa,0xd,0x4a,0x55, + 0x15,0x7e,0xfd,0xfb,0x7f,0xfe,0xda,0xab,0xa1,0x2c,0xa1,0x31,0x8d,0x4a,0x5a,0xea, + 0x80,0xb3,0xbf,0xa1,0x5a,0xf0,0xc3,0x4c,0xa0,0x55,0x9d,0xf6,0xe1,0x67,0x2f,0x9d, + 0x38,0xe1,0x15,0x5,0x3a,0xe6,0xc,0x31,0xce,0xe9,0x6d,0x45,0xcd,0xe9,0x62,0x11, + 0xdc,0x4c,0xb3,0xe1,0x65,0xce,0x85,0xde,0xd1,0x8,0xa1,0x3,0x58,0xdb,0xd0,0x8f, + 0xb,0x5,0x1f,0x3b,0x24,0x0,0x52,0xdf,0x38,0x6a,0x7,0xc8,0xe8,0xa8,0xc2,0xe0, + 0x46,0x88,0xd1,0xc6,0xbb,0x1b,0xa3,0xfe,0x9d,0xd9,0x75,0x78,0x5,0xff,0x38,0xe6, + 0x3e,0xfe,0x99,0xa8,0x4b,0x5e,0x89,0xb0,0xa1,0xc,0x34,0x64,0x9d,0xd5,0xa7,0xf1, + 0x52,0xbc,0xdf,0xd,0x8e,0xfb,0x38,0x59,0x9e,0x9b,0xf3,0x15,0xd5,0x69,0xeb,0x51, + 0x37,0x8a,0x54,0xd7,0x3e,0xfd,0xad,0xf7,0xac,0xeb,0x5f,0xac,0xb8,0x80,0x9c,0x9a, + 0x99,0xf,0x1b,0xf5,0xf8,0x67,0x80,0xa1,0xf6,0xe7,0xc9,0x86,0xed,0x3e,0x6c,0xe5, + 0x7e,0x9,0xe1,0xcc,0xdd,0xb2,0xe3,0x8e,0x7b,0xcd,0x59,0xf1,0x44,0xce,0x5c,0x58, + 0x7,0x75,0x82,0x66,0xdd,0x39,0x11,0x8d,0xaf,0x90,0xd0,0x4f,0x4,0xd1,0x10,0x80, + 0xe2,0x24,0x96,0xd0,0x92,0x79,0xfb,0x6,0x5d,0x78,0x34,0x3e,0xd9,0x2c,0x28,0x15, + 0xce,0x18,0xdb,0x16,0x7d,0xdf,0xfd,0x71,0x3a,0xfc,0xd9,0x74,0x19,0x9b,0x6e,0x77, + 0x98,0xe5,0xff,0x3f,0x9a,0x9f,0x20,0x3f,0x72,0x9f,0xf5,0x77,0x6c,0x25,0x55,0xa4, + 0xf1,0xce,0x15,0x4c,0x7c,0x87,0x5c,0x14,0x41,0x50,0xbd,0x2a,0x95,0xbe,0xee,0x5, + 0x1,0x87,0xf9,0x4d,0xe7,0x6b,0x20,0x14,0xa0,0x25,0x68,0x1d,0x96,0x96,0xc7,0xa6, + 0x1c,0x85,0x26,0x5c,0xc6,0xd0,0x58,0xc9,0xda,0x89,0xdc,0x71,0xfc,0xfa,0xf,0xff, + 0xf2,0xc5,0x53,0x48,0xf5,0x41,0x65,0x28,0x99,0x13,0x91,0xe6,0x33,0x2,0x59,0x6d, + 0x9,0xa,0xb7,0xad,0x60,0x8a,0xd7,0x9a,0xa4,0x31,0x95,0x4,0x86,0x2d,0x61,0x82, + 0xde,0xe7,0x2c,0xbe,0x41,0xbd,0x4d,0x78,0x0,0xe6,0x6a,0x26,0x3b,0xeb,0xc5,0x66, + 0xe2,0xa0,0x28,0x5a,0xee,0x32,0xbd,0xc2,0x17,0x41,0x8a,0xe,0x2a,0xf4,0xca,0xbe, + 0x17,0x1d,0xba,0x2e,0xc1,0xd,0x85,0x78,0x9e,0x35,0x76,0x61,0x88,0xe3,0x80,0x87, + 0x81,0xf0,0x17,0xf8,0x82,0x5c,0xe7,0x76,0x65,0x63,0x8f,0x1a,0xeb,0x3a,0x77,0xe1, + 0xd1,0x5d,0xa2,0x86,0x4a,0x52,0x23,0x36,0x55,0x46,0x68,0x23,0x49,0x90,0x2b,0x2f, + 0xe2,0xf0,0xa4,0x42,0xe7,0x35,0xf9,0x10,0xe1,0xf0,0xc6,0xb5,0x9f,0xa5,0xfa,0x57, + 0xf8,0xaa,0x2,0x1c,0x88,0x7a,0x10,0x51,0x4a,0x96,0x93,0x32,0xc3,0x57,0xf8,0x4f, + 0x2b,0xfc,0x5,0x20,0x4b,0x8a,0x58,0x5b,0xf1,0x34,0x55,0x13,0x75,0x61,0xe,0x2b, + 0x60,0x62,0x13,0xbe,0x3,0xd4,0x67,0xfa,0x34,0x5b,0x12,0xa,0x9c,0x1c,0xc4,0x2e, + 0x58,0xd5,0x64,0x2,0x8f,0xa2,0x4a,0x5c,0xe5,0xea,0x38,0x76,0x62,0xd4,0xa6,0xf3, + 0x2b,0x6e,0x2b,0xea,0xd6,0x35,0x77,0xf2,0x9e,0x2b,0x81,0xce,0xb0,0x12,0xc6,0x87, + 0x9d,0xc5,0xbe,0x15,0xee,0xbd,0x10,0xc3,0xa1,0xe7,0xee,0xe2,0x47,0xa5,0xc9,0x27, + 0x62,0xa9,0xe7,0x22,0x61,0xfd,0x23,0xc9,0x8,0x2c,0xcc,0x2b,0x98,0xc6,0x8b,0xe9, + 0xc9,0x87,0x78,0xa5,0xb1,0xac,0x1a,0xa,0x4d,0x84,0x98,0x72,0x23,0x1b,0x9d,0x9b, + 0x42,0x70,0x1d,0x5c,0xce,0x11,0x6e,0xfb,0x27,0x2d,0x8e,0xcf,0xe6,0x7e,0x6e,0x41, + 0xa9,0xc3,0xa3,0x96,0x7c,0x5d,0x3a,0x3b,0xb5,0x2,0xf8,0xcb,0xdf,0xfe,0xed,0xeb, + 0x66,0x3b,0xbb,0xc8,0x4a,0x21,0x7,0xc8,0x7a,0x80,0x7d,0xd,0xe0,0x98,0xe8,0x8f, + 0xcf,0xcf,0x51,0x8e,0xc9,0x23,0xd1,0x49,0x1e,0x38,0xd8,0xb2,0x5b,0xac,0xc9,0x6a, + 0xd4,0xeb,0x9a,0xa8,0xd2,0x23,0x4a,0x73,0x2c,0x42,0x20,0xa2,0x3c,0x67,0xa1,0xc1, + 0x46,0xbd,0xc3,0xcd,0x28,0xff,0x1b,0xb9,0x18,0x97,0xba,0x70,0xe8,0x68,0xd7,0xde, + 0xc5,0x59,0xff,0x35,0xc9,0xe5,0x37,0x4d,0x2,0xb7,0x5b,0x15,0x85,0xec,0x84,0x9d, + 0x68,0x72,0xd6,0xab,0xdb,0x8,0x64,0xcb,0x4a,0x7e,0xe0,0xa3,0x29,0xa5,0x45,0xc5, + 0xce,0x6a,0x43,0x23,0xb4,0xf,0x42,0x5a,0x2f,0xe8,0xfc,0x80,0x6,0x1,0x37,0xff, + 0xf6,0xeb,0x22,0xae,0xec,0x90,0xfc,0xa6,0x6b,0xec,0x98,0x9e,0xbb,0xac,0x51,0xd3, + 0x21,0xcc,0xe1,0x9f,0xff,0xfa,0x92,0x8,0x4f,0x73,0xdd,0x19,0xc0,0x2e,0x3,0x14, + 0xdb,0x47,0x6e,0xdb,0x11,0xf,0x23,0x4c,0xa,0xe5,0x46,0x3f,0xcf,0xdc,0x55,0x67, + 0x54,0xd2,0x1b,0x2b,0x46,0xca,0x1f,0x41,0xe6,0xbf,0xb8,0x98,0xb6,0x10,0x69,0x71, + 0x7f,0x3f,0x2a,0x41,0x56,0xa,0x10,0x4d,0x56,0x3f,0xf5,0x7f,0x91,0xc4,0xf4,0x41, + 0xa1,0x17,0xe2,0xee,0xa3,0x7c,0xaa,0x16,0xe3,0xa9,0xc3,0x5d,0x8c,0x42,0x4c,0x67, + 0xd0,0x42,0x61,0xe2,0xdb,0xcf,0x82,0xc8,0x94,0xe2,0xc5,0x17,0x63,0x30,0xcd,0x7, + 0x9a,0xd6,0xba,0xcf,0x8e,0x83,0x84,0xb3,0x7e,0xc4,0x66,0xb2,0xc1,0xd9,0xe7,0x4, + 0xf2,0xda,0xe6,0xf5,0xc6,0x68,0xb5,0xf1,0xe7,0xf7,0xbf,0x76,0x77,0xeb,0xbe,0xb6, + 0xe0,0xbf,0x7f,0x28,0x5c,0x10,0x11,0x20,0xd4,0x11,0x84,0x6a,0xdf,0x27,0x6c,0x61, + 0x6,0xcb,0xef,0x8,0x6,0x7e,0xf7,0x8f,0x7f,0xfc,0x2,0x43,0xb4,0xef,0x31,0x70, + 0x95,0xa8,0xeb,0xd2,0x7f,0x6f,0x4d,0x67,0x36,0xc7,0xa1,0x9a,0x2f,0xa3,0x43,0xed, + 0x52,0xa6,0xa6,0xcd,0x31,0x2e,0xe2,0x9e,0x38,0xc0,0xd0,0xca,0xb5,0xab,0xae,0x2a, + 0xb4,0xfc,0xa0,0x7d,0x46,0xbf,0x15,0xe,0x61,0xb7,0x98,0xe5,0x2b,0x66,0x5b,0x60, + 0xfb,0x7c,0x3,0xee,0x1c,0x40,0x47,0xdd,0xd3,0xd6,0xa8,0xca,0xe7,0x85,0x61,0xc4, + 0x78,0x43,0x85,0x89,0x5c,0xb1,0x30,0x84,0x1f,0x1,0xb4,0x6e,0xd4,0x62,0xdb,0x64, + 0x98,0x62,0x12,0x58,0x86,0x43,0x95,0xdc,0xb3,0x2b,0x90,0x0,0x6b,0xce,0x57,0x54, + 0x4e,0x51,0xd,0x6f,0x28,0x1,0xf0,0x70,0x69,0xf0,0xc9,0x1c,0x0,0xbd,0xc8,0x53, + 0x24,0xe3,0x26,0xc1,0x30,0x6c,0x1b,0x40,0x38,0x9,0x26,0x4,0xb3,0xa,0xc,0xcb, + 0x1c,0x7b,0xf8,0xc,0x70,0x18,0x58,0xcc,0x5c,0x27,0x8e,0x70,0x8f,0x24,0x23,0xe9, + 0xba,0xb6,0x60,0xa9,0xf6,0x9a,0x1b,0x27,0x26,0xce,0x27,0x72,0xf4,0xd5,0xbe,0xde, + 0x4e,0x61,0x5a,0x51,0x5c,0x58,0xa8,0x93,0x84,0x95,0x23,0x8a,0x29,0x65,0xc,0x73, + 0x92,0x4,0xff,0x43,0x8a,0xf9,0x89,0xc,0x42,0x10,0x4b,0x92,0xb1,0xa5,0x7d,0x5c, + 0xb,0x4d,0x4b,0x27,0xc8,0x59,0xcd,0x79,0xc5,0x3a,0x40,0xfe,0x88,0xa2,0x2b,0x25, + 0x42,0x4b,0x16,0x75,0xeb,0xc7,0x83,0x38,0x63,0xb0,0x5a,0x9b,0x6c,0x73,0xc2,0xd0, + 0xe1,0xa6,0x3b,0x64,0x4e,0xb2,0xb2,0x26,0xe6,0xd7,0x6b,0x4a,0x57,0x5f,0x72,0xdb, + 0xe5,0x42,0xe5,0x96,0x51,0x1e,0xe6,0x7e,0x86,0xde,0xa5,0x67,0x9,0x56,0xc,0xa, + 0x19,0x63,0x3f,0xcc,0xeb,0x4b,0xb4,0x4,0xee,0x55,0xb9,0xa,0xfa,0xf4,0xc5,0x2a, + 0xfc,0xee,0x9f,0xfe,0xfd,0x2b,0x56,0x5d,0xe2,0xd6,0x15,0xd7,0x78,0x9a,0x85,0xe1, + 0x2c,0x36,0x25,0x10,0x31,0x73,0x6f,0x4e,0x63,0x46,0x55,0x2e,0xba,0x82,0x71,0x87, + 0x69,0x5b,0x65,0x74,0x15,0x0,0x76,0x33,0x54,0x97,0xbe,0xa9,0xb8,0x59,0xe0,0xac, + 0x45,0x7b,0x9b,0x32,0xcb,0xe4,0x5c,0x75,0xc0,0xca,0x1c,0x19,0xc0,0x33,0xcf,0x13, + 0xe1,0x9d,0x54,0x16,0xf7,0x81,0xb4,0xfa,0xa1,0xd,0x9f,0xb8,0x19,0x9e,0xbe,0xf7, + 0x40,0x81,0xdb,0xc1,0xe,0x30,0x32,0x77,0xe2,0xaa,0x6d,0x97,0xb7,0x24,0x90,0x99, + 0x94,0x66,0x6d,0xda,0x6,0x9a,0x1f,0x61,0xe4,0x98,0x4,0x4f,0xcf,0xc2,0x4d,0x5c, + 0x9d,0x3e,0x6b,0x70,0xc,0xe9,0xd3,0x42,0x69,0x66,0x84,0xa5,0xeb,0x62,0x3f,0x67, + 0x94,0xca,0x1b,0x20,0xae,0xed,0x4b,0x0,0x0,0xf,0x2e,0x49,0x44,0x41,0x54,0xb5, + 0xcb,0x70,0x1c,0x90,0xa2,0x7,0xfd,0x26,0x1a,0x2f,0xe7,0x56,0xb2,0xbb,0xd9,0xb0, + 0x5c,0xe2,0xd3,0x36,0x2f,0x66,0x30,0x88,0xa1,0x91,0xb8,0xb8,0x6e,0xe8,0xd7,0xed, + 0x47,0x10,0x49,0x4e,0xe7,0xae,0x36,0xa3,0x41,0xe1,0xbd,0xaf,0xc5,0x60,0xd5,0x69, + 0x85,0x6d,0xc6,0x15,0xd1,0xd3,0x90,0x96,0xfc,0xce,0x87,0x73,0xfd,0x64,0x94,0x44, + 0xc0,0x91,0xcd,0xe3,0x89,0x23,0x17,0x12,0x66,0x4a,0x22,0xdf,0x77,0xac,0xc7,0x76, + 0xd7,0xaf,0x76,0x86,0x18,0xda,0x72,0x67,0x42,0xd7,0x82,0x63,0xa5,0xe9,0x2a,0x9b, + 0xcd,0x71,0x99,0x52,0xdd,0xc8,0x6c,0xe0,0xc3,0xdc,0xbd,0x74,0x2e,0x2a,0xbc,0xa2, + 0xde,0x71,0x3a,0x4e,0x3e,0x9e,0xad,0x59,0x24,0x6b,0xf9,0x41,0x41,0x4f,0x73,0x80, + 0x4d,0x33,0x6d,0x5c,0x6e,0x98,0xfd,0xd8,0x8b,0x98,0x55,0xf7,0x8f,0x5f,0x7f,0x1a, + 0x2a,0x2d,0x4,0xf,0x8e,0x92,0x8d,0x72,0x15,0xd4,0x64,0x63,0xc6,0x97,0x4b,0x36, + 0x1f,0x78,0x30,0xf8,0xe5,0x5f,0xff,0xf3,0xcb,0xe0,0xa6,0x87,0x26,0x35,0xae,0xeb, + 0x68,0x36,0xee,0x56,0xa9,0x2a,0xf4,0xd2,0x5d,0xcb,0x92,0xe3,0xbd,0x1d,0x4,0x79, + 0x1d,0x71,0x85,0x2a,0xf7,0xf0,0x87,0x6d,0x3b,0x83,0xa6,0x68,0x95,0xb3,0xcf,0x4d, + 0x7d,0xcc,0xe3,0x2,0xad,0xe,0x4e,0x61,0x3f,0xd4,0x4d,0xa0,0xa2,0xef,0x2c,0x77, + 0xb9,0xce,0x7d,0xf5,0xef,0x67,0xca,0xca,0xed,0x5f,0x87,0x4d,0x0,0x56,0x80,0x0, + 0x15,0x77,0x65,0x86,0xa9,0xde,0x57,0x4b,0x4,0x57,0xd6,0x12,0x2e,0x92,0xce,0x9a, + 0x87,0x7c,0xa,0xd3,0xba,0xdf,0x6e,0x5a,0x7,0x41,0x2,0xa0,0x9d,0x3f,0x6,0x46, + 0x30,0xa4,0xa5,0xbd,0x83,0xc2,0xbe,0xf,0x8c,0x9c,0x32,0x1e,0x17,0x1,0xe6,0xa3, + 0x56,0xf6,0x2e,0xc2,0xf,0x4f,0xf3,0xdd,0x85,0x89,0x67,0xbb,0x8d,0xa1,0xab,0x51, + 0x8c,0x3c,0x40,0xb2,0x13,0x4d,0x62,0xf0,0x57,0xc8,0x16,0x3d,0x43,0x77,0xbc,0xf9, + 0xb,0xa0,0x43,0xfb,0x10,0x7d,0x70,0x94,0x99,0x7b,0x5e,0x37,0xa8,0xad,0x68,0xf9, + 0xad,0xc2,0x72,0xac,0x59,0xb5,0x6d,0x79,0x2c,0x50,0x93,0x75,0xb8,0xf6,0x68,0xa5, + 0x98,0x3e,0xbd,0x68,0x70,0x53,0xcb,0xb2,0x33,0x49,0x8,0x12,0xa3,0xe2,0x31,0x98, + 0x46,0x41,0x9,0xc1,0xc8,0xc5,0xa2,0x2a,0xc2,0x71,0x25,0xcc,0xa1,0xab,0xd7,0x55, + 0x43,0x58,0xcd,0xa5,0x3d,0x29,0x8f,0x23,0xc,0xba,0xe6,0x3a,0x5c,0x5a,0xcf,0x84, + 0xc9,0xd6,0x1e,0xe7,0x69,0xf,0x23,0xa7,0x65,0xb5,0xf4,0x4,0xb0,0xf2,0x10,0x18, + 0x8d,0x10,0x95,0x1a,0x9,0x3e,0x70,0xce,0xe,0xe3,0x98,0x2d,0x7c,0x23,0x18,0xf6, + 0x90,0x3b,0x54,0x3,0x1a,0x21,0x6,0xbf,0xfc,0xf1,0x4f,0x5f,0xfb,0xd0,0x41,0x1b, + 0x3f,0x58,0xf7,0x57,0x8a,0xe9,0xb7,0x6c,0xf4,0x86,0xba,0xd1,0xf5,0x9e,0xab,0x8c, + 0xd1,0x29,0x6,0x54,0x1b,0xf8,0x30,0xbe,0x98,0x75,0x28,0x16,0xc0,0xd2,0x80,0x8f, + 0xb1,0xfa,0xe7,0xd8,0xa5,0xd5,0xe3,0x89,0xc7,0x55,0x82,0x2b,0x29,0x28,0x44,0x18, + 0x3a,0x3f,0x2b,0x6c,0x83,0xba,0x54,0x8d,0xf5,0xe,0x87,0xfc,0x6,0x38,0x2e,0xb, + 0xed,0xe8,0x1e,0xd4,0x3d,0x54,0x74,0x19,0x4e,0xf6,0x5d,0x60,0xed,0xb2,0x1a,0x39, + 0x2d,0xc8,0xb8,0xae,0xb5,0x41,0x3a,0xcb,0x66,0x1a,0x5,0x5f,0xb4,0xdd,0x76,0x6d, + 0xeb,0x54,0xac,0xd1,0x3c,0x8d,0xb3,0x8a,0xda,0x74,0x77,0xea,0xc9,0x25,0x6e,0x30, + 0x7e,0x38,0x6c,0xa1,0xcd,0x15,0x6b,0xaa,0xc3,0x91,0x43,0x3c,0xa4,0x48,0x81,0xaf, + 0x1d,0x9a,0xc6,0x66,0xd2,0xa0,0xc3,0xad,0xae,0x96,0xb5,0xd4,0x6d,0x1b,0x9,0x6b, + 0xdf,0x23,0x87,0xad,0xab,0x66,0x58,0x4d,0x83,0xd7,0xc,0x38,0x63,0xb,0x46,0x82, + 0xdf,0x8d,0x6,0x55,0xf3,0x89,0x86,0xd4,0xf0,0x29,0x79,0x9c,0xe3,0x74,0x9e,0xd5, + 0x77,0x49,0xd9,0x26,0x72,0xd4,0x7d,0x22,0xaa,0x9a,0xe7,0x42,0xa4,0x17,0xb5,0x73, + 0x3d,0xd5,0x19,0xeb,0xd8,0xdd,0xce,0xa0,0x9,0xfa,0x58,0xab,0xcb,0x9d,0x3e,0x8e, + 0xb1,0xd2,0x5,0xb3,0x57,0xb1,0xd,0x95,0xb7,0x3e,0x7,0x73,0x4c,0xa5,0x68,0x23, + 0xf9,0xe9,0xca,0x49,0xf8,0xe7,0x27,0xcc,0x31,0xac,0x26,0xf3,0x60,0x41,0x7c,0x4c, + 0xc6,0x4b,0x12,0x7e,0xd0,0xb5,0x9c,0x85,0x6f,0x7a,0x91,0x29,0x9,0xd1,0xab,0x31, + 0x6,0xc,0x3e,0x7e,0x15,0xd3,0x5f,0xce,0x49,0x3f,0x3e,0xd7,0x50,0x54,0x30,0x40, + 0xf2,0x3d,0xe7,0xff,0xc5,0x7f,0xfc,0xd7,0x97,0x26,0xee,0xb8,0x15,0x67,0xde,0xd9, + 0xfb,0xa5,0xca,0xdd,0xee,0x83,0x4b,0xa6,0x79,0x28,0x3b,0x24,0xc8,0x10,0xb4,0xaa, + 0x74,0x8f,0xb5,0xd5,0xf9,0xdd,0x80,0x60,0x20,0x65,0xbe,0xca,0x52,0xb5,0x93,0xcf, + 0x36,0x24,0x6f,0x0,0x9b,0x1a,0x8,0x13,0x1c,0xc5,0xd3,0x2c,0xb,0x71,0x1e,0x4d, + 0x7a,0x12,0x31,0x79,0xd0,0xa0,0xae,0x19,0x8b,0xde,0x4,0x6e,0x2c,0x41,0x33,0xed, + 0x71,0x16,0x55,0x3e,0x40,0x12,0x14,0xbc,0x80,0xba,0x1d,0xa3,0xb0,0x2a,0xf4,0xe1, + 0x8,0x87,0x65,0xd2,0x89,0x8b,0xec,0x54,0x60,0xd5,0xf1,0x50,0xd4,0x3d,0x31,0x72, + 0x53,0x0,0x6d,0xe4,0x93,0x52,0xc9,0x51,0x3d,0x5b,0x6c,0x64,0x43,0x7c,0x1e,0x6c, + 0x99,0x21,0xf6,0x81,0x84,0xaa,0x26,0x77,0x9a,0x9b,0xb6,0x7,0x4,0x15,0xa,0x31, + 0x34,0x29,0x6f,0x22,0x94,0x18,0xc6,0xac,0xf1,0x3b,0x22,0x38,0x1f,0x70,0x43,0xb6, + 0xce,0x45,0xd7,0x72,0xd2,0x76,0x4d,0xc,0x8e,0x69,0x1d,0xe8,0xd0,0x15,0xa5,0xf6, + 0xb9,0x82,0xfc,0x2d,0x1f,0xcc,0x8a,0x2d,0xa8,0xa7,0x9d,0xfd,0xc3,0xb,0x37,0xa6, + 0xea,0x43,0x12,0xdd,0x6,0xba,0x8,0xa2,0x6,0x5a,0x3c,0xae,0xf0,0x4,0x3f,0xf8, + 0x3d,0x5b,0x79,0xbf,0x3d,0x87,0xda,0x15,0xe9,0xb0,0xb0,0xd7,0x79,0x60,0xeb,0x1c, + 0xd5,0xba,0x50,0x8f,0x2d,0x7a,0x54,0x93,0xe2,0xf9,0xef,0x23,0x9c,0x8b,0x6d,0x3d, + 0x44,0x3,0x31,0x79,0x0,0x72,0x3a,0x6b,0x8e,0xf,0x77,0x61,0x7b,0x36,0xde,0xb9, + 0xe3,0xf5,0xa7,0x3f,0x7f,0x3d,0x42,0x5,0xf8,0x94,0xb8,0xf5,0x1,0xbd,0x32,0x2d, + 0x81,0xd7,0x9c,0xe3,0xea,0x8f,0x8a,0xe4,0xcf,0x4e,0x42,0xd1,0x7e,0xce,0xc8,0xd5, + 0x3a,0xb9,0xa4,0x3c,0xd7,0xee,0x97,0x3b,0xd9,0xd1,0x37,0xa1,0x4c,0xf6,0x44,0xdf, + 0x16,0xab,0x8d,0x38,0x48,0x71,0xee,0x18,0x66,0x10,0xa7,0x38,0x6e,0xef,0xca,0x25, + 0x6b,0x59,0x1f,0xcc,0xac,0xea,0xa9,0x8d,0xa9,0xe7,0x43,0xdc,0x8d,0x6f,0x5a,0xef, + 0x75,0x7d,0x17,0xd6,0xaa,0x8,0x56,0xc7,0xde,0x6a,0xf9,0x98,0x61,0x7b,0x8,0x42, + 0x20,0xe4,0xf0,0x69,0x4e,0x5f,0x13,0x81,0x37,0x50,0xb3,0xab,0xba,0x8a,0x8b,0x0, + 0xd,0xea,0x42,0xe3,0x48,0xa6,0x87,0x65,0xf1,0x7a,0x9e,0x28,0xd8,0xf3,0xe,0x73, + 0x44,0xf,0x8c,0x9,0xd6,0x9,0x41,0x38,0xee,0xc1,0x6c,0xe4,0x1a,0x84,0xb,0xf2, + 0x54,0x5d,0x99,0xf5,0x59,0xaa,0xea,0x3e,0x8,0xb8,0x59,0x52,0xd4,0x5d,0x99,0xf8, + 0xc,0x3b,0x54,0x1d,0x3,0xda,0xb6,0x6,0xba,0x42,0xa2,0x96,0x80,0x79,0x26,0x3c, + 0x6d,0xcc,0x1f,0xed,0x30,0x2a,0x4,0xe8,0xc7,0xe7,0x83,0xf3,0xec,0x13,0xe6,0x62, + 0x25,0x5,0x75,0x98,0x25,0x6a,0x27,0xae,0x5,0xc6,0xa6,0x40,0xa4,0xc9,0x79,0xd0, + 0xb5,0x57,0xed,0x65,0x39,0x23,0xe5,0x1b,0x4d,0x25,0xc9,0xef,0x29,0xbf,0x6e,0x85, + 0xb5,0x1e,0x7c,0x73,0x43,0xdc,0x8d,0x5a,0x72,0xf1,0x53,0xf9,0xcf,0x59,0x81,0xbf, + 0x9d,0xa1,0x7a,0xe0,0x12,0xf0,0x50,0xbc,0x6f,0x66,0x27,0x21,0x76,0xf0,0xc4,0x55, + 0x60,0x1,0x7f,0xfe,0xef,0xaf,0x99,0x23,0x21,0xb,0xf3,0xbc,0x66,0x94,0x97,0xe, + 0x3b,0x5c,0x34,0x41,0x7f,0x36,0xb6,0x7b,0x2a,0x2c,0xb,0x54,0x16,0xdd,0xa9,0xca, + 0xe3,0xa8,0xb9,0xef,0xa8,0x7,0xf4,0xa1,0xf2,0xea,0xbb,0x80,0x43,0x53,0xb2,0x41, + 0x7d,0x7d,0x6e,0xdd,0x56,0x76,0xe6,0x4f,0xfa,0x5c,0x1f,0x5a,0xf7,0x4e,0x69,0xc5, + 0xdf,0x34,0x67,0x18,0x7e,0xe2,0xc2,0x36,0xde,0xd4,0x85,0x2c,0x39,0xd,0xd8,0x17, + 0x17,0xc4,0x69,0xde,0xe1,0xe3,0xb1,0x70,0x16,0x30,0xf5,0xc4,0x86,0x7e,0x3a,0xc0, + 0xf5,0xdc,0x5e,0xac,0xc1,0xf3,0x83,0x1d,0xd6,0x63,0x50,0x97,0xc0,0xc6,0x23,0x1d, + 0xe8,0x64,0x4c,0x97,0x2f,0x23,0xf,0xbf,0x1f,0x89,0xbd,0xf6,0x0,0x97,0x56,0xe8, + 0x32,0x4d,0xf3,0xb7,0xf2,0x2e,0x2e,0x4f,0xac,0xd9,0xa7,0x4c,0xbb,0x14,0x88,0xa7, + 0x5d,0xef,0x98,0x5c,0x1f,0x92,0xf1,0x27,0xef,0xea,0xd4,0xb9,0x27,0xd1,0x9,0xa, + 0xec,0xbf,0x15,0x19,0x15,0x12,0x81,0x2b,0x4a,0xed,0xf8,0x50,0x7c,0xff,0xc1,0x78, + 0x86,0x3c,0xcd,0x9a,0xe,0xef,0xba,0x42,0x67,0xff,0x1,0x9c,0x6d,0x5,0xd1,0x7, + 0xdc,0x99,0xaa,0xcf,0xe9,0xf4,0xdb,0xea,0xd0,0x9,0x5,0xc1,0xa1,0x88,0xd9,0x7c, + 0x22,0x1e,0x13,0x7a,0xe5,0xf3,0xfa,0x54,0xe0,0x26,0xed,0x8,0x1e,0x20,0xf8,0xa3, + 0x6b,0x28,0xc3,0x7d,0xb,0xe2,0x8,0xda,0xbd,0x3f,0xe9,0x28,0x1d,0x1b,0xac,0xf, + 0xd4,0x3,0x43,0xd1,0x3,0xfc,0xcf,0xff,0x7e,0x29,0x0,0x1d,0x25,0x12,0x93,0xec, + 0x6c,0x85,0x71,0x48,0xb2,0x85,0x69,0x1f,0x66,0xd0,0x3a,0xda,0xcc,0xb1,0x7,0x42, + 0x35,0x92,0xa8,0x52,0x59,0x48,0x3c,0x17,0x97,0xe5,0x9a,0xd8,0x87,0x90,0xbe,0x3c, + 0xe6,0xa7,0xde,0xfa,0x1,0x23,0xfb,0xd9,0xbf,0x7e,0x82,0x67,0xf8,0xb0,0x3b,0xb1, + 0x75,0x24,0x1a,0x54,0x9e,0xaa,0xc8,0x78,0xf8,0xf,0x58,0x57,0xc4,0xbe,0x6b,0x3f, + 0x84,0x5b,0x60,0xb3,0xce,0xb5,0xb2,0x41,0xb6,0x75,0x5c,0x15,0x96,0xed,0x43,0x35, + 0xc5,0x90,0xc,0xec,0xe7,0x6e,0x33,0xb6,0x14,0xe4,0x97,0xee,0x68,0xeb,0xe6,0xac, + 0xaa,0x87,0xab,0xcf,0x1d,0xb,0x99,0x93,0x22,0x4e,0xea,0xc4,0xf9,0x0,0xb1,0xd6, + 0x7e,0x0,0xb7,0x39,0x6a,0xea,0xe0,0x90,0x3a,0xc6,0xd3,0x99,0xad,0x7d,0xe6,0xf9, + 0xe4,0xb3,0x52,0x29,0x89,0x1d,0xba,0xed,0xa8,0x6f,0xbc,0xcc,0x3f,0x8f,0x1d,0x50, + 0x4a,0x6e,0x95,0x3b,0xb6,0x4f,0xe1,0xe9,0x27,0x42,0x8a,0x75,0xa0,0x95,0x3b,0xca, + 0x93,0x48,0xcb,0x9,0x25,0x51,0x4,0xb5,0xe,0x5d,0xfb,0xa2,0xf6,0x59,0xdc,0x54, + 0x7f,0xf8,0xc1,0xac,0xbb,0x3e,0x78,0xe,0x1f,0x14,0xa5,0x71,0xf6,0x8a,0x3c,0xfb, + 0xde,0x60,0x6f,0x86,0xf3,0x5f,0x7c,0x7c,0x7d,0x7b,0x23,0x80,0xcf,0xb8,0x8,0x76, + 0xae,0xe,0xa3,0xa3,0x18,0xf3,0x65,0xa6,0xe,0xd4,0x2f,0x7c,0x41,0x8,0x1f,0xaf, + 0x1a,0x74,0x1f,0x53,0xd2,0xbc,0x57,0x64,0xc6,0xcb,0x7c,0xf5,0x7,0xf0,0xca,0x9d, + 0x33,0xc4,0x87,0x18,0xef,0xf9,0xef,0xab,0xa6,0xba,0x11,0xec,0x1,0x73,0xd9,0x7d, + 0x4c,0x17,0x8f,0xb,0xde,0xcc,0xa7,0xb4,0x6e,0x28,0x26,0xf7,0x4b,0xa6,0x4b,0xdd, + 0xe9,0x67,0xf2,0x83,0x99,0x94,0xea,0xb7,0x32,0x5,0x2e,0x86,0x79,0x35,0x73,0x60, + 0xa2,0xcf,0xe1,0x4f,0x63,0xfa,0xeb,0xfb,0xa5,0x2e,0x7,0x46,0x27,0x5f,0xba,0xd7, + 0xd4,0x21,0x1e,0x8a,0x89,0x75,0x15,0x49,0x2,0xd1,0xc0,0xe0,0xd5,0xff,0xb4,0xff, + 0x3d,0x79,0x47,0x83,0xd0,0xf5,0x50,0xcc,0xe8,0xf7,0x40,0x5,0x3,0xf0,0xc3,0xde, + 0xb,0xf,0xb0,0x72,0xd5,0x12,0x28,0xe5,0x22,0x46,0x97,0x9e,0xfe,0x59,0xb0,0x40, + 0x78,0xcb,0x5c,0x8f,0xa7,0x60,0xa1,0x90,0xab,0x92,0x63,0xe4,0xf9,0xdb,0x2e,0x79, + 0x4d,0x3,0xe6,0xd,0xbe,0xe6,0x42,0x50,0xad,0x0,0x55,0x69,0x2,0xe0,0xa1,0x6b, + 0x39,0xad,0xe0,0x30,0xdc,0x45,0x2c,0xdf,0x27,0x39,0x3c,0xc6,0x40,0xac,0xf2,0xa6, + 0xb5,0xfc,0x9e,0x7a,0x1b,0x92,0x67,0xd8,0x14,0xe1,0x2e,0x1f,0xb,0x6b,0xb4,0xe7, + 0xc0,0xc9,0xae,0x66,0x3a,0x87,0x3d,0xc9,0xf2,0x4c,0xd4,0x20,0x97,0x19,0xbc,0xbc, + 0xdb,0x71,0xde,0x19,0x60,0x3b,0xf8,0x73,0x7f,0x7f,0x4f,0x2b,0xf2,0x28,0xf7,0x25, + 0xc9,0x37,0x2f,0x9,0x76,0xfc,0xc5,0x87,0xcf,0x6e,0xd0,0x2e,0x77,0x43,0x8b,0x6b, + 0x13,0x4b,0xde,0xdb,0xc9,0xaa,0x42,0xb,0x68,0xc2,0x46,0x95,0x83,0xf8,0x12,0x81, + 0x1b,0xe5,0x10,0x7c,0x82,0x80,0x54,0xed,0x36,0xba,0x77,0x5e,0x78,0x7d,0xf,0xa2, + 0xee,0xb7,0x7d,0x7,0x77,0xcc,0xff,0xdd,0x13,0x10,0xc2,0x43,0x88,0x3e,0xd7,0xc, + 0x81,0x5c,0xe6,0xea,0x27,0x25,0xf,0x6e,0x7,0x40,0x2b,0x2b,0x8,0xdc,0xa5,0xff, + 0x3d,0x44,0x6b,0xd4,0xe2,0x5d,0x87,0x6,0xc9,0xbf,0xcd,0x66,0x45,0xb1,0xe2,0xfa, + 0x59,0xfd,0x77,0xe3,0x99,0x8,0x54,0x72,0x51,0xd9,0x7e,0x8f,0x42,0xa,0x90,0xdd, + 0x3f,0xb2,0xce,0x95,0x4d,0x70,0x34,0x21,0xf6,0x3f,0x4f,0xa1,0xf9,0x92,0xe1,0x7f, + 0x53,0x3e,0x4f,0x2d,0xee,0x6e,0x72,0xf1,0xb4,0xe8,0x0,0xf6,0x3f,0x2e,0x8f,0xd3, + 0x7e,0x16,0xf,0xd8,0x7f,0xef,0xbe,0xaf,0xcb,0x1a,0xde,0x3,0x10,0xfe,0xec,0x9, + 0x6e,0x7e,0x7f,0x66,0xb4,0x73,0x92,0x76,0x1c,0xe1,0xcf,0x2d,0x2d,0xf3,0xb3,0xbc, + 0x88,0xb3,0x55,0xb7,0x90,0x98,0xb1,0x24,0x64,0xfd,0x3d,0x3d,0xa0,0xdb,0xd2,0x30, + 0xe6,0x59,0x1f,0xc,0x56,0xc8,0xe7,0x93,0x62,0x48,0xe3,0x29,0x6a,0x92,0x1d,0xfa, + 0xcb,0x5b,0x73,0x15,0xc7,0xb5,0xb2,0xbb,0x97,0x2f,0xa2,0xcf,0x82,0xc7,0x5d,0x6e, + 0x5,0x8d,0x25,0x68,0x2c,0x41,0x3e,0x9d,0x6d,0xcc,0x82,0x41,0xeb,0x9,0xb0,0x8e, + 0xdc,0x20,0x96,0x27,0x35,0x9c,0xf0,0x40,0x2e,0xf3,0xb8,0x56,0xa8,0x91,0xa1,0x95, + 0x3b,0xfd,0x27,0x43,0xc1,0xa4,0xdf,0x21,0x34,0x10,0xe8,0xeb,0xc5,0xa1,0x73,0x5e, + 0x39,0x66,0xda,0x2c,0x2c,0xcf,0xdb,0x9c,0x3b,0xcb,0x3f,0x27,0x91,0x45,0xbd,0x10, + 0x9a,0x92,0x9a,0xa3,0xd2,0x59,0x4,0xe2,0x7e,0x76,0xd6,0x58,0xc0,0x75,0x3b,0xde, + 0x3f,0x67,0x2d,0x12,0xe1,0xc5,0x89,0x9e,0xfd,0x8e,0xfa,0x8c,0x42,0x48,0x59,0xca, + 0x92,0x80,0x19,0xc6,0x3d,0xe9,0xae,0x43,0xc6,0xca,0x5c,0x5e,0xc8,0x8f,0x7f,0xff, + 0x1a,0x5f,0x88,0x90,0x36,0x37,0x24,0x30,0x86,0x76,0xf8,0xa,0x78,0xfa,0xa1,0x11, + 0xce,0x5f,0x20,0x5a,0xbc,0x1f,0x36,0x3,0x2c,0x84,0x85,0x2e,0x8f,0xa5,0xe3,0x4c, + 0x10,0x95,0x56,0x38,0xe9,0x1e,0x0,0x5e,0x51,0x5e,0x55,0x29,0x25,0xd9,0x94,0x17, + 0x4,0x57,0x87,0xb7,0xec,0xa0,0xc6,0x2e,0x5c,0x2,0x3c,0x35,0x89,0x1d,0x12,0x0, + 0xa5,0xf0,0x0,0xf3,0x4c,0x14,0x33,0x5e,0xc5,0x29,0x1,0x2a,0x4,0xfc,0xfe,0x77, + 0x31,0xbb,0x34,0xea,0x19,0x41,0x80,0x4b,0x21,0x5d,0xb3,0x74,0x17,0x23,0xe9,0x23, + 0xcf,0x90,0xa3,0x65,0x6a,0x22,0xbf,0x38,0xc2,0x3d,0xb,0x4f,0x3d,0x3b,0x90,0x77, + 0xd7,0x12,0xf7,0x8,0x3e,0x98,0x9,0x92,0x29,0x20,0xd1,0xf,0xe5,0x75,0x6,0x82, + 0x53,0x83,0x92,0x8b,0x6c,0xeb,0x81,0xfe,0x9e,0xb9,0x15,0x1,0x9c,0xa8,0x45,0x3c, + 0x9f,0x94,0xe2,0x51,0x2,0x7c,0x3f,0xb7,0xef,0x67,0xf0,0x94,0x90,0xa9,0x45,0xc, + 0x43,0x87,0x1a,0xce,0x3c,0xa5,0xb0,0x19,0xc7,0x3d,0x24,0xfc,0xa8,0x25,0xdb,0x9f, + 0x7,0x5,0x46,0xe7,0xb9,0x80,0x66,0x3a,0xeb,0xf0,0xca,0x52,0x47,0x21,0xf4,0x95, + 0xb3,0x35,0xc6,0x8d,0x24,0xa1,0xf1,0xb4,0xf2,0x18,0x8a,0xa1,0x41,0x2a,0x4,0x4, + 0x25,0x40,0x5d,0x4c,0x5,0x51,0xd8,0x4e,0xe2,0x32,0xaa,0x60,0x8f,0xfb,0xc9,0x98, + 0x21,0x20,0x88,0x5b,0xdd,0xc5,0x50,0x28,0xf6,0x84,0x23,0xe8,0xec,0x44,0x98,0x98, + 0x93,0x76,0xd4,0xad,0x90,0x7c,0x85,0x87,0x86,0x6f,0x24,0xc1,0xf6,0xe,0x91,0x8a, + 0x8d,0x3a,0xcf,0xb1,0x19,0x90,0x2c,0x17,0x5c,0x91,0xcf,0x8f,0x83,0xd7,0x9,0xfc, + 0xae,0x97,0x14,0x78,0xc9,0x22,0x9b,0x12,0x3f,0x70,0x61,0xe3,0xf4,0x44,0x96,0xce, + 0x1d,0x98,0xab,0xf7,0x5e,0xc5,0x74,0xd8,0xf2,0xb4,0xe0,0x7b,0x5,0x77,0xa,0xdc, + 0x19,0x2a,0x4c,0x86,0x8e,0x9b,0x49,0xb3,0xb3,0xff,0xc,0x86,0xca,0x5c,0xe1,0x63, + 0xfd,0x8c,0xcc,0x7,0x9a,0x4b,0xe5,0xdf,0x5f,0xb0,0xcd,0x9e,0xe9,0x87,0x36,0x21, + 0x12,0x78,0xe8,0xb0,0x35,0xa0,0x20,0x74,0x50,0x68,0x9d,0xb0,0xae,0x82,0x40,0x21, + 0xd6,0x7e,0x78,0x90,0x21,0xa6,0xf8,0xdf,0xe9,0x1,0x3c,0xc2,0xda,0x9a,0xac,0xc2, + 0x77,0x4d,0x5d,0x42,0xaf,0x44,0x7,0x54,0xc6,0xcc,0x8,0xd5,0x6e,0xbb,0xd2,0xa8, + 0x2,0xa1,0xb0,0x92,0x6a,0x9a,0xd,0xfd,0xa1,0x6,0x15,0x7a,0xc1,0x60,0x10,0xba, + 0x76,0x62,0x1d,0x1e,0x95,0x51,0x4,0xfa,0xfd,0x42,0x80,0xe8,0xd2,0xbb,0x4d,0x45, + 0x87,0x74,0x2d,0xa,0x81,0xc6,0x59,0x2e,0xbc,0x28,0x4e,0x15,0x31,0xb9,0x77,0x5e, + 0x76,0x36,0x53,0x0,0x5d,0x90,0x2f,0xed,0x14,0x91,0xa0,0xd6,0x20,0x7e,0x5d,0x5b, + 0x1c,0x61,0x18,0x7b,0x84,0x77,0x4d,0xe1,0x3a,0x24,0xe4,0x1,0x82,0xb4,0xc,0x14, + 0x26,0x6c,0x7f,0xd4,0x82,0xae,0x24,0x78,0x46,0x3b,0x2e,0x84,0xc0,0xf,0x64,0xb4, + 0xcc,0xee,0x5c,0x88,0x1,0x56,0x90,0x84,0xa2,0x30,0xb9,0xa1,0x61,0x1b,0x57,0x54, + 0xd8,0x37,0x3e,0x90,0x90,0xc0,0xb5,0x8e,0x18,0xcd,0x45,0x3a,0x23,0xdc,0x20,0x77, + 0xfd,0x79,0x8a,0xd6,0x6a,0x12,0xe7,0xec,0xf0,0x49,0x7f,0xd6,0xc7,0x82,0xa1,0x3e, + 0x20,0x1f,0xf2,0x6c,0x33,0x8c,0x43,0x2c,0xd0,0x98,0xc0,0x50,0x30,0xe1,0xe9,0x59, + 0x20,0xa0,0x62,0x82,0xc,0xfd,0x78,0x6d,0x2f,0x3b,0x84,0x3,0x96,0x80,0xcc,0x4e, + 0xe0,0xf0,0xc3,0x8,0xda,0xc8,0x95,0x54,0x61,0xdf,0xa3,0x23,0x97,0x8a,0x2c,0xec, + 0x37,0x32,0xcc,0xaf,0x6d,0x7e,0xba,0x7d,0x6,0x9,0xe8,0x70,0xf5,0x22,0x9f,0x8d, + 0x84,0x4b,0xda,0x2b,0x6f,0x3c,0x90,0x38,0x28,0x89,0x8d,0x4f,0x49,0x1c,0x7,0x78, + 0x58,0x8a,0x9c,0xa8,0x62,0x85,0xdc,0x19,0x8d,0xd9,0x17,0xfd,0x67,0x26,0x68,0x3a, + 0x55,0x8d,0x88,0x64,0x85,0x79,0xe,0xc,0xaa,0xaa,0x4c,0x6,0x4b,0x45,0x47,0x87, + 0xca,0x8,0xe9,0x8,0x10,0xe0,0x66,0x48,0x50,0x91,0x33,0xb2,0xae,0xf8,0x31,0xc3, + 0x81,0xe3,0xb3,0x60,0x6,0xc,0x2e,0x9,0x66,0xdb,0xdf,0xa5,0xb8,0xe2,0x31,0x5c, + 0x40,0x2e,0x1d,0x79,0x8a,0xb,0x58,0x8a,0xe8,0x58,0x8c,0x9f,0xb8,0x1d,0x10,0x48, + 0x17,0x73,0xb4,0x56,0x32,0xfe,0xd9,0xde,0xa3,0x12,0x9,0xb9,0xc0,0xf8,0x78,0x18, + 0xff,0xe8,0x41,0x65,0x18,0x2f,0xe0,0x30,0x6a,0xd1,0x9d,0xde,0x4d,0x6,0xd6,0xba, + 0x43,0x19,0xe7,0xb1,0x17,0xfe,0x5c,0xe6,0xbc,0x98,0xef,0x16,0xdc,0x57,0x73,0x46, + 0xac,0xa8,0x4c,0xde,0x2c,0x3e,0xcb,0x51,0x44,0x98,0x9e,0x7,0xd9,0xbb,0x43,0x50, + 0x4a,0x9b,0x9,0xc0,0x1e,0x27,0xb1,0x8d,0xc,0x12,0x44,0xca,0xb9,0x95,0x51,0xc, + 0xeb,0x4e,0x7d,0xf4,0x83,0x80,0x70,0x3c,0xad,0x68,0xb1,0x22,0x4f,0xc4,0x12,0x76, + 0xe0,0xc4,0x58,0x33,0x1a,0xc6,0x22,0x58,0x8a,0xf9,0x94,0x9b,0x80,0x99,0x97,0x8, + 0x77,0xda,0x4a,0x15,0x18,0x16,0xb,0xda,0xa8,0xde,0xb9,0x91,0x35,0x19,0x72,0xf0, + 0xf7,0xcf,0xf2,0x3a,0x9f,0x5,0x86,0xb9,0x66,0xe5,0x84,0x3c,0x58,0xbf,0xc2,0x98, + 0xee,0xf,0x1c,0x52,0x91,0xe3,0x3,0xf3,0x13,0x9d,0xe3,0xb2,0xe,0x2a,0x56,0xcc, + 0xc8,0x9,0x90,0xe5,0x34,0x37,0xa6,0xa7,0x15,0x29,0xdc,0x87,0xbf,0x27,0xa8,0x53, + 0x21,0x7d,0x62,0xe9,0x76,0x2,0x39,0x49,0xa1,0xa0,0x51,0x95,0x6a,0x47,0x5a,0x73, + 0x7e,0xbc,0x46,0x6,0x2c,0x81,0x91,0x32,0x5f,0xa,0xbf,0xd7,0xa0,0x41,0x84,0x51, + 0x47,0x68,0xcb,0xa2,0x2b,0x91,0x30,0xd4,0xb1,0x14,0x56,0xe3,0x6c,0x85,0x91,0xa, + 0x25,0x79,0xf4,0x4b,0x32,0xe4,0x7,0x31,0xe7,0x68,0x1b,0x74,0x89,0xf0,0xff,0xda, + 0x95,0x9f,0x2e,0xec,0xf6,0x33,0xd,0x2,0x3e,0xcc,0xa,0xb9,0x71,0x21,0x6a,0xb9, + 0x37,0x15,0x50,0xa0,0xd,0x89,0xd1,0x42,0x87,0xf9,0xfb,0x25,0x72,0x17,0xb8,0xa3, + 0x22,0x10,0x2,0x9d,0xce,0x9d,0x21,0xe7,0x88,0x1,0x25,0x26,0x73,0xc6,0x66,0xe8, + 0x2e,0x11,0xc6,0x1,0xe9,0x3d,0xea,0xb3,0xea,0x70,0x38,0x9e,0x48,0xac,0x69,0x46, + 0x8e,0xd0,0xfd,0xf3,0x80,0xa4,0x2e,0xa2,0x23,0xf1,0x4a,0x26,0x44,0xa7,0xbc,0x5b, + 0xb6,0x6,0x21,0xc1,0xfa,0x74,0x64,0x13,0xe9,0x3e,0xa9,0x55,0x9e,0x76,0x90,0x32, + 0x83,0x86,0xc0,0xe4,0x3c,0x15,0xec,0x98,0x70,0x7e,0x6f,0x14,0x55,0xc9,0x4c,0xc7, + 0x5c,0xf1,0x33,0x21,0x40,0xfa,0x9,0x71,0xa,0xbb,0xf7,0xd1,0x4c,0x64,0x29,0xc8, + 0x4c,0xc9,0x92,0xcb,0xa8,0x6d,0x51,0x1a,0xeb,0xb1,0x14,0x81,0xd0,0x89,0x65,0x3b, + 0xc7,0x12,0x9c,0x3c,0xb,0x86,0x3c,0x29,0x71,0xe1,0xe5,0xda,0x87,0x5c,0xbf,0x5b, + 0xd4,0xdd,0xb5,0x59,0x8d,0xe,0x5a,0x90,0x1d,0x77,0xc0,0xc,0x67,0xf5,0x87,0x0, + 0x1c,0x92,0x10,0x97,0x40,0x89,0x1c,0x3c,0xa9,0xda,0xe3,0x88,0x8d,0x8b,0xe9,0xce, + 0x2f,0x63,0xaf,0x5c,0x39,0xe7,0x22,0x6a,0xb2,0xc1,0xe9,0xf3,0x37,0x86,0x82,0x4, + 0x1,0x2d,0xe0,0x3,0x24,0x5,0x61,0x80,0x77,0x98,0xca,0x3c,0x9c,0xb1,0x43,0x9a, + 0x69,0x26,0x85,0xda,0x13,0xce,0x50,0xc6,0x93,0x68,0x8d,0x85,0xf1,0xa9,0x33,0x28, + 0x86,0x95,0xa2,0x94,0xd4,0xae,0x9f,0xa9,0xcf,0x29,0x30,0xab,0x95,0x35,0xce,0x30, + 0x83,0xc7,0x36,0xeb,0x95,0x8e,0x72,0x4,0xa8,0xd0,0xaa,0xe2,0x40,0x62,0x3a,0xc1, + 0x79,0x8a,0x7e,0x41,0x90,0x9f,0x31,0x6b,0xc,0x9,0x17,0x1,0x9,0x18,0x1d,0x4b, + 0x80,0x6c,0x9,0x27,0xec,0x9c,0x56,0x30,0xa3,0x25,0xeb,0x3,0x83,0x99,0x61,0xdc, + 0x43,0xed,0x7a,0x42,0x81,0x8b,0x5,0xdf,0x25,0x3,0x1a,0xd5,0x7e,0x26,0xe1,0xc5, + 0x81,0x72,0x1e,0xc6,0xf7,0x66,0x88,0x17,0x90,0xe7,0xae,0x5c,0x8,0x64,0x8e,0x6, + 0x91,0xd1,0x9,0x22,0x8f,0xd0,0x62,0x9d,0xbd,0x70,0x4d,0x56,0x96,0x34,0x2,0x37, + 0x29,0xc1,0x66,0x9b,0x4e,0x42,0x4a,0x5e,0x58,0xe6,0xce,0x10,0x84,0xef,0xe0,0x1e, + 0x64,0xd,0x1e,0xc3,0xe8,0x33,0x49,0xa9,0x26,0x17,0x92,0x50,0xb0,0xd5,0x52,0x74, + 0x21,0x90,0x9c,0x18,0xee,0xf5,0xb8,0xb3,0xa1,0x11,0x4d,0xcf,0xf0,0x53,0xad,0xc, + 0x2b,0x6c,0x90,0x51,0xb8,0x3a,0x6d,0xfe,0xf0,0x19,0xb1,0xe9,0x9d,0x3b,0x66,0xae, + 0x78,0xb9,0xad,0x61,0xb9,0x39,0x78,0xa5,0xce,0xec,0x34,0xdb,0x48,0xd5,0x4d,0xaa, + 0xf2,0x3,0x84,0x5f,0x95,0x13,0xdb,0xc6,0x58,0x66,0xed,0x7,0x28,0x65,0xda,0xc8, + 0xa2,0xe,0x2f,0x4d,0x99,0xc4,0x5c,0x82,0xec,0xfe,0xd4,0x5b,0x22,0xb,0x5d,0x54, + 0x7f,0xe6,0x9d,0xa5,0x3b,0xa0,0x63,0x84,0x15,0x99,0x40,0x2a,0xc2,0x52,0xe0,0x55, + 0xea,0xe8,0xcb,0x57,0x26,0x6c,0x65,0x68,0xb9,0x14,0x86,0x2a,0xd0,0xe7,0xc0,0xc4, + 0x32,0x36,0x9,0x23,0xc,0x1c,0x60,0x3d,0x2e,0x45,0x45,0x9c,0xf9,0x7,0x58,0x6b, + 0x6c,0xe,0x94,0x43,0xad,0x75,0x40,0x2c,0xb1,0x75,0x6f,0xcc,0x90,0xd9,0x49,0xaa, + 0x32,0xad,0x47,0x1,0x7e,0x46,0x74,0x4d,0xd,0x1d,0xc6,0xeb,0x63,0x27,0x75,0xce, + 0xa3,0xb3,0xa5,0x4f,0x8,0x80,0x25,0x7c,0xc8,0xfc,0x6f,0x11,0xc6,0x50,0x48,0x1f, + 0x74,0x66,0x33,0x2a,0xa0,0x4a,0xc1,0xc1,0x9,0x90,0xb1,0x47,0x28,0xe8,0x14,0x42, + 0xb7,0xd9,0x36,0x1d,0x1a,0x36,0xe7,0x25,0x19,0x7d,0x69,0xd1,0x77,0x1a,0x97,0x28, + 0x9f,0x2,0x38,0x24,0x32,0xe5,0xe,0x71,0x16,0x22,0x87,0x1a,0x22,0x9f,0x8b,0x72, + 0xb4,0x29,0x71,0x1d,0xb8,0x34,0x51,0x40,0xee,0xc0,0x2b,0xdc,0x89,0x81,0x4,0x32, + 0x74,0xa3,0x98,0x5c,0x96,0xad,0x69,0xa9,0xca,0x9f,0xdf,0x6a,0x5f,0x64,0x84,0x17, + 0x1b,0x92,0xf,0x2f,0xd2,0x13,0xab,0x32,0xed,0x98,0xeb,0x6,0xc5,0xd1,0xda,0x73, + 0x89,0x43,0x71,0xb,0xa3,0x72,0x4c,0x4d,0xb3,0xed,0x8f,0xd4,0x55,0xf,0x28,0x11, + 0x43,0x3c,0x1a,0x63,0xc9,0x59,0x18,0xfd,0x1f,0x87,0xe1,0xa7,0xf7,0xe9,0x80,0xe9, + 0xfc,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/cusdrLogo2.png + 0x0,0x2,0x19,0x4c, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x1,0xf4,0x0,0x0,0x1,0x2c,0x8,0x6,0x0,0x0,0x0,0x35,0xbb,0x41,0xc8, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1, + 0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdb,0x8,0x1d, + 0x13,0x34,0x23,0x21,0x3,0x1d,0x63,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78, + 0xda,0x94,0xbd,0x5d,0xaf,0x6e,0x5d,0x76,0x14,0x36,0x6a,0xb1,0x85,0x72,0xc1,0x2f, + 0x89,0x88,0xb2,0x13,0x23,0x1b,0x84,0xed,0xc6,0xbe,0x23,0x88,0x3b,0x2e,0xa3,0x28, + 0x96,0x83,0x8c,0xe3,0xf0,0x61,0xc7,0x49,0x24,0x64,0x84,0xc2,0x47,0x42,0x1a,0x6c, + 0xec,0x10,0x1c,0x22,0x4,0x52,0x24,0xee,0x72,0x15,0x21,0xe4,0xbb,0xa4,0x3b,0xb4, + 0x90,0x4d,0x2,0xbd,0x7f,0xd1,0xae,0x5c,0xec,0xb5,0xe6,0xac,0xaa,0x31,0xe6,0x73, + 0x5e,0xda,0x6a,0xf7,0xfb,0x9e,0xf3,0x7c,0xac,0x67,0xad,0x39,0xe7,0x18,0xa3,0x46, + 0x8d,0x2a,0xd4,0x1f,0xfa,0xf7,0x7f,0x5c,0x55,0x55,0x44,0x15,0xaa,0x8a,0x25,0xff, + 0x61,0xad,0x3f,0x5c,0x7f,0x87,0x2a,0x70,0xff,0xb3,0xbd,0x1,0xfe,0x9e,0xf1,0x25, + 0xf7,0x1f,0x10,0xf2,0x1d,0xf9,0x5e,0xf9,0x73,0x40,0xde,0x3f,0xbc,0x56,0x3f,0x1f, + 0xf7,0x3f,0xd8,0x6f,0xe1,0xe1,0xf2,0x20,0x7f,0x7e,0xff,0x9e,0xf5,0x5d,0xf9,0x7b, + 0xab,0x8a,0x72,0x3d,0x25,0xff,0xfe,0x5c,0xef,0xcb,0x7b,0xa7,0xef,0x99,0x7e,0x77, + 0xbe,0x2f,0xff,0xf3,0xea,0xf7,0x3c,0xcf,0x3,0xfd,0xfe,0xe8,0xef,0xa9,0xfc,0x2d, + 0xfa,0x3e,0x7d,0x1b,0x87,0x7b,0x9e,0xcf,0xa6,0xe2,0xf9,0xca,0x9a,0xb0,0x7b,0x2b, + 0x9f,0x85,0xef,0xf0,0xcc,0xed,0x37,0xc6,0xf5,0x21,0xde,0xd3,0x3e,0x6b,0x78,0xae, + 0xd3,0x77,0xd9,0x3d,0xc1,0xe1,0x75,0xc3,0xfd,0xa8,0x58,0x67,0xf9,0x3d,0xf9,0xfb, + 0xd6,0xb5,0xe8,0xbd,0xe7,0xf0,0x78,0x87,0xcf,0x19,0x7f,0xe3,0xfd,0xec,0x9e,0xf, + 0x68,0x4b,0x69,0xb8,0x1f,0xdf,0xba,0xbf,0x35,0xdd,0x87,0x1a,0xf6,0x77,0xfc,0x2e, + 0xfb,0xce,0x57,0xf7,0xb4,0x6a,0xbe,0xd8,0x5c,0x87,0xb9,0xee,0xf2,0xdc,0x99,0xd6, + 0x6d,0x9e,0x3,0xf7,0xff,0x52,0xd6,0x5d,0xf1,0x70,0x6f,0xa6,0x6b,0xac,0xbe,0xcf, + 0x99,0xfb,0xfa,0x70,0xe6,0xe8,0xf5,0xd,0x47,0xe0,0xfe,0x3c,0x9e,0xbf,0x7b,0xdd, + 0xc7,0xbc,0xf6,0xe1,0xc,0xc8,0xb3,0x60,0xfd,0xbc,0xdc,0x33,0x7a,0x4d,0x98,0x7f, + 0x6b,0xae,0x6d,0x3d,0xaf,0xaa,0xfc,0x7e,0xca,0xb3,0xf9,0xfa,0xd7,0xf8,0xa1,0x79, + 0xee,0xca,0x3d,0xfc,0x7a,0x64,0x3c,0x3f,0x33,0xc,0x47,0x4,0xe,0xff,0x5b,0x2f, + 0x96,0xef,0xf8,0xe8,0xb9,0xef,0x8d,0xbe,0x99,0xba,0xdf,0x5e,0x1c,0x1b,0xcf,0x6f, + 0x1e,0x8e,0xf0,0xe3,0xad,0xad,0xf3,0xf6,0x6a,0xcb,0x2d,0x8e,0x70,0x7f,0x24,0xfd, + 0xc7,0x9f,0x3e,0x1f,0x55,0x75,0xd9,0x62,0x99,0x36,0xe1,0xba,0xe9,0xf0,0x7f,0x7, + 0xe6,0xa0,0x83,0x6f,0x1c,0x58,0xe4,0xbe,0x91,0x78,0xb5,0xc0,0x25,0x8,0x42,0xff, + 0xec,0xb9,0x56,0xdd,0xd8,0xec,0x8b,0xd2,0x9e,0x2e,0xea,0x9c,0xb4,0x4c,0xd7,0x29, + 0x9b,0xb9,0x24,0x50,0xd5,0xb3,0x29,0x39,0xdc,0x2b,0xca,0x81,0x4c,0xbf,0x87,0xa4, + 0x27,0x43,0xf6,0x14,0x38,0x7,0x26,0x7b,0x2e,0xc3,0x77,0x2,0xfb,0xf7,0x64,0xe2, + 0xd0,0x72,0x3,0x59,0x81,0x19,0x4b,0xf5,0xb3,0x29,0xbf,0x11,0xf1,0x9b,0xe2,0xf6, + 0x7c,0xfd,0x17,0xbe,0x39,0x2a,0x12,0xa2,0xb5,0x62,0x75,0x43,0xb1,0xdf,0x6b,0xfb, + 0x7e,0xfa,0x7d,0x2f,0xbd,0xf7,0xf7,0xe7,0x13,0x1e,0x5c,0xa,0x43,0x2e,0xf4,0x2a, + 0x40,0x4f,0x87,0xa9,0x5e,0xcb,0xf4,0xfc,0xee,0x3f,0xb7,0xe7,0x25,0x7f,0xa6,0x6b, + 0xfa,0x79,0x36,0xcf,0x73,0x42,0x4,0x49,0xbd,0x6f,0x79,0x28,0xaf,0x7b,0x28,0xcf, + 0xde,0xe,0x58,0xd9,0x8b,0x9c,0x12,0x18,0xb9,0x5f,0x9a,0x40,0xeb,0xb3,0x40,0xec, + 0x55,0xf0,0x74,0xdc,0xec,0xef,0xd6,0xc3,0x97,0xba,0xff,0x31,0xec,0x27,0xce,0x27, + 0x6c,0xee,0xeb,0xca,0xc0,0x25,0x67,0x2,0xe2,0xb3,0x9f,0xe0,0x93,0xc1,0x3c,0xaf, + 0x3,0x7a,0xce,0xa0,0x47,0x1,0xa0,0x9f,0x11,0x76,0x7f,0xf6,0x1e,0x40,0xae,0x41, + 0xc0,0x6f,0xab,0x5,0x51,0xfa,0x3d,0x27,0xbe,0x42,0x0,0xca,0xaf,0xb1,0x86,0x7d, + 0x74,0xff,0xe,0x70,0xba,0x57,0xe8,0xdb,0xc5,0xce,0xe7,0xfb,0x7b,0x34,0x9,0xb4, + 0x67,0xb,0x3b,0xf1,0x91,0x5,0x8c,0xbc,0xc,0x38,0xd5,0x14,0xfa,0x7e,0xec,0x63, + 0xf0,0xfe,0x66,0xbb,0xce,0x75,0xe4,0xfa,0x6f,0x25,0x7c,0xed,0x3,0xf2,0xfe,0xe7, + 0xad,0xf1,0x9e,0xfd,0x31,0x28,0xe8,0xdf,0x1,0x85,0x7b,0xdd,0xeb,0x73,0xc0,0xfd, + 0x7,0xeb,0x94,0x41,0x5e,0x5b,0x4,0x28,0xb9,0x37,0xc8,0x9b,0xfc,0x5c,0xe7,0x3e, + 0xec,0xfc,0xfb,0xec,0xf9,0xe9,0x1f,0x21,0xb6,0x33,0xf6,0xa7,0x40,0xff,0x1e,0x45, + 0x7d,0x7e,0xeb,0x77,0x96,0x5c,0x3f,0xda,0x11,0x7,0xdc,0xef,0x8b,0x25,0xf9,0xbc, + 0xee,0xf2,0x43,0x6c,0xd8,0xd8,0x96,0xd9,0x50,0xe,0xd5,0xc,0x3a,0xba,0x21,0xb8, + 0x7f,0x2d,0xa7,0x85,0x25,0x87,0xb3,0x1e,0xe0,0x80,0x1f,0x2e,0xcf,0x7b,0xc8,0x8, + 0x12,0x1a,0x68,0xe9,0x8b,0x97,0x18,0xe,0x82,0xf2,0x80,0x96,0x41,0x92,0x99,0xb1, + 0x4d,0xc5,0xc9,0x84,0x46,0x20,0xaa,0xd4,0xf2,0xec,0xb8,0xe2,0xde,0xe9,0x2,0x6b, + 0x49,0xc8,0x21,0x48,0xd9,0x7d,0xe4,0x39,0x41,0x1a,0x77,0x62,0x6,0x2f,0xf8,0xfb, + 0x5a,0x1e,0x43,0x7f,0x76,0xfa,0xdf,0x15,0x44,0xb9,0xf,0x75,0xb,0x74,0xe5,0xc1, + 0xe2,0x50,0x84,0xf8,0x1,0x7b,0x48,0x14,0x58,0xfd,0x99,0x25,0xa,0x83,0x3c,0x94, + 0x23,0x20,0x23,0x6e,0xa1,0xde,0x1b,0x66,0x22,0x26,0x1,0x38,0x2b,0xe1,0x4c,0x60, + 0x29,0xf7,0x64,0xfa,0x33,0xc6,0x3e,0x58,0xf7,0x2a,0x7e,0x4f,0xe9,0xe7,0xd2,0x7f, + 0xf3,0xa,0x10,0xfd,0x76,0xed,0xfb,0xc4,0x58,0x67,0xf5,0x15,0x80,0x80,0xe1,0xb0, + 0x91,0x24,0xa1,0xe0,0xb9,0x8,0xf4,0x50,0xcd,0x84,0xb,0xc3,0x3e,0x47,0xdc,0x1b, + 0xfd,0xdf,0x29,0xb1,0xf4,0xc4,0x6,0xa8,0x1e,0xb4,0x57,0xad,0x80,0x7d,0x30,0xaf, + 0xbd,0x8d,0x82,0x24,0x13,0xa0,0x7c,0x96,0xee,0x3f,0xbb,0x34,0xd,0xa6,0x71,0xea, + 0xb1,0xe2,0x7b,0xf5,0xb0,0x86,0x7d,0x36,0xd7,0x3f,0x1f,0x70,0x34,0xf4,0x0,0xa0, + 0x67,0x2,0xf5,0x0,0x67,0x5c,0x87,0x6,0xd3,0xc2,0x5d,0xa1,0x45,0x10,0x59,0x7b, + 0xe9,0xb2,0x24,0xed,0xeb,0xed,0x97,0xc5,0xfe,0x27,0x98,0x1,0x53,0x78,0xd9,0x1f, + 0x45,0x9,0xca,0x90,0xbf,0xdf,0xc7,0x74,0x6,0xcf,0x5a,0xff,0x8e,0x8,0xea,0x99, + 0xcb,0xc1,0x92,0x8f,0x1d,0x48,0x81,0x48,0xa6,0xa6,0x1c,0xb0,0x45,0x46,0xdc,0xd7, + 0xf5,0xf5,0x23,0x9,0xde,0xbf,0xdb,0x13,0x4c,0xca,0xd9,0xe5,0xb9,0x17,0x64,0xed, + 0xf4,0xa0,0x98,0x99,0xc,0xed,0xee,0xde,0xdf,0x7c,0x79,0xf8,0x62,0xed,0x60,0x5a, + 0x99,0x30,0xe8,0xe9,0x73,0x7,0x5d,0xe0,0xb9,0xf6,0x48,0x2c,0x9e,0xef,0xb3,0xa3, + 0x12,0x52,0xa3,0xed,0x67,0xc0,0xaf,0x4f,0x5a,0x7b,0x95,0xba,0x7e,0xe5,0xbf,0xbc, + 0xd7,0xeb,0x5b,0x83,0xf6,0xac,0x92,0x90,0x4c,0x17,0x87,0x6a,0xa0,0x55,0x56,0xa, + 0x2f,0xc5,0x29,0xdd,0xe0,0x58,0x9,0xc,0x25,0xef,0x81,0x1e,0xe2,0x53,0x10,0x92, + 0x0,0xc3,0xac,0x3e,0x27,0x98,0x31,0x70,0x8c,0x6,0x35,0xc5,0xe1,0x58,0x13,0x14, + 0x7d,0x80,0x7b,0xad,0x52,0x3e,0xc1,0xd0,0x7,0xb4,0x1,0x99,0x4,0x55,0x7c,0xd6, + 0x0,0xa3,0x9f,0xa0,0xe4,0xf1,0x8f,0xd0,0x21,0x3a,0x43,0x1a,0x70,0xa8,0x94,0xca, + 0xa1,0x3f,0xbd,0xa7,0xad,0xbd,0x11,0xc9,0xb,0xb3,0xe5,0x12,0xd5,0x25,0xa2,0x92, + 0xe7,0x80,0xc6,0x20,0xd0,0x94,0xfb,0x7e,0x7c,0xdd,0x4e,0x9c,0x93,0x14,0xc5,0xec, + 0x24,0x20,0x68,0x62,0xf5,0x75,0x50,0x33,0x4a,0x7,0x46,0x79,0xe2,0x6b,0xe8,0x81, + 0x17,0x81,0xe7,0x0,0x19,0xd0,0x90,0x96,0xa7,0x33,0x2a,0xe,0xc8,0xa7,0x7e,0x5d, + 0x27,0x2b,0xda,0x3a,0xb9,0xb9,0xed,0x7a,0xe3,0xfa,0x88,0x86,0xf2,0x2a,0x12,0x85, + 0x40,0x9f,0xc9,0xa1,0x73,0x3,0x8,0xc,0xfa,0x54,0x3e,0xfd,0xb6,0x30,0x72,0x74, + 0x4d,0x7e,0x9e,0x43,0x8d,0x51,0x11,0x42,0xe0,0xcd,0xe7,0xa8,0x85,0xec,0x5,0xc4, + 0xf6,0x86,0x7e,0x46,0x7b,0xb6,0xd7,0x7a,0x7e,0xab,0x3a,0x21,0x64,0x89,0x3c,0xc7, + 0x3e,0xe4,0xa0,0xe7,0x50,0x39,0x7d,0x3d,0x13,0xdc,0xfb,0x80,0xe5,0x49,0xb7,0x1d, + 0xea,0xe0,0xfd,0x14,0x6b,0x5,0x93,0xcc,0xf4,0xb1,0xe,0xeb,0xe7,0xb6,0x70,0xb8, + 0xf6,0xfb,0xb3,0x1,0x9,0x4f,0x12,0x58,0xee,0x7d,0xb6,0xe,0x6e,0x5f,0x41,0xf2, + 0xbf,0x2,0x59,0xdf,0xfb,0x81,0xb6,0x25,0xb1,0xc2,0x1b,0xf2,0x37,0xd1,0xef,0xd2, + 0x73,0x6d,0xb4,0x5a,0x2f,0x61,0xff,0x5a,0x55,0x30,0x25,0x26,0x30,0x7e,0xdf,0xfe, + 0xdd,0xb8,0x7f,0xa,0x6,0x98,0x1e,0xfa,0xb1,0x2b,0xa0,0x95,0xc0,0xcc,0xfb,0xb7, + 0x42,0xc2,0x7,0xd6,0x75,0x2c,0x60,0xa8,0xf8,0x75,0x5d,0x80,0xff,0x6a,0x5b,0xdf, + 0x90,0x30,0x82,0x7e,0x8c,0xf1,0xa9,0x9c,0x9f,0xfb,0xe8,0xb0,0xb,0xee,0xd,0xb0, + 0xbb,0x40,0x88,0xe3,0x10,0x9e,0xe7,0xca,0x42,0x5e,0xfb,0x16,0x91,0x52,0xe1,0x80, + 0x1b,0xc2,0x1,0x4c,0xdc,0x51,0x3e,0x9f,0xc,0xac,0x42,0xaf,0x2,0x68,0x61,0xac, + 0x57,0xe8,0x18,0x2,0x6e,0x2b,0x8,0x29,0x50,0x79,0xd,0x95,0xf4,0xd0,0x5f,0x46, + 0x54,0xf6,0x60,0xeb,0xaf,0x78,0x25,0x54,0xe7,0x1e,0x72,0xf6,0xaf,0x31,0x54,0x5f, + 0x5a,0xb9,0x0,0xbd,0x2a,0x69,0x3d,0x94,0x44,0x10,0xe2,0xb3,0x18,0x48,0x0,0x10, + 0x95,0x1d,0x7,0xb8,0x1c,0x56,0xb5,0x40,0xab,0x68,0xa2,0x37,0x79,0x40,0xcf,0xee, + 0x33,0xb1,0xd1,0xdf,0x6f,0x88,0x1,0xa4,0x8a,0x49,0x48,0x51,0x36,0x38,0x87,0x7b, + 0x1,0xf8,0xcf,0x46,0xc0,0x61,0x79,0x2b,0x30,0x5,0xd2,0xbc,0xb7,0x88,0xa,0x71, + 0xff,0x1e,0x64,0xa5,0xac,0x95,0x25,0x12,0x56,0xc7,0xb0,0x14,0xee,0x8a,0x89,0x43, + 0xfb,0x5,0x9,0x33,0x3b,0xbc,0xa5,0xaf,0xb7,0x6c,0x99,0x30,0x78,0x10,0x4c,0xa8, + 0x7a,0x1f,0x62,0x18,0x70,0x4f,0xcd,0xa4,0x75,0x1d,0x1,0x18,0xe0,0x43,0x48,0xa1, + 0xfd,0xf5,0xf7,0x40,0x56,0x9b,0x68,0xb9,0xd9,0xfe,0xee,0xe7,0xa,0x2e,0xc9,0x69, + 0xbd,0x7c,0x24,0x2,0x1d,0xba,0xaf,0x8f,0x52,0xd,0x5b,0x25,0x26,0x9,0xde,0xe, + 0xb0,0xfa,0xdb,0x64,0x8b,0x5c,0xfe,0x5b,0xbd,0x6d,0xa9,0x6b,0xe,0xf6,0x67,0x5c, + 0xbf,0x20,0x2,0x36,0xf6,0xf5,0xc1,0xa1,0x94,0xfb,0xbd,0xf0,0xf7,0xdd,0xf7,0x6b, + 0x2f,0x7f,0x2e,0x44,0xe1,0x39,0xc4,0x1,0xca,0x6b,0xbc,0xda,0x65,0x4,0xfc,0x7d, + 0x0,0xd3,0xe1,0xd5,0xe7,0xb0,0x5e,0xff,0xeb,0xeb,0x1a,0x82,0x44,0xb0,0xb2,0x2a, + 0x7f,0xee,0x11,0x1a,0xda,0x1,0xab,0x8c,0xf7,0x81,0xcc,0xfc,0xed,0xab,0x12,0x94, + 0xbb,0xa1,0xf7,0xea,0xe9,0x5d,0x13,0x52,0x85,0xc6,0x7d,0xb3,0xea,0x15,0x92,0xb8, + 0xc4,0xef,0xc2,0xe,0xa0,0x9a,0x68,0x3f,0x48,0x1,0x9f,0x7b,0xcf,0x6b,0x57,0xe9, + 0xc3,0x96,0x53,0x48,0x99,0x59,0xd5,0x3f,0xeb,0x4f,0x8e,0x7c,0xb2,0x1c,0x82,0x5e, + 0xaf,0x87,0x3c,0xcb,0xb2,0x24,0xd1,0xea,0xe0,0x1,0x98,0x51,0x70,0x17,0xa5,0x9f, + 0xab,0xf8,0x3b,0xbc,0x8b,0xa1,0x49,0x43,0xec,0xb5,0xe7,0xbd,0x9a,0x84,0xe8,0xde, + 0x2,0x3b,0x4a,0x4b,0x85,0xef,0x5b,0xbb,0xb0,0x56,0xca,0x86,0x44,0xf7,0x4,0x25, + 0xdb,0xbf,0x52,0xce,0x4c,0x79,0xbe,0x5c,0xff,0x3f,0x90,0x86,0xfb,0x1d,0x97,0x55, + 0x99,0x46,0x58,0x88,0xa,0x96,0x1d,0xd1,0x5c,0xff,0x42,0x81,0x1,0x9,0xf,0x8e, + 0x3c,0x54,0x78,0x1c,0xfa,0xc1,0xeb,0x23,0x31,0x43,0xa5,0xad,0xd9,0x73,0xf7,0xba, + 0x10,0xd0,0x77,0x42,0xee,0xad,0xf7,0xb9,0xab,0x55,0xb4,0x2a,0x17,0x91,0x63,0xa0, + 0x41,0xee,0xc0,0x1c,0xb8,0x40,0x39,0x78,0xa5,0x5f,0xb3,0xf,0x5e,0x58,0x45,0xe2, + 0xc1,0x59,0xcf,0xb9,0x1,0xc2,0xcb,0xe0,0xaa,0x8b,0x4b,0x36,0x81,0x17,0xfb,0x68, + 0x68,0x72,0xe7,0x29,0xf5,0x4c,0x90,0x52,0xe5,0xe9,0x93,0x46,0xc0,0x61,0xbb,0x4a, + 0xcb,0x3e,0x1f,0xac,0xfb,0x34,0xf2,0x13,0x2a,0xa1,0x23,0xef,0xcd,0xef,0xdf,0xa4, + 0x3d,0xae,0x80,0x5a,0x23,0x14,0xc0,0x72,0x35,0x48,0xcd,0xe3,0xaf,0xca,0xdf,0xba, + 0xb6,0x10,0xfc,0x5a,0x1d,0xf4,0xcb,0xbf,0xdf,0x15,0x5f,0x5d,0xde,0x87,0xdb,0x21, + 0x4c,0xe1,0x53,0x46,0x55,0x2b,0x15,0x47,0xc1,0x10,0x71,0x64,0xdf,0x55,0x2,0xf6, + 0x57,0xd0,0xf2,0xdf,0xc6,0xe8,0xcd,0x69,0xf0,0x64,0xd0,0x5d,0x30,0xc0,0xcd,0x18, + 0x8,0x38,0xda,0xc7,0x7b,0xe,0x30,0x92,0x12,0xb2,0xb1,0xd6,0x29,0x2c,0x1,0xa0, + 0x7c,0xb4,0x6,0x1b,0xf,0x2e,0x4c,0x80,0x2a,0x2,0x1b,0x6a,0xe8,0x1e,0xd0,0x7b, + 0xc6,0xc4,0xfe,0xef,0xb3,0xf7,0x29,0xbf,0x1d,0x79,0x64,0xc8,0x7d,0x22,0x34,0x51, + 0xc2,0x8,0xb8,0x34,0x9a,0x80,0x42,0xf0,0xc8,0x9a,0x1d,0x76,0xdc,0x71,0x25,0x76, + 0xb5,0xaa,0xd7,0xf5,0xcf,0x12,0xa0,0xb3,0xbf,0xee,0xdd,0x43,0x49,0xc,0x57,0x55, + 0xbb,0x13,0x5e,0xea,0x77,0x1b,0x88,0xa,0x43,0x6c,0x10,0xad,0x3,0x18,0xdd,0x23, + 0x12,0x56,0x39,0x53,0x0,0xb6,0x1d,0x46,0xf6,0x56,0xc5,0xa,0x3f,0xf4,0x5f,0x81, + 0x95,0x98,0x50,0x60,0x66,0x3f,0x57,0x1e,0xe4,0xad,0x15,0x6d,0x6d,0x47,0x25,0xcc, + 0x9c,0xc4,0xb1,0x84,0xe9,0xe5,0xf5,0x97,0x20,0xc4,0xfa,0x1a,0x3d,0x5b,0xac,0x5d, + 0xc1,0xf1,0xde,0x65,0xf2,0x56,0x96,0x4,0x63,0xe8,0x34,0xc9,0xde,0xbf,0xf6,0xde, + 0xf3,0xc4,0x3e,0x8,0xbf,0xc3,0xbd,0xd5,0x73,0x3,0x96,0xa8,0x46,0x82,0x83,0xaa, + 0xb7,0x8a,0xec,0xa9,0x73,0xc6,0xd0,0xfb,0xba,0xab,0x5f,0x81,0x11,0x22,0x43,0x64, + 0x2c,0xd,0x6e,0x3d,0xf6,0x4d,0x36,0x94,0xf6,0x54,0xf4,0x50,0x68,0x8c,0x1,0x8, + 0xe8,0x1,0x8a,0x7b,0xb1,0x9,0xf4,0x6f,0xd9,0x9e,0x1c,0x66,0x94,0x9e,0x26,0x23, + 0x12,0x7c,0xbd,0xf6,0xd2,0xee,0xc5,0x82,0xcb,0x56,0xc5,0xb0,0x98,0x9e,0x6c,0x7, + 0xeb,0xdc,0xbb,0x4e,0x18,0xcd,0x39,0x53,0x23,0x8c,0x35,0x31,0x9b,0xf5,0xe8,0x45, + 0x7,0xdf,0x57,0x68,0xc8,0x40,0xa5,0xdf,0x10,0x30,0xab,0xc1,0x95,0xfa,0x54,0x31, + 0xac,0x83,0x5,0x3b,0xb,0xeb,0x33,0xae,0xff,0xeb,0x6f,0xbd,0xbf,0x85,0xcb,0xa1, + 0x7c,0x85,0x93,0x8d,0x28,0x2d,0x89,0x4d,0x83,0x53,0x49,0x83,0x66,0x41,0x9f,0xbe, + 0x78,0xa0,0xd4,0x5,0x97,0x45,0x7d,0xbb,0xef,0xd5,0x5e,0x54,0x9,0xd0,0x90,0xde, + 0x67,0xa4,0xb4,0x29,0xa0,0xd5,0x14,0x76,0x86,0xe,0x96,0x41,0xcb,0xf,0x44,0x4e, + 0x62,0x20,0x19,0x79,0x6b,0x3,0x72,0x30,0x5b,0x2,0x49,0xa9,0x72,0xe8,0x70,0x21, + 0xa3,0xa9,0x8b,0x8d,0x45,0x1a,0x18,0xd6,0xe0,0xbc,0x42,0x4b,0x28,0xb4,0x4b,0xb1, + 0xf6,0x9d,0x2d,0x9e,0x80,0x16,0x83,0x5c,0xaa,0xeb,0x6,0xd1,0x9f,0x64,0xd,0x40, + 0x4d,0xae,0x49,0x8,0x14,0xce,0xcd,0x3,0x70,0x6,0x6f,0xe7,0x18,0x28,0xad,0x67, + 0xad,0xf9,0x5,0xa3,0xd2,0xde,0x56,0x70,0x88,0x7c,0x27,0x9c,0x6c,0xbc,0x57,0x3f, + 0xab,0x5,0xbc,0x95,0x36,0x18,0xd,0x83,0xd8,0xd5,0x30,0x6c,0x85,0xc5,0x77,0x36, + 0xb4,0x26,0x76,0x2c,0x22,0x10,0x82,0x16,0xe,0x3d,0x46,0xcc,0x69,0xaa,0xb6,0x9, + 0xfc,0xbb,0xf7,0xa2,0xa0,0x75,0xb3,0xfc,0x4c,0x58,0x7b,0x8,0xf5,0x85,0x28,0xe6, + 0xa4,0x92,0x77,0x3e,0xe4,0xd6,0xee,0x27,0xda,0x10,0x44,0x70,0xaf,0x71,0xfa,0x1a, + 0x6c,0x49,0x44,0xe,0x46,0x3d,0x7b,0xcc,0x2,0x13,0x5b,0x40,0x5,0xf3,0xc0,0x1a, + 0x20,0xf6,0x86,0x79,0x4b,0x45,0x6c,0x44,0xe9,0x3c,0x94,0x31,0x9c,0xcb,0x35,0x12, + 0xf5,0xa3,0x7f,0x54,0xc5,0xeb,0x38,0x5c,0x91,0xa0,0x9e,0xa1,0xb6,0x13,0x55,0x4a, + 0xd7,0x36,0xe2,0x2,0x48,0x79,0x30,0xb8,0x3,0x3a,0x6,0x36,0x22,0x39,0x4c,0x64, + 0x41,0xb7,0x50,0x64,0xa7,0xdc,0x30,0x45,0x84,0x8,0x4c,0x4,0xf3,0xfc,0xf7,0xeb, + 0x39,0x54,0x3c,0xe0,0xd9,0xd2,0xc6,0x90,0x97,0x49,0x45,0xb6,0xfa,0x5e,0x31,0xba, + 0xc1,0x9a,0x89,0x6e,0x9a,0x41,0xb2,0xe6,0xfe,0x3f,0xef,0x5,0xce,0xb5,0xe8,0x9f, + 0x2a,0x9e,0x1,0x2b,0xd6,0x14,0x16,0x25,0x28,0xdd,0xef,0x80,0xb2,0x68,0x9f,0xca, + 0x8c,0x2,0xcb,0x70,0x57,0x76,0xda,0x87,0xe4,0xbe,0xd7,0xc9,0xd5,0xdb,0x13,0x63, + 0x7b,0x95,0x41,0xc6,0xbd,0xc,0x4a,0xa6,0x1f,0x1c,0x24,0x56,0x8f,0xc,0xc1,0x5e, + 0x45,0xb4,0x5b,0xa8,0xe8,0xc3,0xfa,0x78,0xae,0xe4,0xa,0xd4,0xea,0xda,0x3b,0x33, + 0x59,0x89,0xc5,0xa3,0xdc,0x9f,0x6d,0x44,0x2e,0x39,0xf0,0x34,0xb6,0x71,0x27,0x74, + 0x23,0xf4,0xb,0x39,0xc,0x99,0xc7,0x39,0x2,0x0,0xdf,0xcf,0x74,0x77,0x50,0x20, + 0xfd,0xeb,0x24,0x7d,0x7b,0xd2,0xc8,0x3c,0x54,0xaa,0xbe,0x80,0x2f,0x4,0x27,0xa0, + 0x60,0xd0,0xdd,0x94,0xd6,0xee,0x9c,0x17,0xd2,0x67,0x67,0x1,0x97,0x40,0xaf,0x1a, + 0x88,0xd0,0x47,0x35,0xe3,0xb0,0x76,0x14,0xac,0x5d,0xb0,0xe5,0xd9,0x18,0x98,0xd4, + 0x2d,0x7,0xbf,0xd7,0x17,0x15,0x81,0x41,0xef,0x19,0xa3,0xf5,0xb1,0x25,0xc0,0xb0, + 0x4f,0x20,0x0,0xfe,0x5e,0x47,0xe8,0x86,0x56,0x1c,0x7c,0x97,0x31,0xc6,0x8b,0xa, + 0xde,0x23,0xa6,0x62,0x11,0x43,0x7f,0x13,0x36,0x66,0x28,0x21,0x1b,0x3a,0xd1,0xa, + 0xa7,0xb7,0x44,0xff,0x99,0x8a,0x0,0x4d,0x63,0x6a,0xb8,0x51,0xe,0x20,0x26,0x49, + 0xb3,0x9a,0x42,0x8c,0x3d,0xe,0xd9,0x7f,0x4e,0x8b,0xb1,0x57,0x73,0xd9,0x5a,0x84, + 0xd1,0x68,0xd0,0x2,0x7,0x30,0x40,0x13,0x35,0xd,0x23,0x5d,0x92,0x1c,0x65,0x12, + 0x38,0xa1,0x6f,0x7b,0xed,0x76,0xa,0xa,0xe2,0x1c,0x9,0x40,0xd5,0xce,0x6d,0x9c, + 0xd7,0xb5,0x71,0x68,0x78,0x1c,0xa8,0x6e,0xd,0x6c,0xb0,0xb5,0x48,0xed,0x60,0x6a, + 0xe0,0x72,0x70,0xba,0x90,0xc4,0xf1,0x32,0x2,0x39,0x84,0xb7,0xc1,0xa9,0x40,0xe3, + 0xbc,0xbf,0xf6,0x9,0x45,0x69,0xf1,0x64,0xc,0x66,0x2c,0x9,0xd6,0x5b,0xd4,0x16, + 0xbd,0x2a,0x5d,0xcc,0x3a,0x8e,0xc,0x1b,0x92,0xc1,0x7b,0x42,0x9f,0x65,0xbe,0x37, + 0x31,0xa3,0xf4,0xcb,0xd1,0xef,0xb6,0xc9,0xee,0xef,0xa1,0xcc,0x31,0xc2,0x4b,0x5a, + 0xef,0xab,0xa2,0x7c,0xe3,0x6a,0xf5,0x9c,0xed,0x5b,0xcb,0xa9,0xd1,0xfb,0x2a,0xb6, + 0x46,0x9e,0x4a,0x4c,0x9,0x2e,0x90,0xf5,0xe3,0x87,0x75,0x3,0x11,0x65,0x3e,0xb4, + 0xf5,0x64,0x94,0xb2,0xd3,0x36,0x37,0xfa,0x28,0x6a,0x3f,0x23,0x6c,0xc1,0x67,0x32, + 0xa1,0x9f,0xd1,0x27,0x90,0xa4,0xc7,0x2a,0x23,0x2f,0xce,0x77,0xdb,0xcf,0x3b,0x89, + 0x19,0x5f,0x90,0xf3,0x25,0x93,0x8d,0x6c,0x77,0x7e,0x11,0xda,0x1e,0xe2,0xf,0x37, + 0xf3,0x13,0x36,0x65,0x3,0xb,0x24,0xda,0x42,0xd8,0xf4,0xa,0x7c,0x55,0xea,0x16, + 0x5c,0x6b,0x80,0xca,0x1c,0xc2,0x72,0x20,0x2e,0xc6,0xb9,0x22,0x70,0x6b,0x75,0xc6, + 0x40,0x55,0x0,0x44,0x95,0xd6,0x5a,0xf7,0xab,0xc7,0xb5,0xa0,0x3e,0x32,0xd9,0x33, + 0x9d,0x80,0xd5,0xe8,0x8e,0x6c,0x41,0x16,0x99,0xde,0x26,0xab,0xe6,0xd2,0xa,0x6, + 0x27,0xae,0x5d,0xfb,0x7e,0xb4,0xd3,0x4e,0xda,0x4a,0x6c,0xd8,0x46,0x63,0x14,0xd0, + 0x50,0x93,0x7e,0xa5,0x95,0x7d,0xc8,0xc6,0x3f,0xd,0x56,0x7d,0x83,0x8,0xd1,0xe, + 0x56,0xe4,0x8f,0x1b,0x3e,0xbf,0x6,0x4,0x48,0x9a,0xd4,0xd5,0xe7,0xba,0xfb,0x94, + 0x4a,0x9e,0xf1,0xe0,0x9,0xb9,0xac,0x2,0xaf,0xfb,0x20,0xd6,0xc0,0x71,0x65,0xd6, + 0xea,0xfd,0xd5,0x72,0xce,0xd2,0x54,0x1,0x2a,0x57,0xa6,0xcb,0x7f,0x40,0x90,0x82, + 0x1d,0x60,0x16,0xba,0x64,0x5,0x8e,0x93,0x2d,0x47,0x62,0xb0,0x20,0x11,0x6d,0x9c, + 0xbd,0x2a,0x26,0x84,0xfc,0x41,0x39,0x3,0x9b,0xd,0xe9,0x49,0x24,0x81,0x39,0x22, + 0x8a,0x8,0xc3,0xd1,0x4f,0xa6,0xa6,0x85,0xa3,0x64,0x81,0x4f,0x4e,0x3c,0x44,0x3d, + 0xc4,0x74,0x27,0xa4,0xa4,0xee,0x89,0xfe,0x94,0x90,0xec,0x64,0x93,0x41,0xf6,0xd5, + 0x76,0x47,0xa3,0x4b,0xae,0x1,0xad,0xa9,0xca,0x97,0x8,0x5,0x4a,0xc,0xf3,0x82, + 0xf9,0x41,0x2d,0x17,0x7a,0x29,0xe7,0x1e,0xd9,0x3f,0xb3,0x50,0xf5,0xb6,0xd7,0x30, + 0x5b,0x6f,0xc6,0x82,0x41,0xed,0xa,0x95,0x88,0x90,0xc9,0x80,0xd7,0x15,0xf,0xe4, + 0xa6,0xdc,0xb7,0xc9,0xa1,0x29,0x3b,0xb4,0xb5,0x7e,0x7,0x8b,0xc6,0xba,0xc4,0xc, + 0x5f,0xcb,0x35,0x7a,0xa6,0x3e,0xb7,0x8f,0xad,0x8a,0x5c,0xe8,0x80,0xdc,0xd4,0xa7, + 0x72,0x65,0xd,0x64,0x33,0x38,0xfb,0x15,0x68,0x63,0xd0,0x1b,0xda,0x82,0x43,0x68, + 0x2,0x2d,0x7a,0xdf,0x95,0xe,0x91,0x46,0xb5,0x45,0xab,0x3e,0x3,0x6a,0x46,0xcf, + 0xdc,0x1a,0xc3,0x37,0x2,0xa7,0x1,0x60,0xca,0xb4,0x8d,0xac,0x81,0xf0,0x4e,0xab, + 0xd7,0x3c,0xc2,0x1c,0xae,0xa8,0x9a,0x93,0x80,0x94,0xa8,0x83,0xcd,0xaa,0x57,0x10, + 0x8d,0x68,0x55,0x52,0x19,0x41,0xa8,0x56,0x0,0x4b,0x6e,0xb0,0x26,0x42,0x4d,0x7b, + 0x62,0xa4,0x6c,0x77,0xa6,0xea,0x9a,0xb,0x5e,0x2d,0x2,0x27,0xe3,0xa1,0xe,0xa9, + 0xbf,0x21,0x23,0xc3,0xeb,0xc7,0x80,0xd6,0x5a,0xec,0xb,0xa6,0x2c,0xd6,0x3c,0xef, + 0x8d,0xfe,0x1d,0x5f,0x7f,0x77,0x79,0x4b,0x66,0xd2,0x31,0xba,0xff,0xf2,0x9a,0x44, + 0x3c,0x4e,0x7,0x1b,0xbf,0x82,0x53,0xab,0xfc,0xd9,0xb8,0x42,0x7e,0x64,0xb1,0x3c, + 0xf9,0x68,0x63,0x8b,0x27,0x5d,0x88,0xc8,0x2a,0x27,0x61,0x1c,0xad,0x8c,0x30,0x40, + 0x93,0xd3,0x7d,0x22,0x87,0xaf,0x1c,0xa2,0x35,0xb4,0x52,0x72,0xdc,0x80,0x49,0x12, + 0xae,0x1c,0x4d,0xe2,0x30,0xa9,0x82,0xc5,0x6,0x57,0x16,0x76,0xad,0xa0,0xbb,0x7b, + 0xf0,0x56,0x8c,0xc7,0x73,0x69,0x83,0x37,0x60,0xfc,0x3b,0x5a,0xa1,0xe4,0xed,0x41, + 0x9,0x4a,0xda,0x8a,0x88,0x11,0x30,0x94,0x9f,0x85,0x8c,0xfb,0xd8,0xa6,0x2a,0xda, + 0xf2,0xc6,0xb0,0x94,0x58,0x99,0x5a,0x67,0xab,0xa2,0x9d,0xa5,0xd1,0x66,0x92,0xa5, + 0xd8,0xb7,0x5f,0x16,0x53,0xcf,0x3c,0x3a,0x5d,0xcb,0x6c,0x5,0x48,0x45,0x5b,0x64, + 0x2a,0x83,0xe5,0xfb,0x6e,0x1f,0x4f,0xc3,0x3c,0xbf,0x8a,0xcd,0xd4,0xe6,0x8,0xa4, + 0x2e,0x52,0x7c,0x64,0xe8,0xdb,0xe4,0xba,0x82,0xd3,0xcc,0xc,0x35,0x65,0xd3,0x5d, + 0xda,0xf5,0xd6,0xd7,0x3f,0x5c,0x5f,0x17,0x77,0x15,0x78,0xad,0x7,0xe7,0x54,0x4, + 0x4,0x3f,0x7,0x6d,0x4,0x56,0x89,0x27,0x28,0x18,0xd3,0xf4,0x21,0x86,0x30,0x99, + 0xcd,0x71,0x10,0x33,0xc7,0x8d,0x57,0x25,0xa2,0xa4,0x37,0x48,0xc6,0x23,0x63,0xe, + 0x89,0xa2,0x4,0x73,0x13,0xc1,0xc,0x6b,0xd5,0x15,0x64,0x1,0xeb,0x98,0x71,0x5, + 0xa9,0x2c,0x72,0x69,0x44,0xb5,0xa7,0x5c,0x44,0xe3,0x89,0xdd,0x9c,0x3,0x22,0xd8, + 0xef,0xa5,0x50,0xa,0x8d,0x64,0xc4,0x60,0x2f,0x96,0x41,0x9c,0xc3,0x81,0x1e,0xc, + 0x65,0x9f,0x51,0xac,0xca,0x3b,0xee,0x7c,0xbb,0x10,0x57,0xc0,0xdc,0x17,0xf5,0xd9, + 0x58,0x38,0x94,0xbc,0x44,0x12,0xd8,0xb3,0xb4,0x81,0x1d,0xf,0xfd,0xa8,0x10,0x56, + 0xd8,0xec,0x57,0x44,0xa5,0x9a,0xf3,0xc4,0x68,0x90,0xf0,0xea,0x6d,0x23,0xe0,0xd4, + 0x69,0xa6,0x1a,0x18,0x49,0xfb,0x8e,0x2e,0x5d,0x4e,0xdc,0xc8,0xd7,0x1a,0xa,0x15, + 0x3d,0x44,0x56,0x17,0xe1,0x41,0x10,0x3b,0x9b,0x8,0xc,0x7a,0xdf,0x94,0x3,0x21, + 0x94,0xfd,0xde,0xb7,0xf9,0xfb,0x3,0xe1,0xd0,0x98,0xb5,0x3,0xfd,0x66,0x9c,0xbc, + 0x26,0x6b,0x18,0x3c,0x36,0xb6,0x2f,0x52,0xd5,0x4a,0x27,0x17,0x84,0xa5,0xbd,0x18, + 0xeb,0x94,0xbd,0x9a,0x82,0x51,0x31,0xbf,0xbe,0x13,0xcf,0x1a,0x7a,0x4,0xce,0x44, + 0x77,0xf2,0xe3,0xa0,0x6b,0xa1,0x67,0x4c,0x26,0xbe,0x39,0x97,0xae,0xbf,0xb,0x74, + 0x32,0x2d,0x90,0x35,0x52,0x67,0xe3,0xc9,0xc2,0x44,0xf9,0x14,0x9,0x64,0xde,0x1d, + 0xad,0x8d,0x70,0x28,0x1a,0x23,0x79,0x52,0xce,0x2,0x1a,0xff,0xc5,0x99,0xe3,0x29, + 0x7b,0xb2,0xcf,0xb7,0xc3,0x24,0x7,0x76,0x92,0x80,0x89,0xc3,0x6b,0x4b,0x18,0x73, + 0x67,0x64,0x5d,0xd5,0xd5,0xce,0x5,0x8,0xc7,0x8f,0x75,0x6d,0x76,0x3d,0xc6,0x7a, + 0xc0,0xda,0xb6,0x1c,0xaa,0x69,0xd8,0x3c,0x8,0x36,0xaa,0xc6,0x98,0x62,0x1d,0x18, + 0xf3,0x8b,0x85,0x4e,0x8f,0x17,0x26,0x1f,0x0,0xda,0xb7,0x7c,0xc9,0x70,0x8,0xa1, + 0x6e,0x38,0x4e,0x7c,0x12,0x25,0x34,0x19,0xca,0x49,0x48,0x30,0xcd,0xf,0x84,0x10, + 0xe,0x9d,0x48,0x19,0x49,0xc4,0x42,0x92,0xf1,0xf6,0x47,0x7f,0xfc,0x82,0x2,0xdd, + 0xd2,0x8c,0xec,0x5b,0x2a,0x1,0x1c,0xa3,0xcc,0x64,0x64,0xc8,0x4d,0x2,0xd2,0xc5, + 0x5d,0x28,0x44,0x8a,0xa,0xc8,0x7d,0x66,0xc,0x44,0xa6,0x9c,0xa4,0x88,0xe2,0x41, + 0xe,0xf4,0x95,0x1e,0xdf,0xd4,0xaf,0x83,0xdc,0x3,0x51,0x5c,0x1a,0xe,0xb9,0xfe, + 0x7e,0x47,0xb8,0x66,0x25,0xa6,0x49,0x2e,0x34,0xfa,0x47,0x83,0xb4,0x64,0x4e,0x1a, + 0x36,0x28,0x36,0xc9,0x45,0x89,0xe8,0x4d,0xdf,0x27,0xf0,0x20,0x53,0xaa,0xb3,0x55, + 0x22,0x7c,0xad,0x24,0x2a,0xdf,0xdd,0x6e,0x57,0x8e,0xed,0xf1,0x86,0xa0,0xb4,0xb, + 0x2b,0x3,0xd1,0x30,0xbe,0x42,0x90,0xcc,0x10,0xbf,0x83,0xfa,0xb9,0x41,0x52,0x8c, + 0x9e,0x57,0xb6,0x9,0xb4,0x1,0xd5,0x3e,0xcb,0x68,0x51,0x4e,0x9a,0xe2,0x20,0x7f, + 0xd0,0x24,0x6b,0x5f,0x11,0x20,0xa7,0x85,0xf3,0x6a,0x79,0x4a,0xc5,0x1a,0xa9,0x94, + 0x71,0x3c,0xa6,0x7f,0x4f,0x45,0x67,0xe5,0xb7,0xf3,0xb8,0x37,0x7c,0x2f,0x8d,0x5b, + 0x5c,0x5b,0x29,0xc1,0xf1,0x61,0x20,0x12,0xac,0xfa,0x4e,0x7b,0xb0,0x9f,0x37,0xcf, + 0xda,0xf8,0xe,0x5b,0xd7,0x5a,0x59,0xe,0xdd,0x4e,0x17,0xc1,0xe9,0xbd,0xdc,0x30, + 0x2e,0x6,0xe1,0xc8,0xfc,0x67,0xb6,0x3d,0x3a,0xa1,0x89,0x4e,0xc6,0x4b,0x4e,0x84, + 0x7f,0x2e,0xa2,0x62,0x8f,0x33,0x72,0xbd,0x86,0x86,0xe,0x3a,0xfd,0x0,0xab,0x3d, + 0x4a,0x42,0xb8,0x35,0x73,0x2b,0xc6,0xc9,0x94,0x8c,0x1a,0x9a,0x83,0x5c,0x3,0x82, + 0xc4,0x2a,0x82,0x40,0x15,0x8a,0xbc,0xb2,0xaf,0xc,0x84,0xa,0xed,0x8b,0x87,0x6f, + 0x40,0x8d,0x1d,0x60,0x9b,0x23,0xb7,0xb3,0x59,0xd1,0x4f,0x8d,0x29,0x86,0x2b,0x6, + 0x57,0x8d,0x3,0xb8,0x52,0x35,0x2f,0xc,0xf8,0x9,0x31,0xb5,0xcc,0x26,0xc5,0xda, + 0x69,0x75,0xbd,0x52,0xb3,0xad,0x57,0xa8,0xf2,0x8b,0x48,0x6,0xbc,0xfd,0x7,0x3f, + 0xfe,0xa6,0x56,0xee,0x69,0xb7,0x1c,0x37,0x63,0xea,0xbf,0x1f,0x36,0xec,0xab,0x20, + 0x30,0x9d,0x18,0xa7,0x83,0x3b,0x21,0xb3,0x97,0x92,0xc9,0x18,0xc6,0xe1,0x7c,0x2e, + 0x7c,0xd2,0x29,0x5e,0x7,0xfc,0x44,0x73,0x6c,0x52,0xa4,0xd3,0x63,0xed,0xac,0x5b, + 0x3b,0x6c,0x39,0x11,0x55,0xe6,0x80,0xd2,0x55,0xd,0x86,0xb9,0x7a,0x9,0xb8,0x90, + 0x76,0x82,0x77,0x8e,0xa4,0x27,0x5d,0x15,0xaf,0x1b,0x8,0x1e,0xa0,0x6f,0xea,0xef, + 0xf4,0x30,0x7b,0x90,0xd1,0x23,0xa2,0x82,0xcf,0xcb,0xc3,0x7b,0x12,0x1b,0xf1,0x20, + 0xe6,0xa3,0x5f,0xd3,0xb4,0xa3,0xea,0x16,0x9d,0x96,0x6d,0x45,0xce,0xb4,0xee,0xdd, + 0x77,0x58,0xee,0xaa,0x55,0x8d,0x43,0x3e,0x35,0xd9,0x4,0x14,0xcf,0x21,0x7c,0x56, + 0xfe,0xf,0x32,0x4c,0x6,0x94,0xe4,0xa4,0x60,0x68,0x69,0xa6,0x4,0x82,0x36,0x6b, + 0x2c,0xc7,0xde,0xb0,0x39,0xcb,0x55,0xb7,0xfc,0x7c,0xbb,0xfb,0xa2,0x2c,0x13,0x78, + 0x49,0x89,0x76,0xa3,0x2b,0x3d,0x87,0xf2,0x13,0x64,0x87,0xad,0x44,0x63,0xc1,0x2b, + 0xfb,0x99,0xdd,0x8a,0xe1,0xd1,0x7b,0xb0,0xe0,0xe9,0xf,0x74,0x4f,0xb9,0x30,0xa4, + 0x46,0xe5,0x78,0xa6,0xac,0xb7,0xb5,0xbd,0x28,0xd0,0xaf,0xee,0x37,0x6e,0xf8,0x96, + 0x1b,0x89,0xc3,0x14,0xf8,0xd6,0xe7,0xef,0x49,0x8b,0x36,0xf,0x30,0x9c,0xda,0x34, + 0x5c,0x70,0x6e,0x25,0xb1,0x8e,0x4e,0x18,0x7b,0x42,0x4,0x51,0x88,0x51,0x66,0x99, + 0xe9,0x4c,0x7c,0x6d,0x4b,0x2b,0x1c,0x8f,0x81,0x20,0x3b,0x5f,0x83,0x4f,0x3,0x9c, + 0x92,0xd3,0x97,0x25,0x56,0xec,0xd7,0x31,0xb8,0x45,0x4e,0x96,0x42,0x80,0x53,0xe1, + 0x34,0xa6,0xab,0xc3,0x6b,0x79,0x68,0x2c,0xb4,0x50,0x85,0x1e,0x7a,0x5a,0xcb,0x8b, + 0xdf,0x4a,0x5c,0x4f,0x1e,0x28,0xe8,0x8,0x13,0x63,0x7e,0x7,0x3e,0xa2,0xf1,0xe6, + 0x30,0x8,0x5b,0x6b,0x6b,0xda,0x18,0x27,0xe5,0x33,0x90,0xc2,0x4d,0x80,0x8d,0x8, + 0xcd,0xa3,0x5c,0x91,0xe2,0x2a,0xf4,0x1c,0xf2,0x3f,0xaa,0xbc,0x65,0x84,0xd,0x1d, + 0xa1,0xa3,0xf7,0x2,0x16,0x73,0xd2,0xe6,0x1c,0x55,0x96,0xb6,0xf7,0x92,0x58,0xd5, + 0xc9,0x1d,0x56,0x15,0xd,0x83,0x7d,0xc1,0xb8,0xe6,0xc,0x92,0x5,0xbb,0x96,0x6, + 0xd2,0xd7,0x28,0xc6,0x87,0xa1,0xe2,0x46,0x1b,0x75,0x53,0x82,0x45,0x9,0x61,0xe2, + 0x9,0xc0,0x5d,0xe9,0x4a,0x47,0xdc,0xe4,0xb,0xaf,0x53,0x0,0xc3,0x8d,0x3c,0x43, + 0x2,0x2,0xc6,0x25,0x3f,0x4d,0x19,0x24,0x44,0x3c,0x12,0xc2,0xa6,0x65,0x82,0x60, + 0xda,0xde,0x3d,0x62,0x65,0xfb,0xd7,0x90,0x79,0x8f,0x67,0x24,0x4b,0xc6,0x22,0x69, + 0xc5,0xfb,0x94,0x3f,0x7f,0xbd,0xf6,0x6a,0xc1,0xb3,0x8c,0x4,0xb9,0xab,0xc4,0x35, + 0xfa,0xb5,0x12,0xbf,0x1d,0x0,0x21,0xfa,0xf3,0xa8,0x1c,0xcf,0x12,0x16,0x30,0x77, + 0xe0,0x64,0x54,0x6b,0x63,0x79,0x4e,0x2f,0x2f,0xa0,0xa4,0x99,0xf5,0x76,0x6e,0xe2, + 0xe6,0x82,0x2e,0x37,0x3,0x77,0x5f,0x9,0x65,0x86,0x79,0x5f,0xcf,0x82,0x96,0xe9, + 0xdc,0x9a,0x45,0x14,0x8a,0xdf,0xb5,0x82,0x0,0x21,0x33,0xf0,0x43,0x7f,0x52,0x67, + 0xeb,0xb3,0x52,0x6d,0x0,0xb0,0x33,0xf2,0x19,0xa2,0x41,0xb4,0x2e,0x4,0x8d,0x78, + 0xb6,0x20,0x69,0x38,0xf,0xc5,0x97,0x26,0x62,0xb9,0x25,0xf9,0xf0,0x49,0x50,0x2, + 0xf5,0x50,0xc9,0x50,0x54,0xab,0xc5,0x90,0xc4,0xb9,0xa,0x7e,0x4f,0xae,0x5d,0x9c, + 0x61,0xf6,0xad,0x9a,0xf6,0xa,0xbf,0x19,0xcf,0xfe,0x5d,0xe5,0xea,0xb1,0x2d,0x1, + 0x9e,0xf,0x3f,0x2,0xf3,0xfe,0x63,0xc0,0x39,0x49,0xa,0xed,0xc5,0xba,0x4f,0x97, + 0x74,0x83,0x2f,0x1f,0xb1,0xd5,0x64,0x6b,0x6f,0xa8,0x43,0xa9,0x80,0x4d,0x32,0x76, + 0xc5,0xe1,0x41,0x81,0x14,0x6c,0x1c,0xc,0xd4,0x94,0xf1,0x96,0x17,0x85,0x44,0x48, + 0xea,0xa3,0x27,0xc8,0xd1,0x7a,0xb1,0x35,0xab,0xd3,0x24,0xaf,0xf8,0x29,0x2d,0xd7, + 0x99,0xd4,0x38,0x93,0x66,0xf,0x97,0x69,0x8e,0x62,0xf2,0xad,0x5,0xa8,0x26,0xaa, + 0x4f,0xbf,0x19,0xa6,0xec,0x7,0xa3,0xcc,0xfb,0x7b,0xbb,0x7a,0x9b,0x6d,0xc2,0x4b, + 0x63,0x37,0x86,0xaa,0x87,0x36,0x33,0xa9,0x1,0x44,0x49,0x79,0x56,0x33,0x5c,0x25, + 0x73,0x91,0xae,0x9c,0x35,0x8a,0xa8,0xa2,0x7,0xb9,0x7d,0xb,0x30,0xc0,0x89,0x30, + 0xb2,0xa0,0x2e,0x5e,0x4c,0x44,0xbf,0x3,0x68,0xa0,0xcc,0x78,0x63,0xc9,0x37,0xf7, + 0xa4,0xa,0xf7,0x20,0x8c,0xb0,0xcb,0xfe,0x7d,0xd7,0xaa,0x52,0xd0,0x31,0x47,0xc9, + 0x77,0x30,0xf2,0x8f,0x8a,0x97,0xcc,0xd5,0xb2,0xa3,0xea,0x8c,0xba,0x38,0xf7,0x90, + 0xac,0x13,0x6a,0x52,0xa7,0x1,0x20,0xba,0x2f,0xa0,0x12,0xc1,0x94,0x64,0x84,0x40, + 0x6,0x7a,0x9b,0x46,0x67,0x98,0xed,0xf3,0xe1,0xdd,0xbb,0xfd,0x98,0x18,0x73,0xf7, + 0xcf,0xc1,0x47,0xa9,0xfc,0x62,0x56,0xdc,0x88,0x33,0x8e,0x49,0x52,0x11,0x90,0x65, + 0xb0,0x51,0x9d,0xb5,0xb,0x84,0xa4,0x8d,0x54,0x75,0x77,0x20,0x7d,0x82,0x28,0x92, + 0xb7,0x12,0x7,0x96,0x56,0xad,0x36,0xa1,0x10,0xad,0x2e,0xa4,0x96,0xb8,0x8d,0x9a, + 0x89,0xbc,0x24,0xd8,0x89,0x99,0xc3,0x4c,0xf9,0xea,0xf7,0x56,0x8c,0x1c,0x21,0xd2, + 0x33,0xe3,0xc9,0x54,0x23,0x4a,0x1e,0x15,0x95,0xf5,0x3f,0x17,0x5a,0x9,0x8a,0xc6, + 0x3a,0xae,0xc1,0xd7,0x46,0x45,0x58,0xf8,0xb2,0x89,0xd1,0x44,0x22,0xd7,0x5a,0xbf, + 0x5a,0x3d,0xfa,0x70,0x29,0x16,0xd0,0x4a,0x5a,0x67,0x5a,0xe1,0x5,0x88,0x6e,0x41, + 0x7,0xff,0x1e,0x14,0xa1,0xc6,0x31,0xef,0x97,0x83,0xce,0x3c,0x9c,0xf,0x72,0xe, + 0x65,0x5b,0x12,0x81,0x8b,0x38,0x2b,0x7e,0x67,0xb4,0x68,0xb2,0xdd,0xb5,0x83,0x6, + 0x43,0x1c,0xb3,0xe0,0xb0,0xf9,0x42,0x27,0x92,0xfa,0x90,0xb0,0x90,0x13,0x10,0xd1, + 0xa4,0xae,0x87,0x5e,0xd0,0xd7,0x0,0xa8,0x24,0x26,0x31,0x11,0x61,0x9,0x97,0x9c, + 0x6d,0x29,0x47,0x3d,0x49,0x79,0x37,0x8b,0xb6,0xea,0xd7,0x8b,0x3,0x54,0x9d,0x23, + 0x81,0x1a,0x7,0xa0,0xbd,0x7e,0x1c,0x6a,0xfe,0x3a,0x70,0x8b,0xf2,0x3c,0xf,0xf2, + 0x40,0xf4,0xff,0x39,0x4c,0x11,0xbc,0x61,0x60,0x1d,0xd2,0x92,0x4,0x67,0xef,0x29, + 0x57,0x88,0xec,0xc,0xcb,0x6a,0x15,0x1c,0x66,0xd4,0xa1,0x69,0x3,0xef,0x83,0xcb, + 0x7,0xce,0xd0,0x21,0x98,0x16,0x48,0x30,0x3b,0xb6,0xae,0xca,0x64,0x68,0x92,0xb0, + 0x69,0x0,0x6e,0xe9,0x7a,0xdd,0xa3,0xca,0x76,0xd7,0x8e,0xe7,0xa9,0xe1,0x71,0x50, + 0x2b,0xb1,0x44,0x40,0x36,0x1e,0x38,0xa8,0xbe,0x49,0x65,0x54,0xb5,0x67,0x57,0xd7, + 0x31,0xd5,0xa,0xe0,0x80,0x7a,0xa5,0x61,0xe0,0x55,0x1,0x6f,0x2,0xc,0x17,0xf1, + 0x3,0x2d,0xcd,0xf6,0x43,0xb1,0xa2,0x8f,0x6e,0x7,0xc3,0x38,0x1b,0xc5,0x78,0x7e, + 0x49,0x33,0x90,0xea,0x56,0x9e,0x1b,0x95,0xdd,0x1d,0x13,0x1,0x3c,0x8,0x74,0x70, + 0x40,0x31,0x22,0x17,0xa,0x9c,0x44,0xc6,0x72,0x34,0x66,0x88,0xdc,0x67,0x8e,0xa2, + 0x98,0xd8,0x7,0xe3,0xbb,0x82,0xe4,0xd9,0x50,0x85,0xf6,0x84,0xe6,0xde,0x2e,0xe6, + 0xc6,0xb8,0xbf,0xe3,0x8a,0xe4,0xe,0xd7,0x42,0xa0,0x5c,0xa5,0x68,0x27,0xb6,0x36, + 0x90,0x73,0x3b,0x54,0xa9,0xe6,0xc0,0x5a,0xd3,0x96,0xe4,0x63,0xe8,0xcb,0x9d,0x6c, + 0x4d,0x65,0xe6,0x5e,0x53,0x6b,0xfa,0xc0,0x91,0xdf,0xd,0x86,0x89,0x4a,0x2d,0x78, + 0xbe,0x5b,0x5c,0x72,0xa8,0x92,0x44,0xc3,0x7a,0xb2,0x74,0x5e,0x9,0x36,0xf6,0xe8, + 0x6b,0x1e,0xcc,0x94,0x24,0x49,0xd0,0x24,0xe5,0xc5,0xac,0x3d,0xa8,0x7,0xb2,0xa0, + 0x8f,0x9e,0x9,0xc,0xcf,0x2d,0x78,0x43,0x50,0xe3,0x23,0x1c,0x90,0xc8,0x74,0x8f, + 0x93,0xc3,0xdc,0x5,0xb6,0xd8,0x25,0xa6,0x83,0xaf,0xb1,0x10,0x4d,0x43,0x54,0xfd, + 0x3c,0xb0,0xfb,0xda,0x8c,0xa9,0x44,0x28,0x26,0x47,0xfb,0x4e,0xcd,0xe6,0xec,0xa9, + 0x73,0xeb,0xbc,0x67,0x31,0x93,0x86,0x7a,0xad,0x20,0x50,0x2e,0x40,0x4b,0x8,0xca, + 0x88,0xc5,0x1c,0xfa,0x56,0xc8,0x39,0xa2,0x54,0x8d,0x26,0xa2,0x85,0xb7,0xdb,0x44, + 0x35,0x81,0xed,0x99,0x61,0x93,0xdd,0x17,0x22,0xc8,0xdf,0x20,0x6d,0xfa,0x29,0x3b, + 0xb3,0x1b,0xd5,0x73,0x9f,0x89,0xdd,0x46,0x48,0x31,0x99,0x40,0xbb,0xd0,0x8f,0x8c, + 0xb7,0x84,0xe1,0xf9,0x40,0xe7,0x32,0xce,0x60,0x87,0xef,0x22,0x2,0x5,0xc,0x4c, + 0x9f,0x27,0x84,0x11,0x99,0x6a,0x43,0x70,0x4f,0xff,0x8b,0xae,0x28,0xb7,0x42,0x25, + 0x10,0x10,0x29,0x77,0x65,0x9c,0x1,0x6b,0xcd,0x36,0xef,0x31,0xb2,0xd2,0xb9,0x71, + 0xba,0x42,0x1,0x74,0xa4,0xed,0x79,0xad,0x11,0x2c,0x4a,0x86,0xfa,0xa7,0x81,0xef, + 0x1a,0x7d,0xb0,0x2d,0xff,0x95,0x51,0x35,0x37,0xf4,0x68,0x9,0xf0,0x8,0x9a,0xbd, + 0x1a,0xc1,0x40,0x28,0x49,0x9d,0xea,0x8e,0x1,0xf8,0x33,0x3b,0x3e,0xe,0x63,0x25, + 0x39,0x86,0xbb,0x92,0x38,0xf4,0xcf,0xb7,0x19,0xe3,0x81,0x54,0x36,0xd5,0x44,0x93, + 0x9c,0x4a,0xca,0x2c,0x3b,0xbc,0x76,0xed,0xc3,0x9e,0x9b,0x12,0xbf,0xfa,0x81,0x3c, + 0x20,0x59,0xf4,0x8d,0x79,0x64,0x49,0x8d,0x55,0x1a,0x4c,0xff,0xc0,0x61,0xb8,0xcb, + 0x36,0x13,0x52,0xc1,0x8c,0xa,0x21,0xf,0x55,0xd8,0xc0,0x89,0x43,0xea,0x9f,0xba, + 0x16,0x6a,0xf7,0x2e,0x28,0x3d,0x88,0x12,0x11,0xa0,0x33,0xd1,0x95,0x99,0x46,0xd8, + 0x8c,0x72,0x22,0x1c,0xfe,0x5d,0x2,0x93,0x13,0x41,0x56,0x42,0x48,0xb4,0xb0,0xb3, + 0xe1,0x2c,0xf9,0x12,0xf2,0xd6,0xb8,0x56,0x79,0x10,0xd,0x19,0x0,0x5d,0x9,0xec, + 0xeb,0x49,0x8,0xcc,0xd3,0xb5,0xe2,0x27,0xc4,0x71,0x54,0x58,0x9,0x68,0x16,0x86, + 0x4e,0xf4,0x8a,0xad,0x46,0xd4,0x2f,0xef,0x61,0xd7,0x52,0xe,0xb5,0x31,0xe,0xec, + 0xe7,0x2e,0x44,0x6d,0xf1,0x76,0x5f,0xfb,0x25,0x90,0xaf,0xb6,0x14,0x5c,0x89,0xad, + 0x5d,0x27,0xb2,0x56,0xaf,0xa6,0x84,0xb9,0xf,0x31,0x57,0xa5,0x74,0x91,0x9d,0x2b, + 0x4c,0x7d,0x26,0x84,0x57,0x2,0x51,0xce,0x63,0x7,0x5a,0x97,0x84,0x43,0x56,0xca, + 0x98,0xa0,0x7,0x32,0x66,0x95,0x1e,0x4a,0x8b,0x92,0x74,0x93,0xa9,0x65,0x79,0x8, + 0xec,0x12,0x98,0xa0,0x45,0x29,0x6,0x7f,0x2b,0xf9,0x5,0xbb,0xd8,0x55,0xb2,0xdf, + 0x89,0x10,0x1,0xb,0xcb,0x29,0x60,0xb5,0xf8,0x20,0x46,0x1a,0x56,0x43,0x27,0x38, + 0x5,0xfc,0x69,0xd5,0xdd,0x5f,0xf5,0x66,0xba,0xca,0x39,0x34,0xcf,0x79,0x8c,0x2d, + 0x9d,0x6d,0x1a,0xd1,0x40,0x7a,0x71,0x65,0xaa,0x67,0x30,0x53,0x90,0xe1,0x58,0xe9, + 0x56,0xe0,0x18,0x82,0x6a,0xa,0x1c,0x62,0x2b,0x77,0x9f,0xfa,0x6c,0xf6,0xbb,0xca, + 0x8d,0x12,0x74,0xf,0xc2,0x16,0xf5,0x10,0x88,0x5a,0x5b,0xfb,0x20,0xc3,0x18,0x55, + 0xaa,0x3b,0xf0,0x74,0x82,0x83,0x1e,0xfa,0x98,0x5,0x78,0x13,0x34,0x13,0x89,0x52, + 0x1d,0xe1,0x53,0x5,0xb4,0x6b,0x5,0x17,0x98,0x8b,0x92,0x9e,0xfb,0xd2,0x8f,0x92, + 0x60,0x94,0xd0,0xf3,0x1e,0x81,0xa3,0x13,0x69,0x8c,0x5b,0x41,0xe3,0x2e,0x94,0xba, + 0x14,0x39,0x7c,0x23,0xd2,0x8d,0xf4,0xbe,0xf4,0x82,0xa7,0xe2,0x73,0x39,0xd4,0xe0, + 0xa,0x27,0xa5,0xb9,0xcf,0xb6,0x2f,0x72,0x97,0x3e,0x79,0x1f,0x12,0xce,0xcc,0xca, + 0xe9,0xc0,0xb8,0x81,0x1a,0xdc,0xc0,0x77,0x79,0xf6,0x7d,0x73,0x6,0xda,0xe1,0xa5, + 0x84,0x83,0x10,0xdf,0x93,0x8e,0xc4,0xb3,0xaf,0xf6,0x6a,0x5b,0x25,0x5f,0x41,0xff, + 0x7c,0x8a,0x76,0xe2,0x64,0xa5,0x44,0xc0,0xc9,0x37,0x5a,0x93,0xe1,0x53,0x7b,0x6e, + 0x32,0xb6,0x29,0x1c,0xb8,0x47,0xd3,0xbe,0x56,0x53,0x99,0xf2,0xea,0x66,0x44,0x5e, + 0xd6,0xdf,0x5f,0xce,0x48,0x80,0x77,0x4,0x1a,0x0,0xad,0x2d,0xaf,0xe7,0xef,0xae, + 0xce,0x54,0xd4,0x60,0x37,0x69,0xbd,0xa8,0x4b,0x97,0x31,0x9e,0xaf,0xec,0xb5,0x9, + 0x5e,0x81,0x13,0x81,0x76,0xae,0xda,0x19,0x21,0x3a,0x95,0x2d,0xd9,0xe,0xcf,0x7d, + 0x76,0xab,0x99,0xe5,0x13,0xd8,0xb2,0x5b,0x92,0xa0,0xfc,0x26,0x41,0xf6,0x22,0x46, + 0xb,0x14,0xc8,0xf5,0xea,0x1c,0xf4,0x22,0xce,0x72,0x22,0x3,0x50,0x66,0xef,0xb3, + 0x1d,0x57,0x71,0x2f,0xcb,0xf5,0xd2,0xf5,0x34,0xe7,0x44,0x32,0x45,0x9b,0x2e,0x50, + 0x65,0x3e,0xaa,0xe7,0x87,0x70,0x41,0x94,0x4,0xc,0x71,0x5e,0x53,0xb5,0x41,0x65, + 0xe3,0x33,0x12,0xc5,0x87,0xd4,0x69,0xfa,0xfe,0xc2,0x4,0xa5,0xb4,0xd1,0x72,0xa, + 0xe6,0x89,0xbd,0x46,0x85,0x11,0x45,0x52,0xa0,0x5c,0xf0,0xd,0x7d,0x86,0xdd,0xc7, + 0xd6,0xaa,0x70,0xfd,0xe1,0xff,0xf0,0xc7,0x27,0x56,0xed,0x79,0x38,0x2c,0x9c,0x68, + 0x62,0xf8,0xe6,0xbb,0xb0,0x17,0x47,0xae,0x37,0x36,0xe3,0xbb,0x13,0x22,0xf0,0x42, + 0xd2,0x52,0x45,0x48,0x64,0xb9,0x91,0x5e,0x49,0x35,0xae,0x28,0x87,0x7e,0x4c,0xd, + 0x92,0xba,0x7,0x96,0xf9,0x44,0xb5,0x6c,0xf0,0x1f,0xdb,0x9f,0x1b,0x84,0xac,0xd5, + 0x54,0x93,0xb9,0xe4,0x50,0x42,0xb3,0x4f,0x12,0x54,0x67,0xaa,0x3a,0xfe,0x39,0xcc, + 0x64,0xa4,0xbf,0x7a,0x6a,0x5a,0x32,0xb5,0xe4,0xb3,0xfa,0x60,0xb2,0x6c,0x24,0x60, + 0xe3,0x88,0x1c,0xb7,0x95,0xc4,0x51,0x6d,0xc1,0xdb,0x5b,0x38,0x8c,0x52,0x4d,0xd7, + 0x72,0xca,0x8c,0x71,0x60,0x13,0x9f,0xd8,0x45,0x29,0xa4,0x75,0xf8,0xfb,0x6f,0x11, + 0x59,0xcf,0x64,0xda,0xb0,0xe1,0x3c,0x7e,0x8e,0xec,0x80,0x64,0xe1,0x67,0xc0,0x1d, + 0xae,0x56,0x3,0x58,0x82,0x89,0x11,0xa6,0x1a,0x4c,0xc9,0xc6,0xf5,0x7d,0xc1,0xc0, + 0x8d,0xd4,0xdf,0x7e,0x59,0x58,0xe6,0x36,0x6d,0x34,0xd5,0xca,0x1f,0x55,0xeb,0x92, + 0x43,0xc0,0xe0,0x83,0x4c,0x7,0x86,0x99,0x4,0x84,0x64,0x73,0x9d,0xd8,0x28,0xf7, + 0xeb,0xe8,0x86,0x47,0xec,0xa,0xed,0xe3,0x59,0x86,0xd3,0x64,0x27,0xcd,0x16,0x74, + 0x1f,0x1b,0xaa,0x12,0x46,0x57,0x5b,0xe3,0xd0,0x9,0xcb,0x9,0x52,0xf4,0xf1,0x20, + 0x52,0x90,0xcb,0x72,0x1,0x15,0x2a,0xfa,0x84,0x3,0xf,0x6b,0x68,0x23,0x32,0xcf, + 0x93,0x10,0x7b,0x62,0x10,0x60,0x3b,0xc9,0x71,0x9e,0x22,0xc6,0x21,0xf0,0x44,0x97, + 0xa0,0x66,0xc5,0xb8,0xf3,0xcc,0xcb,0x8c,0x4f,0x2a,0x39,0x9a,0x23,0x60,0xf3,0x92, + 0xb3,0xc6,0xfa,0x16,0x51,0xbf,0xa5,0x5e,0x59,0x98,0xf1,0x5,0x96,0x5a,0xa1,0x86, + 0x57,0xc5,0xf1,0x3d,0x33,0xbd,0x4e,0xa2,0xe8,0xf5,0x87,0xdf,0x7f,0x1c,0x2e,0x28, + 0xa1,0xd2,0x34,0xc1,0xcd,0xec,0x55,0x88,0xcd,0x3a,0xc,0xc7,0x18,0x7b,0x5,0x3f, + 0x4a,0x9,0x72,0x68,0x86,0x3,0xf3,0x59,0x1d,0x2c,0xdf,0xf1,0xb5,0xaf,0xe,0xf9, + 0xd3,0xa9,0x3b,0x5,0x9c,0x64,0x1d,0x12,0x73,0x30,0x38,0x6c,0x98,0xf1,0x50,0x3f, + 0x64,0x40,0x40,0x7f,0xd,0xcc,0xc0,0x42,0x8e,0x4c,0x6e,0xd6,0xb2,0x6b,0x70,0xe3, + 0x1b,0xc1,0xe6,0xb0,0x82,0xbf,0xb5,0x68,0x59,0x47,0x31,0xb1,0xd3,0x9f,0x7d,0xd7, + 0x80,0x57,0x43,0x78,0xe0,0x8b,0x77,0x4e,0x24,0x13,0xc8,0x61,0xce,0x21,0x74,0xfa, + 0x4c,0x6d,0xf7,0x6e,0xdf,0x63,0x54,0x61,0x5a,0x64,0xe3,0x4c,0x6c,0x85,0xbc,0x2f, + 0x73,0xf7,0x3e,0xa7,0xf6,0x14,0x93,0x4d,0xc,0x45,0x58,0xa2,0x32,0x64,0x3a,0x5d, + 0x73,0x3e,0x35,0x4b,0xdb,0x53,0x65,0x86,0x31,0xa5,0x1a,0xd2,0x79,0x18,0xd3,0x27, + 0x47,0x36,0x54,0xda,0x7f,0xbb,0x55,0x4b,0xa4,0x13,0x64,0x23,0x10,0x50,0x39,0x7, + 0xe5,0x2d,0xb3,0x5d,0xbc,0x44,0x2,0x21,0x9a,0x13,0xde,0x7d,0xa7,0xc9,0x2f,0xb7, + 0xbc,0x79,0x90,0xb3,0x4f,0x83,0xc7,0xdc,0x73,0x7,0xf9,0x6f,0x41,0x98,0x32,0xaf, + 0x55,0x9d,0x84,0xc3,0x61,0x5f,0xd,0x60,0x99,0xf,0x72,0x76,0x5e,0x9,0xea,0xcc, + 0xc7,0x21,0xbe,0x1d,0x8,0x19,0xda,0xe8,0x94,0x2f,0xd2,0xb1,0xbf,0x46,0x9a,0xc, + 0x32,0x29,0x4e,0xc7,0xe6,0x14,0x30,0xc7,0x69,0xd9,0x6f,0xed,0x7a,0xd7,0x24,0xcf, + 0x55,0x3d,0x7f,0x4e,0x68,0x44,0x34,0x79,0x9,0x4e,0xe3,0x41,0x9d,0xec,0x26,0xad, + 0x2b,0x93,0x29,0x86,0x56,0xe5,0xc3,0xdc,0x67,0x9c,0xa3,0x18,0xce,0xc,0x45,0x2b, + 0x19,0xd3,0x48,0x56,0x4c,0x10,0xe3,0xad,0xb1,0x29,0x7f,0xe3,0xaa,0xa9,0xc,0xec, + 0x5c,0x6c,0x59,0x3d,0x58,0xcf,0xd8,0x1a,0x2,0xf2,0x11,0xa9,0xc2,0x93,0xc0,0x4c, + 0xab,0x6,0x51,0xbd,0x4a,0x6c,0x64,0x8a,0xa,0x3b,0xd6,0x25,0x2,0x1e,0xa2,0x15, + 0x87,0x9d,0x31,0x49,0x5b,0x85,0xbb,0x84,0xf6,0xe2,0xa7,0x37,0x8e,0x6c,0xf4,0x3, + 0xc0,0x8d,0xb0,0x62,0xe4,0x60,0x55,0xca,0xb1,0x1f,0x75,0x4c,0xa5,0x3c,0x5c,0x81, + 0x3,0x4b,0x79,0x1e,0x4c,0xde,0x56,0xa2,0x34,0x15,0xa8,0x93,0x6b,0x1b,0xb,0x43, + 0xd6,0xd7,0x96,0x4f,0x93,0x1d,0x9c,0xbc,0xd3,0x2a,0xe5,0x70,0xe3,0xa5,0x5a,0x7d, + 0x8c,0xe4,0x4d,0xba,0x5f,0x40,0xd,0xe4,0xab,0xbd,0xa4,0x28,0x52,0x8b,0x22,0x84, + 0x21,0xff,0x9c,0x63,0x5d,0xb,0x3e,0xd5,0x39,0x64,0x75,0x64,0x9b,0x64,0x80,0x97, + 0x7,0x1,0x17,0x3c,0x69,0x87,0x7,0xbb,0x37,0xc6,0xd6,0xd3,0xf6,0xcd,0xca,0x81, + 0xf1,0xac,0x33,0xd9,0x60,0xf4,0x41,0xa9,0x28,0x92,0x8e,0x76,0xf9,0x38,0xa3,0x92, + 0xae,0xd4,0xf3,0xfb,0x91,0xd7,0xda,0x52,0xa2,0x1b,0xa3,0xeb,0xb3,0xdc,0xa1,0x44, + 0x15,0xa3,0x4b,0xb9,0x6,0x50,0x18,0x82,0x4a,0xb4,0xc5,0x92,0xe3,0x31,0x0,0x49, + 0x6a,0x47,0xdb,0xe6,0x83,0xad,0x1d,0xb5,0xd9,0x7e,0x4c,0x9e,0x8b,0x42,0xa9,0x55, + 0x3d,0x40,0xd,0x1d,0x8,0xc6,0x19,0xdb,0xbb,0x75,0x2,0x95,0x22,0x49,0xcb,0x58, + 0x5c,0x9f,0x32,0xfd,0xfe,0x6a,0xec,0x7e,0x5b,0xc7,0x48,0xea,0x23,0x4f,0xf5,0xd3, + 0x90,0x10,0xc8,0x7e,0xcc,0x63,0xef,0x72,0x12,0x20,0x5a,0xef,0x18,0xd1,0xba,0xa7, + 0x29,0x94,0xad,0x33,0x3c,0x85,0x58,0x20,0x93,0xf,0x78,0xd4,0xd1,0x2,0x4d,0x58, + 0xfc,0x20,0x57,0x89,0x9b,0xb4,0x34,0x36,0xe7,0x62,0x30,0xc1,0x62,0xaf,0x36,0xd3, + 0xfa,0x13,0xf4,0x8a,0x96,0x22,0xf3,0x5d,0x75,0xf0,0x7c,0x21,0x7,0x5e,0x8e,0xac, + 0xa3,0x2a,0x9f,0x87,0xd5,0xf1,0x43,0xa2,0x9d,0xc3,0xe6,0x33,0xac,0xb6,0xd1,0x49, + 0xa4,0x67,0x27,0x7a,0xba,0x2c,0x78,0x23,0x3e,0xf4,0x98,0x16,0x3d,0x56,0xc,0xd9, + 0x60,0x63,0x1e,0x89,0xa6,0xff,0x24,0x21,0xbd,0xd,0xf1,0xd4,0x0,0x2,0x38,0xb0, + 0xfc,0x70,0xec,0x9d,0x35,0x36,0x6c,0xf6,0xe8,0x72,0x13,0x23,0x18,0xc2,0xba,0x51, + 0xc3,0x33,0xfc,0xd8,0x33,0x1c,0x7a,0xda,0xee,0x58,0x5,0x67,0xc9,0x3f,0x32,0xab, + 0x2a,0xad,0x9,0x97,0x46,0x35,0x9,0xca,0xfb,0xef,0x89,0xae,0xf1,0xc3,0x46,0x60, + 0xab,0xc1,0x6c,0xbe,0x5c,0xe6,0x51,0x7b,0x1e,0xc0,0xb1,0x16,0x35,0xdb,0x59,0x95, + 0xc8,0x94,0xfe,0x75,0xf6,0x27,0x77,0xf7,0x7,0xe2,0x43,0x8e,0x25,0x99,0x8b,0x36, + 0xeb,0xed,0xbe,0xd9,0x79,0xff,0xd4,0xc9,0xbb,0x46,0x4d,0x7c,0xb4,0xd7,0x98,0x8a, + 0x95,0xd9,0xd1,0x3f,0x19,0xb1,0x64,0xac,0x40,0x76,0x1,0xef,0xdf,0xf5,0x68,0x0, + 0x20,0xe,0xc,0xc8,0x18,0x61,0x8c,0xb6,0x11,0x41,0xce,0x7b,0x66,0x9f,0x61,0xf7, + 0xb0,0xa0,0x93,0x1b,0xb8,0x93,0x82,0x47,0x46,0xd8,0xe7,0x94,0xb,0x4e,0xae,0x72, + 0x6d,0x67,0x34,0x33,0xa0,0x22,0x96,0x44,0xe8,0xf6,0xff,0x7e,0x24,0x8f,0xd1,0x24, + 0x65,0x81,0x4d,0x36,0x24,0x74,0x44,0xf2,0xb2,0xc9,0x3,0xf3,0x92,0xd7,0x25,0x7b, + 0xb3,0xca,0x9,0x37,0x96,0x0,0x54,0xeb,0x1f,0x5d,0x69,0x56,0xfa,0x75,0x63,0x50, + 0xae,0xc1,0xf3,0xf9,0x40,0xfe,0xda,0x9e,0xe6,0x2a,0x2b,0x8b,0xe2,0x85,0x14,0x56, + 0x9e,0x5c,0x9d,0x25,0xe1,0xcc,0xe0,0x86,0xf9,0xcc,0xa8,0x3e,0x69,0xd4,0xc9,0xa5, + 0xf0,0x7d,0xdf,0x48,0x62,0x92,0x30,0xdb,0x3a,0xdc,0xfe,0x10,0x2a,0x88,0x33,0xb6, + 0x12,0x95,0xdf,0x6,0x55,0xb,0xe4,0xb6,0xbb,0xad,0x2d,0x19,0xdb,0x25,0x7d,0x19, + 0x4a,0xbc,0xfb,0x5a,0x10,0x1a,0x20,0x4a,0xb3,0xd8,0x72,0x9f,0x18,0x1c,0x75,0x38, + 0x9c,0xaf,0xaa,0x1b,0x8e,0x4d,0x6e,0x6d,0x8e,0x3f,0x30,0x59,0xe,0xb4,0xd3,0x15, + 0xdb,0xa4,0x87,0xc2,0x6,0xcf,0x83,0x77,0x55,0xbb,0x71,0x9d,0x56,0x6c,0xb9,0x4c, + 0x31,0x51,0xb3,0xfd,0x66,0x12,0xa0,0x33,0x4,0x51,0xf9,0x2b,0x97,0xff,0x26,0x31, + 0xcd,0xf2,0x9b,0x70,0x2e,0x0,0xdb,0x4d,0xa7,0x4f,0x4,0xb4,0x5d,0xb2,0xf6,0xef, + 0x35,0xc0,0x35,0x91,0x91,0x4d,0xa4,0x47,0xd4,0xe0,0xfb,0x5e,0x7,0x99,0xec,0xbc, + 0x37,0xb4,0x98,0x36,0xed,0xae,0x37,0xb5,0xa2,0xa7,0x9c,0xcc,0x68,0x4e,0xd9,0x9e, + 0x3e,0x3c,0x50,0xaf,0x4a,0x88,0x76,0x7f,0xaa,0x38,0xd8,0xad,0x94,0x4c,0x86,0xa0, + 0x8c,0x8d,0x10,0x6,0xdb,0x25,0x44,0xe3,0x3d,0x64,0xac,0xca,0x6c,0x50,0x59,0x37, + 0x38,0xd,0x4a,0x6e,0x10,0xb2,0xd8,0x73,0xed,0x50,0x42,0x84,0x3c,0x24,0x83,0x19, + 0x2b,0x46,0x31,0xb2,0xfa,0x42,0x90,0x28,0x4a,0x3d,0xc8,0x85,0xf4,0x86,0xac,0xc, + 0x11,0x24,0xa5,0x4d,0xaa,0xd0,0x3,0xca,0x78,0x1,0x5,0x77,0x8a,0xd3,0xdf,0xcb, + 0x20,0x3e,0xa9,0xc7,0x7,0x31,0x33,0xd3,0x87,0xd6,0x37,0xd4,0x6a,0x36,0x5a,0x1, + 0x6a,0x6,0x31,0x8e,0xb0,0xd4,0x25,0x46,0x36,0x87,0xd1,0x94,0xc4,0xe,0x16,0xb9, + 0x6,0x96,0xf0,0x2f,0x74,0xe2,0x71,0xb5,0x12,0x27,0xab,0x3e,0x42,0xda,0x21,0xbb, + 0xec,0x1c,0xf9,0xf3,0x71,0xdb,0xf1,0x9e,0x8c,0xe6,0x58,0xd3,0x86,0x80,0x1,0xce, + 0x55,0x44,0x52,0x49,0x2d,0xeb,0x11,0x56,0x76,0xe0,0xc3,0xb8,0x34,0x59,0xa1,0x8f, + 0x57,0x3d,0xbc,0x90,0xea,0x3a,0xec,0xbe,0x7f,0x14,0x1,0xe1,0xd8,0xe3,0xce,0x8a, + 0x71,0x97,0xc7,0x42,0x5e,0xd5,0xf1,0x36,0x15,0x8b,0x9,0xd7,0x33,0xd7,0xde,0xe6, + 0x82,0x0,0x30,0xa0,0x75,0x4b,0x53,0xfb,0x81,0xe2,0x6d,0x74,0x8e,0x67,0x74,0x8e, + 0x7d,0xbe,0x69,0xb0,0x4a,0x6f,0xbc,0x1a,0xab,0x22,0x39,0xd8,0x89,0x3e,0x8,0xcf, + 0x30,0xb6,0x59,0x13,0x19,0xab,0xa1,0x6c,0x41,0x57,0xa9,0x61,0x21,0x75,0x78,0xa2, + 0xa3,0x9c,0xc0,0x81,0x27,0x37,0x28,0xd3,0x64,0xa0,0x98,0xec,0x3b,0x87,0xae,0xe8, + 0x84,0xab,0xab,0x73,0xa2,0xa1,0x92,0xa,0x71,0xc0,0xc7,0x1f,0xc3,0xff,0xd4,0x91, + 0x46,0x4e,0x53,0x4,0xd5,0xdf,0x33,0x55,0x84,0x74,0xdf,0x81,0xe6,0x26,0xfb,0x8a, + 0x6b,0x13,0xcf,0x3a,0xdb,0x4c,0xad,0xa5,0x8a,0x43,0x47,0x5a,0x99,0xf9,0x2b,0x47, + 0x78,0x50,0xc3,0x9,0x81,0x81,0x7f,0x26,0x61,0xce,0x87,0xe7,0xe6,0x41,0xf7,0x4a, + 0xa1,0xb8,0x5d,0xf6,0x16,0x5b,0xd3,0xcc,0xae,0x34,0xbe,0x62,0x55,0xe1,0xf,0xfd, + 0x7b,0xef,0x3f,0x5e,0x87,0x33,0x1d,0xbe,0xd9,0xf1,0xf5,0x5,0x5b,0x20,0x86,0xfe, + 0x4d,0xe0,0x8d,0x1d,0x4d,0xdf,0xed,0xa8,0x18,0x69,0x79,0x25,0xd1,0x7d,0xe8,0x43, + 0xb5,0xf9,0xc5,0x57,0x1c,0xab,0x98,0x1d,0x33,0xc2,0x4f,0xf0,0xc6,0x12,0x35,0x3a, + 0xc9,0xc1,0x9b,0x2e,0xf2,0x40,0xc4,0x98,0x5b,0xe4,0xdd,0x4d,0x7e,0xfe,0xd1,0x7c, + 0x41,0xa4,0x98,0xb8,0xaf,0xbd,0x47,0x8c,0x80,0xd8,0x27,0xe1,0x48,0xd5,0x98,0x46, + 0x18,0x6,0xbb,0x62,0x31,0x7,0xe2,0x87,0x83,0xf7,0x4d,0xbf,0x5b,0x68,0xda,0x49, + 0xc5,0x4a,0x5,0x1e,0x75,0x14,0xaa,0x14,0x30,0x9,0x2,0x5f,0x3b,0xbf,0x4e,0x8d, + 0xd3,0xe7,0x17,0x24,0xeb,0xbe,0x82,0x83,0x31,0x8a,0xe1,0xe7,0xe7,0x4d,0x7a,0xa9, + 0xa8,0x97,0xb2,0xc9,0x6b,0xbd,0x6a,0x70,0xa3,0x9,0xfd,0xe0,0xbb,0x90,0x18,0x86, + 0x9e,0xdb,0x51,0x65,0xb8,0x62,0x74,0xf3,0x5b,0x2,0xd1,0xa7,0xd6,0xd0,0x91,0xe1, + 0x3a,0xf4,0x56,0x5e,0xe8,0xf7,0x1f,0xbf,0xfb,0xf8,0xfd,0xdf,0xba,0xa1,0x3c,0xd2, + 0x62,0xda,0x4d,0x4b,0x82,0x43,0xd,0xd8,0x7f,0x13,0xfc,0x80,0xb4,0x63,0x6,0x42, + 0xa0,0xed,0x34,0x7e,0x83,0xd5,0x31,0x6b,0x47,0xf2,0xa8,0xd2,0xed,0x4,0xb0,0x4e, + 0x3,0x4b,0xf6,0xc7,0xc4,0xbb,0x38,0xdf,0xf0,0x7e,0xaa,0xcc,0x85,0x50,0x97,0x9b, + 0x9d,0x64,0xb0,0xb3,0x3d,0x3d,0x8d,0x70,0x29,0xec,0x2f,0x30,0x3f,0xd3,0xf0,0xa3, + 0xd4,0x59,0x96,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x20,0xdb,0xa1,0x3,0x49, + 0xf8,0x95,0x6c,0x73,0x93,0x6c,0x1e,0x7c,0x4,0xe,0x4f,0x4,0x43,0x5f,0x3e,0x11, + 0x20,0x72,0x38,0x15,0xd0,0x65,0x94,0x5f,0x5a,0x31,0xc,0xca,0xae,0xae,0x17,0xd4, + 0x7d,0x31,0x10,0xc6,0xe6,0x15,0x84,0xc7,0x2a,0x84,0xe3,0x24,0x6f,0xfc,0xee,0x51, + 0xb2,0xb2,0x8c,0xf7,0x49,0x93,0xae,0x7d,0xc3,0x9,0x43,0x90,0xdc,0x38,0xca,0xa1, + 0x31,0x13,0x61,0xc0,0xa4,0xd,0x0,0x77,0x5,0x12,0x58,0x68,0x55,0x6a,0xc0,0xb8, + 0x5b,0xa1,0x5f,0x3c,0xf4,0xc1,0xd6,0x3f,0x5f,0xf2,0xf9,0x17,0xda,0x34,0x4e,0xba, + 0x2a,0x3d,0x1a,0x19,0x70,0x50,0xcc,0xc5,0x24,0xa,0x93,0x71,0xce,0x77,0xd8,0xe8, + 0xe9,0x76,0xa4,0xd7,0x23,0x16,0x8c,0xea,0x80,0x86,0x84,0xbe,0x37,0xc9,0x88,0xe2, + 0xd8,0x3,0x74,0x6b,0x52,0xa8,0x7f,0xfd,0x91,0xb4,0x92,0xfa,0x14,0x68,0xb5,0xa6, + 0x8e,0x4f,0x50,0x6e,0xb6,0x3b,0xbf,0xa1,0x19,0x8d,0x5,0x6a,0xbe,0x3d,0x8a,0x50, + 0x1d,0x8a,0x5e,0x4e,0x5c,0xda,0x97,0x63,0x4b,0xc2,0xba,0x76,0x4b,0x58,0x6c,0x22, + 0x60,0xaf,0xb8,0xdf,0x86,0x7e,0xd6,0xc,0x41,0xb6,0xef,0x83,0xc3,0x86,0x66,0x11, + 0x85,0x57,0x4c,0xbd,0x6d,0xc4,0x6c,0xf5,0x34,0xe1,0x4a,0x6c,0x18,0xe1,0x90,0xe8, + 0x23,0x1d,0x10,0x5c,0x43,0xdb,0x14,0xd6,0xbb,0x36,0x2c,0xc7,0x58,0xe7,0x49,0xa4, + 0xc3,0x80,0x67,0xf7,0x7c,0x4b,0xf6,0x89,0x43,0xd6,0xed,0xb6,0xb5,0x72,0xb0,0xda, + 0xeb,0xed,0x75,0xe3,0x16,0x1f,0x2a,0xce,0xdc,0x4b,0xad,0xdf,0xe9,0x37,0x27,0xb, + 0x62,0x6f,0x89,0x64,0xc0,0x4a,0x88,0x5c,0xa5,0x85,0xe7,0xc4,0x82,0x35,0xaf,0x2f, + 0x59,0xe9,0x51,0xc9,0xa3,0x8d,0xd4,0xf9,0xfd,0x42,0xe8,0xa9,0xef,0x91,0x2a,0x74, + 0x89,0x9b,0x2a,0xbb,0xbe,0xc9,0xe3,0xcc,0x85,0x7c,0x32,0x98,0x23,0xd6,0x38,0x9b, + 0xa4,0xb4,0x8c,0xd,0xc2,0x7f,0x9b,0x8e,0x70,0x91,0xc2,0xc7,0x50,0x5f,0xd3,0xe7, + 0xf3,0x4c,0x2a,0xd9,0xe7,0xd1,0xa1,0x2d,0xa2,0x4a,0x9e,0x84,0x57,0xaf,0x40,0x2c, + 0x23,0x2b,0x5c,0x5d,0x1a,0xf8,0xb9,0xc0,0xb4,0xc7,0xf0,0x56,0x5c,0x79,0xeb,0xa, + 0x2e,0x45,0xd0,0x92,0x9b,0xb5,0xec,0x94,0x44,0x2a,0xed,0x4b,0x3a,0x9a,0x9e,0x2d, + 0x9f,0x3c,0x4e,0x98,0x2,0x48,0x36,0x6a,0x9,0xb1,0x1f,0xd6,0xbc,0x74,0x22,0x6a, + 0xbb,0xd3,0xdb,0x5b,0x49,0x46,0xd5,0x21,0x46,0x6e,0x22,0x10,0xaa,0x3a,0xc5,0xa5, + 0xf,0xcc,0xb2,0x41,0x33,0x25,0x82,0x1d,0x91,0xae,0xd8,0xf8,0x2d,0xdb,0x28,0x4c, + 0x72,0x22,0xb3,0xda,0x84,0x7b,0x69,0xc6,0xdb,0x23,0x5b,0x65,0x87,0x97,0xed,0x73, + 0x1f,0xa2,0x51,0x3b,0xe7,0x23,0x5c,0xd3,0x85,0x18,0x9e,0x59,0x6e,0xe6,0x56,0x42, + 0xf8,0xd2,0xb5,0xa4,0x58,0x4,0x53,0x84,0x61,0x5d,0x70,0x3f,0xe9,0x60,0x1a,0xed, + 0xcd,0xd1,0xa5,0xe0,0x3a,0x4e,0x35,0x70,0x1e,0xba,0x64,0xe1,0x55,0xa3,0xed,0x96, + 0xf5,0x21,0x79,0x1e,0x39,0x2e,0x47,0x5e,0xa,0xe2,0xca,0xad,0xf6,0x99,0xeb,0xe1, + 0x5f,0x8e,0x50,0xe4,0xdc,0x4f,0x60,0xde,0x36,0x76,0x85,0x1a,0x44,0x2c,0x42,0x93, + 0x9f,0x23,0xb9,0x63,0xc4,0x8,0xc,0x6b,0x8,0xbd,0xeb,0x4a,0xc7,0xb5,0xc8,0xe8, + 0x2b,0xb8,0x23,0xf4,0xc8,0x37,0x20,0x79,0x83,0x6f,0xf6,0xa8,0x27,0xed,0x75,0x99, + 0x7d,0x16,0x3,0xde,0x84,0x92,0x5,0xa7,0x51,0xb4,0xfa,0x92,0x51,0x95,0xcc,0x3e, + 0xd7,0x82,0x53,0x15,0x11,0x88,0x35,0x97,0x2e,0xfc,0x26,0x9,0x63,0xb0,0x7c,0x8b, + 0x5f,0x64,0x63,0x57,0xa3,0x98,0xb9,0x8c,0x9f,0xa1,0x57,0x4a,0xc3,0x3c,0xf0,0x38, + 0x78,0x42,0x74,0x11,0x16,0xe,0xba,0xe2,0x8a,0xb2,0xc6,0xb5,0x37,0x6f,0xc,0x43, + 0x5e,0x60,0xcf,0x57,0x6b,0xe7,0x4a,0x3,0x1b,0x21,0x6f,0x32,0x2f,0x9c,0x3,0xc4, + 0x4e,0xd,0x70,0xe2,0xc7,0xad,0x5a,0x10,0xc6,0xb9,0xc9,0x59,0xb0,0x34,0x5f,0x46, + 0x97,0x66,0x58,0x7f,0x1e,0xc9,0x7e,0xb9,0x7c,0xf7,0x49,0xa9,0x6e,0x4f,0x68,0xd4, + 0x6a,0x81,0x11,0x1c,0xc0,0x15,0x2c,0x2e,0x81,0xb,0x58,0x25,0xd4,0xce,0x86,0xff, + 0x3b,0xf9,0xfa,0x91,0xd6,0xdd,0xad,0x23,0xd2,0x35,0x1a,0xc,0x57,0x8c,0xc1,0x74, + 0x4d,0x5e,0x74,0x9c,0x1,0x70,0x59,0x63,0xca,0x74,0x50,0xce,0x75,0xf7,0xb1,0x4a, + 0x97,0x4d,0xae,0xaa,0x10,0x3a,0x9b,0x11,0x25,0xe,0x84,0x48,0x8f,0x2d,0x34,0x68, + 0xde,0x9e,0x8c,0x78,0x2e,0x40,0xfd,0xd2,0x55,0xc6,0xdb,0xea,0xf7,0x5a,0x7b,0xfd, + 0xed,0xe9,0x55,0x37,0x46,0x70,0x39,0x44,0x9,0xc3,0xd2,0xb1,0x32,0x86,0x3d,0x3a, + 0x80,0x6c,0x93,0xb4,0x11,0x6b,0x34,0x62,0x42,0x9,0xeb,0x10,0x26,0x19,0x58,0x62, + 0x34,0x91,0x6c,0x6a,0x44,0xbf,0x5,0x15,0x92,0xaa,0xa2,0x4b,0x8b,0x20,0x2e,0xec, + 0x16,0x14,0x1c,0x1e,0x44,0xb2,0x57,0x6b,0x86,0xea,0x92,0x81,0xd8,0xce,0x64,0xed, + 0x25,0x4d,0x26,0x36,0x53,0x34,0x3c,0x64,0xda,0xa7,0x1,0xfe,0x5c,0x48,0x18,0x23, + 0xf1,0xd9,0x76,0xac,0x54,0x70,0xc5,0x2d,0x46,0x37,0x93,0x1d,0x75,0xf6,0x85,0x1d, + 0xf4,0xc3,0xe5,0xa9,0x87,0x3f,0x5d,0xd3,0xc6,0xcf,0x24,0x81,0x35,0xdb,0x99,0x9a, + 0x46,0x36,0xd4,0x54,0x64,0x30,0x29,0x5a,0xc1,0x87,0xc7,0xa6,0x3e,0xaa,0x4f,0x15, + 0xf0,0x80,0x3,0x37,0x11,0x14,0x56,0x68,0x63,0x3b,0x23,0x1d,0xa1,0x40,0x97,0x2c, + 0x2a,0x5a,0xa4,0xd4,0x1e,0xba,0x5c,0xfb,0xe2,0xe,0xa0,0xbb,0xc6,0xad,0xb8,0x90, + 0x6a,0x7f,0x10,0x3f,0x8b,0x3c,0xec,0xbd,0x3d,0x69,0x22,0x32,0x5a,0x12,0x4,0xcc, + 0xa8,0xbf,0x92,0xda,0xe3,0xd0,0x40,0xa,0x91,0x60,0x95,0x60,0xa2,0x86,0x35,0x9d, + 0xf7,0x52,0x96,0xd0,0x3c,0x6a,0x80,0x34,0xd1,0x91,0x79,0x32,0x60,0x39,0x20,0x6a, + 0x97,0x3,0xd2,0xa0,0x61,0x19,0x27,0x5,0x70,0x8b,0xdb,0xae,0x47,0xbe,0xdd,0xd5, + 0x76,0xcf,0xd4,0x5d,0xda,0x74,0xaa,0x63,0xb,0x91,0x68,0xc0,0xd0,0xd6,0x2f,0x2c, + 0x1,0xe6,0x12,0x50,0x29,0x33,0x48,0x42,0x1b,0x7c,0x66,0xb4,0xbf,0xd8,0x64,0x5, + 0x91,0x22,0x46,0xd1,0x4e,0xd0,0xeb,0x31,0xb2,0xe1,0xc3,0x7d,0x40,0x35,0x6e,0x93, + 0x8b,0xb4,0xf7,0x3d,0x3f,0xe2,0x7a,0xe8,0xa5,0x55,0x47,0x0,0xb3,0x5f,0x1c,0xed, + 0xbb,0x76,0x56,0xc8,0x6b,0xe0,0xa2,0x65,0xca,0x58,0xdf,0xe7,0x36,0x43,0x77,0x61, + 0x40,0x9e,0x9c,0xc6,0x63,0x7a,0x29,0x2a,0xef,0xbb,0x44,0xc9,0x96,0x40,0x57,0x15, + 0xa6,0x79,0x5,0x38,0x5f,0xaa,0x77,0x97,0x60,0x53,0x23,0xd9,0x20,0xc1,0xd8,0x26, + 0xe,0xd,0x7c,0x4d,0x16,0xb2,0xd8,0xca,0xcf,0x56,0xc3,0xb1,0x48,0x96,0x2f,0x24, + 0x66,0x1d,0x55,0x85,0x31,0x24,0xd,0x17,0xc0,0xc8,0x56,0xb7,0xf7,0xf2,0xaa,0x67, + 0x30,0x5,0x47,0xf6,0xfa,0x75,0x28,0x22,0xd1,0x20,0xc8,0xb,0xc1,0x98,0x68,0x23, + 0xe2,0xf9,0x1e,0x34,0xd8,0xf,0x6,0x89,0x5,0xb3,0xdd,0x18,0xb3,0xd1,0x69,0x1, + 0x6c,0x81,0xda,0x9f,0x4f,0xa6,0x34,0x26,0x9d,0x88,0xf8,0x11,0x6c,0x2c,0x5e,0x73, + 0xef,0xa9,0x1,0x46,0x5c,0x2c,0xe9,0x9,0x6f,0x75,0x6,0xf1,0xbe,0xe,0x3a,0x53, + 0xba,0x42,0xd,0x4f,0x58,0xf0,0x75,0xc1,0x82,0x39,0xe4,0x10,0x80,0xf5,0x34,0xf0, + 0x1a,0x1e,0x1e,0x60,0x56,0x5a,0x55,0xcb,0x1d,0xc0,0xb4,0xd7,0xaf,0x53,0x7,0x83, + 0x64,0x24,0xf3,0xa9,0xc8,0x4,0x7,0x6,0x8,0xb2,0x21,0xb1,0xba,0x31,0x11,0xd3, + 0x7,0xf0,0x43,0x4,0x37,0xeb,0xdc,0xdd,0x99,0xb4,0xc5,0x73,0xf5,0xc3,0x8d,0x7d, + 0x52,0x5,0x75,0x20,0x42,0xc9,0x88,0x16,0xee,0xcf,0x7b,0x5a,0x2c,0xd,0x8f,0xd2, + 0xe9,0x8,0x81,0xd7,0x86,0x9,0x1b,0x5b,0x82,0x2e,0x80,0x22,0x7,0xe6,0x48,0xc0, + 0x82,0x1d,0xcc,0x5b,0xd4,0x31,0xb4,0xd6,0xa3,0xf0,0xd4,0xa0,0x69,0x2c,0xdc,0x85, + 0x2d,0xb2,0xb6,0x68,0xd8,0xd6,0xbc,0x7f,0xe0,0x4a,0x45,0xfe,0x98,0x89,0x2d,0xf6, + 0xbe,0xc1,0x40,0xe9,0x8b,0x1,0xbf,0xfd,0xdc,0xf0,0x30,0xd6,0x7d,0x4f,0x70,0x75, + 0x4a,0x20,0x55,0xe9,0xe0,0xd9,0x51,0x43,0x3b,0x44,0xdb,0x4f,0xc6,0x2c,0xf7,0xb6, + 0x20,0x93,0x1d,0x6e,0xa4,0xd5,0x4d,0xee,0x61,0x1d,0xce,0xcc,0x80,0x23,0xf6,0xfd, + 0xaf,0xc6,0x58,0x99,0x5c,0xdb,0xf2,0x4,0x58,0x70,0x3a,0x22,0x18,0x23,0xa6,0x7a, + 0xd0,0x21,0xf0,0xa6,0xe9,0xf,0x34,0xa2,0x3c,0xaa,0xb7,0xa8,0x46,0x47,0x39,0x48, + 0xf2,0x85,0x98,0xa6,0x0,0x5a,0x97,0x45,0x91,0x15,0x54,0xc2,0xe4,0xd1,0x2e,0x4a, + 0x8e,0x53,0xc6,0xa9,0xe9,0x78,0xe7,0x25,0x7f,0x75,0xd9,0xfa,0x63,0xb9,0x76,0x7e, + 0xf7,0xad,0x87,0xf5,0x9c,0x31,0x1a,0x6,0xa1,0x51,0x63,0xa1,0xf1,0x32,0x20,0x79, + 0xf3,0x52,0x11,0xc5,0x38,0xa4,0xdf,0x33,0x23,0x6e,0x41,0xf6,0xda,0x5d,0xd1,0xbf, + 0xb9,0x2b,0x9a,0x7,0x5c,0x26,0x23,0x76,0x82,0x1b,0x87,0xc9,0x62,0x2e,0xd8,0xa9, + 0x57,0x71,0xee,0x1b,0x4d,0x39,0xc8,0x52,0xa1,0xaa,0x57,0x51,0xfb,0x20,0xef,0xb2, + 0x88,0xa3,0x1e,0xb1,0xf5,0xc8,0xca,0x60,0xf2,0x5d,0xfc,0xa9,0x82,0xd5,0x26,0x99, + 0x31,0xb4,0xad,0x19,0xfd,0xdc,0x49,0x3d,0x88,0xd1,0x5a,0xa0,0x64,0xfe,0xb,0xe, + 0x33,0x34,0xa2,0xc3,0x98,0x54,0x56,0x7a,0x34,0x81,0x80,0x2e,0x13,0xcb,0xc9,0x25, + 0x48,0xe6,0x4e,0x19,0xae,0x78,0x8e,0xbe,0x75,0xd9,0x5e,0xb4,0xf9,0xcb,0x69,0xbc, + 0x82,0xc3,0xd3,0x57,0xa5,0xbe,0xeb,0x76,0x30,0xb,0xf8,0x75,0x70,0x7e,0x2b,0xb5, + 0x77,0x45,0x54,0x64,0x61,0x7c,0xfc,0x8,0x61,0xa4,0xc0,0x3,0x11,0x55,0x73,0x38, + 0xcb,0xa5,0x81,0xc2,0x32,0x29,0x69,0x7,0xf,0xad,0x62,0xc4,0x0,0x83,0x63,0xc0, + 0xdf,0x81,0x9a,0x9,0x43,0x56,0xd5,0xb0,0xa1,0x2a,0x6c,0x24,0xa8,0x92,0x6a,0xe9, + 0x49,0x26,0x28,0x52,0x99,0x4e,0x38,0x4b,0x7,0xb2,0xb9,0x6d,0xe6,0x22,0x2e,0x50, + 0xb2,0xa0,0x24,0x58,0xbd,0x87,0xdc,0x13,0x4e,0x93,0x32,0x86,0xeb,0xba,0x77,0x80, + 0x51,0xd1,0x83,0x3e,0xb3,0xbd,0x26,0xf0,0x38,0xbf,0x77,0x35,0xd4,0xae,0xcd,0xae, + 0x77,0x59,0xe4,0x70,0xae,0x43,0xd5,0xd1,0x51,0xc0,0x8c,0x7f,0x2a,0x5c,0xc3,0x1c, + 0x39,0x42,0x92,0x26,0x5f,0x99,0xd7,0x78,0xe7,0xa3,0xf9,0x70,0xa3,0xc9,0x27,0x6f, + 0xfb,0x5f,0x97,0x5e,0xae,0x3d,0x99,0x82,0xd4,0xe5,0xf0,0x8a,0x1d,0x8c,0x59,0x6a, + 0x70,0x44,0xf0,0xc0,0xf2,0x56,0x23,0x18,0x88,0xbd,0x1b,0xd0,0x6c,0xc0,0x54,0xd5, + 0xfb,0xd4,0xbf,0x63,0x12,0xe5,0x62,0xcd,0x35,0x69,0x20,0x88,0xdc,0x63,0x7d,0x24, + 0x43,0x31,0x39,0x6f,0xa0,0x73,0x8a,0x50,0x2a,0xb5,0x1c,0x28,0x8e,0xc5,0xec,0x2d, + 0x43,0xdb,0x12,0x15,0x4a,0xa6,0x9a,0xba,0xc0,0xbd,0x11,0x31,0x73,0x43,0x38,0x81, + 0xa8,0xe8,0x3d,0xa1,0x71,0x54,0xe1,0x90,0x7d,0xaf,0x4,0x58,0x60,0x77,0xb5,0xaf, + 0x9e,0xc6,0xee,0x72,0xaf,0xca,0xfe,0xbd,0xdd,0xd6,0x3a,0xf7,0x79,0xf,0xee,0xc3, + 0x64,0x23,0xdd,0xe1,0x92,0x4d,0x3f,0x97,0x44,0x83,0x1a,0x21,0x4d,0x1d,0x37,0x17, + 0x71,0xd8,0x9a,0x1a,0x80,0x2c,0x80,0xfb,0x5c,0x60,0x85,0xb0,0x7,0xe4,0x50,0x25, + 0x11,0x5,0x11,0xcc,0x75,0xad,0x52,0x6a,0x12,0xba,0xd8,0x25,0x70,0x72,0x2f,0xc, + 0x22,0x11,0xee,0x34,0xa2,0x29,0xe9,0xfb,0x44,0x3,0xd1,0x82,0xab,0xfb,0x92,0x3b, + 0xd1,0x41,0x75,0x96,0xc5,0xa8,0x60,0xb2,0x14,0xe7,0x3c,0x9e,0x7f,0x54,0x91,0x95, + 0x79,0x54,0x36,0x49,0x2a,0x76,0x48,0xac,0xfa,0x38,0x65,0xf6,0x77,0xcb,0xd4,0x8b, + 0xe4,0xf0,0x45,0xd5,0x34,0xb4,0xe5,0x3d,0x2c,0x9f,0xfb,0x46,0xf4,0x72,0x1f,0xd1, + 0x17,0xa,0x49,0x2e,0x8d,0x63,0x50,0x65,0x33,0xc3,0xfe,0x3b,0x7a,0x55,0x83,0xb1, + 0x87,0x75,0xa0,0x75,0x43,0x94,0xd1,0x62,0x8f,0x62,0xa,0x3d,0x70,0x21,0xc,0x67, + 0xcc,0xb2,0xd,0x98,0x69,0x58,0x4c,0xf9,0x64,0xd,0x5a,0xa6,0xe,0x5,0x4f,0xb0, + 0x9a,0xb6,0xf5,0xe0,0x9c,0xd6,0x41,0xcf,0x43,0xe8,0x4d,0xa5,0x38,0x84,0x52,0xee, + 0x5a,0xfb,0x97,0xa1,0x4f,0xd9,0x87,0x35,0xf8,0x7a,0xc1,0xbf,0x12,0xc8,0x9e,0x84, + 0x8c,0x11,0x80,0x6,0x76,0xaf,0xda,0xa5,0x52,0x38,0x23,0x30,0xf3,0xa5,0x48,0xee, + 0x64,0x9f,0x75,0x16,0x3e,0xa6,0x1f,0xe4,0xf7,0x47,0xad,0x73,0xad,0xd2,0x4e,0xe5, + 0xc7,0xe8,0x5e,0x22,0xe0,0xeb,0x30,0xc4,0x21,0x5c,0x99,0xcf,0x2,0x1f,0xd3,0xc9, + 0x90,0xad,0xf,0x8b,0xd1,0x14,0xa,0x3d,0xc2,0x4c,0x1c,0x80,0x2c,0xc8,0x6,0xee, + 0x47,0x9f,0xd7,0x7c,0xf1,0x1d,0xc8,0xad,0x2,0x63,0xb8,0xb7,0x28,0xa8,0x7e,0xa, + 0x55,0xd,0x3a,0x9e,0xc5,0xbf,0x6a,0x58,0xad,0x9d,0xc0,0x7a,0x55,0xce,0x11,0x45, + 0x10,0x56,0x5b,0x60,0xf4,0x56,0x6f,0xba,0x8c,0x56,0xd5,0x10,0x90,0x3b,0x18,0xbb, + 0xf2,0xd3,0xab,0xa2,0x16,0xbe,0x36,0x47,0xe6,0xd4,0xe5,0xcc,0x13,0xc7,0x59,0x88, + 0xae,0x73,0xc0,0x3c,0xdb,0xd3,0xa6,0x5b,0xdb,0xde,0x1b,0x19,0xbb,0x18,0x8c,0x3f, + 0x3b,0x1c,0xaa,0x6,0xf1,0x7c,0xb9,0x18,0x43,0x5f,0xd1,0x67,0x44,0x93,0xb9,0xb8, + 0x34,0xa,0x7c,0xe9,0xd6,0x30,0xcf,0xcc,0x1,0x4e,0xd7,0x1e,0xe1,0x12,0xb7,0x28, + 0xc9,0x6a,0x45,0x60,0x62,0x43,0x40,0x9b,0x74,0x2,0xec,0xf1,0xa1,0xa6,0x7e,0x25, + 0xfd,0x1d,0x56,0xef,0xdd,0x2b,0x24,0x4a,0x74,0xa3,0xa,0x20,0x14,0xc6,0x42,0xb8, + 0xa5,0xab,0xb8,0xd5,0xf2,0xc1,0x7e,0x20,0xe8,0x4e,0x8e,0xa,0x8,0xba,0xe4,0x3e, + 0xa8,0x20,0xce,0xc4,0xf2,0xbd,0x1e,0x42,0x8d,0xb3,0xfb,0x61,0x4c,0xe0,0xd0,0x1d, + 0x46,0x76,0xf5,0x26,0x92,0x39,0xda,0x6f,0xf1,0x1e,0xde,0xfd,0xdf,0xab,0x27,0xa7, + 0x14,0xe8,0x13,0x61,0x8,0x64,0xae,0x74,0x3,0x21,0x91,0x91,0xad,0x42,0x1b,0x2, + 0x40,0xeb,0xbf,0x73,0xa0,0x53,0x3,0x8d,0xcb,0xd5,0xb3,0x6d,0xe2,0x28,0x68,0x94, + 0x4c,0xeb,0xe9,0x39,0x9b,0x1d,0xe9,0x90,0x61,0x37,0x7f,0x96,0x90,0x9b,0xf7,0x91, + 0x18,0x78,0x7f,0xda,0xa8,0xa0,0xcf,0x73,0xd5,0xf1,0x34,0xb8,0x43,0x93,0xc0,0xc6, + 0xb4,0xfd,0x53,0xc1,0xd8,0x17,0x68,0x56,0xa6,0x59,0xda,0x50,0x7e,0x8,0x62,0x40, + 0x26,0x2f,0xcc,0xde,0x36,0xba,0x2e,0x30,0x17,0x36,0xa9,0x96,0x5a,0x1b,0xe,0xf6, + 0x9b,0x57,0xf2,0xf,0x2f,0x2,0xba,0x8a,0x58,0x67,0xa9,0xbb,0x88,0xd4,0xd4,0x1b, + 0xd2,0x5d,0x93,0xcc,0x6f,0xc,0xf,0x2b,0xc8,0x9a,0x38,0x8c,0xd5,0x69,0x2,0x30, + 0xb5,0x36,0xe2,0x35,0x40,0x2,0xdc,0x69,0xf1,0xfb,0xba,0xb5,0x85,0x69,0x6c,0x60, + 0xf0,0xf3,0xc6,0x39,0x6e,0xce,0x95,0xe7,0x90,0x2,0x66,0xbb,0x87,0x59,0x74,0xe5, + 0xf7,0x5d,0x5d,0xa4,0xe8,0xe8,0x1,0xfe,0xa2,0x89,0x38,0xb5,0x40,0xb8,0x12,0x45, + 0xd7,0xe9,0x80,0x68,0xa6,0xf9,0x94,0xd2,0x10,0x20,0xa5,0x3d,0x84,0x6c,0x1f,0xb7, + 0xbe,0x96,0xa0,0xab,0x8f,0x0,0x14,0x74,0xd9,0x72,0xf1,0x4d,0x72,0xb9,0x3d,0xe4, + 0xe7,0x75,0x36,0x22,0xc7,0xfe,0xe4,0xc,0x13,0x11,0x34,0xac,0xf6,0x5f,0xcc,0x28, + 0xe8,0xc4,0x4,0x9d,0x98,0xfb,0x66,0x8f,0x80,0xce,0x6a,0x35,0xf2,0x7e,0x18,0x42, + 0x59,0x5,0xac,0xb,0x12,0x1c,0x2,0x35,0x65,0x53,0x8b,0x36,0x36,0x30,0x77,0x1c, + 0x31,0xe8,0x26,0x34,0xa9,0xc3,0x4e,0x50,0x41,0x63,0xba,0xbb,0x9d,0x69,0x83,0x95, + 0x53,0xd4,0x46,0x5,0x76,0x22,0xe8,0xa3,0xbf,0xca,0x49,0x77,0xa5,0x8c,0xca,0xee, + 0x66,0x95,0x9e,0xd9,0xca,0x62,0x67,0x16,0x29,0x4d,0xda,0xf,0x9d,0xa5,0x1f,0xac, + 0xf6,0x56,0xb,0xb2,0xef,0xb3,0x74,0x2b,0xda,0x9f,0x89,0xce,0xf8,0xe4,0x59,0x40, + 0xa1,0x9,0x6d,0x3c,0x50,0x17,0xbb,0x82,0xd7,0x1e,0x57,0x9,0x1,0x96,0xa8,0x4e, + 0x9c,0x68,0x3f,0xa9,0xe1,0x55,0x38,0x55,0xa1,0xc1,0xe2,0x8a,0xb0,0x54,0x3a,0xa9, + 0x4d,0x2d,0x3,0xa9,0x68,0xa8,0x53,0x9,0x3,0xf3,0x75,0x32,0xc0,0xe9,0x9a,0xd7, + 0x52,0x4a,0x47,0x83,0xaf,0x8d,0x3f,0x27,0x43,0x57,0x20,0xc5,0xd1,0x72,0x94,0x5a, + 0x75,0xa4,0x7c,0x52,0x6e,0xa3,0x3e,0x85,0xd2,0x3,0xc6,0xcc,0x99,0x99,0x44,0x50, + 0xba,0x41,0xcb,0x61,0x9e,0xce,0x48,0xaa,0x6c,0x4c,0x14,0xed,0xd3,0x33,0x78,0xf6, + 0x3,0x74,0x30,0x6,0x17,0xe,0x1e,0xd0,0xf3,0x75,0xd6,0x8b,0x64,0x2c,0x3,0xf1, + 0x65,0x62,0x28,0xe0,0xd9,0x74,0x47,0x7,0x2b,0x16,0xf2,0x46,0x91,0x25,0xae,0xc1, + 0xe2,0x13,0x2e,0x22,0xb0,0x48,0x54,0xba,0xa6,0xad,0x7a,0x84,0xb5,0xa4,0xa6,0x21, + 0xe6,0x2c,0xfa,0x7d,0xca,0x13,0x4d,0x2,0xdb,0x74,0x45,0xa2,0x67,0xb7,0x65,0x1c, + 0x7c,0xa8,0xda,0x2,0x5c,0xb8,0xf3,0x36,0x4,0xe4,0x41,0x2f,0xb0,0x1d,0x38,0x4d, + 0x4f,0xfe,0xfe,0x67,0x6d,0x1,0xa2,0x14,0x55,0xf5,0xf,0x7f,0xd8,0xef,0x4b,0x6f, + 0x9e,0x3,0xa2,0xb4,0xfe,0xfe,0xae,0x52,0x5d,0xbb,0xc9,0x3c,0x14,0xf4,0x70,0x52, + 0x62,0xa8,0xb5,0x58,0x9,0x71,0x38,0x53,0xc2,0x1b,0xe3,0x5c,0x1b,0xa,0x3a,0xfd, + 0x73,0xe2,0x80,0xc0,0xfb,0xe7,0x7a,0x1,0xc2,0x66,0x6d,0x44,0x37,0xcd,0xf6,0x82, + 0xf3,0xd1,0xb6,0x50,0xd7,0xb5,0x52,0x52,0x5c,0xd5,0xad,0x52,0x15,0xfa,0xc2,0x41, + 0x60,0x0,0x5e,0xcd,0x23,0xbb,0x5d,0x1c,0x6,0x62,0x8a,0x9b,0xd3,0xcf,0x23,0xc0, + 0xe3,0x26,0x2a,0x9d,0x99,0x74,0x98,0xd9,0xa5,0x85,0x60,0x90,0xd2,0xd7,0x1f,0x5d, + 0x8d,0xaf,0xa0,0x15,0x11,0xea,0x12,0x45,0xc0,0xab,0x59,0x95,0x96,0x42,0x9d,0x2b, + 0xa9,0xb8,0x76,0xc6,0xa5,0x6c,0x66,0xb8,0x4,0xa3,0x67,0x5d,0xe5,0x33,0xdf,0xa8, + 0x3e,0xb3,0x2f,0x7d,0x35,0x4e,0x52,0x82,0xb5,0x25,0x48,0x7d,0xbe,0x96,0xa,0x52, + 0x74,0x32,0x56,0xd,0x15,0x8b,0x54,0x4b,0xc8,0x67,0x9a,0xfc,0x7,0x6d,0xc2,0xc7, + 0xf8,0x4c,0xa9,0x3c,0x65,0x55,0x23,0xe2,0x3d,0x8,0x84,0xcd,0x3c,0x3f,0xec,0x52, + 0x4d,0xfb,0x6d,0x4e,0x18,0xae,0x5c,0xa6,0xd8,0xc0,0x1a,0x80,0x3d,0x94,0xbf,0x98, + 0xca,0x44,0xa3,0xa8,0xec,0x2c,0xbb,0x91,0x96,0x2a,0xc5,0x5,0xca,0x65,0xa3,0xaa, + 0xed,0x9,0x17,0x66,0x18,0x4a,0x70,0x1c,0x74,0xc5,0x2b,0x3,0xe7,0x4d,0x9a,0x9c, + 0x5a,0x6e,0x83,0xf6,0x29,0x32,0xca,0x34,0xa2,0x56,0xbc,0xe6,0xaa,0x79,0x30,0x1, + 0xaf,0xaa,0xa8,0x5c,0x3e,0xf1,0x99,0x8d,0xdc,0x19,0x72,0xab,0xcd,0x6,0x19,0x21, + 0x18,0x75,0xbd,0xe8,0x31,0x66,0xbb,0x62,0x92,0x55,0x75,0x72,0x67,0x12,0xbb,0x5c, + 0xcf,0x62,0xef,0x68,0x60,0x60,0x4f,0xc7,0x8f,0x4d,0x2d,0x8,0x34,0xa4,0x43,0xb8, + 0x29,0x8a,0x72,0x0,0x36,0x14,0xe0,0x5a,0xdc,0xca,0x9,0xba,0x83,0x8d,0x4d,0xc4, + 0x28,0xb9,0x6d,0x4a,0xd8,0x76,0xd5,0x46,0x95,0x66,0x8d,0x41,0x67,0xf5,0xd,0x58, + 0x64,0xb3,0x69,0x34,0xb4,0x2a,0xf4,0x20,0x3a,0xa1,0xb5,0x6a,0xa3,0x9b,0x59,0x3d, + 0x2a,0xd9,0x4f,0x13,0x95,0xad,0xbf,0x10,0xf3,0xf2,0x4f,0x80,0x74,0xef,0x53,0x27, + 0xec,0xa9,0x76,0xc5,0xe8,0x99,0xba,0x91,0x5e,0x83,0xf2,0x95,0x24,0x8b,0x89,0xc7, + 0x32,0x9f,0xb7,0x9,0xd7,0x4f,0x2c,0xf6,0x87,0xbc,0x9d,0xe8,0x31,0x47,0x4,0x26, + 0x92,0xae,0xab,0xf3,0xf2,0xba,0x36,0x6,0x5a,0x42,0x86,0xba,0x22,0x60,0xb,0x89, + 0xf,0x8,0x66,0x3,0x16,0x2e,0x31,0xed,0x70,0x63,0x4,0x27,0xa3,0x70,0x2d,0xb7, + 0x65,0x9d,0x8c,0x36,0xbb,0xd9,0xd8,0xea,0xc2,0xec,0x43,0xe8,0x5b,0x3b,0x33,0x19, + 0x43,0x40,0xf0,0xbe,0x8c,0x6e,0xea,0x5c,0x80,0xd0,0x9,0xff,0x95,0x45,0x73,0x7, + 0xb,0x4a,0x25,0x1d,0xec,0xdb,0x49,0x92,0x11,0x76,0xdd,0xb0,0x1,0xff,0xb5,0xa8, + 0x25,0x4d,0xee,0x8c,0x70,0x57,0x2a,0xdb,0x37,0x62,0x98,0xa7,0xb6,0x73,0xc7,0x3, + 0x76,0xb2,0xfb,0x75,0x66,0xfd,0x89,0xf8,0x57,0x1d,0x60,0x46,0xfb,0x3e,0xbe,0x24, + 0x6d,0xb4,0xea,0xd8,0x18,0x9d,0x1c,0xa6,0x1d,0x38,0xcc,0x7c,0x1f,0x86,0xd6,0x47, + 0x71,0xe6,0x99,0x61,0x8c,0x26,0xb6,0x81,0xce,0xb2,0x6f,0x6c,0x56,0xd5,0xef,0xff, + 0xe,0x90,0x1e,0x6,0x1,0x2a,0x85,0xbe,0xf4,0x79,0x5c,0xd5,0xd7,0xe9,0x8,0x5f, + 0xea,0xa9,0x70,0x5,0x7b,0x39,0x75,0xe3,0x3b,0xed,0x4c,0xfc,0x91,0x64,0x8c,0x67, + 0xd0,0x45,0x27,0x6c,0x42,0x40,0xff,0x17,0xa9,0xe7,0xa0,0x24,0x4e,0x26,0x84,0x8b, + 0xd6,0x1e,0x80,0x32,0xb5,0x31,0x91,0xcc,0x42,0x1c,0xc7,0x6c,0x52,0xfd,0x35,0x2c, + 0x95,0x2f,0x86,0xf5,0xc6,0x37,0xf4,0x9e,0xe4,0x4f,0xf1,0x7e,0x6,0xec,0xcf,0x64, + 0x42,0xbb,0x9b,0x7f,0x98,0xb1,0x94,0x13,0xa6,0x60,0x1d,0x29,0x38,0xdf,0xe7,0x91, + 0xa1,0x6d,0xda,0xfb,0xfd,0x1c,0xf3,0xc6,0x1e,0xed,0x90,0x70,0xf6,0xfe,0x16,0x7f, + 0xb2,0xc4,0x86,0xf0,0xe5,0x8b,0xd4,0x5d,0x97,0x16,0x89,0xb2,0x98,0x31,0xeb,0xef, + 0x3b,0x47,0x5,0x7d,0x19,0x6a,0xeb,0x11,0xa1,0x37,0xa0,0xc2,0x2d,0x6e,0xef,0x11, + 0x41,0xe,0x86,0xc6,0x56,0x22,0x21,0xd8,0x81,0x26,0x7,0x98,0x52,0x82,0x7d,0x4d, + 0x79,0xc0,0x27,0x5c,0x30,0xea,0xeb,0x8b,0x88,0x4e,0x16,0x45,0x15,0x9e,0x9,0x5, + 0x87,0xd2,0x9b,0x94,0x96,0x1a,0x6e,0x25,0xd1,0xd3,0x93,0x54,0x46,0xb0,0x4d,0xc9, + 0x59,0x20,0xef,0x35,0x1c,0xd5,0xc8,0xb3,0x83,0xdd,0x2f,0xa2,0x72,0x5a,0x22,0x8f, + 0x6b,0xd4,0x80,0xc2,0xf5,0xce,0x3f,0xe0,0x54,0xdc,0xcb,0x52,0x55,0xab,0x32,0x6, + 0x61,0xe2,0xa5,0xce,0xa6,0x6c,0xca,0xb0,0x94,0xcc,0x1e,0x96,0x69,0xa7,0xe2,0x8, + 0xd3,0x5,0x26,0xd5,0x99,0x8,0x2,0x89,0xb4,0x6b,0x23,0xe6,0xa6,0xd0,0x64,0x84, + 0x2,0xfa,0x8,0x1a,0x26,0x22,0x48,0x45,0x4f,0xfb,0x24,0x48,0x93,0x7,0xdc,0x81, + 0x54,0x71,0xe1,0x98,0x34,0x8d,0xd,0x9e,0x88,0x77,0xaf,0x5c,0xa3,0x7c,0xd6,0xf3, + 0x1c,0x46,0xcb,0xec,0x6a,0x7c,0xc1,0x22,0x36,0xee,0x54,0xc5,0x6f,0x7d,0xe4,0xa0, + 0x56,0x3d,0x23,0x5c,0x18,0xc4,0x97,0x3,0x76,0x1f,0x62,0xaf,0x23,0xfc,0xa,0x21, + 0x1,0xf1,0xeb,0x52,0x61,0xed,0xd0,0xae,0x29,0x9f,0x4e,0xf0,0x71,0xc3,0x61,0xde, + 0xb,0xa2,0xe2,0x54,0xae,0x9f,0xce,0x27,0xf9,0xa3,0xce,0x86,0x32,0x44,0x73,0xd5, + 0xd4,0x48,0x93,0xb8,0x74,0x88,0x2b,0x9b,0x7f,0xd5,0xfb,0x3e,0x2b,0x18,0xa2,0xf5, + 0x4f,0x76,0xb,0x8,0x56,0xd0,0x41,0x2b,0x9c,0xc5,0x66,0xdf,0x89,0x34,0x6d,0xec, + 0x8e,0x86,0xb2,0xa1,0x14,0x2,0x45,0x67,0x4f,0x33,0x93,0x6e,0x4f,0xb0,0x58,0x79, + 0x9f,0x7d,0x96,0x16,0x31,0x17,0x5d,0x8d,0x98,0xd8,0xcd,0x34,0x28,0xc4,0xae,0x69, + 0x8,0xf3,0x6b,0x3e,0x17,0x3d,0x19,0x37,0xb4,0x33,0xfb,0xa9,0xd1,0x3b,0xbd,0x74, + 0x6d,0x5e,0x5a,0xbb,0xf,0xf9,0x99,0x2b,0x36,0xaa,0x39,0x8d,0x9d,0xdb,0x17,0xbc, + 0xea,0x7,0x5e,0xa0,0x21,0x88,0xeb,0x9d,0xa8,0x0,0x38,0x51,0xc4,0x5c,0xe9,0x2d, + 0xf6,0x15,0x1b,0x32,0xd1,0x5b,0x13,0x6a,0x9b,0x4a,0xf3,0x6b,0xe0,0x42,0xfc,0x94, + 0x4f,0xe5,0xc5,0x1d,0x8c,0x15,0x3e,0x4f,0x39,0xc0,0x9e,0x1b,0x80,0x81,0xaf,0x20, + 0x5,0x17,0xf5,0x9,0xd0,0xd4,0x25,0x3d,0x64,0x61,0xbb,0xb3,0x81,0xb,0xe9,0xb3, + 0x33,0x48,0xd4,0xde,0xca,0x46,0xaf,0x3,0xe9,0x8b,0x42,0xd3,0xd4,0xe5,0xb0,0x35, + 0x21,0xd4,0x70,0xa9,0xdf,0x44,0x93,0xa2,0x8b,0x6a,0x21,0x46,0xcc,0x9a,0x24,0xdc, + 0x9e,0x68,0xc8,0x71,0xea,0x1c,0xcd,0x46,0x20,0x30,0x88,0x64,0xf1,0x39,0x2f,0xdf, + 0xb2,0x3f,0xfa,0x9a,0x8,0x54,0xe7,0x53,0x39,0x9,0x37,0xd6,0xb,0x81,0x9b,0x39, + 0x54,0xb5,0x66,0x7f,0x23,0x46,0x5d,0x71,0x39,0x26,0xa,0x76,0xdd,0x3d,0x9a,0xfb, + 0x45,0x57,0xcd,0x5e,0xc9,0x2a,0x4c,0x52,0x69,0xe,0xd3,0xcd,0x41,0x95,0x1a,0x4e, + 0x72,0x86,0x45,0x49,0xf7,0xa1,0x4d,0x7f,0xea,0xd4,0x5,0xef,0x66,0xd9,0xfe,0x7d, + 0xd,0xd5,0xde,0xf,0x98,0xab,0x4f,0xa4,0xfd,0xfd,0x9a,0x3c,0x5b,0xcd,0xf,0x7b, + 0xb,0x9c,0xf4,0x99,0xf8,0x4d,0x2c,0xe2,0xce,0x92,0x9b,0xa,0x59,0xc9,0x78,0x19, + 0xb6,0xc,0xeb,0xe3,0x17,0x1e,0xfe,0xd6,0xcf,0xa6,0x24,0xd1,0x24,0xc3,0xba,0xb2, + 0x99,0x78,0x65,0x23,0x4,0xfb,0x8d,0x39,0xbc,0x9f,0xd5,0x7a,0x29,0xd1,0x6c,0x62, + 0x2b,0xc9,0x7a,0x88,0x63,0x26,0xa6,0xc5,0xb4,0x7f,0x45,0x1d,0x5d,0x8c,0x4,0x24, + 0x8d,0x94,0x56,0xae,0x9c,0x4c,0xd9,0x75,0x8,0x74,0x9b,0x50,0x93,0xc9,0x2c,0x76, + 0x67,0xb8,0x0,0xc6,0x19,0xf0,0x5a,0x83,0x9b,0x57,0x24,0xea,0xde,0x89,0x9d,0x4, + 0x98,0xdf,0x3f,0x29,0x1f,0x66,0x52,0x85,0xa3,0xa2,0x2c,0xc2,0x37,0x20,0x9,0x88, + 0xae,0xa2,0xc5,0xf0,0x41,0xb9,0xab,0xe0,0x2b,0x19,0xd2,0x61,0x0,0xa2,0x53,0x26, + 0x31,0xfb,0xce,0xf2,0x39,0x6d,0x2a,0x61,0x77,0x99,0x2f,0xa9,0x8f,0x3c,0xc7,0xbe, + 0xbf,0xb5,0x6d,0x6a,0x96,0x84,0x5f,0x23,0x79,0xac,0x2e,0x47,0xbf,0x2c,0x74,0xc5, + 0x8b,0xe2,0xe1,0x87,0x8,0xdb,0xf8,0xb6,0xe,0x14,0xb4,0x2d,0x6b,0xe8,0xda,0xe3, + 0x67,0x93,0xc1,0x8b,0x72,0x83,0x98,0x43,0x93,0x6c,0xbc,0x1a,0xa5,0x8c,0x6c,0x7b, + 0x60,0x69,0x1,0x3e,0x7f,0xc6,0x90,0xbe,0x4d,0x25,0x42,0x19,0x9d,0x4d,0xd6,0x26, + 0x4,0xd6,0x62,0xb6,0xe,0x4b,0x2d,0x79,0x85,0x6a,0x3b,0x14,0x2b,0x86,0x2a,0xb1, + 0x46,0xa4,0x8d,0xec,0xf9,0x8,0x12,0x5a,0x63,0x1d,0xb4,0xb8,0xd2,0x56,0x36,0xc1, + 0xde,0x6b,0xf0,0xa7,0xf0,0x55,0x8e,0x53,0x1c,0xc4,0xb7,0xfe,0xec,0x5,0xc9,0x63, + 0xa4,0xce,0xf3,0xc5,0x87,0xea,0x5e,0x9a,0x8d,0xb,0xae,0x38,0x73,0xde,0xfa,0xbc, + 0x5a,0xdc,0x5b,0x76,0x77,0x5f,0x54,0x48,0xdc,0xe8,0x3,0xd6,0x99,0x72,0xf8,0xa6, + 0xd2,0xa1,0x2d,0xca,0x7b,0x37,0x3f,0x23,0xa4,0x12,0x9f,0x1e,0x50,0x6d,0x96,0xe1, + 0xe3,0x94,0xb6,0x5c,0x70,0x44,0x55,0x6a,0xc1,0x14,0x4c,0xd7,0x9d,0x98,0x7c,0x87, + 0xab,0x50,0x31,0xc5,0x40,0xdb,0xb0,0x77,0x99,0x1,0x8,0x59,0x27,0x9,0x65,0x21, + 0x87,0x84,0x16,0x34,0x3c,0x85,0xe8,0x49,0x84,0x4b,0x70,0xea,0xc,0x36,0x2,0x5b, + 0x9b,0x85,0x91,0xc4,0x1d,0xf,0x33,0x39,0xc8,0xf4,0x89,0x31,0x39,0xa4,0xbb,0xf, + 0x3c,0xb2,0x57,0xe5,0x71,0x32,0x36,0xd,0xca,0x11,0xe2,0x64,0xca,0xaa,0x4f,0x71, + 0xaf,0xac,0x92,0x77,0x9c,0x41,0xcb,0x7d,0x50,0xfa,0x1c,0xc8,0xb4,0x35,0x57,0xf2, + 0xb0,0x60,0x3d,0xe,0x1e,0xc5,0x34,0x9d,0x69,0xe7,0x8f,0xc,0xc4,0x33,0x44,0x32, + 0xc6,0xc1,0xd3,0x9d,0x7e,0xb4,0x30,0x64,0x8a,0x91,0xc2,0x6,0x72,0xe8,0x33,0x69, + 0x98,0xa0,0x23,0x61,0x7a,0x7f,0x75,0x8e,0x78,0x52,0xd9,0x48,0x37,0x32,0xe3,0x8e, + 0xb8,0x2e,0xb9,0xd0,0x83,0xc,0xda,0xb5,0x0,0x91,0xec,0x1f,0xd0,0x7b,0xb3,0xba, + 0x4d,0x94,0xd5,0xce,0x24,0xca,0xd2,0x8,0x59,0xa5,0xfe,0xd7,0xc1,0xda,0x85,0x28, + 0xe9,0xed,0x9c,0x38,0x13,0xbb,0x1a,0x3c,0x74,0x20,0xea,0x96,0x33,0x49,0x8d,0xa1, + 0x78,0x3a,0x11,0x32,0x4b,0xc9,0x7b,0xc4,0x5c,0xcb,0x68,0x50,0x1b,0x80,0x36,0x43, + 0x1f,0xe8,0x6b,0x84,0xc1,0x63,0x4,0x7a,0x60,0x62,0x1b,0xb3,0x1c,0xa2,0x1c,0x93, + 0xc7,0xe9,0x81,0x7e,0xb8,0x68,0x4f,0xe,0x87,0x5e,0x73,0xe7,0x33,0x44,0x55,0x9e, + 0x2d,0x80,0x81,0x81,0x8f,0x30,0x98,0xc1,0x40,0x8,0x9d,0x48,0xab,0xc0,0x29,0x6a, + 0x72,0x8e,0x8f,0x46,0xc,0x8c,0x44,0x4b,0xcb,0xa8,0xbb,0x58,0x13,0x45,0x80,0x7e, + 0x9e,0xaa,0x6a,0xea,0xc5,0xc1,0x8c,0xc,0x87,0xf8,0x1d,0x49,0xd7,0x35,0xb8,0xc6, + 0x84,0x79,0x54,0x73,0x15,0x33,0x44,0x5c,0x4d,0x6d,0x9c,0xab,0x95,0xaf,0x7b,0x92, + 0x3e,0xbc,0xfd,0x91,0x9f,0xfc,0xb1,0x79,0x71,0x71,0xf,0xe8,0xe7,0x34,0x46,0xca, + 0xf6,0x69,0x76,0x49,0x1d,0x82,0x36,0xa8,0x8c,0x6d,0xf4,0x8d,0xe4,0x38,0xf,0xf8, + 0x40,0x2f,0xc4,0xb7,0xf3,0x1b,0xa6,0x96,0xeb,0x50,0x14,0xf3,0xcc,0x13,0xad,0x74, + 0x8,0xac,0x1a,0x88,0x40,0x87,0xef,0xe7,0x37,0x78,0xb4,0xe3,0x6b,0x52,0x84,0xe6, + 0xf8,0x19,0xe1,0xa6,0x93,0x7c,0xe0,0x41,0x8d,0xf6,0x6c,0xaa,0x35,0x89,0x9d,0xa6, + 0x5e,0x45,0x77,0x5c,0xdb,0x81,0x9,0x71,0xd8,0x37,0x5d,0x99,0x55,0xc1,0x27,0xc7, + 0x5,0xd3,0x26,0x3c,0xfc,0x36,0x62,0x23,0x6,0x68,0xdf,0xb9,0xf5,0x9e,0xdd,0x8f, + 0x5,0x26,0x35,0x6a,0x36,0xa3,0x84,0xaf,0x12,0x4d,0x6,0xa8,0x2,0x2b,0x65,0x9a, + 0xdc,0x7a,0xd,0xfa,0x63,0xda,0xf4,0x81,0x7a,0x17,0x28,0x93,0x36,0xe5,0x70,0xc9, + 0x50,0x6c,0x73,0x3b,0x40,0xe6,0xbe,0xb0,0x75,0xb9,0x17,0x31,0x13,0xa6,0x8c,0xb4, + 0xd0,0xd4,0x1,0x54,0x9e,0xb4,0x2d,0x10,0xd5,0xc4,0xe6,0x42,0x98,0x92,0xc7,0x77, + 0xda,0x3b,0x2f,0x17,0xee,0xd1,0x9d,0xcd,0xf3,0xc,0x7c,0xc7,0xfd,0xf3,0xdd,0x5e, + 0xf4,0xfa,0xfb,0x8e,0x2e,0x6c,0x47,0xe,0xfb,0x21,0x78,0x1c,0xff,0x73,0xfa,0x8c, + 0x93,0x4c,0xf2,0x49,0x3a,0x39,0x9,0x9e,0xfc,0x77,0xb8,0x1e,0x7c,0xe3,0xf5,0xc3, + 0xdf,0xdb,0x40,0x35,0xfc,0x30,0xe4,0xec,0x38,0xa8,0x76,0xc6,0xde,0x4a,0x62,0x30, + 0xf2,0xe3,0x4,0x55,0x6e,0x4,0x43,0x32,0x76,0x5a,0x58,0x22,0xb6,0x1,0x32,0x90, + 0x4c,0x61,0xe4,0xeb,0x74,0xc8,0x74,0xaa,0xc4,0xa5,0x34,0x99,0x7e,0xcd,0xae,0x72, + 0xe6,0x3b,0x1d,0xd1,0x98,0x2,0x4d,0x91,0x33,0xa4,0xea,0xb6,0x29,0xcb,0x45,0xd1, + 0x39,0x16,0xeb,0x1c,0x4,0xbd,0xe,0x6e,0xa9,0xf9,0x44,0xe3,0xef,0x2e,0xd4,0xac, + 0x4e,0x83,0x2e,0xdf,0x1c,0x2d,0x9e,0x1,0xea,0x23,0x86,0xca,0x6f,0x16,0x34,0xf8, + 0xfa,0xbf,0xcb,0x88,0x26,0x29,0x93,0x38,0x70,0x75,0xa3,0x6,0xbb,0xfa,0x98,0x69, + 0xcc,0x6d,0x2b,0xbc,0xc3,0xe6,0xbd,0x5d,0xf3,0x3c,0x72,0x72,0x62,0xa2,0x3f,0x37, + 0x12,0xd5,0x94,0xd8,0x54,0x2e,0xc9,0x57,0x2f,0xbe,0x8b,0x6d,0x1,0x6a,0x8f,0x33, + 0xb2,0xf4,0x81,0xc5,0x6f,0x95,0x6d,0x38,0xd9,0x29,0xa4,0xe6,0x4,0xbb,0x80,0xfd, + 0x80,0xb6,0x7,0xb5,0x87,0xc3,0xec,0x43,0x9b,0x14,0x2e,0x83,0x5a,0x12,0xec,0x56, + 0xa4,0xc6,0x74,0xef,0x23,0xad,0x67,0x44,0xb8,0x9c,0xa1,0x48,0x5f,0xda,0xa8,0x61, + 0xac,0x29,0xe8,0xbc,0xfd,0x3,0x4f,0x62,0x13,0x9d,0x76,0xaf,0x16,0xf2,0x7b,0x95, + 0x1d,0x1c,0xb2,0x97,0xe8,0xe4,0x38,0xd5,0x99,0x26,0xf5,0xfa,0xa2,0xa2,0xc9,0xe9, + 0x6,0x4,0xfb,0x5d,0xa1,0x7d,0xc,0x5,0xd2,0x4a,0x32,0x2f,0xb9,0x45,0x31,0x21, + 0x30,0xf4,0xdb,0x90,0xf7,0x73,0xc4,0x2a,0xaf,0x20,0xe,0xa2,0xb7,0x59,0x51,0x8d, + 0xbb,0x80,0x63,0x9b,0x2d,0x2b,0x54,0x74,0x92,0xa7,0xbd,0x4,0x3,0x12,0xd3,0xdb, + 0x76,0x5e,0x21,0xa2,0x66,0x1d,0xdf,0xc3,0x35,0xa4,0x3d,0x57,0x63,0x1a,0x71,0x73, + 0x9,0x6,0x57,0x34,0x67,0xf1,0x77,0xc4,0x27,0xef,0xef,0x49,0x6b,0xa0,0xff,0x46, + 0xfa,0x59,0x86,0x1e,0xa8,0x3a,0xf1,0x70,0xb0,0xdc,0x33,0xa2,0xf1,0xfe,0x3d,0x90, + 0x7d,0xe3,0xad,0x5e,0xa,0xf7,0x29,0xd9,0xcd,0xf,0xf9,0x90,0x47,0x3d,0xf4,0x42, + 0xc,0xed,0xc2,0x11,0x44,0x9b,0xcd,0xe,0xb6,0x96,0x9d,0xe3,0x56,0x10,0xa2,0x69, + 0x70,0x81,0x5e,0xd5,0x17,0x53,0x12,0x15,0xbd,0x58,0x50,0x52,0x76,0xf9,0x96,0x56, + 0x6e,0x86,0x49,0x1c,0xb4,0xa0,0x5,0xdb,0x67,0xd9,0xde,0xa6,0xa2,0x4f,0xf7,0x64, + 0xd3,0x3e,0xec,0xd1,0xc6,0xd6,0x79,0x40,0x2b,0x1a,0x3f,0x82,0x35,0x8a,0x4e,0x6d, + 0x69,0xe8,0x9c,0x26,0xc1,0x20,0x12,0x85,0xa6,0x2b,0xf2,0xa6,0x4c,0xe5,0xee,0x58, + 0x39,0xbb,0xe4,0xee,0xec,0xc9,0x15,0xd4,0x9e,0x31,0xa3,0x45,0x68,0xca,0x54,0x47, + 0xaa,0xf3,0x55,0x5,0xb1,0x1,0x4c,0x92,0x15,0xc1,0x5c,0x72,0xcc,0x2c,0xe6,0xb6, + 0x7,0x5,0x67,0x7b,0x56,0x5a,0xd2,0x27,0x6e,0x3c,0xa5,0x42,0xfc,0xcf,0x73,0xa1, + 0x90,0x13,0x22,0xe1,0x97,0x72,0x16,0x81,0xaf,0x6e,0xc7,0xa8,0xf4,0x4c,0x81,0x18, + 0x23,0x18,0x84,0xe1,0xc3,0xfc,0x15,0x33,0xd3,0xcd,0xec,0xa0,0x82,0x3,0x20,0xea, + 0x69,0xcf,0xe8,0x47,0x6,0xe3,0x11,0x32,0xb4,0xb4,0xd4,0xf,0x4c,0xd5,0xe,0x1e, + 0x8a,0x0,0xc,0x59,0x60,0x4d,0xb3,0xe6,0xa3,0x9e,0x7f,0xef,0x67,0xd,0x83,0x4, + 0x75,0x30,0x7,0x1f,0xfb,0x53,0x78,0xd1,0x7f,0xca,0xe0,0x8f,0xa6,0x10,0x56,0x2f, + 0xc8,0x98,0x53,0x35,0x35,0x59,0xe6,0x42,0x44,0x4e,0xaa,0x66,0x9f,0xd1,0x43,0xe5, + 0x34,0x95,0xa7,0x69,0x9c,0xa1,0x9a,0x9d,0x2f,0xca,0x4d,0xd5,0x3a,0x3b,0xfd,0x20, + 0xa0,0xbb,0xaf,0x1d,0xd,0x3a,0x2,0xdd,0x80,0xba,0x86,0x85,0xe3,0x95,0x56,0x13, + 0x23,0xf6,0x18,0x92,0xbd,0xda,0x1e,0xa0,0x19,0x5d,0x78,0x42,0xf8,0xf4,0xc5,0xbb, + 0xc,0x0,0x4,0x3d,0xc2,0x88,0x38,0x28,0xda,0xc0,0x41,0x92,0xf3,0x71,0xd7,0x32, + 0xa7,0x35,0x78,0x8b,0x62,0x79,0x75,0x8f,0xfb,0x46,0xa,0x83,0x4c,0xee,0xca,0xdb, + 0xd,0x93,0x2a,0x6b,0xd1,0xc7,0x76,0x73,0xef,0x12,0x6e,0x16,0x85,0x9c,0x1c,0x60, + 0x10,0x55,0xf3,0x9a,0x88,0x7e,0xfb,0xb,0xdd,0x14,0xb3,0xca,0xd4,0x8,0x4d,0x1a, + 0x1a,0xe9,0xb1,0x1e,0x23,0x86,0x36,0xc8,0x74,0x59,0x4b,0x2b,0x47,0x89,0x75,0x0, + 0x81,0x8,0x85,0x40,0xad,0xea,0xe1,0x3a,0xe9,0x44,0x75,0xa5,0xbf,0x5c,0xed,0x40, + 0x1b,0xad,0x56,0xf9,0xe5,0x96,0x7c,0x44,0x79,0xa4,0xa3,0xc5,0x86,0xd6,0xd,0xc6, + 0x34,0x5f,0x31,0x81,0x8b,0x57,0xb1,0xfd,0xc8,0xd1,0xbc,0x37,0xdc,0x1c,0x93,0xc1, + 0x3b,0x99,0x12,0x25,0x8d,0x7a,0xa3,0x9c,0x97,0x35,0xc6,0xa8,0x16,0xda,0x45,0xf1, + 0x3a,0xd8,0x48,0xc6,0xdb,0xfe,0x7c,0xed,0x39,0x8a,0x20,0xc,0x27,0xd2,0x83,0xc3, + 0x36,0x8b,0x8,0x33,0x10,0x1f,0x12,0x4b,0x74,0x12,0x6,0x6,0x9d,0x7,0x34,0x19, + 0xd2,0x74,0x84,0x6a,0xd9,0x51,0x8b,0xb,0x5b,0x72,0xb0,0xb9,0x7f,0x8f,0x8e,0x95, + 0x31,0xa0,0x4f,0xcc,0x59,0x56,0xc8,0x2c,0x22,0xfa,0x79,0x1a,0x74,0xbd,0xce,0xe7, + 0x76,0x80,0x83,0x7b,0x87,0x7,0x2d,0xb6,0xf5,0x92,0x4e,0x8a,0x55,0x38,0xf4,0xbf, + 0xce,0xa,0x68,0x3b,0x29,0xfa,0x5f,0x3e,0x7e,0xfc,0x5e,0x55,0xf5,0x5f,0xbd,0xff, + 0x47,0x1f,0x4d,0x99,0xc5,0x3e,0xd6,0x93,0x19,0x25,0xdc,0xa5,0xe3,0x54,0xf7,0xb0, + 0x3e,0x34,0x4d,0xb0,0x7b,0xb2,0xa3,0x43,0x9c,0x75,0xb0,0x6b,0x12,0xd2,0xbf,0xbf, + 0x87,0xad,0xb5,0x50,0x13,0x2,0x93,0xb,0x6c,0xad,0x43,0xc9,0xbe,0x99,0xbd,0xec, + 0xcd,0xe7,0x0,0xbb,0x84,0xed,0x80,0xe3,0xdb,0x21,0xd9,0x9b,0xba,0x98,0x7a,0x56, + 0x65,0x26,0x35,0xc4,0x40,0x70,0x7c,0x7a,0x63,0x62,0x33,0xb9,0xd,0xea,0x2d,0xc1, + 0x64,0x30,0x8c,0x55,0x1f,0x41,0xc9,0x78,0xac,0xee,0x51,0x0,0x60,0x18,0xaf,0x81, + 0x3b,0xbc,0xd2,0x95,0xdf,0x2b,0xe,0xed,0x42,0x97,0x8f,0x2d,0xb8,0xe5,0x30,0x83, + 0x6b,0xb0,0x89,0xab,0x8e,0x7e,0x4e,0x6a,0x7f,0xe0,0x5c,0x35,0xa7,0xc3,0x30,0x23, + 0x87,0x86,0x28,0x74,0x21,0x8e,0x59,0x6f,0xdd,0x28,0xf,0x24,0x1d,0xf5,0x2a,0x4, + 0x73,0x4a,0x7c,0x10,0x20,0x79,0xb,0xad,0xa7,0x45,0x4c,0x62,0x30,0x7b,0x4f,0x51, + 0xe0,0x6b,0x4,0xdf,0x4b,0x7f,0xe1,0x76,0x96,0x53,0x4d,0xfe,0x89,0x6b,0xb1,0xcf, + 0x6d,0x9a,0xa8,0x57,0xd0,0x6e,0xa5,0x50,0x23,0x52,0xb5,0x3f,0x49,0x61,0xce,0x0, + 0xb1,0xf6,0xec,0x77,0x68,0xa,0x58,0xbc,0x58,0xe7,0x8b,0x48,0xea,0x4e,0xc9,0x2a, + 0xd2,0xcf,0x90,0xdd,0xac,0x44,0xb4,0xae,0xcd,0x6a,0xb7,0x2a,0xc8,0xa7,0x7a,0x6e, + 0xfb,0xa8,0xe3,0xc3,0xbe,0xb7,0x36,0xb7,0xdc,0x5b,0x3c,0xe3,0x95,0x89,0xc7,0x87, + 0xbc,0x6d,0xdb,0xf,0x55,0xcd,0xb3,0x3c,0x63,0xb9,0x91,0x91,0xe7,0xb2,0x39,0x42, + 0x5c,0xba,0x2a,0x68,0x6f,0x60,0x13,0x76,0xd7,0x3c,0x7,0x87,0xa,0xc6,0xb5,0xa1, + 0x2f,0x93,0x43,0xad,0x9a,0xc7,0xa1,0xc6,0xe9,0xe2,0x23,0x29,0x63,0x86,0xa3,0x51, + 0xc3,0xdc,0x25,0x30,0xaf,0xa0,0xc9,0x3b,0x4,0xfb,0x6a,0x50,0x83,0xfc,0xe2,0xf5, + 0xaa,0x2b,0x16,0xc1,0xf5,0x1a,0xf1,0xc8,0xe,0xd7,0x4,0x37,0xb1,0x7,0x57,0xc6, + 0xcc,0xa7,0x40,0x26,0xd7,0xf4,0x23,0x86,0x6b,0x43,0x32,0x5d,0x87,0x9b,0xd8,0x5c, + 0xf0,0xd8,0x20,0x3c,0x7e,0x56,0xf1,0x33,0x20,0xd0,0x50,0xaf,0x43,0x4,0x25,0xe6, + 0x22,0xcd,0x2d,0x64,0x70,0x1f,0x4,0x15,0xd4,0x86,0x2e,0x5d,0x10,0x6,0xcd,0xc, + 0x54,0xaa,0xa7,0x10,0x8,0xc2,0x3c,0x72,0xc6,0xb0,0x4d,0xa1,0xea,0x89,0xb4,0x16, + 0x8f,0x4c,0x5a,0xb0,0x43,0xb8,0x88,0x29,0x48,0xb3,0x7b,0x44,0x28,0x9e,0x99,0x4c, + 0xf5,0x86,0xfc,0xd1,0x4,0x58,0xd0,0xc9,0x46,0x32,0x1b,0xcc,0x9a,0x49,0x56,0x14, + 0xf7,0x30,0x99,0x8b,0x72,0x66,0x3b,0xf0,0xba,0xa3,0x23,0x37,0x82,0xd3,0x3e,0xe0, + 0x25,0x4,0x51,0x78,0x95,0x18,0x4b,0x8a,0x2a,0x66,0xa4,0x64,0xb6,0xac,0xa4,0x26, + 0xbe,0x16,0xaa,0x89,0x4d,0x35,0x3,0x3b,0xf4,0xa4,0xc4,0x44,0x6a,0xd0,0xdb,0x71, + 0x9a,0xf0,0xa7,0x2,0x97,0x6,0x67,0x44,0xb2,0xdd,0xf0,0x23,0x64,0x95,0xc5,0x32, + 0xa6,0x42,0x24,0x5,0x56,0xf5,0x2d,0x43,0x9f,0x5d,0x41,0xc1,0x66,0xb0,0x11,0x12, + 0xce,0x41,0x86,0x2b,0x1d,0x97,0xb,0x18,0xdf,0xe,0x78,0x85,0xbe,0x35,0x61,0xa8, + 0x36,0xed,0xd0,0x35,0xfb,0xfb,0xa8,0xa1,0xc,0xfa,0x87,0xc,0x36,0xc6,0xd0,0x4e, + 0x34,0xff,0xc6,0x6a,0xfd,0xc4,0x25,0xa1,0x8a,0x58,0x7b,0xbd,0xde,0xac,0x4a,0x7, + 0xc0,0x7e,0x8e,0x10,0x68,0xa9,0x44,0x3b,0x29,0x8,0x9f,0x5,0x4f,0xa7,0x3d,0x3a, + 0x7c,0x60,0xa6,0x53,0x43,0x78,0xda,0xef,0x71,0x4d,0x8,0x9f,0x80,0xe8,0x9,0x8, + 0xb4,0x1d,0x48,0xdf,0x3b,0x48,0x90,0x5c,0x84,0x64,0x2c,0xdf,0xa9,0x41,0x98,0x46, + 0xe,0x0,0xca,0x28,0xdc,0x83,0xde,0x30,0xde,0xf7,0xe6,0x2,0x11,0xcd,0xb1,0xba, + 0x72,0xee,0x47,0xc5,0x1d,0x92,0x59,0x34,0x53,0x44,0xd2,0x7f,0x7b,0x8,0x8,0x47, + 0x96,0x5f,0x75,0xb5,0xfa,0x93,0xb,0x49,0xe2,0x4a,0x32,0x5e,0x12,0xba,0xa0,0xdd, + 0xcd,0x28,0xf,0x9,0x85,0x85,0x52,0x60,0x7c,0xcd,0x17,0x33,0xc4,0x29,0xf2,0x27, + 0xf7,0xcf,0x67,0x73,0x1e,0xb,0xf1,0x90,0xc8,0x14,0xcb,0x8c,0x67,0xaa,0xe9,0x5e, + 0x6e,0x2,0x19,0x1a,0xfd,0x85,0x71,0xbd,0x9a,0xb2,0x32,0x31,0x4d,0xe3,0x17,0xa2, + 0x58,0x9d,0x45,0xd7,0x90,0xd9,0x15,0x93,0xdd,0x3c,0x84,0x40,0xe3,0x13,0x34,0x91, + 0x86,0xc,0x38,0xba,0xe7,0xb2,0xd7,0x66,0xda,0xf8,0x6e,0xee,0xa2,0x56,0x8d,0xbb, + 0x95,0xc2,0x5d,0x3d,0x61,0x20,0xc9,0xb0,0x46,0x7d,0x7d,0x84,0x1f,0x7b,0x4d,0x8f, + 0x5e,0x4d,0x43,0x9a,0x90,0x4a,0xef,0x98,0x52,0xd0,0x0,0xef,0x23,0x8b,0xb1,0x91, + 0xad,0xbb,0x74,0xde,0x71,0x61,0xe5,0x12,0xfd,0xfb,0x6,0xcc,0x37,0x76,0x3d,0xad, + 0x7a,0xf5,0x9e,0x64,0x69,0x23,0x4f,0x50,0x9,0x17,0xa0,0x5c,0x86,0x47,0xe2,0xd2, + 0x66,0x86,0x25,0x26,0x58,0x59,0xcb,0x7b,0xda,0x24,0x36,0xf,0xc4,0xc2,0x5,0x63, + 0x1a,0x2f,0xc1,0xa1,0x73,0x87,0xb7,0x65,0xc2,0xa4,0x30,0x54,0xef,0xb0,0xfd,0x6b, + 0x9c,0x19,0x91,0xb,0x65,0x8,0xa6,0xe4,0x71,0x63,0x15,0x97,0x76,0xa4,0x64,0x5f, + 0xb0,0x7c,0x12,0xa4,0x4a,0xef,0xa1,0x67,0x31,0xa6,0x4,0x4c,0x7f,0xe6,0x45,0x41, + 0xda,0x12,0xc5,0x41,0x87,0xe5,0x3d,0xe9,0xbb,0x36,0xe9,0x92,0xd5,0xc,0x7c,0x72, + 0x3c,0xcf,0x34,0x3,0x48,0x47,0xda,0x72,0x7a,0x74,0xc9,0x80,0xb,0x44,0xcf,0xe8, + 0xc9,0x8e,0xa2,0x5f,0x3,0x67,0x22,0x64,0x53,0x61,0x8a,0x9a,0xe5,0x2,0x41,0x30, + 0x6c,0x36,0x5a,0x83,0xc,0xc4,0x94,0xbd,0x7f,0x37,0x6,0xc7,0x74,0x86,0xcc,0x40, + 0x4e,0x49,0x4,0x5d,0x2a,0xd7,0x90,0x8,0xb0,0x17,0x3a,0x7a,0x60,0x61,0xd2,0xd5, + 0xaf,0x3a,0x51,0xbb,0x51,0xc3,0x35,0x62,0x50,0xd1,0x6f,0x3a,0x6d,0x83,0xfc,0xb3, + 0x2c,0xbc,0xab,0x11,0x4a,0x0,0x83,0x83,0x5e,0x42,0xa8,0xd0,0xaa,0x51,0xc4,0x2a, + 0x9a,0xb4,0x68,0x88,0xa0,0xa0,0x42,0x97,0x5d,0xb9,0x14,0x88,0xdf,0x39,0xc8,0x42, + 0x4e,0xde,0xb7,0x51,0x35,0x6d,0xa2,0x5f,0x66,0xbd,0x5d,0x2a,0x34,0xb5,0x75,0xa8, + 0xe2,0xc,0x89,0xe,0x84,0xd9,0x47,0x85,0x3a,0x93,0x41,0xc5,0x61,0x90,0xd1,0xe4, + 0xb4,0x7,0xf,0xc,0x8e,0x3e,0xcb,0x82,0x36,0xe4,0x35,0x2d,0x8f,0xe7,0xc8,0x72, + 0x57,0xa0,0x82,0xb,0x2e,0xdc,0x15,0xfa,0x5f,0xfe,0x63,0xff,0xf1,0xc7,0x6f,0xff, + 0xeb,0x7f,0xfb,0x9e,0x84,0x47,0xa,0x44,0xea,0x15,0xc6,0x86,0x3f,0xdc,0x94,0x44, + 0xc5,0x18,0x44,0x1a,0x32,0x68,0x5b,0xcd,0x8f,0xbd,0xca,0x8e,0x5d,0x8c,0x26,0x27, + 0x38,0x26,0x8,0x7e,0x78,0xbb,0x34,0xa8,0xc2,0xab,0x34,0xf4,0x8,0x26,0xb,0x8a, + 0x16,0xc0,0x5d,0x56,0x33,0x47,0xee,0xea,0xda,0x88,0x0,0x9a,0x2f,0x75,0x8a,0x42, + 0xdc,0xf5,0xcc,0x75,0xf2,0xae,0x2f,0xeb,0xdd,0x99,0xae,0xb7,0x5e,0xf,0x5c,0x0, + 0xc8,0xfe,0xac,0x10,0x52,0xa8,0x7d,0x2c,0xd1,0xaa,0x83,0x7b,0xbf,0x6a,0x45,0x41, + 0x6e,0xd3,0x24,0x1b,0x7,0x7c,0x84,0x9c,0x4a,0xcd,0x94,0x5c,0xfe,0xd8,0x94,0x1a, + 0xa5,0x37,0x6b,0xbe,0x2b,0xf4,0x6b,0x57,0x94,0xc3,0xb4,0xc,0xa4,0xaf,0xac,0x2e, + 0x87,0x1b,0x31,0xba,0xbc,0x62,0x52,0xf1,0x90,0xb0,0xac,0x6f,0x6e,0xc2,0x3c,0xdd, + 0xf7,0x48,0x84,0xa8,0x55,0x15,0xbc,0x17,0xad,0xa8,0x4,0x30,0x90,0xe3,0x62,0xbc, + 0x4c,0xd4,0x25,0x19,0xe8,0x23,0x88,0xde,0x32,0x4c,0xd,0xf,0xd6,0x8b,0x43,0x22, + 0x41,0xb7,0x10,0x50,0x29,0x36,0x34,0x69,0x9f,0xd5,0x1c,0x4,0x1b,0xdd,0xbf,0x9d, + 0xc6,0xe5,0x41,0x37,0xd1,0x41,0xca,0xe9,0xa1,0xdd,0x5c,0x26,0xfa,0x15,0x25,0x2b, + 0xe,0xa8,0x27,0xea,0x5,0xff,0x64,0x52,0x9a,0x4,0x5e,0x20,0x9b,0xac,0xa6,0xaf, + 0x7d,0x75,0x7a,0xf8,0xb4,0x47,0x31,0xaa,0x36,0x60,0xc6,0xc2,0xb2,0xae,0x1b,0x25, + 0xa2,0xa7,0x36,0xc4,0x84,0xaf,0x61,0x1c,0x95,0x9d,0xdd,0x75,0x7a,0xc5,0x72,0x21, + 0x95,0xbf,0x18,0xd2,0x8f,0xaa,0x28,0x6,0x34,0x27,0x2c,0xaa,0xe4,0x5f,0xa8,0xee, + 0x2c,0x85,0x2d,0x33,0xee,0x80,0xc9,0x23,0x7d,0x65,0x95,0x97,0x25,0x12,0xab,0x47, + 0xa5,0x4e,0x38,0xc3,0xcc,0xf2,0x94,0x11,0x11,0xe1,0x2,0x4,0xf4,0xcc,0xcd,0xe, + 0x9b,0xde,0x6e,0xc0,0x88,0x7e,0xfb,0x75,0xb4,0x9,0x47,0x53,0x38,0x43,0xe7,0xcb, + 0x9b,0xcc,0x6d,0x8d,0x90,0x3b,0x6,0x7e,0xac,0xb9,0xcf,0x81,0x36,0x27,0x4c,0x13, + 0xda,0x48,0x5d,0x5f,0x4c,0x86,0x9d,0xeb,0x80,0xa3,0x54,0x3b,0xbf,0xfd,0xfb,0xff, + 0xf6,0x7d,0x3b,0x0,0x51,0x34,0xf0,0xd1,0x48,0x5e,0x8d,0xf9,0x2f,0x9e,0xf3,0x98, + 0x34,0xc0,0x55,0xad,0x49,0x36,0x97,0xba,0xde,0x2d,0xe2,0xa2,0x4,0x32,0xe,0x6d, + 0x10,0x17,0xdc,0x40,0x53,0xd2,0x1a,0x10,0xf9,0xad,0x50,0x85,0x6c,0x25,0xc4,0x81, + 0x2b,0xec,0x60,0x25,0x48,0x33,0x38,0x23,0x4b,0x59,0xd,0x1,0xbf,0x85,0x6b,0xe4, + 0xa3,0x65,0xcd,0x81,0x21,0x6e,0xd5,0xb9,0x7c,0x7,0xa2,0xda,0x68,0xc5,0xba,0x29, + 0x47,0x5d,0x3,0x34,0x0,0x33,0x2b,0xa3,0x6,0x19,0x74,0x1b,0x43,0xad,0x1c,0x9b, + 0xf0,0x92,0x92,0xae,0x54,0x57,0xdb,0x18,0xc5,0xa1,0xeb,0x3f,0x39,0x82,0x2d,0x5b, + 0x63,0x4d,0xde,0xfc,0x9e,0x20,0xd8,0xf6,0x14,0xd8,0x72,0xcb,0xc5,0xb2,0x79,0x5, + 0xa0,0x3a,0x94,0xef,0xf2,0xbc,0x15,0xf2,0xc5,0x2f,0xa4,0x84,0x87,0xd6,0x1,0x6, + 0x42,0x24,0xb,0x7,0x96,0xa3,0xfc,0xb2,0x5c,0x9b,0x96,0xa4,0x33,0xb2,0x5c,0xb6, + 0xf5,0x51,0xaf,0x94,0x3,0x9f,0xf9,0xe6,0x49,0x71,0x53,0xaf,0x5,0xa7,0xca,0x41, + 0xde,0x73,0xe1,0x0,0x9e,0x63,0x68,0xbf,0x1e,0x90,0xc8,0x64,0x62,0xa3,0x3f,0xf, + 0x14,0x46,0x7,0x45,0x23,0xb1,0xe2,0x94,0xed,0x62,0x6e,0xdf,0xe6,0x7b,0xb3,0x35, + 0x5c,0x27,0x7f,0x85,0xe1,0xfc,0x9d,0x6e,0x65,0x53,0x3b,0x45,0x1f,0xb4,0x80,0xb7, + 0x24,0x14,0xe5,0xb1,0xb5,0x66,0x62,0x66,0x61,0xf3,0x5,0x51,0xd1,0x93,0x16,0x5, + 0x42,0x39,0x33,0x27,0x30,0xfc,0x7d,0xfb,0x7a,0x2f,0xa,0x4b,0x14,0x42,0xd2,0xc9, + 0x83,0x85,0xe5,0x36,0xa2,0x4f,0xef,0x48,0x69,0xf3,0x1b,0xda,0x91,0x59,0x5b,0xeb, + 0x7f,0x42,0xec,0x10,0x61,0x7,0xd,0xac,0x77,0x15,0xb4,0x8b,0xab,0x3b,0x9,0x65, + 0x60,0xc7,0x18,0xe4,0x69,0x36,0x9b,0x55,0x88,0x8c,0x56,0x49,0x10,0x69,0x51,0xb9, + 0x33,0xd6,0x7d,0xe3,0xb8,0xe,0x48,0xb4,0x3e,0x28,0x62,0x5d,0xa8,0x78,0x7e,0x2a, + 0x55,0x39,0xe1,0x8f,0x56,0xb9,0x73,0x41,0x9f,0x29,0x13,0xba,0x48,0x1c,0xa0,0x49, + 0xe1,0x9a,0xf6,0x79,0x64,0xb6,0xb4,0x31,0xbe,0xbb,0x12,0xfc,0xfc,0xfa,0xb7,0x5f, + 0xfd,0xa9,0x9f,0xf8,0xf8,0xfb,0xbf,0xff,0x6f,0xde,0xff,0xca,0x9f,0xf8,0x89,0x8f, + 0xbf,0xff,0xaf,0xfe,0xcd,0x3b,0x52,0x53,0x5e,0x51,0x3b,0x15,0x78,0x99,0xb8,0xd, + 0x8,0x32,0x5a,0x8c,0x6c,0x35,0xdb,0x59,0x25,0x5b,0x11,0x12,0xe0,0x2f,0x9f,0xb0, + 0x49,0xd9,0xc4,0x81,0xa9,0x6e,0x7e,0xc7,0x39,0x4e,0xf9,0x20,0x35,0xea,0x7,0x8f, + 0xcb,0xd,0x29,0x56,0x8b,0x3f,0xc6,0x50,0x34,0xb0,0x54,0x4c,0x3e,0xb5,0x3,0xbb, + 0x6c,0x13,0x63,0x3c,0x43,0xd1,0x74,0xbf,0xdd,0xee,0x77,0x40,0xa3,0x98,0x9,0x9, + 0x6c,0x36,0x57,0xd7,0x1e,0xc9,0x18,0x6a,0x13,0xb6,0xb4,0x29,0x97,0xc,0xe3,0x73, + 0x1a,0x20,0x71,0xe6,0xac,0xe0,0xd8,0x7f,0x3e,0x90,0x31,0x17,0x44,0xcf,0x20,0x48, + 0x4d,0x6f,0xee,0xa3,0x38,0x5e,0xe5,0xd0,0xd1,0x31,0x60,0xf0,0x84,0x98,0x2a,0xc9, + 0x57,0x55,0x4e,0x24,0x5c,0x38,0x78,0x48,0x80,0x87,0xa2,0xca,0xcf,0x49,0x4c,0x3c, + 0xaf,0x61,0xd4,0xb4,0xd9,0xd8,0x56,0x8e,0xc6,0x1d,0x94,0xab,0x70,0x9e,0x2a,0xd1, + 0xbf,0xcb,0x61,0x9,0xa4,0x44,0x76,0xf8,0x6c,0x38,0xea,0xda,0x7f,0x27,0xd1,0xf9, + 0x1f,0xa3,0xdb,0xd8,0x64,0x3b,0x3a,0xd,0x55,0x6b,0x71,0x37,0x31,0xb0,0x34,0x28, + 0xa6,0x77,0x83,0xc5,0x8f,0x18,0x5,0x5c,0xd2,0xdd,0xec,0x6b,0x8,0x21,0xf4,0x63, + 0x50,0x12,0x7c,0x9,0x3c,0x33,0x6b,0x6d,0x72,0x65,0xf3,0x57,0x9a,0xcc,0x79,0xc4, + 0xc6,0x7e,0x10,0xc8,0xa4,0x85,0x59,0xd0,0xaa,0xf3,0xa8,0x78,0x8e,0xac,0x67,0xb9, + 0x25,0x71,0xa9,0x6,0x56,0xcc,0xe2,0xad,0xea,0xfa,0xa,0x96,0x30,0x77,0x9d,0x91, + 0x48,0xd6,0xc8,0x28,0xb3,0x6d,0xa2,0xfe,0x46,0x26,0x5f,0x15,0x7d,0x16,0xdc,0x46, + 0xc7,0x24,0xeb,0x60,0x48,0x70,0xea,0x3,0x4d,0x12,0x49,0x23,0x56,0x14,0xec,0x81, + 0xeb,0x4f,0xe8,0xa3,0x36,0x27,0xf,0x9c,0x4c,0x10,0x9c,0xf0,0xe0,0x84,0x4b,0x98, + 0x2e,0x37,0x1b,0xca,0xed,0x55,0xd,0x2b,0x17,0x21,0x96,0xb9,0x41,0xe1,0xba,0x4d, + 0x1a,0x10,0xac,0x6a,0xb7,0x3c,0xd,0x27,0xea,0xbe,0x49,0x73,0x3d,0x9,0x11,0x43, + 0x7b,0xe8,0xbf,0xfa,0xc7,0x7f,0xe2,0x43,0xd5,0xbd,0xda,0x7b,0xb1,0x1d,0xa1,0x88, + 0x20,0xfc,0x1,0x83,0x63,0xd1,0xb6,0x94,0xd4,0xc3,0x6c,0x5,0x18,0x6,0x7a,0xa2, + 0x7d,0x62,0xd4,0x50,0x69,0xe1,0x58,0x19,0x70,0x72,0x77,0x4b,0x8,0x3c,0xdc,0x9b, + 0x7a,0x85,0x56,0xbd,0x2c,0xaf,0x98,0x59,0x1e,0x85,0xe8,0x39,0x10,0x8e,0xd8,0xe1, + 0xc5,0x48,0x15,0xad,0xb5,0x54,0x3,0x77,0xb2,0x50,0xb3,0x81,0xfa,0x8c,0xfc,0xd8, + 0x5a,0xbd,0xfa,0xf4,0x78,0x27,0x98,0x55,0x35,0x59,0xb2,0x1a,0xee,0x5b,0x1d,0xaa, + 0x24,0xc,0xa0,0x24,0x6a,0xca,0xc0,0x7c,0xa6,0x3d,0xd0,0x8c,0x1e,0x4f,0x22,0x40, + 0xc,0x55,0x33,0xa4,0x37,0xc4,0xd1,0xbf,0x61,0xba,0x74,0x44,0x8b,0x0,0xad,0xc2, + 0x6a,0xba,0xdc,0xa7,0x2a,0x59,0x91,0x4,0x8a,0x5b,0x9f,0xf4,0xa1,0xd3,0xcf,0x7d, + 0x22,0xad,0xed,0x44,0xcd,0x7f,0x83,0x31,0xf4,0x35,0x21,0xb6,0x9e,0xff,0x46,0xc3, + 0x9a,0xd9,0x95,0xa2,0x40,0x91,0x3c,0x51,0xa,0xa9,0x49,0x49,0x68,0xb5,0x63,0x6, + 0x3f,0x87,0xc9,0x52,0x89,0xed,0x7c,0x43,0xb4,0x1f,0x21,0x9f,0x5b,0xc3,0x2c,0xfc, + 0x3d,0xd,0x74,0x17,0x7d,0x8c,0x24,0x9,0x47,0x25,0x23,0xbf,0xbf,0x7d,0xde,0xa5, + 0x62,0xe8,0xae,0x2a,0xed,0x86,0xd1,0xb4,0x1a,0xd0,0xd7,0xa0,0x9c,0x6f,0xbf,0xf9, + 0xa3,0xff,0xef,0xfd,0x37,0x7f,0xf4,0xff,0xbe,0x77,0x16,0xfd,0x44,0x7e,0x8e,0x69, + 0x17,0xc,0xb8,0x3c,0x30,0xb6,0xc4,0xac,0xac,0xbd,0x2a,0xc,0x63,0xbe,0xd0,0x70, + 0x8b,0xa8,0x57,0xb7,0xdc,0x7a,0xc3,0x4c,0x61,0xf3,0xa,0xa5,0xd0,0x58,0xda,0x14, + 0x92,0xc2,0xa6,0xe1,0xcb,0xf0,0x10,0xd9,0xe5,0x1,0x4d,0x34,0x23,0x3c,0x82,0xf5, + 0xcf,0xc2,0xa1,0xcc,0xc7,0x35,0x14,0x96,0x63,0x9b,0x55,0x1c,0x9c,0xec,0x6d,0xce, + 0x1b,0xe6,0xa1,0x37,0xc0,0x47,0xac,0x6f,0x78,0xb9,0x96,0x90,0x3,0xe5,0x50,0x7, + 0xcb,0x47,0x3f,0xd2,0x80,0x3c,0x6d,0x45,0xa5,0x6a,0x57,0xe1,0x62,0xd3,0x82,0x9c, + 0x24,0x26,0x59,0x2e,0x27,0x1b,0xd5,0x3f,0x92,0x33,0xe0,0x29,0x14,0xae,0xaf,0x1e, + 0x7a,0x56,0x92,0xfc,0xec,0xbd,0xa5,0xcc,0x24,0x70,0xd4,0xf9,0x82,0x8b,0xde,0x60, + 0x83,0x4b,0xbc,0xaa,0x8d,0x70,0x18,0xec,0xd,0xf7,0x8e,0x6f,0xe5,0x60,0x53,0xee, + 0x1c,0xb4,0xa5,0x5f,0x14,0x89,0x51,0x2a,0x38,0x86,0x31,0xf,0xc5,0x37,0x8d,0xfc, + 0x24,0x17,0x15,0x7a,0x1f,0x9f,0x4a,0x8c,0xa,0x42,0xdb,0x63,0xe1,0x4b,0xa6,0x9e, + 0x82,0xd4,0xce,0xa9,0x51,0xcf,0x94,0xdd,0xeb,0xae,0xe4,0x93,0x44,0x20,0xd5,0xb, + 0x5a,0xd0,0x37,0xeb,0xad,0x3e,0x6c,0x79,0x3a,0x9a,0x55,0x3a,0x7,0x6c,0xe3,0x7c, + 0x41,0x96,0xb5,0xb1,0xb0,0x9c,0x3a,0x85,0x79,0x67,0x97,0xce,0x29,0x7,0xea,0xd3, + 0xc6,0xfc,0x9e,0xf1,0x3f,0x6c,0x72,0xa3,0xcb,0x89,0x47,0x1,0x41,0xb9,0x83,0x92, + 0x30,0xd0,0xa4,0x9e,0x73,0x13,0xd3,0xbc,0x1a,0x36,0x13,0x2e,0xef,0x60,0x5b,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x3e,0x55,0x2a,0x61,0x92,0x11,0x6d,0x4,0xea, + 0xb9,0x9f,0xe6,0xa1,0xcd,0x86,0x64,0x90,0xb4,0x0,0x65,0xc6,0x3a,0xc6,0x58,0xaf, + 0xc6,0xf,0x51,0xf2,0xdd,0x20,0x39,0xe1,0x2d,0x8f,0x98,0x1e,0x48,0x16,0x1d,0xe, + 0xf3,0xcd,0x34,0xb4,0x28,0x3,0x1,0x84,0x18,0x59,0xcd,0xde,0x8d,0x39,0x17,0x1f, + 0xee,0x77,0x56,0x98,0xd5,0xa4,0x44,0x79,0xdb,0x56,0xd3,0xa7,0xb5,0x5d,0x79,0xfb, + 0x92,0x89,0x2,0xe1,0x44,0x5c,0xfb,0x6c,0xef,0xa,0x92,0x7b,0x54,0x18,0xba,0xe6, + 0x75,0x32,0x88,0x6c,0x6e,0x75,0x19,0x85,0x17,0x32,0xfd,0x59,0x5e,0x51,0x31,0xd6, + 0xbb,0x11,0xe7,0x20,0x92,0xb3,0xaa,0xf4,0x28,0xa3,0x87,0x74,0x39,0xba,0xbd,0xfd, + 0x28,0xc4,0x4d,0x91,0x4f,0xb7,0x51,0xd6,0xed,0x33,0xe0,0x6b,0x2,0x62,0x70,0x7, + 0x18,0x19,0xb,0x52,0x89,0x51,0x60,0x69,0x96,0x1b,0xd9,0xf7,0x2b,0xa,0x45,0x2f, + 0x9c,0xc6,0xb1,0x2,0x7,0x98,0xd4,0x4b,0x70,0xa2,0x42,0x4d,0x44,0xa,0x1c,0x8, + 0x6,0xa7,0xfe,0xc9,0x89,0xe8,0x10,0x96,0x8e,0x2d,0xc3,0x1f,0x88,0x13,0xa3,0xd3, + 0x1a,0x6,0x41,0x14,0x77,0x28,0x32,0x45,0xaa,0xab,0x43,0xbd,0x47,0x56,0x44,0x83, + 0xbc,0xe,0x54,0xeb,0xaa,0x81,0xd0,0x27,0x87,0x6d,0x54,0x41,0xe4,0xe1,0xbb,0x5a, + 0x9f,0xeb,0x9a,0x7b,0x8f,0x6c,0xb1,0x21,0x46,0xcf,0x6a,0xa8,0x24,0xae,0x60,0xda, + 0x8f,0x4d,0x78,0x27,0xfe,0xd1,0x7b,0xe6,0x13,0x4,0x8a,0x56,0xcd,0x96,0xbb,0x8a, + 0x69,0x5f,0x78,0xfa,0xee,0x80,0x40,0x75,0xc,0xc5,0x12,0x33,0x8a,0x54,0xad,0x90, + 0xcb,0x64,0x9e,0x6d,0x13,0xbc,0x18,0xe,0x52,0xf0,0xb1,0xa3,0xd9,0xc6,0x55,0xcd, + 0x6e,0x82,0xf1,0xce,0xec,0xf3,0x62,0xc1,0xaa,0x5e,0x9c,0xdd,0x2d,0x1c,0xe,0x4, + 0x1d,0x30,0x3e,0x43,0xa1,0x71,0x36,0x98,0x7a,0xcf,0xc4,0x23,0xec,0x38,0xbd,0xba, + 0x70,0xe3,0x46,0xd8,0xa1,0xe,0x23,0x7b,0xf6,0x9e,0xa9,0xda,0x7e,0xa2,0xb5,0xf4, + 0xd9,0x89,0x96,0x46,0x50,0xe3,0xe0,0xb4,0x26,0xaa,0x78,0x25,0xd3,0x1f,0x57,0xef, + 0x67,0xba,0x12,0x5f,0x67,0x1d,0x73,0x3a,0x1,0xa0,0x95,0x53,0x10,0xe9,0xac,0x1a, + 0xf4,0x60,0xed,0xbd,0xd7,0x59,0x3f,0xc2,0x99,0xfa,0x15,0xc6,0x92,0xc1,0xd6,0x6f, + 0x2e,0x71,0xee,0x92,0xcd,0xe4,0x83,0xc4,0x5a,0xa6,0xa2,0x64,0xe3,0xe4,0x8e,0x2b, + 0xac,0x41,0x3c,0xdf,0x41,0x4d,0x68,0x67,0x1b,0x5d,0x23,0x39,0x63,0x7,0x3a,0x1b, + 0xf7,0x32,0x22,0xb1,0x8c,0x67,0x4d,0x7d,0xef,0x35,0x6,0x5b,0x81,0x18,0x96,0xfb, + 0x2d,0xac,0x3d,0x41,0x11,0xf8,0x61,0x90,0x1,0x1d,0x79,0xb4,0xd8,0x75,0x8b,0x84, + 0xb9,0xd6,0xcd,0x83,0x16,0xc1,0x92,0x51,0xc6,0xe8,0xac,0x9f,0x7d,0xd8,0x62,0x69, + 0x8a,0x58,0x30,0xd,0x79,0x1b,0xc3,0xce,0xe1,0x76,0x2b,0x3a,0xa3,0x2d,0x57,0xcf, + 0xd8,0x1a,0x6b,0x8,0x8a,0x59,0xe4,0x88,0x53,0x4f,0xf3,0xbe,0xfc,0x72,0xd1,0x65, + 0xe4,0x9d,0x9d,0x89,0x37,0xfc,0x3b,0x30,0x16,0x85,0x47,0x2b,0x52,0xf5,0x8c,0xe6, + 0x94,0xb1,0xd7,0xec,0xcb,0xbe,0x76,0xda,0x55,0x2a,0xf4,0xd2,0xc4,0x42,0xc2,0x19, + 0xad,0x30,0xa8,0x2e,0x65,0x11,0x79,0x12,0x55,0x57,0x21,0x82,0x14,0x1,0x88,0xd1, + 0x27,0x2b,0x8,0x93,0x1,0xcb,0x74,0x90,0x60,0x13,0xf4,0xa0,0x8d,0xd4,0x49,0x5, + 0x45,0x9d,0x4f,0xe5,0x62,0xb9,0xbb,0x93,0x1a,0x5a,0x16,0x3a,0xb,0x79,0xdc,0xd0, + 0x5d,0x85,0x1f,0x3a,0x75,0xfe,0x37,0xe6,0x7c,0x65,0x12,0x87,0x91,0xcc,0x70,0x1a, + 0x39,0x14,0x3d,0x67,0x17,0x1a,0xe1,0x46,0x81,0x88,0x30,0x6d,0xa1,0x5,0xb9,0x76, + 0xa8,0x86,0x67,0x1a,0x2b,0xc9,0xa1,0x5a,0x9,0x8a,0x4d,0xc9,0xfa,0x8e,0xe,0xe2, + 0xb9,0x38,0x88,0xf4,0xee,0x9a,0xa,0x5b,0x27,0x11,0xba,0x9b,0x76,0x26,0xb9,0xc3, + 0x7c,0x9,0xd0,0xd,0x92,0x4e,0xaa,0x77,0xe8,0xcc,0x21,0x41,0x6b,0x6d,0x4c,0xa9, + 0x7,0x56,0x6d,0xf3,0x98,0xa5,0x45,0x5b,0xa7,0xb3,0x20,0x6,0x9a,0x3c,0x6,0x6b, + 0x16,0xce,0x40,0x73,0x91,0x13,0xbe,0x83,0x28,0x51,0x3a,0x28,0xd5,0x4d,0x67,0xdc, + 0x23,0xa,0x65,0xaa,0x62,0x5a,0x11,0x9a,0x8b,0xd8,0x17,0xdf,0xa0,0x4b,0xa4,0x6c, + 0xe3,0x9c,0xd5,0x56,0x64,0x8e,0x47,0xd1,0x46,0x49,0xd7,0x3c,0xf0,0x1a,0xed,0xdc, + 0x1a,0xe3,0x4b,0xf0,0x85,0x15,0xd6,0xab,0xdc,0xd5,0xbd,0x7c,0x7e,0xf7,0x4f,0xd8, + 0xeb,0x7d,0x35,0x1b,0xa9,0xcf,0x83,0x36,0xee,0xd7,0xc4,0xba,0xd4,0x3c,0x27,0x41, + 0xbe,0xd2,0x56,0x75,0xe,0x8b,0x71,0x3f,0x31,0x66,0x30,0x76,0x32,0x6c,0xb5,0x29, + 0x62,0x17,0x5f,0xb1,0x16,0x2d,0xd9,0x85,0x99,0xaa,0x8b,0x56,0x1a,0x1e,0x72,0x7, + 0xc2,0x55,0x99,0xaa,0x1e,0x82,0x55,0xb7,0xbd,0x8,0xa1,0x4c,0x5c,0x28,0x6f,0x9, + 0x83,0xa3,0x61,0x6a,0x1a,0x18,0xa9,0xf3,0xb3,0x8e,0x45,0xd3,0xe0,0xa1,0x37,0x10, + 0x65,0x31,0xb5,0xd3,0xcb,0x8e,0xfa,0xa6,0x42,0x89,0xaa,0xcb,0xfd,0x1e,0xb2,0x2f, + 0x8f,0x42,0x33,0xb7,0xb9,0x6,0x69,0x9f,0xde,0x5b,0x8a,0x4c,0xa2,0x33,0x15,0x85, + 0xdd,0x3d,0x31,0x35,0x5b,0xcb,0xee,0x40,0xfb,0xaf,0x63,0x91,0xde,0x24,0xaa,0xa0, + 0x2a,0x1e,0xa,0x1,0x89,0xa6,0xfc,0xd8,0x4b,0x10,0xb6,0x8,0xc,0xdb,0xda,0x9e, + 0xd5,0xa0,0x54,0xc2,0xdc,0x9a,0xe4,0xd6,0x97,0x2d,0x81,0x7f,0x90,0x69,0x99,0x88, + 0x98,0x4,0x8d,0xd2,0xad,0x3e,0x21,0xc4,0x25,0x2c,0x28,0x96,0xe8,0xee,0xe5,0x5e, + 0xa0,0xfb,0x7c,0x2d,0x75,0xf6,0xbe,0x5c,0x6f,0x9e,0xd0,0xa9,0x1c,0x84,0x9a,0xde, + 0x43,0x9a,0xa3,0xa9,0x0,0x6e,0x5b,0xd0,0xe4,0x29,0xc,0x3d,0xf3,0x56,0xa9,0xb9, + 0x97,0xdc,0x34,0xf3,0x5d,0x82,0x4c,0x60,0x79,0x77,0x47,0xe5,0x75,0x75,0xf4,0xa4, + 0x79,0x8,0x20,0x60,0xb6,0xab,0xc3,0xc2,0x7a,0xed,0x3c,0xa1,0x28,0x98,0xaa,0xc4, + 0x94,0xff,0x71,0x55,0x32,0xd7,0xb3,0x77,0x6,0x6b,0x61,0x4f,0x7f,0x30,0x5b,0xcb, + 0xca,0x3,0xb1,0x56,0xf3,0xfd,0xfa,0x1b,0x1,0x59,0x28,0x2,0xf6,0x75,0x67,0xb5, + 0xc7,0x8,0xc6,0xd6,0x65,0x2a,0x17,0x42,0x51,0x1c,0xb7,0xad,0x46,0xe9,0xd,0x33, + 0x7b,0xbb,0xad,0xf5,0xd6,0x47,0xf4,0x8c,0xe0,0x39,0xea,0x79,0x23,0xd8,0xd7,0xca, + 0x8a,0x46,0x64,0xb3,0x10,0xb6,0x3f,0x7c,0x9f,0x8b,0xf8,0x8d,0xc5,0x4,0x61,0x58, + 0x3f,0x63,0xb4,0x18,0xb4,0xe0,0x97,0xfc,0x6b,0xec,0x2b,0x42,0x2c,0x2a,0x49,0x4f, + 0xa2,0x4c,0xf7,0xa0,0xcf,0x31,0xaf,0xdd,0x3b,0xcc,0x44,0x43,0x84,0x5b,0xb4,0x4f, + 0x31,0x55,0x62,0xd0,0x16,0x89,0xf0,0x5d,0x5c,0xfb,0x3,0x3e,0x8d,0x21,0x95,0xf2, + 0x0,0x29,0x78,0xd5,0x59,0x83,0x97,0xf7,0x40,0xbe,0x63,0x55,0xe3,0x41,0x0,0x75, + 0x14,0xff,0xd2,0x18,0xd0,0x49,0x62,0x3,0xd9,0x2f,0x39,0x2d,0xed,0xd8,0xef,0xdc, + 0x8e,0x2f,0xe,0x2b,0xd6,0x1e,0xc1,0xcb,0xe0,0x31,0x73,0x16,0x6b,0xbe,0xa2,0x3a, + 0xd1,0x24,0xd3,0x3d,0x70,0x72,0xd3,0xb6,0xdf,0xfc,0x8a,0x68,0x39,0x21,0xc8,0x39, + 0x81,0x31,0x81,0xc6,0xac,0x98,0xf0,0x38,0x78,0x35,0xc8,0x6d,0x78,0xd3,0xbe,0xc0, + 0xc6,0xf8,0x4b,0x5c,0xac,0xe0,0x7d,0x19,0x73,0xbc,0xf1,0xea,0x5a,0x33,0xcc,0xc6, + 0xe4,0x92,0x8a,0x74,0x67,0xfd,0xb4,0x43,0xd7,0xe,0x62,0xb1,0x46,0xdd,0x45,0x9b, + 0xbe,0x9e,0x16,0x5c,0x19,0xbd,0xc,0x6,0x92,0x10,0xc4,0xe1,0x26,0x38,0x82,0x71, + 0xa1,0xba,0x9f,0xb0,0x4b,0x40,0x96,0xbb,0x5f,0x5d,0xfe,0x81,0x3a,0xc7,0xdd,0x24, + 0x52,0x87,0x76,0x6d,0xf6,0x64,0x18,0xfa,0xcf,0x59,0xd1,0x30,0xc9,0x4f,0xd0,0xbc, + 0x9a,0x23,0x58,0xb0,0x9c,0x69,0x3f,0x3d,0xab,0x27,0x77,0xd5,0x9e,0x2c,0xd9,0xaf, + 0x97,0xec,0xfe,0x93,0x56,0xb,0x93,0xec,0xa7,0x9,0x1d,0xd8,0x7a,0x28,0x9f,0xb5, + 0x5e,0x9f,0x7f,0x99,0xf6,0x96,0xe9,0x70,0x21,0x7e,0x8d,0xf8,0xbd,0x6f,0x6b,0x5e, + 0xbd,0xe6,0x9c,0x92,0xa8,0x32,0x1,0x94,0x85,0x26,0xf4,0xfb,0x5d,0x22,0xaa,0xc2, + 0xe5,0xd,0xaf,0xba,0x14,0xca,0x86,0xa7,0x99,0xdf,0xe8,0xeb,0x50,0x3d,0x29,0x58, + 0x2e,0x86,0x41,0x90,0x82,0x59,0xfb,0xd2,0x5f,0xd7,0xec,0x72,0x45,0x86,0xf7,0x66, + 0xdf,0x82,0xbd,0xa5,0xc4,0x84,0xe7,0xe,0x20,0x2e,0xa3,0xc2,0x59,0x5a,0xd5,0x6, + 0xd4,0x28,0x9b,0xde,0xef,0x29,0x6,0x32,0xac,0x5,0x58,0x3a,0x7f,0x9,0x8c,0xd9, + 0xe6,0x9a,0xcb,0x94,0x1c,0xa0,0xb0,0xea,0x3a,0xd4,0xff,0x1c,0xf3,0x68,0x4c,0xad, + 0x76,0xbf,0xf3,0xba,0x1b,0x1,0x18,0x7,0x74,0xb2,0xf0,0x8d,0xb1,0xad,0x93,0x69, + 0x8c,0x26,0xbd,0x4f,0xa2,0x70,0x19,0x6a,0xf4,0x75,0xc9,0x57,0xe7,0xff,0x44,0x4b, + 0xc,0x13,0x11,0xc1,0x7e,0x1f,0x7,0x72,0x48,0x85,0x1f,0x7b,0xd,0x4,0xce,0xd6, + 0x2c,0xad,0xa3,0x3d,0xe3,0x2,0x1d,0x7,0xe7,0xb8,0xd6,0x24,0x57,0x2e,0x8,0x9a, + 0xec,0x6a,0x83,0xc,0x28,0xec,0x93,0xe9,0xfd,0x4b,0xdc,0x9,0x33,0x19,0xc6,0x44, + 0x6f,0xa2,0x47,0xcd,0xcd,0xad,0xd8,0x49,0x9d,0xaa,0x19,0x9d,0xf8,0x77,0x30,0x7e, + 0x51,0x23,0xbb,0x85,0x25,0xe9,0x8a,0x95,0x64,0x8b,0x13,0x3b,0x39,0x7b,0xe2,0x5a, + 0x4a,0x4a,0x63,0x44,0xc7,0xa9,0xfb,0x6,0x94,0x49,0xb3,0x9d,0xa0,0x2f,0x25,0x43, + 0xd4,0xa3,0xe5,0xde,0x9d,0xba,0x42,0x6b,0xa1,0x29,0xfc,0x22,0x82,0xe5,0x2a,0x74, + 0xaf,0xe7,0x50,0x42,0x64,0x7c,0xd9,0x37,0x62,0x48,0xc,0xe,0xdf,0x85,0xd0,0x7d, + 0x4e,0xd3,0x2,0xe,0x1,0x4b,0xf5,0xc6,0x1d,0xc7,0x6e,0xac,0x8b,0x54,0xd8,0x52, + 0x7b,0x52,0x68,0xf0,0x5a,0x5a,0xdd,0x65,0xa4,0x3d,0x36,0x76,0xf0,0x10,0x48,0xd, + 0x4a,0xee,0x4a,0x7c,0x4f,0xcf,0x9,0x74,0xc,0xbf,0xaf,0xb1,0xc9,0x12,0x14,0x36, + 0xd,0xa2,0x35,0x9b,0x2e,0x2e,0xa3,0xc7,0xdd,0x89,0xda,0x26,0x2,0x6d,0xb3,0x1a, + 0xdd,0x6c,0x34,0x62,0x22,0x4d,0xeb,0xff,0x49,0xf4,0x1e,0x92,0xc6,0x13,0x68,0x97, + 0xbe,0x30,0x5,0x3a,0x6a,0x68,0xb,0xcd,0x98,0x86,0x41,0x26,0xd9,0x89,0xd0,0x86, + 0x9b,0xba,0xd3,0xd5,0xde,0x5e,0x14,0x74,0x6,0x6a,0xb0,0xc3,0xf0,0x92,0xc6,0xe0, + 0x43,0x1c,0x8a,0x79,0x86,0xa8,0xb0,0x4f,0x37,0x6f,0x98,0x11,0xcb,0x16,0x78,0xdd, + 0x6b,0xd3,0xf3,0xde,0xd5,0x18,0x81,0x46,0xe,0xc5,0xc1,0x70,0x6,0x3,0x92,0xc4, + 0x51,0x84,0x3,0x67,0x4a,0x48,0xdc,0xa7,0xb9,0x47,0x1c,0xd6,0xab,0x90,0xf5,0x3e, + 0xb1,0x72,0x83,0xf0,0xe6,0x24,0x50,0xe,0xac,0xd2,0x53,0x35,0x77,0xe0,0xcc,0x34, + 0x73,0x22,0xca,0xdc,0x2e,0xc7,0x19,0x66,0xf,0x56,0xf7,0xbf,0x5e,0xd8,0xd6,0x9a, + 0x72,0xe8,0xa1,0x9d,0x2e,0xaa,0xb2,0xc5,0x81,0xfc,0x3a,0xb5,0x4d,0xd8,0x3,0x5b, + 0xd,0x41,0xcb,0xfa,0x74,0xbd,0xdd,0x66,0x4f,0x85,0x9c,0x7,0xbf,0xd0,0x94,0xe4, + 0x2d,0x9,0x1b,0x18,0x70,0x23,0xb7,0x68,0x43,0x88,0xd2,0xbe,0xa2,0xf3,0x1e,0xb6, + 0x40,0x1d,0x85,0x27,0x11,0x4,0x2d,0xd1,0xa8,0x6f,0x6d,0x2a,0x6d,0xb2,0x21,0xda, + 0x33,0xec,0x3d,0xff,0xf1,0xdc,0xe2,0x4e,0xda,0xf9,0xa2,0x74,0xb6,0x73,0x8f,0x11, + 0xbb,0x29,0xed,0xb8,0x64,0x10,0xca,0x6b,0xec,0x98,0x5,0x1a,0x9f,0x6f,0x52,0x3b, + 0x65,0x8a,0xee,0xc9,0x33,0x77,0x26,0xba,0x7,0xf8,0x47,0x35,0x91,0x60,0xe2,0x96, + 0xed,0x77,0x8e,0xce,0x17,0x83,0x73,0xa9,0xdd,0x43,0x30,0xac,0x59,0xd0,0x54,0xc4, + 0xab,0x4f,0x2f,0x4d,0xba,0xc3,0xc1,0xb4,0x4,0x4c,0x19,0xaa,0x13,0xb8,0x2,0x3a, + 0x7a,0x22,0x7f,0x72,0x62,0xd4,0xf5,0x47,0x93,0xa,0xb,0xc0,0x34,0x42,0x46,0xa7, + 0xde,0xa,0xa9,0x82,0xcf,0xcd,0xa4,0x8f,0x93,0x84,0x9d,0x1e,0x51,0xe5,0x63,0x48, + 0x1d,0xa7,0xe1,0x41,0x15,0x9,0xe5,0x95,0xc,0x9a,0x8a,0x1d,0x83,0x9d,0x9b,0xda, + 0xde,0x41,0xc6,0x8b,0xe6,0xfd,0xba,0x2f,0x39,0x93,0xad,0x57,0xc5,0xcd,0x70,0x5f, + 0x84,0xe,0x61,0x81,0xef,0xb1,0x10,0xae,0x8c,0x33,0xb9,0x34,0xfc,0xdc,0x56,0x84, + 0x34,0x61,0x99,0xde,0xf,0xb2,0x8a,0x8c,0xd5,0x82,0xae,0x8d,0x74,0xa4,0x42,0xb7, + 0xe9,0xf,0xd0,0x2,0xa0,0x8f,0x93,0xe0,0x4c,0x60,0x4f,0x91,0x8f,0x66,0xb9,0xd9, + 0x3f,0x82,0x26,0xe0,0xdf,0x95,0xad,0x3c,0x5e,0x42,0x66,0xd5,0x27,0x5b,0xda,0x67, + 0x4c,0x2c,0x62,0xeb,0xe5,0x1d,0xfb,0x2f,0x96,0x6d,0x9d,0x4f,0xa8,0x81,0xd0,0x54, + 0x46,0x3e,0xac,0xc1,0xfe,0x76,0x78,0x1f,0x9a,0x26,0xdc,0x71,0xac,0x70,0x2a,0x3, + 0x47,0xd,0x87,0x69,0xa4,0x8d,0xdd,0x9f,0xc0,0x2a,0xc4,0x94,0xae,0x4d,0x21,0x17, + 0xd5,0xf4,0x4f,0xb1,0x3,0x3d,0x5,0x9,0x63,0xc8,0x1f,0xd7,0x3,0x7d,0x4e,0x99, + 0xa2,0xa5,0x81,0x81,0xef,0xe2,0x15,0xa5,0x4c,0x0,0x88,0x1,0x0,0x86,0xa0,0x6b, + 0x49,0xca,0xfa,0x2e,0x58,0x42,0xa7,0x7,0x17,0x74,0x42,0x45,0x26,0x58,0x9a,0xd0, + 0x13,0x64,0xbe,0x5e,0x21,0x58,0xc2,0x24,0x66,0xab,0x5,0x73,0x1f,0x99,0x6b,0x3a, + 0xe0,0x21,0xc,0x54,0xc0,0x30,0x62,0xb5,0xa3,0x17,0xdb,0xd4,0x86,0x13,0x7e,0x31, + 0xc8,0x5b,0xf6,0xb9,0x73,0x74,0x5b,0x17,0x11,0x58,0xd2,0x9f,0x99,0xfc,0x26,0x86, + 0x68,0x99,0xef,0x86,0xcb,0x68,0x9f,0xc9,0x19,0x55,0x32,0x1d,0x63,0x88,0x1e,0x96, + 0x83,0x46,0xab,0xf4,0x30,0x39,0x31,0x11,0xab,0xb7,0xf7,0x85,0xec,0x47,0xf8,0xb4, + 0x2,0x13,0xad,0x28,0xdc,0x2d,0x45,0x29,0x92,0xef,0xb,0xfa,0xdb,0xbf,0xf7,0x7, + 0xef,0x7f,0xfb,0xf7,0xfe,0xe0,0x1d,0x4d,0xbb,0xc5,0x45,0x5d,0x9,0x37,0xdd,0xd5, + 0xb6,0x27,0x1b,0x5f,0xf1,0x2b,0xa1,0x79,0xdb,0x22,0x17,0x32,0xf4,0xce,0xb8,0x1, + 0x7c,0xb2,0x81,0x1,0xbe,0x23,0xad,0xb7,0xd5,0x24,0x74,0x15,0x6,0x64,0xdc,0x84, + 0xc8,0xbc,0x55,0x29,0x4b,0x39,0xbd,0xc,0xbf,0x71,0x25,0x68,0x6c,0xa4,0x45,0x8c, + 0x44,0x98,0xc2,0x2,0x1c,0x98,0x8,0x74,0x62,0x92,0x90,0x4c,0x10,0xf0,0xdf,0xa4, + 0x82,0x96,0xc6,0x24,0x2c,0xc,0x8,0xdc,0x94,0xc5,0xd,0xca,0x48,0x47,0xf2,0x0, + 0xa6,0x6f,0xbb,0x2f,0xf7,0x6a,0x50,0x3e,0xe3,0xad,0x7f,0xeb,0xf7,0xfe,0xf5,0x7b, + 0x55,0xd5,0x6f,0xfc,0xe9,0x9f,0xfc,0x68,0x99,0xa3,0x1d,0x94,0x93,0x5,0xac,0xf2, + 0x2d,0xbc,0xc7,0xb6,0x8d,0xde,0xae,0x1a,0xf4,0x53,0x87,0x8a,0x2e,0x1b,0xdb,0xec, + 0x3d,0x28,0x76,0xff,0x5e,0xa4,0x16,0xbd,0xb1,0x62,0x67,0xb2,0xcf,0x44,0x1e,0xfb, + 0x12,0x5c,0x99,0xe6,0xf,0x39,0x40,0x87,0xb9,0x5e,0xa6,0xd9,0x25,0xaa,0x59,0xf2, + 0x46,0x70,0x74,0x9f,0xb0,0x6,0x28,0x28,0xe0,0xa4,0x4a,0xb2,0x63,0xc0,0x78,0x49, + 0xc6,0xa,0x82,0xcd,0x53,0x1,0x58,0x91,0xd9,0x2,0xae,0x4b,0xd8,0x21,0xd6,0xa1, + 0x69,0xa3,0x3,0x73,0x33,0x48,0x6d,0x88,0x1b,0x34,0xcd,0x2d,0xff,0x1c,0xfa,0x0, + 0xc5,0x72,0x19,0xd7,0x48,0x22,0x58,0x8e,0xa0,0x21,0xc6,0xc6,0x46,0x5e,0x6d,0xc2, + 0xe2,0xc3,0x18,0x15,0xab,0xe5,0xc5,0xa6,0x42,0x49,0xd5,0x37,0xf,0x33,0x42,0x1e, + 0x12,0xad,0xfd,0x6c,0x91,0x9c,0xae,0x16,0x6c,0x29,0x3c,0x1e,0x88,0x45,0x27,0x1b, + 0x45,0xb3,0xda,0x8,0xe4,0x71,0x82,0xac,0xba,0xad,0x2d,0x17,0xf9,0x4e,0xf7,0x13, + 0xa5,0x90,0x48,0x2c,0x90,0x87,0xa2,0x1e,0x4e,0xc2,0xd3,0x35,0x3d,0xd0,0x41,0x93, + 0x3,0x12,0x94,0xd7,0x46,0x5e,0xa5,0xb6,0xdb,0xd0,0xa9,0xa0,0x76,0xf,0xc8,0xb6, + 0x77,0xd7,0xe7,0x87,0x98,0x8,0x84,0xec,0xfb,0x54,0xf9,0x10,0x4b,0x5b,0x6b,0x67, + 0x2a,0x32,0x69,0x73,0x9f,0x83,0xc5,0x75,0xdc,0x7d,0x72,0x22,0xcf,0x6d,0x2e,0x92, + 0x12,0xc7,0x73,0xdb,0x2b,0xc2,0xb2,0x12,0x28,0xdb,0xaf,0x8f,0xb0,0xd8,0xfa,0x25, + 0xc3,0x8c,0x4e,0x47,0x3c,0x60,0x14,0xc2,0xdd,0xde,0xbc,0x72,0x31,0xaa,0xab,0x55, + 0x77,0xc6,0xec,0xd9,0x3e,0x35,0xb3,0x8a,0x2,0x82,0x51,0x7d,0x27,0x29,0xce,0x9d, + 0x74,0x3a,0x31,0x1d,0x28,0xa7,0xf3,0xc7,0x8,0x47,0xeb,0xdb,0xa9,0x44,0xe5,0xf0, + 0x1d,0x4a,0xcc,0xa8,0x20,0x9d,0xad,0x2c,0xf5,0xaa,0x81,0x6c,0x30,0x8f,0x88,0x4d, + 0x89,0xf1,0x28,0x82,0x30,0x54,0xdc,0x7,0xa,0x47,0x40,0xf8,0x75,0xf6,0x8,0xb7, + 0x54,0x13,0xbd,0x33,0x79,0xb3,0x33,0x7f,0xe3,0x3f,0xf9,0xc9,0x8f,0xbf,0xf9,0x2f, + 0xbe,0x2,0xbb,0xb3,0x36,0x3d,0xeb,0x7e,0x66,0xd3,0x4d,0xa5,0x88,0x5d,0x20,0x5, + 0x2a,0x1b,0x85,0x10,0x57,0x99,0x30,0x41,0x81,0xb3,0x73,0xd4,0x68,0x33,0xb1,0xd0, + 0xe1,0xa1,0xce,0x4,0x14,0x94,0x9c,0xfe,0x6c,0xe0,0x6a,0x6b,0x48,0xa7,0xa7,0x51, + 0x15,0x4b,0xe5,0x8c,0x31,0x8c,0xcf,0xb1,0xba,0x58,0x9,0xa3,0x82,0x44,0x53,0xfc, + 0x82,0x9,0xa0,0x8,0xa1,0xf4,0x64,0x6a,0xa1,0xf7,0x56,0x2a,0x4e,0x34,0xab,0x5a, + 0x58,0x9e,0xd1,0xb6,0x23,0xa6,0x11,0x29,0x34,0xa2,0x88,0x8e,0xc0,0xfa,0x60,0x47, + 0x30,0x75,0xd9,0xa5,0x2e,0x51,0x68,0xf2,0xc4,0xcf,0x28,0x5b,0xe7,0xad,0xc2,0xd8, + 0xf9,0x10,0xd4,0xa2,0x82,0xb8,0xa9,0x48,0x52,0x93,0x57,0x45,0x1f,0x7d,0xcb,0x19, + 0x42,0xd6,0x96,0x10,0x16,0xba,0x6f,0xa0,0x8c,0x8,0x32,0xea,0xbe,0x8a,0xed,0x1, + 0x90,0xfa,0xec,0x6c,0xda,0xec,0x49,0xee,0xf3,0xe0,0xee,0x6,0x20,0x84,0x5f,0x7f, + 0x6a,0xf8,0x69,0xe0,0x72,0xf4,0xcb,0x7d,0x1c,0x86,0x93,0x64,0x8d,0x16,0xd2,0xe4, + 0x74,0x77,0xc8,0xa7,0xa0,0x5,0x3e,0x51,0xe1,0x63,0x87,0x86,0x22,0xaa,0x2,0x1a, + 0xd1,0x84,0x98,0x4c,0xd5,0xc,0xc2,0xa3,0x51,0x92,0x1d,0x68,0x91,0x47,0xe7,0xb3, + 0x61,0x16,0xbd,0x58,0xe2,0x39,0x3a,0x79,0xa0,0xea,0x98,0xf,0xda,0xa,0x51,0x57, + 0x54,0x12,0xe4,0x4a,0x50,0x99,0x28,0xcd,0x24,0x47,0x85,0xd8,0x1f,0x5f,0xa8,0x9d, + 0x12,0x16,0x91,0x64,0xb5,0x1b,0x61,0x7b,0x2a,0x74,0x6d,0x13,0x90,0xae,0x84,0x69, + 0xa2,0x66,0x4a,0x94,0x5,0x6e,0xde,0x4,0xec,0x5c,0xe6,0xa7,0x17,0x4e,0xd0,0x6b, + 0xa0,0x4c,0xaa,0xa2,0xa3,0xdd,0x14,0x12,0x6d,0xe6,0xd8,0x17,0xaa,0x86,0xfe,0xe4, + 0xc,0xcd,0x4d,0x55,0xe4,0x8,0x53,0x17,0x86,0x5e,0x61,0xe6,0x77,0x68,0x3d,0xbf, + 0x3e,0xea,0x16,0x96,0x82,0x93,0xee,0x6f,0x25,0x85,0x3f,0xa1,0xc9,0xea,0xf3,0xb4, + 0x4d,0x2,0x53,0x25,0x3e,0x67,0xef,0xf3,0xa1,0xd1,0xd6,0xe6,0xd3,0x4d,0x93,0xd7, + 0x74,0xcb,0x6b,0x8d,0x87,0x99,0x2d,0x5f,0x88,0xcf,0xa8,0xf4,0xaa,0x8e,0xb0,0x21, + 0xc,0x14,0x40,0x1f,0xf5,0x6a,0xaa,0x58,0x88,0xea,0x8b,0x9e,0xc8,0xb0,0x37,0xfa, + 0xeb,0xaf,0xfd,0x99,0x9f,0xfa,0xf8,0x1b,0xff,0xfc,0xf,0xde,0x33,0x63,0x6e,0x12, + 0x95,0x8,0x2,0xa4,0x5d,0x27,0x3a,0x74,0x68,0xb3,0x9d,0x7,0x16,0xaa,0x6d,0xa2, + 0xb9,0x4c,0x1,0xdd,0x8c,0x4,0x9,0x1b,0x46,0x2f,0xac,0x12,0xb6,0x43,0xb0,0x68, + 0x85,0x88,0x62,0x88,0xcf,0xa4,0xdd,0x1f,0xf0,0xa2,0x1e,0xc,0xd9,0x91,0xde,0x1, + 0xe3,0xf2,0xa0,0x34,0xc2,0xeb,0xbe,0x19,0xd9,0x12,0xe9,0x40,0x86,0xae,0x9e,0x88, + 0x6a,0x32,0xfc,0x4,0x36,0xfd,0xae,0x9d,0xa0,0xa2,0x21,0x4f,0xbd,0xe5,0xa5,0x3d, + 0x3e,0x9,0xdc,0x10,0x83,0x96,0x6c,0xc7,0x0,0x2d,0x75,0xde,0x76,0xa3,0x1c,0x12, + 0xff,0xa4,0x32,0xee,0x60,0xf2,0x95,0x20,0xea,0x8c,0xf0,0xcc,0x80,0x46,0xf4,0x41, + 0x9f,0x40,0x82,0x50,0x33,0x34,0xa2,0xed,0xad,0x4a,0x86,0xb0,0xe6,0xec,0xe2,0x20, + 0x82,0x62,0x50,0x66,0x86,0xdb,0xe3,0x63,0x53,0xc6,0x83,0xc8,0x37,0xe7,0x1d,0x58, + 0x53,0x35,0xe8,0x30,0xf0,0x34,0xfb,0xee,0x3e,0x4,0xe9,0x1f,0x31,0x19,0xa7,0x40, + 0xfa,0xc0,0x88,0x33,0xc1,0x3b,0x20,0x4a,0x83,0x80,0xb4,0xba,0x58,0x2e,0xfc,0xc2, + 0x4c,0x56,0x25,0xe1,0x47,0x55,0xb,0x90,0x7e,0xbe,0xea,0xa5,0x5e,0xa1,0x51,0x3e, + 0xe5,0xb6,0x77,0x0,0x1d,0x7c,0x39,0x92,0x8f,0x95,0xca,0x98,0xa,0x45,0xb7,0x20, + 0x8b,0x3,0xb,0x1d,0x62,0xdf,0x8c,0xe4,0x91,0x39,0xc2,0x4a,0x56,0xfd,0xb5,0x3f, + 0xfb,0x27,0x3e,0xfe,0xc6,0x3f,0xff,0xfd,0xf7,0xc5,0x2f,0x2,0x3b,0x64,0xaf,0x48, + 0x2c,0x92,0x1d,0xb6,0x87,0x11,0x39,0x6a,0x81,0x38,0x92,0xab,0x49,0x5b,0x61,0x9a, + 0xf6,0x71,0x72,0x2d,0xd7,0x49,0x87,0x92,0x4c,0xae,0xe,0x76,0x44,0xba,0xf3,0xa9, + 0x8d,0xf,0x27,0x96,0xa4,0x17,0x37,0xb3,0x42,0xd5,0x1b,0x4f,0x87,0xcd,0x82,0xaf, + 0x8f,0xd6,0x2f,0xa4,0x30,0xa6,0xb3,0xdf,0x85,0x4e,0x9e,0xac,0x94,0xc1,0xec,0x82, + 0x6,0xd6,0xd7,0x31,0x4a,0xae,0x3e,0x6c,0x77,0x59,0x82,0x66,0xa2,0xda,0xc7,0xb, + 0x74,0x56,0x21,0x63,0x77,0xa1,0x2b,0x9f,0x5b,0x4d,0xd3,0xb,0xeb,0xc,0xe4,0xc8, + 0x49,0x45,0x3f,0x17,0xad,0x5a,0xb3,0x11,0xa8,0xbb,0xef,0xf3,0xd7,0xff,0xec,0x4f, + 0x7d,0xfc,0xf7,0xff,0xe7,0x1f,0xbc,0x6b,0x4f,0x8,0x8e,0xb8,0xdb,0xbc,0xe5,0x73, + 0x20,0x30,0x7a,0x4a,0x29,0xeb,0x60,0x23,0x3d,0xf6,0xda,0x4b,0xbb,0x36,0x2f,0xff, + 0x83,0xa9,0xb7,0x2b,0x87,0xf2,0x9a,0x1b,0x35,0x3f,0x66,0x8,0x97,0xc3,0xd2,0x52, + 0x63,0xff,0x1b,0x8d,0x10,0xf9,0x77,0xd2,0xfb,0x83,0xc2,0x92,0xba,0x49,0xe8,0xbf, + 0x23,0x7c,0x91,0xfd,0x37,0xf8,0x6c,0xbc,0x12,0xe8,0x9c,0x40,0x4a,0x77,0xa4,0x13, + 0x21,0xb,0x1f,0x91,0x83,0x7,0xb1,0x9a,0xfb,0xe1,0xeb,0x5d,0xd2,0x53,0x35,0x32, + 0xe7,0xd4,0x6a,0x11,0xdf,0x6a,0x9b,0xd1,0x65,0x24,0x6d,0xc2,0xcb,0xd8,0xd2,0xbd, + 0x6c,0xe4,0xcc,0x92,0x20,0xcf,0x1,0xa1,0x5a,0xb2,0xd9,0xd5,0xfb,0x8f,0x7b,0xc4, + 0x53,0xea,0x2a,0xf6,0xb4,0x65,0x18,0xaa,0x89,0x99,0x6a,0x34,0xe9,0x63,0x6d,0xe1, + 0x3d,0x9e,0x1,0xcd,0xa6,0x57,0xc5,0x48,0x6,0x1b,0x4e,0xe8,0x58,0x2b,0xe3,0x79, + 0xab,0x14,0xf8,0xaa,0x98,0x20,0xf7,0xec,0x92,0xdf,0x7c,0x19,0x84,0xb,0xbc,0x36, + 0xd1,0x52,0x7e,0x1d,0xb3,0x6f,0x9c,0xbc,0xa2,0xe,0xb8,0x55,0xd5,0x59,0x49,0x71, + 0x94,0xd2,0x17,0xa4,0x53,0xd1,0xa,0xa,0x70,0xcc,0xca,0x56,0xe4,0x7c,0xde,0x56, + 0xd6,0x2a,0x42,0xd4,0xad,0x13,0xd2,0xa2,0x58,0xc4,0x95,0x9,0x35,0xd7,0xf8,0x5a, + 0x1d,0xdf,0x77,0x2e,0x46,0x11,0xa3,0xb2,0x3d,0xd,0xf,0x3e,0x48,0xec,0xb3,0xe7, + 0xbc,0xfc,0xaa,0xaa,0x9b,0x1c,0xd1,0xe0,0x3e,0x47,0xf3,0xc,0x31,0x8d,0x77,0x60, + 0x55,0xe8,0x91,0xed,0xcf,0xce,0x71,0x29,0x2,0x84,0x89,0x4b,0xb3,0x7f,0xe3,0xa5, + 0x92,0x79,0xdd,0xcc,0x20,0x4c,0xb,0x12,0xf6,0xae,0x59,0xe9,0x88,0x96,0x54,0xb8, + 0x26,0xb1,0x5,0x34,0x9d,0x61,0x36,0x9f,0x5,0xc,0xad,0x3c,0xc,0x44,0xa7,0xae, + 0x95,0xbe,0xc8,0x4c,0x23,0xa3,0x58,0x5e,0x23,0x19,0x2d,0x53,0xf8,0xff,0xb9,0x35, + 0x2f,0xa2,0x11,0x1f,0xc2,0x93,0x28,0x5a,0x55,0xcc,0x18,0xd7,0x10,0xd4,0x70,0x69, + 0x1f,0x13,0xcd,0xdc,0xa5,0xc1,0x71,0x95,0x6d,0x4,0x25,0x2,0x49,0xef,0xcc,0xb4, + 0xf8,0x1f,0xef,0xe8,0xdd,0xc1,0x21,0x37,0x3c,0xc6,0xc6,0xd0,0x2c,0x83,0xbc,0x9c, + 0x55,0x9,0x63,0x5c,0xb7,0x31,0x3b,0xdd,0xe0,0x49,0x3c,0x19,0x18,0xa3,0x30,0xa3, + 0x95,0x44,0x72,0x76,0xa0,0x31,0xc5,0xb5,0x20,0x78,0x59,0x3b,0x6,0x63,0xc3,0xa1, + 0x57,0xa5,0xe5,0xb0,0x1a,0x97,0x94,0xe2,0x46,0x47,0xda,0xd4,0x93,0xb6,0x4,0x9e, + 0x9,0xb,0xb3,0xe9,0x1d,0xac,0x31,0x75,0xd,0xc7,0x28,0xd,0x2c,0xab,0xee,0xc7, + 0xcd,0x24,0x4f,0x4e,0x19,0x49,0x69,0x8a,0xc2,0x8a,0xe4,0x4c,0xbc,0x82,0x70,0x34, + 0xcb,0xa4,0x32,0xd1,0x2c,0xad,0x6e,0x51,0xa,0x61,0xf6,0xb5,0xd,0x35,0xb5,0x71, + 0xd4,0xb3,0x32,0x3f,0x37,0xcd,0x0,0x5c,0x36,0x6e,0x93,0x95,0x2f,0x7,0xb3,0x10, + 0xc6,0xec,0x35,0xf,0x8c,0xfe,0x76,0x78,0xc3,0xcf,0x2b,0x6,0x4a,0xd3,0x7d,0x3, + 0x18,0xf7,0x41,0x90,0x23,0xed,0x77,0x5c,0x61,0x30,0xa2,0xfb,0xe5,0x42,0xc7,0x4f, + 0x4c,0xe2,0x70,0xb0,0xd4,0xc5,0xd0,0xda,0x6a,0xe7,0x2d,0x8e,0xe8,0x67,0x8e,0x3c, + 0x35,0xb5,0xb1,0x46,0x8e,0x1c,0x7a,0xa4,0x71,0xf6,0xe7,0xde,0xde,0x5a,0xfc,0xec, + 0xab,0x3d,0xb,0x40,0x43,0xe7,0xe4,0xb7,0xf0,0xd0,0xfe,0xc2,0x40,0x67,0xcf,0xea, + 0x9a,0xbb,0x95,0xd5,0xc,0x8f,0x46,0x6a,0xd3,0xa0,0x8b,0x72,0xc2,0x13,0xcc,0x91, + 0xaf,0x5f,0xde,0x23,0xd9,0x4c,0xd2,0xe6,0xe1,0x9b,0x49,0x91,0x58,0xef,0xb6,0xe0, + 0xc1,0xdd,0x56,0x23,0x79,0x4b,0xa7,0x77,0x7,0xc4,0x6c,0xb7,0xb5,0x8f,0x38,0x8d, + 0xd9,0xdd,0x17,0xf1,0x56,0x21,0x3f,0xd9,0x44,0x40,0x40,0x99,0xba,0x82,0x91,0xd4, + 0x36,0x97,0x49,0x46,0xb6,0xae,0x7b,0xae,0xd9,0x34,0xbe,0xca,0xc7,0xcd,0xd4,0x12, + 0x31,0x68,0xfa,0xf,0x39,0x4f,0xfb,0x25,0x6c,0xcc,0x0,0x79,0x38,0xd7,0x26,0x33, + 0x40,0x2a,0xaa,0x62,0x97,0x97,0x4,0x3d,0xcc,0xb0,0x92,0x11,0x83,0x57,0xfc,0x5b, + 0x41,0x1,0x42,0x4c,0x1f,0xca,0x86,0x15,0xf5,0xb5,0xf5,0xbd,0xa9,0x81,0xd4,0x15, + 0xee,0x64,0x56,0xae,0xd2,0xb2,0x51,0x33,0x1e,0x68,0xf,0xe7,0xb9,0x57,0x76,0x6e, + 0xec,0xef,0xfd,0xfc,0xdc,0xd7,0xf8,0xfc,0x33,0xf8,0xfc,0x73,0xd4,0xc7,0xd0,0x3f, + 0x67,0xf8,0x55,0x7b,0xd0,0xa1,0x7a,0x43,0x33,0x6c,0x4a,0x28,0xbf,0xe9,0x55,0x42, + 0x54,0x6e,0x3b,0x8b,0x41,0x7,0xda,0x7b,0xf3,0x4e,0xe,0x63,0x9b,0x28,0x72,0xb2, + 0xe4,0x12,0xca,0xe1,0x79,0xca,0x6b,0xcf,0x79,0xc3,0xc8,0x90,0x15,0xc2,0x38,0xe9, + 0x98,0xfe,0xf4,0xe,0x47,0xab,0xc9,0x47,0x66,0xf5,0xe9,0xf9,0x21,0xe7,0x24,0x73, + 0x70,0x8a,0x73,0x6b,0x5d,0xc4,0x44,0x19,0x1,0x5f,0x3f,0x13,0x72,0x5f,0x88,0xd9, + 0x50,0x73,0xa5,0x78,0x57,0xc5,0x1c,0x30,0xaa,0x8e,0xc0,0x21,0xaa,0xd2,0xaa,0x17, + 0x5a,0xa1,0x43,0xf6,0x5e,0x4c,0x5e,0xe8,0x62,0xb1,0x8d,0xc4,0xf6,0x1c,0x63,0x4e, + 0x74,0x26,0x3,0x5,0xdb,0x16,0x3a,0x43,0x9c,0x4c,0x5c,0xd6,0xf9,0x13,0x6c,0x8e, + 0x8a,0x35,0xc8,0x20,0x7a,0xa1,0x96,0x82,0x15,0xc3,0x5b,0xc1,0x48,0x23,0x78,0x26, + 0xcf,0xb6,0x7b,0xd0,0x45,0xfc,0xab,0x26,0x45,0x4a,0x22,0x95,0x74,0x66,0x2,0xea, + 0x7d,0xcf,0xaf,0x87,0xf8,0x77,0x54,0xde,0x1c,0x38,0x2f,0x8d,0xa8,0x39,0x5c,0xbf, + 0x8d,0x64,0x86,0xe4,0x1c,0xd2,0xc5,0x40,0x88,0xc7,0xcf,0x5c,0xb6,0x18,0x33,0x3d, + 0xba,0x4,0xd4,0xea,0xb8,0xcd,0x9f,0xeb,0xfd,0xd8,0x23,0xb2,0xf,0xa2,0xcc,0xc9, + 0x93,0x43,0xaf,0x5,0xe1,0xab,0x80,0x24,0x61,0x96,0x7d,0x66,0x1b,0xce,0xbe,0x3f, + 0xfb,0x39,0x3b,0x3f,0x3f,0x4b,0x66,0xcc,0x3,0xfe,0x8f,0xe0,0xbf,0x13,0x4f,0xf7, + 0x2c,0x61,0xed,0x73,0x96,0x23,0x5c,0xc2,0x7e,0xaf,0x4b,0x55,0x3a,0x7,0xa8,0x45, + 0x1e,0xe1,0x9b,0x4a,0xf3,0x3d,0x15,0x9d,0xd,0xc4,0x43,0xd9,0x7c,0x2a,0xe6,0xc2, + 0xad,0x4d,0x1b,0xb,0x71,0xf5,0xb6,0x28,0xe2,0x19,0x72,0x70,0xaa,0xb0,0xfc,0x13, + 0x10,0xb2,0xd2,0xa1,0xba,0x0,0xa5,0xe2,0x5a,0x8c,0xae,0x6a,0x16,0xbb,0x7f,0xf, + 0xf7,0xdc,0x25,0xfc,0x3b,0x69,0x73,0xea,0x15,0x3e,0xec,0x4a,0x78,0x84,0x77,0x13, + 0xd8,0xf7,0x2,0x22,0x48,0x53,0x66,0x31,0x55,0x94,0x24,0x2d,0x77,0x81,0x39,0xb8, + 0x68,0x25,0x84,0xc1,0xa7,0x97,0x9,0x9e,0xc4,0x5f,0x1a,0xa4,0x18,0x4,0xce,0x87, + 0xa9,0xeb,0xda,0x25,0x77,0x30,0xb0,0xd7,0xc3,0xc,0x77,0x30,0x49,0x18,0xa,0xcb, + 0x1b,0x41,0x91,0x57,0x13,0x9d,0x91,0xd1,0x87,0x66,0xb9,0x33,0xb2,0xa7,0x6d,0x4e, + 0x3f,0x8f,0x68,0x38,0x42,0x3,0x69,0x9,0x2d,0x49,0xdb,0x3c,0x98,0x10,0xf0,0xdf, + 0x93,0x25,0x83,0x4d,0x0,0x68,0x92,0x5,0xf5,0xf5,0xc6,0x70,0x75,0xa0,0xdf,0x9f, + 0x66,0x12,0xc4,0xb9,0x88,0xb0,0x3,0x3c,0x3e,0xd3,0xc6,0xf,0x39,0x1f,0xf8,0x49, + 0xae,0x62,0xa8,0x39,0x98,0x41,0x51,0x36,0x49,0x85,0x86,0xe,0xce,0x63,0x58,0xfd, + 0xd6,0x85,0xc0,0x6,0x66,0x52,0xe8,0x24,0x87,0x9c,0x52,0x9c,0x83,0x30,0x4e,0x47, + 0x4d,0xdd,0x46,0x92,0xa7,0xd7,0x2a,0xab,0x16,0x33,0xec,0xea,0xb7,0x6c,0x9b,0x41, + 0x35,0x4d,0x96,0x71,0xcd,0x4e,0xa2,0x17,0x87,0xf7,0xa4,0xb6,0xf0,0xea,0xef,0x47, + 0xb9,0x90,0x22,0x49,0xec,0x64,0x5f,0xe6,0xf4,0x47,0xbb,0xaf,0xa2,0xfd,0xb0,0xb6, + 0xa5,0xca,0xc9,0xe2,0x3c,0x1d,0x20,0xb2,0xc6,0xe3,0xf4,0x45,0xea,0x87,0xd8,0xcf, + 0xe2,0x88,0x8b,0xb0,0x30,0x24,0xaf,0x88,0xc7,0x43,0x43,0x66,0x3b,0x2f,0x8b,0xc2, + 0x27,0xe1,0x42,0x3e,0x28,0xd7,0xc8,0xb0,0x46,0x62,0x8b,0x1c,0xd2,0xb5,0x56,0x72, + 0xa6,0x3e,0x3,0xb0,0x53,0xb6,0x1e,0x1e,0xc6,0x1d,0xb,0x7f,0xe3,0xff,0xf8,0x57, + 0xef,0x7f,0xf3,0xcf,0xfd,0xc9,0x8f,0x75,0x46,0xea,0x78,0x35,0x5b,0x8e,0xd0,0x4, + 0x9d,0xa0,0x93,0x14,0x52,0x8c,0x94,0x20,0xd1,0x14,0xf5,0x24,0x13,0x33,0xe3,0x50, + 0x9d,0x2b,0xca,0xc8,0x4e,0x39,0x7a,0xcb,0x66,0x7c,0x31,0xab,0x7d,0x34,0x47,0x97, + 0x36,0x57,0x8e,0xbe,0xa7,0x5c,0x93,0x41,0xcc,0x3e,0x47,0xa1,0x1,0x5f,0xac,0x7c, + 0x7a,0x4e,0x53,0xa3,0x48,0x32,0x1,0x6a,0x5,0xc4,0xa,0x21,0x12,0x9a,0x96,0x8, + 0x83,0xa9,0xaf,0xb3,0x7b,0x3d,0x96,0x74,0x61,0x14,0x95,0xb7,0xcc,0x6a,0xd,0xa3, + 0x41,0xd,0xbb,0xb8,0x86,0xef,0xa6,0x6a,0x73,0x8b,0xe0,0xb8,0x10,0x1a,0x76,0x72, + 0xa5,0xbf,0xb0,0x92,0x8a,0x76,0xf0,0xd8,0xae,0x6a,0xdc,0x4a,0x70,0xd8,0xba,0xed, + 0x29,0x22,0xb2,0xd8,0xef,0x18,0xf4,0xf8,0x2d,0xf9,0xa5,0x1b,0xe6,0xc1,0x2b,0xa6, + 0xb4,0x2,0xc4,0xe8,0xd0,0x56,0x75,0xd0,0xd,0xdb,0x30,0x21,0x19,0xc9,0x11,0x9b, + 0xa0,0x91,0xa9,0xb,0xb5,0xbe,0x16,0xe3,0x90,0xcf,0xca,0x2,0xc1,0xa2,0x4b,0xf1, + 0x97,0x6c,0x60,0x4e,0x70,0x76,0x85,0xfa,0xb,0x3c,0xf0,0x85,0x24,0x28,0x2a,0x2d, + 0x7c,0xe3,0x33,0x59,0x7,0xcd,0xca,0xec,0x77,0x60,0xae,0x6,0xa7,0x8a,0x32,0xad, + 0x25,0x25,0x99,0x61,0xd,0x58,0xfe,0x41,0xc7,0x7f,0xa9,0xa,0x62,0xe,0x2e,0x3b, + 0x68,0x69,0x92,0xc5,0x4a,0x39,0xa5,0x3d,0xba,0x29,0xe2,0x52,0x52,0x79,0x15,0x87, + 0x31,0xad,0xea,0xc5,0xb5,0xf7,0xd7,0xd9,0x9a,0xcf,0xe3,0xd1,0xbf,0x8a,0x2f,0x6, + 0x3f,0x85,0x83,0x73,0x5c,0xc2,0xd7,0xbe,0xfe,0x54,0x4c,0x4,0x86,0xfa,0xa9,0xce, + 0x39,0xbd,0x35,0xd9,0xe,0x7b,0xf1,0x6c,0x84,0x4f,0x6f,0xf2,0xd6,0x69,0x30,0xcd, + 0xf4,0xe7,0xcf,0x2f,0x19,0x59,0xc3,0x41,0x63,0x1b,0xf9,0x7c,0xe4,0xf1,0x5e,0x91, + 0xa0,0x5d,0x5b,0xbc,0x4b,0x6f,0xf6,0xbe,0xf,0x8c,0xb9,0xf7,0x5a,0x22,0x3e,0x7a, + 0xaf,0xfc,0x31,0x60,0x40,0x94,0x69,0xd6,0xd8,0x31,0xf9,0xe9,0x6d,0x1d,0x7a,0xdb, + 0x27,0x9f,0x23,0x24,0x1e,0xa8,0xea,0x65,0xa,0xb8,0x20,0xb9,0x5a,0xd8,0xc1,0x77, + 0xf1,0x2b,0x2c,0x29,0xde,0x5,0xe9,0xe6,0x1b,0xe1,0xfe,0xe7,0xc,0x7a,0xb4,0x49, + 0x56,0x55,0xa5,0x2b,0xd7,0x98,0x5a,0x89,0xb2,0x6a,0xc3,0x33,0x25,0xa8,0x85,0xfb, + 0x41,0x71,0x7,0xb5,0x31,0x35,0x8a,0x20,0x58,0xb9,0x30,0xff,0x95,0xc0,0x77,0xef, + 0x49,0x62,0x2e,0xd,0x63,0x90,0x85,0xa1,0x7d,0x8d,0x41,0xe4,0xc3,0x99,0x7a,0x83, + 0xcf,0x2d,0xd0,0x2b,0xa2,0xc9,0xb7,0x7a,0x40,0x1c,0xb8,0xb4,0x93,0x39,0xb2,0x3f, + 0x94,0x44,0x86,0x64,0x13,0xe7,0x77,0x5c,0xf4,0xbe,0x92,0x69,0x1e,0xd3,0xaa,0xee, + 0xc6,0x74,0x1f,0x85,0x3c,0x5e,0xc8,0xbf,0x62,0x78,0x2d,0x12,0xf2,0x8d,0xcf,0x67, + 0x8d,0x15,0x6d,0x13,0x6c,0x90,0x93,0x50,0xb8,0x4c,0xee,0xbc,0xb5,0x60,0xcc,0x90, + 0x5c,0x3c,0x42,0x9,0x81,0x26,0x8c,0xaf,0xeb,0x3a,0xcf,0xdd,0x26,0x1b,0x1d,0xb, + 0xc7,0xd4,0xfb,0xd,0x32,0x8,0x21,0x1b,0xf0,0xe6,0x75,0x2a,0x8b,0x9f,0x43,0x85, + 0x39,0xde,0x33,0xcc,0x53,0x10,0x93,0x7,0x41,0xa2,0xc5,0x19,0xf0,0xa7,0xc7,0x3b, + 0x24,0xc6,0x96,0x77,0xb4,0xb1,0x37,0x77,0x99,0x42,0x1b,0x1b,0xaa,0x26,0x65,0xac, + 0x23,0x77,0xc8,0x8b,0xc4,0x50,0x5d,0x46,0xd2,0xc0,0xf0,0x7c,0x47,0x10,0x4e,0x33, + 0xfc,0x98,0xad,0xb2,0x4e,0x1c,0x0,0x31,0x76,0xda,0x15,0xae,0x66,0xb5,0x3f,0xd, + 0x5c,0x1b,0x95,0x61,0xf3,0x9b,0x4f,0xd7,0xbf,0xcd,0x17,0xd9,0xf9,0x56,0x8a,0xec, + 0xd0,0x68,0x88,0xad,0x25,0x71,0x85,0x30,0x51,0x38,0xf5,0x51,0xb5,0x35,0x86,0x24, + 0xb5,0x9a,0xdf,0x38,0x9c,0x23,0xd2,0x38,0x23,0x35,0x4f,0xe7,0x0,0x83,0x9f,0x8e, + 0x8f,0x3d,0x35,0xb1,0x2f,0xb8,0x75,0x6f,0xca,0x5f,0xdb,0x67,0xb0,0x4f,0x81,0x7e, + 0x5,0x85,0xab,0x27,0x19,0x12,0x50,0x90,0x3c,0x61,0x21,0xa6,0x7a,0xee,0x70,0x35, + 0x6f,0x70,0x5a,0x1c,0xa9,0xe0,0x50,0xc9,0x98,0xb2,0x9a,0xd6,0xc,0x4e,0x86,0xda, + 0x62,0xd2,0x9,0xe,0x36,0x42,0x4f,0xea,0xa0,0x48,0x5f,0x9c,0x49,0x76,0xe,0x69, + 0x6e,0x6d,0x3,0x94,0xa3,0xa,0xb,0x51,0x7e,0xd6,0x3,0x95,0xa8,0x9c,0x52,0xce, + 0x10,0x24,0x82,0xe2,0x7a,0x18,0xb3,0x32,0x50,0xf7,0x36,0x29,0x90,0xe9,0xd3,0x19, + 0x8c,0xb5,0xbc,0xc6,0x42,0x49,0x13,0x61,0x43,0xf0,0x41,0xde,0x7a,0x47,0xb8,0x4c, + 0xe0,0x2,0x1,0x93,0xe,0x14,0xc6,0x1e,0xa0,0xc9,0x5e,0xfd,0x34,0x13,0xe7,0x93, + 0x72,0x15,0xf,0xfe,0xbc,0x43,0x3f,0xd5,0xfa,0xd6,0x26,0x9,0x3c,0x54,0x5f,0x65, + 0x52,0x91,0x99,0x89,0xda,0xdf,0xd5,0xe1,0x92,0x25,0xe5,0xb,0x5b,0xf2,0xd4,0x3f, + 0x19,0x61,0xf4,0x13,0x94,0xd8,0xf6,0x14,0x5d,0x9c,0x23,0x83,0xfc,0xd8,0xa6,0x63, + 0xdf,0xd8,0xfc,0x14,0xd4,0xe3,0xb3,0x4c,0x15,0x6e,0xf7,0xa1,0xf6,0x7b,0x57,0xe6, + 0xc8,0xb2,0x3e,0x55,0x8a,0xfb,0xe4,0xef,0x80,0x40,0x32,0x8f,0x24,0x2a,0xa2,0xa9, + 0xee,0xd2,0x8e,0xb6,0x5b,0xd,0xce,0xd9,0x49,0x59,0x80,0x67,0xec,0x3e,0xf2,0xda, + 0x4b,0xd7,0xea,0x53,0x5d,0xec,0xa,0xd9,0xad,0x76,0x0,0xcb,0xc4,0x37,0x62,0xa2, + 0x60,0x59,0x77,0x42,0xa1,0xbd,0x1b,0x22,0x55,0xe9,0xdb,0x84,0xf5,0xe4,0xf7,0x50, + 0xf4,0xde,0x35,0x30,0x70,0xd8,0x39,0xd4,0xe6,0x8d,0x55,0x6e,0x30,0x13,0xa0,0xa6, + 0x3f,0x18,0x2e,0x75,0xc6,0xc7,0x40,0x47,0x2f,0x8,0xf,0x28,0xd9,0xae,0x54,0x9, + 0x65,0x7b,0x3b,0x53,0x46,0xa4,0x8f,0xda,0x98,0xe4,0xae,0x1c,0x5a,0xde,0xd2,0x45, + 0xe3,0xa2,0x4c,0xd6,0xa4,0x34,0x9e,0x35,0x44,0x22,0xb4,0x4c,0x2,0xdc,0x2b,0x37, + 0x3a,0xaf,0x3,0x7a,0x78,0xc2,0x7d,0xe1,0xc3,0xa5,0x8c,0x48,0x73,0x16,0x36,0x60, + 0x87,0x26,0x20,0x43,0x1f,0x41,0xad,0x6e,0xce,0x46,0x19,0x99,0xa4,0xca,0x3c,0x87, + 0xdc,0x2d,0x52,0x64,0x0,0xe9,0xae,0xb5,0x45,0xaf,0xd2,0x37,0x1,0x21,0x77,0xfb, + 0x8,0xb4,0xec,0x40,0x45,0x63,0xcd,0x27,0x4d,0x9e,0xb6,0x25,0x9f,0x7b,0x98,0x59, + 0x29,0x85,0x17,0x23,0xeb,0x3e,0xd6,0x81,0xee,0x34,0xf5,0xee,0x6,0xd0,0x24,0xbf, + 0xbd,0x4b,0xe1,0x2e,0x79,0xe6,0x15,0x5f,0xa1,0xb3,0x17,0x8e,0x80,0x1b,0x8d,0x75, + 0xfb,0x54,0x8,0xa2,0x82,0x49,0x22,0xd7,0x50,0x50,0x4f,0x5a,0xd7,0x75,0x89,0xc7, + 0xc5,0xaa,0xd6,0xb,0xdf,0x30,0x1a,0x1b,0x32,0x28,0x15,0x36,0xfa,0x9c,0x5a,0xa8, + 0x98,0x35,0xd0,0x1a,0x69,0x13,0x35,0x77,0x2a,0xbe,0x20,0x96,0xab,0x5,0x1b,0x84, + 0xd7,0x2b,0x6,0x48,0xaf,0xa5,0xd8,0xf3,0x1c,0x7a,0x22,0x93,0xc9,0xac,0x6c,0x4a, + 0x7b,0xea,0x94,0x96,0x2c,0x46,0x95,0x96,0xb,0x26,0xe3,0x62,0x78,0x23,0x5e,0xc3, + 0x61,0x74,0xaa,0x79,0x38,0x2b,0x21,0x6b,0x6b,0x1b,0x1b,0x9b,0x16,0x43,0x3b,0x2d, + 0xae,0x15,0x89,0xcd,0xf7,0x39,0xa7,0xaa,0x93,0xe0,0x41,0x1e,0xf6,0x36,0xeb,0x59, + 0x21,0xee,0x80,0xc9,0xef,0xce,0x5d,0xbc,0xb4,0x12,0x7f,0x32,0x47,0x3d,0x5c,0xe9, + 0x99,0x68,0x69,0x2f,0x67,0xe8,0x49,0xa7,0x54,0xad,0xcb,0x8b,0x50,0x24,0xa,0x85, + 0xe9,0xdc,0xe6,0x34,0xbd,0x27,0x6,0x93,0xba,0xd,0xab,0xce,0x8a,0xf9,0x5f,0xcd, + 0xf8,0xb3,0xf7,0x26,0x33,0xd2,0x95,0x58,0x11,0xd2,0xdd,0xce,0x25,0x54,0x39,0xf9, + 0x21,0x97,0xb3,0xb5,0x11,0xdf,0xa3,0xa7,0x20,0xa3,0xa7,0x35,0x3a,0xa1,0x45,0x75, + 0xc2,0xe8,0xe5,0x3a,0x2f,0x49,0x5,0x60,0x50,0x6d,0x4,0x9a,0x3a,0xfa,0x3,0x17, + 0x2e,0x91,0xbe,0x9c,0x49,0xe8,0x72,0xcf,0xe1,0x57,0x6e,0x2f,0x25,0x5,0x96,0xf4, + 0xb5,0x6b,0xf,0x18,0x50,0x89,0x91,0x93,0x66,0x80,0x60,0xc5,0xcc,0x4a,0x5a,0x45, + 0x9b,0xa8,0xf7,0xad,0xa3,0x13,0xa5,0x8e,0x6f,0xf0,0x79,0xf3,0xcd,0xa5,0xe0,0xf6, + 0x49,0xa7,0x1f,0xd4,0x3a,0x83,0x6d,0x92,0xc9,0x4c,0x99,0x91,0x6d,0x8e,0xb1,0xad, + 0xe6,0x7d,0xe2,0x62,0xf3,0x64,0xd5,0x5d,0x31,0xa4,0x49,0xe9,0x42,0x3b,0x8a,0xb2, + 0x2c,0x29,0x53,0x26,0xf7,0x1c,0xe6,0x72,0x98,0xea,0xdd,0x6c,0x7f,0xef,0xe3,0x8b, + 0x80,0x53,0xb0,0xa9,0x6d,0xc1,0xd0,0xf2,0x68,0xeb,0x0,0xf0,0xbd,0xb,0x97,0x41, + 0x1,0xfa,0x24,0x48,0xde,0xcb,0x9a,0x74,0x1,0xe,0x4,0x46,0xea,0x77,0x5f,0x3, + 0xb9,0x71,0xa8,0xf,0xc,0x45,0xdd,0x23,0x5,0x75,0x54,0xf1,0xbd,0x12,0xdd,0x9d, + 0xda,0x6e,0x93,0x49,0xcf,0x14,0xde,0x26,0x77,0x4b,0xd7,0xec,0x60,0xc8,0xe9,0x4e, + 0xb7,0x60,0x98,0x9e,0xb6,0xf5,0xfd,0xdf,0xfd,0xb3,0x1f,0xbd,0xff,0x9d,0xff,0xf4, + 0xa7,0x3f,0xd8,0x1c,0x48,0xe3,0x47,0xc2,0xa7,0x49,0x0,0xe,0x9a,0x20,0x3e,0x12, + 0xf7,0x74,0x63,0x5b,0x96,0x4f,0x4,0xab,0x3a,0xcc,0xe0,0x5b,0x20,0x69,0xc5,0xf4, + 0x30,0x7a,0xf2,0x6c,0x82,0xec,0x2f,0xa6,0xe2,0x59,0xb,0xc0,0x7d,0x68,0xd3,0x42, + 0x23,0xd2,0x80,0x82,0x1e,0xa8,0x7,0xf1,0x5,0x98,0x38,0xc4,0x26,0xd1,0xa1,0x69, + 0xbb,0xc7,0xb8,0x98,0x9,0x56,0x20,0xe6,0x22,0x69,0xc2,0x2e,0x15,0xe,0xc3,0xca, + 0xae,0xcb,0xd1,0x1f,0x86,0x8d,0xa1,0x8a,0x7c,0xf0,0xc5,0xc4,0xe6,0x16,0xe,0x41, + 0x4f,0xd,0xae,0xbb,0xe7,0x73,0xf7,0x30,0x75,0xee,0x51,0x33,0x4d,0x3b,0x50,0x3e, + 0xcb,0x66,0xdb,0x79,0x27,0x77,0x26,0x26,0xc2,0xe8,0x7,0x22,0x49,0x30,0xcf,0x3f, + 0x5c,0xee,0xac,0x17,0x5b,0x66,0xcd,0x3d,0x3f,0x15,0xc,0xa2,0x82,0xa4,0x54,0x78, + 0x7a,0x5f,0x59,0x2e,0x6e,0xd1,0x46,0x4,0xd1,0x4c,0xa9,0x8c,0x30,0xd9,0x2,0xac, + 0x56,0xf,0x2e,0x3a,0x63,0xa,0x65,0xf2,0x7d,0xc,0xa1,0xe,0x87,0x82,0xcb,0xe, + 0xc1,0x74,0xd2,0xd3,0xdf,0x89,0x90,0x3e,0xdf,0x42,0x40,0x31,0xd3,0x4b,0x88,0x58, + 0xc5,0x7e,0xa3,0x8d,0x8e,0x19,0x17,0x5,0x4b,0xe8,0x47,0x2d,0x81,0x95,0xf5,0x41, + 0x4d,0x0,0x19,0xf0,0xa4,0x91,0xdd,0xe0,0xea,0x8a,0xd4,0xea,0x1a,0x1,0x35,0x33, + 0xf4,0xff,0xe9,0x2,0x2e,0x8d,0xe0,0xa8,0xda,0x14,0xb4,0xf5,0x3e,0x77,0xe2,0x94, + 0x71,0xcf,0xb6,0xe6,0xc2,0xe1,0xc0,0x84,0x4c,0x54,0x7a,0xd5,0xfc,0xa7,0x2f,0x84, + 0xe5,0xac,0x27,0x13,0xad,0x25,0xf6,0x7c,0xe0,0xe5,0xc7,0x56,0x79,0xba,0xba,0xb8, + 0x2e,0x68,0x6c,0x66,0xff,0x2e,0xe,0x41,0xe6,0xfc,0x1f,0x44,0x3f,0x1e,0x7,0x52, + 0x7d,0xeb,0x6f,0xc5,0x64,0x1a,0xe,0xa,0x2f,0x7,0x9,0x92,0x76,0x2f,0x2e,0x57, + 0xe8,0x9c,0x2,0x1b,0x4f,0x88,0x5e,0x44,0xba,0x43,0xa0,0xcd,0xd6,0x11,0x62,0xc4, + 0xcf,0x7b,0xd9,0xa7,0x11,0x38,0x29,0x79,0x31,0xb9,0xbc,0xe5,0xf5,0xa7,0x90,0x8b, + 0xf2,0x8a,0x54,0xa7,0x23,0x48,0xa9,0xf4,0xf1,0x3c,0x44,0x3b,0x7a,0x4d,0x4f,0x3c, + 0xae,0x96,0x94,0xcf,0x6d,0xfe,0xca,0xd1,0xb3,0x5b,0xa6,0x39,0x13,0x32,0xc0,0xb8, + 0x3f,0xa8,0x37,0xd5,0xe4,0x7d,0x8,0x16,0x58,0x4c,0x68,0xe7,0x22,0xd3,0xd,0x41, + 0x5,0xce,0xa,0xd8,0x5,0x1c,0x86,0x6a,0x2b,0x88,0x54,0x25,0x96,0x79,0xae,0xe1, + 0xcc,0x68,0xd,0x2f,0x28,0x74,0xcd,0xee,0xd,0xb4,0x54,0x65,0x9,0xca,0xe7,0xf3, + 0x44,0x18,0x9a,0x1a,0x6,0x2b,0xd1,0xb9,0xc4,0x79,0x2d,0xd8,0xfb,0x2d,0x86,0x63, + 0x5b,0xdc,0x71,0x20,0x7c,0x61,0x67,0xf3,0x54,0xeb,0x41,0xc2,0x61,0x29,0xcb,0xa, + 0xbb,0x13,0x54,0x9f,0xdc,0x42,0x93,0x2,0x5f,0x4,0x8f,0x87,0xf8,0xfa,0x29,0x87, + 0xf8,0xa7,0x40,0xc8,0xa,0xb9,0x2b,0x8c,0xf6,0x29,0x35,0x2e,0x44,0xe6,0xb1,0x61, + 0xb2,0xb5,0x74,0xad,0x11,0x9c,0x5,0xf3,0x1c,0xea,0x6,0x57,0xc3,0xc6,0x16,0x62, + 0x94,0x9,0x82,0xac,0x8e,0xaa,0xac,0x43,0x6d,0x87,0xdd,0xf7,0xc9,0xfc,0xaf,0x15, + 0x36,0xa6,0x98,0xb8,0xc8,0xef,0x32,0xa6,0xac,0x6b,0x40,0xab,0xe7,0xbd,0x5b,0x74, + 0xfb,0x41,0xad,0xeb,0x14,0xcd,0xc2,0xcf,0xe8,0x51,0x9d,0x18,0xc4,0xd0,0x59,0xf8, + 0xd6,0xe4,0x83,0xa1,0x5c,0x87,0x13,0x1f,0x90,0xb1,0x16,0xb4,0x73,0x61,0x94,0xe9, + 0xb5,0xaf,0xc8,0xf7,0x85,0xcf,0xb0,0x3e,0x2b,0x95,0x1b,0x6b,0xed,0x79,0x6c,0x18, + 0x3c,0x75,0xe6,0xaf,0x30,0x54,0xaa,0x8a,0xbd,0x8c,0xd1,0x55,0xd0,0xe,0xf2,0x75, + 0x5e,0x5c,0x8b,0x89,0xac,0xb2,0xd4,0xcc,0x73,0xb9,0xf,0xe1,0xc6,0xd9,0xb3,0x67, + 0x8b,0x55,0xf3,0x5b,0xf7,0xd7,0x5a,0x77,0xd9,0x53,0x1b,0xf8,0x15,0x66,0xb1,0x2b, + 0x6d,0x22,0x30,0xf5,0x8,0x68,0xeb,0xbc,0xbb,0xb3,0x89,0xaf,0xfb,0xd0,0xc6,0x7b, + 0x46,0xbe,0x40,0x77,0x95,0x33,0xf6,0x17,0x6b,0x78,0x86,0xa9,0xd7,0xae,0xb7,0x23, + 0x19,0x91,0x75,0x20,0x68,0x8a,0xe2,0xe5,0xe4,0x8f,0xb0,0xf8,0x38,0xee,0xd2,0xb6, + 0x51,0xbb,0x20,0x68,0x12,0x87,0xda,0x16,0x7e,0x8f,0x93,0x3c,0xd8,0x8e,0x11,0xf9, + 0x6e,0x1c,0xe,0x1c,0x83,0xe4,0xb3,0xfd,0x3a,0x94,0xcc,0xf0,0x42,0xe8,0xfb,0xff, + 0xd9,0xcf,0x7c,0xfc,0xb7,0xff,0xfb,0xbf,0x7c,0x27,0xab,0xfe,0xee,0x2f,0xfc,0xcc, + 0x47,0x6a,0x22,0x4c,0x9d,0x62,0xbd,0xcf,0xac,0x2d,0x4e,0xa3,0xc4,0x64,0xe,0x7b, + 0x9c,0xea,0x11,0xa2,0xe8,0x20,0x20,0x63,0xe2,0x68,0x52,0xd0,0x57,0xc2,0x34,0x9d, + 0x96,0xd8,0x75,0x6e,0x4b,0x61,0xb8,0x72,0xb8,0xac,0x59,0x1a,0xe,0x84,0x60,0x3b, + 0xee,0xe0,0xf,0x49,0x35,0xa2,0x1b,0x88,0xfa,0xe8,0x40,0x13,0xad,0x35,0xcd,0x10, + 0x9e,0x31,0xa2,0x54,0x55,0x53,0x55,0x53,0xd7,0x2f,0x46,0xa5,0xe3,0x6a,0x78,0xc3, + 0xef,0x30,0x88,0x9f,0xee,0xeb,0x91,0xa4,0x1f,0x19,0x75,0x68,0xa9,0xf2,0xc3,0x4b, + 0x20,0x86,0xf9,0xcb,0x6a,0xe2,0xc,0x76,0xaf,0x10,0xc2,0x3c,0xb6,0xe1,0xb8,0xe7, + 0xa1,0x65,0xc4,0x61,0x65,0xf5,0x9c,0xf8,0x6b,0x90,0xd7,0x6c,0x63,0x6,0x58,0x56, + 0x3c,0xb,0x10,0x32,0x38,0x11,0x1b,0x8a,0xf,0x29,0x3a,0x74,0xe7,0x73,0x4c,0xd4, + 0xc4,0xa3,0xfc,0x95,0x6a,0x5c,0x33,0x64,0x60,0x13,0xea,0x42,0xb,0xb7,0x8,0xe6, + 0xda,0x82,0x14,0x2f,0xd8,0x6f,0x18,0x39,0x87,0x3,0x9b,0xdc,0x14,0xc2,0xea,0x52, + 0x50,0xb5,0xed,0x97,0x93,0xe,0x46,0x23,0xe3,0x1d,0x54,0x1a,0x59,0x89,0x8a,0x6c, + 0x88,0x80,0x21,0x48,0xe2,0x9d,0xaa,0xcb,0x12,0x1b,0xa3,0xe9,0xac,0xef,0xbb,0xaa, + 0xfb,0x54,0xd6,0xa0,0x38,0x76,0x75,0x76,0xfb,0xb0,0xc9,0x31,0x54,0x75,0x18,0x60, + 0xcf,0xe2,0x30,0xfa,0x65,0x2c,0x79,0x59,0x6d,0x29,0xbe,0xc1,0xde,0x8b,0x47,0xb6, + 0xba,0x92,0x67,0x8b,0x3c,0x68,0xd8,0x92,0xab,0x9c,0xfb,0x44,0xf6,0xef,0xd8,0xd7, + 0xa2,0x6b,0xaa,0x96,0x8d,0x43,0x15,0x6b,0x50,0x2,0x43,0x8f,0x61,0x27,0x2b,0x54, + 0xbd,0x28,0x38,0x83,0xff,0x34,0xf1,0xe7,0xf0,0x7c,0x56,0x94,0x2a,0x79,0x2c,0x86, + 0x20,0x74,0x48,0xc4,0x8,0x9a,0x3,0xff,0x15,0x21,0x3c,0xd6,0x9c,0xc3,0xd0,0x51, + 0xd4,0xbe,0x9e,0x63,0x8b,0x5f,0x29,0x9c,0xf5,0x1c,0xc3,0x97,0x21,0x37,0x6c,0x94, + 0xec,0x24,0x23,0xce,0x22,0x4e,0xbb,0xeb,0xef,0x53,0x5,0xcf,0x18,0xe3,0xe4,0xd6, + 0x41,0x7a,0x9b,0xee,0xfb,0xff,0xf9,0xcf,0x7c,0xfc,0xdd,0x5f,0xf8,0xd9,0x8f,0x5f, + 0xff,0xa7,0xff,0xf2,0x9d,0x55,0x3,0x9a,0x13,0xae,0x6c,0xd1,0x5a,0x75,0x39,0xee, + 0x6a,0x5,0x27,0xc3,0xbc,0x7,0xb1,0xce,0x18,0xc,0x9a,0x25,0x8c,0x76,0x3f,0xf3, + 0x4b,0xf,0x7,0x5a,0x1c,0x4b,0xd5,0x2f,0x81,0x1c,0xb,0x83,0x47,0x31,0x9c,0xe8, + 0x84,0x72,0x32,0x90,0xf4,0xb3,0x90,0x2c,0xd6,0x41,0xe6,0x8e,0x9,0x63,0xda,0x22, + 0x80,0xc3,0x63,0x19,0x62,0xc2,0x74,0x0,0x8,0xc5,0x35,0x86,0x3a,0x1d,0x14,0x86, + 0xc4,0x76,0xe4,0x81,0x58,0x1f,0xe0,0x60,0xe1,0x8,0x4,0x74,0x18,0x3d,0x2b,0xc0, + 0x44,0x14,0xcd,0x5a,0x71,0x82,0x9d,0x10,0x7a,0xc4,0xe7,0x6e,0x53,0x70,0xdf,0xbd, + 0xc7,0x6,0x85,0xd6,0x35,0x23,0xc,0xf8,0x5d,0xbf,0xfa,0xef,0xfd,0xc2,0x4f,0x7f, + 0xfc,0xd7,0xff,0xe4,0x47,0xef,0x0,0xc2,0x92,0xf3,0x0,0xeb,0xa1,0xd7,0x8d,0x1c, + 0xd8,0xcc,0xa8,0xd4,0xe5,0xc6,0x6b,0x38,0x2e,0x89,0x1f,0x9c,0x2c,0x6f,0x7a,0xb4, + 0x9c,0x38,0x19,0x30,0xc,0xe0,0x1a,0x98,0xc6,0x91,0xb0,0x56,0x12,0xc1,0xb2,0x8d, + 0x84,0x91,0xc7,0x5d,0xea,0xbb,0x3e,0x69,0xd2,0xf,0xf3,0xb6,0x35,0x24,0x35,0x8d, + 0xab,0x62,0x6b,0x82,0xce,0xac,0x4f,0x8d,0x41,0xe4,0x5e,0x84,0x89,0xa9,0xf8,0xc1, + 0x43,0xa7,0x2c,0xe3,0xd0,0x8f,0x4,0x6,0xb9,0x43,0x58,0x2b,0xc4,0x49,0x5e,0xca, + 0x2c,0x9e,0xad,0x61,0x4d,0x29,0x30,0x54,0x28,0x4f,0x49,0x1,0x51,0xa3,0x3d,0xee, + 0xee,0x27,0xd7,0xe0,0x58,0x33,0x24,0x41,0x63,0x60,0xdd,0x8,0x8d,0xf7,0x51,0x60, + 0x68,0xc2,0x90,0x57,0x36,0xc5,0x45,0xef,0x77,0xeb,0x57,0x5e,0x33,0xe4,0x7c,0xe9, + 0xbd,0x1c,0x92,0x3e,0xdb,0x6b,0x97,0x15,0xaf,0x8f,0x5a,0x25,0x5a,0x72,0xa1,0xe, + 0x91,0x77,0xcb,0xec,0xaa,0x9e,0x80,0x5c,0x52,0x34,0x5d,0x9d,0x63,0x5b,0x95,0xa, + 0x98,0x15,0xba,0xf2,0x99,0xa8,0xce,0x44,0xe7,0xd6,0xaf,0xf,0xbe,0x48,0x95,0x56, + 0xcc,0x61,0xe,0xc6,0x81,0x6e,0x21,0x6d,0x23,0xda,0x80,0x63,0x9a,0x4d,0x94,0xdb, + 0x64,0x37,0xa1,0x16,0x57,0xb0,0xf3,0x16,0xe7,0x3d,0x52,0xf8,0x59,0xa6,0xef,0xbf, + 0xca,0x89,0xcf,0xce,0xb7,0x78,0xb8,0x67,0x4b,0xaf,0x7d,0xb5,0x57,0xb7,0xc4,0xf3, + 0x43,0xb2,0x7b,0xa0,0xf7,0x3d,0x29,0xb2,0x89,0xb7,0x10,0x59,0xe8,0x87,0x2b,0x1, + 0xd5,0xa4,0x8,0xde,0x8f,0xe6,0xa9,0x6f,0xc6,0x2a,0xc4,0x34,0x32,0xb6,0xd5,0xc8, + 0x68,0x1,0x0,0x6d,0xc4,0xd7,0xe7,0x97,0x75,0x6e,0x93,0x6,0xef,0xd1,0x18,0xa7, + 0x39,0xce,0x80,0x93,0xd5,0x4b,0x28,0x46,0xb9,0x6d,0xdd,0xaa,0x9a,0x39,0xbc,0x67, + 0x50,0x4c,0xb2,0x3f,0x47,0xf4,0x6e,0x75,0x74,0x21,0xd1,0xac,0x55,0x91,0x29,0xf9, + 0x8a,0x65,0x63,0x87,0x81,0x52,0x2b,0x75,0xb3,0x11,0xe6,0x95,0x6e,0x3b,0x19,0xc0, + 0x73,0x86,0x58,0x6d,0xfe,0xda,0xe6,0xc0,0xe9,0x3d,0xd9,0x20,0x77,0xfc,0xda,0x3f, + 0xfe,0xd1,0xfb,0x6f,0xfe,0xe2,0x4f,0x7f,0x44,0xca,0xba,0x3e,0xe3,0x3c,0x23,0x1d, + 0x7d,0x90,0xaa,0xb1,0x69,0xd6,0xc,0x76,0x96,0xd5,0x68,0xac,0xab,0x14,0x52,0x49, + 0xef,0xd3,0x49,0xf,0x35,0xe7,0xf7,0xf5,0x3a,0x98,0x76,0x9f,0x1b,0x13,0xbe,0xd6, + 0x6c,0x73,0x2b,0xf1,0x84,0x11,0xcd,0xd6,0x4a,0x69,0xd,0xb3,0x5,0xa1,0x62,0x2b, + 0x57,0x8d,0xfd,0xcb,0x68,0x6a,0x4f,0xf2,0x93,0xcf,0x9a,0x31,0x4e,0x2,0x7,0x73, + 0x19,0x84,0xfa,0x96,0x38,0x32,0x61,0x26,0x9f,0xfa,0x60,0x49,0xe8,0xb5,0xc3,0xc7, + 0x74,0xd8,0x88,0x86,0x99,0x4,0x25,0xa,0x8a,0x5e,0x5c,0x5e,0x5f,0xff,0xf,0xa2, + 0x16,0xa9,0x96,0xcb,0x44,0xb2,0xf9,0xf,0xda,0x2c,0x97,0xce,0x11,0x67,0x40,0xcb, + 0x49,0x87,0x74,0x9e,0xc3,0xb8,0x5c,0x17,0x99,0xcf,0x8,0xdb,0x6d,0xbe,0x41,0xe6, + 0xe8,0xb1,0x44,0x45,0x60,0xc2,0x2b,0xd6,0x4c,0xf2,0x2e,0x9e,0x20,0x75,0x4b,0xcc, + 0x4a,0xac,0x3c,0x51,0x3e,0xca,0xf4,0x8c,0x1e,0x19,0x51,0x35,0xb9,0x38,0x74,0x4a, + 0xe9,0xd2,0xcc,0x60,0xc0,0x9,0x22,0xc0,0x42,0x96,0x59,0x61,0xef,0xdf,0xe5,0xea, + 0x93,0x6b,0xe2,0x84,0x93,0xd1,0xd6,0x6e,0xa7,0x55,0x85,0xd8,0x54,0x12,0x5d,0xd1, + 0x74,0x83,0x5a,0x1b,0x4d,0xcf,0x3c,0x22,0x94,0x4c,0x90,0x64,0xd5,0xbb,0x5,0xb8, + 0x7e,0x83,0x5a,0x3,0xb,0x5f,0x8a,0xbb,0x3d,0x46,0x20,0x8c,0x62,0x4b,0xae,0x1b, + 0x5d,0xaf,0xa9,0x7c,0xf2,0x8,0x60,0x6b,0xdb,0xaa,0xfe,0x3f,0xe9,0xf7,0x79,0xb5, + 0x95,0x58,0xed,0x77,0x20,0xda,0x17,0x66,0x78,0x3,0xd7,0xa0,0xa0,0xf8,0x50,0x9b, + 0xab,0x68,0x8c,0xe9,0xf2,0x8e,0x39,0x29,0xd6,0x85,0xb8,0xf7,0xcf,0xef,0xbe,0x74, + 0x53,0x4f,0x1c,0x46,0xd,0xde,0xf3,0x84,0x35,0x3c,0x83,0x4,0xc6,0x2a,0x6e,0xa7, + 0x6a,0xd7,0x5c,0xf7,0x41,0xec,0x2c,0xab,0x3a,0x61,0xa1,0x7a,0x55,0xd9,0x4e,0x33, + 0xc6,0xd4,0x1f,0x30,0x54,0xd2,0x92,0xe7,0xd,0x2a,0x56,0x4d,0x7f,0xb8,0xc2,0xdc, + 0xa5,0xdd,0x26,0x1a,0xfb,0x7b,0xcf,0x41,0x86,0x60,0x3f,0x7b,0x75,0x72,0x79,0x7f, + 0xa0,0x13,0x35,0x1c,0xdf,0xea,0x9a,0xce,0x9c,0x2a,0x1,0x31,0xa1,0x11,0x21,0x84, + 0x87,0x84,0xf1,0xf4,0x70,0x6c,0x81,0x6a,0x7e,0xf0,0x19,0x2c,0x4a,0x64,0x1f,0x23, + 0x82,0xf5,0xa,0x8c,0xe1,0x55,0x2c,0x3d,0xfd,0x65,0xa9,0x98,0x10,0x1e,0x26,0x7d, + 0xe7,0x9c,0xc9,0xa7,0x13,0xcf,0x3a,0x46,0x3d,0xb7,0x7d,0xcc,0xd0,0x12,0x42,0x86, + 0xc3,0x5c,0x2d,0x63,0x26,0x84,0xa1,0x7a,0x95,0xcd,0x30,0xf2,0xc0,0x21,0xf5,0x4c, + 0x27,0xb2,0x5c,0x4f,0x6c,0x2e,0x6c,0x5e,0x21,0x4c,0x9d,0xe5,0x4d,0x58,0xec,0xc5, + 0x7c,0xce,0xff,0x4f,0x6d,0x84,0xe4,0xda,0x8d,0xac,0xa9,0xa1,0x68,0x66,0x79,0x2, + 0xa1,0x2d,0x1f,0x9f,0xfc,0xc6,0xa,0x7e,0x40,0xe2,0xde,0x9a,0x90,0xf8,0xfc,0x2c, + 0xd1,0xc0,0x64,0x7,0xaf,0xe8,0x3,0x6e,0x7b,0x30,0x5,0xbd,0x52,0x54,0x64,0x4c, + 0xd7,0x16,0x87,0xa5,0x66,0x3a,0xf2,0x33,0xfa,0x96,0x81,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x65,0x6a,0x98,0xfb,0x5c,0xd8,0x5e,0xe8,0x8f,0x73,0xa2,0x57,0x8d, + 0xdc,0x48,0x5,0x7b,0xe2,0xc4,0x25,0x3,0xac,0x82,0x20,0xca,0x42,0xa7,0xb1,0x24, + 0x11,0x8c,0xf9,0xd,0xd7,0x4a,0x9b,0xa5,0x2,0xe6,0x2f,0x21,0x4e,0x2e,0x22,0xa2, + 0xf0,0x3a,0xe0,0xee,0x77,0x53,0x22,0xe8,0x3,0xe8,0x3b,0xb6,0xa5,0x47,0x7c,0xf2, + 0x94,0x9b,0x6d,0x6e,0x94,0xf0,0xdd,0xc9,0x32,0x70,0xa,0x6,0x6d,0x5d,0x9c,0xe6, + 0x18,0xd3,0x7,0xb6,0xf,0x1b,0xc4,0xae,0x2d,0x87,0xcc,0xa1,0xf,0xee,0x7a,0xb6, + 0x3f,0x2e,0xa9,0xe6,0xef,0x4,0xf3,0xb3,0x46,0xa2,0x26,0x45,0xbe,0x75,0x50,0x54, + 0x71,0xa4,0x46,0x91,0xee,0xfb,0xf3,0x94,0xb0,0xec,0x82,0x56,0x81,0xf8,0x1a,0x4c, + 0x31,0xb4,0x36,0x6d,0xfd,0xe3,0x51,0x8a,0x7b,0x21,0x63,0x18,0x44,0x8e,0x4a,0x92, + 0x14,0x8d,0x85,0x12,0x7,0x34,0x5d,0x99,0x8b,0x87,0x40,0x6c,0xa9,0x5c,0x27,0x32, + 0xf4,0xca,0xcd,0x52,0xdf,0x79,0x66,0x0,0x13,0x29,0x22,0x8,0x78,0x39,0xa,0x47, + 0x74,0xee,0xdc,0x94,0xc5,0x62,0xb3,0x83,0x7d,0x76,0x94,0xcd,0x1d,0x2a,0x21,0x56, + 0x8,0xb9,0x83,0x87,0xcd,0xd5,0x60,0xe7,0x2a,0x1b,0xd,0x9b,0xb2,0x34,0x36,0x4d, + 0x39,0xac,0x16,0xa5,0x2a,0x8f,0x92,0x9d,0x26,0x64,0xe,0x63,0x3c,0xb5,0x8c,0x31, + 0x90,0x3e,0x20,0xd6,0x9a,0xf4,0x19,0xf8,0x27,0x98,0x5e,0x7c,0x4a,0xb8,0xde,0x3a, + 0x49,0x1e,0x84,0x3c,0xdb,0x45,0x36,0xc,0x8b,0xd4,0xac,0x9a,0x16,0x7d,0x2a,0x64, + 0x59,0x29,0xd9,0xf2,0xaa,0xb8,0xe4,0x35,0x4e,0xb5,0x63,0xab,0x85,0x9b,0xc6,0x73, + 0x5b,0xde,0x22,0x99,0x6b,0xe3,0x59,0xbe,0xa6,0xbd,0x45,0x4a,0x9f,0x65,0x8e,0xbd, + 0xb1,0x2b,0xb9,0x69,0xbd,0x27,0x61,0x8b,0x41,0xd0,0x54,0x42,0x16,0x4c,0xfb,0x97, + 0x61,0xa4,0xb2,0xc7,0xc1,0xf6,0xec,0xbd,0x5e,0x97,0xda,0xca,0x5a,0xb,0xd8,0x88, + 0x2b,0xb4,0x1e,0x1f,0x73,0x16,0x5b,0x5a,0x78,0x9b,0xa3,0x44,0x57,0x52,0xe3,0x26, + 0x85,0x52,0xfa,0x95,0x29,0x7d,0xd9,0x26,0x5,0x6c,0x59,0x6c,0xd,0x0,0xf3,0x2f, + 0x6f,0xc4,0xae,0x6a,0x2e,0x6c,0x49,0x99,0xe9,0x1,0xc3,0x8b,0x1a,0xad,0xc0,0x9b, + 0x2,0x58,0x85,0xf9,0x4b,0x1e,0x49,0xc2,0x27,0x61,0x3b,0xf9,0xa4,0x25,0x54,0x4a, + 0x86,0xa3,0x1c,0xda,0x9c,0x8f,0xce,0xf1,0xf8,0x43,0xd7,0x9,0xb0,0xbe,0xae,0x92, + 0x7e,0x18,0x67,0x88,0xcc,0xc4,0xd3,0x5b,0xa3,0xeb,0xe4,0xba,0x6a,0x76,0x92,0x56, + 0xa4,0xf,0xc1,0xc1,0x69,0x44,0x69,0xf1,0xa1,0xc8,0x6e,0xf,0x47,0x8d,0xca,0x9a, + 0x6c,0x68,0x58,0x5e,0x90,0xac,0x7a,0xbd,0x11,0x37,0xb9,0x10,0x1b,0x17,0xe3,0x2f, + 0x27,0x28,0x2e,0x45,0xca,0x9b,0xab,0xc5,0x89,0xae,0xa9,0x52,0x2b,0x83,0xd4,0x71, + 0xe8,0xb1,0xff,0xe5,0xdf,0xfd,0x7f,0xde,0xab,0xaa,0x7e,0xe7,0x97,0x7f,0xf6,0x83, + 0x6a,0xd9,0xa1,0x7a,0x1d,0xc,0xd,0x8f,0x20,0xb5,0xa2,0xa2,0xdc,0xcf,0x9e,0xc4, + 0xfd,0x95,0x6f,0xa3,0x85,0x93,0xc1,0x96,0xad,0x41,0xd4,0xd4,0xda,0x58,0xd9,0xdb, + 0x83,0x5,0xb0,0x9,0xee,0x73,0x36,0xb3,0x43,0xf8,0x27,0xb9,0x6a,0x44,0x1f,0x7d, + 0x2c,0xf4,0xe1,0xd9,0xe2,0xde,0x9c,0xac,0x36,0xe6,0x1,0x8c,0x62,0xe,0x7c,0xd1, + 0xdf,0x65,0xcd,0xd2,0xae,0x67,0x6,0x55,0x4a,0x9a,0x5c,0xb,0x6,0x53,0x13,0x83, + 0x21,0xf7,0x10,0xff,0x69,0xe,0x92,0xa1,0x5d,0x2,0x7,0xa9,0x59,0x1f,0xa3,0x6a, + 0x4f,0x86,0x98,0x42,0x38,0x4b,0xe3,0xbd,0x42,0xea,0x90,0x6c,0x4d,0x7,0xd8,0x61, + 0x1e,0x89,0x5b,0x85,0x44,0x78,0x5c,0xdb,0x5e,0xcc,0x4a,0x53,0x63,0x74,0xa,0x38, + 0x64,0xde,0x74,0x71,0xcd,0x25,0x31,0xca,0xde,0x12,0x56,0x7,0x2c,0x3e,0x41,0xa4, + 0x8c,0x39,0x6a,0xc7,0x83,0xf8,0xd,0x18,0x14,0x47,0xca,0xbd,0x77,0xb3,0x4,0xa6, + 0x1f,0xfb,0x6a,0x2b,0xe8,0xa1,0x51,0x1,0x73,0x3e,0x41,0x53,0xe,0x48,0x39,0xbc, + 0x9e,0x83,0x6c,0x38,0xf7,0x84,0x30,0x8d,0xc6,0xd0,0x4d,0xdd,0x9d,0x7,0x62,0xe6, + 0xe0,0x7b,0xde,0x40,0xa9,0x9,0x3e,0x3e,0xac,0xfd,0x6e,0x88,0x85,0xa3,0xd1,0x95, + 0x4d,0x22,0xa8,0xdb,0x18,0x3a,0x82,0x61,0x13,0x32,0x88,0x14,0x4b,0x39,0x10,0x83, + 0x11,0x48,0xb6,0xf7,0xf4,0xa0,0x20,0x3b,0xc1,0x12,0xa6,0xd5,0xef,0x81,0x8d,0xb2, + 0x7f,0x34,0x79,0x48,0x1,0x9f,0x47,0x1e,0x15,0xad,0xc5,0x34,0x7,0xf3,0x89,0x6f, + 0xd1,0x44,0x58,0x30,0xec,0x6b,0x38,0xe4,0x5c,0xed,0x9d,0x73,0x51,0x4,0x23,0x9d, + 0xaa,0xf7,0x5,0xbb,0xcc,0xb1,0xc7,0x75,0xf,0xca,0xc3,0x3d,0x58,0xc4,0x44,0x7a, + 0xcc,0x0,0x7b,0xe2,0x94,0x1,0xb2,0xf7,0x67,0x39,0x34,0x34,0xb5,0xef,0x79,0x98, + 0x9f,0x4b,0x7b,0x85,0xc9,0x2f,0xa0,0x15,0x8f,0x74,0x67,0xc7,0x9c,0xde,0x60,0x75, + 0x2d,0x8,0x3d,0x43,0xe3,0xa8,0x5d,0x3c,0xa4,0x9,0xb6,0xb6,0x8c,0xf9,0x4b,0xec, + 0x85,0x9f,0x55,0xff,0xf3,0xaf,0x7c,0xef,0xe3,0x2f,0xfd,0xc3,0x1f,0xbe,0xeb,0x39, + 0x5c,0x36,0x1,0xc5,0xba,0x6e,0x68,0xdd,0x99,0x7f,0x21,0x81,0x4e,0x9c,0xb,0x56, + 0xde,0x8a,0x13,0x68,0x40,0xc1,0xc0,0x32,0xcd,0xc5,0x69,0xa2,0xf,0x32,0x96,0x16, + 0xc,0xa5,0xa4,0xed,0x1b,0xd3,0x11,0x30,0xab,0xc2,0x34,0xb7,0xaf,0xe1,0x0,0x46, + 0x40,0xee,0xee,0x9b,0x1d,0xac,0xed,0x55,0x3d,0xb0,0x93,0x46,0x6c,0xae,0x36,0x2c, + 0xf4,0x1a,0xc1,0x45,0xd1,0xef,0x7d,0x48,0x35,0x46,0x36,0x10,0x2a,0x5c,0x52,0xa5, + 0xc1,0xfb,0xed,0x8d,0x15,0x29,0x3e,0xd0,0xe6,0xbf,0x7e,0x7,0x24,0x13,0xbf,0x88, + 0xa4,0x64,0xb5,0x4c,0xcc,0xe6,0xb3,0xba,0x28,0x2,0x5c,0x6c,0x66,0xc3,0x5a,0x52, + 0x69,0x71,0x5b,0x76,0x42,0xa0,0x77,0xc2,0x33,0x42,0x85,0xed,0xdd,0x98,0x86,0x1, + 0x8a,0xd3,0x8,0x8c,0x7a,0xaf,0xd5,0x8,0x6,0x3a,0xf7,0x3d,0x55,0xed,0x2a,0x16, + 0x2,0x65,0x74,0x3b,0x11,0x6,0x49,0x18,0x97,0x9,0x1,0x37,0xfe,0x42,0x8c,0x9c, + 0x5e,0x5b,0xab,0x3c,0xe0,0xf2,0x2a,0x31,0xf4,0xd1,0x14,0x6d,0xcd,0x8b,0x5f,0xe, + 0x75,0x86,0x4c,0xa7,0x55,0xf0,0x6d,0x9f,0x65,0x17,0x5,0xc1,0xca,0x85,0x23,0x24, + 0xb5,0x65,0x29,0x73,0x14,0xb7,0xd0,0x7b,0x6b,0xe5,0x64,0xf0,0x2e,0x96,0x52,0x18, + 0x28,0x26,0x30,0xef,0xf2,0x13,0xdb,0xbe,0xcf,0x58,0x27,0x63,0xcc,0x39,0x34,0x93, + 0xbc,0x73,0xff,0xb5,0x9b,0x50,0x6b,0x53,0x23,0xe6,0xfa,0xb6,0xfd,0x12,0xcb,0x8c, + 0x9d,0x36,0xb1,0x15,0x27,0xc2,0x21,0xd1,0x59,0xf7,0xb6,0x86,0xb7,0xd6,0xc4,0xe2, + 0xe6,0xc0,0xf5,0xbf,0xdd,0xe0,0xa3,0xb3,0xb2,0xbd,0x65,0x34,0x88,0x64,0xc1,0x67, + 0xfb,0xd1,0x88,0x90,0x18,0x61,0xe4,0x66,0x75,0x8a,0x81,0x99,0xd6,0xe6,0xfc,0xa7, + 0x96,0xa3,0x57,0x7f,0x36,0xb,0x3d,0xc4,0x51,0x30,0x9,0x81,0x38,0x60,0xcc,0x27, + 0x93,0x9d,0x2b,0xdc,0xe9,0x4,0x5e,0x17,0xbd,0xa,0x85,0xdb,0x5f,0xa,0x95,0xd1, + 0xf5,0x27,0xfa,0xad,0xc0,0xb,0x24,0xb8,0xfa,0xd4,0xc,0x72,0x7d,0xc8,0x7a,0xa, + 0xf6,0xb4,0xe,0x68,0xe4,0x19,0x51,0x7,0xe,0xac,0x9e,0xbd,0xd6,0x43,0x4f,0x2, + 0xa0,0x92,0x5b,0xaf,0x8e,0xac,0x28,0x39,0x77,0xfc,0x5e,0x54,0xbd,0x4d,0xe6,0x12, + 0xa4,0x13,0xdc,0x4c,0xe0,0x2f,0xe6,0x4b,0xd5,0x31,0x48,0x7b,0x67,0xa,0x7b,0x70, + 0xa8,0xae,0x17,0x7a,0xf8,0x54,0x2d,0x54,0x88,0x2e,0x34,0xb2,0xdb,0x48,0xc8,0xae, + 0x64,0x38,0x12,0x63,0xb6,0xd1,0x2,0x3,0x1a,0x2e,0xba,0x25,0x24,0x38,0x41,0xeb, + 0x5a,0xfd,0xb0,0x59,0x5,0x9a,0xb6,0xb0,0x55,0x4,0x94,0x91,0x3a,0x38,0x4f,0x8d, + 0xe,0xc9,0x72,0xc8,0x18,0x31,0x58,0xb1,0xa4,0x5,0xa8,0x39,0xc3,0x25,0xe9,0x2f, + 0x46,0x85,0x9e,0x1e,0x3a,0xb1,0xfb,0xe9,0xda,0xfb,0x1,0x83,0xc1,0xaa,0x15,0x7a, + 0x3,0xf1,0x3c,0xfb,0xcc,0x9a,0xbd,0x84,0x38,0xc9,0x48,0xaa,0x1e,0x95,0x23,0x4c, + 0x91,0x6,0x53,0xcd,0x8,0xab,0x64,0x13,0xe2,0x45,0xf3,0xaf,0x94,0xfe,0x6a,0x94, + 0x99,0xee,0xe7,0xe6,0xa4,0x4f,0xa4,0xdc,0xe4,0x9a,0xff,0x1d,0x2a,0x9f,0x6b,0xb0, + 0xec,0xbc,0xc4,0xe5,0x4a,0xdc,0xce,0xc,0xa8,0x22,0x7,0x60,0x4b,0x2d,0x56,0x39, + 0x42,0x8a,0x39,0xed,0xae,0xd5,0xd7,0x42,0x32,0x10,0x55,0x13,0x4e,0xf3,0xe6,0x94, + 0x3d,0x24,0xa3,0x2c,0xee,0xe2,0x20,0x4,0xaa,0x3a,0xd0,0xad,0xd9,0xd9,0x0,0xb1, + 0x47,0x4d,0xca,0xb2,0x86,0x8a,0x2f,0xda,0x8,0xd1,0x3,0x8,0x94,0x30,0xd,0x63, + 0x30,0x76,0x4d,0x91,0xf6,0xc2,0x89,0x8f,0x8e,0x56,0xa5,0xf3,0x21,0x9f,0x45,0x81, + 0xd9,0x4e,0x3e,0x8e,0xb1,0xcd,0xd6,0xb7,0xda,0x58,0x9d,0xb9,0xac,0x64,0xb,0xb2, + 0x11,0x71,0x9b,0x70,0xc0,0xb7,0xf5,0x1b,0x52,0x90,0x85,0xe9,0x31,0x94,0xd6,0x1d, + 0xb9,0xf6,0x27,0xcb,0xed,0x59,0xb6,0xc,0x60,0xac,0xbe,0xbe,0x1e,0x68,0x9d,0xf4, + 0xa9,0xec,0xd7,0x62,0xb3,0x41,0x21,0x5b,0x12,0xba,0xa1,0xf9,0xa8,0x6c,0xa4,0xa1, + 0x41,0x26,0x2e,0x1d,0xeb,0xed,0xc3,0xee,0x9f,0xfc,0xac,0xf1,0xf4,0x30,0x29,0xf2, + 0xee,0xe,0x7e,0xfd,0xaa,0x5f,0xf9,0x9d,0x1f,0xbc,0xff,0x83,0xbf,0xf8,0xbd,0x8f, + 0x9,0x13,0x35,0xcd,0xe,0x6d,0xe0,0x3d,0x5a,0xed,0xf7,0xa5,0xfd,0xca,0xef,0xfc, + 0xf0,0xfe,0xc,0xd4,0x3f,0xf8,0x4b,0xdf,0xfb,0x40,0xca,0x6c,0xaf,0xa4,0x54,0x3e, + 0x27,0x4d,0xc4,0x42,0xb9,0x54,0x5b,0x58,0xea,0x3e,0xca,0x52,0xa5,0xb8,0x1,0xe2, + 0xdc,0x6d,0xed,0xd,0x57,0x13,0xd5,0x33,0x65,0x71,0x61,0x2,0xba,0x84,0x5e,0x9b, + 0x88,0x51,0x32,0xa1,0x92,0x57,0x10,0xba,0x5,0x91,0x99,0x27,0x41,0x9,0xd5,0x6, + 0x8f,0x5a,0xff,0xb9,0x8f,0xa1,0x86,0x2f,0xb9,0x4a,0x7b,0x8e,0xa2,0x0,0x5a,0x21, + 0xe5,0xcc,0x34,0xe6,0xd,0xa6,0x6,0x5,0xc9,0x2b,0x43,0x2d,0x5,0x29,0xcd,0xe2, + 0x39,0xe0,0x96,0x48,0xa2,0x44,0x4d,0x99,0x7b,0x6f,0x83,0x30,0xe5,0x40,0xab,0xf7, + 0xd0,0x11,0x73,0xcf,0xb0,0x19,0x75,0x95,0x13,0x74,0x49,0x59,0x4e,0xbd,0xff,0x46, + 0x91,0x44,0xb,0x48,0xe0,0x44,0x42,0x8b,0xdf,0x86,0xe1,0x90,0x56,0x6d,0xf2,0x21, + 0xa9,0xe8,0x82,0x7,0x49,0xaa,0x73,0xe5,0xc2,0xe4,0x2a,0xea,0x88,0x11,0x86,0x91, + 0x97,0xa1,0xc4,0x15,0x98,0x7f,0xe9,0x4,0x8b,0x98,0x4d,0x54,0x87,0xd3,0x68,0x16, + 0x1f,0xf4,0x65,0x20,0xe3,0xe1,0x90,0xe6,0xcb,0x6f,0xb9,0x4c,0xa2,0x39,0x9f,0x3f, + 0x3c,0xd3,0x1d,0x49,0x37,0x15,0xa4,0xc7,0x6b,0xb0,0x99,0xad,0x2e,0xac,0x15,0xd5, + 0xe6,0x74,0x9b,0x80,0xd9,0x37,0xbc,0xad,0x6a,0x31,0xcb,0x40,0x6b,0x81,0x75,0xc4, + 0x6e,0x1a,0x4d,0xec,0xb3,0xd0,0xb9,0x6,0x86,0xf5,0x61,0x85,0x19,0x6,0x49,0xd3, + 0x90,0x10,0xc5,0x30,0xf6,0x16,0xbf,0xd7,0x66,0xe0,0xa1,0x4e,0x72,0x15,0x92,0xac, + 0x7e,0xff,0x56,0xea,0xd5,0xa4,0x51,0x5d,0xd2,0x3a,0xd5,0xdd,0x50,0x9d,0x64,0x48, + 0x60,0x46,0x47,0x67,0x1a,0x5a,0xff,0x1c,0x3b,0xfb,0x65,0x3f,0xeb,0xb3,0x46,0x22, + 0x61,0x8f,0xe0,0x98,0x90,0xce,0x82,0x4c,0xac,0x44,0x63,0xb5,0x6b,0x36,0x1d,0x8, + 0xe8,0x1c,0x79,0x90,0xd7,0x42,0xab,0x7f,0xfb,0x2b,0x28,0x77,0x4,0xad,0xb2,0x27, + 0x2b,0x24,0x54,0xb5,0x35,0x87,0x4e,0xbd,0xa,0x5d,0x3,0xa,0x3f,0x2,0xe5,0xc8, + 0x60,0xe1,0xda,0xe7,0xa8,0xfe,0x1d,0x3c,0x18,0xaf,0xcf,0x50,0xcf,0x82,0xfb,0x7b, + 0xff,0xe1,0x5f,0xf9,0x53,0x1f,0xbf,0xf2,0xdb,0x3f,0x78,0x57,0x2b,0xd6,0x2a,0x27, + 0x0,0x22,0xc6,0x99,0xb,0x1d,0x95,0x85,0x3c,0x7f,0x0,0x75,0x51,0xe1,0x90,0x80, + 0x71,0x77,0x26,0x77,0x55,0x3f,0x2e,0x31,0x6f,0xe6,0x60,0xec,0x62,0xb2,0xd0,0xc3, + 0xd4,0x5f,0xba,0x5f,0x7b,0x45,0xff,0x5b,0x59,0x9e,0x31,0xbb,0xcd,0xaa,0x79,0x26, + 0x6f,0xe8,0xf7,0x79,0x20,0xc2,0x6c,0xe4,0x66,0x7,0xb1,0x9f,0x48,0xc,0xe8,0xcf, + 0x32,0x50,0x71,0xca,0xda,0xfb,0x9a,0x7d,0x13,0xa1,0x33,0xc1,0xdd,0xb0,0x60,0x57, + 0xe3,0xc,0x85,0xae,0xc2,0xf0,0xcf,0x40,0x8c,0x4e,0x5,0x7c,0xf8,0x29,0xaf,0x93, + 0xf9,0x47,0x85,0xe7,0x15,0x52,0xda,0x7d,0x77,0x76,0x3f,0x6c,0xc,0xbc,0xef,0x26, + 0x75,0x3a,0xb0,0xa6,0xc7,0x49,0x83,0x43,0xf3,0x35,0x45,0x38,0x2,0x93,0x6,0x26, + 0x98,0xed,0x0,0x23,0x4e,0xee,0x56,0x38,0x54,0x80,0x3c,0x9f,0xd9,0x3e,0x2f,0x5d, + 0xd5,0xa7,0x1d,0x34,0x5b,0xbb,0xfa,0xf9,0xa9,0x68,0x1,0x53,0x2e,0x37,0x6c,0x1b, + 0x6d,0xfd,0x4e,0xd2,0x98,0x87,0xfb,0x86,0xc3,0x99,0x3d,0xb4,0xd1,0xd8,0x48,0x9a, + 0xd5,0x9c,0xf1,0x74,0x6a,0x0,0x56,0x40,0x87,0x1f,0xb3,0x48,0x21,0x2b,0xd9,0xca, + 0x5c,0xdb,0xe2,0xc6,0x52,0x61,0x75,0x25,0x20,0x42,0x35,0x25,0x74,0x3c,0xca,0x93, + 0xa4,0xc9,0xc1,0xee,0x99,0xd5,0xe1,0x2a,0x5f,0xe8,0x5a,0xe6,0xe8,0xf3,0x11,0x26, + 0xa5,0x6b,0x57,0xcf,0xd1,0x76,0xb6,0x94,0xb,0x61,0xe2,0x2b,0xe,0xa5,0xab,0xb5, + 0x27,0xcd,0xc1,0x8b,0x7e,0x46,0xaa,0x9e,0x7e,0x6b,0x53,0x38,0xbb,0xbc,0x31,0xa5, + 0x63,0x20,0x84,0xd9,0xf5,0xc8,0x75,0x94,0xfe,0x19,0x70,0x76,0xb6,0xe7,0x94,0xe8, + 0xf9,0xf5,0x30,0x3e,0xab,0xcc,0x77,0x6d,0xbf,0xad,0xb6,0x68,0xb8,0xa8,0x6d,0xf4, + 0x17,0xc1,0x5,0x91,0x62,0x63,0x98,0x3c,0x50,0xee,0xb,0x1f,0x2d,0x93,0x74,0x2b, + 0x46,0x4f,0xc0,0x0,0xe9,0xed,0x27,0x83,0x18,0xd5,0x7d,0x32,0x52,0xfb,0xe3,0x3e, + 0xb,0x29,0xfc,0x95,0xe7,0x79,0x81,0xdc,0x8a,0x6f,0x48,0xf,0x88,0xfd,0xac,0xfe, + 0xcb,0xdf,0xfa,0xc1,0xfb,0xef,0xfe,0xea,0xcf,0x7d,0xe4,0xa4,0xd2,0x2a,0x53,0x3e, + 0x7b,0x8b,0xa0,0x4b,0x33,0xd7,0x1,0xb5,0xe8,0x32,0xc9,0xac,0xaa,0x37,0x14,0x1b, + 0x21,0xdd,0x4c,0x26,0x20,0xda,0x35,0x74,0x72,0x89,0xcd,0x28,0xee,0x74,0x64,0xc1, + 0xb9,0x66,0x50,0x30,0xb1,0xd5,0x19,0xce,0x50,0x46,0x52,0xaa,0x18,0xc,0x77,0x57, + 0x2f,0x23,0x3f,0xc,0xd0,0x60,0x15,0xea,0x97,0x7f,0xeb,0x87,0xef,0x55,0x55,0xff, + 0xeb,0xaf,0xfd,0xec,0x47,0x25,0xe4,0x68,0xce,0x18,0x4c,0xd9,0x39,0xf7,0x44,0x3f, + 0x42,0xdb,0x83,0x21,0xfc,0x84,0x81,0x9d,0x54,0xb5,0x54,0x28,0x80,0xd9,0xd3,0xb, + 0x28,0x32,0x74,0x7d,0x99,0xf6,0xa4,0x4a,0x70,0xab,0xaa,0x5f,0xfe,0xad,0x1f,0xbe, + 0xff,0xee,0xaf,0x7d,0xef,0xe3,0xf9,0xaa,0xdf,0xfd,0xb5,0xef,0x7d,0xfc,0xf2,0x6f, + 0xfe,0xf0,0x9d,0x86,0xdb,0x94,0xf7,0x38,0xa9,0xf3,0x9b,0xe1,0xd5,0x9e,0xb0,0x64, + 0xcc,0xaf,0xaf,0xcf,0x1c,0x50,0x43,0x75,0x6e,0x53,0xe2,0xdb,0x62,0xfc,0xd3,0xa1, + 0xb9,0x33,0xd9,0x90,0x35,0x5a,0xd3,0xcd,0x74,0xdb,0x9a,0xdd,0xe9,0xd4,0xd,0x8a, + 0x51,0xf1,0x9f,0xdc,0x4,0x2b,0x9d,0x87,0xcf,0xa8,0x6d,0xe5,0x38,0x98,0x48,0x27, + 0xc3,0xc9,0x7d,0x6b,0x8d,0x5f,0xfb,0x3e,0xb8,0x65,0xa7,0x3a,0xc7,0x9,0x24,0x27, + 0xd0,0x21,0x6d,0x8e,0xdf,0x95,0xc1,0x1a,0x98,0xbf,0x5c,0xb4,0xca,0xe6,0xa4,0x4b, + 0x89,0xab,0xcf,0xcc,0xb2,0x7d,0xf6,0x46,0x20,0xb6,0x34,0x33,0x4,0x51,0xe6,0x7d, + 0xd8,0x26,0x4b,0x99,0xd1,0x1b,0xf7,0xb6,0x9a,0xa2,0xd2,0xce,0x67,0xd0,0x35,0xde, + 0x45,0x94,0x18,0x1e,0xdf,0x4e,0xaa,0x45,0x20,0xeb,0x49,0x2,0xf3,0x9e,0xfb,0xd7, + 0x1e,0xbf,0x76,0x42,0xc0,0xde,0x15,0x40,0xd2,0xba,0xad,0xa5,0x24,0x73,0xc4,0xaa, + 0xf2,0xa8,0xce,0x65,0xc3,0xec,0xfe,0x38,0xeb,0x74,0xff,0xc1,0x5f,0xf8,0x7b,0x3f, + 0x78,0xaf,0xaa,0xfa,0x47,0xbf,0xfe,0x73,0x1f,0x2c,0xda,0x39,0x78,0x9c,0xb5,0xe, + 0x7f,0xf9,0x2f,0xa5,0x48,0xf3,0xa1,0x2b,0x93,0x66,0x35,0xb7,0x45,0x87,0xbd,0x51, + 0xee,0xb4,0xa8,0x2d,0xb0,0x74,0x80,0xdb,0xae,0x74,0xb0,0xb5,0xc8,0x9,0xc1,0x79, + 0xae,0xab,0x64,0x2,0xa5,0x37,0x19,0x5b,0x46,0xac,0xa2,0x2b,0x36,0xb5,0x61,0x73, + 0xfa,0x9,0x7f,0x6b,0xde,0x4d,0x91,0x35,0x77,0x26,0x3a,0x12,0xf1,0xd3,0x64,0x84, + 0xd5,0x39,0x20,0xb5,0xf9,0xaf,0x7b,0x72,0x86,0xa3,0x21,0x38,0xb3,0x7b,0x47,0xfa, + 0xc,0xff,0xd2,0x6b,0x1d,0x98,0xfd,0x1a,0xf3,0x0,0x6b,0x2b,0xd4,0xa9,0x55,0xcc, + 0x12,0xb7,0x35,0x4,0x44,0x28,0xa3,0x2b,0x3b,0xcd,0x42,0x8c,0xd1,0xc,0xbd,0xaf, + 0xf4,0x71,0x56,0x58,0xd7,0x1d,0x46,0x5c,0x32,0x31,0x58,0x6d,0xb6,0x70,0x78,0x90, + 0x58,0x2c,0xcc,0x5e,0xd6,0x32,0x87,0xed,0x4a,0x3f,0xfe,0x1e,0x8c,0xa6,0x33,0x72, + 0x2d,0xda,0x5f,0x18,0x2d,0x59,0x7,0xf7,0xb7,0x74,0xc1,0x69,0x66,0xc6,0x87,0x8a, + 0x31,0xe2,0x99,0xb,0xb4,0x48,0x0,0x9e,0xde,0x97,0xac,0x28,0x51,0x89,0xd3,0x79, + 0xe6,0x75,0x3f,0x4e,0x4c,0xf9,0xdb,0xd0,0x65,0xd6,0x96,0x19,0xd4,0xf8,0x1e,0xa5, + 0xa9,0x2b,0x4c,0x14,0x52,0x89,0x2b,0x3,0x6c,0x5a,0xc,0x5d,0x8a,0xd1,0x4c,0x33, + 0xdb,0xc,0xe,0x43,0x2e,0x17,0x47,0x47,0x12,0x82,0x87,0x40,0x98,0x5d,0x31,0x5a, + 0x5a,0x3,0x70,0xfb,0x1b,0x5f,0x4e,0xb1,0x4e,0x80,0x80,0xd,0xb7,0xdf,0x1,0xd0, + 0xe7,0xd6,0x31,0xea,0xc0,0xc6,0x64,0x3a,0x60,0xc0,0x6,0x27,0x29,0xd8,0x27,0x6f, + 0xa2,0x13,0xe8,0x94,0x18,0x9a,0x5b,0x96,0x49,0x1e,0xdc,0x8c,0x83,0x7a,0x64,0x5f, + 0x41,0x45,0x7d,0x36,0x2b,0x1f,0xc6,0x69,0xb9,0xc2,0x8c,0x46,0xaa,0x14,0x66,0xeb, + 0x4d,0xaf,0xfd,0x6a,0xce,0x72,0xa5,0x7a,0xef,0x43,0xcf,0xbe,0xdb,0x5a,0xde,0x33, + 0xde,0xc,0x27,0x38,0x15,0x84,0x19,0x98,0x8,0x6d,0xd2,0xc0,0x66,0x92,0x93,0xbf, + 0x21,0xe,0x6f,0x26,0xe,0xc2,0x68,0x19,0x21,0x8c,0x43,0x3b,0xe2,0xc2,0x3,0x6a, + 0xb6,0x9e,0x33,0x52,0x66,0x78,0xde,0xa7,0x50,0x2d,0x86,0x38,0x44,0x1,0x15,0x36, + 0x61,0x79,0x5a,0x9a,0xa4,0x3b,0x1d,0x69,0x43,0xc0,0xea,0x58,0xea,0xbf,0x49,0xa8, + 0x6b,0x8c,0xc,0x74,0xeb,0x6b,0x84,0x4b,0x61,0xde,0x53,0x86,0x16,0xc1,0x42,0x33, + 0x1f,0x5b,0xe6,0x36,0xfd,0x70,0x68,0x6b,0x26,0x30,0xa5,0xc8,0xe,0x9a,0x6a,0xc8, + 0xf9,0xec,0xa,0x74,0x51,0x35,0x50,0x4c,0xa6,0xe4,0xf3,0xd0,0xaa,0x1,0xea,0x1f, + 0xfd,0xfa,0xcf,0x7d,0xfc,0x85,0xef,0xff,0xdf,0xef,0x65,0xc4,0x55,0x3d,0xea,0xaf, + 0x8d,0x8a,0xb2,0x44,0x23,0x45,0x4e,0xde,0xcf,0xea,0x42,0x56,0x72,0x2c,0x5b,0xd7, + 0x31,0xb4,0x51,0x3a,0x2,0xf7,0x48,0xbf,0xca,0xa6,0xee,0xf7,0xe0,0xab,0x5f,0x70, + 0x50,0x94,0xf1,0x3,0xfc,0xe0,0xc8,0x86,0xa8,0x8b,0x9a,0xdc,0x6b,0xf6,0x25,0x27, + 0x17,0xa0,0xb5,0xa0,0xe9,0xfd,0x32,0xcd,0x7e,0xb3,0xf,0x13,0x46,0xf2,0x1c,0x18, + 0x8d,0x6c,0xce,0xd2,0x7,0xf2,0x8e,0x9,0x2e,0xe8,0xd0,0xbf,0x3b,0xf3,0x20,0x12, + 0x11,0x48,0x75,0x6a,0xe2,0x31,0xcd,0xe6,0x93,0x2b,0x40,0xa2,0x20,0x22,0x1e,0x68, + 0x26,0x8a,0x36,0x21,0x32,0x8,0x6e,0x2c,0x31,0x88,0x38,0x3d,0x29,0x2c,0x4b,0x64, + 0x62,0xf3,0x5c,0xf,0xab,0xfe,0xb7,0xff,0xe6,0x4f,0x7d,0xfc,0xd2,0xf7,0xbf,0x90, + 0xd,0xef,0x8b,0x75,0x34,0xfd,0x97,0xfe,0xa7,0x1f,0xbc,0xff,0xd2,0xf7,0x7f,0xf0, + 0xae,0x28,0xc,0xd5,0x5e,0x53,0x19,0xd9,0xed,0xa0,0x73,0x21,0x12,0x19,0x38,0x68, + 0xd4,0x2b,0xd,0x9e,0x96,0x60,0x57,0x2a,0x90,0x21,0xd4,0xa0,0x9c,0x7b,0xf5,0x30, + 0xf8,0x15,0x46,0x27,0x36,0x22,0xb1,0xd8,0xf6,0xf1,0xf7,0x64,0xd5,0x8,0x6,0x99, + 0x1f,0xb5,0xa4,0x7,0xa,0x58,0xa8,0x61,0x89,0xe8,0x2e,0x9b,0x95,0x68,0x70,0x14, + 0xd6,0xff,0x12,0x21,0x9b,0x1b,0x86,0x7,0xd9,0x62,0x49,0xbb,0x4d,0x73,0xa4,0xa3, + 0x8b,0x6c,0xb4,0xce,0x46,0x84,0x38,0x49,0xec,0x9,0xf5,0x7b,0x97,0x35,0x6a,0xa6, + 0x39,0x30,0x8,0x39,0xb8,0x64,0x8d,0x59,0x91,0xbd,0x5e,0x84,0x27,0x3a,0xac,0x65, + 0xc7,0x95,0xd4,0x21,0xa4,0x47,0x77,0xd5,0x49,0x53,0x13,0xe8,0x2,0x53,0x68,0xf4, + 0x2a,0xaf,0x43,0x50,0xae,0x12,0xee,0x8a,0xe1,0xaa,0x72,0x46,0xa9,0x96,0x47,0x38, + 0x54,0x7b,0xeb,0x15,0x3c,0x14,0x95,0x24,0x7d,0xce,0x29,0x9b,0x12,0x71,0x36,0xb4, + 0xf5,0xdb,0x5f,0x58,0x5a,0xa3,0xc9,0x4f,0x57,0x13,0x3d,0xc2,0x70,0x8e,0x23,0x8d, + 0xd9,0x30,0x7b,0x2b,0x70,0xe2,0x26,0x60,0x18,0xd5,0x38,0x2a,0xed,0xe,0x37,0xc, + 0x10,0xc4,0x28,0xe,0x86,0x10,0xe6,0x79,0x61,0xac,0x10,0x88,0xc7,0xac,0x80,0xd6, + 0xb9,0x3a,0x8a,0x7e,0x6,0xe2,0xf8,0xec,0x4d,0xe,0xb1,0x4a,0x93,0x1d,0xd6,0x90, + 0x88,0x8,0x4a,0x71,0xbf,0xff,0xa,0x7b,0x60,0x63,0xca,0xb3,0xc6,0xe2,0xb7,0x1e, + 0xae,0x8c,0x7d,0xbf,0xdb,0x33,0x82,0x95,0x3d,0xb1,0x7a,0xeb,0xe6,0xf4,0x51,0x8c, + 0xb2,0x2,0xbe,0x4c,0xe1,0xc,0x8c,0xf8,0xd1,0x23,0x92,0x41,0x69,0x96,0x2c,0xe6, + 0xb7,0x42,0x98,0x12,0x94,0x18,0xb8,0xa5,0x7b,0x17,0xf8,0xec,0x23,0x15,0x26,0xa2, + 0x2,0x37,0x1b,0x96,0xf4,0x6a,0x34,0xc8,0x58,0x52,0x51,0xa8,0xf0,0x4a,0x6b,0x34, + 0x55,0xb5,0xc3,0xc6,0x21,0xaf,0x7d,0xa3,0xa9,0x12,0x8b,0xa6,0xc3,0x3,0x53,0x76, + 0x55,0xe2,0x85,0x32,0x32,0x53,0xb5,0x8f,0x1a,0x98,0x5,0x4e,0x57,0x49,0x43,0x86, + 0x45,0xa9,0x2a,0xbe,0x3d,0x87,0xd4,0x9a,0x69,0xff,0x9c,0x2b,0x73,0x6,0x59,0x70, + 0x3b,0xb3,0xc1,0x46,0x29,0xc8,0x12,0xd8,0x58,0x18,0xf3,0x70,0x3f,0x8a,0x84,0xbf, + 0x29,0xd5,0xa7,0xb9,0x92,0xb1,0x9a,0x20,0x8c,0xeb,0xec,0xf,0xda,0x56,0x51,0x41, + 0xb5,0x75,0xa9,0xb0,0xf6,0x23,0x70,0x81,0xa4,0xc,0xf,0xfe,0x22,0x39,0x73,0x5c, + 0x89,0x88,0xd0,0x92,0x23,0xe5,0x74,0x2c,0x38,0x32,0x5,0x40,0xf2,0x40,0x61,0x99, + 0x68,0x7,0x2f,0xc6,0xba,0x40,0xb7,0xe,0xb6,0xde,0xa0,0xf,0xe1,0x22,0x7b,0x99, + 0x6,0xe5,0x57,0x83,0xf2,0x28,0xb0,0xa5,0x33,0xb3,0xe1,0xd5,0x6e,0x85,0x9c,0x33, + 0x85,0x49,0x7b,0xc3,0xf6,0x8f,0x84,0xa9,0x2a,0xb0,0x51,0xb4,0xa8,0xd,0xe1,0xeb, + 0xc0,0xaf,0x11,0x37,0xc7,0x31,0x3d,0xd5,0xae,0x62,0xaf,0x32,0x31,0x8,0x55,0x24, + 0x51,0x9c,0x3,0x81,0xde,0x94,0xc2,0xe8,0xf2,0xa6,0x4,0x44,0xc9,0x2d,0x25,0x9a, + 0xf5,0x1e,0x5c,0xa6,0xd3,0x61,0x46,0x69,0xac,0xed,0x86,0xa5,0x2,0x39,0x46,0xcb, + 0x9,0x91,0x94,0xf5,0xbe,0x72,0xee,0x4b,0x25,0x8b,0x9e,0xcd,0x41,0x2f,0xe7,0x53, + 0x9b,0x3,0x60,0x2e,0x46,0xc8,0x29,0x3f,0xb5,0xcc,0x62,0x32,0xc7,0xa6,0x98,0x82, + 0xdd,0xce,0x75,0xf3,0x38,0x4,0xd2,0x13,0xb3,0x32,0xc8,0x25,0xa0,0x25,0x9c,0xd4, + 0xd6,0xe2,0x3,0x67,0xe3,0x5b,0xbe,0xac,0xce,0x64,0x87,0xb2,0xe6,0x81,0x93,0xc9, + 0x66,0xfd,0xf9,0xff,0xf1,0xab,0xc2,0xfe,0xc7,0x7f,0xf5,0xe7,0x3f,0x5a,0x66,0x90, + 0xfe,0x17,0x43,0x96,0xa0,0xd6,0xaa,0x36,0xca,0x9,0x34,0xcf,0xc,0xad,0xe4,0x4b, + 0x98,0xf2,0xa7,0x79,0x7b,0x8c,0xa4,0x46,0x34,0xe8,0xdf,0x7,0x2b,0x58,0x6f,0x18, + 0x9c,0xf1,0xc0,0xe8,0x1,0x84,0xc5,0xa9,0x9,0x5d,0xb0,0x4c,0xad,0xc7,0xb4,0x7, + 0xe8,0xd9,0x68,0x99,0xf0,0x96,0x18,0xa8,0x84,0x8c,0x60,0x5b,0xb3,0xd2,0x47,0x30, + 0x7b,0x4f,0x6a,0x1f,0xac,0x44,0x79,0xea,0xeb,0x35,0x9f,0x94,0x3e,0x31,0x59,0xbf, + 0x78,0x3f,0xc0,0x7f,0xf2,0x57,0x7f,0xfe,0x83,0xa2,0xf5,0xcd,0x74,0x55,0xa3,0x67, + 0x96,0x76,0xd0,0x5b,0x9b,0x75,0x43,0x8a,0x5f,0xbd,0xb4,0x2d,0xc,0xa0,0xea,0xf7, + 0x10,0xb8,0x5c,0x6d,0x40,0x2b,0xc7,0xa6,0xa6,0x2d,0x80,0x6e,0x2,0xd2,0xa8,0x8, + 0xf7,0x75,0xfc,0x17,0xff,0xc3,0xff,0x75,0xff,0xbe,0x9f,0xfb,0xf8,0xa4,0x8f,0x3c, + 0x15,0x6b,0xdd,0x8f,0xf4,0xd1,0x65,0x8c,0x8e,0x7d,0x92,0x26,0x51,0x91,0x70,0xda, + 0xf3,0xea,0x4f,0x23,0xf7,0xc5,0xf8,0x46,0xcc,0x4d,0x33,0x75,0xa9,0x23,0x73,0x5f, + 0x9,0xdb,0x55,0x6d,0x3c,0x6c,0xe1,0x28,0x88,0xd1,0xaa,0x3a,0xb5,0x68,0x6a,0x56, + 0xad,0xab,0xc9,0xd6,0xd6,0xeb,0xb2,0xb6,0x61,0xa8,0x42,0x3b,0x33,0x17,0xad,0x4d, + 0x3b,0xb0,0x83,0xb9,0xa4,0xeb,0x58,0x53,0x2,0xa,0x6,0xd2,0x11,0x2a,0xe0,0xfa, + 0x8c,0x4e,0xc0,0x30,0xd2,0x59,0x32,0x5f,0xaf,0xc1,0x52,0xf,0xc8,0x83,0xe3,0x97, + 0x8a,0xa6,0x54,0x88,0xec,0xac,0xc4,0x97,0xe1,0x8e,0xa7,0xa4,0x4a,0xb1,0x19,0x65, + 0x3f,0xb8,0x61,0xe2,0x47,0xfb,0x69,0xe8,0xde,0x6d,0x2c,0x7c,0x72,0xbf,0x76,0x84, + 0x26,0x65,0xc0,0x37,0x85,0x3d,0xa8,0x3a,0xdd,0x14,0x3f,0x77,0x49,0x61,0x24,0xe1, + 0xcd,0x76,0x96,0xc6,0x8d,0xab,0xca,0xfa,0xc3,0x18,0x26,0x20,0xb6,0x8d,0x2f,0x1b, + 0x57,0x23,0x35,0xfc,0xd5,0xab,0x59,0xad,0x9b,0x75,0xff,0xe5,0xe4,0x4a,0x23,0x32, + 0x56,0xca,0xf0,0xed,0xa2,0xc9,0x77,0xdc,0xc1,0x98,0x7c,0xac,0xfa,0x6a,0x8f,0xa8, + 0x61,0xab,0x1b,0xf6,0xe9,0x7,0xd9,0xdb,0x57,0x67,0x69,0x67,0x1,0xd5,0x68,0x15, + 0xd9,0xa,0xe1,0xde,0x5f,0x48,0x45,0xcc,0xcb,0x51,0xaf,0xd3,0x4c,0x7a,0xe6,0x21, + 0x7e,0x76,0x34,0x7a,0x95,0x9d,0x87,0xde,0x18,0xdc,0xbf,0xed,0x93,0x74,0x1e,0xb, + 0x5d,0x85,0xf2,0x93,0xfd,0xde,0x3e,0x9a,0xfd,0x4,0xef,0xf7,0xbb,0x1d,0xb5,0x26, + 0xf0,0x9f,0x71,0xa0,0xa0,0xe2,0xfe,0xea,0x1e,0x62,0xca,0x11,0x85,0xb6,0xee,0x8d, + 0xe6,0xbd,0xad,0x3a,0x88,0x3e,0x72,0xe1,0xe2,0x1a,0x3a,0xf6,0xa4,0xb3,0xae,0x65, + 0xb2,0xb0,0x5b,0x16,0x91,0x21,0xea,0xe3,0xe4,0x1e,0xc2,0x15,0x8d,0xbe,0x8,0x6, + 0xc,0xc5,0x57,0x27,0x65,0x35,0x52,0x1a,0x73,0xe6,0x96,0x1,0x31,0xd1,0x67,0xae, + 0x55,0x7f,0x97,0xb9,0x3e,0x3d,0x0,0x69,0x75,0xa8,0x20,0x66,0xfa,0xa,0xef,0xd, + 0xe1,0x81,0x2c,0xab,0x34,0xd2,0x49,0x1c,0x4,0x26,0x3c,0x43,0xe6,0xfb,0xbb,0xac, + 0x2d,0x43,0x3c,0x67,0x22,0x92,0x25,0xab,0x9d,0xe1,0x78,0xb6,0xef,0x47,0xc0,0x72, + 0x74,0xe3,0x83,0xa7,0x42,0x7f,0xbe,0xff,0x17,0xff,0xd6,0x9d,0x28,0xfc,0xc6,0xcf, + 0x7f,0x0,0x43,0x25,0xa1,0x23,0x58,0x2a,0xfb,0x59,0x5d,0x93,0x3c,0x3b,0x6c,0x79, + 0xd,0x49,0x60,0xda,0xe7,0xfb,0xe5,0x38,0x64,0x1c,0x10,0x34,0x4b,0x69,0x41,0x16, + 0xe8,0x55,0xb8,0x91,0xc,0x2b,0x24,0x61,0x7,0x45,0xa8,0x51,0x24,0x85,0xbe,0xe6, + 0xa8,0x84,0x28,0xa6,0xbe,0x0,0x7b,0x53,0x98,0x2e,0x1f,0xbb,0x27,0x4b,0x38,0x5a, + 0x5b,0x77,0x45,0xc3,0xc,0x14,0xec,0x24,0xd2,0xa,0xe3,0x89,0x46,0x1a,0xac,0x56, + 0x51,0x6c,0x45,0x31,0x34,0x9d,0xe9,0x36,0xfb,0x5b,0x7e,0xe,0xb8,0x34,0x70,0xa8, + 0xba,0x91,0xfb,0xd0,0xb9,0x51,0x93,0xee,0x86,0x46,0x39,0x30,0xbb,0xc1,0xd,0x1a, + 0xc3,0x7d,0x12,0xb6,0xd1,0x3d,0x96,0x83,0x58,0xf7,0x35,0x5d,0xc,0x17,0x38,0x88, + 0xda,0xe5,0xd0,0x63,0xad,0x2e,0xba,0xc3,0x21,0x99,0x64,0x38,0x39,0x22,0x5a,0x4c, + 0xa8,0xd4,0xc4,0xf0,0x3,0x4d,0x1f,0x9f,0x56,0xe8,0xa3,0x3a,0x66,0xcc,0xd6,0x3b, + 0x92,0xea,0x67,0xe,0x6d,0x8f,0xd,0xc1,0x2d,0x4a,0x29,0x6f,0x43,0xd2,0x27,0x41, + 0x18,0x5,0xc0,0x6d,0xe6,0x84,0xf0,0x3,0xd7,0x31,0xd9,0x44,0x1f,0x1a,0x52,0xa4, + 0xf6,0xd3,0xa5,0x44,0x48,0xae,0xb6,0x13,0xe5,0xb5,0x10,0x44,0x8c,0x46,0x42,0xdd, + 0x89,0x81,0x49,0x35,0x4b,0x82,0x4a,0x6,0xa4,0xff,0xa9,0x68,0x1f,0x1d,0xa5,0x7e, + 0x38,0x58,0xd6,0x36,0xf5,0xa0,0x6f,0x3d,0xf6,0xa8,0x94,0xf7,0xf9,0x18,0x5e,0x19, + 0x9a,0x84,0x7c,0x4a,0xb2,0x5c,0x3a,0xf1,0x34,0x87,0x1b,0x43,0xa5,0x97,0xa6,0xca, + 0x6e,0x7d,0xd5,0xee,0xa1,0x7b,0xf,0xcd,0x47,0x4e,0x4a,0x20,0x53,0x98,0x99,0x84, + 0xf5,0x2c,0x4d,0xbd,0xa,0x55,0x6d,0xaa,0x51,0x7b,0x74,0x21,0xd8,0x88,0xff,0x9f, + 0xb1,0x37,0x6b,0xba,0xec,0x3a,0xcf,0xc3,0xde,0x67,0x75,0xff,0x83,0xfc,0xc,0x57, + 0xa2,0x9d,0x8a,0xe3,0xb2,0x2d,0x91,0x92,0x8,0xa2,0xbb,0xbf,0x1e,0x31,0x35,0x66, + 0x70,0x2,0x7,0x11,0x12,0x67,0x4b,0x16,0xc5,0xc4,0x56,0xac,0xc8,0xb6,0x44,0x29, + 0x24,0x25,0x8a,0x83,0x28,0x42,0x9c,0x0,0x90,0x98,0xd1,0xdd,0xe8,0xe1,0xeb,0x6, + 0x7,0x50,0x94,0x15,0xab,0x4a,0xda,0x94,0xa5,0x8b,0x54,0xca,0xf7,0xc9,0x4d,0x2e, + 0x53,0x95,0xb,0xef,0x37,0x17,0x7b,0xd,0xcf,0xf3,0xbe,0xeb,0x80,0x66,0x49,0x64, + 0xf7,0xd7,0xe7,0x3b,0x67,0x9f,0xbd,0xd7,0x5a,0xef,0xf4,0xc,0x64,0x19,0x97,0xc, + 0x25,0x30,0x65,0x1f,0x85,0x75,0x66,0xcc,0xfb,0x75,0xe2,0x54,0x3f,0xfd,0x3f,0xbf, + 0x63,0x7d,0xdf,0xef,0xec,0x1,0xa9,0xcf,0xa6,0xa2,0x77,0xee,0xc4,0xcb,0xc5,0xc2, + 0xb5,0x44,0x61,0x19,0x65,0x2,0x60,0x5a,0xe1,0x89,0xe4,0x2d,0x66,0xc0,0x32,0xaa, + 0x50,0x11,0x67,0x22,0x98,0x8b,0x19,0x21,0xf3,0x54,0x9a,0x1e,0x75,0xff,0x7e,0x1e, + 0x8a,0x16,0x8c,0xd6,0xa2,0x13,0x8b,0xc0,0xeb,0x85,0x39,0x72,0xc1,0xd3,0xdb,0xe0, + 0x84,0x45,0x40,0xd4,0x20,0x70,0x9e,0x3,0xc5,0x87,0x83,0x0,0x8c,0x9a,0x72,0x64, + 0x82,0x62,0x95,0x91,0xfa,0x1a,0xde,0xc2,0x8b,0x1c,0xa9,0xdf,0x24,0x40,0x99,0xa, + 0x41,0x6d,0x15,0x70,0x99,0x1a,0xde,0x10,0xe6,0x23,0x2a,0x66,0x41,0xaf,0x1,0xc9, + 0x45,0x2d,0x52,0x2a,0x3d,0x78,0x94,0x87,0xe7,0xeb,0x8a,0x23,0x60,0x7b,0xdf,0x8c, + 0xdd,0x0,0x39,0x33,0x23,0x5,0xab,0x3,0x7c,0x4b,0x63,0xae,0xf0,0x41,0xb3,0x98, + 0xc4,0xd1,0x87,0xc5,0x10,0x65,0x71,0x84,0x63,0x9e,0xd6,0xd1,0xc,0x4c,0xe3,0xb3, + 0x67,0x64,0x3a,0x57,0xb7,0xa2,0xa6,0x36,0x69,0x63,0x17,0x3d,0xce,0x38,0x89,0x48, + 0x6c,0x44,0x4c,0xf0,0x37,0xac,0xe9,0x80,0x5c,0xad,0x91,0xa3,0x8b,0x9c,0x2a,0xfb, + 0xeb,0xcb,0x54,0xec,0x6c,0xa2,0xc2,0x9b,0xc6,0x9a,0x71,0x1c,0x9b,0xd6,0x18,0xd1, + 0xb7,0x62,0x75,0xef,0x13,0x91,0x2b,0xc5,0xfe,0x4c,0x66,0xe1,0xcc,0xef,0x36,0xb3, + 0xf7,0xfc,0x2f,0x6f,0x2c,0xef,0xfd,0x37,0x6f,0x2c,0x8,0x1a,0xf8,0x91,0xf5,0xa8, + 0xe3,0x8a,0xa9,0x88,0x40,0xb0,0x1,0x66,0x6c,0xc4,0x18,0x2f,0x22,0x8c,0x6e,0x2c, + 0x9e,0xc1,0x6,0xa5,0x98,0x46,0x5c,0x35,0xfb,0x7e,0x47,0x2d,0x8,0x3f,0xd0,0xc5, + 0xeb,0x49,0x2f,0x6b,0x19,0x4,0x53,0x56,0xa8,0xda,0xa0,0xb,0x2,0x83,0xc0,0x78, + 0xe4,0xcc,0x39,0x92,0x8d,0x80,0x6b,0x89,0x3a,0x52,0x3d,0xc1,0x86,0x34,0x90,0x26, + 0x69,0x7f,0xb7,0x52,0xf5,0x98,0x7c,0x43,0x31,0x49,0xee,0x4c,0xc9,0xb,0x5d,0xa2, + 0x9,0x53,0xe3,0x10,0xde,0x81,0xf5,0x55,0xa,0x73,0xec,0xfc,0xa0,0x4f,0x8,0xf2, + 0x5e,0xb5,0xc3,0x8a,0x79,0x9,0x18,0x36,0x43,0xae,0x22,0x50,0x4,0x26,0xfc,0x43, + 0x6,0x8c,0xf0,0x7b,0x24,0xa0,0xcd,0xc4,0xfa,0xb8,0xcd,0x30,0x3c,0x38,0x8d,0x75, + 0x7,0xb2,0x74,0x61,0x7a,0xd0,0x78,0x77,0xe9,0xe2,0x88,0x8c,0xc0,0xe5,0x45,0x32, + 0x70,0x8b,0x77,0x1e,0x11,0xc0,0x20,0x80,0x23,0x4b,0x3c,0xfa,0x64,0xff,0xc4,0xea, + 0x7c,0x8,0xad,0x55,0x45,0x35,0x11,0xaa,0x7f,0xf8,0xed,0x72,0x4a,0xce,0xff,0xce, + 0x72,0x8e,0x8,0x3a,0xfc,0x3d,0xf3,0x84,0xd9,0x7b,0x7e,0xfb,0x8d,0xe5,0xcf,0xff, + 0xd5,0x5d,0x6b,0x9f,0x17,0xd1,0x6,0x62,0x16,0x41,0xd4,0xef,0x8f,0x9d,0x93,0x79, + 0x60,0x57,0x84,0xfa,0xf8,0xfa,0x6e,0x53,0x69,0xa0,0x60,0x99,0xcb,0xf7,0x52,0x18, + 0x9e,0x20,0x66,0x0,0x53,0xf0,0x66,0xc0,0xc7,0x88,0x74,0x9d,0x2,0x9d,0xe,0x39, + 0xc3,0x67,0x30,0x65,0x4,0x76,0x22,0x56,0xb7,0xa9,0xa,0xcc,0x33,0xb4,0x99,0x8b, + 0xec,0x34,0xca,0x70,0x22,0x89,0x49,0xf0,0x92,0x3,0x42,0xe5,0x2b,0x85,0x62,0x7, + 0xd1,0x99,0x4c,0xc1,0x39,0xd3,0xfe,0x4c,0x78,0xd4,0xe2,0x76,0x37,0x29,0x6b,0x63, + 0xec,0x78,0xcf,0x6f,0xbf,0xb1,0xbc,0xe7,0x5f,0xbf,0xb1,0x48,0x8b,0xbb,0x39,0x92, + 0xd1,0x9a,0xf0,0x8,0xe6,0x55,0xa1,0xb5,0x3,0xf8,0x1b,0xde,0x93,0xc1,0x1,0x51, + 0x14,0x5,0x5d,0x2,0x58,0xa3,0xde,0x49,0xfb,0x9d,0x28,0x7a,0x43,0x8e,0x16,0x8a, + 0xdc,0xe,0xb3,0xdb,0x24,0xb0,0x2f,0x46,0x56,0x10,0x8f,0xec,0x78,0x5e,0x38,0x31, + 0x54,0x7a,0x97,0x6c,0x56,0x6d,0xa0,0x5e,0x2b,0x14,0x15,0xef,0xad,0x3a,0xa4,0x6b, + 0xec,0x49,0x3b,0x3d,0xa3,0x21,0x7a,0x35,0x14,0x3,0xc7,0xa8,0xc0,0x33,0x2b,0xc3, + 0xf2,0xf9,0xe7,0x33,0x67,0x41,0x4,0x7c,0x59,0x40,0xb8,0x8b,0xdf,0x38,0x54,0x3, + 0xae,0x55,0xca,0x51,0x57,0x23,0x36,0xa8,0x0,0x9b,0x88,0x78,0xcd,0xb0,0xec,0x51, + 0x51,0x2e,0x89,0xfe,0xe9,0x79,0x18,0x98,0x22,0x8c,0x42,0x7,0xe8,0x7b,0x13,0x48, + 0x91,0x55,0x35,0x3d,0xd4,0x27,0xc3,0xfb,0x5c,0x13,0x79,0xde,0xa3,0xfc,0xfb,0x59, + 0xfe,0x2,0x86,0x89,0x53,0xa2,0x20,0xfb,0x13,0x42,0x1d,0x56,0x10,0x10,0x87,0x40, + 0x84,0xa7,0x86,0x8c,0x3a,0x54,0x64,0x90,0xac,0xce,0x26,0x2,0xfd,0x41,0x7,0x17, + 0x73,0xdb,0xbf,0x83,0xb4,0x1e,0x8,0x84,0x3d,0x58,0xb6,0x4e,0x68,0x5b,0x7c,0x30, + 0x51,0xfb,0xf7,0xdd,0xbf,0xfd,0xfd,0xe5,0x1b,0xbf,0x7d,0xd7,0xea,0xc9,0xae,0xd3, + 0x82,0x88,0xc,0x7a,0xeb,0xf,0x16,0x9d,0x89,0xc2,0xc2,0x49,0xc8,0xf5,0x3,0x2a, + 0x63,0xb2,0xe1,0xdf,0x2,0xa9,0x79,0x48,0x8,0x5,0xd1,0x9d,0x4d,0x5,0x3,0x40, + 0x98,0x82,0x9e,0xd9,0xbb,0x25,0x21,0xb,0xee,0x50,0xf8,0x44,0x50,0x44,0x54,0x96, + 0xe4,0xcf,0x96,0x5c,0xd8,0x1a,0x1a,0xf7,0x1b,0xbf,0x7d,0xd7,0xfa,0xee,0x7f,0xfd, + 0xc6,0x62,0x41,0x8f,0x3c,0x3d,0x2b,0xfb,0xd9,0xc1,0xcb,0xf4,0xc8,0xb5,0x99,0xb, + 0x6e,0x4e,0x8a,0x82,0x81,0x5,0x26,0xaa,0x68,0x16,0x53,0xdb,0x48,0xc7,0x81,0xbd, + 0xd5,0x18,0xd0,0x82,0xc8,0xc7,0x9c,0x5a,0x47,0x16,0xa3,0xae,0xeb,0x3d,0xe9,0xc9, + 0x10,0x60,0x2c,0x8a,0x9d,0x58,0x50,0xb5,0xf3,0xe4,0xa9,0xe,0x75,0x56,0x9b,0x64, + 0xb4,0x4e,0x6b,0xcd,0x2b,0xda,0x16,0xb4,0xae,0x1d,0x79,0xbf,0x80,0x12,0x23,0x48, + 0x45,0x30,0x2,0x7,0x48,0xf4,0xa8,0x4b,0xa,0x7,0xd8,0xea,0xd0,0xce,0xa7,0x49, + 0xae,0xab,0xca,0x59,0x5b,0x87,0x1e,0x92,0x11,0xb6,0xb9,0x85,0xb1,0xcd,0x2f,0x6, + 0x63,0x80,0x3,0xa0,0x30,0x5c,0xa0,0xd8,0xa,0xe1,0x6e,0x43,0xed,0x4c,0x63,0xb0, + 0xe2,0x6a,0xe,0xfa,0xfd,0x21,0xaa,0x68,0xed,0x3a,0x69,0x27,0x3a,0x77,0x2c,0x4d, + 0xbb,0x98,0x93,0x44,0x36,0xb3,0x6c,0xf3,0xe,0xd1,0xfb,0xc3,0x49,0x15,0x12,0x12, + 0x3d,0x75,0xde,0xac,0x64,0xbb,0x6b,0x8c,0xbe,0x4f,0x96,0x6c,0x6e,0xdf,0xb7,0x48, + 0x27,0x35,0x8e,0x9c,0x9c,0xe8,0x8c,0x39,0x78,0x96,0x94,0xec,0xcd,0x60,0x5e,0x59, + 0xef,0x48,0x7f,0x1f,0x93,0x60,0x16,0x93,0xd5,0x1c,0xdc,0xb8,0xe3,0x68,0x93,0x60, + 0xa7,0xf7,0x99,0x65,0xcb,0xfb,0x7d,0x86,0x2,0xda,0x8c,0x3a,0xbc,0x7d,0x67,0xb, + 0xed,0x6c,0xe8,0xb0,0x38,0x8b,0x72,0x11,0x7d,0xf2,0xdd,0xff,0xea,0xf6,0xf2,0x8d, + 0x7f,0x73,0xf7,0xaa,0xf2,0xbc,0xae,0x82,0x91,0x2a,0xd9,0x99,0x84,0x6a,0x64,0xdc, + 0xc4,0x6b,0x3a,0xce,0x37,0xba,0x72,0xa4,0x57,0x94,0x3b,0x3c,0x71,0xde,0x82,0x5d, + 0xce,0x7c,0x5e,0x35,0xd1,0x2,0x56,0xdc,0xd,0x12,0x4a,0x5c,0xda,0x96,0x69,0x1e, + 0x1d,0x7,0xe5,0x7a,0xf4,0xbb,0x1d,0x0,0x89,0x98,0x4d,0x35,0x8b,0xc5,0xd9,0x86, + 0x90,0x85,0x5a,0xaf,0x91,0x8b,0x17,0x14,0x7c,0x1,0x42,0xb8,0x7a,0x14,0xb1,0x98, + 0x7e,0xf6,0x1c,0xd4,0x64,0xae,0xa0,0x2a,0x9b,0xb4,0x44,0xa7,0x31,0x89,0x1,0x81, + 0xd1,0xb1,0x28,0x5a,0xbd,0xfa,0xec,0x7b,0x16,0x45,0x67,0x6f,0x73,0xf0,0x63,0xbc, + 0xf5,0x43,0x3,0x3e,0xdc,0x43,0x6,0x42,0xb6,0x7f,0xab,0x99,0x28,0x3b,0xe7,0x71, + 0xa0,0xf1,0xe,0x24,0x22,0xfd,0x64,0x76,0x54,0x72,0xb,0xf8,0x2,0x5a,0x1,0x1e, + 0x64,0x1c,0xd5,0xbf,0xcd,0xc4,0xea,0x34,0xda,0x45,0x76,0x84,0xac,0xd9,0x13,0xff, + 0xd3,0x9d,0xc5,0xcc,0xec,0xdb,0xbf,0x73,0xd7,0xea,0x98,0x20,0x6a,0x7d,0xd0,0x20, + 0x13,0x98,0x87,0x2c,0x1a,0xdd,0x63,0x2b,0xcc,0xa5,0x53,0x2,0x77,0xa9,0x72,0x19, + 0x28,0x28,0x6b,0x8b,0xe6,0xed,0xe,0x85,0x5d,0xf6,0xfb,0xd8,0x2a,0x54,0x1e,0x63, + 0x42,0xdb,0xfb,0x8a,0x27,0x83,0xb6,0x27,0xdd,0xb2,0xeb,0x1a,0x72,0xf2,0x82,0x3, + 0xbe,0x5d,0x5c,0x21,0xbb,0x23,0x28,0x90,0x21,0xb1,0x0,0xa6,0x6c,0x61,0xe4,0xf1, + 0x1a,0xcf,0x2e,0x93,0x93,0x5f,0x38,0xb8,0xf5,0x18,0x21,0xb9,0xcb,0x84,0x35,0x8b, + 0x1d,0x9c,0x22,0x62,0x39,0x49,0xb8,0x19,0x13,0x97,0xe5,0x38,0xf2,0x9f,0x7d,0x1d, + 0x9f,0xa1,0xb5,0xe7,0xa7,0x90,0x82,0xb,0xe7,0x1a,0x48,0xd1,0xb1,0xb0,0x9,0xc1, + 0x24,0xe,0x7a,0x6a,0x83,0x12,0x8d,0x15,0x1,0x2b,0x44,0xeb,0xb2,0xfb,0xbb,0x73, + 0x46,0xe9,0x24,0x14,0x23,0x63,0xec,0xe1,0x7f,0x1,0xf2,0x58,0x46,0xc0,0xb2,0xc8, + 0xe1,0x41,0xbe,0x5,0xa0,0x79,0x1c,0x7c,0x2,0x72,0x6f,0x82,0x32,0x8a,0x9a,0xe, + 0xb8,0x80,0x8,0x30,0xd,0xd5,0x76,0xa6,0xf6,0x8c,0xe6,0x6a,0xf7,0x13,0xf1,0x30, + 0xd2,0x42,0xf6,0xd9,0x24,0x9d,0x12,0x9b,0xb4,0xaf,0xf9,0x1c,0x4c,0x33,0xf,0x27, + 0x37,0xc6,0x2d,0xc,0xcb,0x38,0x69,0xdc,0x4c,0xa8,0x8f,0x72,0x53,0x12,0x6,0x29, + 0x4d,0xcf,0xd2,0x3d,0x40,0x14,0x72,0x38,0x60,0x73,0x5e,0x32,0x2f,0x15,0x49,0x90, + 0xc4,0x66,0x1c,0x47,0x59,0xcc,0x25,0xb7,0xd5,0x73,0xc1,0x6c,0xa4,0x5e,0x60,0x82, + 0x21,0x9d,0x38,0x11,0xc5,0x8e,0xa6,0xb7,0x4b,0xd,0xf3,0xb2,0x88,0xfa,0x8e,0x15, + 0x3a,0x57,0xa6,0xa0,0xca,0x95,0x67,0x39,0x46,0x5c,0xe4,0x58,0x15,0x72,0x30,0x37, + 0x9a,0x7,0x22,0x2a,0x52,0xf1,0x18,0x81,0xf0,0x5,0xbd,0xe2,0xf1,0x89,0x7b,0xd5, + 0x6c,0x36,0x66,0x16,0x68,0x37,0xa0,0x79,0x36,0x9b,0xb5,0x20,0xb5,0xc5,0x46,0x5, + 0xae,0x6,0x3b,0xe2,0xdd,0xed,0x44,0xc3,0xa9,0x15,0x91,0x93,0x92,0x9,0xc8,0x47, + 0xfd,0x89,0xcf,0xbc,0xb1,0x7c,0xfb,0x7f,0x7d,0xe7,0x6a,0x80,0x7d,0xeb,0x77,0xee, + 0x5a,0x9f,0xf8,0xcc,0x1b,0xb,0x4b,0x21,0x8a,0x3e,0xbc,0xf0,0xce,0x89,0x92,0x44, + 0x73,0x4b,0x39,0x5c,0x9b,0x35,0x29,0x9c,0x46,0x29,0xb1,0xdb,0x11,0xfe,0xe8,0x8c, + 0x59,0xf0,0x54,0x49,0x20,0x82,0x64,0xea,0x33,0x55,0xec,0x84,0x5e,0x9b,0x53,0x76, + 0xef,0x41,0xb0,0xc3,0xc2,0xb4,0x55,0xb,0x7e,0xea,0x7c,0xc0,0x26,0x8a,0x53,0xb9, + 0xfa,0x7,0xb2,0xac,0x6b,0xf6,0x21,0xd0,0x1,0x4c,0x76,0x68,0x9c,0xe8,0xfe,0x23, + 0xa,0x1d,0x22,0xf0,0xf9,0xf,0x50,0x60,0x90,0xdb,0x96,0x91,0xcb,0x3d,0xae,0x7b, + 0x3c,0x43,0xf,0x73,0xcf,0xc7,0x3f,0x73,0x67,0x79,0xfc,0x33,0x77,0x96,0x43,0x98, + 0x7,0xf,0x17,0x38,0x2a,0xd0,0xe0,0xdd,0x76,0xc0,0x29,0x8c,0x9d,0xee,0x3c,0x76, + 0xe6,0xe,0xf0,0x8e,0xb5,0x9d,0x7e,0x68,0xe6,0xbe,0xff,0xe9,0xf1,0xcf,0xdc,0x59, + 0x9e,0xf8,0xcc,0x9e,0xf4,0x8d,0xe0,0x5,0x6d,0x85,0xfb,0xa4,0xef,0xeb,0x33,0x8e, + 0x30,0x27,0x5b,0x8,0xe3,0xba,0x91,0xac,0x1,0xd1,0x82,0x77,0xec,0x6f,0x5e,0xaf, + 0xd9,0xf1,0x4b,0x16,0xb2,0x54,0xf4,0x8a,0x99,0x23,0xd6,0x1,0x75,0x50,0x10,0x75, + 0xec,0x1b,0x3,0x20,0xea,0xc4,0xcf,0xf4,0x40,0xe4,0x43,0xe3,0x48,0xc3,0x72,0x27, + 0xd7,0x42,0x52,0x10,0xbb,0x8e,0x33,0x59,0xe8,0x43,0xc5,0x62,0xd0,0x66,0xb7,0x98, + 0x90,0xce,0xac,0xb,0x27,0x75,0xba,0xb4,0xbf,0xdd,0xec,0xdb,0xbf,0x7b,0xf7,0xfa, + 0xf8,0x6f,0xdd,0x5e,0x26,0xe1,0x63,0x54,0xd0,0xb3,0xef,0x57,0xf5,0xdc,0x33,0xe6, + 0x82,0x3b,0x9b,0x45,0x8a,0xb6,0xe8,0x59,0xe0,0x7,0x5b,0x82,0xb3,0x80,0x6e,0x13, + 0xe9,0xec,0x4c,0xfa,0x2f,0xaa,0x7,0x8e,0x7e,0xb0,0x26,0x8e,0xdb,0x44,0xa1,0x46, + 0x81,0x8,0x5c,0xbd,0x59,0x2,0x8d,0x75,0xc,0x25,0x5b,0x4c,0xb6,0x23,0xa2,0x66, + 0x5e,0x8f,0xff,0xd6,0x1b,0xcb,0xe3,0x9f,0xbe,0xb3,0x58,0x3c,0xa0,0xd,0x49,0xa1, + 0x4a,0xcb,0x13,0x12,0x93,0x8,0xb3,0xa5,0x38,0x3b,0xfe,0xf6,0xef,0xbe,0x73,0x7d, + 0xec,0xd3,0x75,0x7e,0xd7,0xde,0xdd,0x77,0x8d,0xe0,0x8,0x4,0x63,0x41,0xfe,0x2e, + 0xbe,0x5f,0x67,0x4c,0x8e,0x61,0x69,0xa,0x83,0x58,0x67,0x4a,0x9,0xe1,0x2e,0xed, + 0xda,0xb8,0xa9,0x9c,0x13,0x89,0x6e,0xf,0xa,0x12,0x9d,0xc8,0x33,0x58,0x1c,0x50, + 0x9d,0x1b,0x18,0x1,0x13,0x8e,0x24,0x18,0xf9,0xbe,0x59,0xe,0x44,0x61,0xb1,0xfa, + 0x66,0xf6,0xf8,0x6f,0xdd,0x59,0xbe,0xfd,0xbb,0xef,0x5c,0x39,0x3,0xd7,0x79,0x93, + 0x25,0x8f,0x75,0x13,0xc1,0x91,0xd4,0x25,0xb6,0x99,0xa2,0x56,0x53,0xa8,0x43,0x15, + 0x2d,0xc4,0x5b,0xe1,0x30,0x0,0x51,0x62,0x9a,0x22,0x9e,0x2d,0x52,0xd1,0x68,0x56, + 0xc6,0x1b,0xc,0x53,0xe8,0x63,0x48,0xe2,0xf7,0xf,0x7b,0xec,0xd3,0x77,0x96,0xc7, + 0x3e,0x7d,0x67,0xf1,0xd8,0x3e,0x4,0x26,0x7a,0x17,0xd1,0xe5,0x20,0xb6,0xfa,0xc9, + 0xa2,0x93,0x5a,0xf2,0x59,0x4d,0x2e,0x28,0xb1,0x89,0x8d,0x2c,0xb5,0x41,0x2d,0xfb, + 0x51,0xb3,0x9b,0xc2,0x78,0x1f,0x76,0xcf,0xaa,0x7b,0xc4,0x5d,0x83,0x4d,0xfd,0xbd, + 0xc7,0x3e,0x7d,0x7b,0x79,0xec,0xd3,0x77,0x96,0x21,0xed,0x39,0xc4,0x5b,0xc0,0x46, + 0x3b,0xae,0x33,0xdf,0x5e,0xc9,0x8b,0x30,0x8f,0x8b,0x56,0x3,0x78,0x9d,0xc6,0x71, + 0x1c,0x89,0x2c,0x21,0xa2,0xc8,0x81,0x94,0x0,0x27,0x40,0x97,0x47,0xd5,0x8e,0x0, + 0x9f,0x86,0xc9,0x4c,0x17,0x80,0x3d,0xf6,0x9b,0xb7,0x97,0xef,0xfc,0xdb,0xbb,0xd7, + 0x3e,0xef,0x44,0xae,0xc0,0x11,0x3,0x86,0x1f,0x1a,0xff,0x1c,0x0,0xd5,0x5,0xe1, + 0x71,0x4c,0xc6,0x43,0x12,0xbb,0x58,0x29,0x2e,0x52,0xf5,0x26,0x76,0xb0,0x71,0x5f, + 0xa3,0xa9,0xff,0xc5,0x96,0xec,0x41,0x1c,0x8,0xe6,0xd9,0xe1,0xb4,0x3,0xb,0xad, + 0xc8,0x71,0x0,0xe3,0x11,0xf3,0x32,0xfc,0xac,0xcf,0x8d,0x38,0x7,0x3b,0x80,0x37, + 0xc9,0xf6,0xc3,0x36,0xb1,0xd9,0xc5,0xc,0x52,0x3d,0xd1,0x6a,0x1f,0x1d,0x23,0xb6, + 0x3d,0x26,0xb5,0x4d,0x4c,0x52,0x83,0xda,0xe5,0xeb,0x78,0x2c,0xcb,0x95,0x7c,0x56, + 0xe4,0x8c,0xe2,0x40,0x8,0xce,0x96,0x93,0xcc,0x1c,0xa0,0x22,0x86,0xee,0x70,0x6b, + 0x21,0x9,0x2d,0x73,0xdf,0x37,0x27,0x67,0xad,0x6e,0x76,0x92,0x12,0x7d,0x24,0xb0, + 0x7c,0xa7,0xb,0xa8,0x29,0x4a,0x18,0xe,0x8d,0xe7,0x10,0x9e,0xdd,0x29,0xf3,0xad, + 0x7,0xc8,0x6f,0xde,0x59,0x60,0x66,0xcf,0xfc,0xdb,0xbb,0xd6,0x47,0x3f,0xfd,0xc6, + 0x92,0x5c,0x7e,0x2,0xf0,0x60,0x56,0x8d,0x59,0xe0,0x19,0x3f,0xfa,0x9b,0x77,0x96, + 0x67,0xfe,0xdd,0x3b,0x57,0x98,0xd9,0x33,0xff,0x6e,0x4,0x26,0x99,0xb,0x4f,0x36, + 0x6e,0xa4,0x38,0xc9,0xd0,0x1,0x66,0xf0,0xc1,0x35,0xef,0xde,0xe8,0x25,0xb6,0xaf, + 0x21,0xe2,0x30,0x36,0xe5,0x19,0x8f,0x76,0x3c,0xca,0xce,0x53,0x96,0x20,0x44,0xdc, + 0xdf,0x19,0xa5,0x6a,0x50,0x85,0xd1,0x2d,0x3a,0x65,0x84,0xe8,0x59,0xf0,0x45,0xe8, + 0xad,0xae,0x8b,0xc6,0x89,0xdf,0xfd,0xcc,0xbf,0x6f,0xf7,0xab,0x5d,0x23,0xdb,0xfa, + 0x51,0xe2,0xe7,0xec,0xe2,0x7,0xb2,0xa,0x45,0x4e,0xad,0x3d,0x2,0xe5,0xb8,0x72, + 0x20,0x47,0xb6,0xd9,0x17,0xe9,0x5a,0xc6,0x44,0x77,0x4c,0xfa,0xd9,0x10,0xbd,0x71, + 0xa6,0xa2,0xb9,0x7,0x20,0x9d,0x5b,0xa2,0xcc,0x8c,0x96,0x39,0x42,0x65,0xe1,0x74, + 0xdf,0x90,0x7,0xeb,0x7,0xe,0x36,0xbc,0x5,0x90,0x2c,0x8d,0x5c,0x78,0xcc,0xe5, + 0x48,0x4c,0x6,0x1c,0x98,0x4c,0x41,0x7c,0x38,0xed,0xad,0xfa,0x76,0xc9,0xae,0x20, + 0xe1,0xd,0x58,0x30,0x27,0x18,0x5a,0x60,0x7a,0xf1,0xe3,0x20,0xf3,0xa0,0xdb,0x90, + 0xbb,0x77,0xca,0x6d,0xd1,0xd1,0x53,0x31,0x11,0x40,0x71,0x4,0x12,0x3,0xa6,0xa3, + 0x81,0xa9,0xb,0x6a,0xa8,0xda,0x67,0x66,0x4a,0x49,0xa0,0x28,0xfa,0x53,0xc7,0x68, + 0x5d,0x42,0x72,0xc0,0xfd,0x73,0x51,0xa4,0x3a,0xe0,0x45,0x10,0xc0,0xa1,0x6a,0x81, + 0x3b,0x8a,0x84,0x68,0x97,0x39,0x7d,0x96,0x41,0x9d,0xaa,0x8f,0xc5,0x3c,0x8f,0x5, + 0x3c,0x38,0x7f,0xcd,0xa1,0x96,0x2e,0x1f,0xc1,0xda,0xef,0x79,0x4,0x1,0xd5,0x9a, + 0x31,0x35,0xfc,0x81,0x7b,0x12,0x27,0xe2,0x96,0x77,0xe0,0xf1,0xd6,0xf7,0xde,0xf7, + 0xea,0xa3,0xbf,0xb1,0x57,0xc8,0xcf,0xfe,0xde,0xa9,0x55,0xaa,0x51,0x96,0xf8,0x75, + 0xd3,0x31,0x1d,0xa1,0xe2,0x9d,0xd9,0xa4,0xf4,0xfd,0x1e,0xfd,0x97,0xc7,0x8b,0x99, + 0xd9,0x73,0xbf,0x7f,0x6a,0x65,0x8a,0xb4,0xc1,0xec,0xd1,0xdf,0x38,0x5e,0x9e,0xf9, + 0xbd,0x53,0xab,0x88,0x2,0x89,0xf4,0xb0,0x8f,0x19,0x79,0x48,0xf2,0xdb,0x6a,0x7e, + 0xf6,0xdf,0x9f,0x5a,0x1f,0xf9,0x97,0xc7,0xcb,0xb3,0xbf,0x77,0x6a,0xed,0x53,0x51, + 0x77,0xe1,0xd4,0x1f,0xc2,0x4a,0xc1,0x33,0xb7,0xfe,0xd1,0xdf,0x38,0xee,0xf7,0xa1, + 0x63,0xa2,0x92,0xfe,0x80,0x25,0x8a,0x35,0x3f,0xaf,0x93,0xb3,0x20,0x16,0x3,0xa7, + 0x80,0x3d,0xbc,0x4c,0x8c,0xad,0x83,0xcb,0x52,0x54,0x0,0xd6,0x15,0x40,0x59,0xc5, + 0x98,0x65,0x3c,0xfb,0xfb,0xef,0x5c,0xad,0x70,0xa6,0xe9,0xc9,0xb3,0x39,0x82,0xe9, + 0x1e,0xa9,0xb,0xe1,0xb9,0xdf,0xbf,0x7b,0x1d,0x74,0x5,0xf,0xf3,0xe4,0x61,0x4a, + 0xd1,0xd,0x29,0x28,0x23,0x1b,0x87,0x91,0x2b,0x2b,0xc8,0x91,0x16,0x3c,0xb7,0xd6, + 0xe0,0x1e,0x3e,0x3f,0xf6,0x86,0x48,0x5e,0x85,0xe,0x69,0x56,0xa,0xeb,0x82,0x14, + 0x22,0x84,0xe2,0x79,0xe,0xc5,0x54,0x12,0x37,0x51,0xee,0x12,0xe0,0xc8,0x66,0xf6, + 0xdc,0x67,0xdf,0xb9,0x3e,0xf2,0x1b,0x77,0x96,0x3e,0xd7,0xb6,0x80,0x5e,0xb7,0xb8, + 0x40,0x3c,0xf8,0x72,0x87,0x3,0x84,0x5c,0xae,0x7a,0x46,0x9,0xed,0x2,0xa4,0x59, + 0x53,0xe2,0xb8,0xb9,0x8,0xa0,0x24,0xd,0xf2,0x30,0x8f,0x8e,0x1,0x99,0xe7,0x6b, + 0x6e,0x1,0x95,0x2f,0x80,0x83,0x68,0xc7,0x19,0xb3,0xe5,0xfd,0x7,0xfd,0xb9,0x7d, + 0xb6,0x3e,0xb7,0x39,0x6f,0x51,0x32,0xe9,0xb7,0xec,0x8a,0xfd,0x8c,0x7f,0x49,0xff, + 0x1e,0xb6,0xcf,0x23,0xbf,0x71,0x67,0x5c,0xcf,0x3c,0xf2,0x4f,0xf0,0x28,0xec,0xb9, + 0xe9,0x99,0x49,0xe6,0x39,0x98,0xbc,0xd5,0x55,0x8a,0xe8,0xe9,0xa6,0x50,0x8d,0xb9, + 0x39,0xb7,0xf7,0x80,0x17,0xef,0x6f,0x74,0x4e,0x9,0xf9,0xa3,0xe8,0x17,0xc8,0xfe, + 0xf6,0x21,0x32,0x24,0xe,0xf0,0x51,0xf1,0xd0,0x26,0x38,0x18,0xca,0x44,0x44,0xd7, + 0x32,0x5,0x48,0xf4,0xae,0xdc,0xc3,0xbf,0x7e,0xbc,0x3c,0xf7,0xfb,0xf5,0x50,0xdf, + 0x4c,0x94,0xd2,0xd0,0x3c,0xeb,0x5d,0x3b,0x76,0x4c,0xab,0x6a,0x2a,0x66,0x3c,0xdd, + 0x12,0xc4,0x8f,0x48,0x10,0x40,0xc6,0x3e,0x2e,0xa0,0x9c,0xb1,0xef,0xdd,0xe3,0xfd, + 0x21,0x59,0x67,0x9f,0x29,0x76,0x2a,0x36,0xc6,0xe,0x30,0x90,0xfa,0xf9,0xd7,0x3, + 0xac,0x27,0x16,0x3,0x48,0x0,0x4c,0x3,0x88,0x4b,0x70,0x77,0x64,0x3f,0x7a,0xb7, + 0x0,0x8e,0xe,0xeb,0xdf,0x25,0xb1,0x14,0x93,0xee,0x34,0x4b,0x76,0x57,0xdd,0x11, + 0x40,0x4d,0x6e,0x78,0x4d,0x7a,0x38,0x23,0x7d,0xb2,0xef,0x7d,0x2,0x7a,0xe5,0x35, + 0xdb,0x18,0x2,0x10,0xe0,0xd9,0xa8,0xa0,0x1d,0x6a,0x56,0xc3,0x54,0x69,0xe6,0xa2, + 0xb,0xc4,0x69,0x13,0x85,0x1,0xb,0xb6,0x4c,0xfd,0x3c,0x95,0x9f,0x6f,0x11,0xff, + 0xa,0x61,0xc7,0xbb,0x3c,0x7b,0x4f,0x31,0xb1,0x1b,0x21,0x3,0x13,0xa0,0x88,0xa9, + 0x89,0x86,0x8b,0x33,0x93,0xa2,0x97,0x1d,0x41,0x32,0x33,0x18,0xb2,0x30,0x82,0xd7, + 0x99,0x18,0x6f,0x6e,0xf,0xff,0xfa,0xed,0xe5,0xb9,0xcf,0xbe,0x73,0x75,0xe2,0xe6, + 0xf5,0x4b,0x17,0x34,0x36,0x52,0x60,0x1d,0xb3,0x26,0x4f,0x60,0x3d,0x8f,0x2d,0x10, + 0x9a,0x3f,0xbb,0x87,0xef,0xa,0xcf,0xa8,0xf9,0xd4,0x6,0xc9,0x99,0xbf,0x7,0xeb, + 0xbf,0x84,0xf2,0x97,0x9b,0x69,0x41,0x97,0x99,0x84,0x3f,0x12,0x7f,0x78,0xd6,0xca, + 0xd2,0xd9,0x59,0xd2,0xcc,0x34,0x45,0xb8,0x47,0x4,0x25,0xcf,0x2e,0x67,0x68,0x73, + 0xf5,0xed,0xe,0xb3,0xdd,0xfa,0xb1,0xdf,0xfd,0xec,0xdd,0xeb,0xc3,0xbf,0x7e,0x67, + 0xb1,0xd0,0xd5,0x7c,0xee,0xb3,0x77,0xaf,0xf,0xff,0xfa,0xed,0x3e,0x43,0x7d,0xf8, + 0xd7,0xef,0x2c,0xf,0xff,0x8b,0xdb,0x4b,0xfb,0xc5,0xfe,0xf7,0x83,0xf4,0xf2,0x68, + 0x29,0x39,0x19,0x11,0xd,0xb8,0xd3,0xe1,0x2a,0xe8,0x80,0xde,0x33,0x7f,0x6f,0x65, + 0x3,0xcc,0x6a,0xea,0x88,0x15,0x41,0xba,0x6f,0x79,0x2e,0x8b,0x9c,0xc0,0xd2,0xda, + 0x79,0xf8,0x5f,0xdc,0xae,0xf7,0xc3,0xc8,0xd4,0x46,0x65,0x8c,0x5d,0xb0,0xa2,0x44, + 0xe5,0x9b,0xb5,0x26,0x67,0x93,0x8b,0x94,0xf4,0x42,0x7c,0xe,0x4,0x83,0x11,0xcc, + 0x7c,0xd8,0xbc,0x25,0x69,0x89,0x8b,0xfa,0xba,0xae,0xd7,0xde,0x29,0xea,0xaf,0x7f, + 0xb,0x55,0xb2,0xb6,0xff,0x6b,0xd0,0xfa,0xee,0x67,0x4f,0xad,0xf,0x7f,0xea,0x78, + 0x89,0xd7,0x89,0x30,0x23,0x76,0x1,0x8e,0xf2,0x99,0x33,0x11,0xc6,0x6,0x8d,0xa9, + 0x2c,0x83,0xe5,0x78,0x6e,0xcd,0x8e,0x59,0xfd,0xd7,0x83,0x7f,0x27,0x26,0x8b,0xd5, + 0x39,0x30,0xc4,0xf3,0x91,0xba,0xf,0xed,0xbd,0xc4,0x6,0x13,0x21,0x71,0x71,0x8, + 0x5,0xd7,0xc8,0x87,0x61,0x6c,0x6f,0xe2,0xdb,0x40,0xc7,0x4e,0x8e,0x8c,0xd6,0xf6, + 0xba,0x43,0x7c,0x32,0xa,0x50,0xcf,0xf6,0x62,0xd1,0x6b,0x43,0x12,0x7d,0x10,0xaa, + 0x1f,0x6a,0xae,0xa3,0x10,0xc3,0xf1,0x9e,0xf,0x7f,0xea,0x78,0x79,0xa8,0x3e,0xd3, + 0x88,0xf9,0x10,0x9d,0x8,0x4a,0x22,0x18,0xe3,0xc2,0xd2,0xbf,0x3d,0x18,0x16,0x8, + 0x16,0x83,0x53,0x36,0x3f,0x20,0x56,0x5,0x33,0x7b,0xe8,0x53,0xc7,0xcb,0x77,0xff, + 0xe0,0xf4,0xea,0x44,0x85,0x7c,0xf8,0x53,0xc7,0xcb,0xc3,0x9f,0x3a,0x5e,0x86,0xe4, + 0x30,0xc7,0x1c,0xf5,0x2d,0x78,0xe8,0x53,0xc7,0xcb,0x73,0x7f,0x70,0x6a,0x65,0xe1, + 0xb4,0x21,0x20,0xd6,0x2e,0x63,0x48,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x34, + 0xe8,0xd2,0x2e,0xa0,0xde,0x11,0x70,0x7d,0xa2,0x15,0x62,0xd1,0x24,0x8a,0x9f,0x31, + 0xe2,0x39,0x83,0x20,0x75,0xc3,0x3e,0x25,0xfb,0xdf,0x1e,0xfe,0xd4,0xf1,0xf2,0xf0, + 0x27,0x6f,0x2d,0x1c,0x62,0x44,0x4d,0x1,0xc1,0x88,0x17,0xb4,0x10,0x40,0x33,0x5d, + 0xe5,0x6c,0x7b,0xe0,0xba,0x26,0x39,0x2c,0x9b,0x36,0x1a,0xa5,0x6a,0xa4,0x59,0xc1, + 0xa6,0x75,0x8,0x84,0x78,0xae,0xf4,0x30,0x99,0x1d,0xc5,0x79,0xc5,0x66,0x49,0x17, + 0x9e,0x33,0x32,0x1c,0x8c,0x9e,0x7,0x8c,0xdb,0x3d,0x7f,0x17,0xe5,0x31,0x8e,0xdb, + 0xfe,0xd0,0xa7,0x6e,0x2f,0xf,0x7d,0xf2,0xf6,0x62,0x98,0xcf,0x94,0xa,0xe7,0x53, + 0xf4,0x4f,0xf,0x7d,0xf2,0xf6,0xf2,0xd0,0xa7,0xee,0x2c,0x87,0xf4,0x7d,0xf3,0x1c, + 0x7d,0xbc,0xee,0xa1,0x4f,0xde,0x5e,0xbe,0xfb,0x7,0x7b,0xc5,0x29,0xae,0x6a,0x85, + 0xc0,0x5a,0x74,0xbd,0x73,0xb0,0xe4,0xcc,0x30,0x27,0x6c,0xa8,0x80,0xa4,0x37,0x53, + 0xbc,0x42,0xfa,0xfc,0xc0,0x57,0xc7,0xc4,0xa1,0xc9,0xc4,0x58,0x35,0xcc,0xeb,0xa0, + 0xb7,0xde,0x5,0x59,0xbd,0xff,0xf0,0xa1,0x4f,0xd6,0xfb,0xcd,0xb4,0x1e,0x68,0x85, + 0x3d,0x54,0x2,0x67,0xeb,0x26,0xd2,0x82,0x42,0x73,0x69,0xcb,0x55,0x13,0x5b,0x7b, + 0x82,0xdb,0xfc,0xc1,0x48,0x46,0x7f,0x1f,0xc9,0x46,0x77,0x7f,0x6e,0xa7,0x3a,0xcf, + 0xbf,0x3,0xc0,0x82,0x4f,0x7d,0xe7,0xd4,0x3,0x66,0x33,0xe4,0x7a,0x3,0x5a,0xd1, + 0xde,0x75,0x68,0x32,0xe4,0x2a,0xdf,0x98,0xdc,0xe9,0x40,0xb3,0x45,0x99,0x29,0xcf, + 0xb8,0xd3,0x3c,0x6e,0x23,0x7d,0x7,0x4,0xe0,0x12,0x60,0xf6,0xe0,0x27,0x8e,0x97, + 0x87,0x3e,0x71,0xbc,0x80,0x14,0xba,0x1c,0xfc,0xc,0x90,0x5d,0xbe,0x3c,0x60,0x1b, + 0xdc,0xec,0xa1,0x4f,0xee,0x1,0xe3,0xc1,0x4f,0xee,0xad,0x49,0xb0,0x6e,0x37,0xb4, + 0xbb,0x33,0x34,0xfc,0x4b,0xaf,0xb2,0x5c,0x41,0xd7,0x52,0x19,0x72,0xa5,0x25,0xa2, + 0x42,0x13,0x3c,0xc8,0x6c,0xef,0xc,0xac,0x54,0x0,0xd7,0x9a,0x5,0x35,0x3d,0x2a, + 0x68,0xe,0xec,0x73,0x5d,0x9f,0x1e,0x8a,0x80,0xec,0xe,0xc7,0xd8,0x19,0x31,0x83, + 0x89,0x34,0x4d,0xa8,0xe1,0xcd,0x43,0x9f,0x38,0x5e,0x1e,0xfc,0x44,0xd,0x70,0x48, + 0xb5,0x34,0x51,0x16,0x7d,0x8,0xa6,0x48,0xd0,0xa5,0xf3,0xe7,0x13,0xc7,0xcb,0xf7, + 0xfe,0xf0,0x74,0x5d,0xc7,0x6e,0x98,0x8e,0x32,0xd5,0xb6,0x19,0x54,0xa1,0xf,0xef, + 0x89,0x90,0x8c,0x79,0x9c,0xb8,0x53,0xc5,0x4b,0x85,0x90,0x83,0xfc,0xe7,0x7b,0x57, + 0xcd,0xd3,0x79,0xd5,0xf9,0xfa,0xdb,0xd8,0x8e,0xbd,0x3b,0x13,0xba,0x9d,0x40,0x9c, + 0x81,0x73,0x33,0x65,0xff,0xc7,0xef,0xfd,0xe1,0xe9,0xf5,0xc1,0x4f,0x1c,0x2f,0x51, + 0x58,0x8a,0xbb,0x99,0x69,0x21,0x38,0xf1,0xd4,0x6d,0x72,0xce,0xc8,0xfe,0x64,0xd0, + 0x6e,0xc6,0x0,0xf4,0xee,0x28,0x38,0xa2,0xc4,0x1c,0xa7,0x66,0x64,0xf,0x7e,0xe2, + 0xf6,0xf2,0xe0,0x27,0xee,0x2c,0xf,0x7e,0x62,0xa0,0x0,0xe1,0x7,0x78,0xd6,0x69, + 0x79,0x97,0x29,0x0,0x23,0xce,0xd9,0xb8,0x72,0x9a,0x6a,0xf6,0xb2,0x53,0x4d,0x0, + 0xe,0xc4,0x4c,0x96,0x4f,0x63,0x71,0xca,0xe1,0x4b,0x29,0x61,0x46,0x78,0xe8,0x3b, + 0xd0,0x35,0x5c,0xfe,0x78,0xb,0xce,0x9e,0x50,0x92,0xc2,0xd9,0xb6,0x88,0xaa,0xf7, + 0x79,0x0,0xee,0xb4,0x40,0x97,0x4d,0xe6,0x6e,0xf6,0xbd,0x3f,0xbc,0x7b,0x5f,0x20, + 0x16,0xd1,0xf0,0x81,0x1f,0x4c,0x54,0x8,0xc4,0x2c,0x33,0x55,0xa0,0xae,0xd7,0x4b, + 0x8a,0x68,0x6e,0x48,0xdd,0x1,0xa9,0x43,0x67,0x5d,0x0,0x40,0xfe,0xec,0xa6,0xa, + 0x7c,0x11,0x55,0x2e,0x8a,0x72,0x32,0x79,0x19,0x8,0x7b,0x9f,0x88,0xf2,0xb4,0x2e, + 0x4c,0x14,0xa1,0x11,0x8f,0x69,0xb8,0xae,0x3,0x99,0x2d,0x8f,0x8e,0xcc,0xf7,0x3e, + 0x77,0xaa,0xde,0x57,0xad,0x88,0xd,0xc1,0xd2,0x30,0xfa,0x8f,0xc6,0x8a,0xde,0xd9, + 0x23,0xfb,0x0,0x7a,0x3a,0xa8,0x8b,0xa,0xa,0x99,0x9a,0x2c,0xf,0x7e,0xfc,0x78, + 0xf9,0xde,0xe7,0x4e,0xaf,0x9c,0xe9,0x77,0xa4,0x73,0x84,0x21,0x90,0xc8,0x10,0xd8, + 0x4a,0xd4,0x72,0x77,0x40,0xe4,0x5c,0x3d,0x82,0xcb,0x26,0x73,0x68,0x42,0xaf,0x67, + 0x1e,0xb4,0x76,0x23,0x30,0xa9,0x86,0x14,0x95,0xbd,0x7f,0xaf,0x7,0x3f,0x7e,0xbc, + 0xcc,0xd8,0x17,0x8c,0xe9,0x51,0xad,0xf9,0xcc,0x31,0x7e,0xe0,0x63,0xfb,0x41,0x9, + 0x7a,0xe,0xcf,0xff,0x6f,0xa7,0xd6,0xe7,0x3f,0x77,0x7a,0x7d,0xf0,0xe3,0xc7,0x8b, + 0x47,0x7b,0x5c,0x55,0xae,0x17,0xd4,0xbf,0xd6,0x94,0x30,0x2f,0xa,0x7c,0x75,0xd7, + 0xf1,0x4f,0x16,0x4f,0x1,0xbb,0x33,0x24,0x65,0xb0,0xc,0x9d,0x52,0x30,0x54,0x37, + 0xee,0x81,0x13,0xf,0x86,0x9c,0xfe,0x24,0x99,0xc9,0xf4,0xd9,0xa8,0xc3,0xdf,0x6a, + 0xc1,0xcb,0x1f,0x3f,0x5e,0x9e,0xff,0xdc,0xe9,0x55,0x3b,0x72,0x46,0x6a,0x72,0x2e, + 0xec,0x19,0x4c,0x2a,0x63,0x17,0xf8,0x46,0xdb,0x93,0x8c,0x92,0x67,0xe1,0xa7,0xec, + 0x73,0x7e,0xb9,0xae,0x63,0xd5,0x65,0x47,0x70,0x9c,0x24,0x69,0x5c,0xcc,0x3b,0x68, + 0xa2,0x89,0x42,0xb7,0xf4,0xf2,0xc7,0x6f,0x2d,0x97,0x3f,0x7e,0x6b,0x61,0xfb,0xd2, + 0x29,0x17,0xab,0x2e,0xe0,0xcb,0x1f,0xbb,0xb5,0x3c,0xff,0xf9,0xd3,0x2b,0x53,0x85, + 0xd5,0x6d,0x12,0x49,0x9a,0x36,0x16,0x8d,0xee,0xb1,0x80,0x8c,0x9d,0x44,0x88,0x62, + 0x26,0x9f,0x37,0xf,0xb6,0xcf,0xf,0xb1,0xc4,0xc9,0x32,0x5c,0x19,0x57,0x8,0x9d, + 0xae,0x78,0xe,0x46,0x95,0xd6,0xf1,0x19,0xf2,0xdc,0x45,0xfa,0x95,0xde,0xa4,0xe9, + 0xc2,0xfa,0x66,0xf6,0xfc,0xe7,0x4f,0xad,0xcf,0x7f,0xfe,0xee,0xf5,0xf2,0xc7,0x5a, + 0xcb,0x54,0x5b,0x33,0xd2,0x6,0xc0,0xa4,0xa,0x43,0x74,0x3d,0x19,0xa0,0xa8,0xcb, + 0x1f,0xbb,0xbd,0x3c,0xff,0xf9,0x53,0x2b,0x6f,0x20,0xad,0x20,0x61,0x62,0x60,0xd2, + 0x6f,0xa6,0xf7,0xdf,0x1d,0x9a,0xe5,0xb4,0x70,0x3b,0x47,0x3a,0x54,0xd6,0x4d,0x35, + 0x69,0xb3,0xa9,0x9c,0x65,0xd0,0xf7,0x32,0x98,0xd9,0xe5,0x8f,0xdd,0x5e,0x5e,0xf8, + 0xfc,0xa9,0xf5,0xf2,0xc7,0x8e,0x17,0x2e,0x6b,0x2e,0x7f,0xf4,0x78,0x79,0xfe,0x73, + 0xa7,0xd6,0xe7,0xeb,0xbf,0xd,0x94,0x3f,0xb2,0x2,0x11,0x60,0xf7,0x7f,0xf4,0x78, + 0xb9,0xfc,0xf1,0xe3,0xe5,0xf2,0xc7,0x6e,0x2f,0xce,0xf7,0x86,0x47,0xea,0xb5,0x2a, + 0x7a,0x3e,0x7e,0x9e,0x33,0x8,0x6d,0x64,0xf9,0x20,0xbd,0xe6,0x56,0xf5,0x58,0x44, + 0x11,0x13,0x2a,0x99,0x15,0xa8,0x10,0x69,0xa0,0xd0,0x56,0x9b,0x76,0x71,0x4b,0x42, + 0xb6,0xf7,0x67,0x97,0xe6,0xa2,0x5a,0x31,0xb4,0xbf,0x3f,0xff,0xb9,0xd3,0xfb,0x77, + 0x62,0x8e,0x75,0x3c,0x8e,0x23,0x8d,0xab,0x56,0x9d,0x97,0x3f,0x7a,0xbc,0x5c,0xfe, + 0xe8,0xf1,0x12,0x81,0x97,0x7d,0x84,0x13,0x32,0x5b,0x3e,0xce,0x2f,0x7f,0xec,0x78, + 0x79,0xe1,0xf3,0x63,0x4e,0xca,0x15,0x8d,0xa0,0x49,0xa1,0xad,0x59,0x41,0xa6,0x8b, + 0x72,0x97,0xd,0xa3,0x5,0x10,0x70,0x8a,0xaa,0xfc,0xcb,0x1f,0xdb,0xaf,0xd7,0xcc, + 0xec,0x81,0x8f,0x1e,0x2f,0x2f,0x7c,0x7e,0xaf,0x5c,0x3c,0xa4,0xea,0xad,0x8a,0x18, + 0x1d,0x25,0xda,0x7f,0x91,0x5,0x50,0x86,0x44,0x72,0x9f,0x1d,0xc6,0x71,0x14,0xb5, + 0x93,0x5b,0x55,0xe5,0xa4,0xbc,0xe7,0xe9,0x95,0xda,0xc2,0xc3,0xb4,0xf3,0xe5,0xb2, + 0xa7,0x67,0xa8,0xe8,0x51,0xf9,0xc4,0x75,0x6,0x7b,0xe0,0xa3,0xf5,0xe0,0x99,0x74, + 0x73,0x64,0xc6,0x49,0xea,0x66,0x70,0xb3,0x7,0x3e,0x7a,0x6b,0x79,0xe1,0x8f,0x4e, + 0xaf,0xf,0x7c,0xf4,0x56,0x3f,0x77,0x7a,0x97,0x7,0x41,0x4f,0x22,0xe6,0xca,0x98, + 0x81,0xbe,0x20,0xf6,0xce,0xdd,0xb3,0xa0,0xb6,0xda,0x5f,0xf8,0x7c,0xfd,0x2c,0x1b, + 0xe,0x8c,0x39,0xdf,0x87,0x28,0x81,0x5,0x8,0x74,0xe8,0xec,0x41,0xfc,0xb3,0xe3, + 0x68,0x29,0xc9,0x9f,0xd5,0xbf,0x3e,0xf0,0x91,0x5b,0xcb,0xb,0x5f,0x18,0xf7,0x4b, + 0x40,0xb0,0x13,0xe4,0xb8,0x22,0xb5,0xc3,0x38,0x0,0x46,0x6b,0x60,0x22,0xbf,0x2a, + 0xe8,0xf8,0x99,0xa0,0x4c,0xb4,0x2e,0x45,0x1e,0x49,0x81,0x3b,0x9e,0x3,0x4f,0x73, + 0xb0,0x56,0x4a,0x6c,0xe,0xed,0x8,0x1,0xf9,0x86,0xfa,0x66,0xf6,0xc2,0x17,0xce, + 0xac,0xf,0x7c,0xe4,0xd6,0x92,0xeb,0xcf,0x18,0x63,0x26,0x5d,0x44,0xc2,0xfc,0xbc, + 0xf0,0x85,0xd3,0xeb,0x3,0x1f,0xb9,0xb9,0xf0,0x6b,0x5e,0xf8,0xc2,0x99,0xfe,0xec, + 0x2d,0xe8,0xb0,0x8b,0x9f,0x8,0x7c,0x56,0xf2,0x58,0x7c,0x56,0xea,0xc2,0x16,0xbb, + 0xaa,0x1e,0x3a,0x9c,0xc8,0x9d,0xc4,0x89,0x2c,0x34,0x17,0x6f,0xfb,0x1a,0x39,0xb3, + 0x66,0x7c,0x8f,0x57,0x12,0x38,0xb8,0xed,0x6d,0xc2,0x5b,0xee,0xd4,0x8,0x8f,0x73, + 0x46,0xef,0x33,0xa0,0x19,0x25,0x83,0x54,0x5,0x2d,0xab,0xa8,0x8d,0x8c,0x84,0xf9, + 0x9a,0x30,0xb3,0x17,0xff,0xe8,0xd4,0xfa,0xc0,0x47,0xc6,0xfc,0x15,0x81,0xf3,0xcb, + 0x33,0x8a,0x5e,0xd1,0x3b,0x29,0x19,0x5,0x5b,0x46,0x44,0x1,0x15,0x98,0xbd,0xf0, + 0x85,0x53,0xeb,0xfd,0x1f,0xdd,0xbb,0xe,0x71,0x6f,0x39,0x6d,0xc4,0xfb,0x3f,0x7a, + 0xbc,0xbc,0xf8,0x47,0xa7,0x56,0x6,0xc5,0xf0,0x3c,0x1a,0x50,0x44,0x39,0x8b,0xa9, + 0xb0,0x90,0xfe,0x3,0x1f,0x39,0x5e,0x5e,0xfc,0xa3,0xd3,0xeb,0xb,0x5f,0x38,0xb5, + 0xea,0x7d,0xd4,0x44,0x8c,0xc7,0xe2,0xfb,0x61,0x56,0x13,0x5,0x2,0x49,0x8,0x97, + 0x1a,0xea,0x7f,0x1e,0x95,0xa6,0x62,0xfb,0x3c,0xce,0xfc,0xe3,0xd8,0x21,0x63,0x28, + 0xe6,0xdd,0x7,0x4,0xc4,0xbb,0xaa,0x2a,0xb1,0x12,0x58,0xb0,0xa7,0x74,0x4b,0xf8, + 0xb,0x99,0x3e,0xb5,0x8e,0x30,0x75,0x54,0xee,0xff,0xc8,0xf1,0xf2,0xe2,0x1f,0xd7, + 0x59,0x98,0xe8,0x5,0xd0,0x6c,0x75,0xe2,0x7b,0x1f,0x11,0xdb,0x2d,0x21,0xba,0xff, + 0x23,0xfb,0x33,0xf5,0x99,0x38,0x9,0xdc,0xee,0xff,0xc8,0xf1,0x72,0xff,0x47,0x6e, + 0x2d,0xf7,0x7f,0xe4,0x78,0xe9,0x92,0x8f,0xd1,0x3,0x0,0x41,0x9b,0xdd,0x21,0x88, + 0xdf,0xa4,0x7,0x40,0x9d,0x6,0x36,0xe6,0x88,0x73,0x3c,0xa3,0x39,0x23,0xba,0x57, + 0xbb,0xee,0x2f,0xa5,0xe8,0xe8,0x2f,0x32,0x47,0xbc,0xb7,0x4b,0xa5,0x15,0x8,0x51, + 0xf,0xf4,0xc8,0x1e,0x9,0x7e,0xdc,0x8c,0x36,0xd6,0xf3,0x1c,0xf3,0xd7,0xd3,0xfa, + 0x7f,0xf1,0x8f,0x4f,0xaf,0xf7,0xff,0xda,0xad,0x45,0x99,0x10,0xca,0x3a,0xf0,0x89, + 0xc3,0x1a,0xd0,0x9e,0xf9,0x99,0x95,0xf7,0xb7,0x56,0x4d,0x1,0x73,0xe0,0xd9,0x3a, + 0xb5,0x71,0x85,0x93,0x5a,0x1b,0x59,0x3b,0xa,0xcf,0x98,0xfe,0x1e,0x5b,0xad,0x71, + 0xa3,0x2,0x98,0xd0,0x2b,0xb9,0x4b,0xac,0x58,0x82,0xfb,0x7f,0xed,0xe6,0x72,0xff, + 0xaf,0xdd,0x5a,0x42,0x17,0x39,0x43,0x27,0x9,0x99,0x1e,0xfd,0xd0,0x93,0x59,0x10, + 0x20,0xaf,0x73,0x67,0x76,0x8d,0xb6,0xce,0x31,0x1b,0x6b,0xd0,0xbe,0x29,0x7,0xf0, + 0x2c,0x8a,0x5f,0x99,0x0,0x2b,0x4b,0xd6,0x34,0x7f,0xf1,0x8f,0xcf,0xac,0xf7,0xf7, + 0xc0,0x3b,0xd3,0xc2,0xa3,0x99,0x47,0xe8,0xb4,0xce,0x95,0x32,0xf3,0x1e,0x4a,0xc8, + 0xfd,0x30,0x8a,0xe0,0xd7,0xc9,0x4c,0xda,0x33,0x26,0x86,0x75,0xd5,0x63,0xf7,0xf7, + 0xd0,0x8,0x36,0xe9,0xf1,0x73,0x77,0x50,0x10,0xee,0x93,0xa4,0xf,0x50,0x9c,0x17, + 0xe,0x75,0x32,0xa3,0x56,0x49,0x5c,0xa7,0xba,0x87,0x5a,0x42,0x56,0x8c,0x66,0x72, + 0x4e,0xfc,0x68,0xf4,0x4a,0x16,0x89,0xab,0x37,0xd5,0xe6,0x26,0x54,0x5e,0xef,0xf7, + 0x3b,0x52,0xd5,0xce,0x62,0xff,0x3a,0x37,0xc9,0x1c,0xbe,0xc4,0x27,0x9e,0x20,0x65, + 0xc7,0x6c,0x36,0x70,0xa1,0x29,0xfb,0xf7,0x58,0xc5,0x48,0x66,0x3,0x5,0xe0,0x71, + 0xeb,0x6e,0x23,0x0,0xde,0x16,0x14,0xcd,0x52,0xc5,0x31,0xde,0x4d,0x78,0xa4,0x11, + 0x35,0xbc,0xf1,0xf8,0x21,0x80,0xa3,0x36,0x4d,0x3a,0xbb,0x12,0x1b,0x18,0x78,0x43, + 0x55,0x34,0x83,0x8d,0x26,0xb3,0x22,0x6,0x6b,0x89,0xf6,0x3a,0xb7,0xaf,0xd,0x19, + 0xec,0xc5,0x6d,0x42,0x4c,0xe6,0xa5,0xa6,0x3c,0x62,0x37,0x97,0xce,0x8a,0xf0,0xe1, + 0x63,0x15,0x91,0x30,0x16,0x22,0xe2,0x69,0x66,0xb0,0xfb,0x9e,0xba,0xb5,0xdc,0xf7, + 0xab,0xc7,0xcb,0x7d,0xbf,0x76,0xbc,0xbc,0xf4,0xc7,0xa7,0xd7,0xa1,0xda,0x14,0x8c, + 0x11,0xe8,0xf3,0x5e,0xfc,0xe2,0xe9,0xf5,0xbe,0x5f,0xad,0x0,0x11,0x2,0xee,0xc, + 0x4c,0x6,0x64,0x56,0xd7,0xd5,0xf0,0x68,0xae,0x7d,0xdf,0x53,0xc7,0xcb,0x4b,0x5f, + 0x3c,0xbd,0xbe,0xf4,0x45,0xaa,0xa8,0xdd,0x32,0xcf,0xda,0x26,0x9c,0xe3,0xfa,0x4f, + 0xf7,0xff,0xea,0xad,0xfe,0x1e,0xf7,0x3d,0x75,0x6b,0x69,0xdf,0xf9,0xa5,0x3f,0x3e, + 0xbd,0xde,0xff,0x54,0xd,0x70,0x30,0xbb,0xef,0x57,0x6f,0xed,0xdf,0x8d,0xb3,0xfa, + 0x9,0x4e,0x83,0x51,0x58,0xe2,0x79,0xf,0xb3,0xfb,0x9f,0x3a,0x5e,0xee,0xfb,0x55, + 0xee,0x5c,0x14,0xda,0x87,0x91,0xfc,0x3e,0x7,0x8a,0xc5,0x8a,0x2c,0x6b,0xf4,0xcf, + 0xd0,0xff,0xa3,0x5c,0x6c,0xdf,0x97,0xe7,0xe1,0xbc,0x37,0x63,0x5,0xd9,0x3a,0x58, + 0x63,0xcd,0xc6,0x5d,0x8e,0x49,0xe7,0x82,0xe7,0xa1,0x2e,0x58,0x9b,0xa9,0x8,0x4a, + 0x12,0x2c,0xe1,0xd1,0x97,0x27,0xc,0x88,0x60,0x6b,0xc2,0x4e,0x98,0xcb,0x9e,0xcd, + 0x83,0x15,0x26,0xff,0x7b,0xdf,0x53,0xb7,0x96,0x97,0xbe,0x78,0x66,0x9d,0xee,0xfb, + 0x49,0xcc,0x68,0xdf,0xf7,0xe5,0xba,0x7e,0x66,0xed,0x5e,0xf1,0xb0,0xdc,0x26,0xc, + 0x96,0x4,0x7e,0xb4,0x74,0x6f,0xb8,0x42,0xf7,0x89,0x56,0x8f,0xf9,0xc4,0xf8,0xc6, + 0x2d,0x7c,0x5b,0x4,0xfc,0x81,0x9e,0xc9,0x62,0x49,0xc1,0x5d,0x12,0xaa,0x28,0xf2, + 0xb9,0x14,0xf4,0xda,0xe9,0xfd,0x5e,0xfa,0xe2,0x99,0xf5,0xbe,0xf,0xdf,0x5c,0xc2, + 0xdc,0xae,0x17,0x9c,0xb3,0xca,0x77,0xe8,0xb1,0x4f,0x3c,0x3d,0xd8,0x3d,0x6d,0xd3, + 0x52,0x43,0xbe,0x53,0x8c,0x8b,0xc1,0xae,0xf9,0xe5,0x2f,0x9e,0x59,0xef,0x7d,0xea, + 0xe6,0xb2,0x33,0x9,0x10,0x94,0x10,0x8d,0xba,0xa4,0x38,0xb0,0xde,0xc6,0x99,0x24, + 0x1d,0x6a,0xe8,0xbd,0xef,0x6d,0xf9,0x6d,0xdc,0xff,0x97,0xff,0xe4,0x68,0xbd,0xef, + 0xa9,0x9b,0x8b,0xd,0xb7,0x35,0x4f,0xf8,0xde,0x2e,0x2e,0xef,0x11,0x35,0xee,0x1, + 0xe5,0xab,0x33,0x26,0xd7,0x24,0x7e,0xcf,0xe0,0x30,0xa5,0x61,0x4b,0x95,0xdd,0x1a, + 0x84,0x4e,0x28,0xdb,0xf6,0x6d,0xee,0xfd,0xf0,0xf1,0x72,0xef,0x53,0xc7,0xb,0x8b, + 0x71,0xdc,0xfb,0xd4,0xf1,0xf2,0xf2,0x9f,0x9c,0x5e,0xe3,0x7b,0xf0,0xd,0x90,0x99, + 0x58,0xe0,0xf0,0xe9,0xdc,0xc3,0x87,0x7a,0x13,0xcd,0x6e,0x11,0x66,0x23,0x23,0x7b, + 0xa7,0xec,0x36,0xa2,0x24,0x53,0x45,0xc7,0xdf,0x87,0xee,0x69,0x14,0x74,0xe6,0xc, + 0x92,0x4a,0x9f,0x97,0xbf,0x74,0x7a,0xbd,0xf7,0xc3,0xb7,0x16,0x44,0x87,0xa5,0xfa, + 0x9d,0xef,0xfd,0xf0,0xad,0xe5,0xbe,0xf,0xdf,0x1a,0x73,0x61,0x20,0x65,0xa0,0x7e, + 0x0,0xed,0x3d,0x3,0xed,0xc8,0x61,0x18,0x33,0x28,0x42,0x34,0x1b,0xcd,0x9d,0xd4, + 0x2b,0x9c,0xaa,0xf3,0x4e,0xf3,0x41,0xcf,0x3a,0xdb,0xf7,0x99,0xce,0x90,0x48,0x89, + 0xd0,0xdd,0xec,0xe5,0x3f,0x39,0xbd,0xbe,0xfc,0x27,0xfb,0x5c,0x4e,0xaa,0xa9,0x68, + 0x1e,0xed,0x81,0xf,0x1f,0x6d,0x31,0x3d,0x57,0xce,0x8,0x5a,0xf7,0x2e,0xca,0x4d, + 0x9a,0x75,0xdf,0xfb,0xd4,0xad,0xe5,0xe5,0x2f,0x9d,0x59,0x25,0xeb,0x4e,0xfc,0xda, + 0xa0,0xd6,0x57,0x2f,0xfa,0xe5,0x2f,0x9d,0x5e,0x5f,0xfe,0xd2,0x99,0x95,0xf7,0x10, + 0xaf,0x1f,0xee,0xeb,0x72,0x75,0x78,0xef,0x87,0x6f,0x2e,0xfb,0x73,0x9f,0x14,0x89, + 0xa1,0x3a,0xe3,0xca,0x78,0xb4,0x33,0x5d,0x59,0xc3,0x98,0x1,0xb0,0xdc,0xee,0x7d, + 0xea,0xd6,0x72,0xef,0x53,0xb7,0x96,0x7b,0x7e,0xe5,0xd6,0x22,0xad,0x40,0x41,0xad, + 0xcf,0x5a,0xed,0x48,0x2a,0x66,0xdc,0x5d,0x6a,0xf7,0xf1,0xe5,0x2f,0x9f,0xd9,0xbf, + 0x3f,0x54,0xed,0x8c,0x2b,0xae,0x7b,0x3e,0x7c,0x73,0x11,0xb1,0x1f,0x64,0x2f,0x1, + 0xa4,0xb9,0xa6,0x9b,0x4f,0x1d,0x6c,0x98,0xae,0x13,0x9c,0xfc,0xcc,0x4,0x54,0xc8, + 0x7e,0x7,0x32,0xbb,0x9e,0x74,0xae,0xe,0xb5,0x77,0x63,0x95,0xee,0xa1,0x4d,0x7f, + 0xcf,0x87,0x6f,0x2e,0x2f,0x7f,0x79,0x7f,0xfe,0x2f,0x7f,0xe9,0xcc,0xbe,0x97,0xe5, + 0x31,0x14,0x5,0xc6,0xb2,0xd3,0x2c,0x7f,0x5f,0xc7,0x5c,0x0,0x8a,0x5,0xb0,0x22, + 0x17,0x3d,0xca,0x84,0x42,0x2a,0x82,0x9,0x9b,0xc1,0x26,0xb6,0xb0,0x1c,0xc0,0x46, + 0xd1,0x73,0xcf,0x87,0x6f,0x2e,0xf7,0x7c,0xf8,0xe6,0xd2,0x70,0x16,0xb1,0xdb,0x15, + 0xbb,0x4d,0xc3,0xe1,0xce,0xc8,0x4b,0x1d,0x22,0x89,0xfd,0xf2,0x97,0x8f,0xd6,0x7b, + 0x7f,0xe5,0xe6,0xa2,0x6e,0x9d,0x10,0xbb,0x7b,0x90,0x3f,0xc7,0xf0,0x11,0xf1,0x20, + 0x66,0x94,0xad,0x5b,0x3b,0xa0,0xb7,0x32,0xa2,0x22,0xa6,0xa7,0x73,0xf9,0xe1,0xdd, + 0x4f,0x20,0x56,0xf0,0x2c,0xb5,0xb,0x76,0x49,0x63,0xdc,0x54,0x64,0x1b,0x45,0xe6, + 0x4b,0xc3,0x4f,0xd4,0xa4,0xe6,0xe5,0x2f,0x9f,0x59,0xef,0xf9,0x95,0x9b,0x4b,0xee, + 0xac,0x22,0x81,0x33,0x7b,0xec,0x1,0x88,0x9d,0xe1,0xfd,0xfe,0xb7,0xe7,0x53,0x0, + 0xd8,0x3d,0xbf,0x72,0xbc,0xdc,0xf3,0x2b,0x15,0xa9,0x47,0xa,0x6e,0xa9,0xea,0x63, + 0x6a,0xb,0x73,0xc9,0x2d,0xd2,0xcc,0x77,0x50,0x4,0x28,0xe8,0x61,0x62,0x59,0xca, + 0xfc,0x3f,0x31,0x41,0xa8,0xd9,0xd3,0x3d,0x1f,0x3a,0x5e,0x5e,0xfd,0xf2,0xe9,0xf5, + 0x95,0x2f,0x9d,0x5e,0xef,0xfd,0xd0,0xbe,0x19,0x80,0x5c,0xf1,0x7a,0x68,0x49,0x2, + 0x19,0x2d,0x98,0xda,0xcf,0xe4,0xf9,0xcd,0x26,0x19,0x7d,0x91,0x5,0xa4,0x7c,0xab, + 0x10,0x99,0x43,0xd8,0xce,0x86,0x57,0xbe,0x74,0x7a,0xdd,0xf,0x45,0x48,0x45,0xc7, + 0xd5,0x57,0x43,0x20,0x8f,0xeb,0x8d,0x2d,0x2e,0x4c,0xb5,0x85,0x65,0x1e,0x43,0xaa, + 0x74,0x9,0xbd,0x1d,0xba,0x29,0xfb,0xe7,0xb8,0xa8,0x54,0xbe,0xf2,0xe5,0xd3,0xeb, + 0x2b,0x5f,0xde,0xc1,0x22,0xf1,0xa1,0xe1,0x0,0x35,0x4f,0x1,0x8d,0x50,0x25,0x3a, + 0xb8,0x54,0x75,0x31,0xf3,0x57,0x4,0x71,0xe8,0x7a,0x0,0x59,0xf1,0xe,0xb1,0x72, + 0x9b,0x54,0x6d,0xe0,0x75,0xa7,0xf7,0xad,0xfd,0xef,0xa5,0xf,0xdd,0x5a,0xee,0xf9, + 0xd0,0x1e,0x28,0x3a,0xea,0x76,0xe6,0x46,0x47,0xa8,0xda,0x7b,0x3e,0x74,0x6b,0x79, + 0xe5,0xcb,0x67,0xd6,0x1e,0x30,0xa4,0x3,0xe4,0xd2,0xa1,0xba,0xa7,0xbe,0x7f,0x84, + 0x88,0xdd,0xf3,0xa1,0x9b,0xcb,0xab,0x5f,0xde,0x5b,0xc5,0x8c,0x17,0x81,0xdc,0x23, + 0x9f,0x56,0x87,0xaf,0x7c,0xe5,0xcc,0x7a,0xcf,0x87,0x6e,0x2e,0x1e,0x3a,0x2c,0x36, + 0x81,0xa1,0xa1,0x7e,0xd6,0x2b,0x5f,0x3e,0xb3,0x8a,0x42,0x58,0x7d,0xe9,0x7e,0x7d, + 0x5c,0xdd,0xcd,0x0,0xac,0xfb,0xf5,0xbc,0xf2,0xe5,0x33,0xeb,0xab,0x5f,0x3d,0xb3, + 0xde,0xf3,0x21,0x9d,0x55,0x37,0x65,0x3d,0xc0,0xe,0x6b,0x4d,0x87,0x4e,0x99,0x63, + 0x36,0x1b,0x1c,0x5d,0xe,0x7e,0x7f,0xa0,0xd8,0xab,0x5f,0x3e,0xaa,0x9f,0x5d,0xf, + 0x72,0x37,0xbb,0xe7,0x83,0xfb,0xf7,0xea,0x14,0xb4,0x6d,0x98,0x6e,0x8c,0x35,0xe, + 0xd9,0x7f,0x91,0xef,0x88,0xe8,0x74,0x7,0xc2,0x67,0x38,0x61,0x45,0xb6,0x20,0xb1, + 0xbd,0x85,0xc0,0xc6,0xad,0x75,0x20,0xb9,0xb7,0xb1,0xc4,0x6e,0xb4,0x11,0x35,0xea, + 0x70,0x22,0xae,0x7d,0x1b,0xe8,0x71,0x71,0xd,0x24,0x2c,0xc,0x77,0x21,0x1,0xef, + 0xa8,0x7d,0x98,0x9a,0x3,0xb5,0xd7,0xbc,0xf2,0x95,0xa3,0xb5,0xaf,0x79,0xa1,0xa7, + 0x41,0x81,0x8d,0x8,0x6e,0x94,0x5b,0x3,0x7a,0x46,0xb3,0xa3,0xd0,0xa1,0x60,0x0, + 0x6e,0xc0,0xe8,0xa8,0x83,0x25,0x72,0x87,0x35,0xe4,0x59,0x3d,0xb8,0xf1,0x59,0x6c, + 0xcc,0xcb,0x56,0x26,0x5,0x3f,0x97,0x57,0xbe,0x72,0xb4,0x5e,0xfa,0xe0,0x8d,0x25, + 0x9a,0xbe,0x48,0xdf,0x22,0x7a,0x5a,0xd0,0x5c,0x1c,0x80,0xbd,0xf2,0x95,0xa3,0xf5, + 0x95,0xaf,0x1c,0xad,0x9d,0x3e,0x6a,0xb0,0x57,0xbf,0x7a,0xb4,0xde,0xf3,0xc1,0x9b, + 0x8b,0x74,0x80,0xa1,0xb8,0x14,0xa6,0xd2,0xa9,0xc0,0xd9,0xe4,0xfc,0x9b,0xf1,0xbb, + 0xa0,0x9d,0x60,0x3d,0xeb,0x2,0xc6,0x49,0x1b,0x10,0xca,0x56,0xd9,0x88,0xc4,0x2b, + 0xdd,0x2f,0xb3,0xc2,0xe8,0x3a,0x27,0x8a,0xd8,0xa5,0xf,0x1d,0x2f,0xaf,0x7e,0xe5, + 0xf4,0x6a,0xe4,0xed,0x2a,0x63,0x1,0xec,0x9b,0xd2,0x23,0xc7,0xd1,0xb,0xad,0x4f, + 0x4,0xa1,0x96,0xf1,0xba,0x4b,0x1f,0xbc,0xb5,0xbc,0xfa,0xd5,0x33,0x2b,0x26,0xd5, + 0xaa,0xcc,0x85,0xa2,0xf7,0xb6,0xe9,0xec,0xeb,0xd5,0xaf,0xec,0x87,0x91,0xc3,0xed, + 0xd2,0x87,0x6e,0x2d,0x97,0x3e,0x38,0x2a,0xd6,0x99,0x94,0x5e,0x1a,0x3d,0x46,0x6d, + 0x60,0xcc,0xfc,0x6e,0xd9,0x64,0x4,0x76,0x4f,0xbd,0x76,0xb3,0x58,0x75,0xe4,0x6b, + 0x5,0xcd,0x80,0x58,0x75,0x69,0xd6,0xc6,0x9b,0xcd,0x6d,0x52,0xa5,0xd4,0x29,0x4c, + 0x9e,0xdd,0xd5,0x42,0x85,0x55,0x12,0x88,0x45,0x71,0xc0,0x19,0xb0,0x98,0x59,0xd8, + 0x9,0xa0,0x12,0x2a,0x82,0x66,0xea,0xf0,0xea,0x57,0xcf,0xac,0x97,0x3e,0xb8,0xdf, + 0xff,0x57,0xbf,0xca,0x15,0xad,0xa5,0xf9,0x7a,0xe0,0x3d,0x84,0xee,0xca,0x9c,0xd3, + 0x9c,0x31,0x1c,0xa1,0xaa,0xa9,0xef,0x7d,0xe9,0x83,0x37,0x97,0xd7,0xfe,0xf4,0xcc, + 0x2a,0x9d,0x84,0xfa,0xe6,0xaf,0xfe,0xe9,0x1e,0xbc,0x6c,0xe2,0xe3,0xce,0xa8,0xfc, + 0x34,0xcb,0xf4,0x3,0x1d,0x88,0x50,0xbd,0xb9,0x67,0x1b,0x4f,0xb1,0x9c,0xf4,0xda, + 0x16,0x8f,0x5e,0xcb,0x13,0xd5,0xb2,0xd7,0xbe,0x7a,0xb4,0x5e,0xfa,0xc0,0x1e,0xe8, + 0x10,0x5a,0xfc,0x8e,0xa8,0xd9,0x3f,0x28,0x79,0x16,0x66,0xf8,0x56,0xef,0xc9,0xa5, + 0x7a,0x58,0xb5,0xb7,0x69,0xf7,0x49,0x5b,0x96,0xaa,0xf9,0x9f,0xcc,0x76,0x22,0x6f, + 0xcb,0x70,0x70,0xfd,0x25,0x70,0x55,0x7d,0xdd,0xa5,0xf,0xdc,0x58,0x5e,0xfd,0xd3, + 0x33,0xab,0xd3,0xc8,0xe5,0xd5,0xf6,0x5d,0x79,0x16,0x4c,0xd5,0x1f,0x7c,0xfc,0x5e, + 0x3c,0x23,0x72,0x49,0x48,0x89,0x83,0x8d,0xcf,0xbc,0xf8,0x81,0x9b,0x4b,0x3,0xbb, + 0x39,0xa3,0xf3,0x91,0xd7,0xa6,0xb8,0x95,0x21,0xa3,0xd7,0xfb,0xe8,0xad,0x1d,0xea, + 0xbb,0x9a,0x87,0x5d,0xfa,0xc0,0xcd,0xe5,0xd2,0x7,0x6e,0x2e,0x40,0xbe,0xac,0x51, + 0x59,0x5,0x8f,0xee,0x48,0x85,0x75,0x92,0x84,0x16,0x5,0xb3,0xf1,0x9a,0x8b,0xf5, + 0xfb,0xe8,0x39,0x16,0xf7,0x4d,0xc0,0xbe,0x4,0x5c,0x38,0x77,0x12,0x1,0x4d,0x80, + 0x7c,0xe2,0x9c,0x38,0xf7,0x8c,0xa0,0xf3,0x86,0xc0,0xa5,0xaf,0x7d,0xad,0x3d,0x4f, + 0x44,0xd1,0x43,0xea,0x98,0x22,0x30,0x67,0x44,0x14,0xb2,0x1f,0x4f,0x17,0x3f,0x70, + 0x63,0x79,0xed,0x6b,0x47,0xab,0x73,0x3b,0xdc,0x99,0x21,0x13,0x74,0x9a,0xb8,0x13, + 0xd6,0xf4,0xd6,0x2b,0xcd,0xc9,0x49,0xc7,0x7,0x18,0xe0,0xc7,0x59,0xa7,0xaf,0xe3, + 0xbb,0x10,0xdd,0xda,0x4c,0x4,0xb2,0x5c,0xb0,0xf,0x93,0xb3,0x8a,0x71,0x60,0xd2, + 0xd5,0xf4,0x84,0x45,0x9a,0x9e,0x2b,0xce,0x9c,0x8,0x97,0x6e,0x65,0x14,0x2c,0xaa, + 0x2d,0x77,0x24,0x14,0xaf,0xa0,0x6e,0xe1,0x82,0xa6,0xe4,0xaa,0xe9,0xe2,0xfb,0x6f, + 0x2e,0x97,0xde,0x7f,0x4b,0x85,0xed,0x31,0x71,0x85,0x4f,0xb3,0xad,0xf8,0x7e,0x1, + 0x99,0xb9,0x99,0x5d,0x7c,0xff,0xad,0x71,0xe0,0xf4,0xaa,0x3d,0xcf,0xd8,0xb8,0x2, + 0x66,0xd4,0xe6,0x54,0x27,0x37,0x54,0x27,0x11,0x1d,0x99,0xe,0xd8,0x38,0xfb,0x6, + 0x26,0x9c,0xd5,0x90,0x15,0x86,0xeb,0xe0,0x6c,0xcf,0x2d,0x54,0x16,0x50,0xca,0x18, + 0x6b,0x3,0xb7,0xc3,0xe4,0xb5,0xaf,0x9d,0x59,0x2f,0xbe,0x7f,0xef,0x4e,0x5c,0x7c, + 0xff,0xcd,0xe5,0xe2,0xfb,0xf7,0x59,0xcd,0xc5,0x27,0x6f,0x2d,0xaf,0x7d,0xed,0xcc, + 0xfa,0xda,0x9f,0x9e,0x59,0x2f,0xbe,0x7f,0x47,0x6d,0xb6,0xdf,0xb9,0xf2,0xa7,0x67, + 0xd6,0xd7,0xbe,0x76,0xa6,0x8b,0xf5,0x70,0x4b,0xd6,0xa3,0x78,0xc,0x2,0xff,0x37, + 0x8d,0x1f,0xf4,0xd1,0xe9,0xcc,0xae,0x18,0x6b,0x14,0xcb,0x6c,0x6a,0x53,0x77,0x2d, + 0x8f,0x8,0x50,0xb,0xc8,0x5b,0x57,0xa7,0xa2,0xe,0x68,0x62,0x24,0x35,0x2,0xf5, + 0x11,0x5a,0x1d,0xb6,0xef,0x6d,0xb6,0x1f,0x2a,0x17,0x9f,0xac,0xf7,0x85,0xbc,0xb6, + 0x2d,0x56,0x7b,0x66,0x76,0xf1,0xfd,0x37,0xfa,0x5a,0x6b,0x2d,0xd9,0xd7,0xbe,0x76, + 0x34,0xee,0x2b,0xeb,0xd8,0xcb,0xac,0x4b,0x85,0x56,0xfa,0x67,0x4d,0x12,0x21,0x5e, + 0x7,0x17,0x9f,0xbc,0xb9,0xbc,0xf6,0xb5,0xa3,0x35,0x96,0xbc,0xdc,0x3d,0x70,0xf8, + 0xfe,0xec,0x9f,0xbc,0xb9,0xc4,0x5a,0x84,0x7f,0x7f,0x7c,0xf,0x74,0x4a,0x94,0xcc, + 0x24,0xd3,0x6c,0xe,0xa4,0x52,0x45,0x15,0x60,0xc0,0x7c,0x5c,0xf9,0xda,0xd1,0x7a, + 0xf1,0xc9,0x1b,0x4b,0xc4,0x7a,0xb0,0xaa,0x24,0x42,0x7,0x3,0x86,0x9d,0x87,0xbd, + 0x11,0xe,0x23,0xbc,0x3f,0x63,0x1a,0xc6,0x8,0xcc,0xc3,0xfd,0xb6,0xde,0x4a,0xbd, + 0xf2,0xb5,0xa3,0xf5,0xc2,0xfb,0x6f,0x2c,0xc3,0x1,0x70,0x82,0x9d,0x11,0x7b,0x65, + 0x24,0x59,0xd2,0xbe,0x2e,0x8b,0x56,0x8e,0x7c,0xef,0xcc,0xcc,0xae,0x7c,0xed,0xec, + 0xbe,0x66,0x8c,0xe8,0x5b,0x16,0xa8,0x5e,0x66,0x76,0xe1,0xc9,0x9b,0xcb,0x78,0xdd, + 0x58,0xbb,0x91,0xdd,0x22,0x98,0x98,0xfe,0xfe,0x37,0x16,0x1,0x71,0x21,0xe8,0xef, + 0x6d,0xa3,0x20,0x16,0x87,0xc3,0x50,0x1,0x47,0x2c,0xb,0x8c,0x67,0xab,0x7a,0xac, + 0x5d,0x78,0xdf,0x8d,0xe5,0xe2,0x93,0x37,0x16,0xf,0x63,0x22,0xdf,0xcc,0x5e,0xfb, + 0xb3,0xb3,0xeb,0x85,0x27,0x47,0xc5,0x6b,0x6e,0x76,0xf1,0xc9,0xfd,0xf5,0xdd,0xb6, + 0xd6,0x6,0xaf,0xff,0xc2,0x93,0x37,0x96,0x2b,0x5f,0x3b,0xbb,0x46,0x6c,0x4a,0x77, + 0xf,0x74,0xea,0x52,0x32,0xd6,0xc7,0x60,0x17,0x9f,0xbc,0xb1,0x5c,0x78,0xf2,0xc6, + 0xd2,0x29,0x78,0xe,0xc1,0x43,0x88,0xa6,0x3a,0x75,0x39,0xf4,0xc,0x83,0x5d,0xf9, + 0xb3,0xa3,0xf5,0xc2,0xfb,0xae,0x2f,0x60,0x45,0xbb,0xf6,0x19,0xef,0xbb,0xb1,0x5c, + 0xf9,0xb3,0xa3,0xb5,0xcf,0x9c,0xb7,0xf1,0xe4,0xe4,0x79,0xbb,0x3a,0x21,0x72,0xb5, + 0x8c,0xc0,0x3a,0x19,0xc8,0x4b,0xc5,0x25,0xc0,0x42,0x97,0x1,0xba,0x8f,0xcd,0x2, + 0x46,0x29,0x3,0x15,0x52,0x5c,0x51,0xd5,0x45,0x24,0xd1,0xa8,0xfd,0xfb,0x9d,0x5d, + 0x65,0x5d,0xd2,0x5e,0x2e,0x17,0xde,0x7f,0x73,0xb9,0xf2,0x67,0x67,0x56,0xf7,0x19, + 0xdf,0xd8,0x3,0xea,0x4f,0x3f,0x20,0x2a,0x70,0x49,0x7d,0x7,0xe5,0xd0,0xc5,0x6b, + 0xe3,0x19,0x46,0x7,0xd,0x4c,0xdc,0xd1,0xda,0x7f,0xae,0x7c,0xfd,0xcc,0x7a,0xe1, + 0xc9,0x9b,0xcb,0x85,0x27,0xf7,0xeb,0x15,0xeb,0x51,0xaa,0x6c,0xae,0xfc,0xd9,0xfe, + 0x3a,0x51,0x83,0x9b,0x18,0x11,0xcb,0xe7,0x7b,0x0,0xe6,0x79,0x91,0xb9,0xa0,0x23, + 0xf0,0x90,0x39,0x93,0xf,0xd5,0x7c,0xe4,0xe5,0xc6,0x19,0x87,0x20,0x88,0x5d,0x79, + 0x9e,0xdc,0x79,0x60,0xd,0x7c,0x8f,0xfe,0xbd,0xa6,0x33,0x1e,0x56,0x8a,0xea,0x12, + 0xb2,0xac,0x7d,0xdc,0x9e,0x1,0x65,0x88,0xea,0x65,0xa1,0xc8,0x5e,0xb8,0x89,0x61, + 0xcf,0x18,0x77,0xc1,0xae,0x7e,0xfd,0xcc,0x7a,0xe1,0x7d,0x37,0x16,0x99,0x7f,0x77, + 0x69,0x4a,0xb,0x33,0x55,0x62,0x33,0xc8,0xdc,0xdc,0xc9,0xb5,0x2e,0x57,0x7e,0xdd, + 0xce,0x91,0xdb,0x54,0x9e,0xbd,0xa6,0xdd,0x98,0xd1,0x10,0x55,0xbe,0xdc,0xae,0x7c, + 0xfd,0x68,0xbd,0xf2,0xf5,0xa3,0x35,0xfb,0x60,0x7b,0xaa,0x30,0x50,0x32,0xf0,0x8b, + 0xf9,0xd8,0x43,0xc1,0x30,0xce,0x1e,0x5d,0x90,0xea,0x1e,0x29,0x9d,0x54,0x29,0xba, + 0x9b,0x9d,0x7f,0xdf,0x8d,0xe5,0xca,0xd7,0x8f,0x56,0x4b,0x5c,0x7f,0x4,0x6,0x1, + 0x3d,0x5b,0xd6,0x7b,0x2a,0x10,0x46,0xc3,0x95,0xaf,0x1f,0xad,0xe7,0xdf,0x77,0x63, + 0x69,0xef,0xd1,0xde,0x7f,0xd6,0xb1,0x69,0xf7,0xfb,0xc2,0xfb,0x6e,0x2c,0x57,0x9e, + 0x3e,0x5a,0x85,0x65,0x30,0x59,0xeb,0xbc,0x86,0xbb,0xa7,0x76,0x74,0x76,0xe3,0xce, + 0x45,0x58,0xdf,0x40,0xc6,0xcb,0x78,0x30,0x9b,0xe0,0x59,0xc1,0xd5,0xa7,0x8f,0xd6, + 0xab,0x4f,0x1f,0xad,0xfd,0x59,0xa5,0x75,0x3f,0x96,0xf4,0xd5,0xaf,0x1f,0xad,0xe7, + 0xdf,0x7b,0xa3,0x8b,0x30,0xc1,0x61,0x17,0xde,0x7b,0x63,0x39,0xff,0xbe,0x1b,0xb, + 0xe3,0x71,0x2f,0xbc,0xef,0xc6,0x72,0xf5,0xe9,0xb3,0xab,0xa8,0xc2,0x19,0xf6,0x7b, + 0xd0,0x9f,0x3,0x9,0xb6,0x72,0xb1,0xcf,0x37,0x7a,0x86,0x45,0xc1,0x18,0x3f,0xca, + 0x3e,0x74,0xe5,0x1d,0xb3,0xa8,0xca,0xd5,0xa7,0xeb,0x75,0x1b,0x39,0x29,0xb6,0xbd, + 0x1,0xed,0x1c,0xd,0x7e,0xf4,0xf0,0x20,0x38,0xff,0xbe,0xeb,0xcb,0xd5,0xaf,0x9f, + 0x5d,0xaf,0x7e,0xfd,0x68,0xec,0xc3,0xfa,0xe5,0x3c,0x3a,0x92,0x41,0xcf,0x23,0x46, + 0x39,0x9d,0x7f,0xef,0xf5,0xe5,0xca,0xd7,0x8f,0x56,0x84,0xbd,0xd0,0xaa,0xcd,0x2b, + 0x4f,0x9f,0x5d,0xcf,0xbf,0xf7,0xfa,0x22,0x3a,0x19,0xd4,0xd5,0xc8,0x9d,0x1,0xad, + 0x46,0x79,0xee,0x1d,0xf7,0x13,0x3b,0xc7,0xf9,0x84,0xf5,0x30,0xe,0x3f,0xf,0x7c, + 0x70,0xad,0x66,0x93,0x16,0x4a,0x54,0x8,0x9d,0xe1,0xa0,0x8,0xa1,0x1f,0xb9,0x75, + 0x33,0x26,0xc6,0xa1,0x4e,0xa5,0x4d,0x3a,0x2b,0x66,0x99,0xa1,0xf0,0xd6,0x5e,0x6a, + 0x25,0x55,0xf6,0x57,0x9f,0x3e,0xb7,0xdf,0xf7,0x49,0x1f,0xd3,0x42,0x47,0xa6,0x5d, + 0xff,0xd5,0xa7,0xcf,0xae,0x17,0xea,0x9a,0x3a,0xb9,0xd5,0xc,0x61,0x23,0x85,0x36, + 0x87,0xd9,0xb6,0x69,0x39,0xbf,0x31,0x3f,0xae,0xbe,0xfb,0xc6,0x73,0x52,0x9e,0x61, + 0x74,0x51,0x2,0x6,0xd7,0xf9,0x58,0x9b,0xfd,0xfd,0x4c,0xad,0x42,0x6b,0xdb,0xf0, + 0xea,0xd3,0x67,0xd6,0x61,0x86,0x32,0xe8,0x6f,0xdb,0x16,0x9f,0xdf,0xbe,0xc8,0xda, + 0xcf,0xdb,0x7b,0x5e,0x7d,0xfa,0xcc,0xa,0xf6,0xa0,0xed,0x9b,0x64,0xf0,0x78,0xb7, + 0x2d,0xd3,0x24,0x44,0x85,0xbd,0xdf,0x13,0xfe,0xae,0x90,0x3f,0x77,0x27,0xb6,0xfe, + 0x7e,0xae,0xf7,0xa5,0x5e,0xe3,0x46,0x1c,0xdd,0x6d,0x53,0x9a,0xd4,0x90,0x30,0xac, + 0xaf,0x73,0xb,0x42,0x2f,0xfb,0x7b,0x9f,0x7d,0xcf,0xcd,0xe5,0xda,0xd3,0xfb,0x1, + 0x74,0xee,0xbd,0x37,0x96,0x8d,0x78,0xb8,0xdb,0x96,0x1a,0xd1,0x41,0xc0,0x87,0x94, + 0x95,0xd8,0x7b,0x7b,0x32,0x18,0xed,0x46,0x66,0x51,0xcf,0x99,0x7a,0x61,0xdb,0x16, + 0x71,0x73,0xfb,0xf5,0xf2,0xf3,0xd9,0xba,0x62,0x54,0xfb,0xfe,0xfb,0x35,0xf1,0x7d, + 0x4,0x87,0x43,0xa,0xae,0x1b,0xb1,0x1f,0xda,0x72,0x93,0xb5,0xd6,0x4d,0x6b,0xf4, + 0xf9,0x5b,0x62,0x89,0x1e,0xf0,0x4f,0x71,0xbe,0xa6,0xb2,0xff,0xbe,0xfa,0xc5,0xe8, + 0xf7,0xe4,0xf5,0xef,0x7c,0xbf,0x8b,0xe8,0x95,0x6f,0x1b,0x77,0x3d,0xdc,0xa2,0x21, + 0xd0,0x35,0xa,0xa2,0x9d,0x6d,0x1e,0xf6,0xc4,0xd9,0xf7,0xdc,0x58,0xae,0x3d,0x7d, + 0xb4,0xb6,0xdb,0xbd,0x6d,0x39,0xd1,0xe6,0xfb,0x29,0x9f,0x5b,0xaf,0x19,0x30,0xbb, + 0xf6,0xe7,0x47,0xeb,0xb9,0xf7,0xec,0x9b,0xbc,0x7d,0xee,0xb9,0xf7,0x5c,0x5f,0x5e, + 0xff,0xe6,0xd1,0xba,0x6d,0x62,0xd4,0x34,0xf6,0x3f,0x60,0xe7,0xde,0x7d,0xbd,0xaf, + 0xb3,0xfd,0x75,0xaa,0xaf,0xde,0xee,0x79,0x5b,0x4b,0x7c,0x7e,0xb4,0xb8,0xb3,0xb1, + 0x46,0x35,0x9d,0x15,0xde,0x5e,0x67,0xea,0x84,0x6,0x52,0x1e,0x13,0xda,0xab,0x85, + 0xfb,0xdd,0x82,0xa3,0xeb,0x1a,0x33,0xc0,0xce,0xbe,0xfb,0xfa,0x72,0xed,0xe9,0xb3, + 0xab,0xc3,0xec,0xdc,0x7b,0xae,0x2f,0xd7,0xbf,0x79,0x76,0xb5,0x70,0x36,0x80,0x9c, + 0xa9,0xf4,0x59,0x8d,0x56,0xf5,0xb6,0xa9,0xa7,0xc5,0xb9,0x77,0x5f,0x5f,0x5a,0xb2, + 0xbd,0xbf,0x27,0xaf,0x7f,0x95,0x9c,0xe6,0xeb,0x94,0xbf,0x1b,0x44,0xff,0x7c,0xdb, + 0xe6,0x8d,0xc3,0x76,0x56,0x18,0xf2,0x59,0xd1,0xf6,0x33,0xff,0xec,0xda,0x9f,0x9f, + 0x5d,0xf9,0x3d,0xb6,0x6d,0x4e,0xfc,0xde,0xb6,0x8c,0x9,0xd8,0xa8,0xe3,0xb9,0x6d, + 0x26,0x95,0x68,0xbb,0x37,0x7a,0xae,0x8c,0x9f,0x95,0xfe,0xfb,0x63,0x3d,0x42,0x79, + 0xca,0x61,0x4f,0x82,0x62,0xc,0xff,0xb4,0xd8,0xd9,0x77,0xbf,0xbe,0x5c,0xfb,0xf3, + 0x73,0xab,0xb5,0x67,0xc2,0x2d,0x7f,0x7,0x3d,0x37,0x13,0xbd,0xfe,0x2d,0xfa,0xd, + 0x84,0x3d,0xdb,0xe2,0xc7,0x46,0x9d,0x1d,0xf9,0xfc,0x34,0xde,0x1c,0x31,0x1,0xfd, + 0x73,0xa9,0x2b,0xe8,0x3e,0xcc,0xb4,0x90,0x83,0xeb,0x46,0x1e,0x24,0xed,0x7e,0x74, + 0xed,0x75,0xf,0xbe,0x2,0x74,0xd1,0x1c,0x57,0xdb,0xe7,0x8f,0x7b,0x8b,0x2e,0x9c, + 0xd5,0xf6,0xcb,0x46,0xba,0xfd,0xe,0xfd,0x5d,0x0,0x56,0x18,0x71,0x3a,0xe6,0x4b, + 0x34,0xef,0x41,0xe6,0x19,0x1b,0xbf,0xc6,0x95,0xd6,0xa4,0x7a,0xe5,0xec,0x86,0x45, + 0xdc,0x69,0xa9,0x42,0x8c,0xac,0x16,0xb3,0x9b,0x9a,0xb1,0xec,0x2c,0x55,0xee,0xc2, + 0x88,0x4f,0x8e,0x49,0xc1,0x65,0x3a,0x30,0x78,0xf8,0xfb,0x20,0xc8,0x74,0x5a,0xe4, + 0x13,0x17,0x48,0x95,0xac,0xfa,0xbd,0x3a,0x73,0x85,0x5,0xff,0xed,0x9,0xc7,0x98, + 0x3b,0xf,0x2c,0xec,0x71,0xf6,0xdd,0x37,0x96,0xd7,0xbf,0x71,0xb4,0x36,0x66,0x80, + 0x9b,0xbd,0xf5,0xcc,0x8a,0x90,0xa5,0xd7,0xbf,0x71,0xb4,0xbe,0xfe,0xcd,0xa3,0x55, + 0x2d,0x1b,0xf9,0x2f,0x85,0x2a,0xd8,0x32,0x5,0x2d,0x47,0x65,0x32,0x16,0x58,0xf1, + 0xd0,0x22,0x17,0x9e,0x79,0x98,0x7d,0xb7,0xff,0xbf,0xfe,0x8d,0xa3,0xf5,0xe8,0xdd, + 0x37,0x97,0xa3,0x77,0xdf,0x58,0xae,0x7f,0xe3,0x6c,0xf,0x50,0x8c,0xc5,0x90,0x39, + 0xb8,0x29,0x62,0xd4,0x44,0x6a,0x52,0x91,0xa3,0x7c,0x7f,0xce,0xbe,0xfb,0xc6,0x72, + 0xfd,0x1b,0x47,0xab,0x73,0xe2,0x21,0x60,0x25,0x4c,0x50,0xbc,0x34,0x67,0xb,0x15, + 0x95,0x9b,0x22,0x88,0xf3,0x8c,0x18,0xea,0x21,0x40,0x6a,0x60,0xce,0x3d,0x58,0xa1, + 0xaa,0x4,0x49,0x54,0x51,0xdc,0xc2,0x9c,0x8f,0xdb,0x40,0xa5,0xa4,0xc,0x7,0xaa, + 0x34,0x38,0xc1,0x72,0x4a,0x58,0xe3,0xba,0x8b,0xa,0x6d,0x67,0xdf,0x75,0x63,0xf, + 0x76,0xa1,0x9d,0x98,0xb8,0xbe,0xd0,0xaa,0x1b,0xc4,0x8,0x89,0x15,0x3a,0x98,0x65, + 0x11,0x79,0xb8,0xf5,0xff,0xaf,0x7f,0xf3,0xec,0x7a,0xf6,0x5d,0xd7,0x17,0xf7,0xc3, + 0x74,0xb8,0x43,0xe,0x75,0x71,0xbd,0x47,0xef,0x82,0xa3,0x77,0xd5,0x0,0x4e,0xbc, + 0xe8,0xa3,0x27,0xae,0x2f,0x47,0xed,0xf3,0xa4,0x6a,0x8a,0x8c,0x12,0x4b,0xdc,0xec, + 0xf6,0xd7,0xb3,0xef,0xba,0xbe,0x5c,0xff,0xd6,0xd9,0xf5,0xf5,0x6f,0x9c,0x9d,0x76, + 0x3c,0x10,0xd5,0xf9,0x82,0xd2,0x17,0xaf,0x19,0xee,0xc4,0x5c,0xff,0xe6,0xb9,0xf5, + 0xe8,0x5d,0x37,0x96,0x61,0xa7,0x81,0xfc,0xf9,0x36,0xab,0x12,0x3,0x93,0x3,0xb9, + 0x63,0x1a,0xef,0x63,0xbb,0x37,0x91,0xe7,0xcd,0x1d,0x26,0x27,0x4d,0xd3,0xa3,0x77, + 0x5d,0x5f,0xae,0x7f,0xeb,0xdc,0x6a,0x66,0x76,0xe3,0x5b,0xe7,0xd6,0xa3,0x77,0x5d, + 0xef,0xdd,0x9f,0xfe,0x5e,0x41,0x9b,0x61,0x9c,0xc9,0xae,0xbc,0x6e,0x62,0x5d,0x1c, + 0x3d,0xf1,0xfa,0x72,0xe3,0x5b,0xe1,0x3e,0x62,0xac,0x3b,0xb,0x5d,0x18,0x8b,0x9d, + 0x9f,0x60,0xfa,0x34,0x53,0x90,0xd4,0x9f,0xfb,0xe8,0xa,0x30,0x43,0xc7,0x10,0x18, + 0x21,0x15,0x34,0x7,0xdb,0x9f,0xcb,0x13,0xd7,0x97,0x84,0xdc,0xa7,0xa2,0x6b,0xac, + 0x1f,0x2,0x28,0xba,0x6a,0xf8,0x73,0xa7,0x4e,0x46,0x72,0x91,0x25,0xd2,0xf6,0x4a, + 0x60,0x8a,0xf0,0xd9,0xea,0x61,0xee,0x29,0xac,0x16,0xee,0x47,0xd6,0xcf,0x3f,0x79, + 0xe3,0x9b,0xb5,0xed,0xb2,0x8d,0x8a,0xe2,0xcc,0x13,0xfb,0x42,0xe6,0x42,0xd2,0xb7, + 0x1,0xe3,0xe8,0xa2,0xfd,0x9b,0x87,0xd6,0x73,0xcb,0x62,0x68,0xe5,0x14,0x3a,0x78, + 0x6a,0xf6,0x73,0xe6,0x89,0xeb,0xcb,0x8d,0x6f,0x9e,0x5d,0x59,0xb3,0xd9,0xcd,0x62, + 0x24,0x4b,0x4,0xfe,0xb6,0x20,0x9a,0xed,0x5e,0xef,0x44,0x6d,0x6e,0x47,0x4f,0xdc, + 0x58,0x6e,0x7c,0xeb,0xec,0xca,0xd9,0x3d,0xe8,0xa9,0xf4,0x36,0x32,0xfd,0xce,0x58, + 0x4,0x18,0xea,0x5f,0x3e,0xee,0xc1,0x8d,0x6f,0x9e,0x5d,0x7,0x72,0x9c,0xf4,0xc6, + 0x37,0x4f,0xe7,0xd1,0xb8,0x7f,0xfb,0xbf,0xdf,0xf8,0xf6,0xd9,0xf5,0xe8,0x89,0xeb, + 0xcb,0xcd,0x6f,0x9f,0x5d,0x7d,0xf3,0x81,0x89,0xd8,0x86,0xe4,0xfe,0xd1,0x13,0xaf, + 0x2f,0x66,0x66,0xfd,0x35,0x16,0xbc,0x94,0xea,0x8d,0xb9,0xfe,0xcd,0xa3,0x71,0x1d, + 0x70,0xbb,0xfe,0xad,0xa3,0x75,0x14,0x82,0xe4,0xf6,0x14,0x14,0x36,0x5c,0x12,0x2a, + 0x9f,0x54,0xef,0xae,0x6e,0x68,0xbd,0xcd,0x45,0x4f,0xd9,0x65,0xb0,0x50,0xf5,0x9, + 0xd4,0x7d,0x69,0xe0,0x3,0x5c,0xaa,0xab,0xf6,0x77,0xc6,0x1b,0x5c,0xff,0xd6,0xd9, + 0xf5,0xe8,0x89,0xd7,0x97,0x9b,0xdf,0x39,0xb7,0x32,0xb5,0x0,0xd4,0xe7,0x1a,0xf7, + 0x9a,0xda,0x86,0xdb,0xa8,0xe6,0xce,0x3c,0x5e,0xef,0xdb,0x77,0xce,0xad,0xfb,0x67, + 0x20,0xa1,0xaf,0xe1,0x10,0x1d,0xeb,0xd0,0x20,0xa3,0x6b,0x73,0x79,0x6f,0xf1,0x48, + 0xda,0x46,0xfb,0xa8,0x7f,0xe,0xe8,0xe7,0xf1,0x40,0xdf,0x2,0x67,0x79,0xa6,0xf8, + 0x74,0xe0,0x4f,0xbc,0xae,0x74,0x5e,0xea,0x49,0x3f,0x7d,0x5c,0x3b,0x64,0x2d,0x9f, + 0x79,0xfc,0xf5,0xe5,0x46,0x3d,0x8c,0xf5,0xfd,0xac,0xaf,0xe1,0xc0,0x5c,0xa3,0xf9, + 0xbd,0xeb,0xe7,0x39,0x3d,0x7,0x70,0x9f,0x92,0xd3,0xe2,0x32,0xd6,0xf3,0xe6,0xa4, + 0x5e,0xe6,0x52,0x3e,0xd,0x37,0x29,0xcf,0x94,0xc8,0x78,0x2d,0xd5,0xc6,0x97,0x1, + 0x3f,0xf1,0xf7,0x7a,0x72,0xbf,0xf9,0xb8,0x1f,0x54,0xf5,0xdc,0xf8,0xd6,0xd9,0x55, + 0x11,0x4c,0xfc,0x8c,0xe7,0x6b,0xb5,0x9d,0x94,0x72,0x2e,0x6c,0xc3,0xe5,0x8a,0x9f, + 0xed,0xd8,0xc3,0x34,0x2b,0x85,0xcb,0xf3,0x3b,0xf3,0xd8,0xb5,0xe5,0xc6,0xb7,0xce, + 0xaf,0x23,0x2b,0x83,0x3a,0xb9,0x6d,0x3,0xe1,0x3e,0x8c,0x6,0x61,0x7c,0xe,0xf0, + 0xb5,0x98,0xb9,0x9d,0x79,0xec,0xf5,0xe5,0xc6,0xb7,0xcf,0xaf,0xc6,0x14,0x2e,0x72, + 0x4f,0xdb,0xcf,0x19,0x75,0xbc,0xe3,0xe7,0xda,0xec,0x56,0xf9,0xe7,0xb2,0x9e,0xeb, + 0xf7,0xef,0xb4,0xb9,0xf6,0x5d,0x1d,0xb4,0x7e,0x40,0xd7,0x5f,0xbf,0x27,0x5d,0x13, + 0xaf,0x3d,0xee,0x4c,0xc8,0x75,0xb0,0xbb,0xdc,0x46,0x31,0x65,0x53,0x5b,0x9d,0xd3, + 0x8f,0x5f,0x5b,0x6e,0x7c,0xfb,0xdc,0x9a,0x19,0x84,0xba,0x7,0x3c,0xad,0xf1,0x51, + 0x68,0xdc,0xfc,0xf6,0xb9,0xf5,0xcc,0x63,0xd7,0x96,0x5b,0xdf,0x39,0x2f,0xe7,0xf0, + 0xc0,0x25,0xe8,0xf9,0xd1,0xd6,0x49,0xfb,0x7e,0x51,0x89,0x7c,0x8c,0x58,0xb4,0xc3, + 0x36,0x3b,0xe3,0x6d,0x42,0xd7,0x16,0xe6,0xad,0x9b,0xec,0xef,0xb8,0x97,0x4e,0x3f, + 0x76,0x6d,0x3f,0xe7,0x9e,0x39,0xbf,0x82,0x62,0xae,0x0,0x4,0x6d,0x9c,0x3d,0xde, + 0x71,0xef,0x9c,0x1d,0x98,0xea,0xea,0x3a,0xc9,0x8e,0x5a,0x45,0xb5,0x3,0xc1,0xb5, + 0x4a,0x0,0x5e,0xb0,0x33,0x8f,0x5f,0x5f,0xce,0x3c,0x7e,0x7d,0x39,0xfd,0xd8,0xf5, + 0x45,0xc6,0x33,0x6e,0x76,0xfa,0xf1,0xeb,0xcb,0xcd,0xef,0xd4,0xc0,0xeb,0x96,0xb5, + 0x78,0x3,0xd7,0xcc,0xdd,0x72,0x59,0x6a,0xc1,0xe0,0x85,0x50,0xcb,0xad,0xf5,0xa3, + 0x6d,0xd7,0x71,0x6d,0xed,0x56,0xdc,0xfc,0xf6,0xd9,0xf5,0xf4,0x63,0xd7,0x17,0x76, + 0xfa,0x3d,0xf3,0xd8,0xf5,0xe5,0xf4,0xe3,0x75,0x6e,0x24,0xf3,0x2f,0x97,0xea,0x2b, + 0x3a,0x99,0xf5,0x39,0x6e,0x33,0xbe,0xf7,0x10,0xec,0x68,0x7e,0x79,0xf3,0xdb,0xe7, + 0xd6,0xd3,0x8f,0x5f,0x5f,0x58,0x83,0x5c,0x54,0xaa,0x3c,0x97,0xcf,0x2c,0x19,0x18, + 0x69,0x2b,0xd1,0xc,0x2e,0x4d,0x76,0x83,0xf,0xe9,0x18,0x13,0x18,0xd1,0xfc,0xa2, + 0xc4,0x61,0x18,0xb,0xf0,0x46,0x8d,0x15,0x53,0xe0,0x8f,0x4f,0xb1,0x4,0xf1,0xec, + 0x3e,0x34,0x9f,0x42,0xa9,0xeb,0x83,0x83,0xbd,0x4d,0xbb,0x1c,0xd2,0x95,0x29,0x76, + 0xc0,0x29,0x63,0x96,0x18,0x46,0xde,0x6e,0x51,0x6d,0x0,0x20,0x75,0x1c,0x9a,0xfe, + 0x3f,0x92,0x6b,0x9d,0xfd,0x57,0xcc,0xf5,0xaa,0x7e,0xd3,0x8c,0xf3,0x15,0xbe,0xff, + 0x4c,0xcb,0xf9,0xd6,0x77,0xce,0xaf,0xa7,0x1f,0x7b,0x7d,0x61,0x36,0x82,0xfa,0x1f, + 0xec,0x9f,0x7b,0xfa,0xb1,0xd7,0x97,0x9b,0xcf,0x9c,0x5f,0xed,0x80,0x62,0xa1,0x1, + 0x76,0xf3,0x3b,0xe7,0xd7,0x5b,0xcf,0x9c,0x5f,0x95,0xf4,0xe1,0x72,0x3f,0x66,0xda, + 0xb,0xc,0xde,0x64,0xd3,0x8e,0x53,0x8f,0x5d,0x5b,0x6e,0x3e,0x73,0x6e,0x45,0xa8, + 0x68,0xa4,0xad,0x48,0x3c,0xe1,0xac,0xe9,0x3f,0xf7,0x37,0x70,0x11,0x8a,0xf1,0xa4, + 0xa0,0xe5,0x96,0xd1,0xd1,0x5d,0x9a,0x93,0xab,0xaf,0xc0,0x5f,0xee,0x1a,0xe,0xae, + 0x7b,0x98,0x7,0x40,0x8c,0x14,0x67,0xf4,0x76,0xdb,0xd3,0xa7,0x1f,0xbb,0xb6,0xdc, + 0x7c,0xe6,0x7c,0xaf,0x78,0x51,0x37,0x44,0x7b,0xe,0x37,0x9f,0x39,0xbf,0x9e,0x7e, + 0xec,0xda,0xa2,0x1c,0x77,0xd6,0x34,0xa7,0xe,0xa5,0x8f,0xaa,0xf,0xcc,0x50,0x48, + 0xba,0x8,0x66,0xa7,0x1f,0x7d,0x7d,0xe9,0xcf,0x8e,0xf9,0xcf,0x30,0x59,0x7,0x6e, + 0x21,0x51,0xab,0xd7,0x71,0xf3,0x99,0xf3,0xeb,0xa9,0x47,0xaf,0x2d,0xe2,0xfd,0x0, + 0xe5,0x91,0x9f,0x7e,0xf4,0x9a,0xae,0x21,0x1b,0xdf,0xe7,0xf4,0xa3,0xd7,0xf6,0xcf, + 0xaf,0x5d,0xbe,0x29,0xbb,0x21,0x11,0xf,0xf6,0x37,0x39,0x55,0xdf,0xd7,0xd,0x72, + 0x1d,0x6d,0x5f,0x79,0xd9,0x9f,0xd1,0xcd,0x67,0x2e,0xac,0xa7,0x1f,0xbd,0x26,0xa, + 0x8d,0x6a,0x87,0x3c,0x40,0x7d,0x37,0x9f,0x39,0xbf,0x9e,0x7e,0xf4,0xda,0x12,0x37, + 0x7c,0x2b,0xf8,0x24,0x0,0xfb,0xbe,0x56,0x6f,0x3d,0x73,0x61,0x15,0x25,0xfd,0xa2, + 0xb9,0x65,0xbb,0xbe,0xd3,0x8f,0xd6,0xe7,0x67,0x59,0xb6,0x37,0xa9,0x7c,0x3a,0x75, + 0x65,0x83,0x9e,0x8,0x2b,0x0,0x26,0x1,0x22,0x57,0x57,0x36,0xee,0x8a,0xbb,0xc7, + 0xce,0xd4,0xfe,0x7b,0xa7,0x1f,0xb9,0xb6,0xdc,0x7a,0xf6,0xc2,0xca,0x7e,0xe8,0x8, + 0x9d,0x9d,0x62,0x88,0xe8,0xd3,0xa8,0x58,0x46,0xca,0x68,0xee,0x52,0xc5,0xf8,0x66, + 0x76,0xeb,0x99,0x73,0xeb,0xa9,0x47,0xae,0x2f,0xac,0x30,0xd6,0x7e,0x7e,0xeb,0xd9, + 0x73,0xeb,0xe9,0x47,0x6a,0xd0,0x84,0xd9,0xa9,0x47,0xaf,0x2f,0xb7,0x9e,0x39,0xb7, + 0xaa,0x24,0x1e,0x5,0xd,0xe8,0x9c,0x5b,0xb4,0x7d,0xa1,0x96,0x92,0xce,0xc2,0x3, + 0x49,0xd9,0x4a,0x81,0x3,0x59,0x94,0xc1,0x93,0xba,0xda,0xa9,0x47,0xf6,0x6b,0x8b, + 0x9c,0xe6,0xf6,0x79,0xed,0x7b,0x1e,0xf2,0xc7,0x8e,0xee,0x62,0xed,0x7f,0xdb,0xfb, + 0xa,0xc0,0x2c,0x28,0x16,0x29,0x4a,0x3e,0xfc,0x6f,0xa1,0x4e,0xc7,0x5b,0x82,0x34, + 0x2c,0x20,0x30,0x67,0xad,0xcd,0x92,0xf5,0x6c,0x2,0xca,0x1f,0x81,0x33,0x39,0xe4, + 0x33,0x15,0xf1,0xaf,0x5c,0x71,0x13,0x1e,0x65,0xfe,0x7b,0x56,0x48,0x9a,0x5,0x3e, + 0x46,0x2f,0x8b,0x59,0xc2,0x5b,0x28,0xe1,0xb1,0x82,0x5c,0x46,0x3e,0x86,0xd4,0x3a, + 0xb9,0x31,0xd9,0x40,0x9a,0x72,0x12,0x5b,0x3f,0xfa,0xd6,0x33,0xe7,0xd7,0x5b,0xcf, + 0x9e,0x5f,0xe1,0xb0,0xe3,0x67,0xcf,0xaf,0x77,0x3f,0xb2,0x1f,0x20,0x82,0x66,0x26, + 0x5e,0x6d,0xf6,0x5,0x47,0xf2,0xa4,0x57,0xf1,0x9e,0x11,0xb4,0x0,0xd8,0xf1,0xb3, + 0xe7,0xf6,0xcf,0x8b,0xb6,0x9c,0x1b,0x19,0x52,0xb0,0xf2,0x5e,0xdd,0x8b,0xc7,0xcf, + 0x9c,0x5f,0x6f,0x3d,0x73,0x6e,0xb5,0x60,0x80,0x73,0xfc,0x6c,0xb,0xe0,0x4e,0xad, + 0x43,0xb7,0x24,0x64,0xe4,0x7a,0x3f,0x55,0xb7,0x9f,0xd0,0xa0,0x8d,0xf,0xdd,0x66, + 0xe9,0x84,0x66,0x3f,0x7e,0xf6,0xfc,0x7a,0xea,0x91,0xd7,0xfb,0xfd,0x41,0x72,0x48, + 0xcc,0xda,0xe1,0x71,0xc4,0x16,0xc7,0x5f,0xed,0x30,0x3b,0x7e,0xf6,0xfc,0x7a,0xfc, + 0x6c,0xd,0x26,0x81,0x3,0x7f,0xf7,0xc3,0xfb,0x21,0x67,0x16,0x3c,0xc2,0x89,0xae, + 0xe5,0xf5,0x5e,0x9c,0x7a,0xf8,0xda,0xc2,0x1a,0xe,0xc9,0x36,0x9e,0x38,0xd5,0x30, + 0x5d,0xe3,0xc7,0xcf,0x9e,0x5f,0xef,0x7e,0xf8,0xda,0x40,0xdb,0x6f,0xb5,0x43,0x41, + 0xf4,0x5d,0x61,0x29,0x6c,0xfa,0xc8,0xdd,0x54,0x85,0xee,0xd6,0xb3,0xe7,0xd7,0x53, + 0x8f,0xec,0xd7,0xc3,0x1a,0xeb,0xdd,0x35,0x8d,0xae,0x51,0x78,0xd1,0x40,0x74,0x45, + 0xcd,0xe7,0x4a,0xfd,0xe0,0x53,0xf,0x5f,0x5b,0x8e,0x9f,0x6b,0xeb,0x89,0xbf,0x33, + 0x92,0xb2,0x63,0xd2,0xd6,0x37,0x4a,0x14,0xb6,0xe0,0xdd,0x8d,0x76,0x3f,0xaf,0x2e, + 0x89,0x6d,0x20,0x6c,0x16,0x53,0xd,0x7e,0x63,0xc6,0x8,0xba,0xf3,0x21,0x4b,0xaf, + 0x25,0xe,0x79,0x13,0xb6,0x41,0x10,0xa3,0x37,0xc8,0x1e,0x64,0xed,0x14,0x77,0x15, + 0x3a,0x8b,0x4a,0x74,0xe3,0x9c,0x23,0xa6,0x14,0x8d,0xc,0xd4,0x9d,0x91,0xa9,0x7b, + 0x71,0x4c,0x8,0xf1,0xab,0x60,0xd,0x14,0x68,0x1f,0x40,0x7f,0xf,0xc3,0x3b,0x23, + 0x32,0x80,0xa2,0xa2,0xdd,0xf1,0x73,0x17,0xd6,0x53,0xf,0x5f,0x5d,0xee,0x7e,0xf8, + 0xea,0x72,0xfc,0xdc,0x85,0xd5,0x42,0x1,0xed,0xe1,0x19,0x9e,0x94,0x8a,0x25,0xba, + 0xc2,0x50,0xd7,0xea,0xf8,0xb9,0x73,0xeb,0xdd,0x8f,0xbc,0xbe,0xdc,0xfe,0xee,0xb9, + 0x35,0xce,0x86,0x5d,0x31,0x2e,0x79,0xe,0x54,0x2c,0xc8,0xf3,0xc1,0xb2,0xa,0x95, + 0x72,0xc5,0x93,0x25,0xcf,0xc1,0x70,0x16,0xb9,0xcd,0xa1,0x9f,0xc7,0x32,0x4e,0xa6, + 0x2d,0xcd,0x76,0x60,0xdc,0xfd,0xc8,0xeb,0xcb,0xf1,0x73,0x7b,0xd0,0xd5,0xac,0x5f, + 0xaf,0x35,0x71,0x9b,0xb9,0xb5,0xd5,0xf9,0xa3,0x9e,0x51,0x9b,0xd2,0x2f,0xb4,0xa9, + 0x5e,0x73,0xd2,0x6e,0x96,0x2e,0x63,0xb0,0x44,0xea,0x7d,0xba,0xc9,0x98,0x82,0x5f, + 0x1a,0xf2,0x38,0xe7,0xd1,0x83,0x79,0x50,0x5d,0x73,0x5a,0xdf,0xad,0x82,0xf7,0xc4, + 0x81,0x8f,0xdc,0x57,0xbe,0xa7,0xb7,0x9f,0x3b,0xd7,0xf,0x5d,0x24,0x24,0xf8,0x0, + 0xba,0xb1,0x1a,0x96,0xb4,0xb8,0x9,0x9f,0xe0,0x50,0xcc,0x82,0x93,0xbe,0xc5,0xb4, + 0x1a,0x24,0xa1,0x23,0xd6,0x21,0x77,0x79,0xf6,0xde,0xc7,0x2e,0xdd,0x75,0xc9,0x22, + 0x17,0xd7,0x33,0x9b,0x3,0x1,0xa1,0xed,0x66,0xb7,0xbf,0x77,0x7e,0xbd,0xfb,0xa1, + 0x6b,0xcb,0xed,0xef,0x9d,0x5f,0xe1,0xf9,0xda,0x7,0x98,0x2c,0x3b,0x4e,0x7b,0x40, + 0x80,0xd3,0xd4,0x5d,0xdb,0x68,0x88,0x7e,0x5,0x66,0x77,0x3f,0x74,0x6d,0xb9,0xfd, + 0xdd,0xf3,0xab,0x78,0xf,0x98,0x7a,0x54,0x8b,0x98,0x6a,0xc5,0x50,0xb0,0x99,0x4c, + 0x7f,0x5f,0x54,0xf4,0x63,0x31,0x3b,0xfe,0xee,0xfe,0x7d,0x98,0xab,0x2b,0x6a,0x59, + 0xce,0x3,0xa1,0xbc,0x66,0x3d,0x9c,0x7,0xd,0xb0,0x3,0xd7,0x3d,0x32,0xba,0x16, + 0x4e,0x77,0xdb,0xe5,0x1e,0x38,0x6,0xc2,0xbc,0xe3,0x1c,0xa4,0xd5,0x1f,0xbc,0xc7, + 0x65,0x4c,0x14,0xc0,0x93,0x3,0x9a,0x64,0xf9,0xbb,0x99,0xaa,0x43,0x6,0xf,0x6, + 0xa9,0xd6,0x27,0x9c,0x6f,0xa7,0xea,0x7f,0x7f,0x2e,0x17,0xa4,0x5b,0xe1,0x9d,0x31, + 0x62,0x92,0xd8,0xb1,0xe3,0x17,0x8b,0x6f,0x99,0xbb,0x74,0x12,0xda,0x9f,0xdf,0xf9, + 0xe0,0xd5,0xe5,0xf6,0xf7,0x2e,0xac,0x16,0xe0,0xac,0x8,0xe3,0xa,0xc1,0x5f,0xc8, + 0x75,0xc4,0x4e,0x6,0x75,0x34,0xad,0x5d,0xff,0xfe,0x19,0xa2,0x1b,0x52,0xbf,0xe3, + 0xed,0xef,0x5e,0x58,0xd5,0xbe,0x38,0x62,0x4,0x7c,0xea,0xd3,0xc1,0xfb,0x55,0xce, + 0x9f,0xf8,0x1c,0x90,0x9f,0x8b,0x47,0x0,0x19,0x32,0xb3,0x98,0xef,0x95,0xc1,0xec, + 0x9d,0x97,0xaf,0xed,0xdf,0x21,0x64,0x52,0x1e,0x12,0x75,0xc6,0x16,0x39,0xdb,0x7f, + 0x47,0xcc,0x13,0xe6,0x7b,0x36,0xee,0x67,0xf0,0x99,0x6,0x23,0xfc,0x99,0x1e,0xff, + 0x7d,0x8f,0x8f,0x19,0xa9,0xf0,0xdd,0x63,0xdc,0x68,0xff,0x7b,0xfb,0x7b,0x17,0xd7, + 0xe,0x2a,0x9f,0x8c,0xa9,0xbc,0x63,0xe0,0x60,0x27,0x99,0xf,0x27,0xd9,0x9b,0x59, + 0x80,0x9f,0xdb,0xd4,0xbf,0xd5,0x2c,0x3b,0x33,0x39,0x21,0xfe,0x66,0x95,0xab,0xce, + 0xef,0x74,0xde,0xa6,0xe2,0xed,0x9e,0xe3,0x3f,0xcf,0xdc,0xeb,0x7f,0xdf,0xfe,0x6e, + 0x9b,0xe1,0xf8,0x8,0x62,0x8e,0xd4,0xd5,0x94,0x20,0xe2,0x51,0x5,0x8c,0xae,0xd1, + 0x55,0xc7,0x9d,0x33,0xe0,0x77,0x5e,0x7e,0xbd,0x1e,0xa8,0x3e,0x6c,0x2,0x6d,0x28, + 0xb3,0x71,0x95,0xe9,0x9b,0xa5,0x99,0x68,0xbf,0xd7,0x98,0x54,0xf5,0xa1,0x9b,0xe0, + 0xd0,0x60,0xe3,0x93,0x7b,0x7,0xcf,0x4a,0x97,0x30,0x13,0xd0,0xc7,0x30,0xed,0x8, + 0xa,0xe,0xfc,0x3b,0xc8,0xad,0xcc,0x7e,0x98,0x72,0xb2,0x66,0x59,0xe5,0x2c,0x44, + 0xf,0xcd,0x5a,0xe9,0xbd,0xf9,0xf7,0x1d,0x50,0x94,0x7b,0x58,0x53,0x2c,0x60,0x3a, + 0x2a,0x17,0x24,0x67,0x29,0x79,0x7d,0xfb,0xe,0xa5,0x72,0x58,0xcd,0xa5,0xcb,0xc2, + 0x94,0x32,0xe6,0x6e,0xb2,0xb2,0x93,0x9a,0xde,0xf2,0xba,0x9,0x19,0x34,0x3b,0x7e, + 0xb1,0x86,0x7d,0xbb,0xe7,0x65,0x34,0x9e,0x44,0x16,0x35,0x5,0x5c,0x1a,0xeb,0xb0, + 0xfb,0x1e,0x7,0x3a,0xe2,0x23,0xf7,0xb5,0x55,0x9f,0x3d,0x83,0x4d,0x39,0x71,0x85, + 0x8c,0x58,0xa8,0x62,0x76,0xf5,0x73,0x6b,0x8,0xde,0xd4,0x5,0x71,0x88,0xf3,0x93, + 0x1e,0x68,0xb0,0x77,0x3e,0x70,0x75,0xb9,0xf3,0xbd,0xb,0x7d,0xdf,0x75,0x97,0x41, + 0xe6,0xec,0x4b,0x72,0xe4,0x53,0x25,0xc4,0xc6,0x84,0x41,0x46,0x2c,0x9a,0x84,0x53, + 0x4e,0x92,0xea,0x3d,0xba,0xf3,0xfc,0xf9,0x95,0xf5,0xfd,0x95,0x42,0x49,0xde,0xdb, + 0xee,0xaa,0x57,0xe1,0x2e,0x67,0x91,0xd0,0x4a,0x19,0x45,0x1c,0xf6,0x64,0x56,0x20, + 0x53,0xfe,0xb8,0xc7,0x75,0x3f,0xb,0x22,0x41,0x73,0xfc,0xae,0xcb,0x57,0x3b,0x8a, + 0xfe,0x8d,0x17,0x2f,0xac,0x49,0x9d,0x32,0x9c,0x13,0xe6,0xc1,0xe9,0xd3,0x2,0x87, + 0xdd,0xf4,0xf7,0x9d,0xac,0x53,0xf3,0x7b,0xef,0x9,0xdd,0x9d,0xe7,0x2f,0xae,0x8c, + 0x86,0x75,0xcb,0xd2,0x1c,0x51,0x6e,0x4a,0xcf,0x48,0x35,0xed,0x2,0xd4,0xa7,0x5b, + 0xf6,0x17,0x7b,0x85,0x5b,0xf8,0xb3,0xcd,0x78,0xfc,0xc3,0xe5,0x2c,0xea,0x3b,0xb4, + 0xcf,0xbf,0xeb,0xf2,0xd5,0xc5,0xcc,0xec,0xce,0xb,0x7b,0xe0,0x93,0x1d,0x86,0xb0, + 0xee,0x52,0x93,0x3d,0x97,0x88,0x77,0x9e,0xbf,0xb0,0xc6,0xc0,0x13,0xe4,0xb5,0xb4, + 0x8b,0xd9,0xee,0x45,0x21,0x17,0xbf,0x29,0xcc,0xd3,0x53,0x9b,0x40,0x38,0xeb,0x21, + 0x6e,0x78,0x60,0x2d,0x88,0x1d,0xb7,0x4b,0x2f,0xa5,0xbf,0xcf,0x49,0xf1,0xb0,0x6e, + 0x80,0xd,0x57,0xb5,0x24,0x9f,0x71,0xfc,0xdc,0x26,0x3a,0xc2,0x8,0x15,0x3a,0x3, + 0xb3,0x59,0xb7,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xec,0xce,0xf3,0xe7,0xd7, + 0xbb,0x2e,0x5f,0xab,0x37,0xbc,0xce,0x67,0x7c,0x0,0x21,0xac,0x3,0xc,0x40,0x6d, + 0x41,0x45,0x10,0x20,0x76,0x55,0xb9,0x85,0xea,0x5c,0xc9,0xc4,0x43,0xb,0x52,0xb5, + 0x3a,0x90,0xfc,0x80,0x79,0xfe,0xed,0xf5,0x1a,0xef,0xba,0x7c,0x6d,0xa0,0x71,0xe9, + 0x34,0x16,0xa4,0x7b,0xcf,0xb4,0x28,0x43,0x8b,0xda,0xed,0x3e,0x3,0xf3,0x42,0xb8, + 0xcd,0x6f,0xd0,0xe7,0xf1,0xb5,0xb1,0xe4,0x62,0x82,0x55,0x5,0x93,0x96,0xb8,0x74, + 0xf8,0x67,0x8e,0x60,0x7e,0x81,0x99,0x89,0x26,0x13,0xf6,0x2c,0xb5,0xde,0x61,0x46, + 0xbf,0xe7,0x1,0xf1,0x3f,0x0,0x85,0x1e,0xe,0x6b,0x45,0xf9,0xba,0x24,0xc,0x30, + 0xb3,0x77,0x3c,0x70,0x6d,0x79,0xe3,0xa5,0xba,0x79,0xdc,0x15,0x69,0x4e,0x8,0x8, + 0xae,0xc6,0x1a,0xc2,0xf6,0xfb,0x2f,0x9d,0x5f,0xef,0x7a,0xe0,0xda,0xc2,0x94,0xe, + 0x18,0x12,0x80,0xcc,0x24,0x38,0xe6,0xf7,0x63,0x2f,0xf9,0x56,0xc5,0xc2,0xe9,0x1e, + 0xb9,0x1b,0x83,0x90,0xfa,0xba,0x89,0x95,0x46,0x58,0x47,0xb0,0x3,0x11,0xdc,0x7, + 0x2d,0x92,0xf2,0xaa,0x9e,0x18,0x8e,0x69,0xd3,0x78,0x97,0x37,0x5e,0x3c,0xbf,0xbe, + 0xe3,0x81,0x6b,0xcb,0xf7,0x5f,0xba,0xb0,0xf3,0xa9,0x39,0x21,0x73,0xe,0x9e,0xd, + 0xf8,0x9,0x15,0x3e,0xe2,0x3d,0xd2,0x6c,0x77,0xe1,0x16,0xad,0x8f,0x64,0x1f,0xbb, + 0x2a,0xfc,0x21,0x38,0x85,0xd,0xbf,0x74,0xad,0x68,0xef,0xba,0xff,0xea,0x72,0xe7, + 0xc5,0xb,0x53,0x2f,0x68,0xa9,0x18,0x2d,0x69,0x4d,0x75,0x60,0x64,0x92,0xe6,0x9, + 0xa3,0x34,0xcc,0xc,0x72,0x22,0x69,0x91,0x68,0x6f,0xac,0x15,0x21,0x7e,0xd8,0x13, + 0xb0,0x7d,0xd4,0xe4,0x86,0x8f,0x4,0x2a,0x75,0x1e,0x5d,0xf5,0xe7,0x67,0x74,0x26, + 0x4c,0xe9,0x69,0xfb,0x1f,0xde,0xe0,0xfb,0x64,0x66,0xef,0xb8,0xff,0xea,0x32,0x63, + 0xc7,0xf0,0x1a,0xdf,0x83,0x6,0xf1,0xa7,0x7c,0x28,0xd6,0xb9,0x67,0xad,0x8f,0xb8, + 0x1f,0xdf,0x71,0x7f,0xd,0x7e,0x2f,0x5e,0x58,0x83,0xdf,0x1e,0xed,0xa3,0x59,0x46, + 0x1b,0x6c,0xb2,0x82,0x66,0xba,0x4d,0x54,0xf1,0xb8,0x33,0x8b,0xc4,0xd9,0x46,0xfa, + 0x6e,0xb0,0x3d,0xa9,0x69,0xd7,0x38,0xee,0x8f,0x6,0xe1,0xf6,0x9f,0x37,0x5e,0xba, + 0xb8,0xde,0x75,0xff,0x95,0xe5,0x8d,0x17,0x2f,0xae,0x6c,0xba,0xc3,0x85,0x5f,0x52, + 0x15,0xc,0x49,0x66,0x2f,0x10,0x29,0x70,0x89,0x51,0x98,0x43,0x3b,0x93,0x68,0x63, + 0x0,0xef,0xcc,0x92,0xfe,0x7d,0x1d,0xf6,0x8e,0xfb,0xaf,0x2c,0x6f,0xbc,0x74,0x71, + 0xed,0x14,0x61,0x36,0x94,0x62,0x60,0xa4,0xab,0x4b,0x61,0x8c,0x1b,0xef,0xb8,0xff, + 0xea,0xf2,0xc6,0x4b,0x17,0x57,0xc5,0xde,0xaa,0x37,0x47,0x1b,0x47,0xb0,0xf2,0xe5, + 0xc9,0xa8,0x9a,0xc4,0x59,0x52,0xbc,0xd,0xc3,0xf7,0x36,0x54,0x28,0x94,0xb9,0xfe, + 0xf2,0x7d,0xd7,0x96,0x37,0x5e,0x6c,0x73,0x1b,0x1f,0x3e,0xdf,0x13,0x5a,0x58,0x2, + 0x5,0x21,0xe6,0x51,0x31,0x3b,0xb3,0xc0,0x5f,0xa5,0xac,0xa8,0xde,0x25,0x6e,0xed, + 0x72,0xa5,0x2b,0x10,0xc3,0x8e,0xd4,0x9c,0x64,0xd4,0xa9,0xea,0x2b,0xbd,0xa5,0xa7, + 0xfe,0xcd,0xda,0x76,0x9e,0x65,0xe8,0xea,0xe8,0xe6,0x9d,0xc6,0xe7,0x9b,0xd9,0x3b, + 0xda,0x7d,0x2a,0xfa,0xbe,0xa8,0x4f,0x1a,0x95,0xd6,0x31,0xb2,0x31,0x6d,0xdd,0xd, + 0xa1,0x1a,0xa7,0xb6,0x24,0x5,0x1f,0x73,0x49,0x3a,0x42,0x36,0x62,0xce,0x22,0x94, + 0xb4,0x5a,0xd1,0xe9,0x24,0x84,0xe4,0x24,0x85,0xf,0x18,0xec,0xfb,0x2f,0x5e,0x58, + 0x77,0x93,0x82,0xc1,0x6d,0xef,0xa0,0x1e,0x4e,0xa0,0xb6,0xc9,0xd8,0x83,0x2a,0x59, + 0xdf,0xcc,0xde,0x71,0xef,0xd5,0xe5,0xfb,0x2f,0x9f,0x5f,0xfb,0xb8,0x62,0x63,0x4a, + 0x96,0x56,0xd4,0x5d,0xf4,0x66,0x33,0x55,0x91,0xa,0x15,0x9f,0x85,0xb6,0xb5,0x89, + 0xa7,0xc0,0xfe,0xbf,0xdf,0x7f,0xe9,0xc2,0xfa,0x8e,0xfb,0xae,0x2e,0x3f,0x78,0x79, + 0xaf,0x8a,0x1c,0x79,0xee,0x2e,0xf3,0xe2,0x49,0x47,0xca,0x89,0x9b,0x8e,0xc9,0x3a, + 0xc2,0x44,0x67,0x21,0x6,0xa3,0xa0,0xdf,0x34,0xe1,0x66,0x31,0x56,0x40,0x15,0xa9, + 0x62,0x96,0xd7,0x9f,0x20,0x32,0x12,0x51,0x1a,0xff,0x92,0x40,0x5b,0xf7,0xac,0x8d, + 0x73,0x46,0xee,0x84,0x68,0x2a,0x1c,0xce,0x82,0x49,0x77,0x25,0x66,0x31,0xe2,0xc1, + 0x80,0x59,0xfa,0x69,0x6f,0x19,0xa0,0x67,0xf6,0x4e,0x93,0xf6,0x9d,0x3c,0xf4,0xa8, + 0xc0,0xbb,0xab,0xc5,0x29,0x66,0x20,0xbe,0x2d,0x2b,0x2e,0x46,0xbd,0xff,0xef,0xbf, + 0x74,0x61,0x4d,0x58,0x8f,0xe4,0xa,0x37,0xab,0x5c,0xed,0x40,0x8b,0x86,0x5,0xa0, + 0xcc,0xbe,0xff,0x12,0x55,0xca,0x16,0xbd,0xce,0x83,0x47,0x2c,0x74,0xad,0x22,0xa8, + 0x30,0xfe,0xf2,0xbd,0x57,0x16,0xbe,0xde,0x7d,0xcd,0x8f,0xf7,0xef,0x3e,0x16,0x3c, + 0x5a,0x50,0xb5,0xa9,0x14,0xa4,0xe3,0x81,0xca,0xe,0x7a,0xd2,0x2a,0x74,0x76,0xf, + 0xc,0xea,0x77,0x30,0xfb,0xfe,0xcb,0x17,0xd7,0x5f,0xbe,0xf7,0xca,0xf2,0x83,0x57, + 0x2e,0xae,0x3c,0x6b,0x4f,0x78,0x24,0x1c,0x96,0xa0,0x6e,0x98,0x97,0x37,0x5e,0xba, + 0xd8,0xd9,0x52,0x82,0xfe,0xaf,0x9d,0x18,0xed,0x14,0x6a,0x4d,0xbe,0x7f,0xff,0xd1, + 0x21,0x1b,0x42,0x4e,0xa,0x42,0xf6,0xc6,0xba,0x18,0xda,0x5c,0x15,0x3f,0xa1,0x5e, + 0x16,0xda,0x75,0xd,0x1d,0x55,0x68,0x61,0xea,0xf5,0xc6,0x8b,0x47,0xca,0x24,0x9e, + 0x1a,0x3f,0xa7,0x28,0xeb,0xdb,0xe3,0xdd,0xf8,0x9d,0x93,0x5a,0x7d,0x98,0x6a,0x1c, + 0xbb,0x92,0x54,0x78,0x36,0x34,0x66,0x52,0x48,0xba,0xe5,0x60,0xad,0xef,0xe4,0xda, + 0x86,0x8e,0x83,0x23,0x22,0x48,0x82,0xf5,0xf7,0x2a,0x1b,0x71,0x2e,0xac,0xd2,0x1c, + 0x70,0x6d,0x20,0x8e,0x80,0xc5,0x95,0xa5,0xb6,0xab,0xa2,0xbf,0xb2,0x87,0x59,0x34, + 0x57,0x83,0x70,0x17,0x57,0x35,0xe1,0x26,0x62,0xa8,0xaa,0x45,0x65,0xb4,0xa8,0x4c, + 0x84,0xa4,0x7f,0x9d,0xdd,0xa9,0x74,0xc0,0x69,0x42,0x13,0x4,0xfd,0x79,0xc6,0x37, + 0xef,0x73,0x5b,0xd3,0x16,0x6b,0xb,0xbc,0xa9,0xc2,0x69,0x9b,0x92,0x2,0x92,0xfe, + 0xae,0x8b,0x9b,0x5a,0x3e,0x9f,0xa2,0xb,0x95,0x8e,0xd5,0x13,0x96,0x22,0xa8,0x1d, + 0xfd,0xf2,0xbd,0x57,0x97,0x1f,0xbc,0x72,0x61,0xfd,0xa5,0x7b,0xae,0x2e,0x20,0x77, + 0x27,0x9f,0xb5,0x23,0x26,0xca,0x6e,0x1e,0x3a,0x43,0x1e,0x2a,0x8b,0x6e,0xc4,0x41, + 0xb,0x3f,0x66,0xfb,0xca,0xa3,0x9d,0x9c,0xc1,0xa4,0xde,0xd2,0xae,0xad,0x5d,0xb7, + 0xfc,0x5e,0x70,0x1e,0x93,0x6f,0xb,0x9f,0x20,0xdc,0xf9,0xf9,0x4d,0xdc,0xb1,0x5, + 0xee,0x11,0xf4,0x9b,0x99,0x8f,0x6f,0xb9,0x2a,0x11,0xba,0x5c,0x5c,0x2c,0x6e,0xd3, + 0xf6,0x9d,0x7c,0x6,0x1,0x17,0xd4,0xbf,0x7e,0xfc,0xf9,0x97,0xee,0xd9,0xf,0x63, + 0xbd,0x51,0x11,0xa1,0x1f,0x80,0x10,0x36,0xe7,0x55,0x27,0x8b,0xae,0xe0,0xa4,0xa7, + 0xc5,0x1f,0x72,0xcb,0x33,0x7e,0x8e,0x67,0x1c,0x8a,0x85,0x2a,0x26,0xe3,0x40,0x2, + 0x8f,0x1c,0x79,0xcd,0x5,0x21,0x8b,0x70,0xaf,0x4c,0x28,0x64,0x3f,0x78,0xe5,0xe2, + 0x9a,0xf2,0x92,0x99,0xf,0x34,0x7d,0x7f,0x75,0x30,0x1f,0xd7,0xf3,0x4b,0x97,0xae, + 0x2e,0x3f,0x78,0xf5,0xe2,0x9a,0xf6,0x1a,0x8f,0x20,0x3,0x63,0x66,0xac,0x6d,0x58, + 0xe0,0xd7,0xa9,0xd8,0x96,0x45,0x3e,0x37,0x9d,0x8f,0xb0,0xf9,0xa6,0xb0,0x5c,0x51, + 0x92,0x36,0xac,0x62,0x8a,0xc2,0x73,0x17,0x91,0x96,0xc0,0x4,0x4a,0x58,0x25,0x9b, + 0x3d,0x7b,0x22,0xf5,0x62,0x74,0xde,0x58,0x89,0x2f,0xab,0x4f,0x7a,0xc2,0x32,0xf5, + 0xd3,0x42,0xa,0x16,0x2a,0xba,0x46,0x88,0x1f,0x33,0x76,0x1d,0x52,0xa5,0x74,0xf2, + 0x7,0xaf,0x5e,0x5a,0x7f,0xe9,0xd2,0x6b,0x8b,0xc6,0xc8,0xb4,0x6c,0xb4,0xe9,0x51, + 0x20,0x1a,0xf,0xd1,0xbd,0x8e,0x15,0xef,0xcc,0x75,0x9d,0x20,0xfe,0xac,0xde,0xc7, + 0x12,0xb5,0x91,0xd9,0x85,0xa8,0xa1,0xfb,0x30,0x71,0xff,0x89,0x59,0x49,0xf4,0x10, + 0xe7,0x3,0xe3,0x87,0xaf,0x5c,0x58,0x7f,0xf0,0xca,0x3e,0xef,0xe2,0x3d,0x8,0x71, + 0x93,0x19,0xe0,0x1b,0x50,0xb0,0x69,0x60,0x1f,0xb8,0xa,0x74,0x80,0x8d,0x54,0xd2, + 0xdf,0x9,0x7d,0xcc,0xb4,0x2,0xb8,0xfc,0xbb,0x6f,0x66,0xbf,0x78,0xf1,0xea,0xf2, + 0xc3,0x57,0x7,0x7a,0x10,0x30,0xfb,0xe1,0xab,0x17,0xd6,0x1f,0xbc,0x5a,0x1,0x2e, + 0x50,0x8f,0xdc,0xa4,0xe3,0x1e,0x74,0x97,0x3b,0x2a,0xd9,0x2d,0xf9,0xdb,0xba,0x2b, + 0xa,0xd6,0x91,0x5d,0x76,0x38,0x93,0x83,0x29,0xc2,0x7f,0x50,0x95,0x62,0x72,0x63, + 0x41,0x6e,0x57,0x41,0x18,0xaa,0xd7,0xa9,0x62,0x3b,0xb0,0x19,0x62,0x36,0x78,0xdf, + 0x46,0x7b,0xca,0x74,0x56,0x5,0x9e,0x58,0xc9,0xa8,0x77,0x8e,0x67,0x3f,0x7c,0xf5, + 0xc2,0xfa,0xc3,0x7a,0x48,0x4d,0xbd,0x94,0x2d,0x63,0xf,0x7e,0xf0,0xea,0x85,0xf5, + 0x17,0x2f,0x5e,0x5d,0x2c,0xac,0xbb,0x69,0x95,0x1e,0xa4,0x7e,0x93,0xc0,0x50,0x74, + 0xd7,0xa,0xee,0x6e,0xc3,0xeb,0x19,0x16,0x75,0x97,0xa7,0x98,0x90,0x30,0x7f,0x8d, + 0xa7,0x1f,0x98,0xcd,0x91,0xda,0xaf,0xe2,0x76,0x34,0xf,0x76,0x6,0xfb,0xe1,0xab, + 0x17,0xd7,0x5f,0xbc,0x78,0x65,0x49,0x55,0x30,0x58,0x9b,0x9a,0x87,0x91,0x81,0xf1, + 0x60,0x93,0x43,0x3a,0x74,0xae,0xf4,0x7e,0xa2,0xef,0xf,0x44,0x11,0xa2,0x2d,0xde, + 0xcb,0xa1,0xbb,0xcd,0x33,0xe8,0x18,0xc0,0xa2,0xd6,0xb9,0x76,0x2b,0x30,0xe5,0x6d, + 0x38,0x6c,0x2a,0xca,0x23,0x32,0x57,0x80,0x14,0xe8,0x39,0xe6,0xeb,0xbc,0xf2,0xed, + 0xf5,0x3e,0x26,0xde,0x8,0xea,0x7d,0xbe,0x70,0x65,0x31,0x2f,0xf2,0x5d,0xd8,0xa5, + 0xd3,0xc2,0x99,0xd7,0x7d,0xc,0x78,0x24,0xc6,0x67,0x1a,0x20,0x5,0x3,0x26,0x36, + 0xe5,0x2c,0x87,0xca,0xf7,0x59,0x1c,0xda,0xa2,0x24,0xb2,0x91,0xbf,0x3b,0xcc,0x7e, + 0xf8,0xda,0xa5,0xfd,0xda,0xc3,0x6c,0x7a,0xac,0x41,0x17,0x31,0xab,0xc1,0x1a,0xf2, + 0xe4,0x96,0xcc,0xfb,0x20,0x59,0x88,0x4e,0x58,0xb,0x20,0xa0,0x23,0x63,0xa,0x3c, + 0x5e,0x8b,0x91,0xf7,0xb7,0x31,0x92,0xdf,0xe7,0x6c,0x88,0x20,0x23,0xc6,0xdd,0xd7, + 0xd1,0xc5,0x85,0xae,0xa5,0xc2,0x6b,0x2c,0xa2,0xf4,0x23,0xab,0x42,0x25,0xa5,0xd9, + 0xc,0x7,0x16,0x9d,0x3a,0x33,0x85,0x98,0xa9,0xc3,0x91,0xe5,0x43,0xac,0x50,0x3d, + 0x67,0x89,0x5e,0x18,0xcf,0x13,0x66,0x15,0xe0,0x40,0xd3,0x4a,0x74,0x5b,0x28,0xe6, + 0x18,0x60,0x27,0x45,0x6f,0x3b,0xcc,0x38,0x10,0x2a,0x46,0x51,0x9d,0xa2,0xa4,0xfa, + 0x47,0x57,0x2e,0xac,0x6f,0xbf,0x70,0x75,0x79,0xf3,0xda,0x85,0x55,0xe7,0xa6,0x9c, + 0x91,0x14,0xa9,0x96,0x95,0x49,0x17,0xc0,0x71,0x36,0xc9,0x46,0x7e,0x36,0xdc,0x7d, + 0x54,0xed,0x22,0xee,0xc1,0x1,0xb2,0xd8,0xd4,0xdd,0x6c,0x82,0x5a,0x41,0xac,0x64, + 0xe0,0x21,0x73,0x72,0xd9,0x1,0x9e,0xb2,0xa5,0x3c,0xbb,0x89,0x33,0x36,0xcc,0xbc, + 0x9d,0xd3,0xf4,0xd7,0xa7,0x0,0xb,0x71,0xe1,0xb2,0x89,0x21,0x8e,0x0,0x8d,0xfc, + 0x0,0xbb,0xc0,0x42,0xfb,0xce,0x14,0x49,0x3f,0x5d,0x4e,0x9e,0x5a,0x89,0x8,0x9d, + 0x88,0xcc,0x14,0x98,0x5f,0x7f,0x67,0x3e,0x84,0xee,0x88,0x80,0xbc,0xa8,0xbe,0x97, + 0x99,0xa2,0x1f,0x60,0x6,0x48,0x2b,0x32,0xb7,0x26,0xa5,0xc7,0x12,0xd1,0xc1,0x61, + 0xfe,0x68,0x1,0x8b,0x10,0xdd,0xb8,0xf8,0xf7,0xde,0x7e,0xfe,0xca,0xf2,0xa3,0x2b, + 0x7b,0x92,0xc2,0xb3,0x2d,0x41,0x3b,0x37,0xe2,0x2b,0xaf,0x4b,0x82,0x3e,0x23,0x34, + 0x68,0x70,0x0,0x1,0x6c,0x98,0x54,0x1c,0xe0,0x79,0x6f,0xc0,0x2c,0x4e,0xd6,0x61, + 0x28,0x30,0xf5,0xfd,0xeb,0x75,0xfc,0xe8,0xea,0xa5,0x15,0xe6,0xf6,0xb6,0xf3,0x57, + 0x16,0x5e,0x42,0x3f,0xba,0x7a,0x71,0xd5,0x8a,0xc9,0xa6,0xee,0x62,0x16,0x40,0x40, + 0x1e,0xf0,0xaf,0x16,0x6a,0x1f,0xf,0x2,0x48,0xbd,0xf2,0x4f,0xa1,0xcf,0x7b,0x57, + 0xc6,0xa6,0x58,0x1c,0x5,0xd5,0xf1,0xb9,0xf6,0xf6,0xf3,0x57,0x96,0x1f,0x5d,0xbd, + 0xb4,0xc6,0x13,0x23,0x34,0x27,0xec,0xed,0x17,0x5e,0x5b,0x7e,0x74,0xf5,0xe2,0xa, + 0xaa,0xe4,0x18,0x9,0xe2,0xae,0x23,0x42,0x3f,0x58,0x41,0x91,0x10,0x56,0x57,0xbc, + 0xf0,0x9,0xcc,0xca,0xa9,0x76,0xc4,0xb4,0xb,0x30,0x1c,0xb6,0x4c,0x24,0x45,0x59, + 0x30,0xeb,0xcd,0x6b,0x97,0xd6,0xb7,0x9f,0x1f,0x95,0xe2,0xb8,0xe6,0xac,0x87,0xe, + 0x4e,0xe6,0x26,0xe4,0xa0,0xce,0x36,0x60,0x1a,0x18,0x72,0xa7,0x91,0x3,0xb5,0xf9, + 0x1,0x44,0xbd,0x88,0x5a,0x99,0xbd,0x79,0x75,0x5c,0xa7,0xa3,0x10,0x16,0xc0,0xec, + 0x47,0xd7,0x2e,0xad,0xf0,0x3,0x41,0xcc,0x14,0x6b,0x84,0x7a,0xe,0x7b,0x90,0x6d, + 0x66,0xe9,0xe5,0x99,0xca,0x20,0xb7,0xe6,0x3c,0x22,0x76,0xa0,0xf8,0x91,0x34,0xc2, + 0x7,0xc4,0x83,0xac,0x8f,0xe5,0x5c,0x41,0xc0,0x8c,0xd9,0x19,0x5d,0x1,0x4d,0xa0, + 0x98,0x21,0x16,0x75,0xf2,0x59,0x2a,0x3d,0x6,0x43,0x4,0x51,0xb0,0x37,0xaf,0xde, + 0xb3,0xbe,0xfd,0xfc,0xab,0xcb,0x49,0x93,0x79,0x59,0x70,0x80,0xe1,0x94,0x37,0xa0, + 0x60,0xdf,0x7e,0xee,0xea,0xf2,0xe6,0xd5,0xb,0x5d,0x73,0xfd,0xcd,0x6b,0x17,0xd6, + 0xb7,0x9d,0x6f,0xbc,0xc4,0x3,0x6d,0x2f,0xe1,0x1b,0xc,0x2a,0x91,0x45,0x75,0xb9, + 0xd8,0xf6,0x94,0x56,0x91,0x4f,0x1e,0xef,0x8,0xba,0xc5,0x43,0xdb,0xc8,0x43,0x7b, + 0x53,0xd4,0xb1,0xe6,0x15,0x95,0xae,0x90,0xec,0xf3,0x3b,0xde,0x2a,0xf0,0x2e,0xeb, + 0x77,0xcb,0xe8,0x54,0x1d,0x3d,0xc4,0xcf,0x7d,0xf3,0xea,0xc5,0xf5,0xf0,0xd4,0x30, + 0xb7,0xd8,0x74,0x8d,0x5,0x15,0xb7,0xd0,0x82,0x99,0xa0,0xdc,0x94,0xfd,0xc6,0x6d, + 0x7c,0xd7,0x54,0x62,0xa,0xce,0x45,0xee,0x21,0xd,0x1a,0x8b,0xcb,0xc1,0xf0,0xe6, + 0x55,0x6a,0x15,0x62,0xd2,0x6d,0xc4,0x7e,0x0,0xbd,0xed,0xec,0x6b,0xcb,0x8f,0xaf, + 0x5f,0x5c,0xdf,0x76,0xf6,0xca,0xf2,0xe6,0xb5,0xfa,0x3b,0x82,0x9c,0x2a,0xb4,0x2e, + 0x47,0x36,0xfa,0xe6,0xd5,0xa,0x3e,0x9,0x46,0x31,0x62,0x74,0xe3,0x8,0xf4,0x3a, + 0xb,0xcf,0x2c,0xb0,0x11,0x8,0x18,0x98,0xc0,0x86,0x5b,0x98,0x8a,0x90,0x3e,0xb8, + 0x78,0xbe,0x13,0xa0,0x51,0xb,0x62,0x17,0xf7,0x25,0x8f,0xb3,0xdf,0xd0,0x99,0x18, + 0xa3,0x96,0x3c,0x9b,0x25,0x6c,0x7c,0x70,0x83,0xe2,0x51,0x4d,0x6c,0xf7,0xc7,0x46, + 0x3d,0x8d,0x93,0x10,0xaa,0x73,0x2a,0x27,0x7f,0x7c,0xed,0xd2,0xea,0x14,0x0,0x15, + 0x46,0x49,0x2d,0xfa,0x2d,0x7,0x11,0xfe,0xe8,0x37,0xaf,0x5d,0xc,0x20,0x27,0xa7, + 0x71,0xc6,0xa8,0x1e,0x7d,0x8e,0xab,0x56,0x6c,0x32,0xc6,0x68,0x8,0x4e,0x26,0x29, + 0xa1,0x3f,0xc8,0xc9,0xc3,0x8f,0xaf,0xd5,0x40,0xde,0xc6,0x50,0x50,0x20,0x6d,0x6f, + 0xb3,0x6e,0xa1,0x73,0x21,0xd5,0xf5,0xe8,0x66,0x20,0xac,0x85,0x69,0xe4,0x71,0xb5, + 0xe9,0xdc,0x2f,0xa5,0x8c,0x44,0x3d,0x60,0x62,0x3a,0xef,0xda,0xd4,0xe7,0xba,0xaf, + 0x6d,0xca,0xbe,0xe,0x51,0xd8,0xde,0x7c,0xfd,0x92,0x88,0x7,0xf1,0x7b,0x76,0x84, + 0xba,0x0,0x5e,0x4d,0x30,0x3b,0xfd,0x1e,0x8b,0xc2,0x5d,0x3b,0x57,0xc6,0x5a,0xfd, + 0x71,0xfd,0x9c,0x8c,0x88,0x67,0x8c,0x5,0xa4,0x2b,0x23,0xc0,0xb9,0xcd,0x12,0xda, + 0x5c,0x4d,0xc0,0xdc,0xa6,0xf8,0x74,0x2,0xe8,0x1a,0xb5,0xc5,0x3d,0x74,0x26,0x61, + 0x2e,0x58,0x1b,0x5,0xb5,0xb8,0x30,0x80,0x83,0x60,0x4,0xbd,0x34,0x80,0xe8,0x48, + 0x85,0x93,0xd0,0x51,0x69,0x7e,0x9e,0xca,0x52,0x64,0x4e,0x8f,0x30,0xc5,0x48,0x77, + 0xe0,0xcd,0xd7,0x2f,0xad,0x60,0xaa,0xb1,0x4d,0xa7,0x51,0x19,0x8f,0xb3,0xd9,0x4e, + 0x5b,0x3,0x21,0x22,0x9d,0xfc,0xbb,0xa7,0x5e,0xd8,0x52,0x55,0x32,0xcc,0x16,0xf6, + 0xe3,0x6b,0x17,0x57,0x99,0xf5,0xf6,0x3d,0x31,0xb4,0xad,0xdd,0xe3,0x9a,0xaf,0xe0, + 0x5,0xa9,0xa6,0x7c,0x72,0xa2,0x86,0x4a,0x4b,0x10,0x83,0xe8,0x92,0xb3,0x9e,0x7, + 0x54,0x69,0x7e,0x9c,0x79,0xe2,0x8,0x15,0xa,0xa6,0x1,0x48,0x79,0xb7,0x20,0xb4, + 0xe3,0x8,0xd6,0xbf,0x70,0xf6,0xea,0xf2,0xe3,0xd7,0x2f,0xae,0xb1,0x32,0x72,0xca, + 0x2c,0x62,0x65,0x9,0xb,0x5c,0x54,0x53,0xf5,0x27,0x6,0x3a,0x39,0x22,0x62,0xa5, + 0xd4,0x77,0x1f,0x20,0xd,0xe7,0x43,0x97,0x50,0xf2,0x31,0x51,0xe7,0x83,0x1b,0x29, + 0x87,0x19,0x46,0x18,0xce,0x20,0xc4,0x3e,0x6b,0xe2,0xc,0x36,0x1c,0xce,0x50,0x99, + 0xc9,0xe,0x1c,0x8c,0x33,0xec,0xd0,0xa1,0xe0,0xb5,0x1,0x84,0xa0,0x90,0x30,0xf, + 0x71,0xa1,0x43,0xc1,0x5b,0x72,0xd,0x16,0x18,0xde,0x23,0x3b,0xfe,0x85,0xa3,0xd7, + 0x96,0x1f,0xdf,0xb8,0xb8,0x72,0x75,0x34,0xf0,0x23,0x3e,0xa9,0xe8,0xc7,0x7b,0xfd, + 0xc5,0xf5,0x4b,0xeb,0xcf,0x1f,0xbd,0xb6,0xfc,0xe4,0xc6,0xa5,0x35,0xcf,0xe9,0xb4, + 0xbf,0x12,0x84,0x5,0xc6,0xa7,0x41,0xf9,0xca,0x3d,0xcc,0x52,0x90,0x6a,0xbf,0xf3, + 0x17,0xd7,0xe9,0x0,0xe5,0xa0,0xda,0xf6,0x80,0xb0,0xd9,0x15,0x5c,0x38,0xe6,0x97, + 0x3c,0x62,0xd7,0x2e,0xc6,0x8f,0x6f,0xd4,0xca,0x88,0x5e,0x6b,0x81,0xc9,0xc1,0x4e, + 0x69,0x2e,0xaa,0x63,0x8,0x28,0x76,0xed,0xec,0x21,0x8e,0x3e,0xa8,0xb2,0x36,0x55, + 0x46,0x1d,0x18,0xe,0x5a,0xb3,0x82,0xdb,0x12,0x7c,0x58,0xb1,0x24,0xb3,0x1b,0xab, + 0xab,0x6,0xda,0xec,0x46,0x3a,0x54,0xbd,0x3,0xa4,0xcb,0x1f,0x3a,0x68,0x4e,0xf4, + 0x40,0x58,0x62,0x49,0xb4,0xc3,0xf6,0xe7,0xcf,0xbc,0xb6,0xfc,0xc5,0xf5,0x4b,0x1d, + 0x8,0xc,0x3e,0x71,0x31,0xeb,0x38,0xb8,0x24,0xfa,0x5c,0x40,0x38,0x89,0x9e,0xfc, + 0xf8,0xc6,0xa5,0x15,0x74,0xf3,0x5b,0x1b,0xbf,0x3,0x61,0xfb,0xb9,0x6a,0xa3,0x8b, + 0x20,0x81,0x3f,0xa3,0xbb,0xdb,0x99,0xc0,0x50,0x7e,0x74,0x1c,0xd,0x3a,0x32,0x1b, + 0x10,0xca,0x85,0x98,0x56,0xb9,0xf9,0x81,0x26,0x30,0x44,0x3b,0x41,0x7c,0xe7,0x15, + 0xe7,0x9e,0x31,0x49,0x53,0x79,0x7f,0x4c,0xda,0xcd,0x9e,0xd0,0xf4,0x48,0x7e,0xf5, + 0xfe,0x16,0xd8,0x8d,0x6c,0x5b,0x9b,0x19,0x8,0x36,0x5a,0xf7,0xb1,0x5b,0x89,0xd8, + 0xfd,0x9c,0x38,0xa1,0x5,0x7e,0xcd,0x60,0x6b,0xe5,0xb1,0x67,0xea,0xec,0xb6,0xf6, + 0xbf,0xe7,0xee,0x67,0x1c,0xf,0x85,0x4a,0xcc,0xdc,0x2b,0x6d,0xcd,0xcc,0xec,0x2f, + 0x6e,0x5c,0x5c,0x7f,0xfe,0xcc,0x95,0xe5,0x27,0xb7,0x2e,0xae,0x8c,0x96,0xe4,0xf6, + 0x5c,0x9c,0xaf,0xf5,0xd,0x5,0xed,0xa5,0x71,0xd2,0xeb,0xe,0x51,0xc8,0x61,0xac, + 0x4e,0x3b,0xb4,0xe2,0x40,0xa9,0x7,0x23,0x2,0xa7,0xa5,0x80,0xef,0x83,0x36,0xe5, + 0x98,0x88,0xa2,0x20,0x42,0xf4,0x83,0xfe,0xae,0xc1,0x7e,0x72,0xe3,0xe2,0xea,0xb4, + 0x90,0x19,0xf1,0xc8,0xc0,0x23,0x37,0xad,0xd0,0xc7,0x5b,0x8e,0xa0,0xa1,0xc8,0xe7, + 0x76,0x4f,0x2f,0xad,0xdc,0x72,0x6b,0x3f,0xff,0xc9,0x8d,0x8b,0xab,0x4f,0xbb,0xc, + 0x44,0x7d,0x6b,0x4d,0x3a,0xca,0x54,0x95,0xda,0x17,0x2,0x23,0xe9,0x66,0x3b,0xa2, + 0x99,0x4e,0x4c,0xae,0x22,0x59,0x4d,0x5b,0xdc,0xde,0xab,0x98,0x31,0x34,0xf4,0x90, + 0xe0,0x81,0x10,0x34,0x1e,0xb3,0xda,0x8e,0xde,0x86,0x64,0x92,0x7c,0x10,0x8f,0xcd, + 0xbe,0xdf,0xb3,0x9f,0x3f,0x7d,0x65,0xf,0x8c,0x16,0x44,0x4d,0x66,0x15,0xf2,0xf6, + 0x16,0xe2,0x16,0x24,0xf8,0x21,0x88,0x5c,0xcb,0x74,0x25,0x5e,0xcf,0x51,0x2e,0x94, + 0x87,0xce,0xce,0xdc,0xda,0xd0,0xa9,0x10,0x5f,0xea,0x34,0x8e,0x99,0xf9,0xce,0x7, + 0x40,0x9f,0xd,0x73,0x86,0xc1,0x34,0xe0,0xea,0x9a,0xf,0xcb,0x11,0x90,0x98,0xa5, + 0x20,0x15,0x71,0x1c,0x41,0x61,0xf8,0x13,0x8c,0xbd,0xe9,0x2a,0x4d,0xc9,0x35,0x3b, + 0x8d,0x72,0xfb,0xed,0x73,0x48,0x87,0x6b,0x50,0x45,0x79,0x94,0x84,0xe0,0xff,0x3d, + 0x2a,0x3c,0xb8,0x4f,0xb8,0x4d,0xba,0x57,0x99,0x1e,0x86,0x28,0xa0,0x64,0x79,0xac, + 0x23,0x9d,0x16,0x2e,0x21,0x62,0x29,0xda,0xf1,0x10,0x9e,0xe6,0x77,0x48,0x4d,0x27, + 0x4c,0x7d,0xcc,0x53,0xab,0x1a,0x9e,0x71,0x43,0xa4,0x15,0x81,0xf4,0xf9,0xb9,0xc0, + 0x40,0x1c,0x61,0x61,0xd2,0x4e,0x8e,0xed,0x6f,0xb3,0xd4,0xf6,0xee,0xda,0x1f,0xd1, + 0x89,0x0,0xd4,0xb2,0x2d,0x3,0x30,0x8b,0x8,0xce,0x44,0x2e,0x9c,0x80,0x3,0x1, + 0xd0,0x73,0xa2,0x18,0x6f,0x22,0x3c,0xec,0xd1,0xc9,0xc,0xbd,0xfd,0xed,0x27,0x37, + 0xef,0x59,0xa3,0x34,0xf5,0x74,0x32,0x18,0xc1,0x77,0xc6,0x4e,0x8c,0x3e,0xe9,0xc7, + 0x2b,0x18,0x50,0xf5,0x40,0x5c,0x5b,0xe7,0x12,0x4b,0x2c,0x77,0xcc,0x30,0xab,0xc2, + 0x3c,0x77,0x75,0xa9,0x43,0x25,0x9a,0x27,0x50,0x30,0x22,0x42,0x17,0x73,0xb0,0x2d, + 0x5c,0x98,0x66,0x71,0x5c,0x65,0xd1,0xe4,0x6c,0x64,0x9d,0x72,0x3e,0x9e,0x14,0x81, + 0x12,0xae,0x94,0x10,0x17,0xa0,0x4f,0x39,0x73,0xd1,0x19,0xcc,0xd8,0xa2,0x13,0x16, + 0x9b,0x73,0xfd,0x26,0xba,0xf0,0xdc,0x3d,0xcd,0xc1,0x8d,0x2b,0x3c,0x6,0x5b,0x14, + 0x45,0xeb,0xc6,0x7e,0x8f,0x8e,0xb,0x3d,0x65,0xd6,0x96,0x2,0x53,0x6c,0x5e,0x47, + 0xec,0x7d,0xf6,0xbc,0xed,0x47,0x28,0xcf,0xb6,0xa6,0xa,0x73,0xa1,0x45,0x68,0x99, + 0xbf,0xbb,0xb7,0x6f,0xe8,0x61,0x4f,0xe,0x2d,0x17,0x5e,0xa4,0x27,0xbd,0xf1,0xd8, + 0x61,0x69,0x3c,0x6a,0xf,0xd3,0x8f,0x8,0xbb,0xc4,0x81,0x8c,0x55,0xe,0x7f,0xf, + 0x89,0xda,0xa4,0xc2,0x89,0x6a,0x4a,0xb1,0x8d,0x9f,0xfc,0xb1,0x1d,0x59,0x9,0x6d, + 0x32,0x99,0x31,0x6a,0xe5,0xb7,0x7b,0xfc,0xcf,0x4f,0xbd,0xb6,0xfc,0xe4,0xd6,0xa5, + 0xb5,0x3,0x4,0x5b,0x87,0x64,0x82,0x83,0xc8,0x15,0xac,0x1a,0xca,0x6a,0x7,0xc5, + 0xfa,0x33,0x1d,0xd5,0x33,0x37,0x72,0x7d,0xaa,0xfc,0x97,0xd1,0xba,0x79,0xa3,0x7, + 0xa1,0xc9,0x61,0x62,0xa4,0xcd,0x28,0x85,0x85,0xf5,0xaf,0xa5,0xa2,0xa1,0xd3,0xf1, + 0x81,0xbb,0x50,0xc1,0xa4,0xb1,0xee,0x8a,0xc6,0x49,0xd5,0xbd,0x71,0x7,0x48,0x2b, + 0xb1,0xbe,0xfa,0xa0,0x58,0x82,0x91,0xe6,0x68,0xdb,0x37,0xa1,0xe2,0x31,0xb8,0xd3, + 0x9e,0x12,0x11,0xde,0x49,0x66,0x56,0xd8,0xc7,0xc0,0x6c,0xcc,0xce,0x26,0xb3,0xf, + 0x4c,0xc6,0x69,0xe9,0x75,0xe1,0xbe,0xc7,0x99,0xba,0xc2,0x69,0x12,0xb,0x23,0x63, + 0x33,0xf4,0x70,0x89,0xb3,0xcf,0x4,0x1d,0x10,0xb9,0x43,0x8d,0x59,0x88,0x80,0x88, + 0x9,0xf2,0x1d,0x9e,0x13,0xfd,0xd6,0x35,0xd0,0xb9,0x1f,0xb5,0xef,0x13,0x9e,0xc5, + 0xd4,0x93,0xc1,0xf1,0x16,0x62,0x5d,0x2e,0xe3,0x13,0xcd,0xce,0xa5,0xe7,0x3e,0x19, + 0xc,0x22,0xb5,0x72,0x5a,0x6e,0x4a,0x71,0x85,0xb3,0x7e,0xe7,0x80,0xec,0xdc,0x22, + 0x4,0x25,0xa8,0x3e,0x19,0xf3,0x51,0x4c,0xf1,0x48,0x4f,0x89,0xf,0x30,0x56,0xe8, + 0x30,0xed,0x86,0x86,0x39,0xb7,0xb4,0xd5,0x7d,0x28,0x10,0xee,0xd2,0xcc,0xa1,0x7, + 0x0,0x1d,0x3d,0x25,0xcc,0x54,0x33,0x19,0x8a,0xb8,0x1d,0xe4,0x98,0x6a,0xe6,0xf6, + 0xcf,0xee,0x7e,0x75,0xf9,0xf,0xb7,0xef,0x5d,0xfb,0x68,0x2e,0x26,0x9e,0x50,0xd5, + 0x80,0x2c,0xb2,0xd6,0x2a,0x74,0xda,0xa4,0xa2,0x31,0x2e,0x99,0xd9,0x98,0x2d,0x39, + 0x57,0xe8,0x71,0x1e,0xc0,0x80,0xf,0x4,0x7,0xb5,0x9e,0xd,0x71,0x6d,0xe1,0xc9, + 0xe2,0x12,0xac,0x2f,0xdd,0xe7,0x8,0xd0,0xf5,0x12,0x1b,0xa8,0x88,0x89,0xc8,0xa8, + 0x84,0xc6,0x3a,0x41,0xa2,0x13,0xf8,0xc,0xf8,0x67,0x98,0x68,0x30,0xef,0xb,0xec, + 0x3f,0x1c,0x5f,0x5a,0x59,0xb6,0x92,0xf,0x94,0xbf,0x3c,0xbe,0x67,0xfd,0x67,0xef, + 0x7c,0x75,0x68,0x3d,0x3,0x39,0x99,0xe1,0x6a,0x2d,0x8a,0x78,0x84,0x43,0xb0,0xcd, + 0xb0,0xc0,0xe3,0xc6,0x99,0xb9,0x7,0xcf,0x66,0xc8,0x89,0xce,0xa8,0x75,0xd9,0x8f, + 0x6a,0x4e,0x70,0xfa,0xbe,0xf5,0x84,0xc,0x66,0xe0,0x4d,0x97,0x2f,0x45,0x44,0x34, + 0xd1,0xb5,0x45,0x3,0x18,0x1,0x44,0xba,0x1c,0x4e,0xa3,0x2,0x1f,0xf7,0xf9,0x2f, + 0x6f,0xf3,0x2c,0x6e,0x54,0xc4,0x31,0x1e,0xa9,0xbe,0xbe,0xa7,0x7a,0xc6,0x15,0x71, + 0x15,0x78,0xc8,0xae,0x32,0x9f,0xa6,0x3c,0x6b,0xd,0x45,0x50,0x74,0x6b,0xe8,0xd0, + 0x38,0xa2,0xaa,0xe2,0x44,0xdf,0xbf,0x85,0xe7,0x92,0xe2,0xa2,0xb6,0xe4,0xa2,0x77, + 0xba,0x22,0xf3,0x11,0x2b,0x67,0x6a,0xb2,0x9a,0xa8,0x2a,0xa5,0x8a,0x50,0x79,0xf7, + 0x87,0x2a,0xc4,0x69,0xf5,0xc8,0x33,0xe3,0x19,0x90,0x2a,0x8c,0xbc,0x84,0x2b,0x9f, + 0xe6,0xc8,0xa,0x86,0x12,0xa,0xa5,0x97,0x4,0xf0,0xc9,0xc,0x87,0x1c,0x33,0xcc, + 0xa6,0x8,0xa9,0xc9,0x78,0x2e,0x8f,0x3f,0x61,0x93,0x2a,0xcc,0xa9,0xe3,0xc4,0xca, + 0x91,0x1e,0xd8,0x9,0xdc,0xde,0x8c,0x3c,0x6b,0xb,0xb8,0xa3,0x28,0x1f,0xa,0x11, + 0x91,0xd5,0xbd,0x15,0x3,0x68,0x7,0x2e,0x46,0xed,0x56,0x93,0xa,0x13,0xc6,0xdd, + 0x49,0x1e,0x5d,0x68,0x72,0x36,0x89,0xf0,0x69,0xcf,0x38,0x41,0x51,0x9d,0x85,0x8a, + 0xb2,0xb4,0x61,0x86,0x3c,0xf1,0xa4,0xd4,0x54,0xe5,0x8d,0xbd,0x8,0x68,0xbc,0x87, + 0x6e,0x51,0x2c,0x38,0xd6,0xfd,0xb,0xa,0x50,0x16,0x33,0x28,0x90,0x8a,0x7,0x65, + 0x45,0xbe,0xac,0x4c,0x39,0xeb,0x38,0xc4,0x24,0xd5,0x2d,0xe3,0x8d,0xc,0x39,0x1, + 0xb6,0x90,0x14,0xdb,0xe4,0x73,0x18,0xa3,0x90,0x96,0x2f,0x7d,0x77,0x8d,0xb9,0x3, + 0x40,0xae,0x48,0x97,0x9,0x8,0x96,0x63,0x2c,0x57,0xe8,0x9c,0xf0,0xbb,0x9b,0xfd, + 0xd3,0xbb,0x5e,0x5b,0xfe,0xea,0xe,0x81,0x2a,0x5c,0x11,0xc9,0x8c,0xc0,0x44,0xe8, + 0x30,0x4a,0xa6,0xe2,0xb9,0xcd,0x31,0xc0,0x2c,0x9c,0x26,0xc7,0x6a,0x42,0x37,0xab, + 0xa7,0x99,0xc4,0x1c,0x95,0xee,0xce,0x52,0x92,0xa3,0xe2,0x9d,0x81,0x8,0xd0,0xab, + 0x9a,0x7c,0xba,0x8d,0xec,0x90,0x84,0x6a,0x68,0x26,0xc5,0xf,0xa,0x22,0xe6,0xe2, + 0x59,0x31,0xcf,0x46,0x4b,0xc7,0xa1,0x47,0xf4,0x44,0x99,0x36,0x67,0x6f,0x98,0xb4, + 0xc0,0x82,0xa3,0x9a,0x3e,0x6b,0xf,0xc1,0x22,0xda,0x79,0x5a,0x76,0xb,0x32,0x6d, + 0xe9,0xea,0xc8,0x22,0x58,0xb,0xfa,0xc4,0xbe,0xc,0x93,0x60,0x68,0x3a,0x36,0xf4, + 0x82,0xc0,0xd8,0x82,0xce,0x4c,0x6d,0x62,0x7e,0x10,0xda,0xd5,0xea,0x70,0x86,0x8, + 0xc5,0x9d,0xb6,0x50,0xed,0x40,0x67,0x22,0x66,0xee,0x7,0x49,0x14,0x98,0x73,0x8f, + 0xc1,0xa,0x86,0x99,0xcf,0xb,0x6d,0x23,0xe5,0x6a,0x20,0xd,0xef,0x30,0x14,0xdd, + 0xc4,0xa1,0x2c,0x82,0xa1,0x2c,0xb0,0x95,0x1c,0x5a,0x92,0x1e,0x24,0x3d,0x20,0x8c, + 0xa9,0xe6,0xc1,0x50,0x71,0x14,0x34,0x63,0x95,0x4e,0xc9,0x18,0x4d,0xa8,0xc,0xdb, + 0x84,0x19,0x30,0x7a,0xf6,0x84,0xd0,0xa2,0xd4,0xe,0x6e,0x6f,0x8d,0xc0,0x1c,0xe7, + 0xc7,0xf0,0x20,0x30,0x5,0x0,0x76,0x65,0x9e,0xc9,0x93,0x4c,0xdc,0x6d,0xf,0x87, + 0x2c,0x28,0x90,0x8c,0x4,0x69,0xce,0x26,0xd0,0x64,0x91,0xfd,0xbe,0x5d,0x88,0x22, + 0x48,0x78,0x60,0xcf,0x78,0xc7,0xf1,0x5d,0x64,0xc,0x90,0xb8,0x35,0x4,0xb2,0x74, + 0xa5,0xeb,0xc1,0xd4,0x31,0x51,0xaa,0x3a,0x25,0x93,0x47,0x97,0x2,0xd1,0xcc,0x8f, + 0x0,0x5c,0xae,0x26,0x29,0x68,0xee,0x94,0xad,0x19,0x23,0xa7,0x8c,0x74,0x94,0x46, + 0x17,0x33,0xdd,0x7b,0xe3,0x2,0xed,0xc0,0xb3,0x46,0x30,0xdd,0x9c,0x28,0xd2,0x79, + 0x62,0xb0,0x8,0x8b,0x22,0x4,0x42,0x98,0xfd,0xd5,0xf,0xee,0x5d,0x99,0xaf,0xf, + 0x8b,0xf8,0x6a,0xc8,0x28,0xb2,0xe1,0x15,0x86,0x6,0xfd,0x88,0x25,0x88,0xc0,0xd9, + 0xa9,0xc7,0xc4,0xe0,0xb4,0x9b,0x58,0x78,0xcb,0x0,0x37,0x39,0xab,0x19,0x69,0xa7, + 0xb8,0x1c,0xc1,0xaa,0x87,0xc2,0x20,0x6b,0x10,0x8,0xd7,0xbd,0xda,0x6f,0x35,0x23, + 0x85,0xc4,0x13,0xd5,0x31,0x8d,0xfd,0xef,0xdf,0xbf,0x67,0xfd,0x27,0xbf,0xfc,0xda, + 0xe2,0x89,0x77,0x39,0x40,0x14,0x3d,0x68,0x13,0xf7,0x31,0x81,0x7,0xc4,0x9c,0x3d, + 0x6a,0x30,0x92,0x13,0x13,0x5b,0x85,0xc2,0x83,0xf9,0x4,0xa4,0xa9,0x3c,0xa8,0xda, + 0x4e,0xbf,0x3,0xa,0x8a,0xc8,0x15,0x46,0x40,0x43,0x8,0xdf,0x12,0xea,0x8e,0xa4, + 0x3c,0x70,0xef,0x1b,0xd,0x65,0xb0,0x19,0x85,0x87,0xc8,0xd9,0x64,0x9,0xa8,0xe4, + 0x59,0xd0,0x11,0xda,0x77,0xb6,0xea,0x9b,0xb0,0x4e,0x32,0x97,0x77,0xda,0x97,0xe4, + 0x19,0x2e,0xe,0x44,0x2f,0x48,0xb0,0x87,0xcd,0xfc,0x58,0xb,0x7d,0x56,0x70,0xd2, + 0x8a,0x96,0x42,0xa2,0xcb,0x8f,0x80,0xb4,0x1e,0xcf,0xb8,0xc0,0xe,0x88,0x6d,0x94, + 0xf4,0x75,0x8a,0x1d,0x72,0x79,0x6b,0x37,0xcf,0xd4,0xf6,0x75,0xf2,0x45,0x67,0x5a, + 0xd4,0x52,0x5d,0x41,0x1d,0xde,0xe2,0xfa,0x18,0xfc,0x50,0x74,0x41,0x80,0xba,0x5f, + 0x50,0xe7,0x84,0xe3,0x48,0x5,0x72,0xe2,0x3,0xd7,0xca,0x19,0x48,0x9a,0x6,0xe9, + 0xbe,0x52,0x20,0x6,0x3,0xdb,0xfa,0x65,0x3a,0x31,0x59,0xc4,0x9a,0xb0,0x9e,0xf3, + 0x98,0xcc,0x17,0x99,0xbf,0xae,0x3f,0x43,0x40,0xd1,0xef,0x7b,0x28,0x63,0x5d,0x5c, + 0x78,0xcc,0xe9,0xfe,0x54,0xd,0xb,0xa8,0xb5,0xb2,0x13,0x86,0x46,0xfc,0x6a,0x67, + 0x2e,0x74,0x8,0x2d,0xce,0x3,0x9d,0x6,0x68,0xe0,0x42,0x40,0xf6,0xf3,0x5e,0xd6, + 0xb6,0x7b,0x3e,0x3d,0x10,0xdd,0x1b,0xa5,0xdb,0xc1,0xe,0x64,0xc4,0x90,0x30,0xd6, + 0x45,0x9f,0xd3,0xab,0xf4,0xca,0x4b,0x77,0xda,0x32,0xa0,0xfe,0x1a,0xd2,0x24,0x81, + 0x41,0x95,0x60,0xab,0x66,0x4c,0x72,0x35,0xc4,0x62,0x0,0x66,0x56,0xfa,0x49,0xe8, + 0x7c,0x7b,0xb8,0xab,0x8a,0x5c,0xfd,0x49,0xce,0xc,0x8,0x48,0xaf,0xaf,0xc,0x3a, + 0x4b,0xa2,0x3b,0x63,0xbb,0x93,0xac,0xf8,0x38,0x53,0x1e,0x35,0x2,0xe2,0xf1,0x5a, + 0x72,0x3a,0x3f,0xd0,0x99,0xc,0xa3,0xa3,0xe8,0xbb,0xbb,0x49,0x5b,0xf5,0x0,0x8d, + 0xf0,0x50,0x5d,0xb,0xdb,0xb3,0x6,0xd9,0xd2,0x4a,0xf7,0x9,0x11,0x1f,0xe6,0x51, + 0xd2,0x41,0xf0,0x5b,0x6d,0x4e,0xef,0xa8,0x78,0xa9,0xce,0xbb,0x27,0x3,0x26,0xd6, + 0x17,0xa9,0x1d,0x16,0x88,0x15,0xee,0x70,0x15,0x45,0x70,0x20,0x64,0x4d,0x17,0x56, + 0xb5,0xec,0x7c,0xf8,0x96,0x88,0x62,0x10,0x77,0x4c,0x8e,0x89,0xa1,0xa0,0x59,0x8c, + 0x84,0x3,0xa2,0x7f,0x32,0x7,0xd8,0x96,0xc1,0xca,0xcc,0x16,0xd9,0xbf,0x1c,0x71, + 0x76,0x23,0xc4,0x9b,0xec,0xe5,0x9d,0x2d,0x3e,0x4d,0x2b,0xc9,0x4,0xd6,0x50,0x61, + 0x84,0x14,0x48,0xc2,0xa2,0x44,0x56,0x86,0xd6,0x52,0x6e,0x76,0xf0,0x5a,0x44,0xc9, + 0xc6,0x58,0x58,0x28,0x9b,0x53,0x14,0xbc,0xfb,0xa4,0x4a,0x12,0xfe,0x20,0xe6,0xad, + 0x59,0xa7,0xc3,0x55,0xcf,0xe5,0xac,0x42,0x31,0xf3,0x65,0xa4,0x83,0x33,0x1b,0x81, + 0x23,0x97,0x9,0xe1,0x4c,0xb5,0xb0,0x31,0x27,0x42,0xdb,0xa1,0x1a,0x1a,0x41,0x2a, + 0x2a,0xd1,0x8d,0x9e,0x3d,0x42,0xcf,0x18,0x61,0x8a,0xad,0x81,0x7f,0x7c,0x77,0xf, + 0xea,0x53,0x3,0x48,0xe6,0x11,0x18,0x20,0xde,0xc7,0xc1,0xae,0x14,0x13,0xd,0xe9, + 0xa0,0x14,0x18,0x3d,0x97,0x61,0x51,0xa4,0x64,0xa8,0xbf,0xb8,0x73,0xb5,0xb1,0x1f, + 0xcb,0x8c,0xbc,0x77,0x53,0x70,0x52,0xea,0xd,0xa3,0x0,0x65,0x3f,0x69,0x1c,0xfb, + 0x7f,0xf6,0x8c,0x10,0x70,0x94,0xfe,0xe7,0xf6,0xff,0xa8,0x3f,0x43,0x29,0x70,0x0, + 0x26,0x89,0x2a,0x7a,0xa0,0x73,0xd3,0x64,0xa6,0xe5,0x9e,0x1e,0xbd,0xed,0xad,0x24, + 0x4a,0x1e,0xb8,0x6a,0x86,0x1e,0x26,0x98,0xae,0xfd,0x91,0x24,0x5b,0x90,0xd2,0xf4, + 0xe0,0x84,0x7,0x84,0x1,0x0,0xb0,0x97,0x10,0x90,0x97,0xf4,0x45,0x2f,0x69,0x1e, + 0xf8,0xe4,0xeb,0x5f,0x5e,0x8c,0xa5,0xf7,0x1c,0xa1,0x74,0x5d,0x29,0x97,0x83,0xab, + 0x74,0x33,0x66,0xf3,0xfd,0x7e,0xfb,0x50,0x55,0x11,0xe3,0xe6,0x11,0x34,0xf7,0xbb, + 0x4e,0xdf,0x3,0x1e,0xf3,0xab,0x7a,0xbe,0xfc,0xf5,0x9b,0xf7,0xae,0xff,0xe3,0xdb, + 0x5e,0x59,0x46,0xf7,0xc8,0xf,0x27,0x4d,0xc9,0xf2,0x94,0x19,0x2d,0x2a,0x60,0xc2, + 0xf3,0x7e,0x40,0x3b,0x2b,0x29,0x93,0x7,0xdd,0xa6,0x1e,0x1c,0xf7,0xef,0x59,0xf1, + 0x25,0x30,0xb4,0x75,0xa,0x49,0xc4,0x78,0x7f,0x79,0x12,0xf8,0x2a,0x30,0x2b,0x35, + 0x36,0x17,0x78,0xa9,0x6b,0xd4,0x4a,0x5d,0x97,0x36,0x59,0xc7,0xfb,0x7a,0xf5,0xba, + 0x86,0xff,0xe3,0x8f,0xef,0xff,0xbb,0x7f,0xfc,0xb6,0x97,0x7f,0xe,0xa5,0xb4,0x3d, + 0x52,0xd7,0xf1,0xfe,0x7e,0xfb,0xcb,0xcb,0xfe,0x11,0x7d,0xdd,0x17,0x40,0xa8,0x8e, + 0x3,0xc4,0x39,0x1e,0x38,0x34,0x1d,0xab,0x9f,0xde,0x9f,0xbd,0x8f,0x89,0xb7,0x5b, + 0xd8,0x13,0x5d,0x7,0x60,0xa0,0xb4,0x11,0x97,0x9a,0xd,0xb1,0x27,0x30,0x3,0xc9, + 0xa3,0x8,0x4d,0xec,0x1e,0x8f,0xf3,0x44,0x4,0x67,0x2c,0x8,0xd7,0x84,0xf0,0xf0, + 0xd7,0x6f,0xde,0xb7,0xfe,0xe3,0xb7,0xbd,0xbc,0x30,0x5d,0x4f,0xca,0x39,0xd8,0x44, + 0x88,0x25,0xf8,0x15,0x50,0xc7,0xe1,0x24,0x7,0x85,0x6d,0x9b,0xfd,0x9e,0xfa,0x42, + 0xb6,0xd7,0x6c,0x9b,0x65,0x37,0x2,0xc2,0x4d,0x60,0x62,0xb2,0xa1,0xdd,0x5f,0xe4, + 0x4d,0x30,0x13,0x2d,0x8f,0xb3,0x34,0x72,0x5e,0x72,0x96,0xe1,0x89,0x1d,0xfe,0x24, + 0xd6,0xef,0x13,0x6d,0xc3,0x9,0xc5,0xad,0xb7,0x50,0x9c,0xe6,0x5b,0x36,0x93,0x65, + 0x4b,0x63,0x82,0x6d,0x9b,0x34,0x8d,0x93,0x2,0xa5,0x87,0x1a,0xc8,0x43,0xf5,0xa1, + 0x8d,0xb1,0xec,0xa6,0x6c,0x8a,0x56,0x80,0x25,0x4,0x7a,0x44,0xfb,0x8f,0x45,0x19, + 0xdf,0x9b,0x4,0x5b,0x70,0x80,0xfb,0x49,0xf4,0x31,0x83,0x8a,0x89,0x28,0x42,0x1e, + 0x61,0x36,0x68,0x9,0xb3,0xa0,0x9d,0x16,0x64,0x56,0x3,0x82,0xac,0xf,0xd4,0x30, + 0x73,0xdb,0x66,0x9d,0xd9,0xd0,0x26,0x2c,0xaa,0x3,0x2f,0xae,0xc4,0x9d,0xfa,0x47, + 0x6b,0x98,0x2b,0x4e,0x17,0x26,0x64,0xca,0x81,0xf4,0xf3,0xf7,0xb6,0xfa,0x5f,0xbf, + 0x79,0xef,0x4f,0xff,0x87,0x5f,0x78,0xe5,0xe7,0x36,0x46,0xcc,0x97,0x31,0xd8,0x93, + 0xf9,0x9f,0x33,0xa5,0x30,0xc3,0x2f,0x87,0x79,0x90,0x8a,0x46,0x74,0x50,0x60,0xd6, + 0x85,0x35,0xb8,0x7b,0x76,0x24,0xf3,0x5e,0xe1,0x98,0x3b,0x20,0xa5,0x88,0x25,0xcb, + 0x5c,0x90,0x77,0x2d,0xcf,0x25,0x79,0x62,0xdf,0x44,0x46,0xba,0x33,0x1a,0x14,0x44, + 0x5,0x8c,0xb3,0xc1,0x65,0xe,0x17,0x2c,0xd2,0xf6,0xd6,0x27,0x44,0xfe,0x3b,0x1c, + 0xb8,0xfd,0x6c,0x80,0x62,0x19,0xc6,0x88,0xc3,0x6d,0x26,0x5,0xca,0x89,0x85,0x98, + 0x75,0xf8,0xa0,0x2,0x8e,0x4a,0xf,0x23,0xfd,0xa,0xd4,0xcc,0x4d,0x5c,0x2,0xeb, + 0x53,0x71,0x42,0xf9,0xd7,0xcf,0xdc,0xb6,0xfd,0x9e,0x6c,0xac,0xdb,0xe1,0x61,0xe4, + 0x4,0xe5,0x8a,0x3a,0xb4,0xb1,0xee,0xdc,0x4a,0x87,0x5b,0x76,0x2e,0x23,0xef,0x5, + 0x24,0x8d,0x32,0xa2,0xc7,0x1f,0xf6,0xf7,0x8a,0x9d,0x3c,0x7,0x20,0x5b,0xde,0x90, + 0xc6,0x3,0xc,0x1e,0x4b,0x2a,0x8c,0x31,0xf9,0xb5,0xb9,0xca,0xdf,0x56,0xbb,0x1c, + 0x12,0x2b,0xa2,0x80,0x13,0x88,0x33,0xbe,0x83,0x23,0x61,0xa2,0x14,0x6a,0x6c,0xe, + 0xe1,0x3,0x63,0x53,0xec,0x90,0xf,0x40,0xd4,0x1e,0x44,0x57,0x6d,0xa,0x52,0x46, + 0x25,0xa1,0xcc,0x2,0xbf,0x3b,0x62,0x5b,0x26,0x67,0x31,0x8d,0x8d,0xb6,0x4d,0xe3, + 0xc3,0x5c,0x2,0xc3,0x13,0xe8,0x71,0xdb,0x66,0x60,0xda,0xf0,0x3b,0xb3,0xfe,0x94, + 0x83,0x30,0x0,0xfb,0xfb,0x9c,0x94,0x83,0xce,0x2d,0x36,0xdc,0xd2,0x40,0x4e,0xd5, + 0xba,0x78,0xae,0xe3,0x34,0xac,0x47,0xc0,0x19,0xe7,0xd8,0xe9,0x4,0x94,0x73,0x8f, + 0x8b,0x39,0x5c,0x43,0x3,0x7b,0xd1,0x67,0x31,0x58,0x8d,0xe7,0x6b,0x89,0x16,0x85, + 0x10,0x58,0x11,0x14,0xda,0x10,0x2a,0x2a,0xb8,0x74,0x25,0x54,0x18,0x60,0x32,0xfa, + 0x99,0xcc,0x7a,0x38,0x60,0x4a,0x5,0x83,0x19,0xaa,0x3c,0xda,0x5e,0xd8,0xbc,0x7d, + 0x2e,0x8c,0x8b,0x98,0xe9,0xe5,0xc5,0xe3,0xd3,0x31,0x22,0xb2,0xe,0x1e,0xe3,0x6, + 0x84,0x4a,0xa8,0xed,0x51,0xe,0xa0,0x3e,0x49,0x5a,0x5a,0xab,0xc8,0x79,0xb1,0xc2, + 0xb3,0x4f,0x92,0x63,0xe2,0xfd,0x10,0xe5,0x14,0x7d,0xac,0xa6,0xa4,0xbd,0x9f,0xc8, + 0x6c,0x63,0x25,0x60,0x30,0x5,0xd8,0xcd,0x6c,0xac,0x5b,0x8,0x50,0x4f,0xf2,0x49, + 0x8a,0x81,0x66,0xea,0x62,0xd5,0x3b,0xa,0x91,0xb9,0x52,0x0,0x9e,0x1d,0xef,0x15, + 0x87,0xb6,0x3,0x9c,0x93,0x43,0x12,0x41,0xd9,0x8f,0xd4,0x2,0xf5,0x37,0x20,0x7f, + 0x80,0x32,0x62,0x21,0x0,0xb3,0xad,0x1e,0xeb,0x6c,0x8b,0x5b,0xdb,0x64,0xe2,0x2c, + 0x56,0x54,0xa2,0xda,0x19,0x4b,0x2,0x3,0x63,0xf6,0x59,0x6b,0x60,0x80,0x17,0x33, + 0x75,0x8a,0xe7,0xea,0x3d,0x98,0x3b,0x57,0xf0,0xca,0x2,0x68,0xc5,0x2e,0x6f,0x7d, + 0x9e,0x9b,0x7a,0xc4,0x59,0xb4,0xdb,0x55,0xa0,0x23,0x8b,0x83,0xd3,0x21,0xe8,0x7c, + 0x5d,0xa3,0xb9,0x23,0x2,0x99,0xa0,0x6b,0x1d,0x91,0xc2,0x16,0x6d,0x8b,0xa3,0xf2, + 0xa1,0xa9,0x84,0x6c,0xf,0x41,0x5e,0x83,0xa3,0x13,0xa0,0xbb,0xc8,0xf6,0xcf,0x70, + 0xfa,0x19,0x46,0xa3,0xaf,0xe2,0x92,0x2d,0x36,0xb9,0x7f,0xe1,0xa1,0xc5,0xed,0x7e, + 0xe0,0x2e,0x69,0xba,0xbb,0xa7,0x74,0x90,0x84,0x24,0x25,0xf6,0x7e,0x60,0x9c,0xe1, + 0xd4,0xe6,0xec,0xc5,0x50,0xd1,0x8a,0x2d,0xd7,0x8e,0xe2,0xf7,0xd4,0x96,0xa9,0xcc, + 0x88,0x1d,0x66,0xb6,0xf9,0x48,0xa8,0x20,0x4c,0x2a,0x44,0xbc,0xe,0xed,0x17,0x78, + 0xe2,0x24,0xfb,0xd0,0x4c,0x98,0x14,0x61,0xe,0x16,0xaf,0xf0,0xdc,0xb1,0xe4,0xa3, + 0x1,0x22,0xd3,0x8,0x1a,0x7b,0xa9,0x10,0x42,0x3e,0x9f,0xa3,0x97,0xc1,0x4c,0xf8, + 0xd0,0x93,0xa3,0x11,0xa6,0x71,0x43,0x41,0x81,0x14,0x4f,0x3d,0xe5,0xf4,0xe3,0xfc, + 0xda,0x51,0xee,0xae,0x2e,0x6b,0x66,0x53,0xd5,0xaa,0x76,0x5f,0xff,0xe6,0x27,0xf7, + 0xae,0xff,0xfd,0x3f,0x7f,0x65,0x11,0x3f,0x60,0x98,0x54,0x1c,0x33,0x81,0x57,0x31, + 0x0,0x88,0xd5,0x17,0x6d,0x38,0x1,0x90,0x7,0x68,0xa0,0x80,0xb3,0xfa,0xef,0xb3, + 0xeb,0x8d,0x4f,0xb7,0x4e,0xac,0x75,0x95,0x26,0x13,0x90,0xd4,0xfc,0xde,0xce,0x82, + 0x1c,0xd0,0x2c,0x39,0x64,0x7b,0xe2,0x2e,0x56,0x37,0xb1,0x47,0xe,0x78,0x0,0x8a, + 0x20,0xd7,0x19,0x79,0xdc,0xe9,0x3a,0xc7,0x51,0x9e,0x37,0xf9,0x71,0x4,0x99,0xd0, + 0xee,0x6c,0xc6,0xb4,0x29,0x42,0x3d,0x75,0xd3,0x92,0xe0,0x52,0xe4,0x54,0x15,0x74, + 0x57,0xae,0x83,0xa6,0x34,0x1,0x9b,0x66,0x84,0x56,0x75,0xcd,0xde,0xa2,0xd0,0x4c, + 0xc5,0xb3,0x8a,0xea,0x97,0xf3,0x90,0xb5,0x49,0x3a,0xfa,0xdc,0x7,0x1d,0x41,0xea, + 0x94,0x35,0x3,0x10,0xaa,0x23,0xa5,0x61,0x8d,0x3,0x82,0xde,0xf,0x88,0x5a,0xe2, + 0x93,0x36,0xd7,0xdf,0xfe,0xe5,0x7d,0x3f,0xf5,0x36,0x40,0x2f,0xe3,0x33,0x58,0xf1, + 0xaa,0xad,0x21,0xe,0xee,0xe,0x4c,0x64,0x24,0x91,0x7c,0xad,0x7,0xde,0x60,0x52, + 0xcd,0x94,0x38,0x40,0xe8,0x22,0x23,0x9e,0xa8,0x89,0x2d,0xc8,0xbb,0x9a,0x6a,0x6a, + 0x4e,0x8d,0x80,0xc3,0x2c,0xa,0xc6,0xb1,0xb1,0xe6,0x90,0xdb,0x5f,0x13,0x39,0xe6, + 0xa2,0xf7,0x33,0x63,0x62,0x19,0xfd,0x1b,0x74,0xa,0x61,0x28,0x22,0x50,0x61,0xa1, + 0xbd,0x94,0xfa,0x31,0x4e,0x36,0xb7,0x5a,0x5d,0xd1,0x47,0x83,0xed,0x58,0x5d,0x19, + 0x26,0x25,0x98,0xf2,0xc,0xb0,0xaf,0xff,0xcd,0x5f,0xde,0xf7,0x53,0x81,0xce,0xc9, + 0xa1,0x6e,0x3a,0xff,0x64,0x17,0x39,0xe5,0xaf,0x7a,0xd4,0xe,0x8,0x3,0x41,0x9, + 0x3e,0x8,0x9d,0x87,0x34,0xae,0x63,0x61,0x7,0xb,0x3c,0x49,0xcc,0xa4,0x9f,0xbb, + 0xf3,0xc7,0x34,0x58,0x8f,0xe0,0x80,0x89,0x92,0xc9,0xc4,0xf7,0xc1,0x2,0x4f,0x79, + 0x18,0x37,0xc1,0xe,0xa8,0xaa,0xf9,0x66,0xb6,0xfc,0x93,0x17,0xff,0xdb,0xbf,0xfd, + 0xab,0xcb,0xff,0x29,0x76,0x7d,0x61,0xd6,0x3,0x74,0xef,0x44,0xf0,0xc8,0xac,0xa4, + 0xb1,0xa5,0x4f,0xe8,0xa,0x3,0x40,0xd0,0x96,0xc1,0xe6,0x9e,0x19,0x18,0xd2,0x51, + 0x45,0x12,0x6a,0x9c,0x51,0xdf,0xa2,0xba,0x26,0x66,0x26,0x41,0xfa,0xe7,0xa9,0x52, + 0x1c,0x54,0xda,0x78,0xa6,0x93,0xa6,0xa,0x90,0x2d,0x6,0x29,0x98,0x1c,0xe6,0x3a, + 0xe6,0x82,0xa7,0x4e,0x49,0xe7,0xa1,0x7b,0xca,0x4c,0x9b,0x72,0x9a,0xa7,0x4a,0x4d, + 0x94,0xbd,0x64,0xb6,0x4a,0x19,0x16,0x5,0xde,0x11,0x0,0x7d,0xa2,0x6a,0x15,0x9a, + 0xdf,0x9e,0xc1,0xb7,0x16,0x2a,0x40,0x26,0x35,0x3a,0xa9,0xea,0x38,0x57,0x68,0x84, + 0x7e,0x86,0x78,0x22,0x7,0xd2,0x30,0x3c,0x49,0x99,0xcf,0x4,0x16,0xba,0x7d,0x9e, + 0xe4,0xa0,0x4e,0x8,0x49,0xad,0xe0,0x54,0xab,0x9a,0xc1,0x7c,0x2e,0x49,0xa3,0xf9, + 0xe0,0xb2,0x23,0x88,0x4b,0xf8,0xa4,0xe,0x6f,0x95,0x1d,0x88,0xa2,0x2b,0x88,0x58, + 0x12,0x2f,0x6e,0xad,0xf8,0x81,0x86,0xd4,0x60,0x2a,0x15,0x7a,0xf0,0x37,0x37,0x7e, + 0x7e,0x36,0x3,0x89,0x4c,0xf6,0x7e,0xa4,0x56,0x40,0x67,0xe9,0xdc,0x49,0x98,0xd2, + 0x45,0xb8,0xf2,0xc4,0x1c,0xb4,0xec,0x87,0x4c,0xb6,0xb8,0x3d,0x38,0x6d,0x8d,0x61, + 0x7a,0x8d,0x82,0x5a,0x8f,0xc9,0x9f,0xa8,0x78,0xb0,0x68,0xab,0x6e,0x26,0x45,0xf4, + 0x16,0xc8,0xec,0x73,0xc4,0x56,0x7d,0xef,0x62,0x59,0xbb,0x42,0xb0,0xaf,0xf1,0x3c, + 0xf,0x7c,0x76,0xdf,0x46,0xc9,0x5d,0x3a,0x91,0x62,0x27,0xfc,0x30,0x6d,0xaf,0x55, + 0x35,0xb5,0x55,0x9,0xd7,0xce,0xb,0xba,0xb,0xf4,0x58,0x25,0x20,0x35,0x33,0x78, + 0x2c,0x5,0x3c,0x8,0x4c,0x2b,0xbc,0x7f,0xfd,0xab,0xfb,0x7e,0x9a,0x80,0x52,0xd, + 0x6c,0x23,0xc2,0x23,0x2a,0x29,0x1a,0xdb,0x9e,0x49,0xae,0x18,0x89,0xde,0x11,0xb8, + 0xe7,0xac,0x98,0xc6,0x3c,0x22,0x2a,0x24,0x3c,0x50,0xbc,0x4c,0xd,0x41,0x68,0x7b, + 0x40,0xf4,0xff,0x47,0xfb,0x80,0xe,0x31,0xea,0x68,0x7a,0x98,0xe6,0x45,0xfd,0xc2, + 0x21,0xd5,0xec,0x6e,0x39,0x48,0x43,0x46,0x61,0x76,0x0,0x5e,0x1f,0x9c,0xa0,0x42, + 0x74,0x80,0xc3,0xbc,0x20,0x73,0x7f,0x10,0xc1,0x12,0x76,0xd0,0x3d,0xe,0xa5,0xc0, + 0x52,0xc7,0x92,0xd7,0x3,0xb2,0x58,0xd7,0x21,0xcb,0xdf,0xa8,0x4b,0x50,0x80,0x19, + 0x79,0xa1,0x27,0x5,0xc5,0xc7,0xf9,0x5f,0x34,0x1a,0xba,0x6f,0xde,0xba,0xc,0x9c, + 0x64,0xd6,0x73,0xd9,0xd3,0x58,0xb0,0x8c,0x47,0xb8,0x67,0xbb,0x3e,0xe9,0xa8,0xb2, + 0x2a,0x52,0x10,0x82,0xe7,0x7c,0xaa,0x9f,0x81,0x91,0x2d,0xa4,0xe2,0xc6,0x29,0x7e, + 0xf2,0xe8,0x2b,0xc2,0xf4,0xdd,0x3,0x6a,0x3e,0xe8,0x37,0xc0,0x85,0x2a,0x3e,0xa6, + 0x61,0x3c,0x60,0x19,0x5d,0x69,0xa6,0x17,0x7a,0xf3,0x43,0x6f,0x87,0xfc,0xa8,0xd0, + 0x23,0x77,0x39,0x7c,0xa5,0xe8,0x57,0xb,0xe7,0xe9,0xd7,0x98,0x4f,0x4d,0x6c,0x3e, + 0x29,0x93,0x16,0x60,0x14,0x2,0xa9,0xbf,0x1f,0x97,0xe0,0x76,0xf0,0x98,0x37,0xfb, + 0xc,0x58,0x96,0xaa,0x1b,0xe8,0x48,0x5e,0x2a,0xa0,0x20,0x3c,0x11,0x32,0x3a,0xef, + 0xed,0x1f,0x4,0xb1,0xfd,0x40,0xf4,0x4f,0x9c,0x64,0x9b,0x4b,0xba,0x6,0xa0,0x11, + 0x2c,0x53,0xd9,0x74,0x4b,0x60,0x7a,0x98,0x79,0xad,0xa4,0x70,0xa0,0x98,0x54,0x3a, + 0xca,0x5c,0x1d,0xea,0xe0,0x3e,0x4c,0xe8,0xfb,0xac,0x7,0x8e,0x89,0xaa,0xd8,0xc, + 0xd1,0xeb,0x31,0xb0,0x4d,0x14,0x4,0x9a,0xc6,0xc4,0xcc,0xf5,0x2a,0x11,0x60,0xa5, + 0x12,0x9e,0x85,0xe9,0xcc,0x1f,0x89,0xc9,0x13,0xa0,0x43,0x7d,0xdf,0x2c,0x7d,0x97, + 0x3d,0x6,0x96,0xd1,0xaf,0x9f,0x16,0x41,0x35,0xc8,0x93,0xeb,0x60,0x1f,0x64,0xf6, + 0x4b,0x2e,0xdc,0xa6,0x3,0xcf,0x43,0xad,0x1e,0x62,0xc9,0x79,0xc8,0xb3,0x69,0x7, + 0x98,0xde,0xd5,0xf7,0x58,0x99,0x1c,0xcc,0xee,0x7b,0xc7,0x16,0xfb,0xa1,0xb8,0x51, + 0x79,0x86,0x7a,0x58,0xef,0x54,0x1,0xf,0xc6,0x1c,0x40,0xec,0x94,0xb9,0xa5,0x76, + 0xba,0x4,0x1d,0x4f,0x2,0xfa,0x81,0xd9,0x30,0xd9,0x98,0x9,0xcc,0x8,0xa4,0x45, + 0xec,0x93,0x4e,0x9e,0xcd,0xf4,0x14,0xa9,0xa9,0x40,0x5d,0xb5,0xb4,0x10,0xd3,0x25, + 0x23,0x19,0x5d,0x8c,0x25,0xb1,0xb9,0x8e,0x17,0x6c,0x42,0x29,0x29,0x60,0xfa,0x98, + 0x6f,0xfb,0x5a,0x19,0xce,0x89,0x9e,0x5a,0x83,0xbd,0xa0,0x35,0x5,0xb5,0x10,0xe6, + 0x6b,0xdf,0xd3,0x8a,0x38,0x22,0x50,0xd7,0xcc,0x40,0x74,0x4,0xe9,0xac,0x5d,0xe0, + 0xfc,0x9a,0xac,0xa6,0x0,0x55,0x71,0x70,0xd9,0xdc,0xaa,0x48,0x68,0x14,0x48,0x60, + 0x6a,0x15,0xe6,0x60,0x70,0x58,0x3a,0x3c,0xa3,0x2e,0x1,0x3c,0x6,0x38,0x40,0x64, + 0xa9,0xd3,0x77,0xf3,0x9a,0x2a,0xd7,0x44,0x63,0x40,0xab,0x4b,0xd,0xe4,0xde,0xd7, + 0x90,0x37,0x14,0xe0,0xd6,0x1c,0x1,0xea,0x3d,0xa8,0xf3,0xf8,0xfd,0x53,0x37,0x77, + 0xf,0xb2,0xd0,0xbe,0xe3,0x6,0x1b,0x53,0x6d,0xe0,0x45,0x54,0x98,0xcb,0x65,0x2f, + 0x92,0x38,0x18,0x20,0xff,0xf6,0xd3,0xff,0xf8,0xc0,0xda,0x35,0x4,0xda,0x78,0xd, + 0x3a,0x82,0x60,0xbd,0x11,0x4,0x1d,0x83,0xa1,0x97,0xe2,0x13,0x4c,0x98,0x5,0x96, + 0x97,0xa9,0x6e,0x8,0x60,0x7f,0xf7,0xd7,0xf,0xac,0x27,0x65,0x3,0xb9,0x4a,0x8c, + 0xa6,0x20,0xd6,0xb9,0x73,0x3e,0xdb,0xa5,0xbd,0x82,0x33,0x9b,0x88,0xbf,0x84,0x80, + 0x23,0x4b,0x10,0x73,0xb5,0x27,0x44,0xfa,0x91,0xb4,0x6b,0xc8,0x58,0x22,0x98,0x51, + 0xa4,0xd6,0xa9,0x4f,0xcc,0x2f,0x8,0x41,0xd8,0x67,0x97,0xb4,0x81,0x60,0x87,0xdc, + 0xe1,0x92,0x84,0x6e,0xba,0x7f,0x73,0xca,0x4a,0x6b,0x2b,0x86,0x20,0x57,0x3b,0x21, + 0x5a,0xcb,0x7,0xb4,0xab,0xc7,0x5c,0x70,0x2a,0x57,0xa0,0x80,0xb,0xc4,0x59,0x9e, + 0x85,0xf9,0x8c,0x67,0xc5,0x86,0xd0,0x26,0x81,0x7,0x4d,0xfd,0x80,0x12,0x47,0x9a, + 0x11,0x28,0x98,0x6b,0x48,0x7f,0xc6,0xb6,0xcb,0xc4,0xaf,0x3b,0x72,0x8b,0x63,0xb, + 0xc0,0x19,0x44,0xc9,0xc6,0x11,0x2e,0xec,0x9,0xd6,0x27,0xef,0x7a,0x3,0x1e,0x2a, + 0x14,0xee,0x8a,0xf6,0x4a,0x4,0xb0,0x83,0x2d,0x77,0x3a,0xbd,0x7a,0xcb,0x19,0x74, + 0x18,0x84,0x52,0x7f,0x56,0x59,0xb6,0xa0,0x4a,0x23,0x11,0xc7,0x1,0x10,0xaa,0x80, + 0x20,0x26,0x9e,0x6,0xd8,0x42,0x75,0x65,0x66,0x5b,0xa5,0xef,0x15,0xdf,0xf,0xbc, + 0xd2,0x79,0x75,0xce,0x55,0x83,0xef,0x41,0xc9,0xf3,0x56,0xd8,0x8f,0x57,0x1e,0xf3, + 0x71,0xc5,0x39,0x10,0xb5,0xa3,0x9d,0x24,0x9d,0x11,0x6,0xa2,0x36,0xd0,0x55,0x68, + 0xf5,0x3,0x80,0x87,0xe3,0x1b,0x0,0xa2,0xb0,0xda,0x80,0x1d,0xfa,0xb4,0x10,0x94, + 0x6b,0x61,0x34,0x7d,0x71,0x55,0xa4,0x83,0xf2,0x8b,0x77,0x1e,0xb2,0x3b,0x77,0x77, + 0x48,0xf5,0x31,0xc,0xee,0x28,0xf1,0x6c,0xc9,0x57,0xb7,0xb0,0x68,0xe,0x95,0x5e, + 0xe7,0xc1,0x7d,0x48,0xcc,0xdd,0x38,0xef,0x52,0x1,0xc,0x1a,0xa6,0x71,0x42,0x10, + 0x62,0xec,0x87,0x39,0xb,0x61,0x45,0x76,0x41,0xcd,0xcc,0x46,0xf0,0x35,0xa9,0x28, + 0xe1,0x3d,0x91,0x34,0xc9,0xd4,0x24,0xb1,0x38,0x78,0x72,0x14,0x53,0xc8,0x50,0x93, + 0x54,0xe0,0xce,0x5a,0x1,0x8a,0x6a,0x1a,0xf5,0xbb,0xdc,0x4,0x51,0x40,0x18,0xf, + 0x33,0x2b,0x38,0x51,0xbc,0x25,0x93,0xcd,0x5d,0x2d,0x60,0x20,0x64,0xd,0xc,0x21, + 0x38,0xa4,0xce,0x87,0xf,0x3e,0xc4,0x98,0xa0,0xef,0x4f,0x15,0x65,0x50,0x3e,0xe0, + 0xee,0x26,0x92,0xf5,0x5,0x49,0x42,0x3d,0x96,0x2,0xed,0x1f,0x7c,0x54,0x4c,0xec, + 0xd2,0xc9,0x8c,0x4,0x19,0x31,0x3b,0x59,0xa8,0x3a,0x48,0x82,0x9b,0x92,0x2c,0x2e, + 0x6e,0x88,0xc2,0xb6,0x2f,0xaa,0x50,0x24,0x89,0x33,0x69,0x3e,0x82,0xb5,0x79,0x54, + 0x64,0xc5,0x9e,0xe4,0xc6,0xa4,0x7a,0x2d,0x8f,0xc,0x24,0x9,0x57,0x4a,0xcf,0x5f, + 0x83,0xaa,0xc8,0x17,0xf8,0xa4,0xfd,0x66,0x41,0x95,0x29,0xcd,0xb1,0x7c,0x54,0x54, + 0x2,0x15,0x53,0x64,0xe1,0x68,0xed,0x13,0x29,0xce,0x27,0xa9,0x79,0x6c,0x93,0x26, + 0x70,0x3,0x9b,0xda,0xab,0xfd,0x1f,0x62,0x10,0xea,0x46,0xf,0x16,0x84,0x41,0x3c, + 0x74,0x2e,0x6c,0x2e,0xfb,0x38,0x5,0xae,0xa0,0x7b,0x0,0xc8,0xf7,0xf4,0xd9,0x20, + 0x26,0x2a,0x81,0x4c,0x3a,0xa2,0x9,0xb0,0x91,0xdb,0x79,0x59,0xfe,0xd0,0x6c,0x32, + 0xfd,0xc,0x41,0x9c,0x38,0x94,0x8,0xe8,0xf0,0x78,0x8f,0x1c,0x53,0xd8,0xa9,0x3a, + 0xc5,0xe5,0x68,0x6,0x8f,0x5a,0x29,0x41,0xb3,0x5b,0x14,0xbc,0x8a,0xa9,0x71,0xc4, + 0x68,0x81,0x52,0xe6,0x2c,0xc3,0xaf,0x1e,0x80,0xe3,0xf3,0x2a,0x40,0x1a,0x95,0x60, + 0x40,0xfa,0x40,0xe5,0xb7,0xb3,0x84,0x5a,0x5d,0x43,0xff,0xf0,0xd3,0x87,0xff,0xc1, + 0x7,0x8f,0x73,0x46,0x2f,0x41,0xe,0x8a,0xa0,0x34,0x21,0x2,0x28,0x83,0x3e,0xbb, + 0xbb,0xab,0x70,0x71,0xc1,0xe6,0x8c,0x64,0x6a,0xd5,0x79,0x6f,0xc3,0x93,0x86,0x3d, + 0xfb,0xb5,0xef,0x20,0x24,0xef,0x65,0xda,0x46,0xa9,0x79,0x1a,0x3a,0x39,0xeb,0x78, + 0xd4,0xf1,0xb,0xe4,0xbc,0xe0,0x6e,0x8,0x40,0x15,0xec,0x28,0x1b,0xdc,0x52,0x67, + 0x8e,0xf1,0xe5,0xd6,0x50,0x51,0x4e,0x87,0x60,0x4,0x10,0xa9,0x6b,0x1,0xeb,0xf1, + 0xf,0x97,0x41,0x4d,0xf0,0xf7,0x68,0x5e,0xc7,0xce,0x2e,0x79,0x24,0xa,0xe0,0x51, + 0xe8,0xe,0xa2,0x5f,0x3f,0x18,0x22,0x3b,0x46,0xa1,0xdf,0xcb,0x1e,0xaf,0x20,0x6a, + 0x71,0x3,0x4f,0xc4,0xb8,0x9c,0x8a,0xb3,0xd8,0xdc,0x19,0xc8,0xc5,0xdd,0x84,0x58, + 0x98,0x8c,0xa8,0xec,0x13,0x0,0xe1,0x8,0x56,0x81,0x2e,0x25,0x75,0xf,0x42,0xd5, + 0x6e,0xd3,0x52,0x66,0xb4,0xaf,0xbd,0x32,0xce,0x7a,0xc8,0x6a,0x53,0x1a,0x1f,0xad, + 0xf2,0x80,0xf3,0xcc,0xa3,0xfd,0x5e,0xdc,0x23,0x69,0x8b,0x5b,0x7,0xe5,0x99,0x59, + 0x39,0x89,0xb4,0xf3,0x9,0x3,0xe2,0xd8,0x93,0x38,0x6b,0x8d,0x23,0x67,0x41,0x6b, + 0xa3,0x21,0x39,0xa5,0xbe,0xbe,0x37,0xd4,0x44,0x61,0x6f,0x73,0x77,0xea,0x96,0x41, + 0x24,0x37,0x7,0x62,0xd3,0x6d,0xf3,0xd4,0x85,0x87,0x71,0x3f,0xc7,0x6c,0x2a,0x13, + 0x1b,0xd0,0xf2,0xc8,0x66,0x3b,0xc2,0x14,0x41,0x80,0x32,0x63,0x3e,0x7b,0x47,0x88, + 0x49,0x59,0x7e,0x4f,0x4d,0xa6,0x82,0xa0,0x9e,0x99,0xc1,0x4e,0x86,0x8e,0x9f,0x5, + 0x8,0x36,0xf3,0xfd,0x7a,0xdb,0xf2,0xef,0xff,0xe6,0x81,0x35,0x7d,0x55,0x4e,0xeb, + 0xe1,0x73,0x34,0x8c,0xa4,0x60,0x5a,0xe5,0xc5,0x18,0x18,0x65,0xa,0x15,0x34,0x8f, + 0x24,0x7a,0xe3,0x52,0xe1,0x21,0xa6,0x90,0x7,0xfa,0xc3,0xa9,0x77,0x30,0xe,0x91, + 0x83,0x96,0xae,0xc8,0xf6,0xe1,0x13,0x2d,0x6b,0x46,0x9d,0x32,0xf,0xff,0x16,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xfb,0x44,0x4a,0xd0,0x66,0x12,0xb7,0x1e,0xf8, + 0xe1,0x2c,0xab,0x9a,0x6d,0x80,0x42,0x1a,0x9e,0xf5,0xcc,0x59,0xe5,0x29,0x51,0x1f, + 0xa6,0x36,0xe1,0x59,0xb8,0x67,0xc4,0xe6,0x22,0x46,0x35,0xa9,0x11,0xca,0x98,0x81, + 0x30,0xef,0x53,0x5a,0x9a,0x7,0x8d,0xf5,0xb1,0x7d,0xfc,0x60,0x8d,0xa4,0xb3,0x6a, + 0x0,0xd2,0x95,0xc9,0xf3,0x7c,0x25,0xcf,0xf5,0x4d,0x6,0xea,0x54,0x2,0xf6,0xf7, + 0xeb,0xe5,0xbf,0x93,0x24,0xa7,0xa0,0xb7,0xf7,0xda,0x41,0x47,0x17,0x9,0xb6,0x14, + 0xad,0x3f,0xda,0x69,0xd3,0xee,0x15,0x4,0x47,0x6b,0x88,0xa4,0x9c,0xa0,0xd5,0x36, + 0xd8,0x8c,0x44,0x9c,0xb,0x67,0x92,0x24,0xed,0x34,0xdf,0xd1,0xb0,0x3,0x67,0x5c, + 0xb9,0x5d,0xc3,0x72,0x7b,0x6f,0x45,0xec,0xaf,0x19,0xcd,0x83,0xc6,0xab,0xde,0x3b, + 0xbb,0xa5,0x7a,0xdc,0x36,0x2c,0xd1,0x9e,0xc9,0xf8,0xb6,0x8d,0xa9,0x34,0x8,0x6d, + 0x12,0x30,0x5a,0x1e,0x93,0x7c,0xb9,0xa1,0x1,0x9b,0x50,0xd0,0x23,0x69,0xa1,0xca, + 0xc9,0x89,0xd9,0xe5,0x34,0xe2,0xf0,0x19,0xcd,0x2f,0x36,0x2b,0x68,0x3f,0x4f,0x45, + 0x6c,0x41,0xa,0xdf,0xde,0x45,0x38,0x10,0xf5,0x73,0x99,0x2a,0xe5,0x11,0xbf,0x40, + 0x6b,0x8b,0xaa,0x14,0x9a,0x16,0x70,0xc7,0xc8,0xec,0x1f,0xfd,0xdc,0xb,0xff,0xdd, + 0xdf,0xff,0xdd,0x43,0xff,0xa9,0xe6,0x80,0xca,0xa7,0xf0,0x96,0x4,0x94,0x9d,0x7d, + 0x60,0xde,0x2b,0x47,0x99,0x7f,0x23,0x4a,0x59,0x93,0x7e,0x22,0x2c,0x94,0xab,0xa3, + 0xdd,0x4e,0xaf,0xd7,0xd9,0x6,0x2,0xef,0xa9,0x26,0x5a,0xe8,0x9d,0x28,0x1a,0x6e, + 0xdb,0xc4,0x8b,0x3,0x89,0xfb,0xa3,0xa3,0x2,0x2,0x99,0x82,0x48,0xd,0x56,0x5d, + 0x1f,0x25,0xf1,0x6a,0x47,0x87,0x94,0x67,0xce,0x76,0xb1,0xe0,0xc0,0xde,0xb4,0x15, + 0x50,0x33,0xa,0x6b,0xd8,0x90,0x7e,0xcd,0x27,0xea,0xcd,0xf0,0xa0,0x8b,0x3f,0x2, + 0x41,0x4f,0x44,0xf6,0x31,0xdd,0xb8,0x58,0xef,0x83,0x75,0xc2,0xd,0xf8,0x20,0x8c, + 0x90,0x61,0xb1,0xa2,0x8b,0x38,0xfd,0xa,0x3c,0x79,0x8b,0x85,0x9f,0x82,0x3d,0xd, + 0x38,0x3c,0x33,0x22,0xe0,0x6f,0xca,0x92,0x3c,0xc8,0x9c,0x4b,0x81,0x49,0x3e,0x29, + 0xe,0x49,0x14,0x4e,0x4a,0x55,0xba,0x85,0x71,0x56,0x44,0xa4,0xcf,0x48,0x12,0xc8, + 0x5d,0x5d,0xa5,0x47,0x5,0x94,0x1,0xe2,0xe2,0x88,0x63,0xf3,0x20,0x54,0xe3,0x18, + 0xa8,0x3e,0xf9,0x42,0x63,0x6,0x99,0x58,0x7a,0x3d,0x98,0x53,0x68,0xa,0x49,0x86, + 0x36,0xbe,0x7d,0xcc,0xa7,0x29,0xff,0x43,0x0,0x3f,0xb1,0xfe,0xfc,0x30,0x98,0x71, + 0x8b,0xfe,0xea,0x49,0x44,0x7f,0x96,0xcb,0x94,0x9,0xfd,0xa1,0x78,0x32,0x9e,0x41, + 0x60,0xae,0x7b,0xd8,0x16,0x46,0x1d,0xb,0xb,0x57,0xdb,0x9c,0xb6,0x92,0xcc,0x25, + 0x4b,0x10,0x12,0x10,0xae,0x7f,0x27,0xfe,0x79,0xa4,0xa7,0x10,0xa7,0xbf,0x83,0x6e, + 0xa3,0x91,0x4c,0x18,0x20,0x7a,0x43,0xbd,0x7a,0x18,0xe5,0xf4,0x4,0x77,0xb4,0x19, + 0x1d,0xd9,0xbc,0xa5,0xbd,0xdd,0x3f,0xfc,0xf4,0xf2,0x6a,0xb2,0xf1,0x18,0xcb,0xe0, + 0xed,0xff,0x74,0xf4,0xcb,0x5e,0x2,0x4c,0xdb,0xea,0x3f,0x83,0x6a,0xd1,0x0,0x88, + 0x92,0x32,0x4e,0x33,0xd4,0x7e,0x3b,0xca,0x88,0x62,0xd,0x50,0xd4,0xc1,0x2b,0xc5, + 0x85,0x9b,0xd8,0xb,0x62,0xaf,0x8f,0x9d,0xf3,0xec,0x50,0x6,0x9,0xc6,0xd8,0x1b, + 0x86,0xa6,0xcb,0x66,0x74,0xb5,0x6b,0x6f,0x8d,0xd4,0x3a,0xf0,0x4,0xd7,0x1a,0x2d, + 0xf0,0xef,0x43,0x5e,0xab,0xfc,0x26,0xf8,0x56,0xf1,0x6f,0x80,0xd9,0x36,0x66,0xc6, + 0x40,0x41,0xff,0x1c,0x47,0xe0,0xb3,0x33,0xc8,0x5a,0xf1,0x4,0x28,0x10,0x14,0xa3, + 0x1b,0xb,0x2e,0xd6,0xe0,0x1,0xef,0x2c,0x2,0xa2,0x7f,0xc1,0x87,0xd6,0x7d,0x17, + 0x94,0xf4,0xa2,0xa3,0x2d,0x1b,0x53,0xd3,0x74,0xde,0xd8,0x6c,0x34,0xc5,0xf5,0x60, + 0xa7,0xe2,0x35,0x62,0xac,0x27,0x1c,0x88,0x8b,0xf4,0x34,0x57,0xce,0x45,0x56,0xb3, + 0x7,0xa8,0x75,0x8f,0xb1,0x5b,0xdb,0xca,0x5,0xd,0xa4,0xe5,0x0,0x3d,0x4,0x90, + 0x20,0x69,0x1f,0xeb,0x29,0x90,0x66,0xdb,0x74,0x87,0xd6,0xf7,0x92,0x7d,0x4a,0x64, + 0xc3,0x3d,0x3b,0xea,0xac,0x49,0xc,0x3b,0x54,0xce,0x76,0xc0,0xc5,0x3b,0xe9,0x2c, + 0x83,0x7b,0xc3,0x3,0xdb,0xd1,0xe5,0x55,0x26,0x8,0xe1,0x46,0xcd,0xac,0xd0,0x8c, + 0x50,0x47,0x4c,0x4c,0x65,0x90,0xdc,0xc7,0x50,0x4e,0x14,0x1d,0x37,0xa5,0xee,0x9f, + 0x5b,0x1,0xe2,0xb1,0x41,0x73,0x65,0x95,0xa5,0x2f,0x0,0x86,0x2f,0xb2,0x52,0x52, + 0xcd,0x64,0x9c,0x47,0x4c,0xe7,0x81,0x8a,0xea,0x18,0x13,0x93,0x74,0xc4,0xb8,0x2e, + 0x14,0x7e,0x68,0x92,0x3a,0xa0,0xf7,0xcf,0xe6,0x63,0x41,0xb,0x78,0x8a,0x45,0xec, + 0x94,0x46,0xc6,0x6,0xc5,0xf1,0xb0,0x5b,0xf0,0x96,0x8,0x37,0xd1,0x61,0xd1,0xf5, + 0x6b,0xca,0x43,0x8f,0x88,0x40,0x9f,0x60,0xf1,0xb9,0xd,0x16,0x47,0xb5,0x9e,0x44, + 0x50,0xb4,0xbd,0xee,0x82,0xf9,0x8e,0xb3,0x75,0xed,0x21,0x6b,0x55,0xe4,0x4,0xd9, + 0xcf,0x3e,0x8f,0xe0,0xd1,0x6c,0xb1,0xe4,0x84,0xa6,0x9e,0xb4,0x41,0xd3,0x4b,0xdc, + 0xd9,0x4c,0xdc,0xd4,0x10,0x38,0xf6,0xa3,0xaa,0x74,0xb9,0xf3,0x3e,0xf3,0xc8,0x5, + 0xb9,0xea,0x90,0x9e,0x70,0xb4,0xe7,0x92,0x81,0x4f,0x3d,0xc9,0xc1,0x7c,0x78,0x36, + 0x99,0x41,0x64,0xd,0x58,0x4e,0x3c,0xc2,0xb3,0xeb,0x89,0x80,0xab,0xcc,0x2b,0x3f, + 0x13,0xd1,0xca,0xe6,0x83,0xdd,0x54,0x45,0x6c,0xa,0x46,0x4e,0x92,0x3,0x8,0x5d, + 0x17,0x74,0xfd,0x7e,0x49,0x3,0x3c,0x9a,0xe8,0x98,0xf9,0x84,0x26,0x2a,0x6a,0xb3, + 0x86,0x9,0xe7,0x3e,0x6b,0x53,0x77,0x51,0x8e,0x82,0xd0,0xda,0x1e,0x6d,0x76,0x77, + 0x58,0x29,0xf4,0x76,0xdd,0x3a,0x9b,0xad,0xb1,0xc6,0xe1,0x59,0xcf,0xb8,0x2c,0x98, + 0x50,0xcc,0xa,0xcd,0x36,0xb9,0x95,0x4f,0x18,0xa,0x24,0x7d,0x6f,0xea,0x68,0xf9, + 0x84,0xd6,0xd4,0x27,0xa7,0xb4,0x39,0x5a,0x38,0x74,0xdf,0xbc,0x5e,0x17,0x29,0xd0, + 0x44,0x1e,0x39,0x71,0x74,0xea,0x17,0x75,0x3a,0x40,0x77,0x4a,0xb0,0x53,0x22,0xd3, + 0x6,0x9f,0x1e,0xcb,0x5b,0xed,0x16,0xa1,0x20,0x98,0x4d,0xec,0x32,0x5d,0x3d,0x20, + 0xb5,0xe9,0x14,0xa8,0x8a,0x1c,0xf,0xa5,0xa0,0x65,0xb5,0x4,0x70,0x6b,0x78,0x8, + 0x46,0xee,0x93,0xc5,0xa2,0x47,0xdd,0xbf,0x19,0x1a,0x19,0x85,0x44,0x62,0x1a,0x80, + 0xb4,0xa0,0x8d,0xf2,0x8a,0xb3,0x54,0x6c,0x8b,0xb5,0xb1,0xfa,0x72,0x63,0x3d,0x55, + 0x27,0xf6,0x40,0x6b,0xe9,0x76,0x68,0xb,0xc5,0x20,0x61,0x34,0xf4,0x46,0x55,0x19, + 0x2b,0xd6,0xe5,0x80,0xa9,0x6b,0xbf,0x40,0xfd,0x24,0xb5,0xb0,0xe9,0x53,0xdb,0x42, + 0x7a,0x5,0x4,0x46,0xc0,0x0,0x85,0x81,0xa,0xf2,0xa,0x8e,0x24,0x9,0xd0,0x13, + 0x85,0x3a,0xc0,0xc0,0x18,0x29,0x17,0x84,0x60,0x2,0xe9,0x60,0xee,0x2,0xe1,0x35, + 0x79,0xec,0x31,0x48,0x3b,0x89,0x8a,0x70,0x18,0xb4,0xb5,0xd1,0x99,0x2a,0xda,0x52, + 0xe5,0xfe,0xbe,0xf5,0xa4,0x61,0x8,0x93,0x7b,0x17,0xb9,0x45,0xcf,0xf8,0xd,0xd, + 0x1f,0x52,0xf1,0x12,0x64,0x10,0x27,0xce,0x2f,0x30,0xaf,0x6a,0x14,0x95,0xaa,0x51, + 0x8b,0x1b,0xa7,0xc4,0xba,0xae,0x7f,0x36,0xe3,0xf0,0xc9,0x5c,0x58,0x5a,0x43,0x2e, + 0xe0,0xd5,0xa8,0xa5,0xcf,0xb6,0xe1,0x48,0x88,0xfa,0xb0,0xeb,0x41,0x40,0xf2,0x30, + 0xd0,0x27,0x31,0xb7,0x68,0xf7,0x1c,0xcb,0x3a,0x6,0xe5,0xb5,0xdf,0x3b,0xc9,0xcf, + 0x51,0xfc,0xbe,0x63,0xac,0x53,0x7f,0x3,0x55,0x98,0xe2,0x56,0x6c,0x74,0xea,0x3, + 0x8b,0xf0,0xc6,0xee,0xae,0xfa,0x9e,0xb,0xad,0xd,0x1,0x34,0xe7,0x6c,0x43,0xa, + 0xe1,0x3d,0xf6,0x76,0x9,0xdb,0xef,0xa5,0xf1,0x46,0x16,0x78,0x1,0x45,0x24,0xf, + 0x8d,0x5a,0x31,0x98,0x89,0x22,0x25,0x51,0x9a,0xd6,0xc7,0x2c,0x2d,0x66,0xaf,0x48, + 0xc6,0x2c,0x38,0x60,0x10,0x45,0xde,0xdb,0xe4,0xe1,0x1d,0x49,0xbd,0x9e,0x44,0x17, + 0x4c,0x54,0x9c,0x34,0x2f,0xd1,0x56,0xb3,0x4d,0xa4,0x49,0x33,0x4c,0x69,0xb4,0x8a, + 0x98,0x22,0x12,0x7b,0x33,0x1e,0x67,0xe1,0x4d,0x1,0xce,0x4d,0xb2,0xc9,0x9c,0xe8, + 0x79,0x0,0xfa,0x50,0xfb,0x4d,0x78,0xcf,0xc1,0x6b,0x5d,0x12,0x47,0xae,0xe0,0x3d, + 0x89,0x31,0x52,0x2,0x1,0x91,0x47,0xec,0x1,0xa7,0x7d,0xaf,0x12,0x20,0x59,0x30, + 0x52,0x7d,0x34,0xc3,0x89,0xe1,0x34,0xdd,0x3,0x52,0x4f,0xd1,0x6a,0x71,0x39,0xa8, + 0x32,0x6a,0x58,0xcd,0xf3,0x81,0xf1,0x7c,0xf6,0xf6,0x73,0x10,0x90,0x90,0xa4,0xc5, + 0x67,0x1c,0xca,0xbd,0xa8,0xb6,0xcd,0x87,0x73,0x85,0x7b,0xd,0x9e,0x8e,0x1,0xe3, + 0xdf,0xd3,0xc5,0x6d,0x7f,0x1e,0xc5,0xb,0xd3,0xfa,0x3b,0xf9,0xb2,0xd4,0xb5,0xb6, + 0xb9,0x3b,0x8a,0x61,0x17,0xad,0xe1,0x13,0x63,0x7f,0x29,0xef,0x9,0x38,0x82,0x4e, + 0x2c,0x45,0xb1,0x1e,0x58,0x4b,0x74,0x19,0x19,0x1a,0x70,0x60,0x24,0x81,0x66,0xd7, + 0x5c,0xbe,0x7b,0x72,0x44,0x46,0x50,0x81,0xe,0xb2,0x94,0xed,0xf0,0x2b,0x31,0x8, + 0xb6,0x9e,0x50,0xe1,0xa3,0xc3,0x32,0x25,0xad,0xc6,0xfb,0x1e,0xa1,0x6b,0x4,0xa3, + 0xb6,0x68,0xe9,0x43,0xe5,0xfa,0x9b,0x5,0x70,0x77,0x1f,0x15,0x68,0x17,0x71,0x18, + 0x5d,0x41,0xa6,0x42,0xb6,0x84,0x40,0x47,0x38,0x66,0xd8,0x1c,0xa9,0xe2,0x6d,0x95, + 0x38,0xe1,0x3a,0x6a,0xc0,0x6,0x3c,0x2,0x61,0x46,0x4f,0xa9,0xd3,0xce,0xaa,0x7c, + 0xd0,0xc0,0x66,0xd,0x4d,0x4,0xc,0xf1,0x8d,0xda,0xb0,0xaa,0xbb,0xaa,0xb0,0x55, + 0x9b,0x95,0x52,0x30,0xd4,0x7,0x89,0xad,0x71,0x82,0x51,0x20,0x7,0x9d,0x80,0x3a, + 0xff,0x8c,0xee,0x4f,0xa1,0xef,0x42,0xd1,0x28,0x5,0x13,0x73,0x42,0xf6,0x8e,0x39, + 0x77,0xef,0x4,0xb9,0x20,0x51,0x3b,0xfe,0x82,0x39,0x96,0xa2,0xe5,0x0,0xf7,0xad, + 0x6a,0xd8,0x60,0x82,0x77,0xf5,0x21,0x1f,0x35,0x0,0x8f,0xad,0xdd,0xea,0x59,0x91, + 0xa1,0x4d,0x7,0x61,0xda,0x85,0xb1,0xc1,0x78,0xa1,0xab,0xe0,0x89,0xa9,0x76,0x49, + 0x4d,0x0,0x8d,0x73,0x37,0xb8,0xa8,0x9e,0xc9,0xc7,0xa,0x2c,0xb9,0xf4,0xd6,0xb5, + 0x7f,0x92,0x41,0x44,0xe2,0xf7,0xed,0x1a,0xe4,0x84,0x10,0x1f,0xfd,0x7f,0x6d,0x62, + 0xf7,0x16,0xe6,0x6e,0x19,0x69,0x65,0x53,0x3a,0xaa,0x99,0xae,0x79,0x91,0xe4,0x84, + 0x25,0xa1,0x9a,0x88,0xc,0xd8,0xd1,0x41,0xd6,0x29,0x11,0xd3,0xd1,0x1,0xcd,0x38, + 0x1a,0xa0,0x51,0x67,0xf2,0x10,0x91,0xd,0x67,0x9f,0x5f,0x44,0xcf,0x68,0xef,0xf4, + 0x2e,0x2e,0xd8,0xbb,0xe1,0x0,0xb,0x5a,0xa4,0xbe,0xd3,0x84,0x8a,0x30,0x21,0x78, + 0x77,0xb1,0xff,0x89,0xf5,0xeb,0xa4,0x19,0x18,0x86,0x9f,0x91,0x47,0x19,0x1b,0xe3, + 0xec,0x52,0x9d,0x67,0xb8,0x6a,0x76,0x8b,0x38,0x49,0x4a,0xd4,0xb1,0x91,0xa8,0x81, + 0x13,0x6e,0x53,0xaa,0xd4,0x90,0xad,0xc5,0x4c,0x63,0xde,0x66,0x9d,0xe,0x64,0xb3, + 0x3d,0x4b,0xe4,0x7d,0x4e,0x62,0x20,0xcc,0x81,0xaa,0xc9,0xda,0x5a,0xe4,0x6e,0xa6, + 0x42,0xa,0xb5,0xf5,0x8d,0xb4,0x58,0xb,0x79,0x7c,0x20,0xd8,0x7c,0x34,0x64,0x31, + 0xcd,0x2,0xb,0x74,0x4,0x59,0xc,0xa9,0x3f,0x8c,0xe8,0xae,0xe0,0xed,0xc,0xaf, + 0x71,0x77,0x8e,0x9f,0x2c,0x9d,0xb0,0x4b,0x69,0xd3,0xe6,0xbe,0x97,0x9d,0x80,0x6d, + 0xd5,0x42,0x7,0xee,0xbd,0x7e,0xc1,0x48,0x48,0xf6,0x1b,0xb3,0xf5,0x96,0x59,0x31, + 0xc0,0x7d,0xf3,0x1a,0x90,0xbc,0x83,0xd,0xd1,0xb0,0xbd,0x1e,0xd6,0x64,0x40,0xdf, + 0xd7,0x8e,0x23,0xb5,0xde,0xc1,0x6,0x5f,0x3d,0x52,0x16,0x6,0x8d,0x34,0x6c,0x82, + 0xd3,0xc8,0x63,0xe0,0x8c,0xc1,0x23,0x3b,0x9f,0x61,0xb2,0xb9,0x1c,0xe3,0x43,0x89, + 0xf9,0x95,0xaa,0x7a,0xb0,0xdf,0x82,0x32,0x1,0x88,0x9a,0x99,0x6d,0x9e,0xbd,0x34, + 0x35,0xb8,0xc0,0x9c,0x24,0x85,0x3b,0x38,0xb4,0x57,0xe8,0x5,0x5,0x9b,0x6d,0xe3, + 0xca,0x14,0xd0,0x53,0xf3,0x1c,0x41,0xfb,0xd5,0x86,0x4b,0x1,0xa3,0xbc,0xd5,0x51, + 0x6d,0xc,0x30,0xca,0x90,0xd9,0x25,0x2d,0x63,0xd0,0x6c,0xda,0x69,0x9d,0x55,0x60, + 0x47,0xeb,0x4c,0x74,0xe4,0x18,0x86,0xf1,0x3c,0x5,0xf4,0x51,0x80,0x21,0x59,0x79, + 0x1,0x85,0x4e,0xa9,0x13,0x50,0xea,0xe4,0x8c,0xdd,0xa2,0x74,0xcb,0x31,0x43,0xa7, + 0x96,0x7b,0xe9,0xd0,0x36,0x9,0x98,0x6c,0x4a,0x49,0x63,0x40,0x87,0x9f,0xa0,0xfa, + 0xb6,0x95,0xc6,0x5e,0xd7,0x2c,0x6f,0x74,0xef,0x8a,0xe3,0x7b,0x86,0xdb,0x3a,0x38, + 0x27,0xfa,0xd8,0xa2,0xe6,0x50,0x54,0x43,0x96,0xf6,0x76,0xfb,0xa8,0x84,0x4c,0xd8, + 0xf7,0x31,0x94,0x3b,0xd3,0x5e,0x19,0xab,0xe9,0x7d,0xe3,0x13,0x4b,0xa9,0x7,0xf3, + 0xb1,0x73,0x32,0xc1,0x2a,0x14,0x28,0x41,0x61,0xae,0x39,0x78,0x8e,0xae,0xa9,0x36, + 0xc7,0xd2,0x7e,0x34,0xb2,0xd1,0xb5,0xa6,0xe5,0xde,0x16,0xed,0xa6,0xd5,0x73,0x6c, + 0x7c,0xba,0xb7,0x1d,0x1c,0xe5,0x47,0x27,0x5c,0xe3,0x24,0x7f,0xea,0xa1,0x46,0xb4, + 0xe8,0xeb,0xa2,0xc8,0x4f,0x46,0xb1,0x4e,0x6,0x2f,0xb4,0xae,0x93,0x7e,0xb8,0x25, + 0xca,0xbf,0xce,0xf7,0x19,0xd1,0x16,0xab,0xc1,0x1,0x7d,0x82,0x28,0x81,0xf,0xa0, + 0x8e,0xcb,0x1c,0x71,0x38,0xfd,0x40,0x66,0x21,0x98,0x79,0x3b,0xbb,0x22,0xf9,0xa4, + 0x55,0xce,0x1a,0xf4,0x3e,0x3,0x25,0xea,0xc8,0x1d,0xd3,0xd9,0x55,0x2c,0x9f,0xf, + 0xb9,0x5e,0x23,0xd1,0x53,0xe0,0x39,0x54,0xa,0xbe,0x46,0xae,0x17,0x13,0xde,0xb, + 0x72,0xce,0x62,0x33,0x93,0x1d,0x9e,0x9,0x4d,0x3e,0x33,0x80,0x1f,0x59,0x48,0xc8, + 0x54,0x60,0x5,0x92,0xb8,0x70,0x8b,0xd1,0x46,0xcf,0x76,0x37,0x7e,0x18,0x94,0x9b, + 0xf6,0x45,0x21,0xe2,0x4,0xe0,0x8e,0xb0,0x8,0xe3,0xd,0x91,0xec,0xce,0xe5,0xee, + 0x7d,0xfc,0xbd,0x12,0xea,0x48,0x3a,0xfe,0xb2,0x90,0x32,0xa8,0x7d,0xa7,0x13,0x81, + 0x38,0xc3,0xb3,0xb0,0x62,0x83,0x77,0xe3,0x41,0xa5,0x68,0x7c,0x77,0xef,0x9c,0xd9, + 0xba,0xf3,0x71,0x62,0xdf,0xcd,0x30,0xb3,0xad,0x78,0x3d,0xcf,0x6a,0x41,0x54,0x36, + 0x27,0x99,0xf2,0x7a,0x20,0x94,0xda,0xfa,0xdd,0xeb,0xb7,0x32,0xc2,0x45,0x3b,0xb8, + 0xdc,0x4,0x7d,0xed,0x99,0xf2,0x8,0x12,0x77,0x5,0x97,0x8a,0xd,0x91,0x14,0x9c, + 0x88,0x0,0x94,0x1a,0x48,0x6,0xe2,0xd9,0xc8,0xb7,0xb0,0x60,0x78,0x11,0x95,0xe1, + 0xab,0x28,0xe,0x66,0x2e,0x53,0x75,0x5e,0xe,0x7b,0x5,0xec,0x48,0x48,0xcf,0xa0, + 0x68,0xa8,0xb3,0xb5,0x5e,0x81,0xe,0x37,0xf0,0x31,0x33,0xf2,0x96,0x96,0xf5,0x82, + 0xb9,0xf7,0x7a,0x7,0x21,0x8b,0xf8,0xc3,0xfb,0x32,0xd8,0xaa,0x93,0x75,0x23,0x26, + 0xec,0xc,0xc3,0x91,0x96,0xa0,0x47,0x1b,0x64,0x9c,0x0,0xe1,0x41,0x42,0xf5,0xc1, + 0xed,0x5,0x14,0x42,0xf7,0xf4,0x44,0xb3,0xa0,0x2b,0xe7,0xf6,0xb9,0x3a,0x4b,0xd2, + 0x62,0xf,0x5d,0xc3,0x84,0xa5,0x1e,0x2b,0x6d,0xed,0x8e,0xf9,0xb,0x8,0xf,0x86, + 0xa1,0xbd,0xbf,0x3f,0x5d,0xe7,0x13,0x84,0x11,0xdf,0xa5,0x16,0x30,0xea,0xd,0xc0, + 0x15,0x7a,0xb4,0x5d,0x2d,0x6,0xc2,0x0,0xd3,0xd8,0x74,0xa8,0x0,0xdb,0xb6,0xb9, + 0x77,0x3d,0x1f,0xc6,0x19,0x6f,0x7b,0xe6,0xb7,0x35,0xc1,0x24,0xdb,0xbc,0x65,0xc3, + 0x3b,0xdb,0x76,0xef,0xf1,0x6e,0x6d,0x80,0xd6,0x9f,0xe7,0xfe,0x53,0xd2,0x1d,0x68, + 0xa3,0x89,0x26,0xd6,0xb4,0x27,0x7e,0x75,0xdb,0x58,0xeb,0x6c,0x6c,0x9b,0x58,0x1a, + 0x72,0xdf,0x1d,0x1e,0x83,0xb4,0xe2,0xaa,0x2c,0xc6,0x10,0x57,0x69,0x71,0x41,0xb9, + 0x9b,0x65,0xa1,0x36,0x8a,0xa5,0x5d,0xd9,0x93,0x35,0x56,0x48,0xa2,0x1a,0xd6,0x66, + 0xe8,0xf5,0x3f,0xff,0xe7,0xff,0xf1,0xe0,0x6a,0xd4,0x46,0x90,0x16,0x90,0xb8,0x9d, + 0x99,0x98,0xac,0x73,0x30,0xf0,0xf4,0x3a,0x48,0x47,0x93,0x55,0xcd,0x52,0x8d,0x2a, + 0x65,0x8f,0xf2,0x31,0xe3,0x42,0xca,0x75,0x27,0xd3,0x4,0xd4,0xbb,0x7d,0x3a,0xc6, + 0xe0,0x76,0xaf,0xf0,0xaa,0xe5,0x8c,0xa,0xc2,0x22,0xea,0x13,0x1c,0x93,0x11,0xd5, + 0xfa,0xe,0x6,0x3,0x16,0x69,0x5d,0x13,0x91,0x5c,0xc4,0x60,0xab,0xa6,0xca,0xb0, + 0x43,0x68,0xe8,0x3,0x7e,0xd0,0x11,0x1d,0x1f,0x87,0xd4,0x98,0x18,0x58,0x23,0xcc, + 0x5a,0xe2,0xbf,0xb9,0x1f,0x50,0xf0,0x9a,0x91,0xdf,0xa3,0x2a,0x8b,0x2b,0x6e,0x71, + 0xfa,0xfa,0xfc,0x5a,0x99,0x1c,0x21,0x7e,0x32,0xcf,0xc4,0xf9,0x66,0xb1,0xac,0x64, + 0xc1,0x40,0x9,0x8c,0x98,0xbf,0xd7,0x3e,0x10,0xd1,0x74,0xa9,0xe1,0x86,0x90,0x48, + 0xb5,0xe9,0x28,0x43,0x39,0xbd,0x10,0x1e,0xbc,0x5,0xa1,0x16,0x1c,0xa4,0x39,0x8a, + 0x90,0xe7,0x40,0x62,0x4e,0x41,0x68,0x52,0xd0,0xa2,0x72,0xd7,0x58,0xe4,0xed,0x48, + 0xed,0xed,0xc0,0x1a,0xc8,0xf7,0xf2,0x7a,0xaf,0x5a,0x36,0xf3,0xbd,0xea,0xec,0x65, + 0x5b,0x8d,0xd2,0x3e,0x46,0xed,0xdb,0x48,0x2a,0xba,0xc6,0x5a,0x87,0xa8,0x80,0xcb, + 0x8e,0x51,0x98,0x33,0x0,0x4e,0xe9,0x51,0xbb,0x78,0x47,0x41,0xf,0x2a,0xc3,0x9f, + 0x4,0xc3,0xf7,0xcb,0x46,0xb7,0xc2,0x2b,0x6a,0x9f,0x26,0x1e,0x30,0x39,0x2e,0x8b, + 0x9c,0x6d,0x1e,0xf6,0x1e,0x17,0x86,0x28,0x7b,0xdb,0x4c,0xe6,0x8d,0x4c,0xff,0x6a, + 0xdc,0xef,0xad,0x2a,0x9f,0xbb,0x52,0xc0,0xb8,0xb,0x50,0xdc,0xf7,0xca,0xb1,0xd4, + 0x60,0xd8,0x15,0xb9,0x84,0x6,0xd5,0x43,0xf2,0x68,0xfe,0x97,0x1d,0x71,0x50,0xbc, + 0xab,0x94,0xb7,0x8e,0x49,0xef,0x7e,0xd0,0x45,0xb3,0xbe,0xbe,0x5b,0x98,0x23,0x10, + 0xee,0x87,0x5a,0xba,0x74,0x6f,0xc7,0x7a,0xad,0x9d,0x87,0xaa,0xbf,0x32,0xea,0xf8, + 0xb6,0x6e,0x4b,0x75,0x3a,0xab,0x13,0x6c,0x10,0x7c,0xdd,0x50,0x8,0x6a,0x7,0x72, + 0x6b,0xf1,0x86,0x9,0x2c,0x84,0x50,0x37,0x41,0xa6,0x33,0x87,0xad,0xf7,0xac,0x7c, + 0xd8,0xa0,0xee,0x23,0x10,0xc8,0xc,0x1d,0x1,0x77,0x45,0xe3,0x41,0x57,0x2a,0xd8, + 0xd6,0x7,0x27,0x3b,0xcb,0x8d,0x5c,0xce,0xbd,0xe,0xce,0xf7,0x8e,0x94,0x95,0x13, + 0x15,0x11,0xe1,0xc5,0x5b,0x90,0xb6,0x21,0xa0,0x56,0x61,0x1d,0x3b,0x6f,0xb0,0xe5, + 0xa,0x38,0x51,0x6a,0x65,0x5f,0x48,0xa8,0xb9,0xb6,0x3b,0xd0,0x92,0x43,0xe8,0xd4, + 0x39,0x28,0x52,0x4e,0x4c,0x34,0xc7,0x1d,0x2a,0xa3,0xc8,0xe3,0xe8,0xc6,0x22,0x57, + 0x49,0x84,0x2b,0x78,0x92,0x71,0x23,0xa6,0x61,0x48,0x3c,0xdc,0x7f,0x11,0xcd,0xa2, + 0xf7,0x3a,0x99,0xe,0x66,0x87,0xf0,0x31,0x1b,0x90,0x89,0x45,0x43,0x46,0xf6,0x9b, + 0x11,0x7d,0x29,0x18,0x6,0x31,0x90,0xa4,0x6c,0x84,0x59,0x5f,0xdc,0x95,0x9a,0x96, + 0x76,0x72,0xe0,0x6a,0x4f,0xee,0x70,0x61,0xce,0xef,0x44,0x9e,0x98,0x0,0x27,0x13, + 0x5a,0xdc,0x4,0x8e,0x9,0x95,0xda,0x81,0x43,0xbc,0x74,0xa3,0xf2,0x58,0x9f,0xa5, + 0x39,0x32,0xad,0xe,0x71,0x35,0x44,0x66,0xa3,0xbe,0x56,0x5a,0x72,0x36,0xd0,0x95, + 0x4e,0xf4,0x10,0xa6,0xca,0x79,0x44,0xa9,0x49,0xab,0x11,0x73,0x66,0xaa,0x5,0x7a, + 0xdd,0x4,0x94,0x16,0x79,0xdf,0x16,0x68,0x8b,0xd1,0xfd,0x4c,0xc7,0x8,0xb9,0x43, + 0xa1,0xcc,0x58,0x88,0xa1,0x49,0x4c,0x5f,0x9c,0xa8,0x16,0xc2,0x36,0x40,0xee,0x7, + 0x38,0x55,0xdb,0x4a,0xab,0x18,0xd5,0xb,0xd9,0x31,0x57,0x84,0xc,0x24,0x52,0xf9, + 0x30,0xf5,0xd6,0xe0,0xd5,0x3,0x7d,0xf7,0xe0,0x44,0x2b,0xdc,0x7d,0xa0,0x88,0xb1, + 0x77,0x39,0x83,0x32,0x76,0xa6,0x8,0xc3,0x93,0x76,0x37,0x68,0x74,0x31,0xc0,0x5f, + 0x6,0x32,0x5d,0xb1,0x13,0xe6,0x1b,0xdc,0xb0,0x79,0x87,0x2f,0xb4,0x71,0x61,0x31, + 0xb8,0x97,0x7d,0x67,0x6e,0xee,0xa8,0x8d,0xc3,0xd2,0xad,0x5f,0xdd,0xca,0x89,0xb2, + 0x23,0xde,0x2b,0xb0,0xae,0xc6,0x86,0xe,0xea,0xda,0xab,0x95,0xd1,0x65,0x10,0x21, + 0xa8,0x71,0x34,0x93,0x2d,0x66,0xbf,0x6d,0x35,0xff,0xde,0x4f,0xf0,0x3e,0x28,0x62, + 0xb,0xf7,0x66,0x77,0x59,0x6b,0x26,0x2f,0x4,0xc8,0xdb,0x83,0x28,0x3c,0xa0,0x87, + 0x19,0xbb,0xe3,0x41,0xe2,0xb5,0x1f,0x74,0xdb,0xb0,0x60,0xb7,0x38,0xd0,0x2,0xcc, + 0x4f,0xc,0x8a,0x80,0x80,0x58,0xb,0x11,0xd8,0x76,0x40,0x81,0x37,0xc4,0x7d,0xd, + 0x9a,0x3e,0x1a,0x9a,0xf5,0x7e,0x95,0xbd,0x2a,0x64,0x1d,0x83,0x62,0x7b,0x49,0xb9, + 0x57,0xb2,0x1d,0xb8,0x35,0xd2,0x52,0x6f,0x65,0xf,0xb9,0xd4,0x55,0x1a,0x1b,0x1b, + 0xe2,0x39,0x6,0xde,0xc0,0xfb,0xda,0x63,0x8d,0x3,0x5a,0x93,0xa5,0x1f,0x76,0x95, + 0xb9,0x5c,0x58,0xe0,0xa6,0x12,0xcc,0x41,0x4d,0x38,0x42,0xd1,0xd3,0xd8,0xa8,0x60, + 0x20,0x43,0xac,0x25,0x1,0x35,0x41,0xe5,0x91,0x1b,0x83,0x22,0x5d,0x11,0x9f,0x73, + 0x9c,0x4d,0xef,0x58,0xa,0x22,0xcf,0x50,0x83,0x29,0x86,0x78,0x95,0xa3,0x2b,0x19, + 0x9e,0x30,0x91,0xe8,0xaa,0x2d,0x53,0x50,0xcb,0xbd,0x74,0x5,0xb4,0x9e,0x6e,0x36, + 0x0,0x62,0xb3,0xaf,0xb3,0xd,0x9b,0xef,0x74,0xb7,0x42,0x78,0x6a,0x17,0xe0,0xa8, + 0xf8,0x68,0x34,0xe9,0x7d,0x3,0xb6,0x66,0x51,0xb8,0x55,0x24,0xc9,0xbe,0xdf,0xcd, + 0x7c,0x73,0x88,0xae,0xae,0x9a,0xc,0xc0,0xd5,0x71,0x92,0x79,0xe3,0x98,0x30,0xd7, + 0x30,0xad,0xd0,0xfb,0x3e,0x20,0x20,0x9a,0xfa,0x6b,0x88,0x56,0x41,0xe8,0x9e,0x9d, + 0x4c,0xc3,0xf1,0x18,0x45,0x69,0xe,0x97,0x5b,0x9,0x16,0x2,0x4f,0x60,0x9e,0x45, + 0x73,0x18,0x64,0x4a,0x93,0xcd,0xf8,0x0,0x81,0x13,0x1,0x6a,0x37,0x48,0x60,0x9b, + 0x71,0xc5,0x7d,0xcc,0xb4,0xf3,0xcc,0xec,0x80,0xf8,0x38,0x66,0x0,0x8f,0x59,0x16, + 0x30,0xa3,0xab,0x8d,0xf7,0xfb,0xcf,0xff,0xf9,0xa1,0x35,0x5f,0x77,0x80,0x87,0xc5, + 0x7,0x13,0xe7,0xd8,0xa2,0xdb,0xb,0x53,0x9,0xc2,0x51,0xa9,0x3a,0xb3,0x0,0xe8, + 0x14,0x73,0xba,0x2f,0x6a,0x80,0xa3,0xc2,0x39,0x46,0x59,0x35,0xe3,0x25,0x7c,0x32, + 0x6d,0x11,0xb5,0x26,0xf,0xda,0xee,0xc2,0xe1,0xb5,0xe0,0x61,0x81,0xae,0xdd,0xad, + 0xf8,0x6b,0xa1,0x77,0xf7,0x32,0xcc,0xc3,0x6c,0xae,0x3,0x82,0x8,0xdf,0x4d,0xe8, + 0x95,0x2e,0x40,0x1,0x16,0x32,0x81,0x2a,0xc3,0x69,0xfb,0x17,0x18,0x44,0x5,0x8a, + 0x2f,0x3,0x9,0x4f,0x41,0x9d,0x82,0xf8,0x3e,0x4f,0x23,0xf4,0xb0,0xf7,0xcc,0x80, + 0xa2,0x74,0xfd,0x59,0x85,0x9c,0x95,0x36,0x98,0xac,0xf7,0xa6,0xb5,0x98,0x39,0xb2, + 0x89,0xe6,0x70,0x90,0xa5,0xac,0xe7,0xdb,0xd6,0x6f,0x3d,0x8,0x60,0x5,0x43,0xd9, + 0x7c,0x3f,0x8,0x1b,0xf9,0xda,0xbd,0x9c,0xa8,0x95,0xfb,0x56,0xd,0x19,0x5b,0xa1, + 0xeb,0xff,0x65,0x33,0x14,0xb3,0x13,0xd6,0xd0,0x5c,0x8e,0x4a,0x49,0xc7,0x86,0x21, + 0xab,0x4c,0x87,0x9a,0x95,0xf9,0xf1,0xc3,0x9a,0x61,0x28,0x9d,0x9b,0xd6,0x79,0x6a, + 0x5,0xad,0x42,0xac,0x73,0xd,0x6f,0x41,0xa5,0x95,0x4c,0x68,0xaf,0x1b,0x6d,0xb1, + 0x70,0xb,0x67,0xff,0x41,0xd2,0x28,0x72,0xb5,0xdd,0x3c,0xb1,0x2f,0x21,0x17,0xd8, + 0x1d,0xb8,0x98,0x64,0x6e,0xaf,0x8f,0x1a,0x54,0xfb,0x7b,0xb0,0x13,0x7d,0xe2,0xb7, + 0xef,0xb3,0xad,0xf,0xa8,0xdd,0xdc,0x4b,0x8f,0x4d,0x27,0x9c,0x2b,0x74,0x33,0xf7, + 0x8a,0x24,0xdf,0x75,0xbe,0x36,0x6f,0x7d,0xea,0x61,0xd2,0xd2,0x12,0xa2,0xad,0xd7, + 0xdf,0xdd,0x61,0xa7,0x39,0xbb,0xb7,0x25,0xa1,0x75,0xb,0xc6,0x28,0xa2,0xd9,0xbf, + 0x77,0xa0,0x7e,0x8b,0xec,0xd,0xa1,0xde,0x92,0xc9,0x3e,0x8d,0x6e,0xbc,0x88,0x56, + 0xeb,0x57,0x84,0x5a,0x43,0xad,0xb7,0x79,0xf9,0xd0,0x40,0xdb,0x61,0x23,0x75,0x1d, + 0x7b,0x9,0x14,0xd4,0x2,0x98,0x72,0xe2,0x93,0x74,0x76,0x80,0x2f,0x96,0x82,0x13, + 0xa3,0xf3,0x6a,0x2e,0xb8,0x1e,0x78,0x4f,0xd,0x59,0x4d,0x18,0x5d,0xba,0xb8,0xe, + 0xdc,0x1,0x2b,0xd,0xe0,0xe6,0xc5,0x87,0xbb,0x53,0x75,0x54,0xad,0x22,0x40,0xbb, + 0x7c,0xfb,0xe,0x18,0x85,0xbb,0x6f,0x35,0xa9,0x6d,0xd4,0x37,0x67,0x68,0x1a,0xda, + 0x47,0x57,0x16,0x49,0x23,0x78,0x14,0xec,0xda,0xc,0xd2,0xad,0x6a,0x12,0xca,0xad, + 0xd3,0x65,0x3a,0xee,0x23,0xcf,0x70,0x87,0x4d,0xbb,0xce,0x71,0x14,0x2c,0x14,0x5a, + 0x29,0xd1,0xc3,0x3c,0xda,0x27,0x19,0x53,0x64,0xfb,0xd4,0xd,0x72,0x12,0xe4,0xc4, + 0x35,0x13,0x5e,0x6e,0xdd,0x61,0x57,0x25,0x95,0xec,0xb0,0x25,0xdc,0x60,0x27,0xb9, + 0xc0,0xcc,0x2c,0xf5,0x58,0xf5,0x1d,0x74,0xd,0xd2,0xc0,0xee,0x13,0xff,0xde,0x84, + 0x6f,0x6,0x2,0xbb,0x3c,0xa0,0xe7,0xe3,0x31,0x25,0x2a,0xa8,0xf9,0xb3,0x19,0xb4, + 0x90,0x73,0x2d,0x6d,0x44,0x44,0x99,0x42,0x77,0xe,0xae,0xa3,0xd5,0xed,0x44,0xc5, + 0x19,0x1f,0x50,0x14,0x7a,0x16,0xa8,0x61,0x1d,0xbf,0x50,0xb9,0xf2,0x90,0x79,0x9b, + 0x36,0x4a,0x64,0xbe,0x1f,0x24,0x22,0xb3,0x65,0xad,0xc0,0x58,0x68,0x96,0xe5,0xda, + 0x73,0xf2,0x80,0x40,0x87,0x93,0x29,0x1a,0x4b,0xbd,0x9a,0x64,0x90,0x2d,0x11,0x53, + 0x53,0x85,0xac,0x4,0x16,0xf9,0x95,0xe8,0x9f,0x87,0x8e,0x7c,0x11,0xca,0x47,0xaf, + 0x34,0xfa,0xc,0x9a,0x6a,0x43,0xe2,0x22,0x75,0x1d,0xf5,0x82,0xee,0xd5,0x58,0x8f, + 0xbb,0x16,0x78,0xbc,0xf8,0xe,0x24,0xf2,0xf1,0xba,0x1e,0xa7,0x80,0xe1,0x47,0x85, + 0xa6,0x24,0x63,0x2,0x42,0xea,0x19,0xc4,0xc0,0x6c,0xe9,0xec,0x9e,0x7b,0x65,0x25, + 0x5a,0xc1,0x94,0xa4,0xde,0x2e,0xb3,0x46,0x6f,0x14,0xb2,0xfe,0xc8,0x6a,0xf3,0xa0, + 0x78,0xf,0xf0,0x7b,0x67,0x76,0xef,0x45,0xba,0x39,0x4a,0x29,0x15,0xa7,0xbe,0xcf, + 0xd4,0xcb,0x89,0x3a,0x2,0x6e,0xbd,0x9c,0x32,0x4c,0xa9,0x4a,0x75,0x6c,0xe3,0xa6, + 0x35,0x44,0xc4,0x57,0x34,0xf0,0x9d,0x62,0x78,0xd,0x2c,0xe8,0xee,0x19,0x2d,0x88, + 0xa0,0x96,0xfb,0xed,0xcb,0xa2,0x91,0xfd,0xfa,0x6f,0x12,0xf8,0x9d,0x21,0x20,0x41, + 0x6a,0xaf,0x4f,0x3b,0x46,0x0,0x1c,0x58,0x32,0x56,0xb0,0xab,0x17,0x58,0x4,0x21, + 0x3a,0x30,0x30,0x83,0x43,0x46,0xd8,0xa,0x33,0xdf,0xa4,0x9b,0xcf,0x88,0xde,0xd1, + 0xbd,0x2f,0x27,0xfa,0xa0,0xb2,0x2a,0x31,0x7a,0xff,0xdd,0x5e,0xa1,0x97,0xd2,0xba, + 0xb5,0xbd,0x2,0x2c,0x55,0x13,0xb6,0x0,0xbe,0xb9,0x17,0x14,0x6c,0x55,0xfa,0xd4, + 0x5a,0x8f,0xc2,0x3b,0x68,0xe,0x6c,0x95,0x19,0x7d,0x33,0xc7,0x5d,0x2b,0x20,0xb9, + 0x19,0x5a,0x99,0x35,0x53,0xe8,0x71,0xb8,0xee,0xc8,0x5a,0xc6,0x57,0x99,0x7f,0x78, + 0x4f,0x5,0xea,0x28,0xa9,0xd0,0x60,0xbe,0xef,0x97,0x22,0x4,0x83,0xd8,0x16,0x95, + 0x51,0x6c,0xc9,0xad,0x78,0x9e,0xf3,0xf2,0xfd,0xd1,0xfb,0xcb,0x2d,0xa8,0x21,0xd1, + 0x2c,0x94,0xb1,0x42,0x2e,0x81,0x65,0xdb,0x9b,0x5f,0x5b,0xf1,0x21,0x5a,0xb0,0xb7, + 0x5a,0x8a,0xb5,0xae,0x3a,0x6a,0x58,0xde,0x23,0x7a,0xcb,0x85,0xca,0x9,0x77,0x11, + 0x7f,0xdf,0x17,0x83,0xef,0x73,0xf2,0x6d,0xa6,0x46,0x58,0xa7,0x67,0x85,0x13,0x68, + 0x4,0x14,0xbc,0x6b,0xd5,0xc2,0x12,0x87,0x99,0x73,0x8e,0xa4,0x79,0xaa,0xe8,0xac, + 0xe8,0x8d,0x12,0x5b,0xfd,0x73,0xd3,0x1e,0x4c,0x21,0x5a,0x27,0x3d,0xcd,0x7c,0x47, + 0x25,0x16,0x98,0xa9,0xc6,0xf2,0x9c,0xb1,0xef,0xef,0xd5,0xc6,0x14,0x33,0xde,0xba, + 0x40,0xf5,0x5d,0xde,0xbf,0xcd,0x7,0x4,0x28,0x15,0x6c,0x4d,0x9b,0x5e,0xad,0x6, + 0xf5,0x31,0xbb,0x1f,0x42,0xf8,0x72,0x9b,0xd4,0x5e,0x96,0x1a,0x67,0x82,0xc2,0xf7, + 0x70,0xe3,0x9d,0x38,0xc,0x33,0x43,0x28,0xd9,0x78,0x9c,0xfb,0xb8,0xe2,0xd,0x7c, + 0x50,0xea,0xba,0xd,0x29,0xdb,0x53,0x82,0x51,0x90,0x8,0x15,0xbb,0xc9,0x7c,0x6a, + 0xf0,0xc0,0xf7,0xa4,0x54,0x84,0x34,0x90,0x25,0x0,0x7,0x15,0xac,0x65,0x8c,0x2e, + 0x4a,0x72,0xce,0x5a,0x13,0x61,0xe,0xe3,0xb1,0xb2,0xa7,0x1a,0xc1,0xa8,0x9d,0xf, + 0xe2,0xec,0x2a,0x16,0xcc,0x95,0x76,0x11,0x3a,0x3b,0x88,0x28,0x7c,0xf6,0xa9,0x26, + 0xf9,0x48,0xa2,0xc3,0x65,0x9c,0x3e,0x71,0xa0,0xbd,0x6,0x4e,0x44,0x40,0x5b,0x3d, + 0x5,0xab,0xe4,0x3a,0x29,0xb0,0x17,0x2,0xe,0xb5,0x63,0xb2,0xa2,0xde,0xf7,0x33, + 0xb1,0x75,0x95,0xfb,0xef,0x38,0x81,0xc0,0x80,0x80,0x9e,0xe8,0x27,0x2c,0xea,0x48, + 0xb3,0x25,0xfd,0x5,0x62,0xe9,0xc9,0xe7,0xa5,0x47,0xf3,0x1c,0x84,0x95,0x5b,0x41, + 0x58,0x7d,0xda,0x45,0x3a,0x82,0x50,0x2a,0x7b,0xf1,0xbd,0xe6,0x6e,0x50,0xde,0x8a, + 0x5b,0xaf,0x1,0x7e,0xdb,0xed,0xa6,0x6c,0xdb,0x60,0x65,0x8f,0x40,0x8d,0x5f,0xee, + 0x7b,0xf9,0x8f,0xd0,0x29,0xf2,0xda,0x6,0x6,0x1f,0x4d,0x4e,0x72,0x9c,0xf5,0xe, + 0x99,0x7b,0x3d,0x4d,0x6b,0x92,0x73,0xc2,0xa8,0xd3,0x51,0xb1,0x5b,0xa5,0x29,0x93, + 0xa0,0xfe,0xb9,0x85,0x77,0x40,0x44,0x54,0x5a,0xac,0x22,0x43,0x24,0x73,0x8a,0x64, + 0x55,0xa3,0xbd,0x58,0x21,0x8c,0x8c,0xbb,0x98,0x14,0x79,0xac,0x68,0xba,0xcd,0xaf, + 0xbb,0x45,0xc0,0x66,0xfd,0xb6,0x27,0x5a,0x1f,0x3a,0x14,0x12,0xc5,0x65,0x9,0x3a, + 0x23,0xb2,0x51,0x83,0xfd,0x89,0x21,0xd3,0x57,0xa,0x8a,0x6f,0x6d,0x29,0xee,0x83, + 0x78,0x3,0xb0,0x2b,0xf0,0x35,0x6a,0x3c,0xbc,0x94,0x13,0x5d,0x4,0x7e,0x67,0xe2, + 0x33,0xc2,0x1e,0x92,0xe4,0xd5,0x8,0xbc,0x3,0x29,0x9d,0x35,0xd,0x7a,0x5a,0x44, + 0x68,0xd5,0x66,0x53,0x52,0xe7,0x7,0x56,0x6,0xc1,0xb0,0xf5,0x9a,0x50,0xc7,0x2, + 0x9d,0x7a,0x59,0x88,0xa2,0x15,0xa8,0x48,0x60,0xca,0x9c,0x49,0xc2,0x31,0x6d,0x62, + 0x6,0x7b,0x88,0x3e,0xa1,0x1d,0x4e,0x6e,0x45,0x15,0x81,0x87,0x6,0x7b,0x1a,0xd9, + 0x31,0xb2,0xbc,0xc7,0xb5,0x9a,0x54,0x9d,0x0,0xf9,0x79,0x55,0x58,0xc3,0xe6,0xbe, + 0x63,0x2,0x61,0xbe,0xb,0x22,0xfb,0xbe,0x5,0xbd,0x42,0x15,0xe0,0xfb,0x7f,0xef, + 0x7b,0xa4,0x17,0x3e,0xc5,0xcd,0xac,0xaa,0xce,0xf5,0xb5,0x24,0x82,0x72,0x1d,0xc3, + 0xb9,0xb7,0xbf,0x80,0x61,0x78,0x94,0x54,0x47,0xe0,0x18,0xb2,0x90,0xac,0x7e,0x19, + 0xe1,0x9c,0x21,0x1b,0x98,0x99,0xb1,0x4d,0xfc,0x28,0x8c,0x3a,0xce,0x23,0x36,0x38, + 0x53,0xb7,0x6b,0xc,0x3c,0xa9,0x73,0x11,0x65,0x4e,0xb4,0xa,0x6f,0x24,0xc9,0x98, + 0xf2,0xd4,0x99,0x2a,0xe5,0x91,0x63,0xc6,0xdc,0x5a,0x4c,0x60,0xf7,0x33,0x19,0xc7, + 0x80,0x96,0x94,0x6b,0x71,0x55,0x7d,0x53,0xa7,0x85,0xac,0xdf,0xee,0xc1,0xcf,0x98, + 0x84,0x30,0xfa,0x77,0xc2,0xac,0x4b,0x80,0x44,0x1c,0x1b,0x34,0x2c,0x6e,0xb5,0xc0, + 0x53,0xe,0xcb,0xed,0x73,0xcc,0xd1,0x65,0x93,0x44,0x2b,0x0,0x21,0x66,0xd0,0x1, + 0x31,0x68,0x80,0x74,0x11,0xd4,0x28,0x26,0x0,0x12,0x2d,0xc7,0x5b,0x7d,0x9d,0xa6, + 0x7a,0xa4,0x30,0xcf,0x6e,0x18,0x33,0xf8,0xa1,0x2c,0xae,0x68,0x56,0x1a,0x6d,0x9c, + 0xa3,0x23,0x5e,0x45,0x63,0xcb,0x8,0xa5,0x7f,0x36,0x5a,0x37,0xd,0x2a,0xa8,0x50, + 0xc0,0x7a,0xda,0x34,0xf8,0xb6,0xde,0x7f,0xaf,0xd4,0xdb,0x8e,0x4a,0xdf,0xd1,0xed, + 0x14,0x88,0xcb,0xae,0xac,0x81,0x32,0x88,0xfd,0x18,0xe1,0xba,0xbe,0xb6,0xbe,0x41, + 0xb1,0x8e,0xd0,0x66,0x5c,0xf1,0xc8,0x41,0x58,0xa0,0xb3,0x16,0x49,0x65,0x60,0x8c, + 0xa8,0x55,0x3a,0x24,0xad,0xa,0xeb,0xb4,0x77,0xf6,0x4c,0xb8,0xbb,0x65,0x3f,0xac, + 0x6,0x76,0xc1,0x79,0xaa,0xde,0xad,0x52,0xf7,0x76,0xa2,0xef,0xa0,0xaf,0xbd,0x44, + 0xdc,0x1b,0x92,0xee,0xee,0xc5,0xb1,0xf9,0xe6,0x28,0x7b,0x48,0xd9,0x87,0xba,0xee, + 0xf6,0x5f,0xb6,0xc6,0xe2,0x1b,0x5d,0x1c,0x6b,0x41,0xde,0x5b,0x1b,0xd6,0x2,0xa0, + 0xb3,0xe8,0xe3,0xa8,0x46,0x1d,0xa3,0x2a,0xe7,0x64,0x68,0x4,0x9a,0xe6,0xa4,0x41, + 0xd5,0x79,0x87,0x76,0xb3,0xaf,0x2a,0xb1,0xd6,0x93,0x9f,0x2d,0xcf,0xcd,0xc1,0xf, + 0x62,0x14,0xd4,0x89,0xbd,0x8,0x85,0x8c,0xc,0xa1,0x72,0x9d,0xfa,0xb5,0xae,0xee, + 0x10,0x5e,0x96,0x48,0x4e,0x4d,0x1e,0x57,0xaf,0x19,0x66,0xb5,0x94,0x82,0x13,0x4d, + 0x43,0xd4,0xdc,0x76,0x8c,0x9c,0xe1,0x44,0x45,0xc9,0xd,0x71,0xbf,0xae,0x33,0xdf, + 0x66,0x38,0x26,0x9c,0x2c,0x23,0x0,0x27,0x31,0x24,0x6b,0x12,0x38,0x0,0x87,0x6d, + 0x52,0xe4,0xad,0x30,0x1f,0xf7,0xbb,0x4f,0xc4,0xdb,0xb6,0x28,0xc3,0xa7,0x75,0x32, + 0x87,0x1f,0xb5,0x3c,0xd9,0x53,0x43,0x1a,0x71,0x3,0x57,0x42,0xc1,0x3a,0x62,0x7c, + 0xbb,0xc1,0x20,0x75,0xf7,0x48,0xa3,0xbc,0x74,0xdb,0x72,0xd6,0x72,0xc1,0x80,0xc5, + 0x8d,0xdc,0x15,0x4e,0x55,0x3b,0xf9,0x6e,0x6e,0xac,0x1f,0xd5,0x13,0x35,0x2b,0x2d, + 0x99,0x75,0xc3,0xe,0x9a,0xf3,0x6,0x9a,0xdb,0x69,0x9c,0xbd,0x3a,0xdf,0xa9,0x1d, + 0xd8,0xf6,0xfd,0xd2,0xe4,0xf5,0xb6,0x26,0x2b,0xbd,0x8d,0xeb,0x77,0xb2,0x73,0x35, + 0xf7,0x3a,0x25,0xa9,0x48,0xbf,0x4d,0xb,0x75,0x17,0xb8,0xae,0xf7,0xd3,0xdf,0x83, + 0x94,0xaf,0x67,0x8,0x51,0x23,0x67,0xb0,0xc2,0xe8,0xb0,0xec,0x26,0xa7,0x53,0x2, + 0x49,0xf,0x54,0x7b,0x0,0xeb,0xd5,0x8e,0xf8,0x49,0x75,0x7c,0x37,0x55,0xfb,0x82, + 0x6a,0xd7,0x32,0x9,0x4d,0xb4,0xc3,0xa1,0x9c,0xe5,0xe,0xca,0x82,0xf2,0xb8,0x91, + 0xda,0xf,0x6e,0xea,0xca,0x34,0xd8,0xd5,0x82,0xce,0x87,0x6,0x77,0x46,0xce,0x47, + 0xca,0x5a,0xc4,0x8e,0x23,0xba,0x83,0x99,0x52,0x4e,0xdb,0x52,0xf2,0xe0,0x80,0x16, + 0x55,0xc8,0x24,0x58,0xd5,0xae,0x1,0x57,0xd5,0x33,0x34,0xfc,0x8c,0x4c,0xac,0x48, + 0xd1,0x20,0x3c,0x40,0xbe,0xef,0x59,0x54,0x15,0x1,0x1c,0x41,0x48,0x65,0x86,0xa, + 0x78,0x4,0x59,0xb1,0xce,0xbe,0x49,0x12,0xc4,0x62,0x2d,0xea,0x33,0x13,0x2a,0xed, + 0xa1,0xa9,0x21,0xb3,0x33,0x38,0x32,0xc8,0x3e,0xba,0xa0,0xb1,0x9e,0x39,0xc8,0x7b, + 0x90,0x69,0x18,0x36,0xe3,0xe2,0xf1,0xb9,0x3e,0xb8,0xa1,0xc3,0xd6,0x94,0x66,0xe4, + 0xae,0xe2,0x52,0xa5,0x1d,0x6a,0xfd,0x15,0x85,0xe4,0x62,0x6a,0x10,0x39,0x51,0xf9, + 0x2a,0x2d,0xb0,0xcc,0x2,0x4f,0x6f,0x1d,0x34,0x78,0x71,0x7d,0xdc,0xa3,0x62,0x21, + 0x60,0xdc,0xde,0x60,0x76,0x8f,0xac,0xbc,0xe1,0x57,0xd9,0x4,0x3e,0x7c,0xb0,0xb6, + 0x60,0xd3,0xa7,0x3c,0x72,0xbc,0xa1,0x67,0x40,0x67,0x42,0xb7,0xf9,0x6a,0xa7,0x9e, + 0xbb,0x9d,0x30,0xaf,0x90,0x8a,0x76,0xc6,0x38,0x76,0xc8,0x70,0x29,0xad,0x44,0xd9, + 0x6c,0xdb,0xaf,0xf4,0x44,0x71,0xdb,0xb6,0x48,0xe2,0x32,0x8c,0x18,0x23,0x2a,0x54, + 0x83,0x2f,0x4f,0x80,0xab,0x42,0x18,0x83,0x1a,0xcc,0xb,0xe0,0x7b,0x2a,0x35,0xee, + 0x75,0x4b,0x91,0xac,0x6,0xa3,0xa,0xd5,0xee,0xdb,0x77,0xb0,0x0,0x8,0x70,0x48, + 0x43,0xb5,0x20,0xe6,0x24,0x6e,0x2,0x3c,0x82,0xdb,0xdc,0xe3,0x19,0x96,0xb0,0xad, + 0x1,0x4a,0xe4,0x33,0xec,0x72,0x6d,0xa9,0x47,0xef,0xd2,0xde,0x48,0x6c,0x7a,0xec, + 0x2c,0xc4,0x75,0x2,0xc5,0xb6,0xea,0x10,0x5a,0x67,0xb6,0x6,0xd8,0xe6,0xe6,0xbe, + 0x91,0x42,0x71,0x9b,0x1d,0x79,0x97,0xcb,0xa8,0x7e,0xdf,0xa0,0xa1,0x52,0xbb,0x96, + 0xa2,0x59,0xf9,0x9,0x87,0xd7,0x75,0x5d,0x7a,0xf9,0x54,0xe8,0x1e,0x87,0xf5,0xdd, + 0xd2,0xa3,0x1d,0x24,0xb9,0x9f,0x76,0x63,0xd4,0x3e,0x28,0x84,0x34,0xf,0x1a,0x73, + 0xf4,0x36,0x65,0x60,0x19,0x59,0x57,0xb5,0x11,0x72,0x67,0x64,0x5a,0x71,0x61,0xf2, + 0xf1,0x0,0xd,0x16,0x2e,0xb2,0x40,0xb3,0xdf,0xcd,0xeb,0x50,0x9f,0x6c,0x4b,0xfb, + 0xc8,0x64,0x63,0xc1,0x92,0xd2,0x3,0xfd,0x66,0x4e,0x16,0x65,0x3b,0xa0,0xae,0xf2, + 0xce,0xdd,0x6d,0xbf,0x9f,0x95,0x6e,0xe0,0x5e,0x46,0x75,0xde,0x92,0xdc,0x3a,0x81, + 0x71,0x73,0xf3,0xd,0xb6,0xa1,0xb,0xe8,0x54,0x99,0xdd,0xa,0xf8,0x6e,0xec,0x35, + 0xef,0x7d,0xcb,0x36,0xa7,0x70,0x8e,0xd9,0xaa,0x4a,0xb1,0x43,0x45,0x86,0x68,0x4c, + 0x4c,0x2c,0x63,0xbe,0x8a,0x0,0x8a,0x13,0xdf,0xb,0x48,0x52,0xa0,0x8d,0x14,0x24, + 0xa9,0xee,0x7d,0x86,0xe,0xa4,0x92,0x7f,0x5a,0xcd,0x1,0x2,0xc7,0x17,0x4,0xb2, + 0x71,0xb0,0x46,0x2,0x70,0x25,0x5d,0xa,0x31,0x70,0x67,0x29,0xbb,0x32,0x40,0xbd, + 0x5c,0xf5,0x91,0xd2,0x4e,0xea,0xf9,0x23,0x8c,0xe3,0x2d,0x3a,0x65,0xbb,0xf8,0xa1, + 0xf3,0xb0,0x39,0x29,0xa1,0xb9,0x5,0x31,0x0,0x4a,0x8,0x10,0x9c,0x7b,0x23,0xc4, + 0xde,0x7,0x8a,0x80,0x34,0xab,0x35,0xa3,0x8a,0xda,0xa4,0x36,0xb0,0x6,0x60,0xff, + 0x75,0xb,0x80,0x8b,0xa8,0x22,0x65,0x91,0xcf,0xee,0x91,0xcc,0x6e,0xea,0xe7,0xcd, + 0xf,0xb5,0x5,0xd9,0x20,0x10,0xe1,0x36,0xd,0xaa,0x23,0x89,0x88,0xb3,0x8e,0xf8, + 0x59,0xd4,0x4f,0xb3,0xc0,0xeb,0xf3,0x60,0x6f,0x35,0xed,0x20,0x90,0x9a,0x20,0xe2, + 0xa0,0x63,0x28,0xbe,0x38,0x2b,0x42,0xe,0xcd,0x6a,0x48,0x80,0xa7,0x99,0x6d,0x6b, + 0xe7,0x7a,0x6c,0x57,0x7a,0xd9,0x4b,0xce,0x32,0x2,0x79,0xb,0x3c,0x5c,0xcd,0xf4, + 0xbf,0x8f,0xd9,0xf7,0x1e,0x8f,0x8a,0x88,0x72,0x77,0x5a,0x9b,0x81,0xd2,0x51,0x88, + 0xcb,0x51,0x98,0x4a,0xf6,0x4e,0x53,0x30,0x3,0x24,0xcb,0xd3,0x42,0x50,0x25,0x6f, + 0x36,0x1e,0xb5,0x9b,0xd9,0xe0,0x2a,0x5b,0xb3,0x3c,0xeb,0x68,0x9d,0xbd,0x4a,0xd9, + 0x6c,0x77,0xeb,0x2e,0x3b,0x19,0xb,0x6e,0x9b,0x15,0x2b,0x12,0xd4,0xe1,0x6e,0xdb, + 0xb6,0x9,0xbe,0x27,0xf0,0x29,0x4c,0x6c,0x3d,0x51,0x55,0xe1,0x6d,0x4,0x91,0x2a, + 0xc9,0xe3,0x4d,0x9f,0x6c,0x0,0xe5,0x8a,0x8d,0x9,0x3a,0xbc,0x94,0x5e,0x16,0xd6, + 0x19,0xfb,0x28,0x15,0x79,0x25,0x74,0x1,0x14,0xf4,0x2a,0xc6,0xaa,0xb,0x57,0x25, + 0x2b,0x8d,0xe4,0x83,0x5b,0xbe,0x27,0x2a,0xbf,0x3e,0x24,0xd4,0xf0,0x2a,0xa,0x43, + 0xa9,0xbb,0x55,0xb0,0xa1,0x91,0x8b,0xb,0x5,0xf4,0x5a,0x65,0x87,0xe0,0xe2,0x3e, + 0x66,0xbf,0xdb,0x7e,0x9c,0xff,0xdf,0xff,0xdf,0x53,0xff,0xd7,0xfe,0x25,0xb6,0x52, + 0x99,0x7b,0x3b,0x56,0x6e,0x38,0x88,0xf9,0x68,0xcd,0x57,0xdf,0xb6,0x46,0x2e,0xa8, + 0x3f,0x2a,0xe5,0x4,0x5a,0x7c,0x77,0xb7,0xe0,0x67,0xc7,0x14,0x10,0x74,0x68,0x7b, + 0xd7,0x6f,0x6d,0x89,0xaa,0x39,0x7a,0x97,0x9d,0x6,0xeb,0x55,0x73,0x5,0xad,0x63, + 0xd4,0xdb,0xf4,0x28,0x90,0x3a,0x24,0xa8,0x29,0xb9,0x60,0x49,0x6d,0xb0,0x37,0xda, + 0x36,0x2f,0xb3,0xa9,0x3a,0x26,0x55,0x23,0x75,0x30,0x2c,0xcb,0xdb,0x7a,0x5d,0x4d, + 0x61,0xe4,0x38,0xa6,0x2e,0x27,0xa,0x2b,0xb6,0xf5,0x4,0xb6,0x39,0x22,0x75,0xf3, + 0xd1,0xb1,0x3f,0x7c,0x27,0x1f,0xd6,0xd1,0xc7,0x9,0xf7,0xce,0x0,0xd9,0xcb,0x6e, + 0x2f,0x66,0xdb,0x46,0xe7,0x6a,0x29,0x56,0xf6,0x9a,0x7d,0x7,0x99,0x60,0xc3,0xe6, + 0xb6,0xed,0x50,0xc3,0x5d,0xa9,0x8e,0x4,0x49,0x1d,0xc,0xb0,0xe0,0xde,0xa4,0xf3, + 0x34,0x4c,0x3a,0x4a,0x7e,0x60,0x4a,0x41,0xf8,0x26,0x8f,0x8c,0x23,0x37,0x1d,0x52, + 0x6a,0xf,0x57,0x4b,0x56,0xad,0xfc,0x4f,0x9a,0xc7,0xf1,0x89,0x67,0x44,0x76,0x2f, + 0x47,0x7c,0x72,0x28,0x9b,0xb4,0x9f,0x59,0xe5,0x50,0x51,0x78,0x1,0x6e,0x3f,0x8e, + 0x26,0x63,0x86,0xe,0x17,0x2e,0xaa,0x6c,0xea,0x61,0x56,0x66,0xca,0xa7,0xf6,0xe8, + 0xda,0x10,0xed,0x96,0x7c,0x2,0x97,0xc5,0x54,0xe,0x6f,0x6,0xe6,0x97,0x36,0x5d, + 0xfc,0x2c,0xb9,0x4e,0x88,0x8f,0x38,0x66,0xbc,0xee,0x80,0x4c,0xc7,0xa4,0x3d,0x2e, + 0xb3,0x92,0x80,0x43,0xc8,0xa8,0xb,0xd5,0x6f,0x9f,0x3,0xfc,0x22,0x1b,0x3a,0xd1, + 0xf2,0x2d,0x93,0xcf,0x2d,0x0,0x2f,0xba,0x54,0x64,0x0,0x33,0xe2,0x20,0xdb,0x6d, + 0x76,0xcf,0x93,0xc3,0x53,0x7b,0xaf,0xc2,0x74,0x8,0xe6,0xe3,0xef,0x6d,0x6b,0xaf, + 0xe1,0xa3,0x33,0x8c,0x7c,0x54,0x75,0xa5,0x29,0x8e,0x15,0xae,0x52,0x7a,0x85,0x2, + 0xa9,0x1a,0x9b,0xf6,0x69,0x3d,0xd8,0xd0,0x28,0x6a,0x0,0x87,0xaa,0xbd,0x22,0xea, + 0x87,0x27,0x5a,0x3c,0xad,0x94,0x55,0xaa,0xaa,0x9c,0xc0,0x49,0x3d,0xf9,0xe8,0xc8, + 0x2c,0xb4,0x2e,0x44,0xb5,0x5a,0x26,0xc9,0x88,0x62,0xca,0x4f,0x6e,0x33,0xc8,0x2, + 0xf1,0x6c,0x7,0xaa,0x40,0x9,0xba,0xe,0x7b,0xa9,0x35,0xc2,0x86,0x36,0x3d,0xaa, + 0x73,0xf3,0x9d,0x4e,0xb5,0xa1,0x66,0xc7,0x5e,0xcc,0xb1,0x95,0xcd,0xe1,0x5,0x9b, + 0x6f,0x28,0x5b,0xd9,0x36,0x6c,0x23,0x20,0x56,0xab,0xa,0xaa,0x52,0xc6,0x9a,0xf3, + 0x2e,0xb6,0xc9,0xf9,0x10,0xd1,0xd0,0xd1,0xbc,0x2b,0x1,0x2b,0xbb,0xae,0xed,0x48, + 0x88,0x0,0x14,0x6f,0xb3,0xdb,0x1a,0xf0,0xd1,0x1,0x73,0xa6,0x70,0xb8,0xe1,0x10, + 0x7,0x5,0xcb,0xe,0x7d,0x8,0x1a,0xa1,0x13,0x28,0x4b,0xb7,0xb1,0xf,0xe8,0x42, + 0x14,0x7e,0xeb,0xba,0x10,0x15,0xc8,0xdd,0xa3,0x2b,0x22,0x4f,0xd8,0x9b,0x67,0x1d, + 0xc6,0x11,0x5e,0xc8,0xdc,0xee,0xc4,0x2e,0xe5,0x33,0x8c,0x57,0x8a,0xa3,0x8c,0xa6, + 0x23,0xa9,0x17,0xf9,0x48,0x8,0x76,0x7c,0x83,0x77,0x10,0xd7,0xb0,0x76,0x55,0x80, + 0xad,0x48,0xee,0x12,0xdc,0x12,0x4,0x7a,0xeb,0xe3,0xf,0x78,0x13,0xed,0xa1,0x31, + 0x7,0x97,0xda,0xe8,0xd,0x91,0xba,0xc8,0xa5,0x4b,0xd4,0x2f,0x14,0x11,0x64,0x9e, + 0xd8,0xae,0xed,0x77,0x44,0x88,0x27,0x50,0xb,0x43,0xc7,0xe3,0xff,0xc1,0x27,0xff, + 0xdf,0x1a,0xdc,0x4a,0xec,0x82,0x98,0x5,0x61,0x22,0x2f,0xd,0x38,0xec,0xcd,0x7f, + 0xbe,0xcd,0x14,0x6a,0xc2,0xe3,0x32,0x50,0x1e,0x58,0x6e,0xb6,0x3c,0x77,0xdb,0xbc, + 0x63,0xb1,0x6b,0x5b,0xbe,0x16,0xb1,0x9b,0x63,0xdb,0x29,0xb,0x95,0xc,0xb3,0xa7, + 0x6e,0xdb,0xb6,0xd,0x98,0xa,0xc,0x27,0xbc,0xd8,0x56,0xbc,0x65,0x12,0xb0,0xb2, + 0x4b,0x3b,0x78,0x6f,0xcc,0x77,0x8c,0x9c,0x77,0x98,0xdd,0xb0,0xb7,0x6a,0xd4,0x38, + 0xe2,0xf8,0x5b,0x32,0x8b,0x89,0x78,0xa5,0x2d,0xb3,0xbc,0x10,0x63,0x4f,0xb4,0xcc, + 0x96,0xb0,0x32,0xa,0x2c,0xfc,0x37,0xff,0xe8,0xd1,0xbf,0x15,0xb8,0x3a,0x26,0x6f, + 0x32,0x99,0xe6,0xda,0xa1,0x97,0xd9,0xcf,0xa0,0x88,0x1d,0xfc,0xf9,0x1,0x24,0xfc, + 0xcf,0xf8,0xcf,0x5b,0xbd,0xf6,0x67,0xbd,0xcf,0xe4,0xde,0xfc,0x57,0xbf,0x47,0xd4, + 0xd2,0x85,0x5b,0x50,0xd6,0x9a,0xfc,0x46,0x74,0x2e,0xb3,0x9,0x35,0xcc,0x7f,0xd6, + 0x5,0xaa,0x2d,0x69,0x7,0x0,0x5,0xed,0x26,0x34,0xfc,0x80,0x33,0xf8,0xc2,0x63, + 0xf,0x52,0xbd,0xa6,0x5d,0xd5,0x14,0x20,0xa2,0x8b,0xa1,0x23,0x80,0x6c,0x30,0x2, + 0x12,0x2b,0x99,0xad,0x15,0xc8,0x7e,0x46,0x66,0x4d,0xf4,0xb4,0xd7,0x7b,0xd2,0x34, + 0x0,0x63,0xde,0xa0,0xc3,0xd,0x64,0xd6,0x51,0xe5,0xad,0x32,0x71,0xaa,0xd6,0x4b, + 0xaf,0x6,0x4b,0xab,0x19,0xe1,0xf0,0x1d,0x0,0xe7,0x90,0x0,0xdf,0x18,0x3a,0x52, + 0xdd,0xf,0xe6,0x4e,0xb,0x36,0xac,0xd2,0x2d,0x82,0xd1,0x46,0x28,0xf8,0x19,0x19, + 0x92,0x51,0xee,0x2e,0x55,0x8f,0x49,0x26,0x3f,0x4c,0x42,0x9c,0xee,0x15,0x93,0x48, + 0x9c,0x1c,0xa2,0x6d,0xc0,0xe1,0xba,0x4d,0xb4,0x6f,0xd6,0x7e,0xd6,0x2a,0xf6,0x6d, + 0xdb,0x6a,0x65,0xb8,0xd5,0x8e,0xe4,0x66,0xe6,0xbe,0x6d,0xbe,0xb5,0x36,0xe5,0xd6, + 0x10,0xf0,0xed,0x37,0x6d,0x22,0xb1,0x68,0xd,0xe8,0xdd,0xee,0xfb,0x1e,0xbd,0x5b, + 0x90,0xae,0x8e,0x6d,0xc0,0x89,0xee,0x23,0xdb,0x12,0xa4,0x32,0x2,0xd,0x55,0xe9, + 0xc6,0x4e,0xde,0xb0,0xcc,0x58,0x84,0x26,0x39,0x6e,0x41,0xd,0xf2,0x2d,0x78,0xbd, + 0x62,0xc4,0x8a,0xe4,0x34,0xcf,0xaf,0xdd,0x7c,0xf3,0x43,0xc2,0x98,0xf9,0xbf,0x87, + 0x6d,0x67,0xbd,0xc1,0xcd,0xcb,0xad,0x8f,0x69,0xf7,0xc4,0xab,0xcd,0xb6,0x36,0x6f, + 0xda,0xc7,0x9b,0x99,0xa3,0x75,0x5e,0x88,0x3f,0xed,0xdc,0x6d,0xe0,0xeb,0x6b,0x3e, + 0x6a,0xcd,0xc,0x97,0x1,0x84,0x3d,0x68,0x43,0xfe,0xcc,0x63,0xe,0x1f,0xa6,0x34, + 0x0,0x71,0x9,0x82,0x91,0xb,0xdd,0xa6,0xa1,0x68,0x42,0x96,0x40,0x63,0xdd,0x4e, + 0xe8,0xad,0x9,0x67,0xd,0x8b,0x34,0x9b,0x4e,0xe2,0x4f,0xd6,0x3a,0x54,0xc,0xba, + 0x8f,0x9c,0xb1,0xb7,0xdd,0x37,0x8f,0x39,0xbf,0x6a,0xf0,0xf4,0x1,0x48,0x4d,0xaa, + 0xf6,0x40,0xee,0xbd,0x4d,0x53,0x81,0x71,0xa8,0x50,0xb8,0x5d,0x79,0xbf,0x22,0xde, + 0x6b,0x30,0x87,0xfb,0x56,0x47,0x35,0x6e,0xbe,0x6d,0xde,0x22,0x77,0x87,0x99,0x56, + 0x2b,0xbc,0x7d,0x6f,0x39,0x41,0x24,0xab,0x54,0xe0,0xc0,0x5d,0x30,0x8e,0x23,0x58, + 0x62,0xea,0x29,0x8b,0x9f,0x15,0xfd,0xec,0xb0,0x3c,0x3e,0xe,0xd8,0x89,0xd3,0xeb, + 0x4f,0x6a,0x73,0xdf,0x26,0xcd,0x81,0xb9,0x7c,0x0,0xfa,0xc2,0xc6,0xb0,0xfd,0x94, + 0x0,0x54,0x2c,0x9a,0xb3,0xab,0xcc,0x17,0x68,0xc,0x62,0xa2,0xfd,0x1e,0xb7,0x6a, + 0x34,0xe,0x61,0x7a,0x57,0x6a,0x67,0x90,0x95,0x68,0xa4,0xa6,0x25,0x85,0xb2,0x4e, + 0xa7,0x1a,0x5e,0xef,0xc3,0xba,0xd3,0x6d,0xb8,0x2b,0x77,0x51,0x8a,0xa4,0xcd,0xdb, + 0x25,0xb6,0xe4,0x43,0x6c,0xfe,0xb3,0xe0,0xb2,0xcb,0xdc,0x7a,0xe1,0xf8,0xcb,0x9c, + 0x1,0x42,0x53,0xeb,0x78,0x67,0xfc,0xff,0xdc,0xbd,0x57,0x93,0x65,0x57,0x76,0x26, + 0xf6,0xad,0x7d,0x6d,0x7a,0x6f,0x2b,0xb3,0xbc,0x41,0xa1,0x50,0x28,0xb8,0x46,0x77, + 0xb3,0xd9,0x6c,0xb2,0x87,0x43,0xce,0xc,0x29,0xf2,0x41,0x13,0x13,0xa,0xc5,0x88, + 0x8a,0xd0,0x1f,0xd3,0x8b,0xa4,0x27,0x29,0x82,0x31,0x33,0x9a,0xa1,0x46,0x24,0x41, + 0xb6,0x41,0x37,0xba,0xe1,0xb,0x28,0xa0,0x50,0xde,0x64,0x65,0x56,0x7a,0x9f,0x37, + 0x6f,0xde,0xbb,0x97,0x1e,0xb6,0x5b,0x6b,0x9f,0x73,0xab,0x6a,0x28,0x2a,0x44,0xa9, + 0x9a,0x20,0x50,0x69,0xaf,0x39,0x67,0xaf,0xb5,0xbe,0xf5,0x19,0xb9,0x77,0xca,0x2f, + 0x4,0x2e,0xa6,0x9f,0x49,0x7,0x22,0x96,0x8c,0xf7,0x0,0x50,0x65,0x47,0x5e,0x26, + 0x29,0x94,0x31,0xab,0x9c,0x67,0x97,0x9,0x84,0x84,0xb3,0x2e,0x92,0x4a,0x2e,0x50, + 0x12,0x21,0x50,0xc9,0x5b,0x40,0x1e,0x20,0x1,0x99,0x10,0x6c,0x5b,0x32,0xb2,0x7e, + 0x53,0x8,0x6,0xf1,0xda,0xdd,0x50,0x53,0xa4,0x2c,0x8a,0xa2,0x5d,0xbc,0x43,0x2a, + 0xd,0xe0,0x25,0x69,0x26,0x1d,0x86,0x52,0x1b,0x1d,0x89,0x6e,0xfe,0x63,0xb2,0x88, + 0x23,0x70,0xc0,0x14,0xf5,0x21,0xce,0xa9,0x24,0x24,0x82,0x84,0xac,0x68,0xeb,0xe0, + 0x5e,0x7d,0x55,0xe7,0x69,0x74,0x25,0xb1,0xc3,0x69,0x7b,0x93,0xf2,0xe3,0x52,0x7a, + 0xb7,0x97,0xdf,0x92,0x31,0x6e,0x1e,0x8f,0x8c,0x5e,0x62,0xb0,0xb5,0x30,0xc6,0x90, + 0x65,0x47,0x73,0xb7,0xe,0x76,0x87,0x25,0x4b,0xc6,0x1a,0x37,0xc9,0xfb,0xad,0xa0, + 0x85,0x38,0xbb,0x93,0x5e,0x85,0xf5,0x1e,0x2e,0x41,0xba,0x62,0xd2,0xf6,0x53,0xa0, + 0xf1,0x20,0xbb,0x2e,0xe2,0x20,0x22,0x27,0xeb,0xa,0xce,0x35,0x8a,0xad,0xcd,0x5a, + 0xbc,0x40,0xf9,0xe9,0xa5,0x73,0xd7,0x19,0x65,0x9e,0x49,0x62,0x85,0xc9,0x85,0x8, + 0x7a,0x81,0xf7,0xc9,0x38,0xe1,0x60,0x14,0x12,0xdc,0xd7,0xc8,0x67,0xdb,0xca,0xdb, + 0x3c,0xd1,0x54,0x7c,0xb,0x1a,0x93,0x44,0xd9,0x73,0xbc,0xe2,0x94,0xc6,0x89,0x79, + 0x1f,0x62,0x68,0xc1,0xc,0xc3,0x61,0xaf,0xe7,0x49,0x70,0x4c,0x4c,0xb0,0xc6,0xb7, + 0xc7,0x36,0x1a,0x47,0xab,0xa0,0xb2,0xc0,0x9d,0xe4,0xa4,0xfa,0x4b,0x45,0x5b,0x15, + 0x75,0x7f,0x3d,0xeb,0xe9,0x3d,0xd,0xd9,0x46,0x70,0x3f,0xbc,0x87,0x42,0x72,0x8a, + 0x8b,0x7c,0x8f,0xa4,0x54,0x4b,0xd6,0x9,0x5,0x57,0x34,0x12,0xef,0x91,0x5a,0x23, + 0x96,0x8e,0x3d,0x2,0x39,0x4c,0xf6,0xb4,0xe9,0x5c,0x62,0x41,0x5f,0xca,0x56,0x53, + 0x2e,0x56,0xce,0x72,0x4a,0x48,0x4c,0x9e,0x74,0x2a,0xa8,0x85,0xa2,0xa5,0xb1,0x3, + 0xef,0x2a,0x14,0xb4,0xff,0xae,0x39,0xd,0xc1,0x96,0xe,0x35,0xb7,0x3e,0x68,0xcf, + 0xad,0xa4,0x9c,0x9b,0xa2,0xf5,0x80,0x83,0x2f,0xf6,0xc6,0x90,0xb1,0xd6,0xf1,0xd, + 0xac,0xfb,0x66,0x1b,0x6d,0x8a,0x3d,0x49,0xcd,0xb2,0x32,0x90,0x88,0xfc,0x3f,0xce, + 0x82,0xad,0x38,0x1b,0xbe,0xf2,0x11,0xa7,0xc4,0x25,0x54,0x22,0x1e,0x85,0xf5,0x2e, + 0x65,0x2c,0x77,0x14,0xb8,0x6a,0xe1,0xa3,0x55,0xc5,0x20,0x16,0x1d,0x96,0xb6,0xa5, + 0xcb,0x8b,0x9d,0x88,0x2b,0x14,0x93,0x45,0x64,0x30,0xb2,0x94,0xe8,0x72,0x26,0x5f, + 0x82,0x28,0x94,0x50,0x52,0x2f,0xd9,0xa9,0x92,0x0,0x76,0x24,0x43,0x2e,0xad,0x71, + 0x29,0x8b,0xeb,0x2c,0x81,0xa9,0x59,0x13,0x36,0x62,0xfc,0x6a,0xee,0x8f,0xce,0x89, + 0xb5,0x42,0x99,0x8c,0x4f,0x5a,0x4a,0x32,0x93,0x2e,0x76,0x4c,0x2a,0x66,0xb5,0x90, + 0xf1,0xa0,0x62,0x9e,0x50,0x94,0x2a,0xb0,0x8e,0x17,0x55,0xb7,0x4,0x4b,0xd2,0xa1, + 0x8e,0x41,0x95,0xae,0x52,0x4a,0x2,0x58,0x6,0x69,0x53,0x81,0xc3,0x22,0x1a,0x3, + 0x48,0x43,0xb0,0xe0,0xab,0x5d,0x70,0x9a,0xcb,0xed,0x4a,0xb,0x6b,0x1,0x59,0xb9, + 0xb,0x96,0xb8,0x8a,0x66,0x9c,0x41,0x4b,0xc8,0xa8,0x86,0x5a,0xbc,0x29,0x5d,0xc2, + 0x3,0xf1,0x9b,0x38,0x4d,0xe2,0x9a,0x51,0x1d,0x90,0x34,0x23,0xd,0x4e,0x8c,0x9b, + 0xca,0x3d,0x6b,0xdd,0x90,0x98,0x1e,0xd,0x9,0xca,0x9b,0x82,0x2b,0x4d,0x74,0xaf, + 0x8e,0x9,0xea,0x59,0xcc,0xb7,0x1c,0xa2,0x4c,0x6c,0x3d,0x48,0xb8,0x70,0x15,0xf6, + 0x5c,0x52,0x7e,0xa7,0x1a,0x5c,0x22,0xa8,0x0,0x9b,0x78,0x73,0x73,0x16,0xbd,0xe3, + 0xea,0x87,0xf1,0x66,0x6a,0x41,0x9e,0x61,0x39,0x1c,0xce,0x7e,0x42,0x71,0x8b,0xf1, + 0x60,0x78,0xc2,0xd6,0x5a,0x97,0x46,0x63,0x63,0x31,0x67,0xc3,0x86,0xac,0xb1,0x54, + 0x61,0xc3,0x5d,0xb6,0xfe,0x50,0x7,0xdb,0x24,0xc9,0x11,0xeb,0xfd,0x94,0xd1,0x96, + 0xd2,0xeb,0x5c,0xc0,0x97,0x13,0xeb,0x6,0x35,0xa0,0x49,0x6b,0x8e,0xf0,0xdf,0x10, + 0x53,0xa4,0x27,0xcb,0xb1,0xe0,0x39,0x8,0xd,0x60,0xb8,0x2e,0x83,0x5e,0x5a,0x25, + 0x56,0x19,0xa9,0x81,0xf7,0xa8,0x5,0x17,0xc5,0x23,0xa4,0x5d,0xa7,0x75,0x39,0x12, + 0x93,0x76,0xa,0x14,0x37,0x24,0x82,0xf7,0x14,0xbf,0x37,0x5e,0xa9,0x96,0x39,0xba, + 0xe3,0x31,0x87,0x2c,0x4e,0x4,0x21,0x9d,0x9f,0xba,0x39,0xaa,0xe9,0x4c,0x1c,0xb9, + 0x1d,0x9b,0xda,0x23,0x2b,0xde,0x7e,0xcc,0x6f,0x85,0x82,0x31,0x5d,0x85,0x51,0xda, + 0xf0,0x42,0x48,0x36,0xa2,0xc7,0x82,0x54,0xee,0x8b,0x6b,0x35,0x9a,0x94,0x27,0xe, + 0x48,0x62,0x4,0x93,0x1a,0x8b,0x8d,0x34,0xfc,0x91,0x9,0x78,0xfe,0x99,0x47,0xc3, + 0x24,0x39,0x57,0x68,0x62,0x1c,0x9,0xdb,0xb2,0x5,0x30,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x2e,0x8e,0x2e,0x30,0x6,0x8c,0x12,0x63,0xb2,0x2,0xb1,0x52,0x1e, + 0xde,0xc,0x42,0x9e,0xb4,0xe3,0x33,0xdf,0x99,0x59,0x6b,0xe8,0xc2,0xee,0x5c,0x7a, + 0x27,0x4a,0xd0,0x3b,0xf4,0xfc,0xce,0x5a,0x6,0x6c,0x9d,0x9b,0x13,0x5b,0xb0,0x71, + 0xdd,0x2e,0x79,0x1a,0x1e,0x1b,0xb6,0x81,0x8a,0xe7,0x78,0x71,0x64,0x18,0xb0,0x2e, + 0x63,0xd6,0x5a,0x9f,0x77,0x10,0x7b,0x83,0x40,0x8,0xb4,0x30,0x91,0xdf,0x42,0x86, + 0x9,0x36,0xfa,0xb8,0x89,0x22,0xca,0xc5,0x1c,0xd,0x4a,0xb1,0xef,0x2a,0x8e,0x54, + 0x4c,0xed,0x12,0x19,0xd1,0x88,0xb9,0x8c,0x22,0x12,0xbe,0xee,0x3d,0x12,0x19,0xab, + 0x6a,0x12,0x96,0xf2,0x2f,0x41,0xe3,0xe5,0x3c,0x53,0xa2,0x68,0x33,0x20,0x26,0x41, + 0xca,0x5c,0xe3,0x92,0xa9,0x48,0x28,0x52,0xac,0x9c,0xc,0xa5,0x79,0x85,0xce,0xb4, + 0xa6,0x12,0x8c,0x82,0x45,0x1a,0x5a,0xa1,0x88,0xaa,0x41,0x95,0xa,0x8f,0x31,0x25, + 0xa5,0x91,0x92,0x50,0xa9,0x59,0x9f,0x50,0x42,0x6a,0xcb,0xed,0x38,0x49,0x91,0x1a, + 0x48,0xb1,0x70,0xc5,0xe3,0xc8,0xd7,0xfa,0x59,0x71,0xcc,0xa1,0x2b,0x95,0xca,0x46, + 0x42,0xd3,0x8,0xcd,0xf0,0xcd,0x19,0xfd,0xb1,0x83,0x93,0x64,0x43,0x82,0xea,0xf8, + 0xa4,0x46,0x94,0x95,0xb2,0x90,0x54,0x48,0x69,0x9e,0x16,0x9f,0x90,0x71,0x16,0xc1, + 0x89,0xa4,0xfd,0x21,0x62,0x7a,0x9a,0x30,0xad,0x1,0x84,0xa7,0x1d,0x15,0x1b,0x4f, + 0x79,0x51,0x46,0x0,0x24,0x4c,0xad,0x26,0xcd,0xaa,0x26,0x18,0xbe,0x80,0x54,0x52, + 0x14,0x19,0x17,0x17,0x96,0x12,0xca,0xd3,0x7e,0xdc,0xc0,0x78,0x6b,0xca,0x50,0x67, + 0x8c,0x80,0xd7,0x8d,0x84,0x2d,0x93,0x5c,0x8d,0xc5,0x64,0x2f,0x9c,0xe2,0x98,0x44, + 0x9,0xcf,0xec,0x9b,0x2a,0x81,0xd6,0x6e,0x44,0x6e,0x2d,0xe9,0x8e,0x4,0x99,0x6b, + 0x6c,0x4a,0x9d,0x12,0x7b,0x72,0xe3,0x53,0x2a,0x39,0x4e,0x32,0x14,0x36,0xb0,0x19, + 0x9b,0x84,0x92,0xd9,0x95,0xfb,0xa2,0x4a,0x16,0x76,0xea,0xcc,0x71,0xbc,0x14,0x17, + 0x96,0xc8,0x18,0xb,0xb6,0x44,0xc6,0xc0,0x5a,0xcb,0x15,0x18,0xb2,0xb0,0x5c,0x71, + 0x13,0x3b,0x55,0xfc,0xe4,0x2,0x58,0x17,0xf4,0x92,0x3c,0xb8,0x62,0x1d,0xd0,0x16, + 0xba,0x61,0x29,0x1e,0x21,0xf5,0x88,0x74,0x50,0x20,0xc2,0x85,0xa2,0x1e,0x9d,0xcb, + 0xc4,0xe,0x38,0xed,0x78,0x43,0x2e,0x8,0x47,0x66,0x5d,0xa2,0x2e,0xe6,0xe1,0x41, + 0x10,0x53,0x21,0xf5,0xc8,0xec,0x96,0xdc,0x1c,0x62,0xe6,0x7c,0xdd,0x95,0x1c,0xf0, + 0xb2,0xce,0x58,0x85,0x73,0x8b,0xbb,0x3f,0xe8,0x8f,0xa1,0x9c,0xd6,0x15,0x31,0xb, + 0x54,0xa1,0x94,0x97,0xce,0x9c,0x86,0x78,0xe2,0x64,0x6c,0xc9,0x1c,0xe3,0x49,0xe2, + 0x5e,0x3d,0xc4,0xf0,0x70,0xf4,0x79,0x29,0x18,0x4d,0x19,0x3f,0xd8,0xfb,0x3f,0xd1, + 0xf6,0x47,0x9a,0xc8,0x70,0x6c,0xa8,0x28,0xb1,0x6a,0x3d,0xe8,0x1e,0x7d,0x64,0x15, + 0xa1,0x7,0x29,0xf2,0x37,0x97,0x94,0x90,0x3e,0xd,0x24,0x1d,0x5d,0x5c,0x87,0x46, + 0x2e,0x43,0x24,0x5,0x86,0xa9,0x98,0x82,0x87,0x92,0xb9,0x2d,0x1a,0x5d,0xa9,0x45, + 0x15,0x47,0xec,0xc3,0x37,0xef,0x6e,0x60,0xf2,0x84,0x83,0x18,0x6b,0x1e,0x3e,0x27, + 0x34,0xc7,0x1e,0x46,0xf2,0xdb,0x6c,0xef,0xe7,0x66,0x1c,0x28,0x6e,0x5d,0x88,0x30, + 0x47,0x75,0x1a,0x59,0x43,0xce,0x2d,0x82,0x2d,0xfb,0xc9,0xdd,0x5a,0xc3,0x64,0xac, + 0x6f,0x7e,0xfd,0x7f,0x44,0x67,0x15,0xf6,0x6c,0x3,0xb2,0x4,0x76,0xe1,0x2d,0x49, + 0x44,0x6f,0xe0,0x34,0x6d,0x59,0x6c,0x2a,0xb2,0xa0,0x4e,0x1d,0x7b,0x6a,0x44,0xda, + 0x67,0x40,0x29,0x53,0xf2,0x27,0x17,0xec,0xc6,0x8d,0xa,0xd,0xcb,0xcd,0x64,0x64, + 0xe1,0xab,0x7a,0x2f,0x6b,0x5,0xc8,0x73,0xb1,0xbf,0x85,0xf6,0x9c,0xa6,0x12,0xf0, + 0x30,0x9f,0xc2,0xf5,0x25,0x20,0xf7,0x82,0x44,0x65,0x20,0xbe,0x28,0xfe,0x12,0x1e, + 0xb,0x14,0x27,0x96,0xbb,0x45,0xe9,0xf9,0x1d,0x8d,0x26,0x74,0x3e,0xbb,0x60,0xc1, + 0x72,0xa9,0x30,0x48,0x96,0x2e,0x4d,0x0,0x54,0x12,0xac,0x60,0x91,0x59,0x8,0x17, + 0x65,0x25,0xd5,0x2b,0x48,0xcb,0xfd,0x89,0x18,0xe1,0x3c,0x41,0x2a,0x94,0x6,0x2, + 0x54,0x80,0xcc,0xb9,0xd0,0xdc,0xe6,0x1b,0x11,0x69,0xd,0xab,0xf2,0xaa,0x73,0xde, + 0x1f,0x53,0x26,0x45,0xcb,0x3d,0x2c,0x58,0xaf,0x82,0x5,0x64,0x4f,0x65,0xa9,0x9f, + 0xa9,0xa7,0xd6,0x8d,0x91,0x42,0x74,0xa8,0xf0,0xfb,0xf3,0x8f,0x43,0xeb,0xd4,0x3, + 0x66,0x9e,0xc9,0x24,0x29,0x42,0x13,0xd1,0xd8,0x42,0x44,0x4a,0x31,0xa5,0xa2,0x62, + 0x42,0xa1,0xa9,0x78,0xa8,0x17,0x1e,0x62,0x67,0x31,0x9,0x9a,0x30,0x4d,0x82,0x9c, + 0x92,0x2b,0xd,0x9d,0xb1,0xc0,0x44,0x83,0x93,0x64,0x4e,0x23,0x22,0xfd,0x48,0x1d, + 0x73,0x9c,0xa4,0x5c,0x7a,0xfb,0x2b,0x15,0x6b,0xd0,0xfa,0x14,0x2a,0x7b,0x43,0x93, + 0x13,0xa6,0x58,0x6d,0xa,0x29,0xb5,0x96,0x53,0x3a,0x68,0xdc,0x89,0x77,0x48,0xa, + 0x5d,0xc8,0xb8,0x4d,0xad,0x63,0x61,0x87,0x43,0xd4,0xc0,0x90,0x35,0x6c,0xd,0x33, + 0x5b,0x9f,0xd6,0x61,0x3,0xd3,0xcd,0x11,0x83,0x8d,0x73,0xaf,0x6,0x99,0xb8,0x23, + 0x8e,0x7,0xe,0x67,0x90,0xa8,0x44,0x34,0x8c,0xfb,0xe9,0x9e,0x83,0xe0,0xac,0x50, + 0x4c,0x20,0xca,0x19,0x5f,0x70,0x8c,0x37,0x46,0x75,0xd0,0xba,0x49,0xc4,0x42,0x48, + 0x81,0xa0,0x84,0x89,0x88,0xa9,0x40,0x95,0xa6,0x12,0x9f,0xa,0x69,0x7a,0x63,0xa0, + 0xd7,0x53,0xd1,0x57,0x5f,0xee,0x73,0x49,0x99,0x21,0x82,0xb2,0x3,0x33,0x69,0x14, + 0xa3,0xc2,0x9,0x49,0xff,0x15,0xdc,0xd9,0xfd,0xdd,0x69,0x39,0x41,0x19,0xde,0xdc, + 0xc4,0xe9,0xcf,0x53,0xec,0x3c,0xac,0xdb,0x7f,0xc4,0xcb,0x3f,0xb4,0xab,0x96,0x61, + 0x29,0x11,0xb7,0xa4,0x2d,0x9f,0x5a,0x45,0x47,0x83,0x43,0x8,0x4,0x9,0x52,0xcb, + 0x1f,0x5e,0xfb,0x24,0x1,0x34,0x82,0x89,0xec,0x7d,0x16,0x90,0xf2,0xe6,0xa5,0x90, + 0x33,0xdb,0x90,0xaa,0xc3,0xa1,0x10,0xf7,0xc9,0xca,0x26,0x41,0x17,0x96,0x92,0x1f, + 0x94,0x1c,0x24,0x4b,0xe8,0x40,0x72,0x98,0x48,0xe2,0x9,0xff,0x42,0xfa,0x52,0x47, + 0xe9,0x4c,0x65,0x36,0xa4,0xd5,0xc3,0xe1,0x9d,0x10,0x42,0x29,0xf8,0x32,0x1e,0xb0, + 0x1b,0xf2,0xc4,0x3,0xb,0x76,0x3a,0x42,0x30,0xac,0xe3,0x91,0xa0,0x52,0x31,0x60, + 0xeb,0x60,0x78,0x3,0xc3,0xcc,0xd6,0x38,0x13,0x78,0xeb,0x24,0x21,0x6c,0xd9,0x54, + 0xc,0x71,0xd7,0x32,0x3b,0x64,0x8b,0xd9,0x80,0x6d,0x97,0x25,0x7f,0x28,0x66,0x14, + 0xd8,0x8,0xdb,0x38,0x4f,0x7d,0x66,0x56,0x83,0x19,0x4b,0x70,0x22,0x3f,0xe,0x8a, + 0xe,0x9c,0x72,0x6d,0x2c,0xd3,0xe7,0x19,0x25,0x96,0xe1,0x1,0x4d,0xf,0x88,0xad, + 0x83,0xdc,0xa9,0x64,0xd8,0xce,0xfd,0x4e,0x73,0x2,0xbd,0x74,0x30,0x84,0x12,0xa9, + 0xc5,0x6c,0xf5,0xe0,0x85,0x2f,0x4d,0xea,0xa3,0xee,0x18,0x5,0xe8,0x95,0xe5,0x3e, + 0x3b,0x3c,0xd,0xca,0x25,0x68,0x61,0xda,0xc,0x92,0x63,0x4e,0xba,0x39,0x25,0x9f, + 0x52,0xa8,0x8e,0x9a,0xe8,0x59,0x16,0xe2,0x78,0x55,0xe5,0x4e,0x13,0x9c,0x3d,0x67, + 0x2a,0xc9,0x9a,0x21,0x5,0xfd,0x13,0x6b,0xb8,0x4c,0xa5,0xac,0x11,0x21,0x6f,0xab, + 0xd4,0xb4,0xaf,0x20,0xf3,0x92,0x73,0x94,0x35,0xc2,0x50,0x64,0xb1,0xf7,0x78,0xff, + 0xa8,0x7,0xcb,0x9d,0xf3,0x5b,0xb9,0x24,0x20,0x84,0xca,0x7f,0x34,0x65,0xe6,0x8, + 0x79,0x85,0x22,0xe2,0xd2,0x6f,0xa4,0x3c,0x32,0x54,0x7e,0x5c,0x66,0xfb,0x92,0x3e, + 0x3c,0xc,0xc9,0xa8,0xc8,0xc4,0x56,0x4f,0x93,0x75,0x5c,0xad,0x9b,0x0,0x3d,0x86, + 0x7d,0x39,0x2a,0xf0,0x53,0xa2,0xf1,0x93,0x24,0x49,0xc3,0x13,0xa3,0xc,0x50,0xa0, + 0x8b,0x77,0x94,0x9,0x49,0x67,0x13,0x32,0x89,0x84,0x10,0xa7,0x18,0x13,0xfd,0xff, + 0x28,0x9f,0x7a,0x44,0x6,0x78,0x28,0xde,0xfd,0xfd,0x75,0xc,0xf6,0x35,0xa8,0xaf, + 0xaf,0x8e,0x81,0x46,0x1d,0x7d,0x8d,0x3a,0x9a,0x8d,0x1a,0xfa,0xfb,0xea,0xd4,0xdf, + 0xa8,0xa3,0x5a,0x21,0xe7,0x94,0x49,0x40,0xb7,0x6b,0xd1,0xe9,0x58,0xde,0xd9,0x3f, + 0xc2,0xfa,0xf6,0x1,0x9e,0xad,0x6e,0xf3,0xd6,0xfe,0x41,0x8a,0x41,0x2d,0xb8,0x2a, + 0xf8,0xa9,0xc4,0x58,0xeb,0x4f,0x78,0x30,0xac,0x1,0x19,0xeb,0x42,0xac,0xfc,0x4e, + 0xde,0x1a,0xa7,0xde,0x21,0x72,0x7b,0x75,0xef,0xa9,0xe0,0xea,0x50,0xb2,0xa8,0x55, + 0x4f,0x23,0x4c,0xe5,0x50,0x70,0x79,0xdc,0x9c,0x7,0x85,0x94,0xc0,0x3e,0x4c,0x80, + 0xe6,0xc3,0xae,0xdd,0x19,0x72,0x27,0x12,0x63,0x61,0x8d,0x98,0xf6,0xbc,0xd2,0x6e, + 0xc0,0xf9,0x7f,0x19,0x21,0x22,0x14,0x10,0x3a,0xe7,0x13,0x8b,0xca,0xd9,0xcc,0xec, + 0x85,0x49,0xeb,0xa2,0xd4,0xdd,0xc0,0x19,0x1a,0xe9,0x5d,0x5,0x38,0xed,0xb0,0x23, + 0xd3,0xd9,0x23,0x45,0x69,0x92,0xf0,0xaa,0xac,0x90,0xe0,0xed,0x3f,0x48,0x29,0x93, + 0x1e,0x6c,0x10,0x7c,0xca,0x8c,0x33,0xed,0x4b,0x1c,0xc7,0x18,0xc,0x28,0x91,0xb2, + 0xf8,0x7a,0x50,0xa2,0xb8,0x9a,0xa0,0xe5,0xf,0x13,0x7a,0x82,0x22,0x3,0x0,0x4f, + 0x1e,0x6b,0xf0,0xea,0x83,0x84,0x5,0x7a,0x34,0x2b,0xd3,0xb9,0xb0,0xc4,0xf1,0xc1, + 0x0,0x6a,0xb5,0xa,0x6,0x9b,0x75,0x34,0x1b,0x75,0x6a,0x36,0x6a,0xe8,0xab,0xd7, + 0xd0,0xa8,0x55,0xd1,0xec,0xab,0xa3,0x5e,0xad,0x50,0xad,0x6a,0x50,0x31,0x6,0xc6, + 0xb8,0x7f,0x93,0x21,0xd4,0x8c,0x47,0x98,0x1c,0xd5,0xc,0x96,0x2d,0x6c,0xf0,0xc7, + 0xb0,0x8c,0x2e,0x5b,0x74,0xba,0x8c,0x4e,0xa7,0x8b,0x93,0x4e,0x17,0xed,0x93,0xe, + 0x77,0x3a,0x16,0x27,0xdd,0xe,0xda,0xed,0x2e,0xb5,0x3a,0x1d,0xb4,0x5a,0x27,0x38, + 0x68,0x1d,0x73,0xeb,0xf8,0x4,0xdd,0x2e,0xcb,0xa6,0x2a,0x1a,0x1a,0x71,0xcc,0xe9, + 0xc8,0x38,0x56,0x24,0xc2,0xc3,0x4c,0x60,0xff,0xb9,0xcb,0x1a,0x20,0x22,0xb,0xeb, + 0xd4,0xf,0xd6,0x13,0xfb,0xd,0x93,0x89,0xec,0x45,0xb8,0xd9,0xdb,0x7a,0xd8,0x9d, + 0x45,0xbc,0x97,0x5,0xd8,0x90,0x31,0xc,0x8b,0xb0,0xd7,0x8a,0xc2,0x37,0x90,0xcc, + 0x2e,0x15,0x39,0x2,0x3a,0xd,0x56,0x57,0x3c,0xbd,0x88,0x83,0x34,0x9c,0x52,0x48, + 0x72,0xbe,0xd4,0x64,0xb5,0x86,0xd6,0x8,0xab,0x3c,0x97,0xab,0x2c,0xa1,0x6d,0xa5, + 0xa1,0xa3,0x82,0x23,0x90,0xca,0xe9,0x2e,0x21,0xd2,0x91,0xb2,0x74,0xa5,0x42,0x1, + 0x28,0xc5,0xa0,0x95,0x40,0x97,0x94,0x56,0x91,0x44,0x71,0x92,0x30,0x38,0x51,0x89, + 0x46,0x1b,0x72,0x9f,0xdc,0x23,0xdb,0x26,0x7b,0x1e,0xc5,0xc9,0x5d,0x1a,0xda,0xc8, + 0x6a,0xc4,0x99,0x49,0xb,0x17,0xf7,0xf,0xaa,0xe7,0x35,0x2f,0x72,0xb0,0x57,0x49, + 0x6c,0x4c,0xac,0xa5,0x6d,0x65,0xeb,0xc,0x92,0x40,0x7f,0x1e,0xc9,0xca,0xe5,0x94, + 0x78,0x42,0x76,0xe9,0x48,0xfb,0xe1,0x5e,0x54,0xfa,0x2,0xcb,0x48,0x1,0xf0,0xc5, + 0xb5,0x4d,0x4e,0x49,0xe4,0x22,0xb,0x51,0x12,0x3e,0x73,0x6d,0xba,0x9c,0xa,0x2, + 0x21,0x47,0x98,0xc8,0xb0,0x40,0xe5,0x54,0x21,0x50,0x76,0x97,0x70,0xa4,0x2b,0x7, + 0x9a,0x1b,0x27,0xcb,0xf1,0x90,0xaf,0xdf,0xdd,0x26,0x6,0x7b,0x28,0x3e,0x71,0x8f, + 0x6e,0x48,0x76,0x66,0x71,0xc2,0x49,0x1a,0x34,0x82,0x49,0x68,0x79,0xf0,0xc1,0x14, + 0x65,0x3e,0xf7,0x3d,0x20,0xe1,0xe2,0xc3,0x51,0xb0,0xb,0x6a,0x36,0xaa,0x18,0x1d, + 0x1c,0xc0,0xa9,0xe9,0x11,0x9a,0x9b,0x1c,0xc5,0xdc,0xe4,0x30,0x66,0xc6,0x87,0x69, + 0x6a,0x62,0x10,0x53,0x63,0x43,0x98,0x1e,0x1b,0xa2,0x99,0xf1,0x61,0xf4,0x35,0xaa, + 0xa8,0x54,0x2a,0x20,0x22,0x74,0x3a,0x1d,0x1c,0x1e,0x77,0x70,0xef,0xf1,0x73,0xfe, + 0xfc,0xbb,0x25,0xfc,0xf2,0xf3,0xbb,0xf6,0xeb,0x7b,0xcf,0xb0,0xb2,0xb9,0x1b,0xe8, + 0x3e,0xd1,0xe9,0x4d,0xf1,0xb8,0xc9,0x18,0x66,0x77,0xea,0x18,0xe7,0xdb,0x4e,0x64, + 0xc8,0xed,0xd3,0x3d,0x5a,0xcc,0xb6,0x42,0xc4,0xc,0x4b,0x36,0xb9,0xe4,0xf8,0x4b, + 0x97,0xc5,0x96,0x52,0xc8,0xe1,0x3,0x61,0x2a,0xc2,0xe7,0x9,0xf5,0x30,0x26,0x70, + 0xe,0x9c,0x8f,0x3c,0x87,0xa4,0x78,0x13,0xc8,0x73,0xd1,0xe7,0x2c,0x8d,0x88,0x4, + 0x4a,0xf9,0xe8,0x71,0x53,0x67,0x4,0xbc,0x1e,0x1a,0x7d,0xc3,0x14,0x77,0x45,0xa2, + 0x71,0x74,0x4f,0x8b,0x33,0xc2,0xac,0xb8,0xae,0xbc,0xe7,0xbb,0x36,0x3a,0xc,0xde, + 0x7d,0xc2,0x4d,0x25,0xf5,0x94,0xa1,0x28,0xfb,0x62,0x60,0x2,0xef,0x4d,0x49,0x6a, + 0x59,0xb0,0x7a,0xe5,0x72,0x20,0xa8,0x95,0x38,0x4c,0xde,0x3e,0xb9,0x53,0xdc,0x94, + 0xd2,0x64,0x6,0xae,0x55,0x11,0xa,0x11,0x71,0x58,0x9b,0xb4,0x9b,0xf1,0xad,0x96, + 0x91,0xec,0x38,0x9f,0xc1,0x2e,0xf8,0x23,0xfe,0xf4,0xa,0x2b,0x2a,0x8e,0xc,0x38, + 0x12,0x11,0x46,0x1c,0xd7,0xf1,0x9c,0x11,0xb2,0x4c,0xc5,0xd0,0xd8,0x50,0x1f,0xa6, + 0xc7,0x87,0x68,0x76,0x7c,0x18,0x13,0xa3,0x3,0x18,0x1f,0x19,0xc4,0xc4,0xe8,0x0, + 0x4d,0x8e,0xe,0x61,0x62,0xa4,0xf,0xc3,0x3,0x7d,0xe8,0x6b,0xd6,0xa9,0x5e,0xad, + 0xa0,0x5e,0xab,0xa2,0x5e,0x73,0xff,0x6e,0xd4,0xab,0xa8,0x57,0x2b,0xb0,0x96,0x71, + 0xd2,0xb5,0xe8,0x74,0x2d,0xd8,0x32,0x3a,0x5d,0x8b,0x4e,0xb7,0x8b,0x4e,0xd7,0xa2, + 0xd5,0x3e,0xc1,0xe1,0xd1,0x31,0xf6,0xe,0x8f,0xf9,0xe0,0xa8,0x4d,0xfb,0x47,0x2d, + 0xec,0x1f,0xb6,0xb1,0xbb,0x7f,0x84,0xed,0xfd,0x23,0xde,0xd8,0xda,0xc7,0xca,0xc6, + 0x2e,0x2d,0x6f,0xec,0xf2,0xfa,0xf6,0x3e,0xe,0x8e,0x8e,0x5d,0x78,0x1d,0x92,0xc7, + 0xf,0x89,0x70,0xa3,0xd0,0xc6,0x5b,0x4e,0x2b,0x8e,0xd0,0x26,0x86,0x28,0x17,0xcf, + 0x31,0x61,0x36,0xae,0x9c,0x93,0x35,0xce,0xea,0xc7,0x10,0x60,0x8d,0x67,0x8d,0xb0, + 0x8f,0x68,0x33,0x6e,0xd6,0x76,0x41,0x3b,0x36,0xb4,0x12,0x1c,0x49,0x3b,0x22,0xdf, + 0x8f,0xa2,0xe0,0x30,0xdc,0x19,0x2c,0xf2,0x3a,0x48,0x67,0xa5,0x27,0xf3,0x3d,0x16, + 0xab,0xe7,0x38,0x5a,0xca,0xa0,0x29,0xd6,0x0,0x14,0x67,0x41,0x5a,0x9a,0xb0,0x2c, + 0x51,0x69,0xb1,0x96,0x9a,0x7c,0xe3,0x2f,0x3e,0x2b,0xa5,0x22,0xe7,0xf4,0xf8,0xd2, + 0xf3,0xbf,0x34,0x48,0x53,0x89,0x47,0x72,0xd7,0xb2,0x34,0x81,0x53,0x4f,0xc9,0xbd, + 0x9e,0x32,0x8b,0x5f,0x5f,0xfc,0xaf,0x17,0x89,0xca,0xd0,0x43,0x76,0x97,0x6b,0x28, + 0xf3,0xe2,0x5f,0x7c,0x55,0x9,0x59,0xc,0xaa,0x5c,0xec,0x17,0x8,0x5f,0xa1,0x48, + 0xe5,0x7a,0x1b,0xd6,0x3c,0xa8,0xa2,0xb9,0xab,0x60,0x8a,0x97,0x18,0x8,0x20,0xf, + 0xc4,0xc1,0x8b,0x65,0x80,0xa5,0xa,0x82,0x7c,0xd5,0xc1,0x5,0x14,0x86,0x7b,0x91, + 0x57,0x55,0x48,0xf,0x95,0xff,0x9e,0x1e,0xf1,0xe6,0xb9,0x34,0x8f,0x4,0xe7,0x11, + 0x22,0xdf,0x4,0x46,0xe4,0x92,0x8b,0x54,0xa8,0x68,0x7d,0x49,0x26,0x4e,0xde,0x6e, + 0x63,0xee,0x77,0xb9,0x1e,0x6a,0x4f,0x66,0x96,0xa2,0xa8,0x93,0x37,0x6d,0xf,0xcc, + 0xea,0xe4,0x70,0x1d,0x68,0x3a,0xa4,0xf2,0x56,0x3,0x32,0x10,0x81,0x9c,0xf8,0xd0, + 0x62,0x56,0x76,0xa0,0x3e,0xb,0x4e,0x1b,0xa6,0x46,0x7,0x69,0x72,0x6c,0x10,0xd3, + 0x63,0x43,0x34,0x35,0x36,0x84,0xc9,0x31,0x77,0x28,0xe,0xf,0xf4,0x61,0xa8,0xbf, + 0x89,0xfe,0x66,0xd,0x3,0xcd,0x86,0x9b,0xc8,0x9b,0x75,0xf4,0x37,0xeb,0xe8,0x6b, + 0xd6,0xd1,0x57,0xaf,0xa2,0x56,0xab,0x4a,0x31,0x53,0xb4,0x7a,0x3c,0x38,0x6a,0x63, + 0x7d,0x7b,0x1f,0x6b,0x5b,0x7b,0xfc,0x78,0x65,0xb,0xf7,0x9e,0xac,0xf2,0x47,0x5f, + 0x3d,0xe0,0xcf,0x6f,0x3f,0xb1,0xdd,0xae,0xd,0xea,0xa0,0xc4,0xdd,0x74,0xa3,0x92, + 0xd,0x26,0xb1,0x96,0xd9,0x3a,0x6c,0x10,0xd6,0xa7,0x51,0x59,0x76,0x49,0x21,0x9e, + 0xbb,0x6b,0xad,0xb7,0x90,0xf0,0x74,0x2f,0xe6,0xc8,0xcb,0x90,0xf9,0xe1,0xe1,0xd5, + 0xf4,0xd3,0xb8,0xda,0x9b,0xbb,0xd5,0x87,0x71,0xaa,0x28,0x63,0xa4,0xe3,0x1e,0xbb, + 0x98,0xe8,0xa0,0x87,0x8e,0x43,0xa1,0x34,0x66,0x9e,0x9d,0x1c,0xa1,0x6b,0x17,0xe6, + 0xe9,0xfa,0xa5,0x79,0x1a,0x19,0xec,0xc7,0xfe,0xc1,0x11,0x7e,0xf3,0xf5,0x23,0xfe, + 0xfa,0xfe,0x12,0xb6,0x76,0x8e,0x14,0x9d,0xb5,0xfc,0x8a,0x27,0x19,0xf,0x95,0x35, + 0xc4,0x81,0x9b,0x9e,0x7f,0x35,0x94,0xc9,0x9,0x14,0x7,0x48,0xa8,0x5c,0x52,0x32, + 0x83,0x8a,0x7a,0x10,0xcb,0x24,0x1f,0x43,0x2b,0x28,0x5e,0xcc,0x89,0x22,0x9c,0x32, + 0xbf,0xd3,0x67,0xc5,0xd7,0x50,0x16,0x36,0x95,0xf8,0xc2,0x3a,0x38,0x80,0x49,0x13, + 0xde,0x44,0xaa,0x20,0xe9,0xbd,0x5,0x44,0x28,0x51,0xca,0x2d,0x8,0x8a,0x9c,0xc1, + 0xfe,0x26,0xcd,0x4d,0x8e,0x60,0x66,0xc2,0x35,0x91,0x33,0x93,0xc3,0x98,0x1a,0x1b, + 0xa2,0xf1,0x91,0x7e,0xc,0xf6,0x35,0xd0,0xac,0xd7,0xd0,0xd7,0xa8,0xa1,0x51,0xaf, + 0x51,0xb3,0x5e,0x45,0x7f,0xb3,0x8e,0x46,0xcd,0x5d,0x9f,0xd5,0x8a,0x41,0xc5,0x10, + 0xaa,0xd5,0x8a,0x5a,0xbf,0xb3,0xc8,0x98,0x90,0xd7,0x2f,0xe0,0xc2,0xff,0xba,0x5d, + 0x1b,0x8b,0x7d,0xbb,0xdd,0x71,0x93,0x7a,0xa7,0x83,0x93,0xae,0x45,0xbb,0x7d,0x82, + 0xd6,0x71,0x87,0xf,0x5a,0xc7,0x68,0x1d,0x77,0xb0,0x7f,0xd4,0xc2,0xfe,0x51,0x1b, + 0x3b,0x7b,0x47,0x58,0xdf,0xde,0xe3,0xd5,0x8d,0x3d,0x2c,0x6f,0xec,0xf0,0xf2,0xda, + 0x2e,0x56,0xb7,0x77,0x99,0xbb,0x71,0xd1,0xc9,0x5a,0x53,0xc8,0x88,0xa,0x73,0x82, + 0x10,0x97,0x39,0x71,0x66,0xd4,0x9e,0x3b,0xff,0x3e,0x8e,0x32,0x4e,0x76,0xa6,0x7e, + 0x60,0x6b,0xb9,0xb,0xb,0x74,0xad,0xff,0x6e,0xcb,0xb6,0x6b,0xc3,0xbd,0xe4,0x3e, + 0xe7,0xfc,0xe2,0xad,0x92,0xc4,0x45,0xdf,0x38,0xe,0x26,0xf5,0x7a,0x60,0xcc,0x8, + 0xae,0x92,0x70,0x8a,0x5c,0xb9,0xa1,0x17,0xba,0xc5,0x9a,0x85,0x62,0xad,0x11,0x83, + 0x76,0x95,0xa,0xb6,0xa9,0xe5,0x39,0xab,0x4a,0x15,0x6a,0x74,0xb1,0x29,0x17,0xc5, + 0x91,0xf2,0x45,0x57,0xd3,0x9e,0xec,0x5a,0x4a,0xa3,0x65,0xb8,0x60,0x76,0x52,0x90, + 0xfa,0x30,0x9,0x2f,0x71,0xa1,0x5b,0x16,0xc6,0xf8,0xba,0x38,0x66,0x26,0x2d,0x4c, + 0x8a,0xa8,0x57,0xa4,0x71,0xb,0x63,0x0,0xce,0x8a,0x39,0x17,0xb,0xa5,0x2e,0x56, + 0x32,0x66,0xb4,0x18,0x70,0x9f,0x18,0xbb,0xe1,0x71,0x53,0xc2,0x6c,0xf2,0xec,0x70, + 0x92,0x42,0x22,0x8,0x9a,0x99,0x4c,0x8f,0xd0,0xc1,0x2f,0xcc,0x45,0x17,0xb7,0x3c, + 0x5d,0x2d,0x34,0x93,0xb9,0xc2,0x82,0x45,0x95,0x25,0x70,0x66,0xab,0xab,0x13,0xd9, + 0xf4,0xde,0x2d,0x38,0x89,0x41,0xe9,0xd4,0xd5,0x1a,0x94,0xf2,0xde,0x45,0xd8,0xbf, + 0x9a,0xb8,0xbd,0x29,0x68,0xb7,0x61,0x1c,0xb5,0x2d,0xf8,0x58,0x7,0x66,0x2f,0x67, + 0xae,0x70,0xce,0x46,0xc6,0x10,0xf9,0x7d,0xae,0x31,0x30,0xc,0xc9,0xba,0x76,0xa5, + 0xd9,0xf8,0x82,0xe3,0x6c,0x9b,0x49,0x84,0xa0,0x32,0x85,0x85,0x7d,0x32,0x41,0xd1, + 0x10,0x25,0x33,0x83,0x2a,0x86,0x1a,0xd5,0xa,0x6a,0xb5,0x3a,0xb9,0x83,0xce,0xa0, + 0xbf,0x51,0xc7,0xc4,0xe8,0x20,0x2d,0x4c,0x8f,0xe2,0xd4,0xf4,0x28,0x9d,0x9a,0x1e, + 0xc3,0xc2,0xf4,0x8,0x4e,0x4d,0x8f,0xd1,0xdc,0xd4,0x8,0x1a,0xbe,0x58,0xcb,0x43, + 0x2f,0xff,0xef,0x18,0xf3,0x2c,0xe,0x44,0x22,0xc2,0x60,0x7f,0x3,0x83,0xfd,0xd, + 0x9c,0x99,0x1b,0xa7,0xf7,0x5e,0x3f,0x83,0x47,0xcb,0x9b,0x34,0x31,0x32,0x60,0xeb, + 0xb5,0x8a,0xb9,0xf3,0x78,0x9d,0xb7,0x76,0xf,0xd0,0xb5,0x5d,0x78,0x7,0x8c,0xb4, + 0x9c,0xf5,0xe9,0xce,0xee,0x25,0x36,0x88,0x4e,0x73,0xee,0x56,0x70,0x4b,0x77,0x76, + 0x94,0x1f,0x1b,0xf6,0x92,0x61,0xb5,0x2e,0xd,0xfa,0x42,0x35,0x31,0x51,0x3c,0xe6, + 0xcb,0x76,0x68,0x9e,0x3c,0xf4,0xce,0x62,0xf5,0x21,0x34,0xea,0x46,0x85,0xb3,0x24, + 0xa,0x7b,0x70,0xd1,0x9d,0x1c,0x1b,0xa4,0x1f,0xbe,0x79,0xce,0xfc,0xfe,0x7b,0x97, + 0xe9,0x87,0x6f,0x5e,0xa0,0xc9,0xd1,0x1,0x6c,0xee,0x1c,0x62,0x7a,0x62,0x98,0x9b, + 0x8d,0x1a,0x7f,0xf4,0xf5,0x3,0xec,0x1f,0x1c,0xa3,0x56,0xad,0xa0,0x52,0x31,0xa8, + 0x1a,0x83,0x4a,0xc5,0xa0,0x56,0x31,0xa8,0x54,0x2b,0x71,0x4d,0x51,0x9,0x5b,0x17, + 0xb1,0x2e,0xd4,0x32,0xd3,0x70,0x17,0x73,0x30,0xcc,0x5,0x23,0x4c,0x92,0x96,0x6c, + 0xd7,0xa2,0xdb,0xb1,0x7c,0x62,0xbb,0xe8,0x76,0x2c,0x3a,0xd6,0xa2,0xd3,0xe9,0xa, + 0x5e,0x6c,0x50,0x76,0x8b,0xfb,0x23,0xd0,0x11,0x5d,0x63,0xe8,0x73,0xa4,0x3c,0x76, + 0xc0,0xce,0x71,0x8c,0x6d,0xa0,0x7b,0x45,0xcc,0xde,0x81,0xc4,0x36,0xcd,0x7e,0xf1, + 0x34,0x8b,0x29,0x9d,0x9e,0xe7,0x17,0x50,0xab,0x8,0x93,0xe8,0xac,0xb5,0x94,0xd0, + 0x2a,0xb3,0xb,0x1c,0x0,0x2,0x76,0xb9,0x2,0xcd,0x46,0x1d,0x8d,0x7a,0x95,0xfa, + 0x9b,0x35,0x4c,0x8c,0xc,0xd2,0xfc,0xd4,0x30,0xce,0x9e,0x9a,0xc4,0xe9,0xe9,0x31, + 0x3a,0x3d,0x3f,0x81,0xd3,0xb3,0xe3,0x34,0x3f,0x39,0xac,0x42,0xd1,0x7a,0x5d,0xab, + 0x52,0x76,0x2d,0x8b,0x79,0xfe,0x75,0xb2,0xc8,0x1b,0x77,0xbb,0xc5,0x86,0x15,0x3, + 0xfa,0x9a,0x4f,0x3c,0x76,0x7d,0x1f,0x6c,0xef,0x1e,0x62,0x69,0x6d,0x9b,0x1e,0xaf, + 0x6c,0xf1,0xc3,0xe5,0xd,0x7a,0xf8,0x6c,0x83,0x9f,0x3e,0xdf,0xa6,0x95,0x8d,0x1d, + 0x3e,0x3a,0x3e,0x41,0xbb,0xdd,0xa1,0x56,0xfb,0x84,0x8f,0x4f,0x3a,0xe8,0x74,0xba, + 0x91,0x9,0x1,0xc1,0x5b,0x12,0x1e,0x16,0x62,0xe5,0xcb,0x86,0x43,0x60,0x11,0x59, + 0x77,0x19,0x5a,0xb8,0xbc,0x54,0xc3,0xc4,0x1c,0x88,0x53,0x1c,0xd6,0x18,0xfe,0xd, + 0x49,0xac,0x6d,0xb2,0x89,0xd1,0x9e,0xc4,0x5c,0xdc,0x63,0x55,0x49,0x5,0x15,0x56, + 0x8e,0x9f,0x16,0x14,0x1b,0xa5,0x6d,0x6b,0x89,0xe8,0x8d,0x34,0x72,0x4a,0x93,0xd7, + 0xff,0xe2,0x33,0x12,0x32,0x2c,0x2e,0x90,0xbb,0x4a,0x48,0xa1,0xc8,0x4c,0x6,0x4a, + 0xed,0xfe,0xf4,0x54,0x96,0x85,0x91,0x95,0x1a,0xdf,0xa8,0xe1,0x1c,0x3d,0xec,0x62, + 0xa9,0x80,0x82,0xab,0x9d,0x1b,0x4a,0xe0,0x8a,0x5c,0x18,0x96,0xc,0x57,0x38,0x23, + 0x7a,0xe8,0xc7,0x29,0x33,0x6f,0x65,0x2a,0x1a,0x73,0xb6,0x2f,0xce,0xa,0x2e,0xa, + 0xd2,0x3a,0x2e,0xcd,0x34,0x47,0x8e,0x37,0x70,0x6a,0x56,0xa4,0xbb,0x9d,0x36,0x8d, + 0xc9,0x5e,0x6b,0xca,0xe6,0x77,0x9,0x8,0x88,0xdf,0x4f,0xf9,0x5c,0xcf,0xba,0x18, + 0xa3,0x44,0x19,0x59,0xc4,0x3a,0x24,0x71,0x32,0x31,0xda,0x74,0x83,0xc1,0xa5,0x97, + 0xb3,0x9a,0x87,0x94,0xfd,0x58,0x16,0x5f,0x47,0x32,0x6f,0x85,0x28,0x6a,0xcd,0xe3, + 0xcd,0x45,0x64,0xc,0xdc,0x8e,0xdc,0xef,0xc5,0x49,0xfe,0xdd,0x38,0xd3,0x67,0x63, + 0x8c,0x71,0xb6,0xca,0x26,0xb0,0xb0,0x1d,0x1c,0xcf,0x50,0x21,0x2c,0x9c,0x3c,0x35, + 0x83,0x1,0x34,0x45,0xad,0x2d,0xca,0x8,0x6e,0x84,0x91,0xe1,0x3e,0x3a,0x37,0x37, + 0x81,0xb,0x8b,0x53,0x74,0xfe,0xd4,0x24,0x9d,0x9e,0x19,0xc7,0xc2,0xec,0x18,0x46, + 0x87,0xfa,0xa9,0x56,0x35,0xa8,0xd7,0xaa,0xa8,0x55,0x5c,0xf1,0x69,0xd4,0x2a,0xa8, + 0x56,0x2b,0xea,0xa0,0xcb,0xf,0xc5,0xb2,0x3,0xf4,0x45,0xc5,0xff,0xe4,0xa4,0x83, + 0xa3,0x76,0x7,0x8f,0x57,0x36,0xf9,0x2f,0x3f,0xf8,0x9c,0xff,0xee,0xe3,0xef,0xec, + 0xfd,0xa5,0x35,0x66,0xcb,0x2c,0xa6,0x75,0xe,0x2,0x1e,0x8,0x53,0x19,0xcf,0xac, + 0xb6,0xfe,0x4b,0xac,0x65,0x96,0xba,0x5c,0xb0,0xd,0xc,0x6c,0x1b,0x8,0x5b,0xc4, + 0xce,0x7a,0xd5,0x93,0xda,0x4c,0xe0,0xb4,0x9b,0x90,0xac,0xe6,0x8e,0xc1,0x50,0xcc, + 0x95,0x99,0x89,0x60,0x63,0xfb,0xf7,0x30,0x98,0xee,0xf9,0x56,0xfb,0xca,0xb9,0x59, + 0xfa,0xa3,0x1f,0x5c,0xa5,0x3f,0xfc,0xfe,0x55,0xba,0xb8,0x38,0x4d,0x8d,0x5a,0x5, + 0x95,0x4a,0x5,0xdd,0x6e,0x17,0x27,0x5d,0x8b,0x8f,0x6f,0x3d,0xe2,0xff,0xf1,0x2f, + 0x3f,0xe4,0x27,0x6b,0x5b,0x68,0xd4,0xaa,0x18,0x1f,0x1e,0xc0,0xe4,0xe8,0x0,0x26, + 0x46,0xdd,0x44,0x39,0x31,0x3c,0x80,0xc9,0xb1,0x41,0x8c,0xd,0xf6,0x61,0x60,0xa0, + 0x49,0x15,0x32,0xa5,0xa8,0x5d,0x78,0xd,0x2d,0xb3,0x9b,0x16,0x4f,0x3a,0x7c,0xdc, + 0xee,0xe0,0xa8,0x7d,0x82,0xdd,0xfd,0x16,0x36,0x77,0xf,0xb1,0xb9,0xb3,0xcf,0x1b, + 0xdb,0x87,0xd8,0xd8,0xde,0xc7,0xda,0xce,0x3e,0x6f,0xee,0x1c,0x62,0x75,0x73,0x17, + 0x7b,0x7,0x2d,0xce,0x32,0x92,0xf5,0x31,0x17,0xa7,0x73,0xe6,0x3c,0x9f,0x12,0x82, + 0x2,0x1f,0xc9,0x45,0x60,0x4d,0xd0,0x93,0xb9,0x59,0xa9,0xf1,0x16,0x91,0x88,0x94, + 0xb7,0xc2,0xbd,0x52,0xff,0xa4,0x24,0x9f,0x0,0xc2,0xe4,0xe8,0x10,0x5d,0xbf,0x38, + 0x47,0x6f,0x5c,0x3c,0x85,0xd7,0xce,0xce,0xd2,0x99,0xb9,0x31,0x1a,0x1b,0x1a,0x40, + 0xb5,0x6a,0x50,0xab,0xb8,0x6b,0xb3,0x51,0xab,0xa0,0x5e,0xaf,0x15,0xae,0xc9,0xfc, + 0x7a,0xcc,0x3f,0xfe,0xb2,0xcf,0x95,0x35,0xab,0xa5,0x20,0x62,0xf6,0xf3,0xc2,0xdf, + 0xc3,0x35,0x70,0xdc,0xee,0xa0,0xd3,0xb1,0x38,0xe9,0x74,0x71,0x74,0xdc,0xc6,0xee, + 0x41,0x8b,0x1f,0xaf,0x6c,0xe2,0xce,0x93,0x55,0xfe,0xfa,0xfe,0x32,0xbe,0xb9,0xbf, + 0xcc,0xcb,0x6b,0x3b,0xcc,0x2c,0x19,0x51,0xc9,0xbf,0x3d,0x7e,0x20,0x5e,0xf7,0x62, + 0x52,0xb7,0xee,0xae,0x71,0x9,0xe8,0xfe,0xef,0x96,0x2d,0x82,0x29,0x13,0xac,0x65, + 0x66,0x4b,0x5d,0x77,0xf,0xb1,0xd,0xc8,0x97,0x47,0xb4,0xd8,0x6,0xb3,0x60,0x56, + 0xab,0x2a,0x8e,0x76,0x43,0x40,0x6e,0xda,0x4d,0xd1,0x74,0xa7,0x58,0xc4,0x94,0x1, + 0x99,0x9e,0x1a,0x75,0xfe,0x48,0x21,0x0,0x4,0x20,0x42,0xb5,0xb4,0x8b,0x60,0x91, + 0x77,0xad,0x2d,0xbe,0x34,0x6f,0x2a,0x2b,0xca,0x8a,0x8d,0x1b,0x9,0xc,0x89,0x49, + 0x1d,0x18,0xd1,0x9c,0x4d,0xdf,0x6a,0xfa,0xa7,0x92,0x5d,0xb3,0x22,0xb,0x24,0x16, + 0xbc,0xdc,0xf0,0x2a,0x1d,0x34,0xb,0xd9,0x16,0xe7,0x53,0x3c,0xab,0x69,0x91,0x73, + 0xb,0x5b,0x49,0xae,0x51,0xd2,0x30,0x9d,0x2e,0xa6,0xaf,0x48,0x46,0xc6,0x53,0x2c, + 0x36,0xa,0x48,0x50,0x1e,0xb,0x1f,0x2b,0x2e,0x1a,0x31,0x20,0x8b,0xc0,0xd1,0x52, + 0xbc,0xcc,0x30,0x47,0x96,0x4a,0x15,0x8b,0x9a,0xc5,0xa3,0x26,0x44,0x84,0x75,0x57, + 0xc8,0x89,0x89,0x4f,0x2f,0x28,0xc2,0xfa,0xf7,0x93,0x88,0x49,0xa4,0x8c,0x38,0x49, + 0x5,0x7,0x3d,0x45,0x31,0x50,0x1e,0xbb,0x61,0x7,0x1c,0xf8,0xdc,0x86,0x52,0xd8, + 0x12,0x11,0xab,0xb7,0xd3,0x84,0x14,0x74,0x2,0x55,0x1c,0xf5,0xc9,0x24,0xcf,0x70, + 0xb7,0x3d,0x8c,0xfe,0x32,0x8e,0xf0,0x46,0x95,0x60,0x68,0x62,0xa4,0xaf,0x3b,0x60, + 0x4c,0xc2,0x5b,0x4,0xcb,0x9d,0x92,0x91,0x78,0x34,0xc2,0x30,0x44,0x3,0xcd,0x3a, + 0xe6,0xa7,0x46,0x69,0x72,0x74,0x80,0x26,0xc7,0x6,0xb1,0x30,0x3d,0x4a,0xb,0x33, + 0x63,0x98,0x9f,0x1a,0xc5,0xec,0xc4,0x8,0xcd,0x8e,0xf,0x61,0x6c,0x64,0xa0,0xf4, + 0xf0,0x92,0x53,0x8,0x3b,0xa7,0xc9,0x38,0x9,0x11,0xd1,0x4b,0xf,0xb8,0x7c,0xa, + 0x2,0x80,0x5a,0xad,0x8a,0x7a,0xbd,0x86,0xeb,0x17,0x4f,0xd1,0x71,0xbb,0x3,0x0, + 0x66,0x6d,0x6b,0xdf,0xee,0x1e,0xb4,0x40,0xce,0xc2,0x5d,0xec,0x8e,0x3d,0xc0,0xc7, + 0x6,0x6c,0x2c,0xa9,0x4e,0xcf,0x72,0x64,0x71,0x83,0x9d,0xb7,0x3b,0x99,0x80,0x58, + 0x26,0x8b,0xdd,0x48,0xc1,0x97,0x3e,0xee,0x46,0xb9,0xbe,0x91,0x50,0xfa,0x45,0x2e, + 0x42,0x72,0xde,0x73,0x72,0xb5,0x10,0x2a,0x12,0x6e,0xa1,0xbe,0x46,0x83,0xde,0xb9, + 0x72,0x9a,0xfe,0xf9,0xf7,0xaf,0xd2,0xeb,0xe7,0xe7,0x48,0x4e,0x88,0x95,0x4a,0x5, + 0xc6,0x18,0xbc,0x79,0x69,0x81,0xfe,0xf4,0x27,0xd7,0xb1,0xb1,0x7d,0x80,0x5a,0xad, + 0x8a,0xa1,0xfe,0x6,0x46,0x7,0xfb,0x30,0x34,0xd8,0x47,0xc3,0x3,0x4d,0x8c,0xe, + 0xf6,0x61,0x64,0xa8,0xaf,0x80,0x80,0xf4,0x2a,0xe8,0xea,0xae,0x65,0x47,0xd4,0x3a, + 0x3c,0x3e,0xc1,0xce,0xfe,0x11,0x76,0xf,0x5a,0xb4,0xb3,0x7f,0xc8,0x3b,0x7b,0x2d, + 0xec,0x1d,0xb4,0x68,0xf7,0xb0,0x85,0xad,0xdd,0x3,0x6c,0xed,0x1e,0xf2,0xee,0xfe, + 0x31,0xb6,0xf7,0xe,0x78,0x7d,0xe7,0x0,0x6b,0x5b,0x7b,0xb4,0xb5,0x7b,0x98,0xd2, + 0xd5,0x64,0xa2,0xd,0xc4,0xc1,0x7,0xe9,0x19,0x43,0x21,0xd8,0x4b,0x2c,0x98,0xbc, + 0x97,0x59,0x74,0x68,0xcb,0x64,0x5d,0x52,0x2c,0xa9,0x33,0x76,0x65,0x8b,0x99,0xe0, + 0x78,0xff,0xf9,0x99,0x89,0x11,0xba,0xb8,0x30,0x49,0x73,0x53,0x23,0x58,0x98,0x19, + 0xa3,0xb3,0xf3,0x13,0x38,0x7f,0x6a,0x12,0x8b,0x33,0x63,0x34,0x32,0xd8,0xa7,0xae, + 0xa7,0x7c,0xc2,0x76,0x1c,0x3f,0xf3,0xc2,0xeb,0xf1,0x55,0x3f,0x97,0xf5,0xe7,0x78, + 0xd9,0x1f,0xeb,0x7a,0xca,0xf8,0x98,0x8c,0x31,0x68,0x18,0x13,0xdf,0x5b,0xc9,0x53, + 0x39,0x33,0x3b,0x8e,0xb3,0xf3,0x13,0xb8,0xb8,0x38,0x8d,0x1b,0x17,0x4f,0xe1,0xe1, + 0xb3,0xd,0x5a,0x5a,0xdd,0xe1,0x67,0x6b,0x5b,0xfc,0xf4,0xf9,0x36,0x47,0x86,0x8d, + 0x4d,0xa6,0x11,0x4c,0x30,0x64,0x7d,0x70,0x5a,0x54,0x6,0x90,0xd3,0x9e,0x73,0x10, + 0xa,0x7b,0xec,0x8e,0x3,0x85,0xc2,0x10,0xb1,0x75,0x68,0x20,0x33,0x9c,0x76,0x8d, + 0x39,0x31,0xcb,0x21,0x7,0x61,0xb1,0xf2,0x67,0x21,0x93,0xce,0x6,0x20,0xe6,0x2, + 0xb,0xbe,0x40,0x74,0xb,0x83,0x58,0xee,0x65,0x12,0x4d,0xc6,0xf2,0xa9,0xdf,0xfd, + 0x96,0xaa,0x24,0x58,0xa5,0x4d,0xbf,0x40,0xf0,0x49,0xb8,0x89,0x89,0x7d,0xb6,0x2c, + 0x3c,0x24,0xa,0xa2,0x43,0x90,0x73,0x1b,0x7e,0x2a,0x38,0x41,0xe4,0x8d,0x1,0x45, + 0x28,0xbf,0x54,0x9d,0x8d,0x22,0xf0,0x4b,0x25,0xa4,0x2d,0x6d,0x92,0x22,0x9,0xb1, + 0xc1,0x1d,0x8e,0x44,0x94,0x1d,0x49,0xc8,0x59,0x34,0x6,0x94,0x11,0xc4,0x89,0x33, + 0x96,0x3b,0x9,0x53,0x96,0x2c,0x61,0x34,0x16,0xb4,0x52,0x31,0x22,0x92,0x29,0x65, + 0x86,0x5a,0xe4,0x44,0x3c,0x2a,0xb,0xb5,0xe7,0x4c,0xaf,0xce,0xd2,0x13,0xde,0x68, + 0xe8,0x4,0x82,0x9c,0x28,0xc8,0x13,0x45,0xf9,0x1d,0xe9,0x38,0xd6,0xa8,0x22,0x60, + 0xa1,0x9d,0x66,0x95,0xee,0x96,0xc3,0xe7,0xa4,0xfb,0xaf,0x84,0x94,0xb0,0xce,0xd3, + 0x56,0x6f,0x1a,0x9,0x9,0x82,0x38,0xb0,0x94,0x8f,0xb4,0x9,0x61,0x14,0x9,0x76, + 0x8f,0x1a,0x24,0x5f,0xbc,0xc3,0x1e,0xd7,0xc4,0x9d,0xb9,0x31,0xce,0x38,0xdb,0x18, + 0xf7,0xf5,0xc6,0x90,0x89,0x93,0xa2,0x91,0x31,0x93,0xd1,0xba,0x34,0xa0,0x6,0x48, + 0xc0,0x1,0x19,0x7,0x5,0xc,0xf7,0x37,0xe9,0xf2,0x99,0x19,0xfa,0xd1,0x8d,0xf3, + 0xf4,0xf6,0xd5,0xd3,0xb8,0x72,0x7a,0x86,0xc6,0x87,0xfb,0xe3,0xd4,0x1d,0xe,0xc1, + 0x1c,0x42,0xcc,0xe1,0x47,0x9,0xa1,0xff,0x43,0xfe,0xf4,0xfa,0xbe,0x77,0xaf,0x9e, + 0xa6,0x4e,0xd7,0xe2,0xa3,0xaf,0x1e,0xd2,0x37,0xf,0x56,0xd8,0x76,0x53,0xc,0x5b, + 0xd2,0x4e,0x50,0xd0,0xd1,0xc6,0x8b,0x86,0xc9,0xb1,0xb3,0xfd,0x7b,0x6b,0xd8,0x5a, + 0x4b,0x52,0x1a,0xc5,0x1c,0x98,0xe5,0x31,0xc7,0x33,0x32,0xdd,0x23,0x83,0x8b,0x54, + 0x48,0x8b,0x70,0x33,0x13,0xc5,0x5c,0x1b,0x9e,0x84,0xf7,0x77,0xa0,0xaf,0x49,0xaf, + 0x9f,0x9f,0xa3,0xef,0xbf,0x79,0x8e,0xae,0x5f,0x5a,0xa0,0x32,0x58,0x97,0x88,0x30, + 0xd4,0xdf,0xc0,0x9f,0xff,0xe4,0x6,0x95,0xad,0x27,0xf2,0xd7,0xf9,0x55,0x5e,0xbf, + 0x7c,0x52,0xac,0x56,0x2b,0x18,0xae,0x56,0x30,0xd4,0xdf,0x8,0x3f,0x8f,0xf2,0x9f, + 0xd7,0xe9,0x74,0x69,0x75,0x6b,0xf,0xf,0x9e,0x6d,0xf0,0xe7,0xb7,0x9f,0xe2,0xf3, + 0xef,0x9e,0xf2,0xad,0xfb,0xcb,0x58,0xdb,0xdc,0xe3,0x4e,0xb7,0x4b,0xca,0xff,0x7, + 0xc6,0x3f,0x17,0xe1,0xd4,0xe0,0x67,0x35,0x81,0x99,0x7b,0x32,0x97,0x11,0x7e,0x84, + 0x36,0x86,0x7c,0x44,0x93,0x5d,0x88,0xc4,0x73,0xef,0xc8,0x49,0xec,0x29,0x7d,0x62, + 0x49,0x24,0xcd,0x89,0x87,0xfa,0x1b,0xf4,0x3b,0x37,0xce,0xd1,0x7f,0xfd,0xcf,0xde, + 0xa1,0xab,0x67,0x67,0x69,0x7c,0x64,0xa0,0x74,0x9a,0xce,0xe3,0xcf,0xc3,0xeb,0xf8, + 0xf,0xbd,0x3e,0xff,0x31,0xfe,0xc8,0x46,0xe2,0x45,0x8d,0x19,0x33,0x63,0x78,0xb0, + 0x89,0xeb,0xc3,0xa7,0xe8,0xfa,0xc5,0x53,0xe8,0x76,0xbb,0xb4,0xbd,0x77,0x84,0x4f, + 0xbe,0x7d,0xc2,0x3f,0xff,0xf4,0x2e,0xff,0xcd,0x6f,0xbe,0xb5,0xcb,0xeb,0xdb,0x41, + 0x68,0xa5,0xe8,0xcc,0x30,0x6c,0x88,0xc9,0x86,0x60,0x35,0x98,0xe8,0x8,0x47,0xcc, + 0x11,0x85,0x32,0xb0,0xdc,0x85,0x75,0xca,0x2,0x4b,0x44,0xf0,0x46,0x32,0x6e,0x85, + 0x12,0x1a,0xb0,0xe8,0x20,0x48,0x59,0x0,0x5b,0x66,0xd3,0x4a,0x52,0x89,0xa8,0x8c, + 0x8f,0x58,0xa5,0x9b,0x52,0x46,0x4f,0x22,0x85,0x7e,0x27,0xdf,0x94,0x32,0xf9,0xb7, + 0xbb,0xc,0xab,0xca,0xe4,0x8c,0x75,0x90,0x41,0x31,0x5f,0x3b,0x3b,0xc1,0x73,0xb2, + 0x56,0x34,0x95,0xa7,0x6c,0xaa,0x96,0xbb,0xea,0x62,0xdc,0xa8,0xf2,0x9,0xa6,0x4c, + 0xe3,0x8,0x8d,0x3a,0xc9,0xa6,0x35,0xc5,0xf2,0x64,0xd0,0x33,0x17,0xb2,0xba,0xd2, + 0x5e,0x9b,0x85,0xdc,0x55,0x75,0x4a,0x2,0x42,0xd7,0x6,0xed,0x9a,0xad,0x4d,0xba, + 0x1e,0xc9,0xaf,0xa7,0x6c,0xc2,0x8f,0xe,0x81,0x2c,0x76,0xea,0x32,0x32,0x36,0x6a, + 0xed,0x49,0xc7,0x2d,0x97,0xa1,0xd1,0x52,0x53,0xcf,0x5c,0xca,0x7a,0x53,0xe3,0x8f, + 0xaa,0xd1,0x1,0xe2,0xa1,0x10,0xa1,0xad,0x74,0xaf,0xf9,0xd5,0x51,0x48,0xf5,0x21, + 0xca,0xde,0x7,0x46,0xa9,0xbe,0x5a,0x75,0x32,0xa4,0xd3,0xdb,0xb,0xb1,0xb2,0x9c, + 0xbc,0x3e,0x55,0x32,0x5c,0x28,0x1e,0x72,0xe2,0x83,0xb2,0x74,0xa5,0x40,0x85,0x53, + 0x45,0xc5,0x6b,0xcb,0x25,0x7b,0x3d,0xb0,0xda,0x33,0x89,0x9a,0x92,0x5e,0xc5,0xe, + 0xc7,0xc4,0x20,0x8c,0x8a,0x31,0xb8,0x7c,0x76,0x86,0xde,0xba,0xbc,0x40,0xd7,0x2e, + 0xcc,0xd3,0xd9,0xf9,0x9,0x4c,0x8e,0xe,0xd2,0xec,0xf8,0x30,0x46,0x86,0xfa,0x7a, + 0x4e,0x7d,0x11,0xd6,0x15,0x53,0xf8,0x3f,0xf6,0x1f,0xd9,0x3c,0x84,0x7b,0xee,0xd4, + 0xf4,0x28,0xfd,0xf4,0xbd,0x2b,0xd4,0xe9,0x5a,0x73,0xfb,0xc1,0x8a,0x95,0xd3,0xa2, + 0x23,0xe9,0x4a,0xc,0xdf,0x25,0xbd,0xb8,0xd5,0x7a,0x8,0x64,0xb1,0xce,0x87,0xc7, + 0xb2,0xb0,0x4d,0x50,0x81,0x29,0x48,0xab,0x9,0x10,0x93,0x89,0xc5,0x3d,0xac,0x38, + 0xfc,0x5a,0x3e,0xda,0xed,0x92,0x71,0xe1,0x36,0xe4,0x79,0x9,0xcc,0x8c,0xb1,0xa1, + 0x7e,0x7a,0xed,0xdc,0x2c,0x2d,0xcc,0x8c,0xd1,0x99,0xb9,0x71,0xba,0x72,0x66,0x6, + 0xd7,0x2e,0xcc,0x45,0xb2,0xb9,0xb5,0xb6,0xf0,0x7a,0x86,0xfd,0xab,0xfc,0x7b,0xfe, + 0xfc,0x7b,0x41,0xb6,0x65,0x3b,0xdf,0x7c,0x2a,0xed,0xd5,0x7c,0xc9,0xaf,0xad,0xd5, + 0xaa,0x98,0x9f,0x1a,0xc5,0x60,0x5f,0x93,0x66,0x27,0x47,0xf0,0xfd,0x6b,0x67,0xf1, + 0x7c,0x73,0x97,0x9e,0xae,0xed,0xe0,0xe1,0xb3,0x75,0x7e,0xb0,0xb4,0x81,0xbb,0x4f, + 0x56,0x79,0x73,0xf7,0x20,0x86,0x99,0xa5,0x91,0x4d,0x99,0xc1,0x11,0xb3,0x61,0x6f, + 0x91,0x94,0xc,0x69,0x12,0x25,0x5f,0xc8,0xe3,0xe3,0xbc,0xe8,0x3f,0xec,0x9,0xe, + 0x7e,0x8f,0x9b,0x52,0x72,0xd2,0x91,0x3f,0x3e,0x3c,0x40,0x7f,0xf6,0x93,0x37,0xe9, + 0xf7,0xdf,0xbd,0x44,0x6f,0x5c,0x98,0xa7,0xe1,0x81,0x66,0x81,0x8f,0x51,0xb6,0xd2, + 0x79,0xd5,0x9,0xfa,0xff,0xcd,0x3f,0xf9,0xb5,0x91,0x5f,0x13,0xe3,0x23,0x3,0x78, + 0xf7,0xb5,0x45,0x9a,0x9d,0x18,0xc2,0xbb,0xaf,0x2f,0x56,0x3e,0xfc,0xe2,0x3e,0xff, + 0xfc,0xd3,0x3b,0x76,0x65,0x63,0x2f,0x70,0xd5,0x42,0x5b,0x15,0x15,0x0,0x40,0x32, + 0xdf,0xf1,0xae,0xd,0x64,0x6c,0x88,0x48,0x77,0xc5,0x3d,0xda,0xf3,0x12,0x83,0x9d, + 0x5d,0x1c,0x3b,0xf4,0xce,0x8a,0xdc,0x99,0x18,0xb6,0x23,0x56,0xaf,0xfe,0x9b,0xb, + 0x61,0x54,0x32,0x35,0x34,0x67,0xbf,0x6b,0xb2,0x79,0x31,0x34,0x48,0x60,0xca,0x24, + 0x73,0x33,0x52,0xed,0xaa,0x4a,0x29,0x96,0x8a,0x2c,0x45,0x6,0xbb,0xcb,0x3,0x5c, + 0xc6,0x37,0x50,0x8f,0x3c,0x17,0x86,0xb2,0x7e,0x4d,0x93,0x6e,0x71,0xab,0x50,0xaa, + 0xfc,0x92,0x85,0xaa,0xe8,0xef,0xa6,0x8b,0x6a,0xc1,0xcd,0x20,0xf3,0x25,0x97,0x5e, + 0x15,0x79,0x80,0x80,0x78,0x12,0x85,0xdf,0x90,0x11,0xc9,0x50,0xaa,0xfd,0xe6,0x92, + 0xef,0xd7,0x7d,0x58,0x4a,0x9a,0xcb,0x8c,0x1b,0xd4,0xdf,0xa9,0x4c,0xbc,0x5d,0x22, + 0x5d,0x93,0xd3,0x6d,0xde,0xe2,0xf6,0x20,0x42,0x52,0x5e,0xe8,0x95,0xbc,0x87,0xb, + 0x5f,0x4c,0xe5,0xcf,0x97,0x7a,0xa,0xcc,0xa1,0xbb,0xce,0x2,0x89,0x43,0xbf,0xfe, + 0x51,0x7c,0x9b,0x5a,0x73,0xe5,0x0,0x7,0x91,0x54,0x6,0xa4,0xa8,0xc7,0x10,0xa2, + 0x12,0xd,0x61,0x4c,0x28,0xe2,0xb1,0x1,0x30,0x61,0xae,0x2f,0x91,0xa8,0x51,0xd0, + 0xbf,0x41,0xfe,0x2f,0xd,0x3b,0x54,0xaf,0x55,0x31,0x31,0x36,0x44,0xe7,0x66,0xc7, + 0xe9,0xfd,0x37,0xcf,0xd2,0x8f,0xae,0x9f,0xc7,0x9b,0x97,0x4e,0x51,0xad,0x56,0xed, + 0x39,0xe1,0x95,0x1d,0x86,0xc6,0x99,0xb2,0xf5,0x2c,0x38,0x65,0x45,0x45,0x16,0xeb, + 0xb2,0x89,0x45,0xfe,0x2e,0x59,0xfc,0x98,0x19,0x23,0x83,0x7d,0xf8,0xbd,0x77,0x2e, + 0xd1,0xfd,0xe5,0x75,0xbe,0xfd,0x60,0x25,0x4d,0xc,0x1c,0x88,0x40,0x69,0x52,0x21, + 0x9f,0x5a,0xe1,0x1d,0xdf,0x0,0xe7,0x72,0xe5,0x50,0x46,0x23,0xbc,0xa7,0x38,0xd0, + 0xda,0xc,0x45,0x4f,0x2e,0x12,0x9e,0xf7,0x59,0x82,0x9a,0xe,0x64,0xe1,0x94,0x70, + 0x7,0xa2,0x6a,0xc5,0xd0,0xe4,0xf8,0x10,0xbd,0x73,0x79,0x91,0xde,0xbf,0x7e,0x96, + 0xae,0x9e,0x9d,0xc5,0xe9,0xd9,0x31,0x9a,0x9d,0x1c,0x89,0x6b,0x88,0x40,0x9e,0x7a, + 0xd9,0xea,0xe1,0x1f,0xa,0x1,0xf7,0xfa,0x59,0xbd,0xbe,0x27,0x27,0x7a,0x11,0x11, + 0x46,0x86,0xfa,0x30,0x3c,0xd8,0x4,0x2d,0x4c,0x11,0x33,0x63,0x67,0xef,0x8,0x77, + 0x9f,0xae,0xe1,0xcb,0x3b,0x4b,0x98,0x99,0x18,0xc6,0xed,0x47,0xcf,0xb1,0xb3,0x77, + 0x84,0xc3,0xa3,0x63,0x1c,0xb6,0xda,0xe8,0xb2,0x2f,0x23,0x24,0xf1,0x71,0x31,0xc4, + 0x19,0x22,0x6f,0xb2,0xab,0xc2,0xfa,0x84,0x2b,0xb0,0x9a,0xa1,0x58,0x7a,0x1a,0x90, + 0xbc,0xe3,0x5c,0x59,0x9f,0x99,0x18,0xa6,0x3f,0xfe,0xc1,0xeb,0xf4,0xce,0x6b,0xb, + 0x24,0x77,0xe2,0xf9,0x75,0xf6,0x4f,0xbd,0x78,0xbf,0x6c,0x7a,0xef,0x75,0x2f,0x4d, + 0x8c,0xe,0x62,0x62,0x74,0x90,0xae,0x5f,0x3c,0x85,0xd9,0xf1,0x11,0x0,0x64,0x3e, + 0xfa,0xea,0x81,0x7d,0xbc,0xbc,0x85,0xd4,0xd3,0x46,0xf5,0x82,0xd7,0xf5,0x71,0x52, + 0xc2,0x71,0xf2,0xb8,0xe0,0x88,0x34,0x31,0x59,0x97,0x90,0xeb,0x48,0x8e,0xae,0xd, + 0x20,0x16,0x59,0x79,0x41,0xa,0x93,0xec,0x86,0x7a,0x7b,0xe1,0xb3,0x58,0xb,0x87, + 0xe2,0x9f,0x85,0xdb,0x65,0xe7,0xbc,0x5e,0x75,0x4b,0x72,0xae,0x48,0xb6,0x8f,0x3f, + 0xaf,0xa,0xd2,0x7b,0x51,0x69,0xe6,0x5b,0x9c,0xac,0x38,0x8b,0xf0,0x2c,0x67,0xc4, + 0xe7,0x55,0x97,0x4a,0x76,0xcd,0x5a,0xf6,0x96,0x39,0x40,0x11,0x7a,0x30,0xe8,0x4b, + 0x3a,0x87,0xc2,0xa4,0x99,0x95,0x20,0x92,0x8e,0x57,0xe5,0x8c,0xc2,0x82,0xfc,0x5b, + 0x26,0x84,0x66,0xfb,0xe6,0xa2,0xfc,0x8b,0x64,0xb6,0x4b,0x91,0x25,0x98,0x55,0x63, + 0xf5,0xfd,0x9e,0xba,0xcd,0xf2,0xb5,0x2d,0x68,0xcb,0xb2,0x6,0x4a,0x49,0xea,0x4a, + 0x2a,0x79,0xc1,0xc8,0x5d,0x59,0xd3,0x15,0x82,0x72,0x84,0x71,0x6c,0xd9,0xb7,0xe7, + 0xda,0x1e,0x91,0x98,0x20,0x47,0xb7,0x24,0xea,0x61,0x49,0xb6,0x63,0x4e,0x4c,0x7f, + 0x8a,0xa4,0x4b,0xed,0x8c,0x20,0x8a,0x6a,0x5a,0x69,0x78,0x56,0x7b,0xfa,0xa5,0x29, + 0xdf,0x3c,0xf1,0xaa,0x7c,0x31,0x21,0x43,0x9,0x2e,0x4f,0xfb,0xdb,0x98,0x73,0xe, + 0xe3,0x95,0xc7,0xb1,0x98,0x53,0x32,0x1d,0x10,0x11,0x9e,0xc0,0x7b,0xd7,0xce,0x9a, + 0xdf,0x7f,0xf7,0x22,0xfd,0xf8,0xed,0x4b,0x34,0x33,0x36,0x84,0x46,0xa3,0x86,0x7a, + 0xbd,0x56,0x7a,0x28,0xe6,0x13,0xc3,0xab,0x4c,0xd6,0x65,0x44,0xb7,0x7c,0xe2,0xfe, + 0x87,0x40,0xf1,0xc3,0x3,0x4d,0x5c,0xbb,0x38,0x47,0x67,0x67,0x27,0x82,0x1d,0x68, + 0x4c,0xf1,0x4a,0x86,0x2d,0x72,0x48,0x9,0xe1,0xaa,0x21,0x46,0xda,0x15,0xfe,0x98, + 0xb1,0xa4,0xef,0x43,0xe5,0x7a,0x1f,0xa1,0xf5,0x50,0xdc,0xc3,0x36,0x38,0xc2,0x29, + 0x7e,0x32,0x17,0x99,0xf2,0xe7,0x17,0xa7,0xe8,0x7f,0xf8,0xb3,0x1f,0x9a,0xb7,0xae, + 0x2c,0xd2,0xcc,0xd8,0x10,0xea,0x5e,0xb7,0xdc,0x4b,0xf6,0xf4,0x4f,0xe1,0x4f,0xaf, + 0x89,0x5e,0xbe,0x77,0x83,0xfd,0x75,0x5c,0x3d,0x37,0x47,0x17,0x16,0xa6,0xf0,0x47, + 0x3f,0x7c,0x9d,0xd6,0xb7,0x76,0xf9,0xe6,0xdd,0x65,0xfc,0xe6,0xeb,0x87,0xfc,0xd1, + 0xcd,0x7,0x58,0xdf,0x3e,0x10,0x41,0x62,0xd4,0x3,0x3e,0x90,0x6a,0x39,0x52,0x69, + 0xd0,0xf9,0x7e,0x8c,0x62,0x34,0x48,0x1c,0x74,0x22,0xb7,0xb7,0x42,0x86,0x66,0xc7, + 0x87,0xb1,0x38,0x37,0x46,0x52,0xfe,0x58,0xc6,0x40,0xff,0xff,0xd3,0x9f,0x5e,0xab, + 0x9a,0x77,0xaf,0x2e,0xd2,0xdc,0xd4,0x8,0x8d,0xc,0x36,0xf1,0x1f,0x7f,0xf1,0x95, + 0x5d,0xd9,0xd8,0xf3,0x4d,0xb6,0x98,0x89,0x9d,0xd5,0x5b,0x2c,0x80,0xde,0x18,0x8e, + 0xdc,0xe2,0xdd,0x5d,0xce,0x6c,0xc,0x99,0x2e,0x13,0x1b,0xeb,0x8e,0x19,0xeb,0x97, + 0x92,0x1e,0xcb,0xa2,0x2,0x35,0x3d,0x99,0x6c,0x94,0xbd,0xda,0xa4,0xe6,0x3c,0x52, + 0x21,0x6a,0x65,0x59,0x8d,0x54,0x98,0xe6,0xa,0x1f,0x85,0xc,0xff,0xaa,0x96,0x4d, + 0x5f,0xca,0x58,0x94,0x34,0xac,0xac,0xca,0x70,0xc0,0xf3,0x45,0x61,0x89,0xc5,0xa1, + 0xc4,0x1,0xa7,0x17,0xd,0x5f,0x3d,0x9,0x2e,0xde,0x40,0xde,0xe8,0x3a,0xf3,0x13, + 0x2c,0x4e,0x8f,0x5c,0x5e,0x6e,0x4b,0xd8,0x84,0x28,0x84,0x89,0x14,0xdd,0xf1,0x0, + 0xe5,0xf3,0x23,0xe5,0x5f,0x32,0x18,0x9d,0xca,0x33,0xe1,0x14,0xe6,0x2f,0x8a,0x2a, + 0x4b,0x16,0x23,0x8b,0xc4,0xb5,0x42,0xd3,0xa4,0x77,0xd6,0x2a,0x6e,0x50,0x53,0xcf, + 0x12,0xd8,0x21,0xe4,0x6b,0xca,0x71,0x8f,0xf5,0xe3,0x51,0x31,0xa6,0x2a,0xdf,0x9d, + 0xf3,0x29,0x3b,0xd9,0x20,0x49,0xc2,0x9d,0xb,0x2d,0x12,0x1,0x3d,0x4,0x16,0x4, + 0xe,0xa9,0x26,0x0,0xb3,0x8f,0x3a,0x36,0xde,0x1b,0x43,0x4e,0x20,0xfe,0x32,0x34, + 0x32,0x9a,0xd4,0x97,0x68,0x3f,0xb0,0xb3,0x9,0x71,0x90,0xbe,0x40,0x57,0x9c,0x4, + 0x2d,0x24,0x77,0x51,0x30,0x36,0x91,0x86,0x27,0x21,0xed,0xcb,0xcb,0xd7,0x18,0xc9, + 0x5d,0xcb,0x6b,0x79,0x63,0x1,0xaa,0x56,0xc,0x9d,0x9e,0x1b,0xa7,0x37,0x2f,0x2d, + 0xd0,0xf,0xae,0x9f,0xa3,0x77,0xaf,0x2e,0xd2,0xc5,0xc5,0xe9,0x9e,0xd3,0x78,0x3e, + 0x31,0xc8,0x49,0x39,0xc0,0xc1,0x72,0x92,0x96,0x7,0x6a,0xcb,0x11,0xd8,0x84,0xdb, + 0xa0,0x27,0x80,0x11,0xd0,0x68,0xd4,0xb,0x53,0x54,0xce,0x6e,0xcf,0xa7,0x77,0x39, + 0xdd,0xf6,0x35,0xea,0x98,0x9f,0x1a,0xa1,0xc5,0xe9,0x51,0x3c,0x5b,0xdb,0x45,0xc7, + 0x76,0x21,0x75,0x5b,0xc9,0x26,0x3a,0xde,0xb4,0x1c,0x5e,0x7c,0x8e,0x61,0x2c,0x7e, + 0xb9,0x1e,0xbd,0x96,0x4d,0x2c,0x20,0x49,0xbf,0x1f,0xa2,0xea,0x82,0x9d,0xab,0xd8, + 0x97,0x13,0x15,0x8c,0x9f,0x2f,0x9f,0x99,0x32,0x7f,0xf8,0xbd,0xd7,0xe8,0x47,0x6f, + 0x5d,0xa0,0x53,0x53,0xa3,0xa5,0xc5,0xfb,0x9f,0x62,0xb1,0x29,0x43,0xb,0xf2,0xc6, + 0xae,0x52,0xa9,0xa0,0xbf,0x52,0xc1,0x40,0x5f,0x1d,0x63,0xc3,0xfd,0x38,0x35,0x35, + 0x42,0x63,0xc3,0x83,0x98,0x9d,0x18,0xc1,0x85,0x85,0x49,0xfa,0xea,0xfe,0xa,0xdf, + 0x79,0xf4,0x9c,0x9f,0xae,0x6e,0xfb,0x24,0xd5,0x80,0x6d,0xb8,0x17,0xdb,0x5a,0x66, + 0x32,0x86,0x54,0x5e,0x84,0x2,0x14,0x63,0xf3,0x1e,0x0,0xe2,0x28,0x91,0x8b,0x64, + 0x79,0xdf,0x9,0x8f,0xc,0x36,0x31,0x35,0x31,0x44,0x3,0xfe,0x3a,0xea,0x85,0x7a, + 0xfc,0x63,0x40,0xdf,0xf9,0xeb,0xf3,0x2a,0xcc,0xf8,0x5e,0x7c,0x86,0x17,0x29,0x3b, + 0xf2,0xd5,0x4b,0x2f,0xb4,0xaa,0xec,0x31,0x54,0xab,0x15,0x9c,0x9e,0x1d,0xc3,0x1f, + 0x7d,0xff,0x2a,0x75,0xba,0xd6,0xfc,0xfb,0x9f,0x7d,0x69,0x37,0xb6,0xf,0xa2,0x9f, + 0x1,0xc5,0x9b,0xd3,0x10,0x60,0x93,0x5f,0x70,0xb0,0x35,0x76,0x59,0xaa,0xa5,0x83, + 0x9f,0x57,0xdd,0xb0,0x60,0x69,0xfb,0x8f,0xb3,0xca,0x40,0x40,0x4f,0x8a,0x71,0xf, + 0x74,0x5b,0xbd,0xe7,0xd9,0x17,0x15,0x7c,0x49,0x32,0x28,0x36,0x40,0xee,0x19,0x8f, + 0x5c,0x0,0xc6,0xc1,0x99,0x27,0xc1,0xd6,0xc1,0x3b,0x9d,0xa3,0xd3,0x1a,0x17,0xf6, + 0xed,0xac,0x26,0x54,0x2a,0xd5,0xa4,0xa9,0x98,0x91,0x62,0xd2,0x88,0xfa,0x56,0x3d, + 0x65,0xe6,0x26,0x64,0xd9,0xa1,0x10,0x2d,0x57,0xc5,0xc4,0x98,0xf1,0xb0,0xb8,0x4, + 0xee,0x66,0x31,0xc0,0xc7,0x9e,0x2b,0x58,0xc5,0xca,0x64,0xb5,0x40,0x76,0x61,0x91, + 0xdb,0x1,0xfd,0x78,0xd2,0x7a,0x81,0xa3,0x26,0x32,0x4b,0x7c,0x89,0x72,0x67,0xce, + 0x1d,0xd4,0x44,0x2e,0x61,0xa1,0x31,0x50,0xbf,0x47,0x5a,0x72,0x50,0x21,0xdd,0x8d, + 0x54,0x52,0x4f,0x26,0x37,0x2c,0xeb,0x2,0x33,0xc6,0x3f,0x17,0xb0,0x10,0x2a,0x80, + 0xe8,0x5,0xbe,0x83,0x8f,0x32,0x8,0x33,0x9d,0x82,0xfa,0xb3,0x55,0x7b,0x66,0xef, + 0x2a,0xa2,0x48,0xd,0x29,0xa5,0xbd,0x89,0xf1,0xa8,0x90,0xa9,0x68,0x61,0x3a,0x17, + 0xa4,0xb8,0xa8,0x7f,0xe,0x3c,0xf8,0x64,0x85,0x99,0x5c,0x66,0x38,0x2c,0x37,0xfd, + 0x3,0xa8,0x55,0x2b,0x34,0x3f,0x3d,0x4a,0x7f,0xfe,0x7,0x37,0xcc,0x9f,0xff,0xde, + 0xd,0x9a,0x9d,0x18,0x42,0xc3,0x4f,0xe4,0xf2,0xb0,0x78,0x15,0x88,0xb7,0x97,0x2c, + 0xad,0xd3,0xe9,0xe2,0xa0,0xd5,0xc6,0xce,0x7e,0xb,0x7b,0x7,0x47,0xc9,0x12,0x53, + 0x5c,0xd6,0xf5,0x5a,0x15,0xa3,0x83,0xfd,0x18,0x1b,0x6a,0xc6,0xc2,0x9e,0x6b,0xd2, + 0x7b,0xc1,0xc6,0xf2,0x63,0x73,0x93,0x23,0xb8,0x76,0xf1,0x14,0xed,0x1d,0x1e,0x63, + 0x7b,0xaf,0x5,0x38,0x16,0xf,0x27,0xb2,0x2a,0xb9,0x30,0xa9,0x60,0x5,0xda,0xf5, + 0x3e,0xa1,0x5e,0x9a,0xe6,0xfc,0x45,0xc3,0x1d,0x24,0xf6,0x7c,0xa9,0x86,0x7b,0xb7, + 0x37,0x93,0x92,0xb7,0x99,0x24,0xa6,0x9c,0xec,0x61,0xd,0x51,0xb3,0x5e,0xa5,0x7f, + 0xf1,0x3b,0xaf,0xd3,0xbf,0xfa,0xd1,0x75,0x9a,0x19,0x1b,0xea,0x9,0x77,0xff,0x7f, + 0x65,0x72,0xcc,0x1f,0x6b,0x59,0x53,0x72,0x66,0x6e,0x1c,0x67,0xe6,0xc6,0xe9,0xa7, + 0xdf,0xbb,0x84,0x4f,0x6e,0x3d,0xc1,0x7f,0xfc,0xd5,0xd7,0xf4,0xd7,0x1f,0x7d,0xcb, + 0xcf,0xd6,0x76,0x38,0x71,0x4a,0xdc,0xc9,0x1a,0x39,0x89,0x24,0xe9,0xa9,0x1e,0x4f, + 0x12,0x33,0x83,0xb2,0xb4,0x4b,0x14,0x2f,0x19,0x9a,0x80,0xe1,0xc1,0x3e,0x1a,0xee, + 0x6f,0x26,0xb2,0xef,0xff,0x43,0xaf,0x69,0xaf,0x2,0x5c,0xa6,0x47,0xef,0x55,0xd4, + 0xf3,0x62,0xdd,0xab,0x90,0xff,0x97,0x20,0x37,0x65,0xd,0x98,0xb5,0x16,0xef,0x5d, + 0x3b,0x43,0x8d,0x46,0x15,0x5f,0xde,0x5d,0xa2,0xcd,0x9d,0x43,0xff,0x16,0xd8,0x94, + 0x7c,0x4a,0x0,0xd9,0x90,0x56,0x28,0xea,0x45,0x58,0x2d,0xb1,0x5c,0x3c,0x3b,0x1e, + 0x23,0xa4,0x7f,0x0,0x31,0xa1,0x9b,0xd1,0x7e,0x39,0xd7,0x58,0xcb,0xe2,0x8,0x15, + 0x37,0x5d,0x88,0xd9,0xd6,0xa8,0x6f,0x69,0xad,0x8f,0x68,0x8e,0x20,0x28,0x87,0xe1, + 0xaa,0x9a,0x4f,0x6e,0x32,0x51,0x4b,0xb1,0xa8,0x73,0x12,0x54,0x66,0x82,0xc2,0xf9, + 0xc7,0x2,0xf6,0x4f,0xa4,0x62,0xe3,0xe4,0x6e,0x81,0xe5,0x8e,0x5c,0xa0,0xc8,0x5c, + 0x98,0xe0,0x49,0x33,0xfc,0x4a,0x92,0xca,0x74,0x21,0xcc,0xb3,0xc3,0x20,0xa3,0x26, + 0xa,0xc4,0xf1,0x3c,0xea,0x33,0x3e,0x46,0xb9,0xbb,0xca,0xb,0x36,0x32,0x0,0x81, + 0x55,0x11,0x26,0x69,0xce,0x4e,0x62,0xea,0x56,0x28,0x3e,0x51,0x66,0xb9,0x4e,0x5, + 0x1a,0x41,0x41,0xef,0x1f,0x59,0x4b,0xe9,0xb,0xa5,0xbc,0x90,0x64,0x58,0x8d,0x5a, + 0x71,0x17,0xe5,0x6f,0x62,0x82,0xe7,0x32,0xa7,0x3e,0x52,0x1d,0x54,0xb6,0x60,0x31, + 0x44,0xf2,0x1,0x8,0xfd,0x83,0x92,0x3,0x90,0x82,0xcd,0x49,0x11,0xfb,0x48,0x38, + 0x41,0x4,0x99,0x61,0x40,0x6e,0x39,0x66,0x9b,0x23,0x45,0x73,0x1a,0x91,0xf0,0x15, + 0x5d,0x4a,0x42,0x64,0xa7,0x9,0xc9,0xce,0x11,0x6e,0x67,0xf,0xbd,0x13,0xfb,0x49, + 0xdf,0x97,0x35,0x0,0x18,0xe8,0x6b,0xd0,0x3b,0xaf,0x9f,0x36,0xff,0xd5,0x8f,0xaf, + 0xd3,0xbb,0x57,0x4f,0xd3,0xc2,0xf4,0x88,0x92,0x93,0xf5,0x2a,0xa4,0x12,0x6a,0x2f, + 0x3b,0x68,0xb6,0x76,0xf,0xf1,0x6c,0x7d,0x7,0x4b,0xab,0xdb,0x58,0x5a,0xdb,0xc6, + 0xca,0xfa,0x2e,0x56,0xb7,0xf6,0x70,0x70,0xd4,0x46,0xb7,0x6b,0x95,0xc8,0x30,0xbc, + 0x42,0x86,0x8,0xf5,0x7a,0x5,0x83,0x7d,0xd,0x8c,0xc,0xf4,0x61,0x7c,0x74,0x0, + 0x93,0x23,0x3,0x98,0x9b,0x1c,0xc6,0xa9,0xa9,0x31,0xcc,0x4f,0xe,0xa1,0x5e,0xaf, + 0x95,0x4e,0xeb,0x72,0x7a,0x99,0x18,0x19,0xc0,0x85,0x53,0x53,0x74,0xf3,0xce,0x12, + 0x6f,0xef,0x1f,0x5,0x34,0x29,0xb5,0x9d,0x1c,0x51,0x72,0x96,0x83,0x1f,0x8c,0xb8, + 0x10,0xa5,0x43,0x70,0x30,0x9b,0xc9,0xe2,0x79,0x23,0xb1,0x30,0xb9,0x1c,0x93,0x44, + 0xc3,0xc8,0x3,0x74,0x8b,0xb3,0xe3,0x74,0xfd,0xe2,0x29,0xba,0x72,0x76,0x86,0xf2, + 0xd7,0xef,0x55,0xb,0x8e,0x44,0x40,0x5e,0x75,0xef,0xfd,0x8f,0x9,0xe1,0x97,0xa1, + 0x24,0xb2,0x78,0xe4,0x13,0x6b,0x78,0xc,0x95,0x4a,0x5,0xd7,0x2e,0xce,0x53,0xa3, + 0x51,0xc5,0xdc,0xe4,0x30,0x7e,0xf6,0xe9,0x5d,0xfc,0xea,0xcb,0x87,0x21,0x59,0x35, + 0xb9,0x5c,0xe4,0x41,0x3d,0x19,0xcf,0x86,0x72,0xaf,0xab,0xc0,0x63,0xcc,0x66,0xbb, + 0x4e,0xd7,0xa2,0x1b,0xb2,0x47,0x4a,0xae,0x8d,0x7f,0xcc,0x82,0xce,0xcc,0xd8,0x3b, + 0x3c,0xc6,0xf2,0xfa,0xe,0x9e,0xad,0xef,0x60,0x7d,0xeb,0x0,0xfb,0x87,0x2d,0xec, + 0x1d,0x1d,0x63,0xef,0xe0,0x18,0x7,0x47,0xc7,0x68,0x77,0xba,0xe5,0x9e,0x20,0x2, + 0x9d,0xaa,0x18,0x42,0xb3,0x5e,0xc3,0xf8,0xc8,0x0,0x26,0x86,0xfb,0x31,0x3e,0x32, + 0x80,0xe9,0xb1,0x21,0x4c,0x8d,0xd,0x62,0x66,0x7c,0x8,0xcd,0x46,0xad,0x74,0xdd, + 0xf1,0x22,0x46,0xbe,0xfc,0x7c,0x40,0xb1,0xe6,0x26,0x47,0xe9,0x77,0xdf,0xba,0x40, + 0xad,0xe3,0xe,0xdd,0xba,0xbf,0xcc,0x9a,0xa8,0x10,0x52,0x1d,0xe1,0xd8,0xeb,0xd1, + 0xb1,0x2c,0xf9,0xd0,0x19,0x43,0xc4,0xd6,0xc1,0x85,0xec,0x5a,0x72,0x8f,0xd6,0xfb, + 0xb7,0xc1,0x10,0x73,0x84,0xda,0xbe,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xc1, + 0xca,0xcd,0xa9,0x70,0xa3,0xe5,0x68,0xa2,0x46,0xe9,0x27,0x4b,0x76,0x3b,0xa9,0x7a, + 0x23,0x13,0x43,0x25,0xf3,0x3a,0x7c,0x4d,0x9e,0x28,0x2a,0xb8,0xcf,0x4e,0x87,0x9e, + 0xc7,0x14,0xca,0x74,0x34,0xc9,0x6e,0x96,0xa8,0x3b,0x41,0xaf,0x70,0xa3,0x69,0xbc, + 0xd2,0x86,0xa7,0xe9,0x94,0x62,0x62,0x99,0x48,0x5d,0xb,0xd9,0x73,0x48,0x29,0x6a, + 0xfa,0x35,0xa6,0x12,0xb6,0x5f,0x2a,0x4b,0xca,0x50,0xe6,0x25,0x0,0x7,0x4b,0xb3, + 0x66,0xc1,0x46,0x7,0x17,0x57,0xd4,0xa4,0x4d,0xe5,0xa5,0x99,0x4,0x18,0x5a,0x67, + 0x9e,0x60,0x67,0x61,0x1a,0xaa,0x12,0xcb,0x42,0x20,0x4c,0x7a,0x1e,0x24,0x50,0x8c, + 0x90,0x96,0x93,0x6f,0x13,0x58,0x6,0xcc,0xc4,0x86,0x20,0x11,0xc,0xe5,0xf3,0x11, + 0x49,0x93,0xa2,0xf5,0xe1,0x12,0x8a,0x82,0xf6,0xfe,0x65,0x29,0x89,0xf5,0x56,0x5e, + 0xb9,0xbf,0x73,0xfc,0xa1,0xa1,0xd0,0x1,0xc8,0xfc,0x97,0x54,0x7e,0x3c,0x9,0xb6, + 0x9f,0x1b,0x3f,0x90,0x91,0xe,0x7d,0xda,0x7a,0xb4,0xc0,0x50,0x27,0x97,0xb7,0x7, + 0x95,0x59,0xe5,0x94,0x9a,0x23,0x52,0xc9,0x68,0xae,0xa6,0x9b,0x24,0x99,0x22,0x6, + 0xa1,0xe2,0xf7,0xe2,0x1c,0x8a,0xbf,0x8,0x71,0x49,0xb2,0x2a,0x8c,0xe,0xf5,0xd1, + 0x8d,0xcb,0xb,0xe6,0x8f,0x7f,0x70,0x95,0xfe,0xec,0xc7,0xd7,0xa9,0x5e,0xaf,0xbe, + 0xd2,0xa1,0x2d,0xf,0x89,0xf0,0xf1,0xa3,0xe3,0xe,0x8e,0xdb,0x27,0x68,0x9f,0x74, + 0xb1,0xbe,0xbd,0x87,0x7,0xcf,0x36,0x71,0xff,0xd9,0x6,0xee,0x3f,0x59,0xc3,0x9d, + 0xa7,0xeb,0x78,0xf2,0x7c,0x13,0x7,0xad,0x76,0x91,0x30,0xda,0x63,0xeb,0x54,0xaf, + 0x56,0x30,0x3f,0x39,0x8a,0xf9,0xa9,0x11,0x9c,0x99,0x1b,0xc7,0x85,0x85,0x49,0x5c, + 0x39,0x33,0x8d,0xf3,0xa7,0x26,0x31,0x36,0xdc,0xaf,0x34,0xb9,0x39,0xac,0x3f,0x34, + 0xd8,0xa4,0xd9,0xa9,0x61,0x34,0x1b,0xf5,0xac,0x21,0xb,0xa8,0x89,0x4d,0xf2,0x86, + 0x20,0x77,0xb0,0x72,0x9b,0x27,0xee,0x66,0x49,0xc8,0x91,0x64,0x38,0x9f,0x21,0x9e, + 0x3c,0xe4,0x62,0x66,0x4e,0xe2,0x27,0x10,0x68,0x7c,0x64,0x90,0x2e,0x2d,0x4e,0xe1, + 0xf4,0xcc,0xb8,0x2a,0x74,0xaf,0x5a,0x60,0xe4,0x6b,0x9e,0x93,0x1,0x4f,0x4e,0x3a, + 0x38,0xe9,0x32,0xba,0xd6,0x99,0x8d,0x9c,0x9c,0x74,0x9d,0xab,0x5b,0xd7,0xc2,0x76, + 0xbb,0xbd,0xb0,0xcc,0x97,0xff,0x4e,0x76,0xbd,0x4d,0xb5,0xe2,0xcc,0x56,0xfa,0x1a, + 0x75,0x34,0xea,0x15,0x34,0x3c,0xc1,0xac,0x6c,0x8d,0x52,0x36,0x5d,0x86,0x7f,0xf, + 0xf4,0xd5,0x71,0xe3,0xf2,0x2,0x26,0xc7,0x6,0x69,0xa8,0xbf,0x89,0x8d,0x9d,0x43, + 0xbe,0xfb,0x64,0xd,0xd6,0xed,0x68,0xa1,0xbd,0x14,0x5,0x9a,0x15,0xc9,0x4b,0x86, + 0xa,0xe7,0x1a,0x65,0xb4,0x1f,0xff,0x82,0xef,0x1d,0x1d,0x63,0x73,0xe7,0x10,0xbb, + 0x7,0x2d,0xc,0xf,0x34,0x5f,0xd8,0x98,0x96,0x41,0xdd,0x2f,0x93,0xad,0xc9,0x46, + 0x8c,0x88,0xb0,0xb9,0x73,0x0,0x27,0xe1,0x5b,0xc2,0xa3,0x95,0xd,0xec,0xec,0xb5, + 0xb0,0xb9,0x77,0x88,0xed,0xdd,0x43,0x1c,0x77,0xba,0xb9,0xeb,0x73,0x4f,0x10,0x9a, + 0x0,0x4c,0x8f,0xf,0x61,0x6e,0x62,0x18,0xb3,0x93,0xc3,0x38,0x35,0x35,0x82,0xc5, + 0x99,0x31,0x2c,0xce,0x8e,0x61,0x7a,0x74,0x10,0x43,0x3,0xcd,0x14,0x60,0x24,0x72, + 0xe,0x7a,0xc1,0xff,0xf9,0x7b,0x4,0x0,0x7d,0x8d,0x1a,0x7e,0x78,0xfd,0x3c,0x2d, + 0xaf,0xed,0xd2,0xad,0xfb,0xcb,0xaa,0x3b,0x71,0x39,0xf5,0x21,0x1d,0x3a,0x26,0x7c, + 0x3a,0x44,0xcf,0xb1,0xda,0x93,0x54,0x19,0xd2,0x8,0x94,0xa2,0x97,0x50,0xaf,0x85, + 0x79,0x48,0xe7,0x21,0xc5,0x5c,0xd7,0x12,0xee,0x54,0xf7,0x58,0x91,0xaa,0x35,0xc3, + 0x22,0x8b,0xab,0xce,0xa,0xbe,0x44,0x61,0xab,0xc5,0x9d,0x34,0x27,0x4f,0x4,0x15, + 0xb6,0xce,0x2a,0x7b,0x9b,0x38,0xe5,0x81,0x23,0x42,0xd1,0x92,0x1f,0x90,0x8,0x69, + 0x1a,0xca,0xcd,0xb5,0xd6,0x5c,0x20,0x7,0xa4,0x89,0x94,0x35,0xc3,0x5d,0xc6,0x7d, + 0x72,0x19,0x80,0xc0,0x29,0x61,0x29,0x90,0x75,0x43,0x21,0xec,0x91,0x70,0xc6,0x9c, + 0x40,0x30,0x48,0xe4,0x1b,0x5a,0xe,0x97,0x80,0x9,0x93,0xd8,0x5b,0x61,0xf9,0x9b, + 0xf1,0xc5,0x5d,0x9c,0xb1,0x89,0xa2,0xc2,0x20,0xdb,0xe5,0x8c,0x0,0x28,0x15,0xfc, + 0x99,0xf9,0x8a,0x92,0xe3,0x73,0x82,0xe9,0xb,0x72,0xc0,0x2,0x23,0x81,0x49,0x87, + 0xab,0x99,0x12,0x66,0xaf,0x4c,0xb1,0xb,0xb8,0x93,0x2c,0xf6,0x92,0x79,0x5f,0xb4, + 0xa8,0xd7,0xa4,0xc,0x5,0xaf,0x43,0x34,0x4d,0x48,0x5c,0xe8,0x2,0xe7,0x9d,0xb2, + 0x28,0xbc,0xc4,0x34,0x8f,0xc5,0x43,0xc8,0xd4,0x52,0x4e,0x39,0x52,0x34,0x6a,0xa4, + 0xd4,0x89,0x53,0x6,0x51,0xa0,0x26,0x3d,0xc7,0x85,0x46,0x9a,0x31,0x3b,0x31,0x4c, + 0xdf,0x7f,0xe3,0x9c,0xf9,0x37,0xff,0xfc,0x6d,0xba,0x71,0x79,0x91,0x1a,0x8d,0xda, + 0x2b,0x11,0xd3,0xca,0x20,0xf8,0xdd,0x83,0x16,0xbe,0x7b,0xb4,0x8a,0x2f,0xee,0x2c, + 0xe1,0xf3,0x3b,0x4f,0xf1,0xf0,0xd9,0x6,0xb6,0xf7,0x8e,0xd0,0x3a,0xee,0xe0,0xa4, + 0xd3,0xc1,0xf1,0x49,0x17,0x27,0x9d,0x4e,0x46,0x6a,0x11,0x21,0x1f,0x25,0x47,0x5e, + 0xfb,0xa4,0x8b,0xa7,0x6b,0xdb,0x58,0xdd,0xda,0xc5,0xcd,0x7b,0x4b,0x68,0xd4,0x6a, + 0x98,0x1a,0x1b,0xc4,0x9b,0x97,0x4e,0xe1,0xbf,0xfd,0xa3,0x77,0x71,0xfd,0xd2,0xa9, + 0x9e,0xb2,0xb8,0x66,0xdd,0xf9,0xc4,0x57,0x2a,0x49,0xb6,0x92,0xc6,0x88,0xd4,0x2, + 0x8b,0xd5,0x52,0xd8,0xc,0xb,0xfd,0xa7,0x86,0x93,0xc8,0x18,0x8a,0xa1,0x39,0x1c, + 0xfd,0x4f,0x95,0xa9,0x38,0xa3,0xc8,0xb3,0x99,0x9e,0x18,0xa2,0x2b,0x67,0x67,0xa8, + 0xd1,0xa8,0xf5,0x94,0xa5,0xbd,0xca,0x24,0x98,0xef,0xaf,0x5b,0xed,0x2e,0x56,0x37, + 0xf7,0xf0,0x7c,0x73,0xf,0xab,0x5b,0x7b,0x58,0x59,0xdf,0xe1,0xa7,0xcf,0x77,0xf0, + 0x74,0x7d,0x1b,0x6b,0x9b,0x7b,0x38,0x6a,0xb5,0x3,0x71,0x5f,0xad,0x4,0x4b,0x74, + 0xa6,0x72,0x50,0x20,0xf6,0xe9,0x76,0xd5,0x8a,0xc1,0xdc,0xe4,0x8,0x2e,0x2e,0x4e, + 0xe1,0xfa,0xc5,0x79,0x7a,0xe3,0xfc,0x1c,0x2e,0x9d,0x9e,0x7e,0xe9,0xe4,0xde,0x4b, + 0xcb,0xcd,0xcc,0x38,0x35,0x35,0x8a,0xdf,0x7d,0xeb,0x2,0x31,0x80,0x7f,0xf7,0xb3, + 0x9b,0xf8,0xed,0xd7,0x8f,0x38,0xbb,0x23,0x88,0x33,0x54,0xb6,0xac,0x42,0x94,0xa9, + 0x64,0x1,0xc0,0x2,0xd8,0x3b,0x68,0xe1,0xbb,0x27,0xab,0xf8,0xe6,0xe1,0x73,0x8c, + 0xc,0x34,0x31,0xe8,0x75,0xf5,0xbd,0xa,0xfb,0xff,0x5d,0xdd,0xf9,0xf3,0x8d,0x3d, + 0x7c,0xf4,0xf5,0x23,0x7c,0xfa,0xed,0x63,0x2c,0x6f,0xec,0xc5,0x2,0xdb,0xb5,0x2c, + 0xb1,0xbf,0x9e,0x51,0x10,0x2c,0x86,0xad,0xf5,0xed,0x3,0x6c,0xef,0x1f,0xe1,0xee, + 0xd3,0x75,0xd4,0x6b,0x15,0x54,0x2b,0x6,0xd5,0x4a,0x5,0x23,0x43,0x4d,0xcc,0x4f, + 0x8d,0xe2,0xb5,0xd3,0xd3,0x78,0xeb,0xf2,0x29,0x7c,0xef,0xda,0x59,0xc,0xf5,0x9b, + 0x9e,0x64,0xc5,0x5e,0xef,0x4f,0x7f,0xb3,0x86,0xd7,0xcf,0xcd,0xd2,0x6f,0x67,0xc6, + 0xfc,0x5,0x6b,0x90,0x8c,0x7f,0x39,0xd1,0x82,0x85,0x1d,0xb8,0x4d,0x37,0x40,0xda, + 0xa7,0xab,0xec,0x34,0x9b,0xee,0x65,0x96,0x30,0x75,0x66,0xf5,0x45,0x3a,0x1a,0xab, + 0x90,0x91,0x11,0x25,0x28,0x22,0xc0,0xf,0x24,0x90,0xd9,0x44,0xb8,0x63,0xce,0xf8, + 0x60,0x72,0x85,0xed,0x2f,0x8a,0xaa,0x4c,0x85,0x89,0xfb,0x5d,0x95,0xf,0x5e,0x64, + 0xab,0x13,0x67,0x82,0x77,0x7a,0x71,0x94,0x27,0x95,0x5c,0x9f,0xd2,0x77,0x9c,0xca, + 0xc,0xe2,0xa0,0x13,0xd9,0x39,0x2b,0x26,0xaa,0xd6,0xb0,0x82,0x3,0xf5,0xd4,0x98, + 0xeb,0x9f,0x4b,0x78,0x78,0x39,0x10,0x4f,0x94,0xe3,0xe3,0xa5,0xb1,0x5a,0x2,0xb2, + 0xa7,0x72,0x32,0x22,0x6b,0x68,0x5a,0x53,0x19,0xa8,0xbc,0x6d,0x55,0xad,0x77,0x68, + 0x81,0x8c,0x7a,0x81,0x64,0xcd,0x2e,0x7c,0x2b,0xe5,0x8c,0xb,0xcd,0x9e,0x2f,0x90, + 0x36,0x4c,0xc,0xde,0x28,0xb8,0xb0,0x66,0x17,0x46,0x96,0xc2,0xaa,0xaf,0x2c,0x52, + 0x49,0x69,0xf2,0xc1,0x10,0x21,0x7,0xec,0x23,0x1c,0x64,0xd4,0x65,0x95,0x1c,0xc6, + 0x52,0x16,0x79,0xb2,0x65,0xd,0xda,0xe7,0xa8,0x3d,0x37,0x52,0x97,0xae,0x5c,0xcb, + 0x5c,0x74,0xa5,0xb8,0xfa,0xdd,0x6b,0x31,0xd8,0x6c,0xd0,0xfb,0x6f,0x9c,0x35,0x7f, + 0xfa,0xe3,0x6b,0xf4,0xce,0xd5,0xd3,0xd4,0xc8,0xc2,0x50,0xf2,0x49,0xb0,0xec,0xe0, + 0xdb,0xdd,0x3f,0xc2,0xe3,0x95,0x4d,0x3c,0x59,0xdd,0xc6,0xa3,0xe5,0x2d,0x3c,0x78, + 0xb6,0x8e,0x7,0x4b,0x1b,0xf8,0xee,0xe9,0x1a,0x76,0xf7,0x5b,0x3a,0xb3,0x86,0x4b, + 0xee,0xd,0x75,0x55,0xe7,0x86,0x4b,0x88,0xb1,0xa9,0x87,0x5d,0x77,0xa4,0xec,0xa1, + 0x8d,0xf5,0x9d,0x7d,0xec,0x1d,0x1e,0xe3,0xea,0xd9,0x19,0x8c,0xe,0xf7,0x63,0x6e, + 0x62,0x28,0x22,0x5,0x92,0x8c,0xd7,0x3e,0x71,0xd6,0x98,0xdd,0xae,0xd,0x91,0xe9, + 0x2a,0xcb,0x20,0xdc,0xc6,0xd1,0x2a,0xcb,0xba,0xc6,0xd3,0xb9,0x9c,0x24,0xf7,0x20, + 0x89,0x96,0x85,0x12,0x6f,0xc8,0xad,0x2d,0xdc,0x65,0xe1,0xd2,0xcf,0xa3,0x83,0x72, + 0x58,0xd,0x71,0xf0,0x6c,0x7,0x3a,0x1d,0x8b,0xd6,0xf1,0x49,0xec,0x6b,0x5f,0xe6, + 0x46,0xd6,0x6b,0x1a,0x3c,0x3e,0xe9,0xe0,0xc9,0xca,0x16,0x9e,0x6f,0xee,0x62,0x63, + 0xf7,0x10,0x6b,0x9b,0xfb,0xd8,0xdc,0x3d,0xe0,0xcd,0x9d,0x43,0x6c,0xee,0x1e,0x62, + 0x6b,0xf7,0x10,0x6b,0x5b,0x7b,0x58,0xdd,0xda,0xe3,0xd6,0x71,0x57,0xd1,0x39,0x23, + 0x32,0x96,0x5b,0x4a,0x17,0x40,0x12,0x12,0xe1,0x2f,0x84,0x27,0x2b,0x5b,0xf4,0x74, + 0x75,0x1b,0x8f,0x57,0x36,0xf9,0xd6,0xfd,0x15,0x9c,0x9e,0x1d,0xa3,0x99,0x89,0x61, + 0xcc,0x8c,0xf,0x62,0x66,0x7c,0x18,0x93,0x23,0x3,0xa8,0xd5,0xaa,0x85,0x86,0x23, + 0x7f,0x4e,0xf2,0x1a,0x3a,0x3d,0x3b,0x8e,0x1f,0xbf,0x5,0xda,0xd8,0x3e,0xe0,0x27, + 0xcf,0xb7,0x69,0x75,0x63,0x97,0x2d,0xa3,0x50,0xf4,0xa0,0xf2,0x1f,0xa,0x3e,0xda, + 0x4a,0xc0,0x96,0xfb,0x53,0x3e,0x5b,0xdd,0xc1,0x7f,0xf8,0xf9,0x97,0x58,0x59,0xdf, + 0xc1,0xe5,0xc5,0x69,0x8c,0xc,0x35,0xd1,0x6c,0xd4,0x60,0xc8,0xc0,0x18,0x77,0x4d, + 0x5b,0x66,0x1c,0xb7,0x3b,0x38,0x6c,0x9d,0xe0,0xf0,0xb8,0x8d,0xa,0x11,0x2e,0x2e, + 0x4e,0x61,0x72,0x74,0xf0,0x95,0x89,0x6c,0x0,0xb0,0xb9,0x77,0x88,0xdb,0x8f,0x9e, + 0x63,0x69,0x75,0x17,0x96,0xb9,0xe4,0x8,0xd3,0x6a,0x29,0x49,0xe6,0x65,0x85,0x70, + 0x32,0xac,0x5,0xda,0xed,0x2e,0xda,0xd4,0xc1,0xfe,0x51,0x42,0x8,0x97,0xd7,0x77, + 0xf1,0x78,0x79,0xb,0x4b,0xcf,0xb7,0xf0,0x70,0x65,0x13,0x77,0x9f,0x6e,0xe0,0xfd, + 0xd7,0x17,0xf1,0xd6,0x95,0xc5,0x97,0xae,0x55,0xe4,0xfa,0x8c,0x88,0x30,0x3c,0xd8, + 0x87,0xd1,0xa1,0x26,0xb4,0xbd,0x1e,0xc0,0x8e,0x94,0x18,0xd3,0xd2,0x92,0x9b,0x68, + 0xfa,0xef,0x98,0xe1,0x9b,0x14,0x3e,0xce,0xbc,0xba,0x2c,0xa8,0x2c,0x37,0x3c,0x95, + 0x3,0x59,0x56,0x6a,0x38,0x97,0x2a,0xb2,0x18,0xf1,0x64,0x4,0x30,0x48,0xbb,0xb2, + 0x66,0xf6,0xe9,0xd2,0xed,0xb4,0x5a,0x8e,0x87,0x50,0x9,0x76,0x2d,0x6d,0x5c,0x11, + 0xa1,0xf9,0xa2,0xee,0xab,0xec,0x2f,0x52,0x1a,0x27,0x6e,0x2,0x1,0x21,0x14,0xbf, + 0x97,0x33,0x6f,0x13,0x2a,0x2e,0x62,0x14,0xb,0x30,0xeb,0xc6,0xb3,0xec,0xed,0x62, + 0x42,0xa9,0xb6,0xc4,0x41,0x49,0xe7,0x94,0x7e,0xb1,0x98,0xaa,0x59,0x70,0x26,0xb2, + 0x5a,0x45,0x6a,0xac,0x67,0x8,0x56,0x9c,0x82,0xb2,0x35,0x1c,0x95,0xf1,0xc,0x20, + 0x9e,0xb,0x89,0xd7,0x97,0xd3,0xf3,0x37,0xd1,0x55,0x2a,0x91,0x33,0xd3,0xce,0x9a, + 0x33,0x62,0xa2,0x7a,0x4d,0x7c,0x46,0x7,0x17,0xa7,0xc6,0x2,0xbb,0xd2,0x63,0x50, + 0x62,0x5f,0x9f,0xec,0x2c,0xb8,0xc8,0x99,0x48,0x12,0x30,0x14,0x19,0xe,0x9a,0xe9, + 0xe8,0x42,0x3e,0x82,0xcd,0xb2,0x91,0x56,0x96,0xde,0x1e,0x54,0x10,0xdf,0xc,0x91, + 0xf,0x9c,0xa6,0x60,0xcd,0xce,0x32,0x42,0x55,0x90,0xb0,0x10,0x19,0xec,0x9e,0xc6, + 0x6e,0x10,0xf5,0xa4,0x83,0x7d,0xd,0xba,0x2a,0x7c,0xc3,0xe5,0x61,0xd0,0x8b,0x41, + 0x9b,0x4f,0xe6,0x1b,0xdb,0x7,0xf8,0xf6,0xd1,0xa,0xfe,0x8f,0x5f,0x7f,0x8b,0xdf, + 0x7c,0xf5,0x8,0xf7,0x9e,0xae,0xa3,0xcb,0xb6,0x98,0x61,0x20,0x7d,0xf9,0x8b,0x9a, + 0x8b,0xac,0xa8,0x50,0x89,0x52,0x43,0x2b,0x6,0xdd,0x14,0xb3,0x8f,0xaf,0x1f,0x2c, + 0xe3,0xf4,0xec,0x18,0xa6,0x46,0x7,0x50,0xa9,0x14,0x49,0x49,0xbb,0xfb,0x47,0xfc, + 0x6c,0x6d,0x87,0x5b,0xed,0x8e,0xe6,0x7a,0x94,0xa8,0x1e,0xe5,0xa,0x9d,0x13,0x12, + 0x17,0x2e,0x24,0x79,0x7d,0x44,0x4f,0xfd,0xe0,0x68,0x22,0x5b,0x4a,0xa,0x5e,0x1, + 0x91,0x4c,0xe7,0xc0,0xc8,0xd5,0xad,0x3d,0xbe,0xfd,0x78,0x8d,0xb6,0x77,0xf,0x79, + 0x61,0x7a,0x94,0xfe,0x4b,0x4c,0x4c,0xe4,0x73,0x5a,0xdf,0x3e,0xc0,0x7f,0xfa,0xf0, + 0x1b,0xfc,0xea,0xcb,0x7b,0xfc,0xed,0xe3,0x35,0xec,0x1d,0xb4,0x9c,0x51,0xa7,0x2a, + 0xf,0xfe,0xce,0x32,0x9c,0xd1,0x3d,0xa4,0x24,0x8c,0x4b,0x1a,0x69,0xcf,0xde,0x67, + 0xbd,0x42,0x3a,0xe9,0x32,0x3f,0x5a,0xde,0xc2,0xa3,0x95,0x4d,0xfa,0xe0,0x93,0xbb, + 0xa8,0x56,0xc,0x5f,0x98,0x9f,0xc4,0x9b,0x97,0xe7,0xe9,0xfd,0x6b,0x67,0xf1,0xd6, + 0xe5,0x53,0xb8,0xb0,0x30,0xf5,0x42,0x4f,0xf3,0xb2,0xeb,0xea,0xf4,0xec,0x38,0x7e, + 0x78,0xfd,0x1c,0xad,0x6c,0xec,0xf0,0x7,0x9f,0xdc,0xa5,0xd5,0xcd,0x3d,0x15,0x90, + 0xa4,0xa7,0x74,0xa9,0x33,0x96,0x2b,0x3f,0x31,0xe0,0x8,0x76,0x10,0x81,0xb0,0x77, + 0xd8,0xa6,0xff,0xf0,0xf3,0x5b,0xf8,0xf8,0xd6,0x13,0xbc,0x76,0x6e,0x16,0xe7,0xe7, + 0x27,0xe2,0x2e,0x3a,0xf4,0xeb,0x47,0xad,0x13,0x6c,0xef,0x1d,0x62,0x79,0x7d,0x17, + 0x3b,0x7,0x2d,0x8c,0xc,0x34,0xf1,0xdf,0xfd,0xc9,0xfb,0x98,0x18,0x19,0x78,0xe5, + 0xf7,0x85,0x99,0xb1,0x77,0xd0,0xc2,0xd2,0xfa,0x2e,0xba,0x92,0x98,0x85,0x32,0x13, + 0xac,0x4c,0x93,0x4d,0x65,0x1,0x58,0x1,0xcc,0x25,0x99,0xdb,0x4,0x30,0x70,0xd8, + 0x3a,0xc1,0xed,0xc7,0x6b,0xb8,0xfd,0x78,0xd,0x1f,0xfc,0xf6,0x3b,0xfc,0xc5,0x9f, + 0xbe,0x8f,0xb7,0xae,0x2c,0xbe,0x32,0xff,0xa1,0x70,0xbd,0x85,0xba,0x63,0xf5,0x31, + 0xef,0xce,0x26,0xab,0x14,0x44,0x2a,0xe3,0x22,0x9e,0xb1,0xc6,0x1b,0x36,0x41,0x57, + 0x58,0x16,0xe6,0x98,0x99,0x69,0x3b,0x95,0x32,0xd7,0xb9,0xc0,0x65,0xa,0x77,0x9f, + 0x52,0x10,0x51,0xfe,0x78,0x48,0xc9,0x4a,0x29,0x33,0x84,0xa9,0x16,0xa0,0xa8,0xfc, + 0x17,0xc7,0x64,0x35,0x16,0xad,0x3b,0x4a,0xa,0x2b,0x50,0x1e,0xf3,0x26,0xa,0x2, + 0xe7,0xa2,0x26,0x2a,0x8f,0xe1,0xcc,0x13,0xbd,0x84,0xdf,0x5,0x40,0x19,0xd1,0x2e, + 0xbc,0xa0,0x62,0x2d,0xc5,0xc5,0x2e,0x11,0xe8,0x35,0x28,0x65,0x31,0xa7,0xf1,0xaa, + 0x13,0xf6,0xb6,0xb1,0x3e,0x19,0xca,0xc8,0xfb,0x91,0x97,0x9d,0xae,0xa,0xd2,0x64, + 0x83,0x40,0x1c,0xa,0xdc,0xa1,0xa8,0x76,0xc8,0x7c,0x80,0x73,0x54,0x40,0x2e,0xdc, + 0x49,0xef,0xda,0x9c,0xb,0x51,0xc8,0x6c,0x12,0x8,0xa,0x85,0x94,0x25,0xc5,0x94, + 0x70,0xdf,0x69,0x65,0x3b,0x4b,0x1a,0xbb,0x23,0x56,0xc7,0x5d,0xb4,0xc1,0x61,0xb1, + 0x18,0x4f,0x77,0x2d,0xb1,0x1e,0xf,0xd2,0xa7,0x42,0xf3,0xa3,0x89,0x3d,0x44,0xa2, + 0x8b,0x8c,0x96,0x95,0xe1,0x82,0x4c,0x50,0x7a,0x7a,0x12,0x3e,0x8a,0xc5,0x65,0x5b, + 0xb9,0x4d,0x3,0x7b,0x1b,0x58,0x16,0x4b,0x71,0x44,0x46,0xbb,0xb4,0x38,0x45,0x34, + 0xa2,0x9,0x24,0x3d,0x26,0xc6,0xc2,0xcc,0x18,0xfd,0x37,0x7f,0xfc,0x9e,0x79,0xff, + 0xda,0x59,0x5,0x1,0xf7,0x3a,0x7c,0xe5,0x64,0x7e,0x74,0xdc,0xc6,0xa7,0xb7,0x9f, + 0xe2,0x57,0x5f,0xde,0xc7,0x67,0xdf,0x3e,0xc5,0xa3,0xe7,0x5b,0x58,0xdf,0xda,0x43, + 0x97,0xad,0x20,0x4a,0x6a,0x8f,0x7c,0x75,0xbb,0xc6,0x74,0xae,0x32,0x25,0x1,0xf7, + 0xb8,0x83,0xb4,0xfe,0xc4,0x32,0x30,0x3e,0x3c,0x88,0x89,0x91,0x81,0xd8,0xbb,0xe4, + 0x64,0xa1,0xfb,0xcb,0x1b,0xf8,0xd5,0x97,0xf,0xb0,0xbd,0x7b,0xc8,0xfa,0x56,0xce, + 0x92,0x6,0x43,0xe1,0xe6,0x62,0xe,0x2,0x93,0x27,0xf8,0x90,0x42,0xfb,0x90,0x54, + 0x1d,0xb2,0x49,0x23,0x2a,0xb6,0xee,0xee,0xad,0xd8,0x3d,0x68,0xd1,0xed,0x47,0xcf, + 0xf1,0xeb,0xaf,0x1e,0x62,0xa0,0xbf,0x81,0x85,0xa9,0x91,0x94,0xb6,0xf5,0xa,0x70, + 0xbb,0xb5,0x16,0xed,0x93,0x13,0x7c,0xf7,0x64,0x15,0x7f,0xf3,0xdb,0xdb,0xfc,0xcd, + 0xc3,0x15,0x74,0x1c,0x6a,0xc1,0xaa,0x3d,0x8e,0xbd,0xb8,0x3,0xda,0x51,0x6c,0x5c, + 0x5c,0x2e,0x4d,0x74,0xb1,0x4c,0xb,0x18,0x5f,0x24,0x59,0xa0,0x51,0xa4,0xdb,0x19, + 0xf7,0xa,0x76,0xbb,0x96,0x1e,0x3c,0xdb,0xc0,0xee,0x61,0x8b,0xbf,0x7b,0xbc,0x86, + 0xbf,0xff,0xf4,0xe,0x5d,0x39,0x3d,0x83,0x1f,0xbf,0x73,0x1,0xaf,0x9d,0x9e,0x46, + 0x30,0x1e,0x2a,0x23,0xfc,0xe5,0x6,0x43,0xaf,0x9d,0x9b,0xc5,0x9f,0x74,0xde,0xa0, + 0x7,0xcf,0x36,0x79,0x75,0x6b,0x4f,0x5b,0x73,0x64,0x8c,0x58,0xa5,0x98,0x95,0xeb, + 0x48,0x19,0xa4,0x18,0x9a,0x7e,0x4e,0xae,0x7e,0x2b,0x1b,0x7b,0x38,0x6a,0x9f,0xe0, + 0xfe,0xd2,0x3a,0xfa,0x9a,0x75,0x54,0x4d,0x2a,0xa6,0x9d,0x8e,0xc5,0x51,0xbb,0x8d, + 0xfd,0xc3,0x36,0xe6,0x27,0x87,0x71,0xfe,0xd4,0x4,0xfa,0x1a,0xb5,0x57,0x86,0xde, + 0xbb,0xdd,0x2e,0xb6,0xf7,0x5b,0x58,0x5a,0xdb,0xc1,0xfe,0x41,0x4b,0x4d,0x9c,0x24, + 0x1a,0x28,0x15,0x30,0x45,0x59,0x98,0x96,0xc,0xbc,0x22,0x94,0x22,0xb8,0x94,0x8f, + 0xb9,0x7e,0x12,0xa8,0x98,0x57,0xbb,0x86,0x64,0x21,0xb7,0xd6,0xe2,0xb0,0x75,0x82, + 0xbd,0xc3,0xb6,0xde,0xc,0xb1,0xb3,0xd3,0xd,0xf6,0xd8,0xb1,0x58,0x86,0x17,0xde, + 0x19,0xc2,0xa5,0xf5,0x6f,0xd8,0x89,0xfb,0x24,0xf5,0x28,0x29,0x26,0x6d,0x19,0xce, + 0xa4,0x7,0x40,0xe6,0x72,0xb3,0x2e,0x69,0xf1,0xa,0xa1,0x2a,0x8d,0x6f,0x24,0x65, + 0x86,0x29,0x4c,0xd1,0xc7,0x3d,0x45,0x64,0x19,0x55,0x4f,0xab,0x71,0x9f,0x27,0x6c, + 0xe5,0x38,0xb3,0x5f,0x25,0x19,0xc0,0x5e,0xc8,0xb,0x15,0xf3,0x7b,0xbc,0x89,0xa8, + 0x50,0xdf,0x3,0x2,0xaa,0x22,0x3e,0x21,0xe8,0x38,0xd2,0x69,0xb5,0x97,0x99,0xb, + 0x51,0x41,0x4c,0x9f,0xa6,0x7d,0x3d,0x9c,0x83,0x62,0x16,0x64,0x86,0x3c,0x70,0x40, + 0x7b,0xb2,0xc7,0x19,0x2f,0xfa,0x58,0x14,0x53,0x91,0x27,0x22,0xb9,0x96,0x8c,0xd8, + 0x44,0x94,0x54,0x29,0x41,0x56,0x24,0x8,0xa6,0x53,0x47,0x47,0xb9,0x66,0x86,0x39, + 0xa9,0xa0,0x96,0xc9,0xf5,0x20,0x7c,0xf4,0xe3,0x4f,0x57,0x79,0xb9,0x54,0x7a,0x23, + 0xe8,0x29,0xd9,0x54,0xbc,0xc6,0x80,0xc3,0xb9,0x97,0x2e,0x3a,0xe,0x38,0x29,0x5c, + 0xe5,0x57,0x95,0x57,0xa0,0x33,0x9,0x28,0x20,0x92,0x52,0x37,0xdf,0xb7,0x26,0xcd, + 0x7a,0xb6,0x1b,0xc9,0x87,0x57,0x45,0x3e,0x4,0x47,0x5d,0xad,0x97,0x41,0xc7,0x5c, + 0xce,0xe0,0xf6,0x16,0x1d,0xe2,0x32,0x8f,0x70,0x4e,0x7c,0x2c,0xff,0xfd,0x61,0xcc, + 0x34,0xc1,0x40,0x9b,0x98,0x40,0xf5,0x6a,0x95,0x5e,0x3f,0x3f,0x47,0x3f,0x7d,0xf7, + 0x32,0x8d,0xe,0xf7,0x17,0xa6,0xa9,0x5c,0x53,0x2b,0x61,0xec,0xa3,0xe3,0x36,0xbe, + 0xba,0xbb,0x8c,0xbf,0xfa,0xf0,0x16,0x3e,0xf8,0xf8,0xe,0x96,0xd7,0x77,0x45,0x1a, + 0x1f,0x29,0xbd,0x4a,0x92,0x62,0x92,0x22,0x1d,0xa8,0x15,0x55,0x41,0xcd,0x92,0xa3, + 0x33,0xfa,0x58,0xb,0x7c,0x8e,0x7a,0xcd,0x60,0x71,0x66,0x4,0x8b,0xd3,0x63,0x31, + 0x8b,0x3a,0x14,0xf5,0xc3,0x56,0x1b,0xcf,0xd6,0x77,0xf0,0xd9,0xb7,0x4f,0xf8,0xd6, + 0x83,0x65,0x3e,0x3e,0xe9,0xea,0x86,0xb2,0xb0,0xc2,0xf7,0xb4,0xd0,0xe0,0x19,0xe7, + 0x5f,0x58,0x16,0xd2,0x88,0x34,0x5d,0x5,0x8e,0x82,0x68,0x9a,0xd,0x29,0xde,0x64, + 0x48,0x8a,0x7,0x69,0x58,0x7b,0x79,0x7d,0x97,0x3f,0xf8,0xe4,0x3b,0xd4,0x6b,0x55, + 0xfc,0xc9,0xef,0x5e,0xa3,0x89,0x91,0xea,0xb,0xb,0x47,0xfe,0xda,0x3f,0x5c,0xde, + 0xc2,0x97,0xdf,0x2d,0xe1,0xdb,0x87,0xcf,0xd1,0xb1,0x36,0x2a,0x65,0x55,0xa3,0xc1, + 0x3e,0x29,0x23,0x87,0xe9,0x38,0xb8,0xa3,0xa3,0x8c,0xc8,0xc1,0xd1,0x67,0x89,0xa1, + 0xf9,0x3,0xce,0xe0,0x5b,0xd4,0x7e,0xf7,0x2b,0xdb,0xb6,0x8b,0x95,0xcd,0x3d,0x2c, + 0x6f,0xee,0xe1,0xcb,0xbb,0x4b,0xfc,0xc5,0x9d,0x67,0xd4,0x72,0x39,0xde,0xb8,0xb8, + 0x30,0x89,0x91,0xc1,0x66,0xb4,0xa9,0x95,0x64,0xad,0xfc,0xda,0x1a,0xea,0x6f,0xe0, + 0xed,0x2b,0x8b,0xb8,0x76,0x71,0x9e,0xee,0x2d,0xad,0xf3,0xe6,0xce,0x11,0x2c,0xb8, + 0x2c,0x5e,0x58,0x30,0x1f,0xf4,0xc4,0x18,0xcd,0xdd,0x63,0x6f,0x68,0x28,0xb8,0x8e, + 0x85,0xcf,0xef,0xec,0xb7,0xb0,0xb3,0xdf,0xca,0x3a,0x6e,0xbd,0x4a,0x3d,0xbf,0x30, + 0x81,0x1b,0x97,0x16,0x30,0x3e,0x3c,0xf0,0x4a,0x4c,0x7f,0x66,0xc6,0xe1,0x71,0x7, + 0x5f,0xde,0x5d,0xc2,0xbd,0x67,0x1b,0x60,0xa2,0xa2,0x1b,0x88,0x57,0x76,0x27,0x22, + 0x79,0x9e,0xaf,0xa1,0x9b,0xcc,0xb2,0xb9,0x8b,0x4,0x17,0x27,0xfc,0x65,0xa8,0xbf, + 0x89,0x77,0xae,0x2c,0xe0,0xf2,0xe9,0xc9,0x9e,0x91,0xad,0xf9,0xba,0x23,0xbc,0xf6, + 0xc7,0x27,0x5d,0x3c,0x5a,0xde,0xe0,0x95,0xcd,0x5d,0x56,0xa8,0x8a,0x24,0x5e,0x11, + 0xe5,0xa1,0x38,0x22,0xd,0x21,0x3a,0xfe,0x85,0xb,0x8e,0xc3,0xe5,0x6e,0x99,0x44, + 0xd6,0x85,0x6f,0x7a,0xad,0xf5,0xcd,0x0,0x31,0x53,0xe6,0x96,0x19,0x65,0x6a,0x12, + 0xbc,0x65,0xb1,0x9b,0xf7,0x9e,0xfd,0x5,0x95,0x59,0xe6,0xb2,0x9a,0x2c,0xa,0x54, + 0xa8,0x6a,0x55,0xae,0xfa,0x24,0x16,0xcf,0x2a,0xc1,0x8f,0xf5,0x4e,0x97,0xa4,0xff, + 0x2c,0x9,0xe6,0x65,0x2a,0xa0,0xc2,0xd7,0x53,0xe0,0x7e,0xa4,0x53,0x4b,0x14,0x64, + 0xc6,0x51,0x5f,0x7,0x15,0x55,0xa4,0x4d,0x4d,0x72,0xd8,0x9f,0xb3,0xe2,0x26,0x59, + 0xf7,0x3a,0xd2,0x34,0xc3,0xa1,0x65,0xbe,0x78,0x94,0x1c,0xa,0xca,0x86,0x21,0xca, + 0xf6,0xf5,0x5e,0x8d,0x90,0x4e,0xb3,0x98,0x72,0xa4,0xa8,0x35,0x41,0x58,0xed,0xa7, + 0x79,0x13,0x16,0xd7,0x9e,0xd1,0xef,0x67,0xfa,0x34,0xa5,0xe6,0x68,0xbf,0x17,0x1b, + 0x31,0x8a,0x33,0x73,0x7c,0xbe,0x62,0xb7,0x9e,0x55,0x9,0xce,0x33,0xde,0xa3,0x68, + 0x49,0xc4,0x5a,0x27,0xa6,0x3b,0xab,0xa9,0x32,0x90,0xf9,0x2c,0x73,0x2e,0xa7,0x48, + 0x7c,0x7,0x26,0xc5,0x9f,0xf2,0x5,0x39,0x5f,0x4,0x12,0xa9,0x66,0xa7,0xb8,0x49, + 0x8e,0x26,0x24,0x46,0xd8,0xba,0xa6,0x20,0x10,0xf6,0x52,0x35,0x32,0xd2,0x75,0x5d, + 0xff,0x43,0x31,0xa0,0x5,0xce,0xda,0x3d,0x14,0x9b,0xf8,0xb8,0x9,0xf5,0x5a,0x15, + 0xef,0xbd,0x7e,0x86,0xde,0x7d,0x6d,0x91,0x9a,0xcd,0x5a,0x69,0x7,0xdf,0x8b,0x4c, + 0x63,0xad,0xc5,0x5f,0xff,0xe6,0x36,0xfe,0xf3,0x47,0xdf,0xe2,0xa3,0x9b,0xf,0xb1, + 0xbe,0x73,0x98,0xf1,0x4,0xc3,0xde,0x4d,0x2,0x1e,0xa4,0xae,0xfd,0x74,0x20,0xeb, + 0xeb,0x4e,0xca,0x34,0x12,0x8a,0xad,0xf3,0xea,0x25,0x3a,0x62,0x8c,0xc1,0xec,0x84, + 0xf3,0x92,0xcf,0x77,0xfb,0xb7,0xee,0xaf,0xe0,0x7f,0xfe,0xab,0xdf,0xf2,0x6f,0xbe, + 0x7e,0x8c,0xe3,0x28,0x17,0x4a,0x5e,0xcf,0x94,0xe3,0xb9,0xe4,0xfa,0xb6,0x18,0x64, + 0xca,0xd1,0x51,0xbf,0x0,0xef,0x89,0x11,0xca,0xcb,0x1,0x41,0x6a,0x69,0x14,0x1e, + 0x3c,0x1,0x45,0xe1,0x2b,0xd1,0xaf,0xbf,0x7a,0x4,0x6,0xe1,0xad,0x2b,0xa7,0x30, + 0x32,0xd0,0x54,0xcd,0x48,0x2f,0x88,0xd4,0xed,0x55,0x19,0x1f,0x7f,0xf3,0x4,0x1f, + 0x7d,0xf5,0x28,0x91,0x80,0xa1,0xe2,0xfb,0x58,0xd4,0x62,0x96,0x8,0x5e,0x3c,0xbd, + 0xa8,0xdc,0x38,0x51,0x2e,0x37,0x28,0x78,0xaa,0x23,0x2d,0x71,0xdc,0x99,0xcb,0x24, + 0x92,0x2,0xf5,0x6e,0x8e,0xc,0x56,0x36,0x76,0xf9,0x7f,0xfa,0xab,0x8f,0xf1,0xf9, + 0xdd,0x67,0xf4,0xaf,0x7f,0xfa,0x16,0xde,0x7f,0xfd,0x34,0x66,0x27,0x86,0xcb,0x61, + 0xde,0xec,0xb9,0xd5,0xab,0x15,0xfc,0xf0,0x8d,0xb3,0xd8,0xde,0x3b,0xa4,0xbf,0xfa, + 0xd5,0x37,0xdc,0x6a,0x75,0xb4,0x1a,0x58,0x82,0xeb,0x9c,0x5b,0x83,0x52,0x21,0x72, + 0xa3,0xc4,0x54,0x2e,0x11,0x87,0x91,0x23,0x2c,0xa9,0x2f,0x3b,0x3d,0x33,0x8e,0xef, + 0xbd,0x7e,0x1a,0x13,0x23,0xfd,0x2f,0x2c,0x8e,0xb2,0x1,0xde,0x3b,0x68,0xe1,0x83, + 0x8f,0xef,0xe2,0xeb,0x7b,0x2b,0xa9,0x48,0x73,0x86,0xf2,0x84,0x3d,0xb4,0x18,0xa8, + 0x24,0x1c,0xcf,0x19,0xd1,0x28,0xae,0x7e,0x4,0x5d,0x3b,0x12,0xa2,0xfd,0xef,0xb8, + 0xb8,0x30,0x89,0x7f,0xfb,0x2f,0xbf,0x87,0x77,0xaf,0x2c,0xaa,0xcc,0x84,0x57,0x81, + 0xdd,0x8f,0x8f,0x4f,0xf0,0xd9,0x77,0x4b,0x7c,0xef,0xe9,0x26,0xb2,0xb0,0xc7,0x12, + 0xab,0xf2,0x30,0x99,0x3b,0x92,0x9,0x87,0xa4,0x1d,0x3,0xb0,0x85,0x3b,0xc7,0xd9, + 0xc6,0xf1,0xdd,0xd,0x6e,0xc6,0x75,0x8f,0xb0,0xfa,0x9e,0x31,0x28,0xac,0x98,0xbd, + 0xa4,0x48,0xf9,0xaa,0x38,0xa4,0x40,0x36,0x5d,0x6,0xc5,0x2e,0x88,0x41,0x6c,0x94, + 0x9f,0x47,0x38,0xf2,0xe4,0x2a,0xa6,0x5a,0x84,0xfb,0xe4,0x64,0x58,0xdc,0xfe,0xea, + 0x4c,0x6e,0x5d,0x34,0x49,0x4c,0x73,0x59,0xb8,0x69,0x76,0xd0,0x69,0x82,0x40,0xee, + 0x64,0xa6,0x7c,0xc7,0x55,0xb8,0x2a,0x89,0xb0,0x97,0x2,0x80,0xa1,0xf6,0x17,0x9a, + 0x7a,0xcd,0x45,0x54,0x27,0x95,0x65,0xf5,0xa5,0xec,0x2b,0x82,0xd0,0x44,0xc7,0x42, + 0x48,0x42,0x92,0x25,0xf8,0xee,0xfe,0x82,0x26,0xa,0x1d,0xa5,0x7,0x8d,0x43,0xf0, + 0xa,0x45,0x1f,0x53,0x39,0xd9,0x29,0xd6,0x78,0xc9,0x3,0x33,0x72,0x82,0xcb,0x90, + 0x6f,0xeb,0x90,0x41,0x26,0xe8,0xee,0x4f,0xae,0xb0,0x18,0x2a,0x5f,0x35,0x37,0x77, + 0x89,0x33,0xb8,0xcb,0xf,0x50,0x4d,0x9d,0x31,0x1c,0x8b,0xa2,0x11,0xef,0xa2,0x91, + 0x84,0x8e,0x4,0x23,0x92,0x28,0x54,0xc9,0xb5,0xda,0x13,0xa9,0xd4,0xc8,0xa6,0xd8, + 0xd2,0x0,0x19,0x26,0xc9,0xc2,0x4b,0x41,0xaa,0x2a,0xb1,0xcb,0x48,0x12,0x1c,0x49, + 0x46,0xbb,0xdc,0x33,0x98,0xb0,0x36,0x37,0x81,0xac,0x45,0x20,0x50,0xbd,0x56,0xa1, + 0x37,0x2f,0xce,0xd3,0xf5,0x8b,0xf3,0xa8,0x55,0x8c,0xd2,0x70,0xbf,0x68,0x77,0xde, + 0x3a,0x3e,0xc1,0x9d,0x27,0xab,0xf8,0xbb,0x8f,0x9d,0x7e,0x78,0x6b,0xef,0x30,0x5f, + 0xff,0x29,0x84,0x5,0x65,0x59,0xf0,0xaa,0xfe,0x94,0x8c,0x5f,0xd0,0x5d,0x7a,0x61, + 0x4c,0x11,0x24,0x44,0x66,0x60,0x63,0xe7,0x10,0x1b,0x3b,0x7,0x38,0xe9,0x74,0xd1, + 0x6a,0x77,0xb0,0xb1,0x7d,0x80,0x47,0xcf,0x37,0xf1,0xc9,0x37,0x8f,0xf9,0xc3,0x2f, + 0x1f,0xf0,0xfa,0xce,0xbe,0xdb,0xbc,0x19,0x8f,0x24,0x6a,0xd6,0x4a,0xd0,0x42,0xba, + 0xf7,0xca,0xc8,0xd5,0x88,0xf5,0x87,0xa,0x11,0xd8,0xa6,0x1e,0xd5,0x88,0xe6,0x93, + 0x2,0x31,0xd3,0x24,0x38,0x30,0x22,0x35,0xe9,0x63,0x71,0x3b,0x28,0x9e,0xa6,0xa9, + 0x18,0xf4,0x35,0xea,0x2f,0x85,0xdc,0x65,0x31,0xd9,0xde,0x6f,0xe1,0xe6,0xdd,0x67, + 0xfc,0xf5,0x83,0x65,0x74,0xad,0x8d,0x36,0xe6,0xd1,0xd4,0x23,0xc9,0x86,0x2,0x6b, + 0x3f,0xeb,0xdb,0x99,0xf3,0xc4,0x44,0x96,0x7e,0xde,0xec,0xa6,0xda,0x68,0x13,0x15, + 0xfa,0x5e,0x31,0x99,0xc4,0xce,0x95,0x48,0xc,0x35,0xee,0xe7,0x74,0x2d,0xb0,0x7b, + 0x78,0x8c,0x4f,0xbe,0x79,0xcc,0xf5,0x6a,0x95,0x3a,0x9d,0x2e,0xfe,0xe0,0xbd,0xcb, + 0x18,0x19,0x68,0x28,0x4d,0x7a,0x4e,0x26,0x33,0xc6,0xa0,0x52,0x31,0xb8,0x7e,0x61, + 0x1e,0xcf,0x37,0xf7,0xf0,0x77,0x9f,0xde,0xa3,0xa3,0x76,0x17,0x79,0xe0,0x79,0x99, + 0x67,0x86,0x9e,0xc5,0x8a,0x4,0x63,0x2a,0xe1,0x20,0x95,0x71,0x64,0x2b,0x44,0x18, + 0x1b,0xee,0xc3,0x99,0xb9,0x71,0x4c,0x8d,0xd,0xbe,0x94,0x60,0x26,0x39,0xd,0x4b, + 0x6b,0x3b,0xb8,0x79,0xef,0x19,0x96,0xd6,0x76,0xc2,0x2e,0xd1,0x5d,0x6c,0x9e,0x2c, + 0x19,0x8f,0x9d,0xb8,0x58,0x33,0x7a,0x47,0x60,0x28,0xca,0x79,0x21,0xe9,0x18,0x90, + 0xc1,0x4f,0x69,0x6d,0x31,0x3c,0xd8,0xc4,0x8d,0x8b,0x73,0xf8,0x83,0x77,0x2f,0xe1, + 0x9d,0x2b,0x8b,0x31,0x1c,0xa9,0x17,0xb1,0x52,0xbe,0xce,0x92,0xc0,0xf7,0xf1,0x37, + 0x8f,0xf9,0xee,0xd3,0x35,0x16,0x53,0x48,0x42,0x4d,0x63,0x9e,0xaa,0x9,0x21,0xb7, + 0xae,0xbd,0x20,0x30,0x91,0x1,0xfb,0xd5,0x1a,0x91,0x85,0xd2,0x3a,0x87,0x19,0xc4, + 0x72,0xa9,0xc9,0x56,0xbc,0xa,0x4d,0xa8,0x5e,0x62,0xe0,0x65,0x52,0xc9,0xd3,0xd1, + 0x3f,0x44,0x84,0x7a,0x85,0x95,0x7d,0x4e,0xec,0x8e,0xbe,0x27,0xb9,0x6f,0x1b,0x1, + 0xd5,0x2,0x31,0x41,0x32,0x2d,0xb3,0xdd,0x75,0x22,0x5b,0xe5,0x7,0x45,0x66,0xf4, + 0xc6,0x84,0xd2,0x10,0x54,0x82,0xca,0x2,0x97,0x5,0x8d,0x4a,0xd6,0xdd,0x4c,0xc8, + 0x8c,0x68,0x50,0xb2,0xd8,0x2b,0x61,0x7d,0xb,0x60,0x9a,0x39,0xa5,0xf,0xea,0x8a, + 0x46,0x42,0x72,0x1e,0xe,0xad,0x4a,0x88,0x93,0x24,0x23,0x2c,0x51,0x20,0xa0,0x78, + 0x63,0xc2,0xeb,0x6d,0x92,0xfb,0x72,0x38,0xf8,0x4c,0x3a,0xad,0xd,0x74,0x15,0xf7, + 0xa6,0x5a,0x8e,0xf2,0x15,0xf2,0xda,0x9,0x4a,0x3e,0x63,0x14,0x29,0x8e,0x39,0x94, + 0x53,0xe9,0x5a,0xe7,0xcf,0x4f,0xca,0x43,0x67,0xc4,0xe6,0x1b,0x29,0xb2,0x49,0xaf, + 0x3,0xa5,0xd3,0x14,0x8c,0x3b,0xcc,0xb8,0x22,0xb6,0x32,0x2c,0x26,0xf6,0xcc,0x5e, + 0xb6,0x70,0x58,0x18,0xd5,0x45,0x64,0x3b,0x12,0xa3,0x16,0x96,0x30,0x22,0x7f,0x36, + 0x4c,0xe4,0x22,0xd1,0xcb,0x5f,0xa4,0x24,0x86,0x8d,0x0,0xf5,0x9a,0x24,0x82,0x8e, + 0xd3,0xa1,0x20,0xc5,0x85,0xf2,0x6f,0xa2,0xf4,0x8d,0x43,0x75,0xf,0xb6,0xaa,0xd5, + 0x2a,0x2e,0x9f,0x9d,0xa1,0xb3,0xf3,0x13,0xd4,0x6b,0x5f,0x5e,0x76,0x78,0x3d,0x5c, + 0xde,0xc0,0xcf,0x3e,0xbb,0x87,0xdf,0x7e,0xfb,0x18,0x5b,0x7b,0x47,0x59,0x1a,0x1d, + 0xf4,0x40,0x28,0x5e,0x33,0x83,0x32,0xcb,0x7c,0x2a,0x45,0xd4,0xb,0xe4,0xb8,0xdc, + 0x48,0x48,0xf0,0x58,0x3a,0x1d,0x8b,0xcf,0xef,0x2c,0xb9,0x33,0xd1,0x38,0xb2,0xd8, + 0x9d,0xc7,0xab,0xfc,0xd1,0xad,0x47,0x58,0x5e,0xdb,0x61,0x52,0x68,0x98,0xd,0x16, + 0xa1,0x2e,0xe,0x94,0x99,0xa5,0x76,0x55,0x86,0x24,0xb1,0x7f,0xd4,0x49,0xe7,0x1a, + 0xe3,0x6a,0xe1,0x70,0x25,0xa3,0xf4,0xfc,0xa1,0xa9,0x62,0x70,0x46,0x74,0x93,0x3a, + 0x45,0xd7,0xe2,0x54,0x8d,0x73,0x4e,0x7b,0xe7,0xd2,0x2,0xe6,0x7c,0x10,0xcb,0xab, + 0xb8,0xee,0x1d,0x1d,0x9f,0xe0,0xd1,0xca,0x26,0xee,0x3d,0x5d,0xc7,0x41,0xeb,0x84, + 0xcb,0x55,0x2a,0x11,0x43,0x14,0x74,0x1a,0x8f,0x7d,0x1a,0x44,0xa5,0x91,0x44,0xfd, + 0x54,0x40,0x83,0xf2,0xe1,0x96,0xf6,0xde,0x2c,0x13,0xa,0x1c,0x1f,0x53,0xfc,0x2, + 0x41,0x2,0x1,0x11,0xa1,0xdd,0xb1,0xf8,0xfb,0xcf,0xee,0x81,0xc1,0x18,0x19,0xec, + 0xc7,0xdb,0x57,0x4e,0x61,0x62,0x64,0xa0,0xe7,0x5a,0x27,0x7c,0x7c,0x6a,0x6c,0x10, + 0x17,0x17,0xa6,0x30,0xd4,0xdf,0xc4,0xf6,0x7e,0xeb,0xc5,0xdc,0xe2,0x12,0x9e,0x29, + 0x71,0x89,0xbb,0x74,0x61,0xb0,0x2a,0x4b,0xed,0x2,0x6,0xfa,0x1a,0xb8,0x71,0x79, + 0x11,0xe7,0xe7,0x27,0x5e,0x38,0x99,0xcb,0xf7,0xa5,0xdb,0xed,0x62,0x65,0x73,0x1f, + 0xb7,0x1f,0xaf,0x62,0x69,0x7d,0x57,0x98,0x82,0x25,0x24,0x4a,0xef,0xbc,0xe5,0x8a, + 0xd3,0x24,0xd2,0x17,0x74,0xac,0x75,0x71,0xb7,0x9c,0xee,0x95,0x91,0xa1,0x26,0xde, + 0x38,0x37,0x8b,0x7f,0xfb,0x2f,0xde,0xc3,0xef,0xbd,0x75,0x1,0x95,0xca,0xcb,0xe3, + 0x55,0xf3,0xc2,0x7e,0xd8,0x3a,0xc1,0xbd,0xa5,0xd,0xfe,0xfc,0xbb,0x67,0xbc,0xbe, + 0x73,0xc0,0xc9,0xb9,0xd3,0x5f,0x1e,0x71,0xe5,0x68,0xd9,0x21,0x35,0xc4,0x16,0x3a, + 0x3d,0x4d,0xa6,0x80,0x85,0xa1,0x92,0xd8,0xa,0x43,0x95,0x18,0xc6,0x2a,0x20,0x74, + 0xb9,0x94,0x35,0xe9,0xa,0xcb,0xee,0x19,0xcd,0xdd,0xd6,0x83,0x6e,0xe4,0x44,0x1b, + 0x14,0xe3,0x48,0x94,0x7d,0x7c,0xba,0x3e,0xaa,0x44,0x19,0xdb,0xaf,0xa0,0x9,0xd3, + 0x76,0xa2,0x2c,0x76,0x30,0x54,0xd8,0xd1,0x9,0xe6,0x7a,0xd0,0xa9,0xb,0x14,0x3b, + 0xee,0x96,0xb3,0xc9,0x94,0xa8,0x18,0xd5,0xa9,0xb6,0xaf,0x2c,0xa0,0xca,0xec,0xb8, + 0x8b,0x56,0xaf,0x2c,0xa2,0x5a,0x15,0x5,0x4b,0x14,0x6d,0x22,0xc5,0xd7,0x12,0x83, + 0x63,0x2c,0xce,0x69,0x25,0x61,0xd4,0xfa,0x2d,0x96,0x14,0xa1,0x98,0x56,0xbf,0x21, + 0xc0,0xce,0xd2,0xe9,0x85,0x74,0x5c,0x52,0x2,0xaf,0x33,0x14,0x81,0xb,0xc2,0x39, + 0x50,0x12,0xfe,0x27,0x3f,0xee,0xec,0xe,0x17,0x29,0x1c,0x19,0xc1,0xca,0x28,0x53, + 0x1c,0x8a,0x47,0x5d,0x64,0x34,0x47,0xda,0x8d,0x1b,0xc6,0x2d,0xb3,0xda,0x70,0x73, + 0x94,0x2f,0xe6,0x7b,0xb2,0x42,0x98,0x5b,0x64,0xd,0x4,0xcb,0x98,0x68,0x5e,0xa9, + 0x62,0xb3,0x59,0x26,0xe1,0x19,0x71,0x69,0xc4,0x80,0xf,0x90,0x92,0x33,0x44,0x5b, + 0x77,0x44,0x16,0x7b,0xf0,0x76,0x8f,0x1e,0xd6,0x8e,0x1,0x1f,0x78,0x24,0x7e,0x88, + 0x4f,0xcc,0x6c,0x80,0x60,0x2a,0x44,0x13,0x23,0x3,0x18,0xec,0x6b,0xbc,0x50,0xb7, + 0x9a,0x1f,0x4,0xdf,0x3c,0x7a,0x8e,0xbf,0xfd,0xe4,0xe,0xd6,0xb6,0xf,0x52,0x94, + 0x80,0x5c,0x7,0xb1,0xb8,0xe1,0xa,0xf7,0x41,0xd1,0x6f,0x1f,0xa5,0x57,0x6f,0x6, + 0x89,0x86,0xb7,0x4e,0x24,0x15,0x86,0x3f,0x27,0x5d,0x8b,0xf,0xbf,0x78,0x80,0x5b, + 0xf7,0x57,0x60,0xa8,0x82,0xa3,0xf6,0x31,0xef,0xec,0xb5,0xb0,0xba,0xb9,0x5f,0x50, + 0x6,0x92,0x28,0x5c,0xe,0x41,0x8e,0x19,0x9c,0xac,0xe4,0x35,0xf2,0x18,0x35,0x7e, + 0x94,0x10,0xae,0x8e,0x86,0xd,0x41,0xb,0x35,0xc4,0xdb,0x64,0xe2,0xb5,0x4e,0xd2, + 0x6d,0x4a,0xdc,0xdf,0x64,0xc,0xae,0x5f,0x9c,0xa7,0x1b,0x97,0x17,0xa8,0x5e,0x35, + 0x8a,0x24,0x96,0x1b,0xf7,0xc8,0xdb,0xe9,0xe1,0xb3,0xd,0xfc,0xf2,0x8b,0x7,0xbc, + 0xba,0xb3,0x9f,0xa5,0x13,0x32,0xeb,0xb1,0x3c,0xd0,0x52,0xa2,0xbb,0x7,0x7,0xf2, + 0x92,0xe3,0xb7,0x71,0x2a,0xfd,0xc2,0x41,0x2a,0x7c,0x5,0xf2,0xb5,0x94,0x13,0x23, + 0x45,0xc,0xd8,0x21,0xef,0xcc,0xe1,0x2c,0x60,0x81,0x97,0x85,0x2f,0xb,0xc3,0xd4, + 0x17,0x77,0x9e,0xa1,0x59,0xff,0x82,0x26,0x46,0xfa,0x31,0x31,0x32,0xf0,0x52,0x24, + 0x82,0x99,0x31,0x36,0xdc,0x8f,0xb,0xa7,0x26,0xb1,0xb5,0x7b,0x88,0x83,0xd6,0x49, + 0x7c,0xac,0x5,0xfa,0x43,0x76,0xc1,0x30,0x95,0x28,0x71,0x29,0xd7,0x48,0xe4,0x59, + 0x5f,0xe9,0x23,0x3,0x7d,0xd,0xbc,0xff,0xfa,0x69,0x5c,0x5c,0x9c,0x8a,0x8f,0xa5, + 0x97,0x47,0x7b,0x98,0x84,0x8d,0x31,0xf8,0xe2,0xce,0x12,0x3e,0xbc,0xf9,0x8,0x7, + 0x47,0x27,0x48,0xa6,0x60,0x88,0xb2,0x63,0x2e,0x95,0xe3,0x52,0xae,0x7e,0xce,0xd6, + 0x4a,0xac,0x89,0x17,0xfe,0xcf,0xf5,0xb,0x73,0xf8,0xc1,0x1b,0xa7,0xf1,0xa3,0x37, + 0xcf,0xe3,0xda,0xb9,0x59,0x54,0xab,0x95,0x42,0x98,0x51,0xae,0x32,0x28,0x8b,0x8a, + 0xfd,0xf0,0xcb,0xfb,0xfc,0xef,0x7e,0xfe,0xb5,0x5d,0xdf,0x39,0x10,0x5c,0x30,0xf6, + 0x89,0xd5,0x2e,0x6e,0x10,0x11,0x65,0xb2,0x9,0x55,0x60,0xcb,0x82,0xd,0x1e,0xc0, + 0x1c,0x16,0x94,0x74,0x61,0xd,0x47,0xa2,0xc4,0x91,0x20,0x6f,0x8,0xd2,0x1a,0x95, + 0x53,0x19,0x8c,0xf0,0x7d,0x52,0x8d,0x99,0x54,0x9b,0x96,0xa8,0xc8,0x15,0xdf,0x8a, + 0xb2,0x9,0x5d,0x4f,0xf4,0x9c,0xe1,0xf7,0xac,0x74,0xc9,0x5,0xe9,0x1,0x95,0x48, + 0x25,0xa3,0xa2,0x8d,0x4a,0xc8,0xe,0x54,0x4c,0x3b,0xcb,0xfd,0xdf,0x95,0x5a,0x5b, + 0x74,0xd7,0xc2,0xc6,0x27,0xe9,0x63,0xf5,0xab,0x25,0xfb,0x8d,0xd8,0x19,0xc6,0xbd, + 0x4,0x9,0x9e,0x37,0x47,0xb4,0x36,0x6d,0x9f,0x8d,0xc,0x90,0x22,0x16,0x24,0xb8, + 0x0,0x38,0xb,0x56,0xb5,0x20,0xcb,0x26,0x70,0x2e,0xd6,0x28,0xe,0x6b,0xe,0xe1, + 0xd9,0x1e,0xcc,0x9b,0x91,0xe7,0xdc,0x2a,0x79,0x4,0x28,0x52,0xd2,0xc5,0x3e,0x89, + 0x8a,0x37,0x8c,0x9b,0xd6,0x90,0x8,0x7c,0x6c,0xb4,0x2d,0xae,0x88,0x6e,0x22,0x23, + 0xd5,0x68,0xe9,0x65,0x71,0xd8,0xac,0x89,0xdd,0x26,0xb1,0xb2,0xc7,0x4b,0xaf,0x4e, + 0x64,0xa4,0xb2,0x38,0xd,0xa1,0x70,0x7d,0x23,0xb9,0x47,0x64,0x48,0xfa,0x21,0x29, + 0x9e,0xa5,0x74,0x88,0x45,0x8c,0x45,0x27,0x2d,0x13,0x74,0xf8,0x79,0xca,0x30,0x4f, + 0x96,0x64,0x69,0xdf,0xee,0x64,0xd4,0xa9,0x73,0x95,0x5a,0x42,0x77,0xe6,0x18,0x54, + 0xd0,0xac,0xd5,0x5e,0x69,0x12,0x91,0x87,0xed,0xf3,0x8d,0x3d,0x7c,0xf7,0x78,0xd, + 0x9d,0x8e,0x45,0x84,0x5e,0x38,0x97,0xc0,0xe4,0x10,0x54,0x2,0x3f,0x7b,0x45,0xe2, + 0x12,0x34,0x22,0x55,0xc,0x45,0x62,0x5,0xc7,0x93,0x30,0xf,0x79,0xb2,0xb6,0x8b, + 0x27,0xab,0x3b,0xac,0x20,0x2,0x27,0x1,0x50,0xf7,0x6e,0xde,0x50,0x30,0x85,0xfd, + 0x9b,0xf5,0xc,0x76,0xdf,0x60,0xda,0x0,0xed,0x91,0xef,0xdd,0x48,0x87,0x15,0x13, + 0xa7,0xc,0xf5,0xc4,0x10,0x22,0xa5,0x4c,0x20,0x49,0x54,0x74,0x3b,0xc6,0x30,0xa8, + 0x37,0xeb,0x55,0xbc,0x7e,0x6e,0x16,0xaf,0x9d,0x9d,0xe,0xd4,0x86,0x52,0x74,0x44, + 0x4e,0xaf,0xcc,0x8c,0xbb,0x4b,0xeb,0xf8,0xc5,0x97,0xf7,0xb1,0xbd,0x7b,0xc4,0x2, + 0xb2,0x66,0xe1,0xf,0xcc,0x94,0xf6,0xb5,0x1,0xce,0x72,0xd,0xb,0x53,0xd6,0x2a, + 0x73,0x1a,0x67,0x19,0x59,0x36,0xb4,0xe7,0xca,0x84,0x1f,0x2e,0x9d,0xac,0x2,0x13, + 0x90,0x34,0xb5,0x15,0x3e,0x9c,0x4e,0xaa,0x4f,0x18,0xc0,0xce,0x41,0xb,0x1f,0xde, + 0x7c,0x84,0x9f,0xbe,0x77,0x19,0xaf,0x9f,0x9b,0x41,0xfd,0x5,0xeb,0x85,0x70,0x1d, + 0x36,0xeb,0x55,0x2c,0xcc,0x8c,0xe1,0xc1,0xca,0x16,0xe,0x56,0xb6,0x2,0x91,0x5b, + 0x13,0xb2,0xb8,0xec,0x8c,0xcd,0x88,0x73,0xc9,0x42,0x40,0xa1,0x7d,0x9c,0x1,0xf5, + 0x81,0x6a,0x33,0x3a,0xdc,0x8f,0x6b,0xe7,0x66,0xb1,0x30,0x3d,0xfa,0x52,0x7,0xbf, + 0x0,0x5d,0x1f,0xb6,0x4e,0x70,0xf3,0xde,0x32,0xbe,0xb8,0xf3,0xd4,0xa9,0xd,0x48, + 0xdf,0x2,0xfa,0x4c,0x28,0x1e,0xef,0xf9,0xa,0x4a,0x66,0x41,0x84,0xaf,0xa9,0x54, + 0xc,0x9a,0xcd,0x1a,0x2e,0xce,0x4f,0xe2,0xa7,0xef,0x5d,0xc4,0x1f,0xbc,0x7b,0x11, + 0x57,0xbc,0xa9,0x8f,0x2c,0xe6,0x65,0x8a,0x14,0x79,0xff,0x86,0xfd,0xfa,0xd3,0xd5, + 0x1d,0x7c,0xf0,0xe9,0x3d,0xfe,0xc5,0x17,0xf7,0xb9,0xd5,0xee,0x78,0xba,0x15,0xa5, + 0x78,0xe,0xe3,0x93,0xa3,0xac,0x65,0xeb,0x8e,0x62,0xaf,0x48,0x77,0x8d,0xa3,0xf5, + 0x10,0xbc,0x5c,0x47,0x72,0xa0,0x66,0xc6,0xac,0x13,0x62,0x1d,0x47,0x4d,0xc8,0x17, + 0x96,0x85,0xd0,0xcd,0x2,0xe9,0xb1,0xe4,0x7d,0x95,0x83,0xb6,0x11,0x92,0x3e,0x52, + 0x4c,0xab,0xc4,0x6d,0xb,0xc6,0x32,0x85,0xc0,0x7,0x91,0xe9,0x25,0x19,0x74,0x2c, + 0xa0,0x13,0x96,0x64,0x86,0x4c,0x75,0x86,0x92,0x6e,0x8c,0xb,0x24,0x3d,0x51,0xc4, + 0xc,0xd2,0x85,0xac,0x24,0x5a,0x7e,0x9a,0xa,0xe8,0x6a,0x98,0x29,0xc5,0xbe,0x6, + 0x24,0xc3,0x53,0x22,0xdc,0x4f,0x79,0xb7,0x9a,0xac,0x43,0x85,0x5e,0xd8,0x18,0x1, + 0x12,0x86,0x2b,0x86,0x20,0x17,0xe3,0x62,0x31,0x2b,0x46,0x6c,0x9,0xc1,0x8b,0x69, + 0x90,0xe4,0xda,0xdb,0x50,0x59,0x7c,0x49,0x50,0x5a,0x2b,0x3d,0x3b,0x4a,0x26,0xa0, + 0x94,0x31,0xca,0xd2,0x12,0xaa,0xf0,0x4e,0x19,0xe1,0x6e,0x4,0x41,0xf4,0xd,0x6, + 0xdc,0x86,0xf4,0x4e,0xc2,0xcd,0x30,0x81,0xde,0x17,0x61,0x76,0xd5,0xa2,0x59,0xc9, + 0x94,0xe3,0xd2,0x9b,0x94,0xa,0xa9,0x7e,0x1e,0xa8,0x94,0x5b,0x30,0x45,0x2c,0x2e, + 0x88,0xfb,0xd4,0xe2,0x83,0xf2,0x6d,0x74,0xc,0x56,0x61,0xd2,0xe,0x72,0xc6,0xb8, + 0xd5,0xa6,0x9,0x2d,0x54,0x24,0xcc,0x25,0x17,0x78,0xa8,0x66,0x90,0x88,0xbd,0xbc, + 0xec,0xd5,0x3c,0xbe,0xe5,0x1,0x57,0xab,0x56,0x7d,0x42,0x9a,0xf0,0xc8,0xcf,0x50, + 0xf6,0x32,0xd1,0xd9,0xcb,0x5,0x40,0x9a,0x0,0xa7,0x29,0x8f,0xa4,0x8e,0xc2,0x94, + 0x99,0xc,0xf5,0x77,0x77,0xae,0x18,0x8,0xc0,0x45,0xb0,0x83,0x4d,0x50,0x59,0x80, + 0xad,0xdf,0x91,0x3b,0xd7,0x78,0x97,0xd8,0xc5,0x92,0x55,0x6d,0x88,0xc,0xb3,0xfb, + 0x12,0x8a,0xa,0x1e,0x2a,0x5c,0x98,0xd1,0x89,0x4f,0xef,0x3f,0xe5,0x2d,0x27,0x4d, + 0x1b,0x88,0x30,0x34,0xd0,0xc4,0xb9,0x53,0xe3,0x74,0x6a,0x6a,0xe4,0x95,0x5e,0x73, + 0x22,0xc2,0xfe,0x51,0x1b,0xf,0x96,0x36,0xf8,0xab,0xfb,0x2b,0x7c,0xd2,0xb1,0x69, + 0xa,0x27,0x82,0xb3,0xe9,0x8c,0x7,0x47,0x28,0xd6,0xc,0x36,0xbe,0xc0,0x73,0xb4, + 0x64,0x31,0x4c,0x2c,0x5f,0x39,0xdf,0xbd,0x26,0xb1,0xa8,0x60,0x9a,0x5,0x2,0x25, + 0x23,0xd1,0x5e,0x90,0x19,0x4a,0x84,0x68,0xa6,0x90,0x75,0x13,0x56,0x70,0x9,0xc1, + 0x25,0x1c,0x77,0xba,0xb8,0xfb,0x74,0xd,0xdf,0x3d,0x59,0xc7,0xa5,0x85,0x89,0x68, + 0x19,0xdb,0x8b,0x74,0x59,0x35,0x6,0xa3,0xc3,0x4d,0xc,0x34,0x6b,0xc8,0xfc,0x7f, + 0x4,0xf1,0x49,0x79,0xfc,0x15,0x52,0x22,0x3d,0x91,0x55,0xc5,0x18,0x43,0x6e,0x8, + 0x64,0xd8,0x86,0x61,0xd4,0x6b,0x15,0x9c,0x9e,0x1e,0xc5,0xe9,0xd9,0x31,0x34,0xeb, + 0xd5,0x57,0x6a,0x6e,0x4f,0x4e,0x3a,0x78,0xba,0xb6,0x8d,0xbb,0x4b,0x1b,0x58,0xdb, + 0x3e,0x54,0x90,0x37,0x97,0xad,0x9,0x4a,0x3e,0x1e,0xef,0x1b,0xa3,0x37,0xa6,0xb1, + 0xb0,0x19,0xc2,0xec,0xc4,0x30,0xfe,0xf4,0x47,0xaf,0xe3,0xc7,0x37,0xce,0xe3,0xec, + 0xfc,0x38,0xc6,0x6,0x9b,0xa5,0x6e,0x7c,0xbd,0x5e,0x53,0xd9,0x18,0x7e,0xf3,0x70, + 0x15,0xff,0xeb,0x7,0x5f,0xd8,0x8f,0xbe,0x7e,0xc8,0x7b,0x87,0x6d,0xce,0x74,0x9b, + 0xcc,0xd1,0x28,0xc2,0xef,0xca,0x99,0x18,0x30,0x1e,0x92,0x71,0xff,0x18,0x62,0xb6, + 0xd6,0x15,0x78,0xa7,0x58,0x73,0x0,0xa1,0x25,0xdf,0xd,0x4,0xbe,0x49,0xc9,0x92, + 0xb2,0xc8,0xa9,0xe1,0x17,0x22,0x9d,0x44,0x3d,0xd2,0xad,0xb,0x1b,0xc,0x99,0x37, + 0x62,0x40,0x2,0xb,0xe5,0xb8,0x43,0x2f,0xdc,0x6b,0x72,0xa3,0x5b,0xc,0x3a,0x29, + 0x88,0xb1,0x33,0x59,0x98,0xb6,0x4f,0xc9,0xa2,0x0,0x63,0xcd,0x36,0x8a,0xe1,0x98, + 0x34,0xef,0x94,0xb1,0x1f,0x65,0xb1,0xca,0xe4,0x27,0xd1,0x7e,0xd6,0x24,0x2a,0x4e, + 0x9a,0x17,0x33,0xfe,0x5d,0x30,0x35,0xf1,0xf6,0x6d,0x45,0x98,0x17,0xc1,0xff,0x3b, + 0x16,0x21,0xe1,0x70,0x29,0xa7,0x71,0x29,0xdc,0xa,0xae,0x66,0x1e,0xd6,0x8e,0x65, + 0x26,0x1a,0x96,0xb,0x8d,0x13,0x29,0xf6,0xbe,0x7e,0xab,0x55,0x34,0xaa,0xe1,0xe4, + 0xe,0xe4,0xc6,0x8,0x21,0x6d,0x62,0x21,0x5e,0x2b,0x51,0xfc,0x7,0x3d,0xa5,0xc9, + 0x38,0xbf,0x2,0x99,0xb0,0x32,0xf8,0x2f,0x5,0x31,0x86,0x9f,0xcd,0x2a,0xd5,0x27, + 0x9d,0x5,0x4a,0xc9,0x58,0xd8,0x2a,0x88,0xc2,0x9d,0x36,0x13,0x31,0x16,0x2a,0xcb, + 0xbd,0x53,0x1c,0xd7,0xa4,0xc2,0x91,0xcb,0x78,0xe7,0x5,0x9f,0x7e,0x94,0x63,0xd7, + 0x44,0x6e,0x7b,0x2c,0x32,0xc6,0x83,0xa0,0x46,0xe9,0xb,0xe3,0x55,0xd0,0x5,0xb0, + 0xb9,0x7b,0x88,0xf6,0x49,0x7,0xb5,0x6a,0xe5,0x95,0xcd,0x33,0x2e,0x2e,0x4c,0xe2, + 0x77,0xde,0x3c,0x87,0x5f,0xde,0x7c,0x80,0xfd,0xc3,0xe3,0x78,0x3d,0xe5,0xcc,0x58, + 0x53,0x16,0x3e,0x91,0xc1,0x8a,0x9c,0x39,0x3c,0x95,0xb1,0x12,0x54,0xd2,0x20,0xa0, + 0x88,0x90,0x52,0x12,0x24,0xcd,0x86,0xe2,0xb5,0xc3,0x99,0x44,0x48,0x62,0x39,0x4e, + 0xaf,0xef,0xd5,0x88,0x14,0x62,0x23,0x45,0x67,0xeb,0x8b,0xa0,0x71,0xa4,0x4e,0xca, + 0x91,0x7,0x79,0x4f,0x85,0x86,0xc6,0xa4,0xdc,0xb5,0x2,0x59,0x8b,0xa2,0x2b,0x1f, + 0x2e,0x2c,0x4c,0xd2,0xcc,0xd8,0x70,0xa1,0x68,0xe7,0xf2,0xa2,0x30,0x55,0xed,0x1d, + 0xb4,0xf0,0xd5,0xfd,0x15,0xdc,0x79,0xba,0x81,0x4e,0x57,0xaf,0xe0,0xc8,0x1f,0xbc, + 0x51,0x76,0x93,0x7e,0x22,0xa7,0x33,0x5f,0xa4,0x1f,0x90,0xed,0xb5,0x95,0x56,0x50, + 0x70,0xbc,0x98,0x42,0xeb,0xac,0x17,0x66,0x69,0x29,0x2f,0xb8,0x39,0x50,0x4a,0x37, + 0x51,0x70,0x2d,0x63,0x7d,0xe7,0x10,0xcf,0xb7,0xf6,0x70,0x7e,0x7e,0xa2,0xf4,0x5a, + 0x53,0xd3,0x25,0xb9,0x70,0x92,0x5a,0xad,0x26,0x1,0xf,0x69,0x6a,0x25,0x50,0x33, + 0x6f,0x38,0x92,0x3b,0x7b,0x2a,0x63,0x2d,0x92,0xb4,0x77,0x45,0xd2,0xa,0xa3,0xc5, + 0xf9,0xf9,0x49,0xbc,0x76,0x6e,0x6,0xc3,0xfd,0x8d,0x97,0xca,0x7,0xc3,0xe3,0x5f, + 0xd9,0xdc,0xc7,0x27,0xdf,0x3e,0xc5,0xd2,0xda,0x6e,0x81,0xc5,0x4b,0x78,0xc1,0x30, + 0xc7,0x45,0x42,0x9e,0xac,0x3,0xec,0x9,0x7a,0xa7,0x67,0x46,0x71,0x71,0x71,0x12, + 0x6f,0x9c,0x9f,0xc3,0xef,0xde,0x38,0x8b,0xd7,0xcf,0xcc,0x44,0x35,0x44,0x59,0x6c, + 0x70,0x59,0xf3,0x1d,0x57,0x53,0x27,0x1d,0xdc,0x7e,0xbc,0x86,0xff,0xf3,0xb7,0xb7, + 0xed,0xcf,0x3f,0xbb,0xc7,0x4f,0x57,0xf7,0xd8,0x9f,0x44,0x7e,0xa1,0x6d,0x53,0x43, + 0xe8,0x1a,0x40,0xa7,0xe8,0xf1,0x72,0x5d,0x2b,0x87,0x4d,0x22,0xc0,0x18,0x46,0x97, + 0xe3,0xb7,0x5b,0xf7,0x7d,0xee,0x7d,0xf1,0x3c,0x13,0x75,0xeb,0x67,0x7,0x9d,0x10, + 0xe,0x3,0xda,0xc5,0x3d,0x33,0x99,0xd2,0x94,0x73,0x52,0x1c,0x69,0x56,0xfe,0x66, + 0x80,0x50,0xd1,0x89,0x4e,0x90,0xc0,0xa8,0x6,0xb6,0x2b,0x97,0xd9,0xb5,0x66,0xc, + 0x35,0x39,0xa5,0x14,0x72,0xbb,0x15,0xc5,0x46,0xfc,0x17,0xc9,0x3d,0xaf,0x70,0x32, + 0x4b,0x79,0xa5,0x8e,0xbc,0x23,0x7f,0xa6,0x8c,0x13,0x94,0x9e,0x68,0x1e,0x56,0xd6, + 0x46,0xf5,0x26,0xda,0xc9,0xb3,0x62,0x1c,0x93,0x82,0xbe,0x93,0x34,0xca,0x7f,0x87, + 0x89,0xc5,0x59,0xe5,0x17,0x1a,0x16,0x1f,0x33,0x81,0x1,0xe1,0x67,0xd0,0xc0,0x6c, + 0x33,0x24,0x58,0xee,0x59,0x13,0x80,0x28,0x51,0x8c,0x12,0xb7,0x24,0xc0,0x30,0xa5, + 0x7b,0xd5,0xf4,0x46,0x4a,0x2a,0x1e,0x9,0x4c,0x5c,0x13,0xb,0x15,0xfa,0xc0,0x45, + 0xca,0xa0,0xfe,0x7a,0x56,0x8d,0x59,0x68,0xf,0x92,0x8d,0x93,0x71,0x93,0x4f,0xfa, + 0xd9,0xac,0x60,0x61,0x41,0x6e,0x4e,0x8c,0x7e,0x75,0x66,0x10,0x58,0xb2,0x8,0x49, + 0x7b,0xe7,0x46,0x1e,0xb4,0x51,0x4a,0x7c,0x31,0x80,0xf8,0xd7,0x49,0x3e,0x7c,0xdf, + 0xb2,0x18,0x8a,0x19,0xe6,0x21,0xfe,0x94,0x92,0xa9,0x3d,0x45,0xbb,0x3e,0x23,0x7, + 0x4a,0xed,0xc2,0x64,0xbb,0x8c,0x7,0xcf,0x36,0xf1,0x64,0x75,0x7,0x67,0x67,0xc7, + 0x50,0xad,0x9a,0x57,0xda,0xa1,0xbf,0xfb,0xda,0x22,0x4c,0xc5,0x60,0x65,0x63,0xf, + 0x5f,0xdc,0x5d,0x8e,0x5e,0x1,0xe9,0xf2,0x22,0x8d,0x9f,0x87,0x96,0xc8,0xe8,0x22, + 0xcd,0x46,0x9b,0x9,0x91,0xb4,0x6e,0xa3,0x32,0xda,0xa,0x69,0xe8,0x15,0x22,0x36, + 0x38,0xc7,0xe8,0xa4,0x54,0x51,0x89,0xf,0xc9,0x53,0x75,0x2,0xb2,0xcc,0xda,0xce, + 0x98,0x82,0x5e,0x96,0x93,0xfe,0x25,0xae,0xa5,0x73,0xf5,0x61,0x98,0x67,0x25,0x39, + 0x2e,0x5c,0xd0,0xc6,0x8b,0xec,0x63,0xc8,0x6d,0x6c,0x9c,0x17,0x67,0x46,0xf1,0xce, + 0x95,0x45,0xc,0xf9,0xc2,0xf1,0x32,0x6,0x35,0x0,0x6c,0xed,0x1d,0xe1,0xe7,0x5f, + 0xdc,0xe7,0xbb,0x4f,0xd6,0x3c,0x41,0x8d,0xa4,0xd8,0x38,0xd5,0x71,0x8e,0x6a,0x7a, + 0x46,0xcc,0xb7,0xf2,0x19,0x1b,0x3a,0x8,0xa2,0x7,0x0,0xec,0xc5,0x86,0x24,0xe3, + 0x95,0xd2,0xb1,0x8,0x12,0xf3,0xad,0x8c,0xb,0xe4,0x38,0xcc,0xfb,0xb7,0x34,0x28, + 0xf0,0x63,0xcc,0x2c,0x8e,0x4f,0x3a,0x38,0x6e,0x77,0x5f,0xba,0xe2,0x61,0x29,0x57, + 0x2c,0xac,0x31,0x25,0xb,0x4a,0xc0,0xd9,0x4c,0x99,0x62,0x88,0xd3,0x2,0x1b,0x3d, + 0x1c,0x5a,0xc4,0x7b,0x5e,0x31,0x84,0x6b,0xe7,0xe7,0xf0,0xf6,0xe5,0x53,0xa8,0x54, + 0x2a,0x2f,0x7d,0x5f,0xc2,0xe7,0x1e,0x3f,0xdf,0xc2,0x7,0x9f,0xde,0xc3,0xfa,0xf6, + 0x41,0x99,0x2c,0xa7,0x88,0x3e,0x21,0xdf,0x2b,0x89,0xe9,0x20,0x83,0x21,0x4e,0xcf, + 0x8e,0xe1,0x5f,0xfe,0xf0,0x35,0xfc,0xfe,0xdb,0xe7,0x71,0xe3,0xe2,0xbc,0xa,0x57, + 0x51,0x31,0xd,0xaf,0x20,0x4f,0x23,0x22,0x3c,0x58,0xd9,0xc2,0xff,0xf2,0x9f,0x3f, + 0xb3,0x1f,0x7e,0xf5,0x90,0x97,0xd6,0x76,0x3d,0x46,0xef,0x5f,0x2f,0x6b,0xd9,0xe1, + 0xec,0x96,0xa3,0x52,0xce,0xaf,0x6c,0xa2,0x5c,0x31,0x6,0x93,0xc4,0xf8,0xf9,0x24, + 0x19,0x61,0x62,0x81,0xd0,0xe8,0x2,0xce,0x19,0x29,0x90,0x23,0x1d,0x5b,0xc,0x5e, + 0x26,0x26,0xb1,0xe9,0x89,0x32,0x15,0x7d,0x2a,0x49,0x6e,0xa2,0xcc,0xa0,0x2d,0x20, + 0xd6,0x51,0x65,0x16,0xcd,0xc1,0x8,0x55,0x2e,0x13,0xfe,0x73,0xbe,0xfe,0xa6,0x82, + 0x99,0x9b,0x36,0xae,0xcb,0xe2,0x33,0x73,0xa,0x50,0x61,0x72,0x28,0x28,0xf7,0x5, + 0xa,0x29,0xf2,0xc2,0xc4,0xc1,0x4c,0x99,0x66,0x5b,0x6,0xa3,0x73,0x20,0x3a,0x4b, + 0xa6,0xa0,0x21,0xd2,0xc4,0x3d,0xa1,0xa9,0x91,0x24,0xf7,0xa8,0xad,0xf2,0xac,0x74, + 0xa3,0x27,0x70,0x57,0x63,0xbd,0xc7,0xb8,0x64,0x62,0x83,0xa2,0x76,0x9a,0xc4,0xa4, + 0x1f,0xa,0x1e,0xc7,0xfd,0xb9,0x49,0x50,0x7c,0x4e,0x5c,0x2b,0x70,0x5,0x42,0x71, + 0x37,0xa2,0x79,0x4a,0xfd,0x9d,0x2d,0x43,0x63,0x48,0x13,0x53,0x20,0xf2,0xda,0xb3, + 0x51,0xce,0x4f,0xda,0xee,0xe7,0x43,0xfa,0x6a,0x55,0xd2,0x45,0xe9,0x77,0x72,0xac, + 0x7c,0x83,0x8d,0x36,0x6f,0x54,0x2,0xc6,0x80,0xb7,0x1b,0x29,0x5d,0xf6,0x5c,0x22, + 0xaa,0x90,0xba,0x99,0x41,0x99,0xd3,0x0,0xe9,0x19,0x90,0x85,0x27,0x3c,0x55,0xc4, + 0x62,0x97,0x92,0x43,0x5c,0x2c,0x28,0x86,0xa,0xb,0xa9,0x38,0xb8,0x9b,0x78,0xcf, + 0xb4,0xbb,0x8c,0x5b,0xf,0x56,0xf8,0xec,0xdc,0x38,0xce,0xcd,0x8d,0xd1,0xcb,0xa2, + 0x25,0xc3,0x61,0x32,0x32,0xd8,0x87,0x37,0xce,0xcd,0xe1,0xbf,0xff,0x93,0xef,0xe1, + 0x6f,0x3e,0xbe,0x83,0xbf,0xfe,0xf8,0x2e,0xda,0xed,0x4e,0xd1,0x66,0x58,0x5d,0x9b, + 0x5c,0xe8,0x56,0x48,0xde,0x48,0xc9,0xd4,0xb,0x5,0x1f,0x68,0xc1,0x77,0x70,0xcd, + 0x93,0xf8,0x1d,0xa6,0xe4,0x8e,0x93,0x8a,0x3f,0x65,0x25,0x16,0xf3,0x9e,0x5,0xd, + 0x51,0xfa,0x4c,0x27,0xc2,0x23,0xc5,0xa9,0x3c,0x2c,0xa8,0x35,0xc1,0x29,0xbe,0xbd, + 0xe9,0xba,0xf,0x4c,0x13,0x4d,0x98,0x35,0x89,0xdc,0xe8,0xff,0x4e,0xf3,0x53,0xfb, + 0xd5,0x81,0xf3,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x23,0xf4,0xce,0x6b,0xb, + 0x34,0xea,0x75,0xf3,0xbd,0xa,0x9c,0xdc,0x8d,0xae,0xed,0x1c,0xe0,0xa3,0x5b,0x4f, + 0xf0,0xf0,0xf9,0x8e,0xe8,0x5a,0x39,0x45,0x1e,0x89,0x75,0x3e,0x9c,0xfd,0x5b,0x98, + 0x96,0xd8,0x9f,0x6c,0x1c,0xe8,0xa4,0x89,0xb0,0xe6,0xcd,0x34,0x29,0x13,0x77,0x85, + 0x62,0x6a,0x84,0x2e,0x87,0xa8,0xe8,0xc5,0x99,0x65,0x15,0x45,0x21,0x6,0x5,0xde, + 0x8a,0xf0,0x6a,0x20,0x83,0x5a,0xb5,0x82,0x7a,0xed,0xe5,0x5a,0x7b,0x0,0xe8,0x74, + 0xbb,0xd8,0x3f,0x6a,0xa3,0x75,0xd2,0xd5,0x36,0xcf,0xe2,0xf7,0x28,0xde,0x46,0xbe, + 0x6b,0x55,0xab,0xf,0x2e,0x49,0xb7,0x12,0xc8,0x27,0x18,0x15,0x63,0xf0,0xda,0xe9, + 0x69,0x5c,0x3b,0x37,0x8b,0x7a,0x95,0x5e,0xda,0x64,0x31,0x33,0xba,0xdd,0x2e,0x1e, + 0x2c,0x6f,0xe1,0xcb,0x7b,0xcb,0xd8,0x3e,0x3c,0x2e,0x38,0xc4,0x94,0xa5,0xa9,0x15, + 0x6d,0x8d,0x49,0xf9,0x9c,0xf4,0x35,0xaa,0x78,0xfd,0xec,0x2c,0xde,0xbe,0x3c,0x8f, + 0x6b,0xe7,0x66,0x70,0xf1,0xd4,0x4,0x4e,0xf9,0xf8,0xe2,0xdc,0xfd,0xb0,0x97,0x9e, + 0x3f,0xff,0xd8,0xea,0xd6,0x3e,0x3e,0xfc,0xea,0x21,0xff,0xe2,0x8b,0x87,0xfc,0xc9, + 0xb7,0x4f,0x78,0x79,0x63,0x4f,0x23,0x3a,0x9e,0x95,0x1e,0x98,0xec,0x89,0x99,0xce, + 0xec,0x67,0xce,0xb8,0x43,0xf,0xff,0x8b,0x1f,0x83,0x61,0x27,0xe7,0xc,0x96,0x22, + 0x4,0xee,0x5a,0xff,0x39,0xcf,0xb2,0x33,0x41,0xfa,0x23,0x10,0x6a,0xd6,0xe1,0x86, + 0x72,0xdd,0x56,0xac,0x9f,0xd4,0xa3,0xf,0xd3,0x23,0x61,0x44,0xd1,0xc,0x65,0x21, + 0x68,0xee,0x7a,0xa9,0xca,0xd8,0x4f,0xbd,0x94,0x27,0x15,0xbe,0x6e,0xe2,0xce,0x8e, + 0xb,0x72,0x1d,0x15,0xd9,0x59,0xec,0x86,0x63,0xd6,0x58,0x94,0x37,0xc8,0x7a,0xc, + 0x2a,0xa0,0x7b,0x2c,0x8b,0x3b,0x65,0xa4,0x21,0xd5,0xc8,0x66,0x6e,0x38,0x62,0x12, + 0x97,0x2e,0xee,0x6a,0xd,0x6f,0x48,0xee,0xc3,0x53,0xe4,0x88,0x30,0x36,0x9,0xfb, + 0x59,0x3f,0x90,0x53,0xc8,0x88,0x44,0xf2,0xcc,0x8a,0x2b,0xf6,0x50,0x67,0x38,0x4a, + 0x7e,0x82,0x4f,0x9a,0x89,0xe9,0xed,0xa4,0x21,0xbe,0x82,0x8f,0x5b,0x1e,0xcb,0xea, + 0xf0,0x51,0x83,0xcc,0xea,0x47,0xf4,0x6f,0x7a,0xbc,0x33,0x65,0x4,0x45,0x94,0x10, + 0xac,0x85,0x74,0xd2,0x5d,0xce,0xcc,0x9a,0x14,0x21,0xdf,0xf,0xcb,0xe5,0xdc,0x6, + 0x35,0x73,0x93,0x30,0x43,0xf0,0x1c,0x10,0x56,0x5c,0x68,0xf9,0x0,0x49,0xb,0x57, + 0xd2,0x8a,0x41,0x66,0xd6,0x32,0x9,0x2e,0x24,0x91,0x49,0xdb,0x91,0xf0,0xc6,0xf9, + 0x0,0x10,0x99,0xc8,0x96,0x27,0xf6,0x24,0x72,0x76,0xb7,0x6b,0xf1,0xed,0xa3,0x35, + 0x9c,0x3b,0xb5,0x8a,0x9f,0xbc,0x7d,0x1,0x3,0x7d,0xf5,0x82,0x36,0xb8,0x8c,0x2d, + 0x4b,0x44,0x98,0x1c,0x1d,0xc0,0x1f,0x7e,0xef,0x32,0x6,0xfa,0xea,0xd8,0x39,0x68, + 0xe1,0x9b,0xc7,0x6b,0xd8,0xde,0x39,0x84,0x2d,0x75,0x14,0xa6,0xf2,0xbf,0x1b,0x14, + 0xac,0x8d,0x23,0x99,0xc3,0x10,0xb4,0xff,0xa5,0xbc,0x31,0xa2,0x98,0x3c,0x39,0xdb, + 0x32,0x40,0xb0,0x1a,0x4,0x89,0x13,0x9d,0x74,0x36,0x33,0xe5,0x47,0x85,0x47,0x53, + 0x22,0x13,0x3c,0x51,0x6b,0x54,0x9a,0x0,0x93,0x6a,0xb5,0xd2,0x2b,0x4a,0xb1,0xd1, + 0x75,0x9c,0x5,0x83,0x10,0x51,0xa1,0xbe,0x8,0x0,0xe6,0xa7,0x46,0x70,0x79,0x71, + 0xa,0x83,0x7d,0xf5,0xd2,0xc3,0x59,0x1e,0xcc,0xd6,0x5a,0x1c,0x1c,0x9d,0xe0,0xc1, + 0xf2,0x6,0x3f,0x5c,0xde,0xe4,0x8e,0xb5,0xa2,0x6d,0xa4,0x48,0xfc,0xf0,0xdd,0x18, + 0xfb,0x63,0x95,0x3d,0xd2,0xc0,0xfe,0x25,0x89,0xc,0x78,0x75,0xe3,0xf9,0x3,0x5d, + 0x1d,0x98,0xe1,0x21,0x1b,0x71,0xea,0x51,0x26,0xb,0x21,0xea,0x41,0xcd,0x26,0x81, + 0x8c,0x49,0x12,0xaa,0xfb,0xd6,0xc1,0xbe,0x3e,0x8c,0xc,0x34,0x51,0xa9,0xf4,0xe6, + 0x6b,0xc4,0xdd,0x74,0xa7,0x8b,0xd5,0xed,0x7d,0xec,0x7a,0xb,0x55,0xca,0xe6,0x33, + 0xbd,0x72,0xc8,0xa2,0x13,0xb2,0xf3,0xb2,0xd4,0x6a,0x4d,0x7d,0x2f,0x61,0x6a,0x74, + 0x10,0x8b,0xb3,0x23,0x18,0x13,0x4d,0x56,0xaf,0x49,0xd7,0x85,0xfd,0x74,0xf0,0x78, + 0x75,0x7,0xf7,0x9e,0x6d,0x38,0x69,0x5d,0xc6,0xa8,0xe7,0x8c,0xce,0xa9,0x56,0x19, + 0xd9,0xdf,0xab,0xd5,0xa,0xfa,0x1b,0x35,0xf4,0x37,0xab,0xb8,0xb2,0x38,0x85,0x1f, + 0x5c,0x3b,0x83,0x9f,0xbc,0x7d,0xe,0x17,0x4e,0x4d,0x16,0x82,0x7b,0xca,0xa0,0xf4, + 0x9c,0xdd,0x1e,0xbe,0xe6,0xa0,0x75,0x82,0x67,0xeb,0x3b,0xb8,0x79,0x6f,0x99,0xff, + 0xf2,0xe7,0xb7,0xf8,0xb7,0xb7,0x9e,0xb0,0xb5,0x96,0x39,0xa6,0xa,0x7a,0x5a,0x88, + 0x33,0xfa,0x67,0x61,0x93,0x12,0x4c,0x59,0xd9,0x8f,0xb7,0x42,0xa3,0x1e,0xbc,0xd2, + 0x2,0x1a,0xc4,0x21,0x2e,0x83,0xfd,0x6a,0x85,0x9d,0xca,0xc3,0x22,0xb,0xfb,0xe4, + 0x8,0xe1,0xc0,0x4a,0xb,0x26,0x8e,0xdd,0xb0,0x70,0x8f,0xd4,0x5e,0x9a,0x5,0x56, + 0x41,0x36,0x1c,0xa7,0xb5,0x4b,0xd1,0x2b,0x38,0x7d,0x7d,0x35,0xdd,0x34,0x48,0x16, + 0x74,0xc1,0xdd,0xcc,0x18,0xc1,0xa4,0x23,0xd,0x37,0x82,0xb,0xce,0x3f,0x54,0x48, + 0xca,0x96,0x7c,0x5b,0x52,0x11,0x2d,0x39,0xa5,0x93,0x4a,0xe4,0xd,0xda,0x4a,0x96, + 0x4b,0x28,0x5a,0xfa,0x3,0x61,0x52,0x90,0x73,0x93,0x4,0x34,0x5d,0x30,0x49,0x18, + 0x31,0xa2,0x3b,0x49,0x4,0x17,0x7d,0x49,0xf6,0xc5,0xdb,0xb,0xa1,0x42,0x82,0x94, + 0xd8,0x9d,0x27,0x77,0xc8,0x8,0xf7,0xfa,0xda,0x62,0x28,0xdd,0x5e,0x26,0x0,0x77, + 0x24,0x5f,0x17,0xa7,0xb5,0x62,0x21,0x1,0xe2,0x2,0x3f,0x81,0x39,0x1a,0xe8,0xeb, + 0x1d,0x39,0x67,0x3,0x69,0xf9,0xda,0x56,0xab,0xc7,0x25,0x14,0x2a,0x16,0x10,0x14, + 0x96,0x7e,0x8,0x4f,0x83,0x33,0x13,0xa7,0x2a,0x2,0xe9,0x83,0xe5,0x16,0x43,0xb6, + 0x6e,0x81,0x1b,0x5f,0xa1,0x6c,0xb5,0x90,0x42,0x57,0x22,0x54,0xad,0xba,0x33,0x2e, + 0x34,0x83,0x1e,0xb8,0x8c,0x7b,0x42,0x87,0x88,0x84,0x36,0xc9,0x63,0xaf,0x89,0xa0, + 0x48,0x85,0xa9,0x5c,0x61,0xb4,0xe9,0x51,0x74,0x19,0x78,0xb2,0xba,0xcd,0xb7,0x1f, + 0xad,0x61,0x75,0x6b,0x9f,0xce,0xf7,0x4f,0xc4,0xe7,0x9f,0x67,0x6e,0xe7,0x85,0x86, + 0x99,0xd1,0xd7,0xa8,0xe1,0xfd,0xab,0xa7,0x31,0x3b,0x3e,0x8c,0xff,0xfd,0xc3,0x6f, + 0xf0,0x9f,0x7e,0x7d,0x1b,0x4f,0xd7,0xb6,0x4b,0x56,0x4d,0x10,0x8e,0xf,0xd9,0xd8, + 0x62,0x4a,0x18,0x74,0xa1,0xe5,0x34,0xe2,0x7b,0x2,0x3,0xca,0x88,0x35,0x57,0x89, + 0xa7,0x3f,0x95,0xb8,0x80,0x15,0xb8,0x95,0x32,0x99,0xc4,0xb0,0xce,0x99,0xc8,0x5e, + 0x7e,0xca,0xb6,0xfa,0x69,0x33,0x48,0x9a,0xcb,0x2e,0x9b,0xb5,0x38,0xa9,0xba,0x66, + 0xce,0xf5,0x27,0xee,0x7,0xf,0xf,0x34,0x31,0x37,0x31,0x8c,0x69,0x6f,0x5a,0xf2, + 0x32,0x98,0xb4,0xdb,0xb5,0xf8,0xec,0xee,0x12,0x3e,0xfd,0x76,0x9,0xed,0x8e,0x8d, + 0x6f,0x63,0x6a,0x3b,0xa2,0xdc,0x86,0x83,0xf4,0xc4,0x8f,0x55,0x69,0xd2,0xa,0x7c, + 0x77,0xe1,0x70,0x2c,0x41,0x40,0x9d,0x40,0x2d,0x88,0x1e,0x49,0xcf,0x87,0x60,0x85, + 0xc7,0x92,0x75,0x43,0x62,0x3,0x4c,0x22,0x2a,0x43,0xbd,0x1a,0xe1,0xcb,0xc,0x4f, + 0x8c,0xf6,0xd3,0xe4,0xc8,0x0,0x2a,0x3d,0xa0,0x62,0x59,0xe4,0xdb,0x1d,0x8b,0xc7, + 0xcf,0xb7,0xb1,0xb9,0x7b,0x98,0xf6,0xf3,0xdc,0x63,0x2f,0x2d,0xed,0x41,0x65,0x7a, + 0xa2,0x56,0xb,0xa,0x98,0x4c,0x5f,0x6e,0x53,0x23,0x3,0xb8,0x7e,0x71,0x1e,0x13, + 0xc3,0xfd,0x2f,0x9c,0x80,0xe5,0xc7,0x77,0xe,0x8e,0xf1,0x8b,0x2f,0x1e,0xe0,0x9b, + 0x47,0xeb,0x6e,0x35,0x97,0xe9,0xaa,0x88,0x72,0xd2,0xad,0xb8,0xa8,0x4,0x1,0x87, + 0x88,0x71,0x76,0x6e,0xc,0xdf,0x7b,0x6d,0x1,0x3f,0x7c,0xe3,0xc,0xce,0xcd,0x8d, + 0x61,0x72,0x64,0x0,0x83,0xcd,0x5a,0x61,0xe2,0x7e,0x55,0x8e,0xb,0x0,0x1c,0x1e, + 0x9f,0xe0,0xef,0x3e,0xbd,0xc7,0x7f,0xff,0xf9,0x7d,0xfe,0xe8,0xd6,0x63,0xde,0xdc, + 0x3d,0x82,0xf5,0x90,0x79,0xf2,0xd5,0x40,0x9c,0xc2,0x3,0x5,0x8a,0x3d,0xa2,0xe3, + 0x4b,0xb,0x33,0x47,0x67,0x76,0x3f,0xa5,0x3b,0xf7,0x6,0x2,0xb1,0xb5,0x22,0x7e, + 0xc1,0x4d,0xb8,0xec,0x12,0x55,0xbb,0x4c,0x8,0x4d,0x42,0x88,0x2e,0xc,0xe6,0x47, + 0x96,0xbd,0x8c,0x57,0xe0,0xd6,0xac,0x58,0x81,0x92,0xb,0x91,0x5c,0x3c,0x65,0x31, + 0x37,0x4a,0x72,0x29,0x51,0x8f,0x32,0xee,0x54,0x90,0xc7,0x55,0x63,0xa6,0xb7,0x94, + 0x7c,0xab,0xe0,0x2c,0xa3,0xa5,0x6c,0x8a,0x8,0x23,0xa2,0x56,0x23,0x3c,0xa4,0x95, + 0xf0,0xc4,0x54,0x70,0x9d,0x2b,0x10,0x69,0xb4,0x18,0x4b,0x6d,0x9a,0x55,0x5e,0x4a, + 0x96,0x3,0xa5,0xa0,0x66,0x88,0x9d,0xb8,0x1e,0xdf,0xd3,0x38,0x6e,0x42,0x26,0x85, + 0xa1,0x24,0x95,0x4a,0x3b,0xf1,0x8a,0x9f,0x48,0x7c,0x30,0x88,0x49,0x70,0xbb,0x1b, + 0x15,0x3,0x45,0x1,0xc6,0x50,0x1c,0x76,0x4d,0x70,0x6d,0x37,0x71,0x65,0x1d,0xa7, + 0x75,0xca,0x37,0x5b,0x9e,0xde,0x60,0x4c,0x46,0xa4,0x2a,0x4e,0x8a,0x1,0x1b,0xa6, + 0x1e,0x70,0x56,0x8e,0x81,0x8,0xba,0x5d,0x49,0x58,0x86,0x9c,0xc,0x84,0x74,0x91, + 0x2b,0x9c,0x95,0x7f,0xd6,0xeb,0x9a,0xa,0xb4,0xd7,0x3f,0x4,0x43,0x3f,0x9d,0xed, + 0xc6,0x4,0x36,0x11,0xc5,0x41,0x8a,0x84,0x9d,0x2e,0x15,0xfa,0xab,0x4,0xc3,0xb3, + 0x98,0x5,0xf3,0xc2,0x92,0x82,0xb7,0x13,0xc1,0x4e,0x4a,0x2f,0xa2,0x5c,0x8a,0xd5, + 0x6e,0x29,0xb2,0xeb,0x92,0x69,0x83,0xc1,0xc3,0x95,0x4d,0xfc,0xfc,0xcb,0x7,0x5c, + 0xa9,0x10,0x9d,0x9e,0x19,0xeb,0x79,0x60,0xe4,0x6,0x20,0xcc,0x8c,0x81,0xbe,0x3a, + 0x5e,0x3f,0x37,0x83,0x93,0x4e,0x17,0xfd,0xcd,0x3a,0x6e,0xde,0x5f,0xc6,0xbd,0xa7, + 0x1b,0x58,0xde,0xdc,0x43,0xbb,0xd3,0xcd,0xa6,0xa3,0x62,0xfe,0xd,0xca,0x98,0xab, + 0x25,0x3a,0x96,0xb2,0x78,0x45,0x29,0xdf,0xf7,0x10,0x71,0x21,0xb3,0x27,0xec,0xc2, + 0x39,0x1b,0xe1,0xfc,0xe1,0x25,0x13,0x9b,0x3,0x99,0xc7,0x83,0x33,0xe4,0x78,0x64, + 0x16,0xea,0x64,0x17,0xcb,0x15,0x21,0xd9,0xc,0x93,0x5b,0x48,0x56,0xf3,0x11,0xb5, + 0xe1,0x75,0xab,0xb8,0xa,0x37,0xd0,0xac,0xd1,0xc5,0xc5,0x49,0x9c,0x9a,0x1a,0x29, + 0xd5,0x7,0x97,0xfd,0xe9,0x58,0xc6,0x97,0x77,0x56,0xf8,0xb3,0x3b,0xcb,0xdc,0x8d, + 0x9a,0xf4,0x4,0xad,0x53,0x68,0x7a,0x52,0xac,0xa8,0x23,0xc0,0xf9,0x3,0x16,0x86, + 0x99,0xa3,0x6f,0xb6,0xe5,0xb8,0xf5,0xe2,0xc2,0x66,0xcf,0x95,0x45,0x3f,0xa7,0xb9, + 0x79,0x22,0x2a,0x34,0x64,0xe4,0x32,0x27,0x67,0xc3,0x2,0x49,0x37,0xb9,0x92,0x92, + 0x26,0x2a,0x56,0xab,0x15,0xcc,0x8c,0xd,0x62,0x7a,0x6c,0xd0,0xfb,0xd1,0xbc,0x78, + 0xc5,0xb0,0xb2,0xb9,0x87,0xb5,0xed,0x7d,0x74,0xac,0x60,0x1e,0x11,0x95,0x2f,0xc0, + 0x33,0xb9,0xa4,0x41,0x51,0x83,0x6c,0x32,0x9c,0x54,0x2e,0xf5,0xa6,0xc7,0x6,0x71, + 0xe3,0xe2,0x5c,0xd4,0xc8,0xe7,0xc4,0xb7,0xb2,0xc7,0xb7,0xbd,0xdf,0xc2,0x6f,0xbf, + 0x7d,0x8a,0xfb,0xcf,0x36,0xf5,0x2f,0xa5,0x12,0xd4,0x42,0x6,0x93,0x30,0xa3,0x56, + 0x33,0x98,0x19,0x1f,0xc2,0xec,0xf8,0x10,0xe6,0x27,0x86,0x71,0xe5,0xf4,0x24,0xae, + 0x9d,0x9d,0xc1,0xf5,0xb,0xb3,0x18,0xf0,0xa8,0x4d,0x59,0x4e,0x7b,0x19,0x61,0x32, + 0xdf,0xe9,0xef,0x1f,0x1e,0xe3,0xe1,0xca,0x16,0x6e,0xde,0x5b,0xe1,0x5f,0xde,0x7c, + 0xc8,0x9f,0x7e,0xb7,0xc4,0x1b,0x3b,0x87,0xbe,0xed,0x8b,0xd5,0x80,0x7d,0xb,0x14, + 0xb2,0xd0,0x1c,0x74,0xee,0xaa,0x2d,0x13,0xb3,0x25,0xa2,0xc8,0x62,0x7,0x60,0xbd, + 0x9,0xb0,0x37,0xe1,0xf4,0xa1,0xaa,0x6,0xec,0xba,0x84,0x30,0xa5,0xbb,0x17,0x87, + 0x4,0x5f,0x27,0xd8,0x97,0xe5,0xaa,0x25,0x4a,0x53,0x72,0xec,0xd2,0xd3,0x31,0x2a, + 0x1c,0xe4,0xa,0xe6,0x6a,0x22,0x8c,0xc5,0x94,0x46,0x9d,0x95,0xcc,0xee,0x21,0x3e, + 0x95,0x48,0xec,0xfb,0x32,0x2d,0x77,0xb6,0xa0,0x95,0xec,0x5b,0x96,0xbe,0xb3,0x62, + 0xe0,0x4e,0xec,0x5c,0xb1,0x43,0x20,0x2a,0x4c,0x99,0xc5,0xa0,0x7b,0xf9,0xf0,0x62, + 0x6e,0x44,0x89,0xdd,0x66,0xf6,0xdc,0xbd,0x4,0x4d,0xce,0xef,0x4c,0x4c,0x22,0x32, + 0x24,0xa6,0xd6,0xb3,0xdf,0x93,0x1b,0x5,0xa5,0x7,0xe8,0xb6,0x22,0x8a,0x79,0x80, + 0x16,0x89,0x60,0x60,0x1c,0x7c,0x9e,0x52,0xba,0xa3,0x83,0x21,0x85,0xc2,0xee,0x27, + 0x47,0x91,0xdb,0xa9,0x9,0x5e,0x42,0xa3,0xc5,0x2c,0xf0,0x7f,0x56,0x7a,0x7f,0x65, + 0xfa,0x11,0xe0,0x26,0x71,0xc5,0xe7,0xda,0xe5,0xa2,0x60,0xa2,0x87,0xfe,0x53,0x7e, + 0xd,0xe9,0x40,0x5c,0x72,0x62,0x4c,0x21,0x48,0xe3,0xcc,0x17,0x5b,0x2b,0xe,0x74, + 0x87,0x95,0x88,0x6f,0xc2,0x7c,0x25,0xf4,0x74,0xee,0x5f,0xa1,0x43,0x54,0x4,0xd, + 0x23,0x61,0x78,0xe4,0xce,0x3,0x5c,0x4c,0xb7,0xcd,0x46,0x80,0x28,0x8e,0x16,0xba, + 0x67,0x3f,0x9f,0x18,0x29,0x82,0x4b,0x27,0xdb,0xea,0xf6,0x1,0xfe,0xfd,0x2f,0x6f, + 0xf1,0xc4,0x70,0x3f,0xce,0xcc,0x8e,0x93,0xc,0x1,0x79,0xd9,0x24,0x10,0xde,0x86, + 0x37,0x2f,0xce,0xe1,0xca,0x99,0x29,0xdc,0xbc,0xb7,0x82,0x5f,0xdc,0x7c,0x88,0xf, + 0x3e,0xb9,0x8b,0xc7,0xcf,0xb7,0x71,0x78,0xdc,0xc9,0x90,0xa7,0x30,0x41,0x73,0x16, + 0x87,0x9a,0xa7,0x45,0x67,0xa8,0x93,0xec,0x77,0xf2,0x17,0x47,0x2a,0xf,0xa3,0xa6, + 0x42,0x92,0x3d,0x3d,0xc7,0x5b,0xb8,0xa,0x22,0x5e,0xf8,0x16,0x11,0x30,0xb2,0xc6, + 0x77,0x0,0x51,0xa4,0xc1,0xa8,0xc8,0x7e,0x33,0x8f,0x8e,0x11,0x4a,0x83,0xe8,0x27, + 0x60,0x22,0x99,0x35,0x67,0xf5,0xd,0xd,0x34,0xf1,0xd6,0xa5,0x39,0x9a,0x9f,0x1c, + 0xa6,0x5e,0x39,0xe1,0xf2,0x80,0x66,0x66,0xec,0x1d,0x1e,0xe3,0xd6,0xa3,0xe7,0xb8, + 0xbf,0xbc,0x11,0xf9,0x24,0xc,0x99,0xcb,0x99,0xa6,0x70,0xe,0xb1,0xf,0x94,0x18, + 0x1f,0x6e,0x6a,0x42,0xf4,0xdd,0x26,0x39,0xa4,0xc6,0x6f,0x77,0x63,0xbd,0x21,0xcf, + 0x6c,0x22,0xed,0x98,0xec,0x8f,0xd,0x61,0x14,0x15,0x18,0xfb,0xb2,0x33,0xa4,0x88, + 0xb8,0x28,0x53,0x69,0xdf,0xdb,0x8e,0xe,0x36,0x31,0x3d,0x3e,0x88,0xc1,0x17,0x30, + 0xc8,0x89,0x8,0x9d,0x4e,0x7,0x4f,0xd6,0x76,0xf1,0xdd,0x93,0x75,0xec,0x1e,0x9e, + 0x40,0x27,0xad,0x94,0xde,0xb5,0x45,0x49,0x1b,0x65,0x3a,0x66,0x92,0x24,0x59,0x28, + 0x4f,0x75,0x0,0x98,0x9d,0x18,0xc6,0xf5,0xf3,0xb3,0x18,0x1d,0xe8,0x2b,0x14,0xc8, + 0x32,0x86,0x3b,0x33,0x63,0x79,0x63,0x17,0xdf,0x3c,0x5e,0xc3,0xde,0x51,0x3b,0xc5, + 0x78,0xaa,0xf7,0x52,0xc2,0x49,0x89,0xac,0x55,0xaf,0x57,0xb0,0x38,0x3d,0x82,0x1f, + 0x5c,0x3b,0x8d,0xdf,0x79,0xe3,0xc,0x6e,0x5c,0x9c,0xc3,0x48,0x7f,0x23,0x32,0xd7, + 0x15,0xf,0xf9,0x25,0xe,0x75,0x39,0xff,0x62,0xef,0xe0,0x18,0x77,0x9f,0xad,0xe3, + 0x7f,0xfb,0xe0,0x2b,0xfe,0xbb,0xcf,0xef,0xdb,0xcd,0x9d,0x43,0x74,0x39,0x7a,0x27, + 0x25,0xde,0x85,0xe7,0x54,0x70,0x84,0xd2,0x5d,0x3,0xe8,0xaf,0x16,0xcf,0x19,0x65, + 0x76,0x92,0x4d,0xa,0x45,0xdf,0x46,0x8,0xde,0xc9,0x77,0x93,0xb4,0xcd,0x2d,0xda, + 0x98,0xc4,0x2f,0x71,0x1c,0x6d,0x83,0xb8,0x49,0xf,0x6f,0x8e,0xb1,0x2a,0x4a,0x47, + 0xda,0x32,0x92,0xe8,0xc8,0x88,0x65,0x2e,0x3a,0x94,0xbf,0x4a,0xd0,0x41,0xb,0x8b, + 0x81,0xa2,0xba,0x41,0x62,0x30,0xfe,0x12,0xad,0x92,0xd1,0x3f,0x91,0x24,0xc6,0x1f, + 0xf7,0x9f,0xc2,0xb4,0x44,0x25,0x6f,0xa,0x5f,0xf5,0x58,0xda,0x34,0x6,0x48,0xe5, + 0x2b,0x21,0x2d,0xff,0x29,0xcb,0x39,0xcf,0x2c,0x2a,0xf3,0x76,0x50,0x1c,0x37,0x62, + 0xa3,0x9b,0xc0,0xb2,0x24,0x3b,0xb,0x93,0x9d,0x21,0x13,0xaf,0x22,0x26,0x13,0x8a, + 0x31,0x79,0x8b,0x51,0x37,0x55,0x1b,0x4a,0xcc,0xf6,0x24,0x81,0xa,0x41,0x21,0x2a, + 0xaa,0x33,0xe5,0xb0,0x85,0xd3,0xce,0x21,0xe5,0x26,0xc,0x85,0x1a,0x10,0x8e,0xf4, + 0x3d,0x93,0x6c,0xbd,0x3,0xd4,0x22,0xea,0x3f,0x33,0x79,0x89,0xbc,0xd4,0xbb,0x16, + 0xb5,0x8d,0xba,0x0,0x72,0xa1,0xa4,0x53,0x11,0xe3,0x15,0xff,0xdf,0x72,0x54,0x21, + 0xc4,0x89,0x3d,0xc6,0xed,0x25,0xf9,0x92,0x2a,0x4e,0xca,0x6c,0x4b,0xa5,0xf1,0x12, + 0xb1,0x18,0xe9,0xa2,0xff,0x6,0x4c,0x81,0xc6,0x29,0x1c,0x6b,0x33,0xa8,0x81,0x4a, + 0x44,0x9a,0xd1,0x8,0x36,0xfe,0x62,0x43,0x49,0xcb,0x20,0x44,0x73,0xf1,0xae,0xf, + 0xcd,0xa6,0x91,0xb,0xa,0x26,0x2,0xb5,0xda,0x1d,0xbe,0xf3,0x64,0x83,0x7e,0xfd, + 0xd5,0x63,0xcc,0x4d,0xe,0xe3,0xcd,0xf3,0xb3,0x2a,0xf6,0xf2,0x45,0xbe,0xd0,0xf2, + 0x4f,0xa3,0x56,0xc5,0xd5,0x33,0xd3,0x18,0x1d,0xea,0xc3,0x8d,0x8b,0x73,0x78,0xf2, + 0x7c,0x1b,0x8f,0x56,0xb6,0xf1,0xe8,0xf9,0x36,0x9e,0xae,0xed,0x60,0x79,0x63,0xf, + 0xc7,0x9e,0x3c,0x47,0x7a,0xe1,0x59,0x32,0x9b,0x53,0x71,0x75,0x1e,0xc1,0x25,0x2e, + 0xc4,0xd3,0xca,0x43,0x33,0x67,0x26,0x51,0x64,0xd4,0x7,0x9a,0x22,0x53,0x14,0x9c, + 0x53,0x85,0x5c,0xa0,0x4,0xb1,0xf3,0x71,0xf0,0x4b,0xc,0xe,0xab,0x2c,0xef,0x4c, + 0x64,0x98,0x62,0x0,0x84,0x30,0xfa,0x53,0x8b,0x67,0xe3,0xe9,0x60,0x54,0x21,0x75, + 0x93,0x7b,0x74,0x7e,0xa0,0x59,0xc7,0x9b,0x17,0xe6,0xe3,0x84,0xde,0x8b,0xd4,0x14, + 0x8a,0xf9,0xd6,0x5e,0xb,0x37,0xef,0xaf,0x60,0x75,0xeb,0xc0,0xc1,0x86,0x2a,0x29, + 0x45,0xd8,0xb7,0x4a,0xa2,0x9e,0xf3,0x74,0x47,0x88,0x55,0xe1,0x84,0x9a,0x7b,0x23, + 0xc4,0x30,0xa7,0x85,0xdf,0xe5,0xae,0x7,0x36,0xc9,0x10,0x4e,0xea,0xcd,0x52,0xd8, + 0x94,0xc0,0x48,0x21,0x15,0xb0,0x4,0xce,0x41,0x4f,0xe1,0xc9,0xd,0x6,0x46,0x86, + 0xfa,0x70,0xed,0xdc,0x2c,0x4d,0xf8,0x34,0xbf,0xdc,0xf3,0x40,0x5e,0x4b,0x95,0x4a, + 0x5,0x37,0xef,0xad,0xe0,0xd3,0xef,0x9e,0xe1,0xb8,0xdd,0x4d,0x11,0xa8,0x8a,0x6e, + 0x58,0xb2,0x12,0x2f,0xc1,0xe8,0x8,0x7a,0x32,0x2e,0x1,0x29,0x1,0x0,0x33,0xe3, + 0x83,0xb8,0xb4,0x30,0x81,0xc1,0xfe,0xfa,0xb,0xb,0x79,0xf8,0xdc,0xed,0xc7,0xeb, + 0xf8,0xfc,0xce,0x32,0xf6,0xf,0xdb,0x51,0x6,0xab,0x42,0xbb,0x2,0xc4,0xe1,0x1f, + 0x4a,0x5f,0xa3,0x86,0x73,0x73,0x63,0x78,0xed,0xf4,0x14,0x2e,0x2d,0x4c,0xe2,0xf4, + 0xec,0x8,0x66,0xc7,0x86,0x30,0x33,0x3e,0x88,0x89,0xe1,0xfe,0xd2,0xe9,0x3b,0xdf, + 0x93,0xe7,0x51,0xb3,0x72,0x82,0xdf,0xda,0x3b,0xc2,0xa7,0x77,0x9e,0xf1,0xcd,0xbb, + 0xcb,0xf8,0xfa,0xe1,0x1a,0x7f,0xf7,0x64,0x8d,0xd7,0x77,0xe,0x3d,0xc7,0x94,0x52, + 0xe8,0x5e,0x78,0x2a,0x5e,0x5b,0xee,0xfe,0x2f,0x14,0x77,0xb2,0xfe,0x15,0xf1,0x53, + 0x3a,0x2c,0x18,0xd6,0x26,0x6b,0x25,0xf6,0xd6,0x4b,0x9c,0xf2,0xc2,0x2c,0x5b,0xd7, + 0xa,0x2,0xb0,0x6c,0x61,0x18,0x64,0xd9,0xa9,0xad,0x98,0x11,0xec,0xe,0xac,0x5f, + 0xad,0x79,0xb8,0x5d,0x6e,0xfe,0xa2,0xee,0xc4,0xa4,0x46,0x5f,0xba,0x60,0x13,0x97, + 0x10,0x1e,0xa5,0x9f,0x9a,0x28,0xc1,0xf2,0xeb,0x19,0xa9,0x46,0x86,0x7b,0xa6,0xaa, + 0xfd,0x2b,0x95,0xc4,0x5b,0x97,0xb,0xca,0xba,0x9,0x96,0xcd,0xab,0x7b,0x73,0xa9, + 0x64,0xe7,0x9b,0x5b,0xaf,0x27,0xf9,0x49,0x3e,0xf9,0xa7,0x88,0x55,0x99,0xe,0x84, + 0xc2,0xc,0xa0,0x3d,0x63,0xf5,0x52,0x58,0x9a,0x86,0x5,0x1a,0xa0,0x89,0xbb,0x71, + 0xaf,0xae,0x71,0xf2,0x27,0xc9,0x9e,0xe,0x0,0x1a,0xb9,0xfc,0xc3,0x4,0xa3,0x27, + 0x99,0x4e,0x0,0xed,0x9d,0x35,0x19,0x94,0x9,0x2c,0x48,0x18,0x58,0x7,0x6b,0x52, + 0x13,0x47,0xcd,0x62,0xcb,0x2d,0x1d,0x93,0xb2,0x9e,0x25,0xb6,0xb,0x96,0x38,0xac, + 0x2,0xf4,0xfe,0x9c,0x32,0xaa,0x93,0x20,0x4f,0x70,0x96,0x37,0x4b,0x54,0x32,0xaf, + 0x5b,0xaf,0xfe,0x74,0x27,0xa1,0x94,0x3b,0x93,0x72,0x99,0x9,0xb6,0x85,0xa1,0x51, + 0x4b,0xd2,0x9c,0xe4,0x2a,0x9a,0x45,0xa2,0x4a,0xd2,0x9f,0xdc,0xc8,0x94,0x21,0x6, + 0xc2,0x59,0x90,0x95,0xbc,0xa5,0x60,0x5,0x2c,0x8a,0x75,0xf0,0x89,0x4f,0xd,0x66, + 0xfa,0x32,0x13,0x65,0x24,0x44,0x49,0x9c,0x4c,0x42,0x1e,0x79,0xdc,0xee,0xf2,0xa7, + 0x77,0x96,0x30,0x34,0xd8,0x44,0x5f,0xbd,0x4a,0x57,0xcf,0xce,0x14,0x60,0xc6,0xfc, + 0x40,0x91,0x7,0x4d,0x38,0x80,0x6,0xfb,0x1b,0xb8,0xd4,0xdf,0xc0,0xa5,0x85,0x49, + 0x1c,0xb4,0x4e,0xf0,0x70,0x79,0x3,0xb7,0x1e,0xae,0xe1,0xee,0xd2,0x3a,0x1e,0x2e, + 0x6f,0xe1,0xf9,0xe6,0x3e,0x76,0xf,0x8f,0xd1,0xb5,0x16,0xb6,0xcb,0xe8,0x58,0x8b, + 0xae,0xb5,0xe8,0x76,0x19,0x96,0xfd,0xdf,0xbb,0x16,0xd6,0xa6,0xe6,0xac,0x48,0x58, + 0x16,0x1c,0x14,0x12,0xaa,0x8f,0x18,0x68,0x44,0x5,0xd7,0xba,0xc0,0x7f,0x61,0xe9, + 0x1f,0x4a,0x44,0x64,0x1d,0xab,0xd5,0xdd,0xaa,0x26,0x30,0x7d,0x43,0xee,0xa3,0xb7, + 0xb3,0xf6,0x12,0xcf,0xf0,0xfe,0x1a,0x16,0xcb,0x7f,0xe9,0xaf,0xaf,0xf6,0xe8,0xda, + 0xa9,0x9e,0x8,0xe3,0x23,0x3,0x74,0x71,0x61,0x82,0xa6,0x46,0x7,0x7a,0x92,0xe, + 0xe5,0x74,0xf6,0xf8,0xf9,0x16,0x7e,0xfb,0xcd,0x53,0x5e,0xdf,0x3d,0x64,0x49,0x22, + 0xf2,0xae,0x38,0x61,0x72,0xe6,0xa8,0xdd,0x8,0x82,0x22,0xb2,0x4e,0x72,0x44,0x9, + 0x8c,0x70,0x6,0x3a,0xe9,0xef,0xec,0x13,0xcf,0xa3,0x23,0xa4,0x83,0xb,0xf2,0x5b, + 0x92,0x35,0xe7,0x85,0x72,0xd3,0xa4,0x44,0xbb,0x9,0x81,0x1a,0x42,0x7d,0x12,0xb8, + 0x74,0x8b,0x33,0x23,0x78,0xff,0xea,0x22,0x26,0x47,0x6,0x7b,0x12,0xe1,0xc2,0xf3, + 0xdf,0x3f,0x6c,0xe3,0xeb,0x87,0xcf,0x71,0xf3,0xde,0x8a,0x37,0x3d,0x12,0x52,0x2d, + 0xc5,0x93,0xe6,0xb2,0x33,0x50,0xa0,0x9f,0x32,0x2e,0x82,0x91,0x3d,0xf4,0x78,0x5f, + 0x8c,0xd,0x35,0x31,0x3f,0x31,0x84,0x51,0x1f,0x6c,0x52,0x96,0xdb,0x2e,0xaf,0xfb, + 0x93,0x4e,0x7,0x5f,0xde,0x7f,0x8e,0x8f,0x6f,0x3f,0xf3,0x9c,0x6,0x28,0xb6,0x7a, + 0xf8,0xb9,0x7d,0x8d,0x1a,0x1a,0x15,0x83,0xf1,0xe1,0x3e,0x9c,0x99,0x1d,0xc3,0xf5, + 0xf3,0x33,0x78,0xfb,0xd2,0x29,0xbc,0x71,0x6e,0x3a,0xc2,0xea,0xf2,0xb9,0x97,0xc5, + 0xca,0xbe,0x28,0x2c,0xe9,0xa4,0xd3,0xc1,0xee,0x61,0x1b,0x5b,0xbb,0x47,0xf8,0xf6, + 0xf1,0x1a,0xff,0xed,0xa7,0xf7,0xf8,0x37,0xdf,0x3e,0xc5,0xfa,0xf6,0x41,0xa,0x58, + 0xf1,0xe5,0xd2,0x2b,0x10,0x43,0xca,0x3a,0x47,0xdf,0x2,0xe,0x26,0x32,0xb0,0xfe, + 0xa4,0xb5,0x4c,0x96,0x61,0xd9,0x7a,0x52,0x11,0x93,0x13,0x10,0x59,0x26,0x62,0xb2, + 0xcc,0xec,0x72,0xd5,0x7c,0x47,0x6c,0x98,0x60,0xa3,0xb4,0x8d,0xe0,0xa4,0x6f,0x30, + 0x81,0x37,0x4c,0x61,0x89,0x23,0x8a,0xb4,0xe6,0x42,0xa8,0x74,0x35,0x53,0x84,0x9a, + 0xd9,0x94,0x34,0xf5,0x2a,0xb7,0x86,0xa0,0x3c,0x5b,0xa2,0x3f,0x41,0x0,0xcb,0xc, + 0x7c,0xde,0xb4,0x33,0x96,0xd1,0x81,0x88,0x54,0x10,0xb6,0x53,0xc6,0xce,0x92,0x6b, + 0x72,0x52,0x24,0x51,0xe8,0x53,0x9c,0xb2,0xbd,0xa0,0x24,0x83,0x9,0xa6,0x8a,0xa, + 0x75,0xa1,0x8c,0xc7,0x2d,0x31,0x2d,0xf5,0x20,0x88,0x20,0x6,0xc3,0x60,0x11,0x9e, + 0xaa,0x4e,0x32,0x1f,0x9,0x6e,0xdf,0x4,0x43,0x1e,0x40,0xf,0x2c,0x3f,0x32,0xbe, + 0x88,0x47,0xe1,0x7a,0x8,0x4,0x49,0x5b,0x32,0x47,0x7c,0x73,0xdf,0x6e,0xf4,0x82, + 0x24,0x65,0x73,0x7b,0x24,0xd2,0xfb,0x8d,0xa7,0x72,0xcf,0x2a,0xbc,0x91,0x42,0xdc, + 0xad,0xf7,0x35,0x8,0xbf,0xc2,0x72,0x2c,0x6c,0xe1,0x5d,0xac,0x68,0xe5,0x9f,0x61, + 0x88,0x20,0x36,0xce,0xf8,0xef,0xa4,0x38,0xb,0x9c,0xf9,0xf3,0x73,0x8c,0x42,0x63, + 0x30,0x2a,0x14,0x56,0x25,0x24,0xa4,0x6b,0x2c,0xe3,0xe5,0x42,0x6b,0xc8,0x25,0x45, + 0x18,0x81,0xc7,0x25,0xad,0x73,0x59,0xec,0x22,0x85,0x12,0x5c,0xe5,0x4e,0x16,0xd2, + 0x62,0x14,0x69,0xc4,0xa3,0x13,0x1c,0x1d,0xce,0x72,0x82,0x90,0x57,0xac,0x89,0x58, + 0x5f,0x2a,0x4c,0xc1,0xe2,0x82,0x2f,0xe9,0x7d,0x89,0x9,0xb8,0xb7,0xb4,0xc5,0x7, + 0xad,0xdb,0x30,0x64,0x70,0x7c,0xd2,0xa5,0xb7,0x2e,0xcd,0x97,0xba,0x51,0xe9,0x10, + 0x85,0x72,0xd2,0x1c,0x11,0xa1,0xaf,0x5e,0xc1,0xb9,0xb9,0x9,0x2c,0x4c,0x8d,0xe2, + 0x27,0x37,0xce,0xe2,0xb8,0xd3,0xc5,0xc1,0x51,0x1b,0xdb,0xfb,0x2d,0xac,0x6e,0xed, + 0x63,0x6b,0xef,0x8,0xdb,0xfb,0x2d,0x6c,0xed,0x1d,0x62,0xe7,0xe0,0xd8,0xff,0xfd, + 0x8,0x3b,0xfb,0x2d,0x6c,0xee,0xb5,0x70,0x7c,0xd2,0x29,0xf1,0xe,0x28,0xd9,0x8f, + 0x51,0x76,0xf9,0xcb,0x1b,0x4c,0x91,0x5d,0xd,0xb4,0x73,0x3e,0xc9,0xc0,0x2,0x19, + 0xa7,0x90,0x2a,0x40,0xe0,0x46,0x9a,0x0,0x48,0xb1,0x77,0x9b,0x4b,0xaa,0x38,0x13, + 0xd7,0x51,0x14,0xd0,0xf6,0xd0,0xd,0x6,0xe0,0x89,0x9a,0xf5,0x2a,0x4e,0x4d,0xd, + 0x63,0xc2,0xe7,0x6b,0xbf,0x8a,0x3b,0xdc,0xa3,0x95,0x6d,0xfc,0xfc,0xe6,0x23,0x1f, + 0x80,0xe3,0x16,0x96,0x9,0x18,0x22,0x41,0x87,0x8d,0x35,0x8c,0x75,0xc0,0x2b,0x85, + 0x6b,0x37,0x91,0xa,0x81,0x44,0x2c,0x80,0x11,0x67,0x92,0xc9,0xa6,0x23,0x61,0x2d, + 0x49,0x31,0x82,0x4b,0x70,0x8,0x32,0xd6,0xb9,0xa1,0x4c,0x5d,0x1b,0x1e,0x9d,0xc1, + 0xe9,0x99,0x31,0xfa,0xf1,0x8d,0xb3,0x98,0x18,0x6e,0xf6,0x5c,0xe3,0x30,0x33,0x8e, + 0x4f,0x3a,0x78,0xb0,0xb2,0x89,0x3b,0x4b,0x9b,0x58,0xdf,0x3b,0xd2,0x56,0xf9,0x54, + 0xc0,0x6d,0x50,0x8c,0xb9,0x92,0x99,0xe8,0x3a,0xd2,0xba,0x88,0x74,0x12,0x6,0xfa, + 0x6a,0xb8,0x7e,0x61,0x16,0xa7,0x67,0xc6,0x5e,0x98,0x65,0x20,0xdf,0xab,0xf6,0x89, + 0xc5,0xd7,0xf,0x57,0xf1,0xc5,0xbd,0x67,0x38,0xe9,0x48,0xf8,0x38,0x3d,0x8e,0xf1, + 0xe1,0x7e,0xbc,0x79,0x7e,0x6,0xef,0x5d,0x39,0x85,0xd7,0xce,0x4e,0x63,0x7e,0x62, + 0x8,0x23,0x3,0x4d,0xd4,0xab,0x15,0xf4,0x35,0xaa,0xa5,0x8d,0x4c,0xaf,0x6b,0xa2, + 0xec,0x6b,0x98,0x19,0x8f,0x9e,0xef,0xe0,0x97,0x37,0x1f,0xf1,0x87,0x5f,0x3d,0xc6, + 0xed,0xc7,0x6b,0xbc,0x77,0xd4,0xe6,0xd6,0x71,0x3b,0xf2,0x23,0xdc,0x84,0x6c,0x2, + 0xb2,0xce,0x9c,0x7c,0x4,0x9c,0x2d,0x9,0x5b,0x26,0x76,0xa6,0xec,0x7e,0xa,0x70, + 0xd3,0x38,0x93,0x75,0xf8,0xbb,0xb5,0x51,0x35,0xe1,0xde,0x48,0x9b,0x48,0x96,0xd0, + 0xb2,0x36,0x6f,0x21,0x17,0x7,0x60,0xff,0x31,0x25,0x21,0x64,0x66,0x86,0x41,0x16, + 0x4a,0xa9,0xc,0xba,0x90,0xad,0x4f,0x94,0xb,0x25,0x33,0xe4,0x16,0x4b,0x42,0xec, + 0x2c,0xc4,0x3c,0xf9,0x9a,0x4e,0xca,0x66,0xab,0x44,0x54,0x2e,0xbc,0x29,0xa1,0x4d, + 0x2b,0x47,0xb8,0x2c,0xbf,0x94,0x20,0xad,0xe8,0x49,0xf9,0x9,0xc7,0xcc,0xe8,0x10, + 0xc1,0x18,0x8e,0x1a,0xe3,0xf,0x8e,0x94,0x69,0x16,0xed,0xec,0x54,0x47,0xc8,0x81, + 0x0,0x47,0x1,0x79,0xa5,0x48,0xc0,0x33,0x22,0xcf,0x26,0x38,0xb4,0xc7,0x4c,0x6c, + 0xc4,0x22,0x1e,0x8e,0x24,0x3,0x43,0x30,0x64,0x18,0x29,0x61,0xdb,0xb1,0x6e,0x5c, + 0xa1,0xf7,0x66,0xa2,0x86,0x22,0xa1,0x1d,0x9,0x6a,0xcf,0x65,0x3b,0x24,0x65,0x3d, + 0x91,0x29,0x1f,0xfd,0xce,0xc3,0xb7,0x6,0xf4,0x81,0x8c,0x37,0xae,0x8c,0xfb,0x28, + 0x72,0xc5,0x9d,0xc,0x45,0x5a,0xc,0xe5,0xbb,0xd4,0x40,0xc0,0x60,0xa5,0x3b,0xd6, + 0x5a,0xa1,0xf4,0xd,0xaa,0x6b,0x57,0xac,0x67,0x99,0x7a,0x14,0xe4,0x96,0x46,0xa9, + 0x97,0x8b,0xfb,0x91,0xfc,0xee,0x27,0x2a,0x63,0x54,0x33,0x91,0x24,0xc1,0x43,0x4e, + 0xeb,0x79,0xd8,0x4e,0x6e,0x3,0x4c,0x9a,0xc4,0x45,0x88,0xb2,0x90,0x4c,0x6a,0x2b, + 0x7,0x76,0x71,0x1f,0xa9,0x4c,0x60,0x8a,0x96,0x4a,0x9c,0xf3,0x10,0x23,0xd8,0x65, + 0x88,0x9e,0x6f,0xed,0xf3,0xcf,0xbe,0x78,0x80,0x93,0x6e,0x17,0x7,0xc7,0x27,0x74, + 0xed,0xec,0x4c,0x94,0xf2,0x48,0x2f,0xe8,0x30,0x31,0xbc,0x48,0x6e,0x65,0x8c,0x41, + 0x7f,0xd3,0x0,0xa8,0x1,0x68,0xaa,0xcf,0x6d,0xef,0x1f,0x63,0x7b,0xff,0x8,0x7, + 0xad,0x36,0xf6,0xf,0xdb,0xd8,0x3f,0x3a,0xc6,0xee,0x61,0xb,0x7,0xad,0x13,0xec, + 0x1f,0xb5,0xb1,0x77,0x70,0x8c,0xfd,0x56,0x1b,0x47,0xed,0xe,0x8e,0x8f,0x4f,0xd0, + 0x6a,0x77,0x70,0x7c,0xd2,0xc5,0xf1,0xc9,0x9,0x5a,0xc7,0x1d,0x1c,0xb5,0xbb,0x38, + 0x3a,0x3e,0xc1,0xd1,0x71,0x1b,0x47,0xc7,0x27,0xb0,0x10,0xb6,0x74,0x44,0x22,0xc3, + 0x3e,0x9,0x45,0xb4,0xfd,0x64,0x8,0x8c,0x4a,0xe3,0x9f,0x2b,0x8a,0x2,0x8b,0xf5, + 0x53,0x2b,0x2b,0xde,0x41,0x70,0xcb,0xa,0xe2,0x10,0x16,0xe1,0x84,0x2,0x3f,0x49, + 0xe,0xc,0xa8,0x18,0x83,0x73,0x73,0xe3,0x38,0x37,0x3f,0x8e,0xa6,0x3f,0xd0,0xcb, + 0xbc,0xb7,0xe5,0xeb,0xbb,0x7f,0xd4,0xc6,0xc3,0x95,0x2d,0x7e,0xb4,0xb2,0xcd,0x36, + 0xa6,0x5f,0x99,0x78,0x3a,0x12,0x49,0xca,0x67,0x8a,0xe0,0xd4,0xbc,0x43,0x4e,0x36, + 0xc9,0xf2,0x3e,0x8,0x24,0xe,0x75,0xf2,0x49,0xef,0x49,0x11,0x32,0x23,0x3b,0x4e, + 0xa2,0x18,0x6,0xab,0x14,0xa,0x99,0x75,0x74,0xf2,0xbb,0x37,0x98,0x9b,0x1c,0xc0, + 0xb5,0x33,0xd3,0x38,0x33,0x33,0x82,0x5a,0xb5,0xda,0x13,0x6a,0x27,0x22,0x2c,0xad, + 0xef,0xe1,0xd7,0xb7,0x9e,0xe0,0xe9,0xea,0x6e,0xe6,0xa3,0xa4,0x8b,0x99,0x3e,0x7f, + 0x65,0x46,0x45,0x6e,0x43,0x46,0x85,0xc3,0x9a,0x4,0x1,0xab,0xbf,0xaf,0x81,0xeb, + 0xe7,0x67,0xb1,0x38,0x3d,0x52,0x5a,0xcc,0x73,0xe2,0xd9,0x41,0xeb,0x4,0xb7,0x9f, + 0xae,0xe3,0xfe,0xf2,0x26,0x1c,0xdf,0xd3,0x9d,0xe8,0x7d,0x8d,0x1a,0x26,0x86,0xfb, + 0x30,0x3d,0x3a,0x80,0xe9,0xf1,0x41,0x9c,0x99,0x19,0xc5,0xe5,0x85,0x9,0x5c,0x5e, + 0x9c,0xc4,0x99,0x99,0x11,0x54,0x2b,0x95,0xd2,0x46,0x21,0xdc,0x23,0x39,0xe2,0x55, + 0xc6,0x5f,0x21,0x22,0x6c,0xef,0x1d,0xe1,0xd9,0xc6,0x1e,0x1e,0xae,0x6c,0xf3,0xd7, + 0xf,0x9f,0xe3,0xf3,0xbb,0xcb,0x7c,0xeb,0xc1,0x2a,0xbc,0x17,0x7b,0xda,0xaf,0x78, + 0x18,0x9c,0x61,0xd9,0x2d,0xb6,0x3d,0xa3,0x3d,0xfc,0x13,0x24,0x8e,0xee,0xd0,0x65, + 0x27,0xe9,0x21,0x26,0xb0,0x4d,0xcc,0x76,0x62,0x30,0x5b,0x87,0xa1,0xbb,0x1d,0x95, + 0x5,0xd9,0x60,0x2e,0xc3,0x48,0xc5,0x3c,0xfd,0x7c,0x62,0xcd,0x22,0xd7,0x6f,0xb, + 0x95,0x8,0xf3,0x95,0xca,0x42,0x20,0xdf,0x28,0xc4,0xa2,0x66,0x2a,0x19,0x2a,0x59, + 0x49,0x4a,0x8e,0x1a,0x69,0xce,0x24,0xc3,0x38,0x52,0x5c,0xd1,0x20,0x6,0xe5,0xda, + 0x47,0xe9,0x7,0x93,0x99,0xcd,0x48,0xee,0x12,0x67,0xf,0x20,0xfd,0x42,0x1,0x3b, + 0xf8,0x68,0xa9,0x50,0x8e,0x53,0x4,0xaa,0x38,0x58,0x42,0x5e,0xab,0x89,0xe8,0xa0, + 0x4c,0xe2,0x53,0x3,0x74,0xc8,0x95,0x74,0x28,0x4c,0xa8,0xc8,0xa1,0xde,0x19,0xe3, + 0x3f,0x6d,0xdc,0x18,0xe2,0xb7,0xe5,0x50,0x24,0x38,0x83,0xec,0xbf,0x5,0x13,0x48, + 0x4f,0xe3,0x14,0x86,0x71,0x29,0xa1,0x92,0x2f,0xb3,0x49,0x56,0x28,0x9,0x95,0x90, + 0x9b,0x39,0x31,0xee,0x86,0x74,0x1f,0x68,0x57,0xb7,0xf0,0x46,0x99,0xf8,0xdc,0xe2, + 0x24,0x9d,0x4c,0x64,0xb5,0x34,0x24,0x2c,0x9,0x83,0xab,0x2e,0x43,0x58,0xb3,0xb1, + 0xca,0x31,0x27,0xcd,0xdd,0x62,0x4a,0x1e,0xa6,0x32,0x50,0x8f,0xa,0xc,0x7,0xcd, + 0xd1,0x52,0xa4,0x39,0xca,0x90,0x15,0x42,0xf4,0x21,0x57,0x76,0xb,0x82,0xa9,0x4b, + 0x3a,0x76,0x31,0x6c,0x38,0xd,0x65,0x36,0x4,0xac,0x3c,0x3f,0x14,0xa3,0xce,0x8b, + 0x50,0x44,0x9c,0x2b,0xc7,0xa4,0x6c,0xdf,0x44,0xb9,0x5,0x9b,0x51,0x8c,0x8f,0x3b, + 0x4b,0xeb,0xbc,0xb6,0x73,0x80,0x27,0xab,0x3b,0xf8,0xf3,0x1f,0x5f,0xc3,0xef,0xdf, + 0x38,0x4b,0xcd,0x46,0xed,0xa5,0xf2,0x99,0x5e,0x93,0x7b,0x99,0xec,0x67,0x6c,0xa8, + 0x89,0xd1,0xc1,0x46,0x81,0xd1,0x2b,0x51,0x0,0x66,0xc6,0xc1,0xd1,0x9,0x76,0x8f, + 0x8e,0xb1,0xbe,0x73,0x80,0xcd,0xbd,0x23,0x6c,0xef,0x1e,0x62,0x73,0xaf,0x85,0xf5, + 0xed,0x3,0xac,0x6e,0x1f,0xe0,0xf9,0xd6,0x1,0x56,0xb7,0xf6,0xb1,0xba,0x7d,0xe0, + 0xf6,0xf3,0x92,0x4c,0x97,0x67,0x49,0x13,0x44,0x4b,0x69,0x7c,0x28,0x58,0x8,0x1f, + 0x9,0x1a,0xca,0x34,0x5b,0x73,0xc9,0x5c,0x18,0xa7,0xd4,0x54,0xb5,0x0,0x5d,0xb, + 0x29,0xb,0x69,0x22,0x53,0x31,0xb8,0x74,0x7a,0x92,0xae,0x2c,0x4e,0x91,0x21,0xbc, + 0x94,0x78,0xb5,0x7f,0xd4,0xc6,0x57,0xf,0x9e,0xe3,0xc1,0xca,0x16,0xba,0x21,0xee, + 0x9c,0xa8,0xa8,0x6e,0x66,0x1,0x57,0x52,0x59,0xec,0x54,0x9e,0xb6,0xc8,0x10,0x18, + 0x4e,0xb6,0x9b,0xa4,0x74,0x25,0x89,0xdb,0x96,0xa1,0xcf,0x33,0xa7,0x54,0x85,0xe, + 0x88,0x95,0x74,0x1c,0x91,0x28,0x37,0x31,0xd2,0x8f,0x7f,0xf6,0xce,0x5,0xdc,0xb8, + 0x38,0x8b,0x6a,0xa5,0xf2,0x42,0xed,0x39,0x0,0xdc,0x5b,0xda,0xc0,0xdf,0x7e,0xfa, + 0x0,0x1b,0x7b,0x47,0x41,0x40,0x93,0x52,0xd,0x95,0x80,0x5e,0xbb,0xab,0x31,0xa4, + 0x81,0x32,0x43,0x22,0x7a,0xf9,0xc4,0x27,0x77,0xfd,0x3,0xcd,0x3a,0xae,0x9e,0x9d, + 0xc2,0xe2,0xf4,0x48,0xe9,0x7b,0x22,0xb,0x2b,0x33,0xe3,0xe9,0xea,0x36,0x3e,0xfa, + 0xe6,0x29,0xb6,0xf6,0x5b,0x71,0xf0,0x18,0x1e,0x6c,0xe2,0xdc,0xcc,0x18,0xae,0x9f, + 0x9f,0xc6,0xdb,0x97,0xe6,0xf1,0xf6,0xc5,0x39,0x4c,0x8d,0xf6,0x47,0xb7,0xb9,0x5c, + 0xfe,0x99,0xaf,0x55,0x5e,0x76,0xf,0x25,0x4d,0x79,0x1b,0x5f,0x3f,0x58,0xc5,0xcf, + 0x6e,0x3e,0xe4,0xbf,0xf9,0xe4,0x3e,0x3f,0xdb,0xd8,0xd,0x4e,0x9,0xc9,0xbe,0xd5, + 0x1f,0x94,0xe9,0x88,0xa,0xd2,0x31,0xe3,0x89,0x6b,0xe4,0xf6,0x5a,0x9e,0x7e,0xee, + 0x31,0x79,0xeb,0xd,0xd8,0xad,0x27,0x5e,0xc4,0x5d,0xba,0xf3,0xc2,0x6,0x1b,0x22, + 0xb6,0x1c,0xfc,0xc,0x5c,0xc1,0xf7,0x13,0x12,0x6b,0x27,0x9f,0x0,0xd,0x44,0xab, + 0xe0,0xe2,0xfc,0x9b,0x11,0x98,0xa8,0xa0,0x25,0xa5,0xa4,0x52,0xe5,0xe4,0xa8,0xa, + 0x41,0xb2,0x4b,0x1c,0xe5,0xc4,0x86,0xe7,0x3c,0x63,0xd7,0x7f,0x2e,0x69,0x58,0xa8, + 0x7c,0x42,0xef,0x5,0x1,0x6a,0xa2,0x14,0x2b,0x59,0x84,0xdc,0xe2,0x53,0x30,0xc4, + 0x80,0xb6,0x25,0xd4,0x2e,0x23,0xac,0x4c,0x31,0x42,0xce,0x88,0xd2,0x54,0x1a,0x35, + 0xa7,0xf9,0x49,0x96,0xe3,0x9a,0x3a,0xb4,0x4,0x20,0x22,0x36,0x21,0xc2,0xd6,0x24, + 0xb,0x18,0x24,0xf3,0x17,0x12,0x5a,0x72,0x43,0xc6,0x84,0x49,0xdc,0x24,0xb8,0xdd, + 0xc8,0x20,0x10,0xe,0xb9,0x5e,0x1,0x6c,0x14,0x5,0xdc,0x97,0x2a,0x41,0x13,0x16, + 0xbe,0xee,0xb9,0xdd,0xbe,0xa9,0xc8,0x23,0xa3,0x60,0x72,0x5c,0x30,0xb,0x13,0xfb, + 0x30,0x46,0x9,0x9c,0x16,0xa5,0xc9,0x1,0xa6,0x9,0xd7,0x34,0xc1,0x8,0x5b,0x5e, + 0xa2,0xa4,0x57,0x88,0x56,0x57,0x36,0x12,0x47,0x20,0x3d,0xb1,0x22,0x74,0x64,0xc4, + 0xbb,0xcd,0x42,0x4f,0x97,0xb4,0x8e,0xa,0x68,0x24,0x31,0xa2,0x17,0xb4,0xbe,0xa4, + 0x61,0xe2,0x38,0x15,0x6,0xb0,0x86,0xa8,0x68,0xa8,0x43,0xd2,0x4,0x57,0x82,0x14, + 0x99,0xe2,0x42,0x75,0x16,0xd2,0x94,0x3e,0xc5,0x67,0x44,0x67,0xd8,0x80,0xfe,0x27, + 0xf2,0x7c,0x74,0x61,0xdf,0x3e,0x38,0xe6,0xcf,0xef,0x2e,0xbb,0xe2,0x72,0x7f,0x5, + 0x3f,0x7c,0xe3,0xc,0x5d,0x3b,0x33,0x15,0x77,0x8d,0x65,0x44,0xae,0x17,0xfd,0x29, + 0x93,0x2,0xe5,0xd3,0x69,0xbe,0x2f,0x24,0x22,0xc,0xd,0x34,0x30,0xd8,0x5f,0xc7, + 0xe8,0x40,0x13,0xc7,0x9d,0xee,0xff,0xc5,0xda,0x7b,0x36,0x47,0x76,0x66,0x69,0x62, + 0xcf,0x79,0xd3,0x67,0x22,0x91,0x99,0xf0,0xb6,0x0,0x94,0x77,0xac,0xa2,0xeb,0x66, + 0xb3,0xd9,0xd3,0x9c,0x76,0x33,0x3d,0x3b,0x76,0xb5,0xbb,0x1f,0x24,0x6d,0x48,0x21, + 0xe9,0x83,0x7e,0x96,0x36,0x42,0xa,0x4d,0x48,0x11,0x8a,0xd5,0x8e,0xeb,0x9d,0x9d, + 0x76,0x64,0x37,0x9b,0x6c,0x7a,0x56,0x15,0xcb,0x1b,0x14,0xbc,0x37,0x9,0x20,0x13, + 0xe9,0xee,0xd1,0x87,0xfb,0x9a,0xf3,0xde,0x7b,0xb3,0x58,0xb3,0x1a,0x44,0x47,0x13, + 0x85,0x42,0xc1,0xdc,0xbc,0xf7,0x3d,0xe7,0x3c,0xe7,0x31,0x68,0xb7,0xbb,0x38,0xed, + 0x74,0xd1,0x6c,0x75,0xd0,0x38,0x6d,0xe3,0xb4,0xd5,0x45,0xa3,0xdd,0xc1,0x51,0xb3, + 0x8d,0x83,0xa3,0x53,0xec,0xd6,0x1b,0xd8,0xde,0x3f,0xa1,0xad,0x83,0x13,0xac,0x6e, + 0x1f,0xf0,0xe6,0x7e,0x3,0x9d,0x5e,0x2f,0xd4,0xf2,0xb3,0x91,0xd7,0xba,0xd8,0x46, + 0x63,0x91,0x15,0xe,0x2b,0xe1,0xab,0xa5,0x53,0x73,0x65,0xbe,0xb2,0xa5,0xb6,0x28, + 0x21,0x35,0x67,0x72,0xd,0xa0,0x24,0xe0,0x4a,0xc3,0x7,0xe,0xfd,0x1f,0x70,0x71, + 0x66,0x14,0x97,0xcf,0x8c,0x22,0xdd,0x27,0xb9,0x4b,0xa2,0x1e,0x47,0xcd,0x36,0x3e, + 0xba,0xbb,0xcc,0x8f,0x57,0xf7,0xb4,0xb3,0x1f,0x7b,0x36,0x54,0x3e,0xaa,0x23,0xa4, + 0x92,0x2c,0x9a,0x3a,0x12,0x3e,0xdf,0x64,0xa9,0xfe,0xce,0x90,0xc6,0x43,0x93,0x48, + 0xd8,0xc5,0xd8,0xf7,0x49,0x48,0x21,0x49,0x90,0x3,0xc0,0x52,0x2c,0x19,0x3f,0xc, + 0xed,0xd,0x3a,0x3f,0x51,0xc5,0x8f,0x5e,0x3f,0x47,0x57,0xe6,0xc6,0x3c,0x7f,0x83, + 0xa8,0x7d,0x69,0xaf,0xd7,0xc3,0xe1,0x49,0x1b,0x8f,0x56,0xf6,0xf0,0x68,0x6d,0x2f, + 0x54,0x46,0x90,0x3f,0x29,0xc5,0x82,0x7e,0x62,0xac,0x52,0xd1,0x4e,0x5b,0x8f,0x2, + 0x72,0x52,0x68,0xa9,0x3c,0xd2,0x5f,0x6d,0xa4,0x5a,0xc4,0xdc,0x78,0xcd,0x5a,0xf0, + 0xf6,0x93,0xaa,0x99,0xb7,0xa5,0xad,0x43,0x7c,0xfa,0x70,0xd,0xb5,0x72,0x1,0xe7, + 0xa7,0x46,0x70,0x6e,0xba,0x86,0xe9,0x91,0x41,0x8c,0xd5,0x4a,0x18,0xad,0x14,0x31, + 0x52,0x29,0x61,0xa4,0x52,0x4c,0xbc,0x97,0x93,0x62,0x4d,0xa3,0x1c,0x94,0xa4,0x86, + 0xf8,0xf1,0x6a,0xc8,0x41,0xb9,0xfd,0x6c,0x93,0x9f,0xae,0xef,0x63,0x79,0xf3,0x90, + 0xd7,0xf6,0x8e,0xcd,0xd1,0x64,0x86,0x42,0x9b,0x2a,0x64,0x3c,0xfb,0xd9,0xe8,0xcb, + 0xc3,0xd1,0xda,0x98,0xad,0x73,0x28,0x65,0x60,0x46,0x48,0xb4,0xd0,0xc6,0x32,0x8, + 0xf4,0xed,0x12,0xe8,0x7d,0x7b,0x10,0x98,0xfd,0x39,0xd9,0x22,0x1f,0xc0,0x8,0x24, + 0x59,0xa7,0xfd,0x28,0xd6,0x1c,0xe,0xeb,0xfb,0xee,0xac,0x62,0x85,0x1b,0xb3,0x78, + 0x11,0x12,0xc2,0x59,0x10,0x59,0x5b,0xc8,0xce,0x58,0xd4,0x2,0x25,0x88,0x8d,0x14, + 0x31,0x64,0x81,0x33,0x32,0xf2,0x65,0xe4,0x42,0x6e,0x49,0x8,0xb,0xba,0x24,0x5c, + 0xf9,0x76,0x75,0xdc,0xc7,0x79,0xdc,0xdf,0xf7,0x44,0x33,0x65,0xa4,0x19,0x46,0x74, + 0x32,0x31,0x5,0xc6,0x9f,0xa3,0xcc,0x29,0xa2,0x2f,0x1b,0x79,0x11,0x5,0xd6,0x2, + 0x46,0x2a,0x71,0x64,0xad,0xb6,0x4,0x39,0x16,0xee,0x55,0x4a,0xd8,0x85,0xba,0x4c, + 0x6d,0x45,0xd6,0x28,0x46,0x29,0x5d,0xf8,0x95,0x81,0xe6,0x49,0xc1,0xee,0xd3,0xc9, + 0x16,0x76,0xa5,0xc8,0x2e,0xbb,0x5,0xf,0x2c,0x9c,0x9c,0x23,0xb1,0x22,0x4c,0x11, + 0xea,0x88,0xad,0x21,0x4a,0x29,0xa4,0x53,0x84,0x6c,0x2a,0x8d,0x4c,0x26,0xec,0x1d, + 0x7a,0x41,0x68,0xa2,0xde,0xed,0xf5,0xd0,0xed,0x5,0xdc,0xed,0x6,0xda,0x85,0x2c, + 0x49,0x65,0x18,0x99,0x54,0xbd,0x94,0xb5,0xa8,0x96,0x31,0x3c,0xf8,0x52,0x8a,0x90, + 0xcb,0xa4,0x91,0x4a,0x85,0xe1,0x1c,0xa7,0x9d,0x2e,0xf5,0x7a,0x6c,0x53,0xd4,0xad, + 0x74,0xcd,0x7a,0x5a,0x47,0x49,0x6b,0x4e,0xd0,0xed,0xe5,0xca,0x43,0xa0,0xde,0x24, + 0x29,0xd1,0xfa,0x6b,0xe9,0x9f,0x2d,0x9b,0x4e,0x61,0xb0,0x94,0xa3,0x5c,0x36,0x85, + 0x94,0x52,0x50,0x4,0x74,0x3,0x50,0xb7,0xd3,0xc5,0xc9,0x69,0x87,0x1b,0xa7,0x6d, + 0xf4,0x7c,0xeb,0x40,0xd1,0x1a,0x58,0x97,0xfa,0x98,0x93,0xa4,0xf4,0xb1,0x90,0x84, + 0xcd,0xb0,0xe3,0xd5,0xd1,0x9a,0xca,0xc1,0x18,0x24,0x41,0x2b,0xb2,0xe1,0x87,0xc, + 0x80,0xe,0x8e,0x5b,0xfc,0xe9,0x83,0x75,0x3c,0x5e,0xd9,0x43,0xbd,0xd1,0xc2,0x49, + 0xb3,0x85,0x4b,0xb3,0x23,0x34,0x3c,0x58,0x42,0x3a,0x5,0xe4,0x73,0xd9,0xd8,0xe4, + 0x11,0x25,0xc9,0x25,0xc9,0x6c,0x5e,0xc6,0x18,0x43,0xc2,0x9d,0x0,0x50,0x2a,0x64, + 0x51,0x4c,0x70,0x54,0x93,0x7f,0x6e,0xb5,0x3b,0x58,0xdb,0x39,0xc2,0xea,0x4e,0x1d, + 0xcf,0x37,0xf,0xf0,0x6c,0xfd,0x80,0x9e,0x6d,0xec,0xf3,0xd2,0xe6,0x21,0xe,0x4f, + 0x9a,0x68,0x9e,0x76,0xa9,0xab,0xd9,0x76,0xb1,0xa1,0x80,0xed,0x76,0x84,0xa5,0x3d, + 0xb2,0x35,0x89,0x23,0x49,0x52,0x44,0xfc,0x99,0x83,0xf0,0xa,0x94,0x3b,0x40,0x6, + 0x6,0x7,0xa,0x74,0x66,0x7c,0x90,0xa6,0x46,0x6,0x63,0xbf,0x57,0xd2,0xef,0xbe, + 0x7d,0x70,0x82,0xcf,0x1f,0x6d,0x60,0x65,0xe7,0x28,0x5c,0x3d,0x49,0x12,0xad,0x99, + 0x40,0xed,0x59,0xa4,0x5c,0xa4,0x1,0x8b,0x3c,0x59,0x72,0x1e,0xcb,0x80,0xa6,0x3d, + 0x85,0xf2,0xd3,0x24,0x75,0x8d,0xb5,0xe5,0x89,0x98,0x33,0x44,0x8b,0x8c,0x6b,0xda, + 0x4d,0x14,0xba,0xdb,0x3e,0xd8,0xd5,0x9f,0x2,0xd1,0xc2,0x64,0x15,0x6f,0x5e,0x9e, + 0xa1,0xeb,0xb,0xe3,0x28,0x15,0xb2,0xb1,0x15,0x83,0x9c,0x7c,0x8f,0x1a,0x6d,0x7c, + 0xfe,0x68,0x15,0x5f,0x3f,0xdf,0x42,0xe3,0xb4,0xcb,0x4e,0xe5,0xc2,0x9,0xcf,0xb8, + 0x4f,0xd7,0xb3,0xa1,0x60,0x26,0xca,0x20,0xca,0x46,0x11,0xc7,0xd,0x8b,0xce,0xa4, + 0x3a,0x90,0xc7,0xec,0x58,0xd,0x43,0x7a,0x9d,0x94,0xd4,0x70,0x26,0x45,0x8f,0x56, + 0x4b,0x5,0x9c,0x39,0x5b,0xc1,0xf5,0xf9,0x31,0xbc,0xb2,0x30,0x8e,0xb1,0x5a,0xe9, + 0x85,0xe6,0x4b,0x49,0xd3,0x78,0x34,0x50,0x45,0x7e,0x5e,0xb7,0xdb,0x43,0xb3,0xdd, + 0xc5,0x69,0xbb,0x8b,0xe5,0xed,0x43,0x7c,0xf1,0x68,0x1d,0xbf,0xbd,0xb3,0xc4,0x9f, + 0x3d,0x58,0x47,0xb7,0xd7,0x63,0x21,0x80,0x35,0x28,0x85,0x33,0x85,0x31,0xfe,0x3, + 0xae,0xbd,0xd3,0x7f,0x67,0x9,0x70,0x1,0x9,0xeb,0x56,0x80,0x2,0xd,0xb9,0x33, + 0xb3,0x9e,0xc8,0xc3,0x56,0x36,0x84,0xdf,0x35,0xec,0xe,0x3b,0x99,0xc3,0xee,0xd0, + 0x75,0xc1,0x66,0x3,0xc7,0x93,0xe,0x82,0x82,0x5e,0x7e,0x59,0x2f,0x43,0x41,0xb1, + 0x17,0x3f,0x2f,0x8c,0x62,0x24,0x16,0x52,0x16,0x5b,0x52,0xbb,0x21,0x86,0x35,0x9b, + 0x9a,0x3d,0x6d,0x7f,0x14,0x27,0x55,0xe2,0xfc,0x13,0xa,0x27,0x62,0xd,0xb9,0x7b, + 0x23,0xb9,0x92,0x16,0x9c,0x9,0x6e,0x66,0xdc,0xc7,0xe4,0x32,0x9e,0xca,0xe6,0xa1, + 0xd1,0x91,0x5c,0x4d,0x27,0x3c,0x52,0x7e,0x96,0x3a,0xc5,0x95,0x3a,0xfe,0x1,0x62, + 0xe8,0xe6,0xba,0x68,0x3b,0x7c,0x8d,0xac,0xe4,0x2c,0x45,0x64,0x83,0x56,0x42,0x28, + 0xd6,0xc2,0xe9,0x48,0x85,0x9,0xda,0x46,0xae,0xa6,0xff,0x52,0x39,0x6,0x7c,0x88, + 0xd6,0xc3,0x39,0x86,0xeb,0x7d,0xb9,0xb2,0xf3,0x8a,0x8,0x7d,0x77,0x41,0x2d,0x20, + 0xb7,0x76,0xf4,0x72,0xd6,0xc3,0xff,0xc,0x16,0xf3,0x98,0x19,0x1b,0xa4,0x99,0xb1, + 0x2a,0x26,0x87,0xcb,0x54,0xc8,0xa6,0x50,0x6f,0xb4,0x71,0xd4,0x38,0x45,0xfd,0xa4, + 0xcd,0x1b,0xfb,0xc7,0xb4,0xb9,0x77,0x8c,0xfd,0xfa,0x9,0xcb,0x1d,0x7,0x27,0x98, + 0xc4,0x78,0x70,0x34,0x21,0x51,0xa7,0x9a,0x4e,0x2b,0x8c,0xd,0xd,0xe0,0xc2,0xf4, + 0x30,0x55,0x4a,0x39,0x9c,0x76,0x7a,0x78,0xb0,0xb4,0xcd,0xcf,0x37,0xf,0x42,0x80, + 0x9e,0x23,0xf2,0x1b,0xd1,0xea,0xfb,0x3b,0x3c,0xe9,0x4b,0x0,0x7f,0x3d,0xa0,0xb3, + 0x6a,0x28,0xb2,0x23,0x37,0x1f,0x3a,0x3b,0x3d,0x4c,0x7f,0xf1,0xdd,0x4b,0x74,0x71, + 0x76,0x84,0x42,0xc2,0x8c,0xa,0xe3,0x31,0x37,0xf6,0xf9,0xc3,0x3b,0xcb,0xfc,0xe9, + 0x83,0x15,0xde,0x3a,0x38,0x31,0x6c,0x7b,0x7,0xdb,0x73,0xc0,0x70,0x62,0x9e,0x58, + 0x6e,0xa2,0xe8,0x2d,0xe2,0xaa,0x5d,0x4d,0x8f,0x74,0xcf,0x58,0xec,0x1a,0x92,0xb5, + 0xef,0x13,0x54,0x95,0x7a,0xb3,0xcd,0xff,0xf0,0xd1,0x43,0x7c,0xfa,0x60,0x15,0xe7, + 0xa7,0x47,0xf0,0xf6,0xb5,0x19,0xbc,0x75,0x65,0x86,0x16,0x26,0x87,0x12,0x27,0xec, + 0x97,0x99,0xd8,0xbf,0xe9,0xed,0x65,0xe0,0xfb,0xe8,0xa1,0x99,0xcd,0xa4,0x31,0x35, + 0x52,0xc6,0x68,0xb5,0x84,0x6b,0xb,0x13,0xe8,0xf5,0x7a,0x38,0x38,0x39,0xa5,0xa5, + 0xad,0x43,0xbc,0xff,0xe5,0x22,0xff,0xf6,0xce,0x73,0xac,0xed,0x1c,0x41,0x8a,0xb6, + 0x8c,0x8f,0xb5,0x2e,0xcb,0x2e,0x23,0xc7,0x38,0x5,0x2a,0x45,0x9e,0xf1,0x8c,0x34, + 0xb0,0x61,0x63,0x51,0x4d,0x22,0x26,0x97,0xd,0x75,0xe,0x0,0xa1,0x98,0x4f,0xd3, + 0xc2,0x78,0x15,0x23,0xda,0xb4,0xa4,0x5f,0xb6,0xb6,0x69,0x62,0x9a,0xad,0x2e,0x96, + 0xb7,0xe,0xf1,0x7c,0xeb,0x10,0xad,0x4e,0x8f,0xad,0xb6,0xdd,0xba,0x6d,0x91,0x17, + 0x5e,0xe2,0x7e,0x7f,0xcb,0x5b,0x87,0x9,0xbd,0x62,0x25,0xec,0x92,0x94,0x58,0xc2, + 0x20,0x66,0x7a,0x6b,0x75,0x2,0xb6,0x15,0x75,0x59,0xef,0x91,0xaa,0x6e,0x10,0x42, + 0xe5,0x47,0xab,0x9,0xcf,0xc7,0x74,0x26,0x85,0x9f,0x7e,0xfb,0x22,0xfd,0xe9,0x77, + 0x2e,0x22,0x97,0x49,0xbd,0xb0,0xc0,0x11,0x11,0x76,0xea,0xd,0xfc,0xc7,0xdf,0xdc, + 0xc7,0xe7,0xf,0xd7,0x9d,0xff,0x95,0x8,0x67,0x21,0x4a,0x70,0x8a,0x11,0xd6,0x10, + 0x6,0xc9,0xb4,0x76,0x4d,0x7d,0x57,0x42,0xee,0x7e,0xba,0x38,0x33,0x82,0xab,0x73, + 0x23,0x48,0xa7,0xd4,0x4b,0x91,0xd2,0x82,0x20,0xc0,0xb7,0x2f,0xcf,0xe0,0xf2,0x99, + 0x11,0xe4,0x33,0x19,0xe4,0xb2,0x29,0xe4,0x33,0xa9,0x97,0xbe,0x87,0xbf,0xe9,0xf3, + 0xac,0x4,0xed,0xf8,0x14,0x9f,0x3d,0x5c,0xc7,0xef,0xee,0x2e,0xe1,0xeb,0x67,0x5b, + 0xbc,0x5b,0x6f,0xe2,0xf0,0xa4,0x85,0x9e,0x6d,0x44,0xc9,0xc9,0xd1,0x60,0xe1,0x73, + 0x5d,0x2e,0xd9,0x92,0xd1,0x38,0x70,0x5,0x9d,0x81,0x20,0x2c,0xf7,0x8a,0x43,0x59, + 0x39,0x82,0xd0,0x30,0x49,0x8b,0xc8,0x3,0xad,0x43,0xf,0x35,0xbb,0xc,0x26,0xd, + 0xa9,0x7,0x81,0x3e,0x4b,0x2,0xcd,0xe1,0x60,0x4,0x41,0x10,0x28,0xdd,0x14,0x4, + 0x8,0x1b,0x8,0x22,0xfd,0xfd,0x8c,0xc1,0x8c,0xb,0x58,0xf1,0xd3,0x45,0xc9,0x21, + 0xa2,0xe4,0xd8,0x64,0x3e,0x3,0x9c,0x63,0x2e,0x22,0x49,0xef,0x71,0xc4,0x1a,0xd6, + 0xe3,0x91,0x1,0x9e,0xaa,0xd4,0xc8,0xcf,0xd3,0xce,0x24,0x42,0x8,0x97,0x48,0x32, + 0xdf,0x29,0x32,0xab,0xc7,0x95,0xcf,0xe,0x50,0xa6,0x3e,0x4a,0x68,0xdf,0xe8,0x83, + 0x21,0x33,0xd1,0x7d,0x39,0x1c,0xa2,0x12,0x65,0x8f,0x84,0xe3,0x5a,0x4,0x16,0x3b, + 0x6b,0xcf,0xc,0x46,0x3b,0xc2,0xb1,0x66,0xa5,0x87,0xd5,0x5f,0x91,0x5e,0x8b,0x59, + 0xc2,0x1b,0x87,0xef,0xa9,0xd0,0xf1,0x8a,0x43,0xc9,0x1a,0x64,0xa1,0xb7,0xd3,0x38, + 0x19,0xf6,0xba,0x47,0x29,0x94,0x1e,0x90,0x20,0x11,0x8f,0x4a,0xc8,0x66,0x52,0x54, + 0x2b,0x17,0x30,0x52,0x29,0xd2,0xe8,0x60,0x9,0xc3,0xd5,0x2,0x8d,0x56,0x6,0x30, + 0x5a,0x2d,0xd1,0x68,0xb5,0x88,0xa1,0x72,0x1,0xb9,0x6c,0x1a,0x27,0xa7,0x5d,0x34, + 0x5a,0x2d,0x9c,0x34,0x3b,0x74,0xd4,0x6c,0x63,0x65,0xfb,0x80,0x3f,0xbe,0xb7,0x4a, + 0x8b,0x1b,0x7,0x7c,0xdc,0x6c,0xfb,0x3b,0x75,0xa1,0x3,0x4c,0x6c,0xa8,0x74,0x79, + 0xca,0xa4,0x15,0xa6,0x47,0xcb,0xb8,0x36,0x37,0x46,0x97,0xce,0x8c,0x62,0x7a,0xb4, + 0x42,0xc5,0x5c,0x1a,0xad,0x6e,0xf,0xd7,0x16,0xc6,0xf9,0xce,0xd3,0x4d,0xfe,0xf4, + 0xfe,0xa,0xef,0x1f,0xb7,0x34,0x89,0xd3,0x48,0xd3,0xdc,0x29,0x21,0xa7,0x92,0x98, + 0x45,0x2b,0x9,0x58,0x8f,0x25,0xb7,0xdd,0xd0,0x1d,0x8,0xe5,0x62,0x96,0x5e,0x39, + 0x37,0x49,0xef,0x5c,0x9f,0xa5,0x77,0x6f,0x2e,0x60,0x6a,0xb8,0x4c,0xf9,0x9c,0xb3, + 0x79,0x9c,0x1e,0xad,0xd0,0x48,0xb5,0xc4,0xd3,0x63,0x83,0xfc,0xeb,0x2f,0x16,0xf9, + 0xd9,0xc6,0x3e,0xba,0xdd,0xc0,0x76,0x8b,0x64,0xf3,0xab,0x3c,0xdf,0x6a,0x32,0xee, + 0x79,0x91,0xb4,0xd0,0xa8,0x7c,0x9d,0xc9,0x57,0xb,0x47,0xe8,0x0,0x64,0xaa,0x2, + 0xbb,0x43,0x9a,0x10,0x30,0x53,0xe3,0xb4,0xc3,0x8b,0x1b,0x75,0xda,0xad,0x37,0xf9, + 0xf0,0xa4,0x45,0xab,0x3b,0x47,0x7c,0x7e,0x6a,0x88,0x66,0xc7,0x2a,0x18,0x1f,0x2a, + 0x63,0xb4,0x52,0x40,0x36,0x93,0x8e,0x4d,0x1c,0xff,0x5c,0xfb,0xca,0x17,0x7d,0x5e, + 0x3f,0xe7,0x2e,0x59,0x2c,0xb2,0x99,0x34,0x72,0x59,0xf7,0xbd,0x87,0x2b,0x45,0x4c, + 0xe,0x95,0x31,0x90,0xcf,0xd2,0x50,0xa5,0x88,0xdf,0xdd,0x59,0xc2,0xe3,0xd5,0x3d, + 0x9c,0xb4,0x3a,0x6c,0x3,0x6e,0x58,0xda,0x26,0x42,0xd2,0xda,0x23,0xee,0x53,0xca, + 0xb,0x2a,0xf3,0x9d,0x94,0xcd,0x9e,0x4b,0xd9,0xed,0x3b,0x33,0x63,0x7c,0x68,0x0, + 0xd7,0x16,0xc6,0x50,0x1d,0xc8,0x27,0xc2,0xeb,0x72,0xc7,0xda,0xeb,0x5,0x78,0xb8, + 0xba,0x8b,0xaf,0x9f,0x6d,0xf1,0xd1,0x49,0xcb,0x93,0x28,0x5a,0x48,0x91,0x39,0xe2, + 0xc7,0xa4,0x6f,0xc6,0x40,0x23,0xed,0x81,0x48,0xf1,0x33,0xd5,0xdb,0x24,0xee,0x45, + 0x5c,0xef,0x60,0x27,0x78,0x96,0x92,0x34,0x72,0x89,0xc8,0x26,0x3e,0x50,0x69,0xcb, + 0x77,0x45,0xd2,0x96,0x47,0x4,0xa,0x91,0xc9,0xa0,0x1f,0x1d,0x2c,0xd2,0xb7,0x2e, + 0x4f,0xe1,0xed,0x6b,0xb3,0x98,0x9b,0xa8,0xc6,0xa6,0xdf,0xa8,0xc6,0x7a,0x6b,0xff, + 0x18,0x9f,0x3f,0xda,0xc0,0xd7,0x21,0x53,0xdb,0x23,0x35,0xb1,0xcd,0xcc,0xf0,0x30, + 0x4e,0x5b,0x14,0x2c,0x4a,0x0,0x5b,0xdc,0xec,0xc,0x4f,0x1c,0x41,0xac,0x22,0x51, + 0xbd,0xe7,0xa6,0x86,0x70,0x75,0x7e,0xc,0x99,0xb4,0x7a,0xa9,0xa6,0x91,0x99,0x51, + 0x2e,0x66,0x31,0x58,0xca,0xc5,0xf8,0x1e,0x12,0x7d,0xe8,0xb7,0x1f,0x97,0x64,0xb7, + 0xe8,0xb3,0xb1,0x77,0xd4,0xc4,0xfa,0x4e,0x1d,0xab,0xbb,0x47,0x78,0xba,0xb6,0x8f, + 0xbb,0x4b,0xdb,0x7c,0xfb,0xd9,0x16,0xb6,0xf6,0x4f,0xc,0x64,0xc6,0xb0,0xc6,0x9c, + 0x6,0x94,0xb0,0x8c,0x73,0x63,0x78,0xc5,0x42,0x1c,0xc3,0x30,0x9a,0x71,0xb3,0xfb, + 0x36,0x10,0x79,0x10,0x4e,0xe0,0x5a,0xf7,0xc8,0xcc,0x8a,0x89,0x42,0x83,0x77,0x4, + 0xa1,0x7c,0x8d,0x42,0x34,0x3e,0xd0,0x9e,0xd,0x81,0x6,0xef,0xc3,0x71,0x3b,0x94, + 0x89,0x84,0xf,0x81,0xa,0xe5,0x93,0x1c,0xf9,0xde,0x64,0xc8,0x4a,0xcc,0xac,0x24, + 0xa7,0xc9,0x1a,0x96,0xb2,0x6f,0xb8,0xc1,0x6e,0x6,0x14,0xb2,0x9,0xc8,0x15,0x26, + 0xa2,0x84,0xcd,0x28,0x2a,0x8e,0xfe,0x81,0x7a,0x36,0xf,0xdd,0x9,0x95,0x4c,0xff, + 0xaa,0x5c,0x51,0x87,0xb8,0xa9,0x88,0x12,0xba,0x8a,0x88,0xf3,0x95,0xb5,0x4f,0x56, + 0x62,0xf2,0x93,0x1b,0x51,0xc4,0x24,0x71,0x91,0x0,0x9,0x55,0x26,0xdf,0x91,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xc9,0xed,0xf1,0xb4,0x4e,0x8e,0x52,0x46,0xe4, + 0xf9,0xc7,0x3a,0x41,0xb9,0x2d,0xe6,0x60,0x22,0x95,0x52,0x4a,0xf4,0xe1,0xca,0x1a, + 0xc4,0x84,0x5,0xd8,0x4c,0xe9,0xa,0x50,0x44,0x4a,0xc7,0x2e,0x85,0x4b,0x62,0x32, + 0xd,0x83,0x47,0x86,0xb3,0x4f,0x99,0xcd,0x53,0xd7,0xe7,0xf,0x59,0x77,0x5b,0x6, + 0x21,0x97,0x4e,0x61,0x7e,0xa2,0x4a,0x57,0xe7,0xc7,0xe8,0xd5,0xf3,0x13,0x74,0xe3, + 0xdc,0x4,0xe6,0x27,0x6a,0x94,0x4d,0xab,0xc4,0x2c,0x5f,0xe9,0xa6,0xb5,0x5f,0x6f, + 0x52,0x31,0x9f,0xe5,0x5f,0x7c,0xf6,0x14,0xf7,0x97,0xb6,0x99,0x59,0x18,0xd7,0x32, + 0x33,0xf7,0xb1,0x9d,0x90,0x8d,0xd5,0xe4,0x70,0x99,0x7e,0xf2,0xe6,0x79,0xfc,0xd1, + 0xb7,0x2e,0xd0,0xb5,0xf9,0x31,0x6f,0xdb,0xd9,0xed,0x76,0xe9,0xde,0xd2,0xe,0x1f, + 0x35,0xdb,0xfc,0xfb,0x7b,0x2b,0xec,0x8c,0xb,0x14,0x3b,0x7c,0xdb,0xe9,0xe4,0xd8, + 0x92,0xed,0x4,0x2,0xef,0xf4,0xcd,0x12,0x75,0x21,0x7,0x1b,0x67,0x70,0x75,0x61, + 0x9c,0xfe,0xe7,0x9f,0xbe,0x4e,0xaf,0x5d,0x9c,0xa0,0x9c,0x28,0x80,0xe6,0x6d,0x7c, + 0x68,0x0,0x13,0xc3,0x65,0xba,0x71,0x6e,0x92,0x3a,0xbd,0x20,0x68,0xf7,0x7a,0x58, + 0xde,0xaa,0x87,0x7e,0x9e,0x1a,0x25,0x50,0xe6,0x11,0x26,0x84,0x3a,0x6a,0x82,0x19, + 0xb9,0x5d,0x7,0xc1,0x2,0x2b,0x16,0xe2,0x3d,0x8e,0x66,0x92,0x93,0x4f,0x4b,0x85, + 0xb3,0x36,0x26,0x17,0x96,0x65,0xa5,0xca,0x7c,0xd4,0xec,0xd0,0x27,0xf,0x56,0xf9, + 0xb3,0x87,0xab,0x18,0xa9,0x94,0x70,0x75,0x7e,0xc,0xdf,0xbf,0x31,0x47,0xaf,0x5d, + 0x98,0xc0,0xd9,0xc9,0x1a,0x32,0xe9,0x74,0x5f,0x9,0xd0,0xff,0xdf,0xa9,0xfd,0x45, + 0x85,0xbf,0x9f,0xa4,0xce,0xd8,0xd3,0x7e,0xfb,0xca,0xc,0xae,0xcc,0x8d,0xa2,0x52, + 0xca,0xd1,0x3f,0x7d,0xfa,0x84,0x6f,0x3d,0xdb,0xa6,0x6e,0xb7,0xcb,0xca,0x9e,0x32, + 0x9e,0xca,0x15,0x5e,0x1a,0xb2,0xc7,0x92,0x86,0xbc,0xaa,0x62,0xcc,0xd5,0x9e,0x2c, + 0x52,0x56,0x46,0x44,0x93,0xc3,0x83,0xb8,0x71,0x76,0x82,0xca,0x85,0x5c,0xdf,0x55, + 0x84,0xf9,0x6f,0x37,0x60,0x7c,0xf9,0x78,0x3,0x5f,0x3c,0xd9,0x44,0xe0,0xd,0xc8, + 0xfe,0x74,0x6c,0x8e,0x70,0x1b,0x99,0x4c,0xc6,0xf,0x87,0x43,0x7f,0x21,0x67,0xd4, + 0x4d,0x14,0x4,0xae,0xe0,0x29,0x38,0x28,0x82,0xa4,0x5a,0x5c,0x64,0x36,0x93,0xe5, + 0x5a,0x90,0x49,0x7f,0x35,0xb1,0x7e,0xce,0x6f,0x1b,0xce,0xee,0x56,0xc,0x36,0x4, + 0xe0,0xcd,0xcb,0xd3,0xf8,0xf7,0x3f,0xb9,0x41,0xe7,0xa7,0x86,0x12,0xad,0x49,0xe5, + 0x33,0xde,0xe9,0xf6,0xf0,0xe1,0xd7,0xcb,0xf8,0xd5,0x17,0xcf,0xb8,0x7e,0xdc,0x42, + 0x54,0xd3,0xe4,0x13,0xf4,0xfa,0xc8,0x15,0xed,0xa5,0x31,0x5a,0x61,0x49,0x8c,0xf1, + 0xcd,0x48,0xcc,0x67,0x67,0xd2,0xa,0xb,0x93,0x35,0x5c,0x98,0x1e,0x46,0x26,0xa5, + 0x5e,0x8a,0xe4,0x99,0xf4,0x9a,0x45,0x5f,0xbf,0x97,0xbd,0x4f,0xe5,0x35,0x38,0x3c, + 0x3e,0xc5,0xad,0xa7,0x9b,0xf8,0xdd,0xd7,0xcb,0xf8,0xed,0xad,0x25,0xac,0xee,0x1e, + 0x85,0x1,0x3c,0x76,0x1e,0xb7,0xb7,0x95,0x73,0x40,0x74,0x1,0x80,0xae,0xb0,0x8b, + 0x34,0x3d,0x36,0x70,0x39,0x99,0x9,0x5e,0x4f,0xe5,0x1a,0x32,0x27,0x36,0x6c,0x76, + 0x4,0xfa,0xf4,0xd1,0x24,0x38,0xad,0x45,0xf,0xdc,0x54,0xe,0x27,0x87,0xd4,0xb0, + 0xbc,0x6e,0x2a,0x98,0x61,0x2d,0x63,0x35,0x24,0x40,0x50,0xd6,0xb7,0x8a,0x5,0x81, + 0x98,0x84,0x47,0x81,0x78,0x5a,0x1c,0xf8,0x43,0xf1,0xb5,0xb5,0xaf,0xd4,0x50,0x7e, + 0x43,0x96,0x28,0x42,0x44,0x44,0x3c,0x18,0x2f,0xea,0x69,0xff,0x66,0x52,0x5e,0xc4, + 0xa9,0x99,0xc3,0x1d,0x9f,0x29,0xce,0xc3,0xf7,0x3c,0x41,0x94,0x8c,0x72,0xa7,0xbe, + 0xa,0x38,0x24,0x96,0xf7,0x8,0xb7,0x5a,0x47,0x3b,0x46,0x68,0x38,0x82,0xb,0x6b, + 0x36,0xe0,0x9a,0x4d,0xa0,0x6c,0xd2,0x2,0xa9,0x94,0x95,0xa5,0x29,0xa3,0x9d,0x62, + 0x5,0xa5,0x7,0x6d,0xc5,0xa1,0xb2,0x4d,0x59,0x6b,0x57,0xf3,0xb5,0x8c,0x63,0x44, + 0xb8,0x50,0x17,0x32,0x35,0xb6,0x42,0x40,0x56,0x26,0x5f,0xd5,0xc6,0xdc,0x13,0x11, + 0x70,0x76,0xaa,0x46,0xd7,0xe7,0xc7,0xe9,0xca,0xfc,0x28,0x4d,0x8d,0x94,0x31,0x5e, + 0x29,0x61,0xa8,0x52,0xa2,0xe1,0xc1,0x2,0xf2,0xd9,0x74,0xec,0xb7,0x4e,0xea,0x64, + 0x8b,0xf9,0x34,0x6,0x8b,0x79,0x14,0xf3,0x59,0x28,0xa5,0x28,0x60,0xc7,0x6a,0x65, + 0x52,0xf2,0x60,0x8d,0x10,0x11,0xc3,0xd7,0x6b,0xac,0x56,0xc2,0x77,0xae,0x9f,0xa1, + 0x3f,0x79,0xeb,0x12,0x9d,0x9f,0xaa,0xc5,0x1e,0xae,0x54,0x2a,0x85,0xd9,0xd1,0xa, + 0xfd,0xc1,0x8d,0x39,0xb4,0x3a,0x5d,0xdc,0x7a,0xba,0xc9,0x41,0x90,0xa0,0x37,0x93, + 0xa,0x4,0xa2,0xc8,0xd1,0xee,0xeb,0xe1,0x24,0xec,0x32,0x3e,0x32,0x40,0x3f,0x7c, + 0x75,0x81,0x7e,0xf8,0xda,0x2,0xae,0x2d,0x8c,0x51,0x21,0x97,0xed,0xab,0x7b,0x5, + 0x80,0x6a,0x29,0x87,0x77,0x6f,0x2e,0xd0,0x49,0xb3,0x83,0xb5,0x9d,0x7b,0x1c,0x7a, + 0x5a,0x93,0x8b,0xd6,0x50,0x9e,0x6,0x2e,0x34,0x65,0x32,0xd7,0x84,0x8c,0xd1,0x3, + 0x85,0x21,0x32,0x92,0x8a,0x12,0x23,0x62,0x4a,0xed,0x7,0xf9,0x92,0x2e,0x57,0xda, + 0x1d,0xd8,0x63,0x4a,0x9,0x33,0xb6,0xe,0x4e,0xb8,0xf3,0x74,0x93,0xb6,0xf,0x8e, + 0xf9,0x37,0xb7,0x9f,0x63,0x6a,0xb8,0x8c,0xf9,0x89,0x2a,0x9d,0x9d,0x1a,0xc2,0xc2, + 0x44,0xd,0x13,0x43,0x3,0x7d,0x23,0x1d,0x5f,0x44,0x14,0xfa,0x97,0x80,0xe9,0x93, + 0x76,0xb6,0xe5,0x62,0xe,0x3f,0x79,0xe3,0x1c,0xd2,0xa9,0x14,0x6d,0xd7,0x1b,0xbc, + 0xbc,0x75,0x24,0x5d,0xb,0x9c,0xc9,0x94,0x34,0x75,0x15,0x4c,0x19,0xeb,0x34,0x24, + 0xe5,0x95,0xfe,0xbf,0x95,0xab,0x34,0x2,0x80,0xa9,0xe1,0x1,0xbc,0x72,0x76,0x1c, + 0x83,0xa5,0xe4,0x64,0x35,0x39,0xe5,0x35,0x5a,0x5d,0xdc,0x5f,0xda,0xc1,0xc3,0xd5, + 0x5d,0x4,0xbd,0x20,0xb2,0x8e,0xf3,0x55,0x5c,0x2e,0xb5,0xca,0x7c,0x73,0x66,0xe9, + 0x4b,0x4d,0x86,0x32,0xa9,0xa3,0xcd,0x28,0xca,0xb1,0x34,0x37,0x90,0x50,0x67,0x92, + 0x18,0xa,0x44,0xa4,0x3b,0xc1,0x5a,0x37,0x43,0x32,0x29,0x45,0x17,0x0,0xe4,0x73, + 0x19,0xbc,0x7b,0x73,0x9e,0xfe,0xf8,0xcd,0xb3,0x74,0x71,0x66,0x4,0x85,0x5c,0xba, + 0x2f,0xaf,0xc2,0xbc,0xfe,0x1b,0x7b,0x27,0xf8,0xfd,0x83,0x35,0x7c,0xfa,0x68,0x1d, + 0xad,0x5e,0xe0,0xa0,0xf3,0x8,0x61,0xff,0x45,0x77,0x87,0x69,0xa2,0x59,0xec,0xdd, + 0x99,0x44,0xe0,0x5a,0x24,0xee,0x9a,0x99,0x30,0x31,0x54,0xc6,0xe4,0x48,0x19,0xa5, + 0x7c,0xe6,0xa5,0x88,0x9c,0xf2,0x3c,0x4a,0x92,0x1b,0xf6,0x5b,0x9f,0xf4,0x2b,0xf4, + 0xf5,0x93,0x16,0xee,0x3e,0xdf,0xc6,0x83,0x95,0x1d,0x3c,0x5c,0xd9,0xc7,0xda,0x4e, + 0x1d,0xab,0x7b,0x47,0xd8,0xd8,0x3d,0xe2,0x5e,0xe0,0xdd,0xcb,0x9,0xf,0x8f,0xc9, + 0x1b,0xd7,0xe0,0xb8,0x38,0x63,0x34,0xb6,0x16,0x90,0x21,0xc9,0x21,0xcc,0x37,0x87, + 0x76,0x7f,0xf3,0x26,0x77,0x20,0x0,0x14,0x33,0x71,0x10,0x26,0xf2,0x19,0xe9,0x5a, + 0xc0,0x0,0x69,0x63,0x99,0xc0,0x85,0xfb,0x58,0x97,0x33,0xeb,0xe5,0xcf,0xee,0xb8, + 0x1,0x5b,0x22,0x47,0x58,0xa8,0x6d,0xb3,0x29,0x4c,0x60,0x62,0xfa,0x8b,0xa4,0x78, + 0x78,0xaf,0xa5,0x93,0x4c,0xf0,0x88,0x73,0x64,0x4c,0x2e,0x1e,0xfd,0x73,0xa4,0xcc, + 0x5b,0x63,0x19,0x52,0xee,0xb7,0x60,0x2f,0xaf,0x55,0x5c,0x48,0x95,0x2c,0x65,0x8b, + 0x5a,0xd4,0x71,0x5c,0xdb,0x4,0x9f,0x16,0x20,0xf3,0xe0,0xdd,0xd1,0x6a,0xed,0x96, + 0x1,0xcb,0x66,0x27,0xb1,0x80,0xf,0xf7,0xb5,0x66,0x73,0x94,0xd2,0x73,0x37,0x5b, + 0x2,0x1c,0xc,0x6b,0xdd,0x4e,0xd7,0x1a,0x6e,0xa7,0xb0,0xb8,0x2b,0x82,0xd2,0x11, + 0xa9,0xca,0x4a,0xce,0x74,0x51,0xa7,0xd0,0x45,0x4e,0x49,0x56,0xbc,0x10,0x78,0xbb, + 0x85,0x22,0x69,0xc7,0x39,0xfd,0xcb,0xe5,0xd3,0x69,0x2a,0x95,0x32,0x34,0x3f,0x5e, + 0xc3,0xab,0xe7,0x27,0xe8,0xf,0x5e,0x99,0xa3,0x57,0xce,0x8e,0x53,0x21,0x97,0xe9, + 0xb,0x9b,0xbe,0x68,0xf2,0x6a,0xb6,0x7b,0xa8,0x9f,0xb4,0xd0,0x38,0xed,0xf8,0x9d, + 0x8c,0x83,0x8,0x22,0x2b,0x10,0xd7,0x3e,0x15,0xf2,0x59,0x7a,0xe3,0xd2,0x34,0xbe, + 0x7f,0x63,0x9e,0xae,0xcc,0x8d,0x7a,0xf,0xab,0x3c,0x60,0xf3,0xd9,0x34,0xae,0xcc, + 0x8d,0xd1,0xe2,0xe6,0x21,0xee,0x3c,0xdb,0x6,0x2b,0xf3,0x5c,0x40,0xb0,0x67,0xcd, + 0x2e,0x9d,0x2c,0xe5,0x9d,0xc5,0x8,0x40,0xbe,0x39,0x28,0x8,0x8c,0x99,0xd1,0x2a, + 0xde,0xbc,0x32,0x45,0xff,0xea,0x3b,0x17,0xe8,0x8d,0x8b,0xd3,0xde,0xf7,0x95,0xdf, + 0x5f,0x32,0x80,0x99,0x19,0xaf,0x2c,0x8c,0xd3,0xf3,0x8d,0x3,0xfc,0xcd,0x47,0xf, + 0x8,0xed,0x1e,0xcb,0x71,0xc3,0x22,0xf,0x6,0xf0,0x51,0x64,0x2d,0x3f,0x9d,0xa9, + 0xa2,0xb5,0x4b,0x62,0x93,0x6b,0x47,0x1e,0xad,0x88,0xdc,0xee,0x3f,0x3a,0xa9,0x3a, + 0x46,0xbc,0xae,0xe8,0xec,0xec,0x8d,0x6c,0x26,0x1e,0xb0,0x7f,0xd4,0xe4,0xfd,0xa3, + 0x53,0xdc,0x5d,0xda,0x25,0x45,0x84,0x2b,0x67,0x46,0xf8,0xda,0xfc,0x18,0x5d,0x9d, + 0x1f,0xc5,0xd9,0xc9,0x2a,0xc6,0xaa,0x3,0xc8,0x67,0xd3,0x48,0xa7,0x53,0xc8,0x28, + 0x42,0x2e,0x9b,0xb2,0xba,0xdc,0x7e,0x7e,0xf1,0xb2,0xe0,0x7f,0xd3,0xde,0xf9,0x45, + 0xc5,0x3d,0x7a,0x6f,0x31,0x33,0xa6,0x46,0x6,0xf1,0xbd,0xeb,0x67,0x70,0x6f,0x79, + 0x7,0xbd,0xde,0xa,0xad,0xef,0x1d,0x99,0xeb,0x65,0xbc,0xe,0xc4,0xc8,0xa0,0xf1, + 0x5e,0xc9,0x71,0x74,0x44,0x1c,0xa2,0xd8,0x34,0xe1,0x7,0x3c,0xa7,0x55,0xa,0x93, + 0x23,0x83,0x34,0x33,0x3a,0x98,0xa8,0xd3,0x97,0x3f,0xe7,0x69,0xab,0x83,0xe5,0xad, + 0x3,0x2c,0x6f,0xd5,0xb9,0xdd,0x9,0x1c,0xec,0x66,0xa3,0x50,0xd,0xd,0x49,0x16, + 0x3b,0xa5,0x19,0x9b,0x1c,0xe5,0x85,0xb2,0xf3,0x87,0x65,0xdf,0x68,0xc7,0x5f,0xe1, + 0xc1,0xf9,0x17,0x2a,0xcf,0x14,0x4a,0xdb,0x97,0x92,0xc1,0xd8,0x58,0x59,0x93,0x44, + 0x63,0x8e,0x6b,0x37,0x3d,0xb9,0x6c,0x6,0x37,0xcf,0x8d,0xd3,0x9f,0x7e,0xe7,0x2, + 0xbd,0x7a,0x6e,0xc2,0x33,0x4f,0x91,0xaf,0xa1,0x74,0x3e,0x5b,0xde,0xae,0xe3,0xc3, + 0x7b,0x2b,0xb8,0xfd,0x74,0x8b,0x9b,0xad,0xae,0xb7,0x69,0x35,0x5,0xc0,0x77,0xff, + 0xf7,0x2f,0x33,0xb3,0x33,0xe9,0x62,0x9f,0xb1,0xef,0x78,0x8a,0x8c,0x10,0x51,0x16, + 0x1e,0x5,0x43,0x83,0x39,0x9c,0x9f,0x1e,0xc2,0x70,0xb9,0xe0,0x31,0xef,0x5f,0xe4, + 0xa9,0x1f,0x3d,0x8f,0x5e,0x24,0xc9,0x34,0x9f,0x23,0xef,0xed,0x5e,0x2f,0x40,0xab, + 0x13,0xe0,0xe4,0xb4,0x8d,0xfd,0xe3,0x26,0x16,0x37,0xf,0xf0,0xf1,0xfd,0x35,0x7c, + 0xfe,0x68,0x1d,0x8f,0xd6,0xf6,0xd,0x91,0x91,0xcd,0x95,0x77,0x6,0x58,0x62,0x6e, + 0x65,0xb6,0xa8,0xa4,0xd7,0x97,0x87,0x95,0xdd,0xea,0xc1,0x45,0xd7,0xce,0x6c,0x82, + 0x55,0x42,0x48,0x31,0x70,0x91,0xa7,0xa4,0x9d,0xe1,0x82,0x40,0xe7,0xb4,0x4,0xa1, + 0xef,0x71,0xc0,0xc4,0x14,0x32,0xdc,0x29,0xb0,0xf6,0xb0,0xac,0x29,0x95,0x26,0xd1, + 0x8f,0x15,0x6b,0x27,0x42,0x9b,0xda,0x66,0x7f,0x20,0x63,0x93,0x2f,0x87,0x61,0xc1, + 0xe4,0x75,0xcf,0xf,0x47,0xf8,0xe,0x46,0x81,0x61,0x37,0x97,0x32,0x7c,0x85,0xe2, + 0x19,0xf3,0x24,0x88,0x93,0x24,0xc1,0x50,0x86,0x34,0x6a,0x93,0x63,0x5e,0x5a,0x4e, + 0x5d,0x51,0xf6,0xa4,0xef,0x4c,0x15,0x21,0x5e,0x88,0x94,0x15,0x91,0x82,0x6a,0xdf, + 0xa7,0xa8,0x1c,0x2b,0x69,0x27,0x4b,0x2e,0x7d,0x39,0x1e,0x7a,0xaa,0xbc,0xc9,0xdc, + 0xa3,0xe1,0x92,0xe5,0xc0,0x11,0xa7,0x42,0x28,0x9c,0x4c,0x41,0xd6,0xa5,0x5e,0xdb, + 0xaf,0x2b,0xcd,0x6d,0xb1,0x90,0xbb,0x8e,0x39,0x57,0xba,0x23,0x37,0x6d,0x41,0x68, + 0x79,0x23,0x2,0x5b,0x74,0xc8,0xa,0x99,0x1,0xcb,0xac,0x97,0x75,0xe3,0x41,0xf9, + 0x4c,0xa,0x57,0xe6,0xc6,0xe8,0xcf,0xbf,0x7b,0x49,0xdd,0x38,0x37,0x4e,0xa3,0x95, + 0x12,0x4a,0xf9,0xc,0xa,0x9,0x5a,0xe6,0xe8,0x81,0xdb,0x6f,0x57,0xda,0xee,0x74, + 0x71,0x77,0x69,0x1b,0x4f,0xd6,0xf,0x10,0x90,0xf0,0xdb,0xd6,0x87,0x56,0xe8,0xde, + 0x15,0x69,0xb6,0xf4,0xcb,0x54,0x2b,0xe5,0xf1,0xd3,0x6f,0x9d,0xa3,0xb7,0xaf,0xce, + 0x24,0x3e,0x80,0x6e,0xa6,0x61,0xe4,0x32,0x29,0xe4,0xb2,0xa9,0xc8,0xd9,0xec,0x4d, + 0xdd,0x31,0xbd,0xe,0x79,0xc7,0x8e,0xff,0x42,0x9e,0x99,0xa8,0xd2,0xf,0x5f,0x5d, + 0xc0,0xbf,0xfb,0xfe,0x35,0x9a,0x1a,0x1e,0x88,0xfd,0xee,0xdc,0x87,0xb9,0xad,0x94, + 0x42,0xa9,0x90,0x42,0xb5,0x5c,0x80,0xa2,0x94,0xd3,0x8c,0x47,0x48,0x42,0x6e,0x1b, + 0xee,0xfc,0x90,0x5d,0x67,0xe8,0x24,0x77,0x4,0x6,0x2,0x3,0xdf,0xd9,0x75,0x81, + 0x90,0x33,0xfb,0xac,0x68,0x2f,0x9,0x90,0x9c,0x7c,0x82,0xc3,0x4c,0xb1,0x30,0x93, + 0xc9,0x4d,0x69,0xa1,0xc6,0x85,0x81,0x47,0xab,0x7b,0x58,0xda,0x3e,0xe2,0x5f,0x7f, + 0xb5,0x88,0x52,0x31,0x4b,0x23,0xe5,0x12,0x2e,0xcc,0xd4,0x70,0x6e,0x72,0x8,0xb3, + 0x63,0x15,0xcc,0x4f,0x54,0x31,0x51,0x2b,0xc6,0xe,0x50,0xd9,0xe0,0xf4,0xbb,0x3f, + 0xfe,0x6b,0xde,0xe4,0xd7,0x35,0x87,0xec,0x68,0xad,0x84,0xff,0xf6,0x7,0xd7,0xa9, + 0xd3,0xd,0xf8,0xef,0x3f,0x7a,0x64,0x7d,0x50,0x59,0xa4,0xe7,0x59,0x1a,0x84,0xf4, + 0x88,0x88,0x7a,0x4a,0xc7,0x49,0x99,0x96,0x16,0x97,0xcf,0xa4,0x70,0x76,0xb2,0x86, + 0xa9,0xa1,0xf2,0xb,0xf9,0x4,0xe6,0x67,0x5b,0xde,0xa9,0xe3,0xf3,0xc7,0x9b,0x38, + 0x68,0x9c,0x5a,0xab,0x5e,0x69,0x7,0x68,0xae,0x7d,0x98,0x30,0x1c,0xc6,0xc0,0x9, + 0xb8,0x39,0x7c,0xf1,0x2,0xb8,0x50,0x2d,0x83,0x7a,0xb2,0xdc,0x47,0x3,0xf1,0xa0, + 0x49,0x7d,0xe4,0x8a,0x1c,0x5e,0x23,0xad,0x21,0x21,0x44,0xb7,0xa6,0xf4,0xca,0x9f, + 0xb7,0xb2,0xd9,0x34,0xfe,0xe2,0x9d,0x4b,0xf4,0xa3,0xd7,0x16,0xe8,0xfa,0xfc,0x28, + 0xaa,0x3,0x79,0x6f,0x32,0x4f,0x6a,0xac,0x4e,0xdb,0x5d,0xfc,0xee,0xee,0xa,0xfe, + 0xf7,0x7f,0xba,0xc5,0xab,0x3b,0x47,0x90,0xe1,0x21,0x14,0xc1,0x2b,0x89,0xbd,0xcd, + 0x86,0xe8,0x5c,0x1c,0xf9,0x90,0x12,0x64,0x50,0x6e,0xad,0xa9,0x20,0xd,0x3e,0xc6, + 0x6b,0x65,0xbc,0x7a,0x6e,0x2,0xb5,0x81,0xc2,0xbf,0xf8,0xfa,0x27,0x89,0x15,0xcf, + 0xcc,0x38,0x6c,0xb4,0x71,0x67,0x71,0xb,0x9f,0x3e,0x5c,0xc3,0xed,0xa7,0xdb,0x58, + 0xde,0xa9,0xa3,0xd9,0xee,0xa2,0xd9,0xea,0x3a,0x3e,0x95,0xcc,0xac,0xa0,0x88,0xb0, + 0xcb,0x65,0x87,0x58,0x6b,0xa,0x9b,0x92,0x66,0x7d,0xd5,0x49,0x7b,0xb4,0xdb,0xc8, + 0x33,0xed,0x4,0x17,0xa6,0xa8,0xd9,0xf4,0x3d,0x6d,0xef,0x6a,0x24,0x6a,0xe1,0x18, + 0x6e,0xe4,0x66,0x30,0xc0,0xa7,0x6,0xd5,0x35,0xf8,0xe,0x5,0xa,0xc9,0x19,0x1c, + 0xfe,0x5b,0x65,0x3b,0x6e,0x97,0x83,0x4d,0x56,0x61,0x21,0x83,0x9f,0x24,0x55,0x8c, + 0x22,0x6b,0x10,0xc7,0x85,0x10,0xcc,0x4c,0x6f,0xfc,0x66,0x2f,0xd7,0x24,0x9e,0x31, + 0x4f,0x11,0x7f,0x6d,0x19,0xa4,0x45,0x9e,0xd3,0x11,0xb1,0xf4,0x72,0xb7,0xf,0x83, + 0xf,0xdf,0xc4,0xb2,0x9d,0x25,0x1c,0x46,0x11,0x5b,0x3b,0xc9,0x42,0xd2,0xa3,0x80, + 0x95,0x10,0x7a,0x34,0x6c,0x86,0xdf,0xb3,0x38,0xa8,0xc8,0x18,0x84,0x90,0x51,0x51, + 0x99,0x24,0x35,0x49,0x64,0x31,0x16,0x64,0x46,0x4e,0x96,0x52,0x8a,0xcc,0xb2,0x82, + 0xf4,0xfb,0xca,0x4c,0xdf,0xa4,0xf4,0x39,0xad,0xf7,0xe5,0xa1,0x22,0x5d,0x53,0xe2, + 0x48,0xd3,0xee,0xf4,0x5e,0x5d,0x14,0x74,0x67,0xc1,0x22,0xb1,0x37,0xca,0x65,0x14, + 0x16,0x26,0x6b,0x74,0x75,0x6e,0x8c,0x5e,0xbb,0x30,0x41,0x6f,0x5f,0x3b,0x43,0x53, + 0xc3,0xe5,0xd8,0x4e,0x3c,0x2a,0x4b,0x8a,0xea,0x52,0xe5,0xdb,0x49,0xb3,0x8d,0x9d, + 0xc3,0x6,0x3e,0x7b,0xb4,0x86,0x67,0x9b,0x7,0xe8,0x72,0x10,0xe1,0xc8,0xcb,0x46, + 0x87,0x22,0xb4,0x38,0xc6,0x50,0xb9,0x88,0x1b,0xe7,0x27,0x70,0x71,0x66,0x4,0xc5, + 0x7c,0xd6,0x23,0xa8,0xc4,0x27,0x38,0x60,0x65,0xbb,0x8e,0xf5,0xdd,0x13,0x71,0x87, + 0x52,0x4,0x2a,0x62,0x13,0xf4,0x11,0x67,0x62,0x8a,0xf,0x67,0x33,0x29,0x9a,0x1f, + 0xaf,0xe2,0x7,0xaf,0xce,0xe1,0xdd,0x9b,0xf3,0x74,0x66,0xbc,0x92,0x88,0x46,0xc8, + 0xc2,0x26,0x89,0x52,0xe6,0xdb,0x1b,0x96,0x30,0xd9,0xd6,0x57,0xec,0x68,0xad,0x67, + 0x35,0x83,0x35,0xbc,0x26,0x44,0xef,0x4e,0xcb,0x64,0xee,0x35,0x65,0xfc,0x76,0x59, + 0x30,0xf4,0xad,0xb9,0x27,0x33,0xc2,0xf3,0x9a,0xc5,0xfa,0x96,0x85,0x23,0x8b,0x75, + 0x52,0xa3,0x18,0x3d,0xc0,0xaa,0x82,0xda,0x3d,0x46,0xa7,0xd9,0xc6,0x51,0x13,0xa0, + 0xc3,0x26,0x3f,0xdf,0x38,0xa4,0x8d,0xfd,0x13,0x3c,0x59,0x3f,0xc0,0x64,0x6d,0x0, + 0xa3,0xd5,0x12,0x86,0x7,0xb,0x18,0x2a,0x17,0x50,0x2e,0xe6,0x50,0xca,0xa7,0x31, + 0x50,0xc8,0xa1,0x98,0xcf,0xa0,0x98,0x4d,0xa3,0x54,0xc8,0x20,0x97,0x49,0x7b,0xf7, + 0x43,0x12,0x7b,0x3e,0xda,0x0,0xf4,0x83,0x37,0xa3,0xbe,0xd8,0x44,0x84,0x62,0x2e, + 0x83,0xab,0x73,0xa3,0xb8,0x72,0x66,0x84,0x7e,0xf7,0xf5,0x2a,0x1f,0x1c,0x35,0xbd, + 0x2f,0x1c,0x6d,0xa0,0x9d,0x81,0x45,0xbf,0x42,0xee,0xdb,0x5a,0x11,0x42,0x17,0xb2, + 0x8b,0xb3,0xc3,0x34,0x3e,0x34,0xd0,0xb7,0x61,0x95,0x3f,0xfb,0xea,0xce,0x11,0x3e, + 0x79,0xb0,0x86,0xfd,0xe3,0xb6,0x48,0xe3,0x14,0xec,0xf6,0xd8,0xa4,0xed,0x84,0xb9, + 0xa4,0x53,0x5b,0xb4,0xe9,0x10,0x2b,0x10,0x5,0xde,0x81,0xc7,0xba,0xe,0xb3,0xe7, + 0xce,0xcc,0x16,0x65,0x60,0xb1,0x3d,0x52,0xd6,0x51,0x82,0x99,0xc3,0x38,0x63,0x37, + 0xca,0xdb,0x45,0x4c,0x3a,0x45,0x74,0x66,0xac,0x82,0xd7,0xce,0x4f,0xd2,0x8f,0x5f, + 0x3f,0x4b,0x37,0x17,0xc6,0x30,0x50,0xcc,0x7a,0xc8,0x97,0xf9,0x1d,0xe5,0x3d,0x7e, + 0x78,0xd2,0xc2,0x7,0x5f,0x2f,0xe3,0xfd,0x5b,0x4b,0xfc,0x7c,0xab,0x1e,0x9e,0x6c, + 0xe4,0xfb,0x2c,0x24,0x60,0x1e,0x1e,0x9b,0x88,0x5,0x28,0xb,0x19,0x89,0x19,0xdb, + 0xc0,0xfb,0xc6,0x38,0xc4,0xc0,0x58,0xb5,0x84,0x1b,0x9a,0xa4,0x68,0x5e,0x87,0xff, + 0x1a,0x4,0xe8,0x45,0xa8,0xd0,0x51,0xa3,0x85,0xfd,0xe3,0x53,0xec,0xd6,0x9b,0xd8, + 0xd8,0xb,0xd,0x9a,0x1e,0xae,0x86,0x1a,0xfb,0x67,0x1b,0x87,0xa1,0x80,0x82,0x22, + 0x6a,0x27,0x8b,0x32,0xb,0x2b,0x5f,0x57,0xe0,0x4d,0x51,0xb5,0x9f,0x20,0xcc,0xc5, + 0xcc,0x3,0x6d,0xf5,0xe1,0xa1,0xbf,0xb1,0x91,0xb3,0x69,0xa8,0x8e,0x55,0xe8,0x8, + 0x17,0x3e,0xc5,0xa1,0x79,0x8c,0xb6,0x77,0x25,0x36,0x4,0x39,0xed,0xff,0x6f,0xa6, + 0x79,0xdd,0x39,0x99,0x6c,0xb,0x8d,0xcf,0x68,0x8f,0x22,0xcb,0x16,0x77,0x63,0x8c, + 0x45,0x2,0x63,0x91,0xf4,0xce,0xe5,0x33,0x6a,0x93,0xe,0x2f,0x15,0xc1,0xb2,0x38, + 0x95,0x8a,0xec,0x4a,0x22,0x48,0xba,0x3,0xd2,0x94,0xad,0xa1,0x32,0xc4,0x8b,0xe0, + 0xdf,0x53,0xa4,0x2c,0x29,0x8e,0xc0,0x91,0xc3,0x5a,0xba,0xa,0xb2,0x2f,0xa,0x8f, + 0x7,0xc3,0xa9,0x48,0xd6,0x97,0x64,0x6c,0xda,0xdd,0x3c,0x5c,0xe5,0x17,0x39,0x71, + 0x24,0x1e,0x48,0x73,0x90,0x3a,0xe2,0x92,0x70,0x82,0x83,0x95,0xa0,0x85,0x93,0xb9, + 0xb2,0x2d,0xb7,0x2e,0xba,0x29,0x2b,0x43,0xd3,0x9,0xdd,0x3a,0x6c,0x25,0xfc,0xaf, + 0x81,0xdd,0x59,0xc8,0xd5,0xc2,0x2f,0xa5,0xf3,0xce,0xd,0x95,0x94,0x84,0xaf,0x26, + 0xd9,0x10,0x45,0x3b,0xb5,0x9e,0x9f,0x1d,0xa1,0x3f,0x7b,0xeb,0xa2,0xfa,0xfe,0x8d, + 0x39,0x5a,0x98,0xac,0x7d,0x23,0x43,0xb9,0xdf,0x81,0xdc,0xeb,0x5,0x68,0x75,0xbb, + 0x38,0x6e,0xb4,0xb1,0xbe,0x77,0x8c,0xdf,0xdc,0x5e,0xc2,0x7,0x5f,0x2f,0xf3,0xd6, + 0x7e,0xc3,0x5f,0x26,0xc6,0xb8,0x8,0x52,0x61,0x10,0x2,0xcc,0xd7,0xe7,0x47,0xf1, + 0xee,0xcd,0x39,0x1a,0x28,0x66,0x13,0xf,0x18,0x79,0xd8,0x36,0x5b,0x5d,0x7c,0xf1, + 0x64,0x93,0xef,0x2c,0x6e,0x1,0x81,0x5b,0x2e,0x30,0x4b,0xe1,0x32,0xc5,0x64,0x70, + 0x1c,0x53,0x50,0x86,0x2c,0xda,0x1f,0xbc,0x3a,0x87,0xbf,0x7a,0xe7,0x32,0x4d,0x8f, + 0xc,0xbe,0xb4,0x1,0x4b,0xf4,0xc0,0xef,0x6,0x9e,0x47,0xbf,0x7e,0xbe,0xf4,0x2d, + 0xab,0xcc,0x3e,0x26,0xc4,0xdd,0x29,0x30,0x9b,0x52,0x12,0xd4,0x29,0x5,0x97,0xf1, + 0x42,0x7e,0x9b,0xe8,0x49,0xa6,0x15,0xd9,0x65,0x2b,0x91,0x73,0xc1,0x25,0x15,0x4d, + 0x85,0x3,0x47,0xf3,0x50,0xc9,0xef,0x9d,0xbd,0xdc,0x1,0x2,0x56,0x76,0xeb,0x58, + 0xd9,0xad,0xcb,0x79,0x12,0xb5,0x81,0x3c,0xc6,0x6a,0x3,0x38,0x33,0x36,0x88,0xc9, + 0xa1,0x1,0x4c,0xf,0x97,0x31,0x3e,0x54,0xc2,0xd4,0xd0,0x0,0xc6,0x87,0xca,0x18, + 0xc8,0x67,0x90,0x4e,0xa9,0xbe,0xd7,0xa5,0x5f,0x51,0xef,0xf7,0x16,0x25,0x5d,0x12, + 0x11,0xe6,0x27,0xaa,0x78,0xfd,0xc2,0x4,0x3e,0x7d,0xb4,0x8e,0xc3,0x93,0x53,0xc3, + 0xed,0x24,0x4b,0x98,0x96,0x9b,0x9b,0x68,0x6a,0x2d,0xb,0x52,0x5c,0xd4,0xa1,0x8d, + 0x80,0x72,0x31,0x4b,0x17,0x67,0x86,0x31,0x5e,0x2b,0x25,0xae,0xe,0xa2,0xf7,0xc1, + 0xca,0x56,0x1d,0x5f,0x3d,0xdb,0xe4,0xe3,0x66,0x3b,0xe2,0x4f,0xa7,0x24,0xec,0xe8, + 0x9c,0xec,0xec,0x49,0x6e,0xb7,0x6e,0x9a,0x1,0xcd,0xc6,0xc,0x89,0xc8,0xb1,0xbf, + 0x3d,0x7b,0x68,0xb2,0x1e,0xf4,0x24,0x5d,0x35,0xc2,0x7a,0xad,0xcc,0xfe,0xdd,0xb5, + 0xf0,0x96,0x13,0xa0,0x6f,0xf4,0x4c,0x5a,0xd1,0xd4,0x50,0x19,0x7f,0xfa,0xd6,0x5, + 0xfa,0xab,0x77,0x2e,0xd1,0xc8,0x60,0x1,0xe9,0x74,0x2a,0xd6,0x94,0x47,0x57,0x27, + 0x40,0x68,0x94,0xf2,0xd7,0xbf,0xfa,0x9a,0xbf,0x5e,0xdc,0x36,0x96,0x3e,0x16,0x31, + 0x22,0x90,0x47,0x36,0xb5,0xa7,0xbd,0x8,0x7b,0xf3,0x1d,0x21,0x34,0x20,0x41,0x31, + 0x5f,0xce,0x58,0xef,0x65,0xce,0xd2,0x89,0xa1,0x1,0x5c,0x9c,0x1d,0x46,0xb9,0x98, + 0xfd,0x67,0x3d,0x93,0xff,0x9c,0xb7,0xc3,0x93,0x16,0xbe,0x7c,0xbc,0x81,0xdf,0xdd, + 0x5b,0xc5,0xad,0xa7,0x5b,0x58,0xdf,0x3b,0x46,0x2f,0x70,0xc9,0xcb,0xb6,0x2f,0x62, + 0xb9,0x57,0x60,0x1d,0x74,0xa3,0x3c,0x29,0x22,0xb,0x56,0xb5,0x70,0x9e,0x60,0x76, + 0xc1,0x2a,0x32,0x51,0x59,0x17,0x64,0x63,0xf9,0xea,0x1c,0xe0,0xb4,0x40,0xdc,0xb1, + 0xdc,0x39,0xfc,0x38,0x21,0xd0,0xde,0xed,0xa1,0xa5,0xab,0x7e,0x45,0x38,0x80,0xcd, + 0xd9,0xe,0xf5,0xed,0x8a,0x39,0x8,0x2c,0x45,0x87,0x99,0xc8,0x57,0xf1,0x32,0x9b, + 0x4,0x6e,0xc8,0x90,0x33,0x8e,0x12,0xd5,0x64,0x73,0x26,0xce,0x8,0x12,0xd7,0xc6, + 0x1f,0xe7,0x1d,0x81,0x93,0x38,0x42,0x5b,0x27,0x3f,0xd6,0xdc,0x6f,0xf1,0xcc,0x59, + 0xe7,0x9e,0x39,0x4b,0x8a,0x33,0xce,0x9f,0x2a,0xc6,0xb0,0x73,0x18,0xbe,0x47,0x6a, + 0x26,0x27,0x4,0x26,0x16,0x58,0x89,0x35,0x29,0x62,0x38,0x8e,0x99,0x74,0x85,0xb3, + 0xd4,0x5a,0x21,0xf4,0x22,0xeb,0xff,0x66,0x1d,0x2f,0x34,0x2e,0xa2,0x8c,0xf,0xbb, + 0x7e,0xfe,0x94,0xd9,0x73,0xb,0x83,0x18,0x3,0xb3,0x93,0x49,0x68,0x20,0x3b,0x89, + 0x2b,0x63,0x28,0xa3,0x44,0xf8,0x8a,0x2d,0xe6,0x9e,0x53,0x94,0x9c,0xce,0x25,0xd1, + 0x37,0xfc,0xf4,0x5a,0x39,0x47,0x3f,0x7e,0xfd,0x2c,0x7d,0xe7,0xca,0x34,0x5d,0x3e, + 0x33,0x42,0xd3,0xc3,0xe5,0xbe,0x26,0xb,0x49,0xd3,0xc9,0xce,0x61,0x3,0xab,0x3b, + 0x75,0xac,0xed,0x1e,0x63,0x6d,0xf7,0x8,0xdb,0x87,0xd,0xd4,0x1b,0x2d,0x34,0x4e, + 0x43,0xdf,0xee,0xd5,0xdd,0x23,0x6c,0xee,0x9f,0xa0,0xd5,0x9,0x3c,0x6d,0x7e,0x8c, + 0xde,0x68,0xaf,0x67,0xf8,0x39,0x69,0x5,0x5c,0x9d,0x1b,0xa7,0xef,0x5c,0x99,0x45, + 0xa5,0x98,0x8b,0x91,0x90,0x64,0x53,0xd1,0x38,0xed,0xe0,0xe1,0xea,0x1e,0x1e,0xae, + 0xec,0x62,0xa7,0x7e,0x2a,0xc8,0xbf,0xf0,0xac,0x55,0xbd,0xda,0xe6,0x71,0x21,0xc2, + 0x1f,0x2a,0x9b,0x56,0xb8,0x3a,0x3f,0x86,0x3f,0x7e,0xe3,0x2c,0x7d,0xef,0xfa,0x2c, + 0xa6,0xf4,0xb5,0xf8,0xe7,0xe8,0xb4,0x43,0xb8,0x32,0x6c,0x30,0xf6,0xea,0xd,0xaf, + 0xa0,0x7b,0xb8,0xaf,0xe1,0x41,0x69,0x8b,0x44,0x56,0x1,0x9c,0xd3,0x6,0xb1,0xc, + 0x75,0x84,0x4d,0xc3,0x21,0x89,0x50,0xd9,0x7d,0x57,0xd8,0x7c,0x2a,0x9b,0xf8,0x1e, + 0xf3,0x1b,0x25,0x49,0x6c,0x26,0x6d,0x10,0x65,0xb2,0x48,0x49,0xb8,0x79,0x13,0x45, + 0x30,0x69,0xcf,0x2,0xc2,0x74,0xe1,0x7b,0x47,0xa7,0x38,0x3e,0xed,0x60,0xfb,0xf0, + 0x4,0xa5,0x5c,0x16,0xa5,0x42,0x6,0xa5,0x5c,0x6,0xf9,0x5c,0x6,0xa5,0x7c,0x6, + 0x3,0x85,0x2c,0x2a,0xc5,0x1c,0xaa,0x3,0x39,0xc,0x16,0x73,0x18,0x2c,0xe5,0x30, + 0x58,0xc8,0xa1,0x52,0xca,0xa1,0x98,0xcb,0xa0,0x56,0x2e,0x60,0xa0,0x90,0x49,0xe4, + 0x62,0xf4,0xbb,0xb6,0x51,0xa2,0xd2,0xfc,0x78,0x15,0xdf,0xba,0x3c,0x45,0x8f,0xd7, + 0xf7,0xb9,0x7e,0xd2,0x76,0xdb,0x36,0x52,0x8e,0x6d,0x15,0xc9,0x26,0x25,0x44,0x61, + 0x6b,0xb3,0x58,0x96,0x4,0x1a,0x46,0x3e,0x9b,0xc1,0xe5,0xd9,0x11,0x8c,0x55,0x4a, + 0x2f,0xe4,0x89,0x74,0xba,0x3d,0x6c,0xee,0x9f,0x60,0x79,0xe7,0x8,0x47,0x8d,0x76, + 0x3c,0x3b,0x17,0x9e,0x9b,0x50,0x4,0x1e,0xb4,0x96,0x8b,0xfa,0xc7,0x61,0xf7,0x1f, + 0x65,0xc8,0xc6,0xe4,0x1b,0x1d,0x92,0x58,0xb6,0x9b,0xfd,0x82,0x4,0xda,0x3c,0x2b, + 0x2e,0x21,0x44,0xd5,0x3f,0xca,0xf4,0xc8,0x0,0x5e,0x3f,0x3f,0x41,0xdf,0xbd,0x3a, + 0x8b,0x1b,0x67,0xc7,0x68,0x5c,0x18,0xab,0x7c,0x53,0xc0,0xc9,0x7b,0xb7,0x9e,0xe3, + 0x9f,0x3e,0x5f,0xe4,0xa7,0xeb,0x7,0xdc,0xe9,0xb1,0x60,0x74,0x38,0xc6,0x36,0x9, + 0x67,0x2f,0x39,0x3c,0xb1,0x74,0xb0,0x91,0xa8,0xa5,0x16,0xe8,0xc9,0xb6,0x32,0x52, + 0x42,0x18,0x60,0xa4,0x88,0xa8,0x36,0x90,0xc7,0xe4,0x70,0x19,0x95,0x52,0x2e,0x51, + 0x15,0xf1,0x2f,0x5,0xbb,0x2b,0x15,0x2a,0x16,0x16,0xb7,0xea,0x58,0xd9,0x3d,0x6, + 0x18,0xd1,0x55,0xaa,0x54,0x93,0xc0,0xbd,0xa,0x70,0x66,0x41,0x2c,0x86,0x56,0x6d, + 0x61,0xca,0x96,0x4a,0x21,0xdd,0xef,0x5c,0x9c,0xa9,0xf6,0x79,0x61,0xc3,0x20,0xd0, + 0x45,0x3d,0x94,0xc2,0x98,0xec,0x73,0x3d,0xbd,0x87,0x5f,0x8e,0x58,0xef,0xd7,0x99, + 0xc8,0xb1,0xe1,0xd9,0x4c,0xe1,0x6,0xd5,0xf,0x1b,0x2f,0x6f,0x32,0x27,0x29,0x8f, + 0x65,0xf6,0x6c,0x15,0xc9,0x6a,0xbd,0x85,0xbd,0xb5,0x20,0x91,0xa9,0x8,0xdf,0x89, + 0xe4,0x4,0x4c,0x24,0x32,0xcf,0x59,0x24,0x27,0xc6,0x1c,0x33,0x1c,0x91,0x40,0xc0, + 0xea,0xc6,0x32,0xd6,0xd3,0xab,0xdb,0x3c,0x74,0xf2,0x5,0xe0,0x2c,0xe3,0x84,0x2c, + 0xbe,0xaf,0x22,0x50,0x91,0xf9,0x7c,0x3f,0x81,0xdd,0xb7,0x36,0x25,0xb1,0xd3,0x12, + 0xb6,0x15,0x4a,0x79,0x9a,0x66,0xb2,0x8a,0x31,0x44,0x82,0xb2,0x52,0x9a,0x67,0xae, + 0xef,0x80,0x94,0xf1,0xc,0x21,0x6d,0x1e,0x63,0x64,0x67,0x5a,0x6f,0xe,0x41,0x72, + 0x13,0xc5,0x9c,0x28,0x61,0x7f,0xee,0xb2,0x44,0x48,0x3c,0xe9,0x9e,0xfb,0xbb,0x79, + 0xb8,0x33,0xe9,0x14,0x46,0x2b,0x5,0x7a,0xf5,0xfc,0x4,0xfd,0xd5,0x3b,0x97,0xe8, + 0xfa,0xfc,0x18,0x99,0x4e,0x3d,0x6a,0x69,0xe8,0x3b,0x7a,0x75,0xd1,0x68,0x77,0xd1, + 0x38,0xed,0x60,0xef,0xa8,0x81,0xa7,0x6b,0x7,0x78,0xb2,0xb1,0x87,0x67,0xeb,0x7, + 0x78,0xba,0x76,0x80,0xb5,0xbd,0x63,0x74,0x7a,0x3d,0x91,0x27,0x65,0xbf,0x88,0x20, + 0xbf,0x59,0x87,0xc,0x78,0xd6,0xf8,0x9a,0x74,0x9f,0x49,0x2b,0xcc,0x8c,0xc,0xd2, + 0x85,0x99,0x21,0x8c,0xd5,0x4a,0x1e,0x94,0x9d,0x74,0x0,0x3d,0x59,0xdf,0xc7,0x47, + 0xf7,0x56,0xb1,0xb2,0x7b,0x62,0xd,0xdd,0x10,0x63,0x5e,0x46,0x36,0x7c,0x4,0x8f, + 0x84,0x97,0x22,0xc2,0xc5,0xd9,0x61,0xfc,0xf8,0xf5,0x79,0x7a,0xf7,0xc6,0x1c,0x66, + 0xc7,0x6,0x13,0x77,0x6b,0x2f,0x73,0x28,0x74,0x7b,0x3d,0xac,0xee,0xd6,0xb1,0xb1, + 0xdf,0x8,0x3d,0x8c,0x8d,0x59,0x88,0xa4,0x57,0xc0,0xa5,0xc5,0xf9,0xe6,0xb2,0x64, + 0x38,0x71,0x2c,0xf8,0xce,0xb2,0x23,0x65,0x41,0xe6,0x34,0x11,0xa1,0xf2,0x1e,0x63, + 0x6f,0x70,0x37,0xe0,0x87,0x72,0x71,0x5b,0xee,0xf6,0x90,0x50,0x19,0x25,0x38,0xdc, + 0x23,0x62,0xb9,0xe9,0x8a,0x4a,0xbb,0x1b,0x60,0xb7,0xde,0xc2,0x2e,0x5a,0x9,0x82, + 0x13,0xc6,0x40,0x21,0x83,0x91,0x4a,0x9,0xa3,0x95,0x2,0x6a,0xe5,0x2,0x46,0xca, + 0x5,0xd4,0xca,0x79,0x54,0x4a,0x79,0xc,0xf,0xe6,0x31,0x5e,0x1b,0xc0,0x58,0xa5, + 0x88,0x6a,0x39,0x8f,0x6c,0x2a,0xa5,0xd3,0x3f,0xe9,0x1b,0xa7,0x74,0xd3,0xd0,0x8d, + 0xf,0x95,0x70,0xf5,0xcc,0x8,0xca,0xc5,0x3c,0x81,0xea,0xec,0xb2,0xb3,0x25,0x82, + 0x9e,0xb0,0x63,0x93,0x8d,0x95,0x3f,0x76,0xd8,0xbd,0x6d,0xb5,0x9c,0xc7,0xf4,0x48, + 0x19,0x25,0xdd,0x74,0xf4,0x73,0xb8,0x3b,0x6a,0x76,0x70,0xe7,0xf9,0x36,0x9e,0x6f, + 0xd5,0xc5,0xc5,0x57,0x3e,0xc9,0x93,0x3d,0x2e,0xbd,0x3d,0xd3,0xd9,0xa6,0xf1,0xb2, + 0x64,0x32,0xda,0x30,0xb8,0x58,0xc2,0x40,0xd4,0x72,0x83,0x64,0x79,0x24,0x8a,0x4, + 0xd7,0xb8,0x3e,0xf,0x40,0x36,0x97,0xa6,0xf1,0x6a,0x9,0x6f,0x5f,0x9d,0xa1,0xef, + 0x5f,0x9f,0xa5,0xef,0x5d,0x9f,0x49,0x8c,0xf9,0x4c,0x7a,0xb6,0x5a,0x9d,0x1e,0x16, + 0x37,0xe,0xf0,0x5f,0xbe,0x58,0xe4,0xf7,0xbf,0x7a,0xce,0xf5,0x46,0x1b,0x91,0x54, + 0x75,0xf7,0xbb,0x12,0x23,0x9a,0x6f,0xc9,0x90,0xd2,0x60,0x4b,0x54,0x94,0xc,0xe, + 0x93,0xe3,0x20,0xac,0xa0,0xe4,0x34,0x4f,0xc8,0xe7,0xd2,0x38,0x37,0x3d,0x84,0xe9, + 0xe1,0x72,0x6c,0xf5,0x17,0xcd,0x1d,0x4f,0x5a,0x1,0xf6,0xe3,0x78,0x24,0x21,0x48, + 0xf9,0x4c,0x1a,0xe3,0xd5,0x12,0x66,0x47,0xca,0x58,0xdd,0x3e,0xc2,0xd1,0x69,0x3b, + 0xe4,0x9a,0x8b,0x9f,0x47,0xd9,0x4a,0x6c,0xfc,0xa1,0x64,0x8a,0x10,0xb3,0x74,0x3a, + 0x52,0xd6,0xff,0xc0,0x90,0x1c,0x54,0x38,0x51,0x33,0x84,0xc7,0x78,0x10,0xa6,0xab, + 0x5,0x2e,0x5d,0x2d,0xfc,0x82,0x81,0x99,0xd4,0x9d,0x84,0x8d,0xc8,0x34,0x0,0x81, + 0x25,0x24,0x84,0xd6,0x83,0x2e,0x8a,0x17,0x6c,0x21,0x78,0xc7,0x44,0xf,0x23,0xcf, + 0x3c,0x37,0x4d,0xb6,0x56,0xaf,0xf2,0x9c,0xb4,0x16,0xd3,0x1c,0xad,0x89,0xe4,0x42, + 0xc7,0xbc,0x2b,0x61,0xd5,0xa2,0x76,0xdf,0xe4,0x37,0x7c,0x4,0xcf,0x21,0xe,0x88, + 0x36,0x63,0xe4,0x7,0xa,0x4a,0x14,0x95,0x84,0x97,0x3b,0xf7,0x11,0x90,0x59,0xb3, + 0x18,0x92,0xd4,0x29,0xf6,0xb9,0xea,0x76,0xea,0x96,0xbc,0x64,0x65,0x33,0x1a,0x7d, + 0xd6,0xb2,0x18,0x8,0x95,0x7e,0x88,0x95,0x43,0x34,0x59,0x59,0xca,0xbc,0x35,0x8f, + 0x62,0x8f,0x79,0x6e,0x25,0x68,0x66,0xda,0xd6,0x91,0xb0,0x21,0x8c,0xae,0xed,0xe3, + 0x54,0x78,0x77,0x84,0xbc,0x76,0xfd,0x99,0x51,0xa6,0xbb,0x4b,0x51,0xb3,0x39,0x2b, + 0x6c,0xcc,0x6a,0x6c,0xae,0x79,0x4a,0x11,0x16,0x26,0xaa,0xf4,0x97,0xdf,0xbd,0xa8, + 0x7e,0xf8,0xea,0x2,0x85,0x81,0x4,0xea,0x85,0x13,0x93,0xb9,0xd5,0x96,0x77,0xea, + 0xf8,0xe4,0xfe,0x1a,0x3e,0x7f,0xb2,0x81,0xc7,0x6b,0xfb,0x38,0x6a,0xb4,0xd1,0x6c, + 0x77,0xd0,0xed,0x85,0x11,0x8a,0x3d,0x23,0x61,0x61,0x3f,0x4b,0x5e,0x18,0xc4,0x3b, + 0xb3,0xc,0x5b,0xe4,0xd8,0x82,0x6,0x4,0x60,0xb4,0x5a,0xc2,0x1f,0xbc,0x72,0x6, + 0x33,0xa3,0xe5,0x44,0x98,0x36,0xfa,0x10,0x7e,0xfe,0x78,0x3,0x3f,0xfb,0xe4,0x9, + 0xe,0x4f,0x4e,0xe3,0x43,0x66,0xd4,0xc1,0x88,0x7d,0x9b,0x74,0x73,0xec,0xbc,0x71, + 0x69,0x8a,0x7e,0xf8,0xea,0x3c,0xfe,0xf8,0xcd,0x73,0x18,0xad,0x14,0xfb,0x1e,0x76, + 0x2f,0x3,0xb9,0xf7,0x2,0xc6,0xfa,0xde,0x31,0x36,0xf7,0x8e,0xd,0x81,0x82,0x41, + 0x46,0xe6,0x49,0x21,0x51,0x55,0xac,0x6e,0x38,0xa0,0x98,0xcd,0x91,0x34,0x7d,0x77, + 0xd6,0x66,0x48,0x82,0x1d,0x48,0x5c,0x44,0x6f,0x79,0xc4,0xa6,0x4c,0x18,0x9c,0x57, + 0x99,0x48,0x46,0x8,0x67,0x64,0x87,0xe3,0x33,0xa4,0x19,0x94,0x53,0x86,0x40,0x28, + 0x35,0x64,0xc5,0x90,0xbe,0xe,0x10,0xad,0x1a,0x93,0xc2,0xc9,0x69,0xf,0xad,0xee, + 0x31,0x36,0xf7,0x4f,0xa0,0x94,0x42,0x26,0x15,0x82,0x4e,0x69,0x22,0xa8,0x94,0x42, + 0x2e,0x93,0xc2,0xf,0x6e,0x9e,0xc1,0x1f,0xbd,0xb1,0x80,0xb3,0x13,0x35,0xc,0x68, + 0x8b,0xd1,0x97,0xd5,0x4,0xe7,0x33,0x69,0x8c,0x56,0x4b,0xc8,0x66,0x52,0xa2,0x10, + 0x21,0x9e,0x21,0xe0,0x5d,0x46,0x11,0x16,0x11,0xf1,0x44,0x37,0x9f,0x5b,0x2a,0x64, + 0x69,0x6a,0xa8,0x8c,0x1,0x91,0x7b,0xdd,0xef,0xed,0xb8,0xd9,0xc2,0x27,0xf,0xd6, + 0xb1,0xb4,0x7d,0x28,0xe0,0xf5,0xe8,0x2e,0xc7,0xe1,0x30,0x32,0x88,0x85,0xac,0xdb, + 0x95,0x22,0x7,0x7b,0x3a,0x74,0x9a,0x88,0x22,0xf1,0x18,0xc9,0x4c,0x3e,0x7f,0xee, + 0x89,0x7a,0x5b,0x30,0x8a,0xb9,0xc,0xfd,0xc1,0x2b,0x67,0xe8,0x8f,0xdf,0x5c,0xc0, + 0x85,0xa9,0x1a,0x8d,0x55,0x4b,0xb1,0xb5,0xd5,0x8b,0x62,0x76,0x3f,0x7e,0xb0,0x86, + 0xff,0xe7,0x83,0x7,0x7c,0xfb,0xe9,0x36,0x1f,0x36,0x5b,0x6e,0x2d,0x24,0x8f,0x7d, + 0x4b,0x8a,0x93,0x33,0x83,0xc4,0x69,0xc9,0xf3,0xb4,0x83,0x7,0x47,0xd8,0x9f,0x9c, + 0xe5,0xe9,0x2e,0x6f,0x83,0x42,0x2e,0x8b,0xcb,0xb3,0x23,0x98,0x18,0x2a,0xbd,0x70, + 0x55,0xd3,0x4f,0x2f,0x9e,0x64,0x62,0xd4,0x8f,0x14,0x57,0x29,0xe5,0x70,0xf3,0xdc, + 0x38,0x86,0x6,0xb,0xb8,0x3c,0x3b,0x8c,0xbf,0x7e,0xef,0x1e,0xb6,0xe,0x9a,0x31, + 0xaf,0x71,0x37,0xd0,0x45,0x3c,0x4b,0xc4,0x9a,0xd7,0xba,0xc0,0x9,0xfb,0x54,0x69, + 0x6e,0x64,0x18,0xb1,0x6c,0xa2,0x52,0xd,0x57,0x35,0xd0,0x8b,0x7a,0x56,0x1c,0x84, + 0x3c,0x5,0x6,0x98,0x3,0x92,0x96,0xb0,0xfa,0xca,0x7,0x5a,0x96,0xa6,0x34,0xdf, + 0x46,0xbb,0xca,0x19,0xdd,0xbb,0x26,0x61,0xda,0x9d,0xb9,0x48,0xeb,0x66,0x8f,0xc7, + 0x14,0xa7,0xf1,0x79,0xea,0x2d,0xb3,0xbf,0x22,0x19,0x4e,0x22,0x12,0xf0,0xc,0x64, + 0x1f,0x11,0x8b,0xf8,0x13,0x78,0xc,0x1a,0x8d,0xb,0xd5,0xcc,0xf4,0xee,0x40,0x36, + 0xcd,0x72,0xb7,0xd1,0x5c,0x92,0xcd,0x9c,0xb8,0xad,0x85,0x10,0xe8,0x1,0x3e,0x49, + 0xc3,0xc0,0xef,0x22,0x15,0xd,0x11,0x82,0xa,0x27,0x13,0xec,0x9c,0xbd,0xa2,0x15, + 0x7f,0x8a,0x27,0xcd,0x4,0x30,0xeb,0xb9,0xda,0xec,0xc6,0xc3,0xb8,0x34,0xe3,0xec, + 0xa6,0x8b,0xb4,0x49,0x49,0x53,0x26,0xea,0x54,0xbb,0xc4,0x69,0xa6,0x3b,0x19,0xa3, + 0x19,0x3b,0x7b,0x29,0x2f,0x21,0xcd,0xfa,0xca,0x84,0xa7,0x72,0x75,0x20,0x47,0xd7, + 0xe7,0xc7,0xe8,0x3b,0x57,0xa7,0xe8,0xdd,0x57,0xe6,0x68,0x76,0x6c,0xb0,0x6f,0x24, + 0xa2,0xf9,0xd8,0xfe,0xd1,0x29,0x96,0x77,0xea,0x78,0xb2,0xb6,0x87,0x47,0xab,0x7, + 0x16,0xde,0x3e,0x38,0x6e,0x45,0x77,0x62,0x0,0x29,0x93,0xe8,0x64,0xad,0x70,0x9d, + 0x19,0x86,0xd0,0xb4,0x44,0x53,0xea,0xc5,0xc9,0x3b,0x5e,0x2d,0xe1,0xed,0x2b,0xd3, + 0x98,0x19,0xad,0xc4,0xa,0xaa,0xec,0xc2,0x4f,0x3b,0x5d,0x3c,0xdf,0x38,0xc4,0xbd, + 0xa5,0x1d,0xac,0xef,0x9f,0x38,0xbe,0x9f,0xf7,0xfd,0x5c,0x6,0x3a,0x5b,0x84,0xd3, + 0x91,0xd3,0xb2,0xe9,0x14,0x2e,0xce,0xc,0xe1,0xc7,0xaf,0x9d,0xc5,0x3b,0xd7,0x66, + 0x30,0x5a,0x29,0xc6,0xa,0x79,0x74,0x9f,0x98,0x24,0xa9,0x92,0x13,0x4f,0xb7,0x17, + 0x60,0x73,0xff,0x84,0xb7,0xea,0x4d,0x8,0x42,0x8c,0x4f,0xa,0x91,0xe5,0x9b,0x44, + 0x18,0x42,0xe4,0x94,0xd1,0xdf,0x8b,0x23,0x46,0x49,0x6c,0xf0,0x72,0xc4,0xd2,0xc4, + 0xf5,0xdf,0x5b,0x62,0x49,0x68,0x7a,0x6c,0x55,0x9b,0xa,0x2e,0xfa,0x56,0x49,0xe7, + 0x27,0x78,0xf0,0x19,0x47,0x5a,0x55,0x26,0xc4,0xe3,0x6b,0xe5,0xc1,0x28,0x8c,0x79, + 0xcc,0xcb,0xdb,0xed,0x5,0x61,0x54,0x25,0x7a,0x51,0x3d,0x2e,0x0,0xe0,0xa3,0xfb, + 0x6b,0xa8,0xe,0x14,0x30,0xa2,0x95,0x14,0xff,0x5c,0x36,0x72,0x3e,0x93,0x46,0x4a, + 0x91,0xab,0x89,0x81,0x1e,0x4,0x58,0x6e,0x5d,0xc8,0x13,0xfa,0x4a,0x8f,0x69,0x61, + 0xe8,0xe,0x22,0x20,0xa5,0x80,0x99,0x91,0x41,0x9c,0x19,0x1d,0x44,0x26,0xa5,0x12, + 0x35,0xf1,0xf2,0xb9,0xd8,0x39,0x6c,0xe0,0xde,0xd2,0x2e,0x36,0xf6,0x1b,0x36,0x59, + 0x1,0xcc,0x6c,0xd2,0x1,0x85,0x60,0x26,0xe2,0xc,0x68,0x50,0x67,0xe7,0xbd,0xe5, + 0x9d,0xaa,0x94,0x9c,0xf8,0xcc,0xf0,0x51,0x25,0xf2,0x3c,0x17,0x5,0xa5,0x9c,0x80, + 0xb1,0x4a,0x91,0xe6,0xc6,0x2b,0xb8,0x34,0x5d,0xa3,0xb7,0x2e,0x4f,0xe3,0x8d,0xb, + 0x93,0x24,0xd7,0x1c,0xf2,0x39,0x92,0x72,0x2d,0xb7,0x4b,0x3e,0xc5,0x57,0x4f,0xb6, + 0xf8,0xbf,0x7c,0xf1,0xc,0x9f,0x3e,0xd8,0xe0,0xa3,0x66,0x1b,0xe,0xce,0x95,0x21, + 0x70,0x24,0xf,0x61,0xb6,0x26,0x62,0x32,0xf2,0x8e,0x1c,0x63,0x4c,0x46,0x1b,0x9b, + 0x19,0xc3,0xde,0x3a,0x5e,0xa6,0xb0,0xdb,0xd3,0xe6,0xb2,0x69,0x5c,0x98,0x1e,0xb2, + 0xaa,0x83,0xa4,0x9,0x3c,0xe9,0x63,0xcd,0x56,0x7,0xed,0x6e,0xf,0xa5,0x5c,0x6, + 0xa9,0x94,0x8a,0x71,0x7f,0x92,0xa,0x7b,0x2a,0xa5,0x50,0xca,0x67,0x70,0xe5,0xcc, + 0x8,0x32,0x99,0x14,0x9a,0xed,0x1e,0x3e,0xbc,0xb7,0x86,0x87,0xab,0xbb,0x68,0x77, + 0x5,0x13,0xcb,0x79,0x9,0xd8,0x2,0x67,0x76,0x61,0x24,0x55,0x2c,0x66,0x2c,0xd, + 0xe0,0xed,0x96,0x6d,0x5c,0xb9,0x9,0xfe,0x0,0x99,0x1d,0x3c,0xeb,0x50,0x1f,0x3d, + 0x77,0x5b,0xbf,0x38,0x56,0xe1,0xfe,0x98,0x3,0xe3,0x41,0xa3,0x39,0x2d,0xa1,0xdf, + 0x9b,0xc9,0x38,0xb7,0x93,0x3c,0x2c,0x54,0xf,0xc9,0xcf,0x61,0xfb,0xa3,0xb3,0xb4, + 0xbf,0x76,0xad,0xba,0x97,0x9c,0xea,0x3d,0x2f,0x42,0x3c,0xcb,0xb1,0x50,0x71,0x73, + 0xe6,0xaa,0x58,0x52,0x1b,0x93,0xef,0x2b,0xc2,0xbe,0x46,0xd3,0x5d,0xe,0x7b,0xfd, + 0x94,0x9b,0xf4,0x75,0xf,0x9e,0x76,0x9e,0x86,0x7e,0x8c,0x34,0xc5,0x58,0x95,0x7e, + 0x97,0x42,0x71,0x17,0xed,0x98,0x22,0x9e,0x12,0xc2,0x36,0x8d,0x56,0x88,0xbc,0x67, + 0x56,0x7c,0x9,0x4d,0x65,0x63,0x16,0xe9,0x66,0xca,0x14,0x5c,0x63,0xe4,0x42,0x76, + 0x1f,0x2e,0x18,0xeb,0xc6,0x20,0x46,0x19,0xd2,0x1b,0xe9,0xe0,0x95,0xf0,0x9,0xb4, + 0x96,0x3d,0x44,0xd0,0xb2,0x35,0x17,0xea,0x2a,0xac,0x64,0x15,0x15,0xf3,0x69,0xfa, + 0xf6,0xe5,0x29,0xfa,0xa3,0x37,0xcf,0xd1,0xf,0x6e,0x9c,0xa1,0x6c,0x26,0x1d,0x7b, + 0x40,0xa2,0x9d,0x6f,0xb3,0xd5,0xc1,0x97,0x4f,0x37,0xf1,0xeb,0x5b,0x4b,0xf8,0xcd, + 0xed,0x25,0xec,0xd4,0x4f,0x1d,0xa4,0xe8,0x1d,0x56,0xd1,0x13,0x49,0xb4,0x81,0x91, + 0x50,0x72,0x7b,0x63,0x58,0x5,0x85,0x54,0xfa,0x31,0xc6,0x6a,0x3,0xb8,0x3e,0x3f, + 0x86,0x9a,0xb6,0xdc,0xec,0x97,0xa4,0xb4,0xb5,0xdf,0xc0,0x7b,0xb7,0x96,0xf0,0x78, + 0xfd,0x40,0x18,0x79,0xb0,0xff,0xfd,0x28,0x82,0x2,0x58,0xf2,0x78,0xf8,0xa7,0xcb, + 0xb3,0x23,0xf8,0xf1,0xeb,0x73,0xf8,0xd1,0x6b,0x73,0x18,0xab,0x96,0xfa,0xc2,0x75, + 0xfd,0xc8,0x81,0x49,0xa8,0x41,0x10,0x30,0x76,0xe,0x9b,0xd8,0xab,0x9f,0x72,0xe0, + 0x4,0x9d,0xce,0x37,0x43,0xeb,0x5c,0x14,0x52,0x42,0x66,0xce,0x1,0xc9,0x86,0x91, + 0x85,0x69,0xa2,0x48,0x99,0x52,0x1e,0xba,0xc4,0xe2,0x95,0x96,0x7d,0xa9,0xd1,0x31, + 0x29,0xf3,0xfb,0xb3,0xe5,0xe5,0x85,0x10,0x20,0x93,0xb,0xc4,0x46,0x3c,0xa6,0x40, + 0x10,0x4a,0x5d,0xc2,0xad,0xdb,0x8d,0x9a,0x6b,0xcc,0xfe,0x9e,0x4b,0x4e,0xbf,0xa4, + 0x12,0x24,0x2b,0xd2,0x35,0x12,0xc0,0xda,0xee,0x31,0x3e,0x7d,0xb8,0x86,0x77,0xae, + 0x4e,0x63,0x32,0x12,0x94,0xf1,0x32,0x48,0x48,0xab,0xd3,0xd5,0xc7,0x95,0x72,0xe5, + 0x8c,0x12,0xfc,0xc3,0x6d,0xae,0x83,0x8a,0xf9,0x48,0x90,0x73,0x86,0x40,0x8a,0x14, + 0xe6,0x27,0x2a,0x98,0x9f,0xa8,0x40,0xa5,0xe8,0x5,0x56,0xa0,0x8c,0xd3,0x76,0x17, + 0xab,0xbb,0xc7,0x58,0xda,0x3d,0x42,0x37,0x80,0x34,0x61,0xf3,0x24,0xae,0xfa,0x98, + 0x34,0x7e,0x8c,0xb2,0xff,0x31,0xb1,0xf,0x82,0xc6,0x23,0x8e,0x57,0x9b,0x9c,0xea, + 0x8e,0x58,0xb2,0x75,0x48,0xc9,0xfb,0x3c,0xea,0x61,0x4b,0x95,0x62,0xe,0x6f,0x5f, + 0x9d,0xa1,0x3f,0xbc,0x31,0x8b,0xb7,0x2e,0x4d,0x91,0x41,0x1b,0x92,0xdc,0xd3,0xa2, + 0xcf,0x7c,0x10,0x4,0x8,0x2,0xc6,0xfd,0xe5,0x5d,0xfe,0xf,0x3f,0xbf,0xc3,0x77, + 0x97,0xb6,0x75,0xe8,0x8a,0x2d,0x58,0xec,0xc7,0xb,0x31,0xfb,0x26,0x97,0x92,0x38, + 0x6c,0xe0,0x4c,0x5,0x23,0xc1,0x90,0xfe,0x79,0x6c,0x9c,0x60,0xa3,0x3e,0x7f,0x26, + 0x5e,0x51,0x3f,0xa3,0xa5,0x7c,0x6,0xf3,0x13,0x15,0x8c,0xd7,0x8a,0xdf,0x8,0x99, + 0x9b,0xfb,0xb3,0xdd,0xe9,0xe1,0xc9,0xc6,0x1,0x8e,0x9b,0x1d,0x4c,0xd4,0x8a,0x18, + 0x1a,0x28,0xa0,0x5c,0xcc,0x7e,0x23,0xf2,0x23,0xaf,0xc9,0xc2,0x58,0x5,0xff,0xe3, + 0x8f,0xaf,0x63,0x72,0x78,0x0,0xff,0xd7,0x7b,0xf7,0xf1,0x7c,0xab,0x8e,0xd3,0x76, + 0x4f,0xfe,0x7e,0x2,0x84,0x20,0x27,0xc4,0x87,0x67,0x67,0xaf,0x69,0x31,0x2a,0x4c, + 0x3a,0xd,0x3c,0x12,0x9c,0x78,0xd5,0x9d,0x63,0xa6,0x29,0xe5,0x52,0x8a,0xcd,0x70, + 0x5,0x3e,0x7c,0xfd,0x3,0xb6,0x44,0x3a,0xdb,0x50,0xeb,0xc1,0x41,0x5,0x3a,0xd1, + 0x4d,0xa7,0xa5,0x2b,0xc1,0xf9,0x32,0xaf,0x9e,0x82,0x88,0xc0,0x6,0x8c,0x14,0xc4, + 0x86,0x7,0xb0,0xaf,0xaa,0xf0,0x66,0x76,0x46,0x1c,0x32,0x8f,0xb,0x85,0x11,0x63, + 0x8c,0xc8,0x6b,0xcd,0xf1,0x8d,0x58,0x6c,0xb8,0x13,0x4a,0xef,0x74,0xd4,0xd2,0xd5, + 0xcb,0x51,0x14,0xb0,0x80,0xb5,0xee,0x22,0x69,0xb1,0xc5,0x91,0xd8,0x16,0x17,0x5d, + 0xe8,0x63,0x9d,0x10,0xe4,0x17,0xff,0x4f,0x1e,0xbb,0x9f,0x1c,0xcf,0x5d,0xcf,0xd0, + 0x92,0xcc,0x12,0x1a,0xc7,0x68,0x73,0x18,0x37,0xbf,0x2b,0x25,0x2c,0x60,0xad,0xeb, + 0x1b,0x4c,0xbe,0xb9,0xdd,0xa5,0x2b,0x4d,0x98,0xd3,0xb8,0x81,0x89,0x2e,0x62,0xab, + 0x4f,0x25,0x10,0xb0,0x30,0x51,0xa1,0xef,0x5e,0x9d,0xa5,0xef,0x5d,0x9f,0xa5,0x6b, + 0x73,0xa3,0xb6,0x98,0x27,0x11,0xdf,0x4c,0x8a,0xd2,0xed,0xc5,0x6d,0xbc,0x7f,0x7b, + 0x9,0xf,0xd7,0xf6,0xb0,0xbc,0x7d,0x84,0xdd,0xa3,0x53,0x50,0x44,0xe3,0x4d,0xe2, + 0xb0,0xf6,0x6b,0x3,0x79,0xf2,0x6,0x7f,0x8f,0x29,0xcc,0x77,0x4,0xa7,0x30,0x95, + 0x26,0x4c,0xd6,0xca,0x38,0x3f,0x55,0x43,0x29,0x9f,0x7e,0x21,0x49,0x7,0x0,0xd6, + 0xf7,0x4e,0xf0,0xfe,0xd7,0xcb,0x58,0xda,0xaa,0x47,0xa4,0x24,0x72,0x70,0x55,0xae, + 0xf3,0x87,0x33,0x44,0xc8,0xa6,0xd2,0xb8,0x38,0x5d,0xc5,0x4f,0xdf,0x5c,0xc0,0x1f, + 0xde,0x9c,0xb3,0x30,0xbb,0x24,0xde,0x45,0x39,0x4,0xcc,0x8c,0x67,0x1b,0x7,0x8, + 0x18,0x98,0x19,0x29,0x27,0x3a,0xe5,0x59,0x8f,0xe7,0xe3,0x53,0xec,0x37,0x5a,0x7e, + 0x1e,0x91,0xbb,0x48,0x61,0x40,0xa2,0x67,0x4b,0x24,0x7c,0x1b,0x24,0xf6,0x6d,0x3a, + 0x5f,0x56,0xbe,0xc6,0x53,0xe8,0x29,0xc9,0x63,0x4b,0x89,0xd0,0x20,0x67,0x1e,0x61, + 0x13,0x31,0xd8,0x2d,0x73,0xe4,0x82,0x53,0xbc,0x6b,0x3d,0x48,0x1d,0xfb,0x8e,0x28, + 0x8c,0x7e,0x30,0x8d,0x2a,0xf9,0x39,0x5,0xa6,0x31,0xb3,0xcf,0x51,0x94,0x15,0x6b, + 0xaa,0xbe,0x8a,0xbd,0x90,0x0,0xa9,0x97,0x82,0xda,0xa3,0x53,0x58,0xb3,0xd5,0xc1, + 0xd6,0x61,0x3,0xad,0x6e,0x20,0x49,0x32,0x64,0x76,0x9,0x3e,0xad,0xd6,0x17,0xa1, + 0x2b,0x47,0x1,0xf6,0x59,0xee,0x2a,0x64,0xcf,0x2f,0x4c,0x54,0x91,0x4a,0xb0,0x3b, + 0x35,0x6f,0xdd,0x5e,0xf,0xf,0xd7,0xf6,0xf0,0x60,0x75,0x1f,0x2d,0x7b,0xc0,0xbb, + 0x62,0xce,0x88,0x3,0x57,0x10,0x81,0x6f,0x76,0x0,0xa1,0x50,0xa3,0x26,0xd,0xe2, + 0x5c,0x3a,0x9f,0x99,0xc,0xd8,0x71,0x76,0x84,0xea,0x86,0x49,0x45,0x28,0x78,0x44, + 0x73,0xa3,0x65,0xdc,0x38,0x37,0x46,0xaf,0x9d,0x1b,0xc3,0xf9,0xc9,0x2a,0xcd,0x8c, + 0xc,0x62,0xa0,0x90,0xed,0x3b,0xc9,0x46,0x79,0x29,0x0,0xb0,0xb9,0x7f,0x82,0xf7, + 0x6e,0x2f,0xf3,0xfb,0x77,0x56,0xf8,0xc1,0xea,0x1e,0x1a,0xad,0x1e,0xcb,0x94,0x59, + 0x32,0x42,0x3a,0x72,0xd7,0x2c,0x60,0xf6,0x82,0xb3,0x7c,0x6f,0x30,0x43,0xe9,0xb3, + 0x61,0x85,0xce,0x38,0xd4,0x64,0x19,0x53,0xe4,0xd5,0x27,0xff,0x65,0x19,0xad,0x94, + 0x30,0x32,0x58,0x48,0x6c,0xb2,0xa5,0xcf,0x7a,0xb3,0xd5,0xc5,0xc3,0xd5,0x3d,0xdc, + 0x5f,0xdd,0xc3,0xe3,0xd5,0x7d,0xac,0xed,0x9f,0xa0,0xd3,0xe9,0xa1,0x5c,0xcc,0xe2, + 0xb5,0x85,0x71,0x7c,0xf7,0xda,0x34,0x16,0xc6,0x7,0x13,0x99,0xfc,0xd1,0xa8,0x54, + 0xad,0x2c,0xc6,0x40,0x21,0x8b,0xef,0x5d,0x9d,0xc1,0x60,0x31,0x8b,0x5f,0x7e,0xb9, + 0x84,0x4f,0x1f,0x6d,0x62,0xeb,0xb0,0x81,0x58,0xec,0x2b,0xe2,0x19,0xc,0x9e,0x53, + 0xb9,0x87,0x32,0xb3,0xe4,0x34,0x72,0x84,0x7a,0x2a,0x51,0x63,0x31,0x31,0x53,0x24, + 0xbe,0x54,0x81,0x10,0x18,0xc3,0x22,0x67,0x15,0x6b,0x29,0xe0,0xe6,0x36,0xd1,0xd3, + 0xa6,0xe7,0x7f,0x21,0x8c,0x61,0xac,0xbb,0x8b,0xf1,0xbe,0x8a,0x38,0xad,0x51,0x64, + 0x38,0x13,0x82,0xc9,0xe8,0x1a,0xd3,0x4f,0x42,0x89,0x5b,0xba,0x46,0xd3,0xa1,0x39, + 0xa6,0x20,0xa7,0x88,0xff,0xbb,0xfb,0x1a,0x69,0xfb,0x64,0x9,0x27,0x18,0x6b,0xaa, + 0xe4,0x99,0xc7,0xc8,0x7,0x3a,0x29,0x5b,0x4d,0x1f,0xa6,0xd4,0x27,0x4f,0x9d,0x89, + 0x92,0xba,0x11,0xb7,0x33,0x66,0x21,0xd6,0x53,0xe4,0x2,0x14,0x74,0xe2,0x7,0x89, + 0xf8,0xd2,0x30,0x30,0x4d,0x14,0xf2,0x50,0x43,0xce,0x26,0x7c,0x45,0x19,0xf1,0x93, + 0x8b,0x3e,0x35,0xff,0x2e,0x84,0xdf,0x4d,0xa4,0x13,0x81,0x52,0x61,0x81,0x4f,0x29, + 0xc2,0x68,0xb5,0x44,0xef,0xde,0x98,0xa7,0x3f,0x7a,0x63,0x81,0xae,0xcc,0xe,0x93, + 0x81,0x9f,0xa2,0xa4,0x12,0xe3,0xd1,0xbc,0x5b,0x6f,0xe2,0xfe,0xca,0x1e,0x7e,0xf9, + 0xd5,0x73,0xfc,0xe3,0xa7,0x4f,0xc3,0xae,0x94,0xd8,0x6f,0x84,0x90,0xd8,0x86,0xc5, + 0xff,0x26,0x76,0x4e,0x2b,0x24,0x3a,0x7c,0x10,0x90,0x49,0x67,0x70,0x7d,0x7e,0xc, + 0x17,0xa6,0x6b,0x48,0x29,0xe5,0x59,0x4f,0x4a,0xf9,0x50,0xaf,0x17,0xe0,0xf8,0xb4, + 0x8d,0x27,0xeb,0xfb,0x78,0xb0,0xb2,0x8f,0x4e,0x8f,0x23,0x3a,0x57,0xa7,0x44,0x70, + 0x84,0x32,0x16,0x84,0x34,0xc2,0xc2,0x44,0x5,0x3f,0xb8,0x39,0x8f,0x77,0xae,0xcd, + 0x60,0x66,0xc4,0x41,0x79,0x51,0x17,0x30,0x73,0x8,0xb6,0x3b,0x3d,0xac,0xef,0x9f, + 0xe0,0xb7,0x77,0x56,0x50,0x2c,0x64,0x30,0x34,0x10,0xa6,0xac,0x25,0x15,0xa2,0x5e, + 0xc0,0x61,0xe2,0x5c,0xb3,0xed,0xe9,0xec,0x61,0xd,0x45,0xfc,0x2c,0x1,0x8f,0x42, + 0xc4,0xde,0x8a,0xc7,0x6d,0x9f,0x84,0xa4,0x8d,0x62,0xad,0x2d,0x25,0x5c,0x6f,0xdf, + 0xfa,0x58,0xb0,0xa3,0xdd,0x27,0xa9,0x68,0xfa,0xa0,0x68,0x8b,0x5,0x49,0x9c,0x42, + 0xb7,0x31,0x4f,0x4b,0x1f,0xad,0x55,0x7d,0x27,0x1f,0x44,0xf9,0x26,0xee,0xfe,0x18, + 0xab,0x94,0x70,0x7e,0xaa,0x86,0x81,0x42,0xee,0xa5,0xf7,0xe7,0xe6,0x35,0xd9,0x3a, + 0x6c,0xe0,0xee,0xd2,0x2e,0x8e,0x4e,0xdb,0x31,0x64,0xc1,0xa2,0x13,0x49,0xa2,0x44, + 0xc1,0xe0,0x85,0x95,0x66,0x1b,0xdf,0x80,0x34,0x66,0x86,0xcb,0x98,0x19,0x2d,0x5b, + 0x47,0xbc,0x24,0x1d,0x7a,0xc0,0xc0,0xbd,0xe5,0x5d,0xdc,0x5d,0xda,0x45,0x60,0xd0, + 0x8,0xdf,0xe3,0x9a,0x20,0x23,0xa,0x7c,0x60,0x9d,0xed,0x4a,0xc8,0x8,0xcf,0x6d, + 0x54,0x84,0xcb,0x40,0x37,0xc3,0x30,0x94,0xf2,0x5d,0xd,0xd9,0x77,0xde,0xca,0x65, + 0xd2,0x94,0xcb,0x28,0x4c,0x8f,0x94,0xf1,0xda,0xd9,0x31,0xfa,0xfe,0x2b,0xb3,0xf8, + 0xf6,0xc5,0x49,0x92,0x9c,0x98,0x24,0x48,0xda,0x3c,0x4b,0xe6,0xef,0x4e,0xdb,0x1d, + 0xac,0xed,0x9d,0xe0,0xab,0xa7,0xdb,0xfc,0xb7,0xbf,0x7f,0xc2,0x77,0x9e,0xef,0xb0, + 0x98,0xa6,0xd8,0x1,0x5,0x7a,0x25,0x23,0xa4,0x81,0xd6,0x23,0xc1,0x63,0x84,0x47, + 0xd9,0x95,0xae,0x8c,0x5a,0x19,0x90,0xc0,0x4d,0x2c,0x92,0xc8,0x3a,0x78,0x40,0x1f, + 0x84,0x23,0x83,0x79,0x4c,0xf,0xf,0xa0,0x98,0xcd,0x24,0xaa,0x1d,0xe4,0xef,0xb3, + 0x7f,0x7c,0x8a,0xf,0xee,0xad,0xe1,0xfd,0x3b,0x2b,0x78,0xb0,0xb2,0xe7,0x20,0x2b, + 0x6,0xd6,0x76,0x4f,0xd0,0xe5,0x0,0x8d,0xd6,0x38,0x16,0xc6,0x6b,0x28,0xe6,0xd2, + 0x90,0xa1,0x73,0xde,0xeb,0x1b,0x89,0xc9,0x1d,0xaf,0x95,0xf0,0x93,0xda,0x2,0xd2, + 0x2a,0x85,0x54,0x2a,0x85,0xcf,0x1f,0x6f,0x62,0x63,0xff,0x4,0xbd,0xc0,0x71,0x0, + 0x48,0x42,0xc6,0x5e,0xbe,0x3b,0xe2,0xce,0x71,0x5a,0x78,0x4e,0x81,0x1f,0x7,0xe6, + 0xa0,0x70,0xa7,0x5c,0x95,0x83,0x91,0x85,0x33,0x34,0xab,0xe,0x2a,0x9c,0xd4,0x11, + 0x28,0x80,0x2,0x2d,0x7d,0xd,0x5c,0x40,0x18,0xfb,0x50,0x54,0x38,0xc4,0x9b,0xee, + 0x41,0xf9,0xcf,0xa7,0x8c,0x1b,0x67,0x47,0x54,0x83,0x35,0xfe,0x8a,0xa,0x8d,0xc9, + 0x5,0x41,0xab,0x38,0xad,0xc3,0xdf,0xa7,0x73,0x84,0xd,0xe2,0xef,0xe6,0x39,0x26, + 0x73,0xa7,0xd8,0x7a,0x3c,0x2d,0x40,0x67,0xb,0xc4,0x87,0x1,0x2d,0x4e,0xd,0xef, + 0xd4,0x40,0x92,0x90,0xe4,0x33,0x34,0x20,0x8,0xe9,0x49,0x26,0xf2,0x4c,0x11,0xdb, + 0x57,0x87,0xfd,0x92,0x8d,0x2a,0x24,0xab,0x42,0xb6,0x98,0x7a,0x88,0x53,0x99,0xf4, + 0x4,0x3b,0x7d,0xb,0xc8,0x3d,0x84,0xd7,0x39,0x2c,0xea,0x4a,0xf,0xe3,0x8a,0xd9, + 0x5,0xa0,0x92,0x4b,0x5c,0x95,0x60,0x23,0x48,0x69,0x22,0x1c,0x3,0x17,0x67,0x87, + 0xe9,0xdf,0x7d,0xff,0xb2,0x7a,0xfd,0xdc,0x4,0xcd,0x8c,0xc,0x58,0xcd,0x69,0x3f, + 0x28,0xf9,0xe1,0xea,0x3e,0xde,0xbb,0xbd,0x84,0xf7,0x6e,0x2f,0xe3,0xd9,0xe6,0x21, + 0xda,0x7a,0x2,0xf2,0x7c,0x87,0x11,0xd7,0xee,0xfb,0xb7,0xab,0x5f,0xd8,0x23,0xb7, + 0x72,0x8c,0x4c,0x62,0x3e,0x2b,0x9b,0x51,0xb8,0xb1,0x30,0x86,0x4b,0x33,0xc3,0x89, + 0xe4,0x37,0xf3,0x73,0xb7,0x3a,0x3d,0x7c,0xfc,0x70,0x1d,0x5f,0x3e,0xdd,0xd4,0xf, + 0x95,0x13,0x59,0x98,0x31,0x89,0xd9,0xef,0x88,0x1d,0x1e,0xb,0x5c,0x98,0xac,0xe0, + 0x7,0x37,0xe7,0xf0,0x97,0x6f,0x5f,0xc0,0xb8,0x66,0xd1,0x47,0xf7,0xe3,0xd1,0xef, + 0xff,0xc5,0xd3,0x2d,0xfc,0xc3,0x27,0x9,0xe9,0x44,0x0,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x4f,0xf1,0xdb,0xaf,0x97,0x71,0xe5,0xcc,0x8,0xde,0x38,0x37,0x8e, + 0x4a,0x29,0xa7,0x3,0xba,0x38,0xb6,0x22,0x3e,0x6a,0x76,0xd0,0xea,0x6,0xe1,0x61, + 0x17,0x88,0xde,0xcf,0x62,0xd4,0xae,0xe8,0x28,0xeb,0xfd,0xe0,0xb9,0x63,0x11,0x7, + 0xcc,0x82,0x8d,0xaf,0x25,0xbe,0x2e,0xcb,0xd6,0x8f,0x4,0x17,0x39,0x82,0x2,0xba, + 0x77,0x3b,0x56,0xe5,0xb3,0xed,0x3c,0x83,0x7,0x61,0x77,0x2b,0x39,0x2f,0xf2,0x40, + 0x17,0x8d,0x3,0x47,0xe4,0x60,0xb1,0xee,0x2e,0x29,0x7d,0x21,0xe2,0xa8,0x8,0x0, + 0x17,0x67,0x86,0xf0,0xc3,0x9b,0x67,0x30,0x54,0xce,0x7f,0xa3,0x14,0x29,0x4a,0x6e, + 0x7a,0xb6,0x71,0x88,0xf,0xee,0xae,0x21,0x4c,0xd7,0xa3,0x3e,0x3f,0x0,0xc1,0xf7, + 0x3,0x27,0x70,0x2,0x84,0x68,0xfe,0x58,0x1b,0xc8,0x63,0xa2,0x56,0x42,0x21,0x9b, + 0xe9,0xfb,0x8c,0x98,0x3,0xff,0xe1,0xea,0x3e,0xee,0x2f,0xef,0xa1,0x17,0x4,0x88, + 0xe4,0x77,0x4b,0x40,0x24,0x42,0x5b,0x23,0x73,0x29,0xad,0x2e,0xd9,0x73,0x3c,0xf5, + 0x56,0x84,0x21,0x2b,0xd9,0x31,0x47,0x55,0xe8,0x8,0xad,0x9c,0x30,0xa2,0x50,0xc8, + 0xe0,0xda,0xec,0x30,0xde,0xb9,0x3a,0x4d,0x37,0x16,0x46,0x69,0x6a,0x68,0x0,0xd5, + 0xb2,0x7f,0x4f,0x26,0xf1,0x3d,0xa2,0xcf,0x7c,0xbb,0xd3,0xc5,0x97,0x4f,0xb6,0xf9, + 0xe7,0x5f,0x3d,0xc7,0x6f,0xee,0xac,0xf2,0x6e,0xbd,0x61,0x24,0xfd,0xec,0x2c,0x3e, + 0xd,0xc9,0xca,0x77,0x7f,0x73,0xe2,0x4a,0x16,0x9b,0x1f,0xf2,0xee,0xa,0xb6,0x5d, + 0x96,0xf9,0xc7,0x2e,0xbf,0x3e,0x44,0x77,0x85,0xb0,0x5b,0xe6,0x15,0x10,0x61,0x76, + 0x74,0x10,0xb,0x93,0x55,0x2f,0x2a,0x35,0x2e,0x13,0xd,0x7,0x93,0xf5,0xfd,0x63, + 0xfc,0xf2,0xab,0x25,0x3c,0x59,0x3f,0x74,0x56,0x3e,0xfa,0xff,0x1e,0xae,0x1f,0x60, + 0xe7,0x57,0xf7,0xf1,0xc5,0x93,0x6d,0x7c,0xf7,0xea,0x24,0xfe,0xe4,0xf5,0x5,0x54, + 0xb4,0x33,0xde,0x8b,0xc8,0x75,0x12,0xad,0x7b,0xfb,0xca,0x24,0xa6,0x86,0x7,0xb0, + 0x30,0x3e,0x88,0x5f,0xde,0x5e,0xc1,0xd7,0xcf,0xb6,0xbd,0x67,0xc2,0xcf,0x6f,0xa4, + 0xa8,0x6e,0x45,0xf0,0xad,0x44,0x5f,0x67,0xad,0xc9,0x2,0xb7,0x7f,0x31,0x34,0x82, + 0x80,0x6c,0xd8,0x34,0xab,0xc0,0x21,0x5d,0xc2,0x23,0x8c,0xad,0x64,0x40,0x3e,0xdf, + 0xcc,0x50,0xa,0x8,0x2,0x4d,0x64,0x93,0xa2,0x2d,0x19,0x4b,0xea,0xc3,0xfe,0x16, + 0xc1,0x54,0x12,0x6e,0x11,0xeb,0xb3,0x18,0xc,0x41,0x89,0x42,0xc,0x62,0xef,0x98, + 0x41,0x2c,0xea,0xd9,0xd1,0xf1,0x11,0x77,0x24,0xf1,0xbf,0x98,0x37,0xa1,0xbb,0x94, + 0x40,0xbb,0xb7,0xf4,0x7e,0x1e,0x8e,0x20,0xff,0x14,0xb5,0x84,0x95,0x88,0x49,0x4c, + 0x6,0x15,0x97,0x44,0x79,0xc8,0x11,0x6b,0x73,0x37,0x38,0x28,0xc3,0x41,0xae,0xca, + 0x39,0xb5,0x85,0xf0,0x3a,0xc1,0xe8,0xcd,0xed,0xdf,0x28,0x21,0x5b,0xb,0xc9,0x6f, + 0xac,0xed,0x5e,0x5,0x93,0x9d,0x34,0xf2,0x46,0x70,0x43,0x1d,0x81,0x40,0xf9,0x74, + 0x9a,0xae,0xcf,0x8f,0xd2,0xbb,0x37,0x66,0xe9,0xbb,0x57,0x66,0x68,0x7a,0xe4,0xc5, + 0x8c,0xf1,0xed,0xc3,0x26,0xee,0x2e,0x6d,0xe3,0xe3,0x7,0xeb,0xf8,0xf8,0xe1,0x6, + 0x1e,0xae,0xec,0xb,0x13,0x1,0x1,0x6a,0xf4,0x31,0xd1,0xa7,0xe4,0xd9,0xac,0xcf, + 0x7b,0x49,0xb1,0x36,0xa,0xd5,0x52,0x1e,0x67,0x27,0xab,0x98,0x1e,0x1e,0x30,0x72, + 0x96,0x44,0x28,0xac,0xd5,0xe9,0xe1,0xf3,0xc7,0x9b,0xb8,0xf3,0x7c,0xf,0x1,0xf7, + 0xb1,0xf7,0x8d,0x1e,0xa8,0xfa,0x61,0x98,0x19,0x2d,0xe3,0xf,0x6f,0xce,0xe1,0xdd, + 0x1b,0xb3,0x9e,0x71,0x48,0x92,0xcd,0x28,0x11,0xe1,0xa8,0xd9,0xc6,0x9d,0xc5,0x1d, + 0xfc,0xfc,0x8b,0x45,0x7c,0x78,0x77,0x15,0x3b,0xf5,0x53,0xd4,0x4f,0x5a,0xc8,0x64, + 0x52,0xb6,0xc3,0x8f,0x1d,0x30,0xc,0x34,0x3b,0x5d,0x99,0xe9,0x4b,0x1e,0x45,0xd6, + 0x36,0xf3,0x64,0xdf,0x71,0x46,0x24,0x81,0x7d,0x28,0x4d,0xde,0x85,0x9e,0xfa,0x2c, + 0x69,0xdd,0x33,0xf6,0x26,0x26,0x21,0x11,0x21,0x44,0x27,0x62,0x8a,0xe3,0x81,0xb1, + 0x70,0x5,0xef,0xdf,0xf9,0xd1,0x80,0xc2,0xff,0xdc,0x3d,0x31,0x82,0x70,0x1a,0x59, + 0x2,0x43,0x90,0x5,0x90,0x98,0xc0,0x0,0xa0,0x94,0x4f,0xe3,0xda,0x99,0x61,0xbc, + 0x73,0x75,0x1a,0x17,0xa7,0x87,0x50,0xca,0x67,0x5e,0x68,0x30,0x13,0x9d,0x98,0x36, + 0xf6,0x4e,0x70,0x6b,0x71,0x1b,0xf7,0x96,0x77,0x71,0x72,0xda,0x8b,0x4c,0x31,0xee, + 0x59,0x65,0x24,0x70,0x2f,0xe2,0xb,0x20,0x0,0xc0,0x60,0x21,0x8b,0xb9,0xf1,0xa, + 0x2a,0xa5,0xdc,0x37,0x3a,0xd9,0x6d,0x1e,0x34,0xb0,0xba,0x7b,0x82,0x46,0xbb,0x6b, + 0xf9,0x2,0x2c,0xe6,0x50,0x86,0xb1,0x7e,0x63,0xcf,0x4b,0x85,0x85,0x1f,0xad,0xa1, + 0xe9,0x81,0x48,0x70,0xc0,0x58,0xf4,0xc3,0xca,0x81,0xb3,0xca,0xbd,0xdc,0xf9,0x4c, + 0x1a,0xe3,0x95,0x22,0xa6,0x46,0xcb,0x74,0x76,0x7c,0x10,0x97,0x66,0x86,0xf1,0xca, + 0xdc,0x8,0xcd,0x8d,0xd,0x22,0x15,0xc9,0x7,0xf,0xb4,0xdd,0xb7,0xf4,0x26,0x8f, + 0x22,0x4f,0x2b,0xbb,0x27,0xb8,0xbb,0xb4,0xcd,0xbf,0xbb,0xbb,0xc6,0x9f,0x3e,0xda, + 0xc4,0xd6,0x41,0x83,0x59,0x48,0xc7,0xd9,0xcc,0x89,0x3a,0xa3,0x4b,0xa0,0xef,0x1e, + 0x5c,0x2c,0x9b,0xf,0xe7,0x80,0x10,0xd9,0x35,0x7b,0xb1,0x30,0xd6,0x69,0x26,0xec, + 0x45,0xd9,0x28,0xfe,0x9c,0x4,0x8c,0x8,0x98,0x19,0x2d,0x63,0x61,0xbc,0x82,0x74, + 0x8a,0x12,0xbd,0x30,0x4c,0xf3,0xba,0x79,0xd0,0xc0,0xe3,0xf5,0x43,0xac,0xef,0x9d, + 0x44,0xfb,0xdd,0xf0,0x8e,0xc,0x80,0x9d,0xe3,0x53,0x7c,0xfe,0x64,0x13,0xcd,0x76, + 0x7,0xad,0x4e,0x80,0x57,0xcf,0x8e,0x62,0x7e,0xac,0x82,0x41,0xb1,0x5b,0x4f,0x32, + 0xd4,0x31,0xd7,0x30,0x97,0x49,0xe3,0xe2,0x74,0xd,0x44,0x40,0x26,0x9d,0x42,0x3e, + 0x9b,0xa2,0x7b,0xcb,0x7b,0xdc,0x38,0xed,0x44,0xf8,0x5a,0x62,0xcd,0xe4,0xbc,0xfb, + 0xe1,0xac,0x5a,0x92,0x90,0x4e,0x45,0xda,0x54,0xc6,0xec,0x62,0x74,0x13,0x14,0x18, + 0xc3,0x9,0x1d,0xb1,0xab,0x99,0x33,0xa1,0x8f,0xbb,0xe7,0xb0,0x86,0x88,0xd0,0x25, + 0xbc,0x85,0x1c,0x1f,0xdf,0xa0,0x84,0xc,0x99,0xde,0x24,0x80,0x9f,0xa8,0x8f,0x80, + 0x58,0x21,0xc5,0xb2,0x4e,0xc4,0x4a,0x2d,0xb6,0xf3,0x8e,0xef,0xdc,0xbc,0xf3,0xc1, + 0x47,0x31,0x10,0xcd,0x10,0xf7,0xd8,0x42,0xe6,0xba,0xa5,0x65,0xc,0xa6,0xcf,0xae, + 0x76,0x5f,0x47,0xb9,0x73,0x3e,0x2,0xcd,0xb3,0x23,0x3a,0xc0,0x35,0xcb,0x11,0x79, + 0xbc,0x90,0x5,0x9b,0x43,0x4c,0x39,0x5e,0x3c,0xd9,0xec,0x5f,0xc7,0x6a,0x87,0x12, + 0x77,0xa5,0x2c,0xde,0x7a,0x7a,0x27,0xa5,0x98,0x44,0xfe,0xb9,0x99,0xd6,0xc3,0x96, + 0xce,0x9c,0xea,0xb6,0xb,0x30,0x31,0x3a,0xb6,0x77,0x31,0xf8,0x3d,0x29,0x9c,0x9d, + 0x1a,0xa2,0xff,0xfe,0x87,0x57,0xe9,0x5b,0x17,0xa7,0x68,0xb0,0x98,0x8d,0xed,0xc8, + 0xcd,0xfb,0xbd,0x5e,0x80,0xe3,0x66,0x1b,0x1f,0x3f,0x58,0xc3,0x5f,0xbf,0x77,0x1f, + 0x4f,0xd6,0xf6,0xd1,0x68,0x77,0xdd,0x5,0x66,0xf6,0x60,0x19,0x2f,0x9d,0x3b,0xa9, + 0x2e,0x27,0x30,0xfe,0xfd,0xf3,0x3c,0xaa,0x27,0xa,0xbf,0x4e,0x21,0x9b,0xc6,0xcc, + 0xc8,0x20,0xc6,0x6b,0xc5,0x17,0xc6,0x1a,0x12,0x11,0x8e,0x4f,0xdb,0xb8,0xbf,0xb2, + 0x8f,0xb5,0xbd,0xe3,0x17,0xc7,0x39,0x45,0x3a,0xc9,0x89,0xda,0x0,0xde,0xb8,0x30, + 0x89,0x3f,0xfb,0xd6,0x39,0x2c,0x4c,0x56,0x13,0xbb,0xf1,0x28,0xab,0xfd,0xce,0xe2, + 0xe,0xfe,0xc3,0x2f,0xee,0xe0,0xde,0xd2,0x1e,0xea,0x8d,0x16,0x88,0x14,0xaa,0x3, + 0x79,0xd4,0x6,0x5e,0x34,0x55,0x32,0x3a,0xbd,0x20,0xa2,0xa3,0x72,0xe4,0x28,0xab, + 0xb0,0xb4,0x1e,0xd0,0x1,0x87,0xe1,0x2c,0x12,0x5b,0x97,0x4e,0x46,0xa2,0x13,0x88, + 0xc0,0xeb,0x24,0x98,0x51,0x5a,0x9a,0x45,0x92,0xd5,0xc1,0x22,0x68,0xd6,0x8f,0x30, + 0x14,0x7a,0x60,0x8f,0xa1,0x23,0xac,0x6a,0x29,0xa1,0x5f,0x8e,0xb2,0x58,0x38,0x1a, + 0x19,0xa3,0x77,0xf4,0x5a,0xba,0xc9,0xec,0x20,0x70,0x26,0x20,0x45,0xc0,0xf5,0xb9, + 0x51,0xfc,0xf,0x3f,0xba,0x8a,0x6b,0x67,0x46,0x2c,0xbb,0xfd,0x9b,0xcc,0x7a,0x2c, + 0xd4,0x7e,0xd0,0xc0,0x7b,0x5f,0xaf,0xe0,0xf3,0x27,0x5b,0x38,0x68,0xb4,0xb5,0xe9, + 0x13,0xc1,0xeb,0x1f,0x8c,0x8e,0x99,0xbe,0x69,0x21,0xe0,0xb6,0x3f,0x13,0x43,0x3, + 0xb8,0x7a,0x66,0x18,0xc5,0x84,0xcc,0x2,0xf9,0xb6,0xb9,0x7f,0x82,0xfb,0x2b,0xfb, + 0xa1,0xc2,0x83,0x84,0x26,0x97,0x92,0x49,0xea,0x14,0x6d,0x30,0x3d,0x2e,0xad,0x37, + 0xa5,0xb3,0xb4,0xf4,0x75,0x72,0x41,0x77,0x48,0x65,0x52,0x84,0xf3,0x93,0x55,0xfa, + 0xf6,0xa5,0x49,0xfc,0xe1,0x2b,0xb3,0xb4,0x30,0x51,0xc5,0x60,0xc4,0xb2,0xb5,0x5f, + 0x6c,0x68,0x94,0xf0,0xc5,0xcc,0xd8,0x3e,0x6c,0xe2,0x1f,0x3f,0x7b,0xca,0xbf,0xfa, + 0x6a,0x85,0x1f,0xae,0xed,0x73,0xb7,0x17,0x88,0x61,0x8a,0xd8,0x13,0x3d,0x18,0xe5, + 0x4,0x4b,0x97,0x21,0x30,0x47,0x93,0xe7,0xc9,0x3,0x6e,0x5c,0x68,0x9a,0xb4,0x22, + 0x86,0xcb,0x66,0x86,0x48,0x72,0x66,0x4f,0xbb,0xc4,0x48,0x29,0x85,0x99,0xd1,0x4a, + 0xd8,0xac,0xa8,0xfe,0xc8,0x4d,0xc0,0x1,0xee,0x2f,0xef,0xe2,0xee,0xd2,0x5e,0x28, + 0x55,0xf0,0xc4,0xc8,0x10,0x79,0x1f,0x84,0x93,0x56,0xf,0x9f,0x3d,0xde,0xc6,0xdd, + 0x95,0x7d,0x7c,0xff,0xfa,0xc,0xfe,0xf2,0xdb,0xe7,0x70,0x75,0x76,0xc8,0xcb,0x4a, + 0x8f,0x72,0x67,0xa2,0x67,0xc4,0x85,0xa9,0x1a,0x86,0x6,0xa,0x38,0x33,0x36,0x88, + 0xff,0xf3,0xbd,0x7,0xf4,0xc9,0x83,0x75,0xb6,0x83,0xa3,0xd6,0xf5,0x18,0x9e,0xb, + 0x43,0xe,0x87,0x24,0xc8,0xc3,0x81,0xf3,0x1e,0x20,0x3,0x92,0xdb,0x27,0x8c,0xb4, + 0x23,0x8d,0x51,0xc9,0x84,0xc5,0x84,0xa3,0xc4,0x74,0x6d,0xdc,0x4e,0x96,0xab,0xc8, + 0xbe,0x5b,0xba,0xa1,0xc8,0x4b,0xad,0x9c,0xf2,0x92,0x6e,0x63,0xbe,0x2f,0x2a,0xbe, + 0x2e,0x23,0x44,0x86,0xda,0x24,0x77,0x55,0x69,0xbb,0x1a,0x8b,0x40,0x8f,0xa4,0x95, + 0x7a,0x19,0x58,0x52,0xed,0xc3,0x96,0xf3,0xe4,0xf,0x12,0x14,0x16,0x74,0xdb,0xa9, + 0x53,0x4,0xbf,0xa7,0x8,0x51,0x5f,0xf9,0x58,0x32,0x1b,0x4,0xdc,0xe0,0x24,0x9e, + 0x87,0x32,0xcb,0xa1,0x83,0x1c,0xe4,0x1,0x9f,0x54,0xa0,0x77,0xb6,0x24,0x75,0x52, + 0x21,0xcb,0xd8,0xd2,0xd7,0x6c,0x2e,0xb9,0x2,0xe9,0xd0,0x15,0x83,0xc3,0x3b,0x8d, + 0x45,0x58,0xd3,0x95,0xf6,0x93,0x53,0x26,0x4a,0x55,0x8c,0x55,0xb2,0xfd,0xa5,0x74, + 0x8a,0xf0,0xee,0xcd,0x33,0xea,0x27,0xaf,0xcd,0xd1,0xab,0x67,0x27,0x68,0xb0,0x98, + 0xf5,0xf6,0xc3,0xbe,0x49,0x4c,0x7,0x4f,0x37,0xeb,0xf8,0xc7,0xcf,0x9e,0xe1,0x93, + 0x87,0x1b,0x78,0xba,0x7e,0x80,0x46,0xbb,0x17,0x4f,0xac,0xf1,0xe,0x6c,0x8a,0xf, + 0xda,0x56,0x6a,0x6d,0x48,0x57,0x52,0x2e,0x24,0x1a,0x25,0x92,0xcd,0x8f,0xf,0x85, + 0x4c,0xd4,0x4a,0xb8,0x30,0x5d,0x43,0x31,0x9b,0x4e,0x24,0xbf,0x98,0x7,0xea,0xa8, + 0xd1,0xc6,0xb3,0x8d,0x43,0xec,0x1f,0x9d,0x46,0xa6,0xce,0x84,0xac,0x5d,0x71,0xf3, + 0x95,0x72,0x19,0xbc,0xfb,0xca,0x2c,0xfe,0xfc,0xad,0x73,0x98,0x1a,0x2e,0x25,0x22, + 0x15,0xf2,0x7b,0x1d,0x1e,0xb7,0xf0,0x5f,0xbe,0x78,0x86,0xf7,0xef,0xac,0xe2,0xfe, + 0xf2,0x1e,0xea,0xcd,0x36,0x8c,0xc7,0x0,0x29,0x65,0xf,0x98,0x7e,0x91,0x8c,0x64, + 0x21,0xd6,0x8,0x4a,0xc5,0x7e,0x92,0x85,0xf6,0x72,0xb7,0x4d,0x99,0xee,0x1c,0xc3, + 0x23,0x54,0x85,0xa9,0x29,0x6,0x77,0xe3,0xc8,0xfe,0x1a,0x62,0xa8,0xb3,0xbb,0x1e, + 0x86,0x49,0xce,0xa4,0x8,0x73,0xdd,0xde,0xa5,0x2a,0x4a,0x47,0xa5,0x58,0x5a,0xb5, + 0xb0,0x2a,0x71,0xd3,0xa6,0xd7,0xd0,0x89,0xa0,0x18,0x44,0xa1,0x7e,0xc1,0x91,0xd0, + 0xe,0xc4,0xa1,0x94,0x6a,0x30,0x8f,0x1f,0xdd,0x3c,0x83,0x77,0xae,0x4e,0xe3,0xda, + 0xdc,0x8,0xaa,0xa5,0x9c,0x37,0x4d,0x46,0x8b,0x50,0x14,0x1e,0xde,0xad,0x37,0xf1, + 0xc9,0xa3,0xd,0xfc,0xec,0xd3,0x45,0x3c,0x5c,0xd9,0x83,0xcf,0xf1,0x8e,0xae,0x82, + 0xa2,0xeb,0xeb,0x38,0x7e,0x14,0x5a,0x60,0xb2,0x26,0x5e,0x15,0x70,0x69,0x66,0x8, + 0x3,0x85,0x8c,0x77,0x1f,0x44,0x7f,0xae,0xf5,0xfd,0x63,0x7c,0xf5,0x6c,0xb,0x87, + 0x8d,0x96,0xd3,0x23,0x47,0xd6,0x51,0xf6,0x5e,0xc,0x8d,0x21,0x21,0x47,0x11,0x52, + 0xc2,0xaf,0xda,0x41,0x35,0x9a,0x39,0x6b,0xe5,0xd9,0xcc,0x96,0x14,0x43,0x38,0x37, + 0x55,0xa1,0x4b,0x33,0x35,0x5c,0x9c,0xac,0x61,0x76,0xb4,0x4c,0x33,0xa3,0x65,0x4c, + 0xd,0xd,0x78,0xcd,0x50,0x3f,0xc2,0x58,0xbf,0xa6,0xe4,0xf3,0x27,0x9b,0xfc,0xe1, + 0xbd,0x75,0xbe,0xb7,0xba,0x87,0x95,0xed,0xe3,0x30,0xc7,0xdb,0x12,0xa4,0x4c,0x66, + 0x53,0xc0,0x96,0xb8,0x15,0x28,0xe3,0x48,0x6a,0xac,0x50,0xd8,0x37,0x22,0x12,0xc2, + 0x6b,0xc4,0x7c,0x1,0xc8,0xd9,0xbc,0xba,0xf2,0xc6,0x3a,0x56,0x32,0xc9,0x5e,0x1, + 0x44,0x9c,0xcb,0x66,0x68,0x6a,0xa8,0x84,0x19,0x81,0x2e,0x26,0x11,0x79,0x53,0x4a, + 0xe1,0xf1,0xc6,0x21,0x6e,0x3f,0xdf,0x41,0xa7,0xd3,0x13,0xa4,0x50,0xb6,0x5c,0xf1, + 0x28,0x32,0xdb,0x68,0x75,0xf1,0xfb,0xfb,0x1b,0x38,0x38,0x6e,0xd1,0xeb,0xe7,0xc6, + 0xf0,0xc6,0xf9,0x31,0xbc,0x7e,0x6e,0x3c,0x71,0x4a,0x4f,0x8a,0x5e,0x1d,0x1e,0xcc, + 0xe3,0xc6,0xfc,0x28,0x3a,0xbd,0x0,0x63,0xd5,0x2,0xfd,0xea,0xab,0x65,0x6e,0xb4, + 0xba,0x9e,0xe6,0xda,0xbd,0xf4,0x4a,0xd0,0xa5,0xad,0x76,0xc4,0x75,0xf9,0x46,0x63, + 0xcb,0x76,0x57,0xa2,0x57,0xb4,0x4c,0x8,0x98,0x8,0xca,0x8e,0x98,0x8,0x33,0x1f, + 0x42,0x16,0x43,0xc0,0x4c,0x1e,0xd,0x51,0xff,0x8d,0x81,0xe9,0x3,0x8a,0x51,0xe9, + 0xfc,0xfb,0xdf,0xeb,0xdd,0x45,0x2e,0x9,0xbb,0x35,0xbb,0x2c,0xd4,0xe4,0xd3,0xd6, + 0x48,0xac,0xf0,0xac,0x64,0x8d,0x11,0x9f,0xc0,0xe5,0xeb,0x6a,0x55,0x20,0xca,0x1f, + 0xf2,0xe4,0xb1,0xa1,0xa4,0xec,0x4f,0x43,0xee,0x24,0x86,0x9c,0xa8,0xc5,0xac,0x81, + 0xdf,0x5d,0x8f,0x23,0xa5,0x6c,0x82,0xf9,0xaa,0x84,0x10,0xce,0x5e,0x8,0xe5,0x82, + 0x35,0x84,0x25,0x5e,0x38,0x65,0x8b,0x63,0x51,0x59,0x7b,0x34,0x92,0x3c,0x77,0x39, + 0xa9,0xeb,0x7f,0x23,0xd2,0xd4,0x48,0xec,0xd2,0x25,0x4,0xef,0xc8,0x73,0x8e,0x19, + 0xaf,0x8f,0x5d,0x72,0xb1,0xa8,0xe5,0x42,0x96,0x2e,0xcc,0xd4,0xe8,0xa7,0x6f,0x2c, + 0xd0,0xf,0x6f,0x9c,0xb1,0xce,0x6f,0x49,0x85,0xab,0x71,0xda,0xc1,0xa3,0xb5,0x7d, + 0x7c,0x78,0x6f,0xd,0x7f,0xf7,0xc9,0x33,0x6c,0x1f,0x36,0xe1,0x59,0xda,0x79,0x19, + 0x88,0x7a,0x79,0xa6,0x84,0x56,0x34,0x7a,0x9d,0x8c,0x26,0xd1,0x9b,0xe2,0x15,0x4c, + 0xb8,0x8f,0x70,0xd4,0xd1,0x15,0x47,0xb0,0x77,0x89,0x30,0x5e,0x2b,0x61,0x7e,0xbc, + 0x82,0x5c,0xb6,0xff,0x84,0xc4,0xcc,0xd8,0x3c,0x38,0xc1,0x93,0xcd,0x3,0x34,0xbb, + 0x3d,0x2f,0xf1,0x5a,0xf2,0xec,0xa2,0x2c,0xcb,0xc1,0x52,0x16,0xd7,0xe7,0x46,0xf0, + 0xee,0x2b,0xb3,0xb8,0x3e,0x37,0xf2,0x42,0x9b,0xcb,0x20,0x8,0xb0,0x7b,0x74,0x8a, + 0x5b,0x8b,0xdb,0xf8,0xbb,0x8f,0x9f,0xe1,0xd6,0xe2,0xb6,0x67,0xb,0x6c,0xa9,0x5d, + 0xfc,0x4d,0x7e,0xe4,0x86,0xa6,0xec,0xec,0x73,0xb4,0x35,0x13,0xec,0xc0,0x62,0xd8, + 0x15,0x6c,0x12,0x13,0xbd,0x69,0x3b,0xbc,0xc5,0x52,0x7a,0xd,0x20,0x26,0xd,0xc1, + 0x43,0xd1,0x29,0x9c,0x51,0xed,0x88,0x75,0x37,0x24,0xf2,0x59,0x4a,0x1e,0x4b,0xdd, + 0xa3,0x5e,0x27,0xb2,0x42,0x3c,0x39,0x94,0x73,0x7b,0x92,0x76,0xca,0x62,0x19,0x1a, + 0xa5,0x74,0x9b,0x7,0xbf,0x90,0x4d,0x61,0xa2,0x56,0xc2,0x2b,0xf3,0x23,0xf8,0xf3, + 0xb7,0xce,0xe1,0xda,0xdc,0x88,0xd7,0xc,0xf5,0x2b,0xe4,0xf2,0x30,0xad,0x9f,0xb4, + 0xf0,0xf9,0xd3,0x2d,0xbc,0x7f,0x67,0x15,0xb7,0x16,0x77,0x90,0x64,0x8d,0x47,0xae, + 0x72,0x33,0x13,0x49,0x53,0x4e,0x48,0x3b,0x66,0xfb,0x3c,0xc0,0xc9,0x26,0xc7,0xaa, + 0x25,0x9c,0x9d,0xa8,0xa0,0x98,0x4b,0xf7,0x8d,0xd2,0xc,0x95,0x15,0xd,0xdc,0x5e, + 0xda,0xc5,0x51,0xb3,0x1b,0x93,0xe3,0x48,0x7b,0x59,0x7b,0xf5,0x14,0x49,0x9b,0x6a, + 0xf6,0xd6,0x43,0xd2,0xbd,0x12,0x6e,0xf1,0x98,0xc9,0x2a,0x2a,0x64,0xd2,0x28,0xe4, + 0x32,0x98,0x1e,0x2e,0xe1,0xb5,0x73,0xa3,0xf8,0xd6,0xf9,0x49,0xba,0x76,0x66,0xc8, + 0x1a,0xf0,0xf4,0x6b,0x38,0x92,0x9a,0x4c,0xd6,0xaa,0xe5,0x66,0xbb,0x83,0xf5,0xfd, + 0x13,0xdc,0x59,0xdc,0xe5,0x9f,0x7f,0xf5,0x9c,0x3f,0xb8,0xbb,0xa6,0x35,0x10,0xb6, + 0x5e,0xb0,0xce,0x7,0xb1,0xc6,0x26,0xa1,0x91,0x48,0x18,0xbb,0x69,0xa7,0x72,0x10, + 0x14,0x2,0x17,0xe6,0x21,0x3c,0xdc,0x49,0xbc,0x26,0x1c,0x65,0xa,0x1b,0xc7,0x42, + 0x7b,0x6e,0x93,0x33,0x4d,0x8c,0x30,0x3b,0x89,0x8,0x23,0xd5,0x2,0x46,0x6,0xb, + 0x31,0x62,0x5f,0xb4,0x89,0xa9,0x9f,0xb4,0xb0,0xb8,0x55,0xc7,0xf3,0xed,0xe3,0xf0, + 0x65,0x15,0x26,0x2a,0x49,0x4e,0xf1,0x7a,0x53,0x85,0xfd,0x46,0xb,0xbf,0x7f,0xb8, + 0xc1,0x9b,0x7,0xd,0x3a,0x6c,0xb4,0x91,0x52,0xa,0xf3,0x63,0x83,0x28,0xe5,0xd2, + 0xd6,0x68,0x4b,0xee,0xe8,0xa3,0xe4,0xb9,0xda,0x40,0xe,0xdf,0xbb,0x32,0x85,0x72, + 0x21,0x8b,0x83,0xe3,0x16,0xee,0x2c,0xed,0xa1,0xde,0x68,0x4b,0x18,0xc6,0x99,0x3a, + 0x28,0x68,0x44,0xdd,0xf0,0x61,0x8c,0xd5,0xa9,0x4e,0x42,0x64,0x43,0xf6,0x67,0x93, + 0xa5,0x68,0x2c,0x3c,0x2c,0x65,0x2d,0xac,0xe4,0xca,0xb8,0xc0,0x6b,0x5c,0x57,0xd7, + 0x23,0xcf,0x1,0xce,0x20,0x80,0xac,0xbf,0x3b,0xc7,0xf6,0xd9,0xec,0xf7,0xe6,0xa2, + 0x6e,0x9,0xf9,0x25,0x25,0x8d,0xed,0xec,0x79,0x4d,0x38,0x54,0x9b,0x84,0xe2,0x45, + 0x9,0xbc,0x9e,0x23,0xcf,0x7,0xc5,0xa6,0x2f,0xa2,0x88,0x4c,0x8a,0xe3,0x24,0xdf, + 0x74,0xd4,0x68,0x89,0x15,0xbc,0xe0,0x9,0xfb,0xd8,0x9,0xeb,0x67,0xbb,0xd1,0x91, + 0x7,0x98,0x80,0xed,0x59,0xc0,0x4,0x51,0x4e,0x80,0x99,0xcc,0x49,0x60,0x47,0xb6, + 0xbc,0x9b,0xf9,0xda,0xaa,0xb5,0x94,0xe6,0xa9,0x1b,0x80,0x1c,0x12,0x62,0x77,0x45, + 0x5a,0xe9,0xec,0x73,0x17,0x9f,0x4a,0x36,0xe7,0xdc,0xd0,0x3d,0x84,0x99,0xe7,0xcd, + 0xf3,0x63,0xf4,0xbf,0xfc,0xe4,0x3a,0x9d,0x9b,0xac,0x51,0x3a,0x9d,0xea,0xb,0x5b, + 0x1e,0x37,0xdb,0xb8,0xb3,0xb4,0x8b,0xbf,0xf9,0xe8,0x31,0x7e,0x7b,0x77,0xd,0x47, + 0x8d,0xb6,0x25,0x8f,0x40,0xb4,0x6b,0x96,0x58,0x4d,0x62,0xa7,0x41,0xf0,0xad,0x35, + 0x4d,0xd3,0xe3,0x64,0x4f,0x8e,0xd9,0x41,0x88,0xeb,0xfa,0xd,0x1a,0x62,0x47,0xd2, + 0xf0,0xc5,0x1c,0x1e,0x2c,0x60,0x76,0x64,0x0,0x99,0xc8,0x1e,0x30,0xfa,0xb6,0x5d, + 0x3f,0xc5,0xd2,0xd6,0x11,0x5a,0x9d,0x9e,0xcd,0xb5,0x91,0xf4,0x5a,0xdf,0xaf,0x3d, + 0x5c,0xc9,0x5d,0x9e,0x19,0xc6,0xff,0xf4,0xe3,0x6b,0xb8,0x3c,0x33,0x9c,0x58,0x30, + 0x64,0xe1,0x68,0xb4,0x7a,0xf8,0xd9,0xa7,0xcf,0xf0,0xb7,0x1f,0x3f,0xc3,0xca,0x4e, + 0x3d,0xa1,0xf8,0x19,0x61,0x28,0x7b,0x93,0x65,0x62,0x3d,0x57,0xae,0x61,0x61,0xf8, + 0x6b,0x69,0x8,0xbf,0x29,0xf6,0x43,0x83,0xdd,0xe0,0xb,0x61,0xba,0xcc,0x1c,0x93, + 0x7b,0x98,0xde,0x40,0x66,0x6,0xc1,0xda,0x7e,0x8a,0xf8,0xae,0x98,0xd8,0x3c,0xd2, + 0xb3,0x7b,0xf,0xa8,0x6f,0xc8,0x24,0xc4,0xed,0x24,0xfd,0xac,0x29,0x42,0x65,0xa6, + 0x3e,0x1c,0x89,0x7c,0x36,0x8d,0xd7,0xcf,0x8d,0xe1,0x87,0x37,0xcf,0xe0,0x3b,0x97, + 0x26,0x30,0x32,0x58,0x78,0x69,0x1f,0x6e,0x67,0xb1,0xda,0xc6,0xad,0xe7,0xbb,0xf8, + 0x8f,0x1f,0x3e,0xc1,0x67,0x8f,0x37,0x19,0x91,0xe7,0x94,0x24,0xc9,0xc3,0x99,0x67, + 0x70,0xd4,0x42,0xce,0x47,0xd2,0x24,0xe9,0x87,0x31,0x52,0x29,0x60,0x6e,0x74,0x30, + 0xc6,0x8b,0xf0,0x8b,0x27,0x63,0x65,0xf7,0x8,0x8f,0x56,0xf,0xf5,0x4a,0xa5,0x1f, + 0x1f,0x84,0x7c,0x77,0x3d,0xd2,0xa6,0x9b,0xc2,0xfe,0x4f,0xc6,0x6d,0xca,0x9,0x97, + 0x40,0x98,0x1f,0xab,0xe0,0xf5,0x73,0x63,0x78,0xf3,0xfc,0x18,0x9d,0x9d,0xa8,0xa2, + 0x5c,0xc8,0xa2,0x94,0x4b,0x23,0x9f,0x4d,0x7b,0x4d,0xe4,0x8b,0xae,0x63,0xf4,0xe3, + 0xcd,0x76,0x7,0xbf,0xbe,0xbd,0xc2,0x1f,0xdc,0x5b,0xe3,0xaf,0x9e,0xed,0x60,0xe7, + 0xb0,0xc1,0x6c,0xd3,0x93,0x8d,0x37,0x81,0x2d,0xae,0x76,0xcc,0x13,0x5e,0x70,0x66, + 0x8b,0x61,0x16,0x96,0xc6,0xa1,0xdc,0xd2,0x0,0x3c,0xa2,0xa6,0x15,0x72,0x58,0x6b, + 0x29,0x93,0x28,0x67,0x97,0xaa,0xe1,0x8f,0x2f,0x27,0x35,0xb7,0xb9,0x1f,0x2a,0xe7, + 0xe9,0xe2,0x64,0xcd,0xdb,0x6f,0x27,0xbd,0x2e,0xcd,0x76,0x17,0x8b,0xdb,0x75,0x6c, + 0xed,0x37,0xd,0x2a,0x62,0x29,0xf8,0xd1,0x15,0xa9,0xbb,0x36,0xbe,0x9f,0xc8,0xf2, + 0xce,0x31,0xff,0xe7,0xcf,0x17,0x71,0xe7,0xf9,0x2e,0x7e,0x74,0x73,0x96,0x7e,0xfa, + 0xfa,0x9c,0xd7,0x48,0x44,0x51,0x1,0xf9,0x56,0xc8,0x65,0x70,0xed,0xcc,0x30,0xfe, + 0xd7,0x3f,0xb9,0x41,0xff,0xf0,0xe9,0x22,0xff,0xa7,0x8f,0x9e,0xa0,0xd9,0xe9,0xb9, + 0x25,0xb4,0xfd,0xe6,0x21,0xc2,0x21,0x21,0x6c,0xe,0x34,0x5e,0xa6,0x39,0xdb,0xa2, + 0xf1,0x93,0x72,0x6f,0x72,0x91,0x30,0x76,0xca,0xd7,0x4f,0x61,0x4a,0xe6,0x8c,0x7a, + 0xe9,0x2a,0x60,0x62,0x65,0x88,0x76,0x22,0xef,0x31,0xbc,0xdd,0x89,0x59,0x88,0x66, + 0x4c,0xe6,0x23,0xc1,0x33,0x79,0xf7,0x14,0x21,0x2e,0x50,0x54,0x9,0x35,0x7,0xc7, + 0x39,0x4b,0x4c,0x82,0xdc,0xe7,0x88,0xc8,0xde,0x75,0x24,0x3f,0x97,0xd5,0x23,0xc9, + 0x11,0x83,0xa3,0x1e,0xd6,0xc,0xa4,0xa1,0x28,0x12,0xf7,0x26,0xe8,0x77,0xe4,0x3f, + 0x54,0x9e,0xce,0x42,0x79,0x78,0xba,0xc7,0xc,0x96,0x9f,0x6f,0x8b,0xb3,0x27,0x51, + 0xb3,0x7,0x39,0x59,0x2c,0x5e,0x1e,0xa8,0xfa,0xe3,0xa4,0xdc,0x44,0xee,0x4f,0xe5, + 0x32,0x42,0xd5,0x8d,0xe4,0xb0,0x30,0xbb,0xd1,0x31,0x39,0x27,0x19,0x6,0x21,0x93, + 0x22,0xbc,0x7e,0x6e,0x5c,0xfd,0xf8,0xe6,0x1c,0x5d,0x9f,0x1b,0xa1,0x6c,0x26,0xdd, + 0x97,0x21,0x6c,0xa6,0xcf,0x5f,0xdf,0x5a,0xc6,0x27,0xf,0x37,0x71,0x64,0xf6,0x90, + 0xba,0x9b,0x32,0xdb,0xe,0xd6,0x1e,0xc5,0x96,0xfb,0x4f,0xec,0xfb,0x54,0x4b,0x2b, + 0x50,0x99,0x6c,0x17,0xe1,0x7a,0x32,0x92,0xfc,0x4b,0x84,0xc2,0x5f,0xff,0xfa,0x83, + 0xc5,0x1c,0x46,0x2a,0x45,0x64,0xd2,0xc9,0x6,0x37,0xe6,0x63,0x7b,0x47,0xa7,0x58, + 0xdd,0x3b,0x41,0x5b,0x48,0xd5,0xe4,0x1a,0xc0,0x13,0x2a,0x29,0xc2,0xcd,0xf9,0x61, + 0xfc,0xe0,0x46,0x38,0x99,0xcb,0x4c,0xf7,0xa4,0xa2,0xbe,0xb2,0x7b,0x8c,0x8f,0xee, + 0xaf,0xe1,0x57,0xb7,0x57,0xf0,0x78,0xfd,0x20,0xe1,0x28,0x70,0x3b,0x5a,0x49,0xa0, + 0xeb,0xbb,0xf7,0x85,0x2f,0x31,0xa,0x7b,0x6a,0x66,0x6f,0x73,0x25,0x14,0x76,0x7e, + 0xaa,0x34,0x3b,0x82,0x36,0x8b,0x3d,0x31,0xc7,0x95,0x69,0xf6,0xb1,0x54,0x4c,0x5e, + 0x2b,0x64,0x98,0x1c,0x64,0x4b,0x9c,0xc7,0xb7,0x88,0xb5,0x4d,0x9e,0xac,0x4d,0x90, + 0x77,0x98,0xbc,0xe9,0x93,0x45,0xc7,0x2e,0x7f,0x11,0xf9,0xa,0x67,0xd2,0xa,0x67, + 0x46,0x6,0x71,0x7d,0x6e,0x8,0xdf,0xba,0x30,0x8e,0xd7,0xcf,0x8d,0x63,0x72,0xc8, + 0x5f,0x75,0xc4,0xa7,0x48,0x8e,0xc9,0xa9,0xb6,0xf,0x9b,0xf8,0xfc,0xc9,0x26,0xde, + 0xbb,0xb3,0x8a,0x3b,0x8b,0x3b,0x1c,0xf6,0x71,0xe4,0x11,0x6c,0x84,0xab,0x72,0xa4, + 0xcb,0x37,0x9,0x38,0x7a,0x15,0x69,0x36,0x8b,0x2,0x27,0x49,0xa5,0x80,0xb1,0xc1, + 0x22,0x46,0x2b,0x5,0x3b,0x95,0x25,0x21,0x4,0xad,0x4e,0x17,0x6b,0x7b,0x27,0x58, + 0xdb,0x6d,0x84,0x32,0x49,0x22,0x4b,0x44,0x72,0x7d,0xa9,0xf2,0xf8,0x8a,0x1c,0x2b, + 0xd5,0xd6,0xec,0x14,0xc2,0x82,0x7,0xd5,0x81,0x1c,0x46,0xcb,0x5,0x1a,0xaf,0x16, + 0x78,0xbc,0x56,0xa2,0xf9,0xf1,0x41,0x5c,0x98,0xac,0xe0,0xf2,0x74,0xb8,0xdb,0x8d, + 0xed,0x8c,0x5f,0xb0,0x9e,0x88,0x23,0x5a,0xd,0x3c,0xdf,0xaa,0xf3,0xc3,0xd5,0x3, + 0x7c,0xf2,0x68,0x93,0xef,0x2e,0xef,0xf2,0xee,0xf1,0x29,0x10,0x68,0x83,0x12,0x98, + 0x28,0x31,0xeb,0xcc,0xc3,0xcc,0x9a,0x90,0x69,0x5c,0xc7,0x5d,0x4f,0xca,0xee,0xf0, + 0x64,0x20,0x20,0x76,0x16,0xb0,0xd6,0xe9,0xc8,0x8d,0x80,0x4e,0x58,0x4b,0x1a,0xc1, + 0x63,0x8f,0xbc,0xa9,0x44,0x77,0x43,0x9e,0x25,0xd,0x86,0x7,0xb,0xb8,0x38,0x5d, + 0x45,0x39,0xe2,0x20,0x18,0x5d,0x23,0xec,0x1c,0x36,0x71,0xfb,0xf9,0x2e,0x76,0x8e, + 0x9b,0x2,0xa7,0x61,0xcf,0x91,0x4c,0xa7,0x91,0x2,0x51,0x77,0x32,0xfd,0x7e,0x8f, + 0x81,0xdd,0xa3,0x36,0xf6,0x8e,0x77,0xc1,0xcc,0xdc,0xee,0x6,0xf4,0xda,0xd9,0x11, + 0x9c,0x9f,0xa8,0xa1,0x5c,0xcc,0x24,0x9e,0x47,0xf2,0x4c,0x2d,0x17,0xb2,0xb8,0x7e, + 0x66,0x18,0xa7,0xed,0x2e,0x75,0xba,0x3d,0xfe,0xf8,0xd1,0x16,0xad,0xec,0x1c,0xb3, + 0x97,0xe8,0x12,0xda,0x18,0x5a,0x52,0x6b,0x38,0xc0,0xea,0x28,0x36,0x97,0xe3,0x23, + 0x7c,0xf7,0x34,0xe1,0x26,0xc5,0xa4,0xa3,0x5a,0x48,0x60,0xe2,0xa4,0xbd,0x21,0x6c, + 0x6d,0xd1,0xe0,0xa,0xb3,0x87,0x8f,0x28,0x32,0xd2,0x18,0x2,0xc9,0x72,0x1b,0xf1, + 0x55,0x31,0xba,0x4,0x81,0xcd,0x19,0x62,0xb0,0x52,0xfe,0x99,0xa3,0x64,0x2d,0xa5, + 0x38,0xb7,0x46,0xd8,0xb6,0x42,0x4,0xae,0x58,0x79,0xb8,0x4a,0x6e,0x3a,0x29,0xc2, + 0x67,0xf6,0x82,0x20,0x15,0x90,0x86,0x6d,0x7b,0x64,0x27,0x2c,0x1a,0x76,0x6b,0x68, + 0x1d,0xd9,0x2e,0x90,0x8b,0x91,0xb4,0x16,0x98,0x66,0x77,0xaa,0xc9,0x36,0x91,0x9c, + 0x19,0x37,0x24,0x29,0x31,0x7b,0x91,0xdb,0x33,0xda,0x58,0x4b,0xd2,0x36,0x95,0x21, + 0x35,0x9d,0x4c,0x26,0xac,0x22,0x7f,0xda,0x86,0xa,0xf1,0x7a,0xf6,0x48,0x70,0x6e, + 0xdf,0x4e,0x22,0x7f,0x94,0x40,0x34,0x35,0x3c,0x40,0xff,0xf6,0x7b,0x17,0xe9,0xdb, + 0x17,0x27,0x28,0x1a,0x5b,0x29,0xdf,0x4e,0x4e,0x3b,0xf8,0xfd,0x83,0x75,0xfc,0xd3, + 0x97,0xcf,0xf1,0xfe,0x9d,0x55,0xbb,0x94,0x95,0x7,0xba,0xf9,0xcd,0x28,0xe6,0x12, + 0x44,0x11,0x30,0x35,0xce,0x6f,0xa7,0x4,0x6c,0xcb,0x4b,0x9c,0xe6,0xf8,0xee,0xdd, + 0x7c,0xbc,0x94,0xcf,0xa0,0x5a,0xca,0x23,0xdd,0xa7,0x40,0x9a,0x7,0xea,0xb0,0xd1, + 0xc6,0xe6,0x7e,0x13,0xdd,0xe,0x27,0x12,0xee,0x8,0xae,0x4b,0x1d,0xab,0x14,0xf0, + 0x57,0xdf,0x39,0x8f,0x77,0xae,0x4e,0x21,0x2b,0x22,0x22,0x63,0xba,0xf1,0x5e,0x80, + 0x23,0x7d,0x6d,0xfe,0xb7,0x9f,0xdf,0xc3,0xfa,0xfe,0x89,0xb3,0xaf,0xb4,0xcd,0x9d, + 0x6f,0x5f,0xfb,0x12,0xe3,0xa5,0xb5,0xfa,0x35,0xfe,0x4c,0x1e,0xaf,0xc3,0xf5,0xaa, + 0x6c,0x73,0x26,0x95,0x98,0x8f,0x94,0xf3,0x6e,0x14,0x38,0xa1,0x6b,0xae,0x9c,0x6, + 0x58,0xba,0x3b,0x90,0x62,0x92,0x97,0x96,0xd8,0x4,0x7,0x90,0xf7,0x4,0x91,0x67, + 0xee,0x43,0xee,0x3e,0x76,0xfa,0x78,0xe5,0x9,0x4,0x22,0x23,0x83,0x98,0x47,0xe3, + 0x42,0xb0,0x4c,0x9a,0x30,0x37,0x56,0xc1,0xbf,0xfe,0xce,0x39,0x7c,0xf7,0xf2,0x4, + 0xa6,0x86,0x4a,0x48,0xa7,0x52,0x7d,0xbd,0xf8,0x13,0x1f,0x70,0x22,0x6c,0x1f,0x36, + 0xf0,0xe1,0xfd,0x75,0xfc,0xc3,0x67,0xcf,0xf8,0xe3,0x47,0x5b,0x62,0xa5,0x42,0x1e, + 0x1c,0x68,0x25,0x43,0x24,0x90,0x37,0x8a,0xac,0xb,0x6c,0xeb,0x44,0x16,0x8d,0x22, + 0x0,0x3,0x85,0xc,0x2e,0xce,0xd4,0x30,0x5e,0x29,0xbd,0xf0,0xe7,0x3a,0x6a,0x76, + 0xf0,0xe5,0xd3,0x6d,0xac,0xee,0x9d,0xf8,0x8e,0x74,0x88,0x6,0xd7,0x44,0x9e,0x5, + 0x16,0x87,0x9c,0xf7,0x1c,0x84,0xc0,0xf5,0x44,0xad,0x48,0x57,0x66,0x86,0xf0,0xfa, + 0xf9,0x51,0xbc,0x32,0x37,0x4c,0x17,0x26,0xab,0xd6,0xb0,0x28,0xc9,0xa6,0x34,0xaa, + 0x25,0x7f,0xd1,0xdb,0xd6,0x41,0x3,0x1f,0xdd,0x5f,0xe7,0x5f,0xde,0x5e,0xe1,0xdf, + 0x3f,0xdc,0xe4,0x76,0xb7,0xa7,0xb9,0x41,0xc4,0xb6,0x98,0xb2,0x9e,0xce,0xd9,0xb2, + 0xf0,0x38,0xcc,0xf4,0xa,0xcc,0x7a,0x40,0xb,0x9f,0xad,0xff,0x10,0x1b,0xe8,0x27, + 0xd0,0xb1,0xa0,0xac,0x44,0x5f,0x15,0x39,0x95,0xb5,0x34,0xcb,0x92,0x33,0x6d,0xef, + 0xc5,0x11,0x84,0x82,0x7c,0x93,0x92,0xe1,0x72,0x1,0xe7,0x27,0x6b,0x24,0x3d,0xfe, + 0xa3,0xd7,0x83,0x99,0xb1,0xb6,0xdf,0xc0,0x57,0x8b,0x3b,0x38,0x38,0xe9,0x98,0xf0, + 0x11,0x7b,0xef,0x92,0xaf,0xe1,0xb0,0x8c,0x15,0x42,0xd4,0x8b,0xdc,0x29,0xf1,0x6e, + 0x2f,0xef,0xd3,0xe3,0x8d,0x23,0xfe,0xa3,0xd7,0x66,0xf1,0xa3,0x1b,0x3d,0x7a,0xfd, + 0xec,0x8,0x8a,0xf9,0x6c,0x8c,0x0,0x9b,0xf4,0x1a,0xbc,0x7e,0x76,0xc,0xd3,0xc3, + 0x3,0x94,0x4d,0xa7,0xf8,0xe7,0x5f,0xad,0x60,0xef,0xe4,0x34,0xb4,0x65,0x37,0x84, + 0xa,0x61,0xbf,0x2a,0xa6,0x59,0xb2,0xeb,0xa,0xf3,0x48,0x6,0xc2,0xd8,0x92,0xad, + 0x9f,0xb3,0xa6,0xc1,0x83,0x10,0xe8,0x7d,0x92,0xdb,0x0,0xea,0x52,0xa5,0x1b,0x6, + 0x17,0xe5,0xcd,0x8c,0x20,0x2e,0x19,0x26,0x10,0x82,0x4,0x7,0x15,0x12,0xc4,0x35, + 0xd1,0x23,0xc7,0x26,0x66,0x81,0x70,0x78,0xe3,0x87,0x40,0x66,0x4d,0x31,0xf7,0xa0, + 0x7b,0x69,0xf9,0xad,0xa4,0x76,0x1f,0x7d,0xa5,0x70,0x6,0x19,0x4f,0x4b,0xa3,0x9, + 0xa9,0x40,0xf5,0x74,0x7c,0x88,0x49,0x7a,0x63,0x32,0x1b,0x5f,0xf5,0xe3,0x24,0x24, + 0xc4,0x14,0xd5,0xea,0x46,0x71,0x1d,0x67,0xcd,0xa8,0x9c,0xe8,0xc8,0xad,0xc1,0xf5, + 0x97,0x53,0x2e,0x21,0x8d,0x48,0x85,0x3b,0x13,0xc1,0x7e,0x37,0xe3,0x30,0x91,0x74, + 0xfc,0x70,0xc7,0xf2,0xd5,0xd9,0x61,0xfa,0xd1,0xcd,0x59,0x75,0x6d,0x6e,0x84,0xaa, + 0xc2,0x2a,0x35,0x7a,0x10,0x2c,0x6e,0x1e,0xe2,0xf7,0xf,0x37,0xf0,0xcb,0x5b,0xcb, + 0xb8,0xb7,0xb2,0xe7,0x35,0x2f,0xec,0xc5,0xa,0xf8,0xee,0xf7,0x42,0x38,0xe8,0x35, + 0x32,0xa,0xc9,0xe,0x40,0x89,0x1d,0x97,0x79,0x10,0x85,0xa7,0x8c,0x7,0x1f,0x2b, + 0x20,0x9b,0x49,0xa3,0x98,0x4b,0x79,0xbb,0xab,0xa4,0xc3,0xbe,0x7e,0xd2,0xc2,0xf6, + 0x51,0x33,0xcc,0x1a,0xb7,0x12,0xf,0x1,0x47,0xeb,0x1b,0xe9,0xfc,0x64,0xd,0x3f, + 0xbc,0x3e,0x83,0x57,0xcf,0x8e,0x5a,0x7f,0x76,0x9,0x91,0xcb,0x83,0x71,0xeb,0xb0, + 0x81,0xbf,0xfd,0xe4,0x29,0xde,0xbb,0xb3,0x8a,0x4d,0xe3,0x2,0x45,0x11,0x2b,0x4b, + 0x2f,0x95,0xf2,0xa5,0x2a,0xba,0x34,0x2d,0x72,0x97,0x47,0x8b,0x84,0x49,0x3f,0x54, + 0x61,0xec,0x69,0xe0,0x5a,0x1b,0xa5,0x75,0x6f,0xb0,0x99,0x2e,0xd2,0xd5,0xc0,0xad, + 0x3f,0x84,0xa8,0x55,0x8e,0xf8,0x7e,0x27,0x46,0x4e,0xa0,0xe2,0x21,0xe2,0xce,0x6c, + 0xd8,0xde,0x2f,0xb2,0xa1,0x25,0x5f,0x86,0x65,0xfb,0x70,0x17,0xe1,0xe2,0x91,0xe0, + 0x4c,0x3,0x3c,0x50,0x48,0xe3,0x95,0xb9,0x11,0x5c,0x3f,0x33,0x8c,0x2b,0xb3,0x43, + 0x38,0x37,0x59,0xc1,0x44,0xb5,0x88,0x74,0x4a,0x25,0x12,0x33,0xfb,0x91,0xe1,0x82, + 0x80,0xf1,0xd5,0xe2,0x36,0x3e,0x7e,0xb0,0xc1,0x1f,0x3e,0xd8,0xc0,0xe3,0x8d,0x43, + 0xf9,0x44,0xda,0x9e,0x5a,0xf0,0x1,0x61,0x68,0x8,0xd1,0xae,0xdf,0x16,0x3,0x41, + 0x49,0x92,0x60,0x48,0x31,0x9b,0xc1,0xc5,0xa9,0x21,0x8c,0x55,0xa,0x89,0x64,0x28, + 0xf3,0x73,0x9f,0x9c,0x76,0xf0,0xe5,0xb3,0x1d,0xac,0xec,0x1e,0x87,0xc8,0x15,0xf9, + 0x51,0xcc,0x48,0x92,0xc3,0xb1,0xd8,0x49,0xea,0xcf,0x1f,0xaf,0x16,0x31,0x3d,0x5c, + 0xc2,0xf4,0xd0,0x0,0xcd,0x8e,0xe,0x60,0xb2,0x56,0xc4,0x44,0xb5,0x84,0xd1,0xc1, + 0x2,0x86,0x7,0xf3,0xc8,0x67,0xd3,0x7d,0xc3,0x43,0xe2,0x16,0xb4,0x41,0xac,0xc0, + 0xf4,0x7a,0x1,0x16,0xb7,0xeb,0xf8,0xea,0xd9,0xe,0xdf,0x7e,0xbe,0x8b,0x27,0xeb, + 0x87,0xbc,0xb4,0x7d,0xc4,0xda,0x7c,0xc9,0x16,0x6d,0x3b,0x1b,0xda,0x9b,0x4b,0xec, + 0xc8,0x55,0x18,0xf0,0xa1,0x33,0x3f,0x75,0xb1,0x37,0x77,0x32,0x33,0x3b,0x5f,0xe9, + 0xc8,0x6d,0xc5,0xf6,0x79,0x26,0x37,0xa1,0xbb,0xb0,0x15,0xa1,0x7b,0x32,0x70,0x3e, + 0x45,0x2d,0x68,0x42,0xa9,0x15,0x86,0x7,0xf3,0xb8,0x38,0x5d,0x43,0xa5,0x98,0x4d, + 0xb4,0x65,0xb5,0x4,0xbf,0xc3,0x26,0xee,0x3c,0xdf,0xe3,0xfa,0x49,0x5b,0x38,0x2c, + 0x7b,0x44,0x3d,0xf6,0x4d,0x8d,0xc8,0xf7,0x8b,0x8f,0xb3,0x43,0xf9,0xb4,0xd3,0xc5, + 0x7,0xf7,0xd7,0x69,0xef,0xb8,0xc5,0x8b,0x5b,0x75,0x7c,0xfb,0xe2,0x4,0x5d,0x9c, + 0xaa,0xf6,0x85,0xde,0xcd,0xc7,0x53,0x29,0x85,0x89,0x6a,0x9,0x7f,0xf1,0xd6,0x59, + 0x1a,0xab,0x96,0xf0,0xf7,0x9f,0x2e,0xf2,0xb3,0xad,0x7a,0x18,0x8d,0xc2,0xec,0xd4, + 0x89,0xe4,0x94,0x54,0x82,0xfb,0xc3,0x16,0x9c,0xd6,0xfc,0x2b,0xe,0x8c,0xde,0x81, + 0x4c,0xd1,0xf,0x27,0x42,0x15,0x10,0x3,0x4a,0x11,0x5,0x41,0xa0,0x97,0xb8,0xf6, + 0x65,0x32,0xd3,0x3a,0x73,0x0,0x2,0x21,0x15,0x7e,0x5c,0x2b,0xe2,0x64,0x36,0x83, + 0x19,0x78,0x39,0x26,0xf2,0x8b,0x1e,0x5b,0x5e,0x6c,0x94,0x17,0x23,0xe5,0x73,0xe6, + 0x48,0xf0,0x7c,0xfc,0x26,0x57,0x92,0xee,0x3c,0xb1,0x13,0x9,0x8d,0x7c,0xa2,0xbe, + 0x34,0x3c,0x77,0xd2,0xc2,0xf6,0x2d,0xf2,0x98,0xf9,0xbc,0x7c,0xbb,0xc5,0x54,0x14, + 0x59,0x83,0xf9,0x1a,0x13,0xcf,0xdc,0x8c,0x9d,0x4f,0x1b,0xcb,0x4e,0x42,0x9f,0xb5, + 0xca,0x46,0x12,0xd8,0x94,0x72,0xa1,0x51,0x57,0x2e,0xa9,0x58,0x85,0x7c,0x64,0x29, + 0x65,0xb3,0xe6,0xaf,0x26,0xb8,0x56,0x59,0x1d,0x32,0xe9,0x8e,0x57,0x6f,0xf7,0x15, + 0x55,0x4b,0x19,0x7a,0xe7,0xca,0x14,0xfd,0xe8,0xe6,0x19,0x1a,0xaf,0x16,0x12,0x77, + 0xe6,0x0,0x70,0xd4,0x68,0xe3,0x93,0xc7,0x9b,0xf8,0xd9,0x67,0xcf,0x71,0xe7,0xf9, + 0xe,0x7a,0x7a,0x2,0x93,0x31,0x78,0x72,0x9,0xc1,0xec,0xdb,0x10,0xca,0x28,0x3c, + 0x4a,0xb8,0xe6,0x9e,0xac,0x21,0xe1,0x85,0x71,0xa6,0x67,0x9,0x45,0x4f,0x9f,0x31, + 0xd9,0x74,0xa,0x39,0xb1,0x2a,0xe8,0x3b,0x4d,0x33,0xa3,0xd7,0x83,0x75,0xc2,0x8d, + 0x86,0xbc,0x90,0x62,0x54,0xa,0x39,0x7c,0xef,0xea,0x14,0x7e,0xfc,0xda,0x19,0x4c, + 0xf,0xf,0xf4,0x8d,0x5b,0xec,0x76,0x43,0xf7,0xb7,0x4f,0x1e,0x6f,0xe1,0x67,0x9f, + 0x2d,0xe1,0xf9,0x76,0xdd,0xfd,0x4c,0xc2,0x5d,0xd0,0xb3,0x64,0x64,0x4a,0x30,0x32, + 0xe9,0xb3,0x43,0x97,0x2d,0x10,0xc9,0x6,0x89,0xbc,0xa4,0xcd,0xf0,0x26,0x61,0xfb, + 0x9c,0x23,0x61,0xd7,0x4b,0x42,0x7a,0x93,0xd0,0x7e,0x11,0x39,0xaf,0x5,0x91,0xae, + 0x19,0x6e,0x46,0x43,0x15,0x99,0x79,0xc,0x8d,0x37,0x82,0x88,0x73,0x53,0x2a,0x59, + 0x99,0x6e,0xb9,0x8b,0x2a,0xd2,0x31,0x1b,0xb6,0x3c,0x21,0x97,0x56,0x28,0xe4,0xd2, + 0x28,0xe5,0x32,0xb8,0x30,0x55,0xc5,0x1f,0x5c,0x9d,0xc2,0x9b,0xe7,0xc7,0xb4,0x97, + 0x0,0xbc,0x46,0x2a,0x4a,0x2c,0x8a,0x6a,0xa4,0x9b,0xad,0xe,0x8e,0x5b,0x5d,0x2c, + 0x6d,0xd5,0xf1,0x8b,0x5b,0x2b,0xfc,0xe1,0x83,0xd,0x2c,0x6e,0xd5,0xf5,0x66,0x4b, + 0xee,0x9f,0xed,0x99,0xcd,0x14,0x63,0xe5,0x93,0xb3,0x10,0x87,0x8b,0x7d,0xd4,0x50, + 0x3b,0xeb,0xf8,0x63,0xfb,0x74,0xf,0x14,0xb3,0xb8,0x30,0x55,0xc5,0x68,0xa5,0x10, + 0x2b,0x8e,0xf2,0xd0,0xde,0x3b,0x3e,0xc5,0xa3,0xf5,0x43,0x6c,0xd5,0x4f,0xdd,0x23, + 0xcc,0x11,0x88,0x51,0x9c,0x1f,0x29,0x2,0xb2,0xd9,0x14,0xb2,0x29,0x85,0x6c,0x26, + 0x85,0x5c,0x3a,0x85,0xf1,0x5a,0x1,0xb,0x63,0x83,0x38,0x3b,0x51,0xc1,0xc5,0xa9, + 0x2a,0xce,0x4d,0xc4,0x75,0xef,0xd2,0xa9,0x2c,0xba,0xd2,0x49,0x72,0x49,0x23,0x22, + 0x74,0xbb,0x3d,0xb4,0xba,0x3d,0x34,0xda,0x1,0x96,0xb6,0xe,0x71,0x77,0x79,0x9f, + 0x7f,0x71,0x6b,0x99,0xef,0x2e,0xed,0x71,0x2f,0x8,0xf4,0x48,0xed,0x18,0xc0,0xe4, + 0x4c,0xed,0x4c,0x45,0x67,0x2d,0x24,0x33,0x7e,0xe1,0x7a,0x30,0xb3,0x6c,0x2b,0x53, + 0x59,0xd8,0x62,0xd,0x3a,0x34,0xc8,0x7,0xf0,0x5c,0x28,0x8d,0x43,0x76,0x8,0x91, + 0xbc,0x6d,0x3b,0xa3,0x44,0x0,0x2d,0x66,0x61,0x9b,0x30,0x32,0x58,0xc4,0xa4,0x96, + 0xb0,0xca,0xb3,0x40,0x5e,0xa3,0x46,0xab,0x87,0xf5,0xdd,0x63,0x6c,0x1c,0x36,0x85, + 0xf4,0x2d,0xe2,0x5a,0x4e,0xca,0xdb,0xc5,0x3a,0x14,0x40,0xb9,0xd5,0x8b,0xd8,0x24, + 0x1b,0x1e,0xc9,0xce,0x51,0x9b,0x7f,0x7b,0x6f,0x3,0x5b,0x87,0x4d,0x6a,0x76,0xba, + 0x9c,0x4e,0x11,0x8d,0x57,0x8a,0x28,0x64,0x53,0xf6,0x3e,0x96,0xfc,0x19,0xf3,0x73, + 0x29,0x45,0xb8,0x34,0x5d,0x43,0xa5,0x98,0xa3,0x7a,0xb3,0x8d,0x4c,0x3a,0xc5,0xcf, + 0xb6,0xea,0x68,0x77,0x7a,0xce,0x2a,0x41,0x87,0xec,0x89,0xc,0xb,0x1d,0xaf,0x0, + 0x10,0x1b,0x47,0x18,0x52,0xa4,0x2,0x33,0x47,0x87,0x4d,0x7e,0x88,0xd9,0x12,0x2, + 0xa5,0x42,0x65,0x3d,0x93,0x49,0x5e,0x62,0x62,0xa2,0xc0,0x44,0xd1,0x6,0x21,0x4f, + 0xcb,0xc2,0xed,0x66,0x2,0x53,0xd6,0xe3,0x95,0x14,0x13,0xb4,0x4b,0x11,0x71,0x5c, + 0x16,0x1f,0x17,0x5e,0xfa,0x5c,0x11,0x73,0x7e,0x58,0x22,0xbc,0x6c,0x9,0x54,0x2, + 0xb1,0x4d,0x32,0xd8,0x25,0xf9,0x9d,0xe2,0xc6,0x32,0xce,0xf0,0x8a,0xad,0x50,0x3e, + 0x6d,0xed,0x18,0x13,0x88,0x11,0x12,0xfd,0x4f,0xb2,0x20,0x4d,0xfc,0x43,0x42,0xb0, + 0x14,0x0,0x50,0x4a,0x7e,0x29,0xf3,0x83,0x28,0x2f,0xc,0x84,0x64,0x4a,0xaa,0x72, + 0x9a,0x74,0x22,0x33,0xc6,0xb9,0xbd,0xb9,0xbd,0x33,0xb5,0x8c,0xc1,0xcc,0xea,0xe, + 0x4d,0x8,0xdf,0x19,0xaf,0x16,0xf0,0x83,0x57,0x66,0xe9,0x9d,0x6b,0xd3,0x34,0x27, + 0x12,0xd3,0xe4,0x41,0x9,0x0,0x7b,0x47,0xa7,0xf8,0xe2,0xe9,0x16,0xde,0xbf,0xb3, + 0x86,0xdb,0x4b,0x7b,0xe,0xc1,0x89,0x4d,0x9e,0xc,0xea,0xeb,0x49,0xfc,0x32,0xd5, + 0x8b,0xa3,0xa1,0x69,0x88,0xd6,0x2f,0x39,0xda,0x47,0x3,0x6e,0xd2,0x8a,0x5e,0xca, + 0xcf,0xbb,0x5c,0xc8,0xa2,0x56,0xce,0x61,0xeb,0xf0,0x54,0xf8,0x11,0x3b,0x7d,0xcc, + 0x64,0xb5,0x84,0x3f,0x7b,0x73,0x1e,0x7f,0x70,0x7d,0x1a,0x67,0xc7,0x2b,0x5e,0xce, + 0x76,0x14,0xb9,0xd8,0x6f,0xb4,0xf1,0xf,0x9f,0x3d,0xc7,0xdf,0x7d,0xba,0x88,0xcd, + 0xfd,0x86,0x7f,0xf0,0x70,0xdc,0x34,0xc1,0x39,0x80,0xd1,0x37,0x4f,0xe7,0x3a,0xca, + 0x4c,0x64,0xa,0x90,0x48,0xc7,0xb6,0xcc,0x3a,0x6d,0xfd,0x69,0x49,0xd0,0x6,0x93, + 0x71,0x1e,0xe8,0xc2,0x26,0x41,0x53,0x63,0x94,0x21,0xc4,0xbb,0xcd,0x18,0x39,0x8d, + 0xab,0x5,0xf1,0x42,0x5f,0x4,0x57,0xe0,0xed,0xb7,0x37,0xb7,0x9f,0xc5,0xe6,0xe1, + 0x5,0xa8,0x7a,0x2f,0xba,0xd2,0xc6,0xe7,0x4c,0x32,0x41,0x83,0x35,0xef,0x21,0x8b, + 0xab,0x33,0x35,0xbc,0x7a,0x76,0x14,0xd7,0xcf,0xc,0x63,0x66,0x64,0x0,0xe5,0x7c, + 0x6,0xc5,0xdc,0x37,0xc3,0xeb,0xd1,0x62,0xde,0xeb,0x5,0x78,0xbc,0x71,0x88,0xf7, + 0xee,0xac,0xf1,0x7,0xf7,0xd6,0xb0,0x79,0xd0,0xe0,0xe3,0xd3,0x8e,0xf6,0x5d,0x4f, + 0xda,0xd7,0x24,0x48,0xed,0xec,0x11,0x0,0x2f,0x2f,0xdc,0x19,0xf8,0x90,0x88,0xe0, + 0xe,0x7f,0xa4,0x52,0x2e,0x83,0xf3,0x93,0xd5,0x44,0xb2,0x9e,0x9,0xda,0x69,0xb4, + 0x3a,0x58,0xdd,0x6b,0x60,0xe3,0xa0,0xe1,0x9b,0x58,0xca,0xbc,0x67,0xf6,0x80,0x1d, + 0xd4,0xca,0x79,0x2c,0x4c,0xc,0xe2,0xfc,0x44,0x5,0x67,0xc7,0x6,0x71,0x6e,0xa2, + 0x82,0x6a,0x29,0x87,0x62,0x2e,0x8d,0x4c,0x5a,0x21,0x9b,0x4e,0x21,0x9f,0x49,0xf5, + 0x85,0x6f,0xfb,0x35,0xb4,0x51,0x2f,0x9,0x66,0x46,0xbd,0xd9,0xc1,0x9d,0xe7,0xbb, + 0xfc,0xfe,0xdd,0x55,0x3c,0x58,0x3d,0xe0,0xcd,0x83,0x26,0xd7,0x1b,0x6d,0xf4,0x58, + 0xeb,0xe4,0x2c,0x43,0x4b,0xd9,0x9,0xdb,0xa4,0xa3,0xd9,0xdd,0xb7,0x2d,0xdc,0xe1, + 0xa8,0xc7,0x60,0xe,0xf4,0x2e,0x43,0x53,0xe4,0x64,0xf4,0x88,0xdd,0xb9,0x7b,0xd6, + 0xbe,0xee,0xd9,0x92,0x7d,0xb0,0xcf,0xf8,0x24,0xb9,0x8e,0x62,0x2f,0xe8,0x83,0x10, + 0x1a,0xb6,0x4c,0xd6,0x8a,0x9e,0x1f,0x45,0xd2,0xb5,0x69,0xb4,0xba,0xb8,0xb3,0xb4, + 0x8b,0xa5,0xdd,0x23,0xb6,0x2e,0x88,0xc,0x9b,0x40,0x2f,0xa9,0x20,0x2e,0x85,0xde, + 0x1f,0x48,0x54,0x44,0xf9,0x20,0x58,0xf1,0xf6,0x3b,0x3f,0xdd,0x38,0xe2,0xc3,0xc6, + 0x33,0xdc,0x59,0x3a,0xc0,0x7f,0xf3,0xd6,0x2,0x7d,0xeb,0xfc,0x28,0x8a,0xf9,0x6c, + 0xcc,0x78,0x26,0xda,0x78,0x8c,0xe,0xe6,0xf1,0xdf,0x7d,0xff,0x22,0x4d,0xf,0x95, + 0xf0,0xff,0x7e,0xbc,0xc8,0x8f,0xd7,0xf,0xa8,0xdd,0xd,0x98,0x24,0xcc,0xe0,0x8, + 0xa6,0xc4,0x76,0x7f,0xcd,0x0,0xa5,0x8,0x1c,0x98,0xbd,0x1b,0x1,0x50,0x9c,0xa2, + 0x80,0x82,0xc0,0xc4,0x59,0x6a,0xb7,0x19,0xfd,0x77,0x8,0x2,0x2,0x11,0xa5,0xf4, + 0xa3,0xc9,0xca,0x23,0x7c,0x22,0x20,0x30,0x5,0x20,0x22,0x8d,0xd,0xea,0xfc,0x75, + 0x8d,0xbb,0xb0,0x8a,0x21,0xe2,0xa2,0x74,0x73,0x2,0x22,0x49,0x31,0x53,0x65,0xdf, + 0xda,0x5d,0x6,0x77,0x99,0x73,0x5f,0x5e,0x9f,0x8,0x1f,0x81,0x10,0x63,0xe1,0xdb, + 0x41,0x53,0xab,0xa4,0xd2,0x24,0x27,0xf4,0xc8,0xf,0xa9,0x38,0x61,0x2f,0x90,0x50, + 0xa0,0xa2,0x3d,0x89,0xf,0x3c,0x8,0x69,0xe,0x9,0xd1,0x29,0xc9,0x5d,0xbc,0xb2, + 0xb8,0x92,0x11,0x95,0xfa,0xbc,0x60,0x63,0xee,0xa1,0x5c,0x2,0x9b,0x25,0xc7,0x39, + 0x5b,0x29,0xcb,0x81,0x67,0x45,0xc,0x50,0x29,0x9f,0xa6,0x9b,0xb,0x63,0xea,0x47, + 0x37,0x67,0xe9,0xfc,0x44,0x85,0xa2,0x10,0x9c,0x3c,0x28,0x9f,0x6e,0x1c,0xe0,0xe7, + 0xb7,0x56,0x70,0x77,0x65,0x4f,0xd8,0xdc,0xc2,0x4f,0xc9,0x82,0x14,0x23,0xc6,0xd6, + 0x81,0x9e,0x7d,0x26,0x43,0x38,0x72,0x81,0x90,0xcb,0xa4,0x30,0x3d,0x5c,0xc4,0xdc, + 0xd8,0x20,0x4a,0xd9,0x34,0x2,0x6d,0xcd,0xba,0xb2,0x7b,0x8c,0x7,0xab,0x7,0x9, + 0xbb,0x76,0xd7,0x7d,0xc9,0xef,0xa2,0x52,0xea,0x1b,0xad,0x3f,0x1,0xe0,0xc2,0x74, + 0xd,0xef,0x5c,0x99,0xc2,0xef,0x1f,0x6f,0x61,0x6d,0xf7,0xd8,0xde,0x6c,0xa5,0x7c, + 0x1a,0xf3,0xe3,0x83,0x78,0xeb,0xe2,0x78,0x58,0xcc,0x85,0x73,0x56,0x14,0xd6,0x65, + 0x66,0x3c,0xdb,0xac,0xe3,0x37,0x77,0xd7,0xf0,0xfe,0xdd,0x35,0xac,0xee,0x9d,0xc4, + 0xbf,0xa1,0x22,0x2f,0xf1,0xcc,0x73,0x6f,0x79,0x99,0xb7,0xf0,0x35,0xd7,0x23,0x6e, + 0x84,0x89,0x63,0xb5,0xfb,0x52,0x9a,0xcf,0x20,0x12,0xa5,0xda,0x46,0x65,0xb3,0x4b, + 0x33,0xb5,0xc4,0x4d,0x6d,0x43,0x41,0x2e,0x79,0xd,0x66,0x93,0xc3,0x62,0xd5,0x23, + 0x4a,0x7c,0xa8,0x81,0xb6,0x52,0xba,0x44,0x9b,0x73,0x99,0x8c,0xc7,0x7e,0x5e,0x20, + 0x32,0x2a,0x85,0x4a,0x31,0x8b,0xa1,0x81,0x5c,0x48,0xe2,0xaa,0x14,0x30,0x51,0x2d, + 0x62,0x61,0x3c,0x2c,0x5a,0xf3,0x63,0x65,0x64,0xd2,0x71,0xff,0xf3,0xe8,0xc1,0x67, + 0xa,0xb9,0x79,0x9d,0x3b,0xdd,0x1e,0x9e,0xef,0x1c,0xe3,0xd1,0xea,0x3e,0x7f,0xf5, + 0x7c,0xf,0x9f,0x3d,0xde,0xe2,0xa7,0x9b,0xf5,0x78,0xd9,0x26,0x5,0xb6,0xb0,0xa1, + 0x30,0x97,0xe2,0x88,0x84,0x82,0x5d,0x58,0x8d,0x29,0x2f,0x92,0xa3,0x23,0x88,0xb9, + 0xac,0x14,0x61,0xac,0x5a,0xa2,0xa1,0x81,0x9c,0x57,0x58,0xe5,0x24,0xdc,0xb,0x7a, + 0x58,0xdc,0x3e,0xc2,0xe3,0xf5,0x3,0x34,0x5a,0x3d,0xb7,0xb3,0x17,0xd7,0xaf,0x98, + 0x4d,0xa1,0x56,0xca,0xa3,0xa6,0xaf,0xcd,0x70,0x39,0x8f,0xb1,0xc1,0x2,0xa6,0x86, + 0x4a,0x98,0x19,0x2e,0x61,0x6a,0x68,0x0,0x13,0x3a,0x29,0x2c,0x89,0x5c,0x15,0xf5, + 0x59,0x57,0x4a,0xd9,0x9f,0x21,0x69,0x45,0x64,0x56,0x0,0xdb,0xf5,0x26,0x56,0x76, + 0x8e,0xf9,0xe9,0x46,0x1d,0xf7,0xd6,0xf6,0xf9,0xd6,0xb3,0x1d,0xde,0x3c,0x6c,0x4a, + 0x1f,0x61,0x1d,0xce,0x43,0x6,0x54,0x84,0xe,0x5,0xf2,0xa,0xb9,0xa9,0x24,0x7a, + 0x95,0x6b,0xe8,0xd0,0x4c,0x61,0x84,0x10,0xb3,0x17,0xc1,0xc9,0xae,0xbc,0xfb,0xa3, + 0x80,0xd6,0x47,0xbb,0xa6,0x52,0xac,0x2a,0x5d,0xb2,0xab,0x78,0xc0,0x5d,0xaa,0xb4, + 0x4b,0xcb,0xcb,0x67,0x53,0x38,0x3b,0x59,0xa1,0xb1,0x4a,0xe1,0x85,0x32,0xc6,0x46, + 0xab,0x8b,0x5b,0x4b,0x7b,0x58,0xdc,0x3e,0x71,0xeb,0x62,0x33,0xa5,0x5b,0xa6,0xb7, + 0x62,0x47,0xcc,0xf3,0x2c,0xfb,0xac,0x68,0xd1,0xcb,0x20,0x21,0x8f,0x85,0x3,0x6, + 0xa8,0xcb,0x8c,0xad,0xc3,0x53,0x1c,0x9d,0x6e,0x71,0x3e,0x93,0xc2,0xde,0x71,0xb, + 0xaf,0xcc,0xf,0xd3,0xcc,0x70,0x9,0x39,0x7d,0xbf,0x47,0xa5,0xc1,0x44,0x84,0x54, + 0x4a,0x61,0xb8,0x9c,0xc7,0x5b,0x97,0x26,0xa8,0x13,0x30,0xde,0xff,0x3a,0xc3,0x5f, + 0x2f,0xef,0xd1,0xc9,0x69,0x2f,0x6c,0x95,0xec,0x18,0x4b,0x22,0x39,0x4f,0x93,0x14, + 0x41,0x6,0xed,0x20,0x50,0xa0,0x48,0xbb,0xd0,0xe8,0x74,0xcd,0x0,0xc,0xa,0x2, + 0x3b,0x22,0x42,0x27,0xe4,0x58,0xf,0x8a,0xc0,0x28,0x64,0x4d,0x7e,0x1a,0x59,0xeb, + 0x67,0x3d,0x3c,0x28,0x27,0xc4,0x62,0x31,0x4b,0x3b,0x43,0x55,0xe1,0xb5,0x26,0x7, + 0x45,0x80,0xa8,0xcf,0x90,0xe7,0xad,0x24,0x65,0xdb,0xeb,0x46,0x72,0x8a,0xc6,0x10, + 0x26,0x94,0x70,0xbf,0xee,0x3a,0x24,0x2a,0x2d,0xc9,0x33,0x3e,0xa9,0xc7,0x6f,0xdf, + 0xfa,0xd4,0x7c,0x1f,0x1b,0x48,0xd8,0x30,0x47,0x25,0x3f,0x96,0x29,0xae,0x9c,0x56, + 0xc8,0x14,0x70,0x9b,0xb5,0xe6,0xf8,0x70,0x5e,0x8e,0x1a,0x83,0xac,0x3c,0xd3,0xe8, + 0xdb,0xb5,0x9c,0x21,0x34,0x1b,0x70,0xe9,0x59,0x94,0xcf,0xa6,0xe9,0xe6,0xc2,0x28, + 0xbd,0x73,0x75,0x8a,0x5e,0x3b,0x3b,0xe6,0x85,0x30,0x48,0x78,0xae,0x17,0x4,0xd8, + 0x3b,0x6a,0xe1,0xab,0xe7,0xbb,0xf8,0xf5,0xed,0x55,0xb4,0xbb,0x81,0x85,0x99,0x5c, + 0x9c,0x24,0x7c,0xc9,0x17,0x39,0x12,0x18,0x4b,0x25,0x71,0x94,0x50,0xa8,0xaf,0x44, + 0x26,0xad,0x70,0x76,0x62,0x10,0x3f,0x78,0x65,0x6,0xff,0xea,0xf5,0x33,0x98,0x1c, + 0x1a,0x40,0xaf,0x17,0x60,0xbb,0xde,0xc4,0xdf,0x7d,0xba,0x88,0xc7,0xeb,0x75,0x74, + 0x83,0xa8,0x80,0x84,0x23,0x5,0x92,0xc5,0x83,0x4d,0x2f,0x4c,0x58,0x63,0x66,0xdc, + 0x98,0x1b,0x42,0x21,0x9b,0x42,0xb7,0x17,0x9e,0x34,0x7b,0x47,0x4d,0x64,0xd2,0xa, + 0x97,0xa6,0xaa,0xf8,0xb7,0x6f,0x9f,0xc7,0x1b,0xe7,0xc7,0x30,0x34,0x90,0x17,0xc3, + 0xb6,0x8f,0x5c,0xf4,0x82,0x0,0xfb,0xc7,0x2d,0x7c,0xf8,0x70,0x3,0xff,0xc7,0xaf, + 0xef,0x63,0xf7,0xa8,0xe5,0xd9,0x3d,0x44,0x77,0xff,0xd2,0x94,0x44,0xea,0xd1,0x5f, + 0x62,0x83,0xee,0xb1,0xc6,0x49,0x3a,0x30,0x5a,0x87,0x2d,0xb2,0x54,0x17,0x52,0x5e, + 0xfd,0x25,0xe1,0x9d,0x6f,0xa1,0x48,0x8e,0xe8,0xc2,0xed,0xde,0x52,0x2e,0x93,0xc9, + 0x3f,0x68,0x25,0x80,0xcf,0x3a,0xbd,0xcb,0xf3,0x36,0x26,0xdf,0x54,0x59,0x66,0xc0, + 0x19,0xff,0x81,0x5c,0x3a,0x85,0x89,0x5a,0x11,0x17,0xa7,0xaa,0xb8,0x32,0x5b,0xc3, + 0xb5,0xd9,0x1a,0xe6,0xc6,0x6,0x31,0xa4,0xbd,0xec,0xfb,0xed,0x14,0x93,0xe0,0x6b, + 0x39,0xc9,0xb4,0xda,0x1d,0x2c,0xef,0x9e,0xe0,0x6f,0x3f,0x5e,0xe4,0xf,0x1f,0x6c, + 0xf0,0x62,0xb8,0x6f,0xb4,0x30,0xa4,0x1c,0xb6,0x6d,0x43,0xe2,0xfd,0xf8,0xcc,0x88, + 0x22,0xb7,0x14,0x23,0x69,0xb2,0x80,0xc9,0x6c,0x45,0x57,0x4,0xcc,0xc,0xf,0xd0, + 0xec,0xc8,0x80,0x87,0xe2,0x44,0x21,0xed,0x6e,0x8f,0x71,0x7f,0xf5,0x0,0xf,0xd6, + 0xe,0x5,0x69,0x31,0x7c,0x6d,0x53,0x14,0x92,0xea,0xe6,0xc7,0x7,0x71,0x65,0xba, + 0x8a,0x4b,0xd3,0x55,0x5c,0x98,0xa8,0x60,0x6e,0xac,0x8c,0x42,0xc4,0x20,0xa9,0x9f, + 0x14,0xb3,0x9f,0x52,0x42,0xda,0xf,0x47,0x77,0xc7,0x27,0xa7,0x5d,0x3c,0xdd,0x3a, + 0xc2,0x47,0xf,0xd6,0xf9,0x83,0xfb,0x9b,0xfc,0x74,0xa3,0xce,0xcd,0x76,0xd7,0x3c, + 0xb5,0x66,0x44,0xd,0x6f,0x69,0x4d,0x93,0x34,0x39,0x0,0x9a,0x4d,0xa5,0x73,0xb6, + 0x8d,0xc2,0x4b,0x85,0x25,0x5a,0x4c,0xe7,0x61,0xb5,0x51,0xc,0x32,0xf,0xb0,0xa3, + 0x2d,0x90,0xe3,0xb,0x1b,0x26,0x39,0xb9,0xdf,0xcf,0xdd,0x4c,0xb6,0x66,0x29,0x67, + 0xef,0x21,0x8d,0xc1,0x59,0xaf,0x43,0x58,0x8c,0x69,0x85,0x5c,0x1a,0xe7,0x27,0x6, + 0x31,0x5e,0x29,0x50,0xd4,0xa3,0x40,0x5e,0xc3,0xe3,0x56,0x17,0x77,0x9f,0xef,0xf3, + 0xca,0xce,0x89,0x21,0xf2,0xc5,0xf2,0x7,0xc4,0xb2,0x96,0xa3,0x1c,0x12,0x2f,0x3c, + 0x84,0x23,0xbc,0x2e,0x77,0x3c,0xd9,0xc3,0xb1,0xd9,0xe,0xe8,0x17,0xb7,0x57,0xf9, + 0xfe,0xea,0x3e,0xfe,0xe2,0xcd,0x5,0xbc,0x73,0x65,0x82,0x2e,0x4d,0xf7,0x77,0x9b, + 0x34,0x1f,0x9b,0x1e,0x2a,0xe1,0x5f,0x7f,0x7b,0x81,0x34,0x54,0xcf,0x5f,0x3e,0xdb, + 0xc1,0x69,0x47,0x37,0xf0,0x36,0xc5,0x41,0x1a,0x48,0x2a,0x45,0x1,0x7,0x20,0x5, + 0xa6,0x80,0xcc,0x1a,0x8d,0xc0,0x8a,0x3,0xa,0xc2,0x71,0xdb,0xd4,0xe,0x56,0x8, + 0x38,0xb0,0x26,0x34,0x8a,0x81,0x40,0x53,0x3,0xd,0x2a,0x1e,0xa4,0x40,0x29,0x6, + 0x7,0x30,0x69,0x2f,0x1a,0x37,0xd4,0x2e,0xb3,0x91,0xc6,0x9e,0x92,0x6,0x3a,0x24, + 0xd4,0x61,0x39,0xc,0x82,0x22,0xff,0x8f,0x8,0x6a,0xa6,0x10,0x4d,0x8d,0x93,0xf5, + 0x25,0x9a,0xb9,0x1e,0xd,0x66,0xe1,0xd0,0x29,0xce,0x11,0x31,0x8,0xe8,0x13,0x4a, + 0xd5,0xcf,0x6f,0x3c,0x5a,0xde,0x9,0xb1,0xbd,0x63,0x84,0x68,0x44,0x72,0x51,0xae, + 0xdf,0x65,0x81,0xa0,0xb3,0x9d,0xcf,0xc9,0x4e,0xf4,0x86,0x55,0xa4,0x48,0xda,0xc0, + 0x6a,0x16,0x9d,0x8d,0xa4,0x35,0x85,0x3d,0xfc,0xea,0xe3,0xd5,0x2,0xfe,0xf8,0xf5, + 0x33,0xea,0xed,0x4b,0x93,0x14,0x3d,0x4c,0xe5,0x61,0x71,0x72,0xda,0xc5,0x2f,0xef, + 0xac,0xe0,0xa3,0x7,0x9b,0x68,0x77,0xd9,0xbb,0x4b,0x1d,0xfc,0x25,0x63,0x61,0xa3, + 0xf,0x64,0xc2,0xb1,0xa8,0xdf,0xcd,0x66,0xd2,0xb8,0x34,0x55,0xc5,0xcd,0x85,0x61, + 0xdc,0x9c,0x1f,0xc1,0xc5,0xa9,0x1a,0x26,0x87,0x6,0xf4,0xe1,0x44,0x18,0xaf,0x16, + 0x8d,0x8e,0x93,0x65,0x90,0xbd,0xdf,0x46,0x79,0x18,0x25,0x5,0xdf,0xa0,0xab,0x35, + 0xbf,0x63,0x29,0x9f,0xc5,0xb9,0x89,0x2a,0xfe,0xcd,0x77,0xcf,0xe1,0xfb,0xd7,0xa7, + 0xd0,0x6c,0xf7,0x90,0x52,0x84,0x6a,0x29,0x87,0xf3,0x93,0x15,0xc,0x8b,0xa0,0x8f, + 0xa4,0xc9,0x7c,0x75,0xf7,0x4,0x7f,0xff,0xe9,0x12,0x7e,0x7b,0x7f,0xd,0xbb,0x27, + 0xed,0x30,0xc4,0xf6,0xb7,0x50,0x27,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x20, + 0xf2,0xbc,0xc7,0x46,0x71,0x4b,0x68,0x48,0x6e,0xfd,0xfa,0x4d,0xe8,0x24,0xcd,0x14, + 0xfc,0xdf,0xc6,0xa7,0x9e,0x98,0x24,0xcc,0xd0,0x6d,0x49,0xe,0xd0,0x22,0x5a,0x92, + 0xbd,0x70,0x6,0x19,0x38,0x43,0x71,0x46,0x22,0xc9,0xfd,0x16,0x3c,0xf7,0x5e,0xb9, + 0xcb,0x57,0x96,0x34,0x41,0x62,0xc7,0x39,0x51,0x2d,0xd2,0x44,0xad,0x84,0xc9,0x6a, + 0xb8,0xc7,0x1c,0xad,0x16,0x30,0x5a,0x2e,0x60,0x68,0x20,0x87,0x4a,0x29,0x8b,0xe1, + 0x81,0x7c,0x62,0xb6,0xb4,0xbc,0xee,0x51,0x39,0x9a,0x84,0x8a,0x83,0x80,0x71,0x77, + 0x65,0xf,0xb7,0x16,0x77,0xf8,0xf3,0x67,0x3b,0x78,0xbc,0x76,0xc8,0x5b,0x87,0xd, + 0x83,0x3,0x8b,0x20,0x19,0x17,0x10,0xe2,0x6c,0x3c,0x5,0x52,0x66,0x12,0x26,0x7c, + 0x35,0x10,0x62,0x3e,0x52,0x82,0xac,0x6b,0xf6,0x19,0x8a,0x14,0x26,0x6b,0x45,0x4c, + 0xd,0x95,0xb4,0x9a,0x97,0x13,0xc9,0x70,0xed,0x6e,0x80,0x2f,0x9f,0xed,0xe0,0xce, + 0xf3,0x3d,0x14,0x73,0x59,0xd4,0x4a,0x39,0x4c,0xd6,0xc2,0xe9,0x7b,0xbc,0x52,0xc4, + 0x64,0xad,0x80,0xa1,0x81,0x3c,0x2a,0xa5,0x2c,0x86,0x6,0xf2,0x18,0x2c,0x64,0xbc, + 0x58,0xdd,0xe8,0xb3,0x19,0x8d,0x2c,0x7d,0x91,0xc6,0x59,0x16,0x88,0x76,0xa7,0x87, + 0xc5,0xed,0x3a,0x1e,0xac,0x1e,0xf0,0xa3,0xf5,0x43,0x3c,0xdf,0x3e,0xe2,0x95,0x9d, + 0x13,0x6c,0x1e,0x36,0xf8,0xb4,0x1d,0xc0,0x52,0xdb,0x4c,0xe,0xb6,0xc9,0x2e,0xd3, + 0x1,0x3f,0x7a,0xcd,0xca,0x96,0x13,0x17,0x52,0x33,0x35,0x83,0x9d,0xd9,0xc9,0xd2, + 0xc0,0x7a,0xe1,0xa4,0xb,0xbb,0x32,0xbe,0xa2,0x6,0x8d,0x66,0x79,0x75,0x49,0x46, + 0x6f,0x4a,0x2a,0xb1,0x54,0xfa,0x32,0xc9,0x84,0x54,0x1b,0xfb,0xe7,0xb6,0xb0,0x6e, + 0x13,0x98,0x4b,0xa7,0x71,0x61,0xaa,0x86,0x89,0x5a,0x29,0xf1,0x2c,0x30,0xd7,0x6f, + 0xeb,0xb0,0x81,0xa5,0xbd,0x13,0x34,0x3a,0x3d,0x67,0x20,0x43,0xec,0x8a,0xb7,0x72, + 0x85,0xdc,0xba,0x3b,0xf9,0x36,0x1,0x3e,0xfb,0x9a,0xe3,0x7e,0x63,0x62,0xcd,0x69, + 0xbf,0xf2,0xfa,0x41,0x93,0x7e,0xf6,0xe5,0x12,0xaf,0xec,0x9d,0xe0,0xcd,0xf3,0x23, + 0x78,0xeb,0xc2,0x38,0xd,0x97,0xf3,0xb1,0xfb,0x5f,0x36,0x66,0xd9,0x4c,0xa,0xdf, + 0xbb,0x32,0x45,0xe5,0x7c,0xe,0x3,0xf9,0x34,0xbe,0x78,0xb6,0xc7,0xbb,0x47,0x4d, + 0xf8,0xc6,0xbe,0x76,0x6d,0x11,0x2a,0x99,0x98,0x34,0xe4,0xe,0x67,0x2d,0x18,0x6, + 0xd9,0x90,0x26,0xcc,0x2b,0xe,0x60,0xc8,0x16,0xc4,0xca,0x19,0xf2,0x85,0xdb,0x36, + 0xd,0xfe,0x91,0xb0,0x92,0x37,0x1b,0xb6,0x80,0x98,0x28,0x70,0xd7,0x40,0xfe,0x0, + 0x8a,0xa2,0x97,0x2a,0xb9,0xa2,0xb,0xcd,0x3b,0xc5,0x60,0x78,0x6f,0xb1,0xe1,0x6a, + 0xb,0x4b,0x1d,0x23,0x47,0x34,0x54,0x2a,0xe1,0x10,0x73,0x5f,0x2d,0x6d,0x49,0x6e, + 0x94,0x44,0x8f,0x97,0xf2,0x26,0x7,0xce,0xf9,0x12,0x21,0x82,0x67,0x5f,0x2a,0x64, + 0x70,0x96,0x94,0xc4,0x32,0x52,0xd4,0xb4,0x37,0x29,0x92,0x6c,0x61,0x48,0xd2,0x80, + 0x67,0xe7,0xa,0xb7,0x8f,0x95,0x52,0x14,0xc1,0x1e,0xf3,0xe2,0x2e,0x9,0x18,0x2c, + 0x66,0xe9,0xfc,0x64,0x8d,0xde,0x38,0x37,0x46,0xa3,0x95,0x42,0xdf,0x5d,0x9b,0x49, + 0x24,0xfb,0xec,0xf1,0x36,0xee,0xad,0xec,0xdb,0x93,0xdd,0xda,0x12,0x68,0x66,0xb8, + 0x95,0x6c,0x98,0xa2,0xce,0x91,0xfc,0x10,0xeb,0x72,0x40,0xc8,0x64,0x8,0xf9,0x4c, + 0xa,0x95,0x52,0x1e,0x33,0xb5,0x22,0xbe,0x7d,0x69,0x2,0x6f,0x5d,0x18,0xc3,0xa5, + 0xe9,0x9a,0x77,0x0,0x1d,0x37,0xdb,0xd8,0xaa,0x9f,0x62,0x75,0xf7,0x24,0xe2,0xfd, + 0xe8,0xed,0xd8,0x20,0x8d,0xfb,0x15,0x88,0x5b,0x9d,0x80,0x7a,0x41,0x60,0x63,0x2b, + 0xfb,0xd9,0x3c,0x32,0x33,0x6,0xf2,0x69,0xdc,0x98,0x1f,0x79,0x61,0x88,0x46,0x74, + 0xf2,0x69,0x77,0xba,0x58,0xd9,0x6b,0xe0,0xe3,0x47,0x9b,0xf8,0xc7,0xaf,0x96,0xb0, + 0xb2,0x7b,0xcc,0x88,0xca,0xae,0x88,0x23,0xc1,0xb9,0x92,0x94,0x6b,0xd6,0xcd,0xca, + 0x53,0x49,0x24,0x65,0x4a,0x7b,0x5a,0x4a,0x8f,0x74,0x3,0x88,0x2e,0x87,0x3d,0xe5, + 0x0,0x31,0x11,0x87,0x5a,0x5d,0x37,0x6c,0x38,0xc1,0xba,0x89,0xd9,0x72,0xd1,0x8a, + 0x42,0xfb,0x1f,0xf9,0xf6,0x1e,0xf7,0xc7,0x9b,0xe6,0x1,0xa5,0x14,0xa5,0x15,0x21, + 0xad,0x42,0x58,0x30,0x93,0x4a,0x85,0x2c,0xd2,0xb4,0x42,0x3e,0xad,0x30,0x32,0x98, + 0xa7,0x99,0x91,0x32,0xe6,0x47,0x7,0x30,0xaf,0x77,0xbf,0xe3,0x95,0x82,0x4d,0xf0, + 0x8a,0x92,0xda,0xa2,0x70,0x70,0x94,0xbc,0x24,0xff,0x7c,0xda,0xee,0xa2,0xd9,0xee, + 0xe1,0xd9,0x56,0x1d,0xbf,0x7f,0xb4,0xc5,0xef,0x7f,0xbd,0xc6,0x8f,0x36,0xea,0x76, + 0xef,0xa9,0x8d,0x78,0x3c,0xb3,0x54,0x97,0x65,0x22,0x9e,0x53,0xfb,0x35,0x35,0x96, + 0x21,0xed,0xe,0x3c,0x12,0xad,0xd0,0x4a,0xd9,0x70,0xce,0xf0,0x55,0x4c,0xa5,0x8, + 0x93,0x43,0x25,0x4c,0xd6,0x1c,0xb,0x3f,0xa9,0x80,0x74,0x3,0xe,0xf7,0xba,0x43, + 0x25,0x2c,0x8c,0xd,0x62,0x66,0xa4,0x84,0x33,0x23,0x3,0x58,0x18,0x2b,0x63,0x6e, + 0xb4,0xec,0x19,0x9f,0x44,0x77,0xdb,0x49,0xc,0xfe,0xe8,0x34,0x2e,0xf3,0xbc,0xa3, + 0x7b,0xd8,0xd3,0x76,0x17,0xa7,0x9d,0x1e,0x1a,0xad,0x2e,0x96,0x77,0x8e,0xf8,0xeb, + 0xa5,0x7d,0x7c,0xf4,0x68,0x93,0xef,0xaf,0x1e,0x72,0xa3,0xd5,0x91,0x40,0x68,0x38, + 0x7e,0xb9,0xfb,0xcd,0xfc,0x8f,0xa1,0xc4,0x15,0x35,0x96,0x84,0xac,0x9d,0xc1,0x9d, + 0x7f,0x7c,0xa0,0xbf,0x8e,0x65,0xbb,0x87,0x65,0x81,0x59,0x6b,0x27,0xd9,0x68,0x3, + 0x1d,0xdf,0xcd,0xb,0xb,0xf5,0x21,0x26,0xc1,0x6b,0x67,0x87,0x0,0xd9,0x30,0x4a, + 0x23,0xc0,0x17,0xb6,0xd9,0xf6,0x3e,0x2f,0x17,0xb3,0x98,0x1d,0x19,0xb0,0x45,0x32, + 0xfa,0x8c,0x5,0x41,0x18,0x9d,0xbb,0xbc,0x7d,0xc2,0xfb,0x27,0x2d,0x7b,0x86,0x86, + 0x3d,0x7,0x59,0x83,0x40,0xe7,0xa4,0xa2,0xc3,0xe5,0x2d,0xf3,0xda,0x86,0x6d,0xf8, + 0xc2,0x4b,0x8f,0x90,0x4d,0x2e,0xd2,0x8e,0x94,0x26,0x86,0x86,0x97,0x2a,0x60,0xf0, + 0xe2,0xd6,0x31,0xb6,0xeb,0x2d,0x6c,0xd7,0x4f,0x91,0x52,0xa,0xdf,0x3a,0x37,0x46, + 0xe5,0x42,0x1a,0x99,0x74,0x2a,0x76,0x66,0x99,0x67,0x64,0x68,0x20,0x87,0xb7,0x2f, + 0x8d,0x51,0xc0,0x8c,0x94,0x4a,0xe1,0xc3,0x87,0x9b,0xa8,0x37,0x3b,0x8e,0x3b,0x13, + 0x93,0x57,0x11,0x14,0x93,0x62,0xe2,0x30,0xad,0x29,0xa0,0x20,0xdc,0x9a,0xa4,0x94, + 0x7e,0x6d,0x3,0x4a,0x11,0x71,0xa0,0x3d,0x7b,0x18,0x4a,0x6b,0xd4,0xc8,0x48,0x5e, + 0xc1,0x60,0xa4,0x40,0x8,0x44,0x5c,0x33,0x9c,0xed,0x24,0xf9,0x44,0x2,0x4d,0x8f, + 0x11,0xf2,0xda,0x58,0xe2,0x91,0x7,0x55,0xfa,0xc8,0xad,0xf8,0x7c,0x1b,0xbb,0x4c, + 0xf1,0x25,0xb5,0xc7,0xd5,0x11,0x86,0x65,0xac,0xfd,0x2e,0x38,0xc9,0xca,0x19,0xac, + 0x9d,0xe2,0x1c,0x9b,0x8,0x32,0xbc,0xcf,0x4b,0x9d,0x88,0xe5,0x28,0x5b,0x4b,0x1c, + 0x13,0x76,0x11,0xc5,0xfc,0xcd,0x36,0x2a,0x14,0xdd,0x4b,0x46,0x80,0xc4,0xd9,0xe5, + 0x6e,0xd3,0x1c,0x4c,0x32,0x93,0xc5,0x16,0x78,0x67,0x31,0x63,0xba,0x2c,0xf7,0xef, + 0x85,0xbe,0x8d,0x40,0x57,0x66,0x87,0xe8,0x9d,0x2b,0x93,0x4a,0xa6,0x53,0xf5,0x9b, + 0x6a,0xbb,0x1,0x63,0xf3,0xb0,0x89,0xd3,0x4e,0x20,0xe0,0x2f,0xc7,0x4,0x37,0x19, + 0x99,0x12,0xfe,0x20,0x22,0xab,0xe9,0x95,0x1e,0x27,0x85,0x6c,0xa,0xe7,0xc6,0x2b, + 0xb8,0x39,0x3f,0x8c,0x57,0xe6,0x86,0x71,0x71,0xaa,0x8a,0x6a,0x29,0x87,0x6c,0xc6, + 0x87,0x5,0x9b,0xad,0xe,0x1e,0xae,0x1f,0xe2,0xff,0xfe,0xe0,0x9,0x7f,0xfe,0x74, + 0x3b,0x54,0x5f,0x29,0x88,0x17,0x8a,0x62,0x49,0x9a,0xe6,0xbb,0xd5,0x9b,0x1d,0x6c, + 0x1c,0x34,0x31,0x36,0x98,0x47,0x36,0x93,0x4e,0x94,0xad,0x49,0x22,0x55,0x3f,0xbf, + 0xe5,0xa4,0xb7,0x6e,0xb7,0x87,0xf5,0x83,0x26,0xfe,0xe6,0xe3,0x67,0xf8,0xcf,0x5f, + 0x2e,0xf3,0xde,0xd1,0xa9,0x78,0x5d,0xfd,0x89,0xdb,0x35,0x36,0xd1,0x4,0x37,0xcb, + 0x55,0x13,0x5e,0x42,0xf4,0x82,0xd7,0x40,0x39,0x79,0x18,0x93,0x7d,0x50,0xe0,0x22, + 0x18,0xb4,0xf4,0x57,0x7b,0x64,0xbb,0x34,0x40,0x99,0xe8,0xc2,0xc2,0x91,0x89,0xec, + 0xf4,0x6a,0x24,0x80,0xde,0x31,0xc0,0xbe,0x98,0x3c,0xe1,0xb1,0x28,0x17,0xb2,0x54, + 0x1d,0x8,0xa7,0xcc,0xe1,0x72,0x1e,0x43,0xe5,0x3c,0x46,0xca,0x79,0x1a,0xe,0xff, + 0x8b,0x91,0xc1,0x1c,0x6,0xf2,0x19,0x64,0xd3,0x29,0x64,0x52,0xa,0xd9,0x8c,0x42, + 0x36,0xa5,0xbc,0xf5,0x45,0x3f,0x18,0x38,0x69,0x5a,0x97,0xd7,0xe6,0xb4,0xdd,0xc5, + 0xc3,0xf5,0x43,0xfc,0xe2,0xd6,0xa,0x7f,0xf5,0x6c,0x8f,0xd7,0xe,0x4f,0x70,0x74, + 0xd2,0x61,0x72,0x9d,0x12,0xbb,0x38,0x2f,0xab,0xca,0xf5,0x64,0x2e,0x46,0xd5,0xc3, + 0xc6,0x31,0xd7,0x76,0x61,0xce,0x2a,0x9d,0xac,0xe5,0x19,0x5b,0xc7,0x62,0x4b,0x0, + 0x74,0x0,0x2b,0xa5,0x34,0x92,0x34,0x5e,0x2d,0xf6,0x7d,0xd,0x7b,0xbd,0x0,0xb9, + 0x8c,0xc2,0xbf,0xff,0xfe,0x5,0x74,0x7b,0x8c,0x72,0x21,0x83,0xac,0x26,0xb4,0x65, + 0xd3,0xca,0x12,0x39,0x5f,0x44,0x60,0xfb,0x66,0xbb,0x2,0x8a,0x15,0x73,0xcb,0x7f, + 0xd9,0x3c,0xc2,0x97,0xcf,0x76,0xf8,0xb3,0xa7,0x3b,0xbc,0xbc,0x7b,0x8c,0xfd,0x93, + 0x16,0x37,0x4f,0xbb,0x38,0xed,0xf6,0xe0,0xd8,0x3,0xae,0x4a,0x89,0xf3,0x98,0xdd, + 0x83,0x1c,0x32,0xd8,0x11,0x84,0xd7,0x54,0x6b,0xc7,0x8d,0x9e,0x9c,0x8d,0x64,0x8d, + 0xad,0x1b,0x9,0x19,0xf2,0x9b,0x7d,0x9f,0xc9,0xd2,0xc1,0x19,0x1e,0x77,0xd2,0x99, + 0x5a,0x5a,0xca,0xb6,0xf9,0xa3,0x35,0xda,0x24,0xa7,0x8a,0x22,0x69,0x50,0x44,0x4e, + 0x61,0xad,0xbf,0x78,0x5a,0x29,0x8c,0x55,0xa,0xa8,0x8a,0x30,0xa9,0xe8,0x35,0xa, + 0x38,0xc0,0xd3,0xad,0x63,0xdc,0x5f,0x3f,0x40,0xaf,0x67,0xef,0xe,0x87,0x4c,0x18, + 0x87,0x62,0x16,0xd1,0xc3,0x76,0xda,0x56,0xd6,0xf,0xc2,0x86,0xa7,0x68,0xa7,0x74, + 0x8e,0x45,0x88,0x39,0xcf,0x6b,0x32,0x4,0x1,0xfd,0xc8,0x42,0x31,0x9d,0xb4,0x7a, + 0x7c,0x7b,0x69,0x8f,0x76,0x4f,0x5a,0x7c,0x7f,0xf5,0x10,0xff,0xe6,0x3b,0xb,0x34, + 0x3b,0x32,0x90,0xf8,0x5a,0x9a,0xdf,0x23,0x9f,0x4d,0xe3,0x7b,0x57,0x26,0xa8,0x5a, + 0xca,0xa2,0x32,0x90,0xa5,0x5f,0xdd,0x59,0xb,0xb6,0xeb,0xa7,0xd6,0x87,0x34,0x44, + 0x9,0x94,0x43,0xc6,0x4d,0xcb,0xca,0x3a,0x6c,0x95,0x10,0x12,0xd8,0xb5,0xc4,0x84, + 0x3,0x76,0xde,0x25,0xa6,0xa3,0x61,0xd2,0xd4,0x7,0x63,0xcd,0x67,0xfc,0xf7,0xa3, + 0xe4,0x36,0x72,0x9e,0xd2,0x81,0xb3,0xa2,0xb1,0x68,0xa1,0x34,0x68,0xf2,0xa8,0x3f, + 0x51,0xc2,0x9b,0x5f,0x4b,0x63,0x26,0x5f,0xec,0xf2,0x2c,0x98,0x1c,0x43,0x9e,0x3d, + 0x28,0x84,0x22,0xa9,0x83,0xe2,0xdb,0x1a,0x96,0x7b,0x2c,0x8e,0x8d,0x9c,0xe9,0x81, + 0xce,0x29,0x37,0x27,0x88,0xf8,0x66,0x32,0xf,0x5a,0x85,0x2f,0x74,0x8c,0xba,0xcd, + 0x76,0x17,0xc4,0x31,0x18,0xc2,0xfd,0x42,0x96,0x7c,0xac,0x19,0xc5,0x2c,0x27,0x19, + 0x57,0xcc,0xed,0x4d,0x2e,0x21,0x2c,0x3,0xdf,0xbb,0x40,0xa2,0xf0,0x2f,0xe7,0x46, + 0xcb,0xb8,0x3c,0x53,0x45,0x3e,0x9b,0xfa,0xc6,0x43,0x22,0xa5,0x8,0xa3,0xd5,0x2, + 0x32,0xeb,0x87,0xe8,0xf4,0xd8,0xc9,0x9,0x8c,0x19,0x87,0xd4,0x11,0xc2,0x1,0x11, + 0x29,0xa5,0x50,0xce,0x67,0x31,0x58,0xcc,0xa0,0x52,0xca,0x61,0xa4,0x9c,0xc3,0x54, + 0xb5,0x88,0x33,0xa3,0x65,0x9c,0x9f,0x1c,0xc4,0xc2,0xd8,0x20,0x2a,0xc2,0xbd,0x8a, + 0x99,0xd1,0xed,0xf6,0xb0,0xb6,0xdf,0xc0,0xdd,0x95,0x7d,0x7c,0xfc,0x68,0x93,0x3f, + 0x79,0xb4,0x89,0xc3,0x66,0xc7,0x1b,0x97,0x88,0x39,0x96,0x7e,0x25,0x21,0x9a,0xe7, + 0xdb,0x47,0x7c,0x6f,0x65,0x9f,0xaa,0x97,0x26,0x90,0xcd,0xc4,0x9d,0xc4,0xfa,0xc1, + 0x94,0x49,0x87,0xa3,0xfc,0x77,0x8d,0x56,0x1b,0x8f,0xd6,0xeb,0xf8,0xe0,0xde,0x6, + 0x7f,0x70,0x7f,0x3,0x3b,0xf5,0x53,0xc1,0x56,0x17,0xe1,0xdf,0x9e,0xb4,0x82,0x12, + 0xf2,0xbe,0xdd,0x8d,0xcc,0xc,0xee,0xf4,0x2,0xca,0xbf,0xc8,0xe8,0xc3,0x7c,0xdc, + 0xe4,0x9,0x4b,0x9c,0xcf,0x9a,0x6d,0xa9,0xd0,0x41,0x13,0x8a,0x95,0x54,0x50,0xb8, + 0x6,0x88,0x72,0x69,0x85,0xca,0x40,0xe,0x33,0x43,0x25,0xd4,0x6,0xb2,0xc8,0xa4, + 0x52,0x48,0xa5,0x74,0x5f,0xeb,0x28,0x74,0xc4,0x71,0x4f,0x6,0xaf,0xa8,0xe7,0xb2, + 0x69,0x94,0x73,0x19,0x94,0xb,0x69,0x94,0xb,0x59,0xaa,0x14,0xb3,0xa8,0x14,0xb3, + 0x28,0x17,0x32,0xa8,0x96,0x72,0x31,0xa8,0xb8,0x1f,0x1c,0x9c,0xd4,0x68,0xc9,0x49, + 0x34,0x7a,0x90,0xed,0x1f,0xb7,0xb0,0xba,0x7f,0x82,0x27,0xeb,0x47,0xfc,0xf5,0xca, + 0x1e,0x3e,0x7d,0xbc,0xcd,0x2b,0xbb,0xc7,0x2c,0x66,0x25,0xb9,0xac,0x64,0x31,0xa0, + 0xb0,0xd4,0xcc,0xda,0xde,0xcf,0xc8,0x2d,0xd9,0xb9,0xf6,0x39,0xd4,0x2e,0x54,0xfb, + 0x1a,0x43,0x45,0x99,0x56,0x4a,0xa6,0x8a,0xe9,0x9d,0x2a,0xa5,0x14,0xd5,0x4a,0x39, + 0x54,0x4b,0x59,0xa4,0xfa,0x98,0x19,0x81,0x80,0x6c,0x2a,0x85,0xb3,0xe3,0x83,0x89, + 0x5,0x37,0x9,0xa,0x7e,0xd1,0x3d,0x9a,0x14,0x96,0x22,0xef,0xd9,0xa3,0x66,0x7, + 0x5b,0xf5,0x26,0xb6,0xf,0x1a,0xbc,0xba,0xdf,0xc4,0x93,0xcd,0x3a,0x1e,0xae,0x1d, + 0xf2,0xa3,0xb5,0x43,0x6e,0x76,0xba,0x5a,0x4,0x6e,0x38,0x94,0x22,0x6,0xd1,0x86, + 0x90,0x84,0x44,0x36,0xf1,0x78,0xb1,0x55,0xeb,0x29,0x1d,0xcc,0xa5,0x93,0xd3,0xf4, + 0xb5,0x67,0xfd,0x85,0x98,0x8,0xcc,0x3a,0x59,0x53,0xb7,0x5,0x3a,0xbf,0x8b,0xd, + 0x4c,0xc4,0x2c,0xb4,0x46,0x86,0xe6,0x60,0x1f,0x13,0x6d,0xa8,0x61,0xd0,0x27,0x53, + 0xc2,0x35,0x4f,0x9b,0x9,0x8a,0x38,0xaa,0x6f,0xf5,0xe4,0x6c,0xe1,0x3a,0x71,0x6a, + 0x78,0x80,0xc,0xfb,0x3f,0x89,0x7b,0x40,0x20,0x3c,0xdb,0xaa,0xf3,0x83,0xb5,0x3a, + 0xba,0xc6,0x2f,0xdc,0xda,0x83,0xb1,0xb3,0xaa,0xf5,0x95,0xa2,0x6c,0x92,0x43,0xc9, + 0x63,0x6a,0x9b,0x4b,0x21,0xcf,0x40,0x16,0xe4,0x3e,0xa3,0xd5,0x13,0x6c,0x1a,0x23, + 0x8a,0x54,0x44,0x8d,0x4e,0xc0,0x8f,0x36,0x8e,0xd0,0xe9,0x31,0xb2,0x19,0x85,0x6f, + 0x9d,0x1b,0xa5,0x4b,0x53,0x61,0x2,0x5e,0x12,0xba,0x68,0x8a,0xfa,0xe5,0xe9,0x5a, + 0x48,0x3b,0x8,0x40,0x1f,0x3d,0xde,0xc2,0xca,0xee,0x89,0x8d,0x5c,0x23,0x72,0x5, + 0xd6,0xcc,0x76,0x36,0x29,0x15,0xa4,0x58,0x71,0xa0,0x99,0x10,0x9e,0x5,0x78,0xb8, + 0x6f,0xf,0xdd,0xe3,0x42,0x98,0x22,0x20,0x4b,0x82,0x64,0xcb,0x12,0x75,0x45,0x5e, + 0xbb,0xd7,0x69,0x8d,0xa5,0x7d,0x85,0xad,0x19,0x9d,0x12,0x55,0xd5,0x73,0xc3,0x72, + 0x53,0x34,0x4b,0xb3,0x2d,0xdf,0xa2,0x2,0xd1,0xd,0xa5,0x64,0xa3,0x5,0xe8,0xe3, + 0xe1,0xa0,0x8f,0xe2,0x0,0x22,0xd7,0x35,0xcc,0x12,0x40,0xda,0x32,0x27,0xe1,0x8b, + 0xde,0xa5,0xdd,0x80,0x1f,0xd5,0xa4,0xc7,0x49,0x25,0x2d,0x61,0x23,0xdb,0x4f,0x91, + 0xdc,0xce,0xc2,0x98,0x43,0x1a,0xbe,0x38,0x82,0x1b,0xbc,0x94,0xd4,0xb8,0xd5,0x93, + 0x73,0xac,0x12,0x9d,0x2d,0x4c,0xcc,0x24,0x79,0xdd,0x4e,0xf8,0x81,0xe1,0xc1,0x2, + 0xcd,0x8e,0x94,0x29,0xf3,0x2,0x8,0xcf,0xdc,0x40,0x85,0x6c,0x1a,0x6f,0x9c,0x1d, + 0x43,0xbd,0xd1,0xc1,0x97,0xcf,0x76,0x23,0xe6,0x31,0x31,0xfb,0x9e,0xd0,0x5e,0x8f, + 0x28,0x64,0x2e,0x8f,0x95,0xb1,0x30,0x5e,0xc6,0xd5,0x99,0x1a,0x2e,0xcf,0xd4,0x30, + 0x5a,0xce,0xdb,0xc3,0xde,0x64,0x2c,0xcb,0x1b,0x76,0x75,0xaf,0x81,0xdf,0xdc,0x5b, + 0xe3,0x9f,0x7f,0xb5,0x8a,0x3b,0xcb,0xfb,0x6c,0x7b,0xf6,0x48,0xd4,0x5e,0xd4,0xf6, + 0x5a,0x82,0x71,0x4f,0x36,0x8e,0xf0,0xfb,0x7,0x9b,0x7c,0x65,0xa6,0x46,0xa5,0x5c, + 0xfa,0xa5,0xdd,0xb0,0x5e,0x34,0x1d,0x9e,0xb6,0x3b,0x78,0xb4,0x5e,0xc7,0xcf,0x6f, + 0xad,0xf2,0x7f,0xfa,0x64,0x11,0x8d,0xff,0x8f,0xb6,0x37,0x6b,0xd2,0x34,0xbb,0xae, + 0xf3,0xf6,0x3e,0x99,0x55,0xd5,0xd5,0x33,0xd0,0x40,0x3,0x60,0x83,0xc4,0x40,0x91, + 0x30,0x68,0x99,0x83,0x69,0x9b,0x8e,0x10,0x15,0xe,0x85,0x15,0xa1,0x4b,0x5d,0xf8, + 0x4e,0x3f,0xc5,0xbf,0x47,0x17,0xe,0xdb,0x57,0xba,0x50,0x78,0x64,0xd0,0x41,0x8a, + 0x92,0x48,0x2,0xe0,0xd0,0x4,0xd0,0x18,0xba,0xd1,0xd5,0x43,0x55,0x57,0x65,0x4d, + 0x99,0x95,0x73,0x7e,0x67,0xf9,0xe2,0x9c,0xbd,0xf7,0xda,0xfb,0xbc,0x5f,0x83,0xa2, + 0xc3,0x8c,0x90,0x50,0xdd,0x5d,0x5d,0x9d,0xf9,0xe5,0xfb,0x9e,0xb3,0x87,0xb5,0x9e, + 0x75,0x79,0x3,0x49,0x59,0xde,0x2d,0x89,0x3,0x57,0x9c,0x2d,0xc3,0xec,0xe2,0xc5, + 0xef,0x1d,0x72,0x79,0xdd,0xe5,0xd5,0x97,0xf6,0x9,0xc1,0xec,0xb9,0x1f,0x9a,0x16, + 0x77,0x6,0x34,0x49,0xe3,0x29,0x42,0x7,0xcf,0x9e,0x12,0xbe,0xf,0xb4,0x2,0xe8, + 0xed,0x37,0x5f,0x96,0xdf,0xfb,0xd6,0x5b,0xfa,0xcf,0xfe,0xf1,0x3b,0xf2,0x9d,0x77, + 0xde,0xd4,0x97,0x6f,0x1f,0xc8,0xdd,0xdb,0x87,0x9b,0x59,0xec,0xbf,0xcc,0xf2,0xb7, + 0xaf,0x83,0xde,0x27,0xec,0xf9,0xfb,0x76,0x9b,0xfb,0xe8,0x7b,0xcf,0xce,0xae,0xe4, + 0xdd,0x7b,0x4f,0xf1,0x7f,0xff,0xed,0x27,0xf2,0x57,0xbf,0x78,0x8c,0x7,0x4f,0xcf, + 0x60,0x6,0xe7,0x30,0xea,0xf9,0x57,0xe0,0x63,0x6,0xf5,0x63,0x8c,0x7b,0x26,0xd0, + 0x76,0xcc,0xc6,0xbc,0x39,0x8,0x3d,0x7a,0x81,0x49,0x4,0x73,0x93,0xc8,0xf8,0x1b, + 0xad,0xa9,0xc2,0x5d,0x0,0x4d,0x5e,0xbe,0x73,0x28,0xaf,0xde,0x39,0x64,0xb9,0x70, + 0xfa,0xbf,0x83,0xd6,0xe4,0xa0,0xed,0x57,0x5a,0xff,0xa7,0xd2,0xdb,0xb6,0x52,0xd1, + 0x4c,0x53,0xf0,0xe4,0xf4,0x4a,0xde,0x7f,0xf0,0x1c,0xdf,0x7f,0xff,0x48,0xbe,0xf7, + 0xfe,0x11,0xde,0xfb,0xf4,0x39,0x2e,0x26,0x13,0xdc,0x33,0xd8,0x48,0x8c,0x36,0x90, + 0x9c,0xa0,0xcf,0x13,0x86,0x61,0x85,0x78,0xe2,0xba,0xa9,0xd7,0x1b,0x20,0x1d,0x33, + 0x9f,0xdd,0x85,0x6f,0xb0,0x7f,0x3e,0xc7,0xed,0xaa,0x7d,0x5e,0xe4,0x24,0x8c,0x6b, + 0x2a,0xf4,0xfb,0x22,0x8e,0x94,0x78,0xc4,0x73,0x92,0x3f,0x6c,0x3,0x14,0x42,0x3f, + 0x36,0xbd,0x12,0x49,0x56,0x8d,0x97,0x78,0x9,0x79,0x4,0x6d,0xaa,0x5f,0x7b,0xeb, + 0x55,0xfd,0xd5,0xb7,0xb2,0x48,0xb1,0xae,0x78,0x76,0x80,0xfc,0xe2,0xe8,0x85,0xbc, + 0xff,0xe8,0x4,0xd7,0x1d,0xc4,0x9b,0xcf,0x97,0xb9,0x68,0x1b,0xb4,0xbb,0x46,0x6f, + 0x1c,0xe5,0xec,0xc,0x77,0x31,0xdd,0xf8,0x94,0x39,0xc,0xd2,0xa3,0xfa,0x83,0xe9, + 0xc2,0xa,0x49,0x42,0x4c,0x55,0xd5,0xf,0x1f,0x9f,0xe2,0x5f,0xff,0xe9,0xcf,0xe5, + 0xde,0xe3,0x53,0xf9,0x1f,0xfe,0xe0,0x9b,0xfa,0x9b,0x93,0x2f,0xb0,0xef,0x8c,0x7e, + 0xf5,0xee,0x2d,0xf9,0xdd,0x6f,0xbe,0xa5,0x2f,0xbf,0x74,0x4b,0xbf,0xf0,0xda,0x4b, + 0xfd,0x7f,0xf9,0xf,0x1f,0xc8,0xd3,0xb3,0xcb,0x91,0x60,0x27,0xa2,0x21,0xea,0xa0, + 0x20,0x36,0xf8,0x18,0xdd,0x43,0x5b,0xfa,0x44,0x3b,0xcf,0x9f,0xaa,0x9a,0x17,0x71, + 0x9c,0x24,0x73,0x89,0x3e,0xbb,0x75,0x1f,0x67,0xcd,0x42,0x70,0xbc,0x4d,0x23,0xf9, + 0x49,0x4b,0x37,0x6d,0x9c,0x85,0x48,0x4e,0x6b,0x2b,0xe4,0xd3,0x6e,0xbd,0x94,0x2c, + 0xb7,0xc7,0xc2,0x46,0x67,0x67,0x8e,0xb3,0x95,0x5,0xe1,0xec,0x57,0x42,0x43,0x7c, + 0xd,0x4d,0x66,0x7c,0xaa,0xf2,0xbe,0xb1,0xf4,0x84,0x1a,0xfb,0x1e,0x8f,0x74,0x3, + 0xe5,0xe8,0x2a,0x69,0x2c,0xc8,0xcf,0x2a,0x69,0xcf,0x2e,0x91,0x9f,0xb4,0xac,0xc0, + 0x63,0x7a,0xce,0x30,0xe,0x27,0x19,0xf1,0x3,0xeb,0xff,0x72,0xf3,0x8b,0x3e,0xd6, + 0xac,0x73,0x37,0xa5,0x2a,0xaf,0xdd,0xbd,0x25,0x7c,0xd9,0xed,0x1b,0x77,0x8a,0x88, + 0xbc,0x74,0xeb,0x40,0xfe,0xf0,0xbb,0x5f,0x95,0xb7,0xdf,0xb8,0x2b,0xdf,0xf9,0x95, + 0x37,0xe5,0x83,0x87,0x27,0xf2,0xf8,0xe4,0x52,0xae,0x6f,0xba,0xdc,0x3a,0x6c,0xf2, + 0xfa,0xdd,0x5b,0xa3,0xb,0x7f,0xf9,0x8e,0xbc,0xfe,0xf2,0x6d,0x79,0xfd,0xee,0x6d, + 0x79,0xe3,0xe5,0x5b,0x62,0x9d,0xdb,0x1b,0xaf,0xdc,0x91,0x37,0x5f,0xb9,0x23,0x5f, + 0x7c,0xe5,0x76,0xba,0x3c,0xd8,0x12,0x77,0xef,0xd1,0x89,0xfc,0xf9,0xcf,0x1e,0xe1, + 0xaf,0x3f,0x7c,0x2c,0x3f,0x7f,0x70,0x2c,0x1f,0x3d,0x3a,0x99,0xdc,0x12,0x84,0x8a, + 0x3b,0x28,0x15,0x29,0xdd,0x6a,0xb2,0x54,0x8c,0xff,0x2c,0xf7,0x9f,0x9f,0xc9,0xdf, + 0x7c,0xfc,0x54,0xff,0xfa,0x17,0x8f,0x71,0xf7,0xd6,0x81,0xbe,0xf5,0xfa,0xdd,0x4, + 0xd9,0xf8,0xbc,0x3,0x73,0x4b,0xcc,0xf4,0xf8,0xe4,0x42,0xfe,0xea,0x83,0x23,0xfc, + 0xd1,0xbb,0x9f,0xca,0x5f,0xfd,0xe2,0x31,0xce,0xaf,0x6e,0xca,0x9f,0xa1,0xb2,0xf5, + 0x57,0x5a,0x5c,0xf4,0x1e,0x4f,0x4d,0x3f,0xd4,0xab,0x5d,0x97,0x27,0x2f,0x2e,0xe4, + 0xcd,0x57,0x6e,0xc9,0x1,0x59,0xb0,0xea,0xe,0xdb,0x9f,0x41,0x52,0x8e,0x7a,0x2c, + 0xa1,0x78,0xf1,0x19,0x13,0x7a,0xde,0x8f,0xcf,0xbf,0xf8,0xed,0x6f,0xbe,0xa5,0xff, + 0xf2,0xbf,0xf9,0xa6,0x7e,0xf3,0xcb,0xaf,0xcb,0xeb,0x2f,0xdf,0xfa,0xa5,0xa3,0xee, + 0xbf,0xcf,0x45,0xb2,0xaf,0xd3,0xde,0xda,0xe9,0x6e,0x75,0x99,0x5b,0x4a,0x76,0xfb, + 0x73,0x2f,0xae,0x6f,0xe4,0x67,0xf,0x8e,0xe5,0xdd,0x8f,0x9e,0xe2,0x67,0x9f,0x1e, + 0xcb,0x7,0x8f,0x4e,0xf0,0xe0,0xe9,0x29,0x8e,0x5e,0x5c,0x6,0x1d,0xcc,0x1d,0x81, + 0xbe,0xaf,0xb3,0xee,0xf,0x61,0x7c,0xa0,0x90,0x15,0x14,0xb7,0x0,0xc2,0x74,0xac, + 0x98,0x81,0x9e,0x95,0x3b,0xa1,0x73,0xda,0xd8,0x54,0x69,0x71,0xe1,0x9d,0xba,0x8a, + 0xe0,0xee,0xed,0x5b,0x5a,0xad,0x76,0xfb,0xac,0x62,0x75,0xe7,0xfd,0xcb,0xc4,0x9b, + 0xfb,0x3e,0x3f,0xfb,0xfb,0x47,0xc7,0x17,0x72,0xef,0xe8,0x85,0x7c,0xfc,0xe4,0x14, + 0x1f,0x3f,0x39,0x95,0xfb,0x4f,0xcf,0x71,0x74,0x7c,0x2e,0x47,0x27,0x57,0xf2,0xe8, + 0xf8,0x1c,0x17,0x33,0x9b,0x3c,0xca,0xf0,0xd0,0x19,0x84,0x2a,0x68,0x46,0x7a,0x44, + 0xd8,0x21,0xdf,0x4f,0x10,0xbb,0xe8,0x47,0x5c,0xe5,0x4c,0x4c,0x93,0xde,0x23,0x90, + 0x7b,0xcc,0x63,0x61,0x77,0x78,0xb3,0x4f,0x13,0xf6,0xe1,0x77,0xdb,0xb7,0x53,0x37, + 0x85,0xba,0xec,0x69,0x1e,0x2c,0xe9,0x17,0x28,0x9a,0xe5,0xb0,0x8d,0xf0,0x11,0x37, + 0x55,0x35,0x21,0xc4,0x42,0x44,0x8e,0x34,0x55,0x79,0xfb,0xcd,0xbb,0xf2,0x2b,0x6f, + 0xbd,0xfc,0x39,0xd9,0xe7,0x22,0x9f,0x3e,0x3d,0x97,0x87,0xc7,0x97,0x62,0x97,0xb9, + 0x79,0xe9,0x66,0x2c,0x2d,0xc2,0x96,0x26,0xd0,0x36,0xa3,0xe2,0xfa,0x98,0x61,0x75, + 0xf1,0xe3,0x34,0x8d,0x31,0x98,0x44,0xcb,0x8a,0x2d,0x1e,0xd,0xfb,0xba,0x46,0xa1, + 0x48,0xa8,0xc5,0x31,0xce,0xb8,0xea,0x82,0xbf,0xf8,0xe0,0xb1,0x9c,0x5e,0x77,0xfc, + 0xd3,0xef,0x7c,0x45,0x7f,0xff,0x5b,0x6f,0xe9,0xaf,0xd3,0x64,0xa7,0xbe,0x6b,0xad, + 0xa9,0x7c,0xeb,0xcb,0xaf,0x88,0xea,0x57,0x5b,0x6b,0xda,0xff,0xf8,0x47,0xf,0xe4, + 0xc7,0x9f,0x3e,0x13,0x2b,0x46,0xfd,0x53,0x77,0x17,0x80,0xef,0x92,0x74,0xd6,0x66, + 0xf3,0x3,0x1f,0xac,0xf7,0xb9,0x1e,0x1f,0xf3,0x98,0x29,0xda,0xc2,0xf8,0x77,0x20, + 0x3a,0x16,0x2d,0xd2,0xc7,0xb3,0x0,0x90,0xcd,0xab,0xcf,0xfd,0xa,0x8b,0x2,0x23, + 0xca,0x3d,0xbf,0x53,0xf6,0xb0,0xc1,0x3a,0x69,0x3a,0xd3,0xad,0xd9,0x29,0x9,0x82, + 0xa0,0xe9,0x75,0x4f,0x17,0x36,0x39,0xdd,0xa1,0x4b,0xc8,0xda,0xe8,0xe4,0xd5,0xb1, + 0xeb,0x87,0xc1,0xe2,0xe,0x8d,0x3,0x68,0xe8,0xe,0x51,0x1a,0xa3,0x72,0x68,0x8b, + 0x26,0xab,0x70,0xb2,0xab,0xe5,0xa4,0xc4,0x69,0x66,0x9d,0xc1,0x97,0x1a,0x28,0x19, + 0xd5,0xcc,0x93,0x6,0x2f,0x5d,0x4d,0xe9,0xde,0xe2,0x32,0xcf,0x16,0xf5,0x59,0x86, + 0x6b,0x64,0x6a,0x47,0xb6,0x4b,0xfb,0x25,0x7b,0xdb,0xf8,0xbf,0xdb,0xb7,0xe,0xe4, + 0xd7,0xbe,0xf4,0x9a,0x7c,0xe5,0xf5,0x97,0xe4,0xeb,0x6f,0xbd,0x22,0x3f,0xb9,0xff, + 0x5c,0x3e,0x3a,0x3a,0x95,0xcb,0xeb,0x9d,0xdc,0x39,0x6c,0xf2,0x85,0xd7,0xee,0xc8, + 0x5b,0xaf,0xda,0xee,0xf4,0x25,0xf9,0xe2,0xab,0x63,0x7f,0xba,0x75,0x48,0xdb,0x7f, + 0xaf,0x77,0xc8,0xc5,0xf5,0x8d,0x9c,0x5d,0xee,0xe4,0xc1,0xf3,0x33,0x79,0xf7,0xde, + 0x53,0xfc,0x6f,0x3f,0xf8,0x48,0x7e,0xfc,0xc9,0x33,0x74,0x64,0xa3,0x94,0xf2,0x58, + 0x3,0x31,0x46,0x36,0x9e,0xad,0x8,0x15,0xbc,0xf3,0x7,0xf8,0xf1,0xe3,0x33,0xfc, + 0xe9,0x7b,0x9f,0xe9,0xed,0xc3,0x3,0xfc,0xc1,0x6f,0x7c,0x59,0x5f,0x7f,0xf9,0xce, + 0x5e,0x86,0xf3,0xbe,0x5f,0x3,0x22,0xcf,0xce,0xae,0xe4,0x2f,0x7f,0xfe,0x8,0xff, + 0xcf,0xdf,0xdd,0x97,0x3f,0xf9,0xd1,0x7d,0x8c,0x9d,0x63,0xcb,0x1c,0x24,0xcd,0x25, + 0xf8,0x32,0x4a,0x28,0x9,0xb1,0x2c,0xb4,0x3e,0xbf,0xea,0xfa,0xd1,0xd1,0xa9,0x7c, + 0xf1,0xd5,0x3b,0xe,0x24,0x59,0x4,0x62,0x4d,0xa5,0xda,0x2c,0xaa,0xd0,0xc3,0xfc, + 0xe4,0x1,0x27,0xe1,0xdf,0x31,0x4c,0xea,0xdf,0xf8,0xd2,0x6b,0xf2,0xdb,0xdf,0x78, + 0xeb,0x3f,0xa9,0x3b,0xfe,0xfb,0x4c,0x2f,0xf6,0xfd,0x35,0xaf,0x38,0xb6,0xfc,0xe3, + 0x5c,0xd0,0x19,0xa5,0xec,0xe2,0xba,0xcb,0xd5,0x6e,0x27,0xcf,0xcf,0xaf,0xe5,0x93, + 0xa3,0x17,0xf8,0xde,0xfb,0x8f,0xe5,0x2f,0xde,0x3f,0xc2,0x7b,0x9f,0x3e,0x3,0xc5, + 0x4f,0x88,0x93,0x66,0xd,0x34,0x11,0x1f,0xad,0x77,0x95,0xb0,0x51,0x85,0xfd,0x9b, + 0x8a,0xfa,0x33,0xcb,0x40,0x17,0xd2,0xca,0x80,0x8d,0xb2,0x4d,0x85,0x26,0x77,0xd4, + 0x84,0xcc,0xb8,0xca,0x83,0x61,0xbb,0xdc,0xfa,0xfc,0xf6,0x5,0xee,0xd4,0x82,0xf6, + 0xf3,0x8a,0xa4,0x28,0x90,0x20,0x57,0xbb,0x2e,0x57,0xd7,0x5d,0xae,0x77,0x3b,0x39, + 0xbb,0xde,0xc9,0xd1,0xf1,0xb9,0x7c,0xfc,0xf8,0x14,0xef,0xdd,0x3f,0x96,0x9f,0xdc, + 0x3f,0xc6,0xcf,0x3f,0x3b,0x96,0x93,0xf3,0x6b,0x1b,0xfe,0xfa,0xd4,0xd3,0x2c,0x67, + 0xce,0x60,0xd,0x21,0xff,0x3c,0xe2,0x3d,0x53,0xd0,0xfc,0x68,0x73,0x17,0x3e,0x27, + 0x1d,0x10,0xa0,0x35,0x78,0x3a,0x89,0x5d,0xf0,0x90,0x3e,0x9f,0xcd,0xe,0xa3,0x99, + 0x40,0x21,0xcd,0xc6,0xec,0x53,0x66,0x25,0xf0,0xef,0xe,0xe5,0xed,0x1,0x15,0xac, + 0x88,0x98,0xb3,0xb9,0x6a,0x9e,0x7a,0x37,0x69,0xe3,0xe0,0x4e,0xcd,0x4b,0xf2,0xe, + 0xc7,0x38,0xf4,0x40,0xe5,0xed,0x37,0xee,0xca,0x57,0xde,0x78,0x59,0xf,0x29,0x71, + 0x91,0xcf,0xb9,0x27,0x2f,0x2e,0xe4,0xe7,0xf,0x4f,0xf0,0xf8,0xf4,0x12,0xf0,0x54, + 0xb5,0x71,0xf,0x74,0x50,0xbd,0xe1,0xbd,0xa9,0x37,0x89,0xe8,0x1e,0x6b,0xe0,0x3d, + 0xab,0x3f,0x8a,0x1e,0x9c,0x13,0x38,0x27,0x1b,0xea,0x24,0x74,0x19,0x68,0xaa,0x67, + 0xc3,0x78,0x1a,0xcd,0xeb,0xb3,0x8b,0x6b,0xfc,0xfb,0x9f,0x3f,0x92,0xf3,0xeb,0x9d, + 0x5c,0xdc,0xdc,0x88,0xaa,0xea,0x3b,0x5f,0xb8,0x2b,0xb7,0x4b,0xd1,0x68,0x4d,0xca, + 0x9d,0x5b,0x87,0xf2,0x9b,0x5f,0x7d,0x5d,0x5e,0xbe,0x73,0xd8,0xa0,0xda,0x8f,0x4e, + 0x2f,0xf1,0xe8,0xe4,0xc2,0xf4,0xb1,0x11,0xdf,0xd3,0x7,0xe,0xd6,0x50,0x87,0x1a, + 0x7c,0xdb,0x79,0x91,0x8f,0xff,0x37,0x9e,0x82,0x36,0x7f,0xd,0x92,0x42,0xe,0x3a, + 0x8b,0x1e,0xcc,0x17,0xca,0x14,0xca,0x10,0x91,0x3,0x9a,0x98,0x26,0xc8,0x8b,0xa6, + 0x71,0x46,0x86,0x38,0x38,0xf9,0x8a,0x62,0x93,0x19,0xdf,0x98,0x71,0x34,0x9d,0x33, + 0x2c,0x54,0x58,0xdf,0xea,0x89,0xa7,0x89,0xed,0x4f,0xed,0x7c,0x9f,0xab,0xe2,0x43, + 0x8a,0x33,0x95,0xf4,0x73,0x61,0xb7,0x9b,0x85,0xad,0x6c,0xa0,0xd1,0xb8,0x7b,0xda, + 0xe7,0xc9,0xb,0x9b,0x3,0x49,0x35,0x13,0x4a,0x5b,0x89,0x2f,0xcc,0xe3,0xf5,0x49, + 0x92,0xf3,0x7d,0x94,0xc6,0x88,0xd6,0xf,0x73,0x49,0xf,0xbd,0x8a,0xc8,0x35,0x8d, + 0xbb,0x3f,0x4f,0x8c,0xc3,0x7f,0xff,0xf6,0xad,0x43,0xf9,0xd6,0xdb,0xaf,0xc9,0xaf, + 0x7c,0xe1,0x15,0xb9,0xba,0xd9,0x79,0x77,0x7c,0xd0,0x54,0xe,0x55,0xe5,0xe0,0x40, + 0xe5,0x40,0xd5,0xa1,0x20,0x5b,0x81,0x10,0xf6,0x7f,0xcf,0xcf,0xae,0xe4,0xdd,0x7b, + 0x8f,0xf1,0x1f,0x7f,0xf6,0x48,0x7e,0xf8,0xf1,0x53,0x7c,0xf2,0xe4,0x54,0x4e,0x2f, + 0x6f,0x6,0xfe,0x5f,0xd9,0x60,0x44,0xa,0x71,0x14,0x6b,0xdf,0x2c,0x26,0xc3,0xe3, + 0xde,0x3c,0xb7,0xe4,0x7a,0xd7,0xe5,0x4f,0xfe,0xee,0x3e,0xce,0x2f,0x77,0xf2,0xd2, + 0xad,0x3,0xf9,0xbd,0x6f,0xbd,0x95,0xc2,0x19,0xea,0xc5,0xb9,0xb5,0xd3,0xfc,0xe8, + 0xf1,0xb,0xf9,0xb7,0xdf,0xbf,0x87,0x3f,0xff,0xd9,0x11,0x7e,0xfe,0xd9,0xb1,0x5c, + 0xdc,0x8c,0x16,0x45,0xeb,0x3c,0x48,0xf3,0xae,0x19,0x31,0xbd,0x5,0x53,0x82,0x3b, + 0x56,0xe7,0xd9,0xd3,0xf3,0x2b,0xfc,0xed,0xc7,0x4f,0xe5,0x9d,0xb7,0x5e,0x51,0x8b, + 0x59,0x5c,0xc6,0xb0,0x89,0x42,0x98,0x62,0x48,0x25,0x98,0x50,0x8e,0x1c,0x86,0xbf, + 0x30,0x1a,0x0,0x5,0x90,0x43,0x62,0xb,0x48,0xf2,0xf,0xb9,0xd0,0xff,0x21,0xff, + 0xb7,0x45,0x50,0xf3,0xbd,0xef,0xc5,0x8d,0xbc,0x77,0xff,0x19,0x7e,0xf0,0xc1,0x63, + 0xf9,0xf1,0xfd,0x63,0x7c,0xf8,0xe8,0x44,0x8e,0xcf,0xae,0x70,0x79,0xdd,0xbd,0xe3, + 0xe,0xa1,0x1b,0x83,0xf,0x40,0xc9,0x5d,0xe2,0x8b,0x5e,0xf2,0xd0,0x81,0x42,0x1e, + 0xb0,0x51,0x6f,0x91,0x14,0x8e,0x8c,0xea,0x64,0x4e,0x71,0xbb,0x68,0xe6,0x48,0xcd, + 0x1d,0x68,0xd3,0xd6,0xfe,0xbe,0x1e,0x44,0xf9,0xdc,0xcf,0xfe,0xf3,0x7c,0xf7,0xc7, + 0x17,0x37,0x72,0xef,0xf1,0xb,0xf9,0xf9,0x83,0x63,0xfc,0xec,0xe1,0x89,0xfc,0xe2, + 0xd1,0x9,0x1e,0x1d,0x5f,0xc8,0xf1,0xf9,0x35,0xae,0x77,0x5d,0xae,0x26,0xb6,0x75, + 0x32,0xa3,0x46,0xd3,0x84,0xa0,0x49,0x85,0x40,0xb0,0x36,0x6a,0xf3,0xdc,0xc4,0x64, + 0xb4,0xce,0xfb,0x9c,0x82,0x70,0x1,0x85,0xa1,0x5a,0xed,0xcd,0xc1,0x54,0x83,0x61, + 0x4e,0x2d,0x0,0xa0,0x8f,0xc2,0xa1,0x1b,0xd,0x1f,0x72,0x40,0xf7,0x78,0xdc,0x23, + 0xc,0xa4,0x8a,0x4b,0xae,0xf9,0xc9,0x35,0xba,0xf2,0x9,0xaa,0x6,0x43,0x5a,0x54, + 0x63,0xd,0xad,0x2d,0x3b,0x3f,0xd4,0x2b,0x25,0x79,0xf3,0x95,0xdb,0xfa,0xc5,0x57, + 0x6f,0xf,0x1f,0x49,0xf1,0x74,0x3,0x90,0xcf,0x8e,0x2f,0xe4,0x6f,0x3f,0x7e,0x2a, + 0xcf,0x2f,0x6e,0x52,0xb4,0x35,0x75,0x12,0xb3,0x3f,0x1d,0xff,0x9f,0x5f,0x53,0x7, + 0xe2,0x5a,0x1,0x31,0xc9,0x3a,0x6b,0x55,0xe6,0x67,0x68,0x33,0xa0,0x3e,0x42,0x5f, + 0x35,0x44,0xfc,0x9c,0xea,0x67,0xbb,0x63,0xde,0x30,0x47,0x50,0x5,0x44,0xf5,0x6f, + 0x3e,0x7e,0x8a,0x47,0x2f,0x2e,0xe5,0x83,0xa3,0x33,0xf9,0xef,0x7f,0xeb,0x2b,0xf2, + 0x4f,0x7e,0xe3,0x2b,0xba,0x4f,0x50,0xda,0x5a,0x93,0x77,0xde,0x7c,0x59,0xfe,0xd9, + 0x6f,0x7d,0x55,0x6f,0xdf,0x6a,0xed,0xdf,0x7c,0xff,0x23,0xfc,0xe2,0xf1,0x8b,0x1e, + 0xc2,0x43,0xb0,0xf7,0xd7,0xa2,0xf0,0xe6,0x5e,0xa9,0xcf,0xcb,0xbc,0xa9,0xc,0xb9, + 0xe3,0x40,0xc1,0xcd,0x8e,0x5d,0x6d,0x2c,0x8a,0x3e,0x7f,0xe8,0xdd,0xdb,0x6a,0xf4, + 0x9c,0x38,0x27,0x59,0x45,0x94,0xc6,0x3d,0x9c,0x11,0x3,0x59,0x38,0x17,0xe9,0xef, + 0x73,0xf6,0x5,0xa0,0xcb,0x40,0x5b,0xb2,0x4f,0x2f,0x35,0xcf,0x5b,0x74,0x76,0x3b, + 0x29,0xe,0x39,0x88,0x21,0x2a,0x89,0xaa,0xfd,0xd5,0x94,0xc1,0xae,0xd5,0xae,0x94, + 0xdc,0xe,0x79,0xa4,0x8a,0x1c,0x8b,0x3e,0xdc,0x9d,0x8d,0x70,0x9c,0xa6,0x43,0x98, + 0x33,0x83,0x49,0xc9,0x81,0xe1,0x3b,0x6d,0x9c,0xa3,0xd4,0xc1,0x43,0x15,0x84,0x71, + 0xe7,0x24,0x22,0x88,0xa8,0x5e,0x5e,0xef,0xe4,0xfc,0xea,0x46,0x5e,0xbe,0x73,0x2b, + 0x9,0x92,0x6a,0x47,0x51,0xbb,0x88,0xa1,0xca,0x3d,0x10,0x91,0x5b,0x7b,0xad,0x60, + 0x5b,0x9d,0xff,0xd5,0xf5,0x8d,0x1c,0xbd,0xb8,0x92,0xa7,0x2f,0x2e,0xe5,0xc1,0xb3, + 0x33,0xdc,0x3b,0x7a,0x21,0x3f,0xb9,0x7f,0x8c,0x1f,0x7d,0xf2,0x4c,0x3e,0x7e,0x7c, + 0x1a,0x69,0x3d,0x1e,0x9f,0xa,0x70,0x90,0xc7,0x66,0xfe,0x1,0x18,0x93,0x3f,0x7f, + 0xd1,0xda,0x78,0x89,0xa4,0xc9,0x65,0x17,0x79,0xf7,0xe3,0xa7,0xf2,0xca,0x4b,0x87, + 0xf2,0xe0,0xf9,0xb9,0xfc,0xc6,0xd7,0x5e,0x97,0x2f,0xbf,0x7e,0x57,0x5f,0xbf,0x7b, + 0x4b,0x5e,0xbb,0x7b,0x7b,0x11,0xcb,0x5c,0x5d,0xdf,0xc8,0xf3,0xf3,0x6b,0x79,0x7c, + 0x72,0x29,0x9f,0x3d,0xbf,0xc0,0xdf,0x7c,0xf8,0x58,0xfe,0xec,0x27,0xf,0xf1,0xc1, + 0xa3,0x13,0xdc,0xec,0x3a,0x59,0xad,0xd,0x5f,0x91,0xa2,0xa1,0xb2,0x40,0x7c,0xee, + 0x6e,0xd2,0x43,0x3a,0x1b,0x3a,0xd0,0x96,0xf7,0xe9,0xd9,0xa5,0x7e,0xef,0x83,0x23, + 0x7c,0xfb,0xed,0x57,0xe5,0xdb,0x6f,0xbf,0x9a,0xe2,0x6a,0x81,0x29,0xaa,0x6e,0x2a, + 0x32,0xf,0xe9,0xfc,0x27,0x9a,0x28,0x4,0x2e,0xac,0x1c,0xd3,0x4e,0x25,0x44,0xa9, + 0x79,0xd2,0x55,0xae,0x76,0x5d,0x2f,0xaf,0xae,0x17,0xe5,0xff,0xe7,0x75,0x91,0xff, + 0x5f,0x2f,0xef,0x1a,0x6b,0xca,0xcf,0xd3,0xd5,0xcd,0x4e,0x9e,0xbc,0xb8,0x92,0x47, + 0x27,0xe7,0xf2,0xf0,0xf9,0x5,0xee,0x3d,0x7e,0x21,0xef,0x3f,0x7c,0x81,0x9f,0x3e, + 0x78,0x2e,0x1f,0x1d,0x9d,0xe2,0x72,0xd7,0xe3,0x8c,0x18,0x56,0x37,0x90,0x54,0x2, + 0x26,0x3a,0x56,0xff,0xa0,0x3d,0xe8,0x1d,0x7e,0x9b,0x63,0x9c,0xff,0x8,0xe1,0xfb, + 0x16,0x16,0x21,0x68,0xab,0xda,0xf2,0xb1,0x34,0x9f,0xc9,0x2e,0xb4,0xba,0xa,0xcf, + 0xd4,0xbc,0x5c,0x14,0x97,0x37,0x5d,0xb7,0xde,0x81,0x2d,0x11,0xdb,0xbe,0x4b,0xdb, + 0xc3,0x5b,0x2e,0x6f,0xe4,0xec,0xf2,0x46,0x5e,0x5c,0xdd,0xc8,0x8b,0x8b,0x6b,0x39, + 0x3e,0xbf,0xc6,0xd3,0xd3,0x4b,0x79,0xf8,0xfc,0x42,0xee,0x3f,0xbf,0x90,0x4f,0x9f, + 0x9e,0xe2,0xa3,0x27,0x67,0xf2,0xd9,0xf3,0x33,0xec,0x42,0x9f,0xe,0x37,0x9,0x2b, + 0x9d,0x42,0xc1,0x39,0x12,0x1a,0x51,0xf0,0xe7,0x85,0x79,0x99,0xda,0x2c,0xc3,0x46, + 0xec,0x32,0xf3,0xb8,0xe0,0xbb,0x74,0x0,0x5d,0x1d,0xf2,0x99,0x94,0xec,0x10,0x1, + 0xe,0x4,0x2,0xe3,0x8c,0x79,0x95,0x8d,0xe8,0xdc,0x7d,0x1f,0xe9,0x45,0x2f,0x48, + 0xd1,0x6e,0xeb,0x4a,0x78,0x84,0xdd,0x5c,0xb6,0xab,0x8e,0xae,0x78,0x2e,0xff,0xa7, + 0xd0,0xd8,0xff,0x3a,0xb2,0xe,0xe6,0xf1,0xd7,0x74,0x68,0x1a,0x6e,0x1f,0x38,0xe1, + 0xb1,0x4e,0x92,0x1e,0x9d,0x5c,0xe2,0xdd,0x4f,0x9e,0xe3,0xd9,0xc5,0x15,0x9c,0x4a, + 0xa5,0x8a,0xe1,0xa8,0x6e,0x73,0xba,0xa0,0xf3,0xe2,0xe,0xf1,0x9f,0x99,0x48,0x1c, + 0x10,0x37,0x5f,0x6c,0xcf,0xe3,0x20,0xa3,0x70,0x77,0xe2,0x5d,0x11,0x61,0x4c,0xb5, + 0x3e,0x84,0x2f,0x1c,0xc2,0x3a,0xdb,0x98,0x44,0x4,0x37,0xa2,0xfa,0xd1,0xf3,0x73, + 0x5c,0xbe,0xff,0x48,0x6e,0x0,0xbd,0xbc,0x1,0x7e,0xfb,0xeb,0x5f,0xd0,0x2f,0xbf, + 0xfe,0xd2,0xa6,0xf5,0xf3,0xe0,0xa0,0xc9,0x37,0xde,0x7a,0x59,0x55,0xbf,0x22,0x1f, + 0x3d,0x39,0x93,0xe7,0x97,0x37,0xfa,0xf4,0xf4,0x32,0xc6,0xdc,0x88,0x19,0xa1,0x9a, + 0x60,0xc2,0x2f,0x72,0xdb,0xa1,0xb7,0x51,0x93,0xd,0x96,0x9c,0xc7,0xb,0x5a,0xbc, + 0x8e,0x4c,0x36,0x8d,0x1f,0x62,0x4d,0x89,0x51,0x31,0xff,0x3,0x84,0xb9,0xc9,0x6a, + 0xd4,0xb2,0x4a,0xdc,0xfa,0x35,0x9f,0xf7,0xac,0x30,0x17,0xf1,0xf7,0x10,0x8c,0xfa, + 0x85,0xe1,0xef,0xc2,0x59,0x25,0xa0,0xdd,0x79,0x61,0x83,0x1c,0x72,0x5,0x7,0x66, + 0xfe,0x14,0x1d,0x9c,0xd2,0xc5,0xc,0xba,0x64,0x98,0x69,0xc3,0xe8,0x48,0x4f,0xac, + 0x88,0x50,0x3,0xf3,0x32,0xc4,0x8,0xb0,0x5c,0x74,0x72,0x30,0x2b,0x40,0x73,0x20, + 0xcc,0x1d,0x93,0x4e,0xee,0x7b,0xa8,0xdd,0xfd,0xc5,0x10,0x67,0x2b,0xa9,0x8f,0x2d, + 0x70,0x7c,0x7e,0x8d,0x27,0x27,0x97,0x38,0x6c,0x4d,0x6f,0xdf,0x3a,0xf8,0xdc,0xb1, + 0xfb,0x2f,0xdb,0x99,0x6e,0x29,0x6d,0xe3,0x20,0x83,0x5c,0xdd,0xec,0xe4,0xe3,0x27, + 0x67,0xf2,0xee,0x47,0x4f,0xf0,0x57,0xbf,0x78,0x22,0x3f,0xfa,0xf4,0x19,0x3e,0x7e, + 0x7c,0x8a,0xcb,0x9b,0x9d,0xef,0x7c,0x91,0xd7,0xc5,0x73,0x51,0xa6,0xe1,0x7,0x28, + 0xde,0xe8,0xa0,0x9d,0xcc,0x7,0xa,0x71,0xc8,0xfa,0xe5,0x2a,0x22,0xcf,0x2e,0xae, + 0xf5,0x7f,0x7f,0xf7,0x53,0xfc,0xcd,0xc7,0xcf,0xf0,0x9f,0xbd,0xf3,0x86,0xfe,0xfe, + 0x37,0xbf,0x24,0xdf,0xf9,0xda,0x6b,0xf2,0xf5,0xb7,0x5e,0xd3,0x37,0x5e,0xbe,0x25, + 0xb7,0xe,0x9a,0x5c,0xdf,0xec,0xe4,0xc5,0xe5,0x4e,0x8e,0x4e,0x2e,0xe4,0xc3,0x47, + 0x2f,0xf0,0xee,0xc7,0x4f,0xf1,0xef,0x7f,0xfa,0x10,0x1f,0x3d,0x39,0x95,0xeb,0x9b, + 0x59,0x7e,0x36,0x9b,0x6,0xa4,0x2c,0x64,0x8,0xc9,0xa7,0xc8,0xa3,0x93,0x19,0x3, + 0x24,0xa7,0x40,0x1a,0xca,0x43,0xcf,0x6f,0x80,0x1f,0xdd,0x3f,0x96,0x1f,0x7c,0xf8, + 0x54,0xbe,0xf5,0xf6,0x6b,0xf2,0xeb,0x5f,0x79,0x5d,0x99,0xc,0x76,0x76,0x75,0x23, + 0x3b,0xc8,0xc,0x95,0xe6,0xcd,0x43,0x93,0xfc,0xe1,0x20,0xa4,0xb8,0x5a,0x70,0xab, + 0xf3,0xb3,0x3c,0xbe,0xbc,0x96,0xa3,0xd3,0x6b,0xf9,0xf2,0xab,0xba,0xf8,0x5c,0xff, + 0xff,0xfa,0xbf,0x7d,0x17,0xdc,0xc9,0xf9,0xb5,0x3c,0x3c,0x39,0x97,0x77,0x3f,0x7e, + 0x8a,0xef,0xff,0xe2,0x9,0xbe,0xff,0x8b,0x27,0xf2,0xe8,0xf8,0x1c,0xd7,0xdd,0x7b, + 0x65,0x6a,0x26,0x82,0xbc,0x6a,0xce,0x0,0x2e,0x9f,0xe0,0xd8,0xd1,0xd9,0x81,0x77, + 0xb2,0x46,0xa9,0xa2,0xbb,0x5d,0x13,0xb1,0x47,0xd6,0x1c,0x47,0x63,0xaa,0xe4,0x41, + 0x29,0x75,0x35,0x6a,0x8c,0x60,0x3c,0x85,0xcf,0xe5,0xef,0x1e,0x36,0xb9,0x53,0xd1, + 0xa7,0xe7,0x57,0x72,0x72,0x7e,0x2d,0xaf,0xdc,0xd9,0x16,0x19,0xd6,0x75,0xcf,0x56, + 0x87,0x75,0xb3,0xdb,0xc9,0xe3,0x17,0x57,0xf2,0xc9,0xd3,0x53,0xf9,0xec,0xf8,0x12, + 0x9f,0x3c,0x3d,0x93,0xf,0x8f,0x5e,0xc8,0xcf,0x1f,0x9e,0xe0,0xa3,0x27,0xa7,0x38, + 0xbf,0xde,0x89,0xdd,0xb8,0x86,0x41,0xe5,0xf4,0x13,0x25,0xcf,0x4f,0xc4,0xec,0x1a, + 0xe2,0x2,0x40,0x13,0x19,0x20,0x10,0x5f,0xe,0xc3,0xbf,0xf5,0xa9,0x84,0x73,0x7b, + 0xbe,0x0,0x13,0xc,0xe2,0xdd,0xf6,0x14,0x22,0xfb,0x25,0x2e,0xd6,0xad,0xbb,0xcf, + 0x7c,0xfa,0x9d,0x6,0x34,0x1b,0xdd,0x31,0xb0,0x6a,0x96,0x3f,0x3b,0xef,0x62,0x46, + 0xd2,0x42,0x7,0xe4,0x4d,0x4f,0xf3,0x4b,0x30,0x7c,0x99,0x76,0x91,0x9b,0x15,0xab, + 0xb5,0x3c,0x72,0x57,0xa2,0x84,0xa9,0xca,0xad,0x5b,0x87,0x4b,0xe1,0xca,0xe7,0xd2, + 0xa3,0x17,0x97,0xf2,0x93,0x87,0x27,0x72,0x7a,0xdd,0x67,0xb1,0x2c,0xd1,0xc6,0x8a, + 0x5b,0xf5,0xa2,0x70,0x99,0x29,0xe2,0x26,0x12,0x10,0x96,0x48,0xce,0x87,0xb4,0xcf, + 0xe3,0xba,0x27,0x97,0xb4,0x52,0xf2,0xd3,0x78,0xa,0x7a,0x23,0xcc,0x70,0x23,0x82, + 0xa4,0xb2,0xc9,0x5e,0x9c,0xf1,0x21,0xa2,0xfa,0xf0,0xc5,0x15,0xfe,0xaf,0x1f,0x3f, + 0xc0,0xcf,0x1e,0xbd,0xd0,0x7f,0xf5,0x7,0xdf,0x94,0xff,0xee,0x37,0xbf,0xa2,0x2f, + 0xdf,0x6a,0x72,0x48,0x23,0x78,0xfb,0x5e,0xf,0xf,0xe,0xe4,0x5b,0x5f,0x7a,0x55, + 0xff,0xc9,0x6f,0xbe,0x2d,0x17,0xbb,0x9d,0xfe,0xf1,0x7b,0xf,0x71,0x7a,0xb5,0x1b, + 0xd2,0x7c,0x1b,0xd3,0xf5,0x89,0x1a,0xc0,0xdc,0x54,0xeb,0x6c,0xd,0xa6,0x28,0x42, + 0xe,0xe6,0xd8,0xbd,0x99,0x58,0xce,0x2a,0xe2,0x83,0xa1,0x87,0x54,0xf,0x7d,0x4b, + 0xe8,0xde,0x5c,0xb,0xeb,0x6,0xdd,0x3a,0x47,0xbe,0x8a,0x56,0x42,0x8f,0x1b,0xcf, + 0xe3,0xc,0x9b,0x21,0x37,0x9,0xa,0x50,0xef,0x63,0x17,0x67,0x68,0xb2,0xd,0x72, + 0x15,0x6f,0x37,0xf1,0xe1,0x50,0xa,0x46,0xc7,0xe5,0x97,0x95,0x14,0x5a,0x19,0x24, + 0x5,0xc3,0xf2,0x70,0xbe,0x67,0x86,0x5a,0x2c,0xf1,0xe7,0x41,0xd,0x25,0x29,0x15, + 0x47,0x33,0xaa,0x92,0x97,0x5b,0x47,0x23,0xa6,0x34,0x86,0x9a,0xc1,0x69,0x3e,0x3e, + 0x34,0x61,0x5c,0x13,0xb6,0xec,0x4c,0x9b,0xa4,0xba,0x2,0xe0,0x87,0xf7,0x8f,0xf1, + 0xce,0xcf,0x1f,0xe1,0x5f,0xfc,0xf6,0x3b,0x7a,0xfb,0xd6,0xc1,0x72,0xd8,0x30,0x2a, + 0x71,0x9f,0x2a,0x77,0x6b,0xff,0xa7,0xaa,0xf2,0xe4,0xc5,0xa5,0x3c,0x78,0x7e,0x2e, + 0xf,0x9e,0x9d,0xe3,0xd3,0xa7,0xa7,0xf2,0xd1,0x93,0x33,0x79,0xf8,0xfc,0x2,0x8f, + 0x4f,0x2f,0xe5,0xe8,0xf8,0x2,0x4f,0xcf,0x2e,0x47,0x64,0x69,0x6b,0xec,0x7b,0x8d, + 0x2,0xd0,0xc3,0xec,0x91,0x26,0xcc,0xc9,0xba,0xc0,0x5c,0x0,0x53,0x43,0x51,0x18, + 0x71,0x51,0xa4,0xc8,0x83,0x93,0xb,0xb9,0xfc,0x70,0x27,0x9f,0x3e,0x3b,0xc7,0x9f, + 0xfc,0xf4,0xb6,0xbc,0x7a,0xe7,0x96,0xde,0x39,0x3c,0x90,0x91,0x47,0x4,0xb9,0xee, + 0x90,0x8b,0xab,0x9d,0x1c,0x9f,0x5f,0xe1,0xf1,0x8b,0x4b,0x79,0xf0,0xec,0x1c,0xd7, + 0xbb,0x60,0x43,0xdb,0x4b,0xf,0x4a,0x4d,0x53,0xcc,0x57,0xa4,0xd1,0x36,0x52,0x57, + 0x20,0x8b,0x2c,0x71,0x82,0x98,0x18,0xa5,0xe0,0xb5,0xfd,0xc7,0xf,0x8e,0xe4,0xf4, + 0x7a,0x27,0xff,0xf4,0x3b,0x6f,0xcb,0x77,0xbf,0xf6,0xa6,0xbc,0xf1,0xf2,0x2d,0x7d, + 0x78,0x72,0x81,0xef,0xfd,0xe2,0xb1,0x3c,0x39,0xbf,0x1a,0xa,0x5f,0xf,0x94,0x53, + 0x46,0x1c,0x8c,0xdd,0x22,0x18,0xee,0x24,0x1b,0xd8,0x26,0x91,0x4f,0x9f,0x5d,0xc8, + 0x8f,0x3f,0x7d,0x86,0x37,0x7e,0xfd,0xcb,0x7a,0xfb,0x56,0x16,0xae,0xfd,0x43,0xfe, + 0xaf,0x52,0xac,0xb6,0x3a,0x54,0xfb,0xeb,0x67,0xa7,0x97,0xf2,0xd1,0xd3,0x33,0xf9, + 0xf4,0xe9,0x19,0x3e,0x79,0x7a,0x2a,0x9f,0x3e,0xbb,0x90,0xa3,0x93,0xf9,0x4c,0x9c, + 0x5c,0xe0,0xd1,0xf1,0xa5,0x71,0xb3,0xa7,0x37,0x9c,0xf2,0xab,0xd0,0x2,0x26,0x2d, + 0xd6,0x40,0x79,0xc7,0x9,0x97,0xd7,0x1a,0xcc,0xa4,0x39,0x13,0xcb,0xae,0x28,0x78, + 0x4c,0x14,0x89,0x2c,0x7d,0xe9,0xae,0x8,0x61,0xca,0x4c,0xe,0x33,0x1b,0x4f,0xac, + 0xd5,0x1b,0xb9,0x6d,0x9a,0x81,0xd4,0x44,0x45,0xb4,0xb,0xe4,0xde,0xe3,0x33,0xdc, + 0x7b,0x72,0x2a,0xdf,0xfd,0xda,0x1b,0xba,0x6f,0xc5,0x60,0xbf,0xbe,0xd9,0xed,0xe4, + 0xd9,0xd9,0xb5,0x3c,0x3b,0xbf,0x92,0x47,0xc7,0x17,0xb8,0xff,0xec,0x5c,0x1e,0x9e, + 0x5c,0xc8,0xe3,0x17,0x97,0xf2,0xfc,0xfc,0x6,0x2f,0x2e,0xaf,0xe5,0xec,0xea,0x46, + 0x4e,0x2f,0x6f,0xe4,0xe4,0xe2,0x1a,0xcf,0xce,0xae,0xe4,0x6a,0x17,0xa2,0xcf,0x28, + 0xe4,0x28,0x47,0x58,0x84,0x2f,0x4a,0xf8,0xc1,0x37,0xef,0x4f,0xd8,0x1e,0xbb,0x19, + 0x26,0x44,0xe7,0xaf,0x15,0xe8,0x9e,0x45,0x6e,0x83,0x77,0xf4,0xa1,0x65,0xe,0xef, + 0x38,0xa8,0x13,0x9f,0x4,0x38,0xfe,0xfb,0x22,0x32,0x86,0xb6,0xdd,0xce,0xfe,0x79, + 0x8d,0x5b,0x3d,0x39,0x8b,0x89,0x6a,0x37,0x63,0xbb,0xee,0xc8,0xf5,0xd2,0x41,0x3d, + 0x51,0xd,0xdd,0xf0,0x5c,0x3,0x58,0x96,0xe7,0x3c,0x37,0x74,0x8e,0xdc,0x27,0xce, + 0xb8,0x5,0x67,0xbc,0xe9,0xc2,0x46,0xf7,0x34,0xb9,0xdd,0x4e,0x9e,0x9e,0x5d,0xcb, + 0xfd,0xe3,0x73,0x79,0x71,0xb3,0xc3,0x64,0xbd,0xc,0x43,0x38,0x5d,0xd6,0x70,0xf5, + 0xc5,0xfc,0xfe,0xba,0xc1,0x74,0xd4,0x2,0x24,0xed,0xd7,0x3c,0x11,0xe6,0xf7,0x9e, + 0xd2,0x75,0x8d,0x74,0x60,0xb4,0x42,0x4b,0xba,0x8c,0xb8,0xeb,0xf0,0xb3,0x87,0x47, + 0x7b,0xf0,0x25,0x9a,0xd3,0xd6,0x2e,0x76,0x5d,0xdf,0x7f,0x72,0x8a,0xff,0xf9,0xfb, + 0xf7,0xe4,0xc3,0x27,0x67,0xf2,0xcf,0xbf,0xfb,0x15,0xfd,0x47,0x5f,0x7e,0x55,0xe, + 0xf,0xe,0xfc,0xcc,0x8e,0xd5,0x82,0xc8,0x7f,0xf9,0x6b,0x5f,0xd4,0xab,0x1d,0xda, + 0xf,0x1f,0x1c,0xe3,0x83,0xa3,0xd3,0xb1,0x7e,0x6d,0xb6,0x91,0x9a,0x47,0x9,0xda, + 0xe8,0xca,0xe7,0xbe,0x5c,0x1b,0xb4,0x4b,0x98,0xb9,0x6d,0xb9,0xd2,0x7b,0x4e,0xc8, + 0x6,0xcd,0xd2,0xb5,0x89,0x76,0x84,0x61,0x61,0x1d,0xb1,0xf3,0x5,0x1f,0x49,0xf7, + 0x49,0x7d,0x4e,0x7c,0x15,0x4d,0x61,0x1f,0x99,0x1a,0xe7,0x71,0xaa,0x94,0xf0,0xe9, + 0xdc,0x8d,0xb4,0x32,0xdf,0x32,0xdc,0xce,0x82,0x7,0xad,0xe5,0x81,0x7d,0xad,0xfa, + 0xcc,0x22,0x56,0xf,0xbc,0x72,0xa4,0x9a,0x76,0xa2,0x1b,0xd9,0x1e,0x8d,0x5,0xdb, + 0xf1,0x70,0x9b,0x53,0x91,0x78,0xd3,0xb0,0x7d,0x51,0xa3,0xb,0xdf,0xb2,0x94,0x55, + 0xed,0x65,0x47,0x17,0x45,0x33,0xde,0x8f,0x7b,0x48,0xc6,0x37,0xdf,0xdd,0x8f,0xab, + 0xf2,0xb3,0x87,0x27,0x78,0xf9,0xa7,0xf,0xf1,0xce,0x17,0x5f,0xc6,0x77,0xbe,0xf6, + 0xa6,0xde,0x99,0xe0,0x8f,0xc3,0xe9,0xad,0x61,0xe8,0xa,0x1f,0xd2,0xbb,0x5d,0x97, + 0x1d,0x20,0x37,0xbb,0x2e,0x1d,0x90,0x9b,0x2e,0x72,0xb3,0x1b,0x5c,0xf3,0xf3,0xab, + 0x1b,0x79,0x7a,0x76,0x89,0x7,0xcf,0x2e,0xe4,0x17,0x47,0x27,0xf2,0xfe,0xa3,0x53, + 0x7c,0xf0,0xf0,0x58,0x3e,0x38,0x3a,0xa5,0x55,0x87,0x19,0x9e,0x6d,0x94,0x1e,0xf6, + 0x2a,0xf1,0x88,0x26,0xf6,0xf6,0xa5,0x90,0xdc,0xc4,0x5a,0x21,0xa6,0xe9,0xc0,0x13, + 0x82,0x7,0xd2,0x1e,0xb2,0x6c,0x46,0x18,0x79,0x7c,0x7e,0x85,0xc7,0xe7,0x57,0x1b, + 0xb2,0x44,0xf6,0x89,0x9b,0x78,0x47,0x45,0xf,0x18,0xa3,0x98,0x3a,0xc2,0xf9,0x8e, + 0x6b,0x34,0xc8,0xaa,0x65,0x82,0xe0,0x52,0x4f,0x5e,0x8,0xf8,0x9,0xd5,0x8d,0xab, + 0x38,0xdf,0xf8,0xcf,0x4e,0x2e,0xf1,0xe8,0xbd,0x7,0xb8,0xb8,0xd9,0xe9,0x83,0xe7, + 0x17,0xfa,0xd5,0x37,0x5e,0x92,0xf7,0x1f,0xbd,0xc0,0x5f,0xdd,0x7b,0x2a,0xcf,0x2e, + 0xae,0x67,0x39,0x3d,0x13,0x2e,0x24,0xe7,0xc2,0xc3,0xa1,0x3b,0x31,0xd5,0xa1,0xc1, + 0xb0,0x7f,0x4d,0x1f,0x3d,0x3d,0xc5,0xf7,0xee,0x3d,0xd5,0x6f,0x7c,0xe9,0x55,0xf9, + 0xf5,0x3b,0x87,0xcb,0x45,0xbc,0x75,0x51,0x7f,0x9e,0x2b,0x80,0xb,0x1,0x0,0xb2, + 0xdb,0x75,0xb9,0x1,0xe4,0x7a,0x37,0x30,0xa7,0xbb,0x5d,0x97,0xab,0xde,0xe5,0xc9, + 0xe9,0x95,0xdc,0x7f,0x7a,0x86,0x9f,0x3d,0x7c,0x21,0x3f,0x79,0xf8,0x1c,0x3f,0xfd, + 0xec,0x44,0x3e,0x7b,0x7e,0x41,0x16,0x33,0xb3,0x4,0xcd,0x10,0x8c,0x78,0xf9,0x31, + 0x3,0x4c,0xf2,0xce,0x5c,0xdd,0x4e,0x35,0xf7,0xbe,0xd,0x73,0xb3,0x89,0x70,0x9a, + 0xcd,0xa,0xcf,0x14,0xdb,0x4,0x30,0x49,0xef,0x7a,0xcb,0xe7,0xc0,0xc4,0x6b,0x28, + 0x4d,0x57,0xe2,0x80,0x65,0x8d,0xf2,0x94,0x29,0x8b,0x8a,0xdc,0x88,0xca,0x8f,0x3f, + 0x3b,0x96,0xaf,0xbf,0xf5,0x8a,0x7e,0xe3,0xad,0x57,0xe5,0xd5,0x97,0xc6,0x67,0x7b, + 0x7e,0x75,0x2d,0x67,0x57,0x5d,0x4e,0x2e,0xae,0x5d,0x12,0x76,0x71,0xd3,0xe5,0xe4, + 0xfc,0xa,0x8f,0x4e,0x2e,0xe5,0xe1,0xc9,0x85,0x7c,0xfc,0xf4,0x4c,0x3e,0x38,0x1a, + 0xea,0xf4,0xa3,0xb3,0x2b,0x54,0x1a,0xaf,0xed,0x9c,0x39,0xec,0x23,0x76,0xd0,0x76, + 0x1c,0x6a,0x4c,0xf9,0x2,0xd7,0x32,0x76,0xe9,0xa0,0x78,0xbb,0xd9,0x65,0x7a,0x97, + 0x6c,0xaf,0x1d,0xb,0xd8,0xda,0x74,0x98,0x2b,0x30,0xf6,0xef,0xd,0x22,0x7d,0xee, + 0xce,0x63,0x67,0xde,0x25,0x2e,0xd8,0x40,0x2a,0x38,0x31,0x6e,0x74,0xfc,0xd3,0xd7, + 0xed,0x59,0xe8,0xd,0x52,0x63,0x80,0x19,0xd8,0x25,0xfe,0x99,0x9a,0x8b,0x40,0x47, + 0xfa,0xb7,0x42,0xed,0xa2,0x6,0xad,0xa2,0x63,0x8d,0xd8,0x72,0x83,0xd8,0x74,0x49, + 0x46,0xb4,0xff,0x3d,0xbf,0xee,0xf2,0x93,0xcf,0x8e,0xf1,0xc9,0xb3,0xf3,0x71,0x5e, + 0xce,0x8a,0xc,0x42,0xe7,0xad,0x5b,0x4b,0xad,0xa8,0x1,0xc6,0x73,0xa4,0x10,0x45, + 0x17,0x28,0xba,0x59,0xf4,0xa0,0xd3,0xea,0x9d,0xe2,0x59,0x32,0x32,0xd8,0x93,0x30, + 0x45,0x85,0xc0,0x69,0x95,0x21,0xae,0xac,0xd8,0x66,0x2d,0xed,0x10,0x19,0x2a,0x20, + 0xb8,0xda,0x41,0xff,0xf6,0xfe,0x31,0x1e,0xbe,0xb8,0x92,0x3b,0xb7,0x54,0xae,0x76, + 0xd0,0x6f,0x7f,0xe9,0x15,0x79,0xf5,0xce,0xad,0x65,0x22,0xf4,0xc6,0xcb,0xb7,0xe5, + 0x1f,0xbf,0xf3,0xa6,0xfe,0xe6,0xd7,0xde,0xd0,0x27,0x17,0x37,0x78,0x76,0x7e,0x65, + 0x48,0x3d,0x31,0x1c,0xff,0x38,0xc8,0xe2,0x24,0x92,0x9e,0x53,0xb,0x60,0xd8,0xa5, + 0x89,0xae,0x4a,0xcb,0x1a,0xbb,0xc8,0x14,0x61,0x6,0x45,0x76,0x86,0x97,0x89,0x64, + 0x58,0xb5,0x29,0xb7,0xb8,0xde,0x7f,0x48,0xcb,0x70,0x71,0x55,0xbb,0x8,0x37,0x71, + 0xae,0x3f,0x58,0x52,0x39,0x3b,0xdf,0x1,0x59,0x3a,0x3c,0xd0,0xaf,0x68,0x54,0x9a, + 0x48,0x2b,0xbb,0xf3,0x30,0x18,0xa3,0xfc,0x83,0x62,0x95,0xf6,0x97,0x90,0xd5,0x69, + 0xa1,0xcc,0x43,0xaa,0x4a,0xfc,0x21,0x6f,0x34,0xf6,0x6b,0x63,0xab,0x6a,0x53,0xb5, + 0xa9,0xb6,0x4,0x34,0x7b,0xcc,0xa1,0x49,0xbd,0x8b,0x89,0x53,0xf4,0xb5,0xaf,0x40, + 0xe5,0xd9,0xc5,0x35,0x7e,0xf0,0xd1,0x93,0xfe,0xe4,0xec,0x1a,0xbf,0xf7,0x8d,0x2f, + 0xb6,0x3f,0xf8,0xf6,0x5b,0xfa,0xab,0x6f,0xbd,0xaa,0x5f,0x7a,0xf5,0x8e,0xdc,0xb9, + 0x75,0xb0,0x8,0x96,0x44,0x44,0x2e,0xaf,0x6f,0xe4,0xec,0xaa,0xcb,0xf3,0xb3,0x4b, + 0x79,0x76,0x76,0x85,0x27,0xa7,0x57,0x72,0x74,0x72,0x29,0x9f,0x9d,0x9c,0xcb,0xfd, + 0xa7,0x67,0x78,0x78,0x72,0x29,0x4f,0x4e,0x2f,0xe5,0xec,0x6a,0x87,0x9b,0x9b,0x2e, + 0x97,0xbb,0x2e,0xd7,0x37,0xbb,0x29,0x12,0xe1,0x3c,0x78,0x7a,0x36,0x74,0x38,0x27, + 0xbc,0x7b,0x88,0xf,0x15,0xba,0xb1,0xf0,0x84,0x5,0x3b,0xa9,0x26,0x3b,0x7f,0xf, + 0x2b,0xb1,0xf6,0xd,0xf1,0x5,0x87,0x87,0x99,0xa8,0x92,0xc5,0x96,0xe0,0x2a,0x4e, + 0xc9,0x8e,0x92,0x18,0xcd,0x21,0xec,0x4,0x5,0x36,0x68,0xb4,0x83,0x49,0xe4,0xa1, + 0x41,0xaf,0x4b,0xa,0x23,0x4d,0x42,0xf,0xf5,0xa2,0x63,0x7,0xc8,0xf7,0x3f,0x7a, + 0x2a,0x3f,0x7a,0xf0,0x1c,0x87,0x7,0x4d,0x2e,0xaf,0x21,0xe7,0xd7,0xd7,0x63,0xec, + 0xdf,0xa8,0xf3,0xf6,0xd5,0xa7,0xc5,0x5a,0x59,0x62,0x79,0x88,0xf5,0xa6,0x40,0xd3, + 0xe6,0x85,0xa2,0x22,0xfa,0x8b,0xa7,0xe7,0x72,0xf3,0xb3,0xcf,0xf0,0xad,0x2f,0xbd, + 0x2a,0xaf,0xdf,0xbd,0xad,0x6f,0xcf,0x3d,0xdc,0x2f,0x13,0xc8,0xed,0xc3,0xe2,0xd6, + 0xee,0xe7,0xe4,0x72,0x27,0xf7,0x8f,0xcf,0xe5,0xe3,0x27,0xa7,0xf8,0xf4,0xd9,0x99, + 0x7c,0xf2,0xec,0x5c,0x3e,0x79,0x7a,0x8e,0xa3,0xd3,0xb,0x39,0x39,0xbb,0x96,0x8b, + 0x5d,0xc7,0xf5,0xae,0xcb,0xe5,0x75,0xf7,0x67,0x62,0x76,0xbf,0xee,0x2e,0x33,0x4d, + 0x75,0x27,0x97,0x8d,0xb,0xac,0x8c,0x27,0x19,0xc9,0x94,0x44,0x1f,0xf3,0x9e,0x6a, + 0x5e,0x4,0xd6,0x2d,0x68,0xe4,0x79,0x39,0x18,0x26,0x9c,0xcf,0xc,0x97,0xe4,0x5a, + 0xce,0x7b,0x3d,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xfc,0x77,0x26,0xf,0xf2, + 0xc5,0x1e,0x9a,0x14,0xab,0x24,0x15,0x37,0x80,0xfc,0xf5,0x27,0xcf,0xe4,0xf5,0x97, + 0x6f,0xf7,0xff,0xf6,0xdb,0x5f,0x3a,0x78,0xed,0xee,0xa0,0x2f,0xde,0x7b,0x72,0x86, + 0x3f,0xfd,0xd9,0x43,0xf9,0x3f,0x7e,0xf4,0x19,0x4e,0xce,0x6f,0xe4,0xf6,0xe1,0x58, + 0x4d,0xf6,0xe9,0x81,0xbe,0xbe,0xe9,0xb8,0xde,0xd,0xe5,0xfa,0xf5,0xae,0xdb,0x7b, + 0xf,0x32,0x74,0xd8,0x4,0xf,0x14,0xcb,0x4e,0xa3,0xa,0xb8,0xa5,0x58,0x63,0x4c, + 0x1,0xcf,0xf9,0x84,0x5f,0xe2,0xf3,0x4b,0xed,0x2e,0x7c,0x33,0x96,0x50,0xf7,0xf3, + 0x36,0x2e,0xe7,0x2e,0x93,0xcd,0xde,0xe0,0x60,0x18,0x23,0xc0,0x41,0x9a,0x35,0xe9, + 0x30,0x8a,0x5c,0x9f,0x2c,0xf7,0x61,0x4c,0x73,0x5b,0x1a,0x8c,0xda,0xd7,0x27,0xac, + 0xa6,0x3b,0xf1,0xa8,0x31,0x30,0x2b,0xe8,0xcd,0xd0,0xd9,0x6c,0x19,0x8b,0x85,0xb0, + 0xd9,0x1a,0x78,0x4f,0x18,0x2,0x51,0xfd,0x90,0x0,0x7,0x8,0xa2,0xe9,0x20,0xe0, + 0x6d,0x68,0x7b,0xce,0xaf,0x76,0xf2,0xc3,0x7,0xc7,0xf2,0xd1,0xf3,0x33,0xb7,0xc3, + 0x61,0x4c,0x60,0x61,0x81,0xa1,0x31,0x76,0x37,0x42,0x4a,0xb3,0x71,0x7b,0x9f,0xe3, + 0x69,0x47,0xa6,0xc1,0x62,0x31,0x91,0xd5,0x51,0xdd,0x9d,0x93,0x8d,0x88,0xcb,0x73, + 0x6f,0x3d,0xe4,0x56,0xd4,0xa1,0x5b,0xe7,0xe2,0x31,0x5b,0xca,0xe2,0xda,0x4e,0x1f, + 0x95,0x5d,0x9d,0x8f,0x4e,0x2f,0xe5,0x5f,0xff,0xe5,0x3d,0xfc,0xf4,0xe8,0x54,0xff, + 0xc5,0x77,0xbf,0xaa,0xff,0xf5,0xaf,0x7d,0x51,0x5f,0x9b,0xce,0x22,0x7e,0x4f,0x5f, + 0xbe,0xd5,0xe4,0xf,0xbe,0xf5,0x25,0x7d,0x7e,0x7e,0xa3,0x7f,0xf6,0xe1,0xd1,0x14, + 0xb0,0xf9,0x58,0x2f,0x56,0x9e,0x76,0xb8,0x1c,0xcc,0x83,0xb1,0x63,0xda,0xbc,0x6c, + 0x1a,0xaf,0x2e,0x9d,0x0,0xad,0x94,0x35,0xd4,0x83,0xf3,0xb1,0x6d,0x5c,0xf,0x94, + 0x11,0xb6,0x6e,0x2a,0xc2,0x79,0xba,0xa9,0x44,0xf2,0x49,0xe3,0xd8,0x96,0xef,0xdc, + 0xc5,0xfe,0x56,0x66,0x1,0x15,0x13,0xcb,0xbb,0xf9,0x43,0x34,0x52,0x17,0xb3,0xfd, + 0x68,0xd3,0x5b,0xe7,0xba,0x33,0x5f,0xe5,0xf9,0xf,0x39,0x7d,0x5b,0x9a,0xd3,0xc7, + 0xc0,0x22,0x91,0x10,0xb6,0xa8,0xb1,0xf5,0xc7,0xf8,0x45,0x9c,0x6d,0xd5,0x28,0x45, + 0x6b,0xb0,0x97,0xa3,0x3a,0xd6,0xc9,0x5d,0x9e,0xc3,0xb,0x18,0x87,0x76,0x7a,0x29, + 0xed,0x2,0x3b,0xbe,0xdc,0xc9,0xdf,0x7d,0xfa,0x54,0x8e,0xaf,0x6e,0xfa,0xe3,0xd3, + 0x4b,0xfd,0xca,0x1b,0x77,0xf5,0x8d,0xbb,0xb7,0xe5,0xe5,0xdb,0x4d,0x6f,0xcd,0x4e, + 0xbd,0xcf,0xad,0xd8,0x4d,0x1f,0x4c,0xf7,0xf3,0xeb,0x1b,0x39,0xbb,0xda,0xe1,0xc5, + 0xc5,0xb5,0x1c,0x5f,0x5c,0xcb,0xb3,0xf3,0x6b,0x79,0xf2,0xe2,0x2,0x47,0x27,0x57, + 0xf2,0xfc,0xe2,0x26,0x80,0x52,0x49,0xb9,0x36,0xa1,0xbf,0x3e,0x4e,0x77,0xa4,0xc5, + 0xd4,0x15,0x91,0x60,0x47,0xe9,0xf2,0x94,0x24,0x3d,0x46,0xb5,0x34,0x50,0x77,0x6c, + 0x80,0xce,0xac,0x8c,0x17,0xd2,0x4d,0x90,0x1a,0x16,0xa0,0x87,0xb8,0xa4,0x90,0xc6, + 0x2c,0x33,0x7c,0xef,0x3d,0x24,0xf,0x66,0xad,0x80,0x8d,0x86,0xe0,0x49,0x1e,0x91, + 0x77,0x1b,0xb6,0xa,0xa5,0xd,0x51,0xc4,0x3a,0xf7,0x79,0xa4,0xc1,0x9c,0x57,0x6, + 0x5d,0x84,0xca,0xe9,0xcd,0x4e,0x4e,0xaf,0x77,0x1,0xcb,0x30,0x63,0x2c,0x39,0x73, + 0x10,0xd6,0x8d,0x71,0x4,0xb7,0xf4,0xe1,0x84,0x86,0x42,0x12,0x59,0x1e,0x22,0x90, + 0x4f,0x9e,0x5f,0xca,0x1f,0xbd,0xf7,0x99,0x3c,0xbf,0xb8,0x92,0xdf,0xfa,0x95,0x37, + 0xe4,0x9d,0x37,0x5f,0xd1,0x2f,0xdc,0xbd,0x25,0xaf,0xdd,0xbd,0xc5,0xf1,0x0,0x4b, + 0xd7,0x7e,0x79,0x7d,0x23,0x17,0xd7,0x5d,0xce,0xaf,0x6f,0xe4,0xf2,0x6,0x72,0x7e, + 0x7d,0x23,0xe7,0x57,0x37,0x72,0x7e,0xbd,0xc3,0xd9,0xe5,0x4e,0x8e,0x2f,0xae,0xe5, + 0xc9,0xd9,0x95,0x1c,0x9d,0x5c,0xe2,0xe8,0x74,0x30,0xf8,0x8f,0x5e,0x5c,0xc8,0xa3, + 0x17,0x97,0xb8,0xe9,0x6c,0x69,0x56,0xb7,0xd9,0x25,0x62,0x58,0xc4,0x72,0x91,0xb, + 0xc5,0x28,0x66,0xd6,0xb,0x9,0xcc,0xfc,0x3d,0xa7,0xf0,0x7e,0x59,0xd,0x90,0xff, + 0xe8,0xcc,0xbb,0xad,0xc3,0xed,0xa1,0xf1,0xf1,0x72,0xec,0x26,0xe7,0x41,0xc9,0x60, + 0x5e,0xfb,0x58,0x43,0xde,0x64,0x7,0xb2,0x72,0x76,0x26,0x88,0xda,0x18,0x27,0xcf, + 0xe5,0xe,0xf2,0xde,0xc3,0x13,0xf9,0xa3,0xf7,0x3e,0xeb,0xbf,0xf3,0xab,0x5f,0xd0, + 0xbb,0xb7,0xe,0xe4,0xcf,0xde,0x3f,0xc2,0x1f,0xff,0xf4,0x8,0x3f,0x79,0xf4,0x62, + 0xa3,0xb4,0x27,0x18,0x56,0x28,0xf2,0xfc,0xa2,0x2e,0x2a,0x60,0xc4,0x54,0x8e,0x1c, + 0x40,0xf6,0x8e,0x34,0x18,0xa7,0xb,0x25,0x24,0xd7,0x86,0x8,0xb0,0x2d,0xf7,0x78, + 0xf7,0xfa,0xbc,0xb0,0xc9,0x77,0x8e,0x18,0x27,0xcf,0x7c,0x2d,0x1e,0x9b,0xa3,0x2b, + 0x59,0xd6,0xec,0xf7,0x19,0x60,0x70,0xaa,0x31,0xbb,0x34,0x78,0xd,0x9,0xdb,0x85, + 0xcc,0xaf,0xa7,0x95,0x35,0x2b,0x6c,0xd,0x38,0xc4,0xd2,0x23,0xba,0x9b,0x2a,0x26, + 0x6d,0x30,0x7,0x35,0x7c,0x22,0xa3,0x98,0x45,0x2a,0xaf,0x1d,0x11,0x99,0x1d,0xa, + 0x69,0x2a,0x5d,0x55,0x9e,0x5f,0x5c,0xe3,0xd9,0xe9,0x95,0xbe,0xf6,0xd2,0xa1,0xf0, + 0x46,0xe9,0xec,0x7a,0x27,0x3f,0x7c,0x78,0x82,0x8f,0x9e,0x5f,0xb8,0x5d,0x4d,0xd5, + 0x74,0x17,0xe3,0xbf,0x33,0x6d,0xe9,0x90,0x71,0x95,0x99,0x23,0xbb,0xcf,0xc7,0x11, + 0xa2,0xda,0xa5,0xcf,0x22,0x33,0xdd,0xbd,0xe3,0xc4,0x37,0x94,0xa7,0xcd,0xe8,0x89, + 0x24,0xe2,0x17,0xf8,0x8c,0x35,0x6b,0xb6,0x1a,0xad,0xcc,0x89,0x34,0x99,0x34,0xd5, + 0x7b,0x6c,0xe2,0xb5,0x8b,0xe0,0xf9,0xd5,0x8d,0xfe,0xf9,0xbd,0xa7,0x80,0xaa,0x9c, + 0x5d,0x77,0xf9,0x9d,0x77,0xde,0xd0,0x5f,0x9b,0x41,0x34,0xf6,0x90,0xdc,0xbd,0x7d, + 0x28,0xff,0xf9,0xd7,0xde,0xd0,0x1f,0x7f,0x76,0xac,0x7f,0x76,0xcf,0xce,0xa,0xb5, + 0xbb,0x17,0xd3,0xec,0xed,0x2,0x39,0x5b,0x70,0x60,0xa6,0xde,0x41,0xe3,0x22,0x4, + 0x81,0xac,0x24,0x96,0xea,0x69,0xc7,0xc0,0x77,0xb0,0xeb,0x0,0x1a,0x13,0xf4,0x2, + 0xde,0x84,0xd2,0xf9,0x5a,0xd7,0xae,0x34,0xf5,0x16,0x4b,0x58,0x9b,0xc3,0x83,0xad, + 0xb8,0x33,0x4e,0xa1,0xe7,0xc,0x15,0xad,0xea,0xf8,0xd9,0x4,0x1d,0x9a,0xe8,0xca, + 0xe6,0xf6,0x4,0x68,0x20,0x59,0x7d,0x2c,0xf4,0xdd,0x4f,0xa7,0x34,0x86,0xd7,0x52, + 0x3d,0xb0,0xb6,0xbe,0x74,0xa2,0xb1,0x47,0x48,0xf9,0xb3,0x10,0xd,0xe5,0xa4,0x78, + 0x30,0x81,0x9a,0x2f,0x82,0x46,0x54,0xf3,0xe1,0x17,0x41,0xb7,0xc6,0xcd,0xc1,0x56, + 0x2d,0x9,0xf7,0x76,0xad,0xc9,0x87,0x4f,0x4e,0xf1,0xe1,0x93,0xd3,0x4a,0xbd,0x8f, + 0x3a,0x7,0xee,0xc1,0xe2,0x51,0x5,0xd,0xcf,0x50,0xba,0x9a,0x10,0x7f,0x69,0xce, + 0xa7,0xa4,0xa4,0x10,0xe5,0xc,0x46,0x9,0xd7,0x7,0xc3,0xbe,0x62,0xd2,0x89,0xb0, + 0xe,0x95,0xe9,0x88,0x10,0x8b,0x3a,0xfe,0x11,0x21,0x98,0xa2,0x75,0x97,0x19,0x18, + 0x98,0xb2,0x36,0x52,0x72,0xc7,0xe8,0xc0,0x35,0x4e,0xff,0xac,0xfb,0x50,0xee,0x61, + 0x1d,0x46,0xe1,0xa,0x68,0x90,0x30,0x4d,0xd2,0xbf,0xe7,0xcb,0x4c,0x5b,0x4,0xf4, + 0xd1,0x1,0xa9,0x26,0x81,0x7,0xe9,0x3c,0x38,0x4c,0x99,0x1e,0x52,0xe4,0x22,0x6, + 0x3e,0xb1,0x48,0x9d,0x25,0x31,0xde,0x59,0x22,0x2a,0x2a,0x5d,0xa0,0xff,0xe1,0xde, + 0x63,0xbc,0xfb,0xe0,0x39,0xbe,0xfb,0xd5,0xd7,0xf5,0xf7,0xbf,0xf1,0x45,0xf9,0xdd, + 0xaf,0xbf,0x29,0xdf,0xf8,0xe2,0xab,0xfa,0xe6,0xdd,0x43,0xb9,0x73,0x2b,0x23,0x5b, + 0xaf,0xae,0x6f,0xe4,0xf4,0x6a,0x27,0x8f,0xed,0xb2,0x7e,0x71,0x29,0x8f,0x4e,0x2e, + 0xe4,0xe8,0xec,0x4a,0x8e,0x5e,0x5c,0xe0,0xd1,0x8b,0x2b,0xf9,0xe4,0xd9,0xb9,0x3c, + 0x3f,0xbb,0x32,0x55,0x3a,0x5b,0x44,0x6c,0xf2,0x62,0x25,0x4d,0x82,0x8a,0xd8,0xcf, + 0x6d,0xee,0xa5,0xa7,0x13,0x18,0x1e,0xaf,0x89,0xf8,0x11,0xd1,0xe4,0xe,0xb4,0x4f, + 0x75,0x5e,0x15,0x4c,0x0,0xe7,0xb3,0x43,0xf3,0x9,0x23,0xeb,0x10,0x91,0xa9,0x62, + 0x42,0x9c,0x46,0xed,0x71,0xdc,0xe8,0xc0,0xa7,0x8d,0x9f,0x5c,0x97,0xd6,0x75,0x2a, + 0xbd,0xdc,0x2a,0x45,0x70,0xa7,0x3e,0x2f,0xa3,0xfb,0x27,0x17,0xf2,0x3f,0x7d,0xef, + 0x5e,0xff,0xd1,0xc3,0x13,0x7d,0xe7,0x8d,0xbb,0xfa,0xef,0x3e,0x38,0xea,0x3f,0x7b, + 0xf8,0x42,0x52,0xf0,0x7a,0x61,0xe3,0x77,0x49,0x8,0x4a,0x27,0xb9,0xf5,0xd8,0x1, + 0x40,0xe7,0x74,0xd3,0x7,0x8f,0x4,0x5c,0x8a,0x4b,0x65,0xfe,0xb5,0xbd,0x66,0xee, + 0x35,0x57,0x74,0x58,0x3d,0x3d,0x8b,0x9d,0x31,0xc4,0x45,0x8c,0xdd,0x2d,0x96,0x7c, + 0x6a,0x12,0xd4,0x7,0xf5,0x2e,0x6c,0x13,0x83,0xc2,0x4c,0xfb,0x89,0x17,0xd,0xd, + 0x8e,0x79,0x9d,0x20,0xdc,0xe9,0xe3,0xa6,0x55,0x9a,0xdb,0xf,0x72,0x75,0xeb,0xb2, + 0x74,0x22,0x29,0x7a,0x43,0x22,0x92,0x71,0xd6,0x2e,0xf6,0xb4,0x73,0xc0,0x83,0x3d, + 0xd,0xac,0xe1,0xdd,0x12,0x54,0xe4,0xe3,0xe7,0xe7,0xf8,0xf0,0xd9,0x29,0xbe,0xf3, + 0xf6,0xeb,0x7a,0x87,0x38,0xf9,0xcf,0x2e,0xae,0xf1,0xf3,0xa3,0x17,0x38,0xbe,0xda, + 0x41,0x4c,0xee,0x65,0xa3,0x6e,0x4e,0x1d,0xf1,0xae,0x5c,0x30,0x1b,0x6e,0x2b,0x24, + 0x7a,0x8c,0xe0,0xe7,0xf3,0xe5,0xef,0x57,0x3,0xe2,0xd9,0xb0,0xd9,0x81,0x8a,0x3f, + 0x5b,0x33,0x9a,0x74,0x6,0x96,0x76,0xd5,0x3e,0xcd,0x51,0xde,0xa1,0xab,0xb4,0xe6, + 0x9c,0xf2,0x58,0x25,0x44,0x52,0xa2,0x72,0x44,0x1d,0xf0,0xec,0xf2,0x5a,0xfe,0xcf, + 0x9f,0x3c,0x94,0xfb,0x27,0x17,0xf2,0xe8,0xc5,0xa5,0xfc,0xcb,0xff,0xe2,0x1d,0xfd, + 0x22,0x41,0xa3,0xee,0x1c,0x36,0xf9,0xd5,0x37,0x5f,0xd2,0xb7,0x5f,0x7b,0x69,0x3c, + 0x87,0xcd,0xc4,0xa,0xd3,0x1a,0x7c,0x80,0xc8,0xc4,0xa3,0x33,0x75,0x60,0x83,0xe6, + 0x3e,0x82,0x76,0xc7,0x48,0xff,0x1b,0x63,0x6d,0xbb,0xff,0xac,0xb2,0x8c,0x14,0x2a, + 0x13,0x6b,0x43,0x18,0xda,0xb4,0x34,0xc3,0x2c,0x5e,0x4b,0x2f,0xa8,0xa6,0xbc,0xb6, + 0x3c,0x56,0x47,0xe9,0xd0,0x4b,0xe7,0xcf,0x3a,0x47,0x52,0xac,0x1f,0x4e,0xbd,0xc0, + 0xd8,0x43,0x7b,0xd5,0x20,0xce,0xd7,0x6,0x99,0xa5,0xdd,0xf5,0x42,0xf9,0xd7,0x9a, + 0xc6,0xa,0x9a,0x95,0x53,0x9c,0xa2,0x45,0x2,0x6a,0x34,0xa3,0xba,0xf1,0xfe,0x7d, + 0xac,0xc3,0xc7,0xd8,0x70,0xa6,0x37,0x2a,0x65,0x69,0xcd,0x46,0x75,0xa0,0x8e,0xe7, + 0xc5,0x9e,0x32,0x8d,0x5b,0xae,0x23,0xe,0x82,0x9,0xb0,0x84,0x88,0x6b,0xdc,0x1c, + 0x50,0xde,0xd7,0xc5,0x94,0x18,0x24,0xd9,0xe7,0xea,0x32,0xd6,0x50,0x74,0x12,0x1b, + 0xa2,0x33,0xfc,0x2e,0x74,0xb6,0x23,0x79,0x54,0x61,0x4a,0x23,0xb5,0xaa,0xc,0x29, + 0x1d,0xc,0x19,0x7,0xec,0x3,0xee,0x40,0x35,0x6a,0x28,0x91,0x79,0x1a,0x19,0x8e, + 0x6,0x63,0xfb,0x82,0xad,0x6f,0x76,0x58,0x74,0x95,0x44,0xd6,0x12,0xfe,0x98,0xd2, + 0x1e,0x33,0x1c,0xa,0xa8,0xb0,0xa0,0x99,0x19,0x2e,0x60,0xb7,0x48,0x7c,0x8d,0x38, + 0x50,0x8d,0x7c,0x72,0x89,0x11,0x63,0x50,0x2c,0xa6,0x67,0xd,0x2b,0xd0,0x20,0x79, + 0xb1,0xd5,0xa2,0x43,0x92,0xe0,0x92,0x7,0xd8,0x34,0x1c,0xf0,0x7a,0xed,0xe4,0xaa, + 0xcb,0xf,0x3f,0x3b,0xc1,0xd1,0xd9,0xb5,0x7e,0xef,0xa3,0x67,0xfa,0xda,0x4b,0x87, + 0x78,0xe9,0xd6,0x81,0xe5,0xfb,0xf9,0x7f,0x67,0x8,0x6,0xbb,0x5c,0xdc,0x74,0x39, + 0xbf,0xda,0xc9,0xf9,0xf5,0x4e,0x2e,0x6f,0x76,0x38,0xbf,0xde,0xf9,0x5f,0x9f,0x5d, + 0x77,0xe9,0xe8,0x8,0x0,0x13,0x82,0x5d,0x2d,0x2d,0x5c,0x4c,0xda,0x62,0xbf,0x3b, + 0x2a,0x71,0x70,0xa7,0xda,0x3d,0x99,0x4a,0x13,0x24,0x46,0x4d,0x81,0x6e,0x3e,0xe8, + 0x2e,0x90,0x66,0x6a,0xe9,0x18,0x95,0xaa,0xcc,0xce,0x3d,0x26,0x44,0x88,0x1f,0x5d, + 0x9,0x91,0xf7,0x2a,0x5e,0xa7,0x34,0x9b,0x5e,0xcc,0x31,0xe1,0xe8,0x83,0x8b,0x35, + 0x96,0x9f,0x68,0x43,0x1f,0x6e,0x12,0xee,0xc4,0x8d,0x9f,0xef,0xc7,0x55,0x17,0x79, + 0x70,0x7a,0x89,0xeb,0x7b,0x4f,0xf5,0x47,0x2f,0x9d,0xc8,0xc3,0x93,0xb,0xb9,0xa6, + 0x0,0x8f,0x82,0xa,0x93,0x94,0xaf,0x2d,0x69,0x3d,0x13,0x5,0x51,0x1b,0x3e,0xb0, + 0xf1,0xf6,0x4c,0xd5,0x9a,0xa,0xf9,0xc9,0x1d,0x41,0x19,0xe3,0xb0,0x18,0x1d,0xb, + 0x20,0xe8,0x4d,0xc7,0x32,0xc2,0xc0,0x55,0xc1,0xc4,0x83,0x7d,0x78,0x43,0x85,0x38, + 0x47,0xee,0x16,0xb2,0xd2,0x42,0xe4,0x66,0xd3,0xbf,0x1e,0x9b,0x28,0xf8,0x1a,0x53, + 0x7d,0x91,0x3e,0xff,0x3d,0xf5,0xb3,0x7d,0x52,0x4d,0x10,0xcd,0x4d,0xf4,0x53,0xa0, + 0x6c,0x73,0x1b,0xa3,0xcf,0x14,0x42,0x43,0x9b,0x8c,0x1d,0x7e,0x13,0xff,0xd9,0x7, + 0x7e,0x75,0xe6,0x2b,0x33,0x18,0x67,0xbe,0xc0,0x5d,0x5,0x7f,0x7b,0xff,0x18,0x6f, + 0xbf,0xf6,0x12,0xbe,0xf3,0xf6,0xeb,0xde,0x4e,0x1c,0x5f,0xdc,0xc8,0x87,0x4f,0x4e, + 0x71,0x7c,0xb5,0xf3,0x71,0x7b,0x38,0x2,0x42,0xc,0x17,0xfe,0xfa,0xf1,0x35,0xc0, + 0x42,0x69,0x46,0xfd,0x5,0x40,0xbb,0x9,0xe4,0x78,0x18,0x88,0xc4,0xcc,0xb0,0xca, + 0xca,0x72,0x58,0x28,0xc,0xbb,0xe9,0x4c,0x1b,0x1f,0xa,0xe6,0x3e,0x1e,0x43,0x7b, + 0x39,0xba,0x85,0x76,0xf8,0xb5,0xa8,0xcd,0x0,0x0,0x62,0x71,0x80,0x2d,0x87,0x54, + 0xe3,0xbd,0xa3,0x53,0xb9,0xc1,0x67,0x38,0xbb,0xe9,0xfa,0x87,0xdf,0x7e,0x4b,0x7f, + 0x87,0xc4,0x99,0x2f,0xdd,0x3a,0x94,0x57,0x5e,0xba,0xa5,0xbe,0x3a,0x3e,0xc8,0xc5, + 0xe5,0xcc,0x60,0x9b,0xdc,0x77,0x6a,0x3c,0xe7,0xf8,0x5d,0xf,0x62,0x1c,0xa3,0x63, + 0x34,0x11,0x78,0xd7,0xb4,0x3f,0x57,0x91,0x83,0x9e,0x4e,0x47,0x69,0x94,0xe6,0xa8, + 0xf1,0xf5,0xc7,0x2b,0x99,0xe,0xdf,0xd4,0x7e,0x24,0xb5,0xfa,0x96,0x2d,0x76,0xab, + 0x30,0x90,0x2,0xf0,0xa2,0x26,0xd9,0x1a,0xae,0x43,0x34,0x15,0xa8,0x2e,0x87,0x62, + 0x47,0xa8,0xe9,0x7d,0xc6,0xbf,0xe1,0x97,0x86,0x66,0x7a,0x4d,0x1a,0x1b,0x4c,0x82, + 0x8d,0x68,0x2c,0xc5,0x94,0x2c,0x67,0x69,0x37,0x3f,0xba,0x41,0xe8,0x30,0x44,0xfb, + 0x48,0x6a,0x8c,0xa2,0x1a,0x72,0xaa,0xa9,0xda,0x88,0xd2,0x8c,0xd2,0x88,0x3f,0x17, + 0x36,0xa6,0x95,0x36,0x84,0x75,0x6,0xc5,0x1c,0x14,0x21,0x9,0xf5,0x22,0x43,0xec, + 0x4b,0xf2,0x36,0xdd,0x1d,0x52,0xe9,0x1c,0x48,0x8a,0x6b,0xab,0xc6,0x1b,0xe3,0xe2, + 0x8c,0x4e,0x35,0x2f,0x5e,0x7,0x5,0xcd,0x19,0x61,0xb,0xa1,0x49,0x74,0x99,0xab, + 0x38,0xc1,0x46,0xa6,0x8,0x5,0xb4,0x22,0x45,0xe1,0x85,0xc,0x1d,0x9a,0xf6,0x38, + 0xa,0x6,0x53,0x34,0x2,0x3d,0xf2,0x24,0x85,0x32,0x80,0x81,0x84,0x30,0x44,0x59, + 0xb0,0x83,0x73,0x37,0x6d,0x79,0x1b,0xc9,0x78,0x91,0x28,0x38,0x5f,0x72,0xda,0x89, + 0xf9,0xe5,0x3e,0xd1,0xe0,0x14,0x41,0x4,0x75,0xb6,0x14,0xd8,0x2b,0x69,0xd9,0xd1, + 0xcd,0x5e,0x87,0xa0,0xb,0x22,0xf4,0x5d,0xea,0x15,0x83,0x86,0x4f,0xc4,0x7e,0x75, + 0x72,0xbd,0x93,0x17,0x4f,0x4e,0xe5,0xfd,0x27,0xa7,0x58,0x24,0xa9,0xa8,0xf8,0xc4, + 0xa2,0xd3,0xa7,0x87,0xc6,0x3,0x86,0xe0,0xdf,0x35,0x15,0x17,0x5a,0xd1,0x98,0xa9, + 0xa3,0x1c,0x2d,0x30,0xd0,0x99,0x6,0x8a,0xd8,0x8f,0xbb,0x4a,0xba,0x9b,0x20,0x5b, + 0x21,0x7,0xb3,0x50,0xb1,0x0,0x90,0x39,0x52,0xee,0x2a,0xe5,0x90,0x1d,0xcf,0xbf, + 0x15,0xf,0x48,0x9f,0x40,0x74,0x52,0xa3,0x4b,0x1c,0xdf,0x89,0x31,0xad,0x47,0xca, + 0x4d,0x13,0x51,0xe9,0x7d,0xe0,0x37,0xda,0x54,0x94,0xf5,0x9,0x3f,0x97,0x88,0x69, + 0x9b,0x5,0x42,0x53,0xd9,0x89,0xc8,0xa3,0xf3,0x4b,0x3c,0x3a,0xbf,0x22,0x9f,0x31, + 0xdb,0xc2,0xcb,0xce,0x4f,0xa9,0x50,0x84,0xaf,0xe6,0x49,0x32,0x32,0x6f,0x7,0x65, + 0xd3,0x4,0x67,0x8e,0x4e,0x78,0x17,0x38,0x3c,0x44,0x1,0x5a,0xb3,0xdb,0xe7,0x10, + 0x47,0x8c,0x84,0xbf,0x3a,0xbc,0x42,0xa0,0xb0,0x72,0xf,0x5b,0x99,0xcc,0x74,0x98, + 0x6a,0x6e,0xee,0x13,0x1,0xe9,0x18,0x25,0x8f,0x4a,0x6f,0x26,0x50,0x74,0x8b,0xac, + 0x7f,0x7d,0x36,0xf0,0x4f,0x17,0x45,0x64,0xe,0x0,0x2d,0x44,0x4c,0xdd,0xc3,0x58, + 0x8c,0x63,0x62,0x56,0x35,0xe2,0x7c,0xb7,0x39,0x2a,0xb4,0x95,0xcd,0x18,0xc3,0x4f, + 0x7d,0xd0,0xf8,0xc,0x77,0xa2,0xfa,0xd3,0x27,0xa7,0x78,0xeb,0xd3,0xe7,0xf8,0xc3, + 0x6f,0x9f,0xe1,0x1f,0x7d,0xe9,0x55,0xbd,0xba,0xe9,0xf2,0xde,0xa3,0x63,0xfc,0xe8, + 0xe1,0x9,0x2e,0xcc,0x5f,0xef,0x92,0xef,0x98,0x42,0xf8,0x7b,0x6e,0x53,0x67,0xe9, + 0x7d,0x7e,0xc0,0xe3,0x32,0x1f,0xb9,0xe1,0x20,0xb8,0xdb,0x9c,0x66,0x44,0x8c,0x9c, + 0x28,0xaf,0x53,0x4d,0x74,0x3e,0x76,0x1c,0xf3,0x63,0xef,0xfe,0xd,0xda,0xc8,0x54, + 0xfd,0x63,0x68,0x59,0x2f,0x44,0x20,0x2b,0x7b,0x32,0x41,0xcf,0xee,0xfc,0x39,0x5f, + 0x76,0xc8,0xf,0x1f,0xbd,0x90,0x67,0x97,0x37,0x72,0xdd,0xbb,0xbc,0x7e,0xe7,0x50, + 0x7e,0xe5,0xf5,0xbb,0x7a,0xe7,0xb0,0xc5,0x11,0xd5,0x1a,0xc,0x35,0xe0,0x9f,0x2f, + 0xba,0xe0,0x40,0x45,0xfa,0xfc,0x5f,0x90,0x90,0xd0,0x76,0x60,0xb6,0x3b,0x9f,0x76, + 0x5,0x1b,0x1d,0x32,0x7e,0xd5,0x2f,0x3f,0x34,0xbf,0x5b,0xec,0xec,0xe9,0x34,0xa4, + 0xee,0x4,0xbe,0x4e,0xce,0xae,0xe5,0xa2,0xde,0xd8,0x8c,0x6b,0xc4,0x8c,0x2b,0xb2, + 0xbf,0x1c,0xfc,0x3b,0x35,0x23,0x64,0x6d,0xef,0x6a,0xff,0xeb,0x2a,0xf7,0xe4,0x21, + 0x2f,0xf8,0xb9,0x74,0x0,0x2e,0x58,0x38,0x95,0x9a,0x1,0xe5,0x5f,0x5c,0xf5,0xac, + 0xda,0x5b,0x6d,0xb8,0x47,0x16,0x87,0x59,0x5b,0xae,0x53,0x1c,0xd7,0xcc,0x56,0x31, + 0xf6,0x87,0xd3,0x69,0x63,0x33,0xb7,0x18,0xbf,0x8f,0x53,0xa5,0x8f,0xd8,0x37,0x61, + 0xaf,0xaa,0xf1,0x72,0x21,0xcd,0xc4,0x64,0x7c,0xd8,0x8d,0xb,0x5e,0x69,0x7f,0x43, + 0xb3,0xcb,0x74,0xde,0x43,0x9,0x2c,0xa9,0x60,0xeb,0x2,0x54,0x4d,0x2e,0x63,0xdd, + 0x43,0x4e,0xc1,0x32,0x21,0x13,0xd2,0x84,0xa5,0x8,0x99,0xd8,0x6b,0x18,0xdc,0xee, + 0x18,0x98,0x9b,0xca,0x2d,0xa2,0x41,0x59,0x5f,0xa1,0x28,0x21,0x8,0x3e,0xf2,0x6b, + 0xf9,0x12,0xb3,0xdd,0x2e,0x81,0x10,0x78,0x1,0x44,0x44,0xd5,0xc8,0x56,0x42,0x75, + 0xa7,0x8d,0xb1,0x28,0x9d,0xd0,0xee,0x88,0x92,0xf9,0x79,0x62,0x1a,0xdb,0x23,0xc7, + 0x40,0x9,0xa2,0xa8,0xf6,0x35,0x4e,0xc1,0x2f,0x89,0x4f,0xe7,0x21,0xae,0xc1,0x19, + 0xc8,0xd3,0x8e,0x6e,0xab,0x6f,0x18,0x94,0x83,0x67,0x98,0x6d,0x8a,0x5a,0x79,0x7, + 0x4f,0x42,0x7e,0x90,0x18,0xae,0x49,0x7a,0xb0,0x5d,0xb4,0xe6,0xf0,0x12,0x56,0x93, + 0xda,0x17,0xdd,0x91,0xba,0xcf,0x90,0x8c,0xba,0x34,0x1,0xfe,0xc2,0xb5,0xe8,0xbc, + 0xad,0xa6,0xb4,0x54,0xf7,0xd9,0xf0,0x91,0x2b,0x62,0xec,0x3b,0x69,0xfd,0x37,0x26, + 0x18,0x76,0x59,0x35,0xc,0xf2,0x28,0x8f,0x93,0x7d,0xcd,0x3,0xf7,0x6e,0xc5,0xf3, + 0x64,0x45,0xed,0x5c,0x17,0x9a,0x1a,0xb,0x30,0x33,0x8d,0x34,0xd7,0x56,0x36,0x19, + 0x9c,0x8d,0xae,0x7,0xd2,0xfc,0x5d,0xb2,0x97,0xcd,0x33,0x3f,0xd9,0xa2,0xaa,0x8b, + 0x17,0xd7,0x5a,0xd1,0xee,0xda,0x4,0x45,0xda,0x27,0xfa,0xd0,0xab,0x89,0xf4,0x18, + 0x7e,0x75,0xf3,0x71,0xab,0xb0,0x81,0x9d,0xe9,0x46,0x43,0x71,0xd9,0x3c,0x9b,0xdc, + 0x27,0xa6,0x1e,0x77,0x1a,0xe5,0x17,0x40,0x97,0xb7,0x8f,0x94,0x63,0x6a,0x3a,0xbf, + 0xa5,0xf9,0x99,0xdb,0xf0,0x62,0x2c,0x96,0x47,0xd3,0x0,0xc7,0xb9,0x8a,0x1c,0xcc, + 0xbf,0x6a,0x10,0xe9,0xd,0x16,0x58,0x32,0x2,0xba,0x8,0xd9,0xc1,0x53,0x49,0xb2, + 0x67,0x93,0xbe,0xc5,0x38,0x19,0x6,0xd5,0x1a,0x2c,0xf8,0x46,0xf6,0xb0,0x26,0xbe, + 0xe3,0x96,0x83,0x81,0x16,0x97,0x3,0x16,0x82,0xab,0x23,0xde,0xbb,0xa8,0x9c,0xed, + 0xba,0xfc,0xe8,0xe8,0x45,0xff,0x37,0x3f,0x7c,0x20,0xff,0xf4,0xdb,0x6f,0xb5,0xaf, + 0xbf,0x7e,0x57,0xbe,0xff,0xc9,0xf3,0xfe,0x97,0x9f,0x3e,0xc7,0x55,0x7,0xc6,0x99, + 0x3e,0x31,0x6e,0xb1,0xa6,0x1,0xac,0xb,0xf,0xe6,0x8a,0x15,0x2b,0x43,0x14,0x37, + 0x74,0x48,0x9d,0xce,0x2c,0x47,0xc3,0x52,0x40,0xaf,0x78,0x2c,0xaf,0x8f,0xcb,0x9b, + 0x5,0x4a,0xab,0xea,0xf4,0xa2,0x53,0x48,0x47,0x1f,0xf6,0xfb,0x26,0x86,0x29,0x6f, + 0xda,0x38,0x40,0x8,0x29,0x81,0xb4,0x44,0x48,0xcf,0x47,0x58,0x44,0xe5,0xfe,0xe9, + 0x15,0xfe,0xed,0x7b,0xf,0xf5,0xde,0xf3,0x73,0xfd,0x57,0xbf,0xfb,0xf5,0xf6,0x5f, + 0x7d,0xfd,0xb,0x7a,0x71,0xb3,0x93,0x93,0xab,0xdd,0x8,0x90,0xe9,0x3c,0xda,0x76, + 0x70,0x3d,0x70,0xd0,0xe6,0xe1,0xdd,0x21,0xb1,0x8e,0x89,0xe,0x5e,0x3,0x23,0x34, + 0x84,0xf,0x88,0x77,0x29,0x92,0x1a,0x25,0xc1,0xed,0xdb,0x76,0x4a,0xda,0x36,0x54, + 0x86,0x9,0x98,0x34,0xc5,0x29,0x7f,0xdf,0x1c,0x5b,0xe1,0xe6,0x59,0xa9,0x63,0x5d, + 0x3,0x83,0xdd,0xb3,0x44,0x6d,0xc4,0xa7,0x8e,0x51,0x45,0xb4,0xf,0xf0,0x6c,0xea, + 0xea,0x89,0x96,0x1c,0x2d,0x2f,0x6c,0x21,0x6a,0xb,0x84,0xc6,0xc3,0xb,0x53,0x5a, + 0xf6,0xfc,0xb1,0x7b,0x7,0x6b,0x52,0x9d,0x16,0x7e,0xec,0xd9,0xa1,0x8b,0xcd,0x64, + 0x9b,0x6,0xf8,0x41,0xb5,0x2b,0xa4,0xa1,0xb5,0x79,0xc1,0x4b,0x17,0xd5,0xc6,0x97, + 0x6b,0x86,0x18,0x20,0xf6,0x33,0xf0,0xb5,0x88,0xa6,0x11,0x60,0xf2,0x57,0xcf,0xf, + 0xb6,0x69,0x41,0xee,0x21,0x26,0x2f,0x62,0xab,0x8,0xcc,0xcb,0xbc,0x23,0x44,0x50, + 0xea,0x69,0x4f,0xc1,0x98,0xb0,0x9d,0xe1,0xd8,0xf1,0x99,0x90,0x5b,0xc9,0xde,0xf, + 0xcd,0x3d,0xe2,0x4c,0xd3,0x20,0x26,0xa3,0x5a,0xb2,0xf,0xf,0xb1,0xcd,0x89,0x11, + 0xa5,0xec,0xb0,0xb7,0x81,0xf6,0x76,0x1c,0xce,0xe5,0x62,0x27,0xa4,0x12,0x3b,0x75, + 0x27,0x11,0xa5,0xcd,0xa2,0x73,0x76,0x31,0xd8,0xd,0x4f,0xc5,0x82,0x5d,0xd0,0x4d, + 0x9c,0x6e,0xa5,0xe9,0xdb,0xb1,0xdf,0xa1,0x8d,0xc6,0x11,0x4a,0x5b,0x19,0x57,0x33, + 0x4f,0x1d,0xc0,0xec,0x6a,0xa2,0x91,0x77,0x8c,0x5d,0xfa,0xf3,0x69,0x91,0x3,0x13, + 0xe0,0x45,0x21,0x33,0xa,0xee,0x8d,0x7d,0x95,0x7a,0x65,0xa3,0x2e,0xc5,0x5,0xea, + 0x74,0xab,0xec,0xaf,0x32,0xa8,0x1,0x5c,0x27,0x61,0xe,0x4a,0x7c,0xec,0xe1,0xdd, + 0x50,0x8c,0x7b,0xa3,0x3b,0x32,0xc5,0x9b,0xd7,0xa,0x73,0xf4,0xc9,0xf8,0x66,0xb8, + 0xa5,0xa,0x2,0xca,0xde,0x6,0x76,0xdc,0xc0,0x78,0x11,0xa9,0xe1,0x31,0xa5,0x50, + 0xf4,0x71,0x98,0xaa,0x11,0xc6,0xc6,0x1d,0x3a,0x84,0xbd,0x6d,0x64,0xb1,0x4c,0x7b, + 0xf4,0x81,0x4a,0x17,0xe9,0xd,0x73,0xd4,0x15,0x99,0x1a,0xc,0xaf,0x70,0x37,0x43, + 0x19,0x2e,0x47,0x3c,0x57,0x6b,0xec,0x8c,0xc,0x65,0xfb,0xd0,0xe8,0x8c,0x1f,0xfb, + 0x41,0xa3,0xd6,0x1a,0xd9,0xc6,0xe9,0xa6,0x8,0xd,0xdd,0x27,0xe5,0xbe,0x77,0xef, + 0xad,0xfc,0x19,0xf,0x9b,0xd9,0xec,0x9c,0x15,0x9a,0x48,0x6f,0xfe,0xf9,0x4,0x80, + 0xcb,0x3b,0x4f,0x2b,0x58,0xe7,0xc4,0xc,0x44,0xa5,0x41,0x60,0xc9,0x15,0x38,0x10, + 0x2b,0xcc,0xc7,0x21,0x7a,0x50,0x45,0xad,0xac,0x38,0xa2,0x9f,0x89,0x29,0x1d,0x5b, + 0x84,0x11,0x22,0x8,0xe3,0x13,0x9c,0x45,0x5b,0xa5,0x79,0xd6,0xa9,0xdb,0xc8,0x82, + 0xcd,0x15,0x45,0xfb,0xf8,0xbc,0x8f,0xce,0xaf,0xe4,0xdf,0xdd,0x7b,0xd2,0x9f,0x9c, + 0x5f,0xe3,0xab,0xaf,0xdf,0xd1,0xbf,0xfc,0xf8,0x59,0xbf,0x77,0x7c,0x81,0x6b,0x30, + 0xb7,0xc0,0x89,0x83,0x61,0xcd,0x1b,0x35,0x76,0x87,0x5f,0xd8,0x63,0xc4,0xe,0x4c, + 0x61,0xe0,0xb8,0x97,0xc7,0xfa,0xc1,0xc4,0x85,0x2,0x6c,0x5c,0x56,0x86,0x6d,0x84, + 0xb5,0xfc,0x6a,0x87,0xc8,0x38,0x4,0x47,0x12,0xf9,0x38,0xbc,0x5a,0xd7,0xa1,0x41, + 0xd7,0x7c,0xb1,0xeb,0x1c,0xd3,0xf9,0xc2,0x6d,0x4,0xd8,0x38,0x43,0x61,0x7c,0xb5, + 0xcd,0xe9,0x74,0x72,0xff,0xfc,0xa,0xa7,0x9f,0x3c,0xc3,0xeb,0x77,0x6f,0xe3,0x27, + 0x4f,0x4e,0xdb,0xc5,0x75,0xc7,0xf7,0x3f,0x7d,0xde,0xbb,0xd2,0xca,0x62,0xd4,0x8e, + 0xae,0x45,0x89,0x9c,0x84,0x16,0xa,0xb8,0xec,0x34,0xb,0xb5,0x2a,0xa7,0x3d,0x3a, + 0xbd,0x68,0xae,0x4,0xfb,0xf8,0x5f,0x57,0xc1,0xfb,0xef,0x45,0x22,0x7a,0x3a,0xdf, + 0x9d,0xd5,0xec,0x65,0x84,0x9e,0xd2,0x39,0x74,0x8e,0x73,0x8a,0x8,0x2e,0x81,0x66, + 0xca,0x2a,0x1b,0x45,0x41,0xe7,0x7f,0xd6,0x77,0xfe,0xc7,0xff,0xf5,0x7,0xae,0xfa, + 0xc5,0x3e,0x64,0x33,0xa4,0x2,0x8a,0x83,0xbc,0xb8,0xa5,0xcd,0x4b,0x63,0xc8,0x8c, + 0x29,0x17,0xba,0x7d,0x93,0x15,0x58,0xdb,0x84,0x28,0x4c,0xd,0x9c,0xce,0xe3,0xb8, + 0xb5,0x61,0xd6,0x68,0x2a,0x4d,0xda,0x30,0x6d,0xce,0xdf,0xb,0x6d,0x73,0xb2,0xdc, + 0x92,0x7,0x84,0xd2,0x5a,0xd4,0xdf,0xa5,0x65,0xae,0xa0,0xe0,0x5b,0x47,0xf9,0xb1, + 0x55,0xf2,0xc9,0x86,0x86,0xa5,0x23,0x5b,0x76,0x69,0xc3,0x7,0xbe,0x8,0x4d,0x64, + 0x13,0xb,0x28,0xd4,0x2,0x2e,0x7e,0x5f,0x99,0x10,0x6c,0xfa,0xc7,0x65,0xc9,0xa9, + 0x25,0xda,0x4b,0xe,0xb1,0x63,0x7d,0x83,0xd8,0xb,0xb1,0x44,0xd5,0x77,0x14,0xe, + 0xa0,0xc8,0x16,0x3b,0x2,0xd9,0x4a,0xa4,0x59,0x3c,0xa2,0x1a,0xd5,0x49,0x48,0x7e, + 0x94,0x81,0x78,0xe1,0xbb,0xf1,0x7f,0xc5,0x6f,0x2e,0xa5,0x2c,0xa9,0x4a,0xeb,0xa3, + 0x75,0x83,0xf2,0x6,0x55,0x95,0x3f,0x2b,0xa5,0x80,0x61,0xef,0xb1,0x95,0xd6,0x2a, + 0x8e,0x1c,0x23,0xad,0x87,0x22,0xdb,0xfd,0x56,0x81,0x76,0x75,0x78,0x82,0xf9,0xbc, + 0xb3,0x62,0xa2,0x59,0x4e,0x29,0xc8,0xd5,0x17,0x8e,0x28,0x2b,0xb0,0x81,0x3,0xe7, + 0xb1,0x3c,0xac,0x3,0x32,0x43,0x1b,0x20,0xcc,0x12,0xb7,0x79,0xe0,0xb8,0x4e,0x26, + 0xec,0xc4,0x11,0x1e,0x24,0xb7,0x40,0x26,0x5f,0x86,0xc6,0x88,0x65,0x33,0x3a,0x81, + 0x26,0x6d,0x8a,0x9a,0x54,0x21,0x6d,0xe4,0x54,0x4c,0xef,0x48,0xb3,0x77,0x52,0x5b, + 0x52,0x30,0x4b,0x74,0xea,0xa4,0x23,0xd,0x57,0x5,0x55,0xff,0xd1,0x96,0x46,0xad, + 0xcc,0x72,0x93,0x20,0x62,0x49,0x8a,0x39,0xd,0x55,0x7f,0xb0,0xd1,0xe9,0x3b,0x8a, + 0x15,0x2e,0xc4,0x23,0x4b,0x69,0x89,0x81,0x14,0xc,0x36,0x85,0x6b,0x88,0xbf,0x32, + 0x4f,0x52,0xa,0x65,0x61,0xc9,0xcb,0x10,0xd5,0x75,0xfe,0xfb,0x66,0x31,0x4f,0x7a, + 0xaa,0x84,0x34,0xe4,0xd1,0xa9,0x86,0xed,0x43,0x19,0xac,0x32,0x17,0xcb,0x96,0x36, + 0x80,0xa6,0xad,0x89,0x34,0xa8,0xb4,0x36,0xc2,0x2a,0xe8,0xd7,0xd2,0x74,0x70,0x5f, + 0x75,0x20,0x37,0xda,0xc4,0xb5,0x43,0x65,0x8,0xca,0x4a,0xe,0xf5,0xc2,0x28,0xe3, + 0xf7,0xd5,0xd9,0xf4,0xd6,0x1b,0xc0,0x92,0xe3,0x6,0xf8,0x16,0x32,0xec,0xf8,0x7d, + 0xc4,0x8c,0x75,0x84,0xf1,0x7,0xd0,0x81,0x9b,0x1,0xd7,0xd0,0xdd,0x9d,0xb,0x81, + 0x25,0xa2,0x81,0x58,0x9c,0xbd,0xe3,0x7b,0xb1,0x2e,0xbd,0x69,0xf3,0xe4,0xb5,0x36, + 0x87,0xa2,0xea,0x9d,0xba,0xdb,0x2a,0x28,0x62,0x33,0xee,0x6,0xbe,0x1,0x75,0xe3, + 0x9a,0x41,0x71,0xa4,0xfa,0xb3,0xa0,0x98,0x2,0xbf,0x1,0x66,0xef,0x32,0x4,0x94, + 0x7d,0xcc,0x57,0x86,0xc3,0x52,0xd0,0x77,0x18,0xdf,0x67,0xc7,0x40,0xb8,0x77,0xff, + 0x6c,0x26,0x72,0x6,0xc1,0x5b,0x85,0x93,0xee,0x29,0x1f,0x37,0xac,0x7d,0x9c,0x73, + 0x9d,0x5b,0xc1,0xca,0x76,0xaf,0x20,0x39,0x6,0xc6,0x68,0x15,0x99,0x6e,0x64,0xa6, + 0x6b,0xed,0x2a,0x88,0x50,0x72,0x38,0xea,0x23,0x2d,0xd5,0x41,0x41,0xde,0xd9,0x9b, + 0xdc,0x4a,0xd0,0x3a,0x62,0x3c,0xb2,0x97,0x79,0x2d,0x1c,0x8d,0x94,0x72,0x59,0x79, + 0x54,0xe8,0xdf,0x1e,0x6c,0xa4,0xdc,0x80,0xb1,0xb3,0x18,0xb8,0x45,0xf3,0x8f,0xcc, + 0x22,0xb0,0x8b,0x4a,0xc3,0x98,0x40,0x35,0xd1,0x16,0x23,0x44,0x4d,0x66,0x83,0xb9, + 0x37,0x8c,0x26,0xdd,0x56,0x56,0xb6,0x76,0x6,0x7f,0x90,0x15,0xbd,0xe7,0xef,0xe1, + 0x7c,0x60,0x1a,0x5d,0xda,0x81,0xc8,0xb,0xa,0x88,0xba,0xf0,0x1a,0xe1,0x74,0x50, + 0x48,0xd,0xcf,0x89,0x80,0x22,0xda,0x4d,0xe7,0xd7,0x32,0xee,0x90,0x1c,0x41,0x66, + 0x50,0x5c,0xcc,0x16,0x4b,0x9a,0xf3,0x2d,0x3d,0xe3,0x83,0xf,0xdc,0x82,0x6c,0x14, + 0x56,0xac,0xa6,0xe4,0x3e,0x49,0x4b,0x1b,0xf8,0x54,0xa0,0x7b,0x7,0x9f,0x3,0x0, + 0x1b,0xb1,0xa6,0xad,0xc5,0x60,0xaf,0xa1,0x2a,0xc9,0x2e,0x42,0x38,0x93,0x2a,0x22, + 0xd,0x6,0x29,0xab,0x35,0x67,0x67,0x3e,0x1,0x35,0x9,0xca,0xa0,0x31,0x32,0x87, + 0x39,0x50,0x28,0xa,0x50,0xa9,0xd9,0x8e,0x9f,0xb3,0xd,0x90,0x12,0x45,0x2d,0xeb, + 0x14,0xdc,0xa2,0x67,0x3f,0x56,0xaf,0x39,0x29,0x37,0x18,0x46,0x7a,0xf3,0x1f,0xa2, + 0xa4,0x88,0xd3,0x40,0xcc,0x8f,0x29,0xb7,0x20,0xec,0x67,0xe3,0x47,0xdd,0x2c,0x5f, + 0x9b,0x40,0x28,0x82,0x50,0xb8,0xab,0x45,0x5c,0x61,0xaa,0x54,0x89,0xde,0xe5,0xa3, + 0xe4,0x74,0xc1,0x81,0x5c,0x17,0x4,0x6e,0x42,0xc0,0x61,0x10,0x9,0x58,0xe3,0xa6, + 0xe9,0xd3,0x92,0xd0,0xa0,0xd3,0x85,0xab,0xda,0xa4,0xd,0xc2,0xf5,0x14,0x3c,0xda, + 0xd9,0x3d,0x7c,0x53,0x1a,0x2,0x2,0x76,0x33,0xa0,0xd6,0x9b,0x6d,0xb6,0x64,0xcd, + 0x17,0xe1,0xfe,0x8a,0x93,0x75,0x93,0xec,0x64,0x34,0x91,0xe1,0x49,0x11,0x28,0x44, + 0x24,0xaa,0xd7,0xb1,0xeb,0x6e,0xfe,0x2,0x21,0x7a,0x74,0x5b,0xbf,0x59,0xdd,0x64, + 0xda,0x66,0xff,0x4d,0x18,0xb1,0xa8,0x7d,0x46,0xad,0xb8,0xa8,0x76,0x6c,0x5a,0x69, + 0x9a,0xe6,0xd,0x26,0x55,0x97,0x3d,0x5b,0xed,0x10,0x7d,0x79,0x4a,0xbb,0x0,0x54, + 0x74,0x99,0xb0,0xd2,0x7e,0x53,0x62,0x7d,0x91,0x1c,0x3b,0x32,0xbd,0xee,0xa2,0xa4, + 0x7,0x70,0xdd,0x90,0x46,0xf0,0xe,0xcd,0xda,0x72,0xad,0xf,0xdf,0xeb,0xc6,0xbe, + 0x1f,0x3c,0x32,0x1f,0xbf,0xee,0xc6,0x45,0x13,0xcc,0x95,0x2f,0x66,0xcb,0x89,0xb1, + 0xe3,0xe9,0xb3,0x11,0xd1,0x3e,0xdf,0x2e,0x5a,0xeb,0xb0,0x16,0x4b,0x29,0x23,0x60, + 0x4,0xa0,0xf4,0x2c,0xde,0x9e,0x1a,0x72,0x9b,0xbf,0xcd,0x90,0x94,0x26,0xd2,0x2d, + 0xc6,0x6f,0x14,0x96,0x1d,0x6d,0xc2,0xa7,0x59,0x20,0x2d,0xb6,0x2a,0xa2,0x38,0x4a, + 0x4f,0x37,0xd7,0x6a,0x8a,0x94,0xc0,0xd4,0xce,0x77,0x64,0x8e,0x81,0xfb,0x74,0x33, + 0xcc,0xf,0xd6,0x9d,0xc,0xdd,0xd8,0xf5,0x46,0xca,0x9c,0xe5,0x9e,0xc3,0xb6,0xba, + 0x45,0xff,0xcc,0x14,0xbc,0x59,0xe8,0x29,0xf2,0xf9,0xa1,0xa9,0xc5,0xd7,0x85,0xa4, + 0x49,0x42,0xe3,0xd4,0x51,0x25,0xa6,0x7b,0xb2,0x56,0xe5,0x20,0x7a,0xd1,0x2a,0xa8, + 0x42,0x5d,0x1,0xc7,0x75,0x3a,0xc7,0xbe,0x43,0x14,0xc7,0xc2,0xd4,0x85,0xd3,0xce, + 0xca,0x6b,0x8a,0x77,0xe3,0xf6,0xad,0xc,0x8c,0x91,0xb1,0xb6,0xca,0x21,0x59,0xa0, + 0xf4,0x1e,0xcd,0xa4,0x9d,0xa9,0xec,0x74,0xb9,0xa0,0xe8,0x81,0xa3,0x94,0xc6,0xcc, + 0x72,0xec,0x1a,0xfb,0x14,0x57,0xf4,0x59,0xd1,0x76,0xa8,0xd1,0x1c,0x6c,0x37,0x8, + 0x36,0xd3,0x72,0xb,0xaa,0x9d,0x56,0xa5,0xbe,0xe4,0x9f,0xfb,0xbf,0x4,0x59,0x69, + 0xcb,0x5c,0x81,0xbd,0xe4,0x99,0x75,0xec,0x8d,0x8a,0xef,0x13,0x92,0x78,0xc9,0x38, + 0xdd,0x12,0xe1,0xa9,0x53,0xc9,0x6c,0xc8,0x6,0x5d,0x60,0x7e,0xa1,0x30,0xf6,0x10, + 0xb9,0x44,0xff,0x20,0x68,0x5,0x49,0x9c,0x5b,0xc8,0x8b,0xb5,0x52,0xfd,0xc,0xd4, + 0x52,0xac,0xee,0x91,0xba,0x13,0x13,0x5,0xe7,0x9c,0x4c,0x8b,0x37,0xa3,0x8,0x43, + 0xd0,0xe3,0xde,0x32,0x75,0x67,0x9b,0xad,0x50,0x54,0x49,0xa,0x90,0xd5,0x6e,0x29, + 0x52,0x88,0x67,0x7,0xba,0x39,0x9a,0x40,0xfa,0xbe,0x11,0x16,0x8c,0xb0,0x85,0xa9, + 0x96,0x77,0xc7,0xf2,0x1,0x27,0xbc,0x48,0xd3,0x38,0x9d,0x5d,0x1a,0x2c,0x72,0x63, + 0x15,0x3e,0xbd,0x98,0xf3,0x60,0xe3,0xf,0x8c,0x5b,0x4f,0x6b,0x5f,0xd2,0xeb,0x0, + 0xe5,0x48,0x4a,0x65,0x44,0x80,0x1d,0xdc,0x52,0x93,0xbd,0xbc,0xa3,0xa,0x38,0x11, + 0x22,0xbb,0xdb,0x84,0x5b,0x24,0xaa,0xcb,0x7c,0x20,0x24,0x61,0xa7,0x3a,0x64,0x78, + 0x1a,0x65,0x61,0x22,0x25,0x85,0x68,0x1b,0xb2,0x37,0xed,0x24,0x52,0x9a,0xbf,0x96, + 0x1e,0x7e,0xe2,0x29,0x49,0x1d,0xad,0xce,0xec,0xd0,0xfd,0x1,0xd2,0x24,0xe0,0x25, + 0x8d,0x8d,0x59,0xc2,0xad,0x53,0xef,0x31,0x8f,0x86,0x92,0xa8,0x34,0xf2,0xc7,0xa7, + 0x1d,0x8c,0x47,0xed,0x9a,0xa2,0x4,0xd0,0x27,0xc4,0xc5,0xc5,0xa4,0x3d,0x5f,0xd6, + 0x11,0x2b,0x3b,0x35,0x29,0x4d,0x90,0x23,0x67,0x23,0xa8,0x45,0xc4,0x7d,0xfe,0x51, + 0xc,0x45,0xda,0x9a,0x58,0x17,0x86,0x16,0x11,0xb6,0xa8,0xdd,0x38,0xc8,0x31,0x69, + 0xe1,0xf5,0xde,0xc6,0xcd,0x49,0xac,0x46,0x1,0x29,0xcd,0x3a,0xab,0xc6,0x23,0x3f, + 0xbf,0xcc,0x55,0xc6,0x4e,0x5d,0x8a,0x7f,0xde,0xb6,0xa5,0xf3,0xb5,0xee,0x31,0x8d, + 0x43,0xd0,0xa9,0x92,0xda,0x79,0x3e,0x67,0x43,0xcc,0xc0,0x16,0xeb,0xe,0x60,0x8, + 0x2e,0xfb,0xbc,0xa4,0xb5,0x43,0xa4,0x75,0x74,0xf4,0xe1,0x1c,0xea,0x5d,0x7a,0x43, + 0x57,0xf4,0x51,0xf2,0xd,0xa8,0x8e,0x24,0xeb,0xda,0x2a,0x23,0xf5,0xc8,0xd8,0x16, + 0x13,0xd2,0x71,0xb5,0x34,0x9d,0x31,0x5c,0xf3,0x36,0x8c,0xb,0x7c,0xee,0x5f,0xfa, + 0x98,0xd,0xa9,0xcc,0x4a,0x62,0xec,0xe1,0x55,0xd5,0x83,0xbc,0x5b,0x1a,0x32,0x93, + 0xf7,0x51,0x39,0xb2,0x1b,0x31,0x54,0x57,0xd3,0x44,0xce,0x77,0xad,0xc5,0x79,0x3c, + 0x46,0x6b,0xee,0x68,0x18,0xf1,0x79,0xb3,0xa0,0x6e,0x6,0xe7,0x9f,0x1a,0xd5,0x3, + 0x85,0x41,0x64,0xcc,0x9a,0xe6,0x19,0xe6,0x74,0xb7,0x76,0x42,0x50,0xa7,0xd2,0x4e, + 0x91,0x58,0x6a,0xc9,0x9e,0x46,0xe2,0x51,0x83,0xdb,0x48,0xd0,0x76,0x4,0x93,0xe7, + 0xcf,0xb1,0x87,0x5c,0xda,0x8a,0x37,0x1f,0x6d,0x53,0x19,0x3f,0x58,0xee,0xb,0x91, + 0x26,0x59,0x84,0xd2,0x8e,0x60,0x1b,0x3a,0x53,0x46,0xd6,0x6e,0xba,0xb7,0xd1,0x1a, + 0xc5,0x70,0xd,0x2e,0xf2,0xd4,0x96,0x10,0x4,0xc,0x26,0x18,0x99,0x3f,0xac,0xd6, + 0x4c,0xb8,0x26,0x5d,0xa4,0xab,0x6a,0xc3,0x70,0xd6,0xa5,0xcb,0x7c,0x37,0xc6,0x38, + 0x46,0xe3,0x9d,0x8b,0xe0,0x61,0xce,0x24,0x4,0xbe,0xc6,0x26,0x37,0x6a,0xa6,0xae, + 0xa6,0x27,0xcc,0x15,0xaf,0xef,0x3f,0xfa,0xc,0x5d,0xb0,0xe2,0x58,0x39,0x54,0x5, + 0x4e,0xc4,0x35,0x64,0x76,0x9f,0xe2,0x3d,0x6f,0xbe,0x69,0xac,0x7,0x1d,0xe2,0x9a, + 0x18,0xe3,0x92,0xa0,0x8a,0x41,0x45,0x7c,0x3d,0xa5,0x6a,0x81,0xb2,0x63,0xdd,0xb3, + 0x69,0x5f,0x37,0x1d,0x6d,0x31,0x6e,0x9,0xc1,0x4,0xa8,0x1a,0x69,0x61,0xab,0xe4, + 0xfd,0x0,0x41,0xe7,0x1,0xa1,0xbf,0x6e,0xba,0x2,0x6f,0xc2,0x93,0x3e,0x8b,0x87, + 0x16,0xd2,0x7f,0xf1,0x28,0x7b,0xf2,0x1b,0x69,0xda,0xa9,0xbb,0x7a,0x9c,0x66,0xf2, + 0x58,0x66,0x87,0xf4,0x45,0x39,0xa5,0x5f,0xfd,0xb5,0x4f,0x44,0x99,0xb1,0x8e,0x81, + 0xb1,0x6,0x47,0xb,0xd5,0x8c,0x82,0xf,0x8f,0x78,0xb2,0x8d,0x9d,0x90,0x38,0xb3, + 0x5a,0x37,0xb4,0x58,0xf8,0x83,0x27,0x2a,0xae,0x1c,0x4e,0x5d,0x3,0x79,0xc5,0xe8, + 0x33,0x9c,0xd3,0x13,0x4,0x7c,0x2a,0x8d,0x78,0xcd,0x2b,0x5,0x4a,0x5,0x2b,0x17, + 0x53,0x1e,0x15,0x4f,0xf1,0x1a,0x22,0x5c,0xcd,0xbf,0x7e,0x23,0xa2,0xb9,0xee,0x60, + 0xe,0x4b,0x2c,0xd4,0x5b,0x35,0xfb,0xa1,0xfb,0x6e,0xc4,0xb0,0x34,0x91,0x31,0xd9, + 0x82,0x5d,0xe6,0xce,0xe1,0x1e,0x4a,0x27,0x73,0xb1,0xba,0x40,0xce,0x26,0x42,0x94, + 0x9b,0x63,0xf1,0xc8,0x7e,0x44,0x34,0xf5,0x9c,0xc,0xea,0xb6,0xc,0x9a,0xee,0x6b, + 0x61,0x4c,0x6f,0x7e,0x8,0x4d,0xa3,0x2b,0x56,0xb2,0xf6,0xcd,0x14,0xcc,0xf1,0x47, + 0x5a,0x90,0x4f,0xb3,0xe,0x4b,0xa7,0x1d,0x10,0xbe,0x2f,0x9d,0x89,0x61,0x88,0x81, + 0xfb,0xb4,0x4b,0xd8,0xe7,0x9c,0x27,0x83,0x8,0x21,0x1e,0x57,0x47,0xb4,0xc3,0x17, + 0x49,0x13,0x6,0xb8,0x2b,0x24,0x1c,0x35,0x84,0xed,0xf5,0xbd,0x43,0x87,0x31,0xaf, + 0x8c,0x0,0x17,0x2c,0x2d,0x4f,0xd2,0x69,0x80,0xa2,0x4d,0x3b,0x62,0xb3,0xdd,0x79, + 0x47,0x9b,0xcb,0xe9,0x51,0x60,0x35,0x21,0xb6,0xcc,0xf8,0x19,0x7b,0x35,0x6d,0x17, + 0x69,0x1c,0xfb,0xc3,0x7f,0xd,0x16,0x2,0x9a,0xf8,0x52,0xa0,0x7d,0x82,0x76,0x3a, + 0xb4,0xb9,0x40,0x4e,0xfb,0x88,0x86,0x1d,0x17,0x59,0x87,0x1c,0x88,0x4d,0x92,0xe6, + 0x11,0x3d,0xbf,0x77,0x5f,0xd5,0x59,0xdf,0xd3,0x68,0x17,0xc5,0x45,0xf9,0xf8,0xc6, + 0xf2,0xe4,0x54,0x3b,0x20,0xda,0xda,0x30,0xc,0xba,0xe,0xc7,0x3,0x2b,0x7c,0x9a, + 0xda,0xe0,0x13,0x26,0xd8,0xf8,0x98,0x59,0x2e,0xac,0x3b,0x4f,0xd7,0x5d,0x5c,0xda, + 0xb1,0xae,0x4a,0x2,0x40,0xff,0xdf,0x62,0x6b,0x53,0xb7,0xee,0xc9,0x4e,0x1a,0x6, + 0x7f,0x81,0x4c,0xe7,0xbd,0xcf,0xcb,0x3b,0x2a,0x58,0xb0,0x20,0xd4,0xab,0x30,0xf5, + 0x6,0x4a,0x12,0x6a,0x37,0x3,0x73,0x4d,0xc8,0xe1,0x11,0x7c,0x86,0x7f,0x6d,0x51, + 0x28,0xa8,0xe,0x4b,0xa7,0xff,0xcc,0x91,0x37,0xae,0xb2,0x49,0x95,0x53,0x39,0xc, + 0x65,0x5d,0x13,0x56,0x1e,0x6a,0x99,0xdb,0x67,0x23,0x32,0xd8,0xb6,0x55,0x10,0x92, + 0x79,0xcb,0x83,0xb4,0x71,0xe2,0xb4,0x31,0xf,0x64,0x50,0xf0,0xc2,0xe1,0x20,0xbd, + 0x21,0x24,0x8,0xd1,0xf0,0xe7,0x8e,0x6a,0xb7,0x63,0x64,0x4b,0xf6,0x3e,0xaa,0x41, + 0xd,0x3e,0xaf,0x87,0xa7,0xdb,0xfe,0x34,0x5d,0xec,0xde,0x2a,0x28,0x71,0xab,0x9a, + 0xa6,0x50,0x14,0x4e,0x36,0x9b,0xc0,0x21,0x64,0x6d,0xb4,0xe,0x95,0x6e,0xda,0x11, + 0x46,0x70,0x4f,0x5c,0xa,0xae,0xbc,0x35,0xf6,0xb6,0xb5,0xdd,0xf0,0xa2,0x47,0x80, + 0xba,0xe7,0x56,0x86,0xdb,0x36,0xf1,0x64,0x59,0xf0,0xba,0x3c,0x62,0x93,0xd2,0x46, + 0xd9,0x4e,0x64,0xff,0xe2,0x22,0xf5,0xc8,0x85,0xd8,0xbd,0x85,0xdc,0xcd,0x6e,0x42, + 0xfb,0xda,0x54,0x2b,0x64,0xb1,0x48,0x25,0x38,0xf,0x96,0x72,0xc9,0x69,0x7d,0xa2, + 0x65,0xdd,0xa3,0x44,0x7c,0xf,0xb6,0xa5,0x2f,0xe2,0x33,0x81,0xc9,0x6d,0x93,0x24, + 0x4b,0xef,0xf3,0xb2,0xee,0x8e,0xb5,0xb0,0xdb,0x2d,0x74,0x9e,0x50,0x95,0xee,0xd1, + 0x3e,0x36,0x8d,0xf1,0xe,0x9c,0x40,0x50,0x2d,0x9b,0x34,0x12,0x40,0x29,0x6f,0x42, + 0x8,0xa3,0x7,0xcf,0x18,0x88,0x6b,0x2e,0x76,0x77,0x2a,0xa6,0x10,0xb0,0x3,0xd, + 0x51,0x1f,0x7a,0x4e,0xb6,0x7b,0xa4,0x1d,0x1a,0x64,0x8e,0x19,0xf0,0xee,0x73,0xee, + 0xd7,0x4d,0xb8,0x64,0xda,0x23,0x95,0x18,0xd7,0x27,0x6e,0x2,0x5b,0xff,0xbc,0x8, + 0x84,0xaf,0x34,0xe6,0x52,0x51,0x83,0xb9,0xdd,0xba,0xb4,0x3e,0xab,0xaf,0x36,0x58, + 0x40,0xb1,0xf3,0x9c,0xef,0x6d,0x97,0x94,0xa6,0x35,0xb6,0xba,0xd9,0x9d,0xe7,0x4e, + 0x12,0x56,0xda,0x42,0x8,0xd3,0x3b,0x4f,0x4b,0xef,0x82,0xf9,0x5d,0xef,0x94,0x5c, + 0x39,0x7f,0x9e,0x63,0x32,0x3c,0xd3,0xcd,0xec,0x1b,0xeb,0x76,0x3b,0xb7,0x40,0xbe, + 0x92,0x7b,0x10,0xee,0xfa,0x9f,0xdd,0xe9,0x2c,0x2c,0x5c,0xf8,0xe6,0x41,0x24,0x1e, + 0x3c,0x27,0x91,0x4e,0xa7,0xb1,0x3a,0xe9,0x92,0xd5,0xf6,0xa4,0xcd,0x4a,0x74,0x42, + 0x10,0x50,0xa8,0xec,0x35,0x1d,0xb8,0x3f,0x68,0x97,0x84,0x5b,0x8e,0xda,0x76,0x48, + 0xd0,0xe,0x66,0xdc,0xdb,0xb4,0x61,0x7,0xc3,0x7f,0x5c,0x88,0xe2,0x97,0xb9,0xc4, + 0x24,0x25,0x84,0x39,0x46,0x44,0x66,0x6b,0x6c,0xac,0x1,0x85,0x46,0xf4,0x98,0x2, + 0xcb,0xa1,0x73,0xc3,0xfc,0xb9,0xda,0xe5,0xd6,0x61,0xa,0xf8,0x61,0x9f,0xec,0x68, + 0x53,0x8c,0x89,0x31,0x31,0x37,0xed,0x87,0x15,0xc9,0x64,0x79,0x15,0x65,0xe3,0xa9, + 0x3a,0x5d,0x6a,0x78,0x20,0x5b,0x1b,0x6,0xba,0xa6,0xcd,0x87,0x84,0x4d,0xdb,0xe, + 0xda,0xe7,0xf4,0x22,0x51,0x2a,0x44,0x9b,0x75,0x3b,0x5d,0x1b,0x65,0xb6,0xa6,0xd4, + 0x66,0xa5,0x8c,0x14,0x46,0x7f,0x11,0x8c,0x69,0x1e,0xb,0xbd,0xcf,0x95,0xc2,0xa8, + 0x14,0x8c,0x37,0x30,0x4b,0xca,0x1e,0xd6,0xc6,0x3,0x9d,0xd4,0x5b,0x5b,0xa1,0xda, + 0xfc,0x83,0x82,0x81,0xdc,0x46,0xaf,0x5,0xfb,0x8a,0xd5,0xf2,0x2d,0x79,0x62,0x22, + 0xdc,0x34,0xd9,0xf3,0xd2,0xc4,0x55,0xbb,0x92,0x81,0x79,0x12,0x83,0x1,0x12,0xd1, + 0x81,0x1b,0xab,0x7d,0x93,0x12,0x4c,0xb0,0xcc,0x81,0xa,0x43,0x7e,0x75,0xcf,0x8e, + 0x91,0x55,0xc1,0xa2,0x89,0x61,0x99,0xb5,0x41,0x65,0x91,0xaf,0x5e,0x82,0x47,0xc4, + 0x91,0xcc,0xdc,0xd9,0x50,0x3e,0x5b,0xc1,0x3a,0x36,0x2b,0x36,0xe2,0x0,0x75,0xb1, + 0x50,0xe9,0x43,0x3b,0x32,0x84,0xdd,0x5d,0xed,0x7c,0x9f,0x84,0xa2,0xf1,0x22,0x8d, + 0x21,0x86,0x85,0x50,0xc,0x4a,0x81,0xf8,0x2e,0x26,0xf2,0x1e,0xe2,0xe4,0x6b,0x24, + 0x33,0xaf,0x5e,0xfe,0xcd,0x50,0x95,0xc2,0x9b,0x8e,0xa6,0x3e,0xa8,0x8f,0x53,0x4d, + 0x63,0xcb,0x58,0x53,0x2c,0x87,0x8f,0x1d,0xf6,0xd2,0xa,0xed,0xd,0xe3,0xb6,0x15, + 0xba,0xd0,0xdc,0x72,0x16,0xf9,0x87,0x91,0xa5,0xaa,0xa4,0xd8,0x57,0xbe,0x26,0x89, + 0x24,0xa4,0xd4,0xcc,0x25,0x55,0x24,0x23,0x2b,0x11,0xb3,0x2b,0x5b,0xec,0x2a,0x96, + 0x64,0x80,0x96,0x41,0x9,0x4a,0x4,0x79,0x4b,0xf0,0xa,0x9c,0xfc,0x6c,0x5b,0x95, + 0xb4,0xd7,0x13,0x22,0xe0,0x4f,0x55,0xa3,0x92,0x5b,0x69,0x2c,0xa0,0x34,0xe9,0xf1, + 0x1b,0x2b,0xa6,0x13,0xdd,0x52,0x2a,0x88,0x5f,0x1f,0xbb,0x62,0xcd,0xa8,0x36,0x1a, + 0xd6,0xb3,0x6d,0x11,0xc4,0x6d,0x17,0x16,0x58,0xf8,0x8e,0x2a,0x9,0xde,0xac,0x8a, + 0x4f,0x1a,0xa,0xd0,0x4e,0x5b,0x6d,0xf5,0x16,0x8c,0xe3,0xe9,0x6e,0x80,0x67,0x9b, + 0x83,0xe3,0x39,0x43,0x5d,0x84,0x89,0x69,0x77,0x80,0xde,0x18,0xbd,0x2a,0x5c,0x91, + 0x64,0x97,0xbb,0xb2,0xbb,0x30,0xc,0xa9,0xfe,0x9e,0x20,0x19,0x25,0xa2,0xa6,0x6e, + 0xcd,0x31,0x73,0xe3,0x5b,0x1b,0x74,0xb8,0xd9,0x3e,0xd9,0x28,0xb7,0x99,0xec,0x2, + 0xc2,0x8a,0x65,0x62,0x83,0xc1,0x51,0x8e,0x8c,0x54,0x14,0xf0,0x64,0x8b,0xd8,0xd, + 0x2,0x86,0xe8,0xa4,0x9d,0x27,0xfc,0x9f,0xfb,0x45,0x9a,0xf3,0xcc,0xa3,0x89,0x19, + 0xc8,0x53,0x93,0x24,0x79,0x33,0x44,0xa3,0xfb,0x80,0xf6,0x0,0xd2,0x46,0x37,0xde, + 0x41,0x2e,0xe3,0x49,0x5e,0x73,0xd,0x7b,0x2,0xfc,0x8c,0x36,0xbd,0x93,0x48,0x35, + 0x2e,0x12,0xc2,0x92,0x8a,0x46,0x4c,0x83,0xb6,0x2a,0x72,0x52,0xca,0xc8,0xb6,0xc0, + 0xc1,0x41,0x4c,0x74,0x27,0xa3,0x1f,0xcc,0xf1,0x73,0x9e,0xc5,0xe1,0xd0,0x8,0x9, + 0xa0,0xda,0xc7,0x92,0x48,0x5d,0xb2,0x33,0x9f,0xb3,0xf9,0x33,0x81,0xc6,0x68,0x9b, + 0x53,0x60,0x6c,0xcc,0xab,0x90,0x3,0x9f,0xed,0x60,0xba,0x2f,0x5c,0x7f,0x30,0x57, + 0x92,0xb3,0x43,0x57,0xb3,0xf5,0xf5,0x59,0xa0,0x76,0x39,0x30,0x2f,0x77,0xeb,0xa3, + 0x89,0x8e,0x33,0x4d,0x38,0x25,0x90,0x83,0x45,0x8c,0xb4,0xa,0x43,0x9d,0x7b,0xe3, + 0xd2,0x66,0x97,0xda,0xa7,0x48,0xd9,0x8a,0x93,0x71,0x68,0x6b,0x6b,0x10,0xf4,0x49, + 0x78,0x6f,0xd3,0x71,0x31,0xa9,0x62,0x6,0x8c,0x76,0x81,0x1c,0x2c,0x83,0x3d,0xed, + 0xe3,0x66,0x81,0xe8,0x60,0xb0,0x3e,0xa,0xa4,0x3e,0x32,0x8d,0xec,0x47,0xd2,0xfb, + 0x81,0xeb,0x51,0xfa,0x98,0x68,0x35,0xcc,0x8c,0xd5,0x39,0x3e,0x9d,0xd2,0xf5,0x3, + 0xe1,0xf3,0xd,0x5c,0xa6,0x61,0xc3,0xf5,0x23,0x8d,0x5,0x4b,0x8d,0x44,0x70,0xad, + 0x50,0xdd,0x5a,0x28,0x5d,0x28,0x10,0x49,0x19,0xaa,0x2a,0x65,0xec,0xa0,0x39,0x4d, + 0x32,0x3b,0x2a,0x74,0x55,0xf2,0x66,0x52,0xdc,0x86,0x6c,0xb0,0x20,0x52,0x93,0x7a, + 0x7a,0x73,0x69,0xaf,0x39,0xec,0xa9,0xe4,0xab,0xa3,0x69,0xb2,0xa,0x80,0x4b,0x15, + 0xf5,0x9f,0x3c,0x35,0x44,0x49,0x24,0x61,0xa0,0x8f,0xe1,0x37,0x1f,0x1f,0x60,0x77, + 0xa4,0x60,0x13,0xed,0x73,0xd8,0xd7,0x43,0xe2,0xae,0xde,0x88,0xcd,0x8c,0x5e,0xa8, + 0xdd,0x62,0x21,0x82,0xb,0x7e,0x35,0x55,0x5c,0x75,0x83,0xeb,0x59,0xdf,0x36,0x5c, + 0x87,0x77,0xe9,0x8,0xd9,0x36,0x5c,0x82,0x3b,0x6d,0x32,0x7a,0x10,0x8a,0x67,0xbf, + 0xe8,0x4d,0x1a,0xda,0x5d,0xe0,0x43,0xbe,0x74,0xa4,0xd1,0x2f,0xb3,0xd,0xd2,0xb8, + 0xdd,0x40,0x2b,0x8b,0x7c,0x72,0xcc,0x78,0x93,0x23,0x81,0xf9,0x2,0xca,0x58,0x57, + 0x84,0x4d,0x43,0xda,0x3c,0x84,0x3b,0x4a,0x6e,0xdc,0xc6,0x7a,0x3b,0x7c,0xb,0xdd, + 0xec,0xf6,0xc3,0xd8,0x8c,0x16,0x4b,0xad,0xf8,0x6e,0x8a,0xf8,0x17,0x2d,0x4a,0xa6, + 0x28,0x4b,0xe6,0xa8,0x78,0xee,0x51,0xec,0xb,0xee,0x24,0x6e,0x8b,0x9d,0x95,0xaf, + 0x67,0x55,0x25,0xc6,0xef,0x94,0x70,0xa1,0x6c,0x10,0x57,0xd3,0x47,0x68,0x62,0x37, + 0xad,0x3a,0x11,0x5d,0x52,0x94,0x28,0xb1,0x93,0x5e,0x6e,0x55,0xa4,0x12,0x88,0x4, + 0x42,0xa1,0x51,0xb,0x91,0xc9,0x38,0x84,0x1a,0x8f,0x70,0x23,0x5c,0xc5,0xa6,0xe2, + 0xce,0x58,0x98,0x83,0x4d,0xaf,0xaf,0x63,0x54,0xdc,0x1d,0x42,0x17,0x3c,0x53,0xe, + 0x7c,0xa4,0xef,0xc9,0xa5,0xb2,0x60,0x6d,0x86,0x46,0x95,0x3a,0x57,0xe,0xdd,0x8b, + 0xde,0xd1,0x1d,0xf5,0xd1,0xcc,0x34,0x8f,0x4f,0xb2,0xb1,0x14,0x62,0x2,0x16,0xc2, + 0x74,0xd5,0x15,0xce,0xa3,0x99,0xe8,0xeb,0x5e,0xc,0x1a,0xa5,0x23,0x9,0x30,0x67, + 0x91,0xd4,0x19,0xb0,0xa8,0xb0,0x55,0x1d,0xd2,0x7a,0x4a,0xdc,0x5a,0x9,0x1d,0xbc, + 0xb7,0xae,0xa1,0x51,0x8,0x11,0x1b,0x40,0x85,0x56,0x0,0x6c,0xba,0x5b,0xe9,0xc0, + 0x4,0xd0,0x14,0x8c,0xa9,0x5a,0x95,0xec,0x59,0x24,0xaa,0x9a,0xa7,0x96,0xc9,0x66, + 0x40,0xc4,0x19,0x77,0x20,0x45,0x44,0xad,0xe4,0x41,0x94,0x4c,0x68,0xcc,0xb0,0xc1, + 0x8f,0xf,0x77,0x30,0xcd,0x74,0x82,0x5e,0x54,0x5b,0x37,0xd7,0xe1,0xec,0x70,0xa6, + 0x19,0x7e,0xea,0xc8,0x8c,0xd1,0x16,0x85,0x89,0xc7,0x2c,0x7b,0xb1,0xae,0xe8,0xbd, + 0x63,0x64,0x44,0x39,0xcf,0xa0,0x8f,0xdb,0xce,0xf8,0xed,0x3d,0x9e,0xbf,0x31,0xa9, + 0xeb,0xe8,0x1d,0xc4,0x9b,0xf,0xcd,0x0,0x7f,0x4e,0xde,0x20,0x34,0x9f,0x62,0x4a, + 0xe0,0xca,0x55,0xe6,0xf3,0x35,0xb6,0x3d,0xad,0x75,0x41,0x6f,0xbe,0xe,0xc5,0xbc, + 0xcc,0x9b,0x8e,0xce,0xc6,0x2c,0x6d,0xe1,0xc,0x8,0xb5,0xab,0x68,0xfe,0xb4,0x95, + 0xc4,0xc5,0xd4,0x59,0xa9,0x8a,0x1c,0x8,0xad,0xb8,0x4,0xa2,0xad,0xcf,0x81,0x4d, + 0x17,0x4f,0xdd,0x9b,0x4c,0x7b,0x21,0x7e,0x3f,0x61,0x95,0xfb,0x90,0x4c,0xfa,0xb6, + 0xb0,0x4b,0x68,0x68,0x50,0x80,0x6a,0x6,0x97,0xa9,0xf7,0x60,0xb6,0x94,0x55,0x6c, + 0xb6,0x72,0xb3,0x22,0xc5,0xf,0x42,0xec,0x16,0xda,0x99,0x27,0x24,0x7b,0x15,0xf3, + 0x6a,0x92,0xab,0x1e,0xf6,0xd6,0x64,0x2b,0xe1,0x95,0xcc,0xcd,0x2,0x9e,0xa9,0x29, + 0x39,0x2f,0xfd,0x23,0x6e,0x11,0xbc,0x22,0x41,0x97,0x93,0x29,0x54,0xe7,0xbc,0x56, + 0xe5,0xb7,0x19,0x94,0x9c,0x9b,0xc1,0xef,0xa9,0x9c,0x89,0x6c,0x74,0x19,0x74,0x80, + 0x29,0x9c,0x98,0x1,0xc1,0xf6,0xaf,0x74,0xdb,0xff,0x75,0x7,0x5f,0x86,0x8a,0xc2, + 0x11,0xaf,0x4c,0xb2,0x50,0xcd,0x23,0x8b,0x14,0x13,0xca,0x7,0x38,0x2d,0xe,0x22, + 0x70,0xc1,0xfd,0xe5,0xa2,0x46,0xae,0xf4,0x2a,0x0,0x22,0x2a,0x3b,0x15,0xab,0x4, + 0xc7,0xf7,0x4b,0xc,0x77,0xb4,0x58,0xc3,0x29,0x75,0x7e,0xa0,0x91,0x32,0x2d,0x2a, + 0xc8,0xed,0xa0,0x59,0xf2,0xa6,0xaa,0xc2,0xd4,0x76,0x75,0xf4,0xa4,0xd3,0xf,0xa0, + 0x25,0x1,0x91,0xc7,0x88,0x1e,0x72,0xa4,0xe2,0x6e,0x82,0xb9,0x16,0x5a,0xac,0x5d, + 0x52,0xab,0x39,0x5,0x2b,0xcd,0x60,0x5f,0x20,0x51,0xb1,0x48,0x8c,0x19,0x3a,0xa, + 0x98,0x4a,0x3e,0x5f,0x34,0xa2,0x30,0xa2,0x56,0xba,0x70,0xe1,0xb8,0x9c,0x49,0x8c, + 0xf6,0x1f,0x6,0x66,0x7e,0x77,0x4a,0x51,0x8f,0x19,0x44,0x53,0xe5,0xe0,0x1a,0xd, + 0xb5,0x41,0x9e,0xca,0x80,0x81,0x4a,0x33,0x44,0x5e,0x95,0x3d,0xa3,0x84,0xa2,0x45, + 0x78,0x9e,0x85,0x3a,0x76,0x72,0x35,0xc4,0x56,0x89,0xba,0xee,0x18,0x36,0xcc,0xd4, + 0x34,0x1a,0xaf,0xf6,0x1e,0x9d,0x2a,0x1a,0xaf,0xfd,0x28,0x26,0x95,0x2a,0xcc,0x8e, + 0xf0,0xdc,0x16,0x81,0x8c,0x42,0x62,0x79,0x9b,0x1c,0xe,0x1c,0x20,0x60,0xdb,0xf0, + 0x51,0x60,0xc1,0x4d,0x10,0xcd,0xfe,0xe1,0x54,0x22,0xb7,0x94,0x90,0x44,0xdd,0xf8, + 0xe6,0x26,0xd3,0xbe,0xbe,0x6e,0xf3,0x2,0xe7,0xf7,0x2b,0x81,0xe7,0x39,0x8e,0x40, + 0x11,0x14,0x45,0x6f,0xef,0x41,0xeb,0xb8,0x28,0x62,0xa6,0xe7,0x68,0xee,0xd0,0x8c, + 0xed,0x1a,0xf9,0x41,0x54,0x81,0x93,0x6,0xda,0x17,0xe9,0x7a,0xe0,0xa,0x43,0x70, + 0x1d,0x44,0x70,0x18,0x68,0x71,0xfa,0xf0,0x37,0xc1,0xb9,0xb,0x93,0x37,0x2f,0x9a, + 0xa0,0x1e,0xb1,0x41,0x82,0x95,0xf0,0xad,0xe5,0xca,0xb9,0xb5,0xa0,0x4c,0x8c,0xb, + 0xb3,0xf,0xb,0x9b,0x76,0xf1,0xce,0x1c,0x7d,0x84,0xa1,0x8f,0xb,0x51,0x46,0xc8, + 0x49,0x77,0xfa,0xbb,0xce,0x5c,0xb9,0xc1,0x70,0x99,0x93,0x3c,0xc9,0xa6,0xbd,0x10, + 0x93,0xc1,0xba,0xee,0xf1,0x33,0x6e,0x61,0x8b,0x1c,0x17,0x78,0xef,0xda,0xa0,0x40, + 0x77,0xa5,0xbd,0x4c,0xea,0x1a,0x81,0xb1,0x4c,0x18,0x8a,0x56,0xd4,0xb6,0x9a,0xbb, + 0x50,0x25,0xb4,0x20,0x43,0x62,0xec,0xc2,0x9e,0xa4,0xc2,0xa9,0x81,0x8a,0xab,0x10, + 0xb3,0x88,0x74,0x90,0xf0,0x34,0x58,0x8e,0x93,0x53,0x3d,0x85,0x8b,0x34,0xef,0xb9, + 0xc9,0xe8,0x51,0x3c,0x9b,0x20,0xd2,0x78,0x4,0x1e,0x7e,0xd3,0xd1,0xe7,0xab,0xd1, + 0x43,0x30,0xd7,0x19,0xae,0x65,0x3b,0x5b,0x6f,0x7e,0x14,0x19,0xaa,0xb6,0x9c,0x85, + 0x8d,0x32,0x5c,0xb8,0x8f,0xa,0x41,0xdf,0x38,0xf4,0x5a,0x2b,0xee,0xd6,0x96,0x6c, + 0x6e,0x51,0x35,0x36,0x91,0xcd,0x6f,0xb0,0xaa,0xb2,0x4b,0xf3,0xdd,0xa2,0x90,0xf0, + 0xb4,0x35,0x5e,0xf1,0xc7,0xae,0x81,0xaa,0x7a,0x2d,0xd4,0x34,0xab,0x13,0xed,0xc0, + 0xd0,0x22,0xdb,0x37,0xab,0x86,0xda,0xcc,0x85,0x3d,0x29,0x55,0x15,0xaf,0x75,0x9a, + 0x10,0x2b,0xfc,0x4c,0x41,0xa3,0x8,0xd5,0xe9,0x4a,0x1b,0x3d,0xda,0x14,0x4f,0xc4, + 0x63,0xe4,0x27,0xa0,0x36,0xa,0x5b,0x85,0xd0,0xee,0x89,0x86,0x18,0xeb,0x87,0xe8, + 0xfc,0xed,0x62,0x9f,0xa7,0x33,0x89,0xf6,0x7e,0x31,0x9a,0x80,0xb,0x6d,0xec,0x63, + 0x6a,0x92,0xac,0x4b,0x6d,0xf8,0xd9,0xc9,0x8a,0x51,0x88,0x53,0xa6,0x84,0x6a,0x4c, + 0xe,0xf7,0xb,0xb1,0x91,0x8e,0x6f,0x80,0xed,0x87,0xfe,0x88,0x65,0x1,0xac,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x64,0x5e,0xc4,0xe9,0xd3,0x8b,0x35,0x54,0x66, + 0xf2,0xfa,0xa5,0xe4,0x5b,0xcf,0x58,0x29,0x74,0xdb,0xa1,0xeb,0x4a,0x48,0xad,0x71, + 0xd6,0x5c,0x80,0xe8,0x88,0x9a,0x4c,0xc,0xd6,0x9,0x64,0x70,0x1f,0x29,0x3,0x6f, + 0xd4,0x3b,0x6c,0x76,0xf1,0x71,0x16,0x36,0xdb,0xda,0x1d,0xa6,0x27,0x3d,0x74,0x74, + 0x34,0x55,0xd6,0x8c,0x6d,0x53,0x5f,0x22,0x6a,0x19,0x5f,0x69,0x6a,0xe6,0x13,0x26, + 0x55,0x66,0x54,0xad,0xe9,0x38,0xfc,0x3f,0x82,0x20,0x46,0x29,0x1,0x13,0x8d,0x8f, + 0x63,0x92,0xe9,0x8,0x5e,0xa1,0xcb,0x0,0x91,0xa2,0x22,0x1,0x43,0x89,0xeb,0xb, + 0xa1,0x5f,0x88,0xbd,0x38,0x66,0x28,0x11,0xd7,0xc8,0x82,0x80,0x51,0xe,0xb0,0x49, + 0x60,0x71,0xa8,0x1e,0x51,0x1e,0x2b,0x4,0x9a,0x32,0xa2,0x7d,0xd5,0x2f,0x6c,0x77, + 0x1a,0xf9,0x68,0x13,0x4e,0xf4,0xf2,0x97,0xcb,0x49,0xed,0x4d,0x43,0xae,0x9f,0xe7, + 0x19,0x8d,0xfc,0xfa,0x6c,0xde,0xd6,0xb4,0x9d,0xb2,0x22,0xc3,0x9f,0x35,0x0,0x6c, + 0xa2,0x97,0x46,0xbe,0x72,0xe,0x25,0xb2,0x65,0xf7,0x1,0x4d,0x35,0xb8,0x78,0x68, + 0x94,0x93,0x61,0xc5,0x4e,0x74,0xc5,0x19,0x67,0xac,0xb3,0xe5,0x4a,0xcd,0x9e,0x42, + 0x56,0x5a,0x24,0x52,0xc1,0x52,0xe3,0xa3,0x55,0x57,0xc3,0x37,0xe1,0x44,0xa8,0x49, + 0x40,0x8,0x71,0x13,0x59,0xe,0x14,0x70,0xe5,0x2b,0x0,0x15,0x3,0x65,0x85,0x3, + 0x41,0x55,0x7a,0xa7,0x48,0xd2,0xc0,0x4e,0x8a,0x86,0x40,0x2f,0xc6,0xbf,0x96,0xbd, + 0x24,0xc9,0xe,0xd9,0x26,0x21,0xf,0xe8,0xaa,0x7d,0x8,0x4d,0x3a,0xfa,0xa8,0x1c, + 0x47,0xf7,0x6e,0x35,0x17,0xd0,0x55,0x9b,0x3b,0xde,0x66,0x65,0x8c,0xc4,0x37,0x37, + 0x68,0xb9,0x86,0x5c,0x10,0x44,0xc5,0x53,0x86,0xb5,0xb8,0x3d,0xdd,0x1,0x1,0x5d, + 0xac,0x21,0x1b,0x3c,0x91,0xae,0x14,0xe0,0x2,0x76,0x59,0xd0,0x5f,0x83,0x96,0xa5, + 0xd5,0x74,0xaf,0xcd,0x36,0x3e,0x6e,0xf1,0x9c,0x3e,0x4f,0x9d,0x8a,0x7d,0x0,0x7, + 0xea,0x94,0x38,0xa4,0xce,0x7c,0x2a,0xfe,0xb5,0xa1,0x77,0xe4,0xcc,0xfb,0x36,0x15, + 0xdc,0xc9,0x22,0x9a,0x7d,0xe4,0x88,0xac,0xb2,0x29,0x5c,0xe3,0x9a,0x55,0x89,0xac, + 0x48,0x2,0xc9,0x18,0x53,0x53,0xc0,0xd7,0x6,0x1b,0xa3,0x68,0xd4,0x95,0x6d,0x6e, + 0x5a,0xe1,0x20,0xe3,0x1f,0x1d,0xda,0x5e,0x74,0xad,0xe,0x40,0x5d,0xb1,0xe4,0x7, + 0x3e,0xc1,0x4b,0x2a,0x71,0x41,0x23,0xd7,0x1b,0x99,0x3d,0x9b,0x67,0xa,0xdc,0xe3, + 0x5b,0x96,0xf3,0x98,0x44,0xbb,0x63,0xc6,0x8,0x51,0x4a,0x77,0xb0,0xad,0x8,0x6c, + 0xde,0x14,0xaa,0x5c,0xb5,0x41,0x7a,0x57,0x9b,0x46,0xc5,0xf5,0xd1,0x25,0x78,0x85, + 0x16,0xfc,0x92,0x68,0x64,0xac,0xdf,0xb2,0xc5,0x4f,0x20,0x28,0x67,0xc2,0x93,0x4f, + 0x2f,0xe0,0x1e,0x75,0x27,0x1,0xd3,0xc7,0x60,0xa,0xde,0x79,0x76,0x75,0x5b,0xbf, + 0x69,0xdb,0xc2,0x80,0xe7,0xe6,0x75,0xf,0x98,0xc7,0xa6,0xec,0x9d,0x77,0xdb,0x56, + 0xa7,0x34,0x32,0xf3,0x57,0xda,0x6e,0xd,0x45,0x77,0xdf,0x7c,0xfa,0x79,0x21,0x79, + 0xaf,0x50,0xa8,0x32,0xeb,0x4a,0x86,0xbe,0x78,0xd5,0x4e,0x7d,0xb8,0x67,0x10,0x44, + 0x31,0x11,0xc1,0x2c,0x11,0x99,0x36,0x47,0x56,0xe4,0x9e,0x57,0xcd,0x21,0xe1,0xf3, + 0x5f,0xef,0x21,0xc4,0x53,0x1e,0xe5,0x18,0xef,0x97,0xff,0x7b,0x4,0x95,0x49,0x60, + 0x7e,0x57,0x17,0x64,0x88,0x2d,0x4d,0x87,0x34,0x85,0xc4,0x6,0x9c,0x89,0x20,0x23, + 0x86,0x91,0x74,0xc3,0x74,0xd8,0xb4,0x2c,0xfc,0xd,0xee,0xf2,0x9e,0xea,0x2c,0x25, + 0x3e,0x81,0xbb,0x66,0xa6,0x12,0x79,0xda,0x94,0xb4,0x11,0x4c,0x5,0x1a,0x13,0x3b, + 0x5f,0x0,0xc3,0xbb,0xa6,0xba,0xdf,0xdb,0x58,0x95,0x71,0x18,0x8a,0x26,0x95,0x76, + 0x2a,0xa6,0x42,0xa9,0x9b,0x10,0x8,0x63,0xf5,0xd1,0xdd,0x3c,0x17,0xf6,0xa1,0xa9, + 0x90,0x2,0x5d,0x70,0xeb,0x34,0x2d,0xc0,0x18,0x74,0x91,0xa6,0x90,0x1a,0xc8,0x4e, + 0x63,0x13,0x63,0xfa,0x36,0xd0,0x4e,0x5c,0xbd,0xa0,0x81,0x61,0x61,0xc5,0x77,0x26, + 0x4a,0x41,0x81,0xe4,0x1c,0x74,0xbe,0xbf,0x88,0xe0,0x40,0x17,0xf8,0x8b,0xff,0x9c, + 0xe0,0xb1,0xb0,0x69,0x9d,0xe4,0xae,0xf,0xd5,0x9c,0xb2,0xe8,0x4,0x2f,0x2f,0x0, + 0x48,0x39,0xd4,0xfc,0x64,0x73,0x16,0x7b,0xe,0xe6,0x0,0xb3,0x7d,0x90,0x84,0x97, + 0x1a,0x89,0x45,0x31,0xc5,0xef,0x68,0xd3,0x23,0x30,0x84,0x89,0xdd,0x21,0x2b,0xaa, + 0xad,0xc3,0x35,0xb4,0xa4,0x88,0xe1,0x31,0x6d,0x8c,0x71,0x4d,0xb1,0x29,0x1e,0xcc, + 0xd2,0xa7,0xce,0xc0,0x26,0x22,0xe8,0x7d,0x6,0xc2,0x8b,0xd9,0x82,0x69,0xe7,0xde, + 0xe7,0x8a,0x62,0xe8,0x6c,0x68,0xa5,0x31,0x83,0xbc,0x3c,0x6f,0x6a,0x5a,0x1c,0x66, + 0x6f,0x87,0xd4,0x49,0xd2,0x78,0x74,0x7a,0xee,0x5c,0x94,0x39,0x1b,0xee,0x61,0x39, + 0x9e,0xd,0x59,0xc,0xaf,0x67,0x6a,0x8d,0x3a,0x9,0xd5,0x80,0x33,0xac,0xf4,0x8d, + 0x2e,0x9a,0x6d,0xcf,0xf3,0x23,0xee,0x70,0x2f,0x3a,0xe4,0x0,0xc6,0xab,0xb7,0x8f, + 0xc6,0x32,0x40,0xdc,0xbe,0x66,0xc9,0x50,0x23,0x95,0x4e,0xbd,0x42,0x72,0xc2,0x63, + 0x1,0xac,0x99,0x1a,0xa3,0xd7,0x8c,0x93,0x2,0x7a,0x81,0xb0,0x56,0xb1,0xe5,0xc0, + 0xd9,0x64,0x29,0xe6,0x2e,0x7c,0x51,0x67,0xb0,0xd3,0x76,0x36,0xf6,0xcd,0x73,0xd4, + 0xb3,0xd0,0x8e,0xd2,0xd6,0x22,0x67,0x15,0x9,0xa3,0x0,0x4a,0xc2,0x4a,0xf9,0x58, + 0xf5,0xd7,0xc5,0x7f,0x4,0x69,0xb3,0xbb,0x28,0x40,0x12,0x59,0x4c,0xc3,0x71,0x4a, + 0xb9,0x1,0xcf,0xf0,0xa9,0xe6,0x7d,0x1d,0xb,0x5a,0xeb,0x6a,0x74,0x30,0x91,0x95, + 0xd4,0x9d,0x8,0xf,0xa4,0x7,0xe0,0x28,0xc9,0x1a,0x45,0xb9,0x3d,0x22,0x94,0x8, + 0x98,0x4f,0xec,0xfe,0xce,0xf1,0x81,0x75,0xcb,0xcf,0x76,0x13,0x91,0xef,0x33,0x4c, + 0xff,0x5,0x67,0x7c,0xf9,0x88,0x18,0x24,0x90,0xf2,0x30,0xe6,0xc9,0x7f,0x86,0xe4, + 0xb4,0x2d,0xcd,0x28,0xb1,0x42,0xa5,0x50,0x4a,0x69,0x93,0xf8,0x24,0x2,0xd2,0xe6, + 0x52,0x4,0x4d,0x4b,0xfc,0xa4,0x43,0xf0,0x98,0x62,0x8a,0xb6,0x55,0x7f,0xfe,0x61, + 0xd2,0x54,0xea,0x12,0xa2,0x8,0x10,0xc3,0xd9,0x62,0x11,0x72,0xa8,0xab,0xd9,0xe6, + 0xcf,0xac,0x21,0xab,0x7c,0x7,0x67,0x94,0x35,0x6b,0xea,0xce,0x2c,0x9f,0xaa,0xab, + 0x26,0xab,0x1e,0x1f,0x1,0x41,0x13,0x14,0xe1,0x98,0xb2,0x2c,0x8a,0x51,0x14,0xc4, + 0x2c,0xb9,0xa4,0x5d,0x39,0xca,0x3e,0x7,0x54,0x76,0x61,0xde,0xa4,0xfb,0x6c,0xd3, + 0x84,0xb1,0xb1,0x8b,0x45,0xd8,0xd4,0x90,0x47,0xba,0xe1,0x8f,0x12,0xc8,0x81,0xb1, + 0x36,0xdb,0x6c,0x8e,0x62,0x34,0x3,0xc4,0xfe,0xdc,0x9f,0x66,0xe5,0x51,0xbc,0xdb, + 0xa0,0x85,0x2,0xed,0x96,0xc2,0xcf,0xf9,0x83,0xbc,0x13,0x97,0xa,0xe,0xf4,0x40, + 0xd,0xf6,0xe7,0xc7,0xcf,0x2f,0xdd,0x8e,0x3a,0x9b,0xb8,0xe4,0x10,0x31,0x89,0x38, + 0x5b,0x18,0x34,0x6b,0xd7,0xb4,0x4c,0x6,0x35,0x6,0x15,0x56,0xb8,0x35,0x67,0xad, + 0x85,0x75,0xcf,0x66,0xfc,0x83,0x41,0x6a,0x9e,0x6b,0x42,0xc1,0x52,0x52,0x98,0xce, + 0x4d,0x80,0x49,0xff,0x13,0x51,0x26,0xe1,0x62,0x7d,0x12,0xc8,0x11,0x44,0x1d,0xc6, + 0xd7,0x69,0xc4,0x8d,0x50,0xe9,0xe0,0x8d,0x5a,0xf3,0x7b,0x3b,0xb2,0x0,0x94,0xd5, + 0x79,0x29,0x25,0x96,0x3d,0xe7,0x81,0x26,0x4d,0xe,0x18,0xfe,0x94,0x62,0xba,0xe1, + 0xd1,0xb7,0x6a,0x53,0xfb,0xa1,0xdb,0x6d,0x3c,0xf5,0xb1,0x95,0xb4,0x2a,0x9a,0x53, + 0x4b,0xa6,0x91,0x67,0xde,0x42,0x36,0x7c,0xa7,0x1c,0x7b,0x47,0x94,0x66,0x1a,0x25, + 0x3c,0x89,0x72,0xe8,0xfe,0xd8,0x87,0xdd,0x8d,0x79,0xdf,0x4b,0x27,0x3e,0x3c,0xeb, + 0x8d,0x79,0x87,0x30,0xc0,0x4e,0xc4,0xc2,0xc6,0x8e,0x2f,0xc2,0x6a,0xd2,0xb5,0x30, + 0xb9,0xc2,0x9a,0x2e,0x2b,0xd,0xb,0x5f,0xb7,0xc3,0x5e,0xd4,0xd1,0xaf,0x6d,0x7e, + 0xee,0x3b,0xb1,0x5,0xf,0xf9,0xd2,0x11,0xee,0x4b,0x7f,0xf6,0x3a,0x77,0x2e,0x3, + 0x51,0x40,0x11,0xb9,0x1a,0xbc,0x7a,0xd1,0x8e,0xd0,0xb,0xf7,0x79,0xd9,0x38,0xef, + 0x1e,0x14,0xfc,0xa3,0x1e,0x7c,0x9f,0xd3,0xc3,0xfd,0xac,0x6e,0xde,0xd5,0xe6,0x4e, + 0xae,0x9,0x11,0x13,0xd7,0x4,0xcd,0x99,0x1e,0xb9,0xdc,0x85,0xd8,0x10,0xb7,0x31, + 0xe7,0x20,0x80,0x67,0xa1,0xa,0x41,0xa3,0xb3,0x92,0x2c,0x52,0x87,0x68,0x8d,0xc0, + 0x4c,0x76,0x81,0x87,0x8f,0xc5,0xc7,0x92,0x2d,0x94,0xed,0xaa,0x29,0xc4,0x39,0x1f, + 0x26,0x34,0x26,0xee,0x5,0x99,0x2,0xa2,0xbd,0x23,0xab,0xf7,0x60,0xfe,0xac,0x8, + 0xdd,0x98,0x44,0x51,0x2a,0x9a,0xcd,0x3b,0xec,0xa9,0x8d,0x71,0x20,0xfa,0x96,0xb8, + 0xf9,0x1f,0xae,0x2e,0x88,0x4b,0x6a,0x18,0x89,0xbd,0x62,0x2b,0x4c,0x58,0xf0,0x4b, + 0xa5,0x9e,0x31,0x2e,0x3c,0x32,0xc,0xe5,0x7a,0xdc,0x33,0x1e,0xdc,0x63,0xf3,0x6c, + 0x95,0x68,0x41,0xed,0xae,0x3d,0x58,0x3a,0xe3,0xd5,0xfa,0x2f,0x52,0x46,0xcf,0x49, + 0x70,0xe1,0x61,0x24,0x33,0xb,0x5e,0x88,0x79,0x2,0x86,0x7c,0x12,0xce,0xcc,0x7f, + 0xd8,0x4,0xb5,0x93,0x24,0xf0,0x9,0x83,0x6e,0x4c,0x3c,0x51,0x41,0x12,0xa1,0xb3, + 0xe8,0x11,0xc3,0x4a,0x82,0x67,0x35,0x1e,0x75,0x44,0xa8,0xda,0xba,0xdb,0x1,0x91, + 0x21,0x70,0xb7,0xdb,0xb8,0xfb,0xd3,0x55,0xf9,0x7,0xd0,0x62,0x76,0x94,0xf4,0x5b, + 0x67,0xdb,0x40,0x2a,0x7b,0xf5,0xc1,0x69,0x10,0x98,0xfc,0xd4,0x41,0xf3,0xc7,0x6b, + 0x3e,0x58,0x6d,0x8f,0xed,0x83,0xa,0x2c,0xa4,0x49,0x88,0x44,0xfa,0x24,0x5d,0x2e, + 0x2c,0x90,0x33,0x54,0x29,0xb1,0x2f,0xcc,0xa3,0xc6,0xf9,0xe6,0x61,0x6b,0x6e,0xfe, + 0x49,0x97,0x31,0xbd,0x68,0x52,0xd0,0x35,0xef,0x26,0x77,0xe3,0xfa,0x23,0x2b,0x94, + 0xd0,0x5f,0x7b,0xad,0x3b,0x4e,0xca,0xa1,0x91,0xe4,0xf0,0x84,0x31,0x79,0xb2,0x6a, + 0xa7,0x25,0x4b,0x90,0x9a,0xe8,0x65,0xfe,0x4c,0x69,0x9d,0xa8,0x66,0xf4,0x16,0x1e, + 0x1f,0x8b,0x6c,0xe4,0x34,0x49,0xda,0x99,0x8b,0x92,0x3d,0x37,0x34,0xb2,0x1,0x15, + 0xec,0xae,0x5,0x88,0xf0,0x0,0xd,0xe2,0xc,0x68,0x90,0x5d,0x12,0x7a,0xe9,0xc7, + 0x1c,0x7,0xa1,0x47,0xd7,0x7a,0x61,0xc0,0xd3,0x8c,0x26,0x35,0xe2,0x95,0xc4,0x64, + 0xf4,0x98,0x67,0x54,0x6d,0x6a,0x39,0xb8,0xb8,0xed,0x24,0x77,0x8a,0x62,0x17,0x5b, + 0x7b,0x39,0xed,0xa1,0x19,0x30,0x19,0xa8,0xf4,0x66,0x90,0x4,0xea,0xd2,0x54,0xfa, + 0x58,0x2e,0x87,0xe3,0xa0,0x63,0xd8,0xd,0xd5,0xfc,0xa4,0xea,0xbb,0x66,0x20,0xf5, + 0x74,0x9,0xc7,0xcd,0x1f,0x81,0xc1,0x8,0x86,0x92,0xbe,0x9b,0x18,0x4e,0x19,0x3b, + 0x6c,0xa7,0xd5,0xa8,0x27,0x5b,0xa6,0xf5,0xa9,0x5b,0x9,0x9b,0x7b,0xd3,0xc2,0x8b, + 0x4d,0x6d,0x27,0xd,0xc1,0xec,0x8,0xef,0xe4,0x8c,0x12,0x4e,0x75,0x85,0x89,0xe3, + 0x6c,0xc8,0xa,0x4b,0x40,0xa,0xb2,0xa7,0x75,0x40,0xee,0xf2,0xd1,0x34,0xe5,0xcb, + 0x56,0x5a,0x80,0xf6,0x89,0x94,0xac,0x27,0x30,0x83,0xd5,0xb0,0xea,0x6a,0x1f,0x6b, + 0x9f,0x6e,0x23,0xf7,0x38,0xd2,0x13,0xe6,0x1d,0x60,0x12,0xaa,0x65,0x73,0xf8,0x54, + 0xb,0x64,0x2a,0x69,0x99,0xe5,0x8e,0x72,0x71,0xc7,0x33,0xa3,0x99,0x2e,0x27,0x39, + 0xad,0xb4,0x5a,0x84,0xf9,0xcf,0x36,0x52,0x11,0x24,0xac,0x6d,0xc9,0xf2,0x26,0x76, + 0xa1,0x1f,0x88,0xa9,0x6e,0x72,0x9e,0x6b,0xe3,0x8e,0xae,0xd0,0x69,0xd1,0x36,0x68, + 0xaf,0x90,0xd8,0xcb,0x6e,0xa9,0xe5,0xeb,0x34,0x34,0xdf,0x64,0x94,0x92,0x25,0x11, + 0xfa,0x3c,0xbd,0xa3,0x8d,0x71,0x2e,0x1a,0x8,0x5a,0x9d,0x54,0x61,0x83,0xd1,0x4f, + 0x61,0x11,0x85,0x3f,0x2a,0x55,0xfb,0xca,0x5c,0x5d,0x58,0x36,0x38,0x42,0xd,0x9c, + 0xb8,0xee,0xc9,0xcf,0xa5,0x71,0xff,0x1d,0xa8,0x21,0x5,0x9d,0x57,0xe9,0xd5,0x7b, + 0x9f,0x69,0xa6,0x7e,0x77,0x69,0x6a,0xa8,0x34,0x15,0x35,0x14,0x62,0xa3,0x39,0xfc, + 0xc0,0xe1,0x29,0xa5,0x25,0x9d,0xe6,0xe6,0x4,0xe9,0x99,0x41,0x47,0xd4,0xc6,0xd9, + 0x1f,0xd5,0xca,0x10,0x36,0xfb,0x22,0xe3,0xa9,0x5d,0x4,0x18,0xa8,0x3f,0xdb,0x45, + 0x8c,0xc1,0x89,0x67,0x84,0xa4,0x92,0x83,0x44,0x37,0x62,0xf4,0x57,0x2c,0x68,0x94, + 0xe8,0x52,0x2b,0x6b,0x90,0x2e,0xf2,0xb4,0x29,0x57,0x17,0xcf,0x92,0xcd,0xc0,0xb7, + 0x22,0xda,0x54,0xa3,0x7e,0x1a,0x14,0x6c,0x8,0x2d,0xbf,0x9c,0xaa,0x47,0x44,0xb3, + 0x3a,0x25,0xd3,0x92,0x75,0x10,0xaa,0x92,0xee,0x25,0x56,0xc4,0x65,0x6a,0xb,0x7a, + 0x49,0xc4,0x61,0x37,0xc7,0x9d,0x76,0x86,0xcc,0x70,0x3d,0x39,0x93,0x26,0xd1,0xd9, + 0x1,0xd4,0x12,0x59,0x13,0x2c,0x80,0x9b,0x10,0x4a,0xde,0xb9,0x6e,0xac,0x40,0x6c, + 0x91,0x47,0xc2,0x6d,0x9,0x55,0x45,0x6b,0x1a,0x7d,0x3,0x83,0xd0,0x13,0xfa,0x9e, + 0xd8,0xc5,0x33,0xaf,0x33,0xd6,0xee,0x54,0x80,0x69,0x52,0xc1,0xcc,0x49,0x4c,0xc, + 0x2,0x9a,0x7b,0xe0,0x25,0xfc,0x9b,0x98,0xf1,0x92,0x6,0x64,0x9a,0xab,0x88,0x66, + 0x33,0x77,0x4d,0xb4,0x3b,0x1f,0x40,0x28,0x75,0xe9,0xcc,0xbe,0xc,0xfd,0x87,0x7d, + 0xb8,0x42,0xb6,0xbf,0x1c,0xa,0x53,0x4a,0xc4,0xe4,0xb0,0x5d,0x58,0x1b,0x5b,0xd2, + 0x27,0x6,0x24,0xd4,0x9b,0xde,0xc7,0xdb,0xca,0xfb,0x54,0x77,0xee,0x98,0x80,0x2f, + 0x72,0xa3,0xe7,0xaa,0xe,0xc9,0x52,0xea,0x79,0xe0,0x16,0x9e,0xe4,0x77,0xfc,0x18, + 0x11,0xc2,0x2d,0xa1,0xfe,0x2,0x29,0x4a,0xec,0x73,0x74,0xc5,0xee,0x74,0x0,0x69, + 0xba,0x2c,0xf2,0x7b,0xd2,0xf6,0x8c,0x14,0x1b,0xe,0x8b,0xee,0x98,0x0,0x16,0x2a, + 0x5a,0xf7,0xee,0x96,0x71,0xa0,0x7a,0x7a,0x87,0xd6,0xc7,0x19,0x4f,0xea,0xcf,0x84, + 0x51,0xa,0x63,0xdf,0xac,0xd2,0xd0,0xf,0x66,0xdc,0x2a,0x44,0x9a,0xb4,0x3e,0x33, + 0xde,0xbb,0x27,0xb1,0xc6,0xcb,0xcf,0x4c,0x7c,0xf3,0xd0,0xb0,0x52,0xba,0x64,0x96, + 0x64,0xec,0x76,0x68,0x35,0x4,0xd0,0x61,0xd3,0x53,0xb3,0xb5,0x99,0xb2,0xdf,0x52, + 0xf9,0x86,0x7a,0xdb,0x2c,0x91,0x34,0x22,0xa3,0x56,0xbb,0x91,0x98,0x4d,0x24,0x27, + 0xa2,0x6d,0x8,0xd8,0x56,0x38,0x9b,0x2c,0xbf,0x5e,0xfa,0xa5,0xd2,0xd7,0x30,0xaa, + 0x3a,0x59,0xdc,0x50,0x6,0x9a,0x64,0x71,0x3b,0x74,0xb9,0x45,0xb9,0x54,0xe3,0x8b, + 0xad,0xb3,0x14,0xdd,0xd4,0x3c,0xb3,0xaa,0x25,0xff,0xfd,0x75,0x37,0x50,0xe,0x8f, + 0xdc,0x81,0x3a,0x40,0x47,0x1d,0xef,0xd3,0x86,0x8f,0x36,0x1d,0xf2,0x48,0x11,0x1, + 0x2d,0x49,0xf1,0x38,0x5b,0x31,0xf1,0xf6,0x38,0x8b,0x37,0xa0,0x18,0x9c,0x85,0x9, + 0xd0,0xe2,0x9a,0x3f,0x50,0xf4,0xfc,0xed,0x43,0xd9,0xf5,0x62,0x97,0x7d,0xf3,0x8a, + 0xd5,0x47,0x57,0xf1,0x82,0xa5,0x71,0x5d,0x1a,0xb5,0x7b,0x12,0x8c,0x92,0x5c,0x6f, + 0x4e,0x9c,0xb9,0xc8,0x52,0x27,0x95,0xce,0x4a,0xbf,0x31,0xab,0x9c,0x1f,0x73,0x61, + 0x19,0xd8,0xaa,0x54,0x57,0x96,0x42,0xe4,0x95,0x7b,0xd1,0xd7,0xf3,0xba,0x19,0x25, + 0x4d,0x40,0xf9,0xeb,0x9e,0xe1,0x5f,0x8,0x3f,0x85,0xfb,0x56,0x35,0x61,0x78,0x93, + 0x4,0x40,0x4b,0xce,0x3a,0x18,0xbc,0x46,0x55,0x88,0xdb,0x3f,0x51,0xb0,0xc0,0xf3, + 0x2e,0xd4,0x48,0x9b,0x9b,0x62,0x29,0xc2,0xe2,0x12,0x17,0x5f,0x65,0x19,0x53,0xdb, + 0xb2,0x72,0x76,0xc1,0x14,0x65,0xef,0xb9,0xaf,0x94,0xb2,0x28,0xce,0x35,0xd7,0xd4, + 0xe5,0x4d,0x1c,0x76,0xf5,0xb0,0xc6,0x65,0xe5,0x45,0xd0,0xb8,0xc9,0xf5,0xc0,0xbb, + 0xf1,0x14,0x8e,0x13,0xef,0x1c,0xa8,0x3,0xa0,0x65,0xfd,0xda,0x11,0xa7,0x69,0x78, + 0x7a,0xd7,0x69,0xfa,0x87,0x40,0x89,0x6b,0x96,0xc4,0x68,0x55,0xdd,0x10,0x48,0x50, + 0x69,0xa0,0xd7,0x90,0xd0,0x40,0x50,0xb2,0x97,0xb7,0x78,0x4e,0x95,0x13,0xfb,0x5c, + 0x76,0x47,0x22,0x39,0xf5,0x4e,0x8a,0xf,0x2e,0x6,0x17,0x22,0x5,0xea,0xd1,0x3b, + 0xc,0x9a,0x60,0xa8,0xce,0x52,0x87,0x73,0xba,0xab,0xe5,0x6c,0x76,0x91,0x1a,0xcd, + 0x15,0x48,0x88,0xd4,0x5d,0x85,0xcc,0x76,0x3b,0x2c,0x97,0x24,0x38,0x3b,0x84,0xa1, + 0x5a,0x1,0xa6,0x1a,0x79,0xa3,0xc4,0x91,0x18,0xbf,0xb5,0x79,0x24,0x57,0x37,0xae, + 0x69,0x8b,0xc7,0xd5,0x7e,0xbe,0x99,0x11,0xa1,0x2c,0x68,0x34,0x59,0x82,0x7,0x9f, + 0xcc,0xf7,0x5d,0xeb,0xa2,0x25,0xa2,0x39,0x85,0x55,0x81,0x10,0xed,0x6e,0xc5,0xb2, + 0xb5,0x5a,0x17,0xc3,0xa0,0x4d,0xd1,0x98,0x84,0xa6,0x23,0x68,0xaa,0x1,0x63,0x91, + 0xa2,0xb9,0x59,0xa7,0x5b,0xbe,0x3e,0x54,0x90,0xbb,0x5,0x2d,0xf7,0x88,0x81,0x15, + 0x1f,0x9f,0xff,0x2e,0x6a,0x4f,0x9d,0x31,0xd0,0x11,0xa8,0x45,0x56,0x8,0x9b,0xb4, + 0x5a,0x27,0xa1,0x29,0x57,0x62,0xbe,0xc3,0xe4,0x28,0xb1,0x6d,0xad,0xc,0x4,0x9e, + 0x81,0x87,0xe6,0x71,0x69,0x91,0xc4,0x26,0x18,0x94,0xc1,0x27,0x6b,0x26,0xc7,0x50, + 0xf6,0x81,0x2e,0x7a,0x5b,0x3f,0x3b,0x91,0xed,0x6a,0xc0,0xbe,0xb3,0x56,0x8a,0x97, + 0x3c,0x27,0x57,0x66,0x3,0xba,0x86,0xc3,0xb5,0x8c,0xc0,0x52,0xc2,0x9b,0xe6,0x4b, + 0xa,0x94,0x83,0x31,0x54,0xee,0xb4,0xff,0xee,0x2d,0x76,0xe9,0x82,0x72,0xb1,0xd3, + 0x56,0x1,0xd9,0x20,0xb4,0xc1,0x22,0x47,0x4a,0x94,0x59,0xb5,0x1c,0x9a,0x3f,0x2, + 0x35,0x85,0x35,0x94,0xb0,0x69,0xc3,0x30,0xab,0x49,0xf9,0xa1,0x69,0x7c,0xe7,0x2d, + 0xb8,0x4e,0xf7,0x83,0xdb,0xb5,0x15,0x15,0x1d,0x12,0x82,0x86,0x21,0xf1,0x1d,0xa, + 0x7c,0xde,0x4,0x84,0xf8,0x40,0xc1,0xb0,0x8e,0x19,0x5f,0xea,0x11,0x8b,0x92,0xba, + 0x6d,0x9f,0x5,0xf4,0xac,0x53,0xd2,0x96,0xac,0x99,0xf4,0x19,0x62,0xd,0xae,0x77, + 0xa5,0x66,0xee,0xa8,0x23,0xbb,0xdc,0x87,0xb5,0x41,0xdf,0x12,0xd9,0xd4,0xac,0x51, + 0x5,0x1f,0x27,0x95,0x26,0xa1,0x1b,0xab,0x6e,0x13,0x3b,0xc0,0x7d,0xb2,0xe0,0xcc, + 0x9c,0x89,0x14,0x25,0x4a,0x8c,0xc9,0x53,0xc3,0xfc,0xbc,0x7c,0x29,0x1,0x2c,0x4a, + 0xbe,0xc7,0x5c,0x40,0xb0,0x52,0x9e,0xbf,0x26,0xd3,0xcb,0x85,0x16,0x20,0xdc,0xf5, + 0xd6,0xe,0x34,0xd,0x9b,0xd6,0xc8,0xd5,0x35,0x60,0x24,0xb3,0x16,0xf9,0xed,0xe4, + 0x5c,0x13,0xce,0x85,0x8d,0x96,0x9f,0x82,0x78,0x28,0xa8,0x5b,0x5c,0x30,0x61,0xba, + 0x88,0xf0,0x98,0xd2,0xbe,0xca,0xfd,0xbf,0x8c,0xfe,0x9d,0x1,0x24,0xf6,0xe8,0x36, + 0x41,0x1e,0xa5,0x8,0x71,0xc6,0xa5,0x88,0x20,0x62,0x97,0xa7,0xdc,0xfe,0x5,0xaa, + 0x2d,0xad,0xae,0x28,0xc5,0xae,0xc7,0xce,0x3c,0xf6,0xae,0x2,0x34,0x6b,0x43,0x7c, + 0x0,0xec,0x23,0x6f,0xcb,0xcf,0x70,0x83,0x1,0xed,0x83,0x73,0xc8,0xce,0x82,0xc6, + 0xd,0x1,0x61,0xbc,0x4a,0x4a,0x67,0x8d,0x27,0xaf,0x50,0xa7,0x91,0x48,0x84,0x25, + 0xfc,0x84,0x2e,0xab,0xc,0xc0,0x8b,0xcf,0x3e,0xe,0x5c,0xa4,0xe7,0x8a,0x7f,0xea, + 0xaa,0x59,0xa7,0x12,0x1,0x4b,0x5e,0x40,0x3a,0x1f,0xa3,0x14,0x38,0xd8,0x98,0x3e, + 0xf6,0x5c,0x33,0x53,0xd4,0x62,0x64,0x46,0x68,0x9d,0x64,0x5,0x93,0x40,0xd1,0x14, + 0x55,0x42,0xe4,0xaa,0xdb,0x66,0x82,0x6a,0x8f,0x89,0xd2,0x80,0x3a,0xbb,0x6c,0x46, + 0x3d,0xbc,0x4a,0x4a,0xde,0x6f,0xec,0x1f,0x65,0x86,0xac,0xcc,0xc9,0x52,0x9b,0x6c, + 0xfa,0xe1,0x43,0x37,0xb5,0xae,0x8b,0xce,0xf,0x52,0x64,0x2d,0x5c,0xb7,0xae,0x1e, + 0x1d,0xa,0xfe,0x39,0x67,0xa5,0x14,0xaf,0x11,0x5c,0x42,0xa1,0xce,0xda,0x20,0x77, + 0x40,0xd2,0x20,0x84,0xb5,0x45,0xcd,0x2c,0x15,0x19,0xf7,0x2d,0x72,0x9c,0xd5,0x2e, + 0xf7,0xa6,0x71,0x34,0xaa,0xc7,0x28,0xf5,0x94,0xa2,0xdc,0x22,0x8a,0xd0,0x21,0x59, + 0x61,0xd3,0x83,0x17,0x95,0x9e,0x78,0xec,0x96,0x36,0xef,0x32,0x3a,0xa5,0xa7,0xc9, + 0x56,0x94,0x72,0x9e,0x84,0x28,0xc9,0xba,0x91,0x96,0x20,0xab,0x67,0x8a,0xc7,0x45, + 0x76,0x96,0x5a,0xcc,0x42,0x72,0xe2,0x68,0xa3,0x59,0x1a,0xb,0x59,0xe7,0x28,0xbf, + 0x51,0xb1,0x6b,0xb1,0xae,0x34,0x45,0x3f,0xc4,0x41,0xcc,0x21,0x35,0x89,0x3b,0xaa, + 0x57,0x6e,0xdb,0x27,0x97,0x95,0xee,0x1c,0x68,0xd2,0xdc,0x87,0x5e,0xb3,0x5c,0x63, + 0xee,0xaf,0x8b,0xb2,0xc6,0xc2,0x2b,0xa0,0x6b,0x51,0x13,0xd7,0x87,0xd,0x5e,0x15, + 0xd0,0x44,0xd8,0x20,0xa8,0x99,0xa6,0xcc,0xf3,0x8,0x20,0x2b,0x1d,0xb3,0x8f,0x84, + 0x5a,0x52,0x3a,0xa9,0x8e,0xf8,0x29,0xfb,0x36,0x2,0xe3,0x18,0x54,0x83,0x8e,0xe, + 0x27,0xc6,0x4f,0xa2,0x95,0x26,0x98,0xb7,0x4,0x3c,0x87,0x3c,0x88,0x9d,0xef,0x3, + 0xbb,0x79,0x4a,0x4e,0x49,0x1c,0x7c,0x9a,0xa9,0xc5,0xad,0x15,0x1d,0x84,0xe6,0xf0, + 0x21,0x65,0xac,0x8c,0x4a,0x2,0xd6,0xa0,0xf9,0x5c,0x1a,0x74,0x4,0xb9,0x57,0x7d, + 0xaa,0xb3,0x19,0x25,0x9,0xe8,0x22,0x80,0x4a,0xd9,0x33,0x73,0xde,0xbc,0x64,0x39, + 0xae,0x95,0xfc,0x66,0xc6,0x2e,0x8b,0x87,0xe0,0x26,0xa9,0xc8,0x5b,0x7,0x73,0x19, + 0x4c,0x29,0xd0,0xec,0xcc,0x70,0x39,0xb4,0x28,0x54,0x77,0xd,0x60,0xe7,0x1c,0x1c, + 0xd1,0x1c,0x29,0x24,0xd6,0x75,0x77,0x1e,0xb9,0xb7,0xd9,0xf6,0x60,0xaa,0xb0,0x9, + 0xfe,0x4,0x7e,0x7,0x10,0xc8,0x7a,0x48,0x12,0x9e,0xa4,0x84,0x43,0xf,0x86,0x91, + 0xb0,0x11,0x25,0x41,0x5b,0x15,0xd4,0xf1,0x68,0x8f,0x62,0x43,0x73,0x26,0xf,0x6, + 0xd1,0x2a,0x25,0xde,0x52,0x7a,0x5,0x92,0x31,0xf,0x7c,0x93,0xc4,0x3f,0x6d,0x43, + 0x56,0x6c,0x4a,0x3d,0x4d,0xe,0xda,0xb1,0x86,0x5a,0x2c,0xa5,0xbc,0x36,0x54,0xe4, + 0x51,0x7d,0x8e,0xea,0xb3,0x2,0x1,0x59,0xa3,0x37,0x92,0x41,0x12,0x3c,0x4b,0x41, + 0x7b,0x50,0x16,0x20,0x11,0x71,0xb8,0xa5,0x49,0x18,0x24,0x61,0x36,0x9,0x8e,0x48, + 0x5c,0xc,0x46,0x36,0x73,0x10,0x94,0xbd,0x65,0xc4,0xe0,0x2f,0x1a,0xa3,0xad,0x15, + 0x26,0xfd,0xba,0x6d,0x5e,0xf1,0x22,0xba,0x48,0x60,0x9c,0x99,0x48,0x47,0x49,0x20, + 0x1b,0x34,0x1a,0xac,0x56,0x7c,0x7d,0xae,0xc,0x70,0x36,0x0,0x19,0xc5,0x98,0xf1, + 0xaa,0xbc,0x6,0xc9,0xa2,0x2a,0x1b,0x58,0xf7,0xc6,0x6c,0xf3,0xd9,0x7d,0xcf,0x6, + 0x23,0x74,0xbd,0x76,0x91,0x1,0xbc,0x52,0x34,0x14,0xf1,0xe2,0x9a,0x10,0x82,0x1, + 0xf2,0xea,0x74,0x2a,0x3f,0x41,0x4e,0x80,0xa9,0xcd,0x4d,0xab,0x5f,0x6d,0xe4,0x92, + 0x1a,0xff,0x8e,0xa1,0x3c,0x61,0x8d,0x75,0xe3,0x95,0x9b,0x5d,0x71,0x8d,0xc1,0x5, + 0x91,0x7,0x51,0xac,0x3c,0x94,0x78,0x3,0x69,0xae,0x50,0x32,0xb1,0x23,0x72,0x25, + 0xf,0x53,0xef,0xc3,0x3,0xa8,0x86,0x4d,0xcd,0x9a,0x30,0x96,0x85,0xd3,0x84,0x48, + 0x21,0xe9,0xbe,0x29,0xb3,0xf2,0x16,0x41,0x19,0x41,0xfe,0x5c,0x3a,0x28,0x7f,0xbc, + 0x73,0x72,0x69,0xde,0x23,0x70,0xc1,0x66,0x63,0x19,0x53,0xdc,0x63,0x31,0x58,0xf3, + 0xe,0xbd,0x45,0x1c,0x6d,0x46,0x83,0x96,0xc,0x6d,0x13,0x44,0xd0,0xad,0x93,0x44, + 0x6f,0x9a,0xa5,0xef,0x4e,0xe7,0x2c,0x89,0x4c,0xaa,0xe9,0x1e,0x11,0xf,0x86,0xb2, + 0xd6,0xa8,0xd5,0x19,0x4,0x7f,0xbb,0x3a,0x6d,0x6d,0x60,0xf5,0x76,0x54,0x84,0xd1, + 0xf,0x58,0xca,0x93,0x66,0xb6,0x35,0xb7,0xbe,0x4c,0xf,0x90,0xe0,0x9d,0x13,0x33, + 0x97,0xc3,0x90,0xb1,0x95,0x1a,0x2b,0x4d,0xba,0x48,0xa6,0x35,0x51,0x61,0xa2,0xa4, + 0xfc,0x45,0x21,0x51,0x70,0xb4,0x3c,0x88,0xe1,0x6b,0x4f,0x6b,0xf,0x81,0x3f,0xab, + 0x1,0x5c,0x5f,0x9e,0x97,0x81,0x53,0x37,0x1b,0x29,0xb1,0x62,0x5e,0x14,0x3b,0x90, + 0xbc,0x91,0x69,0xcd,0x45,0x46,0x96,0xf6,0xa3,0xac,0x44,0x35,0x1b,0xf2,0x1c,0xe7, + 0x9b,0x5e,0xa1,0xf0,0xba,0x59,0xea,0x3b,0xb9,0xf6,0x61,0x82,0xe7,0x64,0x40,0xd, + 0x6e,0xbf,0x26,0xc3,0x43,0x5,0x93,0xf8,0x94,0x88,0xd5,0xc8,0xa1,0x56,0xb7,0xfa, + 0xa2,0xf3,0xfe,0x81,0xe0,0x70,0x50,0x42,0xa9,0xc5,0xc8,0xdb,0xbd,0x50,0x1d,0xe5, + 0x70,0xa2,0xf1,0x80,0xef,0x6d,0xb5,0x14,0xa9,0x84,0x27,0xe5,0x5c,0x86,0xde,0x32, + 0xbf,0xbc,0x67,0x78,0x9b,0x7b,0xfc,0x55,0x80,0x4e,0x3c,0x1,0xe7,0xc1,0xf,0x8b, + 0xc,0x28,0x3c,0x40,0xfc,0xf0,0x11,0xa9,0x52,0xc1,0xb0,0x85,0xd9,0xb1,0xd5,0x54, + 0x4a,0xc,0xb9,0xcc,0x9c,0x3,0x21,0x38,0xa,0x90,0x8,0x12,0x39,0xd,0x2c,0xd, + 0xef,0x53,0x7c,0xb1,0xd0,0xbe,0x9b,0xec,0x15,0x18,0x6a,0x6d,0x3,0xd1,0x81,0x43, + 0xe6,0xd5,0x57,0x17,0x8,0x6b,0x69,0x50,0xe,0x52,0xa8,0x5e,0xce,0x93,0x4f,0x8f, + 0x71,0x4c,0x8c,0x80,0xba,0x1e,0xca,0x2d,0x1e,0x2d,0x15,0x3d,0xb4,0xa6,0x8c,0x3f, + 0x9b,0x6,0x6b,0x3e,0x7c,0x6e,0xb5,0x8e,0xdd,0xe8,0xc3,0x25,0x9,0x44,0xbd,0xed, + 0xa4,0xc3,0x9b,0xa4,0xdf,0x35,0xc4,0x72,0x3e,0x81,0x6d,0x16,0x46,0x94,0x61,0x33, + 0x58,0x11,0xb0,0x33,0xac,0x31,0xfc,0x7f,0x8d,0x38,0x46,0x18,0xb8,0x55,0x92,0xba, + 0x6a,0x52,0x57,0x92,0x61,0xc5,0xde,0x6f,0x84,0xa8,0xd9,0x82,0x4a,0x62,0x95,0x2f, + 0x6e,0xa2,0x70,0x9d,0x43,0xb3,0xf2,0x48,0xe1,0x4a,0x8d,0xc6,0xa0,0x47,0x2d,0xa2, + 0xd0,0x3c,0x15,0xc,0xda,0xe7,0x40,0xee,0xd2,0x3e,0xc4,0xab,0x8c,0xae,0x54,0xde, + 0x29,0xbf,0x9b,0x10,0x4,0x78,0xc7,0x98,0xdf,0x4e,0x76,0xd7,0x94,0x92,0xc9,0x5d, + 0x8d,0xea,0x52,0x58,0xa9,0x50,0x93,0x36,0x9e,0xb8,0x4e,0xd9,0x51,0xe2,0x91,0xbb, + 0x53,0x54,0x3a,0xe3,0x73,0xb5,0x47,0xea,0x65,0xd6,0xb1,0xb8,0x63,0x62,0xd9,0x7d, + 0x27,0xd4,0x5,0x5f,0xba,0x1a,0x97,0xb9,0xc6,0x7,0x2b,0xe,0x69,0xb3,0x96,0x42, + 0x4b,0xfe,0x79,0xf1,0x9f,0x6b,0xdd,0xb5,0x23,0xe4,0x3,0xb9,0xc8,0x54,0x22,0x49, + 0x85,0x60,0xf3,0x50,0x5a,0x73,0xda,0xd0,0x2a,0xa7,0x5f,0xc7,0x51,0x28,0x5b,0x7c, + 0xb0,0x33,0x18,0x39,0x10,0x93,0xf,0x46,0x4b,0x96,0x28,0x97,0x42,0xe,0xa4,0x9, + 0x40,0x8a,0x45,0x76,0xfa,0x47,0xe4,0xd5,0xa0,0x68,0x32,0x8,0x37,0x2e,0x30,0xe, + 0xc4,0xbd,0x4,0x81,0x83,0x52,0xe5,0xc7,0x1,0x51,0xf4,0x65,0x2b,0x82,0xae,0xbe, + 0xb,0x1f,0xb9,0x37,0x1e,0x35,0xad,0x59,0xb4,0x8e,0xe9,0xa6,0x31,0x7a,0x14,0x3, + 0x94,0x38,0xe2,0xf,0xf7,0x3c,0xb9,0xc3,0xac,0xc1,0x12,0xe1,0xdc,0x1d,0x6b,0x8a, + 0xf4,0x64,0x9c,0x5c,0x3a,0x91,0x23,0xac,0x8d,0x9f,0x9a,0x58,0x75,0xa6,0xb5,0x48, + 0xf3,0x54,0x20,0x6c,0xb5,0x27,0xe3,0xb8,0x19,0x5b,0xe,0xdb,0x2f,0xdb,0x61,0x13, + 0xcf,0x8a,0x30,0xb,0xdb,0x7d,0xb9,0x11,0x48,0x6a,0x5f,0xbb,0xe7,0x9d,0xa6,0xae, + 0xcd,0xbe,0x56,0x57,0xf5,0x33,0xef,0x60,0x10,0x30,0x1d,0x92,0xa2,0x1,0x2c,0xb7, + 0xb9,0x5c,0xc2,0x29,0xe4,0x5d,0x3f,0xf3,0x4,0xfc,0xbc,0xe4,0xb8,0x45,0x8d,0x97, + 0x4c,0x96,0x29,0x13,0x89,0x28,0x59,0x35,0x3c,0x26,0x5,0x9e,0x87,0xe,0xeb,0xa2, + 0x50,0x6c,0x8f,0x49,0x64,0x48,0xc8,0xb3,0x79,0x4f,0xf7,0x12,0xf0,0x90,0xd7,0x3d, + 0xa9,0xdd,0x9e,0x48,0xab,0x74,0xd8,0x63,0x65,0xd1,0x53,0xa4,0x67,0x5a,0xcd,0x18, + 0xd7,0xd5,0xf5,0xff,0xf1,0x22,0x78,0xc7,0x13,0x91,0xe5,0x4c,0x47,0x1b,0xc5,0x59, + 0xe4,0x1e,0x4f,0xcf,0xd6,0x40,0xf1,0x7a,0x2c,0x82,0x47,0xa4,0xb2,0xbe,0x43,0x88, + 0x32,0x6f,0xa9,0x66,0xcc,0xc8,0x2f,0xea,0x60,0xe,0x45,0xd1,0x7a,0xa1,0xf2,0x94, + 0x52,0x65,0xa9,0xc6,0xd4,0x30,0xb0,0xf6,0x87,0x2a,0xa9,0x45,0x1b,0x92,0xe8,0x76, + 0xa2,0x93,0x5c,0x79,0x92,0xad,0xb4,0x9b,0xe7,0x51,0x79,0x36,0x5a,0x51,0x6,0xb1, + 0x62,0x3b,0x5b,0x4f,0x45,0x78,0x2f,0xa7,0x61,0xaf,0x9b,0xf,0x51,0x9f,0xea,0x92, + 0x9d,0x8,0x1a,0xc2,0xea,0x84,0x22,0xc6,0x95,0x98,0x78,0xb8,0xb2,0x6e,0xe8,0xc2, + 0x2d,0xc9,0x69,0xf6,0x30,0xf3,0xd7,0x66,0xff,0xa3,0x75,0x83,0xb,0x12,0x45,0x15, + 0xa4,0x48,0xf7,0x0,0x21,0x9d,0x48,0x61,0xd3,0xba,0x20,0x24,0x4c,0x88,0xe7,0xde, + 0x3e,0xbd,0x32,0x32,0x8d,0xf5,0x65,0x10,0x43,0x9a,0xc3,0x3f,0xd5,0x83,0xb4,0xe0, + 0x11,0xc6,0x61,0x34,0x30,0x0,0x9c,0xee,0xa3,0x50,0x26,0xb5,0xbc,0x46,0xf4,0x2e, + 0x1,0x2,0x12,0xd,0x83,0x0,0x65,0x36,0xe1,0xf0,0xf1,0x9c,0x3a,0xd2,0x7a,0xc6, + 0xda,0xb9,0x84,0x61,0x4c,0xa7,0x31,0x79,0x11,0x16,0xd6,0xb9,0x91,0xd0,0x54,0x2e, + 0xef,0x64,0x7f,0xd6,0xf2,0x65,0x64,0xbb,0x23,0x19,0xa4,0xb7,0xfc,0xea,0x44,0xfa, + 0x13,0xd9,0x78,0xfe,0xc8,0x9b,0xac,0xba,0x14,0x94,0xe2,0xe9,0x33,0xb6,0x9d,0x6e, + 0x72,0x8,0xd5,0x45,0x4,0xa7,0x8b,0xb4,0xd,0xe9,0x7,0x97,0xd,0x1c,0xd4,0xfc, + 0x37,0x2d,0xf3,0xb6,0x3a,0xf6,0xd5,0x25,0xfc,0x25,0x61,0x3d,0x5a,0x20,0xa3,0x94, + 0x98,0x90,0xe2,0xb8,0xd3,0x26,0x91,0x6f,0x2b,0x33,0xd4,0x99,0xa0,0x5d,0x84,0x42, + 0x74,0x21,0x85,0xed,0x84,0x1b,0x7f,0x19,0x14,0x6c,0x2f,0x4a,0x62,0xa7,0xfc,0xfd, + 0xa2,0x4c,0x4b,0x20,0xc4,0x47,0x21,0x83,0x1e,0x94,0xd6,0x2f,0xf9,0xc3,0x5e,0x6c, + 0xcf,0xa0,0x99,0x11,0x8,0x96,0xb1,0xd8,0xa3,0xfd,0x20,0x54,0x2d,0x0,0xa2,0x3c, + 0xbd,0xa2,0xae,0xaa,0x16,0x27,0x2c,0x58,0x5a,0xc4,0x15,0x65,0x18,0x9b,0xd5,0xc0, + 0x4e,0x8d,0xb0,0x58,0xec,0x68,0xc6,0xcb,0xb8,0x51,0x43,0x43,0x41,0x73,0x46,0xd, + 0xd5,0x1c,0xaf,0x9f,0x93,0x68,0x58,0xe3,0x92,0x9a,0xdb,0x1d,0xcf,0xd0,0x71,0x1b, + 0x62,0x54,0x31,0xe,0x8a,0x9f,0x9d,0x39,0xe1,0x4c,0x53,0x15,0x6a,0xd3,0x1a,0xd0, + 0x8c,0xe,0xfc,0xdc,0xce,0x73,0xad,0x53,0x21,0x41,0xba,0x2a,0x36,0xc3,0x4d,0x16, + 0x41,0x13,0xca,0x20,0xf4,0xd4,0x24,0x2c,0x97,0x10,0xef,0xc3,0x4b,0xc8,0x8b,0xd0, + 0x5a,0x47,0xa4,0xd6,0x20,0xf1,0x75,0x48,0xa4,0x6c,0x42,0xb7,0xd6,0x12,0x61,0x55, + 0x63,0xa5,0x74,0x4c,0xb6,0xf2,0xb,0x19,0x2b,0x32,0x1e,0xa6,0xb4,0xa2,0x18,0x8f, + 0x4b,0x42,0x93,0x5a,0x70,0x16,0x3f,0x4d,0xe8,0x76,0x5f,0x55,0xac,0x2b,0x3e,0x40, + 0x53,0xd7,0x44,0x7b,0x57,0xbe,0x1c,0x81,0x22,0x6b,0x5a,0x80,0x45,0x42,0xb0,0x21, + 0x2f,0x3b,0x62,0x5d,0x1e,0xd1,0x92,0x74,0xb0,0x5,0xd1,0x8,0x2b,0xb2,0xb3,0x6d, + 0xa8,0xc2,0x29,0xee,0x52,0x73,0x22,0x64,0x29,0xd8,0xf9,0x82,0xa5,0x6d,0x93,0xa, + 0xf,0x2a,0x8,0x6b,0x1c,0xc1,0x97,0x6e,0x83,0x89,0xb2,0x1c,0x21,0x6d,0xca,0x27, + 0x35,0x2b,0xfa,0x5d,0xc,0x4f,0x91,0xac,0xce,0xbf,0xa0,0x91,0x54,0xa3,0xdc,0xcd, + 0xd0,0x9f,0xf0,0x4a,0x82,0x84,0x5e,0x1a,0x47,0xe9,0xdc,0xe0,0x98,0x1e,0xa7,0x13, + 0xcb,0x88,0x8a,0xd0,0x9,0xf6,0x8a,0x6f,0xd,0x25,0x78,0x2b,0x26,0x44,0xb3,0x61, + 0x73,0xda,0xf4,0xb4,0x38,0xc6,0xca,0x52,0x7b,0xa8,0xa3,0xc0,0x5,0x94,0x32,0xf, + 0x3f,0x78,0x74,0xd0,0x99,0x11,0xe1,0xe5,0x38,0x1,0x95,0x1a,0x1c,0x69,0xc9,0x7a, + 0x96,0x81,0xd2,0x8c,0x89,0x27,0x22,0x1c,0xcc,0x36,0xb4,0x1a,0x45,0xe9,0x58,0x2f, + 0x3a,0x36,0x38,0x9b,0xcc,0x4a,0xa4,0x32,0x89,0x38,0x5,0x75,0xc5,0xa8,0x21,0x83, + 0xa9,0x9c,0x7f,0x96,0xa6,0xb7,0x50,0xcc,0x43,0xb6,0x2f,0xe8,0xc5,0x61,0xe1,0xf1, + 0xac,0xe9,0x6b,0x49,0xd3,0x72,0x50,0xe0,0xc5,0xa1,0x1c,0x54,0xce,0x2c,0xfb,0xe5, + 0x74,0x7d,0xe9,0xa,0x7f,0x96,0x95,0xf,0xbd,0x6,0xaf,0xa7,0xf0,0x76,0xf5,0xce, + 0x62,0x8b,0x88,0xc6,0x79,0x8b,0xd5,0xde,0x16,0xc9,0x3a,0xac,0x79,0x23,0x5f,0xea, + 0x94,0x81,0x76,0xf6,0xab,0xf3,0xd6,0xb6,0x2a,0xd7,0xb5,0x8a,0x5b,0x24,0x9b,0x65, + 0x17,0x9d,0x0,0xa,0xcc,0x20,0xbe,0x94,0xd8,0xdd,0xb9,0xd7,0x75,0x39,0xb,0x40, + 0x97,0x5,0x95,0xbf,0x8b,0x27,0xa0,0x6f,0xe4,0xe8,0xa0,0x8a,0x84,0x72,0xa1,0x31, + 0xe3,0x44,0x67,0xe7,0x2c,0x65,0x94,0x9d,0xb1,0x67,0x71,0xf8,0x70,0x14,0x24,0xd9, + 0x2d,0x7b,0x2a,0xb7,0x94,0x34,0x78,0x92,0xb4,0x76,0xf5,0x67,0x98,0x88,0x76,0xb4, + 0x66,0x89,0xf5,0xde,0xea,0x1b,0x5,0x4f,0x74,0x9c,0x3c,0x86,0xd8,0xc1,0x26,0x20, + 0x4e,0x4c,0x2f,0x34,0xf,0xf2,0xb7,0xa5,0xa5,0x6,0xfd,0x61,0xa5,0x54,0x43,0xe, + 0x4e,0xb0,0x9f,0xa5,0x92,0xaf,0x56,0x8b,0xb7,0xc9,0xf2,0xeb,0x35,0x73,0x70,0x41, + 0x2c,0xdf,0xfa,0x33,0xb4,0x5b,0xa7,0x73,0x3d,0x6f,0x2c,0xca,0x16,0x8b,0xee,0x28, + 0xe2,0x92,0xe,0x72,0x25,0xda,0x69,0xac,0xba,0xed,0x57,0x5d,0x79,0xcb,0xb8,0x68, + 0x5a,0x36,0xf2,0x9a,0x78,0x37,0x83,0xe1,0xeb,0x53,0xda,0xd3,0x22,0x98,0x33,0xf6, + 0x75,0xb5,0xc8,0x82,0xdd,0x48,0xea,0xdb,0xb2,0xe7,0xc4,0xa0,0x3c,0xa,0x4e,0xa5, + 0x29,0x6,0xd,0x1a,0xcd,0xaa,0x7,0x54,0xe3,0x2d,0x69,0x1,0x48,0xb7,0xe0,0x90, + 0x3c,0xa5,0xea,0x55,0xb,0x3f,0x80,0x27,0x46,0x45,0x79,0xb6,0x21,0xd6,0xac,0x8b, + 0x45,0x48,0xe2,0xb2,0xa7,0x5f,0xdb,0xef,0xee,0xc8,0xf9,0xef,0xbe,0x2e,0x93,0x20, + 0x91,0xdb,0xb9,0x69,0xd4,0x94,0x9e,0xf7,0xf0,0x64,0x80,0x6b,0x1,0xa8,0xe3,0x1d, + 0x3a,0x1,0x7f,0x18,0xdd,0x5b,0xb0,0x23,0x8,0xe1,0xa7,0x86,0xc8,0x6c,0xf9,0x5d, + 0x62,0x58,0xe1,0xb8,0xb0,0x28,0x76,0xce,0x78,0x12,0xc4,0xbf,0xdb,0x38,0x96,0x35, + 0xa8,0x9f,0x7e,0xc,0x6b,0xc4,0x32,0x13,0x17,0x8e,0x6c,0x4,0xfe,0x1c,0x7a,0xe2, + 0x65,0x59,0x4b,0xc6,0x8f,0x7a,0x2e,0x74,0x52,0x7,0x6a,0x79,0xe0,0x42,0xda,0x6e, + 0x46,0x3b,0x4f,0x60,0x50,0xfd,0x29,0x5a,0xf0,0x4e,0xb,0x2d,0x96,0xc4,0x88,0x7d, + 0x4,0xa7,0xa6,0x41,0x67,0x43,0x5e,0x93,0x21,0x7d,0xdf,0x49,0xe,0xab,0x42,0x49, + 0x51,0xa1,0x59,0xea,0x9e,0x7b,0xd2,0x38,0xa3,0xcb,0xd3,0xf5,0x92,0x30,0xb0,0xd8, + 0xa3,0xb3,0x85,0x3b,0x4d,0xa7,0xa8,0xd4,0x2b,0x4d,0x5a,0xe8,0xcf,0x4c,0x4b,0xc6, + 0x8a,0x6f,0x39,0x44,0xdb,0x7a,0x49,0x35,0xe1,0x5d,0x75,0x69,0x33,0x6b,0x72,0x4c, + 0xcb,0x6c,0x6c,0x9a,0x8,0xaf,0x7,0xc1,0xe7,0xfd,0x5f,0x79,0x74,0x6c,0x4,0x68, + 0x43,0x56,0x90,0x72,0x95,0x5a,0xa,0xaa,0x7a,0x85,0xb5,0xe8,0x4e,0x30,0x6a,0x24, + 0xf7,0x5f,0x52,0xb5,0xaa,0x12,0x29,0xbf,0x40,0x8b,0xf1,0x40,0xc1,0x1f,0x32,0x58, + 0xd7,0x8a,0xd2,0xf1,0xf9,0xf9,0xd5,0x32,0xe9,0x67,0xcb,0xcb,0x9b,0xfe,0x7e,0x1a, + 0x9f,0x42,0x56,0x84,0x31,0x8d,0xf2,0x62,0x86,0x19,0x7,0x4b,0xcc,0x43,0xa7,0xc3, + 0xaa,0x69,0xda,0x5f,0x4e,0x48,0x78,0xe4,0xec,0x6,0x21,0x6d,0xf5,0xd9,0xae,0x36, + 0xa9,0x74,0x29,0x66,0x87,0x42,0xe4,0xbc,0xd4,0x15,0x4c,0xe3,0x61,0x16,0x3d,0x53, + 0xe1,0xaf,0x42,0x7a,0x89,0xd2,0x8e,0xb2,0x31,0x12,0x10,0x1c,0x11,0xeb,0xe5,0x9e, + 0x51,0x6,0x2,0x29,0x2b,0xba,0x3c,0xc3,0xae,0x1d,0x4e,0xc7,0x28,0x47,0xe8,0xf2, + 0x28,0x51,0xe,0x80,0xfd,0x6,0x14,0x95,0xbe,0x7,0xbb,0x2c,0xde,0x38,0x37,0x21, + 0xc7,0x5a,0x72,0x33,0x24,0x8e,0x7c,0xe9,0xfc,0xdc,0xd5,0x5,0xd,0xd,0x86,0xb6, + 0x34,0x8f,0xa8,0x5e,0xe0,0xe5,0x70,0x63,0x2f,0x8a,0x66,0x91,0xd8,0xe4,0x9f,0xab, + 0x48,0xc1,0xaa,0xd1,0xa8,0xad,0xfb,0x8,0x0,0x9b,0x85,0xb8,0xd2,0x51,0x2f,0x7b, + 0x38,0x5,0xf9,0xc2,0x9c,0x80,0x92,0xf9,0xb5,0x2a,0x9,0x2e,0xfd,0xc2,0xb,0xc, + 0xac,0x48,0x9,0x4b,0xca,0x5b,0x4b,0xcd,0x5,0x2f,0x74,0x59,0xaf,0x2e,0xcd,0x52, + 0x12,0x78,0x4a,0xed,0xbe,0xf2,0x99,0xa0,0x90,0x92,0xb7,0x2d,0xc9,0x64,0x22,0xb2, + 0x8c,0xf5,0x59,0xa0,0x58,0x8a,0xab,0xb8,0xd4,0x47,0xa5,0x3,0xd0,0x36,0xc3,0x61, + 0x29,0x8,0x73,0x80,0x10,0xa9,0xe,0x46,0xc6,0x24,0x60,0x13,0xd7,0x26,0x11,0xe3, + 0xd9,0x72,0x41,0xe2,0xf5,0x29,0x45,0xc7,0xce,0xa4,0x3a,0x7f,0x7e,0xe3,0xbf,0x85, + 0x30,0x5a,0x68,0x5c,0x60,0xf4,0x33,0xf4,0x88,0xd2,0xb9,0x7f,0xf4,0xd0,0x1a,0x49, + 0xca,0x70,0xc5,0xaa,0xef,0x26,0x8b,0xb2,0x6e,0x6a,0x38,0x3,0xf2,0xdd,0xd8,0xb7, + 0xaa,0x68,0x9e,0x83,0x53,0x86,0x4e,0xaa,0x49,0x60,0x4d,0x6a,0x21,0xb,0xd3,0x10, + 0xad,0xa2,0xce,0xe0,0x59,0xc3,0x61,0x60,0x3e,0x43,0x89,0xff,0x7e,0xda,0x8b,0x4b, + 0x1a,0x33,0x61,0x29,0xb,0x5b,0xe8,0x9d,0xe8,0xf9,0xe0,0x15,0x13,0x4f,0x72,0x7b, + 0x79,0x36,0x91,0x27,0xeb,0xae,0x55,0xf2,0xe7,0x6f,0x40,0xc,0xa3,0x21,0x6e,0x74, + 0x17,0xc0,0xac,0xb9,0xb9,0x4b,0x3a,0x44,0x6b,0xb2,0x17,0xa9,0x90,0xaa,0xd4,0x56, + 0x66,0xf9,0x84,0x6,0x22,0x3d,0x6d,0xfa,0x1f,0xcd,0x1e,0x49,0x3a,0xe9,0x96,0x60, + 0xb5,0x8d,0x24,0x19,0x4e,0xdd,0xcc,0x1,0xf1,0x3e,0x23,0x87,0xe7,0xfb,0xf9,0x4b, + 0xc5,0xbe,0xc9,0x0,0xa5,0x4a,0xf,0x43,0xb4,0xf0,0xb,0xa3,0x91,0xa1,0x9a,0xfe, + 0x78,0x1a,0xc3,0x25,0xad,0x47,0xf0,0xa0,0x73,0x95,0xce,0x3f,0x98,0x18,0xf9,0x65, + 0x5a,0x9b,0x44,0x51,0x92,0xbc,0xe5,0xbc,0x7d,0xc4,0x22,0x13,0x8f,0x87,0xa5,0x97, + 0xae,0x43,0xf9,0xcf,0xf1,0x8b,0xc3,0x89,0x42,0x64,0xed,0x33,0xd5,0x26,0x29,0xa9, + 0x93,0x21,0x39,0x3f,0xb0,0x5b,0xc0,0x15,0x29,0x94,0x1b,0x94,0xfd,0x95,0xdb,0x77, + 0x54,0xb2,0xf5,0x2b,0x49,0x65,0x4d,0xbd,0xe4,0xa3,0x94,0xa2,0x8a,0x47,0x2a,0x24, + 0xb2,0x4c,0x70,0x13,0xd4,0xc0,0xa0,0x69,0x92,0x9a,0x7,0xe2,0x8a,0x75,0x77,0x48, + 0x5f,0xbf,0x2c,0x3a,0x2b,0x7b,0x39,0xe3,0x3c,0xd0,0xc5,0x26,0x26,0xa4,0x7a,0xe6, + 0x70,0x94,0xa5,0xd8,0x13,0x42,0x22,0x83,0x8c,0x8,0x8a,0x32,0x7,0xc9,0x41,0x1f, + 0xc2,0xfa,0x47,0x37,0x46,0xe8,0x3e,0x96,0xc0,0x9e,0x2e,0x34,0xf3,0xb4,0x59,0xc6, + 0x80,0xc8,0x63,0x40,0x8a,0x75,0xd4,0x54,0x8d,0x23,0xe7,0x3c,0x9b,0xc,0x3a,0xdd, + 0xfe,0x20,0x51,0x54,0x36,0x3e,0x92,0x4d,0x20,0xbf,0xae,0x9a,0x9d,0x13,0x43,0xf7, + 0xe5,0x1e,0x7f,0xa4,0x8d,0x80,0xa6,0xc2,0x4e,0xeb,0x58,0x1e,0x36,0x11,0xd4,0x85, + 0x79,0x11,0x53,0x14,0x59,0x57,0x50,0xda,0x92,0x89,0x0,0xb6,0xc9,0xcb,0xe3,0x22, + 0x7f,0x9e,0x81,0xe8,0xbc,0x29,0xcc,0x28,0x8a,0xc7,0xe5,0xbf,0x9e,0x17,0xbe,0x1c, + 0x64,0x42,0x45,0x1b,0x34,0xb2,0xc9,0x7c,0x20,0x39,0x50,0xb8,0x22,0x83,0xbb,0x61, + 0xb7,0x4c,0x8b,0xf4,0x18,0x65,0xc4,0x8,0xf3,0xf8,0x91,0x2,0x3e,0x24,0x80,0x7c, + 0x12,0x2f,0xe4,0x24,0x9f,0x6a,0x73,0xea,0x99,0x8f,0xe0,0x13,0x9c,0xb1,0xec,0x49, + 0xa2,0xd8,0x44,0xd7,0x75,0x25,0xcb,0x9a,0xaa,0xc0,0xb,0x85,0x21,0xb2,0x8b,0x67, + 0xab,0xf8,0x42,0x9c,0x6,0x5c,0xa,0xf5,0xd4,0xca,0x18,0xf3,0xa8,0x8e,0xdc,0x58, + 0x81,0xec,0x24,0x65,0xd8,0x79,0x61,0x91,0xb5,0x58,0x6a,0x31,0x83,0x91,0x26,0xc8, + 0xa9,0xd4,0xf4,0x2b,0x52,0xaf,0x46,0x9e,0x15,0xb1,0xb1,0x6c,0xc9,0xe1,0x7,0x8b, + 0xae,0x3e,0xf2,0x7c,0x16,0x94,0xb0,0x94,0x4,0x81,0xe0,0x28,0x37,0x2d,0x2c,0xd9, + 0xa2,0x8,0x95,0x1c,0x66,0x13,0x70,0x37,0x95,0xfa,0x94,0xc7,0x64,0x68,0x7d,0x3f, + 0xe,0x3,0xc0,0x43,0x3b,0x12,0x1a,0xe3,0xb2,0x28,0x25,0xd4,0xce,0x6d,0x19,0x62, + 0xd1,0x68,0x3c,0x3f,0xa5,0xc5,0xf2,0xb6,0x88,0x5f,0x6a,0xca,0x8c,0xea,0x46,0xdc, + 0xb0,0xcd,0x44,0xb4,0xe8,0x1e,0x1d,0x63,0x89,0x3c,0x14,0x97,0x65,0xec,0x66,0x67, + 0x19,0xfb,0xb3,0x39,0xdd,0x73,0xd3,0x1c,0x2d,0x99,0x2c,0x56,0xb5,0x97,0x7e,0x5d, + 0xb4,0x7d,0x69,0xa7,0xba,0x2d,0x74,0x20,0x25,0x9d,0x2e,0xa2,0x1a,0xcd,0xf6,0xf1, + 0x2c,0xc0,0x48,0x91,0x2e,0xbc,0xfb,0xcb,0xa0,0x9a,0x5c,0x54,0xd9,0xc1,0xa4,0x95, + 0x92,0x6,0xb6,0xce,0x31,0xb2,0x17,0x45,0x4,0xb8,0xc8,0x87,0x14,0xad,0xa5,0x7e, + 0x39,0x7d,0xed,0x3c,0xc3,0xa5,0xf9,0xfb,0xfc,0x9c,0x92,0x5a,0x56,0x93,0xea,0x58, + 0xb7,0x40,0xc,0x39,0x7f,0x2f,0xc7,0x11,0x71,0x86,0x6f,0x2c,0xe7,0x34,0x2b,0x9a, + 0x53,0x75,0xad,0x21,0x74,0x4,0xb0,0xf1,0xc4,0xc4,0x4e,0x76,0x75,0x94,0xf2,0xf, + 0xb8,0x84,0xa3,0x14,0xa6,0x32,0xef,0x83,0xd1,0xca,0x6a,0x5,0x7c,0xe4,0x49,0xb2, + 0x6f,0x69,0xfd,0xc1,0x27,0xab,0x4a,0x7d,0xb7,0xb0,0x91,0x14,0x88,0xf0,0xe7,0x86, + 0x5b,0xcd,0x4,0x7a,0x8e,0xff,0xe,0x85,0x6d,0x7c,0x6f,0x2a,0x1,0xd6,0x57,0xb3, + 0x38,0x8,0xdf,0xf6,0x5a,0x7c,0xef,0x5a,0xec,0x36,0x69,0x62,0x56,0x34,0x1a,0x33, + 0xa,0x9b,0x3a,0x7a,0xfe,0xfe,0xa1,0xeb,0xa,0x4a,0xd2,0x4e,0xb7,0x94,0x2b,0x61, + 0x61,0x2b,0xcb,0x28,0x8d,0x9d,0x22,0x17,0x20,0x69,0xc7,0x4c,0xbc,0x9,0x2f,0xe0, + 0x43,0x91,0xa1,0xed,0xf3,0x68,0x5f,0xe1,0x47,0xf,0x11,0xaa,0x8,0xf1,0xe9,0x59, + 0xcc,0x21,0x60,0xec,0x3b,0x19,0x5d,0xe6,0xa,0x58,0x19,0x63,0x61,0x79,0xa9,0x3b, + 0x37,0x6b,0x68,0x61,0x59,0x1a,0x9a,0xb1,0xf9,0xde,0x38,0xb3,0x9e,0x78,0xa5,0x4, + 0x96,0x38,0x48,0x9f,0xad,0x1e,0x9d,0x8b,0xc0,0xba,0x8b,0xd8,0xf0,0x9f,0x22,0xa4, + 0xd4,0xdc,0xbd,0x24,0x4c,0x5b,0xe8,0x66,0xa0,0x64,0xdf,0x23,0x7,0x4,0xf1,0xfc, + 0xb5,0xc,0x94,0x7c,0x44,0x0,0xd,0xf6,0x1c,0x7f,0xe6,0x6b,0xd3,0xd1,0xca,0xcb, + 0x62,0x9a,0xea,0x45,0x42,0x3e,0xc0,0xed,0x6a,0x58,0x42,0x64,0x1f,0xbd,0x4d,0xc0, + 0x48,0x0,0xa7,0xfe,0xfe,0xf8,0xed,0x22,0x48,0x32,0x68,0x9e,0x44,0x29,0xfb,0x18, + 0xd6,0xc7,0x13,0x49,0x83,0xb4,0xa5,0x4a,0x93,0x7d,0x36,0xde,0xed,0x2,0x7d,0x1d, + 0xbb,0x23,0x9d,0xc1,0x2a,0x87,0x72,0x40,0x5f,0x54,0xaa,0xf4,0x2,0x98,0xe,0x32, + 0x17,0xb0,0x52,0xf,0x8a,0x3d,0x17,0x57,0x4d,0x93,0x59,0xff,0xba,0x6b,0x4e,0xdb, + 0xe0,0xcb,0x48,0x41,0xaa,0x6a,0x53,0x3d,0x4b,0xda,0xe8,0xf9,0xbf,0xdf,0x49,0x46, + 0x11,0x5d,0x6e,0x70,0x93,0xec,0x25,0xea,0xd5,0xef,0x20,0xf1,0xc2,0xf1,0x85,0xc8, + 0x2,0xb9,0xc4,0x18,0xe5,0x95,0xb9,0x50,0x50,0x89,0xac,0xdc,0xf5,0x64,0x49,0x28, + 0xf,0x98,0x6c,0x7c,0x46,0xd8,0x18,0xa7,0x8b,0x4,0x1f,0x3a,0x7d,0xe4,0x9,0x41, + 0x9,0x7a,0xa7,0xeb,0x8c,0x1b,0x75,0x9f,0x16,0x63,0x5f,0x21,0xce,0xbe,0x63,0xb4, + 0x5a,0xb2,0xa2,0x20,0x95,0xb6,0xb6,0xf2,0xd0,0xec,0x19,0xa7,0x94,0x29,0x4d,0x4f, + 0x7b,0x2d,0x2,0x22,0x58,0x52,0x37,0xbf,0x67,0x49,0x9d,0x6,0x78,0x77,0x6f,0x4, + 0xa8,0x6c,0x1,0x75,0xe3,0x2c,0x5f,0x18,0xa6,0xe8,0xcd,0x2f,0x13,0xaa,0x5f,0x2e, + 0x8d,0xcd,0xa3,0xf3,0xca,0xdb,0x2c,0xce,0x74,0x49,0xff,0x96,0x2a,0x47,0xcd,0x95, + 0xb7,0x57,0xf6,0x94,0x95,0x6b,0x75,0xcf,0x8c,0x84,0xba,0xe2,0x48,0xba,0xb9,0xf0, + 0xc,0xd0,0xbe,0x5f,0xf3,0xa8,0x6f,0xc9,0x56,0xde,0x76,0xa9,0x68,0x1a,0x1,0xab, + 0xa0,0x7c,0x22,0x1e,0x73,0x3c,0x9d,0xe,0x93,0xf3,0x54,0x3a,0x89,0x89,0x4c,0xa6, + 0xb6,0x93,0xc7,0x20,0x50,0x8e,0xe4,0xc5,0xe2,0xd9,0xee,0xf4,0xef,0x68,0x7c,0x76, + 0xe,0xe6,0x70,0xbd,0x57,0xb6,0xf4,0x65,0xe4,0x18,0x65,0x2,0x40,0x57,0x5f,0x78, + 0x14,0x72,0x2d,0x69,0x79,0x56,0x41,0x1f,0xb2,0x87,0x3e,0x62,0xef,0xf3,0x88,0xb1, + 0xfe,0x4c,0x84,0xd6,0x56,0x69,0xf2,0x28,0x6b,0xf0,0xf,0x58,0xf4,0xd5,0x9c,0xe8, + 0x12,0xf1,0xcc,0x8c,0x6f,0x1a,0x7f,0x4f,0xb5,0xa,0x67,0x9a,0x15,0xd9,0xea,0x17, + 0xbf,0x1b,0xad,0x69,0x9d,0x24,0xb9,0x38,0xc7,0xcc,0x2e,0xee,0x39,0x1e,0x7b,0xfe, + 0xbd,0xf4,0xfc,0x23,0x3d,0x81,0xe1,0x3b,0x45,0xee,0x82,0xc5,0xf7,0xb6,0xca,0xb6, + 0x9b,0x96,0x6d,0xad,0x34,0xd5,0xd2,0x8d,0xcb,0xb,0x4b,0xa2,0x88,0x50,0x90,0xba, + 0xad,0x2,0x24,0x6f,0x28,0x51,0x27,0xa2,0xad,0x62,0xc5,0x97,0x9,0x1f,0x72,0x28, + 0x4c,0x84,0x29,0x94,0xb3,0x7,0x59,0x84,0x1a,0x13,0x5b,0x58,0x6,0x82,0x8a,0xac, + 0x45,0xe5,0xf6,0x65,0xbc,0xae,0x45,0x65,0x63,0x6d,0x99,0x79,0x8d,0x5c,0xac,0x27, + 0x37,0x1,0x1b,0x4c,0x13,0xea,0x50,0x37,0xd6,0x80,0xe3,0xdf,0xf,0xf4,0x2b,0x72, + 0x9a,0x56,0xd2,0x10,0x53,0x60,0xbb,0x6c,0x79,0xe1,0x20,0x15,0xd4,0xb4,0xf9,0x31, + 0xd3,0xc,0x9b,0x3,0xcf,0xf3,0xcd,0xce,0xff,0x4d,0x2a,0xf1,0xe1,0x4a,0x9b,0x48, + 0x1f,0x23,0xb5,0x68,0x28,0xb3,0x95,0x55,0x81,0x59,0x1d,0x8c,0xcd,0x8f,0xbe,0x55, + 0x8f,0xb9,0xe4,0x30,0x70,0xcd,0xd3,0xb,0xaa,0x2,0x7b,0xba,0x23,0x52,0x90,0x9f, + 0x91,0x8b,0xb4,0x42,0x54,0x91,0x1a,0xfd,0xa8,0xa8,0xbb,0x84,0x19,0xcb,0xb2,0xe6, + 0x11,0x58,0xca,0x32,0x96,0x55,0xb7,0xf6,0x81,0xc7,0x9c,0x9b,0x7b,0x46,0x6c,0xf0, + 0x86,0xd9,0x45,0x90,0x47,0x39,0xbc,0x77,0x50,0x84,0xc5,0x2d,0x33,0x2,0xf6,0x46, + 0xbd,0xa2,0x74,0xb6,0x54,0x10,0xb7,0xd2,0x6,0x24,0x71,0x92,0x56,0x55,0x29,0x8a, + 0xb7,0xd7,0x7f,0xa6,0xa0,0x2,0xdd,0xed,0x59,0xe1,0x6f,0xa9,0x16,0xcb,0x7d,0x23, + 0x2b,0x56,0xa1,0xc6,0x69,0xd6,0x18,0xf0,0x96,0x58,0xdf,0x50,0x62,0x8c,0xa7,0x28, + 0x83,0x26,0x75,0xf4,0xac,0xb2,0xf,0x3c,0xc2,0xbc,0x71,0xb2,0x5e,0x94,0xf,0x54, + 0xa5,0xec,0xd5,0x83,0xd9,0xe0,0x9c,0x4,0xe5,0x39,0xfe,0x6,0xf8,0x24,0xdb,0x2b, + 0x93,0xd,0x12,0x9e,0x18,0x5d,0x74,0x2f,0x59,0xb7,0x31,0x16,0xc5,0xbe,0x3b,0xd1, + 0xa,0xa9,0xd0,0x35,0x25,0xa,0x6c,0xf,0x4,0x7d,0x36,0x5a,0x57,0xea,0x79,0xb9, + 0xd9,0xdc,0x5e,0x80,0xc4,0x28,0x47,0x3c,0xbd,0x5d,0x73,0xd1,0x5,0xd9,0x26,0x72, + 0xf5,0x75,0xe,0x66,0xd,0x81,0x64,0x36,0x42,0x1a,0x6f,0x11,0x1f,0x82,0x95,0xe9, + 0x95,0xc2,0x57,0xd4,0xcf,0x1b,0x2b,0x8f,0x85,0x98,0xa8,0x69,0x6e,0xeb,0x1f,0x46, + 0x3a,0x73,0x90,0xd2,0xa2,0xfd,0x32,0x45,0xcb,0x37,0x36,0xa8,0xbc,0xdf,0x28,0xe, + 0xcb,0x74,0x89,0x27,0xa3,0x33,0xed,0xcf,0x5d,0x39,0xc1,0xbe,0xef,0xe4,0x99,0xd2, + 0xe8,0x3a,0xa1,0x3c,0x19,0xac,0xc5,0xf,0xfd,0xf7,0xeb,0x7f,0xbd,0x6f,0xae,0xca, + 0x38,0x4d,0xc7,0xd6,0x1d,0x2d,0x55,0xac,0x5d,0x95,0x2,0x91,0x40,0xa,0x37,0x72, + 0x98,0xb4,0x55,0x29,0xa2,0x1b,0xd3,0xd8,0x74,0x94,0x41,0xd2,0x3b,0xc7,0x79,0x21, + 0xeb,0x3,0xa4,0x85,0x4d,0xbd,0x46,0x48,0x63,0x63,0x0,0x9f,0x9f,0xb6,0xd0,0xe8, + 0xb3,0x76,0xa7,0x67,0x5f,0xc9,0x64,0x7,0x24,0x8b,0x6b,0x72,0xb7,0xa0,0x4e,0x3, + 0x8a,0x66,0x68,0x5d,0x89,0x8e,0x7f,0x36,0x48,0x71,0xf4,0x3b,0x3a,0xb6,0x5a,0x7b, + 0x49,0xf9,0xe7,0x69,0x2c,0xb8,0x31,0x2a,0x48,0x56,0x9e,0x14,0xb,0xa1,0x1,0x3e, + 0x40,0x15,0xb6,0xe7,0x11,0x1c,0x77,0x24,0x48,0x49,0x3d,0xcd,0x57,0x95,0x2a,0x89, + 0x72,0xaa,0x55,0x30,0x93,0xc6,0xfe,0x49,0x5c,0x91,0x2f,0x8f,0xba,0xea,0xce,0x5e, + 0xef,0xd2,0xf5,0x72,0x8,0x3,0x77,0x17,0x52,0x7d,0xb,0x42,0x88,0x4c,0xee,0xba, + 0xa5,0xaa,0x5f,0xca,0xfe,0x8b,0x15,0xd7,0xd5,0x37,0xbb,0x5a,0xe9,0x64,0x63,0x2, + 0xc2,0x76,0xa8,0x5e,0x5e,0x3b,0x4d,0xea,0x92,0x5c,0x2c,0x7b,0xbd,0xd4,0xe2,0xb2, + 0xcc,0xaf,0x6d,0xbe,0xa4,0xb0,0x8c,0xa9,0xa5,0x88,0x8c,0x24,0xa9,0xc4,0x85,0xc5, + 0x69,0x99,0x8c,0xc4,0xbc,0x6e,0x66,0x14,0x69,0x8a,0xb2,0xac,0xaa,0xaf,0xbc,0x2f, + 0x6,0xb2,0x3c,0xdc,0x91,0x43,0xe9,0xf0,0x26,0xb9,0x45,0xd4,0x19,0x58,0x4,0x66, + 0x89,0x93,0xdb,0x78,0xb5,0xd4,0x16,0x71,0xa4,0x8b,0xef,0x66,0x41,0xdc,0x79,0x7, + 0x97,0xfe,0xf4,0x96,0x1d,0x8,0x52,0xec,0x3f,0x9b,0xdd,0x3a,0xf6,0x88,0x47,0xc9, + 0x62,0x87,0xac,0x94,0x35,0xb0,0x10,0xa5,0x7e,0x47,0xcb,0xc3,0x63,0xf4,0x78,0x96, + 0x35,0x6f,0x35,0x34,0xb1,0xc5,0x55,0xf6,0x84,0x4a,0xa4,0x4b,0xcd,0x22,0x91,0x50, + 0x58,0x15,0x61,0xa9,0xa2,0x2,0x5,0x1b,0x95,0x95,0x5d,0xec,0xc9,0xce,0x83,0x24, + 0x36,0xdb,0xd0,0xc,0x84,0xad,0x2d,0x41,0xf2,0x3a,0xad,0x71,0xc6,0xc4,0x4f,0x33, + 0xac,0x4b,0x65,0x39,0x20,0xf9,0x19,0xe7,0x89,0x2e,0xd6,0xc2,0xac,0x14,0x15,0xb9, + 0x7c,0xe6,0xfd,0xb3,0x12,0x2b,0xc9,0x44,0x14,0x83,0x4c,0xa8,0xca,0x3f,0x77,0xc3, + 0xd7,0x78,0xf4,0xb7,0xe3,0x38,0x36,0x18,0xf5,0x21,0x24,0x53,0x21,0xdf,0x87,0x54, + 0xdd,0x1f,0xaf,0x44,0x72,0x91,0x68,0x70,0x99,0xa4,0x5f,0x1,0xc2,0x39,0x84,0xb4, + 0xa,0x65,0x46,0x17,0x5,0x5e,0xa4,0x40,0xae,0xca,0x1,0x4b,0x67,0x8a,0x3f,0x12, + 0x98,0x38,0xb8,0x98,0x10,0x36,0xf,0xd7,0xa3,0x0,0x1a,0x2a,0x2a,0x5a,0x96,0x8f, + 0x69,0x8c,0xdc,0xed,0x74,0x84,0xb2,0x7a,0x50,0x13,0x4d,0x19,0x5c,0x64,0x9a,0x64, + 0x5d,0x79,0xc5,0x88,0xb5,0x10,0x73,0x70,0xa3,0x96,0xc2,0xa1,0x54,0xf9,0x7c,0x91, + 0xe5,0xcc,0x6a,0x37,0xdd,0x63,0x63,0x77,0x6c,0x42,0x91,0xfd,0xe3,0xf5,0x5a,0x8c, + 0xc7,0xe2,0xbd,0xd3,0xa7,0x44,0xa4,0x13,0x7f,0x47,0xc3,0x87,0x2e,0x9a,0x97,0x59, + 0xd,0x1b,0x73,0x7e,0x48,0xa,0x6e,0xdf,0x20,0xd1,0x67,0x8a,0x92,0x8d,0x70,0x5a, + 0xe2,0xa9,0x88,0xef,0x69,0x95,0x11,0x82,0xa1,0x1c,0x21,0xdb,0x4b,0xdf,0x1c,0x85, + 0xe6,0x2,0xa3,0x7,0x25,0xda,0x9,0x69,0x1e,0x4c,0x41,0x9d,0xb4,0x6a,0xfd,0x4e, + 0x38,0x8e,0xae,0xf2,0x7b,0xb6,0x2a,0x6e,0xda,0xcc,0xf9,0x58,0x97,0x84,0x33,0xc8, + 0x23,0xaf,0x6c,0x99,0xdb,0xf2,0x16,0x17,0xb,0x60,0x9,0x68,0xd8,0xe0,0x6,0x6e, + 0x8c,0x6d,0xc8,0x6a,0x67,0x86,0x4f,0x36,0xc8,0x90,0x40,0x83,0x3d,0xa5,0xfb,0xc6, + 0x46,0x75,0xf4,0xcb,0x0,0x85,0x45,0xf0,0x88,0x72,0x39,0xdb,0x77,0xd5,0x36,0x46, + 0x50,0x30,0x88,0x88,0xfa,0x74,0x60,0xdf,0x95,0x55,0x14,0xb1,0x92,0xe1,0xbe,0x99, + 0xe2,0xc9,0x9d,0xb6,0x81,0x6a,0xa2,0xc3,0x52,0xb,0xe4,0xb,0x95,0x5e,0xcb,0xfb, + 0xe9,0xad,0xae,0x2b,0x7d,0x7b,0xa8,0x23,0x32,0x9a,0x1a,0x70,0x72,0x56,0x7c,0x1d, + 0x70,0xa6,0x1,0xb2,0x62,0xda,0xf9,0xf7,0xc,0xbe,0xe6,0x62,0xa5,0xbe,0x5f,0x55, + 0x10,0x56,0xa0,0x14,0xbc,0x4a,0xc1,0xc6,0x3f,0xc3,0xd2,0x47,0x68,0x2a,0xec,0xc0, + 0xc,0x3b,0x89,0x1d,0x70,0x47,0x9e,0x39,0x6d,0xed,0xeb,0x53,0xcf,0x46,0xab,0xb8, + 0xac,0x7e,0x4e,0x81,0x10,0x25,0xd1,0x4c,0xca,0x34,0x49,0x53,0x97,0x58,0x38,0xb6, + 0x69,0x82,0x96,0xd3,0x65,0x1a,0xc5,0x70,0x3b,0x60,0x97,0x0,0x0,0x20,0x0,0x49, + 0x44,0x41,0x54,0x57,0x4e,0xdc,0x9e,0x16,0x8f,0x7b,0x71,0x6,0x64,0x30,0x7,0x36, + 0xa8,0x98,0xe5,0xf3,0xe3,0x9f,0xbd,0xd2,0x88,0x48,0xca,0x8e,0x38,0xd9,0x39,0x68, + 0x32,0x61,0x67,0x54,0x9,0x68,0xea,0x8b,0x34,0xd8,0xa2,0x3c,0x63,0x6d,0xd8,0x93, + 0x6f,0x2b,0x5b,0x99,0xd0,0x90,0xbe,0xb4,0xa,0xd1,0x2b,0x5a,0x21,0xac,0xb4,0xb1, + 0xb2,0x25,0x33,0x7b,0xd7,0xea,0x50,0xc8,0x7f,0xbe,0x6a,0x16,0xa0,0x96,0xe7,0x31, + 0xe9,0x5d,0x52,0x71,0x17,0x27,0x93,0x6c,0xaf,0xc1,0x52,0xf,0x1f,0x97,0x72,0x5b, + 0x7,0x20,0x4b,0xa4,0xed,0xd8,0xd,0xf7,0x96,0xef,0x15,0x2e,0xce,0x21,0xeb,0xe8, + 0x1c,0x84,0xe6,0xc6,0xc6,0x5a,0x6d,0x4b,0xdf,0x95,0xb4,0x22,0xf4,0xbc,0x29,0x22, + 0x5c,0x65,0x29,0xb0,0x4b,0x6f,0xbd,0x69,0x50,0x96,0x2d,0x57,0x7,0x81,0xc9,0x0, + 0x42,0x6d,0xe7,0x55,0xa1,0xad,0x28,0xe7,0xe,0xdd,0x5e,0xef,0x96,0x5f,0x7e,0xea, + 0x26,0xbc,0x53,0x2e,0xca,0x1d,0xb4,0xfa,0x33,0x59,0x47,0x38,0xfb,0x2f,0x8d,0xc, + 0xc0,0x43,0x75,0xed,0xa7,0x3,0x91,0x66,0x28,0xe2,0x6a,0x47,0x17,0x5b,0xa1,0xda, + 0x77,0x26,0xe0,0x1,0xf4,0x5f,0xe8,0x65,0xb8,0x8c,0x44,0x7c,0x53,0x76,0xc3,0xf9, + 0x44,0x10,0x1b,0x4,0x72,0xee,0xe0,0xbb,0x92,0x40,0xb8,0x65,0x4c,0x6e,0x16,0x9, + 0x41,0x6a,0x3a,0x3c,0xd6,0x39,0x42,0xea,0xcc,0x34,0x75,0xe9,0x4d,0x16,0x39,0x74, + 0xdd,0xd5,0x4e,0xc7,0xc2,0x18,0x8f,0x17,0xf7,0xc2,0x2f,0x49,0x3,0x2a,0xa8,0xb6, + 0x2a,0x3e,0x23,0x82,0x5f,0x79,0x6,0x2a,0x10,0xbb,0x24,0x21,0xf9,0x87,0xd8,0x48, + 0x3f,0x21,0x1a,0x97,0xfb,0x9a,0x5f,0x99,0xbb,0x2f,0x4f,0xae,0x93,0x6c,0x9,0xa0, + 0x57,0xdc,0x8a,0xde,0xee,0x93,0x1d,0x8f,0x7b,0x4c,0x90,0xa2,0x8a,0x5b,0x5c,0x5a, + 0xd3,0x32,0x66,0x83,0xb0,0x36,0x83,0xa2,0xa3,0xc2,0xde,0x23,0x11,0xb8,0x91,0x89, + 0x40,0x29,0x11,0xa8,0x6c,0xeb,0xd3,0xf3,0x96,0x15,0x7b,0x79,0x54,0xbb,0xee,0x61, + 0x25,0x53,0x3d,0xf6,0x4c,0x2d,0x96,0x35,0x96,0x2e,0xaa,0xa7,0xec,0x9d,0xf,0x7b, + 0x5f,0xfc,0x88,0x49,0x45,0x39,0x53,0x4c,0xc0,0xe4,0xbc,0x32,0xe6,0x9e,0x5,0x2b, + 0xb2,0x23,0x43,0x56,0xd1,0x6b,0x99,0x9e,0x61,0xa1,0x60,0xe4,0xbb,0x13,0x6b,0xd3, + 0x17,0x6b,0x92,0xb6,0x8f,0xf2,0xa6,0xb2,0x9d,0xd6,0x4e,0x87,0xa5,0xf2,0x2a,0x85, + 0x68,0x8c,0x28,0xeb,0xf3,0xaa,0x1d,0xda,0xca,0xa5,0x20,0x81,0xd5,0xbe,0x2,0x9c, + 0xcf,0xbb,0x2e,0x1e,0x19,0xe5,0x79,0xa5,0x4a,0x54,0x48,0x9d,0x55,0xb1,0xa5,0xc1, + 0x75,0xb5,0x69,0x8a,0xe1,0x6e,0xe7,0x27,0xad,0x9a,0x63,0x9e,0xd3,0xde,0xb6,0x90, + 0x19,0xb1,0x4d,0xc2,0xeb,0xfe,0xed,0x85,0xc0,0xae,0x4f,0x37,0x80,0x2,0x79,0x85, + 0xa1,0x12,0xca,0x75,0x80,0xa3,0x77,0x4b,0x81,0x90,0x27,0x82,0x20,0xf3,0xbe,0x69, + 0x24,0x14,0x5,0x98,0xa5,0x41,0x1b,0x81,0xae,0xe2,0x59,0xe2,0x99,0x5,0xc7,0x4d, + 0xdb,0x56,0xd3,0x55,0x2e,0xf0,0x2c,0x6a,0x86,0x20,0x13,0x39,0x29,0xd,0x20,0xbb, + 0xb3,0xe2,0x61,0x48,0xab,0x57,0x73,0x39,0x28,0x96,0x46,0x80,0xf5,0x40,0xaa,0xc2, + 0x39,0xb8,0x89,0x2f,0x90,0x6b,0x41,0x95,0xec,0x91,0x93,0x82,0xd7,0x5d,0x2f,0x79, + 0x6e,0x98,0xc7,0xdf,0x8d,0x4b,0xf8,0x70,0xf2,0x74,0xc5,0xf6,0x29,0xba,0x48,0xe9, + 0xb3,0x22,0x74,0x51,0x7e,0x12,0xa5,0x4a,0x37,0xba,0x2c,0xae,0x26,0xea,0x91,0x26, + 0x5c,0x6d,0xfa,0xe8,0x32,0x14,0x11,0x66,0xf,0x59,0x3b,0x93,0x5a,0xe5,0x48,0xd9, + 0x1f,0xb7,0xf2,0x5d,0xc4,0x5f,0x43,0x97,0x84,0xac,0x32,0x7a,0xc6,0x46,0xa8,0x9, + 0x8d,0xc2,0xa5,0xa4,0xa4,0xa5,0x0,0x9a,0x8d,0xfd,0x56,0xea,0x36,0x90,0x4,0x57, + 0xa9,0xf8,0x90,0x75,0x8f,0x8f,0xd,0x3b,0x4e,0x56,0x10,0xd7,0x82,0x67,0xbd,0x38, + 0x90,0x83,0xbf,0x18,0x81,0x4a,0x9d,0xe,0xed,0x57,0x94,0x7e,0x5e,0x8d,0x3b,0x4d, + 0x52,0x2d,0xfb,0xe8,0x36,0xa,0xd,0x5d,0xaa,0x5f,0x5d,0xb5,0x16,0x2a,0x8b,0x75, + 0x3,0x79,0x41,0x59,0x4e,0x8f,0xf5,0xa,0xd8,0x10,0x35,0x61,0xe3,0x72,0xd0,0xae, + 0x64,0x31,0x4a,0x18,0xb6,0xb6,0x5e,0x46,0xe5,0xc3,0x4f,0xec,0x92,0x79,0x51,0xa1, + 0x8e,0x31,0xb9,0x60,0x48,0x48,0xf3,0x28,0xc2,0xd8,0x10,0xd1,0xa5,0x5e,0xc,0x95, + 0xb,0x1d,0x6f,0x73,0xfc,0xa7,0xe0,0x3f,0xa7,0xb0,0xc,0x71,0xa9,0x48,0xef,0x17, + 0xad,0x3a,0x74,0x9,0x52,0xda,0x3f,0x89,0x90,0xad,0x60,0x92,0x85,0x56,0xc7,0xdd, + 0xd3,0x76,0x78,0x33,0x5c,0x61,0x9f,0x7a,0xb,0x52,0x5f,0x83,0xf6,0x18,0x59,0x3d, + 0xd5,0x59,0xb7,0xc2,0x5a,0x92,0xcf,0x89,0x13,0x4c,0x40,0x98,0xbc,0x33,0x95,0xc4, + 0x9f,0xca,0x71,0xe6,0x94,0xe6,0x87,0xd4,0x41,0x6a,0xc3,0xa6,0x58,0xb3,0xbe,0x53, + 0x1b,0xe4,0xf6,0xb2,0xd1,0xd4,0x74,0xa8,0xa7,0x2d,0x10,0x3d,0x3f,0xd4,0x5a,0xc3, + 0xcf,0x25,0x37,0x18,0x30,0x5f,0x79,0xd5,0x85,0x54,0xd1,0x91,0x4a,0x15,0x88,0x65, + 0x71,0xa6,0x6b,0x71,0xd2,0xfb,0x1e,0x28,0x6a,0x24,0x41,0x9d,0x2c,0xe7,0x18,0x58, + 0xc4,0xb8,0x8e,0xef,0xd3,0x4,0xa3,0xf3,0x8,0x8d,0x9e,0x5b,0x4a,0xdd,0xe3,0x11, + 0xb9,0xbd,0x5f,0xa4,0x8f,0xd4,0xbc,0xfa,0x94,0xf5,0x68,0xec,0x25,0x69,0x30,0x89, + 0x1a,0xb5,0x7c,0x26,0xa4,0xb4,0x77,0xd,0xbd,0x99,0xe,0x92,0xb0,0x73,0xc3,0x1a, + 0x3a,0x6d,0x94,0xeb,0x33,0xa7,0x6b,0x77,0x54,0x84,0x94,0xa0,0xc1,0x4,0xaa,0xbd, + 0x68,0x23,0x52,0x5c,0xf6,0x38,0x58,0x2a,0xed,0x7d,0x1f,0xa2,0xd8,0x45,0x71,0xb6, + 0x43,0x47,0x4,0xc9,0x3a,0xa1,0xc8,0xbe,0xd9,0xae,0x9b,0x3a,0x5c,0xa9,0xf1,0x60, + 0x5b,0x17,0x53,0xaa,0x4a,0xaa,0xda,0x9d,0x1b,0x4f,0x68,0x9,0x86,0xa1,0xb8,0xc2, + 0x6d,0xd7,0x6e,0xc1,0x38,0x22,0x55,0x2d,0x75,0x3e,0xa3,0xe,0x47,0xa0,0xbd,0x57, + 0x82,0xcd,0x24,0x50,0x42,0xb1,0xf4,0xc8,0x22,0x1e,0x4b,0x7c,0xa7,0x3a,0x7e,0xaa, + 0x87,0x7f,0x2b,0xda,0x2f,0xa8,0x50,0x78,0x18,0x61,0x3c,0xf7,0xed,0x53,0x36,0x26, + 0x96,0xe0,0xdd,0xd6,0x6,0x73,0x9f,0x33,0xbd,0x55,0x45,0x36,0x69,0x5f,0xf9,0xeb, + 0xd6,0x65,0xe4,0xb8,0x16,0x12,0x79,0x78,0x44,0xd9,0xcd,0xc8,0x7d,0xaf,0xad,0xc6, + 0x3b,0xb2,0xc2,0xcc,0x26,0x3a,0x29,0x38,0x2b,0x55,0xbc,0x20,0xa,0x9a,0x16,0xb7, + 0x67,0xcb,0xbb,0x13,0x9a,0x26,0x68,0x56,0xcb,0x85,0x76,0x21,0x92,0xb7,0x82,0x15, + 0xba,0x54,0xc1,0x39,0x75,0x6c,0xbb,0xdb,0xd3,0xbc,0x43,0x63,0x65,0x37,0x15,0x7b, + 0x14,0xe1,0x56,0x12,0x8,0x53,0x0,0x69,0xda,0xf3,0xf6,0x32,0x45,0xa8,0xa3,0x5f, + 0x4e,0x86,0x43,0x32,0x33,0x91,0xb0,0x8f,0x9e,0xab,0x4e,0x8a,0x64,0x2e,0xa,0x12, + 0x7e,0x98,0xd0,0xb1,0xb5,0x50,0xd2,0xcd,0xc3,0x46,0xb2,0x52,0x5,0x92,0x8b,0x23, + 0xdd,0xa3,0xb0,0x5f,0xf4,0x36,0x75,0x5a,0xa0,0x7b,0xf5,0x1,0x7b,0xce,0x2c,0x91, + 0x25,0x3a,0x98,0x46,0xe7,0x26,0xa4,0x6b,0x9c,0xbf,0xbd,0x45,0x87,0xab,0xd0,0x2b, + 0xa2,0xbc,0xc9,0x1a,0x9e,0x81,0xb2,0x75,0xcd,0x54,0xaf,0xc4,0xa5,0x5f,0xa,0x10, + 0x94,0xd5,0xab,0x1a,0xd4,0x3c,0x4d,0x16,0x91,0x9d,0x2c,0x29,0x6e,0x82,0xde,0x4c, + 0x84,0xe3,0x3,0x7c,0xee,0x6e,0x84,0x19,0xc6,0xcf,0xb8,0x65,0x47,0x5f,0xcb,0xe9, + 0x47,0xfb,0x45,0x5f,0x1b,0x8d,0x84,0x16,0x2a,0xc,0x17,0x7f,0x95,0x3b,0x2,0x2d, + 0x3b,0x7a,0xa5,0x55,0x2e,0xd7,0xb0,0x1a,0xc1,0x4a,0xe,0xa2,0x29,0xcf,0x24,0x65, + 0x7f,0xbb,0x3e,0x44,0x13,0xb5,0x31,0xe0,0x3a,0xcc,0x0,0x91,0x96,0x5e,0xf3,0xcf, + 0xa3,0x82,0x62,0xe3,0x27,0xdc,0xa5,0x14,0x88,0xa5,0xd1,0xe2,0xf7,0x39,0x2d,0xa5, + 0x58,0x5c,0x9e,0xce,0x77,0xa5,0xa7,0xad,0x6a,0xa6,0xdb,0xfa,0x99,0x4a,0xc9,0x91, + 0xdf,0x57,0xe5,0xcc,0xdf,0x73,0x28,0xad,0xed,0x71,0x91,0x6f,0x8c,0x9e,0x44,0xb6, + 0x3b,0x66,0x3a,0x3c,0xf7,0xf9,0x68,0xa3,0xa3,0x97,0x65,0xc7,0xb5,0x8c,0xdc,0x96, + 0x8e,0x8c,0xc2,0x60,0x94,0x53,0x42,0x87,0x70,0x2e,0x58,0xd8,0x4a,0x96,0x37,0xa5, + 0xf3,0x9e,0x2a,0xc3,0x32,0x22,0xa9,0x82,0x17,0xf0,0xb,0x5a,0x26,0x9c,0x35,0x3a, + 0x52,0x7c,0xfc,0xc7,0xf9,0x63,0x79,0x8f,0x12,0x40,0xc1,0x9,0xcd,0x10,0xec,0x41, + 0x67,0xb2,0x3e,0x60,0x43,0x60,0xb2,0x21,0xda,0xd3,0x82,0x24,0x5d,0xd6,0x31,0x4b, + 0x96,0x7a,0xdd,0x25,0x4a,0xbe,0x6c,0x5d,0x64,0xa4,0x1b,0xd6,0x5,0xe6,0xa8,0x53, + 0x6c,0x8a,0xb9,0x16,0x9a,0x8d,0xd0,0x1d,0x8f,0xeb,0xa3,0xa0,0x5a,0x74,0x2c,0x23, + 0xdf,0x54,0x9c,0xe5,0x68,0x53,0xa1,0x69,0x46,0x46,0x65,0x51,0xb0,0xa4,0x84,0x1d, + 0x4a,0xfc,0xb0,0xac,0xe3,0xe5,0x50,0xcb,0xe6,0xea,0x58,0xf3,0x3b,0x51,0x2f,0x6e, + 0x89,0x74,0x1e,0x45,0xe6,0xbc,0x4b,0x6b,0xcb,0x7b,0x91,0xf1,0xc2,0x5b,0xa2,0x32, + 0x5d,0x6c,0x2d,0xeb,0x48,0x54,0xcb,0xcf,0x21,0xbf,0x77,0x58,0x78,0x7,0x75,0x72, + 0xe1,0x5c,0xeb,0x65,0xa2,0x84,0xba,0xae,0x1,0x6d,0xd4,0x55,0x43,0xdf,0xc2,0x90, + 0x95,0xb2,0x5f,0x5c,0xb,0xc2,0xfc,0xa5,0xf4,0x65,0x6b,0xa3,0xc2,0x6,0xd0,0x25, + 0xcb,0xbb,0x8,0xde,0xfc,0xf0,0x76,0x1f,0x8b,0xd6,0xb8,0x8e,0x12,0x6b,0x2b,0x4, + 0xc4,0x5b,0x5d,0x2e,0xba,0x31,0x39,0x5a,0x9e,0x6f,0xc9,0x14,0x11,0x14,0xb6,0x3, + 0x4d,0x6b,0xd6,0xb3,0xb,0x4a,0xa9,0x33,0x15,0x3a,0x42,0x4f,0x9b,0x89,0x68,0x53, + 0xd2,0xa0,0x4a,0xce,0x27,0x88,0xf4,0x3c,0x91,0x44,0x14,0xa4,0xc4,0x79,0xa6,0x86, + 0xa9,0x8b,0x6c,0xd7,0x70,0x2c,0xad,0x0,0x42,0xa7,0x1b,0x6a,0x5d,0x29,0x15,0xf2, + 0x63,0xda,0xa4,0x2d,0xe2,0x39,0x8d,0xf5,0x53,0x29,0x5,0x91,0x1c,0x37,0x7c,0xc5, + 0xb5,0xe2,0xbe,0xd8,0xa2,0x5f,0x5a,0x4b,0x55,0x4c,0xf4,0x44,0xed,0xdf,0x67,0x91, + 0x6,0x9a,0xbf,0xf3,0x16,0x3e,0xb3,0x3d,0x17,0x5e,0x82,0x7b,0xf2,0xaa,0x63,0x36, + 0xe,0x51,0x18,0x84,0xb0,0x91,0x8d,0x7f,0x5d,0x65,0xf,0x59,0x33,0xfe,0x9b,0x15, + 0xed,0x9a,0xb,0x81,0xe2,0x18,0xe0,0x90,0x70,0xa,0xc5,0x2,0x68,0x52,0x5a,0xba, + 0x7c,0xa5,0xd1,0x93,0xfd,0xf3,0x43,0xb4,0x8,0xaf,0xb0,0x18,0x4c,0xab,0xec,0x97, + 0x3b,0x75,0x99,0xce,0x96,0x7,0x56,0x78,0xec,0xa1,0x7b,0x6a,0xff,0x2a,0xf4,0x41, + 0xc2,0xf1,0xe7,0xa2,0x85,0xd2,0x6c,0xb6,0xb9,0xd5,0xf4,0x82,0x66,0xe5,0xe0,0x7a, + 0x68,0x6a,0xd8,0xc3,0xa,0xe0,0x1d,0x54,0x61,0x87,0x6a,0xbd,0x64,0x80,0x13,0x4b, + 0x1b,0x45,0x21,0x1b,0x3f,0xe0,0x40,0xf0,0xad,0x63,0x23,0x5d,0xb,0x88,0x32,0xe, + 0xcc,0xda,0x1,0xaa,0xde,0x4b,0x9a,0x24,0x36,0xdb,0x96,0xda,0x1f,0x63,0xbb,0xdb, + 0x5a,0x26,0xd9,0x4d,0x42,0xed,0x3c,0x47,0x52,0xba,0x71,0x88,0x92,0x7d,0x4e,0x9d, + 0x5b,0xcf,0xaa,0xe9,0x2c,0x40,0xaa,0x21,0x7,0x19,0x25,0xb9,0x7a,0x48,0x84,0xe0, + 0xbb,0x49,0xab,0x91,0x3e,0xbb,0x55,0x71,0xbf,0x6e,0x60,0x37,0x5e,0xfc,0x45,0xc0, + 0xc7,0xe3,0x48,0x49,0x7c,0x74,0x56,0x35,0xf3,0x8,0x7e,0x29,0x3a,0x69,0x15,0xa5, + 0x7b,0x5,0x68,0x21,0x6c,0x92,0xd,0x37,0xbc,0xa7,0x7,0x25,0x3b,0x7b,0x2e,0x22, + 0x96,0xb1,0x8c,0xdb,0x49,0x59,0x3f,0xd1,0x24,0x7,0x26,0xe5,0xcf,0x21,0x69,0x59, + 0x50,0xde,0xcb,0x46,0xda,0x14,0x9a,0x2e,0xb8,0xf6,0x84,0xe,0x10,0x8,0x36,0x6d, + 0xa6,0x5b,0x7,0xac,0xb,0x54,0x89,0xac,0x66,0x2,0x33,0xcb,0x9e,0x5f,0x2e,0xd4, + 0x3a,0x21,0x62,0x2a,0x23,0x7d,0x7a,0x5e,0x20,0x7e,0x8e,0x3b,0x80,0x3f,0xb6,0xac, + 0x78,0x47,0xd6,0xca,0x24,0x3,0x8d,0x2e,0x13,0x95,0x9c,0xaa,0x90,0x87,0x3c,0xb9, + 0x38,0x28,0xa3,0xa7,0x1c,0xf,0xb6,0xae,0x93,0x28,0x41,0x64,0x5d,0xb7,0x49,0x54, + 0x85,0xd,0xd4,0x6f,0x4b,0x5a,0x23,0x4a,0xf2,0x8c,0x6f,0xad,0x91,0xb2,0xf8,0x2f, + 0x15,0xc7,0xdc,0xbd,0x67,0xc5,0xdb,0xc6,0xb3,0xbc,0x7e,0xbe,0xd8,0x8c,0x17,0x25, + 0xa4,0xb4,0x64,0x46,0x47,0xf6,0xbd,0x64,0x7e,0xfe,0x3e,0xf9,0x2f,0x92,0x4f,0x7e, + 0x41,0x85,0x6d,0x44,0x9a,0xe8,0x76,0x17,0x4c,0x2b,0x54,0x17,0xd8,0x15,0x8b,0xf6, + 0xfa,0xae,0xc7,0xef,0x5d,0xa7,0xf,0x1b,0x53,0x4e,0x29,0xeb,0x4f,0xe8,0xca,0x85, + 0xae,0xc9,0x6c,0xf5,0xbf,0x3f,0xbb,0xaa,0xae,0x9a,0xa4,0xab,0x79,0x7d,0x56,0xcf, + 0xbf,0xd9,0x38,0x29,0x91,0xe2,0x9c,0x67,0x5d,0xaa,0x7c,0x2c,0x3f,0xb6,0x32,0x4a, + 0x92,0xed,0x2a,0x45,0x58,0x2d,0x9b,0xc0,0x2d,0xb4,0x4b,0xd3,0xbc,0x57,0x61,0x51, + 0x80,0x83,0xf0,0x5d,0xf5,0x19,0x41,0x22,0x4b,0x6a,0xd9,0x86,0xb8,0x4d,0x37,0xc4, + 0xd,0x5e,0xe9,0x6b,0x1,0xe4,0x1b,0x19,0x6a,0xe9,0xe0,0x75,0xef,0xe8,0xbb,0xee, + 0xe5,0xd7,0x11,0x3f,0x55,0xec,0x15,0xc8,0x80,0xfc,0xb5,0x25,0x64,0xae,0x56,0x95, + 0xbd,0x6e,0x8,0x4d,0xea,0xf6,0x45,0x97,0xee,0xcc,0xf6,0xe4,0x29,0xf9,0x8c,0x3b, + 0xfd,0x96,0xa3,0xc8,0x9d,0x71,0xbe,0x74,0x4d,0xcd,0x62,0x11,0x53,0xa7,0x87,0x8d, + 0xbd,0x22,0xea,0xee,0x54,0x73,0x22,0x37,0x80,0x39,0x6a,0x6c,0x41,0xb2,0x96,0x56, + 0x3a,0x65,0x2d,0x16,0xae,0xad,0xe,0x80,0xbe,0xce,0x14,0xd2,0xae,0xfb,0x84,0x1c, + 0xfb,0xc5,0xfc,0x1c,0x31,0xbb,0x39,0x7a,0x94,0x8d,0x95,0x43,0x15,0xda,0x48,0xb2, + 0xf1,0x4,0x4,0x46,0x8b,0x12,0x3d,0x8a,0x33,0x10,0x10,0x26,0x71,0xa0,0x25,0x17, + 0xaf,0xba,0xa8,0x65,0xb7,0xf6,0xaa,0x2d,0xb1,0xe9,0x73,0xb7,0xd,0x9f,0x20,0x2d, + 0x64,0x2f,0x8e,0xa0,0x54,0xf5,0xf7,0x4b,0x1b,0x97,0x4c,0xad,0x40,0xf9,0x74,0x7d, + 0xc7,0x96,0x7b,0x9c,0x12,0x4c,0x36,0xf2,0x1c,0xb6,0x42,0x7f,0x64,0xaf,0xcb,0x1, + 0xcb,0x44,0xae,0x16,0xe8,0x4c,0x30,0x83,0x64,0x30,0x95,0x50,0xa,0x95,0x15,0xe9, + 0x3d,0x8d,0xb7,0x63,0x22,0x11,0xdd,0x6d,0x2b,0x85,0x81,0x96,0xa7,0xaf,0x15,0xea, + 0x60,0x4a,0x14,0xc8,0xe4,0x89,0x46,0xe2,0xb,0xad,0xbb,0xf6,0x96,0xc5,0x63,0x69, + 0x8f,0x8b,0x45,0xd,0x53,0xb9,0x1c,0x69,0x5,0xd5,0xb6,0x83,0xde,0x91,0x56,0x13, + 0xba,0x8a,0x2b,0xf7,0xae,0x44,0x56,0x7e,0x1,0xf6,0x94,0xcf,0x39,0xad,0x52,0x6b, + 0xb4,0x40,0xce,0x96,0xdf,0xf0,0xb3,0xc7,0x5d,0x82,0x3d,0x65,0x48,0xa3,0xf5,0xa5, + 0xfd,0x8c,0x5b,0x7e,0xf5,0x5,0x39,0xb2,0x92,0x34,0x3f,0x89,0x19,0x52,0xa7,0xb1, + 0xe5,0x68,0xe8,0xdb,0x1e,0x8e,0xd,0xf,0x84,0x2e,0x81,0x5d,0x71,0x97,0x21,0x83, + 0x8f,0xf6,0x68,0x2d,0x62,0x90,0x81,0x8d,0x22,0x4d,0x69,0x5a,0x54,0x47,0x42,0x45, + 0xbc,0x39,0xcf,0x50,0xfb,0x2c,0xe,0x71,0x50,0xab,0xc4,0x96,0x3b,0x6e,0xd9,0x27, + 0x52,0x2f,0xb9,0xe0,0x5,0x89,0xca,0x41,0x9b,0xf9,0xf7,0xa8,0xec,0xdb,0xc8,0xaf, + 0x55,0xaa,0x10,0x8e,0x74,0xed,0x52,0x3a,0xa9,0x5e,0xb3,0x9d,0xac,0x8,0x64,0x18, + 0x7a,0x41,0xf,0x42,0xe7,0x96,0xb7,0xc5,0xb8,0x45,0xdd,0xcb,0x8a,0x94,0x13,0xcd, + 0xa2,0xa5,0x34,0x4e,0xa4,0x51,0x68,0xd8,0xd5,0x5b,0x22,0xeb,0x68,0xcb,0x5f,0xc7, + 0x3e,0x84,0xe8,0x3e,0xab,0x4e,0x8a,0x30,0x4a,0x23,0x72,0xd9,0x8,0xa1,0x97,0x3c, + 0x65,0xa0,0x3c,0xf1,0xaa,0x42,0xdd,0x12,0x88,0x55,0xe2,0x42,0xe7,0x9a,0x97,0x27, + 0x1d,0xce,0xc5,0x5e,0x11,0x8d,0x32,0x23,0x4f,0x63,0xc2,0xa3,0x85,0x9a,0xb4,0x56, + 0xfa,0x9b,0x54,0xa5,0x42,0xf2,0x43,0x8a,0x37,0x6d,0x11,0x92,0x91,0xbc,0xa3,0x65, + 0xff,0xb,0x6c,0x78,0x2c,0x75,0xcf,0x82,0x56,0x97,0xbf,0x95,0x87,0xb,0x48,0xb6, + 0x16,0xe7,0x81,0x57,0xbb,0xd8,0xd2,0x3d,0x6a,0xe5,0x5e,0xfb,0xb3,0xb6,0x3d,0xe, + 0xce,0x85,0x12,0x24,0x63,0x8a,0x42,0xc3,0xa9,0xce,0x9f,0x4f,0xcc,0x5,0x2e,0x4c, + 0xcb,0xe5,0xd9,0xe5,0xf3,0xa7,0x5d,0x58,0xba,0x1f,0xa6,0x21,0x62,0x59,0xdf,0x14, + 0x68,0xac,0x7f,0x1e,0x79,0x13,0xba,0xa,0x6e,0xf3,0xe7,0xba,0x5,0xeb,0xd0,0xe4, + 0x76,0x88,0xf3,0x4c,0xa9,0xd0,0x6c,0x65,0x62,0xb1,0xa1,0x15,0xa9,0xd6,0xaa,0xc5, + 0xcb,0xae,0x44,0xed,0xca,0x72,0xa,0x6c,0xec,0x90,0x43,0x38,0x19,0x6b,0x97,0x8, + 0x60,0x29,0xee,0x83,0xa6,0xe5,0x2a,0xb0,0x77,0x8d,0x4,0xa5,0xa6,0xa7,0x28,0x93, + 0x8e,0xae,0xeb,0xbe,0x4c,0xcb,0xbe,0x3a,0x65,0x50,0x80,0x89,0x71,0x3c,0x36,0xaf, + 0x54,0xbc,0x3a,0xa9,0x42,0x50,0x31,0xe7,0x67,0x11,0xaf,0x32,0x9,0xb1,0x90,0xcb, + 0xf8,0xcc,0x40,0xd0,0x24,0xa8,0x5d,0x2d,0x18,0x5b,0x24,0xc3,0xfd,0xe7,0x5e,0x2a, + 0xda,0x44,0x16,0xe8,0x15,0x40,0xa2,0xe3,0xd,0x5b,0x98,0xff,0xec,0x36,0x2c,0xc9, + 0xeb,0xe4,0x82,0x5,0xcc,0xa0,0x7b,0x40,0x64,0x8b,0xee,0x9,0xda,0xbf,0x6b,0x99, + 0x4e,0x6,0xf8,0x89,0x68,0xa7,0x9f,0x93,0xbb,0xa0,0x89,0x3c,0x29,0x45,0x1f,0x84, + 0x7c,0x7f,0x90,0x6e,0x20,0x9,0x33,0xad,0x49,0x1a,0x69,0x6b,0xa4,0xce,0x4c,0x54, + 0x36,0x94,0xb1,0x28,0xb6,0xb0,0x49,0xf1,0x45,0xb6,0xb2,0x70,0xd6,0xad,0xec,0xf3, + 0x7d,0xad,0x52,0x11,0x66,0xa2,0x64,0xef,0xa2,0x86,0x15,0x6b,0x56,0xad,0x4b,0x8, + 0x43,0x20,0x1b,0xcf,0x12,0x1d,0x25,0x8b,0x3e,0x60,0x45,0x87,0xa6,0x1d,0xa4,0xe7, + 0x2e,0x3b,0xf8,0x1f,0x94,0xbb,0x4e,0x4a,0xcf,0xb6,0x25,0x22,0x91,0xe5,0xb2,0xca, + 0x3f,0x8a,0xb5,0xf2,0xab,0xd0,0xff,0x75,0x7d,0x91,0x41,0x46,0xac,0x13,0x90,0xb4, + 0xbf,0x85,0x8f,0xd3,0xd9,0x4a,0x96,0xf7,0x3a,0x1a,0x87,0x10,0xef,0xf,0x45,0x37, + 0x3e,0xbf,0x72,0x58,0xea,0xe7,0x88,0x97,0x36,0x96,0x2d,0x28,0x9e,0x87,0xba,0x42, + 0x0,0x72,0x22,0x56,0x46,0x81,0x22,0xf9,0xb6,0xa3,0x9b,0x35,0xeb,0x4a,0x74,0x4e, + 0x6b,0xda,0x93,0x48,0xe,0x0,0x58,0x1a,0xf4,0xe4,0xd3,0x8f,0x5a,0x35,0x3f,0x4f, + 0x48,0x21,0x29,0xf9,0x79,0x5b,0x64,0x9b,0xe6,0x7c,0xa0,0xcb,0x2a,0x8b,0x39,0x9b, + 0xe3,0xb1,0x37,0x29,0x7e,0x25,0x19,0xcc,0x30,0xbb,0xfc,0xe5,0x2f,0xf4,0xc0,0xa6, + 0x45,0x40,0xb3,0xe7,0xe7,0xa1,0x7b,0x1e,0x4e,0x17,0xea,0x71,0x3c,0x50,0x62,0x3a, + 0x6c,0x8b,0x91,0xdc,0xe5,0xd2,0x36,0xfc,0xf4,0xba,0x3d,0xe1,0x50,0xb7,0x63,0x25, + 0xd7,0xa5,0x8f,0xf,0x4b,0x2d,0x96,0xbb,0x14,0x95,0xb0,0x29,0x36,0xba,0xc4,0x91, + 0xc1,0x38,0x7b,0xf4,0xea,0xee,0x1e,0x48,0x2b,0x8b,0x6c,0x1d,0xd4,0xe4,0xa7,0xc7, + 0xca,0x96,0xf0,0xaf,0x76,0x6b,0x14,0xca,0xce,0x3,0x5d,0x6b,0xcb,0x2a,0x4e,0xe2, + 0x3c,0x71,0x29,0x29,0x4f,0xe9,0xe6,0x6d,0x31,0x89,0x54,0x95,0x7a,0xac,0xbb,0xf6, + 0x81,0xbe,0xe7,0x9e,0x9e,0xa7,0x66,0x9,0xed,0x69,0x57,0xaf,0x99,0xb5,0x9e,0x43, + 0x44,0x24,0x21,0x98,0x23,0x38,0xa4,0x14,0x12,0xfc,0x75,0xf4,0x4d,0xa7,0x3b,0x59, + 0xbe,0x8a,0xf0,0x1c,0x5b,0x71,0x8e,0xac,0xed,0x68,0x28,0x6f,0x32,0x28,0x25,0x52, + 0xb7,0xd5,0xe7,0xfb,0xce,0x23,0x7,0x64,0x68,0x16,0x9f,0xb1,0x32,0x7f,0xeb,0xac, + 0x93,0x2d,0x36,0xdd,0x5a,0x4,0xc8,0xd2,0xed,0x6b,0x1a,0x85,0xf6,0x74,0xbe,0x90, + 0x0,0x53,0x91,0x58,0xfc,0x5a,0x4,0xcb,0xaa,0x42,0xfc,0x90,0xe2,0x3f,0x27,0x21, + 0xed,0x60,0xb9,0xcf,0xf,0xa6,0xab,0x50,0x24,0xd0,0x7c,0x79,0x95,0xc9,0x59,0xba, + 0x71,0x16,0x68,0xe9,0x22,0xea,0x3,0xa6,0x6e,0xa9,0xa9,0x6c,0xff,0x54,0x74,0x31, + 0x39,0xcd,0x13,0x67,0xb2,0x78,0xcc,0x33,0x66,0xd3,0xce,0x6a,0x6b,0x5f,0x58,0xfc, + 0xdd,0xfe,0xe7,0xb6,0x5c,0x30,0x14,0xad,0x86,0xd6,0x2b,0x95,0x80,0x1,0xe2,0xc8, + 0xcd,0x95,0xda,0xb6,0xb5,0xaf,0xf,0xe,0x38,0x16,0xe1,0x9,0x57,0x6e,0xf5,0x6b, + 0x7,0xef,0x4e,0x45,0xf6,0xc4,0xa8,0xea,0x62,0xa3,0xc8,0xfb,0xc7,0x2c,0x5e,0xea, + 0x69,0xe2,0xa7,0xb1,0x23,0x4e,0x19,0xf6,0xc1,0x2c,0x47,0x92,0xf,0xa8,0x54,0x19, + 0x5f,0x15,0x11,0xb2,0x16,0x22,0xd9,0xa6,0xa6,0xca,0x5b,0xb7,0x2c,0x6a,0xc4,0xdf, + 0xdf,0x5b,0x9d,0xa7,0xef,0x55,0x23,0x64,0x64,0x4b,0x11,0xad,0x45,0x67,0x90,0x46, + 0x9f,0x58,0x5,0x3d,0xc4,0x3a,0xe8,0x58,0x45,0xd3,0x9d,0xb8,0xc,0x31,0xa1,0xc0, + 0xa6,0x80,0x2f,0x56,0x3e,0x15,0x0,0x53,0x84,0x8c,0x96,0x99,0x4c,0x45,0x44,0xcd, + 0x91,0x54,0x1f,0xf,0x6a,0x1a,0xc1,0x8a,0x6c,0xd0,0xa3,0xea,0x21,0x97,0x4,0x93, + 0xd1,0xd9,0x46,0x1d,0xdc,0x4,0x9b,0x8e,0xf0,0xea,0xc2,0x6d,0x92,0xa7,0xb7,0x5b, + 0x62,0x46,0xa6,0x64,0xb5,0xb5,0xdb,0xdd,0x48,0x5e,0xd4,0xa2,0x84,0x7,0xe8,0x70, + 0x6a,0x48,0xd9,0xce,0x8b,0xc8,0xa8,0x14,0xe6,0x9a,0xc4,0xb1,0xf9,0x22,0x15,0xfa, + 0xac,0xfd,0x1c,0x13,0x49,0xa3,0x71,0x9e,0xf2,0xa0,0x44,0x5f,0x4a,0x21,0xc3,0x81, + 0x19,0xf4,0x1b,0x5,0x92,0xa6,0xf5,0x92,0xa4,0x55,0x87,0x6c,0xc,0xcf,0x54,0xf7, + 0xa5,0xe6,0xd5,0x30,0x2b,0xd6,0x4a,0x44,0xe2,0x50,0x2a,0x96,0xd2,0xba,0x87,0x95, + 0xd1,0xba,0x58,0x20,0xad,0x8,0xef,0xfc,0x4e,0xf2,0x6b,0xd3,0xf2,0xcf,0x6d,0x71, + 0xdd,0x68,0x4b,0xbb,0xf7,0x14,0xce,0x27,0x4c,0xa8,0x24,0x3f,0x79,0xd1,0x6f,0xc0, + 0x27,0x2b,0xeb,0xd8,0x1b,0xb,0xec,0x54,0x32,0x52,0xd9,0xa7,0x92,0x9a,0xf5,0xaa, + 0x29,0x2,0x97,0xc1,0x94,0xfb,0x9d,0x1c,0x4c,0xfe,0xdc,0x1e,0xa6,0x6f,0x23,0x78, + 0x40,0xb4,0xd2,0x3c,0x2,0x57,0xd9,0x84,0xe5,0x95,0xe9,0x6a,0x42,0x9c,0xd6,0x69, + 0xc3,0x46,0xb1,0xce,0xdf,0xb3,0x88,0xac,0xa8,0xe5,0xd2,0xd4,0x8a,0x58,0x7c,0xaa, + 0xca,0xc6,0xe,0x19,0x9b,0x15,0x76,0x55,0xcb,0xfa,0xf8,0x1a,0xb9,0x4e,0x45,0x11, + 0x7e,0x10,0x97,0xb8,0x74,0xcd,0x9a,0x78,0xd9,0xfc,0xc3,0xe5,0x57,0xb0,0xcf,0xbd, + 0x89,0x24,0x48,0xc8,0xda,0x78,0xb9,0x58,0x29,0xed,0xe5,0xe9,0x43,0x17,0x3a,0x3c, + 0xa8,0x90,0x80,0xac,0x17,0xf6,0xfa,0x53,0xfa,0xbc,0x9,0x3,0xb2,0xed,0x80,0xc7, + 0xbf,0xd3,0x4e,0x11,0x21,0x14,0x1b,0x7b,0xab,0xd2,0x59,0x61,0xb3,0x2f,0xcf,0x5d, + 0xfb,0x42,0xe9,0x4b,0x23,0x30,0xa4,0x3,0xad,0xdb,0x88,0x50,0x9,0x6e,0x41,0x15, + 0x4d,0xbd,0xb4,0x72,0xa7,0x55,0xc4,0x4e,0x55,0x1c,0xc2,0xea,0xe3,0x74,0x88,0xd6, + 0xa9,0x89,0xd2,0x67,0x3e,0x3b,0x55,0x94,0x54,0x7a,0x91,0xc5,0x86,0xc7,0xaa,0xf6, + 0x0,0x43,0x6e,0x6b,0x1e,0x12,0x39,0x6b,0xb9,0x94,0xf6,0xed,0x6f,0xb1,0x69,0x51, + 0x64,0xd7,0x1,0x96,0x9f,0xad,0x2c,0x4e,0xf,0xf6,0x82,0xb3,0x5b,0x66,0x7d,0x16, + 0xd7,0x98,0x58,0x94,0x45,0x7,0x92,0x60,0x33,0x6c,0x97,0x34,0xca,0x48,0x60,0xa6, + 0xf4,0xd,0xb5,0x6a,0x17,0xcd,0xef,0x57,0x75,0x58,0xf4,0xe5,0x42,0xc9,0x13,0x2d, + 0x2d,0xef,0x3e,0x4f,0xcb,0x7c,0xfc,0x2d,0x48,0x6a,0xfd,0xbc,0x8a,0x40,0xfa,0xbe, + 0xd5,0x47,0x93,0x9f,0x3f,0xfa,0x67,0x2a,0x5a,0x7a,0x1e,0x69,0x7f,0xbe,0x58,0x19, + 0xa9,0x9b,0xd5,0x32,0x5d,0xb1,0xcf,0x3f,0x46,0xc9,0xf9,0xf9,0xdd,0xf4,0x5,0x17, + 0x56,0x2,0x8,0xf8,0x64,0x1a,0x8,0x21,0x2a,0xa3,0x29,0xae,0x8b,0x84,0x62,0x53, + 0x3c,0xb9,0x5a,0xc6,0x4c,0x5f,0xa1,0x89,0x8c,0x82,0x14,0xc9,0x5a,0x8c,0xc3,0x9a, + 0xe9,0x99,0xaa,0xb2,0xe8,0x39,0xb6,0x34,0x47,0x81,0x8c,0xc5,0xfa,0x73,0xe7,0xe9, + 0x18,0xef,0x80,0x49,0x47,0xe1,0x2a,0xfb,0x2d,0x97,0x4d,0x7a,0xf7,0x75,0x13,0xd7, + 0xbc,0xee,0xeb,0xd7,0xa2,0xde,0x75,0x6,0x1b,0x82,0x4e,0xc7,0xdf,0x5b,0xc4,0x62, + 0x13,0x17,0x5b,0x76,0xd6,0xd,0x2c,0xfe,0x2d,0x2d,0xc3,0xf,0xdd,0xd0,0x85,0x91, + 0xc5,0x19,0xec,0xbe,0xc8,0x15,0x1a,0x4a,0xb5,0x96,0xf2,0x91,0xe8,0x39,0x93,0x14, + 0x26,0xa3,0x1b,0xa7,0x7b,0x71,0xa6,0xab,0x16,0x34,0x3a,0x29,0xf3,0x92,0xc3,0xa5, + 0x2d,0x67,0xd6,0xa1,0x1c,0xb4,0xcd,0x3,0x4d,0xb7,0x90,0x9e,0x5c,0x1,0x16,0x7, + 0x38,0x5f,0x4a,0xcb,0xde,0x70,0x41,0x9a,0x6e,0x2d,0xf8,0xc9,0xf7,0x37,0x85,0x3e, + 0xf5,0x90,0x64,0x55,0x26,0x38,0xad,0x86,0xd8,0xb6,0x59,0xa9,0x5a,0xa3,0x5d,0x65, + 0xff,0x21,0x48,0x55,0x7e,0x95,0x6d,0xe4,0xd0,0x1a,0x2,0x33,0x2e,0xde,0x6d,0x1a, + 0xf6,0xf1,0xc2,0xbe,0xd5,0x3d,0x76,0x4d,0x56,0xd3,0x65,0xc3,0xa3,0x1b,0x14,0xb1, + 0x88,0x8c,0x45,0x70,0x9e,0x79,0x35,0x62,0xc2,0xbb,0x12,0xd9,0x87,0x2d,0xd1,0x5e, + 0x15,0x9d,0xcb,0xa,0x80,0x9,0x70,0x8a,0x16,0x5d,0x44,0xcc,0xcd,0xd6,0xc3,0x2a, + 0xa7,0x78,0xd5,0xfe,0x2f,0xd9,0x38,0x34,0xf6,0xaf,0xa0,0x13,0x9,0x64,0x38,0x91, + 0xc,0xa3,0x98,0xcf,0x57,0xf1,0x82,0xab,0x6e,0x2a,0xcd,0xeb,0xa5,0x59,0xe0,0x77, + 0x45,0x85,0xbc,0x7a,0xb6,0x63,0x4f,0x4e,0xcf,0x74,0xd3,0x4,0x77,0xd9,0x46,0x37, + 0xd6,0xbf,0xb7,0x7e,0xae,0x4b,0x8f,0xc6,0x97,0x14,0xf2,0x8a,0x20,0x8d,0x6e,0x4d, + 0xc0,0x69,0xf1,0xb5,0x44,0x89,0x72,0xb6,0x83,0xae,0x5f,0x17,0x52,0x31,0x96,0x31, + 0x4c,0x96,0x5e,0x18,0x23,0x48,0xcf,0xcd,0x4e,0x99,0xdb,0x86,0xd7,0x65,0x81,0x55, + 0x77,0x12,0x79,0x11,0x60,0xa5,0x41,0xf5,0x6,0xd1,0x8b,0xce,0x17,0x25,0x1,0xa9, + 0xb2,0xe,0xc7,0x2e,0xd4,0x12,0x98,0xb2,0xee,0xe4,0xdb,0x6,0x41,0x40,0x97,0x45, + 0x56,0xba,0xc4,0x73,0xa0,0x44,0xba,0x8,0xe3,0xb9,0x2d,0xa1,0x32,0x34,0x9e,0xb6, + 0xf7,0x4f,0x36,0xf9,0x1,0xfb,0x54,0xff,0x79,0xd7,0x97,0x77,0xb6,0xb9,0xb,0x16, + 0x95,0xc5,0x5e,0xa5,0xde,0x21,0x13,0x43,0xa3,0xa0,0x60,0x3a,0x89,0xf7,0xfc,0x27, + 0xee,0xd3,0xba,0xc2,0x90,0x60,0xbb,0xe4,0x46,0xfc,0x2d,0xa4,0x3c,0xaf,0xda,0xb6, + 0x35,0xe,0xb2,0x15,0xd3,0xb2,0xa7,0x1,0x4a,0x79,0x1,0x28,0xeb,0xb0,0x6c,0xf9, + 0xc1,0xc6,0x8e,0x88,0x27,0x44,0xeb,0xaf,0xf7,0xa8,0xd0,0xf5,0x73,0xd6,0x1c,0xa9, + 0xd0,0x5,0x4d,0x31,0xd9,0xae,0x9c,0x85,0xb3,0xeb,0x1c,0x78,0x6d,0x0,0xf3,0x24, + 0x89,0x84,0x83,0x64,0x7,0xcd,0xac,0x7c,0x22,0xbe,0x69,0xe,0x7,0xb,0x5d,0x56, + 0x76,0x15,0xe5,0x64,0xc1,0xf9,0x1c,0xbf,0xf6,0x17,0x3f,0xff,0x81,0x26,0x31,0x9, + 0x12,0x77,0x3c,0xef,0x5a,0xb2,0x46,0x43,0xab,0x30,0x6e,0xd3,0xf2,0x51,0x52,0x70, + 0x58,0x40,0x6,0x59,0x11,0x81,0x89,0x6b,0xbe,0xad,0x72,0xae,0x87,0xf9,0x2f,0xdb, + 0xc9,0xcb,0x3e,0xbc,0xe8,0x5e,0xe,0x6a,0x7e,0x44,0x45,0xb5,0x98,0xc0,0x74,0xd9, + 0xa,0xaf,0x7f,0xe0,0x1e,0x1f,0xb9,0xbf,0x90,0x34,0xc6,0x99,0x1f,0xbe,0x32,0xfe, + 0x4f,0xd6,0x51,0x30,0xf6,0x7c,0xd9,0xba,0xe7,0x9f,0xed,0x7b,0xbd,0x50,0x56,0xaa, + 0x48,0xac,0x79,0x1b,0xc1,0x63,0xe9,0xf0,0x72,0x8e,0xf6,0x3a,0xb7,0x59,0x7d,0xeb, + 0x22,0x5b,0x9,0x67,0x9b,0xc1,0x60,0xb2,0xa7,0x75,0xa9,0x19,0xf4,0x1b,0x44,0xa5, + 0x2d,0xc1,0x26,0x90,0x9,0xe4,0xca,0xc2,0xb1,0xff,0xb7,0xb4,0x2b,0xf,0xd6,0xb3, + 0xae,0xce,0xe7,0xfc,0xbe,0x4b,0x36,0x72,0xb3,0xb1,0x84,0x0,0x12,0x8,0x21,0x10, + 0x40,0x8,0x48,0x9d,0xb1,0x75,0x6c,0xed,0xd4,0x5,0xa7,0x9d,0x76,0xfa,0x47,0x47, + 0x56,0x97,0x29,0x2e,0x14,0x1c,0xa7,0x38,0xc5,0x2e,0xe3,0xb4,0xe,0xd6,0xd1,0xa9, + 0x9d,0xa2,0x56,0xea,0x54,0x1,0x5b,0x6a,0xc7,0xa5,0x15,0x1d,0x1d,0x15,0x6b,0x37, + 0x7,0x47,0x11,0xbd,0xc1,0x5,0x12,0x3,0x9,0x84,0xc5,0x40,0x2,0xd9,0x6e,0x9a, + 0x5c,0x42,0xbe,0xd3,0x3f,0xbe,0xef,0x7d,0xdf,0x73,0x9e,0xf3,0xfc,0xde,0xef,0x32, + 0x66,0x86,0x21,0xb9,0xf7,0x5b,0xde,0xf7,0xf7,0xfe,0x96,0x73,0x9e,0xf3,0x9c,0xe7, + 0x9,0x38,0xb7,0xfb,0xda,0x90,0x61,0xb4,0xce,0x30,0x54,0x98,0x16,0xe9,0x91,0xc1, + 0xcb,0x1d,0x1e,0x82,0x41,0xe9,0x21,0xb6,0x35,0x91,0x3a,0x9c,0xb2,0xbe,0x6d,0x49, + 0xf6,0x3a,0xcc,0xc9,0x30,0x11,0xcc,0x12,0x1b,0x5c,0x82,0xcd,0x35,0x2a,0xec,0xf4, + 0x77,0x4,0x54,0xd6,0x47,0x42,0x95,0xfc,0xcb,0xc,0x9a,0x99,0x2d,0x6f,0xf0,0xae, + 0x5d,0x35,0xa2,0x17,0xd1,0xa2,0x55,0x13,0xa2,0x62,0xd4,0x38,0x46,0x13,0xf6,0x12, + 0x37,0x58,0x16,0x73,0xa9,0x64,0x94,0x32,0x56,0xe2,0xa3,0x16,0x62,0x26,0xf7,0x11, + 0x59,0x38,0xff,0x59,0xde,0x22,0x56,0x41,0x93,0x3,0xfb,0xba,0xc,0x84,0x7c,0xaa, + 0x9,0x51,0x3f,0x5e,0xd8,0x96,0xfd,0x80,0x2e,0x20,0x94,0xb4,0x29,0x60,0x78,0x9a, + 0x9,0x9a,0x2a,0xd1,0xa4,0x2a,0x3c,0x23,0x8d,0x6a,0xed,0x8a,0x89,0x98,0x75,0xfa, + 0x2,0x6d,0x42,0x46,0xba,0x25,0x54,0x90,0x7,0x98,0xc9,0x94,0xc8,0x1f,0x4b,0xed, + 0xd2,0x66,0xf1,0xfc,0x76,0xc1,0x61,0xcb,0x1,0x31,0x83,0xee,0x18,0xd6,0xa6,0x28, + 0xd4,0x74,0x5b,0x7a,0x3a,0xbf,0x94,0xa3,0xf5,0x3c,0xce,0x97,0x6c,0x9f,0x2a,0x9, + 0x51,0x31,0xc2,0x15,0x68,0xbd,0xe8,0x42,0x70,0xa4,0x22,0xa3,0x1a,0x7a,0xb,0x39, + 0x15,0xb,0x6,0xe,0x11,0x16,0x27,0x35,0x85,0x70,0x23,0x9d,0xef,0x75,0xd7,0x92, + 0x51,0xc6,0xed,0x6b,0x26,0xd4,0xe,0x35,0xcc,0x5f,0xd,0x10,0x69,0xe,0xf,0x98, + 0x35,0xa2,0x66,0xfe,0x2c,0xa2,0x12,0x32,0x82,0xf7,0xd4,0x9,0xa7,0x50,0x6,0x74, + 0x4c,0x74,0x43,0xd,0xd5,0x12,0x23,0x12,0x33,0x60,0x62,0x3f,0x2a,0x7c,0x11,0xb6, + 0xf5,0x12,0x54,0xc6,0x33,0x2f,0x36,0xc0,0x32,0x4d,0x62,0x92,0xe1,0x33,0x69,0x27, + 0xc2,0x61,0xa1,0x5e,0x63,0xce,0x6d,0x38,0xf6,0x96,0x9b,0x4a,0x78,0xbe,0x9a,0xbc, + 0xed,0x39,0x1c,0x35,0x54,0xf4,0x21,0xc7,0x60,0x2d,0xd6,0x88,0x2,0xe3,0xd7,0x9c, + 0x9d,0x9a,0x10,0xc2,0xb,0x9,0xac,0x34,0xb8,0x58,0xa1,0xcd,0xaa,0xf2,0xf6,0x34, + 0xa7,0x9e,0x16,0xea,0xaa,0xa4,0x6d,0xa7,0xe,0x8d,0xd6,0x18,0xb9,0x40,0xf6,0xf3, + 0xf2,0xbe,0xda,0x5,0xc6,0x58,0x5a,0xca,0xe5,0xe7,0xa6,0x8d,0x8a,0xf1,0x13,0xba, + 0xec,0xd0,0x80,0xed,0xdc,0x74,0x1b,0x18,0x74,0x5d,0x48,0xe7,0xc0,0x19,0xc7,0xa6, + 0xb8,0x80,0xad,0x62,0x92,0x22,0xb4,0x46,0x4f,0xec,0x8f,0x25,0x46,0xf7,0xa8,0x29, + 0xe1,0xb3,0x1a,0x81,0x1e,0x5f,0x7e,0x28,0xe5,0x8c,0x9a,0x95,0x3,0x62,0x99,0x43, + 0xc1,0x7e,0xd8,0xcf,0x73,0x37,0xa7,0xc7,0x3f,0x1b,0x26,0xe,0x41,0xac,0x48,0x66, + 0x5,0x44,0x3,0xb1,0x1f,0x47,0x86,0x1c,0x6b,0x9c,0x7b,0xd2,0xa6,0x17,0x19,0x69, + 0xda,0x11,0x2d,0x45,0xe3,0x1a,0x9,0xa7,0x55,0x4,0xa9,0xeb,0x2f,0x57,0x10,0xad, + 0xb2,0xe0,0xb8,0xe2,0x21,0x78,0xd2,0x91,0xdd,0x20,0x5d,0xc1,0xa0,0xc9,0xad,0xa1, + 0x52,0x3f,0x2c,0x2,0xa1,0xc3,0xd,0xbc,0xf9,0x9a,0xb1,0x60,0x69,0x31,0x12,0xb9, + 0x4c,0x33,0xf,0xc2,0x4b,0xa0,0xa2,0x6a,0x67,0xc7,0x5f,0xc1,0xdd,0x7f,0xdc,0x97, + 0x6d,0xfe,0x99,0xba,0x92,0x6e,0xfb,0x7d,0x44,0xb1,0xb3,0x25,0x2c,0x47,0xd7,0x3e, + 0x25,0x84,0xc6,0xe6,0xbe,0xd4,0x22,0x82,0x91,0x33,0xa9,0xc2,0x89,0x96,0xae,0x54, + 0x11,0xe5,0x5,0xb4,0xd2,0xc9,0x22,0x89,0x87,0x13,0x3b,0x6c,0x9a,0x20,0xa5,0x50, + 0x75,0x44,0x23,0x52,0xe3,0x26,0x36,0x82,0xdc,0x73,0x6b,0x8d,0x27,0x9d,0x29,0x5a, + 0x62,0x4a,0xc4,0x9a,0x1,0xbe,0x2d,0x20,0x28,0xe2,0xea,0x57,0x11,0xea,0x8a,0xb0, + 0x2c,0x66,0x23,0xcd,0x82,0x19,0x12,0xe5,0xd,0x2f,0x52,0x31,0x6a,0xdb,0x19,0x1f, + 0xbe,0xe,0x2a,0x35,0x89,0x19,0xc8,0x30,0x1d,0x12,0x4,0x12,0x4b,0x3,0x9a,0x25, + 0xe,0xd5,0xe9,0x6e,0x1a,0xa9,0x15,0x8a,0x6b,0xa1,0xf2,0x16,0x77,0x4c,0x20,0x4, + 0x8f,0xa,0x83,0x9a,0x92,0x26,0x75,0x2f,0x84,0x2d,0xb1,0x2,0xc3,0x5a,0x2,0x33, + 0xb1,0x8c,0xa5,0xc7,0x46,0xe4,0x63,0x55,0xb2,0xfe,0xd3,0x30,0x40,0xa4,0x92,0x94, + 0xb1,0x1a,0x62,0xa3,0xaf,0x5d,0x37,0xc6,0x12,0xc4,0x5,0x29,0xc0,0xcd,0x9e,0x19, + 0xaa,0x86,0xed,0x31,0x9d,0x63,0x9f,0x5a,0x14,0x85,0x49,0x1,0x82,0x11,0xab,0x71, + 0x5f,0xfa,0xa8,0x5a,0x41,0xf2,0xfa,0xb1,0x38,0xc8,0x2d,0x35,0x5f,0xb7,0xce,0x6a, + 0xe2,0x4,0x75,0x72,0xab,0x8e,0x55,0xe1,0x23,0x71,0x9b,0x56,0xee,0xc2,0x88,0x5a, + 0x1,0x5d,0x24,0x6e,0x2d,0xfc,0x3e,0xba,0x86,0x21,0x24,0xc4,0xc9,0x2f,0xd9,0xc1, + 0xe7,0x9,0x59,0x70,0xac,0xdb,0xf0,0xbc,0x7d,0x3b,0x95,0x7a,0x38,0x1f,0x82,0x1a, + 0x8b,0x4,0x33,0xda,0x7e,0xd8,0x7,0xa1,0x11,0x33,0x16,0xb5,0x6c,0xa8,0x81,0xea, + 0x7b,0xb1,0x36,0x5f,0x42,0xac,0xe7,0x6b,0xe9,0x3c,0x48,0xf5,0xcf,0x4e,0xb3,0x45, + 0xaf,0xdf,0x40,0x3d,0x27,0xc7,0x9,0x7f,0x78,0xb,0xd2,0xe4,0xf1,0x20,0xa4,0x94, + 0x15,0x4a,0x1e,0xbe,0x1d,0x30,0x66,0xbc,0xad,0xbd,0xa6,0x69,0xe0,0x29,0x59,0x0, + 0x5d,0xbc,0x3f,0x1,0x5a,0x1b,0x2b,0x68,0xce,0x63,0x2,0xe4,0x78,0x2f,0x22,0x3d, + 0x7e,0x19,0xe2,0xf6,0xb3,0x2,0x6b,0x5b,0x9c,0x15,0x68,0xd,0xce,0x1,0x8f,0x76, + 0x48,0x86,0x4d,0x62,0xb6,0x9f,0x89,0x7d,0xb1,0x26,0x6f,0xa1,0xfc,0x85,0x87,0x34, + 0xba,0xea,0xe5,0xbd,0xcc,0x93,0x5e,0x51,0x15,0x20,0x58,0x61,0x2b,0x66,0xe9,0x12, + 0xba,0xad,0xb4,0x91,0x75,0xe,0xda,0xb,0x9e,0x8,0x1e,0xa9,0x8d,0xc3,0x20,0x90, + 0xd6,0xa1,0xb1,0xbc,0x5d,0xd,0xe6,0x9b,0xc2,0x1e,0xa6,0x19,0xf4,0xf7,0x1e,0x26, + 0x53,0xc3,0x92,0x61,0x68,0x2f,0x71,0xd9,0x6e,0x9a,0x85,0x2d,0x2c,0xe9,0xc9,0x27, + 0x33,0xce,0x10,0x5d,0x68,0x1,0xef,0x32,0x14,0x83,0x89,0x45,0x17,0xaf,0x44,0x14, + 0xfa,0xdd,0x4b,0xcd,0xab,0x19,0x6b,0xc6,0x9c,0x51,0x8d,0xd7,0x3b,0xf4,0x70,0x74, + 0x81,0x16,0x5,0x8b,0x91,0x6b,0x16,0x4b,0x28,0x59,0xf,0xdd,0x47,0x97,0x22,0x41, + 0x9c,0x22,0x58,0x45,0x12,0xf9,0xc9,0x8e,0x10,0xa4,0xd9,0x6a,0xd8,0x13,0xad,0x68, + 0x55,0x87,0x3d,0x17,0x25,0x10,0xb9,0xb9,0xde,0x5e,0x73,0x8f,0xc3,0xb5,0x2c,0x39, + 0x41,0x14,0x9,0x3e,0xcd,0x4c,0x8f,0xbb,0xd2,0x47,0xef,0xc8,0x4d,0xe8,0xc4,0xe5, + 0xd1,0x8c,0x10,0xac,0x39,0x6,0xbb,0x15,0x27,0xda,0x0,0x34,0x29,0x73,0xd2,0x9f, + 0x42,0x6a,0x69,0xa9,0xbe,0xe0,0xa4,0x19,0xc5,0xb5,0x6d,0x1a,0x6c,0x96,0xdc,0xf8, + 0x26,0xa2,0x8e,0xd1,0xfe,0x94,0x99,0x3,0x69,0xbe,0x6,0x97,0xc5,0x2a,0xf8,0x1e, + 0x9b,0x63,0xe0,0x47,0xc7,0x56,0xd0,0xab,0x16,0xa9,0x74,0x3b,0x20,0x59,0x31,0x42, + 0xb0,0xb1,0x6d,0x4a,0xe9,0xe6,0x61,0x84,0xa0,0x54,0xb3,0xb8,0xc5,0x59,0xe6,0xcd, + 0x39,0x86,0xae,0xa4,0xe0,0x2d,0x7d,0x15,0x6a,0x4a,0x16,0x78,0x19,0x91,0x10,0x26, + 0x60,0x54,0x64,0xe6,0x35,0xd3,0xa3,0x9f,0x82,0xf,0x4a,0x4,0x7c,0xe2,0xfd,0xb3, + 0x8a,0x52,0xa7,0xc0,0x2d,0x4a,0x2d,0x51,0x7d,0xfb,0x47,0xb0,0x80,0x8b,0x1,0x11, + 0xd4,0x28,0x3,0x81,0xd3,0x5b,0x3f,0x8b,0x89,0x5a,0x71,0x44,0xc6,0x5c,0x9f,0x16, + 0x8,0xd2,0x98,0x58,0x54,0xf3,0x1d,0x5e,0xc2,0x54,0x14,0xe0,0x68,0x83,0x76,0xd8, + 0x80,0xda,0x44,0xcf,0x7a,0x6d,0x3a,0x47,0xc6,0x9c,0x15,0x24,0xae,0x29,0xd9,0x67, + 0x2,0xab,0xdd,0x20,0x3,0x5,0x4d,0x7,0xd4,0xd0,0x50,0x56,0x9e,0x2a,0x98,0x82, + 0xa1,0x40,0x8b,0xf,0xfe,0x21,0x59,0x52,0xec,0xb4,0x88,0xbe,0xbb,0x6,0x2d,0x6a, + 0xe2,0x1d,0x2a,0xb1,0x55,0x52,0xe3,0x77,0x1a,0x2d,0xcf,0x22,0x37,0xc4,0xf3,0x7d, + 0x9c,0xe8,0xd1,0xf8,0x9e,0x3b,0xc7,0x3d,0xb,0xbc,0x82,0xf6,0x61,0x17,0xab,0xb8, + 0x7,0x96,0x14,0x9c,0xfa,0xee,0x24,0x5d,0xf2,0xb3,0xc7,0x67,0xd4,0x40,0xcf,0x46, + 0x25,0xc5,0x30,0x19,0x96,0x71,0x40,0x94,0x82,0x65,0x2a,0x39,0xf3,0xad,0x72,0xc6, + 0xa4,0xe4,0xbf,0x7,0xa8,0x30,0xe2,0xe9,0x85,0x41,0x4e,0xdc,0xc,0x88,0x90,0xf9, + 0x78,0xa7,0x54,0xd7,0x7b,0x99,0xa,0x68,0x9a,0x28,0x9b,0x2f,0xae,0x96,0x2,0x6e, + 0x5d,0x21,0x32,0x32,0xc9,0x6d,0x7c,0x5e,0xd9,0xcd,0xb,0x67,0x20,0xcc,0xac,0x22, + 0xd8,0x8d,0x9e,0xab,0xfa,0xf1,0xf0,0x68,0x75,0x97,0x1d,0xfb,0x5f,0xd5,0xb7,0xc5, + 0x64,0x34,0xd5,0xaa,0x21,0x19,0xdb,0xde,0x34,0x91,0x14,0x7d,0x1b,0x89,0x6a,0x66, + 0x76,0x27,0xfb,0x2b,0x12,0x20,0x12,0x3f,0x25,0xf2,0x1c,0x53,0xda,0x52,0xe7,0x46, + 0xf8,0x72,0x0,0x29,0x2d,0x4b,0xad,0xcc,0x95,0x88,0x7d,0xa,0x73,0xbf,0x6b,0xe1, + 0x9,0x24,0x24,0xf3,0x2d,0x93,0x50,0x5f,0x77,0x45,0x61,0x23,0xac,0x0,0x5e,0xa5, + 0x47,0x57,0x61,0x90,0x26,0x36,0x8,0xf4,0x8d,0x50,0x10,0x34,0x92,0x19,0xf3,0x83, + 0xc6,0x7a,0xa2,0x10,0xda,0x4f,0xa5,0xc7,0x1b,0xeb,0x91,0x68,0x5c,0x1e,0xac,0x46, + 0x8d,0x78,0x66,0xf7,0x97,0xf0,0x21,0xb5,0xc,0xfb,0xac,0x79,0x27,0xc0,0xf4,0x70, + 0xdd,0x72,0x40,0xa7,0x33,0x75,0xdb,0xb1,0x13,0xc7,0xb1,0x14,0xfc,0x2a,0xa1,0x29, + 0x98,0x13,0x58,0x87,0x96,0x34,0xb0,0x2a,0x56,0x20,0x91,0x6,0x19,0x77,0x27,0x27, + 0x2b,0x92,0xa5,0x83,0x93,0x6f,0x90,0xd2,0xc2,0x77,0xa4,0x4c,0xf8,0x53,0x31,0x39, + 0x7d,0x59,0x70,0x95,0xd4,0xca,0xc0,0x53,0x1,0xdc,0xa,0x29,0x27,0x90,0x80,0xa1, + 0x8c,0xaa,0x8c,0x75,0x62,0xae,0x3c,0x53,0xb1,0xd0,0xce,0xe8,0xa0,0x23,0xfe,0xd6, + 0x10,0x1,0xcf,0xff,0x22,0xb,0xa7,0x97,0x32,0x35,0x89,0x93,0x14,0x22,0xe,0x4f, + 0x56,0xb3,0xd4,0x7d,0x92,0x50,0xe,0x5a,0xa7,0x97,0xfe,0xbd,0xd,0x75,0x5a,0x21, + 0x38,0xf7,0xa8,0x99,0x6f,0x7b,0xd5,0x25,0xf,0x3d,0x3e,0x33,0x1f,0x26,0x4c,0x7f, + 0x62,0x1e,0x75,0xb9,0x4d,0xdd,0x86,0xd7,0xea,0xc2,0xbb,0x8,0xcb,0xc,0x60,0x3c, + 0xce,0x8c,0xb2,0xd0,0xdb,0xec,0x7f,0x8e,0x76,0xd0,0x96,0xb2,0x58,0xf5,0x3d,0x9a, + 0x9a,0x39,0xf,0x36,0x9f,0x7,0xa,0xb4,0x68,0x75,0x6d,0x5,0x1d,0x3c,0x6a,0x1, + 0x76,0x6f,0x85,0xf,0xaa,0x84,0x2e,0x3e,0xc6,0xb5,0x8c,0x2b,0xbd,0x16,0xea,0xa4, + 0x5c,0x20,0x84,0x3c,0x75,0x91,0xa4,0xc3,0x8d,0xd8,0x9,0x31,0x1d,0x83,0x48,0xdf, + 0x5,0x43,0xfe,0x89,0x6,0x9,0x3e,0xb7,0x0,0xe9,0x58,0x1b,0x39,0xb8,0xdd,0x1, + 0xee,0x83,0x43,0x28,0xfb,0x89,0xc5,0x3a,0x3d,0x73,0x7d,0x2,0xd1,0xe8,0x68,0x66, + 0x0,0x11,0x7e,0x92,0x64,0xc,0xe2,0x45,0x56,0x7f,0x5e,0x10,0x64,0x5,0xf9,0x4f, + 0x24,0x1d,0x39,0xb2,0xa3,0xcc,0x87,0x6f,0x86,0xeb,0x2a,0xcc,0x71,0xce,0x38,0x50, + 0xcd,0x81,0x87,0x4,0x6b,0x5d,0x4b,0x5c,0xef,0x38,0xa,0xbc,0x2a,0x64,0x92,0xf, + 0x4,0x45,0x94,0xd4,0x34,0x98,0xdb,0x45,0x49,0xce,0x1c,0xfc,0x59,0x6d,0x7e,0xfb, + 0xf4,0xdb,0x8c,0x94,0xf6,0xd0,0x3,0xa0,0x56,0xc2,0xea,0xb,0xcd,0xe6,0x11,0x34, + 0xe0,0x32,0x9,0x6d,0x6b,0x56,0xd9,0x48,0x35,0x96,0x33,0x8,0xff,0x90,0xdd,0xbd, + 0xef,0x9e,0x89,0xd3,0xd6,0x82,0x9,0x8e,0x56,0xac,0x64,0x33,0xd3,0x79,0xd2,0xc1, + 0xe5,0xda,0x82,0xa9,0x42,0x9f,0x87,0x27,0xbb,0xc5,0xa7,0xbe,0xdb,0x48,0x59,0x3f, + 0xf7,0x24,0xca,0x6e,0x4f,0x22,0xa4,0x9d,0xc9,0x95,0x62,0x30,0x9,0x7b,0x5b,0xf5, + 0xd9,0x69,0xed,0x77,0x99,0x46,0x19,0x38,0x5f,0x66,0xc0,0x4d,0xf0,0x60,0x98,0xdf, + 0x6b,0xcd,0xb9,0x1c,0x5a,0xe2,0xd,0xf8,0xe,0xc,0x65,0xe5,0xdb,0x49,0x24,0x65, + 0x96,0xeb,0xe2,0x21,0x44,0xe3,0x80,0xf1,0x9c,0xf2,0xc1,0xe9,0xe2,0x9f,0x3f,0x35, + 0x83,0x51,0xa7,0xa0,0x4e,0x6d,0xe4,0xd8,0xa7,0xff,0x77,0xe2,0x1,0x35,0x78,0x57, + 0xfb,0xeb,0x2c,0xb5,0x4c,0x9a,0xc5,0xc,0x95,0x10,0xca,0x4b,0x84,0x22,0xbc,0x99, + 0x5b,0xa7,0xf2,0xa6,0xd6,0x6e,0xbe,0xc2,0x5a,0x7e,0x2c,0xea,0x6b,0xbb,0x83,0x2d, + 0x31,0x53,0xb5,0xc6,0xf5,0xaf,0x7,0xd,0x89,0x9c,0x2c,0x51,0x4e,0xd3,0xc8,0x39, + 0x92,0x94,0xa4,0x94,0x6f,0x6c,0x19,0xa0,0xae,0x74,0xe,0x4c,0x62,0x54,0x26,0xad, + 0xf4,0xf9,0x6c,0x8d,0x64,0x19,0x7b,0x6d,0x6e,0x35,0x97,0xb0,0xb9,0x16,0x1e,0x65, + 0x5f,0x43,0x32,0xd,0x72,0x70,0x89,0x54,0x24,0x16,0x61,0xec,0x52,0xd0,0x56,0x6d, + 0x27,0x60,0x2c,0xcb,0x84,0xb4,0x56,0xc1,0x2,0xe,0x1f,0xf5,0xa5,0x10,0x44,0xe9, + 0x46,0x4,0x22,0xff,0xfe,0xa0,0x20,0x23,0x36,0x48,0x6a,0x3,0xef,0x1b,0x5c,0x33, + 0xc6,0xe8,0xc4,0x96,0x9b,0x45,0xc2,0x21,0xf,0x59,0x5f,0x6f,0xb6,0xe7,0x2,0x6d, + 0x1,0xe7,0x34,0x57,0xef,0xf,0x9e,0xe6,0x2e,0x93,0xa6,0xa,0x63,0x64,0xa7,0xb1, + 0xde,0xfc,0x43,0xf3,0x9e,0xe7,0xfd,0xc,0x2c,0xeb,0xdf,0xd7,0xa3,0xe8,0x9e,0xfd, + 0x8d,0x1,0x51,0x21,0xea,0x31,0x57,0x7a,0x0,0x70,0x4,0x16,0x8d,0xf7,0x68,0x10, + 0x67,0x7c,0x23,0x41,0x69,0xcc,0x4,0xd5,0x67,0x73,0x7f,0x4,0x91,0xf4,0xf5,0xcc, + 0x74,0xb7,0xe7,0x9b,0xf6,0x10,0x8a,0x25,0x7,0x70,0x61,0x4f,0x81,0xb6,0x9a,0xd8, + 0xe0,0xe1,0x5,0x7f,0x12,0xfc,0xc4,0x4f,0x3a,0xed,0x4b,0xbf,0x94,0x51,0xe4,0x81, + 0x48,0xa,0x63,0x5c,0x6d,0x48,0x8a,0x44,0xcd,0xbc,0x45,0xe4,0xb3,0xce,0xb2,0x59, + 0x77,0xd2,0x24,0xf1,0xf6,0x3a,0xb1,0xa3,0x8b,0x44,0x90,0x38,0xa6,0x41,0x6e,0xd6, + 0x52,0x4b,0x5f,0x7b,0xa6,0x2d,0xda,0xf6,0xd4,0x8c,0xa8,0xe6,0xcd,0xa0,0xed,0xef, + 0xf5,0xe2,0x2f,0x96,0xc8,0x2f,0x32,0xb1,0x72,0x1e,0x3,0x3e,0xcc,0xfa,0x62,0x34, + 0x4e,0x53,0x4c,0x37,0xef,0x7b,0x9b,0x1c,0xea,0x1b,0xa7,0x4a,0xe5,0x9,0x2,0x9c, + 0x3e,0x61,0xd3,0x7c,0xd1,0x87,0x17,0xa9,0xe9,0x86,0xa3,0x46,0xc9,0xf6,0x43,0x4c, + 0x5a,0xba,0xf6,0x9d,0xd8,0x4a,0xa6,0xd5,0xe3,0x81,0x11,0x26,0x84,0x43,0x51,0xa0, + 0xf0,0xeb,0x99,0xaa,0xd1,0x43,0x91,0xad,0x4,0xce,0xa1,0xc8,0x35,0x7a,0xe5,0x25, + 0xd,0x2a,0xdc,0x1e,0x21,0xe9,0x1a,0x5e,0x54,0xb5,0xd,0xaa,0x2d,0xd4,0x24,0xb6, + 0x93,0xc5,0xfd,0xd,0xf8,0x5,0x3c,0xd4,0x51,0xf2,0xb1,0x11,0xf2,0x8b,0xc5,0x6f, + 0x71,0xfd,0xa7,0x70,0xa9,0xa9,0xec,0xe2,0x18,0xf2,0x2c,0x4b,0x99,0xc4,0x5c,0xf1, + 0x8a,0x65,0x34,0xda,0x17,0xde,0x22,0x58,0xcb,0xa6,0x92,0x15,0x20,0x89,0x64,0x6a, + 0x8,0x3,0x6,0xba,0x70,0xd1,0x6,0x2d,0x55,0x14,0xa7,0x62,0x71,0x64,0x0,0xbd, + 0xc0,0x57,0x1,0xbc,0x9b,0x31,0xde,0x6d,0xca,0x4e,0xb5,0xb3,0x22,0x20,0x50,0xb5, + 0xc0,0xac,0xf,0xc5,0xc3,0xb6,0x29,0x4f,0x6c,0x25,0xed,0x67,0xd9,0x6a,0x69,0x3e, + 0xf,0xaa,0xe2,0x56,0x88,0xef,0xc3,0xc9,0xe5,0x4a,0xa3,0x3a,0xe1,0x90,0xec,0xb, + 0x51,0xf2,0xd5,0xf7,0x50,0x1e,0xa1,0x97,0xbe,0xf5,0x72,0x47,0x54,0x28,0x2c,0x77, + 0x83,0x34,0x50,0x23,0x2,0x6b,0x16,0x85,0xc3,0xc,0x9e,0xbf,0xa8,0x10,0x2f,0x22, + 0x20,0xac,0x4a,0x26,0xbd,0xcd,0xf,0xee,0x94,0x24,0x35,0x9a,0x5a,0xdf,0x84,0xc1, + 0x33,0xe1,0x66,0x8d,0x9a,0x49,0xeb,0xc4,0x14,0x9,0x2f,0x15,0x13,0x14,0x11,0x11, + 0x5d,0xb4,0x7d,0xd7,0x4c,0x3d,0x1a,0xe2,0x12,0x1a,0xd1,0xa8,0xc4,0x1d,0x1d,0x9a, + 0xd9,0xdf,0x8a,0x5a,0xf0,0xc1,0x4c,0xc0,0x45,0x9d,0xe9,0xe2,0x63,0x2e,0xcd,0x38, + 0xe1,0x42,0x5,0x3a,0x62,0xd,0x91,0xd6,0xe9,0x53,0x8b,0x5a,0xa6,0x8b,0x51,0x70, + 0x93,0xd5,0x86,0x2b,0x75,0x2e,0xf5,0x19,0xd,0x10,0x3a,0x54,0xab,0x69,0xe8,0xbc, + 0x3,0x85,0x5c,0x76,0x60,0x0,0x24,0x3e,0x71,0x95,0x3a,0x40,0x66,0x19,0x55,0x8, + 0xdc,0x8,0x30,0xda,0x68,0xb2,0x31,0xc3,0xf7,0xc4,0xac,0x23,0x47,0xf0,0x13,0xcb, + 0xdc,0xbd,0xaf,0xa1,0xba,0xe4,0xc2,0x8,0x1b,0xc8,0x40,0x53,0xae,0xb3,0x3a,0xa9, + 0xbc,0x44,0xd7,0xb7,0x83,0xe3,0xe6,0x7d,0x58,0xf6,0x27,0xe7,0x55,0x54,0xc7,0xb5, + 0x47,0x75,0x28,0x92,0xb4,0xfd,0xf4,0x9d,0xde,0x33,0xb6,0x7f,0x99,0xd0,0x6,0x64, + 0x96,0xcc,0xcc,0x33,0x51,0xa7,0xaf,0x51,0xd,0x6a,0x7f,0xf9,0xb0,0x31,0xb7,0x1e, + 0x6a,0xe1,0xbe,0x0,0xe1,0x2c,0xbb,0x65,0xd3,0x1e,0x77,0x89,0xb5,0xe2,0x88,0x9c, + 0x65,0x61,0x1d,0x95,0x3e,0x68,0x36,0x3b,0x27,0xaa,0xe3,0x2b,0x30,0xf4,0x53,0x89, + 0x68,0x88,0xaa,0x81,0x93,0x18,0x43,0x4b,0xe2,0xea,0xb,0x74,0xe1,0x90,0xf8,0x70, + 0xb3,0x20,0x16,0x38,0x6b,0xe8,0xb6,0xf0,0xfd,0xee,0x13,0xab,0xc3,0xf3,0xab,0x2e, + 0x6b,0x4d,0xb7,0x9b,0xd4,0xf2,0x7f,0x89,0xe4,0x87,0xc8,0x8f,0x74,0x73,0xbd,0xd9, + 0x5b,0xcd,0x50,0xa4,0xb1,0x3b,0x2b,0x8c,0xf1,0x1d,0x78,0x50,0xa4,0x80,0xea,0x89, + 0xa0,0xf4,0xb5,0xf,0x8,0x2c,0x98,0xdf,0x78,0xbe,0x86,0x92,0x0,0x54,0x0,0xad, + 0xd3,0x4a,0xca,0x93,0xaa,0x1c,0xa2,0x4e,0xb8,0xcc,0x48,0x62,0x5,0x6d,0x27,0xb0, + 0xc6,0x75,0xd1,0xa3,0x4f,0xcf,0x58,0xdf,0x96,0x9a,0xb,0x95,0x29,0x64,0x3e,0xfd, + 0x7f,0xbe,0xbd,0x6a,0xed,0x7f,0xde,0x73,0xf2,0xbd,0x7f,0xf5,0xa1,0x2d,0xb5,0xc7, + 0xf6,0x6b,0xef,0x7b,0xef,0x79,0xdb,0x2f,0xff,0x9d,0x5d,0xbf,0x78,0xc5,0x2b,0xf7, + 0xe1,0x6f,0x4f,0x9e,0xb9,0x7f,0xd9,0xfa,0xaf,0xfc,0xdb,0xa9,0x8b,0xf7,0xec,0x59, + 0x78,0xf8,0x84,0x13,0xe7,0x7e,0x76,0xcd,0x5b,0x1f,0xdb,0xb7,0x7e,0xc3,0xe1,0x85, + 0x7b,0x9f,0x3d,0x6e,0xd3,0x27,0x3f,0x7e,0xe6,0xf4,0x13,0x8f,0x2f,0x39,0x78,0xfa, + 0x4b,0xe,0x3d,0xf0,0xf6,0x1b,0x1f,0x9d,0x5b,0xb9,0xf2,0x5,0x33,0x11,0x3d,0x76, + 0x4c,0x2f,0xbb,0xf5,0xc3,0xeb,0x56,0x3e,0xb2,0x6d,0xfa,0x9e,0x4f,0xdc,0xbe,0x59, + 0x4d,0x44,0x8e,0xd,0xf5,0xb2,0x5b,0x3f,0x34,0xfe,0xd9,0x1d,0x9b,0x25,0xe8,0x40, + 0x47,0x80,0xf9,0x35,0xd7,0xbf,0x75,0x53,0xf3,0xfd,0x2f,0x2c,0x5a,0x74,0xec,0x99, + 0x8b,0x2f,0xdd,0xfb,0xe0,0x95,0xd7,0x3e,0x69,0xc7,0x2d,0xb4,0xd7,0x5c,0xff,0x96, + 0x4d,0x22,0x22,0xdf,0xba,0xed,0x8e,0xcd,0xb1,0x5e,0x68,0x72,0xe2,0x4f,0x7f,0xbc, + 0xf4,0xdc,0x2f,0xfe,0xeb,0xe9,0x8b,0xf7,0xec,0x5e,0x78,0x64,0xd5,0x9,0x73,0x5b, + 0xfe,0xe0,0xaa,0x27,0xf6,0x5c,0x78,0xf1,0xec,0x6b,0xdd,0x7b,0xcc,0x44,0x9a,0x7f, + 0xdf,0x73,0xdb,0x1d,0x9b,0x5f,0xf5,0xde,0x77,0x9f,0xbf,0x68,0xff,0xfe,0x5,0xf7, + 0xbe,0xef,0x96,0x87,0xe,0xad,0x39,0x6d,0x6e,0xe9,0x13,0x8f,0x2f,0xfc,0xd5,0xf, + 0xbc,0x6f,0xe3,0x91,0xe5,0xcb,0x9f,0xff,0xdf,0xf,0xdd,0xfa,0xe0,0x6b,0xdf,0xf1, + 0xe6,0xf6,0xb5,0xa2,0x22,0xaf,0x7d,0x47,0xf3,0x59,0x77,0x6e,0x36,0x17,0xd,0x86, + 0x16,0x13,0x91,0x7e,0x22,0x46,0xf5,0x78,0xd4,0x14,0x38,0xa9,0xe8,0xe4,0x2,0x8f, + 0x11,0xc2,0x1f,0xe1,0xb,0x5a,0xb5,0x6e,0x27,0xa9,0xec,0x21,0xa1,0x5d,0xa7,0xb, + 0x3c,0xbc,0x4b,0x54,0x50,0x49,0x72,0xc4,0x26,0xe1,0x8,0x2d,0x25,0x9,0x5a,0x95, + 0x17,0xd1,0x33,0x52,0x24,0xf3,0x8a,0x7c,0x8,0x52,0x74,0xa5,0x6d,0x3f,0x95,0xe8, + 0x1f,0xe1,0x2b,0x21,0x70,0xa0,0xca,0x4,0x11,0x25,0x66,0x39,0x9,0x35,0x7c,0x84, + 0xff,0x8,0x41,0x90,0x1,0x64,0x4c,0x11,0xab,0x16,0x3c,0x45,0xd5,0x44,0x6c,0x98, + 0xd3,0x2a,0x60,0x92,0x2a,0x7c,0x3d,0x50,0x5f,0xd2,0xa7,0xa9,0x1d,0x42,0x84,0x93, + 0xa3,0x34,0xb,0x46,0x35,0x19,0xc2,0xa3,0x10,0x1,0x57,0x39,0xe9,0x2d,0x3b,0x19, + 0xd5,0xa6,0x3,0x2e,0x88,0xe4,0x8a,0x8a,0xa5,0xac,0xd9,0x93,0xf7,0xb2,0x12,0x68, + 0x4,0x7b,0x48,0xf9,0xd0,0xb3,0xd8,0x6b,0x81,0xbb,0xf,0xc4,0xb4,0x27,0xe7,0xf6, + 0xe2,0x47,0x82,0x87,0xf,0xc5,0x52,0xfb,0x83,0x84,0xea,0x4b,0x98,0x11,0x18,0xa9, + 0x57,0x18,0x2b,0x2f,0xb2,0x91,0x27,0xfb,0x15,0xee,0x65,0xe2,0x50,0x68,0x53,0xb2, + 0xa7,0x74,0xc8,0x86,0xe7,0xa6,0x98,0x5a,0xb5,0x70,0x19,0x4b,0xb8,0xee,0x27,0x6e, + 0x1f,0x8f,0xc9,0x7d,0xec,0x82,0x42,0x87,0x47,0xc,0xf9,0xbc,0x74,0x36,0x4b,0x5, + 0xca,0x70,0x50,0x44,0x6,0x45,0xac,0x94,0x51,0xb,0x58,0xf3,0xf7,0x41,0x19,0xb5, + 0x6f,0x94,0x22,0x36,0x50,0x91,0x81,0x8e,0x7e,0x36,0x28,0xdd,0x6b,0x4a,0x91,0x5, + 0xb3,0x7,0xa6,0xce,0xf9,0xf2,0x17,0x4f,0xdb,0x7d,0xd1,0xa6,0x7d,0x56,0x46,0x6d, + 0x40,0x56,0x54,0xac,0x94,0xf0,0xf7,0x3d,0x17,0x5d,0xbc,0x7f,0xc3,0x97,0x3e,0x7f, + 0x5a,0x39,0x3a,0x57,0x9a,0x9f,0x59,0x19,0x7d,0xe6,0xd9,0x5f,0xbd,0x7b,0xcd,0xe2, + 0x67,0xf7,0x2c,0xfc,0xe1,0xbb,0x6e,0xda,0x76,0xfc,0xee,0xa7,0x17,0x5d,0x70,0xd7, + 0xed,0x6b,0x45,0x55,0x36,0x7c,0xe9,0xb,0xa7,0x2c,0xdf,0xf9,0xe8,0xf1,0x5b,0xde, + 0x78,0xf5,0xce,0xe5,0x3b,0x1f,0x5d,0x7a,0xce,0xdd,0x5f,0x58,0x63,0x45,0x65,0xc5, + 0x8e,0x6d,0x4b,0x5e,0xfe,0x91,0xf,0x9c,0xbd,0xf2,0x91,0x6d,0xd3,0x22,0x22,0x52, + 0x8a,0x2c,0xdf,0xb1,0x6d,0xc9,0xcb,0x3f,0x72,0x4b,0xfb,0x33,0x6b,0xbe,0xdb,0x5d, + 0xaf,0x14,0x95,0xe1,0xf8,0x7b,0x9b,0x3f,0xf7,0x7c,0xe2,0xf6,0xcd,0x8f,0xfe,0xd6, + 0xeb,0x77,0x9d,0xfa,0xfd,0xef,0x9e,0xb8,0xe1,0xdf,0x3f,0xbf,0xc6,0x6,0xae,0x37, + 0x78,0xfc,0x19,0x32,0x18,0x8d,0x83,0x94,0x22,0x67,0xdd,0xf3,0xb5,0xd5,0xb,0xf7, + 0xed,0x5b,0x70,0xff,0xbb,0xff,0x64,0xdb,0x92,0x3d,0xbb,0x17,0x5d,0xf8,0x99,0x4f, + 0xad,0xf5,0xef,0x69,0x5f,0xdf,0xfc,0x29,0x2a,0xfb,0xd7,0xad,0x9f,0x15,0x11,0x59, + 0xb5,0xe5,0xc1,0xe3,0xad,0xa8,0x9c,0xb0,0xe5,0xc1,0xa5,0x22,0x22,0xfb,0xcf,0x3a, + 0x7b,0x36,0xc8,0x59,0x36,0xd7,0xe9,0x3e,0xab,0xb9,0x7,0x19,0x14,0x19,0xe,0x46, + 0xcf,0xc2,0xda,0xeb,0xea,0x9e,0x99,0x94,0xee,0x79,0x49,0x73,0x8f,0xe1,0x59,0x8d, + 0x9f,0xc9,0xc0,0x3f,0xa3,0xd1,0x6b,0x64,0x50,0x46,0xb,0xb6,0xf9,0xec,0x81,0x8e, + 0x84,0x7f,0x54,0xbb,0xef,0x1b,0x8c,0xfe,0x93,0x12,0x3f,0xb3,0x7d,0x4f,0xf3,0x6f, + 0x77,0xd,0x52,0x54,0x64,0x20,0xed,0xcf,0x6d,0x50,0x64,0xe8,0xae,0xaf,0x99,0x43, + 0xd6,0x5e,0xd3,0xe8,0x77,0xc3,0x32,0xba,0xd7,0xf6,0x3a,0x7,0xdd,0x3d,0x5a,0x51, + 0x19,0xba,0x31,0xb6,0xf,0xc6,0x83,0x0,0x0,0x18,0xc,0x49,0x44,0x41,0x54,0x18, + 0xba,0xcf,0x6e,0xef,0xbb,0xfd,0xfc,0xf1,0xef,0x7,0xa5,0xbd,0x76,0x69,0xee,0x79, + 0xfc,0xdd,0xdd,0x3d,0x97,0xf6,0x1a,0x6c,0x3c,0x1e,0x71,0xbc,0xa4,0x1d,0xb,0xf1, + 0xd7,0x5e,0xca,0xf8,0x1e,0xdd,0x9a,0x19,0xf8,0xdf,0xc7,0xf1,0xb1,0xe6,0x77,0xea, + 0xde,0x5f,0xc6,0xc2,0x18,0xed,0xd8,0xfb,0x71,0x75,0xf3,0xb8,0xc4,0x67,0xe7,0x3f, + 0x5f,0xda,0x71,0x68,0xfe,0x73,0x9f,0xdd,0x7e,0x9f,0xc6,0xb9,0x50,0x4a,0x37,0x36, + 0xea,0xef,0xbd,0x19,0x1f,0x69,0xaf,0x73,0xe8,0xee,0x37,0xdc,0xdb,0x54,0x37,0x86, + 0xc3,0x41,0x33,0xb6,0x6e,0x8c,0x6,0xf1,0x5e,0x46,0xfb,0x4d,0xf3,0x7d,0xdd,0xfd, + 0x34,0xe3,0xdc,0x5d,0xaf,0xbb,0x1f,0x37,0xf,0xa5,0x1d,0x7,0x89,0x73,0xa8,0x19, + 0xa3,0x29,0x98,0x8b,0x3,0x95,0xe1,0x40,0xe2,0xf5,0xe0,0x3a,0x18,0x74,0xe3,0x6b, + 0x5a,0xda,0xef,0xe8,0x9e,0x17,0x8c,0x2d,0x19,0xff,0x6e,0x7e,0xd,0xdc,0xf3,0x1a, + 0x8f,0x8d,0xfa,0xfd,0x33,0xee,0x91,0xa3,0xb1,0x76,0xcf,0xa8,0x5d,0xd3,0xd2,0xce, + 0x55,0x2b,0xdd,0x7c,0x35,0x37,0x77,0xdb,0xfd,0xa9,0x14,0xb7,0x76,0xb4,0x7d,0x86, + 0xcd,0xd8,0xfb,0xfb,0xc,0x7b,0xc2,0xa0,0x74,0xfb,0xe1,0x78,0xad,0xc,0x4b,0xf7, + 0xb3,0x6e,0xff,0x1c,0xe4,0xbd,0x68,0x7c,0xcd,0xc3,0xf1,0x98,0xe,0x9b,0x79,0x3f, + 0xe8,0xce,0xc,0x1c,0x1f,0x1b,0x94,0x6e,0x9e,0xb5,0xcf,0xb8,0x9b,0x83,0xed,0x1c, + 0x1d,0x94,0xb0,0x86,0xbb,0xfd,0xad,0x8c,0xf7,0x2b,0x4d,0x6b,0x4b,0xdc,0x5a,0x16, + 0xf6,0xdc,0xe8,0x5e,0x36,0x70,0x6b,0x39,0xce,0x25,0x29,0x7e,0x6f,0x95,0x6e,0xfe, + 0xf,0xdc,0x1a,0x1e,0xc0,0x1e,0x52,0xe2,0x75,0x8b,0xdb,0x7b,0xba,0x71,0x72,0xcf, + 0xb0,0xd9,0x73,0x6,0x65,0xb4,0xa7,0xd,0xe2,0x3a,0x6e,0x9e,0x49,0xb8,0xa6,0x76, + 0xf,0xed,0xf6,0xb1,0x76,0xc,0x8b,0x8e,0xed,0x53,0xdb,0x16,0xbb,0x12,0x22,0x22, + 0x6b,0x3,0x17,0x67,0xdd,0x7,0x21,0xd6,0xda,0x6f,0x7e,0xed,0xc4,0xa9,0xb9,0xb9, + 0xc1,0xb3,0xe7,0x5f,0x30,0x2b,0x83,0x22,0xb,0x9f,0x79,0xfa,0xb8,0x8b,0x3f,0x75, + 0xdb,0xda,0xe9,0x9d,0x8f,0x1d,0x7f,0x64,0xe5,0xaa,0xb9,0x9f,0xbe,0xf9,0xba,0x9d, + 0xfb,0x36,0x9c,0xf7,0x7f,0xcf,0x9e,0x77,0xfe,0xec,0x19,0xff,0xf5,0x1f,0xab,0xd7, + 0x7e,0xfb,0x9b,0x27,0x6c,0xff,0xed,0xdf,0xdb,0x6d,0x4e,0x71,0xe8,0xde,0xf7,0x7f, + 0x70,0xab,0x8a,0xc8,0x82,0xfd,0xfb,0xa7,0x44,0x44,0x16,0x3f,0xbb,0x67,0xa1,0xc, + 0x54,0x56,0x6e,0xdb,0x3a,0x2d,0x22,0xb2,0xeb,0x65,0x97,0x1d,0x38,0xff,0xb3,0x9f, + 0x91,0x95,0x3f,0xdf,0x32,0x6d,0xa5,0xc8,0xcb,0xff,0xe6,0x83,0x1b,0x66,0xd7,0x9c, + 0x7a,0xd8,0x1f,0x9a,0xec,0x67,0xea,0xdd,0x6a,0x8a,0xc5,0x9e,0xc4,0xe6,0xd0,0x3c, + 0x6e,0x20,0x4f,0xbe,0xea,0xd7,0xf7,0xae,0xff,0xea,0xdd,0xa7,0x9d,0xfc,0xc0,0xcc, + 0x8a,0x87,0xae,0x7e,0xd3,0x53,0xfe,0x33,0x22,0x4c,0x58,0xe4,0xbe,0x9b,0xff,0xe2, + 0x11,0x11,0x95,0xe5,0x8f,0x3c,0xbc,0x58,0x44,0xe4,0xc8,0xca,0x95,0x47,0x25,0x1c, + 0xe8,0x51,0x68,0xc1,0x4a,0x91,0xe7,0x36,0x9c,0x37,0xbb,0x7a,0xe6,0x87,0xab,0x56, + 0x6d,0xdb,0xba,0xf4,0xb1,0xd7,0xbc,0xfe,0xb9,0x95,0xf,0x6f,0x5d,0x2a,0x22,0xb2, + 0xf7,0xdc,0x8d,0x87,0x4,0x83,0x1,0xff,0xde,0x81,0xa6,0xc,0xcc,0x7,0xad,0x91, + 0x71,0xef,0xda,0xa8,0x24,0x2b,0xd1,0x35,0xc8,0xf3,0x30,0xa1,0xf0,0x36,0x76,0x92, + 0xd2,0x2c,0x93,0x29,0x1c,0xa6,0xaf,0x33,0x58,0x1d,0xf3,0xd9,0xd5,0x2c,0x53,0x8b, + 0x1b,0x8b,0xba,0x8b,0x10,0x62,0x1b,0xf4,0xfe,0x6,0xe2,0x9c,0xbb,0xae,0x40,0xac, + 0xe9,0xfc,0xc6,0xa3,0x75,0xac,0x57,0x31,0x14,0x27,0x82,0xa5,0x89,0x3f,0x3e,0xc, + 0x10,0x9c,0x52,0x7b,0x75,0xf,0x43,0x36,0xa2,0x30,0x41,0x5d,0xac,0x80,0xbc,0x2f, + 0x40,0x67,0x9e,0xd1,0x6b,0x50,0xce,0x30,0xa9,0xb,0xc,0x63,0x3d,0x51,0x82,0xcf, + 0x80,0x5,0x2f,0xeb,0xd8,0xf5,0xe1,0x4d,0x8d,0x34,0xd5,0x15,0x38,0x3,0xc2,0xe9, + 0x2d,0x68,0x6e,0x71,0xc,0xaa,0x63,0x66,0xc1,0x6e,0x35,0xa7,0xfc,0xd1,0xbb,0x5a, + 0xaa,0xbe,0xd4,0xdc,0x1b,0x20,0x64,0xc1,0x8d,0xce,0x3c,0x30,0x7e,0xb1,0xad,0xab, + 0xed,0xfd,0x6d,0xc4,0x3d,0x2a,0x7a,0xe3,0xd8,0xed,0x31,0xc,0xe6,0x24,0xc,0xfe, + 0x57,0xd0,0xf7,0x6a,0xfa,0xd9,0x9b,0x32,0x14,0xe8,0x55,0x84,0x36,0x3d,0xcd,0x90, + 0x6e,0x32,0xea,0xd0,0x2a,0xc1,0x19,0xc9,0x4,0xdc,0xa0,0x4a,0x3a,0x1,0xa9,0xd6, + 0x38,0x86,0x58,0x17,0x27,0xa7,0x47,0xe1,0x66,0x26,0xcd,0xdc,0xf1,0x2d,0x7f,0x28, + 0x62,0xe5,0xe7,0x52,0xf1,0x88,0x82,0x82,0x6e,0x48,0x1e,0xfb,0x50,0x55,0xf7,0xfb, + 0x9b,0x46,0x19,0xd7,0xdc,0x3d,0xc4,0x3b,0xa6,0xda,0xac,0xb7,0x68,0x57,0xda,0x2d, + 0x2a,0x4c,0xa8,0x3c,0xf5,0xfc,0x13,0x35,0x4a,0x1,0x67,0x39,0x51,0x4d,0x55,0xbd, + 0xe0,0xcc,0xa2,0x5d,0x2f,0xb9,0x54,0xc,0xb6,0x2c,0xf1,0xbd,0x70,0x1d,0x58,0x40, + 0x7,0x87,0xce,0xb3,0xc2,0x6b,0x82,0xb4,0xc2,0x3e,0xe3,0x7f,0x4f,0x35,0x87,0x56, + 0xf7,0x35,0x25,0x6c,0xdf,0x46,0xbc,0x88,0x3d,0x2b,0xf7,0xa4,0x9f,0xfd,0x64,0x85, + 0x88,0xc8,0xc1,0x33,0xce,0x98,0x1b,0x16,0x91,0xb,0xff,0xe9,0xf6,0x97,0x2c,0x7f, + 0x74,0xc7,0xd2,0x99,0x77,0xde,0xf8,0xc8,0x25,0xb7,0x7d,0xec,0xec,0xb,0xee,0xba, + 0xe3,0x8c,0xef,0xdc,0xf2,0xe1,0x2d,0x7,0xce,0x38,0xf3,0x88,0x88,0xc8,0x29,0xf7, + 0xff,0x60,0xd5,0x23,0xbf,0xfb,0xfb,0xbb,0x59,0x55,0x63,0xed,0xb7,0xbe,0x7e,0xa2, + 0x88,0xc8,0xbe,0xb3,0xd7,0x1f,0xb4,0x81,0xca,0x82,0x83,0x7,0x8e,0x13,0x11,0x39, + 0xba,0x6c,0xd9,0x31,0x11,0x19,0xfd,0x7b,0xa0,0xf2,0xdc,0xb9,0x1b,0xf,0x3c,0xf0, + 0xb6,0x3f,0xda,0xf9,0xea,0x9b,0x6e,0xb8,0x70,0x94,0x49,0x17,0x79,0xee,0xdc,0x8d, + 0x7,0x36,0xbf,0xed,0xfa,0x9d,0xbf,0x79,0xd3,0x8d,0x17,0xb6,0x87,0xb1,0x17,0x4f, + 0x70,0xac,0xca,0x0,0x11,0x17,0x95,0xb9,0x15,0x2b,0xdd,0xe7,0x97,0x78,0x38,0x7, + 0xcb,0xbc,0xf1,0x81,0xa0,0x26,0x97,0xfd,0xed,0x87,0xd6,0xcf,0x4d,0x2f,0x3b,0xba, + 0xf9,0x9d,0x37,0x3e,0xea,0xf,0xf1,0xd7,0x5d,0x77,0xed,0x26,0x3c,0x94,0xf7,0xbc, + 0xf4,0xa5,0x87,0xe4,0x73,0x22,0x2b,0xb6,0x3f,0xbc,0x54,0x6,0x2a,0xcb,0x77,0x3c, + 0xb2,0x54,0x44,0x64,0xcf,0x5,0x17,0xcc,0x7a,0xe5,0xb6,0xd7,0xfd,0x21,0xbc,0xb7, + 0x94,0x8c,0x39,0x92,0x82,0x4d,0xe7,0x64,0xe7,0x45,0x7,0xcc,0xd9,0x80,0xc2,0x54, + 0x6e,0x64,0x47,0x5b,0xa9,0x43,0x6b,0xbd,0xae,0x87,0x81,0xe,0xa6,0x89,0xab,0xc6, + 0x6a,0xcc,0xed,0xf6,0xef,0x30,0xe3,0xa1,0x5b,0xa6,0x19,0xee,0x84,0x39,0x16,0xd6, + 0x69,0x71,0x86,0x5,0x25,0xef,0x68,0x41,0xfc,0x41,0x5a,0xad,0xa1,0x68,0xd8,0xe2, + 0xea,0x61,0x49,0x7f,0x3c,0x7,0x20,0x28,0xc,0x25,0x81,0x11,0xef,0xf,0x2c,0xe9, + 0x16,0x2a,0xe8,0xc,0x98,0x39,0x86,0x71,0xbb,0x64,0x8a,0xa0,0x5f,0x73,0xf3,0xb1, + 0x5e,0x5c,0xc7,0x9b,0x35,0x18,0x8,0xa2,0x48,0x2a,0xb3,0x38,0x6b,0x58,0xed,0x8c, + 0x2d,0xcc,0xd9,0xe0,0xe,0x35,0xdb,0xff,0x70,0x91,0x25,0x64,0xe5,0x46,0x4b,0xc7, + 0x4e,0xe4,0xa6,0x0,0x74,0xcd,0x3a,0xf4,0xc7,0x9b,0x6b,0x29,0xe,0x16,0x66,0x46, + 0x48,0x4a,0x8,0xac,0x9d,0xcd,0x32,0x92,0x48,0xbd,0x9d,0xb3,0x2b,0xaa,0xc6,0x29, + 0x54,0x26,0x97,0x95,0xbc,0x40,0x93,0x59,0x5c,0x27,0x5e,0xb5,0xab,0x55,0xad,0x2c, + 0x9d,0x86,0x40,0x10,0xa7,0xf1,0x4,0xb3,0x10,0x0,0x4a,0x78,0xce,0x59,0x7f,0x3f, + 0xf7,0x5e,0xc,0xdd,0xe1,0x64,0xa0,0x40,0x29,0xae,0xb7,0x7e,0x8,0x63,0x8d,0x6d, + 0x8a,0x66,0xd1,0x42,0x33,0x1e,0xd1,0x5,0xf8,0x40,0x15,0x61,0xad,0x26,0x28,0x15, + 0xdf,0xa7,0x1f,0x6d,0x7c,0x83,0xac,0x2b,0x69,0x63,0x4b,0xe2,0x43,0x29,0x18,0xf6, + 0x24,0xbe,0xec,0xb4,0xc6,0x70,0xf2,0x61,0xb0,0xb4,0xf6,0x25,0xdf,0x32,0x86,0xbe, + 0x8b,0x13,0x35,0xf2,0x3e,0x24,0xbe,0xad,0x34,0x2a,0x5,0x32,0x3,0x1d,0x6d,0xdd, + 0x30,0x7d,0xb2,0x33,0xe,0xc6,0x4a,0x26,0xd0,0x71,0xc8,0x5b,0xd2,0x3c,0xf7,0x22, + 0x6a,0x5d,0xec,0x59,0xba,0xe7,0x5c,0x72,0xd0,0xd3,0x9a,0x52,0x89,0x42,0xcb,0x20, + 0x58,0x50,0x93,0x31,0x9f,0xb2,0x41,0x71,0x24,0x32,0xe5,0xb6,0x72,0x4a,0xe8,0xf4, + 0xe3,0xbf,0x2f,0xde,0xb3,0x7b,0xa1,0x88,0xc8,0x91,0x15,0x2b,0x5f,0x10,0x2d,0xb2, + 0x7c,0xfb,0xe8,0xb0,0x7a,0xfa,0xd2,0xcb,0xe,0x7e,0xe3,0xf6,0x7f,0xde,0xdc,0x7c, + 0xeb,0xdc,0xaa,0x15,0x2f,0x88,0x88,0x2c,0x79,0x66,0xd7,0xa2,0xe6,0x3b,0xbd,0x26, + 0xf2,0xa9,0xf7,0x7e,0x67,0xc5,0x99,0xdf,0xfa,0xc6,0x29,0x73,0xd3,0xd3,0x47,0x7f, + 0xfa,0x96,0xeb,0x9e,0x68,0x34,0x93,0x31,0x73,0xb5,0xa2,0x72,0xdf,0xcd,0x7f,0xbe, + 0x3d,0xdc,0xc5,0x40,0xe4,0xbe,0xf7,0xfe,0xd9,0xf6,0x78,0x90,0x16,0x3a,0xdc,0xa9, + 0x22,0x58,0x4a,0x88,0x5a,0xbd,0x72,0x9e,0xd,0xc6,0x6a,0x49,0x45,0xa1,0xb8,0xa8, + 0xf2,0x83,0xf7,0xdc,0xfc,0xf0,0x2b,0xfe,0xfa,0xfd,0xe7,0x5e,0xfc,0x8f,0xb7,0x9d, + 0xf1,0xdd,0xbf,0xbc,0xe5,0xe1,0xe6,0x3d,0xdf,0xb8,0xf3,0xae,0xcd,0x26,0x22,0x97, + 0xbf,0xf9,0xea,0x4d,0x4d,0x60,0x31,0x7b,0xfa,0x4b,0xe6,0xe6,0x96,0x2d,0x3b,0xba, + 0x70,0xff,0xfe,0x5,0x27,0x3d,0x30,0x33,0xbd,0xf0,0xc0,0x81,0xe3,0x9e,0x5f,0x3a, + 0x7d,0xf4,0xe0,0x19,0x6b,0xe7,0xfc,0x82,0xf8,0xfa,0x9d,0x77,0x6d,0x56,0x55,0x79, + 0xfd,0x9b,0xae,0xda,0xd4,0xde,0xb7,0x7a,0x8d,0xe7,0x5a,0x76,0xdc,0x6f,0xd7,0x62, + 0xc8,0xa,0xc,0x87,0x9e,0x6f,0x65,0x6a,0xb4,0x3,0x24,0x15,0xee,0xb2,0xd,0x22, + 0x9a,0x17,0xc4,0xcc,0xcb,0xc6,0xe,0x6d,0x48,0x76,0x4a,0x3e,0xf6,0xb0,0x4f,0x8f, + 0x14,0xb3,0x9c,0x87,0x3c,0xa9,0x8b,0x75,0x76,0x84,0x4d,0x12,0x52,0x40,0xeb,0x80, + 0x48,0x0,0xb8,0x3,0x24,0x65,0xfe,0xc5,0x40,0xd6,0xd4,0x19,0x5a,0x8,0x53,0xe3, + 0x63,0x35,0x47,0xe7,0xfa,0x94,0x6a,0x83,0xf1,0x1e,0x3b,0xa5,0x5a,0xd,0xd2,0xab, + 0xde,0xb3,0x3e,0xf2,0x8d,0x72,0x7d,0xd7,0xa8,0x6,0xba,0xb9,0x67,0xd,0xda,0xec, + 0xe1,0xe0,0x80,0x62,0xae,0x45,0x8f,0x70,0x6f,0x33,0xab,0x1a,0x69,0x6a,0x46,0x24, + 0x81,0x5,0xeb,0xa7,0x21,0xc0,0xd1,0x60,0x8b,0xac,0xa0,0xc0,0xd2,0x5,0x5d,0x25, + 0x71,0xbe,0xa3,0x49,0x50,0xa7,0x94,0x85,0x3c,0x89,0x38,0xeb,0x33,0x2d,0x34,0xb4, + 0x67,0xe5,0xd6,0x80,0x36,0xd1,0x9,0x56,0xb3,0xd8,0x85,0x62,0xa0,0xd3,0x4f,0x48, + 0x7b,0x91,0x84,0x59,0xd2,0x57,0x99,0xd7,0x90,0x90,0xee,0xf0,0x54,0xa7,0x1c,0x99, + 0x50,0x86,0x92,0x6d,0x80,0x87,0x81,0x75,0x52,0x12,0x69,0xb0,0x3b,0xc8,0xbd,0x22, + 0x9c,0x39,0x5f,0x0,0xcb,0xc8,0x59,0x8b,0xde,0x8d,0xa5,0x4d,0xc7,0x23,0x6c,0x21, + 0x30,0x67,0xca,0xe3,0x85,0x92,0x95,0x7d,0x3b,0x5c,0xa,0xe4,0x8b,0xcf,0x47,0x40, + 0x96,0xd7,0xa1,0x75,0x59,0xc7,0x42,0x13,0xb9,0xcc,0x20,0x2b,0x36,0x24,0x45,0x57, + 0x8c,0x51,0xd0,0x49,0xb4,0x73,0xbb,0xb3,0x76,0xf,0x8a,0xdb,0x68,0x9,0x4b,0x31, + 0xf7,0x4d,0x6a,0x66,0x5a,0x7,0xa4,0x45,0xa3,0xb4,0x77,0x74,0xfb,0xd,0x7b,0x69, + 0x3c,0xc0,0xdd,0xda,0x7,0xe,0x89,0x85,0x4c,0x64,0xf4,0xff,0xa9,0x70,0x58,0x11, + 0x53,0xb8,0xc8,0xc5,0x89,0x96,0xa4,0xa1,0x3f,0xac,0xa8,0xc8,0x54,0x71,0x6e,0x78, + 0xa6,0xc3,0x32,0xda,0x29,0x55,0x54,0x86,0xc3,0xc1,0x68,0x32,0xe,0xa6,0xac,0x3d, + 0x3c,0xc6,0x5a,0xc8,0xab,0xb6,0x6e,0x59,0x72,0xe1,0x9d,0x9f,0x5e,0x7b,0x68,0xcd, + 0xa9,0x87,0xef,0x7f,0xf7,0x4d,0xdb,0xf,0xaf,0x5e,0x7d,0x54,0x45,0x64,0x6e,0xd9, + 0xb2,0x17,0x16,0xed,0xdf,0x7f,0xdc,0xd4,0x91,0xc3,0x3,0x11,0x91,0xe7,0x97,0x2d, + 0x3b,0xda,0x64,0xcd,0xa1,0x25,0xb2,0xc,0x92,0x7,0x52,0x7,0x57,0x77,0xd6,0x8c, + 0xde,0x2,0xcf,0x7,0x8,0xc7,0x1d,0x38,0x30,0x10,0x11,0x39,0x7c,0xc2,0x9,0x73, + 0xe2,0x21,0xf3,0x22,0xc1,0x1a,0xd1,0xbf,0x77,0xff,0xfa,0xf5,0x47,0x44,0x44,0xa6, + 0x1f,0xdf,0x79,0xbc,0x41,0x10,0x60,0x18,0x58,0x98,0xc8,0xbe,0xb3,0xd7,0xcf,0xae, + 0x9e,0xf9,0xd1,0xca,0xb3,0xbf,0x72,0xf7,0x6a,0x11,0x91,0x7d,0xeb,0xd7,0x1f,0x92, + 0xa2,0xd1,0x3,0x7d,0x0,0x87,0xf6,0xa0,0x54,0x5a,0x5a,0xdc,0x86,0xda,0x9,0x7b, + 0x7,0x26,0x26,0xc4,0xf4,0x9d,0x40,0x2,0x5a,0x2f,0x42,0x94,0xdb,0x46,0xc7,0x1a, + 0xad,0x14,0x19,0x20,0x2b,0xc0,0x88,0xf7,0x86,0x2d,0x2d,0x72,0xe0,0x82,0x73,0x6b, + 0x56,0x32,0x55,0x8b,0x80,0x5e,0x5b,0xb0,0xfc,0x14,0xc8,0x39,0xb3,0xa7,0x71,0x94, + 0xda,0x6d,0xca,0x2c,0x66,0x5e,0xf7,0x7f,0xc,0x85,0x13,0x3,0x1d,0x13,0xa1,0x6, + 0xa,0x7e,0x2f,0x18,0x86,0xc3,0xac,0xb1,0xe,0x75,0xb,0xbe,0xd5,0x68,0xee,0x50, + 0xa0,0x4c,0x3e,0x2,0x93,0x1c,0x78,0x6,0x5c,0x78,0x45,0x5b,0x43,0x9,0x55,0x83, + 0x40,0x0,0x5f,0xd5,0x5e,0x4a,0x80,0x6e,0x23,0xd4,0x8e,0x8c,0x77,0x4d,0xed,0xaa, + 0xa3,0x40,0x36,0xc2,0x92,0x6,0x87,0x97,0x29,0xb4,0x45,0x79,0x2b,0xcc,0x16,0x62, + 0x15,0x57,0x96,0x18,0x1b,0x2,0xb5,0x3e,0xd1,0x25,0x74,0x56,0x19,0x18,0x22,0x79, + 0x5d,0x72,0x7f,0x58,0x19,0xcb,0x77,0xb5,0x93,0x1,0x56,0x29,0xed,0xe7,0x75,0x6e, + 0x54,0x6e,0x4f,0x73,0x70,0xb4,0x56,0x8c,0x79,0xc2,0xd8,0x99,0xc1,0x3a,0xc8,0xbe, + 0x16,0x89,0x3b,0x5c,0xd4,0x25,0xa5,0x71,0x5f,0x35,0x2f,0x77,0x1a,0x32,0x46,0xad, + 0x92,0xc8,0xda,0xb5,0x3,0xa5,0x9d,0x10,0xac,0xa5,0x7d,0xa,0x4c,0xa3,0x4a,0xb7, + 0xb1,0xf9,0x32,0x55,0x68,0xa9,0x54,0x28,0x11,0x0,0xfc,0x9f,0xbc,0xcb,0x53,0x9a, + 0x58,0x72,0x20,0x9,0xfa,0xf9,0x11,0xf9,0xf5,0x87,0x3d,0xb0,0x3,0x4b,0x3e,0x8c, + 0x33,0x89,0x92,0x58,0x1b,0x26,0x95,0x36,0x68,0xbf,0x6d,0xd1,0x36,0xab,0xb0,0xf9, + 0x19,0x84,0x27,0x24,0x43,0x40,0xd5,0x2b,0xab,0x3a,0xaa,0x61,0x7b,0x2b,0x79,0x58, + 0xe2,0x60,0x22,0x87,0xc8,0x56,0x6b,0x5d,0x9e,0x6e,0xdf,0xfe,0x7f,0xaa,0x81,0x8b, + 0x5b,0x71,0xf,0xd2,0xf6,0xc4,0xb2,0x8e,0x66,0xd2,0x1f,0x3a,0xe5,0x94,0xb9,0xe9, + 0x27,0x9f,0x5c,0xbc,0xe0,0xe0,0xc1,0xa9,0x23,0x27,0x9e,0x70,0x74,0xff,0xba,0xb3, + 0x67,0x57,0x6d,0xdd,0xb2,0xec,0xa4,0xcd,0x33,0xd3,0x97,0x7e,0xfc,0xd6,0x75,0xb3, + 0x6b,0xd6,0x1c,0xfe,0xce,0x87,0x3f,0xb2,0x75,0xd1,0xfe,0xbd,0x53,0x22,0x22,0x87, + 0xd6,0x9c,0x72,0xd8,0x1f,0x7a,0x26,0x22,0xe7,0x7c,0xe9,0xb,0x6b,0xf6,0x6e,0x38, + 0xf7,0xe0,0xfd,0x7f,0xfc,0x9e,0x47,0x87,0x8b,0x16,0xf,0x9b,0xe9,0xb0,0x77,0xc3, + 0xb9,0x7,0xd7,0xfc,0xe0,0xbe,0x55,0xab,0x7f,0x78,0xff,0x32,0x11,0x91,0xe7,0xce, + 0xdb,0x78,0xb0,0x35,0x7f,0x29,0xfe,0x50,0x16,0xe7,0x27,0xeb,0x36,0xd2,0xb1,0x3b, + 0x4e,0x9b,0x2c,0xba,0x8c,0xc3,0x1f,0x9a,0xa7,0x7e,0xef,0x7b,0xcb,0x45,0x44,0x9e, + 0x7e,0xd9,0xaf,0xec,0xb,0x46,0x32,0xcd,0xd8,0xb8,0x71,0x7c,0xe5,0x9f,0xde,0x7c, + 0xce,0xf1,0x4f,0x3d,0xb5,0x78,0xf3,0xd,0x37,0xee,0x10,0x11,0x39,0x70,0xe6,0x99, + 0x87,0x2,0x4c,0xaf,0xc0,0x96,0x1c,0x7f,0xde,0x73,0x1b,0x37,0xce,0xae,0x9e,0xf9, + 0xd1,0xca,0x15,0x3b,0xb6,0x2f,0x1d,0xdd,0xcb,0x79,0xb3,0x9e,0x4c,0xd7,0xa1,0x5, + 0x3e,0x18,0x40,0xc7,0x27,0x74,0x85,0xea,0x6a,0x56,0x99,0xfd,0xd8,0x79,0x69,0x77, + 0x41,0xa5,0x77,0x74,0x53,0xa8,0x63,0x91,0x9a,0x1e,0xf4,0x71,0xa6,0x75,0xe3,0x45, + 0x77,0xc6,0x75,0xaa,0x20,0x23,0xd6,0x64,0x68,0xcd,0x6b,0x34,0x1b,0xc8,0x64,0x3e, + 0x72,0x86,0xc3,0x72,0x44,0x9c,0x33,0xae,0xe0,0x97,0x6e,0x46,0xb0,0x74,0x6d,0x8d, + 0x17,0x6c,0x5e,0x6d,0x3b,0xb1,0x77,0xd8,0x7,0x85,0xed,0xba,0xd3,0xe2,0x82,0x15, + 0xaf,0x6f,0x5f,0xba,0x92,0xc3,0x18,0x86,0x36,0x52,0xb7,0xa4,0x35,0x48,0x6c,0xbc, + 0x6e,0x75,0xbc,0x3b,0x38,0xdd,0x73,0x26,0xfc,0xa6,0x67,0xad,0xfd,0xae,0xcb,0x32, + 0xa4,0xb3,0xbd,0x95,0x36,0xa0,0x89,0x95,0xba,0x66,0x6e,0xd,0x61,0xe,0x8,0x18, + 0xc6,0x30,0xbb,0xcb,0xce,0xf0,0xa6,0xa4,0xb6,0x73,0x64,0x9c,0x1b,0xc0,0xfc,0x2, + 0x1e,0xec,0x29,0xa3,0xf1,0xda,0xdb,0x30,0x7c,0x96,0x54,0x99,0xba,0x7f,0xc7,0x16, + 0x53,0x5f,0x3a,0xd0,0xd4,0x76,0x65,0x8c,0xb1,0x2f,0xd9,0x6b,0xbc,0x97,0xa6,0xad, + 0xa0,0x91,0xee,0x4a,0x2d,0xc9,0x9c,0xcb,0x9,0x97,0x5b,0x68,0xf7,0xb2,0x9,0x7d, + 0x9c,0x96,0xcd,0xd6,0x5b,0x61,0x74,0x50,0x77,0x3,0x8e,0x85,0x9b,0xb0,0x92,0x94, + 0xf9,0xa3,0xb8,0x3d,0x33,0x74,0x97,0x3a,0xbc,0x1,0x7,0x68,0x4d,0xd5,0xd4,0x50, + 0xe4,0x42,0xe3,0x41,0x14,0x3a,0x76,0xa0,0xb6,0xc7,0xc9,0xdc,0x20,0x20,0x23,0x42, + 0xac,0x4,0xf3,0x40,0xfa,0xa8,0xcb,0x2a,0x32,0xac,0x86,0xc9,0x86,0x12,0x2,0x13, + 0x6b,0xfb,0x21,0x3d,0x6f,0x66,0x84,0x4,0x41,0x84,0xc0,0x8c,0x28,0x5d,0x19,0xc, + 0x40,0x12,0x5f,0x13,0xf2,0x5e,0x19,0x93,0xe2,0x9a,0x85,0x60,0x95,0x5,0x87,0xa5, + 0x4f,0xf7,0xb1,0xcf,0x5c,0x72,0xe9,0xbe,0xe9,0x27,0x9f,0x5c,0xbc,0x7c,0xc7,0xc3, + 0x8b,0xf,0x9f,0x7c,0xd2,0xd1,0x1f,0x5f,0xf7,0xb6,0x27,0x2e,0xf9,0xd8,0x47,0xd7, + 0x5e,0xf2,0xf7,0x1f,0x3d,0xeb,0xd0,0xc9,0x27,0x1f,0xf9,0xc9,0x75,0x6f,0xdf,0x69, + 0x5a,0x64,0xd5,0xd6,0x2d,0xc7,0x8b,0x88,0xec,0xbe,0x78,0xd3,0x81,0x51,0x96,0xdd, + 0x65,0x4f,0xcb,0x1e,0x7b,0x6c,0xc9,0xd4,0x91,0x23,0x83,0xd7,0x5d,0xf7,0xd6,0x8b, + 0x44,0x44,0x76,0x5c,0xfe,0x86,0x5d,0xf,0x5d,0x73,0xed,0xae,0x87,0xae,0xb9,0xf6, + 0x17,0x8b,0x9f,0x7d,0x76,0xc1,0x5,0x77,0x7e,0xfa,0x8c,0xfd,0x67,0x9d,0x75,0x68, + 0xcb,0x95,0x57,0xed,0x6a,0xf,0xd9,0xa,0xbc,0x1e,0xe,0x47,0xd2,0x4c,0x6c,0x40, + 0xc,0xb9,0xfc,0xea,0x2b,0x36,0x1d,0x5d,0xbc,0xe4,0xd8,0xce,0xdf,0x78,0xf5,0xee, + 0x2d,0x57,0x5e,0xf1,0xb4,0x3f,0xd0,0xdf,0x70,0xf5,0x15,0xa1,0xa6,0xfd,0xb5,0xcf, + 0x7e,0x6e,0xf3,0xd6,0x37,0x5e,0xf1,0x8b,0xf3,0xef,0xbc,0xe3,0xf4,0x4b,0x6f,0xfd, + 0xbb,0x75,0xfb,0xd6,0xad,0x3b,0xb4,0xf9,0xfa,0x1b,0x76,0xfa,0x4c,0x74,0x74,0x2d, + 0x16,0x82,0x2,0x15,0x91,0xdd,0x17,0x5d,0x3c,0xbb,0xf1,0xb3,0xff,0xd2,0xfe,0x7c, + 0xcf,0x4b,0x2f,0x9a,0x6d,0x7e,0x57,0x25,0xc5,0x95,0x2,0x2d,0x62,0xfe,0x40,0xe2, + 0x99,0x64,0xf8,0x4b,0x11,0x7e,0x40,0x72,0x75,0x81,0x60,0xc,0xd2,0xba,0x1b,0x35, + 0xd9,0xad,0x32,0xd7,0xae,0xfa,0x1,0x15,0x6b,0xa1,0x5a,0xb1,0x1f,0xcd,0x7,0x17, + 0x93,0xd0,0x1f,0xd1,0x3,0x4a,0x2,0xf6,0x90,0x6c,0x87,0x1d,0xcc,0x9d,0xd9,0x8b, + 0xf,0x2e,0x22,0x13,0xaf,0xcb,0x2d,0xb,0x76,0x91,0x39,0x12,0x8f,0x92,0x96,0xa2, + 0x4a,0x80,0xad,0xe8,0xb0,0x6,0x28,0x4b,0xd0,0x17,0xaf,0x88,0x56,0x68,0x76,0x7a, + 0xf2,0xdf,0x69,0x2a,0x44,0x59,0xcd,0x7f,0x4c,0x9,0x7,0x85,0x39,0xc8,0x50,0x8c, + 0x38,0xb9,0xf9,0x7b,0x0,0x98,0x79,0xf4,0x5d,0xe8,0x6,0x96,0x58,0x4a,0x0,0x1d, + 0x12,0xa2,0x85,0x50,0x71,0xf9,0xf1,0x67,0x33,0x3c,0x14,0x33,0x10,0x6f,0xa3,0x58, + 0xd9,0xe8,0xc5,0x48,0xbf,0x74,0x3e,0xf0,0x61,0xf2,0xf0,0xb6,0x35,0x13,0xa9,0x9f, + 0xb0,0x9a,0xf,0xb5,0x60,0x33,0xe7,0xe,0x29,0x53,0xfe,0x76,0x36,0xf8,0x6c,0x9c, + 0x30,0x7b,0xc,0xf,0x10,0xef,0xd9,0x13,0xa9,0x60,0x2c,0x62,0xf3,0x3c,0x5c,0x13, + 0x9,0x6c,0xb1,0x77,0x33,0x49,0x5b,0xf6,0x64,0x9a,0xe9,0x76,0x34,0x67,0xdf,0xc6, + 0x24,0xf4,0x8c,0xbf,0x37,0x7d,0x4f,0x4d,0x64,0xa7,0x76,0x2f,0x46,0x7a,0xf1,0x34, + 0xcb,0x3c,0xaa,0xe4,0xc0,0x2a,0xcd,0x25,0xbc,0x1e,0xff,0xd9,0x96,0xdf,0x53,0x4d, + 0x18,0x8c,0x3c,0x3f,0xe2,0x84,0x99,0xb2,0x76,0xb6,0xe3,0x7b,0x31,0xa5,0x83,0xb3, + 0x33,0xe1,0x23,0x5c,0x46,0xd5,0x6e,0x7,0xd6,0x9,0x89,0x88,0xd3,0xa6,0x36,0x31, + 0x59,0x70,0x70,0x76,0xf0,0xea,0x77,0xdd,0x70,0xfe,0xd3,0x2f,0xbb,0x6c,0xef,0xe6, + 0x1b,0x6e,0x7c,0x42,0x15,0xbe,0x7b,0x7c,0x2f,0x17,0x7d,0xf2,0x1f,0x4e,0x3b,0xe5, + 0xfb,0xdf,0x5b,0xf5,0xdf,0xb7,0xde,0xfa,0xe0,0xf3,0xd3,0xcb,0x8f,0x55,0x83,0x3a, + 0xa2,0xa6,0x95,0xd7,0x4,0x8b,0x84,0x44,0x6a,0xa,0xd2,0x4c,0xe1,0x27,0xf2,0x2, + 0x5c,0xd6,0xdb,0xfe,0x9b,0xb1,0xb4,0xb9,0xa6,0xcf,0x4,0xf5,0xf5,0x64,0x96,0x26, + 0xa0,0x5e,0xe5,0xcd,0x19,0x82,0x9f,0x38,0x10,0x6b,0x6a,0xea,0x42,0x82,0x36,0x7, + 0xce,0x66,0xb3,0xb3,0x5f,0xb4,0xec,0x1d,0x1e,0x86,0xc5,0x42,0x86,0xf,0x5,0x95, + 0x17,0xf7,0x27,0xb1,0x37,0x85,0x47,0xcd,0x6a,0x93,0xd5,0x4b,0x26,0xfe,0xb8,0x5f, + 0xeb,0x38,0xdb,0x33,0x56,0x3e,0x57,0x2a,0x34,0x4,0xba,0x1,0xf6,0x7c,0x3f,0x6e, + 0x5a,0xb8,0x9,0x24,0xba,0x3,0x66,0x67,0x28,0x87,0x6c,0x15,0xb5,0x51,0x92,0x2d, + 0x54,0xc7,0xbd,0x26,0x44,0x8c,0xb5,0x2b,0x96,0x59,0x1b,0xf9,0x1d,0x93,0x7d,0xac, + 0x19,0xb6,0xcc,0xf3,0x59,0xf5,0x1e,0x4,0x92,0x94,0xf7,0x62,0x2d,0x81,0x5,0x19, + 0xb5,0xcf,0x13,0xa6,0x28,0x55,0x21,0x38,0xd5,0x9e,0x3f,0x31,0x9e,0xb1,0x8a,0x7e, + 0x79,0x50,0x15,0x63,0xcf,0x9a,0x40,0xb7,0x93,0xc6,0x4f,0x24,0xf7,0x69,0xb3,0x37, + 0x4c,0x52,0x6f,0x9a,0xa4,0x17,0x9e,0x32,0x5f,0xc2,0xc0,0xa6,0xef,0x9f,0xcf,0x6b, + 0x26,0x4c,0x9f,0xda,0x5a,0xa7,0x36,0xc6,0x92,0xec,0x93,0xa9,0x76,0x4,0x97,0xf6, + 0x93,0xba,0x3b,0x25,0x6,0x23,0x4c,0xb3,0xa0,0xf6,0x6f,0x91,0x89,0x3a,0x4a,0xd5, + 0x7,0xd2,0xef,0xf4,0x17,0xe7,0x4c,0xdc,0x4b,0xa7,0x1a,0x98,0xd7,0x7b,0x6f,0x5b, + 0x3,0x53,0x7,0xf8,0x55,0x1d,0xa9,0xa2,0xbb,0x98,0xe7,0x97,0x2f,0x3b,0xf6,0xd0, + 0x35,0xd7,0x3c,0xb1,0xee,0xcb,0x5f,0x5e,0x6d,0x3,0x28,0xfc,0xbb,0x71,0x5a,0xb5, + 0xe5,0xa1,0xe9,0x2d,0x57,0x5e,0xf5,0xe4,0xf3,0x2b,0x56,0x1e,0x6b,0xf,0xa3,0xd0, + 0xea,0xa2,0xc9,0xc5,0xad,0x61,0x4b,0x4b,0x38,0xae,0x3c,0x6b,0xd4,0x91,0x57,0xbc, + 0x67,0xb9,0x3f,0xa,0x75,0x1e,0xc,0xcf,0x94,0x41,0xe6,0x76,0xe,0x49,0xc4,0xba, + 0xac,0x92,0xde,0xb7,0xa0,0xd2,0xba,0xd4,0x68,0x97,0x68,0x48,0x90,0xf0,0xac,0x5c, + 0x68,0x51,0x69,0x4a,0x9,0xa8,0xb9,0x6f,0x2d,0xe4,0x2c,0x9d,0x75,0xdf,0x78,0x53, + 0xb1,0xa4,0xa1,0xe9,0x12,0xcf,0x71,0xcb,0xa2,0x99,0x71,0x48,0xb3,0x4f,0x99,0x3e, + 0xb,0xcc,0x57,0xac,0xbc,0x8,0xdc,0x64,0x7d,0xb,0x55,0xb9,0x41,0x36,0x23,0x9c, + 0x19,0xcb,0x66,0x84,0x8,0xad,0xd7,0x36,0x77,0x91,0xec,0xac,0x22,0xbc,0xde,0x80, + 0xb6,0x5a,0x38,0x24,0x56,0x83,0xf0,0x30,0xa8,0x56,0x97,0xd1,0x31,0xd5,0xb,0xab, + 0x47,0xeb,0xa1,0x9e,0xe7,0xcb,0xa,0xd6,0xd5,0x2c,0x2d,0x82,0xea,0x69,0xfc,0x4d, + 0x38,0xcc,0x1b,0xe,0x49,0xe3,0x7,0x8a,0xa1,0x5a,0x95,0x51,0x38,0x9b,0x7,0x42, + 0xa0,0x1a,0xd9,0x7,0xd9,0xa,0x64,0x27,0x6c,0x3e,0xf9,0x5b,0xab,0xa9,0xf2,0x18, + 0xb3,0xd4,0x34,0x92,0x9d,0x93,0x71,0xf,0x7,0x2,0xc0,0xd7,0x4c,0x19,0xa7,0x6, + 0x93,0x33,0x98,0x57,0xc9,0xf5,0x5b,0xaa,0x2b,0x48,0xd5,0x38,0x20,0x49,0x90,0x5a, + 0x4f,0xb0,0xc,0xb6,0x70,0x42,0xe6,0xef,0x24,0x7f,0x95,0xa4,0xe0,0x4,0x7,0x19, + 0x7b,0x96,0xd5,0x43,0x4c,0x78,0xb0,0x38,0x29,0x70,0xb7,0x4a,0xc0,0x65,0xc4,0x91, + 0x4e,0x8d,0xb0,0x63,0x51,0x65,0xd2,0x88,0xf9,0xf,0xfb,0x39,0x20,0x46,0xe9,0x19, + 0x1a,0x1f,0x1f,0xed,0xb9,0xb7,0x24,0x6c,0xc4,0x82,0x51,0xcb,0x28,0x54,0xed,0x80, + 0x51,0x15,0x95,0xc3,0x87,0x67,0x7a,0xd3,0xa0,0x49,0x24,0x4,0xa,0x43,0x54,0x32, + 0xe7,0x6a,0x74,0xd6,0x13,0xe1,0x31,0xf8,0xe7,0x97,0xfa,0x33,0x21,0x53,0xb3,0x9, + 0xd1,0x7d,0x82,0xa4,0xe4,0xc5,0x5f,0x17,0xd5,0xff,0xed,0x1b,0x67,0xcc,0xdc,0x6a, + 0xd0,0xc6,0x84,0xec,0xb3,0x4f,0x8a,0x94,0x6d,0xc4,0x2a,0xe4,0x80,0xee,0xcb,0x5e, + 0x35,0xa7,0xf5,0x6a,0x3d,0x59,0x35,0xa9,0x57,0x49,0x45,0x3f,0x11,0xf,0x57,0x1a, + 0xfd,0x56,0x36,0xaa,0x49,0xcf,0x93,0x41,0x93,0x93,0x1e,0x20,0x32,0x78,0x95,0xd5, + 0x32,0x6b,0xd3,0xae,0x12,0x89,0x23,0xac,0x55,0x9d,0x7b,0xa,0x16,0xa4,0x3d,0xbe, + 0xb0,0x93,0x90,0x12,0xf4,0x47,0xa8,0x11,0x82,0x6a,0xb5,0xbe,0x34,0x26,0xe4,0x99, + 0xf7,0x65,0xcf,0x74,0xba,0xb3,0x3a,0xb5,0xd6,0x3,0x90,0xbe,0x35,0x38,0x29,0x80, + 0x63,0x9b,0xb9,0xb1,0xb1,0x67,0x24,0x28,0xc9,0xb2,0x64,0xb5,0xc,0x8b,0xdd,0x5f, + 0xc5,0xd5,0x90,0xd6,0x93,0xe7,0xb3,0x3f,0xf9,0x3d,0x97,0xee,0xdb,0x52,0xd9,0xc3, + 0x2a,0xd9,0x34,0x5e,0x2b,0xb,0x48,0x7b,0x65,0x17,0x6b,0xeb,0xb1,0x92,0xc5,0xce, + 0x4b,0x10,0x9a,0x21,0x25,0x42,0x94,0x17,0x8d,0x3f,0x27,0x23,0xfb,0x68,0xdf,0xdc, + 0xd4,0x9e,0xbd,0x19,0xe7,0x42,0x75,0xe,0x10,0xd4,0x83,0x6b,0x66,0xd7,0xd1,0xd, + 0x9c,0x97,0x38,0xfe,0xe3,0xfb,0x19,0xa5,0xe2,0x9a,0xfd,0xb6,0xbb,0x1b,0x5,0xa6, + 0xa4,0x42,0x4d,0x1,0x23,0x51,0xed,0xa9,0x8d,0x84,0xd7,0x80,0x96,0xb9,0xf6,0x1c, + 0x64,0xc6,0x22,0x2b,0xb6,0xc9,0xa2,0x48,0x0,0xfe,0x9d,0x44,0x42,0x2a,0x15,0xef, + 0x3a,0xd7,0x3b,0xd4,0x8,0x33,0xa0,0x75,0xa0,0xa7,0x93,0xa9,0x7b,0x8f,0x4e,0x8a, + 0x27,0xdc,0x7b,0x9b,0xe6,0x63,0x13,0x72,0xfd,0x78,0xdd,0xc2,0x27,0x5e,0x75,0xe1, + 0x4a,0xf7,0xf9,0xb5,0xd7,0x63,0x31,0x18,0x6b,0x7b,0x58,0x9b,0x53,0xcd,0xa4,0xe, + 0x5a,0xd9,0xb6,0x9c,0x41,0xa8,0xd6,0x5f,0xe,0xc3,0x99,0x3e,0xcb,0x7a,0xb0,0x7f, + 0xaf,0x9c,0xd3,0x66,0x65,0xe4,0x39,0x84,0xfa,0x49,0x25,0x22,0xc6,0x6c,0xbd,0x59, + 0x1f,0x2a,0x35,0xc7,0x7,0x5e,0x90,0x4e,0xc1,0x13,0x7e,0x37,0x3c,0x2f,0xb6,0x99, + 0xb6,0xb5,0x71,0x92,0x35,0xa,0x2f,0xe7,0x86,0xfa,0x73,0x1c,0x7c,0xd0,0xd0,0x80, + 0x96,0x2c,0x53,0xae,0x1f,0x6b,0x24,0xc9,0x57,0x8,0xb4,0xfc,0xc3,0xab,0x6,0x44, + 0x16,0x96,0x55,0x5a,0x7b,0x7c,0x21,0x42,0x96,0x8d,0x6b,0xd9,0x1d,0xd2,0x4a,0xe0, + 0xa7,0xb4,0x95,0x40,0x46,0x6c,0x96,0x9,0x8,0x2c,0x58,0x56,0xe3,0xb0,0xac,0x6f, + 0x6d,0xc2,0xac,0x4d,0xfb,0x2,0xd,0xab,0xd4,0xe3,0x3c,0xe5,0xdf,0xa4,0xd6,0xdb, + 0xcc,0xff,0x6f,0xf5,0xc0,0xcc,0xcf,0x21,0x4c,0x20,0xd4,0x3d,0x17,0x23,0x49,0x8b, + 0xd6,0xca,0xb5,0xc0,0xf8,0xd6,0xca,0x78,0xa7,0xcc,0x57,0xf2,0x75,0x36,0x6c,0x6e, + 0x7a,0x0,0x32,0xb9,0x65,0xcd,0x81,0xa3,0x69,0x84,0x3e,0x53,0x62,0x1,0x67,0x99, + 0xb9,0x80,0xd7,0xac,0x72,0x8a,0xab,0x57,0xf0,0xca,0xfc,0x4,0xac,0xcf,0x1b,0xc0, + 0x1d,0xaa,0xe4,0x1c,0x13,0x49,0xee,0xa5,0x61,0x7d,0x10,0xde,0x44,0x20,0x2d,0x56, + 0x1e,0x88,0x75,0x8c,0x1d,0x78,0xb1,0xe6,0x62,0xaf,0x3f,0xc0,0x12,0xdd,0xd4,0x7d, + 0x29,0x32,0xf1,0x10,0xe6,0x45,0x1a,0xbf,0x3f,0x30,0x4d,0x73,0x3d,0x50,0x5c,0xa6, + 0x81,0x19,0x99,0x56,0x32,0x4e,0x9a,0x41,0x69,0xde,0x54,0xd2,0x21,0x82,0xaf,0x33, + 0xd7,0xfb,0x67,0x92,0xa8,0xe0,0xb8,0xf,0xb5,0x8c,0x46,0x2,0xb3,0x4a,0xe5,0x10, + 0xc3,0xc0,0xc8,0x2c,0x43,0x3c,0xb5,0x3,0xc0,0x20,0xf0,0x50,0xe3,0x35,0x51,0x8d, + 0xfb,0x15,0xd,0x80,0x55,0xc8,0x86,0xef,0xdf,0xab,0x31,0x4b,0x33,0x9c,0x23,0xca, + 0x89,0x50,0x6,0xd7,0x6b,0x84,0xd4,0xd1,0xc2,0x75,0x2c,0x7b,0x67,0x96,0xa9,0x4, + 0x9a,0xc7,0x0,0x17,0xc7,0x2c,0xcd,0x1d,0x85,0x67,0xe7,0xe,0x6e,0x2c,0xd5,0xf8, + 0x3,0xd2,0xa4,0x2,0xc9,0x5b,0x7e,0x16,0x49,0xd5,0xc6,0xc3,0xe1,0xee,0x1a,0x35, + 0x2b,0x25,0xa4,0xe7,0x6c,0xb5,0x20,0xc0,0xa4,0x4e,0x30,0xc2,0x4d,0x15,0xe6,0x30, + 0xce,0xb9,0xe6,0x10,0xaa,0x5a,0x8c,0x59,0x1c,0xaf,0x70,0xc8,0x5a,0xbd,0xf4,0xe1, + 0xef,0xc1,0x20,0xb0,0x9,0xd3,0x9d,0x1c,0xf8,0x2,0x8a,0x46,0x78,0x10,0x89,0x65, + 0x18,0xbd,0x2f,0x80,0x36,0x36,0xd7,0x35,0x47,0x96,0x8,0x63,0x63,0x3b,0x85,0xf6, + 0xec,0x71,0xe1,0x90,0xc0,0xfd,0x54,0xfa,0xcb,0x6,0x6a,0x39,0x22,0x54,0x36,0x37, + 0x2a,0x90,0x3e,0x15,0xef,0x81,0xc3,0x86,0x91,0xa,0x9d,0x6e,0x41,0x36,0x66,0xb0, + 0xfc,0x1c,0x6b,0x71,0x97,0x91,0x40,0xd1,0x1f,0x38,0x6,0x81,0x72,0x40,0x4d,0x8c, + 0x1f,0xda,0xc9,0xa2,0x10,0x2,0x2a,0x9c,0x23,0x35,0xaf,0x5,0x7f,0x91,0xcd,0x33, + 0x54,0x16,0x6c,0x48,0x7f,0x1d,0xdb,0xcf,0xd7,0x34,0xf6,0x10,0x40,0xfb,0x3d,0x5a, + 0xfb,0x18,0xf8,0xca,0xcf,0x6,0x73,0xe5,0x4,0x4c,0xa2,0xc,0xf6,0x8f,0x8e,0x97, + 0x6a,0xf9,0x20,0x63,0xf3,0x4e,0x6b,0xb5,0x7,0x17,0xc5,0x78,0x9a,0xbe,0xf4,0x38, + 0x76,0xb4,0x9b,0x3b,0x30,0x34,0x95,0xd2,0x6e,0x73,0xc6,0x6d,0x4a,0xf6,0x3e,0xff, + 0x19,0x46,0x22,0xf3,0xa4,0x52,0x20,0xc9,0x46,0x95,0x4d,0x68,0xab,0x44,0xfe,0x41, + 0x5f,0xd2,0xea,0xac,0x37,0x51,0x1e,0xa1,0x6a,0x1f,0x9c,0x53,0xd9,0x50,0x94,0x64, + 0x50,0x6a,0xa9,0x17,0x31,0xbd,0xce,0x8c,0x4c,0x1e,0x25,0x9b,0x82,0x54,0xfe,0x6e, + 0x79,0x3,0xc7,0xba,0x94,0x9,0x39,0xac,0xc8,0xbd,0xd6,0xca,0xc,0xea,0x16,0x99, + 0xef,0xeb,0x64,0x50,0x1f,0x66,0xdb,0x22,0xbc,0xb5,0xc4,0xb4,0x9e,0x19,0x85,0xac, + 0xd4,0xe2,0xc2,0x61,0x7,0x2b,0x65,0xe2,0x62,0x26,0x6,0xec,0x6c,0x3f,0xf,0xd4, + 0xaf,0x2f,0xcd,0x10,0x1d,0xcb,0x8e,0x95,0x5,0x1d,0x42,0x20,0x50,0x83,0x4d,0x44, + 0xb2,0x84,0x65,0x62,0x66,0x92,0x88,0xd8,0xac,0x9e,0x79,0xa5,0xb9,0xc9,0x36,0xd0, + 0xa,0xf2,0x85,0x99,0x22,0x51,0xf0,0x3,0xf3,0xe8,0xca,0x1a,0xad,0x64,0x38,0x6c, + 0xe3,0x17,0x8b,0xcf,0x57,0x95,0x23,0xf,0xa,0x48,0x4b,0x40,0x61,0x88,0x3f,0xa5, + 0x54,0xd0,0x15,0x6,0xcf,0x60,0xc6,0xa5,0x64,0xe3,0x47,0xf1,0x9a,0x2a,0x32,0x41, + 0xf6,0x80,0x14,0x90,0x90,0xa0,0x90,0xb9,0xa1,0x31,0x2b,0xc1,0xd8,0xaa,0x1,0xf3, + 0xb3,0x2,0x3f,0xab,0x55,0xe3,0x88,0x90,0x5c,0xb0,0x39,0x62,0xc6,0xdf,0x93,0xf6, + 0x39,0x44,0x6b,0xf1,0x10,0xb7,0x98,0xe1,0x9b,0xe5,0xb1,0xee,0xd,0x18,0x64,0x1e, + 0xe4,0x43,0xeb,0xb7,0x19,0xd6,0x9e,0xbd,0x0,0xf7,0x4,0x23,0x1,0x93,0x4e,0x1a, + 0xb,0x25,0xa8,0x18,0x20,0x43,0xe3,0xc7,0x56,0xd2,0x24,0xc,0xb0,0x4,0x28,0xd4, + 0x60,0xd4,0xa4,0x70,0xc3,0xaa,0x3c,0x92,0x12,0xad,0xd4,0x5c,0x60,0xc2,0x1a,0x4b, + 0xa7,0x48,0xf4,0x4f,0x59,0xaa,0x5a,0x99,0x80,0xc6,0x37,0x74,0x84,0x8c,0x91,0xd5, + 0x6b,0x15,0x2f,0x4c,0x1f,0x79,0x6b,0x5f,0x99,0x47,0x23,0xa4,0xc5,0xf4,0xcb,0x19, + 0xc4,0x53,0x85,0x87,0x21,0xc8,0x61,0x3e,0xe2,0xc,0x5a,0x4f,0x84,0xa,0xd2,0xca, + 0xc1,0xa0,0x69,0x16,0x35,0x2a,0x43,0x9,0x60,0x1e,0x24,0xa8,0x4a,0x32,0xab,0xbb, + 0x16,0x74,0x78,0xa8,0xcc,0x14,0x32,0x2,0x25,0x70,0xb3,0xc2,0xa6,0x2,0x73,0x44, + 0xad,0xe,0x93,0x30,0x38,0x30,0x5c,0x8b,0xc6,0xd,0xc3,0x2a,0x7,0x4c,0xad,0xf6, + 0x66,0xe0,0x8a,0x67,0x64,0x1,0x5a,0x25,0x23,0x67,0xfb,0x82,0x56,0x82,0x68,0x1a, + 0x8c,0xe3,0x24,0xb3,0x7c,0x78,0x22,0xb2,0x60,0x59,0xd,0xb1,0xf7,0x39,0x82,0xcc, + 0x2e,0xcd,0xce,0x8c,0x95,0x58,0xb4,0x7,0xb6,0xd2,0xa,0x29,0xad,0xa7,0xd4,0x82, + 0x5e,0xd6,0xa9,0x74,0x47,0xae,0x4f,0x35,0x97,0xf3,0xcc,0x7,0xfe,0x96,0xa1,0x67, + 0x81,0x3d,0xc6,0x7,0x27,0xac,0x35,0x27,0xec,0x15,0x52,0x21,0x35,0x59,0xcd,0x41, + 0x76,0x2,0x4c,0x6f,0x3d,0xfc,0x9d,0x9e,0x4d,0xc9,0x2a,0x9c,0x9c,0xda,0x3e,0xa9, + 0xb5,0x92,0x1,0x83,0x48,0x2d,0x92,0xd,0x13,0x89,0xc,0x4a,0x92,0xc8,0x97,0x49, + 0xe7,0x5,0xe3,0x4b,0x98,0x50,0xfd,0xe9,0x74,0x60,0x2b,0xef,0x1,0xf,0x1,0x1d, + 0x29,0x8b,0x68,0x25,0x98,0x67,0x67,0x93,0x2,0x21,0xd7,0xd0,0x25,0x8e,0x3d,0xf, + 0x25,0x9,0xb3,0x72,0xb2,0x6f,0x8,0xfe,0x59,0xbb,0x9a,0x92,0xb2,0x88,0x42,0x67, + 0x79,0x9a,0xb,0x46,0xea,0x9a,0xc2,0xf,0xe4,0xd0,0x53,0x7,0xcc,0x42,0x3f,0xe0, + 0xa,0x11,0xb9,0x56,0xb4,0xf9,0x52,0x34,0x67,0x1c,0x5a,0x4d,0x93,0xd7,0x38,0x72, + 0xa2,0xc4,0xb3,0xb0,0xa6,0x28,0x24,0x2c,0x48,0xb1,0x7a,0xf1,0xb7,0xf,0xea,0x44, + 0x48,0xdf,0xb4,0x92,0xed,0xa8,0x50,0x76,0xb5,0x32,0xb8,0xc9,0xb8,0x5b,0x8b,0xaf, + 0x1f,0x57,0x77,0x6,0xad,0x6c,0x8c,0x6,0xf5,0x25,0xf2,0xbd,0x9,0x1a,0x54,0x52, + 0xea,0x20,0x69,0x19,0x15,0x99,0xd0,0xdc,0x3f,0xcc,0x2,0xab,0x30,0xb7,0x48,0x49, + 0xc5,0xe0,0xf0,0xf0,0x8b,0xc4,0x14,0x88,0x25,0x5a,0x3f,0x50,0x8c,0xec,0x55,0x4a, + 0xe6,0xbd,0x5a,0xff,0x82,0xad,0x7d,0x66,0x82,0x80,0x7b,0x6a,0x85,0x56,0xe3,0x42, + 0x48,0x65,0xdd,0x8,0x41,0x81,0x6a,0x48,0xc,0x6,0x3a,0xc6,0xef,0xcf,0x48,0xb6, + 0x57,0xed,0x3b,0x56,0x67,0x0,0xe2,0xb3,0x33,0xe3,0xc1,0x3f,0x56,0x29,0x6a,0xf3, + 0x4e,0xa2,0xa7,0x7a,0x2d,0xf6,0x4d,0x87,0x48,0x4a,0x36,0x60,0xc,0xac,0x52,0x9e, + 0xaa,0x32,0xfe,0x11,0x9,0xc1,0xec,0xdf,0x7a,0x90,0x54,0xf4,0xb2,0xd6,0x9e,0x25, + 0xc9,0x10,0x1d,0xc9,0xd9,0x72,0x4a,0x10,0x18,0xac,0x6f,0x19,0xd9,0x54,0xb6,0x9e, + 0xa0,0x5,0x30,0x21,0x22,0x50,0x83,0x56,0x80,0xc9,0xad,0x2f,0x60,0xd7,0x8,0xe7, + 0xfb,0x44,0xd1,0x3f,0x53,0x23,0x65,0x2e,0x7a,0x4d,0x4a,0x20,0x7d,0x86,0x38,0xc1, + 0x77,0x69,0x25,0xfb,0xb5,0x4a,0x40,0x96,0x94,0x2c,0xad,0x52,0x6a,0x23,0xeb,0x18, + 0xf7,0x52,0x85,0x2e,0x94,0xc4,0x37,0xe8,0xeb,0xe1,0x83,0xb1,0x30,0x72,0x4e,0xc2, + 0xbe,0x50,0xb2,0x40,0xc5,0x24,0x76,0xae,0x70,0x68,0x4c,0x85,0x10,0x4d,0xc8,0x81, + 0x67,0x48,0x30,0x33,0x2,0x33,0x1a,0x1c,0xe,0xec,0x10,0xb2,0xca,0x46,0xa9,0x7c, + 0xf3,0x34,0x6c,0xd9,0x50,0x9a,0xb8,0x50,0xfb,0x22,0x52,0xf6,0xe2,0x91,0x33,0xf, + 0xa2,0xa2,0xf0,0x83,0xe5,0xfa,0x9b,0x91,0x80,0x44,0x99,0x64,0xe1,0x4,0x48,0x4a, + 0x35,0x2e,0x54,0xf,0x53,0x25,0xf,0x67,0xad,0x43,0x9a,0xac,0x26,0xa5,0x52,0x3f, + 0x70,0x82,0x51,0x3,0xec,0xd6,0x6a,0xb9,0x44,0xc2,0x6a,0x50,0x46,0xcc,0x82,0xd9, + 0xa1,0x16,0xc4,0x48,0xfc,0x38,0x59,0x6e,0x93,0x42,0xd6,0xb8,0x91,0x1a,0xbc,0xd6, + 0x6a,0xbd,0x90,0x51,0x86,0xd,0x8a,0xa4,0xaa,0xda,0x43,0x62,0xea,0x83,0xf3,0x10, + 0xfd,0x52,0x40,0x7e,0x42,0xad,0x91,0x1c,0xb8,0x4a,0x90,0x80,0x90,0xb1,0x10,0xc8, + 0xd6,0x34,0x13,0x76,0xfa,0xd8,0xc5,0xc,0x7e,0x45,0x64,0xc0,0xa4,0xa2,0x6a,0x56, + 0x43,0xe0,0x14,0xca,0x22,0x3d,0x70,0x70,0x40,0x66,0x34,0xa8,0xc0,0x75,0x63,0xa7, + 0x39,0x38,0x60,0x6a,0x62,0xaa,0x95,0x75,0x80,0xdc,0xa,0x9f,0x41,0x92,0xb2,0x59, + 0x22,0xc8,0x32,0x92,0xa1,0xf2,0x12,0x1a,0x8d,0xb3,0x2b,0x5c,0x13,0xba,0x7,0x69, + 0x9e,0x27,0x94,0xbd,0xa6,0x52,0xd7,0x49,0x60,0x87,0x97,0x56,0xea,0xce,0xa,0x8, + 0x9f,0x55,0x92,0x2a,0x21,0x9,0x9e,0x91,0xd2,0x27,0xfa,0x9e,0x23,0x2a,0x46,0xca, + 0x27,0x7d,0x68,0x1,0x25,0x2e,0x4a,0xe6,0x6a,0x60,0x9,0x51,0x49,0x22,0xca,0xc6, + 0x70,0xbe,0x5a,0x19,0x29,0xb0,0xa9,0xb5,0xf0,0x56,0xb8,0xc,0xd2,0x73,0xfe,0xa6, + 0x64,0xd1,0xa3,0x93,0xdd,0xb5,0x94,0x2e,0x52,0xb2,0xa,0x5c,0xc8,0x6a,0x9f,0x3a, + 0xa1,0xb6,0xc1,0xa2,0x1b,0x16,0xe5,0x13,0x8,0x5f,0x84,0x1f,0x6c,0x35,0xc6,0xb2, + 0x49,0x7d,0x2,0xb1,0x93,0x96,0xb2,0xa8,0xc9,0x43,0x43,0x26,0xb1,0x55,0x36,0xd9, + 0xfa,0xa8,0x4b,0x76,0xa,0x90,0xc,0x39,0x85,0x7a,0x33,0x92,0xb1,0x34,0xf7,0x42, + 0xa,0x21,0x15,0x69,0x25,0xc0,0x13,0x96,0xd1,0x63,0xad,0x1d,0x7b,0x51,0xb5,0xbe, + 0x28,0x12,0xaa,0x60,0xb9,0xe,0x8c,0xbe,0x9d,0x8c,0x6c,0xe3,0x17,0x54,0x6d,0xa1, + 0x5a,0x25,0xa8,0xa0,0x35,0x7f,0x2,0x6b,0x99,0xe6,0xd,0x4c,0x7b,0x82,0x18,0x81, + 0xe7,0x4b,0xb3,0x37,0xe3,0x90,0x59,0x5f,0xcb,0x94,0x92,0xa8,0x41,0x35,0xcf,0x91, + 0xd0,0xbb,0xb,0xbd,0xbd,0x1e,0xda,0x35,0xa2,0xc1,0x6b,0x95,0xec,0x9c,0x21,0x0, + 0xe9,0xc0,0x57,0xa8,0xff,0xd5,0x5a,0x8a,0x2c,0x67,0xe0,0xaa,0xbc,0xed,0xb1,0x97, + 0xfd,0xec,0xf6,0x1b,0x25,0x50,0x3b,0xdb,0x74,0x53,0x70,0xe,0x44,0x36,0x25,0x75, + 0x75,0xc,0xdc,0x95,0x4,0x7d,0x7d,0xe5,0x12,0xe4,0x53,0xa8,0xf6,0x1c,0x64,0xc8, + 0x1d,0xb2,0x18,0x88,0xf4,0xc4,0x10,0x7c,0x5e,0x48,0x46,0x9b,0x18,0xd7,0xc1,0x2a, + 0x49,0x14,0x6,0xf6,0x6,0x87,0x93,0x6a,0x5,0x9,0x34,0x92,0x8d,0x6a,0xe4,0xb2, + 0xd4,0x92,0x16,0x11,0x7e,0xfd,0x29,0xf6,0x55,0x8e,0xf0,0x6a,0xd,0xc9,0xd7,0x1c, + 0xa4,0x33,0x56,0x25,0x6b,0xff,0xc3,0xe,0xa,0xed,0x2b,0xd9,0x54,0xf6,0x21,0xda, + 0x85,0x21,0x7c,0x4f,0x65,0xb5,0xed,0x89,0xa2,0x5c,0xda,0x8f,0x12,0x19,0xd9,0x8f, + 0x42,0x59,0x32,0x6,0x46,0xff,0xf,0x29,0xcc,0x82,0x9,0xae,0x64,0xb9,0x0,0x0, + 0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/right.png + 0x0,0x0,0x0,0x90, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x15,0x8,0x2,0x0,0x0,0x0,0xf4,0x25,0x38,0x99, + 0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4, + 0x1,0x95,0x2b,0xe,0x1b,0x0,0x0,0x0,0x42,0x49,0x44,0x41,0x54,0x78,0x9c,0x63, + 0xb4,0x76,0x74,0x95,0x93,0x93,0x7f,0x7c,0xf7,0x6,0x3,0xc,0xc8,0x2a,0x6b,0x2c, + 0x5f,0x38,0x87,0x89,0x1,0x15,0xfc,0x67,0xe5,0x86,0x30,0xd0,0x25,0x18,0x7f,0x7f, + 0xc5,0x2e,0x1,0x7,0x44,0x1b,0x85,0x53,0x7,0x15,0x25,0x48,0x77,0x2e,0x4e,0x89, + 0x1,0xf5,0x7,0xe9,0x12,0x38,0x7d,0xe,0xf7,0x7,0x0,0xa4,0x3a,0x10,0x39,0xce, + 0x4b,0x7a,0x37,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/topBorder.png + 0x0,0x0,0x0,0x90, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x15,0x0,0x0,0x0,0x8,0x8,0x6,0x0,0x0,0x0,0x16,0x5f,0xb4,0xd3, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x25,0x49,0x44,0x41,0x54,0x28,0x53,0x63,0x8c,0x8c,0x4f, + 0xf9,0xcf,0x40,0x65,0xc0,0x68,0x63,0x63,0x43,0x75,0x43,0x99,0xa8,0xec,0x48,0xb0, + 0x71,0xa3,0x86,0x52,0x3f,0x54,0x19,0x69,0x91,0xa4,0x0,0x41,0xac,0x5,0xf7,0xea, + 0x8d,0x19,0x2b,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/up_arrow.png + 0x0,0x0,0x0,0x7d, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x2,0x0,0x0,0x0,0xb4,0xb4,0x2,0x1d, + 0x0,0x0,0x0,0x44,0x49,0x44,0x41,0x54,0x78,0x9c,0xd5,0xcb,0xbb,0xd,0x0,0x20, + 0xc,0x43,0x41,0x47,0x5e,0x2c,0xa3,0x67,0x33,0x53,0xa4,0x41,0x84,0x5f,0x9,0x2e, + 0xad,0x7b,0xc0,0x2b,0xe3,0xf4,0x95,0x64,0x66,0x11,0x71,0xd6,0x92,0x0,0xb8,0x7b, + 0xd,0x46,0x9d,0x34,0x57,0x3,0xae,0xe8,0x34,0xe0,0x86,0xd6,0x80,0x7b,0x3a,0x4, + 0x3c,0xd2,0x3e,0xb0,0x1b,0xfa,0xfd,0x1a,0x8,0x5a,0x2a,0x14,0x67,0x84,0x29,0xfd, + 0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/hpsdr4.png + 0x0,0x0,0x61,0x2e, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x1,0x90,0x0,0x0,0x1,0x90,0x8,0x6,0x0,0x0,0x0,0x80,0xbf,0x36,0xcc, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xd,0xd7,0x0,0x0,0xd,0xd7,0x1, + 0x42,0x28,0x9b,0x78,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdb,0x5,0x18, + 0x3,0x18,0x1e,0x93,0x32,0xad,0x2f,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78, + 0xda,0xec,0x7d,0x77,0x9c,0x1d,0x57,0x75,0xff,0xb9,0x33,0xf3,0xca,0xee,0xdb,0xde, + 0x8b,0xb4,0xea,0xc5,0xaa,0x96,0x64,0xb9,0xdb,0x42,0xae,0x32,0x72,0x17,0xc6,0x5, + 0x17,0xf8,0x19,0x8,0x49,0x80,0x4,0x92,0x1f,0x49,0x48,0x20,0x84,0x10,0x20,0x10, + 0x8,0xc1,0x60,0xe0,0x7,0xc6,0xe0,0x8a,0x71,0xc3,0x5d,0xb8,0xc8,0x45,0xee,0xb6, + 0x9a,0x55,0x2c,0x69,0x77,0xb5,0xbd,0xb7,0xd7,0xdb,0xcc,0xdc,0xfb,0xfb,0x63,0x65, + 0x47,0x92,0xf7,0xcd,0xbd,0xf3,0x66,0x76,0xf6,0xbd,0x79,0xe7,0xfb,0xf9,0xec,0x27, + 0x41,0x9e,0x77,0xe7,0xce,0x39,0xe7,0x9e,0x76,0xcf,0x3d,0x17,0x0,0x81,0x40,0x20, + 0x10,0x8,0x4,0x2,0x81,0x40,0x20,0x10,0x8,0x4,0x2,0x81,0x40,0x20,0x10,0x8, + 0x4,0xc2,0x7d,0x20,0x48,0x2,0x4,0x2,0x91,0xa3,0xa8,0xb0,0x79,0x2c,0xbb,0xf4, + 0x5d,0x19,0x0,0x48,0x36,0x8e,0x25,0xdb,0x34,0x96,0x2,0x0,0x1a,0x0,0x24,0x1, + 0xa0,0xb,0x0,0xfa,0x1,0x80,0xb9,0xc5,0x80,0x78,0x8f,0x32,0x31,0x80,0x2,0x66, + 0xa,0xa5,0x47,0x5,0xc3,0xe,0x4,0x0,0xc0,0x63,0xe3,0x58,0x5e,0x9b,0xc6,0xf2, + 0x1f,0xfd,0xb3,0x6b,0xac,0x22,0x1b,0x65,0xb6,0xd8,0xc6,0xb1,0xec,0x92,0x7d,0xf9, + 0xa8,0x5c,0xd8,0x35,0x56,0x99,0x8d,0xfa,0xa4,0x1c,0xed,0x5e,0xce,0x20,0x9,0x0, + 0xef,0x1,0xc0,0x2b,0x0,0xb0,0x1d,0x0,0x5e,0x6,0x80,0x54,0xae,0x1b,0x10,0x5, + 0x0,0xd6,0x2,0xc0,0xd9,0x0,0x70,0x1a,0x0,0xcc,0x3,0x80,0xb9,0x36,0xa,0x3c, + 0x2,0x81,0x40,0x20,0xcc,0x23,0x8,0x0,0xf,0x1,0xc0,0xed,0x0,0xf0,0x7e,0xae, + 0x19,0x90,0x55,0x0,0x70,0x13,0x0,0x5c,0xb,0x0,0xb5,0xc8,0x2b,0x4,0x2,0x81, + 0xc8,0x49,0x50,0x0,0x78,0x4,0x0,0xbe,0x7,0x0,0x7,0x66,0xda,0x80,0x9c,0xf, + 0x0,0x7f,0x7,0x0,0x1b,0x91,0x2f,0x8,0x4,0x2,0x91,0x37,0xd0,0x0,0xe0,0x17, + 0x0,0xf0,0x6d,0x0,0x88,0x3a,0x6d,0x40,0xe6,0x1,0xc0,0x8f,0x1,0x60,0x13,0xf2, + 0x1,0x81,0x40,0x20,0xf2,0x16,0xed,0x30,0x99,0x3d,0xda,0x65,0xf6,0x87,0xd9,0xee, + 0xfe,0xff,0x5,0x0,0xfc,0x11,0x0,0x4e,0x42,0xda,0x23,0x10,0x8,0x44,0x5e,0xa3, + 0xa,0x0,0x6e,0x4,0x80,0x6e,0x0,0xd8,0x3b,0x9d,0x6,0x24,0x0,0x0,0xbf,0x7, + 0x80,0xaf,0x80,0x7d,0xd5,0x3c,0x8,0x4,0x2,0x81,0x98,0x59,0x28,0x0,0x70,0x39, + 0x4c,0x56,0x69,0xbd,0x3e,0x1d,0x6,0xa4,0x1a,0x0,0x9e,0x80,0xc9,0x3d,0xf,0x4, + 0x2,0x81,0x40,0xb8,0xb,0x4,0x0,0xce,0x33,0x63,0x44,0x44,0xd,0x48,0x25,0x0, + 0x3c,0x7,0x0,0x27,0x23,0x8d,0x11,0x8,0x4,0xc2,0xd5,0xd8,0x8,0x93,0x7,0x11, + 0xdf,0x13,0xb1,0x38,0x3c,0x14,0x3,0xc0,0x33,0x0,0x70,0x2a,0xd2,0x15,0x81,0x40, + 0xe4,0x3b,0x24,0xaf,0xf,0x80,0x58,0x2f,0x40,0x95,0x3c,0x3e,0x66,0xcb,0x38,0x5e, + 0xaf,0x2d,0xf3,0x1,0x0,0x60,0x6a,0x1a,0xb4,0x58,0x94,0x30,0x4d,0xb5,0x3a,0x54, + 0x2,0x0,0x36,0x0,0x67,0x4f,0x44,0x64,0xd6,0xbf,0x5,0x80,0xeb,0x73,0x4e,0x8, + 0x7c,0x7e,0x9b,0x84,0xc9,0xcf,0xec,0x19,0xc7,0x6b,0x93,0x50,0x7a,0x19,0x91,0xac, + 0x1f,0x62,0x27,0x1e,0x2f,0x10,0x49,0xb6,0x61,0x1c,0xf,0x48,0x76,0x8c,0xa3,0xc8, + 0x8c,0xc8,0x36,0x1c,0xa8,0x97,0x14,0x20,0x8a,0xf5,0x71,0x88,0xac,0x0,0xf1,0x28, + 0x96,0x79,0x4f,0x24,0x5,0x88,0x62,0x7d,0x3b,0x90,0x48,0x4,0x88,0xd7,0xfa,0xc1, + 0x7e,0x42,0x8,0x48,0x1e,0x8e,0x4c,0x33,0x81,0xf6,0x16,0x12,0x1,0xd9,0xeb,0xb3, + 0x61,0x65,0x10,0x90,0x7c,0x36,0xad,0x31,0x9f,0xf,0x10,0x62,0xd0,0x42,0x41,0x92, + 0xe8,0xef,0x92,0x62,0xed,0x7,0xa4,0x44,0x7f,0xb7,0x4,0x2c,0x2b,0x16,0x1c,0x6, + 0x80,0x33,0x0,0x20,0x9e,0xad,0x1,0xb9,0x19,0x0,0x7e,0x95,0xdd,0x2,0x95,0xc1, + 0xdf,0x34,0x87,0x16,0xcd,0x9e,0x4f,0x7d,0xb5,0xd,0xcc,0x53,0x56,0xc5,0xe4,0xa2, + 0x22,0x66,0x97,0xa5,0x45,0x20,0x10,0x8,0x84,0x80,0x31,0x9,0x7,0x21,0xb8,0xe3, + 0x55,0x25,0x72,0x78,0x5f,0x36,0x9e,0xe0,0x7f,0x3,0xc0,0xd7,0xb3,0x31,0x20,0xf5, + 0x30,0x99,0x3,0x33,0xd5,0x27,0x47,0xf2,0x78,0xa1,0x6c,0xc5,0x3a,0xbd,0x6c,0xe5, + 0x7a,0x5d,0x2e,0x2a,0x66,0xc8,0xbe,0x8c,0x6e,0x20,0xd2,0x6,0x81,0x40,0x38,0x86, + 0x44,0x7f,0xb7,0x34,0xfa,0xe2,0xd3,0x1e,0x2d,0x1a,0x32,0xe3,0xc5,0x6b,0x30,0xb9, + 0x7d,0xf1,0xbe,0x59,0x3,0x72,0x7,0x0,0xdc,0x60,0x66,0x82,0xc5,0x2d,0xb,0x68, + 0xf5,0x39,0x17,0xab,0x4a,0x49,0x29,0x2a,0x47,0x4,0xe2,0xf8,0xa5,0x86,0x6b,0x2, + 0x31,0xe3,0xa0,0xc9,0x24,0x19,0x7a,0xf6,0x61,0x6f,0x72,0xa0,0xc7,0x4c,0x9e,0xfc, + 0x41,0x98,0xcc,0x46,0x9,0x1b,0x90,0x93,0x61,0xb2,0x8c,0x4b,0xd8,0x52,0x55,0x9e, + 0xba,0x41,0xad,0x58,0x73,0x86,0x86,0x2c,0x42,0x20,0x10,0x88,0xf,0x90,0x7b,0x99, + 0x6,0xa6,0xeb,0x30,0xf8,0xd4,0x3,0xbe,0xe4,0x40,0x8f,0x68,0x4a,0x4b,0x7,0x80, + 0x35,0x0,0xd0,0x7a,0xe2,0x7f,0xc8,0x34,0xc0,0xf,0x0,0x60,0xb9,0xe8,0x84,0xaa, + 0xcf,0xbe,0x58,0x2d,0x5f,0xb5,0x5e,0x43,0xa6,0x22,0x10,0x8,0x44,0x8e,0xc7,0xc2, + 0x92,0x4,0x81,0x39,0x8b,0x68,0xac,0xfd,0xa0,0x42,0xd3,0x29,0x91,0x20,0x41,0x2, + 0x0,0x15,0x0,0x9e,0x17,0x89,0x40,0x9a,0x1,0xe0,0x20,0x8,0xde,0x41,0x51,0xb1, + 0xee,0x6c,0xb5,0xf2,0x94,0xb3,0x54,0x64,0xb,0x22,0x77,0x57,0xc,0xa6,0x8f,0x10, + 0x88,0x13,0x91,0x1a,0xe8,0x91,0xfb,0x1f,0xbf,0xcf,0x2f,0xe8,0x4f,0xf,0x3,0xc0, + 0xc2,0xa3,0x86,0xe4,0x43,0x4c,0x65,0x24,0x6e,0x10,0x35,0x1e,0x45,0x4d,0x73,0xf4, + 0xca,0x53,0xce,0x4a,0x63,0x65,0x15,0x2,0x81,0xc8,0xa1,0x4,0x3,0x3a,0xc,0x2, + 0xf0,0x35,0xcc,0xd2,0x4a,0x17,0xaf,0x50,0x23,0x87,0xf6,0x8a,0xd4,0xa1,0xd7,0xc1, + 0xe4,0x1d,0x4f,0x2f,0x1e,0xfb,0x8f,0x53,0xa5,0xb0,0xfe,0x1b,0x26,0x2b,0xb0,0x8c, + 0x9d,0x3a,0x59,0x86,0xfa,0x8f,0x5f,0x93,0x12,0xae,0xb4,0x42,0xa6,0x22,0x10,0x8, + 0x44,0x4e,0xc1,0x53,0x59,0xcb,0xc2,0x7,0x76,0x79,0x4,0xa3,0x90,0xfe,0x13,0xd, + 0x88,0x32,0x85,0x95,0x59,0x29,0x32,0x52,0xe9,0xe2,0x15,0xaa,0xa7,0xbc,0x52,0xc7, + 0xed,0x4,0x84,0xb1,0xa7,0x81,0xe9,0x23,0x4,0x22,0x67,0xd,0x48,0x45,0xa5,0x5e, + 0x34,0x6b,0x9e,0x96,0xe8,0x6e,0x17,0xc9,0x3a,0x9d,0x73,0xe2,0x3f,0x28,0x53,0x3c, + 0x20,0x94,0x8f,0x2a,0x5d,0xbe,0x2e,0x8d,0xca,0x1,0x81,0x40,0x1c,0x7,0xcc,0x34, + 0xe4,0x1d,0x8a,0xe7,0x2d,0x51,0x5,0xd,0xc8,0xb2,0xa3,0xf6,0x81,0x65,0x32,0x20, + 0xab,0xc5,0xc2,0x9e,0x6a,0xea,0xad,0xae,0xc5,0xe8,0x3,0x81,0x40,0x20,0xf2,0x1c, + 0x45,0xcd,0x73,0x74,0xc1,0x47,0xcb,0x0,0xa0,0x11,0x26,0x53,0x59,0x53,0x1a,0x90, + 0xc5,0x42,0x16,0xab,0x79,0x2e,0x9e,0xf7,0xc8,0x69,0x60,0x64,0x88,0x40,0x20,0xc4, + 0xe0,0x29,0x2d,0xd7,0x25,0xaf,0x8f,0x9,0x96,0xf4,0x36,0x1b,0x19,0x90,0x16,0x91, + 0x17,0x2a,0x55,0x75,0x3a,0x2a,0x29,0x4,0x22,0x97,0x80,0xcb,0x11,0x91,0x3d,0xe4, + 0x40,0x9,0xa5,0xe9,0x94,0xc8,0xc1,0xc2,0xf2,0xe3,0x6c,0xc1,0x9,0xff,0xb1,0x54, + 0xc8,0x62,0x95,0x97,0xeb,0x28,0xb0,0x8,0x4,0x2,0xe1,0xe,0x8f,0x41,0xf2,0x78, + 0x45,0xc7,0xb,0x18,0x19,0x90,0x80,0xd0,0xcb,0xbc,0x3e,0xb4,0x1e,0xe8,0x6,0x22, + 0x10,0x8,0x97,0x80,0x10,0xe1,0xd6,0x58,0x92,0x91,0x1,0x91,0x5,0x5f,0xc6,0x50, + 0x59,0x22,0x10,0x98,0xc6,0x45,0xb8,0xc6,0x82,0x8,0x3f,0x69,0x64,0x40,0x84,0x16, + 0x4,0x23,0x84,0xe1,0xe2,0x41,0x20,0x10,0x5,0x9,0xe6,0x4a,0xe7,0x59,0xf4,0x9b, + 0x24,0xcb,0x6,0x24,0x27,0xcb,0x77,0x19,0x46,0x44,0x8,0x4,0x2,0x91,0x5d,0x4, + 0x22,0x9c,0xc2,0xb2,0x1e,0x81,0x0,0x65,0xa8,0xb0,0x11,0x33,0xeb,0x2f,0xe0,0x21, + 0x56,0x4,0x62,0x46,0x4c,0x8d,0x65,0x3,0xc2,0x70,0x1,0x23,0x10,0x8,0x47,0xb5, + 0x16,0x9e,0x5a,0x9e,0x6e,0x9f,0xcc,0xe,0x3,0x42,0xc5,0x5e,0xc5,0x90,0xb1,0x8, + 0x4,0x2,0xe1,0x1a,0xb,0xed,0xe0,0x26,0x3a,0x10,0xc6,0xd0,0x70,0x14,0xac,0xa4, + 0x21,0xdf,0x11,0x88,0x42,0xe,0x6,0x2d,0x1b,0x10,0x9d,0xa1,0x22,0x41,0x20,0xa, + 0x2,0xe8,0x28,0x22,0x6c,0x36,0x20,0x84,0x30,0x86,0x82,0x85,0x40,0x20,0x10,0xee, + 0x80,0x24,0x11,0x7,0xcb,0x78,0xb1,0x0,0xcb,0x61,0x27,0x10,0xa3,0x3d,0x4,0x2, + 0xe1,0x58,0x60,0x31,0xbd,0x11,0x8,0x65,0xc0,0x50,0xa9,0x21,0x10,0xd3,0xbd,0xa6, + 0x31,0xca,0x47,0xe4,0xb6,0xa5,0xc9,0xf2,0x20,0x21,0x45,0xe1,0x36,0x80,0x16,0x4e, + 0x29,0x7a,0x42,0x3b,0x2e,0xd4,0x93,0xbc,0x32,0x3,0x69,0xfa,0x43,0x37,0xe2,0x91, + 0x99,0x24,0x49,0xe,0xbc,0x87,0x30,0x22,0x4b,0x28,0x3,0x8,0x84,0x5d,0x98,0x59, + 0xa7,0xdc,0xc9,0x32,0x5e,0x64,0xaa,0x11,0x82,0x3b,0x86,0xca,0x23,0x87,0xc7,0x4a, + 0x71,0x45,0xd8,0x60,0xa8,0x14,0x99,0x8a,0x1f,0x92,0xb5,0xf2,0x1e,0x89,0x12,0x89, + 0xcc,0xc8,0x37,0x36,0x6c,0x5e,0x38,0xe0,0x29,0xf7,0xe3,0x1d,0x3b,0x88,0x19,0x5c, + 0x68,0xe,0xa6,0xb0,0x8,0xa6,0xb0,0x8c,0x6d,0xe,0x52,0xc6,0x3e,0x5a,0x6a,0xba, + 0x33,0x61,0x4e,0x5a,0x97,0x66,0xec,0x1b,0x29,0xc3,0x88,0x1e,0x91,0x37,0xa6,0xc6, + 0xb2,0x1,0x1,0x60,0xc,0x5,0x1e,0x43,0x34,0x84,0x4d,0xa0,0x94,0x20,0x11,0x66, + 0x7a,0xc5,0x16,0xb8,0x43,0x4c,0x9c,0xad,0xc2,0x22,0xc8,0x54,0x8c,0x41,0x10,0x76, + 0x49,0x8b,0xc4,0x18,0x9e,0xab,0x42,0x14,0x4a,0x4,0xc2,0x18,0x41,0x81,0x37,0xb6, + 0xaf,0xe8,0x51,0x22,0x4c,0xc8,0x8b,0xe,0x84,0xa1,0xd3,0x81,0x28,0x10,0x3,0x2, + 0x8c,0x31,0x14,0x78,0x63,0xfa,0x20,0x11,0x10,0x26,0x42,0xed,0x42,0x55,0x45,0xb8, + 0x4e,0x72,0x86,0x17,0x92,0x73,0x55,0x58,0x8c,0x21,0xf3,0x11,0x8,0x5b,0xfd,0xd, + 0x5c,0x4f,0x88,0x5c,0x9,0x2b,0xa6,0x3d,0x2,0x41,0x59,0x47,0xea,0x20,0xec,0x14, + 0x18,0x86,0xf7,0xeb,0x20,0xf2,0xd1,0xd6,0x64,0x5f,0x85,0x85,0x2,0x8f,0x16,0x4, + 0x61,0x93,0xbc,0x10,0xa7,0x55,0x0,0x4a,0x28,0xe2,0x4,0x99,0x70,0xb4,0xa,0xb, + 0x85,0xd0,0xe,0xb,0x52,0x7a,0x52,0xf5,0x4,0x91,0xe5,0xec,0xe9,0xc8,0x28,0xd0, + 0x34,0xb3,0xfd,0xfc,0x2,0xd3,0x29,0xa1,0xba,0xfd,0xe7,0x22,0x98,0xca,0x24,0x36, + 0xd,0x25,0xab,0x6c,0x1a,0xce,0x70,0x30,0x9d,0x11,0xa6,0x83,0xa5,0x71,0x69,0x5a, + 0x93,0x68,0x5a,0x97,0x45,0xfc,0x31,0x5c,0x4f,0x88,0x3c,0x71,0x69,0xd,0x23,0x10, + 0xc1,0x95,0x81,0xb2,0x6e,0x7,0xbb,0x2a,0x4f,0x6b,0x1e,0x95,0x7d,0xb2,0x8e,0x4, + 0x73,0x27,0x26,0xde,0x19,0xa8,0xe,0xee,0x1c,0xac,0xe5,0xdb,0xf,0x86,0x71,0x2b, + 0x62,0x86,0x23,0x10,0x7b,0x5a,0x99,0x8,0x5f,0x28,0x85,0x2,0x6f,0xb,0xcf,0x90, + 0x86,0x98,0x16,0xc0,0x3d,0x10,0x44,0x4e,0x68,0xa3,0x6c,0x90,0xfd,0x95,0xb6,0x28, + 0xf0,0x36,0x4,0x8c,0x4,0x15,0x7,0x7a,0x75,0x78,0xee,0xd4,0xcd,0xaa,0x80,0xe4, + 0xc9,0x79,0x39,0x92,0xdd,0x93,0xd9,0x45,0x20,0x14,0x99,0xca,0x71,0x28,0x5,0x23, + 0x39,0x89,0xe5,0x8d,0x80,0x21,0xa6,0x6d,0x51,0x32,0x96,0x47,0x8a,0x6,0xe1,0x56, + 0x61,0x75,0x2e,0x85,0xc5,0x8,0x43,0xc5,0x67,0x8b,0xea,0xa0,0x0,0x20,0x21,0xb5, + 0xa6,0xdd,0x63,0x98,0x19,0x17,0x9f,0x88,0x2e,0xca,0xc9,0xb,0x3e,0x71,0x3d,0x21, + 0xf2,0x4e,0xb7,0x65,0x7b,0x12,0x1d,0x5,0x9e,0x13,0x82,0x8,0x5b,0x7d,0xa4,0xa3, + 0x7b,0x57,0x9a,0xa0,0x93,0xc5,0x28,0xd2,0x6a,0x26,0xe9,0x8f,0x0,0x33,0x9b,0xe8, + 0x36,0x94,0xf1,0x52,0x64,0xaa,0x4d,0x12,0xce,0x90,0x1e,0x2e,0x86,0xe8,0x5,0x62, + 0xc,0xd7,0x5,0x62,0xa6,0xed,0x87,0x24,0xfe,0xa8,0x55,0x3,0xc2,0x8,0x43,0xc5, + 0xc7,0x8b,0xd0,0x10,0x48,0xc,0xe1,0xaa,0x46,0xca,0x50,0x68,0x10,0x79,0x63,0x6b, + 0x2c,0x47,0x20,0x93,0x55,0xbc,0x28,0xf0,0x62,0x34,0x36,0x78,0x8c,0x51,0xa4,0xa3, + 0x9b,0xc5,0x40,0x90,0xb5,0xd4,0x45,0xdd,0x9b,0xf1,0xa2,0x39,0x77,0x3b,0x3b,0x36, + 0x5d,0x69,0x8b,0x37,0x12,0xda,0xe0,0x74,0x13,0x46,0x90,0x8e,0xae,0x76,0x23,0x64, + 0xe1,0xee,0xd6,0x28,0x7,0x88,0x99,0x15,0x56,0x7,0xaf,0xb4,0x5,0xc6,0xf0,0xbe, + 0xb,0x3b,0x30,0x9d,0x5,0x58,0x78,0x63,0x64,0xe,0xf0,0x97,0x9,0xde,0xaf,0x83, + 0x57,0xda,0x22,0xf2,0xc8,0x2f,0xb2,0x6c,0x40,0x8,0x5e,0x69,0x6b,0x97,0x96,0x77, + 0x23,0x1d,0xf5,0x84,0x26,0xeb,0x29,0xed,0xb8,0x1e,0x50,0xb2,0x57,0xa6,0x60,0xe3, + 0xbe,0x99,0x24,0x4b,0x8c,0x78,0x25,0x9a,0xeb,0xec,0x15,0x34,0x20,0xd6,0x1d,0x32, + 0x8c,0x60,0x10,0x33,0xe0,0xf6,0x66,0x19,0x81,0xa0,0xc0,0x72,0x34,0x82,0xe8,0x73, + 0xc,0x98,0xe4,0x3a,0x3a,0x6,0x77,0xc,0xd4,0x86,0xf7,0xf,0xd7,0xe7,0xdd,0xca, + 0xf0,0x4e,0x47,0x5f,0x32,0xbe,0x8d,0x1b,0x7f,0xa3,0xb7,0x39,0xf8,0x4e,0x7f,0xa3, + 0xc0,0xd2,0x65,0xc4,0x63,0xef,0x1c,0x25,0xcf,0xf4,0xf7,0x62,0xab,0x39,0xb7,0xa5, + 0xd7,0x5b,0x59,0x9c,0x42,0xc5,0x90,0xc3,0x19,0x6,0xc9,0xc9,0x5e,0x58,0xd8,0x4c, + 0x91,0x6b,0x5f,0x85,0x38,0x21,0xb9,0x33,0x92,0xcb,0xd7,0xa3,0x2d,0x42,0x9d,0x73, + 0xa7,0xe3,0xbd,0x29,0x4d,0xa1,0x2e,0x56,0xaf,0x34,0xa5,0x49,0x98,0xb1,0xc8,0x79, + 0x8b,0x94,0xd5,0x83,0x59,0x97,0xf1,0xa2,0x40,0x38,0xca,0x34,0xfc,0x30,0x44,0x9e, + 0xbb,0xcb,0x98,0xb1,0x70,0x8b,0xdf,0x6b,0x64,0x40,0x84,0x9b,0x29,0xa2,0x40,0x58, + 0x67,0x5,0x23,0x92,0x3b,0xcf,0x20,0x63,0x84,0x8a,0x38,0x3e,0x22,0x75,0x95,0x43, + 0x51,0xe0,0x5d,0xb4,0xed,0xb8,0x91,0x10,0x99,0x6a,0xcb,0x9c,0x5d,0x1a,0xc5,0x61, + 0x6c,0x8a,0x38,0x41,0xab,0x30,0xbc,0xba,0x20,0xe7,0x95,0x91,0x73,0x6,0x84,0x51, + 0x86,0x77,0x59,0xd8,0x11,0xc,0xe2,0xf7,0x23,0xa,0x46,0x22,0x30,0x63,0x91,0xdb, + 0xe,0x38,0x71,0xf2,0x42,0x29,0x14,0x8,0x7b,0x34,0x28,0xd2,0x10,0x81,0x30,0x11, + 0xda,0xe2,0x7a,0x99,0x79,0xa5,0x65,0x47,0x19,0x2f,0x43,0xa6,0xe2,0x82,0x30,0xf8, + 0x2e,0xbc,0xa5,0x17,0x71,0x82,0xbe,0x40,0x3d,0x91,0xe3,0x21,0x88,0x93,0x27,0xd1, + 0x29,0xa,0x84,0x21,0x79,0xa8,0x59,0x36,0xe4,0x95,0xa0,0xf1,0xf9,0xce,0xf0,0x8e, + 0x13,0xc4,0x9,0x91,0x36,0x36,0x5f,0x75,0x4b,0x4,0x62,0x43,0x15,0xd6,0x64,0xff, + 0x69,0x14,0x8,0xab,0xc,0x73,0x29,0xd,0x45,0xab,0x6e,0x4a,0x4f,0xaa,0x1d,0xc8, + 0xd6,0x90,0x32,0xca,0x8,0x53,0x75,0x1b,0x2d,0x15,0x21,0xcc,0xe6,0x73,0x20,0x6a, + 0x2c,0xe5,0x53,0xc7,0x53,0x1,0xde,0x73,0x4a,0xa9,0x37,0x29,0x17,0x2b,0x69,0xa1, + 0x6f,0xd6,0xa8,0xad,0xd6,0x99,0xa6,0xa9,0x92,0x35,0x9f,0x55,0x5d,0xa6,0x69,0x5d, + 0x11,0x60,0x16,0xe4,0xfd,0x35,0xa6,0x8,0x1b,0x23,0x10,0xc6,0x18,0xa,0x84,0x1d, + 0xc6,0x9c,0x16,0xf4,0xf7,0x57,0x9f,0x35,0xbb,0x97,0xc8,0xee,0xdd,0x72,0x8f,0xb5, + 0x87,0xca,0x87,0x9f,0xef,0x58,0xc2,0x35,0xa4,0x4b,0x6a,0x86,0x2a,0xd6,0xd5,0xf, + 0xe5,0xdb,0xf7,0x85,0xf6,0xc,0xd5,0x8e,0xbf,0xd9,0x37,0xcf,0xc5,0xf1,0x76,0xe1, + 0x40,0xdc,0x2d,0x71,0x67,0x19,0x6f,0x6e,0xe9,0x4f,0xfe,0x7a,0x21,0xd9,0x74,0xf0, + 0xce,0x97,0xf6,0x31,0xa2,0xdd,0x88,0xc1,0xdd,0x5d,0x9d,0x9,0xc1,0xd6,0x40,0x93, + 0xdf,0x27,0x61,0xb7,0xe1,0x5c,0x97,0x55,0xf1,0x96,0x4a,0x76,0x44,0x20,0x80,0xbd, + 0xb0,0x2c,0x7b,0xe0,0xcc,0xbd,0x34,0x14,0x16,0x45,0x97,0xcb,0x90,0xe8,0x95,0xb6, + 0x99,0x52,0x7e,0xb9,0x7e,0x4e,0x48,0x98,0x7f,0x3a,0x76,0x1b,0xce,0x79,0x59,0x75, + 0xb2,0x17,0x16,0xb6,0x32,0xb1,0x41,0x81,0x4a,0xee,0xa5,0xa1,0x70,0x41,0xa0,0xcb, + 0x65,0x48,0xb8,0x41,0x9d,0xcb,0xd7,0x13,0x6a,0xa,0x41,0x29,0x98,0x51,0x87,0xca, + 0xb9,0x32,0x5e,0x46,0xb,0xef,0x3e,0x10,0x73,0xcc,0x65,0xf9,0x20,0x30,0x33,0x2b, + 0x89,0xc4,0xbd,0xdf,0x6f,0x7e,0x3d,0xe5,0x27,0x2d,0x98,0xe8,0xf7,0x31,0xc2,0x18, + 0x66,0x2c,0x72,0x3e,0x4,0x71,0x2e,0x2,0x61,0x80,0x2,0x61,0xbc,0x60,0x44,0xa2, + 0x38,0xf7,0x12,0x80,0xa,0x49,0x63,0xae,0x13,0xc0,0xfa,0xfc,0x84,0x53,0x3c,0x2c, + 0x4f,0xfd,0x74,0x53,0x42,0x8c,0xfa,0xc2,0x15,0xf6,0xc3,0x96,0x4d,0x74,0x86,0x2, + 0x61,0xf,0xc7,0x5c,0x9a,0xc2,0xe2,0x7f,0xd6,0xd1,0x1a,0x2,0xdc,0x3,0x1,0xc8, + 0xdb,0x3b,0xd1,0x25,0x57,0xb1,0xa,0x1b,0x10,0x39,0x68,0x40,0x90,0xa9,0x36,0xf0, + 0x82,0xb9,0x55,0x68,0xc5,0x3e,0x4a,0x62,0x6e,0x5f,0xb4,0x44,0x74,0x8f,0x87,0xb1, + 0xfc,0x94,0x75,0x22,0xbe,0xc7,0x83,0xa,0xda,0x9d,0xc8,0x32,0x85,0x45,0xd1,0x62, + 0x3b,0x17,0x32,0xe6,0xa1,0x5,0xa1,0x24,0xeb,0xef,0x67,0xee,0x91,0x2b,0x2,0x92, + 0xf0,0xf5,0x8,0x79,0xfa,0xdd,0x4c,0xf4,0xf3,0xdc,0xc4,0x57,0x77,0x6,0xcb,0x4e, + 0x96,0xf1,0x2,0x61,0x28,0x10,0x36,0x4,0x83,0x6e,0xa5,0xa1,0xd0,0x1e,0x10,0xa0, + 0xc,0x7d,0x28,0x6,0x79,0xea,0x4d,0x88,0x4e,0xdb,0x28,0x10,0x43,0x47,0x34,0xcf, + 0xa2,0x49,0x3b,0x9a,0x29,0x2,0x43,0xc6,0x3b,0xcb,0xb4,0x3c,0xd3,0x88,0xac,0xb0, + 0xbf,0xff,0xc3,0xa5,0x46,0xc4,0x9b,0x93,0x12,0xf7,0x46,0x20,0x68,0x28,0x5c,0xa6, + 0xb5,0x2c,0x1b,0x10,0x91,0x14,0x45,0x41,0xbb,0x94,0x42,0x29,0x1c,0x96,0x43,0x6a, + 0xc0,0xf1,0xb9,0x10,0x52,0x0,0x51,0x2c,0x11,0xbd,0xe1,0x33,0x5f,0xa3,0x51,0x49, + 0xb8,0x6a,0x13,0xa3,0xcd,0x9c,0x17,0x56,0x47,0xaf,0xb4,0x45,0x81,0xb0,0x18,0xdb, + 0x93,0xa3,0x8d,0x3c,0xdc,0x19,0x80,0x88,0xe4,0xb0,0xdc,0x2f,0x3e,0x44,0x3c,0xc5, + 0x33,0x53,0xe,0x99,0x35,0x26,0x10,0x8a,0x55,0x9b,0x68,0x40,0xb2,0x16,0x28,0x14, + 0x8,0x4b,0xa4,0x71,0xf1,0xa2,0x12,0xf9,0xaa,0xc9,0x12,0x57,0x77,0x57,0x61,0x11, + 0x42,0x4d,0x10,0xc,0x4f,0xa2,0x23,0xa6,0x97,0xd,0xf6,0x64,0x3d,0x6c,0x3b,0x7, + 0x82,0xb0,0x81,0x3c,0xac,0x50,0x73,0xc3,0x84,0x30,0xb7,0x7f,0x3b,0x15,0xfc,0x3e, + 0x4a,0xf3,0x55,0xe,0x4,0x7b,0x7d,0x4d,0xc6,0x58,0xa8,0x34,0x72,0x19,0x92,0x83, + 0xe7,0x40,0x58,0x21,0x2b,0x3e,0xbb,0xec,0x87,0x9b,0x15,0x28,0x4a,0xc6,0xd1,0x45, + 0x29,0x78,0xd4,0x6e,0xb2,0xce,0xd5,0xdd,0x9b,0xe8,0x80,0xbd,0xf3,0x5c,0xc2,0x4b, + 0x5b,0xae,0xb4,0x65,0x28,0x10,0x76,0xf0,0xcb,0x9d,0x34,0xa4,0x42,0xfd,0xec,0xc1, + 0xf5,0x32,0x24,0x11,0xa1,0xbb,0x29,0x27,0x6b,0x1a,0xf3,0x33,0x8a,0x44,0x8f,0x42, + 0xc0,0x51,0x74,0xdb,0x17,0xd9,0x60,0x40,0x5c,0x72,0xc,0x6e,0xba,0x98,0x5b,0xe8, + 0xed,0xcc,0x5,0xf6,0x56,0x89,0x9b,0xbf,0xdf,0x2c,0x7f,0x59,0x9e,0xd2,0x42,0xb4, + 0x83,0x30,0xc3,0x2b,0x6d,0xf3,0xc0,0x2c,0xe0,0x95,0xb6,0x79,0x15,0xd,0x8a,0x9f, + 0xfc,0x74,0x67,0x30,0x3c,0x3,0xe9,0x3b,0xc2,0x1c,0x8e,0x78,0x44,0x37,0xd1,0x27, + 0xbb,0xb9,0xbb,0xb7,0x99,0x22,0x83,0x3c,0xfd,0x3e,0x54,0x59,0xd3,0x12,0x81,0x50, + 0x36,0xd9,0xa0,0x19,0xa9,0x9e,0xd1,0xe3,0xca,0x4d,0x85,0xe6,0xd8,0xf7,0xb,0xa5, + 0xb0,0x50,0xa9,0x98,0x5f,0xbc,0xf8,0x81,0xb9,0x90,0x61,0x70,0x23,0x24,0x29,0x4f, + 0x9a,0x29,0x22,0x53,0xb,0x20,0x8a,0x13,0x31,0xa0,0x92,0xeb,0xd3,0x1a,0x44,0x92, + 0x44,0x23,0x7a,0x92,0x8f,0xb4,0x20,0x66,0xf6,0xb0,0x70,0xdd,0xbb,0x72,0x71,0x67, + 0x67,0x40,0x28,0xa6,0xb0,0xac,0x87,0x20,0xee,0xa5,0x9f,0xd0,0x41,0x42,0xe2,0xfe, + 0x42,0xc,0x22,0x51,0xd1,0x2b,0x6d,0x21,0x2f,0x69,0x21,0x61,0xd1,0x8d,0x6b,0x2, + 0x10,0xe7,0xdb,0xb9,0xa3,0x40,0x58,0xb7,0xe3,0x85,0x4b,0x43,0x2,0x5,0xd0,0xd, + 0x47,0xf8,0x3e,0x10,0x97,0xbb,0x53,0x8c,0x4c,0x6e,0xa4,0x23,0x72,0x9a,0x4d,0xe2, + 0xb6,0xc6,0xaa,0x1,0x99,0x3c,0x8,0x82,0x2,0x61,0x81,0x15,0x93,0x55,0xac,0xa4, + 0x70,0x9b,0x29,0x4a,0xc0,0xdc,0x2e,0x43,0x84,0x88,0xb6,0x73,0x7,0x92,0x97,0xb4, + 0x60,0x4,0xf,0x1e,0xbb,0x47,0x58,0x4d,0xb9,0xbe,0x99,0xc,0x88,0xa0,0x2f,0x44, + 0x91,0xe0,0x96,0x97,0xcb,0x34,0x2b,0xc,0x32,0x83,0xd1,0x8d,0x50,0x99,0x37,0x61, + 0x33,0x3a,0x47,0x67,0xc2,0x2c,0x96,0x17,0xfc,0x9a,0x7e,0xaf,0x15,0x5c,0xcf,0xeb, + 0x42,0x89,0x96,0xed,0x39,0x7,0xc2,0x50,0x20,0xac,0x2b,0x17,0x17,0xd3,0x90,0x99, + 0x14,0xc3,0x2,0x37,0x20,0x36,0x8a,0x1,0x73,0x36,0x92,0x11,0xde,0x3,0x61,0x98, + 0xb1,0xc8,0xf5,0x15,0xeb,0x60,0x2b,0x13,0xe6,0xb8,0xa0,0xe6,0x19,0x37,0x58,0x2e, + 0x2e,0xf6,0x1c,0xfb,0x7c,0x52,0x0,0x4a,0x85,0x88,0x6e,0xa2,0x93,0xfc,0xa4,0x5, + 0xde,0xea,0x90,0x3,0x22,0xc6,0x6c,0xe2,0xa4,0xfb,0xee,0x44,0xcf,0xef,0xf0,0x42, + 0xc0,0xe8,0xbb,0x35,0x2,0x11,0x49,0x61,0x11,0xe6,0xfe,0x14,0x96,0x6c,0xe2,0x3e, + 0x90,0x7c,0xa4,0x85,0xe0,0x9d,0xef,0xc,0x0,0x33,0x16,0x2e,0x55,0x6e,0x16,0x6e, + 0x24,0x44,0x81,0x30,0xa,0x2d,0xd0,0x7b,0xe3,0x7c,0xbd,0xab,0x3e,0x3f,0x53,0xf4, + 0x20,0x99,0xd8,0x64,0x26,0x6e,0xbe,0x50,0xa,0xdc,0x5c,0xb6,0xee,0xe,0x11,0x96, + 0x1c,0xbd,0xd2,0x96,0xa1,0x40,0x58,0xb6,0xe3,0xee,0xa5,0xa1,0xe8,0x26,0x3a,0xb8, + 0xfd,0x20,0xa1,0x60,0x4a,0x98,0xe6,0xab,0x39,0xa5,0xc2,0x2,0xe1,0x3a,0xde,0xba, + 0xed,0x32,0x38,0xe2,0x64,0xa,0x2b,0x47,0x9b,0x29,0xe6,0xe,0x53,0x49,0x61,0xa, + 0xe1,0xb1,0xfe,0x85,0xc0,0x53,0x4,0xaf,0xb4,0xfd,0x90,0x5e,0x79,0x49,0xb,0xe1, + 0x73,0x2e,0x4,0x8,0xde,0x60,0xea,0x1e,0xa9,0x36,0x30,0x20,0xee,0x16,0xf8,0xdc, + 0x52,0xa0,0x6e,0xfe,0x7c,0x81,0x3d,0x10,0x62,0x87,0x28,0xe7,0x34,0xa1,0x89,0xe8, + 0x37,0x32,0x46,0x20,0x3f,0xef,0x86,0x11,0xad,0x58,0x67,0x80,0xf7,0x7,0xb9,0x83, + 0x97,0x76,0x5d,0x28,0x85,0x2,0xe1,0x68,0xd8,0xe8,0x3e,0x3,0x5a,0x8,0x4a,0x45, + 0xc2,0x34,0xef,0x51,0x85,0x41,0x6c,0x1a,0x7,0xe9,0x39,0x7d,0xc2,0x6a,0x8b,0x1, + 0x11,0x4,0x45,0xa6,0xda,0xb3,0x1c,0xdc,0x4a,0x3b,0x22,0x24,0xb0,0x85,0x20,0x3b, + 0x4,0x18,0x57,0x81,0x4e,0xde,0x4d,0x99,0x77,0xb4,0x90,0xc4,0x53,0xde,0xc,0xf5, + 0x84,0x3b,0xd7,0x76,0x96,0xcd,0x14,0xd1,0x70,0x18,0xeb,0x3,0x46,0xa,0x40,0x8c, + 0x98,0x95,0x8,0x84,0x60,0x5a,0xe3,0x78,0x72,0xe5,0x23,0x2d,0x88,0x99,0xaa,0x4d, + 0xe4,0x75,0x8e,0x7b,0x3,0xe,0x6e,0xa2,0xe3,0xe2,0xe7,0xae,0x17,0x21,0x86,0xb9, + 0x36,0x85,0xc5,0x4f,0xfe,0x93,0x2,0xe9,0xe6,0x4c,0x8,0x61,0x7c,0x87,0x22,0x2f, + 0xaa,0xb0,0xd8,0x54,0x8a,0x40,0x90,0xa,0xc,0xf0,0x8c,0x59,0x8e,0xdb,0xf,0x27, + 0x5b,0x99,0x50,0x13,0xcf,0x22,0x32,0x70,0x81,0xb8,0x98,0x86,0x42,0x7b,0x20,0x5, + 0x22,0x43,0x84,0xff,0x99,0x2c,0x4f,0x69,0x21,0x7a,0x9,0x51,0x21,0x44,0xe4,0xf9, + 0x2f,0xa7,0x8e,0x5e,0x69,0x8b,0x2,0x61,0x39,0x4,0xc9,0x62,0xd4,0x3c,0xb9,0xc1, + 0x4f,0x2c,0x85,0x27,0x31,0x56,0x8,0x37,0x12,0x8a,0x44,0x99,0x93,0x17,0x7c,0xe6, + 0x1d,0x2d,0x18,0xd3,0x45,0x5b,0xb5,0x14,0x6,0xaf,0xf3,0x3a,0x69,0xc0,0x9c,0xec, + 0x85,0xc5,0x0,0x5,0xc2,0xb2,0x7d,0x75,0xf1,0xa2,0x12,0x6c,0xe5,0x52,0x18,0x8e, + 0x1d,0xf7,0x3b,0x29,0x8f,0x14,0x39,0x9b,0xee,0x23,0x78,0x23,0x61,0x61,0xad,0x59, + 0x7b,0xc,0x8,0x0,0x30,0x14,0x8,0x8b,0xdc,0x20,0x2e,0x5e,0x54,0x62,0x77,0xa2, + 0x17,0x88,0xc,0x11,0x7e,0xa3,0x53,0x4a,0xf2,0xf2,0x4a,0x5b,0x97,0xf5,0xa3,0xc9, + 0xa9,0x10,0x7e,0x26,0x5e,0xea,0x9c,0x1,0x61,0x5,0xd8,0xc8,0xc9,0x14,0x53,0x5, + 0x8f,0xd3,0x30,0x56,0xd8,0xad,0x4c,0xa,0x22,0x85,0xc5,0xc4,0xc4,0x25,0x1f,0x69, + 0xc1,0xcc,0x5c,0x40,0x87,0x19,0x8b,0xdc,0xf6,0x78,0x25,0xd1,0x47,0x6d,0xe9,0x85, + 0x85,0x2,0x81,0xb0,0xe8,0xbc,0xd2,0x1c,0x9f,0x1f,0xb1,0xa9,0x4d,0xb6,0xc4,0x18, + 0xe8,0xdc,0x88,0x2d,0x2f,0xab,0xd2,0x4c,0xdc,0x77,0x42,0x30,0x63,0xe1,0xe,0x5e, + 0xda,0x14,0x81,0x30,0x14,0x8,0x23,0xfa,0x88,0xed,0x1,0xb8,0x95,0x86,0xa2,0x9b, + 0xe8,0x5,0x21,0x43,0x58,0xee,0xe,0x79,0xd3,0x79,0xba,0x90,0x9d,0x62,0x6,0x2e, + 0xad,0xc2,0xca,0x4b,0xa6,0xb2,0x2,0x17,0x58,0xc1,0x56,0x26,0x85,0xb1,0x60,0x99, + 0x80,0x18,0x90,0x7c,0xa4,0x85,0x24,0x7e,0x73,0x1a,0xc3,0x8c,0x45,0xce,0x33,0x33, + 0x2b,0x6f,0x20,0xcb,0x73,0x20,0x14,0x53,0x58,0xc6,0x1a,0xc3,0x99,0x66,0x82,0xb9, + 0x1b,0x81,0xf1,0x2f,0x38,0xcb,0x74,0xff,0x80,0xdb,0xa2,0x12,0xd1,0xef,0x21,0xee, + 0xbd,0xf,0x84,0xba,0x91,0xaf,0xee,0xb3,0x20,0xe,0xdf,0x48,0x88,0x2,0x61,0xe4, + 0x71,0x89,0xd9,0x19,0xd7,0xd2,0x90,0x9,0xde,0x48,0x58,0x10,0x29,0x2c,0x21,0x49, + 0x70,0xb5,0x71,0xb4,0x23,0x5a,0x47,0xe4,0x84,0xd2,0x2,0xdb,0x6e,0x24,0x44,0xc6, + 0x5b,0xd6,0x1a,0x85,0x7c,0x10,0x5d,0xa8,0xbc,0xd5,0x1d,0x92,0x20,0x74,0x90,0x30, + 0x2f,0x69,0x41,0x74,0x13,0xe,0x5,0xea,0x8b,0xfc,0xd7,0x59,0x36,0x19,0x10,0x4c, + 0x5e,0xd9,0xe1,0x81,0xe7,0xe0,0x8a,0xb2,0xaf,0x41,0x26,0x11,0x78,0xa0,0x70,0xba, + 0xf1,0x8a,0xf9,0x12,0x79,0x58,0xc6,0x2b,0x61,0x37,0x5e,0xb7,0x88,0xa9,0x78,0x59, + 0xa4,0x5d,0x65,0xbc,0x28,0x10,0xd6,0x2c,0x2c,0x71,0x2d,0xd,0x85,0xaa,0xb0,0xa, + 0xe6,0x10,0x1a,0x11,0x14,0x86,0x19,0xf1,0x17,0x2c,0xc9,0x1f,0x93,0x98,0xb0,0xbe, + 0x60,0xe8,0x76,0xe6,0xbf,0xa3,0x63,0x57,0x4,0x72,0xd4,0x7e,0xa0,0x40,0x58,0xd2, + 0x7,0x93,0x65,0x48,0x85,0x4b,0x22,0x56,0x18,0xdf,0x2f,0x89,0x55,0x61,0xe5,0x27, + 0x2d,0x88,0xe0,0x9d,0xef,0xa8,0x11,0x72,0xc3,0xb3,0x33,0xe0,0x17,0x23,0x8e,0xee, + 0x81,0x60,0xf,0x3,0xcb,0xa0,0x66,0x19,0x97,0x47,0x82,0x2a,0x54,0x85,0xc6,0x5c, + 0xf9,0xed,0xd9,0x89,0x2,0xc9,0x4b,0x5a,0x98,0x3a,0x89,0x8e,0xbc,0xce,0x6d,0x47, + 0xc7,0x9e,0x3d,0x10,0x2a,0x2c,0x38,0x28,0x10,0x16,0xd,0xac,0xe4,0x4e,0x1a,0x52, + 0x61,0xe7,0xa2,0x40,0x9a,0x29,0x12,0xf1,0x3b,0x76,0xf2,0x4e,0xe9,0x98,0x98,0x33, + 0xc1,0x8c,0x45,0x8e,0xeb,0x2c,0x87,0xab,0xb0,0x50,0x20,0x2c,0xa9,0x46,0xe2,0xd6, + 0x45,0x45,0x84,0x9f,0x63,0x85,0x20,0x43,0x84,0x88,0x56,0x61,0x21,0xd0,0x91,0x98, + 0x59,0x6f,0xc0,0x31,0x3,0x42,0xdd,0x92,0xc2,0x9a,0x36,0xa6,0xa,0xf5,0x12,0x74, + 0xe7,0x39,0x8,0x33,0x11,0x48,0x61,0x9c,0x25,0x62,0x42,0xf,0xe4,0x21,0x2d,0x24, + 0x71,0xa5,0x83,0xe7,0xc6,0x72,0xdf,0xf1,0x63,0xc2,0x6c,0xb7,0x1c,0x81,0x30,0x86, + 0x2,0x61,0xa8,0x10,0xa,0xd7,0xa3,0x14,0x76,0x2e,0x66,0x40,0x7e,0xc8,0xcc,0xa4, + 0xc,0x85,0x22,0x10,0xe2,0xea,0x3d,0x10,0x6,0x4,0x53,0xde,0xb9,0xee,0xe,0x38, + 0x7b,0x12,0x1d,0x5,0xc2,0x92,0xca,0x0,0x0,0x89,0xb9,0x92,0x86,0x82,0x67,0xcb, + 0x24,0x2,0xac,0x20,0x64,0x48,0x28,0x85,0x95,0xa7,0x35,0xcd,0x92,0x7b,0x56,0x23, + 0x82,0x39,0x7e,0x27,0x3a,0x32,0x55,0x8c,0xc6,0x5,0x45,0x7,0x22,0x2c,0x88,0xa4, + 0x40,0xda,0x19,0x88,0x78,0x76,0x8c,0xe4,0x25,0x2d,0x88,0x44,0x4d,0xac,0x7,0x54, + 0xe4,0x2e,0x54,0x6e,0xd9,0x76,0xe3,0x45,0x81,0xe0,0x2b,0x4,0x9e,0x5e,0x71,0xe7, + 0x21,0x42,0x4a,0xc4,0x53,0x58,0x5,0x10,0x81,0x8,0x6e,0xa2,0xe7,0x67,0x99,0xab, + 0xe8,0x9c,0x19,0xc3,0xaa,0xcd,0xdc,0x77,0x6,0x9c,0x3d,0x48,0x88,0x2,0x61,0x43, + 0x60,0xe1,0xca,0x33,0x20,0xa2,0xe1,0x29,0xc3,0x3b,0xd1,0x8f,0x35,0x33,0x79,0xf9, + 0x6d,0x54,0x58,0x24,0x18,0x56,0x6d,0xba,0x24,0x73,0x60,0x47,0x2f,0xac,0xc9,0x63, + 0x20,0x28,0x10,0xd6,0xec,0x7,0x73,0x23,0xd,0x85,0xed,0x87,0x44,0x58,0x61,0xc8, + 0x90,0x24,0x76,0x12,0x3d,0xf,0x69,0xc1,0x48,0x76,0xa7,0x97,0x11,0xb9,0xe9,0xe9, + 0x88,0xa,0xb4,0xf5,0x8,0x4,0x5,0x42,0xc0,0xa3,0x64,0xb9,0x32,0x15,0x47,0x27, + 0x42,0xc5,0xcb,0x1,0xb,0xa3,0x8c,0x57,0x28,0x55,0xc9,0x48,0x9e,0xd2,0x2,0x79, + 0xed,0x1e,0x95,0x65,0x4b,0x4,0x22,0x9e,0x7d,0x40,0x81,0xb0,0xb4,0xae,0x88,0x5b, + 0x17,0x95,0xe8,0x39,0x10,0x22,0xa1,0xfc,0x1c,0xe3,0xca,0xdb,0x37,0x96,0x83,0x91, + 0x8c,0x89,0x32,0x5e,0xbc,0x80,0xce,0x35,0xce,0x80,0x4d,0x17,0x4a,0xa1,0x40,0xe4, + 0xd7,0x62,0x77,0xcc,0x80,0x98,0xd8,0x3,0x61,0x85,0x70,0x12,0x5d,0x64,0xa3,0x20, + 0x5f,0x15,0x2c,0xea,0x80,0x1c,0x90,0x30,0x36,0x93,0xe3,0x64,0xd9,0xb,0xb,0xdb, + 0x6b,0xf2,0x2,0x76,0xb1,0x90,0xd1,0x95,0x8d,0x14,0x45,0x35,0x2b,0x75,0xe5,0xf7, + 0x67,0x43,0x11,0x6,0x24,0x2f,0x69,0x21,0x99,0x89,0x22,0x31,0x63,0xe1,0x16,0x8b, + 0x65,0x4f,0x4,0x82,0x2,0x81,0x98,0x52,0x19,0x8a,0xa5,0x63,0x5c,0x77,0x1d,0x48, + 0xc6,0x8,0x82,0x8,0x6c,0xa2,0x3,0xc9,0xc7,0x8,0x44,0x12,0x9d,0x33,0x3,0xcc, + 0x58,0xe4,0x7e,0xa8,0x2c,0x1a,0x15,0xd8,0x51,0xc6,0x8b,0x39,0x4d,0x5b,0x3c,0x53, + 0x57,0xa6,0xb0,0x84,0xaf,0x39,0xa5,0x85,0x91,0xc2,0x2,0xd1,0x83,0x84,0xf9,0xee, + 0x8c,0x16,0x98,0xbe,0x75,0x99,0x3,0xed,0xf0,0x85,0x52,0x4,0x99,0xca,0xf1,0x28, + 0x5,0x22,0x38,0xe2,0xc2,0x4d,0x74,0x26,0x7a,0xcd,0x29,0x48,0xae,0xfc,0xfe,0xa9, + 0xbd,0x2d,0xfe,0x7a,0xca,0x4b,0x5a,0xc8,0xe2,0x7,0x8f,0x9,0x16,0xdd,0xe4,0xbc, + 0xa7,0x23,0x1a,0x78,0x5a,0x37,0x20,0x28,0x10,0x88,0xcc,0x21,0x88,0x73,0xce,0x45, + 0x3e,0x9c,0x9d,0x10,0xdd,0x27,0x20,0x2e,0xde,0x44,0x67,0x80,0xd7,0x3f,0xe4,0xbe, + 0xfd,0x70,0x30,0x85,0x5,0x28,0x10,0xd6,0x19,0xc6,0xdc,0x79,0x1f,0x86,0x68,0x77, + 0x24,0x9,0x68,0x41,0xc8,0x90,0x68,0x6a,0x40,0x67,0x4,0xe4,0x7c,0x73,0xca,0x66, + 0xa8,0x9b,0x22,0x76,0xc1,0x98,0x6,0x9a,0xda,0xd3,0xca,0x44,0xb0,0xa,0x6b,0x8a, + 0x9c,0x2d,0x32,0xf5,0x38,0x62,0x88,0x58,0x60,0x77,0xb6,0x32,0x11,0x96,0xc3,0x2, + 0xe9,0x8f,0xc4,0x5c,0xdb,0x1e,0x88,0x8,0x6e,0xbc,0x32,0x8a,0xfa,0x21,0xf,0x1c, + 0x9d,0xac,0x9e,0xcc,0xb2,0x95,0x9,0xa,0x4,0x9f,0x40,0x6e,0xff,0xc4,0xa9,0x15, + 0x23,0x15,0xaf,0xf0,0x66,0xac,0x20,0xce,0x11,0x88,0xad,0x13,0x8d,0x32,0x90,0xe5, + 0xfc,0xa2,0x7,0x5,0xca,0x44,0x9f,0x64,0x78,0x66,0xc4,0x2d,0x5a,0xcb,0x8e,0x4d, + 0x74,0x14,0x8,0xeb,0xf6,0x9c,0xb9,0x54,0x81,0xa,0xee,0x81,0x48,0x85,0xd2,0x4c, + 0x51,0xbc,0x33,0x5a,0x8e,0x7,0xd5,0x6c,0x2a,0x2f,0x42,0xec,0xb7,0x12,0x3a,0x9c, + 0x39,0x6f,0x3e,0x88,0xd3,0x27,0xd1,0x51,0x20,0x1c,0x64,0x5a,0xfe,0x40,0x17,0xd5, + 0x83,0x52,0x61,0xb4,0x73,0x17,0x6d,0x59,0xab,0xe7,0xa3,0x3c,0x48,0xb8,0x86,0xdd, + 0x2,0x9,0x1c,0x6d,0xa6,0x88,0xb0,0xae,0x5a,0x98,0x85,0x9f,0xe6,0x30,0x9f,0x74, + 0xd1,0x6f,0x28,0x8c,0x4d,0x74,0xe1,0x85,0x49,0xf3,0xae,0x30,0x85,0x8,0xcf,0x97, + 0x62,0xd1,0x4d,0x1e,0x30,0xd3,0xb9,0x8,0x84,0x31,0x14,0x8,0x7b,0x6c,0x88,0xeb, + 0x68,0x48,0x41,0xf4,0x24,0x7a,0xc1,0x44,0xb0,0xa2,0xb7,0x7c,0x12,0x1b,0x16,0xb7, + 0xd3,0xc6,0x51,0x7c,0xc7,0xb,0xcb,0xfe,0xdd,0x21,0xa7,0x36,0xa5,0xb0,0x8,0xa, + 0x44,0x46,0xe3,0x2a,0xb8,0x7,0xe0,0xd6,0x6e,0xbc,0x26,0x4,0xb6,0x20,0x64,0x48, + 0xf0,0x1b,0x49,0x3e,0xd2,0x3,0x6f,0x75,0x98,0x26,0xbf,0xd2,0x71,0x39,0x20,0x36, + 0x45,0x20,0x66,0xae,0xb4,0x45,0xc6,0x4e,0x69,0x3f,0x44,0xcf,0x62,0xb2,0x19,0x11, + 0x94,0xe9,0x37,0xa0,0xc2,0xe7,0x91,0x18,0x29,0x84,0x76,0x38,0x82,0x51,0x26,0xd5, + 0x28,0x51,0xf2,0x8c,0x1e,0x92,0xe0,0x26,0x3a,0x65,0x0,0x4,0x5b,0x1f,0xb9,0x46, + 0xa2,0x2d,0x47,0x20,0xc,0x5,0xc2,0xba,0x7,0xee,0xd6,0xfb,0x30,0x84,0x6f,0x24, + 0xcc,0x7,0xf9,0xb1,0x21,0x22,0x10,0x6f,0x52,0x7,0x79,0xd7,0xa0,0xd4,0xcd,0xdf, + 0x56,0x78,0x70,0x32,0x85,0xc5,0x50,0x20,0x32,0xd3,0x86,0x88,0x33,0xac,0x70,0x69, + 0x48,0x40,0x2a,0x88,0x76,0xee,0x92,0x68,0x8f,0xa1,0x7c,0xbc,0x21,0x41,0x12,0x9c, + 0x34,0xcd,0x93,0x66,0x91,0xac,0x80,0x8b,0x88,0x88,0x2c,0xec,0xfa,0x59,0x37,0x20, + 0x4e,0x36,0x53,0xcc,0x33,0xa6,0x12,0xe1,0x52,0x4c,0xe6,0x4e,0x81,0xa5,0x82,0xb2, + 0x41,0x18,0x2b,0x90,0x5,0x2b,0xd8,0xdd,0x41,0xca,0x3f,0x79,0x60,0xb2,0xf8,0xfe, + 0xe,0xc3,0xa,0x4f,0xd7,0xf8,0x7e,0x36,0x18,0x10,0x40,0x81,0xc8,0x68,0xef,0x4, + 0x8d,0xab,0x4b,0xbd,0x6f,0xe1,0xaf,0xca,0x90,0xc2,0x23,0xae,0x93,0x2b,0xc1,0x2a, + 0x2c,0xd,0x80,0x78,0xf3,0xec,0xdb,0x4d,0xa4,0x21,0x9,0xea,0x8b,0xdc,0x8e,0x26, + 0x9d,0x4e,0x61,0xa1,0x40,0x64,0x58,0x52,0xac,0xa0,0x69,0xc8,0x98,0xd8,0x49,0x74, + 0x22,0x4d,0x5e,0xa3,0x84,0xb,0xf3,0x43,0xc2,0xe5,0xdf,0xa9,0x3c,0x22,0x5c,0xa2, + 0xcc,0xff,0x7c,0xd4,0x27,0x33,0xcc,0x4b,0x7b,0x2e,0x94,0x32,0x51,0x42,0x83,0xc, + 0x9f,0x7a,0xad,0x10,0xe1,0xfb,0x30,0xdc,0x48,0x43,0x2a,0x7e,0x21,0x0,0x2d,0xc, + 0x19,0x12,0x93,0x7,0x46,0xf3,0x4f,0x89,0x32,0x49,0x3c,0x8a,0x46,0x7d,0xe1,0x1e, + 0x81,0xb6,0x21,0x2,0x41,0x18,0x99,0x72,0x41,0xbd,0x92,0x7b,0xb4,0xb6,0xa3,0xb2, + 0x4e,0xb8,0x9b,0x22,0x63,0x85,0x71,0xab,0xa5,0x98,0x67,0x47,0x19,0xcd,0xbf,0x5b, + 0x3e,0xcd,0x44,0xdb,0x58,0xb5,0x99,0xe3,0xbc,0x74,0xb4,0x17,0x16,0x45,0x81,0xc8, + 0x48,0x1a,0x9d,0xd9,0xbf,0x0,0xf3,0xd7,0x43,0xc9,0x1c,0x80,0x15,0x48,0x5,0x9a, + 0xa8,0xa3,0x40,0x67,0xe2,0x96,0x78,0x8b,0x3c,0x20,0x62,0x65,0x58,0x93,0x67,0x6b, + 0xb1,0x6a,0x33,0xa7,0xc5,0x54,0x72,0xf4,0x4e,0x74,0x40,0x81,0x30,0xa4,0x8d,0x10, + 0x1b,0xdc,0x59,0xc6,0x2b,0x9a,0xc0,0x23,0xa4,0x20,0xca,0x78,0xc5,0xcf,0xfb,0xb8, + 0xba,0x34,0x1e,0x8f,0xac,0xe7,0x7a,0xe4,0xc8,0x1c,0x6c,0xa6,0x28,0x5e,0x69,0x84, + 0x30,0xe2,0xa2,0x2b,0xa3,0x11,0x4c,0x61,0x9d,0xe8,0xe4,0x8b,0x11,0x44,0xcb,0x3f, + 0x19,0x10,0x6e,0xa6,0xc8,0x30,0x63,0x91,0xf3,0x90,0x1c,0x6f,0xe7,0x8e,0x2,0x31, + 0xb5,0x2,0xb5,0xe8,0x9,0xe4,0xfd,0xf7,0x8b,0xa6,0x62,0xa4,0x82,0x90,0x1f,0x62, + 0x22,0xaa,0xc8,0xbb,0x6,0x93,0x26,0x4e,0xa2,0x13,0xec,0x9d,0xe7,0x92,0xdc,0x81, + 0x3d,0x29,0x2c,0x82,0x2,0x91,0xd1,0xe3,0x14,0xae,0xc2,0x2a,0x68,0x1a,0x4a,0x8c, + 0x16,0xc8,0xf7,0xb,0xee,0x81,0x60,0x54,0x8f,0x7a,0x61,0x66,0xc3,0x49,0x67,0x23, + 0x10,0x64,0xac,0xd5,0x10,0x84,0xb9,0xb3,0x9d,0xbb,0x89,0x3b,0xd1,0xb,0xe0,0x4a, + 0x0,0x22,0xb9,0xf7,0xce,0xc,0x89,0x48,0x74,0xe6,0xd6,0x19,0x62,0x86,0x22,0x65, + 0x9b,0xc,0x8,0xa,0x84,0x35,0xfb,0xe1,0x56,0xe7,0x5b,0xb8,0x9d,0xfd,0xc,0x11, + 0xc0,0xf1,0x5b,0xff,0x24,0xc1,0x32,0x5e,0xc8,0xbf,0x1b,0x9,0xa9,0x89,0xe7,0xf0, + 0x6,0xd3,0x5c,0xb7,0x20,0x59,0xf1,0x27,0xfb,0xb,0xa5,0x50,0x20,0x32,0x2c,0x16, + 0xb1,0x3,0xc5,0x84,0x11,0x77,0x5e,0xe9,0x2a,0xbc,0x87,0x4e,0x68,0x61,0xc8,0x90, + 0xa0,0xa3,0xa5,0xe7,0xe1,0x49,0x74,0x39,0x1f,0x9c,0x48,0xa,0x8,0x11,0x85,0x44, + 0x1c,0x6c,0xa6,0x68,0xb9,0x2c,0xcf,0xcd,0x4c,0x15,0xbd,0xd2,0x15,0x98,0x4b,0xe9, + 0x20,0xde,0xca,0xa4,0x10,0x16,0xb7,0xa9,0x48,0x2b,0xdf,0xe8,0x21,0xee,0x2d,0xa0, + 0x22,0x77,0xe7,0xfa,0xb6,0xb0,0x7,0x82,0x2,0x91,0x79,0xb1,0x14,0x72,0x4,0x46, + 0x85,0xab,0xb0,0x28,0xc3,0x4d,0xf4,0xf,0xc9,0xa6,0x53,0x92,0x6f,0xf4,0x60,0x4c, + 0xfc,0x20,0x21,0xc5,0x8c,0x45,0xae,0x47,0x20,0xe,0xee,0x81,0x50,0x46,0x50,0x20, + 0x32,0x2c,0x16,0x2a,0x89,0x9e,0xa5,0x71,0xa5,0x2,0x65,0xe2,0xcd,0x88,0xf1,0x4e, + 0xf4,0x13,0x56,0xb0,0x4b,0x83,0x4d,0x98,0xbc,0xff,0x1,0xf7,0x4c,0x73,0xdb,0x7e, + 0x38,0xd8,0x4c,0x91,0x2,0xa0,0x40,0x64,0xd6,0xa0,0xc2,0x16,0xdf,0x95,0x34,0x64, + 0xba,0x60,0x2f,0x30,0xa0,0x5,0x21,0x43,0x92,0x68,0xa5,0x92,0x9e,0x7f,0x6b,0x4a, + 0xa6,0x98,0x86,0x28,0x40,0x5b,0x63,0x3d,0x2,0x1,0x8a,0x35,0xeb,0x86,0xe6,0x55, + 0x40,0xaf,0x38,0xd5,0xdd,0xc1,0xe9,0xb3,0x16,0xc2,0x11,0x8,0x30,0x20,0xb8,0x89, + 0x7e,0xdc,0x92,0xca,0x33,0x7a,0x98,0x3a,0xc7,0x83,0xe7,0xc6,0x72,0x9d,0x9b,0x4e, + 0x97,0xf1,0xa2,0x40,0x64,0x6f,0x3e,0x8e,0x2a,0x16,0x57,0xd2,0x50,0xd0,0xb9,0x28, + 0x14,0xf9,0x91,0x9c,0x2a,0x4c,0xf9,0x50,0xac,0x9c,0xa3,0xab,0x68,0xa,0x96,0x1, + 0x76,0xae,0xc8,0x7d,0x6f,0xc0,0xd1,0x2b,0x6d,0x51,0x20,0xac,0x2e,0xaa,0xc9,0x6d, + 0x90,0x82,0x2d,0xe3,0x95,0x80,0xd0,0x42,0x90,0x21,0x89,0x9,0xb6,0x73,0xd7,0xf3, + 0xb1,0x5f,0x14,0xc1,0x8c,0x45,0x6e,0x28,0x7f,0x66,0xc3,0x18,0xe,0x76,0xe3,0xc5, + 0x66,0x8a,0x46,0x1e,0xa0,0xf8,0x95,0xb6,0x2e,0xf4,0xc2,0xa9,0x68,0x2f,0x2c,0x2, + 0xb4,0x20,0xa2,0x10,0xd1,0x93,0xe8,0xc,0x48,0xde,0xd1,0x43,0xb8,0x55,0x3d,0x66, + 0x2c,0xdc,0x64,0xae,0x6c,0x30,0x20,0x28,0x10,0x96,0x23,0x10,0xd7,0x9a,0x60,0xd1, + 0x56,0x60,0xee,0x6a,0xa6,0x48,0x32,0x46,0xf,0x82,0x9e,0x1d,0x33,0x1a,0x23,0xcf, + 0xd,0x8,0x21,0x8c,0x60,0xc6,0x22,0xc7,0x83,0x18,0x7b,0xf6,0x40,0x44,0x85,0x9d, + 0xa0,0x40,0x64,0x74,0xc1,0x45,0x23,0x15,0x77,0x2e,0x2a,0xd1,0x8,0x8c,0xe8,0x5, + 0xa2,0x54,0x88,0x6b,0x9b,0x29,0xa,0xf7,0x4f,0x62,0x6e,0x74,0x97,0x5c,0xe6,0x40, + 0x8b,0xf7,0x35,0xb3,0x25,0x85,0x85,0xcc,0xb5,0xbe,0xfa,0xdc,0x79,0xa1,0x14,0x15, + 0xfd,0x7c,0xb9,0x30,0x2e,0x94,0x92,0xc0,0xc4,0xc2,0xcc,0xb7,0x14,0x16,0x5e,0x96, + 0x55,0x88,0xc1,0x8a,0xd,0x6,0x4,0x50,0x20,0x1c,0x5b,0x7c,0xf9,0x2d,0x60,0x6, + 0xe2,0x63,0xdb,0xf7,0xd3,0x9c,0x4e,0xa7,0xa,0x1e,0x2c,0xa5,0xb9,0xfe,0x1d,0x53, + 0xd1,0x1d,0x84,0x1b,0x45,0x52,0x4c,0x79,0xe7,0xf8,0xaa,0x75,0xf6,0x4a,0x5b,0x82, + 0x2,0x61,0xc9,0x1,0x7,0x0,0xc6,0xdc,0x48,0x43,0x2a,0x5a,0x60,0x21,0xc9,0x94, + 0xe2,0x26,0xfa,0x31,0x4b,0xa,0xb,0x53,0x4c,0x2c,0x1d,0xd4,0x3d,0xb6,0xdb,0xf, + 0x53,0x6b,0x91,0x7c,0x60,0x2b,0xec,0xbb,0xf,0x4,0x99,0x7a,0xd4,0xb1,0x26,0x85, + 0x7d,0xab,0xa3,0x78,0x11,0x33,0xc5,0x2b,0x6d,0x8f,0x73,0xd3,0x49,0xbe,0xd1,0x43, + 0x96,0x4c,0xf9,0x4b,0xa8,0x1f,0xdc,0x95,0x65,0xc8,0xde,0x80,0x30,0x60,0x28,0x10, + 0x19,0x53,0x11,0xba,0x78,0x19,0xaf,0x1b,0x3d,0x17,0x2a,0x58,0x98,0x23,0x43,0x41, + 0xdc,0xc8,0x38,0xb9,0xd7,0x23,0x64,0x40,0xf2,0xee,0xda,0x57,0x46,0x64,0xbc,0xc1, + 0xd4,0x35,0x82,0x2a,0x99,0x8d,0x40,0x60,0x2a,0x3,0x42,0x51,0x20,0xac,0x2a,0xc, + 0xf1,0x83,0x84,0xee,0xa4,0x21,0x29,0x28,0x3,0x2a,0xe2,0x7a,0x8b,0x2e,0xa9,0x3c, + 0xf9,0x1c,0x76,0x8c,0xb7,0x24,0x18,0x81,0x50,0x74,0x38,0x73,0x3f,0x73,0x60,0xa6, + 0xaf,0x59,0x46,0x3,0x22,0x7e,0x90,0x10,0x5,0x22,0xc3,0x5a,0x11,0xbe,0x23,0xc1, + 0xa5,0x27,0xd1,0x45,0x5b,0x99,0xd0,0x2,0x49,0x61,0x89,0x9e,0x3,0x41,0x25,0x8b, + 0x98,0x41,0x98,0xbb,0xce,0xcc,0xaa,0x1,0x41,0xd8,0xc5,0x89,0xac,0xfd,0x85,0xdc, + 0xf5,0x64,0x4,0x45,0x50,0xa6,0x85,0x20,0x6f,0x44,0xb4,0x17,0x16,0xfd,0xdf,0xbc, + 0x72,0xfe,0xd8,0x46,0x53,0x51,0x24,0xea,0x96,0x9c,0xe6,0xa5,0x64,0x26,0x2,0x91, + 0xec,0x30,0x20,0x28,0x10,0xd6,0x58,0xc6,0xdc,0x48,0x43,0xe1,0x6a,0x22,0xa9,0x30, + 0xbc,0x6d,0xf1,0xab,0xf8,0x38,0x74,0xcb,0xc5,0xfb,0x53,0x8,0x13,0xef,0x9d,0x47, + 0x30,0xba,0xca,0x6d,0xbf,0x97,0x38,0x98,0xc2,0x62,0xc,0x5,0x22,0x23,0x4,0xaf, + 0xb4,0x95,0x80,0xb9,0x94,0x86,0x62,0x57,0xda,0x12,0x89,0x16,0x84,0xc,0x9,0x2e, + 0x4c,0x46,0x29,0xc9,0x3b,0x7a,0x48,0x12,0xea,0x80,0x69,0xb3,0xcd,0x4e,0xef,0x11, + 0x12,0x5b,0x36,0xd1,0x51,0x20,0xac,0x32,0x95,0x49,0xa2,0xad,0x2b,0x18,0x61,0x85, + 0x7b,0x12,0x5d,0x22,0x8c,0x92,0x42,0xb8,0xd5,0x52,0x74,0x5f,0x83,0x4a,0x40,0xf2, + 0xee,0x4a,0x5b,0xe1,0x83,0xe8,0x84,0xe0,0xd,0xa6,0x39,0xae,0xdc,0xa6,0xdd,0x80, + 0x48,0x0,0x50,0x32,0x99,0xfb,0xa2,0x7e,0x4f,0xbc,0x3d,0xd8,0x28,0xf2,0x26,0xb9, + 0xc8,0x93,0x30,0xfb,0x2d,0x72,0xb1,0x27,0x45,0x24,0x73,0x2,0x27,0x17,0x29,0x69, + 0xa2,0x48,0xfa,0x8c,0x33,0x42,0xb4,0xa7,0x91,0x5b,0xbd,0x37,0xe1,0x5e,0x58,0x72, + 0x1e,0xb4,0x9b,0xb1,0x21,0x22,0x10,0x8c,0x40,0xf4,0x64,0x3a,0x90,0x1c,0x8c,0x54, + 0xe4,0x1a,0x9,0x94,0x12,0x6f,0xd2,0x6,0xa7,0x42,0xd6,0xa2,0x29,0xff,0x74,0xce, + 0x53,0xf6,0xcb,0x2a,0xf1,0xc8,0x1a,0x5a,0x82,0x6c,0xed,0x7,0x99,0xee,0x32,0x5e, + 0x2f,0x1,0x38,0xc3,0xb,0x0,0x40,0x55,0xa8,0x1a,0x7e,0xbe,0xf3,0xb,0x79,0x4f, + 0x34,0x9,0x54,0x20,0x92,0x66,0xee,0x37,0x4c,0x7,0x59,0x56,0xd,0xc,0x88,0xe0, + 0x2e,0x3a,0x2b,0xe8,0x14,0x16,0x10,0x5a,0x18,0x29,0x2c,0xc1,0x85,0x19,0x6b,0xf, + 0x5e,0x10,0x6b,0xf,0x5e,0xe0,0x46,0x12,0xa4,0x46,0xe2,0x2b,0x7b,0xee,0x3b,0xb0, + 0x12,0xd5,0x34,0x0,0x10,0x42,0x89,0x44,0x52,0x39,0xe8,0xf9,0x11,0x80,0xf3,0x7c, + 0xc7,0xff,0xdb,0x5b,0x69,0x80,0x18,0xb3,0x29,0x2,0x71,0xa1,0xb3,0x4c,0xc1,0x3, + 0x40,0x3d,0xa6,0x7e,0xa3,0x3,0x80,0x6a,0x83,0xa3,0xc3,0x80,0x51,0xe6,0xc6,0xfb, + 0x40,0x44,0x3f,0x5f,0x72,0xe5,0xf7,0x4f,0xe9,0x7f,0x23,0x10,0xff,0xeb,0x37,0x4a, + 0x4c,0x67,0x45,0xb9,0x39,0x39,0x8f,0xa8,0x2f,0x98,0xb1,0xa,0xcb,0xb2,0x63,0x89, + 0x28,0x74,0x72,0x52,0x9b,0x9a,0x29,0x32,0xb7,0x9c,0xd4,0x47,0x3,0x32,0x59,0x86, + 0x85,0x64,0x70,0xa1,0xf6,0xc2,0x4d,0xf4,0x99,0xe3,0x1,0x73,0x8b,0x92,0xcc,0x4a, + 0x82,0x64,0x89,0xba,0xf2,0xfb,0x3f,0xea,0xab,0xe1,0x9a,0x42,0xe3,0xe1,0x5a,0xa0, + 0x1,0x99,0xb9,0x35,0xe5,0xce,0x2a,0x2c,0xc1,0x96,0x1c,0x84,0x41,0x81,0x54,0x61, + 0x49,0x18,0x81,0x20,0x30,0x2,0x41,0x2f,0xa2,0xa0,0x82,0xa3,0xec,0x15,0xbb,0x60, + 0x2b,0x13,0x89,0xb0,0xc2,0xd8,0x44,0x97,0x19,0x1a,0x10,0x44,0xc1,0x18,0x10,0x14, + 0x76,0xe7,0x40,0xb,0xba,0xa,0x4b,0xc6,0x66,0x8a,0x8,0x4,0x46,0x20,0x88,0xac, + 0x35,0xb,0xb8,0xb1,0x1b,0xaf,0x70,0x2f,0x2c,0x89,0x42,0x21,0xb4,0x73,0x97,0x64, + 0x74,0xca,0x70,0x13,0x1d,0xd,0x8,0x62,0x9a,0x35,0xad,0x5b,0x3a,0xb1,0xa,0x1e, + 0x24,0x24,0x52,0x61,0x5c,0x28,0x25,0x89,0xb7,0x67,0x2e,0x4,0x7d,0x83,0x70,0x8b, + 0x58,0x9b,0x37,0x20,0x2a,0x0,0x74,0x6a,0x47,0x57,0xbf,0x56,0x34,0x6b,0xc5,0x9b, + 0x42,0xfa,0x44,0xa5,0xa6,0x6b,0x9e,0xa9,0x46,0xfd,0xc2,0xe5,0xa0,0x1f,0xbe,0x7, + 0x7c,0x0,0xcc,0x54,0x2b,0x5c,0x4a,0x99,0x17,0x74,0xa6,0x98,0x9a,0x1c,0x63,0xa, + 0xd3,0x99,0xc7,0x32,0x7,0xbc,0x72,0xdc,0x8d,0xa,0x94,0x31,0x61,0x6d,0x51,0x10, + 0xce,0x8a,0x52,0x5d,0x34,0x11,0x58,0x50,0xf1,0xcc,0xf1,0x82,0xc7,0x14,0xaa,0x59, + 0x97,0x21,0xcb,0xbc,0xd2,0x99,0x2,0xd4,0xda,0x3c,0x92,0x43,0x91,0xf5,0xc0,0x8c, + 0xd7,0x9d,0xe4,0x95,0xc7,0xbd,0x55,0xc5,0xad,0x19,0xd7,0xa1,0x4e,0x3d,0xc0,0xa8, + 0x92,0x3,0xf4,0xf0,0x2,0x5,0x79,0xa6,0xe7,0x41,0x35,0xe6,0xe3,0xd1,0x74,0x3a, + 0xa0,0xc7,0xc7,0x9a,0x4e,0xf8,0x17,0x3b,0x23,0x90,0x34,0x3,0x38,0xa4,0x4d,0xda, + 0xf,0x25,0xd9,0x70,0xc9,0x15,0x4f,0xa3,0x21,0x46,0x64,0xeb,0x6e,0x12,0x49,0xa2, + 0xa4,0x0,0x2e,0x95,0xf2,0xd7,0x96,0x84,0xfc,0xe7,0x97,0xbc,0xe8,0xd6,0xef,0xeb, + 0xfc,0xcd,0xce,0xb5,0x8c,0x19,0xdf,0x61,0xa0,0x94,0x78,0xfa,0x1a,0x2f,0x5f,0xf4, + 0x30,0x26,0x1d,0x72,0xdb,0x61,0xec,0xf8,0xf5,0x7f,0x7e,0x5b,0x70,0xfd,0x5a,0xbe, + 0x50,0xa,0x99,0x8a,0xc8,0x40,0x4f,0xc1,0x8c,0x4d,0xa1,0x5c,0x28,0xe5,0x7e,0x86, + 0x8b,0xe9,0x1b,0xe4,0x75,0x1e,0xb8,0x7e,0x84,0x9,0xa6,0xa0,0xad,0x5f,0x69,0x8b, + 0x2,0x81,0x98,0x5a,0x36,0x4,0xcf,0x81,0x48,0xa,0x9d,0xb1,0x45,0x82,0xb0,0x93, + 0xa0,0x8c,0x6f,0x44,0x18,0xd2,0xdd,0xa5,0x59,0x86,0x6c,0x37,0xd1,0x9,0xa,0x4, + 0x22,0xa3,0x73,0x21,0x0,0x49,0x6,0x8a,0x32,0x54,0x30,0x6,0x64,0xc6,0x77,0xd1, + 0x9,0xca,0x9a,0x5d,0xe1,0xa4,0x1d,0x6,0x84,0x21,0x53,0x11,0x96,0x94,0x5,0x91, + 0x14,0x8a,0xfc,0x2f,0x14,0x9d,0x43,0x18,0xf2,0xda,0x2d,0xce,0xc0,0xa4,0xff,0x67, + 0x39,0x2,0x41,0x81,0x40,0xf0,0xbc,0x13,0x63,0x11,0xa4,0x14,0x8,0xde,0x68,0x57, + 0x30,0x36,0x6,0x6f,0x30,0x75,0xe5,0x1a,0xcf,0xfe,0x1c,0x8,0xa,0x4,0x62,0x2a, + 0x50,0xc1,0x2a,0x2c,0x59,0x66,0x78,0xec,0xc8,0x15,0xaa,0x44,0x80,0x89,0xc,0x53, + 0xde,0xf9,0xc0,0x4a,0xf1,0x9d,0x6d,0x6b,0x6,0x84,0x31,0xdc,0x3,0x41,0x58,0xb, + 0x40,0x40,0x2,0x8a,0x7,0xcc,0x10,0x8,0x77,0x45,0x20,0xa2,0xd7,0x1,0xe1,0xca, + 0xcf,0xab,0xa8,0x80,0x3a,0x66,0xec,0x29,0x13,0x39,0x0,0xca,0x98,0x93,0x73,0x42, + 0x4c,0x2b,0xc4,0xea,0x78,0x91,0xdf,0x6e,0xe1,0xa5,0xf5,0x8,0xc4,0x69,0xa5,0x84, + 0x70,0x59,0x8,0x82,0x7b,0x1f,0xd3,0xcb,0x0,0x67,0xe9,0xcb,0x7d,0x17,0x63,0xcc, + 0xe9,0x39,0x21,0xb2,0x93,0x1c,0xc7,0xc,0x8,0x41,0x81,0x40,0x64,0x1f,0x9d,0x32, + 0x86,0xf2,0xe3,0x26,0x7f,0x81,0x9,0x3c,0x83,0x98,0x3e,0x16,0xd8,0xe4,0xcc,0x13, + 0x61,0xfd,0x6f,0xb9,0xa,0xb,0xe1,0x14,0x53,0xf3,0x2f,0x8,0x26,0x22,0xc4,0x29, + 0x58,0xfa,0xb8,0x91,0xe3,0x22,0xaa,0x9,0xf9,0xed,0xca,0x2c,0x43,0x76,0x6,0x84, + 0x31,0x14,0x8,0x44,0xd6,0x6,0x84,0x10,0xf7,0x3a,0x2a,0x94,0x15,0x5c,0x71,0x9, + 0x43,0xba,0x14,0x16,0x2f,0xc1,0x8e,0x3d,0x10,0x14,0x8,0x44,0x46,0xe7,0x42,0xe0, + 0x29,0x94,0x1f,0xb7,0xf8,0xa2,0x2,0x6c,0x74,0x75,0x43,0x7b,0x57,0x7d,0x9c,0x73, + 0x7b,0x20,0xc8,0x54,0x44,0x6,0x9,0x24,0x62,0x8f,0x21,0x8f,0xdc,0x63,0x41,0x18, + 0xae,0x49,0x77,0xf0,0xd2,0xf4,0x83,0x16,0xae,0xb4,0x45,0x81,0x40,0x4c,0x69,0x1a, + 0x4,0xaa,0xb0,0x6c,0x4e,0x61,0x51,0x8c,0x66,0x72,0x5c,0x28,0x8,0xf2,0x8,0x23, + 0x90,0x29,0xec,0x7,0xa,0x5,0x62,0xa,0x65,0x21,0xe2,0xb5,0xa2,0x42,0x29,0x34, + 0xaf,0xd5,0xfe,0x37,0x63,0x37,0xc,0xbb,0x59,0xe9,0x60,0x15,0x96,0x4e,0x1,0x64, + 0x19,0x99,0x8a,0x38,0xd1,0xb1,0x10,0xd1,0x28,0x14,0xe5,0xa4,0x90,0xbc,0x56,0x46, + 0x90,0xdf,0x18,0x81,0x1c,0xc5,0x42,0x5,0x40,0x82,0xa1,0xad,0xed,0x97,0xdb,0x7e, + 0x20,0x4c,0x2,0xd,0x64,0xa2,0x4e,0x17,0x75,0x24,0x9f,0x12,0x9f,0xb6,0xb1,0x65, + 0x49,0x23,0x8a,0x94,0x9e,0xd6,0xb9,0x4b,0xd3,0x93,0x36,0x94,0x65,0x59,0x23,0x9e, + 0x6c,0xe7,0x7e,0x7c,0x24,0x41,0x29,0x2b,0x12,0x10,0x3f,0x86,0xad,0x70,0x5c,0xa3, + 0x73,0xf8,0x7c,0x64,0x4,0xef,0x3,0x99,0x8a,0x2c,0x69,0xaa,0x68,0x9,0xcd,0x6b, + 0xc7,0x58,0x5a,0x42,0xf7,0x32,0x35,0x6d,0xed,0x5a,0x60,0x56,0x2c,0x3,0xa8,0x4, + 0x20,0x21,0x7c,0xb0,0x27,0xb,0x3,0x32,0x5b,0x1,0x50,0x20,0xde,0x17,0xbd,0x10, + 0x45,0x0,0x61,0x87,0xd1,0x41,0xe4,0x95,0xbd,0x30,0xcd,0x3b,0x2d,0x96,0x9e,0xdb, + 0xf5,0xfb,0xbd,0xff,0x68,0xfe,0x55,0x54,0x1,0x6,0xb6,0x28,0x58,0xa6,0x33,0x1f, + 0x30,0x26,0xdb,0x22,0xbc,0xba,0x80,0x93,0x94,0x97,0x38,0xed,0xe8,0xff,0x7d,0x3e, + 0xc9,0x31,0x5,0x19,0xd,0x8,0x2,0xe1,0x8c,0xd7,0x8a,0x37,0x5a,0xba,0x86,0x99, + 0xdc,0x7,0x28,0xf3,0xeb,0x9,0xb5,0x5,0x49,0xe5,0x1e,0xf,0x30,0x93,0x1,0xc1, + 0xd2,0x2a,0xc4,0xf4,0x4b,0x1f,0x1,0xbc,0x4c,0xca,0x3d,0xbc,0x44,0x4f,0xa0,0x80, + 0x91,0x45,0xa,0xb,0xfb,0xda,0x20,0xac,0x67,0x1,0x90,0x6,0xa6,0x83,0x36,0xa4, + 0x19,0xc2,0xc1,0x0,0x23,0xbb,0x14,0x16,0xa,0x29,0xc2,0x11,0x6d,0x88,0xa,0x11, + 0x9d,0x1,0x44,0xde,0x2,0x9b,0x29,0x22,0x66,0x54,0xe9,0x50,0x8a,0x29,0x2c,0xd7, + 0x78,0x3,0x48,0x82,0x82,0xc,0x51,0xb2,0x35,0x20,0x98,0xc2,0x42,0x58,0xf6,0x5f, + 0xf2,0x4b,0xe9,0x60,0xe3,0x50,0x4,0xc2,0x2e,0x3,0x82,0x40,0x58,0x96,0x3f,0x86, + 0x4a,0x19,0x3,0x10,0x44,0xce,0xdb,0x7,0xd3,0x6,0x4,0xab,0xb0,0x10,0x4e,0x28, + 0x1d,0x6c,0x65,0xe2,0x26,0x67,0x0,0x81,0x11,0x88,0xb8,0x3b,0xf1,0x72,0xa,0x80, + 0x40,0xc3,0xa5,0x37,0x7f,0x53,0x9,0x94,0x26,0xac,0xce,0x44,0x8b,0x25,0x8b,0x18, + 0xfd,0xdf,0x4d,0x19,0xcb,0xaa,0x29,0xa9,0xf9,0xa8,0xe,0xb2,0x6d,0xe3,0xa9,0x9a, + 0x97,0xa5,0xa9,0xc7,0xae,0xf1,0xa8,0xae,0x2b,0x4c,0xb7,0xe7,0x70,0xd4,0xe4,0x78, + 0x4c,0x2,0x95,0xf9,0xed,0x93,0xd,0x5d,0xd2,0x53,0xd3,0x7b,0x50,0x4a,0xf6,0xc9, + 0x51,0xae,0x84,0xe2,0x8d,0x85,0x79,0x1,0xc9,0x27,0x8d,0x9d,0xa0,0x37,0x18,0x51, + 0x48,0xc2,0x96,0xc1,0x9,0xd1,0x88,0x4c,0x52,0xb6,0xc,0x25,0x93,0x14,0x0,0xd1, + 0x6d,0xf9,0x66,0xf,0x89,0xd9,0x43,0x3c,0x49,0x27,0x8a,0x3d,0xdf,0x27,0x49,0x52, + 0xa,0x24,0x49,0xb3,0x32,0x46,0xa2,0x77,0xf7,0x85,0x4c,0xd7,0x2,0x2,0x71,0x75, + 0x2d,0x14,0x1f,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x84,0x15,0x3,0xa2,0x31, + 0x0,0x0,0x25,0xe0,0x89,0x7b,0x2b,0xfd,0x96,0x5b,0x83,0x78,0x2b,0xfd,0x31,0x5c, + 0x86,0x8,0x44,0x7e,0xa2,0xe5,0xc6,0x55,0x3f,0xb0,0x37,0x38,0xc5,0x88,0x66,0xa6, + 0xd0,0xf9,0xbb,0x27,0x4e,0x63,0x7a,0xd2,0x27,0x62,0xaf,0x2c,0x18,0x90,0xf,0x5c, + 0x5f,0x8a,0xcc,0x46,0x20,0x10,0x88,0xc2,0x83,0x1d,0x9b,0xe8,0x3a,0x92,0xd1,0xad, + 0xd2,0x81,0x25,0xb6,0x8,0x44,0x21,0xc2,0xc1,0xfb,0x40,0x50,0xd1,0x20,0x10,0x2e, + 0xf1,0x18,0xf0,0x50,0x27,0xc2,0x71,0x3,0x42,0x51,0xf0,0x10,0x8,0x4,0x22,0x1f, + 0x31,0x75,0x15,0xa4,0x65,0x3,0xf2,0xc1,0x20,0xfc,0xd3,0x82,0x58,0xf0,0xeb,0x14, + 0x53,0x11,0x8,0x4,0x22,0xa7,0x62,0x56,0xeb,0x6,0x44,0x47,0x85,0x87,0x40,0x58, + 0xf4,0x17,0x70,0xfd,0x20,0x72,0xc8,0x2c,0x10,0xd1,0xb0,0x40,0xe2,0x19,0x10,0x81, + 0x0,0x44,0xc7,0x5,0x80,0x40,0x20,0x10,0xa2,0xc8,0xfd,0xaa,0x55,0xdb,0x52,0x58, + 0x42,0x26,0x4,0x99,0x8a,0x40,0x20,0x10,0x85,0x17,0xab,0x58,0x37,0x20,0x14,0x95, + 0x2f,0x22,0xaf,0xa3,0x75,0x94,0x5d,0x4,0x62,0x1a,0x22,0x10,0xc1,0xd0,0x82,0xe2, + 0x22,0x44,0x20,0x10,0x79,0xe2,0x31,0x60,0x6b,0x1c,0xa7,0xc,0x88,0xd8,0x20,0x8c, + 0x11,0x64,0x2a,0x2,0x81,0x40,0x14,0x9e,0x39,0xb6,0x6e,0x40,0x28,0x1a,0x0,0x84, + 0x49,0x50,0x8c,0x58,0x11,0x8,0x8c,0x40,0x0,0x80,0x52,0xca,0x50,0x21,0x20,0x10, + 0x8,0x43,0x4d,0x83,0x4e,0x66,0x1e,0x41,0x72,0xae,0x8c,0x77,0x72,0xf,0x4,0x85, + 0x3,0x81,0x40,0x20,0xdc,0x61,0xed,0xcd,0x3f,0x99,0xb5,0x1,0x61,0xc0,0xf0,0x6e, + 0xdb,0xbc,0x9,0x4c,0x31,0x52,0x44,0x20,0x10,0x7c,0xa5,0x6e,0x87,0x1,0x11,0xb, + 0x63,0x74,0x8a,0x8a,0x9,0x81,0xc8,0x45,0x47,0x12,0x33,0x3,0x88,0x2c,0x20,0x49, + 0xc0,0x4,0x73,0x58,0x76,0x1c,0x24,0x44,0x41,0x45,0x20,0x10,0x88,0x5c,0x81,0x6e, + 0xf1,0x58,0x5,0xb5,0x69,0x13,0x5d,0x34,0xde,0xc1,0x14,0x96,0x3,0x4c,0x45,0x20, + 0x10,0x8,0x87,0xe0,0x60,0x15,0x96,0x4e,0x51,0x39,0x22,0x10,0x1f,0x59,0x18,0xd8, + 0x9d,0x1,0x91,0x9f,0x90,0xc0,0xc9,0x14,0x16,0x21,0xc,0x17,0xb,0x2,0x81,0x28, + 0x64,0x10,0x77,0x35,0x94,0x75,0xf0,0x24,0xba,0xae,0x13,0x64,0x2e,0x2,0x81,0x40, + 0xa0,0x1,0xc9,0x62,0x10,0x1d,0x15,0x34,0x22,0xc7,0xc4,0x1f,0x23,0x62,0x4,0xc2, + 0x82,0xcb,0xed,0x60,0x19,0x2f,0x76,0xe3,0x45,0x20,0x10,0x33,0xa9,0xee,0xb0,0xa, + 0x34,0x8f,0x23,0x10,0x36,0xf5,0xb9,0x45,0x64,0x2a,0x2,0x81,0x40,0xb8,0xdb,0x76, + 0x5b,0x37,0x20,0x68,0x2c,0x10,0x0,0x0,0x58,0x89,0x87,0x40,0xb8,0x25,0xa4,0x73, + 0xb2,0x17,0x96,0x8e,0xca,0x3,0x81,0x28,0x48,0x9f,0x1,0x1d,0x47,0x97,0xc2,0xc1, + 0x14,0x16,0x45,0x41,0x42,0x20,0x10,0x88,0x42,0xf4,0x21,0x6c,0x88,0x40,0x10,0x33, + 0x9,0x5d,0xc2,0xe8,0xf,0x81,0x40,0xe4,0x5e,0x4,0x22,0x94,0x7,0xd3,0x75,0x95, + 0xa0,0x12,0x43,0x20,0x1c,0x2,0x46,0xfb,0x88,0x3c,0x31,0x20,0xe2,0x37,0x12,0xa2, + 0x50,0x23,0x10,0x8,0xc4,0x34,0x42,0xcb,0xc5,0x49,0x61,0xa,0xcb,0x85,0x4c,0x45, + 0x20,0x10,0x88,0x3c,0x89,0x40,0x80,0xa2,0x22,0x45,0x14,0x4,0xb0,0x5c,0x1d,0x51, + 0x20,0x82,0xee,0x64,0x19,0x2f,0x2e,0x2c,0x4,0x2,0xe1,0x42,0xd0,0x42,0xdd,0xdb, + 0x65,0x4e,0x9e,0x44,0x9f,0x81,0xfb,0x40,0x28,0x6e,0xda,0x23,0x10,0x8,0xc4,0x34, + 0x85,0x20,0xa6,0x1f,0xb4,0xd0,0xb,0x8b,0xa2,0x42,0x47,0x4c,0xb3,0x3c,0x63,0x84, + 0x8b,0x40,0x38,0x19,0x82,0x38,0x17,0x81,0xe0,0x2,0x47,0x20,0x10,0x76,0xfb,0xc, + 0xe8,0x94,0x16,0x88,0x1,0xa1,0x14,0x99,0x8d,0x40,0x20,0x10,0x68,0x40,0xb2,0x18, + 0x84,0xe1,0x9d,0xe8,0xae,0x86,0x84,0xad,0xfa,0x11,0x88,0x42,0x8b,0xff,0x44,0xb5, + 0x83,0x75,0x3,0x2,0x14,0x95,0xc,0x2,0xe1,0x12,0xe8,0x14,0x2f,0x87,0x43,0x38, + 0x18,0x81,0x50,0x8a,0x42,0x87,0x40,0x20,0x10,0x79,0x19,0x6b,0x90,0x29,0x9d,0x7f, + 0x47,0xaf,0xb4,0xc5,0x14,0x96,0x33,0x4c,0x45,0x20,0x10,0x88,0xbc,0x89,0x40,0xc4, + 0xf2,0x60,0x3a,0x2a,0x3c,0x4,0xc2,0x9a,0xc7,0x80,0x45,0x28,0x88,0x1c,0x82,0xe4, + 0x74,0x2b,0x13,0x5c,0x0,0x8,0x4,0x2,0x61,0xd2,0x6f,0xc8,0xd1,0xe3,0xf,0xd4, + 0x41,0x3,0xc2,0x4c,0x1c,0x5b,0x44,0xa6,0x22,0x10,0x8,0x84,0x6b,0x22,0x10,0x1b, + 0xaa,0xb0,0xf0,0x46,0x42,0x44,0x5e,0x2f,0x16,0x8c,0x9e,0x11,0x88,0xac,0x74,0x3f, + 0x27,0x2,0x11,0x84,0x8e,0x8b,0x10,0x81,0x40,0xe4,0x5,0x88,0x8e,0xce,0xae,0x40, + 0x50,0xe0,0x60,0x19,0x2f,0xb3,0x27,0x85,0x85,0x8c,0x45,0x20,0x10,0x88,0x5c,0x88, + 0xca,0xcd,0xdf,0x5,0x65,0xa1,0x99,0x22,0x10,0x54,0xfe,0x8,0xf3,0x42,0x8a,0x32, + 0x83,0x40,0xe4,0x28,0x1c,0x6e,0xa6,0x88,0xca,0x0,0x81,0x40,0x18,0x69,0x1a,0x4c, + 0x73,0xa3,0x1,0x99,0x1a,0x3a,0xa,0x7,0x2,0x51,0x80,0xa0,0x6a,0x5a,0x8e,0x75, + 0x1c,0xac,0x4b,0xd,0xe,0x34,0xa5,0x22,0xc1,0x46,0x96,0x4e,0x97,0x28,0x81,0xd2, + 0x21,0x4f,0x79,0xd5,0x60,0xd1,0xac,0x59,0x3,0xc5,0xcd,0xf3,0x83,0x48,0xa5,0xbc, + 0x34,0xf7,0xe,0x47,0x20,0x88,0xbc,0x82,0xa6,0xbb,0xeb,0xe0,0x67,0xe7,0x6f,0xfe, + 0xf3,0x29,0x60,0x34,0x90,0x31,0x40,0xf6,0xf9,0xf7,0xb7,0xdc,0xfc,0x95,0xbf,0xb6, + 0xe3,0x5d,0x3d,0xf7,0xdc,0xf6,0x7d,0x3d,0x11,0x3d,0x3d,0xd3,0x7f,0x57,0x2,0xa5, + 0xdb,0x67,0xdd,0xf0,0xc5,0x6f,0x58,0x99,0x2f,0x7f,0xd9,0x12,0x95,0x10,0x29,0xc, + 0xb2,0x1c,0x26,0x92,0x32,0xa1,0x94,0x94,0x1c,0xf0,0xd5,0x36,0xef,0xae,0x58,0x75, + 0xda,0x3e,0xb9,0xbc,0x32,0x39,0x5d,0x74,0x8e,0x77,0x1c,0xae,0x9,0xee,0xdc,0xbe, + 0x45,0x8b,0x45,0x97,0x30,0x2d,0xdd,0xc4,0x74,0xad,0xe,0x8e,0x29,0xe5,0x3c,0x16, + 0x13,0xbb,0x0,0x80,0x90,0x24,0x51,0x3c,0x43,0x92,0xe2,0x1d,0xf0,0x56,0xd7,0xbd, + 0x52,0x7b,0xfe,0xa5,0xcf,0x4a,0xde,0x80,0x2d,0xf7,0x5f,0x77,0xdd,0xf1,0x83,0x47, + 0x19,0xd5,0x2b,0x4d,0x86,0x41,0x31,0x22,0x49,0x61,0x22,0xcb,0x93,0x7f,0x1e,0xdf, + 0x90,0xb7,0xb2,0x66,0x4f,0x60,0xc1,0x8a,0x3d,0x81,0x5,0x4b,0x87,0xa7,0x53,0x46, + 0xb3,0x9a,0xaf,0x81,0xed,0x26,0x92,0x14,0x6,0x59,0x9,0x12,0x49,0xe,0x49,0x3e, + 0x7f,0x97,0xb7,0xb6,0xe1,0x9d,0xaa,0x93,0x4f,0xdb,0xa9,0x54,0x35,0xc6,0x6c,0x30, + 0x20,0xe,0x36,0x53,0xa4,0xee,0x53,0x48,0x88,0xfc,0x41,0xec,0xc8,0xa1,0x5a,0x9e, + 0x32,0x96,0x7c,0x45,0x9d,0xb6,0x79,0xdd,0xe9,0xe4,0x3c,0xc3,0x77,0xf9,0x8d,0xdf, + 0x25,0x32,0x5f,0x7e,0x82,0x81,0x79,0x18,0xd3,0xab,0x81,0xea,0xd5,0xc,0xd2,0xf3, + 0xd2,0xa9,0xf8,0xda,0xf4,0xd8,0xf0,0x8d,0x91,0x43,0xbb,0x93,0xbe,0xda,0xa6,0xbb, + 0xea,0x2f,0xd9,0xf2,0xc7,0x63,0x15,0xb5,0xd5,0xc,0x41,0xf4,0xf0,0xde,0x86,0x89, + 0x1d,0x6f,0xdc,0xa0,0x45,0x82,0x1f,0x7,0xc6,0x3c,0x26,0xe6,0xe9,0x67,0x6a,0x7a, + 0x8e,0xae,0xa6,0xe7,0x24,0x7a,0xa3,0xa7,0xf7,0xdc,0xf3,0xf3,0x5b,0xfc,0xd,0xcd, + 0xf7,0xd7,0x6e,0xd8,0xfc,0x94,0x5c,0x5a,0x96,0xce,0xda,0x90,0xf5,0xf7,0x96,0x65, + 0xa5,0x8c,0x19,0xd,0x30,0x9d,0x6,0x98,0xae,0x35,0x2,0x0,0x40,0x22,0xe,0x5a, + 0x78,0xe2,0xd2,0x78,0x57,0x2b,0x8c,0xbe,0xac,0xc,0xc8,0xa5,0xe5,0xaf,0x55,0xae, + 0x3d,0xeb,0x8f,0x25,0x8b,0x4e,0x1a,0xb2,0xd5,0xf0,0x66,0x3b,0x5f,0x3,0x31,0x63, + 0x94,0x56,0x0,0x4d,0x57,0x30,0x0,0xa0,0xa9,0xc4,0x6a,0x2d,0x3c,0x71,0x79,0xbc, + 0xfd,0x7d,0x5d,0x9,0x94,0xbc,0x5e,0xbe,0xf2,0x94,0x3b,0xca,0x56,0x9f,0xd6,0x61, + 0x45,0xc0,0x1c,0x8c,0x40,0x28,0xa6,0xb0,0x10,0x33,0x86,0x64,0x5f,0xfb,0x1c,0xde, + 0x33,0x72,0x71,0xa0,0xd3,0xe,0x19,0xd5,0x82,0x13,0xfe,0xa3,0x5e,0x77,0x46,0x28, + 0x25,0xe5,0x86,0xef,0x12,0x99,0xaf,0x85,0x75,0xef,0x4f,0xd,0xf7,0x7d,0xbe,0xe7, + 0xbe,0x5f,0x6e,0x2a,0x5d,0xb2,0xf2,0xc7,0xd5,0x67,0x5d,0xb0,0xcb,0xca,0x70,0x91, + 0xfd,0xbb,0x67,0x5,0xf7,0xbc,0x79,0xa3,0x16,0x9,0x5d,0x4,0x0,0xb2,0xe5,0xe9, + 0xe9,0x7a,0x7d,0xa2,0xaf,0xfb,0x6f,0x7b,0xfe,0xf0,0xff,0x6e,0xf6,0xd6,0x35,0xde, + 0xdf,0x78,0xd9,0xf5,0xf,0x92,0x2c,0xf6,0x4f,0x13,0x1d,0x7,0xe7,0xd9,0x4e,0x3a, + 0x5d,0x6b,0xd4,0x82,0x63,0x9f,0x18,0xd9,0xf6,0xf8,0x55,0x13,0x6f,0xbf,0xfc,0x7c, + 0xf9,0xca,0xb5,0xf7,0x95,0xad,0x3a,0xd5,0x16,0xc7,0x63,0x3a,0xe6,0x9b,0x49,0xd4, + 0xb5,0x58,0xf4,0x9c,0xb1,0x37,0x5f,0x3a,0x2b,0xb4,0x7f,0xd7,0xb3,0xd,0x17,0x5c, + 0xf5,0x3f,0x9e,0xea,0xac,0x22,0x12,0xe7,0x7a,0x61,0x51,0x36,0x75,0x8,0x8b,0x38, + 0x1,0x58,0xa9,0x36,0x2d,0x48,0x4f,0x8c,0x71,0x15,0xb2,0xb7,0xb4,0xaa,0xd3,0xe, + 0xfa,0x87,0xf,0xed,0x9b,0x3,0x9c,0xce,0xb,0xfe,0xba,0xa6,0xe,0xa3,0x77,0x89, + 0xcc,0xd7,0xb2,0x32,0x54,0xd3,0x2d,0xe1,0x7d,0x3b,0x7e,0x12,0xef,0x68,0x7d,0xbe, + 0xfa,0xec,0x8b,0x7e,0x56,0x3c,0x7b,0xd1,0xb8,0xd9,0x31,0xc6,0xdf,0x79,0x71,0x79, + 0xe8,0xbd,0xb7,0xfe,0x7,0x18,0xf3,0xda,0x3e,0x3f,0xaa,0x57,0xa5,0x6,0x7b,0xff, + 0xba,0xff,0xa1,0x3b,0x6b,0x9a,0xb7,0x7c,0xee,0xe7,0x66,0x7f,0xaf,0x8e,0x8d,0xce, + 0x9d,0x56,0x25,0x1c,0xd,0x5d,0x3c,0xf6,0xc6,0x8b,0x17,0x46,0xdb,0x5b,0x7f,0xd1, + 0x74,0xf9,0x4d,0xf,0x58,0x1d,0x70,0x9a,0xe7,0x3b,0x65,0x84,0xa2,0x45,0x42,0x9b, + 0xfa,0x9e,0xbc,0x6f,0x49,0xcd,0x59,0x97,0x7c,0xad,0x64,0xe1,0x32,0x73,0x11,0x15, + 0x31,0xbf,0x7,0x22,0x65,0x6d,0x85,0xa8,0x3e,0xa9,0x1c,0xf1,0xcf,0xf8,0xf,0x31, + 0x3d,0x76,0x39,0x11,0xe5,0x2e,0x4e,0x7f,0xf3,0x3c,0x5b,0x3c,0x49,0x75,0x6c,0x88, + 0xf7,0x2e,0x5a,0xb2,0x60,0x45,0xf7,0x71,0x2b,0x4c,0xa2,0xec,0xd8,0x3f,0x91,0xf9, + 0xda,0x5,0x2d,0x16,0xbe,0x60,0xe4,0xc5,0xc7,0x7f,0xc8,0xf4,0xa4,0x74,0xe2,0x3c, + 0x8c,0xfe,0xa2,0xad,0xbb,0x1a,0xc2,0x7b,0xdf,0xfe,0xee,0x74,0x18,0x8f,0xe3,0x8d, + 0xe9,0xe8,0xb5,0x83,0x4f,0xdd,0x73,0xb5,0x99,0xb9,0x11,0x89,0x32,0x35,0x1e,0x99, + 0xe3,0x84,0x12,0x4e,0xd,0xf7,0xfe,0x75,0xcf,0xfd,0x3f,0xff,0xa6,0x1e,0x1e,0xf5, + 0x99,0x9d,0xe3,0xc,0xcc,0x77,0x2a,0x47,0x62,0xde,0xe8,0x2b,0x4f,0xfe,0x22,0x31, + 0xd4,0x5d,0x62,0x66,0xbe,0xe,0xa7,0xb0,0xb0,0x44,0xf,0x31,0x73,0xa0,0xc9,0xc4, + 0x3c,0x8e,0x37,0x95,0x28,0x5d,0xbc,0x74,0x50,0xf4,0x58,0x93,0xa1,0x42,0x8e,0x86, + 0xc,0x15,0x1,0x91,0x95,0x7e,0xa5,0xac,0x24,0x65,0xf4,0x2e,0xee,0x7c,0xed,0xa6, + 0x4f,0x3a,0xbd,0x68,0xe0,0xa9,0x3f,0x5c,0xdf,0x7c,0xe5,0xcd,0xf7,0x88,0x19,0xc9, + 0xfe,0xc0,0xe8,0xeb,0xdb,0x7e,0xc8,0x28,0xad,0x74,0x62,0x7e,0x89,0x81,0x9e,0x2f, + 0xf,0x3e,0xf7,0xd8,0x48,0xc3,0x85,0x57,0xbc,0x62,0x1b,0xcf,0x6d,0x36,0xc2,0xbd, + 0x7f,0xba,0xab,0x79,0xf6,0x96,0xcf,0x7c,0x51,0x2e,0x2d,0xe7,0xee,0xdb,0x4c,0x95, + 0x92,0x63,0xa9,0xc4,0xdc,0x99,0x5a,0x1f,0x8c,0xea,0x35,0x63,0xaf,0x3c,0xf3,0x99, + 0xc0,0xf5,0x7f,0xf1,0x3f,0x4e,0xa7,0xb0,0x4c,0xf,0x92,0xab,0x20,0x78,0x4e,0xc5, + 0xb5,0x60,0x9a,0x6a,0xa8,0xd4,0x25,0x8f,0xb7,0xd3,0x2e,0xfe,0xeb,0xc9,0xb8,0xa1, + 0x22,0x90,0xbc,0x7e,0xee,0xbb,0x78,0xf3,0x9d,0xe,0xa4,0x46,0x6,0x3f,0x13,0x39, + 0xb8,0xeb,0xc5,0xb2,0x65,0xeb,0x7a,0xd,0x15,0xb3,0x9a,0x96,0xfb,0x9f,0x7a,0xe8, + 0x3b,0x4c,0x4d,0x9b,0x99,0x23,0x25,0xb2,0x32,0x44,0x14,0xcf,0x20,0xa3,0x7a,0x29, + 0xd3,0xd4,0x59,0xc0,0x98,0xdf,0x8c,0xa7,0x1f,0xef,0x3c,0xf4,0xcd,0xc8,0xa1,0x3d, + 0x37,0x95,0x9d,0xb4,0xa6,0x5f,0xd0,0xb3,0x76,0x54,0x21,0xd3,0x74,0xea,0xa4,0xbe, + 0x27,0xff,0xf0,0xd5,0x39,0x9f,0xfa,0xcb,0xef,0x65,0x69,0xc4,0xe7,0xcd,0xe4,0x1a, + 0x51,0x43,0xe3,0x57,0x87,0x76,0xbf,0xf1,0x58,0xf9,0xc9,0x67,0x8,0x46,0xe2,0x92, + 0xb3,0x57,0xda,0xa2,0x82,0x46,0xcc,0x4,0xa2,0x9d,0x87,0xaa,0x19,0xa5,0xa5,0x86, + 0x12,0xee,0xf3,0x75,0x82,0x6e,0x4f,0x84,0x4c,0xd3,0xc6,0x8a,0x4b,0xf6,0xfb,0x3b, + 0x8c,0xde,0x15,0xed,0x3a,0xc8,0x9d,0x2f,0x10,0x92,0x20,0x44,0x8a,0x1a,0xa8,0x4f, + 0x2f,0xa3,0xb4,0xdc,0x9c,0x95,0x65,0xde,0xb1,0xb7,0xb6,0xff,0x43,0xd9,0xa2,0xd5, + 0x5f,0x32,0x3a,0xf4,0xdb,0xff,0xf8,0xfd,0x9f,0xd4,0x93,0x89,0x53,0xf8,0x1e,0x19, + 0x51,0x95,0xb2,0xf2,0x27,0x2a,0x96,0xac,0x7d,0xa8,0x74,0xd9,0xea,0x5e,0xc9,0xe3, + 0xd5,0x8f,0xfb,0xce,0x8e,0x3,0xb5,0xc1,0xdd,0x6f,0x6f,0x4e,0x8d,0xd,0xdf,0x8, + 0x8c,0x15,0x9,0xcc,0xcf,0x17,0xde,0xbf,0xeb,0xa2,0xb2,0xc5,0xab,0xef,0xe4,0x3d, + 0x1a,0xef,0xeb,0x2e,0x63,0x54,0xaf,0x32,0x9e,0x9e,0x14,0x5,0x49,0xa,0x9d,0xf8, + 0xcf,0x8c,0xea,0xb5,0xa6,0xaa,0xc8,0x8e,0x8d,0x44,0x22,0xc1,0xcd,0xfd,0x8f,0xdf, + 0xbb,0xbf,0x69,0xf3,0xf5,0x8f,0x99,0xf9,0x9d,0xc8,0x7c,0xf9,0x3c,0xb7,0xc8,0x7f, + 0x0,0x79,0x62,0xf7,0xdb,0x5f,0x2a,0x5f,0x79,0xda,0x57,0xc5,0x22,0x2,0x27,0x53, + 0x58,0x14,0xc0,0xae,0x5,0x8a,0x40,0x98,0x4a,0x7f,0x74,0xb4,0x71,0x3d,0x51,0xd9, + 0x5f,0xd2,0x61,0xc7,0xbb,0xf4,0x48,0xc8,0xfb,0x61,0xf9,0x67,0x6,0x28,0xa5,0x65, + 0x86,0xef,0x4a,0x74,0x75,0x70,0x3d,0x51,0x5f,0x4d,0xe3,0x9d,0xb3,0xae,0xbc,0xe9, + 0x5e,0xa3,0x67,0xd2,0x23,0xbd,0x25,0x91,0x8e,0xb6,0x59,0x89,0x81,0x9e,0xb5,0xe9, + 0x91,0xc1,0x5b,0x18,0xa3,0x25,0xdc,0x65,0x9a,0x4a,0xac,0x19,0x78,0xf6,0xa1,0x4d, + 0x8d,0x9b,0x3e,0xf9,0x4c,0xc6,0x71,0x83,0x23,0x9b,0xb9,0x2e,0xa7,0xd7,0x77,0xa0, + 0xe6,0xcc,0x8b,0xfe,0xb9,0x74,0xd1,0xb2,0x8c,0xe7,0x26,0x4a,0xe6,0x2d,0x1b,0x29, + 0x99,0xb7,0xec,0x77,0xd1,0xae,0xf6,0xc7,0xc7,0xb6,0x6f,0xfd,0x7b,0x2d,0x11,0xdd, + 0xc0,0x1b,0x37,0x1d,0x1a,0xbf,0x0,0x0,0xf8,0x6,0xa4,0xfb,0x30,0x97,0xe7,0xde, + 0x9a,0x86,0xdf,0xcf,0xbe,0xfa,0x96,0x7b,0x3f,0x1a,0xfd,0x69,0x52,0xf8,0xe0,0xce, + 0x59,0xf1,0x81,0x9e,0x79,0x5a,0x38,0x34,0x4f,0x4f,0xc4,0xe6,0x6b,0xf1,0xd8,0x6, + 0x51,0xa3,0x92,0x18,0xe8,0xf9,0x4a,0xb4,0xed,0xc0,0xeb,0xa5,0x8b,0x57,0x8,0x9f, + 0x19,0x11,0x99,0xaf,0xaf,0xa6,0xfe,0xce,0xd9,0x57,0x7f,0xe6,0x1e,0xd1,0x31,0xd3, + 0xa3,0x43,0x81,0x70,0xdb,0xc1,0xd9,0x89,0xbe,0xf6,0xb3,0x52,0x63,0xc3,0xd7,0x3, + 0x63,0xc5,0x2,0xd1,0xf3,0x69,0xc3,0xdb,0x9e,0x38,0xa3,0xfe,0x82,0x2b,0x5e,0xb7, + 0x33,0xb9,0x63,0x64,0x40,0x84,0xc2,0x18,0xc6,0x74,0x9,0x53,0x47,0x88,0x19,0x9, + 0xcd,0x83,0x63,0x7c,0x65,0x52,0x56,0xd1,0x61,0x87,0x1c,0x6,0xdb,0xf6,0xb5,0x0, + 0x18,0x57,0x1c,0x7a,0xab,0x1a,0xc,0xdf,0x65,0xd7,0x7c,0x7d,0xf5,0x2d,0x11,0x5f, + 0x7d,0xcb,0xfb,0x0,0xf0,0x7e,0xb4,0xfb,0xc8,0x53,0xa3,0xaf,0x3c,0xf3,0x37,0x5a, + 0x2c,0x7c,0x31,0x6f,0xec,0xd4,0xe8,0xd0,0xc7,0x88,0x24,0x3d,0x3d,0xd5,0x7f,0x1b, + 0x7d,0x73,0xdb,0x52,0xa6,0xaa,0x86,0xf3,0x23,0x92,0x14,0xac,0x3d,0xeb,0xa2,0xaf, + 0x8b,0x2a,0xd0,0xd2,0x79,0x8b,0xc6,0x8a,0x6b,0xea,0xbf,0xd9,0xf5,0xd0,0x6f,0x7e, + 0x4a,0xd3,0xa9,0xd5,0xc6,0x69,0x29,0x75,0xee,0xd8,0xae,0xd7,0x16,0xd6,0xac,0x3b, + 0xa7,0xd5,0x50,0x79,0x8e,0x8f,0x70,0x8d,0xb0,0xb7,0xbc,0xf2,0xc8,0x94,0xf3,0x57, + 0x14,0x5a,0xbe,0xe2,0xd4,0xee,0xf2,0x15,0xa7,0x76,0x3,0xc0,0xcb,0x0,0x0,0xc1, + 0x5d,0xaf,0xcd,0x1b,0xdf,0xfd,0xd6,0x3f,0xd3,0x74,0x6a,0x99,0x80,0xb2,0xf3,0x4c, + 0xec,0x7c,0xed,0xba,0xd2,0xc5,0x2b,0x7e,0x2a,0xac,0xec,0x45,0xe6,0x5b,0x56,0xd9, + 0x65,0x46,0x16,0xbd,0x35,0xf5,0xb1,0x9a,0x9a,0xfa,0x83,0x0,0x1b,0xe,0x46,0xbb, + 0x8f,0x3c,0x3c,0xfa,0xd2,0x53,0x5f,0xd3,0x12,0xd1,0x8f,0x71,0xd,0xe0,0x70,0xff, + 0x39,0x0,0x20,0x60,0x40,0x9c,0xac,0xc2,0x3a,0x6a,0x28,0xa6,0xfa,0x43,0x15,0x57, + 0x60,0xd0,0x75,0xe6,0xe4,0x9f,0x1a,0x8f,0x71,0x17,0x67,0x51,0xfd,0xec,0xe,0x3b, + 0xde,0x95,0x1e,0xec,0xe7,0x29,0x7f,0x5a,0xb1,0x68,0x79,0x87,0xd3,0xf3,0x2d,0x69, + 0x9e,0x33,0xd1,0xb2,0xe5,0xc6,0xef,0x10,0x8f,0xb7,0x8d,0xef,0x85,0x26,0xd6,0xb2, + 0x64,0x42,0x9a,0x6a,0x9c,0xd4,0x60,0xef,0x4a,0x81,0xb9,0xdd,0x5e,0xba,0xe0,0xa4, + 0x21,0x33,0xf3,0x93,0x8b,0x3,0xe9,0xfa,0x8d,0x97,0xff,0x23,0x91,0xe4,0x11,0xae, + 0xb7,0xde,0xf6,0xfe,0x45,0xbc,0xf1,0xb4,0x68,0x84,0x6b,0x84,0x8b,0x1a,0xc4,0x69, + 0x58,0xb1,0xea,0xf4,0x23,0xf3,0x3e,0xf5,0xd7,0x9f,0xf3,0xd5,0x36,0xdc,0xe,0x84, + 0x70,0x37,0xc9,0xd3,0xe1,0x89,0x2b,0xe2,0xdd,0x47,0x4a,0x45,0xc7,0x17,0x99,0xaf, + 0xbf,0xb6,0xa1,0x33,0x5b,0xb9,0x2c,0x69,0x9e,0x33,0xd1,0x7c,0xc9,0x27,0xbf,0x4d, + 0x64,0x4f,0xb7,0x40,0x14,0xda,0x22,0x34,0xae,0xd3,0x55,0x58,0x93,0x2f,0x9d,0x6, + 0x7d,0x14,0xe,0x79,0x23,0x47,0xe,0x35,0xa5,0xc3,0x63,0x35,0x5a,0x3c,0x56,0xab, + 0xa7,0xe2,0xd5,0xb2,0xe2,0xd,0x7b,0x2a,0x6b,0xba,0x8a,0x67,0x2f,0xe8,0xa,0xcc, + 0x9e,0x97,0x13,0xbd,0x76,0xb4,0xd0,0x84,0x2f,0xd8,0xb6,0xbf,0x45,0x9f,0x18,0x6b, + 0xd4,0x92,0xd1,0x7a,0x0,0xa2,0xfb,0x6a,0x1a,0xe,0x56,0xae,0x58,0xdf,0x2a,0x97, + 0x94,0xaa,0xd3,0xf9,0xee,0x68,0xf7,0x91,0xca,0x44,0x5f,0x47,0xb3,0x16,0x8b,0xd4, + 0xd2,0x58,0xac,0x8e,0x82,0xee,0x95,0xbd,0xbe,0x9,0xd9,0x5b,0x14,0xf4,0xd7,0x37, + 0x76,0x97,0xaf,0x58,0xdf,0x3d,0xd3,0xf4,0x89,0xf,0xf7,0x94,0xc6,0x8e,0xb4,0xb6, + 0xa8,0xc1,0xf1,0x16,0x3d,0x15,0xaf,0x52,0x2,0x65,0xfd,0x45,0xd5,0xd,0x5d,0xa5, + 0x8b,0x96,0xf7,0x58,0xa1,0xf,0xe5,0x55,0xb7,0x10,0x92,0x2a,0x5d,0xb2,0x7c,0xc0, + 0x16,0x1e,0xc7,0x23,0x86,0xca,0x9f,0xc8,0xf2,0x80,0x52,0x5e,0x99,0x9a,0x89,0xf9, + 0x4a,0xde,0x12,0xad,0x7c,0xf9,0xda,0xef,0x4,0x77,0xbf,0x79,0x7,0x18,0x1d,0xf8, + 0x63,0xac,0x78,0x6c,0xf7,0x1b,0x8b,0x6b,0xd6,0x6f,0x78,0xff,0x23,0x6b,0x2d,0x95, + 0xac,0xe3,0xbd,0x27,0x30,0x67,0xfe,0x9e,0xe3,0x68,0x22,0xc9,0x42,0xeb,0xde,0x37, + 0x67,0xe1,0x84,0xb7,0xa2,0xfa,0xd1,0xd4,0xf8,0xf0,0xe7,0xa7,0x9a,0x15,0xf1,0x78, + 0x5b,0x95,0x40,0xe9,0x5b,0xbe,0xe6,0xb9,0xaf,0xf0,0xc6,0xe4,0x75,0x2,0x0,0x42, + 0x12,0xc5,0x4b,0x57,0xd,0x88,0xce,0x6d,0x92,0x80,0xb2,0xde,0x78,0xd5,0x67,0xee, + 0x1a,0x7b,0xed,0xd9,0x5d,0x91,0xfd,0x3b,0xfe,0x1f,0x18,0x15,0x6,0x31,0x56,0x34, + 0xf6,0xd6,0x8b,0x5b,0xbc,0x9f,0xb8,0xf5,0xb7,0x42,0x32,0xca,0x9f,0xaf,0x5a,0xbc, + 0x6c,0x5d,0x8f,0xa9,0xf9,0x9e,0x38,0x44,0x4d,0x7d,0xbc,0x7c,0xd9,0xda,0x6f,0x5, + 0xf7,0xbe,0x65,0x38,0x27,0xa6,0xa9,0x2d,0x82,0xef,0x71,0xf6,0x24,0xba,0x95,0x8f, + 0xff,0xa8,0xd1,0x8,0x7a,0xc7,0xdf,0xdc,0x76,0x66,0x72,0xa4,0xef,0x7c,0x3d,0x1e, + 0x3b,0x7b,0xca,0x4d,0xb8,0x81,0x6e,0x8,0x1d,0xd8,0x9,0x20,0x49,0x61,0x49,0xf1, + 0x74,0x49,0x1e,0x5f,0x57,0xd1,0xbc,0xc5,0x7f,0xaa,0x3e,0xf3,0xc2,0x7d,0x59,0x2b, + 0x88,0xf1,0x91,0xa2,0xde,0x87,0x7e,0xf3,0xa2,0xd1,0x33,0x35,0xe7,0x5f,0x76,0x59, + 0xc9,0x82,0x15,0x1f,0x7a,0x52,0x91,0xf7,0xf7,0x34,0x84,0xf7,0xbe,0xf5,0x9,0x35, + 0x34,0x71,0x5,0xb0,0xe3,0x37,0x47,0x13,0x83,0xbd,0x10,0xdc,0xb7,0x43,0x23,0x1e, + 0xcf,0x11,0x6f,0x79,0xd5,0xb,0xd,0x97,0xdf,0x78,0x37,0x51,0x3c,0xd4,0xe,0x1a, + 0xc5,0xbb,0xdb,0x2b,0x42,0xbb,0x5f,0x3f,0x5f,0x1d,0x1f,0xb9,0x88,0xa6,0x53,0xab, + 0x32,0x9,0x7c,0xa4,0xe3,0x20,0x8c,0xbe,0xf3,0x4a,0xbf,0x12,0x28,0x7b,0xad,0xfc, + 0xd4,0x73,0x7e,0x5f,0x32,0x7f,0xf9,0x68,0x36,0xef,0x63,0x6a,0x4a,0xee,0xba,0xf3, + 0xc7,0xdb,0x33,0xa6,0x70,0x8,0x49,0xce,0xfd,0xdc,0x3f,0x1e,0x1f,0x42,0x53,0x9d, + 0x8c,0x3c,0xff,0xc8,0xc6,0x78,0x5f,0xd7,0xad,0x4c,0x55,0x17,0x1c,0x97,0x4a,0x19, + 0x19,0x84,0x58,0xe7,0x61,0x18,0xdd,0xf1,0xa,0x95,0xfd,0x45,0xbb,0xca,0xd7,0x9e, + 0xf9,0xfd,0xb2,0x15,0xa7,0xf6,0x98,0x9e,0x97,0xc6,0x49,0xb9,0x28,0x9e,0x2e,0xdd, + 0xe3,0xd3,0x6d,0x91,0xcb,0x4,0xaf,0x2,0xcb,0xd7,0xc1,0x5b,0x7,0xd3,0x39,0xdf, + 0x8a,0x53,0x37,0x1e,0xc,0xed,0xdf,0xd9,0xc6,0xd4,0xf4,0x12,0xc3,0xb4,0x5f,0x38, + 0x54,0x3d,0xd5,0x3c,0x75,0x35,0x55,0xc3,0x33,0x6e,0x81,0x15,0xeb,0xbb,0xb3,0x5d, + 0xeb,0x25,0xcb,0xd7,0x3d,0x93,0xda,0xfe,0xcc,0xe7,0x0,0x80,0x10,0x49,0x1e,0x96, + 0x8b,0x2,0xef,0x78,0xab,0x6a,0xdf,0x2a,0x59,0xbe,0xee,0xed,0xe2,0x96,0x5,0xc2, + 0x8e,0x20,0xaf,0xa2,0x89,0x28,0x9e,0x2e,0xc8,0x72,0x8e,0xd5,0x67,0x5d,0xb4,0x37, + 0xd1,0x79,0x78,0xab,0x16,0x8b,0x5c,0x62,0x18,0x85,0x44,0x82,0x1f,0x3,0x80,0xdf, + 0xda,0x33,0x5f,0xa5,0xd7,0xe,0xbd,0x50,0x71,0xc6,0x79,0x7,0x82,0xfb,0xdf,0x9, + 0x3,0xa5,0x65,0x19,0xe5,0x8f,0xd2,0x6a,0x75,0x64,0x30,0xe0,0xa9,0x6d,0xe0,0x9c, + 0x4e,0x17,0xae,0xc2,0xca,0x9d,0x32,0x5e,0x1a,0x9,0x79,0x86,0x9e,0x7d,0xe4,0x53, + 0xa9,0xf1,0xa1,0x9b,0x45,0x36,0x85,0x26,0x7f,0x44,0xcb,0x68,0x3a,0xb5,0x92,0xa6, + 0x53,0x2b,0x23,0xfb,0xde,0xdd,0x9c,0xe8,0x6a,0x7b,0xb4,0xfe,0xfc,0xcd,0xb7,0x7b, + 0xea,0x5a,0xa2,0x66,0xdf,0x1f,0xeb,0x38,0xd8,0xc4,0x7b,0xa6,0xb8,0x6e,0xf6,0x87, + 0x82,0x3e,0xf0,0xe8,0x5d,0xd7,0xa5,0x46,0xfa,0xbe,0x6c,0x9c,0x17,0x67,0xa,0x53, + 0xd3,0x8b,0x53,0xa3,0x83,0x8b,0x7b,0xef,0xfb,0xf9,0xda,0xea,0x8f,0x5d,0xf6,0xaf, + 0x66,0x16,0xcb,0x54,0x34,0x1a,0xf8,0xf3,0x3,0xb7,0xaa,0xe3,0xe3,0x37,0x2,0x30, + 0xa1,0x5b,0x24,0x99,0xae,0x37,0xa9,0xe1,0x89,0x6b,0xc6,0xb6,0x3d,0x79,0x51,0xa2, + 0xed,0xfd,0xef,0xd6,0x6d,0xba,0xea,0x25,0xb3,0xef,0x8d,0xb4,0xed,0xab,0x33,0xfa, + 0x4e,0x22,0x49,0xa3,0x44,0xfa,0xdf,0x28,0x74,0x74,0xfb,0xb3,0xab,0xa2,0x87,0xf, + 0x7c,0x8d,0xa9,0xe9,0x45,0x3c,0xdf,0x4f,0x4f,0x26,0xd6,0x8d,0xbf,0xb1,0xed,0x9e, + 0x58,0xeb,0x81,0x5f,0x35,0x5e,0x71,0xfd,0xfd,0x44,0x51,0x84,0x84,0x37,0xd6,0xd9, + 0x5e,0xc9,0x28,0xad,0xe0,0x28,0xf5,0x23,0xc7,0xce,0xcb,0x92,0x7c,0x72,0x14,0x81, + 0xe4,0x2b,0xea,0x30,0x7a,0x97,0x13,0xf3,0x95,0xbc,0xbe,0xe,0x9d,0x63,0x40,0xf4, + 0x64,0xac,0x62,0xca,0x77,0x50,0x8e,0x3c,0x31,0xe6,0x8b,0x76,0xee,0xaf,0x2e,0x5d, + 0xb8,0x7c,0x24,0x9b,0xb9,0x95,0x2d,0x5f,0xd9,0x9f,0xe8,0x3c,0xf8,0xd,0x7f,0xc3, + 0xec,0xd6,0xf2,0x75,0xa7,0x77,0x9e,0x30,0x2b,0xa1,0x31,0xd2,0x83,0xdd,0xa5,0x8c, + 0xea,0x86,0x86,0x4e,0xf6,0xfa,0x3a,0xac,0xd0,0xb0,0xe2,0x8c,0x73,0x7f,0x3e,0xfa, + 0xc2,0xd3,0x1b,0x8d,0x4a,0x91,0x99,0x9a,0x5e,0xa8,0x8e,0xf4,0x6,0xbc,0xf5,0x8d, + 0x51,0xab,0xf3,0x95,0x14,0x6f,0xa7,0x5d,0x32,0x2a,0x29,0x9e,0x36,0x9a,0x4e,0xad, + 0x35,0x5c,0x37,0x6d,0xfb,0x5a,0x2a,0xeb,0x6b,0xf,0x18,0x6b,0x74,0xea,0xdc,0x9d, + 0xe8,0x14,0x0,0xac,0x12,0x60,0xe4,0xc5,0xad,0xeb,0x62,0x6d,0xef,0x7f,0x8d,0xe9, + 0xea,0x5c,0xb,0xc3,0x10,0x2d,0x12,0xbc,0xba,0xff,0xf1,0xfb,0x37,0x14,0x35,0xcf, + 0xf9,0xef,0xfa,0xcd,0xd7,0x3c,0x67,0xe6,0xc7,0xe9,0xf1,0x61,0xc3,0xa,0x1b,0x22, + 0x49,0x21,0xb9,0xbc,0x24,0xcd,0xb4,0x94,0xd4,0xf7,0xc7,0x3b,0xbf,0xaa,0x86,0x27, + 0xae,0x31,0xe5,0xc1,0x26,0x13,0xa7,0x8d,0x3c,0xf7,0xf0,0xef,0xcb,0x57,0x9d,0xf2, + 0x7f,0x2b,0x4f,0xdb,0x70,0xc8,0xec,0xc7,0x8d,0x6e,0x7f,0xf6,0xe4,0xe8,0xc1,0xfd, + 0x5f,0x67,0x7a,0x76,0xe7,0x8,0x18,0xa5,0xe5,0xb1,0xce,0xd6,0xff,0xec,0xb9,0xf7, + 0x97,0x8f,0x37,0x6c,0xda,0xf2,0x63,0x4f,0x75,0x6d,0x42,0xf4,0xb7,0xa9,0xa1,0xc1, + 0x26,0xe3,0xf4,0x8d,0xf2,0xa1,0x52,0x19,0x7e,0xfe,0x89,0x33,0x63,0xed,0x7,0xbf, + 0xf,0x8c,0xf9,0xc4,0x27,0xc7,0x7c,0xa9,0x91,0x81,0x2f,0xf,0x3c,0x76,0xaf,0xd4, + 0xb4,0xe5,0x96,0xbb,0x85,0xa2,0xb0,0x8e,0x36,0xee,0x7e,0x82,0xe2,0x2f,0xb2,0xa9, + 0x2,0x2b,0xec,0x61,0xba,0x3a,0xcb,0x50,0x71,0x95,0x94,0x1e,0x71,0x72,0xbe,0x53, + 0x5d,0xe2,0xa6,0xf8,0x8b,0x3a,0xf4,0x58,0xc4,0x98,0xd4,0x69,0xb5,0x6c,0xaa,0xdf, + 0x12,0x45,0x99,0xe0,0xd2,0xfc,0xd0,0x81,0xb5,0x65,0xf3,0x56,0x6e,0xcd,0x96,0x8e, + 0xd,0x9b,0xae,0x7d,0xd6,0x84,0xbd,0xf8,0x8,0xc2,0x87,0xf8,0x3d,0xa5,0x64,0x7f, + 0xd1,0x11,0x2b,0x17,0xdc,0x95,0xcd,0x5b,0x39,0x1c,0xa9,0x7c,0xe7,0xee,0xd4,0xf8, + 0xf0,0xe7,0x8c,0x14,0x67,0x70,0xcf,0xbb,0xab,0xea,0xcf,0xbf,0xe2,0x35,0xab,0xf3, + 0x95,0x7c,0xfe,0x4e,0xbb,0x2e,0xe4,0x93,0xfd,0xfe,0x76,0x9e,0x1,0xd1,0xe2,0xf1, + 0x12,0x81,0xf7,0x39,0xd9,0xca,0x64,0x52,0x98,0xb3,0xfd,0xeb,0x7d,0xe0,0xb7,0x9f, + 0x8d,0x1e,0x7a,0xef,0x76,0x8b,0xc6,0xe3,0xb8,0x30,0x2d,0xde,0xd3,0xf1,0x9d,0xde, + 0xfb,0x7e,0xfd,0x37,0x66,0xe6,0xa1,0xc5,0xa2,0xd,0xc6,0xdc,0x51,0x46,0x88,0x2e, + 0xb1,0xbe,0x3f,0xde,0x61,0xda,0x78,0x1c,0x13,0xd,0xd4,0x87,0xf6,0xed,0xfa,0x26, + 0xa8,0xe6,0x68,0x36,0xfc,0xf4,0x23,0x1b,0x23,0xfb,0x77,0xff,0x22,0x5b,0xe3,0x71, + 0x9c,0x0,0x45,0xc2,0x97,0xf7,0x3d,0x72,0xcf,0x5d,0xda,0xe8,0xb8,0x4f,0x98,0x36, + 0x91,0x89,0x26,0x4e,0xda,0x60,0xf8,0xe8,0x3c,0xcf,0x8f,0xb5,0xbd,0xff,0x43,0x53, + 0xc6,0xe3,0x58,0x43,0x35,0x3a,0xfc,0xe9,0x58,0xfb,0x91,0xa,0x91,0x39,0xa9,0x13, + 0x63,0xf3,0xb9,0xa,0xb9,0xa4,0xfc,0x88,0x15,0xd9,0xfc,0xe0,0x2f,0x72,0x60,0xff, + 0x6c,0xe0,0x34,0x13,0xf4,0x57,0xd5,0x1d,0x71,0x72,0xbe,0x53,0xf2,0xc1,0xeb,0xd, + 0xf1,0xb5,0x8c,0x92,0xcc,0xc0,0x43,0xae,0x1,0x49,0xe,0xf5,0x5f,0xa5,0x85,0x82, + 0xd3,0xda,0xde,0xc4,0x30,0xfd,0x16,0x1c,0xe3,0x1b,0xe1,0xb2,0xa,0xcb,0x4e,0x43, + 0xdd,0x79,0x97,0xdf,0xd,0x84,0x24,0x39,0xe,0xe7,0x5a,0x3b,0xe6,0xeb,0xe1,0x94, + 0x7e,0x1f,0x93,0x55,0x62,0xbc,0x3f,0xa6,0x53,0x6e,0xe6,0xc6,0x3f,0xbb,0xb9,0x93, + 0x3b,0x96,0x4d,0x6,0x84,0xa,0x6a,0xc5,0xac,0x9b,0x29,0xf6,0x3c,0xf8,0xeb,0x2f, + 0xa9,0x13,0xa3,0x9f,0x9b,0x16,0x61,0xb,0x4f,0x5c,0x37,0xfe,0xf6,0x8b,0x4b,0xc5, + 0x53,0x14,0x89,0x7a,0x43,0xfe,0xc9,0x9e,0x81,0xa1,0x67,0x1f,0xde,0xa0,0x86,0x43, + 0xd7,0x58,0x99,0x17,0x53,0xd3,0xb,0x87,0x9f,0x7b,0xe8,0x3c,0x11,0x81,0x0,0x89, + 0xb2,0xa1,0x17,0x1e,0x39,0x3b,0xd6,0xdd,0xf6,0x1d,0x0,0xfb,0x9a,0x56,0x32,0x5d, + 0x6d,0x19,0x7e,0xf1,0x4f,0x37,0x88,0xce,0x41,0x4f,0xc4,0x9a,0x8d,0x53,0x27,0x9e, + 0x91,0x89,0x77,0x5f,0x5e,0x18,0xeb,0x69,0xff,0x56,0x86,0x68,0x56,0x34,0x12,0x29, + 0x19,0x7f,0xf3,0xb9,0xcf,0x89,0xcd,0x29,0xc2,0x5d,0x9c,0xfe,0xc6,0xc6,0x23,0xa2, + 0xdf,0x68,0xf4,0x97,0x1e,0xeb,0xe3,0x39,0x37,0xac,0x74,0xf1,0xb2,0x8e,0x99,0x9e, + 0x2f,0x8f,0x4f,0x93,0x51,0x8a,0x77,0x62,0xaa,0xdf,0x7a,0x4a,0x4a,0xbb,0xf8,0x6b, + 0x24,0xb5,0xa6,0xef,0xf1,0xdf,0xfd,0x48,0xb,0x8d,0x78,0xed,0xa0,0xab,0xe9,0xef, + 0x8b,0x45,0xf9,0x34,0x6c,0x98,0x65,0x99,0xe7,0x9e,0xea,0xaa,0x4,0x51,0x14,0xe3, + 0x53,0xfb,0xc9,0xf8,0x3c,0x3b,0xe6,0xeb,0xad,0xaa,0xee,0x14,0x9a,0x97,0x48,0xa4, + 0x9c,0x4e,0x2d,0x30,0x56,0xf7,0x24,0x5e,0xb6,0xe4,0xe4,0x41,0x91,0x95,0xe8,0x5c, + 0x4,0x22,0x68,0x1d,0x4f,0xfc,0xeb,0x79,0xe0,0x57,0x5f,0x51,0x83,0x63,0x37,0x4d, + 0xa3,0xc3,0x22,0x85,0xe,0xec,0xfa,0x7,0x46,0x53,0x44,0x64,0x3e,0x34,0x95,0x6e, + 0xe2,0x64,0xfb,0xe2,0xb1,0xee,0xf6,0x6f,0xd8,0x31,0xb1,0x78,0x5f,0xcf,0xe7,0x99, + 0xa6,0x72,0xd,0xc2,0xc8,0x2b,0x5b,0x57,0xc7,0x3a,0x5a,0xbf,0x2f,0xa2,0x94,0x89, + 0x24,0x8d,0xcb,0x5e,0xff,0xbb,0xb2,0xbf,0xe8,0xd,0x22,0x49,0xdc,0xcd,0xf2,0xd4, + 0xf8,0xd8,0xcd,0xd1,0x8e,0xd6,0x4a,0x31,0xe3,0x9a,0x9a,0x65,0x6c,0x5c,0xbd,0xe3, + 0xc1,0xf7,0xde,0xfd,0xf,0x3b,0x9a,0xef,0x69,0xd1,0xf0,0xc7,0x85,0x6c,0x4d,0x2a, + 0xc5,0xab,0x6e,0x49,0x97,0x2d,0x37,0x6e,0xdd,0x21,0x9c,0xde,0x8c,0x84,0xe7,0x1b, + 0xa7,0xf0,0xe4,0x1,0x6f,0x45,0x43,0xdc,0x28,0x62,0x10,0x99,0x6f,0xf9,0xd2,0xf5, + 0x3d,0x56,0x22,0x25,0x9a,0x4c,0xcf,0xe6,0xca,0x89,0xaf,0x78,0x62,0xaa,0xdf,0x56, + 0xae,0x5a,0xff,0xba,0x48,0x72,0x49,0x4f,0x26,0x4f,0xeb,0x79,0xf8,0xae,0xbb,0x86, + 0x9e,0x7c,0xe8,0x42,0x48,0xe9,0xc4,0x8e,0x8,0x4f,0xfc,0xfb,0x12,0xf3,0xb9,0x34, + 0x5c,0xb2,0xa6,0xd7,0x8e,0x77,0x49,0xb2,0xb7,0x87,0x93,0x4d,0x28,0xb3,0x3c,0x5f, + 0x0,0x56,0x36,0x7f,0x55,0x87,0x1d,0xf3,0x85,0x94,0x4e,0x98,0xa6,0xce,0xe3,0xec, + 0x91,0x8,0x45,0xb8,0x40,0x89,0xb3,0x27,0xd1,0xcd,0xe6,0xf0,0x6,0x9e,0x79,0xe0, + 0x62,0x35,0x3c,0x71,0x3d,0x7f,0x7a,0x24,0xe5,0x29,0xad,0x78,0xd0,0x5b,0x5a,0x79, + 0xc0,0x53,0x59,0xd5,0x2b,0xf9,0xfc,0xc9,0xe4,0x60,0xdf,0x22,0x35,0x12,0x5c,0xa6, + 0x46,0x82,0xd7,0xf0,0x14,0x16,0x53,0xd3,0xcb,0x7,0x9e,0xfc,0xe3,0x95,0xcd,0x97, + 0xdd,0xf4,0x30,0xf7,0x33,0x34,0xd5,0x70,0xf1,0xe9,0xf1,0xd8,0xc5,0x27,0x28,0x8d, + 0x6e,0xb9,0xa8,0x78,0x97,0xec,0x2f,0x3d,0xec,0x29,0x2d,0xeb,0x51,0x23,0xc1,0xb9, + 0x5a,0x34,0xb2,0x46,0x4f,0xc6,0x36,0xa,0x44,0x0,0xf3,0x86,0x9f,0x7f,0xfc,0xdc, + 0x86,0xb,0xaf,0xc9,0x58,0xf5,0xa5,0x27,0x42,0x9e,0xe8,0xe1,0xf7,0xbf,0xc1,0xfb, + 0x46,0x22,0x7b,0xba,0x3,0x2d,0xb,0x7e,0x58,0x7f,0xfe,0x95,0x6f,0x1c,0xfb,0xef, + 0xc3,0xdb,0x9f,0x59,0x1d,0x6d,0xdb,0xf7,0xef,0x4c,0xd7,0x9b,0x32,0x78,0xfb,0xc5, + 0x13,0x6f,0x6e,0xbb,0xb5,0xb4,0x65,0xc9,0xf,0xb9,0xb4,0x49,0xa5,0xd,0x17,0x42, + 0x3a,0x38,0xfa,0x89,0xc,0xef,0x61,0x44,0x96,0x7b,0x18,0x65,0x15,0xc0,0x32,0x57, + 0x87,0x9c,0x38,0xaf,0x58,0x7b,0x7b,0x45,0xc9,0xdc,0x45,0x13,0xc6,0xfc,0xe2,0x56, + 0xb7,0x74,0x49,0xc4,0xa7,0x83,0xd,0x35,0x58,0x34,0x65,0xdc,0xbc,0x4f,0xf2,0x78, + 0x3b,0xf8,0xf2,0xc5,0x9d,0x6f,0xb7,0xd5,0x6a,0x1c,0xaa,0xf2,0xd,0x88,0xaf,0xa2, + 0x6a,0x78,0xea,0xe8,0x67,0x7e,0x58,0xf6,0xfa,0x77,0xeb,0xe9,0xe4,0x3a,0x1,0xf9, + 0x9d,0x1f,0xeb,0x3b,0xf2,0xdd,0x8e,0xbb,0x7f,0xf2,0x5,0x6f,0x65,0xfd,0x83,0x65, + 0xcb,0x57,0xbf,0x50,0xb6,0x68,0xf5,0xb4,0xde,0xe8,0x77,0x74,0x8d,0xf2,0x68,0xd8, + 0x69,0x57,0xa5,0xa3,0xe4,0xf5,0xf6,0xea,0xc9,0x98,0x41,0xaa,0x9c,0x95,0xf3,0xf6, + 0x7e,0xb9,0x3c,0x97,0xe4,0x61,0x6f,0x6d,0x75,0x1c,0x6c,0x10,0xd2,0xb1,0x77,0xb7, + 0x2d,0xe5,0xa5,0x8e,0x25,0x9f,0xaf,0x4d,0x68,0xbf,0x9a,0x40,0xee,0x56,0x61,0x45, + 0x3a,0xe,0x55,0x25,0xfa,0xbb,0xbe,0xc6,0x4d,0xd5,0x16,0x7,0x9e,0xaf,0x5c,0x77, + 0xf6,0x4f,0xca,0x97,0xac,0x39,0x31,0xe4,0x3a,0x42,0x24,0x7d,0xeb,0xf8,0x5b,0xdb, + 0x9f,0x98,0xd8,0xf7,0xce,0xf,0x98,0xae,0xb7,0x18,0xe6,0x6d,0x87,0x7,0xfe,0x3a, + 0x3d,0xdc,0xbd,0xd5,0xd7,0xd0,0x1c,0x35,0xd8,0x37,0x21,0x4c,0x53,0x5b,0x44,0x13, + 0x2d,0x9e,0xb2,0x8a,0xfb,0x9a,0xaf,0xf8,0xe4,0x6d,0x4a,0x51,0xf9,0xb1,0x67,0x18, + 0x5e,0x3,0x80,0x7b,0x7b,0x1e,0xb9,0xfb,0xfa,0xd4,0xe8,0xe0,0xdf,0xf1,0xe8,0x92, + 0xe,0x4f,0x2c,0x26,0x92,0xbe,0x2d,0xa3,0x91,0x7d,0xfa,0xc1,0x9b,0x79,0x7b,0x1e, + 0x72,0x71,0xe0,0xb9,0xd9,0x5b,0x3e,0xf5,0x8d,0xc9,0x79,0x1c,0x2f,0x84,0xf5,0x1b, + 0x2e,0xda,0x5d,0xb1,0x74,0xe5,0x75,0xbd,0x4f,0xdc,0xf7,0x10,0xa3,0xb4,0x6e,0xea, + 0x34,0x5f,0x68,0x4b,0xf8,0xf0,0x8e,0xbb,0xca,0x97,0x66,0xe,0x6b,0x69,0x3a,0x2d, + 0x33,0xdd,0x98,0x36,0x27,0x1a,0xf,0xd9,0xef,0x7f,0xc3,0x5f,0xdf,0xfc,0x70,0xe5, + 0xca,0x35,0x3b,0xfc,0x4d,0xf3,0xc2,0x0,0x0,0xa1,0x83,0xbb,0x1b,0xc6,0xdf,0x7d, + 0xfd,0x4b,0x7a,0x3c,0xb6,0x89,0x1b,0xa1,0xd,0xb4,0x37,0x97,0xce,0x9f,0x9f,0xf1, + 0xe,0x8b,0x68,0x5f,0x7b,0x39,0xa3,0xb4,0x8a,0xc7,0xa7,0xbe,0x27,0xee,0xde,0x62, + 0x8b,0xe2,0x4a,0x26,0x57,0x18,0x2b,0x1b,0xe3,0xea,0x29,0x91,0xf9,0x4a,0x1e,0xaf, + 0xa5,0xa,0xac,0xe0,0x7b,0x3b,0x9a,0x99,0xae,0xb5,0xf0,0xa2,0xd4,0xca,0x35,0xa7, + 0x75,0x66,0x52,0x58,0x65,0x8b,0x97,0xfd,0x64,0x62,0xdf,0xce,0x3b,0x45,0xd3,0x90, + 0x4c,0xd7,0x5b,0x52,0xa3,0xfd,0x7f,0x37,0xf2,0x72,0xff,0x57,0xc7,0xde,0x78,0xe1, + 0x3d,0x4f,0x59,0xd5,0x73,0xe5,0x2b,0xd7,0x3d,0x5f,0xb6,0x68,0xd9,0x8,0xd8,0x8c, + 0xd4,0x60,0x5f,0x9,0xa3,0x7a,0xdd,0x74,0xd2,0xf0,0x38,0x19,0x2e,0x2a,0xee,0x51, + 0xc3,0x13,0x46,0x1f,0x5f,0xc6,0x9f,0x2f,0xad,0xe3,0x44,0x4,0xb6,0x14,0x79,0x68, + 0x89,0x90,0x27,0x74,0x68,0xdf,0xbf,0x70,0xbf,0xc9,0x1f,0x38,0x22,0xa8,0xd1,0x9d, + 0x6e,0xe7,0x2e,0xce,0xb4,0xb1,0xd7,0xb6,0x7e,0x9d,0x31,0xe3,0x66,0x60,0x4a,0x71, + 0xe0,0xe9,0xb9,0x37,0xfe,0xd5,0xd1,0x74,0xd1,0xd4,0xc2,0x5e,0x75,0xda,0x39,0xad, + 0x72,0x79,0xe9,0x5f,0x8e,0xbc,0xf2,0xdc,0x63,0x86,0x2,0xcf,0x68,0x59,0xf0,0xe0, + 0x9e,0x25,0xf5,0xd,0xcd,0x3b,0x32,0x3d,0x12,0xda,0xbf,0xbb,0x51,0xa8,0x83,0x28, + 0x21,0xc9,0x92,0xb9,0xb,0xbf,0xd6,0x70,0xe1,0x95,0x19,0xab,0x2f,0x66,0x5f,0x7d, + 0xd3,0xfd,0x1d,0xf7,0xdc,0x7e,0xb2,0x1e,0x8f,0x5d,0x60,0xec,0xd5,0x66,0x4e,0xb, + 0x5,0xdf,0xdb,0xd1,0x9c,0xa,0x8e,0xfd,0x1f,0x4e,0xda,0xa4,0xa7,0xf9,0xe2,0x2d, + 0xdf,0x3e,0xc1,0x88,0x1d,0xef,0x6d,0xd6,0x37,0xc6,0x7c,0x75,0x4d,0xbf,0x4c,0xe, + 0xf6,0x7e,0x33,0x13,0xa9,0xe3,0x47,0x5a,0x57,0x18,0x19,0x90,0xe0,0xbe,0x77,0xe6, + 0x98,0xd8,0xd7,0xd0,0x7d,0xd5,0xb5,0xb7,0xcf,0xba,0xea,0xe6,0xdf,0x9f,0xd8,0x89, + 0xa0,0x7c,0xe9,0xc9,0x83,0xe5,0x4b,0x4f,0xfe,0xe7,0x8e,0xbb,0x7e,0x56,0xac,0x27, + 0x13,0xe7,0x1a,0xe,0x12,0x9c,0x98,0x5,0x0,0x7b,0x8f,0xc9,0x91,0x1d,0x37,0x56, + 0xac,0xed,0x30,0x77,0x43,0x9a,0xa9,0xea,0xe2,0xe4,0x50,0xdf,0x3f,0x81,0x3,0x90, + 0x8b,0x4b,0xda,0x8d,0xce,0x1e,0x88,0xcc,0x57,0xf1,0x15,0x1d,0x1,0xb,0xe7,0xa9, + 0x26,0x76,0xbe,0xfe,0x75,0x0,0xe3,0x9e,0x4e,0x92,0xbf,0xe8,0x4d,0xa3,0x77,0x54, + 0x9f,0x7d,0xd1,0xfe,0xf8,0x40,0xcf,0xed,0xa9,0xb1,0x91,0x2f,0x9b,0x7c,0x3d,0xa1, + 0xe9,0xf4,0xea,0xd4,0xe8,0xe0,0xea,0xe1,0x17,0x9f,0xfa,0xea,0xd8,0x6b,0x2f,0xec, + 0xf4,0x54,0x56,0xff,0xb9,0xee,0xcc,0xf3,0xb7,0x7a,0xeb,0x9b,0x62,0x76,0xd0,0x38, + 0xd8,0x7e,0x80,0xbf,0x81,0xee,0x2b,0xb6,0x44,0xc3,0xe3,0xc6,0x2a,0x2b,0xef,0x86, + 0xa1,0x3e,0x3,0xb5,0x42,0xcb,0x8c,0xde,0x25,0x32,0x5f,0xc9,0xef,0xeb,0xb0,0x63, + 0xbe,0x7d,0x8f,0x3d,0xf4,0x5,0xa6,0xaa,0x8b,0x79,0x6b,0xb3,0x64,0xde,0x82,0xd7, + 0xc0,0xde,0x83,0x84,0xd2,0x47,0xfe,0x9f,0x6c,0xc,0x8,0x48,0x32,0x13,0xf9,0x1b, + 0x7a,0xe9,0xe9,0x53,0xf4,0x64,0xe2,0x63,0x9c,0xb0,0x6e,0xb0,0xf1,0xc2,0xab,0xbe, + 0x2f,0x32,0x5e,0xf9,0xb2,0x75,0x3,0x4a,0x71,0xe9,0x33,0xbc,0xe9,0xa9,0xa1,0xe0, + 0x1c,0xa3,0x71,0x92,0x3,0xdd,0xf3,0x45,0x3e,0xd3,0x57,0x51,0x73,0x47,0xc3,0xc5, + 0x5b,0x5e,0xe5,0xcd,0xab,0xa8,0xbe,0xf9,0x31,0x1,0x5,0xd7,0x9c,0xe9,0xf7,0xa1, + 0x3,0x3b,0x6e,0xe0,0x84,0xa3,0x5a,0xc5,0xf2,0x35,0xff,0xe0,0xad,0x6f,0x8a,0xf1, + 0xe6,0xd2,0x7c,0xe9,0xb5,0x8f,0x3,0x21,0xb1,0xcc,0xde,0x4b,0x6c,0xb6,0xd1,0xef, + 0x53,0x83,0xfd,0xf3,0x5,0x75,0x88,0x5a,0xba,0x64,0xc5,0x5f,0xcc,0xbe,0xe6,0xd6, + 0x3b,0x89,0xe2,0xa1,0x99,0xc6,0x2b,0x5b,0xbc,0xfc,0x97,0x5c,0x2b,0x94,0x4a,0x95, + 0x1f,0xf7,0xbb,0x13,0xf9,0x19,0x9c,0x98,0xf,0x39,0x4,0x7f,0x4d,0xad,0xa1,0x67, + 0x27,0x32,0x5f,0x25,0x50,0x7a,0x24,0xdb,0xf7,0xf7,0x3e,0x71,0xff,0xa5,0x7a,0x3a, + 0x79,0x3a,0xef,0x39,0x4f,0x45,0xe5,0x5b,0xbc,0x67,0x66,0x5d,0x75,0xf3,0x5d,0xb2, + 0xd7,0xff,0x8e,0x95,0xec,0x8f,0x9e,0x4e,0x9e,0x92,0x1c,0xea,0xfb,0xe7,0xee,0x3f, + 0xdd,0xbd,0xb5,0xeb,0xbe,0x5f,0xfc,0x7d,0x70,0xcf,0x3b,0xcd,0xd9,0xc,0xa4,0xe9, + 0x12,0xfb,0xe0,0x4f,0x1d,0x1b,0xe5,0x2b,0xe4,0x92,0xb2,0x23,0xc7,0xfe,0xc6,0xca, + 0x9f,0x52,0x5a,0x39,0xc2,0x71,0x26,0xd3,0x46,0xbf,0x17,0x99,0xaf,0xec,0x2b,0xb1, + 0x34,0xdf,0xf1,0x7d,0xbb,0xea,0x3b,0xee,0xba,0xed,0xdb,0x6a,0x78,0xfc,0x16,0x2e, + 0xef,0x4b,0xca,0x1f,0x28,0x3d,0x79,0x83,0xd0,0xfb,0x80,0x39,0x99,0xc2,0xa2,0x94, + 0x68,0x82,0x7b,0x20,0xf1,0xee,0x23,0xd7,0xf2,0x46,0x2b,0x9a,0xbf,0xf4,0x1b,0x72, + 0x5d,0x4b,0x44,0x13,0x4c,0xb,0x6,0x16,0xaf,0xb8,0x3b,0xb4,0xfb,0x8d,0xcb,0xc, + 0x15,0x52,0x3c,0x36,0xc7,0x68,0x8e,0xa9,0x70,0x90,0xcb,0x6c,0x22,0xcb,0xbd,0xb5, + 0x17,0x6c,0xb9,0x4b,0xe4,0x5b,0xab,0x3f,0x76,0xc5,0xeb,0xd1,0xce,0xff,0x4a,0x1b, + 0xed,0x5f,0x30,0x5d,0x9b,0x35,0xd5,0x58,0x5a,0x70,0xdc,0xab,0x46,0x8c,0x4f,0xc2, + 0xca,0xfe,0xa2,0xd7,0xca,0x4f,0xbb,0xe8,0x7d,0x21,0x1a,0x11,0x9f,0x4e,0x24,0x65, + 0x80,0xe9,0xea,0xc2,0xa9,0xd,0x48,0x72,0x96,0xd1,0x37,0xf1,0x36,0x90,0x3f,0x14, + 0xd0,0xaa,0x9a,0x5f,0x54,0x9f,0x7b,0xf9,0xe,0xde,0x9c,0x2,0x4b,0x4e,0x69,0x9f, + 0x78,0xef,0x5d,0x66,0x94,0xe2,0x23,0x8a,0x27,0x62,0x34,0x27,0x3d,0x16,0xcd,0x29, + 0x3,0x52,0x3c,0x7f,0xd5,0x11,0xab,0xf3,0xf5,0xd4,0x35,0xb5,0x6b,0x26,0xf7,0x12, + 0x23,0xad,0xfb,0x6b,0x82,0xef,0x6e,0xfb,0xb,0x3d,0x1a,0xb9,0x4a,0x40,0x7e,0xbb, + 0x6a,0xce,0xba,0x74,0x2b,0xf7,0x1d,0xc4,0xa7,0x97,0x9f,0x7e,0xe1,0xbf,0x8c,0x6f, + 0x7f,0xea,0x1,0x60,0xc6,0x7,0x1f,0xf9,0x7e,0x2c,0xb,0xa8,0xe1,0xd0,0xd,0xa3, + 0x6f,0xbc,0x70,0x5d,0x68,0xdf,0x8e,0xfb,0xea,0x2e,0xfc,0xc4,0xcf,0x3d,0xd5,0x75, + 0xc9,0x6c,0x86,0xd2,0x63,0xd1,0x5,0x5c,0x7,0xaf,0xae,0xa9,0xdd,0x2e,0x9e,0xd2, + 0x44,0x3c,0xc0,0x49,0x7,0xe,0x5b,0x9d,0xaf,0x54,0x5e,0xd1,0x69,0x8a,0xdf,0x6d, + 0x7,0xaa,0xd5,0xc1,0xae,0xe6,0x74,0x70,0xa2,0x59,0x8f,0x4c,0xac,0x52,0x63,0xe1, + 0xab,0x85,0xa,0x57,0x24,0x69,0xa2,0x76,0xe3,0x15,0xbf,0x98,0x6,0xd1,0x77,0x6e, + 0xf,0x24,0xfc,0xfe,0x8e,0x6,0x5e,0xf4,0x21,0xfb,0x8b,0x5e,0xaa,0xdb,0x78,0xc5, + 0xbb,0x66,0xbe,0xa0,0x62,0xcd,0xd9,0xed,0xa1,0xdd,0x6f,0xe8,0x60,0x50,0xa7,0x4f, + 0xd3,0xc6,0x15,0x30,0x34,0x99,0xe4,0x32,0xdb,0xdf,0x3c,0xef,0x47,0x4a,0x45,0x55, + 0x5a,0x88,0x20,0x8a,0x87,0x12,0x22,0x8d,0x31,0xa6,0x37,0x1a,0x84,0xc0,0x55,0x7a, + 0x3c,0xe8,0x91,0x8b,0x2b,0xd4,0x13,0x52,0x7c,0x1b,0x81,0x93,0xe2,0xf3,0x54,0xd4, + 0xbc,0x60,0xca,0x25,0xf4,0x28,0xfd,0x7a,0x6,0x3,0x42,0xb5,0x74,0x8b,0x71,0xaa, + 0x2d,0xc9,0x55,0x7e,0xc4,0xe3,0xdd,0xdd,0x74,0xd5,0x4d,0xbf,0x13,0x49,0x65,0x7a, + 0xaa,0xca,0x53,0x40,0x48,0x1c,0x18,0xcb,0xb8,0x40,0xa5,0x40,0x60,0xd8,0x68,0x2c, + 0x1e,0x3f,0x9d,0x4,0x91,0xe4,0x41,0x5f,0x63,0x43,0xd4,0x68,0x23,0x54,0x60,0xbe, + 0x7a,0xd9,0xca,0x75,0x5d,0x9c,0x6f,0x96,0xc3,0x87,0xf7,0x34,0xa4,0x86,0x6,0x9b, + 0x68,0x34,0xd2,0xac,0x47,0xc3,0x8b,0xd5,0x58,0xe4,0x6a,0xd1,0xcb,0x9b,0x8a,0xe6, + 0x2d,0xfe,0x77,0x4f,0x55,0x79,0x4a,0x64,0xc3,0xb6,0xfc,0xa4,0x65,0x43,0x44,0xa2, + 0xd7,0x4,0xdf,0xdc,0xf6,0x4f,0x7a,0x32,0x71,0x9e,0xd,0x64,0x92,0xd4,0x48,0xf0, + 0xc6,0xfe,0xc7,0xee,0xdc,0x50,0x32,0xef,0xa4,0x6f,0xd5,0x9c,0xbf,0x79,0x87,0x69, + 0x85,0xce,0x95,0x43,0xa2,0x96,0xaf,0x5a,0xd7,0x6d,0xd7,0x1e,0x88,0x96,0x8c,0x95, + 0x19,0x27,0x5d,0x3c,0x43,0x86,0xfc,0x12,0x58,0x37,0xf1,0xb6,0xfd,0xbf,0xee,0x6c, + 0xdb,0x3f,0xfd,0x11,0x72,0x5d,0xc3,0x6d,0xbe,0xa6,0xc6,0x88,0x89,0xcd,0x7a,0x47, + 0x37,0xd1,0x85,0xf6,0x40,0x22,0x7b,0xdf,0xd9,0x2,0xbc,0x76,0xd8,0x75,0x4d,0x7f, + 0x32,0x2b,0x0,0xc4,0x2b,0xe9,0x44,0x92,0x47,0x18,0xd5,0x33,0x1e,0x4,0xa4,0x5a, + 0x7a,0x8e,0x21,0xb3,0xd5,0xd4,0x7c,0x8e,0x82,0xdc,0xd7,0x70,0xc9,0x96,0x17,0x4d, + 0x55,0x4b,0xc8,0xf2,0x18,0x50,0xdd,0xf0,0x74,0xbb,0x5c,0x1c,0x50,0x4f,0x9c,0x57, + 0x7a,0x74,0xf0,0x4a,0x9e,0x6c,0x57,0xae,0x3b,0xeb,0x25,0x53,0x74,0x92,0xe4,0xcc, + 0xbb,0x81,0x9a,0x3a,0xdb,0x98,0x36,0x53,0x1b,0x9e,0x63,0xe5,0xa4,0xe2,0xe4,0x33, + 0xbe,0x29,0x9,0x56,0xbf,0x68,0xc1,0x71,0xaf,0x91,0xf1,0x0,0x0,0xf0,0x56,0xd6, + 0x1a,0xd6,0xaa,0x53,0x2d,0xbd,0x0,0x72,0x4,0x92,0xc7,0xc3,0xf5,0x7a,0x5,0xe6, + 0x2b,0x77,0xff,0xfe,0xa7,0xef,0x4e,0xd7,0x1c,0xe5,0xe2,0x92,0xc7,0xeb,0xcf,0xbf, + 0x5c,0x6c,0x7c,0x7d,0x32,0x65,0x58,0xb6,0x70,0xf5,0x70,0xd9,0xc2,0xd5,0x5f,0x19, + 0xdc,0xfa,0x87,0x8d,0xc9,0xfe,0xce,0xaf,0xf3,0x36,0x84,0x85,0x2,0x12,0x5d,0x9f, + 0x1d,0x69,0xdb,0xf7,0x2b,0x5d,0xd3,0xbe,0x58,0x7f,0xc1,0xd5,0x6f,0x98,0x32,0x20, + 0x9a,0xca,0x29,0xa5,0x56,0xba,0x24,0xb9,0x58,0x3,0xdd,0x1e,0x9a,0xb1,0x54,0xd2, + 0xf8,0xe2,0x2f,0x45,0x1e,0xfe,0x80,0x56,0xd9,0xcc,0xd7,0x31,0x7,0xc7,0xe3,0xdd, + 0xd9,0xb0,0xe9,0x53,0x8f,0x1a,0xcd,0x75,0x8a,0x5f,0x99,0x36,0xc2,0x16,0x2f,0x94, + 0xe2,0x4f,0x4e,0x8b,0x84,0x2e,0xe6,0x58,0xa1,0x60,0xfd,0x79,0x57,0x6f,0x37,0xf7, + 0xa1,0x1f,0x2a,0xeb,0x1,0x30,0x30,0x20,0x4c,0xd7,0x9b,0x68,0x42,0x95,0x24,0xaf, + 0xff,0xa3,0xe2,0x45,0xf9,0xf5,0xd3,0x4a,0x69,0xc5,0x9f,0xcd,0xce,0x4b,0x22,0x52, + 0xd8,0x50,0x96,0x9,0x49,0x11,0xe6,0xa1,0xc7,0xa,0xbc,0x1e,0x9f,0xf0,0xe8,0xe9, + 0x94,0x61,0x19,0xa5,0xec,0xf5,0xbf,0xe3,0x6f,0x9c,0x1f,0x32,0xb5,0x50,0x68,0xe6, + 0xfd,0x14,0x46,0x69,0x65,0xa6,0x6f,0xd3,0xe3,0x13,0x1e,0x5e,0x5,0x16,0xf1,0x78, + 0xf7,0x55,0xac,0x3e,0xab,0x4b,0x74,0x3e,0xd1,0xd6,0xc3,0xd,0xbc,0xd9,0x96,0xb6, + 0x2c,0xed,0xcf,0x34,0xa7,0x54,0x6f,0x47,0x19,0xa3,0xb4,0x26,0x67,0xc,0x88,0xd7, + 0x7f,0xc4,0x48,0x36,0x66,0x7c,0xbe,0x44,0xa,0xd6,0x9d,0x7d,0xd1,0x8f,0xb2,0x5a, + 0x57,0x0,0xd0,0xb0,0xe9,0xba,0x17,0xd3,0x83,0xbd,0x6f,0xf,0xbf,0xfc,0xf8,0x17, + 0xd4,0x68,0xf8,0x72,0xcb,0x69,0x2d,0x0,0x25,0xde,0x75,0xe8,0xc7,0x63,0xaf,0x3d, + 0x7b,0x6b,0xf5,0x59,0x17,0x1d,0x10,0xf9,0x41,0x7a,0xb0,0x37,0x60,0xe4,0x20,0x1e, + 0x35,0xe4,0x47,0xec,0x24,0x9b,0x9e,0x52,0x79,0x11,0xc8,0xb0,0x95,0xf9,0x3a,0x1, + 0xb9,0xb8,0xe4,0xb1,0xa6,0x4d,0xd7,0xff,0x87,0x71,0x69,0x73,0x7a,0xa6,0x23,0x10, + 0xca,0x4d,0x61,0x45,0x5a,0xf7,0x55,0x33,0xaa,0x1b,0xd6,0xa8,0xcb,0x3e,0xff,0xbb, + 0xd9,0xd6,0x70,0x4b,0xb2,0x3c,0xae,0x73,0x9a,0x82,0x67,0xf2,0x90,0x43,0xef,0xef, + 0x68,0xe0,0x35,0x6f,0x2c,0x59,0xbc,0xe2,0x5,0xb3,0x73,0xa2,0x8c,0xd7,0x56,0xe0, + 0xa3,0xad,0x12,0x82,0x3b,0xdf,0x5c,0xcc,0xab,0xa4,0xd1,0xd3,0xc9,0x33,0x3a,0x7e, + 0xf3,0xdd,0x3d,0x36,0x2a,0x98,0x68,0x6,0x21,0x82,0xd0,0xbe,0x77,0xe6,0x2,0xa7, + 0x85,0x87,0x52,0x5a,0xba,0x2d,0xd3,0xef,0xa7,0x42,0x72,0xac,0x77,0xe,0x27,0x25, + 0x34,0xa0,0x54,0x95,0xa7,0x32,0x8d,0x19,0x3d,0xf2,0x5e,0x4e,0xed,0x7f,0xc8,0x45, + 0xc5,0xed,0x46,0xdf,0x3f,0xd3,0xf3,0xf5,0xd7,0x35,0xfe,0xd0,0xdf,0x32,0x3f,0x68, + 0x86,0x47,0x1f,0x89,0x8,0x1b,0xea,0x62,0xb3,0xae,0xfd,0xec,0x8f,0xf4,0x78,0xec, + 0xa7,0x23,0x2f,0x3f,0x73,0x4e,0x7a,0x6c,0xe8,0xb2,0xa3,0x95,0x74,0xd9,0x75,0x1d, + 0x60,0xac,0x38,0x72,0x68,0xe7,0xcf,0x4b,0xe6,0x2f,0xbc,0xcc,0xd7,0x38,0x2b,0xca, + 0xd7,0x1f,0xbb,0xb8,0x34,0x94,0x7c,0x45,0xed,0x56,0xbe,0xf1,0x23,0xeb,0x2c,0x19, + 0x33,0x8e,0x78,0xbc,0xbe,0xa1,0x4c,0xef,0x13,0x99,0xef,0x34,0x43,0xf3,0xd7,0xd6, + 0xff,0xa0,0xf1,0x8a,0x9b,0x1e,0x30,0x30,0x12,0x46,0x66,0xc1,0xd9,0x66,0x8a,0xbc, + 0x9,0xc6,0xda,0xde,0x5b,0xcd,0x5d,0x88,0x81,0xd2,0x77,0xb3,0x16,0x0,0xca,0x4a, + 0x38,0x4a,0x32,0xc,0x92,0xce,0xa6,0x4a,0x41,0x25,0xfb,0x3b,0x17,0x70,0x14,0x5a, + 0x7f,0xc5,0x8a,0xb5,0x7d,0xa6,0xe7,0xc6,0x99,0x13,0x21,0x24,0x76,0xe2,0x98,0xc9, + 0x91,0xfe,0x95,0x4e,0x4b,0x1a,0x21,0x24,0xe3,0x2,0x4e,0x8f,0xe,0x73,0x53,0x45, + 0x25,0x73,0x4f,0x32,0x65,0x5c,0xb5,0x48,0x68,0x81,0x95,0x94,0x50,0x3a,0x38,0x91, + 0x33,0xe9,0x2b,0x0,0x0,0x6f,0x45,0xd5,0x91,0x1c,0x9d,0xaf,0xea,0x29,0xaf,0xfe, + 0x75,0xd3,0x15,0x37,0x3e,0x61,0xd7,0x80,0x4a,0x49,0x59,0xba,0x71,0xf3,0xb5,0x2f, + 0x0,0xc0,0xb,0x89,0xae,0x83,0x15,0x63,0xef,0xbe,0xb9,0x49,0xd,0x4f,0x7c,0x9c, + 0xa9,0xe9,0xd5,0x60,0xf2,0x3c,0x18,0xa3,0xb4,0x6a,0xe4,0x8d,0xe7,0xaf,0x99,0x2d, + 0x70,0xaf,0x46,0x7a,0x62,0x5c,0xa0,0x8f,0x58,0x49,0x3b,0xb1,0xf1,0x5a,0x9,0x9a, + 0x4a,0x9c,0x6c,0xec,0x38,0x14,0xd,0x65,0x7a,0x9f,0xc8,0x7c,0xa7,0x6d,0x3d,0x2b, + 0x9e,0xd6,0xd2,0xf9,0x4b,0xfe,0xbd,0xe6,0x63,0x9b,0x77,0x5b,0x18,0xc6,0x96,0x73, + 0x20,0x82,0xbd,0xb0,0x18,0xe1,0x31,0x4e,0xb,0x8f,0x9f,0xcc,0x1b,0xa6,0xa8,0x79, + 0xf6,0x8e,0x6c,0x5,0x80,0x52,0xbd,0xdc,0xd8,0x8,0x90,0x50,0xa6,0xb1,0x55,0x4e, + 0x95,0x91,0xe4,0xf5,0xed,0xcd,0x6a,0x5e,0x4c,0x37,0xe,0xf5,0x65,0xf9,0x23,0x2, + 0xa8,0x27,0x62,0xcb,0x9d,0xcf,0xc1,0x48,0xd1,0x4c,0xdf,0xa7,0xc5,0x22,0xc6,0xc6, + 0x55,0x96,0xbb,0x2b,0x4f,0x39,0xab,0xd3,0x14,0xaf,0x12,0x89,0x85,0x9c,0x94,0x50, + 0x9b,0x11,0xbd,0xf5,0x4,0xbf,0xa2,0xa9,0xe2,0xe4,0x33,0xae,0xaa,0x3a,0xf5,0x5c, + 0xcb,0x15,0x39,0x3,0x4f,0x3d,0x70,0x7e,0xa2,0xaf,0xf3,0xbf,0x8d,0x9e,0x29,0x5d, + 0xbc,0xd2,0xf2,0x7c,0x6d,0x57,0x22,0x1e,0xef,0x7b,0xe5,0xcb,0x4f,0xfe,0xd7,0xaa, + 0x53,0x37,0xb6,0x4f,0xd7,0x3b,0x8a,0xe6,0x2c,0xd,0xce,0x9a,0xb3,0xf4,0xf,0x0, + 0xf0,0x87,0xe0,0xbe,0x9d,0x8d,0x91,0x83,0xbb,0x2e,0xd6,0xc2,0xa1,0xcd,0x4c,0x53, + 0x97,0x8,0x3b,0x13,0xc1,0xf1,0x4f,0xe9,0xf1,0xe8,0xdd,0x72,0x71,0x89,0x61,0xfe, + 0x40,0x4f,0x44,0xf8,0x15,0x58,0xb5,0xf5,0xb6,0x7d,0x6b,0xaa,0xbf,0xbb,0x84,0x69, + 0xaa,0xe1,0x55,0x4,0x9e,0x92,0xca,0x61,0x2b,0xf3,0xb5,0x95,0xdf,0x92,0xdc,0xab, + 0x4,0xca,0x9e,0x9,0xcc,0x5d,0xf4,0x74,0xf5,0xa9,0xe7,0x4e,0xde,0x4c,0xa9,0x5b, + 0xd9,0xc,0x62,0xb9,0x75,0x12,0x5d,0x4b,0x26,0x79,0x9e,0x35,0x2d,0x5f,0x71,0x72, + 0xf6,0xa7,0x32,0xa9,0x5e,0xc9,0xc9,0x71,0x85,0x33,0xfe,0x34,0x19,0x5f,0xc0,0x49, + 0x51,0xec,0x25,0x26,0x6f,0x5c,0x54,0xc7,0x46,0x7c,0xbc,0xbc,0xb7,0xa4,0x28,0xfd, + 0x27,0x8e,0x4b,0xd3,0xa9,0xc5,0x4e,0x2b,0x1b,0x49,0x96,0x7,0x32,0x7d,0x1f,0x4d, + 0x26,0x38,0xd1,0x82,0xef,0x90,0x59,0xda,0x50,0xce,0x1d,0x21,0x4a,0x71,0x49,0xab, + 0xd1,0x98,0x2,0xd5,0x2d,0x5a,0xc5,0xb2,0x35,0x9d,0xc4,0x86,0x5b,0x32,0xb5,0x58, + 0x88,0x13,0x9d,0x4a,0xc3,0xfe,0xfa,0xe6,0x88,0xd1,0x62,0x15,0xa9,0xc6,0xb1,0x31, + 0x9c,0x4c,0x78,0xab,0xaa,0x6f,0x6b,0xde,0xfc,0xa9,0x7b,0x25,0x8f,0x87,0x5a,0x53, + 0x22,0xe2,0xa8,0x3c,0x69,0x75,0x7f,0xe5,0x49,0xab,0xef,0x4,0x80,0x3b,0xfb,0x9f, + 0x7e,0xe0,0xa2,0xe4,0x70,0xff,0x97,0x99,0xae,0xcf,0xe1,0xab,0x29,0x5a,0x3b,0xf4, + 0xdc,0x9f,0x2e,0x69,0xbe,0xf4,0x7a,0xc3,0x73,0x53,0x34,0xcd,0x2d,0x42,0xd0,0x2b, + 0x96,0x9d,0x62,0xb,0xcf,0x1,0x0,0x26,0xde,0xdb,0xb1,0x12,0x8c,0xb,0x7e,0x68, + 0xc9,0xec,0x79,0xdd,0x19,0xd7,0x4d,0xda,0xb9,0x22,0xf,0xb9,0xb8,0xe4,0xe1,0xb9, + 0xd7,0x7f,0xe1,0x5b,0x36,0xb,0x92,0xe9,0x7,0xad,0x9c,0x3,0x1,0x2e,0xe3,0x74, + 0xbd,0x96,0x63,0x41,0x7,0x3d,0x45,0x15,0xa9,0x6c,0x4,0xfe,0xa8,0xb2,0x36,0x6e, + 0x19,0x20,0x49,0xa1,0x8c,0xcc,0xe6,0x54,0x60,0x29,0x65,0x55,0xa6,0xef,0xee,0x8, + 0x1f,0x39,0xc4,0x3d,0x38,0x25,0x29,0xbe,0x7e,0xd3,0x86,0x70,0x3a,0xc,0x88,0xd7, + 0x9b,0xf1,0xca,0x5b,0xaa,0xa9,0x9c,0x68,0xc1,0x67,0xca,0xeb,0xa3,0xaa,0x2a,0x31, + 0x4d,0x33,0x2c,0x58,0xf0,0x56,0xd7,0x18,0x8e,0x49,0x35,0x6d,0x21,0x27,0x2a,0xea, + 0x92,0x8b,0x8a,0x35,0x93,0x1e,0x5c,0x6,0x3,0x6a,0xdc,0xdd,0x54,0x52,0x14,0x6e, + 0xda,0x84,0x37,0x5f,0x9b,0xc,0x47,0x54,0xf6,0x15,0x6d,0x2f,0x5f,0x7d,0xca,0x4f, + 0xaa,0x56,0x9d,0xd1,0x7,0x33,0x88,0xe6,0x4b,0x6f,0xf8,0xb3,0x9e,0x4a,0x3e,0xdf, + 0xfb,0xf0,0x9d,0x7f,0xaf,0xc6,0xc2,0xdc,0x66,0xa9,0x6a,0x24,0x74,0x32,0x91,0xe4, + 0x3f,0x71,0x9c,0xe,0x6e,0x24,0xac,0x4,0xec,0xbb,0x3a,0x3a,0x35,0xd2,0x6b,0xd8, + 0xd0,0x53,0xf6,0x7a,0xdf,0x2a,0x9e,0xbb,0x28,0x98,0xed,0x19,0x9b,0x16,0x19,0x0, + 0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x7c,0x1,0x80,0x2,0x21,0x71,0xc1,0xc,0x4f, + 0xc0,0x48,0xa3,0xd3,0x64,0xfc,0x1c,0xaa,0xaa,0x92,0xec,0xf3,0xdb,0xe8,0x2d,0x10, + 0x67,0x23,0x10,0xde,0x22,0xe2,0xb5,0x2e,0x91,0x64,0xb9,0x3b,0xdb,0xf4,0x55,0xb8, + 0x6d,0x6f,0xb,0xcf,0x64,0x4a,0x5e,0x6f,0xc6,0x34,0x3,0xd3,0x34,0x43,0x66,0xfb, + 0x1b,0x1a,0x4c,0xcf,0x2d,0x3d,0x31,0x3c,0x8b,0xef,0x39,0xf8,0x3f,0x32,0x2e,0x63, + 0xac,0xd4,0xe9,0x5,0x2f,0xfb,0x8a,0xa7,0xfc,0x3e,0x75,0x6c,0xd8,0xc7,0x74,0xe3, + 0xc2,0x7,0x25,0x50,0xd2,0x6a,0x86,0x36,0xc1,0x3d,0xaf,0xb5,0x0,0x18,0x1e,0x7c, + 0xa2,0x15,0x4b,0xd7,0x64,0x54,0xca,0xc9,0xbe,0x2e,0x7e,0x7f,0x21,0x8f,0xcf,0xb6, + 0x5c,0x38,0xd5,0x54,0x4e,0x4,0xe6,0x6f,0x33,0xfa,0xef,0x22,0xf3,0x5,0x42,0xa2, + 0x44,0x92,0x6,0x5,0x57,0x1a,0x3,0x42,0xe2,0x92,0x24,0x8f,0x81,0xac,0x4c,0x48, + 0x5e,0xcf,0x40,0x51,0x4d,0xe3,0x5b,0x35,0x67,0x5f,0xbc,0x47,0xf2,0x78,0x29,0xe4, + 0x8,0x64,0x9f,0x5f,0x6f,0xb9,0xee,0xf3,0x3f,0xe8,0xbc,0xe7,0x67,0x8d,0x7a,0x2a, + 0x79,0x81,0x71,0x98,0x97,0x36,0x74,0xb6,0x52,0x83,0xbd,0xc5,0x8c,0x52,0xe3,0xa, + 0x2c,0xc5,0x63,0x2e,0x7d,0xa5,0x69,0x19,0xe5,0x23,0xde,0xd9,0x5a,0xa9,0x27,0x12, + 0x86,0x7,0x79,0x3d,0xe5,0xd5,0x4f,0x64,0x1a,0x23,0x35,0xd4,0xc7,0x9d,0xaf,0xec, + 0xf1,0xbe,0x35,0xef,0xc6,0x2f,0x7d,0x56,0x64,0xaa,0x1d,0xf7,0xdc,0xf6,0x6b,0x5d, + 0x4d,0x9f,0x69,0x10,0xc5,0xd5,0xd,0x3e,0xf7,0xe8,0xc6,0xe6,0x4d,0xe6,0x2e,0xd0, + 0xe3,0x48,0xbe,0xa3,0xbd,0xb0,0x88,0x71,0x98,0xaa,0x13,0x60,0x9c,0x4d,0x6e,0x59, + 0x89,0x18,0x31,0xd5,0x50,0xc0,0xc6,0x46,0xe6,0xf2,0x9e,0x51,0x4a,0x2b,0x76,0x4d, + 0x35,0xfe,0xc4,0xfe,0x5d,0xd,0x9c,0x33,0x9,0x7a,0xc5,0xc2,0x55,0x3,0x66,0xe7, + 0xa6,0x86,0x26,0x4e,0xe2,0x3d,0xe3,0xaf,0x6e,0xde,0x7b,0xec,0xb8,0x34,0x9d,0x92, + 0x79,0xd5,0x60,0xc4,0xe3,0xdd,0xe1,0x29,0x29,0x79,0xd1,0xce,0xc5,0x5e,0xdc,0x32, + 0xef,0xf5,0xa9,0xbe,0x2f,0x74,0x60,0xe7,0x5c,0x4e,0x18,0xf,0xfe,0xaa,0x86,0x56, + 0x33,0xb4,0x49,0xe,0xf7,0x2e,0xe2,0x44,0x2,0xbd,0x9e,0xf2,0xaa,0x24,0x68,0x53, + 0x7,0x10,0xe1,0x83,0x7b,0xf9,0xd5,0x38,0x5e,0x4f,0x5b,0xb6,0xb2,0x74,0x7c,0x1a, + 0x22,0x25,0x33,0x4d,0x33,0x94,0x2d,0xb9,0xc8,0x6f,0xf8,0x2e,0x91,0xf9,0x7a,0x8a, + 0xcb,0xfe,0x38,0xe7,0x93,0x9f,0xfd,0x91,0x65,0x46,0x6a,0x1a,0xe4,0x12,0x8,0x0, + 0x9b,0x75,0xd1,0x27,0xfe,0xa1,0xeb,0xc9,0x7b,0x5f,0x37,0x6a,0xcb,0x43,0x35,0xbd, + 0xd9,0x90,0x86,0x87,0xf7,0xcc,0xe3,0x3a,0x88,0x3e,0x9f,0x2d,0x3c,0x7,0x0,0x18, + 0xd9,0xf1,0xea,0x27,0xc,0x9d,0x1c,0x42,0x92,0xb5,0xeb,0xce,0x7d,0x3e,0xe3,0x7c, + 0xdb,0xf7,0xcd,0xe7,0x3b,0xb4,0xbe,0x36,0xd1,0xf9,0x78,0x2b,0x6b,0x1e,0x4d,0xc, + 0xf7,0x9f,0x69,0xe8,0xb0,0x8e,0xe,0x5e,0x7,0x0,0x36,0x1a,0x10,0xe1,0x32,0x5e, + 0xeb,0x55,0x58,0x40,0xa9,0xa1,0x45,0x4f,0xf6,0x74,0x94,0xf2,0x14,0x11,0x10,0x88, + 0x67,0xbd,0x6e,0xc2,0x13,0xdc,0xf6,0xd3,0x25,0x8b,0x97,0xed,0x9c,0xea,0xdf,0x13, + 0x83,0x5d,0x9c,0xb,0x58,0xa4,0x90,0xe4,0xf5,0x99,0xe,0xd,0x69,0x2a,0xb1,0x8c, + 0xe3,0x49,0xc6,0xab,0xd7,0x9d,0xd9,0x7e,0xbc,0xa7,0xd5,0x57,0xc2,0x35,0x84,0x45, + 0x25,0xaf,0xb4,0x5c,0xf9,0x99,0x3b,0x9d,0x50,0x0,0xa9,0xf1,0x11,0x5e,0xea,0x45, + 0xab,0x58,0x75,0x4a,0x97,0x29,0x5e,0xc5,0xc2,0x8b,0x8c,0x3d,0x7a,0x4f,0x9b,0x2a, + 0x67,0x8e,0x1e,0x92,0x11,0x7e,0x75,0x8b,0x14,0x28,0x33,0x1c,0x43,0x14,0x13,0xfb, + 0xdf,0x99,0xcd,0x89,0x96,0x40,0x2e,0xab,0x69,0xb7,0x3a,0x5f,0x52,0x5c,0x6c,0xcb, + 0x7c,0x73,0x12,0xf5,0x4d,0x9,0x22,0x2b,0x87,0x98,0xa6,0xae,0x32,0x70,0x30,0x1b, + 0xd3,0x94,0x12,0xe2,0x99,0xba,0xcc,0x3e,0x31,0x3e,0xc6,0x4d,0x1,0x4a,0xfe,0x40, + 0xbb,0x1d,0x34,0x4c,0xf5,0x74,0x94,0xaa,0xd1,0xe0,0xa7,0x8c,0xd3,0x57,0xbe,0x17, + 0xa5,0x59,0x73,0xa2,0x99,0xf2,0x65,0x22,0xf3,0x25,0x45,0x81,0x56,0xd1,0xf9,0x56, + 0x9d,0x79,0xd1,0xf3,0x7d,0x8f,0xfd,0x3e,0x2,0x6,0xd9,0x9,0x5d,0x4d,0x9f,0x36, + 0xbc,0xfb,0xb5,0x39,0x95,0xeb,0xce,0xed,0xb4,0xc5,0xf8,0x3b,0xdd,0x8d,0xd7,0x88, + 0x18,0xd1,0x70,0xb0,0xd8,0xea,0x18,0x86,0x4a,0x29,0x95,0x3c,0x85,0xe3,0xd5,0x76, + 0x15,0x2f,0x5c,0x35,0x36,0x15,0xc3,0xb5,0x48,0xc8,0x38,0x9f,0x4e,0x48,0x2c,0x9b, + 0x79,0x51,0x35,0x6d,0x58,0x4d,0x45,0x14,0xcf,0x7e,0xed,0x84,0x9c,0x65,0x34,0x12, + 0x2a,0xe2,0x72,0xcb,0xab,0x84,0x9c,0x52,0x36,0xe9,0x44,0x8c,0x97,0x77,0xee,0xa4, + 0x81,0x52,0xd5,0x4c,0xde,0x84,0xa6,0x52,0xc6,0x8b,0x8b,0xe3,0x99,0xe9,0xf1,0x38, + 0x77,0x73,0xd2,0x5b,0xd5,0xd0,0x66,0xc7,0xf7,0xa7,0x86,0x7,0xf8,0x25,0xcc,0xb, + 0x4f,0xb2,0x61,0xbe,0x35,0x6d,0x90,0x23,0x8,0xed,0xdd,0xd1,0x90,0xe8,0x69,0x5b, + 0xee,0xab,0x6b,0x38,0x52,0x79,0xca,0x6,0x5b,0x5a,0x8d,0x4b,0x3e,0xdf,0x5e,0xdd, + 0xc0,0x80,0x0,0x80,0x47,0x1b,0xef,0xf7,0x79,0x1b,0x67,0xc5,0xa7,0xa6,0x21,0xbf, + 0x8a,0xcd,0x5b,0x5d,0xd7,0x66,0x47,0xb,0x93,0x91,0x57,0x9e,0xfc,0x17,0xa0,0xd4, + 0x70,0xbf,0xd6,0x57,0xd3,0xf0,0xb8,0xd1,0xbb,0x84,0xe6,0x5b,0x5e,0xd9,0x2a,0x3a, + 0x5f,0x4f,0x5d,0x75,0x52,0xf6,0x17,0x3f,0xad,0x27,0x62,0x46,0x7d,0x4,0x49,0xec, + 0xf0,0xfe,0x6b,0xab,0xd6,0x9f,0xf5,0x7d,0xe7,0x3,0xcd,0xcc,0x6,0x44,0x50,0x37, + 0x50,0x62,0x44,0x8c,0xb2,0x25,0x8b,0x87,0x43,0x6f,0x6f,0x33,0xee,0x55,0xa5,0x69, + 0xf5,0xd9,0x8,0x40,0xbc,0xfd,0x50,0x25,0xd3,0xb4,0xc5,0x1c,0x1,0x7e,0x27,0xd3, + 0xd8,0x7a,0x92,0xb7,0xc0,0x19,0x31,0x3b,0xaf,0xf1,0xd7,0x5f,0x5a,0xc0,0x28,0xad, + 0xe7,0x84,0xb0,0xef,0x9d,0x38,0x6e,0x49,0x73,0xd3,0x58,0x68,0xd2,0x68,0x13,0x3, + 0x8b,0xa6,0xdb,0xd5,0xeb,0x87,0x6f,0x41,0x8c,0x95,0xbd,0xa4,0x78,0x5a,0xcd,0xce, + 0x85,0xaa,0xc6,0xa5,0x91,0x4a,0x51,0xc0,0x70,0x4c,0xaa,0x25,0x79,0xde,0x9d,0x5e, + 0xb1,0x76,0x5d,0x87,0x1d,0x34,0xa2,0xd1,0xb0,0xf1,0xbb,0x24,0x69,0xa4,0x68,0xee, + 0xdc,0x90,0x61,0xf,0x2c,0xfe,0x7c,0x59,0xd9,0x92,0xe5,0x6d,0x8e,0xf1,0xf4,0xd8, + 0x8,0x6b,0xd7,0x5b,0xb3,0x92,0x7d,0x9d,0xcb,0xb4,0x48,0x64,0x39,0x4d,0x26,0x97, + 0x31,0x2d,0xbd,0x1c,0x18,0xab,0x4,0x0,0xd0,0x42,0xe3,0x77,0x55,0x9d,0x7a,0xf6, + 0xf7,0xec,0x79,0x13,0xe3,0x64,0x1f,0x48,0x32,0x93,0xf1,0x98,0xa4,0x61,0x9a,0xcb, + 0xf3,0xb2,0xa5,0x2b,0x2c,0x1b,0xbb,0x81,0x27,0x1f,0xb8,0x50,0x4f,0x24,0x2e,0xe3, + 0xcc,0x35,0x58,0x7d,0xde,0xa6,0x57,0xd,0xe5,0x86,0x3f,0x5f,0x28,0x59,0x74,0x92, + 0xa9,0x3d,0x9b,0xa2,0xa6,0x96,0x47,0xa3,0xed,0xef,0x5f,0x6b,0xec,0xac,0x44,0xaf, + 0x52,0x87,0x7,0x7e,0xe2,0xa9,0x6b,0x4c,0xda,0xc1,0x34,0x27,0x23,0x10,0xc3,0x7c, + 0x9f,0x5c,0x14,0xd0,0x88,0x24,0xf7,0x30,0xaa,0xcf,0xcd,0xfc,0xf5,0xc6,0x3d,0xa3, + 0x32,0x21,0xb8,0xf3,0x8d,0x4b,0x79,0xef,0x2f,0x6a,0x9a,0xf3,0x50,0x66,0x66,0x1b, + 0x57,0x19,0x31,0x4a,0x1b,0x68,0x2a,0x29,0x4b,0x26,0x2a,0x1c,0x92,0x7d,0x9d,0x67, + 0xf3,0x9e,0xf1,0xd7,0xd6,0x6d,0xff,0x88,0xa7,0x51,0x5b,0x9f,0x22,0x92,0x34,0xc8, + 0x28,0xcd,0xdc,0x80,0x31,0x95,0xb2,0xa5,0x25,0x6,0xd1,0xf8,0x51,0xc,0x55,0x8d, + 0x17,0x82,0xe4,0xf3,0xb7,0x8a,0x8c,0xf3,0x61,0x84,0x19,0x1a,0xf4,0xf1,0xba,0x11, + 0x78,0x2b,0xeb,0xf,0x1b,0x8e,0xc9,0xe9,0xcb,0x45,0x24,0xb9,0x53,0xf1,0x94,0xa9, + 0x60,0xc3,0x76,0x0,0x4d,0xa5,0x38,0x11,0x98,0xd2,0xc6,0xfd,0x7e,0xee,0x7c,0xa5, + 0x3e,0x5f,0x4d,0x4b,0x1c,0x1c,0xdc,0xbe,0x18,0xdf,0xf5,0xc6,0xac,0xd0,0xee,0x57, + 0x1f,0x6,0xc6,0x32,0x16,0xb6,0xd0,0x44,0xfc,0x5c,0xa2,0xc9,0xdf,0xb5,0xe3,0x7d, + 0x34,0x95,0x5a,0xc3,0x89,0xf2,0x27,0x2c,0xf2,0xbc,0xcf,0x5b,0xd9,0x94,0xb4,0x42, + 0xc3,0x91,0x97,0x9f,0x58,0x93,0x1a,0xe8,0xfb,0xf,0xde,0x73,0x72,0xa0,0xe4,0x41, + 0xae,0x7c,0xf1,0x79,0x3e,0x58,0xd4,0xb4,0x30,0x6c,0x66,0xbe,0xb5,0x1b,0x2e,0xdb, + 0x1d,0xeb,0x38,0x7c,0x84,0x51,0x3d,0x73,0x74,0xc3,0x58,0xd9,0xc8,0xf6,0x17,0x36, + 0x35,0x5f,0x71,0xcb,0xa3,0x36,0x68,0x8,0x87,0x9b,0x29,0x72,0x16,0x92,0xe4,0xf1, + 0x1c,0xd1,0x53,0x99,0xd,0x8,0x63,0xb4,0xde,0x8c,0x32,0xfa,0x90,0x57,0x91,0xd0, + 0x55,0x9c,0x54,0xd1,0xbe,0xda,0xd,0x97,0xed,0xce,0xc4,0x2c,0xa6,0x69,0xbc,0x70, + 0x53,0x9,0xef,0xdf,0x5f,0x5b,0xb9,0xea,0xd4,0x1,0x21,0xb3,0x4d,0x75,0xa2,0x86, + 0x83,0x9f,0xe0,0x7a,0x31,0x67,0x7d,0xfc,0x9d,0x29,0xbf,0x57,0x56,0xba,0x80,0xa6, + 0x1b,0xd,0x3c,0xf8,0x3a,0x51,0x3a,0xa5,0xfa,0xba,0x2,0x43,0xaf,0x3c,0xf1,0xd, + 0x5f,0x55,0xdd,0xd6,0x9a,0x73,0x37,0xbf,0x2a,0x17,0x5,0x84,0x45,0x36,0x3d,0xdc, + 0xef,0x67,0x94,0x1a,0xdf,0x83,0x5e,0x5c,0xd2,0x6a,0x2e,0x3d,0xb2,0x67,0x1,0x18, + 0xb7,0x45,0xd1,0xcb,0x57,0xad,0xcf,0xe8,0x49,0xa6,0x6,0xba,0xf9,0xd5,0x38,0x1e, + 0x8f,0x7d,0xed,0xbc,0x75,0x4e,0x9,0xb3,0x62,0x5c,0xc2,0x2c,0x32,0x5f,0x90,0x3d, + 0x8e,0xa4,0xaf,0x88,0xfc,0xbf,0x7b,0x94,0x55,0x6b,0xd6,0xf6,0x86,0x76,0xbf,0xa6, + 0x1a,0x2d,0x6f,0x46,0xf5,0xb9,0xe3,0x3b,0x5f,0x6e,0xa9,0x5e,0x7f,0x56,0x97,0x95, + 0xf7,0x26,0xbb,0x3b,0x4b,0x78,0x19,0x2,0x90,0xe4,0xa1,0x63,0xe7,0x77,0x3c,0xd, + 0xfb,0x8a,0x18,0xa5,0x4d,0xc6,0x3c,0x57,0xda,0x32,0xfd,0x5e,0x4,0x43,0x5b,0x1f, + 0x39,0x33,0xd6,0xdb,0x75,0x3b,0x30,0x56,0x64,0xac,0x4b,0x94,0xd6,0xc6,0x4b,0x2e, + 0xbf,0xcd,0xe8,0x5d,0x22,0xf3,0x5,0xd9,0x93,0xd5,0x7c,0x3d,0xa5,0x65,0x8f,0xa4, + 0x43,0x13,0x7f,0x6f,0xec,0xa4,0x8d,0x5f,0x4f,0x64,0xed,0x91,0xfc,0x8a,0x40,0x28, + 0x10,0x2e,0x41,0x3c,0x9e,0x23,0x90,0x4a,0x9e,0x67,0x60,0x3d,0xfd,0xa3,0xaf,0xff, + 0x79,0x51,0xed,0x39,0xe7,0x1f,0x16,0xfd,0xc2,0xbe,0xc7,0xef,0xdf,0xcc,0x34,0xcd, + 0xb0,0xda,0xc9,0x53,0x5e,0x7d,0x77,0xa6,0xb9,0x4d,0xec,0xd9,0x51,0xf,0x2,0x65, + 0xb3,0xe9,0xc1,0x23,0x8b,0xc9,0x9a,0xb5,0xfd,0x22,0x73,0xea,0x7f,0xea,0xf,0x17, + 0x31,0x5d,0x37,0x54,0x3c,0xb2,0xdf,0xbf,0x4d,0x29,0xf6,0x68,0x30,0x85,0x55,0x93, + 0x14,0x4f,0xa7,0xae,0xa6,0x4f,0x37,0x48,0xf5,0x35,0x89,0xa,0xdf,0xe8,0xdb,0xcf, + 0x5f,0xad,0x27,0xe2,0x57,0xc6,0xfb,0x3a,0xaf,0xec,0xfe,0xc3,0xed,0x21,0xd9,0x5f, + 0xbc,0xd5,0x5f,0xdb,0xf8,0x64,0xed,0x79,0x9b,0xde,0xe5,0x95,0x7c,0x86,0xf,0xef, + 0x9e,0xf,0xbc,0xa,0xac,0xfa,0xfa,0xc3,0x66,0x16,0x42,0x3a,0x38,0xc4,0xf3,0x24, + 0xbb,0xbd,0x15,0x25,0x29,0xc8,0x60,0xed,0xc3,0x6d,0xbb,0xb9,0xd5,0x2d,0xe0,0xf1, + 0xb6,0x5a,0x51,0x26,0x1f,0x5a,0xb2,0x64,0x52,0xe6,0x9d,0x57,0x91,0x8b,0x7c,0x86, + 0xef,0x12,0x99,0xaf,0xe4,0xb3,0x67,0xbe,0xe6,0x8c,0x89,0xcc,0x64,0xaf,0xef,0x35, + 0x3d,0x95,0xb8,0xc2,0x50,0x6,0xf6,0xef,0xfc,0x4e,0xc5,0xca,0x75,0x9f,0x96,0xfd, + 0xd9,0x9f,0x2f,0x18,0x79,0x63,0xdb,0x8d,0x3c,0x39,0x92,0xfc,0xfe,0xb7,0x33,0xcb, + 0xe1,0x7e,0x11,0x9e,0x67,0x65,0x84,0xb5,0x68,0xc4,0x33,0xf8,0xf4,0x43,0xb7,0xa4, + 0x43,0x13,0x7f,0x3,0x0,0xbc,0x3b,0x35,0xd2,0x25,0xb,0x97,0xfd,0x9d,0xb7,0xa2, + 0x3e,0x65,0xbc,0x6e,0xf6,0xb,0x54,0x60,0x79,0x5b,0xb3,0x99,0x6f,0x60,0xe9,0xea, + 0xc7,0xd2,0x6f,0xbd,0xf4,0x15,0x23,0x27,0x8c,0x69,0xea,0xaa,0x91,0x97,0x9f,0x5b, + 0x56,0xbb,0xe1,0xc2,0x3,0x47,0x8d,0x73,0x76,0xb2,0x45,0xcd,0x57,0x61,0x59,0xb8, + 0x91,0x90,0xff,0x2e,0xd9,0x57,0xcc,0xed,0x94,0x19,0xef,0x38,0xfc,0x79,0xd1,0xef, + 0x9b,0x78,0x6f,0x67,0x5d,0x6a,0x78,0xf0,0x5b,0xc6,0x2b,0x45,0x1a,0xad,0xbf,0x60, + 0xf3,0xd3,0x99,0xbd,0x85,0xce,0x45,0x22,0xef,0x4a,0xc,0xd,0xdc,0x2a,0x64,0xb2, + 0x75,0x9d,0xa4,0xc7,0x86,0xff,0x8a,0xf7,0x9c,0xaf,0xba,0xf6,0xcf,0x99,0x6e,0xeb, + 0x93,0xbd,0x5e,0x43,0x8f,0x8f,0xa9,0xa9,0x33,0x62,0xad,0xef,0x57,0xf1,0x6e,0x21, + 0x54,0xc3,0x23,0x5e,0x35,0x34,0x71,0xd3,0x31,0x6,0xba,0x5c,0x4f,0xc4,0xae,0x8d, + 0x75,0xb7,0xdd,0xdd,0x75,0xd7,0xed,0x2f,0x75,0xdd,0xf7,0xeb,0x7f,0x88,0x1e,0xda, + 0x5d,0x93,0xe9,0xf7,0xe9,0xf1,0x51,0x5e,0x1e,0x37,0x5d,0xb9,0xe6,0x8c,0x6e,0xd1, + 0x9b,0x28,0x41,0x92,0x99,0x16,0x8f,0x71,0x2a,0xb0,0x94,0x56,0xa3,0xdf,0xa7,0xc7, + 0x83,0xdc,0xd,0x69,0x25,0x10,0x68,0x35,0x33,0xa7,0x4c,0x7f,0xc1,0xf7,0xde,0x9a, + 0xcd,0x53,0x2a,0x9e,0xb2,0x4a,0xeb,0xf3,0x2d,0xe,0x1c,0xb6,0x63,0xbe,0x66,0xff, + 0x94,0xf2,0xf2,0xed,0x5c,0x79,0x56,0xd5,0x53,0x7b,0x1f,0xbd,0xfb,0x6f,0xb2,0x7d, + 0x47,0xef,0x1f,0x7f,0x7f,0x8b,0x1a,0xe,0x7e,0x85,0xf7,0x9e,0xa2,0x9a,0xc6,0x17, + 0x2d,0xc8,0x21,0x28,0xc5,0x26,0x79,0xe,0x0,0x83,0xcf,0x3c,0xb4,0xa1,0xe7,0x81, + 0xdf,0x3e,0x99,0xe,0x4d,0xfc,0x5f,0x1,0xe3,0x1,0xde,0xf2,0xca,0x1f,0xd7,0x6e, + 0xb8,0xf8,0x20,0x6f,0x6c,0x91,0xf9,0xca,0xfe,0xe2,0xac,0x78,0x5e,0x79,0xf2,0xfa, + 0x21,0xe2,0xf1,0xbd,0xca,0xd5,0xa3,0x3d,0x47,0xae,0xcf,0x74,0x93,0x67,0x6e,0x46, + 0x20,0x0,0x84,0x37,0x59,0x6f,0x65,0x45,0x5b,0x7a,0x6c,0xc8,0xd8,0xeb,0x4b,0x25, + 0x3e,0x3e,0xb6,0xe3,0xcd,0x9f,0x54,0xaf,0x3f,0xab,0x87,0xf7,0xc2,0xe0,0xce,0x37, + 0xbe,0x7,0x8c,0x19,0xb6,0x5b,0xf6,0xd5,0x37,0x7f,0xcb,0x53,0x51,0x95,0xd1,0x63, + 0xd0,0xc2,0x51,0xa1,0x76,0x3,0x4c,0x55,0x4f,0x1d,0xfa,0xf3,0x63,0xa7,0xd7,0x5f, + 0x62,0x7c,0x7f,0x41,0xdf,0x23,0x77,0x7f,0x92,0x69,0xda,0x52,0x4e,0xfe,0xb3,0xab, + 0xfe,0xa2,0xab,0x5e,0xce,0xf8,0xdf,0x8b,0x4b,0x3b,0x20,0x34,0x61,0x48,0xca,0xf1, + 0x9d,0x6f,0xdc,0x10,0x58,0xb2,0xe2,0x36,0xc3,0x48,0xe8,0xf1,0x47,0xbe,0xce,0x28, + 0x6d,0x99,0x3a,0x3d,0x41,0xeb,0xf5,0x78,0x74,0x8b,0x12,0xa8,0xfc,0x59,0x46,0xda, + 0x24,0x8d,0x95,0x3d,0x51,0x94,0x23,0x92,0xaf,0xc8,0x94,0x67,0x4a,0x53,0x69,0xe3, + 0x54,0x86,0xc7,0xd7,0x6a,0x2c,0x1f,0x31,0xae,0xc1,0xf7,0x55,0xd5,0xdb,0x92,0x12, + 0x4a,0xe,0xd,0x73,0x15,0x41,0xe9,0x82,0xa5,0x6d,0x56,0xe7,0xeb,0xad,0xac,0x3e, + 0xec,0x74,0x4,0x2,0x0,0x50,0xb1,0x7c,0xd5,0xab,0x43,0xc3,0x83,0x8c,0xe7,0x2d, + 0xeb,0xd1,0xc8,0xe7,0xbb,0x7e,0xf7,0xb3,0xe6,0x92,0x93,0x96,0xff,0xb4,0xe6,0xcc, + 0x73,0x84,0x36,0xaa,0x87,0xb7,0x3d,0x7b,0x52,0xbc,0xab,0xf3,0x1a,0x3d,0x11,0xbb, + 0x89,0xaf,0x39,0xc8,0x58,0xed,0x79,0xe7,0xef,0xca,0x44,0x3,0x2d,0x19,0x5d,0xc8, + 0xa7,0x61,0x95,0x61,0x14,0xa7,0xc7,0x63,0x4a,0xe8,0xfd,0x3,0x35,0xe9,0xfe,0xde, + 0x45,0xc9,0xd1,0x91,0xb,0x68,0x2a,0x71,0x81,0x99,0xbb,0x4d,0x88,0xc7,0xf3,0xfa, + 0xac,0xeb,0x6e,0xfa,0xad,0x8,0x9f,0x84,0xe6,0x5b,0x55,0x99,0x35,0xcf,0xbd,0x55, + 0xd5,0xf,0xa7,0x86,0xfa,0x37,0x18,0x47,0xcf,0xf1,0xcb,0x52,0x3d,0xad,0xdf,0xf3, + 0xcf,0x9d,0x17,0xcd,0x5a,0x40,0x88,0x3d,0xbd,0xb0,0x84,0x7,0xe1,0x11,0xa4,0x6e, + 0xe3,0x5,0x7b,0x62,0x9d,0xed,0x7b,0x99,0xa6,0x19,0xf5,0xc4,0x92,0xc3,0xbb,0xdf, + 0xfc,0x1d,0x8d,0x5,0xbf,0x54,0x77,0xfe,0xc5,0x53,0x5e,0xd3,0x35,0xf6,0xd6,0xeb, + 0xb3,0x23,0xfb,0x76,0xff,0x13,0x53,0x53,0x67,0x1b,0x47,0x3c,0x45,0x4f,0xce,0xba, + 0xfa,0x13,0x7f,0x6,0x83,0x9d,0x2a,0x3d,0x1d,0x17,0x6e,0x31,0x11,0xeb,0x39,0x72, + 0xdb,0xe0,0x53,0xf7,0xff,0x7d,0xe3,0xe5,0xd7,0xbc,0x38,0x55,0xe4,0xd1,0x75,0xef, + 0xef,0xfe,0x56,0x8f,0x86,0xb9,0xd1,0x87,0xa7,0xa2,0xe2,0xe,0xc9,0x2f,0xe9,0x99, + 0xe6,0xd5,0x78,0xf1,0xa6,0x97,0xbb,0xee,0xfa,0x4d,0x17,0xa3,0x34,0x63,0x1f,0x21, + 0x35,0x12,0xba,0x75,0xf0,0xa9,0xfb,0xdf,0x6b,0xbc,0xfc,0x9a,0x97,0xa6,0x9a,0x4b, + 0xef,0x1f,0xee,0xfe,0xac,0x9e,0x88,0x5d,0x6f,0x9c,0x4f,0x2d,0xfd,0x6d,0xd1,0xbc, + 0x96,0x48,0xa6,0x79,0xd0,0x94,0x71,0xbf,0x2a,0x49,0xf6,0x98,0x5f,0x4,0xba,0xba, + 0x98,0x17,0x3d,0x18,0x8d,0x49,0x53,0xfc,0x6a,0x9c,0xca,0x53,0x4e,0x39,0x62,0x87, + 0x42,0xa6,0x71,0xe3,0xf2,0x6e,0x20,0x64,0x2c,0xb0,0x64,0xe1,0x84,0x91,0x7c,0x9, + 0xcc,0x97,0x56,0x2c,0x5b,0x61,0xeb,0x1d,0x16,0xa2,0x28,0x39,0x69,0xf9,0xd8,0xf0, + 0xf6,0x6d,0x7,0x98,0xa6,0xf1,0x9a,0x77,0x12,0x3d,0x95,0xb8,0x34,0xb4,0xfb,0xdd, + 0x4b,0xa2,0xef,0xef,0xdd,0x2a,0xfb,0x8b,0xf7,0x11,0xbf,0x7f,0xc0,0x53,0x1a,0xe8, + 0x93,0x4b,0x2a,0x42,0x7a,0x34,0x58,0xae,0xc6,0x12,0xd5,0x2c,0x9d,0xae,0xd2,0x53, + 0xa9,0x59,0x34,0x1e,0xbb,0x98,0x51,0x5d,0xb8,0xf,0x94,0xb7,0xb2,0xf2,0x67,0x92, + 0x41,0x8a,0x8c,0xa6,0x54,0xae,0x11,0x8e,0xb6,0x1e,0xfc,0x79,0xb4,0xf5,0xa0,0x3e, + 0x75,0x66,0x9c,0x95,0x1c,0xad,0x2c,0x23,0xd9,0x29,0x52,0x12,0xaa,0x58,0x77,0xfa, + 0xd7,0x88,0x60,0xe9,0xbc,0xc0,0x7c,0x59,0xc5,0xb2,0x95,0xad,0x44,0x56,0xb2,0xbb, + 0x9b,0xe5,0xa2,0x8f,0x3f,0xdf,0x75,0xcf,0x1d,0x41,0x60,0x2c,0x73,0xa3,0x56,0xc6, + 0x8a,0x46,0xde,0x7c,0xe5,0xca,0x96,0x5,0x8b,0xee,0xce,0x97,0x8,0x44,0xc0,0x8a, + 0x7b,0x69,0x60,0xde,0xc2,0x6f,0x45,0x5b,0xf,0x3e,0x68,0x94,0x13,0x65,0x94,0xce, + 0x8e,0x1c,0x3a,0xf0,0xc7,0x78,0x6f,0xd7,0x7d,0x4a,0x49,0xc9,0x7b,0xbe,0xaa,0xda, + 0xc3,0x54,0x4d,0x16,0xa9,0x91,0xc8,0x2c,0x2d,0x1a,0x5d,0xad,0xc7,0x62,0x37,0x70, + 0x43,0x4e,0x42,0x46,0xeb,0xce,0xdd,0xf8,0x6f,0xc7,0xe7,0x7d,0x3f,0xca,0x30,0xaa, + 0x6a,0x3c,0x25,0x11,0xfb,0xf0,0x94,0x3a,0x63,0x65,0xf1,0xde,0xde,0x5f,0x75,0xde, + 0xf1,0xcb,0xc7,0xe5,0x40,0xd1,0xe,0x6f,0x75,0xf5,0x1,0x9a,0x48,0x54,0xa9,0xe1, + 0xf0,0x72,0x2d,0x91,0x38,0x93,0xa9,0xea,0x7a,0x3e,0x11,0xa4,0x91,0x86,0x4b,0x2e, + 0x79,0xd8,0x48,0x78,0x94,0xd2,0x72,0xd5,0x5b,0xd7,0xf0,0xc3,0xd4,0x60,0xff,0xcf, + 0xc,0x4,0xa4,0x38,0xde,0xdb,0xfb,0xcb,0xce,0xbb,0xee,0xf8,0xb5,0xbf,0xba,0xe6, + 0xd5,0x8a,0x95,0xab,0xf7,0xc5,0x47,0x46,0x4a,0xe3,0xdd,0x1d,0x2b,0xd2,0xa3,0xc3, + 0xb7,0x30,0x55,0x3d,0x9d,0xb7,0x28,0xea,0xce,0x3d,0xff,0xf7,0x86,0x42,0xcc,0xd9, + 0x40,0x96,0xfd,0xde,0xc3,0x66,0x16,0x41,0xa2,0xa3,0xad,0xc4,0xa8,0xba,0x6c,0x32, + 0xb5,0x57,0x73,0xd8,0xca,0x9c,0x88,0x24,0x77,0x7a,0x2a,0x2a,0x6d,0xb9,0x10,0x82, + 0xa7,0x8,0x88,0xa2,0xf0,0x95,0x0,0x77,0xbe,0x52,0x8f,0x6f,0x56,0x4b,0x2,0x66, + 0x8,0xc5,0x8d,0x8d,0x3f,0x8a,0xf5,0xf4,0xfc,0x6,0x78,0x87,0x7c,0x8f,0xb2,0x5c, + 0x4f,0xa5,0x36,0xeb,0xa9,0xd4,0x66,0x8,0x1,0xa4,0x86,0x6c,0xd0,0x9,0x92,0xdc, + 0x3e,0x6b,0xcb,0xf5,0xf7,0x59,0xe1,0xf9,0x51,0x9d,0xd1,0x3c,0x1d,0xf4,0x21,0x92, + 0x74,0xa4,0x6c,0xe5,0xca,0xbf,0xac,0x5e,0x7f,0xfa,0xa0,0xf0,0x8f,0xf8,0x3c,0xef, + 0xf7,0xb7,0xcc,0xcd,0xfa,0xd0,0xb4,0xa7,0xa2,0x32,0x2d,0xfb,0x8b,0x9f,0xd4,0x13, + 0xb1,0x1b,0x8d,0x9e,0x53,0xc3,0xe1,0x1b,0x0,0xc0,0x82,0x1,0x91,0x9c,0x35,0x20, + 0x22,0xca,0xa4,0x61,0xd3,0x65,0x7b,0x3a,0x7a,0xbb,0x1e,0xd0,0x13,0x89,0xeb,0x79, + 0x8e,0x89,0x1e,0x8b,0x7d,0x5a,0x8f,0xc5,0x20,0x35,0x64,0x52,0x52,0x9,0x89,0x96, + 0x2c,0x58,0xf0,0x57,0x81,0xa5,0xcb,0x27,0xb8,0x82,0xa7,0x1b,0x1b,0x10,0x6f,0x59, + 0xc5,0xed,0x47,0x73,0xa4,0xc7,0x7a,0x63,0x57,0xe8,0xa9,0xc4,0x15,0xe9,0xf1,0x71, + 0xd3,0x2c,0xf1,0xd5,0x37,0xfe,0xab,0xb7,0xaa,0x29,0xc5,0x7b,0x6e,0xf6,0x35,0x9f, + 0xda,0xda,0xfe,0x8b,0x9f,0xec,0x62,0x9a,0xba,0xc6,0x70,0x41,0x47,0xc3,0x5f,0x88, + 0x45,0xc3,0x5f,0x88,0x75,0x99,0x73,0x62,0x3d,0x65,0x65,0xbf,0x29,0x9a,0xb7,0x30, + 0x63,0x78,0x9b,0xec,0xee,0x2c,0xe6,0x2d,0x4a,0xa9,0xb8,0xd4,0x5c,0x5,0xd6,0xc1, + 0xbd,0xbc,0x2e,0xc3,0x5a,0xf5,0xe9,0x67,0x67,0xfc,0x90,0x74,0x7f,0xaf,0x5f,0xa4, + 0x1a,0xe7,0xb8,0xff,0x6d,0xa1,0xb5,0x5,0xbf,0x2,0x4b,0x69,0x35,0x1a,0x3f,0x39, + 0x2a,0x30,0x5f,0xd9,0xd3,0x2a,0x69,0xda,0x8c,0x9d,0x40,0x6f,0xbe,0xf4,0x13,0x2f, + 0x77,0xdc,0x73,0xc7,0x4f,0xd4,0x48,0xf8,0xab,0x8e,0xbf,0x9c,0x90,0x44,0x60,0xce, + 0xbc,0x7f,0x54,0x14,0xaf,0x96,0xa9,0x5,0xcb,0x51,0x1a,0x36,0xcf,0x4,0x6d,0x64, + 0x8f,0xef,0x85,0xc6,0xf3,0x2f,0xfe,0x6a,0xf1,0xbc,0x5,0x51,0xd1,0x16,0x31,0x42, + 0xf3,0x95,0x65,0xcb,0x3c,0x2f,0x6e,0x9e,0xf5,0x60,0xa4,0xed,0x90,0xa1,0x1,0x61, + 0x9a,0xb6,0x68,0xf0,0x89,0x7,0xd7,0x37,0x5d,0x72,0xd5,0xdb,0x59,0xae,0x0,0xd3, + 0x6,0x24,0xeb,0x4d,0x74,0x46,0x29,0x91,0x34,0x8d,0x89,0xfc,0xd5,0x9f,0x71,0xee, + 0x7f,0x1,0x21,0x13,0xd3,0x24,0x94,0xe1,0xd2,0xf9,0x8b,0x6e,0x6e,0xba,0xf0,0xb2, + 0x1d,0xbc,0x79,0x8c,0xef,0x78,0xad,0x8e,0xb3,0x87,0xc2,0x1a,0xce,0x3d,0xef,0xf7, + 0x44,0x92,0xba,0x6c,0x11,0x48,0x9f,0xef,0x4f,0x73,0xae,0xfa,0xe4,0x9f,0x45,0xe9, + 0x14,0x98,0x3d,0xe7,0xbb,0xd3,0xb4,0x30,0x9e,0x9f,0x7d,0xd5,0x75,0xbf,0x32,0x7a, + 0x77,0x68,0xdf,0x9e,0x85,0xbc,0x90,0xdf,0xdf,0xd0,0x78,0x48,0xf4,0x5b,0x24,0x4d, + 0x63,0xe9,0xb1,0x9,0x4e,0xf,0x2c,0xa9,0xd3,0xe3,0xf3,0xab,0x99,0x7e,0x3f,0xb1, + 0x67,0x17,0xb7,0x2a,0xc,0x3c,0x93,0xa,0xf9,0x83,0xbf,0x6c,0x69,0xa4,0x25,0xe2, + 0x32,0xaf,0xbc,0x5b,0xf6,0x15,0x19,0xee,0x7f,0x4c,0xec,0xda,0xbb,0x80,0x3b,0x5f, + 0x9f,0xe7,0x30,0xcc,0x30,0xe6,0x5c,0x7f,0xcb,0xed,0xb2,0xc7,0xf7,0xbc,0xc3,0xaf, + 0x4d,0x7,0x9a,0x66,0x7f,0xa1,0x69,0xd3,0x65,0x3b,0x2d,0xd3,0xd0,0x7e,0x30,0xb9, + 0xa4,0xe4,0xb6,0xe6,0xcf,0xfe,0xd5,0xe7,0xe5,0x85,0x8b,0x23,0x29,0x59,0x66,0xa2, + 0x7f,0xa3,0x2,0xf3,0x95,0x3c,0xbe,0x43,0x66,0xc6,0x9c,0xea,0xaf,0x6a,0xd3,0x65, + 0x7b,0x89,0xa4,0x70,0x3b,0x84,0xc7,0x6,0x6,0x6e,0xc8,0xf6,0x1d,0xd4,0xc9,0x2b, + 0x6d,0x8d,0x1e,0x4a,0x9d,0x90,0x3b,0xf4,0x2c,0x5b,0x39,0xe1,0xdb,0xbb,0xe7,0x9b, + 0xa9,0x91,0xc1,0x1f,0x3,0x80,0xc7,0x46,0xe3,0x31,0x51,0xbc,0x60,0xc9,0x2d,0x55, + 0x9b,0x2e,0xdd,0x97,0x12,0x78,0x3c,0xde,0xdd,0xcb,0xe9,0x81,0x45,0x46,0xc8,0x9c, + 0x79,0x71,0xb9,0xaa,0xea,0xe7,0xda,0xe8,0xe8,0xf,0x2c,0x4d,0x4d,0x51,0xf6,0x56, + 0x6f,0xbc,0xf8,0x5f,0x53,0x26,0x5a,0x90,0x54,0x6f,0xbe,0x72,0x47,0xe2,0xb7,0xbf, + 0xb8,0x43,0x8f,0xc7,0x6e,0xb5,0x8d,0x44,0x8a,0xb2,0xab,0xee,0xea,0x2b,0xbf,0xac, + 0x97,0x94,0x6a,0x46,0xbb,0xdf,0x89,0xd0,0x38,0x2f,0xb5,0x97,0x28,0x3b,0xfd,0xec, + 0x1e,0x33,0xdf,0xa3,0xa7,0x12,0x9c,0xd,0x74,0xcf,0x61,0xa3,0xf1,0xd2,0xc1,0x71, + 0x6e,0x2e,0x5c,0x29,0xa,0xb4,0xa6,0x6c,0x68,0xf3,0x32,0xba,0xf3,0xed,0x16,0x5e, + 0x9a,0x54,0xae,0x28,0xb3,0x63,0xbe,0x87,0x53,0x33,0xdd,0x3,0x4b,0x96,0x59,0xcd, + 0x85,0x9b,0xbe,0x3a,0xbc,0xf5,0x89,0xc7,0x18,0xa5,0xf3,0x1c,0x88,0x3c,0xc6,0xfd, + 0x4d,0xb3,0xfe,0xae,0xe6,0xaa,0x4f,0x6e,0xe7,0xad,0xd3,0x74,0x70,0x62,0xa1,0xa3, + 0xb4,0x20,0x24,0xe8,0x6b,0x68,0xf8,0xa7,0x86,0x2d,0x9f,0xfa,0x73,0x36,0x3f,0xd7, + 0x5,0xe6,0xab,0x14,0xfb,0x5b,0x6d,0x61,0x5b,0x69,0xe0,0x21,0x2d,0x14,0xfa,0x67, + 0x43,0xbd,0x9c,0x4a,0x6d,0x8a,0xed,0xdb,0x53,0x1d,0x58,0xb1,0x7a,0x2c,0xb,0x62, + 0x38,0x77,0xa5,0x2d,0x0,0x23,0x66,0x16,0x42,0xc3,0xb5,0x37,0x3e,0x35,0xfa,0xd2, + 0xd6,0xc3,0xf1,0x83,0x7,0x7f,0xc0,0x34,0x6d,0xb5,0x45,0x5a,0x32,0xe2,0x2b,0x7a, + 0xa4,0xfa,0xcc,0x73,0xbe,0x17,0x58,0xbe,0x4a,0x38,0xaf,0xa4,0x45,0xa3,0x8b,0x38, + 0x29,0xb9,0x4e,0x0,0x80,0xe6,0xeb,0x3e,0xfd,0x50,0xef,0x6f,0x7f,0xb9,0x48,0x8f, + 0x47,0x3f,0x97,0xa5,0xd2,0xde,0x59,0x77,0xd1,0xe6,0x4f,0xfb,0xe7,0x2f,0x32,0x5d, + 0x11,0x31,0xeb,0xff,0xfc,0xe5,0x7f,0xc,0x3e,0x7c,0xef,0xbb,0xa9,0xc1,0xc1,0xef, + 0x7e,0xd0,0x62,0x22,0xeb,0xb5,0x21,0x49,0xed,0xd5,0xe7,0x9e,0xff,0x59,0x6f,0xed, + 0x6c,0x6e,0x9b,0x3,0x16,0x4f,0x2e,0x36,0xa6,0x8d,0xdc,0x9e,0x69,0x53,0x91,0x68, + 0x4a,0x86,0xb,0x76,0x8c,0x37,0xd0,0x65,0x8f,0xef,0x70,0xa6,0xdf,0x2,0x0,0x68, + 0x71,0x7e,0xc1,0x83,0x52,0x5d,0x73,0xc8,0x68,0xc,0x61,0xd9,0x18,0x1c,0xe4,0xbe, + 0x2b,0x30,0x7b,0x89,0xe5,0xf9,0xca,0x95,0xd5,0x87,0xed,0x98,0xaf,0x55,0x14,0xb5, + 0x9c,0x14,0xa9,0x5c,0x3f,0x7a,0x43,0x68,0xcf,0xce,0xbf,0xd1,0x93,0x89,0x2d,0xb6, + 0x3a,0x76,0xc7,0xca,0x86,0xcf,0xf7,0x68,0xcd,0x69,0xe7,0xfd,0x7b,0x60,0xd9,0xea, + 0x9,0x91,0x53,0xd8,0x5a,0x3c,0xe6,0x88,0x1,0x21,0x92,0x72,0x50,0x2e,0x2f,0xbf, + 0xab,0xf6,0xcc,0xb,0xfe,0xe4,0x9b,0x3d,0x2f,0x91,0xed,0x89,0x76,0x91,0xf9,0xca, + 0xa5,0x35,0xb6,0xf0,0xbc,0x62,0xe5,0x69,0x8f,0x8e,0xbe,0xfa,0xec,0x3f,0x82,0xf1, + 0xc1,0x5c,0x4f,0x70,0xc7,0xdb,0x9f,0x2c,0x59,0xba,0xee,0x76,0xf3,0x44,0x1,0x7, + 0xab,0xb0,0x68,0x66,0xc5,0x91,0x9,0xb5,0x67,0x5f,0x7a,0x58,0x5f,0xb7,0x71,0xcb, + 0xc0,0x23,0x77,0x7d,0x56,0x8b,0x84,0xbe,0x2,0x0,0xbe,0x2c,0x18,0x7f,0xc0,0x3f, + 0x6b,0xf6,0xbf,0xd6,0x7f,0xfc,0xda,0x77,0x27,0x39,0x68,0xc2,0xea,0x24,0x13,0xc6, + 0x55,0x46,0x8a,0xd2,0xfe,0xc1,0x37,0xcd,0xba,0xe1,0xb,0xdf,0xeb,0xbd,0xe7,0xe7, + 0x1,0x3d,0x99,0xb8,0xc1,0xc4,0xf4,0x54,0xb9,0xb8,0xe4,0xb7,0x75,0x1b,0x37,0xff, + 0x8f,0x15,0xa1,0x6c,0xbc,0xe2,0x96,0xad,0x91,0xdd,0xaf,0xee,0x1a,0x7f,0xf7,0xad, + 0x1f,0x31,0x4d,0x3d,0x2b,0x8b,0xd5,0x31,0xa8,0x94,0x57,0xdc,0xde,0xf0,0xf1,0x6b, + 0xfe,0xa0,0x94,0x55,0xa,0xb5,0xf8,0xa0,0x6a,0x6a,0x11,0x27,0xf,0x66,0x5a,0x51, + 0x33,0x5d,0x33,0xbc,0xe6,0x54,0x2e,0x2e,0x3e,0x6c,0x3c,0x27,0x6e,0x75,0x8b,0x5e, + 0xb9,0xf6,0x6c,0x5b,0x2a,0x9a,0xf4,0x44,0x7c,0x11,0x2f,0xda,0x2d,0x59,0xbe,0x66, + 0xdc,0xf2,0x7c,0xd7,0x9c,0x35,0x6d,0xd7,0xcd,0x9a,0x45,0xd9,0x9a,0x73,0x6,0xcb, + 0xd6,0x9c,0xf3,0x4f,0xe1,0x9d,0xaf,0xfc,0x34,0xf4,0xde,0xee,0x2f,0xe8,0xc9,0xf8, + 0xb5,0xd9,0xac,0xc9,0x29,0x68,0x15,0x27,0x5e,0xff,0x33,0xfe,0x86,0x59,0xf7,0x35, + 0x5c,0xfa,0xc9,0x1d,0x66,0x7e,0x2a,0x40,0x43,0x4b,0x6c,0x26,0x5e,0xdf,0xb3,0xfe, + 0x86,0xa6,0xdf,0x35,0x5c,0x76,0xc3,0x5b,0x76,0xc,0x28,0x30,0x5f,0x56,0xb1,0x62, + 0x4d,0x2b,0xb1,0x21,0xea,0x2c,0x5d,0xbd,0x7e,0x74,0xec,0xad,0x97,0xb7,0x31,0x35, + 0x75,0xa1,0xe1,0x47,0xc6,0x22,0xd7,0x33,0x4d,0xfb,0x85,0xe4,0xf3,0x99,0xbd,0x2b, + 0xc6,0xc9,0x4d,0x74,0x46,0xb2,0x21,0x8a,0x52,0x52,0xa6,0xcd,0xbe,0xf9,0x8b,0xbf, + 0x1c,0x79,0x69,0xeb,0xb3,0x89,0x8e,0xf7,0x6f,0xa6,0x69,0xf5,0x24,0xa6,0x6b,0x8b, + 0x80,0xb1,0x2a,0x3,0x4f,0xba,0x43,0xf2,0x17,0x3f,0xed,0x9f,0x3d,0xe7,0xc9,0xba, + 0xb,0xae,0x7c,0x3f,0x6b,0x66,0xf3,0x6e,0xb5,0xf3,0xfa,0xda,0x3e,0xf8,0x26,0x22, + 0xcb,0xac,0xe5,0xd6,0xaf,0x7e,0x7d,0xe8,0xb9,0x47,0xee,0x4d,0x74,0x1c,0xf9,0x5b, + 0x43,0xa6,0x11,0x69,0x48,0xf6,0xf9,0x9e,0x2f,0x5a,0xb8,0xfc,0x37,0xb5,0x1b,0x2e, + 0xb6,0xa5,0x9b,0x69,0xd9,0xba,0xd,0x83,0xa5,0x27,0x9f,0x7d,0x63,0xef,0x3,0xbf, + 0xbe,0x5e,0x8f,0x84,0x2f,0x67,0x9a,0x7a,0x4a,0x6,0x7e,0x7d,0x30,0x89,0x24,0x91, + 0xe4,0x4e,0xb9,0xac,0xfc,0xde,0x86,0x4b,0xaf,0xfd,0x83,0xa7,0xbc,0xd2,0xd4,0x4d, + 0x6d,0x4c,0xd3,0x8d,0xa3,0x5,0xaf,0xf7,0xb0,0x19,0x7e,0x47,0xde,0x7b,0xb7,0xda, + 0x88,0xa7,0x0,0x0,0x4a,0x4d,0xa3,0xf1,0x98,0xfc,0xea,0x96,0x6e,0x4f,0x65,0x8d, + 0x2d,0x15,0x58,0x7a,0x8a,0x17,0x81,0x29,0x7c,0x25,0x20,0x30,0x5f,0x6f,0x4d,0x5d, + 0xa,0x72,0xc,0xe5,0xeb,0x37,0xf6,0x97,0xaf,0xdf,0xf8,0xcd,0xf0,0xae,0x37,0x7f, + 0x16,0xdc,0xfd,0xd6,0x67,0x69,0x3a,0xb9,0x96,0xe9,0xb4,0x19,0x18,0xad,0xe3,0x78, + 0xbb,0x1f,0x3a,0xe2,0x44,0x52,0xda,0xc0,0xe3,0xd9,0x2f,0x7,0x2,0x6f,0xd4,0x9c, + 0xb6,0xf1,0x99,0xa2,0xf9,0x8b,0x63,0xd9,0x31,0xc2,0x6,0x3,0x42,0x48,0x9c,0x10, + 0xb9,0x7,0x64,0xb9,0x47,0xf2,0x28,0xdd,0x44,0xf1,0xf4,0x2a,0x45,0xc5,0xdd,0x81, + 0xf9,0xb,0xf6,0x96,0xad,0x3d,0x77,0xc8,0x56,0xe2,0x71,0xe6,0x4b,0x24,0xa9,0xc7, + 0xd7,0x32,0xdf,0xb6,0xaa,0x3b,0x5f,0x55,0xd5,0x83,0xc9,0xa1,0x1,0x43,0x3,0xc2, + 0x28,0x9d,0x35,0xf4,0xe4,0x3,0x1f,0x6b,0xdc,0x72,0xf3,0xb6,0xe9,0x36,0x20,0x53, + 0x6d,0x9a,0xfe,0x10,0x0,0xbe,0xc8,0x35,0x4,0x81,0x92,0x5f,0xce,0xfe,0xf4,0xdf, + 0xfc,0xc4,0x2e,0xc2,0x84,0x77,0xbd,0x59,0x17,0xeb,0x68,0x5d,0xf2,0xc1,0xdd,0x11, + 0xb2,0xdf,0x3f,0x28,0x15,0x95,0xe,0x15,0x55,0xd5,0xe,0x94,0x9f,0xb9,0xb1,0xdf, + 0x8e,0x77,0x74,0xdc,0xfe,0xdd,0xdd,0x46,0xb5,0xd4,0xfe,0x86,0x96,0x5b,0x1a,0xb7, + 0xdc,0xf4,0x72,0x26,0x85,0x18,0xeb,0x3e,0x32,0x97,0x46,0xc2,0x2d,0xba,0x9a,0x6c, + 0x0,0x59,0x8e,0xc9,0x5e,0xdf,0x88,0x5c,0x51,0xd1,0x5d,0x77,0xde,0x15,0x7,0xc8, + 0x34,0xe7,0xb5,0x13,0x6d,0x7,0x4b,0x42,0x7,0x76,0xac,0xa2,0xf1,0x44,0xad,0xae, + 0xa6,0xaa,0x81,0x31,0xaf,0xec,0x2f,0xea,0x93,0x3,0xe5,0x3d,0xc5,0xb3,0xe6,0xf4, + 0x96,0xad,0x3b,0x73,0x4,0x10,0x8,0x3b,0x75,0x63,0x2c,0x2a,0x47,0x76,0xbe,0x51, + 0x9f,0x18,0x1b,0x68,0xa6,0xd1,0x58,0xb3,0x9e,0x4e,0x36,0x2,0x0,0x3,0x45,0x89, + 0xc8,0x92,0x12,0x25,0x1e,0x5f,0x58,0x2a,0xe,0x8c,0x56,0x9d,0x7e,0xee,0x61,0x6f, + 0x6d,0x63,0xa,0x29,0x96,0xdf,0xe8,0xbe,0xeb,0xb6,0xeb,0xb4,0x89,0xb1,0x7f,0x13, + 0x78,0xf4,0x31,0x0,0xb8,0xe,0x8c,0x3d,0x5a,0x1,0x3b,0xaf,0x78,0x6c,0x53,0x9a, + 0xe5,0xeb,0xcf,0x19,0x2a,0x5f,0x7f,0xce,0x10,0x0,0xbc,0x32,0x1d,0xc4,0x9,0xef, + 0x78,0xbd,0xd6,0xf0,0x20,0xe,0x0,0x14,0x37,0xce,0x6a,0xcd,0xf4,0x4d,0x65,0x6b, + 0xcf,0x18,0x2d,0x5b,0x7b,0xc6,0x28,0x0,0xbc,0x3b,0x13,0xcc,0x2d,0x5e,0xba,0x32, + 0x52,0xbc,0x74,0xe5,0x6b,0x28,0xe6,0x85,0xd,0xa2,0xaa,0x8e,0xed,0x9f,0x28,0x5e, + 0x9f,0x56,0x79,0xfa,0xc7,0xfa,0x2a,0x1,0xf8,0xf7,0xad,0xab,0x2a,0x32,0x27,0xdf, + 0x41,0xa9,0xc3,0xe7,0x40,0x1c,0x14,0x66,0xab,0x88,0x1d,0x79,0x9f,0xb3,0xd9,0x45, + 0x12,0x15,0xeb,0xcf,0xe9,0xcb,0xa7,0x6f,0x42,0x20,0x10,0x5,0xe0,0x34,0xc8,0x1e, + 0x67,0x74,0x12,0x71,0xb6,0x9d,0x3b,0xc9,0x27,0x26,0xa8,0xd1,0x88,0xe1,0x86,0x2e, + 0x91,0xe4,0x76,0xa2,0x28,0x2c,0xe7,0x98,0x8a,0x40,0x20,0x10,0x8e,0xc0,0xd1,0x93, + 0xe8,0x2c,0xaf,0x94,0x28,0xe3,0xdc,0xb4,0x7,0x8a,0x7c,0x18,0x8d,0x2,0x22,0xe3, + 0xd2,0xc2,0xc8,0x14,0xe1,0xf6,0x48,0x7,0xa8,0x73,0x65,0xbc,0x8c,0x32,0x92,0x4f, + 0x8b,0x8a,0x6a,0xbc,0x33,0x9,0xde,0x56,0x54,0x12,0x8,0x4,0x2,0x0,0x20,0xa1, + 0x14,0xa4,0x33,0xe9,0xe8,0x1e,0x88,0x94,0x4f,0x4c,0x65,0xba,0x6e,0x5c,0x6e,0x57, + 0x5c,0xdc,0x5a,0xa0,0x42,0x83,0x40,0x20,0x10,0x60,0xe2,0x24,0xba,0x3d,0xad,0x4c, + 0xf2,0x45,0xe1,0x46,0xdf,0xd9,0x5e,0xc3,0x3b,0x93,0xe0,0xab,0xa8,0x6b,0x45,0x1, + 0xca,0x4d,0x48,0x4a,0x1a,0xd,0x3b,0x2,0x31,0xed,0xf6,0x83,0x3a,0xb9,0x89,0xce, + 0x48,0xbe,0x2c,0xec,0x58,0xd7,0x41,0x5e,0x57,0x58,0xb5,0xec,0xec,0x73,0x3a,0x50, + 0x51,0x21,0x10,0x39,0xa0,0xc7,0xd2,0x5e,0x5c,0x87,0x33,0x1,0x5d,0x72,0xb0,0x17, + 0x16,0xcd,0x1f,0x46,0xd3,0x98,0x71,0xf,0x2c,0x90,0xa4,0x4e,0x6f,0x51,0x9d,0xa, + 0x69,0x94,0x21,0x4,0x2,0x51,0xb0,0x70,0xf8,0x4a,0xdb,0x3c,0x1,0x4d,0xa5,0x38, + 0x25,0xbc,0xca,0x61,0x94,0x9d,0x13,0x68,0xe2,0xc1,0x68,0xc,0x81,0x28,0xac,0x45, + 0x4f,0x1d,0xbd,0xd2,0x36,0x6f,0x94,0xc,0xd3,0x35,0xe3,0x3e,0x47,0x1e,0xf9,0x30, + 0x2a,0x4c,0x4,0x2,0x40,0x4a,0x61,0xfa,0x8,0x23,0x10,0x47,0x22,0x10,0x26,0xe5, + 0x8b,0xb0,0x31,0xca,0x6b,0x14,0xe8,0x3f,0x8c,0xb,0x7,0x81,0x40,0x14,0x5c,0xd0, + 0xe1,0x49,0x1d,0xa3,0xf7,0x28,0x9e,0x44,0x3f,0x11,0xc1,0xb7,0xb7,0x55,0x3,0x63, + 0xd5,0x86,0x6,0xa4,0xa4,0xb2,0x35,0x77,0x99,0x8a,0x40,0x20,0x10,0x4e,0x40,0x76, + 0xf8,0x24,0x7a,0x1e,0x28,0xba,0x48,0x5f,0x1b,0xaf,0x2,0x8b,0x55,0xad,0x5d,0xd7, + 0x8a,0x4a,0x1b,0x31,0x53,0x90,0x52,0x3e,0x94,0x3d,0xc4,0xcc,0x83,0x3a,0x99,0xc2, + 0xa2,0x40,0xf2,0x41,0xf0,0xe7,0x5e,0xf1,0xf9,0xd7,0x0,0xa0,0x96,0xfb,0x20,0x36, + 0xa3,0x46,0x20,0x10,0x4e,0x39,0xd,0x39,0xe9,0xb0,0x52,0x5d,0x74,0xfa,0x36,0x44, + 0x20,0xf9,0xd5,0x4c,0x31,0x7f,0x99,0x8a,0x40,0x20,0x10,0x8e,0xc0,0xd9,0x76,0xee, + 0xa8,0x70,0x11,0xf9,0x8c,0xa8,0x17,0x53,0x47,0x8,0xc4,0x87,0xf1,0x7,0xb1,0xc7, + 0x80,0x8,0xee,0xc4,0x33,0x9,0x17,0x20,0x2,0x81,0xc8,0x17,0x48,0xc9,0x24,0xea, + 0x2b,0x63,0x13,0xe2,0x68,0x15,0x16,0x32,0x17,0x81,0x40,0x20,0xdc,0x3,0x47,0xab, + 0xb0,0x8,0x2a,0x7d,0x44,0xd6,0xe,0x83,0xcf,0x8f,0xb2,0x83,0x40,0x14,0xae,0x1, + 0x1,0x82,0x4a,0x0,0x81,0x40,0x8,0x39,0xc,0x71,0xd4,0x15,0x39,0xf,0x9d,0x79, + 0x4,0x9f,0x54,0x8d,0xc,0x88,0x58,0x29,0x17,0x5,0x5,0x85,0x2,0x81,0x40,0x20, + 0x5c,0x12,0x7e,0x50,0x56,0x26,0xf8,0x68,0xd4,0xc8,0x80,0x44,0xc5,0x62,0x1d,0x16, + 0x40,0x92,0xe7,0x1b,0x26,0x90,0x4,0x8,0x4,0x62,0x6a,0x68,0xa9,0x39,0x82,0x4f, + 0x6,0x8d,0xc,0x48,0x58,0xcc,0x5a,0xe9,0xb3,0x50,0x21,0x21,0x10,0xb9,0xf,0xc9, + 0x57,0x84,0x99,0x2,0x84,0x80,0x4e,0xa7,0x6b,0x4,0x1f,0xed,0x30,0x32,0x20,0x3d, + 0x62,0x6f,0x63,0x8b,0x92,0x3,0xdd,0x9e,0xe2,0xb9,0x4b,0xf0,0x16,0xd,0x4,0x2, + 0x81,0xc8,0x11,0xc8,0xb1,0xb8,0x69,0x87,0x61,0x7c,0xef,0xdb,0x1,0xa6,0xeb,0x6b, + 0x5,0x1f,0x6f,0x35,0x32,0x20,0x87,0x4,0x7,0xf1,0xf,0xbd,0xbc,0xf5,0xd4,0x79, + 0x73,0x97,0xbc,0x8a,0x2c,0x9b,0x1e,0xa6,0x22,0x10,0x8,0x84,0x13,0x18,0xdf,0xfb, + 0xf6,0xe5,0x0,0xe0,0x17,0x7c,0x7c,0x97,0x91,0x1,0x19,0x3,0x80,0x7e,0x0,0x68, + 0xe2,0x6,0x21,0xb1,0xf0,0x95,0x72,0x2c,0xbe,0x1d,0xc9,0x8f,0x40,0x1c,0xf,0xc5, + 0x5f,0x8c,0xe,0x3,0x22,0x2f,0xa0,0x25,0xe3,0x44,0x4f,0x25,0xbe,0x20,0xf8,0x78, + 0x3f,0x0,0x1c,0x36,0x32,0x20,0x0,0x0,0xdb,0x1,0xe0,0x5a,0xde,0x48,0x54,0xd7, + 0xaf,0x1e,0x79,0xfb,0xc5,0x7f,0x6f,0x3c,0x77,0x33,0x6e,0x86,0x20,0x10,0x88,0x82, + 0xc6,0x68,0x24,0x9a,0x97,0x4e,0xc3,0xe8,0x83,0x3f,0xdb,0x2,0x8c,0x9d,0x24,0xf8, + 0xf8,0xb3,0xc7,0x39,0x4a,0x19,0x1e,0xda,0x26,0x62,0x40,0x0,0x20,0x10,0x3c,0xb8, + 0xe7,0x4b,0x8d,0xe7,0x6e,0xfe,0x36,0x32,0x15,0x81,0x40,0x20,0xf2,0xb,0xe1,0xd7, + 0x9e,0xa9,0xd6,0x93,0xc9,0x7f,0x33,0xf1,0x93,0x7,0x8f,0xfd,0x1f,0x99,0x3a,0xea, + 0x56,0xc2,0xe4,0x4e,0xbb,0x4f,0x60,0xc0,0xb4,0xa7,0xac,0xfa,0x82,0xaa,0x2b,0x3e, + 0x73,0x0,0xd9,0x81,0x98,0x69,0xc8,0x45,0x25,0xe8,0x30,0x20,0x10,0x2,0x48,0x1c, + 0xd9,0xef,0x99,0x78,0xe1,0xa1,0x7,0x81,0xb1,0x73,0x4,0x7f,0xd2,0x7,0x0,0x4b, + 0xe0,0x98,0xb3,0x82,0x99,0x22,0x90,0x9,0x0,0x78,0x6,0x0,0xae,0x14,0x18,0xd4, + 0xab,0x46,0xc6,0xef,0x88,0xee,0xda,0x7e,0x61,0xf9,0x99,0x97,0x44,0x90,0x2d,0x8, + 0x4,0xc2,0x29,0x48,0x81,0x10,0x3a,0xc,0x59,0x20,0x7e,0xf0,0xa0,0x67,0x62,0xdb, + 0x9f,0x7f,0x65,0xc2,0x78,0x0,0x0,0xdc,0x6,0x27,0x1c,0x34,0x37,0xba,0xd3,0xe3, + 0xc,0x98,0x4c,0x65,0x89,0x81,0x90,0xed,0x15,0x1b,0xae,0xf8,0x64,0xf1,0xe2,0x93, + 0xd3,0xc8,0x5c,0x4,0x2,0x81,0xc8,0x4d,0x8c,0x6f,0xdd,0x5a,0x11,0x3f,0x78,0xf0, + 0x37,0xc0,0xd8,0x79,0x26,0x7e,0x36,0x6,0x0,0x4b,0xe1,0x84,0x83,0xe6,0xbc,0x4b, + 0xa1,0xb6,0x2,0xc0,0x6,0x33,0x46,0xa4,0x68,0xd1,0xa2,0xcf,0x54,0x6f,0xde,0x3c, + 0x8e,0x6c,0x2a,0x3c,0x28,0x13,0xe5,0xe8,0x30,0x20,0x10,0x39,0x8c,0x9e,0xfb,0x7f, + 0x70,0xa1,0x9e,0x8a,0xff,0x18,0x0,0x66,0x99,0xfc,0xe9,0x97,0x1,0xe0,0xd7,0x1f, + 0x51,0xf9,0x9c,0x1f,0x9d,0x9,0x0,0xcf,0x83,0xb9,0xdb,0x7,0x7,0x64,0x5f,0xf1, + 0x17,0x67,0x5f,0xff,0xb5,0x6d,0xc8,0x2e,0x4,0xc2,0xc5,0xe,0x43,0xe9,0x18,0x3a, + 0xc,0x79,0x80,0x78,0x67,0xa7,0x3c,0xf4,0xec,0xb3,0xe7,0xe9,0xe9,0xf4,0x5f,0x1, + 0x63,0x1b,0xb3,0x18,0x62,0x37,0x0,0x9c,0xd,0x53,0xf4,0x49,0x14,0x31,0xc,0xbf, + 0x4,0x80,0x5b,0x4c,0xbf,0x52,0x92,0x1e,0xf3,0xf8,0xfd,0xff,0x35,0xe7,0xd6,0x5b, + 0xf7,0x22,0xb,0x11,0x8,0x4,0x22,0xb3,0x82,0xf,0xed,0xdb,0x57,0x6a,0xc7,0x58, + 0x34,0x9d,0xf6,0xe8,0xf1,0x78,0x25,0x4d,0x24,0x2a,0x99,0xae,0x2f,0xd1,0x75,0xfd, + 0x14,0xa0,0x74,0x13,0x0,0xd4,0x65,0x3b,0x3d,0x0,0x38,0x7,0x0,0xa6,0x2c,0x92, + 0x12,0x31,0x20,0x15,0x0,0xf0,0x36,0x0,0xcc,0xce,0xea,0xf5,0x84,0xbc,0x27,0xc9, + 0xf2,0xe3,0x92,0xa2,0xbc,0xea,0x6b,0x6c,0x3c,0xd8,0x78,0xe9,0xa5,0xc1,0x5c,0x65, + 0x64,0x68,0xef,0x5e,0x4f,0xbc,0xab,0xcb,0x96,0x26,0x91,0x4c,0xd3,0x64,0x3d,0x91, + 0xb0,0x45,0x28,0x18,0xa5,0x32,0x33,0x1e,0xcb,0x8c,0x27,0x48,0x98,0x4a,0xcb,0xed, + 0xa2,0x19,0x63,0xac,0xc2,0x3e,0xe,0xb0,0xa,0xc6,0x4c,0x45,0xbb,0x46,0x63,0x95, + 0x2,0x80,0x64,0xcb,0xa2,0x4,0x5a,0xa,0x99,0xb,0x4e,0xcc,0x22,0x60,0xf3,0x58, + 0x5e,0x9b,0x18,0xe9,0x7,0xf1,0x93,0xc8,0x9c,0xb1,0xc0,0x7,0x0,0x45,0x36,0x7d, + 0xa3,0x17,0x80,0x15,0xdb,0x37,0x16,0xd8,0x35,0x96,0xc,0x0,0xa5,0xe0,0x7e,0xfc, + 0x5,0x0,0xdc,0x95,0x51,0x99,0xfc,0xff,0xf6,0xce,0x3c,0x46,0x8a,0x2a,0x88,0xc3, + 0x1f,0xae,0x80,0xe0,0x1a,0x11,0x2f,0x8c,0x1a,0x45,0xd,0x6,0x45,0x5,0x3c,0x23, + 0x41,0x89,0x27,0x1e,0x88,0x82,0x17,0xae,0xac,0x92,0xac,0xa,0xd1,0x78,0x4,0x3c, + 0x50,0xd0,0xa0,0x89,0x26,0x5e,0x91,0x98,0x60,0x34,0x10,0xf,0x30,0xa8,0xa8,0x78, + 0x13,0x45,0x45,0x51,0xe2,0x85,0x17,0xca,0x11,0x51,0xe2,0x11,0x9,0xa2,0x20,0x88, + 0x2b,0x82,0xec,0xae,0x7f,0x54,0x75,0x6c,0x9b,0x9e,0xe9,0x9e,0x99,0xde,0xd9,0x9d, + 0xdd,0xdf,0x97,0x74,0x76,0xbb,0xdf,0xf4,0xeb,0xd7,0x35,0x3d,0x55,0xef,0x55,0xd5, + 0x7b,0x9d,0xb2,0x92,0x63,0xb0,0x9,0x24,0x1d,0x33,0x68,0xd0,0x16,0x52,0xae,0xf8, + 0xdb,0x2,0xf,0x85,0x10,0x42,0x8,0xe3,0x1e,0xe0,0xd6,0xbc,0xbd,0xd1,0x2,0x2d, + 0xd1,0x3,0x92,0xa9,0x10,0x42,0xb4,0x79,0x9e,0x0,0x46,0x93,0xe0,0xdd,0xa8,0x2a, + 0xa0,0xc2,0x4f,0xfd,0xef,0x71,0x92,0xad,0x10,0x42,0xb4,0x59,0xee,0x3,0xc6,0x92, + 0xc2,0x35,0x5e,0x55,0x60,0xc5,0xef,0x1,0x1b,0x81,0x13,0xa,0x1c,0xbd,0x8,0x21, + 0x84,0x68,0xdd,0x6c,0x6,0xc6,0x1,0x77,0xa7,0x3d,0xa1,0xaa,0x88,0x8b,0x7c,0x80, + 0x2d,0x73,0x72,0x2a,0xd9,0x5,0x3,0x85,0x10,0x42,0xb4,0x1c,0xcb,0x80,0x61,0xc0, + 0xcb,0x85,0x9c,0x54,0xca,0x28,0xe2,0x50,0x60,0x3a,0xd0,0x4b,0xb2,0x17,0x42,0x88, + 0x8a,0x64,0x23,0x70,0x17,0x30,0xd9,0x47,0x20,0x5,0x51,0x55,0xc2,0x85,0x7f,0x1, + 0x1e,0xc7,0xfc,0x64,0x47,0x6a,0x34,0x22,0x84,0x10,0x15,0xc3,0x1f,0xc0,0x43,0xc0, + 0x28,0x6c,0xc5,0x91,0x86,0x62,0x2a,0xc9,0x2a,0x8e,0xb1,0x2f,0x70,0x3d,0x30,0x92, + 0x6c,0x52,0x7d,0x85,0x10,0x42,0x64,0x4b,0x3,0x30,0x1f,0xf3,0x1c,0xbd,0x4,0xd4, + 0x97,0x5a,0x61,0xd6,0x81,0xf0,0x3d,0x81,0xe1,0x40,0xd,0xe6,0xe2,0x12,0x42,0x8, + 0x51,0x3e,0x9a,0x80,0xf5,0xc0,0x6,0xe0,0x37,0x60,0x85,0x6f,0x1f,0x2,0xb,0xbc, + 0x2c,0x33,0x9a,0x33,0x93,0xaa,0xf,0x30,0x8,0x38,0xa,0x5b,0x43,0xfe,0x40,0xd2, + 0xbd,0x5f,0xa4,0x2d,0x59,0xfb,0xac,0x96,0xb7,0x6f,0xcc,0xf0,0x8b,0x6f,0xca,0xf8, + 0x21,0x5a,0x47,0x61,0x33,0xe1,0x93,0x86,0xd5,0x8d,0x19,0xd6,0xd5,0x90,0x51,0x5d, + 0xf5,0xc0,0x3f,0x19,0xd6,0xb5,0x39,0xa3,0xba,0x36,0x2,0x9b,0x32,0xac,0xeb,0xef, + 0x8c,0xea,0xda,0x8c,0x2d,0x81,0x91,0x55,0x5d,0xf5,0x19,0xd5,0x95,0xe5,0x24,0xe6, + 0x6,0x7f,0xc6,0x5a,0xe3,0x6f,0xb2,0x6c,0x94,0x3b,0x15,0xb7,0x1a,0x5b,0x1a,0x25, + 0x4b,0x37,0x57,0x6b,0x7d,0xc0,0x84,0x10,0x42,0x8,0x21,0x84,0x10,0x42,0x8,0x21, + 0x9a,0x87,0x6e,0x98,0x3b,0xaa,0xd0,0x2d,0xec,0xf5,0x78,0x3f,0x74,0x7c,0x41,0xc2, + 0xf5,0x7a,0x45,0xea,0xa9,0x2b,0xf7,0xd,0x2b,0xf5,0x56,0x8,0x21,0xb2,0x61,0xb, + 0xf0,0x51,0xcc,0xf1,0xae,0xc0,0x21,0xfe,0xff,0x42,0xb6,0x8e,0xcd,0xe5,0x8a,0x17, + 0x1d,0x8b,0xbd,0x5,0x70,0x59,0x8e,0xf2,0x3a,0x89,0x5c,0x8,0x21,0xda,0x36,0x7d, + 0x43,0xa3,0x84,0xa4,0xd7,0x1f,0x4,0x23,0x90,0x8f,0xfd,0xef,0x3d,0x39,0x3e,0xd7, + 0x11,0x58,0x85,0x5,0xf2,0x97,0xb6,0xd4,0x8,0x64,0x1b,0x7d,0xb7,0x42,0x8,0xd1, + 0xea,0x78,0x1a,0xcb,0xe2,0xac,0x25,0x3e,0xe9,0x68,0x8,0xb0,0x3b,0x30,0x93,0xec, + 0x92,0x88,0x2a,0xc2,0x80,0x54,0x1,0x37,0x1,0xaf,0x2,0x73,0xfc,0xef,0x55,0x29, + 0xcf,0xbd,0x5,0x7b,0xbd,0xe2,0x6,0x60,0x2e,0x30,0x86,0xad,0x67,0xd3,0x8f,0x5, + 0x96,0xbb,0x75,0x9e,0x12,0x11,0x7e,0xbe,0x32,0x30,0x9f,0xe2,0x6b,0xd8,0xb,0xe4, + 0x57,0x3,0xf7,0xa7,0x68,0xd3,0xcd,0x6e,0xfd,0x87,0xc5,0x94,0xbd,0x49,0xbc,0xcf, + 0xf3,0x18,0x2f,0x9f,0x1a,0x53,0x56,0x17,0x39,0xff,0xde,0xd0,0x7e,0x67,0xe0,0x15, + 0x60,0x11,0xb0,0x6b,0x19,0xe4,0x75,0x1e,0xf0,0xb6,0x9f,0x1f,0x97,0x9d,0x96,0x54, + 0x1e,0x27,0x8f,0x7c,0xf7,0xf3,0x6,0x30,0x2d,0xc7,0xb9,0xb,0x22,0xdf,0x47,0xae, + 0x76,0xf7,0x0,0x6e,0x73,0x57,0x41,0x3d,0xf6,0x26,0xb5,0x7b,0xa5,0x8f,0x44,0x85, + 0x51,0xf,0x3c,0x85,0xbd,0x49,0xf0,0xcc,0x98,0xf2,0x40,0x4f,0x4c,0x6b,0x4f,0x42, + 0xe9,0x8,0xcc,0x6,0x2e,0x88,0x1c,0xbf,0xc,0x98,0x41,0x72,0x5a,0xf1,0x67,0xc0, + 0x95,0xc0,0xf1,0xc0,0x78,0x57,0x5a,0x61,0xc5,0x7d,0x9,0x96,0xd6,0x7b,0xbb,0xff, + 0xbf,0x6,0x78,0x30,0x45,0x19,0x40,0x4f,0x60,0xad,0x2b,0xb1,0xf3,0xb0,0x39,0x2c, + 0x35,0x29,0xee,0x69,0x9,0xb6,0xd4,0xfd,0xf3,0x39,0x14,0xe6,0xe3,0x3e,0x84,0xd, + 0x6f,0x5d,0x43,0x6,0xe4,0xc9,0x48,0x59,0xf7,0x1c,0xa,0x37,0x50,0xb6,0x5f,0x2, + 0xbb,0xa4,0x94,0x77,0x29,0xf2,0xa,0xca,0xc7,0x3,0x77,0xe4,0x30,0x10,0x49,0xe5, + 0xf9,0xc,0x48,0xdc,0xfd,0xd4,0x2,0xbf,0xb3,0xf5,0x7c,0xa1,0x9e,0x6e,0x5c,0xfb, + 0xa7,0x68,0xf7,0x23,0xc0,0x27,0xc0,0x85,0xc0,0x61,0xc0,0xb9,0x7e,0x4c,0x88,0x96, + 0xa2,0x18,0x17,0xd6,0x68,0x6c,0xe,0x5d,0x93,0x77,0xb2,0xc3,0xec,0x85,0xc5,0x51, + 0x16,0xf9,0xfe,0x42,0x5a,0xc8,0x85,0x55,0x6e,0x26,0x62,0xab,0xf8,0xf6,0xf1,0x5e, + 0xe3,0x62,0x17,0xc2,0x0,0xe0,0x62,0x17,0x5a,0x21,0x4c,0x71,0xa5,0x14,0xf0,0x71, + 0xa4,0x97,0x7a,0xbe,0xf7,0x8e,0xab,0x13,0xca,0x2,0x65,0xfe,0x76,0x81,0xd7,0x3f, + 0xdc,0x15,0xde,0x41,0xd8,0x44,0xac,0x6e,0x9,0x3d,0xee,0x28,0x53,0xc9,0xff,0x92, + 0xae,0xe0,0xfc,0x62,0x8c,0x47,0xa9,0xf2,0xa,0x73,0x76,0x82,0x81,0x48,0x2a,0x4f, + 0x7b,0x3f,0xd5,0xde,0xf3,0x1a,0x16,0x33,0x92,0x5a,0x92,0xa2,0xdd,0x3d,0xb0,0x80, + 0xe4,0x89,0xd2,0x59,0xa2,0xd,0x18,0x10,0x5c,0x3f,0x6e,0xc1,0x56,0xf9,0x8,0xb8, + 0xd5,0x3f,0x73,0x4d,0x4b,0x1b,0x90,0x72,0xba,0xb0,0x3a,0x60,0x99,0x8,0xaf,0x7b, + 0xaf,0x7c,0xbe,0xef,0xf7,0x77,0x43,0x32,0xa3,0x88,0x1f,0xfe,0xa6,0xc8,0xbd,0xf4, + 0x7,0xbe,0xa,0x1d,0xfb,0xda,0x95,0xd2,0xc1,0x79,0xca,0x7a,0xfb,0xfe,0x19,0xfe, + 0x65,0xcd,0xc5,0xb2,0x1e,0x6e,0x4c,0xa1,0xac,0x47,0x2,0xb3,0x5c,0xb9,0x2d,0x74, + 0x45,0x56,0x28,0xb5,0xd8,0x2c,0xd4,0x67,0x7d,0xa8,0x1a,0x75,0x31,0x75,0x6,0x9e, + 0xf3,0x5e,0xc7,0x9,0xd8,0xf2,0x4,0xc5,0x92,0x56,0x5e,0xbd,0x9b,0xf1,0x39,0xc8, + 0x77,0x3f,0x7f,0x2,0x2f,0xc4,0x8c,0xfc,0x2e,0xf2,0xe7,0x23,0xa9,0xdd,0x7b,0x3, + 0x3f,0x3,0x27,0xd1,0xbe,0x56,0x3d,0x10,0x6d,0x97,0xa9,0xae,0x13,0x2e,0xd,0xe9, + 0xd1,0x51,0xfe,0x5b,0x9e,0xde,0x9e,0x4,0xd1,0xd3,0x5d,0x1d,0xbd,0x81,0x6f,0xf2, + 0xf4,0x90,0xd3,0xbe,0xa8,0x7e,0x7f,0xef,0x75,0x6,0xfe,0xc1,0x1e,0xfc,0xb7,0x32, + 0x70,0xc0,0xb6,0x2e,0xe8,0x2b,0xf2,0x94,0xd,0x5,0xba,0xf0,0xdf,0x72,0x2,0x93, + 0x80,0xd3,0xb0,0x97,0x67,0xcd,0xcb,0x73,0xfd,0x2a,0xcc,0xff,0x3e,0xd0,0xf7,0x2f, + 0x77,0xa3,0x18,0xed,0x71,0xc7,0xc5,0x40,0xb6,0xf3,0xf2,0x11,0x7e,0xfd,0x81,0x3e, + 0x12,0xf9,0xd3,0xd,0x4a,0xf8,0xfc,0x4d,0xee,0xa2,0xd9,0xb9,0x44,0xf9,0x17,0x22, + 0xaf,0xa1,0xcd,0x38,0x2,0x49,0xba,0x9f,0xc1,0xd8,0x92,0x1a,0x3b,0x86,0x7a,0x6f, + 0x8d,0xc0,0x3e,0x29,0xdb,0x7d,0xe,0xb6,0xf6,0xcf,0x3a,0x37,0xca,0x27,0x4b,0x7, + 0x89,0xa,0x1e,0x81,0x74,0xf7,0xdf,0xc3,0x77,0x6e,0x3c,0x4e,0xf1,0xf2,0xa7,0x42, + 0xe7,0xb4,0x8b,0x11,0x48,0xb8,0x17,0xdc,0x89,0xf8,0x78,0x47,0x13,0xe9,0x96,0x57, + 0xe9,0xee,0x3d,0xd5,0xc7,0xdc,0x15,0x92,0x95,0x1c,0xde,0xc5,0x2,0xb0,0x73,0xfc, + 0xb,0x1c,0x48,0xee,0x60,0xf5,0xc9,0xee,0x2e,0x79,0xdf,0xf7,0x9f,0x1,0x8e,0x8, + 0x29,0xba,0x80,0x27,0x80,0x7e,0x91,0x2d,0x18,0x9,0xcc,0x4,0x5e,0x74,0x63,0x75, + 0x2d,0x16,0x10,0x1b,0x19,0xf3,0x40,0x75,0xc2,0x82,0xc6,0xc5,0x92,0xb5,0xbc,0x4a, + 0x21,0xe9,0x7e,0xe6,0xba,0xf2,0x1f,0xee,0xfb,0x35,0x7e,0xce,0xf,0x29,0xeb,0x9f, + 0xd,0x1c,0xe0,0xc6,0x79,0xa5,0x8f,0x10,0xe7,0x4b,0x87,0x89,0xa,0x65,0x2d,0x16, + 0x5f,0xdd,0xf,0x8b,0xcb,0xd6,0x85,0x46,0x26,0x2d,0x4e,0x39,0xd,0xc8,0xf7,0xd8, + 0xa4,0x98,0x15,0xee,0x66,0xb8,0x1a,0xd8,0x1e,0xb,0x28,0xef,0xe6,0x9f,0xd9,0x95, + 0xe4,0x5,0xca,0x76,0xc0,0xd6,0xaf,0x5f,0xe4,0x75,0x4,0xac,0xc6,0x2,0x4b,0x7d, + 0x42,0xc7,0x7a,0xb9,0xb2,0xfa,0x22,0x4f,0xd9,0x4a,0xcc,0xef,0xbe,0x1,0x5b,0xb1, + 0x32,0x60,0xb1,0x1b,0x88,0x81,0x79,0xdc,0x57,0xfb,0x62,0x8b,0xec,0x6d,0x71,0x57, + 0x4c,0x97,0x18,0xf7,0xcb,0xaf,0x7e,0xfd,0xf0,0x96,0x6b,0xf1,0xc1,0x39,0x58,0xc0, + 0xbb,0x53,0xe8,0xd8,0xe7,0xc0,0x59,0xc0,0x75,0xc0,0xd,0x45,0xc8,0xbd,0x18,0x79, + 0xad,0x6c,0xc6,0xe7,0x20,0xe9,0x7e,0x1a,0xbc,0x77,0x55,0xe3,0xcf,0xe7,0x88,0x90, + 0xfb,0x2a,0x6d,0xbb,0x1b,0x5d,0x96,0x57,0xbb,0xc1,0x1e,0xe0,0x9b,0x10,0x95,0xea, + 0xc6,0xc2,0x7f,0x2f,0x43,0xb1,0x37,0xc2,0xbe,0xd5,0x1a,0x1a,0x56,0xce,0x99,0xe8, + 0x4d,0xae,0x94,0x4f,0x71,0xa5,0x30,0xa,0x78,0xc7,0x87,0x67,0xd7,0x60,0x7e,0xeb, + 0xa4,0x9e,0x62,0x17,0xef,0x41,0xaf,0xc2,0xb2,0x6f,0xc2,0x8a,0xb8,0x11,0xcb,0x3a, + 0x3a,0x24,0x74,0xac,0x8f,0xbb,0x56,0x16,0xe7,0x29,0x5b,0xea,0xfb,0x1f,0x61,0x59, + 0xf,0x1,0xbd,0xdd,0xb8,0xbd,0x17,0xd3,0x8e,0x6a,0x77,0xdb,0xc,0x3,0xbe,0x8d, + 0x8c,0x4a,0xea,0x80,0x3b,0x8b,0x94,0xd1,0xe9,0x98,0xdb,0x2c,0xba,0x5a,0xeb,0x3c, + 0x2c,0xbe,0xf2,0x1c,0xe6,0x66,0x7b,0x38,0x65,0x7d,0xc5,0xca,0x6b,0x69,0x33,0x3f, + 0xb,0x49,0xf7,0x33,0x1d,0xb,0x94,0x8f,0xc0,0xe2,0x50,0xb3,0x4a,0x68,0xf7,0x1a, + 0xef,0x8,0xec,0x21,0x3d,0x24,0x2a,0x94,0x79,0xde,0xf1,0x1e,0xec,0xfb,0x8f,0x92, + 0xdd,0xa,0xd8,0x15,0x45,0x27,0x77,0x31,0x44,0x83,0xcd,0x75,0x24,0xa7,0xf1,0x6e, + 0xe3,0x3d,0xe9,0xe5,0xd8,0x3c,0x8a,0x20,0xed,0x35,0xdc,0x13,0xd,0xd2,0x3b,0x27, + 0x61,0xb1,0x84,0xb8,0x34,0xde,0xb8,0x32,0xb0,0xd8,0xc0,0x5f,0xd8,0x1c,0x95,0x41, + 0x58,0x46,0xd6,0xdc,0x1c,0x6d,0xa9,0x5,0x7e,0x8a,0x39,0xbe,0x93,0x8f,0x48,0x82, + 0x74,0xd3,0x5c,0x69,0xbc,0xdd,0x42,0x8a,0xf2,0x2c,0xbf,0xde,0x64,0x57,0x82,0xe1, + 0x11,0x4c,0x34,0x8b,0xab,0xc6,0xeb,0xbf,0x30,0x74,0xec,0x8,0xe2,0xd3,0x8d,0x4b, + 0x95,0x57,0xe0,0xfa,0xea,0xeb,0xa3,0x85,0xbf,0x42,0x75,0x74,0x48,0x59,0x1e,0x25, + 0xcd,0xfd,0x4,0x2c,0xc1,0x32,0xdc,0xe2,0xd2,0xa3,0x73,0xb5,0x7b,0x4f,0xef,0x94, + 0xd4,0xfa,0x77,0x30,0xc4,0x8d,0xd4,0x8f,0x68,0xd9,0x1e,0xd1,0x72,0x94,0x12,0x3, + 0x9,0x18,0xe7,0x5e,0x8e,0xd5,0x58,0x2,0x4a,0x98,0x76,0x93,0xc6,0xb,0x16,0x7c, + 0x9e,0xe0,0xca,0x2d,0xd8,0xae,0x25,0x39,0xf6,0x51,0x4d,0x7c,0x40,0x3a,0x9a,0x95, + 0x34,0xd6,0x47,0x5,0xab,0xb0,0x57,0x36,0x76,0x4c,0x59,0x86,0x8f,0x8a,0x16,0x63, + 0xfe,0xf6,0x9,0x21,0xd7,0x5a,0x94,0x1,0xb1,0x12,0x97,0x0,0x0,0x0,0x8a,0x49, + 0x44,0x41,0x54,0x37,0xb0,0x80,0x7f,0xae,0xde,0xc2,0xfd,0x21,0x85,0x19,0xd7,0xe6, + 0x40,0x61,0xce,0xf6,0xb6,0xac,0xc7,0xe2,0x21,0x67,0x47,0x14,0x5d,0x5c,0x1a,0xf0, + 0x18,0x57,0x9e,0x41,0x30,0x7c,0xa2,0xb7,0xb9,0x39,0xe4,0x55,0x47,0xfe,0x24,0x80, + 0xa4,0xf2,0x24,0x3,0x12,0x77,0x3f,0x1,0xf9,0x26,0x68,0xe6,0x6a,0x77,0x57,0xe0, + 0x6e,0x2c,0x43,0xab,0xde,0xe5,0x32,0x19,0x38,0x5a,0x3a,0x4c,0x54,0xb8,0x1,0xc9, + 0x47,0xbb,0x32,0x20,0x22,0x5b,0x66,0x7a,0x4f,0x5c,0x8,0x21,0x3,0x52,0x56,0xb4, + 0x16,0x56,0xe5,0xd3,0x8f,0xff,0xbb,0x9d,0x84,0x10,0x42,0x8,0x21,0x84,0x10,0x42, + 0x8,0x21,0x84,0x10,0x42,0x8,0x21,0x84,0x10,0x42,0x8,0x21,0x84,0x10,0x42,0x8, + 0x21,0x84,0x10,0x42,0x8,0xd1,0x36,0xf9,0x17,0x6,0xc,0xad,0x73,0x6f,0xe3,0xc1, + 0x6c,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/rightBottom.png + 0x0,0x0,0x0,0xc8, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x18,0x8,0x6,0x0,0x0,0x0,0xc7,0xd9,0xbc,0x10, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x5d,0x49,0x44,0x41,0x54,0x38,0x4f,0x63,0x8c,0x8c,0x4f, + 0xf9,0xcf,0x0,0x4,0x8f,0xef,0xde,0x0,0x51,0x70,0x20,0xab,0xac,0xc1,0xb0,0x7c, + 0xe1,0x1c,0x6,0xa6,0x47,0x8f,0x1e,0x62,0x48,0x22,0x2b,0x64,0x42,0xd1,0x6,0xe5, + 0xfc,0x67,0xe5,0x86,0xb,0x33,0x31,0xfe,0xfe,0x8e,0xa1,0x86,0xf1,0xf7,0x57,0x84, + 0x2,0x6c,0x26,0x10,0xb4,0x62,0x54,0x1,0x66,0xb0,0x61,0x8d,0x8b,0x41,0x17,0x50, + 0xff,0x59,0x39,0x31,0x9c,0x8e,0x92,0x60,0x68,0x9f,0x1e,0x58,0xe4,0xe4,0xe4,0xf1, + 0xda,0x2,0x0,0x96,0x98,0x13,0xd8,0xa8,0x8c,0x27,0xa5,0x0,0x0,0x0,0x0,0x49, + 0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/leftTop.png + 0x0,0x0,0x0,0xa2, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x8,0x0,0x0,0x0,0x8,0x8,0x6,0x0,0x0,0x0,0xc4,0xf,0xbe,0x8b, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x37,0x49,0x44,0x41,0x54,0x28,0x53,0x63,0x64,0x60,0x60, + 0xf8,0x1f,0x19,0x9f,0x2,0xa4,0xb0,0x3,0x46,0x98,0x82,0xc7,0x77,0x6f,0x60,0xa8, + 0xf8,0xcf,0xca,0xc9,0xc0,0x4,0x13,0xfd,0xcf,0xca,0x8d,0xd5,0x8,0xb8,0x2,0x5c, + 0x56,0xc,0xa4,0x2,0x59,0x65,0xd,0x6,0x39,0x39,0x79,0x6,0x0,0xe2,0xe4,0x9, + 0xbc,0x34,0xec,0xd6,0x3d,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60, + 0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/hide_high.png + 0x0,0x0,0x1,0x8a, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x1f,0x49,0x44,0x41,0x54,0x38,0x4f,0x63,0xac,0xaf,0xaf, + 0xff,0xaf,0xa9,0xa9,0xc9,0xf0,0xf2,0xe5,0x4b,0x6,0x62,0x81,0xb8,0xb8,0x38,0xc3, + 0xf5,0xeb,0xd7,0x19,0x18,0x77,0xef,0xde,0xfd,0x5f,0x4a,0x4a,0x8a,0xe1,0xd3,0xa7, + 0x4f,0xc,0xff,0xfe,0xfd,0x63,0xf8,0xf5,0xeb,0x17,0xd8,0x8c,0x9f,0x3f,0x7f,0x32, + 0xfc,0xf9,0xf3,0x7,0xce,0x6,0x31,0xfe,0xfe,0xfd,0xb,0x56,0xc3,0xc4,0xc4,0x4, + 0x66,0x33,0x2e,0x5b,0xbe,0xfc,0xff,0xdd,0xbb,0x77,0x89,0xb5,0x14,0xac,0x8e,0x83, + 0x83,0x83,0x81,0x99,0x85,0x85,0x81,0xb1,0xb8,0xb8,0xe4,0x3f,0x4c,0x67,0x48,0x48, + 0x30,0x83,0x85,0x85,0x5,0x4e,0x83,0x4e,0x9c,0x38,0xc1,0xb0,0x66,0xcd,0x5a,0xb8, + 0x3c,0xd3,0xbb,0xf7,0x1f,0x19,0x60,0x98,0x18,0xeb,0x91,0xd5,0x33,0x6,0x6,0x5, + 0xc3,0x6d,0xfe,0xfe,0xe3,0x7,0xc3,0x4f,0x20,0x86,0x81,0xb6,0xd6,0x16,0x86,0xaa, + 0xea,0x1a,0x38,0x9f,0x1d,0xe8,0x5c,0x4e,0x20,0x86,0x1,0x46,0x55,0x75,0xed,0xff, + 0x32,0x32,0x32,0x18,0x96,0x4e,0x99,0xd4,0x7,0x17,0xcb,0xc9,0x2b,0xc2,0x90,0x7f, + 0xf2,0xe4,0x9,0x3,0xa3,0x8c,0x82,0x12,0xdc,0x66,0x98,0x8a,0x9d,0x5b,0x37,0x63, + 0x28,0x76,0xf7,0xf6,0xc5,0x10,0x63,0x54,0x54,0xd3,0xc2,0xd0,0xc,0x53,0xb5,0x65, + 0xfd,0x6a,0x6,0x9f,0xc0,0x50,0x9c,0x41,0xc1,0xc4,0xc6,0xc6,0xc6,0x80,0xb,0x83, + 0x74,0xe1,0x93,0x67,0xc2,0x17,0xc2,0xa0,0x84,0x83,0xf,0xe0,0xd5,0x4c,0x28,0xea, + 0x18,0xd5,0x75,0xc,0x70,0xfa,0x99,0x90,0x66,0x26,0x2d,0x35,0x65,0x6,0x16,0x56, + 0x36,0xac,0xf8,0x3f,0x3,0x23,0x4e,0x39,0x90,0x3e,0xb0,0xcd,0x20,0x6,0xa9,0xe0, + 0xda,0xad,0xbb,0xc,0x0,0xee,0x6e,0x6d,0x7,0xc1,0xe6,0x35,0xf8,0x0,0x0,0x0, + 0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/left_arrow.png + 0x0,0x0,0x0,0xc5, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x2,0x0,0x0,0x0,0xb4,0xb4,0x2,0x1d, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,0x26,0x0,0x0,0x80,0x84,0x0,0x0,0xfa, + 0x0,0x0,0x0,0x80,0xe8,0x0,0x0,0x75,0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a, + 0x98,0x0,0x0,0x17,0x70,0x9c,0xba,0x51,0x3c,0x0,0x0,0x0,0x43,0x49,0x44,0x41, + 0x54,0x28,0x53,0x63,0x60,0x18,0xdc,0xe0,0xff,0xff,0xff,0xc4,0x3a,0x10,0xa8,0x94, + 0x58,0xd5,0x10,0xa5,0x44,0xa9,0x86,0x2b,0x25,0xac,0x1a,0x59,0x29,0x26,0x1b,0xdd, + 0x1b,0xd,0xd,0xd,0xc8,0x8a,0x80,0x5c,0x64,0x80,0xc5,0xd3,0xc8,0x1a,0x88,0xa, + 0x13,0xb8,0x6,0xa2,0x54,0x3,0x15,0x41,0x34,0x10,0xab,0x7a,0x80,0xd4,0x1,0x0, + 0x71,0xca,0x67,0x27,0xc6,0xe,0xff,0xdd,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44, + 0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/maximize_high.png + 0x0,0x0,0x1,0x8e, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0xf,0x0,0x0,0x0,0xf,0x8,0x6,0x0,0x0,0x0,0x3b,0xd6,0x95,0x4a, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x1,0x23,0x49,0x44,0x41,0x54,0x38,0x4f,0x63,0x2c,0x2e,0x2e, + 0xf9,0x6f,0x6a,0x6a,0xc2,0xf0,0xf2,0xe5,0x4b,0x6,0x62,0x81,0xb8,0xb8,0x38,0xc3, + 0xe9,0xd3,0x67,0x18,0x18,0x77,0xef,0xde,0xfd,0x5f,0x4a,0x4a,0x8a,0xe1,0xd3,0xa7, + 0x4f,0xc,0xff,0xfe,0xfd,0x63,0xf8,0xf5,0xeb,0x17,0xd8,0x8c,0x9f,0x3f,0x7f,0x32, + 0xfc,0xf9,0xf3,0x7,0xce,0x6,0x31,0xfe,0xfe,0xfd,0xb,0x56,0xc3,0xc4,0xc4,0x4, + 0x66,0x33,0x2e,0x5b,0xbe,0xfc,0xff,0xdd,0xbb,0x77,0x89,0xb5,0x14,0xac,0x8e,0x83, + 0x83,0x83,0x81,0x99,0x85,0x85,0x81,0x11,0xe4,0x6c,0x92,0x74,0x22,0x29,0x66,0x79, + 0xf7,0xfe,0x23,0x8a,0x5e,0x47,0x47,0x7b,0x86,0xd8,0x98,0x68,0xc,0xf3,0x16,0x2f, + 0x59,0xca,0xb0,0x7f,0xff,0x41,0x14,0x71,0xc6,0xc0,0xa0,0x60,0x14,0x9b,0x17,0x2e, + 0x5e,0x82,0xd3,0x21,0xf1,0xb1,0x31,0x28,0x72,0x2c,0x57,0xae,0xde,0x60,0x90,0x91, + 0x91,0x41,0x11,0x74,0x76,0x74,0xc6,0x30,0x60,0xef,0xfe,0xbd,0xc,0x1f,0x3e,0x7e, + 0x81,0x8b,0x3f,0x79,0xf2,0x84,0x81,0x51,0x46,0x41,0x9,0xc5,0xe6,0x9d,0xfb,0x8f, + 0x30,0xb8,0x3b,0xda,0x60,0x68,0xc6,0x26,0xce,0xc4,0xca,0xc6,0xc1,0x80,0x8c,0x41, + 0xba,0xd0,0xc5,0x40,0x7c,0x6c,0xe2,0x4c,0x6c,0x6c,0x6c,0xc,0xc8,0x18,0xa4,0x8, + 0x5d,0xc,0xc4,0xc7,0x26,0xce,0x82,0xee,0xbe,0x85,0x33,0xa7,0x32,0xac,0xdb,0xbc, + 0xd,0xc3,0xd9,0x20,0x71,0x74,0xc0,0xa8,0xae,0x63,0x40,0x76,0x3c,0x33,0x91,0x9b, + 0x40,0x40,0xfa,0x98,0xb4,0xd4,0x94,0x19,0x58,0x58,0xd9,0xe0,0xf8,0x3f,0x3,0x23, + 0xc3,0xef,0xdf,0x7f,0x30,0x30,0x48,0x1c,0x59,0x1d,0x48,0x1f,0x38,0xaa,0x4c,0x8d, + 0xc,0x49,0x76,0xc0,0xe9,0x73,0xe7,0x19,0x0,0xf5,0x51,0x6e,0x55,0xe,0xb1,0x2, + 0x8,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/img/bottomBorder.png + 0x0,0x0,0x0,0xa4, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x15,0x0,0x0,0x0,0x18,0x8,0x6,0x0,0x0,0x0,0x15,0x89,0xb6,0x48, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0, + 0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xe,0xc4,0x0,0x0,0xe,0xc4,0x1,0x95,0x2b, + 0xe,0x1b,0x0,0x0,0x0,0x39,0x49,0x44,0x41,0x54,0x48,0x4b,0x63,0x8c,0x8c,0x4f, + 0xf9,0xcf,0x40,0x65,0xc0,0x68,0x63,0x63,0x43,0x75,0x43,0x99,0xa8,0xec,0x48,0xb0, + 0x71,0xa3,0x86,0x52,0x3f,0x54,0x47,0xc3,0x74,0x34,0x4c,0xa9,0x1c,0x2,0xa3,0x49, + 0x8a,0xca,0x1,0x3a,0x5a,0xf4,0xd,0x9d,0x24,0xc5,0x48,0x8b,0x2a,0x1a,0x0,0x23, + 0x47,0x6,0x17,0xb6,0x4d,0xc5,0x92,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae, + 0x42,0x60,0x82, + // C:/Users/hvh/Documents/Visual Studio 2010/Projects/cuSDR32/res/cl/vectoradd.cl + 0x0,0x0,0x9,0x37, + 0x2f, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0xa,0x2a,0x2a,0xa, + 0x2a,0x2a,0x20,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x43,0x29, + 0x20,0x32,0x30,0x31,0x30,0x20,0x4e,0x6f,0x6b,0x69,0x61,0x20,0x43,0x6f,0x72,0x70, + 0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x6e,0x64,0x2f,0x6f,0x72,0x20,0x69, + 0x74,0x73,0x20,0x73,0x75,0x62,0x73,0x69,0x64,0x69,0x61,0x72,0x79,0x28,0x2d,0x69, + 0x65,0x73,0x29,0x2e,0xa,0x2a,0x2a,0x20,0x41,0x6c,0x6c,0x20,0x72,0x69,0x67,0x68, + 0x74,0x73,0x20,0x72,0x65,0x73,0x65,0x72,0x76,0x65,0x64,0x2e,0xa,0x2a,0x2a,0x20, + 0x43,0x6f,0x6e,0x74,0x61,0x63,0x74,0x3a,0x20,0x4e,0x6f,0x6b,0x69,0x61,0x20,0x43, + 0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x20,0x28,0x71,0x74,0x2d,0x69, + 0x6e,0x66,0x6f,0x40,0x6e,0x6f,0x6b,0x69,0x61,0x2e,0x63,0x6f,0x6d,0x29,0xa,0x2a, + 0x2a,0xa,0x2a,0x2a,0x20,0x54,0x68,0x69,0x73,0x20,0x66,0x69,0x6c,0x65,0x20,0x69, + 0x73,0x20,0x70,0x61,0x72,0x74,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x65,0x78, + 0x61,0x6d,0x70,0x6c,0x65,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x51,0x74, + 0x20,0x54,0x6f,0x6f,0x6c,0x6b,0x69,0x74,0x2e,0xa,0x2a,0x2a,0xa,0x2a,0x2a,0x20, + 0x24,0x51,0x54,0x5f,0x42,0x45,0x47,0x49,0x4e,0x5f,0x4c,0x49,0x43,0x45,0x4e,0x53, + 0x45,0x3a,0x42,0x53,0x44,0x24,0xa,0x2a,0x2a,0x20,0x59,0x6f,0x75,0x20,0x6d,0x61, + 0x79,0x20,0x75,0x73,0x65,0x20,0x74,0x68,0x69,0x73,0x20,0x66,0x69,0x6c,0x65,0x20, + 0x75,0x6e,0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x74,0x65,0x72,0x6d,0x73,0x20, + 0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x42,0x53,0x44,0x20,0x6c,0x69,0x63,0x65,0x6e, + 0x73,0x65,0x20,0x61,0x73,0x20,0x66,0x6f,0x6c,0x6c,0x6f,0x77,0x73,0x3a,0xa,0x2a, + 0x2a,0xa,0x2a,0x2a,0x20,0x22,0x52,0x65,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75, + 0x74,0x69,0x6f,0x6e,0x20,0x61,0x6e,0x64,0x20,0x75,0x73,0x65,0x20,0x69,0x6e,0x20, + 0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x61,0x6e,0x64,0x20,0x62,0x69,0x6e,0x61,0x72, + 0x79,0x20,0x66,0x6f,0x72,0x6d,0x73,0x2c,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72, + 0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0xa,0x2a,0x2a,0x20,0x6d,0x6f,0x64,0x69, + 0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x61,0x72,0x65,0x20,0x70,0x65, + 0x72,0x6d,0x69,0x74,0x74,0x65,0x64,0x20,0x70,0x72,0x6f,0x76,0x69,0x64,0x65,0x64, + 0x20,0x74,0x68,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x66,0x6f,0x6c,0x6c,0x6f,0x77, + 0x69,0x6e,0x67,0x20,0x63,0x6f,0x6e,0x64,0x69,0x74,0x69,0x6f,0x6e,0x73,0x20,0x61, + 0x72,0x65,0xa,0x2a,0x2a,0x20,0x6d,0x65,0x74,0x3a,0xa,0x2a,0x2a,0x20,0x20,0x20, + 0x2a,0x20,0x52,0x65,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e, + 0x73,0x20,0x6f,0x66,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x63,0x6f,0x64,0x65, + 0x20,0x6d,0x75,0x73,0x74,0x20,0x72,0x65,0x74,0x61,0x69,0x6e,0x20,0x74,0x68,0x65, + 0x20,0x61,0x62,0x6f,0x76,0x65,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74, + 0xa,0x2a,0x2a,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x74,0x69,0x63,0x65,0x2c,0x20, + 0x74,0x68,0x69,0x73,0x20,0x6c,0x69,0x73,0x74,0x20,0x6f,0x66,0x20,0x63,0x6f,0x6e, + 0x64,0x69,0x74,0x69,0x6f,0x6e,0x73,0x20,0x61,0x6e,0x64,0x20,0x74,0x68,0x65,0x20, + 0x66,0x6f,0x6c,0x6c,0x6f,0x77,0x69,0x6e,0x67,0x20,0x64,0x69,0x73,0x63,0x6c,0x61, + 0x69,0x6d,0x65,0x72,0x2e,0xa,0x2a,0x2a,0x20,0x20,0x20,0x2a,0x20,0x52,0x65,0x64, + 0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x73,0x20,0x69,0x6e,0x20, + 0x62,0x69,0x6e,0x61,0x72,0x79,0x20,0x66,0x6f,0x72,0x6d,0x20,0x6d,0x75,0x73,0x74, + 0x20,0x72,0x65,0x70,0x72,0x6f,0x64,0x75,0x63,0x65,0x20,0x74,0x68,0x65,0x20,0x61, + 0x62,0x6f,0x76,0x65,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0xa,0x2a, + 0x2a,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x74,0x69,0x63,0x65,0x2c,0x20,0x74,0x68, + 0x69,0x73,0x20,0x6c,0x69,0x73,0x74,0x20,0x6f,0x66,0x20,0x63,0x6f,0x6e,0x64,0x69, + 0x74,0x69,0x6f,0x6e,0x73,0x20,0x61,0x6e,0x64,0x20,0x74,0x68,0x65,0x20,0x66,0x6f, + 0x6c,0x6c,0x6f,0x77,0x69,0x6e,0x67,0x20,0x64,0x69,0x73,0x63,0x6c,0x61,0x69,0x6d, + 0x65,0x72,0x20,0x69,0x6e,0xa,0x2a,0x2a,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x65, + 0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61, + 0x6e,0x64,0x2f,0x6f,0x72,0x20,0x6f,0x74,0x68,0x65,0x72,0x20,0x6d,0x61,0x74,0x65, + 0x72,0x69,0x61,0x6c,0x73,0x20,0x70,0x72,0x6f,0x76,0x69,0x64,0x65,0x64,0x20,0x77, + 0x69,0x74,0x68,0x20,0x74,0x68,0x65,0xa,0x2a,0x2a,0x20,0x20,0x20,0x20,0x20,0x64, + 0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x2e,0xa,0x2a,0x2a,0x20, + 0x20,0x20,0x2a,0x20,0x4e,0x65,0x69,0x74,0x68,0x65,0x72,0x20,0x74,0x68,0x65,0x20, + 0x6e,0x61,0x6d,0x65,0x20,0x6f,0x66,0x20,0x4e,0x6f,0x6b,0x69,0x61,0x20,0x43,0x6f, + 0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x6e,0x64,0x20,0x69,0x74, + 0x73,0x20,0x53,0x75,0x62,0x73,0x69,0x64,0x69,0x61,0x72,0x79,0x28,0x2d,0x69,0x65, + 0x73,0x29,0x20,0x6e,0x6f,0x72,0xa,0x2a,0x2a,0x20,0x20,0x20,0x20,0x20,0x74,0x68, + 0x65,0x20,0x6e,0x61,0x6d,0x65,0x73,0x20,0x6f,0x66,0x20,0x69,0x74,0x73,0x20,0x63, + 0x6f,0x6e,0x74,0x72,0x69,0x62,0x75,0x74,0x6f,0x72,0x73,0x20,0x6d,0x61,0x79,0x20, + 0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x74,0x6f,0x20,0x65,0x6e,0x64,0x6f,0x72, + 0x73,0x65,0x20,0x6f,0x72,0x20,0x70,0x72,0x6f,0x6d,0x6f,0x74,0x65,0xa,0x2a,0x2a, + 0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x20,0x64,0x65, + 0x72,0x69,0x76,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x74,0x68,0x69,0x73,0x20, + 0x73,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74, + 0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x63,0x20,0x70,0x72,0x69,0x6f,0x72,0x20, + 0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0xa,0x2a,0x2a,0x20,0x20,0x20,0x20,0x20,0x70, + 0x65,0x72,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x2e,0xa,0x2a,0x2a,0xa,0x2a,0x2a, + 0x20,0x54,0x48,0x49,0x53,0x20,0x53,0x4f,0x46,0x54,0x57,0x41,0x52,0x45,0x20,0x49, + 0x53,0x20,0x50,0x52,0x4f,0x56,0x49,0x44,0x45,0x44,0x20,0x42,0x59,0x20,0x54,0x48, + 0x45,0x20,0x43,0x4f,0x50,0x59,0x52,0x49,0x47,0x48,0x54,0x20,0x48,0x4f,0x4c,0x44, + 0x45,0x52,0x53,0x20,0x41,0x4e,0x44,0x20,0x43,0x4f,0x4e,0x54,0x52,0x49,0x42,0x55, + 0x54,0x4f,0x52,0x53,0xa,0x2a,0x2a,0x20,0x22,0x41,0x53,0x20,0x49,0x53,0x22,0x20, + 0x41,0x4e,0x44,0x20,0x41,0x4e,0x59,0x20,0x45,0x58,0x50,0x52,0x45,0x53,0x53,0x20, + 0x4f,0x52,0x20,0x49,0x4d,0x50,0x4c,0x49,0x45,0x44,0x20,0x57,0x41,0x52,0x52,0x41, + 0x4e,0x54,0x49,0x45,0x53,0x2c,0x20,0x49,0x4e,0x43,0x4c,0x55,0x44,0x49,0x4e,0x47, + 0x2c,0x20,0x42,0x55,0x54,0x20,0x4e,0x4f,0x54,0xa,0x2a,0x2a,0x20,0x4c,0x49,0x4d, + 0x49,0x54,0x45,0x44,0x20,0x54,0x4f,0x2c,0x20,0x54,0x48,0x45,0x20,0x49,0x4d,0x50, + 0x4c,0x49,0x45,0x44,0x20,0x57,0x41,0x52,0x52,0x41,0x4e,0x54,0x49,0x45,0x53,0x20, + 0x4f,0x46,0x20,0x4d,0x45,0x52,0x43,0x48,0x41,0x4e,0x54,0x41,0x42,0x49,0x4c,0x49, + 0x54,0x59,0x20,0x41,0x4e,0x44,0x20,0x46,0x49,0x54,0x4e,0x45,0x53,0x53,0x20,0x46, + 0x4f,0x52,0xa,0x2a,0x2a,0x20,0x41,0x20,0x50,0x41,0x52,0x54,0x49,0x43,0x55,0x4c, + 0x41,0x52,0x20,0x50,0x55,0x52,0x50,0x4f,0x53,0x45,0x20,0x41,0x52,0x45,0x20,0x44, + 0x49,0x53,0x43,0x4c,0x41,0x49,0x4d,0x45,0x44,0x2e,0x20,0x49,0x4e,0x20,0x4e,0x4f, + 0x20,0x45,0x56,0x45,0x4e,0x54,0x20,0x53,0x48,0x41,0x4c,0x4c,0x20,0x54,0x48,0x45, + 0x20,0x43,0x4f,0x50,0x59,0x52,0x49,0x47,0x48,0x54,0xa,0x2a,0x2a,0x20,0x4f,0x57, + 0x4e,0x45,0x52,0x20,0x4f,0x52,0x20,0x43,0x4f,0x4e,0x54,0x52,0x49,0x42,0x55,0x54, + 0x4f,0x52,0x53,0x20,0x42,0x45,0x20,0x4c,0x49,0x41,0x42,0x4c,0x45,0x20,0x46,0x4f, + 0x52,0x20,0x41,0x4e,0x59,0x20,0x44,0x49,0x52,0x45,0x43,0x54,0x2c,0x20,0x49,0x4e, + 0x44,0x49,0x52,0x45,0x43,0x54,0x2c,0x20,0x49,0x4e,0x43,0x49,0x44,0x45,0x4e,0x54, + 0x41,0x4c,0x2c,0xa,0x2a,0x2a,0x20,0x53,0x50,0x45,0x43,0x49,0x41,0x4c,0x2c,0x20, + 0x45,0x58,0x45,0x4d,0x50,0x4c,0x41,0x52,0x59,0x2c,0x20,0x4f,0x52,0x20,0x43,0x4f, + 0x4e,0x53,0x45,0x51,0x55,0x45,0x4e,0x54,0x49,0x41,0x4c,0x20,0x44,0x41,0x4d,0x41, + 0x47,0x45,0x53,0x20,0x28,0x49,0x4e,0x43,0x4c,0x55,0x44,0x49,0x4e,0x47,0x2c,0x20, + 0x42,0x55,0x54,0x20,0x4e,0x4f,0x54,0xa,0x2a,0x2a,0x20,0x4c,0x49,0x4d,0x49,0x54, + 0x45,0x44,0x20,0x54,0x4f,0x2c,0x20,0x50,0x52,0x4f,0x43,0x55,0x52,0x45,0x4d,0x45, + 0x4e,0x54,0x20,0x4f,0x46,0x20,0x53,0x55,0x42,0x53,0x54,0x49,0x54,0x55,0x54,0x45, + 0x20,0x47,0x4f,0x4f,0x44,0x53,0x20,0x4f,0x52,0x20,0x53,0x45,0x52,0x56,0x49,0x43, + 0x45,0x53,0x3b,0x20,0x4c,0x4f,0x53,0x53,0x20,0x4f,0x46,0x20,0x55,0x53,0x45,0x2c, + 0xa,0x2a,0x2a,0x20,0x44,0x41,0x54,0x41,0x2c,0x20,0x4f,0x52,0x20,0x50,0x52,0x4f, + 0x46,0x49,0x54,0x53,0x3b,0x20,0x4f,0x52,0x20,0x42,0x55,0x53,0x49,0x4e,0x45,0x53, + 0x53,0x20,0x49,0x4e,0x54,0x45,0x52,0x52,0x55,0x50,0x54,0x49,0x4f,0x4e,0x29,0x20, + 0x48,0x4f,0x57,0x45,0x56,0x45,0x52,0x20,0x43,0x41,0x55,0x53,0x45,0x44,0x20,0x41, + 0x4e,0x44,0x20,0x4f,0x4e,0x20,0x41,0x4e,0x59,0xa,0x2a,0x2a,0x20,0x54,0x48,0x45, + 0x4f,0x52,0x59,0x20,0x4f,0x46,0x20,0x4c,0x49,0x41,0x42,0x49,0x4c,0x49,0x54,0x59, + 0x2c,0x20,0x57,0x48,0x45,0x54,0x48,0x45,0x52,0x20,0x49,0x4e,0x20,0x43,0x4f,0x4e, + 0x54,0x52,0x41,0x43,0x54,0x2c,0x20,0x53,0x54,0x52,0x49,0x43,0x54,0x20,0x4c,0x49, + 0x41,0x42,0x49,0x4c,0x49,0x54,0x59,0x2c,0x20,0x4f,0x52,0x20,0x54,0x4f,0x52,0x54, + 0xa,0x2a,0x2a,0x20,0x28,0x49,0x4e,0x43,0x4c,0x55,0x44,0x49,0x4e,0x47,0x20,0x4e, + 0x45,0x47,0x4c,0x49,0x47,0x45,0x4e,0x43,0x45,0x20,0x4f,0x52,0x20,0x4f,0x54,0x48, + 0x45,0x52,0x57,0x49,0x53,0x45,0x29,0x20,0x41,0x52,0x49,0x53,0x49,0x4e,0x47,0x20, + 0x49,0x4e,0x20,0x41,0x4e,0x59,0x20,0x57,0x41,0x59,0x20,0x4f,0x55,0x54,0x20,0x4f, + 0x46,0x20,0x54,0x48,0x45,0x20,0x55,0x53,0x45,0xa,0x2a,0x2a,0x20,0x4f,0x46,0x20, + 0x54,0x48,0x49,0x53,0x20,0x53,0x4f,0x46,0x54,0x57,0x41,0x52,0x45,0x2c,0x20,0x45, + 0x56,0x45,0x4e,0x20,0x49,0x46,0x20,0x41,0x44,0x56,0x49,0x53,0x45,0x44,0x20,0x4f, + 0x46,0x20,0x54,0x48,0x45,0x20,0x50,0x4f,0x53,0x53,0x49,0x42,0x49,0x4c,0x49,0x54, + 0x59,0x20,0x4f,0x46,0x20,0x53,0x55,0x43,0x48,0x20,0x44,0x41,0x4d,0x41,0x47,0x45, + 0x2e,0x22,0xa,0x2a,0x2a,0x20,0x24,0x51,0x54,0x5f,0x45,0x4e,0x44,0x5f,0x4c,0x49, + 0x43,0x45,0x4e,0x53,0x45,0x24,0xa,0x2a,0x2a,0xa,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, + 0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0xa,0xa,0x2f,0x2f,0x21,0x20,0x5b,0x31,0x5d, + 0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f, + 0x69,0x64,0x20,0x76,0x65,0x63,0x74,0x6f,0x72,0x41,0x64,0x64,0x28,0x5f,0x5f,0x67, + 0x6c,0x6f,0x62,0x61,0x6c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c, + 0x79,0x20,0x69,0x6e,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f, + 0x62,0x61,0x6c,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20, + 0x69,0x6e,0x74,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0xa,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61, + 0x6c,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69, + 0x6e,0x74,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0xa,0x20,0x20,0x20,0x20, + 0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x6e,0x73,0x69,0x67,0x6e, + 0x65,0x64,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x67, + 0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b, + 0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b, + 0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x5b, + 0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x5b, + 0x69,0x6e,0x64,0x65,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x2f,0x2f, + 0x21,0x20,0x5b,0x31,0x5d,0xa, + +}; + +static const unsigned char qt_resource_name[] = { + // cl + 0x0,0x2, + 0x0,0x0,0x6,0x9c, + 0x0,0x63, + 0x0,0x6c, + // img + 0x0,0x3, + 0x0,0x0,0x70,0x37, + 0x0,0x69, + 0x0,0x6d,0x0,0x67, + // drawer.png + 0x0,0xa, + 0xd,0xc8,0x26,0x47, + 0x0,0x64, + 0x0,0x72,0x0,0x61,0x0,0x77,0x0,0x65,0x0,0x72,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // close.png + 0x0,0x9, + 0x6,0x98,0x83,0x27, + 0x0,0x63, + 0x0,0x6c,0x0,0x6f,0x0,0x73,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // leftMiddle.png + 0x0,0xe, + 0xc,0x96,0x34,0xa7, + 0x0,0x6c, + 0x0,0x65,0x0,0x66,0x0,0x74,0x0,0x4d,0x0,0x69,0x0,0x64,0x0,0x64,0x0,0x6c,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // maximize.png + 0x0,0xc, + 0xf,0x79,0xb7,0xc7, + 0x0,0x6d, + 0x0,0x61,0x0,0x78,0x0,0x69,0x0,0x6d,0x0,0x69,0x0,0x7a,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // cuSDR_32.ico + 0x0,0xc, + 0xf,0x31,0xbc,0x9f, + 0x0,0x63, + 0x0,0x75,0x0,0x53,0x0,0x44,0x0,0x52,0x0,0x5f,0x0,0x33,0x0,0x32,0x0,0x2e,0x0,0x69,0x0,0x63,0x0,0x6f, + // rightMiddle.png + 0x0,0xf, + 0x0,0xd7,0xcb,0xe7, + 0x0,0x72, + 0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x4d,0x0,0x69,0x0,0x64,0x0,0x64,0x0,0x6c,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // rightTop.png + 0x0,0xc, + 0x4,0x7c,0xe8,0x67, + 0x0,0x72, + 0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x54,0x0,0x6f,0x0,0x70,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // minimize_high.png + 0x0,0x11, + 0x6,0x2a,0x28,0x87, + 0x0,0x6d, + 0x0,0x69,0x0,0x6e,0x0,0x69,0x0,0x6d,0x0,0x69,0x0,0x7a,0x0,0x65,0x0,0x5f,0x0,0x68,0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + + // leftBottom.png + 0x0,0xe, + 0xc,0xf1,0x66,0x87, + 0x0,0x6c, + 0x0,0x65,0x0,0x66,0x0,0x74,0x0,0x42,0x0,0x6f,0x0,0x74,0x0,0x74,0x0,0x6f,0x0,0x6d,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // left.png + 0x0,0x8, + 0xb,0xd7,0x59,0x7, + 0x0,0x6c, + 0x0,0x65,0x0,0x66,0x0,0x74,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // hide.png + 0x0,0x8, + 0xf,0xa8,0x5a,0x87, + 0x0,0x68, + 0x0,0x69,0x0,0x64,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // right_arrow.png + 0x0,0xf, + 0x2,0x9f,0x5,0x87, + 0x0,0x72, + 0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x5f,0x0,0x61,0x0,0x72,0x0,0x72,0x0,0x6f,0x0,0x77,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // minimize.png + 0x0,0xc, + 0xf,0x88,0xf7,0xc7, + 0x0,0x6d, + 0x0,0x69,0x0,0x6e,0x0,0x69,0x0,0x6d,0x0,0x69,0x0,0x7a,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // close_high.png + 0x0,0xe, + 0x9,0x8,0x26,0x7, + 0x0,0x63, + 0x0,0x6c,0x0,0x6f,0x0,0x73,0x0,0x65,0x0,0x5f,0x0,0x68,0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // cusdr4.png + 0x0,0xa, + 0xb,0x5a,0xe,0x67, + 0x0,0x63, + 0x0,0x75,0x0,0x73,0x0,0x64,0x0,0x72,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // cuSDR_64.ico + 0x0,0xc, + 0xf,0xc3,0xbc,0x9f, + 0x0,0x63, + 0x0,0x75,0x0,0x53,0x0,0x44,0x0,0x52,0x0,0x5f,0x0,0x36,0x0,0x34,0x0,0x2e,0x0,0x69,0x0,0x63,0x0,0x6f, + // down_arrow.png + 0x0,0xe, + 0x4,0xa2,0xfc,0xa7, + 0x0,0x64, + 0x0,0x6f,0x0,0x77,0x0,0x6e,0x0,0x5f,0x0,0x61,0x0,0x72,0x0,0x72,0x0,0x6f,0x0,0x77,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // cusdrLogo.png + 0x0,0xd, + 0x0,0x75,0x38,0x87, + 0x0,0x63, + 0x0,0x75,0x0,0x73,0x0,0x64,0x0,0x72,0x0,0x4c,0x0,0x6f,0x0,0x67,0x0,0x6f,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // cusdrLogo2.png + 0x0,0xe, + 0x7,0x13,0xab,0x47, + 0x0,0x63, + 0x0,0x75,0x0,0x73,0x0,0x64,0x0,0x72,0x0,0x4c,0x0,0x6f,0x0,0x67,0x0,0x6f,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // right.png + 0x0,0x9, + 0xd,0xf7,0xa6,0xa7, + 0x0,0x72, + 0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // topBorder.png + 0x0,0xd, + 0xc,0xc,0x7b,0xa7, + 0x0,0x74, + 0x0,0x6f,0x0,0x70,0x0,0x42,0x0,0x6f,0x0,0x72,0x0,0x64,0x0,0x65,0x0,0x72,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // up_arrow.png + 0x0,0xc, + 0x6,0xe6,0xe6,0x67, + 0x0,0x75, + 0x0,0x70,0x0,0x5f,0x0,0x61,0x0,0x72,0x0,0x72,0x0,0x6f,0x0,0x77,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // hpsdr4.png + 0x0,0xa, + 0xb,0x5a,0xb8,0x67, + 0x0,0x68, + 0x0,0x70,0x0,0x73,0x0,0x64,0x0,0x72,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // rightBottom.png + 0x0,0xf, + 0x0,0xb0,0x99,0xc7, + 0x0,0x72, + 0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x42,0x0,0x6f,0x0,0x74,0x0,0x74,0x0,0x6f,0x0,0x6d,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // leftTop.png + 0x0,0xb, + 0xb,0x86,0x2c,0x67, + 0x0,0x6c, + 0x0,0x65,0x0,0x66,0x0,0x74,0x0,0x54,0x0,0x6f,0x0,0x70,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // hide_high.png + 0x0,0xd, + 0x2,0x2e,0x3d,0x27, + 0x0,0x68, + 0x0,0x69,0x0,0x64,0x0,0x65,0x0,0x5f,0x0,0x68,0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // left_arrow.png + 0x0,0xe, + 0xe,0xde,0xfa,0xc7, + 0x0,0x6c, + 0x0,0x65,0x0,0x66,0x0,0x74,0x0,0x5f,0x0,0x61,0x0,0x72,0x0,0x72,0x0,0x6f,0x0,0x77,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // maximize_high.png + 0x0,0x11, + 0x6,0x34,0x0,0x87, + 0x0,0x6d, + 0x0,0x61,0x0,0x78,0x0,0x69,0x0,0x6d,0x0,0x69,0x0,0x7a,0x0,0x65,0x0,0x5f,0x0,0x68,0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + + // bottomBorder.png + 0x0,0x10, + 0xc,0x1c,0x20,0xa7, + 0x0,0x62, + 0x0,0x6f,0x0,0x74,0x0,0x74,0x0,0x6f,0x0,0x6d,0x0,0x42,0x0,0x6f,0x0,0x72,0x0,0x64,0x0,0x65,0x0,0x72,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67, + // vectoradd.cl + 0x0,0xc, + 0x7,0xed,0x22,0x5c, + 0x0,0x76, + 0x0,0x65,0x0,0x63,0x0,0x74,0x0,0x6f,0x0,0x72,0x0,0x61,0x0,0x64,0x0,0x64,0x0,0x2e,0x0,0x63,0x0,0x6c, + +}; + +static const unsigned char qt_resource_struct[] = { + // : + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1, + // :/cl + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20, + // :/img + 0x0,0x0,0x0,0xa,0x0,0x2,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3, + // :/img/cusdrLogo.png + 0x0,0x0,0x2,0x1c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6a,0xd4, + // :/img/rightBottom.png + 0x0,0x0,0x2,0xce,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xf7,0x71, + // :/img/rightMiddle.png + 0x0,0x0,0x0,0xa6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x15,0x4a, + // :/img/hide_high.png + 0x0,0x0,0x3,0xe,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xf8,0xe3, + // :/img/right_arrow.png + 0x0,0x0,0x1,0x5e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1b,0x8c, + // :/img/rightTop.png + 0x0,0x0,0x0,0xca,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x15,0xd3, + // :/img/down_arrow.png + 0x0,0x0,0x1,0xfa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6a,0x4b, + // :/img/minimize_high.png + 0x0,0x0,0x0,0xe8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x16,0x7d, + // :/img/maximize_high.png + 0x0,0x0,0x3,0x50,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xfb,0x3a, + // :/img/close.png + 0x0,0x0,0x0,0x30,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xc4, + // :/img/up_arrow.png + 0x0,0x0,0x2,0x96,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0x95,0xbe, + // :/img/cusdrLogo2.png + 0x0,0x0,0x2,0x3c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x2,0x7b,0x46, + // :/img/close_high.png + 0x0,0x0,0x1,0xa0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1e,0x4c, + // :/img/cusdr4.png + 0x0,0x0,0x1,0xc2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x20,0x7, + // :/img/hpsdr4.png + 0x0,0x0,0x2,0xb4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0x96,0x3f, + // :/img/leftTop.png + 0x0,0x0,0x2,0xf2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xf8,0x3d, + // :/img/left.png + 0x0,0x0,0x1,0x32,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x19,0x19, + // :/img/topBorder.png + 0x0,0x0,0x2,0x76,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0x95,0x2a, + // :/img/bottomBorder.png + 0x0,0x0,0x3,0x78,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xfc,0xcc, + // :/img/leftMiddle.png + 0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x2,0x61, + // :/img/leftBottom.png + 0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x18,0x54, + // :/img/drawer.png + 0x0,0x0,0x0,0x16,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, + // :/img/right.png + 0x0,0x0,0x2,0x5e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0x94,0x96, + // :/img/left_arrow.png + 0x0,0x0,0x3,0x2e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xfa,0x71, + // :/img/cuSDR_32.ico + 0x0,0x0,0x0,0x88,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x4,0x88, + // :/img/maximize.png + 0x0,0x0,0x0,0x6a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x2,0xe3, + // :/img/minimize.png + 0x0,0x0,0x1,0x82,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1c,0x55, + // :/img/hide.png + 0x0,0x0,0x1,0x48,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x19,0xd5, + // :/img/cuSDR_64.ico + 0x0,0x0,0x1,0xdc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x28,0x9, + // :/cl/vectoradd.cl + 0x0,0x0,0x3,0x9e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x4,0xfd,0x74, + +}; + +QT_BEGIN_NAMESPACE + +extern Q_CORE_EXPORT bool qRegisterResourceData + (int, const unsigned char *, const unsigned char *, const unsigned char *); + +extern Q_CORE_EXPORT bool qUnregisterResourceData + (int, const unsigned char *, const unsigned char *, const unsigned char *); + +QT_END_NAMESPACE + + +int QT_MANGLE_NAMESPACE(qInitResources_cusdr)() +{ + QT_PREPEND_NAMESPACE(qRegisterResourceData) + (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_cusdr)) + +int QT_MANGLE_NAMESPACE(qCleanupResources_cusdr)() +{ + QT_PREPEND_NAMESPACE(qUnregisterResourceData) + (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_cusdr)) + diff --git a/Source/src/AudioEngine/cusdr_audio_engine.cpp b/Source/src/AudioEngine/cusdr_audio_engine.cpp new file mode 100644 index 0000000..52f7fc7 --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_engine.cpp @@ -0,0 +1,1465 @@ +/** +* @file cusdr_audio_engine.cpp +* @brief cuSDR audio engine +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ +//#define LOG_AUDIO_ENGINE + +#include "cusdr_audio_engine.h" +#include "cusdr_audio_settingsdialog.h" +#include "cusdr_audio_utils.h" +#include "cusdr_settings.h" + +//#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +struct SWavHeader { + + char chunkID[4]; + unsigned int chunkSize; + char format[4]; + + unsigned char subchunk1id[4]; + unsigned int subchunk1size; + unsigned short audioFormat; + unsigned short nofChannels; + unsigned int sampleRate; + unsigned int byteRate; + unsigned short blockAlign; + unsigned short bitsPerSample; + + unsigned char subchunk2id[4]; + unsigned int subchunk2size; +}; + + +//const qint64 BufferDurationUs = 10 * 1000000; +const int NotifyIntervalMs = 1; + +// Size of the level calculation window in microseconds +const int LevelWindowUs = 0.1 * 1000000; + +// Waveform window size in microseconds +//const qint64 WaveformWindowDuration = 500 * 1000; + +QDebug& operator<<(QDebug &debug, const QAudioFormat &format) { + + debug << format.sampleRate() << "Hz" + << format.channelCount() << "channels"; + return debug; +} + +AudioEngine::AudioEngine(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_mode(QAudio::AudioInput) + , m_state(QAudio::StoppedState) + , m_serverMode(set->getCurrentServerMode()) + , m_generateTone(false) + , m_generateLocalChirp(false) + , m_lowerChirpFreq(set->getLowerChirpFreq()) + , m_upperChirpFreq(set->getUpperChirpFreq()) + , m_chirpAmplitude(set->getChirpAmplitude()) + , m_downRate(set->getChirpDownSampleRate()) + , m_chirpBufferDurationUs(set->getChirpBufferDurationUs()) + , m_chirpRepetition(1) + , m_file(0) + , m_analysisFile(0) + , m_availableAudioInputDevices( + QAudioDeviceInfo::availableDevices(QAudio::AudioInput)) + , m_audioInputDevice(QAudioDeviceInfo::defaultInputDevice()) + , m_audioInput(0) + , m_audioInputIODevice(0) + , m_recordPosition(0) + , m_availableAudioOutputDevices( + QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) + , m_audioOutputDevice(QAudioDeviceInfo::defaultOutputDevice()) + , m_audioOutput(0) + , m_playPosition(0) + , m_bufferPosition(0) + , m_bufferLength(0) + , m_dataLength(0) + , m_levelBufferLength(0) + , m_rmsLevel(0.0) + , m_peakLevel(0.0) + , m_spectrumBufferLength(0) + , m_spectrumAnalyser() + , m_spectrumPosition(0) + , m_count(0) + , setDialog(new SettingsDialog( + availableAudioInputDevices(), + availableAudioOutputDevices(), + this)) + , m_sampleRate(set->getSampleRate()) + , m_audioFileBuffer(0) +{ + qRegisterMetaType("FrequencySpectrum"); + qRegisterMetaType("WindowFunction"); + + setupConnections(); + initializePCMS16LE(); + + AUDIO_ENGINE_DEBUG << "defaultOutputDevice options:"; + AUDIO_ENGINE_DEBUG << " defaultOutputDevice: " << m_audioOutputDevice.defaultOutputDevice; + AUDIO_ENGINE_DEBUG << " preferredFormat: " << m_audioOutputDevice.preferredFormat(); + AUDIO_ENGINE_DEBUG << " supportedByteOrders: " << m_audioOutputDevice.supportedByteOrders(); + AUDIO_ENGINE_DEBUG << " supportedChannelCounts: " << m_audioOutputDevice.supportedChannelCounts(); + AUDIO_ENGINE_DEBUG << " supportedChannelCounts :" << m_audioOutputDevice.supportedChannelCounts(); + AUDIO_ENGINE_DEBUG << " supportedCodecs: " << m_audioOutputDevice.supportedCodecs(); + AUDIO_ENGINE_DEBUG << " supportedSampleRates: " << m_audioOutputDevice.supportedSampleRates(); + AUDIO_ENGINE_DEBUG << " supportedSampleSizes: " << m_audioOutputDevice.supportedSampleSizes(); + AUDIO_ENGINE_DEBUG << " supportedSampleTypes: " << m_audioOutputDevice.supportedSampleTypes(); + + +#ifdef DUMP_DATA + createOutputDir(); +#endif + +#ifdef DUMP_SPECTRUM + m_spectrumAnalyser.setOutputPath(outputPath()); +#endif +} + +AudioEngine::~AudioEngine() { +} + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +bool AudioEngine::loadFile(const QString &fileName) { + + reset(); + bool result = false; + Q_ASSERT(!m_generateTone); + Q_ASSERT(!m_file); + Q_ASSERT(!fileName.isEmpty()); + m_file = new WavFile(this); + + if (m_file->open(fileName)) { + + QString formatStr = formatToString(m_file->fileFormat()); + AUDIO_ENGINE_DEBUG << "file audio format" << formatStr; + + + if (isPCMS16LE(m_file->fileFormat())) { + + result = initializePCMS16LE(); + + m_audioFileBuffer = new AudiofileBuffer(); + m_audioFileBuffer = AudiofileBuffer::loadWav(m_file->fileName()); + + qint16 channels = m_audioFileBuffer->getNofChannels(); + + AUDIO_ENGINE_DEBUG << " data length:" << m_audioFileBuffer->getDataLength(); + AUDIO_ENGINE_DEBUG << " bytes per sample:" << m_audioFileBuffer->getBytesPerSample(); + AUDIO_ENGINE_DEBUG << " bits per sample:" << m_audioFileBuffer->getBitsPerSample(); + AUDIO_ENGINE_DEBUG << " samples per second:" << m_audioFileBuffer->getSamplesPerSec(); + AUDIO_ENGINE_DEBUG << " no of channels:" << channels; + + const qint16 *ptr = reinterpret_cast(m_audioFileBuffer->getRawData()); + const int numSamples = m_audioFileBuffer->getDataLength() / (m_audioFileBuffer->getBytesPerSample() * channels); + //const int numSamples = m_audioFileBuffer->getDataLength() / m_audioFileBuffer->getBytesPerSample(); + AUDIO_ENGINE_DEBUG << " no of samples:" << numSamples; + //float realSample; + QList audioBuffer; + + for (int i = 0; i < numSamples; i++) { + + for (int j = 0; j < m_audioFileBuffer->getNofChannels(); j++) { + + //realSample = pcmToReal(*ptr); + //AUDIO_ENGINE_DEBUG << i << "\t" << *ptr << "\t" << realSample; + audioBuffer << pcmToReal(*ptr); + ptr++;// += m_audioFileBuffer->getNofChannels(); + } + + //realSample = pcmToReal(*ptr); + ////AUDIO_ENGINE_DEBUG << i << "\t" << *ptr << "\t" << realSample; + //audioBuffer << pcmToReal(*ptr); + //ptr++;// += m_audioFileBuffer->getNofChannels(); + } + + /*int lng = audioBuffer.length(); + for (int i = 0; i < lng/6; i++) + qDebug() << audioBuffer.at(i) << "\t" << audioBuffer.at(i+1) << "\t" << audioBuffer.at(i+2) << "\t" + << audioBuffer.at(i+3) << "\t" << audioBuffer.at(i+4) << "\t" << audioBuffer.at(i+5);*/ + + emit audiofileBufferChanged(audioBuffer); + } + else if (isPCMS32LE(m_file->fileFormat())) { + + result = initializePCMS32LE(); + } + else { + + m_message = "[audio engine]: audio format %1 not supported."; + emit messageEvent(m_message.arg(formatToString(m_file->fileFormat()))); + } + } + else { + + m_message = "[audio engine]: could not open %1."; + emit messageEvent(m_message.arg(fileName)); + } + + if (result) { + + m_analysisFile = new WavFile(this); + m_analysisFile->open(fileName); + } + + return result; +} + +bool AudioEngine::generateTone(const Tone &tone) { + + reset(); + Q_ASSERT(!m_generateTone); + Q_ASSERT(!m_file); + m_generateTone = true; + m_tone = tone; + AUDIO_ENGINE_DEBUG << "generateTone" + << "startFreq" << m_tone.startFreq + << "endFreq" << m_tone.endFreq + << "amp" << m_tone.amplitude; + + return initializePCMS16LE(); +} + +bool AudioEngine::generateSweptTone() { + + Q_ASSERT(!m_generateTone); + Q_ASSERT(!m_file); + m_generateTone = true; + m_tone.startFreq = m_lowerChirpFreq; + m_tone.endFreq = m_upperChirpFreq; + m_tone.amplitude = m_chirpAmplitude; + m_tone.duration = m_chirpBufferDurationUs; + AUDIO_ENGINE_DEBUG << "generateSweptTone" + << "startFreq" << m_tone.startFreq + << "endFreq" << m_tone.endFreq + << "amp" << m_tone.amplitude + << "duration" << m_tone.duration; + + m_message = "[audio engine]: set chirp signal to: low = %1 Hz, high = %2 Hz, amplitude = %3, duration = %4 s"; + emit messageEvent(m_message.arg(m_lowerChirpFreq).arg(m_upperChirpFreq).arg(m_chirpAmplitude).arg(m_chirpBufferDurationUs/1E6)); + + return initializePCMS16LE(); +} + +void AudioEngine::generateAudioChirpSignal(const SweptTone &tone, const QAudioFormat &format, QByteArray &buffer) { + + Q_ASSERT(isPCMS16LE(format)); + + const int channelBytes = format.sampleSize() / 8; + const int sampleBytes = format.channelCount() * channelBytes; + int length = buffer.size(); + const int numSamples = buffer.size() / sampleBytes; + + Q_ASSERT(length % sampleBytes == 0); + Q_UNUSED(sampleBytes) // suppress warning in release builds + + unsigned char *ptr = reinterpret_cast(buffer.data()); + + qreal phase = 0.0; + + const qreal d = TWOPI / format.sampleRate(); + + // We can't generate a zero-frequency sine wave + const qreal startFreq = tone.startFreq ? tone.startFreq : 1.0; + + // Amount by which phase increases on each sample + qreal dw = d * startFreq; + + // Amount by which phaseStep increases on each sample + // If this is non-zero, the output is a frequency-swept tone + qreal incFreq = m_chirpRepetition * d * (tone.endFreq - startFreq) / numSamples;//(numSamples - 4800); + + while (length) { + + const qreal x = tone.amplitude * qSin(phase); + const qint16 value = realToPcm(x); + for (int i = 0; i < format.channelCount(); ++i) { + + qToLittleEndian(value, ptr); + ptr += channelBytes; + length -= channelBytes; + } + + phase += dw; + if (m_chirpRepetition > 1 && (length % (buffer.size() / m_chirpRepetition) == 0)) { + + dw = d * startFreq; + //incFreq = 0; + } + + dw += incFreq; + } +} + +bool AudioEngine::initializeRecord() { + + reset(); + AUDIO_ENGINE_DEBUG << "initializeRecord"; + Q_ASSERT(!m_generateTone); + Q_ASSERT(!m_file); + m_generateTone = false; + m_tone = SweptTone(); + return initializePCMS16LE(); +} + +qint64 AudioEngine::bufferLength() const { + + return m_file ? m_file->size() : m_bufferLength; +} + +void AudioEngine::setWindowFunction(WindowFunction type) { + + m_spectrumAnalyser.setWindowFunction(type); +} + +void AudioEngine::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; +} + +//----------------------------------------------------------------------------- +// Public slots +//----------------------------------------------------------------------------- + +void AudioEngine::startRecording() { + + if (m_audioInput) { + + if (QAudio::AudioInput == m_mode && + QAudio::SuspendedState == m_state) { + + m_audioInput->resume(); + } + else { + + m_spectrumAnalyser.cancelCalculation(); + spectrumChanged(0, 0, FrequencySpectrum()); + + m_buffer.fill(0); + setRecordPosition(0, true); + stopPlayback(); + m_mode = QAudio::AudioInput; + + CHECKED_CONNECT( + m_audioInput, + SIGNAL(stateChanged(QAudio::State)), + this, + SLOT(audioStateChanged(QAudio::State))); + + CHECKED_CONNECT( + m_audioInput, + SIGNAL(notify()), + this, + SLOT(audioNotify())); + + m_count = 0; + m_dataLength = 0; + emit dataLengthChanged(0); + m_audioInputIODevice = m_audioInput->start(); + + CHECKED_CONNECT( + m_audioInputIODevice, + SIGNAL(readyRead()), + this, + SLOT(audioDataReady())); + } + } +} + +void AudioEngine::startPlayback() { + + if (m_audioOutput) { + + if (QAudio::AudioOutput == m_mode && QAudio::SuspendedState == m_state) { + +#ifdef Q_OS_WIN + // The Windows backend seems to internally go back into ActiveState + // while still returning SuspendedState, so to ensure that it doesn't + // ignore the resume() call, we first re-suspend + m_audioOutput->suspend(); +#endif + m_audioOutput->resume(); + } + else { + + m_spectrumAnalyser.cancelCalculation(); + spectrumChanged(0, 0, FrequencySpectrum()); + setPlayPosition(0, true); + stopRecording(); + m_mode = QAudio::AudioOutput; + + CHECKED_CONNECT( + m_audioOutput, + SIGNAL(stateChanged(QAudio::State)), + this, + SLOT(audioStateChanged(QAudio::State))); + + CHECKED_CONNECT( + m_audioOutput, + SIGNAL(notify()), + this, + SLOT(audioNotify())); + + m_count = 0; + + if (m_file) { + + m_file->seek(0); + m_bufferPosition = 0; + m_dataLength = 0; + m_audioOutput->start(m_file); + } + else { + + m_audioOutputIODevice.close(); + m_audioOutputIODevice.setBuffer(&m_buffer); + m_audioOutputIODevice.open(QIODevice::ReadOnly); + + m_audioOutput->start(&m_audioOutputIODevice); + } + } + } +} + +void AudioEngine::suspend() { + + if (QAudio::ActiveState == m_state || QAudio::IdleState == m_state) { + + switch (m_mode) { + + case QAudio::AudioInput: + + m_audioInput->suspend(); + break; + + case QAudio::AudioOutput: + + m_audioOutput->suspend(); + break; + } + } +} + +void AudioEngine::setAudioInputDevice(const QAudioDeviceInfo &device) { + + if (device.deviceName() != m_audioInputDevice.deviceName()) { + + m_audioInputDevice = device; + initializePCMS16LE(); + } +} + +void AudioEngine::setAudioOutputDevice(const QAudioDeviceInfo &device) { + + if (device.deviceName() != m_audioOutputDevice.deviceName()) { + + m_audioOutputDevice = device; + AUDIO_ENGINE_DEBUG << "setAudioOutputDevice to:" + << m_audioOutputDevice.deviceName(); + + AUDIO_ENGINE_DEBUG << " options:"; + AUDIO_ENGINE_DEBUG << " defaultOutputDevice" << m_audioOutputDevice.defaultOutputDevice; + AUDIO_ENGINE_DEBUG << " preferredFormat" << m_audioOutputDevice.preferredFormat(); + AUDIO_ENGINE_DEBUG << " supportedByteOrders" << m_audioOutputDevice.supportedByteOrders(); + AUDIO_ENGINE_DEBUG << " supportedChannelCounts" << m_audioOutputDevice.supportedChannelCounts(); + AUDIO_ENGINE_DEBUG << " supportedChannelCounts" << m_audioOutputDevice.supportedChannelCounts(); + AUDIO_ENGINE_DEBUG << " supportedCodecs" << m_audioOutputDevice.supportedCodecs(); + AUDIO_ENGINE_DEBUG << " supportedSampleRates" << m_audioOutputDevice.supportedSampleRates(); + AUDIO_ENGINE_DEBUG << " supportedSampleSizes" << m_audioOutputDevice.supportedSampleSizes(); + AUDIO_ENGINE_DEBUG << " supportedSampleTypes" << m_audioOutputDevice.supportedSampleTypes(); + + initializePCMS16LE(); + } +} + +void AudioEngine::showSettingsDialog() { + + setDialog->exec(); + if (setDialog->result() == QDialog::Accepted) { + + setAudioInputDevice(setDialog->inputDevice()); + setAudioOutputDevice(setDialog->outputDevice()); + //setWindowFunction(setDialog->windowFunction()); + } +} + +void AudioEngine::setChirpSignalMode(QObject* sender) { + + Q_UNUSED(sender) + + reset(); + generateSweptTone(); + +} + +void AudioEngine::setChirpLowerFrequency(QObject *sender, int lo) { + + Q_UNUSED(sender) + + m_lowerChirpFreq = lo; + reset(); + generateSweptTone(); +} + +void AudioEngine::setChirpUpperFrequency(QObject *sender, int hi) { + + Q_UNUSED(sender) + + m_upperChirpFreq = hi; + reset(); + generateSweptTone(); +} + +void AudioEngine::setChirpAmplitude(QObject *sender, qreal amp) { + + Q_UNUSED(sender) + + m_chirpAmplitude = amp; + reset(); + generateSweptTone(); +} + +void AudioEngine::setChirpBufferDurationUs(QObject *sender, qint64 value) { + + Q_UNUSED(sender) + + m_chirpBufferDurationUs = value; + reset(); + generateSweptTone(); +} + +void AudioEngine::setChirpRepetitionTimes(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_chirpRepetition = value; + reset(); + generateSweptTone(); +} + + +//----------------------------------------------------------------------------- +// Private slots +//----------------------------------------------------------------------------- + +void AudioEngine::audioNotify() { + + switch (m_mode) { + + case QAudio::AudioInput: { + + const qint64 recordPosition = qMin(m_bufferLength, audioLength(m_format, m_audioInput->processedUSecs())); + setRecordPosition(recordPosition); + const qint64 levelPosition = m_dataLength - m_levelBufferLength; + + if (levelPosition >= 0) + calculateLevel(levelPosition, m_levelBufferLength); + + if (m_dataLength >= m_spectrumBufferLength) { + const qint64 spectrumPosition = m_dataLength - m_spectrumBufferLength; + calculateSpectrum(spectrumPosition); + } + emit bufferChanged(this, 0, m_dataLength, m_buffer); + } + break; + + case QAudio::AudioOutput: { + + const qint64 playPosition = audioLength(m_format, m_audioOutput->processedUSecs()); + setPlayPosition(qMin(bufferLength(), playPosition)); + const qint64 levelPosition = playPosition - m_levelBufferLength; + const qint64 spectrumPosition = playPosition - m_spectrumBufferLength; + + if (m_file) { + + if (levelPosition > m_bufferPosition || + spectrumPosition > m_bufferPosition || + qMax(m_levelBufferLength, m_spectrumBufferLength) > m_dataLength) + { + m_bufferPosition = 0; + m_dataLength = 0; + // Data needs to be read into m_buffer in order to be analysed + const qint64 readPos = qMax(qint64(0), qMin(levelPosition, spectrumPosition)); + const qint64 readEnd = qMin(m_analysisFile->size(), qMax(levelPosition + m_levelBufferLength, spectrumPosition + m_spectrumBufferLength)); + const qint64 readLen = readEnd - readPos + audioLength(m_format, WaveformWindowDuration); + AUDIO_ENGINE_DEBUG << "audioNotify [1]" + << "analysisFileSize" << m_analysisFile->size() + << "readPos" << readPos + << "readLen" << readLen; + if (m_analysisFile->seek(readPos + m_analysisFile->headerLength())) { + m_buffer.resize(readLen); + m_bufferPosition = readPos; + m_dataLength = m_analysisFile->read(m_buffer.data(), readLen); + AUDIO_ENGINE_DEBUG << "audioNotify [2]" << "bufferPosition" << m_bufferPosition << "dataLength" << m_dataLength; + } + else { + + AUDIO_ENGINE_DEBUG << "audioNotify [2]" << "file seek error"; + } + emit bufferChanged(this, m_bufferPosition, m_dataLength, m_buffer); + } + } + else { + + if (playPosition >= m_dataLength) stopPlayback(); + } + + if (levelPosition >= 0 && levelPosition + m_levelBufferLength < m_bufferPosition + m_dataLength) + calculateLevel(levelPosition, m_levelBufferLength); + //if (spectrumPosition >= 0 && spectrumPosition + m_spectrumBufferLength < m_bufferPosition + m_dataLength) + // calculateSpectrum(spectrumPosition); + //calculateTotalSpectrum(); + } + break; + } +} + +void AudioEngine::audioStateChanged(QAudio::State state) { + + AUDIO_ENGINE_DEBUG << "audio state changed from" << m_state + << "to" << state; + + if (QAudio::IdleState == state && m_file && m_file->pos() == m_file->size()) { + + stopPlayback(); + } + else { + + if (QAudio::StoppedState == state) { + // Check error + QAudio::Error error = QAudio::NoError; + + switch (m_mode) { + + case QAudio::AudioInput: + + error = m_audioInput->error(); + break; + + case QAudio::AudioOutput: + error = m_audioOutput->error(); + break; + } + + if (QAudio::NoError != error) { + + reset(); + return; + } + } + setAudioState(state); + } +} + +void AudioEngine::audioDataReady() { + + Q_ASSERT(0 == m_bufferPosition); + + const qint64 bytesReady = m_audioInput->bytesReady(); + const qint64 bytesSpace = m_buffer.size() - m_dataLength; + const qint64 bytesToRead = qMin(bytesReady, bytesSpace); + + const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesToRead); + + if (bytesRead) { + + m_dataLength += bytesRead; + emit dataLengthChanged(dataLength()); + } + + if (m_buffer.size() == m_dataLength) + stopRecording(); +} + +void AudioEngine::spectrumChanged(const FrequencySpectrum &spectrum) { + + AUDIO_ENGINE_DEBUG << "spectrumChanged" << "pos" << m_spectrumPosition; + //emit spectrumChanged(m_spectrumPosition, m_spectrumBufferLength, spectrum); + set->setChirpSpectrum(m_spectrumPosition, m_spectrumBufferLength, spectrum); +} + +void AudioEngine::spectrumListChanged(const QList &spectrumList) { + + AUDIO_ENGINE_DEBUG << "spectrumListChanged"; + + set->setChirpSpectrumList(spectrumList); +} + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void AudioEngine::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(chirpSignalModeChanged(QObject *)), + this, + SLOT(setChirpSignalMode(QObject *))); + + CHECKED_CONNECT( + &m_spectrumAnalyser, + SIGNAL(spectrumChanged(FrequencySpectrum)), + this, + SLOT(spectrumChanged(FrequencySpectrum))); + + CHECKED_CONNECT( + &m_spectrumAnalyser, + SIGNAL(spectrumListChanged(const QList)), + this, + SLOT(spectrumListChanged(const QList))); + + CHECKED_CONNECT( + set, + SIGNAL(lowerChirpFreqChanged(QObject *, int)), + this, + SLOT(setChirpLowerFrequency(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(upperChirpFreqChanged(QObject *, int)), + this, + SLOT(setChirpUpperFrequency(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(chirpAmplitudeChanged(QObject *, qreal)), + this, + SLOT(setChirpAmplitude(QObject *, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(chirpBufferDurationUsChanged(QObject *, qint64)), + this, + SLOT(setChirpBufferDurationUs(QObject *, qint64))); + + CHECKED_CONNECT( + set, + SIGNAL(chirpRepetitionTimesChanged(QObject *, int)), + this, + SLOT(setChirpRepetitionTimes(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); +} + +void AudioEngine::resetAudioDevices() { + + delete m_audioInput; + m_audioInput = 0; + m_audioInputIODevice = 0; + setRecordPosition(0); + delete m_audioOutput; + m_audioOutput = 0; + setPlayPosition(0); + m_spectrumPosition = 0; + setLevel(0.0, 0.0, 0); +} + +void AudioEngine::reset() { + + stopRecording(); + stopPlayback(); + setAudioState(QAudio::AudioInput, QAudio::StoppedState); + setFormat(QAudioFormat()); + m_generateTone = false; + delete m_file; + m_file = 0; + delete m_analysisFile; + m_analysisFile = 0; + m_buffer.clear(); + m_bufferPosition = 0; + m_bufferLength = 0; + m_spectrumBuffer.clear(); + m_spectrumBufferLength = 0; + m_dataLength = 0; + emit dataLengthChanged(0); + resetAudioDevices(); +} + +bool AudioEngine::initializePCMS16LE() { + + bool result = false; + + QAudioFormat format = m_format; + + if (selectFormat()) { + + if (m_format != format) { + + resetAudioDevices(); + if (m_file) { + + AUDIO_ENGINE_DEBUG << "m_file bufferLength: " << bufferLength(); + AUDIO_ENGINE_DEBUG << "m_file dataLength: " << dataLength(); + emit bufferLengthChanged(bufferLength()); + emit dataLengthChanged(dataLength()); + emit bufferChanged(this, 0, 0, m_buffer); + setRecordPosition(bufferLength()); + + result = true; + } + else if (m_serverMode == QSDR::ChirpWSPR) { + + m_bufferLength = audioLength(m_format, m_chirpRepetition * m_chirpBufferDurationUs); + m_buffer.resize(m_bufferLength); + m_buffer.fill(0); + emit bufferLengthChanged(bufferLength()); + + if (m_generateTone) { + + if (0 == m_tone.endFreq) { + + const qreal nyquist = nyquistFrequency(m_format); + m_tone.endFreq = qMin(qreal(SpectrumHighFreq), nyquist); + } + + generateAudioChirpSignal(m_tone, m_format, m_buffer); + + m_dataLength = m_bufferLength; + emit chirpSignalChanged(); + emit dataLengthChanged(dataLength()); + emit bufferChanged(this, 0, m_dataLength, m_buffer); + setRecordPosition(m_bufferLength); + result = true; + + calculateTotalSpectrum(); + } + else { + + emit bufferChanged(this, 0, 0, m_buffer); + m_audioInput = new QAudioInput(m_audioInputDevice, m_format, this); + m_audioInput->setNotifyInterval(NotifyIntervalMs); + result = true; + } + } + else if (m_serverMode == QSDR::SDRMode) { + } + + m_audioOutput = new QAudioOutput(m_audioOutputDevice, m_format, this); + m_audioOutput->setNotifyInterval(NotifyIntervalMs); + } + } + else { + + if (m_file) { + + m_message = "[audio engine]: audio format not supported, %1 ."; + emit messageEvent(m_message.arg(formatToString(m_format))); + } + else if (m_generateTone) + emit messageEvent("[audio engine]: no suitable format found."); + else + emit messageEvent("[audio engine]: no common input / output format found."); + } + + AUDIO_ENGINE_DEBUG << "initialize" << "m_bufferLength: " << m_bufferLength; + AUDIO_ENGINE_DEBUG << "initialize" << "m_dataLength: " << m_dataLength; + AUDIO_ENGINE_DEBUG << "initialize" << "format: " << m_format; + + //m_message = "[audio engine]: file format = %1."; + //emit messageEvent(m_message.arg(formatToString(m_format))); + + return result; +} + +bool AudioEngine::initializePCMS32LE() { + + bool result = false; + + QAudioFormat format = m_format; + + if (selectFormat()) { + if (m_format != format) { + + resetAudioDevices(); + + if (m_file) { + + emit bufferLengthChanged(bufferLength()); + emit dataLengthChanged(dataLength()); + emit bufferChanged(this, 0, 0, m_buffer); + setRecordPosition(bufferLength()); + + result = true; + } + } + } + else { + if (m_file) { + m_message = "[audio engine]: audio format not supported, %1 ."; + emit messageEvent(m_message.arg(formatToString(m_format))); + } + } + + AUDIO_ENGINE_DEBUG << "initialize" << "m_bufferLength" << m_bufferLength; + AUDIO_ENGINE_DEBUG << "initialize" << "m_dataLength" << m_dataLength; + AUDIO_ENGINE_DEBUG << "initialize" << "format" << m_format; + m_message = "[audio engine]: file format = %1."; + emit messageEvent(m_message.arg(formatToString(m_format))); + + return result; +} + +bool AudioEngine::selectFormat() { + + bool foundSupportedFormat = false; + + if (m_file || QAudioFormat() != m_format) { + + QAudioFormat format = m_format; + if (m_file) + // Header is read from the WAV file; just need to check whether + // it is supported by the audio output device + format = m_file->fileFormat(); + if (m_audioOutputDevice.isFormatSupported(format)) { + + setFormat(format); + foundSupportedFormat = true; + } + else { + + QAudioFormat nearestFormat = m_audioOutputDevice.nearestFormat(format); + + QString formatStr = formatToString(nearestFormat); + AUDIO_ENGINE_DEBUG << "audio format not supported!"; + AUDIO_ENGINE_DEBUG << "nearest file audio format" << formatStr; + } + } + else if ((m_serverMode == QSDR::ChirpWSPR)|| QAudioFormat() != m_format) { + + QList frequenciesList; + + if (!m_generateTone) + frequenciesList += m_audioInputDevice.supportedSampleRates(); + + frequenciesList += m_audioOutputDevice.supportedSampleRates(); + frequenciesList = frequenciesList.toSet().toList(); // remove duplicates + qSort(frequenciesList); + AUDIO_ENGINE_DEBUG << "initialize frequenciesList: " << frequenciesList; + + QList channelsList; + channelsList += m_audioInputDevice.supportedChannelCounts(); + channelsList += m_audioOutputDevice.supportedChannelCounts(); + channelsList = channelsList.toSet().toList(); + qSort(channelsList); + AUDIO_ENGINE_DEBUG << "initialize channelsList: " << channelsList; + + QAudioFormat format; + format.setByteOrder(QAudioFormat::LittleEndian); + format.setCodec("audio/pcm"); + format.setSampleSize(16); + format.setSampleType(QAudioFormat::SignedInt); + + format.setSampleRate(set->getChirpSamplingFreq()); + format.setChannelCount(set->getChirpChannels()); + const bool inputSupport = m_generateTone || m_audioInputDevice.isFormatSupported(format); + const bool outputSupport = m_audioOutputDevice.isFormatSupported(format); + + AUDIO_ENGINE_DEBUG << "initialize checking: " + << " input: " << inputSupport << "; " + << " output: " << outputSupport; + + AUDIO_ENGINE_DEBUG << "checking audio length:"; + AUDIO_ENGINE_DEBUG << " format.sampleRate() = " << format.sampleRate(); + AUDIO_ENGINE_DEBUG << " format.channelCount() = " << format.channelCount(); + AUDIO_ENGINE_DEBUG << " format.sampleSize() = " << format.sampleSize(); + + if (inputSupport && outputSupport) { + + setFormat(format); + foundSupportedFormat = true; + } + + return foundSupportedFormat; + + /*int frequency, channels; + foreach (frequency, frequenciesList) { + if (foundSupportedFormat) + break; + format.setSampleRate(frequency); + foreach (channels, channelsList) { + format.setChannelCount(channels); + const bool inputSupport = m_generateTone || + m_audioInputDevice.isFormatSupported(format); + const bool outputSupport = m_audioOutputDevice.isFormatSupported(format); + AUDIO_ENGINE_DEBUG << "initialize checking " << format + << "input" << inputSupport + << "output" << outputSupport; + if (inputSupport && outputSupport) { + foundSupportedFormat = true; + break; + } + } + } + + if (!foundSupportedFormat) + format = QAudioFormat(); + + setFormat(format);*/ + } + else if ((m_serverMode == QSDR::SDRMode)|| QAudioFormat() != m_format) { + + QList frequenciesList; + + if (!m_generateTone) + frequenciesList += m_audioInputDevice.supportedSampleRates(); + + frequenciesList += m_audioOutputDevice.supportedSampleRates(); + frequenciesList = frequenciesList.toSet().toList(); // remove duplicates + qSort(frequenciesList); + AUDIO_ENGINE_DEBUG << "initialize frequenciesList: " << frequenciesList; + + QList channelsList; + channelsList += m_audioInputDevice.supportedChannelCounts(); + channelsList += m_audioOutputDevice.supportedChannelCounts(); + channelsList = channelsList.toSet().toList(); + qSort(channelsList); + AUDIO_ENGINE_DEBUG << "initialize channelsList: " << channelsList; + + QAudioFormat format; + format.setByteOrder(QAudioFormat::LittleEndian); + format.setCodec("audio/pcm"); + format.setSampleSize(16); + format.setSampleType(QAudioFormat::SignedInt); + + format.setSampleRate(48000); + format.setChannelCount(2); + const bool inputSupport = m_generateTone || m_audioInputDevice.isFormatSupported(format); + const bool outputSupport = m_audioOutputDevice.isFormatSupported(format); + + AUDIO_ENGINE_DEBUG << "initialize checking: " + << " input: " << inputSupport << "; " + << " output: " << outputSupport; + + AUDIO_ENGINE_DEBUG << "checking audio length:"; + AUDIO_ENGINE_DEBUG << " format.sampleRate() = " << format.sampleRate(); + AUDIO_ENGINE_DEBUG << " format.channelCount() = " << format.channelCount(); + AUDIO_ENGINE_DEBUG << " format.sampleSize() = " << format.sampleSize(); + + if (inputSupport && outputSupport) { + + setFormat(format); + foundSupportedFormat = true; + } + + return foundSupportedFormat; + } +} + +void AudioEngine::stopRecording() { + + if (m_audioInput) { + m_audioInput->stop(); + QCoreApplication::instance()->processEvents(); + m_audioInput->disconnect(); + } + m_audioInputIODevice = 0; + +#ifdef DUMP_AUDIO + dumpData(); +#endif +} + +void AudioEngine::stopPlayback() { + + if (m_audioOutput) { + m_audioOutput->stop(); + QCoreApplication::instance()->processEvents(); + m_audioOutput->disconnect(); + setPlayPosition(0); + } +} + +void AudioEngine::setAudioState(QAudio::State state) { + + const bool changed = (m_state != state); + m_state = state; + if (changed) + emit stateChanged(m_mode, m_state); +} + +void AudioEngine::setAudioState(QAudio::Mode mode, QAudio::State state) { + + const bool changed = (m_mode != mode || m_state != state); + m_mode = mode; + m_state = state; + if (changed) + emit stateChanged(m_mode, m_state); +} + +void AudioEngine::setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (err) + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; +} + +void AudioEngine::setRecordPosition(qint64 position, bool forceEmit) { + + const bool changed = (m_recordPosition != position); + m_recordPosition = position; + if (changed || forceEmit) + emit recordPositionChanged(m_recordPosition); +} + +void AudioEngine::setPlayPosition(qint64 position, bool forceEmit) { + + const bool changed = (m_playPosition != position); + m_playPosition = position; + if (changed || forceEmit) + emit playPositionChanged(this, m_playPosition); +} + +void AudioEngine::calculateLevel(qint64 position, qint64 length) { + +#ifdef DISABLE_LEVEL + Q_UNUSED(position) + Q_UNUSED(length) +#else + Q_ASSERT(position + length <= m_bufferPosition + m_dataLength); + + qreal peakLevel = 0.0; + + qreal sum = 0.0; + const char *ptr = m_buffer.constData() + position - m_bufferPosition; + const char *const end = ptr + length; + while (ptr < end) { + const qint16 value = *reinterpret_cast(ptr); + const qreal fracValue = pcmToReal(value); + peakLevel = qMax(peakLevel, fracValue); + sum += fracValue * fracValue; + ptr += 2; + } + const int numSamples = length / 2; + qreal rmsLevel = sqrt(sum / numSamples); + + rmsLevel = qMax(qreal(0.0), rmsLevel); + rmsLevel = qMin(qreal(1.0), rmsLevel); + setLevel(rmsLevel, peakLevel, numSamples); + + AUDIO_ENGINE_DEBUG << "calculateLevel" << "pos" << position << "len" << length + << "rms" << rmsLevel << "peak" << peakLevel; +#endif +} + +void AudioEngine::calculateSpectrum(qint64 position) { + +#ifdef DISABLE_SPECTRUM + Q_UNUSED(position) +#else + Q_ASSERT(position + m_spectrumBufferLength <= m_bufferPosition + m_dataLength); + Q_ASSERT(0 == m_spectrumBufferLength % 2); // constraint of FFT algorithm + + // QThread::currentThread is marked 'for internal use only', but + // we're only using it for debug output here, so it's probably OK :) + AUDIO_ENGINE_DEBUG << "calculateSpectrum" << QThread::currentThread() + << "count" << m_count << "pos" << position << "len" << m_spectrumBufferLength + << "spectrumAnalyser.isReady" << m_spectrumAnalyser.isReady(); + + if(m_spectrumAnalyser.isReady()) { + //m_spectrumBuffer = QByteArray::fromRawData(m_buffer.constData() + position - m_bufferPosition, + // m_spectrumBufferLength); + m_spectrumPosition = position; + //m_spectrumAnalyser.calculate(m_spectrumBuffer, m_format); + } + +#endif +} + +void AudioEngine::calculateTotalSpectrum() { + + // QThread::currentThread is marked 'for internal use only', but + // we're only using it for debug output here, so it's probably OK :) + AUDIO_ENGINE_DEBUG << "calculateTotalSpectrum" << QThread::currentThread() + //<< "count" << m_count << "pos" << position << "len" << m_spectrumBufferLength + << "spectrumAnalyser.isReady" << m_spectrumAnalyser.isReady(); + + if(m_spectrumAnalyser.isReady()) { + + //m_spectrumBuffer = QByteArray::fromRawData(m_buffer.constData() + position - m_bufferPosition, m_spectrumBufferLength); + m_spectrumBuffer = QByteArray::fromRawData(m_buffer.constData(), m_bufferLength); + + m_spectrumAnalyser.calculateTotal(0, m_dataLength, m_format, m_spectrumBuffer); + } +} + +void AudioEngine::setFormat(const QAudioFormat &format) { + + const bool changed = (format != m_format); + m_format = format; + m_levelBufferLength = audioLength(m_format, LevelWindowUs); + m_spectrumBufferLength = SpectrumLengthSamples * (m_format.sampleSize() / 8) * m_format.channelCount(); + if (changed) + emit formatChanged(this, m_format); +} + +void AudioEngine::setLevel(qreal rmsLevel, qreal peakLevel, int numSamples) { + + m_rmsLevel = rmsLevel; + m_peakLevel = peakLevel; + emit levelChanged(m_rmsLevel, m_peakLevel, numSamples); +} + +#ifdef DUMP_DATA +void AudioEngine::createOutputDir() +{ + m_outputDir.setPath("output"); + + // Ensure output directory exists and is empty + if (m_outputDir.exists()) { + const QStringList files = m_outputDir.entryList(QDir::Files); + QString file; + foreach (file, files) + m_outputDir.remove(file); + } else { + QDir::current().mkdir("output"); + } +} +#endif // DUMP_DATA + +#ifdef DUMP_AUDIO +void AudioEngine::dumpData() +{ + const QString txtFileName = m_outputDir.filePath("data.txt"); + QFile txtFile(txtFileName); + txtFile.open(QFile::WriteOnly | QFile::Text); + QTextStream stream(&txtFile); + const qint16 *ptr = reinterpret_cast(m_buffer.constData()); + const int numSamples = m_dataLength / (2 * m_format.channelCount()); + for (int i=0; i0) { + + m_data = new char[ m_dataLength ]; + } + else + m_data = 0; +}; + +AudiofileBuffer *AudiofileBuffer::loadWav(QString fileName) { + + QFile *wavFile = new QFile(fileName); + + if (wavFile->open(QIODevice::ReadOnly)) { + + SWavHeader header; + + wavFile->read(header.chunkID, 4); + if (header.chunkID[0]!='R' || header.chunkID[1]!='I' || + header.chunkID[2]!='F' || header.chunkID[3]!='F') + return 0; // incorrect header + + wavFile->read((char*)&header.chunkSize, 4); + wavFile->read((char*)&header.format, 4); + + if (header.format[0]!='W' || header.format[1]!='A' || + header.format[2]!='V' || header.format[3]!='E') + return 0; // incorrect header + + wavFile->read((char*)&header.subchunk1id, 4); + if (header.subchunk1id[0]!='f' || header.subchunk1id[1]!='m' || + header.subchunk1id[2]!='t' || header.subchunk1id[3]!=' ') + return 0; // incorrect header + + wavFile->read((char*)&header.subchunk1size, 4); + wavFile->read((char*)&header.audioFormat, 2); + wavFile->read((char*)&header.nofChannels, 2); + wavFile->read((char*)&header.sampleRate, 4); + wavFile->read((char*)&header.byteRate, 4); + wavFile->read((char*)&header.blockAlign, 2); + wavFile->read((char*)&header.bitsPerSample, 2); + + AUDIO_ENGINE_DEBUG << fileName << " opened."; + + while (1) { + + if (wavFile->read((char*)&header.subchunk2id, 4) != 4) return 0; + if (wavFile->read((char*)&header.subchunk2size, 4) != 4) return 0; + + //int deb_size = header.subchunk2size; + //char tes[4]; + //memcpy(tes, header.subchunk2id, 4 ); + //if (header.subchunk2id[0]!='d' || header.subchunk2id[1]!='a' || header.subchunk2id[2]!='t' || header.subchunk2id[3]!='a') return 0; // incorrect header + + if (header.subchunk2id[0]=='d' && header.subchunk2id[1]=='a' && + header.subchunk2id[2]=='t' && header.subchunk2id[3]=='a') + break; // found the data, chunk + + // this was not the data-chunk. skip it + if (header.subchunk2size < 1) return 0; // error in file + char *unused = new char[header.subchunk2size]; + wavFile->read(unused, header.subchunk2size ); + delete [] unused; + } + + // the data follows. + if (header.subchunk2size < 1) return 0; + + AudiofileBuffer *rval = new AudiofileBuffer; + rval->m_nofChannels = header.nofChannels; + rval->m_bitsPerSample = header.bitsPerSample; + rval->m_samplesPerSec = header.sampleRate; + rval->m_signedData = 0; // where to know this? + rval->reallocate(header.subchunk2size); + + wavFile->read((char*)rval->m_data, header.subchunk2size); + + // choose a good sampling function. + rval->m_sampleFunction = 0; + if (rval->m_nofChannels == 1) { + + if (rval->m_bitsPerSample == 8) + rval->m_sampleFunction = sampleFunction8bitMono; + if (rval->m_bitsPerSample == 16) + rval->m_sampleFunction = sampleFunction16bitMono; + + } + else { + + if (rval->m_bitsPerSample == 8) + rval->m_sampleFunction = sampleFunction8bitStereo; + if (rval->m_bitsPerSample == 16) + rval->m_sampleFunction = sampleFunction16bitStereo; + } + + return rval; + + } + else { + + AUDIO_ENGINE_DEBUG << fileName << " NOT opened"; + return 0; + } + + delete wavFile; + }; + +AUDIO_SAMPLE_TYPE AudiofileBuffer::sampleFunction8bitMono(AudiofileBuffer *abuffer, int pos, int channel) { + + Q_UNUSED(channel) + return (AUDIO_SAMPLE_TYPE)(((unsigned char*)(abuffer->m_data))[pos]-128) << 8; +}; + +AUDIO_SAMPLE_TYPE AudiofileBuffer::sampleFunction16bitMono(AudiofileBuffer *abuffer, int pos, int channel) { + + Q_UNUSED(channel) + return (AUDIO_SAMPLE_TYPE)(((short*)(abuffer->m_data))[pos]); +}; + +AUDIO_SAMPLE_TYPE AudiofileBuffer::sampleFunction8bitStereo(AudiofileBuffer *abuffer, int pos, int channel) { + + return ((AUDIO_SAMPLE_TYPE)(((char*)(abuffer->m_data))[pos*abuffer->m_nofChannels + channel]) << 8); +}; + +AUDIO_SAMPLE_TYPE AudiofileBuffer::sampleFunction16bitStereo(AudiofileBuffer *abuffer, int pos, int channel) { + + return (AUDIO_SAMPLE_TYPE)(((short*)(abuffer->m_data))[pos*abuffer->m_nofChannels + channel]); +}; diff --git a/Source/src/AudioEngine/cusdr_audio_engine.h b/Source/src/AudioEngine/cusdr_audio_engine.h new file mode 100644 index 0000000..972a53b --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_engine.h @@ -0,0 +1,442 @@ +/** +* @file cusdr_audio_engine.h +* @brief cuSDR audio engine header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef _CUSDR_AUDIOENGINE_H +#define _CUSDR_AUDIOENGINE_H + +#include "cusdr_audio_spectrum.h" +#include "cusdr_audio_spectrumanalyser.h" +#include "cusdr_audio_wavfile.h" +#include "cusdr_audio_settingsdialog.h" + +//#include +//#include +//#include +//#include +//#include + +#ifdef LOG_AUDIO_ENGINE +# define AUDIO_ENGINE_DEBUG qDebug().nospace() << "AudioEngine::\t" +#else +# define AUDIO_ENGINE_DEBUG nullDebug() +#endif + + +#ifdef DUMP_CAPTURED_AUDIO +#define DUMP_DATA +#endif + +#ifdef DUMP_SPECTRUM +#define DUMP_DATA +#endif + +#ifdef DUMP_DATA +#include +#endif + +#define AUDIO_SAMPLE_TYPE short + +//class SettingsDialog; +class FrequencySpectrum; + +QT_FORWARD_DECLARE_CLASS(QAudioInput) +QT_FORWARD_DECLARE_CLASS(QAudioOutput) +QT_FORWARD_DECLARE_CLASS(QFile) + + +class AudiofileBuffer; + +typedef AUDIO_SAMPLE_TYPE(*SAMPLE_FUNCTION_TYPE)(AudiofileBuffer *abuffer, int pos, int channel); + + +/** + * This class interfaces with the QtMultimedia audio classes. Its role is + * to manage the capture and playback of audio data. + */ + +class AudioEngine : public QWidget { + Q_OBJECT + +public: + //AudioEngine(QObject *parent = 0); + AudioEngine(QWidget *parent = 0); + ~AudioEngine(); + + const QList& availableAudioInputDevices() const + { return m_availableAudioInputDevices; } + + const QList& availableAudioOutputDevices() const + { return m_availableAudioOutputDevices; } + + QAudio::Mode mode() const { return m_mode; } + QAudio::State state() const { return m_state; } + + /** + * \return Current audio format + * \note May be QAudioFormat() if engine is not initialized + */ + const QAudioFormat& format() const { return m_format; } + + /** + * Stop any ongoing recording or playback, and reset to ground state. + */ + void reset(); + + /** + * Load data from WAV file + */ + bool loadFile(const QString &fileName); + + /** + * Generate tone + */ + bool generateTone(const Tone &tone); + + /** + * Generate tone + */ + //bool generateSweptTone(qreal amplitude); + bool generateSweptTone(); + + /** + * Generate local chirp signal + */ + bool generateLocalChirp(); + + /** + * Initialize for recording + */ + bool initializeRecord(); + + /** + * Position of the audio input device. + * \return Position in bytes. + */ + qint64 recordPosition() const { return m_recordPosition; } + + /** + * RMS level of the most recently processed set of audio samples. + * \return Level in range (0.0, 1.0) + */ + qreal rmsLevel() const { return m_rmsLevel; } + + /** + * Peak level of the most recently processed set of audio samples. + * \return Level in range (0.0, 1.0) + */ + qreal peakLevel() const { return m_peakLevel; } + + /** + * Position of the audio output device. + * \return Position in bytes. + */ + qint64 playPosition() const { return m_playPosition; } + + /** + * Length of the internal engine buffer. + * \return Buffer length in bytes. + */ + qint64 bufferLength() const; + + /** + * Amount of data held in the buffer. + * \return Data length in bytes. + */ + qint64 dataLength() const { return m_dataLength; } + + /** + * Set window function applied to audio data before spectral analysis. + */ + void setWindowFunction(WindowFunction type); + +public slots: + void startRecording(); + void startPlayback(); + void showSettingsDialog(); + void suspend(); + void setAudioInputDevice(const QAudioDeviceInfo &device); + void setAudioOutputDevice(const QAudioDeviceInfo &device); + + void setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + /** + * set Chirp tone parameters + */ + void setChirpSignalMode(QObject *); + //void generateChirpSignal(const SweptTone &tone); + void generateAudioChirpSignal(const SweptTone &tone, const QAudioFormat &format, QByteArray &buffer); + void setChirpLowerFrequency(QObject *sender, int lo); + void setChirpUpperFrequency(QObject *sender, int lo); + void setChirpAmplitude(QObject *sender, qreal amp); + void setChirpBufferDurationUs(QObject *sender, qint64 value); + void setChirpRepetitionTimes(QObject *sender, int value); + void sampleRateChanged(QObject *sender, int value); + +signals: + void stateChanged(QAudio::Mode mode, QAudio::State state); + + /** + * Informational message for non-modal display + */ + void messageEvent(QString msg); + void infoMessage(const QString &message, int durationMs); + + /** + * Error message for modal display + */ + void errorMessage(const QString &heading, const QString &detail); + + /** + * Format of audio data has changed + */ + void formatChanged(QObject *sender, const QAudioFormat &format); + + /** + * Length of buffer has changed. + * \param duration Duration in microseconds + */ + void bufferLengthChanged(qint64 duration); + + /** + * Amount of data in buffer has changed. + * \param Length of data in bytes + */ + void dataLengthChanged(qint64 duration); + + /** + * Position of the audio input device has changed. + * \param position Position in bytes + */ + void recordPositionChanged(qint64 position); + + /** + * Position of the audio output device has changed. + * \param position Position in bytes + */ + void playPositionChanged(QObject *sender, qint64 position); + + /** + * Level changed + * \param rmsLevel RMS level in range 0.0 - 1.0 + * \param peakLevel Peak level in range 0.0 - 1.0 + * \param numSamples Number of audio samples analyzed + */ + void levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples); + + /** + * Spectrum has changed. + * \param position Position of start of window in bytes + * \param length Length of window in bytes + * \param spectrum Resulting frequency spectrum + */ + void spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); + + /** + * Buffer containing audio data has changed. + * \param position Position of start of buffer in bytes + * \param buffer Buffer + */ + void bufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + //void chirpBufferChanged(qint64 length, const QList &buffer); + + void chirpSignalChanged(); + void audiofileBufferChanged(const QList &buffer); + +private slots: + void audioNotify(); + void audioStateChanged(QAudio::State state); + void audioDataReady(); + void spectrumChanged(const FrequencySpectrum &spectrum); + void spectrumListChanged(const QList &spectrumList); + +private: + void setupConnections(); + void resetAudioDevices(); + bool initializePCMS16LE(); + bool initializePCMS32LE(); + bool selectFormat(); + void stopRecording(); + void stopPlayback(); + void setAudioState(QAudio::State state); + void setAudioState(QAudio::Mode mode, QAudio::State state); + void setFormat(const QAudioFormat &format); + void setRecordPosition(qint64 position, bool forceEmit = false); + void setPlayPosition(qint64 position, bool forceEmit = false); + void calculateLevel(qint64 position, qint64 length); + void calculateSpectrum(qint64 position); + void calculateTotalSpectrum(); + void setLevel(qreal rmsLevel, qreal peakLevel, int numSamples); + +#ifdef DUMP_DATA + void createOutputDir(); + QString outputPath() const { return m_outputDir.path(); } +#endif + +#ifdef DUMP_CAPTURED_AUDIO + void dumpData(); +#endif + +private: + Settings *set; + + QAudio::Mode m_mode; + QAudio::State m_state; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QString m_message; + + bool m_generateTone; + bool m_generateLocalChirp; + SweptTone m_tone; + int m_lowerChirpFreq; + int m_upperChirpFreq; + qreal m_chirpAmplitude; + int m_chirpSamplingFreq; + int m_downRate; + qint64 m_chirpBufferDurationUs; + int m_chirpChannels; + int m_chirpRepetition; + + WavFile *m_file; + // We need a second file handle via which to read data into m_buffer + // for analysis + WavFile *m_analysisFile; + + QAudioFormat m_format; + + const QList m_availableAudioInputDevices; + QAudioDeviceInfo m_audioInputDevice; + QAudioInput* m_audioInput; + QIODevice* m_audioInputIODevice; + qint64 m_recordPosition; + + const QList m_availableAudioOutputDevices; + QAudioDeviceInfo m_audioOutputDevice; + QAudioOutput* m_audioOutput; + qint64 m_playPosition; + QBuffer m_audioOutputIODevice; + + QByteArray m_buffer; + qint64 m_bufferPosition; + qint64 m_bufferLength; + qint64 m_dataLength; + + int m_levelBufferLength; + qreal m_rmsLevel; + qreal m_peakLevel; + + int m_spectrumBufferLength; + QByteArray m_spectrumBuffer; + SpectrumAnalyser m_spectrumAnalyser; + qint64 m_spectrumPosition; + + int m_count; + + SettingsDialog* setDialog; + + int m_sampleRate; + + AudiofileBuffer *m_audioFileBuffer; + +#ifdef DUMP_DATA + QDir m_outputDir; +#endif + +}; + + +// ********************************************************************* +// AudiofileBuffer Class + +class AudiofileBuffer { + +public: + AudiofileBuffer(); + virtual ~AudiofileBuffer(); + + static AudiofileBuffer *loadWav(QString fileName); + //static AudiofileBuffer *loadWav( FILE *wavFile ); // support for stdio + + void reallocate( int length ); + + inline void *getRawData() { return m_data; } + inline int getDataLength() { return m_dataLength; } + + inline int getBytesPerSample() { return (m_bitsPerSample >> 3); } + inline int getBitsPerSample() { return m_bitsPerSample; } + inline int getSamplesPerSec() { return m_samplesPerSec; } + inline short getNofChannels() { return m_nofChannels; } + + inline SAMPLE_FUNCTION_TYPE getSampleFunction() { return m_sampleFunction; } + + // static implementations of sample functions + static AUDIO_SAMPLE_TYPE sampleFunction8bitMono(AudiofileBuffer *abuffer, int pos, int channel); + static AUDIO_SAMPLE_TYPE sampleFunction16bitMono(AudiofileBuffer *abuffer, int pos, int channel); + static AUDIO_SAMPLE_TYPE sampleFunction8bitStereo(AudiofileBuffer *abuffer, int pos, int channel); + static AUDIO_SAMPLE_TYPE sampleFunction16bitStereo(AudiofileBuffer *abuffer, int pos, int channel); + +protected: + SAMPLE_FUNCTION_TYPE m_sampleFunction; + + short m_nofChannels; + void *m_data; + int m_dataLength; // in bytes + short m_bitsPerSample; + bool m_signedData; + int m_samplesPerSec; +}; + +#endif // _CUSDR_AUDIOENGINE_H diff --git a/Source/src/AudioEngine/cusdr_audio_settingsdialog.cpp b/Source/src/AudioEngine/cusdr_audio_settingsdialog.cpp new file mode 100644 index 0000000..33d36b2 --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_settingsdialog.cpp @@ -0,0 +1,226 @@ +/** +* @file cusdr_audio_settingsdialog.cpp +* @brief cuSDR audio settings dialogue class +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cusdr_audio_settingsdialog.h" +#include "Util/cusdr_buttons.h" + + +#include +#include +#include +#include +#include +#include +#include +#include + +#define btn_height 18 +#define btn_width 74 + +SettingsDialog::SettingsDialog( + const QList &availableInputDevices, + const QList &availableOutputDevices, + QWidget *parent) + : QDialog(parent) + , set(Settings::instance()) + , m_inputDeviceComboBox(new QComboBox(this)) + , m_outputDeviceComboBox(new QComboBox(this)) + //, m_windowFunction(DefaultWindowFunction) + //, m_windowFunctionComboBox(new QComboBox(this)) +{ + if (parent) + setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); + else + setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + + setWindowModality(Qt::NonModal); + setWindowOpacity(0.9); + setStyleSheet(set->getDialogStyle()); + + setMouseTracking(true); + + m_titleFont.setStyleStrategy(QFont::PreferAntialias); + m_titleFont.setFixedPitch(true); + #ifdef Q_OS_MAC + m_titleFont.setPixelSize(10); + m_titleFont.setFamily("Arial"); + //m_titleFont.setBold(true); + #endif + #ifdef Q_OS_WIN + m_titleFont.setPixelSize(13); + m_titleFont.setFamily("Arial"); + m_titleFont.setBold(true); + //m_titleFont.setItalic(true); + #endif + + QVBoxLayout *dialogLayout = new QVBoxLayout(this); + + // Populate combo boxes + + QAudioDeviceInfo device; + foreach (device, availableInputDevices) + m_inputDeviceComboBox->addItem(device.deviceName(), + qVariantFromValue(device)); + foreach (device, availableOutputDevices) + m_outputDeviceComboBox->addItem(device.deviceName(), + qVariantFromValue(device)); + + //m_windowFunctionComboBox->addItem(tr("None"), qVariantFromValue(int(NoWindow))); + //m_windowFunctionComboBox->addItem("Hann", qVariantFromValue(int(HannWindow))); + //m_windowFunctionComboBox->setCurrentIndex(m_windowFunction); + + m_inputDeviceComboBox->setStyleSheet(set->getComboBoxStyle()); + m_inputDeviceComboBox->setMinimumContentsLength(30); + m_outputDeviceComboBox->setStyleSheet(set->getComboBoxStyle()); + m_outputDeviceComboBox->setMinimumContentsLength(30); + + // Initialize default devices + if (!availableInputDevices.empty()) + m_inputDevice = availableInputDevices.front(); + if (!availableOutputDevices.empty()) + m_outputDevice = availableOutputDevices.front(); + + // Add widgets to layout + + QScopedPointer titleLayout(new QHBoxLayout); + QLabel *titleLabel = new QLabel(tr("Audio Settings:"), this); + titleLabel->setFont(m_titleFont); + titleLabel->setStyleSheet(set->getLabelStyle()); + titleLayout->addWidget(titleLabel); + dialogLayout->addLayout(titleLayout.data()); + titleLayout.take(); // ownership transferred to dialogLayout + + QScopedPointer inputDeviceLayout(new QHBoxLayout); + QLabel *inputDeviceLabel = new QLabel(tr("Input device"), this); + inputDeviceLabel->setStyleSheet(set->getLabelStyle()); + inputDeviceLayout->addWidget(inputDeviceLabel); + inputDeviceLayout->addWidget(m_inputDeviceComboBox); + dialogLayout->addLayout(inputDeviceLayout.data()); + inputDeviceLayout.take(); // ownership transferred to dialogLayout + + QScopedPointer outputDeviceLayout(new QHBoxLayout); + QLabel *outputDeviceLabel = new QLabel(tr("Output device"), this); + outputDeviceLabel->setStyleSheet(set->getLabelStyle()); + outputDeviceLayout->addWidget(outputDeviceLabel); + outputDeviceLayout->addWidget(m_outputDeviceComboBox); + dialogLayout->addLayout(outputDeviceLayout.data()); + outputDeviceLayout.take(); // ownership transferred to dialogLayout + + //QScopedPointer windowFunctionLayout(new QHBoxLayout); + //QLabel *windowFunctionLabel = new QLabel(tr("Window function"), this); + //windowFunctionLayout->addWidget(windowFunctionLabel); + //windowFunctionLayout->addWidget(m_windowFunctionComboBox); + //dialogLayout->addLayout(windowFunctionLayout.data()); + //windowFunctionLayout.take(); // ownership transferred to dialogLayout + + // Connect + CHECKED_CONNECT( + m_inputDeviceComboBox, + SIGNAL(activated(int)), + this, + SLOT(inputDeviceChanged(int))); + + CHECKED_CONNECT( + m_outputDeviceComboBox, + SIGNAL(activated(int)), + this, + SLOT(outputDeviceChanged(int))); + + /*CHECKED_CONNECT( + m_windowFunctionComboBox, + SIGNAL(activated(int)), + this, + SLOT(windowFunctionChanged(int)));*/ + + AeroButton* okBtn = new AeroButton("Ok", this); + okBtn->setRoundness(10); + okBtn->setFixedSize(btn_width, btn_height); + CHECKED_CONNECT( + okBtn, + SIGNAL(clicked()), + this, + SLOT(accept())); + + AeroButton* cancelBtn = new AeroButton("Cancel", this); + cancelBtn->setRoundness(10); + cancelBtn->setFixedSize(btn_width, btn_height); + CHECKED_CONNECT( + cancelBtn, + SIGNAL(clicked()), + this, + SLOT(reject())); + + QHBoxLayout *hbox = new QHBoxLayout; + hbox->setSpacing(1); + hbox->addWidget(okBtn); + hbox->addWidget(cancelBtn); + + dialogLayout->addLayout(hbox); + + setLayout(dialogLayout); +} + +SettingsDialog::~SettingsDialog() { +} + +//void SettingsDialog::windowFunctionChanged(int index) +//{ +// m_windowFunction = static_cast( +// m_windowFunctionComboBox->itemData(index).value()); +//} + +void SettingsDialog::inputDeviceChanged(int index) { + + m_inputDevice = m_inputDeviceComboBox->itemData(index).value(); +} + +void SettingsDialog::outputDeviceChanged(int index) { + + m_outputDevice = m_outputDeviceComboBox->itemData(index).value(); +} + diff --git a/Source/src/AudioEngine/cusdr_audio_settingsdialog.h b/Source/src/AudioEngine/cusdr_audio_settingsdialog.h new file mode 100644 index 0000000..6b5142f --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_settingsdialog.h @@ -0,0 +1,100 @@ +/** +* @file cusdr_audio_settingsdialog.h +* @brief cuSDR audio settings dialogue header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +//#include "spectrum.h" +#include +#include + +#include "cusdr_settings.h" + +QT_FORWARD_DECLARE_CLASS(QComboBox) +QT_FORWARD_DECLARE_CLASS(QCheckBox) +QT_FORWARD_DECLARE_CLASS(QSlider) +QT_FORWARD_DECLARE_CLASS(QSpinBox) +QT_FORWARD_DECLARE_CLASS(QGridLayout) + +/** + * Dialog used to control settings such as the audio input / output device + * and the windowing function. + */ +class SettingsDialog : public QDialog { + Q_OBJECT +public: + SettingsDialog(const QList &availableInputDevices, + const QList &availableOutputDevices, + QWidget *parent = 0); + ~SettingsDialog(); + + //WindowFunction windowFunction() const { return m_windowFunction; } + const QAudioDeviceInfo& inputDevice() const { return m_inputDevice; } + const QAudioDeviceInfo& outputDevice() const { return m_outputDevice; } + +private slots: + //void windowFunctionChanged(int index); + void inputDeviceChanged(int index); + void outputDeviceChanged(int index); + +private: + Settings* set; + + QFont m_titleFont; + //WindowFunction m_windowFunction; + QAudioDeviceInfo m_inputDevice; + QAudioDeviceInfo m_outputDevice; + + QComboBox* m_inputDeviceComboBox; + QComboBox* m_outputDeviceComboBox; + + //QComboBox* m_windowFunctionComboBox; + +}; + +#endif // SETTINGSDIALOG_H diff --git a/Source/src/AudioEngine/cusdr_audio_spectrum.h b/Source/src/AudioEngine/cusdr_audio_spectrum.h new file mode 100644 index 0000000..ae831e8 --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_spectrum.h @@ -0,0 +1,142 @@ +/** +* @file cusdr_audio_spectrum.h +* @brief cuSDR audio engine spectrum header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef _CUSDR_AUDIO_SPECTRUM_H +#define _CUSDR_AUDIO_SPECTRUM_H + +#include +#include "cusdr_audio_utils.h" +//#include "fftreal_wrapper.h" // For FFTLengthPowerOfTwo + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +// Number of audio samples used to calculate the frequency spectrum +//const int SpectrumLengthSamples = PowerOfTwo::Result; +const int SpectrumLengthSamples = 2048;//4096;//1024;//256;//512;// + +// Number of bands in the frequency spectrum +const int SpectrumNumBands = 10; + +// Lower bound of first band in the spectrum +const qreal SpectrumLowFreq = 0.0; // Hz + +// Upper band of last band in the spectrum +const qreal SpectrumHighFreq = 1000.0; // Hz + +// Waveform window size in microseconds +const qint64 WaveformWindowDuration = 500 * 1000; + +// Length of waveform tiles in bytes +// Ideally, these would match the QAudio*::bufferSize(), but that isn't +// available until some time after QAudio*::start() has been called, and we +// need this value in order to initialize the waveform display. +// We therefore just choose a sensible value. +const int WaveformTileLength = 4096; + +// Fudge factor used to calculate the spectrum bar heights +const qreal SpectrumAnalyserMultiplier = 0.15; + +// Disable message timeout +const int NullMessageTimeout = -1; + + +//----------------------------------------------------------------------------- +// Types and data structures +//----------------------------------------------------------------------------- + +enum WindowFunction { + NoWindow, + HannWindow, + BlackmanHarrisWindow +}; + +const WindowFunction DefaultWindowFunction = HannWindow;//NoWindow;//BlackmanHarrisWindow;// + +struct Tone { + Tone(qreal freq = 0.0, qreal amp = 0.0, qint64 dur = 0) + : frequency(freq), amplitude(amp), duration(dur) + { } + + // Start and end frequencies for swept tone generation + qreal frequency; + + // Amplitude in range [0.0, 1.0] + qreal amplitude; + + // tone duration in micro seconds + qint64 duration; +}; + +struct SweptTone { + SweptTone(qreal start = 0.0, qreal end = 0.0, qreal amp = 0.0, qint64 dur = 0) + : startFreq(start), endFreq(end), amplitude(amp), duration(dur) + { Q_ASSERT(end >= start); } + + SweptTone(const Tone &tone) + : startFreq(tone.frequency), endFreq(tone.frequency), amplitude(tone.amplitude), duration(tone.duration) + { } + + // Start and end frequencies for swept tone generation + qreal startFreq; + qreal endFreq; + + // Amplitude in range [0.0, 1.0] + qreal amplitude; + + // tone duration in micro seconds + qint64 duration; +}; + +#ifdef DISABLE_WAVEFORM +#undef SUPERIMPOSE_PROGRESS_ON_WAVEFORM +#endif + +#endif // _CUSDR_AUDIO_SPECTRUM_H + diff --git a/Source/src/AudioEngine/cusdr_audio_spectrumanalyser.cpp b/Source/src/AudioEngine/cusdr_audio_spectrumanalyser.cpp new file mode 100644 index 0000000..a5df29b --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_spectrumanalyser.cpp @@ -0,0 +1,422 @@ +/** +* @file cusdr_audio_spectrumanalyser.cpp +* @brief cuSDR audio engine spectrumanalyser class +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ +//#define LOG_SPECTRUMANALYSER +//#define DUMP_SPECTRUMANALYSER + +#include "cusdr_audio_spectrumanalyser.h" +#include "cusdr_audio_utils.h" +#include "cusdr_settings.h" + +#include +#include +#include + + + +SpectrumAnalyserThread::SpectrumAnalyserThread(QObject *parent) + : QObject(parent) + , set(Settings::instance()) + , m_numSamples(SpectrumLengthSamples) + , m_windowFunction(DefaultWindowFunction) + , m_window(SpectrumLengthSamples, 0.0) + , m_input(SpectrumLengthSamples, 0.0) + , m_output(SpectrumLengthSamples, 0.0) + , m_spectrum(SpectrumLengthSamples) +#ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD + , m_thread(new QThread(this)) +#endif +{ +#ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD + // moveToThread() cannot be called on a QObject with a parent + setParent(0); + moveToThread(m_thread); + m_thread->start(); +#endif + + //m_cpxInput = mallocCPX(SpectrumLengthSamples); + m_cpxInput.resize(SpectrumLengthSamples); + //m_cpxOutput = mallocCPX(SpectrumLengthSamples); + m_cpxOutput.resize(SpectrumLengthSamples); + + m_fft = new QFFT(SpectrumLengthSamples); + + //memset(m_cpxInput, 0, SpectrumLengthSamples * sizeof(CPX)); + //memset(m_cpxOutput, 0, SpectrumLengthSamples * sizeof(CPX)); + + calculateWindow(); +} + +SpectrumAnalyserThread::~SpectrumAnalyserThread() { + + delete m_fft; +} + +void SpectrumAnalyserThread::setWindowFunction(WindowFunction type) { + + m_windowFunction = type; + calculateWindow(); +} + +void SpectrumAnalyserThread::calculateWindow() { + + for (int i = 0; i < m_numSamples; ++i) { + + DataType x = 0.0; + + switch (m_windowFunction) { + + case NoWindow: + x = 1.0; + break; + + case HannWindow: + x = 0.5 * (1 - qCos((TWOPI * i) / (m_numSamples - 1))); + break; + + case BlackmanHarrisWindow: { + float + a0 = 0.35875F, + a1 = 0.48829F, + a2 = 0.14128F, + a3 = 0.01168F; + + + x = a0 - a1* cos(TWOPI * (i + 0.5) / m_numSamples) + + a2* cos(2.0 * TWOPI * (i + 0.5) / m_numSamples) + - a3* cos(3.0 * TWOPI * (i + 0.5) / m_numSamples); + } + break; + + default: + Q_ASSERT(false); + } + + m_window[i] = x; + } +} + +void SpectrumAnalyserThread::calculateTotalSpectrum(const QByteArray &buffer, int inputFrequency, int bytesPerSample) { + + if (m_spectrumList.count() > 0) + m_spectrumList.clear(); + + int samples = bytesPerSample * m_numSamples; + int buffers = qRound((float) buffer.size() / samples); + + // cycle over all buffers + for (int i = 0; i < buffers; i++) { + + //if (i == buffers-1 && overhead > 0) + m_tmp = QByteArray::fromRawData(buffer.constData() + i * samples, samples); + + //Q_ASSERT(m_tmp.size() == m_numSamples * bytesPerSample); + + // Initialize data array + const char *ptr = m_tmp.constData(); + + for (int j = 0; j < m_numSamples; ++j) { + + const qint16 pcmSample = *reinterpret_cast(ptr); + // Scale down to range [-1.0, 1.0] + const DataType realSample = pcmToReal(pcmSample); + const DataType windowedSample = realSample * m_window[j]; + + m_cpxInput[j].re = windowedSample; + m_cpxInput[j].im = 0.0f; + + ptr += bytesPerSample; + } + + // calculate the FFT + m_fft->DoFFTWForward(m_cpxInput, m_cpxOutput, SpectrumLengthSamples); + + /*for (int i = 0; i < BUFFER_SIZE; i += 32) { + qDebug() << "m_cpxOutput.re =" << m_cpxOutput[i].re << "m_cpxOutput.im =" << m_cpxOutput[i].im; + }*/ + + // Analyze output to obtain amplitude and phase for each frequency + for (int i = 2; i <= m_numSamples / 2; ++i) { + + // Calculate frequency of this complex sample + m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples); + + //const qreal real = m_output[i]; + const qreal real = m_cpxOutput[i].re; + qreal imag = 0.0; + + if (i > 0 && i < m_numSamples / 2) + imag = m_cpxOutput[m_numSamples/2 + i].re; + + const qreal magnitude = sqrt(real*real + imag*imag); + qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude); + + // Bound amplitude to [0.0, 1.0] + m_spectrum[i].clipped = (amplitude > 1.0); + amplitude = qMax(qreal(0.0), amplitude); + amplitude = qMin(qreal(1.0), amplitude); + m_spectrum[i].amplitude = amplitude; + } + m_spectrumList.append(m_spectrum); + } + emit calculationTotalComplete(m_spectrumList); +} + +void SpectrumAnalyserThread::calculateSpectrum(const QByteArray &buffer, int inputFrequency, int bytesPerSample) { + + Q_ASSERT(buffer.size() == m_numSamples * bytesPerSample); + + // Initialize data array + const char *ptr = buffer.constData(); + for (int i = 0; i < m_numSamples; ++i) { + + const qint16 pcmSample = *reinterpret_cast(ptr); + // Scale down to range [-1.0, 1.0] + const DataType realSample = pcmToReal(pcmSample); + const DataType windowedSample = realSample * m_window[i]; + m_input[i] = windowedSample; + m_cpxInput[i].re = windowedSample; + m_cpxInput[i].im = 0.0f; + ptr += bytesPerSample; + } + + // Calculate the FFT + m_fft->DoFFTWForward(m_cpxInput, m_cpxOutput, SpectrumLengthSamples); + + // Analyze output to obtain amplitude and phase for each frequency + for (int i = 2; i <= m_numSamples / 2; ++i) { + // Calculate frequency of this complex sample + m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples); + + //const qreal real = m_output[i]; + const qreal real = m_cpxOutput[i].re; + qreal imag = 0.0; + if (i > 0 && i < m_numSamples / 2) + //imag = m_output[m_numSamples/2 + i]; + imag = m_cpxOutput[m_numSamples/2 + i].re; + + const qreal magnitude = sqrt(real*real + imag*imag); + qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude); + + // Bound amplitude to [0.0, 1.0] + m_spectrum[i].clipped = (amplitude > 1.0); + amplitude = qMax(qreal(0.0), amplitude); + amplitude = qMin(qreal(1.0), amplitude); + m_spectrum[i].amplitude = amplitude; + } + + emit calculationComplete(m_spectrum); +} + + + +//============================================================================= +// SpectrumAnalyser +//============================================================================= + +SpectrumAnalyser::SpectrumAnalyser(QObject *parent) + : QObject(parent) + , m_thread(new SpectrumAnalyserThread(this)) + , m_state(Idle) +#ifdef DUMP_SPECTRUMANALYSER + , m_count(0) +#endif +{ + CHECKED_CONNECT( + m_thread, + SIGNAL(calculationComplete(FrequencySpectrum)), + this, + SLOT(calculationComplete(FrequencySpectrum))); + + CHECKED_CONNECT( + m_thread, + SIGNAL(calculationTotalComplete(QList)), + this, + SLOT(calculationTotalComplete(QList))); +} + +SpectrumAnalyser::~SpectrumAnalyser() { +} + +#ifdef DUMP_SPECTRUMANALYSER +void SpectrumAnalyser::setOutputPath(const QString &outputDir) +{ + m_outputDir.setPath(outputDir); + m_textFile.setFileName(m_outputDir.filePath("spectrum.txt")); + m_textFile.open(QIODevice::WriteOnly | QIODevice::Text); + m_textStream.setDevice(&m_textFile); +} +#endif + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +void SpectrumAnalyser::setWindowFunction(WindowFunction type) { + + const bool b = QMetaObject::invokeMethod(m_thread, "setWindowFunction", + Qt::AutoConnection, + Q_ARG(WindowFunction, type)); + Q_ASSERT(b); + Q_UNUSED(b) // suppress warnings in release builds +} + +void SpectrumAnalyser::calculateTotal( + qint64 position, + qint64 length, + const QAudioFormat &format, + const QByteArray &buffer +) { + Q_UNUSED(position) + Q_UNUSED(length) + + SPECTRUMANALYSER_DEBUG << "SpectrumAnalyser::calculateTotal" + << QThread::currentThread() + << "state" << m_state; + + SPECTRUMANALYSER_DEBUG << "buffer size =" << buffer.size(); + + if (isReady()) { + Q_ASSERT(isPCMS16LE(format)); + + const int bytesPerSample = format.sampleSize() * format.channelCount() / 8; + + m_state = Busy; + + // Invoke SpectrumAnalyserThread::calculateTotalSpectrum using QMetaObject. + // If m_thread is in a different thread from the current thread, the + // calculation will be done in the child thread. + // Once the calculation is finished, a calculationChanged signal will be + // emitted by m_thread. + const bool b = QMetaObject::invokeMethod(m_thread, "calculateTotalSpectrum", + Qt::AutoConnection, + Q_ARG(QByteArray, buffer), + Q_ARG(int, format.sampleRate()), + Q_ARG(int, bytesPerSample)); + Q_ASSERT(b); + Q_UNUSED(b) // suppress warnings in release builds + } +} + +void SpectrumAnalyser::calculate(const QByteArray &buffer, + const QAudioFormat &format) +{ + // QThread::currentThread is marked 'for internal use only', but + // we're only using it for debug output here, so it's probably OK :) + SPECTRUMANALYSER_DEBUG << "SpectrumAnalyser::calculate" + << QThread::currentThread() + << "state" << m_state; + + SPECTRUMANALYSER_DEBUG << "buffer size =" << buffer.size(); + + if (isReady()) { + Q_ASSERT(isPCMS16LE(format)); + + const int bytesPerSample = format.sampleSize() * format.channelCount() / 8; + + m_state = Busy; + + // Invoke SpectrumAnalyserThread::calculateSpectrum using QMetaObject. If + // m_thread is in a different thread from the current thread, the + // calculation will be done in the child thread. + // Once the calculation is finished, a calculationChanged signal will be + // emitted by m_thread. + const bool b = QMetaObject::invokeMethod(m_thread, "calculateSpectrum", + Qt::AutoConnection, + Q_ARG(QByteArray, buffer), + Q_ARG(int, format.sampleRate()), + Q_ARG(int, bytesPerSample)); + Q_ASSERT(b); + Q_UNUSED(b) // suppress warnings in release builds + +#ifdef DUMP_SPECTRUMANALYSER + m_textStream << "FrequencySpectrum " << m_count << "\n"; + FrequencySpectrum::const_iterator x = m_spectrum.begin(); + for (int i=0; ifrequency << "\t" + << x->amplitude<< "\t" + << x->phase << "\n"; +#endif + } +} + +bool SpectrumAnalyser::isReady() const { + + return (Idle == m_state); +} + +void SpectrumAnalyser::cancelCalculation() { + + if (Busy == m_state) + m_state = Cancelled; +} + + +//----------------------------------------------------------------------------- +// Private slots +//----------------------------------------------------------------------------- + +void SpectrumAnalyser::calculationComplete(const FrequencySpectrum &spectrum) { + + Q_ASSERT(Idle != m_state); + if (Busy == m_state) + emit spectrumChanged(spectrum); + m_state = Idle; +} + +void SpectrumAnalyser::calculationTotalComplete(const QList &m_spectrumList) { + + Q_ASSERT(Idle != m_state); + if (Busy == m_state) + emit spectrumListChanged(m_spectrumList); + m_state = Idle; +} + + + + diff --git a/Source/src/AudioEngine/cusdr_audio_spectrumanalyser.h b/Source/src/AudioEngine/cusdr_audio_spectrumanalyser.h new file mode 100644 index 0000000..bdf600d --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_spectrumanalyser.h @@ -0,0 +1,229 @@ +/** +* @file cusdr_audio_spectrumanalyser.h +* @brief cuSDR audio engine spectrumanalyser header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef _CUSDR_AUDIO_SPECTRUMANALYSER_H +#define _CUSDR_AUDIO_SPECTRUMANALYSER_H + +#include +#include +#include + +#ifdef DUMP_SPECTRUMANALYSER +#include +#include +#include +#endif + +//#define SPECTRUM_ANALYSER_SEPARATE_THREAD + +//#include "frequencyspectrum.h" +#include "cusdr_audio_spectrum.h" +#include "cusdr_settings.h" +#include "QtDSP/qtdsp_fft.h" +#include "QtDSP/qtdsp_qComplex.h" +//#include "cusdr_filter.h" + +#ifdef LOG_SPECTRUMANALYSER +# define SPECTRUMANALYSER_DEBUG qDebug().nospace() << "SpectrumAnalyzer::\t" +#else +# define SPECTRUMANALYSER_DEBUG nullDebug() +#endif + + +QT_FORWARD_DECLARE_CLASS(QAudioFormat) +QT_FORWARD_DECLARE_CLASS(QThread) + +//class SpectrumAnalyserThreadPrivate; + +/** + * Implementation of the spectrum analysis which can be run in a + * separate thread. + */ +class SpectrumAnalyserThread : public QObject +{ + Q_OBJECT +public: + SpectrumAnalyserThread(QObject *parent); + ~SpectrumAnalyserThread(); + +public slots: + void setWindowFunction(WindowFunction type); + + void calculateSpectrum( + const QByteArray &buffer, + int inputFrequency, + int bytesPerSample); + + void calculateTotalSpectrum( + const QByteArray &buffer, + int inputFrequency, + int bytesPerSample); + +signals: + void calculationComplete(const FrequencySpectrum &spectrum); + void calculationTotalComplete(const QList &spectrumList); + +private: + void calculateWindow(); + +private: + Settings* set; + int m_numSamples; + + WindowFunction m_windowFunction; + + //typedef qreal DataType; + typedef float DataType; + + QVector m_window; + + QVector m_input; + QVector m_output; + + CPX m_cpxInput; + CPX m_cpxOutput; + + QFFT *m_fft; + + QByteArray m_tmp; + + FrequencySpectrum m_spectrum; + + QList m_spectrumList; + +#ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD + QThread* m_thread; +#endif +}; + +/** + * Class which performs frequency spectrum analysis on a window of + * audio samples, provided to it by the Engine. + */ +class SpectrumAnalyser : public QObject +{ + Q_OBJECT +public: + SpectrumAnalyser(QObject *parent = 0); + ~SpectrumAnalyser(); + +#ifdef DUMP_SPECTRUMANALYSER + void setOutputPath(const QString &outputPath); +#endif + +public: + /* + * Set the windowing function which is applied before calculating the FFT + */ + void setWindowFunction(WindowFunction type); + + /* + * Calculate a frequency spectrum + * + * \param buffer Audio data + * \param format Format of audio data + * + * Frequency spectrum is calculated asynchronously. The result is returned + * via the spectrumChanged signal. + * + * An ongoing calculation can be cancelled by calling cancelCalculation(). + * + */ + void calculate(const QByteArray &buffer, const QAudioFormat &format); + + void calculateTotal( + qint64 position, + qint64 length, + const QAudioFormat &format, + const QByteArray &buffer); + + /* + * Check whether the object is ready to perform another calculation + */ + bool isReady() const; + + /* + * Cancel an ongoing calculation + * + * Note that cancelling is asynchronous. + */ + void cancelCalculation(); + +signals: + void spectrumChanged(const FrequencySpectrum &spectrum); + void spectrumListChanged(const QList &spectrumList); + +private slots: + void calculationComplete(const FrequencySpectrum &spectrum); + void calculationTotalComplete(const QList &m_spectrumList); + +private: + void calculateWindow(); + +private: + + SpectrumAnalyserThread* m_thread; + + enum State { + Idle, + Busy, + Cancelled + }; + + State m_state; + +#ifdef DUMP_SPECTRUMANALYSER + QDir m_outputDir; + int m_count; + QFile m_textFile; + QTextStream m_textStream; +#endif +}; + +#endif // _CUSDR_AUDIO_SPECTRUMANALYSER_H + diff --git a/Source/src/AudioEngine/cusdr_audio_utils.cpp b/Source/src/AudioEngine/cusdr_audio_utils.cpp new file mode 100644 index 0000000..0dde2ae --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_utils.cpp @@ -0,0 +1,155 @@ +/** +* @file cusdr_audio_utils.cpp +* @brief cuSDR audio utils class +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "cusdr_audio_utils.h" + +qint64 audioDuration(const QAudioFormat &format, qint64 bytes) { + + return (bytes * 1000000) / + (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8)); +} + +qint64 audioLength(const QAudioFormat &format, qint64 microSeconds) { + + qint64 result = (format.sampleRate() * format.channelCount() * (format.sampleSize() / 8)) + * microSeconds / 1000000; + result -= result % (format.channelCount() * format.sampleSize()); + return result; +} + +qreal nyquistFrequency(const QAudioFormat &format) { + + return format.sampleRate() / 2; +} + +QString formatToString(const QAudioFormat &format) { + + QString result; + + if (QAudioFormat() != format) { + if (format.codec() == "audio/pcm") { + Q_ASSERT(format.sampleType() == QAudioFormat::SignedInt); + + const QString formatEndian = (format.byteOrder() == QAudioFormat::LittleEndian) + ? QString("LE") : QString("BE"); + + QString formatType; + switch(format.sampleType()) { + case QAudioFormat::SignedInt: + formatType = "signed"; + break; + case QAudioFormat::UnSignedInt: + formatType = "unsigned"; + break; + case QAudioFormat::Float: + formatType = "float"; + break; + case QAudioFormat::Unknown: + formatType = "unknown"; + break; + } + + QString formatChannels = QString("%1 channels").arg(format.channelCount()); + switch (format.channelCount()) { + case 1: + formatChannels = "mono"; + break; + case 2: + formatChannels = "stereo"; + break; + } + + result = QString("%1 Hz %2 bit %3 %4 %5") + .arg(format.sampleRate()) + .arg(format.sampleSize()) + .arg(formatType) + .arg(formatEndian) + .arg(formatChannels); + } else { + result = format.codec(); + } + } + + return result; +} + +bool isPCM(const QAudioFormat &format) { + + return (format.codec() == "audio/pcm"); +} + + +bool isPCMS16LE(const QAudioFormat &format) { + + return (isPCM(format) && + format.sampleType() == QAudioFormat::SignedInt && + format.sampleSize() == 16 && + format.byteOrder() == QAudioFormat::LittleEndian); +} + +bool isPCMS32LE(const QAudioFormat &format) { + + return (isPCM(format) && + format.sampleType() == QAudioFormat::SignedInt && + format.sampleSize() == 32 && + format.byteOrder() == QAudioFormat::LittleEndian); +} + +const qint16 PCMS16MaxValue = 32767; +const quint16 PCMS16MaxAmplitude = 32768; // because minimum is -32768 + +qreal pcmToReal(qint16 pcm) { + + return qreal(pcm) / PCMS16MaxAmplitude; +} + +qint16 realToPcm(qreal real) { + + return real * PCMS16MaxValue; +} diff --git a/Source/src/AudioEngine/cusdr_audio_utils.h b/Source/src/AudioEngine/cusdr_audio_utils.h new file mode 100644 index 0000000..ae1046a --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_utils.h @@ -0,0 +1,96 @@ +/** +* @file cusdr_audio_utils.h +* @brief cuSDR audio utils header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef _CUSDR_AUDIO_UTILS_H +#define _CUSDR_AUDIO_UTILS_H + +#include +#include + +#include + +#if defined(Q_OS_WIN32) + QT_FORWARD_DECLARE_CLASS(QAudioFormat) +#endif + +//----------------------------------------------------------------------------- +// Miscellaneous utility functions +//----------------------------------------------------------------------------- + +qint64 audioDuration(const QAudioFormat &format, qint64 bytes); +qint64 audioLength(const QAudioFormat &format, qint64 microSeconds); + +QString formatToString(const QAudioFormat &format); + +qreal nyquistFrequency(const QAudioFormat &format); + +// Scale PCM value to [-1.0, 1.0] +qreal pcmToReal(qint16 pcm); + +// Scale real value in [-1.0, 1.0] to PCM +qint16 realToPcm(qreal real); + +// Check whether the audio format is PCM +bool isPCM(const QAudioFormat &format); + +// Check whether the audio format is signed, little-endian, 16-bit PCM +bool isPCMS16LE(const QAudioFormat &format); + +// Check whether the audio format is float, little-endian, 32-bit PCM +bool isPCMS32LE(const QAudioFormat &format); + +// Compile-time calculation of powers of two + +template class PowerOfTwo +{ public: static const int Result = PowerOfTwo::Result * 2; }; + +template<> class PowerOfTwo<0> +{ public: static const int Result = 1; }; + + +#endif // _CUSDR_AUDIO_UTILS_H diff --git a/Source/src/AudioEngine/cusdr_audio_waveform.cpp b/Source/src/AudioEngine/cusdr_audio_waveform.cpp new file mode 100644 index 0000000..271ca4b --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_waveform.cpp @@ -0,0 +1,484 @@ +/** +* @file cusdr_audio_waveform.cpp +* @brief cuSDR waveform graphics +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ +//#define LOG_WAVEFORM +//#define LOG_PAINT_EVENT + +#include "cusdr_audio_utils.h" +#include "cusdr_audio_waveform.h" + +#include +#include +#include + + + +Waveform::Waveform(QObject *parent) + : QObject(parent) + , set(Settings::instance()) + , m_bufferPosition(0) + , m_bufferLength(0) + , m_audioPosition(0) + , m_active(false) + , m_tileLength(0) + , m_tileArrayStart(0) + , m_windowPosition(0) + , m_windowLength(0) + , m_waveformDisplayWidth(0) +{ +} + +Waveform::~Waveform() { + + deletePixmaps(); +} + +QImage* Waveform::createWaveformImage(const QRect &rect) { + + if (!rect.isValid()) return NULL; + + QImage *image = new QImage(rect.size(), QImage::Format_ARGB32_Premultiplied); + if (!image) return NULL; + + m_waveformDisplayWidth = image->width(); + + image->fill(QColor(0, 0, 0, 255).rgba()); + + QPainter painter(image); + + if (m_active) { + + WAVEFORM_PAINT_DEBUG << "paintEvent" + << "windowPosition" << m_windowPosition + << "windowLength" << m_windowLength; + qint64 pos = m_windowPosition; + const qint64 windowEnd = m_windowPosition + m_windowLength; + int destLeft = 0; + int destRight = 0; + while (pos < windowEnd) { + + const TilePoint point = tilePoint(pos); + WAVEFORM_PAINT_DEBUG << "paintEvent" << "pos" << pos + << "tileIndex" << point.index + << "positionOffset" << point.positionOffset + << "pixelOffset" << point.pixelOffset; + + if (point.index != NullIndex) { + + const Tile &tile = m_tiles[point.index]; + if (tile.painted) { + + const qint64 sectionLength = qMin((m_tileLength - point.positionOffset), + (windowEnd - pos)); + Q_ASSERT(sectionLength > 0); + + const int sourceRight = tilePixelOffset(point.positionOffset + sectionLength); + //destRight = windowPixelOffset(pos - m_windowPosition + sectionLength); + destRight = windowPixelOffset(pos - m_windowPosition + sectionLength, rect); + + QRect destRect = rect;//(); + destRect.setTop(20); + destRect.setHeight(rect.height() - 20); + destRect.setLeft(destLeft); + destRect.setRight(destRight); + //destRect.setRect(0, 0, destLeft + destRight, rect.height()); + + QRect sourceRect(QPoint(), m_pixmapSize); + sourceRect.setLeft(point.pixelOffset); + sourceRect.setRight(sourceRight); + + WAVEFORM_PAINT_DEBUG << "paintEvent" << "tileIndex" << point.index + << "source" << point.pixelOffset << sourceRight + << "dest" << destLeft << destRight; + + //painter.drawPixmap(destRect, *tile.pixmap, sourceRect); + painter.drawPixmap(destRect, *tile.pixmap, sourceRect); + + destLeft = destRight; + + if (point.index < m_tiles.count()) { + + pos = tilePosition(point.index + 1); + WAVEFORM_PAINT_DEBUG << "paintEvent" << "pos ->" << pos; + } + else { + // Reached end of tile array + WAVEFORM_PAINT_DEBUG << "paintEvent" << "reached end of tile array"; + break; + } + } + else { + // Passed last tile which is painted + WAVEFORM_PAINT_DEBUG << "paintEvent" << "tile" << point.index << "not painted"; + break; + } + } + else { + // pos is past end of tile array + WAVEFORM_PAINT_DEBUG << "paintEvent" << "pos" << pos << "past end of tile array"; + break; + } + } + + WAVEFORM_PAINT_DEBUG << "paintEvent" << "final pos" << pos << "final x" << destRight; + } + painter.end(); + + return image; +} + +void Waveform::initialize(const QAudioFormat &format, qint64 audioBufferSize, qint64 windowDurationUs, const QRect &rect) { + + WAVEFORM_DEBUG << "initialize" + << "audioBufferSize" << audioBufferSize + << "windowDurationUs" << windowDurationUs; + + reset(); + + m_format = format; + m_audioRect = rect; + + // Calculate tile size + m_tileLength = audioBufferSize; + + // Calculate window size + m_windowLength = audioLength(m_format, windowDurationUs); + + // Calculate number of tiles required + int nTiles; + if (m_tileLength > m_windowLength) { + nTiles = 2; + } else { + nTiles = m_windowLength / m_tileLength + 1; + if (m_windowLength % m_tileLength) + ++nTiles; + } + + WAVEFORM_DEBUG << "initialize" + << "tileLength" << m_tileLength + << "windowLength" << m_windowLength + << "nTiles" << nTiles; + + m_pixmaps.fill(0, nTiles); + m_tiles.resize(nTiles); + + createPixmaps(m_audioRect.size()); + + m_active = true; +} + +void Waveform::reset() +{ + WAVEFORM_DEBUG << "reset"; + + m_bufferPosition = 0; + m_buffer = QByteArray(); + m_audioPosition = 0; + m_format = QAudioFormat(); + m_active = false; + deletePixmaps(); + m_tiles.clear(); + m_tileLength = 0; + m_tileArrayStart = 0; + m_windowPosition = 0; + m_windowLength = 0; +} + +void Waveform::bufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { + + Q_UNUSED (sender) + + WAVEFORM_DEBUG << "bufferChanged" + << "audioPosition" << m_audioPosition + << "bufferPosition" << position + << "bufferLength" << length; + m_bufferPosition = position; + m_bufferLength = length; + m_buffer = buffer; + paintTiles(); +} + +void Waveform::audioPositionChanged(QObject *sender, qint64 position) +{ + Q_UNUSED (sender) + + WAVEFORM_DEBUG << "audioPositionChanged" + << "audioPosition" << position + << "bufferPosition" << m_bufferPosition + << "bufferLength" << m_bufferLength; + + if (position >= m_bufferPosition) { + if (position + m_windowLength > m_bufferPosition + m_bufferLength) + position = qMax(qint64(0), m_bufferPosition + m_bufferLength - m_windowLength); + m_audioPosition = position; + setWindowPosition(position); + } +} + +void Waveform::deletePixmaps() +{ + QPixmap *pixmap; + foreach (pixmap, m_pixmaps) + delete pixmap; + m_pixmaps.clear(); +} + +void Waveform::createPixmaps(const QSize &rect) { + + m_pixmapSize = rect; + + if (m_windowLength > 0) + m_pixmapSize.setWidth(qreal(rect.width()) * m_tileLength / m_windowLength); + else + m_pixmapSize.setWidth(qreal(rect.width())); + + WAVEFORM_DEBUG << "createPixmaps" + << "rectSize" << rect + << "pixmapSize" << m_pixmapSize; + + Q_ASSERT(m_tiles.count() == m_pixmaps.count()); + + // (Re)create pixmaps + for (int i = 0; i < m_pixmaps.size(); ++i) { + + delete m_pixmaps[i]; + m_pixmaps[i] = 0; + m_pixmaps[i] = new QPixmap(m_pixmapSize); + } + + // Update tile pixmap pointers, and mark for repainting + for (int i = 0; i < m_tiles.count(); ++i) { + + m_tiles[i].pixmap = m_pixmaps[i]; + m_tiles[i].painted = false; + } +} + +void Waveform::setWindowPosition(qint64 position) +{ + WAVEFORM_DEBUG << "setWindowPosition" + << "old" << m_windowPosition << "new" << position + << "tileArrayStart" << m_tileArrayStart; + + const qint64 oldPosition = m_windowPosition; + m_windowPosition = position; + + if((m_windowPosition >= oldPosition) && + (m_windowPosition - m_tileArrayStart < (m_tiles.count() * m_tileLength))) { + // Work out how many tiles need to be shuffled + const qint64 offset = m_windowPosition - m_tileArrayStart; + const int nTiles = offset / m_tileLength; + shuffleTiles(nTiles); + } else { + resetTiles(m_windowPosition); + } + + if(!paintTiles() && m_windowPosition != oldPosition) + emit waveformImageChanged(true); + // update(); +} + +qint64 Waveform::tilePosition(int index) const { + + return m_tileArrayStart + index * m_tileLength; +} + +Waveform::TilePoint Waveform::tilePoint(qint64 position) const { + + TilePoint result; + + if (position >= m_tileArrayStart) { + + const qint64 tileArrayEnd = m_tileArrayStart + m_tiles.count() * m_tileLength; + + if (position < tileArrayEnd) { + + const qint64 offsetIntoTileArray = position - m_tileArrayStart; + result.index = offsetIntoTileArray / m_tileLength; + Q_ASSERT(result.index >= 0 && result.index <= m_tiles.count()); + result.positionOffset = offsetIntoTileArray % m_tileLength; + result.pixelOffset = tilePixelOffset(result.positionOffset); + Q_ASSERT(result.pixelOffset >= 0 && result.pixelOffset <= m_pixmapSize.width()); + } + } + + return result; +} + +int Waveform::tilePixelOffset(qint64 positionOffset) const { + + Q_ASSERT(positionOffset >= 0 && positionOffset <= m_tileLength); + const int result = (qreal(positionOffset) / m_tileLength) * m_pixmapSize.width(); + return result; +} + +int Waveform::windowPixelOffset(qint64 positionOffset, const QRect &rect) const { + + Q_ASSERT(positionOffset >= 0 && positionOffset <= m_windowLength); + + const int result = (qreal(positionOffset) / m_windowLength) * rect.width(); + return result; +} + +bool Waveform::paintTiles() { + + WAVEFORM_DEBUG << "paintTiles"; + bool updateRequired = false; + + for (int i = 0; i < m_tiles.count(); ++i) { + //for (int i = 0; i < 1; ++i) { + + const Tile &tile = m_tiles[i]; + + if (!tile.painted) { + + const qint64 tileStart = m_tileArrayStart + i * m_tileLength; + const qint64 tileEnd = tileStart + m_tileLength; + + if (m_bufferPosition <= tileStart && m_bufferPosition + m_bufferLength >= tileEnd) { + + paintTile(i); + updateRequired = true; + } + } + } + + if (updateRequired) + emit waveformImageChanged(true); + + return updateRequired; +} + +void Waveform::paintTile(int index) { + + const qint64 tileStart = m_tileArrayStart + index * m_tileLength; + + WAVEFORM_DEBUG << "paintTile" + << "index" << index + << "bufferPosition" << m_bufferPosition + << "bufferLength" << m_bufferLength + << "start" << tileStart + << "end" << tileStart + m_tileLength; + + Q_ASSERT(m_bufferPosition <= tileStart); + Q_ASSERT(m_bufferPosition + m_bufferLength >= tileStart + m_tileLength); + + Tile &tile = m_tiles[index]; + Q_ASSERT(!tile.painted); + + const qint16* base = reinterpret_cast(m_buffer.constData()); + const qint16* buffer = base + ((tileStart - m_bufferPosition) / 2); + const int numSamples = m_tileLength / (2 * m_format.channelCount()); + + QPainter painter(tile.pixmap); + + painter.fillRect(tile.pixmap->rect(), Qt::black); + //painter.fillRect(tile.pixmap->rect(), QColor(60, 60, 60)); + + //QPen pen(Qt::white); + QPen pen(QColor(85, 210, 250)); + painter.setPen(pen); + + // Calculate initial PCM value + qint16 previousPcmValue = 0; + if (buffer > base) + previousPcmValue = *(buffer - m_format.channelCount()); + + // Calculate initial point + const qreal previousRealValue = pcmToReal(previousPcmValue); + const int originY = ((previousRealValue + 1.0) / 2) * m_pixmapSize.height(); + const QPoint origin(0, originY); + + QLine line(origin, origin); + + for (int i = 0; i < numSamples; ++i) { + + const qint16* ptr = buffer + i * m_format.channelCount(); + + Q_ASSERT((reinterpret_cast(ptr) - m_buffer.constData()) >= 0); + Q_ASSERT((reinterpret_cast(ptr) - m_buffer.constData()) < m_bufferLength); + + const qint16 pcmValue = *ptr; + const qreal realValue = pcmToReal(pcmValue); + + const int x = tilePixelOffset(i * 2 * m_format.channelCount()); + const int y = ((realValue + 1.0) / 2) * m_pixmapSize.height(); + + line.setP2(QPoint(x, y)); + painter.drawLine(line); + line.setP1(line.p2()); + } + + tile.painted = true; +} + +void Waveform::shuffleTiles(int n) +{ + WAVEFORM_DEBUG << "shuffleTiles" << "n" << n; + + while (n--) { + Tile tile = m_tiles.first(); + tile.painted = false; + m_tiles.erase(m_tiles.begin()); + m_tiles += tile; + m_tileArrayStart += m_tileLength; + } + + WAVEFORM_DEBUG << "shuffleTiles" << "tileArrayStart" << m_tileArrayStart; +} + +void Waveform::resetTiles(qint64 newStartPos) +{ + WAVEFORM_DEBUG << "resetTiles" << "newStartPos" << newStartPos; + + QVector::iterator i = m_tiles.begin(); + for ( ; i != m_tiles.end(); ++i) + i->painted = false; + + m_tileArrayStart = newStartPos; +} + diff --git a/Source/src/AudioEngine/cusdr_audio_waveform.h b/Source/src/AudioEngine/cusdr_audio_waveform.h new file mode 100644 index 0000000..053837e --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_waveform.h @@ -0,0 +1,237 @@ +/** +* @file cusdr_audio_waveform.h +* @brief cuSDR waveform graphics header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef _CUSDR_WAVEFORM_H +#define _CUSDR_WAVEFORM_H + +#include +#include +#include + +#include "cusdr_settings.h" + +#ifdef LOG_WAVEFORM +# define WAVEFORM_DEBUG qDebug().nospace() << "WaveForm::\t" +#else +# define WAVEFORM_DEBUG nullDebug() +#endif + +#ifdef LOG_PAINT_EVENT +# define WAVEFORM_PAINT_DEBUG qDebug().nospace() << "WaveFormPaint::\t" +#else +# define WAVEFORM_PAINT_DEBUG nullDebug() +#endif + + +QT_FORWARD_DECLARE_CLASS(QByteArray) + +/** + * QObject which draws a section of the audio waveform. + * + * The waveform is rendered on a set of QPixmaps which form a group of tiles + * whose extent covers the widget. As the audio position is updated, these + * tiles are scrolled from left to right; when the left-most tile scrolls + * outside the widget, it is moved to the right end of the tile array and + * painted with the next section of the waveform. + */ + +class Waveform : public QObject { + + Q_OBJECT + +public: + Waveform(QObject *parent = 0); + ~Waveform(); + + void initialize( + const QAudioFormat &format, + qint64 audioBufferSize, + qint64 windowDurationUs, + const QRect &rect); + + void reset(); + + void setAutoUpdatePosition(bool enabled); + +public slots: + void bufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + void audioPositionChanged(QObject *sender, qint64 position); + + QImage* createWaveformImage(const QRect &rect); + +private: + static const int NullIndex = -1; + + void deletePixmaps(); + + /* + * (Re)create all pixmaps, repaint and update the display. + * Triggers an update(); + */ + void createPixmaps(const QSize &newSize); + + /* + * Update window position. + * Triggers an update(). + */ + void setWindowPosition(qint64 position); + + /* + * Base position of tile + */ + qint64 tilePosition(int index) const; + + /* + * Structure which identifies a point within a given + * tile. + */ + struct TilePoint + { + TilePoint(int idx = 0, qint64 pos = 0, qint64 pix = 0) + : index(idx), positionOffset(pos), pixelOffset(pix) + { } + + // Index of tile + int index; + + // Number of bytes from start of tile + qint64 positionOffset; + + // Number of pixels from left of corresponding pixmap + int pixelOffset; + }; + + /* + * Convert position in m_buffer into a tile index and an offset in pixels + * into the corresponding pixmap. + * + * \param position Offset into m_buffer, in bytes + + * If position is outside the tile array, index is NullIndex and + * offset is zero. + */ + TilePoint tilePoint(qint64 position) const; + + /* + * Convert offset in bytes into a tile into an offset in pixels + * within that tile. + */ + int tilePixelOffset(qint64 positionOffset) const; + + /* + * Convert offset in bytes into the window into an offset in pixels + * within the widget rect(). + */ + int windowPixelOffset(qint64 positionOffset, const QRect &rect) const; + + /* + * Paint all tiles which can be painted. + * \return true iff update() was called + */ + bool paintTiles(); + + /* + * Paint the specified tile + * + * \pre Sufficient data is available to completely paint the tile, i.e. + * m_dataLength is greater than the upper bound of the tile. + */ + void paintTile(int index); + + /* + * Move the first n tiles to the end of the array, and mark them as not + * painted. + */ + void shuffleTiles(int n); + + /* + * Reset tile array + */ + void resetTiles(qint64 newStartPos); + +private: + Settings* set; + + QRect m_audioRect; + qint64 m_bufferPosition; + qint64 m_bufferLength; + QByteArray m_buffer; + + qint64 m_audioPosition; + QAudioFormat m_format; + + bool m_active; + + QSize m_pixmapSize; + QVector m_pixmaps; + + struct Tile { + // Pointer into parent m_pixmaps array + QPixmap* pixmap; + + // Flag indicating whether this tile has been painted + bool painted; + }; + + QVector m_tiles; + + // Length of audio data in bytes depicted by each tile + qint64 m_tileLength; + + // Position in bytes of the first tile, relative to m_buffer + qint64 m_tileArrayStart; + + qint64 m_windowPosition; + qint64 m_windowLength; + int m_waveformDisplayWidth; + +signals: + void waveformImageChanged(bool value); +}; + +#endif // _CUSDR_WAVEFORM_H diff --git a/Source/src/AudioEngine/cusdr_audio_wavfile.cpp b/Source/src/AudioEngine/cusdr_audio_wavfile.cpp new file mode 100644 index 0000000..cc5d8b8 --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_wavfile.cpp @@ -0,0 +1,165 @@ +/** +* @file cusdr_audio_wavfile.cpp +* @brief cuSDR audio wav-file class +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ +//#define LOG_AUDIO_WAVFILE + +#include +#include +#include +#include "cusdr_audio_utils.h" +#include "cusdr_audio_wavfile.h" + +struct chunk { + + char id[4]; + quint32 size; +}; + +struct RIFFHeader { + + chunk descriptor; // "RIFF" + char type[4]; // "WAVE" +}; + +struct WAVEHeader { + + chunk descriptor; + quint16 audioFormat; + quint16 numChannels; + quint32 sampleRate; + quint32 byteRate; + quint16 blockAlign; + quint16 bitsPerSample; +}; + +struct DATAHeader { + + chunk descriptor; +}; + +struct CombinedHeader { + + RIFFHeader riff; + WAVEHeader wave; +}; + +WavFile::WavFile(QObject *parent) + : QFile(parent) + , m_headerLength(0) +{ +} + +bool WavFile::open(const QString &fileName) { + + close(); + setFileName(fileName); + return QFile::open(QIODevice::ReadOnly) && readHeader(); +} + +const QAudioFormat &WavFile::fileFormat() const { + + return m_fileFormat; +} + +qint64 WavFile::headerLength() const { + + return m_headerLength; +} + +bool WavFile::readHeader() { + + seek(0); + CombinedHeader header; + bool result = read(reinterpret_cast(&header), sizeof(CombinedHeader)) == sizeof(CombinedHeader); + + AUDIO_WAVFILE_DEBUG << "header.id" << header.riff.descriptor.id; + AUDIO_WAVFILE_DEBUG << "header.type" << header.riff.type; + AUDIO_WAVFILE_DEBUG << "header.descriptor.id" << header.wave.descriptor.id; + AUDIO_WAVFILE_DEBUG << "header.audioFormat" << header.wave.audioFormat; + + if (result) { + if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0 + || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0) + && memcmp(&header.riff.type, "WAVE", 4) == 0 + && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0 + && (header.wave.audioFormat == 1 || header.wave.audioFormat == 0 || header.wave.audioFormat == 3)) { + + // Read off remaining header information + DATAHeader dataHeader; + + if (qFromLittleEndian(header.wave.descriptor.size) > sizeof(WAVEHeader)) { + // Extended data available + quint16 extraFormatBytes; + if (peek((char*)&extraFormatBytes, sizeof(quint16)) != sizeof(quint16)) + return false; + const qint64 throwAwayBytes = sizeof(quint16) + qFromLittleEndian(extraFormatBytes); + if (read(throwAwayBytes).size() != throwAwayBytes) + return false; + } + + if (read((char*)&dataHeader, sizeof(DATAHeader)) != sizeof(DATAHeader)) + return false; + + // Establish format + if (memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0) + m_fileFormat.setByteOrder(QAudioFormat::LittleEndian); + else + m_fileFormat.setByteOrder(QAudioFormat::BigEndian); + + int bps = qFromLittleEndian(header.wave.bitsPerSample); + m_fileFormat.setChannelCount(qFromLittleEndian(header.wave.numChannels)); + m_fileFormat.setCodec("audio/pcm"); + m_fileFormat.setSampleRate(qFromLittleEndian(header.wave.sampleRate)); + m_fileFormat.setSampleSize(qFromLittleEndian(header.wave.bitsPerSample)); + m_fileFormat.setSampleType(bps == 8 ? QAudioFormat::UnSignedInt : QAudioFormat::SignedInt); + } else { + result = false; + } + } + m_headerLength = pos(); + return result; +} diff --git a/Source/src/AudioEngine/cusdr_audio_wavfile.h b/Source/src/AudioEngine/cusdr_audio_wavfile.h new file mode 100644 index 0000000..4877566 --- /dev/null +++ b/Source/src/AudioEngine/cusdr_audio_wavfile.h @@ -0,0 +1,83 @@ +/** +* @file cusdr_audio_wavfile.h +* @brief cuSDR audio wav file header file +* @author adaptation for cuSDR by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-04-02 +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef _CUSDR_AUDIO_WAVFILE_H +#define _CUSDR_AUDIO_WAVFILE_H + +#include +#include +#include "cusdr_settings.h" + +#ifdef LOG_AUDIO_WAVFILE +# define AUDIO_WAVFILE_DEBUG qDebug().nospace() << "AudioWavFile::\t" +#else +# define AUDIO_WAVFILE_DEBUG nullDebug() +#endif + + +class WavFile : public QFile +{ +public: + WavFile(QObject *parent = 0); + + bool open(const QString &fileName); + const QAudioFormat &fileFormat() const; + qint64 headerLength() const; + +private: + bool readHeader(); + +private: + QAudioFormat m_fileFormat; + qint64 m_headerLength; + +}; + +#endif // _CUSDR_AUDIO_WAVFILE_H + diff --git a/Source/src/AudioEngine/cusdr_fspectrum.cpp b/Source/src/AudioEngine/cusdr_fspectrum.cpp new file mode 100644 index 0000000..73ac7bd --- /dev/null +++ b/Source/src/AudioEngine/cusdr_fspectrum.cpp @@ -0,0 +1,94 @@ +/** +* @file cusdr_fspectrum.cpp +* @brief audio frequency spectrum class for cuSDR +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cusdr_fspectrum.h" + +FrequencySpectrum::FrequencySpectrum(int numPoints) + : m_elements(numPoints) +{ + +} + +void FrequencySpectrum::reset() { + + iterator i = begin(); + for ( ; i != end(); ++i) + *i = Element(); +} + +int FrequencySpectrum::count() const { + + return m_elements.count(); +} + +FrequencySpectrum::Element& FrequencySpectrum::operator[](int index) { + + return m_elements[index]; +} + +const FrequencySpectrum::Element& FrequencySpectrum::operator[](int index) const { + + return m_elements[index]; +} + +FrequencySpectrum::iterator FrequencySpectrum::begin() { + + return m_elements.begin(); +} + +FrequencySpectrum::iterator FrequencySpectrum::end() { + + return m_elements.end(); +} + +FrequencySpectrum::const_iterator FrequencySpectrum::begin() const { + + return m_elements.begin(); +} + +FrequencySpectrum::const_iterator FrequencySpectrum::end() const { + + return m_elements.end(); +} diff --git a/Source/src/AudioEngine/cusdr_fspectrum.h b/Source/src/AudioEngine/cusdr_fspectrum.h new file mode 100644 index 0000000..00ef638 --- /dev/null +++ b/Source/src/AudioEngine/cusdr_fspectrum.h @@ -0,0 +1,103 @@ +/** +* @file cusdr_fspectrum.h +* @brief audio frequency spectrum header file for cuSDR +*/ + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef FREQUENCYSPECTRUM_H +#define FREQUENCYSPECTRUM_H + +#include + +/** + * Represents a frequency spectrum as a series of elements, each of which + * consists of a frequency, an amplitude and a phase. + */ +class FrequencySpectrum { +public: + FrequencySpectrum(int numPoints = 0); + + struct Element { + Element() + : frequency(0.0), amplitude(0.0), phase(0.0), clipped(false) + { } + + /** + * Frequency in Hertz + */ + qreal frequency; + + /** + * Amplitude in range [0.0, 1.0] + */ + qreal amplitude; + + /** + * Phase in range [0.0, 2*PI] + */ + qreal phase; + + /** + * Indicates whether value has been clipped during spectrum analysis + */ + bool clipped; + }; + + typedef QVector::iterator iterator; + typedef QVector::const_iterator const_iterator; + + void reset(); + + int count() const; + Element& operator[](int index); + const Element& operator[](int index) const; + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + +private: + QVector m_elements; + +}; + +#endif // FREQUENCYSPECTRUM_H diff --git a/Source/src/CL/qclbuffer.h b/Source/src/CL/qclbuffer.h new file mode 100644 index 0000000..8e3ea75 --- /dev/null +++ b/Source/src/CL/qclbuffer.h @@ -0,0 +1,167 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLBUFFER_H +#define QCLBUFFER_H + +#include "qclmemoryobject.h" +#include "qclevent.h" +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLImage2D; +class QCLImage3D; + +class Q_CL_EXPORT QCLBuffer : public QCLMemoryObject +{ +public: + QCLBuffer() {} + QCLBuffer(QCLContext *context, cl_mem id) + : QCLMemoryObject(context, id) {} + QCLBuffer(const QCLBuffer &other) + : QCLMemoryObject() { setId(other.context(), other.memoryId()); } + + QCLBuffer &operator=(const QCLBuffer &other) + { + setId(other.context(), other.memoryId()); + return *this; + } + + bool read(void *data, size_t size); + bool read(size_t offset, void *data, size_t size); + QCLEvent readAsync(size_t offset, void *data, size_t size, + const QCLEventList &after = QCLEventList()); + + bool readRect(const QRect &rect, void *data, + size_t bufferBytesPerLine, size_t hostBytesPerLine); + bool readRect(const size_t origin[3], const size_t size[3], void *data, + size_t bufferBytesPerLine, size_t bufferBytesPerSlice, + size_t hostBytesPerLine, size_t hostBytesPerSlice); + QCLEvent readRectAsync + (const QRect &rect, void *data, + size_t bufferBytesPerLine, size_t hostBytesPerLine, + const QCLEventList &after = QCLEventList()); + QCLEvent readRectAsync + (const size_t origin[3], const size_t size[3], void *data, + size_t bufferBytesPerLine, size_t bufferBytesPerSlice, + size_t hostBytesPerLine, size_t hostBytesPerSlice, + const QCLEventList &after = QCLEventList()); + + bool write(const void *data, size_t size); + bool write(size_t offset, const void *data, size_t size); + QCLEvent writeAsync(size_t offset, const void *data, size_t size, + const QCLEventList &after = QCLEventList()); + + bool writeRect(const QRect &rect, const void *data, + size_t bufferBytesPerLine, size_t hostBytesPerLine); + bool writeRect(const size_t origin[3], const size_t size[3], + const void *data, size_t bufferBytesPerLine, + size_t bufferBytesPerSlice, size_t hostBytesPerLine, + size_t hostBytesPerSlice); + QCLEvent writeRectAsync + (const QRect &rect, const void *data, + size_t bufferBytesPerLine, size_t hostBytesPerLine, + const QCLEventList &after = QCLEventList()); + QCLEvent writeRectAsync + (const size_t origin[3], const size_t size[3], const void *data, + size_t bufferBytesPerLine, size_t bufferBytesPerSlice, + size_t hostBytesPerLine, size_t hostBytesPerSlice, + const QCLEventList &after = QCLEventList()); + + bool copyTo(size_t offset, size_t size, + const QCLBuffer &dest, size_t destOffset); + bool copyTo(size_t offset, const QCLImage2D &dest, const QRect &rect); + bool copyTo(size_t offset, const QCLImage3D &dest, + const size_t origin[3], const size_t size[3]); + + QCLEvent copyToAsync + (size_t offset, size_t size, + const QCLBuffer &dest, size_t destOffset, + const QCLEventList &after = QCLEventList()); + QCLEvent copyToAsync + (size_t offset, const QCLImage2D &dest, const QRect &rect, + const QCLEventList &after = QCLEventList()); + QCLEvent copyToAsync + (size_t offset, const QCLImage3D &dest, + const size_t origin[3], const size_t size[3], + const QCLEventList &after = QCLEventList()); + + bool copyToRect(const QRect &rect, const QCLBuffer &dest, + const QPoint &destPoint, size_t bufferBytesPerLine, + size_t destBytesPerLine); + bool copyToRect(const size_t origin[3], const size_t size[3], + const QCLBuffer &dest, const size_t destOrigin[3], + size_t bufferBytesPerLine, size_t bufferBytesPerSlice, + size_t destBytesPerLine, size_t destBytesPerSlice); + QCLEvent copyToRectAsync + (const QRect &rect, const QCLBuffer &dest, const QPoint &destPoint, + size_t bufferBytesPerLine, size_t destBytesPerLine, + const QCLEventList &after = QCLEventList()); + QCLEvent copyToRectAsync + (const size_t origin[3], const size_t size[3], + const QCLBuffer &dest, const size_t destOrigin[3], + size_t bufferBytesPerLine, size_t bufferBytesPerSlice, + size_t destBytesPerLine, size_t destBytesPerSlice, + const QCLEventList &after = QCLEventList()); + + void *map(size_t offset, size_t size, QCLMemoryObject::Access access); + void *map(QCLMemoryObject::Access access); + QCLEvent mapAsync(void **ptr, size_t offset, size_t size, + QCLMemoryObject::Access access, + const QCLEventList &after = QCLEventList()); + + QCLBuffer createSubBuffer + (size_t offset, size_t size, QCLMemoryObject::Access access); + + QCLBuffer parentBuffer() const; + size_t offset() const; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclcommandqueue.h b/Source/src/CL/qclcommandqueue.h new file mode 100644 index 0000000..813e1a8 --- /dev/null +++ b/Source/src/CL/qclcommandqueue.h @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLCOMMANDQUEUE_H +#define QCLCOMMANDQUEUE_H + +#include "qclglobal.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; + +class Q_CL_EXPORT QCLCommandQueue +{ +public: + QCLCommandQueue() : m_id(0) {} + QCLCommandQueue(QCLContext *context, cl_command_queue id) + : m_context(context), m_id(id) {} + QCLCommandQueue(const QCLCommandQueue &other); + ~QCLCommandQueue(); + + QCLCommandQueue &operator=(const QCLCommandQueue &other); + + bool isNull() const { return m_id == 0; } + + bool isOutOfOrder() const; + bool isProfilingEnabled() const; + + cl_command_queue queueId() const { return m_id; } + QCLContext *context() const { return m_context; } + + bool operator==(const QCLCommandQueue &other) const; + bool operator!=(const QCLCommandQueue &other) const; + +private: + QCLContext *m_context; + cl_command_queue m_id; +}; + +inline QCLCommandQueue::QCLCommandQueue(const QCLCommandQueue &other) + : m_context(other.m_context), m_id(other.m_id) +{ + if (m_id) + clRetainCommandQueue(m_id); +} + +inline QCLCommandQueue::~QCLCommandQueue() +{ + if (m_id) + clReleaseCommandQueue(m_id); +} + +inline QCLCommandQueue &QCLCommandQueue::operator=(const QCLCommandQueue &other) +{ + m_context = other.m_context; + if (other.m_id) + clRetainCommandQueue(other.m_id); + if (m_id) + clReleaseCommandQueue(m_id); + m_id = other.m_id; + return *this; +} + +inline bool QCLCommandQueue::operator==(const QCLCommandQueue &other) const +{ + return m_id == other.m_id; +} + +inline bool QCLCommandQueue::operator!=(const QCLCommandQueue &other) const +{ + return m_id != other.m_id; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclcontext.h b/Source/src/CL/qclcontext.h new file mode 100644 index 0000000..f6506ec --- /dev/null +++ b/Source/src/CL/qclcontext.h @@ -0,0 +1,202 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLCONTEXT_H +#define QCLCONTEXT_H + +#include "qcldevice.h" +#include "qclcommandqueue.h" +#include "qclbuffer.h" +#include "qclvector.h" +#include "qclimage.h" +#include "qclsampler.h" +#include "qclprogram.h" +#include "qcluserevent.h" +#include +#include +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContextPrivate; +class QCLKernel; +class QCLVectorBase; + +class Q_CL_EXPORT QCLContext +{ +public: + QCLContext(); + virtual ~QCLContext(); + + bool isCreated() const; + + bool create(QCLDevice::DeviceTypes type = QCLDevice::Default); + bool create(const QList &devices); + virtual void release(); + + cl_context contextId() const; + void setContextId(cl_context id); + + QList devices() const; + QCLDevice defaultDevice() const; + + cl_int lastError() const; + void setLastError(cl_int error); + + static QString errorName(cl_int code); + + QCLCommandQueue commandQueue(); + void setCommandQueue(const QCLCommandQueue &queue); + + QCLCommandQueue defaultCommandQueue(); + QCLCommandQueue createCommandQueue + (cl_command_queue_properties properties, + const QCLDevice &device = QCLDevice()); + + QCLBuffer createBufferDevice + (size_t size, QCLMemoryObject::Access access); + QCLBuffer createBufferHost + (void *data, size_t size, QCLMemoryObject::Access access); + QCLBuffer createBufferCopy + (const void *data, size_t size, QCLMemoryObject::Access access); + + template + QCLVector createVector(int size, QCLMemoryObject::Access access = QCLMemoryObject::ReadWrite); + + QCLImage2D createImage2DDevice + (const QCLImageFormat &format, const QSize &size, QCLMemoryObject::Access access); + QCLImage2D createImage2DHost + (const QCLImageFormat &format, void *data, const QSize &size, + QCLMemoryObject::Access access, int bytesPerLine = 0); + QCLImage2D createImage2DHost(QImage *image, QCLMemoryObject::Access access); + QCLImage2D createImage2DCopy + (const QCLImageFormat &format, const void *data, const QSize &size, + QCLMemoryObject::Access access, int bytesPerLine = 0); + QCLImage2D createImage2DCopy + (const QImage &image, QCLMemoryObject::Access access); + + QCLImage3D createImage3DDevice + (const QCLImageFormat &format, int width, int height, int depth, + QCLMemoryObject::Access access); + QCLImage3D createImage3DHost + (const QCLImageFormat &format, void *data, + int width, int height, int depth, QCLMemoryObject::Access access, + int bytesPerLine = 0, int bytesPerSlice = 0); + QCLImage3D createImage3DCopy + (const QCLImageFormat &format, const void *data, + int width, int height, int depth, QCLMemoryObject::Access access, + int bytesPerLine = 0, int bytesPerSlice = 0); + + QCLProgram createProgramFromSourceCode(const QByteArray &sourceCode); + QCLProgram createProgramFromSourceFile(const QString &fileName); + QCLProgram createProgramFromBinaryCode(const QByteArray &binary); + QCLProgram createProgramFromBinaryFile(const QString &fileName); + QCLProgram createProgramFromBinaries + (const QList &devices, const QList &binaries); + + QCLProgram buildProgramFromSourceCode(const QByteArray &sourceCode); + QCLProgram buildProgramFromSourceFile(const QString &fileName); + QCLProgram buildProgramFromBinaryCode(const QByteArray &binary); + QCLProgram buildProgramFromBinaryFile(const QString &fileName); + QCLProgram buildProgramFromBinaries + (const QList &devices, const QList &binaries); + + QList supportedImage2DFormats(cl_mem_flags flags) const; + QList supportedImage3DFormats(cl_mem_flags flags) const; + + QCLSampler createSampler + (bool normalizedCoordinates, QCLSampler::AddressingMode addressingMode, + QCLSampler::FilterMode filterMode); + + QCLUserEvent createUserEvent(); + + void flush(); + void finish(); + + QCLEvent marker(); + + void sync(); + + void barrier(); + void barrier(const QCLEventList &events); + +protected: + void setDefaultDevice(const QCLDevice &device); + +private: + QScopedPointer d_ptr; + + Q_DISABLE_COPY(QCLContext) + Q_DECLARE_PRIVATE(QCLContext) + + cl_command_queue activeQueue(); // For quicker access from friends. + + friend class QCLMemoryObject; + friend class QCLBuffer; + friend class QCLImage2D; + friend class QCLImage3D; + friend class QCLKernel; + friend class QCLCommandQueue; + friend class QCLProgram; + friend class QCLVectorBase; + friend class QCLSampler; + + void reportError(const char *name, cl_int error); +}; + +template +Q_INLINE_TEMPLATE QCLVector QCLContext::createVector + (int size, QCLMemoryObject::Access access) +{ + Q_ASSERT(size >= 1); + return QCLVector(this, size, access); +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qcldevice.h b/Source/src/CL/qcldevice.h new file mode 100644 index 0000000..b73d0cd --- /dev/null +++ b/Source/src/CL/qcldevice.h @@ -0,0 +1,208 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLDEVICE_H +#define QCLDEVICE_H + +#include "qclplatform.h" +#include "qclworksize.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class Q_CL_EXPORT QCLDevice +{ +public: + QCLDevice() : m_id(0), m_flags(0) {} + QCLDevice(cl_device_id id) : m_id(id), m_flags(0) {} + + enum DeviceType + { + Default = 0x00000001, + CPU = 0x00000002, + GPU = 0x00000004, + Accelerator = 0x00000008, + All = 0xFFFFFFFF + }; + Q_DECLARE_FLAGS(DeviceTypes, DeviceType) + + bool isNull() const { return m_id == 0; } + + QCLDevice::DeviceTypes deviceType() const; + QCLPlatform platform() const; + uint vendorId() const; + bool isAvailable() const; + + bool hasCompiler() const; + bool hasNativeKernels() const; + bool hasOutOfOrderExecution() const; + bool hasDouble() const; + bool hasHalfFloat() const; + bool hasErrorCorrectingMemory() const; + bool hasUnifiedMemory() const; + + int computeUnits() const; + int clockFrequency() const; + int addressBits() const; + QSysInfo::Endian byteOrder() const; + + QCLWorkSize maximumWorkItemSize() const; + size_t maximumWorkItemsPerGroup() const; + + bool hasImage2D() const; + bool hasImage3D() const; + bool hasWritableImage3D() const; + QSize maximumImage2DSize() const; + QCLWorkSize maximumImage3DSize() const; + int maximumSamplers() const; + int maximumReadImages() const; + int maximumWriteImages() const; + + int preferredCharVectorSize() const; + int preferredShortVectorSize() const; + int preferredIntVectorSize() const; + int preferredLongVectorSize() const; + int preferredFloatVectorSize() const; + int preferredDoubleVectorSize() const; + int preferredHalfFloatVectorSize() const; + + int nativeCharVectorSize() const; + int nativeShortVectorSize() const; + int nativeIntVectorSize() const; + int nativeLongVectorSize() const; + int nativeFloatVectorSize() const; + int nativeDoubleVectorSize() const; + int nativeHalfFloatVectorSize() const; + + enum FloatCapability + { + NotSupported = 0x0000, + Denorm = 0x0001, + InfinityNaN = 0x0002, + RoundNearest = 0x0004, + RoundZero = 0x0008, + RoundInfinity = 0x0010, + FusedMultiplyAdd = 0x0020 + }; + Q_DECLARE_FLAGS(FloatCapabilities, FloatCapability) + + QCLDevice::FloatCapabilities floatCapabilities() const; + QCLDevice::FloatCapabilities doubleCapabilities() const; + QCLDevice::FloatCapabilities halfFloatCapabilities() const; + + quint64 profilingTimerResolution() const; + + enum CacheType + { + NoCache = 0, + ReadOnlyCache = 1, + ReadWriteCache = 2 + }; + + quint64 maximumAllocationSize() const; + quint64 globalMemorySize() const; + QCLDevice::CacheType globalMemoryCacheType() const; + quint64 globalMemoryCacheSize() const; + int globalMemoryCacheLineSize() const; + quint64 localMemorySize() const; + bool isLocalMemorySeparate() const; + quint64 maximumConstantBufferSize() const; + int maximumConstantArguments() const; + + int defaultAlignment() const; + int minimumAlignment() const; + int maximumParameterBytes() const; + + bool isFullProfile() const; + bool isEmbeddedProfile() const; + + QString profile() const; + QString version() const; + QString driverVersion() const; + QString name() const; + QString vendor() const; + QStringList extensions() const; + QString languageVersion() const; + + bool hasExtension(const char *name) const; + + QCLPlatform::VersionFlags versionFlags() const; + + cl_device_id deviceId() const { return m_id; } + + static QList allDevices(); + static QList devices + (QCLDevice::DeviceTypes types, + const QCLPlatform &platform = QCLPlatform()); + + bool operator==(const QCLDevice &other) const; + bool operator!=(const QCLDevice &other) const; + +private: + cl_device_id m_id; + mutable int m_flags; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QCLDevice::DeviceTypes) +Q_DECLARE_OPERATORS_FOR_FLAGS(QCLDevice::FloatCapabilities) + +inline bool QCLDevice::operator==(const QCLDevice &other) const +{ + return m_id == other.m_id; +} + +inline bool QCLDevice::operator!=(const QCLDevice &other) const +{ + return m_id != other.m_id; +} + +#ifndef QT_NO_DEBUG_STREAM +Q_CL_EXPORT QDebug operator<<(QDebug, const QCLDevice &); +#endif + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclevent.h b/Source/src/CL/qclevent.h new file mode 100644 index 0000000..78b2651 --- /dev/null +++ b/Source/src/CL/qclevent.h @@ -0,0 +1,230 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLEVENT_H +#define QCLEVENT_H + +#include "qclglobal.h" +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLUserEvent; + +class Q_CL_EXPORT QCLEvent +{ +public: + QCLEvent() : m_id(0) {} + QCLEvent(cl_event id) : m_id(id) {} + QCLEvent(const QCLEvent &other); + ~QCLEvent(); + + QCLEvent &operator=(const QCLEvent &other); + + bool isNull() const { return m_id == 0; } + + cl_event eventId() const { return m_id; } + + bool isQueued() const { return status() == CL_QUEUED; } + bool isSubmitted() const { return status() == CL_SUBMITTED; } + bool isRunning() const { return status() == CL_RUNNING; } + bool isFinished() const { return status() == CL_COMPLETE; } + bool isErrored() const { return status() < 0; } + + cl_int status() const; + cl_command_type commandType() const; + + void waitForFinished(); + + quint64 queueTime() const; + quint64 submitTime() const; + quint64 runTime() const; + quint64 finishTime() const; + + bool operator==(const QCLEvent &other) const; + bool operator!=(const QCLEvent &other) const; + +#if !defined(QT_NO_CONCURRENT) + QFuture toFuture() const; + operator QFuture() const; +#endif + +private: + cl_event m_id; + + friend class QCLUserEvent; +}; + +inline QCLEvent::QCLEvent(const QCLEvent &other) + : m_id(other.m_id) +{ + if (m_id) + clRetainEvent(m_id); +} + +inline QCLEvent::~QCLEvent() +{ + if (m_id) + clReleaseEvent(m_id); +} + +inline QCLEvent &QCLEvent::operator=(const QCLEvent &other) +{ + if (other.m_id) + clRetainEvent(other.m_id); + if (m_id) + clReleaseEvent(m_id); + m_id = other.m_id; + return *this; +} + +class Q_CL_EXPORT QCLEventList +{ +public: + QCLEventList() {} + QCLEventList(const QCLEvent &event); + QCLEventList(const QCLEventList &other); + ~QCLEventList(); + + QCLEventList &operator=(const QCLEventList &other); + + bool isEmpty() const { return m_events.isEmpty(); } + int size() const { return m_events.size(); } + + void append(const QCLEvent &event); + void append(const QCLEventList &other); + void remove(const QCLEvent &event); + + QCLEvent at(int index) const; + bool contains(const QCLEvent &event) const; + + const cl_event *eventData() const; + + QCLEventList &operator+=(const QCLEvent &event); + QCLEventList &operator+=(const QCLEventList &other); + + QCLEventList &operator<<(const QCLEvent &event); + QCLEventList &operator<<(const QCLEventList &other); + + void waitForFinished(); + +#ifndef QT_NO_CONCURRENT + QFuture toFuture() const; + operator QFuture() const; +#endif + +private: + QVector m_events; +}; + +inline bool QCLEvent::operator==(const QCLEvent &other) const +{ + return m_id == other.m_id; +} + +inline bool QCLEvent::operator!=(const QCLEvent &other) const +{ + return m_id != other.m_id; +} + +#ifndef QT_NO_CONCURRENT +inline QCLEvent::operator QFuture() const +{ + return toFuture(); +} +#endif + +inline bool QCLEventList::contains(const QCLEvent &event) const +{ + return m_events.contains(event.eventId()); +} + +inline const cl_event *QCLEventList::eventData() const +{ + return m_events.isEmpty() ? 0 : m_events.constData(); +} + +inline QCLEventList &QCLEventList::operator+=(const QCLEvent &event) +{ + append(event); + return *this; +} + +inline QCLEventList &QCLEventList::operator+=(const QCLEventList &other) +{ + append(other); + return *this; +} + +inline QCLEventList &QCLEventList::operator<<(const QCLEvent &event) +{ + append(event); + return *this; +} + +inline QCLEventList &QCLEventList::operator<<(const QCLEventList &other) +{ + append(other); + return *this; +} + +#ifndef QT_NO_CONCURRENT +inline QCLEventList::operator QFuture() const +{ + return toFuture(); +} +#endif + +#ifndef QT_NO_DEBUG_STREAM +Q_CL_EXPORT QDebug operator<<(QDebug, const QCLEvent &); +Q_CL_EXPORT QDebug operator<<(QDebug, const QCLEventList &); +#endif + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclext_p.h b/Source/src/CL/qclext_p.h new file mode 100644 index 0000000..a50df50 --- /dev/null +++ b/Source/src/CL/qclext_p.h @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLEXT_P_H +#define QCLEXT_P_H + +#include "qclglobal.h" + +// This file provides standard and extension definitions +// that we cannot rely upon being present in the system headers. + +// OpenCL 1.1 +#ifndef CL_MISALIGNED_SUB_BUFFER_OFFSET +#define CL_MISALIGNED_SUB_BUFFER_OFFSET -13 +#endif +#ifndef CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST +#define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14 +#endif +#ifndef CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034 +#endif +#ifndef CL_DEVICE_HOST_UNIFIED_MEMORY +#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035 +#endif +#ifndef CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C +#endif +#ifndef CL_DEVICE_OPENCL_C_VERSION +#define CL_DEVICE_OPENCL_C_VERSION 0x103D +#endif +#ifndef CL_COMMAND_READ_BUFFER_RECT +#define CL_COMMAND_READ_BUFFER_RECT 0x1201 +#endif +#ifndef CL_COMMAND_WRITE_BUFFER_RECT +#define CL_COMMAND_WRITE_BUFFER_RECT 0x1202 +#endif +#ifndef CL_COMMAND_COPY_BUFFER_RECT +#define CL_COMMAND_COPY_BUFFER_RECT 0x1203 +#endif +#ifndef CL_COMMAND_USER +#define CL_COMMAND_USER 0x1204 +#endif +#ifndef CL_MEM_ASSOCIATED_MEMOBJECT +#define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107 +#endif +#ifndef CL_MEM_OFFSET +#define CL_MEM_OFFSET 0x1108 +#endif +#ifndef CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE +#define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3 +#endif + +// OpenCL-OpenGL sharing. +#ifndef CL_INVALID_CL_SHAREGROUP_REFERENCE_KHR +#define CL_INVALID_CL_SHAREGROUP_REFERENCE_KHR -1000 +#endif + +// cl_khr_fp64 +#ifndef CL_DEVICE_DOUBLE_FP_CONFIG +#define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 +#endif + +// cl_khr_fp16 +#ifndef CL_DEVICE_HALF_FP_CONFIG +#define CL_DEVICE_HALF_FP_CONFIG 0x1033 +#endif + +// cl_khr_icd +#ifndef CL_PLATFORM_ICD_SUFFIX_KHR +#define CL_PLATFORM_ICD_SUFFIX_KHR 0x0920 +#endif +#ifndef CL_PLATFORM_NOT_FOUND_KHR +#define CL_PLATFORM_NOT_FOUND_KHR -1001 +#endif + +// cl_ext_device_fission +#ifndef CL_DEVICE_PARTITION_FAILED_EXT +#define CL_DEVICE_PARTITION_FAILED_EXT -1057 +#endif +#ifndef CL_INVALID_PARTITION_COUNT_EXT +#define CL_INVALID_PARTITION_COUNT_EXT -1058 +#endif +#ifndef CL_INVALID_PARTITION_NAME_EXT +#define CL_INVALID_PARTITION_NAME_EXT -1059 +#endif + +#endif diff --git a/Source/src/CL/qclglobal.h b/Source/src/CL/qclglobal.h new file mode 100644 index 0000000..59c07ad --- /dev/null +++ b/Source/src/CL/qclglobal.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLGLOBAL_H +#define QCLGLOBAL_H + +#include + +// XXX: Move to qglobal.h eventually. +QT_LICENSED_MODULE(CL) +#if defined(Q_OS_WIN) && defined(QT_MAKEDLL) +# if defined(QT_BUILD_CL_LIB) +# define Q_CL_EXPORT Q_DECL_EXPORT +# else +# define Q_CL_EXPORT Q_DECL_IMPORT +# endif +#elif defined(Q_OS_WIN) && defined(QT_DLL) +# define Q_CL_EXPORT Q_DECL_IMPORT +#endif +#if !defined(Q_CL_EXPORT) +# if defined(QT_SHARED) +# define Q_CL_EXPORT Q_DECL_EXPORT +# else +# define Q_CL_EXPORT +# endif +#endif + +QT_LICENSED_MODULE(CLGL) +#if defined(Q_OS_WIN) && defined(QT_MAKEDLL) +# if defined(QT_BUILD_CLGL_LIB) +# define Q_CLGL_EXPORT Q_DECL_EXPORT +# else +# define Q_CLGL_EXPORT Q_DECL_IMPORT +# endif +#elif defined(Q_OS_WIN) && defined(QT_DLL) +# define Q_CLGL_EXPORT Q_DECL_IMPORT +#endif +#if !defined(Q_CLGL_EXPORT) +# if defined(QT_SHARED) +# define Q_CLGL_EXPORT Q_DECL_EXPORT +# else +# define Q_CLGL_EXPORT +# endif +#endif + +#if defined(__APPLE__) || defined(__MACOSX) +#include +#include +#else +#include +#include +#endif + +#endif diff --git a/Source/src/CL/qclimage.h b/Source/src/CL/qclimage.h new file mode 100644 index 0000000..ab27dd3 --- /dev/null +++ b/Source/src/CL/qclimage.h @@ -0,0 +1,214 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLIMAGE_H +#define QCLIMAGE_H + +#include "qclmemoryobject.h" +#include "qclimageformat.h" +#include "qclevent.h" +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLImage2DPrivate; +class QCLImage3D; +class QCLBuffer; +class QPainter; + +class Q_CL_EXPORT QCLImage2D : public QCLMemoryObject +{ +public: + QCLImage2D() : d_ptr(0) {} + QCLImage2D(QCLContext *context, cl_mem id) + : QCLMemoryObject(context, id), d_ptr(0) {} + QCLImage2D(const QCLImage2D &other); + ~QCLImage2D(); + + QCLImage2D &operator=(const QCLImage2D &other); + + QCLImageFormat format() const; + + int width() const; + int height() const; + + int bytesPerElement() const; + int bytesPerLine() const; + + bool read(void *data, const QRect &rect, int bytesPerLine = 0); + bool read(QImage *image, const QRect &rect = QRect()); + QCLEvent readAsync(void *data, const QRect &rect, + const QCLEventList &after = QCLEventList(), + int bytesPerLine = 0); + + bool write(const void *data, const QRect &rect, int bytesPerLine = 0); + bool write(const QImage &image, const QRect &rect = QRect()); + QCLEvent writeAsync + (const void *data, const QRect &rect, + const QCLEventList &after = QCLEventList(), + int bytesPerLine = 0); + + bool copyTo(const QRect &rect, const QCLImage2D &dest, + const QPoint &destOffset); + bool copyTo(const QRect &rect, const QCLImage3D &dest, + const size_t destOffset[3]); + bool copyTo(const QRect &rect, const QCLBuffer &dest, + size_t destOffset); + QCLEvent copyToAsync + (const QRect &rect, const QCLImage2D &dest, const QPoint &destOffset, + const QCLEventList &after = QCLEventList()); + QCLEvent copyToAsync + (const QRect &rect, const QCLImage3D &dest, const size_t destOffset[3], + const QCLEventList &after = QCLEventList()); + QCLEvent copyToAsync + (const QRect &rect, const QCLBuffer &dest, size_t destOffset, + const QCLEventList &after = QCLEventList()); + + void *map(const QRect &rect, QCLMemoryObject::Access access, + int *bytesPerLine = 0); + QCLEvent mapAsync(void **ptr, const QRect &rect, + QCLMemoryObject::Access access, + const QCLEventList &after = QCLEventList(), + int *bytesPerLine = 0); + + QImage toQImage(bool cached = true); + + void drawImage(QPainter *painter, const QPoint &point, + const QRect &subRect = QRect(), + Qt::ImageConversionFlags flags = Qt::AutoColor); + void drawImage(QPainter *painter, const QRect &targetRect, + const QRect &subRect = QRect(), + Qt::ImageConversionFlags flags = Qt::AutoColor); + +private: + mutable QCLImage2DPrivate *d_ptr; + + Q_DECLARE_PRIVATE(QCLImage2D) + + QCLImage2D(QCLContext *context, cl_mem id, const QCLImageFormat& format); + + friend class QCLContext; +}; + +class Q_CL_EXPORT QCLImage3D : public QCLMemoryObject +{ +public: + QCLImage3D() {} + QCLImage3D(QCLContext *context, cl_mem id) + : QCLMemoryObject(context, id) {} + QCLImage3D(const QCLImage3D &other) + : QCLMemoryObject() { setId(other.context(), other.memoryId()); } + + QCLImage3D &operator=(const QCLImage3D &other) + { + setId(other.context(), other.memoryId()); + return *this; + } + + QCLImageFormat format() const; + + int width() const; + int height() const; + int depth() const; + + int bytesPerElement() const; + int bytesPerLine() const; + int bytesPerSlice() const; + + bool read(void *data, const size_t origin[3], const size_t size[3], + int bytesPerLine = 0, int bytesPerSlice = 0); + QCLEvent readAsync + (void *data, const size_t origin[3], const size_t size[3], + const QCLEventList &after = QCLEventList(), + int bytesPerLine = 0, int bytesPerSlice = 0); + + bool write(const void *data, const size_t origin[3], const size_t size[3], + int bytesPerLine = 0, int bytesPerSlice = 0); + QCLEvent writeAsync + (const void *data, const size_t origin[3], const size_t size[3], + const QCLEventList &after = QCLEventList(), + int bytesPerLine = 0, int bytesPerSlice = 0); + + bool copyTo(const size_t origin[3], const size_t size[3], + const QCLImage3D &dest, const size_t destOffset[3]); + bool copyTo(const size_t origin[3], const QSize &size, + const QCLImage2D &dest, const QPoint &destOffset); + bool copyTo(const size_t origin[3], const size_t size[3], + const QCLBuffer &dest, size_t destOffset); + QCLEvent copyToAsync + (const size_t origin[3], const size_t size[3], + const QCLImage3D &dest, const size_t destOffset[3], + const QCLEventList &after = QCLEventList()); + QCLEvent copyToAsync + (const size_t origin[3], const QSize &size, + const QCLImage2D &dest, const QPoint &destOffset, + const QCLEventList &after = QCLEventList()); + QCLEvent copyToAsync + (const size_t origin[3], const size_t size[3], + const QCLBuffer &dest, size_t destOffset, + const QCLEventList &after = QCLEventList()); + + void *map(const size_t origin[3], const size_t size[3], + QCLMemoryObject::Access access, + int *bytesPerLine = 0, int *bytesPerSlice = 0); + QCLEvent mapAsync + (void **ptr, const size_t origin[3], const size_t size[3], + QCLMemoryObject::Access access, + const QCLEventList &after = QCLEventList(), + int *bytesPerLine = 0, int *bytesPerSlice = 0); +}; + +inline void QCLImage2D::drawImage + (QPainter *painter, const QPoint &point, + const QRect &subRect, Qt::ImageConversionFlags flags) +{ + drawImage(painter, QRect(point.x(), point.y(), -1, -1), subRect, flags); +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclimageformat.h b/Source/src/CL/qclimageformat.h new file mode 100644 index 0000000..a6f6ba5 --- /dev/null +++ b/Source/src/CL/qclimageformat.h @@ -0,0 +1,167 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLIMAGEFORMAT_H +#define QCLIMAGEFORMAT_H + +#include "qclglobal.h" +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; + +class Q_CL_EXPORT QCLImageFormat +{ +public: + enum ChannelOrder + { + Order_R = 0x10B0, + Order_A = 0x10B1, + Order_RG = 0x10B2, + Order_RA = 0x10B3, + Order_RGB = 0x10B4, + Order_RGBA = 0x10B5, + Order_BGRA = 0x10B6, + Order_ARGB = 0x10B7, + Order_Intensity = 0x10B8, + Order_Luminence = 0x10B9, + Order_Rx = 0x10BA, // OpenCL 1.1 + Order_RGx = 0x10BB, // OpenCL 1.1 + Order_RGBx = 0x10BC // OpenCL 1.1 + }; + + enum ChannelType + { + Type_Normalized_Int8 = 0x10D0, + Type_Normalized_Int16 = 0x10D1, + Type_Normalized_UInt8 = 0x10D2, + Type_Normalized_UInt16 = 0x10D3, + Type_Normalized_565 = 0x10D4, + Type_Normalized_555 = 0x10D5, + Type_Normalized_101010 = 0x10D6, + Type_Unnormalized_Int8 = 0x10D7, + Type_Unnormalized_Int16 = 0x10D8, + Type_Unnormalized_Int32 = 0x10D9, + Type_Unnormalized_UInt8 = 0x10DA, + Type_Unnormalized_UInt16 = 0x10DB, + Type_Unnormalized_UInt32 = 0x10DC, + Type_Half_Float = 0x10DD, + Type_Float = 0x10DE + }; + + QCLImageFormat(); + QCLImageFormat(QCLImageFormat::ChannelOrder order, + QCLImageFormat::ChannelType type); + QCLImageFormat(QImage::Format format); + + bool isNull() const; + + QCLImageFormat::ChannelOrder channelOrder() const; + QCLImageFormat::ChannelType channelType() const; + + bool operator==(const QCLImageFormat &other); + bool operator!=(const QCLImageFormat &other); + + QImage::Format toQImageFormat() const { return m_qformat; } + +private: + cl_image_format m_format; + QImage::Format m_qformat; + + friend class QCLContext; +}; + +inline QCLImageFormat::QCLImageFormat() +{ + m_format.image_channel_order = 0; + m_format.image_channel_data_type = 0; + m_qformat = QImage::Format_Invalid; +} + +inline bool QCLImageFormat::isNull() const +{ + return m_format.image_channel_order == 0 && + m_format.image_channel_data_type == 0 && + m_qformat == QImage::Format_Invalid; +} + +inline QCLImageFormat::ChannelOrder QCLImageFormat::channelOrder() const +{ + return QCLImageFormat::ChannelOrder(m_format.image_channel_order); +} + +inline QCLImageFormat::ChannelType QCLImageFormat::channelType() const +{ + return QCLImageFormat::ChannelType(m_format.image_channel_data_type); +} + +inline bool QCLImageFormat::operator==(const QCLImageFormat &other) +{ + return m_format.image_channel_order == + other.m_format.image_channel_order && + m_format.image_channel_data_type == + other.m_format.image_channel_data_type && + m_qformat == other.m_qformat; +} + +inline bool QCLImageFormat::operator!=(const QCLImageFormat &other) +{ + return m_format.image_channel_order != + other.m_format.image_channel_order || + m_format.image_channel_data_type != + other.m_format.image_channel_data_type || + m_qformat != other.m_qformat; +} + +#ifndef QT_NO_DEBUG_STREAM +Q_CL_EXPORT QDebug operator<<(QDebug, const QCLImageFormat &); +#endif + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclkernel.h b/Source/src/CL/qclkernel.h new file mode 100644 index 0000000..26f553b --- /dev/null +++ b/Source/src/CL/qclkernel.h @@ -0,0 +1,480 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLKERNEL_H +#define QCLKERNEL_H + +#include "qclglobal.h" +#include "qclevent.h" +#include "qclworksize.h" +#include "qclmemoryobject.h" +#include "qclsampler.h" +#include "qclvector.h" +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; +class QCLProgram; +class QCLVectorBase; +class QCLDevice; +class QMatrix4x4; +class QColor; + +class QCLKernelPrivate; + +class Q_CL_EXPORT QCLKernel +{ +public: + QCLKernel(); + QCLKernel(QCLContext *context, cl_kernel id); + QCLKernel(const QCLKernel &other); + ~QCLKernel(); + + QCLKernel &operator=(const QCLKernel &other); + + bool isNull() const; + + bool operator==(const QCLKernel &other) const; + bool operator!=(const QCLKernel &other) const; + + cl_kernel kernelId() const; + QCLContext *context() const; + + QCLProgram program() const; + QString name() const; + int argCount() const; + + QCLWorkSize declaredWorkGroupSize() const; + QCLWorkSize declaredWorkGroupSize(const QCLDevice &device) const; + + QCLWorkSize globalWorkSize() const; + void setGlobalWorkSize(const QCLWorkSize &size); + void setGlobalWorkSize(size_t width, size_t height); + void setGlobalWorkSize(size_t width, size_t height, size_t depth); + + void setRoundedGlobalWorkSize(const QCLWorkSize &size); + void setRoundedGlobalWorkSize(size_t width, size_t height); + void setRoundedGlobalWorkSize(size_t width, size_t height, size_t depth); + + QCLWorkSize localWorkSize() const; + void setLocalWorkSize(const QCLWorkSize &size); + void setLocalWorkSize(size_t width, size_t height); + void setLocalWorkSize(size_t width, size_t height, size_t depth); + + QCLWorkSize bestLocalWorkSizeImage2D() const; + QCLWorkSize bestLocalWorkSizeImage3D() const; + + size_t preferredWorkSizeMultiple() const; + + void setArg(int index, cl_int value); + void setArg(int index, cl_uint value); + void setArg(int index, cl_long value); + void setArg(int index, cl_ulong value); + void setArg(int index, float value); + void setArg(int index, const QVector2D &value); + void setArg(int index, const QVector3D &value); + void setArg(int index, const QVector4D &value); + void setArg(int index, const QColor &value); + void setArg(int index, Qt::GlobalColor value); + void setArg(int index, const QPoint &value); + void setArg(int index, const QPointF &value); + void setArg(int index, const QMatrix4x4 &value); + void setArg(int index, const QCLMemoryObject &value); +#if defined(qdoc) + void setArg(int index, const QCLVector &value); +#else + void setArg(int index, const QCLVectorBase &value); +#endif + void setArg(int index, const QCLSampler &value); + void setArg(int index, const void *data, size_t size); + + QCLEvent run(); + QCLEvent run(const QCLEventList &after); + + inline QCLEvent operator()() { return run(); } + + template + inline QCLEvent operator()(const T1 &arg1) + { + setArg(0, arg1); + return run(); + } + + template + inline QCLEvent operator()(const T1 &arg1, const T2 &arg2) + { + setArg(0, arg1); + setArg(1, arg2); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, + const T5 &arg5) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + setArg(4, arg5); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, + const T5 &arg5, const T6 &arg6) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + setArg(4, arg5); + setArg(5, arg6); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, + const T5 &arg5, const T6 &arg6, const T7 &arg7) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + setArg(4, arg5); + setArg(5, arg6); + setArg(6, arg7); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, + const T5 &arg5, const T6 &arg6, const T7 &arg7, const T8 &arg8) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + setArg(4, arg5); + setArg(5, arg6); + setArg(6, arg7); + setArg(7, arg8); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, + const T5 &arg5, const T6 &arg6, const T7 &arg7, const T8 &arg8, + const T9 &arg9) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + setArg(4, arg5); + setArg(5, arg6); + setArg(6, arg7); + setArg(7, arg8); + setArg(8, arg9); + return run(); + } + + template + inline QCLEvent operator() + (const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, + const T5 &arg5, const T6 &arg6, const T7 &arg7, const T8 &arg8, + const T9 &arg9, const T10 &arg10) + { + setArg(0, arg1); + setArg(1, arg2); + setArg(2, arg3); + setArg(3, arg4); + setArg(4, arg5); + setArg(5, arg6); + setArg(6, arg7); + setArg(7, arg8); + setArg(8, arg9); + setArg(9, arg10); + return run(); + } + +#ifndef QT_NO_CONCURRENT + QFuture runInThread(); +#endif + +private: + QScopedPointer d_ptr; + cl_kernel m_kernelId; + + Q_DECLARE_PRIVATE(QCLKernel) +}; + +inline void QCLKernel::setGlobalWorkSize(size_t width, size_t height) +{ + setGlobalWorkSize(QCLWorkSize(width, height)); +} + +inline void QCLKernel::setGlobalWorkSize(size_t width, size_t height, size_t depth) +{ + setGlobalWorkSize(QCLWorkSize(width, height, depth)); +} + +inline void QCLKernel::setRoundedGlobalWorkSize(const QCLWorkSize &size) +{ + setGlobalWorkSize(size.roundTo(localWorkSize())); +} + +inline void QCLKernel::setRoundedGlobalWorkSize(size_t width, size_t height) +{ + setRoundedGlobalWorkSize(QCLWorkSize(width, height)); +} + +inline void QCLKernel::setRoundedGlobalWorkSize(size_t width, size_t height, size_t depth) +{ + setRoundedGlobalWorkSize(QCLWorkSize(width, height, depth)); +} + +inline void QCLKernel::setLocalWorkSize(size_t width, size_t height) +{ + setLocalWorkSize(QCLWorkSize(width, height)); +} + +inline void QCLKernel::setLocalWorkSize(size_t width, size_t height, size_t depth) +{ + setLocalWorkSize(QCLWorkSize(width, height, depth)); +} + +inline void QCLKernel::setArg(int index, cl_int value) +{ + clSetKernelArg(m_kernelId, index, sizeof(value), &value); +} + +inline void QCLKernel::setArg(int index, cl_uint value) +{ + clSetKernelArg(m_kernelId, index, sizeof(value), &value); +} + +inline void QCLKernel::setArg(int index, cl_long value) +{ + clSetKernelArg(m_kernelId, index, sizeof(value), &value); +} + +inline void QCLKernel::setArg(int index, cl_ulong value) +{ + clSetKernelArg(m_kernelId, index, sizeof(value), &value); +} + +inline void QCLKernel::setArg(int index, float value) +{ + clSetKernelArg(m_kernelId, index, sizeof(value), &value); +} + +inline void QCLKernel::setArg(int index, const QVector2D &value) +{ + if (sizeof(value) == (sizeof(float) * 2)) { + clSetKernelArg(m_kernelId, index, sizeof(value), &value); + } else { + float values[2] = {(float)value.x(), (float)value.y()}; + clSetKernelArg(m_kernelId, index, sizeof(values), values); + } +} + +inline void QCLKernel::setArg(int index, const QVector3D &value) +{ + float values[4] = {(float)value.x(), (float)value.y(), (float)value.z(), 1.0f}; + clSetKernelArg(m_kernelId, index, sizeof(values), values); +} + +inline void QCLKernel::setArg(int index, const QVector4D &value) +{ + if (sizeof(value) == (sizeof(float) * 4)) { + clSetKernelArg(m_kernelId, index, sizeof(value), &value); + } else { + float values[4] = {(float)value.x(), (float)value.y(), (float)value.z(), (float)value.w()}; + clSetKernelArg(m_kernelId, index, sizeof(values), values); + } +} + +inline void QCLKernel::setArg(int index, const QPoint &value) +{ + cl_int values[2] = {value.x(), value.y()}; + clSetKernelArg(m_kernelId, index, sizeof(values), values); +} + +inline void QCLKernel::setArg(int index, const QPointF &value) +{ + if (sizeof(value) == (sizeof(float) * 2)) { + clSetKernelArg(m_kernelId, index, sizeof(value), &value); + } else { + float values[2] = {(float)value.x(), (float)value.y()}; + clSetKernelArg(m_kernelId, index, sizeof(values), values); + } +} + +inline void QCLKernel::setArg(int index, const QCLMemoryObject &value) +{ + cl_mem id = value.memoryId(); + clSetKernelArg(m_kernelId, index, sizeof(id), &id); +} + +inline void QCLKernel::setArg(int index, const QCLVectorBase &value) +{ + cl_mem id = value.kernelArg(); + clSetKernelArg(m_kernelId, index, sizeof(id), &id); +} + +inline void QCLKernel::setArg(int index, const QCLSampler &value) +{ + cl_sampler id = value.samplerId(); + clSetKernelArg(m_kernelId, index, sizeof(id), &id); +} + +inline void QCLKernel::setArg(int index, const void *data, size_t size) +{ + clSetKernelArg(m_kernelId, index, size, data); +} + +#ifndef QT_NO_CONCURRENT + +// Convenience function definitions that make it possible to say +// QtConcurrent::run(kernel, ...) and have it do the right thing. +namespace QtConcurrent +{ + +inline QFuture run(QCLKernel &kernel) +{ + return kernel.runInThread(); +} +template +inline QFuture run(QCLKernel &kernel, const Arg1 &arg1) +{ + kernel.setArg(0, arg1); + return kernel.runInThread(); +} +template +inline QFuture run(QCLKernel &kernel, const Arg1 &arg1, const Arg2 &arg2) +{ + kernel.setArg(0, arg1); + kernel.setArg(1, arg2); + return kernel.runInThread(); +} +template +inline QFuture run(QCLKernel &kernel, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) +{ + kernel.setArg(0, arg1); + kernel.setArg(1, arg2); + kernel.setArg(2, arg3); + return kernel.runInThread(); +} +template +inline QFuture run(QCLKernel &kernel, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) +{ + kernel.setArg(0, arg1); + kernel.setArg(1, arg2); + kernel.setArg(2, arg3); + kernel.setArg(3, arg4); + return kernel.runInThread(); +} +template +inline QFuture run(QCLKernel &kernel, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) +{ + kernel.setArg(0, arg1); + kernel.setArg(1, arg2); + kernel.setArg(2, arg3); + kernel.setArg(3, arg4); + kernel.setArg(4, arg5); + return kernel.runInThread(); +} + +} // namespace QtConcurrent + +#endif // QT_NO_CONCURRENT + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclmemoryobject.h b/Source/src/CL/qclmemoryobject.h new file mode 100644 index 0000000..7011da2 --- /dev/null +++ b/Source/src/CL/qclmemoryobject.h @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLMEMORYOBJECT_H +#define QCLMEMORYOBJECT_H + +#include "qclevent.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; + +class Q_CL_EXPORT QCLMemoryObject +{ +protected: + QCLMemoryObject(QCLContext *context = 0) : m_context(context), m_id(0) {} + QCLMemoryObject(QCLContext *context, cl_mem id) + : m_context(context), m_id(id) {} + ~QCLMemoryObject(); + +public: + enum Access + { + ReadWrite = 0x0001, + WriteOnly = 0x0002, + ReadOnly = 0x0004 + }; + + bool isNull() const { return m_id == 0; } + + cl_mem memoryId() const { return m_id; } + QCLContext *context() const { return m_context; } + + QCLMemoryObject::Access access() const; + cl_mem_flags flags() const; + void *hostPointer() const; + size_t size() const; + + void unmap(void *ptr); + QCLEvent unmapAsync + (void *ptr, const QCLEventList &after = QCLEventList()); + + bool operator==(const QCLMemoryObject &other) const; + bool operator!=(const QCLMemoryObject &other) const; + +protected: + void setId(QCLContext *context, cl_mem id); + +private: + QCLContext *m_context; + cl_mem m_id; + + Q_DISABLE_COPY(QCLMemoryObject) +}; + +inline QCLMemoryObject::~QCLMemoryObject() +{ + if (m_id) + clReleaseMemObject(m_id); +} + +inline bool QCLMemoryObject::operator==(const QCLMemoryObject &other) const +{ + return m_id == other.m_id; +} + +inline bool QCLMemoryObject::operator!=(const QCLMemoryObject &other) const +{ + return m_id != other.m_id; +} + +inline void QCLMemoryObject::setId(QCLContext *context, cl_mem id) +{ + m_context = context; + if (id) + clRetainMemObject(id); + if (m_id) + clReleaseMemObject(m_id); + m_id = id; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclplatform.h b/Source/src/CL/qclplatform.h new file mode 100644 index 0000000..1de70c0 --- /dev/null +++ b/Source/src/CL/qclplatform.h @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLPLATFORM_H +#define QCLPLATFORM_H + +#include "qclglobal.h" +#include +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class Q_CL_EXPORT QCLPlatform +{ +public: + QCLPlatform() : m_id(0), m_flags(0) {} + QCLPlatform(cl_platform_id id) : m_id(id), m_flags(0) {} + + bool isNull() const { return m_id == 0; } + + bool isFullProfile() const; + bool isEmbeddedProfile() const; + + QString profile() const; + QString version() const; + QString name() const; + QString vendor() const; + QString extensionSuffix() const; + QStringList extensions() const; + + bool hasExtension(const char *name) const; + + enum VersionFlag + { + Version_1_0 = 0x0001, + Version_1_1 = 0x0002 + }; + Q_DECLARE_FLAGS(VersionFlags, VersionFlag) + + QCLPlatform::VersionFlags versionFlags() const; + + cl_platform_id platformId() const { return m_id; } + + static QList platforms(); + + bool operator==(const QCLPlatform &other) const; + bool operator!=(const QCLPlatform &other) const; + +private: + cl_platform_id m_id; + mutable int m_flags; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QCLPlatform::VersionFlags) + +inline bool QCLPlatform::operator==(const QCLPlatform &other) const +{ + return m_id == other.m_id; +} + +inline bool QCLPlatform::operator!=(const QCLPlatform &other) const +{ + return m_id != other.m_id; +} + +#ifndef QT_NO_DEBUG_STREAM +Q_CL_EXPORT QDebug operator<<(QDebug, const QCLPlatform &); +#endif + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclprogram.h b/Source/src/CL/qclprogram.h new file mode 100644 index 0000000..9bd2e06 --- /dev/null +++ b/Source/src/CL/qclprogram.h @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLPROGRAM_H +#define QCLPROGRAM_H + +#include "qcldevice.h" +#include "qclkernel.h" +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; + +class Q_CL_EXPORT QCLProgram +{ +public: + QCLProgram() : m_context(0), m_id(0) {} + QCLProgram(QCLContext *context, cl_program id) + : m_context(context), m_id(id) {} + QCLProgram(const QCLProgram &other); + ~QCLProgram(); + + QCLProgram &operator=(const QCLProgram &other); + + bool isNull() const { return m_id == 0; } + + cl_program programId() const { return m_id; } + QCLContext *context() const { return m_context; } + + bool build(const QString &options = QString()); + bool build(const QList &devices, const QString &options = QString()); + + QString log() const; + + QList devices() const; + QByteArray sourceCode() const; + QList binaries() const; + + QCLKernel createKernel(const char *name) const; + QCLKernel createKernel(const QByteArray &name) const; + QCLKernel createKernel(const QString &name) const; + + QList createKernels() const; + + static void unloadCompiler(); + + bool operator==(const QCLProgram &other) const; + bool operator!=(const QCLProgram &other) const; + +private: + QCLContext *m_context; + cl_program m_id; +}; + +inline bool QCLProgram::operator==(const QCLProgram &other) const +{ + return m_id == other.m_id; +} + +inline QCLProgram::QCLProgram(const QCLProgram &other) + : m_context(other.m_context), m_id(other.m_id) +{ + if (m_id) + clRetainProgram(m_id); +} + +inline QCLProgram::~QCLProgram() +{ + if (m_id) + clReleaseProgram(m_id); +} + +inline QCLProgram &QCLProgram::operator=(const QCLProgram &other) +{ + m_context = other.m_context; + if (other.m_id) + clRetainProgram(other.m_id); + if (m_id) + clReleaseProgram(m_id); + m_id = other.m_id; + return *this; +} + +inline bool QCLProgram::operator!=(const QCLProgram &other) const +{ + return m_id != other.m_id; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclsampler.h b/Source/src/CL/qclsampler.h new file mode 100644 index 0000000..7e597a8 --- /dev/null +++ b/Source/src/CL/qclsampler.h @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLSAMPLER_H +#define QCLSAMPLER_H + +#include "qclglobal.h" +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLSamplerPrivate; +class QCLContext; + +class Q_CL_EXPORT QCLSampler +{ +public: + QCLSampler() : m_context(0), m_id(0) {} + QCLSampler(QCLContext *context, cl_sampler id) + : m_context(context), m_id(id) {} + QCLSampler(const QCLSampler &other); + ~QCLSampler(); + + QCLSampler &operator=(const QCLSampler &other); + + enum AddressingMode + { + None = 0x1130, // CL_ADDRESS_NONE + ClampToEdge = 0x1131, // CL_ADDRESS_CLAMP_TO_EDGE + Clamp = 0x1132, // CL_ADDRESS_CLAMP + Repeat = 0x1133 // CL_ADDRESS_REPEAT + }; + + enum FilterMode + { + Nearest = 0x1140, // CL_FILTER_NEAREST + Linear = 0x1141 // CL_FILTER_LINEAR + }; + + bool isNull() const { return m_id == 0; } + + bool normalizedCoordinates() const; + QCLSampler::AddressingMode addressingMode() const; + QCLSampler::FilterMode filterMode() const; + + cl_sampler samplerId() const { return m_id; } + QCLContext *context() const { return m_context; } + + bool operator==(const QCLSampler &other) const; + bool operator!=(const QCLSampler &other) const; + +private: + QCLContext *m_context; + cl_sampler m_id; +}; + +inline QCLSampler::QCLSampler(const QCLSampler &other) + : m_context(other.m_context), m_id(other.m_id) +{ + if (m_id) + clRetainSampler(m_id); +} + +inline QCLSampler::~QCLSampler() +{ + if (m_id) + clReleaseSampler(m_id); +} + +inline QCLSampler &QCLSampler::operator=(const QCLSampler &other) +{ + m_context = other.m_context; + if (other.m_id) + clRetainSampler(other.m_id); + if (m_id) + clReleaseSampler(m_id); + m_id = other.m_id; + return *this; +} + +inline bool QCLSampler::operator==(const QCLSampler &other) const +{ + return m_id == other.m_id; +} + +inline bool QCLSampler::operator!=(const QCLSampler &other) const +{ + return m_id != other.m_id; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qcluserevent.h b/Source/src/CL/qcluserevent.h new file mode 100644 index 0000000..73d7b58 --- /dev/null +++ b/Source/src/CL/qcluserevent.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLUSEREVENT_H +#define QCLUSEREVENT_H + +#include "qclevent.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; + +class Q_CL_EXPORT QCLUserEvent : public QCLEvent +{ +public: + QCLUserEvent() : QCLEvent() {} + QCLUserEvent(cl_event id); + QCLUserEvent(const QCLEvent &other); + + QCLUserEvent &operator=(const QCLEvent &other); + + void setFinished(); + void setStatus(cl_int status); + +private: + void validateEvent(); + + // Used by QCLContext::createUserEvent() to avoid + // the overhead of validateEvent(). + QCLUserEvent(cl_event id, bool dummy) + : QCLEvent(id) { Q_UNUSED(dummy); } + + friend class QCLContext; +}; + +inline void QCLUserEvent::setFinished() +{ + setStatus(CL_COMPLETE); +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclvector.h b/Source/src/CL/qclvector.h new file mode 100644 index 0000000..1864e85 --- /dev/null +++ b/Source/src/CL/qclvector.h @@ -0,0 +1,228 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLVECTOR_H +#define QCLVECTOR_H + +#include "qclbuffer.h" +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLContext; +class QCLKernel; +class QCLVectorBasePrivate; + +class Q_CL_EXPORT QCLVectorBase +{ +protected: + QCLVectorBase(size_t elemSize); + QCLVectorBase(size_t elemSize, const QCLVectorBase &other); + ~QCLVectorBase(); + + QCLVectorBasePrivate *d_ptr; + size_t m_elemSize; + size_t m_size; + mutable void *m_mapped; + + void assign(const QCLVectorBase &other); + + void create(QCLContext *context, int size, QCLMemoryObject::Access access); + void release(); + + void map(); + void unmap() const; + + void read(void *data, int count, int offset); + void write(const void *data, int count, int offset); + + cl_mem memoryId() const; + QCLContext *context() const; + + cl_mem kernelArg() const; + + friend class QCLKernel; +}; + +template +class QCLVector : public QCLVectorBase +{ +public: + QCLVector(); + QCLVector(const QCLVector &other); + ~QCLVector(); + + QCLVector &operator=(const QCLVector &other); + + bool isNull() const; + + void release(); + + inline bool isEmpty() const { return m_size == 0; } + inline int size() const { return m_size; } + + T &operator[](int index); + const T &operator[](int index) const; + + void read(T *data, int count, int offset = 0); + void write(const T *data, int count, int offset = 0); + void write(const QVector &data, int offset = 0); + + QCLContext *context() const; + QCLBuffer toBuffer() const; + +private: + QCLVector(QCLContext *context, int size, QCLMemoryObject::Access access); + + friend class QCLContext; +}; + +template +Q_INLINE_TEMPLATE QCLVector::QCLVector() + : QCLVectorBase(sizeof(T)) {} + +template +Q_INLINE_TEMPLATE QCLVector::QCLVector + (QCLContext *context, int size, QCLMemoryObject::Access access) + : QCLVectorBase(sizeof(T)) +{ + QCLVectorBase::create(context, size, access); +} + +template +Q_INLINE_TEMPLATE QCLVector::QCLVector(const QCLVector &other) + : QCLVectorBase(sizeof(T), other) +{ +} + +template +Q_INLINE_TEMPLATE QCLVector::~QCLVector() {} + +template +QCLVector &QCLVector::operator=(const QCLVector &other) +{ + assign(other); + return *this; +} + +template +Q_INLINE_TEMPLATE bool QCLVector::isNull() const +{ + return d_ptr == 0; +} + +template +Q_INLINE_TEMPLATE void QCLVector::release() +{ + QCLVectorBase::release(); +} + +template +Q_INLINE_TEMPLATE T &QCLVector::operator[](int index) +{ + Q_ASSERT_X(index >= 0 && index < int(m_size), "QCLVector::operator[]", + "index out of range"); + if (!m_mapped) + map(); + return (reinterpret_cast(m_mapped))[index]; +} + +template +Q_INLINE_TEMPLATE const T &QCLVector::operator[](int index) const +{ + Q_ASSERT_X(index >= 0 && index < int(m_size), "QCLVector::operator[]", + "index out of range"); + if (!m_mapped) + const_cast *>(this)->map(); + return (reinterpret_cast(m_mapped))[index]; +} + +template +Q_INLINE_TEMPLATE void QCLVector::write + (const T *data, int count, int offset) +{ + Q_ASSERT(count >= 0 && offset >= 0 && (offset + count) <= int(m_size)); + QCLVectorBase::write(data, count * sizeof(T), offset * sizeof(T)); +} + +template +Q_INLINE_TEMPLATE void QCLVector::read + (T *data, int count, int offset) +{ + Q_ASSERT(count >= 0 && offset >= 0 && (offset + count) <= int(m_size)); + QCLVectorBase::read(data, count * sizeof(T), offset * sizeof(T)); +} + +template +Q_INLINE_TEMPLATE void QCLVector::write + (const QVector &data, int offset) +{ + write(data.constData(), data.size(), offset); +} + +template +Q_INLINE_TEMPLATE QCLContext *QCLVector::context() const +{ + return QCLVectorBase::context(); +} + +template +Q_INLINE_TEMPLATE QCLBuffer QCLVector::toBuffer() const +{ + cl_mem id = QCLVectorBase::memoryId(); + if (id) { + clRetainMemObject(id); + return QCLBuffer(context(), id); + } else { + return QCLBuffer(); + } +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/CL/qclworksize.h b/Source/src/CL/qclworksize.h new file mode 100644 index 0000000..d13bfd5 --- /dev/null +++ b/Source/src/CL/qclworksize.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtOpenCL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCLWORKSIZE_H +#define QCLWORKSIZE_H + +#include "qclglobal.h" +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(CL) + +class QCLDevice; + +class Q_CL_EXPORT QCLWorkSize +{ +public: + QCLWorkSize() + : m_dim(1) { m_sizes[0] = 1; m_sizes[1] = 1; m_sizes[2] = 1; } + QCLWorkSize(size_t size) + : m_dim(1) { m_sizes[0] = size; m_sizes[1] = 1; m_sizes[2] = 1; } + QCLWorkSize(size_t width, size_t height) + : m_dim(2) { m_sizes[0] = width; m_sizes[1] = height; m_sizes[2] = 1; } + QCLWorkSize(const QSize &size) + : m_dim(2) { m_sizes[0] = size.width(); m_sizes[1] = size.height(); m_sizes[2] = 1; } + QCLWorkSize(size_t width, size_t height, size_t depth) + : m_dim(3) + { m_sizes[0] = width; m_sizes[1] = height; m_sizes[2] = depth; } + + size_t dimensions() const { return m_dim; } + size_t width() const { return m_sizes[0]; } + size_t height() const { return m_sizes[1]; } + size_t depth() const { return m_sizes[2]; } + + const size_t *sizes() const { return m_sizes; } + + bool operator==(const QCLWorkSize &other) const; + bool operator!=(const QCLWorkSize &other) const; + + QCLWorkSize toLocalWorkSize + (const QCLWorkSize &maxWorkItemSize, size_t maxItemsPerGroup) const; + QCLWorkSize toLocalWorkSize(const QCLDevice &device) const; + + QCLWorkSize roundTo(const QCLWorkSize &size) const; + + QString toString() const; + static QCLWorkSize fromString(const QString &str); + +private: + size_t m_dim; + size_t m_sizes[3]; +}; + +Q_DECLARE_TYPEINFO(QCLWorkSize, Q_MOVABLE_TYPE); + +inline bool QCLWorkSize::operator==(const QCLWorkSize &other) const +{ + return m_dim == other.m_dim && + m_sizes[0] == other.m_sizes[0] && + m_sizes[1] == other.m_sizes[1] && + m_sizes[2] == other.m_sizes[2]; +} + +inline bool QCLWorkSize::operator!=(const QCLWorkSize &other) const +{ + return m_dim != other.m_dim || + m_sizes[0] != other.m_sizes[0] || + m_sizes[1] != other.m_sizes[1] || + m_sizes[2] != other.m_sizes[2]; +} + +#ifndef QT_NO_DATASTREAM +Q_CL_EXPORT QDataStream &operator<<(QDataStream &, const QCLWorkSize &); +Q_CL_EXPORT QDataStream &operator>>(QDataStream &, QCLWorkSize &); +#endif + +#ifndef QT_NO_DEBUG_STREAM +Q_CL_EXPORT QDebug operator<<(QDebug, const QCLWorkSize &); +#endif + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/Source/src/DataEngine/cusdr_audioReceiver.cpp b/Source/src/DataEngine/cusdr_audioReceiver.cpp new file mode 100644 index 0000000..e1bbeaf --- /dev/null +++ b/Source/src/DataEngine/cusdr_audioReceiver.cpp @@ -0,0 +1,116 @@ +/** +* @file audioReceiver.cpp +* @brief audio receiver class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-10-02 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_AUDIO_RECEIVER + +#include "cusdr_audioReceiver.h" + + +AudioReceiver::AudioReceiver(THPSDRParameter *ioData) + : QObject() + , set(Settings::instance()) + , io(ioData) + , m_client(0) +{ +} + +AudioReceiver::~AudioReceiver() { + +} + +void AudioReceiver::displayAudioRcvrSocketError(QAbstractSocket::SocketError error) { + + AUDIO_RECEIVER << "audio client socket error:" << error; +} + +void AudioReceiver::initClient() { + + quint16 port = (quint16) (set->getAudioPort() + (io->audio_rx * 2)); + + QUdpSocket *socket = new QUdpSocket(); + socket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + + if (socket->bind(port, QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress)) { + + CHECKED_CONNECT( + socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayAudioRcvrSocketError(QAbstractSocket::SocketError))); + + CHECKED_CONNECT( + socket, + SIGNAL(readyRead()), + this, + SLOT(readPendingAudioRcvrData())); + + clientConnections.append(socket); + + AUDIO_RECEIVER << "client socket binding successful."; + m_message = tr("[server]: listening for rx %1 audio on port %2."); + emit messageEvent(m_message.arg(io->audio_rx).arg(port)); + + //m_dataEngine->clientConnected = true; + // need to implement connection in dataEngine !!!! + emit clientConnectedEvent(true); + //rcveIQ_toggle = false; + } + else { + + m_message = tr("[server]: bind socket failed for socket on port %1."); + emit messageEvent(m_message.arg(port)); + } +} + +void AudioReceiver::readPendingAudioRcvrData() { + + QUdpSocket *socket = qobject_cast(sender()); + + while (socket->hasPendingDatagrams()) { + + m_datagram.resize(socket->pendingDatagramSize()); + + if (socket->readDatagram(m_datagram.data(), m_datagram.size()) < 0) { + + AUDIO_RECEIVER << "read client" << m_client << "socket failed."; + if (io->rcveIQ_toggle) { // toggles the rcveIQ signal + + emit rcveIQEvent(this, 2); + io->rcveIQ_toggle = false; + } + } + else { + + io->au_queue.enqueue(m_datagram); + + if (!io->rcveIQ_toggle) { // toggles the rcveIQ signal + + emit rcveIQEvent(this, 1); + io->rcveIQ_toggle = true; + } + } + } +} diff --git a/Source/src/DataEngine/cusdr_audioReceiver.h b/Source/src/DataEngine/cusdr_audioReceiver.h new file mode 100644 index 0000000..4d6f8f5 --- /dev/null +++ b/Source/src/DataEngine/cusdr_audioReceiver.h @@ -0,0 +1,87 @@ +/** +* @file audioReceiver.h +* @brief audio receiver header file +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-10-02 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_AUDIORECEIVER_H +#define _CUSDR_AUDIORECEIVER_H + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_settings.h" + +#ifdef LOG_AUDIO_RECEIVER +# define AUDIO_RECEIVER qDebug().nospace() << "AudioReceiver::\t" +#else +# define AUDIO_RECEIVER nullDebug() +#endif + + + +class AudioReceiver : public QObject { + + Q_OBJECT + +public: + AudioReceiver(THPSDRParameter *ioData = 0); + ~AudioReceiver(); + + //int id; + +public slots: + void initClient(); + +private: + Settings* set; + QMutex m_mutex; + + QList clientConnections; + QString m_message; + QByteArray m_datagram; + + THPSDRParameter *io; + + int m_client; + +private slots: + void displayAudioRcvrSocketError(QAbstractSocket::SocketError error); + void readPendingAudioRcvrData(); + +signals: + void messageEvent(QString message); + void rcveIQEvent(QObject *sender, int value); + void outputBufferEvent(unsigned char* outbuffer); + void clientConnectedEvent(bool value); + void newData(); + void newAudioData(); +}; + +#endif // _CUSDR_AUDIORECEIVER_H diff --git a/Source/src/DataEngine/cusdr_chirpProcessor.cpp b/Source/src/DataEngine/cusdr_chirpProcessor.cpp new file mode 100644 index 0000000..ed84a0d --- /dev/null +++ b/Source/src/DataEngine/cusdr_chirpProcessor.cpp @@ -0,0 +1,576 @@ +/** +* @file cusdr_chirpProcessor.cpp +* @brief chirp data processor class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-09-22 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_CHIRP_PROCESSOR + +#include "cusdr_chirpProcessor.h" + +ChirpProcessor::ChirpProcessor(THPSDRParameter *ioData) + : QObject() + , set(Settings::instance()) + , io(ioData) + , m_stopped(false) + , m_specMax(0.0f) + , m_specMin(0.0f) + , m_sampleRate(set->getSampleRate()) + , m_downRate(set->getChirpDownSampleRate()) + , m_specAvgLength(1) + , m_filterLowerFrequency((float)set->getChirpFilterLowerFrequency()) + , m_filterUpperFrequency((float)set->getChirpFilterUpperFrequency()) + , m_switch(false) + , m_showChirpFFT(false) + , m_chirpBufferLength(set->getChirpBufferLength()) + , m_chirpSidebandFactor(1.0f) +{ + /*m_QCPXin = initQCPX(BUFFERSIZE); + m_temp0 = initQCPX(BUFFERSIZE); + m_temp2 = initQCPX(BUFFERSIZE/m_downRate); + + m_temp1 = initQCPX(FULL_BUFFERSIZE); + m_temp3 = initQCPX(FULL_BUFFERSIZE);*/ + + /* + m_cpxIn = mallocCPX(BUFFERSIZE); + m_tmp0 = mallocCPX(BUFFERSIZE); + m_tmp2 = mallocCPX(BUFFERSIZE/m_downRate); + + m_cpxInFilt = mallocCPX(FULL_BUFFERSIZE); + m_cpxRxFFT = mallocCPX(FULL_BUFFERSIZE); + m_tmp1 = mallocCPX(FULL_BUFFERSIZE); + m_tmp3 = mallocCPX(FULL_BUFFERSIZE); + m_cpxChirpIn = mallocCPX(FULL_BUFFERSIZE); + m_cpxChirpOut = mallocCPX(FULL_BUFFERSIZE); + m_cpxChirpTmp = mallocCPX(FULL_BUFFERSIZE); + m_cpxOut = mallocCPX(FULL_BUFFERSIZE); + */ + m_cpxIn.resize(BUFFERSIZE); + m_tmp0.resize(BUFFERSIZE); + m_tmp2.resize(BUFFERSIZE/m_downRate); + + m_cpxInFilt.resize(FULL_BUFFERSIZE); + m_cpxRxFFT.resize(FULL_BUFFERSIZE); + m_tmp1.resize(FULL_BUFFERSIZE); + m_tmp3.resize(FULL_BUFFERSIZE); + m_cpxChirpIn.resize(FULL_BUFFERSIZE); + m_cpxChirpOut.resize(FULL_BUFFERSIZE); + m_cpxChirpTmp.resize(FULL_BUFFERSIZE); + m_cpxOut.resize(FULL_BUFFERSIZE); + + + /* + memset(m_cpxIn, 0, BUFFERSIZE * sizeof(CPX)); + memset(m_tmp0, 0, BUFFERSIZE * sizeof(CPX)); + memset(m_tmp2, 0, (BUFFERSIZE/4) * sizeof(CPX)); + + memset(m_cpxInFilt, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_cpxRxFFT, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_tmp1, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_tmp3, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_cpxOut, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_cpxChirpIn, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_cpxChirpOut, 0, FULL_BUFFERSIZE * sizeof(CPX)); + memset(m_cpxChirpTmp, 0, FULL_BUFFERSIZE * sizeof(CPX)); + */ + + // FFTs by fftw + m_chirpFFT = new QFFT(FULL_BUFFERSIZE); + m_matchedFFT = new QFFT(FULL_BUFFERSIZE); + + // FIR band pass filter + //m_filter = new QFilter(this, FULL_BUFFERSIZE, 2); + // 2 = FIR Bandpass, 5 = Bartlett window + m_filter = new QFilter(this, BUFFERSIZE, 2, 2); + + // set the BPF + m_filter->setFilter(500.0f, 2500.0f); + m_filter->setStreamMode(true); + + setupConnections(); +} + +ChirpProcessor::~ChirpProcessor() { + + while (average_queue.length() > 0) + average_queue.dequeue(); + + /* + freeCPX(m_cpxIn); + freeCPX(m_cpxOut); + freeCPX(m_cpxInFilt); + freeCPX(m_cpxRxFFT); + freeCPX(m_cpxChirpIn); + freeCPX(m_cpxChirpOut); + freeCPX(m_tmp0); + freeCPX(m_tmp1); + */ + + /* + delete m_cpxIn; + delete m_cpxOut; + delete m_cpxInFilt; + delete m_cpxRxFFT; + delete m_cpxChirpIn; + delete m_cpxChirpOut; + delete m_tmp0; + delete m_tmp1; + */ + + delete m_chirpFFT; + delete m_matchedFFT; +} + +void ChirpProcessor::stop() { + + m_stopped = true; +} + +void ChirpProcessor::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(samplingRateChanged(QObject *, int))); + + CHECKED_CONNECT_OPT( + set, + SIGNAL(chirpFilterLowerFrequencyChanged(int)), + this, + SLOT(setFilterLowerFrequency(int)), + Qt::DirectConnection); + + CHECKED_CONNECT_OPT( + set, + SIGNAL(chirpFilterUpperFrequencyChanged(int)), + this, + SLOT(setFilterUpperFrequency(int)), + Qt::DirectConnection); + + CHECKED_CONNECT_OPT( + set, + SIGNAL(chirpAvgLengthChanged(int)), + this, + SLOT(setDistSpectrumAvgLength(int)), + Qt::DirectConnection); + + CHECKED_CONNECT_OPT( + set, + SIGNAL(chirpFFTShowChanged(bool)), + this, + SLOT(setChirpFFTShow(bool)), + Qt::DirectConnection); + + CHECKED_CONNECT_OPT( + set, + SIGNAL(chirpSidebandChanged(bool)), + this, + SLOT(setChirpSideband(bool)), + Qt::DirectConnection); +} + +int ChirpProcessor::setSpectrumBufferSize(int size) { + + int i = 1; + while (i < size) i *= 2; + + return i; +} + +void ChirpProcessor::processChirpData() { + + forever { + + //matchedFilter(io->chirp_queue.dequeue()); + matchedFilterFIRFilter(io->chirp_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void ChirpProcessor::matchedFilterFIRFilter(QList data) { + + int dataLength = data.length(); + int dataIdx = 0; + int buffer = 0; + int newsize = (int)(BUFFERSIZE / m_downRate); + + CHIRP_PROCESSOR_DEBUG << "start matched filter - samples:" << dataLength; + + // filtering to 2kHz by constant-overlap-add (COLA) + while (dataIdx < dataLength) { + + dataIdx = 2 * buffer * BUFFERSIZE; + for (int i = 0; i < 2 * BUFFERSIZE; i += 2) { + + if (dataIdx + i + 1 < dataLength) { + + m_cpxIn[i/2].re = data.at(dataIdx + i); + m_cpxIn[i/2].im = data.at(dataIdx + i + 1); + } + else { + + dataIdx = dataLength; + break; + } + } + + // BPF 2.5 kHz + m_filter->ProcessFilter(m_cpxIn, m_tmp0, BUFFERSIZE); + + // decimate by 4 + decimate(m_tmp0, m_tmp2, BUFFERSIZE, m_downRate); + + for (int i = 0; i < newsize; i++) { + + m_cpxInFilt[buffer * newsize + i].re = m_tmp2[i].re; + m_cpxInFilt[buffer * newsize + i].im = m_tmp2[i].im; + } + buffer++; + } + + // Due to the COLA method the filter output gets shifet by BUFFERSIZE/2 bytes. + // In order to have a buffer in full chirp length, we save the last newsize/2 bytes + // (due to decimation by downrate) and add it to the beginning of the newbuffer. + for (int i = 0; i < FULL_BUFFERSIZE - newsize/2; i++) { + + if (i < newsize/2) { + + m_cpxInFilt[i].re = m_tmp3[i].re; + m_cpxInFilt[i].im = m_tmp3[i].im; + } + else { + + m_cpxInFilt[i].re = m_cpxInFilt[i + newsize/2].re; + m_cpxInFilt[i].im = m_cpxInFilt[i + newsize/2].im; + } + + } + + // save the last buffer + for (int i = 0; i < newsize/2; i++) { + + m_tmp3[i].re = m_tmp2[i].re; + m_tmp3[i].im = m_tmp2[i].im; + } + + // map rx signal to the frequency domain + m_matchedFFT->DoFFTWForward(m_cpxInFilt, m_cpxRxFFT, FULL_BUFFERSIZE); + + // multiply the chirp signal with the complex conjugate of the received signal + for (int i = 0; i < FULL_BUFFERSIZE; i++) { + + // f * ~g + m_tmp1[i].re = (m_cpxChirpOut[i].re * m_cpxRxFFT[i].re) + (m_cpxChirpOut[i].im * m_cpxRxFFT[i].im); + m_tmp1[i].im = (m_cpxChirpOut[i].im * m_cpxRxFFT[i].re) - (m_cpxChirpOut[i].re * m_cpxRxFFT[i].im); + + // ~f * g + //m_tmp1[i].re = (m_cpxRxFFT[i].re * m_cpxChirpOut[i].re) + (m_cpxRxFFT[i].im * m_cpxChirpOut[i].im); + //m_tmp1[i].im = (m_cpxRxFFT[i].im * m_cpxChirpOut[i].re) - (m_cpxRxFFT[i].re * m_cpxChirpOut[i].im); + + // f * g + //m_tmp1[i].re = (m_cpxChirpOut[i].re * m_cpxRxFFT[i].re) - (m_cpxChirpOut[i].im * m_cpxRxFFT[i].im); + //m_tmp1[i].im = (m_cpxChirpOut[i].re * m_cpxRxFFT[i].im) + (m_cpxChirpOut[i].im * m_cpxRxFFT[i].re); + } + + // map back to time domain + m_matchedFFT->DoFFTWInverse(m_tmp1, m_cpxOut, FULL_BUFFERSIZE); + + float max = -1000; + float min = 1000; + float mean = 0.0f; + float oneOverNorm = 1.0f / FULL_BUFFERSIZE; + + for (int i = 0; i < FULL_BUFFERSIZE; i++) { + + if (!m_showChirpFFT) { + + m_spectrumBufferFull[i] = (float)(10.0 * log10(MagCPX(ScaleCPX(m_cpxOut[i], oneOverNorm)) + 1.5E-45)); + + if (m_spectrumBufferFull[i] > max) max = m_spectrumBufferFull[i]; + if (m_spectrumBufferFull[i] < min) min = m_spectrumBufferFull[i]; + mean += m_spectrumBufferFull[i]; + } + else { + //m_spectrumBufferFull[i] = (float)(10.0 * log10(SqrMagCPX(m_tmp1[i]) + 1.5E-45)); + //m_spectrumBufferFull[i] = (float)(10.0 * log10(SqrMagCPX(ScaleCPX(m_tmp1[i], oneOverNorm)) + 1.5E-45)); + m_spectrumBufferFull[i] = (float)(10.0 * log10(MagCPX(m_cpxRxFFT[i]) + 1.5E-45)); + //m_spectrumBufferFull[i] = (float)(10.0 * log10(SqrMagCPX(m_cpxChirpOut[i]) + 1.5E-45) + 50.0f); + //m_spectrumBufferFull[i] = (float)(10.0 * log10(SqrMagCPX(SubCPX(m_cpxChirpOut[i], m_cpxRxFFT[i])) + 1.5E-45) + 50.0f); + //m_spectrumBufferFull[i] = (float)(10.0 * log10(MagCPX(m_cpxInFilt[i]) + 1.5E-45)); + //m_spectrumBufferFull[i] = (float)(10.0 * log10(MagCPX(m_cpxIn[i]) + 1.5E-45)); + } + } + + mean *= 1.0f/FULL_BUFFERSIZE; + CHIRP_PROCESSOR_DEBUG << "dist min" << min << "max" << max << "mean" << mean; + CHIRP_PROCESSOR_DEBUG << "dist delta" << max - mean; + + // we take the first half of the matched filter output to display + memcpy(m_spectrumBuffer, m_spectrumBufferFull, (FULL_BUFFERSIZE/2) * sizeof(float)); + + // we take the full length for the frequency spectrum, + // because we want to see positive as well as negative spectras + if (m_showChirpFFT) { + + int topsize = FULL_BUFFERSIZE - 1; + + // reorder the RX FFT buffer + for (int i = 0; i < FULL_BUFFERSIZE/2; i++) { + + m_fftSpectrumBuffer[topsize - i] = m_spectrumBufferFull[i + FULL_BUFFERSIZE/2]; + m_fftSpectrumBuffer[FULL_BUFFERSIZE/2 - i] = m_spectrumBufferFull[i]; + } + } + setSpectras(m_spectrumBuffer, m_fftSpectrumBuffer); +} + +void ChirpProcessor::setSpectras(const float *distance, const float *chirpfft) { + + if (m_showChirpFFT) + set->setChirpSpectrumBuffer(m_sampleRate/m_downRate, FULL_BUFFERSIZE, chirpfft); + + else { + if (m_specAvgLength > 1) + //spectrumAveraging(FULL_BUFFERSIZE, distance); + spectrumAveraging(FULL_BUFFERSIZE/2, distance); + else + //set->setChirpSpectrumBuffer(m_sampleRate/m_downRate, FULL_BUFFERSIZE, distance); + set->setChirpSpectrumBuffer(m_sampleRate/m_downRate, FULL_BUFFERSIZE/2, distance); + } +} + +void ChirpProcessor::spectrumAveraging(qint64 length, const float *buffer) { + + QVector m_specBuf(length); + + m_mutex.lock(); + + memcpy( + (float *) m_specBuf.data(), + (float *) &buffer[0], + length * sizeof(float)); + + average_queue.enqueue(m_specBuf); + + float specMax = 0.0f; + float specMin = 0.0f; + float specMean = 0.0f; + if (average_queue.size() <= m_specAvgLength) { + + for (int i = 0; i < length; i++) { + + m_tmpBuf[i] += average_queue.last().data()[i]; + m_outBuf[i] = m_tmpBuf[i] * (1.0f/average_queue.size()); + specMean += m_outBuf[i]; + + if (m_outBuf[i] > specMax) specMax = m_outBuf[i]; + if (m_outBuf[i] < specMin) specMin = m_outBuf[i]; + } + + m_mutex.unlock(); + + specMean *= 1.0f/FULL_BUFFERSIZE; + CHIRP_PROCESSOR_DEBUG << "distance spectrum averaging size" << average_queue.size(); + CHIRP_PROCESSOR_DEBUG << "specMin =" << specMin << "specMax =" << specMax; + CHIRP_PROCESSOR_DEBUG << "distance spectrum mean value" << specMean; + set->setChirpSpectrumBuffer(m_sampleRate, FULL_BUFFERSIZE, m_outBuf); + return; + } + + for (int i = 0; i < length; i++) { + + m_tmpBuf[i] -= average_queue.first().at(i); + m_tmpBuf[i] += average_queue.last().at(i); + m_outBuf[i] = m_tmpBuf[i] * m_scale; + specMean += m_outBuf[i]; + } + + //set->setChirpSpectrumBuffer(m_sampleRate, FULL_BUFFERSIZE, m_outBuf); + set->setChirpSpectrumBuffer(m_sampleRate, FULL_BUFFERSIZE/2, m_outBuf); + average_queue.dequeue(); + + m_mutex.unlock(); +} + +void ChirpProcessor::generateLocalChirp() { + + const int sampleRate = m_sampleRate / m_downRate; + + //memset(m_cpxChirpIn, 0, FULL_BUFFERSIZE * sizeof(CPX)); + //memset(m_cpxChirpOut, 0, FULL_BUFFERSIZE * sizeof(CPX)); + m_cpxChirpIn.resize(FULL_BUFFERSIZE); + m_cpxChirpOut.resize(FULL_BUFFERSIZE); + + + qreal time = set->getChirpBufferDurationUs() / 1.0E6; + qint64 length = (qint64)(sampleRate * time); + + qreal a = ONEPI * (set->getUpperChirpFreq() - set->getLowerChirpFreq()) / time; + qreal b = TWOPI * set->getLowerChirpFreq(); + + for (int i = 0; i < length; i++) { + + // forward chirp + qreal t = (qreal)(1.0f * i/length); + // backward chirp + //qreal t = (qreal)(1.0f * (length-i)/length); + + // complex chirp signal + m_cpxChirpIn[i].re = qSin(a * t * t + b * t); + m_cpxChirpIn[i].im = qCos(a * t * t + b * t); + + //m_cpxChirpTmp[i].re = qSin(a * t * t + b * t); + //m_cpxChirpTmp[i].im = qCos(a * t * t + b * t); + + //m_cpxChirpIn[i].re = qCos(a * t * t + b * t); + //m_cpxChirpIn[i].im = qSin(a * t * t + b * t); + + //m_cpxChirpIn[i].re = qSin(a * t * t + b * t); + //m_cpxChirpIn[i].im = -qCos(a * t * t + b * t); + } + + //m_specBufferSize = setSpectrumBufferSize(length); + + // BPF 2.5 kHz + //m_filter->ProcessFilter(m_cpxChirpTmp, m_cpxChirpIn, FULL_BUFFERSIZE); + + // transform chirp signal to frequency domain + m_chirpFFT->DoFFTWForward(m_cpxChirpIn, m_cpxChirpOut, FULL_BUFFERSIZE); + + float dur = set->getChirpBufferDurationUs() / 1000.0f; + + CHIRP_PROCESSOR_DEBUG << "chirp buffer changed:"; + CHIRP_PROCESSOR_DEBUG << " bufferLength" << length; + //CHIRP_PROCESSOR_DEBUG << " spectrum buffer size" << m_specBufferSize; + CHIRP_PROCESSOR_DEBUG << " start frequency (Hz)" << set->getLowerChirpFreq(); + CHIRP_PROCESSOR_DEBUG << " end frequency (Hz)" << set->getUpperChirpFreq(); + CHIRP_PROCESSOR_DEBUG << " duration (ms)" << dur; +} + +//void ChirpProcessor::decimate(CPX *in, CPX *out, int size, int downrate) { +void ChirpProcessor::decimate(const CPX &in, CPX &out, int size, int downrate) { + + int newsize = size / downrate; + + //memset(out, 0, newsize * sizeof(CPX)); + out.resize(newsize); + + for (int j = 0; j < newsize; j++) { + for (int k = 0; k < downrate; k++) { + + if (j * downrate + k < size) { + + /*out[j].re += m_tmpDec[j * downrate + k].re; + out[j].im += m_tmpDec[j * downrate + k].im;*/ + out[j].re += in[j * downrate + k].re; + out[j].im += in[j * downrate + k].im; + } + } + } +} + +//void ChirpProcessor::decimate(QList data, CPX *out, int downrate) { +void ChirpProcessor::decimate(const QList &data, CPX &out, int downrate) { + + //memset(out, 0, 16 * BUFFER_SIZE * sizeof(CPX)); + out.resize(16 * BUFFER_SIZE); + + for (int j = 0; j < data.length()/4; j += 2) { + for (int k = 0; k < downrate; k++) { + + if (j * downrate + 2*k < data.length()) { + + out[j/2].re += data.at(j * downrate + 2*k); + out[j/2].im += data.at(j * downrate + 2*k + 1); + } + } + } +} + +void ChirpProcessor::samplingRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; +} + +void ChirpProcessor::setDistSpectrumAvgLength(int value) { + + m_mutex.lock(); + + //for (int i = 0; i < SAMPLE_BUFFER_SIZE; i++) m_tmpBuf[i] = 0.0f; + memset(m_tmpBuf, 0, FULL_BUFFERSIZE * sizeof(float)); + + while (!average_queue.isEmpty()) + average_queue.dequeue(); + + m_specAvgLength = value; + + if (m_specAvgLength > 0) + m_scale = 1.0f / m_specAvgLength; + else + m_scale = 1.0f; + + m_mutex.unlock(); +} + +void ChirpProcessor::setChirpFFTShow(bool value) { + + m_showChirpFFT = value; + +} + +void ChirpProcessor::setChirpSideband(bool value) { + + if (value) + m_chirpSidebandFactor = 1.0f; + else + m_chirpSidebandFactor = -1.0f; + + generateLocalChirp(); +} + +void ChirpProcessor::setFilterLowerFrequency(int value) { + + if ((int)m_filterLowerFrequency == value) return; + m_filterLowerFrequency = 1.0f * value; + + m_filter->setFilter(m_filterLowerFrequency, m_filterUpperFrequency); +} + +void ChirpProcessor::setFilterUpperFrequency(int value) { + + if ((int)m_filterUpperFrequency == value) return; + m_filterUpperFrequency = 1.0f * value; + + m_filter->setFilter(m_filterLowerFrequency, m_filterUpperFrequency); +} diff --git a/Source/src/DataEngine/cusdr_chirpProcessor.h b/Source/src/DataEngine/cusdr_chirpProcessor.h new file mode 100644 index 0000000..26fefc6 --- /dev/null +++ b/Source/src/DataEngine/cusdr_chirpProcessor.h @@ -0,0 +1,145 @@ +/** +* @file cusdr_chirpProcessor.h +* @brief chirp processor header file +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-09-22 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_CHIRPPROCESSOR_H +#define _CUSDR_CHIRPPROCESSOR_H + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_settings.h" +#include "QtDSP/qtdsp_qComplex.h" +#include "QtDSP/qtdsp_filter.h" +#include "QtDSP/qtdsp_fft.h" + +#ifdef LOG_CHIRP_PROCESSOR +# define CHIRP_PROCESSOR_DEBUG qDebug().nospace() << "ChirpProcessor::\t" +#else +# define CHIRP_PROCESSOR_DEBUG nullDebug() +#endif + + +#define FULL_BUFFERSIZE 16384//65536 +#define HALF_BUFFERSIZE 32768 +#define BUFFERSIZE 2048 + +class ChirpProcessor : public QObject { + + Q_OBJECT + +public: + ChirpProcessor(THPSDRParameter *ioData = 0); + ~ChirpProcessor(); + +public slots: + void stop(); + void processChirpData(); + void generateLocalChirp(); + +private slots: + void matchedFilterFIRFilter(QList data); + void samplingRateChanged(QObject *sender, int value); + void setSpectras(const float *distance, const float *chirpfft); + void setDistSpectrumAvgLength(int value); + void setChirpFFTShow(bool value); + void setChirpSideband(bool value); + void setFilterLowerFrequency(int value); + void setFilterUpperFrequency(int value); + +private: + Settings *set; + + QMutex m_mutex; + QString m_message; + + QFFT *m_chirpFFT; + QFFT *m_matchedFFT; + QFilter *m_filter; + + CPX m_tmp0; + CPX m_tmp1; + CPX m_tmp2; + CPX m_tmp3; + CPX m_tmpDec; + + CPX m_cpxRxFFT; + CPX m_cpxChirpIn; + CPX m_cpxChirpTmp; + CPX m_cpxChirpOut; + CPX m_cpxIn; + CPX m_cpxInFilt; + CPX m_cpxOut; + + THPSDRParameter *io; + + QQueue > average_queue; + + float m_tmpBuf[FULL_BUFFERSIZE]; + float m_outBuf[FULL_BUFFERSIZE]; + float m_spectrumBuffer[FULL_BUFFERSIZE]; + float m_fftSpectrumBuffer[FULL_BUFFERSIZE]; + float m_spectrumBufferFull[FULL_BUFFERSIZE]; + float *m_window; + + volatile bool m_stopped; + + float m_specMax; + float m_specMin; + float m_scale; + + int m_sampleRate; + int m_downSampleRate; + int m_downRate; + int m_specBufferSize; + int m_specAvgLength; + float m_filterLowerFrequency; + float m_filterUpperFrequency; + + bool m_switch; + bool m_showChirpFFT; + + + qint64 m_chirpBufferLength; + qreal m_chirpSidebandFactor; + + void setupConnections(); + void decimate(const CPX &in, CPX &out, int size, int downrate); + void decimate(const QList &data, CPX &out, int downrate); + void spectrumAveraging(qint64 length, const float *buffer); + + int setSpectrumBufferSize(int size); + +signals: + void messageEvent(QString message); +}; + +#endif // _CUSDR_CHIRPPROCESSOR_H diff --git a/Source/src/DataEngine/cusdr_dataEngine.cpp b/Source/src/DataEngine/cusdr_dataEngine.cpp new file mode 100644 index 0000000..9f01da2 --- /dev/null +++ b/Source/src/DataEngine/cusdr_dataEngine.cpp @@ -0,0 +1,3761 @@ +/** +* @file cusdr_dataEngine.cpp +* @brief cuSDR data engine class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-02 +*/ + +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * using original C code by John Melton, G0ORX/N6LYT and Dave McQuate, WA8YWQ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#define TESTING + +#define LOG_DATA_ENGINE +// use DATA_ENGINE_DEBUG +#define LOG_DATA_PROCESSOR +// use DATA_PROCESSOR_DEBUG +#define LOG_AUDIO_PROCESSOR +// use AUDIO_PROCESSOR +#define LOG_WIDEBAND_PROCESSOR +// use WIDEBAND_PROCESSOR_DEBUG + +#include "cusdr_dataEngine.h" + +/*! + \class DataEngine + \brief The DataEngine class implements the main SDR functionality. +*/ +/*! + \brief Implements interfaces to the HPSDR hardware and various Server and DSP functionality. + - set up HW interfaces to Metis or other resp. + - initializes Metis. + - set up parameters for HPSDR hardware. + - implements the data receiver thread. + - implements the data processor thread. + - implements the wide band data processor thread. + - implements the audio receiver thread. + - implements the audio processor thread. + - implements the interface to the Chirp WSPR decoding functionality. +*/ +DataEngine::DataEngine(QObject *parent) + : QObject(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_meterType(SIGNAL_STRENGTH) + , m_restart(false) + , m_networkDeviceRunning(false) + , m_soundFileLoaded(false) + , m_chirpInititalized(false) + , m_discoveryThreadRunning(false) + , m_dataIOThreadRunning(false) + , m_chirpDataProcThreadRunning(false) + , m_dataProcThreadRunning(false) + , m_audioRcvrThreadRunning(false) + , m_audioInProcThreadRunning(false) + , m_audioOutProcThreadRunning(false) + , m_frequencyChange(false) + //, m_wbSpectrumAveraging(set->getSpectrumAveraging()) + //, m_wbSpectrumAveraging(true) + , m_hamBandChanged(true) + , m_chirpThreadStopped(true) + , m_hpsdrDevices(0) + , m_configure(10) + , m_timeout(5000) + , m_remainingTime(0) + , m_RxFrequencyChange(0) + , m_forwardPower(0) + , m_rxSamples(0) + , m_chirpSamples(0) + , m_spectrumSize(set->getSpectrumSize()) + , m_sendState(0) + , m_sMeterCalibrationOffset(0.0f)//(35.0f) +{ + qRegisterMetaType(); + + this->setObjectName(QString::fromUtf8("dataEngine")); + + m_clientConnected = false; + + //currentRx = 0; + m_discoverer = 0; + m_dataIO = 0; + m_dataProcessor = 0; + m_wbDataProcessor = 0; + m_audioReceiver = 0; + m_audioOutProcessor = 0; + m_chirpProcessor = 0; + //m_wbAverager = 0; + + set->setMercuryVersion(0); + set->setPenelopeVersion(0); + set->setPennyLaneVersion(0); + set->setMetisVersion(0); + set->setHermesVersion(0); + + io.metisFW = 0; + io.hermesFW = 0; + io.mercuryFW = 0; + + //m_audioBuffer.resize(0); + //m_audiobuf.resize(IO_BUFFER_SIZE); + + initAudioEngine(); + setupConnections(); + + // test + /*audioringbuffer.reserve(3); + + audioringbuffer.append(1); + audioringbuffer.append(2); + audioringbuffer.append(3); + + for (int i = 0; i < audioringbuffer.size(); ++i) { + qDebug() << audioringbuffer.at(i); + } + + audioringbuffer.append(4); + audioringbuffer.append(5); + + for (int i = 0; i < audioringbuffer.size(); ++i) { + qDebug() << audioringbuffer.at(i); + }*/ + + m_message = "audio sample = %1"; + m_counter = 0; +} + +DataEngine::~DataEngine() { +} + +void DataEngine::initAudioEngine() { + m_audioEngine = new AudioEngine(); + //m_audioEngine->setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, m_dataEngineState); +} + +void DataEngine::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(rxListChanged(QList)), + this, + SLOT(rxListChanged(QList))); + + CHECKED_CONNECT( + set, + SIGNAL(numberOfRXChanged(QObject *, int)), + this, + SLOT(setNumberOfRx(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *,int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), + this, + SLOT(setHamBand(QObject *, int, bool, HamBand))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(setSampleRate(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(setMercuryAttenuator(QObject *, HamBand, int))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(mercuryAttenuatorsChanged(QObject *, QList)), +// this, +// SLOT(setMercuryAttenuators(QObject *, QList))); + + CHECKED_CONNECT( + set, + SIGNAL(ditherChanged(QObject *, int)), + this, + SLOT(setDither(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(randomChanged(QObject *, int)), + this, + SLOT(setRandom(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(src10MhzChanged(QObject *, int)), + this, + SLOT(set10MhzSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(src122_88MhzChanged(QObject *, int)), + this, + SLOT(set122_88MhzSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(micSourceChanged(QObject *, int)), + this, + SLOT(setMicSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(classChanged(QObject *, int)), + this, + SLOT(setMercuryClass(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(timingChanged(QObject *, int)), + this, + SLOT(setMercuryTiming(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(clientDisconnectedEvent(int)), + this, + SLOT(setClientDisconnected(int))); + + CHECKED_CONNECT( + set, + SIGNAL(clientNoConnectedChanged(QObject*, int)), + this, + SLOT(setClientConnected(QObject*, int))); + + CHECKED_CONNECT( + set, + SIGNAL(rxConnectedStatusChanged(QObject*, int, bool)), + this, + SLOT(setRxConnectedStatus(QObject*, int, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(audioRxChanged(QObject*, int)), + this, + SLOT(setAudioReceiver(QObject*, int))); + + CHECKED_CONNECT( + set, + SIGNAL(framesPerSecondChanged(QObject*, int, int)), + this, + SLOT(setFramesPerSecond(QObject*, int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(searchMetisSignal()), + this, + SLOT(searchHpsdrNetworkDevices())); + + /*CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingChanged(QObject*, int, bool)), + this, + SLOT(setWbSpectrumAveraging(QObject*, int, bool)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(networkDeviceNumberChanged(int)), + this, + SLOT(setHPSDRDeviceNumber(int))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(alexConfigurationChanged(const QList &)), +// this, +// SLOT(setAlexConfiguration(const QList &))); + + CHECKED_CONNECT( + set, + SIGNAL(alexConfigurationChanged(quint16)), + this, + SLOT(setAlexConfiguration(quint16))); + + CHECKED_CONNECT( + set, + SIGNAL(alexStateChanged(HamBand, const QList &)), + this, + SLOT(setAlexStates(HamBand, const QList &))); + + CHECKED_CONNECT( + set, + SIGNAL(pennyOCEnabledChanged(bool)), + this, + SLOT(setPennyOCEnabled(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(rxJ6PinsChanged(const QList &)), + this, + SLOT(setRxJ6Pins(const QList &))); + + CHECKED_CONNECT( + set, + SIGNAL(txJ6PinsChanged(const QList &)), + this, + SLOT(setTxJ6Pins(const QList &))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(formatChanged(QObject *, const QAudioFormat )), + set, + SLOT(setAudioFormat(QObject *, const QAudioFormat ))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(formatChanged(QObject *, const QAudioFormat )), + this, + SLOT(setAudioFileFormat(QObject *, const QAudioFormat ))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(playPositionChanged(QObject *, qint64)), + set, + SLOT(setAudioPosition(QObject *, qint64))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(playPositionChanged(QObject *, qint64)), + this, + SLOT(setAudioFilePosition(QObject *, qint64))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(bufferChanged(QObject *, qint64, qint64, const QByteArray)), + set, + SLOT(setAudioBuffer(QObject *, qint64, qint64, const QByteArray))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(bufferChanged(QObject *, qint64, qint64, const QByteArray)), + this, + SLOT(setAudioFileBuffer(QObject *, qint64, qint64, const QByteArray))); + + CHECKED_CONNECT( + m_audioEngine, + SIGNAL(audiofileBufferChanged(const QList)), + this, + SLOT(setAudioFileBuffer(const QList))); +} + +//******************************************************** +// start/stop data engine +bool DataEngine::startDataEngineWithoutConnection() { + + DATA_ENGINE_DEBUG << "no HPSDR-HW interface"; + + if (io.inputBuffer.length() > 0) { + + initReceivers(1); + if (!m_dataIO) createDataIO(); + if (!m_dataProcessor) createDataProcessor(); + + // data receiver thread + if (!startDataIO(QThread::NormalPriority)) { + + setSystemState(QSDR::DataReceiverThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + + switch (m_serverMode) { + + case QSDR::SDRMode: + case QSDR::ChirpWSPR: + case QSDR::NoServerMode: + case QSDR::DemoMode: + return false; + + case QSDR::ChirpWSPRFile: + + if (!m_chirpInititalized) createChirpDataProcessor(); + + m_chirpProcessor->generateLocalChirp(); + + if (!startChirpDataProcessor(QThread::NormalPriority)) { + + setSystemState(QSDR::ChirpDataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + + m_chirpDspEngine = new QDSPEngine(this, 0, 2*BUFFER_SIZE); + + cpxIn.resize(2*BUFFER_SIZE); + cpxOut.resize(2*BUFFER_SIZE); + + RX.at(0)->setConnectedStatus(true); + set->setRxList(RX); + + m_rxSamples = 0; + m_chirpSamples = 0; + + break; + } + + // IQ data processing thread + if (!startDataProcessor(QThread::NormalPriority)) { + + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); + return true; + } + else { + + DATA_ENGINE_DEBUG << "no data available - data file loaded?"; + return false; + } +} + +bool DataEngine::findHPSDRDevices() { + + if (!m_discoverer) createDiscoverer(); + + // HPSDR network IO thread + if (!startDiscoverer(QThread::NormalPriority)) { + + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "HPSDR device discovery thread could not be started."; + io.networkIOMutex.unlock(); + return false; + } + + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "HPSDR network device detection...please wait."; + set->setSystemMessage("HPSDR network device detection...please wait", 0); + io.devicefound.wait(&io.networkIOMutex); + + m_hpsdrDevices = set->getHpsdrNetworkDevices(); + if (m_hpsdrDevices == 0) { + + io.networkIOMutex.unlock(); + stopDiscoverer(); + DATA_ENGINE_DEBUG << "no device found. HPSDR hardware powered? Network connection established?"; + set->setSystemMessage("no device found. HPSDR hardware powered? Network connection established?", 10000); + + setSystemState(QSDR::HwIOError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + } + else { + + emit clearSystemMessageEvent(); + if (m_hpsdrDevices > 1) + set->showNetworkIODialog(); + + QList metisList = set->getMetisCardsList(); + DATA_ENGINE_DEBUG << "found " << metisList.count() << " network device(s)"; + + for (int i = 0; i < metisList.count(); i++) { + + DATA_ENGINE_DEBUG << "Device " + << i << " @ " + << qPrintable(metisList.at(i).ip_address.toString()) + //<< " [" << qPrintable((char *) &metisList.at(i).mac_address) << "]"; + << " [" << metisList.at(i).mac_address << "]"; + } + + io.hpsdrDeviceIPAddress = set->getCurrentMetisCard().ip_address; + io.hpsdrDeviceName = set->getCurrentMetisCard().boardName; + DATA_ENGINE_DEBUG << "using HPSDR network device at " << qPrintable(io.hpsdrDeviceIPAddress.toString()); + + //Sleep(100); + SleeperThread::msleep(100); + + // stop the discovery thread + io.networkIOMutex.unlock(); + stopDiscoverer(); + + if (getFirmwareVersions()) return true; + return false; + } + + return false; +} + +bool DataEngine::getFirmwareVersions() { + + m_fwCount = 0; + + // init receivers + int rcvrs = set->getNumberOfReceivers(); + + QString str = "Initializing %1 receiver(s)...please wait"; + set->setSystemMessage(str.arg(set->getNumberOfReceivers()), rcvrs * 500); + + if (!initReceivers(rcvrs)) return false; + + + if (!m_dataIO) createDataIO(); + + if (!m_dataProcessor) createDataProcessor(); + + switch (m_serverMode) { + + case QSDR::SDRMode: + + for (int i = 0; i < set->getNumberOfReceivers(); i++) { + + RX.at(i)->setConnectedStatus(true); + } + setTimeStamp(this, false); + break; + + default: + + DATA_ENGINE_DEBUG << "no valid server mode"; + setSystemState(QSDR::ServerModeError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + + return false; + } + + set->setRxList(RX); + connectDSPSlots(); + + for (int i = 0; i < set->getNumberOfReceivers(); i++) + RX.at(i)->setAudioVolume(this, i, 0.0f); + + // IQ data processing thread + if (!startDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data processor thread could not be started."; + return false; + } + + // data IO thread + if (!startDataIO(QThread::NormalPriority)) {// ::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data IO thread could not be started."; + return false; + } + + //setSampleRate(this, set->getSampleRate()); + SleeperThread::msleep(100); + + // pre-conditioning + for (int i = 0; i < io.receivers; i++) + m_dataIO->sendInitFramesToNetworkDevice(i); + + if (m_serverMode == QSDR::SDRMode) + m_dataIO->networkDeviceStartStop(0x01); // 0x01 for starting Metis without wide band data + + m_networkDeviceRunning = true; + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); + SleeperThread::msleep(300); + + io.metisFW = set->getMetisVersion(); + io.mercuryFW = set->getMercuryVersion(); + io.penelopeFW = set->getPenelopeVersion(); + io.pennylaneFW = set->getPennyLaneVersion(); + io.hermesFW = set->getHermesVersion(); + + // if we have 4096 * 16 bit = 8 * 1024 raw consecutive ADC samples, m_wbBuffers = 8 + // we have 16384 * 16 bit = 32 * 1024 raw consecutive ADC samples, m_wbBuffers = 32 + int wbBuffers = 0; + if (io.mercuryFW > 32 || io.hermesFW > 11) + wbBuffers = BIGWIDEBANDSIZE / 512; + else + wbBuffers = SMALLWIDEBANDSIZE / 512; + + set->setWidebandBuffers(this, wbBuffers); + + if (set->getFirmwareVersionCheck()) + return checkFirmwareVersions(); + else + return true; +} + +// credits go to George Byrkit, K9TRV: the older FW checkings are shamelessly taken from the KISS Konsole! +bool DataEngine::checkFirmwareVersions() { + + if (io.metisFW != 0 && io.hpsdrDeviceName == "Hermes") { + + stop(); + + QString msg = "Metis selected, but Hermes found!"; + set->showWarningDialog(msg); + return false; + } + + if (io.hermesFW != 0 && io.hpsdrDeviceName == "Metis") { + + stop(); + + QString msg = "Hermes selected, but Metis found!"; + set->showWarningDialog(msg); + return false; + } + + if (io.penelopeFW == 0 && (set->getPenelopePresence() || set->getPennyLanePresence())) { + + stop(); + + QString msg = "Penelope or Pennylane selected, but firmware version = 0 !"; + set->showWarningDialog(msg); + return false; + } + + if (io.mercuryFW < 27 && set->getNumberOfReceivers() > 4 && io.hpsdrDeviceName == "Metis") { + + stop(); + + QString msg = "Mercury FW must be V2.7 or higher!"; + set->showWarningDialog(msg); + return false; + } + + if (io.hpsdrDeviceName == "Metis") { + + QString msg; + switch (io.metisFW) { + + case 13: + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 13 || io.pennylaneFW == 13)) || + io.mercuryFW != 29) + { + stop(); + + msg = "Penny[Lane] FW Version V1.3 and Mercury FW V2.7 requires Metis FW V1.3!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 14: + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 14 || io.pennylaneFW == 14)) || + io.mercuryFW != 29) + { + stop(); + + msg = "Penny[Lane] FW Version V1.4 and Mercury FW V2.7 requires Metis FW V1.4!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 15: + + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 15 || io.pennylaneFW == 15)) || + io.mercuryFW != 30) + { + stop(); + + msg = "Penny[Lane] FW Version V1.5 and Mercury FW V3.0 requires Metis FW V1.5!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 16: + + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 16 || io.pennylaneFW == 16)) || + io.mercuryFW != 31) + { + stop(); + + msg = "Penny[Lane] FW Version V1.6 and Mercury FW V3.1 requires Metis FW V1.6!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 17: + case 18: + + if (((set->getPenelopePresence() || set->getPennyLanePresence()) && + (io.penelopeFW == 17 || io.pennylaneFW == 17)) || + io.mercuryFW != 32) + { + stop(); + + msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.2 requires Metis FW V1.7 or V1.8!"; + set->showWarningDialog(msg); + return false; + } + break; + + case 19: + case 20: + + stop(); + + msg = "Metis FW V1.9 or V2.0 have some problems - please upgrade to Metis V2.1!"; + set->showWarningDialog(msg); + return false; + break; + + case 21: + + if ((set->getPenelopePresence() && io.penelopeFW != 17) || + (set->getPennyLanePresence() && io.pennylaneFW != 17)|| + io.mercuryFW != 33) + { + stop(); + + msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.3 required for Metis FW V2.1!"; + set->showWarningDialog(msg); + return false; + } + break; + +// case 22: +// +// if ((set->getPenelopePresence() && m_penelopeFW != 17) || +// (set->getPennyLanePresence() && m_pennylaneFW != 17)|| +// m_mercuryFW != 33) +// { +// stop(); +// +// msg = "Penny[Lane] FW Version V1.7 and Mercury FW V3.3 required for Metis FW >= V2.1!"; +// set->showWarningDialog(msg); +// return false; +// } +// break; + + case 26: + + if ((set->getPenelopePresence() && io.penelopeFW != 18) || + (set->getPennyLanePresence() && io.pennylaneFW != 18)|| + io.mercuryFW != 34) + { + stop(); + + msg = "Penny[Lane] FW Version V1.8 and Mercury FW V3.4 required for Metis FW V2.6!"; + set->showWarningDialog(msg); + return false; + } + break; + + default: + + //stop(); + + msg = "Not a standard Metis FW version !"; + set->showWarningDialog(msg); + //return false; + return true; + } + } + + if (io.mercuryFW < 33 && set->getNumberOfReceivers() > 4 && io.hpsdrDeviceName == "Metis") { + + stop(); + + QString msg = "Mercury FW < V3.3 has only 4 receivers!"; + set->showWarningDialog(msg); + return false; + } + + if (io.hermesFW < 18 && set->getNumberOfReceivers() > 2 && io.hpsdrDeviceName == "Hermes") { + + stop(); + + QString msg = "Hermes FW < V1.8 has only 2 receivers!"; + set->showWarningDialog(msg); + return false; + } + + return true; +} + +bool DataEngine::start() { + + m_fwCount = 0; + m_sendState = 0; + + int rcvrs = set->getNumberOfReceivers(); + if (!initReceivers(rcvrs)) return false; + + if (!m_dataIO) createDataIO(); + + if (!m_dataProcessor) createDataProcessor(); + + if (m_serverMode == QSDR::SDRMode && !m_wbDataProcessor) + createWideBandDataProcessor(); + + if ((m_serverMode == QSDR::ChirpWSPR) && !m_chirpProcessor) + createChirpDataProcessor(); + + switch (m_serverMode) { + + //case QSDR::ExternalDSP: + + /* + //CHECKED_CONNECT( + // set, + // SIGNAL(frequencyChanged(QObject*, bool, int, long)), + // this, + // SLOT(setFrequency(QObject*, bool, int, long))); + + //if (!m_audioProcessorRunning) { + + // //if (!m_audioProcessor) createAudioProcessor(); + // if (!m_audioReceiver) createAudioReceiver(); + + // m_audioInProcThread->start(); + // if (m_audioInProcThread->isRunning()) { + // + // m_audioInProcThreadRunning = true; + // DATA_ENGINE_DEBUG << "Audio processor process started."; + // } + // else { + + // m_audioInProcThreadRunning = false; + // setSystemState( + // QSDR::AudioThreadError, + // m_hwInterface, + // m_serverMode, + // QSDR::DataEngineDown); + // return false; + // } + // + // io.audio_rx = 0; + // io.clientList.append(0); + + // m_audioProcessorRunning = true; + // setSystemState( + // QSDR::NoError, + // m_hwInterface, + // m_serverMode, + // QSDR::DataEngineUp); + //} + */ + //return false; + + case QSDR::SDRMode: + + setTimeStamp(this, false); + break; + + case QSDR::ChirpWSPR: + //case QSDR::ChirpWSPRFile: + + // turn time stamping on + setTimeStamp(this, true); + + if (!startChirpDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data processor thread could not be started."; + return false; + } + + //RX.at(0)->setConnectedStatus(true); + + CHECKED_CONNECT( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); + + break; + + default: + + DATA_ENGINE_DEBUG << "no valid server mode"; + + setSystemState(QSDR::ServerModeError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } // end switch (m_serverMode) + + set->setRxList(RX); + connectDSPSlots(); + + for (int i = 0; i < rcvrs; i++) { + + RX.at(i)->setConnectedStatus(true); + RX.at(i)->setAudioVolume(this, i, RX.at(i)->getAudioVolume()); + setFrequency(this, true, i, set->getCtrFrequencies().at(i)); + + //CHECKED_CONNECT( + // RX.at(i), + // SIGNAL(outputBufferSignal(int, const CPX &)), + // this, //m_dataProcessor, + // SLOT(setOutputBuffer(int, const CPX &))); + + CHECKED_CONNECT( + RX.at(i), + SIGNAL(outputBufferSignal(int, const CPX &)), + m_dataProcessor, + SLOT(setOutputBuffer(int, const CPX &))); + + m_dspThreadList.at(i)->start(QThread::NormalPriority);//QThread::TimeCriticalPriority); + + if (m_dspThreadList.at(i)->isRunning()) { + + //m_dataProcThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "receiver processor thread started for Rx " << i; + io.networkIOMutex.unlock(); + } + else { + + //m_dataProcThreadRunning = false; + //setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } + } + + if (m_serverMode != QSDR::ChirpWSPR && !startWideBandDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "wide band data processor thread could not be started."; + return false; + } + + // data IO thread +// if (!startDataIO(QThread::HighPriority)) {// ::NormalPriority)) { +// +// DATA_ENGINE_DEBUG << "data receiver thread could not be started."; +// return false; +// } + + // IQ data processing thread + if (!startDataProcessor(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "data processor thread could not be started."; + return false; + } + + // data IO thread + if (!startDataIO(QThread::NormalPriority)) {// ::NormalPriority::HighPriority)) { + + DATA_ENGINE_DEBUG << "data IO thread could not be started."; + return false; + } + + // start Sync,ADC and S-Meter timers + //m_SyncChangedTime.start(); + //m_ADCChangedTime.start(); + //m_smeterTime.start(); + + // start the "frames-per-second" timer for all receivers + for (int i = 0; i < rcvrs; i++) + RX.at(i)->highResTimer->start(); + + // just give them a little time.. + SleeperThread::msleep(100); + + // pre-conditioning + for (int i = 0; i < io.receivers; i++) + m_dataIO->sendInitFramesToNetworkDevice(i); + + if (m_serverMode == QSDR::SDRMode && set->getWidebandData()) + m_dataIO->networkDeviceStartStop(0x03); // 0x03 for starting the device with wide band data + else + m_dataIO->networkDeviceStartStop(0x01); // 0x01 for starting the device without wide band data + + m_networkDeviceRunning = true; + + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineUp); + set->setSystemMessage("System running", 4000); + + DATA_ENGINE_DEBUG << "Data Engine thread: " << this->thread(); + + return true; +} + +void DataEngine::stop() { + + if (m_dataEngineState == QSDR::DataEngineUp) { + + switch (m_hwInterface) { + + case QSDR::Metis: + case QSDR::Hermes: + + // turn time stamping off + setTimeStamp(this, false); + + // stop the device + m_dataIO->networkDeviceStartStop(0); + m_networkDeviceRunning = false; + DATA_ENGINE_DEBUG << "HPSDR device stopped"; + + // stop the threads + //SleeperThread::msleep(100); + stopDataIO(); + SleeperThread::msleep(100); + stopDataProcessor(); + //stopChirpDataProcessor(); + if (m_wbDataProcessor) + stopWideBandDataProcessor(); + + // clear device list + SleeperThread::msleep(100); + set->clearMetisCardList(); + DATA_ENGINE_DEBUG << "device cards list cleared."; + break; + + case QSDR::NoInterfaceMode: + + stopDataIO(); + + DATA_ENGINE_DEBUG << "data queue count: " << io.data_queue.count(); + DATA_ENGINE_DEBUG << "chirp queue count: " << io.chirp_queue.count(); + + stopDataProcessor(); + stopChirpDataProcessor(); + } + + while (!io.au_queue.isEmpty()) + io.au_queue.dequeue(); + + // clear receiver thread list + foreach (QThread* thread, m_dspThreadList) { + + thread->quit(); + thread->wait(); + } + qDeleteAll(m_dspThreadList.begin(), m_dspThreadList.end()); + m_dspThreadList.clear(); + + // clear receiver list + foreach (Receiver *rx, RX) { + + rx->stop(); + rx->setConnectedStatus(false); + disconnectDSPSlots(); + + disconnect( + rx, + SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), + set, + SLOT(setSpectrumBuffer(int, const qVectorFloat&))); + + disconnect( + rx, + SIGNAL(sMeterValueChanged(int, float)), + set, + SLOT(setSMeterValue(int, float))); + + /*disconnect( + rx, + SIGNAL(outputBufferSignal(int, const CPX &)), + this, + SLOT(setOutputBuffer(int, const CPX &)));*/ + + /*disconnect( + rx, + SIGNAL(outputBufferSignal(int, const CPX &)), + m_dataProcessor, + SLOT(setOutputBuffer(int, const CPX &)));*/ + + //rx->deleteDSPInterface(); + //DATA_ENGINE_DEBUG << "DSP core deleted."; + } + qDeleteAll(RX.begin(), RX.end()); + RX.clear(); + set->setRxList(RX); + DATA_ENGINE_DEBUG << "receiver threads deleted, receivers deleted, receiver & thread list cleared."; + set->setSystemMessage("Data engine shut down.", 4000); + + setSystemState(QSDR::NoError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + } + + m_rxSamples = 0; + m_chirpSamples = 0; + m_restart = true; + m_found = 0; + m_hpsdrDevices = 0; + + set->setMercuryVersion(0); + set->setPenelopeVersion(0); + set->setMetisVersion(0); + set->setHermesVersion(0); + + //set->setPeakHold(false); + //set->resetWidebandSpectrumBuffer(); + + /*disconnect( + set, + SIGNAL(ctrFrequencyChanged(QObject*, int, int, long)), + this, + SLOT(setFrequency(QObject*, int, int, long)));*/ + + DATA_ENGINE_DEBUG << "shut down done."; +} + +bool DataEngine::initDataEngine() { + +#ifdef TESTING + qDebug() << "************************** TESTING MODUS ***********************************"; + return start(); +#endif + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + return startDataEngineWithoutConnection(); + } + else { + + if (findHPSDRDevices()) { + + if (io.mercuryFW > 0 || io.hermesFW > 0) { + + stop(); + DATA_ENGINE_DEBUG << "got firmware versions:"; + DATA_ENGINE_DEBUG << " Metis firmware: " << io.metisFW; + DATA_ENGINE_DEBUG << " Mercury firmware: " << io.mercuryFW; + DATA_ENGINE_DEBUG << " Penelope firmware: " << io.penelopeFW; + DATA_ENGINE_DEBUG << " Pennylane firmware: " << io.pennylaneFW; + DATA_ENGINE_DEBUG << " Hermes firmware: " << io.hermesFW; + DATA_ENGINE_DEBUG << "stopping and restarting data engine."; + + return start(); + } + else { + + DATA_ENGINE_DEBUG << "did not get firmware versions!"; + setSystemState(QSDR::FirmwareError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + } + } + } + return false; +} + +bool DataEngine::initReceivers(int rcvrs) { + + for (int i = 0; i < rcvrs; i++) { + + Receiver *rx = new Receiver(i); + + // init the DSP core + DATA_ENGINE_DEBUG << "trying to init a DSP core for rx " << i; + + if (rx->initDSPInterface()) { + + DATA_ENGINE_DEBUG << "init DSP core for rx " << i << " successful !"; + + rx->setConnectedStatus(false); + rx->setServerMode(m_serverMode); + + // create dsp thread + QThreadEx* thread = new QThreadEx(); + rx->moveToThread(thread); + + //CHECKED_CONNECT(this, SIGNAL(doDSP()), rx, SLOT(dspProcessing())); + + CHECKED_CONNECT( + rx, + SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), + set, + SLOT(setSpectrumBuffer(int, const qVectorFloat&))); + + CHECKED_CONNECT( + rx, + SIGNAL(sMeterValueChanged(int, float)), + set, + SLOT(setSMeterValue(int, float))); + + /*CHECKED_CONNECT( + rx, + SIGNAL(outputBufferSignal(int, const CPX &)), + m_dataProcessor, + SLOT(setOutputBuffer(int, const CPX &)));*/ + + m_dspThreadList.append(thread); + RX.append(rx); + } + else { + + return false; + } + } + + set->setRxList(RX); + + m_txFrame = 0; + + io.currentReceiver = 0; + io.receivers = rcvrs; + + io.timing = 0; + m_configure = io.receivers + 1; + + // init cc Rc parameters + io.ccRx.devices.mercuryFWVersion = 0; + io.ccRx.devices.penelopeFWVersion = 0; + io.ccRx.devices.pennylaneFWVersion = 0; + io.ccRx.devices.hermesFWVersion = 0; + io.ccRx.devices.metisFWVersion = 0; + + io.ccRx.ptt = false; + io.ccRx.dash = false; + io.ccRx.dot = false; + io.ccRx.lt2208 = false; + io.ccRx.ain1 = 0; + io.ccRx.ain2 = 0; + io.ccRx.ain3 = 0; + io.ccRx.ain4 = 0; + io.ccRx.ain5 = 0; + io.ccRx.ain6 = 0; + io.ccRx.hermesI01 = false; + io.ccRx.hermesI02 = false; + io.ccRx.hermesI03 = false; + io.ccRx.hermesI04 = false; + io.ccRx.mercury1_LT2208 = false; + io.ccRx.mercury2_LT2208 = false; + io.ccRx.mercury3_LT2208 = false; + io.ccRx.mercury4_LT2208 = false; + + // init cc Tx parameters + io.ccTx.currentBand = RX.at(0)->getHamBand(); + io.ccTx.mercuryAttenuators = RX.at(0)->getMercuryAttenuators(); + io.ccTx.mercuryAttenuator = RX.at(0)->getMercuryAttenuators().at(io.ccTx.currentBand); + io.ccTx.dither = set->getMercuryDither(); + io.ccTx.random = set->getMercuryRandom(); + io.ccTx.duplex = 1; + io.ccTx.mox = false; + io.ccTx.ptt = false; + io.ccTx.alexStates = set->getAlexStates(); + io.ccTx.vnaMode = false; + io.ccTx.alexConfig = set->getAlexConfig(); + io.ccTx.timeStamp = 0; + io.ccTx.commonMercuryFrequencies = 0; + io.ccTx.pennyOCenabled = set->getPennyOCEnabled(); + io.ccTx.rxJ6pinList = set->getRxJ6Pins(); + io.ccTx.txJ6pinList = set->getTxJ6Pins(); + + setAlexConfiguration(io.ccTx.alexConfig); + + io.rxClass = set->getRxClass(); + io.mic_gain = 0.26F; + io.rx_freq_change = -1; + io.tx_freq_change = -1; + io.clients = 0; + io.sendIQ_toggle = true; + io.rcveIQ_toggle = false; + io.alexForwardVolts = 0.0; + io.alexReverseVolts = 0.0; + io.alexForwardPower = 0.0; + io.alexReversePower = 0.0; + io.penelopeForwardVolts = 0.0; + io.penelopeForwardPower = 0.0; + io.ain3Volts = 0.0; + io.ain4Volts = 0.0; + io.supplyVolts = 0.0f; + + + //***************************** + // C&C bytes + for (int i = 0; i < 5; i++) { + + io.control_in[i] = 0x00; + io.control_out[i] = 0x00; + } + + // C0 + // 0 0 0 0 0 0 0 0 + // | + // +------------ MOX (1 = active, 0 = inactive) + + io.control_out[0] |= MOX_DISABLED; + + // set C1 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) + // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* + // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* + // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* + // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* + + // Bits 1,0 + setSampleRate(this, set->getSampleRate()); + + // Bits 7,..,2 + setHPSDRConfig(); + + io.control_out[1] &= 0x03; // 0 0 0 0 0 0 1 1 + io.control_out[1] |= io.ccTx.clockByte; + + // set C2 + // + // 0 0 0 0 0 0 0 0 + // | | | + // | | +------------ Mode (1 = Class E, 0 = All other modes) + // +---------- +-------------- Open Collector Outputs on Penelope or Hermes (bit 6..bit 0) + + io.control_out[2] = io.control_out[2] & 0xFE; // 1 1 1 1 1 1 1 0 + io.control_out[2] = io.control_out[2] | io.rxClass; + + // set C3 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Alex Attenuator (00 = 0dB, 01 = 10dB, 10 = 20dB, 11 = 30dB) + // | | | | | +---------------- Preamp On/Off (0 = Off, 1 = On) + // | | | | +------------------ LT2208 Dither (0 = Off, 1 = On) + // | | | + ------------------- LT2208 Random (0= Off, 1 = On) + // | + + --------------------- Alex Rx Antenna (00 = none, 01 = Rx1, 10 = Rx2, 11 = XV) + // + ------------------------- Alex Rx out (0 = off, 1 = on). Set if Alex Rx Antenna > 00. + + io.control_out[3] = io.control_out[3] & 0xFB; // 1 1 1 1 1 0 1 1 + io.control_out[3] = io.control_out[3] | (io.ccTx.mercuryAttenuator << 2); + + io.control_out[3] = io.control_out[3] & 0xF7; // 1 1 1 1 0 1 1 1 + io.control_out[3] = io.control_out[3] | (io.ccTx.dither << 3); + + io.control_out[3] = io.control_out[3] & 0xEF; // 1 1 1 0 1 1 1 1 + io.control_out[3] = io.control_out[3] | (io.ccTx.random << 4); + + // set C4 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + + ----------- Alex Tx relay (00 = Tx1, 01= Tx2, 10 = Tx3) + // | | | | | + --------------- Duplex (0 = off, 1 = on) + // | | + + +------------------ Number of Receivers (000 = 1, 111 = 8) + // | +------------------------ Time stamp - 1PPS on LSB of Mic data (0 = off, 1 = on) + // +-------------------------- Common Mercury Frequency (0 = independent frequencies to Mercury + // Boards, 1 = same frequency to all Mercury boards) + + //io.control_out[4] &= 0xC7; // 1 1 0 0 0 1 1 1 + io.control_out[4] = (io.ccTx.duplex << 2) | ((io.receivers - 1) << 3); + + return true; +} + +void DataEngine::setHPSDRConfig() { + + io.ccTx.clockByte = 0x0; + + // C1 + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) + // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* + // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* + // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* + // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* + // + // * Ignored by Hermes + + if ( + (set->getPenelopePresence() || set->getPennyLanePresence()) && + ((set->get10MHzSource() == 0) || set->getExcaliburPresence()) + ) + { + + io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | ATLAS_10MHZ_SOURCE; + } + else if ((set->getPenelopePresence() || set->getPennyLanePresence()) && (set->get10MHzSource() == 1)) { + + io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | PENELOPE_10MHZ_SOURCE; + } + else if ((set->getPenelopePresence() || set->getPennyLanePresence()) && (set->get10MHzSource() == 2)) { + + io.ccTx.clockByte = MIC_SOURCE_PENELOPE | MERCURY_PRESENT | PENELOPE_PRESENT | MERCURY_122_88MHZ_SOURCE | MERCURY_10MHZ_SOURCE; + } + else if ((set->get10MHzSource() == 0) || set->getExcaliburPresence()) { + + io.ccTx.clockByte = MERCURY_PRESENT | MERCURY_122_88MHZ_SOURCE | ATLAS_10MHZ_SOURCE; + } + else { + + io.ccTx.clockByte = MERCURY_PRESENT | MERCURY_122_88MHZ_SOURCE | MERCURY_10MHZ_SOURCE; + } +} + +void DataEngine::connectDSPSlots() { + + CHECKED_CONNECT( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); +} + +void DataEngine::disconnectDSPSlots() { + + disconnect( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); +} + +//******************************************************** +// create, start/stop HPSDR device network IO + +void DataEngine::createDiscoverer() { + + m_discoverer = new Discoverer(&io); + + m_discoveryThread = new QThreadEx(); + m_discoverer->moveToThread(m_discoveryThread); + + m_discoverer->connect( + m_discoveryThread, + SIGNAL(started()), + SLOT(initHPSDRDevice())); +} + +bool DataEngine::startDiscoverer(QThread::Priority prio) { + + m_discoveryThread->start(prio); + + if (m_discoveryThread->isRunning()) { + + m_discoveryThreadRunning = true; + io.networkIOMutex.lock(); + qDebug() << ""; + DATA_ENGINE_DEBUG << "HPSDR device discovery thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_discoveryThreadRunning = false; + return false; + } +} + +void DataEngine::stopDiscoverer() { + + if (m_discoveryThread->isRunning()) { + + m_discoveryThread->quit(); + m_discoveryThread->wait(1000); + delete m_discoveryThread; + delete m_discoverer; + m_discoverer = 0; + + m_discoveryThreadRunning = false; + + DATA_ENGINE_DEBUG << "HPSDR discovery thread stopped and deleted."; + } + else + DATA_ENGINE_DEBUG << "HPSDR discovery thread wasn't started."; +} + +//******************************************************** +// create, start/stop data receiver + +void DataEngine::createDataIO() { + + m_dataIO = new DataIO(&io); + + switch (m_serverMode) { + + //case QSDR::ExternalDSP: + // break; + + //case QSDR::InternalDSP: + case QSDR::SDRMode: + + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "configured for " + << qPrintable(QString::number(set->getNumberOfReceivers())) + << " receiver(s) at " + << qPrintable(QString::number(set->getSampleRate()/1000)) + << " kHz sample rate"; + io.networkIOMutex.unlock(); +// sendMessage( +// m_message.arg( +// QString::number(set->getNumberOfReceivers()), +// QString::number(set->getSampleRate()/1000))); + break; + + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + } + + m_dataIOThread = new QThreadEx(); + m_dataIO->moveToThread(m_dataIOThread); + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + + m_dataIO->connect( + m_dataIOThread, + SIGNAL(started()), + SLOT(readData())); + break; + + case QSDR::Metis: + case QSDR::Hermes: + + m_dataIO->connect( + m_dataIOThread, + SIGNAL(started()), + SLOT(initDataReceiverSocket())); + break; + } +} + +bool DataEngine::startDataIO(QThread::Priority prio) { + + m_dataIOThread->start(prio); + + if (m_dataIOThread->isRunning()) { + + m_dataIOThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "data IO thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_dataIOThreadRunning = false; + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopDataIO() { + + if (m_dataIOThread->isRunning()) { + + m_dataIO->stop(); + m_dataIOThread->quit(); + + while (!m_dataIOThread->isFinished()) { + + DATA_ENGINE_DEBUG << "data IO thread not yet finished..."; + if (m_dataIOThread->wait(100)) break; + } + m_dataIOThreadRunning = false; + + delete m_dataIOThread; + delete m_dataIO; + m_dataIO = 0; + + if (m_serverMode == QSDR::ChirpWSPRFile) { + + while (!io.chirp_queue.isEmpty()) + io.chirp_queue.dequeue(); + } + + DATA_ENGINE_DEBUG << "data IO thread deleted."; + } + else + DATA_ENGINE_DEBUG << "data IO thread wasn't started."; +} + +//******************************************************** +// create, start/stop data processor + +void DataEngine::createDataProcessor() { + + m_dataProcessor = new DataProcessor(this, m_serverMode, m_hwInterface); + sendSocket = new QUdpSocket(); + + CHECKED_CONNECT( + sendSocket, + SIGNAL(error(QAbstractSocket::SocketError)), + m_dataProcessor, + SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError))); + + switch (m_serverMode) { + + // The signal iqDataReady is generated by the function + // processInputBuffer when a block of input data are + // decoded. + + case QSDR::SDRMode: + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + + /*connect( + this, + SIGNAL(iqDataReady(int)), + SLOT(dttSPDspProcessing(int)), + Qt::DirectConnection);*/ + + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + + /* + case QSDR::ExternalDSP: + + CHECKED_CONNECT_OPT( + this, + SIGNAL(iqDataReady(int)), + m_dataProcessor, + SLOT(externalDspProcessing(int)), + Qt::DirectConnection); + + break; + + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + break; + */ + } + + m_dataProcThread = new QThreadEx(); + m_dataProcessor->moveToThread(m_dataProcThread); + sendSocket->moveToThread(m_dataProcThread); + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + m_dataProcessor->connect( + m_dataProcThread, + SIGNAL(started()), + SLOT(processData())); + break; + + case QSDR::Metis: + case QSDR::Hermes: + m_dataProcessor->connect( + m_dataProcThread, + SIGNAL(started()), + SLOT(processDeviceData())); + + break; + } + + //m_dataProcessor->connect(m_dataProcThread, SIGNAL(started()), SLOT(initDataProcessorSocket())); +} + +bool DataEngine::startDataProcessor(QThread::Priority prio) { + + m_dataProcThread->start(prio); + + if (m_dataProcThread->isRunning()) { + + m_dataProcThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "data processor thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_dataProcThreadRunning = false; + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopDataProcessor() { + + if (m_dataProcThread->isRunning()) { + + m_dataProcessor->stop(); + + if (m_serverMode == QSDR::SDRMode || m_serverMode == QSDR::ChirpWSPR) { + + if (io.iq_queue.isEmpty()) { + io.iq_queue.enqueue(QByteArray(BUFFER_SIZE, 0x0)); + //io.iq_queue.enqueue(QByteArray(2*BUFFER_SIZE, 0x0)); + } + } + else if (m_serverMode == QSDR::ChirpWSPRFile) { + + if (io.data_queue.isEmpty()) { + + QList buf; + for (int i = 0; i < 128; i++) buf << 0.0f; + io.data_queue.enqueue(buf); + } + } + + m_dataProcThread->quit(); + m_dataProcThread->wait(); + delete m_dataProcThread; + delete m_dataProcessor; + m_dataProcessor = 0; + + if (m_serverMode == QSDR::SDRMode || m_serverMode == QSDR::ChirpWSPR) { + + while (!io.iq_queue.isEmpty()) + io.iq_queue.dequeue(); + + DATA_ENGINE_DEBUG << "iq_queue empty."; + } + else if (m_serverMode == QSDR::ChirpWSPRFile) { + + while (!io.data_queue.isEmpty()) + io.data_queue.dequeue(); + + DATA_ENGINE_DEBUG << "data_queue empty."; + chirpData.clear(); + } + + m_dataProcThreadRunning = false; + + DATA_ENGINE_DEBUG << "data processor thread deleted."; + } + else + DATA_ENGINE_DEBUG << "data processor thread wasn't started."; +} + +//******************************************************** +// create, start/stop audio out processor + +void DataEngine::createAudioOutProcessor() { + + m_audioOutProcessor = new AudioOutProcessor(this, m_serverMode); + + switch (m_serverMode) { + + //case QSDR::ExternalDSP: + // break; + + case QSDR::SDRMode: + + /*connect( + this, + SIGNAL(iqDataReady(int)), + SLOT(dttSPDspProcessing(int)), + Qt::DirectConnection);*/ + + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + + default: + break; + } + + m_audioOutProcThread = new QThreadEx(); + m_audioOutProcessor->moveToThread(m_audioOutProcThread); + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + /*m_audioOutProcessor->connect( + m_audioOutProcThread, + SIGNAL(started()), + SLOT(processData()));*/ + break; + + case QSDR::Metis: + case QSDR::Hermes: + /*m_audioOutProcessor->connect( + m_audioOutProcThread, + SIGNAL(started()), + SLOT(processDeviceData()));*/ + break; + } +} + +void DataEngine::startAudioOutProcessor(QThread::Priority prio) { + + Q_UNUSED (prio) +} + +void DataEngine::stopAudioOutProcessor() { +} + +//******************************************************** +// create, start/stop winde band data processor + +void DataEngine::createWideBandDataProcessor() { + + int size; + + if (io.mercuryFW > 32 || io.hermesFW > 11) + size = BIGWIDEBANDSIZE; + else + size = SMALLWIDEBANDSIZE; + + m_wbDataProcessor = new WideBandDataProcessor(&io, m_serverMode, size); + + m_wbDataProcThread = new QThreadEx(); + m_wbDataProcessor->moveToThread(m_wbDataProcThread); + m_wbDataProcessor->connect( + m_wbDataProcThread, + SIGNAL(started()), + SLOT(processWideBandData())); + + CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingChanged(QObject*, int, bool)), + m_wbDataProcessor, + SLOT(setWbSpectrumAveraging(QObject*, int, bool))); + + CHECKED_CONNECT( + m_wbDataProcessor, + SIGNAL(wbSpectrumBufferChanged(const qVectorFloat&)), + set, + SLOT(setWidebandSpectrumBuffer(const qVectorFloat&))); +} + +bool DataEngine::startWideBandDataProcessor(QThread::Priority prio) { + + m_wbDataProcThread->start(prio);//(QThread::TimeCriticalPriority);//(QThread::HighPriority);//(QThread::LowPriority); + + if (m_wbDataProcThread->isRunning()) { + + m_wbDataRcvrThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "wide band data processor thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_wbDataRcvrThreadRunning = false; + setSystemState(QSDR::WideBandDataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopWideBandDataProcessor() { + + if (m_wbDataProcThread->isRunning()) { + + m_wbDataProcessor->stop(); + if (io.wb_queue.isEmpty()) + io.wb_queue.enqueue(m_datagram); + + m_wbDataProcThread->quit(); + m_wbDataProcThread->wait(); + delete m_wbDataProcThread; + delete m_wbDataProcessor; + m_wbDataProcessor = 0; + + m_wbDataRcvrThreadRunning = false; + + DATA_ENGINE_DEBUG << "wide band data processor thread deleted."; + } + else + DATA_ENGINE_DEBUG << "wide band data processor thread wasn't started."; +} + +//******************************************************** +// create, start/stop chirp processor +void DataEngine::createChirpDataProcessor() { + + m_chirpProcessor = new ChirpProcessor(&io); + DATA_ENGINE_DEBUG << "chirp decoder initialized"; + + CHECKED_CONNECT_OPT( + m_audioEngine, + SIGNAL(chirpSignalChanged()), + m_chirpProcessor, + SLOT(generateLocalChirp()), + Qt::DirectConnection); + + m_audioEngine->reset(); + if (m_audioEngine->generateSweptTone()) + DATA_ENGINE_DEBUG << "audio chirp signal initialized"; + else + DATA_ENGINE_DEBUG << "audio chirp signal initialization failed"; + + + m_chirpDataProcThread = new QThreadEx(); + m_chirpProcessor->moveToThread(m_chirpDataProcThread); + m_chirpProcessor->connect( + m_chirpDataProcThread, + SIGNAL(started()), + m_chirpProcessor, + SLOT(processChirpData())); + + m_chirpInititalized = true; +} + +bool DataEngine::startChirpDataProcessor(QThread::Priority prio) { + + m_chirpDataProcThread->start(prio);//(QThread::TimeCriticalPriority);//(QThread::HighPriority);//(QThread::LowPriority); + + if (m_chirpDataProcThread->isRunning()) { + + m_chirpDataProcThreadRunning = true; + io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "chirp data processor thread started."; + io.networkIOMutex.unlock(); + + return true; + } + else { + + m_chirpDataProcThreadRunning = false; + setSystemState(QSDR::DataProcessThreadError, m_hwInterface, m_serverMode, QSDR::DataEngineDown); + return false; + } +} + +void DataEngine::stopChirpDataProcessor() { + + if (m_chirpInititalized) { + + m_chirpProcessor->stop(); + if (io.chirp_queue.isEmpty()) { + + QList buf; + for (int i = 0; i < 128; i++) buf << 0.0f; + io.chirp_queue.enqueue(buf); + } + + m_chirpDataProcThread->quit(); + m_chirpDataProcThread->wait(); + delete m_chirpDataProcThread; + delete m_chirpProcessor; + m_chirpProcessor = 0; + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + //freeCPX(io.cpxIn); + //freeCPX(io.cpxOut); + delete m_chirpDspEngine; + + while (!io.chirp_queue.isEmpty()) + io.chirp_queue.dequeue(); + + DATA_ENGINE_DEBUG << "io.cpxIn, io.cpxOut, fft deleted, io.chirp_queue empty."; + } + + m_chirpInititalized = false; + + DATA_ENGINE_DEBUG << "chirp data processor thread deleted."; + } + else + DATA_ENGINE_DEBUG << "chirp data processor thread wasn't started."; +} + +//******************************************************** +// create, start/stop audio receiver + +void DataEngine::createAudioReceiver() { + + m_audioReceiver = new AudioReceiver(&io); + + CHECKED_CONNECT( + m_audioReceiver, + SIGNAL(rcveIQEvent(QObject *, int)), + this, + SLOT(setRcveIQSignal(QObject *, int))); + + CHECKED_CONNECT( + m_audioReceiver, + SIGNAL(clientConnectedEvent(bool)), + this, + SLOT(setClientConnected(bool))); + + + m_AudioRcvrThread = new QThreadEx(); + m_audioReceiver->moveToThread(m_AudioRcvrThread); + + m_audioReceiver->connect( + m_AudioRcvrThread, + SIGNAL(started()), + SLOT(initClient())); +} + + +void DataEngine::processFileBuffer(const QList buffer) { + + + int topsize = 2*BUFFER_SIZE - 1; + //float specMax = -100.0f; + //float specMin = 0.0f; + + Q_ASSERT(buffer.length() == 128); + + for (int i = 0; i < 64; i++) { + + cpxIn[i + m_rxSamples].re = buffer.at(2*i); + cpxIn[i + m_rxSamples].im = buffer.at(2*i+1); + + chirpData << buffer.at(2*i); + chirpData << buffer.at(2*i+1); + + m_chirpSamples++; + if (m_chirpSamples == io.samplerate) { + + io.chirp_queue.enqueue(chirpData); + chirpData.clear(); + m_chirpSamples = 0; + } + } + m_rxSamples += 64; + + if (m_rxSamples == 2*BUFFER_SIZE) { + + m_chirpDspEngine->fft->DoFFTWForward(cpxIn, cpxOut, 2*BUFFER_SIZE); + + // reorder the spectrum buffer + for (int i = 0; i < BUFFER_SIZE; i++) { + + m_spectrumBuffer[topsize - i] = + (float)(10.0 * log10(MagCPX(cpxOut[i+BUFFER_SIZE]) + 1.5E-45)); + m_spectrumBuffer[BUFFER_SIZE - i] = + (float)(10.0 * log10(MagCPX(cpxOut[i]) + 1.5E-45)); + } + + /*float specMean = 0.0f; + for (int i = BUFFER_SIZE+20; i < BUFFER_SIZE+105; i++) { + + specMean += m_spectrumBuffer[i]; + if (m_spectrumBuffer[i] > specMax) specMax = m_spectrumBuffer[i]; + if (m_spectrumBuffer[i] < specMin) specMin = m_spectrumBuffer[i]; + }*/ + //specMean *= 1.0f/BUFFER_SIZE; + //DATA_PROCESSOR_DEBUG << "pan min" << specMin << "max" << specMax << "mean" << specMean; + + SleeperThread::usleep(42667); + + //emit spectrumBufferChanged(m_spectrumBuffer); + //set->setSpectrumBuffer(m_spectrumBuffer); + //set->setSpectrumBuffer(0, m_spectrumBuffer); + + m_rxSamples = 0; + } +} + + +//***************************************************************************** +// + +void DataEngine::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + io.mutex.lock(); + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; + + io.mutex.unlock(); +} + +void DataEngine::setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode statemode, + QSDR::_DataEngineState enginestate) +{ + io.networkIOMutex.lock(); + set->setSystemState(this, err, hwmode, statemode, enginestate); + io.networkIOMutex.unlock(); +} + +float DataEngine::getFilterSizeCalibrationOffset() { + + //int size=1024; // dspBufferSize + float i = log10((qreal) BUFFER_SIZE); + return 3.0f*(11.0f - i); +} + +void DataEngine::searchHpsdrNetworkDevices() { + + if (!m_discoverer) createDiscoverer(); + + // HPSDR network IO thread + if (!startDiscoverer(QThread::NormalPriority)) { + + DATA_ENGINE_DEBUG << "HPSDR network discovery thread could not be started."; + return; + } + + io.networkIOMutex.lock(); + io.devicefound.wait(&io.networkIOMutex); + + //m_discoverer->findHPSDRDevices(); + + // stop the discovery thread + io.networkIOMutex.unlock(); + stopDiscoverer(); +} + +void DataEngine::setHPSDRDeviceNumber(int value) { + + m_hpsdrDevices = value; +} + +void DataEngine::rxListChanged(QList list) { + + io.mutex.lock(); + RX = list; + io.mutex.unlock(); +} + +void DataEngine::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.currentReceiver = rx; + io.mutex.unlock(); +} + +void DataEngine::setFramesPerSecond(QObject *sender, int rx, int value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + Q_UNUSED(value) + + /*io.mutex.lock(); + if (m_fpsList.length() > 0) + m_fpsList[rx] = (int)(1000000.0/value); + io.mutex.unlock();*/ +} + +void DataEngine::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + switch (value) { + + case 48000: + io.samplerate = value; + io.speed = 0; + io.outputMultiplier = 1; + break; + + case 96000: + io.samplerate = value; + io.speed = 1; + io.outputMultiplier = 2; + break; + + case 192000: + io.samplerate = value; + io.speed = 2; + io.outputMultiplier = 4; + break; + + case 384000: + io.samplerate = value; + io.speed = 3; + io.outputMultiplier = 8; + break; + + default: + DATA_ENGINE_DEBUG << "invalid sample rate !\n"; + stop(); + break; + } + + io.mutex.unlock(); + + emit outMultiplierEvent(io.outputMultiplier); +} + +void DataEngine::setMercuryAttenuator(QObject *sender, HamBand band, int value) { + + Q_UNUSED(sender) + Q_UNUSED(band) + + io.mutex.lock(); + io.ccTx.mercuryAttenuator = value; + io.mutex.unlock(); +} + +void DataEngine::setMercuryAttenuators(QObject *sender, QList attn) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.ccTx.mercuryAttenuators = attn; + io.mutex.unlock(); +} + +void DataEngine::setDither(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.ccTx.dither = value; + io.mutex.unlock(); +} + +void DataEngine::setRandom(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.ccTx.random = value; + io.mutex.unlock(); +} + +void DataEngine::set10MhzSource(QObject *sender, int source) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.control_out[1] = io.control_out[1] & 0xF3; + io.control_out[1] = io.control_out[1] | (source << 2); + io.mutex.unlock(); +} + +void DataEngine::set122_88MhzSource(QObject *sender, int source) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.control_out[1] = io.control_out[1] & 0xEF; + io.control_out[1] = io.control_out[1] | (source << 4); + io.mutex.unlock(); +} + +void DataEngine::setMicSource(QObject *sender, int source) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.control_out[1] = io.control_out[1] & 0x7F; + io.control_out[1] = io.control_out[1] | (source << 7); + io.mutex.unlock(); +} + +void DataEngine::setMercuryClass(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.rxClass = value; + io.mutex.unlock(); +} + +void DataEngine::setMercuryTiming(QObject *sender, int value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + io.timing = value; + io.mutex.unlock(); +} + +void DataEngine::setAlexConfiguration(quint16 conf) { + + io.mutex.lock(); + io.ccTx.alexConfig = conf; + DATA_ENGINE_DEBUG << "Alex Configuration = " << io.ccTx.alexConfig; + io.mutex.unlock(); +} + +void DataEngine::setAlexStates(HamBand band, const QList &states) { + + Q_UNUSED (band) + + io.mutex.lock(); + io.ccTx.alexStates = states; + DATA_ENGINE_DEBUG << "Alex States = " << io.ccTx.alexStates; + io.mutex.unlock(); +} + +void DataEngine::setPennyOCEnabled(bool value) { + + io.mutex.lock(); + io.ccTx.pennyOCenabled = value; + io.mutex.unlock(); +} + +void DataEngine::setRxJ6Pins(const QList &list) { + + io.mutex.lock(); + io.ccTx.rxJ6pinList = list; + io.mutex.unlock(); + +} + +void DataEngine::setTxJ6Pins(const QList &list) { + + io.mutex.lock(); + io.ccTx.txJ6pinList = list; + io.mutex.unlock(); +} + +void DataEngine::setRcveIQSignal(QObject *sender, int value) { + + emit rcveIQEvent(sender, value); +} + +void DataEngine::setPenelopeVersion(QObject *sender, int version) { + + emit penelopeVersionInfoEvent(sender, version); +} + +void DataEngine::setHwIOVersion(QObject *sender, int version) { + + emit hwIOVersionInfoEvent(sender, version); +} + +void DataEngine::setNumberOfRx(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (io.receivers == value) return; + + io.mutex.lock(); + io.receivers = value; + io.mutex.unlock(); + //io.control_out[4] &= 0xc7; + //io.control_out[4] |= (value - 1) << 3; + + DATA_ENGINE_DEBUG << "number of receivers set to " << QString::number(value); +} + +void DataEngine::setTimeStamp(QObject *sender, bool value) { + + Q_UNUSED(sender) + + if (io.timeStamp == value) return; + + io.mutex.lock(); + io.timeStamp = value; + io.mutex.unlock(); + //io.control_out[4] &= 0xc7; + io.control_out[4] |= value << 6; + + if (value) + DATA_ENGINE_DEBUG << "set time stamp on"; + else + DATA_ENGINE_DEBUG << "set time stamp off"; +} + +void DataEngine::setRxSocketState(int rx, const char* prop, QString str) { + + RX[rx]->setProperty(prop, str); + set->setRxList(RX); +} + +void DataEngine::setRxPeerAddress(int rx, QHostAddress address) { + + RX[rx]->setPeerAddress(address); + set->setRxList(RX); +} + +void DataEngine::setRx(int rx) { + + io.mutex.lock(); + RX[rx]->setReceiver(rx); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setRxClient(int rx, int client) { + + io.mutex.lock(); + RX[rx]->setClient(client); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setClientConnected(QObject* sender, int rx) { + + Q_UNUSED(sender) + + if (!io.clientList.contains(rx)) { + + io.clientList.append(rx); + io.audio_rx = rx; + + m_AudioRcvrThread->quit(); + m_AudioRcvrThread->wait(); + m_AudioRcvrThread->start(); + } + else { + + io.sendIQ_toggle = true; + io.rcveIQ_toggle = false; + m_AudioRcvrThread->start(); + } +} + +void DataEngine::setClientConnected(bool value) { + + m_clientConnected = value; +} + +void DataEngine::setClientDisconnected(int client) { + + Q_UNUSED(client) + /*if (m_clientConnected) { + + m_AudioRcvrThread->quit(); + m_AudioRcvrThread->wait(); + if (!m_AudioRcvrThread->isRunning()) + DATA_ENGINE_DEBUG << "audio receiver thread stopped."; + + m_clientConnected = false; + } + sync_toggle = true; + adc_toggle = false;*/ +} + +//void DataEngine::setAudioInProcessorRunning(bool value) { +// +// //m_audioInProcessorRunning = value; +//} + +void DataEngine::setAudioReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + io.mutex.lock(); + emit audioRxEvent(rx); + io.mutex.unlock(); +} + +void DataEngine::setIQPort(int rx, int port) { + + io.mutex.lock(); + RX[rx]->setIQPort(port); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setRxConnectedStatus(QObject* sender, int rx, bool value) { + + Q_UNUSED(sender) + + io.mutex.lock(); + RX[rx]->setConnectedStatus(value); + set->setRxList(RX); + io.mutex.unlock(); +} + +void DataEngine::setHamBand(QObject *sender, int rx, bool byBtn, HamBand band) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + Q_UNUSED(byBtn) + + io.mutex.lock(); + io.ccTx.currentBand = band; + io.mutex.unlock(); +} + +void DataEngine::setFrequency(QObject* sender, int mode, int rx, long frequency) { + + Q_UNUSED (sender) + Q_UNUSED (mode) + + //RX[rx]->setFrequency(frequency); + RX[rx]->setCtrFrequency(frequency); + io.rx_freq_change = rx; + io.tx_freq_change = rx; +} + +void DataEngine::loadWavFile(const QString &fileName) { + + if (m_audioEngine->loadFile(fileName)) + m_soundFileLoaded = true; + else + m_soundFileLoaded = false; +} + +void DataEngine::suspend() { + + m_audioEngine->suspend(); +} + +void DataEngine::startPlayback() { + + m_audioEngine->startPlayback(); +} + +void DataEngine::showSettingsDialog() { + + m_audioEngine->showSettingsDialog(); +} + +void DataEngine::setAudioFileFormat(QObject *sender, const QAudioFormat &format) { + + Q_UNUSED (sender) + Q_UNUSED (format) +} + +void DataEngine::setAudioFilePosition(QObject *sender, qint64 position) { + + Q_UNUSED (sender) + Q_UNUSED (position) +} + +void DataEngine::setAudioFileBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { + + Q_UNUSED (sender) + + m_audioFileBufferPosition = position; + m_audioFileBufferLength = length; + m_audioFileBuffer = buffer; + + //DATA_ENGINE_DEBUG << "audio file length" << m_audioFileBufferLength; +} + +void DataEngine::setAudioFileBuffer(const QList &buffer) { + + io.inputBuffer = buffer; + + /*for (int i = 0; i < buffer.length(); i++) { + + DATA_ENGINE_DEBUG << "i" << i << "audioBuffer" << io.inputBuffer.at(i); + }*/ +} + +// ********************************************************************* +// Data processor + +DataProcessor::DataProcessor( + DataEngine *de, + QSDR::_ServerMode serverMode, + QSDR::_HWInterfaceMode hwMode) + : QObject() + , de(de) + , set(Settings::instance()) + , m_dataProcessorSocket(0) + , m_serverMode(serverMode) + , m_hwInterface(hwMode) + , m_socketConnected(false) + , m_setNetworkDeviceHeader(true) + , m_chirpGateBit(true) + , m_chirpBit(false) + , m_chirpStart(false) + , m_bytes(0) + , m_offset(0) + , m_length(0) + , m_rxSamples(0) + , m_chirpSamples(0) + , m_chirpStartSample(0) + , m_idx(IO_HEADER_SIZE) + , m_sendState(0) + , m_stopped(false) +{ + m_IQSequence = 0L; + m_sequenceHi = 0L; + + m_IQDatagram.resize(0); + + m_SyncChangedTime.start(); + m_ADCChangedTime.start(); + + m_fwCount = 0; + + m_sendSequence = 0L; + m_oldSendSequence = 0L; + + m_deviceSendDataSignature.resize(4); + m_deviceSendDataSignature[0] = (char)0xEF; + m_deviceSendDataSignature[1] = (char)0xFE; + m_deviceSendDataSignature[2] = (char)0x01; + m_deviceSendDataSignature[3] = (char)0x02; + + //socket = new QUdpSocket(); + m_deviceAddress = set->getCurrentMetisCard().ip_address; +} + +DataProcessor::~DataProcessor() { +} + +void DataProcessor::stop() { + + m_stopped = true; +} + +void DataProcessor::initDataProcessorSocket() { + + m_dataProcessorSocket = new QUdpSocket(); + + /*m_dataProcessorSocket->bind(QHostAddress(set->getHPSDRDeviceLocalAddr()), + 23000, + QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress); + + int newBufferSize = 64 * 1024; + + if (::setsockopt(m_dataProcessorSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { + + DATA_ENGINE_DEBUG << "initDataProcessorSocket error setting m_dataProcessorSocket buffer size."; + }*/ + + //m_dataProcessorSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + //m_dataProcessorSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); + + CHECKED_CONNECT( + m_dataProcessorSocket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError))); +} + +void DataProcessor::displayDataProcessorSocketError(QAbstractSocket::SocketError error) { + + DATA_PROCESSOR_DEBUG << "data processor socket error: " << error; +} + +void DataProcessor::processDeviceData() { + + //if (m_serverMode == QSDR::ExternalDSP) + // initDataProcessorSocket(); + + DATA_PROCESSOR_DEBUG << "Data Processor thread: " << this->thread(); + forever { + + //m_dataEngine->processInputBuffer(m_dataEngine->io.iq_queue.dequeue()); + QByteArray buf = de->io.iq_queue.dequeue(); + //de->processInputBuffer(buf.left(BUFFER_SIZE/2)); + //de->processInputBuffer(buf.right(BUFFER_SIZE/2)); + + processInputBuffer(buf.left(BUFFER_SIZE/2)); + processInputBuffer(buf.right(BUFFER_SIZE/2)); + + if (de->io.iq_queue.isFull()) { + DATA_PROCESSOR_DEBUG << "IQ queue full!"; + } + + QMutexLocker locker(&m_mutex); + if (m_stopped) { + m_stopped = false; + break; + } + } + +// if (m_serverMode == QSDR::ExternalDSP) { +// +// disconnect(this); +// m_dataProcessorSocket->close(); +// delete m_dataProcessorSocket; +// m_dataProcessorSocket = NULL; +// +// m_socketConnected = false; +// } +} + +void DataProcessor::processData() { + + forever { + + de->processFileBuffer(de->io.data_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void DataProcessor::externalDspProcessing(int rx) { + + // keep UDP packets < 512 bytes + // 8 bytes sequency number, 2 bytes offset, 2 bytes length, 500 bytes data + + if (!m_socketConnected) { + + m_dataProcessorSocket->connectToHost(de->RX[rx]->getPeerAddress(), de->RX[rx]->getIQPort()); + +#if defined(Q_OS_WIN32) + //int newBufferSize = 64 * 1024; + int newBufferSize = 16 * 1024; + + if (::setsockopt(m_dataProcessorSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { + + DATA_PROCESSOR_DEBUG << "externalDspProcessing error setting m_dataProcessorSocket buffer size."; + } +#endif + + m_socketConnected = true; + } + +#ifndef __linux__ + m_sequenceHi = 0L; +#endif + + /*QUdpSocket socket; + CHECKED_CONNECT(&socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDataProcessorSocketError(QAbstractSocket::SocketError)));*/ + + m_offset = 0; + //m_IQDatagram.append(reinterpret_cast(&m_dataEngine->rxList[rx]->input_buffer), sizeof(m_dataEngine->rxList[rx]->input_buffer)); + m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->inBuf), sizeof(de->RX[rx]->inBuf)); + + m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->inBuf), sizeof(de->RX[rx]->inBuf)); + + while (m_offset < m_IQDatagram.size()) { + + m_length = m_IQDatagram.size() - m_offset; + + if (m_length > 500) + m_length = 500; + + QByteArray datagram; + datagram += QByteArray(reinterpret_cast(&m_IQSequence), sizeof(m_IQSequence)); + datagram += QByteArray(reinterpret_cast(&m_sequenceHi), sizeof(m_sequenceHi)); + datagram += QByteArray(reinterpret_cast(&m_offset), sizeof(m_offset)); + datagram += QByteArray(reinterpret_cast(&m_length), sizeof(m_length)); + datagram += m_IQDatagram.mid(m_offset, m_length); + + if (m_dataProcessorSocket->write(datagram) < 0) + /*if (m_dataProcessorSocket->writeDatagram(datagram, + m_dataEngine->rxList[rx]->getPeerAddress(), + m_dataEngine->rxList[rx]->getIQPort()) < 0)*/ + //if (socket.writeDatagram(datagram, + // m_dataEngine->rxList[rx]->getPeerAddress(), + // m_dataEngine->rxList[rx]->getIQPort()) < 0) + { + if (!de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(2); + de->io.sendIQ_toggle = true; + } + + DATA_ENGINE_DEBUG << "externalDspProcessing error sending data to client:" + << m_dataProcessorSocket->errorString(); + } + else { + + //socket.flush(); + if (de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(1); + de->io.sendIQ_toggle = false; + } + } + m_offset += m_length; + } + m_IQDatagram.resize(0); + m_IQSequence++; +} + +void DataProcessor::externalDspProcessingBig(int rx) { + + m_IQDatagram.append(reinterpret_cast(&de->RX[rx]->in), sizeof(de->RX[rx]->in)); + + if (m_dataProcessorSocket->writeDatagram(m_IQDatagram.data(), + m_IQDatagram.size(), + de->RX[rx]->getPeerAddress(), + de->RX[rx]->getIQPort()) < 0) + + { + if (!de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(2); + de->io.sendIQ_toggle = true; + } + + DATA_PROCESSOR_DEBUG << "error sending data to client:" << m_dataProcessorSocket->errorString(); + } + else { + + m_dataProcessorSocket->flush(); + if (de->io.sendIQ_toggle) { // toggles the sendIQ signal + + de->set->setSendIQ(1); + de->io.sendIQ_toggle = false; + } + } + m_IQDatagram.resize(0); +} + +void DataProcessor::processInputBuffer(const QByteArray &buffer) { + + //DATA_PROCESSOR_DEBUG << "processInputBuffer: " << this->thread(); + int s = 0; + + if (buffer.at(s++) == SYNC && buffer.at(s++) == SYNC && buffer.at(s++) == SYNC) + { + // extract C&C bytes + decodeCCBytes(buffer.mid(3, 5)); + s += 5; + + switch (de->io.receivers) + { + case 1: m_maxSamples = 512-0; break; + case 2: m_maxSamples = 512-0; break; + case 3: m_maxSamples = 512-4; break; + case 4: m_maxSamples = 512-10; break; + case 5: m_maxSamples = 512-24; break; + case 6: m_maxSamples = 512-10; break; + case 7: m_maxSamples = 512-20; break; + case 8: m_maxSamples = 512-4; break; + } + + // extract the samples + while (s < m_maxSamples) + { + // extract each of the receivers + for (int r = 0; r < de->io.receivers; r++) + { + m_leftSample = (int)(( signed char) buffer.at(s++)) << 16; + m_leftSample += (int)((unsigned char) buffer.at(s++)) << 8; + m_leftSample += (int)((unsigned char) buffer.at(s++)); + m_rightSample = (int)(( signed char) buffer.at(s++)) << 16; + m_rightSample += (int)((unsigned char) buffer.at(s++)) << 8; + m_rightSample += (int)((unsigned char) buffer.at(s++)); + + m_lsample = (float)(m_leftSample / 8388607.0f); + m_rsample = (float)(m_rightSample / 8388607.0f); + + /*if (m_serverMode == QSDR::ChirpWSPR && + m_chirpInititalized && + m_chirpSamples < io.samplerate) + { + chirpData << m_lsample; + chirpData << m_rsample; + }*/ + + if (de->RX.at(r)->qtdsp) { + + de->RX[r]->inBuf[m_rxSamples].re = m_lsample; // 24 bit sample + de->RX[r]->inBuf[m_rxSamples].im = m_rsample; // 24 bit sample + } + } + + m_micSample = (int)((signed char) buffer.at(s++)) << 8; + + // extract chirp signal time stamp + //m_chirpBit = (buffer.at(s) & 0x01);// == 0x01; + + m_micSample += (int)((unsigned char) buffer.at(s++)); + m_micSample_float = (float) m_micSample / 32767.0f * de->io.mic_gain; // 16 bit sample + + // add to buffer + de->io.mic_left_buffer[m_rxSamples] = m_micSample_float; + de->io.mic_right_buffer[m_rxSamples] = 0.0f; + + ////m_chirpSamples++; + + //if (m_serverMode == QSDR::ChirpWSPR && m_chirpInititalized) + //{ + // if (m_chirpBit) + // { + // if (m_chirpGateBit) + // { + // // we've found the rising edge of the GPS 1PPS signal, so we set the samples + // // counter back to zero in order to have a simple and precise synchronisation + // // with the local chirp. + // io.networkIOMutex.lock(); + // DATA_ENGINE_DEBUG << "GPS 1 PPS"; + // io.networkIOMutex.unlock(); + + // // remove the last sample (real and imag) and enqueue the buffer + // chirpData.removeLast(); + // chirpData.removeLast(); + // io.chirp_queue.enqueue(chirpData); + + // // empty the buffer and add the last sample, which is the starting point of the chirp + // m_chirpSamples = 0; + // chirpData.clear(); + + // chirpData << m_lsample; + // chirpData << m_rsample; + + // m_chirpStart = true; + // m_chirpStartSample = m_rxSamples; + // m_chirpGateBit = false; + // } + // } + // else + // m_chirpGateBit = true; + //} + m_rxSamples++; + m_chirpSamples++; + + // when we have enough rx samples we start the DSP processing. + if (m_rxSamples == BUFFER_SIZE) { + + for (int r = 0; r < de->io.receivers; r++) { + + if (de->RX.at(r)->qtdsp) { + + QMetaObject::invokeMethod(de->RX.at(r), "dspProcessing", Qt::DirectConnection);// Qt::QueuedConnection); + } + } + m_rxSamples = 0; + } + } + } + else { + + if (m_SyncChangedTime.elapsed() > 10) { + + set->setProtocolSync(2); + m_SyncChangedTime.restart(); + } + } +} + +void DataProcessor::decodeCCBytes(const QByteArray &buffer) { + + de->io.ccRx.ptt = (bool)((buffer.at(0) & 0x01) == 0x01); + de->io.ccRx.dash = (bool)((buffer.at(0) & 0x02) == 0x02); + de->io.ccRx.dot = (bool)((buffer.at(0) & 0x04) == 0x04); + de->io.ccRx.lt2208 = (bool)((buffer.at(1) & 0x01) == 0x01); + + de->io.ccRx.roundRobin = (uchar)(buffer.at(0) >> 3); + + switch (de->io.ccRx.roundRobin) // cycle through C0 + { + case 0: + + if (de->io.ccRx.lt2208) // check ADC signal + { + if (m_ADCChangedTime.elapsed() > 50) + { + set->setADCOverflow(2); + m_ADCChangedTime.restart(); + } + } + + //qDebug() << "CC: " << io.ccRx.roundRobin; + if (m_hwInterface == QSDR::Hermes) + { + de->io.ccRx.hermesI01 = (bool)((buffer.at(1) & 0x02) == 0x02); + de->io.ccRx.hermesI02 = (bool)((buffer.at(1) & 0x04) == 0x04); + de->io.ccRx.hermesI03 = (bool)((buffer.at(1) & 0x08) == 0x08); + de->io.ccRx.hermesI04 = (bool)((buffer.at(1) & 0x10) == 0x10); + //qDebug() << "Hermes IO 1: " << io.ccRx.hermesI01 + // << "2: " << io.ccRx.hermesI02 + // << "3: " << io.ccRx.hermesI03 + // << "4: " << io.ccRx.hermesI04; + } + + if (m_fwCount < 100) + { + if (m_hwInterface == QSDR::Metis) + { + if (de->io.ccRx.devices.mercuryFWVersion != buffer.at(2)) + { + de->io.ccRx.devices.mercuryFWVersion = buffer.at(2); + set->setMercuryVersion(de->io.ccRx.devices.mercuryFWVersion); + de->io.networkIOMutex.lock(); + DATA_PROCESSOR_DEBUG << "Mercury firmware version: " << qPrintable(QString::number(buffer.at(2))); + de->io.networkIOMutex.unlock(); + } + + if (de->io.ccRx.devices.penelopeFWVersion != buffer.at(3)) + { + de->io.ccRx.devices.penelopeFWVersion = buffer.at(3); + de->io.ccRx.devices.pennylaneFWVersion = buffer.at(3); + set->setPenelopeVersion(de->io.ccRx.devices.penelopeFWVersion); + set->setPennyLaneVersion(de->io.ccRx.devices.penelopeFWVersion); + de->io.networkIOMutex.lock(); + DATA_PROCESSOR_DEBUG << "Penelope/Pennylane firmware version: " << qPrintable(QString::number(buffer.at(3))); + de->io.networkIOMutex.unlock(); + } + + if (de->io.ccRx.devices.metisFWVersion != buffer.at(4)) + { + de->io.ccRx.devices.metisFWVersion = buffer.at(4); + set->setMetisVersion(de->io.ccRx.devices.metisFWVersion); + de->io.networkIOMutex.lock(); + DATA_PROCESSOR_DEBUG << "Metis firmware version: " << qPrintable(QString::number(buffer.at(4))); + de->io.networkIOMutex.unlock(); + } + } + else if (set->getHWInterface() == QSDR::Hermes) { + + if (de->io.ccRx.devices.hermesFWVersion != buffer.at(4)) { + + de->io.ccRx.devices.hermesFWVersion = buffer.at(4); + set->setHermesVersion(de->io.ccRx.devices.hermesFWVersion); + de->io.networkIOMutex.lock(); + DATA_ENGINE_DEBUG << "Hermes firmware version: " << qPrintable(QString::number(buffer.at(4))); + de->io.networkIOMutex.unlock(); + } + } + m_fwCount++; + } + break; + + case 1: + + //qDebug() << "CC: " << io.ccRx.roundRobin; + // forward power + if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() + + de->io.ccRx.ain5 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); + + de->io.penelopeForwardVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain5 / 4095.0); + de->io.penelopeForwardPower = (qreal)(de->io.penelopeForwardVolts * de->io.penelopeForwardVolts / 0.09); + } + //qDebug() << "penelopeForwardVolts: " << io.penelopeForwardVolts << "penelopeForwardPower" << io.penelopeForwardPower; + + if (set->getAlexPresence()) { //|| set->getApolloPresence()) { + + de->io.ccRx.ain1 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); + + de->io.alexForwardVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain1 / 4095.0); + de->io.alexForwardPower = (qreal)(de->io.alexForwardVolts * de->io.alexForwardVolts / 0.09); + } + //qDebug() << "alexForwardVolts: " << io.alexForwardVolts << "alexForwardPower" << io.alexForwardPower; + break; + + case 2: + + //qDebug() << "CC: " << io.ccRx.roundRobin; + // reverse power + if (set->getAlexPresence()) { //|| set->getApolloPresence()) { + + de->io.ccRx.ain2 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); + + de->io.alexReverseVolts = (qreal)(3.3 * (qreal)de->io.ccRx.ain2 / 4095.0); + de->io.alexReversePower = (qreal)(de->io.alexReverseVolts * de->io.alexReverseVolts / 0.09); + } + //qDebug() << "alexReverseVolts: " << io.alexReverseVolts << "alexReversePower" << io.alexReversePower; + + if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() { + + de->io.ccRx.ain3 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); + de->io.ain3Volts = (qreal)(3.3 * (double)de->io.ccRx.ain3 / 4095.0); + } + //qDebug() << "ain3Volts: " << io.ain3Volts; + break; + + case 3: + + //qDebug() << "CC: " << io.ccRx.roundRobin; + + if (set->getPenelopePresence() || (m_hwInterface == QSDR::Hermes)) { // || set->getPennyLanePresence() { + + de->io.ccRx.ain4 = (quint16)((quint16)(buffer.at(1) << 8) + (quint16)buffer.at(2)); + de->io.ccRx.ain6 = (quint16)((quint16)(buffer.at(3) << 8) + (quint16)buffer.at(4)); + + de->io.ain4Volts = (qreal)(3.3 * (qreal)de->io.ccRx.ain4 / 4095.0); + + if (set->getHWInterface() == QSDR::Hermes) // read supply volts applied to board + de->io.supplyVolts = (qreal)((qreal)de->io.ccRx.ain6 / 186.0f); + } + //qDebug() << "ain4Volts: " << io.ain4Volts << "supplyVolts" << io.supplyVolts; + break; + + //case 4: + + // more than 1 Mercury module (currently not usable) + //qDebug() << "CC: " << io.ccRx.roundRobin; + //switch (io.receivers) { + + // case 1: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208; + // break; + + // case 2: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; + // break; + + // case 3: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); + // io.ccRx.mercury3_LT2208 = (bool)((buffer.at(3) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; + // //qDebug() << "mercury3_LT2208: " << io.ccRx.mercury3_LT2208; + // break; + + // case 4: + // io.ccRx.mercury1_LT2208 = (bool)((buffer.at(1) & 0x02) == 0x02); + // io.ccRx.mercury2_LT2208 = (bool)((buffer.at(2) & 0x02) == 0x02); + // io.ccRx.mercury3_LT2208 = (bool)((buffer.at(3) & 0x02) == 0x02); + // io.ccRx.mercury4_LT2208 = (bool)((buffer.at(4) & 0x02) == 0x02); + // //qDebug() << "mercury1_LT2208: " << io.ccRx.mercury1_LT2208 << "mercury2_LT2208" << io.ccRx.mercury2_LT2208; + // //qDebug() << "mercury3_LT2208: " << io.ccRx.mercury3_LT2208 << "mercury4_LT2208" << io.ccRx.mercury4_LT2208; + // break; + //} + //break; + } // end switch cycle through C0 +} + +void DataProcessor::setOutputBuffer(int rx, const CPX &buffer) { + + if (rx == de->io.currentReceiver) { + processOutputBuffer(buffer); + } +} + +void DataProcessor::processOutputBuffer(const CPX &buffer) { + + //DATA_PROCESSOR_DEBUG << "processOutputBuffer: " << this->thread(); + + qint16 leftRXSample; + qint16 rightRXSample; + qint16 leftTXSample; + qint16 rightTXSample; + + // process the output + for (int j = 0; j < BUFFER_SIZE; j += de->io.outputMultiplier) { + + leftRXSample = (qint16)(buffer.at(j).re * 32767.0f); + rightRXSample = (qint16)(buffer.at(j).im * 32767.0f); + + leftTXSample = 0; + rightTXSample = 0; + + de->io.output_buffer[m_idx++] = leftRXSample >> 8; + de->io.output_buffer[m_idx++] = leftRXSample; + de->io.output_buffer[m_idx++] = rightRXSample >> 8; + de->io.output_buffer[m_idx++] = rightRXSample; + de->io.output_buffer[m_idx++] = leftTXSample >> 8; + de->io.output_buffer[m_idx++] = leftTXSample; + de->io.output_buffer[m_idx++] = rightTXSample >> 8; + de->io.output_buffer[m_idx++] = rightTXSample; + + if (m_idx == IO_BUFFER_SIZE) { + + //if (de->m_audioBuffer.length() == 1024) { + + // //m_audioEngine->setAudioBuffer(this, m_audioBuffer); + // de->m_audioBuffer.resize(0); + //} + // set the C&C bytes + encodeCCBytes(); + + switch (m_hwInterface) { + + case QSDR::Metis: + case QSDR::Hermes: + + de->io.audioDatagram.resize(IO_BUFFER_SIZE); + de->io.audioDatagram = QByteArray::fromRawData((const char *)&de->io.output_buffer, IO_BUFFER_SIZE); + + //if (m_dataIOThreadRunning) { + // de->m_dataIO->writeData(); + //} + + de->m_dataIO->sendAudio(de->io.output_buffer); //RRK + + writeData(); + break; + + case QSDR::NoInterfaceMode: + break; + } + m_idx = IO_HEADER_SIZE; + } + } +} + +void DataProcessor::encodeCCBytes() { + + de->io.output_buffer[0] = SYNC; + de->io.output_buffer[1] = SYNC; + de->io.output_buffer[2] = SYNC; + + de->io.mutex.lock(); + switch (m_sendState) { + + case 0: + + uchar rxAnt; + uchar rxOut; + uchar ant; + + de->io.control_out[0] = 0x0; // C0 + de->io.control_out[1] = 0x0; // C1 + de->io.control_out[2] = 0x0; // C2 + de->io.control_out[3] = 0x0; // C3 + de->io.control_out[4] = 0x0; // C4 + + // C0 + // 0 0 0 0 0 0 0 0 + // | + // +------------ MOX (1 = active, 0 = inactive) + + // set C1 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Speed (00 = 48kHz, 01 = 96kHz, 10 = 192kHz) + // | | | | + +---------------- 10MHz Ref. (00 = Atlas/Excalibur, 01 = Penelope, 10 = Mercury)* + // | | | +-------------------- 122.88MHz source (0 = Penelope, 1 = Mercury)* + // | + +---------------------- Config (00 = nil, 01 = Penelope, 10 = Mercury, 11 = both)* + // +-------------------------- Mic source (0 = Janus, 1 = Penelope)* + // + // * Ignored by Hermes + + de->io.control_out[1] |= de->io.speed; // sample rate + + de->io.control_out[1] &= 0x03; // 0 0 0 0 0 0 1 1 + de->io.control_out[1] |= de->io.ccTx.clockByte; + + // set C2 + // + // 0 0 0 0 0 0 0 0 + // | | | + // | | +------------ Mode (1 = Class E, 0 = All other modes) + // +---------- +-------------- Open Collector Outputs on Penelope or Hermes (bit 6...bit 0) + + de->io.control_out[2] = de->io.rxClass; + + if (de->io.ccTx.pennyOCenabled) { + + de->io.control_out[2] &= 0x1; // 0 0 0 0 0 0 0 1 + + if (de->io.ccTx.currentBand != (HamBand) gen) { + + if (de->io.ccTx.mox || de->io.ccTx.ptt) + de->io.control_out[2] |= (de->io.ccTx.txJ6pinList.at(de->io.ccTx.currentBand) >> 1) << 1; + else + de->io.control_out[2] |= (de->io.ccTx.rxJ6pinList.at(de->io.ccTx.currentBand) >> 1) << 1; + } + } + + + // set C3 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + +------------ Alex Attenuator (00 = 0dB, 01 = 10dB, 10 = 20dB, 11 = 30dB) + // | | | | | +---------------- Preamp On/Off (0 = Off, 1 = On) + // | | | | +------------------ LT2208 Dither (0 = Off, 1 = On) + // | | | + ------------------- LT2208 Random (0= Off, 1 = On) + // | + + --------------------- Alex Rx Antenna (00 = none, 01 = Rx1, 10 = Rx2, 11 = XV) + // + ------------------------- Alex Rx out (0 = off, 1 = on). Set if Alex Rx Antenna > 00. + + + rxAnt = 0x07 & (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 2); + rxOut = (rxAnt > 0) ? 1 : 0; + + de->io.control_out[3] = (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 7); + + de->io.control_out[3] &= 0xFB; // 1 1 1 1 1 0 1 1 + de->io.control_out[3] |= (de->io.ccTx.mercuryAttenuator << 2); + + de->io.control_out[3] &= 0xF7; // 1 1 1 1 0 1 1 1 + de->io.control_out[3] |= (de->io.ccTx.dither << 3); + + de->io.control_out[3] &= 0xEF; // 1 1 1 0 1 1 1 1 + de->io.control_out[3] |= (de->io.ccTx.random << 4); + + de->io.control_out[3] &= 0x9F; // 1 0 0 1 1 1 1 1 + de->io.control_out[3] |= rxAnt << 5; + + de->io.control_out[3] &= 0x7F; // 0 1 1 1 1 1 1 1 + de->io.control_out[3] |= rxOut << 7; + + // set C4 + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | + + ----------- Alex Tx relay (00 = Tx1, 01= Tx2, 10 = Tx3) + // | | | | | + --------------- Duplex (0 = off, 1 = on) + // | | + + +------------------ Number of Receivers (000 = 1, 111 = 8) + // | +------------------------ Time stamp - 1PPS on LSB of Mic data (0 = off, 1 = on) + // +-------------------------- Common Mercury Frequency (0 = independent frequencies to Mercury + // Boards, 1 = same frequency to all Mercury boards) + + if (de->io.ccTx.mox || de->io.ccTx.ptt) + ant = (de->io.ccTx.alexStates.at(de->io.ccTx.currentBand) >> 5); + else + ant = de->io.ccTx.alexStates.at(de->io.ccTx.currentBand); + + de->io.control_out[4] |= (ant != 0) ? ant-1 : ant; + + de->io.control_out[4] &= 0xFB; // 1 1 1 1 1 0 1 1 + de->io.control_out[4] |= de->io.ccTx.duplex << 2; + + de->io.control_out[4] &= 0xC7; // 1 1 0 0 0 1 1 1 + de->io.control_out[4] |= (de->io.receivers - 1) << 3; + + de->io.control_out[4] &= 0xBF; // 1 0 1 1 1 1 1 1 + de->io.control_out[4] |= de->io.ccTx.timeStamp << 6; + + de->io.control_out[4] &= 0x7F; // 0 1 1 1 1 1 1 1 + de->io.control_out[4] |= de->io.ccTx.commonMercuryFrequencies << 7; + + // fill the out buffer with the C&C bytes + for (int i = 0; i < 5; i++) + de->io.output_buffer[i+3] = de->io.control_out[i]; + + m_sendState = 1; + break; + + case 1: + + // C0 + // 0 0 0 0 0 0 1 x C1, C2, C3, C4 NCO Frequency in Hz for Transmitter, Apollo ATU + // (32 bit binary representation - MSB in C1) + + de->io.output_buffer[3] = 0x2; // C0 + + if (de->io.tx_freq_change >= 0) { + + de->io.output_buffer[4] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 24; + de->io.output_buffer[5] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 16; + de->io.output_buffer[6] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency() >> 8; + de->io.output_buffer[7] = de->RX.at(de->io.tx_freq_change)->getCtrFrequency(); + + de->io.tx_freq_change = -1; + } + + m_sendState = de->io.ccTx.duplex ? 2 : 3; + break; + + case 2: + + // C0 = 0 0 0 0 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver_1 + // C0 = 0 0 0 0 0 1 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _2 + // C0 = 0 0 0 0 1 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _3 + // C0 = 0 0 0 0 1 0 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _4 + // C0 = 0 0 0 0 1 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _5 + // C0 = 0 0 0 0 1 1 1 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _6 + // C0 = 0 0 0 1 0 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _7 + + if (de->io.rx_freq_change >= 0) { + + de->io.output_buffer[3] = (de->io.rx_freq_change + 2) << 1; + de->io.output_buffer[4] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 24; + de->io.output_buffer[5] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 16; + de->io.output_buffer[6] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency() >> 8; + de->io.output_buffer[7] = de->RX.at(de->io.rx_freq_change)->getCtrFrequency(); + + de->io.rx_freq_change = -1; + } + + m_sendState = 3; + break; + + case 3: + + de->io.control_out[0] = 0x12; // 0 0 0 1 0 0 1 0 + de->io.control_out[1] = 0x0; // C1 + de->io.control_out[2] = 0x0; // C2 + de->io.control_out[3] = 0x0; // C3 + de->io.control_out[4] = 0x0; // C4 + + // C1 + // 0 0 0 0 0 0 0 0 + // | | + // +-------------+------------ Hermes/PennyLane Drive Level (0-255) (ignored by Penelope) + + + // C2 + // 0 0 0 0 0 0 0 0 + // | | | | | | | | + // | | | | | | | +------------ Hermes/Metis Penelope Mic boost (0 = 0dB, 1 = 20dB) + // | | | | | | +-------------- Metis/Penelope or PennyLane Mic/Line-in (0 = mic, 1 = Line-in) + // | | | | | +---------------- Hermes - Enable/disable Apollo filter (0 = disable, 1 = enable) + // | | | | +------------------ Hermes - Enable/disable Apollo tuner (0 = disable, 1 = enable) + // | | | +-------------------- Hermes - Apollo auto tune (0 = end, 1 = start) + // | | +---------------------- Hermes - select filter board (0 = Alex, 1 = Apollo) + // | +------------------------ Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // +-------------------------- VNA mode (0 = off, 1 = on) + + // Alex configuration: + // + // manual 0 + + de->io.control_out[2] &= 0xBF; // 1 0 1 1 1 1 1 1 + de->io.control_out[2] |= (de->io.ccTx.alexConfig & 0x01) << 6; + + // C3 + // 0 0 0 0 0 0 0 0 + // | | | | | | | + // | | | | | | +------------ Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | +-------------- Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | +---------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | +------------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | +-------------------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | +---------------------- Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // +------------------------ Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // + // *Only valid when Alex - manual HPF/LPF filter select is enabled + + de->io.control_out[3] &= 0xFE; // 1 1 1 1 1 1 1 0 + // HPF 13 MHz: 1 0 0 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x40) >> 6; + + de->io.control_out[3] &= 0xFD; // 1 1 1 1 1 1 0 1 + // HPF 20 MHz: 1 0 0 0 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x80) >> 6; + + de->io.control_out[3] &= 0xFB; // 1 1 1 1 1 0 1 1 + // HPF 9.5 MHz: 1 0 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x20) >> 3; + + de->io.control_out[3] &= 0xF7; // 1 1 1 1 0 1 1 1 + // HPF 6.5 MHz: 1 0 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x10) >> 1; + + de->io.control_out[3] &= 0xEF; // 1 1 1 0 1 1 1 1 + // HPF 1.5 MHz: 1 0 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x08) << 1; + + de->io.control_out[3] &= 0xDF; // 1 1 0 1 1 1 1 1 + // bypass all: 1 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x02) << 4; + + de->io.control_out[3] &= 0xBF; // 1 0 1 1 1 1 1 1 + // 6m BPF/LNA: 1 0 0 + de->io.control_out[3] |= (de->io.ccTx.alexConfig & 0x04) << 4; + + de->io.control_out[3] &= 0x7F; // 0 1 1 1 1 1 1 1 + de->io.control_out[3] |= ((int)de->io.ccTx.vnaMode) << 7; + + // C4 + // 0 0 0 0 0 0 0 0 + // | | | | | | | + // | | | | | | +------------ Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | | | | +-------------- Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | | +---------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | +------------------ Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | +-------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + // | +---------------------- Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +------------------------ Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // + // *Only valid when Alex - manual HPF/LPF filter select is enabled + + de->io.control_out[4] &= 0xFE; // 1 1 1 1 1 1 1 0 + // LPF 30/20m: 1 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x800) >> 11; + + de->io.control_out[4] &= 0xFD; // 1 1 1 1 1 1 0 1 + // LPF 60/40m: 1 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x400) >> 9; + + de->io.control_out[4] &= 0xFB; // 1 1 1 1 1 0 1 1 + // LPF 80m: 1 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x200) >> 7; + + de->io.control_out[4] &= 0xF7; // 1 1 1 1 0 1 1 1 + // LPF 160m: 1 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x100) >> 5; + + de->io.control_out[4] &= 0xEF; // 1 1 1 0 1 1 1 1 + // LPF 6m: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x4000) >> 10; + + de->io.control_out[4] &= 0xDF; // 1 1 0 1 1 1 1 1 + // LPF 12/10m : 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x2000) >> 8; + + de->io.control_out[4] &= 0xBF; // 1 0 1 1 1 1 1 1 + // LPF 17/15m: 1 0 0 0 0 0 0 0 0 0 0 0 0 + de->io.control_out[4] |= (de->io.ccTx.alexConfig & 0x1000) >> 6; + + // fill the out buffer with the C&C bytes + for (int i = 0; i < 5; i++) + de->io.output_buffer[i+3] = de->io.control_out[i]; + + // round finished + m_sendState = 0; + break; + } + de->io.mutex.unlock(); + + + /*switch (m_hwInterface) { + + case QSDR::Metis: + case QSDR::Hermes: + + io.audioDatagram.resize(IO_BUFFER_SIZE); + io.audioDatagram = QByteArray::fromRawData((const char *)&io.output_buffer, IO_BUFFER_SIZE); + + if (m_dataIOThreadRunning) { + m_dataIO->writeData(); + } + break; + + case QSDR::NoInterfaceMode: + break; + }*/ +} + +void DataProcessor::writeData() { + + if (m_setNetworkDeviceHeader) { + + m_outDatagram.resize(0); + m_outDatagram += m_deviceSendDataSignature; + + QByteArray seq(reinterpret_cast(&m_sendSequence), sizeof(m_sendSequence)); + + m_outDatagram += seq; + m_outDatagram += de->io.audioDatagram; + + m_sendSequence++; + m_setNetworkDeviceHeader = false; + } + else { + + //QUdpSocket socket; + //DATA_PROCESSOR_DEBUG << "writeData: " << this->thread(); + m_outDatagram += de->io.audioDatagram; + + if (de->sendSocket->writeDatagram(m_outDatagram, m_deviceAddress, DEVICE_PORT) < 0) { + DATA_PROCESSOR_DEBUG << "error sending data to device: " << de->sendSocket->errorString(); + } + + //if (m_sendSequence%100 == 0) + // DATAIO_DEBUG << m_sendSequence; + + if (m_sendSequence != m_oldSendSequence + 1) { + DATA_PROCESSOR_DEBUG << "output sequence error: old = " << m_oldSendSequence << "; new =" << m_sendSequence; + } + + m_oldSendSequence = m_sendSequence; + m_setNetworkDeviceHeader = true; + } +} + + +// ********************************************************************* +// Audio out processor + +AudioOutProcessor::AudioOutProcessor(DataEngine *de, QSDR::_ServerMode serverMode) + : QObject() + , m_dataEngine(de) + , m_serverMode(serverMode) + , m_stopped(false) +{ + m_IQDatagram.resize(0); +} + +AudioOutProcessor::~AudioOutProcessor() { +} + +void AudioOutProcessor::stop() { + + m_stopped = true; +} + +void AudioOutProcessor::processDeviceData() { + + forever { + + //m_dataEngine->processInputBuffer(m_dataEngine->io.iq_queue.dequeue()); + //DATA_ENGINE_DEBUG << "IQ queue length:" << m_dataEngine->io.iq_queue.count(); + //DATA_ENGINE_DEBUG << "iq_queue length:" << m_dataEngine->io.iq_queue.dequeue().length(); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void AudioOutProcessor::processData() { + + forever { + + //m_dataEngine->processFileBuffer(m_dataEngine->io.data_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + + +// ********************************************************************* +// Wide band data processor + +WideBandDataProcessor::WideBandDataProcessor(THPSDRParameter *ioData, QSDR::_ServerMode serverMode, int size) + : QObject() + , io(ioData) + , set(Settings::instance()) + , m_serverMode(serverMode) + , m_size(size) + , m_bytes(0) + , m_wbSpectrumAveraging(true) + , m_stopped(false) +{ + m_WBDatagram.resize(0); + + switch (m_serverMode) { + + case QSDR::SDRMode: + + wbFFT = new QFFT(m_size); + + cpxWBIn.resize(m_size); + cpxWBOut.resize(m_size); + + io->wbWindow.resize(m_size); + io->wbWindow.fill(0.0f); + + QFilter::MakeWindow(12, m_size, (float *)io->wbWindow.data()); // 12 = BLACKMANHARRIS_WINDOW + + wbAverager = new DualModeAverager(-1, m_size/2); + + break; + + //case QSDR::ExternalDSP: + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + break; + + case QSDR::NoServerMode: + case QSDR::DemoMode: + break; + } +} + +WideBandDataProcessor::~WideBandDataProcessor() { + + delete wbFFT; + + if (wbAverager) { + + delete wbAverager; + } + + cpxWBIn.clear(); + cpxWBOut.clear(); +} + +void WideBandDataProcessor::stop() { + + //mutex.lock(); + m_stopped = true; + //mutex.unlock(); +} + +void WideBandDataProcessor::processWideBandData() { + + forever { + + processWideBandInputBuffer(io->wb_queue.dequeue()); + + m_mutex.lock(); + if (m_stopped) { + m_stopped = false; + m_mutex.unlock(); + break; + } + m_mutex.unlock(); + } +} + +void WideBandDataProcessor::processWideBandInputBuffer(const QByteArray &buffer) { + + int size; + + //if (m_mercuryFW > 32 || m_hermesFW > 16) + if (io->mercuryFW > 32 || io->hermesFW > 11) + size = 2 * BIGWIDEBANDSIZE; + else + size = 2 * SMALLWIDEBANDSIZE; + + qint64 length = buffer.length(); + if (buffer.length() != size) { + + WIDEBAND_PROCESSOR_DEBUG << "wrong wide band buffer length: " << length; + return; + } + + int s; + float sample; + float norm = 1.0f / (4 * size); + + for (int i = 0; i < length; i += 2) { + + s = (int)((qint8 ) buffer.at(i+1)) << 8; + s += (int)((quint8) buffer.at(i)); + sample = (float)(s * norm); + + cpxWBIn[i/2].re = sample * io->wbWindow.at(i/2); + cpxWBIn[i/2].im = sample * io->wbWindow.at(i/2); + } + + wbFFT->DoFFTWForward(cpxWBIn, cpxWBOut, size/2); + + // averaging + QVector specBuf(size/4); + + m_mutex.lock(); + if (m_wbSpectrumAveraging) { + + for (int i = 0; i < size/4; i++) + specBuf[i] = (float)(10.0 * log10(MagCPX(cpxWBOut.at(i)) + 1.5E-45)); + + wbAverager->ProcessDBAverager(specBuf, specBuf); + m_mutex.unlock(); + } + else { + + for (int i = 0; i < size/4; i++) + specBuf[i] = (float)(10.0 * log10(MagCPX(cpxWBOut.at(i)) + 1.5E-45)); + + m_mutex.unlock(); + } + + //set->setWidebandSpectrumBuffer(specBuf); + emit wbSpectrumBufferChanged(specBuf); +} + +void WideBandDataProcessor::setWbSpectrumAveraging(QObject* sender, int rx, bool value) { + + Q_UNUSED (sender) + + if (rx != -1) return; + + m_mutex.lock(); + m_wbSpectrumAveraging = value; + m_mutex.unlock(); +} diff --git a/Source/src/DataEngine/cusdr_dataEngine.h b/Source/src/DataEngine/cusdr_dataEngine.h new file mode 100644 index 0000000..a1a7298 --- /dev/null +++ b/Source/src/DataEngine/cusdr_dataEngine.h @@ -0,0 +1,534 @@ +/** +* @file cusdr_dataEngine.h +* @brief cuSDR data engine header file +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-02 +*/ + +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * using original C code by John Melton, G0ORX/N6LYT and Dave McMcQuate, WA8YWQ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_DATA_ENGINE_H +#define _CUSDR_DATA_ENGINE_H + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_settings.h" +#include "cusdr_dataIO.h" +#include "cusdr_receiver.h" +#include "cusdr_chirpProcessor.h" +#include "cusdr_audioReceiver.h" +#include "cusdr_discoverer.h" +#include "Util/qcircularbuffer.h" +#include "QtDSP/qtdsp_fft.h" +#include "QtDSP/qtdsp_filter.h" +#include "QtDSP/qtdsp_dualModeAverager.h" +#include "AudioEngine/cusdr_audio_engine.h" + +#ifdef LOG_DATA_ENGINE +# define DATA_ENGINE_DEBUG qDebug().nospace() << "DataEngine::\t" +#else +# define DATA_ENGINE_DEBUG nullDebug() +#endif + +#ifdef LOG_DATA_PROCESSOR +# define DATA_PROCESSOR_DEBUG qDebug().nospace() << "DataProcessor::\t" +#else +# define DATA_PROCESSOR_DEBUG nullDebug() +#endif + +#ifdef LOG_WIDEBAND_PROCESSOR +# define WIDEBAND_PROCESSOR_DEBUG qDebug().nospace() << "WidebandProcessor::\t" +#else +# define WIDEBAND_PROCESSOR_DEBUG nullDebug() +#endif + + +class DataProcessor; +class AudioOutProcessor; +class WideBandDataProcessor; + + +//Q_DECLARE_METATYPE (QAbstractSocket::SocketError) + + +// ********************************************************************* +// data engine class + +class DataEngine : public QObject { + + Q_OBJECT + +public: + DataEngine(QObject* parent = 0); + ~DataEngine(); + + Settings* set; + THPSDRParameter io; + + QList RX; + QList chirpData; + + QUdpSocket* sendSocket; + DataIO* m_dataIO; + +public slots: + bool initDataEngine(); + void stop(); + + // set Server parameter + void setRxPeerAddress(int rx, QHostAddress address); + void setRxClient(int rx, int client); + void setRx(int rx); + void setRxSocketState(int rx, const char* prop, QString); + + //void setSendIQSignal(QObject *sender, int value); + void setRcveIQSignal(QObject *sender, int value); + void setAudioReceiver(QObject *sender, int rx); + //void setAudioInProcessorRunning(bool value); + void setIQPort(int rx, int port); + void setRxConnectedStatus(QObject* sender, int rx, bool value); + void setClientConnected(QObject* sender, int rx); + void setClientConnected(bool value); + void setClientDisconnected(int client); + void setFramesPerSecond(QObject *sender, int rx, int value); + void createChirpDataProcessor(); + + // DSP processing + void processFileBuffer(const QList data); + + // change HPSDR hardware settings + void setPenelopeVersion(QObject *sender, int version); + void setHwIOVersion(QObject *sender, int version); + void setNumberOfRx(QObject *sender, int value); + void setSampleRate(QObject *sender, int value); + void setMercuryAttenuator(QObject *sender, HamBand band, int value); + void setDither(QObject *sender, int value); + void setRandom(QObject *sender, int value); + void setTimeStamp(QObject *sender, bool value); + void set10MhzSource(QObject *sender, int source); + void set122_88MhzSource(QObject *sender, int source); + void setMicSource(QObject *sender, int source); + void setMercuryClass(QObject *sender, int value); + void setMercuryTiming(QObject* sender, int value); + void setHamBand(QObject *sender, int rx, bool byBtn, HamBand band); + void setFrequency(QObject* sender, int mode, int rx, long frequency); + + void loadWavFile(const QString &fileName); + void suspend(); + void startPlayback(); + void showSettingsDialog(); + +private: + void setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void initAudioEngine(); + void setupConnections(); + void connectDSPSlots(); + void disconnectDSPSlots(); + void createDiscoverer(); + void createDataIO(); + void createDataProcessor(); + void createAudioOutProcessor(); + void createWideBandDataProcessor(); + //void createChirpDataProcessor(); + //void createAudioReceiver(int rx); + void createAudioReceiver(); + + bool initReceivers(int rx); + bool start(); + bool startDataEngineWithoutConnection(); + bool findHPSDRDevices(); + bool getFirmwareVersions(); + bool checkFirmwareVersions(); + bool startDiscoverer(QThread::Priority prio); + bool startDataIO(QThread::Priority prio); + bool startDataProcessor(QThread::Priority prio); + void startAudioOutProcessor(QThread::Priority prio); + bool startWideBandDataProcessor(QThread::Priority prio); + bool startChirpDataProcessor(QThread::Priority prio); + + void stopDiscoverer(); + void stopDataIO(); + void stopDataProcessor(); + void stopAudioOutProcessor(); + void stopWideBandDataProcessor(); + void stopChirpDataProcessor(); + void setHPSDRConfig(); + +private: + DataProcessor* m_dataProcessor; + WideBandDataProcessor* m_wbDataProcessor; + QDSPEngine* m_chirpDspEngine; + AudioReceiver* m_audioReceiver; + AudioEngine* m_audioEngine; + AudioOutProcessor* m_audioOutProcessor; + ChirpProcessor* m_chirpProcessor; + Discoverer* m_discoverer; + + QThreadEx* m_discoveryThread; + QThreadEx* m_dataIOThread; + QThreadEx* m_dataProcThread; + QThreadEx* m_wbDataProcThread; + QThreadEx* m_chirpDataProcThread; + QThreadEx* m_AudioRcvrThread; + QThreadEx* m_audioInProcThread; + QThreadEx* m_audioOutProcThread; + + QList m_dspThreadList; + + QMutex m_mutex; + + QString m_message; + QString m_HPSDRDevice; + + QByteArray m_commandDatagram; + QByteArray m_datagram; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QCircularBuffer audioringbuffer; + + TMeterType m_meterType; + + CPX cpxIn; + CPX cpxOut; + + bool m_restart; + bool m_networkDeviceRunning; + bool m_soundFileLoaded; + bool m_clientConnect; + //bool m_audioProcessorRunning; + bool m_chirpInititalized; + bool m_discoveryThreadRunning; + bool m_dataIOThreadRunning; + bool m_wbDataRcvrThreadRunning; + bool m_chirpDataProcThreadRunning; + bool m_dataProcThreadRunning; + bool m_audioRcvrThreadRunning; + bool m_audioInProcThreadRunning; + bool m_audioOutProcThreadRunning; + bool m_frequencyChange; + bool m_hamBandChanged; + bool m_chirpThreadStopped; + bool m_clientConnected; + + float m_mainVolume; + + int m_hpsdrDevices; + int m_fwCount; + int m_configure; + int m_timeout; + int m_txFrame; + int m_bytes; + int m_remainingTime; + int m_found; + int m_RxFrequencyChange; + int m_counter; + + int m_forwardPower; + int m_maxSamples; + int m_offset; + + int m_rxSamples; + int m_chirpSamples; + + int m_leftSample; + int m_rightSample; + int m_micSample; + + int m_spectrumSize; + int m_sendState; + + float m_lsample; + float m_rsample; + float m_scale; + float m_sMeterValue; + float m_sMeterCalibrationOffset; + float m_micSample_float; + float m_spectrumBuffer[SAMPLE_BUFFER_SIZE]; + + qint64 m_audioFileBufferPosition; + qint64 m_audioFileBufferLength; + QByteArray m_audioFileBuffer; + + float getFilterSizeCalibrationOffset(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + //void setCurrentNetworkDevice(TNetworkDevicecard card); + void setHPSDRDeviceNumber(int value); + void rxListChanged(QList rxList); + void searchHpsdrNetworkDevices(); + void setCurrentReceiver(QObject* sender, int rx); + + void setMercuryAttenuators(QObject *sender, QList attn); + void setAlexConfiguration(quint16 conf); + void setAlexStates(HamBand band, const QList &states); + void setPennyOCEnabled(bool value); + void setRxJ6Pins(const QList &list); + void setTxJ6Pins(const QList &list); + + void setAudioFileFormat(QObject *sender, const QAudioFormat &format); + void setAudioFilePosition(QObject *sender, qint64 position); + void setAudioFileBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + + void setAudioFileBuffer(const QList &buffer); + +signals: + void error(QUdpSocket::SocketError error); + void masterSwitchEvent(QObject *sender, bool power); + //void messageEvent(QString message); + void penelopeVersionInfoEvent(QObject *sender, int version); + void hwIOVersionInfoEvent(QObject *sender, int version); + void sendIQEvent(QObject *sender, int sendIQ); + void rcveIQEvent(QObject *sender, int value); + //void iqDataReady(int rx); + void chirpDataReady(int samples); + void audioDataReady(); + void clientConnectedEvent(int rx); + void audioRxEvent(int rx); + void outMultiplierEvent(int value); + void systemMessageEvent(const QString &str, int time); + void clearSystemMessageEvent(); + void DataProcessorReadyEvent(); + void audioSenderReadyEvent(bool value); +}; + + + +// ********************************************************************* +// Data processor class + +class DataProcessor : public QObject { + + Q_OBJECT + +public: + DataProcessor( + DataEngine* de = 0, + QSDR::_ServerMode serverMode = QSDR::NoServerMode, + QSDR::_HWInterfaceMode hwMode = QSDR::NoInterfaceMode); + + ~DataProcessor(); + +public slots: + void stop(); + void processData(); + void processDeviceData(); + void externalDspProcessing(int rx); + void externalDspProcessingBig(int rx); + +private slots: + void initDataProcessorSocket(); + void displayDataProcessorSocketError(QAbstractSocket::SocketError error); + void processInputBuffer(const QByteArray &buffer); + void processOutputBuffer(const CPX &buffer); + void decodeCCBytes(const QByteArray &buffer); + void encodeCCBytes(); + void setOutputBuffer(int rx, const CPX &buffer); + void writeData(); + +private: + DataEngine* de; + Settings* set; + QUdpSocket* m_dataProcessorSocket; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QHostAddress m_deviceAddress; + QMutex m_mutex; + QMutex m_spectrumMutex; + QByteArray m_IQDatagram; + QByteArray m_outDatagram; + QByteArray m_deviceSendDataSignature; + QString m_message; + + QTime m_SyncChangedTime; + QTime m_ADCChangedTime; + + bool m_socketConnected; + bool m_setNetworkDeviceHeader; + bool m_chirpGateBit; + bool m_chirpBit; + bool m_chirpStart; + + int m_leftSample; + int m_rightSample; + int m_micSample; + int m_bytes; + int m_maxSamples; + int m_rxSamples; + int m_chirpSamples; + int m_fwCount; + int m_idx; + int m_sendState; + int m_chirpStartSample; + + float m_lsample; + float m_rsample; + float m_micSample_float; + + unsigned long m_IQSequence; + unsigned long m_sequenceHi; + unsigned short m_offset; + unsigned short m_length; + + long m_sendSequence; + long m_oldSendSequence; + + volatile bool m_stopped; + + uchar m_ibuffer[IO_BUFFER_SIZE * IO_BUFFERS]; +signals: + void messageEvent(QString message); + void connectingEvent(QString addr, quint16 port); + void connectedEvent(QString addr, quint16 port); + void disconnectedEvent(); + void serverVersionEvent(QString version); +}; + + +// ********************************************************************* +// Audio out processor class + +class AudioOutProcessor : public QObject { + + Q_OBJECT + +public: + AudioOutProcessor(DataEngine* de = 0, QSDR::_ServerMode serverMode = QSDR::NoServerMode); + ~AudioOutProcessor(); + +public slots: + void stop(); + void processData(); + void processDeviceData(); + +private slots: + +private: + DataEngine* m_dataEngine; + + QMutex m_mutex; + QByteArray m_IQDatagram; + QString m_message; + + QSDR::_ServerMode m_serverMode; + + /*int m_bytes; + unsigned long m_IQSequence; + unsigned long m_sequenceHi; + unsigned short m_offset; + unsigned short m_length;*/ + volatile bool m_stopped; + +signals: + //void connectingEvent(QString addr, quint16 port); + //void connectedEvent(QString addr, quint16 port); + //void disconnectedEvent(); + //void serverVersionEvent(QString version); + ////void metisVersionEvent(QObject *sender, int version); + //void newData(); + //void newIQData(int rx); + //void newAudioDataEvent(float *lBuf, float *rBuf); +}; + +// ********************************************************************* +// Wide band data processor class + +class WideBandDataProcessor : public QObject { + + Q_OBJECT + +public: + WideBandDataProcessor(THPSDRParameter *ioData = 0, QSDR::_ServerMode serverMode = QSDR::NoServerMode, int size = 0); + ~WideBandDataProcessor(); + +public slots: + void stop(); + void processWideBandData(); + void setWbSpectrumAveraging(QObject* sender, int rx, bool value); + +private slots: + //void initDataProcessorSocket(); + //void displayDataProcessorSocketError(QAbstractSocket::SocketError error); + void processWideBandInputBuffer(const QByteArray &buffer); + +private: + THPSDRParameter* io; + Settings* set; + + QFFT* wbFFT; + DualModeAverager* wbAverager; + + CPX cpxWBIn; + CPX cpxWBOut; + + QMutex m_mutex; + QByteArray m_WBDatagram; + QString m_message; + + QSDR::_ServerMode m_serverMode; + + int m_size; + int m_bytes; + + bool m_wbSpectrumAveraging; + volatile bool m_stopped; + + unsigned char m_ibuffer[IO_BUFFER_SIZE * IO_BUFFERS]; + +signals: + void messageEvent(QString message); + void wbSpectrumBufferChanged(const qVectorFloat &buffer); +}; + + +#endif // _CUSDR_DATA_ENGINE_H diff --git a/Source/src/DataEngine/cusdr_dataIO.cpp b/Source/src/DataEngine/cusdr_dataIO.cpp new file mode 100644 index 0000000..acdfa80 --- /dev/null +++ b/Source/src/DataEngine/cusdr_dataIO.cpp @@ -0,0 +1,661 @@ +/** +* @file cusdr_dataIO.cpp +* @brief Data IO class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-10-01 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_DATAIO + +#include "cusdr_dataIO.h" +#include "soundout.h" + +#if defined(Q_OS_WIN32) +#include +#endif +#include +using namespace std; + + +DataIO::DataIO(THPSDRParameter *ioData) + : QObject() + , set(Settings::instance()) + , io(ioData) + , m_dataIOSocketOn(false) + , m_setNetworkDeviceHeader(true) + , m_sequence(0) + , m_oldSequence(-1) + , m_sequenceWideBand(0) + , m_oldSequenceWideBand(-1) + , m_wbBuffers(set->getWidebandBuffers() - 1) + , m_wbCount(0) + , m_socketBufferSize(set->getSocketBufferSize()) + , m_sendEP4(false) + , m_manualBufferSize(set->getManualSocketBufferSize()) + , m_packetsToggle(true) + , m_firstFrame(true) + , m_stopped(false) +{ + m_dataIOSocket = 0; + + m_metisGetDataSignature.resize(3); + m_metisGetDataSignature[0] = (char)0xEF; + m_metisGetDataSignature[1] = (char)0xFE; + m_metisGetDataSignature[2] = (char)0x01; + //m_metisGetDataSignature[3] = (char)0x06; + + m_datagram.resize(1032); + m_wbDatagram.resize(0); + m_twoFramesDatagram.resize(0); + + m_sendSequence = 0L; + m_oldSendSequence = 0L; + + m_deviceSendDataSignature.resize(4); + m_deviceSendDataSignature[0] = (char)0xEF; + m_deviceSendDataSignature[1] = (char)0xFE; + m_deviceSendDataSignature[2] = (char)0x01; + m_deviceSendDataSignature[3] = (char)0x02; + + m_packetLossTime.start(); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(setSampleRate(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(manualSocketBufferChanged(QObject*, bool)), + this, + SLOT(setManualSocketBufferSize(QObject*, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(socketBufferSizeChanged(QObject*, int)), + this, + SLOT(setSocketBufferSize(QObject*, int))); + + m_message = "m_sendSequence = %1, bytes sent: %2"; + + m_pSoundCardOut = new CSoundOut(this); + //RRK pass -1 to get the systems "default" audio device + m_pSoundCardOut->Start(-1, true, 48000, false); + m_pSoundCardOut->SetVolume(80); +} + +DataIO::~DataIO() { + + if (m_dataIOSocketOn) { + m_dataIOSocket->close(); + delete m_dataIOSocket; + m_dataIOSocket = 0; + } +} + +void DataIO::stop() { + + io->networkIOMutex.lock(); + m_stopped = true; + io->networkIOMutex.unlock(); + + if(m_pSoundCardOut) { + m_pSoundCardOut->Stop(); + delete m_pSoundCardOut; + } +} + +void DataIO::initDataReceiverSocket() { + + m_dataIOSocket = new QUdpSocket(); + + int newBufferSize; + + if (m_manualBufferSize) { + + newBufferSize = m_socketBufferSize * 1024;//m_socketBufferSize * 1032; + io->networkIOMutex.lock(); + DATAIO_DEBUG << "initDataReceiverSocket socket buffer size set to " << m_socketBufferSize << " kB."; + io->networkIOMutex.unlock(); + } + else { + + if (io->samplerate == 384000) { + + newBufferSize = 128*1024;//128 * 1032; + io->networkIOMutex.lock(); + DATAIO_DEBUG << "socket buffer size set to 128 kB."; + io->networkIOMutex.unlock(); + } + else if (io->samplerate == 192000) { + + newBufferSize = 64*1024;//64 * 1032; + io->networkIOMutex.lock(); + DATAIO_DEBUG << "socket buffer size set to 64 kB."; + io->networkIOMutex.unlock(); + } + else if (io->samplerate == 96000) { + + newBufferSize = 32*1024;//32 * 1032; + io->networkIOMutex.lock(); + DATAIO_DEBUG << "socket buffer size set to 32 kB."; + io->networkIOMutex.unlock(); + } + else if (io->samplerate == 48000) { + + newBufferSize = 16*1024;//16 * 1032; + io->networkIOMutex.lock(); + DATAIO_DEBUG << "socket buffer size set to 16 kB."; + io->networkIOMutex.unlock(); + } + } + + if (m_dataIOSocket->bind(QHostAddress(set->getHPSDRDeviceLocalAddr()), + set->getMetisPort(), + QUdpSocket::DontShareAddress)) + //QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress)) + { + +#if defined(Q_OS_WIN32) + if (::setsockopt(m_dataIOSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&newBufferSize, sizeof(newBufferSize)) == -1) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "dataIOSocket error!"; + io->networkIOMutex.unlock(); + } +#endif + + + //m_dataIOSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + //m_dataIOSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); + + CHECKED_CONNECT( + m_dataIOSocket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDataReceiverSocketError(QAbstractSocket::SocketError))); + + /*CHECKED_CONNECT_OPT( + m_dataIOSocket, + SIGNAL(readyRead()), + this, + SLOT(readDeviceData()), + Qt::DirectConnection);*/ + + CHECKED_CONNECT( + m_dataIOSocket, + SIGNAL(readyRead()), + this, + SLOT(readDeviceData())); + + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "data receiver socket bound successful to local port " << m_dataIOSocket->localPort(); + io->networkIOMutex.unlock(); + + m_dataIOSocketOn = true; + set->setPacketLoss(1); + } + else { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "data receiver socket binding failed."; + io->networkIOMutex.unlock(); + + m_dataIOSocketOn = false; + } +} + +void DataIO::readDeviceData() { + + while (m_dataIOSocket->hasPendingDatagrams()) { + + QMutexLocker locker(&io->networkIOMutex); + if (m_dataIOSocket->readDatagram(m_datagram.data(), m_datagram.size()) == METIS_DATA_SIZE) { + + if (m_datagram.left(3) == m_metisGetDataSignature) { + + if (m_datagram[3] == (char)0x06) { + + m_sequence = (m_datagram[4] & 0xFF) << 24; + m_sequence += (m_datagram[5] & 0xFF) << 16; + m_sequence += (m_datagram[6] & 0xFF) << 8; + m_sequence += (m_datagram[7] & 0xFF); + + if (m_sequence != m_oldSequence + 1) { + + //DATAIO_DEBUG << "readData missed " << m_sequence - m_oldSequence << " packages."; + //RRK cout << "readData missed " << m_sequence - m_oldSequence << " packages." << endl; + + if (m_packetLossTime.elapsed() > 100) { + + set->setPacketLoss(2); + m_packetLossTime.restart(); + } + } + + m_oldSequence = m_sequence; + + //// enqueue first half of the HPSDR frame from the HPSDR device + //io->iq_queue.enqueue(m_datagram.mid(METIS_HEADER_SIZE, BUFFER_SIZE/2)); + //// enqueue second half of the HPSDR frame from the HPSDR device + //io->iq_queue.enqueue(m_datagram.right(BUFFER_SIZE/2)); + + // enqueue one frame from the HPSDR device + if (!io->iq_queue.isFull()) { + io->iq_queue.enqueue(m_datagram.mid(METIS_HEADER_SIZE, BUFFER_SIZE)); + } + + // collect two HPSDR frames + //if (m_firstFrame) { + + // m_twoFramesDatagram += m_datagram.mid(METIS_HEADER_SIZE, BUFFER_SIZE); + // m_firstFrame = false; + //} + //else { + + // m_twoFramesDatagram += m_datagram.mid(METIS_HEADER_SIZE, BUFFER_SIZE); + + // //enqueue the two frames + // io->iq_queue.enqueue(m_twoFramesDatagram); + // m_firstFrame = true; + + // m_twoFramesDatagram.resize(0); + //} + } + else if (m_datagram[3] == (char)0x04) { // wide band data + + //qDebug() << "wideband data received!"; + m_sequenceWideBand = (m_datagram[4] & 0xFF) << 24; + m_sequenceWideBand += (m_datagram[5] & 0xFF) << 16; + m_sequenceWideBand += (m_datagram[6] & 0xFF) << 8; + m_sequenceWideBand += (m_datagram[7] & 0xFF); + + if (m_sequenceWideBand != m_oldSequenceWideBand + 1) { + + DATAIO_DEBUG << "wideband readData missed " << m_sequenceWideBand - m_oldSequenceWideBand << " packages."; + + if (m_packetLossTime.elapsed() > 100) { + + set->setPacketLoss(2); + m_packetLossTime.restart(); + } + } + + m_oldSequenceWideBand = m_sequenceWideBand; + + // three 'if's from KISS Konsole + if ((m_wbBuffers & m_datagram[7]) == 0) + { + m_sendEP4 = true; + m_wbCount = 0; + } + + if (m_sendEP4) + { + m_wbDatagram.append(m_datagram.mid(METIS_HEADER_SIZE, BUFFER_SIZE)); + } + + if (m_wbCount++ == m_wbBuffers) + { + // enqueue + m_sendEP4 = false; + io->wb_queue.enqueue(m_wbDatagram); + m_wbDatagram.resize(0); + } + } + } + //DATA_RECEIVER_DEBUG << "got wrong HPSDR device signature!"; + } + //DATA_RECEIVER_DEBUG << "got wrong HPSDR device data size!"; + } + //DATA_RECEIVER_DEBUG << "no more pending datagrams."; +} + +void DataIO::readData() { + + qint64 length = io->inputBuffer.length(); + + //int buffers = qRound(length/(2*BUFFER_SIZE)); + int buffers = qRound((float) length/128); + + DATAIO_DEBUG << "input buffer length " << length << " buffers " << buffers; + + while (!m_stopped) { + + for (int i = 0; i < buffers; i++) { + + //io->data_queue.enqueue(io->inputBuffer.mid(i*2*BUFFER_SIZE, 2*BUFFER_SIZE)); + io->data_queue.enqueue(io->inputBuffer.mid(i*128, 128)); + if (m_stopped) break; + } + } + m_stopped = false; +} + +void DataIO::sendInitFramesToNetworkDevice(int rx) { + + QByteArray initDatagram; + initDatagram.resize(1032); + + initDatagram[0] = (char)0xEF; + initDatagram[1] = (char)0xFE; + initDatagram[2] = (char)0x01; + initDatagram[3] = (char)0x02; + initDatagram[4] = (char)0x00; + initDatagram[5] = (char)0x00; + initDatagram[6] = (char)0x00; + initDatagram[7] = (char)0x00; + + initDatagram[8] = SYNC; + initDatagram[9] = SYNC; + initDatagram[10] = SYNC; + + for (int i = 0; i < 5; i++) { + + initDatagram[i + 11] = io->control_out[i]; + } + + for (int i = 16; i < 520; i++) { + + initDatagram[i] = 0x00; + } + + initDatagram[520] = SYNC; + initDatagram[521] = SYNC; + initDatagram[522] = SYNC; + + initDatagram[523] = io->control_out[0] | ((rx + 2) << 1); + initDatagram[524] = set->getCtrFrequencies().at(rx) >> 24; + initDatagram[525] = set->getCtrFrequencies().at(rx) >> 16; + initDatagram[526] = set->getCtrFrequencies().at(rx) >> 8; + initDatagram[527] = set->getCtrFrequencies().at(rx) ; + + + for (int i = 528; i < 1032; i++) initDatagram[i] = 0x00; + +// for (int i = 0; i < 5; i++) { +// +// if (m_dataIOSocket->writeDatagram(initDatagram.data(), initDatagram.size(), io->hpsdrDeviceIPAddress, DEVICE_PORT) < 0) { +// +// io->networkIOMutex.lock(); +// DATAIO_DEBUG << "error sending init data to device: " << qPrintable(m_dataIOSocket->errorString()); +// io->networkIOMutex.unlock(); +// } +// else { +// +// if (i == 0) { +// +// io->networkIOMutex.lock(); +// DATAIO_DEBUG << "init frames sent to network device."; +// io->networkIOMutex.unlock(); +// } +// } +// } + + if (m_dataIOSocket->writeDatagram(initDatagram.data(), initDatagram.size(), io->hpsdrDeviceIPAddress, DEVICE_PORT) < 0) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "error sending init data to device: " << qPrintable(m_dataIOSocket->errorString()); + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "init frames sent to network device."; + io->networkIOMutex.unlock(); + } + + SleeperThread::msleep(20); + + if (m_dataIOSocket->writeDatagram(initDatagram.data(), initDatagram.size(), io->hpsdrDeviceIPAddress, DEVICE_PORT) < 0) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "error sending init data to device: " << qPrintable(m_dataIOSocket->errorString()); + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "init frames sent to network device."; + io->networkIOMutex.unlock(); + } +} + +void DataIO::networkDeviceStartStop(char value) { + + TNetworkDevicecard metis = set->getCurrentMetisCard(); + //QUdpSocket socket; + +// if (socket.bind(QHostAddress(set->getHPSDRDeviceLocalAddr()), +// set->getMetisPort(), +// //QUdpSocket::DefaultForPlatform)) +// QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress)) +// { + //DATAIO_DEBUG << "device start/stop: socket bound successful to local port " << set->getMetisPort(); + + m_commandDatagram.resize(64); + m_commandDatagram[0] = (char)0xEF; + m_commandDatagram[1] = (char)0xFE; + m_commandDatagram[2] = (char)0x04; + m_commandDatagram[3] = (char)value; + + for (int i = 4; i < 64; i++) m_commandDatagram[i] = 0x00; + + if (m_dataIOSocket->writeDatagram(m_commandDatagram, metis.ip_address, DEVICE_PORT) == 64) { + + //if (value == 1) { + if (value != 0) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "sent start command to device at: "<< qPrintable(metis.ip_address.toString()); + io->networkIOMutex.unlock(); + m_networkDeviceRunning = true; + } + else { + + //DATA_ENGINE_DEBUG << "sent stop command to Metis at"<< m_metisCards[0].ip_address.toString(); + io->networkIOMutex.lock(); + DATAIO_DEBUG << "sent stop command to device at: "<< qPrintable(metis.ip_address.toString()); + io->networkIOMutex.unlock(); + m_networkDeviceRunning = false; + } + } + else + DATAIO_DEBUG << "device start/stop: sending command to device failed."; + + //socket.close(); +// } +// else { +// +// DATAIO_DEBUG << "device start/stop: socket binding failed."; +// } + +// socket.close(); +// DATAIO_DEBUG << "device start/stop: socket closed."; +} + +void DataIO::sendAudio(u_char *buf) { + //RRK send audio bytes here + static TYPECPX cbuf[252]; + int i, j; + short sample; + + for(i = 8, j = 0; i < 512; i += 8, j++) { + //bytes are L,R,I,Q skip the I,Q + sample = buf[i] << 8 | buf[i+1]; //left + cbuf[j].re = (double)sample; + sample = buf[i+2] << 8 | buf[i+3]; //right + cbuf[j].im = (double)sample; + } + + if(m_pSoundCardOut) + m_pSoundCardOut->PutOutQueue(63, cbuf); +} + +void DataIO::writeData() { + + if (m_setNetworkDeviceHeader) { + + m_outDatagram.resize(0); + m_outDatagram += m_deviceSendDataSignature; + + QByteArray seq(reinterpret_cast(&m_sendSequence), sizeof(m_sendSequence)); + + m_outDatagram += seq; + m_outDatagram += io->audioDatagram; + + m_sendSequence++; + m_setNetworkDeviceHeader = false; + } + else { + + m_outDatagram += io->audioDatagram; + + if (m_dataIOSocket->writeDatagram(m_outDatagram, set->getCurrentMetisCard().ip_address, DEVICE_PORT) < 0) { + DATAIO_DEBUG << "error sending data to device: " << m_dataIOSocket->errorString(); + } + + //if (m_sendSequence%100 == 0) + // DATAIO_DEBUG << m_sendSequence; + + if (m_sendSequence != m_oldSendSequence + 1) { + DATAIO_DEBUG << "output sequence error: old = " << m_oldSendSequence << "; new =" << m_sendSequence; + } + + m_oldSendSequence = m_sendSequence; + m_setNetworkDeviceHeader = true; + } +} + +void DataIO::displayDataReceiverSocketError(QAbstractSocket::SocketError error) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "data IO socket error: " << error; + io->networkIOMutex.unlock(); +} + +void DataIO::setManualSocketBufferSize(QObject *sender, bool value) { + + Q_UNUSED (sender) + + m_manualBufferSize = value; + DATAIO_DEBUG << "m_manualBufferSize to change = " << m_manualBufferSize; + int socketBufferSize = 1032 * set->getSocketBufferSize(); + + io->networkIOMutex.lock(); + + if (m_manualBufferSize) { + + DATAIO_DEBUG << "set data IO socket BufferSize to " << m_socketBufferSize; +#if defined(Q_OS_WIN32) + if (::setsockopt(m_dataIOSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&socketBufferSize, sizeof(socketBufferSize)) == -1) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "dataIOSocket error!"; + io->networkIOMutex.unlock(); + } +#endif + } + else { + + DATAIO_DEBUG << "set data IO socket BufferSize to 32 kB."; + socketBufferSize = 1032 * 32; +#if defined(Q_OS_WIN32) + if (::setsockopt(m_dataIOSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&socketBufferSize, sizeof(socketBufferSize)) == -1) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "dataIOSocket error!"; + io->networkIOMutex.unlock(); + } +#endif + } + io->networkIOMutex.unlock(); +} + +void DataIO::setSocketBufferSize(QObject *sender, int value) { + + Q_UNUSED (sender) + + int socketBufferSize = value * 1024; + DATAIO_DEBUG << "m_socketBufferSize = " << value; + + io->networkIOMutex.lock(); +#if defined(Q_OS_WIN32) + if (::setsockopt(m_dataIOSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&socketBufferSize, sizeof(socketBufferSize)) == -1) { + + io->networkIOMutex.lock(); + DATAIO_DEBUG << "dataIOSocket error!"; + io->networkIOMutex.unlock(); + } +#endif + io->networkIOMutex.unlock(); +} + +void DataIO::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + int bufferSize; + io->networkIOMutex.lock(); + switch (value) { + + case 48000: + bufferSize = 16*1024;//128 * 1032 + DATAIO_DEBUG << "socket buffer size set to 16 kB."; + break; + + case 96000: + bufferSize = 32*1024;//128 * 1032 + DATAIO_DEBUG << "socket buffer size set to 32 kB."; + break; + + case 192000: + bufferSize = 64*1024;//128 * 1032 + DATAIO_DEBUG << "socket buffer size set to 64 kB."; + break; + + case 384000: + bufferSize = 128*1024;//128 * 1032 + DATAIO_DEBUG << "socket buffer size set to 128 kB."; + break; + + default: + DATAIO_DEBUG << "invalid sample rate !\n"; + break; + } + +#if defined(Q_OS_WIN32) + if (::setsockopt(m_dataIOSocket->socketDescriptor(), SOL_SOCKET, + SO_RCVBUF, (char *)&bufferSize, sizeof(bufferSize)) == -1) { + + DATAIO_DEBUG << "dataIOSocket error!"; + } +#endif + + io->networkIOMutex.unlock(); +} diff --git a/Source/src/DataEngine/cusdr_dataIO.h b/Source/src/DataEngine/cusdr_dataIO.h new file mode 100644 index 0000000..fe1a14d --- /dev/null +++ b/Source/src/DataEngine/cusdr_dataIO.h @@ -0,0 +1,120 @@ +/** +* @file cusdr_dataIO.h +* @brief Data IO header file +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-10-01 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_DATAIO_H +#define _CUSDR_DATAIO_H + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_settings.h" +#include "soundout.h" + +#ifdef LOG_DATAIO +# define DATAIO_DEBUG qDebug().nospace() << "DataIO::\t" +#else +# define DATAIO_DEBUG nullDebug() +#endif + + +class DataIO : public QObject { + + Q_OBJECT + +public: + DataIO(THPSDRParameter *ioData = 0); + ~DataIO(); + +public slots: + void stop(); + void initDataReceiverSocket(); + void readData(); + void writeData(); + void sendAudio(u_char *buf); + void sendInitFramesToNetworkDevice(int rx); + void networkDeviceStartStop(char value); + //void setWidebandBuffers(int value); + +private slots: + void setSampleRate(QObject *sender, int value); + void displayDataReceiverSocketError(QAbstractSocket::SocketError error); + void setManualSocketBufferSize(QObject *sender, bool value); + void setSocketBufferSize(QObject *sender, int value); + void readDeviceData(); + +private: + Settings* set; + QUdpSocket* m_dataIOSocket; + //QMutex m_mutex; + QByteArray m_commandDatagram; + QByteArray m_datagram; + QByteArray m_wbDatagram; + QByteArray m_twoFramesDatagram; + QByteArray m_metisGetDataSignature; + QByteArray m_outDatagram; + QByteArray m_deviceSendDataSignature; + QString m_message; + + QTime m_packetLossTime; + + THPSDRParameter* io; + //TNetworkDevicecard netDevice; + + bool m_dataIOSocketOn; + bool m_networkDeviceRunning; + bool m_setNetworkDeviceHeader; + + long m_sequence; + long m_oldSequence; + long m_sequenceWideBand; + long m_oldSequenceWideBand; + long m_sendSequence; + long m_oldSendSequence; + + + int m_wbBuffers; + int m_wbCount; + int m_socketBufferSize; + + bool m_sendEP4; + bool m_manualBufferSize; + bool m_packetsToggle; + bool m_firstFrame; + + volatile bool m_stopped; + CSoundOut* m_pSoundCardOut; + +signals: + void messageEvent(QString message); +}; + +#endif // _CUSDR_DATAIO_H diff --git a/Source/src/DataEngine/cusdr_discoverer.cpp b/Source/src/DataEngine/cusdr_discoverer.cpp new file mode 100644 index 0000000..3177281 --- /dev/null +++ b/Source/src/DataEngine/cusdr_discoverer.cpp @@ -0,0 +1,271 @@ +/** +* @file cusdr_discoverer.cpp +* @brief HPSDR device discoverer class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-19 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_DISCOVERER + +#include "cusdr_discoverer.h" +#include "Util/cusdr_buttons.h" + + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + + + +//#define btn_height 18 +//#define btn_width 74 + +Discoverer::Discoverer(THPSDRParameter *ioData) + : QObject() + , set(Settings::instance()) + , io(ioData) +{ + m_deviceCards = set->getMetisCardsList(); +} + +Discoverer::~Discoverer() { +} + +void Discoverer::initHPSDRDevice() { + + m_searchTime.start(); + + int deviceNo = 0; + while (deviceNo == 0) { + + deviceNo = findHPSDRDevices(); + + if (deviceNo > 1) { + + set->setHPSDRDeviceNumber(deviceNo); + break; + } + + if (deviceNo > 0) { + + set->setHPSDRDeviceNumber(deviceNo); + break; + } + + if (m_searchTime.elapsed() > 1000) { + + set->setHPSDRDeviceNumber(0); + break; + } + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "no device found - trying again..."; + io->networkIOMutex.unlock(); + } + + io->networkIOMutex.lock(); + io->devicefound.wakeAll(); + io->networkIOMutex.unlock(); +} + +int Discoverer::findHPSDRDevices() { + + int devicesFound = 0; + + m_findDatagram.resize(63); + m_findDatagram[0] = (char)0xEF; + m_findDatagram[1] = (char)0xFE; + m_findDatagram[2] = (char)0x02; + for (int i = 3; i < 63; i++) + m_findDatagram[i] = (char)0x00; + + QUdpSocket socket; + + CHECKED_CONNECT( + &socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError))); + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "using " << qPrintable(QHostAddress(set->getHPSDRDeviceLocalAddr()).toString()) << " for discovery."; + io->networkIOMutex.unlock(); + + // clear comboBox entries in the network dialogue + set->clearNetworkIOComboBoxEntry(); + +#if defined(Q_OS_WIN32) + + if (socket.bind( + QHostAddress(set->getHPSDRDeviceLocalAddr()), 0, + QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress)) + //QUdpSocket::ReuseAddressHint)) + { + set->setMetisPort(this, socket.localPort()); + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort(); + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bind failed."; + io->networkIOMutex.unlock(); + + socket.close(); + return 0; + } +#elif defined(Q_OS_LINUX) + + if (socket.bind( + QHostAddress(set->getHPSDRDeviceLocalAddr()), + QUdpSocket::DefaultForPlatform)) + { + CHECKED_CONNECT( + &socket, + SIGNAL(error(QAbstractSocket::SocketError)), + this, + SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError))); + + set->setMetisPort(this, socket.localPort()); + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort(); + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery_socket bind failed."; + io->networkIOMutex.unlock(); + + socket.close(); + return 0; + } +#endif + + if (socket.writeDatagram(m_findDatagram, QHostAddress::Broadcast, DEVICE_PORT) == 63) { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery data sent."; + io->networkIOMutex.unlock(); + } + else { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery data not sent."; + io->networkIOMutex.unlock(); + } + + + // wait a little + //SleeperThread::msleep(30); + SleeperThread::msleep(500); + + while (socket.hasPendingDatagrams()) { + + TNetworkDevicecard mc; + quint16 port; + + m_deviceDatagram.resize(socket.pendingDatagramSize()); + socket.readDatagram(m_deviceDatagram.data(), m_deviceDatagram.size(), &mc.ip_address, &port); + + if (m_deviceDatagram[0] == (char)0xEF && m_deviceDatagram[1] == (char)0xFE) { + + if (m_deviceDatagram[2] == (char)0x02) { + + sprintf(mc.mac_address, "%02X:%02X:%02X:%02X:%02X:%02X", + m_deviceDatagram[3] & 0xFF, m_deviceDatagram[4] & 0xFF, m_deviceDatagram[5] & 0xFF, + m_deviceDatagram[6] & 0xFF, m_deviceDatagram[7] & 0xFF, m_deviceDatagram[8] & 0xFF); + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device found at " << qPrintable(mc.ip_address.toString()) << ":" << port << "; Mac addr: [" << mc.mac_address << "]"; + DISCOVERER_DEBUG << "Device code version: " << qPrintable(QString::number(m_deviceDatagram.at(9), 16)); + io->networkIOMutex.unlock(); + + int no = m_deviceDatagram.at(10); + QString str; + if (no == 0) + str = "Metis"; + else if (no == 1) + str = "Hermes"; + else if (no == 2) + str = "Griffin"; + else if (no == 4) + str = "Angelia"; + + mc.boardID = no; + mc.boardName = str; + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device board ID: " << no; + DISCOVERER_DEBUG << "Device is: " << qPrintable(str); + io->networkIOMutex.unlock(); + + m_deviceCards.append(mc); + + str += " ("; + str += mc.ip_address.toString(); + str += ")"; + + set->addNetworkIOComboBoxEntry(str); + devicesFound++; + } + else if (m_deviceDatagram[2] == (char)0x03) { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device already sending data!"; + io->networkIOMutex.unlock(); + } + } + + } + set->setMetisCardList(m_deviceCards); + + if (devicesFound == 1) { + + set->setCurrentHPSDRDevice(m_deviceCards.at(0)); + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "Device selected: " << qPrintable(m_deviceCards.at(0).ip_address.toString()); + io->networkIOMutex.unlock(); + } + + socket.close(); + return devicesFound; +} + +void Discoverer::displayDiscoverySocketError(QAbstractSocket::SocketError error) { + + io->networkIOMutex.lock(); + DISCOVERER_DEBUG << "discovery socket error: " << error; + io->networkIOMutex.unlock(); +} + +void Discoverer::clear() { + + //m_metisDeviceComboBox->clear(); + m_deviceCards.clear(); +} diff --git a/Source/src/DataEngine/cusdr_discoverer.h b/Source/src/DataEngine/cusdr_discoverer.h new file mode 100644 index 0000000..60d1484 --- /dev/null +++ b/Source/src/DataEngine/cusdr_discoverer.h @@ -0,0 +1,86 @@ +/** +* @file cusdr_discoverer.h +* @brief HPSDR device discoverer header file +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-19 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_DISCOVERER_H +#define _CUSDR_DISCOVERER_H + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_settings.h" + +#ifdef LOG_DISCOVERER +# define DISCOVERER_DEBUG qDebug().nospace() << "Discoverer::\t" +#else +# define DISCOVERER_DEBUG nullDebug() +#endif + + +class Discoverer : public QObject { + + Q_OBJECT + +public: + Discoverer(THPSDRParameter *ioData = 0); + ~Discoverer(); + + int findHPSDRDevices(); + void clear(); + +public slots: + void initHPSDRDevice(); + + +private slots: + void displayDiscoverySocketError(QAbstractSocket::SocketError error); + +private: + Settings* set; + THPSDRParameter* io; + QTime m_searchTime; + + QByteArray m_findDatagram; + QByteArray m_deviceDatagram; + + //QString m_deviceStr; + + TNetworkDevicecard m_deviceCard; + QList m_deviceCards; + +signals: + +}; + +#endif // _CUSDR_DISCOVERER_H diff --git a/Source/src/DataEngine/cusdr_receiver.cpp b/Source/src/DataEngine/cusdr_receiver.cpp new file mode 100644 index 0000000..556019d --- /dev/null +++ b/Source/src/DataEngine/cusdr_receiver.cpp @@ -0,0 +1,772 @@ +/** +* @file cusdr_receiver.cpp +* @brief cuSDR receiver class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-12 +*/ + +/* Copyright (C) +* +* 2010 - Hermann von Hasseln, DL3HVH +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +*/ +#define LOG_RECEIVER + +// use: RECEIVER_DEBUG + +#include "cusdr_receiver.h" + +Receiver::Receiver(int rx) + : QObject() + , set(Settings::instance()) + , m_filterMode(set->getCurrentFilterMode()) + , m_stopped(false) + , m_receiver(rx) + , m_samplerate(set->getSampleRate()) + , m_audioMode(1) + //, m_calOffset(63.0) + //, m_calOffset(33.0) +{ + setReceiverData(set->getReceiverDataList().at(m_receiver)); + + InitCPX(inBuf, BUFFER_SIZE, 0.0f); + InitCPX(outBuf, BUFFER_SIZE, 0.0f); + + newSpectrum.resize(BUFFER_SIZE*4); + + qtdsp = 0; + + setupConnections(); + + highResTimer = new HResTimer(); + m_displayTime = (int)(1000000.0/set->getFramesPerSecond(m_receiver)); + + m_smeterTime.start(); +} + +Receiver::~Receiver() { + + inBuf.clear(); + outBuf.clear(); + + if (qtdsp) { + + delete qtdsp; + qtdsp = 0; + } + + if (highResTimer) { + delete highResTimer; + } + + m_stopped = false; +} + +void Receiver::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(setSystemState( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(mainVolumeChanged(QObject *, int, float)), + this, + SLOT(setAudioVolume(QObject *, int, float))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(setSampleRate(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(dspModeChanged(QObject *, int, DSPMode)), + this, + SLOT(setDspMode(QObject *, int, DSPMode))); + + CHECKED_CONNECT( + set, + SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), + this, + SLOT(setHamBand(QObject *, int, bool, HamBand))); + + CHECKED_CONNECT( + set, + SIGNAL(agcModeChanged(QObject *, int, AGCMode, bool)), + this, + SLOT(setAGCMode(QObject *, int, AGCMode, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(agcGainChanged(QObject *, int, int)), + this, + SLOT(setAGCGain(QObject *, int, int))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(agcMaximumGain_dBmChanged(QObject *, int, int)), +// this, +// SLOT(setAGCMaximumGain_dBm(QObject *, int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(agcMaximumGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCMaximumGain_dB(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcFixedGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCFixedGain_dB(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcThresholdChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCThreshold_dB(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcHangThresholdChanged(QObject *, int, int)), + this, + SLOT(setAGCHangThreshold(QObject *, int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(agcHangLevelChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCHangLevel_dB(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcVariableGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCVariableGain_dB(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcAttackTimeChanged(QObject *, int, qreal)), + this, + SLOT(setAGCAttackTime(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcDecayTimeChanged(QObject *, int, qreal)), + this, + SLOT(setAGCDecayTime(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcHangTimeChanged(QObject *, int, qreal)), + this, + SLOT(setAGCHangTime(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(filterFrequenciesChanged(QObject *, int, qreal, qreal)), + this, + SLOT(setFilterFrequencies(QObject *, int, qreal, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(framesPerSecondChanged(QObject*, int, int)), + this, + SLOT(setFramesPerSecond(QObject*, int, int))); + + /*CHECKED_CONNECT( + set, + SIGNAL(receiverDataReady()), + this, + SLOT(dspProcessing()));*/ +} + +void Receiver::setReceiverData(TReceiver data) { + + m_receiverData = data; + + //m_serverMode = m_receiverData.serverMode; + m_dspCore = m_receiverData.dspCore; + m_sampleRate = m_receiverData.sampleRate; + m_hamBand = m_receiverData.hamBand; + m_dspMode = m_receiverData.dspMode; + m_dspModeList = m_receiverData.dspModeList; + m_agcMode = m_receiverData.agcMode; + m_agcGain = m_receiverData.acgGain; + m_agcFixedGain_dB = m_receiverData.agcFixedGain_dB; + m_agcMaximumGain_dB = m_receiverData.agcMaximumGain_dB; + m_agcHangThreshold = m_receiverData.agcHangThreshold; + m_agcVariableGain = m_receiverData.agcVariableGain; + + m_audioVolume = m_receiverData.audioVolume; + + m_filterLo = m_receiverData.filterLo; + m_filterHi = m_receiverData.filterHi; + + m_lastCtrFrequencyList = m_receiverData.lastCenterFrequencyList; + m_lastVfoFrequencyList = m_receiverData.lastVfoFrequencyList; + m_mercuryAttenuators = m_receiverData.mercuryAttenuators; +} + +bool Receiver::initDSPInterface() { + if (m_dspCore == QSDR::QtDSP) { + + if (!initQtDSPInterface()) return false; + } + return true; +} + +bool Receiver::initQtDSPInterface() { + + qtdsp = new QDSPEngine(this, m_receiver, BUFFER_SIZE); + + if (qtdsp) + qtdsp->setQtDSPStatus(true); + else { + + RECEIVER_DEBUG << "could not start QtDSP for receiver: " << m_receiver; + qtdsp = 0; + return false; + } + + qtdsp->setVolume(m_audioVolume); + + DSPMode mode = m_dspModeList.at(m_hamBand); + RECEIVER_DEBUG << "set DSP mode to: " << set->getDSPModeString(mode); + + qtdsp->setDSPMode(mode); + qtdsp->filter->setFilter( + getFilterFromDSPMode(set->getDefaultFilterList(), mode).filterLo, + getFilterFromDSPMode(set->getDefaultFilterList(), mode).filterHi); + qtdsp->wpagc->setMode(m_agcMode); + qtdsp->wpagc->setAGCFixedGainDb(m_agcFixedGain_dB); + qtdsp->wpagc->setMaximumGainDb(m_agcMaximumGain_dB); + +// if (m_agcMode == (AGCMode) agcOFF) +// set->setAGCFixedGain_dB(this, m_receiver, m_agcFixedGain_dB); +// else +// set->setAGCMaximumGain_dB(this, m_receiver, m_agcMaximumGain_dB); + + RECEIVER_DEBUG << "QtDSP for receiver: " << m_receiver << " started."; + return true; +} + +void Receiver::deleteDSPInterface() { + + if (m_dspCore == QSDR::QtDSP) + deleteQtDSP(); +} + +void Receiver::deleteQtDSP() { + + if (qtdsp) { + + delete qtdsp; + qtdsp = 0; + } +} + +void Receiver::enqueueData() { + + inQueue.enqueue(inBuf); + + if (inQueue.isFull()) { + RECEIVER_DEBUG << "inQueue full!"; + } + +} + +void Receiver::stop() { + + m_mutex.lock(); + m_stopped = true; + m_mutex.unlock(); +} + +void Receiver::dspProcessing() { + + //RECEIVER_DEBUG << "dspProcessing: " << this->thread(); + + //io.mutex.lock(); + qtdsp->processDSP(inBuf, outBuf, BUFFER_SIZE); + //io.mutex.unlock(); + + // spectrum + qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator()); + if (highResTimer->getElapsedTimeInMicroSec() >= getDisplayDelay()) { + + emit spectrumBufferChanged(m_receiver, newSpectrum); + highResTimer->start(); + } + + if (m_receiver == set->getCurrentReceiver()) { + // S-Meter + if (m_smeterTime.elapsed() > 20) { + + m_sMeterValue = qtdsp->getSMeterInstValue(); + emit sMeterValueChanged(m_receiver, m_sMeterValue); + m_smeterTime.restart(); + } + + // process output data + emit outputBufferSignal(m_receiver, outBuf); + } +} + +void Receiver::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (m_samplerate == value) return; + + switch (value) { + + case 48000: + m_samplerate = value; + break; + + case 96000: + m_samplerate = value; + break; + + case 192000: + m_samplerate = value; + break; + + case 384000: + m_samplerate = value; + break; + + default: + RECEIVER_DEBUG << "invalid sample rate (possible values are: 48, 96, 192, or 384 kHz)!\n"; + break; + } + + if (qtdsp) + qtdsp->setSampleRate(this, m_samplerate); + else + RECEIVER_DEBUG << "qtdsp down: cannot set sample rate!\n"; +} + +void Receiver::setServerMode(QSDR::_ServerMode mode) { + + m_serverMode = mode; +} + +QSDR::_ServerMode Receiver::getServerMode() const { + + return m_serverMode; +} + +QSDR::_DSPCore Receiver::getDSPCoreMode() const { + + return m_dspCore; +} + +//void Receiver::setSocketState(SocketState state) { +// +// m_socketState = state; +//} + +//Receiver::SocketState Receiver::socketState() const { +// +// return m_socketState; +//} + +void Receiver::setSystemState( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; +} + +void Receiver::setAudioMode(QObject* sender, int mode) { + + if (sender != this && m_audioMode == mode) return; + + m_audioMode = mode; +} + +//void Receiver::setID(int value) { +// +// m_receiverID = value; +// RECEIVER_DEBUG << "This is receiver " << m_receiverID; +//} + +void Receiver::setReceiver(int value) { + + m_receiver = value; +} + +void Receiver::setSampleRate(int value) { + + m_sampleRate = value; +} + +void Receiver::setHamBand(QObject *sender, int rx, bool byBtn, HamBand band) { + + Q_UNUSED(sender) + Q_UNUSED(byBtn) + + if (m_receiver == rx) { + + if (m_hamBand == band) return; + m_hamBand = band; + } +} + +void Receiver::setDspMode(QObject *sender, int rx, DSPMode mode) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_dspMode == mode) return; + + m_dspMode = mode; + + if (qtdsp) { + + qtdsp->setDSPMode(mode); + qtdsp->filter->setFilter( + getFilterFromDSPMode(set->getDefaultFilterList(), mode).filterLo, + getFilterFromDSPMode(set->getDefaultFilterList(), mode).filterHi); + } + + //QString msg = "[receiver]: set mode for receiver %1 to %2"; + //emit messageEvent(msg.arg(rx).arg(set->getDSPModeString(m_dspMode))); +} + +void Receiver::setAGCMode(QObject *sender, int rx, AGCMode mode, bool hang) { + + Q_UNUSED(sender) + Q_UNUSED(hang) + + if (m_receiver != rx) return; + if (m_agcMode == mode) return; + + m_agcMode = mode; + + if (qtdsp) { + + qtdsp->wpagc->setMode(mode); + } +} + +void Receiver::setAGCGain(QObject *sender, int rx, int value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcGain == value) return; + + m_agcGain = value; + + if (qtdsp) { + + //RECEIVER_DEBUG << "AGCThreshDB (plus offset) = " << m_agcGain - AGCOFFSET; + //qtdsp->wpagc->setAGCThreshDb(m_filterLo, m_filterHi, BUFFER_SIZE, m_agcGain - AGCOFFSET); + } +} + +void Receiver::setAGCFixedGain_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcFixedGain_dB == value) return; + + m_agcFixedGain_dB = value; + + if (qtdsp) { + + //RECEIVER_DEBUG << "m_agcFixedGain = " << m_agcFixedGain; + qtdsp->wpagc->setAGCFixedGainDb(m_agcFixedGain_dB); + } +} + +void Receiver::setAGCMaximumGain_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcMaximumGain_dB == value) return; + + m_agcMaximumGain_dB = value; + + if (qtdsp) { + + //RECEIVER_DEBUG << "setAGCMaximumGain_dB = " << m_agcMaximumGain_dB; + qtdsp->wpagc->setMaximumGainDb(m_agcMaximumGain_dB); + } +} + +void Receiver::setAGCThreshold_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcThreshold_dBm == value) return; + + m_agcThreshold_dBm = value; + + if (qtdsp) { + + //RECEIVER_DEBUG << "AGCThreshDB (minus offset) for Rx " << m_receiver << ": " << m_agcThreshold_dBm - AGCOFFSET; + qtdsp->wpagc->setAGCThreshDb(m_filterLo, m_filterHi, 2*BUFFER_SIZE, m_agcThreshold_dBm - AGCOFFSET); + } +} + +void Receiver::setAGCHangThreshold(QObject *sender, int rx, int value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcHangThreshold == value) return; + + m_agcHangThreshold = value; + if (qtdsp) { + + RECEIVER_DEBUG << "m_agcHangThreshold =" << m_agcHangThreshold/100.0; + qtdsp->wpagc->setHangThresh(m_agcHangThreshold/100.0); + } +} + +void Receiver::setAGCHangLevel_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcHangLevel == value) return; + + m_agcHangLevel = value; + + if (qtdsp) { + + //RECEIVER_DEBUG << "m_agcHangLevel = " << m_agcHangLevel - AGCOFFSET; + qtdsp->wpagc->setHangLevelDb(m_agcHangLevel - AGCOFFSET); + } + //set->setAGCHangLeveldB(this, m_receiverID, value); +} + +void Receiver::setAGCVariableGain_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcVariableGain == value) return; + + m_agcVariableGain = value; + + if (qtdsp) { + + RECEIVER_DEBUG << "m_agcVariableGain = " << m_agcVariableGain; + qtdsp->wpagc->setVarGainDb(m_agcVariableGain); + } +} + +void Receiver::setAGCAttackTime(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcAttackTime == value) return; + + m_agcAttackTime = value; + + if (qtdsp) { + + RECEIVER_DEBUG << "m_agcAttackTime = " << m_agcAttackTime; + qtdsp->wpagc->setTauAttack(m_agcAttackTime); + } +} + +void Receiver::setAGCDecayTime(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcDecayTime == value) return; + + m_agcDecayTime = value; + + if (qtdsp) { + + RECEIVER_DEBUG << "m_agcDecayTime = " << m_agcDecayTime; + qtdsp->wpagc->setTauDecay(m_agcDecayTime); + } +} + +void Receiver::setAGCHangTime(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcHangTime == value) return; + + m_agcHangTime = value; + + if (qtdsp) { + + RECEIVER_DEBUG << "m_agcHangTime = " << m_agcHangTime; + qtdsp->wpagc->setHangTime(m_agcHangTime); + } +} + +void Receiver::setAudioVolume(QObject *sender, int rx, float value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + //if (m_audioVolume == value) return; + + m_audioVolume = value; + + if (qtdsp) { + + //RECEIVER_DEBUG << "setAudioVolume =" << m_audioVolume; + qtdsp->setVolume(value); + } +} + +void Receiver::setFilterFrequencies(QObject *sender, int rx, double low, double high) { + + Q_UNUSED(sender) + + if (m_receiver == rx) { + + if (m_filterLo == low && m_filterHi == high) return; + m_filterLo = low; + m_filterHi = high; + + if (qtdsp) { + + qtdsp->filter->setFilter((float)low, (float)high); + qtdsp->wpagc->filterChanged(); + } + } +} + +void Receiver::setCtrFrequency(long frequency) { + + if (m_ctrFrequency == frequency) return; + m_ctrFrequency = frequency; + + HamBand band = getBandFromFrequency(set->getBandFrequencyList(), frequency); + m_lastCtrFrequencyList[(int) band] = m_ctrFrequency; +} + +void Receiver::setVfoFrequency(long frequency) { + + if (m_vfoFrequency == frequency) return; + m_vfoFrequency = frequency; + + HamBand band = getBandFromFrequency(set->getBandFrequencyList(), frequency); + m_lastVfoFrequencyList[(int) band] = m_vfoFrequency; +} + +void Receiver::setLastCtrFrequencyList(const QList &fList) { + + m_lastCtrFrequencyList = fList; +} + +void Receiver::setLastVfoFrequencyList(const QList &fList) { + + m_lastVfoFrequencyList = fList; +} + +void Receiver::setdBmPanScaleMin(qreal value) { + + if (m_dBmPanScaleMin == value) return; + m_dBmPanScaleMin = value; +} + +void Receiver::setdBmPanScaleMax(qreal value) { + + if (m_dBmPanScaleMax == value) return; + m_dBmPanScaleMax = value; +} + +void Receiver::setMercuryAttenuators(const QList &attenuators) { + + m_mercuryAttenuators = attenuators; +} + +void Receiver::setFramesPerSecond(QObject *sender, int rx, int value) { + + Q_UNUSED(sender) + + if (m_receiver == rx) + m_displayTime = (int)(1000000.0/value); +} + +void Receiver::setPeerAddress(QHostAddress addr) { + + m_peerAddress = addr; +} + +void Receiver::setSocketDescriptor(int value) { + + m_socketDescriptor = value; +} + +void Receiver::setClient(int value) { + + m_client = value; +} + +void Receiver::setIQPort(int value) { + + m_iqPort = value; +} + +void Receiver::setBSPort(int value) { + + m_bsPort = value; +} + +void Receiver::setConnectedStatus(bool value) { + + m_connected = value; +} diff --git a/Source/src/DataEngine/cusdr_receiver.h b/Source/src/DataEngine/cusdr_receiver.h new file mode 100644 index 0000000..d5c62bd --- /dev/null +++ b/Source/src/DataEngine/cusdr_receiver.h @@ -0,0 +1,231 @@ +/** +* @file cusdr_receiver.h +* @brief cuSDR receiver header file +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-12 +*/ + +/* Copyright (C) +* +* 2010 - Hermann von Hasseln, DL3HVH +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +*/ + +#ifndef CUSDR_RECEIVER_H +#define CUSDR_RECEIVER_H + +//#include +//#include + +#include "cusdr_settings.h" +#include "QtDSP/qtdsp_dspEngine.h" +#include "Util/cusdr_highResTimer.h" + +#ifdef LOG_RECEIVER +# define RECEIVER_DEBUG qDebug().nospace() << "Receiver::\t" +#else +# define RECEIVER_DEBUG nullDebug() +#endif + + +class Receiver : public QObject { + + Q_OBJECT + +public: + Receiver(int rx = 0); + ~Receiver(); + + void setupConnections(); + bool initDSPInterface(); + void deleteDSPInterface(); + + void enqueueData(); + + + QSDR::_ServerMode getServerMode() const; + QSDR::_DSPCore getDSPCoreMode() const; + QHostAddress getPeerAddress() { return m_peerAddress; } + HamBand getHamBand() { return m_hamBand; } + AGCMode getAGCMode() { return m_agcMode; } + QList getMercuryAttenuators() { return m_mercuryAttenuators; } + QList getDSPModeList() { return m_dspModeList; } + + int getAudioMode() { return m_audioMode; } + int getSocketDescriptor() { return m_socketDescriptor; } + int getReceiverNo() { return m_receiver; } + int getClient() { return m_client; } + int getIQPort() { return m_iqPort; } + int getBSPort() { return m_bsPort; } + //int getID() { return m_receiverID; } + int getSampleRate() { return m_sampleRate; } + int getDisplayDelay() { return m_displayTime; } + qreal getAGCGain() { return m_agcGain; } + float getAudioVolume() { return m_audioVolume; } + long getCtrFrequency() { return m_ctrFrequency; } + long getVfoFrequency() { return m_vfoFrequency; } + double getFilterLo() { return m_filterLo; } + double getFilterHi() { return m_filterHi; } + qreal getdBmPanScaleMin() { return m_dBmPanScaleMin; } + qreal getdBmPanScaleMax() { return m_dBmPanScaleMax; } + bool getConnectedStatus() { return m_connected; } + + float in[BUFFER_SIZE * 2]; + float out[BUFFER_SIZE * 2]; + float temp[BUFFER_SIZE * 4]; + float spectrum[BUFFER_SIZE * 4]; + float postSpectrum[BUFFER_SIZE * 4]; + + QVector newSpectrum; + + QDSPEngine *qtdsp; + HResTimer *highResTimer; + + CPX inBuf; + CPX outBuf; + + QHQueue inQueue; + +public slots: + void setReceiverData(TReceiver data); + void setAudioMode(QObject* sender, int mode); + void setServerMode(QSDR::_ServerMode mode); + void setPeerAddress(QHostAddress addr); + void setSocketDescriptor(int value); + void setReceiver(int value); + void setClient(int value); + void setIQPort(int value); + void setBSPort(int value); + void setConnectedStatus(bool value); + //void setID(int value); + void setSampleRate(int value); + void setHamBand(QObject* sender, int rx, bool byBtn, HamBand band); + void setDspMode(QObject* sender, int rx, DSPMode mode); + void setAGCMode(QObject* sender, int rx, AGCMode mode, bool hang); + void setAGCGain(QObject* sender, int rx, int value); + void setAudioVolume(QObject* sender, int rx, float value); + void setCtrFrequency(long frequency); + void setVfoFrequency(long frequency); + void setFilterFrequencies(QObject* sender, int rx, qreal low, qreal high); + void setLastCtrFrequencyList(const QList &frequencies); + void setLastVfoFrequencyList(const QList &frequencies); + void setdBmPanScaleMin(qreal value); + void setdBmPanScaleMax(qreal value); + void setMercuryAttenuators(const QList &attenuators); + + void dspProcessing(); + void stop(); + +private slots: + void setSystemState( + QObject* sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setSampleRate(QObject *sender, int value); + void setFramesPerSecond(QObject *sender, int rx, int value); + + bool initQtDSPInterface(); + void deleteQtDSP(); + + //void setAGCMaximumGain_dBm(QObject* sender, int rx, int value); + void setAGCMaximumGain_dB(QObject* sender, int rx, qreal value); + void setAGCFixedGain_dB(QObject* sender, int rx, qreal value); + void setAGCThreshold_dB(QObject* sender, int rx, qreal value); + void setAGCHangLevel_dB(QObject* sender, int rx, qreal value); + void setAGCHangThreshold(QObject* sender, int rx, int value); + void setAGCVariableGain_dB(QObject* sender, int rx, qreal value); + void setAGCAttackTime(QObject* sender, int rx, qreal value); + void setAGCDecayTime(QObject* sender, int rx, qreal value); + void setAGCHangTime(QObject* sender, int rx, qreal value); + +private: + Settings* set; + + QSDR::_DSPCore m_dspCore; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + TReceiver m_receiverData; + QHostAddress m_peerAddress; + quint16 m_peerPort; + + HamBand m_hamBand; + DSPMode m_dspMode; + AGCMode m_agcMode; + TDefaultFilterMode m_filterMode; + + QList m_lastCtrFrequencyList; + QList m_lastVfoFrequencyList; + QList m_dspModeList; + QList m_mercuryAttenuators; + + QTime m_smeterTime; + QMutex m_mutex; + + volatile bool m_stopped; + + int m_receiver; + int m_samplerate; + int m_audioMode; // 1 = audio on, 0 = audio off + int m_socketDescriptor; + int m_client; + int m_iqPort; + int m_bsPort; + int m_sampleRate; + int m_displayTime; + + long m_ctrFrequency; + long m_vfoFrequency; + + float m_audioVolume; + float m_sMeterValue; + + qreal m_agcGain; + qreal m_agcFixedGain_dB; + qreal m_agcMaximumGain_dB; + qreal m_agcThreshold_dBm; + qreal m_agcHangThreshold; + qreal m_agcHangLevel; + qreal m_agcVariableGain; + qreal m_agcAttackTime; + qreal m_agcDecayTime; + qreal m_agcHangTime; + //qreal m_calOffset; + qreal m_filterLo; + qreal m_filterHi; + qreal m_dBmPanScaleMin; + qreal m_dBmPanScaleMax; + + bool m_connected; + bool m_hangEnabled; + + //void setupConnections(); + +signals: + void messageEvent(QString msg); + void spectrumBufferChanged(int rx, const qVectorFloat& buffer); + void sMeterValueChanged(int rx, float value); + void outputBufferSignal(int rx, const CPX &buffer); + //void audioReady(int rx); +}; + +#endif // CUSDR_RECEIVER_H diff --git a/Source/src/DataEngine/datatypes.h b/Source/src/DataEngine/datatypes.h new file mode 100644 index 0000000..d01b53d --- /dev/null +++ b/Source/src/DataEngine/datatypes.h @@ -0,0 +1,51 @@ +////////////////////////////////////////////////////////////////////// +// datatypes.h: Common data type declarations +// +// History: +// 2010-09-15 Initial creation MSW +// 2011-03-27 Initial release +////////////////////////////////////////////////////////////////////// +#ifndef DATATYPES_H +#define DATATYPES_H + +#include +#include + + +//define single or double precision reals and complex types +typedef float tSReal; +typedef double tDReal; + +typedef struct _sCplx +{ + tSReal re; + tSReal im; +}tSComplex; + +typedef struct _dCplx +{ + tDReal re; + tDReal im; +}tDComplex; + +typedef struct _isCplx +{ + qint16 re; + qint16 im; +}tStereo16; + + +#define TYPEREAL tDReal +#define TYPECPX tDComplex +#define TYPESTEREO16 tStereo16 +#define TYPEMONO16 qint16 + +//#define K_2PI (8.0*atan(1)) //maybe some compilers are't too smart to optimize out +#define K_2PI (2.0 * 3.14159265358979323846) +#define K_PI (3.14159265358979323846) +#define K_PI4 (K_PI/4.0) +#define K_PI2 (K_PI/2.0) +#define K_3PI4 (3.0*K_PI4) + + +#endif // DATATYPES_H diff --git a/Source/src/DataEngine/fractresampler.cpp b/Source/src/DataEngine/fractresampler.cpp new file mode 100644 index 0000000..da3caf4 --- /dev/null +++ b/Source/src/DataEngine/fractresampler.cpp @@ -0,0 +1,352 @@ +////////////////////////////////////////////////////////////////////// +// FractResampler.cpp: implementation of the CFractResampler class. +// +// This class implements a fractional resampler that can be used to +//convert between different sample rates. A windowes sinc interpolator +// is used to create samples "in between" input samples. +// +// History: +// 2010-09-15 Initial creation MSW +// 2011-03-27 Initial release +///////////////////////////////////////////////////////////////////// + +//========================================================================================== +// + + + This Software is released under the "Simplified BSD License" + + + +//Copyright 2010 Moe Wheatley. All rights reserved. +// +//Redistribution and use in source and binary forms, with or without modification, are +//permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +//THIS SOFTWARE IS PROVIDED BY Moe Wheatley ``AS IS'' AND ANY EXPRESS OR IMPLIED +//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR +//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +//The views and conclusions contained in the software and documentation are those of the +//authors and should not be interpreted as representing official policies, either expressed +//or implied, of Moe Wheatley. +//========================================================================================== + +#include "fractresampler.h" +#include +#include +#include + +////////////////////////////////////////////////////////////////////// +// Local defines +////////////////////////////////////////////////////////////////////// +#define SINC_PERIOD_PTS 10000 //number of points in sinc table between "zero crossings" + //smaller value increases noise floor + +#define SINC_PERIODS 28 //number of input sample periods("zero crossings"-1) in + //sinc function(should be even) + //decreasing reduces alias free bandwidth + +#define SINC_LENGTH ( (SINC_PERIODS)*SINC_PERIOD_PTS + 1)//number of total points in sinc table + +#define MAX_SOUNDCARDVAL 32767.0 + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +CFractResampler::CFractResampler() +{ + m_pSinc = NULL; + m_pInputBuf = NULL; + +} + +CFractResampler::~CFractResampler() +{ + if(m_pSinc) + delete m_pSinc; + if(m_pInputBuf) + delete m_pInputBuf; +} +// + +////////////////////////////////////////////////////////////////////// +// Initialize resampler memory and create windowed sinc table +// MaxInputSize is the largest number of input samples expected to be processed +////////////////////////////////////////////////////////////////////// +void CFractResampler::Init(int MaxInputSize) +{ +int i; +TYPEREAL fi; +TYPEREAL window; + MaxInputSize += SINC_PERIODS; //expand buffer size to include wrap around + if(NULL == m_pSinc) + m_pSinc = new TYPEREAL[SINC_LENGTH]; + if(m_pInputBuf) + delete m_pInputBuf; + m_pInputBuf = new TYPECPX[MaxInputSize]; + for(i=0; i MAX_SOUNDCARDVAL) + tmp.re = MAX_SOUNDCARDVAL; + if(tmp.re < -MAX_SOUNDCARDVAL) + tmp.re = -MAX_SOUNDCARDVAL; + if(tmp.im>MAX_SOUNDCARDVAL) + tmp.im = MAX_SOUNDCARDVAL; + if(tmp.im < -MAX_SOUNDCARDVAL) + tmp.im = -MAX_SOUNDCARDVAL; + pOutBuf[outsamples].re = (qint16)tmp.re; + pOutBuf[outsamples++].im = (qint16)tmp.im; + + m_FloatTime += dt; //inc floating pt output time step + IntegerTime = (int)m_FloatTime; //truncate to integer + } + m_FloatTime -= (double)InLength; //move floating time position back for next call + //keeping leftover fraction + //need to copy last SINC_PERIODS input samples in buffer to beginning of buffer + // for FIR wrap around management. j points to last input sample processed + j = InLength; + for(i=0; i MAX_SOUNDCARDVAL) + tmp = MAX_SOUNDCARDVAL; + if(tmp < -MAX_SOUNDCARDVAL) + tmp = -MAX_SOUNDCARDVAL; + pOutBuf[outsamples++] = (TYPEMONO16)tmp; + + m_FloatTime += dt; + IntegerTime = (int)m_FloatTime; + } + m_FloatTime -= (double)InLength; //move floating time position back for next call + //keeping leftover fraction + //need to copy last SINC_PERIODS input samples in buffer to beginning of buffer + // for FIR wrap around management. j points to last input sample processed + j = InLength; + for(i=0; i +#include + +#define SOUNDCARD_RATE 48000 //output soundcard sample rate +//#define SOUNDCARD_RATE 44100 + +#define FILTERQLEVEL_ALPHA 0.001 +#define P_GAIN 2.38e-7 //Proportional gain + +#define TRUE 1 +#define FALSE 0 + +#define TEST_ERROR 1.0 +//#define TEST_ERROR 1.001 //use to force fixed sample rate error for testing +//#define TEST_ERROR 0.999 + +///////////////////////////////////////////////////////////////////// +// constructor/destructor +///////////////////////////////////////////////////////////////////// +CSoundOut::CSoundOut(QObject *parent) : + QThread(parent) +{ + m_pParent = parent; + m_pAudioOutput = NULL; + m_pOutput = NULL; + m_ThreadQuit = true; + m_UserDataRate = SOUNDCARD_RATE; + m_OutRatio = 1.0; + //RRK m_OutAudioFormat.setFrequency(SOUNDCARD_RATE); + m_OutAudioFormat.setSampleRate(SOUNDCARD_RATE); + m_OutResampler.Init(8192); + m_RateCorrection = 0.0; + m_Gain = 1.0; + m_Startup = true; + m_BlockingMode = false; +} + +CSoundOut::~CSoundOut() +{ + Stop(); +} + +void GetAlsaMasterVolume(long *volume) +{ + long min, max; + snd_mixer_t *handle; + snd_mixer_selem_id_t *sid; + const char *card = "default"; + const char *selem_name = "Master"; + + snd_mixer_open(&handle, 0); + snd_mixer_attach(handle, card); + snd_mixer_selem_register(handle, NULL, NULL); + snd_mixer_load(handle); + + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_id_set_index(sid, 0); + snd_mixer_selem_id_set_name(sid, selem_name); + snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid); + + snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, volume); + + snd_mixer_close(handle); +} + +void SetAlsaMasterVolume(long volume) +{ + long min, max; + snd_mixer_t *handle; + snd_mixer_selem_id_t *sid; + const char *card = "default"; + const char *selem_name = "Master"; + + snd_mixer_open(&handle, 0); + snd_mixer_attach(handle, card); + snd_mixer_selem_register(handle, NULL, NULL); + snd_mixer_load(handle); + + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_id_set_index(sid, 0); + snd_mixer_selem_id_set_name(sid, selem_name); + snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid); + + snd_mixer_selem_get_playback_volume_range(elem, &min, &max); + snd_mixer_selem_set_playback_volume_all(elem, volume * max / 100); + + snd_mixer_close(handle); +} + +///////////////////////////////////////////////////////////////////// +// Starts up soundcard output thread using soundcard at list OutDevIndx +///////////////////////////////////////////////////////////////////// +bool CSoundOut::Start(int OutDevIndx, bool StereoOut, double UsrDataRate, bool BlockingMode) +{ +QAudioDeviceInfo DeviceInfo; + long mvolume; + m_StereoOut = StereoOut; + m_BlockingMode = BlockingMode; + //Get required soundcard from list + m_OutDevices = DeviceInfo.availableDevices(QAudio::AudioOutput); + + if (-1 == OutDevIndx) GetAlsaMasterVolume(&mvolume); + qDebug()<<"Soundcard volume" << mvolume; + + if (-1 == OutDevIndx) m_OutDeviceInfo = QAudioDeviceInfo::defaultOutputDevice(); + else m_OutDeviceInfo = m_OutDevices.at(OutDevIndx); + +#if 0 //RRK get a list of audio devices and the default + foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) { + qDebug() << "l:" << deviceInfo.deviceName(); + } + + QAudioDeviceInfo info = QAudioDeviceInfo::defaultOutputDevice(); + qDebug() << "res:" << info.deviceName(); +#endif + + //Setup fixed format for sound ouput + m_OutAudioFormat.setCodec("audio/pcm"); + //m_OutAudioFormat.setFrequency(SOUNDCARD_RATE); + m_OutAudioFormat.setSampleRate(SOUNDCARD_RATE); + m_OutAudioFormat.setSampleSize(16); + m_OutAudioFormat.setSampleType(QAudioFormat::SignedInt); + m_OutAudioFormat.setByteOrder(QAudioFormat::LittleEndian); + if(m_StereoOut) + //RRK m_OutAudioFormat.setChannels(2); + m_OutAudioFormat.setChannelCount(2); + else + m_OutAudioFormat.setChannelCount(1); + + m_pAudioOutput = new QAudioOutput(m_OutDeviceInfo, m_OutAudioFormat, this); + if(!m_pAudioOutput) + { + qDebug()<<"Soundcard output error"; + return false; + } + if(QAudio::NoError == m_pAudioOutput->error() ) + { + //initialize the data queue variables + m_UserDataRate = 1; //force user data rate to be changed + ChangeUserDataRate(UsrDataRate); + m_pOutput = m_pAudioOutput->start(); //start QT AudioOutput + + //RRK workaround for default, for some reason choosing default + //sets the master volume to max! + if (-1 == OutDevIndx) SetAlsaMasterVolume(50); + + //determine how long to sleep between low level reads based on samplerate and period size + m_BlockTime = ( 250*m_pAudioOutput->periodSize() )/ + ( SOUNDCARD_RATE*m_OutAudioFormat.channelCount() ); + //RRK ( SOUNDCARD_RATE*m_OutAudioFormat.channels() ); +//qDebug()<<"periodSize "<periodSize(); +//qDebug()<<"BlockTime "<stop(); + wait(500); + } + if(NULL != m_pAudioOutput) + { + delete m_pAudioOutput; + m_pAudioOutput = NULL; + } +} + +///////////////////////////////////////////////////////////////////// +// Sets/changes user data input rate +///////////////////////////////////////////////////////////////////// +void CSoundOut::ChangeUserDataRate(double UsrDataRate) +{ + if(m_UserDataRate != UsrDataRate) + { + m_UserDataRate = UsrDataRate; + for(int i=0; iOUTQSIZE/2) + { + m_Startup = false; + m_RateUpdateCount = -5*SOUNDCARD_RATE; //delay first error update to let settle + m_PpmError = 0; + m_AveOutQLevel = m_OutQLevel; + m_UpdateToggle = true; + } + else + { + m_Mutex.unlock(); + return; + } + } + + for( i=0; i= SOUNDCARD_RATE) //every second + { + CalcError(); + m_RateUpdateCount = 0; + } + m_Mutex.unlock(); +} + +//////////////////////////////////////////////////////////////// +//Called by CSoundOut worker thread to get new samples from queue +// This routine is called from a worker thread so must be careful. +// STEREO version +//////////////////////////////////////////////////////////////// +void CSoundOut::GetOutQueue(int numsamples, TYPESTEREO16* pData ) +{ +int i; +bool underflow = false; + m_Mutex.lock(); + if(m_Startup) + { //if no data in queue yet just stuff in silence until something is put in queue + for( i=0; iOUTQSIZE/2) + { + m_Startup = false; + m_RateUpdateCount = -5*SOUNDCARD_RATE; //delay first error update to let settle + m_PpmError = 0; + m_AveOutQLevel = m_OutQLevel; + m_UpdateToggle = true; + } + else + { + m_Mutex.unlock(); + return; + } + } + + for( i=0; i= SOUNDCARD_RATE) //every second + { + CalcError(); + m_RateUpdateCount = 0; + } + m_Mutex.unlock(); +} + +//////////////////////////////////////////////////////////////// +// Called alternately from the Get routines to update the +// error correction process +//////////////////////////////////////////////////////////////// +void CSoundOut::CalcError() +{ +double error; + error = (double)(m_AveOutQLevel - OUTQSIZE/2 ); //neg==level is too low pos == level is to high + error = error * P_GAIN; + m_RateCorrection = error; + m_PpmError = (int)( m_RateCorrection*1e6 ); + if( abs(m_PpmError) > 500) + { +// qDebug()<<"SoundOut "<state() ) || + (QAudio::ActiveState == m_pAudioOutput->state() ) ) + { //Process sound data while soundcard is active and no errors + unsigned int len = m_pAudioOutput->bytesFree(); //in bytes + if( len>0 ) + { + //limit size to SOUND_WRITEBUFSIZE + if(len > SOUND_WRITEBUFSIZE) + len = SOUND_WRITEBUFSIZE; + if(m_StereoOut) + { + len &= ~(0x03); //keep on 4 byte chunks + GetOutQueue( len/4, (TYPESTEREO16*)m_pData ); + } + else + { + len &= ~(0x01); //keep on 2 byte chunks + GetOutQueue( len/2, (TYPEMONO16*)m_pData ); + } + m_pOutput->write((char*)m_pData,len); + } + else //no room in sound card output buffer so wait + { //not good but no other wait or blocking mechanism available + msleep(m_BlockTime); + } + } + else + { //bail out if error occurs + qDebug()<<"SoundOut Error"; +#if 0 //RRK + if(m_pParent) + ((CSdrInterface*)m_pParent)->SendIOStatus(CSdrInterface::ERROR); +#endif + m_ThreadQuit = true; + } + } + qDebug()<<"sound thread exit"; +} diff --git a/Source/src/DataEngine/soundout.h b/Source/src/DataEngine/soundout.h new file mode 100644 index 0000000..f5b4abf --- /dev/null +++ b/Source/src/DataEngine/soundout.h @@ -0,0 +1,76 @@ +////////////////////////////////////////////////////////////////////// +// soundout.h: interface for the CSoundOut class. +// +// History: +// 2010-09-15 Initial creation MSW +// 2011-03-27 Initial release +///////////////////////////////////////////////////////////////////// +#ifndef SOUNDOUT_H +#define SOUNDOUT_H + +#include +#include +#include +#include +#include +#include "fractresampler.h" +#include +#include + +#define OUTQSIZE 16384 //max samples (keep power of 2 for ptr wrap around) +#define SOUND_WRITEBUFSIZE 8192 + +class CSoundOut : public QThread +{ + Q_OBJECT +public: + explicit CSoundOut(QObject *parent = 0); + virtual ~CSoundOut(); + + //Exposed functions + bool Start(int OutDevIndx, bool StereoOut, double UsrDataRate, bool BlockingMode); //starts soundcard output + void Stop(); //stops soundcard output + void PutOutQueue(int numsamples, TYPEREAL* pData ); + void PutOutQueue(int numsamples, TYPECPX* pData ); + void ChangeUserDataRate(double UsrDataRate); + void SetVolume(qint32 vol); + int GetRateError(){return (int)m_PpmError;} + +protected: + void run(); //implements worker thread loop + int m_BlockTime; + +private: + void GetOutQueue(int numsamples, TYPEMONO16* pData ); + void GetOutQueue(int numsamples, TYPESTEREO16* pData ); + void CalcError(); + + QList m_OutDevices; + QAudioDeviceInfo m_OutDeviceInfo; + QAudioFormat m_OutAudioFormat; + QAudioOutput* m_pAudioOutput; + QIODevice* m_pOutput; // ptr to internal soundout IODevice + QObject* m_pParent; + QMutex m_Mutex; + CFractResampler m_OutResampler; + + TYPEMONO16 m_OutQueueMono[OUTQSIZE]; + TYPESTEREO16 m_OutQueueStereo[OUTQSIZE]; + bool m_BlockingMode; + bool m_ThreadQuit; + bool m_Startup; + bool m_StereoOut; + bool m_UpdateToggle; + quint32 m_OutQHead; + quint32 m_OutQTail; + char m_pData[SOUND_WRITEBUFSIZE]; + int m_RateUpdateCount; + int m_OutQLevel; + int m_PpmError; + double m_Gain; + double m_UserDataRate; + double m_OutRatio; + double m_RateCorrection; + double m_AveOutQLevel; +}; +#endif // SOUNDOUT_H diff --git a/Source/src/GL/cusdr_oglDisplayPanel.cpp b/Source/src/GL/cusdr_oglDisplayPanel.cpp new file mode 100644 index 0000000..96ace20 --- /dev/null +++ b/Source/src/GL/cusdr_oglDisplayPanel.cpp @@ -0,0 +1,2827 @@ +/** +* @file cusdr_oglDisplayPanel.cpp +* @brief Display panel class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-22 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_DISPLAYPANEL + +#include "cusdr_oglDisplayPanel.h" + +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#ifndef GL_MULTISAMPLE +#define GL_MULTISAMPLE 0x809D +#endif + + +OGLDisplayPanel::OGLDisplayPanel(QWidget *parent) + : QGLWidget(QGLFormat(QGL::SampleBuffers), parent) + + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_smeterUpdate(true) + , m_smeterRenew(true) + , m_sMeterAvg(true) + , m_oldFreq(0) + , m_height(120)//(120) + , m_sMeterWidth(300) + , m_rxRectWidth(500) + , m_lowerRectY(12) + , m_upperRectY(1) + , m_syncStatus(0) + , m_adcStatus(0) + , m_packetLossStatus(0) + , m_sendIQStatus(0) + , m_recvAudioStatus(0) + , m_receivers(set->getNumberOfReceivers()) + , m_sample_rate(set->getSampleRate()/1000) + , m_dither(set->getMercuryDither()) + , m_random(set->getMercuryRandom()) + , m_currentReceiver(set->getCurrentReceiver()) + , m_sMeterDeform(15) + , m_freqDigitsPosY(30) + , m_sMeterPosY(50)//(45) + , m_sMeterHoldTime(set->getSMeterHoldTime()) + , m_sMeterPrevHoldTimeMax(0) + , m_sMeterPrevHoldTimeMin(0) + , m_sMeterMeanValueCnt(0) + , m_mouseWheelFreqStep(set->getMouseWheelFreqStep(m_currentReceiver)) + , m_dBmPanMin(-130.0f) + , m_dBmPanMax(10.0f) + , m_unit(1.0f) + , m_smeterVertices(256.0f) + , m_sMeterValue((float)(-156*ONEPI/256.0f)) + , m_sMeterMeanValue(0.0f) + , m_sMeterMaxValueA((float)(-ONEPI/2.0f)) + , m_sMeterMinValueA((float)(ONEPI/2.0f)) + , m_sMeterMaxValueB(-1000.0f) + , m_sMeterMinValueB(1000.0f) +{ +// QGL::setPreferredPaintEngine(QPaintEngine::OpenGL); + + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + setAutoBufferSwap(true); + setAutoFillBackground(false); + setMouseTracking(true); + + m_freqStringLeftPos = 20; + setupDisplayRegions(size()); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + m_fonts.smallFont.setBold(true); + m_oglTextTiny = new OGLText(m_fonts.tinyFont); + m_oglTextSmall = new OGLText(m_fonts.smallFont); + + m_fonts.smallFont.setItalic(true); + //m_fonts.smallFont.setBold(true); + m_oglTextSmallItalic = new OGLText(m_fonts.smallFont); + m_oglTextNormal = new OGLText(m_fonts.normalFont); + m_oglTextBig = new OGLText(m_fonts.bigFont); + + m_fonts.bigFont.setItalic(true); + m_oglTextBigItalic = new OGLText(m_fonts.bigFont); + m_oglTextFreq1 = new OGLText(m_fonts.freqFont1); + m_oglTextFreq2 = new OGLText(m_fonts.freqFont2); + m_oglTextImpact = new OGLText(m_fonts.impactFont); + + setupConnections(); + setupTextstrings(); + + set10mhzSource(this, set->get10MHzSource()); + set122_88mhzSource(this, set->get122_8MHzSource()); + + QList fList = set->getVfoFrequencies(); + + for (int i = 0; i < MAX_RECEIVERS; i++) { + + TFrequency f; + f.freqMHz = (int)(fList.at(i) / 1000); + f.freqkHz = (int)(fList.at(i) % 1000); + + m_frequencyList << f; + } + + QList bandList = getHamBandFrequencies(); + HamBand band = getBandFromFrequency(bandList, fList.at(0)); + + m_mercuryAttenuator = set->getMercuryAttenuators(0).at(band); + + + m_smeterFBO = 0; + + m_colors = set->getPanadapterColors(); + + m_digitColor = QColor(68, 68, 68); + m_bkgColor1 = QColor(30, 30, 30); + m_bkgColor2 = QColor(50, 50, 50); + m_activeTextColor = QColor(166, 196, 208); + m_inactiveTextColor = QColor(68, 68, 68);//Qt::white;// + m_textBackgroundColor = QColor(66, 96, 208); + + m_sMeterTimer.start(); + m_sMeterMaxTimer.start(); + m_sMeterMinTimer.start(); + m_sMeterDisplayTime.start(); + + m_SMeterA = false; + //m_SMeterA = true; +} + +OGLDisplayPanel::~OGLDisplayPanel() { +} + +QSize OGLDisplayPanel::minimumSizeHint() const { + + return QSize(width(), m_height); +} + +QSize OGLDisplayPanel::sizeHint() const { + + //return QSize(width(), height()); + return QSize(width(), m_height); +} + +void OGLDisplayPanel::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(numberOfRXChanged(QObject *, int)), + this, + SLOT(setReceivers(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(setMercuryAttenuator(QObject *, HamBand, int))); + + CHECKED_CONNECT( + set, + SIGNAL(ditherChanged(QObject *, int)), + this, + SLOT(setDither(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(randomChanged(QObject *, int)), + this, + SLOT(setRandom(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(setSampleRate(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryPresenceChanged(bool)), + this, + SLOT(setMercuryPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryVersionChanged(int)), + this, + SLOT(setMercuryVersion(int))); + + CHECKED_CONNECT( + set, + SIGNAL(penelopePresenceChanged(bool)), + this, + SLOT(setPenelopePresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(pennyLanePresenceChanged(bool)), + this, + SLOT(setPennylanePresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(metisVersionChanged(int)), + this, + SLOT(setMetisVersion(int))); + + CHECKED_CONNECT( + set, + SIGNAL(penelopeVersionChanged(int)), + this, + SLOT(setPenelopeVersion(int))); + + CHECKED_CONNECT( + set, + SIGNAL(penelopeVersionChanged(int)), + this, + SLOT(setPennylaneVersion(int))); + + CHECKED_CONNECT( + set, + SIGNAL(hermesVersionChanged(int)), + this, + SLOT(setHermesVersion(int))); + + CHECKED_CONNECT( + set, + SIGNAL(alexPresenceChanged(bool)), + this, + SLOT(setAlexPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(excaliburPresenceChanged(bool)), + this, + SLOT(setExcaliburPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(src10MhzChanged(QObject *, int)), + this, + SLOT(set10mhzSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(src122_88MhzChanged(QObject *, int)), + this, + SLOT(set122_88mhzSource(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(protocolSyncChanged(int)), + this, + SLOT(setSyncStatus(int))); + + CHECKED_CONNECT( + set, + SIGNAL(adcOverflowChanged(int)), + this, + SLOT(setADCStatus(int))); + + CHECKED_CONNECT( + set, + SIGNAL(packetLossChanged(int)), + this, + SLOT(setPacketLossStatus(int))); + + CHECKED_CONNECT( + set, + SIGNAL(sendIQSignalChanged(int)), + this, + SLOT(setSendIQStatus(int))); + + CHECKED_CONNECT( + set, + SIGNAL(rcveIQSignalChanged(int)), + this, + SLOT(setRecvAudioStatus(int))); + + CHECKED_CONNECT( + set, + SIGNAL(mouseWheelFreqStepChanged(QObject*, int, qreal)), + this, + SLOT(setMouseWheelFreqStep(QObject*, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(sMeterValueChanged(int, float)), + this, + SLOT(setSMeterValue(int, float))); + + CHECKED_CONNECT( + set, + SIGNAL(sMeterHoldTimeChanged(int)), + this, + SLOT(setSMeterHoldTime(int))); +} + +void OGLDisplayPanel::setupTextstrings() { + + m_blankWidth = m_oglTextSmall->fontMetrics().width("."); + m_blankHeight = m_oglTextSmall->fontMetrics().height()-1; + + m_pointStringWidth = m_oglTextFreq1->fontMetrics().width("."); + m_blankWidthf = m_oglTextFreq1->fontMetrics().width("59.999"); + m_blankWidthf1 = m_oglTextFreq1->fontMetrics().width("0"); + m_blankWidthf2 = m_oglTextFreq2->fontMetrics().width("0"); + m_fUnitStringWidth = m_oglTextFreq2->fontMetrics().width("MHz"); + + m_versionStringWidth = m_oglTextSmall->fontMetrics().width("2.22"); + + m_SYNCString = QString("SYNC"); + m_syncWidth = m_oglTextSmall->fontMetrics().width(m_SYNCString); + + m_ADCString = QString("ADC"); + m_adcWidth = m_oglTextSmall->fontMetrics().width(m_ADCString); + + m_PacketLossString = QString("IP Packets"); + m_packetLossWidth = m_oglTextSmall->fontMetrics().width(m_PacketLossString); + + m_sendIQString = QString("send IQ"); + m_sendIQWidth = m_oglTextSmall->fontMetrics().width(m_sendIQString); + + m_recvAudioString = QString("recv Audio"); + m_recvAudioWidth = m_oglTextSmall->fontMetrics().width(m_recvAudioString); + + m_AttnString = QString("Attn:"); + m_AttnWidth = m_oglTextSmall->fontMetrics().width(m_AttnString); + + m_ditherString = QString("Dither"); + m_ditherWidth = m_oglTextSmall->fontMetrics().width(m_ditherString); + + m_randomString = QString("Random"); + m_randomWidth = m_oglTextSmall->fontMetrics().width(m_randomString); + + m_sampleRateString = QString("SampleRate:"); + m_sampleRateWidth = m_oglTextSmall->fontMetrics().width(m_sampleRateString); + + m_modusString = QString("Modus:"); + m_modusWidth = m_oglTextSmall->fontMetrics().width(m_modusString); + + m_10MHzString = QString("10 MHz:"); + m_10MHzWidth = m_oglTextSmall->fontMetrics().width(m_10MHzString); + + m_12288MHzString = QString("122.88 MHz:"); + m_12288MHzWidth = m_oglTextSmall->fontMetrics().width(m_12288MHzString); + + m_mercuryString = QString("Mercury "); + m_mercuryStringWidth = m_oglTextSmall->fontMetrics().width(m_mercuryString); + + m_penelopeString = QString("Penelope "); + m_penelopeStringWidth = m_oglTextSmall->fontMetrics().width(m_penelopeString); + + m_pennylaneString = QString("Pennylane "); + m_pennylaneStringWidth = m_oglTextSmall->fontMetrics().width(m_pennylaneString); + + m_excaliburString = QString("Excalibur "); + m_excaliburStringWidth = m_oglTextSmall->fontMetrics().width(m_excaliburString); + + m_metisString = QString("Metis "); + m_metisStringWidth = m_oglTextSmall->fontMetrics().width(m_metisString); + + m_alexString = QString("Alex "); + m_alexStringWidth = m_oglTextSmall->fontMetrics().width(m_alexString); + + m_hermesString = QString("Hermes "); + m_hermesStringWidth = m_oglTextSmall->fontMetrics().width(m_hermesString); + + m_hermesStepAttnString = QString("Hermes Step-Attn:"); + m_hermesStepAttnStringWidth = m_oglTextSmall->fontMetrics().width(m_hermesStepAttnString); + +} + +void OGLDisplayPanel::initializeGL() { + + if (!isValid()) return; + + //***************************************************************** + // default initialization + + //glShadeModel(GL_FLAT); + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.5f); + //glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + glDisable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glDisable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + glEnable(GL_POLYGON_SMOOTH); + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + //glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glEnable(GL_MULTISAMPLE); +} + +void OGLDisplayPanel::resizeGL(int iWidth, int iHeight) { + + int width = (int)(iWidth/2) * 2; + int height = iHeight; + + glFinish(); + + //m_resizeTime.restart(); + setupDisplayRegions(QSize(width, height)); + glViewport(0, 0, (GLsizei)width, (GLsizei)height); + + setProjectionOrthographic(width, height); +} + +void OGLDisplayPanel::paintGL() { + + glClearColor(0, 0, 0, 1.0); + glClear(GL_DEPTH_BUFFER_BIT); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + //m_mutex.lock(); + paintUpperRegion(); + paintRxRegion(); + paintLowerRegion(); + paintSMeter(); + //m_mutex.unlock(); +} + +void OGLDisplayPanel::paintUpperRegion() { + + QString str; + + GLint x1 = m_rxRect.left() + m_blankWidth; + GLint y1 = m_rxRect.top() + m_upperRectY; + + // sync status + str = QString(m_SYNCString); + QRect rect = QRect(x1, y1, m_syncWidth + 2*m_blankWidth, m_blankHeight); + + switch (m_syncStatus) { + + case 0: + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + break; + + case 1: + drawGLRect(rect, QColor(56, 242, 115), -2.0f); + break; + + case 2: + drawGLRect(rect, QColor(242, 56, 109), -2.0f); + break; + } + qglColor(QColor(0, 0, 0)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, m_SYNCString); + + // ADC status + str = QString(m_ADCString); + x1 += m_syncWidth + 2*m_blankWidth + 2; + rect = QRect(x1, y1, m_adcWidth + 2*m_blankWidth, m_blankHeight); + + switch (m_adcStatus) { + + case 0: + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + break; + + case 1: + drawGLRect(rect, QColor(56, 242, 115), -2.0f); + break; + + case 2: + drawGLRect(rect, QColor(242, 56, 109), -2.0f); + break; + } + qglColor(QColor(0, 0, 0)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, m_ADCString); + + // Packet loss status + str = QString(m_PacketLossString); + x1 += m_adcWidth + 2*m_blankWidth + 2; + rect = QRect(x1, y1, m_packetLossWidth + 2*m_blankWidth, m_blankHeight); + + switch (m_packetLossStatus) { + + case 0: + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + break; + + case 1: + drawGLRect(rect, QColor(56, 242, 115), -2.0f); + break; + + case 2: + drawGLRect(rect, QColor(242, 56, 109), -2.0f); + break; + } + qglColor(QColor(0, 0, 0)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, m_PacketLossString); + +// // send IQ data status +// str = QString(m_sendIQString); +// rect = QRect(x1+63, y1 + m_upperRectY, d_fm.tightBoundingRect(str).width() + 6, fontHeight + 4); +// +// switch (m_sendIQStatus) { +// +// case 0: +// drawGLRect(rect, QColor(68, 68, 68), -2.0f); +// //qglColor(QColor(100, 100, 100)); +// break; +// +// case 1: +// drawGLRect(rect, QColor(56, 242, 115), -2.0f); +// //qglColor(QColor(56, 242, 115)); +// break; +// +// case 2: +// drawGLRect(rect, QColor(242, 56, 109), -2.0f); +// //qglColor(QColor(242, 56, 109)); +// break; +// } +// qglColor(QColor(0, 0, 0)); +// m_oglTextSmallItalic->renderText(m_syncWidth + m_adcWidth + 19, y1 + m_upperRectY, m_sendIQString); + +// // receiver Audio status +// str = QString(m_recvAudioString); +// rect = QRect(x1+108, y1 + m_upperRectY, d_fm.tightBoundingRect(str).width() + 8, fontHeight + 4); +// +// switch (m_recvAudioStatus) { +// +// case 0: +// drawGLRect(rect, QColor(68, 68, 68), -2.0f); +// //qglColor(QColor(100, 100, 100)); +// break; +// +// case 1: +// drawGLRect(rect, QColor(56, 242, 115), -2.0f); +// //qglColor(QColor(56, 242, 115)); +// break; +// +// case 2: +// drawGLRect(rect, QColor(242, 56, 109), -2.0f); +// //qglColor(QColor(242, 56, 109)); +// break; +// } +// qglColor(QColor(0, 0, 0)); +// m_oglTextSmallItalic->renderText(m_syncWidth + m_adcWidth + m_sendIQWidth + 29, y1 + m_upperRectY, m_recvAudioString); + + + // Metis status + str = m_metisString; + x1 += m_packetLossWidth + 15*m_blankWidth; + + if (m_hwInterface == QSDR::Metis && m_dataEngineState == QSDR::DataEngineUp) + rect = QRect(x1, y1, m_metisStringWidth + m_versionStringWidth, m_blankHeight); + else + rect = QRect(x1, y1, m_metisStringWidth, m_blankHeight); + + if (m_hwInterface == QSDR::Metis) { + + drawGLRect(rect, m_textBackgroundColor, -2.0f); + if (m_dataEngineState == QSDR::DataEngineUp) { + + str.append(m_metisVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else { + + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + qglColor(QColor(0, 0, 0)); + } + m_oglTextSmallItalic->renderText(x1, y1, 1.0f, str); + + + // Mercury status + str = m_mercuryString; + + if (m_hwInterface == QSDR::Metis && m_dataEngineState == QSDR::DataEngineUp) { + x1 += m_metisStringWidth + m_versionStringWidth + m_blankWidth; + rect = QRect(x1, y1, m_mercuryStringWidth + m_versionStringWidth, m_blankHeight); + } + else { + x1 += m_metisStringWidth + m_blankWidth; + rect = QRect(x1, y1, m_mercuryStringWidth, m_blankHeight); + } + + //rect = QRect(x1, y1, m_mercuryStringWidth + m_versionStringWidth, m_blankHeight); + + if (set->getMercuryPresence() && m_hwInterface == QSDR::Metis) { + drawGLRect(rect, m_textBackgroundColor, -2.0f); + + if (m_dataEngineState == QSDR::DataEngineUp) { + str.append(m_mercuryVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else { + + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + qglColor(QColor(0, 0, 0)); + } + + //m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, 1.0f, str); + m_oglTextSmallItalic->renderText(x1, y1, 1.0f, str); + + + // Penelope status + str = m_penelopeString; + + if (m_hwInterface == QSDR::Metis && m_dataEngineState == QSDR::DataEngineUp) + x1 += m_mercuryStringWidth + m_versionStringWidth + m_blankWidth; + else + x1 += m_mercuryStringWidth + m_blankWidth; + + if (set->getPenelopePresence() && m_hwInterface == QSDR::Metis) { + str = m_penelopeString; + + if (m_dataEngineState == QSDR::DataEngineUp) + rect = QRect(x1, y1, m_penelopeStringWidth + m_versionStringWidth, m_blankHeight); + else + rect = QRect(x1, y1, m_penelopeStringWidth, m_blankHeight); + + drawGLRect(rect, m_textBackgroundColor, -2.0f); + + if (m_dataEngineState == QSDR::DataEngineUp) { + str.append(m_penelopeVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else if (set->getPennyLanePresence() && m_hwInterface == QSDR::Metis) { + str = m_pennylaneString; + + if (m_dataEngineState == QSDR::DataEngineUp) + rect = QRect(x1, y1, m_pennylaneStringWidth + m_versionStringWidth, m_blankHeight); + else + rect = QRect(x1, y1, m_pennylaneStringWidth, m_blankHeight); + + drawGLRect(rect, m_textBackgroundColor, -2.0f); + + if (m_dataEngineState == QSDR::DataEngineUp) { + str.append(m_pennylaneVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else { +// if (m_dataEngineState == QSDR::DataEngineUp && m_hwInterface == QSDR::Metis) +// rect = QRect(x1, y1, m_penelopeStringWidth + m_versionStringWidth, m_blankHeight); +// else + rect = QRect(x1, y1, m_penelopeStringWidth, m_blankHeight); + + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + qglColor(QColor(0, 0, 0)); + } + + m_oglTextSmallItalic->renderText(x1, y1, 1.0f, str); + + + // Hermes status + str = m_hermesString; + + if(set->getPennyLanePresence()) + x1 += m_pennylaneStringWidth; + else + x1 += m_penelopeStringWidth; + + x1 += m_blankWidth; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + if(m_hwInterface == QSDR::Metis) { + + if(set->getPenelopePresence() || set->getPennyLanePresence()) + x1 += m_versionStringWidth; + + rect = QRect(x1, y1, m_hermesStringWidth, m_blankHeight); + } + else { + rect = QRect(x1, y1, m_hermesStringWidth + m_versionStringWidth, m_blankHeight); + } + } + else { + rect = QRect(x1, y1, m_hermesStringWidth, m_blankHeight); + } + + if (set->getHPSDRHardware() == 1) { + drawGLRect(rect, m_textBackgroundColor, -2.0f); + + if (m_dataEngineState == QSDR::DataEngineUp) { + str.append(m_hermesVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else { + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + qglColor(QColor(0, 0, 0)); + } + + //m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, 1.0f, str); + m_oglTextSmallItalic->renderText(x1, y1, 1.0f, str); + + + // Excalibur status + str = m_excaliburString; + +// if (m_dataEngineState == QSDR::DataEngineUp && set->getHermesPresence()) + if (m_dataEngineState == QSDR::DataEngineUp && m_hwInterface == QSDR::Hermes) + x1 += m_hermesStringWidth + m_versionStringWidth + m_blankWidth; + else + x1 += m_hermesStringWidth + m_blankWidth; + + //rect = QRect(x1, y1, m_hermesStringWidth + m_versionStringWidth, m_blankHeight); + rect = QRect(x1, y1, m_excaliburStringWidth, m_blankHeight); + + if (set->getExcaliburPresence() && m_hwInterface == QSDR::Metis) { + + drawGLRect(rect, m_textBackgroundColor, -2.0f); + if (m_dataEngineState == QSDR::DataEngineUp) { + + str.append(m_excaliburVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else { + + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + qglColor(QColor(0, 0, 0)); + } + //m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, 1.0f, str); + m_oglTextSmallItalic->renderText(x1, y1, 1.0f, str); + + + // Alex status + str = m_alexString; + //x1 += m_hermesStringWidth + m_versionStringWidth + m_blankWidth; + x1 += m_excaliburStringWidth + m_blankWidth; + + rect = QRect(x1, y1, m_alexStringWidth + m_blankWidth, m_blankHeight); + + if (set->getAlexPresence()) { + + drawGLRect(rect, m_textBackgroundColor, -2.0f); + if (m_dataEngineState == QSDR::DataEngineUp) { + + str.append(m_alexVersion); + qglColor(QColor(206, 236, 248)); + } + else + qglColor(QColor(0, 0, 0)); + } + else { + + drawGLRect(rect, QColor(68, 68, 68), -2.0f); + qglColor(QColor(0, 0, 0)); + } + //m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y1, 1.0f, str); + m_oglTextSmallItalic->renderText(x1, y1, 1.0f, str); +} + +void OGLDisplayPanel::paintLowerRegion() { + + QString str; + + GLint x1 = m_rxRect.left() + m_blankWidth; + GLint y2 = m_rxRect.height() - m_lowerRectY; + + // Attenuator + qglColor(QColor(106, 136, 148)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_AttnString); + + x1 += m_AttnWidth + 2*m_blankWidth; + if (m_mercuryAttenuator == 1) + str = "0 dB"; + else + str = "-20 dB"; + + int attnValueWidth = m_oglTextSmall->fontMetrics().tightBoundingRect(str).width(); + qglColor(m_activeTextColor); + m_oglTextSmallItalic->renderText(x1, y2, str); + + // Dither status + x1 += attnValueWidth + 5*m_blankWidth; + + if (m_dither == 1) + qglColor(m_activeTextColor); + else + qglColor(QColor(68, 68, 68)); + + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_ditherString); + + // Random status + x1 += m_ditherWidth + 5*m_blankWidth; + + if (m_random == 1) + qglColor(m_activeTextColor); + else + qglColor(QColor(68, 68, 68)); + + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_randomString); + + // Sample rate status + x1 += m_randomWidth + 10*m_blankWidth; + str = "%1"; + + qglColor(QColor(166, 196, 208)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, str.arg(m_sample_rate, 3, 10, QLatin1Char(' '))); + + int samplerateWidth = m_oglTextSmall->fontMetrics().tightBoundingRect(str.arg(m_sample_rate, 3, 10, QLatin1Char(' '))).width(); + x1 += samplerateWidth + 4*m_blankWidth; + + str = "kHz"; + int samplerateUnitWidth = m_oglTextSmall->fontMetrics().tightBoundingRect(str).width(); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, str); + + + // server modus status + x1 += samplerateUnitWidth + 10*m_blankWidth; + switch (m_serverMode) { + + case QSDR::DemoMode: + + str = "Demo mode"; + break; + + case QSDR::NoServerMode: + + str = "No Server mode"; + break; + + case QSDR::SDRMode: + + str = "SDR Mode"; + break; + + case QSDR::ChirpWSPR: + + str = "Chirp Dec"; + break; + + case QSDR::ChirpWSPRFile: + + str = "Chirp Dec File"; + break; + } + int serverModeStringWidth = m_oglTextSmall->fontMetrics().tightBoundingRect(str).width(); + + qglColor(QColor(166, 196, 208)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, str); + + if (m_hwInterface == QSDR::Metis) { + + x1 += serverModeStringWidth + 15*m_blankWidth; + + // 10 MHz source status + qglColor(QColor(106, 136, 148)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_10MHzString); + + x1 += m_10MHzWidth + 4*m_blankWidth; + qglColor(QColor(166, 196, 208)); + int src10MHStringWidth = m_oglTextSmall->fontMetrics().tightBoundingRect(m_src10mhz).width(); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_src10mhz); + + // 122.88 MHz source status + x1 += src10MHStringWidth + 10*m_blankWidth; + qglColor(QColor(106, 136, 148)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_12288MHzString); + + x1 += m_12288MHzWidth + 4*m_blankWidth; + qglColor(QColor(166, 196, 208)); + m_oglTextSmallItalic->renderText(x1 + m_blankWidth, y2, m_src122_88mhz); + } + else if (m_hwInterface == QSDR::Hermes) { + + //x1 += serverModeStringWidth + 10*m_blankWidth; + + //qglColor(QColor(166, 196, 208)); + //m_oglTextSmallItalic->renderText(x1, y2, m_hermesStepAttnString); + + //x1 += m_hermesStepAttnStringWidth + 2*m_blankWidth; + //y2 += 1; + + //QColor triCol; + //QColor onLCol = QColor(0x11, 0x6b, 0x7f);//QColor(26, 56, 168); + //QColor onHCol = QColor(0x51, 0xab, 0xbf);//QColor(66, 96, 208); + //QColor offCol = QColor(68, 68, 68); + + //if (m_dataEngineState == QSDR::DataEngineUp) + // triCol = QColor(156, 186, 198); + //else + // triCol = QColor(68, 68, 68); + + //QRect rect = QRect(x1, y2, 9, 10); + //drawGLTriangleLeft(rect, triCol, -2.0f); + //x1 += 10; + + //for (int i = 0; i < 31; i++) { + + // rect = QRect(x1 + i*4, y2, 3, 10); + // if (m_dataEngineState == QSDR::DataEngineUp) { + + // if (i < 19) + // drawGLRect(rect, onHCol, -2.0f); + // else + // drawGLRect(rect, onLCol, -2.0f); + // } + // else + // drawGLRect(rect, offCol, -2.0f); + //} + + //x1 += 124; + //rect = QRect(x1, y2, 9, 10); + //drawGLTriangleRight(rect, triCol, -2.0f); + + //if (m_dataEngineState == QSDR::DataEngineUp) + // qglColor(QColor(166, 196, 208)); + //else + // qglColor(QColor(0, 0, 0)); + + //x1 += 12; + //m_oglTextSmallItalic->renderText(x1, y2, "-19 dB"); + } +} + +void OGLDisplayPanel::paintRxRegion() { + + QString str; + + GLint x1 = m_rxRect.left() + 20; + GLint y1 = m_rxRect.top() + m_freqDigitsPosY; + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) { + + drawGLRect(m_rect, Qt::black, m_bkgColor2, -3.0f, false); + qglColor(m_activeTextColor); + } + else { + + drawGLRect(m_rect, QColor(0, 0, 0, 255), -3.0f); + qglColor(QColor(68, 68, 68)); + } + + str = "%1.%2"; + + int f1 = m_frequencyList[m_currentReceiver].freqMHz; + int f2 = m_frequencyList[m_currentReceiver].freqkHz; + + QString f1str = str.arg(f1/1000).arg(f1 - 1000 * (int)(f1/1000), 3, 10, QLatin1Char('0')); + + if (f1 / 1000 < 10) + x1 += m_blankWidthf1; + + m_freqStringLeftPos = x1; + m_oglTextFreq1->renderText(x1, y1, f1str); + + str = "%1"; + x1 = m_rxRect.left() + m_blankWidthf + 2*m_blankWidthf2; + + QString f2str = str.arg(f2, 3, 10, QLatin1Char('0')); + //int f2strWidth = m_oglTextFreq2->fontMetrics().tightBoundingRect(f2str).width(); + + m_oglTextFreq2->renderText(x1, y1 + 1, f2str); + + //x1 += f2strWidth + m_blankWidthf2; + x1 = m_rxRect.left() + m_blankWidthf + 6*m_blankWidthf2; + m_oglTextFreq1->renderText(x1, y1 - 1, "MHz"); + + // current mouse wheel step size + str = "step: %1"; + x1 += m_fUnitStringWidth + 4*m_blankWidthf2; + + m_oglTextNormal->renderText(x1, y1 + 2, str.arg(set->getValue1000(m_mouseWheelFreqStep, 0, "Hz"))); + + // current receiver + str = "Rx: %1"; + m_oglTextBig->renderText(x1, y1 + 1.5f * m_fonts.fontHeightBigFont, str.arg(m_currentReceiver + 1)); + + // frequency info + if (m_oldFreq != m_frequencyList[m_currentReceiver].frequency) { + + m_bandText = getHamBandTextString(set->getHamBandTextList(), false, m_frequencyList[m_currentReceiver].frequency); + m_oldFreq = m_frequencyList[m_currentReceiver].frequency; + } + + m_oglTextSmall->renderText(m_freqStringLeftPos, y1 + 1.75*m_fonts.fontHeightFreqFont1, m_bandText); +} + +void OGLDisplayPanel::paintSMeter() { + + GLint width = m_smeterRect.width(); + GLint height = m_smeterRect.height(); + GLint x1 = m_smeterRect.left(); + GLint x2 = x1 + width; + GLint y1 = m_smeterRect.top(); + GLint y2 = y1 + height; + + //float X = m_smeterRect.left() + width/2.0f; + //float Y = 370; + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glEnable(GL_LINE_SMOOTH); + + if (!m_smeterFBO || m_smeterUpdate || m_smeterRenew) { + + if (!m_smeterFBO || m_smeterRenew) { + + if (m_smeterFBO) { + + delete m_smeterFBO; + m_smeterFBO = 0; + } + + m_smeterFBO = new QGLFramebufferObject(m_sMeterWidth, height); + //DISPLAYPANEL_DEBUG << "m_smeterFBO generated."; + } + + m_smeterFBO->bind(); + renderSMeterScale(); + //renderSMeterB(); + m_smeterFBO->release(); + + m_smeterUpdate = false; + m_smeterRenew = false; + } + + QRect rect = QRect(m_rxRect.right() + m_sMeterOffset, 0, m_sMeterWidth, height); + //renderTexture(rect, m_smeterFBO->texture(), -1.0f); + renderTexture(rect, m_smeterFBO->texture(), -2.0f); + + // set a scissor box + glScissor(x1, size().height() - y2, x2, height); + glEnable(GL_SCISSOR_TEST); + + if (m_dataEngineState == QSDR::DataEngineUp) { + + // S-Meter hold value + glLineWidth(1); + + int min = (int)(m_sMeterMinValueB * m_unit); + int max = (int)(m_sMeterMaxValueB * m_unit); + min += min%2; + max += max%2; + + QRect bar = QRect(x1 + min, m_sMeterPosY + 4, max - min, 5); + if (min > 0) + drawGLRect(bar, QColor(255, 50, 50), QColor(255, 255, 50), true); + + glDisable(GL_LINE_SMOOTH); + glDisable(GL_BLEND); + glDisable(GL_MULTISAMPLE); + + /*if (min > 0) { + + for (int i = min; i <= max; i += 2) { + + glBegin(GL_LINES); + glVertex3i(x1 + i, m_sMeterPosY + 3, 0.0); + glVertex3i(x1 + i, m_sMeterPosY + 10, 0.0); + glEnd(); + } + }*/ + + // S-Meter needle + glLineWidth(2); + qglColor(QColor(255, 255, 255)); + if (m_sMeterValue > 0) { + + glBegin(GL_LINES); + glVertex3f(x1 + (int)(m_sMeterValue * m_unit), m_sMeterPosY - 15, 1.0f); + glVertex3f(x1 + (int)(m_sMeterValue * m_unit), m_sMeterPosY + 28, 1.0f); + glEnd(); + } + + // actual S-Meter value + glEnable(GL_MULTISAMPLE); + qglColor(m_activeTextColor); + + QString str = "%1"; + m_sMeterNumValueString = QString(str.arg(m_sMeterOrgValue, 0, 'f', 1)); + //m_oglTextBig->renderText(x1 + m_sMeterWidth - 85, 80, 3.0, m_sMeterNumValueString); + //m_oglTextNormal->renderText(x1 + m_sMeterWidth - 28, 86, 3.0, "dBm"); + m_oglTextBig->renderText(x1 + m_sMeterWidth - 85, 2, 3.0, m_sMeterNumValueString); + m_oglTextNormal->renderText(x1 + m_sMeterWidth - 28, 9, 3.0, "dBm"); + + glEnable(GL_MULTISAMPLE); + } + + // disable scissor box + glDisable(GL_SCISSOR_TEST); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + +void OGLDisplayPanel::renderSMeterA() { + + GLint width = m_smeterRect.width(); + GLint height = m_smeterRect.height(); + + GLint x1 = m_smeterRect.left(); + GLint y1 = m_smeterRect.top(); + GLint x2 = x1 + width; + GLint y2 = y1 + height; + + float X = (x2-x1)/2.0; + float Y = 370;//355.0; + + GLint mid = m_smeterRect.width()/2; + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) + //drawGLRect(QRect(0, 0, x2-x1, y2-y1), QColor(0, 0, 0, 255), QColor(0, 0, 90, 255), false); + drawGLRect(QRect(0, 0, x2-x1, y2-y1), Qt::black, m_bkgColor2, false); + //drawGLRect(QRect(0, 0, x2-x1, y2-y1), QColor(0, 0, 0, 255), QColor(15, 55, 75, 255), false); + else + drawGLRect(QRect(0, 0, x2-x1, y2-y1), Qt::black); + + glDisable(GL_MULTISAMPLE); + + //*********************************************************** + // center of S-Meter circles + + // circle 0, first half + float t = (float)(-156*ONEPI/256.0f); + float R0 = 320.0; + + if (m_dataEngineState == QSDR::DataEngineUp) + //qglColor(QColor(106, 136, 148)); + qglColor(QColor(180, 180, 180)); + else + qglColor(QColor(68, 68, 68)); + + glLineWidth(2); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_smeterVertices; ++i) { + + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + t += TWOPI / m_smeterVertices; + if ( t > -128*ONEPI/256.0f) break; + } + glEnd(); + + // circle 0, second half + R0 = 321.0; + t = (float)(-126*ONEPI/256.0); + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(105, 110, 250)); + else + qglColor(QColor(68, 68, 68)); + + glLineWidth(3); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_smeterVertices; ++i) { + + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + t += TWOPI / m_smeterVertices; + if ( t > -99*ONEPI/256.0f) break; + } + glEnd(); + + // circle 1 + if (m_dataEngineState == QSDR::DataEngineUp) + //qglColor(QColor(106, 136, 148)); + qglColor(QColor(180, 180, 180)); + else + qglColor(QColor(68, 68, 68)); + + glLineWidth(2); + float R1 = 312.0; + t = (float)(-156*ONEPI/256.0f); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_smeterVertices; ++i) { + + glVertex3f(X + R1 * qCos(t), Y + R1 * qSin(t), 0.0); + t += TWOPI / m_smeterVertices; + if ( t > -99*ONEPI/256.0f) break; + } + glEnd(); + + + // circle 2 + /*if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(106, 136, 148)); + else + qglColor(QColor(68, 68, 68)); + + glLineWidth(2); + float R2 = 290.0; + t = -156*ONEPI/256.0f; + glBegin(GL_LINE_STRIP); + for (int i = 0; i < numVertices; ++i) { + + glVertex3f(X + R2 * qCos(t), Y + R2 * qSin(t), 0.0); + t += TWOPI / numVertices; + if ( t > -99*ONEPI/256.0f) break; + } + glEnd();*/ + + + // circle 3 + /*if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(106, 136, 148)); + else + qglColor(QColor(68, 68, 68)); + + glLineWidth(2); + float R3 = 270.0; + t = -156*ONEPI/256.0f; + glBegin(GL_LINE_STRIP); + for (int i = 0; i < numVertices; ++i) { + + glVertex3f(X + R3 * qCos(t), Y + R3 * qSin(t), 0.0); + t += TWOPI / numVertices; + if ( t > -99*ONEPI/256.0f) break; + } + glEnd();*/ + + + // S-Meter ticks + if (m_dataEngineState == QSDR::DataEngineUp) + //qglColor(QColor(106, 136, 148)); + qglColor(QColor(180, 180, 180)); + else + qglColor(QColor(68, 68, 68)); + + QFontMetrics fm = m_oglTextNormal->fontMetrics(); + + m_oglTextBigItalic->renderText(X - mid + 30, Y - R0, "S"); + + t = (float)(-152*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + int d = fm.width("1"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "1"); + + t = (float)(-149*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + t = (float)(-146*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + d = fm.width("3"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "3"); + + t = (float)(-143*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + t = (float)(-140*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + d = fm.width("5"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "5"); + + t = (float)(-137*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + t = (float)(-134*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + d = fm.width("7"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "7"); + + t = (float)(-131*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + t = (float)(-ONEPI/2.0f); + glBegin(GL_LINES); + glVertex3f(X + (R0-1) * qCos(t), Y + (R0-1) * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + d = fm.width("9"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "9"); + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(85, 90, 250)); + else + qglColor(QColor(68, 68, 68)); + + t = (float)(-123*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + t = (float)(-118*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + d = fm.width("+20"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "+20"); + + t = (float)(-113*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + t = (float)(-108*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+11) * qCos(t), Y + (R0+11) * qSin(t), 0.0); + glEnd(); + + d = fm.width("+40"); + m_oglTextNormal->renderText(X + (R0+28) * qCos(t) - d/2, Y + (R0+28) * qSin(t), "+40"); + + t = (float)(-103*ONEPI/256.0f); + glBegin(GL_LINES); + glVertex3f(X + R0 * qCos(t), Y + R0 * qSin(t), 0.0); + glVertex3f(X + (R0+7) * qCos(t), Y + (R0+7) * qSin(t), 0.0); + glEnd(); + + m_oglTextBigItalic->renderText(X + mid - 35, Y - R0, "dB"); + + glEnable(GL_MULTISAMPLE); +} + +void OGLDisplayPanel::renderSMeterScale() { + + GLint width = m_sMeterWidth; + GLint height = m_smeterRect.height(); + + GLint x1 = m_smeterRect.left(); + GLint y1 = m_smeterRect.top(); + GLint x2 = x1 + width; + GLint y2 = y1 + height; + + QFontMetrics fm = m_oglTextNormal->fontMetrics(); + + //int fontHeight = fm.tightBoundingRect("S9").height(); + //int fontMaxWidth = fm.boundingRect("-000").width(); + + qreal dBmRange = qAbs(m_dBmPanMax - m_dBmPanMin); + m_unit = (qreal)(m_sMeterWidth / dBmRange); + + QRect rect = QRect(0, 0, x2-x1, y2-y1); + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) + drawGLRect(rect, Qt::black, m_bkgColor2, -3.0f, false); + else + drawGLRect(rect, Qt::black); + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0f); + + // draw horizontal lines + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor); + + glBegin(GL_LINES); + glVertex3f(0, m_sMeterPosY, 0.0); + glVertex3f(width-1, m_sMeterPosY, 0.0); + glVertex3f(0, m_sMeterPosY + 12, 0.0); + glVertex3f(width-1, m_sMeterPosY + 12, 0.0); + glEnd(); + + // draw integer step scale + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(126, 156, 168)); + else + qglColor(m_inactiveTextColor); + + int vertexArrayLength = m_sMeterWidth; + vertexArrayLength += vertexArrayLength%2; + TGL3float *vertexArray = new TGL3float[2*vertexArrayLength]; + + for (int i = 0; i < vertexArrayLength; i++) { + + vertexArray[2*i].x = (GLfloat)(2.0f * i); + vertexArray[2*i].y = (GLfloat)(m_sMeterPosY + 4); + vertexArray[2*i].z = 0.0; + + vertexArray[2*i+1].x = (GLfloat)(2.0f * i); + vertexArray[2*i+1].y = (GLfloat)(m_sMeterPosY + 9); + vertexArray[2*i+1].z = 0.0; + } + + glEnableClientState(GL_VERTEX_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, width); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + + // Draw the dbm items + QString marker; + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor); + + for (int i = 1, z = -120; z < 10; i++, z += 10) { + + // big ticks + glBegin(GL_LINES); + glVertex3f(10*i*m_unit, m_sMeterPosY - 4, 0.0); + glVertex3f(10*i*m_unit, m_sMeterPosY, 0.0); + glEnd(); + + // small ticks + glBegin(GL_LINES); + glVertex3f((10*i - 5)*m_unit, m_sMeterPosY - 2, 0.0); + glVertex3f((10*i - 5)*m_unit, m_sMeterPosY, 0.0); + glEnd(); + + marker = QString::number(z, 'f', 0); + int d = fm.width(marker); + + if (z == -120 || z == -100 || z == -80 || z == -60 || z == -40 || z == -20) + m_oglTextNormal->renderText(10*i*m_unit-d/2-2, m_sMeterPosY - 18, marker); + + if (m_sMeterWidth > 500) { + + if (z == -110 || z == -90 || z == -70 || z == -50 || z == -30 || z == -10) + m_oglTextNormal->renderText(10*i*m_unit-d/2-2, m_sMeterPosY - 18, marker); + } + + if (m_sMeterWidth > 400) + if (z == 0) m_oglTextNormal->renderText(10*i*m_unit-d/2, m_sMeterPosY - 18, marker); + } + + m_oglTextSmallItalic->renderText(m_sMeterWidth - 25, m_sMeterPosY - 16, "dBm"); + + // Draw the S1..S9 value items + for (int i = 0; i < 17; i++) { + + if (i < 10) { + + glBegin(GL_LINES); + glVertex3f((6*i + 3)*m_unit, m_sMeterPosY + 12, 0.0f); + glVertex3f((6*i + 3)*m_unit, m_sMeterPosY + 17, 0.0f); + glEnd(); + + marker = "S1"; + int d = fm.width(marker); + + if (i == 1) { + + m_oglTextNormal->renderText((6*(i+1) - d/2 + 1)*m_unit, m_sMeterPosY + 18, marker); + } + else if (i == 3) { + + marker = "S3"; + m_oglTextNormal->renderText((6*(i+1) - d/2 + 1)*m_unit, m_sMeterPosY + 18, marker); + } + else if (i == 5) { + + marker = "S5"; + m_oglTextNormal->renderText((6*(i+1) - d/2 + 1)*m_unit, m_sMeterPosY + 18, marker); + } + else if (i == 7) { + + marker = "S7"; + m_oglTextNormal->renderText((6*(i+1) - d/2 + 1)*m_unit, m_sMeterPosY + 18, marker); + } + else if (i == 9) { + + marker = "S9"; + m_oglTextNormal->renderText((6*(i+1) - d/2 + 1)*m_unit, m_sMeterPosY + 18, marker); + } + } + else { + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(255, 80, 80)); + //qglColor(QColor(55, 180, 220)); + else + qglColor(m_inactiveTextColor); + + int idx = (10*i - 33)*m_unit; + glBegin(GL_LINES); + glVertex3f(idx, m_sMeterPosY + 12, 0.0); + glVertex3f(idx, m_sMeterPosY + 17, 0.0); + glEnd(); + + marker = "+20"; + int d = fm.width(marker); + + if (i == 11) { + m_oglTextNormal->renderText(idx - d/2 - 2, m_sMeterPosY + 18, marker); + } + else if (i == 13) { + + marker = "+40"; + m_oglTextNormal->renderText(idx - d/2 - 2, m_sMeterPosY + 18, marker); + } + else if (i == 15) { + + marker = "+60"; + m_oglTextNormal->renderText(idx - d/2 - 2, m_sMeterPosY + 18, marker); + } + /*else if (i == 17) { + + marker = "+80"; + m_oglTextNormal->renderText(idx - d/2 - 2, m_sMeterPosY + 18, marker); + }*/ + } + } + + glBegin(GL_LINES); + glVertex3f(57*m_unit+1, m_sMeterPosY+12, 0.0); + glVertex3f(width-1, m_sMeterPosY+12, 0.0); + glEnd(); + + /*if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor);*/ + + glEnable(GL_LINE_SMOOTH); + glEnable(GL_MULTISAMPLE); +} + +void OGLDisplayPanel::renderSMeterB() { + + //GLint width = m_smeterRect.width(); + GLint width = m_sMeterWidth; + GLint height = m_smeterRect.height(); + + //GLint x1 = m_smeterRect.left(); + GLint x1 = m_smeterRect.left() + m_sMeterOffset; + GLint y1 = m_smeterRect.top(); + GLint x2 = x1 + width; + GLint y2 = y1 + height; + + QFontMetrics fm = m_oglTextNormal->fontMetrics(); + + int vertexArrayLength = width/2; + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) + drawGLRect(QRect(0, 0, x2-x1, y2-y1), Qt::black, m_bkgColor2, -3.0f, false); + else + drawGLRect(QRect(0, 0, x2-x1, y2-y1), Qt::black); + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0f); + + // Draw horizontal lines + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor); + + glBegin(GL_LINES); + glVertex3f(0, m_sMeterPosY, 0.0); + glVertex3f(width-1, m_sMeterPosY, 0.0); + glVertex3f(0, m_sMeterPosY + 12, 0.0); + glVertex3f(width-1, m_sMeterPosY + 12, 0.0); + glEnd(); + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(100, 100, 100)); + else + qglColor(m_inactiveTextColor); + + TGL3float *vertexArray = new TGL3float[width]; + + for (int i = 0; i < vertexArrayLength; i++) { + + vertexArray[2*i].x = (GLfloat)(2.0f * i); + vertexArray[2*i].y = (GLfloat)(m_sMeterPosY + 3); + vertexArray[2*i].z = 0.0; + + vertexArray[2*i+1].x = (GLfloat)(2.0f * i); + vertexArray[2*i+1].y = (GLfloat)(m_sMeterPosY + 10); + vertexArray[2*i+1].z = 0.0; + } + + glEnableClientState(GL_VERTEX_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, width); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + + // Draw the S1..S9 value items + //int d; + //int markerSpacing = 24; // spacing for the S value items + //int markerSpacing = m_sMeterWidth/12.5f; // spacing for the S value items + float markerSpacing = qRound(m_sMeterWidth/12.5f); // spacing for the S value items + //DISPLAYPANEL_DEBUG << "S markerSpacing:" << markerSpacing; + + QString marker; + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor); + + //for (int x = 21, y = 9, z = 0; z < 5; x += markerSpacing, y += markerSpacing, z++) { + for (int x = markerSpacing - 3, y = x - markerSpacing/2, z = 0; z < 5; x += markerSpacing, y += markerSpacing, z++) { + + if (z == 0) marker = "S1"; + else if (z == 1) marker = "S3"; + else if (z == 2) marker = "S5"; + else if (z == 3) marker = "S7"; + else if (z == 4) marker = "S9"; + + // big ticks + glBegin(GL_LINES); + glVertex3f(x, m_sMeterPosY + 12, 0.0); + glVertex3f(x, m_sMeterPosY + 16, 0.0); + glEnd(); + + // small ticks + glBegin(GL_LINES); + glVertex3f(y, m_sMeterPosY + 12, 0.0); + glVertex3f(y, m_sMeterPosY + 15, 0.0); + glEnd(); + + // S strings + //d = fm.width(marker); + m_oglTextNormal->renderText(x-7, m_sMeterPosY + 18, marker); + } + + // Draw the S+ value items + //markerSpacing = 20; + markerSpacing = qRound(m_sMeterWidth/15.0f); + //DISPLAYPANEL_DEBUG << "S+ markerSpacing:" << markerSpacing; + + for (int x = 118 + markerSpacing, y = 128 + markerSpacing, z = 0; z < 8; x += markerSpacing, y += 2 * markerSpacing, z++) { + //for (int x = next + markerSpacing, y = next + markerSpacing/2, z = 0; z < 8; x += markerSpacing, y += 2 * markerSpacing, z++) { + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor); + + if (z == 0) marker = "+20"; + else if (z == 1) marker = "+40"; + else if (z == 2) marker = "+60"; + else if (z == 3) marker = "+80"; + + // big ticks + glBegin(GL_LINES); + glVertex3f(x, m_sMeterPosY + 12, 0.0); + glVertex3f(x, m_sMeterPosY + 16, 0.0); + glEnd(); + + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(QColor(255, 80, 80)); + else + qglColor(QColor(68, 68, 68)); + + m_oglTextNormal->renderText(y, m_sMeterPosY + 18, marker); + } + + // Draw the dbm items + if (m_dataEngineState == QSDR::DataEngineUp) + qglColor(m_activeTextColor); + else + qglColor(m_inactiveTextColor); + + //for (int x = 4, y = 14, z = -130; z < 10; x += markerSpacing, y += markerSpacing, z += 10) { + for (int x = markerSpacing - 16, y = x + markerSpacing/2, z = -130; z < 10; x += markerSpacing, y += markerSpacing, z += 10) { + + marker = QString::number(z, 'f', 0); + int d = fm.width(marker); + + // big ticks + glBegin(GL_LINES); + glVertex3f(x, m_sMeterPosY - 4, 0.0); + glVertex3f(x, m_sMeterPosY, 0.0); + glEnd(); + + // small ticks + glBegin(GL_LINES); + glVertex3f(y, m_sMeterPosY - 2, 0.0); + glVertex3f(y, m_sMeterPosY, 0.0); + glEnd(); + + if (z == -120 || z == -100 || z == -80 || z == -60 || z == -40 || z == -20) + m_oglTextNormal->renderText(x-d/2-2, m_sMeterPosY - 18, marker); + + if (z == 0) m_oglTextNormal->renderText(x-d/2-1, m_sMeterPosY - 18, marker); + } + + m_oglTextSmallItalic->renderText(width - 25, m_sMeterPosY - 16, "dBm"); + + glEnable(GL_LINE_SMOOTH); + glEnable(GL_MULTISAMPLE); +} + +//void OGLDisplayPanel::renderSMeterB() { +// +// //GLint width = m_smeterRect.width(); +// GLint width = m_sMeterWidth; +// GLint height = m_smeterRect.height(); +// +// GLint x1 = m_smeterRect.left(); +// GLint y1 = m_smeterRect.top(); +// GLint x2 = x1 + width; +// GLint y2 = y1 + height; +// +// QFontMetrics fm = m_oglTextNormal->fontMetrics(); +// +// int vertexArrayLength = width/2; +// +// // draw background +// if (m_dataEngineState == QSDR::DataEngineUp) +// drawGLRect(QRect(0, 0, x2-x1, y2-y1), Qt::black, m_bkgColor2, -3.0f, false); +// else +// drawGLRect(QRect(0, 0, x2-x1, y2-y1), Qt::black); +// +// glDisable(GL_MULTISAMPLE); +// glDisable(GL_LINE_SMOOTH); +// glLineWidth(1.0f); +// +// // Draw horizontal lines +// if (m_dataEngineState == QSDR::DataEngineUp) +// qglColor(m_activeTextColor); +// else +// qglColor(QColor(68, 68, 68)); +// +// glBegin(GL_LINES); +// glVertex3f(0, m_sMeterPosY, 0.0); +// glVertex3f(width-1, m_sMeterPosY, 0.0); +// glVertex3f(0, m_sMeterPosY + 12, 0.0); +// glVertex3f(width-1, m_sMeterPosY + 12, 0.0); +// glEnd(); +// +// if (m_dataEngineState == QSDR::DataEngineUp) +// qglColor(QColor(100, 100, 100)); +// else +// qglColor(QColor(68, 68, 68)); +// +// TGL3float *vertexArray = new TGL3float[width]; +// +// for (int i = 0; i < vertexArrayLength; i++) { +// +// vertexArray[2*i].x = (GLfloat)(2.0f * i); +// vertexArray[2*i].y = (GLfloat)(m_sMeterPosY + 3); +// vertexArray[2*i].z = 0.0; +// +// vertexArray[2*i+1].x = (GLfloat)(2.0f * i); +// vertexArray[2*i+1].y = (GLfloat)(m_sMeterPosY + 10); +// vertexArray[2*i+1].z = 0.0; +// } +// +// glEnableClientState(GL_VERTEX_ARRAY); +// +// glVertexPointer(3, GL_FLOAT, 0, vertexArray); +// glDrawArrays(GL_LINES, 0, width); +// glDisableClientState(GL_VERTEX_ARRAY); +// +// delete[] vertexArray; +// +// // Draw the S1..S9 value items +// int d; +// //int markerSpacing = 24; // spacing for the S value items +// int markerSpacing = m_sMeterWidth/12.5f; // spacing for the S value items +// QString marker; +// +// if (m_dataEngineState == QSDR::DataEngineUp) +// qglColor(m_activeTextColor); +// else +// qglColor(QColor(68, 68, 68)); +// +// for (int x = 21, y = 9, z = 0; z < 5; x += markerSpacing, y += markerSpacing, z++) { +// +// if (z == 0) marker = "S1"; +// else if (z == 1) marker = "S3"; +// else if (z == 2) marker = "S5"; +// else if (z == 3) marker = "S7"; +// else if (z == 4) marker = "S9"; +// +// // big ticks +// glBegin(GL_LINES); +// glVertex3f(x, m_sMeterPosY + 12, 0.0); +// glVertex3f(x, m_sMeterPosY + 16, 0.0); +// glEnd(); +// +// // small ticks +// glBegin(GL_LINES); +// glVertex3f(y, m_sMeterPosY + 12, 0.0); +// glVertex3f(y, m_sMeterPosY + 15, 0.0); +// glEnd(); +// +// // S strings +// //d = fm.width(marker); +// m_oglTextNormal->renderText(x-7, m_sMeterPosY + 18, marker); +// } +// +// // Draw the S+ value items +// //markerSpacing = 20; +// markerSpacing = m_sMeterWidth/15; +// +// for (int x = 118 + markerSpacing, y = 128 + markerSpacing, z = 0; z < 8; x += markerSpacing, y += 2 * markerSpacing, z++) { +// +// if (m_dataEngineState == QSDR::DataEngineUp) +// qglColor(m_activeTextColor); +// else +// qglColor(QColor(68, 68, 68)); +// +// if (z == 0) marker = "+20"; +// else if (z == 1) marker = "+40"; +// else if (z == 2) marker = "+60"; +// else if (z == 3) marker = "+80"; +// +// // big ticks +// glBegin(GL_LINES); +// glVertex3f(x, m_sMeterPosY + 12, 0.0); +// glVertex3f(x, m_sMeterPosY + 16, 0.0); +// glEnd(); +// +// // small ticks +// /*glBegin(GL_LINES); +// glVertex3f(y, 42, 0.0); +// glVertex3f(y, 45, 0.0); +// glEnd();*/ +// +// if (m_dataEngineState == QSDR::DataEngineUp) +// qglColor(QColor(255, 80, 80)); +// else +// qglColor(QColor(68, 68, 68)); +// +// m_oglTextNormal->renderText(y, m_sMeterPosY + 18, marker); +// } +// +// // Draw the dbm items +// for (int x = 4, y = 14, z = -130; z < 10; x += markerSpacing, y += markerSpacing, z += 10) { +// +// if (m_dataEngineState == QSDR::DataEngineUp) +// qglColor(m_activeTextColor); +// else +// qglColor(QColor(68, 68, 68)); +// +// marker = QString::number(z, 'f', 0); +// int d = fm.width(marker); +// +// // big ticks +// glBegin(GL_LINES); +// glVertex3f(x, m_sMeterPosY - 4, 0.0); +// glVertex3f(x, m_sMeterPosY, 0.0); +// glEnd(); +// +// // small ticks +// glBegin(GL_LINES); +// glVertex3f(y, m_sMeterPosY - 2, 0.0); +// glVertex3f(y, m_sMeterPosY, 0.0); +// glEnd(); +// +// if (z == -120 || z == -100 || z == -80 || z == -60 || z == -40 || z == -20) +// m_oglTextNormal->renderText(x-d/2-2, m_sMeterPosY - 18, marker); +// +// if (z == 0) m_oglTextNormal->renderText(x-d/2-1, m_sMeterPosY - 18, marker); +// } +// +// m_oglTextSmallItalic->renderText(width - 25, m_sMeterPosY - 16, "dBm"); +// +// glEnable(GL_MULTISAMPLE); +//} + +//*********************************************** +void OGLDisplayPanel::setSMeterValue(int rx, float value) { + + Q_UNUSED(rx) + + //qDebug() << "setSMeterValue = " << value; + if (m_SMeterA) { + +// float tmp = (0.444f * value - 111.111f) * ONEPI/256.0f; +// +// if (m_sMeterTimer.elapsed() > 40) { +// +// if (tmp < m_sMeterMinValueA) m_sMeterMinValueA = tmp; +// +// if (tmp > m_sMeterMaxValueA) m_sMeterMaxValueA = tmp; +// +// int elapsedTimeMax = m_sMeterMaxTimer.elapsed(); +// if (elapsedTimeMax > m_sMeterHoldTime) { +// +// if (m_sMeterPrevHoldTimeMax <= 0) +// m_sMeterPrevHoldTimeMax = 1500; +// +// m_sMeterMaxValueA -= (float)(elapsedTimeMax - m_sMeterPrevHoldTimeMax) / 40; +// m_sMeterPrevHoldTimeMax = elapsedTimeMax; +// +// if ((qRound(m_sMeterMaxValueA) <= qRound(tmp)) || (m_sMeterMaxValueA <= tmp)) { +// +// m_sMeterMaxValueA = tmp; +// m_sMeterMaxTimer.restart(); +// m_sMeterPrevHoldTimeMax = 0; +// } +// } +// +// if (m_sMeterMinTimer.elapsed() > m_sMeterHoldTime) { +// +// m_sMeterMinValueA = tmp; +// m_sMeterMinTimer.restart(); +// } +// +// m_sMeterValue = tmp * 0.13f + m_sMeterValue * 0.87f; +// +// QString str = "%1"; +// //m_sMeterNumValueString = QString(str.arg(value, 0, 'g', 3)); +// //qDebug() << "m_sMeterValue" << value; +// +// update(); +// m_sMeterTimer.restart(); +// } + } + else { + + //float tmp = (1.00423f * value + 93.3932f); + float tmp; + if (m_mercuryAttenuator) + //tmp = (1.67f * value + 156.237f); + tmp = (1.06962f * value + 99.1537f); + else + //tmp = (1.06962f * value + 99.1537f); + tmp = (1.67f * value + 156.237f); + + //qDebug() << "S-Meter tmp = " << tmp; + if (m_sMeterTimer.elapsed() > 40) { + + if (tmp < m_sMeterMinValueB) m_sMeterMinValueB = tmp; + + if (tmp > m_sMeterMaxValueB) m_sMeterMaxValueB = tmp; + + /*if (m_sMeterMaxTimer.elapsed() > m_sMeterHoldTime) { + + m_sMeterMaxValueB = tmp; + m_sMeterMaxTimer.restart(); + }*/ + + int elapsedTimeMax = m_sMeterMaxTimer.elapsed(); + if (elapsedTimeMax > m_sMeterHoldTime) { + + if (m_sMeterPrevHoldTimeMax <= 0) + m_sMeterPrevHoldTimeMax = m_sMeterHoldTime; + + // slowly reduce the peak hold level (taken from SDRMAX3 by (c) Cathy Moss) + m_sMeterMaxValueB -= (float)(elapsedTimeMax - m_sMeterPrevHoldTimeMax) / 15; + m_sMeterPrevHoldTimeMax = elapsedTimeMax; + + if ((qRound(m_sMeterMaxValueB) <= qRound(tmp)) || (m_sMeterMaxValueB <= tmp)) { + + m_sMeterMaxValueB = tmp; + m_sMeterMaxTimer.restart(); + m_sMeterPrevHoldTimeMax = 0; + } + } + + int elapsedTimeMin = m_sMeterMinTimer.elapsed(); + if (elapsedTimeMin > m_sMeterHoldTime) { + + if (m_sMeterPrevHoldTimeMin <= 0) + m_sMeterPrevHoldTimeMin = m_sMeterHoldTime; + + // slowly increase the minimum hold level (taken from SDRMAX3 by (c) Cathy Moss) + m_sMeterMinValueB += (float)(elapsedTimeMin - m_sMeterPrevHoldTimeMin) / 15; + m_sMeterPrevHoldTimeMin = elapsedTimeMin; + + if ((qRound(m_sMeterMinValueB) >= qRound(tmp)) || (m_sMeterMinValueB >= tmp)) { + + m_sMeterMinValueB = tmp; + m_sMeterMinTimer.restart(); + m_sMeterPrevHoldTimeMin = 0; + } + } + + /*if (m_sMeterMinTimer.elapsed() > m_sMeterHoldTime) { + + m_sMeterMinValueB = tmp; + m_sMeterMinTimer.restart(); + }*/ + + m_sMeterValue = tmp * 0.13f + m_sMeterValue * 0.87f; + //qDebug() << "scaled m_sMeterValue " << m_sMeterValue; + + if (m_sMeterDisplayTime.elapsed() > 200) { + + if (m_mercuryAttenuator) + //m_sMeterOrgValue = value - 17.7f; + m_sMeterOrgValue = value - 37.7f; + else + //m_sMeterOrgValue = value - 37.7f; + m_sMeterOrgValue = value - 17.7f; + + m_sMeterDisplayTime.restart(); + } + //m_sMeterOrgValue = value - 37.7f; + + /*m_sMeterMeanValue+= value; + m_sMeterMeanValueCnt++; + + if (m_sMeterMeanValueCnt > 100) { + + qDebug() << "m_sMeterMeanValue" << m_sMeterMeanValue/100; + m_sMeterMeanValue = 0.0f; + m_sMeterMeanValueCnt = 0; + }*/ + //qDebug() << " tmp" << tmp; + + update(); + m_sMeterTimer.restart(); + } + } +} + +void OGLDisplayPanel::setupDisplayRegions(QSize size) { + + int width = size.width(); + int height = size.height(); + + m_sMeterWidth = (int)(0.8f*(width - m_rxRectWidth)); + + if (m_sMeterWidth < 300) m_sMeterWidth = 300; + if (m_sMeterWidth > 600) m_sMeterWidth = 600; + + int d = 320 - m_sMeterWidth; + if (d > 0) + m_sMeterOffset = (int)(width - m_rxRectWidth - m_sMeterWidth)/2.0f; + else + m_sMeterOffset = width - m_rxRectWidth - m_sMeterWidth - 40; + + //m_sMeterOffset = 0; + + m_rect = QRect(0, 0, width, height); + m_rxRect = QRect(0, 0, m_rxRectWidth, height); + m_smeterRect = QRect(m_rxRect.right() + m_sMeterOffset, 0, width - m_rxRectWidth, height); + + //DISPLAYPANEL_DEBUG << "m_sMeterWidth:" << m_sMeterWidth; + //DISPLAYPANEL_DEBUG << " d:" << d; + //DISPLAYPANEL_DEBUG << "m_smeterRectWidth:" << m_smeterRect.width(); + //DISPLAYPANEL_DEBUG << "m_sMeterOffset:" << m_sMeterOffset; + + int x = m_rxRect.left() + 20; + int y = m_rxRect.top() + m_freqDigitsPosY + 10; + + m_freg10000000 = QRegion(QRect(x, y, m_blankWidthf1, m_fonts.fontHeightFreqFont1)); + + x += m_blankWidthf1; + m_freg1000000 = QRegion(QRect(x, y, m_blankWidthf1, m_fonts.fontHeightFreqFont1)); + + x += m_blankWidthf1; + m_freg100000 = QRegion(QRect(x, y, m_blankWidthf1, m_fonts.fontHeightFreqFont1)); + + x += m_blankWidthf1 + m_pointStringWidth; + m_freg10000 = QRegion(QRect(x, y, m_blankWidthf1, m_fonts.fontHeightFreqFont1)); + + x += m_blankWidthf1; + m_freg1000 = QRegion(QRect(x, y, m_blankWidthf1, m_fonts.fontHeightFreqFont1)); + + //x += m_blankWidthf1; + x = m_rxRect.left() + m_blankWidthf + 2*m_blankWidthf2; + m_freg100 = QRegion(QRect(x, y, m_blankWidthf2, m_fonts.fontHeightFreqFont2)); + + x += m_blankWidthf2; + m_freg10 = QRegion(QRect(x, y, m_blankWidthf2, m_fonts.fontHeightFreqFont2)); + + x += m_blankWidthf2; + m_freg1 = QRegion(QRect(x, y, m_blankWidthf2, m_fonts.fontHeightFreqFont2)); + + m_smeterRenew = true; +} + +void OGLDisplayPanel::getSelectedDigit(QPoint p) { + + if (m_freg1.contains(p)) + m_digitPosition = Freq1; + else + if (m_freg10.contains(p)) + m_digitPosition = Freq10; + else + if (m_freg100.contains(p)) + m_digitPosition = Freq100; + else + if (m_freg1000.contains(p)) + m_digitPosition = Freq1000; + else + if (m_freg10000.contains(p)) + m_digitPosition = Freq10000; + else + if (m_freg100000.contains(p)) + m_digitPosition = Freq100000; + else + if (m_freg1000000.contains(p)) + m_digitPosition = Freq1000000; + else + if (m_freg10000000.contains(p)) + m_digitPosition = Freq10000000; + else + m_digitPosition = None; +} + +//*********************************************** +void OGLDisplayPanel::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::mousePressEvent(QMouseEvent *event) { + + QPoint pos = event->pos(); + + //if (m_serverMode != QSDR::ExternalDSP) { + + getSelectedDigit(pos); + switch (m_digitPosition) { + + case Freq1: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 1.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 5.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 1.0); + } + break; + + case Freq10: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 10.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 50.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 10.0); + } + break; + + case Freq100: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 100.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 500.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 100.0); + } + break; + + case Freq1000: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 1000.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 5000.0); + else if (set->getMouseWheelFreqStep(m_currentReceiver) == 5000.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 9000.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 1000.0); + } + break; + + case Freq10000: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 10000.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 50000.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 10000.0); + } + break; + + case Freq100000: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 100000.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 500000.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 100000.0); + } + break; + + case Freq1000000: + if (event->buttons() == Qt::LeftButton) { + if (set->getMouseWheelFreqStep(m_currentReceiver) == 1000000.0) + set->setMouseWheelFreqStep(this, m_currentReceiver, 5000000.0); + else + set->setMouseWheelFreqStep(this, m_currentReceiver, 1000000.0); + } + break; + + case Freq10000000: + case None: + return; + } + + //} + + QWidget::mousePressEvent(event); +} + +void OGLDisplayPanel::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::mouseMoveEvent(QMouseEvent *event) { + + QPoint pos = event->pos(); + + QColor oldDigitColor = m_digitColor; + + //if (m_serverMode != QSDR::ExternalDSP) { + + getSelectedDigit(pos); + switch (m_digitPosition) { + + case Freq1: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq10: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq100: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq1000: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq10000: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq100000: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq1000000: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case Freq10000000: + setCursor(Qt::PointingHandCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(136, 166, 178); + else + m_digitColor = QColor(98, 98, 98); + break; + + case None: + setCursor(Qt::ArrowCursor); + if (m_dataEngineState == QSDR::DataEngineUp) + m_digitColor = QColor(106, 136, 148); + else + m_digitColor = QColor(68, 68, 68); + + break; + } + //} + + if (oldDigitColor != m_digitColor) update(); + + QGLWidget::mouseMoveEvent(event); +} + +void OGLDisplayPanel::wheelEvent(QWheelEvent * event) { + + //if (m_serverMode != QSDR::ExternalDSP) { + + long deltaF = 0; + switch (m_digitPosition) { + + case Freq1: + deltaF = 1; + break; + + case Freq10: + deltaF = 10; + break; + + case Freq100: + deltaF = 100; + break; + + case Freq1000: + deltaF = 1000; + break; + + case Freq10000: + deltaF = 10000; + break; + + case Freq100000: + deltaF = 100000; + break; + + case Freq1000000: + deltaF = 1000000; + break; + + case Freq10000000: + deltaF = 10000000; + break; + + case None: + return; + } + + int numDegrees = event->delta() / 8; + int numSteps = numDegrees / 15; + + int f1 = m_frequencyList[m_currentReceiver].freqMHz; + int f2 = m_frequencyList[m_currentReceiver].freqkHz; + + long newFreq = -1; + if (deltaF > 0) + //newFreq = frequency1 * 1000 + frequency2 + numSteps * deltaF; + newFreq = f1 * 1000 + f2 + numSteps * deltaF; + + if (newFreq < MAXFREQUENCY && newFreq >= 0) { + + if (set->getPanLockedStatus(m_currentReceiver)) { + + long ctrf = set->getCtrFrequency(m_currentReceiver); + int s = set->getSampleRate()/2; + if (newFreq > ctrf + s) + newFreq = ctrf + s; + else if (newFreq < ctrf - s) + newFreq = ctrf - s; + + set->setVFOFrequency(this, 0, m_currentReceiver, newFreq); + } + else + set->setVFOFrequency(this, 1, m_currentReceiver, newFreq); + } + + //qDebug() << "set frequency for rx" << m_currentReceiver; + + //} + event->accept(); + QGLWidget::wheelEvent(event); +} + +void OGLDisplayPanel::keyPressEvent(QKeyEvent* event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::closeEvent(QCloseEvent *event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::showEvent(QShowEvent *event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::timerEvent(QTimerEvent *event) { + + Q_UNUSED(event) +} + +void OGLDisplayPanel::setSMeterHoldTime(int value) { + + m_sMeterHoldTime = value; +} + +void OGLDisplayPanel::setSyncStatus(int value) { + + m_syncStatus = value; + update(); + + //QTimer::singleShot(50, this, SLOT(updateSyncStatus())); +} + +void OGLDisplayPanel::updateSyncStatus() { + + if (m_dataEngineState == QSDR::DataEngineUp) + m_syncStatus = 1; + else + m_syncStatus = 0; + + update(); +} + +void OGLDisplayPanel::setADCStatus(int value) { + + m_adcStatus = value; + update(); + + QTimer::singleShot(500, this, SLOT(updateADCStatus())); +} + +void OGLDisplayPanel::updateADCStatus() { + + if (m_dataEngineState == QSDR::DataEngineUp) + m_adcStatus = 1; + else + m_adcStatus = 0; + + update(); +} + +void OGLDisplayPanel::setPacketLossStatus(int value) { + + m_packetLossStatus = value; + update(); + + QTimer::singleShot(100, this, SLOT(updatePacketLossStatus())); +} + +void OGLDisplayPanel::updatePacketLossStatus() { + + if (m_dataEngineState == QSDR::DataEngineUp) + m_packetLossStatus = 1; + else + m_packetLossStatus = 0; + + update(); +} + +void OGLDisplayPanel::setSendIQStatus(int value) { + + m_sendIQStatus = value; + update(); +} + +void OGLDisplayPanel::setRecvAudioStatus(int value) { + + m_recvAudioStatus = value; + update(); +} + +void OGLDisplayPanel::setReceivers(QObject *sender, int value) { + + Q_UNUSED (sender) + + m_receivers = value; + update(); +} + +void OGLDisplayPanel::setSampleRate(QObject *sender, int value) { + + Q_UNUSED (sender) + + m_sample_rate = value / 1000; + update(); +} + +void OGLDisplayPanel::setMercuryAttenuator(QObject *sender, HamBand band, int value) { + + Q_UNUSED (sender) + Q_UNUSED (band) + + m_mercuryAttenuator = value; + update(); +} + +void OGLDisplayPanel::setDither(QObject *sender, int value) { + + Q_UNUSED (sender) + + m_dither = value; + update(); +} + +void OGLDisplayPanel::setRandom(QObject *sender, int value) { + + Q_UNUSED (sender) + + m_random = value; + update(); +} + +void OGLDisplayPanel::setCurrentReceiver(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_currentReceiver = value; + update(); +} + +void OGLDisplayPanel::setFrequency(QObject *sender, int mode, int rx, long freq) { + + Q_UNUSED (sender) + Q_UNUSED (mode) + //Q_UNUSED (rx) + + //m_oldFreq = freq; + + TFrequency f; + f.frequency = freq; + f.freqMHz = (int)(freq / 1000); + f.freqkHz = (int)(freq % 1000); + + //frequency1 = (int)(freq / 1000); + //frequency2 = (int)(freq % 1000); + + /*if (m_frequencyList.count() < set->getCurrentReceivers()) { + + m_frequencyList << f; + } + else*/ + m_frequencyList[rx] = f; + + update(); +} + +void OGLDisplayPanel::set10mhzSource(QObject *sender, int value) { + + Q_UNUSED (sender) + + switch (value) { + case 0: + m_src10mhz = "Atlas"; + break; + case 1: + m_src10mhz = "Penelope"; + break; + case 2: + m_src10mhz = "Mercury"; + break; + } + update(); +} + +void OGLDisplayPanel::set122_88mhzSource(QObject *sender, int value) { + + Q_UNUSED (sender) + + switch (value) { + case 0: + m_src122_88mhz = "Penelope"; + break; + case 1: + m_src122_88mhz = "Mercury"; + break; + } + update(); +} + +void OGLDisplayPanel::setMercuryPresence(bool value) { + + m_mercury = value; + update(); +} + +void OGLDisplayPanel::setPenelopePresence(bool value) { + + m_penelope = value; + update(); +} + +void OGLDisplayPanel::setPennylanePresence(bool value) { + + m_pennylane = value; + update(); +} + +void OGLDisplayPanel::setAlexPresence(bool value) { + + m_alex = value; + update(); +} + +void OGLDisplayPanel::setExcaliburPresence(bool value) { + + m_excalibur = value; + update(); +} + +void OGLDisplayPanel::setMercuryVersion(int value) { + + m_mercuryVersion.setNum(value/10); + m_mercuryVersion.append("."); + QString str; + m_mercuryVersion.append(str.setNum(value%10)); +} + +void OGLDisplayPanel::setPenelopeVersion(int value) { + + m_penelopeVersion.setNum(value/10); + m_penelopeVersion.append("."); + QString str; + m_penelopeVersion.append(str.setNum(value%10)); +} + +void OGLDisplayPanel::setPennylaneVersion(int value) { + + m_pennylaneVersion.setNum(value/10); + m_pennylaneVersion.append("."); + QString str; + m_pennylaneVersion.append(str.setNum(value%10)); +} + +void OGLDisplayPanel::setHermesVersion(int value) { + + m_hermesVersion.setNum(value/10); + m_hermesVersion.append("."); + QString str; + m_hermesVersion.append(str.setNum(value%10)); +} + +void OGLDisplayPanel::setMetisVersion(int value) { + + QString str; + switch (m_hwInterface) { + + case QSDR::Metis: + + m_metisVersion.setNum(value/10); + m_metisVersion.append("."); + m_metisVersion.append(str.setNum(value%10)); + break; + + case QSDR::Hermes: + case QSDR::NoInterfaceMode: + + break; + } + +} + +void OGLDisplayPanel::setExcaliburVersion(QObject *sender, int value) { + + Q_UNUSED (sender) + + m_excaliburVersion.setNum(value/10); + m_excaliburVersion.append("."); + QString str; + m_excaliburVersion.append(str.setNum(value%10)); +} + +void OGLDisplayPanel::setAlexVersion(QObject *sender, int value) { + + Q_UNUSED (sender) + + m_alexVersion.setNum(value/10); + m_alexVersion.append("."); + QString str; + m_alexVersion.append(str.setNum(value%10)); +} + +void OGLDisplayPanel::setMouseWheelFreqStep(QObject *sender, int rx, qreal value) { + + Q_UNUSED (sender) + + if (rx == m_currentReceiver) + m_mouseWheelFreqStep = value; + + update(); +} + +void OGLDisplayPanel::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + //m_mutex.lock(); + if (m_serverMode != mode) { + + m_serverMode = mode; + + } + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_dataEngineState != state) + m_dataEngineState = state; + + if (state == QSDR::DataEngineDown) { + + m_sMeterMaxValueB = -1000.0f; + m_sMeterMinValueB = 1000.0f; + + m_sMeterTimer.restart(); + m_sMeterDisplayTime.restart(); + m_sMeterMaxTimer.restart(); + m_sMeterMinTimer.restart(); + + QTimer::singleShot(50, this, SLOT(updateADCStatus())); + QTimer::singleShot(50, this, SLOT(updateSyncStatus())); + QTimer::singleShot(50, this, SLOT(updatePacketLossStatus())); + + //resizeGL(width(), height()); + } +// else if (state == QSDR::DataEngineUp) { +// +// resizeGL(width(), height()); +// } + + m_smeterUpdate = true; + m_smeterRenew = true; + + update(); + //paintGL(); +} diff --git a/Source/src/GL/cusdr_oglDisplayPanel.h b/Source/src/GL/cusdr_oglDisplayPanel.h new file mode 100644 index 0000000..f50d6e0 --- /dev/null +++ b/Source/src/GL/cusdr_oglDisplayPanel.h @@ -0,0 +1,345 @@ +/** +* @file cusdr_oglDisplayPanel.h +* @brief display panel header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-22 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_QGL_DISPLAYPANEL_H +#define _CUSDR_QGL_DISPLAYPANEL_H + +#include "cusdr_oglUtils.h" +#include "cusdr_oglInfo.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" +#include "cusdr_oglText.h" + +//#include +//#include +//#include +#include +//#include +//#include +//#include +//#include + +#ifdef LOG_DISPLAYPANEL +# define DISPLAYPANEL_DEBUG qDebug().nospace() << "DisplayPanel::\t" +#else +# define DISPLAYPANEL_DEBUG nullDebug() +#endif + + +class OGLDisplayPanel : public QGLWidget { + + Q_OBJECT + +public: + OGLDisplayPanel(QWidget *parent = 0); + ~OGLDisplayPanel(); + +public slots: + QSize minimumSizeHint() const; + QSize sizeHint() const; + + void setSampleRate(QObject *sender, int value); + void setFrequency(QObject *sender, int mode, int rx, long freq); + +protected: + void initializeGL(); + void resizeGL(int iWidth, int iHeight); + void paintGL(); + + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent * event ); + void keyPressEvent(QKeyEvent* event); + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void timerEvent(QTimerEvent *); + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QGLFramebufferObject *m_smeterFBO; + + QList m_frequencyList; + + TPanadapterColors m_colors; + TScale m_dBmScale; + + CFonts *fonts; + TFonts m_fonts; + + QMutex m_mutex; + + OGLText *m_oglTextTiny; + OGLText *m_oglTextSmall; + OGLText *m_oglTextSmallItalic; + OGLText *m_oglTextNormal; + OGLText *m_oglTextBig; + OGLText *m_oglTextBigItalic; + OGLText *m_oglTextFreq1; + OGLText *m_oglTextFreq2; + OGLText *m_oglTextImpact; + + QRect m_rect; + QRect m_rxRect; + QRect m_smeterRect; + + QString m_src10mhz; + QString m_src122_88mhz; + QString m_mercuryVersion; + QString m_penelopeVersion; + QString m_pennylaneVersion; + QString m_hermesVersion; + QString m_excaliburVersion; + QString m_metisVersion; + QString m_alexVersion; + QString m_mercuryString; + QString m_penelopeString; + QString m_pennylaneString; + QString m_excaliburString; + QString m_metisString; + QString m_alexString; + QString m_hermesString; + QString m_hermesStepAttnString; + + QString m_SYNCString; + QString m_ADCString; + QString m_PacketLossString; + QString m_sendIQString; + QString m_recvAudioString; + QString m_AttnString; + QString m_ditherString; + QString m_randomString; + QString m_sampleRateString; + QString m_modusString; + QString m_10MHzString; + QString m_12288MHzString; + QString m_sMeterNumValueString; + + QString m_bandText; + + QRegion m_freg1; + QRegion m_freg10; + QRegion m_freg100; + QRegion m_freg1000; + QRegion m_freg10000; + QRegion m_freg100000; + QRegion m_freg1000000; + QRegion m_freg10000000; + + QColor m_digitColor; + QColor m_bkgColor1; + QColor m_bkgColor2; + QColor m_activeTextColor; + QColor m_inactiveTextColor; + QColor m_textBackgroundColor; + + QTime m_sMeterTimer; + QTime m_sMeterMaxTimer; + QTime m_sMeterMinTimer; + QTime m_sMeterDisplayTime; + + enum Region { + + upperRegion, + lowerRegion, + rxRegion, + smeterRegion, + hpsdrRegion, + elsewhere, + out + }; + + enum FreqDigit { + + Freq1, + Freq10, + Freq100, + Freq1000, + Freq10000, + Freq100000, + Freq1000000, + Freq10000000, + None + }; + + GLuint m_sMeterTex; + + bool m_mercury; + bool m_penelope; + bool m_pennylane; + bool m_excalibur; + bool m_metis; + bool m_alex; + bool m_smeterUpdate; + bool m_smeterRenew; + bool m_SMeterA; + bool m_sMeterAvg; + + long m_oldFreq; + + int m_height; + int m_sMeterWidth; + int m_sMeterOffset; + int m_rxRectWidth; + int m_lowerRectY; + int m_upperRectY; + int m_digitPosition; + int m_syncStatus; + int m_adcStatus; + int m_packetLossStatus; + int m_sendIQStatus; + int m_recvAudioStatus; + int m_receivers; + int m_sample_rate; + int m_mercuryAttenuator; + int m_dither; + int m_random; + int m_currentReceiver; + + int m_pointStringWidth; + int m_blankWidth; + int m_blankWidthf; + int m_blankWidthf1; + int m_blankWidthf2; + int m_fUnitStringWidth; + int m_blankHeight; + int m_freqStringLeftPos; + int m_versionStringWidth; + int m_syncWidth; + int m_adcWidth; + int m_packetLossWidth; + int m_sendIQWidth; + int m_recvAudioWidth; + int m_metisStringWidth; + int m_mercuryStringWidth; + int m_penelopeStringWidth; + int m_pennylaneStringWidth; + int m_hermesStringWidth; + int m_hermesStepAttnStringWidth; + int m_alexStringWidth; + int m_excaliburStringWidth; + int m_AttnWidth; + int m_ditherWidth; + int m_randomWidth; + int m_sampleRateWidth; + int m_modusWidth; + int m_10MHzWidth; + int m_sMeterDeform; + int m_12288MHzWidth; + int m_freqDigitsPosY; + int m_sMeterPosY; + int m_sMeterHoldTime; + int m_sMeterPrevHoldTimeMax; + int m_sMeterPrevHoldTimeMin; + int m_sMeterMeanValueCnt; + + qreal m_mouseWheelFreqStep; + qreal m_dBmPanMin; + qreal m_dBmPanMax; + qreal m_unit; + + float m_smeterVertices; + float m_sMeterValue; + float m_sMeterMeanValue; + float m_sMeterOrgValue; + float m_sMeterMaxValueA; + float m_sMeterMinValueA; + float m_sMeterMaxValueB; + float m_sMeterMinValueB; + + //************************* + void setupConnections(); + void setupTextstrings(); + void paintUpperRegion(); + void paintLowerRegion(); + void paintRxRegion(); + + void paintSMeter(); + void renderSMeterScale(); + void renderSMeterA(); + void renderSMeterB(); + + void getSelectedDigit(QPoint p); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setupDisplayRegions(QSize size); + + void setSyncStatus(int value); + void setADCStatus(int value); + void setPacketLossStatus(int value); + void setSendIQStatus(int value); + void setRecvAudioStatus(int value); + void setCurrentReceiver(QObject *sender, int value); + void setMercuryAttenuator(QObject* sender, HamBand band, int value); + void setReceivers(QObject *sender, int value); + void setDither(QObject *sender, int value); + void setRandom(QObject *sender, int value); + void set10mhzSource(QObject *sender, int value); + void set122_88mhzSource(QObject *sender, int value); + + void setMercuryPresence(bool value); + void setPenelopePresence(bool value); + void setPennylanePresence(bool value); + void setAlexPresence(bool value); + void setExcaliburPresence(bool value); + void setHermesVersion(int value); + void setMercuryVersion(int value); + void setPenelopeVersion(int value); + void setPennylaneVersion(int value); + void setMetisVersion(int value); + void setExcaliburVersion(QObject *sender, int value); + void setAlexVersion(QObject *sender, int value); + + void setMouseWheelFreqStep(QObject *sender, int rx, qreal value); + + void setSMeterValue(int rx, float value); + void setSMeterHoldTime(int value); + void updateSyncStatus(); + void updateADCStatus(); + void updatePacketLossStatus(); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString msg); +}; + + +#endif // _CUSDR_QGL_DISPLAYPANEL_H diff --git a/Source/src/GL/cusdr_oglDistancePanel.cpp b/Source/src/GL/cusdr_oglDistancePanel.cpp new file mode 100644 index 0000000..7503389 --- /dev/null +++ b/Source/src/GL/cusdr_oglDistancePanel.cpp @@ -0,0 +1,2760 @@ +/** +* @file cusdr_oglDistancePanel.cpp +* @brief distance panel class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-14 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_GRAPHICS + +#include "cusdr_oglDistancePanel.h" + +//#include +//#include +////#include +//#include +//#include +//#include +//#include + + +#ifndef GL_MULTISAMPLE +#define GL_MULTISAMPLE 0x809D +#endif + +QGLDistancePanel::QGLDistancePanel(QWidget *parent) + : QGLWidget(QGLFormat(QGL::SampleBuffers|QGL::AlphaChannel), parent) + + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_panMode(set->getPanadapterMode(0)) + , m_mousePos(QPoint(-1, -1)) + , m_mouseDownPos(QPoint(-1, -1)) + , m_specAveragingCnt(set->getSpectrumAveragingCnt(0)) + , m_freqRulerDisplayWidth(0) + , m_panSpectrumMinimumHeight(70) + , m_spectrumUpdate(false) + , m_showZerodBmLine(false) + , m_spectrumVertexColorUpdate(false) + , m_spectrumColorsChanged(true) + , m_showChirpFFT(false) + , m_spectrumAveraging(set->getSpectrumAveraging(0)) + , m_spectrumAveragingOld(m_spectrumAveraging) + , m_crossHairCursor(false) + , m_panGrid(set->getPanGridStatus(0)) + , m_freqRulerPosition(0.5) + , m_distRulerDisplayDelta(0.0) + , m_distRulerDisplayDeltaStep(500.0) + , m_distRulerMaxDist(150000.0) + , m_freqScaleZoomFactor(1.0f) + , m_distScaleZoomFactor(1.0) // 0.2 .. 1.0 + , m_scaleMult(1.0f) + , m_filterLowerFrequency(-3050.0) + , m_filterUpperFrequency(-150.0) + , m_snapMouse(3) + , m_sampleRate(set->getSampleRate()) + , m_downRate(set->getChirpDownSampleRate()) + , m_chirpBufferLength(set->getChirpBufferLength()) +{ +// QGL::setPreferredPaintEngine(QPaintEngine::OpenGL); + + setAutoBufferSwap(true); + setAutoFillBackground(false); + + setMouseTracking(true); + setFocusPolicy(Qt::StrongFocus); + + setupDisplayRegions(size()); + m_oldWidth = size().width(); + + m_rxDataList = set->getReceiverDataList(); + //m_frequency = m_rxDataList.at(0).frequency; + m_frequency = m_rxDataList.at(0).vfoFrequency; + + m_dBmScalePanadapterRenew = true; + m_dBmScalePanadapterUpdate = true; + m_freqScalePanadapterRenew = true; + m_freqScalePanadapterUpdate = true; + m_panGridRenew = true; + m_panGridUpdate = true; + + HamBand band = m_rxDataList.at(0).hamBand; + + m_dBmPanMin = m_rxDataList.at(0).dBmPanScaleMinList.at(band); + m_dBmPanMax = m_rxDataList.at(0).dBmPanScaleMaxList.at(band); + + m_filterLowerFrequency = m_rxDataList.at(0).filterLo; + m_filterUpperFrequency = m_rxDataList.at(0).filterHi; + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + m_oglTextTiny = new OGLText(m_fonts.tinyFont); + m_oglTextSmall = new OGLText(m_fonts.smallFont); + m_oglTextNormal = new OGLText(m_fonts.normalFont); + + timer = 0; + + setupConnections(); + + m_displayTime.start(); + m_resizeTime.start(); + //freqChangeTimer.start(); + + memset(m_spectrumBuffer, -10000, 4 * BUFFER_SIZE * sizeof(float)); + memset(m_distanceSpectrumBuffer, -10000, 16 * BUFFER_SIZE * sizeof(float)); + + m_kilometersPerGate = 0.5f * 3E5 / (m_sampleRate/m_downRate); + + m_dBmPanLogGain = 69; // allow user to calibrate this value + + m_dBmDistMin = set->getdBmDistScaleMin(); + m_dBmDistMax = set->getdBmDistScaleMax(); + m_dBmDistScaleMin = m_dBmDistMin; + m_dBmDistScaleMax = m_dBmDistMax; + + m_panSpectrumBinsLength = 0; + + /*m_bkgRed = (GLfloat)(set->getPanadapterColors().panBackgroundColor.red() / 256.0); + m_bkgGreen = (GLfloat)(set->getPanadapterColors().panBackgroundColor.green() / 256.0); + m_bkgBlue = (GLfloat)(set->getPanadapterColors().panBackgroundColor.blue() / 256.0);*/ + + m_red = (GLfloat)(set->getPanadapterColors().panLineColor.red() / 256.0); + m_green = (GLfloat)(set->getPanadapterColors().panLineColor.green() / 256.0); + m_blue = (GLfloat)(set->getPanadapterColors().panLineColor.blue() / 256.0); + + m_redF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.red() / 256.0); + m_greenF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.green() / 256.0); + m_blueF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.blue() / 256.0); + + m_redST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.red() / 256.0); + m_greenST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.green() / 256.0); + m_blueST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.blue() / 256.0); + + m_redSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.red() / 256.0); + m_greenSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.green() / 256.0); + m_blueSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.blue() / 256.0); + + m_frequencyScaleFBO = 0; + m_dBmScaleFBO = 0; + m_panadapterGridFBO = 0; + m_textureFBO = 0; + + if (m_specAveragingCnt > 0) + m_scale = 1.0f / m_specAveragingCnt; + else + m_scale = 1.0f; + + memset(m_tmpBuf, 0, SAMPLE_BUFFER_SIZE * sizeof(float)); + + updateGL(); +} + +QGLDistancePanel::~QGLDistancePanel() { + + disconnect(set, 0, this, 0); + + makeCurrent(); + glFinish(); + + if (m_frequencyScaleFBO) { + + delete m_frequencyScaleFBO; + m_frequencyScaleFBO = 0; + } + + if (m_textureFBO) { + + delete m_textureFBO; + m_textureFBO = 0; + } + + if (m_dBmScaleFBO) { + + delete m_dBmScaleFBO; + m_dBmScaleFBO = 0; + } + + if (m_panadapterGridFBO) { + + delete m_panadapterGridFBO; + m_panadapterGridFBO = 0; + } + + while (!specAv_queue.isEmpty()) + specAv_queue.dequeue(); +} + +//QSize QGLDistancePanel::minimumSizeHint() const { +// +// //return QSize(1000, 1024); +// return QSize(width(), height()); +//} + +QSize QGLDistancePanel::sizeHint() const { + + return QSize(width(), height()); +} + +void QGLDistancePanel::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode)), + this, + SLOT(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode))); + + CHECKED_CONNECT( + set, + SIGNAL(freqRulerPositionChanged(float, int)), + this, + SLOT(freqRulerPositionChanged(float, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(filterFrequenciesChanged(QObject *, int, qreal, qreal)), + this, + SLOT(setFilterFrequencies(QObject *, int, qreal, qreal))); + + CHECKED_CONNECT_OPT( + set, + SIGNAL(chirpSpectrumBufferChanged(int, qint64, const float *)), + this, + SLOT(distanceSpectrumBufferChanged(int, qint64, const float *)), + Qt::DirectConnection); + + CHECKED_CONNECT( + set, + SIGNAL(chirpFFTShowChanged(bool)), + this, + SLOT(setChirpFFTShow(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(waterfallTimeChanged(int, int)), + this, + SLOT(setWaterfallTime(int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(waterfallOffesetLoChanged(int, int)), + this, + SLOT(setWaterfallOffesetLo(int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(waterfallOffesetHiChanged(int, int)), + this, + SLOT(setWaterfallOffesetHi(int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingChanged(bool)), + this, + SLOT(setSpectrumAveraging(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingCntChanged(int)), + this, + SLOT(setSpectrumAveragingCnt(int))); + + CHECKED_CONNECT( + set, + SIGNAL(panGridStatusChanged(bool)), + this, + SLOT(setPanGridStatus(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(panadapterColorChanged()), + this, + SLOT(setPanadapterColors())); +} + +void QGLDistancePanel::initializeGL() { + + if (!isValid()) return; + + /*QOpenGLInfo glInfo; + glInfo.getInfo(); + glInfo.printSelf();*/ + + //***************************************************************** + // default initialization + + //glShadeModel(GL_FLAT); + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.5f); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + + m_cnt = 0; + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + +void QGLDistancePanel::paintGL() { + + switch (m_serverMode) { + + case QSDR::SDRMode: + + drawGLRect(QRect(0, 0, width(), height()), QColor(0, 0, 0)); + break; + + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + + //if (freqChangeTimer.elapsed() > 50) m_spectrumAveraging = m_spectrumAveragingOld; + + if (m_resizeTime.elapsed() > 100 || m_dataEngineState == QSDR::DataEngineDown) { + + paintReceiverDisplay(); + paintChirpWSPRDisplay(); + } + + break; + + default: + break; + } +} + +//**************************************************** +// painting modes +void QGLDistancePanel::paintReceiverDisplay() { + + QRect mouse_rect(0, 0, 100, 100); + mouse_rect.moveCenter(m_mousePos); + + drawPanadapter(); + drawPanHorizontalScale(); + drawPanVerticalScale(); + + if (m_panGrid) + drawPanadapterGrid(); + + drawPanFilter(); + + if (m_mouseRegion == panadapterRegion && m_crossHairCursor) + drawCrossHair(); + + m_oldFreq = m_frequency; + } + +void QGLDistancePanel::paintChirpWSPRDisplay() { + + //drawGLBackground(m_distanceSpectrumRect); + + distanceSpectrumBufferMutex.lock(); + drawDistanceSpectrum(); + distanceSpectrumBufferMutex.unlock(); + + drawDistHorizontalScale(); + drawDistVerticalScale(); + + //// chirp distance spectrum + //m_distancePanadapter->drawGLDistanceRuler( + // m_freqScaleDistancePanRect, + // m_freqScalePanadapterRect, + // m_mouseRegion, + // m_distRulerZoomFactor, + // m_distRulerDisplayDelta, + // m_kilometersPerGate, + // m_showChirpFFT, + // m_chirpBufferLength); + + //m_distancePanadapter->drawGLdBmScale( + // m_dBmScaleDistancePanRect, + // m_distanceSpectrumRect, + // m_mouseRegion, + // m_dBmDistScaleMin, + // m_dBmDistScaleMax, + // m_showZerodBmLine); + + //m_distancePanadapter->drawGLGrid(m_distanceSpectrumRect, m_dBmScaleDistancePanRect); +} + +void QGLDistancePanel::drawPanadapter() { + + GLint vertexArrayLength = (GLint)m_panadapterBins.size(); + + GLint height = m_panRect.height(); + GLint x1 = m_panRect.left(); + GLint y1 = m_panRect.top(); + GLint x2 = x1 + m_panRect.width(); + GLint y2 = y1 + m_panRect.height(); + + // y scale + float yScale; + float yScaleColor; + float yTop; + + qreal dBmRange = qAbs(m_dBmPanMax - m_dBmPanMin); + + yScale = m_panRect.height() / dBmRange; + //yScaleColor = 4.0f / dBmRange; + yScaleColor = 10.0f / dBmRange; + yTop = (float) y2; + + if (m_dataEngineState == QSDR::DataEngineUp) + glClear(GL_DEPTH_BUFFER_BIT); + else + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_MULTISAMPLE); + glEnable(GL_LINE_SMOOTH); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glLineWidth(1); + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_panGrid) { + + glBegin(GL_TRIANGLE_STRIP); + glColor3f(0.15f, 0.15f, 0.3f); glVertex3f(x1, y1, -3.0); // top left corner + glColor3f(0.15f, 0.15f, 0.3f); glVertex3f(x2, y1, -3.0); // top right corner + glColor3f(0.15f, 0.15f, 0.51f); glVertex3f(x1, y2, -3.0); // bottom left corner + glColor3f(0.15f, 0.15f, 0.61f); glVertex3f(x2, y2, -3.0); // bottom right corner + glEnd(); + } + else { + + glBegin(GL_TRIANGLE_STRIP); + glColor3f(0.05f, 0.05f, 0.2f); glVertex3f(x1, y1, -3.0); // top left corner + glColor3f(0.05f, 0.05f, 0.2f); glVertex3f(x2, y1, -3.0); // top right corner + glColor3f(0.05f, 0.05f, 0.31f); glVertex3f(x1, y2, -3.0); // bottom left corner + glColor3f(0.05f, 0.05f, 0.41f); glVertex3f(x2, y2, -3.0); // bottom right corner + glEnd(); + } + } + else { + + drawGLRect(m_panRect, QColor(30, 30, 50, 155), -3.0f); + } + + //glBegin(GL_TRIANGLE_STRIP); + //glColor3f(m_bkgRed, m_bkgGreen, m_bkgBlue); glVertex3f(x1, y1, -3.0); // top left corner + //glColor3f(m_bkgRed, m_bkgGreen, m_bkgBlue); glVertex3f(x2, y1, -3.0); // top right corner + //glColor3f(m_bkgRed * 1.2, m_bkgGreen * 1.2, m_bkgBlue * 1.2); glVertex3f(x1, y2, -3.0); // bottom left corner + //glColor3f(m_bkgRed * 1.6, m_bkgGreen * 1.6, m_bkgBlue * 1.6); glVertex3f(x2, y2, -3.0); // bottom right corner + //glEnd(); + + // set a scissor box + glScissor(x1, size().height() - y2, x2, height); + glEnable(GL_SCISSOR_TEST); + + TGL3float *vertexArray = new TGL3float[vertexArrayLength]; + TGL3float *vertexColorArray = new TGL3float[vertexArrayLength]; + + TGL3float *vertexArrayBg = new TGL3float[2*vertexArrayLength]; + TGL3float *vertexColorArrayBg = new TGL3float[2*vertexArrayLength]; + + switch (m_panMode) { + + case (PanGraphicsMode) FilledLine: + + for (int i = 0; i < vertexArrayLength; i++) { + + mutex.lock(); + vertexColorArrayBg[2*i].x = m_redF; + vertexColorArrayBg[2*i].y = m_greenF; + vertexColorArrayBg[2*i].z = m_blueF; + + vertexColorArrayBg[2*i+1].x = 0.3 * m_redF; + vertexColorArrayBg[2*i+1].y = 0.3 * m_greenF; + vertexColorArrayBg[2*i+1].z = 0.3 * m_blueF; + + vertexColorArray[i].x = m_red * (yScaleColor * m_panadapterBins.at(i)); + vertexColorArray[i].y = m_green * (yScaleColor * m_panadapterBins.at(i)); + vertexColorArray[i].z = m_blue * (yScaleColor * m_panadapterBins.at(i)); + mutex.unlock(); + + vertexArrayBg[2*i].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArrayBg[2*i].z = -2.5; + + vertexArrayBg[2*i+1].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i+1].y = (GLfloat)yTop; + vertexArrayBg[2*i+1].z = -2.5; + + vertexArray[i].x = (GLfloat)(i/m_scaleMult); + vertexArray[i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArray[i].z = -1.0; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBg); + glDrawArrays(GL_QUAD_STRIP, 0, 2*vertexArrayLength); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + + break; + + case (PanGraphicsMode) Line: + + for (int i = 0; i < vertexArrayLength; i++) { + + mutex.lock(); + vertexColorArray[i].x = m_red * (yScaleColor * m_panadapterBins.at(i)); + vertexColorArray[i].y = m_green * (yScaleColor * m_panadapterBins.at(i)); + vertexColorArray[i].z = m_blue * (yScaleColor * m_panadapterBins.at(i)); + mutex.unlock(); + + vertexArray[i].x = (GLfloat)(i/m_scaleMult); + vertexArray[i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArray[i].z = -1.0; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + + break; + + case (PanGraphicsMode) Solid: + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + + for (int i = 0; i < vertexArrayLength; i++) { + + mutex.lock(); + vertexColorArrayBg[2*i].x = m_redST; + vertexColorArrayBg[2*i].y = m_greenST; + vertexColorArrayBg[2*i].z = m_blueST; + + vertexColorArrayBg[2*i+1].x = m_redSB; + vertexColorArrayBg[2*i+1].y = m_greenSB; + vertexColorArrayBg[2*i+1].z = m_blueSB; + mutex.unlock(); + + vertexArrayBg[2*i].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArrayBg[2*i].z = -2.0f; + + vertexArrayBg[2*i+1].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i+1].y = (GLfloat)yTop; + vertexArrayBg[2*i+1].z = -2.0f; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBg); + //glDrawArrays(GL_QUAD_STRIP, 0, 2*vertexArrayLength); + glDrawArrays(GL_LINES, 0, 2*vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + //glEnable(GL_MULTISAMPLE); + //glEnable(GL_LINE_SMOOTH); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + + break; + } + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + + // disable scissor box + glDisable(GL_SCISSOR_TEST); +} + +void QGLDistancePanel::drawPanVerticalScale() { + + if (!m_dBmScalePanRect.isValid()) return; + + int width = m_dBmScalePanRect.width(); + int height = m_dBmScalePanRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_dBmScaleFBO || m_dBmScalePanadapterUpdate || m_dBmScalePanadapterRenew) { + + if (!m_dBmScaleFBO || m_dBmScalePanadapterRenew) { + + if (m_dBmScaleFBO) { + + delete m_dBmScaleFBO; + m_dBmScaleFBO = 0; + } + m_dBmScaleFBO = new QGLFramebufferObject(width, height); + } + + m_dBmScaleFBO->bind(); + renderPanVerticalScale(); + m_dBmScaleFBO->release(); + + m_dBmScalePanadapterUpdate = false; + m_dBmScalePanadapterRenew = false; + } + + renderTexture(m_dBmScalePanRect, m_dBmScaleFBO->texture(), 0.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLDistancePanel::drawPanHorizontalScale() { + + if (!m_freqScalePanRect.isValid()) return; + + int width = m_freqScalePanRect.width(); + int height = m_freqScalePanRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_frequencyScaleFBO || m_freqScalePanadapterUpdate || m_freqScalePanadapterRenew) { + + if (!m_frequencyScaleFBO || m_freqScalePanadapterRenew) { + + if (m_frequencyScaleFBO) { + + delete m_frequencyScaleFBO; + m_frequencyScaleFBO = 0; + } + + m_frequencyScaleFBO = new QGLFramebufferObject(width, height); + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_frequencyScaleFBO->bind(); + renderPanHorizontalScale(); + m_frequencyScaleFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + m_freqScalePanadapterUpdate = false; + m_freqScalePanadapterRenew = false; + } + + renderTexture(m_freqScalePanRect, m_frequencyScaleFBO->texture(), 0.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLDistancePanel::drawPanadapterGrid() { + + if (!m_panRect.isValid()) return; + + int width = m_panRect.width(); + int height = m_panRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + //glColor4f(0.35, 0.46, 0.51, 0.7); + //glColor4f(0.45, 0.56, 0.61, 1.0); + glColor4f(0.45f, 0.56f, 0.61f, 0.8f); + + glDisable(GL_MULTISAMPLE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_panadapterGridFBO || m_panGridUpdate || m_panGridRenew) { + + if (!m_panadapterGridFBO || m_panGridRenew) { + + if (m_panadapterGridFBO) { + + delete m_panadapterGridFBO; + m_panadapterGridFBO = 0; + } + + m_panadapterGridFBO = new QGLFramebufferObject(width, height); + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_panadapterGridFBO->bind(); + renderPanadapterGrid(); + m_panadapterGridFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + m_panGridUpdate = false; + m_panGridRenew = false; + } + + //renderTexture(m_panRect, m_panadapterGridFBO->texture(), -2.0f); + //renderTexture(m_panRect, m_panadapterGridFBO->texture(), -1.5f); + renderTexture(m_panRect, m_panadapterGridFBO->texture(), -2.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); + glEnable(GL_MULTISAMPLE); +} + +void QGLDistancePanel::drawPanFilter() { + + qreal freqLo = m_filterLowerFrequency / m_sampleRate; + qreal freqHi = m_filterUpperFrequency / m_sampleRate; + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + //glColor4f(0.65, 0.65, 0.65, 0.25); + QColor color = QColor(150, 150, 150, 100); + + GLint x1 = m_panRect.left() + qRound((qreal)(m_panRect.width()/2.0f) + freqLo * m_panRect.width() / m_freqScaleZoomFactor); + GLint x2 = m_panRect.left() + qRound((qreal)(m_panRect.width()/2.0f) + freqHi * m_panRect.width() / m_freqScaleZoomFactor); + GLint y1 = m_panRect.top() + 1; + GLint y2 = m_panRect.top() + m_panRect.height() - 1; + + QRect filterRect = QRect(x1, y1, x2 - x1, y2 - y1); + + if ((x1 >= m_panRect.left() && x1 <= m_panRect.right()) || + (x2 >= m_panRect.left() && x2 <= m_panRect.right()) || + (x1 < m_panRect.left() && x2 > m_panRect.right())) + { + if (filterRect.height() > 5) + drawGLRect(filterRect, color, 3.0); + } + + // draw a line for the display center + y1 = m_panRect.top() + 3; + y2 = m_panRect.top() + (m_panRect.height() - 3); + + if (y2 > y1 + 3) { + + GLint x = m_panRect.width()/2; + + color = set->getPanadapterColors().panCenterLineColor; + + //glDisable(GL_LINE_SMOOTH); + glDisable(GL_MULTISAMPLE); + glLineWidth(1); + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + glBegin(GL_LINES); + /*glVertex2i(x, y1); + glVertex2i(x, y2);*/ + glVertex3f(x, y1, 4.0f); + glVertex3f(x, y2, 4.0f); + glEnd(); + glEnable(GL_MULTISAMPLE); + } +} + +void QGLDistancePanel::drawCrossHair() { + + QRect rect(0, m_panRect.top(), width(), height() - m_panRect.top()); + + int x = m_mousePos.x(); + int y = m_mousePos.y(); + + glDisable(GL_MULTISAMPLE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0f); + + qglColor(QColor(255, 255, 255, 80)); + + // set a scissor box + glScissor(rect.left(), rect.top(), rect.width() - 1, rect.height()); + glEnable(GL_SCISSOR_TEST); + + // horizontal line + glBegin(GL_LINES); + glVertex3f(m_dBmScalePanRect.right() - 2, y, 4.0f); + glVertex3f(rect.right() - 1, y, 4.0f); + glEnd(); + + // vertical line + glBegin(GL_LINES); + glVertex3f(x, rect.top() + 1, 4.0f); + glVertex3f(x, rect.bottom() - 1, 4.0f); + glEnd(); + + // cross hair + qglColor(QColor(255, 255, 255, 180)); + glBegin(GL_LINES); + glVertex3f(x , y - 20, 5.0f); + glVertex3f(x , y + 20, 5.0f); + glVertex3f(x - 20, y, 5.0f); + glVertex3f(x + 20, y, 5.0f); + glEnd(); + + // text only on panadapter + //if (m_mouseRegion == panadapterRegion) { + + QString str; + qglColor(QColor(255, 255, 255, 255)); + + int dx = m_panRect.width()/2 - x; + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width()); + qreal df = unit * dx; + qreal frequency = m_frequency - df; + + str = frequencyString(-df, true); + if (x > m_panRect.width() - 85) + m_oglTextSmall->renderText(x -90, y - 30, 5.0f, str); + else + m_oglTextSmall->renderText(x + 4, y - 30, 5.0f, str); + + str = frequencyString(frequency); + if (x > m_panRect.width() - 85) + m_oglTextSmall->renderText(x - 90, y - 18, 5.0f, str); + else + m_oglTextSmall->renderText(x + 4, y - 18, 5.0f, str); + + if (m_mouseRegion == panadapterRegion) { + + qreal dBm = m_dBmPanMax - ((m_dBmPanMax - m_dBmPanMin) * ((qreal)(y - m_panRect.top()) / m_panRect.height())); + str = QString::number(dBm, 'f', 1) + " dBm"; + if (x > m_panRect.width() - 85) + m_oglTextSmall->renderText(x - 90, y + 6, 5.0f, str); + else + m_oglTextSmall->renderText(x + 4, y + 6, 5.0f, str); + } + + // disable scissor box + glDisable(GL_SCISSOR_TEST); + + glEnable(GL_MULTISAMPLE); +} + +//************ +void QGLDistancePanel::drawDistanceSpectrum() { + + //float yScale; + //float yScaleColor; + //float yTop; + float localMax; + + GLint displayWidth = (GLint)m_distanceSpectrumRect.width(); + + double distScale = 0; + //freqScale = (float)m_sampleRate / rect.width(); + //distScale = 1024.0f / rect.width(); + + distScale = (double)(1.0f * qRound(m_chirpBufferLength * m_distScaleZoomFactor) / m_distanceSpectrumRect.width()); + if (distScale < 1.0) distScale = 1.0; + + if (distScale < 0) { + + drawGLRect(m_distanceSpectrumRect, Qt::black); + //GRAPHICS_DEBUG << "drawDistanceSpectrum bad distance scale:" << distScale; + return; + } + + //qreal dBmRange = qAbs(dBmMax - dBmMin); + qreal dBmRange = (m_dBmDistMax - m_dBmDistMin) * m_distScaleZoomFactor; + + float yScale = m_distanceSpectrumRect.height() / dBmRange; + //float yScaleColor = 2.0f / dBmRange; + float yTop = m_distanceSpectrumRect.top() + m_distanceSpectrumRect.height(); + + int idx = 0; + int lIdx = 0; + int rIdx = 0; + + // set a scissor box + glScissor(m_distanceSpectrumRect.left(), size().height() - m_distanceSpectrumRect.bottom() - 1, m_distanceSpectrumRect.left() + m_distanceSpectrumRect.width(), m_distanceSpectrumRect.height()); + glEnable(GL_SCISSOR_TEST); + + GLint vertexArrayLength = 0; + + /*if (m_vertexArray) { + + delete [] m_vertexArray; + m_vertexArray = 0; + } + + if (m_vertexColorArray) { + + delete [] m_vertexColorArray; + m_vertexColorArray = 0; + }*/ + + glLineWidth(1); + glShadeModel(GL_SMOOTH); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + vertexArrayLength = displayWidth; + TGL2float *vertexArray = new TGL2float[vertexArrayLength]; + TGL3float *vertexColorArray = new TGL3float[vertexArrayLength]; + + //TGL3float *vertexArrayBg = new TGL3float[2*vertexArrayLength]; + //TGL3float *vertexColorArrayBg = new TGL3float[2*vertexArrayLength]; + + //m_vertexArray = new TGL2float[vertexArrayLength]; + //m_vertexColorArray = new TGL3float[vertexArrayLength]; + + m_redD = (GLfloat)(set->getPanadapterColors().distanceLineColor.red() / 256.0); + m_greenD = (GLfloat)(set->getPanadapterColors().distanceLineColor.green() / 256.0); + m_blueD = (GLfloat)(set->getPanadapterColors().distanceLineColor.blue() / 256.0); + + /*m_rf = (GLfloat)(set->getPanadapterColors().panLineFilledColor.red() / 256.0); + m_gf = (GLfloat)(set->getPanadapterColors().panLineFilledColor.green() / 256.0); + m_bf = (GLfloat)(set->getPanadapterColors().panLineFilledColor.blue() / 256.0);*/ + + for (int i = 0; i < vertexArrayLength; i++) { + + lIdx = (int)floor((qreal)(i * distScale)); + rIdx = (int)floor((qreal)(i * distScale) + distScale); + + // max value; later we try mean value also! + localMax = -10000.0F; + for (int j = lIdx; j < rIdx; j++) { + if (m_distanceSpectrumBuffer[j] > localMax) { + + localMax = m_distanceSpectrumBuffer[j]; + idx = j; + } + } + + /*m_spectrumVertexColorArrayBg[2*i].x = 0.10; + m_spectrumVertexColorArrayBg[2*i].y = 0.20; + m_spectrumVertexColorArrayBg[2*i].z = 0.25;*/ + + vertexColorArray[i].x = m_redD;// * (yScaleColor * (m_distanceSpectrumBuffer[idx] - dBmMin)); + vertexColorArray[i].y = m_greenD;// * (yScaleColor * (m_distanceSpectrumBuffer[idx] - dBmMin)); + vertexColorArray[i].z = m_blueD;// * (yScaleColor * (m_distanceSpectrumBuffer[idx] - dBmMin)); + + vertexArray[i].x = i; + vertexArray[i].y = yTop - yScale * (m_distanceSpectrumBuffer[idx] - m_dBmDistMin); + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(2, GL_FLOAT, 0, vertexArray); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + delete[] vertexArray; + delete[] vertexColorArray; + + // disable scissor box + glDisable(GL_SCISSOR_TEST); +} + +void QGLDistancePanel::drawDistHorizontalScale() { + + if (m_freqScaleDistancePanRect.isEmpty()) return; + + //QFontMetrics d_fm(m_smallFont); + + int rulerFontHeight; + int rulerFontMaxWidth; + double maxSpanDist; + + if (m_showChirpFFT) { + + rulerFontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0Hz").height(); + rulerFontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000000").width(); + + //maxSpanDist = m_sampleRate / 2; + maxSpanDist = m_sampleRate / 4; + //maxSpanDist = m_sampleRate; + } + else { + + rulerFontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0kmM").height(); + rulerFontMaxWidth = m_fonts.smallFontMetrics->boundingRect("0000000").width(); + + maxSpanDist = m_chirpBufferLength * m_kilometersPerGate; + } + + qreal kilometerSpan = maxSpanDist * m_distScaleZoomFactor; + + qreal lowerDist = 0; + qreal upperDist = 0; + + if (m_showChirpFFT) + lowerDist = -maxSpanDist/2; + else { + + lowerDist = m_dBmDistDelta; + if (lowerDist < 0.0) lowerDist = 0.0; + } + + upperDist = lowerDist + kilometerSpan; + if (upperDist > maxSpanDist) { + + upperDist = maxSpanDist; + lowerDist = maxSpanDist - kilometerSpan; + } + + qreal unit = (float)(m_freqScaleDistancePanRect.width() / kilometerSpan); + + m_distanceScale = getXRuler(m_freqScaleDistancePanRect, rulerFontMaxWidth, unit, lowerDist, upperDist); + + // draw the scale background + drawGLScaleBackground(m_freqScaleDistancePanRect, Qt::black); + + // draw the distance scale + int offset_X = -1; + int textOffset_y = 17; + double distScale = 1; + +// char *str; +// if (m_showChirpFFT) +// str = " Hz "; +// else +// str = " km "; + + QRect scaledTextRect(0, textOffset_y, 1, rulerFontHeight); + //scaledTextRect.setWidth(d_fm.width(str)); + scaledTextRect.moveLeft(m_freqScaleDistancePanRect.width() - scaledTextRect.width());// - menu_pull_right_rect.width()); + + glColor3f(0.94f, 0.22f, 0.43f); + glRasterPos3f(m_freqScaleDistancePanRect.width() - 30, m_freqScaleDistancePanRect.top() + textOffset_y, 0.0); + //writeBitmapString(GLUT_BITMAP_HELVETICA_10, str); + + if (m_mouseRegion == freqScaleDistancePanRegion) + glColor3f(0.8f, 0.92f, 0.97f); + else + glColor3f(0.65f, 0.76f, 0.81f); + + int len = m_distanceScale.mainPointPositions.length(); + if (len > 0) { + + glLineWidth(3); + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_distanceScale.mainPointPositions.at(i), m_freqScaleDistancePanRect.top() + 1, 0.0f); // origin of the line + glVertex3f(m_distanceScale.mainPointPositions.at(i), m_freqScaleDistancePanRect.top() + 4, 0.0f); // ending point of the line + } + glEnd(); + + for (int i = 0; i < len; i++) { + + QString str = QString::number(m_distanceScale.mainPoints.at(i) / distScale, 'f', 0); + + int textWidth = m_fonts.smallFontMetrics->width(str); + QRect textRect(m_distanceScale.mainPointPositions.at(i) + offset_X - (textWidth / 2), textOffset_y, textWidth, rulerFontHeight); + + QByteArray ba = str.toLatin1(); + char *cstr = ba.data(); + + if (textRect.left() < 0 || textRect.right() >= scaledTextRect.left()) continue; + + glRasterPos3f(m_distanceScale.mainPointPositions.at(i) + offset_X - (textWidth / 2), m_freqScaleDistancePanRect.top() + textOffset_y, 0.0); + m_oglTextSmall->renderText(textRect.x(), textRect.y(), cstr); + //writeBitmapString(GLUT_BITMAP_HELVETICA_10, cstr); + } + } + + len = m_distanceScale.subPointPositions.length(); + if (len > 0) { + + glLineWidth(1); + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_distanceScale.subPointPositions.at(i), m_freqScaleDistancePanRect.top() + 1, 0.0f); // origin of the line + glVertex3f(m_distanceScale.subPointPositions.at(i), m_freqScaleDistancePanRect.top() + 3, 0.0f); // ending point of the line + } + glEnd(); + } +} + +void QGLDistancePanel::drawDistVerticalScale() { + /*const QRect &rect, + const QRect &distRect, + int region, + qreal dBmMin, + qreal dBmMax, + bool showZerodBmLine*/ + + if (m_dBmScaleDistancePanRect.isEmpty()) return; + + //QFontMetrics d_fm(m_smallFont); + int spacing = 5; + int fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0dBm").height() + spacing; + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("-000.0").width(); + + qreal dBmRange = qAbs(m_dBmDistScaleMax - m_dBmDistScaleMin); + //if (dBmRange <= 0) return; + + qreal unit = (float)(m_dBmScaleDistancePanRect.height() / dBmRange); + + m_dBmScale = getYRuler(m_dBmScaleDistancePanRect, fontHeight, unit, m_dBmDistScaleMin, m_dBmDistScaleMax); + + // draw the scale background + drawGLScaleBackground(m_dBmScaleDistancePanRect, QColor(60, 60, 60, 80)); + + QRect textRect(0, 0, fontMaxWidth, fontHeight); + textRect.moveRight(14); + int yOld = -textRect.height(); + + if (m_mouseRegion == dBmScaleDistancePanRegion) + glColor3f(0.8f, 0.92f, 0.97f); + else + glColor3f(0.65f, 0.76f, 0.81f); + + + glLineWidth(1); + int len = m_dBmScale.mainPointPositions.length(); + + if (len > 0) { + + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_dBmScaleDistancePanRect.left(), m_dBmScale.mainPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(m_dBmScaleDistancePanRect.left() + 4, m_dBmScale.mainPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + + for (int i = 0; i < len; i++) { + + textRect.moveTop(m_dBmScale.mainPointPositions.at(i) + textRect.height()/3); + + QString str; + if (textRect.y() >= yOld && + textRect.bottom() <= (m_dBmScaleDistancePanRect.top() + m_dBmScaleDistancePanRect.height() - textRect.height()) && + m_dBmScale.mainPointPositions.at(i) > 10 + m_dBmScaleDistancePanRect.top()) + { + str = QString::number(m_dBmScale.mainPoints.at(i), 'f', 1); + QByteArray ba = str.toLatin1(); + //char *cstr = ba.data(); + glRasterPos3f(textRect.right() + m_dBmScaleDistancePanRect.left(), textRect.y(), 0.0); + //writeBitmapString(GLUT_BITMAP_TIMES_ROMAN_10, cstr); + yOld = textRect.bottom(); + } + + if (qRound(m_dBmScale.mainPoints.at(i)) == 0 && m_showZerodBmLine) { + + int zerodBmLine = m_dBmScale.mainPointPositions.at(i); + if (zerodBmLine > m_dBmScaleDistancePanRect.top() && zerodBmLine < m_dBmScaleDistancePanRect.bottom()) { + + glColor3f(0.2f, 0.87f, 0.87f); + glBegin(GL_LINES); + glVertex3f(m_distanceSpectrumRect.left(), zerodBmLine, 0.0f); // origin of the line + glVertex3f(m_distanceSpectrumRect.width() - m_dBmScaleDistancePanRect.width() + 4, zerodBmLine, 0.0f); // ending point of the line + glEnd(); + + if (m_mouseRegion == dBmScaleDistancePanRegion) + glColor3f(0.8f, 0.92f, 0.97f); + else + glColor3f(0.65f, 0.76f, 0.81f); + } + } + } + } + + if (m_mouseRegion == dBmScaleDistancePanRegion) + glColor3f(0.5f, 0.62f, 0.67f); + else + glColor3f(0.35f, 0.46f, 0.51f); + + if (m_dBmScale.subPointPositions.length() > 0) { + + glBegin(GL_LINES); + for (int i = 0; i < m_dBmScale.subPointPositions.length(); i++) { + + glVertex3f(m_dBmScaleDistancePanRect.left(), m_dBmScale.subPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(m_dBmScaleDistancePanRect.left() + 2, m_dBmScale.subPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + } + + //char* s = "dBm"; + textRect.moveTop(m_dBmScaleDistancePanRect.top() + m_dBmScaleDistancePanRect.height() - textRect.height()); + glColor3f(0.94f, 0.22f, 0.43f); + //glRasterPos3f(textRect.left(), textRect.center().y(), 0.0); + //glRasterPos3f(textRect.right() + right, textRect.center().y(), 0.0); + glRasterPos3f(textRect.right() + m_dBmScaleDistancePanRect.left(), textRect.center().y(), 0.0); + //writeBitmapString(GLUT_BITMAP_HELVETICA_10, s); + + //glPushMatrix(); + // glTranslatef(0.0, 0.0, 0.0); + // //glRotatef(45.0, 0.0, 0.0, 1.0); + // glScalef(0.25, 0.25, 0.25); + // writeStrokeString(GLUT_STROKE_ROMAN, s); + //glPopMatrix(); +} + +//********************************************************************************************** +// The algorithms of the scale functions renderPanVerticalScale() and renderPanHorizontalScale() +// are taken from SDRMAXIII (c) Catherine Moss, with permission. + +void QGLDistancePanel::renderPanVerticalScale() { + + QString str; + //QFontMetrics d_fm(m_smallFont); + //QFontMetrics d_fm(m_normalFont); + + int spacing = 7; + int fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0dBm").height() + spacing; + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("-000.0").width(); + + GLint width = m_dBmScalePanRect.width(); + GLint height = m_dBmScalePanRect.height(); + + qreal unit = (qreal)(m_dBmScalePanRect.height() / qAbs(m_dBmPanMax - m_dBmPanMin)); + + m_dBmScale = getYRuler2(m_dBmScalePanRect, fontHeight, unit, m_dBmPanMin, m_dBmPanMax); + + glClear(GL_COLOR_BUFFER_BIT); + + QRect textRect(0, 0, fontMaxWidth, fontHeight); + textRect.moveLeft(3); + int yOld = -textRect.height(); + + int len = m_dBmScale.mainPointPositions.length(); + int sublen = m_dBmScale.subPointPositions.length(); + + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + // draw the scale background + drawGLScaleBackground(QRect(0, 0, width, height), QColor(30, 30, 30, 180)); + + if (len > 0) { + + glColor3f(0.65f, 0.76f, 0.81f); + glLineWidth(1); + + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(width, m_dBmScale.mainPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(width - 4, m_dBmScale.mainPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + + glColor3f(0.45f, 0.56f, 0.61f); + if (sublen > 0) { + + glBegin(GL_LINES); + for (int i = 0; i < sublen; i++) { + + glVertex3f(width, m_dBmScale.subPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(width - 2, m_dBmScale.subPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + } + + glColor3f(0.75f, 0.86f, 0.91f); + for (int i = 0; i < len; i++) { + + textRect.moveBottom(m_dBmScale.mainPointPositions.at(i) + textRect.height()/2); + + if (textRect.y() >= yOld && textRect.bottom() <= (m_dBmScalePanRect.height() - textRect.height())) { + + str = QString::number(m_dBmScale.mainPoints.at(i), 'f', 1); + m_oglTextSmall->renderText(textRect.x() + fontMaxWidth - m_fonts.smallFontMetrics->tightBoundingRect(str).width(), textRect.y(), str); + yOld = textRect.bottom(); + } + } + } + + textRect.moveTop(m_dBmScalePanRect.height() - textRect.height()); + glColor3f(0.94f, 0.22f, 0.43f); + + str = QString("dBm"); + m_oglTextSmall->renderText(textRect.x(), textRect.y(), str); + + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); +} + +void QGLDistancePanel::renderPanHorizontalScale() { + + //GRAPHICS_DEBUG << "render frequency scale"; + //QFontMetrics d_fm(m_smallFont); + int fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0kMGHz").height(); + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000.000.0").width(); + + qreal freqSpan = (qreal)(m_sampleRate * m_freqScaleZoomFactor); + qreal lowerFreq = (qreal)m_frequency - freqSpan / 2; + qreal upperFreq = (qreal)m_frequency + freqSpan / 2; + qreal unit = (qreal)(m_freqScalePanRect.width() / freqSpan); + + m_frequencyScale = getXRuler(m_freqScalePanRect, fontMaxWidth, unit, lowerFreq, upperFreq); + + // draw the frequency scale + int offset_X = -1; + int textOffset_y = 5; + double freqScale = 1; + + QString fstr = QString(" Hz "); + if (upperFreq >= 1e6) { freqScale = 1e6; fstr = QString(" MHz "); } + else + if (upperFreq >= 1e3) { freqScale = 1e3; fstr = QString(" kHz "); } + + // draw the scale background + drawGLScaleBackground(QRect(0, 0, m_freqScalePanRect.width(), m_freqScalePanRect.height()), QColor(0, 0, 0, 255)); + + QRect scaledTextRect(0, textOffset_y, 1, m_freqScalePanRect.height()); + scaledTextRect.setWidth(m_fonts.smallFontMetrics->width(fstr)); + scaledTextRect.moveLeft(m_freqScalePanRect.width() - scaledTextRect.width()); + + glColor3f(0.65f, 0.76f, 0.81f); + int len = m_frequencyScale.mainPointPositions.length(); + if (len > 0) { + + glLineWidth(3); + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_frequencyScale.mainPointPositions.at(i), 1.0f, 0.0f); + glVertex3f(m_frequencyScale.mainPointPositions.at(i), 4.0f, 0.0f); + } + glEnd(); + + for (int i = 0; i < len; i++) { + + QString str = QString::number(m_frequencyScale.mainPoints.at(i) / freqScale, 'f', 3); + + if (i > 0) { + + double delta = m_frequencyScale.mainPoints.at(i) - m_frequencyScale.mainPoints.at(i-1); + if (delta < 1000.0) + str = QString::number(m_frequencyScale.mainPoints.at(i) / freqScale, 'f', 4); + else + if (freqScale == 1e3) + while (str.endsWith('0')) str.remove(str.size() - 1, 1); + } + if (str.endsWith('.')) str.remove(str.size() - 1, 1); + + int text_width = m_fonts.smallFontMetrics->width(str); + QRect textRect(m_frequencyScale.mainPointPositions.at(i) + offset_X - (text_width / 2), textOffset_y, text_width, fontHeight); + + if (textRect.left() < 0 || textRect.right() >= scaledTextRect.left()) continue; + + m_oglTextSmall->renderText(textRect.x(), textRect.y(), str); + } + } + + if (m_frequencyScale.subPointPositions.length() > 0) { + + glLineWidth(1); + glBegin(GL_LINES); + for (int i = 0; i < m_frequencyScale.subPointPositions.length(); i++) { + + glVertex3f(m_frequencyScale.subPointPositions.at(i), 1.0f, 0.0f); + glVertex3f(m_frequencyScale.subPointPositions.at(i), 3.0f, 0.0f); + } + glEnd(); + } + + glColor3f(0.94f, 0.22f, 0.43f); + m_oglTextSmall->renderText(m_freqScalePanRect.width() - 30, textOffset_y, fstr); +} + +void QGLDistancePanel::renderPanadapterGrid() { + + //GRAPHICS_DEBUG << "render panadapter grid"; + //glLineStipple(1, 0xCCCC); + glClear(GL_COLOR_BUFFER_BIT); + glLineStipple(1, 0x9999); + glEnable(GL_LINE_STIPPLE); + glLineWidth(1.0f); + + // vertical lines + int len = m_frequencyScale.mainPointPositions.length(); + if (len > 0) { + + GLint x1 = m_panRect.left(); + GLint x2 = 1; + if (m_dBmScalePanRect.isValid()) x2 += m_dBmScalePanRect.width(); + + //GLint y1 = rect.top() + 1; + GLint y1 = 1; + GLint y2 = m_panRect.bottom() - 1; + + TGL2int *vertexArray = new TGL2int[len * 2]; + int vertexArrayLen = 0; + + TGL2int point1, point2; + point1.y = y1; + point2.y = y2; + for (int i = 0; i < len; i++) { + + GLint x = m_frequencyScale.mainPointPositions.at(i); + if (x < x2) continue; + x += x1; + point1.x = x; + point2.x = x; + vertexArray[vertexArrayLen++] = point1; + vertexArray[vertexArrayLen++] = point2; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_INT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, vertexArrayLen); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + } + + // horizontal lines + len = m_dBmScale.mainPointPositions.length(); + if (len > 0) { + + TGL2float *vertexArray = new TGL2float[len * 2]; + int vertexArrayLen = 0; + + TGL2float point1, point2; + point1.x = m_panRect.left() + m_dBmScalePanRect.width(); + point2.x = m_panRect.right(); + + for (int i = 0; i < len; i++) { + + GLfloat y = m_dBmScale.mainPointPositions.at(i); + + point1.y = y; + point2.y = y; + + vertexArray[vertexArrayLen++] = point1; + vertexArray[vertexArrayLen++] = point2; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, vertexArrayLen); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + + } + glDisable(GL_LINE_STIPPLE); +} + + +//******************************************************************** + +void QGLDistancePanel::getRegion(QPoint p) { + + QRect mouse_rect(0, 0, 100, 100); + mouse_rect.moveCenter(p); + + if (m_freqScalePanRect.contains(p)) { + + m_mouseRegion = freqScalePanadapterRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else if (m_dBmScalePanRect.contains(p)) { + + m_mouseRegion = dBmScalePanadapterRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else if (abs(p.x() - m_filterRect.left()) < m_snapMouse && + m_panRect.contains(p) + ) { + m_mouseRegion = filterRegionLow; + m_mouseDownFilterFrequencyLo = m_filterLowerFrequency; + } + + else if (abs(p.x() - m_filterRect.right()) < m_snapMouse && + m_panRect.contains(p) + ) { + m_mouseRegion = filterRegionHigh; + m_mouseDownFilterFrequencyHi = m_filterUpperFrequency; + } + + else if (m_panRect.contains(p)) { + + m_mouseRegion = panadapterRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + + else if (m_freqScaleDistancePanRect.contains(p)) { + + m_mouseRegion = freqScaleDistancePanRegion; + m_distRulerUpdate = true; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + + else if (m_dBmScaleDistancePanRect.contains(p)) { + + m_mouseRegion = dBmScaleDistancePanRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else if (m_distanceSpectrumRect.contains(p)) { + + m_mouseRegion = distancePanRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else + m_mouseRegion = elsewhere; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + updateGL(); + update(); + }*/ + //GRAPHICS_DEBUG << "region" << m_mouseRegion; +} + +void QGLDistancePanel::resizeGL(int iWidth, int iHeight) { + + int width = (int)(iWidth/2) * 2; + int height = iHeight; + + if (width != m_oldWidth) { + + m_freqScalePanadapterRenew = true; + m_panGridRenew = true; + + m_oldWidth = width; + } + + m_spectrumVertexColorUpdate = true; + //m_displayData.size = QSize(width, height); + + glFinish(); + + m_resizeTime.restart(); + setupDisplayRegions(QSize(width, height)); + glViewport(0, 0, (GLsizei)width, (GLsizei)height); + + setProjectionOrthographic(width, height); +} + +void QGLDistancePanel::setupDisplayRegions(QSize size) { + + m_displayTop = 0; + int freqScaleRectHeight = 20; + int dBmScaleWidth = 45; + int distScaleRectHeight = 20; + + m_freqScalePanRect = QRect( + 0, + m_displayTop + qRound((size.height() - m_displayTop - freqScaleRectHeight) * m_freqRulerPosition), + size.width(), + freqScaleRectHeight); + + m_panRect = QRect( + 0, + m_displayTop, + size.width(), + m_freqScalePanRect.top() - m_displayTop); + + if (m_panRect.height() != m_oldPanRectHeight) { + + m_dBmScalePanadapterRenew = true; + m_panGridRenew = true; + } + + m_oldPanRectHeight = m_panRect.height(); + m_panRectWidth = (GLint)m_panRect.width(); + + m_freqScaleDistancePanRect = QRect( + 0, + size.height() - m_displayTop - distScaleRectHeight + 1, + size.width(), + distScaleRectHeight); + + m_distanceSpectrumRect = QRect( + m_freqScalePanRect.left(), + m_freqScalePanRect.bottom(), + m_freqScalePanRect.width(), + size.height() - m_displayTop - m_freqScalePanRect.bottom() - distScaleRectHeight + 1); + + m_distancePanRect = QRect( + m_freqScalePanRect.left(), + m_freqScalePanRect.bottom(), + m_freqScalePanRect.width(), + size.height() - m_displayTop - m_freqScalePanRect.bottom() - distScaleRectHeight + 1); + + m_dBmScaleDistancePanRect = QRect( + m_distanceSpectrumRect.right() - dBmScaleWidth, + m_freqScalePanRect.bottom(), + dBmScaleWidth, + size.height() - m_displayTop - m_freqScalePanRect.bottom() - distScaleRectHeight + 1); + + m_dBmScalePanRect = QRect( + m_panRect.left(), + m_displayTop, + 45, + m_panRect.height()); + + m_freqScalePanadapterUpdate = true; + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + + //*************************************************************************** + /*GRAPHICS_DEBUG << "***************************************************************************"; + GRAPHICS_DEBUG << "total size" << size.height(); + GRAPHICS_DEBUG << "sizes (top, bottom, height):"; + GRAPHICS_DEBUG << "panRect: " << m_panRect.top() << " " << m_panRect.bottom() << " " << m_panRect.height(); + GRAPHICS_DEBUG << "freqScalePanRect: " << m_freqScalePanRect.top() << " " << m_freqScalePanRect.bottom() << " " << m_freqScalePanRect.height(); + GRAPHICS_DEBUG << "dBmScalePanRect: " << m_dBmScalePanRect.top() << " " << m_dBmScalePanRect.bottom() << " " << m_dBmScalePanRect.height(); + GRAPHICS_DEBUG << "m_distanceSpectrumRect: " << m_distanceSpectrumRect.top() << " " << m_distanceSpectrumRect.bottom() << " " << m_distanceSpectrumRect.height(); + GRAPHICS_DEBUG << "m_freqScaleDistancePanRect: " << m_freqScaleDistancePanRect.top() << " " << m_freqScaleDistancePanRect.bottom() << " " << m_freqScaleDistancePanRect.height(); + GRAPHICS_DEBUG << "m_dBmScaleDistancePanRect: " << m_dBmScaleDistancePanRect.top() << " " << m_dBmScaleDistancePanRect.bottom() << " " << m_dBmScaleDistancePanRect.height(); + GRAPHICS_DEBUG << "";*/ +} + +void QGLDistancePanel::saveGLState() { + + glPushAttrib(GL_ALL_ATTRIB_BITS); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); +} + +void QGLDistancePanel::restoreGLState() { + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPopAttrib(); +} + +//******************************************************************** +// HMI control + +void QGLDistancePanel::enterEvent(QEvent *event) { + + setFocus(Qt::MouseFocusReason); + + m_mousePos = QPoint(-1, -1); + m_mouseRegion = elsewhere; + update(); + + QGLWidget::enterEvent(event); +} + +void QGLDistancePanel::leaveEvent(QEvent *event) { + + m_mousePos = QPoint(-1, -1); + m_mouseRegion = elsewhere; + update(); + + QGLWidget::leaveEvent(event); +} + +void QGLDistancePanel::wheelEvent(QWheelEvent* event) { + + //GRAPHICS_DEBUG << "wheelEvent"; + QPoint pos = event->pos(); + + if (event->buttons() == Qt::NoButton) getRegion(pos); + + double freqStep = set->getMouseWheelFreqStep(0); + + switch (m_mouseRegion) { + + case panadapterRegion: + + double delta = 0; + if (event->delta() < 0) delta = -freqStep; + else + if (event->delta() > 0) delta = freqStep; + + if (m_frequency + delta > MAXFREQUENCY) + m_frequency = MAXFREQUENCY; + else + if (m_frequency + delta < 0) + m_frequency = 0; + else + // snap to the frequency step + m_frequency = (long)(qRound((m_frequency + delta) / qAbs(freqStep)) * qAbs(freqStep)); + + //set->setFrequency(this, true, 0, m_frequency); + set->setVFOFrequency(this, 0, 0, m_frequency); + + /*if (m_spectrumAveragingOld) { + + m_spectrumAveragingOld = true; + m_spectrumAveraging = false; + + freqChangeTimer.restart(); + }*/ + break; + } + + //updateGL(); + update(); +} + +void QGLDistancePanel::mousePressEvent(QMouseEvent* event) { + + //GRAPHICS_DEBUG << "mousePressEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == panadapterRegion) { + + if (event->buttons() == Qt::RightButton) { + + if (m_crossHairCursor) { + + m_crossHairCursor = false; + setCursor(Qt::ArrowCursor); + } + else { + + m_crossHairCursor = true; + setCursor(Qt::BlankCursor); + } + } + else if (event->buttons() == Qt::LeftButton && m_crossHairCursor) { + + double freqStep = set->getMouseWheelFreqStep(0); + int dx = m_panRect.width()/2 - m_mousePos.x(); + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width()); + m_frequency -= unit * dx; + + m_frequency = (long)(qRound(m_frequency / qAbs(freqStep)) * qAbs(freqStep)); + + //set->setFrequency(this, true, 0, m_frequency); + set->setVFOFrequency(this, 0, 0, m_frequency); + update(); + } + } + else if (m_mouseRegion == freqScalePanadapterRegion) { + + m_rulerMouseDownPos = m_freqScalePanRect.topLeft(); + + if (event->buttons() == Qt::RightButton) setCursor(Qt::SplitHCursor); + update(); + + return; + } + else if (m_mouseRegion == freqScaleDistancePanRegion) { + + m_rulerMouseDownPos = m_freqScaleDistancePanRect.topLeft(); + + if (event->buttons() == Qt::RightButton) setCursor(Qt::SplitHCursor); + update(); + + return; + } + else if (m_mouseRegion == dBmScalePanadapterRegion) { + + m_rulerMouseDownPos = m_dBmScaleDistancePanRect.topLeft(); + + if (event->buttons() == Qt::RightButton) setCursor(Qt::SplitVCursor); + update(); + + return; + } + else if (m_mouseRegion == dBmScaleDistancePanRegion) { + + m_rulerMouseDownPos = m_dBmScaleDistancePanRect.topLeft(); + + if (event->buttons() == Qt::RightButton) setCursor(Qt::SplitVCursor); + update(); + + return; + } + + update(); +} + +void QGLDistancePanel::mouseReleaseEvent(QMouseEvent *event) { + + //GRAPHICS_DEBUG << "mouseReleaseEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == freqScalePanadapterRegion) { + + return; + } + else if (m_mouseRegion == freqScaleDistancePanRegion) { + + return; + } + else if (m_mouseRegion == dBmScaleDistancePanRegion) { + + if (event->button() == Qt::LeftButton && m_showZerodBmLine) { + + m_showZerodBmLine = false; + } + else if (event->button() == Qt::RightButton) { + } + update(); + return; + } + update(); +} + +void QGLDistancePanel::mouseMoveEvent(QMouseEvent* event) { + + //GRAPHICS_DEBUG << "mouseMoveEvent"; + QPoint pos = event->pos(); + m_mousePos = event->pos(); + + if (event->buttons() == Qt::NoButton) getRegion(pos); + + switch (m_mouseRegion) { + + case distancePanRegion: + //GRAPHICS_DEBUG << "distancePanRegion"; + setCursor(Qt::ArrowCursor); + //update(); + break; + + case panadapterRegion: + //GRAPHICS_DEBUG << "panadapterRegion Rx:" << m_receiver; + if (m_crossHairCursor) + setCursor(Qt::BlankCursor); + else + setCursor(Qt::ArrowCursor); + + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_freqScalePanRect.width()); + qreal deltaFreq = unit * dPos.x(); + + long newFrequency = m_frequency + deltaFreq; + if (newFrequency > MAXFREQUENCY) + newFrequency = MAXFREQUENCY; + else + if (newFrequency + deltaFreq < 0) + newFrequency = 0; + else + m_frequency += deltaFreq; + + //set->setFrequency(this, true, 0, m_frequency); + set->setVFOFrequency(this, 0, 0, m_frequency); + m_mouseDownPos = pos; + } + //update(); + break; + + case dBmScalePanadapterRegion: + //GRAPHICS_DEBUG << "dBmScalePanadapterRegion"; + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal unit = (qreal)(qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height()); + + qreal newMin = m_dBmPanMin - unit * dPos.y(); + qreal newMax = m_dBmPanMax - unit * dPos.y(); + + if (newMin > MINDBM && newMax < MAXDBM) { + + m_dBmPanMin = newMin; + m_dBmPanMax = newMax; + + set->setdBmPanScaleMin(0, m_dBmPanMin); + set->setdBmPanScaleMax(0, m_dBmPanMax); + } + + m_mouseDownPos = pos; + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + } + else + if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.y() > 0) + m_dBmPanDelta = 1.0; + else if (dPos.y() < 0) + m_dBmPanDelta = -1.0f; + + m_dBmPanMin += m_dBmPanDelta; + m_dBmPanMax -= m_dBmPanDelta; + + if (qAbs(m_dBmPanMax - m_dBmPanMin) < 10) { + + m_dBmPanMin -= m_dBmPanDelta; + m_dBmPanMax += m_dBmPanDelta; + } + if (m_dBmPanMin < MINDBM) m_dBmPanMin = MINDBM; + if (m_dBmPanMax > MAXDBM) m_dBmPanMax = MAXDBM; + + set->setdBmPanScaleMin(0, m_dBmPanMin); + set->setdBmPanScaleMax(0, m_dBmPanMax); + + m_mouseDownPos = pos; + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + } + else + setCursor(Qt::ArrowCursor); + + //update(); + break; + + case dBmScaleDistancePanRegion: + //GRAPHICS_DEBUG << "dBmScaleDistancePanRegion"; + if (event->buttons() == Qt::LeftButton && + event->modifiers() == Qt::ControlModifier) { + + m_showZerodBmLine = true; + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = (qreal)(qAbs(m_dBmDistScaleMax - m_dBmDistScaleMin) / m_distanceSpectrumRect.height()); + + qreal newMin = m_dBmDistScaleMin - unit * dPos.y(); + qreal newMax = m_dBmDistScaleMax - unit * dPos.y(); + + if (newMin > MINDISTDBM && newMax < MAXDISTDBM) { + + m_dBmDistScaleMin = newMin; + m_dBmDistScaleMax = newMax; + } + m_mouseDownPos = pos; + } + else + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = (qreal)(qAbs(m_dBmDistMax - m_dBmDistMin) / m_distanceSpectrumRect.height()); + + qreal newMin = m_dBmDistMin - unit * dPos.y(); + qreal newMax = m_dBmDistMax - unit * dPos.y(); + + if (newMin > MINDISTDBM && newMax < MAXDISTDBM) { + + m_dBmDistMin = newMin; + m_dBmDistMax = newMax; + } + m_mouseDownPos = pos; + + m_dBmDistScaleMin = m_dBmDistMin; + m_dBmDistScaleMax = m_dBmDistMax; + } + else + if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.y() > 0) + m_dBmDistDelta = 1.0; + else if (dPos.y() < 0) + m_dBmDistDelta = -1.0f; + + m_dBmDistMin += m_dBmDistDelta; + m_dBmDistMax -= m_dBmDistDelta; + + if (qAbs(m_dBmDistMax - m_dBmDistMin) < 10) { + + m_dBmDistMin -= m_dBmDistDelta; + m_dBmDistMax += m_dBmDistDelta; + } + if (m_dBmDistMin < MINDISTDBM) m_dBmDistMin = MINDISTDBM; + if (m_dBmDistMax > MAXDISTDBM) m_dBmDistMax = MAXDISTDBM; + + m_dBmDistScaleMin = m_dBmDistMin; + m_dBmDistScaleMax = m_dBmDistMax; + + m_mouseDownPos = pos; + } + else + setCursor(Qt::ArrowCursor); + //update(); + break; + + case freqScalePanadapterRegion: + //GRAPHICS_DEBUG << "freqScalePanadapterRegion Rx" << m_receiver; + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + int bottom_y = height() - m_freqScalePanRect.height(); + int new_y = m_rulerMouseDownPos.y() - dPos.y(); + + if (new_y < m_panRect.top() + m_panSpectrumMinimumHeight) + new_y = m_panRect.top() + m_panSpectrumMinimumHeight; + if (new_y > bottom_y) + new_y = bottom_y; + + m_freqRulerPosition = (float)(new_y - m_panRect.top()) / (bottom_y - m_panRect.top()); + set->setFreqRulerPosition(this, 0, m_freqRulerPosition); + } + else + if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.x() > 0) + m_freqScaleZoomFactor += 0.01; + else if (dPos.x() < 0) + m_freqScaleZoomFactor -= 0.01; + + if (m_freqScaleZoomFactor > 1.0) m_freqScaleZoomFactor = 1.0; + //if (m_freqScaleZoomFactor < 0.05) m_freqScaleZoomFactor = 0.05; + if (m_freqScaleZoomFactor < 0.15) m_freqScaleZoomFactor = 0.15; + + m_mouseDownPos = pos; + m_freqScalePanadapterUpdate = true; + m_panGridUpdate = true; + } + else + setCursor(Qt::ArrowCursor); + + //update(); + break; + + case freqScaleDistancePanRegion: + //GRAPHICS_DEBUG << "freqScaleDistancePanRegion"; + if (event->buttons() == Qt::LeftButton) { + + if (m_distScaleZoomFactor < 1.0) { + QPoint dPos = m_mouseDownPos - pos; + if (dPos.x() > 0) + m_distRulerDisplayDelta += m_distRulerDisplayDeltaStep; + else if (dPos.x() < 0) + m_distRulerDisplayDelta -= m_distRulerDisplayDeltaStep; + + if (m_distRulerDisplayDelta < 0) + m_distRulerDisplayDelta = 0.0; + + if (m_distRulerDisplayDelta > m_chirpBufferLength * m_kilometersPerGate) + m_distRulerDisplayDelta -= m_distRulerDisplayDeltaStep; + + m_mouseDownPos = pos; + } + else + m_distRulerDisplayDelta = 0.0; + } + else if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.x() > 0) + m_distScaleZoomFactor += 0.005; + else if (dPos.x() < 0) + m_distScaleZoomFactor -= 0.005; + + if (m_distScaleZoomFactor > 1.0) m_distScaleZoomFactor = 1.0; + if (m_distScaleZoomFactor < 0.1) m_distScaleZoomFactor = 0.1; + + m_mouseDownPos = pos; + } + else + setCursor(Qt::ArrowCursor); + + //update(); + break; + + case filterRegionLow: + + setCursor(Qt::SizeHorCursor); + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal dFreq = (qreal)(dPos.x() * m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width(); + + m_filterLowerFrequency = qRound(m_mouseDownFilterFrequencyLo - dFreq); + set->setRXFilter(this, 0, m_filterLowerFrequency, m_filterUpperFrequency); + } + break; + + case filterRegionHigh: + + setCursor(Qt::SizeHorCursor); + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal dFreq = (qreal)(dPos.x() * m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width(); + + m_filterUpperFrequency = qRound(m_mouseDownFilterFrequencyHi - dFreq); + set->setRXFilter(this, 0, m_filterLowerFrequency, m_filterUpperFrequency); + } + break; + + case elsewhere: + //GRAPHICS_DEBUG << "elsewhere"; + + //update(); + break; + } + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + //setupDisplayRegions(size()); + //update(); + + //locker.unlock(); +} + +void QGLDistancePanel::keyPressEvent(QKeyEvent* event) { + + //GRAPHICS_DEBUG << "keyPressEvent"; + if (event->key() == Qt::Key_Control) { + + //m_keyCTRLpressed = true; + //GRAPHICS_DEBUG << "m_keyCTRLpressed =" << m_keyCTRLpressed; + //printf("Ry %f\n",ry); + //ry+=10.0f; + } + else if (event->key() == Qt::Key_T) { + + //printf("Ry %f\n",ry); + //ry-=10.0f; + } + else if (event->key() == Qt::Key_P) { + + //drawTeapot = !drawTeapot; + } + else if (event->key() == Qt::Key_W) { + + //approach -= 0.1f; + } + else if (event->key() == Qt::Key_S) { + + //approach += 0.1f; + } + else { + + //m_keyCTRLpressed = false; + //GRAPHICS_DEBUG << "m_keyCTRLpressed =" << m_keyCTRLpressed; + //event->ignore(); + } + + QWidget::keyPressEvent(event); + //updateGL(); + update(); +} + +void QGLDistancePanel::timerEvent(QTimerEvent *) { + + update(); +} + +//******************************************************************** + +void QGLDistancePanel::setFrequency(QObject *sender, bool value, long freq) { + + Q_UNUSED(sender) + Q_UNUSED(value) + + m_frequency = freq; + //m_displayData.frequency = freq; + m_freqScalePanadapterUpdate = true; + m_panGridUpdate = true; + + //updateGL(); + update(); +} + +void QGLDistancePanel::setFilterFrequencies(QObject *sender, int rx, qreal lo, qreal hi) { + + Q_UNUSED(sender) + + if (rx == 0) { + + m_filterLowerFrequency = lo; + m_filterUpperFrequency = hi; + } + + update(); +} + +void QGLDistancePanel::freqRulerPositionChanged(float pos, int rx) { + + if (rx == 0) { + + m_freqRulerPosition = pos; + + setupDisplayRegions(size()); + update(); + } +} + +void QGLDistancePanel::setSpectrumBuffer(const float *buffer) { + + if (m_spectrumAveraging) { + + QVector m_specBuf(SAMPLE_BUFFER_SIZE); + + //spectrumBufferMutex.lock(); + + memcpy( + (float *) m_specBuf.data(), + (float *) &buffer[0], + SAMPLE_BUFFER_SIZE * sizeof(float)); + + specAv_queue.enqueue(m_specBuf); + if (specAv_queue.size() <= m_specAveragingCnt) { + + for (int i = 0; i < SAMPLE_BUFFER_SIZE; i++) + m_tmpBuf[i] += specAv_queue.last().data()[i]; + + //spectrumBufferMutex.unlock(); + return; + } + + for (int i = 0; i < SAMPLE_BUFFER_SIZE; i++) { + + m_tmpBuf[i] -= specAv_queue.first().at(i); + m_tmpBuf[i] += specAv_queue.last().at(i); + m_avgBuf[i] = m_tmpBuf[i] * m_scale; + } + + computeDisplayBins(m_avgBuf); + specAv_queue.dequeue(); + + //spectrumBufferMutex.unlock(); + } + else + computeDisplayBins(buffer); +} + +void QGLDistancePanel::computeDisplayBins(const float *panBuffer) { + + int newSampleSize = 0; + int deltaSampleSize = 0; + int idx = 0; + int lIdx = 0; + int rIdx = 0; + qreal localMax; + + if (m_serverMode == QSDR::ChirpWSPRFile) { + + newSampleSize = (int)floor(2 * BUFFER_SIZE * m_freqScaleZoomFactor); + deltaSampleSize = 2 * BUFFER_SIZE - newSampleSize; + } + else { + + newSampleSize = (int)floor(4 * BUFFER_SIZE * m_freqScaleZoomFactor); + deltaSampleSize = 4 * BUFFER_SIZE - newSampleSize; + } + + /*if (deltaSampleSize%2 != 0) { + deltaSampleSize += 1; + newSampleSize -= 1; + }*/ + + m_panScale = (qreal)(1.0 * newSampleSize / m_panRectWidth); + m_scaleMultOld = m_scaleMult; + + if (m_panScale < 0.125) { + m_scaleMult = 0.0625; + } + else if (m_panScale < 0.25) { + m_scaleMult = 0.125; + } + else if (m_panScale < 0.5) { + m_scaleMult = 0.25; + } + else if (m_panScale < 1.0) { + m_scaleMult = 0.5; + } + else { + m_scaleMult = 1.0; + } + + m_panSpectrumBinsLength = (GLint)(m_scaleMult * m_panRectWidth); + + /*if (bins != binsOld) { + + GRAPHICS_DEBUG << "newSampleSize" << newSampleSize; + GRAPHICS_DEBUG << "m_panScale" << m_panScale; + GRAPHICS_DEBUG << "bins:" << bins; + }*/ + + m_panadapterBins.clear(); + + for (int i = 0; i < m_panSpectrumBinsLength; i++) { + + idx = 0; + lIdx = (int)floor((qreal)(i * m_panScale / m_scaleMult)); + rIdx = (int)floor((qreal)(i * m_panScale / m_scaleMult) + m_panScale / m_scaleMult); + + // max value; later we try mean value also! + localMax = -10000.0F; + for (int j = lIdx; j < rIdx; j++) { + + if (panBuffer[j] > localMax) { + + localMax = panBuffer[j]; + idx = j; + } + } + idx += deltaSampleSize/2; + + m_panadapterBins << panBuffer[idx] - m_dBmPanMin - m_dBmPanLogGain; + } + update(); +} + +void QGLDistancePanel::setDistanceSpectrumBuffer(int sampleRate, qint64 length, const float *buffer) { + + Q_UNUSED(sampleRate) + Q_UNUSED(length) + Q_UNUSED(buffer) +} + +void QGLDistancePanel::distanceSpectrumBufferChanged(int sampleRate, qint64 length, const float *buffer) { + + Q_UNUSED(sampleRate) + + distanceSpectrumBufferMutex.lock(); + m_kilometersPerGate = 1.0f * 3E5 / sampleRate; + //m_kilometersPerGate = 0.5f * 3E5 / 12000; + m_chirpBufferLength = length; + memcpy(m_distanceSpectrumBuffer, buffer, m_chirpBufferLength * sizeof(float)); + distanceSpectrumBufferMutex.unlock(); + + update(); +} + +// get waterfall colors - taken from PowerSDR/KISS Konsole +//QColor QGLDistancePanel::getWaterfallColorAtPixel(qreal value) { +// +// QColor color; +// //int r = 0; int g = 0; int b = 0; +// int r, g, b; +// int lowerThreshold = (int)m_dBmPanMin - m_waterfallOffsetLo; +// int upperThreshold = (int)m_dBmPanMax + m_waterfallOffsetHi; +// +// float offset; +// float globalRange; +// float localRange; +// float percent; +// +// switch (m_waterColorScheme) { +// +// case QSDRGraphics::simple: +// +// if (value <= lowerThreshold) +// color = m_waterfallLoColor; +// else +// if (value >= upperThreshold) +// color = QColor(255, 255, 255);//m_waterfallHiColor; +// else { +// +// percent = (value - lowerThreshold) / (upperThreshold - lowerThreshold); +// if (percent <= 0.5) { // use a gradient between low and mid colors +// +// percent *= 2; +// +// r = (int)((1 - percent) * m_waterfallLoColor.red() + percent * m_waterfallMidColor.red()); +// g = (int)((1 - percent) * m_waterfallLoColor.green() + percent * m_waterfallMidColor.green()); +// b = (int)((1 - percent) * m_waterfallLoColor.blue() + percent * m_waterfallMidColor.blue()); +// } +// else { // use a gradient between mid and high colors +// +// percent = (float)(percent - 0.5) * 2; +// +// r = (int)((1 - percent) * m_waterfallMidColor.red() + percent * 255);//m_waterfallHiColor.red()); +// g = (int)((1 - percent) * m_waterfallMidColor.green() + percent * 255);//m_waterfallHiColor.green()); +// b = (int)((1 - percent) * m_waterfallMidColor.blue() + percent * 255);//m_waterfallHiColor.blue()); +// } +// +// if (r > 255) r = 255; +// if (g > 255) g = 255; +// if (b > 255) b = 255; +// color = QColor(r, g, b, m_waterfallAlpha); +// } +// +// break; +// +// case QSDRGraphics::enhanced: +// +// if (value <= lowerThreshold) +// color = m_waterfallLoColor; +// else +// if (value >= upperThreshold) +// color = m_waterfallHiColor; +// else { +// +// offset = value - lowerThreshold; +// globalRange = offset / m_waterfallColorRange; // value from 0.0 to 1.0 where 1.0 is high and 0.0 is low. +// +// if (globalRange < (float)2/9) { // background to blue +// +// localRange = globalRange / ((float)2/9); +// r = (int)((1.0 - localRange) * m_waterfallLoColor.red()); +// g = (int)((1.0 - localRange) * m_waterfallLoColor.green()); +// b = (int)(m_waterfallLoColor.blue() + localRange * (255 - m_waterfallLoColor.blue())); +// } +// else +// if (globalRange < (float)3/9) { // blue to blue-green +// +// localRange = (globalRange - (float)2/9) / ((float)1/9); +// r = 0; +// g = (int)(localRange * 255); +// b = 255; +// } +// else +// if (globalRange < (float)4/9) { // blue-green to green +// +// localRange = (globalRange - (float)3/9) / ((float)1/9); +// r = 0; +// g = 255; +// b = (int)((1.0 - localRange) * 255); +// } +// else +// if (globalRange < (float)5/9) { // green to red-green +// +// localRange = (globalRange - (float)4/9) / ((float)1/9); +// r = (int)(localRange * 255); +// g = 255; +// b = 0; +// } +// else +// if (globalRange < (float)7/9) { // red-green to red +// +// localRange = (globalRange - (float)5/9) / ((float)2/9); +// r = 255; +// g = (int)((1.0 - localRange) * 255); +// b = 0; +// } +// else +// if (globalRange < (float)8/9) { // red to red-blue +// +// localRange = (globalRange - (float)7/9) / ((float)1/9); +// r = 255; +// g = 0; +// b = (int)(localRange * 255); +// } +// else { // red-blue to purple end +// +// localRange = (globalRange - (float)8/9) / ((float)1/9); +// r = (int)((0.75 + 0.25 * (1.0 - localRange)) * 255); +// g = (int)(localRange * 255 * 0.5); +// b = 255; +// } +// if (r > 255) r = 255; +// if (g > 255) g = 255; +// if (b > 255) b = 255; +// if (r < 0) r = 0; +// if (g < 0) g = 0; +// if (b < 0) b = 0; +// color = QColor(r, g, b, m_waterfallAlpha); +// } +// +// break; +// +// case QSDRGraphics::spectran: +// +// break; +// } +// +// return color; +//} + +void QGLDistancePanel::setChirpFFTShow(bool value) { + + distanceSpectrumBufferMutex.lock(); + m_showChirpFFT = value; + distanceSpectrumBufferMutex.unlock(); + + update(); +} + +void QGLDistancePanel::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + Q_UNUSED (hwmode) + Q_UNUSED (state) + + if (m_dataEngineState != state) + m_dataEngineState = state; + + if (m_serverMode != mode) { + + //memset(m_wbSpectrumBuffer, -10000, 4 * BUFFER_SIZE * sizeof(float)); + memset(m_spectrumBuffer, -10000, 4 * BUFFER_SIZE * sizeof(float)); + memset(m_distanceSpectrumBuffer, -10000, 16 * BUFFER_SIZE * sizeof(float)); + m_serverMode = mode; + } + + //resizeGL(width(), height()); + m_displayTime.restart(); + + update(); +} + + +void QGLDistancePanel::graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode colorScheme) +{ + Q_UNUSED (sender) + Q_UNUSED (colorScheme) + Q_UNUSED (rx) + + if (m_panMode != panMode) + m_panMode = panMode; + + /*if (m_waterColorScheme != colorScheme) { + + m_waterColorScheme = colorScheme; + change = true; + }*/ + + //if (!change) return; + + update(); +} + + void QGLDistancePanel::setSpectrumAveraging(bool value) { + + spectrumBufferMutex.lock(); + + if (m_spectrumAveraging == value) + return; + else + m_spectrumAveraging = value; + + spectrumBufferMutex.unlock(); + } + +void QGLDistancePanel::setSpectrumAveragingCnt(int value) { + + spectrumBufferMutex.lock(); + + memset(m_tmpBuf, 0, SAMPLE_BUFFER_SIZE * sizeof(float)); + + while (!specAv_queue.isEmpty()) + specAv_queue.dequeue(); + + m_specAveragingCnt = value; + + if (m_specAveragingCnt > 0) + m_scale = 1.0f / m_specAveragingCnt; + else + m_scale = 1.0f; + + spectrumBufferMutex.unlock(); +} + +void QGLDistancePanel::setPanGridStatus(bool value) { + + spectrumBufferMutex.lock(); + + if (m_panGrid == value) + return; + else + m_panGrid = value; + + spectrumBufferMutex.unlock(); + + update(); +} + +void QGLDistancePanel::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; + update(); +} + +void QGLDistancePanel::setPanadapterColors() { + + m_spectrumColorsChanged = true; + + mutex.lock(); + /*m_bkgRed = (GLfloat)(set->getPanadapterColors().panBackgroundColor.red() / 256.0); + m_bkgGreen = (GLfloat)(set->getPanadapterColors().panBackgroundColor.green() / 256.0); + m_bkgBlue = (GLfloat)(set->getPanadapterColors().panBackgroundColor.blue() / 256.0);*/ + + /*if (m_bkgRed * 1.2 > 1.0) m_bkgRed = 1.0f; + if (m_bkgGreen * 1.2 > 1.0) m_bkgGreen = 1.0f; + if (m_bkgBlue * 1.2 > 1.0) m_bkgBlue = 1.0f; + + if (m_bkgRed * 1.6 > 1.0) m_bkgRed = 1.0f; + if (m_bkgGreen * 1.6 > 1.0) m_bkgGreen = 1.0f; + if (m_bkgBlue * 1.6 > 1.0) m_bkgBlue = 1.0f;*/ + + m_red = (GLfloat)(set->getPanadapterColors().panLineColor.red() / 256.0); + m_green = (GLfloat)(set->getPanadapterColors().panLineColor.green() / 256.0); + m_blue = (GLfloat)(set->getPanadapterColors().panLineColor.blue() / 256.0); + + m_redF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.red() / 256.0); + m_greenF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.green() / 256.0); + m_blueF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.blue() / 256.0); + + m_redST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.red() / 256.0); + m_greenST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.green() / 256.0); + m_blueST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.blue() / 256.0); + + m_redSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.red() / 256.0); + m_greenSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.green() / 256.0); + m_blueSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.blue() / 256.0); + + mutex.unlock(); + + update(); +} + +//void QGLDistancePanel::setWaterfallTime(int rx, int value) { +// +// if (rx == 0) +// m_waterfallTime = value; +//} + +//void QGLDistancePanel::setWaterfallOffesetLo(int rx, int value) { +// +// if (rx == 0) +// m_waterfallOffsetLo = value; +// +// update(); +//} +// +//void QGLDistancePanel::setWaterfallOffesetHi(int rx, int value) { +// +// if (rx = 0) +// m_waterfallOffsetHi = value; +// +// update(); +//} + +void QGLDistancePanel::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void QGLDistancePanel::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} diff --git a/Source/src/GL/cusdr_oglDistancePanel.h b/Source/src/GL/cusdr_oglDistancePanel.h new file mode 100644 index 0000000..d8fc3f0 --- /dev/null +++ b/Source/src/GL/cusdr_oglDistancePanel.h @@ -0,0 +1,318 @@ +/** +* @file cusdr_oglDistancePanel.h +* @brief distance panel header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-14 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_QGL_DISTANCEPANEL_H +#define _CUSDR_QGL_DISTANCEPANEL_H + +#include "cusdr_oglUtils.h" +#include "cusdr_oglInfo.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" +#include "cusdr_oglText.h" + +//#include +//#include +//#include +#include +//#include +//#include + + + +class QGLDistancePanel : public QGLWidget { + + Q_OBJECT + +public: + QGLDistancePanel(QWidget *parent = 0); + ~QGLDistancePanel(); + +public slots: + //QSize minimumSizeHint() const; + QSize sizeHint() const; + + void setSpectrumBuffer(const float *buffer); + void distanceSpectrumBufferChanged(int sampleRate, qint64 length, const float *buffer); + void setFrequency(QObject *sender, bool value, long freq); + +protected: + void initializeGL(); + void resizeGL(int iWidth, int iHeight); + void paintGL(); + + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent * event ); + void keyPressEvent(QKeyEvent* event); + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void timerEvent(QTimerEvent *); + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + PanGraphicsMode m_panMode; + + QTime m_displayTime; + QTime m_resizeTime; + QTime freqChangeTimer; + + CFonts *fonts; + + TScale m_frequencyScale; + TScale m_dBmScale; + TScale m_distanceScale; + TScale m_dBmDistScale; + TFonts m_fonts; + + QList m_rxDataList; + + QVector m_panadapterBins; + QQueue > specAv_queue; + + QGLFramebufferObject* m_frequencyScaleFBO; + QGLFramebufferObject* m_dBmScaleFBO; + QGLFramebufferObject* m_panadapterGridFBO; + QGLFramebufferObject* m_textureFBO; + + QRect m_panRect; + QRect m_dBmScalePanRect; + QRect m_freqScalePanRect; + QRect m_distancePanRect; + QRect m_freqScaleDistancePanRect; + QRect m_dBmScaleDistancePanRect; + QRect m_filterRect; + QRect m_freqScaleWideBandPanRect; + QRect m_dBmScaleWideBandPanRect; + QRect m_distanceSpectrumRect; + + OGLText* m_oglTextTiny; + OGLText* m_oglTextSmall; + OGLText* m_oglTextNormal; + + QPoint m_mousePos; + QPoint m_oldMousePos; + QPoint m_mouseLastPos; + QPoint m_mouseDownPos; + QPoint m_rulerMouseDownPos; + + enum Region { + + freqScalePanadapterRegion, + freqScaleDistancePanRegion, + panadapterRegion, + dBmScalePanadapterRegion, + dBmScaleDistancePanRegion, + distancePanRegion, + filterRegion, + filterRegionLow, + filterRegionHigh, + elsewhere, + out + }; + + long m_frequency; + long m_oldFreq; + + float m_spectrumBuffer[4*BUFFER_SIZE]; + float m_distanceSpectrumBuffer[16*BUFFER_SIZE]; + + float m_scale; + float m_tmpBuf[SAMPLE_BUFFER_SIZE]; + float m_avgBuf[SAMPLE_BUFFER_SIZE]; + + float m_distMax; + + QMutex mutex; + QMutex spectrumBufferMutex; + QMutex distanceSpectrumBufferMutex; + + int m_oldWidth; + int m_oldPanRectHeight; + int m_smallFontHeight; + int m_cnt; + int m_specAveragingCnt; + int m_freqRulerDisplayWidth; + int m_displayTop; + int m_dBmPanLogGain; + int m_panSpectrumMinimumHeight; + + unsigned int timer; + + GLint m_panRectWidth; + GLint m_panSpectrumBinsLength; + + bool m_spectrumUpdate; + bool m_showZerodBmLine; + bool m_spectrumVertexColorUpdate; + bool m_dBmScalePanadapterRenew; + bool m_dBmScalePanadapterUpdate; + bool m_freqScalePanadapterRenew; + bool m_freqScalePanadapterUpdate; + bool m_panGridRenew; + bool m_panGridUpdate; + bool m_distRulerUpdate; + bool m_newWidebandPanFreqRuler; + bool m_spectrumColorsChanged; + bool m_showChirpFFT; + bool m_spectrumAveraging; + bool m_spectrumAveragingOld; + bool m_crossHairCursor; + bool m_panGrid; + + float m_freqRulerPosition; + float m_wideBandZoomFactor; + double m_distRulerKilometerSpan; + double m_distRulerDisplayDelta; + double m_distRulerDisplayDeltaStep; + double m_distRulerMaxDist; + + qreal m_panFrequencyScale; + qreal m_freqScaleZoomFactor; + qreal m_distScaleZoomFactor; + qreal m_dBmPanMin; + qreal m_dBmPanMax; + qreal m_dBmPanDelta; + qreal m_panScale; + qreal m_scaleMult; + qreal m_scaleMultOld; + qreal m_filterLowerFrequency; + qreal m_filterUpperFrequency; + qreal m_mouseDownFilterFrequencyLo; + qreal m_mouseDownFilterFrequencyHi; + qreal m_dBmDistScaleMin; + qreal m_dBmDistScaleMax; + qreal m_dBmDistMin; + qreal m_dBmDistMax; + qreal m_dBmDistDelta; + + int m_mouseRegion; + int m_oldMouseRegion; + int m_snapMouse; + int m_panDisplayMode; + int m_sampleRate; + int m_downRate; + + + double m_kilometersPerGate; + qint64 m_chirpBufferLength; + + GLfloat m_bkgRed; + GLfloat m_bkgGreen; + GLfloat m_bkgBlue; + + GLfloat m_red; + GLfloat m_green; + GLfloat m_blue; + + GLfloat m_redF; + GLfloat m_greenF; + GLfloat m_blueF; + + + GLfloat m_redST; + GLfloat m_greenST; + GLfloat m_blueST; + + GLfloat m_redSB; + GLfloat m_greenSB; + GLfloat m_blueSB; + + GLfloat m_redD; + GLfloat m_greenD; + GLfloat m_blueD; + + //****************************************************************** + //QColor getWaterfallColorAtPixel(qreal value); + + void saveGLState(); + void restoreGLState(); + + // drawing + void paintReceiverDisplay(); + void paintChirpWSPRDisplay(); + + void drawPanadapter(); + void drawPanVerticalScale(); + void drawPanHorizontalScale(); + void drawPanadapterGrid(); + void drawPanFilter(); + void drawCrossHair(); + + void drawDistanceSpectrum(); + void drawDistHorizontalScale(); + void drawDistVerticalScale(); + + void renderPanVerticalScale(); + void renderPanHorizontalScale(); + void renderPanadapterGrid(); + + void computeDisplayBins(const float *panBuffer); + +private slots: + + void systemStateChanged( + QObject* sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject* sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setupConnections(); + void setFilterFrequencies(QObject *sender, int rx, qreal lo, qreal hi); + void setupDisplayRegions(QSize size); + + void setDistanceSpectrumBuffer(int sampleRate, qint64 length, const float *buffer); + void setSpectrumAveraging(bool value); + void setSpectrumAveragingCnt(int value); + void setPanGridStatus(bool value); + void setPanadapterColors(); + void getRegion(QPoint p); + void freqRulerPositionChanged(float pos, int rx); + void sampleRateChanged(QObject *sender, int value); + void setChirpFFTShow(bool value); + +signals: + void showEvent(QObject* sender); + void closeEvent(QObject* sender); + void messageEvent(QString msg); + void coordChanged(int x,int y); +}; + +#endif // _CUSDR_QGL_DISTANCEPANEL_H diff --git a/Source/src/GL/cusdr_oglInfo.cpp b/Source/src/GL/cusdr_oglInfo.cpp new file mode 100644 index 0000000..8044a3e --- /dev/null +++ b/Source/src/GL/cusdr_oglInfo.cpp @@ -0,0 +1,180 @@ +/** +* @file cusdr_oglInfo.cpp +* @brief OpenGL info class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-11-10 +*/ + +/* + * adapted from glInfo.h of Song Ho Ahn (song.ahn@gmail.com) + * Copyright (c) 2005 Song Ho Ahn + * + * (C) 2011 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#include +#include "cusdr_oglUtils.h" +#include "cusdr_oglInfo.h" + +QOpenGLInfo::QOpenGLInfo(QObject *parent) + : QObject(parent) + , set(Settings::instance()) +{ + m_glInfo.redBits = 0; + m_glInfo.greenBits = 0; + m_glInfo.blueBits = 0; + m_glInfo.alphaBits = 0; + m_glInfo.depthBits = 0; + m_glInfo.stencilBits = 0; + m_glInfo.maxTextureSize = 0; + m_glInfo.maxLights = 0; + m_glInfo.maxAttribStacks = 0; + m_glInfo.maxModelViewStacks = 0; + m_glInfo.maxClipPlanes = 0; + m_glInfo.maxTextureStacks = 0; +} + +QOpenGLInfo::~QOpenGLInfo() { +} + +bool QOpenGLInfo::getInfo() { + + QString str; + + // get vendor string + str = QLatin1String(reinterpret_cast(glGetString(GL_EXTENSIONS))); + if(!str.isNull()) + m_glInfo.vendor = str; + else + return false; + + // get renderer string + str = QLatin1String(reinterpret_cast(glGetString(GL_RENDERER))); + //str = (char*)glGetString(GL_RENDERER); + if(!str.isNull()) + m_glInfo.renderer = str; + else + return false; + + // get version string + str = QLatin1String(reinterpret_cast(glGetString(GL_VERSION))); + str = (char*)glGetString(GL_VERSION); + if(!str.isNull()) + m_glInfo.version = str; + else + return false; + + // get all extensions as a string + str = QLatin1String(reinterpret_cast(glGetString(GL_EXTENSIONS))); + //str = (char*)glGetString(GL_EXTENSIONS); + + // split extensions + if(!str.isNull()) { + + m_glInfo.extensions = str.split(' '); + m_glInfo.extensions.sort(); + } + else + return false; + + // get number of color bits + glGetIntegerv(GL_RED_BITS, &m_glInfo.redBits); + glGetIntegerv(GL_GREEN_BITS, &m_glInfo.greenBits); + glGetIntegerv(GL_BLUE_BITS, &m_glInfo.blueBits); + glGetIntegerv(GL_ALPHA_BITS, &m_glInfo.alphaBits); + + // get depth bits + glGetIntegerv(GL_DEPTH_BITS, &m_glInfo.depthBits); + + // get stecil bits + glGetIntegerv(GL_STENCIL_BITS, &m_glInfo.stencilBits); + + // get max number of lights allowed + glGetIntegerv(GL_MAX_LIGHTS, &m_glInfo.maxLights); + + // get max texture resolution + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_glInfo.maxTextureSize); + + // get max number of clipping planes + glGetIntegerv(GL_MAX_CLIP_PLANES, &m_glInfo.maxClipPlanes); + + // get max modelview and projection matrix stacks + glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &m_glInfo.maxModelViewStacks); + glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH, &m_glInfo.maxProjectionStacks); + glGetIntegerv(GL_MAX_ATTRIB_STACK_DEPTH, &m_glInfo.maxAttribStacks); + + // get max texture stacks + glGetIntegerv(GL_MAX_TEXTURE_STACK_DEPTH, &m_glInfo.maxTextureStacks); + + return true; +} + +bool QOpenGLInfo::isExtensionSupported(const QString &extension) { + + for (int i = 0; i < m_glInfo.extensions.size(); ++i) { + + if (extension == m_glInfo.extensions.at(i)) + return true; + } + return false; +} + +void QOpenGLInfo::printSelf() { + + //std::stringstream ss; + + qDebug() << ""; + qDebug() << "OpenGL Driver Info"; + qDebug() << "=================="; + qDebug() << "Vendor: " << m_glInfo.vendor; + qDebug() << "Version: " << m_glInfo.version; + qDebug() << "Renderer: " << m_glInfo.renderer; + + qDebug() << ""; + qDebug() << "Color Bits(R,G,B,A): (" + << m_glInfo.redBits + << ", " << m_glInfo.greenBits + << ", " << m_glInfo.blueBits + << ", " << m_glInfo.alphaBits + << ")\n"; + + qDebug() << "Depth Bits: " << m_glInfo.depthBits; + qDebug() << "Stencil Bits: " << m_glInfo.stencilBits; + + qDebug() << ""; + qDebug() << "Max Texture Size: " + << m_glInfo.maxTextureSize + << "x" + << m_glInfo.maxTextureSize; + + qDebug() << "Max Lights: " << m_glInfo.maxLights; + qDebug() << "Max Clip Planes: " << m_glInfo.maxClipPlanes; + qDebug() << "Max Modelview Matrix Stacks: " << m_glInfo.maxModelViewStacks; + qDebug() << "Max Projection Matrix Stacks: " << m_glInfo.maxProjectionStacks; + qDebug() << "Max Attribute Stacks: " << m_glInfo.maxAttribStacks; + qDebug() << "Max Texture Stacks: " << m_glInfo.maxTextureStacks; + + qDebug() << ""; + qDebug() << "Total Number of Extensions: " << m_glInfo.extensions.size(); + qDebug() << "=============================="; + + for(int i = 0; i < m_glInfo.extensions.size(); ++i) + qDebug() << m_glInfo.extensions.at(i); + + qDebug() << "======================================================================"; +} diff --git a/Source/src/GL/cusdr_oglInfo.h b/Source/src/GL/cusdr_oglInfo.h new file mode 100644 index 0000000..27c8ed8 --- /dev/null +++ b/Source/src/GL/cusdr_oglInfo.h @@ -0,0 +1,82 @@ +/** +* @file cusdr_oglInfo.h +* @brief OpenGL info header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-11-10 +*/ + +/* + * adapted from glInfo.h of Song Ho Ahn (song.ahn@gmail.com) + * Copyright (c) 2005 Song Ho Ahn + * + * (C) 2011 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_OGLINFO_H +#define _CUSDR_OGLINFO_H + +//#include +//#include +//#include + +#include "cusdr_settings.h" + +// struct variable to store OpenGL info +typedef struct _glinfo { + + QString vendor; + QString renderer; + QString version; + QStringList extensions; + + int redBits; + int greenBits; + int blueBits; + int alphaBits; + int depthBits; + int stencilBits; + int maxTextureSize; + int maxLights; + int maxAttribStacks; + int maxModelViewStacks; + int maxProjectionStacks; + int maxClipPlanes; + int maxTextureStacks; + +} t_glinfo; + + +class QOpenGLInfo : public QObject { + + Q_OBJECT + +public: + QOpenGLInfo(QObject *parent = 0); + ~QOpenGLInfo(); + + bool getInfo(); + void printSelf(); + bool isExtensionSupported(const QString &extension); + +private: + Settings* set; + + t_glinfo m_glInfo; +}; + +#endif // _CUSDR_OGLINFO_H diff --git a/Source/src/GL/cusdr_oglReceiverPanel.cpp b/Source/src/GL/cusdr_oglReceiverPanel.cpp new file mode 100644 index 0000000..be79f11 --- /dev/null +++ b/Source/src/GL/cusdr_oglReceiverPanel.cpp @@ -0,0 +1,4486 @@ +/** +* @file cusdr_oglReceiverPanel.cpp +* @brief Receiver panel class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-03-14 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_GRAPHICS + +// use: GRAPHICS_DEBUG + +#include "cusdr_oglReceiverPanel.h" + +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#ifndef GL_MULTISAMPLE +#define GL_MULTISAMPLE 0x809D +#endif + +#define btn_height 14 +#define btn_width 60 +#define btn_widthb 70 +#define btn_widths 34 + +QGLReceiverPanel::QGLReceiverPanel(QWidget *parent, int rx) + : QGLWidget(QGLFormat(QGL::SampleBuffers|QGL::AlphaChannel), parent) + + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_mousePos(QPoint(-1, -1)) + , m_mouseDownPos(QPoint(-1, -1)) + , m_panSpectrumBinsLength(0) + , m_filterLeft(0) + , m_filterRight(0) + , m_filterTop(0) + , m_filterBottom(0) + , m_receiver(rx) + //, m_frequencyRxOnRx(0) + , m_spectrumSize(set->getSpectrumSize()) + , m_sampleSize(0) + , m_oldSampleSize(0) + , m_specAveragingCnt(set->getSpectrumAveragingCnt(m_receiver)) + , m_currentReceiver(set->getCurrentReceiver()) + , m_waterfallAlpha(255) + , m_freqRulerDisplayWidth(0) + , m_oldWaterfallWidth(0) + , m_panSpectrumMinimumHeight(0) + , m_snapMouse(3) + , m_sampleRate(set->getSampleRate()) + , m_downRate(set->getChirpDownSampleRate()) + , m_adcStatus(0) + , m_fftMult(1) + , m_smallSize(true) + , m_spectrumVertexColorUpdate(false) + , m_spectrumColorsChanged(true) + , m_spectrumAveraging(set->getSpectrumAveraging(m_receiver)) + //, m_spectrumAveragingOld(m_spectrumAveraging) + , m_crossHair(set->getHairCrossStatus(m_receiver)) + , m_crossHairCursor(false) + , m_panGrid(set->getPanGridStatus(m_receiver)) + , m_peakHold(false) + , m_filterChanged(true) + , m_showFilterLeftBoundary(false) + , m_showFilterRightBoundary(false) + , m_highlightFilter(false) + , m_peakHoldBufferResize(true) + , m_dragMouse(false) + , m_panLocked(set->getPanLockedStatus(m_receiver)) + , m_clickVFO(set->getClickVFOStatus(m_receiver)) + , m_freqScaleZoomFactor(1.0f) + , m_scaleMult(1.0f) + , m_filterLowerFrequency(-3050.0) + , m_filterUpperFrequency(-150.0) + //, m_freqRulerPosition(0.5) +{ +// QGL::setPreferredPaintEngine(QPaintEngine::OpenGL); + + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + setAutoBufferSwap(true); + setAutoFillBackground(false); + + setMouseTracking(true); + setFocusPolicy(Qt::StrongFocus); + + //GRAPHICS_DEBUG << "set spectrum buffer size to: " << m_spectrumSize; + + m_bigHeight = 600; + m_bigWidth = 1000; + + setupDisplayRegions(size()); + m_oldWidth = size().width(); + + m_rxDataList = set->getReceiverDataList(); + m_freqRulerPosition = m_rxDataList.at(m_receiver).freqRulerPosition; + m_centerFrequency = m_rxDataList.at(m_receiver).ctrFrequency; + m_vfoFrequency = m_rxDataList.at(m_receiver).vfoFrequency; + + if (m_vfoFrequency > m_centerFrequency + m_sampleRate/2) + m_vfoFrequency = m_centerFrequency + m_sampleRate/2; + else if (m_vfoFrequency < m_centerFrequency - m_sampleRate/2) + m_vfoFrequency = m_centerFrequency - m_sampleRate/2; + else + + m_deltaFrequency = m_centerFrequency - m_vfoFrequency; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + + m_dBmScalePanadapterRenew = true; + m_dBmScalePanadapterUpdate = true; + m_freqScalePanadapterRenew = true; + m_freqScalePanadapterUpdate = true; + m_panGridRenew = true; + m_panGridUpdate = true; + m_waterfallUpdate = true; + m_secScaleWaterfallUpdate = true; + m_secScaleWaterfallRenew = true; + m_waterfallDisplayUpdate = true; + + m_panMode = m_rxDataList.at(m_receiver).panMode; + m_waterfallMode = m_rxDataList.at(m_receiver).waterfallMode; + + HamBand band = m_rxDataList.at(m_receiver).hamBand; + + m_dBmPanMin = m_rxDataList.at(m_receiver).dBmPanScaleMinList.at(band); + m_dBmPanMax = m_rxDataList.at(m_receiver).dBmPanScaleMaxList.at(band); + + m_waterfallOffsetLo = m_rxDataList.at(m_receiver).waterfallOffsetLo; + m_waterfallOffsetHi = m_rxDataList.at(m_receiver).waterfallOffsetHi; + + m_secWaterfallMin = 0.0; + m_secWaterfallMax = 0.0; + + m_filterLowerFrequency = m_rxDataList.at(m_receiver).filterLo; + m_filterUpperFrequency = m_rxDataList.at(m_receiver).filterHi; + m_filterWidth = qAbs((int)(m_filterUpperFrequency - m_filterLowerFrequency)); + + m_mouseWheelFreqStep = m_rxDataList.at(m_receiver).mouseWheelFreqStep; + + m_agcMode = m_rxDataList.at(m_receiver).agcMode; + m_agcModeString = set->getAGCModeString(m_receiver); + m_agcFixedGain = m_rxDataList.at(m_receiver).agcFixedGain_dB; + + m_dspModeString = set->getDSPModeString(m_rxDataList.at(m_receiver).dspModeList.at(m_receiver)); +// m_agcThresholdOld = m_rxDataList.at(m_receiver).acgThreshold; +// m_agcThresholdNew = m_agcThresholdOld; +// m_agcHangLevelOld = m_rxDataList.at(m_receiver).agcHangLevel; +// m_agcHangLevelNew = m_agcHangLevelOld; + + m_agcHangEnabled = m_rxDataList.at(m_receiver).hangEnabled; + m_showAGCLines = m_rxDataList.at(m_receiver).agcLines; + + averager = new DualModeAverager(m_receiver, m_spectrumSize); + radioPopup = new RadioPopupWidget(this, m_receiver); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + m_fonts.smallFont.setBold(true); + m_fonts.bigFont1.setBold(false); + m_fonts.bigFont2.setBold(false); + + m_oglTextTiny = new OGLText(m_fonts.tinyFont); + m_oglTextSmall = new OGLText(m_fonts.smallFont); + m_oglTextNormal = new OGLText(m_fonts.normalFont); + m_oglTextFreq1 = new OGLText(m_fonts.freqFont1); + m_oglTextFreq2 = new OGLText(m_fonts.freqFont2); + m_oglTextBig1 = new OGLText(m_fonts.bigFont1); + m_oglTextBig2 = new OGLText(m_fonts.bigFont2); + m_oglTextHuge = new OGLText(m_fonts.hugeFont); + + timer = 0; + + setupConnections(); + + m_displayTime.start(); + m_resizeTime.start(); + peakHoldTimer.start(); + //freqChangeTimer.start(); + + m_fps = set->getFramesPerSecond(m_receiver); + m_secWaterfallMin = -(1.0/m_fps) * m_secScaleWaterfallRect.height(); + + + m_dBmPanLogGain = 47;//49;//69 // allow user to calibrate this value + + m_cameraDistance = 0; + m_cameraAngle = QPoint(0, 0); + + m_mousePos = QPoint(-100, -100); + + m_gridColor = set->getPanadapterColors().gridLineColor; + m_darkColor = QColor(150, 150, 150, 100); + + m_redGrid = (GLfloat)(m_gridColor.red()/256.0); + m_greenGrid = (GLfloat)(m_gridColor.green()/256.0); + m_blueGrid = (GLfloat)(m_gridColor.blue()/256.0); + + m_bkgRed = (GLfloat)(set->getPanadapterColors().panBackgroundColor.red() / 256.0); + m_bkgGreen = (GLfloat)(set->getPanadapterColors().panBackgroundColor.green() / 256.0); + m_bkgBlue = (GLfloat)(set->getPanadapterColors().panBackgroundColor.blue() / 256.0); + + m_red = (GLfloat)(set->getPanadapterColors().panLineColor.red() / 256.0); + m_green = (GLfloat)(set->getPanadapterColors().panLineColor.green() / 256.0); + m_blue = (GLfloat)(set->getPanadapterColors().panLineColor.blue() / 256.0); + + m_redF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.red() / 256.0); + m_greenF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.green() / 256.0); + m_blueF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.blue() / 256.0); + + m_redST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.red() / 256.0); + m_greenST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.green() / 256.0); + m_blueST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.blue() / 256.0); + + m_redSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.red() / 256.0); + m_greenSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.green() / 256.0); + m_blueSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.blue() / 256.0); + + m_waterfallLoColor = QColor(0, 0, 0, m_waterfallAlpha); + m_waterfallHiColor = QColor(192, 124, 255, m_waterfallAlpha); + m_waterfallMidColor = set->getPanadapterColors().waterfallColor.toRgb(); + m_waterfallColorRange = (int)(m_dBmPanMax - m_dBmPanMin); + + m_frequencyScaleFBO = 0; + m_dBmScaleFBO = 0; + m_panadapterGridFBO = 0; + m_textureFBO = 0; + m_waterfallLineFBO = 0; + m_waterfallFBO = 0; + m_secScaleWaterfallFBO = 0; + + m_waterfallLineCnt = 0; + + m_haircrossOffsetRight = 30; + m_haircrossOffsetLeft = 116; + m_haircrossMaxRight = 110; + m_haircrossMinTop = 40; + + if (m_specAveragingCnt > 0) + m_scale = 1.0f / m_specAveragingCnt; + else + m_scale = 1.0f; + +} + +QGLReceiverPanel::~QGLReceiverPanel() { + + disconnect(set, 0, this, 0); + + makeCurrent(); + glFinish(); + + if (m_frequencyScaleFBO) { + + delete m_frequencyScaleFBO; + m_frequencyScaleFBO = 0; + } + + if (m_waterfallLineFBO) { + + delete m_waterfallLineFBO; + m_waterfallLineFBO = 0; + } + + if (m_waterfallFBO) { + + delete m_waterfallFBO; + m_waterfallFBO = 0; + } + + if (m_textureFBO) { + + delete m_textureFBO; + m_textureFBO = 0; + } + + if (m_dBmScaleFBO) { + + delete m_dBmScaleFBO; + m_dBmScaleFBO = 0; + } + + if (m_panadapterGridFBO) { + + delete m_panadapterGridFBO; + m_panadapterGridFBO = 0; + } + + if (m_secScaleWaterfallFBO) { + + delete m_secScaleWaterfallFBO; + m_secScaleWaterfallFBO = 0; + } + + if (averager) + delete averager; + + while (!specAv_queue.isEmpty()) + specAv_queue.dequeue(); +} + +QSize QGLReceiverPanel::minimumSizeHint() const { + + if (m_receiver == 0) + return QSize(width(), 250); + else + return QSize(250, 120); + //return QSize(width(), height()); +} + +QSize QGLReceiverPanel::sizeHint() const { + + return QSize(width(), height()); +} + +void QGLReceiverPanel::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode)), + this, + SLOT(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(spectrumSizeChanged(QObject *, int)), +// this, +// SLOT(setSpectrumSize(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(freqRulerPositionChanged(QObject *, int, float)), + this, + SLOT(freqRulerPositionChanged(QObject *, int, float))); + + CHECKED_CONNECT( + set, + SIGNAL(ctrFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setCtrFrequency(QObject *, int, int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setVFOFrequency(QObject *, int, int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), + this, + SLOT(setHamBand(QObject *, int, bool, HamBand))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(filterFrequenciesChanged(QObject *, int, qreal, qreal)), + this, + SLOT(setFilterFrequencies(QObject *, int, qreal, qreal))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(waterfallTimeChanged(int, int)), +// this, +// SLOT(setWaterfallTime(int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(waterfallOffesetLoChanged(int, int)), + this, + SLOT(setWaterfallOffesetLo(int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(waterfallOffesetHiChanged(int, int)), + this, + SLOT(setWaterfallOffesetHi(int, int))); + + CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingChanged(QObject *, int, bool)), + this, + SLOT(setSpectrumAveraging(QObject *, int, bool))); + + /*CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingCntChanged(int)), + this, + SLOT(setSpectrumAveragingCnt(int)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(spectrumBufferChanged(int, const qVectorFloat&)), + this, + SLOT(setSpectrumBuffer(int, const qVectorFloat&))); + + CHECKED_CONNECT( + set, + SIGNAL(panGridStatusChanged(bool, int)), + this, + SLOT(setPanGridStatus(bool, int))); + + CHECKED_CONNECT( + set, + SIGNAL(peakHoldStatusChanged(bool, int)), + this, + SLOT(setPeakHoldStatus(bool, int))); + + CHECKED_CONNECT( + set, + SIGNAL(panLockedStatusChanged(bool, int)), + this, + SLOT(setPanLockedStatus(bool, int))); + + CHECKED_CONNECT( + set, + SIGNAL(clickVFOStatusChanged(bool, int)), + this, + SLOT(setClickVFOStatus(bool, int))); + + CHECKED_CONNECT( + set, + SIGNAL(hairCrossStatusChanged(bool, int)), + this, + SLOT(setHairCrossStatus(bool, int))); + + /*CHECKED_CONNECT( + set, + SIGNAL(panadapterColorChanged()), + this, + SLOT(setSimpleWaterfallColor()));*/ + + CHECKED_CONNECT( + set, + SIGNAL(panadapterColorChanged()), + this, + SLOT(setPanadapterColors())); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(setMercuryAttenuator(QObject *, HamBand, int))); + + CHECKED_CONNECT( + set, + SIGNAL(adcOverflowChanged(int)), + this, + SLOT(setADCStatus(int))); + + CHECKED_CONNECT( + set, + SIGNAL(framesPerSecondChanged(QObject*, int, int)), + this, + SLOT(setFramesPerSecond(QObject*, int, int))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(agcThresholdLine_dBmChanged(QObject *, int, qreal)), +// this, +// SLOT(setAGCThresholdLine_dBm(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcFixedGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCLineFixedLevel(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcLineLevelsChanged(QObject *, int, qreal, qreal)), + this, + SLOT(setAGCLineLevels(QObject *, int, qreal, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcModeChanged(QObject *, int, AGCMode, bool)), + this, + SLOT(setAGCMode(QObject *, int, AGCMode, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(showAGCLinesStatusChanged(QObject *, bool, int)), + this, + SLOT(setAGCLinesStatus(QObject *, bool, int))); + + CHECKED_CONNECT( + set, + SIGNAL(dspModeChanged(QObject *, int, DSPMode)), + this, + SLOT(setDSPMode(QObject *, int, DSPMode))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(agcHangEnabledChanged(QObject *, int, bool)), +// this, +// SLOT(setAGCHangEnabled(QObject *, int, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(mouseWheelFreqStepChanged(QObject *, int, qreal)), + this, + SLOT(setMouseWheelFreqStep(QObject *, int, qreal))); + + CHECKED_CONNECT( + radioPopup, + SIGNAL(vfoToMidBtnEvent()), + this, + SLOT(setVfoToMidFrequency())); + + CHECKED_CONNECT( + radioPopup, + SIGNAL(midToVfoBtnEvent()), + this, + SLOT(setMidToVfoFrequency())); +} + +void QGLReceiverPanel::initializeGL() { + + if (!isValid()) return; + + + /*QOpenGLInfo glInfo; + glInfo.getInfo(); + glInfo.printSelf();*/ + + //***************************************************************** + // default initialization + + //glShadeModel(GL_FLAT); + glShadeModel(GL_SMOOTH); + //glClearColor(0.0f, 0.0f, 0.0f, 0.5f); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + + m_cnt = 0; + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + +void QGLReceiverPanel::paintGL() { + + switch (m_serverMode) { + + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + case QSDR::NoServerMode: + case QSDR::DemoMode: + + drawGLRect(QRect(0, 0, width(), height()), QColor(0, 0, 0)); + break; + + case QSDR::SDRMode: + + //if (freqChangeTimer.elapsed() > 50) m_spectrumAveraging = m_spectrumAveragingOld; + + if (m_resizeTime.elapsed() > 200 || m_dataEngineState == QSDR::DataEngineDown) + paintReceiverDisplay(); + + break; + } +} + +void QGLReceiverPanel::paintReceiverDisplay() { + + QRect mouse_rect(0, 0, 100, 100); + mouse_rect.moveCenter(m_mousePos); + + if (m_filterChanged) { + + m_filterLo = m_filterLowerFrequency / m_sampleRate; + m_filterHi = m_filterUpperFrequency / m_sampleRate; + m_filterWidth = qAbs((int)(m_filterUpperFrequency - m_filterLowerFrequency)); + + if (m_filterWidth < 1000) { + + QString str = "%1"; + m_filterWidthString = str.arg(m_filterWidth); + } + else { + + QString str = "%1k%2"; + m_filterWidthString = str.arg((int)(m_filterWidth/1000)).arg((int)((m_filterWidth%1000)/100)); + } + + m_filterChanged = false; + } + //m_displayTime.restart(); + + drawPanadapter(); + drawPanHorizontalScale(); + drawPanVerticalScale(); + drawPanadapterGrid(); + drawCenterLine(); + drawPanFilter(); + + if (m_dataEngineState == QSDR::DataEngineUp && m_showAGCLines && (m_receiver == m_currentReceiver)) + drawAGCControl(); + + if (m_panRect.width() > 300 && m_panRect.height() > 80) { + + drawVFOControl(); + drawReceiverInfo(); + } + + if (m_waterfallDisplayUpdate && m_waterfallRect.height() > 10) { + + drawWaterfall(); + drawWaterfallVerticalScale(); + m_waterfallDisplayUpdate = false; + } + + if (m_crossHair) { + + if (m_mouseRegion != freqScalePanadapterRegion && + m_mouseRegion != dBmScalePanadapterRegion && + m_mouseRegion != filterRegion && + m_mouseRegion != filterRegionLow && + m_mouseRegion != filterRegionHigh && + m_mouseRegion != agcThresholdLine && + m_mouseRegion != agcHangLine && + m_mouseRegion != agcFixedGainLine && + m_crossHairCursor) + drawCrossHair(); + } + } + +void QGLReceiverPanel::paint3DPanadapterMode() { +} + +void QGLReceiverPanel::drawPanadapter() { + + GLint vertexArrayLength = (GLint)m_panadapterBins.size(); + + GLint height = m_panRect.height(); + GLint x1 = m_panRect.left(); + GLint y1 = m_panRect.top(); + //GLint y3 = y1 - m_displayTop; + GLint x2 = x1 + m_panRect.width(); + GLint y2 = y1 + m_panRect.height(); + + // y scale + float yScale; + //float yScaleColor; + float yTop; + + qreal dBmRange = qAbs(m_dBmPanMax - m_dBmPanMin); + + yScale = m_panRect.height() / dBmRange; + //yScaleColor = 1.0f / dBmRange; + //yScaleColor = 0.05f * yScale; + yTop = (float) y2; + + if (m_dataEngineState == QSDR::DataEngineUp) + glClear(GL_DEPTH_BUFFER_BIT); + else + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_MULTISAMPLE); + glEnable(GL_LINE_SMOOTH); + + //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glLineWidth(1); + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_receiver == m_currentReceiver) { + +// glBegin(GL_TRIANGLE_STRIP); +// glColor3f(0.2f * m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x1, y1, -4.0); // top left corner +// glColor3f(0.2f * m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x2, y1, -4.0); // top right corner +// glColor3f(0.8f * m_bkgRed, 0.8f * m_bkgGreen, 0.8f * m_bkgBlue); glVertex3f(x1, y2, -4.0); // bottom left corner +// glColor3f( m_bkgRed, m_bkgGreen, m_bkgBlue); glVertex3f(x2, y2, -4.0); // bottom right corner +// glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3f(0.8f * m_bkgRed, 0.8f * m_bkgGreen, 0.8f * m_bkgBlue); glVertex3f(x1, y1, -4.0); // top left corner + glColor3f(0.6f * m_bkgRed, 0.6f * m_bkgGreen, 0.6f * m_bkgBlue); glVertex3f(x2, y1, -4.0); // top right corner + glColor3f(0.4f * m_bkgRed, 0.4f * m_bkgGreen, 0.4f * m_bkgBlue); glVertex3f(x1, y2, -4.0); // bottom left corner + glColor3f(0.2f * m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x2, y2, -4.0); // bottom right corner + glEnd(); + } + else { + + glBegin(GL_TRIANGLE_STRIP); + glColor3f(0.4f * m_bkgRed, 0.4f * m_bkgGreen, 0.4f * m_bkgBlue); glVertex3f(x1, y1, -4.0); // top left corner + glColor3f(0.4f * m_bkgRed, 0.4f * m_bkgGreen, 0.4f * m_bkgBlue); glVertex3f(x2, y1, -4.0); // top right corner + glColor3f(0.4f * m_bkgRed, 0.4f * m_bkgGreen, 0.4f * m_bkgBlue); glVertex3f(x1, y2, -4.0); // bottom left corner + glColor3f(0.4f * m_bkgRed, 0.4f * m_bkgGreen, 0.4f * m_bkgBlue); glVertex3f(x2, y2, -4.0); // bottom right corner + glEnd(); + } + + if (m_adcStatus == 2) { + + glBegin(GL_TRIANGLE_STRIP); + glColor3f(m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x1, y1, -4.0); // top left corner + glColor3f(m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x2, y1, -4.0); // top right corner + glColor3f(m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x1, y2, -4.0); // bottom left corner + glColor3f(m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x2, y2, -4.0); // bottom right corner + glEnd(); + + QString str = "ADC Overload"; + int rectWidth = m_fonts.hugeFontMetrics->boundingRect(str).width(); + + qglColor(QColor(255, 0, 0, 155)); + m_oglTextHuge->renderText((x2-rectWidth)/2, y1+30, -3.5f, str); + } + } + else { + + drawGLRect(m_panRect, QColor(30, 30, 50, 155), -4.0f); + } + + // set a scissor box + glScissor(x1, size().height() - y2, x2, height); + glEnable(GL_SCISSOR_TEST); + + spectrumBufferMutex.lock(); + + TGL3float *vertexArray = new TGL3float[vertexArrayLength]; + TGL3float *vertexColorArray = new TGL3float[vertexArrayLength]; + + TGL3float *vertexArrayBg = new TGL3float[2*vertexArrayLength]; + TGL3float *vertexColorArrayBg = new TGL3float[2*vertexArrayLength]; + + TGL3float *vertexArrayBgPH = new TGL3float[2*vertexArrayLength]; + TGL3float *vertexColorArrayBgPH = new TGL3float[2*vertexArrayLength]; + + TGL3float *vertexArrayPH = new TGL3float[vertexArrayLength]; + TGL3float *vertexColorArrayPH = new TGL3float[vertexArrayLength]; + + switch (m_panMode) { + + case (PanGraphicsMode) FilledLine: + + for (int i = 0; i < vertexArrayLength; i++) { + + mutex.lock(); + vertexColorArrayBg[2*i].x = 0.7 * m_redF; + vertexColorArrayBg[2*i].y = 0.7 * m_greenF; + vertexColorArrayBg[2*i].z = 0.7 * m_blueF; + + vertexColorArrayBg[2*i+1].x = 0.3 * m_redF; + vertexColorArrayBg[2*i+1].y = 0.3 * m_greenF; + vertexColorArrayBg[2*i+1].z = 0.3 * m_blueF; + + if (!m_peakHold) { + + vertexColorArray[i].x = m_red; + vertexColorArray[i].y = m_green; + vertexColorArray[i].z = m_blue; + + /*vertexColorArray[i].x = m_red * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin)); + vertexColorArray[i].y = m_green * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin)); + vertexColorArray[i].z = m_blue * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin));*/ + } + else { + + vertexColorArray[i].x = 0.7f; + vertexColorArray[i].y = 0.7f; + vertexColorArray[i].z = 0.7f; + + vertexColorArrayPH[i].x = m_red; + vertexColorArrayPH[i].y = m_green; + vertexColorArrayPH[i].z = m_blue; + + /*vertexColorArray[i].x = m_red * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin)); + vertexColorArray[i].y = m_green * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin)); + vertexColorArray[i].z = m_blue * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin));*/ + } + mutex.unlock(); + + vertexArrayBg[2*i].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArrayBg[2*i].z = -1.5; + + vertexArrayBg[2*i+1].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i+1].y = (GLfloat)yTop; + vertexArrayBg[2*i+1].z = -1.5; + + /*vertexArray[i].x = (GLfloat)(i/m_scaleMult); + vertexArray[i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArray[i].z = -1.0;*/ + + if (m_peakHold) { + + vertexArrayPH[i].x = (GLfloat)(i/m_scaleMult); + vertexArrayPH[i].y = (GLfloat)(yTop - yScale * m_panPeakHoldBins.at(i)); + vertexArrayPH[i].z = -0.5; + } + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBg); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 2*vertexArrayLength); + + if (m_peakHold) { + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayPH); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayPH); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + } + else { + + glVertexPointer(3, GL_FLOAT, 6*sizeof(float), vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + } + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + break; + + case (PanGraphicsMode) Line: + + for (int i = 0; i < vertexArrayLength; i++) { + + mutex.lock(); + if (!m_peakHold) { + + vertexColorArray[i].x = m_red; + vertexColorArray[i].y = m_green; + vertexColorArray[i].z = m_blue; + + /*vertexColorArray[i].x = m_red * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin)); + vertexColorArray[i].y = m_green * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin)); + vertexColorArray[i].z = m_blue * (yScaleColor * (m_panadapterBins.at(i) - m_dBmPanMin));*/ + + /*vertexColorArray[i].x = m_red * (yScaleColor * m_panadapterBins.at(i)); + vertexColorArray[i].y = m_green * (yScaleColor * m_panadapterBins.at(i)); + vertexColorArray[i].z = m_blue * (yScaleColor * m_panadapterBins.at(i));*/ + } + else { + + vertexColorArray[i].x = 0.6f; + vertexColorArray[i].y = 0.6f; + vertexColorArray[i].z = 0.6f; + + vertexColorArrayPH[i].x = m_red; + vertexColorArrayPH[i].y = m_green; + vertexColorArrayPH[i].z = m_blue; + } + mutex.unlock(); + + vertexArray[i].x = (GLfloat)(i/m_scaleMult); + vertexArray[i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArray[i].z = -1.0; + + if (m_peakHold) { + + vertexArrayPH[i].x = (GLfloat)(i/m_scaleMult); + vertexArrayPH[i].y = (GLfloat)(yTop - yScale * m_panPeakHoldBins.at(i)); + vertexArrayPH[i].z = -0.5; + } + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + + if (m_peakHold) { + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayPH); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayPH); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + } + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + break; + + case (PanGraphicsMode) Solid: + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + + for (int i = 0; i < vertexArrayLength; i++) { + + mutex.lock(); + if (!m_peakHold) { + + vertexColorArrayBg[2*i].x = m_redST; + vertexColorArrayBg[2*i].y = m_greenST; + vertexColorArrayBg[2*i].z = m_blueST; + + vertexColorArrayBg[2*i+1].x = m_redSB; + vertexColorArrayBg[2*i+1].y = m_greenSB; + vertexColorArrayBg[2*i+1].z = m_blueSB; + } + else { + + vertexColorArrayBg[2*i].x = m_redSB; + vertexColorArrayBg[2*i].y = m_greenSB; + vertexColorArrayBg[2*i].z = m_blueSB; + + vertexColorArrayBg[2*i+1].x = m_redSB; + vertexColorArrayBg[2*i+1].y = m_greenSB; + vertexColorArrayBg[2*i+1].z = m_blueSB; + + vertexColorArrayBgPH[2*i].x = 0.9f;//m_redST; + vertexColorArrayBgPH[2*i].y = 0.9f;//m_greenST; + vertexColorArrayBgPH[2*i].z = 0.9f;//m_blueST; + + vertexColorArrayBgPH[2*i+1].x = 0.9f;// * m_redSB; + vertexColorArrayBgPH[2*i+1].y = 0.9f;// * m_greenSB; + vertexColorArrayBgPH[2*i+1].z = 0.9f;// * m_blueSB; + } + mutex.unlock(); + + vertexArrayBg[2*i].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i].y = (GLfloat)(yTop - yScale * m_panadapterBins.at(i)); + vertexArrayBg[2*i].z = -1.0f; + + vertexArrayBg[2*i+1].x = (GLfloat)(i/m_scaleMult); + vertexArrayBg[2*i+1].y = (GLfloat)yTop; + //vertexArrayBg[2*i+1].y = (GLfloat)(m_panRect.bottom()); + //vertexArrayBg[2*i].y = (GLfloat)(yScale * m_panadapterBins.at(i)); + vertexArrayBg[2*i+1].z = -1.0f; + + if (m_peakHold) { + + vertexArrayBgPH[2*i].x = (GLfloat)(i/m_scaleMult); + vertexArrayBgPH[2*i].y = (GLfloat)(yTop - yScale * m_panPeakHoldBins.at(i)); + vertexArrayBgPH[2*i].z = -2.0f; + + vertexArrayBgPH[2*i+1].x = (GLfloat)(i/m_scaleMult); + vertexArrayBgPH[2*i+1].y = (GLfloat)yTop; + vertexArrayBgPH[2*i+1].z = -2.0f; + } + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBg); + //glDrawArrays(GL_QUAD_STRIP, 0, 2*vertexArrayLength); + glDrawArrays(GL_LINES, 0, 2*vertexArrayLength); + + if (m_peakHold) { + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBgPH); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBgPH); + glDrawArrays(GL_LINES, 0, 2*vertexArrayLength); + } + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + break; + } + spectrumBufferMutex.unlock(); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + delete[] vertexArrayBgPH; + delete[] vertexColorArrayBgPH; + delete[] vertexArrayPH; + delete[] vertexColorArrayPH; + + //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + + // disable scissor box + glDisable(GL_SCISSOR_TEST); +} + +void QGLReceiverPanel::drawPanVerticalScale() { + + if (!m_dBmScalePanRect.isValid()) return; + + int width = m_dBmScalePanRect.width(); + int height = m_dBmScalePanRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_dBmScaleFBO || m_dBmScalePanadapterUpdate || m_dBmScalePanadapterRenew) { + + if (!m_dBmScaleFBO || m_dBmScalePanadapterRenew) { + + if (m_dBmScaleFBO) { + + delete m_dBmScaleFBO; + m_dBmScaleFBO = 0; + } + m_dBmScaleFBO = new QGLFramebufferObject(width, height); + //if (m_dBmScaleFBO) + // GRAPHICS_DEBUG << "m_dBmScaleFBO generated."; + + } + + m_dBmScaleFBO->bind(); + renderPanVerticalScale(); + m_dBmScaleFBO->release(); + + m_dBmScalePanadapterUpdate = false; + m_dBmScalePanadapterRenew = false; + } + + renderTexture(m_dBmScalePanRect, m_dBmScaleFBO->texture(), 0.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLReceiverPanel::drawPanHorizontalScale() { + + if (!m_freqScalePanRect.isValid()) return; + + int width = m_freqScalePanRect.width(); + int height = m_freqScalePanRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_frequencyScaleFBO || m_freqScalePanadapterUpdate || m_freqScalePanadapterRenew) { + + if (!m_frequencyScaleFBO || m_freqScalePanadapterRenew) { + + if (m_frequencyScaleFBO) { + + delete m_frequencyScaleFBO; + m_frequencyScaleFBO = 0; + } + + m_frequencyScaleFBO = new QGLFramebufferObject(width, height); + //if (m_frequencyScaleFBO) + // GRAPHICS_DEBUG << "m_frequencyScaleFBO generated."; + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_frequencyScaleFBO->bind(); + renderPanHorizontalScale(); + m_frequencyScaleFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + m_freqScalePanadapterUpdate = false; + m_freqScalePanadapterRenew = false; + } + + renderTexture(m_freqScalePanRect, m_frequencyScaleFBO->texture(), 0.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLReceiverPanel::drawPanadapterGrid() { + + if (!m_panGrid) return; + + int width = m_panRect.width(); + int height = m_panRect.height(); + + //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + if (m_receiver == m_currentReceiver) + glColor4f(m_redGrid, m_greenGrid, m_blueGrid, 1.0f); + else + glColor4f(m_redGrid, m_greenGrid, m_blueGrid, 0.8f); + + + glDisable(GL_MULTISAMPLE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_panadapterGridFBO || m_panGridUpdate || m_panGridRenew) { + + if (!m_panadapterGridFBO || m_panGridRenew) { + + if (m_panadapterGridFBO) { + + delete m_panadapterGridFBO; + m_panadapterGridFBO = 0; + } + + m_panadapterGridFBO = new QGLFramebufferObject(width, height); + //if (m_panadapterGridFBO) + // GRAPHICS_DEBUG << "m_panadapterGridFBO generated."; + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_panadapterGridFBO->bind(); + renderPanadapterGrid(); + m_panadapterGridFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + m_panGridUpdate = false; + m_panGridRenew = false; + } + + renderTexture(m_panRect, m_panadapterGridFBO->texture(), -3.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); + glEnable(GL_MULTISAMPLE); +} + +void QGLReceiverPanel::drawCenterLine() { + + // draw a line for the center frequency + GLint y1, y2; + + y1 = m_panRect.top(); + y2 = m_displayCenterlineHeight; + + if (y2 > y1 + 3) { + + GLint x = m_panRect.width()/2; + GLint y = m_panRect.top() + m_panRect.height() - 1; + //GLint y = m_panRect.top() + m_panRect.height() + m_freqScalePanRect.height() + m_waterfallRect.height() - 1; + //color = set->getPanadapterColors().panCenterLineColor; + QColor col = QColor(80, 180, 240, 180); + + glDisable(GL_MULTISAMPLE); + glLineWidth(1); + glColor4ub(col.red(), col.green(), col.blue(), col.alpha()); + + // center frequency line + glBegin(GL_LINES); + glVertex3f(x, y1 + 1, 3.5f); + glVertex3f(x, y - 1, 3.5f); + glEnd(); + + x = m_panRect.left() + qRound((qreal)(m_panRect.width()/2.0f) - m_deltaF * m_panRect.width() / m_freqScaleZoomFactor); + col = set->getPanadapterColors().panCenterLineColor; + glColor4ub(col.red(), col.green(), col.blue(), 255); + + // VFO frequency line + if (m_dragMouse && !m_panLocked) { + + //glLineWidth(3); + glBegin(GL_LINES); + glVertex3f(x, m_freqScalePanRect.bottom() + 1, 3.0f); + glVertex3f(x, m_freqScalePanRect.bottom() + m_waterfallRect.height() - 1, 3.0f); + glEnd(); + } + glBegin(GL_LINES); + glVertex3f(x, y1 + 1, 4.0f); + glVertex3f(x, y - 1, 4.0f); + glEnd(); + glEnable(GL_MULTISAMPLE); + } + + // draw a frequency line from a different receiver + /*if (m_frequencyRxOnRx != 0) { + + y1 = m_waterfallRect.top(); + y2 = m_waterfallRect.bottom(); + + if (y2 > y1 + 3) { + + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width()); + qreal df = m_centerFrequency - m_rxDataList.at(m_frequencyRxOnRx%10 - 1).frequency; + + GLint dx = (GLint)(df/unit); + GLint x = m_panRect.width()/2 - dx; + + color = QColor(255, 255, 0, 255); + + glDisable(GL_MULTISAMPLE); + glLineWidth(2); + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + glBegin(GL_LINES); + glVertex3f(x-1, y1, 4.0f); + glVertex3f(x-1, y2, 4.0f); + glEnd(); + glEnable(GL_MULTISAMPLE); + } + }*/ +} + +void QGLReceiverPanel::drawPanFilter() { + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + QColor color; + //QString str; + + if (m_highlightFilter) + color = QColor(150, 150, 150, 140); + else + color = QColor(150, 150, 150, 100); + + m_filterLeft = m_panRect.left() + qRound((qreal)(m_panRect.width()/2.0f) + (m_filterLo - m_deltaF) * m_panRect.width() / m_freqScaleZoomFactor); + m_filterRight = m_panRect.left() + qRound((qreal)(m_panRect.width()/2.0f) + (m_filterHi - m_deltaF) * m_panRect.width() / m_freqScaleZoomFactor); + m_filterTop = m_panRect.top() + 1; + m_filterBottom = m_panRect.top() + m_panRect.height() - 1; + //m_filterBottom = m_panRect.top() + m_panRect.height() + m_freqScalePanRect.height() + m_waterfallRect.height() - 1; + + m_filterRect = QRect(m_filterLeft, m_filterTop, m_filterRight - m_filterLeft, m_filterBottom - m_filterTop); + + if ((m_filterLeft >= m_panRect.left() && m_filterLeft <= m_panRect.right()) || + (m_filterRight >= m_panRect.left() && m_filterRight <= m_panRect.right()) || + (m_filterLeft < m_panRect.left() && m_filterRight > m_panRect.right())) + { + if (m_filterRect.height() > 5) drawGLRect(m_filterRect, color, 0.0f); + } + + // filter boundaries + if (m_showFilterLeftBoundary) { + + color = QColor(150, 150, 150, 230); + + glDisable(GL_MULTISAMPLE); + glLineWidth(1); + qglColor(color); + glBegin(GL_LINES); + glVertex3f(m_filterLeft, m_filterTop, 4.0f); + glVertex3f(m_filterLeft, m_filterBottom, 4.0f); + glEnd(); + glEnable(GL_MULTISAMPLE); + + // text + QString str1 = QString("Filter Lo"); + QString str2 = frequencyString(m_filterLowerFrequency, true); + + qglColor(QColor(0, 0, 0, 255)); + if (m_smallSize) { + + m_oglTextSmall->renderText(m_filterLeft + 5, m_filterTop + 44, 4.0f, str1); + m_oglTextSmall->renderText(m_filterLeft + 5, m_filterTop + 64, 4.0f, str2); + } + else { + + m_oglTextBig1->renderText(m_filterLeft + 5, m_filterTop + 44, 4.0f, str1); + m_oglTextBig1->renderText(m_filterLeft + 5, m_filterTop + 64, 4.0f, str2); + } + + qglColor(QColor(255, 255, 255, 255)); + if (m_smallSize) { + + m_oglTextSmall->renderText(m_filterLeft + 3, m_filterTop + 42, 5.0f, str1); + m_oglTextSmall->renderText(m_filterLeft + 3, m_filterTop + 62, 5.0f, str2); + } + else { + + m_oglTextBig1->renderText(m_filterLeft + 3, m_filterTop + 42, 5.0f, str1); + m_oglTextBig1->renderText(m_filterLeft + 3, m_filterTop + 62, 5.0f, str2); + } + } + + if (m_showFilterRightBoundary) { + + color = QColor(150, 150, 150, 230); + + glDisable(GL_MULTISAMPLE); + glLineWidth(1); + qglColor(color); + glBegin(GL_LINES); + glVertex3f(m_filterRight, m_filterTop, 4.0f); + glVertex3f(m_filterRight, m_filterBottom, 4.0f); + glEnd(); + glEnable(GL_MULTISAMPLE); + + // text + QString str1 = QString("Filter Hi"); + QString str2 = frequencyString(m_filterUpperFrequency, true); + + qglColor(QColor(0, 0, 0, 255)); + if (m_smallSize) { + + m_oglTextSmall->renderText(m_filterRight + 5, m_filterTop + 44, 4.0f, str1); + m_oglTextSmall->renderText(m_filterRight + 5, m_filterTop + 64, 4.0f, str2); + } + else { + + m_oglTextBig1->renderText(m_filterRight + 5, m_filterTop + 44, 4.0f, str1); + m_oglTextBig1->renderText(m_filterRight + 5, m_filterTop + 64, 4.0f, str2); + } + + qglColor(QColor(255, 255, 255, 255)); + if (m_smallSize) { + + m_oglTextSmall->renderText(m_filterRight + 3, m_filterTop + 42, 5.0f, str1); + m_oglTextSmall->renderText(m_filterRight + 3, m_filterTop + 62, 5.0f, str2); + } + else { + + m_oglTextBig1->renderText(m_filterRight + 3, m_filterTop + 42, 5.0f, str1); + m_oglTextBig1->renderText(m_filterRight + 3, m_filterTop + 62, 5.0f, str2); + + } + } +} + +void QGLReceiverPanel::drawWaterfall() { + + if (m_waterfallRect.isEmpty()) return; + + int top = m_waterfallRect.top(); + int left = m_waterfallRect.left(); + int width = m_waterfallRect.width(); + int height = m_waterfallRect.height(); + //int height = this->size().height(); + + + glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + // check for framebuffer objects + if (set->getFBOPresence()) { + + // create the FBOs if not exist + if (!m_textureFBO || !m_waterfallLineFBO || !m_waterfallFBO || m_waterfallUpdate) { + + if (m_waterfallLineFBO) { + + delete m_waterfallLineFBO; + m_waterfallLineFBO = 0; + } + + if (m_waterfallFBO) { + + delete m_waterfallFBO; + m_waterfallFBO = 0; + } + + if (m_textureFBO) { + + delete m_textureFBO; + m_textureFBO = 0; + } + + if (QGLFramebufferObject::hasOpenGLFramebufferBlit()) { + + //QGLFramebufferObjectFormat format; + //format.setSamples(2); + //format.setAttachment(QGLFramebufferObject::CombinedDepthStencil); + + m_waterfallLineFBO = new QGLFramebufferObject(width, 1); + //if (m_waterfallLineFBO) + //GRAPHICS_DEBUG << "m_waterfallLineFBO generated."; + + m_waterfallFBO = new QGLFramebufferObject(width, height); + //if (m_waterfallFBO) + //GRAPHICS_DEBUG << "m_waterfallFBO generated."; + + m_textureFBO = new QGLFramebufferObject(width, height); + //if (m_textureFBO) + //GRAPHICS_DEBUG << "m_textureFBO generated."; + + } + else { + + GRAPHICS_DEBUG << "has no OpenGL FramebufferBlit"; + } + + m_waterfallUpdate = false; + drawGLRect(m_waterfallRect, Qt::black); + + m_waterfallLineCnt = 0; + + if (width > 0) { + + m_waterfallPixel.clear(); + m_waterfallPixel.resize(width); + + TGL_ubyteRGBA col; + col.red = 0; col.green = 0; col.blue = 0; col.alpha = 255; + + for (int i = 0; i < width; i++) + m_waterfallPixel[i] = col; + } + } + + if (m_dataEngineState == QSDR::DataEngineUp) { + + GLint oldTex; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTex); + + m_waterfallLineFBO->bind(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_waterfallPixel.data()); + m_waterfallLineFBO->release(); + + m_waterfallLineCnt++; + if (m_waterfallLineCnt > height) m_waterfallLineCnt = height; + + // draw the waterfall + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, m_waterfallFBO->texture()); + + glBegin(GL_QUADS); + glTexCoord2f(0, 1); glVertex2i(left, top); // top left corner + glTexCoord2f(1, 1); glVertex2i(left + width, top); // top right corner + glTexCoord2f(1, 0); glVertex2i(left + width, top + height); // bottom right corner + glTexCoord2f(0, 0); glVertex2i(left, top + height); // bottom left corner + glEnd(); + glBindTexture(GL_TEXTURE_2D, oldTex); + glDisable(GL_TEXTURE_2D); + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + // render to the next waterfall texture + m_textureFBO->bind(); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, m_waterfallFBO->texture()); + + // the waterfall FBO + glBegin(GL_QUADS); + glTexCoord2f(0, 1); glVertex2i(0, 1); // top left corner + glTexCoord2f(1, 1); glVertex2i(width, 1); // top right corner + glTexCoord2f(1, 0); glVertex2i(width, 1 + height); // bottom right corner + glTexCoord2f(0, 0); glVertex2i(0, 1 + height); // bottom left corner + glEnd(); + + // the new waterfall line + glBindTexture(GL_TEXTURE_2D, m_waterfallLineFBO->texture()); + + glBegin(GL_QUADS); + glTexCoord2f(0, 1); glVertex2i(0, 0); // top left corner + glTexCoord2f(1, 1); glVertex2i(width, 0); // top right corner + glTexCoord2f(1, 0); glVertex2i(width, 1); // bottom right corner + glTexCoord2f(0, 0); glVertex2i(0, 1); // bottom left corner + glEnd(); + + m_textureFBO->release(); + + glDisable(GL_TEXTURE_2D); + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + if (m_waterfallLineCnt < height) { + + QRect rect(0, top + m_waterfallLineCnt, width, height - m_waterfallLineCnt); + drawGLRect(rect, QColor(0, 0, 0, 255), 3.0f); + } + + // copy the next waterfall image to the waterfall FBO + QRect copyRect(0, 0, width, height); + QGLFramebufferObject::blitFramebuffer(m_waterfallFBO, copyRect, m_textureFBO, copyRect); + } + else { + + drawGLRect(m_waterfallRect, Qt::black); + } + } + else { + } +} + +void QGLReceiverPanel::drawWaterfallVerticalScale() { + + if (!m_secScaleWaterfallRect.isValid()) return; + + int width = m_secScaleWaterfallRect.width(); + int height = m_secScaleWaterfallRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_secScaleWaterfallFBO || m_secScaleWaterfallUpdate || m_secScaleWaterfallRenew) { + + if (!m_secScaleWaterfallFBO || m_secScaleWaterfallRenew) { + + if (m_secScaleWaterfallFBO) { + + delete m_secScaleWaterfallFBO; + m_secScaleWaterfallFBO = 0; + } + m_secScaleWaterfallFBO = new QGLFramebufferObject(width, height); + //if (m_secScaleWaterfallFBO) + // GRAPHICS_DEBUG << "m_secScaleWaterfallFBO generated."; + } + + m_secScaleWaterfallFBO->bind(); + renderWaterfallVerticalScale(); + m_secScaleWaterfallFBO->release(); + + m_secScaleWaterfallUpdate = false; + m_secScaleWaterfallRenew = false; + } + + renderTexture(m_secScaleWaterfallRect, m_secScaleWaterfallFBO->texture(), 4.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLReceiverPanel::drawCrossHair() { + + QRect rect(0, m_panRect.top(), width(), height() - m_panRect.top()); + + int x = m_mousePos.x(); + int y = m_mousePos.y(); + + int textOffset = 20; + int spacing = 6; + + glDisable(GL_MULTISAMPLE); + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0f); + + qglColor(QColor(95, 95, 95, 255)); + + // set a scissor box + glScissor(rect.left(), rect.top(), rect.width() - 1, rect.height()); + glEnable(GL_SCISSOR_TEST); + + // horizontal line + glBegin(GL_LINES); + glVertex3f(m_dBmScalePanRect.right() - 2, y, 4.0f); + glVertex3f(rect.right() - 1, y, 4.0f); + glEnd(); + + // vertical line + glBegin(GL_LINES); + glVertex3f(x, rect.top() + 1, 4.0f); + glVertex3f(x, rect.bottom() - 1, 4.0f); + glEnd(); + + // cross hair + qglColor(QColor(180, 180, 180, 255)); + glBegin(GL_LINES); + glVertex3f(x , y - 20, 5.0f); + glVertex3f(x , y + 20, 5.0f); + glVertex3f(x - 20, y, 5.0f); + glVertex3f(x + 20, y, 5.0f); + glEnd(); + + // text + QString dFstr; + QString fstr; + QString dBstr; + + int dx = m_panRect.width()/2 - x; + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width()); + qreal df = unit * dx; + qreal frequency = m_centerFrequency - df; + + dFstr = frequencyString(m_deltaFrequency - df, true); + fstr = frequencyString(frequency); + + qreal dBm = glPixelTodBm(m_panRect, m_dBmPanMax, m_dBmPanMin, y); + dBstr = QString::number(dBm, 'f', 1) + " dBm"; + + int rectWidth; + int fontHeight; + if (m_smallSize) { + + rectWidth = m_fonts.smallFontMetrics->boundingRect(fstr).width(); + fontHeight = m_fonts.smallFontMetrics->tightBoundingRect("0").height() + spacing; + } + else { + + rectWidth = m_fonts.bigFont1Metrics->width(fstr); + fontHeight = m_fonts.bigFont1Metrics->tightBoundingRect("0").height() + spacing; + } + + m_haircrossMaxRight = rectWidth + textOffset; + m_smallSize ? m_haircrossMinTop = 40 : m_haircrossMinTop = 60; + + + int tx, ty; + if (x > m_panRect.width() - m_haircrossMaxRight) { + + tx = x - m_haircrossMaxRight; + if (y > m_haircrossMinTop) + m_smallSize ? ty = y - 42 : ty = y - 62; + else + m_smallSize ? ty = y + 10 : ty = y + 30; + } + else { + + tx = x + textOffset; + if (y > m_haircrossMinTop) + m_smallSize ? ty = y - 42 : ty = y - 62; + else + m_smallSize ? ty = y + 10 : ty = y + 30; + } + + // delta frequency and frequency + //qglColor(QColor(200, 55, 55, 255)); + qglColor(QColor(200, 200, 200, 255)); + if (m_smallSize) { + + m_oglTextSmall->renderText(tx, ty, 5.0f, dFstr); + //qglColor(QColor(200, 200, 200, 255)); + m_oglTextSmall->renderText(tx, ty + fontHeight, 5.0f, fstr); + } + else { + + m_oglTextBig1->renderText(tx, ty, 5.0f, dFstr); + //qglColor(QColor(200, 200, 200, 255)); + m_oglTextBig1->renderText(tx, ty + fontHeight, 5.0f, fstr); + } + + + // dBm value + if (m_mouseRegion == panadapterRegion) { + + if (m_smallSize) + m_oglTextSmall->renderText(tx, ty + 2*fontHeight, 5.0f, dBstr); + else + m_oglTextBig1->renderText(tx, ty + 2*fontHeight, 5.0f, dBstr); + } + + // Ham band text + /*if (m_oldMousePosX != m_mousePos.x()) { + + m_bandText = getHamBandTextString(set->getHamBandTextList(), true, frequency); + m_oldMousePosX = m_mousePos.x(); + }*/ + + glColor3f(0.94f, 0.82f, 0.43f); + if (m_smallSize) + m_oglTextSmall->renderText(tx, ty + 4*fontHeight, 5.0f, m_bandText); + else + m_oglTextBig1->renderText(tx, ty + 5*fontHeight, 5.0f, m_bandText); + + + glDisable(GL_SCISSOR_TEST); + glEnable(GL_MULTISAMPLE); +} + +void QGLReceiverPanel::drawVFOControl() { + + // lock Panadapter + QString str = "PAN LOCKED"; + int x1 = m_dBmScalePanRect.right() + 5; + int y1 = 3; + + if (m_panLocked) { + + if (m_dataEngineState == QSDR::DataEngineUp) { + + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(x1+3, y1, 0.0f, str); + qglColor(QColor(255, 170, 90, 200)); + m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str); + } + else { + + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(x1+3, y1, 0.0f, str); + qglColor(QColor(150, 150, 150, 100)); + m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str); + } + } + + // click VFO + x1 += m_fonts.smallFontMetrics->width(str) + 12; + str = "CLICK VFO"; + + if (m_clickVFO) { + + if (m_dataEngineState == QSDR::DataEngineUp) { + + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(x1+3, y1, 0.0f, str); + qglColor(QColor(255, 170, 90, 200)); + m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str); + } + else { + + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(x1+3, y1, 0.0f, str); + qglColor(QColor(150, 150, 150, 100)); + m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str); + } + } + + // FFT size + if (m_receiver == 0) { + + str = "FFT: %1"; + //float res; + QString s; + + switch (m_fftMult) { + + case 1: + s = "4k"; + break; + + case 2: + s = "8k"; + break; + + case 4: + s = "16k"; + break; + + case 8: + s = "32k"; + break; + } + x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 5; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(x1+3, y1, 0.0f, str.arg(s)); + qglColor(QColor(255, 170, 90, 200)); + m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str.arg(s)); + } + } + + int delta = qRound((m_deltaF * m_panRect.width())/m_freqScaleZoomFactor); + //GRAPHICS_DEBUG << "delta = " << delta; + + if (delta > m_panRect.width()/2) { + + QColor col = QColor(255, 40, 40, 255); + str = "<< VFO %1"; + str = str.arg(frequencyString(m_vfoFrequency, false)); + + int x = m_dBmScalePanRect.right(); + int y = 25; + + QRect rect = QRect(x, y, m_fonts.smallFontMetrics->width(str) + 4, m_fonts.fontHeightSmallFont + 2); + drawGLRect(rect, col, 2.0f); + qglColor(QColor(255, 255, 255, 255)); + m_oglTextSmall->renderText(x+1, y-2, 3.0f, str); + } + + if (delta < -m_panRect.width()/2) { + + QColor col = QColor(255, 40, 40, 255); + str = "%1 VFO >>"; + str = str.arg(frequencyString(m_vfoFrequency, false)); + + int x = m_panRect.right() - m_fonts.smallFontMetrics->width(str); + int y = 25; + + QRect rect = QRect(x, y, m_fonts.smallFontMetrics->width(str) + 4, m_fonts.fontHeightSmallFont + 2); + drawGLRect(rect, col, 2.0f); + qglColor(QColor(255, 255, 255, 255)); + m_oglTextSmall->renderText(x+1, y-2, 3.0f, str); + } + + //qglColor(QColor(0, 0, 0)); + //m_oglTextSmall->renderText(x1+1, y1-2, 3.0f, str); + + // set Center = VFO frequency button + /*QColor col; + x1 += m_fonts.smallFontMetrics->width(str) + 7; + str = "mid = vfo"; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_receiver == m_currentReceiver) { + + if (m_panLocked) + col = QColor(1, 150, 140, 140); + else + col = QColor(1, 230, 220, 140); + } + else + col = QColor(90, 100, 90, 140); + } + else + col = m_darkColor; + + m_midToVfoButtonRect = QRect(x1, y1, m_fonts.smallFontMetrics->width(str) + 5, m_fonts.fontHeightSmallFont + 2); + drawGLRect(m_midToVfoButtonRect, col, 2.0f); + qglColor(QColor(0, 0, 0)); + m_oglTextSmall->renderText(x1+1, y1-2, 3.0f, str);*/ + + + // set VFO = Center frequency button + /*x1 += m_fonts.smallFontMetrics->width(str) + 7; + str = "vfo = mid"; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_receiver == m_currentReceiver) + col = QColor(1, 230, 220, 140); + else + col = QColor(90, 100, 90, 140); + } + else + col = m_darkColor; + + m_vfoToMidButtonRect = QRect(x1, y1, m_fonts.smallFontMetrics->width(str) + 5, m_fonts.fontHeightSmallFont + 2); + drawGLRect(m_vfoToMidButtonRect, col, 2.0f); + qglColor(QColor(0, 0, 0)); + m_oglTextSmall->renderText(x1+1, y1-2, 3.0f, str);*/ +} + +void QGLReceiverPanel::drawReceiverInfo() { + + QString str; + + // mouse wheel freq step size + /*if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_receiver == m_currentReceiver) + col = QColor(1, 190, 180, 180); + else + col = QColor(1, 100, 90, 180); + } + else + col = m_darkColor; + + str = "%1"; + str = str.arg(set->getValue1000(m_mouseWheelFreqStep, 0, "Hz")); + + int x1 = m_panRect.width() - (m_fonts.smallFontMetrics->tightBoundingRect(str).width() + 9); + int y1 = 3; + + rect = QRect(x1+2, y1, m_fonts.smallFontMetrics->tightBoundingRect(str).width() + 5, m_fonts.fontHeightSmallFont + 2); + drawGLRect(rect, col, 2.0f); + qglColor(QColor(0, 0, 0)); + m_oglTextSmall->renderText(x1+3, y1-2, 3.0f, str);*/ + + + // AGC mode + //if (m_dataEngineState == QSDR::DataEngineUp) { + + // if (m_receiver == m_currentReceiver) { + + // if (m_showAGCLines) + // col = QColor(255, 170, 90, 180); + // else + // col = QColor(215, 130, 50, 180); + // } + // else + // col = QColor(165, 80, 1); + //} + //else + // col = m_darkColor; + + //str = "%1"; + ////str = str.arg(set->getAGCModeString(m_receiver)); + //str = str.arg(m_agcModeString); + + //x1 -= m_fonts.smallFontMetrics->tightBoundingRect(str).width() + 7; + //y1 = 3; + + //m_agcButtonRect = QRect(x1+2, y1, m_fonts.smallFontMetrics->tightBoundingRect(str).width() + 5, m_fonts.fontHeightSmallFont + 2); + //drawGLRect(m_agcButtonRect, col, 2.0f); + //qglColor(QColor(0, 0, 0)); + //m_oglTextSmall->renderText(x1+3, y1-2, 3.0f, str); + + + // main frequency display + glDisable(GL_MULTISAMPLE); + if (m_panRect.height() > 15) { + + int fLength = m_fonts.bigFont1Metrics->width("55.555.555") + 30; + //GLint x = m_panRect.width()/2 - 65; + GLint x = m_panRect.left() + qRound((qreal)(m_panRect.width()/2.0f) - m_deltaF * m_panRect.width() / m_freqScaleZoomFactor) + 10; + if (x > m_panRect.right() - fLength) x -= fLength + 20; + + int alpha; + QColor colFlt; + QColor colAGC; + QColor colDSP; + QRect rect; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_receiver == set->getCurrentReceiver()) { + + colDSP = QColor(1, 190, 180, 180); + colFlt = QColor(200, 190, 50, 180); + if (m_showAGCLines) + colAGC = QColor(255, 170, 90, 180); + else + colAGC = QColor(215, 130, 50, 180); + + alpha = 255; + } + else { + + alpha = 155; + colFlt = QColor(110, 100, 1, 180); + colDSP = QColor(1, 100, 90, 180); + colAGC = QColor(165, 80, 1); + } + } + else { + + alpha = 100; + colFlt = m_darkColor; + colAGC = m_darkColor; + colDSP = m_darkColor; + } + + + // Filter width + str = "%1"; + str = str.arg(m_filterWidthString); + + int x1 = x; + int y1 = 3; + + rect = QRect(x1, y1, m_fonts.smallFontMetrics->width(str) + 4, m_fonts.fontHeightSmallFont + 2); + drawGLRect(rect, colFlt, 2.0f); + qglColor(QColor(0, 0, 0)); + m_oglTextSmall->renderText(x1+1, y1-2, 3.0f, str); + + // DSP mode + x1 += m_fonts.smallFontMetrics->width(str) + 5; + + str = "%1"; + str = str.arg(m_dspModeString); + + rect = QRect(x1, y1, m_fonts.smallFontMetrics->width(str) + 3, m_fonts.fontHeightSmallFont + 2); + drawGLRect(rect, colDSP, 2.0f); + qglColor(QColor(0, 0, 0)); + m_oglTextSmall->renderText(x1+1, y1-2, 3.0f, str); + + // AGC mode + x1 += m_fonts.smallFontMetrics->width(str) + 4; + + str = "%1"; + str = str.arg(m_agcModeString); + + rect = QRect(x1, y1, m_fonts.smallFontMetrics->width(str) + 4, m_fonts.fontHeightSmallFont + 2); + drawGLRect(rect, colAGC, 2.0f); + qglColor(QColor(0, 0, 0)); + m_oglTextSmall->renderText(x1+1, y1-2, 3.0f, str); + + // VFO frequency + TFrequency f; + f.freqMHz = (int)(m_vfoFrequency / 1000); + f.freqkHz = (int)(m_vfoFrequency % 1000); + + str = "%1.%2"; + int f1 = f.freqMHz; + int f2 = f.freqkHz; + + QString fstr = str.arg(f1/1000).arg(f1 - 1000 * (int)(f1/1000), 3, 10, QLatin1Char('0')); + //int fLength = m_fonts.bigFont1Metrics->width(fstr) + 55; + + qglColor(QColor(0, 0, 0, alpha)); + m_oglTextBig1->renderText(x+2, 14, 4.0f, fstr); + + qglColor(QColor(255, 255, 255, alpha)); + m_oglTextBig1->renderText(x, 12, 5.0f, fstr); + + str = "%1"; + if (f1 / 1000 < 10) { + + qglColor(QColor(0, 0, 0, alpha)); + m_oglTextBig2->renderText(x + 36, 14, 4.0f, str.arg(f2, 3, 10, QLatin1Char('0'))); + m_oglTextBig1->renderText(x + 60, 14, 4.0f, "MHz"); + + qglColor(QColor(255, 255, 255, alpha)); + m_oglTextBig2->renderText(x + 34, 12, 5.0f, str.arg(f2, 3, 10, QLatin1Char('0'))); + m_oglTextBig1->renderText(x + 58, 12, 5.0f, "MHz"); + } + else { + + qglColor(QColor(0, 0, 0, alpha)); + m_oglTextBig2->renderText(x + 39, 13, 4.0f, str.arg(f2, 3, 10, QLatin1Char('0'))); + m_oglTextBig1->renderText(x + 65, 13, 4.0f, "MHz"); + + qglColor(QColor(255, 255, 255, alpha)); + m_oglTextBig2->renderText(x + 41, 11, 5.0f, str.arg(f2, 3, 10, QLatin1Char('0'))); + m_oglTextBig1->renderText(x + 63, 11, 5.0f, "MHz"); + } + } + + if (m_panRect.height() > 15 && m_deltaFrequency != 0) { + + // center frequency + TFrequency f; + f.freqMHz = (int)(m_centerFrequency / 1000); + f.freqkHz = (int)(m_centerFrequency % 1000); + + str = "%1.%2"; + int f1 = f.freqMHz; + int f2 = f.freqkHz; + + QString fstr = str.arg(f1/1000).arg(f1 - 1000 * (int)(f1/1000), 3, 10, QLatin1Char('0')); + GLint x = m_panRect.width()/2 + 10; + + qglColor(QColor(80, 180, 240, 180)); + m_oglTextBig1->renderText(x, 27, 5.0f, fstr); + + str = "%1"; + if (f1 / 1000 < 10) { + + m_oglTextBig2->renderText(x + 34, 27, 5.0f, str.arg(f2, 3, 10, QLatin1Char('0'))); + m_oglTextBig1->renderText(x + 58, 27, 5.0f, "MHz"); + } + else { + + m_oglTextBig2->renderText(x + 41, 27, 5.0f, str.arg(f2, 3, 10, QLatin1Char('0'))); + m_oglTextBig1->renderText(x + 63, 27, 5.0f, "MHz"); + } + } + glEnable(GL_MULTISAMPLE); +} + +void QGLReceiverPanel::drawAGCControl() { + + glDisable(GL_MULTISAMPLE); + glLineStipple(1, 0x0C0C); + glEnable(GL_LINE_STIPPLE); + glLineWidth(1.0f); + + glScissor(m_panRect.left(), size().height() - (m_panRect.top() + m_panRect.height()), m_panRect.left() + m_panRect.width(), m_panRect.height()); + glEnable(GL_SCISSOR_TEST); + + if (m_agcMode == (AGCMode) agcOFF) { + + m_agcFixedGainLevelPixel = dBmToGLPixel(m_panRect, m_dBmPanMax, m_dBmPanMin, -m_agcFixedGain); + //GRAPHICS_DEBUG << "m_agcFixedGainLevelPixel = " << m_agcFixedGainLevelPixel; + + QString str = "AGC-F"; + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(m_panRect.right() - 32, m_agcFixedGainLevelPixel - 13, 4.0f, str); + qglColor(QColor(225, 125, 225, 255)); + m_oglTextSmall->renderText(m_panRect.right() - 34, m_agcFixedGainLevelPixel - 15, 5.0f, str); + + // AGC fixed gain line + glBegin(GL_LINES); + qglColor(QColor(0, 0, 0, 255)); + glVertex3f(m_dBmScalePanRect.right() - 1, m_agcFixedGainLevelPixel + 2, 4.0f); + glVertex3f(m_panRect.right() - 1, m_agcFixedGainLevelPixel, 4.0f); + qglColor(QColor(225, 125, 225, 255)); + glVertex3f(m_dBmScalePanRect.right() - 3, m_agcFixedGainLevelPixel, 5.0f); + glVertex3f(m_panRect.right() - 1, m_agcFixedGainLevelPixel, 4.0f); + glEnd(); + + } + else { + + m_agcThresholdPixel = dBmToGLPixel(m_panRect, m_dBmPanMax, m_dBmPanMin, m_agcThresholdOld); + + if (m_agcHangEnabled) + m_agcHangLevelPixel = dBmToGLPixel(m_panRect, m_dBmPanMax, m_dBmPanMin, m_agcHangLevelOld); + + QString str = "AGC-T"; + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(m_panRect.right() - 32, m_agcThresholdPixel - 13, 4.0f, str); + qglColor(QColor(225, 125, 125, 255)); + m_oglTextSmall->renderText(m_panRect.right() - 34, m_agcThresholdPixel - 15, 5.0f, str); + + // AGC threshold line + glBegin(GL_LINES); + qglColor(QColor(0, 0, 0, 255)); + glVertex3f(m_dBmScalePanRect.right() - 1, m_agcThresholdPixel + 2, 4.0f); + glVertex3f(m_panRect.right() - 1, m_agcThresholdPixel, 4.0f); + qglColor(QColor(225, 125, 125, 255)); + glVertex3f(m_dBmScalePanRect.right() - 3, m_agcThresholdPixel, 5.0f); + glVertex3f(m_panRect.right() - 1, m_agcThresholdPixel, 4.0f); + glEnd(); + + // AGC hang threshold line + if (m_agcHangEnabled) { + + str = "AGC-H"; + qglColor(QColor(0, 0, 0, 255)); + m_oglTextSmall->renderText(m_panRect.right() - 32, m_agcHangLevelPixel - 13, 4.0f, str); + qglColor(QColor(125, 225, 125, 255)); + m_oglTextSmall->renderText(m_panRect.right() - 34, m_agcHangLevelPixel - 15, 5.0f, str); + + glBegin(GL_LINES); + qglColor(QColor(0, 0, 0, 255)); + glVertex3f(m_dBmScalePanRect.right() - 1, m_agcHangLevelPixel + 2, 4.0f); + glVertex3f(m_panRect.right() - 1, m_agcHangLevelPixel, 4.0f); + qglColor(QColor(125, 225, 125, 255)); + glVertex3f(m_dBmScalePanRect.right() - 3, m_agcHangLevelPixel, 5.0f); + glVertex3f(m_panRect.right() - 1, m_agcHangLevelPixel, 4.0f); + glEnd(); + } + } + + glDisable(GL_SCISSOR_TEST); + glDisable(GL_LINE_STIPPLE); + glEnable(GL_MULTISAMPLE); +} + +//********************************************************************************************** +// The algorithms of the scale functions renderPanVerticalScale() and renderPanHorizontalScale() +// are taken from SDRMAXIII (c) Catherine Moss, with permission. + +void QGLReceiverPanel::renderPanVerticalScale() { + + QString str; + + int spacing = 7; + int fontHeight; + int fontMaxWidth; + if (m_smallSize) { + + fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0dBm").height() + spacing; + fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("-000.0").width(); + } + else { + + fontHeight = m_fonts.bigFont1Metrics->tightBoundingRect(".0dBm").height() + spacing; + fontMaxWidth = m_fonts.bigFont1Metrics->boundingRect("-000.0").width(); + } + + + GLint width = m_dBmScalePanRect.width(); + GLint height = m_dBmScalePanRect.height(); + + qreal unit = (qreal)(height / qAbs(m_dBmPanMax - m_dBmPanMin)); + + m_dBmScale = getYRuler2(m_dBmScalePanRect, fontHeight, unit, m_dBmPanMin, m_dBmPanMax); + + glClear(GL_COLOR_BUFFER_BIT); + + QRect textRect(0, 0, fontMaxWidth, fontHeight); + if (m_smallSize) + textRect.moveLeft(3); + else + textRect.moveLeft(-1); + + int yOld = -textRect.height(); + + int len = m_dBmScale.mainPointPositions.length(); + int sublen = m_dBmScale.subPointPositions.length(); + + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + // draw the scale background + drawGLScaleBackground(QRect(0, 0, width, height), QColor(30, 30, 30, 180)); + + if (len > 0) { + + glColor3f(0.65f, 0.76f, 0.81f); + glLineWidth(1); + + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(width, m_dBmScale.mainPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(width - 4, m_dBmScale.mainPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + + glColor3f(0.45f, 0.56f, 0.61f); + if (sublen > 0) { + + glBegin(GL_LINES); + for (int i = 0; i < sublen; i++) { + + glVertex3f(width, m_dBmScale.subPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(width - 2, m_dBmScale.subPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + } + + glColor3f(0.75f, 0.86f, 0.91f); + for (int i = 0; i < len; i++) { + + textRect.moveBottom(m_dBmScale.mainPointPositions.at(i) + textRect.height()/2); + + if (textRect.y() >= yOld && textRect.bottom() <= (m_dBmScalePanRect.height() - textRect.height())) { + + str = QString::number(m_dBmScale.mainPoints.at(i), 'f', 1); + if (m_smallSize) + m_oglTextSmall->renderText(textRect.x() + fontMaxWidth - m_fonts.smallFontMetrics->tightBoundingRect(str).width(), textRect.y(), str); + else + m_oglTextBig1->renderText(textRect.x() + fontMaxWidth - m_fonts.bigFont1Metrics->tightBoundingRect(str).width(), textRect.y(), str); + yOld = textRect.bottom(); + } + } + } + + textRect.moveTop(m_dBmScalePanRect.height() - textRect.height()); + glColor3f(0.94f, 0.22f, 0.43f); + + str = QString("dBm"); + if (m_smallSize) + m_oglTextSmall->renderText(textRect.x(), textRect.y(), str); + else + m_oglTextBig1->renderText(textRect.x() + 10, textRect.y(), str); + + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); +} + +void QGLReceiverPanel::renderPanHorizontalScale() { + + //GRAPHICS_DEBUG << "render frequency scale"; + int fontHeight; + int fontMaxWidth; + if (m_smallSize) { + + fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0kMGHz").height(); + fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000.000.0").width(); + } + else { + + fontHeight = m_fonts.bigFont1Metrics->tightBoundingRect(".0kMGHz").height(); + fontMaxWidth = m_fonts.bigFont1Metrics->boundingRect("000.000.0").width(); + } + + qreal freqSpan = (qreal)(m_sampleRate * m_freqScaleZoomFactor); + qreal lowerFreq = (qreal)m_centerFrequency - freqSpan / 2; + qreal upperFreq = (qreal)m_centerFrequency + freqSpan / 2; + qreal unit = (qreal)(m_freqScalePanRect.width() / freqSpan); + + m_frequencyScale = getXRuler(m_freqScalePanRect, fontMaxWidth, unit, lowerFreq, upperFreq); + + // draw the frequency scale + int offset_X = -1; + int textOffset_y = 5; + double freqScale = 1; + + QString fstr = QString(" Hz "); + if (upperFreq >= 1e6) { freqScale = 1e6; fstr = QString(" MHz "); } + else + if (upperFreq >= 1e3) { freqScale = 1e3; fstr = QString(" kHz "); } + + // draw the scale background + drawGLScaleBackground(QRect(0, 0, m_freqScalePanRect.width(), m_freqScalePanRect.height()), QColor(0, 0, 0, 255)); + + QRect scaledTextRect(0, textOffset_y, 1, m_freqScalePanRect.height()); + + if (m_smallSize) + scaledTextRect.setWidth(m_fonts.smallFontMetrics->width(fstr)); + else + scaledTextRect.setWidth(m_fonts.bigFont1Metrics->width(fstr)); + + scaledTextRect.moveLeft(m_freqScalePanRect.width() - scaledTextRect.width()); + + glColor3f(0.65f, 0.76f, 0.81f); + int len = m_frequencyScale.mainPointPositions.length(); + if (len > 0) { + + glLineWidth(3); + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_frequencyScale.mainPointPositions.at(i), 1.0f, 0.0f); + glVertex3f(m_frequencyScale.mainPointPositions.at(i), 4.0f, 0.0f); + } + glEnd(); + + for (int i = 0; i < len; i++) { + + QString str = QString::number(m_frequencyScale.mainPoints.at(i) / freqScale, 'f', 3); + + if (i > 0) { + + double delta = m_frequencyScale.mainPoints.at(i) - m_frequencyScale.mainPoints.at(i-1); + if (delta < 1000.0) + str = QString::number(m_frequencyScale.mainPoints.at(i) / freqScale, 'f', 4); + else + if (freqScale == 1e3) + while (str.endsWith('0')) str.remove(str.size() - 1, 1); + } + if (str.endsWith('.')) str.remove(str.size() - 1, 1); + + int textWidth; + if (m_smallSize) + textWidth = m_fonts.smallFontMetrics->width(str); + else + textWidth = m_fonts.bigFont1Metrics->width(str); + QRect textRect(m_frequencyScale.mainPointPositions.at(i) + offset_X - (textWidth / 2), textOffset_y, textWidth, fontHeight); + + if (textRect.left() < 0 || textRect.right() >= scaledTextRect.left()) continue; + + if (m_smallSize) + m_oglTextSmall->renderText(textRect.x(), textRect.y(), str); + else + m_oglTextBig1->renderText(textRect.x(), textRect.y(), str); + } + } + + if (m_frequencyScale.subPointPositions.length() > 0) { + + glLineWidth(1); + glBegin(GL_LINES); + for (int i = 0; i < m_frequencyScale.subPointPositions.length(); i++) { + + glVertex3f(m_frequencyScale.subPointPositions.at(i), 1.0f, 0.0f); + glVertex3f(m_frequencyScale.subPointPositions.at(i), 3.0f, 0.0f); + } + glEnd(); + } + + glColor3f(0.94f, 0.22f, 0.43f); + + if (m_smallSize) + m_oglTextSmall->renderText(m_freqScalePanRect.width() - 30, textOffset_y, fstr); + else + m_oglTextBig1->renderText(m_freqScalePanRect.width() - 33, textOffset_y, fstr); +} + +void QGLReceiverPanel::renderPanadapterGrid() { + + //GRAPHICS_DEBUG << "render panadapter grid"; + glClear(GL_COLOR_BUFFER_BIT); + glLineStipple(1, 0x9999); + //glLineStipple(1, 0xCCCC); + glEnable(GL_LINE_STIPPLE); + glLineWidth(1.0f); + + // vertical lines + int len = m_frequencyScale.mainPointPositions.length(); + if (len > 0) { + + GLint x1 = m_panRect.left(); + GLint x2 = 1; + if (m_dBmScalePanRect.isValid()) x2 += m_dBmScalePanRect.width(); + + //GLint y1 = rect.top() + 1; + GLint y1 = 1; + GLint y2 = m_panRect.bottom() - 1; + + TGL2int *vertexArray = new TGL2int[len * 2]; + int vertexArrayLen = 0; + + TGL2int point1, point2; + point1.y = y1; + point2.y = y2; + for (int i = 0; i < len; i++) { + + GLint x = m_frequencyScale.mainPointPositions.at(i); + if (x < x2) continue; + x += x1; + point1.x = x; + point2.x = x; + vertexArray[vertexArrayLen++] = point1; + vertexArray[vertexArrayLen++] = point2; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_INT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, vertexArrayLen); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + } + + // horizontal lines + len = m_dBmScale.mainPointPositions.length(); + if (len > 0) { + + TGL2float *vertexArray = new TGL2float[len * 2]; + int vertexArrayLen = 0; + + TGL2float point1, point2; + point1.x = m_panRect.left() + m_dBmScalePanRect.width(); + point2.x = m_panRect.right(); + + for (int i = 0; i < len; i++) { + + GLfloat y = m_dBmScale.mainPointPositions.at(i); + + point1.y = y; + point2.y = y; + + vertexArray[vertexArrayLen++] = point1; + vertexArray[vertexArrayLen++] = point2; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, vertexArrayLen); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + + } + glDisable(GL_LINE_STIPPLE); +} + +void QGLReceiverPanel::renderWaterfallVerticalScale() { + + QString str; + + int spacing = 7; + int fontHeight; + int fontMaxWidth; + if (m_smallSize) { + + fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0s").height() + spacing; + fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000.0").width(); + } + else { + + fontHeight = m_fonts.bigFont1Metrics->tightBoundingRect(".0s").height() + spacing; + fontMaxWidth = m_fonts.bigFont1Metrics->boundingRect("000.0").width(); + } + + GLint width = m_secScaleWaterfallRect.width(); + GLint height = m_secScaleWaterfallRect.height(); + + qreal unit = (qreal)(height / qAbs(m_secWaterfallMax - m_secWaterfallMin)); + + m_secScale = getYRuler2(m_secScaleWaterfallRect, fontHeight, unit, m_secWaterfallMin, m_secWaterfallMax); + //m_secScale = getYRuler3(m_secScaleWaterfallRect, fontHeight, unit, m_secWaterfallMin, m_secWaterfallMax, 10.0f); + + glClear(GL_COLOR_BUFFER_BIT); + + QRect textRect(0, 0, fontMaxWidth, fontHeight); + if (m_smallSize) + textRect.moveLeft(3); + else + textRect.moveLeft(-1); + + int yOld = -textRect.height(); + + int len = m_secScale.mainPointPositions.length(); + int sublen = m_secScale.subPointPositions.length(); + + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + // draw the scale background + drawGLScaleBackground(QRect(0, 0, width, height), QColor(40, 40, 40, 180)); + + if (len > 0) { + + glColor3f(0.65f, 0.76f, 0.81f); + glLineWidth(1); + + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(width, m_secScale.mainPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(width - 4, m_secScale.mainPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + + glColor3f(0.45f, 0.56f, 0.61f); + if (sublen > 0) { + + glBegin(GL_LINES); + for (int i = 0; i < sublen; i++) { + + glVertex3f(width, m_secScale.subPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(width - 2, m_secScale.subPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + } + + glColor3f(0.95f, 0.96f, 0.91f); + for (int i = 0; i < len; i++) { + + textRect.moveBottom(m_secScale.mainPointPositions.at(i) + textRect.height()/2); + + if (textRect.y() >= yOld && textRect.bottom() <= (height - textRect.height())) { + + str = QString::number(m_secScale.mainPoints.at(i), 'f', 1); + if (m_smallSize) + m_oglTextSmall->renderText(textRect.x() + fontMaxWidth - m_fonts.smallFontMetrics->tightBoundingRect(str).width(), textRect.y(), str); + else + m_oglTextBig1->renderText(textRect.x() + fontMaxWidth - m_fonts.bigFont1Metrics->tightBoundingRect(str).width(), textRect.y(), str); + yOld = textRect.bottom(); + } + } + } + + textRect.moveTop(height - textRect.height()); + glColor3f(0.94f, 0.22f, 0.43f); + + str = QString("sec"); + if (m_smallSize) + m_oglTextSmall->renderText(textRect.x(), textRect.y(), str); + else + m_oglTextBig1->renderText(textRect.x() + 10, textRect.y(), str); + + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); +} + +//******************************************************************** + +void QGLReceiverPanel::getRegion(QPoint p) { + + //QRect mouse_rect(0, 0, 100, 100); + //mouse_rect.moveCenter(p); + /*if (m_lockedPanButtonRect.contains(p)) { + + m_mouseRegion = lockedPanButtonRegion; + } + else if (m_vfoToMidButtonRect.contains(p)) { + + m_mouseRegion = vfoToMidButtonRegion; + } + else if (m_midToVfoButtonRect.contains(p)) { + + m_mouseRegion = midToVfoButtonRegion; + }*/ + if (m_agcButtonRect.contains(p)) { + + m_mouseRegion = agcButtonRegion; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + }*/ + } + else if (m_freqScalePanRect.contains(p)) { + + m_mouseRegion = freqScalePanadapterRegion; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + }*/ + } + else if (m_dBmScalePanRect.contains(p)) { + + m_mouseRegion = dBmScalePanadapterRegion; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + }*/ + } + else if (qAbs(p.x() - m_filterRect.left()) < m_snapMouse && + m_panRect.contains(p) + ) { + m_mouseRegion = filterRegionLow; + m_mouseDownFilterFrequencyLo = m_filterLowerFrequency; + } + else if (qAbs(p.x() - m_filterRect.right()) < m_snapMouse && + m_panRect.contains(p) + ) { + m_mouseRegion = filterRegionHigh; + m_mouseDownFilterFrequencyHi = m_filterUpperFrequency; + } + else if (m_filterRect.contains(p)) { + + m_mouseRegion = filterRegion; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + }*/ + } + //else if (qAbs(p.y() - m_agcThresholdPixel) < m_snapMouse && !m_crossHairCursor) { + else if (qAbs(p.y() - m_agcThresholdPixel) < m_snapMouse) { + + m_mouseRegion = agcThresholdLine; + m_mouseDownAGCThreshold = m_agcThresholdOld; + } + //else if (qAbs(p.y() - m_agcHangLevelPixel) < m_snapMouse && !m_crossHairCursor) { + else if (qAbs(p.y() - m_agcHangLevelPixel) < m_snapMouse) { + + m_mouseRegion = agcHangLine; + m_mouseDownAGCHangLevel = m_agcHangLevelOld; + } + //else if (qAbs(p.y() - m_agcFixedGainLevelPixel) < m_snapMouse && !m_crossHairCursor) { + else if (qAbs(p.y() - m_agcFixedGainLevelPixel) < m_snapMouse) { + + m_mouseRegion = agcFixedGainLine; + m_mouseDownFixedGainLevel = -m_agcFixedGain; + } + else if (m_panRect.contains(p)) { + + m_mouseRegion = panadapterRegion; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + }*/ + } + else if (m_waterfallRect.contains(p)) { + + m_mouseRegion = waterfallRegion; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + }*/ + } + else + m_mouseRegion = elsewhere; + + //GRAPHICS_DEBUG << "region" << m_mouseRegion; +} + +void QGLReceiverPanel::resizeGL(int iWidth, int iHeight) { + + int width = (int)(iWidth/2) * 2; + int height = iHeight; + + if (width != m_oldWidth) { + + m_freqScalePanadapterRenew = true; + m_panGridRenew = true; + + m_oldWidth = width; + } + + m_spectrumVertexColorUpdate = true; + m_waterfallUpdate = true; + m_peakHoldBufferResize = true; + + glFinish(); + + m_resizeTime.restart(); + setupDisplayRegions(QSize(width, height)); + glViewport(0, 0, (GLsizei)width, (GLsizei)height); + + setProjectionOrthographic(width, height); +} + +void QGLReceiverPanel::setupDisplayRegions(QSize size) { + + m_displayTop = 0; + //m_displayTop = m_fonts.fontHeightSmallFont + 2; + int freqScaleRectHeight = 20; + //int dBmScaleWidth = 45; + + m_freqScalePanRect = QRect( + 0, + m_displayTop + qRound((size.height() - m_displayTop - freqScaleRectHeight) * m_freqRulerPosition), + size.width(), + freqScaleRectHeight); + + m_panRect = QRect( + 0, + m_displayTop, + size.width(), + m_freqScalePanRect.top() - m_displayTop); + + + if (m_panRect.height() != m_oldPanRectHeight) { + + m_dBmScalePanadapterRenew = true; + m_panGridRenew = true; + m_secScaleWaterfallRenew = true; + } + + m_oldPanRectHeight = m_panRect.height(); + m_panRectWidth = (GLint)m_panRect.width(); + m_displayCenterlineHeight = m_panRect.top() + (m_panRect.height() - 3); + + m_waterfallRect = QRect( + m_freqScalePanRect.left(), + m_freqScalePanRect.top() + m_freqScalePanRect.height(), + //m_freqScalePanRect.top(), + m_freqScalePanRect.width(), + //size.height() - m_displayTop - m_freqScalePanRect.top() - m_freqScalePanRect.height()); + size.height() - m_freqScalePanRect.top() - m_freqScalePanRect.height()); + //size.height() - m_freqScalePanRect.top()); + + m_waterfallUpdate = true; + + if ((m_panRect.height() + m_waterfallRect.height()) > m_bigHeight && m_panRect.width() > m_bigWidth) + m_smallSize = false; + else + m_smallSize = true; + + m_dBmScalePanRect = QRect( + m_panRect.left(), + m_displayTop, + 45, + m_panRect.height()); + + m_secScaleWaterfallRect = QRect( + m_waterfallRect.left(), + m_freqScalePanRect.top() + m_freqScalePanRect.height(), + 45, + m_waterfallRect.height()); + + m_secWaterfallMin = -(1.0/m_fps) * m_secScaleWaterfallRect.height(); + + m_freqScalePanadapterUpdate = true; + m_dBmScalePanadapterUpdate = true; + m_secScaleWaterfallUpdate = true; + m_panGridUpdate = true; + +// GRAPHICS_DEBUG << "***************************************************************************"; +// GRAPHICS_DEBUG << "receiver:" << m_receiver; +// GRAPHICS_DEBUG << "total size" << size.height(); +// GRAPHICS_DEBUG << "sizes (top, bottom, height):"; +// GRAPHICS_DEBUG << "panRect" << m_panRect.top() << m_panRect.bottom() << m_panRect.height(); +// //GRAPHICS_DEBUG << "panRect (H/W): " << m_panRect.height() << ": " << m_panRect.width(); +// GRAPHICS_DEBUG << "waterfallRect" << m_waterfallRect.top() << m_waterfallRect.bottom() << m_waterfallRect.height(); +// GRAPHICS_DEBUG << "freqScalePanRect" << m_freqScalePanRect.top() << m_freqScalePanRect.bottom() << m_freqScalePanRect.height(); +// GRAPHICS_DEBUG << "dBmScalePanRect" << m_dBmScalePanRect.top() << m_dBmScalePanRect.bottom() << m_dBmScalePanRect.height(); +// GRAPHICS_DEBUG << ""; + +} + +void QGLReceiverPanel::saveGLState() { + + glPushAttrib(GL_ALL_ATTRIB_BITS); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); +} + +void QGLReceiverPanel::restoreGLState() { + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPopAttrib(); +} + +void QGLReceiverPanel::showText(float x, float y, float z = 0.0f, const QString &text = "", bool smallText = true) { + + if (smallText) + m_oglTextSmall->renderText(x, y, z, text); + else + m_oglTextBig1->renderText(x, y, z, text); +} + +//******************************************************************** +// HMI control + +void QGLReceiverPanel::enterEvent(QEvent *event) { + + setFocus(Qt::MouseFocusReason); + + m_mousePos = QPoint(-1, -1); + m_mouseRegion = elsewhere; + + setCursor(Qt::BlankCursor); + update(); + + QGLWidget::enterEvent(event); +} + +void QGLReceiverPanel::leaveEvent(QEvent *event) { + + m_mousePos = QPoint(-100, -100); + m_mouseRegion = elsewhere; + + update(); + + QGLWidget::leaveEvent(event); +} + +void QGLReceiverPanel::wheelEvent(QWheelEvent* event) { + + //GRAPHICS_DEBUG << "wheelEvent"; + QPoint pos = event->pos(); + + if (event->buttons() == Qt::NoButton) getRegion(pos); + + double freqStep = set->getMouseWheelFreqStep(m_currentReceiver); + + switch (m_mouseRegion) { + + case panadapterRegion: + case waterfallRegion: + case filterRegion: + case filterRegionLow: + case filterRegionHigh: + + double delta = 0; + if (event->delta() < 0) + delta = -freqStep; + else if (event->delta() > 0) + delta = freqStep; + + if (!m_panLocked) { + + if (m_centerFrequency + delta > MAXFREQUENCY) + m_centerFrequency = MAXFREQUENCY; + else if (m_centerFrequency + delta < 0) + m_centerFrequency = 0; + else + // snap to the frequency step + m_centerFrequency = (long)(qRound((m_centerFrequency + delta) / qAbs(freqStep)) * qAbs(freqStep)); + + m_vfoFrequency = m_centerFrequency - m_deltaFrequency; + } + else { + + if (m_vfoFrequency + delta > m_centerFrequency + m_sampleRate/2) + m_vfoFrequency = m_centerFrequency + m_sampleRate/2; + else if (m_vfoFrequency + delta < m_centerFrequency - m_sampleRate/2) + m_vfoFrequency = m_centerFrequency - m_sampleRate/2; + else + // snap to the frequency step + m_vfoFrequency = (long)(qRound((m_vfoFrequency + delta) / qAbs(freqStep)) * qAbs(freqStep)); + + m_deltaFrequency = m_centerFrequency - m_vfoFrequency; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + //GRAPHICS_DEBUG << "m_deltaFrequency: " << m_deltaFrequency; + } + + set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + + break; + } + + //updateGL(); + update(); +} + +void QGLReceiverPanel::mousePressEvent(QMouseEvent* event) { + + //GRAPHICS_DEBUG << "mousePressEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == agcButtonRegion) { + + if (event->buttons() == Qt::LeftButton) { + + if (m_showAGCLines) { + + m_showAGCLines = false; + set->setAGCShowLines(this, m_receiver, false); + } + else { + + m_showAGCLines = true; + set->setAGCShowLines(this, m_receiver, true); + } + } + } + else if (m_mouseRegion == panadapterRegion || m_mouseRegion == waterfallRegion) { + + if (event->buttons() == Qt::LeftButton && m_receiver != set->getCurrentReceiver()) { + + set->setCurrentReceiver(this, m_receiver); + } + else if (event->buttons() == Qt::LeftButton && m_clickVFO) { + + m_crossHairCursor = false; + setCursor(Qt::OpenHandCursor); + m_dragMouse = true; + + double freqStep = set->getMouseWheelFreqStep(m_currentReceiver); + int dx = m_panRect.width()/2 - m_mousePos.x(); + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width()); + + m_vfoFrequency = (long)(qRound((m_centerFrequency - unit * dx) / qAbs(freqStep)) * qAbs(freqStep)); + + /*if (m_vfoFrequency > m_centerFrequency + m_sampleRate/2) + m_vfoFrequency = m_centerFrequency + m_sampleRate/2; + else if (m_vfoFrequency < m_centerFrequency - m_sampleRate/2) + m_vfoFrequency = m_centerFrequency - m_sampleRate/2;*/ + + m_deltaFrequency = m_centerFrequency - m_vfoFrequency; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + + set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + update(); + } + else if (event->buttons() == Qt::LeftButton) { + + m_crossHairCursor = false; + setCursor(Qt::OpenHandCursor); + m_dragMouse = true; + } + else if (event->buttons() == Qt::RightButton) { + + showRadioPopup(true); + } + } + else if (m_mouseRegion == filterRegion) { + + //setCursor(Qt::ArrowCursor); + if (event->buttons() == Qt::LeftButton) + m_highlightFilter = true; + } + else if (m_mouseRegion == freqScalePanadapterRegion) { + + m_rulerMouseDownPos = m_freqScalePanRect.topLeft(); + + if (event->buttons() == Qt::RightButton) setCursor(Qt::SplitHCursor); + update(); + + return; + } + else if (m_mouseRegion == dBmScalePanadapterRegion) { + + m_rulerMouseDownPos = m_dBmScalePanRect.topLeft(); + + if (event->buttons() == Qt::RightButton) + setCursor(Qt::SplitVCursor); + update(); + + return; + } + + update(); +} + +void QGLReceiverPanel::mouseReleaseEvent(QMouseEvent *event) { + + //GRAPHICS_DEBUG << "mouseReleaseEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == freqScalePanadapterRegion) { + + return; + } + //else if (m_mouseRegion == panadapterRegion || m_mouseRegion == waterfallRegion) { + //} + m_dragMouse = false; + m_crossHairCursor = true; + if (m_crossHair) + setCursor(Qt::BlankCursor); + else + setCursor(Qt::ArrowCursor); + + update(); +} + +void QGLReceiverPanel::mouseDoubleClickEvent(QMouseEvent *event) { + + //GRAPHICS_DEBUG << "mouseDoubleClickEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == panadapterRegion) { + + if (event->buttons() == Qt::LeftButton) { + + //set->showRadioPopupWidget(); +// if (!band160mBtn->isVisible()) +// band160mBtn->show(); +// else +// band160mBtn->hide(); + } + } +} + +void QGLReceiverPanel::mouseMoveEvent(QMouseEvent* event) { + + //GRAPHICS_DEBUG << "mouseMoveEvent"; + QPoint pos = event->pos(); + m_mousePos = event->pos(); + + if (event->buttons() == Qt::NoButton) getRegion(pos); + + switch (m_mouseRegion) { + + //case lockedPanButtonRegion: + //case vfoToMidButtonRegion: + //case midToVfoButtonRegion: + + //if (m_crossHairCursor) setCursor(Qt::ArrowCursor); + + // break; + + case agcThresholdLine: + + //GRAPHICS_DEBUG << "agcThresholdLine Rx:" << m_receiver; + if (!m_showAGCLines || (m_agcMode == (AGCMode) agcOFF)) + break; + + m_crossHairCursor = false; + setCursor(Qt::SizeVerCursor); + + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height(); + qreal dAGCThreshold = dPos.y() * unit; + + m_agcThresholdNew = m_mouseDownAGCThreshold + dAGCThreshold; + if (m_agcThresholdNew > m_dBmPanMax-2) + m_agcThresholdNew = m_dBmPanMax-2; + + if (m_agcThresholdNew < m_dBmPanMin+2) + m_agcThresholdNew = m_dBmPanMin+2; + + set->setAGCThreshold_dB(this, m_receiver, m_agcThresholdNew); + } + break; + + case agcHangLine: + + //GRAPHICS_DEBUG << "agcHangLine Rx:" << m_receiver; + if (!m_showAGCLines || (m_agcMode == (AGCMode) agcOFF) || !m_agcHangEnabled) + break; + + m_crossHairCursor = false; + setCursor(Qt::SizeVerCursor); + + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height(); + qreal dAGCThreshold = dPos.y() * unit; + + m_agcHangLevelNew = m_mouseDownAGCHangLevel + dAGCThreshold; + + if (m_agcHangLevelNew > m_dBmPanMax-2) + m_agcHangLevelNew = m_dBmPanMax-2; + + if (m_agcHangLevelNew < m_dBmPanMin+2) + m_agcHangLevelNew = m_dBmPanMin+2; + + set->setAGCHangLevel_dB(this, m_receiver, m_agcHangLevelNew); + //GRAPHICS_DEBUG << "set m_agcHangLevelNew = " << m_agcHangLevelNew; + } + break; + + case agcFixedGainLine: + + //GRAPHICS_DEBUG << "agcFixedGainLine Rx:" << m_receiver; + if (!m_showAGCLines || (m_agcMode != (AGCMode) agcOFF)) + break; + + m_crossHairCursor = false; + setCursor(Qt::SizeVerCursor); + + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height(); + qreal dAGCFixedGain = dPos.y() * unit; + + qreal agcFixedGain = m_mouseDownFixedGainLevel + dAGCFixedGain; + + if (agcFixedGain > m_dBmPanMax-2) + agcFixedGain = m_dBmPanMax-2; + + if (agcFixedGain < m_dBmPanMin+2) + agcFixedGain = m_dBmPanMin+2; + + set->setAGCFixedGain_dB(this, m_receiver, -agcFixedGain); + } + break; + + case panadapterRegion: + case waterfallRegion: + + //GRAPHICS_DEBUG << "panadapterRegion Rx:" << m_receiver; + if (!m_dragMouse) { + + m_crossHairCursor = true; + if (m_crossHair) + setCursor(Qt::BlankCursor); + else + setCursor(Qt::ArrowCursor); + } + + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_freqScalePanRect.width()); + qreal deltaFreq = unit * dPos.x(); + + long newFrequency = m_centerFrequency + deltaFreq; + if (newFrequency > MAXFREQUENCY) + newFrequency = MAXFREQUENCY; + else + if (newFrequency + deltaFreq < 0) + newFrequency = 0; + else { + + if (m_panLocked) { + + if (m_vfoFrequency > m_centerFrequency + m_sampleRate/2) + m_vfoFrequency = m_centerFrequency + m_sampleRate/2; + else if (m_vfoFrequency < m_centerFrequency - m_sampleRate/2) + m_vfoFrequency = m_centerFrequency - m_sampleRate/2; + + m_vfoFrequency -= deltaFreq; + } + else + m_centerFrequency += deltaFreq; + } + + if (m_panLocked) { + + set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + + m_deltaFrequency = m_centerFrequency - m_vfoFrequency; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + } + else { + + m_vfoFrequency = m_centerFrequency - m_deltaFrequency; + + set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + } + + m_mouseDownPos = pos; + + m_displayCenterlineHeight = m_panRect.top() + (m_panRect.height() - 3); + + m_showFilterLeftBoundary = false; + m_showFilterRightBoundary = false; + m_highlightFilter = false; + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + m_displayCenterlineHeight = m_panRect.top() + (m_panRect.height() - 3); + + m_showFilterLeftBoundary = false; + m_showFilterRightBoundary = false; + m_highlightFilter = false; + break; + + //case waterfallRegion: + + //GRAPHICS_DEBUG << "waterfallRegion Rx:" << m_receiver; + //m_crossHairCursor = true; + //setCursor(Qt::BlankCursor); + + /*if (event->buttons() == Qt::LeftButton) { + + m_cameraAngle += (pos - m_mouseDownPos); + m_mouseDownPos = pos; + } + else + if (event->buttons() == Qt::RightButton) { + + m_cameraDistance += (pos.y() - m_mouseDownPos.y()) * 0.2f; + m_mouseDownPos = pos; + } + setCursor(Qt::ArrowCursor);*/ + //update(); + //break; + + case dBmScalePanadapterRegion: + //GRAPHICS_DEBUG << "dBmScalePanadapterRegion"; + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal unit = (qreal)(qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height()); + + qreal newMin = m_dBmPanMin - unit * dPos.y(); + qreal newMax = m_dBmPanMax - unit * dPos.y(); + + if (newMin > MINDBM && newMax < MAXDBM) { + + m_dBmPanMin = newMin; + m_dBmPanMax = newMax; + + set->setdBmPanScaleMin(m_receiver, m_dBmPanMin); + set->setdBmPanScaleMax(m_receiver, m_dBmPanMax); + } + + m_mouseDownPos = pos; + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + else + if (event->buttons() == Qt::RightButton && + event->modifiers() == Qt::ControlModifier) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.y() > 0) + m_dBmPanDelta = 0.5f; + else if (dPos.y() < 0) + m_dBmPanDelta = -0.5f; + + m_dBmPanMin += m_dBmPanDelta; + m_dBmPanMax -= m_dBmPanDelta; + + if (qAbs(m_dBmPanMax - m_dBmPanMin) < 10) { + + m_dBmPanMin -= m_dBmPanDelta; + m_dBmPanMax += m_dBmPanDelta; + } + if (m_dBmPanMin < MINDBM) m_dBmPanMin = MINDBM; + if (m_dBmPanMax > MAXDBM) m_dBmPanMax = MAXDBM; + + set->setdBmPanScaleMin(m_receiver, m_dBmPanMin); + set->setdBmPanScaleMax(m_receiver, m_dBmPanMax); + + m_mouseDownPos = pos; + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.y() > 0) + m_dBmPanDelta = 0.5f; + else if (dPos.y() < 0) + m_dBmPanDelta = -0.5f; + + m_dBmPanMax -= m_dBmPanDelta; + + if (qAbs(m_dBmPanMax - m_dBmPanMin) < 10) { + + m_dBmPanMin -= m_dBmPanDelta; + m_dBmPanMax += m_dBmPanDelta; + } + if (m_dBmPanMin < MINDBM) m_dBmPanMin = MINDBM; + if (m_dBmPanMax > MAXDBM) m_dBmPanMax = MAXDBM; + + set->setdBmPanScaleMin(m_receiver, m_dBmPanMin); + set->setdBmPanScaleMax(m_receiver, m_dBmPanMax); + + m_mouseDownPos = pos; + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + else { + + setCursor(Qt::ArrowCursor); + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + break; + + case freqScalePanadapterRegion: + //GRAPHICS_DEBUG << "freqScalePanadapterRegion Rx" << m_receiver; + if (event->buttons() == Qt::LeftButton && + event->modifiers() == Qt::ShiftModifier) { + + QPoint dPos = m_mouseDownPos - pos; + int bottom_y = height() - m_freqScalePanRect.height(); + int new_y = m_rulerMouseDownPos.y() - dPos.y(); + + if (new_y < m_panRect.top() + m_panSpectrumMinimumHeight) + new_y = m_panRect.top() + m_panSpectrumMinimumHeight; + if (new_y > bottom_y) + new_y = bottom_y; + + m_freqRulerPosition = (float)(new_y - m_panRect.top()) / (bottom_y - m_panRect.top()); + set->setFreqRulerPosition(this, m_receiver, m_freqRulerPosition); + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + else if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + + qreal unit = (qreal)((m_sampleRate * m_freqScaleZoomFactor) / m_freqScalePanRect.width()); + qreal deltaFreq = unit * dPos.x(); + + /*if (m_freqScaleZoomFactor < 1.0) { + + } + else {*/ + + long newFrequency = m_centerFrequency + deltaFreq; + if (newFrequency > MAXFREQUENCY) + newFrequency = MAXFREQUENCY; + else + if (newFrequency + deltaFreq < 0) + newFrequency = 0; + else { + + m_centerFrequency += deltaFreq; + } + + if (!m_panLocked) { + + m_vfoFrequency = m_centerFrequency - m_deltaFrequency; + set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + } + + //set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + //set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + + else { + + m_deltaFrequency = m_centerFrequency - m_vfoFrequency; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + + qreal vol = set->getMainVolume(m_receiver); + set->setMainVolume(this, m_receiver, 0.0f); + set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + set->setNCOFrequency(this, true, m_receiver, -m_deltaFrequency); + set->setMainVolume(this, m_receiver, vol); + } + + //set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + //} + m_mouseDownPos = pos; + + m_displayCenterlineHeight = m_panRect.top() + (m_panRect.height() - 3); + + m_showFilterLeftBoundary = false; + m_showFilterRightBoundary = false; + m_highlightFilter = false; + } + else + if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.x() > 0) + m_freqScaleZoomFactor += 0.01; + else if (dPos.x() < 0) + m_freqScaleZoomFactor -= 0.01; + + if (m_freqScaleZoomFactor > 1.0) m_freqScaleZoomFactor = 1.0; + if (m_freqScaleZoomFactor < 0.05) m_freqScaleZoomFactor = 0.05; + //if (m_freqScaleZoomFactor < 0.15) m_freqScaleZoomFactor = 0.15; + + m_mouseDownPos = pos; + m_freqScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + else + setCursor(Qt::ArrowCursor); + + m_showFilterLeftBoundary = false; + m_showFilterRightBoundary = false; + m_highlightFilter = false; + break; + + case filterRegionLow: + + setCursor(Qt::SizeHorCursor); + m_showFilterLeftBoundary = true; + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal dFreq = (qreal)(dPos.x() * m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width(); + + m_filterLowerFrequency = qRound(m_mouseDownFilterFrequencyLo - dFreq); + set->setRXFilter(this, m_receiver, m_filterLowerFrequency, m_filterUpperFrequency); + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + + m_highlightFilter = false; + break; + + case filterRegionHigh: + + setCursor(Qt::SizeHorCursor); + m_showFilterRightBoundary = true; + if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal dFreq = (qreal)(dPos.x() * m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width(); + + m_filterUpperFrequency = qRound(m_mouseDownFilterFrequencyHi - dFreq); + set->setRXFilter(this, m_receiver, m_filterLowerFrequency, m_filterUpperFrequency); + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + + m_highlightFilter = false; + break; + + case filterRegion: + + setCursor(Qt::ArrowCursor); + m_displayCenterlineHeight = m_panRect.top() + (size().height() - 3); + + if (event->buttons() == Qt::LeftButton) { + + m_highlightFilter = true; + QPoint dPos = m_mouseDownPos - pos; + qreal dFreq = (qreal)(dPos.x() * m_sampleRate * m_freqScaleZoomFactor) / m_panRect.width(); + + m_filterUpperFrequency = qRound(m_mouseDownFilterFrequencyHi - dFreq); + m_filterLowerFrequency = qRound(m_mouseDownFilterFrequencyLo - dFreq); + set->setRXFilter(this, m_receiver, m_filterLowerFrequency, m_filterUpperFrequency); + +// if (m_displayTime.elapsed() >= 50) { +// +// m_displayTime.restart(); +// update(); +// } + } + m_showFilterLeftBoundary = false; + m_showFilterRightBoundary = false; + break; + + case elsewhere: + //GRAPHICS_DEBUG << "elsewhere"; + break; + } + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } +} + +void QGLReceiverPanel::keyPressEvent(QKeyEvent* event) { + + //GRAPHICS_DEBUG << "keyPressEvent"; + if (event->key() == Qt::Key_Control) { + + //m_keyCTRLpressed = true; + //GRAPHICS_DEBUG << "m_keyCTRLpressed =" << m_keyCTRLpressed; + //printf("Ry %f\n",ry); + //ry+=10.0f; + } + else if (event->key() == Qt::Key_T) { + + //printf("Ry %f\n",ry); + //ry-=10.0f; + } + else if (event->key() == Qt::Key_P) { + + //drawTeapot = !drawTeapot; + } + else if (event->key() == Qt::Key_W) { + + //approach -= 0.1f; + } + else if (event->key() == Qt::Key_S) { + + //approach += 0.1f; + } + else { + + //m_keyCTRLpressed = false; + //GRAPHICS_DEBUG << "m_keyCTRLpressed =" << m_keyCTRLpressed; + //event->ignore(); + } + + QWidget::keyPressEvent(event); + //updateGL(); + update(); +} + +//void QGLReceiverPanel::timerEvent(QTimerEvent *) { +// +// update(); +//} + +//******************************************************************** + +void QGLReceiverPanel::setSpectrumSize(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (m_dataEngineState == QSDR::DataEngineDown) { + + GRAPHICS_DEBUG << "set spectrum size to: " << value; + m_spectrumSize = value; + update(); + } +} + +void QGLReceiverPanel::setCtrFrequency(QObject *sender, int mode, int rx, long freq) { + + Q_UNUSED(sender) + Q_UNUSED(mode) + + //if (sender == this) return; + if (m_receiver != rx) return; + + if (m_peakHold) { + + //spectrumBufferMutex.lock(); + m_panPeakHoldBins.clear(); + m_panPeakHoldBins.resize(m_panSpectrumBinsLength); + m_panPeakHoldBins.fill(-500.0); + //spectrumBufferMutex.unlock(); + } + + for (int i = 0; i < set->getNumberOfReceivers(); i++) { + + m_rxDataList[i].ctrFrequency = freq; + } + + //GRAPHICS_DEBUG << "set center F = " << freq; + m_centerFrequency = freq; + m_freqScalePanadapterUpdate = true; + m_panGridUpdate = true; + update(); +} + +void QGLReceiverPanel::setVFOFrequency(QObject *sender, int mode, int rx, long freq) { + + Q_UNUSED(sender) + Q_UNUSED(mode) + + //if (sender == this) return; + if (m_receiver != rx) return; + + if (m_peakHold) { + + //spectrumBufferMutex.lock(); + m_panPeakHoldBins.clear(); + m_panPeakHoldBins.resize(m_panSpectrumBinsLength); + m_panPeakHoldBins.fill(-500.0); + //spectrumBufferMutex.unlock(); + } + + for (int i = 0; i < set->getNumberOfReceivers(); i++) { + + m_rxDataList[i].vfoFrequency = freq; + } + + //GRAPHICS_DEBUG << "set vfo F = " << freq; + m_vfoFrequency = freq; + if (m_vfoFrequency > m_centerFrequency + m_sampleRate/2) + m_vfoFrequency = m_centerFrequency + m_sampleRate/2; + else if (m_vfoFrequency < m_centerFrequency - m_sampleRate/2) + m_vfoFrequency = m_centerFrequency - m_sampleRate/2; + + m_deltaFrequency = m_centerFrequency - m_vfoFrequency; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + + m_freqScalePanadapterUpdate = true; + m_panGridUpdate = true; + update(); +} + +void QGLReceiverPanel::setVfoToMidFrequency() { + + m_vfoFrequency = m_centerFrequency; + m_deltaFrequency = 0; + m_deltaF = 0; + + set->setVFOFrequency(this, 0, m_receiver, m_vfoFrequency); + set->setNCOFrequency(this, false, m_receiver, 0); +} + +void QGLReceiverPanel::setMidToVfoFrequency() { + + m_centerFrequency = m_vfoFrequency; + m_deltaFrequency = 0; + m_deltaF = 0; + + set->setCtrFrequency(this, 0, m_receiver, m_centerFrequency); + set->setNCOFrequency(this, false, m_receiver, 0); +} + +void QGLReceiverPanel::setFilterFrequencies(QObject *sender, int rx, qreal lo, qreal hi) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + + m_filterLowerFrequency = lo; + m_filterUpperFrequency = hi; + m_filterChanged = true; + update(); +} + +void QGLReceiverPanel::setCurrentReceiver(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_currentReceiver = value; + m_panGridUpdate = true; + update(); +} + +void QGLReceiverPanel::freqRulerPositionChanged(QObject *sender, int rx, float pos) { + + Q_UNUSED (sender) + + if (rx == m_receiver) { + + m_freqRulerPosition = pos; + + setupDisplayRegions(size()); + update(); + } +} + +void QGLReceiverPanel::setSpectrumBuffer(int rx, const qVectorFloat& buffer) { + + if (m_receiver != rx) return; + + QVector specBuf(m_spectrumSize); + QVector waterBuf(m_spectrumSize); + waterBuf = buffer; + + + if (m_dataEngineState == QSDR::DataEngineUp) { + + if (m_spectrumAveraging) { + + spectrumBufferMutex.lock(); + specBuf = buffer; + averager->ProcessDBAverager(specBuf, specBuf); + computeDisplayBins(specBuf, waterBuf); + spectrumBufferMutex.unlock(); + } + else { + + specBuf = buffer; + if (m_dataEngineState == QSDR::DataEngineUp) + computeDisplayBins(specBuf, waterBuf); + } + } +} + +void QGLReceiverPanel::computeDisplayBins(QVector& buffer, QVector& waterfallBuffer) { + + //int m_sampleSize = 0; + int deltaSampleSize = 0; + int idx = 0; + int lIdx = 0; + int rIdx = 0; + qreal localMax; + + if (m_serverMode == QSDR::ChirpWSPRFile) { + + m_sampleSize = (int)floor(2 * BUFFER_SIZE * m_freqScaleZoomFactor); + deltaSampleSize = 2 * BUFFER_SIZE - m_sampleSize; + } + else { + + m_sampleSize = (int)floor(m_fftMult * m_spectrumSize * m_freqScaleZoomFactor); + deltaSampleSize = m_spectrumSize - m_sampleSize; + } + + if (m_receiver == 0) { + + if (m_sampleSize < 2048) { + + if (m_fftMult == 1) { + + GRAPHICS_DEBUG << "set sample size to 8192"; + set->setSampleSize(this, 0, 8192); + m_dBmPanLogGain += 6.0; + m_fftMult = 2; + + return; + } + else if (m_fftMult == 2) { + + GRAPHICS_DEBUG << "set sample size to 16384"; + set->setSampleSize(this, 0, 16384); + m_dBmPanLogGain += 6.0; + m_fftMult = 4; + + return; + } + else if (m_fftMult == 4) { + + GRAPHICS_DEBUG << "set sample size to 32768"; + set->setSampleSize(this, 0, 32768); + m_dBmPanLogGain += 6.0; + m_fftMult = 8; + + return; + } + } + else if (m_sampleSize > 4096) { + + if (m_fftMult == 2) { + + GRAPHICS_DEBUG << "set sample size to 4096"; + set->setSampleSize(this, 0, 4096); + m_dBmPanLogGain -= 6.0; + m_fftMult = 1; + + return; + } + else if (m_fftMult == 4) { + + GRAPHICS_DEBUG << "set sample size to 8192"; + set->setSampleSize(this, 0, 8192); + m_dBmPanLogGain -= 6.0; + m_fftMult = 2; + + return; + } + else if (m_fftMult == 8) { + + GRAPHICS_DEBUG << "set sample size to 16384"; + set->setSampleSize(this, 0, 16384); + m_dBmPanLogGain -= 6.0; + m_fftMult = 4; + + return; + } + } + } + + m_panScale = (qreal)(1.0 * m_sampleSize / m_panRectWidth); + m_scaleMultOld = m_scaleMult; + + if (m_panScale < 0.125) { + m_scaleMult = 0.0625; + } + else if (m_panScale < 0.25) { + m_scaleMult = 0.125; + } + else if (m_panScale < 0.5) { + m_scaleMult = 0.25; + } + else if (m_panScale < 1.0) { + m_scaleMult = 0.5; + } + else { + m_scaleMult = 1.0; + } + + m_panSpectrumBinsLength = (GLint)(m_scaleMult * m_panRectWidth); + + /*if (m_sampleSize != m_oldSampleSize) { + + GRAPHICS_DEBUG << "m_panSpectrumBinsLength = " << m_panSpectrumBinsLength; + GRAPHICS_DEBUG << "m_sampleSize = " << m_sampleSize; + GRAPHICS_DEBUG << "deltaSampleSize = " << deltaSampleSize; + GRAPHICS_DEBUG << ""; + + m_oldSampleSize = m_sampleSize; + }*/ + + if (m_scaleMultOld != m_scaleMult) { + + m_waterfallUpdate = true; + } + + m_waterfallPixel.clear(); + m_waterfallPixel.resize(4 * m_panRectWidth); + + m_panadapterBins.clear(); + + if (m_peakHoldBufferResize) { + + //spectrumBufferMutex.lock(); + m_panPeakHoldBins.clear(); + m_panPeakHoldBins.resize(m_panSpectrumBinsLength); + m_panPeakHoldBins.fill(-300.0); + //spectrumBufferMutex.unlock(); + + m_peakHoldBufferResize = false; + } + + for (int i = 0; i < m_panSpectrumBinsLength; i++) { + + //qreal max; + idx = 0; + lIdx = (int)qFloor((qreal)(i * m_panScale / m_scaleMult)); + rIdx = (int)qFloor((qreal)(i * m_panScale / m_scaleMult) + m_panScale / m_scaleMult); + + // max value; later we try mean value also! + localMax = -10000.0F; + for (int j = lIdx; j < rIdx; j++) { + + if (buffer.at(j) > localMax) { + + localMax = buffer.at(j); + idx = j; + } + } + // shift the beginning of the bins by half of the difference between + // full spectrum size and reduced spectrum size due to zooming + idx += deltaSampleSize/2; + + QColor pColor; + if (m_mercuryAttenuator) { + + m_panadapterBins << buffer.at(idx) - m_dBmPanMin - m_dBmPanLogGain - 20.0f; + pColor = getWaterfallColorAtPixel(waterfallBuffer.at(idx) - m_dBmPanLogGain - 20.0f); + } + else { + + m_panadapterBins << buffer.at(idx) - m_dBmPanMin - m_dBmPanLogGain; + pColor = getWaterfallColorAtPixel(waterfallBuffer.at(idx) - m_dBmPanLogGain); + } + + if (m_peakHold && (m_panadapterBins.at(i) > m_panPeakHoldBins.at(i))) { + + m_panPeakHoldBins[i] = m_panadapterBins.at(i); + } + + + TGL_ubyteRGBA color; + color.red = (uchar)(pColor.red()); + color.green = (uchar)(pColor.green()); + color.blue = (uchar)(pColor.blue()); + color.alpha = 255; + + for (int j = 0; j < (int)(1/m_scaleMult); j++) { + + m_waterfallPixel[(int)(i/m_scaleMult) + j] = color; + } + } + m_waterfallDisplayUpdate = true; + update(); +} + +// get waterfall colors - taken from PowerSDR/KISS Konsole +QColor QGLReceiverPanel::getWaterfallColorAtPixel(qreal value) { + + QColor color; + //int r = 0; int g = 0; int b = 0; + int r, g, b; + int lowerThreshold = (int)m_dBmPanMin - m_waterfallOffsetLo; + int upperThreshold = (int)m_dBmPanMax + m_waterfallOffsetHi; + + float offset; + float globalRange; + float localRange; + float percent; + + switch (m_waterfallMode) { + + case (WaterfallColorMode) Simple: + + if (value <= lowerThreshold) + color = m_waterfallLoColor; + else + if (value >= upperThreshold) + color = QColor(255, 255, 255);//m_waterfallHiColor; + else { + + percent = (value - lowerThreshold) / (upperThreshold - lowerThreshold); + if (percent <= 0.5) { // use a gradient between low and mid colors + + percent *= 2; + + r = (int)((1 - percent) * m_waterfallLoColor.red() + percent * m_waterfallMidColor.red()); + g = (int)((1 - percent) * m_waterfallLoColor.green() + percent * m_waterfallMidColor.green()); + b = (int)((1 - percent) * m_waterfallLoColor.blue() + percent * m_waterfallMidColor.blue()); + } + else { // use a gradient between mid and high colors + + percent = (float)(percent - 0.5) * 2; + + r = (int)((1 - percent) * m_waterfallMidColor.red() + percent * 255);//m_waterfallHiColor.red()); + g = (int)((1 - percent) * m_waterfallMidColor.green() + percent * 255);//m_waterfallHiColor.green()); + b = (int)((1 - percent) * m_waterfallMidColor.blue() + percent * 255);//m_waterfallHiColor.blue()); + } + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + color = QColor(r, g, b, m_waterfallAlpha); + } + + break; + + case (WaterfallColorMode) Enhanced: + + if (value <= lowerThreshold) + color = m_waterfallLoColor; + else + if (value >= upperThreshold) + color = m_waterfallHiColor; + else { + + offset = value - lowerThreshold; + globalRange = offset / m_waterfallColorRange; // value from 0.0 to 1.0 where 1.0 is high and 0.0 is low. + + if (globalRange < (float)2/9) { // background to blue + + localRange = globalRange / ((float)2/9); + r = (int)((1.0 - localRange) * m_waterfallLoColor.red()); + g = (int)((1.0 - localRange) * m_waterfallLoColor.green()); + b = (int)(m_waterfallLoColor.blue() + localRange * (255 - m_waterfallLoColor.blue())); + } + else + if (globalRange < (float)3/9) { // blue to blue-green + + localRange = (globalRange - (float)2/9) / ((float)1/9); + r = 0; + g = (int)(localRange * 255); + b = 255; + } + else + if (globalRange < (float)4/9) { // blue-green to green + + localRange = (globalRange - (float)3/9) / ((float)1/9); + r = 0; + g = 255; + b = (int)((1.0 - localRange) * 255); + } + else + if (globalRange < (float)5/9) { // green to red-green + + localRange = (globalRange - (float)4/9) / ((float)1/9); + r = (int)(localRange * 255); + g = 255; + b = 0; + } + else + if (globalRange < (float)7/9) { // red-green to red + + localRange = (globalRange - (float)5/9) / ((float)2/9); + r = 255; + g = (int)((1.0 - localRange) * 255); + b = 0; + } + else + if (globalRange < (float)8/9) { // red to red-blue + + localRange = (globalRange - (float)7/9) / ((float)1/9); + r = 255; + g = 0; + b = (int)(localRange * 255); + } + else { // red-blue to purple end + + localRange = (globalRange - (float)8/9) / ((float)1/9); + r = (int)((0.75 + 0.25 * (1.0 - localRange)) * 255); + g = (int)(localRange * 255 * 0.5); + b = 255; + } + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + if (r < 0) r = 0; + if (g < 0) g = 0; + if (b < 0) b = 0; + color = QColor(r, g, b, m_waterfallAlpha); + } + + break; + } + + return color; +} + +void QGLReceiverPanel::setFramesPerSecond(QObject* sender, int rx, int value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + + m_fps = value; + + m_secWaterfallMin = -(1.0/m_fps) * m_secScaleWaterfallRect.height(); + m_secScaleWaterfallRenew = true; + m_secScaleWaterfallUpdate = true; + update(); +} + +void QGLReceiverPanel::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + Q_UNUSED (hwmode) + Q_UNUSED (state) + + if (m_dataEngineState != state) + m_dataEngineState = state; + + if (state == QSDR::DataEngineDown) + m_fftMult = 1; + // m_panadapterBins.clear(); + + if (state == QSDR::DataEngineDown) + averager->clearBuffer(); + + if (m_serverMode != mode) + m_serverMode = mode; + +// if (m_serverMode == mode) +// return; +// else +// m_serverMode = mode; + + //resizeGL(width(), height()); + m_displayTime.restart(); + + update(); +} + +void QGLReceiverPanel::graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode) +{ + Q_UNUSED (sender) + + if (m_receiver != rx) return; + + + if (m_panMode != panMode) + m_panMode = panMode; + + if (m_waterfallMode != waterfallColorMode) + m_waterfallMode = waterfallColorMode; + + update(); +} + + void QGLReceiverPanel::setSpectrumAveraging(QObject* sender, int rx, bool value) { + + Q_UNUSED (sender) + + if (m_receiver != rx) return; + + spectrumBufferMutex.lock(); + + if (m_spectrumAveraging == value) + return; + else + m_spectrumAveraging = value; + + spectrumBufferMutex.unlock(); + } + +void QGLReceiverPanel::setSpectrumAveragingCnt(int value) { + + spectrumBufferMutex.lock(); + + //m_tmp.clear(); + + while (!specAv_queue.isEmpty()) + specAv_queue.dequeue(); + + m_specAveragingCnt = value; + + if (m_specAveragingCnt > 0) + m_scale = 1.0f / m_specAveragingCnt; + else + m_scale = 1.0f; + + spectrumBufferMutex.unlock(); +} + +void QGLReceiverPanel::setPanGridStatus(bool value, int rx) { + + if (m_receiver != rx) return; + + spectrumBufferMutex.lock(); + + if (m_panGrid == value) + return; + else + m_panGrid = value; + + spectrumBufferMutex.unlock(); + update(); +} + +void QGLReceiverPanel::setPeakHoldStatus(bool value, int rx) { + + if (m_receiver != rx) return; + + spectrumBufferMutex.lock(); + + if (m_peakHold == value) + return; + else + m_peakHold = value; + + m_panPeakHoldBins.clear(); + m_panPeakHoldBins.resize(m_panSpectrumBinsLength); + m_panPeakHoldBins.fill(-500.0); + spectrumBufferMutex.unlock(); +} + +void QGLReceiverPanel::setPanLockedStatus(bool value, int rx) { + + if (m_receiver != rx) return; + + if (m_panLocked == value) + return; + else + m_panLocked = value; + + update(); +} + +void QGLReceiverPanel::setClickVFOStatus(bool value, int rx) { + + if (m_receiver != rx) return; + + if (m_clickVFO == value) + return; + else + m_clickVFO = value; + + update(); +} + +void QGLReceiverPanel::setHairCrossStatus(bool value, int rx) { + + if (m_receiver != rx) return; + + if (m_crossHair == value) + return; + else + m_crossHair = value; + + update(); +} + +void QGLReceiverPanel::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; + m_deltaF = (qreal)(1.0*m_deltaFrequency/m_sampleRate); + + m_freqScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + m_filterChanged = true; + + update(); +} + +void QGLReceiverPanel::setMercuryAttenuator(QObject* sender, HamBand band, int value) { + + Q_UNUSED(sender) + Q_UNUSED(band) + + m_mercuryAttenuator = value; + update(); +} + +void QGLReceiverPanel::setPanadapterColors() { + + m_spectrumColorsChanged = true; + + mutex.lock(); + m_bkgRed = (GLfloat)(set->getPanadapterColors().panBackgroundColor.red() / 256.0); + m_bkgGreen = (GLfloat)(set->getPanadapterColors().panBackgroundColor.green() / 256.0); + m_bkgBlue = (GLfloat)(set->getPanadapterColors().panBackgroundColor.blue() / 256.0); + + m_red = (GLfloat)(set->getPanadapterColors().panLineColor.red() / 256.0); + m_green = (GLfloat)(set->getPanadapterColors().panLineColor.green() / 256.0); + m_blue = (GLfloat)(set->getPanadapterColors().panLineColor.blue() / 256.0); + + m_redF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.red() / 256.0); + m_greenF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.green() / 256.0); + m_blueF = (GLfloat)(set->getPanadapterColors().panLineFilledColor.blue() / 256.0); + + m_redST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.red() / 256.0); + m_greenST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.green() / 256.0); + m_blueST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.blue() / 256.0); + + m_redSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.red() / 256.0); + m_greenSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.green() / 256.0); + m_blueSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.blue() / 256.0); + + m_waterfallMidColor = set->getPanadapterColors().waterfallColor.toRgb() ; + + QColor gridColor = m_gridColor; + m_gridColor = set->getPanadapterColors().gridLineColor; + + if (gridColor != m_gridColor) { + + m_redGrid = (GLfloat)(m_gridColor.red()/256.0); + m_greenGrid = (GLfloat)(m_gridColor.green()/256.0); + m_blueGrid = (GLfloat)(m_gridColor.blue()/256.0); + + m_panGridUpdate = true; + } + mutex.unlock(); + + update(); +} + +void QGLReceiverPanel::setWaterfallOffesetLo(int rx, int value) { + + if (m_receiver != rx) return; + + m_waterfallOffsetLo = value; + update(); +} + +void QGLReceiverPanel::setWaterfallOffesetHi(int rx, int value) { + + if (m_receiver != rx) return; + + m_waterfallOffsetHi = value; + update(); +} + +void QGLReceiverPanel::setdBmScaleMin(int rx, qreal value) { + + if (m_receiver != rx) return; + + m_dBmPanMin = value; + + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + + update(); +} + +void QGLReceiverPanel::setdBmScaleMax(int rx, qreal value) { + + if (m_receiver != rx) return; + + m_dBmPanMax = value; + + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + + update(); +} + +void QGLReceiverPanel::setMouseWheelFreqStep(QObject *sender, int rx, qreal step) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + + m_mouseWheelFreqStep = step; + update(); +} + +void QGLReceiverPanel::setHamBand(QObject *sender, int rx, bool byButton, HamBand band) { + + Q_UNUSED(sender) + + if (m_receiver != rx || !byButton) return; + // we change the dBm-scale only, if the frequency is changed by changing the band by button. + // That is, if we change band by changing the frequency, the dBm scale stays constant. + + //m_panLocked = false; + //m_deltaFrequency = 0; + //m_deltaF = 0; + + m_rxDataList[m_receiver].hamBand = band; + //m_dspModeString = set->getDSPModeString(m_rxDataList[m_receiver].dspMode); + + m_dBmPanMin = m_rxDataList.at(m_receiver).dBmPanScaleMinList.at(band); + m_dBmPanMax = m_rxDataList.at(m_receiver).dBmPanScaleMaxList.at(band); + + m_dBmScalePanadapterUpdate = true; + m_panGridUpdate = true; + m_peakHoldBufferResize = true; + + update(); +} + +void QGLReceiverPanel::setADCStatus(int value) { + + m_adcStatus = value; + update(); + + QTimer::singleShot(50, this, SLOT(updateADCStatus())); +} + +void QGLReceiverPanel::updateADCStatus() { + + if (m_dataEngineState == QSDR::DataEngineUp) + m_adcStatus = 1; + else + m_adcStatus = 0; + + //qDebug() << "m_adcStatus: " << m_adcStatus; + update(); +} + +void QGLReceiverPanel::setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcThresholdOld == thresh && m_agcHangLevelOld == hang) return; + + m_agcThresholdOld = thresh; + m_agcHangLevelOld = hang; + //GRAPHICS_DEBUG << "m_agcThresholdOld = " << m_agcThresholdOld; + //GRAPHICS_DEBUG << "m_agcHangLevelOld = " << m_agcHangLevelOld; +} + +void QGLReceiverPanel::setAGCLineFixedLevel(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + if (m_agcFixedGain == value) return; + + m_agcFixedGain = value; + //GRAPHICS_DEBUG << "m_agcFixedGain = " << m_agcFixedGain; +} + +void QGLReceiverPanel::setAGCMode(QObject *sender, int rx, AGCMode mode, bool hangEnabled) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + + if (m_agcHangEnabled == hangEnabled && m_agcMode == mode) return; + + m_agcMode = mode; + m_agcModeString = set->getAGCModeString(m_receiver); + m_agcHangEnabled = hangEnabled; + GRAPHICS_DEBUG << "m_agcHangEnabled = " << m_agcHangEnabled; + + update(); +} + +void QGLReceiverPanel::setAGCLinesStatus(QObject* sender, bool value, int rx) { + + Q_UNUSED (sender) + + if (m_receiver != rx) return; + + m_showAGCLines = value; + + update(); +} + +void QGLReceiverPanel::setDSPMode(QObject* sender, int rx, DSPMode mode) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + + m_dspMode = mode; + m_dspModeString = set->getDSPModeString(m_dspMode); + + update(); +} + +void QGLReceiverPanel::showRadioPopup(bool value) { + + Q_UNUSED (value) + + radioPopup->showPopupWidget(this, QCursor::pos()); +} + +//void QGLReceiverPanel::setAGCHangEnabled(QObject *sender, int rx, bool hangEnabled) { +// +// Q_UNUSED(sender) +// +// if (m_receiver != rx) return; +// +// if (m_agcHangEnabled == hangEnabled) return; +// m_agcHangEnabled = hangEnabled; +// GRAPHICS_DEBUG << "m_agcHangEnabled = " << m_agcHangEnabled; +// +// update(); +//} diff --git a/Source/src/GL/cusdr_oglReceiverPanel.h b/Source/src/GL/cusdr_oglReceiverPanel.h new file mode 100644 index 0000000..f234ffa --- /dev/null +++ b/Source/src/GL/cusdr_oglReceiverPanel.h @@ -0,0 +1,432 @@ +/** +* @file cusdr_oglReceiverPanel.h +* @brief receiver panel header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-03-14 +*/ + +/* + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_QGL_RECEIVERPANEL_H +#define _CUSDR_QGL_RECEIVERPANEL_H + +#include "cusdr_oglUtils.h" +#include "cusdr_oglInfo.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" +#include "Util/cusdr_buttons.h" +#include "cusdr_oglText.h" +#include "QtDSP/qtdsp_dualModeAverager.h" +#include "cusdr_radioPopupWidget.h" + +#include +#include + + +#ifdef LOG_GRAPHICS +# define GRAPHICS_DEBUG qDebug().nospace() << "ReceiverPanel::\t" +#else +# define GRAPHICS_DEBUG nullDebug() +#endif + + +class QGLReceiverPanel : public QGLWidget { + + Q_OBJECT + +public: + QGLReceiverPanel(QWidget *parent = 0, int rx = 0); + ~QGLReceiverPanel(); + +public slots: + QSize minimumSizeHint() const; + QSize sizeHint() const; + + //void setSpectrumBuffer(const float* buffer, int size); + //void setSpectrumBuffer(const qVectorFloat& buffer); + void setSpectrumBuffer(int rx, const qVectorFloat& buffer); + void setCtrFrequency(QObject* sender, int mode, int rx, long freq); + void setVFOFrequency(QObject* sender, int mode, int rx, long freq); + +protected: + void initializeGL(); + void resizeGL(int iWidth, int iHeight); + void paintGL(); + + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseDoubleClickEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent * event ); + void keyPressEvent(QKeyEvent* event); + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + CFonts* fonts; + TFonts m_fonts; + + DualModeAverager* averager; + RadioPopupWidget* radioPopup; + AGCMode m_agcMode; + DSPMode m_dspMode; + PanGraphicsMode m_panMode; + WaterfallColorMode m_waterfallMode; + + QTime m_displayTime; + QTime m_resizeTime; + QTime freqChangeTimer; + QTime peakHoldTimer; + + QString m_bandText; + QString m_agcModeString; + QString m_dspModeString; + QString m_filterWidthString; + + TScale m_frequencyScale; + TScale m_dBmScale; + TScale m_secScale; + + QList m_rxDataList; + + QVector m_panadapterBins; + QVector m_panPeakHoldBins; + QVarLengthArray m_waterfallPixel; + + QQueue > specAv_queue; + + QGLFramebufferObject* m_frequencyScaleFBO; + QGLFramebufferObject* m_dBmScaleFBO; + QGLFramebufferObject* m_panadapterGridFBO; + QGLFramebufferObject* m_textureFBO; + QGLFramebufferObject* m_waterfallLineFBO; + QGLFramebufferObject* m_waterfallFBO; + QGLFramebufferObject* m_secScaleWaterfallFBO; + + QRect m_panRect; + QRect m_dBmScalePanRect; + QRect m_freqScalePanRect; + QRect m_waterfallRect; + QRect m_secScaleWaterfallRect; + QRect m_filterRect; + QRect m_agcButtonRect; + QRect m_lockedPanButtonRect; + QRect m_vfoToMidButtonRect; + QRect m_midToVfoButtonRect; + QRect m_clickVFOButtonRect; + + OGLText* m_oglTextTiny; + OGLText* m_oglTextSmall; + OGLText* m_oglTextNormal; + OGLText* m_oglTextFreq1; + OGLText* m_oglTextFreq2; + OGLText* m_oglTextBig1; + OGLText* m_oglTextBig2; + OGLText* m_oglTextHuge; + + QPoint m_mousePos; + QPoint m_oldMousePos; + QPoint m_mouseLastPos; + QPoint m_mouseDownPos; + QPoint m_rulerMouseDownPos; + QPoint m_cameraAngle; + + QColor m_waterfallLoColor; + QColor m_waterfallHiColor; + QColor m_waterfallMidColor; + QColor m_gridColor; + QColor m_darkColor; + + QMutex mutex; + QMutex spectrumBufferMutex; + + enum Region { + + freqScalePanadapterRegion, + panadapterRegion, + dBmScalePanadapterRegion, + waterfallRegion, + filterRegion, + filterRegionLow, + filterRegionHigh, + agcButtonRegion, + agcThresholdLine, + agcHangLine, + agcFixedGainLine, + //lockedPanButtonRegion, + //vfoToMidButtonRegion, + //midToVfoButtonRegion, + //clickVfoButtonRegion, + elsewhere, + out + }; + + GLint m_panRectWidth; + GLint m_panSpectrumBinsLength; + + GLint m_filterLeft; + GLint m_filterRight; + GLint m_filterTop; + GLint m_filterBottom; + + GLfloat m_agcThresholdPixel; + GLfloat m_agcHangLevelPixel; + GLfloat m_agcFixedGainLevelPixel; + + GLfloat m_bkgRed; + GLfloat m_bkgGreen; + GLfloat m_bkgBlue; + + GLfloat m_red; + GLfloat m_green; + GLfloat m_blue; + + GLfloat m_redF; + GLfloat m_greenF; + GLfloat m_blueF; + + + GLfloat m_redST; + GLfloat m_greenST; + GLfloat m_blueST; + + GLfloat m_redSB; + GLfloat m_greenSB; + GLfloat m_blueSB; + + GLfloat m_redGrid; + GLfloat m_greenGrid; + GLfloat m_blueGrid; + + unsigned int timer; + + int m_bigHeight; + int m_bigWidth; + int m_receiver; + //int m_frequencyRxOnRx; + int m_spectrumSize; + int m_sampleSize; + int m_oldSampleSize; + int m_oldWidth; + int m_oldPanRectHeight; + int m_cnt; + int m_specAveragingCnt; + int m_currentReceiver; + int m_waterfallAlpha; + int m_waterfallOffsetLo; + int m_waterfallOffsetHi; + int m_waterfallColorRange; + int m_freqRulerDisplayWidth; + int m_oldWaterfallWidth; + int m_displayTop; + int m_dBmPanLogGain; + int m_panSpectrumMinimumHeight; + int m_mouseRegion; + int m_oldMouseRegion; + int m_oldMousePosX; + int m_snapMouse; + int m_panDisplayMode; + int m_sampleRate; + int m_downRate; + int m_mercuryAttenuator; + int m_haircrossOffsetRight; + int m_haircrossOffsetLeft; + int m_haircrossMaxRight; + int m_haircrossMinTop; + int m_displayCenterlineHeight; + int m_waterfallLineCnt; + int m_adcStatus; + int m_fps; + int m_filterWidth; + int m_fftMult; + + long m_centerFrequency; + long m_vfoFrequency; + long m_deltaFrequency; + long m_otherFrequency; + //long m_oldFreq; + + bool m_smallSize; + bool m_spectrumVertexColorUpdate; + bool m_dBmScalePanadapterRenew; + bool m_dBmScalePanadapterUpdate; + bool m_freqScalePanadapterRenew; + bool m_freqScalePanadapterUpdate; + bool m_secScaleWaterfallUpdate; + bool m_secScaleWaterfallRenew; + bool m_panGridRenew; + bool m_panGridUpdate; + bool m_waterfallUpdate; + bool m_waterfallDisplayUpdate; + bool m_distRulerUpdate; + bool m_newWidebandPanFreqRuler; + bool m_spectrumColorsChanged; + bool m_spectrumAveraging; + //bool m_spectrumAveragingOld; + bool m_crossHair; + bool m_crossHairCursor; + bool m_panGrid; + bool m_peakHold; + bool m_filterChanged; + bool m_showFilterLeftBoundary; + bool m_showFilterRightBoundary; + bool m_highlightFilter; + bool m_peakHoldBufferResize; + bool m_showAGCLines; + bool m_agcHangEnabled; + bool m_dragMouse; + bool m_panLocked; + bool m_clickVFO; + + qreal m_yScaleFactor; + qreal m_panFrequencyScale; + qreal m_freqScaleZoomFactor; + qreal m_dBmPanMin; + qreal m_dBmPanMax; + qreal m_dBmPanDelta; + qreal m_mouseWheelFreqStep; + qreal m_secWaterfallMin; + qreal m_secWaterfallMax; + qreal m_panScale; + qreal m_scaleMult; + qreal m_scaleMultOld; + qreal m_filterLowerFrequency; + qreal m_filterUpperFrequency; + qreal m_mouseDownFilterFrequencyLo; + qreal m_mouseDownFilterFrequencyHi; + qreal m_filterLo; + qreal m_filterHi; + qreal m_deltaF; + qreal m_agcThresholdNew; + qreal m_agcThresholdOld; + qreal m_mouseDownAGCThreshold; + qreal m_agcHangLevelNew; + qreal m_agcHangLevelOld; + qreal m_mouseDownAGCHangLevel; + qreal m_agcFixedGain; + qreal m_mouseDownFixedGainLevel; + + float m_scale; + float m_cameraDistance; + float m_freqRulerPosition; + + QVector m_tmp; + + + //****************************************************************** + void setupConnections(); + + QColor getWaterfallColorAtPixel(qreal value); + + void saveGLState(); + void restoreGLState(); + + // drawing + void paintReceiverDisplay(); + void paint3DPanadapterMode(); + + void drawPanadapter(); + void drawPanVerticalScale(); + void drawPanHorizontalScale(); + void drawPanadapterGrid(); + void drawPanFilter(); + void drawCenterLine(); + void drawWaterfall(); + void drawWaterfallVerticalScale(); + void drawCrossHair(); + void drawReceiverInfo(); + void drawAGCControl(); + void drawVFOControl(); + + void renderPanVerticalScale(); + void renderPanHorizontalScale(); + void renderPanadapterGrid(); + void renderWaterfallVerticalScale(); + + //void computeDisplayBins(const QVector& panBuffer, const float* waterfallBuffer); + //void computeDisplayBins(QVector &buffer); + void computeDisplayBins(QVector& panBuffer, QVector& waterfallBuffer); + void showText(float x, float y, float z, const QString &text, bool smallText); + void showRadioPopup(bool value); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setSpectrumSize(QObject *sender, int value); + void setCurrentReceiver(QObject *sender, int value); + void setHamBand(QObject *sender, int rx, bool byButton, HamBand band); + void setFilterFrequencies(QObject *sender, int rx, qreal lo, qreal hi); + void setMercuryAttenuator(QObject* sender, HamBand band, int value); + void setupDisplayRegions(QSize size); + + void setSpectrumAveraging(QObject* sender, int rx, bool value); + void setSpectrumAveragingCnt(int value); + void setVfoToMidFrequency(); + void setMidToVfoFrequency(); + void setPanGridStatus(bool value, int rx); + void setPeakHoldStatus(bool value, int rx); + void setPanLockedStatus(bool value, int rx); + void setClickVFOStatus(bool value, int rx); + void setHairCrossStatus(bool value, int rx); + void setPanadapterColors(); + void getRegion(QPoint p); + void freqRulerPositionChanged(QObject *sender, int rx, float pos); + void sampleRateChanged(QObject *sender, int value); + void setWaterfallOffesetLo(int rx, int value); + void setWaterfallOffesetHi(int rx, int value); + void setdBmScaleMin(int rx, qreal value); + void setdBmScaleMax(int rx, qreal value); + void setMouseWheelFreqStep(QObject *, int, qreal); + + void setADCStatus(int value); + void updateADCStatus(); + void setFramesPerSecond(QObject* sender, int rx, int value); + void setDSPMode(QObject* sender, int rx, DSPMode mode); + void setAGCMode(QObject* sender, int rx, AGCMode mode, bool hangEnabled); + void setAGCLineLevels(QObject* sender, int rx, qreal thresh, qreal hang); + void setAGCLineFixedLevel(QObject* sender, int rx, qreal value); + void setAGCLinesStatus(QObject* sender, bool value, int rx); + //void setAGCHangEnabled(QObject *sender, int rx, bool hangEnabled); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString msg); + void coordChanged(int x,int y); +}; + +#endif // _CUSDR_QGL_RECEIVERPANEL_H diff --git a/Source/src/GL/cusdr_oglText.cpp b/Source/src/GL/cusdr_oglText.cpp new file mode 100644 index 0000000..2466b38 --- /dev/null +++ b/Source/src/GL/cusdr_oglText.cpp @@ -0,0 +1,282 @@ +/** +* @file cusdr_oglText.cpp +* @brief OpenGL Text generation class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-18 +*/ + +/* + * adapted from the MIFit project: http://code.google.com/p/mifit + * + * Copyright 2012 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "cusdr_oglText.h" + +const int TEXTURE_SIZE = 256; + +struct CharData { + + GLuint textureId; + uint width; + uint height; + GLfloat s[2]; + GLfloat t[2]; +}; + +struct OGLTextPrivate { + + OGLTextPrivate(const QFont &f); + ~OGLTextPrivate(); + + void allocateTexture(); + CharData &createCharacter(QChar c); + + QFont font; + QFontMetrics fontMetrics; + + QHash characters; + QList textures; + + GLint xOffset; + GLint yOffset; +}; + +OGLTextPrivate::OGLTextPrivate(const QFont &f) + : font(f), fontMetrics(f), xOffset(0), yOffset(0) {} + +OGLTextPrivate::~OGLTextPrivate() { + + foreach (GLuint texture, textures) + glDeleteTextures(1, &texture); +} + +void OGLTextPrivate::allocateTexture() { + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + // the texture ends at the edges (clamp) + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // select modulate to mix texture with color for shading + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + QImage image(TEXTURE_SIZE, TEXTURE_SIZE, QImage::Format_ARGB32); + image.fill(Qt::transparent); + image = QGLWidget::convertToGLFormat(image); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_SIZE, TEXTURE_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, TEXTURE_SIZE, TEXTURE_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); + + textures += texture; +} + +CharData &OGLTextPrivate::createCharacter(QChar c) { + + ushort unicodeC = c.unicode(); + if (characters.contains(unicodeC)) + return characters[unicodeC]; + + if (textures.empty()) + allocateTexture(); + + GLuint texture = textures.last(); + + GLsizei width = fontMetrics.width(c); + GLsizei height = fontMetrics.height(); + + QPixmap pixmap(width, height); + pixmap.fill(Qt::transparent); + + /*QImage image(width, height, QImage::Format_ARGB32_Premultiplied); + if (!image.isNull()) { + + image.fill(Qt::transparent); + + QPainter p(&image); + if (&font) p.setFont(this->font); + }*/ + + QPainter painter; + //const QPainter::CompositionMode comp_mode = painter.compositionMode(); + //painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.begin(&pixmap); + //painter.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing); + painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing, false); + painter.setFont(font); + painter.setPen(Qt::white); + + //painter.drawText(0, fontMetrics.ascent(), c); + painter.drawText(pixmap.rect(), Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignCenter, c); + painter.end(); + + + QImage image = QGLWidget::convertToGLFormat(pixmap.toImage()); + glBindTexture(GL_TEXTURE_2D, texture); + glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, width, height, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); + + CharData& character = characters[unicodeC]; + character.textureId = texture; + character.width = width; + character.height = height; + character.s[0] = static_cast(xOffset) / TEXTURE_SIZE; + character.t[0] = static_cast(yOffset) / TEXTURE_SIZE; + character.s[1] = static_cast(xOffset + width) / TEXTURE_SIZE; + character.t[1] = static_cast(yOffset + height) / TEXTURE_SIZE; + + xOffset += width; + if (xOffset + fontMetrics.maxWidth() >= TEXTURE_SIZE) { + + xOffset = 1; + yOffset += height; + } + if (yOffset + fontMetrics.height() >= TEXTURE_SIZE) { + + allocateTexture(); + yOffset = 1; + } + return character; +} + + + +OGLText::OGLText(const QFont &f) : d(new OGLTextPrivate(f)) {} + + +OGLText::~OGLText() { + + delete d; +} + +QFont OGLText::font() const +{ + return d->font; +} + +QFontMetrics OGLText::fontMetrics() const { + + return d->fontMetrics; +} + +//! Renders text at given x, y. +void OGLText::renderText(float x, float y, const QString &text) { + + const bool GL_TEXTURE_2D_wasEnabled = glIsEnabled(GL_TEXTURE_2D); + GLint prev_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &prev_texture); + GLint prev_shade_model; glGetIntegerv(GL_SHADE_MODEL, &prev_shade_model); + + glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT | GL_TEXTURE_BIT); + glPushMatrix(); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if (prev_shade_model != GL_FLAT) glShadeModel(GL_FLAT); + if (!GL_TEXTURE_2D_wasEnabled) glEnable(GL_TEXTURE_2D); + + GLuint texture = 0; + glTranslatef(x, y, 0); + + for (int i = 0; i < text.length(); ++i) { + + //if (text.length() > 80) + // qDebug() << "********************* OK"; + + CharData &c = d->createCharacter(text.at(i)); + if (texture != c.textureId) { + + texture = c.textureId; + glBindTexture(GL_TEXTURE_2D, texture); + } + + glBegin(GL_QUADS); + glTexCoord2f(c.s[0], c.t[0]); glVertex2f(0, c.height); + glTexCoord2f(c.s[1], c.t[0]); glVertex2f(c.width, c.height); + glTexCoord2f(c.s[1], c.t[1]); glVertex2f(c.width, 0); + glTexCoord2f(c.s[0], c.t[1]); glVertex2f(0, 0); + glEnd(); + + glTranslatef(c.width, 0, 0); + } + + glShadeModel(prev_shade_model); + glBindTexture(GL_TEXTURE_2D, prev_texture); + if (!GL_TEXTURE_2D_wasEnabled) glDisable(GL_TEXTURE_2D); + + glPopMatrix(); + glPopAttrib(); +} + +void OGLText::renderText(float x, float y, float z, const QString &text) { + + const bool GL_TEXTURE_2D_wasEnabled = glIsEnabled(GL_TEXTURE_2D); + GLint prev_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &prev_texture); + GLint prev_shade_model; glGetIntegerv(GL_SHADE_MODEL, &prev_shade_model); + + glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT | GL_TEXTURE_BIT); + glPushMatrix(); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if (prev_shade_model != GL_FLAT) glShadeModel(GL_FLAT); + if (!GL_TEXTURE_2D_wasEnabled) glEnable(GL_TEXTURE_2D); + + GLuint texture = 0; + glTranslatef(x, y, 0); + for (int i = 0; i < text.length(); ++i) { + + CharData &c = d->createCharacter(text.at(i)); + if (texture != c.textureId) { + + texture = c.textureId; + glBindTexture(GL_TEXTURE_2D, texture); + } + + /*glBegin(GL_QUADS); + glTexCoord2f(c.s[0], c.t[0]); glVertex2f(0, c.height); + glTexCoord2f(c.s[1], c.t[0]); glVertex2f(c.width, c.height); + glTexCoord2f(c.s[1], c.t[1]); glVertex2f(c.width, 0); + glTexCoord2f(c.s[0], c.t[1]); glVertex2f(0, 0); + glEnd();*/ + glBegin(GL_QUADS); + glTexCoord2f(c.s[0], c.t[0]); glVertex3f(0, c.height, z); + glTexCoord2f(c.s[1], c.t[0]); glVertex3f(c.width, c.height, z); + glTexCoord2f(c.s[1], c.t[1]); glVertex3f(c.width, 0, z); + glTexCoord2f(c.s[0], c.t[1]); glVertex3f(0, 0, z); + glEnd(); + + glTranslatef(c.width, 0, 0); + } + + glShadeModel(prev_shade_model); + glBindTexture(GL_TEXTURE_2D, prev_texture); + if (!GL_TEXTURE_2D_wasEnabled) glDisable(GL_TEXTURE_2D); + + glPopMatrix(); + glPopAttrib(); +} diff --git a/Source/src/GL/cusdr_oglText.h b/Source/src/GL/cusdr_oglText.h new file mode 100644 index 0000000..3101c70 --- /dev/null +++ b/Source/src/GL/cusdr_oglText.h @@ -0,0 +1,63 @@ +/** +* @file cusdr_oglText.h +* @brief OpenGL Text generation header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-18 +*/ + +/* + * adapted from the MIFit project: http://code.google.com/p/mifit + * + * Copyright 2012 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_OGL_TEXT_H +#define _CUSDR_OGL_TEXT_H + +#include "cusdr_oglUtils.h" +#include "cusdr_oglInfo.h" +#include "cusdr_settings.h" + +#include + +class QChar; +class QFont; +class QFontMetrics; +class QString; + +class OGLTextPrivate; + +class OGLText { + +public: + OGLText(const QFont &f); + virtual ~OGLText(); + + QFont font() const; + QFontMetrics fontMetrics() const; + + void renderText(float x, float y, const QString &text); + void renderText(float x, float y, float z, const QString &text); + +private: + Q_DISABLE_COPY(OGLText) + + OGLTextPrivate *const d; +}; + +#endif // _CUSDR_OGL_TEXT_H diff --git a/Source/src/GL/cusdr_oglUtils.h b/Source/src/GL/cusdr_oglUtils.h new file mode 100644 index 0000000..7fb7044 --- /dev/null +++ b/Source/src/GL/cusdr_oglUtils.h @@ -0,0 +1,899 @@ +/** +* @file cusdr_oglUtils.h +* @brief Utils header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-11-17 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_OPENGLTYPES_H +#define _CUSDR_OPENGLTYPES_H + +#include +//#include +//#include +//#include +//#include +#include +#include + +#define GL_CLAMP_TO_EDGE 0x812F + + +typedef struct _gl2i { + + GLint x; + GLint y; + +} TGL2int; + +typedef struct _gl3i { + + GLint x; + GLint y; + GLint z; + +} TGL3int; + +typedef struct _gl2f { + + GLfloat x; + GLfloat y; + +} TGL2float; + +typedef struct _gl3f { + + GLfloat x; + GLfloat y; + GLfloat z; + +} TGL3float; + +typedef struct _ucharRGBA { + + uchar red; + uchar green; + uchar blue; + uchar alpha; + +} ucharRGBA; + +typedef struct _glubyteRGBA { + + GLubyte red; + GLubyte green; + GLubyte blue; + GLubyte alpha; + +} TGL_ubyteRGBA; + +typedef struct _scaleSteps { + + double smallStep; + double bigStep; + +} TScaleSteps; + +typedef struct _scale { + + QList mainPointPositions; + QList subPointPositions; + + QList mainPoints; + QList subPoints; + +} TScale; + + +struct s_glRGBA_float { + + GLfloat r, g, b, a; + + s_glRGBA_float() : r(0), g(0), b(0), a(0) {} + + s_glRGBA_float(GLfloat red, GLfloat grn, GLfloat blu, GLfloat alpha) : r(red), g(grn), b(blu), a(alpha) {} +}; + +struct s_glRGBA_uByte { + + GLubyte r, g, b, a; + + s_glRGBA_uByte() : r(0), g(0), b(0), a(0) {} + + s_glRGBA_uByte(GLubyte red, GLubyte grn, GLubyte blu, GLubyte alpha) : r(red), g(grn), b(blu), a(alpha) {} +}; + +typedef struct _widebandDisplayData { + + QSize size; + + QRect widebandPanRect; + QRect freqScaleWidebandPanRect; + QRect dBmScaleWidebandPanRect; + + QVector widebandPanBins; + + qreal dBmPanMin; + qreal dBmPanMax; + qreal scaleMult; + qreal freqScaleZoomFactor; + + long frequency; + + bool freqScaleWidebandUpdate; + bool freqScaleWidebandRenew; + bool dBmScaleWidebandUpdate; + bool dBmScaleWidebandRenew; + bool widebandPanGridUpdate; + bool widebandPanGridRenew; + +} TWideBandDisplayData; + +//************************************************************** +inline QString frequencyString(double frequency, bool addPlusSign = false) { + + QString str(""); + + double f = qAbs(frequency); + + if (f >= 1e9) { + + str = QString::number(f / 1e9, 'f', 6); + str.insert(str.size() - 3, '.'); + str += " GHz"; + } + else + if (f >= 1e6) { + + str = QString::number(f / 1e6, 'f', 6 + 1); + str.insert(str.size() - 4, '.'); + str.insert(str.size() - 1, '.'); + str += " MHz"; + } + else + if (f >= 1e3) { + + str = QString::number(f / 1e3, 'f', 3 + 1); + str.insert(str.size() - 1, '.'); + str += " kHz"; + } + else { + + str = QString::number(f, 'f', 1) + "Hz"; + } + + if (frequency < 0) str = '-' + str; + else + if (frequency > 0 && addPlusSign) str = '+' + str; + + return str; +} + +inline int nextPowerOfTwo(int value) { + + value--; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + ++value; + return value; +} + +inline TScaleSteps getXScale(double size) { + + TScaleSteps s; + + qint64 base = 1; + int mult = 1; + while (size > 10.0f) { + size /= 10; + base *= 10; + } + + if (size < 2) mult = 2; + else if (size < 5) mult = 5; + else mult = 10; + + s.bigStep = base * mult; + switch (mult) { + + case 1: s.smallStep = s.bigStep / 5; break; + case 2: s.smallStep = s.bigStep / 2; break; + case 5: s.smallStep = s.bigStep / 5; break; + case 10: s.smallStep = s.bigStep / 5; break; + } + return s; +} + +inline TScaleSteps getXScale(double size, float scale) { + + TScaleSteps s; + + qint64 base = 1; + int mult = 1; + while (size > scale) { + size /= scale; + base *= scale; + } + + if (size < 2) mult = 2; + else if (size < 5) mult = 5; + else mult = 10; + + s.bigStep = base * mult; + switch (mult) { + + case 1: s.smallStep = s.bigStep / 5; break; + case 2: s.smallStep = s.bigStep / 2; break; + case 5: s.smallStep = s.bigStep / 5; break; + case 10: s.smallStep = s.bigStep / 5; break; + } + return s; +} + +inline TScaleSteps getYScale(double size, float scale) { + + TScaleSteps s; + + qint64 base = 1; + int mult = 1; + while (size > scale) { + size /= scale; + base *= scale; + } + + if (size < 2) mult = 2; + else if (size < 5) mult = 5; + else mult = 10; + + s.bigStep = base * mult; + switch (mult) { + + case 1: s.smallStep = s.bigStep / 5; break; + case 2: s.smallStep = s.bigStep / 2; break; + case 5: s.smallStep = s.bigStep / 5; break; + case 10: s.smallStep = s.bigStep / 2; break; + } + return s; +} + +inline TScale getXRuler(const QRect &rect, int fontMaxWidth, qreal unit, qreal lo, qreal hi) { + + TScale ruler; + + TScaleSteps scale = getXScale(fontMaxWidth / unit); + //qreal value = floor(lo / scale.bigStep) * scale.bigStep; + qreal value = qFloor(lo / scale.bigStep) * scale.bigStep; + + while (value < hi) { + + int x = qRound(unit * (value - lo)); + + if (x >= rect.width()) break; + if (x > 0) { + + ruler.mainPoints << value; + ruler.mainPointPositions << x; + } + + if (scale.smallStep > 0) { + + qreal smallValue = value + scale.smallStep; + qreal smallUpperValue = value + scale.bigStep; + + while (smallValue < smallUpperValue && smallValue < hi) { + + int x = qRound(unit * (smallValue - lo)); + if (x >= rect.width()) break; + if (x > 0) ruler.subPointPositions << x; + + smallValue += scale.smallStep; + } + } + value += scale.bigStep; + } + + return ruler; +} + +inline TScale getXRuler(const QRect &rect, int fontMaxWidth, qreal unit, qreal lo, qreal hi, float s) { + + TScale ruler; + + TScaleSteps scale = getXScale(fontMaxWidth / unit, s); + //qreal value = floor(lo / scale.bigStep) * scale.bigStep; + qreal value = qFloor(lo / scale.bigStep) * scale.bigStep; + + while (value < hi) { + + int x = qRound(unit * (value - lo)); + + if (x >= rect.width()) break; + if (x > 0) { + + ruler.mainPoints << value; + ruler.mainPointPositions << x; + } + + if (scale.smallStep > 0) { + + qreal smallValue = value + scale.smallStep; + qreal smallUpperValue = value + scale.bigStep; + + while (smallValue < smallUpperValue && smallValue < hi) { + + int x = qRound(unit * (smallValue - lo)); + if (x >= rect.width()) break; + if (x > 0) ruler.subPointPositions << x; + + smallValue += scale.smallStep; + } + } + value += scale.bigStep; + } + + return ruler; +} + +inline TScale getYRuler(const QRect &rect, int fontHeight, qreal unit, qreal lo, qreal hi) { + + TScale ruler; + + TScaleSteps scale = getYScale(fontHeight / unit, 10.0f); + //qreal value = ceil(hi / scale.bigStep) * scale.bigStep; + qreal value = qCeil(hi / scale.bigStep) * scale.bigStep; + + while (value >= lo) { + + int y = qRound(unit * -(value - hi)); + if (y > 0 && y < rect.height()) { + + if (ruler.mainPointPositions.length() < 100) { + + ruler.mainPoints << value; + ruler.mainPointPositions << rect.top() + y; + } + } + + if (scale.smallStep > 0) { + + qreal smallValue = value - scale.smallStep; + qreal smallEndValue = value - scale.bigStep; + while (smallValue > smallEndValue && smallValue > lo) { + + int y = qRound(unit * -(smallValue - hi)); + if (y > 0 && y < rect.height()) { + + if (ruler.subPointPositions.length() < 200) + ruler.subPointPositions << rect.top() + y; + } + smallValue -= scale.smallStep; + } + } + value -= scale.bigStep; + } + + return ruler; +} + +inline TScale getYRuler2(const QRect &rect, int fontHeight, qreal unit, qreal lo, qreal hi) { + + TScale ruler; + + TScaleSteps scale = getYScale(fontHeight / unit, 10.0f); + qreal value = qCeil(hi / scale.bigStep) * scale.bigStep; + + while (value >= lo) { + + int y = qRound(unit * -(value - hi)); + if (y > 0 && y < rect.height()) { + + if (ruler.mainPointPositions.length() < 100) { + + ruler.mainPoints << value; + //ruler.mainPointPositions << rect.top() + y; + ruler.mainPointPositions << y; + } + } + + if (scale.smallStep > 0) { + + qreal smallValue = value - scale.smallStep; + qreal smallEndValue = value - scale.bigStep; + while (smallValue > smallEndValue && smallValue > lo) { + + int y = qRound(unit * -(smallValue - hi)); + if (y > 0 && y < rect.height()) { + + if (ruler.subPointPositions.length() < 200) + ruler.subPointPositions << y; + //ruler.subPointPositions << rect.top() + y; + } + smallValue -= scale.smallStep; + } + } + value -= scale.bigStep; + } + + return ruler; +} + +inline TScale getYRuler3(const QRect &rect, int fontHeight, qreal unit, qreal lo, qreal hi, float v) { + + TScale ruler; + + TScaleSteps scale = getYScale(fontHeight / unit, v); + qreal value = qCeil(hi / scale.bigStep) * scale.bigStep; + + while (value >= lo) { + + int y = qRound(unit * -(value - hi)); + if (y > 0 && y < rect.height()) { + + if (ruler.mainPointPositions.length() < 100) { + + ruler.mainPoints << value; + //ruler.mainPointPositions << rect.top() + y; + ruler.mainPointPositions << y; + } + } + + if (scale.smallStep > 0) { + + qreal smallValue = value - scale.smallStep; + qreal smallEndValue = value - scale.bigStep; + while (smallValue > smallEndValue && smallValue > lo) { + + int y = qRound(unit * -(smallValue - hi)); + if (y > 0 && y < rect.height()) { + + if (ruler.subPointPositions.length() < 200) + ruler.subPointPositions << y; + //ruler.subPointPositions << rect.top() + y; + } + smallValue -= scale.smallStep; + } + } + value -= scale.bigStep; + } + + return ruler; +} + +inline GLfloat dBmToGLPixel(const QRect &rect, qreal dBmMax, qreal dBmMin, qreal value) { + + GLfloat y; + + qreal yScale = rect.height() / qAbs(dBmMax - dBmMin); + y = (GLfloat)(yScale * (dBmMax - value) + (qreal)rect.top()); + + return y; +} + +inline qreal glPixelTodBm(const QRect &rect, qreal dBmMax, qreal dBmMin, int position) { + + qreal dBm; + + float yScale = rect.height() / qAbs(dBmMax - dBmMin); + dBm = dBmMax - (qreal)(position - rect.top())/yScale; + //qreal dBm = m_dBmPanMax - ((m_dBmPanMax - m_dBmPanMin) * ((qreal)(position - rect.top()) / rect.height())); + + return dBm; +} + +//************************************************************** + +inline void setProjectionOrthographic(int width, int height) { + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + //glOrtho(-1.0, +1.0, -1.0, +1.0, -90.0, +90.0); + glOrtho(0.0, width, height, 0, -5.0, 5.0); + //glOrtho(0.0, width, height, 0, -1.0, 1.0); + //glOrtho(0.0, width, 0, height, -1.0, 1.0); + + glMatrixMode(GL_MODELVIEW); +} + +inline void setProjectionPerspective(int width, int height) { + + Q_UNUSED(width) + Q_UNUSED(height) + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + //glFrustum(-aspect, +aspect, -1.0, +1.0, 4.0, 15.0); + //gluPerspective(60.0f, (float)(width)/height, 1.0f, 10.0f); + + glMatrixMode(GL_MODELVIEW); +} + +inline GLuint emptyTexture1D(int width) { + + GLuint txtnumber; + unsigned int* data; + + data = (unsigned int*)new GLuint[(width * 4 * sizeof(unsigned int))]; + +#if defined(Q_OS_WIN32) + ZeroMemory(data,(width * 4 * sizeof(unsigned int))); +#elif defined(Q_OS_LINUX) + memset(data, 0, width * 4 * sizeof(unsigned int)); +#endif + + glGenTextures(1, &txtnumber); + glBindTexture(GL_TEXTURE_1D, txtnumber); + glTexImage1D(GL_TEXTURE_1D, 0, 4, width, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + delete[] data; + return txtnumber; +} + +inline GLuint emptyTexture2D(int width, int height) { + + GLuint txtnumber; + unsigned int* data; + + data = (unsigned int*)new GLuint[((width * height)* 4 * sizeof(unsigned int))]; + +#if defined(Q_OS_WIN32) + ZeroMemory(data,((width * height)* 4 * sizeof(unsigned int))); +#elif defined(Q_OS_LINUX) + memset(data, 0, (width * height)* 4 * sizeof(unsigned int)); +#endif + + glGenTextures(1, &txtnumber); + glBindTexture(GL_TEXTURE_2D, txtnumber); + glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + delete [] data; + return txtnumber; +} + +inline void drawQuad2Di(int x, int y, int width, int height) { + + glEnable(GL_TEXTURE_2D); + + glBegin(GL_QUADS); + glTexCoord2f(0, 1); glVertex2i(x - width/2, y - height/2); + glTexCoord2f(1, 1); glVertex2i(x + width/2, y - height/2); + glTexCoord2f(1, 0); glVertex2i(x + width/2, y + height/2); + glTexCoord2f(0, 0); glVertex2i(x - width/2, y + height/2); + glEnd(); + + glDisable(GL_TEXTURE_2D); +} + +inline void drawQuad3Df(float x, float y, float z, float width, float height) { + + glEnable(GL_TEXTURE_2D); + + glBegin(GL_QUADS); + glTexCoord2f(0, 1); glVertex3f(x - width/2, y - height/2, -z); + glTexCoord2f(1, 1); glVertex3f(x + width/2, y - height/2, -z); + glTexCoord2f(1, 0); glVertex3f(x + width/2, y + height/2, -z); + glTexCoord2f(0, 0); glVertex3f(x - width/2, y + height/2, -z); + glEnd(); + + glDisable(GL_TEXTURE_2D); +} + +inline void drawGLRect(const QRect &rect, const QColor &color) { + + if (rect.isEmpty()) return; + + // draw a rectangle using 2 triangles + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = x1 + rect.width();//rect.right() + 1; + GLint y2 = y1 + rect.height();//rect.bottom() + 1; + + TGL2int vertexArray[4] = {{x1, y1}, {x2, y1}, {x1, y2}, {x2, y2}}; + + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_INT, 0, vertexArray); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDisableClientState(GL_VERTEX_ARRAY); +} + +inline void drawGLRect(const QRect &rect, const QColor &color, float z) { + + if (rect.isEmpty()) return; + + // draw a rectangle using 2 triangles + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = x1 + rect.width(); + GLint y2 = y1 + rect.height(); + + TGL3float vertexArray[4] = + { + {(GLfloat)x1, (GLfloat)y1, z}, + {(GLfloat)x2, (GLfloat)y1, z}, + {(GLfloat)x1, (GLfloat)y2, z}, + {(GLfloat)x2, (GLfloat)y2, z} + }; + + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDisableClientState(GL_VERTEX_ARRAY); +} + +inline void drawGLRect(const QRect &rect, const QColor &color1, const QColor &color2, bool colorLeftToRight) { + + // draw a rectangle using 2 triangles + + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = rect.right() + 1; + GLint y2 = rect.bottom() + 1; + + TGL2int vertexArray[4] = {{x1, y1}, {x2, y1}, {x1, y2}, {x2, y2}}; + + s_glRGBA_uByte gl_color1; + gl_color1.r = color1.red(); + gl_color1.g = color1.green(); + gl_color1.b = color1.blue(); + gl_color1.a = color1.alpha(); + + s_glRGBA_uByte gl_color2; + gl_color2.r = color2.red(); + gl_color2.g = color2.green(); + gl_color2.b = color2.blue(); + gl_color2.a = color2.alpha(); + + s_glRGBA_uByte vertexColors[4]; + if (!colorLeftToRight) { + + // top to bottom + vertexColors[0] = gl_color1; // top left + vertexColors[1] = gl_color1; // top right + vertexColors[2] = gl_color2; // bottom left + vertexColors[3] = gl_color2; // bottom right + } + else { + + // left to right + vertexColors[0] = gl_color1; // top left + vertexColors[1] = gl_color2; // top right + vertexColors[2] = gl_color1; // bottom left + vertexColors[3] = gl_color2; // bottom right + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_INT, 0, vertexArray); + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, vertexColors); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); +} + +inline void drawGLRect(const QRect &rect, const QColor &color1, const QColor &color2, float z, bool colorLeftToRight) { + + // draw a rectangle using 2 triangles + + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = rect.right() + 1; + GLint y2 = rect.bottom() + 1; + + TGL3float vertexArray[4] = + { + {(GLfloat)x1, (GLfloat)y1, z}, + {(GLfloat)x2, (GLfloat)y1, z}, + {(GLfloat)x1, (GLfloat)y2, z}, + {(GLfloat)x2, (GLfloat)y2, z} + }; + + s_glRGBA_uByte gl_color1; + gl_color1.r = color1.red(); + gl_color1.g = color1.green(); + gl_color1.b = color1.blue(); + gl_color1.a = color1.alpha(); + + s_glRGBA_uByte gl_color2; + gl_color2.r = color2.red(); + gl_color2.g = color2.green(); + gl_color2.b = color2.blue(); + gl_color2.a = color2.alpha(); + + s_glRGBA_uByte vertexColors[4]; + + if (!colorLeftToRight) { + + // top to bottom + vertexColors[0] = gl_color1; // top left + vertexColors[1] = gl_color1; // top right + vertexColors[2] = gl_color2; // bottom left + vertexColors[3] = gl_color2; // bottom right + } + else { + + // left to right + vertexColors[0] = gl_color1; // top left + vertexColors[1] = gl_color2; // top right + vertexColors[2] = gl_color1; // bottom left + vertexColors[3] = gl_color2; // bottom right + } + + glEnableClientState(GL_VERTEX_ARRAY); + //glVertexPointer(2, GL_INT, 0, vertexArray); + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, vertexColors); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); +} + +inline void drawGLTriangleLeft(const QRect &rect, const QColor &color, float z) { + + if (rect.isEmpty()) return; + + GLint x1 = rect.left(); + GLint x2 = rect.left() + rect.width(); + GLint y1 = rect.top() + rect.height()/2; + GLint y2 = rect.top(); + GLint y3 = rect.top() + rect.height(); + + TGL3float vertexArray[3] = + { + {(GLfloat)x1, (GLfloat)y1, z}, + {(GLfloat)x2, (GLfloat)y2, z}, + {(GLfloat)x2, (GLfloat)y3, z} + }; + + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); +} + +inline void drawGLTriangleRight(const QRect &rect, const QColor &color, float z) { + + if (rect.isEmpty()) return; + + GLint x1 = rect.left(); + GLint x2 = rect.left() + rect.width(); + GLint y1 = rect.top(); + GLint y2 = y1 + rect.height(); + GLint y3 = y1 + rect.height()/2; + + TGL3float vertexArray[3] = + { + {(GLfloat)x1, (GLfloat)y1, z}, + {(GLfloat)x2, (GLfloat)y3, z}, + {(GLfloat)x1, (GLfloat)y2, z} + }; + + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); +} + +inline void drawGLBackground(const QRect &rect) { + + if (rect.isEmpty()) return; + + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = x1 + rect.width(); + GLint y2 = y1 + rect.height(); + + //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glBegin(GL_TRIANGLE_STRIP); + glColor3f((GLfloat)0.13, (GLfloat)0.13, (GLfloat)0.13); glVertex3f(x1, y1, 0.0); // top left corner + glColor3f((GLfloat)0.13, (GLfloat)0.13, (GLfloat)0.13); glVertex3f(x2, y1, 0.0); // top right corner + glColor3f((GLfloat)0.18, (GLfloat)0.18, (GLfloat)0.18); glVertex3f(x1, y2, 0.0); // bottom left corner + glColor3f((GLfloat)0.31, (GLfloat)0.31, (GLfloat)0.31); glVertex3f(x2, y2, 0.0); // bottom right corner + glEnd(); + //glFlush(); +} + +inline void drawGLScaleBackground(const QRect &rect, const QColor &color) { + + if (rect.isEmpty()) return; + + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = x1 + rect.width(); + GLint y2 = y1 + rect.height(); + + //const bool GL_TEXTURE_2D_wasEnabled = glIsEnabled(GL_TEXTURE_2D); + glColor4ub(color.red(), color.green(), color.blue(), color.alpha()); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glBegin(GL_POLYGON); + glVertex3f(x1, y1, 0.0); // top left corner + glVertex3f(x2, y1, 0.0); // top middle corner + glVertex3f(x2, y2, 0.0); // bottom middle corner + glVertex3f(x1, y2, 0.0); // bottom left corner + glEnd(); + glFlush(); +} + +inline void renderTexture( + const QRect &rect, + const GLuint texId, + float z) +{ + if (rect.isEmpty()) return; + if (!texId) return; + + const bool GL_TEXTURE_2D_enabled = glIsEnabled(GL_TEXTURE_2D); + GLint oldTex; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTex); + + GLint x1 = rect.left(); + GLint y1 = rect.top(); + GLint x2 = x1 + rect.width(); + GLint y2 = y1 + rect.height(); + + if (!GL_TEXTURE_2D_enabled) glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, texId); + + glBegin(GL_QUADS); + glTexCoord2f(0, 1); glVertex3f(x1, y1, z); // top left corner + glTexCoord2f(1, 1); glVertex3f(x2, y1, z); // top right corner + glTexCoord2f(1, 0); glVertex3f(x2, y2, z); // bottom right corner + glTexCoord2f(0, 0); glVertex3f(x1, y2, z); // bottom left corner + glEnd(); + + glBindTexture(GL_TEXTURE_2D, oldTex); + if (!GL_TEXTURE_2D_enabled) glDisable(GL_TEXTURE_2D); +} + +//inline void writeBitmapString(void *font, char *string) { +// +// char *c; +// for (c = string; *c != '\0'; c++) glutBitmapCharacter(font, *c); +//} +// +//inline void writeStrokeString(void *font, char *string) { +// +// char *c; +// for (c = string; *c != '\0'; c++) glutStrokeCharacter(font, *c); +//} + +#endif // _CUSDR_OPENGLTYPES_H diff --git a/Source/src/GL/cusdr_oglWidebandPanel.cpp b/Source/src/GL/cusdr_oglWidebandPanel.cpp new file mode 100644 index 0000000..7a4d15c --- /dev/null +++ b/Source/src/GL/cusdr_oglWidebandPanel.cpp @@ -0,0 +1,2074 @@ +/** +* @file cusdr_oglWidebandPanel.h +* @brief wide band spectrum panel class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-11 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_WBGRAPHICS + +// use: WBGRAPHICS_DEBUG + +#include "cusdr_oglWidebandPanel.h" + +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#ifndef GL_MULTISAMPLE +#define GL_MULTISAMPLE 0x809D +#endif + +QGLWidebandPanel::QGLWidebandPanel(QWidget *parent) + : QGLWidget(QGLFormat(QGL::SampleBuffers|QGL::AlphaChannel), parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(set->getDataEngineState()) + , m_panMode(set->getPanadapterMode(0)) + //, m_specAveragingCnt(set->getSpectrumAveragingCnt()) + , m_mousePos(QPoint(-1, -1)) + , m_mouseDownPos(QPoint(-1, -1)) + , m_spectrumUpdate(false) + , m_freqScaleUpdate(true) + , m_freqScaleRenew(true) + , m_dBmScaleUpdate(true) + , m_dBmScaleRenew(true) + , m_panGridRenew(true) + , m_spectrumColorsChanged(true) + , m_crossHairCursor(false) + //, m_panGrid(set->getPanGridStatus(0)) + , m_panGrid(true) + , m_calibrate(false) + , m_panSpectrumBinsLength(0) + , m_snapMouse(3) + , m_currentReceiver(set->getCurrentReceiver()) + , m_sampleRate(set->getSampleRate()) + , m_freqScaleZoomFactor(1.0) + , m_dBmScaleOffset(0.0) +{ +// QGL::setPreferredPaintEngine(QPaintEngine::OpenGL); + + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + setAutoBufferSwap(true); + setAutoFillBackground(false); + + setMouseTracking(true); + //setFocusPolicy(Qt::StrongFocus); + + setupDisplayRegions(size()); + m_oldWidth = size().width(); + m_oldHeight = size().height(); + + m_rxDataList = set->getReceiverDataList(); + m_widebandOptions = set->getWidebandOptions(); + m_panMode = m_widebandOptions.panMode; + + m_frequency = m_rxDataList.at(0).vfoFrequency; + + m_lowerFrequency = 0.0; + m_upperFrequency = (qreal) MAXHPFREQUENCY; + + m_dBmPanMin = set->getWidebanddBmScaleMin(); + m_dBmPanMax = set->getWidebanddBmScaleMax(); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + m_fonts.smallFont.setBold(true); + + m_oglTextTiny = new OGLText(m_fonts.tinyFont); + m_oglTextSmall = new OGLText(m_fonts.smallFont); + m_oglTextNormal = new OGLText(m_fonts.normalFont); + + + timer = 0; + + setupConnections(); + + m_panTimer.start(); + m_displayTime.start(); + m_resizeTime.start(); + + m_wbSpectrumBuffer.resize(BIGWIDEBANDSIZE / 2); + m_wbSpectrumBuffer.fill(-1000.0f); + m_wbSpectrumBufferLength = m_wbSpectrumBuffer.size(); + + m_dBmPanLogGain = 75;//69; // allow user to calibrate this value + + if (m_specAveragingCnt > 0) + m_scale = 1.0f / m_specAveragingCnt; + else + m_scale = 1.0f; + + m_frequencyScaleFBO = 0; + m_dBmScaleFBO = 0; + m_gridFBO = 0; + + + m_gridColor = set->getPanadapterColors().gridLineColor; + + m_redGrid = (GLfloat)(m_gridColor.red()/256.0); + m_greenGrid = (GLfloat)(m_gridColor.green()/256.0); + m_blueGrid = (GLfloat)(m_gridColor.blue()/256.0); + + m_r = (GLfloat)(set->getPanadapterColors().wideBandLineColor.red() / 256.0); + m_g = (GLfloat)(set->getPanadapterColors().wideBandLineColor.green() / 256.0); + m_b = (GLfloat)(set->getPanadapterColors().wideBandLineColor.blue() / 256.0); + + m_rf = (GLfloat)(set->getPanadapterColors().wideBandFilledColor.red() / 256.0); + m_gf = (GLfloat)(set->getPanadapterColors().wideBandFilledColor.green() / 256.0); + m_bf = (GLfloat)(set->getPanadapterColors().wideBandFilledColor.blue() / 256.0); + + m_redST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.red() / 256.0); + m_greenST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.green() / 256.0); + m_blueST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.blue() / 256.0); + + m_redSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.red() / 256.0); + m_greenSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.green() / 256.0); + m_blueSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.blue() / 256.0); + + m_bkgRed = (GLfloat)(set->getPanadapterColors().panBackgroundColor.red() / 256.0); + m_bkgGreen = (GLfloat)(set->getPanadapterColors().panBackgroundColor.green() / 256.0); + m_bkgBlue = (GLfloat)(set->getPanadapterColors().panBackgroundColor.blue() / 256.0); +} + +QGLWidebandPanel::~QGLWidebandPanel() { + + disconnect(set, 0, this, 0); + + makeCurrent(); + glFinish(); + + while (!specAv_queue.isEmpty()) + specAv_queue.dequeue(); + + if (m_frequencyScaleFBO) { + + delete m_frequencyScaleFBO; + m_frequencyScaleFBO = 0; + } + + if (m_dBmScaleFBO) { + + delete m_dBmScaleFBO; + m_dBmScaleFBO = 0; + } + + if (m_gridFBO) { + + delete m_gridFBO; + m_gridFBO = 0; + } +} + +QSize QGLWidebandPanel::minimumSizeHint() const { + + return QSize(width(), 50); + //return QSize(width(), height()); +} + +QSize QGLWidebandPanel::sizeHint() const { + + //return QSize(width(), height()); + return QSize(width(), 120); +} + +void QGLWidebandPanel::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)) + ); + + CHECKED_CONNECT( + set, + SIGNAL(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode)), + this, + SLOT(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode))); + + CHECKED_CONNECT( + set, + SIGNAL(widebandSpectrumBufferChanged(const qVectorFloat &)), + this, + SLOT(setWidebandSpectrumBuffer(const qVectorFloat &))); + + CHECKED_CONNECT( + set, + SIGNAL(widebandSpectrumBufferReset()), + this, + SLOT(resetWidebandSpectrumBuffer())); + + CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(panadapterColorChanged()), + this, + SLOT(setPanadapterColors())); + + /*CHECKED_CONNECT( + set, + SIGNAL(panGridStatusChanged(bool, int)), + this, + SLOT(setPanGridStatus(bool, int)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(setMercuryAttenuator(QObject *, HamBand, int))); + + //CHECKED_CONNECT( + // set, + // SIGNAL(spectrumAveragingCntChanged(int)), + // this, + // SLOT(setSpectrumAveragingCnt(int))); +} + +void QGLWidebandPanel::initializeGL() { + + if (!isValid()) return; + + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + + glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + + m_cnt = 0; + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + +void QGLWidebandPanel::paintGL() { + + switch (m_serverMode) { + + case QSDR::NoServerMode: + case QSDR::ChirpWSPR: + case QSDR::ChirpWSPRFile: + case QSDR::DemoMode: + + drawGLRect(QRect(0, 0, width(), height()), QColor(0, 0, 0)); + break; + + case QSDR::SDRMode: + + if (m_resizeTime.elapsed() > 200 || m_dataEngineState == QSDR::DataEngineDown) { + + drawSpectrum(); + drawHorizontalScale(); + drawVerticalScale(); + + if (m_panGrid) + drawGrid(); + + // Ham band information + drawHamBand(1810000, 2000000, "160m"); + drawHamBand(3500000, 3800000, "80m"); + drawHamBand(5258500, 5403500, "60m"); + drawHamBand(7000000, 7300000, "40m"); + drawHamBand(10100000, 10150000, "30m"); + drawHamBand(14000000, 14350000, "20m"); + drawHamBand(18068000, 18168000, "17m"); + drawHamBand(21000000, 21450000, "15m"); + drawHamBand(24890000, 24990000, "12m"); + drawHamBand(28000000, 29700000, "10m"); + drawHamBand(50000000, 51990000, "6m"); + + //qglColor(QColor(255, 255, 255, 130)); + //m_oglTextSmall->renderText(m_panRect.right() - 100, m_panRect.top(), 5.0f, "Region 1"); + + if (m_mouseRegion == panRegion && m_crossHairCursor) + drawCrossHair(); + } + + break; + } +} + +//************************************************************************ +void QGLWidebandPanel::drawSpectrum() { + + GLint width = m_panRect.width(); + GLint height = m_panRect.height(); + + GLint x1 = m_panRect.left(); + GLint y1 = m_panRect.top(); + GLint x2 = x1 + width; + GLint y2 = y1 + height; + + GLint vertexArrayLength = 0; + + // x scale + int idx = 0; + int lIdx = 0; + int rIdx = 0; + int deltaIdx = 0; + + qreal scaleMult = 1.0; + + m_scaledBufferSize = qFloor(m_wbSpectrumBufferLength * m_freqScaleZoomFactor); + deltaIdx = qFloor((qreal)(m_wbSpectrumBufferLength * (m_lowerFrequency / MAXHPFREQUENCY))); + + qreal frequencyScale = (qreal)(1.0f * m_scaledBufferSize / width); + + if (frequencyScale < 0.125) + scaleMult = 0.0625; + else if (frequencyScale < 0.25) + scaleMult = 0.125; + else if (frequencyScale < 0.5) + scaleMult = 0.25; + else if (frequencyScale < 1.0) + scaleMult = 0.5; + + qreal scale = frequencyScale / scaleMult; + + // y scale + float yScale; + float yScaleColor; + float yTop; + float localMax; + + //qreal dBmRange = qAbs(m_dBmPanMax - m_dBmPanMin); + qreal dBmRange; + + if (m_calibrate) + dBmRange = qAbs(m_dBmPanMaxOld - m_dBmPanMinOld); + else + dBmRange = qAbs(m_dBmPanMax - m_dBmPanMin); + + yScale = height / dBmRange; + yScaleColor = 1.0f / dBmRange; + yTop = (float) y2; + + if (m_dataEngineState == QSDR::DataEngineUp) + glClear(GL_DEPTH_BUFFER_BIT); + else + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_MULTISAMPLE); + glEnable(GL_LINE_SMOOTH); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glLineWidth(1); + + // draw background + if (m_dataEngineState == QSDR::DataEngineUp) { + +// glBegin(GL_TRIANGLE_STRIP); +// glColor3f(0.2f * m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x1, y1, -4.0); // top left corner +// glColor3f(0.2f * m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x2, y1, -4.0); // top right corner +// glColor3f(0.8f * m_bkgRed, 0.8f * m_bkgGreen, 0.8f * m_bkgBlue); glVertex3f(x1, y2, -4.0); // bottom left corner +// glColor3f( m_bkgRed, m_bkgGreen, m_bkgBlue); glVertex3f(x2, y2, -4.0); // bottom right corner +// glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3f(0.8f * m_bkgRed, 0.8f * m_bkgGreen, 0.8f * m_bkgBlue); glVertex3f(x1, y1, -4.0); // top left corner + glColor3f(0.6f * m_bkgRed, 0.6f * m_bkgGreen, 0.6f * m_bkgBlue); glVertex3f(x2, y1, -4.0); // top right corner + glColor3f(0.4f * m_bkgRed, 0.4f * m_bkgGreen, 0.4f * m_bkgBlue); glVertex3f(x1, y2, -4.0); // bottom left corner + glColor3f(0.2f * m_bkgRed, 0.2f * m_bkgGreen, 0.2f * m_bkgBlue); glVertex3f(x2, y2, -4.0); // bottom right corner + glEnd(); + } + else { + + drawGLRect(m_panRect, QColor(30, 30, 50, 155), -4.0f); + } + + // set a scissor box + glScissor(x1, size().height() - y2, x2, height); + glEnable(GL_SCISSOR_TEST); + + // set up the vertex arrays + vertexArrayLength = (GLint)(scaleMult * width); + //WBGRAPHICS_DEBUG << "vertexArrayLength: " << vertexArrayLength; + + TGL3float *vertexArray = new TGL3float[vertexArrayLength]; + TGL3float *vertexColorArray = new TGL3float[vertexArrayLength]; + + TGL3float *vertexArrayBg = new TGL3float[2*vertexArrayLength]; + TGL3float *vertexColorArrayBg = new TGL3float[2*vertexArrayLength]; + + switch (m_panMode) { + + case (PanGraphicsMode) FilledLine: + + for (int i = 0; i < vertexArrayLength; i++) { + + idx = 0; + lIdx = (int)floor((qreal)(i * scale)); + rIdx = (int)floor((qreal)(i * scale) + scale); + + // max value; later we try mean value also! + localMax = -10000.0F; + for (int j = lIdx; j < rIdx; j++) { + if (m_wbSpectrumBuffer.at(j) > localMax) { + + localMax = m_wbSpectrumBuffer.at(j); + idx = j; + } + } + idx += deltaIdx; + + mutex.lock(); + + vertexColorArrayBg[2*i].x = m_rf; + vertexColorArrayBg[2*i].y = m_gf; + vertexColorArrayBg[2*i].z = m_bf; + + vertexColorArrayBg[2*i+1].x = 0.3 * m_rf; + vertexColorArrayBg[2*i+1].y = 0.3 * m_gf; + vertexColorArrayBg[2*i+1].z = 0.3 * m_bf; + + qreal yvalue = 0; + if (idx < m_wbSpectrumBufferLength) + yvalue = m_wbSpectrumBuffer.at(idx) - m_dBmPanMin; + + vertexColorArray[i].x = m_r * (yScaleColor * yvalue); + vertexColorArray[i].y = m_g * (yScaleColor * yvalue); + vertexColorArray[i].z = m_b * (yScaleColor * yvalue); + + if (idx < m_wbSpectrumBufferLength) + yvalue = m_wbSpectrumBuffer.at(idx) - m_dBmPanMin - m_dBmPanLogGain; + + if (m_mercuryAttenuator) + yvalue -= 20.0f; + + vertexArrayBg[2*i].x = (GLfloat)(i/scaleMult); + vertexArrayBg[2*i].y = (GLfloat)(yTop - yScale * yvalue); + vertexArrayBg[2*i].z = -2.5; + + vertexArrayBg[2*i+1].x = (GLfloat)(i/scaleMult); + vertexArrayBg[2*i+1].y = (GLfloat)yTop; + vertexArrayBg[2*i+1].z = -2.5; + + vertexArray[i].x = (GLfloat)(i/scaleMult); + vertexArray[i].y = (GLfloat)(yTop - yScale * yvalue); + vertexArray[i].z = -1.0; + + mutex.unlock(); + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBg); + glDrawArrays(GL_QUAD_STRIP, 0, 2*vertexArrayLength); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + + break; + + case (PanGraphicsMode) Line: + + for (int i = 0; i < vertexArrayLength; i++) { + + lIdx = (int)floor((qreal)(i * scale)); + rIdx = (int)floor((qreal)(i * scale) + scale); + + // max value; later we try mean value also! + localMax = -10000.0F; + for (int j = lIdx; j < rIdx; j++) { + if (m_wbSpectrumBuffer.at(j) > localMax) { + + localMax = m_wbSpectrumBuffer.at(j); + idx = j; + } + } + idx += deltaIdx; + + mutex.lock(); + + qreal yvalue = 0; + if (idx < m_wbSpectrumBufferLength) + yvalue = m_wbSpectrumBuffer.at(idx) - m_dBmPanMin; + + vertexColorArray[i].x = m_r * (yScaleColor * yvalue); + vertexColorArray[i].y = m_g * (yScaleColor * yvalue); + vertexColorArray[i].z = m_b * (yScaleColor * yvalue); + + if (idx < m_wbSpectrumBufferLength) { + + if (m_calibrate) + yvalue = m_wbSpectrumBuffer.at(idx) - m_dBmPanMinOld - m_dBmPanLogGain; + else + yvalue = m_wbSpectrumBuffer.at(idx) - m_dBmPanMin - m_dBmPanLogGain - m_dBmScaleOffset; + } + + if (m_mercuryAttenuator) yvalue -= 20.0f; + + vertexArray[i].x = (GLfloat)(i/scaleMult); + vertexArray[i].y = (GLfloat)(yTop - yScale * yvalue); + vertexArray[i].z = -1.0; + + mutex.unlock(); + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArray); + glColorPointer(3, GL_FLOAT, 0, vertexColorArray); + glDrawArrays(GL_LINE_STRIP, 0, vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + + break; + + + case (PanGraphicsMode) Solid: + + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + + mutex.lock(); + for (int i = 0; i < vertexArrayLength; i++) { + + lIdx = qFloor((qreal)(i * scale)); + rIdx = qFloor((qreal)(i * scale) + scale); + + // max value + localMax = -10000.0F; + for (int j = lIdx; j < rIdx; j++) { + + if (m_wbSpectrumBuffer.at(j) > localMax) { + + localMax = m_wbSpectrumBuffer.at(j); + idx = j; + } + } + //qreal mean = m_wbSpectrumBuffer.at(lIdx + deltaIdx); + //int len = rIdx - lIdx; + //WBGRAPHICS_DEBUG << "leftIdx = " << lIdx << " rightIdx = " << rIdx << " length = " << len; + //for (int j = lIdx+1; j < len; j++) { + + // mean += m_wbSpectrumBuffer.at(j); + //} + //if (len > 0) mean /= len; + + idx += deltaIdx; + + //mutex.lock(); + vertexColorArrayBg[2*i].x = m_redST; + vertexColorArrayBg[2*i].y = m_greenST; + vertexColorArrayBg[2*i].z = m_blueST; + + vertexColorArrayBg[2*i+1].x = m_redSB; + vertexColorArrayBg[2*i+1].y = m_greenSB; + vertexColorArrayBg[2*i+1].z = m_blueSB; + + qreal yvalue = 0; + if (idx < m_wbSpectrumBufferLength) + yvalue = m_wbSpectrumBuffer.at(idx) - m_dBmPanMin - m_dBmPanLogGain; + //yvalue = mean - m_dBmPanMin - m_dBmPanLogGain; + + if (m_mercuryAttenuator) + yvalue -= 20.0; + + vertexArrayBg[2*i].x = (GLfloat)(i/scaleMult); + vertexArrayBg[2*i].y = (GLfloat)(yTop - yScale * yvalue); + vertexArrayBg[2*i].z = -2.0f; + + vertexArrayBg[2*i+1].x = (GLfloat)(i/scaleMult); + vertexArrayBg[2*i+1].y = (GLfloat)yTop; + vertexArrayBg[2*i+1].z = -2.0f; + + //mutex.unlock(); + } + mutex.unlock(); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, vertexArrayBg); + glColorPointer(3, GL_FLOAT, 0, vertexColorArrayBg); + glDrawArrays(GL_LINES, 0, 2*vertexArrayLength); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + delete[] vertexArray; + delete[] vertexColorArray; + delete[] vertexArrayBg; + delete[] vertexColorArrayBg; + + break; + } + glDisable(GL_SCISSOR_TEST); + + // draw a rectangle for the panadapter frequency region + if (m_dataEngineState == QSDR::DataEngineUp && !m_calibrate) { + + y1 = m_panRect.top() + 15; + y2 = m_panRect.height() - 15; + + //m_frequencySpan = (m_upperFrequency - m_lowerFrequency) * m_freqScaleZoomFactor; + //m_frequencyUnit = (qreal)(m_freqScaleRect.width() / m_frequencySpan); + + //int centerFreq = (int)(m_frequencyUnit * (m_frequency - m_lowerFrequency)); + //int deltaF = (int)(m_frequencyUnit * (float)m_sampleRate/2); + //int linePos = centerFreq; + + int centerFreq = (int)(m_frequencyUnit * (m_frequency - m_lowerFrequency)); + int deltaF = (int)(m_frequencyUnit * (float)m_sampleRate/2); + //int linePos = centerFreq; + + + x1 = (GLint)(centerFreq - deltaF); + x2 = (GLint)(centerFreq + deltaF); + +// int dist = qAbs(x2-x1); +// if (dist < 2) { +// +// x2 = x1 + 1; +// linePos = x1; +// glLineWidth(2); +// } +// else if (dist%2 == 0) { +// +// glLineWidth(1); +// } +// else if (dist%2 == 1) { +// +// linePos -= 1; +// glLineWidth(2); +// } + + QRect rect = QRect(x1, y1, x2-x1, y2); + drawGLRect(rect, QColor(160, 235, 255, 80), 0.0f); + + // small vertical line +// qglColor(QColor(255, 0, 0, 255)); +// glBegin(GL_LINES); +// glVertex3f(centerFreq, y2 + 15, 4.0f); +// glVertex3f(centerFreq, y2 + 30, 4.0f); +// glEnd(); + + glLineWidth(1); + } + + //glDisable(GL_SCISSOR_TEST); + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); +} + +void QGLWidebandPanel::drawVerticalScale() { + + if (!m_dBmScaleRect.isValid()) return; + + int width = m_dBmScaleRect.width(); + int height = m_dBmScaleRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_dBmScaleFBO || m_dBmScaleUpdate || m_dBmScaleRenew) { + + if (!m_dBmScaleFBO || m_dBmScaleRenew) { + + if (m_dBmScaleFBO) { + + delete m_dBmScaleFBO; + m_dBmScaleFBO = 0; + } + + m_dBmScaleFBO = new QGLFramebufferObject(width, height);//, format); + //WBGRAPHICS_DEBUG << "dBmScaleFBO generated."; + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_dBmScaleFBO->bind(); + renderVerticalScale(); + m_dBmScaleFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + //WBGRAPHICS_DEBUG << "dBm scale updated."; + m_dBmScaleUpdate = false; + m_dBmScaleRenew = false; + } + + renderTexture(m_dBmScaleRect, m_dBmScaleFBO->texture(), 0.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLWidebandPanel::drawHorizontalScale() { + + if (!m_freqScaleRect.isValid()) return; + + int width = m_freqScaleRect.width(); + int height = m_freqScaleRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor3f(0.65f, 0.76f, 0.81f); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_frequencyScaleFBO || m_freqScaleUpdate || m_freqScaleRenew) { + + if (!m_frequencyScaleFBO || m_freqScaleRenew) { + + if (m_frequencyScaleFBO) { + + delete m_frequencyScaleFBO; + m_frequencyScaleFBO = 0; + } + + m_frequencyScaleFBO = new QGLFramebufferObject(width, height);//, format); + //WBGRAPHICS_DEBUG << "wb-frequencyScaleFBO generated."; + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_frequencyScaleFBO->bind(); + renderHorizontalScale(); + m_frequencyScaleFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + //WBGRAPHICS_DEBUG << "frequency scale updated."; + m_freqScaleUpdate = false; + m_freqScaleRenew = false; + } + + renderTexture(m_freqScaleRect, m_frequencyScaleFBO->texture(), 0.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); +} + +void QGLWidebandPanel::drawGrid() { + + if (!m_panRect.isValid()) return; + + int width = m_panRect.width(); + int height = m_panRect.height(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glColor4f(m_redGrid, m_greenGrid, m_blueGrid, 1.0); + + glDisable(GL_MULTISAMPLE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + if (!m_gridFBO || m_panGridUpdate || m_panGridRenew) { + + if (!m_gridFBO || m_panGridRenew) { + + if (m_gridFBO) { + + delete m_gridFBO; + m_gridFBO = 0; + } + + m_gridFBO = new QGLFramebufferObject(width, height);//, format); + //WBGRAPHICS_DEBUG << "gridFBO generated."; + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, width, height); + setProjectionOrthographic(width, height); + + m_gridFBO->bind(); + renderGrid(); + m_gridFBO->release(); + + glPopAttrib(); + glViewport(0, 0, size().width(), size().height()); + setProjectionOrthographic(size().width(), size().height()); + + //WBGRAPHICS_DEBUG << "grid updated."; + m_panGridUpdate = false; + m_panGridRenew = false; + } + + renderTexture(m_panRect, m_gridFBO->texture(), -3.0f); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glColor3f(0.65f, 0.76f, 0.81f); + glEnable(GL_MULTISAMPLE); +} + +void QGLWidebandPanel::drawCrossHair() { + + QRect rect(0, m_panRect.top(), width(), height() - m_panRect.top()); + + int x = m_mousePos.x(); + int y = m_mousePos.y(); + + glDisable(GL_MULTISAMPLE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0f); + + qglColor(QColor(255, 255, 255, 80)); + + // set a scissor box + glScissor(rect.left(), rect.top(), rect.width() - 1, rect.height()); + glEnable(GL_SCISSOR_TEST); + + // horizontal line + glBegin(GL_LINES); + glVertex3f(rect.left() - 1, y, 4.0f); + glVertex3f(m_dBmScaleRect.left() - 2, y, 4.0f); + glEnd(); + + // vertical line + glBegin(GL_LINES); + glVertex3f(x, rect.top() + 1, 4.0f); + glVertex3f(x, rect.bottom() - 1, 4.0f); + glEnd(); + + // cross hair + qglColor(QColor(255, 255, 255, 180)); + glBegin(GL_LINES); + glVertex3f(x , y - 20, 5.0f); + glVertex3f(x , y + 20, 5.0f); + glVertex3f(x - 20, y, 5.0f); + glVertex3f(x + 20, y, 5.0f); + glEnd(); + + // text only on panadapter + if (m_mouseRegion == panRegion) { + + QString str; + qglColor(QColor(255, 255, 255, 255)); + + qreal unit = (qreal)((MAXHPFREQUENCY * m_freqScaleZoomFactor) / m_panRect.width()); + qreal frequency = (unit * x) + m_lowerFrequency; + + str = frequencyString(frequency); + if (x > m_panRect.width() - 85) + m_oglTextSmall->renderText(x - 90, y - 18, 5.0f, str); + else + m_oglTextSmall->renderText(x + 4, y - 18, 5.0f, str); + + qreal dBm = m_dBmPanMax - ((m_dBmPanMax - m_dBmPanMin) * ((qreal)(y - m_panRect.top()) / m_panRect.height())); + str = QString::number(dBm, 'f', 1) + " dBm"; + if (x > m_panRect.width() - 85) + m_oglTextSmall->renderText(x - 90, y + 6, 5.0f, str); + else + m_oglTextSmall->renderText(x + 4, y + 6, 5.0f, str); + } + + glDisable(GL_SCISSOR_TEST); + glEnable(GL_MULTISAMPLE); +} + +void QGLWidebandPanel::drawHamBand( + int lo, + int hi, + const QString &band +) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + GLint x1 = (GLint)(m_frequencyUnit * (lo - m_lowerFrequency)); + GLint x2 = (GLint)(m_frequencyUnit * (hi - m_lowerFrequency)); + + GLint y1 = m_panRect.top();// + 15; + GLint y2 = m_panRect.bottom(); + + QRect rect = QRect(x1, y1, x2-x1, y2); + + if (x2 < m_dBmScaleRect.left()) { + + drawGLRect( + rect, + QColor((int)(255 * m_bkgRed), (int)(255 * m_bkgGreen), (int)(255 * m_bkgBlue), 180), + QColor((int)(255 * m_bkgRed), (int)(255 * m_bkgGreen), (int)(255 * m_bkgBlue), 80), + -2.0f, + false); + } + + //QFontMetrics d_fm(m_smallFont); + int fontWidth = m_fonts.smallFontMetrics->boundingRect(band).width(); + + qglColor(QColor(255, 255, 255, 180)); + m_oglTextSmall->renderText((x2 + x1 - fontWidth)/2.0f, y1, 5.0f, band); +} + +//************************************************************************ +// The algorithms of the scale functions are taken from SDRMAXIII +// (c) Catherine Moss, with permission. + +void QGLWidebandPanel::renderVerticalScale() { + + QString str; + //QFontMetrics d_fm(m_smallFont); + int spacing = 6; + int fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0dBm").height() + spacing; + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("-000.0").width(); + + GLint width = m_dBmScaleRect.width(); + GLint height = m_dBmScaleRect.height(); + + qreal unit = (qreal)(m_dBmScaleRect.height() / qAbs(m_dBmPanMax - m_dBmPanMin)); + + m_dBmScale = getYRuler2(m_dBmScaleRect, fontHeight, unit, m_dBmPanMin, m_dBmPanMax); + + glClear(GL_COLOR_BUFFER_BIT); + + QRect textRect(0, 0, fontMaxWidth, fontHeight); + textRect.moveLeft(3); + m_dBmScaleTextPos = -textRect.height(); + + int len = m_dBmScale.mainPointPositions.length(); + int sublen = m_dBmScale.subPointPositions.length(); + + // draw the scale background + drawGLScaleBackground(QRect(0, 0, width, height), QColor(30, 30, 30, 180)); + + if (len > 0) { + + glColor3f(0.65f, 0.76f, 0.81f); + glLineWidth(1); + + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(0, m_dBmScale.mainPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(4, m_dBmScale.mainPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + + glColor3f(0.45f, 0.56f, 0.61f); + if (sublen > 0) { + + glBegin(GL_LINES); + for (int i = 1; i < sublen; i++) { + + glVertex3f(0.0f, (float)m_dBmScale.subPointPositions.at(i), 0.0f); // origin of the line + glVertex3f(2.0f, (float)m_dBmScale.subPointPositions.at(i), 0.0f); // ending point of the line + } + glEnd(); + } + + glColor3f(0.75f, 0.86f, 0.91f); + for (int i = 0; i < len; i++) { + + textRect.moveBottom((int)m_dBmScale.mainPointPositions.at(i) + textRect.height()/2); + + //if (textRect.y() >= yOld && textRect.bottom() <= (m_dBmScaleRect.height() - textRect.height())) { + if (textRect.y() > m_dBmScaleRect.top() + textRect.height() && textRect.bottom() <= (m_dBmScaleRect.height() - textRect.height()/2)) { + + str = QString::number((qreal)m_dBmScale.mainPoints.at(i), 'f', 1); + m_oglTextSmall->renderText(textRect.x() + 10, textRect.y(), str); + m_dBmScaleTextPos = textRect.bottom(); + } + } + } + + textRect.moveTop(m_dBmScaleRect.top()); + glColor3f(0.94f, 0.22f, 0.43f); + + str = QString("dBm"); + m_oglTextSmall->renderText(textRect.x() + 18, textRect.y(), str); +} + +void QGLWidebandPanel::renderHorizontalScale() { + + if (m_freqScaleRect.isEmpty()) return; + + //QFontMetrics d_fm(m_smallFont); + int fontHeight = m_fonts.smallFontMetrics->tightBoundingRect(".0kMGHz").height(); + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000.000").width(); + + m_frequencySpan = MAXHPFREQUENCY * m_freqScaleZoomFactor; + m_frequencyUnit = (qreal)(m_freqScaleRect.width() / m_frequencySpan); + m_frequencyScale = getXRuler(m_freqScaleRect, fontMaxWidth, m_frequencyUnit, m_lowerFrequency, m_upperFrequency); + + // draw the frequency scale + int offset_X = -1; + int textOffset_y = 5; + double freqScale = 1; + + QString fstr = QString(" Hz "); + if (m_upperFrequency >= 1e6) { freqScale = 1e6; fstr = QString(" MHz "); } + else + if (m_upperFrequency >= 1e3) { freqScale = 1e3; fstr = QString(" kHz "); } + + // draw the wide band scale background + drawGLScaleBackground(QRect(0, 0, m_freqScaleRect.width(), m_freqScaleRect.height()), QColor(0, 0, 0, 255)); + + QRect scaledTextRect(0, textOffset_y, 1, fontHeight); + scaledTextRect.setWidth(m_fonts.smallFontMetrics->width(fstr)); + scaledTextRect.moveLeft(m_freqScaleRect.width() - scaledTextRect.width());// - menu_pull_right_rect.width()); + + glColor3f((GLfloat)0.65f, (GLfloat)0.76f, (GLfloat)0.81f); + int len = m_frequencyScale.mainPointPositions.length(); + if (len > 0) { + + glLineWidth(3); + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_frequencyScale.mainPointPositions.at(i), 1.0f, 0.0f); + glVertex3f(m_frequencyScale.mainPointPositions.at(i), 4.0f, 0.0f); + } + glEnd(); + + for (int i = 0; i < len; i++) { + + QString str = QString::number(m_frequencyScale.mainPoints.at(i) / freqScale, 'f', 3); + + if (freqScale == 1e3) + while (str.endsWith('0')) str.remove(str.size() - 1, 1); + + if (str.endsWith('.')) str.remove(str.size() - 1, 1); + + int text_width = m_fonts.smallFontMetrics->width(str); + QRect textRect(m_frequencyScale.mainPointPositions.at(i) + offset_X - (text_width / 2), textOffset_y, text_width, fontHeight); + + if (textRect.left() < 0 || textRect.right() >= scaledTextRect.left()) continue; + + m_oglTextSmall->renderText(textRect.x(), textRect.y(), str); + } + } + + len = m_frequencyScale.subPointPositions.length(); + if (len > 0) { + + glLineWidth(1); + glBegin(GL_LINES); + for (int i = 0; i < len; i++) { + + glVertex3f(m_frequencyScale.subPointPositions.at(i), 1.0f, 0.0f); + glVertex3f(m_frequencyScale.subPointPositions.at(i), 3.0f, 0.0f); + } + glEnd(); + } + + glColor3f(0.94f, 0.22f, 0.43f); + m_oglTextSmall->renderText(m_freqScaleRect.width() - 30, textOffset_y, fstr); +} + +void QGLWidebandPanel::renderGrid() { + + glClear(GL_COLOR_BUFFER_BIT); + glLineStipple(1, 0x9999); + glEnable(GL_LINE_STIPPLE); + glLineWidth(1.0f); + + // vertical lines + int len = m_frequencyScale.mainPointPositions.length(); + if (len > 0) { + + GLint x1 = m_panRect.left(); + GLint x2 = 1; + if (m_dBmScaleRect.isValid()) x2 += m_dBmScaleRect.width(); + + //GLint y1 = rect.top() + 1; + GLint y1 = 1; + GLint y2 = m_panRect.bottom() - 1; + + TGL2int *vertexArray = new TGL2int[len * 2]; + int vertexArrayLen = 0; + + TGL2int point1, point2; + point1.y = y1; + point2.y = y2; + for (int i = 0; i < len; i++) { + + GLint x = m_frequencyScale.mainPointPositions.at(i); + if (x < x2) continue; + x += x1; + point1.x = x; + point2.x = x; + vertexArray[vertexArrayLen++] = point1; + vertexArray[vertexArrayLen++] = point2; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_INT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, vertexArrayLen); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + } + + // horizontal lines + len = m_dBmScale.mainPointPositions.length(); + if (len > 0) { + + TGL2float *vertexArray = new TGL2float[len * 2]; + int vertexArrayLen = 0; + + TGL2float point1, point2; + point1.x = m_panRect.left();// + m_dBmScaleRect.width(); + point2.x = m_panRect.right(); + + for (int i = 0; i < len; i++) { + + GLfloat y = m_dBmScale.mainPointPositions.at(i); + + point1.y = y; + point2.y = y; + + vertexArray[vertexArrayLen++] = point1; + vertexArray[vertexArrayLen++] = point2; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, vertexArray); + glDrawArrays(GL_LINES, 0, vertexArrayLen); + glDisableClientState(GL_VERTEX_ARRAY); + + delete[] vertexArray; + } + glDisable(GL_LINE_STIPPLE); +} + +//******************************************************************** + +void QGLWidebandPanel::getRegion(QPoint p) { + + if (m_freqScaleRect.contains(p)) { + + m_mouseRegion = freqScaleRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else if (m_dBmScaleRect.contains(p)) { + + m_mouseRegion = dBmScaleRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else if (m_panRect.contains(p)) { + + m_mouseRegion = panRegion; + + if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + update(); + } + } + else + m_mouseRegion = elsewhere; + + /*if (m_displayTime.elapsed() >= 50) { + + m_displayTime.restart(); + updateGL(); + update(); + }*/ + //GRAPHICS_DEBUG << "region" << m_mouseRegion; +} + +void QGLWidebandPanel::resizeGL(int iWidth, int iHeight) { + + int width = (int)(iWidth/2) * 2; + int height = iHeight; + + if (width != m_oldWidth) { + + m_freqScaleRenew = true; + m_panGridRenew = true; + + m_oldWidth = width; + } + + if (height != m_oldHeight) { + + m_dBmScaleRenew = true; + m_panGridRenew = true; + + m_oldHeight = height; + } + + m_spectrumVertexColorUpdate = true; + + glFinish(); + + m_resizeTime.restart(); + setupDisplayRegions(QSize(width, height)); + glViewport(0, 0, (GLsizei)width, (GLsizei)height); + + setProjectionOrthographic(width, height); +} + +void QGLWidebandPanel::setupDisplayRegions(QSize size) { + + m_displayTop = 0; + int freqScaleRectHeight = 20; + int dBmScaleWidth = 45; + + //WBGRAPHICS_DEBUG << "WB display width:" << size.width(); + //WBGRAPHICS_DEBUG << "WB display height:" << size.height()/6.0; + + m_freqScaleRect = QRect( + 0, + size.height() - m_displayTop - freqScaleRectHeight, + size.width(), + freqScaleRectHeight); + + m_panRect = QRect( + 0, + m_displayTop, + size.width(), + m_freqScaleRect.top() - m_displayTop); + + m_dBmScaleRect = QRect( + m_panRect.right() - dBmScaleWidth, + m_displayTop, + dBmScaleWidth, + m_panRect.height()); + + m_panRectWidth = (GLint)m_panRect.width(); + m_freqScaleUpdate = true; + m_dBmScaleUpdate = true; + m_panGridUpdate = true; + + //*************************************************************************** + /*WBGRAPHICS_DEBUG << "***************************************************************************"; + WBGRAPHICS_DEBUG << "total size" << size.height(); + WBGRAPHICS_DEBUG << "sizes (top, bottom, height):"; + WBGRAPHICS_DEBUG << "m_wideBandPanRect" << m_panRect.top() << m_panRect.bottom() << m_panRect.height(); + WBGRAPHICS_DEBUG << "m_freqScaleWideBandRect" << m_freqScaleRect.top() << m_freqScaleRect.bottom() << m_freqScaleRect.height(); + WBGRAPHICS_DEBUG << "m_dBmScaleWideBandRect" << m_dBmScaleRect.top() << m_dBmScaleRect.bottom() << m_dBmScaleRect.height(); + WBGRAPHICS_DEBUG << "";*/ +} + +void QGLWidebandPanel::saveGLState() { + + glPushAttrib(GL_ALL_ATTRIB_BITS); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); +} + +void QGLWidebandPanel::restoreGLState() { + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPopAttrib(); +} + +//******************************************************************** +// HMI control + +void QGLWidebandPanel::enterEvent(QEvent *event) { + + setFocus(Qt::MouseFocusReason); + + m_mousePos = QPoint(-1, -1); + m_mouseRegion = elsewhere; + update(); + + QGLWidget::enterEvent(event); +} + +void QGLWidebandPanel::leaveEvent(QEvent *event) { + + m_mousePos = QPoint(-1, -1); + m_mouseRegion = elsewhere; + update(); + + QGLWidget::leaveEvent(event); +} + +void QGLWidebandPanel::wheelEvent(QWheelEvent* event) { + + //GRAPHICS_DEBUG << "wheelEvent"; + QPoint pos = event->pos(); + + //if (event->buttons() == Qt::NoButton) getRegion(pos); + + //double freqStep = set->getMouseWheelFreqStep(m_currentReceiver); + + //switch (m_mouseRegion) { + + // case panRegion: + + // double delta = 0; + // if (event->delta() < 0) delta = -freqStep; + // else + // if (event->delta() > 0) delta = freqStep; + + // if (m_frequency + delta > MAXHPFREQUENCY) + // m_frequency = MAXHPFREQUENCY; + // else + // if (m_frequency + delta < 0) + // m_frequency = 0; + // else + // // snap to the frequency step + // m_frequency = (long)(qRound((m_frequency + delta) / qAbs(freqStep)) * qAbs(freqStep)); + + // set->setFrequency(this, true, m_currentReceiver, m_frequency); + // break; + //} + + // //updateGL(); + //update(); +} + +void QGLWidebandPanel::mousePressEvent(QMouseEvent* event) { + + //GRAPHICS_DEBUG << "mousePressEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == freqScaleRegion) { + + m_yScaleMouseDownPos = m_freqScaleRect.topLeft(); + + if (event->buttons() == Qt::RightButton) setCursor(Qt::SplitHCursor); + update(); + + return; + } + else if (m_mouseRegion == dBmScaleRegion) { + + //m_yScaleMouseDownPos = m_dBmScaleRect.topLeft(); + + if (event->buttons() == Qt::RightButton) { + + setCursor(Qt::SplitVCursor); + m_yScaleMouseDownPos = m_dBmScaleRect.topLeft(); + } + + if (event->buttons() == Qt::LeftButton && + event->modifiers() == Qt::ControlModifier) { + + setCursor(Qt::SplitVCursor); + + m_dBmPanMinOld = m_dBmPanMin; + m_dBmPanMaxOld = m_dBmPanMax; + + m_dBmScaleOffset = 0.0; + m_calibrate = true; + } + + update(); + + return; + } + else if (m_mouseRegion == panRegion) { + + if (event->buttons() == Qt::RightButton) { + + if (m_crossHairCursor) { + + m_crossHairCursor = false; + setCursor(Qt::ArrowCursor); + } + else { + + m_crossHairCursor = true; + setCursor(Qt::BlankCursor); + } + } + else if (event->buttons() == Qt::LeftButton) { + + float unit = (float)(m_panRect.width() / (MAXHPFREQUENCY * m_freqScaleZoomFactor)); + + m_frequency = (long)(1000 * (int)(qRound(m_mousePos.x()/unit + m_lowerFrequency)/1000)); + set->setVFOFrequency(this, 1, m_currentReceiver, m_frequency); + } + update(); + + return; + } + + update(); +} + +void QGLWidebandPanel::mouseReleaseEvent(QMouseEvent *event) { + + //GRAPHICS_DEBUG << "mouseReleaseEvent"; + m_mousePos = event->pos(); + m_mouseDownPos = m_mousePos; + + getRegion(m_mousePos); + + if (m_mouseRegion == freqScaleRegion) { + + return; + } + else if (m_mouseRegion == panRegion) { + + return; + } + + if (m_calibrate) m_calibrate = false; + + update(); +} + +void QGLWidebandPanel::mouseMoveEvent(QMouseEvent* event) { + + QPoint pos = event->pos(); + m_mousePos = event->pos(); + + if (event->buttons() == Qt::NoButton) getRegion(pos); + + switch (m_mouseRegion) { + + case panRegion: + + if (m_crossHairCursor) + setCursor(Qt::BlankCursor); + else + setCursor(Qt::ArrowCursor); + + update(); + break; + + case dBmScaleRegion: + + if (event->buttons() == Qt::LeftButton && + event->modifiers() == Qt::ControlModifier) { + + QPoint dPos = m_mouseDownPos - pos; + qreal unit = (qreal)(qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height()); + qreal delta = - unit * dPos.y(); + + qreal newMin = m_dBmPanMin + delta; + qreal newMax = m_dBmPanMax + delta; + + m_dBmScaleOffset -= delta / unit; + WBGRAPHICS_DEBUG << "m_dBmScaleOffset: " << m_dBmScaleOffset; + + if (newMin > MINDBM && newMax < MAXDBM) { + + m_dBmPanMin = newMin; + m_dBmPanMax = newMax; + + //set->setWidebanddBmScaleMin(this, m_dBmPanMin); + //set->setWidebanddBmScaleMax(this, m_dBmPanMax); + } + + m_mouseDownPos = pos; + m_dBmScaleUpdate = true; + m_panGridUpdate = true; + } + else if (event->buttons() == Qt::LeftButton) { + + QPoint dPos = m_mouseDownPos - pos; + qreal unit = (qreal)(qAbs(m_dBmPanMax - m_dBmPanMin) / m_panRect.height()); + + qreal newMin = m_dBmPanMin - unit * dPos.y(); + qreal newMax = m_dBmPanMax - unit * dPos.y(); + + if (newMin > MINDBM && newMax < MAXDBM) { + + m_dBmPanMin = newMin; + m_dBmPanMax = newMax; + + set->setWidebanddBmScaleMin(this, m_dBmPanMin); + set->setWidebanddBmScaleMax(this, m_dBmPanMax); + } + + m_mouseDownPos = pos; + m_dBmScaleUpdate = true; + m_panGridUpdate = true; + } + else + if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + if (dPos.y() > 0) + m_dBmPanDelta = 1.0; + else if (dPos.y() < 0) + m_dBmPanDelta = -1.0f; + + //m_dBmPanMin += m_dBmPanDelta; + m_dBmPanMax -= m_dBmPanDelta; + + if (qAbs(m_dBmPanMax - m_dBmPanMin) < 10) { + + m_dBmPanMin -= m_dBmPanDelta; + m_dBmPanMax += m_dBmPanDelta; + } + if (m_dBmPanMin < MINDBM) m_dBmPanMin = MINDBM; + if (m_dBmPanMax > MAXDBM) m_dBmPanMax = MAXDBM; + + set->setWidebanddBmScaleMin(this, m_dBmPanMin); + set->setWidebanddBmScaleMax(this, m_dBmPanMax); + + m_mouseDownPos = pos; + m_dBmScaleUpdate = true; + m_panGridUpdate = true; + } + else + setCursor(Qt::ArrowCursor); + + update(); + break; + + case freqScaleRegion: + + if (event->buttons() == Qt::LeftButton) { + + if (m_freqScaleZoomFactor < 1.0) { + + QPoint dPos = m_mouseDownPos - pos; + + m_frequencySpan = MAXHPFREQUENCY * m_freqScaleZoomFactor; + + qreal unit = (qreal)((MAXHPFREQUENCY * m_freqScaleZoomFactor) / m_freqScaleRect.width()); + + m_lowerFrequency += unit * dPos.x(); + m_upperFrequency = m_lowerFrequency + m_frequencySpan; + + if (m_lowerFrequency < 0.0) m_lowerFrequency = 0.0; + if (m_upperFrequency > (qreal) MAXHPFREQUENCY) { + + m_upperFrequency = (qreal)MAXHPFREQUENCY; + m_lowerFrequency = (qreal)(MAXHPFREQUENCY - m_frequencySpan); + } + + m_mouseDownPos = pos; + m_freqScaleUpdate = true; + m_panGridUpdate = true; + } + else { + + m_lowerFrequency = 0.0; + m_upperFrequency = (qreal) MAXHPFREQUENCY; + } + } + else if (event->buttons() == Qt::RightButton) { + + QPoint dPos = m_mouseDownPos - pos; + + if (dPos.x() > 0) { + + m_freqScaleZoomFactor += 0.005f; + } + else if (dPos.x() < 0) + m_freqScaleZoomFactor -= 0.005f; + + if (m_freqScaleZoomFactor > 1.0) m_freqScaleZoomFactor = 1.0f; + //if (m_freqScaleZoomFactor < 0.24) m_freqScaleZoomFactor = 0.24f; + if (m_freqScaleZoomFactor < 0.15) m_freqScaleZoomFactor = 0.15f; + + qreal unit = (qreal)((MAXHPFREQUENCY * m_freqScaleZoomFactor) / m_freqScaleRect.width()); + m_lowerFrequency -= unit * dPos.x(); + m_upperFrequency = m_lowerFrequency + m_frequencySpan; + + if (m_lowerFrequency < 0.0) m_lowerFrequency = 0.0; + if (m_upperFrequency > (qreal) MAXHPFREQUENCY) { + + m_upperFrequency = (qreal)MAXHPFREQUENCY; + m_lowerFrequency = (qreal)(MAXHPFREQUENCY - m_frequencySpan); + } + + m_mouseDownPos = pos; + m_freqScaleUpdate = true; + m_panGridUpdate = true; + } + else + setCursor(Qt::ArrowCursor); + + update(); + break; + + case elsewhere: + //WBGRAPHICS_DEBUG << "elsewhere"; + + update(); + break; + } + + //if (m_oldMouseRegion != m_mouseRegion) update(); + + //m_oldMouseRegion = m_mouseRegion; + + //if (m_displayTime.elapsed() >= 50) { + + // m_displayTime.restart(); + // //updateGL(); + // update(); + //} + //setupDisplayRegions(size()); + //update(); + + //locker.unlock(); +} + +void QGLWidebandPanel::keyPressEvent(QKeyEvent* event) { + + //GRAPHICS_DEBUG << "keyPressEvent"; + if (event->key() == Qt::Key_Control) { + + //m_keyCTRLpressed = true; + //GRAPHICS_DEBUG << "m_keyCTRLpressed =" << m_keyCTRLpressed; + //printf("Ry %f\n",ry); + //ry+=10.0f; + } + else if (event->key() == Qt::Key_T) { + + //printf("Ry %f\n",ry); + //ry-=10.0f; + } + else if (event->key() == Qt::Key_P) { + + //drawTeapot = !drawTeapot; + } + else if (event->key() == Qt::Key_W) { + + //approach -= 0.1f; + } + else if (event->key() == Qt::Key_S) { + + //approach += 0.1f; + } + else { + + //m_keyCTRLpressed = false; + //GRAPHICS_DEBUG << "m_keyCTRLpressed =" << m_keyCTRLpressed; + //event->ignore(); + } + + QWidget::keyPressEvent(event); + //updateGL(); + update(); +} + +void QGLWidebandPanel::timerEvent(QTimerEvent *) { + + update(); +} + +//******************************************************************** + +void QGLWidebandPanel::setFrequency(QObject *sender, int mode, int rx, long freq) { + + Q_UNUSED (sender) + Q_UNUSED (mode) + Q_UNUSED (rx) + + m_frequency = freq; + m_freqScaleUpdate = true; + m_panGridUpdate = true; + + //updateGL(); + update(); +} + +void QGLWidebandPanel::setCurrentReceiver(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_currentReceiver = value; + update(); +} + +//void QGLWidebandPanel::computeDisplayBins(const float *panBuffer) { +// +// //int newSampleSize = 0; +// //int deltaSampleSize = 0; +// //int idx = 0; +// //int lIdx = 0; +// //int rIdx = 0; +// //qreal localMax; +// +// +// //m_panScale = (qreal)(1.0 * newSampleSize / m_panRectWidth); +// //m_scaleMultOld = m_displayData.scaleMult; +// // +// //if (m_panScale < 0.125) { +// // m_displayData.scaleMult = 0.0625; +// //} +// //else if (m_panScale < 0.25) { +// // m_displayData.scaleMult = 0.125; +// //} +// //else if (m_panScale < 0.5) { +// // m_displayData.scaleMult = 0.25; +// //} +// //else if (m_panScale < 1.0) { +// // m_displayData.scaleMult = 0.5; +// //} +// //else { +// // m_displayData.scaleMult = 1.0; +// //} +// +// //m_panSpectrumBinsLength = (GLint)(m_displayData.scaleMult * m_panRectWidth); +// +// //if (m_scaleMultOld != m_displayData.scaleMult) { +// +// // m_displayData.waterfallUpdate = true; +// //} +// +// //m_displayData.waterfallPixel.clear(); +// //m_displayData.waterfallPixel.resize(4 * m_panRectWidth); +// +// //m_displayData.panadapterBins.clear(); +// // +// //for (int i = 0; i < m_panSpectrumBinsLength; i++) { +// // +// // idx = 0; +// // lIdx = (int)floor((qreal)(i * m_panScale / m_displayData.scaleMult)); +// // rIdx = (int)floor((qreal)(i * m_panScale / m_displayData.scaleMult) + m_panScale / m_displayData.scaleMult); +// // +// // // max value; later we try mean value also! +// // localMax = -10000.0F; +// // for (int j = lIdx; j < rIdx; j++) { +// +// // if (panBuffer[j] > localMax) { +// +// // localMax = panBuffer[j]; +// // idx = j; +// // } +// // } +// // idx += deltaSampleSize/2; +// // +// // m_displayData.panadapterBins << panBuffer[idx] - m_displayData.dBmPanMin - m_dBmPanLogGain; +// +// //update(); +// ////updateGL(); +//} + +void QGLWidebandPanel::setWidebandSpectrumBuffer(const qVectorFloat &buffer) { + + //int deltaIdx; + //qreal frequencyScale; + //qreal scaleMult = 1.0; + + m_wbSpectrumBufferLength = buffer.size(); + + mutex.lock(); + m_wbSpectrumBuffer.resize(m_wbSpectrumBufferLength); + m_wbSpectrumBuffer = buffer; + + //m_scaledBufferSize = qFloor(m_wbSpectrumBufferLength * m_freqScaleZoomFactor); + mutex.unlock(); + +// deltaIdx = qFloor((qreal)(m_wbSpectrumBufferLength * (m_lowerFrequency / MAXHPFREQUENCY))); +// frequencyScale = (qreal)(1.0f * m_scaledBufferSize / width); +// +// if (frequencyScale < 0.125) +// scaleMult = 0.0625; +// else if (frequencyScale < 0.25) +// scaleMult = 0.125; +// else if (frequencyScale < 0.5) +// scaleMult = 0.25; +// else if (frequencyScale < 1.0) +// scaleMult = 0.5; + + update(); +} + +void QGLWidebandPanel::resetWidebandSpectrumBuffer() { + + m_wbSpectrumBuffer.resize(BIGWIDEBANDSIZE / 2); + m_wbSpectrumBuffer.fill(-1000.0f); +} + +void QGLWidebandPanel::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + Q_UNUSED (hwmode) + Q_UNUSED (state) + + //bool change = false; + + if (m_dataEngineState != state) { + + m_dataEngineState = state; + //change = true; + } + + //if (m_serverMode != mode) + // m_serverMode = mode; + + if (m_serverMode == mode) + return; + else { + + m_wbSpectrumBuffer.fill(-10000.0); + //memset(&m_wbSpectrumBuffer, -10000, 4 * BUFFER_SIZE * sizeof(float)); + m_serverMode = mode; + } + + //resizeGL(width(), height()); + m_displayTime.restart(); + + update(); +} + +void QGLWidebandPanel::graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode colorScheme) +{ + Q_UNUSED (sender) + //Q_UNUSED (rx) + + if (rx != -1) return; + + bool change = false; + + if (m_panMode != panMode) { + + m_panMode = panMode; + change = true; + } + + if (m_waterfallMode != colorScheme) { + + m_waterfallMode = colorScheme; + change = true; + } + + if (!change) return; + + update(); +} + + +//void QGLWidebandPanel::setSpectrumAveragingCnt(int value) { +// +// mutex.lock(); +// +// memset(m_tmpBuf, 0, SAMPLE_BUFFER_SIZE * sizeof(float)); +// +// while (!specAv_queue.isEmpty()) +// specAv_queue.dequeue(); +// +// m_specAveragingCnt = value; +// +// if (m_specAveragingCnt > 0) +// m_scale = 1.0f / m_specAveragingCnt; +// else +// m_scale = 1.0f; +// +// mutex.unlock(); +//} + +void QGLWidebandPanel::setMercuryAttenuator(QObject* sender, HamBand band, int value) { + + Q_UNUSED(sender) + Q_UNUSED(band) + + m_mercuryAttenuator = value; + update(); +} + +void QGLWidebandPanel::setPanadapterColors() { + + m_spectrumColorsChanged = true; + + mutex.lock(); + m_bkgRed = (GLfloat)(set->getPanadapterColors().panBackgroundColor.red() / 256.0); + m_bkgGreen = (GLfloat)(set->getPanadapterColors().panBackgroundColor.green() / 256.0); + m_bkgBlue = (GLfloat)(set->getPanadapterColors().panBackgroundColor.blue() / 256.0); + + m_r = (GLfloat)(set->getPanadapterColors().wideBandLineColor.red() / 256.0); + m_g = (GLfloat)(set->getPanadapterColors().wideBandLineColor.green() / 256.0); + m_b = (GLfloat)(set->getPanadapterColors().wideBandLineColor.blue() / 256.0); + + m_rf = (GLfloat)(set->getPanadapterColors().wideBandFilledColor.red() / 256.0); + m_gf = (GLfloat)(set->getPanadapterColors().wideBandFilledColor.green() / 256.0); + m_bf = (GLfloat)(set->getPanadapterColors().wideBandFilledColor.blue() / 256.0); + + m_redST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.red() / 256.0); + m_greenST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.green() / 256.0); + m_blueST = (GLfloat)(set->getPanadapterColors().panSolidTopColor.blue() / 256.0); + + m_redSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.red() / 256.0); + m_greenSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.green() / 256.0); + m_blueSB = (GLfloat)(set->getPanadapterColors().panSolidBottomColor.blue() / 256.0); + + QColor gridColor = m_gridColor; + m_gridColor = set->getPanadapterColors().gridLineColor; + + if (gridColor != m_gridColor) { + + m_redGrid = (GLfloat)(m_gridColor.red()/256.0); + m_greenGrid = (GLfloat)(m_gridColor.green()/256.0); + m_blueGrid = (GLfloat)(m_gridColor.blue()/256.0); + + m_panGridUpdate = true; + } + mutex.unlock(); + + update(); +} + +void QGLWidebandPanel::setPanGridStatus(bool value, int rx) { + + Q_UNUSED (rx) + + mutex.lock(); + + if (m_panGrid == value) + return; + else + m_panGrid = value; + + mutex.unlock(); + update(); +} + +void QGLWidebandPanel::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; + update(); +} + +void QGLWidebandPanel::freqScaleUpdate(bool value) { + + m_freqScaleUpdate = value; +} + +void QGLWidebandPanel::freqScaleRenew(bool value) { + + m_freqScaleRenew = value; +} + +void QGLWidebandPanel::dBmScaleUpdate(bool value) { + + m_dBmScaleUpdate = value; +} + +void QGLWidebandPanel::dBmScaleRenew(bool value) { + + m_dBmScaleRenew = value; +} + +void QGLWidebandPanel::panGridUpdate(bool value) { + + m_panGridUpdate = value; +} + +void QGLWidebandPanel::panGridRenew(bool value) { + + m_panGridRenew = value; +} + +void QGLWidebandPanel::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void QGLWidebandPanel::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} diff --git a/Source/src/GL/cusdr_oglWidebandPanel.h b/Source/src/GL/cusdr_oglWidebandPanel.h new file mode 100644 index 0000000..8ac563a --- /dev/null +++ b/Source/src/GL/cusdr_oglWidebandPanel.h @@ -0,0 +1,290 @@ +/** +* @file cusdr_oglWidebandPanel.h +* @brief wide band spectrum panel header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-02-11 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_OGL_WIDEBANDPANEL_H +#define _CUSDR_OGL_WIDEBANDPANEL_H + +#include "cusdr_oglUtils.h" +#include "cusdr_oglInfo.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" +#include "cusdr_oglText.h" + +//#include +//#include +//#include +#include +//#include +//#include +//#include +//#include + +#ifdef LOG_WBGRAPHICS +# define WBGRAPHICS_DEBUG qDebug().nospace() << "WB-Graphics::\t" +#else +# define WBGRAPHICS_DEBUG nullDebug() +#endif + + +class QGLWidebandPanel : public QGLWidget { + + Q_OBJECT + +public: + QGLWidebandPanel(QWidget *parent = 0); + ~QGLWidebandPanel(); + +public slots: + QSize minimumSizeHint() const; + QSize sizeHint() const; + + //void setSpectrumBuffer(const float *buffer); + //void setFrequency(QObject *sender, bool value, long freq); + +protected: + void initializeGL(); + void resizeGL(int iWidth, int iHeight); + void paintGL(); + + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent * event ); + void keyPressEvent(QKeyEvent* event); + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void timerEvent(QTimerEvent *); + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + PanGraphicsMode m_panMode; + WaterfallColorMode m_waterfallMode; + + QVector m_widebandPanSpectrumBins; + QQueue > specAv_queue; + QList m_rxDataList; + TWideband m_widebandOptions; + + QGLFramebufferObject* m_frequencyScaleFBO; + QGLFramebufferObject* m_dBmScaleFBO; + QGLFramebufferObject* m_gridFBO; + + CFonts *fonts; + TFonts m_fonts; + + QTime m_panTimer; + QTime m_displayTime; + QTime m_resizeTime; + + QRect m_panRect; + QRect m_freqScaleRect; + QRect m_dBmScaleRect; + + QMutex mutex; + + OGLText *m_oglTextTiny; + OGLText *m_oglTextSmall; + OGLText *m_oglTextNormal; + + QPoint m_mousePos; + QPoint m_oldMousePos; + QPoint m_mouseLastPos; + QPoint m_mouseDownPos; + QPoint m_yScaleMouseDownPos; + QPoint m_cameraAngle; + + TScale m_frequencyScale; + TScale m_dBmScale; + + QColor m_gridColor; + + GLfloat m_redGrid; + GLfloat m_greenGrid; + GLfloat m_blueGrid; + + GLfloat m_r; + GLfloat m_g; + GLfloat m_b; + + GLfloat m_rf; + GLfloat m_gf; + GLfloat m_bf; + + GLfloat m_redST; + GLfloat m_greenST; + GLfloat m_blueST; + + GLfloat m_redSB; + GLfloat m_greenSB; + GLfloat m_blueSB; + + GLfloat m_bkgRed; + GLfloat m_bkgGreen; + GLfloat m_bkgBlue; + + enum Region { + + panRegion, + freqScaleRegion, + dBmScaleRegion, + elsewhere, + out + }; + + long m_frequency; + + qreal m_dBmPanMin; + qreal m_dBmPanMax; + qreal m_dBmPanMinOld; + qreal m_dBmPanMaxOld; + + + qVectorFloat m_wbSpectrumBuffer; + + float m_scale; + float m_distMax; + + bool m_spectrumUpdate; + bool m_freqScaleUpdate; + bool m_freqScaleRenew; + bool m_dBmScaleUpdate; + bool m_dBmScaleRenew; + bool m_panGridUpdate; + bool m_panGridRenew; + bool m_spectrumColorsChanged; + bool m_spectrumVertexColorUpdate; + bool m_crossHairCursor; + bool m_panGrid; + bool m_calibrate; + + int m_receiver; + int m_oldWidth; + int m_oldHeight; + int m_oldPanRectHeight; + int m_cnt; + int m_specAveragingCnt; + int m_mercuryAttenuator; + int m_dBmScaleTextPos; + int m_wbSpectrumBufferLength; + int m_scaledBufferSize; + + float m_cameraDistance; + + unsigned int timer; + + GLint m_panRectWidth; + GLint m_panSpectrumBinsLength; + + int m_mouseRegion; + int m_oldMouseRegion; + int m_snapMouse; + + int m_currentReceiver; + int m_freqScaleWidth; + int m_displayTop; + int m_dBmPanLogGain; + int m_panDisplayMode; + int m_sampleRate; + int m_downRate; + + float m_freqScalePosition; + float m_freqScaleZoomFactor; + + qreal m_dBmPanDelta; + qreal m_dBmScaleOffset; + qreal m_panScale; + qreal m_scaleMultOld; + qreal m_panFrequencyScale; + qreal m_frequencySpan; + qreal m_frequencyUnit; + qreal m_lowerFrequency; + qreal m_upperFrequency; + + //****************************************************************** + void saveGLState(); + void restoreGLState(); + //void computeDisplayBins(const float* panBuffer); + + void drawSpectrum(); + void drawVerticalScale(); + void drawHorizontalScale(); + void drawGrid(); + void drawCrossHair(); + void drawHamBand(int lo, int hi, const QString &band); + + void renderVerticalScale(); + void renderHorizontalScale(); + void renderGrid(); + +private slots: + void systemStateChanged( + QObject* sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject* sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setupConnections(); + void setCurrentReceiver(QObject *sender, int value); + void setFrequency(QObject *sender, int mode, int rx, long freq); + void setupDisplayRegions(QSize size); + void setWidebandSpectrumBuffer(const qVectorFloat &buffer); + void resetWidebandSpectrumBuffer(); + //void setSpectrumAveragingCnt(int value); + void setPanadapterColors(); + void setPanGridStatus(bool value, int rx); + void setMercuryAttenuator(QObject* sender, HamBand band, int value); + + void getRegion(QPoint p); + void sampleRateChanged(QObject* sender, int value); + void freqScaleUpdate(bool value); + void freqScaleRenew(bool value); + void dBmScaleUpdate(bool value); + void dBmScaleRenew(bool value); + void panGridUpdate(bool value); + void panGridRenew(bool value); + +signals: + void showEvent(QObject* sender); + void closeEvent(QObject* sender); + void messageEvent(QString msg); + void coordChanged(int x, int y); +}; + +#endif // _CUSDR_OGL_WIDEBANDPANEL_H diff --git a/Source/src/QtDSP/fftw3.h b/Source/src/QtDSP/fftw3.h new file mode 100644 index 0000000..6fabb7e --- /dev/null +++ b/Source/src/QtDSP/fftw3.h @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * + * The following statement of license applies *only* to this header file, + * and *not* to the other files distributed with FFTW or derived therefrom: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/***************************** NOTE TO USERS ********************************* + * + * THIS IS A HEADER FILE, NOT A MANUAL + * + * If you want to know how to use FFTW, please read the manual, + * online at http://www.fftw.org/doc/ and also included with FFTW. + * For a quick start, see the manual's tutorial section. + * + * (Reading header files to learn how to use a library is a habit + * stemming from code lacking a proper manual. Arguably, it's a + * *bad* habit in most cases, because header files can contain + * interfaces that are not part of the public, stable API.) + * + ****************************************************************************/ + +#ifndef FFTW3_H +#define FFTW3_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* If is included, use the C99 complex type. Otherwise + define a type bit-compatible with C99 complex */ +#if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +# define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C +#else +# define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2] +#endif + +#define FFTW_CONCAT(prefix, name) prefix ## name +#define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name) +#define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name) +#define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name) +#define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name) + +/* IMPORTANT: for Windows compilers, you should add a line +*/ +#define FFTW_DLL +/* + here and in kernel/ifftw.h if you are compiling/using FFTW as a + DLL, in order to do the proper importing/exporting, or + alternatively compile with -DFFTW_DLL or the equivalent + command-line flag. This is not necessary under MinGW/Cygwin, where + libtool does the imports/exports automatically. */ +#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__)) + /* annoying Windows syntax for shared-library declarations */ +# if defined(COMPILING_FFTW) /* defined in api.h when compiling FFTW */ +# define FFTW_EXTERN extern __declspec(dllexport) +# else /* user is calling FFTW; import symbol */ +# define FFTW_EXTERN extern __declspec(dllimport) +# endif +#else +# define FFTW_EXTERN extern +#endif + +enum fftw_r2r_kind_do_not_use_me { + FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, + FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, + FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 +}; + +struct fftw_iodim_do_not_use_me { + int n; /* dimension size */ + int is; /* input stride */ + int os; /* output stride */ +}; + +#include /* for ptrdiff_t */ +struct fftw_iodim64_do_not_use_me { + ptrdiff_t n; /* dimension size */ + ptrdiff_t is; /* input stride */ + ptrdiff_t os; /* output stride */ +}; + +typedef void (*fftw_write_char_func_do_not_use_me)(char c, void *); +typedef int (*fftw_read_char_func_do_not_use_me)(void *); + +/* + huge second-order macro that defines prototypes for all API + functions. We expand this macro for each supported precision + + X: name-mangling macro + R: real data type + C: complex data type +*/ + +#define FFTW_DEFINE_API(X, R, C) \ + \ +FFTW_DEFINE_COMPLEX(R, C); \ + \ +typedef struct X(plan_s) *X(plan); \ + \ +typedef struct fftw_iodim_do_not_use_me X(iodim); \ +typedef struct fftw_iodim64_do_not_use_me X(iodim64); \ + \ +typedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind); \ + \ +typedef fftw_write_char_func_do_not_use_me X(write_char_func); \ +typedef fftw_read_char_func_do_not_use_me X(read_char_func); \ + \ +FFTW_EXTERN void X(execute)(const X(plan) p); \ + \ +FFTW_EXTERN X(plan) X(plan_dft)(int rank, const int *n, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_1d)(int n, C *in, C *out, int sign, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_2d)(int n0, int n1, \ + C *in, C *out, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_3d)(int n0, int n1, int n2, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_many_dft)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru64_split_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN void X(execute_dft)(const X(plan) p, C *in, C *out); \ +FFTW_EXTERN void X(execute_split_dft)(const X(plan) p, R *ri, R *ii, \ + R *ro, R *io); \ + \ +FFTW_EXTERN X(plan) X(plan_many_dft_r2c)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_r2c)(int rank, const int *n, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_r2c_2d)(int n0, int n1, \ + R *in, C *out, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_r2c_3d)(int n0, int n1, \ + int n2, \ + R *in, C *out, unsigned flags); \ + \ + \ +FFTW_EXTERN X(plan) X(plan_many_dft_c2r)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_c2r)(int rank, const int *n, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_c2r_2d)(int n0, int n1, \ + C *in, R *out, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_c2r_3d)(int n0, int n1, \ + int n2, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_split_dft_r2c)( \ + int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru_split_dft_c2r)( \ + int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_dft_r2c)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru64_dft_c2r)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_split_dft_r2c)( \ + int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru64_split_dft_c2r)( \ + int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN void X(execute_dft_r2c)(const X(plan) p, R *in, C *out); \ +FFTW_EXTERN void X(execute_dft_c2r)(const X(plan) p, C *in, R *out); \ + \ +FFTW_EXTERN void X(execute_split_dft_r2c)(const X(plan) p, \ + R *in, R *ro, R *io); \ +FFTW_EXTERN void X(execute_split_dft_c2r)(const X(plan) p, \ + R *ri, R *ii, R *out); \ + \ +FFTW_EXTERN X(plan) X(plan_many_r2r)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_r2r)(int rank, const int *n, R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_r2r_1d)(int n, R *in, R *out, \ + X(r2r_kind) kind, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_r2r_2d)(int n0, int n1, R *in, R *out, \ + X(r2r_kind) kind0, X(r2r_kind) kind1, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_r2r_3d)(int n0, int n1, int n2, \ + R *in, R *out, X(r2r_kind) kind0, \ + X(r2r_kind) kind1, X(r2r_kind) kind2, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_r2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_r2r)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN void X(execute_r2r)(const X(plan) p, R *in, R *out); \ + \ +FFTW_EXTERN void X(destroy_plan)(X(plan) p); \ +FFTW_EXTERN void X(forget_wisdom)(void); \ +FFTW_EXTERN void X(cleanup)(void); \ + \ +FFTW_EXTERN void X(set_timelimit)(double t); \ + \ +FFTW_EXTERN void X(plan_with_nthreads)(int nthreads); \ +FFTW_EXTERN int X(init_threads)(void); \ +FFTW_EXTERN void X(cleanup_threads)(void); \ + \ +FFTW_EXTERN int X(export_wisdom_to_filename)(const char *filename); \ +FFTW_EXTERN void X(export_wisdom_to_file)(FILE *output_file); \ +FFTW_EXTERN char *X(export_wisdom_to_string)(void); \ +FFTW_EXTERN void X(export_wisdom)(X(write_char_func) write_char, \ + void *data); \ +FFTW_EXTERN int X(import_system_wisdom)(void); \ +FFTW_EXTERN int X(import_wisdom_from_filename)(const char *filename); \ +FFTW_EXTERN int X(import_wisdom_from_file)(FILE *input_file); \ +FFTW_EXTERN int X(import_wisdom_from_string)(const char *input_string); \ +FFTW_EXTERN int X(import_wisdom)(X(read_char_func) read_char, void *data); \ + \ +FFTW_EXTERN void X(fprint_plan)(const X(plan) p, FILE *output_file); \ +FFTW_EXTERN void X(print_plan)(const X(plan) p); \ + \ +FFTW_EXTERN void *X(malloc)(size_t n); \ +FFTW_EXTERN R *X(alloc_real)(size_t n); \ +FFTW_EXTERN C *X(alloc_complex)(size_t n); \ +FFTW_EXTERN void X(free)(void *p); \ + \ +FFTW_EXTERN void X(flops)(const X(plan) p, \ + double *add, double *mul, double *fmas); \ +FFTW_EXTERN double X(estimate_cost)(const X(plan) p); \ +FFTW_EXTERN double X(cost)(const X(plan) p); \ + \ +FFTW_EXTERN const char X(version)[]; \ +FFTW_EXTERN const char X(cc)[]; \ +FFTW_EXTERN const char X(codelet_optim)[]; + + +/* end of FFTW_DEFINE_API macro */ + +FFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex) +FFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex) +FFTW_DEFINE_API(FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex) + +/* __float128 (quad precision) is a gcc extension on i386, x86_64, and ia64 + for gcc >= 4.6 (compiled in FFTW with --enable-quad-precision) */ +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) \ + && !(defined(__ICC) || defined(__INTEL_COMPILER)) \ + && (defined(__i386__) || defined(__x86_64__) || defined(__ia64__)) +# if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +/* note: __float128 is a typedef, which is not supported with the _Complex + keyword in gcc, so instead we use this ugly __attribute__ version. + However, we can't simply pass the __attribute__ version to + FFTW_DEFINE_API because the __attribute__ confuses gcc in pointer + types. Hence redefining FFTW_DEFINE_COMPLEX. Ugh. */ +# undef FFTW_DEFINE_COMPLEX +# define FFTW_DEFINE_COMPLEX(R, C) typedef _Complex float __attribute__((mode(TC))) C +# endif +FFTW_DEFINE_API(FFTW_MANGLE_QUAD, __float128, fftwq_complex) +#endif + +#define FFTW_FORWARD (-1) +#define FFTW_BACKWARD (+1) + +#define FFTW_NO_TIMELIMIT (-1.0) + +/* documented flags */ +#define FFTW_MEASURE (0U) +#define FFTW_DESTROY_INPUT (1U << 0) +#define FFTW_UNALIGNED (1U << 1) +#define FFTW_CONSERVE_MEMORY (1U << 2) +#define FFTW_EXHAUSTIVE (1U << 3) /* NO_EXHAUSTIVE is default */ +#define FFTW_PRESERVE_INPUT (1U << 4) /* cancels FFTW_DESTROY_INPUT */ +#define FFTW_PATIENT (1U << 5) /* IMPATIENT is default */ +#define FFTW_ESTIMATE (1U << 6) +#define FFTW_WISDOM_ONLY (1U << 21) + +/* undocumented beyond-guru flags */ +#define FFTW_ESTIMATE_PATIENT (1U << 7) +#define FFTW_BELIEVE_PCOST (1U << 8) +#define FFTW_NO_DFT_R2HC (1U << 9) +#define FFTW_NO_NONTHREADED (1U << 10) +#define FFTW_NO_BUFFERING (1U << 11) +#define FFTW_NO_INDIRECT_OP (1U << 12) +#define FFTW_ALLOW_LARGE_GENERIC (1U << 13) /* NO_LARGE_GENERIC is default */ +#define FFTW_NO_RANK_SPLITS (1U << 14) +#define FFTW_NO_VRANK_SPLITS (1U << 15) +#define FFTW_NO_VRECURSE (1U << 16) +#define FFTW_NO_SIMD (1U << 17) +#define FFTW_NO_SLOW (1U << 18) +#define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19) +#define FFTW_ALLOW_PRUNING (1U << 20) + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FFTW3_H */ diff --git a/Source/src/QtDSP/qtdsp_agc.cpp b/Source/src/QtDSP/qtdsp_agc.cpp new file mode 100644 index 0000000..69a22c9 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_agc.cpp @@ -0,0 +1,303 @@ +/** +* @file qtdsp_agc.cpp +* @brief AGC class for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-14 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for cuSDR by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "qtdsp_agc.h" + +#include + +QAGC::QAGC(QObject *parent, int size) + : QObject(parent) + , set(Settings::instance()) + , m_size(size) + , m_mask(size * 2) + , m_index(0) + , m_sndex(0) + , m_hangIndex(0) + , m_fastIndex(FASTLEAD) + , m_fastHang(0) + , m_samplerate(set->getSampleRate()) + //, m_agcMode(agcMED) + , m_gainTop(qPow(10.0f, 120.0f/20.0f)) + , m_gainNow(1.0f) + , m_gainFastNow(1.0f) + , m_gainBottom(.001f) + , m_gainLimit(1.0f) + //, m_gainFix(pow(10.0, 60.0/20.0)) + , m_gainFix(qPow(10.0f, 80.0f/20.0f)) + , m_attack(0.0f) + , m_oneMAttack(0.0f) + , m_decay(0.0f) + , m_oneMDecay(0.0f) + , m_slope(1.0f) + , m_fastAttack(0.0f) + , m_oneMFastAttack(0.0f) + , m_fastDecay(0.0f) + , m_oneMFastDecay(0.0f) + , m_hangTime(480.0f * 0.001f) + , m_hangThresh(0.001f) + , m_fastHangTime(48.0f * 0.001f) +{ + setAttack(1.0); + setDecay(1.0); + setMode(agcMED); + + m_fastAttack = 1.0 - qExp(-1000.0 / (0.2f * m_samplerate)); + m_oneMFastAttack = qExp(-1000.0 / (0.2 * m_samplerate)); + + m_fastDecay = 1.0 - qExp(-1000.0 / (3.0 * m_samplerate)); + m_oneMFastDecay = qExp(-1000.0 / (3.0 * m_samplerate)); + + InitCPX(G, m_mask, 0.0f); + + m_mask -= 1; +} + +QAGC::~QAGC() { + + G.clear(); +} + +void QAGC::ProcessAGC(const CPX &in, CPX &out, int size) { + + if (m_agcMode == agcOFF) { + + for (int i = 0; i < size; i++) + out[i] = ScaleCPX(in[i], m_gainFix); + + //memcpy(out.data(), in.data(), size * sizeof(cpx)); + return; + } + + unsigned int hangTime = (unsigned int)(m_samplerate * m_hangTime); + unsigned int fastHangTime = (unsigned int)(m_samplerate * m_fastHangTime); + + float hangThresh = 0.0; + + if (m_hangThresh > 0.0) + hangThresh = m_gainTop * m_hangThresh + m_gainBottom * (1.0 - m_hangThresh); + + for (int i = 0; i < m_size; i++) { + + G[m_index] = in.at(i); + + float tmp = 1.1 * SqrMagCPX(G.at(m_index)); + + if (tmp == 0.0) + tmp = m_gainNow; + else + tmp = m_gainLimit / tmp; + + if (tmp < hangThresh) + m_hangIndex = hangTime; + + if (tmp > m_gainNow) { + + if (m_hangIndex++ > (qint16)hangTime) + m_gainNow = m_oneMDecay * m_gainNow + m_decay * qMin(m_gainTop, tmp); + } + else { + + m_hangIndex = 0; + m_gainNow = m_oneMAttack * m_gainNow + m_attack * qMax(tmp, m_gainBottom); + } + + tmp = 1.2 * SqrMagCPX(G[m_fastIndex]); + + if (tmp != 0.0) + tmp = m_gainLimit / tmp; + else + tmp = m_gainFastNow; + + if (tmp > m_gainFastNow) { + + if (m_fastHang++ > (qint16)fastHangTime) + m_gainFastNow = qMin(m_oneMFastDecay * m_gainFastNow + m_fastDecay * qMin(m_gainTop, tmp), m_gainTop); + } + else { + + m_fastHang = 0; + m_gainFastNow = qMax(m_oneMFastAttack * m_gainFastNow + m_fastAttack * qMax(tmp, m_gainBottom), m_gainBottom); + } + + m_gainFastNow = qMax(qMin(m_gainFastNow, m_gainTop), m_gainBottom); + m_gainNow = qMax(qMin(m_gainNow, m_gainTop), m_gainBottom); + + out[i].re = Scale(G.at(m_sndex).re, qMin(m_gainFastNow, qMin(m_slope * m_gainNow, m_gainTop))); + out[i].im = Scale(G.at(m_sndex).im, qMin(m_gainFastNow, qMin(m_slope * m_gainNow, m_gainTop))); + + m_index = (m_index + m_mask) & m_mask; + m_sndex = (m_sndex + m_mask) & m_mask; + + m_fastIndex = (m_fastIndex + m_mask) & m_mask; + } +} + +void QAGC::setMode(AGCMode mode) { + + mutex.lock(); + m_agcMode = mode; + + switch (mode) { + + case agcOFF: + break; + + case agcSLOW: + + m_hangTime = 0.5; + m_fastHangTime = 0.1F; + m_decay = 1.0 - qExp(-2.0 / m_samplerate); + m_oneMDecay = 1.0 - m_decay; + break; + + case agcMED: + + m_hangTime = 0.25; + m_fastHangTime = 0.1f; + m_decay = 1.0 - qExp(-4.0 / m_samplerate); + m_oneMDecay = 1.0 - m_decay; + break; + + case agcFAST: + + m_hangTime = 0.1f; + m_fastHangTime = 0.1f; + m_decay = 1.0 - qExp(-10.0 / m_samplerate); + m_oneMDecay = 1.0 - m_decay; + break; + + case agcLONG: + m_hangTime = 0.75; + m_fastHangTime = 0.1f; + m_decay = 1.0 - qExp(-0.5 / m_samplerate); + m_oneMDecay = 1.0 - m_decay; + break; + + case agcUser: + break; + } + mutex.unlock(); +} + +float QAGC::gain() const { + + return 20.0 * log10(m_gainNow); +} + +void QAGC::setGain(float gain) { + + mutex.lock(); + m_gainNow = qPow(10.0, gain/20.0); + mutex.unlock(); +} + +float QAGC::fastGain() const { + + return 20.0 * log10(m_gainFastNow); +} + +float QAGC::hangTime() const { + + return m_hangTime / 0.001; +} + +void QAGC::setHangTime(float time) { + + mutex.lock(); + m_hangTime = time * 0.001; + mutex.unlock(); +} + +float QAGC::gainTop() const { + + return 20.0 * log10(m_gainTop); +} + +void QAGC::setGainTop(float gain) { + + mutex.lock(); + m_gainTop = qPow(10.0, gain/20.0); + mutex.unlock(); +} + +float QAGC::gainBottom() const { + + return 20.0 * log10(m_gainBottom); +} + +void QAGC::setGainBottom(float gain) { + + mutex.lock(); + m_gainBottom = qPow(10.0, gain/20.0); + mutex.unlock(); +} + +float QAGC::attack() const { return m_attack; } + +void QAGC::setAttack(float attack) { + + mutex.lock(); + m_attack = 1.0 - qExp(-1000.0 / (attack * m_samplerate)); + m_oneMAttack = qExp (-1000.0 / (attack * m_samplerate)); + + m_sndex = (m_index + (int)(0.003 * m_samplerate * attack)) & m_mask; + m_fastIndex = (m_sndex + FASTLEAD * m_mask) & m_mask; + + m_fastHangTime = 0.1f; + mutex.unlock(); +} + +float QAGC::decay() const { + + return m_decay; +} + +void QAGC::setDecay(float decay) { + + mutex.lock(); + m_decay = 1.0 - qExp(-1000.0 / (decay * m_samplerate)); + m_oneMDecay = qExp(-1000.0 / (decay * m_samplerate)); + mutex.unlock(); +} + +float QAGC::fixedGain() const { + + return 20.0 * log10(m_gainFix); +} + +void QAGC::setFixedGain(float gain) { + + mutex.lock(); + m_gainFix = qPow(10.0, gain/20.0); + mutex.unlock(); +} + +inline float QAGC::Scale(float in_val, float scalevalue) { + + return in_val * scalevalue; +} diff --git a/Source/src/QtDSP/qtdsp_agc.h b/Source/src/QtDSP/qtdsp_agc.h new file mode 100644 index 0000000..425494f --- /dev/null +++ b/Source/src/QtDSP/qtdsp_agc.h @@ -0,0 +1,116 @@ +/** +* @file qtdsp_agc.h +* @brief AGC header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-14 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_AGC_H +#define _QTDSP_AGC_H + +#include "qtdsp_qComplex.h" +#include "../cusdr_settings.h" + +//#include +//#include + +const int FASTLEAD = 72; + + +class QAGC : public QObject { + + Q_OBJECT + +public: + QAGC(QObject *parent = 0, int size = 0); + ~QAGC(); + + //void ProcessAGC(CPX* in, CPX* out, int size); + void ProcessAGC(const CPX &in, CPX &out, int size); + + //AGCMode Mode() const; + + float gain() const; + float fastGain() const; + float hangTime() const; + float gainTop() const; + float gainBottom() const; + float attack() const; + float decay() const; + float fixedGain() const; + + void setGain(float gain); + void setHangTime(float time); + void setGainTop(float gain); + void setGainBottom(float gain); + void setAttack(float attack); + void setDecay(float decay); + void setFixedGain(float gain); + +public slots: + void setMode(AGCMode mode); + +private: + Settings *set; + + QMutex mutex; + + //TReceiver m_rxData; + AGCMode m_agcMode; + + CPX G; + + int m_size; + + qint16 m_mask; + qint16 m_index; + qint16 m_sndex; + qint16 m_hangIndex; + qint16 m_fastIndex; + qint16 m_fastHang; + + float m_samplerate; + float m_gainTop; + float m_gainNow; + float m_gainFastNow; + float m_gainBottom; + float m_gainLimit; + float m_gainFix; + float m_attack; + float m_oneMAttack; + float m_decay; + float m_oneMDecay; + float m_slope; + float m_fastAttack; + float m_oneMFastAttack; + float m_fastDecay; + float m_oneMFastDecay; + float m_hangTime; + float m_hangThresh; + float m_fastHangTime; + + float Scale(float in_val, float scalevalue); +}; + +#endif // _QTDSP_AGC_H diff --git a/Source/src/QtDSP/qtdsp_demodulation.cpp b/Source/src/QtDSP/qtdsp_demodulation.cpp new file mode 100644 index 0000000..c7983ea --- /dev/null +++ b/Source/src/QtDSP/qtdsp_demodulation.cpp @@ -0,0 +1,274 @@ +/** +* @file qtdsp_demodulation.cpp +* @brief Demodulation class for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-20 +*/ + +/* + * Copyright (C) 2007, 2008 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "qtdsp_demodulation.h" + + +Demodulation::Demodulation(QObject *parent, int size) + : QObject(parent) + , set(Settings::instance()) + , m_mode((DSPMode) LSB) + , m_size(size) + , m_samplerate((float)set->getSampleRate()) + , m_phase(0.0f) + , m_delay_real(0.0f) + , m_delay_imag(1.0f) + , m_alpha(0.3f * 500.0f * TWOPI / m_samplerate) + , m_beta(m_alpha * m_alpha * 0.25f) + , m_lockcurrent(0.5f) + , m_lockprevious(1.0f) + , m_dc(0.0f) + , m_afc(0.0f) + , m_cvt(0.45f * m_samplerate / (ONEPI * 500.0)) + , m_smooth(0.0f) + , m_twopi_over_sr(TWOPI/m_samplerate) + , m_cvt_sr_mult((0.45f * m_samplerate) / ONEPI) + , m_pll_lo_limit(-1000.0f) + , m_pll_hi_limit(1000.0f) + , m_pll_bandwidth(500.0f) + , m_pll_frequency(0.0f) +{ + setDemodMode((DSPMode) LSB); + + delay0.re = 0.0f; + delay0.im = 0.0f; + tmp0.re = 0.0f; + tmp0.im = 0.0f; +} + +Demodulation::~Demodulation() { + +} + +void Demodulation::ProcessBlock(CPX &in, CPX &out, int bsize) { + + Q_UNUSED(bsize) + + switch(m_mode) { + + case (DSPMode) AM: + + DoMagnitude(in, out); + break; + + case (DSPMode) SAM: + + DoSAM(in, out); + break; + + case (DSPMode)FMN: + + DoFMN(in, out); + break; + + //case (DSPMode) FMW: + + //DoFMN(in, out); + //break; + + default: + + memcpy(out.data(), in.data(), sizeof(cpx) * m_size); + break; + } +} + +inline void Demodulation::DoMagnitude(CPX &in, CPX &out) { + + for (int i = 0; i < m_size; i++) { + + float magn = SqrMagCPX(in.at(i)); + + out[i].re = magn; + out[i].im = magn; + } +} + +void Demodulation::DoSAM(CPX &in, CPX &out ) { + + float difference; + + for (int i = 0; i < m_size; i++) { + + tmp0.re = qCos(m_phase); + tmp0.im = qSin(m_phase); + + delay0.re = tmp0.re * in.at(i).re + tmp0.im * in.at(i).im; + delay0.im = -tmp0.im * in.at(i).re + tmp0.re * in.at(i).im; + + if ((delay0.im) == 0.0 && (delay0.re == 0.0)) { + + delay0.re = 0.000000000001; + } + + difference = sqrt(in.at(i).re * in.at(i).re + in.at(i).im * in.at(i).im) * (qAtan2(delay0.im, delay0.re)); + + m_pll_frequency += m_beta * difference; + + if (m_pll_frequency < m_pll_lo_limit) + m_pll_frequency = m_pll_lo_limit; + + if (m_pll_frequency > m_pll_hi_limit) + m_pll_frequency = m_pll_hi_limit; + + m_phase += m_pll_frequency + m_alpha * difference; + + while (m_phase >= TWOPI) + m_phase -= TWOPI; + + while (m_phase < 0) + m_phase += TWOPI; + + m_lockcurrent = 0.999 * m_lockcurrent + 0.001 * qAbs(delay0.re); + m_lockprevious = m_lockcurrent; + m_dc = (0.999 * m_dc) + (0.001 * delay0.re); + + out[i].re = delay0.re - m_dc; + out[i].im = out.at(i).re; + } +} + +void Demodulation::DoFMN(CPX &in, CPX &out ) { + + float difference; + + for (int i = 0; i < m_size; i++) { + + tmp0.re = qCos(m_phase); + tmp0.im = qSin(m_phase); + + delay0.re = tmp0.re * in.at(i).re + tmp0.im * in.at(i).im; + delay0.im = -tmp0.im * in.at(i).re + tmp0.re * in.at(i).im; + + if ((delay0.im) == 0.0 && (delay0.re == 0.0)) { + + delay0.re = 0.000000000001; + } + difference = qAtan2(delay0.im, delay0.re); + + m_pll_frequency += m_beta * difference; + + if (m_pll_frequency < m_pll_lo_limit) + m_pll_frequency = m_pll_lo_limit; + if (m_pll_frequency > m_pll_hi_limit) + m_pll_frequency = m_pll_hi_limit; + + m_phase += m_pll_frequency + m_alpha * difference; + + while (m_phase >= TWOPI) + m_phase -= TWOPI; + while (m_phase < 0) + m_phase += TWOPI; + + m_afc = 0.99 * m_afc + 0.01 * m_pll_frequency; + out[i].re = (m_pll_frequency - m_afc) * m_cvt; + out[i].im = out.at(i).re; + } +} + +void Demodulation::DoFMW(CPX &in, CPX &out ) { + + memcpy(out.data(), in.data(), sizeof(CPX) * m_size); +} + +void Demodulation::setDemodMode(DSPMode mode) { + + m_mode = mode; + switch(m_mode) { + + case AM: // AM + break; + + case SAM: // SAM + + m_pll_bandwidth = 500.0; + m_alpha = 0.3 * m_pll_bandwidth * m_twopi_over_sr; + m_beta = m_alpha * m_alpha * 0.25; + m_cvt = m_cvt_sr_mult / m_pll_bandwidth; + break; + + case FMN: // FMN + + m_pll_bandwidth = 10000.0; + m_alpha = 0.3 * m_pll_bandwidth * m_twopi_over_sr; + m_beta = m_alpha * m_alpha * 0.25; + m_cvt = m_cvt_sr_mult / m_pll_bandwidth; + break; + +// case dmFMW: // FMW +// m_pll_bandwidth = 90000.0; +// m_alpha = 0.3 * m_pll_bandwidth * m_twopi_over_sr; +// m_beta = m_alpha * m_alpha * 0.25; +// m_cvt = m_cvt_sr_mult / m_pll_bandwidth; +// break; + + case CWL: + break; + + case CWU: + break; + + case DIGL: + break; + + case DIGU: + break; + + case DSB: + break; + + case LSB: + break; + + case USB: + break; + + default: + //std::cout << "Unknown mode:" << m_mode << std::endl; + break; + } +} + +DSPMode Demodulation::demodMode() const { + + return m_mode; +} + +void Demodulation::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_samplerate = value; + + m_alpha = 0.3f * 500.0f * TWOPI / m_samplerate; + m_beta = m_alpha * m_alpha * 0.25f; + + m_cvt = 0.45f * m_samplerate / (ONEPI * 500.0f); + m_twopi_over_sr = TWOPI / m_samplerate; + m_cvt_sr_mult = (0.45f * m_samplerate) / ONEPI; +} diff --git a/Source/src/QtDSP/qtdsp_demodulation.h b/Source/src/QtDSP/qtdsp_demodulation.h new file mode 100644 index 0000000..10a301b --- /dev/null +++ b/Source/src/QtDSP/qtdsp_demodulation.h @@ -0,0 +1,90 @@ +/** +* @file qtdsp_demodulation.h +* @brief Demodulation header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-20 +*/ + +/* + * Copyright (C) 2007, 2008 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_DEMODULATION_H +#define _QTDSP_DEMODULATION_H + +#include +#include "qtdsp_qComplex.h" +#include "../cusdr_settings.h" + + +class Demodulation : public QObject { + + Q_OBJECT + +public: + Demodulation(QObject *parent = 0, int size = 0); + ~Demodulation(); + + void ProcessBlock(CPX &in, CPX &out, int bsize); + + DSPMode demodMode() const; + +public slots: + void setDemodMode(DSPMode mode); + void setSampleRate(QObject *sender, int value); + +private: + Settings *set; + + cpx tmp0; + cpx delay0; + + DSPMode m_mode; + + int m_size; + + float m_samplerate; + float m_phase; + float m_delay_real; + float m_delay_imag; + float m_alpha; + float m_beta; + float m_lockcurrent; + float m_lockprevious; + float m_dc; + float m_afc; + float m_cvt; + float m_smooth; + float m_twopi_over_sr; + float m_cvt_sr_mult; + float m_pll_lo_limit; + float m_pll_hi_limit; + float m_pll_bandwidth; + float m_pll_frequency; + + + void DoMagnitude(CPX &in, CPX &out); + void DoSAM(CPX &in, CPX &out); + void DoFMN(CPX &in, CPX &out); + void DoFMW(CPX &in, CPX &out); +}; + +#endif // _QTDSP_DEMODULATION_H + diff --git a/Source/src/QtDSP/qtdsp_dspEngine.cpp b/Source/src/QtDSP/qtdsp_dspEngine.cpp new file mode 100644 index 0000000..65d89c4 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_dspEngine.cpp @@ -0,0 +1,392 @@ +/** +* @file qtdsp_dspEngine.cpp +* @brief QtDSP DSP engine class +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-04-07 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * The ProcessFrequencyShift method is adpated from cuteSDR by (C) Moe Wheatley, AE4JY. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#define LOG_DSP_ENGINE + +// use: DSP_ENGINE_DEBUG << "debug message"; + +#include "qtdsp_dspEngine.h" + + +QDSPEngine::QDSPEngine(QObject *parent, int rx, int size) + : QObject(parent) + , set(Settings::instance()) + , m_qtdspOn(false) + , m_rx(rx) + , m_size(size) + , m_samplerate(set->getSampleRate()) + , m_fftMultiplcator(1) + , m_volume(0.0f) +{ + qRegisterMetaType >(); + qRegisterMetaType(); + + fft = new QFFT(m_size); + filter = new QFilter(this, m_size, 2, 12);//8); + wpagc = new QWPAGC(this, m_size); + spectrum = new PowerSpectrum(this, m_size*2); + + QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait"; + set->setSystemMessage(str.arg(m_rx), 0); + + if (m_rx == 0) { + + spectrum2 = new PowerSpectrum(this, m_size*4); + + str = "Initializing DSP engine for rx %1: 16k FFT ...please wait"; + set->setSystemMessage(str.arg(m_rx), 0); + spectrum4 = new PowerSpectrum(this, m_size*8); + + str = "Initializing DSP engine for rx %1: 32k FFT ...please wait"; + set->setSystemMessage(str.arg(m_rx), 0); + spectrum8 = new PowerSpectrum(this, m_size*16); + } + + m_spectrumSize = m_size*4; + + signalmeter = new SignalMeter(this, m_size); + demod = new Demodulation(this, m_size); + + + m_rxData = set->getReceiverDataList().at(rx); + m_agcMode = m_rxData.agcMode; + + wpagc->setReceiver(m_rx); + + InitCPX(tmp1CPX, m_size, 0.0f); + InitCPX(tmp2CPX, m_size, 0.0f); + + osc1cpx.re = 1.0f; + osc1cpx.im = 0.0f; + + m_NcoInc = 0.0; + m_NcoTime = 0.0; + m_NcoFreq = 0.0; + m_CWoffset = 0.0; + + //DSP_ENGINE_DEBUG << "set NCO to " << m_rxData.vfoFrequency - m_rxData.ctrFrequency; + setNCOFrequency(m_rx, m_rxData.vfoFrequency - m_rxData.ctrFrequency); + + DSP_ENGINE_DEBUG << "init DSPEngine with size: " << m_size; + SleeperThread::msleep(100); + + setupConnections(); +} + +QDSPEngine::~QDSPEngine() { + + tmp1CPX.clear(); + tmp2CPX.clear(); + + //if (agc) + // delete agc; + + if (fft) + delete fft; + + if (filter) + delete filter; + + if (wpagc) + delete wpagc; + + if (spectrum) + delete spectrum; + + if (signalmeter) + delete signalmeter; + + if (demod) + delete demod; +} + +void QDSPEngine::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(ncoFrequencyChanged(int, long)), + this, + SLOT(setNCOFrequency(int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleSizeChanged(int, int)), + this, + SLOT(setSampleSize(int, int))); + + CHECKED_CONNECT( + wpagc, + SIGNAL(agcMaximumGainChanged(qreal)), + this, + SLOT(setAGCMaximumGain(qreal))); + + CHECKED_CONNECT( + wpagc, + SIGNAL(agcHangThresholdChanged(qreal)), + this, + SLOT(setAGCHangThreshold(qreal))); + +// CHECKED_CONNECT( +// wpagc, +// SIGNAL(hangLeveldBLineChanged(qreal)), +// this, +// SLOT(setAGCHangLeveldBLine(qreal))); +// +// CHECKED_CONNECT( +// wpagc, +// SIGNAL(minimumVoltageChanged(QObject *, int, qreal)), +// this, +// SLOT(setAGCThresholdLine(QObject *, int, qreal))); + + CHECKED_CONNECT( + wpagc, + SIGNAL(displayValues(QObject *, int, qreal, qreal)), + this, + SLOT(setAGCLineValues(QObject *, int, qreal, qreal))); +} + +void QDSPEngine::processDSP(CPX &in, CPX &out, int size) { + + m_mutex.lock(); + + switch (m_fftMultiplcator) { + + case 1: + spectrum->ProcessSpectrum(in, size*2, 1); + break; + + case 2: + spectrum2->ProcessSpectrum(in, size*4, 3); + break; + + case 4: + spectrum4->ProcessSpectrum(in, size*8, 7); + break; + + case 8: + spectrum8->ProcessSpectrum(in, size*16, 15); + break; + } + + if (m_NcoFreq != 0) + ProcessFrequencyShift(in, in, size); + + filter->ProcessFilter(in, tmp1CPX, size); + signalmeter->ProcessBlock(tmp1CPX, size); + wpagc->ProcessAGC(tmp1CPX, tmp2CPX, size); + demod->ProcessBlock(tmp2CPX, out, size); + + //memcpy(out.data(), in.data(), size * sizeof(cpx)); + //out = in; + + for (int i = 0; i < size; i++) { + + out[i] = ScaleCPX(out.at(i), m_volume); + } + m_mutex.unlock(); +} + +int QDSPEngine::getSpectrum(qVectorFloat &buffer, int mult) { + + if (m_rx == 0) { + + m_fftMultiplcator = mult; + switch (m_fftMultiplcator) { + + case 1: + return spectrum->spectrumResult(buffer, 0); + break; + + case 2: + return spectrum2->spectrumResult(buffer, 2048); + break; + + case 4: + return spectrum4->spectrumResult(buffer, 6144); + break; + + case 8: + return spectrum8->spectrumResult(buffer, 14336); + break; + + default: + return spectrum->spectrumResult(buffer, 0); + break; + } + } + else { + + return spectrum->spectrumResult(buffer, 0); + } +} + +float QDSPEngine::getSMeterInstValue() { + + return signalmeter->getInstFValue(); +} + +void QDSPEngine::setVolume(float value) { + + if (m_volume == value) return; + + m_volume = value; +} + +void QDSPEngine::setQtDSPStatus(bool value) { + + m_qtdspOn = value; +} + +void QDSPEngine::setDSPMode(DSPMode mode) { + + demod->setDemodMode(mode); +} + +void QDSPEngine::setAGCMode(AGCMode mode) { + + wpagc->setMode(mode); +} + +void QDSPEngine::setAGCMaximumGain(qreal value) { + + qreal maxGain = 20.0 * log10(value); + set->setAGCMaximumGain_dB(this, m_rx, maxGain); +} + +void QDSPEngine::setAGCHangThreshold(qreal value) { + + set->setAGCHangThresholdSlider(this, m_rx, value); +} + +void QDSPEngine::setAGCLineValues(QObject *sender, int rx, qreal thresh, qreal hang) { + + if (m_rx != rx) return; + + qreal noiseOffset = 10.0 * log10(qAbs(filter->filterHi() - filter->filterLo()) * 2 * m_size / m_samplerate); + qreal threshold = 20.0 * log10(thresh) - noiseOffset + AGCOFFSET; + + set->setAGCLineLevels(sender, m_rx, threshold, hang + AGCOFFSET); +} + +void QDSPEngine::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (m_samplerate == value) return; + + m_mutex.lock(); + switch (value) { + + case 48000: + m_samplerate = value; + break; + + case 96000: + m_samplerate = value; + break; + + case 192000: + m_samplerate = value; + break; + + case 384000: + m_samplerate = value; + break; + + default: + DSP_ENGINE_DEBUG << "invalid sample rate (possible values are: 48, 96, 192, or 384 kHz)!\n"; + break; + } + + //DSP_ENGINE_DEBUG << "set sample rate to " << m_samplerate; + //setNCOFrequency(m_rx, m_rxData.vfoFrequency - m_rxData.ctrFrequency); + m_NcoInc = TWOPI * m_NcoFreq/m_samplerate; + m_OscCos = qCos(m_NcoInc); + m_OscSin = qSin(m_NcoInc); + + filter->setSampleRate(this, m_samplerate); + demod->setSampleRate(this, m_samplerate); + wpagc->setSampleRate(this, m_samplerate); + + m_mutex.unlock(); + +} + +void QDSPEngine::setNCOFrequency(int rx, long ncoFreq) { + + if (m_rx != rx) return; + + qreal tmp = ncoFreq + m_CWoffset; + + m_NcoFreq = tmp; + m_NcoInc = TWOPI * m_NcoFreq/m_samplerate; + m_OscCos = qCos(m_NcoInc); + m_OscSin = qSin(m_NcoInc); + + //DSP_ENGINE_DEBUG << "NCO: " << m_NcoFreq; +} + +void QDSPEngine::setSampleSize(int rx, int size) { + + Q_UNUSED(rx) + + if (m_rx == 0) { + + m_mutex.lock(); + m_spectrumSize = size; + m_mutex.unlock(); + } +} + +void QDSPEngine::ProcessFrequencyShift(CPX &in, CPX &out, int size) { + + cpx tmp; + CPX Osc; + + Osc.resize(size); + + for (int i = 0; i < size; i++) { + + tmp = in.at(i); + + qreal OscGn; + Osc[i].re = osc1cpx.re * m_OscCos - osc1cpx.im * m_OscSin; + Osc[i].im = osc1cpx.im * m_OscCos + osc1cpx.re * m_OscSin; + + OscGn = 1.95 - (osc1cpx.re * osc1cpx.re + osc1cpx.im * osc1cpx.im); + + osc1cpx.re = OscGn * Osc.at(i).re; + osc1cpx.im = OscGn * Osc.at(i).im; + + //Cpx multiply by shift frequency + out[i].re = ((tmp.re * Osc.at(i).re) - (tmp.im * Osc.at(i).im)); + out[i].im = ((tmp.re * Osc.at(i).im) + (tmp.im * Osc.at(i).re)); + } +} + diff --git a/Source/src/QtDSP/qtdsp_dspEngine.h b/Source/src/QtDSP/qtdsp_dspEngine.h new file mode 100644 index 0000000..c6fc4ac --- /dev/null +++ b/Source/src/QtDSP/qtdsp_dspEngine.h @@ -0,0 +1,133 @@ +/** +* @file qtdsp_dspEngine.h +* @brief header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-04-07 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_DSP_ENGINE_H +#define _QTDSP_DSP_ENGINE_H + +#define AGCOFFSET -18.0//-63.0 + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +#include "../cusdr_settings.h" +#include "qtdsp_qComplex.h" +#include "qtdsp_filter.h" +#include "qtdsp_fft.h" +#include "qtdsp_wpagc.h" +#include "qtdsp_powerSpectrum.h" +#include "qtdsp_signalMeter.h" +#include "qtdsp_demodulation.h" + + +#ifdef LOG_DSP_ENGINE +# define DSP_ENGINE_DEBUG qDebug().nospace() << "DSPEngine::\t" +#else +# define DSP_ENGINE_DEBUG nullDebug() +#endif + + +class QDSPEngine : public QObject { + + Q_OBJECT + +public: + QDSPEngine(QObject* parent = 0, int rx = 0, int size = 0); + ~QDSPEngine(); + + QFFT* fft; + QFilter* filter; + QWPAGC* wpagc; + PowerSpectrum* spectrum; + PowerSpectrum* spectrum2; + PowerSpectrum* spectrum4; + PowerSpectrum* spectrum8; + SignalMeter* signalmeter; + Demodulation* demod; + + void processDSP(CPX &in, CPX &out, int size); + + int getSpectrum(qVectorFloat &buffer, int mult); + float getSMeterInstValue(); + +public slots: + bool getQtDSPStatus() { return m_qtdspOn; } + + void setNCOFrequency(int rx, long value); + void setSampleRate(QObject *sender, int value); + void setSampleSize(int rx, int size); + void setQtDSPStatus(bool value); + void setVolume(float value); + void setDSPMode(DSPMode mode); + void setAGCMode(AGCMode mode); + +private: + Settings* set; + TReceiver m_rxData; + AGCMode m_agcMode; + + CPX tmp1CPX; + CPX tmp2CPX; + cpx osc1cpx; + + QMutex m_mutex; + + bool m_qtdspOn; + + int m_rx; + int m_size; + int m_spectrumSize; + int m_samplerate; + int m_fftMultiplcator; + + float m_volume; + qreal m_NcoFreq; + qreal m_NcoInc; + qreal m_NcoTime; + qreal m_CWoffset; + qreal m_OscCos; + qreal m_OscSin; + //qreal m_calOffset; + + void ProcessFrequencyShift(CPX &in, CPX &out, int size); + void setupConnections(); + +private slots: + void setAGCMaximumGain(qreal); + void setAGCHangThreshold(qreal); + //void setAGCHangLeveldBLine(qreal value); + //void setAGCThresholdLine(QObject *sender, int rx, qreal value); + void setAGCLineValues(QObject *sender, int rx, qreal thresh, qreal hang); +}; + +#endif // _QTDSP_DSP_ENGINE_H diff --git a/Source/src/QtDSP/qtdsp_dualModeAverager.cpp b/Source/src/QtDSP/qtdsp_dualModeAverager.cpp new file mode 100644 index 0000000..4f01f04 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_dualModeAverager.cpp @@ -0,0 +1,116 @@ +/** +* @file qtdsp_dualModeAverager.cpp +* @brief Dual mode averager class for QtDSP; + Dual-Mode Averaging implmemented following "Understanding Digital Signal Processing" by Richard G. Lyons, 3rd ed., p.791 +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-07-12 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "qtdsp_dualModeAverager.h" + +DualModeAverager::DualModeAverager(int rx, int size) + : QObject() + , set(Settings::instance()) + , m_receiver(rx) + , m_size(size) + , m_length(set->getSpectrumAveragingCnt(m_receiver)) +{ + m_tmp.resize(m_size); + m_tmp.fill(-20.0); + + cnt = 0; + k = 1.0f/m_length; + + CHECKED_CONNECT( + set, + SIGNAL(spectrumAveragingCntChanged(QObject*, int, int)), + this, + SLOT(setAveragingLength(QObject*, int, int))); + + /*CHECKED_CONNECT( + set, + SIGNAL(widebandAveragingCntChanged(QObject*, int)), + this, + SLOT(setWidebandAveragingLength(QObject*, int)));*/ +} + +DualModeAverager::~DualModeAverager() { + + m_tmp.clear(); +} + +void DualModeAverager::ProcessDBAverager(qVectorFloat &in, qVectorFloat &out) { + + mutex.lock(); + if (cnt < m_length) { + + for (int i = 0; i < m_size; i++) + out[i] = m_tmp.at(i) + k * in.at(i); + + cnt++; + } + else { + + for (int i = 0; i < m_size; i++) + out[i] = m_tmp.at(i) + k * (in.at(i) - m_tmp.at(i)); + } + mutex.unlock(); + + m_tmp = out; +} + +void DualModeAverager::setAveragingLength(QObject* sender, int rx, int value) { + + Q_UNUSED (sender) + + if (m_receiver != rx) return; + + mutex.lock(); + m_length = value; + k = 1.0f/m_length; + cnt = 0; + + m_tmp.fill(0.0f); + mutex.unlock(); +} + +//void DualModeAverager::setWidebandAveragingLength(QObject* sender, int value) { +// +// Q_UNUSED (sender) +// +// mutex.lock(); +// m_length = value; +// k = 1.0f/m_length; +// cnt = 0; +// +// m_tmp.fill(0.0f); +// mutex.unlock(); +//} + +void DualModeAverager::clearBuffer() { + + m_tmp.clear(); + m_tmp.resize(m_size); + m_tmp.fill(-20.0); + +} diff --git a/Source/src/QtDSP/qtdsp_dualModeAverager.h b/Source/src/QtDSP/qtdsp_dualModeAverager.h new file mode 100644 index 0000000..b463e66 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_dualModeAverager.h @@ -0,0 +1,64 @@ +/** +* @file qtdsp_dualModeAverager.h +* @brief Dual mode averager header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-07-12 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_DUAL_MODE_AVERAGER_H +#define _QTDSP_DUAL_MODE_AVERAGER_H + +#include + +#include "../cusdr_settings.h" + +class DualModeAverager : public QObject { + + Q_OBJECT + +public: + DualModeAverager(int rx = 0, int size = 0); + ~DualModeAverager(); + + void ProcessDBAverager(qVectorFloat &in, qVectorFloat &out); + void clearBuffer(); + //void setAveragingLength(int value); + +private: + Settings* set; + QMutex mutex; + qVectorFloat m_tmp; + + int m_receiver; + int m_size; + int m_length; + int cnt; + + float k; + +private slots: + void setAveragingLength(QObject* sender, int rx, int value); + //void setWidebandAveragingLength(QObject* sender, int value); +}; + +#endif // _QTDSP_DUAL_MODE_AVERAGER_H diff --git a/Source/src/QtDSP/qtdsp_fft.cpp b/Source/src/QtDSP/qtdsp_fft.cpp new file mode 100644 index 0000000..afdf060 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_fft.cpp @@ -0,0 +1,90 @@ +/** +* @file qtdsp_fft.cpp +* @brief QFFT FFTW class for QtDSP +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "qtdsp_fft.h" +#include + +#include + +QFFT::QFFT(int size) + : QObject() + , m_size(size) + , half_sz(size/2) +{ + cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * m_size); + plan_fwd = fftwf_plan_dft_1d(m_size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_MEASURE); + plan_rev = fftwf_plan_dft_1d(m_size , cpxbuf, cpxbuf, FFTW_BACKWARD, FFTW_MEASURE); + + memset(cpxbuf, 0, m_size * sizeof(cpxbuf)); + + InitCPX(buf, m_size, 0.0f); +} + +QFFT::~QFFT() { + + fftwf_destroy_plan(plan_fwd); + fftwf_destroy_plan(plan_rev); + + if (cpxbuf) + fftwf_free(cpxbuf); + + buf.clear(); +} + +void QFFT::DoFFTWForward(CPX &in, CPX &out, int size) { + memcpy(cpxbuf, in.data(), sizeof(cpx) * size); + fftwf_execute(plan_fwd); + memcpy(out.data(), cpxbuf, sizeof(cpx) * size); +} + + +void QFFT::DoFFTWInverse(CPX &in, CPX &out, int size) { + + memcpy(cpxbuf, in.data(), sizeof(cpx) * size); + fftwf_execute(plan_rev); + memcpy(out.data(), cpxbuf, sizeof(cpx) * size); +} + + +void QFFT::DoFFTWMagnForward(CPX &in, int size, float baseline, float correction, float *fbr) { + + memcpy(cpxbuf, in.data(), sizeof(cpx) * size); + + fftwf_execute(plan_fwd); + + for (int i = 0, j = size-1; i < size; i++, j--) { + + *(buf.data()+j) = *(cpx *)(cpxbuf+i); + } + + for (int i = 0, j = half_sz; i < half_sz; i++, j++) { + + *(fbr+i) = 10.0 * log10(MagCPX(*(buf.data()+j)) + baseline) + correction; + *(fbr+j) = 10.0 * log10(MagCPX(*(buf.data()+i)) + baseline) + correction; + } +} diff --git a/Source/src/QtDSP/qtdsp_fft.cpp.orig b/Source/src/QtDSP/qtdsp_fft.cpp.orig new file mode 100644 index 0000000..7924358 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_fft.cpp.orig @@ -0,0 +1,91 @@ +/** +* @file qtdsp_fft.cpp +* @brief QFFT FFTW class for QtDSP +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "qtdsp_fft.h" +#include + +#include + +QFFT::QFFT(int size) + : QObject() + , m_size(size) + , half_sz(size/2) +{ + cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * m_size); + plan_fwd = fftwf_plan_dft_1d(m_size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_MEASURE); + plan_rev = fftwf_plan_dft_1d(m_size , cpxbuf, cpxbuf, FFTW_BACKWARD, FFTW_MEASURE); + + memset(cpxbuf, 0, m_size * sizeof(cpxbuf)); + + InitCPX(buf, m_size, 0.0f); +} + +QFFT::~QFFT() { + + fftwf_destroy_plan(plan_fwd); + fftwf_destroy_plan(plan_rev); + + if (cpxbuf) + fftwf_free(cpxbuf); + + buf.clear(); +} + +void QFFT::DoFFTWForward(CPX &in, CPX &out, int size) { + + memcpy(cpxbuf, in.data(), sizeof(cpx) * size); + fftwf_execute(plan_fwd); + memcpy(out.data(), cpxbuf, sizeof(cpx) * size); +} + + +void QFFT::DoFFTWInverse(CPX &in, CPX &out, int size) { + + memcpy(cpxbuf, in.data(), sizeof(cpx) * size); + fftwf_execute(plan_rev); + memcpy(out.data(), cpxbuf, sizeof(cpx) * size); +} + + +void QFFT::DoFFTWMagnForward(CPX &in, int size, float baseline, float correction, float *fbr) { + + memcpy(cpxbuf, in.data(), sizeof(cpx) * size); + + fftwf_execute(plan_fwd); + + for (int i = 0, j = size-1; i < size; i++, j--) { + + *(buf.data()+j) = *(cpx *)(cpxbuf+i); + } + + for (int i = 0, j = half_sz; i < half_sz; i++, j++) { + + *(fbr+i) = 10.0 * log10(MagCPX(*(buf.data()+j)) + baseline) + correction; + *(fbr+j) = 10.0 * log10(MagCPX(*(buf.data()+i)) + baseline) + correction; + } +} diff --git a/Source/src/QtDSP/qtdsp_fft.h b/Source/src/QtDSP/qtdsp_fft.h new file mode 100644 index 0000000..99c883f --- /dev/null +++ b/Source/src/QtDSP/qtdsp_fft.h @@ -0,0 +1,64 @@ +/** +* @file qtdsp_fft.h +* @brief QFFT header FFTW for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_FFT_H +#define _QTDSP_FFT_H + +#include + +#include +#include "fftw3.h" +#include "qtdsp_qComplex.h" + + +class QFFT : public QObject { + + Q_OBJECT + +public: + QFFT(int size = 0); + ~QFFT(); + +public slots: + void DoFFTWForward(CPX &in, CPX &out, int size); + void DoFFTWInverse(CPX &in, CPX &out, int size); + void DoFFTWMagnForward(CPX &in, int size, float baseline, float correction, float* fbr); + +private: + fftwf_complex *cpxbuf; + + fftwf_plan plan_fwd; + fftwf_plan plan_rev; + + CPX buf; + + int m_size; + int half_sz; +}; + +#endif // _QTDSP_FFT_H diff --git a/Source/src/QtDSP/qtdsp_fft.h.orig b/Source/src/QtDSP/qtdsp_fft.h.orig new file mode 100644 index 0000000..33dc713 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_fft.h.orig @@ -0,0 +1,64 @@ +/** +* @file qtdsp_fft.h +* @brief QFFT header FFTW for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_FFT_H +#define _QTDSP_FFT_H + +#include + +#include +#include +#include "qtdsp_qComplex.h" + + +class QFFT : public QObject { + + Q_OBJECT + +public: + QFFT(int size = 0); + ~QFFT(); + +public slots: + void DoFFTWForward(CPX &in, CPX &out, int size); + void DoFFTWInverse(CPX &in, CPX &out, int size); + void DoFFTWMagnForward(CPX &in, int size, float baseline, float correction, float* fbr); + +private: + fftwf_complex *cpxbuf; + + fftwf_plan plan_fwd; + fftwf_plan plan_rev; + + CPX buf; + + int m_size; + int half_sz; +}; + +#endif // _QTDSP_FFT_H diff --git a/Source/src/QtDSP/qtdsp_filter.cpp b/Source/src/QtDSP/qtdsp_filter.cpp new file mode 100644 index 0000000..6242645 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_filter.cpp @@ -0,0 +1,682 @@ +/** +* @file qtdsp_filter.cpp +* @brief Filter class for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + + +#include "qtdsp_filter.h" + +//#include + +#define LOG_QTDSP_FILTER + +// use: FILTER_DEBUG + +#ifndef NULL +#define NULL 0 +#endif + + +QFilter::QFilter(QObject *parent, int size, const int ftype, const int wtype) + : QObject(parent) + , set(Settings::instance()) + , m_streamMode(true) + , m_size(size) + , m_ftype(ftype) + , m_wtype(wtype) + , m_samplerate(set->getSampleRate()) + , m_filter_lo(-3050.0f) + , m_filter_hi(-150.0f) +{ + InitCPX(ovlp, m_size, 0.0f); + InitCPX(tmp, m_size, 0.0f); + InitCPX(res, m_size, 0.0f); + InitCPX(filter, m_size * 2, 0.0f); + InitCPX(tmp0, m_size * 2, 0.0f); + InitCPX(tmp1, m_size * 2, 0.0f); + InitCPX(tmp2, m_size * 2, 0.0f); + InitCPX(tmpfilt0, m_size * 2, 0.0f); + InitCPX(tmpfilt1, m_size * 2, 0.0f); + + ovlpfft = new QFFT(m_size * 2); + filtfft = new QFFT(m_size * 2); + + MakeFilter(m_filter_lo, m_filter_hi, m_ftype, m_wtype); +} + +QFilter::~QFilter() { + + if (ovlpfft) delete ovlpfft; + if (filtfft) delete filtfft; + + ovlp.clear(); + filter.clear(); + tmpfilt0.clear(); + tmpfilt1.clear(); + tmp.clear(); + tmp0.clear(); + tmp1.clear(); + +} + +void QFilter::DoConvolutionCPX() { + + mutex.lock(); + for (int i = 0; i < m_size * 2; i++) //convolution in frequency space here + { + tmp0[i].re = (filter.at(i).re * tmp1.at(i).re) - (filter.at(i).im * tmp1.at(i).im); + tmp0[i].im = (filter.at(i).re * tmp1.at(i).im) + (filter.at(i).im * tmp1.at(i).re); + } + mutex.unlock(); +} + +void QFilter::DoOverlapAddCPX() { + + //SSEAddCPX(tmp0, tmp1, ovlp, m_size); + for (int i = 0; i < m_size; i++) { + + //tmp0[i] = AddCPX(tmp1.at(i), ovlp.at(i)); + //ovlp[i] = tmp1.at(i + m_size); + res[i] = AddCPX(tmp2.at(i), ovlp.at(i)); + ovlp[i] = tmp2.at(i + m_size); + } +} + +void QFilter::ProcessFilter(CPX &in, CPX &out, int bsize) { + + Q_UNUSED (bsize) + + memcpy(tmp0.data(), in.data(), sizeof(cpx) * m_size); + ovlpfft->DoFFTWForward(tmp0, tmp1, m_size * 2); + DoConvolutionCPX(); + ovlpfft->DoFFTWInverse(tmp0, tmp1, m_size * 2); + + if (m_streamMode) { + + //Normalize(tmp1, tmp2, m_size * 2); + + // Overlap-Add + for (int i = 0; i < m_size; i++) { + + out[i] = AddCPX(tmp1.at(i), ovlp.at(i)); + ovlp[i] = tmp1.at(i + m_size); + } + //DoOverlapAddCPX(); + //Normalize(tmp0, out, m_size * 2); + //memcpy(out.data(), res.data(), sizeof(cpx) * m_size); + } + else { + + memcpy(out.data(), tmp1.data(), sizeof(cpx) * m_size); + } +} + +void QFilter::ProcessChirpFilter(CPX &in, CPX &out, int bsize) { + + Q_UNUSED(in) + Q_UNUSED(out) + Q_UNUSED(bsize) +} + +void QFilter::ProcessForwardFilter(CPX &in, CPX &out, int bsize) { + + Q_UNUSED (bsize) + + //memcpy(tmp0, in, sizeof(CPX) * m_size); + memcpy(tmp0.data(), in.data(), sizeof(cpx) * m_size); + ovlpfft->DoFFTWForward(tmp0, tmp1, m_size * 2); + + DoConvolutionCPX(); + //ovlpfft->DoFFTWInverse(tmp0, tmp1, m_size * 2); + + if (m_streamMode) { + + DoOverlapAddCPX(); + //memcpy(out, tmp0, sizeof(CPX) * m_size); + memcpy(out.data(), tmp0.data(), sizeof(cpx) * m_size); + } + else { + + //memcpy(out, tmp1, sizeof(CPX) * m_size); + memcpy(out.data(), tmp1.data(), sizeof(cpx) * m_size); + } +} + +int QFilter::ProcessAndDecimate(CPX &in, CPX &out, int bsize) { + + Q_UNUSED(in) + Q_UNUSED(bsize) + + //memset(tmp0, 0, sizeof(CPX) * m_size * 2); + //memset(tmp1, 0, sizeof(CPX) * m_size * 2); + //memcpy(tmp0, in, sizeof(CPX) * m_size); + tmp0.resize(m_size * 2); + tmp1.resize(m_size * 2); + tmp0.resize(m_size); + + ovlpfft->DoFFTWForward(tmp0, tmp1, m_size * 2); + DoConvolutionCPX(); + ovlpfft->DoFFTWInverse(tmp0, tmp1, m_size * 2); + + if (m_streamMode) { + + DoOverlapAddCPX(); + for (int i = 0, j = 0; i < m_size; i+=2, j++) { + + *(out.data()+j) = *(tmp0.data()+i); + } + } + else { + + for (int i = 0, j = 0; i < m_size; i+=2, j++) { + + *(out.data()+j) = *(tmp1.data()+i); + } + } + return m_size/2; +} + +void QFilter::Normalize(CPX &in, CPX &out, int size) { + + float norm = 1.0f/size; + for (int i = 0; i < size; i++) { + + out[i].re = in.at(i).re * norm; + out[i].im = in.at(i).im * norm; + } +} + +void QFilter::Decimate(CPX &in, CPX &out, int downrate) { + + int newsize = qRound((float) m_size/downrate); + + //memset(out, 0, newsize * sizeof(CPX)); + //memset(tmp, 0, m_size * sizeof(CPX)); + out.resize(newsize); + tmp.resize(m_size); + //memcpy(tmp, in, m_size * sizeof(CPX)); + memcpy(tmp.data(), in.data(), m_size * sizeof(cpx)); + + for (int j = 0; j < newsize; j++) { + for (int k = 0; k < downrate; k++) { + //for (int k = 0; k < downrate - 1; k++) { + + if (j * downrate + k < m_size) { + + out[j].re += tmp.at(j * downrate + k).re; + out[j].im += tmp.at(j * downrate + k).im; + } + } + } +} + +void QFilter::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_samplerate = (float)value; + //FILTER_DEBUG << "set sample rate to " << m_samplerate; + MakeFilter(m_filter_lo, m_filter_hi, m_ftype, m_wtype); +} + +void QFilter::setFilterLo(const float value) { + + if (value != m_filter_lo) { + + m_filter_lo = value; + MakeFilter(m_filter_lo, m_filter_hi, m_ftype, m_wtype); + } +} + +void QFilter::setFilterHi(const float value) { + + if (value != m_filter_hi) { + + m_filter_hi = value; + MakeFilter(m_filter_lo, m_filter_hi, m_ftype, m_wtype); + } +} + +void QFilter::setFilter(const float loval, const float hival) { + + if (m_filter_lo != loval || m_filter_hi != hival) { + + m_filter_lo = loval; + m_filter_hi = hival; + MakeFilter(m_filter_lo, m_filter_hi, m_ftype, m_wtype); + } +} + +float QFilter::filterLo() const { + + return m_filter_lo; +} + +float QFilter::filterHi() const { + + return m_filter_hi; +} + +int QFilter::isStreamMode() const { + + return m_streamMode; +} + +void QFilter::setStreamMode(int value) { + + m_streamMode = value; +} + +void QFilter::MakeFilter(const float lo, const float hi, const int ftype = 2, const int wtype = 12) { + + // size x 4 adjusts for no gain + //float one_over_norm = 1.0 / (m_size * 4); + float one_over_norm = 1.0 / (m_size * 2); + + filter.resize(m_size * 2); + tmpfilt0.resize(m_size * 2); + tmpfilt1.resize(m_size * 2); + + switch (ftype) { + + case 1: // lowpass + MakeFirLowpass( hi, + m_samplerate, + wtype, + tmpfilt0, + m_size); + break; + case 2: // bandpass + MakeFirBandpass(lo, + hi, + m_samplerate, + wtype, + tmpfilt0, + m_size); + break; + case 3: // loadable coeff + LoadFilter(tmpfilt0); + break; + case 4: // bandstop + MakeFirBandstop(lo, + hi, + m_samplerate, + tmpfilt0, + m_size); + break; + default: + MakeFirBandpass(lo, + hi, + m_samplerate, + wtype, + tmpfilt0, + m_size); + break; + } + + mutex.lock(); + //filtfft->DoFFTWForward(tmpfilt0, tmpfilt1, m_size * 2); + filtfft->DoFFTWForward(tmpfilt0, filter, m_size * 2); + + for (int i = 0; i < m_size * 2; i++) { + + filter[i].re *= one_over_norm; + filter[i].im *= one_over_norm; + } + mutex.unlock(); + + // Do compensation here instead of in inverse FFT + //filter_mutex.lock(); + //SSEScaleCPX(filter, tmpfilt1, one_over_norm, m_size * 2); + //filter_mutex.unlock(); +} + +//void QFilter::LoadFilter(CPX * taps) { +void QFilter::LoadFilter(CPX &taps) { + + if (FILTERCOEFFSIZE > m_size) return; + + for (int i = 0; i < FILTERCOEFFSIZE; i++) { + + taps[i].re = FILTERCOEFF[i]; + taps[i].im = FILTERCOEFF[i]; + } +} + +void QFilter::MakeFirLowpass(float cutoff, + float samplerate, + int wtype, + float *taps_re, + float *taps_im, + int length) +{ + + //float window[length]; + float * window = 0; + + float fc = cutoff / samplerate; + + if (fc > 0.5) + return; + + int midpoint = length >> 1; + + window = (float *)malloc(length * sizeof(float)); + + if (!window) return; + + MakeWindow(wtype, length, &window[0]); + + for (int i = 1; i <= length; i++) { + + int j = i - 1; + if (i != midpoint) { + + taps_re[j] = (sin(TWOPI * (i - midpoint) * fc) / (ONEPI * (i - midpoint))) * window[j]; + taps_im[j] = (cos(TWOPI * (i - midpoint) * fc) / (ONEPI * (i - midpoint))) * window[j]; + } + else { + + taps_re[midpoint - 1] = 2.0 * fc; + taps_im[midpoint - 1] = 2.0 * fc; + } + } + free(window); +} + +void QFilter::MakeFirLowpass(float cutoff, + float samplerate, + int wtype, + CPX &taps, + int length) +{ + + //float window[length]; + float * window = 0; + + float fc = cutoff / samplerate; + + if (fc > 0.5) + return; + + int midpoint = length >> 1; + + window = (float *)malloc(length * sizeof(float)); + + if (!window) + return; + + MakeWindow(wtype, length, &window[0]); + + for (int i = 1; i <= length; i++) { + + int j = i - 1; + if (i != midpoint) { + + taps[j].re = (sin(TWOPI * (i - midpoint) * fc) / (ONEPI * (i - midpoint))) * window[j]; + taps[j].im = (cos(TWOPI * (i - midpoint) * fc) / (ONEPI * (i - midpoint))) * window[j]; + } + else { + + taps[midpoint - 1].re = 2.0 * fc; + //taps[midpoint - 1].re = 2.0 * fc; + taps[midpoint - 1].im = 2.0 * fc; + } + } + free(window); +} + +void QFilter::MakeFirBandpass(float lo, + float hi, + float samplerate, + int wtype, + float * taps_re, + float * taps_im, + int length) +{ + + //float window[length]; + float * window = 0; + + float fl = lo / samplerate; + float fh = hi / samplerate; + float fc = (fh - fl) / 2.0; + float ff = (fl + fh) * ONEPI; + + int midpoint = length >> 1; + + window = (float *)malloc(length * sizeof(float)); + + if (!window) return; + + MakeWindow(wtype, length, &window[0]); + + for (int i = 1; i <= length; i++) { + + int j = i - 1; + int k = i - midpoint; + float temp = 0.0; + float phase = k * ff * -1; + if (i != midpoint) + temp = ((sin(TWOPI * k * fc) / (ONEPI * k))) * window[j]; + else + temp = 2.0 * fc; + temp *= 2.0; + taps_re[j] = temp * (cos(phase)); + taps_im[j] = temp * (sin(phase)); + } + free(window); +} + +void QFilter::MakeFirBandpass(float lo, + float hi, + float samplerate, + int wtype, + CPX &taps, + int length) +{ + + //float window[length]; + float *window = 0; + + float fl = lo / samplerate; + float fh = hi / samplerate; + float fc = (fh - fl) / 2.0f; + float ff = (fl + fh) * ONEPI; + + int midpoint = length >> 1; + + window = (float *)malloc(length * sizeof(float)); + + if (!window) return; + + MakeWindow(wtype, length, &window[0]); + + for (int i = 1; i <= length; i++) { + + int j = i - 1; + int k = i - midpoint; + float temp = 0.0; + float phase = k * ff * -1; + + if (i != midpoint) + temp = ((qSin(TWOPI * k * fc) / (ONEPI * k))) * window[j]; + else + temp = 2.0 * fc; + + temp *= 2.0; + + taps[j].re = temp * (qCos(phase)); + taps[j].im = temp * (qSin(phase)); + } + free(window); +} + +void QFilter::MakeFirBandstop(float lo, float hi, float samplerate, CPX &taps, int length) { + + //float window[length]; + float * window = 0; + + float fl = lo / samplerate; + float fh = hi / samplerate; + float fc = (fh - fl) / 2.0; + float ff = (fl + fh) * ONEPI; + + int midpoint = (length >> 1) | 1; + + window = (float *)malloc(length * sizeof(float)); + + if (!window) return; + + MakeWindow(12, length, &window[0]); + + for (int i = 1; i <= length; i++) { + + int j = i - 1; + int k = i - midpoint; + float temp = 0.0; + float phase = k * ff * -1.0; + + if (i != midpoint) { + + temp = ((sin(TWOPI * k * fc) / (ONEPI * k))) * window[j]; + taps[j].re = -2.0 * temp * (cos(phase)); + taps[j].im = -2.0 * temp * (sin(phase)); + } + else { + + temp = 4.0 * fc; + taps[midpoint - 1].re = 1.0 - taps[midpoint - 1].re; + taps[midpoint - 1].im = 0.0 - taps[midpoint - 1].im; + } + } + free(window); +} + +void QFilter::MakeWindow(int wtype, int size, float *window) { + + int i, j, midn, midp1, midm1; + float freq, rate, sr1, angle, expn, expsum, cx, two_pi; + + midn = size / 2; + midp1 = (size + 1) / 2; + midm1 = (size - 1) / 2; + two_pi = 8.0f * qAtan(1.0); + freq = two_pi / size; + rate = 1.0 / midn; + angle = 0.0; + expn = log(2.0) / midn + 1.0; + expsum = 1.0; + + switch (wtype) { + + case 1: // RECTANGULAR_WINDOW + for (i = 0; i < size; i++) + window[i] = 1.0; + break; + case 2: // HANNING_WINDOW + for (i = 0, j = size - 1, angle = 0.0; i <= midn; i++, j--, angle += freq) + window[j] = (window[i] = 0.5 - 0.5 * cos(angle)); + break; + case 3: // WELCH_WINDOW + for (i = 0, j = size - 1; i <= midn; i++, j--) + window[j] = (window[i] = 1.0 - (float)sqrt((float)((i - midm1) / midp1))); + break; + case 4: // PARZEN_WINDOW + for (i = 0, j = size - 1; i <= midn; i++, j--) + window[j] = (window[i] = 1.0 - ((float)fabs((float)(i - midm1) / midp1))); + break; + case 5: // BARTLETT_WINDOW + for (i = 0, j = size - 1, angle = 0.0; i <= midn; i++, j--, angle += rate) + window[j] = (window[i] = angle); + break; + case 6: // HAMMING_WINDOW + for (i = 0, j = size - 1, angle = 0.0; i <= midn; i++, j--, angle += freq) + window[j] = (window[i] = 0.5F - 0.46 * cos(angle)); + break; + case 7: // BLACKMAN2_WINDOW + for (i = 0, j = size - 1, angle = 0.0; i <= midn; i++, j--, angle += freq) { + cx = cos(angle); + window[j] = (window[i] = (.34401 + (cx * (-.49755 + (cx * .15844))))); + } + break; + case 8: // BLACKMAN3_WINDOW + for (i = 0, j = size - 1, angle = 0.0; i <= midn; i++, j--, angle += freq) { + cx = cos(angle); + window[j] = (window[i] = (.21747 + (cx * (-.45325 + (cx * (.28256 - (cx * .04672))))))); + } + break; + case 9: // BLACKMAN4_WINDOW + for (i = 0, j = size - 1, angle = 0.0; i <= midn; i++, j--, angle += freq) + { + cx = cos(angle); + window[j] = (window[i] = + (.084037 + + (cx * + (-.29145 + + (cx * + (.375696 + (cx * (-.20762 + (cx * .041194))))))))); + } + break; + case 10: // EXPONENTIAL_WINDOW + for (i = 0, j = size - 1; i <= midn; i++, j--) { + window[j] = (window[i] = expsum - 1.0); + expsum *= expn; + } + break; + case 11: // RIEMANN_WINDOW + sr1 = two_pi / size; + for (i = 0, j = size - 1; i <= midn; i++, j--) { + if (i == midn) window[j] = (window[i] = 1.0); + else { + cx = sr1 * (midn - i); + window[i] = sin(cx) / cx; + window[j] = window[i]; + } + } + break; + case 12: // BLACKMANHARRIS_WINDOW + { + float + a0 = 0.35875f, + a1 = 0.48829f, + a2 = 0.14128f, + a3 = 0.01168f; + + + for (i = 0; i < size; i++) + { + window[i] = a0 - a1* qCos(TWOPI * (i+0.5)/size) + + a2* qCos(2.0 * TWOPI * (i+0.5)/size) + - a3* qCos(3.0 * TWOPI * (i+0.5)/size); + } + } + break; + + default: + return; + } +} diff --git a/Source/src/QtDSP/qtdsp_filter.h b/Source/src/QtDSP/qtdsp_filter.h new file mode 100644 index 0000000..4706bb3 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_filter.h @@ -0,0 +1,153 @@ +/** +* @file qtdsp_filter.h +* @brief Filter header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_FILTER_H +#define _QTDSP_FILTER_H + +//#include +//#include +//#include +#include +//#include +#include "qtdsp_fft.h" +#include "qtdsp_qComplex.h" +#include "qtdsp_invsinc_coeff.h" +#include "../cusdr_settings.h" + +//#include +//#include + +#ifdef LOG_QTDSP_FILTER +# define FILTER_DEBUG qDebug().nospace() << "QtDSP_Filter::\t" +#else +# define FILTER_DEBUG nullDebug() +#endif + + + +#define BLACKMANHARRIS_WINDOW 12 + +class QFilter : public QObject { + + Q_OBJECT + +public: + QFilter(QObject *parent = 0, int size = 0, const int ftype = 2, const int wtype = 12); + ~QFilter(); + +private: + Settings *set; + + QMutex mutex; + + bool m_streamMode; + + int m_size; + int m_ftype; + int m_wtype; + + float m_samplerate; + float m_filter_lo; + float m_filter_hi; + + CPX ovlp; + CPX filter; + CPX res; + CPX tmpfilt0; + CPX tmpfilt1; + CPX tmp; + CPX tmp0; + CPX tmp1; + CPX tmp2; + + QFFT *ovlpfft; + QFFT *filtfft; + +private slots: + void LoadFilter(CPX &taps); + void MakeFirLowpass(float cutoff, + float samplerate, + int wtype, + float *taps_re, + float *taps_im, + int length); + + void MakeFirLowpass(float cutoff, + float samplerate, + int wtype, + CPX &taps, + int length); + + void MakeFirBandpass(float lo, + float hi, + float samplerate, + int wtype, + float *taps_re, + float *taps_im, + int length); + + void MakeFirBandpass(float lo, + float hi, + float samplerate, + int wtype, + CPX &taps, + int length); + + void MakeFirBandstop(float lo, + float hi, + float samplerate, + CPX &taps, + int length); + + //void DoConvolutionCPX(); + void DoOverlapAddCPX(); + +public slots: + void setSampleRate(QObject *sender, int value); + + void MakeFilter(const float lo, const float hi, const int ftype, const int wtype); + static void MakeWindow(int wtype, int size, float * window); + + void ProcessFilter(CPX &in, CPX &out, int bsize); + void ProcessForwardFilter(CPX &in, CPX &out, int bsize); + void ProcessChirpFilter(CPX &in, CPX &out, int bsize); + int ProcessAndDecimate(CPX &in, CPX &out, int bsize); + void Decimate(CPX &in, CPX &out, int downrate); + void DoConvolutionCPX(); + void Normalize(CPX &in, CPX &out, int size); + + float filterLo() const ; + float filterHi() const ; + int isStreamMode() const; + void setFilterLo(const float value); + void setFilterHi(const float value); + void setFilter(const float loval, const float hival); + void setStreamMode(int value); +}; + +#endif // _QTDSP_FILTER_H diff --git a/Source/src/QtDSP/qtdsp_invsinc_coeff.h b/Source/src/QtDSP/qtdsp_invsinc_coeff.h new file mode 100644 index 0000000..a1df037 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_invsinc_coeff.h @@ -0,0 +1,141 @@ +/** +* @file qtdsp_invsinc_coeff.h +* @brief Filter coefficients header file for QtDSP +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-18 +*/ + +/* + * Copyright (C) 2007, 2008 Philip A Covington, N8VB + * + * adapted for cuSDR by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_INVSINC_COEFF_H +#define _QTDSP_INVSINC_COEFF_H + +#define FILTERCOEFFSIZE 512 + +const float FILTERCOEFF[512] = { + + -7.298647688e-005f, -0.0006591212004f, -0.002619047416f, -0.006309854332f, -0.0100497622f, + -0.01030933112f, -0.00512559386f, 0.002354965545f, 0.005713210441f, 0.002275705803f, + -0.003084241645f, -0.003601335222f, 0.0007034620503f, 0.003363352269f, 0.0008431510651f, + -0.002575940453f, -0.001681111869f, 0.001701403758f, 0.002036997117f, -0.0009210249991f, + -0.002096840879f, 0.0002871879842f, 0.001987287775f, 0.0001987546857f, -0.001792274415f, + -0.0005589024513f, 0.001559824217f, 0.0008162951563f, -0.001320442185f, -0.000995823415f, + 0.001087572658f, 0.001113920705f, -0.0008722782368f, -0.001188867842f, 0.0006758925156f, + 0.001231985865f, -0.000498666428f, -0.001251817564f, 0.0003399479028f, 0.001254849718f, + -0.0001991765457f, -0.001247569569f, 7.392977568e-005f, 0.001235375414f, 4.123276085e-005f, + -0.001217678422f, -0.0001465942914f, 0.001196535421f, 0.000243384231f, -0.00117429113f, + -0.0003348062455f, 0.001149932388f, 0.0004205152218f, -0.00112563686f, -0.0005032685003f, + 0.001100820256f, 0.0005843482213f, -0.001074886066f, -0.0006646135589f, 0.001047056401f, + 0.0007442943752f, -0.00101693254f, -0.0008235950954f, 0.0009842554573f, 0.0009030248038f, + -0.0009477832355f, -0.0009810557822f, 0.0009091657703f, 0.001059165923f, -0.0008679664461f, + -0.001138553023f, 0.00082209229f, 0.001217685989f, -0.0007719836431f, -0.001296614995f, + 0.0007174044149f, 0.001375256572f, -0.0006578231696f, -0.001452584052f, 0.000594522804f, + 0.001530058333f, -0.0005264937645f, -0.001608328195f, 0.0004511743609f, 0.001684416085f, + -0.0003703148686f, -0.001758773113f, 0.0002839826047f, 0.001831884147f, -0.0001910350693f, + -0.001902386313f, 9.27066576e-005f, 0.001972250175f, 1.451703884e-005f,-0.002037639031f, + -0.0001286926563f, 0.002098251833f, 0.0002489787876f, -0.002154306741f, -0.0003754671779f, + 0.002205130411f, 0.0005068014725f, -0.002253053477f, -0.0006465745391f, 0.002294297796f, + 0.0007927893312f, -0.00232853787f, -0.000944050902f, 0.002357372548f, 0.001102598035f, + -0.002377682133f, -0.001264899038f, 0.002393632894f, 0.001436556573f, -0.002398973331f, + -0.001613004017f, 0.002395873656f, 0.001796123339f, -0.002380831633f, -0.001981404843f, + 0.002357972786f, 0.002172444016f, -0.00232419977f, -0.002367483685f, 0.002279908862f, + 0.002567417221f, -0.002222327981f, -0.002768594073f, 0.00215465948f, 0.002974577248f, + -0.002071162919f, -0.003176601371f, 0.001984296367f, 0.003392344108f, -0.001870410633f, + -0.003593309782f, 0.001762269414f, 0.003818378551f, -0.001613235101f, -0.004014817532f, + 0.001478523714f, 0.004237284884f, -0.001307581435f, -0.004444869235f, 0.001126970164f, + 0.004649222363f, -0.0009381354903f, -0.004864084534f, 0.0007162823458f, 0.005058682058f, + -0.0004906012327f, -0.005254743621f, 0.0002504401491f, 0.005455542356f, 2.14788397e-005f, + -0.005635460373f, -0.0003002338926f, 0.005811699666f, 0.0005916802911f, -0.005991247483f, + -0.0009132201085f, 0.006154606584f, 0.001253017108f, -0.006301850546f, -0.001601491706f, + 0.006448314991f, 0.001975012943f, -0.006583563052f, -0.002374651376f, 0.00669672247f, + 0.002787304111f, -0.006796817295f, -0.003215527395f, 0.006888513919f, 0.003669659607f, + -0.006961984094f, -0.004147280473f, 0.007011558395f, 0.004639521241f, -0.007045097649f, + -0.005150847603f, 0.007064725272f, 0.005690811202f, -0.007059961092f, -0.006256772671f, + 0.007024813443f, 0.006840964779f, -0.00696356874f, -0.007443124428f, 0.006882129703f, + 0.008074145764f, -0.00677188905f, -0.00873577781f, 0.006622628309f, 0.009418459609f, + -0.006438742857f, -0.01012247056f, 0.006224870216f, 0.01085730083f, -0.005974722095f, + -0.01162762847f, 0.005678492598f, 0.01243014261f, -0.005333583802f, -0.01326503698f, + 0.004937817343f, 0.01413488016f, -0.004487683997f, -0.01504271384f, 0.003980736714f, + 0.01599739864f, -0.003406297183f, -0.0170029439f, 0.002752586966f, 0.01805772632f, + -0.002016746672f, -0.01917018928f, 0.00119104574f, 0.02035386302f, -0.0002581478329f, + -0.02161752619f, -0.0007987120189f, 0.02297377214f, 0.00200156169f, -0.02443705499f, + -0.003379397793f, 0.02601802349f, 0.004954055417f, -0.02774950489f, -0.0067701675f, + 0.02966706641f, 0.00888942834f, -0.03181019425f, -0.01138752978f, 0.03424045816f, + 0.01438213047f, -0.03702627495f, -0.01802601293f, 0.04027441144f, 0.02255047485f, + -0.04414317012f, -0.02832753956f, 0.04885149002f, 0.03595076501f, -0.0547539629f, + -0.04649358243f, 0.06237275898f, 0.06197695807f, -0.07256446034f, -0.08679046482f, + 0.0865688622f, 0.1321066916f, -0.1050333083f, -0.2351729274f, 0.1105839834f, + 0.6013018489f, 0.6013018489f, 0.1105839834f, -0.2351729274f, -0.1050333083f, + 0.1321066916f, 0.0865688622f, -0.08679046482f, -0.07256446034f, 0.06197695807f, + 0.06237275898f, -0.04649358243f, -0.0547539629f, 0.03595076501f, 0.04885149002f, + -0.02832753956f, -0.04414317012f, 0.02255047485f, 0.04027441144f, -0.01802601293f, + -0.03702627495f, 0.01438213047f, 0.03424045816f, -0.01138752978f, -0.03181019425f, + 0.00888942834f, 0.02966706641f, -0.0067701675f, -0.02774950489f, 0.004954055417f, + 0.02601802349f, -0.003379397793f, -0.02443705499f, 0.00200156169f, 0.02297377214f, + -0.0007987120189f, -0.02161752619f, -0.0002581478329f, 0.02035386302f, 0.00119104574f, + -0.01917018928f, -0.002016746672f, 0.01805772632f, 0.002752586966f, -0.0170029439f, + -0.003406297183f, 0.01599739864f, 0.003980736714f, -0.01504271384f, -0.004487683997f, + 0.01413488016f, 0.004937817343f, -0.01326503698f, -0.005333583802f, 0.01243014261f, + 0.005678492598f, -0.01162762847f, -0.005974722095f, 0.01085730083f, 0.006224870216f, + -0.01012247056f, -0.006438742857f, 0.009418459609f, 0.006622628309f, -0.00873577781f, + -0.00677188905f, 0.008074145764f, 0.006882129703f, -0.007443124428f, -0.00696356874f, + 0.006840964779f, 0.007024813443f, -0.006256772671f, -0.007059961092f, 0.005690811202f, + 0.007064725272f, -0.005150847603f, -0.007045097649f, 0.004639521241f, 0.007011558395f, + -0.004147280473f, -0.006961984094f, 0.003669659607f, 0.006888513919f, -0.003215527395f, + -0.006796817295f, 0.002787304111f, 0.00669672247f, -0.002374651376f, -0.006583563052f, + 0.001975012943f, 0.006448314991f, -0.001601491706f, -0.006301850546f, 0.001253017108f, + 0.006154606584f, -0.0009132201085f, -0.005991247483f, 0.0005916802911f, 0.005811699666f, + -0.0003002338926f, -0.005635460373f, 2.14788397e-005f, 0.005455542356f, 0.0002504401491f, + -0.005254743621f, -0.0004906012327f, 0.005058682058f, 0.0007162823458f, -0.004864084534f, + -0.0009381354903f, 0.004649222363f, 0.001126970164f, -0.004444869235f, -0.001307581435f, + 0.004237284884f, 0.001478523714f, -0.004014817532f, -0.001613235101f, 0.003818378551f, + 0.001762269414f, -0.003593309782f, -0.001870410633f, 0.003392344108f, 0.001984296367f, + -0.003176601371f, -0.002071162919f, 0.002974577248f, 0.00215465948f, -0.002768594073f, + -0.002222327981f, 0.002567417221f, 0.002279908862f, -0.002367483685f, -0.00232419977f, + 0.002172444016f, 0.002357972786f, -0.001981404843f, -0.002380831633f, 0.001796123339f, + 0.002395873656f, -0.001613004017f, -0.002398973331f, 0.001436556573f, 0.002393632894f, + -0.001264899038f, -0.002377682133f, 0.001102598035f, 0.002357372548f, -0.000944050902f, + -0.00232853787f, 0.0007927893312f, 0.002294297796f, -0.0006465745391f, -0.002253053477f, + 0.0005068014725f, 0.002205130411f, -0.0003754671779f, -0.002154306741f, 0.0002489787876f, + 0.002098251833f, -0.0001286926563f, -0.002037639031f, 1.451703884e-005f, 0.001972250175f, + 9.27066576e-005f, -0.001902386313f, -0.0001910350693f, 0.001831884147f, 0.0002839826047f, + -0.001758773113f, -0.0003703148686f, 0.001684416085f, 0.0004511743609f, -0.001608328195f, + -0.0005264937645f, 0.001530058333f, 0.000594522804f, -0.001452584052f, -0.0006578231696f, + 0.001375256572f, 0.0007174044149f, -0.001296614995f, -0.0007719836431f, 0.001217685989f, + 0.00082209229f, -0.001138553023f, -0.0008679664461f, 0.001059165923f, 0.0009091657703f, + -0.0009810557822f, -0.0009477832355f, 0.0009030248038f, 0.0009842554573f, -0.0008235950954f, + -0.00101693254f, 0.0007442943752f, 0.001047056401f, -0.0006646135589f, -0.001074886066f, + 0.0005843482213f, 0.001100820256f, -0.0005032685003f, -0.00112563686f, 0.0004205152218f, + 0.001149932388f, -0.0003348062455f, -0.00117429113f, 0.000243384231f, 0.001196535421f, + -0.0001465942914f, -0.001217678422f, 4.123276085e-005f, 0.001235375414f, 7.392977568e-005f, + -0.001247569569f, -0.0001991765457f, 0.001254849718f, 0.0003399479028f, -0.001251817564f, + -0.000498666428f, 0.001231985865f, 0.0006758925156f, -0.001188867842f, -0.0008722782368f, + 0.001113920705f, 0.001087572658f, -0.000995823415f, -0.001320442185f, 0.0008162951563f, + 0.001559824217f, -0.0005589024513f, -0.001792274415f, 0.0001987546857f, 0.001987287775f, + 0.0002871879842f, -0.002096840879f, -0.0009210249991f, 0.002036997117f, 0.001701403758f, + -0.001681111869f, -0.002575940453f, 0.0008431510651f, 0.003363352269f, 0.0007034620503f, + -0.003601335222f, -0.003084241645f, 0.002275705803f, 0.005713210441f, 0.002354965545f, + -0.00512559386f, -0.01030933112f, -0.0100497622f, -0.006309854332f, -0.002619047416f, + -0.0006591212004f, -7.298647688e-005f +}; + +#endif // _QTDSP_INVSINC_COEFF_H diff --git a/Source/src/QtDSP/qtdsp_powerSpectrum.cpp b/Source/src/QtDSP/qtdsp_powerSpectrum.cpp new file mode 100644 index 0000000..c12713a --- /dev/null +++ b/Source/src/QtDSP/qtdsp_powerSpectrum.cpp @@ -0,0 +1,212 @@ +/** +* @file qtdsp_powerSpectrum.cpp +* @brief Power Spectrum class for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-14 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#define LOG_POWERSPECTRUM + +#include "qtdsp_powerSpectrum.h" + +PowerSpectrum::PowerSpectrum(QObject *parent, int size) + : QObject(parent) + , set(Settings::instance()) + , first(true) + , m_size(size) + , m_spectrumSize(size*2) + , m_psswitch(0) + , m_averages(4) + , m_samplerate(set->getSampleRate()) + , m_baseline((float)1.0e-15) + , m_correction(0.0f) +{ + m_window = new float[m_size]; + m_fPsdBm = new float[m_size * 2]; + m_fAvePsdBm = new float[m_size * 2]; + + windowCPX.resize(m_size); + tmpCPX.resize(m_size * 2); + dataCPX.resize(0); + + zero.re = 0.0f; + zero.im = 0.0f; + + m_fft = new QFFT(m_size * 2); + + memset(m_fPsdBm, 0, m_size * 2 * sizeof(float)); + memset(m_fAvePsdBm, 0, m_size * 2 * sizeof(float)); + memset(m_window, 0, m_size * sizeof(float)); + + QFilter::MakeWindow(BLACKMANHARRIS_WINDOW, size, m_window); + + for (int i = 0; i < m_size; i++) { + + windowCPX[i].re = m_window[i]; + windowCPX[i].im = m_window[i]; + } + + cnt = 0; +} + +PowerSpectrum::~PowerSpectrum() { + + if (m_fft) + delete m_fft; + + windowCPX.clear(); + tmpCPX.clear(); + dataCPX.clear(); + + if (m_window) + delete m_window; + + if (m_fPsdBm) + delete m_fPsdBm; + + if (m_fAvePsdBm) + delete m_fAvePsdBm; +} + +void PowerSpectrum::setupConnections() { +} + +//void PowerSpectrum::ProcessSpectrum(CPX &in, int size) { +// +// Q_UNUSED(size) +// +// if (first && dataCPX.size() == 0) { +// +// dataCPX << in; +// first = false; +// return; +// } +// else { +// +// dataCPX << in; +// tmpCPX.fill(zero, m_size*2); +// +// if (dataCPX.size() == m_size) { +// +// for (int i = 0; i < m_size; i++) +// tmpCPX[i] = MultCPX(dataCPX.at(i), windowCPX.at(i)); +// +// m_mutex.lock(); +// m_fft->DoFFTWMagnForward(tmpCPX, m_size * 2, m_baseline, m_correction, m_fPsdBm); +// m_mutex.unlock(); +// } +// +// first = true; +// dataCPX.resize(0); +// } +//} + +void PowerSpectrum::ProcessSpectrum(CPX &in, int size, int maxCnt) { + + Q_UNUSED(size) + + if (cnt < maxCnt) { // maxCnt = 1: 4096, maxCnt = 3: 8192, maxCnt = 7: 16384 + + dataCPX << in; + //first = false; + cnt++; + return; + } + else { + + dataCPX << in; + tmpCPX.fill(zero, m_size*2); + + if (dataCPX.size() == m_size) { + + for (int i = 0; i < m_size; i++) + tmpCPX[i] = MultCPX(dataCPX.at(i), windowCPX.at(i)); + + m_mutex.lock(); + m_fft->DoFFTWMagnForward(tmpCPX, m_size * 2, m_baseline, m_correction, m_fPsdBm); + m_mutex.unlock(); + } + + //first = true; + cnt = 0; + dataCPX.resize(0); + } +} + +void PowerSpectrum::setBaseLine(float value) { + + m_baseline = value; +} + +void PowerSpectrum::setCorrection(float value) { + + m_correction = value; +} + +void PowerSpectrum::setPsOn(int value) { + + m_psswitch = value; +} + +//int PowerSpectrum::psdBmResults(float* buffer) { +// +// if (buffer == NULL) return 0; +// +// m_mutex.lock(); +// memcpy(buffer, m_fPsdBm, dBmSize() * sizeof(float)); +// m_mutex.unlock(); +// +// return dBmSize(); +//} + +int PowerSpectrum::spectrumResult(qVectorFloat &buffer, int shift) { + + if (buffer.size() == 0) return 0; + + m_mutex.lock(); + + memcpy( + (float *) buffer.data(), + (float *) &m_fPsdBm[shift], + 4096 * sizeof(float)); + + m_mutex.unlock(); + + return buffer.size(); +} + +void PowerSpectrum::setAverages(int value) { + + m_averages = value; +} + +float PowerSpectrum::grabPsPoint(int index) { + + return m_fPsdBm[index]; +} + +int PowerSpectrum::dBmSize() const { + + return m_spectrumSize; +} + diff --git a/Source/src/QtDSP/qtdsp_powerSpectrum.h b/Source/src/QtDSP/qtdsp_powerSpectrum.h new file mode 100644 index 0000000..01326b9 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_powerSpectrum.h @@ -0,0 +1,108 @@ +/** +* @file qtdsp_powerSpectrum.h +* @brief Power Spectrum header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-14 +*/ + +/* + * Copyright (C) 2007, 2008, 2009, 2010 Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_POWERSPECTRUM_H +#define _QTDSP_POWERSPECTRUM_H + +#include "qtdsp_qComplex.h" +#include "qtdsp_fft.h" +#include "qtdsp_filter.h" +#include "../cusdr_settings.h" + +#include +#include + + +#ifdef LOG_POWERSPECTRUM +# define POWERSPECTRUM_DEBUG qDebug().nospace() << "PowerSpectrum::\t" +#else +# define POWERSPECTRUM_DEBUG nullDebug() +#endif + + +class PowerSpectrum : public QObject { + + Q_OBJECT + +public: + PowerSpectrum(QObject *parent = 0, int size = 0); + ~PowerSpectrum(); + + void ProcessSpectrum(CPX &in, int size, int maxCnt); + + //int psdBmResults(float *buffer); + int spectrumResult(qVectorFloat &buffer, int shift); + + float grabPsPoint(int index); + + void setBaseLine(float value); + void setCorrection(float value); + void setPsOn(int value); + void setAverages(int value); + + int dBmSize() const;// { return m_size * 2; } + int psIsOn() const { return m_psswitch; } + int averages() const { return m_averages; } + float baseLine() const { return m_baseline; } + float correction() const { return m_correction; } + +public slots: + //void setSampleSize(int rx, int size); + +private: + Settings* set; + + QMutex m_mutex; + + cpx zero; + CPX windowCPX; + CPX tmpCPX; + CPX dataCPX; + + QFFT* m_fft; + + bool first; + + int m_size; + int m_spectrumSize; + int m_psswitch; + int m_averages; + int cnt; + + float m_samplerate; + float m_baseline; + float m_correction; + + float* m_window; + float* m_fPsdBm; + float* m_fAvePsdBm; + + void setupConnections(); +}; + +#endif // _QTDSP_POWERSPECTRUM_H diff --git a/Source/src/QtDSP/qtdsp_qComplex.h b/Source/src/QtDSP/qtdsp_qComplex.h new file mode 100644 index 0000000..a3315a1 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_qComplex.h @@ -0,0 +1,146 @@ +/** +* @file qtdsp_qComplex.h +* @brief qComplex type header for QtDSP +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-09-22 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * Based on the complex type CPX by Philip A Covington, p.covington@gmail.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_QCOMPLEX_H +#define _QTDSP_QCOMPLEX_H + +#include +#include +#include +#include +#include + +using namespace std; + +#undef max + +typedef struct _QCOMPLEX { + + float re; + float im; + +} cpx; + +Q_DECLARE_METATYPE (cpx) +Q_DECLARE_TYPEINFO(cpx, Q_MOVABLE_TYPE); + +typedef QVector CPX; + +Q_DECLARE_METATYPE (CPX) + +inline void InitCPX(CPX &vec, int size, float value) { + + cpx zero; + zero.re = value; zero.im = value; + + vec.resize(size); + vec.fill(zero); +} + +inline cpx ToCPX(qreal x, qreal y) { + + cpx z; + z.re = x; + z.im = y; + + return z; +} + +inline cpx ScaleCPX(const cpx &c, float a) { + + cpx z; + z.re = a * c.re; + z.im = a * c.im; + + return z; +} + +inline cpx AddCPX(cpx x, cpx y) { + + cpx z; + z.re = x.re + y.re; + z.im = x.im + y.im; + + return z; +} + +inline void PlusCPX(CPX &a, CPX &b, CPX &c) { + + CPX z; + z.resize(0); + + int sa = a.size(); + int sb = b.size(); + + if (sa != sb) return; + + z.resize(sa); + for (int i = 0; i < sa; i++) { + + z[i].re = a.at(i).re + b.at(i).re; + z[i].im = a.at(i).im + b.at(i).im; + + c[i].re = z.at(i).re; + c[i].im = z.at(i).im; + } +} + +inline cpx MultCPX(cpx x, cpx y) { + + cpx z; + z.re = x.re * y.re - x.im * y.im; + z.im = x.im * y.re + x.re * y.im; + return z; +} + +inline float MagCPX(cpx z) { + + return (float) (z.re * z.re + z.im * z.im); +} + +inline float SqrMagCPX(cpx z) { + + return (float) sqrt(z.re * z.re + z.im * z.im); +} + +inline QString ValidQReal(qreal value) { + + if (value != value) { + return "NaN"; + } + else if (value > numeric_limits::max()){ + return "+Inf"; + } + else if (value < -numeric_limits::max()){ + return "-Inf"; + } + else + return ""; +} + +#endif // _QTDSP_QCOMPLEX_H diff --git a/Source/src/QtDSP/qtdsp_signalMeter.cpp b/Source/src/QtDSP/qtdsp_signalMeter.cpp new file mode 100644 index 0000000..523b4e6 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_signalMeter.cpp @@ -0,0 +1,74 @@ +/** +* @file qtdsp_signalMeter.cpp +* @brief Signal Meter class for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-19 +*/ + +/* + * Copyright (C) 2007, 2008, Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * With Algorithms borrowed from DttSP + * Copyright (C) 2004, 2005, 2006 by Frank Brickle, AB2KT and Bob McGwier, N4HY + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "qtdsp_signalMeter.h" + +SignalMeter::SignalMeter(QObject *parent, int size) + : QObject(parent) + , set(Settings::instance()) + , m_size(size) + , m_instValue(-80.0) + //, m_correction(59.0f) + , m_correction(-8.0f) +{ +} + +SignalMeter::~SignalMeter() { +} + +void SignalMeter::ProcessBlock(CPX &in, int bsize) { + + Q_UNUSED(bsize) + + float tmp = 0.0f; + + for (int i = 0; i < m_size; i++) + tmp += (in.at(i).re * in.at(i).re + in.at(i).im * in.at(i).im); + + m_instValue = (float)(10.0f * log10(tmp + 1.5E-45)); +} + +float SignalMeter::getInstFValue() const { + + return m_instValue + m_correction; +} + +float SignalMeter::getCorrection() const { + + return m_correction; +} + +void SignalMeter::setCorrection(const float value) { + + if (m_correction == value) return; + + m_correction = value; +} diff --git a/Source/src/QtDSP/qtdsp_signalMeter.h b/Source/src/QtDSP/qtdsp_signalMeter.h new file mode 100644 index 0000000..dc3366a --- /dev/null +++ b/Source/src/QtDSP/qtdsp_signalMeter.h @@ -0,0 +1,69 @@ +/** +* @file qtdsp_signalMeter.h +* @brief Signal meter header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-19 +*/ + +/* + * Copyright (C) 2007, 2008, Philip A Covington, N8VB + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * With Algorithms borrowed from DttSP + * Copyright (C) 2004, 2005, 2006 by Frank Brickle, AB2KT and Bob McGwier, N4HY + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _QTDSP_SIGNALMETER_H +#define _QTDSP_SIGNALMETER_H + +#define SPECDBMOFFSET 100.50 + +#include +#include "qtdsp_qComplex.h" +#include "../cusdr_settings.h" + +#include +#include + +class SignalMeter : public QObject { + + Q_OBJECT + +public: + SignalMeter(QObject *parent = 0, int size = 0); + ~SignalMeter(); + + void ProcessBlock(CPX &in, int bsize); + + float getInstFValue() const; + float getCorrection() const; + +public slots: + void setCorrection(const float value); + +private: + Settings *set; + + int m_size; + + float m_instValue; + float m_correction; +}; + +#endif // _QTDSP_SIGNALMETER_H diff --git a/Source/src/QtDSP/qtdsp_wpagc.cpp b/Source/src/QtDSP/qtdsp_wpagc.cpp new file mode 100644 index 0000000..e70f8e6 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_wpagc.cpp @@ -0,0 +1,630 @@ +/** +* @file qtdsp_wpagc.cpp +* @brief Warren Pratt's ingenious AGC class for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-14 +*/ + +/* + * Copyright (C) 2011, 2012 Warren Pratt, NR0V + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The author can be reached by email at + * + * warren@wpratt.com + */ +#define LOG_WPAGC + +#include "qtdsp_wpagc.h" + +QWPAGC::QWPAGC(QObject *parent, int size) + : QObject(parent) + , set(Settings::instance()) + , m_size(size) + , m_samplerate(set->getSampleRate()) + , m_nTau(4) + , m_outIndex(-1) + , m_inIndex(0) + , m_attackBuffersize(0) + , m_state(0) + , m_hangCounter(0) + , m_decayType(0) + , m_fixedGain(1000) + , m_tauAttack(0.001) + , m_tauDecay(0.250) + //, m_maxGain(100000.0) + , m_varGain(1.0) + , m_minVolts(0.0) + + // Warren NR0V reports that this change needs to be made in order for things to be + // in the right position on the screen and other factors: + , m_maxInput(500.0) + + , m_out_targ(1.0) + , m_out_target(0.0) + , m_inv_max_input(0.0) + , m_slope_constant(0.0) + , m_ring_max(0.0) + , m_attack_mult(0.0) + , m_decay_mult(0.0) + , m_volts(0.0) + , m_save_volts(0.0) + , m_abs_out_sample(0.0) + , m_tau_fast_backaverage(0.250) + , m_fast_backmult(0.0) + , m_onemfast_backmult(1.0) + , m_fast_backaverage(0.0) + , m_tau_fast_decay(0.005) + , m_fast_decay_mult(0.0) + , m_pop_ratio(5.0) + , m_hang_backaverage(0.0) + , m_tau_hang_backmult(0.500) + , m_hang_backmult(0.0) + , m_onemhang_backmult(1.0) + , m_hangtime(0.250) + , m_hangThresh(0.01) + , m_hangLevel(0.0) + , m_tau_hang_decay(0.100) + , m_hang_decay_mult(0.0) + , SinAverage(0.637) +{ + InitCPX(buf, m_size, 0.0f); + InitCPX(ring, RINGBUFFERSIZE, 0.0f); + + outSample.re = 0.0f; + outSample.im = 0.0f; + + absRing.resize(RINGBUFFERSIZE); + absRing.fill(0.0); + + initWcpAGC(); +} + +QWPAGC::~QWPAGC() { + + buf.clear(); + ring.clear(); +} + +//void QWPAGC::setupConnections() { +// +//} + +void QWPAGC::ProcessAGC(CPX &in, CPX &out, int size) { + + Q_UNUSED(size) + + if (m_agcMode == agcOFF) { + + for (int i = 0; i < m_size; i++) + out[i] = ScaleCPX(in.at(i), m_fixedGain); + + return; + } + + memcpy(buf.data(), in.data(), sizeof(cpx) * m_size); + + int i, j, k; + //qreal mult; + + mutex.lock(); + for (i = 0; i < m_size; i++) { + + if (++m_outIndex >= RINGBUFFERSIZE) + m_outIndex -= RINGBUFFERSIZE; + + if (++m_inIndex >= RINGBUFFERSIZE) + m_inIndex -= RINGBUFFERSIZE; + + outSample.re = ring.at(m_outIndex).re; + outSample.im = ring.at(m_outIndex).im; + + //m_abs_out_sample = absRing[m_out_index]; + m_abs_out_sample = absRing.at(m_outIndex); + + ring[m_inIndex].re = buf.at(i).re; + ring[m_inIndex].im = buf.at(i).im; + + absRing[m_inIndex] = qMax(qAbs(ring.at(m_inIndex).re), qAbs(ring.at(m_inIndex).im)); + + m_fast_backaverage = m_fast_backmult * m_abs_out_sample + m_onemfast_backmult * m_fast_backaverage; + m_hang_backaverage = m_hang_backmult * m_abs_out_sample + m_onemhang_backmult * m_hang_backaverage; + + if ((m_abs_out_sample >= m_ring_max) && (m_abs_out_sample > 0)) { + + m_ring_max = 0.0; + k = m_outIndex; + + for (j = 0; j < m_attackBuffersize; j++) { + + if (++k == RINGBUFFERSIZE) + k = 0; + if (absRing[k] > m_ring_max) + //m_ring_max = absRing[k]; + m_ring_max = absRing.at(k); + } + } + + if (absRing[m_inIndex] > m_ring_max) + //m_ring_max = absRing[m_in_index]; + m_ring_max = absRing.at(m_inIndex); + + if (m_hangCounter > 0) + --m_hangCounter; + + switch (m_state) { + + case 0: + + if (m_ring_max >= m_volts) { + + m_volts += (m_ring_max - m_volts) * m_attack_mult; + } + else { + if (m_volts > m_pop_ratio * m_fast_backaverage) { + + m_state = 1; + m_volts += (m_ring_max - m_volts) * m_fast_decay_mult; + } + else { + + if (m_hang_backaverage > m_hangLevel) { + + m_state = 2; + m_hangCounter = (int)(m_hangtime * m_samplerate); + m_decayType = 1; + } + else { + + m_state = 3; + m_volts += (m_ring_max - m_volts) * m_decay_mult; + m_decayType = 0; + } + } + } + break; + + case 1: + + if (m_ring_max >= m_volts) { + + m_state = 0; + m_volts += (m_ring_max - m_volts) * m_attack_mult; + } + else { + + if (m_volts > m_save_volts) { + + m_volts += (m_ring_max - m_volts) * m_fast_decay_mult; + } + else { + + if (m_hangCounter > 0) { + + m_state = 2; + } + else { + + if (m_decayType == 0) { + + m_state = 3; + m_volts += (m_ring_max - m_volts) * m_decay_mult; + } + else { + + m_state = 4; + m_volts += (m_ring_max - m_volts) * m_hang_decay_mult; + } + } + } + } + break; + + case 2: + + if (m_ring_max >= m_volts) { + + m_state = 0; + m_save_volts = m_volts; + m_volts += (m_ring_max - m_volts) * m_attack_mult; + } + else { + + if (m_hangCounter == 0) { + + m_state = 4; + m_volts += (m_ring_max - m_volts) * m_hang_decay_mult; + } + } + break; + + case 3: + + if (m_ring_max >= m_volts) { + + m_state = 0; + m_save_volts = m_volts; + m_volts += (m_ring_max - m_volts) * m_attack_mult; + } + else { + + m_volts += (m_ring_max - m_volts) * m_decay_mult; + } + break; + + case 4: + + if (m_ring_max >= m_volts) { + + m_state = 0; + m_save_volts = m_volts; + m_volts += (m_ring_max - m_volts) * m_attack_mult; + } + else { + + m_volts += (m_ring_max - m_volts) * m_hang_decay_mult; + } + + break; + } // end switch on state + + if (m_volts < m_minVolts) + m_volts = m_minVolts; + + mult = (m_out_target - m_slope_constant * qMin(0.0, log10 (m_inv_max_input * m_volts))) / m_volts; + + out[i].re = (float)(outSample.re * mult); + out[i].im = (float)(outSample.im * mult); + } + mutex.unlock(); +} + +void QWPAGC::initWcpAGC() { + + m_outIndex = -1; + m_ring_max = 0.0; + m_volts = 0.0; + m_save_volts = 0.0; + m_fast_backaverage = 0.0; + m_hang_backaverage = 0.0; + m_hangCounter = 0; + m_state = 0; + + //memset(absRing, 0, RINGBUFFERSIZE * sizeof(qreal)); + absRing.fill(0.0); + for (int i = 0; i < RINGBUFFERSIZE; i++) { + + ring[i].re = 0.0f; + ring[i].im = 0.0f; + } + + outSample.re = 0.0f; + outSample.im = 0.0f; + m_abs_out_sample = 0.0f; + m_decayType = 0; +} + +void QWPAGC::loadWcpAGC() { + + qreal tmp; + m_attackBuffersize = (int)qCeil(m_samplerate * m_nTau * m_tauAttack); + + m_inIndex = m_attackBuffersize + m_outIndex; + + m_attack_mult = 1.0 - qExp(-1.0 / (m_samplerate * m_tauAttack)); + m_decay_mult = 1.0 - qExp(-1.0 / (m_samplerate * m_tauDecay)); + m_fast_decay_mult = 1.0 - qExp(-1.0 / (m_samplerate * m_tau_fast_decay)); + m_fast_backmult = 1.0 - qExp(-1.0 / (m_samplerate * m_tau_fast_backaverage)); + m_onemfast_backmult = 1.0 - m_fast_backmult; + + m_out_target = m_out_targ * (1.0 - qExp(-m_nTau)) * 0.99; + m_minVolts = m_out_target / (m_varGain * m_maxGain); + + //WPAGC_DEBUG << "emit m_min_volts = " << m_min_volts; + //WPAGC_DEBUG << "emit m_max_gain = " << maxGain; + //emit minimumVoltageChanged(this, m_receiver, m_min_volts); + //emit agcMaximumGainChanged(m_max_gain); + + tmp = log10(m_out_target / (m_maxInput * m_varGain * m_maxGain)); + if (tmp == 0.0) + tmp = 1.5E-45; + + m_slope_constant = (m_out_target * (1.0 - (1.0 / m_varGain))) / tmp; + //m_slope_constant = (m_out_target * (1.0 - (1.0 / m_var_gain))) / (tmp + 1.5E-45); + + m_inv_max_input = 1.0 / m_maxInput; + + tmp = qPow(10.0, ((m_agcHangEnable ? m_hangThresh : 1.0) - 1.0) / 0.125); + m_hangLevel = (m_maxInput * tmp + (m_out_target / (m_varGain * m_maxGain)) * (1.0 - tmp)) * SinAverage; + + // send the hang level value out for display + //WPAGC_DEBUG << "hangLevel_dB = " << 20.0 * log10(m_hangLevel / SinAverage); + //emit hangLeveldBLineChanged(20.0 * log10(m_hangLevel / SinAverage)); + + m_hang_backmult = 1.0 - qExp(-1.0 / (m_samplerate * m_tau_hang_backmult)); + m_onemhang_backmult = 1.0 - m_hang_backmult; + + m_hang_decay_mult = 1.0 - qExp(-1.0 / (m_samplerate * m_tau_hang_decay)); + + emit displayValues(this, m_receiver, m_minVolts, 20.0 * log10(m_hangLevel / SinAverage)); +} + +void QWPAGC::setReceiver(int rx) { + + m_receiver = rx; +} + +void QWPAGC::setMode(AGCMode mode) { + + //mutex.lock(); + if ((m_agcMode == (AGCMode) agcOFF) && (mode != 0)) initWcpAGC(); + + m_agcMode = mode; + + switch (mode) { + + case agcOFF: + break; + + case agcSLOW: + + m_agcHangEnable = true; + m_hangtime = 1.0; + m_tauDecay = 0.500; + break; + + case agcMED: + + m_agcHangEnable = false; + m_hangtime = 0.0; + m_tauDecay = 0.250; + break; + + case agcFAST: + + m_agcHangEnable = false; + m_hangtime = 0.0; + m_tauDecay = 0.050; + break; + + case agcLONG: + + m_agcHangEnable = true; + m_hangtime = 2.0; + m_tauDecay = 2.0; + break; + + case agcUser: + + m_agcHangEnable = true; + m_hangtime = 2.0; + m_tauDecay = 2.0; + break; + + default: + + m_agcHangEnable = true; + m_hangtime = 2.0; + m_tauDecay = 2.0; + break; + } + //mutex.unlock(); +} + +void QWPAGC::setAGCHangEnable(bool value) { + + m_agcHangEnable = value; +} + +// fixed_gain when AGC is OFF (set to 'fixed'), linear +void QWPAGC::setAGCFixedGain(qreal value) { + + m_fixedGain = value; +} + +qreal QWPAGC::getAGCFixedGain() { + + return m_fixedGain; +} + +// fixed_gain when AGC is OFF (set to 'fixed'), in dB +void QWPAGC::setAGCFixedGainDb(qreal value) { + + qreal tmp = value; + if (tmp > 60.0) tmp = 60.0; + + m_fixedGain = qPow(10.0, tmp / 20.0); + //WPAGC_DEBUG << "m_fixedGain = " << m_fixedGain; +} + +qreal QWPAGC::getAGCFixedGainDb() { + + return 20.0 * log10(m_fixedGain); +} + +void QWPAGC::setSampleRate(QObject *sender, int value) { + + Q_UNUSED(sender) + + //mutex.lock(); + m_samplerate = value; + initWcpAGC(); + loadWcpAGC(); + //mutex.unlock(); +} + +// attack time constant in SECONDS +void QWPAGC::setTauAttack(qreal value) { + + mutex.lock(); + m_tauAttack = value; + loadWcpAGC(); + mutex.unlock(); +} + +qreal QWPAGC::getTauAttack() { + + return m_tauAttack; +} + +//decay time constant in SECONDS +void QWPAGC::setTauDecay(qreal value) { + + mutex.lock(); + m_tauDecay = value; + loadWcpAGC(); + mutex.unlock(); +} + +qreal QWPAGC::getTauDecay() { + + return m_tauDecay; +} + +// maximum AGC gain = gain below the "knee", linear +bool QWPAGC::setMaximumGain(qreal value) { + + mutex.lock(); + m_maxGain = value; + + if (ValidQReal(m_maxGain) == "NaN" || ValidQReal(m_maxGain) == "+Inf" || (m_maxGain <= 0)) { + + mutex.unlock(); + return false; // illegal values! + } + else + loadWcpAGC(); + + mutex.unlock(); + return true; +} + +qreal QWPAGC::getAGCMaximumGain_dBm() { + + return 20.0 * log10(m_maxGain); +} + +// maximum AGC gain = gain below the "knee", in dB +bool QWPAGC::setMaximumGainDb(qreal value) { + + mutex.lock(); + m_maxGain = qPow(10.0, value / 20.0); + //WPAGC_DEBUG << "maxGain from Slider = " << m_maxGain << " (" << value << " dB)"; + if (ValidQReal(m_maxGain) == "NaN" || ValidQReal(m_maxGain) == "+Inf" || (m_maxGain <= 0)) { + + mutex.unlock(); + WPAGC_DEBUG << "illegal value for maximum gain !"; + return false; // illegal values! + } + else + loadWcpAGC(); + + mutex.unlock(); + return true; +} + +// variable AGC gain = "Slope", linear +void QWPAGC::setVarGain(qreal value) { + + mutex.lock(); + m_varGain = value; + loadWcpAGC(); + mutex.unlock(); +} + +// variable AGC gain = "Slope", in dB +void QWPAGC::setVarGainDb(qreal value) { + + mutex.lock(); + m_varGain = qPow(10.0, value / 20.0); + loadWcpAGC(); + mutex.unlock(); +} + +// for hang threshold slider, range 0.0 to 1.0 +void QWPAGC::setHangThresh(qreal value) { + + mutex.lock(); + //WPAGC_DEBUG << "m_hang_thresh = " << value; + m_hangThresh = value; + loadWcpAGC(); + mutex.unlock(); +} + +// hangtime in SECONDS +void QWPAGC::setHangTime(qreal value) { + + mutex.lock(); + m_hangtime = value; + loadWcpAGC(); + mutex.unlock(); +} + +// for line on bandscope +void QWPAGC::setHangLevelDb(qreal value) { + + mutex.lock(); + if (m_maxInput > m_minVolts) { + + // BUG: found by Warren, 15 Jan 2012: 'SinAverage' term NOT needed! + // double convert = SinAverage * qPow(10.0, value / 20.0); + qreal convert = qPow(10.0, value / 20.0); + qreal tmp = qMax(1.0e-8, (convert - m_minVolts) / (m_maxInput - m_minVolts)); + m_hangThresh = 1.0 + 0.125 * log10(tmp); + } + else + m_hangThresh = 1.0; + + loadWcpAGC(); + mutex.unlock(); + + emit agcHangThresholdChanged(m_hangThresh * 100.0); +} + +// for line on bandscope +qreal QWPAGC::getHangLevelDb() { + + return 20.0 * log10(m_hangLevel / SinAverage); +} + +// for line on bandscope +//qreal QWPAGC::getAGCThreshDb(qreal filt_high, qreal filt_low, int spec_size) { +// +// qreal noise_offset = 10.0 * log10(qAbs(filt_high - filt_low) * spec_size / m_samplerate); +// return 20.0 * log10(m_min_volts) - noise_offset; +//} + +// for line on bandscope +void QWPAGC::setAGCThreshDb(qreal filt_high, qreal filt_low, int spec_size, qreal thresh) { + + mutex.lock(); + qreal noise_offset = 10.0 * log10(qAbs(filt_high - filt_low) * spec_size / m_samplerate); + m_maxGain = m_out_target / (m_varGain * qPow(10.0, (thresh + noise_offset) / 20.0)); + + loadWcpAGC(); + mutex.unlock(); + + //WPAGC_DEBUG << "maxGain = " << m_maxGain; + emit agcMaximumGainChanged(m_maxGain); +} + +void QWPAGC::filterChanged() { + + emit displayValues(this, m_receiver, m_minVolts, 20.0 * log10(m_hangLevel / SinAverage)); +} diff --git a/Source/src/QtDSP/qtdsp_wpagc.h b/Source/src/QtDSP/qtdsp_wpagc.h new file mode 100644 index 0000000..2ffe4d1 --- /dev/null +++ b/Source/src/QtDSP/qtdsp_wpagc.h @@ -0,0 +1,178 @@ +/** +* @file qtdsp_wpagc.h +* @brief Warren Pratt's ingenious AGC header file for QtDSP +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-05-14 +*/ + +/* + * Copyright (C) 2011, 2012 Warren Pratt, NR0V + * + * adapted for QtDSP by (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The author can be reached by email at + * + * warren@wpratt.com + */ + +#ifndef _QTDSP_WPAGC_H +#define _QTDSP_WPAGC_H + +#include "qtdsp_qComplex.h" +#include "../cusdr_settings.h" + +#include +#include + +#define RINGBUFFERSIZE 19200 +#define SINAVERAGE 0.637f + +#ifdef LOG_WPAGC +# define WPAGC_DEBUG qDebug().nospace() << "WPAGC::\t" +#else +# define WPAGC_DEBUG nullDebug() +#endif + + +class QWPAGC : public QObject { + + Q_OBJECT + +public: + QWPAGC(QObject *parent = 0, int size = 0); + ~QWPAGC(); + + void ProcessAGC(CPX &in, CPX &out, int size); + + qreal getAGCFixedGain(); + qreal getAGCFixedGainDb(); + qreal getAGCMaximumGain_dBm(); + qreal getTauAttack(); + qreal getTauDecay(); + + void setReceiver(int rx); + +public slots: + void setSampleRate(QObject *sender, int value); + void setMode(AGCMode mode); + void setAGCHangEnable(bool value); + void setAGCFixedGain(qreal value); + void setAGCFixedGainDb(qreal value); + void setTauAttack(qreal value); + void setTauDecay(qreal value); + bool setMaximumGain(qreal value); + bool setMaximumGainDb(qreal value); + void setVarGain(qreal value); + void setVarGainDb(qreal value); + void setHangThresh(qreal value); + void setHangTime(qreal value); + void setHangLevelDb(qreal value); + void setAGCThreshDb(qreal filt_high, qreal filt_low, int spec_size, qreal thresh); + void filterChanged(); + + //qreal getAGCThreshDb(qreal filt_high, qreal filt_low, int spec_size); + qreal getHangLevelDb(); + +private: + Settings *set; + + QMutex mutex; + //QVector m_abs_ring; + + AGCMode m_agcMode; + + CPX ring; + CPX buf; + cpx outSample; + + bool m_agcHangEnable; + + int m_size; + int m_receiver; + int m_samplerate; + int m_nTau; + int m_outIndex; + int m_inIndex; + int m_attackBuffersize; + int m_state; + int m_hangCounter; + int m_decayType; + + qreal m_fixedGain; + qreal m_tauAttack; + qreal m_tauDecay; + + qreal m_maxGain; + qreal m_varGain; + qreal m_minVolts; + qreal m_maxInput; + qreal m_out_targ; + qreal m_out_target; + qreal m_inv_max_input; + qreal m_slope_constant; + qreal m_ring_max; + + //qreal absRing[RINGBUFFERSIZE]; + QVector absRing; + + qreal m_attack_mult; + qreal m_decay_mult; + qreal m_volts; + qreal m_save_volts; + qreal m_abs_out_sample; + qreal m_tau_fast_backaverage; + qreal m_fast_backmult; + qreal m_onemfast_backmult; + qreal m_fast_backaverage; + qreal m_tau_fast_decay; + qreal m_fast_decay_mult; + qreal m_pop_ratio; + + qreal m_hang_backaverage; + qreal m_tau_hang_backmult; + qreal m_hang_backmult; + qreal m_onemhang_backmult; + + qreal mult; + + qreal m_hangtime; + qreal m_hangThresh; + qreal m_hangLevel; + + qreal m_tau_hang_decay; + qreal m_hang_decay_mult; + + // average of the absolute value of a sin wave of magnitude 1.0 + qreal SinAverage;// = 0.637; + + void initWcpAGC(); + void loadWcpAGC(); + + bool getAGCHangEnable() { return m_agcHangEnable; } + +private slots: + +signals: + void agcMaximumGainChanged(qreal value); + void agcHangThresholdChanged(qreal value); + void hangLeveldBLineChanged(qreal value); + void minimumVoltageChanged(QObject* sender, int rx, qreal value); + void displayValues(QObject* sender, int rx, qreal minVoltage, qreal hangLevel); +}; + +#endif // _QTDSP_WPAGC_H diff --git a/Source/src/Util/cusdr_buttons.cpp b/Source/src/Util/cusdr_buttons.cpp new file mode 100644 index 0000000..dbfc6c1 --- /dev/null +++ b/Source/src/Util/cusdr_buttons.cpp @@ -0,0 +1,223 @@ +/** +* @file cusdr_buttons.cpp +* @brief Button implementation class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-28 +*/ + +/* + * adapted from: http://www.qtcentre.org/wiki/index.php?title=AeroButton + * Copyright (C) 2008 Jim Daniel + * + * (C) 2010, 2011 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "cusdr_buttons.h" + +AeroButton::AeroButton(QWidget *parent) + : QPushButton(parent) + ,m_state(OFF) + ,m_hovered(false) + ,m_pressed(false) + ,m_color(QColor(150, 150, 150)) + ,m_color_on(QColor(85, 210, 250)) + //,m_color_on(QColor(105, 105, 250)) + ,m_highlight(QColor(0x91, 0xeb, 0xff)) + ,m_shadow(Qt::black) + ,m_textcolor(QColor(255, 255, 255)) + ,m_opacity(1.0) + ,m_glass(true) + ,m_roundness(0){} + +AeroButton::AeroButton(const QString &text, QWidget *parent) + : QPushButton(text, parent) + ,m_state(OFF) + ,m_hovered(false) + ,m_pressed(false) + ,m_color(QColor(90, 90, 90)) + ,m_color_on(QColor(85, 210, 250)) + //,m_color_on(QColor(105, 105, 250)) + ,m_highlight(QColor(0x91, 0xeb, 0xff)) + ,m_shadow(Qt::black) + ,m_textcolor(QColor(255, 255, 255)) + ,m_opacity(1.0) + ,m_glass(true) + ,m_roundness(0){} + +AeroButton::AeroButton(const QIcon &icon, const QString &text, QWidget *parent) + : QPushButton(icon, text, parent) + ,m_state(OFF) + ,m_hovered(false) + ,m_pressed(false) + ,m_color(QColor(150, 150, 150)) + ,m_color_on(QColor(85, 210, 250)) + //,m_color_on(QColor(105, 105, 250)) + ,m_highlight(QColor(0x91, 0xeb, 0xff)) + ,m_shadow(Qt::black) + ,m_textcolor(QColor(255, 255, 255)) + ,m_icon(icon) + ,m_opacity(1.0) + ,m_glass(true) + ,m_roundness(0){} + + +AeroButton::~AeroButton(){} + +void AeroButton::paintEvent(QPaintEvent * pe) +{ + Q_UNUSED(pe); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + //test for state changes + QColor button_color; + if(this->isEnabled()) + { + if (m_state == ON) { + + m_hovered ? button_color = m_highlight : button_color = m_color_on; + } + else if (m_state == OFF) { + + m_hovered ? button_color = m_highlight : button_color = m_color; + } + + if(m_pressed) + { + button_color = m_highlight.darker(250); + } + } + else + { + button_color = QColor(50, 50, 50); + } + + QRect button_rect = this->geometry(); + + //outline + painter.setPen(QPen(QBrush(Qt::black), 2.0)); + QPainterPath outline; + outline.addRoundRect(0, 0, button_rect.width(), button_rect.height(), m_roundness, m_roundness); + painter.setOpacity(m_opacity); + painter.drawPath(outline); + + //gradient + QLinearGradient gradient(0, 0, 0, button_rect.height()); + gradient.setSpread(QGradient::ReflectSpread); + gradient.setColorAt(0.0, button_color); + gradient.setColorAt(0.4, m_shadow); + gradient.setColorAt(0.6, m_shadow); + gradient.setColorAt(1.0, button_color); + + QBrush brush(gradient); + painter.setBrush(brush); + painter.setPen(QPen(QBrush(button_color), 2.0)); + + //main button + QPainterPath painter_path; + painter_path.addRoundRect(1, 1, button_rect.width() - 2, button_rect.height() - 2, m_roundness, m_roundness); + painter.setClipPath(painter_path); + + painter.setOpacity(m_opacity); + painter.drawRoundRect(1, 1, button_rect.width() - 2, button_rect.height() - 2, m_roundness, m_roundness); + + //glass highlight + painter.setBrush(QBrush(Qt::white)); + painter.setPen(QPen(QBrush(Qt::white), 0.01)); + painter.setOpacity(0.30); + if (m_glass) + painter.drawRect(1, 1, button_rect.width() - 2, (button_rect.height() / 2) - 2); + + //text + QString text = this->text(); + if(!text.isNull()) + { + QFont font = this->font(); + painter.setFont(font); + //painter.setPen(Qt::white); + painter.setPen(m_textcolor); + painter.setOpacity(1.0); + painter.drawText(0, 0, button_rect.width(), button_rect.height(), Qt::AlignCenter, text); + } + + //icon + //QIcon icon = this->icon(); + QIcon icon = m_icon; + if(!icon.isNull()) + { + QSize icon_size = this->iconSize(); + QRect icon_position = this->calculateIconPosition(button_rect, icon_size); + //painter.setOpacity(1.0); + m_hovered ? painter.setOpacity(1.0) : painter.setOpacity(0.7); + painter.drawPixmap(icon_position, QPixmap(icon.pixmap(icon_size))); + //painter.drawPixmap(QRect(0, 0, icon_size.width(), icon_size.height()), QPixmap(icon.pixmap(icon_size))); + } +} + +//void AeroButton::setBtnState( BtnState state ) { m_btnState = state; } + +AeroButton::BtnState AeroButton::btnState() const { return m_state; } + +void AeroButton::enterEvent(QEvent * e) +{ + m_hovered = true; + this->repaint(); + + QPushButton::enterEvent(e); +} + +void AeroButton::leaveEvent(QEvent * e) +{ + m_hovered = false; + this->repaint(); + + QPushButton::leaveEvent(e); +} + +void AeroButton::mousePressEvent(QMouseEvent * e) +{ + m_pressed = true; + this->repaint(); + + QPushButton::mousePressEvent(e); +} + +void AeroButton::mouseReleaseEvent(QMouseEvent * e) +{ + m_pressed = false; + this->repaint(); + + QPushButton::mouseReleaseEvent(e); +} + +QRect AeroButton::calculateIconPosition(QRect button_rect, QSize icon_size) +{ + int x = (button_rect.width() / 2) - (icon_size.width() / 2); + int y = (button_rect.height() / 2) - (icon_size.height() / 2); + int width = icon_size.width(); + int height = icon_size.height(); + + QRect icon_position; + icon_position.setX(x); + icon_position.setY(y); + icon_position.setWidth(width); + icon_position.setHeight(height); + + return icon_position; +} diff --git a/Source/src/Util/cusdr_buttons.h b/Source/src/Util/cusdr_buttons.h new file mode 100644 index 0000000..e8a23b0 --- /dev/null +++ b/Source/src/Util/cusdr_buttons.h @@ -0,0 +1,100 @@ +/** +* @file cusdr_buttons.h +* @brief Button implementation header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-28 +*/ + +/* + * adapted from: http://www.qtcentre.org/wiki/index.php?title=AeroButton + * Copyright (C) 2008 Jim Daniel + * + * (C) 2010, 2011 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_BUTTON +#define CUSDR_BUTTON + +//#include +#include +#include + + +class AeroButton : public QPushButton +{ + Q_OBJECT + +public: + AeroButton(QWidget* parent = 0); + AeroButton(const QString &text, QWidget* parent = 0); + AeroButton(const QIcon &icon, const QString &text, QWidget* parent = 0); + + ~AeroButton(); + + enum BtnState { OFF, ON }; + + void setBtnState(BtnState state) { m_state = state; } + BtnState btnState() const; + + void setColor(QColor &color) { m_color = color; } + void setColorOn(QColor &color) { m_color_on = color; } + void setTextColor(QColor &color) { m_textcolor = color; } + void setHighlight(QColor &highlight) { m_highlight = highlight; } + void setShadow(QColor &shadow) { m_shadow = shadow; } + void setGlass(bool glass) { m_glass = glass; } + + //Range: 0.0 [invisible] - 1.0 [opaque] + void setOpacity(qreal opacity) { m_opacity = opacity; } + + //Range: 0 [rectangle] - 99 [oval] + void setRoundness(int roundness) { m_roundness = roundness; } + void setIcon(QIcon icon) { m_icon = icon; } + +protected: + void paintEvent(QPaintEvent *pe); + + void enterEvent(QEvent *e); + void leaveEvent(QEvent *e); + + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + QRect calculateIconPosition(QRect button_rect, QSize icon_size); + +private: + BtnState m_state; + + bool m_hovered; + bool m_pressed; + + QColor m_color; + QColor m_color_on; + QColor m_highlight; + QColor m_shadow; + QColor m_textcolor; + + QIcon m_icon; + + qreal m_opacity; + + bool m_glass; + int m_roundness; +}; + +#endif // CUSDR_BUTTON diff --git a/Source/src/Util/cusdr_colorTriangle.cpp b/Source/src/Util/cusdr_colorTriangle.cpp new file mode 100644 index 0000000..cd59e98 --- /dev/null +++ b/Source/src/Util/cusdr_colorTriangle.cpp @@ -0,0 +1,1523 @@ +/** +* @file cusdr_colorTriangle.cpp +* @brief Color triangle class for cuSDR +*/ + +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +#include "cusdr_colorTriangle.h" + +#include +//#include +#include +#include +//#include +//#include +//#include +//#include +//#include +#include +#include +//#include +//#include +//#include +//#include +//#include + +//#include + +/*! \class QtColorTriangle + + \brief The QtColorTriangle class provides a triangular color + selection widget. + + This widget uses the HSV color model, and is therefore useful for + selecting colors by eye. + + The triangle in the center of the widget is used for selecting + saturation and value, and the surrounding circle is used for + selecting hue. + + Use setColor() and color() to set and get the current color. + + \img colortriangle.png +*/ + +/*! \fn QtColorTriangle::colorChanged(const QColor &color) + + Whenever the color triangles color changes this signal is emitted + with the new \a color. +*/ + +const double PI = 3.14159265358979323846264338327950288419717; +const double TWOPI = 2.0*PI; + +/* + Used to store color values in the range 0..255 as doubles. +*/ +struct DoubleColor +{ + double r, g, b; + + DoubleColor() : r(0.0), g(0.0), b(0.0) {} + DoubleColor(double red, double green, double blue) : r(red), g(green), b(blue) {} + DoubleColor(const DoubleColor &c) : r(c.r), g(c.g), b(c.b) {} +}; + +/* + Used to store pairs of DoubleColor and DoublePoint in one structure. +*/ +struct Vertex { + DoubleColor color; + QPointF point; + + Vertex(const DoubleColor &c, const QPointF &p) : color(c), point(p) {} + Vertex(const QColor &c, const QPointF &p) + : color(DoubleColor((double) c.red(), (double) c.green(), + (double) c.blue())), point(p) {} +}; + +/*! \internal + +Swaps the Vertex at *a with the one at *b. + */ +static void swap(Vertex **a, Vertex **b) +{ + Vertex *tmp = *a; + *a = *b; + *b = tmp; +} + +/*! + Constructs a color triangle widget with the given \a parent. +*/ +QtColorTriangle::QtColorTriangle(QWidget *parent) + : QWidget(parent), bg(sizeHint(), QImage::Format_RGB32), selMode(Idle) +{ + setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + setFocusPolicy(Qt::StrongFocus); + + mustGenerateBackground = true; + + QColor tmp; + tmp.setHsv(76, 184, 206); + setColor(tmp); +} + +/*! + Destructs the color triangle. +*/ +QtColorTriangle::~QtColorTriangle() +{ +} + +/*! + \internal + + Generates the first background image. +*/ +void QtColorTriangle::polish() +{ + outerRadius = (contentsRect().width() - 1) / 2; + if ((contentsRect().height() - 1) / 2 < outerRadius) + outerRadius = (contentsRect().height() - 1) / 2; + + penWidth = (int) qFloor(outerRadius / 50.0); + ellipseSize = (int) qFloor(outerRadius / 12.5); + + double cx = (double) contentsRect().center().x(); + double cy = (double) contentsRect().center().y(); + + pa = QPointF(cx + (qCos(a) * (outerRadius - (outerRadius / 5.0))), + cy - (qSin(a) * (outerRadius - (outerRadius / 5.0)))); + pb = QPointF(cx + (qCos(b) * (outerRadius - (outerRadius / 5.0))), + cy - (qSin(b) * (outerRadius - (outerRadius / 5.0)))); + pc = QPointF(cx + (qCos(c) * (outerRadius - (outerRadius / 5.0))), + cy - (qSin(c) * (outerRadius - (outerRadius / 5.0)))); + pd = QPointF(cx + (qCos(a) * (outerRadius - (outerRadius / 10.0))), + cy - (qSin(a) * (outerRadius - (outerRadius / 10.0)))); + + // Find the current position of the selector + selectorPos = pointFromColor(curColor); + + update(); +} + +/*! \reimp + */ +QSize QtColorTriangle::sizeHint() const +{ + return QSize(80, 80); +} + +/*! + Forces the triangle widget to always be square. Returns the value + \a w. +*/ +int QtColorTriangle::heightForWidth(int w) const +{ + return w; +} + +/*! + \internal + + Generates a new static background image. This function is called + initially, and in resizeEvent. +*/ +void QtColorTriangle::genBackground() +{ + // Find the inner radius of the hue donut. + double innerRadius = outerRadius - outerRadius / 5; + + // Create an image of the same size as the contents rect. + bg = QImage(contentsRect().size(), QImage::Format_RGB32); + QPainter p(&bg); + p.setRenderHint(QPainter::Antialiasing); + //p.fillRect(bg.rect(), QColor::fromRgb(190,206,188)); + p.fillRect(bg.rect(), QColor::fromRgb(10,10,10)); + + //p.setPen(QColor::fromRgb(59,90,74)); + p.setPen(QColor::fromRgb(0,0,0)); + p.drawRect(bg.rect()); + + QConicalGradient gradient(bg.rect().center(), 90); + QColor color; + for (double i = 0; i <= 1.0; i += 0.1) { +#if QT_VERSION < 0x040100 + color.setHsv(int(i * 360.0), 255, 255); +#else + color.setHsv(int(360.0 - (i * 360.0)), 255, 255); +#endif + gradient.setColorAt(i, color); + } + + QRectF innerRadiusRect(bg.rect().center().x() - innerRadius, bg.rect().center().y() - innerRadius, + innerRadius * 2 + 1, innerRadius * 2 + 1); + QRectF outerRadiusRect(bg.rect().center().x() - outerRadius, bg.rect().center().y() - outerRadius, + outerRadius * 2 + 1, outerRadius * 2 + 1); + QPainterPath path; + path.addEllipse(innerRadiusRect); + path.addEllipse(outerRadiusRect); + + p.save(); + p.setClipPath(path); + p.fillRect(bg.rect(), gradient); + p.restore(); + + double penThickness = bg.width() / 400.0; + for (int f = 0; f <= 5760; f += 20) { + int value = int((0.5 + cos(((f - 1800) / 5760.0) * TWOPI) / 2) * 255.0); + + color.setHsv(int((f / 5760.0) * 360.0), 128 + (255 - value)/2, 255 - (255 - value)/4); + p.setPen(QPen(color, penThickness)); + p.drawArc(innerRadiusRect, 1440 - f, 20); + + color.setHsv(int((f / 5760.0) * 360.0), 128 + value/2, 255 - value/4); + p.setPen(QPen(color, penThickness)); + p.drawArc(outerRadiusRect, 2880 - 1440 - f, 20); + } + return; +} + +/*! + \internal + + Selects new hue or saturation/value values, depending on where the + mouse button was pressed initially. +*/ +void QtColorTriangle::mouseMoveEvent(QMouseEvent *e) +{ + if ((e->buttons() & Qt::LeftButton) == 0) + return; + + QPointF depos((double) e->pos().x(), (double) e->pos().y()); + bool newColor = false; + + if (selMode == SelectingHue) { + // If selecting hue, find the new angles for the points a,b,c + // of the triangle. The following update() will then redraw + // the triangle. + a = angleAt(depos, contentsRect()); + b = a + TWOPI / 3.0; + c = b + TWOPI / 3.0; + if (b > TWOPI) b -= TWOPI; + if (c > TWOPI) c -= TWOPI; + + double am = a - PI/2; + if (am < 0) am += TWOPI; + + curHue = 360 - (int) (((am) * 360.0) / TWOPI); + int h,s,v; + curColor.getHsv(&h, &s, &v); + + if (curHue != h) { + newColor = true; + curColor.setHsv(curHue, s, v); + } + + double cx = (double) contentsRect().center().x(); + double cy = (double) contentsRect().center().y(); + + pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 5.0)))); + pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(b) * (outerRadius - (outerRadius / 5.0)))); + pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(c) * (outerRadius - (outerRadius / 5.0)))); + pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 10.0)))); + + selectorPos = pointFromColor(curColor); + } else { + Vertex aa(Qt::black, pa); + Vertex bb(Qt::black, pb); + Vertex cc(Qt::black, pc); + + Vertex *p1 = &aa; + Vertex *p2 = &bb; + Vertex *p3 = &cc; + if (p1->point.y() > p2->point.y()) swap(&p1, &p2); + if (p1->point.y() > p3->point.y()) swap(&p1, &p3); + if (p2->point.y() > p3->point.y()) swap(&p2, &p3); + + selectorPos = movePointToTriangle(depos.x(), depos.y(), aa, bb, cc); + QColor col = colorFromPoint(selectorPos); + if (col != curColor) { + // Ensure that hue does not change when selecting + // saturation and value. + int h,s,v; + col.getHsv(&h, &s, &v); + curColor.setHsv(curHue, s, v); + newColor = true; + } + } + + if (newColor) + emit colorChanged(curColor); + + update(); +} + +/*! + \internal + + When the left mouse button is pressed, this function determines + what part of the color triangle the cursor is, and from that it + initiates either selecting the hue (outside the triangle's area) + or the saturation/value (inside the triangle's area). +*/ +void QtColorTriangle::mousePressEvent(QMouseEvent *e) +{ + // Only respond to the left mouse button. + if (e->button() != Qt::LeftButton) + return; + + QPointF depos((double) e->pos().x(), (double) e->pos().y()); + double rad = radiusAt(depos, contentsRect()); + bool newColor = false; + + // As in mouseMoveEvent, either find the a,b,c angles or the + // radian position of the selector, then order an update. + if (rad > (outerRadius - (outerRadius / 5))) { + selMode = SelectingHue; + + a = angleAt(depos, contentsRect()); + b = a + TWOPI / 3.0; + c = b + TWOPI / 3.0; + if (b > TWOPI) b -= TWOPI; + if (c > TWOPI) c -= TWOPI; + + double am = a - PI/2; + if (am < 0) am += TWOPI; + + curHue = 360 - (int) ((am * 360.0) / TWOPI); + int h,s,v; + curColor.getHsv(&h, &s, &v); + + if (h != curHue) { + newColor = true; + curColor.setHsv(curHue, s, v); + } + + double cx = (double) contentsRect().center().x(); + double cy = (double) contentsRect().center().y(); + + pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 5.0)))); + pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(b) * (outerRadius - (outerRadius / 5.0)))); + pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(c) * (outerRadius - (outerRadius / 5.0)))); + pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 10.0)))); + + selectorPos = pointFromColor(curColor); + emit colorChanged(curColor); + } else { + selMode = SelectingSatValue; + + Vertex aa(Qt::black, pa); + Vertex bb(Qt::black, pb); + Vertex cc(Qt::black, pc); + + Vertex *p1 = &aa; + Vertex *p2 = &bb; + Vertex *p3 = &cc; + if (p1->point.y() > p2->point.y()) swap(&p1, &p2); + if (p1->point.y() > p3->point.y()) swap(&p1, &p3); + if (p2->point.y() > p3->point.y()) swap(&p2, &p3); + + selectorPos = movePointToTriangle(depos.x(), depos.y(), aa, bb, cc); + QColor col = colorFromPoint(selectorPos); + if (col != curColor) { + curColor = col; + newColor = true; + } + } + + if (newColor) + emit colorChanged(curColor); + + update(); +} + +/*! + \internal + + Stops selecting of colors with the mouse. +*/ +void QtColorTriangle::mouseReleaseEvent(QMouseEvent *e) +{ + if (e->button() == Qt::LeftButton) + selMode = Idle; +} + +/*! + \internal +*/ +void QtColorTriangle::keyPressEvent(QKeyEvent *e) +{ + switch (e->key()) { + case Qt::Key_Left: { + --curHue; + if (curHue < 0) curHue += 360; + int h,s,v; + curColor.getHsv(&h, &s, &v); + QColor tmp; + tmp.setHsv(curHue, s, v); + setColor(tmp); + } + break; + case Qt::Key_Right: { + ++curHue; + if (curHue > 359) curHue -= 360; + int h,s,v; + curColor.getHsv(&h, &s, &v); + QColor tmp; + tmp.setHsv(curHue, s, v); + setColor(tmp); + } + break; + case Qt::Key_Up: { + int h,s,v; + curColor.getHsv(&h, &s, &v); + QColor tmp; + if (e->modifiers() & Qt::ShiftModifier) { + if (s > 5) s -= 5; + else s = 0; + } else { + if (v > 5) v -= 5; + else v = 0; + } + tmp.setHsv(curHue, s, v); + setColor(tmp); + } + break; + case Qt::Key_Down: { + int h,s,v; + curColor.getHsv(&h, &s, &v); + QColor tmp; + if (e->modifiers() & Qt::ShiftModifier) { + if (s < 250) s += 5; + else s = 255; + } else { + if (v < 250) v += 5; + else v = 255; + } + tmp.setHsv(curHue, s, v); + setColor(tmp); + } + break; + }; +} + +/*! + \internal + + Regenerates the background image and sends an update. +*/ +void QtColorTriangle::resizeEvent(QResizeEvent *) +{ + outerRadius = (contentsRect().width() - 10) / 2; + if ((contentsRect().height() - 1) / 2 < outerRadius) + outerRadius = (contentsRect().height() - 10) / 2; + + penWidth = (int) floor(outerRadius / 50.0); + ellipseSize = (int) floor(outerRadius / 12.5); + + double cx = (double) contentsRect().center().x(); + double cy = (double) contentsRect().center().y(); + + pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 5.0)))); + pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(b) * (outerRadius - (outerRadius / 5.0)))); + pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(c) * (outerRadius - (outerRadius / 5.0)))); + pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 10.0)))); + + // Find the current position of the selector + selectorPos = pointFromColor(curColor); + + mustGenerateBackground = true; + update(); +} + +/*! \reimp + +First copies a background image of the hue donut and its + background color onto the frame, then draws the color triangle, + and finally the selectors. +*/ +void QtColorTriangle::paintEvent(QPaintEvent *e) +{ + QPainter p(this); + if (e->rect().intersects(contentsRect())) + p.setClipRegion(e->region().intersected(contentsRect())); + if (mustGenerateBackground) { + genBackground(); + mustGenerateBackground = false; + } + + // Blit the static generated background with the hue gradient onto + // the double buffer. + QImage buf = bg.copy(); + + // Draw the trigon + int h,s,v; + curColor.getHsv(&h, &s, &v); + + // Find the color with only the hue, and max value and saturation + QColor hueColor; + hueColor.setHsv(curHue, 255, 255); + + // Draw the triangle + drawTrigon(&buf, pa, pb, pc, hueColor); + + // Slow step: convert the image to a pixmap + QPixmap pix = QPixmap::fromImage(buf); + QPainter painter(&pix); + painter.setRenderHint(QPainter::Antialiasing); + + // Draw an outline of the triangle + QColor halfAlpha(0, 0, 0, 128); + painter.setPen(QPen(halfAlpha, 0)); + painter.drawLine(pa, pb); + painter.drawLine(pb, pc); + painter.drawLine(pc, pa); + + int ri, gi, bi; + hueColor.getRgb(&ri, &gi, &bi); + if ((ri * 30) + (gi * 59) + (bi * 11) > 12800) + painter.setPen(QPen(Qt::black, penWidth)); + else + painter.setPen(QPen(Qt::white, penWidth)); + painter.drawEllipse((int) (pd.x() - ellipseSize / 2.0), + (int) (pd.y() - ellipseSize / 2.0), + ellipseSize, ellipseSize); + + curColor.getRgb(&ri, &gi, &bi); + + // Find a color for painting the selector based on the brightness + // value of the color. + if ((ri * 30) + (gi * 59) + (bi * 11) > 12800) + painter.setPen(QPen(Qt::black, penWidth)); + else + painter.setPen(QPen(Qt::white, penWidth)); + + // Draw the selector ellipse. + painter.drawEllipse(QRectF(selectorPos.x() - ellipseSize / 2.0, + selectorPos.y() - ellipseSize / 2.0, + ellipseSize + 0.5, ellipseSize + 0.5)); + + // Blit + p.drawPixmap(contentsRect().topLeft(), pix); +} + +/*! \internal + +Draws a trigon (polygon with three corners \a pa, \a pb and \a pc + and three edges), using \a painter. + + Fills the trigon with a gradient, where the \a pa point has the + color \a color, \a pb is black and \a bc is white. Bilinear + gradient. +*/ +void QtColorTriangle::drawTrigon(QImage *buf, const QPointF &pa, + const QPointF &pb, const QPointF &pc, + const QColor &color) +{ + // Create three Vertex objects. A Vertex contains a double-point + // coordinate and a color. + // pa is the tip of the arrow + // pb is the black corner + // pc is the white corner + Vertex aa(color, pa); + Vertex bb(Qt::black, pb); + Vertex cc(Qt::white, pc); + + // Sort. Make p1 above p2, which is above p3 (using y coordinate). + // Bubble sorting is fastest here. + Vertex *p1 = &aa; + Vertex *p2 = &bb; + Vertex *p3 = &cc; + if (p1->point.y() > p2->point.y()) swap(&p1, &p2); + if (p1->point.y() > p3->point.y()) swap(&p1, &p3); + if (p2->point.y() > p3->point.y()) swap(&p2, &p3); + + // All the three y deltas are >= 0 + double p1p2ydist = p2->point.y() - p1->point.y(); + double p1p3ydist = p3->point.y() - p1->point.y(); + double p2p3ydist = p3->point.y() - p2->point.y(); + double p1p2xdist = p2->point.x() - p1->point.x(); + double p1p3xdist = p3->point.x() - p1->point.x(); + double p2p3xdist = p3->point.x() - p2->point.x(); + + // The first x delta decides wether we have a lefty or a righty + // trigon. + bool lefty = p1p2xdist < 0; + + // Left and right colors and X values. The key in this map is the + // y values. Our goal is to fill these structures with all the + // information needed to do a single pass top-to-bottom, + // left-to-right drawing of the trigon. + QVarLengthArray leftColors; + QVarLengthArray rightColors; + QVarLengthArray leftX; + QVarLengthArray rightX; + + leftColors.resize(int(floor(p3->point.y() + 1))); + rightColors.resize(int(floor(p3->point.y() + 1))); + leftX.resize(int(floor(p3->point.y() + 1))); + rightX.resize(int(floor(p3->point.y() + 1))); + + // Scan longy - find all left and right colors and X-values for + // the tallest edge (p1-p3). + DoubleColor source; + DoubleColor dest; + double r, g, b; + double rdelta, gdelta, bdelta; + double x; + double xdelta; + int y1, y2; + + // Initialize with known values + x = p1->point.x(); + source = p1->color; + dest = p3->color; + r = source.r; + g = source.g; + b = source.b; + y1 = (int) floor(p1->point.y()); + y2 = (int) floor(p3->point.y()); + + // Find slopes (notice that if the y dists are 0, we don't care + // about the slopes) + xdelta = p1p3ydist == 0.0 ? 0.0 : p1p3xdist / p1p3ydist; + rdelta = p1p3ydist == 0.0 ? 0.0 : (dest.r - r) / p1p3ydist; + gdelta = p1p3ydist == 0.0 ? 0.0 : (dest.g - g) / p1p3ydist; + bdelta = p1p3ydist == 0.0 ? 0.0 : (dest.b - b) / p1p3ydist; + + // Calculate gradients using linear approximation + int y; + for (y = y1; y < y2; ++y) { + if (lefty) { + rightColors[y] = DoubleColor(r, g, b); + rightX[y] = x; + } else { + leftColors[y] = DoubleColor(r, g, b); + leftX[y] = x; + } + + r += rdelta; + g += gdelta; + b += bdelta; + x += xdelta; + } + + // Scan top shorty - find all left and right colors and x-values + // for the topmost of the two not-tallest short edges. + x = p1->point.x(); + source = p1->color; + dest = p2->color; + r = source.r; + g = source.g; + b = source.b; + y1 = (int) floor(p1->point.y()); + y2 = (int) floor(p2->point.y()); + + // Find slopes (notice that if the y dists are 0, we don't care + // about the slopes) + xdelta = p1p2ydist == 0.0 ? 0.0 : p1p2xdist / p1p2ydist; + rdelta = p1p2ydist == 0.0 ? 0.0 : (dest.r - r) / p1p2ydist; + gdelta = p1p2ydist == 0.0 ? 0.0 : (dest.g - g) / p1p2ydist; + bdelta = p1p2ydist == 0.0 ? 0.0 : (dest.b - b) / p1p2ydist; + + // Calculate gradients using linear approximation + for (y = y1; y < y2; ++y) { + if (lefty) { + leftColors[y] = DoubleColor(r, g, b); + leftX[y] = x; + } else { + rightColors[y] = DoubleColor(r, g, b); + rightX[y] = x; + } + + r += rdelta; + g += gdelta; + b += bdelta; + x += xdelta; + } + + // Scan bottom shorty - find all left and right colors and + // x-values for the bottommost of the two not-tallest short edges. + x = p2->point.x(); + source = p2->color; + dest = p3->color; + r = source.r; + g = source.g; + b = source.b; + y1 = (int) floor(p2->point.y()); + y2 = (int) floor(p3->point.y()); + + // Find slopes (notice that if the y dists are 0, we don't care + // about the slopes) + xdelta = p2p3ydist == 0.0 ? 0.0 : p2p3xdist / p2p3ydist; + rdelta = p2p3ydist == 0.0 ? 0.0 : (dest.r - r) / p2p3ydist; + gdelta = p2p3ydist == 0.0 ? 0.0 : (dest.g - g) / p2p3ydist; + bdelta = p2p3ydist == 0.0 ? 0.0 : (dest.b - b) / p2p3ydist; + + // Calculate gradients using linear approximation + for (y = y1; y < y2; ++y) { + if (lefty) { + leftColors[y] = DoubleColor(r, g, b); + leftX[y] = x; + } else { + rightColors[y] = DoubleColor(r, g, b); + rightX[y] = x; + } + + r += rdelta; + g += gdelta; + b += bdelta; + x += xdelta; + } + + // Inner loop. For each y in the left map of x-values, draw one + // line from left to right. + const int p3yfloor = int(floor(p3->point.y())); + for (int y = int(floor(p1->point.y())); y < p3yfloor; ++y) { + double lx = leftX[y]; + double rx = rightX[y]; + + int lxi = (int) floor(lx); + int rxi = (int) floor(rx); + DoubleColor rc = rightColors[y]; + DoubleColor lc = leftColors[y]; + + // if the xdist is 0, don't draw anything. + double xdist = rx - lx; + if (xdist != 0.0) { + double r = lc.r; + double g = lc.g; + double b = lc.b; + double rdelta = (rc.r - r) / xdist; + double gdelta = (rc.g - g) / xdist; + double bdelta = (rc.b - b) / xdist; + + QRgb *scanline = reinterpret_cast(buf->scanLine(y)); + scanline += lxi; + + // Inner loop 2. Draws the line from left to right. + for (int i = lxi; i < rxi; ++i) { + *scanline++ = qRgb((int) r, (int) g, (int) b); + r += rdelta; + g += gdelta; + b += bdelta; + } + } + } +} + +/*! \internal + +Sets the color of the triangle to \a col. + */ +void QtColorTriangle::setColor(const QColor &col) +{ + if (col == curColor) + return; + + curColor = col; + + int h, s, v; + curColor.getHsv(&h, &s, &v); + + // Never use an invalid hue to display colors + if (h != -1) + curHue = h; + + a = (((360 - curHue) * TWOPI) / 360.0); + a += PI / 2.0; + if (a > TWOPI) a -= TWOPI; + + b = a + TWOPI/3; + c = b + TWOPI/3; + + if (b > TWOPI) b -= TWOPI; + if (c > TWOPI) c -= TWOPI; + + double cx = (double) contentsRect().center().x(); + double cy = (double) contentsRect().center().y(); + double innerRadius = outerRadius - (outerRadius / 5.0); + double pointerRadius = outerRadius - (outerRadius / 10.0); + + pa = QPointF(cx + (cos(a) * innerRadius), cy - (sin(a) * innerRadius)); + pb = QPointF(cx + (cos(b) * innerRadius), cy - (sin(b) * innerRadius)); + pc = QPointF(cx + (cos(c) * innerRadius), cy - (sin(c) * innerRadius)); + pd = QPointF(cx + (cos(a) * pointerRadius), cy - (sin(a) * pointerRadius)); + + selectorPos = pointFromColor(curColor); + update(); + + emit colorChanged(curColor); +} + +/*! \internal + +Returns the current color of the triangle. + */ +QColor QtColorTriangle::color() const +{ + return curColor; +} + +/*! + \internal + + Returns the distance from \a pos to the center of \a rect. +*/ +double QtColorTriangle::radiusAt(const QPointF &pos, const QRect &rect) const +{ + double mousexdist = pos.x() - (double) rect.center().x(); + double mouseydist = pos.y() - (double) rect.center().y(); + return sqrt(mousexdist * mousexdist + mouseydist * mouseydist); +} + +/*! + \internal + + With origin set to the center of \a rect, this function returns + the angle in radians between the line that starts at (0,0) and + ends at (1,0) and the line that stars at (0,0) and ends at \a pos. +*/ +double QtColorTriangle::angleAt(const QPointF &pos, const QRect &rect) const +{ + double mousexdist = pos.x() - (double) rect.center().x(); + double mouseydist = pos.y() - (double) rect.center().y(); + double mouserad = sqrt(mousexdist * mousexdist + mouseydist * mouseydist); + if (mouserad == 0.0) + return 0.0; + + double angle = acos(mousexdist / mouserad); + if (mouseydist >= 0) + angle = TWOPI - angle; + + return angle; +} + +/*! \internal + +Returns a * a. + */ +inline double qsqr(double a) +{ + return a * a; +} + +/*! \internal + +Returns the length of the vector (x,y). + */ +inline double vlen(double x, double y) +{ + return sqrt(qsqr(x) + qsqr(y)); +} + +/*! \internal + +Returns the vector product of (x1,y1) and (x2,y2). + */ +inline double vprod(double x1, double y1, double x2, double y2) +{ + return x1 * x2 + y1 * y2; +} + +/*! \internal + +Returns true if the point cos(p),sin(p) is on the arc between + cos(a1),sin(a1) and cos(a2),sin(a2); otherwise returns false. +*/ +bool angleBetweenAngles(double p, double a1, double a2) +{ + if (a1 > a2) { + a2 += TWOPI; + if (p < PI) p += TWOPI; + } + + return p >= a1 && p < a2; +} + +/*! \internal + + A line from a to b is one of several lines in an equilateral + polygon, and they are drawn counter clockwise. This line therefore + has one side facing in and one facing out of the polygon. This + function determines wether (x,y) is on the inside or outside of + the given line, defined by the "from" coordinate (ax,ay) and the + "to" coordinate (bx,by). + + The point (px,py) is the intersection between the a-b line and the + perpendicular projection of (x,y) onto that line. + + Returns true if (x,y) is above the line; otherwise returns false. + + If ax and bx are equal and ay and by are equal (line is a point), + this function will return true if (x,y) is equal to this point. +*/ +static bool pointAbovePoint(double x, double y, double px, double py, + double ax, double ay, double bx, double by) +{ + bool result = false; + + if (floor(ax) > floor(bx)) { + if (floor(ay) < floor(by)) { + // line is draw upright-to-downleft + if (floor(x) < floor(px) || floor(y) < floor(py)) + result = true; + } else if (floor(ay) > floor(by)) { + // line is draw downright-to-upleft + if (floor(x) > floor(px) || floor(y) < floor(py)) + result = true; + } else { + // line is flat horizontal + if (y < ay) result = true; + } + } else if (floor(ax) < floor(bx)) { + if (floor(ay) < floor(by)) { + // line is draw upleft-to-downright + if (floor(x) < floor(px) || floor(y) > floor(py)) + result = true; + } else if (floor(ay) > floor(by)) { + // line is draw downleft-to-upright + if (floor(x) > floor(px) || floor(y) > floor(py)) + result = true; + } else { + // line is flat horizontal + if (y > ay) + result = true; + } + } else { + // line is vertical + if (floor(ay) < floor(by)) { + if (x < ax) result = true; + } else if (floor(ay) > floor(by)) { + if (x > ax) result = true; + } else { + if (!(x == ax && y == ay)) + result = true; + } + } + + return result; +} + +/*! \internal + +if (ax,ay) to (bx,by) describes a line, and (x,y) is a point on + that line, returns -1 if (x,y) is outside the (ax,ay) bounds, 1 if + it is outside the (bx,by) bounds and 0 if (x,y) is within (ax,ay) + and (bx,by). +*/ +static int pointInLine(double x, double y, double ax, double ay, + double bx, double by) +{ + if (ax > bx) { + if (ay < by) { + // line is draw upright-to-downleft + + // if (x,y) is in on or above the upper right point, + // return -1. + if (y <= ay && x >= ax) + return -1; + + // if (x,y) is in on or below the lower left point, + // return 1. + if (y >= by && x <= bx) + return 1; + } else { + // line is draw downright-to-upleft + + // If the line is flat, only use the x coordinate. + if (floor(ay) == floor(by)) { + // if (x is to the right of the rightmost point, + // return -1. otherwise if x is to the left of the + // leftmost point, return 1. + if (x >= ax) + return -1; + else if (x <= bx) + return 1; + } else { + // if (x,y) is on or below the lower right point, + // return -1. + if (y >= ay && x >= ax) + return -1; + + // if (x,y) is on or above the upper left point, + // return 1. + if (y <= by && x <= bx) + return 1; + } + } + } else { + if (ay < by) { + // line is draw upleft-to-downright + + // If (x,y) is on or above the upper left point, return + // -1. + if (y <= ay && x <= ax) + return -1; + + // If (x,y) is on or below the lower right point, return + // 1. + if (y >= by && x >= bx) + return 1; + } else { + // line is draw downleft-to-upright + + // If the line is flat, only use the x coordinate. + if (floor(ay) == floor(by)) { + if (x <= ax) + return -1; + else if (x >= bx) + return 1; + } else { + // If (x,y) is on or below the lower left point, return + // -1. + if (y >= ay && x <= ax) + return -1; + + // If (x,y) is on or above the upper right point, return + // 1. + if (y <= by && x >= bx) + return 1; + } + } + } + + // No tests proved that (x,y) was outside [(ax,ay),(bx,by)], so we + // assume it's inside the line's bounds. + return 0; +} + +/*! \internal + + \a a, \a b and \a c are corner points of an equilateral triangle. + (\a x,\a y) is an arbitrary point inside or outside this triangle. + + If (x,y) is inside the triangle, this function returns the double + point (x,y). + + Otherwise, the intersection of the perpendicular projection of + (x,y) onto the closest triangle edge is returned, unless this + intersection is outside the triangle's bounds, in which case the + corner closest to the intersection is returned instead. + + Yes, it's trigonometry. +*/ +QPointF QtColorTriangle::movePointToTriangle(double x, double y, const Vertex &a, + const Vertex &b, const Vertex &c) const +{ + // Let v1A be the vector from (x,y) to a. + // Let v2A be the vector from a to b. + // Find the angle alphaA between v1A and v2A. + double v1xA = x - a.point.x(); + double v1yA = y - a.point.y(); + double v2xA = b.point.x() - a.point.x(); + double v2yA = b.point.y() - a.point.y(); + double vpA = vprod(v1xA, v1yA, v2xA, v2yA); + double cosA = vpA / (vlen(v1xA, v1yA) * vlen(v2xA, v2yA)); + double alphaA = acos(cosA); + + // Let v1B be the vector from x to b. + // Let v2B be the vector from b to c. + double v1xB = x - b.point.x(); + double v1yB = y - b.point.y(); + double v2xB = c.point.x() - b.point.x(); + double v2yB = c.point.y() - b.point.y(); + double vpB = vprod(v1xB, v1yB, v2xB, v2yB); + double cosB = vpB / (vlen(v1xB, v1yB) * vlen(v2xB, v2yB)); + double alphaB = acos(cosB); + + // Let v1C be the vector from x to c. + // Let v2C be the vector from c back to a. + double v1xC = x - c.point.x(); + double v1yC = y - c.point.y(); + double v2xC = a.point.x() - c.point.x(); + double v2yC = a.point.y() - c.point.y(); + double vpC = vprod(v1xC, v1yC, v2xC, v2yC); + double cosC = vpC / (vlen(v1xC, v1yC) * vlen(v2xC, v2yC)); + double alphaC = acos(cosC); + + // Find the radian angles between the (1,0) vector and the points + // A, B, C and (x,y). Use this information to determine which of + // the edges we should project (x,y) onto. + double angleA = angleAt(a.point, contentsRect()); + double angleB = angleAt(b.point, contentsRect()); + double angleC = angleAt(c.point, contentsRect()); + double angleP = angleAt(QPointF(x, y), contentsRect()); + + // If (x,y) is in the a-b area, project onto the a-b vector. + if (angleBetweenAngles(angleP, angleA, angleB)) { + // Find the distance from (x,y) to a. Then use the slope of + // the a-b vector with this distance and the angle between a-b + // and a-(x,y) to determine the point of intersection of the + // perpendicular projection from (x,y) onto a-b. + double pdist = sqrt(qsqr(x - a.point.x()) + qsqr(y - a.point.y())); + + // the length of all edges is always > 0 + double p0x = a.point.x() + ((b.point.x() - a.point.x()) / vlen(v2xB, v2yB)) * cos(alphaA) * pdist; + double p0y = a.point.y() + ((b.point.y() - a.point.y()) / vlen(v2xB, v2yB)) * cos(alphaA) * pdist; + + // If (x,y) is above the a-b line, which basically means it's + // outside the triangle, then return its projection onto a-b. + if (pointAbovePoint(x, y, p0x, p0y, a.point.x(), a.point.y(), b.point.x(), b.point.y())) { + // If the projection is "outside" a, return a. If it is + // outside b, return b. Otherwise return the projection. + int n = pointInLine(p0x, p0y, a.point.x(), a.point.y(), b.point.x(), b.point.y()); + if (n < 0) + return a.point; + else if (n > 0) + return b.point; + + return QPointF(p0x, p0y); + } + } else if (angleBetweenAngles(angleP, angleB, angleC)) { + // If (x,y) is in the b-c area, project onto the b-c vector. + double pdist = sqrt(qsqr(x - b.point.x()) + qsqr(y - b.point.y())); + + // the length of all edges is always > 0 + double p0x = b.point.x() + ((c.point.x() - b.point.x()) / vlen(v2xC, v2yC)) * cos(alphaB) * pdist; + double p0y = b.point.y() + ((c.point.y() - b.point.y()) / vlen(v2xC, v2yC)) * cos(alphaB) * pdist; + + if (pointAbovePoint(x, y, p0x, p0y, b.point.x(), b.point.y(), c.point.x(), c.point.y())) { + int n = pointInLine(p0x, p0y, b.point.x(), b.point.y(), c.point.x(), c.point.y()); + if (n < 0) + return b.point; + else if (n > 0) + return c.point; + return QPointF(p0x, p0y); + } + } else if (angleBetweenAngles(angleP, angleC, angleA)) { + // If (x,y) is in the c-a area, project onto the c-a vector. + double pdist = sqrt(qsqr(x - c.point.x()) + qsqr(y - c.point.y())); + + // the length of all edges is always > 0 + double p0x = c.point.x() + ((a.point.x() - c.point.x()) / vlen(v2xA, v2yA)) * cos(alphaC) * pdist; + double p0y = c.point.y() + ((a.point.y() - c.point.y()) / vlen(v2xA, v2yA)) * cos(alphaC) * pdist; + + if (pointAbovePoint(x, y, p0x, p0y, c.point.x(), c.point.y(), a.point.x(), a.point.y())) { + int n = pointInLine(p0x, p0y, c.point.x(), c.point.y(), a.point.x(), a.point.y()); + if (n < 0) + return c.point; + else if (n > 0) + return a.point; + return QPointF(p0x, p0y); + } + } + + // (x,y) is inside the triangle (inside a-b, b-c and a-c). + return QPointF(x, y); +} + +/*! \internal + + Given the color \a col, this function determines the point in the + equilateral triangle defined with (pa, pb, pc) that displays this + color. The function assumes the color at pa has a hue equal to the + hue of \a col, and that pb is black and pc is white. + + In this certain type of triangle, we observe that saturation grows + from the black-color edge towards the black-white edge. The value + grows from the black corner towards the white-color edge. Using + the intersection of the saturation and value points on the three + edges, we are able to determine the point with the same saturation + and value as \a col. +*/ +QPointF QtColorTriangle::pointFromColor(const QColor &col) const +{ + // Simplifications for the corner cases. + if (col == Qt::black) + return pb; + else if (col == Qt::white) + return pc; + + // Find the x and y slopes + double ab_deltax = pb.x() - pa.x(); + double ab_deltay = pb.y() - pa.y(); + double bc_deltax = pc.x() - pb.x(); + double bc_deltay = pc.y() - pb.y(); + double ac_deltax = pc.x() - pa.x(); + double ac_deltay = pc.y() - pa.y(); + + // Extract the h,s,v values of col. + int hue,sat,val; + col.getHsv(&hue, &sat, &val); + + // Find the line that passes through the triangle where the value + // is equal to our color's value. + double p1 = pa.x() + (ab_deltax * (double) (255 - val)) / 255.0; + double q1 = pa.y() + (ab_deltay * (double) (255 - val)) / 255.0; + double p2 = pb.x() + (bc_deltax * (double) val) / 255.0; + double q2 = pb.y() + (bc_deltay * (double) val) / 255.0; + + // Find the line that passes through the triangle where the + // saturation is equal to our color's value. + double p3 = pa.x() + (ac_deltax * (double) (255 - sat)) / 255.0; + double q3 = pa.y() + (ac_deltay * (double) (255 - sat)) / 255.0; + double p4 = pb.x(); + double q4 = pb.y(); + + // Find the intersection between these lines. + double x = 0; + double y = 0; + if (p1 != p2) { + double a = (q2 - q1) / (p2 - p1); + double c = (q4 - q3) / (p4 - p3); + double b = q1 - a * p1; + double d = q3 - c * p3; + + x = (d - b) / (a - c); + y = a * x + b; + } + else { + x = p1; + y = q3 + (x - p3) * (q4 - q3) / (p4 - p3); + } + + return QPointF(x, y); +} + +/*! \internal + + Determines the color in the color triangle at the point \a p. Uses + linear interpolation to find the colors to the left and right of + \a p, then uses the same technique to find the color at \a p using + these two colors. +*/ +QColor QtColorTriangle::colorFromPoint(const QPointF &p) const +{ + // Find the outer radius of the hue gradient. + int outerRadius = (contentsRect().width() - 1) / 2; + if ((contentsRect().height() - 1) / 2 < outerRadius) + outerRadius = (contentsRect().height() - 1) / 2; + + // Find the center coordinates + double cx = (double) contentsRect().center().x(); + double cy = (double) contentsRect().center().y(); + + // Find the a, b and c from their angles, the center of the rect + // and the radius of the hue gradient donut. + QPointF pa(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(a) * (outerRadius - (outerRadius / 5.0)))); + QPointF pb(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(b) * (outerRadius - (outerRadius / 5.0)))); + QPointF pc(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))), + cy - (sin(c) * (outerRadius - (outerRadius / 5.0)))); + + // Find the hue value from the angle of the 'a' point. + double angle = a - PI/2.0; + if (angle < 0) angle += TWOPI; + double hue = (360.0 * angle) / TWOPI; + + // Create the color of the 'a' corner point. We know that b is + // black and c is white. + QColor color; + color.setHsv(360 - (int) floor(hue), 255, 255); + + // See also drawTrigon(), which basically does exactly the same to + // determine all colors in the trigon. + Vertex aa(color, pa); + Vertex bb(Qt::black, pb); + Vertex cc(Qt::white, pc); + + // Make sure p1 is above p2, which is above p3. + Vertex *p1 = &aa; + Vertex *p2 = &bb; + Vertex *p3 = &cc; + if (p1->point.y() > p2->point.y()) swap(&p1, &p2); + if (p1->point.y() > p3->point.y()) swap(&p1, &p3); + if (p2->point.y() > p3->point.y()) swap(&p2, &p3); + + // Find the slopes of all edges in the trigon. All the three y + // deltas here are positive because of the above sorting. + double p1p2ydist = p2->point.y() - p1->point.y(); + double p1p3ydist = p3->point.y() - p1->point.y(); + double p2p3ydist = p3->point.y() - p2->point.y(); + double p1p2xdist = p2->point.x() - p1->point.x(); + double p1p3xdist = p3->point.x() - p1->point.x(); + double p2p3xdist = p3->point.x() - p2->point.x(); + + // The first x delta decides wether we have a lefty or a righty + // trigon. A lefty trigon has its tallest edge on the right hand + // side of the trigon. The righty trigon has it on its left side. + // This property determines wether the left or the right set of x + // coordinates will be continuous. + bool lefty = p1p2xdist < 0; + + // Find whether the selector's y is in the first or second shorty, + // counting from the top and downwards. This is used to find the + // color at the selector point. + bool firstshorty = (p.y() >= p1->point.y() && p.y() < p2->point.y()); + + // From the y value of the selector's position, find the left and + // right x values. + double leftx; + double rightx; + if (lefty) { + if (firstshorty) { + leftx = p1->point.x(); + if (floor(p1p2ydist) != 0.0) { + leftx += (p1p2xdist * (p.y() - p1->point.y())) / p1p2ydist; + } else { + leftx = qMin(p1->point.x(), p2->point.x()); + } + } else { + leftx = p2->point.x(); + if (floor(p2p3ydist) != 0.0) { + leftx += (p2p3xdist * (p.y() - p2->point.y())) / p2p3ydist; + } else { + leftx = qMin(p2->point.x(), p3->point.x()); + } + } + + rightx = p1->point.x(); + rightx += (p1p3xdist * (p.y() - p1->point.y())) / p1p3ydist; + } else { + leftx = p1->point.x(); + leftx += (p1p3xdist * (p.y() - p1->point.y())) / p1p3ydist; + + if (firstshorty) { + rightx = p1->point.x(); + if (floor(p1p2ydist) != 0.0) { + rightx += (p1p2xdist * (p.y() - p1->point.y())) / p1p2ydist; + } else { + rightx = qMax(p1->point.x(), p2->point.x()); + } + } else { + rightx = p2->point.x(); + if (floor(p2p3ydist) != 0.0) { + rightx += (p2p3xdist * (p.y() - p2->point.y())) / p2p3ydist; + } else { + rightx = qMax(p2->point.x(), p3->point.x()); + } + } + } + + // Find the r,g,b values of the points on the trigon's edges that + // are to the left and right of the selector. + double rshort = 0, gshort = 0, bshort = 0; + double rlong = 0, glong = 0, blong = 0; + if (firstshorty) { + if (floor(p1p2ydist) != 0.0) { + rshort = p2->color.r * (p.y() - p1->point.y()) / p1p2ydist; + gshort = p2->color.g * (p.y() - p1->point.y()) / p1p2ydist; + bshort = p2->color.b * (p.y() - p1->point.y()) / p1p2ydist; + rshort += p1->color.r * (p2->point.y() - p.y()) / p1p2ydist; + gshort += p1->color.g * (p2->point.y() - p.y()) / p1p2ydist; + bshort += p1->color.b * (p2->point.y() - p.y()) / p1p2ydist; + } else { + if (lefty) { + if (p1->point.x() <= p2->point.x()) { + rshort = p1->color.r; + gshort = p1->color.g; + bshort = p1->color.b; + } else { + rshort = p2->color.r; + gshort = p2->color.g; + bshort = p2->color.b; + } + } else { + if (p1->point.x() > p2->point.x()) { + rshort = p1->color.r; + gshort = p1->color.g; + bshort = p1->color.b; + } else { + rshort = p2->color.r; + gshort = p2->color.g; + bshort = p2->color.b; + } + } + } + } else { + if (floor(p2p3ydist) != 0.0) { + rshort = p3->color.r * (p.y() - p2->point.y()) / p2p3ydist; + gshort = p3->color.g * (p.y() - p2->point.y()) / p2p3ydist; + bshort = p3->color.b * (p.y() - p2->point.y()) / p2p3ydist; + rshort += p2->color.r * (p3->point.y() - p.y()) / p2p3ydist; + gshort += p2->color.g * (p3->point.y() - p.y()) / p2p3ydist; + bshort += p2->color.b * (p3->point.y() - p.y()) / p2p3ydist; + } else { + if (lefty) { + if (p2->point.x() <= p3->point.x()) { + rshort = p2->color.r; + gshort = p2->color.g; + bshort = p2->color.b; + } else { + rshort = p3->color.r; + gshort = p3->color.g; + bshort = p3->color.b; + } + } else { + if (p2->point.x() > p3->point.x()) { + rshort = p2->color.r; + gshort = p2->color.g; + bshort = p2->color.b; + } else { + rshort = p3->color.r; + gshort = p3->color.g; + bshort = p3->color.b; + } + } + } + } + + // p1p3ydist is never 0 + rlong = p3->color.r * (p.y() - p1->point.y()) / p1p3ydist; + glong = p3->color.g * (p.y() - p1->point.y()) / p1p3ydist; + blong = p3->color.b * (p.y() - p1->point.y()) / p1p3ydist; + rlong += p1->color.r * (p3->point.y() - p.y()) / p1p3ydist; + glong += p1->color.g * (p3->point.y() - p.y()) / p1p3ydist; + blong += p1->color.b * (p3->point.y() - p.y()) / p1p3ydist; + + // rshort,gshort,bshort is the color on one of the shortys. + // rlong,glong,blong is the color on the longy. So depending on + // wether we have a lefty trigon or not, we can determine which + // colors are on the left and right edge. + double rl, gl, bl, rr, gr, br; + if (lefty) { + rl = rshort; gl = gshort; bl = bshort; + rr = rlong; gr = glong; br = blong; + } else { + rl = rlong; gl = glong; bl = blong; + rr = rshort; gr = gshort; br = bshort; + } + + // Find the distance from the left x to the right x (xdist). Then + // find the distances from the selector to each of these (saxdist + // and saxdist2). These distances are used to find the color at + // the selector. + double xdist = rightx - leftx; + double saxdist = p.x() - leftx; + double saxdist2 = xdist - saxdist; + + // Now determine the r,g,b values of the selector using a linear + // approximation. + double r, g, b; + if (xdist != 0.0) { + r = (saxdist2 * rl / xdist) + (saxdist * rr / xdist); + g = (saxdist2 * gl / xdist) + (saxdist * gr / xdist); + b = (saxdist2 * bl / xdist) + (saxdist * br / xdist); + } else { + // In theory, the left and right color will be equal here. But + // because of the loss of precision, we get an error on both + // colors. The best approximation we can get is from adding + // the two errors, which in theory will eliminate the error + // but in practise will only minimize it. + r = (rl + rr) / 2; + g = (gl + gr) / 2; + b = (bl + br) / 2; + } + + // Now floor the color components and fit them into proper + // boundaries. This again is to compensate for the error caused by + // loss of precision. + int ri = (int) floor(r); + int gi = (int) floor(g); + int bi = (int) floor(b); + if (ri < 0) ri = 0; + else if (ri > 255) ri = 255; + if (gi < 0) gi = 0; + else if (gi > 255) gi = 255; + if (bi < 0) bi = 0; + else if (bi > 255) bi = 255; + + // Voila, we have the color at the point of the selector. + return QColor(ri, gi, bi); +} diff --git a/Source/src/Util/cusdr_colorTriangle.h b/Source/src/Util/cusdr_colorTriangle.h new file mode 100644 index 0000000..e133a56 --- /dev/null +++ b/Source/src/Util/cusdr_colorTriangle.h @@ -0,0 +1,140 @@ +/** +* @file cusdr_colorTriangle.h +* @brief Color triangle header file for cuSDR +*/ + +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +#ifndef _CUSDR_COLORTRIANGLE_H +#define _CUSDR_COLORTRIANGLE_H + +#include +#include + +class QPointF; +struct Vertex; + +#if defined(Q_WS_WIN) +# if !defined(QT_QTCOLORTRIANGLE_EXPORT) && !defined(QT_QTCOLORTRIANGLE_IMPORT) +# define QT_QTCOLORTRIANGLE_EXPORT +# elif defined(QT_QTCOLORTRIANGLE_IMPORT) +# if defined(QT_QTCOLORTRIANGLE_EXPORT) +# undef QT_QTCOLORTRIANGLE_EXPORT +# endif +# define QT_QTCOLORTRIANGLE_EXPORT __declspec(dllimport) +# elif defined(QT_QTCOLORTRIANGLE_EXPORT) +# undef QT_QTCOLORTRIANGLE_EXPORT +# define QT_QTCOLORTRIANGLE_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTCOLORTRIANGLE_EXPORT +#endif + +class QT_QTCOLORTRIANGLE_EXPORT QtColorTriangle : public QWidget +{ + Q_OBJECT + +public: + QtColorTriangle(QWidget *parent = 0); + ~QtColorTriangle(); + + QSize sizeHint() const; + int heightForWidth(int w) const; + + void polish(); + QColor color() const; + +Q_SIGNALS: + void colorChanged(const QColor &col); + +public Q_SLOTS: + void setColor(const QColor &col); + QColor getColor() { return curColor; } + +protected: + void paintEvent(QPaintEvent *); + void mouseMoveEvent(QMouseEvent *); + void mousePressEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); + void keyPressEvent(QKeyEvent *e); + void resizeEvent(QResizeEvent *); + void drawTrigon(QImage *p, const QPointF &a, const QPointF &b, + const QPointF &c, const QColor &color); + +private: + double radiusAt(const QPointF &pos, const QRect &rect) const; + double angleAt(const QPointF &pos, const QRect &rect) const; + QPointF movePointToTriangle(double x, double y, const Vertex &a, + const Vertex &b, const Vertex &c) const; + + QPointF pointFromColor(const QColor &col) const; + QColor colorFromPoint(const QPointF &p) const; + + void genBackground(); + + QImage bg; + double a, b, c; + QPointF pa, pb, pc, pd; + + QColor curColor; + int curHue; + + bool mustGenerateBackground; + int penWidth; + int ellipseSize; + + int outerRadius; + QPointF selectorPos; + + enum SelectionMode { + Idle, + SelectingHue, + SelectingSatValue + } selMode; +}; + +#endif // _CUSDR_COLORTRIANGLE_H diff --git a/Source/src/Util/cusdr_cpuUsage.cpp b/Source/src/Util/cusdr_cpuUsage.cpp new file mode 100644 index 0000000..1858b5c --- /dev/null +++ b/Source/src/Util/cusdr_cpuUsage.cpp @@ -0,0 +1,316 @@ +/* + * Windows part for CPU usage by (c) 2009 Ben Watson + * + * taken from http://www.philosophicalgeek.com/2009/01/03/determine-cpu-usage-of-current-process-c-and-c/ + * + * adapted for cuSDR by (c) 2012 Hermann von Hasseln, DL3HVH + * + * + * Linux part for CPU usage by (c) by Fabian Holler + * + * taken from https://github.com/fho/code_snippets/blob/master/c/getusage.c + * + * adapted for cuSDR by (c) 2012 Andrea Montefusco, IW0HDV + * + */ + +#include "cusdr_cpuUsage.h" + +#if defined(Q_OS_LINUX) +#include +#include +#include +#include // bzero +#include // getpagesize +#include // strncat, strlen + +/* + * read /proc data into the passed struct pstat + * returns 0 on success, -1 on error +*/ +static int get_usage(const pid_t pid, struct pstat* result) { + + //convert pid to string + char pid_s[20]; + snprintf(pid_s, sizeof(pid_s), "%d", pid); + + char stat_filepath[30] = "/proc/"; strncat(stat_filepath, pid_s, + sizeof(stat_filepath) - strlen(stat_filepath) -1); + strncat(stat_filepath, "/stat", sizeof(stat_filepath) - + strlen(stat_filepath) -1); + + //Open /proc/stat and /proc/$pid/stat fds successive(dont want that cpu + //ticks increases too much during measurements) + //TODO: open /proc dir, to lock all files and read the results from the + //same timefragem + FILE *fpstat = fopen(stat_filepath, "r"); + + if (fpstat == NULL) { + + perror("FOPEN ERROR "); + return -1; + } + + FILE *fstat = fopen("/proc/stat", "r"); + if (fstat == NULL) { + + perror("FOPEN ERROR "); + fclose(fstat); + return -1; + } + + //read values from /proc/pid/stat + bzero(result, sizeof(struct pstat)); + long int rss; + if (fscanf(fpstat, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu" + "%lu %ld %ld %*d %*d %*d %*d %*u %lu %ld", + &result->utime_ticks, &result->stime_ticks, + &result->cutime_ticks, &result->cstime_ticks, &result->vsize, + &rss) == EOF) { + + fclose(fpstat); + return -1; + } + + fclose(fpstat); + result->rss = rss * getpagesize(); + + //read+calc cpu total time from /proc/stat + long unsigned int cpu_time[10]; + bzero(cpu_time, sizeof(cpu_time)); + + if (fscanf(fstat, "%*s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", + &cpu_time[0], &cpu_time[1], &cpu_time[2], &cpu_time[3], + &cpu_time[4], &cpu_time[5], &cpu_time[6], &cpu_time[7], + &cpu_time[8], &cpu_time[9]) == EOF) { + + fclose(fstat); + return -1; + } + + fclose(fstat); + + for (int i = 0; i < 10; i++) { + + result->cpu_total_time += cpu_time[i]; + } + return 0; +} + +/* +* calculates the actual CPU usage(cur_usage - last_usage) in percent +* cur_usage, last_usage: both last measured get_usage() results +* ucpu_usage, scpu_usage: result parameters: user and sys cpu usage in % +*/ +static void calc_cpu_usage(const struct pstat* cur_usage, const struct pstat* + last_usage, double* ucpu_usage, double* scpu_usage) { + + const long unsigned int total_time_diff = cur_usage->cpu_total_time - last_usage->cpu_total_time; + + *ucpu_usage = 100 * (((cur_usage->utime_ticks + cur_usage->cutime_ticks) + - (last_usage->utime_ticks + last_usage->cutime_ticks)) + / (double) total_time_diff); + + *scpu_usage = 100 * ((((cur_usage->stime_ticks + cur_usage->cstime_ticks) + - (last_usage->stime_ticks + last_usage->cstime_ticks))) / + (double) total_time_diff); +} + +CpuUsage :: CpuUsage (void) { + + pid = getpid(); + int rc = get_usage(pid, &cpst); + + if (rc < 0) { + + printf ("Error, check PID\n"); + } + else { + + lpst = cpst; + } +} + +short CpuUsage :: GetUsage (void) { + + int rc = get_usage(pid, &cpst); + + if (rc < 0) { + + printf ("Error, check PID\n"); + } + + double ucpu_usage; + double scpu_usage; + calc_cpu_usage (&cpst, &lpst, &ucpu_usage, &scpu_usage); + //printf ("usr: %7.2g sys: %7.2g", ucpu_usage, scpu_usage); + //printf (" T: %7.0f\n", (float)(ucpu_usage+scpu_usage)/2.0*10.0); + + lpst = cpst; + return (short) ((ucpu_usage+scpu_usage)/2.0*10.0); +} + +#endif + + +#ifdef TEST_MODULE + +int main (int argc, char **argv) { + + int pid; + struct pstat cpst; + struct pstat lpst; + + if (argc > 1 && sscanf (argv[1], "%d", &pid) == 1) { + + int rc = get_usage(pid, &cpst); + + if (rc < 0) { + + printf ("Error, check PID\n"); + return 254; + } + else { + + lpst = cpst; + } + } + else { + + return 255; + } + + for (;;) { + + sleep (1); + + int rc = get_usage(pid, &cpst); + + if (rc < 0) { + + printf ("Error, check PID\n"); + return 254; + } + + double ucpu_usage; + double scpu_usage; + calc_cpu_usage (&cpst, &lpst, &ucpu_usage, &scpu_usage); + printf ("usr: %7.2g sys: %7.2g", ucpu_usage, scpu_usage); + printf (" T: %7.0f\n", (float)(ucpu_usage+scpu_usage)/2.0*10.0); + + lpst = cpst; + } +} + +#endif + + +#if defined(Q_OS_WIN32) +//#error WWWWWWWW + +CpuUsage::CpuUsage(void) + :m_nCpuUsage(-1) + ,m_dwLastRun(0) + ,m_lRunCount(0) +{ + ZeroMemory(&m_ftPrevSysKernel, sizeof(FILETIME)); + ZeroMemory(&m_ftPrevSysUser, sizeof(FILETIME)); + + ZeroMemory(&m_ftPrevProcKernel, sizeof(FILETIME)); + ZeroMemory(&m_ftPrevProcUser, sizeof(FILETIME)); +} + + +/********************************************** +* CpuUsage::GetUsage +* returns the percent of the CPU that this process +* has used since the last time the method was called. +* If there is not enough information, -1 is returned. +* If the method is recalled to quickly, the previous value +* is returned. +***********************************************/ +short CpuUsage::GetUsage() { + + //create a local copy to protect against race conditions in setting the + //member variable + short nCpuCopy = m_nCpuUsage; + if (::InterlockedIncrement(&m_lRunCount) == 1) { + + /* + If this is called too often, the measurement itself will greatly affect the + results. + */ + + if (!EnoughTimePassed()) { + + ::InterlockedDecrement(&m_lRunCount); + return nCpuCopy; + } + + FILETIME ftSysIdle, ftSysKernel, ftSysUser; + FILETIME ftProcCreation, ftProcExit, ftProcKernel, ftProcUser; + + if (!GetSystemTimes(&ftSysIdle, &ftSysKernel, &ftSysUser) || + !GetProcessTimes(GetCurrentProcess(), &ftProcCreation, &ftProcExit, &ftProcKernel, &ftProcUser)) + { + ::InterlockedDecrement(&m_lRunCount); + return nCpuCopy; + } + + if (!IsFirstRun()) { + /* + CPU usage is calculated by getting the total amount of time the system has operated + since the last measurement (made up of kernel + user) and the total + amount of time the process has run (kernel + user). + */ + ULONGLONG ftSysKernelDiff = SubtractTimes(ftSysKernel, m_ftPrevSysKernel); + ULONGLONG ftSysUserDiff = SubtractTimes(ftSysUser, m_ftPrevSysUser); + + ULONGLONG ftProcKernelDiff = SubtractTimes(ftProcKernel, m_ftPrevProcKernel); + ULONGLONG ftProcUserDiff = SubtractTimes(ftProcUser, m_ftPrevProcUser); + + ULONGLONG nTotalSys = ftSysKernelDiff + ftSysUserDiff; + ULONGLONG nTotalProc = ftProcKernelDiff + ftProcUserDiff; + + if (nTotalSys > 0) { + + m_nCpuUsage = (short)((100.0 * nTotalProc) / nTotalSys); + } + } + + m_ftPrevSysKernel = ftSysKernel; + m_ftPrevSysUser = ftSysUser; + m_ftPrevProcKernel = ftProcKernel; + m_ftPrevProcUser = ftProcUser; + + m_dwLastRun = GetTickCount(); + + nCpuCopy = m_nCpuUsage; + } + + ::InterlockedDecrement(&m_lRunCount); + + return nCpuCopy; +} + +ULONGLONG CpuUsage::SubtractTimes(const FILETIME& ftA, const FILETIME& ftB) { + + LARGE_INTEGER a, b; + a.LowPart = ftA.dwLowDateTime; + a.HighPart = ftA.dwHighDateTime; + + b.LowPart = ftB.dwLowDateTime; + b.HighPart = ftB.dwHighDateTime; + + return a.QuadPart - b.QuadPart; +} + +bool CpuUsage::EnoughTimePassed() { + + const int minElapsedMS = 250;//milliseconds + + ULONGLONG dwCurrentTickCount = GetTickCount(); + return ((int)(dwCurrentTickCount - m_dwLastRun)) > minElapsedMS; +} + +#endif \ No newline at end of file diff --git a/Source/src/Util/cusdr_cpuUsage.h b/Source/src/Util/cusdr_cpuUsage.h new file mode 100644 index 0000000..abb6e34 --- /dev/null +++ b/Source/src/Util/cusdr_cpuUsage.h @@ -0,0 +1,87 @@ +/* + * Windows part for CPU usage by (c) 2009 Ben Watson + * + * taken from http://www.philosophicalgeek.com/2009/01/03/determine-cpu-usage-of-current-process-c-and-c/ + * + * adapted for cuSDR by (c) 2012 Hermann von Hasseln, DL3HVH + * + * + * Linux part for CPU usage by (c) by Fabian Holler + * + * taken from https://github.com/fho/code_snippets/blob/master/c/getusage.c + * + * adapted for cuSDR by (c) 2012 Andrea Montefusco, IW0HDV + * + */ + +#include // needed in order to get Q_OS_LINUX macro defined + +#if defined(Q_OS_WIN32) + +#pragma once + +//#define _WIN32_WINNT 0×0501 +#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. +#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows. +#endif + +#include + +class CpuUsage { + +public: + CpuUsage(void); + + short GetUsage(); + +private: + ULONGLONG SubtractTimes(const FILETIME& ftA, const FILETIME& ftB); + bool EnoughTimePassed(); + inline bool IsFirstRun() const { return (m_dwLastRun == 0); } + + //system total times + FILETIME m_ftPrevSysKernel; + FILETIME m_ftPrevSysUser; + + //process times + FILETIME m_ftPrevProcKernel; + FILETIME m_ftPrevProcUser; + + short m_nCpuUsage; + ULONGLONG m_dwLastRun; + + volatile LONG m_lRunCount; +}; + +#elif defined(Q_OS_LINUX) + +#include +#include + +struct pstat { + + long unsigned int utime_ticks; + long int cutime_ticks; + long unsigned int stime_ticks; + long int cstime_ticks; + long unsigned int vsize; // virtual memory size in bytes + long unsigned int rss; //Resident Set Size in bytes + + long unsigned int cpu_total_time; +}; + + +class CpuUsage { + +public: + CpuUsage(void); + + short GetUsage(void); + +private: + pid_t pid; + struct pstat cpst; + struct pstat lpst; +}; + +#endif diff --git a/Source/src/Util/cusdr_cpuUsage_unix.cpp b/Source/src/Util/cusdr_cpuUsage_unix.cpp new file mode 100644 index 0000000..4ee9a92 --- /dev/null +++ b/Source/src/Util/cusdr_cpuUsage_unix.cpp @@ -0,0 +1,42 @@ +#include +#include +#include + +#include "cusdr_cpuUsage_unix.h" +#include "cusdr_settings.h" + +cusdr_cpuUsage::cusdr_cpuUsage() +{ + ptick=0; + ptime=0.0; + CLOCK_TICK = sysconf(_SC_CLK_TCK); + + QTimer *timer = new QTimer(); + cusdr_cpuUsage::connect(timer, SIGNAL(timeout()), this, SLOT(getCPUUsage())); + + timer->start(1000); +} + +void cusdr_cpuUsage::getCPUUsage() +{ + clock_t tick; + double time; + double load; + + struct rusage usage; + struct tms systime; + + tick = times(&systime); + getrusage(RUSAGE_SELF, &usage); + + time = usage.ru_utime.tv_sec + usage.ru_utime.tv_usec * 1e-6 + + usage.ru_stime.tv_sec + usage.ru_stime.tv_usec * 1e-6; + + load = ((time-ptime)/(tick-ptick)) * CLOCK_TICK * 100; + + if(ptick && ptime) + Settings::instance()->setCPULoad((int) load); + + ptick=tick; + ptime=time; +} diff --git a/Source/src/Util/cusdr_cpuUsage_unix.h b/Source/src/Util/cusdr_cpuUsage_unix.h new file mode 100644 index 0000000..ade4a59 --- /dev/null +++ b/Source/src/Util/cusdr_cpuUsage_unix.h @@ -0,0 +1,24 @@ +#ifndef CUSDR_CPULOAD_H +#define CUSDR_CPULOAD_H + +#include +#include + +class cusdr_cpuUsage : public QThread +{ + Q_OBJECT +public: + clock_t ptick; + double ptime; + QTimer *timer; + + cusdr_cpuUsage(); + +private: + int CLOCK_TICK; + +private slots: + void getCPUUsage(); +}; + +#endif // CUSDR_CPULOAD_H diff --git a/Source/src/Util/cusdr_highResTimer.cpp b/Source/src/Util/cusdr_highResTimer.cpp new file mode 100644 index 0000000..bbb0c77 --- /dev/null +++ b/Source/src/Util/cusdr_highResTimer.cpp @@ -0,0 +1,109 @@ +/** +* @file cusdr_highResTimer.h +* @brief HPSDR high resolution timer header file +* @author Song Ho Ahn (song.ahn@gmail.com) +* @version +* @date 2006-01-13 +*/ + +/* + * High Resolution Timer. + * This timer is able to measure the elapsed time with 1 micro-second accuracy + * in both Windows, Linux and Unix system + * + * Copyright 2006 Song Ho Ahn (song.ahn@gmail.com) + * Copyright 2012 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "cusdr_highResTimer.h" +#include + +HResTimer::HResTimer() { + +#ifdef WIN32 + QueryPerformanceFrequency(&frequency); + startCount.QuadPart = 0; + endCount.QuadPart = 0; +#else + startCount.tv_sec = startCount.tv_usec = 0; + endCount.tv_sec = endCount.tv_usec = 0; +#endif + + stopped = 0; + startTimeInMicroSec = 0; + endTimeInMicroSec = 0; +} + +HResTimer::~HResTimer() { + +} + +void HResTimer::start() { + + stopped = 0; // reset stop flag + +#ifdef WIN32 + QueryPerformanceCounter(&startCount); +#else + gettimeofday(&startCount, NULL); +#endif +} + +void HResTimer::stop() { + + stopped = 1; // set timer stopped flag + +#ifdef WIN32 + QueryPerformanceCounter(&endCount); +#else + gettimeofday(&endCount, NULL); +#endif +} + +double HResTimer::getElapsedTimeInMicroSec() { + +#ifdef WIN32 + if(!stopped) + QueryPerformanceCounter(&endCount); + + startTimeInMicroSec = startCount.QuadPart * (1000000.0 / frequency.QuadPart); + endTimeInMicroSec = endCount.QuadPart * (1000000.0 / frequency.QuadPart); +#else + if(!stopped) + gettimeofday(&endCount, NULL); + + startTimeInMicroSec = (startCount.tv_sec * 1000000.0) + startCount.tv_usec; + endTimeInMicroSec = (endCount.tv_sec * 1000000.0) + endCount.tv_usec; +#endif + + return endTimeInMicroSec - startTimeInMicroSec; +} + +double HResTimer::getElapsedTimeInMilliSec() { + + return this->getElapsedTimeInMicroSec() * 0.001; +} + +double HResTimer::getElapsedTimeInSec() { + + return this->getElapsedTimeInMicroSec() * 0.000001; +} + +double HResTimer::getElapsedTime() { + + return this->getElapsedTimeInSec(); +} diff --git a/Source/src/Util/cusdr_highResTimer.h b/Source/src/Util/cusdr_highResTimer.h new file mode 100644 index 0000000..2b100b7 --- /dev/null +++ b/Source/src/Util/cusdr_highResTimer.h @@ -0,0 +1,72 @@ +/** +* @file cusdr_highResTimer.h +* @brief HPSDR high resolution timer header file +* @author Song Ho Ahn (song.ahn@gmail.com) +* @version +* @date 2006-01-13 +*/ + +/* + * High Resolution Timer. + * This timer is able to measure the elapsed time with 1 micro-second accuracy + * in both Windows, Linux and Unix system + * + * Copyright 2006 Song Ho Ahn (song.ahn@gmail.com) + * Copyright 2012 adapted for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_HRES_TIMER_H +#define CUSDR_HRES_TIMER_H + +#ifdef WIN32 // Windows system specific +#include +#else // Unix based system specific +#include +#endif + + +class HResTimer { + +public: + HResTimer(); // default constructor + ~HResTimer(); // default destructor + + void start(); // start timer + void stop(); // stop the timer + double getElapsedTime(); // get elapsed time in second + double getElapsedTimeInSec(); // get elapsed time in second (same as getElapsedTime) + double getElapsedTimeInMilliSec(); // get elapsed time in milli-second + double getElapsedTimeInMicroSec(); // get elapsed time in micro-second + +protected: + +private: + double startTimeInMicroSec; // starting time in micro-second + double endTimeInMicroSec; // ending time in micro-second + int stopped; // stop flag + +#ifdef WIN32 + LARGE_INTEGER frequency; // ticks per second + LARGE_INTEGER startCount; // + LARGE_INTEGER endCount; // +#else + timeval startCount; // + timeval endCount; // +#endif +}; + +#endif // CUSDR_HRES_TIMER_H diff --git a/Source/src/Util/cusdr_image.cpp b/Source/src/Util/cusdr_image.cpp new file mode 100644 index 0000000..386dbab --- /dev/null +++ b/Source/src/Util/cusdr_image.cpp @@ -0,0 +1,96 @@ +/** +* @file cusdr_image.cpp +* @brief image definitions class for cuSDR +*/ + +/* + * This is an adaptation of Matteo Bertozzi's "Black Bar and Buttons" code. + * + * see: http://qt-apps.org/content/show.php/Black+Bar+and+Buttons?content=100399 + * + * Copyright 2009 Matteo Bertozzi + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "cusdr_imageblur.h" +#include "cusdr_painter.h" +#include "cusdr_image.h" + +QHImage::QHImage (const QSize& size, Format format) + : QImage(size, format) +{ +} + +QHImage::QHImage (int width, int height, Format format) + : QImage(width, height, format) +{ +} + +QHImage::QHImage (uchar *data, int width, int height, Format format) + : QImage(data, width, height, format) +{ +} + +QHImage::QHImage (const uchar *data, int width, int height, Format format) + : QImage(data, width, height, format) +{ +} + +QHImage::QHImage (uchar *data, int width, int height, int bytesPerLine, Format format) + : QImage(data, width, height, bytesPerLine, format) +{ +} + +QHImage::QHImage (const uchar *data, int width, int height, int bytesPerLine, Format format) + : QImage(data, width, height, bytesPerLine, format) +{ +} + +QHImage::QHImage (const QString& fileName, const char *format) + : QImage(fileName, format) +{ +} + +QHImage::QHImage (const char *fileName, const char *format) + : QImage(fileName, format) +{ +} + +QHImage::QHImage (const QImage& image) + : QImage(image) +{ +} + +QHImage::~QHImage() { +} + + +void QHImage::expblur(int aprec, int zprec, int radius) { + ImageBlur::expblur(this, aprec, zprec, radius); +} +#include + +void QHImage::shadowBlur (int radius, const QColor& color) { + ImageBlur::expblur(this, 16, 7, radius); + + QHPainter p(this); + p.setCompositionMode(QPainter::CompositionMode_SourceIn); + p.fillRect(rect(), color); + p.end(); +} + + diff --git a/Source/src/Util/cusdr_image.h b/Source/src/Util/cusdr_image.h new file mode 100644 index 0000000..2aeb012 --- /dev/null +++ b/Source/src/Util/cusdr_image.h @@ -0,0 +1,52 @@ +/** +* @file cusdr_image.h +* @brief image definitions header file for cuSDR +*/ + +/* + * This is an adaptation of Matteo Bertozzi's "Black Bar and Buttons" code. + * + * see: http://qt-apps.org/content/show.php/Black+Bar+and+Buttons?content=100399 + * + * Copyright 2009 Matteo Bertozzi + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef CUSDR_IMAGE_H +#define CUSDR_IMAGE_H + +#include + +class QHImage : public QImage { + public: + QHImage (const QSize& size, Format format); + QHImage (int width, int height, Format format); + QHImage (uchar *data, int width, int height, Format format); + QHImage (const uchar *data, int width, int height, Format format); + QHImage (uchar *data, int width, int height, int bytesPerLine, Format format); + QHImage (const uchar *data, int width, int height, int bytesPerLine, Format format); + QHImage (const QString& fileName, const char *format = 0); + QHImage (const char *fileName, const char *format = 0); + QHImage (const QImage& image); + ~QHImage(); + + public: + void expblur(int aprec, int zprec, int radius); + void shadowBlur (int radius, const QColor& color); +}; + +#endif // CUSDR_IMAGE_H + diff --git a/Source/src/Util/cusdr_imageblur.cpp b/Source/src/Util/cusdr_imageblur.cpp new file mode 100644 index 0000000..a223536 --- /dev/null +++ b/Source/src/Util/cusdr_imageblur.cpp @@ -0,0 +1,139 @@ +/** +* @file cusdr_imageblur.cpp +* @brief image blur class for cuSDR +*/ + +/* + * This is an adaptation of Jani Huhtanen Exponential blur code. + * + * Copyright 2007 Jani Huhtanen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include + +#include "cusdr_imageblur.h" + +/* ============================================================================ + * PUBLIC Constructor/Destructors + */ +ImageBlur::ImageBlur (QImage *image, int aprec, int zprec) { + m_image = image; + m_aprec = aprec; + m_zprec = zprec; +} + +ImageBlur::~ImageBlur() { + m_image = NULL; +} + +/* ============================================================================ + * PUBLIC STATIC Methods + */ +void ImageBlur::expblur (QImage *image, int aprec, int zprec, int radius) { + ImageBlur imageBlur(image, aprec, zprec); + imageBlur.expblur(radius); +} + +/* ============================================================================ + * PUBLIC Methods + */ +void ImageBlur::expblur (int radius) { + if (radius < 1) + return; + + /* Calculate the alpha such that 90% of + * the kernel is within the radius. + * (Kernel extends to infinity) + */ + //int alpha = (int)((1 << m_aprec) * (1.0f - std::exp(-2.3f / (radius + 1.f)))); + int alpha = (unsigned int)((1 << m_aprec) * (1.0f - std::exp(-2.3f / (radius + 1.f)))); + + for (int row = 0; row < m_image->height(); ++row) + blurrow(row, alpha); + + for (int col = 0; col < m_image->width(); ++col) + blurcol(col, alpha); +} + +/* ============================================================================ + * PRIVATE Methods + */ +void ImageBlur::blurcol (int col, int alpha) { + int zR, zG, zB, zA; + + QRgb *ptr = (QRgb *)m_image->bits(); + ptr += col; + + zR = *((unsigned char *)ptr ) << m_zprec; + zG = *((unsigned char *)ptr + 1) << m_zprec; + zB = *((unsigned char *)ptr + 2) << m_zprec; + zA = *((unsigned char *)ptr + 3) << m_zprec; + + for (int index = m_image->width(); + index < (m_image->height() - 1) * m_image->width(); + index += m_image->width()) + { + blurinner((unsigned char *)&ptr[index], zR, zG, zB, zA, alpha); + } + + for (int index = (m_image->height() - 2) * m_image->width(); + index >= 0; + index -= m_image->width()) + { + blurinner((unsigned char *)&ptr[index], zR, zG, zB, zA, alpha); + } +} + +void ImageBlur::blurrow (int line, int alpha) { + int zR, zG, zB, zA; + + QRgb *ptr = (QRgb *)m_image->scanLine(line); + + zR = *((unsigned char *)ptr ) << m_zprec; + zG = *((unsigned char *)ptr + 1) << m_zprec; + zB = *((unsigned char *)ptr + 2) << m_zprec; + zA = *((unsigned char *)ptr + 3) << m_zprec; + + for (int index = 1; index < m_image->width(); ++index) + blurinner((unsigned char *)&ptr[index], zR, zG, zB, zA, alpha); + + for (int index = m_image->width() - 2; index >= 0; --index) + blurinner((unsigned char *)&ptr[index], zR, zG, zB, zA, alpha); +} + +void ImageBlur::blurinner ( unsigned char *bptr, + int &zR, int &zG, int &zB, int &zA, + int alpha) +{ + int R, G, B, A; + R = *bptr; + G = *(bptr + 1); + B = *(bptr + 2); + A = *(bptr + 3); + + zR += (alpha * ((R << m_zprec) - zR)) >> m_aprec; + zG += (alpha * ((G << m_zprec) - zG)) >> m_aprec; + zB += (alpha * ((B << m_zprec) - zB)) >> m_aprec; + zA += (alpha * ((A << m_zprec) - zA)) >> m_aprec; + + *bptr = zR >> m_zprec; + *(bptr+1) = zG >> m_zprec; + *(bptr+2) = zB >> m_zprec; + *(bptr+3) = zA >> m_zprec; +} + diff --git a/Source/src/Util/cusdr_imageblur.h b/Source/src/Util/cusdr_imageblur.h new file mode 100644 index 0000000..3f02988 --- /dev/null +++ b/Source/src/Util/cusdr_imageblur.h @@ -0,0 +1,57 @@ +/** +* @file cusdr_imageblur.h +* @brief image blur header file for cuSDR +*/ + +/* + * This is an adaptation of Jani Huhtanen Exponential blur code. + * + * Copyright 2007 Jani Huhtanen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _KDE_PLASMA_BLUR_H_ +#define _KDE_PLASMA_BLUR_H_ + +class QImage; + +class ImageBlur { + public: + ImageBlur (QImage *image, int aprec, int zprec); + ~ImageBlur(); + + public: + void expblur (int radius); + + public: + static void expblur (QImage *image, int aprec, int zprec, int radius); + + private: + void blurcol (int col, int alpha); + void blurrow (int line, int alpha); + + void blurinner (unsigned char *bptr, + int &zR, int &zG, int &zB, int &zA, + int alpha); + + private: + QImage *m_image; + int m_aprec; + int m_zprec; +}; + +#endif /* !_KDE_PLASMA_BLUR_H_ */ + diff --git a/Source/src/Util/cusdr_led.cpp b/Source/src/Util/cusdr_led.cpp new file mode 100644 index 0000000..2f8e370 --- /dev/null +++ b/Source/src/Util/cusdr_led.cpp @@ -0,0 +1,91 @@ +/** +* @file cusdr_led.cpp +* @brief LED objects +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#include +#include +#include + +#include "cusdr_led.h" +//#include "cusdr_settings.h" + + +QHLed::QHLed(const QString& text, QWidget *parent) : QAbstractButton (parent) { + + setText(text); + this->setEnabled(false); +} + +QHLed::~QHLed() { + +} + +void QHLed::setColors(const QColor bgr, const QColor pen) { + + penColor = pen; + + linearGrad = QLinearGradient(QPointF(0, 0), QPointF(0, 1)); + linearGrad.setCoordinateMode(QGradient::ObjectBoundingMode); + linearGrad.setSpread(QGradient::PadSpread); + linearGrad.setColorAt(0, bgr); + //linearGrad.setColorAt(0.8, QColor(0x31, 0x8b, 0xda)); + linearGrad.setColorAt(1, bgr); + update(); +} + +//void QHLed::changeColor (QColor color) { +//} + +void QHLed::setLEDText(const QString& text) { + + QHLed::setText(text); +} + +QSize QHLed::minimumSizeHint(void) const { + + QFontMetrics fontMetrics(QFont("Arial", 8, QFont::Bold)); + int width = fontMetrics.width(text()) + 12; + return(QSize(width, 13)); +} + +void QHLed::paintEvent(QPaintEvent *event) { + + int height = event->rect().height(); + int width = event->rect().width(); + + p = new QHPainter(this); + + p->setPen (QPen(penColor, 1)); + + p->fillRoundRect(QRect(0, 0, width, height), 1, 1, 1, 1, QBrush(linearGrad)); + + p->setFont (QFont("Arial", 8, -1, true)); + //p->setPen(QPen(m_btnPenColor, 1)); + //p->drawText(event->rect(), Qt::AlignCenter, text()); + p->drawText(event->rect(), Qt::AlignLeft, text()); + + p->end(); +} diff --git a/Source/src/Util/cusdr_led.h b/Source/src/Util/cusdr_led.h new file mode 100644 index 0000000..e3e3de8 --- /dev/null +++ b/Source/src/Util/cusdr_led.h @@ -0,0 +1,63 @@ +/** +* @file cusdr_led.h +* @brief header file for LED objects +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_LED_H +#define CUSDR_LED_H + +#include + +#include "cusdr_painter.h" + + +class QHLed : public QAbstractButton { + + Q_OBJECT + +public: + QHLed(const QString& text, QWidget *parent = 0); + ~QHLed(); + + QSize minimumSizeHint (void) const; + +public slots: + void setColors(const QColor bgColor, const QColor penColor); + void setLEDText(const QString& text); + +protected: + void paintEvent(QPaintEvent *event); + + +private: + QHPainter *p; + + QColor bgColor; + QColor penColor; + + QLinearGradient linearGrad; +}; + +#endif // CUSDR_LED_H diff --git a/Source/src/Util/cusdr_painter.cpp b/Source/src/Util/cusdr_painter.cpp new file mode 100644 index 0000000..fee1031 --- /dev/null +++ b/Source/src/Util/cusdr_painter.cpp @@ -0,0 +1,239 @@ +/** +* @file cusdr_painter.cpp +* @brief painter class for cuSDR +*/ + +/* + * This is an adaptation of Matteo Bertozzi's "Black Bar and Buttons" code. + * + * see: http://qt-apps.org/content/show.php/Black+Bar+and+Buttons?content=100399 + * + * Copyright 2009 Matteo Bertozzi + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "cusdr_painter.h" +#include "cusdr_image.h" + +QHPainter::QHPainter() + : QPainter() +{ + setRenderHint(QPainter::Antialiasing); + setRenderHint(QPainter::TextAntialiasing); +} + +QHPainter::QHPainter(QPaintDevice *device) + : QPainter(device) +{ + setRenderHint(QPainter::Antialiasing); + setRenderHint(QPainter::TextAntialiasing); +} + +QHPainter::~QHPainter() { +} + + +QPainterPath QHPainter::roundRectangle (const QRectF& rect, qreal radius) { + + return(roundRectangle(rect, radius, radius, radius, radius)); +} + +QPainterPath QHPainter::roundRectangle (const QRectF& rect, qreal leftRadius, qreal rightRadius) { + + return(roundRectangle(rect, leftRadius, leftRadius, rightRadius, rightRadius)); +} + +QPainterPath QHPainter::topShadowRectangle (const QRectF& rect, qreal radius) { + + return(topShadowRectangle(rect, radius, radius, radius, radius)); +} + +QPainterPath QHPainter::topShadowRectangle (const QRectF& rect, qreal leftRadius, qreal rightRadius) { + + return(topShadowRectangle(rect, leftRadius, leftRadius, rightRadius, rightRadius)); +} + +QPainterPath QHPainter::roundRectangle (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius) +{ + // Top Left Corner + // Top Side + // Top right corner + // Right side + // Bottom right corner + // Bottom side + // Bottom left corner + + QPainterPath path(QPoint(rect.left(), rect.top() + leftTopRadius)); + path.quadTo(rect.left(), rect.top(), rect.left() + leftTopRadius, rect.top()); + path.lineTo(rect.right() - rightTopRadius, rect.top()); + path.quadTo(rect.right(), rect.top(), rect.right(), rect.top() + rightTopRadius); + path.lineTo(rect.right(), rect.bottom() - rightBottomRadius); + path.quadTo(rect.right(), rect.bottom(), rect.right() - rightBottomRadius, rect.bottom()); + path.lineTo(rect.left() + leftBottomRadius, rect.bottom()); + path.quadTo(rect.left(), rect.bottom(), rect.left(), rect.bottom() - leftBottomRadius); + path.closeSubpath(); + + return(path); +} + +QPainterPath QHPainter::topShadowRectangle (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius) +{ + // Top Left Corner + // Top Side + // Top right corner + // Right side + // Bottom right corner + // Bottom side + // Bottom left corner + Q_UNUSED(rightBottomRadius) + + QPainterPath path(QPoint(rect.left(), rect.bottom() - leftBottomRadius)); + path.lineTo(rect.left(), rect.top() + leftTopRadius); + path.quadTo(rect.left(), rect.top(), rect.left() + leftTopRadius, rect.top()); + path.lineTo(rect.right() - rightTopRadius, rect.top()); + + return(path); +} + +void QHPainter::drawRoundRect (const QRectF& rect, qreal radius) { + drawPath(roundRectangle(rect, radius, radius, radius, radius)); +} + +void QHPainter::drawRoundRect (const QRectF& rect, + qreal leftRadius, + qreal rightRadius) +{ + drawPath(roundRectangle(rect, leftRadius, leftRadius, + rightRadius, rightRadius)); +} + +void QHPainter::drawRoundRect ( const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius) +{ + drawPath(roundRectangle(rect, leftTopRadius, leftBottomRadius, + rightTopRadius, rightBottomRadius)); +} + +void QHPainter::drawTopShadow (const QRectF& rect, qreal radius) { + + drawPath(topShadowRectangle(rect, radius, radius, radius, radius)); +} + +void QHPainter::drawTopShadow (const QRectF& rect, + qreal leftRadius, + qreal rightRadius) +{ + drawPath(topShadowRectangle(rect, leftRadius, leftRadius, + rightRadius, rightRadius)); +} + +void QHPainter::drawTopShadow ( const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius) +{ + drawPath(topShadowRectangle(rect, leftTopRadius, leftBottomRadius, + rightTopRadius, rightBottomRadius)); +} + +void QHPainter::drawShadowText (qreal x, qreal y, + const QString& text, + const QColor& shadowColor, + const QPointF& offset, + qreal radius) +{ + QPainter p; + + // Draw Text + QRect textRect = QFontMetrics(text).boundingRect(text); + QImage textImage(textRect.size(), QImage::Format_ARGB32_Premultiplied); + textImage.fill(Qt::transparent); + p.begin(&textImage); + p.setPen(pen()); + p.setFont(font()); + p.drawText(textImage.rect(), Qt::AlignLeft, text); + p.end(); + + // Draw Blurred Shadow + QHImage shadowImage(textRect.size() + QSize(radius * 2, radius * 2), + QImage::Format_ARGB32_Premultiplied); + shadowImage.fill(Qt::transparent); + p.begin(&shadowImage); + p.drawImage(radius, radius, textImage); + p.end(); + shadowImage.shadowBlur(radius, shadowColor); + + // Compose Text and Shadow + int addSizeX = (offset.x() > radius) ? (abs(offset.x()) - radius) : 0; + int addSizeY = (offset.y() > radius) ? (abs(offset.y()) - radius) : 0; + QSize finalSize = shadowImage.size() + QSize(addSizeX, addSizeY); + + QPointF shadowTopLeft(QPointF((finalSize.width() - shadowImage.width()) / 2.0, + (finalSize.height() - shadowImage.height()) / 2.0) + + (offset / 2.0)); + QPointF textTopLeft(QPointF((finalSize.width() - textImage.width()) / 2.0, + ((finalSize.height() - textImage.height()) / 2.0)) - + (offset / 2.0)); + + // Paint Text and Shadow + save(); + translate(x, y); + setCompositionMode(QPainter::CompositionMode_Xor); + drawImage(shadowTopLeft, shadowImage); + drawImage(textTopLeft, textImage); + restore(); +} + + +void QHPainter::fillRoundRect ( const QRectF& rect, + qreal radius, + const QBrush& brush) +{ + fillPath(roundRectangle(rect, radius, radius, radius, radius), brush); +} + +void QHPainter::fillRoundRect ( const QRectF& rect, + qreal leftRadius, + qreal rightRadius, + const QBrush& brush) +{ + fillPath(roundRectangle(rect, leftRadius, leftRadius, + rightRadius, rightRadius), brush); +} + +void QHPainter::fillRoundRect ( const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius, + const QBrush& brush) +{ + fillPath(roundRectangle(rect, leftTopRadius, leftBottomRadius, + rightTopRadius, rightBottomRadius), brush); +} + diff --git a/Source/src/Util/cusdr_painter.h b/Source/src/Util/cusdr_painter.h new file mode 100644 index 0000000..8681894 --- /dev/null +++ b/Source/src/Util/cusdr_painter.h @@ -0,0 +1,105 @@ +/** +* @file cusdr_painter.h +* @brief painter header file for cuSDR +*/ + +/* + * This is an adaptation of Matteo Bertozzi's "Black Bar and Buttons" code. + * + * see: http://qt-apps.org/content/show.php/Black+Bar+and+Buttons?content=100399 + * + * Copyright 2009 Matteo Bertozzi + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_PAINTER_H +#define CUSDR_PAINTER_H + +#include + +class QHPainter : public QPainter { + +public: + QHPainter(); + QHPainter(QPaintDevice *device); + ~QHPainter(); + + // STATIC Methods + static QPainterPath roundRectangle (const QRectF& rect, qreal radius); + static QPainterPath roundRectangle (const QRectF& rect, + qreal leftRadius, + qreal rightRadius); + static QPainterPath roundRectangle (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius); + static QPainterPath topShadowRectangle (const QRectF& rect, qreal radius); + static QPainterPath topShadowRectangle (const QRectF& rect, + qreal leftRadius, + qreal rightRadius); + static QPainterPath topShadowRectangle (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius); + + // Methods + void drawShadowText ( qreal x, qreal y, + const QString& text, + const QColor& shadowColor, + const QPointF& offset, + qreal radius); + + void drawRoundRect (const QRectF& rect, + qreal radius); + void drawRoundRect (const QRectF& rect, + qreal leftRadius, + qreal rightRadius); + void drawRoundRect (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius); + + void drawTopShadow (const QRectF& rect, + qreal radius); + void drawTopShadow (const QRectF& rect, + qreal leftRadius, + qreal rightRadius); + void drawTopShadow (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius); + + void fillRoundRect (const QRectF& rect, + qreal radius, + const QBrush& brush); + void fillRoundRect (const QRectF& rect, + qreal leftRadius, + qreal rightRadius, + const QBrush& brush); + void fillRoundRect (const QRectF& rect, + qreal leftTopRadius, + qreal leftBottomRadius, + qreal rightTopRadius, + qreal rightBottomRadius, + const QBrush& brush); +}; + +#endif // CUSDR_PAINTER_H \ No newline at end of file diff --git a/Source/src/Util/cusdr_queue.h b/Source/src/Util/cusdr_queue.h new file mode 100644 index 0000000..f2ef13c --- /dev/null +++ b/Source/src/Util/cusdr_queue.h @@ -0,0 +1,135 @@ +/** +* @file cusdr_queue.h +* @brief queue header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-13 +*/ + +/* + * adaptation from a code example from QtCentre: http://www.qtcentre.org/threads/26250-Thread-Safe-Queue-container... + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_QUEUE_H +#define CUSDR_QUEUE_H + +#include +#include +#include + +template class QHQueue { + +public: + QHQueue(int maxSize = 2048) + : m_semFree(maxSize) + , m_semUsed(0) + { + } + + void enqueue(const T &value) { + + m_semFree.acquire(1); + m_mutex.lock(); + m_queue.enqueue(value); + m_mutex.unlock(); + m_semUsed.release(1); + } + + T dequeue() { + + m_semUsed.acquire(1); + m_mutex.lock(); + T val = m_queue.dequeue(); + m_mutex.unlock(); + m_semFree.release(1); + return val; + } + + T head() { + + m_semUsed.acquire(1); + m_mutex.lock(); + T val = m_queue.head(); + m_mutex.unlock(); + m_semUsed.release(1); + } + + bool isEmpty() const { + + return m_semUsed.available() == 0; + } + + bool isFull() const { + + return m_semFree.available() == 0; + } + + int count() const { + + return m_semUsed.available(); + } + + void release_queue() { + + m_semUsed.release(1); + } + + /*void setMaxSize(int maxSize) { + + m_mutex.lock(); + delete &m_semFree; + QSemaphore m_semFree(maxSize); + m_mutex.unlock(); + }*/ + + T tryHead() { + + bool t = m_semUsed.tryAcquire(1); + if (!t) + return T(); + + m_mutex.lock(); + T val = m_queue.head(); + m_mutex.unlock(); + m_semUsed.release(); + + return val; + } + + T tryDequeue() { + + bool t = m_semUsed.tryAcquire(1); + if (!t) + return T(); + + m_mutex.lock(); + T val = m_queue.dequeue(); + m_mutex.unlock(); + m_semUsed.release(); + + return val; + } + +private: + QQueue m_queue; + QSemaphore m_semFree; + QSemaphore m_semUsed; + QMutex m_mutex; +}; + +#endif // CUSDR_QUEUE_H \ No newline at end of file diff --git a/Source/src/Util/cusdr_splash.cpp b/Source/src/Util/cusdr_splash.cpp new file mode 100644 index 0000000..35defe7 --- /dev/null +++ b/Source/src/Util/cusdr_splash.cpp @@ -0,0 +1,62 @@ +/** +* @file cusdr_splash.cpp +* @brief splash screen class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-05-21 +*/ + +/* + * Taken from: Qt Developer Network; QSplashScreen replacement for semitransparent images + * + * http://developer.qt.nokia.com/wiki/QSplashScreen_replacement_for_semitransparent_images + * + * License: http://creativecommons.org/licenses/by-sa/2.5/legalcode + */ + +#include +#include "cusdr_splash.h" + +CSplashScreen::CSplashScreen(const QPixmap& thePixmap) + //: QFrame(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint) + : QFrame(0, Qt::FramelessWindowHint) + , itsPixmap(thePixmap) +{ + setAttribute(Qt::WA_TranslucentBackground); + setAttribute(Qt::WA_TransparentForMouseEvents); + setFixedSize(itsPixmap.size()); +}; + +void CSplashScreen::clearMessage() { + + itsMessage.clear(); + repaint(); +} + +void CSplashScreen::showMessage(const QString& theMessage, int theAlignment/* = Qt::AlignLeft*/, const QColor& theColor/* = Qt::black*/) { + + itsMessage = theMessage; + itsAlignment = theAlignment; + itsColor = theColor; + repaint(); +} + +void CSplashScreen::paintEvent(QPaintEvent* pe) { + + Q_UNUSED(pe) + + QRect aTextRect(rect()); + //aTextRect.setRect(aTextRect.x() + 5, aTextRect.y() + 5, aTextRect.width() - 10, aTextRect.height() - 10); + aTextRect.setRect(aTextRect.x() - 5, aTextRect.y() - 5, aTextRect.width() - 10, aTextRect.height() - 10); + + QRect aCopyrightRect(rect()); + //aCopyrightRect.setRect(aCopyrightRect.x() + 5, aCopyrightRect.y() - 5, aCopyrightRect.width() - 10, aCopyrightRect.height() - 5); + aCopyrightRect.setRect(aCopyrightRect.right() - 125, aCopyrightRect.y() - 5, aCopyrightRect.width() - 10, aCopyrightRect.height() - 5); + + QPainter aPainter(this); + aPainter.drawPixmap(rect(), itsPixmap); + aPainter.setPen(itsColor); + aPainter.drawText(aTextRect, itsAlignment, itsMessage); + aPainter.setPen(Qt::black); + aPainter.drawText(aCopyrightRect, Qt::AlignBottom, "(C) 2011-2013 DL3HVH"); +} \ No newline at end of file diff --git a/Source/src/Util/cusdr_splash.h b/Source/src/Util/cusdr_splash.h new file mode 100644 index 0000000..689211e --- /dev/null +++ b/Source/src/Util/cusdr_splash.h @@ -0,0 +1,40 @@ +/** +* @file cusdr_splash.h +* @brief splash screen header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-05-21 +*/ + +/* + * Taken from: Qt Developer Network; QSplashScreen replacement for semitransparent images + * + * http://developer.qt.nokia.com/wiki/QSplashScreen_replacement_for_semitransparent_images + * + * License: http://creativecommons.org/licenses/by-sa/2.5/legalcode + */ + +#ifndef _CUSDR_SLASHSCREEN_H +#define _CUSDR_SLASHSCREEN_H + +#include + +class CSplashScreen : public QFrame { + +public: + CSplashScreen(const QPixmap& pixmap); + + void clearMessage(); + void showMessage(const QString& theMessage, int theAlignment = Qt::AlignLeft, const QColor& theColor = Qt::black); + +private: + virtual void paintEvent(QPaintEvent* pe); + + QPixmap itsPixmap; + QString itsMessage; + int itsAlignment; + QColor itsColor; +}; + + +#endif // _CUSDR_SLASHSCREEN_H \ No newline at end of file diff --git a/Source/src/Util/cusdr_styles.h b/Source/src/Util/cusdr_styles.h new file mode 100644 index 0000000..c7a8a1b --- /dev/null +++ b/Source/src/Util/cusdr_styles.h @@ -0,0 +1,439 @@ +/** +* @file cusdr_styles.h +* @brief style settings header file for cuSDR +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-30 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_STYLES_H +#define CUSDR_STYLES_H + +QString sdrStyle = QString::fromUtf8( + "background-color: rgba(0, 0, 0, 255);" + ); + +QString dialogStyle = QString::fromUtf8( + "background-color: rgba(60, 60, 60, 255);"); + +QString colorDialogStyle = QString::fromUtf8( + "background-color: rgba(30, 30, 30, 255); " + "color: rgb(166, 196, 208); "); + +QString mainWindowStyle = QString::fromUtf8( + "QMainWindow::separator {" + " background: rgba(166, 196, 208, 130);" + " width: 2px;" + " height: 2px;" + "}" + "QMainWindow::separator:hover {" + " background: rgba(166, 196, 208, 200);" + "}" + ); + +QString widgetStyle = QString::fromUtf8( + //"background-color: rgba(0, 0, 0, 255); " + "QGroupBox { " + " background-color: rgba(0, 0, 0, 255); " + //" border: 1px solid rgba(45, 122, 148, 150); " + " border: 1px solid rgba(255, 255, 255, 80); " + " border-radius: 2px; margin-top: 2ex; } " + "QGroupBox::title { " + " subcontrol-origin: margin; " + " padding: 0 0px; " + " color: rgba(170, 170, 170, 255); }" + ); + +QString itemStyle = QString::fromUtf8( + "color: rgba(200, 200, 200, 255); " + "border: 0px solid; "); + +QString labelStyle = QString::fromUtf8( + "color: rgba(166, 196, 208, 255);"); + +QString tableStyle = QString::fromUtf8( + "color: rgba(166, 196, 208, 255); " + "border: 0px solid; "); + +QString messageBoxStyle = QString::fromUtf8( + "border: 0px solid rgba(166, 196, 208, 255); " + "border-right-width: 0px; " + "color: rgb(166, 196, 208); " + "background-color: rgba(0, 0, 0, 255); "); + +QString lineEditStyle = QString::fromUtf8( + "border: 1px solid rgba(60, 60, 60, 255); " + //"border-right-width: 0px; " + "color: rgb(166, 196, 208); " + "background-color: rgba(0, 0, 0, 255); "); + +QString displayToolbarStyle = QString::fromUtf8( + "QToolBar {" + " border: 0px solid rgba(0, 0, 0, 255); " + " color: rgb(166, 196, 208); " + " background-color: rgba(0, 0, 0, 255); " + "}" + "QToolBar::handle {" + //" background-color: rgba(0, 0, 0, 255); " + "}" + ); + +QString mainBtnToolbarStyle = QString::fromUtf8( + "QToolBar {" + " border: 2px solid rgba(0, 0, 0, 255); " + //"border-right-width: 0px; " + " color: rgb(166, 196, 208); " + " background-color: rgba(0, 0, 0, 255); " + "}" + "QToolBar::handle {" + //" background-color: rgba(0, 0, 0, 255); " + "}" + ); + +QString statusbarStyle = QString::fromUtf8( + "QStatusBar {" + //"border: 0px solid rgba(60, 60, 60, 255); " + //"border-right-width: 0px; " + " color: rgb(166, 196, 208); " + " background-color: rgba(0, 0, 0, 255); " + "}" + "QStatusBar::item {" + " border: 1px rgba(60, 60, 60, 255);" + " border-radius: 0px;" + "}" + ); + +QString dockStyle = QString::fromUtf8( + "QDockWidget {" + " color: rgba(166, 196, 208, 255);" + " border: 1px solid rgba(60, 60, 60, 255);" + "}" + //"background-color: rgba(0, 0, 0, 255); " + "QDockWidget::title {" + " text-align: left;" + //" background: rgba(60, 60, 60, 255);" + " background: qlineargradient(y1:0, y2:1, stop: 0 #a0a0a0, stop: 0.5 #202020, stop: 1 #404040); " + //" border: 1px solid rgba(60, 60, 60, 255);" + //" border-radius: 2px;" + " padding-left: 5px;" + "}" + "QDockWidget::close-button, QDockWidget::float-button {" + " border: 1px solid transparent;" + " background: rgba(166, 196, 208, 255);" + " padding: 1px;" + "}"); + +QString comboBoxStyle = QString::fromUtf8( + "QComboBox { " + " color: rgba(166, 196, 208, 255); " + //" border: 1px solid rgba(45, 122, 148, 150); " + " border: 1px solid rgba(255, 255, 255, 50); " + " border-radius: 2px; } " + "QComboBox::drop-down:!editable { " + " color: rgba(166, 196, 208, 255); " + " background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, " + " stop: 0 #a1a1a1, stop: 0.4 #656565, " + " stop: 0.5 #383838, stop: 1.0 #232323); }" + "QComboBox:on { " + " color: rgba(166, 196, 208, 255); " + " padding-top: 3px; " + " padding-left: 4px; }" + "QComboBox:disabled { " + " color: rgba(166, 196, 208, 155); " + " padding-top: 3px; " + " padding-left: 4px; }" + "QComboBox::drop-down { " + " subcontrol-origin: padding; " + " subcontrol-position: top right; " + " width: 15px; " + " border-left-width: 0px; " + " border-left-color: darkgray; " + " border-left-style: solid; " + " border-top-right-radius: 2px; " + " border-bottom-right-radius: 2px; }" + "QComboBox::down-arrow { " + " image: url(:/img/down_arrow.png); " + " width: 10px; " + " height: 10px; }" + "QComboBox::down-arrow:on { " + " top: 1px; " + " left: 1px; }" + "QComboBox QAbstractItemView { " + " color: rgba(166, 196, 208, 255); " + //" border: 1px solid rgba(45, 122, 148, 150); " + " border: 1px solid rgba(255, 255, 255, 80); " + " selection-background-color: rgba(38, 38, 38, 255); }"); + +QString spinBoxStyle = QString::fromUtf8( + "QSpinBox::up-button { " + " subcontrol-origin: border; " + " subcontrol-position: top left; " + " width: 18px; " + " height: 10px; " + " border-width: 4px; } " + "QSpinBox::down-button { " + " subcontrol-origin: border; " + " subcontrol-position: bottom left; " + " width: 18px; " + " height: 10px; " + " border-width: 4px; } " + "QSpinBox::up-arrow { " + " image: url(:/img/up_arrow.png); " + " width: 8px; " + " height: 8px; } " + "QSpinBox::down-arrow { " + " image: url(:/img/down_arrow.png); " + " width: 8px; " + " height: 8px; } " + "QSpinBox::up-arrow:off { " + " image: url(:/img/up_arrow_off.png); }" + //" top: 1px; " + //" left: 1px; } " + "QSpinBox::down-arrow:off { " + " image: url(:/img/down_arrow_off.png); }" + "QSpinBox::up-arrow:disabled { " + " image: url(:/img/up_arrow_off.png); }" + //" top: 1px; " + //" left: 1px; } " + "QSpinBox::down-arrow:disabled { " + " image: url(:/img/down_arrow_off.png); }" + //" top: 1px; " + //" left: 1px; } " + "QSpinBox { " + " color: rgba(166, 196, 208, 255); " + " border: 1px solid rgba(255, 255, 255, 80); } " + + ); + +QString dSpinBoxStyle = QString::fromUtf8( + "QDoubleSpinBox::up-button { " + " subcontrol-origin: border; " + " subcontrol-position: top left; " + " width: 18px; " + " height: 10px; " + " border-width: 4px; } " + "QDoubleSpinBox::down-button { " + " subcontrol-origin: border; " + " subcontrol-position: bottom left; " + " width: 18px; " + " height: 10px; " + " border-width: 4px; } " + "QDoubleSpinBox::up-arrow { " + " image: url(:/img/up_arrow.png); " + " width: 8px; " + " height: 8px; } " + "QDoubleSpinBox::down-arrow { " + " image: url(:/img/down_arrow.png); " + " width: 8px; " + " height: 8px; } " + "QDoubleSpinBox::up-arrow:on { " + " top: 0px; " + " left: 0px; } " + "QDoubleSpinBox::down-arrow:on { " + " top: 0px; " + " left: 0px; } " + "QDoubleSpinBox { " + " color: rgba(166, 196, 208, 255); " + //" border: 1px solid rgba(45, 122, 148, 150); } " + " border: 1px solid rgba(255, 255, 255, 80); } " + ); + +QString menuStyle = QString::fromUtf8( + "QMenu { " + " background-color: rgba(0, 0, 0, 255); " + " border: 1px solid rgba(45, 122, 148, 150); " + " color: rgba(220, 220, 220, 255);} " + "QMenu::item { " + " background-color: transparent; } " + "QMenu::item:selected { " + " background: rgba(45, 122, 148, 200); } " + /*border: 1px inset rgba(45, 122, 148, 200); \ + position: absolute; \ + top: 1px; \ + right: 1px; \ + bottom: 1px; \ + left: 8px; }"*/ + ); + +QString miniButtonStyle = QString::fromUtf8( + "font-size: 7pt;" + ); + +QString sliderLabelStyle = QString::fromUtf8( + "QLabel { " + " color: rgba(126, 156, 168, 255); " + " background: qlineargradient(y1:0, y2:1, stop: 0 #808080, stop: 0.5 #202020, stop: 1 #404040); " + " border: qlineargradient(y1:0, y2:1, stop:0 #B1B1B1, stop:1 #000000); }" + ); + +QString volSliderStyle = QString::fromUtf8( + "QSlider::groove:horizontal {" + " border: qlineargradient(y1:0, y2:1, stop:0 #B1B1B1, stop:1 #000000);" + " background-color: transparent;" + "}" + "QSlider::handle:horizontal {" + " background: qlineargradient(x1:0, y1:0, x2:0, y2:1, " + " stop: 0 #1592ba, stop: 0.5 #00527a, stop: 1 #0582aa);" + " border-radius: 2px;" + " width: 12px;" + "} " + "QSlider::handle:hover {" + " background: qlineargradient(x1:0, y1:0, x2:0, y2:1, " + " stop: 0 #55c2ea, stop: 0.5 #4092ba, stop: 1 #55c2ea);" + //" margin: -4px 0;" + " border: 1px solid #91ebff;" + " border-radius: 2px;" + //" height: 16px;" + "}" + "QSlider::handle:pressed {" + " background: qlineargradient(x1:0, y1:0, x2:0, y2:1, " + " stop: 0 #75e2fa, stop: 0.5 #60a2da, stop: 1 #75e2fa);" + " border: 1px solid #91ebff;" + " border-radius: 2px;" + "}" + "QSlider::add-page:horizontal {" + " background: qlineargradient(y1:0, y2:1, " + " stop: 0 #808080, stop: 0.5 #202020, stop: 1 #404040);" + //" background-color: transparent;" + "}" + "QSlider::sub-page:horizontal {" + " background: qlineargradient(y1:0, y2:1, " + " stop: 0 #1592ba, stop: 0.5 #00527a, stop: 1 #0582aa);" + //" background-color: transparent;" + "}"); + + +QString splitterStyle = QString::fromUtf8( + "QSplitter::handle:vertical { " + " height: 4px; " + " background: rgba(255, 255, 255, 0); } " + /*" background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, " + " stop:0 rgba(255, 255, 255, 0), " + " stop:0.3 rgba(85, 210, 250, 105), " + " stop:0.7 rgba(85, 210, 250, 105), " + " stop:1 rgba(255, 255, 255, 0)); } "*/ + + "QSplitter::handle:horizontal { " + " width: 4px; " + " background: rgba(255, 255, 255, 0); } " + /*" background: qlineargradient(x1:0, y1:0, x2:1, y2:1, " + " stop:0 rgba(255, 255, 255, 0), " + " stop:0.3 rgba(85, 210, 250, 105), " + " stop:0.7 rgba(85, 210, 250, 105), " + " stop:1 rgba(255, 255, 255, 0)); } "*/ + " border: 0px solid rgba(255, 0, 0, 255); " + //" width: 8px; " + //" margin-top: 1px; " + //" margin-bottom: 1px; " + //" border-radius: 1px; " + //" width: 3px; } " + + ////"QSplitter::handle { " + ////" image: url(:/img/left.png); } " + //"QSplitter { " + //" padding: 0px; " + ////" border: 1px solid rgba(60, 60, 60, 255); " + ////" border-radius: 2px; } " + //"QSplitter::handle:horizontal { " + //" width: 2px; } " + //"QSplitter::handle:vertical { " + //" height: 2px; } "); + ); + +QString frameStyle = QString::fromUtf8( + //"border: 1px solid rgba(45, 122, 148, 150); " + "border: 1px solid rgba(255, 255, 255, 80); " + "border-radius: 2px; margin-top: 2ex; " + ); + +QString tabWidgetStyle = QString::fromUtf8( + "QTabWidget::pane {" + " margin-top: 4px;" + " margin-left: 4px;" + //" margin-right: 4px;" + " margin-bottom: 2px;" + //" border: 0px" + //" border: 1px solid rgba(255, 255, 255, 80); " + " border: 1px solid #565656; " + " border-radius: 2px;" + "}" + "QTabWidget::tab-bar {" + " left: 4px;" + " top: 5px;" + " right: 4px;" + "}" + "QTabBar::tab {" + //" color: #000000;" + " color: rgba(166, 196, 208, 235);" + " background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," + " stop: 0 #868686, stop: 0.3 #565656," + " stop: 0.4 #000000, stop: 1.0 #000000);" + " border: 1px solid #565656;" + //" border-bottom-color: #91EBFF;" + " border-bottom-color: #565656;" + " border-left-color: #606060;" + " border-right-color: #000000;" + " border-top-left-radius: 1px;" + " border-top-right-radius: 1px;" + " min-width: 8ex;" + " max-height: 10px;" + " padding: 2px;" + "}" + "QTabBar::tab:disabled {" + " color: #000000;" + "}" + + "QTabBar::tab:selected {" + /*" background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," + " stop: 0 #55D2FA, stop: 0.3 #505050," + " stop: 0.4 #101010, stop: 1.0 #000000);" + "}"*/ + " color: rgba(166, 196, 208, 255);" + " background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," + " stop: 0 #969696, stop: 0.3 #505050," + " stop: 0.4 #101010, stop: 1.0 #000000);" + "}" + "QTabBar::tab:hover {" + /*" background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," + " stop: 0 #91EBFF, stop: 0.4 #000000," + " stop: 0.8 #000000, stop: 1.0 #91EBFF);"*/ + " background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," + " stop: 0 #C6C6C6, stop: 0.3 #505050," + " stop: 0.4 #202020, stop: 1.0 #000000);" + //" border-top-color: #91EBFF;" + //" border-left-color: #61CBDF;" + //" border-right-color: #91EBFF;" + //" border-color: #91EBFF;" + //" border-color: #969696;" + //" border-bottom-color: #000000;" + "}" + "QTabBar::tab:selected {" + //" border-color: #91EBFF;" + " border-color: #565656;" + " border-right-color: #000000;" + " border-bottom-color: #000000;" + "}" + "QTabBar::tab:!selected {" + " margin-top: 2px;" + "}" + ); + +#endif // CUSDR_STYLES_H diff --git a/Source/src/Util/qcircularbuffer.h b/Source/src/Util/qcircularbuffer.h new file mode 100644 index 0000000..1a1b87e --- /dev/null +++ b/Source/src/Util/qcircularbuffer.h @@ -0,0 +1,1294 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCIRCULARBUFFER_H +#define QCIRCULARBUFFER_H + +#include +#include +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Core) + +template +class CircularBufferData : public QSharedData +{ +public: + CircularBufferData() + : data(0), + capacity(0), + size(0), + first(-1), + last(-1) + {} + + ~CircularBufferData() + { + // Cleanup the data first + if (QTypeInfo::isComplex) { + // The type is complex so we manually call the destructor for each item + // since we used the placement new operator to instantiate them + T* b = data; + T* i = b + capacity; + while (i-- != b) + i->~T(); + } + + // Release the raw memory + deallocate(data); + } + + T* allocate(int capacity); + void deallocate(T* data); + + T* data; // Array of the actual data + int capacity; // Size of the m_data array + int size; // Number of elements of m_data actually used + int first; // Index in m_data of the first element of the circular buffer + int last; // Index in m_data of the last element of the circular buffer +}; + +template +T* CircularBufferData::allocate(int capacity) +{ + void* rawMemory = operator new[](capacity * sizeof(T)); + T* data = static_cast(rawMemory); + return data; +} + +template +void CircularBufferData::deallocate(T* data) +{ + operator delete[](data); +} + + +template +class QCircularBuffer +{ +public: + typedef QPair array_range; + typedef QPair const_array_range; + typedef array_range ArrayRange; + typedef const_array_range ConstArrayRange; + + QCircularBuffer() + : d(new CircularBufferData()) + {} + + explicit QCircularBuffer(int capacity); + explicit QCircularBuffer(int capacity, const T &value); + explicit QCircularBuffer(int capacity, int size, const T &value); + + QCircularBuffer(const QCircularBuffer& other) + : d(other.d) + {} + + QCircularBuffer& operator = (const QCircularBuffer& other) + { + d = other.d; + return *this; + } + + ~QCircularBuffer() {} + + class iterator + { + public: + typedef std::random_access_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef T *pointer; + typedef T &reference; + + iterator() : buffer(0), index(-1) {} + iterator(QCircularBuffer* buffer, int index) + : buffer(buffer), index(index) + {} + iterator(const iterator& other) + : buffer(other.buffer), index(other.index) + {} + + T &operator*() const { return (*buffer)[ index ]; } + T* operator->() const + { + return buffer->d->data + ((buffer->d->first + index) % buffer->d->capacity); + } + T &operator[](int j) const { return (*buffer)[ index + j ]; } + + bool operator==(const iterator& other) const + { + return (buffer == other.buffer && index == other.index); + } + + bool operator!=(const iterator& other) const + { + return (buffer != other.buffer || index != other.index); + } + + bool operator<(const iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::iterator::operator<", "iterators use different buffers"); + return index < other.index; + } + + bool operator<=(const iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::iterator::operator<=", "iterators use different buffers"); + return index <= other.index; + } + + bool operator>(const iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::iterator::operator>", "iterators use different buffers"); + return index > other.index; + } + + bool operator>=(const iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::iterator::operator>=", "iterators use different buffers"); + return index >= other.index; + } + + iterator& operator++() { ++index; return *this; } + iterator operator++(int) + { + iterator ans = *this; + ++index; + return ans; + } + + iterator& operator--() { --index; return *this; } + iterator operator--(int) + { + iterator ans = *this; + --index; + return ans; + } + + iterator& operator+=(int j) { index += j; return *this; } + iterator& operator-=(int j) { index -= j; return *this; } + iterator operator+(int j) const { return iterator(buffer, index + j); } + iterator operator-(int j) const { return iterator(buffer, index - j); } + int operator-(iterator other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::iterator::operator-", "iterators use different buffers"); + return index - other.index; + } + + private: + QCircularBuffer* buffer; + int index; + friend class QCircularBuffer; + }; + friend class iterator; + + class const_iterator + { + public: + typedef std::random_access_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef const T* pointer; + typedef const T &reference; + + const_iterator() : buffer(0), index(-1) {} + const_iterator(const QCircularBuffer* buffer, int index) + : buffer(buffer), index(index) + {} + const_iterator(const const_iterator& other) + : buffer(other.buffer), index(other.index) + {} + explicit const_iterator(const iterator& other) + : buffer(other.buffer), index(other.index) + {} + + const T &operator*() const { return buffer->at(index); } + const T* operator->() const + { + return buffer->d->data + ((buffer->d->first + index) % buffer->d->capacity); + } + const T &operator[](int j) const { return buffer->at(index + j); } + + bool operator==(const const_iterator& other) const + { + return (buffer == other.buffer && index == other.index); + } + + bool operator!=(const const_iterator& other) const + { + return (buffer != other.buffer || index != other.index); + } + + bool operator<(const const_iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::const_iterator::operator<", "iterators use different buffers"); + return index < other.index; + } + + bool operator<=(const const_iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::const_iterator::operator<=", "iterators use different buffers"); + return index <= other.index; + } + + bool operator>(const const_iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::const_iterator::operator>", "iterators use different buffers"); + return index > other.index; + } + + bool operator>=(const const_iterator& other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::const_iterator::operator>=", "iterators use different buffers"); + return index >= other.index; + } + + const_iterator& operator++() { ++index; return *this; } + const_iterator operator++(int) + { + const_iterator ans = *this; + ++index; + return ans; + } + + const_iterator& operator--() { --index; return *this; } + const_iterator operator--(int) + { + const_iterator ans = *this; + --index; + return ans; + } + + const_iterator& operator+=(int j) { index += j; return *this; } + const_iterator& operator-=(int j) { index -= j; return *this; } + const_iterator operator+(int j) const { return const_iterator(buffer, index + j); } + const_iterator operator-(int j) const { return const_iterator(buffer, index - j); } + int operator-(const_iterator other) const + { + Q_ASSERT_X(buffer == other.buffer, "QCircularBuffer::const_iterator::operator-", "iterators use different buffers"); + return index - other.index; + } + + private: + const QCircularBuffer* buffer; + int index; + friend class QCircularBuffer; + }; + friend class const_iterator; + + iterator begin() { return iterator(this, 0); } + const_iterator begin() const { return const_iterator(this, 0); } + const_iterator constBegin() const { return const_iterator(this, 0); } + iterator end() { return iterator(this, d->size); } + const_iterator end() const { return const_iterator(this, d->size); } + const_iterator constEnd() const { return const_iterator(this, d->size); } + iterator insert(iterator before, int count, const T &value) + { + insert(before.index, count, value); + return iterator(this, before.index); + } + iterator insert(iterator before, const T &value) { return insert(before, 1, value); } + iterator erase(iterator begin, iterator end) + { + int count = end - begin; + remove(begin.index, count); + return iterator(this, end.index - count); + } + iterator erase(iterator pos) { return erase(pos, pos + 1); } + + // STL compatibility + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef ptrdiff_t difference_type; + typedef iterator Iterator; + typedef const_iterator ConstIterator; + typedef int size_type; + + void push_back(const T &t) { append(t); } + void push_front(const T &t) { prepend(t); } + void pop_back() { Q_ASSERT(!isEmpty()); erase(end() - 1); } + void pop_front() { Q_ASSERT(!isEmpty()); erase(begin()); } + bool empty() const { return isEmpty(); } + T &front() { return first(); } + const T &front() const { return first(); } + T &back() { return last(); } + const T &back() const { return last(); } + + int refCount() const { return int(d->ref); } + + void append(const T &value); + + const T &at(int i) const + { + Q_ASSERT_X(i >= 0 && i < d->size, "QCircularBuffer::at", "index out of range"); + int index = (d->first + i) % d->capacity; + return d->data[ index ]; + } + + const T &operator[](int i) const + { + Q_ASSERT_X(i >= 0 && i < d->size, "QCircularBuffer::operator[]", "index out of range"); + int index = (d->first + i) % d->capacity; + return d->data[ index ]; + } + + T &operator[](int i) + { + Q_ASSERT_X(i >= 0 && i < d->size, "QCircularBuffer::operator[]", "index out of range"); + int index = (d->first + i) % d->capacity; + return d->data[ index ]; + } + + int capacity() const { return d->capacity; } + + void clear() { *this = QCircularBuffer(d->capacity); } + + bool contains(const T &value) const; + int count(const T &value) const; + int count() const { return size(); } + + array_range data() + { + if (d->size == 0) + return array_range(0, 0); + if (!isLinearised()) + linearise(); + return array_range(d->data + d->first, d->last - d->first + 1); + } + const_array_range data() const { return constData(); } + const_array_range constData() const + { + if (!isLinearised() || d->size == 0) + return const_array_range(0, 0); + return const_array_range(d->data + d->first, d->last - d->first + 1); + } + + array_range dataOne() + { + if (d->size == 0) + return array_range(0, 0); + if (isLinearised()) + return array_range(d->data + d->first, d->last - d->first + 1); + else + return array_range(d->data + d->first, d->capacity - d->first); + } + const_array_range dataOne() const { return constDataOne(); } + const_array_range constDataOne() const + { + if (d->size == 0) + return const_array_range(0, 0); + if (isLinearised()) + return const_array_range(d->data + d->first, d->last - d->first + 1); + else + return const_array_range(d->data + d->first, d->capacity - d->first); + } + + array_range dataTwo() + { + if (d->size == 0 || isLinearised()) + return array_range(0, 0); + return array_range(d->data, d->last + 1); + } + const_array_range dataTwo() const { return constDataTwo(); } + const_array_range constDataTwo() const + { + if (d->size == 0 || isLinearised()) + return const_array_range(0, 0); + return const_array_range(d->data, d->last + 1); + } + + bool endsWith(const T &value) const { return !isEmpty() && last() == value; } + QCircularBuffer& fill(const T &value, int size = -1); + T &first() { Q_ASSERT(!isEmpty()); return d->data[ d->first ]; } + const T &first() const { Q_ASSERT(!isEmpty()); return d->data[ d->first ]; } + int freeSize() const { return sizeAvailable(); } + + static QCircularBuffer fromList(const QList& list); + static QCircularBuffer fromVector(const QVector& vector); + + int indexOf(const T &value, int from = 0) const; + void insert(int i, const T &value) { insert(i, 1, value); }; + void insert(int i, int count, const T &value); + bool isEmpty() const { return d->size == 0; } + bool isFull() const { return d->size == d->capacity; } + bool isLinearised() const { return (d->last >= d->first); } + T &last() { Q_ASSERT(!isEmpty()); return d->data[ d->last ]; } + const T &last() const { Q_ASSERT(!isEmpty()); return d->data[ d->last ]; } + int lastIndexOf(const T &value, int from = -1) const; + void linearise(); + void prepend(const T &value); + void remove(int i) { remove(i, 1); } + void remove(int i, int count); + + void replace(int i, const T &value) + { + Q_ASSERT_X(i >= 0 && i < d->size, "QCircularBuffer::replace", "index out of range"); + const T copy(value); + (*this)[ i ] = copy; + } + + void reserve(int capacity) { setCapacity(capacity); } + void resize(int size); + void setCapacity(int capacity); + int size() const { return d->size; } + int sizeAvailable() const { return d->capacity - d->size; } + void squeeze() { setCapacity(size()); } + bool startsWith(const T &value) const { return !isEmpty() && first() == value; } + + QList toList() const; + QVector toVector() const; + + T value(int i) const + { + if (i < 0 || i >= d->size) + return T(); + return at(i); + } + + T value(int i, const T &defaultValue) const + { + if (i < 0 || i >= d->size) + return defaultValue; + return at(i); + } + + bool operator==(const QCircularBuffer other) const; + bool operator!=(const QCircularBuffer other) const { return !(*this == other); } + + QCircularBuffer& operator+=(const T &other) { append(other); return *this; } + QCircularBuffer& operator+=(const QCircularBuffer& other); + QCircularBuffer& operator+=(const QVector& other); + QCircularBuffer& operator+=(const QList& other); + + QCircularBuffer& operator<<(const T &other) { append(other); return *this; } + QCircularBuffer& operator<<(const QCircularBuffer& other) { *this += other; return *this; } + QCircularBuffer& operator<<(const QVector& other) { *this += other; return *this; } + QCircularBuffer& operator<<(const QList& other) { *this += other; return *this; } + +private: + QSharedDataPointer< CircularBufferData > d; +}; + +template +QCircularBuffer operator+(const QCircularBuffer& lhs, const QCircularBuffer& rhs); + + +template +QCircularBuffer::QCircularBuffer(int capacity) + : d(new CircularBufferData()) +{ + // Allocate some raw memory + d->data = d->allocate(capacity); + d->capacity = capacity; + + // Initialise the objects. If the type T is a complex type then we do this + // using the placement new operator. If the type T is not complex we simply + // use memset to initialise the memory to zero. + if (QTypeInfo::isComplex) { + T* b = d->data; + T* i = b + d->capacity; + while (i != b) + new (--i) T; + } else { + qMemSet(d->data, 0, capacity * sizeof(T)); + } +} + +template +QCircularBuffer::QCircularBuffer(int capacity, const T &value) + : d(new CircularBufferData()) +{ + // Allocate some raw memory + d->data = d->allocate(capacity); + d->capacity = capacity; + + // Initialise the objects. In this case we always use the placement new operator + T* b = d->data; + T* i = b + d->capacity; + while (i != b) + new (--i) T(value); + d->first = 0; + d->last = d->capacity - 1; + d->size = d->capacity; +} + +template +QCircularBuffer::QCircularBuffer(int capacity, int size, const T &value) + : d(new CircularBufferData()) +{ + Q_ASSERT_X(capacity >= size, "QCircularBuffer::QCircularBuffer(int capacity, int size, const T &value)", "size is greater than capacity"); + + // Allocate some raw memory + d->data = d->allocate(capacity); + d->capacity = capacity; + + // Initialise the objects that need to be set to the specified value. + // In this case we always use the placement new operator + T* b = d->data; + T* i = b + size; + while (i != b) + new (--i) T(value); + + // Initialise the remaining objects using the best method available + if (QTypeInfo::isComplex) { + T* b = d->data + size; + T* i = b + capacity - size; + while (i != b) + new (--i) T; + } else { + qMemSet(d->data + size, 0, (capacity - size) * sizeof(T)); + } + + d->first = 0; + d->last = size - 1; + d->size = size; +} + +template +void QCircularBuffer::append(const T &value) +{ + // If we have no capacity we do nothing + if (!d->capacity) + return; + + if (d->size == d->capacity) { + // Buffer is full. Overwrite earliest item and rotate + d->data[ d->first ] = value; + d->first = (++d->first % d->capacity); + d->last = (++d->last % d->capacity); + } else if (d->size != 0) { + // Buffer is partially full. Append data to end of array using appropriate method + int index = (d->first + d->size) % d->capacity; + if (QTypeInfo::isComplex) + new (d->data + index) T(value); + else + d->data[ index ] = value; + ++d->size; + ++d->last; + } else { + // Buffer is empty. Append data to end of array using appropriate method + d->size = 1; + d->first = d->last = 0; + if (QTypeInfo::isComplex) + new (d->data + d->first) T(value); + else + d->data[ d->first ] = value; + } +} + +template +bool QCircularBuffer::contains(const T &value) const +{ + if (isLinearised()) { + T* b = d->data + d->first; + T* i = b + d->size; + while (i != b) + if (*--i == value) + return true; + return false; + } else { + // Check the array from m_first to the end + T* b = d->data + d->first; + T* i = d->data + d->capacity; + while (i != b) + if (*--i == value) + return true; + + // Check array from 0 to m_end + b = d->data; + i = d->data + d->last + 1; + while (i != b) + if (*--i == value) + return true; + + return false; + } +} + +template +int QCircularBuffer::count(const T &value) const +{ + int c = 0; + if (isLinearised()) { + T* b = d->data + d->first; + T* i = b + d->size; + while (i != b) + if (*--i == value) + ++c; + } else { + // Check the array from m_first to the end + T* b = d->data + d->first; + T* i = d->data + d->capacity; + while (i != b) + if (*--i == value) + ++c; + + // Check array from 0 to m_end + b = d->data; + i = d->data + d->last + 1; + while (i != b) + if (*--i == value) + ++c; + } + return c; +} + +template +QCircularBuffer& QCircularBuffer::fill(const T &value, int size) +{ + Q_ASSERT_X(d->capacity >= size, "QCircularBuffer::fill", "size is greater than capacity"); + const T copy(value); + int oldSize = d->size; + d->size = (size < 0 ? d->size : size); + d->first = (size == 0 ? -1 : 0); + d->last = d->size - 1; + + // Copy item into array size times + if (d->size) { + T *b = d->data; + T *i = d->data + d->size; + while (i != b) + *--i = copy; + } + + if (d->size < oldSize) { + // Cleanup old items beyond end of new array + T *b = d->data + d->size; + T *i = d->data + oldSize; + while (i-- != b) { + i->~T(); + new (i) T(); + } + } + + return *this; +} + +template +QCircularBuffer QCircularBuffer::fromList(const QList& list) +{ + QCircularBuffer circ(list.size()); + for (int i = 0; i < list.size(); ++i) + circ.append(list.at(i)); + return circ; +} + +template +QCircularBuffer QCircularBuffer::fromVector(const QVector& vector) +{ + QCircularBuffer circ(vector.size()); + for (int i = 0; i < vector.size(); ++i) + circ.append(vector.at(i)); + return circ; +} + +template +int QCircularBuffer::indexOf(const T &value, int from) const +{ + Q_ASSERT_X(from < d->size, "QCircularBuffer::indexOf", "from is greater than last valid index"); + if (from < 0) + from = qMax(from + d->size, 0); + else if (from >= d->size) + from = d->size - 1; + for (int i = from; i < d->size; ++i) + if (at(i) == value) + return i; + return -1; +} + +template +void QCircularBuffer::insert(int i, int count, const T &value) +{ + Q_ASSERT_X(i >= 0 && i <= d->size, "QCircularBuffer::insert", "index out of range"); + + int freeCapacity = d->capacity - d->size; + + // Calculate number of elements that will actually be inserted. This + // depends upon where the insertion has been requested and any spare + // capacity left in the buffer. This is because elements at higher + // indices will be pushed to the right and will potentially wrap around + // to overwrite earlier elements. + int numToInsert = qMin(count, i + freeCapacity); + + // Calculate the number of elements at the beginning of the buffer that + // will be overwritten + int numToOverwrite = qMin(i, qMax(0, count - freeCapacity)); + + // Decide which way to shift to minimise the amount of copying required. + if (i < d->size / 2) { + // Inserting in lower half of buffer so we shift earlier items down + + // Shift data at the bottom end down. This may only be a subset if some + // of the early data is to be overwritten. + if (QTypeInfo::isStatic) { + int start = d->first + numToOverwrite; + int end = d->first + i - 1; + for (int j = start; j <= end; ++j) { + int srcIndex = j % d->capacity; + int dstIndex = (j - numToInsert + d->capacity) % d->capacity; + T* src = d->data + srcIndex; + T* dst = d->data + dstIndex; + + new (dst) T(*src); + } + } else { + // We have a movable type so a simple memcopy (or maybe two or + // three) will suffice to shift the data at the bottom end + int numToMove = i - numToOverwrite; + if (numToMove > 0) { + int srcBegin = (d->first + numToOverwrite) % d->capacity; + int srcEnd = (d->first + i - 1) % d->capacity; + int dstBegin = (srcBegin - numToInsert + d->capacity) % d->capacity; + int dstEnd = (srcEnd - numToInsert + d->capacity) % d->capacity; + + // Do we have any wrap-around problems to deal with? + bool srcRegionWraps = (srcEnd < srcBegin); + bool dstRegionWraps = (dstEnd < dstBegin); + if (!srcRegionWraps && dstRegionWraps) { + // Destination region wraps so do the move in two steps + int wrapCount = abs(srcBegin - numToInsert); + memmove(d->data + d->capacity - wrapCount, d->data + srcBegin, wrapCount * sizeof(T)); + memmove(d->data, d->data + srcBegin + wrapCount, (numToMove - wrapCount) * sizeof(T)); + } else if (srcRegionWraps && !dstRegionWraps) { + // Source region wraps so do the move in two steps + int wrapCount = d->capacity - srcBegin; + memmove(d->data + dstBegin, d->data + d->capacity - wrapCount, wrapCount * sizeof(T)); + memmove(d->data + dstBegin + numToInsert, d->data, (numToMove - wrapCount) * sizeof(T)); + } else if (srcRegionWraps && dstRegionWraps) { + // Source and destination regions wrap so we have to do this in three steps + int srcWrapCount = d->capacity - srcBegin; + memmove(d->data + dstBegin, d->data + d->capacity - srcWrapCount, srcWrapCount * sizeof(T)); + memmove(d->data + d->capacity - numToInsert, d->data, numToInsert * sizeof(T)); + memmove(d->data, d->data + numToInsert, (numToMove - srcWrapCount - numToInsert) * sizeof(T)); + } else { + // No wrap around - do a single memmove + memmove(d->data + dstBegin, d->data + srcBegin, numToMove * sizeof(T)); + } + } + } + + // Insert the new items + int end = d->first + i; + int start = end - numToInsert; + for (int j = start; j < end; ++j) { + T* p = d->data + ((j + d->capacity) % d->capacity); + new (p) T(value); + } + + // Adjust the first, last and size indices as needed. + // NB. The last index never changes in this regime. + d->size += qMin(count, freeCapacity); + d->first = (d->first - (numToInsert - numToOverwrite) + d->capacity) % d->capacity; + } else { + // Inserting in upper half of buffer so we shift later items up + + // Shift data at the top end up which may or may not overwrite some + // of the earliest data + if (QTypeInfo::isStatic) { + int start = d->first + d->size - 1; + int end = d->first + i; + for (int j = start; j >= end; j--) { + int srcIndex = j % d->capacity; + int dstIndex = (j + numToInsert) % d->capacity; + T* src = d->data + srcIndex; + T* dst = d->data + dstIndex; + + new (dst) T(*src); + } + } else { + // We have a movable type so a simple memcopy (or maybe two or + // three) will suffice to shift the data at the top end + int numToMove = d->size - i; + if (numToMove > 0) { + int srcBegin = (d->first + i) % d->capacity; + int srcEnd = d->last; + int dstBegin = (srcBegin + numToInsert) % d->capacity; + int dstEnd = (srcEnd + numToInsert) % d->capacity; + + // Do we have any wrap-around problems to deal with? + bool srcRegionWraps = (srcEnd < srcBegin); + bool dstRegionWraps = (dstEnd < dstBegin); + if (!srcRegionWraps && dstRegionWraps) { + // Destination region wraps so do the move in two steps + int wrapCount = srcEnd + numToInsert - d->capacity + 1; + memmove(d->data, d->data + srcEnd - wrapCount + 1, wrapCount * sizeof(T)); + memmove(d->data + dstBegin, d->data + srcBegin, (numToMove - wrapCount) * sizeof(T)); + } else if (srcRegionWraps && !dstRegionWraps) { + // Source region wraps so do the move in two steps + int wrapCount = d->last + 1; + memmove(d->data + numToInsert, d->data, wrapCount * sizeof(T)); + memmove(d->data + dstBegin, d->data + srcBegin, (numToMove - wrapCount) * sizeof(T)); + } else if (srcRegionWraps && dstRegionWraps) { + // Source and destination regions wrap so we have to do this in three steps + int srcWrapCount = d->last + 1; + memmove(d->data + numToInsert, d->data, srcWrapCount * sizeof(T)); + memmove(d->data, d->data + d->capacity - numToInsert, numToInsert * sizeof(T)); + memmove(d->data + dstBegin, d->data + srcBegin, (numToMove - srcWrapCount - numToInsert) * sizeof(T)); + } else { + // No wrap around - do a single memmove + memmove(d->data + dstBegin, d->data + srcBegin, numToMove * sizeof(T)); + } + } + } + + // Insert the new items + for (int j = d->first + i; j < d->first + i + numToInsert; ++j) { + T* p = d->data + (j % d->capacity); + new (p) T(value); + } + + // Adjust the first, last and size indices as needed + d->size += qMin(count, freeCapacity); + d->first = (d->first + numToOverwrite) % d->capacity; + d->last = (d->last + numToInsert) % d->capacity; + } +} + +template +int QCircularBuffer::lastIndexOf(const T &value, int from) const +{ + if (from < 0) + from = qMax(from + d->size, 0); + else if (from >= d->size) + from = d->size - 1; + for (int i = from; i >= 0; --i) + if (at(i) == value) + return i; + return -1; +} + +template +void QCircularBuffer::linearise() +{ + if (isLinearised()) + return; + + // Allocate some new raw memory + T* newData = d->allocate(d->capacity); + + // Copy across the elements from the original array... + // Copy items from m_first to the end of the array + T* b = d->data + d->first; + T* i = d->data + d->capacity; + T* j = newData + d->capacity - d->first; + while (i != b) + new (--j) T(*--i); + + // Copy items from the start of the array to m_last + b = d->data; + i = d->data + d->last + 1; + j = newData + d->size; + while (i != b) + new (--j) T(*--i); + + // Destroy the original items + if (QTypeInfo::isComplex) { + // The type is complex so we manually call the destructor for each item + // since we used the placement new operator to instantiate them + T* b = d->data; + T* i = b + d->capacity; + while (i-- != b) + i->~T(); + } + + // Release the raw memory + d->deallocate(d->data); + + // Assign the new memory to be our buffer data and fix indices + d->data = newData; + d->first = 0; + d->last = d->size - 1; +} + +template +void QCircularBuffer::prepend(const T &value) +{ + // If we have no capacity we do nothing + if (!d->capacity) + return; + + if (d->size == d->capacity) { + // Buffer is full. Overwrite last item and rotate + d->data[ d->last ] = value; + d->first = (--d->first + d->capacity) % d->capacity; + d->last = (--d->last + d->capacity) % d->capacity; + } else if (d->size != 0) { + // Buffer is partially full. Prepend data to start of array using appropriate method + d->first = (--d->first + d->capacity) % d->capacity; + ++d->size; + if (QTypeInfo::isComplex) + new (d->data + d->first) T(value); + else + d->data[ d->first ] = value; + } else { + // Buffer is empty. Prepend data to start of array using appropriate method + d->size = 1; + d->first = d->last = d->capacity - 1; + if (QTypeInfo::isComplex) + new (d->data + d->first) T(value); + else + d->data[ d->first ] = value; + } +} + +template +void QCircularBuffer::remove(int i, int count) +{ + Q_ASSERT_X(i >= 0 && count > 0 && i + count <= d->size, "QCircularBuffer::remove", "index out of range"); + + // Calculate the number of items that need to be moved downward + int numToMoveDown = d->size - count - i; + int numToMoveUp = i; + + if (numToMoveDown < numToMoveUp) { + // Move higher items down + int numToMove = numToMoveDown; + + if (QTypeInfo::isComplex) { + // Copy items down from higher positions + int start = d->first + i; + int end = start + numToMove; + for (int j = start; j < end ; ++j) { + T* src = d->data + ((j + count) % d->capacity); + T* dst = d->data + (j % d->capacity); + new (dst) T(*src); + } + + // Clean up items at end of buffer + for (int j = d->last; j > d->last - count; --j) { + T* p = d->data + ((j + d->capacity) % d->capacity); + p->~T(); + new (p) T(); + } + } else { + if (isLinearised()) { + // With a linearised buffer we can do a simple move and removal of items + memmove(d->data + d->last - numToMove - count + 1, d->data + d->last - numToMove + 1, numToMove * sizeof(T)); + qMemSet(d->data + d->last - count + 1, 0, count * sizeof(T)); + } else { + // With a non-linearised buffer we need to be careful of wrapping issues + int srcBegin = (d->last - numToMove + 1 + d->capacity) % d->capacity; + int srcEnd = d->last; + int dstBegin = (d->first + i) % d->capacity; + int dstEnd = (dstBegin + numToMove - 1) % d->capacity; + + bool srcRegionWraps = (srcEnd < srcBegin); + bool dstRegionWraps = (dstEnd < dstBegin); + if (srcRegionWraps && !dstRegionWraps) { + // Source region wraps so do the move in two steps + int wrapCount = d->capacity - srcBegin; + memmove(d->data + dstBegin, d->data + srcBegin, wrapCount * sizeof(T)); + memmove(d->data + dstBegin + wrapCount, d->data, (numToMove - wrapCount) * sizeof(T)); + } else if (!srcRegionWraps && dstRegionWraps) { + // Destination region wraps so do the move in two steps + int wrapCount = count - srcBegin; + memmove(d->data + d->capacity - wrapCount, d->data + srcBegin, wrapCount * sizeof(T)); + memmove(d->data, d->data + srcBegin + wrapCount, (numToMove - wrapCount) * sizeof(T)); + } else if (srcRegionWraps && dstRegionWraps) { + // Source and destination regions wrap so we have to do this in three steps + int srcWrapCount = d->capacity - srcBegin; + memmove(d->data + dstBegin, d->data + srcBegin, srcWrapCount * sizeof(T)); + memmove(d->data + dstBegin + srcWrapCount, d->data, count * sizeof(T)); + memmove(d->data, d->data + count, (numToMove - srcWrapCount - count) * sizeof(T)); + } else { + // No wrap around, so we can do this in one hit + memmove(d->data + dstBegin, d->data + srcBegin, numToMove * sizeof(T)); + } + + // We potentially have a disjoint region that needs zeroing + int zeroStart = (d->last - count + d->capacity + 1) % d->capacity; + int zeroEnd = d->last; + if (zeroEnd < zeroStart) { + // Region to be zeroed wraps. Do it in two steps. + qMemSet(d->data, 0, (d->last + 1) * sizeof(T)); + qMemSet(d->data + zeroStart, 0, (count - d->last - 1) * sizeof(T)); + } else { + // Region to be zeroed is contiguous + qMemSet(d->data + zeroStart, 0, count * sizeof(T)); + } + } + } + + // Adjust the indices + d->size -= count; + d->last = (d->last - count + d->capacity) % d->capacity; + } else { + // Move lower items up + int numToMove = numToMoveUp; + + if (QTypeInfo::isComplex) { + // Copy items up from lower positions + int start = d->first + i - 1; + int end = start - numToMove; + for (int j = start; j > end ; --j) { + T* src = d->data + ((j + d->capacity) % d->capacity); + T* dst = d->data + ((j + d->capacity + count) % d->capacity); + new (dst) T(*src); + } + + // Clean up items at start of buffer + for (int j = d->first; j < d->first + count; ++j) { + T* p = d->data + (j % d->capacity); + p->~T(); + new (p) T(); + } + } else { + if (isLinearised()) { + // With a linearised buffer we can do a simple move and removal of items + memmove(d->data + d->first + count, d->data + d->first, numToMove * sizeof(T)); + qMemSet(d->data + d->first, 0, count * sizeof(T)); + } else { + // With a non-linearised buffer we need to be careful of wrapping issues + int srcBegin = d->first; + int srcEnd = (srcBegin + numToMove - 1) % d->capacity; + int dstBegin = (srcBegin + count) % d->capacity; + int dstEnd = (dstBegin + numToMove - 1) % d->capacity; + + bool srcRegionWraps = (srcEnd < srcBegin); + bool dstRegionWraps = (dstEnd < dstBegin); + if (srcRegionWraps && !dstRegionWraps) { + // Source region wraps so do the move in two steps + int wrapCount = srcEnd + 1; + memmove(d->data + dstEnd - wrapCount + 1, d->data, wrapCount * sizeof(T)); + memmove(d->data + dstBegin, d->data + srcBegin, (numToMove - wrapCount) * sizeof(T)); + } else if (!srcRegionWraps && dstRegionWraps) { + // Destination region wraps so do the move in two steps + int wrapCount = dstEnd + 1; + memmove(d->data, d->data + srcEnd - wrapCount + 1, wrapCount * sizeof(T)); + memmove(d->data + dstBegin, d->data + srcBegin, (numToMove - wrapCount) * sizeof(T)); + } else if (srcRegionWraps && dstRegionWraps) { + // Source and destination regions wrap so we have to do this in three steps + int srcWrapCount = srcEnd + 1; + memmove(d->data + dstEnd - srcWrapCount + 1, d->data, srcWrapCount * sizeof(T)); + memmove(d->data, d->data + d->capacity - count, count * sizeof(T)); + memmove(d->data + dstBegin, d->data + srcBegin, (numToMove - srcWrapCount - count) * sizeof(T)); + } else { + // No wrap around, so we can do this in one hit + memmove(d->data + dstBegin, d->data + srcBegin, numToMove * sizeof(T)); + } + + // We potentially have a disjoint region that needs zeroing + int zeroStart = d->first; + int zeroEnd = (zeroStart + count - 1) % d->capacity; + if (zeroEnd < zeroStart) { + // Region to be zeroed wraps. Do it in two steps. + qMemSet(d->data + zeroStart, 0, (d->capacity - d->first) * sizeof(T)); + qMemSet(d->data, 0, (count - d->capacity + d->first) * sizeof(T)); + } else { + // Region to be zeroed is contiguous + qMemSet(d->data + zeroStart, 0, count * sizeof(T)); + } + } + } + + // Adjust the indices + d->size -= count; + d->first = (d->first + count) % d->capacity; + } +} + +template +void QCircularBuffer::setCapacity(int capacity) +{ + if (capacity == d->capacity) + return; + + // Allocate some new raw memory + T* newData = d->allocate(capacity); + + // How many items can we copy across? + int newSize = qMin(d->size, capacity); + + if (QTypeInfo::isComplex) { + // Copy across the elements from the original array + for (int i = 0; i < newSize; ++i) { + T* src = d->data + ((d->first + i) % d->capacity); + T* dst = newData + i; + new (dst) T(*src); + } + + // Initialise any memory outside of the valid buffer (ie the unused items) + for (int i = newSize; i < capacity; ++i) + new (newData + i) T(); + + // Destroy the original items. + // The type is complex so we manually call the destructor for each item + // since we used the placement new operator to instantiate them + T* b = d->data; + T* i = b + d->capacity; + while (i-- != b) + i->~T(); + } else { + // Copy across the elements from the original array. The source region + // potentially wraps so we may have to do this in one or two steps + if (isLinearised()) { + memmove(newData, d->data + d->first, newSize * sizeof(T)); + } else { + int step1Size = qMin(newSize, d->capacity - d->first); + memmove(newData, d->data + d->first, step1Size * sizeof(T)); + int step2Size = qMax(0, qMin(newSize - d->capacity + d->first, d->last + 1)); + memmove(newData + step1Size, d->data, step2Size * sizeof(T)); + } + + // Initialise any memory outside of the valid buffer (ie the unused items) + qMemSet(newData + newSize, 0, (capacity - newSize) * sizeof(T)); + } + + // Release the raw memory for the old array + d->deallocate(d->data); + + // Assign the new memory to be our buffer data and fix indices + d->data = newData; + d->capacity = capacity; + d->first = 0; + d->size = newSize; + d->last = d->size - 1; +} + +template +void QCircularBuffer::resize(int size) +{ + Q_ASSERT_X(size >= 0 && size <= d->capacity, "QCircularBuffer::resize", "size out of range"); + + if (size < d->size) { + remove(size, d->size - size); + } else if (size > d->size) { + T t; + insert(d->size, size - d->size, t); + } +} + +template +bool QCircularBuffer::operator==(const QCircularBuffer other) const +{ + if (capacity() != other.capacity() || size() != other.size()) + return false; + if (d == other.d) + return true; + int count = size(); + for (int i = 0; i < count; ++i) + if (at(i) != other.at(i)) + return false; + return true; +} + +template +QCircularBuffer& QCircularBuffer::operator+=(const QCircularBuffer& other) +{ + // How many items do we need to copy? No point in ever copying across a number + // greater than capacity + int numToCopy = qMin(other.size(), d->capacity); + int offset = other.size() - numToCopy; + for (int i = 0; i < numToCopy; ++i) + append(other.at(offset + i)); + return *this; +} + +template +QCircularBuffer& QCircularBuffer::operator+=(const QVector& other) +{ + // How many items do we need to copy? No point in ever copying across a number + // greater than capacity + int numToCopy = qMin(other.size(), d->capacity); + int offset = other.size() - numToCopy; + for (int i = 0; i < numToCopy; ++i) + append(other.at(offset + i)); + return *this; +} + +template +QCircularBuffer& QCircularBuffer::operator+=(const QList& other) +{ + // How many items do we need to copy? No point in ever copying across a number + // greater than capacity + int numToCopy = qMin(other.size(), d->capacity); + int offset = other.size() - numToCopy; + for (int i = 0; i < numToCopy; ++i) + append(other.at(offset + i)); + return *this; +} + +template +QList QCircularBuffer::toList() const +{ + QList list; + for (int i = 0; i < size(); ++i) + list.append(at(i)); + return list; +} + +template +QVector QCircularBuffer::toVector() const +{ + QVector vector; + for (int i = 0; i < size(); ++i) + vector.append(at(i)); + return vector; +} + +template +QCircularBuffer operator+(const QCircularBuffer& lhs, const QCircularBuffer& rhs) +{ + QCircularBuffer circ(lhs.size() + rhs.size()); + for (int i = 0; i < lhs.size(); ++i) + circ.append(lhs.at(i)); + for (int i = 0; i < rhs.size(); ++i) + circ.append(rhs.at(i)); + return circ; +} + +Q_DECLARE_SEQUENTIAL_ITERATOR(CircularBuffer) +Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(CircularBuffer) + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QCIRCULARBUFFER_H diff --git a/Source/src/cusdr_agcWidget.cpp b/Source/src/cusdr_agcWidget.cpp new file mode 100644 index 0000000..3fc7dcb --- /dev/null +++ b/Source/src/cusdr_agcWidget.cpp @@ -0,0 +1,642 @@ +/** +* @file cusdr_agcWidget.h +* @brief AGC options widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-29 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#define LOG_GRAPHIC_OPTIONS_WIDGET + +//#include +//#include +//#include +//#include +//#include +#include + +#include "cusdr_agcWidget.h" + +#define btn_height 15 +#define btn_width 70 +#define btn_widths 32 +#define btn_width2 52 +#define btn_width3 60 + +AGCOptionsWidget::AGCOptionsWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(set->getDataEngineState()) + //, m_panadapterMode(set->getPanadapterMode()) + //, m_waterColorScheme(set->getWaterfallColorScheme()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) + , m_btnSpacing(5) + , m_currentReceiver(set->getCurrentReceiver()) + , m_sampleRate(set->getSampleRate()) + , m_mouseOver(false) +{ + //setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 0, 4, 0); + setMouseTracking(true); + + m_rxDataList = set->getReceiverDataList(); + + m_agcMode = m_rxDataList.at(0).agcMode; + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + createAgcModeBtnGroup(); + createAgcOptionsGroup(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setMargin(0); + hbox1->addStretch(); + hbox1->addWidget(agcModeGroupBox); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addStretch(); + hbox2->addWidget(agcOptionsGroupBox); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addStretch(); + setLayout(mainLayout); + + agcModeChanged(this, 0, m_agcMode, false); + + setupConnections(); +} + +AGCOptionsWidget::~AGCOptionsWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize AGCOptionsWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize AGCOptionsWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void AGCOptionsWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(graphicModeChanged( +// QObject *, +// QSDRGraphics::_Panadapter, +// QSDRGraphics::_WaterfallColorScheme)), +// this, +// SLOT(graphicModeChanged( +// QObject *, +// QSDRGraphics::_Panadapter, +// QSDRGraphics::_WaterfallColorScheme))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(agcModeChanged(QObject *, int, AGCMode, bool)), + this, + SLOT(agcModeChanged(QObject *, int, AGCMode, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(agcHangThresholdSliderChanged(QObject *, int, qreal)), + this, + SLOT(setAGCHangThresholdSlider(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcMaximumGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCMaximumGain_dB(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcFixedGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCFixedGain_dB(QObject *, int, qreal))); +} + +void AGCOptionsWidget::createAgcModeBtnGroup() { + + agcOFF = new AeroButton("Off", this); + agcOFF->setRoundness(0); + agcOFF->setFixedSize(btn_widths, btn_height); + agcOFF->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcOFF); + CHECKED_CONNECT(agcOFF, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcLONG = new AeroButton("Long", this); + agcLONG->setRoundness(0); + agcLONG->setFixedSize(btn_widths, btn_height); + agcLONG->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcLONG); + CHECKED_CONNECT(agcLONG, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcSLOW = new AeroButton("Slow", this); + agcSLOW->setRoundness(0); + agcSLOW->setFixedSize(btn_widths, btn_height); + agcSLOW->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcSLOW); + CHECKED_CONNECT(agcSLOW, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcMED = new AeroButton("Med", this); + agcMED->setRoundness(0); + agcMED->setFixedSize(btn_widths, btn_height); + agcMED->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcMED); + CHECKED_CONNECT(agcMED, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcFAST = new AeroButton("Fast", this); + agcFAST->setRoundness(0); + agcFAST->setFixedSize(btn_widths, btn_height); + agcFAST->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcFAST); + CHECKED_CONNECT(agcFAST, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcUSER = new AeroButton("User", this); + agcUSER->setRoundness(0); + agcUSER->setFixedSize(btn_widths, btn_height); + agcUSER->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcUSER); + CHECKED_CONNECT(agcUSER, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + QGridLayout *layout = new QGridLayout(); + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(agcOFF, 0, 0); + layout->addWidget(agcLONG, 0, 1); + layout->addWidget(agcSLOW, 0, 2); + layout->addWidget(agcMED, 0, 3); + layout->addWidget(agcFAST, 0, 4); + layout->addWidget(agcUSER, 0, 5); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + agcModeGroupBox = new QGroupBox(tr("AGC Mode"), this); + agcModeGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + agcModeGroupBox->setLayout(vbox); + agcModeGroupBox->setStyleSheet(set->getWidgetStyle()); + //agcModeGroupBox->setMinimumWidth(175); + agcModeGroupBox->setFont(QFont("Arial", 8)); +} + +void AGCOptionsWidget::createAgcOptionsGroup() { + + m_slopeSpinBox = new QSpinBox(this); + m_slopeSpinBox->setMinimum(0); + m_slopeSpinBox->setMaximum(20); + m_slopeSpinBox->setSingleStep(1); + m_slopeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_slopeSpinBox->setMinimumWidth(60); + m_slopeSpinBox->setValue((int) m_rxDataList.at(m_currentReceiver).agcVariableGain); + + CHECKED_CONNECT( + m_slopeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(slopeChanged(int))); + + m_slopeLabel = new QLabel("Slope (dB):", this); + m_slopeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_slopeLabel->setStyleSheet(set->getLabelStyle()); + + + m_maxGainSpinBox = new QSpinBox(this); + m_maxGainSpinBox->setMinimum(-60); + m_maxGainSpinBox->setMaximum(120); + m_maxGainSpinBox->setSingleStep(1); + m_maxGainSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_maxGainSpinBox->setMinimumWidth(60); + m_maxGainSpinBox->setValue((int) m_rxDataList.at(m_currentReceiver).agcMaximumGain_dB); + + CHECKED_CONNECT( + m_maxGainSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(maxGainChanged(int))); + + m_maxGainLabel = new QLabel("Max Gain (dB):", this); + m_maxGainLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_maxGainLabel->setStyleSheet(set->getLabelStyle()); + + + m_attackTimeSpinBox = new QSpinBox(this); + m_attackTimeSpinBox->setMinimum(1); + m_attackTimeSpinBox->setMaximum(10); + m_attackTimeSpinBox->setSingleStep(1); + m_attackTimeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_attackTimeSpinBox->setMinimumWidth(60); + m_attackTimeSpinBox->setValue((int) m_rxDataList.at(m_currentReceiver).agcAttackTime * 1000); + + CHECKED_CONNECT( + m_attackTimeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(attackTimeChanged(int))); + + m_attackTimeLabel = new QLabel("Attack Time (ms):", this); + m_attackTimeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_attackTimeLabel->setStyleSheet(set->getLabelStyle()); + + + m_decayTimeSpinBox = new QSpinBox(this); + m_decayTimeSpinBox->setMinimum(10); + m_decayTimeSpinBox->setMaximum(5000); + m_decayTimeSpinBox->setSingleStep(1); + m_decayTimeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_decayTimeSpinBox->setMinimumWidth(60); + m_decayTimeSpinBox->setValue((int) (m_rxDataList.at(m_currentReceiver).agcDecayTime * 1000)); + + CHECKED_CONNECT( + m_decayTimeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(decayTimeChanged(int))); + + m_decayTimeLabel = new QLabel("Decay Time (ms):", this); + m_decayTimeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_decayTimeLabel->setStyleSheet(set->getLabelStyle()); + + + m_hangTimeSpinBox = new QSpinBox(this); + m_hangTimeSpinBox->setMinimum(10); + m_hangTimeSpinBox->setMaximum(5000); + m_hangTimeSpinBox->setSingleStep(1); + m_hangTimeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_hangTimeSpinBox->setMinimumWidth(60); + m_hangTimeSpinBox->setValue((int) (m_rxDataList.at(m_currentReceiver).agcHangTime * 1000)); + + CHECKED_CONNECT( + m_hangTimeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(hangTimeChanged(int))); + + m_hangTimeLabel = new QLabel("Hang Time (ms):", this); + m_hangTimeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_hangTimeLabel->setStyleSheet(set->getLabelStyle()); + + m_hangThresholdSlider = new QSlider(Qt::Horizontal, this); + m_hangThresholdSlider->setTickPosition(QSlider::NoTicks); + m_hangThresholdSlider->setFixedSize(190, 12); + m_hangThresholdSlider->setSingleStep(1); + m_hangThresholdSlider->setRange(0, 100); + m_hangThresholdSlider->setValue(0); + m_hangThresholdSlider->setStyleSheet(set->getVolSliderStyle()); + + CHECKED_CONNECT( + m_hangThresholdSlider, + SIGNAL(valueChanged(int)), + this, + SLOT(hangThresholdValueChanged(int))); + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect(" 100 ").width(); + + QString str = "%1 "; + m_hangThresholdValueLabel = new QLabel(str.arg(0, 2, 10, QLatin1Char(' ')), this); + m_hangThresholdValueLabel->setFont(m_fonts.smallFont); + m_hangThresholdValueLabel->setFixedSize(fontMaxWidth, 12); + m_hangThresholdValueLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_hangThresholdValueLabel->setStyleSheet(set->getSliderLabelStyle()); + + m_hangThresholdLabel = new QLabel("Hang Threshold:", this); + m_hangThresholdLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_hangThresholdLabel->setStyleSheet(set->getLabelStyle()); + + + m_fixedGainSpinBox = new QSpinBox(this); + m_fixedGainSpinBox->setMinimum(-20); + m_fixedGainSpinBox->setMaximum(120); + m_fixedGainSpinBox->setSingleStep(1); + m_fixedGainSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_fixedGainSpinBox->setMinimumWidth(60); + m_fixedGainSpinBox->setValue((int) m_rxDataList.at(m_currentReceiver).agcFixedGain_dB); + + CHECKED_CONNECT( + m_fixedGainSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(fixedGainChanged(int))); + + m_fixedGainLabel = new QLabel("Fixed Gain (dB):", this); + m_fixedGainLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_fixedGainLabel->setStyleSheet(set->getLabelStyle()); + + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addWidget(m_slopeLabel); + hbox1->addStretch(); + hbox1->addWidget(m_slopeSpinBox); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(4); + hbox2->addWidget(m_maxGainLabel); + hbox2->addStretch(); + hbox2->addWidget(m_maxGainSpinBox); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(4); + hbox3->addWidget(m_attackTimeLabel); + hbox3->addStretch(); + hbox3->addWidget(m_attackTimeSpinBox); + + QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(4); + hbox4->addWidget(m_decayTimeLabel); + hbox4->addStretch(); + hbox4->addWidget(m_decayTimeSpinBox); + + QHBoxLayout *hbox5 = new QHBoxLayout(); + hbox5->setSpacing(4); + hbox5->addWidget(m_hangTimeLabel); + hbox5->addStretch(); + hbox5->addWidget(m_hangTimeSpinBox); + + QHBoxLayout *hbox6 = new QHBoxLayout(); + hbox6->setSpacing(4); + hbox6->addWidget(m_fixedGainLabel); + hbox6->addStretch(); + hbox6->addWidget(m_fixedGainSpinBox); + + QHBoxLayout *hbox7 = new QHBoxLayout(); + hbox7->setSpacing(4); + hbox7->addWidget(m_hangThresholdLabel); + hbox7->addStretch(); + //hbox7->addWidget(m_fixedGainSpinBox); + + QHBoxLayout *hbox8 = new QHBoxLayout; + hbox8->setSpacing(0); + hbox8->setMargin(0); + hbox8->addStretch(); + hbox8->addWidget(m_hangThresholdSlider); + hbox8->addWidget(m_hangThresholdValueLabel); + hbox8->addStretch(); + + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + vbox->addLayout(hbox3); + vbox->addLayout(hbox4); + vbox->addLayout(hbox5); + vbox->addLayout(hbox6); + vbox->addSpacing(20); + vbox->addLayout(hbox7); + vbox->addSpacing(4); + vbox->addLayout(hbox8); + + agcOptionsGroupBox = new QGroupBox(tr("AGC Options"), this); + agcOptionsGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + agcOptionsGroupBox->setLayout(vbox); + agcOptionsGroupBox->setStyleSheet(set->getWidgetStyle()); + //agcModeGroupBox->setMinimumWidth(175); + agcOptionsGroupBox->setFont(QFont("Arial", 8)); +} + +void AGCOptionsWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; + + update(); +} + +void AGCOptionsWidget::agcModeChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + int btn = agcModeBtnList.indexOf(button); + + foreach(AeroButton *btn, agcModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + set->setAGCMode(this, m_currentReceiver, (AGCMode) btn); + m_agcMode = (AGCMode) btn; + + button->setBtnState(AeroButton::ON); + button->update(); +} + +void AGCOptionsWidget::agcModeChanged(QObject *sender, int rx, AGCMode mode, bool hang) { + + Q_UNUSED(sender) + Q_UNUSED(hang) + + if (m_currentReceiver != rx) return; + m_agcMode = mode; + + foreach(AeroButton *btn, agcModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + agcModeBtnList.at(mode)->setBtnState(AeroButton::ON); + agcModeBtnList.at(mode)->update(); + + if (mode == (AGCMode) agcUser) { + + m_attackTimeSpinBox->setEnabled(true); + m_decayTimeSpinBox->setEnabled(true); + m_hangTimeSpinBox->setEnabled(true); + } + else { + + m_attackTimeSpinBox->setEnabled(false); + m_decayTimeSpinBox->setEnabled(false); + m_hangTimeSpinBox->setEnabled(false); + } +} + +void AGCOptionsWidget::slopeChanged(int value) { + + set->setAGCVariableGain_dB(this, set->getCurrentReceiver(), (qreal)value); +} + +void AGCOptionsWidget::maxGainChanged(int value) { + + int rx = set->getCurrentReceiver(); + set->setAGCMaximumGain_dB(this, rx, (qreal) value); +} + +void AGCOptionsWidget::setAGCMaximumGain_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + + m_maxGainSpinBox->blockSignals(true); + m_maxGainSpinBox->setValue((int) value); + m_maxGainSpinBox->blockSignals(false); +} + +void AGCOptionsWidget::fixedGainChanged(int value) { + + int rx = set->getCurrentReceiver(); + set->setAGCFixedGain_dB(this, rx, (qreal) value); +} + +void AGCOptionsWidget::setAGCFixedGain_dB(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + + m_fixedGainSpinBox->blockSignals(true); + m_fixedGainSpinBox->setValue((int) value); + m_fixedGainSpinBox->blockSignals(false); +} + +void AGCOptionsWidget::attackTimeChanged(int value) { + + set->setAGCAttackTime(this, set->getCurrentReceiver(), value/1000.0); +} + +void AGCOptionsWidget::decayTimeChanged(int value) { + + set->setAGCDecayTime(this, set->getCurrentReceiver(), value/1000.0); +} + +void AGCOptionsWidget::hangTimeChanged(int value) { + + set->setAGCHangTime(this, set->getCurrentReceiver(), value/1000.0); +} + +void AGCOptionsWidget::hangThresholdValueChanged(int value) { + + QString str = " %1 "; + m_hangThresholdValueLabel->setText(str.arg(value, 2, 10, QLatin1Char(' '))); + + set->setAGCHangThreshold(this, set->getCurrentReceiver(), value); +} + +void AGCOptionsWidget::setAGCHangThresholdSlider(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + + m_hangThresholdSlider->blockSignals(true); + m_hangThresholdSlider->setValue((int) value); + m_hangThresholdSlider->blockSignals(false); + + QString str = " %1 "; + m_hangThresholdValueLabel->setText(str.arg((int)value, 2, 10, QLatin1Char(' '))); +} + +void AGCOptionsWidget::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; + //int currentValue = m_framesPerSecondSpinBox->value(); + + //m_framesPerSecondSpinBox->setMaximum(m_sampleRate/1000); + + //if (currentValue > m_sampleRate/1000) { + + // m_framesPerSecondSpinBox->setValue(m_sampleRate/1000); + // set->setFramesPerSecond(value); + //} +} + +void AGCOptionsWidget::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + if (m_currentReceiver == rx) return; + m_currentReceiver = rx; + + if (m_agcMode != m_rxDataList.at(rx).agcMode) { + m_agcMode = m_rxDataList.at(rx).agcMode; + } +} diff --git a/Source/src/cusdr_agcWidget.h b/Source/src/cusdr_agcWidget.h new file mode 100644 index 0000000..a83805b --- /dev/null +++ b/Source/src/cusdr_agcWidget.h @@ -0,0 +1,165 @@ +/** +* @file cusdr_agcWidget.h +* @brief AGC options widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-29 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_AGC_OPTIONS_WIDGET_H +#define _CUSDR_AGC_OPTIONS_WIDGET_H + +#include +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" + + +class AGCOptionsWidget : public QWidget { + + Q_OBJECT + +public: + AGCOptionsWidget(QWidget *parent = 0); + ~AGCOptionsWidget(); + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + +private: + Settings *set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + //QSDRGraphics::_Panadapter m_panadapterMode; + //QSDRGraphics::_WfScheme m_waterColorScheme; + + AGCMode m_agcMode; + + QList m_rxDataList; + + CFonts *fonts; + TFonts m_fonts; + + QString m_menu_style; + QString m_callSingText; + + QGroupBox *agcModeGroupBox; + QGroupBox *agcOptionsGroupBox; + + AeroButton *agcOFF; + AeroButton *agcLONG; + AeroButton *agcSLOW; + AeroButton *agcMED; + AeroButton *agcFAST; + AeroButton *agcUSER; + + QList agcModeBtnList; + + QLineEdit *callSignLineEdit; + + QSlider *m_hangThresholdSlider; + + QSpinBox *m_slopeSpinBox; + QSpinBox *m_maxGainSpinBox; + QSpinBox *m_attackTimeSpinBox; + QSpinBox *m_decayTimeSpinBox; + QSpinBox *m_hangTimeSpinBox; + QSpinBox *m_fixedGainSpinBox; + + QLabel *m_slopeLabel; + QLabel *m_maxGainLabel; + QLabel *m_attackTimeLabel; + QLabel *m_decayTimeLabel; + QLabel *m_hangTimeLabel; + QLabel *m_fixedGainLabel; + QLabel *m_hangThresholdLabel; + QLabel *m_hangThresholdValueLabel; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_btnSpacing; + int m_fontHeight; + int m_maxFontWidth; + int m_currentReceiver; + int m_sampleRate; + int m_agcHangThreshold; + + bool m_mouseOver; + + //qreal m_agcSlope; + qreal m_agcMaxGain; + qreal m_agcAttackTime; + qreal m_agcDecayTime; + qreal m_agcHangTime; + qreal m_agcFixedGain; + + + + void setupConnections(); + void createAgcModeBtnGroup(); + void createAgcOptionsGroup(); +// void createFPSGroupBox(); +// void createPanSpectrumOptions(); +// void createWaterfallSpectrumOptions(); +// void createSMeterOptions(); +// void createColorChooserWidget(); +// void createCallSignEditor(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setCurrentReceiver(QObject *sender, int rx); + void sampleRateChanged(QObject *sender, int value); + void agcModeChanged(QObject *sender, int rx, AGCMode mode, bool value); + void agcModeChangedByBtn(); + void slopeChanged(int value); + void maxGainChanged(int value); + void attackTimeChanged(int value); + void decayTimeChanged(int value); + void hangTimeChanged(int value); + void fixedGainChanged(int value); + void hangThresholdValueChanged(int value); + void setAGCHangThresholdSlider(QObject *sender, int rx, qreal value); + void setAGCMaximumGain_dB(QObject *sender, int rx, qreal value); + void setAGCFixedGain_dB(QObject *sender, int rx, qreal value); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString ); +}; + +#endif // _CUSDR_AGC_OPTIONS_WIDGET_H diff --git a/Source/src/cusdr_alexAntennaWidget.cpp b/Source/src/cusdr_alexAntennaWidget.cpp new file mode 100644 index 0000000..29e9035 --- /dev/null +++ b/Source/src/cusdr_alexAntennaWidget.cpp @@ -0,0 +1,491 @@ +/** +* @file cusdr_alexAntennaWidget.cpp +* @brief Alexiares antenna settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-09 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_ALEX_WIDGET + +#include +#include +#include +#include +#include + +#include "cusdr_alexAntennaWidget.h" + +#define btn_height 15 +#define btn_width 16//20 +#define btn_width2 24//28 +#define btn_width3 45 + +AlexAntennaWidget::AlexAntennaWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(0) + , m_numberOfBands(MAX_BANDS) +{ + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(2, 2, 12, 0); + setMouseTracking(true); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + +// //QFont titleFont; +// m_normalFont.setStyleStrategy(QFont::PreferQuality); +// m_normalFont.setFixedPitch(true); +// #ifdef Q_OS_MAC +// m_titleFont.setPixelSize(11); +// m_titleFont.setFamily("Arial"); +// //m_smallFont.setBold(true); +// #endif +// #ifdef Q_OS_WIN +// m_normalFont.setPixelSize(11); +// m_normalFont.setFamily("Arial"); +// //m_smallFont.setBold(true); +// //m_smallFont.setItalic(true); +// #endif + +// m_smallFont.setStyleStrategy(QFont::PreferAntialias); +// m_smallFont.setFixedPitch(true); +// #ifdef Q_OS_MAC +// m_smallFont.setPixelSize(9); +// m_smallFont.setFamily("Arial"); +// //m_smallFont.setBold(true); +// #endif +// #ifdef Q_OS_WIN +// m_smallFont.setPixelSize(9); +// m_smallFont.setFamily("Arial"); +// //m_smallFont.setBold(true); +// //m_smallFont.setItalic(true); +// #endif + + createAntennasGroup(); + + // set main layout + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 4, 0); + hbox1->addWidget(antennaGroup); + + mainLayout->addLayout(hbox1); + mainLayout->addStretch(); + + setLayout(mainLayout); + + setAlexValues(); + setupConnections(); +} + +AlexAntennaWidget::~AlexAntennaWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void AlexAntennaWidget::setupConnections() { + + /* + CHECKED_CONNECT( + set, + SIGNAL(alexStateChanged(int, int)), + this, + SLOT(alexStateChanged(int, int))); +*/ +} + +void AlexAntennaWidget::createAntennasGroup() { + + QLabel *emptyLabel1 = new QLabel(" ", this); + emptyLabel1->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel1->setStyleSheet(set->getLabelStyle()); + + QLabel *emptyLabel2 = new QLabel(" ", this); + emptyLabel2->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel2->setStyleSheet(set->getLabelStyle()); + + QLabel *emptyLabel3 = new QLabel(" ", this); + emptyLabel3->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel3->setStyleSheet(set->getLabelStyle()); + + QLabel *antRxLabel = new QLabel("Rx Ant", this); + antRxLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + antRxLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *rxAuxLabel = new QLabel("Rx Aux", this); + rxAuxLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + rxAuxLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *antTxLabel = new QLabel("Tx Ant", this); + antTxLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + antTxLabel->setStyleSheet(set->getLabelStyle()); + + // band label + QStringList bandNames; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "gen"; + + QList bandLabelList; + + for (int i = 0; i < m_numberOfBands; i++) { + + QLabel *label = new QLabel(bandNames.at(i), this); + label->setFrameStyle(QFrame::Box | QFrame::Raised); + label->setStyleSheet(set->getLabelStyle()); + + bandLabelList << label; + } + + + // antennas 1,2, and 3 button lists + for (int i = 0; i < m_numberOfBands; i++) { + + AeroButton *btn = new AeroButton("1", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + antenna1BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(rxAntBtnClicked())); + + btn = new AeroButton("2", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + antenna2BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(rxAntBtnClicked())); + + btn = new AeroButton("3", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + antenna3BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(rxAntBtnClicked())); + } + + for (int i = 0; i < m_numberOfBands; i++) { + + QList btnList; + btnList << antenna1BtnList.at(i) << antenna2BtnList.at(i) << antenna3BtnList.at(i); + + bandBtnMatrix << btnList; + } + + // Rx Aux 1,2, and XV button lists + for (int i = 0; i < m_numberOfBands; i++) { + + AeroButton *btn = new AeroButton("1", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + rx1BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(rxAuxBtnClicked())); + + btn = new AeroButton("2", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + rx2BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(rxAuxBtnClicked())); + + btn = new AeroButton("XV", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + xvBtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(rxAuxBtnClicked())); + } + + for (int i = 0; i < m_numberOfBands; i++) { + + QList btnList; + btnList << rx1BtnList.at(i) << rx2BtnList.at(i) << xvBtnList.at(i); + + bandBtnRxMatrix << btnList; + } + + // Tx 1,2, and 3 button lists + for (int i = 0; i < m_numberOfBands; i++) { + + AeroButton *btn = new AeroButton("1", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + tx1BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(txAntBtnClicked())); + + btn = new AeroButton("2", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + tx2BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(txAntBtnClicked())); + + btn = new AeroButton("3", this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + + tx3BtnList << btn; + + CHECKED_CONNECT(btn, SIGNAL(clicked()), this, SLOT(txAntBtnClicked())); + } + + for (int i = 0; i < m_numberOfBands; i++) { + + QList btnList; + btnList << tx1BtnList.at(i) << tx2BtnList.at(i) << tx3BtnList.at(i); + + bandBtnTxMatrix << btnList; + } + + QGridLayout* grid = new QGridLayout(this); + grid->setVerticalSpacing(1); + grid->setHorizontalSpacing(1); + grid->setContentsMargins(3, 7, 5, 7); + + grid->addWidget(emptyLabel1, 0, 0, 1, 2, Qt::AlignLeft); + grid->addWidget(antRxLabel, 0, 2, 1, 3, Qt::AlignCenter); + grid->addWidget(emptyLabel2, 0, 5, 1, 1, Qt::AlignCenter); + grid->addWidget(rxAuxLabel, 0, 6, 1, 3, Qt::AlignCenter); + grid->addWidget(emptyLabel3, 0, 9, 1, 1, Qt::AlignCenter); + grid->addWidget(antTxLabel, 0, 10, 1, 3, Qt::AlignCenter); + + + for (int i = 0; i < m_numberOfBands; i++) { + + grid->addWidget(bandLabelList.at(i), i+1, 0, 1, 2, Qt::AlignLeft); + grid->addWidget(antenna1BtnList.at(i), i+1, 2, 1, 1, Qt::AlignCenter); + grid->addWidget(antenna2BtnList.at(i), i+1, 3, 1, 1, Qt::AlignCenter); + grid->addWidget(antenna3BtnList.at(i), i+1, 4, 1, 1, Qt::AlignCenter); + grid->addWidget(emptyLabel2, i+1, 5, 1, 1, Qt::AlignCenter); + grid->addWidget(rx1BtnList.at(i), i+1, 6, 1, 1, Qt::AlignCenter); + grid->addWidget(rx2BtnList.at(i), i+1, 7, 1, 1, Qt::AlignCenter); + grid->addWidget(xvBtnList.at(i), i+1, 8, 1, 1, Qt::AlignCenter); + grid->addWidget(emptyLabel3, i+1, 9, 1, 1, Qt::AlignCenter); + grid->addWidget(tx1BtnList.at(i), i+1, 10, 1, 1, Qt::AlignCenter); + grid->addWidget(tx2BtnList.at(i), i+1, 11, 1, 1, Qt::AlignCenter); + grid->addWidget(tx3BtnList.at(i), i+1, 12, 1, 1, Qt::AlignCenter); + } + + antennaGroup = new QGroupBox(tr(""), this); + antennaGroup->setMinimumWidth(m_minimumGroupBoxWidth); + antennaGroup->setLayout(grid); + antennaGroup->setStyleSheet(set->getWidgetStyle()); + antennaGroup->setFont(QFont("Arial", 8)); +} + +//***************** +void AlexAntennaWidget::rxAntBtnClicked() { + + AeroButton *button = qobject_cast(sender()); + + int btnHit; + int antenna; + int btnHit1 = antenna1BtnList.indexOf(button); + int btnHit2 = antenna2BtnList.indexOf(button); + int btnHit3 = antenna3BtnList.indexOf(button); + + if (btnHit1 >= 0) { + + btnHit = btnHit1; + antenna = 1; + } + else if (btnHit2 >= 0) { + + btnHit = btnHit2; + antenna = 2; + } + else if (btnHit3 >= 0) { + + btnHit = btnHit3; + antenna = 3; + } + else + return; + + if (btnHit >= 0) { + + foreach(AeroButton *btn, bandBtnMatrix.at(btnHit)) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + button->setBtnState(AeroButton::ON); + button->update(); + } + + m_alexStates[btnHit] &= 0x1FC; // 1 1 1 1 1 1 1 0 0 + m_alexStates[btnHit] |= antenna; + + set->setAlexState(this, btnHit, m_alexStates[btnHit]); +} + +void AlexAntennaWidget::rxAuxBtnClicked() { + + AeroButton *button = qobject_cast(sender()); + + int btnHit; + int aux; + int btnHit1 = rx1BtnList.indexOf(button); + int btnHit2 = rx2BtnList.indexOf(button); + int btnHit3 = xvBtnList.indexOf(button); + + if (btnHit1 >= 0) { + + btnHit = btnHit1; + aux = 1; + } + else if (btnHit2 >= 0) { + + btnHit = btnHit2; + aux = 2; + } + else if (btnHit3 >= 0) { + + btnHit = btnHit3; + aux = 3; + } + else + return; + + if (button->btnState() == AeroButton::ON) { + + button->setBtnState(AeroButton::OFF); + button->update(); + + m_alexStates[btnHit] &= 0x1E3; // 1 1 1 1 0 0 0 1 1 + } + else { + + if (btnHit >= 0) { + + foreach(AeroButton *btn, bandBtnRxMatrix.at(btnHit)) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + button->setBtnState(AeroButton::ON); + button->update(); + } + m_alexStates[btnHit] &= 0x1E3; // 1 1 1 1 0 0 0 1 1 + m_alexStates[btnHit] |= aux << 2; + } + set->setAlexState(this, btnHit, m_alexStates[btnHit]); +} + +void AlexAntennaWidget::txAntBtnClicked() { + + AeroButton *button = qobject_cast(sender()); + + int btnHit; + int antenna; + int btnHit1 = tx1BtnList.indexOf(button); + int btnHit2 = tx2BtnList.indexOf(button); + int btnHit3 = tx3BtnList.indexOf(button); + + if (btnHit1 >= 0) { + + btnHit = btnHit1; + antenna = 1; + } + else if (btnHit2 >= 0) { + + btnHit = btnHit2; + antenna = 2; + } + else if (btnHit3 >= 0) { + + btnHit = btnHit3; + antenna = 3; + } + else + return; + + if (btnHit >= 0) { + + foreach(AeroButton *btn, bandBtnTxMatrix.at(btnHit)) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + button->setBtnState(AeroButton::ON); + button->update(); + } + + m_alexStates[btnHit] &= 0x19F; // 1 1 0 0 1 1 1 1 1 + m_alexStates[btnHit] |= antenna << 5; + + set->setAlexState(this, btnHit, m_alexStates[btnHit]); +} + +void AlexAntennaWidget::setAlexValues() { + + //m_alexConfiguration = set->getAlexConfiguration(); + m_alexConfig = set->getAlexConfig(); + m_alexStates = set->getAlexStates();//m_alexParameters.state; + + for (int i = 0; i < m_numberOfBands; i++) { + + int rxAnt = m_alexStates.at(i) & 0x03; + if (rxAnt > 0) + bandBtnMatrix.at(i).at(rxAnt-1)->setBtnState(AeroButton::ON); + + int rxAux = (m_alexStates.at(i) >> 2) & 0x07; + if (rxAux > 0) + bandBtnRxMatrix.at(i).at(rxAux-1)->setBtnState(AeroButton::ON); + else { + + bandBtnRxMatrix.at(i).at(0)->setBtnState(AeroButton::OFF); + bandBtnRxMatrix.at(i).at(1)->setBtnState(AeroButton::OFF); + bandBtnRxMatrix.at(i).at(2)->setBtnState(AeroButton::OFF); + } + + int txAnt = (m_alexStates.at(i) >> 5) & 0x03; + if (txAnt > 0) + bandBtnTxMatrix.at(i).at(txAnt-1)->setBtnState(AeroButton::ON); + } +} diff --git a/Source/src/cusdr_alexAntennaWidget.h b/Source/src/cusdr_alexAntennaWidget.h new file mode 100644 index 0000000..4b3a896 --- /dev/null +++ b/Source/src/cusdr_alexAntennaWidget.h @@ -0,0 +1,116 @@ +/** +* @file cusdr_alexAntennaWidget.h +* @brief Alexiares antenna settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-09 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_ALEX_ANTENNA_WIDGET_H +#define _CUSDR_ALEX_ANTENNA_WIDGET_H + +//#include +//#include +#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" + +#ifdef LOG_ANTENNA_WIDGET +# define ANTENNA_WIDGET_DEBUG qDebug().nospace() << "AntennaWidget::\t" +#else +# define ALEX_WIDGET_DEBUG nullDebug() +#endif + + +class AlexAntennaWidget : public QWidget { + + Q_OBJECT + +public: + AlexAntennaWidget(QWidget *parent = 0); + ~AlexAntennaWidget(); + +protected: + //void resizeEvent(QResizeEvent *event); + +public slots: + +private: + void setupConnections(); + void createAntennasGroup(); + + void setAlexValues(); + +private: + Settings *set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QGroupBox *antennaGroup; + + QList antenna1BtnList; + QList antenna2BtnList; + QList antenna3BtnList; + + QList > bandBtnMatrix; + + QList rx1BtnList; + QList rx2BtnList; + QList xvBtnList; + + QList > bandBtnRxMatrix; + + QList tx1BtnList; + QList tx2BtnList; + QList tx3BtnList; + + QList > bandBtnTxMatrix; + + QList m_alexStates; + + CFonts *fonts; + TFonts m_fonts; + + quint16 m_alexConfig; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_numberOfBands; + +private slots: + void rxAntBtnClicked(); + void rxAuxBtnClicked(); + void txAntBtnClicked(); + +signals: + void showEvent(QObject* sender); + void closeEvent(QObject* sender); + void messageEvent(QString); +}; + +#endif // _CUSDR_ALEX_ANTENNA_WIDGET_H diff --git a/Source/src/cusdr_alexFilterWidget.cpp b/Source/src/cusdr_alexFilterWidget.cpp new file mode 100644 index 0000000..e2a0c1d --- /dev/null +++ b/Source/src/cusdr_alexFilterWidget.cpp @@ -0,0 +1,1045 @@ +/** +* @file cusdr_alexFilterWidget.cpp +* @brief Alexiares filter settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-23 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_ALEX_WIDGET + + +#include +#include +#include +#include + +#include "cusdr_alexFilterWidget.h" + +#define btn_height 15 +#define btn_width 22 +#define btn_width2 24//28 +#define btn_width3 45 + + +AlexFilterWidget::AlexFilterWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_frequency(set->getVfoFrequencies().at(0)) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(0) + , m_hpfFilters(6) + , m_lpfFilters(7) + , m_receiver(0) + , bypassAll(false) + , lowNoise6m(false) + , hpf13MHz(false) + , hpf20MHz(false) + , hpf9_5MHz(false) + , hpf6_5MHz(false) + , hpf1_5MHz(false) +{ + setObjectName("AlexFilterWidget"); + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 8, 4, 0); + setMouseTracking(true); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + btnOff = QColor(68, 68, 68, 255); + btnOn = QColor(56, 242, 115, 255); + + manualFilterBtn = new AeroButton("Auto", this); + manualFilterBtn->setRoundness(0); + manualFilterBtn->setFixedSize (btn_width3, btn_height); + manualFilterBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT(manualFilterBtn, SIGNAL(clicked()), this, SLOT(manualFilterBtnClicked())); + + defaultValuesBtn = new AeroButton("Default", this); + defaultValuesBtn->setRoundness(0); + defaultValuesBtn->setFixedSize (btn_width3, btn_height); + defaultValuesBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT(defaultValuesBtn, SIGNAL(clicked()), this, SLOT(defaultValuesBtnClicked())); + + //************************************************************** + // create groups + setFilterValues(); + + createHPFGroup(); + createLPFGroup(); + + // set main layout + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + mainLayout->setContentsMargins(1, 0, 4, 0); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 12, 0); + hbox1->addStretch(); + hbox1->addWidget(manualFilterBtn); + hbox1->addWidget(defaultValuesBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setContentsMargins(2, 0, 10, 0); + hbox2->addWidget(HPFGroup); + + QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(0); + hbox3->setContentsMargins(2, 0, 10, 0); + hbox3->addWidget(LPFGroup); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addStretch(); + + setLayout(mainLayout); + + initAlexValues(); + setupConnections(); + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + + setAlexConfiguration((double)(set->getVfoFrequencies().at(0)/1000.0)); +} + +AlexFilterWidget::~AlexFilterWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void AlexFilterWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(alexManualStateChanged(QObject *, bool)), + this, + SLOT(alexManualStateChanged(QObject *, bool))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(currentReceiverChanged(QObject *,int)), +// this, +// SLOT(setCurrentReceiver(QObject *, int))); + + /*CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, bool, int, long)), + this, + SLOT(setFrequency(QObject *, bool, int, long)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(setFrequency(QObject *, int, int, long))); +} + +void AlexFilterWidget::createHPFGroup() { + + QLabel *byPassLabel = new QLabel("byPass", this); + byPassLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + byPassLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *emptyLabel = new QLabel(" ", this); + emptyLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *hpfLabel = new QLabel("HPF (kHz)", this); + hpfLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + hpfLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *mHz1_5Label = new QLabel("1.5 MHz", this); + mHz1_5Label->setFrameStyle(QFrame::Box | QFrame::Raised); + mHz1_5Label->setStyleSheet(set->getLabelStyle()); + m_HPFLabelList.append(mHz1_5Label); + + QLabel *mHz6_5Label = new QLabel("6.5 MHz", this); + mHz6_5Label->setFrameStyle(QFrame::Box | QFrame::Raised); + mHz6_5Label->setStyleSheet(set->getLabelStyle()); + m_HPFLabelList.append(mHz6_5Label); + + QLabel *mHz9_5Label = new QLabel("9.5 MHz", this); + mHz9_5Label->setFrameStyle(QFrame::Box | QFrame::Raised); + mHz9_5Label->setStyleSheet(set->getLabelStyle()); + m_HPFLabelList.append(mHz9_5Label); + + QLabel *mHz13Label = new QLabel("13 MHz", this); + mHz13Label->setFrameStyle(QFrame::Box | QFrame::Raised); + mHz13Label->setStyleSheet(set->getLabelStyle()); + m_HPFLabelList.append(mHz13Label); + + QLabel *mHz20Label = new QLabel("20 MHz", this); + mHz20Label->setFrameStyle(QFrame::Box | QFrame::Raised); + mHz20Label->setStyleSheet(set->getLabelStyle()); + m_HPFLabelList.append(mHz20Label); + + QLabel *m6BPF_LNALabel = new QLabel("6m LNA", this); + m6BPF_LNALabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m6BPF_LNALabel->setStyleSheet(set->getLabelStyle()); + m_HPFLabelList.append(m6BPF_LNALabel); + + QLabel *byPassAllLabel = new QLabel("Bypass", this); + byPassAllLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + byPassAllLabel->setStyleSheet(set->getLabelStyle()); + + mhz55HPFLabel = new QLabel(" 55 MHz HPF ", this); + mhz55HPFLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + mhz55HPFLabel->setStyleSheet(set->getLabelStyle()); + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000000.0").width() + 30; + + QList values = set->getHPFLoFrequencies(); + + // HPF lo spin boxes + for (int i = 0; i < m_hpfFilters; i++) { + + QDoubleSpinBox *spinBox = new QDoubleSpinBox(); + spinBox->setStyleSheet(set->getDoubleSpinBoxStyle()); + spinBox->setDecimals(1); + spinBox->setWrapping(true); + spinBox->setMinimumWidth(fontMaxWidth); + spinBox->setRange(m_HPFFrequencyRangeLoList.at(i).first, m_HPFFrequencyRangeLoList.at(i).second); + spinBox->setSingleStep(0.5); + spinBox->setValue((double)(values.at(i)/1000.0)); + + CHECKED_CONNECT(spinBox, SIGNAL(valueChanged(double)), this, SLOT(hpfLoSpinBoxValueChanged(double))); + + m_HPFLoSpinBoxList << spinBox; + } + + values = set->getHPFHiFrequencies(); + + // HPF hi spin boxes + for (int i = 0; i < m_hpfFilters; i++) { + + QDoubleSpinBox *spinBox = new QDoubleSpinBox(); + spinBox->setStyleSheet(set->getDoubleSpinBoxStyle()); + spinBox->setDecimals(1); + spinBox->setWrapping(true); + spinBox->setMinimumWidth(fontMaxWidth); + spinBox->setRange(m_HPFFrequencyRangeHiList.at(i).first, m_HPFFrequencyRangeHiList.at(i).second); + spinBox->setSingleStep(0.5); + spinBox->setValue((double)(values.at(i)/1000.0)); + + CHECKED_CONNECT(spinBox, SIGNAL(valueChanged(double)), this, SLOT(hpfHiSpinBoxValueChanged(double))); + + m_HPFHiSpinBoxList << spinBox; + } + + // HPF active buttons + for (int i = 0; i < m_hpfFilters+1; i++) { + + QHLed *btn = new QHLed("", this); + btn->setFixedSize(4, btn_height); + btn->setColors(btnOff, btnOff); + + m_HPFActiveBtnList << btn; + } + + + hpf1_5MHzBtn = new AeroButton("Off", this); + hpf1_5MHzBtn->setRoundness(0); + hpf1_5MHzBtn->setFixedSize(btn_width, btn_height); + hpf1_5MHzBtn->setStyleSheet(set->getMiniButtonStyle()); + hpf1_5MHzBtn->setBtnState(AeroButton::OFF); + m_HPFBtnList.append(hpf1_5MHzBtn); + + CHECKED_CONNECT(hpf1_5MHzBtn, SIGNAL(clicked()), this, SLOT(hpf1_5MHzBtnClicked())); + + hpf6_5MHzBtn = new AeroButton("Off", this); + hpf6_5MHzBtn->setRoundness(0); + hpf6_5MHzBtn->setFixedSize(btn_width, btn_height); + hpf6_5MHzBtn->setStyleSheet(set->getMiniButtonStyle()); + hpf6_5MHzBtn->setBtnState(AeroButton::OFF); + m_HPFBtnList.append(hpf6_5MHzBtn); + + CHECKED_CONNECT(hpf6_5MHzBtn, SIGNAL(clicked()), this, SLOT(hpf6_5MHzBtnClicked())); + + hpf9_5MHzBtn = new AeroButton("Off", this); + hpf9_5MHzBtn->setRoundness(0); + hpf9_5MHzBtn->setFixedSize(btn_width, btn_height); + hpf9_5MHzBtn->setStyleSheet(set->getMiniButtonStyle()); + hpf9_5MHzBtn->setBtnState(AeroButton::OFF); + m_HPFBtnList.append(hpf9_5MHzBtn); + + CHECKED_CONNECT(hpf9_5MHzBtn, SIGNAL(clicked()), this, SLOT(hpf9_5MHzBtnClicked())); + + hpf13MHzBtn = new AeroButton("Off", this); + hpf13MHzBtn->setRoundness(0); + hpf13MHzBtn->setFixedSize(btn_width, btn_height); + hpf13MHzBtn->setStyleSheet(set->getMiniButtonStyle()); + hpf13MHzBtn->setBtnState(AeroButton::OFF); + m_HPFBtnList.append(hpf13MHzBtn); + + CHECKED_CONNECT(hpf13MHzBtn, SIGNAL(clicked()), this, SLOT(hpf13MHzBtnClicked())); + + hpf20MHzBtn = new AeroButton("Off", this); + hpf20MHzBtn->setRoundness(0); + hpf20MHzBtn->setFixedSize(btn_width, btn_height); + hpf20MHzBtn->setStyleSheet(set->getMiniButtonStyle()); + hpf20MHzBtn->setBtnState(AeroButton::OFF); + m_HPFBtnList.append(hpf20MHzBtn); + + CHECKED_CONNECT(hpf20MHzBtn, SIGNAL(clicked()), this, SLOT(hpf20MHzBtnClicked())); + + lowNoise6mAmpBtn = new AeroButton("Off", this); + lowNoise6mAmpBtn->setRoundness(0); + lowNoise6mAmpBtn->setFixedSize(btn_width, btn_height); + lowNoise6mAmpBtn->setStyleSheet(set->getMiniButtonStyle()); + lowNoise6mAmpBtn->setBtnState(AeroButton::OFF); + m_HPFBtnList.append(lowNoise6mAmpBtn); + + CHECKED_CONNECT(lowNoise6mAmpBtn, SIGNAL(clicked()), this, SLOT(lowNoise6mAmpBtnClicked())); + + bypassAllHPFBtn = new AeroButton("Off", this); + bypassAllHPFBtn->setRoundness(0); + bypassAllHPFBtn->setFixedSize (btn_width, btn_height); + bypassAllHPFBtn->setStyleSheet(set->getMiniButtonStyle()); + bypassAllHPFBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT(bypassAllHPFBtn, SIGNAL(clicked()), this, SLOT(bypassAllHPFBtnClicked())); + + + QGridLayout* grid = new QGridLayout(this); + grid->setVerticalSpacing(1); + grid->setHorizontalSpacing(1); + grid->setContentsMargins(2, 12, 2, 7); + + grid->addWidget(byPassLabel, 0, 0, 1, 2, Qt::AlignLeft); + grid->addWidget(hpfLabel, 0, 2, 1, 3, Qt::AlignCenter); + + for (int i = 0; i < m_hpfFilters; i++) { + + grid->addWidget(m_HPFBtnList.at(i), i+1, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(m_HPFLabelList.at(i), i+1, 1, 1, 1, Qt::AlignLeft); + grid->addWidget(m_HPFLoSpinBoxList.at(i), i+1, 2, 1, 1, Qt::AlignCenter); + grid->addWidget(m_HPFHiSpinBoxList.at(i), i+1, 3, 1, 1, Qt::AlignCenter); + grid->addWidget(m_HPFActiveBtnList.at(i), i+1, 4, 1, 1, Qt::AlignCenter); + } + + grid->addWidget(bypassAllHPFBtn, 8, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(byPassAllLabel, 8, 1, 1, 1, Qt::AlignCenter); + grid->addWidget(mhz55HPFLabel, 8, 2, 1, 2, Qt::AlignCenter); + grid->addWidget(m_HPFActiveBtnList.at(m_hpfFilters), 8, 4, 1, 1, Qt::AlignCenter); + + HPFGroup = new QGroupBox(tr("HP Filters"), this); + HPFGroup->setMinimumWidth(m_minimumGroupBoxWidth); + HPFGroup->setLayout(grid); + HPFGroup->setStyleSheet(set->getWidgetStyle()); + HPFGroup->setFont(QFont("Arial", 8)); +} + +void AlexFilterWidget::createLPFGroup() { + + QLabel *lpfLabel = new QLabel("LPF (kHz)", this); + lpfLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + lpfLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *emptyLabel = new QLabel(" ", this); + emptyLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *m160Label = new QLabel("160m", this); + m160Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m160Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m160Label); + + QLabel *m80Label = new QLabel("80m", this); + m80Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m80Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m80Label); + + QLabel *m60_40Label = new QLabel("60/40m", this); + m60_40Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m60_40Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m60_40Label); + + QLabel *m30_20Label = new QLabel("30/20m", this); + m30_20Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m30_20Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m30_20Label); + + QLabel *m17_15Label = new QLabel("17/15m", this); + m17_15Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m17_15Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m17_15Label); + + QLabel *m12_10Label = new QLabel("12/10m", this); + m12_10Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m12_10Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m12_10Label); + + QLabel *m6Label = new QLabel("6m", this); + m6Label->setFrameStyle(QFrame::Box | QFrame::Raised); + m6Label->setStyleSheet(set->getLabelStyle()); + m_LPFLabelList.append(m6Label); + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("000000.0").width() + 30; + + QList values = set->getLPFLoFrequencies(); + + // LPF lo spin boxes + for (int i = 0; i < m_lpfFilters; i++) { + + QDoubleSpinBox *spinBox = new QDoubleSpinBox(); + spinBox->setStyleSheet(set->getDoubleSpinBoxStyle()); + spinBox->setDecimals(1); + spinBox->setWrapping(true); + spinBox->setMinimumWidth(fontMaxWidth); + spinBox->setRange(m_LPFFrequencyRangeLoList.at(i).first, m_LPFFrequencyRangeLoList.at(i).second); + spinBox->setSingleStep(0.5); + spinBox->setValue((double)(values.at(i)/1000.0)); + + CHECKED_CONNECT(spinBox, SIGNAL(valueChanged(double)), this, SLOT(lpfLoSpinBoxValueChanged(double))); + + m_LPFLoSpinBoxList << spinBox; + } + + values = set->getLPFHiFrequencies(); + + // LPF hi spin boxes + for (int i = 0; i < m_lpfFilters; i++) { + + QDoubleSpinBox *spinBox = new QDoubleSpinBox(); + spinBox->setStyleSheet(set->getDoubleSpinBoxStyle()); + spinBox->setDecimals(1); + spinBox->setWrapping(true); + spinBox->setMinimumWidth(fontMaxWidth); + spinBox->setRange(m_LPFFrequencyRangeHiList.at(i).first, m_LPFFrequencyRangeHiList.at(i).second); + spinBox->setSingleStep(0.5); + spinBox->setValue((double)(values.at(i)/1000.0)); + + CHECKED_CONNECT(spinBox, SIGNAL(valueChanged(double)), this, SLOT(lpfHiSpinBoxValueChanged(double))); + + m_LPFHiSpinBoxList << spinBox; + } + + // LPF active buttons + for (int i = 0; i < m_lpfFilters; i++) { + + QHLed *btn = new QHLed("", this); + btn->setFixedSize(4, btn_height); + btn->setColors(btnOff, btnOff); + + m_LPFActiveBtnList << btn; + + //CHECKED_CONNECT(spinBox, SIGNAL(valueChanged(double)), this, SLOT(hpfHiSpinBoxValueChanged(double))); + } + + QGridLayout* grid = new QGridLayout(this); + grid->setVerticalSpacing(1); + grid->setHorizontalSpacing(1); + grid->setContentsMargins(28, 12, 2, 7); + + grid->addWidget(emptyLabel, 0, 0, 1, 1, Qt::AlignCenter); + grid->addWidget(lpfLabel, 0, 1, 1, 3, Qt::AlignCenter); + + for (int i = 0; i < m_lpfFilters; i++) { + + grid->addWidget(m_LPFLabelList.at(i), i+1, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(m_LPFLoSpinBoxList.at(i), i+1, 1, 1, 1, Qt::AlignCenter); + grid->addWidget(m_LPFHiSpinBoxList.at(i), i+1, 2, 1, 1, Qt::AlignCenter); + grid->addWidget(m_LPFActiveBtnList.at(i), i+1, 3, 1, 1, Qt::AlignCenter); + } + + LPFGroup = new QGroupBox(tr("LP Filters"), this); + LPFGroup->setMinimumWidth(m_minimumGroupBoxWidth); + LPFGroup->setLayout(grid); + LPFGroup->setStyleSheet(set->getWidgetStyle()); + LPFGroup->setFont(QFont("Arial", 8)); +} + +//***************** + +void AlexFilterWidget::setFilterValues() { + + m_HPFFrequencyRangeLoList << qMakePair(0.0, 2000.0); + m_HPFFrequencyRangeLoList << qMakePair(6000.0, 8000.0); + m_HPFFrequencyRangeLoList << qMakePair(9000.0, 11000.0); + m_HPFFrequencyRangeLoList << qMakePair(12000.0, 15000.0); + m_HPFFrequencyRangeLoList << qMakePair(18000.0, 25000.0); + m_HPFFrequencyRangeLoList << qMakePair(49000.0, 52500.0); + + m_HPFFrequencyRangeHiList << qMakePair(1600.0, 6000.0); + m_HPFFrequencyRangeHiList << qMakePair(7000.0, 9500.0); + m_HPFFrequencyRangeHiList << qMakePair(10000.0, 13000.0); + m_HPFFrequencyRangeHiList << qMakePair(13700.0, 19000.0); + m_HPFFrequencyRangeHiList << qMakePair(25000.0, 32000.0); + m_HPFFrequencyRangeHiList << qMakePair(52500.0, 55000.0); + + m_LPFFrequencyRangeLoList << qMakePair(0.0, 1900.0); + m_LPFFrequencyRangeLoList << qMakePair(2000.0, 4000.0); + m_LPFFrequencyRangeLoList << qMakePair(5000.0, 11000.0); + m_LPFFrequencyRangeLoList << qMakePair(9000.0, 15000.0); + m_LPFFrequencyRangeLoList << qMakePair(17000.0, 22000.0); + m_LPFFrequencyRangeLoList << qMakePair(23000.0, 30000.0); + m_LPFFrequencyRangeLoList << qMakePair(30000.0, 52000.0); + + m_LPFFrequencyRangeHiList << qMakePair(1000.0, 3000.0); + m_LPFFrequencyRangeHiList << qMakePair(2000.0, 5000.0); + m_LPFFrequencyRangeHiList << qMakePair(5000.0, 8000.0); + m_LPFFrequencyRangeHiList << qMakePair(9000.0, 15000.0); + m_LPFFrequencyRangeHiList << qMakePair(17000.0, 22000.0); + m_LPFFrequencyRangeHiList << qMakePair(23000.0, 30000.0); + m_LPFFrequencyRangeHiList << qMakePair(52000.0, 66000.0); + + + m_HPFLoDefaultFrequencyList << 1500.0; + m_HPFLoDefaultFrequencyList << 7000.0; + m_HPFLoDefaultFrequencyList << 10100.0; + m_HPFLoDefaultFrequencyList << 14000.0; + m_HPFLoDefaultFrequencyList << 21000.0; + m_HPFLoDefaultFrequencyList << 50000.0; + + m_HPFHiDefaultFrequencyList << 5500.0; + m_HPFHiDefaultFrequencyList << 7300.0; + m_HPFHiDefaultFrequencyList << 10150.0; + m_HPFHiDefaultFrequencyList << 18168.0; + m_HPFHiDefaultFrequencyList << 29700.0; + m_HPFHiDefaultFrequencyList << 54000.0; + + m_LPFLoDefaultFrequencyList << 1800.0; + m_LPFLoDefaultFrequencyList << 3500.0; + m_LPFLoDefaultFrequencyList << 5330.0; + m_LPFLoDefaultFrequencyList << 10100.0; + m_LPFLoDefaultFrequencyList << 18068.0; + m_LPFLoDefaultFrequencyList << 24890.0; + m_LPFLoDefaultFrequencyList << 50000.0; + + m_LPFHiDefaultFrequencyList << 2000.0; + m_LPFHiDefaultFrequencyList << 4000.0; + m_LPFHiDefaultFrequencyList << 7300.0; + m_LPFHiDefaultFrequencyList << 14350.0; + m_LPFHiDefaultFrequencyList << 21450.0; + m_LPFHiDefaultFrequencyList << 29700.0; + m_LPFHiDefaultFrequencyList << 54000.0; +} + +void AlexFilterWidget::hpfLoSpinBoxValueChanged(double value) { + + QDoubleSpinBox *spinBox = qobject_cast(sender()); + + int filter = m_HPFLoSpinBoxList.indexOf(spinBox); + + set->setAlexHPFLoFrequencies(filter, (long)(value * 1000)); +} + +void AlexFilterWidget::hpfHiSpinBoxValueChanged(double value) { + + QDoubleSpinBox *spinBox = qobject_cast(sender()); + + int filter = m_HPFHiSpinBoxList.indexOf(spinBox); + + set->setAlexHPFHiFrequencies(filter, (long)(value * 1000)); +} + +void AlexFilterWidget::lpfLoSpinBoxValueChanged(double value) { + + QDoubleSpinBox *spinBox = qobject_cast(sender()); + + int filter = m_LPFLoSpinBoxList.indexOf(spinBox); + + set->setAlexLPFLoFrequencies(filter, (long)(value * 1000)); +} + +void AlexFilterWidget::lpfHiSpinBoxValueChanged(double value) { + + QDoubleSpinBox *spinBox = qobject_cast(sender()); + + int filter = m_LPFHiSpinBoxList.indexOf(spinBox); + + set->setAlexLPFHiFrequencies(filter, (long)(value * 1000)); +} + +void AlexFilterWidget::manualFilterBtnClicked() { + + if (manualFilterBtn->btnState() == AeroButton::OFF) { + + manualFilterBtn->setText("Manual"); + manualFilterBtn->setBtnState(AeroButton::ON); + +// bypassAllHPFBtn->setEnabled(true); +// lowNoise6mAmpBtn->setEnabled(true); +// hpf13MHzBtn->setEnabled(true); +// hpf20MHzBtn->setEnabled(true); +// hpf9_5MHzBtn->setEnabled(true); +// hpf6_5MHzBtn->setEnabled(true); +// hpf1_5MHzBtn->setEnabled(true); +// lpf30_20mBtn->setEnabled(true); +// lpf60_40mBtn->setEnabled(true); +// lpf80mBtn->setEnabled(true); +// lpf160mBtn->setEnabled(true); +// lpf6mBtn->setEnabled(true); +// lpf12_10mBtn->setEnabled(true); +// lpf17_15mBtn->setEnabled(true); + + m_alexConfig |= 0x01; + } + else { + + manualFilterBtn->setText("Auto"); + manualFilterBtn->setBtnState(AeroButton::OFF); + +// bypassAllHPFBtn->setEnabled(false); +// lowNoise6mAmpBtn->setEnabled(false); +// hpf13MHzBtn->setEnabled(false); +// hpf20MHzBtn->setEnabled(false); +// hpf9_5MHzBtn->setEnabled(false); +// hpf6_5MHzBtn->setEnabled(false); +// hpf1_5MHzBtn->setEnabled(false); +// lpf30_20mBtn->setEnabled(false); +// lpf60_40mBtn->setEnabled(false); +// lpf80mBtn->setEnabled(false); +// lpf160mBtn->setEnabled(false); +// lpf6mBtn->setEnabled(false); +// lpf12_10mBtn->setEnabled(false); +// lpf17_15mBtn->setEnabled(false); + + m_alexConfig |= 0xFFFE; + } + manualFilterBtn->update(); + + set->setAlexConfiguration(this, m_alexConfig); +} + +void AlexFilterWidget::defaultValuesBtnClicked() { + + for (int i = 0; i < m_hpfFilters; i++) { + + m_HPFLoSpinBoxList[i]->setValue(m_HPFLoDefaultFrequencyList.at(i)); + m_HPFHiSpinBoxList[i]->setValue(m_HPFHiDefaultFrequencyList.at(i)); + } + + for (int i = 0; i < m_lpfFilters; i++) { + + m_LPFLoSpinBoxList[i]->setValue(m_LPFLoDefaultFrequencyList.at(i)); + m_LPFHiSpinBoxList[i]->setValue(m_LPFHiDefaultFrequencyList.at(i)); + } +} + +void AlexFilterWidget::bypassAllHPFBtnClicked() { + + if (bypassAllHPFBtn->btnState() == AeroButton::OFF) { + + bypassAllHPFBtn->setText("On"); + bypassAllHPFBtn->setBtnState(AeroButton::ON); + bypassAll = true; + } + else { + + bypassAllHPFBtn->setText("Off"); + bypassAllHPFBtn->setBtnState(AeroButton::OFF); + bypassAll = false; + } + bypassAllHPFBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::lowNoise6mAmpBtnClicked() { + + if (lowNoise6mAmpBtn->btnState() == AeroButton::OFF) { + + lowNoise6mAmpBtn->setText("On"); + lowNoise6mAmpBtn->setBtnState(AeroButton::ON); + lowNoise6m = true; + } + else { + + lowNoise6mAmpBtn->setText("Off"); + lowNoise6mAmpBtn->setBtnState(AeroButton::OFF); + lowNoise6m = false; + } + lowNoise6mAmpBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::hpf1_5MHzBtnClicked() { + + if (hpf1_5MHzBtn->btnState() == AeroButton::OFF) { + + hpf1_5MHzBtn->setBtnState(AeroButton::ON); + hpf1_5MHzBtn->setText("On"); + hpf1_5MHz = true; + } + else { + + hpf1_5MHzBtn->setBtnState(AeroButton::OFF); + hpf1_5MHzBtn->setText("Off"); + hpf1_5MHz= false; + } + hpf1_5MHzBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::hpf6_5MHzBtnClicked() { + + if (hpf6_5MHzBtn->btnState() == AeroButton::OFF) { + + hpf6_5MHzBtn->setBtnState(AeroButton::ON); + hpf6_5MHzBtn->setText("On"); + hpf6_5MHz = true; + } + else { + + hpf6_5MHzBtn->setBtnState(AeroButton::OFF); + hpf6_5MHzBtn->setText("Off"); + hpf6_5MHz = false; + } + hpf6_5MHzBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::hpf9_5MHzBtnClicked() { + + if (hpf9_5MHzBtn->btnState() == AeroButton::OFF) { + + hpf9_5MHzBtn->setBtnState(AeroButton::ON); + hpf9_5MHzBtn->setText("On"); + hpf9_5MHz = true; + } + else { + + hpf9_5MHzBtn->setBtnState(AeroButton::OFF); + hpf9_5MHzBtn->setText("Off"); + hpf9_5MHz = false; + } + hpf9_5MHzBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::hpf13MHzBtnClicked() { + + if (hpf13MHzBtn->btnState() == AeroButton::OFF) { + + hpf13MHzBtn->setBtnState(AeroButton::ON); + hpf13MHzBtn->setText("On"); + hpf13MHz = true; + } + else { + + hpf13MHzBtn->setBtnState(AeroButton::OFF); + hpf13MHzBtn->setText("Off"); + hpf13MHz = false; + } + hpf13MHzBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::hpf20MHzBtnClicked() { + + if (hpf20MHzBtn->btnState() == AeroButton::OFF) { + + hpf20MHzBtn->setBtnState(AeroButton::ON); + hpf20MHzBtn->setText("On"); + hpf20MHz = true; + } + else { + + hpf20MHzBtn->setBtnState(AeroButton::OFF); + hpf20MHzBtn->setText("Off"); + hpf20MHz = false; + } + hpf20MHzBtn->update(); + + setFrequency(this, 0, m_receiver, set->getVfoFrequencies().at(m_receiver)); +} + +void AlexFilterWidget::setFrequency(QObject * sender, int mode, int rx, long frequency) { + + Q_UNUSED(sender) + Q_UNUSED(mode) + + m_receiver = rx; + m_frequency = frequency; + + if ((m_alexConfig & 0x01) == 0) return; + + setAlexConfiguration((double)(frequency/1000.0)); + + set->setAlexConfiguration(this, m_alexConfig); +} + +void AlexFilterWidget::setAlexConfiguration(double freq) { + + foreach(QHLed *led, m_HPFActiveBtnList) + led->setColors(btnOff, btnOff); + + // Alex configuration + // m_alexConfig (quint16): + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + + // reset + m_alexConfig &= 1; + + // HPF switching + if (!bypassAll) { + + // HPF 1.5 MHz + if (freq >= m_HPFLoSpinBoxList.at(0)->value() && freq <= m_HPFHiSpinBoxList.at(0)->value()) { + + if (!hpf1_5MHz) { + + m_HPFActiveBtnList.at(0)->setColors(btnOn, btnOn); + m_alexConfig |= 0x08; + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + // HPF 6.5 MHz + else if (freq >= m_HPFLoSpinBoxList.at(1)->value() && freq <= m_HPFHiSpinBoxList.at(1)->value()) { + + if (!hpf6_5MHz) { + + m_HPFActiveBtnList.at(1)->setColors(btnOn, btnOn); + m_alexConfig |= 0x10; + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + // HPF 9.5 MHz + else if (freq >= m_HPFLoSpinBoxList.at(2)->value() && freq <= m_HPFHiSpinBoxList.at(2)->value()) { + + if (!hpf9_5MHz) { + + m_HPFActiveBtnList.at(2)->setColors(btnOn, btnOn); + m_alexConfig |= 0x20; + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + // HPF 13 MHz + else if (freq >= m_HPFLoSpinBoxList.at(3)->value() && freq <= m_HPFHiSpinBoxList.at(3)->value()) { + + if (!hpf13MHz) { + + m_HPFActiveBtnList.at(3)->setColors(btnOn, btnOn); + m_alexConfig |= 0x40; + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + // HPF 20 MHz + else if (freq >= m_HPFLoSpinBoxList.at(4)->value() && freq <= m_HPFHiSpinBoxList.at(4)->value()) { + + if (!hpf20MHz) { + + m_HPFActiveBtnList.at(4)->setColors(btnOn, btnOn); + m_alexConfig |= 0x80; + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + // 6m BPF/LNA + else if (freq >= m_HPFLoSpinBoxList.at(5)->value() && freq <= m_HPFHiSpinBoxList.at(5)->value()) { + + if (!lowNoise6m) { + + m_HPFActiveBtnList.at(5)->setColors(btnOn, btnOn); + m_alexConfig |= 0x04; + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + } + // by pass all + else { + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x02; + } + + + // LPF switching + foreach(QHLed *led, m_LPFActiveBtnList) + led->setColors(btnOff, btnOff); + + if (freq >= m_LPFLoSpinBoxList.at(0)->value() && freq <= m_LPFHiSpinBoxList.at(0)->value()) { + + m_LPFActiveBtnList.at(0)->setColors(btnOn, btnOn); + m_alexConfig |= 0x100; + } + else if (freq >= m_LPFLoSpinBoxList.at(1)->value() && freq <= m_LPFHiSpinBoxList.at(1)->value()) { + + m_LPFActiveBtnList.at(1)->setColors(btnOn, btnOn); + m_alexConfig |= 0x200; + } + else if (freq >= m_LPFLoSpinBoxList.at(2)->value() && freq <= m_LPFHiSpinBoxList.at(2)->value()) { + + m_LPFActiveBtnList.at(2)->setColors(btnOn, btnOn); + m_alexConfig |= 0x400; + } + else if (freq >= m_LPFLoSpinBoxList.at(3)->value() && freq <= m_LPFHiSpinBoxList.at(3)->value()) { + + m_LPFActiveBtnList.at(3)->setColors(btnOn, btnOn); + m_alexConfig |= 0x800; + } + else if (freq >= m_LPFLoSpinBoxList.at(4)->value() && freq <= m_LPFHiSpinBoxList.at(4)->value()) { + + m_LPFActiveBtnList.at(4)->setColors(btnOn, btnOn); + m_alexConfig |= 0x1000; + } + else if (freq >= m_LPFLoSpinBoxList.at(5)->value() && freq <= m_LPFHiSpinBoxList.at(5)->value()) { + + m_LPFActiveBtnList.at(5)->setColors(btnOn, btnOn); + m_alexConfig |= 0x2000; + } + else { + + m_LPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + m_alexConfig |= 0x4000; + } +} + +void AlexFilterWidget::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + m_receiver = rx; +} + +void AlexFilterWidget::initAlexValues() { + + // Alex configuration: + // + // m_alexConfig (quint16) + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + + m_alexConfig = set->getAlexConfig(); + m_alexStates = set->getAlexStates(); + + + if (m_alexConfig & 0x01) { + + manualFilterBtn->setText("Manual"); + manualFilterBtn->setBtnState(AeroButton::ON); + } + else { + + manualFilterBtn->setText("Auto"); + manualFilterBtn->setBtnState(AeroButton::OFF); + } + manualFilterBtn->update(); +} + +void AlexFilterWidget::alexManualStateChanged(QObject *sender, bool value) { + + Q_UNUSED(sender) + + if (value) { + + m_alexConfig |= 0x01; + m_receiver = set->getCurrentReceiver(); + setFrequency(this, true, m_receiver, set->getVfoFrequencies().at(m_receiver)); + + manualFilterBtn->setText("Manual"); + manualFilterBtn->setBtnState(AeroButton::ON); + } + else { + + m_alexConfig &= 0xFFFE; + + foreach(QHLed *led, m_HPFActiveBtnList) + led->setColors(btnOff, btnOff); + + m_HPFActiveBtnList.at(6)->setColors(btnOn, btnOn); + + manualFilterBtn->setText("Auto"); + manualFilterBtn->setBtnState(AeroButton::OFF); + + set->setAlexConfiguration(this, m_alexConfig); + } + manualFilterBtn->update(); +} + diff --git a/Source/src/cusdr_alexFilterWidget.h b/Source/src/cusdr_alexFilterWidget.h new file mode 100644 index 0000000..c536e58 --- /dev/null +++ b/Source/src/cusdr_alexFilterWidget.h @@ -0,0 +1,160 @@ +/** +* @file cusdr_alexFilterWidget.h +* @brief Alexiares filter settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-23 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_ALEX_FILTER_WIDGET_H +#define _CUSDR_ALEX_FILTER_WIDGET_H + +#include +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "Util/cusdr_led.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" + + +class AlexFilterWidget : public QWidget { + + Q_OBJECT + +public: + AlexFilterWidget(QWidget *parent = 0); + ~AlexFilterWidget(); + +public slots: + +private: + void setupConnections(); + void createHPFGroup(); + void createLPFGroup(); + + void initAlexValues(); + void setFilterValues(); + +private: + Settings *set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QGroupBox* HPFGroup; + QGroupBox* LPFGroup; + + QList m_HPFLoSpinBoxList; + QList m_HPFHiSpinBoxList; + QList m_LPFLoSpinBoxList; + QList m_LPFHiSpinBoxList; + + QList m_HPFActiveBtnList; + QList m_LPFActiveBtnList; + + QList m_HPFLabelList; + QList m_LPFLabelList; + QList m_HPFBtnList; + + QList m_alexStates; + + QList > m_HPFFrequencyRangeLoList; + QList > m_HPFFrequencyRangeHiList; + QList > m_LPFFrequencyRangeLoList; + QList > m_LPFFrequencyRangeHiList; + + QList m_HPFLoDefaultFrequencyList; + QList m_HPFHiDefaultFrequencyList; + QList m_LPFLoDefaultFrequencyList; + QList m_LPFHiDefaultFrequencyList; + + CFonts *fonts; + TFonts m_fonts; + + QLabel *mhz55HPFLabel; + + AeroButton *manualFilterBtn; + AeroButton *defaultValuesBtn; + AeroButton *bypassAllHPFBtn; + AeroButton *lowNoise6mAmpBtn; + AeroButton *hpf13MHzBtn; + AeroButton *hpf20MHzBtn; + AeroButton *hpf9_5MHzBtn; + AeroButton *hpf6_5MHzBtn; + AeroButton *hpf1_5MHzBtn; + + QColor btnOff; + QColor btnOn; + + quint16 m_alexConfig; + + long m_frequency; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_hpfFilters; + int m_lpfFilters; + int m_receiver; + + bool bypassAll; + bool lowNoise6m; + bool hpf13MHz; + bool hpf20MHz; + bool hpf9_5MHz; + bool hpf6_5MHz; + bool hpf1_5MHz; + +private slots: + void alexManualStateChanged(QObject *sender, bool value); + + void hpfLoSpinBoxValueChanged(double value); + void hpfHiSpinBoxValueChanged(double value); + void lpfLoSpinBoxValueChanged(double value); + void lpfHiSpinBoxValueChanged(double value); + + //void setFrequency(QObject * sender, bool value, int rx, long frequency); + void setFrequency(QObject * sender, int mode, int rx, long frequency); + void setCurrentReceiver(QObject *sender, int rx); + void setAlexConfiguration(double frequency); + void manualFilterBtnClicked(); + void defaultValuesBtnClicked(); + void bypassAllHPFBtnClicked(); + void lowNoise6mAmpBtnClicked(); + void hpf13MHzBtnClicked(); + void hpf20MHzBtnClicked(); + void hpf9_5MHzBtnClicked(); + void hpf6_5MHzBtnClicked(); + void hpf1_5MHzBtnClicked(); + +signals: + void showEvent(QObject* sender); + void closeEvent(QObject* sender); + void messageEvent(QString); +}; + +#endif // _CUSDR_ALEX_FILTER_WIDGET_H diff --git a/Source/src/cusdr_alexTabWidget.cpp b/Source/src/cusdr_alexTabWidget.cpp new file mode 100644 index 0000000..f718976 --- /dev/null +++ b/Source/src/cusdr_alexTabWidget.cpp @@ -0,0 +1,86 @@ +/** +* @file cusdr_alexTabWidget.cpp +* @brief Alex settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-23 +*/ + +/* + * + * Copyright 2010-2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#include "cusdr_alexTabWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +AlexTabWidget::AlexTabWidget(QWidget *parent) + : QTabWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + setStyleSheet(set->getTabWidgetStyle()); + //setMinimumWidth(m_minimumWidgetWidth); + //setMaximumWidth (247); + setContentsMargins(4, 4, 4, 0); + setMouseTracking(true); + + m_alexAntennaWidget = new AlexAntennaWidget(this); + m_alexFilterWidget = new AlexFilterWidget(this); + + this->addTab(m_alexAntennaWidget, "Antenna"); + this->addTab(m_alexFilterWidget, "Filter"); + + setupConnections(); +} + +AlexTabWidget::~AlexTabWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize AlexTabWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize AlexTabWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void AlexTabWidget::setupConnections() { + +} + +void AlexTabWidget::addNICChangedConnection() { + + //m_hpsdrWidget->addNICChangedConnection(); +} diff --git a/Source/src/cusdr_alexTabWidget.h b/Source/src/cusdr_alexTabWidget.h new file mode 100644 index 0000000..40198dd --- /dev/null +++ b/Source/src/cusdr_alexTabWidget.h @@ -0,0 +1,69 @@ +/** +* @file cusdr_alexTabWidget.h +* @brief Alex settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-23 +*/ + +/* + * + * Copyright 2010-2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_ALEX_TABWIDGET_H +#define _CUSDR_ALEX_TABWIDGET_H + +//#include +//#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_alexAntennaWidget.h" +#include "cusdr_alexFilterWidget.h" + + +class AlexTabWidget : public QTabWidget { + + Q_OBJECT + +public: + AlexTabWidget(QWidget *parent = 0); + ~AlexTabWidget(); + + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + void addNICChangedConnection(); + +private: + Settings *set; + + AlexAntennaWidget *m_alexAntennaWidget; + AlexFilterWidget *m_alexFilterWidget; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + +}; + +#endif // _CUSDR_ALEX_TABWIDGET_H diff --git a/Source/src/cusdr_chirpWidget.cpp b/Source/src/cusdr_chirpWidget.cpp new file mode 100644 index 0000000..bc7bb5a --- /dev/null +++ b/Source/src/cusdr_chirpWidget.cpp @@ -0,0 +1,1103 @@ +/** +* @file cusdr_chirpWidget.cpp +* @brief Chirp signal settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-05-21 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_CHIRP_WIDGET + +//#include +//#include +//#include +//#include +#include +#include +#include +#include + +#include "cusdr_chirpWidget.h" + +#define btn_height 15 +#define btn_width 80 +#define btn_width2 52 + +ChirpWidget::ChirpWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(set->getDataEngineState()) + , m_timeScaleMax(2) + , m_graphWidth(200) + , m_graphHeight(100) + , m_antialiased(true) + , m_mouseOver(false) + , m_showChirpFFT(false) + , m_chirpUSB(false) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) + , m_btnSpacing(5) + , m_cnt(0) +{ + //setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 0, 4, 0); + setMouseTracking(true); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + m_stripes.resize(100); + m_timeScale = m_graphWidth / m_timeScaleMax; + stripeFreqRange(); + + // **************** + + createChirpModeGroup(); + createPlayFileGroup(); + createChirpSignalGroup(); + createMatchedFilterControlGroup(); + + set->setChirpReceiver(false); + + spectrumLabel = new QLabel(this); + createChirpSpectrumGroup(); + + //************************************************************** + // set main layout + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setMargin(0); + hbox1->addStretch(); + hbox1->addWidget(chirpModeGroupBox); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addStretch(); + hbox2->addWidget(playFileGroupBox); + + QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(0); + hbox3->setMargin(0); + hbox3->addStretch(); + hbox3->addWidget(chirpSignalGroupBox); + + QHBoxLayout *hbox4 = new QHBoxLayout; + hbox4->setSpacing(0); + hbox4->setMargin(0); + hbox4->addStretch(); + hbox4->addWidget(matchedFilterControlGroupBox); + + + QHBoxLayout *hbox5 = new QHBoxLayout; + hbox5->setSpacing(0); + hbox5->setMargin(0); + hbox5->addStretch(); + hbox5->addWidget(chirpSpectrumGroupBox); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addLayout(hbox4); + mainLayout->addLayout(hbox5); + mainLayout->addStretch(); + + setLayout(mainLayout); + + setupConnections(); + initChirpDecoder(); + + //createSpectrum(); +} + +ChirpWidget::~ChirpWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize ChirpWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize ChirpWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void ChirpWidget::setupConnections() { + + /*CHECKED_CONNECT( + set, + SIGNAL(audioBufferChanged(QObject *, qint64, qint64, const QByteArray)), + this, + SLOT(chirpBufferChanged(QObject *, qint64, qint64, const QByteArray)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(lowerChirpFreqChanged(QObject *, int)), + this, + SLOT(setChirpLowerFrequency(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(upperChirpFreqChanged(QObject *, int)), + this, + SLOT(setChirpUpperFrequency(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(chirpBufferDurationUsChanged(QObject *, qint64)), + this, + SLOT(setChirpBufferDurationUs(QObject *, qint64))); + + CHECKED_CONNECT( + set, + SIGNAL(chirpRepetitionTimesChanged(QObject *, int)), + this, + SLOT(setChirpRepetitionTimes(QObject *, int))); + + /*CHECKED_CONNECT( + set, + SIGNAL(chirpSpectrumChanged(qint64, qint64, const FrequencySpectrum &)), + this, + SLOT(chirpSpectrumChanged(qint64, qint64, const FrequencySpectrum &)));*/ + + CHECKED_CONNECT( + set, + SIGNAL(chirpSpectrumListChanged(const QList &)), + this, + SLOT(chirpSpectrumListChanged(const QList &))); + +} + +void ChirpWidget::createChirpModeGroup() { + + chirpModeBtn = new AeroButton("Decoding", this); + chirpModeBtn->setRoundness(10); + chirpModeBtn->setFixedSize(btn_width, btn_height); + chirpModeBtn->setBtnState(AeroButton::ON); + + CHECKED_CONNECT( + chirpModeBtn, + SIGNAL(clicked()), + this, + SLOT(initChirpDecoder())); + + loadFileBtn = new AeroButton("Load File", this); + loadFileBtn->setRoundness(10); + loadFileBtn->setFixedSize(btn_width, btn_height); + loadFileBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + loadFileBtn, + SIGNAL(clicked()), + this, + SLOT(showFileDialog())); + + /*rcveBtn = new AeroButton("Receiver", this); + rcveBtn->setRoundness(10); + rcveBtn->setFixedSize(btn_width, btn_height); + rcveBtn->setBtnState(AeroButton::OFF);*/ + + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(chirpModeBtn); + hbox1->addWidget(loadFileBtn); + //hbox1->addStretch(); + + /*QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(4); + hbox2->addStretch(); + hbox2->addWidget(rcveBtn);*/ + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + //vbox->addLayout(hbox2); + + chirpModeGroupBox = new QGroupBox(tr("Chirp WSPR"), this); + chirpModeGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + chirpModeGroupBox->setLayout(vbox); + chirpModeGroupBox->setStyleSheet(set->getWidgetStyle()); + chirpModeGroupBox->setFont(QFont("Arial", 8)); +} + +void ChirpWidget::createPlayFileGroup() { + + pauseBtn = new AeroButton("Pause", this); + pauseBtn->setRoundness(10); + pauseBtn->setFixedSize(btn_width2, btn_height); + pauseBtn->setBtnState(AeroButton::OFF); + pauseBtn->setEnabled(false); + CHECKED_CONNECT( + pauseBtn, + SIGNAL(clicked()), + this, + SLOT(suspend())); + + playBtn = new AeroButton("Play", this); + playBtn->setRoundness(10); + playBtn->setFixedSize(btn_width2, btn_height); + playBtn->setBtnState(AeroButton::OFF); + playBtn->setEnabled(false); + CHECKED_CONNECT( + playBtn, + SIGNAL(clicked()), + this, + SLOT(startPlayback())); + + settingsBtn = new AeroButton("Settings", this); + settingsBtn->setRoundness(10); + settingsBtn->setFixedSize(btn_width2, btn_height); + settingsBtn->setBtnState(AeroButton::OFF); + settingsBtn->setEnabled(true); + CHECKED_CONNECT( + settingsBtn, + SIGNAL(clicked()), + this, + SLOT(showSettingsDialog())); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(m_btnSpacing); + hbox1->addStretch(); + hbox1->addWidget(pauseBtn); + hbox1->addWidget(playBtn); + hbox1->addWidget(settingsBtn); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(m_btnSpacing); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + + playFileGroupBox = new QGroupBox(tr("Sound File"), this); + playFileGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + playFileGroupBox->setLayout(vbox); + playFileGroupBox->setStyleSheet(set->getWidgetStyle()); + playFileGroupBox->setFont(QFont("Arial", 8)); +} + +void ChirpWidget::createChirpSignalGroup() { + + //QFontMetrics d_fm(m_titleFont); + int fontMaxWidth = m_fonts.normalFontMetrics->boundingRect("00000").width(); + + QLabel *minFLabel = new QLabel(tr("lo :"), this); + minFLabel->setFont(m_fonts.normalFont); + minFLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *maxFLabel = new QLabel(tr("hi :"), this); + maxFLabel->setFont(m_fonts.normalFont); + maxFLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *freqLabel = new QLabel(tr(" Hz"), this); + freqLabel->setFont(m_fonts.normalFont); + freqLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *timeLabel = new QLabel(tr("chirp length :"), this); + timeLabel->setFont(m_fonts.normalFont); + timeLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *msecLabel = new QLabel(tr(" ms"), this); + msecLabel->setFont(m_fonts.normalFont); + msecLabel->setStyleSheet(set->getLabelStyle()); + + /*QLabel *repetitionLabel = new QLabel(tr("repetitions :"), this); + repetitionLabel->setFont(m_titleFont); + repetitionLabel->setStyleSheet(set->getLabelStyle());*/ + + lowerFreqSpinBox = new QSpinBox(this); + lowerFreqSpinBox->setStyleSheet(set->getSpinBoxStyle()); + lowerFreqSpinBox->setFixedWidth(fontMaxWidth + 30); + lowerFreqSpinBox->setRange(0, 10000); + lowerFreqSpinBox->setSingleStep(10); + lowerFreqSpinBox->setValue(set->getLowerChirpFreq()); + + CHECKED_CONNECT( + lowerFreqSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setLowerChirpFreq(int))); + + upperFreqSpinBox = new QSpinBox(this); + upperFreqSpinBox->setStyleSheet(set->getSpinBoxStyle()); + upperFreqSpinBox->setFixedWidth(fontMaxWidth + 30); + upperFreqSpinBox->setRange(50, 10000); + upperFreqSpinBox->setSingleStep(10); + upperFreqSpinBox->setValue(set->getUpperChirpFreq()); + + CHECKED_CONNECT( + upperFreqSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setUpperChirpFreq(int))); + + timeSpinBox = new QSpinBox(this); + timeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + timeSpinBox->setFixedWidth(fontMaxWidth + 30); + timeSpinBox->setRange(100, 10000); + timeSpinBox->setSingleStep(1); + timeSpinBox->setValue(set->getChirpBufferDurationUs()/1000); + + CHECKED_CONNECT( + timeSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setChirpBufferDurationUs(int))); + + CHECKED_CONNECT( + timeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(stripeResize(int))); + + /*repetitionSpinBox = new QSpinBox(this); + repetitionSpinBox->setStyleSheet(set->getSpinBoxStyle()); + repetitionSpinBox->setFixedWidth(fontMaxWidth + 30); + repetitionSpinBox->setRange(1, 10); + repetitionSpinBox->setSingleStep(1); + repetitionSpinBox->setValue(set->getChirpRepetitionTimes()); + CHECKED_CONNECT( + repetitionSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setChirpRepetitionTimes(int)));*/ + + playChirpBtn = new AeroButton("Play", this); + playChirpBtn->setRoundness(10); + playChirpBtn->setFixedSize(btn_width2, btn_height); + playChirpBtn->setBtnState(AeroButton::OFF); + CHECKED_CONNECT( + playChirpBtn, + SIGNAL(clicked()), + this, + SLOT(startPlayback())); + + /*chirpForwardBtn = new AeroButton("Forward", this); + chirpForwardBtn->setRoundness(10); + chirpForwardBtn->setFixedSize(btn_width2, btn_height); + + chirpBackwardBtn = new AeroButton("Backward", this); + chirpBackwardBtn->setRoundness(10); + chirpBackwardBtn->setFixedSize(btn_width2, btn_height);*/ + + /*chirpLSBBtn = new AeroButton("LSB", this); + chirpLSBBtn->setRoundness(10); + chirpLSBBtn->setFixedSize(btn_width2, btn_height); + chirpLSBBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + chirpLSBBtn, + SIGNAL(clicked()), + this, + SLOT(switchSideband())); + + chirpUSBBtn = new AeroButton("USB", this); + chirpUSBBtn->setRoundness(10); + chirpUSBBtn->setFixedSize(btn_width2, btn_height); + chirpUSBBtn->setBtnState(AeroButton::ON); + + CHECKED_CONNECT( + chirpUSBBtn, + SIGNAL(clicked()), + this, + SLOT(switchSideband()));*/ + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(m_btnSpacing); + hbox1->addStretch(); + hbox1->addWidget(minFLabel); + hbox1->addWidget(lowerFreqSpinBox); + hbox1->addSpacing(6); + hbox1->addWidget(maxFLabel); + hbox1->addWidget(upperFreqSpinBox); + hbox1->addSpacing(1); + hbox1->addWidget(freqLabel); + //hbox1->addWidget(playChirpBtn); + //hbox1->addStretch(); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(m_btnSpacing); + hbox2->addStretch(); + hbox2->addWidget(timeLabel); + hbox2->addWidget(timeSpinBox); + hbox2->addWidget(msecLabel); + //hbox2->addStretch(); + + /*QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(m_btnSpacing); + hbox3->addStretch(); + hbox3->addWidget(repetitionLabel); + hbox3->addWidget(repetitionSpinBox); + hbox3->addSpacing(d_fm.boundingRect(" ms").width());*/ + + /*QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(m_btnSpacing); + hbox3->addStretch(); + hbox3->addWidget(chirpForwardBtn); + hbox3->addWidget(chirpBackwardBtn);*/ + + /*QHBoxLayout *hbox4 = new QHBoxLayout; + hbox4->setSpacing(m_btnSpacing); + hbox4->addStretch(); + hbox4->addWidget(chirpLSBBtn); + hbox4->addWidget(chirpUSBBtn);*/ + + QHBoxLayout *hbox5 = new QHBoxLayout; + hbox5->setSpacing(m_btnSpacing); + hbox5->addStretch(); + hbox5->addWidget(playChirpBtn); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(m_btnSpacing); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + vbox->addSpacing(6); + //vbox->addLayout(hbox3); + //vbox->addLayout(hbox4); + vbox->addLayout(hbox5); + + chirpSignalGroupBox = new QGroupBox(tr("Chirp Signal"), this); + chirpSignalGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + chirpSignalGroupBox->setLayout(vbox); + chirpSignalGroupBox->setStyleSheet(set->getWidgetStyle()); + chirpSignalGroupBox->setFont(QFont("Arial", 8)); +} + +void ChirpWidget::createChirpSpectrumGroup() { + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(m_btnSpacing); + hbox1->addStretch(); + hbox1->addWidget(spectrumLabel); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(m_btnSpacing); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + + chirpSpectrumGroupBox = new QGroupBox(tr("Chirp Signal Spectrum"), this); + chirpSpectrumGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + chirpSpectrumGroupBox->setLayout(vbox); + chirpSpectrumGroupBox->setStyleSheet(set->getWidgetStyle()); + chirpSpectrumGroupBox->setFont(QFont("Arial", 8)); +} + +void ChirpWidget::createMatchedFilterControlGroup() { + + //QFontMetrics d_fm(m_titleFont); + int fontMaxWidth = m_fonts.normalFontMetrics->boundingRect("00000").width(); + + /*avgBtn = new AeroButton("AVG", this); + avgBtn->setRoundness(10); + avgBtn->setFixedSize(btn_width2, btn_height); + avgBtn->setBtnState(AeroButton::OFF);*/ + + QLabel *avgLabel = new QLabel(tr("Avg:"), this); + avgLabel->setFont(m_fonts.normalFont); + avgLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *secLabel = new QLabel(tr(" s"), this); + secLabel->setFont(m_fonts.normalFont); + secLabel->setStyleSheet(set->getLabelStyle()); + + avgSpinBox = new QSpinBox(this); + avgSpinBox->setStyleSheet(set->getSpinBoxStyle()); + avgSpinBox->setFixedWidth(fontMaxWidth + 30); + avgSpinBox->setRange(1, 120); + avgSpinBox->setSingleStep(1); + avgSpinBox->setValue(1); + + CHECKED_CONNECT( + avgSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setChirpAvgLength(int))); + + /*QLabel *filterLabel = new QLabel(tr("FIR Bandpass:"), this); + filterLabel->setFont(m_titleFont); + filterLabel->setStyleSheet(set->getLabelStyle());*/ + + QLabel *loFilterLabel = new QLabel(tr("BPF lo :"), this); + loFilterLabel->setFont(m_fonts.normalFont); + loFilterLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *upFilterLabel = new QLabel(tr("hi :"), this); + upFilterLabel->setFont(m_fonts.normalFont); + upFilterLabel->setStyleSheet(set->getLabelStyle()); + + QLabel *freqFilterLabel = new QLabel(tr(" Hz"), this); + freqFilterLabel->setFont(m_fonts.normalFont); + freqFilterLabel->setStyleSheet(set->getLabelStyle()); + + filterLowerFreqSpinBox = new QSpinBox(this); + filterLowerFreqSpinBox->setStyleSheet(set->getSpinBoxStyle()); + filterLowerFreqSpinBox->setFixedWidth(fontMaxWidth + 30); + filterLowerFreqSpinBox->setRange(0, 5000); + filterLowerFreqSpinBox->setSingleStep(10); + filterLowerFreqSpinBox->setValue(set->getChirpFilterLowerFrequency()); + + CHECKED_CONNECT( + filterLowerFreqSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setChirpFilterLowerFrequency(int))); + + filterUpperFreqSpinBox = new QSpinBox(this); + filterUpperFreqSpinBox->setStyleSheet(set->getSpinBoxStyle()); + filterUpperFreqSpinBox->setFixedWidth(fontMaxWidth + 30); + filterUpperFreqSpinBox->setRange(50, 10000); + filterUpperFreqSpinBox->setSingleStep(10); + filterUpperFreqSpinBox->setValue(set->getChirpFilterUpperFrequency()); + + CHECKED_CONNECT( + filterUpperFreqSpinBox, + SIGNAL(valueChanged(int)), + set, + SLOT(setChirpFilterUpperFrequency(int))); + + + showChirpFFTBtn = new AeroButton("Show Rx spectrum", this); + showChirpFFTBtn->setRoundness(10); + showChirpFFTBtn->setFixedSize(100, btn_height); + showChirpFFTBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + showChirpFFTBtn, + SIGNAL(clicked()), + this, + SLOT(showChirpFFT())); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(m_btnSpacing); + hbox1->addStretch(); + hbox1->addWidget(avgLabel); + hbox1->addWidget(avgSpinBox); + hbox1->addSpacing(1); + hbox1->addWidget(secLabel); + + /*QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(m_btnSpacing); + hbox2->addSpacing(6); + hbox2->addWidget(filterLabel);*/ + //hbox2->addStretch(); + + QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(m_btnSpacing); + hbox3->addStretch(); + hbox3->addWidget(loFilterLabel); + hbox3->addWidget(filterLowerFreqSpinBox); + hbox3->addSpacing(6); + hbox3->addWidget(upFilterLabel); + hbox3->addWidget(filterUpperFreqSpinBox); + hbox3->addSpacing(1); + hbox3->addWidget(freqFilterLabel); + + QHBoxLayout *hbox4 = new QHBoxLayout; + hbox4->setSpacing(m_btnSpacing); + hbox4->addStretch(); + hbox4->addWidget(showChirpFFTBtn); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(m_btnSpacing); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + //vbox->addLayout(hbox2); + vbox->addLayout(hbox3); + vbox->addSpacing(6); + vbox->addLayout(hbox4); + + matchedFilterControlGroupBox = new QGroupBox(tr("Matched Filter Control"), this); + matchedFilterControlGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + matchedFilterControlGroupBox->setLayout(vbox); + matchedFilterControlGroupBox->setStyleSheet(set->getWidgetStyle()); + matchedFilterControlGroupBox->setFont(QFont("Arial", 8)); +} + +void ChirpWidget::showFileDialog() { + + if (chirpModeBtn->btnState() == AeroButton::ON) { + + chirpModeBtn->setBtnState(AeroButton::OFF); + loadFileBtn->setBtnState(AeroButton::ON); + chirpModeBtn->update(); + } + + const QString dir; + const QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open WAV file"), dir, "*.wav"); + + if (fileNames.count()) { + + set->setSystemState( + this, + QSDR::NoError, + //m_hwInterface, + QSDR::NoInterfaceMode, + QSDR::ChirpWSPRFile, + QSDR::DataEngineDown); + emit messageEvent("[server]: switched to chirp decode file mode."); + emit loadFileEvent(this, fileNames.front()); + //updateButtonStates(); + playBtn->setEnabled(true); + pauseBtn->setEnabled(true); + } + else { + + playBtn->setEnabled(false); + pauseBtn->setEnabled(false); + } +} + +void ChirpWidget::initChirpDecoder() { + + if (loadFileBtn->btnState() == AeroButton::ON) { + + chirpModeBtn->setBtnState(AeroButton::ON); + loadFileBtn->setBtnState(AeroButton::OFF); + + playBtn->setEnabled(false); + pauseBtn->setEnabled(false); + loadFileBtn->update(); + + set->setSystemState( + this, + QSDR::NoError, + m_hwInterface, + QSDR::ChirpWSPR, + QSDR::DataEngineDown); + emit messageEvent("[server]: switched to chirp decode mode."); + } + + set->switchToChirpSignalMode(this); +} + +void ChirpWidget::setReceiver() { + + if (rcveBtn->btnState() == AeroButton::OFF) { + + rcveBtn->setBtnState(AeroButton::ON); + set->setChirpReceiver(true); + + } + else + if (rcveBtn->btnState() == AeroButton::ON) { + + rcveBtn->setBtnState(AeroButton::OFF); + set->setChirpReceiver(false); + } +} + +void ChirpWidget::showChirpFFT() { + + if (m_showChirpFFT) { + + showChirpFFTBtn->setBtnState(AeroButton::OFF); + set->setChirpFFTShow(false); + m_showChirpFFT = false; + } + else { + + showChirpFFTBtn->setBtnState(AeroButton::ON); + set->setChirpFFTShow(true); + m_showChirpFFT = true; + } + +} + +void ChirpWidget::switchSideband() { + + if (m_chirpUSB) { + + chirpLSBBtn->setBtnState(AeroButton::OFF); + chirpUSBBtn->setBtnState(AeroButton::ON); + chirpLSBBtn->update(); + chirpUSBBtn->update(); + set->setChirpUSB(true); + m_chirpUSB = false; + } + else { + + chirpLSBBtn->setBtnState(AeroButton::ON); + chirpUSBBtn->setBtnState(AeroButton::OFF); + chirpLSBBtn->update(); + chirpUSBBtn->update(); + set->setChirpUSB(false); + m_chirpUSB = true; + } +} + +//void ChirpWidget::chirpBufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { +// +// Q_UNUSED (sender) +// +// CHIRP_WIDGET_DEBUG << "audioBufferChanged" +// << "bufferPosition" << position +// << "bufferLength" << length; +// +// m_chirpBufferPosition = position; +// m_chirpBufferLength = length; +// m_chirpBuffer = buffer; +// +// +//} + +void ChirpWidget::chirpSpectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum) { + + CHIRP_WIDGET_DEBUG << "chirp spectrum changed!"; + + m_chirpPosition = position; + m_chirpLength = length; + m_spectrum = spectrum; + + CHIRP_WIDGET_DEBUG << "pos =" << m_chirpPosition; + + //updateStripes(); +} + +void ChirpWidget::chirpSpectrumListChanged(const QList &spectrumList) { + + //CHIRP_WIDGET_DEBUG << "chirp spectrumList changed!"; + + m_spectrumList = spectrumList; + updateStripes(); +} + +void ChirpWidget::resetSpectrum() { + + m_spectrum.reset(); + chirpSpectrumChanged(m_chirpPosition, m_chirpLength, m_spectrum); +} + +void ChirpWidget::suspend() { + + emit suspendSignal(this); +} + +void ChirpWidget::startPlayback() { + + emit startPlaybackSignal(this); +} + +void ChirpWidget::showSettingsDialog() { + + emit showSettingsDialogSignal(this); +} + +void ChirpWidget::setChirpLowerFrequency(QObject* sender, int lo) { + + Q_UNUSED(sender) + + if (lo >= upperFreqSpinBox->value()) + lowerFreqSpinBox->setValue(upperFreqSpinBox->value()); +} + +void ChirpWidget::setChirpUpperFrequency(QObject* sender, int hi) { + + Q_UNUSED(sender) + + if (hi <= lowerFreqSpinBox->value()) + upperFreqSpinBox->setValue(lowerFreqSpinBox->value()); +} + +void ChirpWidget::setChirpAmplitude(QObject* sender, qreal amp) { + + Q_UNUSED(sender) + Q_UNUSED(amp) + +} + +void ChirpWidget::setChirpBufferDurationUs(QObject* sender, qint64 value) { + + Q_UNUSED(sender) + Q_UNUSED(value) +} + +void ChirpWidget::setChirpRepetitionTimes(QObject* sender, int value) { + + Q_UNUSED(sender) + Q_UNUSED(value) +} + +void ChirpWidget::setFilterLowerFrequency(QObject* sender, int value) { + + Q_UNUSED(sender) + Q_UNUSED(value) +} + +void ChirpWidget::setFilterUpperFrequency(QObject* sender, int value) { + + Q_UNUSED(sender) + Q_UNUSED(value) +} + +int ChirpWidget::stripeIndex(qreal frequency) const { + + Q_ASSERT(frequency >= m_lowFreq && frequency < m_highFreq); + + const qreal bandWidth = (m_highFreq - m_lowFreq) / m_stripes.count(); + const int index = (frequency - m_lowFreq) / bandWidth; + + if(index < 0 || index >= m_stripes.count()) Q_ASSERT(false); + + return index; +} + +QPair ChirpWidget::stripeRange(int index) const { + + Q_ASSERT(index >= 0 && index < m_stripes.count()); + + const qreal bandWidth = (m_highFreq - m_lowFreq) / m_stripes.count(); + + return QPair(index * bandWidth, (index+1) * bandWidth); +} + +void ChirpWidget::stripeFreqRange() { + + //int lo = set->getLowerChirpFreq(); + int hi = set->getUpperChirpFreq(); + + //int unit = qRound((hi - lo) / 8); + //m_lowFreq = 100; + //m_highFreq = hi + unit; + m_lowFreq = 0; + + if (hi < 5000) + m_highFreq = 5000; + else + m_highFreq = 10000; +} + +void ChirpWidget::updateStripes() { + + if (m_stripeList.count() > 0) + m_stripeList.clear(); + + stripeFreqRange(); + foreach(FrequencySpectrum spectrum, m_spectrumList) { + + m_stripes.fill(Stripe()); + FrequencySpectrum::const_iterator i = spectrum.begin(); + const FrequencySpectrum::const_iterator end = spectrum.end(); + + for ( ; i != end; ++i) { + + const FrequencySpectrum::Element e = *i; + if (e.frequency >= m_lowFreq && e.frequency < m_highFreq) { + + Stripe &stripe = m_stripes[stripeIndex(e.frequency)]; + stripe.value = qMax(stripe.value, e.amplitude); + stripe.clipped |= e.clipped; + } + } + m_stripeList.append(m_stripes); + } + + createSpectrum(); +} + +void ChirpWidget::stripeResize(int scale) { + + qreal s = scale/1000.0; + if (s <= 2.0) + m_timeScaleMax = 2; + else + if (s <= 5.0) + m_timeScaleMax = 5; + else + m_timeScaleMax = 10; + + m_timeScale = s * m_graphWidth / m_timeScaleMax; + + updateStripes(); +} + +//void ChirpWidget::selectStripe(int index) { +// const QPair frequencyRange = stripeRange(index); +// const QString message = QString("%1 - %2 Hz") +// .arg(frequencyRange.first) +// .arg(frequencyRange.second); +// emit infoMessage(message, StripeSelectionInterval); +// +// if (NullTimerId != m_timerId) +// killTimer(m_timerId); +// m_timerId = startTimer(StripeSelectionInterval); +// +// m_stripeSelected = index; +// update(); +//} + +void ChirpWidget::createSpectrum() { + + m_resultImage = QImage(220, 150, QImage::Format_ARGB32_Premultiplied); + + QPainter painter(&m_resultImage); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.fillRect(m_resultImage.rect(), Qt::transparent); + painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true); + + QRect rect(0, 0, m_graphWidth + 20, m_graphHeight + 20); + QImage* stripeImage; + stripeImage = createSpectrumImage(rect); + + if (stripeImage) { + + painter.drawImage(0, 0, *stripeImage); + delete stripeImage; + } + + painter.end(); + + spectrumLabel->setPixmap(QPixmap::fromImage(m_resultImage)); +} + +QImage* ChirpWidget::createSpectrumImage(const QRect& rect) { + + QImage *image = new QImage(rect.size(), QImage::Format_ARGB32_Premultiplied); + if (!image) return NULL; + + QPainter painter(image); + painter.setFont(m_fonts.smallFont); + //painter.fillRect(image->rect(), Qt::transparent); + painter.fillRect(image->rect(), Qt::black); + + QFontMetrics sfm(m_fonts.smallFont); + m_fontHeight = sfm.height(); + m_maxFontWidth = sfm.width("00000 Hz"); + + int s = 0; + int length = m_stripeList.count(); + + if (length > 0) + //m_scale = (qreal)(1.0f * m_graphWidth / length); + m_scale = m_timeScale / length; + else + m_scale = 0; + + //CHIRP_WIDGET_DEBUG << "m_timeScale = " << m_timeScale; + + foreach(QVector stripe, m_stripeList) { + + int slength = stripe.count(); + for (int i = 0; i < slength; i++) { + + qreal v = stripe[i].value;// + 0.2f; + + //QColor color = QColor((int)(v * 55), (int)(v * 225), (int)(v * 255)); + //QColor color = QColor((int)(v * 255), (int)(v * 55), (int)(v * 255)); + QColor color = QColor((int)(v * 255), (int)(v * 55), (int)(v * 255)); + painter.setPen(QPen(color, 1)); + + int x1 = s * m_scale + 15; + int x2 = (s+1) * m_scale + 15; + int y = m_graphWidth/2 - (i+1); + + //if (x2 < m_graphWidth + 5) + painter.drawLine(x1, y, x2, y); + } + s++; + } + + QPen pen(QColor(45, 122, 148, 150), 1); + painter.setPen(pen); + + painter.drawRect(15, 0, m_graphWidth-1, m_graphHeight-1); + //painter.drawRect(0, 0, 10, m_graphHeight+9); + + pen.setColor(QColor(85, 162, 188, 255)); + painter.setPen(pen); + painter.rotate(-90); + + int scaleTextWidth = sfm.width("Frequency (kHz)"); + painter.drawText(- (scaleTextWidth + m_graphHeight) / 2, m_fontHeight - 5, "Frequency (kHz)"); + + painter.rotate(90); + scaleTextWidth = sfm.width("Time (sec)"); + painter.drawText(15 + (m_graphWidth - scaleTextWidth) / 2, 10 + m_graphHeight, "Time (sec)"); + painter.drawText(10, 10 + m_graphHeight, "0.0"); + + qreal t = 1.0f * m_timeScaleMax; + QString str = QString::number(t, 'f', 1); + painter.drawText(5 + m_graphWidth, 10 + m_graphHeight, str); + + //pen.setColor(QColor(225, 225, 225, 255)); + painter.setPen(pen); + + painter.drawText( + 18, 32 - m_fontHeight, + m_maxFontWidth, m_fontHeight, + Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, + "3.75"); + + painter.drawText( + 18, 57 - m_fontHeight, + m_maxFontWidth, m_fontHeight, + Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, + "2.50"); + + painter.drawText( + 18, 82 - m_fontHeight, + m_maxFontWidth, m_fontHeight, + Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, + "1.25"); + + pen.setStyle(Qt::DashLine); + pen.setColor(QColor(45, 122, 148, 110)); + painter.setPen(pen); + + painter.drawLine(42, 25, m_graphWidth + 15, 25); + painter.drawLine(42, 50, m_graphWidth + 15, 50); + painter.drawLine(42, 75, m_graphWidth + 15, 75); + + painter.drawLine(65, 0, 65, m_graphHeight); + painter.drawLine(115, 0, 115, m_graphHeight); + painter.drawLine(165, 0, 165, m_graphHeight); + //painter.drawLine(0, m_graphHeight, m_graphWidth, m_graphHeight); // bottom + + + painter.end(); + + return image; +} + +void ChirpWidget::resizeEvent(QResizeEvent *event) { + + //Q_UNUSED(event); + //QResizeEvent::oldSize() + + //QTimer::singleShot(10, this, SLOT(getRegion())); + //m_resizeFrame = true; + + QWidget::resizeEvent(event); +} diff --git a/Source/src/cusdr_chirpWidget.h b/Source/src/cusdr_chirpWidget.h new file mode 100644 index 0000000..efd0b6a --- /dev/null +++ b/Source/src/cusdr_chirpWidget.h @@ -0,0 +1,231 @@ +/** +* @file cusdr_chirpWidget.h +* @brief Chirp signal settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-05-21 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_CHIRP_WIDGET_H +#define _CUSDR_CHIRP_WIDGET_H + +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" + + +#ifdef LOG_CHIRP_WIDGET +# define CHIRP_WIDGET_DEBUG qDebug().nospace() << "ChirpWidget::\t" +#else +# define CHIRP_WIDGET_DEBUG nullDebug() +#endif + + +class ChirpWidget : public QWidget { + + Q_OBJECT + +public: + ChirpWidget(QWidget *parent = 0); + ~ChirpWidget(); + +protected: + void resizeEvent(QResizeEvent *event); + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + +private: + void setupConnections(); + void createChirpModeGroup(); + void createPlayFileGroup(); + void createChirpSignalGroup(); + void createChirpSpectrumGroup(); + void createMatchedFilterControlGroup(); + void createSpectrum(); + +private: + Settings *set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + CFonts *fonts; + TFonts m_fonts; + + QString m_menu_style; + QString lineedit_style; + + QLabel *labelAudioPortLabel; + QLabel *labelAudioPortText; + QLabel *spectrumLabel; + QLabel *controlLabel; + + QGroupBox *chirpModeGroupBox; + QGroupBox *playFileGroupBox; + QGroupBox *chirpSignalGroupBox; + QGroupBox *chirpSpectrumGroupBox; + QGroupBox *matchedFilterControlGroupBox; + + QComboBox *m_inputDeviceComboBox; + QComboBox *m_outputDeviceComboBox; + + QSpinBox *lowerFreqSpinBox; + QSpinBox *upperFreqSpinBox; + QSpinBox *timeSpinBox; + //QSpinBox *repetitionSpinBox; + QSpinBox *avgSpinBox; + QSpinBox *filterLowerFreqSpinBox; + QSpinBox *filterUpperFreqSpinBox; + + AeroButton *chirpModeBtn; + AeroButton *loadFileBtn; + AeroButton *rcveBtn; + AeroButton *pauseBtn; + AeroButton *playBtn; + AeroButton *settingsBtn; + AeroButton *playChirpBtn; + AeroButton *avgBtn; + AeroButton *chirpLSBBtn; + AeroButton *chirpUSBBtn; + AeroButton *chirpForwardBtn; + AeroButton *chirpBackwardBtn; + AeroButton *showChirpFFTBtn; + + QIcon pauseIcon; + QIcon playIcon; + QIcon settingsIcon; + + QRect m_spectrumRect; + QImage m_sourceImage; + QImage m_destinationImage; + QImage m_resultImage; + + QImage* createSpectrumImage(const QRect& rect); + + //QList m_specImages; + + struct Stripe { + Stripe() : value(0.0), clipped(false) { } + qreal value; + bool clipped; + }; + + QVector m_stripes; + int m_stripeSelected; + int m_timerId; + qreal m_lowFreq; + qreal m_highFreq; + FrequencySpectrum m_spectrum; + + QList m_spectrumList; + QList > m_stripeList; + + int stripeIndex(qreal frequency) const; + QPair stripeRange(int stripeIndex) const; + void stripeFreqRange(); + + + qreal m_scale; + qreal m_timeScale; + int m_timeScaleMax; + int m_fontHeight; + int m_maxFontWidth; + int m_graphWidth; + int m_graphHeight; + int m_graphScaleX; + + qint64 m_chirpPosition; + qint64 m_chirpLength; + + QVector m_freq; + + qint64 m_chirpBufferPosition; + qint64 m_chirpBufferLength; + QByteArray m_chirpBuffer; + + bool m_antialiased; + bool m_mouseOver; + bool m_showChirpFFT; + bool m_chirpUSB; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_btnSpacing; + int m_cnt; + +private slots: + /*void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state);*/ + + void initChirpDecoder(); + void showFileDialog(); + void setReceiver(); + void suspend(); + void startPlayback(); + void showSettingsDialog(); + void showChirpFFT(); + void switchSideband(); + + void setChirpLowerFrequency(QObject* sender, int lo); + void setChirpUpperFrequency(QObject* sender, int lo); + void setChirpAmplitude(QObject* sender, qreal amp); + void setChirpBufferDurationUs(QObject* sender, qint64 value); + void setChirpRepetitionTimes(QObject* sender, int value); + void setFilterLowerFrequency(QObject* sender, int lo); + void setFilterUpperFrequency(QObject* sender, int lo); + + //void chirpBufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + void chirpSpectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); + void chirpSpectrumListChanged(const QList &spectrumList); + void resetSpectrum(); + void updateStripes(); + void stripeResize(int scale); + //void updateChirpSpectrum(); + //void selectBar(int index); + + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString ); + void initChirpDecoderEvent(QObject *sender, bool value); + void loadFileEvent(QObject *sender, const QString &fileName); + void suspendSignal(QObject *sender); + void startPlaybackSignal(QObject *sender); + void showSettingsDialogSignal(QObject *sender); +}; + +#endif // _CUSDR_CHIRP_WIDGET_H diff --git a/Source/src/cusdr_colorsWidget.cpp b/Source/src/cusdr_colorsWidget.cpp new file mode 100644 index 0000000..348a145 --- /dev/null +++ b/Source/src/cusdr_colorsWidget.cpp @@ -0,0 +1,711 @@ +/** +* @file cusdr_colorsWidget.cpp +* @brief OpenGL color options widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-08-19 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_COLOROPTIONS_WIDGET + +// use: COLOROPTIONS_DEBUG + +#include +#include +#include +#include +#include +#include +#include + +#include "cusdr_colorsWidget.h" + +#define btn_height 15 +#define btn_width 70 +#define btn_widths 38 +#define btn_width2 52 +#define btn_width3 60 + +ColorOptionsWidget::ColorOptionsWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(set->getDataEngineState()) + //, m_panadapterMode(set->getPanadapterMode()) + //, m_waterColorScheme(set->getWaterfallColorScheme()) + , m_colorTriangle(new QtColorTriangle(this)) + , m_antialiased(true) + , m_mouseOver(false) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) + , m_btnSpacing(5) + , m_currentReceiver(set->getCurrentReceiver()) + , m_btnChooserHit(0) + , m_sampleRate(set->getSampleRate()) +{ + //setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 0, 4, 0); + setMouseTracking(true); + + m_rxDataList = set->getReceiverDataList(); + + createColorChooserWidget(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setMargin(0); + hbox1->addStretch(); + hbox1->addWidget(m_colorChooserWidget); + hbox1->addStretch(); + + mainLayout->addLayout(hbox1); + mainLayout->addStretch(); + setLayout(mainLayout); + + m_panadapterColors = set->getPanadapterColors(); + m_oldPanadapterColors = m_panadapterColors; + + setupConnections(); +} + +ColorOptionsWidget::~ColorOptionsWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize ColorOptionsWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize ColorOptionsWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void ColorOptionsWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode)), + this, + SLOT(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); + + CHECKED_CONNECT( + m_colorTriangle, + SIGNAL(colorChanged(QColor)), + this, + SLOT(triangleColorChanged(QColor))); +} + +void ColorOptionsWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + bool change = false; + + if (m_hwInterface != hwmode) { + + m_hwInterface = hwmode; + //hwInterfaceChanged(); + change = true; + } + + if (m_serverMode != mode) { + + m_serverMode = mode; + change = true; + } + + if (m_dataEngineState != state) { + + m_dataEngineState = state; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + + } + else { + + + } + change = true; + } + if (!change) return; + + update(); +} + +void ColorOptionsWidget::graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode) +{ + Q_UNUSED (sender) + Q_UNUSED (rx) + Q_UNUSED (panMode) + Q_UNUSED (waterfallColorMode) + + bool change = false; + + /*if (m_panadapterMode != panMode) { + + m_panadapterMode = panMode; + change = true; + } + + if (m_waterColorScheme != waterColorScheme) { + + m_waterColorScheme = waterColorScheme; + change = true; + }*/ + + if (!change) return; + + update(); +} + +void ColorOptionsWidget::createColorChooserWidget() { + + QColor col = set->getPanadapterColors().panCenterLineColor; + + m_setPanBackground = new AeroButton("Background", this); + m_setPanBackground->setRoundness(0); + m_setPanBackground->setFixedSize (btn_width3, btn_height); + m_setPanBackground->setStyleSheet(set->getMiniButtonStyle()); + m_setPanBackground->setColorOn(col); + m_changeColorBtnList.append(m_setPanBackground); + + CHECKED_CONNECT( + m_setPanBackground, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().waterfallColor; + + m_setWaterfall = new AeroButton("Waterfall", this); + m_setWaterfall->setRoundness(0); + m_setWaterfall->setFixedSize (btn_width3, btn_height); + m_setWaterfall->setStyleSheet(set->getMiniButtonStyle()); + m_setWaterfall->setColorOn(col); + m_changeColorBtnList.append(m_setWaterfall); + + CHECKED_CONNECT( + m_setWaterfall, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().panLineColor; + + m_setPanLine = new AeroButton("Pan Line", this); + m_setPanLine->setRoundness(0); + m_setPanLine->setFixedSize (btn_width3, btn_height); + m_setPanLine->setStyleSheet(set->getMiniButtonStyle()); + m_setPanLine->setColorOn(col); + m_changeColorBtnList.append(m_setPanLine); + + CHECKED_CONNECT( + m_setPanLine, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().panLineFilledColor; + + m_setPanLineFilling = new AeroButton("Pan Filling", this); + m_setPanLineFilling->setRoundness(0); + m_setPanLineFilling->setFixedSize (btn_width3, btn_height); + m_setPanLineFilling->setStyleSheet(set->getMiniButtonStyle()); + m_setPanLineFilling->setColorOn(col); + m_changeColorBtnList.append(m_setPanLineFilling); + + CHECKED_CONNECT( + m_setPanLineFilling, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().panSolidTopColor; + + m_setPanSolidTop = new AeroButton("Solid T", this); + m_setPanSolidTop->setRoundness(0); + m_setPanSolidTop->setFixedSize (btn_width3, btn_height); + m_setPanSolidTop->setStyleSheet(set->getMiniButtonStyle()); + m_setPanSolidTop->setColorOn(col); + m_changeColorBtnList.append(m_setPanSolidTop); + + CHECKED_CONNECT( + m_setPanSolidTop, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().panSolidBottomColor; + + m_setPanSolidBottom = new AeroButton("Solid B", this); + m_setPanSolidBottom->setRoundness(0); + m_setPanSolidBottom->setFixedSize (btn_width3, btn_height); + m_setPanSolidBottom->setStyleSheet(set->getMiniButtonStyle()); + m_setPanSolidBottom->setColorOn(col); + m_changeColorBtnList.append(m_setPanSolidBottom); + + CHECKED_CONNECT( + m_setPanSolidBottom, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().wideBandLineColor; + + m_setWideBandLine = new AeroButton("Wideband", this); + m_setWideBandLine->setRoundness(0); + m_setWideBandLine->setFixedSize (btn_width3, btn_height); + m_setWideBandLine->setStyleSheet(set->getMiniButtonStyle()); + m_setWideBandLine->setColorOn(col); + m_changeColorBtnList.append(m_setWideBandLine); + + CHECKED_CONNECT( + m_setWideBandLine, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().wideBandFilledColor; + + m_setWideBandFilling = new AeroButton("WB Filling", this); + m_setWideBandFilling->setRoundness(0); + m_setWideBandFilling->setFixedSize (btn_width3, btn_height); + m_setWideBandFilling->setStyleSheet(set->getMiniButtonStyle()); + m_setWideBandFilling->setColorOn(col); + m_changeColorBtnList.append(m_setWideBandFilling); + + CHECKED_CONNECT( + m_setWideBandFilling, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().wideBandSolidTopColor; + + m_setWideBandSolidTop = new AeroButton("WB Solid T", this); + m_setWideBandSolidTop->setRoundness(0); + m_setWideBandSolidTop->setFixedSize (btn_width3, btn_height); + m_setWideBandSolidTop->setStyleSheet(set->getMiniButtonStyle()); + m_setWideBandSolidTop->setColorOn(col); + m_changeColorBtnList.append(m_setWideBandSolidTop); + + CHECKED_CONNECT( + m_setWideBandSolidTop, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().wideBandSolidBottomColor; + + m_setWideBandSolidBottom = new AeroButton("WB Solid B", this); + m_setWideBandSolidBottom->setRoundness(0); + m_setWideBandSolidBottom->setFixedSize (btn_width3, btn_height); + m_setWideBandSolidBottom->setStyleSheet(set->getMiniButtonStyle()); + m_setWideBandSolidBottom->setColorOn(col); + m_changeColorBtnList.append(m_setWideBandSolidBottom); + + CHECKED_CONNECT( + m_setWideBandSolidBottom, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().wideBandSolidBottomColor; + + m_setDistanceLine = new AeroButton("Dist. Line", this); + m_setDistanceLine->setRoundness(0); + m_setDistanceLine->setFixedSize (btn_width3, btn_height); + m_setDistanceLine->setStyleSheet(set->getMiniButtonStyle()); + m_setDistanceLine->setColorOn(col); + m_changeColorBtnList.append(m_setDistanceLine); + + CHECKED_CONNECT( + m_setDistanceLine, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().wideBandSolidBottomColor; + + m_setDistanceLineFilling = new AeroButton("Dist. Filling", this); + m_setDistanceLineFilling->setRoundness(0); + m_setDistanceLineFilling->setFixedSize (btn_width3, btn_height); + m_setDistanceLineFilling->setStyleSheet(set->getMiniButtonStyle()); + m_setDistanceLineFilling->setColorOn(col); + m_changeColorBtnList.append(m_setDistanceLineFilling); + + CHECKED_CONNECT( + m_setDistanceLineFilling, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().panCenterLineColor; + + m_setPanCenterLine = new AeroButton("Center", this); + m_setPanCenterLine->setRoundness(0); + m_setPanCenterLine->setFixedSize (btn_width3, btn_height); + m_setPanCenterLine->setStyleSheet(set->getMiniButtonStyle()); + m_setPanCenterLine->setColorOn(col); + m_changeColorBtnList.append(m_setPanCenterLine); + + CHECKED_CONNECT( + m_setPanCenterLine, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + col = set->getPanadapterColors().gridLineColor; + + m_setGridLine = new AeroButton("Grid", this); + m_setGridLine->setRoundness(0); + m_setGridLine->setFixedSize (btn_width3, btn_height); + m_setGridLine->setStyleSheet(set->getMiniButtonStyle()); + m_setGridLine->setColorOn(col); + m_changeColorBtnList.append(m_setGridLine); + + CHECKED_CONNECT( + m_setGridLine, + SIGNAL(clicked()), + this, + SLOT(colorChooserChanged())); + + + m_setPanBackground->setBtnState(AeroButton::OFF); + m_setWaterfall->setBtnState(AeroButton::OFF); + m_setPanLine->setBtnState(AeroButton::OFF); + m_setPanLineFilling->setBtnState(AeroButton::OFF); + m_setPanSolidTop->setBtnState(AeroButton::OFF); + m_setPanSolidBottom->setBtnState(AeroButton::OFF); + m_setWideBandLine->setBtnState(AeroButton::OFF); + m_setWideBandFilling->setBtnState(AeroButton::OFF); + m_setWideBandSolidTop->setBtnState(AeroButton::OFF); + m_setWideBandSolidBottom->setBtnState(AeroButton::OFF); + m_setDistanceLine->setBtnState(AeroButton::OFF); + m_setDistanceLineFilling->setBtnState(AeroButton::OFF); + m_setPanCenterLine->setBtnState(AeroButton::OFF); + m_setGridLine->setBtnState(AeroButton::OFF); + + m_resetBtn = new AeroButton("Reset", this); + m_resetBtn->setRoundness(0); + //m_resetBtn->setFixedSize (btn_widths, btn_height); + m_resetBtn->setFixedSize (btn_width3, btn_height); + + CHECKED_CONNECT( + m_resetBtn, + SIGNAL(clicked()), + this, + SLOT(resetColors())); + + m_okBtn = new AeroButton("OK", this); + m_okBtn->setRoundness(0); + //m_okBtn->setFixedSize (btn_widths, btn_height); + m_okBtn->setFixedSize (btn_width3, btn_height); + + CHECKED_CONNECT( + m_okBtn, + SIGNAL(clicked()), + this, + SLOT(acceptColors())); + + + QGridLayout *grid1 = new QGridLayout; + grid1->setSpacing(1); + grid1->setHorizontalSpacing(1); + grid1->setContentsMargins(0, 0, 0, 0); + grid1->addWidget(m_colorTriangle, 0, 3, 5, 3); + grid1->addWidget(m_setPanBackground, 0, 0); + grid1->addWidget(m_setWaterfall, 0, 1); + grid1->addWidget(m_setPanLine, 1, 0); + grid1->addWidget(m_setPanLineFilling, 1, 1); + grid1->addWidget(m_setPanSolidTop, 2, 0); + grid1->addWidget(m_setPanSolidBottom, 2, 1); + grid1->addWidget(m_setWideBandLine, 3, 0); + grid1->addWidget(m_setWideBandFilling, 3, 1); + grid1->addWidget(m_setWideBandSolidTop, 4, 0); + grid1->addWidget(m_setWideBandSolidBottom, 4, 1); + grid1->addWidget(m_setDistanceLine, 5, 0); + grid1->addWidget(m_setDistanceLineFilling, 5, 1); + grid1->addWidget(m_setPanCenterLine, 6, 0); + grid1->addWidget(m_setGridLine, 6, 1); + grid1->addWidget(m_resetBtn, 8, 0); + grid1->addWidget(m_okBtn, 8, 1); + //grid1->addWidget(m_resetBtn, 7, 3); + //grid1->addWidget(m_okBtn, 7, 4); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(m_resetBtn); + hbox1->addWidget(m_okBtn); + + QVBoxLayout *vbox1 = new QVBoxLayout; + vbox1->setSpacing(4); + //vbox1->addStretch(); + vbox1->addWidget(m_colorTriangle); + vbox1->addLayout(hbox1); + + QHBoxLayout *hbox = new QHBoxLayout; + hbox->setSpacing(4); + hbox->addSpacing(6); + hbox->addLayout(grid1); + //hbox->addLayout(vbox1); + + m_colorChooserWidget = new QGroupBox(tr("Color Chooser"), this); + m_colorChooserWidget->setMinimumWidth(m_minimumGroupBoxWidth); + m_colorChooserWidget->setLayout(hbox); + m_colorChooserWidget->setStyleSheet(set->getWidgetStyle()); + m_colorChooserWidget->setFont(QFont("Arial", 8)); +} + +void ColorOptionsWidget::colorChooserChanged() { + + AeroButton *button = qobject_cast(sender()); + m_btnChooserHit = m_changeColorBtnList.indexOf(button); + + foreach(AeroButton *btn, m_changeColorBtnList) { + + btn->setBtnState(AeroButton::OFF); + //btn->setColor(QColor(90, 90, 90)); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (m_btnChooserHit) { + + case 0: + m_colorTriangle->setColor(set->getPanadapterColors().panBackgroundColor); + break; + + case 1: + m_colorTriangle->setColor(set->getPanadapterColors().waterfallColor); + break; + + case 2: + m_colorTriangle->setColor(set->getPanadapterColors().panLineColor); + break; + + case 3: + m_colorTriangle->setColor(set->getPanadapterColors().panLineFilledColor); + break; + + case 4: + m_colorTriangle->setColor(set->getPanadapterColors().panSolidTopColor); + break; + + case 5: + m_colorTriangle->setColor(set->getPanadapterColors().panSolidBottomColor); + break; + + case 6: + m_colorTriangle->setColor(set->getPanadapterColors().wideBandLineColor); + break; + + case 7: + m_colorTriangle->setColor(set->getPanadapterColors().wideBandFilledColor); + break; + + case 8: + m_colorTriangle->setColor(set->getPanadapterColors().wideBandSolidTopColor); + break; + + case 9: + m_colorTriangle->setColor(set->getPanadapterColors().wideBandSolidBottomColor); + break; + + case 10: + m_colorTriangle->setColor(set->getPanadapterColors().distanceLineColor); + break; + + case 11: + m_colorTriangle->setColor(set->getPanadapterColors().distanceLineFilledColor); + break; + + case 12: + m_colorTriangle->setColor(set->getPanadapterColors().panCenterLineColor); + break; + + case 13: + m_colorTriangle->setColor(set->getPanadapterColors().gridLineColor); + break; + } +} + +void ColorOptionsWidget::resetColors() { + + m_panadapterColors = m_oldPanadapterColors; + + foreach(AeroButton *btn, m_changeColorBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + set->setPanadapterColors(m_panadapterColors); +} + +void ColorOptionsWidget::acceptColors() { + + m_oldPanadapterColors = m_panadapterColors; + set->setPanadapterColors(m_panadapterColors); +} + +void ColorOptionsWidget::triangleColorChanged(QColor color) { + + m_currentColor = color; + m_changeColorBtnList.at(m_btnChooserHit)->setColorOn(color); + m_changeColorBtnList.at(m_btnChooserHit)->update(); + + switch (m_btnChooserHit) { + + case 0: + m_panadapterColors.panBackgroundColor = color; + break; + + case 1: + m_panadapterColors.waterfallColor = color; + break; + + case 2: + m_panadapterColors.panLineColor = color; + break; + + case 3: + m_panadapterColors.panLineFilledColor = color; + break; + + case 4: + m_panadapterColors.panSolidTopColor = color; + break; + + case 5: + m_panadapterColors.panSolidBottomColor = color; + break; + + case 6: + m_panadapterColors.wideBandLineColor = color; + break; + + case 7: + m_panadapterColors.wideBandFilledColor = color; + break; + + case 8: + m_panadapterColors.wideBandSolidTopColor = color; + break; + + case 9: + m_panadapterColors.wideBandSolidBottomColor = color; + break; + + case 10: + m_panadapterColors.distanceLineColor = color; + break; + + case 11: + m_panadapterColors.distanceLineFilledColor = color; + break; + + case 12: + m_panadapterColors.panCenterLineColor = color; + break; + + case 13: + m_panadapterColors.gridLineColor = color; + break; + } + set->setPanadapterColors(m_panadapterColors); +} + +void ColorOptionsWidget::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; +} + +void ColorOptionsWidget::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + if (m_currentReceiver == rx) return; + m_currentReceiver = rx; +} diff --git a/Source/src/cusdr_colorsWidget.h b/Source/src/cusdr_colorsWidget.h new file mode 100644 index 0000000..331a3c7 --- /dev/null +++ b/Source/src/cusdr_colorsWidget.h @@ -0,0 +1,141 @@ +/** +* @file cusdr_colorsWidget.h +* @brief OpenGL color options widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-08-19 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_COLOR_OPTIONS_WIDGET_H +#define _CUSDR_COLOR_OPTIONS_WIDGET_H + +//#include +//#include +//#include +#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "Util/cusdr_colorTriangle.h" +#include "cusdr_settings.h" + +#ifdef LOG_COLOROPTIONS_WIDGET +# define COLOROPTIONS_DEBUG qDebug().nospace() << "ColorWidget::\t" +#else +# define COLOROPTIONS_DEBUG nullDebug() +#endif + + +class ColorOptionsWidget : public QWidget { + + Q_OBJECT + +public: + ColorOptionsWidget(QWidget *parent = 0); + ~ColorOptionsWidget(); + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + +private: + Settings *set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QtColorTriangle *m_colorTriangle; + QList m_rxDataList; + + QString m_menu_style; + + QColor m_currentColor; + QColor m_newColor; + + QGroupBox *m_colorChooserWidget; + + AeroButton *m_resetBtn; + AeroButton *m_okBtn; + AeroButton *m_setPanBackground; + AeroButton *m_setPanCenterLine; + AeroButton *m_setPanLine; + AeroButton *m_setPanLineFilling; + AeroButton *m_setPanSolidTop; + AeroButton *m_setPanSolidBottom; + AeroButton *m_setWaterfall; + AeroButton *m_setWideBandLine; + AeroButton *m_setWideBandFilling; + AeroButton *m_setWideBandSolidTop; + AeroButton *m_setWideBandSolidBottom; + AeroButton *m_setDistanceLine; + AeroButton *m_setDistanceLineFilling; + AeroButton *m_setGridLine; + + QList m_changeColorBtnList; + + TPanadapterColors m_panadapterColors; + TPanadapterColors m_oldPanadapterColors; + + int m_fontHeight; + int m_maxFontWidth; + + bool m_antialiased; + bool m_mouseOver; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_btnSpacing; + + int m_currentReceiver; + int m_btnChooserHit; + int m_sampleRate; + + void setupConnections(); + void createColorChooserWidget(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setCurrentReceiver(QObject *sender, int rx); + void colorChooserChanged(); + void resetColors(); + void acceptColors(); + void triangleColorChanged(QColor color); + void sampleRateChanged(QObject *sender, int value); + +signals: + void colorChanged(const QColor &color); +}; + +#endif // _CUSDR_COLOR_OPTIONS_WIDGET_H diff --git a/Source/src/cusdr_displayTabWidget.cpp b/Source/src/cusdr_displayTabWidget.cpp new file mode 100644 index 0000000..c60d033 --- /dev/null +++ b/Source/src/cusdr_displayTabWidget.cpp @@ -0,0 +1,198 @@ +/** +* @file cusdr_displayTabWidget.cpp +* @brief Display settings tab widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-10-30 +*/ + +/* + * + * Copyright 2010 - 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#include "cusdr_displayTabWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +DisplayTabWidget::DisplayTabWidget(QWidget *parent) + : QTabWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + setStyleSheet(set->getTabWidgetStyle()); + setContentsMargins(4, 4, 4, 0); + setMouseTracking(true); + + m_displayWidget = new DisplayOptionsWidget(this); + m_colorWidget = new ColorOptionsWidget(this); + + this->addTab(m_displayWidget, " Display "); + this->addTab(m_colorWidget, " Colors "); + + setTabEnabled(1, true); + setTabEnabled(2, true); + + setupConnections(); +} + +DisplayTabWidget::~DisplayTabWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize DisplayTabWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize DisplayTabWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void DisplayTabWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(alexPresenceChanged(bool)), + this, + SLOT(setAlexPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(penelopePresenceChanged(bool)), + this, + SLOT(setPennyPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(pennyLanePresenceChanged(bool)), + this, + SLOT(setPennyPresence(bool))); +} + +void DisplayTabWidget::systemStateChanged( + QObject *sender, /*!<[in] the sender of the signal. */ + QSDR::_Error err, /*!<[in] error state. */ + QSDR::_HWInterfaceMode hwmode, /*!<[in] HPSDR interface (Metis, Hermes, none). */ + QSDR::_ServerMode mode, /*!<[in] server mode. */ + QSDR::_DataEngineState state /*!<[in] data engine state. */ +) { + Q_UNUSED (sender) + Q_UNUSED (err) + + //if (sender == this) return; + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_hwInterface == QSDR::Hermes) + setTabEnabled(2, true); + else + setTabEnabled(2, false); + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; +} + +void DisplayTabWidget::setPennyPresence(bool value) { + + //setTabEnabled(1, value); + setTabEnabled(2, value); + //setTabEnabled(3, value); +} + +void DisplayTabWidget::setAlexPresence(bool value) { + + setTabEnabled(3, value); +} + +void DisplayTabWidget::addNICChangedConnection() { + + //m_networkWidget->addNICChangedConnection(); +} + +void DisplayTabWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void DisplayTabWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +void DisplayTabWidget::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void DisplayTabWidget::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void DisplayTabWidget::mouseMoveEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void DisplayTabWidget::mousePressEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void DisplayTabWidget::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + + diff --git a/Source/src/cusdr_displayTabWidget.h b/Source/src/cusdr_displayTabWidget.h new file mode 100644 index 0000000..6573a87 --- /dev/null +++ b/Source/src/cusdr_displayTabWidget.h @@ -0,0 +1,106 @@ +/** +* @file cusdr_displayTabWidget.h +* @brief Display settings tab widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-10-30 +*/ + +/* + * + * Copyright 2010 - 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_DISPLAY_TABWIDGET_H +#define _CUSDR_DISPLAY_TABWIDGET_H + +//#include +//#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_displayWidget.h" +#include "cusdr_colorsWidget.h" + +//#include "cusdr_networkWidget.h" +//#include "cusdr_transmitTabWidget.h" +//#include "cusdr_alexTabWidget.h" +//#include "cusdr_extCtrlWidget.h" + + +class DisplayTabWidget : public QTabWidget { + + Q_OBJECT + +public: + DisplayTabWidget(QWidget *parent = 0); + ~DisplayTabWidget(); + + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + void addNICChangedConnection(); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + Settings *set; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + DisplayOptionsWidget *m_displayWidget; + ColorOptionsWidget *m_colorWidget; + + QString m_message; + + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setAlexPresence(bool value); + void setPennyPresence(bool value); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString message); +}; + +#endif // _CUSDR_DISPLAY_TABWIDGET_H diff --git a/Source/src/cusdr_displayWidget.cpp b/Source/src/cusdr_displayWidget.cpp new file mode 100644 index 0000000..901ae69 --- /dev/null +++ b/Source/src/cusdr_displayWidget.cpp @@ -0,0 +1,1056 @@ +/** +* @file cusdr_displayWidget.cpp +* @brief OpenGL display options widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-08-19 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_DISPLAYOPTIONS_WIDGET + +// use: DISPLAYOPTIONS_DEBUG + +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_displayWidget.h" + +#define btn_height 15 +#define btn_width 70 +#define btn_widths 38 +#define btn_width2 52 +#define btn_width3 60 + +DisplayOptionsWidget::DisplayOptionsWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(set->getDataEngineState()) + , m_antialiased(true) + , m_mouseOver(false) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) + , m_btnSpacing(5) + , m_currentReceiver(set->getCurrentReceiver()) + , m_btnChooserHit(0) + , m_framesPerSecond(set->getFramesPerSecond(m_currentReceiver)) + , m_sampleRate(set->getSampleRate()) + , m_sMeterHoldTime(set->getSMeterHoldTime()) +{ + //setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 0, 4, 0); + setMouseTracking(true); + + m_rxDataList = set->getReceiverDataList(); + m_widebandOptions = set->getWidebandOptions(); + m_panadapterMode = set->getPanadapterMode(m_currentReceiver); + m_waterColorMode = set->getWaterfallColorMode(m_currentReceiver); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + createFPSGroupBox(); + createPanSpectrumOptions(); + createWidebandPanOptions(); + createWaterfallSpectrumOptions(); + createSMeterOptions(); + createCallSignEditor(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setMargin(0); + hbox1->addStretch(); + hbox1->addWidget(m_fpsGroupBox); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addStretch(); + hbox2->addWidget(m_panSpectrumOptions); + + QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(0); + hbox3->setMargin(0); + hbox3->addStretch(); + hbox3->addWidget(m_widebandPanOptions); + + QHBoxLayout *hbox4 = new QHBoxLayout; + hbox4->setSpacing(0); + hbox4->setMargin(0); + hbox4->addStretch(); + hbox4->addWidget(m_waterfallSpectrumOptions); + + QHBoxLayout *hbox5 = new QHBoxLayout; + hbox5->setSpacing(0); + hbox5->setMargin(0); + hbox5->addStretch(); + hbox5->addWidget(m_sMeterOptions); + + QHBoxLayout *hbox6 = new QHBoxLayout; + hbox6->setSpacing(0); + hbox6->setMargin(0); + hbox6->addStretch(); + hbox6->addWidget(m_callSignEditor); + hbox6->addStretch(); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addLayout(hbox4); + mainLayout->addLayout(hbox5); + mainLayout->addLayout(hbox6); + mainLayout->addStretch(); + setLayout(mainLayout); + + setupConnections(); +} + +DisplayOptionsWidget::~DisplayOptionsWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize DisplayOptionsWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize DisplayOptionsWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void DisplayOptionsWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode)), + this, + SLOT(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(sampleRateChanged(QObject *, int)), + this, + SLOT(sampleRateChanged(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(framesPerSecondChanged(QObject*, int, int)), + this, + SLOT(setFramesPerSecond(QObject*, int, int))); +} + +void DisplayOptionsWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + bool change = false; + + if (m_hwInterface != hwmode) { + + m_hwInterface = hwmode; + //hwInterfaceChanged(); + change = true; + } + + if (m_serverMode != mode) { + + m_serverMode = mode; + change = true; + } + + if (m_dataEngineState != state) { + + m_dataEngineState = state; + + if (m_dataEngineState == QSDR::DataEngineUp) { + + + } + else { + + + } + change = true; + } + if (!change) return; + + update(); +} + +void DisplayOptionsWidget::graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterMode) +{ + Q_UNUSED (sender) + + bool change = false; + + if (m_panadapterMode != panMode) { + + //m_panadapterMode = panMode; + if (m_currentReceiver == rx) + setPanadapterMode(m_currentReceiver); + + change = true; + } + + if (m_waterColorMode != waterMode) { + + //m_waterColorMode = waterMode; + if (m_currentReceiver == rx) + setWaterfallColorMode(m_currentReceiver); + change = true; + } + + if (!change) return; + + update(); +} + +void DisplayOptionsWidget::createFPSGroupBox() { + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect(" 200 ").width(); + + m_fpsSlider = new QSlider(Qt::Horizontal, this); + m_fpsSlider->setTickPosition(QSlider::NoTicks); + m_fpsSlider->setFixedSize(190, 12); + m_fpsSlider->setSingleStep(1); + m_fpsSlider->setRange(1, 80); + m_fpsSlider->setValue(m_framesPerSecond); + m_fpsSlider->setStyleSheet(set->getVolSliderStyle()); + + CHECKED_CONNECT(m_fpsSlider, SIGNAL(valueChanged(int)), this, SLOT(fpsValueChanged(int))); + + QString str = "%1 "; + m_fpsLevelLabel = new QLabel(str.arg(m_framesPerSecond, 2, 10, QLatin1Char(' ')), this); + m_fpsLevelLabel->setFont(m_fonts.smallFont); + m_fpsLevelLabel->setFixedSize(fontMaxWidth, 12); + m_fpsLevelLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_fpsLevelLabel->setStyleSheet(set->getSliderLabelStyle()); + + QHBoxLayout *hbox = new QHBoxLayout; + hbox->setSpacing(0); + hbox->setMargin(0); + hbox->addStretch(); + hbox->addWidget(m_fpsSlider); + hbox->addWidget(m_fpsLevelLabel); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(6); + vbox->addSpacing(6); + vbox->addLayout(hbox); + + m_fpsGroupBox = new QGroupBox(tr("Frames per Second"), this); + m_fpsGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + m_fpsGroupBox->setLayout(vbox); + m_fpsGroupBox->setStyleSheet(set->getWidgetStyle()); + m_fpsGroupBox->setFont(QFont("Arial", 8)); +} + +void DisplayOptionsWidget::createPanSpectrumOptions() { + + m_PanLineBtn = new AeroButton("Line", this); + m_PanLineBtn->setRoundness(0); + m_PanLineBtn->setFixedSize(btn_width, btn_height); + m_panadapterBtnList.append(m_PanLineBtn); + + CHECKED_CONNECT( + m_PanLineBtn, + SIGNAL(clicked()), + this, + SLOT(panModeChanged())); + + m_PanFilledLineBtn = new AeroButton("Filled Line", this); + m_PanFilledLineBtn->setRoundness(0); + m_PanFilledLineBtn->setFixedSize(btn_width, btn_height); + m_panadapterBtnList.append(m_PanFilledLineBtn); + + CHECKED_CONNECT( + m_PanFilledLineBtn, + SIGNAL(clicked()), + this, + SLOT(panModeChanged())); + + m_PanSolidBtn = new AeroButton("Solid", this); + m_PanSolidBtn->setRoundness(0); + m_PanSolidBtn->setFixedSize (btn_width, btn_height); + m_panadapterBtnList.append(m_PanSolidBtn); + + CHECKED_CONNECT( + m_PanSolidBtn, + SIGNAL(clicked()), + this, + SLOT(panModeChanged())); + + switch (m_panadapterMode) { + + case (PanGraphicsMode) Line: + + m_PanLineBtn->setBtnState(AeroButton::ON); + m_PanFilledLineBtn->setBtnState(AeroButton::OFF); + m_PanSolidBtn->setBtnState(AeroButton::OFF); + break; + + case (PanGraphicsMode) FilledLine: + + m_PanFilledLineBtn->setBtnState(AeroButton::ON); + m_PanLineBtn->setBtnState(AeroButton::OFF); + m_PanSolidBtn->setBtnState(AeroButton::OFF); + break; + + case (PanGraphicsMode) Solid: + + m_PanSolidBtn->setBtnState(AeroButton::ON); + m_PanLineBtn->setBtnState(AeroButton::OFF); + m_PanFilledLineBtn->setBtnState(AeroButton::OFF); + break; + } + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect(" 200 ").width(); + + m_avgValue = set->getSpectrumAveragingCnt(m_currentReceiver); + + m_avgSlider = new QSlider(Qt::Horizontal, this); + m_avgSlider->setTickPosition(QSlider::NoTicks); + m_avgSlider->setFixedSize(130, 12); + m_avgSlider->setSingleStep(1); + m_avgSlider->setRange(1, 100); + m_avgSlider->setValue(m_avgValue); + m_avgSlider->setStyleSheet(set->getVolSliderStyle()); + + CHECKED_CONNECT(m_avgSlider, SIGNAL(valueChanged(int)), this, SLOT(averagingFilterCntChanged(int))); + + QString str = "%1 "; + m_avgLevelLabel = new QLabel(str.arg(m_avgValue, 2, 10, QLatin1Char(' ')), this); + m_avgLevelLabel->setFont(m_fonts.smallFont); + m_avgLevelLabel->setFixedSize(fontMaxWidth, 12); + m_avgLevelLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_avgLevelLabel->setStyleSheet(set->getSliderLabelStyle()); + + m_avgLabel = new QLabel("Avg Filter:", this); + m_avgLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_avgLabel->setStyleSheet(set->getLabelStyle()); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(m_PanLineBtn); + hbox1->addWidget(m_PanFilledLineBtn); + hbox1->addWidget(m_PanSolidBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addWidget(m_avgLabel); + hbox2->addStretch(); + hbox2->addWidget(m_avgSlider); + hbox2->addWidget(m_avgLevelLabel); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(6); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + m_panSpectrumOptions = new QGroupBox(tr("Panadapter Spectrum"), this); + m_panSpectrumOptions->setMinimumWidth(m_minimumGroupBoxWidth); + m_panSpectrumOptions->setLayout(vbox); + m_panSpectrumOptions->setStyleSheet(set->getWidgetStyle()); + m_panSpectrumOptions->setFont(QFont("Arial", 8)); +} + +void DisplayOptionsWidget::createWidebandPanOptions() { + + m_wbPanLineBtn = new AeroButton("Line", this); + m_wbPanLineBtn->setRoundness(0); + m_wbPanLineBtn->setFixedSize(btn_width, btn_height); + m_wbpanadapterBtnList.append(m_wbPanLineBtn); + + CHECKED_CONNECT( + m_wbPanLineBtn, + SIGNAL(clicked()), + this, + SLOT(wbPanModeChanged())); + + m_wbPanFilledLineBtn = new AeroButton("Filled Line", this); + m_wbPanFilledLineBtn->setRoundness(0); + m_wbPanFilledLineBtn->setFixedSize(btn_width, btn_height); + m_wbpanadapterBtnList.append(m_wbPanFilledLineBtn); + + CHECKED_CONNECT( + m_wbPanFilledLineBtn, + SIGNAL(clicked()), + this, + SLOT(wbPanModeChanged())); + + m_wbPanSolidBtn = new AeroButton("Solid", this); + m_wbPanSolidBtn->setRoundness(0); + m_wbPanSolidBtn->setFixedSize (btn_width, btn_height); + m_wbpanadapterBtnList.append(m_wbPanSolidBtn); + + CHECKED_CONNECT( + m_wbPanSolidBtn, + SIGNAL(clicked()), + this, + SLOT(wbPanModeChanged())); + + switch (m_widebandOptions.panMode) { + + case (PanGraphicsMode) Line: + + m_wbPanLineBtn->setBtnState(AeroButton::ON); + m_wbPanFilledLineBtn->setBtnState(AeroButton::OFF); + m_wbPanSolidBtn->setBtnState(AeroButton::OFF); + break; + + case (PanGraphicsMode) FilledLine: + + m_wbPanFilledLineBtn->setBtnState(AeroButton::ON); + m_wbPanLineBtn->setBtnState(AeroButton::OFF); + m_wbPanSolidBtn->setBtnState(AeroButton::OFF); + break; + + case (PanGraphicsMode) Solid: + + m_wbPanSolidBtn->setBtnState(AeroButton::ON); + m_wbPanLineBtn->setBtnState(AeroButton::OFF); + m_wbPanFilledLineBtn->setBtnState(AeroButton::OFF); + break; + } + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect(" 200 ").width(); + + m_wbAvgValue = m_widebandOptions.averagingCnt; + + m_wbAvgSlider = new QSlider(Qt::Horizontal, this); + m_wbAvgSlider->setTickPosition(QSlider::NoTicks); + m_wbAvgSlider->setFixedSize(130, 12); + m_wbAvgSlider->setSingleStep(1); + m_wbAvgSlider->setRange(1, 100); + m_wbAvgSlider->setValue(m_wbAvgValue); + m_wbAvgSlider->setStyleSheet(set->getVolSliderStyle()); + + CHECKED_CONNECT(m_wbAvgSlider, SIGNAL(valueChanged(int)), this, SLOT(setWidebandAveragingCnt(int))); + + QString str = "%1 "; + m_wbAvgLevelLabel = new QLabel(str.arg(m_wbAvgValue, 2, 10, QLatin1Char(' ')), this); + m_wbAvgLevelLabel->setFont(m_fonts.smallFont); + m_wbAvgLevelLabel->setFixedSize(fontMaxWidth, 12); + m_wbAvgLevelLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_wbAvgLevelLabel->setStyleSheet(set->getSliderLabelStyle()); + + m_wbAvgLabel = new QLabel("Avg Filter:", this); + m_wbAvgLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_wbAvgLabel->setStyleSheet(set->getLabelStyle()); + + QHBoxLayout* hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(m_wbPanLineBtn); + hbox1->addWidget(m_wbPanFilledLineBtn); + hbox1->addWidget(m_wbPanSolidBtn); + + QHBoxLayout* hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addWidget(m_wbAvgLabel); + hbox2->addStretch(); + hbox2->addWidget(m_wbAvgSlider); + hbox2->addWidget(m_wbAvgLevelLabel); + + QVBoxLayout* vbox = new QVBoxLayout; + vbox->setSpacing(6); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + m_widebandPanOptions = new QGroupBox(tr("Wideband Panadapter Spectrum"), this); + m_widebandPanOptions->setMinimumWidth(m_minimumGroupBoxWidth); + m_widebandPanOptions->setLayout(vbox); + m_widebandPanOptions->setStyleSheet(set->getWidgetStyle()); + m_widebandPanOptions->setFont(QFont("Arial", 8)); +} + +void DisplayOptionsWidget::createWaterfallSpectrumOptions() { + + m_waterfallSimpleBtn = new AeroButton("Simple", this); + m_waterfallSimpleBtn->setRoundness(0); + m_waterfallSimpleBtn->setFixedSize(btn_width, btn_height); + m_waterfallColorBtnList.append(m_waterfallSimpleBtn); + + CHECKED_CONNECT( + m_waterfallSimpleBtn, + SIGNAL(clicked()), + this, + SLOT(waterfallColorChanged())); + + m_waterfallEnhancedBtn = new AeroButton("Enhanced", this); + m_waterfallEnhancedBtn->setRoundness(0); + m_waterfallEnhancedBtn->setFixedSize(btn_width, btn_height); + m_waterfallColorBtnList.append(m_waterfallEnhancedBtn); + + CHECKED_CONNECT( + m_waterfallEnhancedBtn, + SIGNAL(clicked()), + this, + SLOT(waterfallColorChanged())); + + /*m_waterfallSpectranBtn = new AeroButton("Spectran", this); + m_waterfallSpectranBtn->setRoundness(0); + m_waterfallSpectranBtn->setFixedSize(btn_width, btn_height); + m_waterfallColorBtnList.append(m_waterfallSpectranBtn); + + CHECKED_CONNECT( + m_waterfallSpectranBtn, + SIGNAL(clicked()), + this, + SLOT(waterfallColorChanged()));*/ + + switch (m_waterColorMode) { + + case (WaterfallColorMode) Simple: + + m_waterfallSimpleBtn->setBtnState(AeroButton::ON); + m_waterfallEnhancedBtn->setBtnState(AeroButton::OFF); + //m_waterfallSpectranBtn->setBtnState(AeroButton::OFF); + break; + + case (WaterfallColorMode) Enhanced: + + m_waterfallEnhancedBtn->setBtnState(AeroButton::ON); + m_waterfallSimpleBtn->setBtnState(AeroButton::OFF); + //m_waterfallSpectranBtn->setBtnState(AeroButton::OFF); + break; + + //case QSDRGraphics::spectran: + // + // m_waterfallSpectranBtn->setBtnState(AeroButton::ON); + // m_waterfallSimpleBtn->setBtnState(AeroButton::OFF); + // m_waterfallEnhancedBtn->setBtnState(AeroButton::OFF); + // break; + } + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + hbox1->addStretch(); + //hbox1->addSpacing(77); + hbox1->addWidget(m_waterfallSimpleBtn); + hbox1->addWidget(m_waterfallEnhancedBtn); + //hbox1->addWidget(m_waterfallSpectranBtn); + + /*m_waterfallTimeSpinBox = new QSpinBox(this); + m_waterfallTimeSpinBox->setMinimum(5); + m_waterfallTimeSpinBox->setMaximum(250); + m_waterfallTimeSpinBox->setSingleStep(5); + m_waterfallTimeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_waterfallTimeSpinBox->setValue(m_rxDataList.at(m_currentReceiver).waterfallTime); + + CHECKED_CONNECT( + m_waterfallTimeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(waterfallTimeChanged(int)));*/ + + m_waterfallLoOffsetSpinBox = new QSpinBox(this); + m_waterfallLoOffsetSpinBox->setMinimum(-200); + m_waterfallLoOffsetSpinBox->setMaximum(200); + m_waterfallLoOffsetSpinBox->setSingleStep(1); + m_waterfallLoOffsetSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_waterfallLoOffsetSpinBox->setValue(m_rxDataList.at(m_currentReceiver).waterfallOffsetLo); + + CHECKED_CONNECT( + m_waterfallLoOffsetSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(waterfallLoOffsetChanged(int))); + + m_waterfallHiOffsetSpinBox = new QSpinBox(this); + m_waterfallHiOffsetSpinBox->setMinimum(-200); + m_waterfallHiOffsetSpinBox->setMaximum(200); + m_waterfallHiOffsetSpinBox->setSingleStep(1); + m_waterfallHiOffsetSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_waterfallHiOffsetSpinBox->setValue(m_rxDataList.at(m_currentReceiver).waterfallOffsetHi); + + CHECKED_CONNECT( + m_waterfallHiOffsetSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(waterfallHiOffsetChanged(int))); + + //m_waterfallTimeLabel = new QLabel("Timing (ms):", this); + //m_waterfallTimeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + //m_waterfallTimeLabel->setStyleSheet(set->getLabelStyle()); + + m_waterfallLoOffsetLabel = new QLabel("Offset Low (dBm):", this); + m_waterfallLoOffsetLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_waterfallLoOffsetLabel->setStyleSheet(set->getLabelStyle()); + + m_waterfallHiOffsetLabel = new QLabel("Offset High (dBm):", this); + m_waterfallHiOffsetLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_waterfallHiOffsetLabel->setStyleSheet(set->getLabelStyle()); + + /*QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(4); + hbox2->addWidget(m_waterfallTimeLabel); + hbox2->addStretch(); + hbox2->addWidget(m_waterfallTimeSpinBox);*/ + + QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(4); + hbox3->addWidget(m_waterfallLoOffsetLabel); + hbox3->addStretch(); + hbox3->addWidget(m_waterfallLoOffsetSpinBox); + + QHBoxLayout *hbox4 = new QHBoxLayout; + hbox4->setSpacing(4); + hbox4->addWidget(m_waterfallHiOffsetLabel); + hbox4->addStretch(); + hbox4->addWidget(m_waterfallHiOffsetSpinBox); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(6); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + //vbox->addLayout(hbox2); + vbox->addLayout(hbox3); + vbox->addLayout(hbox4); + + m_waterfallSpectrumOptions = new QGroupBox(tr("Waterfall Spectrum"), this); + m_waterfallSpectrumOptions->setMinimumWidth(m_minimumGroupBoxWidth); + m_waterfallSpectrumOptions->setLayout(vbox); + m_waterfallSpectrumOptions->setStyleSheet(set->getWidgetStyle()); + m_waterfallSpectrumOptions->setFont(QFont("Arial", 8)); +} + +void DisplayOptionsWidget::createSMeterOptions() { + + /*m_sMeterA = new AeroButton("S-Meter A", this); + m_sMeterA->setRoundness(0); + m_sMeterA->setFixedSize (btn_width, btn_height); + + CHECKED_CONNECT( + m_sMeterA, + SIGNAL(clicked()), + this, + SLOT(sMeterChanged())); + + m_sMeterB = new AeroButton("S-Meter B", this); + m_sMeterB->setRoundness(0); + m_sMeterB->setFixedSize (btn_width, btn_height); + + CHECKED_CONNECT( + m_sMeterA, + SIGNAL(clicked()), + this, + SLOT(sMeterChanged()));*/ + + m_sMeterHoldTimeSpinBox = new QSpinBox(this); + m_sMeterHoldTimeSpinBox->setMinimum(500); + m_sMeterHoldTimeSpinBox->setMaximum(10000); + m_sMeterHoldTimeSpinBox->setSingleStep(500); + m_sMeterHoldTimeSpinBox->setStyleSheet(set->getSpinBoxStyle()); + m_sMeterHoldTimeSpinBox->setValue(m_sMeterHoldTime); + + CHECKED_CONNECT( + m_sMeterHoldTimeSpinBox, + SIGNAL(valueChanged(int)), + this, + SLOT(sMeterHoldTimeChanged(int))); + + m_sMeterHoldTimeLabel = new QLabel("Hold Time (ms):", this); + m_sMeterHoldTimeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_sMeterHoldTimeLabel->setStyleSheet(set->getLabelStyle()); + + /*QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(m_sMeterA); + hbox1->addWidget(m_sMeterB);*/ + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(4); + //hbox2->addSpacing(77); + hbox2->addWidget(m_sMeterHoldTimeLabel); + hbox2->addStretch(); + hbox2->addWidget(m_sMeterHoldTimeSpinBox); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(6); + vbox->addSpacing(6); + //vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + //vbox->addLayout(hbox3); + //vbox->addLayout(hbox4); + + m_sMeterOptions = new QGroupBox(tr("S-Meter"), this); + m_sMeterOptions->setMinimumWidth(m_minimumGroupBoxWidth); + m_sMeterOptions->setLayout(vbox); + m_sMeterOptions->setStyleSheet(set->getWidgetStyle()); + m_sMeterOptions->setFont(QFont("Arial", 8)); +} + +void DisplayOptionsWidget::createCallSignEditor() { + + callSignLineEdit = new QLineEdit(this); + callSignLineEdit->setStyleSheet(set->getLineEditStyle()); + callSignLineEdit->setText(set->getCallsign()); + + CHECKED_CONNECT( + callSignLineEdit, + SIGNAL(textEdited(const QString &)), + this, + SLOT(callSignTextChanged(const QString &))); + + m_setCallSignBtn = new AeroButton("Set", this); + m_setCallSignBtn->setRoundness(0); + m_setCallSignBtn->setFixedSize(btn_width, btn_height); + + CHECKED_CONNECT( + m_setCallSignBtn, + SIGNAL(clicked()), + this, + SLOT(callSignChanged())); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(4); + //hbox1->addStretch(); + hbox1->addWidget(callSignLineEdit); + hbox1->addStretch(); + hbox1->addWidget(m_setCallSignBtn); + //hbox1->addWidget(m_sMeterB); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(6); + vbox->addLayout(hbox1); + //vbox->addLayout(hbox2); + + m_callSignEditor = new QGroupBox(tr("Call Sign Editor"), this); + m_callSignEditor->setMinimumWidth(m_minimumGroupBoxWidth); + m_callSignEditor->setLayout(vbox); + m_callSignEditor->setStyleSheet(set->getWidgetStyle()); + m_callSignEditor->setFont(QFont("Arial", 8)); +} + +void DisplayOptionsWidget::panModeChanged() { + + AeroButton *button = qobject_cast(sender()); + int btnHit = m_panadapterBtnList.indexOf(button); + + foreach(AeroButton *btn, m_panadapterBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (btnHit) { + + case 0: + m_panadapterMode = (PanGraphicsMode) Line; + DISPLAYOPTIONS_DEBUG << "set panadapter to line."; + break; + + case 1: + m_panadapterMode = (PanGraphicsMode) FilledLine; + DISPLAYOPTIONS_DEBUG << "set panadapter to filled line."; + break; + + case 2: + m_panadapterMode = (PanGraphicsMode) Solid; + DISPLAYOPTIONS_DEBUG << "set panadapter to solid."; + break; + } + + set->setGraphicsState(this, m_currentReceiver, m_panadapterMode, m_waterColorMode); +} + +void DisplayOptionsWidget::wbPanModeChanged() { + + AeroButton *button = qobject_cast(sender()); + int btnHit = m_wbpanadapterBtnList.indexOf(button); + + foreach(AeroButton *btn, m_wbpanadapterBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (btnHit) { + + case 0: + m_wbPanadapterMode = (PanGraphicsMode) Line; + DISPLAYOPTIONS_DEBUG << "set wideband panadapter to line."; + break; + + case 1: + m_wbPanadapterMode = (PanGraphicsMode) FilledLine; + DISPLAYOPTIONS_DEBUG << "set wideband panadapter to filled line."; + break; + + case 2: + m_wbPanadapterMode = (PanGraphicsMode) Solid; + DISPLAYOPTIONS_DEBUG << "set wideband panadapter to solid."; + break; + } + + set->setGraphicsState(this, -1, m_wbPanadapterMode, m_waterColorMode); +} + +void DisplayOptionsWidget::sMeterChanged() { +} + +void DisplayOptionsWidget::waterfallColorChanged() { + + AeroButton *button = qobject_cast(sender()); + int btnHit = m_waterfallColorBtnList.indexOf(button); + + foreach(AeroButton *btn, m_waterfallColorBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (btnHit) { + + case 0: + m_waterColorMode = (WaterfallColorMode) Simple; + DISPLAYOPTIONS_DEBUG << "set waterfall scheme to simple."; + break; + + case 1: + m_waterColorMode = (WaterfallColorMode) Enhanced; + DISPLAYOPTIONS_DEBUG << "set waterfall scheme to enhanced."; + break; + + //case 2: + // m_waterColorMode = QSDRGraphics::spectran; + // DISPLAYOPTIONS_DEBUG << "set waterfall scheme to spectran."; + // break; + } + + set->setGraphicsState(this, m_currentReceiver, m_panadapterMode, m_waterColorMode); +} + +void DisplayOptionsWidget::fpsValueChanged(int value) { + + m_framesPerSecond = value; + + QString str = "%1 "; + m_fpsLevelLabel->setText(str.arg(m_framesPerSecond, 2, 10, QLatin1Char(' '))); + set->setFramesPerSecond(this, m_currentReceiver, value); +} + +void DisplayOptionsWidget::setFramesPerSecond(QObject *sender, int rx, int value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + + disconnect(m_fpsSlider, SIGNAL(valueChanged(int)), this, SLOT(fpsValueChanged(int))); + m_fpsSlider->setValue(value); + m_fpsSlider->update(); + connect(m_fpsSlider, SIGNAL(valueChanged(int)), this, SLOT(fpsValueChanged(int))); + + QString str = "%1 "; + m_fpsLevelLabel->setText(str.arg(value, 2, 10, QLatin1Char(' '))); +} + +void DisplayOptionsWidget::averagingFilterCntChanged(int value) { + + m_avgValue = value; + + QString str = "%1 "; + m_avgLevelLabel->setText(str.arg(m_avgValue, 2, 10, QLatin1Char(' '))); + + set->setSpectrumAveragingCnt(this, m_currentReceiver, value); +} + +void DisplayOptionsWidget::setWidebandAveragingCnt(int value) { + + m_wbAvgValue = value; + + QString str = "%1 "; + m_wbAvgLevelLabel->setText(str.arg(m_wbAvgValue, 2, 10, QLatin1Char(' '))); + + set->setSpectrumAveragingCnt(this, -1, value); +} + +void DisplayOptionsWidget::sampleRateChanged(QObject *sender, int value) { + + Q_UNUSED(sender) + + m_sampleRate = value; + //int currentValue = m_framesPerSecondSpinBox->value(); + + //m_framesPerSecondSpinBox->setMaximum(m_sampleRate/1000); + + //if (currentValue > m_sampleRate/1000) { + + // m_framesPerSecondSpinBox->setValue(m_sampleRate/1000); + // set->setFramesPerSecond(value); + //} +} + +void DisplayOptionsWidget::waterfallTimeChanged(int value) { + + set->setWaterfallTime(m_currentReceiver, value); +} + +void DisplayOptionsWidget::waterfallLoOffsetChanged(int value) { + + set->setWaterfallOffesetLo(m_currentReceiver, value); +} + +void DisplayOptionsWidget::waterfallHiOffsetChanged(int value) { + + set->setWaterfallOffesetHi(m_currentReceiver, value); +} + +void DisplayOptionsWidget::sMeterHoldTimeChanged(int value) { + + set->setSMeterHoldTime(value); +} + +void DisplayOptionsWidget::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED (sender) + + if (m_currentReceiver == rx) return; + m_currentReceiver = rx; + + setPanadapterMode(m_currentReceiver); + setWaterfallColorMode(m_currentReceiver); + + int sliderValue = set->getSpectrumAveragingCnt(m_currentReceiver); + m_avgSlider->blockSignals(true); + m_avgSlider->setValue(sliderValue); + + QString str = "%1 "; + m_avgLevelLabel->setText(str.arg(sliderValue, 2, 10, QLatin1Char(' '))); + m_avgSlider->blockSignals(false); +} + +void DisplayOptionsWidget::setPanadapterMode(int rx) { + + PanGraphicsMode panadapterMode = set->getPanadapterMode(rx); + + if (panadapterMode != m_panadapterMode) { + + foreach(AeroButton *btn, m_panadapterBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + m_panadapterBtnList.at(panadapterMode)->setBtnState(AeroButton::ON); + m_panadapterBtnList.at(panadapterMode)->update(); + + m_panadapterMode = panadapterMode; + } +} + +void DisplayOptionsWidget::setWaterfallColorMode(int rx) { + + WaterfallColorMode waterColorMode = set->getWaterfallColorMode(rx); + + if (waterColorMode != m_waterColorMode) { + + foreach(AeroButton *btn, m_waterfallColorBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + m_waterfallColorBtnList.at(waterColorMode)->setBtnState(AeroButton::ON); + m_waterfallColorBtnList.at(waterColorMode)->update(); + + m_waterColorMode = waterColorMode; + } +} + +void DisplayOptionsWidget::callSignTextChanged(const QString& text) { + + m_callSingText = text; +} + +void DisplayOptionsWidget::callSignChanged() { + + set->setCallsign(m_callSingText); +} diff --git a/Source/src/cusdr_displayWidget.h b/Source/src/cusdr_displayWidget.h new file mode 100644 index 0000000..978d09e --- /dev/null +++ b/Source/src/cusdr_displayWidget.h @@ -0,0 +1,196 @@ +/** +* @file cusdr_displayWidget.h +* @brief OpenGL display options widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-08-19 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_DISPLAY_OPTIONS_WIDGET_H +#define _CUSDR_DISPLAY_OPTIONS_WIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" + + +#ifdef LOG_DISPLAYOPTIONS_WIDGET +# define DISPLAYOPTIONS_DEBUG qDebug().nospace() << "DisplayWidget::\t" +#else +# define DISPLAYOPTIONS_DEBUG nullDebug() +#endif + + +class DisplayOptionsWidget : public QWidget { + + Q_OBJECT + +public: + DisplayOptionsWidget(QWidget* parent = 0); + ~DisplayOptionsWidget(); + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + PanGraphicsMode m_panadapterMode; + PanGraphicsMode m_wbPanadapterMode; + WaterfallColorMode m_waterColorMode; + + QList m_rxDataList; + TWideband m_widebandOptions; + + QString m_menu_style; + QString m_callSingText; + + CFonts* fonts; + TFonts m_fonts; + + QGroupBox* m_fpsGroupBox; + QGroupBox* m_panSpectrumOptions; + QGroupBox* m_widebandPanOptions; + QGroupBox* m_waterfallSpectrumOptions; + QGroupBox* m_wideBandSpectrumOptions; + QGroupBox* m_sMeterOptions; + QGroupBox* m_callSignEditor; + + QLineEdit* callSignLineEdit; + + QSlider* m_fpsSlider; + QSlider* m_avgSlider; + QSlider* m_wbAvgSlider; + + QSpinBox* m_waterfallLoOffsetSpinBox; + QSpinBox* m_waterfallHiOffsetSpinBox; + QSpinBox* m_sMeterHoldTimeSpinBox; + + QLabel* m_fpsLabel; + QLabel* m_fpsLevelLabel; + QLabel* m_avgLabel; + QLabel* m_wbAvgLabel; + QLabel* m_avgLevelLabel; + QLabel* m_wbAvgLevelLabel; + QLabel* m_resolutionLabel; + QLabel* m_waterfallTimeLabel; + QLabel* m_waterfallLoOffsetLabel; + QLabel* m_waterfallHiOffsetLabel; + QLabel* m_sMeterHoldTimeLabel; + + AeroButton* m_PanLineBtn; + AeroButton* m_PanFilledLineBtn; + AeroButton* m_PanSolidBtn; + AeroButton* m_wbPanLineBtn; + AeroButton* m_wbPanFilledLineBtn; + AeroButton* m_wbPanSolidBtn; + AeroButton* m_setCallSignBtn; + AeroButton* m_waterfallSimpleBtn; + AeroButton* m_waterfallEnhancedBtn; + AeroButton* m_waterfallSpectranBtn; + + QList m_panadapterBtnList; + QList m_wbpanadapterBtnList; + QList m_waterfallColorBtnList; + + int m_fontHeight; + int m_maxFontWidth; + + bool m_antialiased; + bool m_mouseOver; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_btnSpacing; + + int m_currentReceiver; + int m_btnChooserHit; + int m_panStyle; + int m_framesPerSecond; + int m_avgValue; + int m_wbAvgValue; + int m_sampleRate; + int m_waterfallTime; + int m_sMeterHoldTime; + + void setupConnections(); + void createFPSGroupBox(); + void createPanSpectrumOptions(); + void createWidebandPanOptions(); + void createWaterfallSpectrumOptions(); + void createSMeterOptions(); + void createCallSignEditor(); + + void setPanadapterMode(int rx); + void setWaterfallColorMode(int rx); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setCurrentReceiver(QObject *sender, int rx); + void setFramesPerSecond(QObject *sender, int rx, int value); + void panModeChanged(); + void wbPanModeChanged(); + void waterfallColorChanged(); + void sMeterChanged(); + void waterfallTimeChanged(int value); + void waterfallLoOffsetChanged(int value); + void waterfallHiOffsetChanged(int value); + void sMeterHoldTimeChanged(int value); + void fpsValueChanged(int value); + void averagingFilterCntChanged(int value); + void setWidebandAveragingCnt(int value); + void sampleRateChanged(QObject *sender, int value); + void callSignTextChanged(const QString &text); + void callSignChanged(); + +signals: + void averagingModeChanged(bool value); + //void showEvent(QObject *sender); + //void closeEvent(QObject *sender); +}; + +#endif // _CUSDR_DISPLAY_OPTIONS_WIDGET_H diff --git a/Source/src/cusdr_extCtrlWidget.cpp b/Source/src/cusdr_extCtrlWidget.cpp new file mode 100644 index 0000000..e75804e --- /dev/null +++ b/Source/src/cusdr_extCtrlWidget.cpp @@ -0,0 +1,474 @@ +/** +* @file cusdr_extCtrlWidget.cpp +* @brief J6-Pins settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-13 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_PENNY_WIDGET + + +//#include +//#include +//#include +//#include +#include +#include +#include + +#include "cusdr_extCtrlWidget.h" + +#define btn_height 15 +#define btn_width 20 +#define btn_width2 28 +#define btn_width3 32 + +ExtCtrlWidget::ExtCtrlWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_pennyOCEnabled(false) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(0) +{ + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 8, 4, 0); + setMouseTracking(true); + + createReceivePinsGroup(); + createTransmitPinsGroup(); + + enableBtn = new AeroButton("Enable", this); + enableBtn->setRoundness(0); + enableBtn->setFixedSize (65, btn_height); + enableBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + enableBtn, + SIGNAL(clicked()), + this, + SLOT(enable())); + + // disable all buttons + foreach(QList btnList, receivePinsBtnMatrix) { + + foreach(AeroButton *btn, btnList) { + + btn->setEnabled(false); + btn->update(); + } + } + + foreach(QList btnList, transmitPinsBtnMatrix) { + + foreach(AeroButton *btn, btnList) { + + btn->setEnabled(false); + btn->update(); + } + } + + + // set main layout + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 4, 0); + hbox1->addWidget(enableBtn); + hbox1->addStretch(); + + QHBoxLayout *hbox2 = new QHBoxLayout; + hbox2->setSpacing(0); + hbox2->setContentsMargins(4, 0, 4, 0); + hbox2->addWidget(receivePinsGroup); + + QHBoxLayout *hbox3 = new QHBoxLayout; + hbox3->setSpacing(0); + hbox3->setContentsMargins(4, 0, 4, 0); + hbox3->addWidget(transmitPinsGroup); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addStretch(); + + setLayout(mainLayout); + + setValues(); + setupConnections(); +} + +ExtCtrlWidget::~ExtCtrlWidget() { + + // disconnect all signals + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void ExtCtrlWidget::setupConnections() { +} + +void ExtCtrlWidget::createReceivePinsGroup() { + + QLabel* emptyLabel = new QLabel(" ", this); + emptyLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel->setStyleSheet(set->getLabelStyle()); + + // band label + QStringList bandNames; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m"; + + QList bandLabelList; + + for (int i = 0; i < MAX_BANDS-1; i++) { + + QLabel *label = new QLabel(bandNames.at(i), this); + label->setFrameStyle(QFrame::Box | QFrame::Raised); + label->setStyleSheet(set->getLabelStyle()); + + bandLabelList << label; + } + + + // buttons + QString str = "%1"; + for (int i = 0; i < MAX_BANDS-1; i++) { // bands + + QList btnList; + for (int j = 0; j < 7; j++) { // pins + + AeroButton* btn = new AeroButton(str.arg(j+1), this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + //receivePinsBtnList.append(btn); + btnList.append(btn); + + CHECKED_CONNECT( + btn, + SIGNAL(clicked()), + this, + SLOT(receivePinsBtnClicked())); + } + receivePinsBtnMatrix.append(btnList); + } + + + QGridLayout* grid = new QGridLayout(this); + grid->setVerticalSpacing(2); + grid->setHorizontalSpacing(0); + grid->setContentsMargins(5, 10, 20, 10); + + grid->addWidget(emptyLabel, 0, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(emptyLabel, 0, 1, 1, 1, Qt::AlignCenter); + grid->addWidget(emptyLabel, 0, 2, 1, 7, Qt::AlignCenter); + + for (int i = 0; i < MAX_BANDS-1; i++) { // bands + + grid->addWidget(bandLabelList.at(i), i+1, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(emptyLabel, i+1, 1, 1, 1, Qt::AlignCenter); + + for (int j = 0; j < 7; j++) { // pins + + grid->addWidget(receivePinsBtnMatrix.at(i).at(j), i+1, j+2, 1, 1, Qt::AlignCenter); + } + } + + + receivePinsGroup = new QGroupBox(tr("Receive Pins"), this); + receivePinsGroup->setMinimumWidth(m_minimumGroupBoxWidth); + receivePinsGroup->setLayout(grid); + receivePinsGroup->setStyleSheet(set->getWidgetStyle()); + receivePinsGroup->setFont(QFont("Arial", 8)); +} + +void ExtCtrlWidget::createTransmitPinsGroup() { + + QLabel* emptyLabel = new QLabel(" ", this); + emptyLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + emptyLabel->setStyleSheet(set->getLabelStyle()); + + // band label + QStringList bandNames; + bandNames << "2200 m" << "630 m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m"; + + QList bandLabelList; + + for (int i = 0; i < MAX_BANDS-1; i++) { + + QLabel *label = new QLabel(bandNames.at(i), this); + label->setFrameStyle(QFrame::Box | QFrame::Raised); + label->setStyleSheet(set->getLabelStyle()); + + bandLabelList << label; + } + + + QString str = "%1"; + for (int i = 0; i < MAX_BANDS-1; i++) { // bands + + QList btnList; + for (int j = 0; j < 7; j++) { // pins + + AeroButton* btn = new AeroButton(str.arg(j+1), this); + btn->setRoundness(0); + btn->setFixedSize (btn_width, btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + btnList.append(btn); + + CHECKED_CONNECT( + btn, + SIGNAL(clicked()), + this, + SLOT(transmitPinsBtnClicked())); + } + transmitPinsBtnMatrix.append(btnList); + } + + QGridLayout* grid = new QGridLayout(this); + grid->setVerticalSpacing(2); + grid->setHorizontalSpacing(0); + grid->setContentsMargins(5, 10, 20, 10); + + grid->addWidget(emptyLabel, 0, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(emptyLabel, 0, 1, 1, 1, Qt::AlignCenter); + grid->addWidget(emptyLabel, 0, 2, 1, 7, Qt::AlignCenter); + + for (int i = 0; i < MAX_BANDS-1; i++) { // bands + + grid->addWidget(bandLabelList.at(i), i+1, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(emptyLabel, i+1, 1, 1, 1, Qt::AlignCenter); + + for (int j = 0; j < 7; j++) { // pins + + grid->addWidget(transmitPinsBtnMatrix.at(i).at(j), i+1, j+2, 1, 1, Qt::AlignCenter); + } + } + + transmitPinsGroup = new QGroupBox(tr("Transmit Pins"), this); + transmitPinsGroup->setMinimumWidth(m_minimumGroupBoxWidth); + transmitPinsGroup->setLayout(grid); + transmitPinsGroup->setStyleSheet(set->getWidgetStyle()); + transmitPinsGroup->setFont(QFont("Arial", 8)); +} + + +//************** +void ExtCtrlWidget::enable() { + + if (enableBtn->btnState() == AeroButton::OFF) { + + enableBtn->setBtnState(AeroButton::ON); + + foreach(QList btnList, receivePinsBtnMatrix) { + + foreach(AeroButton *btn, btnList) { + + btn->setEnabled(true); + btn->update(); + } + } + + foreach(QList btnList, transmitPinsBtnMatrix) { + + foreach(AeroButton *btn, btnList) { + + btn->setEnabled(true); + btn->update(); + } + } + + m_pennyOCEnabled = true; + } + else { + + enableBtn->setBtnState(AeroButton::OFF); + + foreach(QList btnList, receivePinsBtnMatrix) { + + foreach(AeroButton *btn, btnList) { + + btn->setEnabled(false); + btn->update(); + } + } + + foreach(QList btnList, transmitPinsBtnMatrix) { + + foreach(AeroButton *btn, btnList) { + + btn->setEnabled(false); + btn->update(); + } + } + m_pennyOCEnabled = false; + } + set->setPennyOCEnabled(this, m_pennyOCEnabled); +} + +void ExtCtrlWidget::receivePinsBtnClicked() { + + AeroButton *button = qobject_cast(sender()); + + int band = -1; + int pin = -1; + for (int i = 0; i < MAX_BANDS-1; i++) { // bands + + pin = receivePinsBtnMatrix.at(i).indexOf(button); + if (pin < 0) + continue; + else { + + band = i; + break; + } + } + + if (button->btnState() == AeroButton::ON) { + + button->setBtnState(AeroButton::OFF); + button->update(); + + if (pin >= 0) + m_rxPins[band] &= getMask(pin); + } + else { + + button->setBtnState(AeroButton::ON); + button->update(); + + if (pin >= 0) { + + m_rxPins[band] &= getMask(pin); + m_rxPins[band] |= (1 << (pin+1)); + } + } + + set->setRxJ6Pins(this, m_rxPins); +} + +void ExtCtrlWidget::transmitPinsBtnClicked() { + + AeroButton *button = qobject_cast(sender()); + + int band = -1; + int pin = -1; + for (int i = 0; i < MAX_BANDS-1; i++) { // bands + + pin = transmitPinsBtnMatrix.at(i).indexOf(button); + if (pin < 0) + continue; + else { + + band = i; + break; + } + } + + if (button->btnState() == AeroButton::ON) { + + button->setBtnState(AeroButton::OFF); + button->update(); + + if (pin >= 0) + m_txPins[band] &= getMask(pin); + } + else { + + button->setBtnState(AeroButton::ON); + button->update(); + + if (pin >= 0) { + + m_txPins[band] &= getMask(pin);//mask; + m_txPins[band] |= (1 << (pin+1)); + } + } + + set->setTxJ6Pins(this, m_txPins); +} + +void ExtCtrlWidget::setValues() { + + m_pennyOCEnabled = set->getPennyOCEnabled(); + + if (m_pennyOCEnabled) enable(); + + m_rxPins = set->getRxJ6Pins(); + m_txPins = set->getTxJ6Pins(); + + for (int i = 0; i < 11; i++) { // bands + + for (int j = 0; j < 7; j++) { // pins + + if (0x1 & (m_rxPins.at(i) >> (j+1))) + receivePinsBtnMatrix.at(i).at(j)->setBtnState(AeroButton::ON); + + if (0x1 & (m_txPins.at(i) >> (j+1))) + transmitPinsBtnMatrix.at(i).at(j)->setBtnState(AeroButton::ON); + } + } +} + +uchar ExtCtrlWidget::getMask(int value) { + + uchar mask = 0x0; + switch (value) { + + case 0: + mask = 0xFD; + break; + + case 1: + mask = 0xFB; + break; + + case 2: + mask = 0xF7; + break; + + case 3: + mask = 0xEF; + break; + + case 4: + mask = 0xDF; + break; + + case 5: + mask = 0xBF; + break; + + case 6: + mask = 0x7F; + break; + + default: + mask = 0x0; + break; + } + return mask; +} + diff --git a/Source/src/cusdr_extCtrlWidget.h b/Source/src/cusdr_extCtrlWidget.h new file mode 100644 index 0000000..56c2a01 --- /dev/null +++ b/Source/src/cusdr_extCtrlWidget.h @@ -0,0 +1,93 @@ +/** +* @file cusdr_extCtrlWidget.h +* @brief J6-Pins settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-13 +*/ + +/* + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_PENNY_WIDGET_H +#define _CUSDR_PENNY_WIDGET_H + +//#include +//#include +#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + + +class ExtCtrlWidget : public QWidget { + + Q_OBJECT + +public: + ExtCtrlWidget(QWidget *parent = 0); + ~ExtCtrlWidget(); + +public slots: + +private: + void setupConnections(); + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QGroupBox* receivePinsGroup; + QGroupBox* transmitPinsGroup; + + AeroButton* enableBtn; + + QList > receivePinsBtnMatrix; + QList > transmitPinsBtnMatrix; + + QList m_rxPins; + QList m_txPins; + + bool m_pennyOCEnabled; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void createReceivePinsGroup(); + void createTransmitPinsGroup(); + void setValues(); + uchar getMask(int value); + +private slots: + void enable(); + + void receivePinsBtnClicked(); + void transmitPinsBtnClicked(); + +signals: + void showEvent(QObject* sender); + void closeEvent(QObject* sender); + void messageEvent(QString); +}; + +#endif // _CUSDR_PENNY_WIDGET_H diff --git a/Source/src/cusdr_fonts.cpp b/Source/src/cusdr_fonts.cpp new file mode 100644 index 0000000..e0969e6 --- /dev/null +++ b/Source/src/cusdr_fonts.cpp @@ -0,0 +1,224 @@ +/** +* @file cusdr_fonts.cpp +* @brief Fonts class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-11-01 +*/ + +/* + * Copyright (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "cusdr_fonts.h" + + +CFonts::CFonts(QObject *parent) + : QObject(parent) +{ + m_fonts.tinyFont.setStyleStrategy(QFont::PreferAntialias); + m_fonts.tinyFont.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.tinyFont.setPixelSize(8); + m_fonts.tinyFont.setFamily("Arial"); + //#endif + #elif defined(Q_OS_WIN32) + m_fonts.tinyFont.setPixelSize(8); + m_fonts.tinyFont.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.tinyFont.setPixelSize(7); + m_fonts.tinyFont.setFamily("Arial"); + #endif + + m_fonts.tinyFontMetrics = new QFontMetrics(m_fonts.tinyFont); + m_fonts.fontHeightTinyFont = m_fonts.tinyFontMetrics->tightBoundingRect("M").height(); + + m_fonts.smallFont.setStyleStrategy(QFont::PreferAntialias); + m_fonts.smallFont.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + //m_fonts.smallFont.setBold(true); + m_fonts.smallFont.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.smallFont.setPixelSize(9); + m_fonts.smallFont.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.smallFont.setPixelSize(10); + m_fonts.smallFont.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.smallFont.setPixelSize(10); + m_fonts.smallFont.setFamily("Arial"); + #endif + + m_fonts.smallFontMetrics = new QFontMetrics(m_fonts.smallFont); + m_fonts.fontHeightSmallFont = m_fonts.smallFontMetrics->tightBoundingRect("M").height(); + + + //m_fonts.normalFont.setStyleStrategy(QFont::PreferAntialias); + //m_fonts.normalFont.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.normalFont.setStyleStrategy(QFont::OpenGLCompatible); + m_fonts.normalFont.setBold(true); + m_fonts.normalFont.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.normalFont.setPixelSize(10); + m_fonts.normalFont.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.normalFont.setPixelSize(10); + m_fonts.normalFont.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.normalFont.setPixelSize(10); + m_fonts.normalFont.setFamily("Arial"); + #endif + + m_fonts.normalFontMetrics = new QFontMetrics(m_fonts.normalFont); + m_fonts.fontHeightNormalFont = m_fonts.normalFontMetrics->tightBoundingRect("M").height(); + + + m_fonts.bigFont.setStyleStrategy(QFont::PreferAntialias); + m_fonts.bigFont.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.bigFont.setBold(true); + m_fonts.bigFont.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.bigFont.setPixelSize(18); + m_fonts.bigFont.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.bigFont.setPixelSize(18); + m_fonts.bigFont.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.bigFont.setPixelSize(18); + m_fonts.bigFont.setFamily("Arial"); + #endif + + m_fonts.bigFontMetrics = new QFontMetrics(m_fonts.bigFont); + m_fonts.fontHeightBigFont = m_fonts.bigFontMetrics->tightBoundingRect("M").height(); + + + m_fonts.bigFont1.setStyleStrategy(QFont::PreferAntialias); + m_fonts.bigFont1.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.bigFont1.setBold(true); + m_fonts.bigFont1.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.bigFont1.setPixelSize(12); + m_fonts.bigFont1.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.bigFont1.setPixelSize(12); + m_fonts.bigFont1.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.bigFont1.setPixelSize(12); + m_fonts.bigFont1.setFamily("Arial"); + #endif + + m_fonts.bigFont1Metrics = new QFontMetrics(m_fonts.bigFont1); + m_fonts.fontHeightBigFont1 = m_fonts.bigFont1Metrics->tightBoundingRect("M").height(); + + + m_fonts.bigFont2.setStyleStrategy(QFont::PreferAntialias); + m_fonts.bigFont2.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.bigFont2.setBold(true); + m_fonts.bigFont2.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.bigFont2.setPixelSize(10); + m_fonts.bigFont2.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.bigFont2.setPixelSize(10); + m_fonts.bigFont2.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.bigFont2.setPixelSize(10); + m_fonts.bigFont2.setFamily("Arial"); + #endif + + m_fonts.bigFont2Metrics = new QFontMetrics(m_fonts.bigFont2); + m_fonts.fontHeightBigFont2 = m_fonts.bigFont2Metrics->tightBoundingRect("M").height(); + + + m_fonts.freqFont1.setStyleStrategy(QFont::PreferAntialias); + m_fonts.freqFont1.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.freqFont1.setBold(true); + m_fonts.freqFont1.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.freqFont1.setPixelSize(36); + m_fonts.freqFont1.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.freqFont1.setPixelSize(36); + m_fonts.freqFont1.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.freqFont1.setPixelSize(36); + m_fonts.freqFont1.setFamily("Arial"); + #endif + + m_fonts.freqFont1Metrics = new QFontMetrics(m_fonts.freqFont1); + m_fonts.fontHeightFreqFont1 = m_fonts.freqFont1Metrics->tightBoundingRect("M").height(); + + + m_fonts.freqFont2.setStyleStrategy(QFont::PreferAntialias); + m_fonts.freqFont2.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.freqFont2.setBold(true); + m_fonts.freqFont2.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.freqFont2.setPixelSize(24); + m_fonts.freqFont2.setFamily("Arial"); + #elif defined(Q_OS_WIN32) + m_fonts.freqFont2.setPixelSize(24); + m_fonts.freqFont2.setFamily("Arial"); + #elif defined(Q_OS_LINUX) + m_fonts.freqFont2.setPixelSize(24); + m_fonts.freqFont2.setFamily("Arial"); + #endif + + m_fonts.freqFont2Metrics = new QFontMetrics(m_fonts.freqFont2); + m_fonts.fontHeightFreqFont2 = m_fonts.freqFont2Metrics->tightBoundingRect("M").height(); + + + m_fonts.impactFont.setStyleStrategy(QFont::PreferAntialias); + m_fonts.impactFont.setItalic(true); + m_fonts.impactFont.setFixedPitch(true); + #if defined(Q_OS_MAC) + m_fonts.impactFont.setPixelSize(12); + m_fonts.impactFont.setFamily("Impact"); + #elif defined(Q_OS_WIN32) + m_fonts.impactFont.setPixelSize(12); + m_fonts.impactFont.setFamily("Impact"); + #elif defined(Q_OS_LINUX) + m_fonts.impactFont.setPixelSize(18); + m_fonts.impactFont.setFamily("Impact"); + #endif + + m_fonts.impactFontMetrics = new QFontMetrics(m_fonts.impactFont); + m_fonts.fontHeightImpactFont = m_fonts.impactFontMetrics->tightBoundingRect("M").height(); + + + m_fonts.hugeFont.setStyleStrategy(QFont::PreferAntialias); + //m_fonts.hugeFont.setStyleHint(QFont::SansSerif, QFont::PreferAntialias); + m_fonts.hugeFont.setBold(true); + m_fonts.hugeFont.setFixedPitch(true); + #ifdef Q_OS_MAC + m_fonts.hugeFont.setPixelSize(72); + m_fonts.hugeFont.setFamily("Impact"); + #elif defined(Q_OS_WIN32) + m_fonts.hugeFont.setPixelSize(72); + m_fonts.hugeFont.setFamily("Impact"); + #elif defined(Q_OS_LINUX) + m_fonts.hugeFont.setPixelSize(72); + m_fonts.hugeFont.setFamily("Impact"); + #endif + + m_fonts.hugeFontMetrics = new QFontMetrics(m_fonts.hugeFont); + m_fonts.fontHeightHugeFont = m_fonts.hugeFontMetrics->tightBoundingRect("M").height(); +} + +CFonts::~CFonts() { + +} + diff --git a/Source/src/cusdr_fonts.h b/Source/src/cusdr_fonts.h new file mode 100644 index 0000000..704c733 --- /dev/null +++ b/Source/src/cusdr_fonts.h @@ -0,0 +1,89 @@ +/** +* @file cusdr_fonts.h +* @brief Fonts header for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-11-01 +*/ + +/* + * Copyright (C) 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_FONTS_H +#define _CUSDR_FONTS_H + +#include +#include +#include + + +typedef struct _fonts { + + QFont tinyFont; + QFont smallFont; + QFont normalFont; + QFont bigFont; + QFont bigFont1; + QFont bigFont2; + QFont freqFont1; + QFont freqFont2; + QFont impactFont; + QFont hugeFont; + + QFontMetrics *tinyFontMetrics; + QFontMetrics *smallFontMetrics; + QFontMetrics *normalFontMetrics; + QFontMetrics *bigFontMetrics; + QFontMetrics *bigFont1Metrics; + QFontMetrics *bigFont2Metrics; + QFontMetrics *freqFont1Metrics; + QFontMetrics *freqFont2Metrics; + QFontMetrics *impactFontMetrics; + QFontMetrics *hugeFontMetrics; + + int fontHeightTinyFont; + int fontHeightSmallFont; + int fontHeightNormalFont; + int fontHeightBigFont; + int fontHeightBigFont1; + int fontHeightBigFont2; + int fontHeightFreqFont1; + int fontHeightFreqFont2; + int fontHeightImpactFont; + int fontHeightHugeFont; + +} TFonts; + +class CFonts : public QObject { + + Q_OBJECT + +public: + CFonts(QObject *parent = 0); + ~CFonts(); + + TFonts getFonts() { return m_fonts; } + +public slots: + +private: + TFonts m_fonts; + +}; + +#endif // _CUSDR_FONTS_H diff --git a/Source/src/cusdr_hamDatabase.cpp b/Source/src/cusdr_hamDatabase.cpp new file mode 100644 index 0000000..d1c23ff --- /dev/null +++ b/Source/src/cusdr_hamDatabase.cpp @@ -0,0 +1,25 @@ +/** +* @file cusdr_hamDatabase.cpp +* @brief Ham database class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-01-27 +*/ + +/* + * Copyright 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ \ No newline at end of file diff --git a/Source/src/cusdr_hamDatabase.h b/Source/src/cusdr_hamDatabase.h new file mode 100644 index 0000000..48a7486 --- /dev/null +++ b/Source/src/cusdr_hamDatabase.h @@ -0,0 +1,1404 @@ +/** +* @file cusdr_hamDatabase.h +* @brief Ham database header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-01-27 +*/ + +/* + * Copyright 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_HAMDATABASE_H +#define CUSDR_HAMDATABASE_H + +#include + + + +typedef enum _iaruRegion { + + region1, // 0 + region2, // 1 + region3, // 2 + +} IARURegion; + +Q_DECLARE_METATYPE (_iaruRegion) + +typedef enum _hamBand { + + m2200, // 0 + m630, // 1 + m160, // 2 + m80, // 3 + m60, // 4 + m40, // 5 + m30, // 6 + m20, // 7 + m17, // 8 + m15, // 9 + m12, // 10 + m10, // 11 + m6, // 12 + gen // 13 + +} HamBand; + +typedef enum _dspMode { + + LSB, // 0 + USB, // 1 + DSB, // 2 + CWL, // 3 + CWU, // 4 + FMN, // 5 + AM, // 6 + DIGU, // 7 + SPEC, // 8 + DIGL, // 9 + SAM, // 10 + DRM // 11 + +} DSPMode; + +typedef enum _agcMode { + + agcOFF, + agcLONG, + agcSLOW, + agcMED, + agcFAST, + agcUser + +} AGCMode; + +typedef enum _defaultFilterMode { + + filterLSB, + filterUSB, + filterDSB, + filterCWL, + filterCWU, + filterFMN, + filterAM, + filterDIGU, + filterSPEC, + filterDIGL, + filterSAM, + filterDRM + +} TDefaultFilterMode; + +Q_DECLARE_METATYPE (HamBand) +Q_DECLARE_METATYPE (DSPMode) +Q_DECLARE_METATYPE (AGCMode) +Q_DECLARE_METATYPE (TDefaultFilterMode) + +typedef struct _filter { + + DSPMode dspMode; + //QRadio::_DSPMode dspMode; + TDefaultFilterMode defaultFilterMode; + qreal filterLo; + qreal filterHi; + +} TDefaultFilter; + +typedef struct _hamBandFrequencies { + + HamBand hamBand; + IARURegion region; + + QString bandString; + long frequencyLo; + long frequencyHi; + +} THamBandFrequencies; + +typedef struct _hamBandText { + + HamBand hamBand; + IARURegion region; + + long frequencyLo; + long frequencyHi; + int maxBandwith; + + QString text; + QString shortText; + QStringList freqTextList; + +} THamBandText; + +typedef struct _hamBandDefaults { + + HamBand hamBand; + DSPMode dspMode; + + long frequencyLo; + +} THamBandDefaults; + +//*********************************************************************** + +inline QList getHamBandFrequencies() { + + QList hamBandFreqList; + + THamBandFrequencies hamBandFreq; + + hamBandFreq.frequencyLo = 135700; + hamBandFreq.frequencyHi = 137800; + hamBandFreq.hamBand = (HamBand) m2200; + hamBandFreq.bandString = "2200m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 472000; + hamBandFreq.frequencyHi = 479000; + hamBandFreq.hamBand = (HamBand) m630; + hamBandFreq.bandString = "630m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 1810000; + hamBandFreq.frequencyHi = 2000000; + hamBandFreq.hamBand = (HamBand) m160; + hamBandFreq.bandString = "160m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 3500000; + hamBandFreq.frequencyHi = 3800000; + hamBandFreq.hamBand = (HamBand) m80; + hamBandFreq.bandString = "80m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 5260000; + hamBandFreq.frequencyHi = 5410000; + hamBandFreq.hamBand = (HamBand) m60; + hamBandFreq.bandString = "60m"; + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 7000000; + hamBandFreq.frequencyHi = 7200000; + hamBandFreq.hamBand = (HamBand) m40; + hamBandFreq.bandString = "40m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 10100000; + hamBandFreq.frequencyHi = 10150000; + hamBandFreq.hamBand = (HamBand) m30; + hamBandFreq.bandString = "30m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 14000000; + hamBandFreq.frequencyHi = 14350000; + hamBandFreq.hamBand = (HamBand) m20; + hamBandFreq.bandString = "20m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 18068000; + hamBandFreq.frequencyHi = 18168000; + hamBandFreq.hamBand = (HamBand) m17; + hamBandFreq.bandString = "17m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 21000000; + hamBandFreq.frequencyHi = 21450000; + hamBandFreq.hamBand = (HamBand) m15; + hamBandFreq.bandString = "15m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 24890000; + hamBandFreq.frequencyHi = 24990000; + hamBandFreq.hamBand = (HamBand) m12; + hamBandFreq.bandString = "12m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 28000000; + hamBandFreq.frequencyHi = 29700000; + hamBandFreq.hamBand = (HamBand) m10; + hamBandFreq.bandString = "10m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 50000000; + hamBandFreq.frequencyHi = 54000000; + hamBandFreq.hamBand = (HamBand) m6; + hamBandFreq.bandString = "6m"; + hamBandFreq.region = (IARURegion) region1; + + hamBandFreqList << hamBandFreq; + + hamBandFreq.frequencyLo = 0; + hamBandFreq.frequencyHi = 61440000; + hamBandFreq.hamBand = (HamBand) gen; + hamBandFreq.bandString = "Gen"; + + hamBandFreqList << hamBandFreq; + + return hamBandFreqList; +} + +inline QList getHamBandText() { + + QList hamBandTextList; + + THamBandText hamBandText; + + hamBandText.frequencyLo = 135700; + hamBandText.frequencyHi = 135800; + hamBandText.hamBand = (HamBand) m2200; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW only, International DX window"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 135800; + hamBandText.frequencyHi = 136000; + hamBandText.hamBand = (HamBand) m2200; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW only, Test transmissions and beacons"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 136000; + hamBandText.frequencyHi = 137400; + hamBandText.hamBand = (HamBand) m2200; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW only"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 137400; + hamBandText.frequencyHi = 137600; + hamBandText.hamBand = (HamBand) m2200; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "Narrow band digital modes"; + hamBandText.shortText = "Digital Modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 137600; + hamBandText.frequencyHi = 137800; + hamBandText.hamBand = (HamBand) m2200; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "Slow CW, QRSS etc."; + hamBandText.shortText = "Slow CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 472000; + hamBandText.frequencyHi = 479000; + hamBandText.hamBand = (HamBand) m630; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2100; + hamBandText.text = "CW, Digi and SSB narrow band modes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + hamBandText.frequencyLo = 1810000; + hamBandText.frequencyHi = 1838000; + hamBandText.hamBand = (HamBand) m160; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "1836 kHz: QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 1838000; + hamBandText.frequencyHi = 1840000; + hamBandText.hamBand = (HamBand) m160; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 1840000; + hamBandText.frequencyHi = 1843000; + hamBandText.hamBand = (HamBand) m160; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, digimodes, Lowest dial setting for LSB Voice mode: 1843, 3603 and 7053 kHz"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 1843000; + hamBandText.frequencyHi = 2000000; + hamBandText.hamBand = (HamBand) m160; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, Lowest dial setting for LSB Voice mode: 1843, 3603 and 7053 kHz"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3500000; + hamBandText.frequencyHi = 3510000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW, priority for intercontinental operation"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3510000; + hamBandText.frequencyHi = 3560000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW, contest preferred"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "3555 kHz: QRS Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3560000; + hamBandText.frequencyHi = 3580000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "3560 kHz: QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3580000; + hamBandText.frequencyHi = 3590000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3590000; + hamBandText.frequencyHi = 3600000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3600000; + hamBandText.frequencyHi = 3620000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "All modes, digimodes, automatically controlled data station (unattended)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3620000; + hamBandText.frequencyHi = 3650000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "3630 kHz: Digital Voice Centre of Activity, SSB contest preferred"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3650000; + hamBandText.frequencyHi = 3700000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "3690 kHz: SSB QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3700000; + hamBandText.frequencyHi = 3775000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, SSB contest preferred"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "3735 kHz: Image Centre of Activity"; + hamBandText.freqTextList << "3760 kHz: Region 1 Emergency Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 3775000; + hamBandText.frequencyHi = 3800000; + hamBandText.hamBand = (HamBand) m80; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, priority for intercontinental operation"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7000000; + hamBandText.frequencyHi = 7040000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "7030 kHz: QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7040000; + hamBandText.frequencyHi = 7047000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7047000; + hamBandText.frequencyHi = 7050000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7050000; + hamBandText.frequencyHi = 7053000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7053000; + hamBandText.frequencyHi = 7060000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, digimodes"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7060000; + hamBandText.frequencyHi = 7100000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, SSB contest preferred"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "7070 kHz: Digital Voice Centre of Activity"; + hamBandText.freqTextList << "7090 kHz: SSB QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7100000; + hamBandText.frequencyHi = 7130000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "7110 kHz: Region 1 Emergency Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7130000; + hamBandText.frequencyHi = 7175000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, SSB contest preferred"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "7165 kHz: Image Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 7175000; + hamBandText.frequencyHi = 7200000; + hamBandText.hamBand = (HamBand) m40; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, priority for intercontinental operation"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 10100000; + hamBandText.frequencyHi = 10140000; + hamBandText.hamBand = (HamBand) m30; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "10116 kHz: QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 10140000; + hamBandText.frequencyHi = 10150000; + hamBandText.hamBand = (HamBand) m30; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14000000; + hamBandText.frequencyHi = 14060000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW, contest preferred;"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "14055 kHz: QRS Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14060000; + hamBandText.frequencyHi = 14070000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW, 14060 kHz, QRP Centre of Activity"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14070000; + hamBandText.frequencyHi = 14089000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14089000; + hamBandText.frequencyHi = 14099000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14099000; + hamBandText.frequencyHi = 14101000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, exclusively for beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14101000; + hamBandText.frequencyHi = 14112000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14112000; + hamBandText.frequencyHi = 14125000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14125000; + hamBandText.frequencyHi = 14300000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, SSB contest preferred"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "14130 kHz: Digital Voice Centre of Activity"; + hamBandText.freqTextList << "14195 kHz ± 5 kHz: Priority for Dxpeditions"; + hamBandText.freqTextList << "14230 kHz: Image Centre of Activity"; + hamBandText.freqTextList << "14285 kHz: SSB QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 14300000; + hamBandText.frequencyHi = 14350000; + hamBandText.hamBand = (HamBand) m20; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "14300 kHz: Global Emergency centre of activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 18068000; + hamBandText.frequencyHi = 18095000; + hamBandText.hamBand = (HamBand) m17; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "18086 kHz: QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 18095000; + hamBandText.frequencyHi = 18105000; + hamBandText.hamBand = (HamBand) m17; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 18105000; + hamBandText.frequencyHi = 18109000; + hamBandText.hamBand = (HamBand) m17; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 18109000; + hamBandText.frequencyHi = 18111000; + hamBandText.hamBand = (HamBand) m17; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, exclusively for beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 18111000; + hamBandText.frequencyHi = 18120000; + hamBandText.hamBand = (HamBand) m17; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "IBP, exclusively for beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 18120000; + hamBandText.frequencyHi = 18168000; + hamBandText.hamBand = (HamBand) m17; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "18130 kHz: SSB QRP Centre of Activity"; + hamBandText.freqTextList << "18150 kHz: Digital Voice Centre of Activity"; + hamBandText.freqTextList << "18160 kHz: Global Emergency Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21000000; + hamBandText.frequencyHi = 21070000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW"; + hamBandText.shortText = "CW"; + hamBandText.freqTextList << "21055 kHz: QRS Centre of Activity"; + hamBandText.freqTextList << "21060 kHz: QRP Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21070000; + hamBandText.frequencyHi = 21090000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21090000; + hamBandText.frequencyHi = 21110000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21110000; + hamBandText.frequencyHi = 21120000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes (excluding SSB), digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "All modes (excluding SSB)"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21120000; + hamBandText.frequencyHi = 21149000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21149000; + hamBandText.frequencyHi = 21151000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, exclusively for beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 21151000; + hamBandText.frequencyHi = 21450000; + hamBandText.hamBand = (HamBand) m15; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "21180 kHz: Digital Voice Centre of Activity"; + hamBandText.freqTextList << "21285 kHz: SSB QRP Centre of Activity"; + hamBandText.freqTextList << "21340 kHz: Image Centre of Activity"; + hamBandText.freqTextList << "21360 kHz: Global Emergency Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 24890000; + hamBandText.frequencyHi = 24915000; + hamBandText.hamBand = (HamBand) m12; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW, 24906 kHz, QRP centre of activity"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 24915000; + hamBandText.frequencyHi = 24925000; + hamBandText.hamBand = (HamBand) m12; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 24925000; + hamBandText.frequencyHi = 24929000; + hamBandText.hamBand = (HamBand) m12; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 24929000; + hamBandText.frequencyHi = 24931000; + hamBandText.hamBand = (HamBand) m12; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, exclusively for beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 24931000; + hamBandText.frequencyHi = 24940000; + hamBandText.hamBand = (HamBand) m12; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 24940000; + hamBandText.frequencyHi = 24990000; + hamBandText.hamBand = (HamBand) m12; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, 24960 kHz: Digital Voice Centre of Activity"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28000000; + hamBandText.frequencyHi = 28070000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 200; + hamBandText.text = "CW, 28055 kHz: QRS Centre of Activity"; + hamBandText.shortText = "CW"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28070000; + hamBandText.frequencyHi = 28120000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28120000; + hamBandText.frequencyHi = 28150000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28150000; + hamBandText.frequencyHi = 28190000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 500; + hamBandText.text = "Narrow band modes"; + hamBandText.shortText = "Narrow band modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28190000; + hamBandText.frequencyHi = 28199000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, regional time shared beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28199000; + hamBandText.frequencyHi = 28201000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, worldwide time shared beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28201000; + hamBandText.frequencyHi = 28225000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "IBP, continuous duty beacons"; + hamBandText.shortText = "IBP"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28225000; + hamBandText.frequencyHi = 28300000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, beacons"; + hamBandText.shortText = "All modes, beacons"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28300000; + hamBandText.frequencyHi = 28320000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 28320000; + hamBandText.frequencyHi = 29100000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 2700; + hamBandText.text = "All modes"; + hamBandText.shortText = "All modes"; + hamBandText.freqTextList << "28330 kHz: Digital Voice Centre of Activity"; + hamBandText.freqTextList << "28360 kHz: SSB QRP Centre of Activity"; + hamBandText.freqTextList << "28680 kHz: Image Centre of Activity"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29100000; + hamBandText.frequencyHi = 29200000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "All modes, FM simplex: 10 kHz channels"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29200000; + hamBandText.frequencyHi = 29300000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "All modes, digimodes, automatically controlled data stations (unattended)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29300000; + hamBandText.frequencyHi = 29510000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "Satellite-downlink"; + hamBandText.shortText = "Satellite-downlink"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29510000; + hamBandText.frequencyHi = 29520000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 0; + hamBandText.text = "Guard channel"; + hamBandText.shortText = "Guard channel"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29520000; + hamBandText.frequencyHi = 29590000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "All modes, FM repeater input (RH1 to RH8)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29590000; + hamBandText.frequencyHi = 29600000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "All modes, FM calling channel"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29600000; + hamBandText.frequencyHi = 29610000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "All modes, FM simplex repeater (parrot, input and output)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + hamBandText.frequencyLo = 29610000; + hamBandText.frequencyHi = 29700000; + hamBandText.hamBand = (HamBand) m10; + hamBandText.region = (IARURegion) region1; + hamBandText.maxBandwith = 6000; + hamBandText.text = "All modes, FM repeater outputs (RH1 to RH8)"; + hamBandText.shortText = "All modes"; + + hamBandTextList << hamBandText; + + return hamBandTextList; +} + +inline QList getDefaultFilterFrequencies() { + + QList defaultFilters; + + TDefaultFilter defaultFilter; + + defaultFilter.dspMode = (DSPMode) LSB; + defaultFilter.defaultFilterMode = filterLSB; + defaultFilter.filterLo = -3050.0f; + defaultFilter.filterHi = -150.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) USB; + defaultFilter.defaultFilterMode = filterUSB; + defaultFilter.filterLo = 150.0f; + defaultFilter.filterHi = 3050.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) DSB; + defaultFilter.defaultFilterMode = filterDSB; + defaultFilter.filterLo = -3300.0f; + defaultFilter.filterHi = 3300.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) CWL; + defaultFilter.defaultFilterMode = filterCWL; + defaultFilter.filterLo = -1100.0f; + defaultFilter.filterHi = -100.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) CWU; + defaultFilter.defaultFilterMode = filterCWU; + defaultFilter.filterLo = 100.0f; + defaultFilter.filterHi = 1100.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) FMN; + defaultFilter.defaultFilterMode = filterFMN; + defaultFilter.filterLo = -2000.0f; + defaultFilter.filterHi = 2000.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) AM; + defaultFilter.defaultFilterMode = filterAM; + defaultFilter.filterLo = -4000.0f; + defaultFilter.filterHi = 4000.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) DIGU; + defaultFilter.defaultFilterMode = filterDIGU; + defaultFilter.filterLo = 150.0f; + defaultFilter.filterHi = 3050.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) SPEC; + defaultFilter.defaultFilterMode = filterSPEC; + defaultFilter.filterLo = -6000.0f; + defaultFilter.filterHi = 6000.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) DIGL; + defaultFilter.defaultFilterMode = filterDIGL; + defaultFilter.filterLo = -3050.0f; + defaultFilter.filterHi = -150.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) SAM; + defaultFilter.defaultFilterMode = filterSAM; + defaultFilter.filterLo = -3300.0f; + defaultFilter.filterHi = 3300.0f; + + defaultFilters << defaultFilter; + + defaultFilter.dspMode = (DSPMode) DRM; + defaultFilter.defaultFilterMode = filterDRM; + defaultFilter.filterLo = -6000.0f; + defaultFilter.filterHi = 6000.0f; + + defaultFilters << defaultFilter; + + return defaultFilters; +} + +inline QList > getHamBandDefaults() { + + QList > hamBandDefaults; + + QList hamBandDefault; + + THamBandDefaults defaults; + + defaults.hamBand = (HamBand) m160; + defaults.dspMode = (DSPMode) CWL; + defaults.frequencyLo = 1810000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m160; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 1835000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m160; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 1845000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m80; + defaults.dspMode = (DSPMode) CWL; + defaults.frequencyLo = 3501000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m80; + defaults.dspMode = (DSPMode) LSB; + defaults.frequencyLo = 3751000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m80; + defaults.dspMode = (DSPMode) LSB; + defaults.frequencyLo = 3850000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m60; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 5258500; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m40; + defaults.dspMode = (DSPMode) CWL; + defaults.frequencyLo = 7001000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m40; + defaults.dspMode = (DSPMode) LSB; + defaults.frequencyLo = 7152000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m30; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 10120000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m20; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 14010000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m20; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 14230000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m17; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 18090000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m17; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 18125000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m15; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 21001000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m15; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 21255000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m12; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 24895000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m12; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 24900000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m10; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 28010000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m10; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 28300000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) m6; + defaults.dspMode = (DSPMode) CWU; + defaults.frequencyLo = 50010000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) m6; + defaults.dspMode = (DSPMode) USB; + defaults.frequencyLo = 50125000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + defaults.hamBand = (HamBand) gen; + defaults.dspMode = (DSPMode) SAM; + defaults.frequencyLo = 590000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) gen; + defaults.dspMode = (DSPMode) SAM; + defaults.frequencyLo = 3850000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) gen; + defaults.dspMode = (DSPMode) SAM; + defaults.frequencyLo = 5975000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) gen; + defaults.dspMode = (DSPMode) SAM; + defaults.frequencyLo = 9550000; + hamBandDefault << defaults; + + defaults.hamBand = (HamBand) gen; + defaults.dspMode = (DSPMode) SAM; + defaults.frequencyLo = 13845000; + hamBandDefault << defaults; + + hamBandDefaults << hamBandDefault; + + return hamBandDefaults; +} + +inline HamBand getBandFromFrequency(const QList bandList, long frequency) { + + HamBand band; + + for (int i = 0; i < bandList.size(); ++i) { + + if (bandList.at(i).frequencyLo <= frequency && bandList.at(i).frequencyHi >= frequency) { + + band = bandList.at(i).hamBand; + return band; + } + } + return (HamBand) gen; + +} + +inline TDefaultFilter getFilterFromDSPMode(const QList filterList, DSPMode mode) { + + TDefaultFilter filter; + + for (int i = 0; i < filterList.size(); ++i) { + + if (filterList.at(i).dspMode == mode) { + + filter = filterList.at(i); + return filter; + } + } + return filterList.at(0); +} + +inline QString getHamBandTextString(const QList textList, bool shortText, long frequency) { + + QString str = ""; + + for (int i = 0; i < textList.size(); ++i) { + + if (textList.at(i).frequencyLo <= frequency && textList.at(i).frequencyHi >= frequency) { + + if (shortText) + str = textList.at(i).shortText; + else + str = textList.at(i).text; + + return str; + } + else + str = "Out of Band"; + } + return str; +} + + +#endif // CUSDR_HAMDATABASE_H diff --git a/Source/src/cusdr_hpsdrTabWidget.cpp b/Source/src/cusdr_hpsdrTabWidget.cpp new file mode 100644 index 0000000..8c9c643 --- /dev/null +++ b/Source/src/cusdr_hpsdrTabWidget.cpp @@ -0,0 +1,212 @@ +/** +* @file cusdr_hpsdrTabWidget.cpp +* @brief Hardware settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#include "cusdr_hpsdrTabWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +HPSDRTabWidget::HPSDRTabWidget(QWidget *parent) + : QTabWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + setStyleSheet(set->getTabWidgetStyle()); + setContentsMargins(4, 4, 4, 0); + setMouseTracking(true); + + m_hpsdrWidget = new HPSDRWidget(this); + m_networkWidget = new NetworkWidget(this); + //m_transmitTabWidget = new TransmitTabWidget(this); + m_alexTabWidget = new AlexTabWidget(this); + m_extCtrlWidget = new ExtCtrlWidget(this); + + this->addTab(m_hpsdrWidget, " Config "); + this->addTab(m_networkWidget, " Network "); + //this->addTab(m_transmitTabWidget, " Transmit "); + this->addTab(m_extCtrlWidget, " Ext Ctrl "); + this->addTab(m_alexTabWidget, " Alex "); + + setTabEnabled(1, true); + + if (!set->getPenelopePresence() && !set->getPennyLanePresence() && (set->getHWInterface() != QSDR::Hermes)) { + + setTabEnabled(2, false); + //setTabEnabled(3, false); + } + + if (!set->getAlexPresence()) + setTabEnabled(3, false); + + setupConnections(); +} + +HPSDRTabWidget::~HPSDRTabWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize HPSDRTabWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize HPSDRTabWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void HPSDRTabWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(alexPresenceChanged(bool)), + this, + SLOT(setAlexPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(penelopePresenceChanged(bool)), + this, + SLOT(setPennyPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(pennyLanePresenceChanged(bool)), + this, + SLOT(setPennyPresence(bool))); +} + +void HPSDRTabWidget::systemStateChanged( + QObject *sender, /*!<[in] the sender of the signal. */ + QSDR::_Error err, /*!<[in] error state. */ + QSDR::_HWInterfaceMode hwmode, /*!<[in] HPSDR interface (Metis, Hermes, none). */ + QSDR::_ServerMode mode, /*!<[in] server mode. */ + QSDR::_DataEngineState state /*!<[in] data engine state. */ +) { + Q_UNUSED (sender) + Q_UNUSED (err) + + //if (sender == this) return; + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_hwInterface == QSDR::Hermes) + setTabEnabled(2, true); + else + setTabEnabled(2, false); + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; +} + +void HPSDRTabWidget::setPennyPresence(bool value) { + + //setTabEnabled(1, value); + setTabEnabled(2, value); + //setTabEnabled(3, value); +} + +void HPSDRTabWidget::setAlexPresence(bool value) { + + setTabEnabled(3, value); +} + +void HPSDRTabWidget::addNICChangedConnection() { + + m_networkWidget->addNICChangedConnection(); +} + +void HPSDRTabWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void HPSDRTabWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +void HPSDRTabWidget::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void HPSDRTabWidget::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void HPSDRTabWidget::mouseMoveEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void HPSDRTabWidget::mousePressEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void HPSDRTabWidget::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + + diff --git a/Source/src/cusdr_hpsdrTabWidget.h b/Source/src/cusdr_hpsdrTabWidget.h new file mode 100644 index 0000000..41320ad --- /dev/null +++ b/Source/src/cusdr_hpsdrTabWidget.h @@ -0,0 +1,105 @@ +/** +* @file cusdr_hpsdrTabWidget.h +* @brief Hardware settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_HPSDR_TABWIDGET_H +#define _CUSDR_HPSDR_TABWIDGET_H + +//#include +//#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_hpsdrWidget.h" +#include "cusdr_networkWidget.h" +//#include "cusdr_transmitTabWidget.h" +#include "cusdr_alexTabWidget.h" +#include "cusdr_extCtrlWidget.h" + + +class HPSDRTabWidget : public QTabWidget { + + Q_OBJECT + +public: + HPSDRTabWidget(QWidget *parent = 0); + ~HPSDRTabWidget(); + + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + void addNICChangedConnection(); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + Settings *set; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + HPSDRWidget *m_hpsdrWidget; + NetworkWidget *m_networkWidget; + AlexTabWidget *m_alexTabWidget; + ExtCtrlWidget *m_extCtrlWidget; + + QString m_message; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setAlexPresence(bool value); + void setPennyPresence(bool value); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString message); +}; + +#endif // _CUSDR_HPSDR_TABWIDGET_H diff --git a/Source/src/cusdr_hpsdrWidget.cpp b/Source/src/cusdr_hpsdrWidget.cpp new file mode 100644 index 0000000..ddf084d --- /dev/null +++ b/Source/src/cusdr_hpsdrWidget.cpp @@ -0,0 +1,1023 @@ +/** +* @file cusdr_hpsdrWidget.cpp +* @brief Hardware settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#define LOG_HPSDR_WIDGET + +// use: HPSDR_WIDGET_DEBUG + +//#include +//#include +//#include +//#include +#include + +#include "cusdr_hpsdrWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 42 + + +HPSDRWidget::HPSDRWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_hwInterfaceTemp(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(0) + , m_numberOfReceivers(1) + , m_hpsdrHardware(set->getHPSDRHardware()) +{ + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 8, 4, 0); + setMouseTracking(true); + + m_firmwareCheck = set->getFirmwareVersionCheck(); + + createSource10MhzExclusiveGroup(); + createSource122_88MhzExclusiveGroup(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 4, 0); + hbox1->addWidget(hpsdrHardwareBtnGroup()); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(0); + hbox2->setContentsMargins(4, 0, 4, 0); + hbox2->addWidget(source10MhzExclusiveGroup); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(0); + hbox3->setContentsMargins(4, 0, 4, 0); + hbox3->addWidget(source122_88MhzExclusiveGroup); + + QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(0); + //hbox4->setMargin(0); + //hbox4->addStretch(); + hbox4->setContentsMargins(4, 0, 4, 0); + hbox4->addWidget(sampleRateExclusiveGroup()); + + QHBoxLayout *hbox5 = new QHBoxLayout(); + hbox5->setSpacing(0); + hbox5->setContentsMargins(4, 0, 4, 0); + hbox5->addWidget(numberOfReceiversGroup()); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addLayout(hbox4); + mainLayout->addLayout(hbox5); + mainLayout->addStretch(); + setLayout(mainLayout); + + setupConnections(); + setHPSDRHardware(); +} + +HPSDRWidget::~HPSDRWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void HPSDRWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); +} + +QGroupBox* HPSDRWidget::hpsdrHardwareBtnGroup() { + + modulesPresenceBtn = new AeroButton("Modules", this); + modulesPresenceBtn->setRoundness(0); + modulesPresenceBtn->setFixedSize(btn_width, btn_height); + modulesPresenceBtn->setBtnState(AeroButton::OFF); + hardwareBtnList.append(modulesPresenceBtn); + + CHECKED_CONNECT( + modulesPresenceBtn, + SIGNAL(released()), + this, + SLOT(hpsdrHardwareChanged())); + + hermesPresenceBtn = new AeroButton("Hermes", this); + hermesPresenceBtn->setRoundness(0); + hermesPresenceBtn->setFixedSize(btn_width, btn_height); + hermesPresenceBtn->setBtnState(AeroButton::OFF); + hardwareBtnList.append(hermesPresenceBtn); + + CHECKED_CONNECT( + hermesPresenceBtn, + SIGNAL(released()), + this, + SLOT(hpsdrHardwareChanged())); + + penelopePresenceBtn = new AeroButton("Penelope", this); + penelopePresenceBtn->setRoundness(0); + penelopePresenceBtn->setFixedSize(btn_width, btn_height); + penelopePresenceBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + penelopePresenceBtn, + SIGNAL(released()), + this, + SLOT(penelopePresenceChanged())); + + pennyPresenceBtn = new AeroButton("Pennylane", this); + pennyPresenceBtn->setRoundness(0); + pennyPresenceBtn->setFixedSize(btn_width, btn_height); + pennyPresenceBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + pennyPresenceBtn, + SIGNAL(released()), + this, + SLOT(pennyPresenceChanged())); + + mercuryPresenceBtn = new AeroButton("Mercury", this); + mercuryPresenceBtn->setRoundness(0); + mercuryPresenceBtn->setFixedSize(btn_width, btn_height); + mercuryPresenceBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + mercuryPresenceBtn, + SIGNAL(released()), + this, + SLOT(mercuryPresenceChanged())); + + alexPresenceBtn = new AeroButton("Alex", this); + alexPresenceBtn->setRoundness(0); + alexPresenceBtn->setFixedSize(btn_width, btn_height); + alexPresenceBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + alexPresenceBtn, + SIGNAL(released()), + this, + SLOT(alexPresenceChanged())); + + excaliburPresenceBtn = new AeroButton("Excalibur", this); + excaliburPresenceBtn->setRoundness(0); + excaliburPresenceBtn->setFixedSize(btn_width, btn_height); + excaliburPresenceBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + excaliburPresenceBtn, + SIGNAL(released()), + this, + SLOT(excaliburPresenceChanged())); + + firmwareCheckBtn = new AeroButton("On", this); + firmwareCheckBtn->setRoundness(0); + firmwareCheckBtn->setFixedSize(btn_widths, btn_height); + + if (m_firmwareCheck) { + + firmwareCheckBtn->setBtnState(AeroButton::ON); + firmwareCheckBtn->setText("On"); + } + else { + + firmwareCheckBtn->setBtnState(AeroButton::OFF); + firmwareCheckBtn->setText("Off"); + } + + CHECKED_CONNECT( + firmwareCheckBtn, + SIGNAL(released()), + this, + SLOT(firmwareCheckChanged())); + + m_fwCheckLabel = new QLabel("Firmware Check:", this); + m_fwCheckLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_fwCheckLabel->setStyleSheet(set->getLabelStyle()); + + QHBoxLayout *hbox0 = new QHBoxLayout(); + hbox0->setSpacing(4); + hbox0->addStretch(); + hbox0->addWidget(m_fwCheckLabel); + hbox0->addWidget(firmwareCheckBtn); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(modulesPresenceBtn); + hbox1->addWidget(hermesPresenceBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(4); + hbox2->addStretch(); + hbox2->addWidget(penelopePresenceBtn); + hbox2->addWidget(pennyPresenceBtn); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(4); + hbox3->addStretch(); + hbox3->addWidget(mercuryPresenceBtn); + hbox3->addWidget(excaliburPresenceBtn); + + QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(4); + hbox4->addStretch(); + hbox4->addWidget(alexPresenceBtn); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox0); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + vbox->addLayout(hbox3); + vbox->addLayout(hbox4); + + QGroupBox *groupBox = new QGroupBox(tr("Hardware selection"), this); + groupBox->setMinimumWidth(m_minimumGroupBoxWidth); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(set->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +void HPSDRWidget::createSource10MhzExclusiveGroup() { + + atlasBtn = new AeroButton("Atlas", this); + atlasBtn->setRoundness(0); + atlasBtn->setFixedSize(btn_width, btn_height); + source10MhzBtnList.append(atlasBtn); + + CHECKED_CONNECT( + atlasBtn, + SIGNAL(released()), + this, + SLOT(source10MhzChanged())); + + penelopeBtn = new AeroButton("Penny[Lane]", this); + penelopeBtn->setRoundness(0); + penelopeBtn->setFixedSize(btn_width, btn_height); + source10MhzBtnList.append(penelopeBtn); + + CHECKED_CONNECT( + penelopeBtn, + SIGNAL(released()), + this, + SLOT(source10MhzChanged())); + + mercuryBtn = new AeroButton("Mercury", this); + mercuryBtn->setRoundness(0); + mercuryBtn->setFixedSize(btn_width, btn_height); + source10MhzBtnList.append(mercuryBtn); + + CHECKED_CONNECT( + mercuryBtn, + SIGNAL(released()), + this, + SLOT(source10MhzChanged())); + + + sources10Mhz << "Atlas" << "Penelope" << "Mercury"; + + switch(set->get10MHzSource()) { + + case 0: + atlasBtn->setBtnState(AeroButton::ON); + penelopeBtn->setBtnState(AeroButton::OFF); + mercuryBtn->setBtnState(AeroButton::OFF); + break; + + case 1: + penelopeBtn->setBtnState(AeroButton::ON); + atlasBtn->setBtnState(AeroButton::OFF); + mercuryBtn->setBtnState(AeroButton::OFF); + break; + + case 2: + mercuryBtn->setBtnState(AeroButton::ON); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + break; + + case 3: + mercuryBtn->setBtnState(AeroButton::OFF); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + break; + } + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(penelopeBtn); + hbox1->addWidget(mercuryBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(4); + hbox2->addStretch(); + hbox2->addWidget(atlasBtn); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + source10MhzExclusiveGroup = new QGroupBox(tr("10 MHz Clock"), this); + source10MhzExclusiveGroup->setMinimumWidth(m_minimumGroupBoxWidth); + source10MhzExclusiveGroup->setLayout(vbox); + source10MhzExclusiveGroup->setStyleSheet(set->getWidgetStyle()); + source10MhzExclusiveGroup->setFont(QFont("Arial", 8)); +} + +void HPSDRWidget::createSource122_88MhzExclusiveGroup() { + + penelope2Btn = new AeroButton("Penny[Lane]", this); + penelope2Btn->setRoundness(0); + penelope2Btn->setFixedSize(btn_width, btn_height); + + CHECKED_CONNECT( + penelope2Btn, + SIGNAL(clicked()), + this, + SLOT(source122_88MhzChanged())); + + mercury2Btn = new AeroButton("Mercury", this); + mercury2Btn->setRoundness(0); + mercury2Btn->setFixedSize(btn_width, btn_height); + + CHECKED_CONNECT( + mercury2Btn, + SIGNAL(clicked()), + this, + SLOT(source122_88MhzChanged())); + + switch(set->get122_8MHzSource()) { + + case 0: + penelope2Btn->setBtnState(AeroButton::ON); + mercury2Btn->setBtnState(AeroButton::OFF); + break; + + case 1: + mercury2Btn->setBtnState(AeroButton::ON); + penelope2Btn->setBtnState(AeroButton::OFF); + break; + } + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(penelope2Btn); + hbox1->addWidget(mercury2Btn); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + + source122_88MhzExclusiveGroup = new QGroupBox(tr("122.8 MHz Clock"), this); + source122_88MhzExclusiveGroup->setMinimumWidth(m_minimumGroupBoxWidth); + source122_88MhzExclusiveGroup->setLayout(vbox); + source122_88MhzExclusiveGroup->setStyleSheet(set->getWidgetStyle()); + source122_88MhzExclusiveGroup->setFont(QFont("Arial", 8)); +} + +QGroupBox *HPSDRWidget::sampleRateExclusiveGroup() { + + samplerate48Btn = new AeroButton("48 kHz", this); + samplerate48Btn->setRoundness(0); + samplerate48Btn->setFixedSize (50, btn_height); + samplerate48Btn->setStyleSheet(set->getMiniButtonStyle()); + samplerateBtnList.append(samplerate48Btn); + CHECKED_CONNECT(samplerate48Btn, SIGNAL(released()), this, SLOT(sampleRateChanged())); + + samplerate96Btn = new AeroButton("96 kHz", this); + samplerate96Btn->setRoundness(0); + samplerate96Btn->setFixedSize (50, btn_height); + samplerate96Btn->setStyleSheet(set->getMiniButtonStyle()); + samplerateBtnList.append(samplerate96Btn); + CHECKED_CONNECT(samplerate96Btn, SIGNAL(released()), this, SLOT(sampleRateChanged())); + + samplerate192Btn = new AeroButton("192 kHz", this); + samplerate192Btn->setRoundness(0); + samplerate192Btn->setFixedSize (50, btn_height); + samplerate192Btn->setStyleSheet(set->getMiniButtonStyle()); + samplerateBtnList.append(samplerate192Btn); + CHECKED_CONNECT(samplerate192Btn, SIGNAL(released()), this, SLOT(sampleRateChanged())); + + samplerate384Btn = new AeroButton("384 kHz", this); + samplerate384Btn->setRoundness(0); + samplerate384Btn->setFixedSize (50, btn_height); + samplerate384Btn->setStyleSheet(set->getMiniButtonStyle()); + //samplerate384Btn->setEnabled(false); + samplerateBtnList.append(samplerate384Btn); + CHECKED_CONNECT(samplerate384Btn, SIGNAL(released()), this, SLOT(sampleRateChanged())); + + switch(set->getSampleRate()) { + + case 48000: + samplerate48Btn->setBtnState(AeroButton::ON); + samplerate96Btn->setBtnState(AeroButton::OFF); + samplerate192Btn->setBtnState(AeroButton::OFF); + samplerate384Btn->setBtnState(AeroButton::OFF); + break; + + case 96000: + samplerate48Btn->setBtnState(AeroButton::OFF); + samplerate96Btn->setBtnState(AeroButton::ON); + samplerate192Btn->setBtnState(AeroButton::OFF); + samplerate384Btn->setBtnState(AeroButton::OFF); + break; + + case 192000: + samplerate48Btn->setBtnState(AeroButton::OFF); + samplerate96Btn->setBtnState(AeroButton::OFF); + samplerate192Btn->setBtnState(AeroButton::ON); + samplerate384Btn->setBtnState(AeroButton::OFF); + break; + + case 384000: + samplerate48Btn->setBtnState(AeroButton::OFF); + samplerate96Btn->setBtnState(AeroButton::OFF); + samplerate192Btn->setBtnState(AeroButton::OFF); + samplerate384Btn->setBtnState(AeroButton::ON); + break; + } + + QHBoxLayout *hbox = new QHBoxLayout(); + hbox->setSpacing(4); + hbox->addStretch(); + hbox->addWidget(samplerate48Btn); + hbox->addWidget(samplerate96Btn); + hbox->addWidget(samplerate192Btn); + hbox->addWidget(samplerate384Btn); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox); + + QGroupBox *groupBox = new QGroupBox(tr("Sample Rate"), this); + groupBox->setMinimumWidth(m_minimumGroupBoxWidth); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(set->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +QGroupBox *HPSDRWidget::numberOfReceiversGroup() { + + m_receiverComboBox = new QComboBox(this); + m_receiverComboBox->setStyleSheet(set->getComboBoxStyle()); + m_receiverComboBox->setMinimumContentsLength(4); + + QString str = "%1"; + for (int i = 0; i < MAX_RECEIVERS; i++) + m_receiverComboBox->addItem(str.arg(i+1)); + + CHECKED_CONNECT( + m_receiverComboBox, + SIGNAL(currentIndexChanged(int)), + this, + SLOT(setNumberOfReceivers(int))); + + m_receiversLabel = new QLabel("Receivers:", this); + m_receiversLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_receiversLabel->setStyleSheet(set->getLabelStyle()); + + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(5); + //hbox1->addStretch(); + hbox1->addWidget(m_receiversLabel); + hbox1->addStretch(); + hbox1->addWidget(m_receiverComboBox); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + + QGroupBox *groupBox = new QGroupBox(tr("Number of Receivers"), this); + groupBox->setMinimumWidth(m_minimumGroupBoxWidth); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(set->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +// ************************************************************************ + +void HPSDRWidget::setHPSDRHardware() { + + switch (m_hpsdrHardware) { + + case 0: + // HPSDR modules + modulesPresenceBtn->setBtnState(AeroButton::ON); + hermesPresenceBtn->setBtnState(AeroButton::OFF); + + mercuryPresenceBtn->setEnabled(true); + if (set->getMercuryPresence()) + mercuryPresenceBtn->setBtnState(AeroButton::ON); + else + mercuryPresenceBtn->setBtnState(AeroButton::OFF); + + penelopePresenceBtn->setEnabled(true); + pennyPresenceBtn->setEnabled(true); + + if (set->getPenelopePresence()) { + + penelopePresenceBtn->setBtnState(AeroButton::ON); + pennyPresenceBtn->setBtnState(AeroButton::OFF); + } + else if (set->getPennyLanePresence()) { + + penelopePresenceBtn->setBtnState(AeroButton::OFF); + pennyPresenceBtn->setBtnState(AeroButton::ON); + } + else { + + penelopePresenceBtn->setBtnState(AeroButton::OFF); + pennyPresenceBtn->setBtnState(AeroButton::OFF); + } + + excaliburPresenceBtn->setEnabled(true); + if (set->getExcaliburPresence()) { + + set->set10MhzSource(this, 3); // none + mercuryBtn->setBtnState(AeroButton::OFF); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + mercuryBtn->setEnabled(false); + penelopeBtn->setEnabled(false); + atlasBtn->setEnabled(false); + + excaliburPresenceBtn->setBtnState(AeroButton::ON); + } + else { + + switch(set->get10MHzSource()) { + + case 0: + atlasBtn->setBtnState(AeroButton::ON); + penelopeBtn->setBtnState(AeroButton::OFF); + mercuryBtn->setBtnState(AeroButton::OFF); + break; + + case 1: + penelopeBtn->setBtnState(AeroButton::ON); + atlasBtn->setBtnState(AeroButton::OFF); + mercuryBtn->setBtnState(AeroButton::OFF); + break; + + case 2: + mercuryBtn->setBtnState(AeroButton::ON); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + break; + + case 3: + mercuryBtn->setBtnState(AeroButton::OFF); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + break; + } + + excaliburPresenceBtn->setBtnState(AeroButton::OFF); + } + + break; + + case 1: + + // Hermes + modulesPresenceBtn->setBtnState(AeroButton::OFF); + hermesPresenceBtn->setBtnState(AeroButton::ON); + + penelopePresenceBtn->setBtnState(AeroButton::OFF); + penelopePresenceBtn->setEnabled(false); + + pennyPresenceBtn->setBtnState(AeroButton::OFF); + pennyPresenceBtn->setEnabled(false); + + mercuryPresenceBtn->setBtnState(AeroButton::OFF); + mercuryPresenceBtn->setEnabled(false); + + excaliburPresenceBtn->setBtnState(AeroButton::OFF); + excaliburPresenceBtn->setEnabled(false); + + set->set10MhzSource(this, 2); // none + source10MhzExclusiveGroup->hide(); + source122_88MhzExclusiveGroup->hide(); + + break; + + case 2: + + // Cyclops + break; + } + + if (set->getAlexPresence()) + alexPresenceBtn->setBtnState(AeroButton::ON); +} + +void HPSDRWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + //m_oldServerMode = m_serverMode; + if (m_serverMode != mode) { + + if (mode == QSDR::ChirpWSPR) + disableButtons(); + + if (m_serverMode == QSDR::ChirpWSPR) + enableButtons(); + + m_serverMode = mode; + } + + if (m_dataEngineState != state) { + + if (state == QSDR::DataEngineUp) + disableButtons(); + else + enableButtons(); + + m_dataEngineState = state; + } + update(); +} + +void HPSDRWidget::hpsdrHardwareChanged() { + + AeroButton *button = qobject_cast(sender()); + int btn = hardwareBtnList.indexOf(button); + + foreach(AeroButton *btn, hardwareBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + m_hpsdrHardware = btn; + set->setHPSDRHardware(m_hpsdrHardware); + + setHPSDRHardware(); + + switch (m_hpsdrHardware) { + + case 0: + // HPSDR modules + source10MhzExclusiveGroup->show(); + source122_88MhzExclusiveGroup->show(); + + m_hwInterface = QSDR::Metis; + + emit messageEvent("[hpsdr]: HPSDR modules chosen."); + break; + + case 1: + // Hermes + source10MhzExclusiveGroup->hide(); + source122_88MhzExclusiveGroup->hide(); + + m_hwInterface = QSDR::Hermes; + emit messageEvent("[hpsdr]: Hermes chosen."); + break; + + case 2: + break; + } + + set->setSystemState( + this, + QSDR::NoError, + m_hwInterface, + m_serverMode, + m_dataEngineState); +} + +void HPSDRWidget::penelopePresenceChanged() { + + if (penelopePresenceBtn->btnState() == AeroButton::OFF) { + + if (pennyPresenceBtn->btnState() == AeroButton::ON) { + + set->setPennyLanePresence(false); + pennyPresenceBtn->setBtnState(AeroButton::OFF); + pennyPresenceBtn->update(); + + emit messageEvent("[hpsdr]: PennyLane removed"); + } + set->setPenelopePresence(true); + penelopePresenceBtn->setBtnState(AeroButton::ON); + + emit messageEvent("[hpsdr]: Penelope added"); + + } else { + + set->setPenelopePresence(false); + penelopePresenceBtn->setBtnState(AeroButton::OFF); + emit messageEvent("[hpsdr]: Penelope removed."); + } +} + +void HPSDRWidget::pennyPresenceChanged() { + + if (pennyPresenceBtn->btnState() == AeroButton::OFF) { + + if (penelopePresenceBtn->btnState() == AeroButton::ON) { + + set->setPenelopePresence(false); + penelopePresenceBtn->setBtnState(AeroButton::OFF); + penelopePresenceBtn->update(); + + emit messageEvent("[hpsdr]: Penelope removed"); + } + set->setPennyLanePresence(true); + pennyPresenceBtn->setBtnState(AeroButton::ON); + + emit messageEvent("[hpsdr]: PennyLane added"); + + } else { + + set->setPennyLanePresence(false); + pennyPresenceBtn->setBtnState(AeroButton::OFF); + emit messageEvent("[hpsdr]: PennyLane removed."); + } +} + +void HPSDRWidget::mercuryPresenceChanged() { + + if (mercuryPresenceBtn->btnState() == AeroButton::OFF) { + + set->setMercuryPresence(true); + mercuryPresenceBtn->setBtnState(AeroButton::ON); + emit messageEvent("[hpsdr]: Mercury added."); + + } else { + + set->setMercuryPresence(false); + mercuryPresenceBtn->setBtnState(AeroButton::OFF); + emit messageEvent("[hpsdr]: Mercury removed."); + } +} + +void HPSDRWidget::alexPresenceChanged() { + + if (alexPresenceBtn->btnState() == AeroButton::OFF) { + + set->setAlexPresence(true); + alexPresenceBtn->setBtnState(AeroButton::ON); + emit messageEvent("[hpsdr]: Alex added."); + + } else { + + set->setAlexPresence(false); + alexPresenceBtn->setBtnState(AeroButton::OFF); + emit messageEvent("[hpsdr]: Alex removed."); + } +} + +void HPSDRWidget::excaliburPresenceChanged() { + + if (excaliburPresenceBtn->btnState() == AeroButton::OFF) { + + set->set10MhzSource(this, 3); // None + + mercuryBtn->setBtnState(AeroButton::OFF); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + + mercuryBtn->setEnabled(false); + penelopeBtn->setEnabled(false); + atlasBtn->setEnabled(false); + + set->setExcaliburPresence(true); + excaliburPresenceBtn->setBtnState(AeroButton::ON); + emit messageEvent("[hpsdr]: Excalibur added."); + + } else { + + set->set10MhzSource(this, 2); // Mercury + + mercuryBtn->setEnabled(true); + penelopeBtn->setEnabled(true); + atlasBtn->setEnabled(true); + + mercuryBtn->setBtnState(AeroButton::ON); + mercuryBtn->update(); + atlasBtn->setBtnState(AeroButton::OFF); + penelopeBtn->setBtnState(AeroButton::OFF); + + set->setExcaliburPresence(false); + excaliburPresenceBtn->setBtnState(AeroButton::OFF); + emit messageEvent("[hpsdr]: Excalibur removed."); + } +} + +void HPSDRWidget::firmwareCheckChanged() { + + if (firmwareCheckBtn->btnState() == AeroButton::OFF) { + + set->setCheckFirmwareVersion(this, true); + firmwareCheckBtn->setBtnState(AeroButton::ON); + firmwareCheckBtn->setText("On"); + + } else { + + set->setCheckFirmwareVersion(this, false); + firmwareCheckBtn->setBtnState(AeroButton::OFF); + firmwareCheckBtn->setText("Off"); + } +} + +void HPSDRWidget::source10MhzChanged() { + + AeroButton *button = qobject_cast(sender()); + int btn = source10MhzBtnList.indexOf(button); + + foreach(AeroButton *btn, source10MhzBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + set->set10MhzSource(this, btn); + button->setBtnState(AeroButton::ON); + button->update(); + + QString msg = "[hpsdr]: 10 MHz source changed to %1"; + emit messageEvent(msg.arg(sources10Mhz.at(btn))); +} + +void HPSDRWidget::source122_88MhzChanged() { + + switch (set->get122_8MHzSource()) { + + // penelope 0, mercury 1 + case 0: + penelope2Btn->setBtnState(AeroButton::OFF); + penelope2Btn->update(); + + set->set122_88MhzSource(this, 1); + emit messageEvent("[hpsdr]: 122.88 MHz source changed to Mercury."); + mercury2Btn->setBtnState(AeroButton::ON); + break; + + case 1: + mercury2Btn->setBtnState(AeroButton::OFF); + mercury2Btn->update(); + + set->set122_88MhzSource(this, 0); + emit messageEvent("[hpsdr]: 122.88 MHz source changed to Penelope."); + penelope2Btn->setBtnState(AeroButton::ON); + break; + } +} + +void HPSDRWidget::sampleRateChanged() { + + AeroButton *button = qobject_cast(sender()); + int btnHit = samplerateBtnList.indexOf(button); + + foreach(AeroButton *btn, samplerateBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (btnHit) { + + case 0: + set->setSampleRate(this, 48000); + HPSDR_WIDGET_DEBUG << "set sample rate to 48 kHz."; + break; + + case 1: + set->setSampleRate(this, 96000); + HPSDR_WIDGET_DEBUG << "set sample rate to 96 kHz."; + break; + + case 2: + set->setSampleRate(this, 192000); + HPSDR_WIDGET_DEBUG << "set sample rate to 192 kHz."; + break; + + case 3: + set->setSampleRate(this, 384000); + HPSDR_WIDGET_DEBUG << "set sample rate to 384 kHz."; + break; + } +} + +void HPSDRWidget::setNumberOfReceivers(int receivers) { + + m_numberOfReceivers = receivers+1; + set->setReceivers(this, m_numberOfReceivers); +} + +void HPSDRWidget::disableButtons() { + + modulesPresenceBtn->setEnabled(false); + hermesPresenceBtn->setEnabled(false); + + penelopePresenceBtn->setEnabled(false); + pennyPresenceBtn->setEnabled(false); + mercuryPresenceBtn->setEnabled(false); + excaliburPresenceBtn->setEnabled(false); + alexPresenceBtn->setEnabled(false); + atlasBtn->setEnabled(false); + penelopeBtn->setEnabled(false); + mercuryBtn->setEnabled(false); + penelope2Btn->setEnabled(false); + mercury2Btn->setEnabled(false); + + m_receiverComboBox->setEnabled(false); +} + +void HPSDRWidget::enableButtons() { + + modulesPresenceBtn->setEnabled(true); + hermesPresenceBtn->setEnabled(true); + + penelopePresenceBtn->setEnabled(true); + pennyPresenceBtn->setEnabled(true); + mercuryPresenceBtn->setEnabled(true); + excaliburPresenceBtn->setEnabled(true); + alexPresenceBtn->setEnabled(true); + atlasBtn->setEnabled(true); + penelopeBtn->setEnabled(true); + mercuryBtn->setEnabled(true); + penelope2Btn->setEnabled(true); + mercury2Btn->setEnabled(true); + + m_receiverComboBox->setEnabled(true); +} diff --git a/Source/src/cusdr_hpsdrWidget.h b/Source/src/cusdr_hpsdrWidget.h new file mode 100644 index 0000000..33fde2e --- /dev/null +++ b/Source/src/cusdr_hpsdrWidget.h @@ -0,0 +1,144 @@ +/** +* @file cusdr_hpsdrWidget.h +* @brief Hardware settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_HPSDR_WIDGET_H +#define _CUSDR_HPSDR_WIDGET_H + +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + +#ifdef LOG_HPSDR_WIDGET +# define HPSDR_WIDGET_DEBUG qDebug().nospace() << "HPSDRWidget::\t" +#else +# define HPSDR_WIDGET_DEBUG nullDebug() +#endif + + +class HPSDRWidget : public QWidget { + + Q_OBJECT + +public: + HPSDRWidget(QWidget *parent = 0); + ~HPSDRWidget(); + + +public slots: + void hpsdrHardwareChanged(); + void penelopePresenceChanged(); + void pennyPresenceChanged(); + void mercuryPresenceChanged(); + void alexPresenceChanged(); + void excaliburPresenceChanged(); + void source122_88MhzChanged(); + +private: + Settings *set; + + QGroupBox *hpsdrHardwareBtnGroup(); + QGroupBox *receiversExclusiveBtnGroup(); + QGroupBox *source10MhzExclusiveGroup; + QGroupBox *source122_88MhzExclusiveGroup; + QGroupBox *sampleRateExclusiveGroup(); + QGroupBox *numberOfReceiversGroup(); + + QComboBox *m_receiverComboBox; + + QLabel *m_fwCheckLabel; + QLabel *m_receiversLabel; + + QString m_message; + + AeroButton *hermesPresenceBtn; + AeroButton *modulesPresenceBtn; + AeroButton *penelopePresenceBtn; + AeroButton *pennyPresenceBtn; + AeroButton *mercuryPresenceBtn; + AeroButton *alexPresenceBtn; + AeroButton *excaliburPresenceBtn; + AeroButton *firmwareCheckBtn; + AeroButton *atlasBtn; + AeroButton *penelopeBtn; + AeroButton *mercuryBtn; + AeroButton *penelope2Btn; + AeroButton *mercury2Btn; + AeroButton *samplerate48Btn; + AeroButton *samplerate96Btn; + AeroButton *samplerate192Btn; + AeroButton *samplerate384Btn; + + QList hardwareBtnList; + QList source10MhzBtnList; + QList viewBtnList; + QList sources10Mhz; + QList samplerateBtnList; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_HWInterfaceMode m_hwInterfaceTemp; + QSDR::_DataEngineState m_dataEngineState; + + bool m_firmwareCheck; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_numberOfReceivers; + int m_hpsdrHardware; + int m_socketBufferSize; + + void setupConnections(); + void createSource10MhzExclusiveGroup(); + void createSource122_88MhzExclusiveGroup(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setHPSDRHardware(); + void source10MhzChanged(); + void setNumberOfReceivers(int value); + void disableButtons(); + void enableButtons(); + void firmwareCheckChanged(); + void sampleRateChanged(); + +signals: + void messageEvent(QString message); +}; + +#endif // _CUSDR_HPSDR_WIDGET_H diff --git a/Source/src/cusdr_mainWidget.cpp b/Source/src/cusdr_mainWidget.cpp new file mode 100644 index 0000000..d36f614 --- /dev/null +++ b/Source/src/cusdr_mainWidget.cpp @@ -0,0 +1,2710 @@ +/** +* @file cusdr_mainWidget.cpp +* @brief main window widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-01-06 +*/ + +/* + * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_MAIN +//#define LOG_NETWORKDIALOG + +// use: MAIN_DEBUG +// use: NETWORKDIALOG_DEBUG + +//#include +//#include +//#include +//#include +//#include + +#include "cusdr_mainWidget.h" + + +#define window_height1 600 +#define window_height2 750 +#define window_width1 800 +#define window_width2 1030 +#define btn_width1 56//65 +#define btn_width2 54 +#define btn_width3 48 +#define btn_height1 17 +#define btn_height2 13 +#define btn_height3 16 + + + +/*! + \class MainWindow + \brief This class implements main window of the application. +*/ +/*! + \brief Creates a new #MainWindow with the given \a parent. + This function does following steps: + - set up GUI. + - set up connections. + - find network connections. +*/ +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_cudaPresence(false) + , m_mover(false) + , m_resizePosition(0) +{ + QPalette palette; + QColor color = Qt::black; + color.setAlpha(255); + palette.setColor(QPalette::Window, color); + setPalette(palette); + + setAutoFillBackground(true); + setMouseTracking(true); + setContentsMargins(0, 0, 0, 0); + + m_fullScreen = false; + + // save and reload the windows size and state + m_windowsSettingsFilename = "windowsSettings.ini"; + QSettings settings(QCoreApplication::applicationDirPath() + "/" + m_windowsSettingsFilename, QSettings::IniFormat); + restoreGeometry(settings.value("geometry").toByteArray()); + restoreState(settings.value("windowState").toByteArray()); + + // Dock windows options + setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks); + setMinimumSize(QSize(window_width1, window_height1)); + setStyleSheet(set->getSDRStyle()); + + m_oldSampleRate = set->getSampleRate(); + m_numberOfReceivers = set->getNumberOfReceivers(); + m_alexConfig = set->getAlexConfig(); + m_alexStates = set->getAlexStates(); + m_mercuryAttn = set->getMercuryAttenuators(0); + m_currentHamBand = set->getCurrentHamBand(0); + + m_alexAttnState = 0x03 & (m_alexStates[m_currentHamBand] >> 7); + m_mercuryAttnState = m_mercuryAttn.at(m_currentHamBand); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + // the SDR data engine + m_dataEngine = new DataEngine(this); + + // control widgets + m_serverWidget = new ServerWidget(this); + m_chirpWidget = new ChirpWidget(this); + m_hpsdrTabWidget = new HPSDRTabWidget(this); + m_radioTabWidget = new RadioTabWidget(this); + m_displayTabWidget = new DisplayTabWidget(this); + + m_wbDisplay = 0; + + m_serverWidget->hide(); + m_chirpWidget->hide(); + m_hpsdrTabWidget->hide(); + m_radioTabWidget->hide(); + m_displayTabWidget->hide(); + + MAIN_DEBUG << "main window init done"; +} + +/*! + \brief MainWindow Destructor +*/ +MainWindow::~MainWindow() { +} + +/*! + \brief set up connections. +*/ +void MainWindow::setupConnections() { + + CHECKED_CONNECT_OPT( + set, + SIGNAL(systemMessageEvent(const QString&, int)), + this, + SLOT(showStatusBarMessage(const QString &, int)), + Qt::DirectConnection); + + CHECKED_CONNECT( + m_dataEngine, + SIGNAL(clearSystemMessageEvent()), + this, + SLOT(clearStatusBarMessage())); + + CHECKED_CONNECT( + m_chirpWidget, + SIGNAL(loadFileEvent(QObject *, const QString)), + this, + SLOT(loadWavFile(QObject *, const QString))); + + CHECKED_CONNECT( + m_chirpWidget, + SIGNAL(suspendSignal(QObject *)), + this, + SLOT(suspendSignal(QObject *))); + + CHECKED_CONNECT( + m_chirpWidget, + SIGNAL(startPlaybackSignal(QObject *)), + this, + SLOT(startPlaybackSignal(QObject *))); + + CHECKED_CONNECT( + m_chirpWidget, + SIGNAL(showSettingsDialogSignal(QObject *)), + this, + SLOT(showSettingsDialogSignal(QObject *))); + + /*if (m_cudaPresence) { + + CHECKED_CONNECT( + m_cudaInfoWidget, + SIGNAL(showEvent(QObject *)), + this, + SLOT(showWidgetEvent(QObject *))); + + CHECKED_CONNECT( + m_cudaInfoWidget, + SIGNAL(closeEvent(QObject *)), + this, + SLOT(closeWidgetEvent(QObject *))); + }*/ + + CHECKED_CONNECT( + set, + SIGNAL(cpuLoadChanged(short)), + this, + SLOT(updateStatusBar(short))); + + CHECKED_CONNECT( + set, + SIGNAL(masterSwitchChanged(QObject *, bool)), + this, + SLOT(masterSwitchChanged(QObject *, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(numberOfRXChanged(QObject *, int)), + this, + SLOT(setNumberOfReceivers(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(callsignChanged()), + this, + SLOT(updateTitle())); + + CHECKED_CONNECT( + set, + SIGNAL(showNetworkIO()), + this, + SLOT(showNetworkIODialog())); + + CHECKED_CONNECT( + set, + SIGNAL(showWarning(const QString &)), + this, + SLOT(showWarningDialog(const QString &))); + + CHECKED_CONNECT( + set, + SIGNAL(networkIOComboBoxEntryAdded(QString)), + this, + SLOT(addNetworkIOComboBoxEntry(QString))); + + CHECKED_CONNECT( + set, + SIGNAL(clearNetworkIOComboBoxEntrySignal()), + this, + SLOT(clearNetworkIOComboBoxEntry())); + + CHECKED_CONNECT( + set, + SIGNAL(showRadioPopupChanged(bool)), + this, + SLOT(showRadioPopup(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(txAllowedChanged(QObject *, bool)), + this, + SLOT(setTxAllowed(QObject *, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(agcModeChanged(QObject *, int, AGCMode, bool)), + this, + SLOT(setAGCMode(QObject *, int, AGCMode, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(agcMaximumGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCGain(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(agcFixedGainChanged_dB(QObject *, int, qreal)), + this, + SLOT(setAGCGain(QObject *, int, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(mercuryAttenuatorChanged(QObject *, HamBand, int))); + + CHECKED_CONNECT( + set, + SIGNAL(alexPresenceChanged(bool)), + this, + SLOT(alexPresenceChanged(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(alexConfigurationChanged(quint16)), + this, + SLOT(alexConfigurationChanged(quint16))); + + CHECKED_CONNECT( + set, + SIGNAL(alexStateChanged(HamBand, const QList &)), + this, + SLOT(alexStateChanged(HamBand, const QList &))); +} + +/*! + \brief setup the main window (called in main.cpp): + - create main button group + - create dock widgets + - create mode menus + - setup main layout + - setup connections + - setup dialog windows + - get network interfaces +*/ +void MainWindow::setup() { + + //runFFTWWisdom(); + + // create the big display panel at the top of the application. + createDisplayPanelToolBar(); + + // create the main buttons tool bar + createMainBtnToolBar(); + + // create the status tool bar + createStatusToolBar(); + + // create the mode menu + createModeMenu(); + + // create the view menu + createViewMenu(); + + // create the attenuator menu + createAttenuatorMenu(); + + // the wideband display + m_wbDisplay = new QGLWidebandPanel(this); + + // create the receiver panels + createReceiverPanels(MAX_RECEIVERS); + + // setup the layout for the control widgets, the wideband panel and the receiver panels + setupLayout(); + + // set the main window title + updateTitle(); + + // show the wideband data panel as specified in the settings.ini + if (set->getWidebandData()) { + + wideBandBtn->setEnabled(true); + + if (set->getWidebandStatus()) { + wideBandBtnClickedEvent(); + } + } + + // get the network interfaces + getNetworkInterfaces(); + + // init network IO dialog to HPSDR components + m_netIODialog = new NetworkIODialog(); + + // init warning dialog + m_warningDialog = new WarningDialog(); + + // setup connection for the NIC lists of the server and hpsdr widgets. + // We need to add these connections after detecting the network interfaces. + m_serverWidget->addNICChangedConnection(); + m_hpsdrTabWidget->addNICChangedConnection(); + + // experimental: + // check for OpenCL devices + //QList clDevices = QCLDevice::allDevices(); + //if (clDevices.length() == 0) + // showMessage("[main]: no OpenCL devices found."); + + //else { + + // m_message = "[main]: found %1 OpenCL device(s)."; + // showStatusBarMessage(m_message.arg(clDevices.length()), 5000); + // //QString clNo = QString::number(m_clDevices.length()); + //} + //set->setOpenCLDevices(clDevices); + + // set the centralwidget as the central widget of the main window, + // i.e., we have a second QMainWindow as the central widget. + setCentralWidget(centralwidget); + + // update the display panel + m_oglDisplayPanel->updateGL(); + + // set the Alex configuration + alexConfigurationChanged(m_alexConfig); + + // set the value of the attenuator(s) + setAttenuatorButton(); + + m_agcMode = set->getAGCMode(0); + + // initialize all Signal/Slot connections + setupConnections(); + + updateFromSettings(); +} + +//void MainWindow::runFFTWWisdom() { +// +// QString directory = QDir::currentPath(); +// +// m_currentDir = QDir(directory); +// qDebug() << m_currentDir; +// +// if (m_currentDir.exists("wisdom")) { +// +// qDebug() << "wisdom exists !"; +// return; +// } +// else { +// +// qDebug() << "wisdom does not exist - running fftw-wisdom.exe ..."; +// QProcess process; +// process.start("fftwf-wisdom.exe"); +// process.waitForFinished(); +// } +//} + +/*! + \brief updates the OpenGL widget. +*/ +void MainWindow::update() { + + //if (m_oglWidget) + // m_oglWidget->update(); +} + +/*! + \brief set up the main layout. +*/ +void MainWindow::setupLayout() { + + centralwidget = new QMainWindow(this); + centralwidget->setWindowFlags(Qt::Widget); + centralwidget->setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks); + centralwidget->setStyleSheet(set->getMainWindowStyle()); + centralwidget->setContextMenuPolicy(Qt::NoContextMenu); //setStyleSheet(set->getMenuStyle()); + + // radio control widget + QDockWidget *dock = new QDockWidget(tr("Radio Ctrl"), this); + dock->setObjectName("RadioCtrl"); + dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dock->setFeatures(QDockWidget::NoDockWidgetFeatures); + //dock->setFeatures(QDockWidget::DockWidgetFloatable); + dock->setStyleSheet(set->getDockStyle()); + dock->setMaximumWidth(245); + dock->setMinimumWidth(245); + dock->setWidget(m_radioTabWidget); + dockWidgetList.append(dock); + + addDockWidget(Qt::RightDockWidgetArea, dock); + dock->hide(); + + // server control widget + dock = new QDockWidget(tr("Server Ctrl"), this); + dock->setObjectName("ServerCtrl"); + dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dock->setFeatures(QDockWidget::NoDockWidgetFeatures); + //dock->setFeatures(QDockWidget::DockWidgetFloatable); + dock->setStyleSheet(set->getDockStyle()); + dock->setMaximumWidth(245); + dock->setMinimumWidth(245); + dock->setWidget(m_serverWidget); + dockWidgetList.append(dock); + + addDockWidget(Qt::RightDockWidgetArea, dock); + dock->hide(); + + // HPSDR hardware control widget + dock = new QDockWidget(tr("HPSDR Ctrl"), this); + dock->setObjectName("HPSDRCtrl"); + dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dock->setFeatures(QDockWidget::NoDockWidgetFeatures); + //dock->setFeatures(QDockWidget::DockWidgetFloatable); + dock->setStyleSheet(set->getDockStyle()); + dock->setMaximumWidth(245); + dock->setMinimumWidth(245); + dock->setWidget(m_hpsdrTabWidget); + dockWidgetList.append(dock); + + addDockWidget(Qt::RightDockWidgetArea, dock); + dock->hide(); + + // chirp mode control widget + dock = new QDockWidget(tr("Chirp Ctrl"), this); + dock->setObjectName("ChirpCtrl"); + dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dock->setFeatures(QDockWidget::NoDockWidgetFeatures); + dock->setStyleSheet(set->getDockStyle()); + dock->setMaximumWidth(245); + dock->setMinimumWidth(245); + dock->setWidget(m_chirpWidget); + dockWidgetList.append(dock); + + addDockWidget(Qt::RightDockWidgetArea, dock); + dock->hide(); + + // display control widget + dock = new QDockWidget(tr("Display Ctrl"), this); + dock->setObjectName("DisplayCtrl"); + dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dock->setFeatures(QDockWidget::NoDockWidgetFeatures); + dock->setStyleSheet(set->getDockStyle()); + dock->setMaximumWidth(245); + dock->setMinimumWidth(245); + dock->setWidget(m_displayTabWidget); + dockWidgetList.append(dock); + + addDockWidget(Qt::RightDockWidgetArea, dock); + dock->hide(); + + // receiver and wideband panel docks; + // set receiver 0 as the main receiver + centralwidget->setCentralWidget(rxWidgetList.at(0)); + + // wideband panel dock window + widebandDock = new QDockWidget(tr("Wideband"), this); + widebandDock->setObjectName("Wideband"); + widebandDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); + widebandDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); + widebandDock->setStyleSheet(set->getDockStyle()); + widebandDock->setWidget(m_wbDisplay); + + centralwidget->addDockWidget(Qt::TopDockWidgetArea, widebandDock); + widebandDock->hide(); + + CHECKED_CONNECT( + widebandDock, + SIGNAL(visibilityChanged(bool)), + this, + SLOT(widebandVisibilityChanged(bool))); + + // receiver dock windows + for (int i = 1; i < MAX_RECEIVERS; i++) { + + QString str = "Receiver "; + QString num = QString::number(i+1); + str.append(num); + dock = new QDockWidget(str, this); + widebandDock->setObjectName(str); + dock->setStyleSheet(set->getDockStyle()); + dock->setWidget(rxWidgetList.at(i)); + rxDockWidgetList.append(dock); + + centralwidget->addDockWidget(Qt::BottomDockWidgetArea, dock); + dock->hide(); + + rxVolumeList << 0.0f; + //viewMenu->addAction(dock->toggleViewAction()); + } + + // the outline of the receiver panels + for (int i = 0; i < (int)(MAX_RECEIVERS-1)/2; i++) { + + centralwidget->splitDockWidget(rxDockWidgetList.at(i), rxDockWidgetList.at(i+3), Qt::Vertical); + } + + //viewMenu->addAction(dock->toggleViewAction()); +} + +/*! + \brief create the receiver panels. +*/ +void MainWindow::createReceiverPanels(int rx) { + + rxWidgetList.clear(); + + for (int i = 0; i < rx; i++) { + + QGLReceiverPanel* rxPanel = new QGLReceiverPanel(this, i); + rxWidgetList.append(rxPanel); + } +} + +/*! + \brief create the status tool bar. +*/ +void MainWindow::createStatusToolBar() { + + QDateTime dateTime = QDateTime::currentDateTime(); + m_dateTimeString = dateTime.toString(); + m_dateTimeString.append(" (loc)"); + + m_cpuLoadString = "CPU load: "; + m_cpuLoadLabel = new QLabel(m_cpuLoadString, this); + m_cpuLoadLabel->setStyleSheet(set->getLabelStyle()); + + m_dateTimeLabel = new QLabel(m_dateTimeString, this); + m_dateTimeLabel->setStyleSheet(set->getLabelStyle()); + + statusBar()->setStyleSheet(set->getStatusbarStyle()); + statusBar()->addPermanentWidget(m_cpuLoadLabel); + statusBar()->insertPermanentWidget(1, m_dateTimeLabel, 0); +} + +/*! + \brief update the staus tool bar content with + the CPU load and the local date & time. +*/ +void MainWindow::updateStatusBar(short load) { + + QString str = "CPU load: %1 % \t"; + m_cpuLoadLabel->setText(str.arg(load)); + + QDateTime dateTime = QDateTime::currentDateTime(); + m_dateTimeString = dateTime.toString(); + m_dateTimeString.append(" (loc)"); + m_dateTimeLabel->setText(m_dateTimeString); + + statusBar()->update(); +} + +/*! + \brief create the display panel tool bar. +*/ +void MainWindow::createDisplayPanelToolBar() { + + displayPanelToolBar = new QToolBar(tr("Display Panel"), this); + displayPanelToolBar->setObjectName("DisplayPanel"); + displayPanelToolBar->setAllowedAreas(Qt::TopToolBarArea); + displayPanelToolBar->setMovable(false); + displayPanelToolBar->setStyleSheet(set->getDisplayToolbarStyle()); + + // The display panel has the displayPanelToolBar as parent. + m_oglDisplayPanel = new OGLDisplayPanel(displayPanelToolBar); + + displayPanelToolBar->addWidget(m_oglDisplayPanel); + + // add displayPanelToolBar to the main window. + addToolBar(displayPanelToolBar); + addToolBarBreak(Qt::TopToolBarArea); +} + +/*! + \brief create the main button tool bar. +*/ +void MainWindow::createMainBtnToolBar() { + + mainBtnToolBar = new QToolBar(tr("Main Buttons"), this); + mainBtnToolBar->setObjectName("MainButtons"); + //mainBtnToolBar->setAllowedAreas(Qt::TopToolBarArea); + mainBtnToolBar->setMovable(false); + mainBtnToolBar->setStyleSheet(set->getMainBtnToolbarStyle()); + + m_buttonWidget = new QWidget(this); + + QColor btnCol = QColor(230, 230, 230); +// QHBoxLayout *firstBtnLayout = new QHBoxLayout; +// firstBtnLayout->setSpacing(0); +// firstBtnLayout->setMargin(0); + + startBtn = new AeroButton("Start", this); + startBtn->setRoundness(10); + startBtn->setFont(m_fonts.normalFont); + startBtn->setTextColor(btnCol); + startBtn->setFixedSize(btn_width1, btn_height1); + + CHECKED_CONNECT( + startBtn, + SIGNAL(clicked()), + this, + SLOT(startButtonClickedEvent())); + + /*ctrlDisplayBtn = new AeroButton("Radio", this); + ctrlDisplayBtn->setRoundness(10); + ctrlDisplayBtn->setFixedSize(btn_width1, btn_height1); + ctrlDisplayBtn->setBtnState(AeroButton::ON); + + CHECKED_CONNECT( + ctrlDisplayBtn, + SIGNAL(clicked()), + this, + SLOT(ctrlDisplayBtnClickedEvent()));*/ + + rxCtrlBtn = new AeroButton("Radio Ctrl", this); + rxCtrlBtn->setRoundness(10); + rxCtrlBtn->setFont(m_fonts.normalFont); + rxCtrlBtn->setTextColor(btnCol); + rxCtrlBtn->setFixedSize(btn_width1, btn_height1); + mainBtnList.append(rxCtrlBtn); + + //if (m_serverMode == QSDR::ExternalDSP) + // rxCtrlBtn->setEnabled(false); + + CHECKED_CONNECT( + rxCtrlBtn, + SIGNAL(clicked()), + this, + SLOT(widgetBtnClickedEvent())); + + serverBtn = new AeroButton("Server", this); + serverBtn->setRoundness(10); + serverBtn->setFont(m_fonts.normalFont); + serverBtn->setTextColor(btnCol); + serverBtn->setFixedSize(btn_width1, btn_height1); + mainBtnList.append(serverBtn); + + CHECKED_CONNECT( + serverBtn, + SIGNAL(clicked()), + this, + SLOT(widgetBtnClickedEvent())); + + hpsdrBtn = new AeroButton("HPSDR", this); + hpsdrBtn->setRoundness(10); + hpsdrBtn->setFont(m_fonts.normalFont); + hpsdrBtn->setTextColor(btnCol); + hpsdrBtn->setFixedSize(btn_width1, btn_height1); + mainBtnList.append(hpsdrBtn); + + CHECKED_CONNECT( + hpsdrBtn, + SIGNAL(clicked()), + this, + SLOT(widgetBtnClickedEvent())); + + chirpBtn = new AeroButton("Chirp", this); + chirpBtn->setRoundness(10); + chirpBtn->setFont(m_fonts.normalFont); + chirpBtn->setTextColor(btnCol); + chirpBtn->setFixedSize(btn_width1, btn_height1); + mainBtnList.append(chirpBtn); + + if (m_serverMode != QSDR::ChirpWSPR) + chirpBtn->setEnabled(false); + + CHECKED_CONNECT( + chirpBtn, + SIGNAL(clicked()), + this, + SLOT(widgetBtnClickedEvent())); + + wideBandBtn = new AeroButton("Wideband", this); + wideBandBtn->setRoundness(10); + wideBandBtn->setFont(m_fonts.normalFont); + wideBandBtn->setTextColor(btnCol); + wideBandBtn->setFixedSize(btn_width1, btn_height1); + wideBandBtn->setEnabled(false); + //mainBtnList.append(wideBandBtn); + + if (m_serverMode == QSDR::ChirpWSPR) + wideBandBtn->setEnabled(false); + + CHECKED_CONNECT( + wideBandBtn, + SIGNAL(clicked()), + this, + SLOT(wideBandBtnClickedEvent())); + + //openclBtn = new AeroButton("OpenCL", this); + //openclBtn->setRoundness(10); + //openclBtn->setFixedSize(btn_width1, btn_height1); + //mainBtnList.append(openclBtn); + + //if (m_cudaPresence) { + // + // mainBtnList.append(cudaBtn); + + // CHECKED_CONNECT( + // cudaBtn, + // SIGNAL(clicked()), + // this, + // SLOT(widgetBtnClickedEvent())); + + // //if (set->getCudaDevices() == 0) + //} + //else { + + // cudaBtn->setEnabled(false); + //} + + //if (set->getCudaDevices() == 0) { + + // cudaGraphBtn->setEnabled(false); + + // /*CHECKED_CONNECT( + // cudaGraphBtn, + // SIGNAL(clicked()), + // this, + // SLOT(widgetBtnClickedEvent())); + // CHECKED_CONNECT(cudaTestBtn, + // SIGNAL(clicked()), + // this, + // SLOT(cudaTestBtnClickedEvent()));*/ + //} + + displayBtn = new AeroButton("Display", this); + displayBtn->setRoundness(10); + displayBtn->setFont(m_fonts.normalFont); + displayBtn->setTextColor(btnCol); + displayBtn->setFixedSize(btn_width1, btn_height1); + mainBtnList.append(displayBtn); + + CHECKED_CONNECT( + displayBtn, + SIGNAL(clicked()), + this, + SLOT(widgetBtnClickedEvent())); + + QColor col = QColor(90, 90, 90); + + nullBtn = new AeroButton(this); + nullBtn->setRoundness(0); + nullBtn->setFixedHeight(btn_height1); + nullBtn->setHighlight(col); + nullBtn->setEnabled(false); + + // +Rx disabled for now, requires addReceiver to be implemented + plusRxBtn = new AeroButton("+Rx", this); + plusRxBtn->setRoundness(10); + plusRxBtn->setFont(m_fonts.normalFont); + plusRxBtn->setTextColor(btnCol); + plusRxBtn->setFixedSize(btn_width1, btn_height1); + plusRxBtn->setEnabled(false); + + CHECKED_CONNECT( + plusRxBtn, + SIGNAL(clicked()), + this, + SLOT(addReceiver())); + + viewBtn = new AeroButton("View Rx", this); + viewBtn->setRoundness(10); + viewBtn->setFont(m_fonts.normalFont); + viewBtn->setTextColor(btnCol); + viewBtn->setFixedSize(btn_width1, btn_height1); + + modeBtn = new AeroButton("Mode", this); + modeBtn->setRoundness(10); + modeBtn->setFont(m_fonts.normalFont); + modeBtn->setTextColor(btnCol); + modeBtn->setFixedSize(btn_width1, btn_height1); + + quitBtn = new AeroButton("Quit", this); + quitBtn->setRoundness(10); + quitBtn->setFont(m_fonts.normalFont); + quitBtn->setTextColor(btnCol); + quitBtn->setFixedSize(btn_width3, btn_height1); + + CHECKED_CONNECT( + quitBtn, + SIGNAL(clicked()), + this, + SLOT(closeMainWindow())); + +// firstBtnLayout->addWidget(startBtn); +// //firstBtnLayout->addWidget(serverLogBtn); +// firstBtnLayout->addWidget(rxCtrlBtn); +// firstBtnLayout->addWidget(serverBtn); +// firstBtnLayout->addWidget(hpsdrBtn); +// firstBtnLayout->addWidget(chirpBtn); +// firstBtnLayout->addWidget(wideBandBtn); +// //firstBtnLayout->addWidget(openclBtn); +// firstBtnLayout->addWidget(displayBtn); +// firstBtnLayout->addWidget(nullBtn); +// //firstBtnLayout->addStretch(); +// firstBtnLayout->addWidget(viewBtn); +// firstBtnLayout->addWidget(modeBtn); +// firstBtnLayout->addWidget(quitBtn); + +// QHBoxLayout *firstBtnLayout = new QHBoxLayout; +// firstBtnLayout->setSpacing(0); +// firstBtnLayout->setMargin(0); +// +// firstBtnLayout->addWidget(startBtn); +// //firstBtnLayout->addWidget(serverLogBtn); +// firstBtnLayout->addWidget(rxCtrlBtn); +// firstBtnLayout->addWidget(serverBtn); +// firstBtnLayout->addWidget(hpsdrBtn); +// firstBtnLayout->addWidget(chirpBtn); +// firstBtnLayout->addWidget(wideBandBtn); +// //firstBtnLayout->addWidget(openclBtn); +// firstBtnLayout->addWidget(displayBtn); +// firstBtnLayout->addWidget(nullBtn); +// //firstBtnLayout->addStretch(); +// firstBtnLayout->addWidget(viewBtn); +// firstBtnLayout->addWidget(modeBtn); +// firstBtnLayout->addWidget(quitBtn); + +// QHBoxLayout *secondBtnLayout = new QHBoxLayout; +// secondBtnLayout->setSpacing(0); +// secondBtnLayout->setMargin(0); + + int fontMaxWidth = m_fonts.smallFontMetrics->boundingRect("100 % ").width(); + int vol = (int)(set->getMainVolume(0) * 100); + + m_volumeSlider = new QSlider(Qt::Horizontal, this); + m_volumeSlider->setTickPosition(QSlider::NoTicks); + m_volumeSlider->setFixedSize(100, 14); + m_volumeSlider->setSingleStep(1); + m_volumeSlider->setRange(0, 100); + m_volumeSlider->setValue(vol); + m_volumeSlider->setStyleSheet(set->getVolSliderStyle()); + + CHECKED_CONNECT( + m_volumeSlider, + SIGNAL(valueChanged(int)), + this, + SLOT(setMainVolume(int))); + + m_volumeLabel = new QLabel("Vol:", this); + m_volumeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_volumeLabel->setStyleSheet(set->getLabelStyle()); + + QString str = "%1 %"; + m_volLevelLabel = new QLabel(str.arg(vol, 2, 10, QLatin1Char(' ')), this); + m_volLevelLabel->setFont(m_fonts.smallFont); + m_volLevelLabel->setFixedSize(fontMaxWidth, 14); + m_volLevelLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_volLevelLabel->setStyleSheet(set->getSliderLabelStyle()); + + + int agcMaxGain = (int) set->getAGCMaximumGain_dB(0); + //MAIN_DEBUG << "agcMaximumGain = " << agcMaxGain; + m_agcGainSlider = new QSlider(Qt::Horizontal, this); + m_agcGainSlider->setTickPosition(QSlider::NoTicks); + m_agcGainSlider->setFixedSize(100, 14); + m_agcGainSlider->setSingleStep(1); + m_agcGainSlider->setRange(-20, 120); + m_agcGainSlider->setValue(agcMaxGain); + m_agcGainSlider->setStyleSheet(set->getVolSliderStyle()); + + CHECKED_CONNECT( + m_agcGainSlider, + SIGNAL(valueChanged(int)), + this, + SLOT(setAGCGain(int))); + + m_agcGainLabel = new QLabel("", this); + m_agcGainLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_agcGainLabel->setStyleSheet(set->getLabelStyle()); + if(m_agcMode == (AGCMode) agcOFF) + m_agcGainLabel->setText("AGC-F:"); + else + m_agcGainLabel->setText("AGC-G:"); + + fontMaxWidth = m_fonts.smallFontMetrics->boundingRect(" 120 dB").width(); + str = " %1 dB"; + m_agcGainLevelLabel = new QLabel(str.arg(agcMaxGain + 0, 2, 10, QLatin1Char(' ')), this); + m_agcGainLevelLabel->setFont(m_fonts.smallFont); + m_agcGainLevelLabel->setFixedSize(fontMaxWidth, 14); + m_agcGainLevelLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + m_agcGainLevelLabel->setStyleSheet(set->getSliderLabelStyle()); + + + moxBtn = new AeroButton("MOX", this); + moxBtn->setRoundness(10); + moxBtn->setFont(m_fonts.normalFont); + moxBtn->setTextColor(btnCol); + moxBtn->setFixedSize(btn_width1, btn_height3); + moxBtn->setEnabled(false); + col = QColor(200, 100, 100); + moxBtn->setColor(col); + col = QColor(200, 200, 100); + moxBtn->setHighlight(col); + col = QColor(250, 100, 100); + moxBtn->setColorOn(col); + moxBtn->setBtnState(AeroButton::OFF); + + tunBtn = new AeroButton("Tune", this); + tunBtn->setRoundness(10); + tunBtn->setFont(m_fonts.normalFont); + tunBtn->setTextColor(btnCol); + tunBtn->setFixedSize(btn_width1, btn_height3); + tunBtn->setEnabled(false); + col = QColor(200, 100, 100); + tunBtn->setColor(col); + col = QColor(200, 200, 100); + tunBtn->setHighlight(col); + col = QColor(250, 100, 100); + tunBtn->setColorOn(col); + tunBtn->setBtnState(AeroButton::OFF); + + if (set->getPenelopePresence() || set->getPennyLanePresence() || (m_hwInterface == QSDR::Hermes)) { + + moxBtn->setEnabled(true); + tunBtn->setEnabled(true); + } + else { + + moxBtn->setEnabled(false); + tunBtn->setEnabled(false); + } + + alexBtn = new AeroButton("Alex Auto", this); + alexBtn->setRoundness(10); + alexBtn->setFont(m_fonts.normalFont); + alexBtn->setTextColor(btnCol); + alexBtn->setFixedSize(btn_width1, btn_height3); + alexBtn->setBtnState(AeroButton::ON); + if (set->getAlexPresence()) + alexBtn->setEnabled(true); + else + alexBtn->setEnabled(false); + + CHECKED_CONNECT( + alexBtn, + SIGNAL(clicked()), + this, + SLOT(alexBtnClickedEvent())); + + attenuatorBtn = new AeroButton("Attenuator", this); + attenuatorBtn->setRoundness(10); + attenuatorBtn->setFont(m_fonts.normalFont); + attenuatorBtn->setTextColor(btnCol); + attenuatorBtn->setFixedSize(btn_width1, btn_height1); + + muteBtn = new AeroButton("Mute", this); + muteBtn->setRoundness(10); + muteBtn->setFont(m_fonts.normalFont); + muteBtn->setTextColor(btnCol); + muteBtn->setFixedSize(btn_width3, btn_height1); + + CHECKED_CONNECT( + muteBtn, + SIGNAL(clicked()), + this, + SLOT(muteBtnClickedEvent())); + +// lastFreqBtn = new AeroButton(" ", this); +// lastFreqBtn->setRoundness(10); +// lastFreqBtn->setFixedSize(btn_width1, btn_height3); +// lastFreqBtn->setBtnState(AeroButton::OFF); +// +// CHECKED_CONNECT( +// lastFreqBtn, +// SIGNAL(clicked()), +// this, +// SLOT(getLastFrequency())); + + QHBoxLayout *firstBtnLayout = new QHBoxLayout; + firstBtnLayout->setSpacing(0); + firstBtnLayout->setMargin(0); + + firstBtnLayout->addWidget(startBtn); + //firstBtnLayout->addWidget(serverLogBtn); + firstBtnLayout->addWidget(rxCtrlBtn); + firstBtnLayout->addWidget(serverBtn); + firstBtnLayout->addWidget(hpsdrBtn); + firstBtnLayout->addWidget(chirpBtn); + firstBtnLayout->addWidget(wideBandBtn); + //firstBtnLayout->addWidget(openclBtn); + firstBtnLayout->addWidget(displayBtn); + firstBtnLayout->addWidget(nullBtn); + firstBtnLayout->addWidget(plusRxBtn); + firstBtnLayout->addWidget(viewBtn); + firstBtnLayout->addWidget(modeBtn); + firstBtnLayout->addWidget(quitBtn); + + + QHBoxLayout* secondBtnLayout = new QHBoxLayout; + secondBtnLayout->setSpacing(0); + secondBtnLayout->setMargin(0); + + secondBtnLayout->addWidget(moxBtn); + secondBtnLayout->addWidget(tunBtn); + secondBtnLayout->addStretch(); + secondBtnLayout->addWidget(alexBtn); + secondBtnLayout->addWidget(attenuatorBtn); + secondBtnLayout->addSpacing(5); + secondBtnLayout->addWidget(m_agcGainLabel); + secondBtnLayout->addWidget(m_agcGainSlider); + secondBtnLayout->addWidget(m_agcGainLevelLabel); + secondBtnLayout->addSpacing(10); + secondBtnLayout->addWidget(m_volumeLabel); + secondBtnLayout->addWidget(m_volumeSlider); + secondBtnLayout->addWidget(m_volLevelLabel); + secondBtnLayout->addSpacing(2); + secondBtnLayout->addWidget(muteBtn); + //secondBtnLayout->addWidget(lastFreqBtn); + + /*QHBoxLayout *thirdBtnLayout = new QHBoxLayout; + thirdBtnLayout->setSpacing(0); + thirdBtnLayout->setMargin(0); + + thirdBtnLayout->addWidget(lockPanBtn); + thirdBtnLayout->addStretch();*/ + + QVBoxLayout* btnLayout = new QVBoxLayout; + btnLayout->setSpacing(0); + btnLayout->setMargin(0); + btnLayout->addLayout(firstBtnLayout); + btnLayout->addLayout(secondBtnLayout); + //btnLayout->addLayout(thirdBtnLayout); + + m_buttonWidget->setLayout(btnLayout); + + mainBtnToolBar->addWidget(m_buttonWidget); + + addToolBar(mainBtnToolBar); +} + +/*! + \brief create the Mode menu. +*/ +void MainWindow::createModeMenu() { + + modeMenu = new QMenu(this); + modeMenu->setStyleSheet(set->getMenuStyle()); + modeBtn->setMenu(modeMenu); + + modeActionGroup = new QActionGroup(this); + modeActionGroup->setExclusive(true); + +// noServerModeAction = modeActionGroup->addAction(tr("QtDSP")); +// noServerModeAction->setCheckable(true); +// noServerModeAction->setChecked(m_serverMode == QSDR::QtDSP); + + sdrModeAction = modeActionGroup->addAction(tr("SDR")); + sdrModeAction->setCheckable(true); + sdrModeAction->setChecked(m_serverMode == QSDR::SDRMode); + + chirpWSPRAction = modeActionGroup->addAction(tr("ChirpWSPR")); + chirpWSPRAction->setCheckable(false); + chirpWSPRAction->setChecked(m_serverMode == QSDR::ChirpWSPR); + + modeMenu->addActions(modeActionGroup->actions()); + + if (sdrModeAction->isCheckable()) { + + CHECKED_CONNECT( + sdrModeAction, + SIGNAL(triggered(bool)), + this, + SLOT(setSDRMode(bool))); + } + + if (chirpWSPRAction->isCheckable()) { + + CHECKED_CONNECT( + chirpWSPRAction, + SIGNAL(triggered(bool)), + this, + SLOT(setChirpWSPRMode(bool))); + } + +} + +/*! + \brief create the receiver's dock windows view menu. +*/ +void MainWindow::createViewMenu() { + + viewMenu = new QMenu(this); + viewMenu->setStyleSheet(set->getMenuStyle()); + viewBtn->setMenu(viewMenu); +} + +/*! + \brief create the attenuator menu. +*/ +void MainWindow::createAttenuatorMenu() { + + attenuatorMenu = new QMenu(this); + attenuatorMenu->setStyleSheet(set->getMenuStyle()); + attenuatorBtn->setMenu(attenuatorMenu); + + mercuryAttn_0dBAction = attenuatorMenu->addAction(tr("Mercury Attn 0 dB")); + mercuryAttn_0dBAction->setCheckable(true); + mercuryAttnActionList.append(mercuryAttn_0dBAction); + + mercuryAttn_20dBAction = attenuatorMenu->addAction(tr("Mercury Attn -20 dB")); + mercuryAttn_20dBAction->setCheckable(true); + mercuryAttnActionList.append(mercuryAttn_20dBAction); + + attenuatorMenu->addSeparator(); + alexAttn_0dBAction = attenuatorMenu->addAction(tr("Alex Attn 0 dB")); + alexAttn_0dBAction->setCheckable(true); + alexAttnActionList.append(alexAttn_0dBAction); + + alexAttn_10dBAction = attenuatorMenu->addAction(tr("Alex Attn -10 dB")); + alexAttn_10dBAction->setCheckable(true); + alexAttnActionList.append(alexAttn_10dBAction); + + alexAttn_20dBAction = attenuatorMenu->addAction(tr("Alex Attn -20 dB")); + alexAttn_20dBAction->setCheckable(true); + alexAttnActionList.append(alexAttn_20dBAction); + + alexAttn_30dBAction = attenuatorMenu->addAction(tr("Alex Attn -30 dB")); + alexAttn_30dBAction->setCheckable(true); + alexAttnActionList.append(alexAttn_30dBAction); + + if (mercuryAttn_0dBAction->isCheckable()) { + + CHECKED_CONNECT( + mercuryAttn_0dBAction, + SIGNAL(triggered(bool)), + this, + SLOT(setAttenuator())); + } + + if (mercuryAttn_20dBAction->isCheckable()) { + + CHECKED_CONNECT( + mercuryAttn_20dBAction, + SIGNAL(triggered(bool)), + this, + SLOT(setAttenuator())); + } + + if (alexAttn_0dBAction->isCheckable()) { + + CHECKED_CONNECT( + alexAttn_0dBAction, + SIGNAL(triggered(bool)), + this, + SLOT(setAttenuator())); + } + + if (alexAttn_10dBAction->isCheckable()) { + + CHECKED_CONNECT( + alexAttn_10dBAction, + SIGNAL(triggered(bool)), + this, + SLOT(setAttenuator())); + } + + if (alexAttn_20dBAction->isCheckable()) { + + CHECKED_CONNECT( + alexAttn_20dBAction, + SIGNAL(triggered(bool)), + this, + SLOT(setAttenuator())); + } + + if (alexAttn_30dBAction->isCheckable()) { + + CHECKED_CONNECT( + alexAttn_30dBAction, + SIGNAL(triggered(bool)), + this, + SLOT(setAttenuator())); + } +} + +//******************************************************************************* + +/*! + \brief the master switch functionality. + - starts/stops the data engine. + - starts/stops the server if in \a QSDR::ExternalDSP mode. +*/ +void MainWindow::masterSwitchChanged( + QObject *sender, /*!<[in] the sender of the signal. */ + bool power /*!<[in] power on or off*/ +) { + Q_UNUSED(sender) + + if (power) { + + if (m_dataEngine->initDataEngine()) { // start data engine + + //if (m_serverMode == QSDR::ExternalDSP && !m_hpsdrServer->startServer()) + // m_hpsdrServer->stopServer(); + return; + } + else { + + set->setMainPower(this, false); + startButtonClickedEvent(); + return; + } + } + else { + + m_dataEngine->stop(); + + //if (m_serverMode == QSDR::ExternalDSP) + // m_hpsdrServer->stopServer(); + set->setMainPower(this, false); + } +} + +/*! + \brief set the system state according to + - \a QSDR::_ServerMode, + - \a QSDR::_HWInterfaceMode, + - \a QSDR::_DataEngineState. +*/ +void MainWindow::systemStateChanged( + QObject *sender, /*!<[in] the sender of the signal. */ + QSDR::_Error err, /*!<[in] error state. */ + QSDR::_HWInterfaceMode hwmode, /*!<[in] HPSDR interface (Metis, Hermes, none). */ + QSDR::_ServerMode mode, /*!<[in] server mode. */ + QSDR::_DataEngineState state /*!<[in] data engine state. */ +) { + Q_UNUSED (sender) + Q_UNUSED (err) + + //if (sender == this) return; + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; + + //if (!modeBtn->isEnabled() && m_dataEngineState == QSDR::DataEngineDown) + // modeBtn->setEnabled(true); + modeBtn->setEnabled(m_dataEngineState == QSDR::DataEngineDown); + moxBtn->setEnabled(m_hwInterface == QSDR::Hermes); + tunBtn->setEnabled(m_hwInterface == QSDR::Hermes); + + /* + if (state == QSDR::DataEngineUp) { + + m_dataEngineState = QSDR::DataEngineUp; + modeBtn->setEnabled(false); + } + else + if (state == QSDR::DataEngineDown) { + + m_dataEngineState = QSDR::DataEngineDown; + modeBtn->setEnabled(true); + //setCurrentReceiver(0); + } + */ +} + +void MainWindow::setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + m_dataEngine->io.networkIOMutex.lock(); + set->setSystemState(this, err, hwmode, mode, state); + m_dataEngine->io.networkIOMutex.unlock(); +} + +/*! + \brief show a temporary message on the status bar. +*/ +void MainWindow::showStatusBarMessage(const QString &msg, int time) { + + statusBar()->showMessage(msg, time); +} + +/*! + \brief clear the temporary status message +*/ +void MainWindow::clearStatusBarMessage() { + + statusBar()->clearMessage(); +} + +/*! + \brief closes the application and shut down all engines. +*/ +void MainWindow::closeMainWindow() { + + if (set->getMainPower()) + startButtonClickedEvent(); + close(); +} + +/*! + \brief maximizes/minimizes the main window. +*/ +void MainWindow::maximizeMainWindow() { + + if (isMaximized()) { + + //m_titlebar->maxBtn->setIcon(QIcon(QString::fromUtf8(":/img/maximize_high.png")));//, QSize(), QIcon::Normal, QIcon::Off); + //m_titlebar->maxBtn->update(); + showNormal(); + } + else { + + //m_titlebar->maxBtn->setIcon(QIcon(QString::fromUtf8(":/img/minimize_high.png")));//, QSize(), QIcon::Normal, QIcon::Off); + //m_titlebar->maxBtn->update(); + showMaximized(); + } +} + +/*! + \brief maximizes/minimizes the main window and hide/show titlebar. +*/ +void MainWindow::setMainWindowGeometry() { + + if (isMaximized()) { + + setWindowFlags(Qt::Widget); + //this->move(m_oldPosition); + this->setGeometry(m_oldPosition.x(), m_oldPosition.y(), m_oldSize.width(), m_oldSize.height()); + showNormal(); + } + else { + + setWindowFlags(Qt::FramelessWindowHint); + + m_oldSize = this->size(); + m_oldPosition = this->pos(); + QPoint pos = m_oldPosition; + + if (pos.x() < 0) + pos.setX(0); + if (pos.y() < 0) + pos.setY(0); + + this->move(pos); + this->show(); + showMaximized(); + } +} + +/*! + \brief sets full screen operation. +*/ +void MainWindow::setFullScreen() { + + if (m_fullScreen) + this->showNormal(); + else + this->showFullScreen(); +} + +void MainWindow::showRadioPopup(bool value) { + + Q_UNUSED (value) + + //m_radioPopupWidget->showPopupWidget(this, QCursor::pos()); +} + +/*! + \brief updates entries from the ini-file. +*/ +void MainWindow::updateFromSettings() { + +} + +/*! + \brief implements the Radio-display button functionality which opens/closes the radio control widget. +*/ +void MainWindow::ctrlDisplayBtnClickedEvent() { + + if (m_oglDisplayPanel->isVisible()) { + + m_oglDisplayPanel->setVisible(false); + ctrlDisplayBtn->setBtnState(AeroButton::OFF); + } + else { + + m_oglDisplayPanel->setVisible(true); + ctrlDisplayBtn->setBtnState(AeroButton::ON); + } +} + +/*! + \brief implements various Button functionalities. +*/ +void MainWindow::widgetBtnClickedEvent() { + + AeroButton *button = qobject_cast(sender()); + int on = mainBtnList.indexOf(button); + + //foreach(QWidget *widget, widgetList) { + foreach(QDockWidget *dockWidget, dockWidgetList) { + + //int off = widgetList.indexOf(widget); + int off = dockWidgetList.indexOf(dockWidget); + + if (dockWidget->isVisible()) { + + dockWidget->hide(); + mainBtnList.at(off)->setBtnState(AeroButton::OFF); + mainBtnList.at(off)->update(); + } + else if (on == off) { + + button->setBtnState(AeroButton::ON); + button->update(); + dockWidgetList.at(on)->show(); + } + } +} + +/*! + \brief implements the Start/Stop functionality of the Start/Stop button. +*/ +void MainWindow::startButtonClickedEvent() { + + if (startBtn->btnState() == AeroButton::OFF) { + + startBtn->setBtnState(AeroButton::ON); + + QColor col = QColor(180, 0, 0); + startBtn->setColorOn(col); + + col = QColor(250, 0, 0); + startBtn->setHighlight(col); + startBtn->setText("Stop"); + set->setMainPower(this, true); + } + else if (startBtn->btnState() == AeroButton::ON) { + + startBtn->setBtnState(AeroButton::OFF); + + QColor col = QColor(0x91, 0xeb, 0xff); + startBtn->setHighlight(col); + startBtn->setText("Start"); + set->saveSettings(); + set->setMainPower(this, false); + + if (muteBtn->btnState() == AeroButton::ON) { + + muteBtn->setBtnState(AeroButton::OFF); + muteBtn->update(); + + m_volumeSlider->setEnabled(true); + for (int i = 0; i < set->getNumberOfReceivers(); i++) + set->setMainVolume(this, i, rxVolumeList.at(i)); + } + } +} + +/*! + \brief implements the Show/Hide functionality of the wide band data widget. +*/ +void MainWindow::wideBandBtnClickedEvent() { + + if (wideBandBtn->btnState() == AeroButton::OFF) { + + wideBandBtn->setBtnState(AeroButton::ON); + set->setWidebandStatus(this, true); + widebandDock->show(); + //showMessage("[server]: wide band data on."); + } + else if (wideBandBtn->btnState() == AeroButton::ON) { + + wideBandBtn->setBtnState(AeroButton::OFF); + set->setWidebandStatus(this, false); + widebandDock->hide(); + //showMessage("[server]: wide band data off."); + } +} + +void MainWindow::widebandVisibilityChanged(bool value) { + + if (value) + wideBandBtn->setBtnState(AeroButton::ON); + else + wideBandBtn->setBtnState(AeroButton::OFF); + + wideBandBtn->update(); +} + +void MainWindow::alexBtnClickedEvent() { + + if (alexBtn->btnState() == AeroButton::OFF) { + + alexBtn->setBtnState(AeroButton::ON); + alexBtn->setText("Alex Auto"); + + //m_alexConfiguration[0].value = false; + m_alexConfig &= 0xFFFE; + + set->setAlexToManual(this, false); + } + else if (alexBtn->btnState() == AeroButton::ON) { + + alexBtn->setBtnState(AeroButton::OFF); + alexBtn->setText("Alex Man"); + + //m_alexConfiguration[0].value = true; + m_alexConfig |= 0x01; + + set->setAlexToManual(this, true); + } + //set->setAlexConfiguration(this, m_alexConfiguration); +} + +void MainWindow::alexStateChanged(HamBand band, const QList &states) { + + Q_UNUSED(band) + + m_currentHamBand = set->getCurrentHamBand(0); + m_alexStates[m_currentHamBand] = states.at(m_currentHamBand); + m_alexAttnState = 0x03 & (m_alexStates[m_currentHamBand] >> 7); + + setAttenuatorButton(); +} + +void MainWindow::alexConfigurationChanged(quint16 conf) { + + if (conf & 0x01) { + + alexBtn->setBtnState(AeroButton::OFF); + alexBtn->setText("Alex Man"); + } + else { + + alexBtn->setBtnState(AeroButton::ON); + alexBtn->setText("Alex Auto"); + } + + alexBtn->update(); +} + +void MainWindow::alexPresenceChanged(bool value) { + + if (value) { + + //if (m_alexConfiguration[0].value) + if (m_alexConfig & 0x01) + alexBtn->setText(tr("Alex Man")); + else + alexBtn->setText(tr("Alex Auto")); + } + else + alexBtn->setText(tr("Alex")); + + alexBtn->setEnabled(value); + + alexAttn_0dBAction->setCheckable(value); + alexAttn_10dBAction->setCheckable(value); + alexAttn_20dBAction->setCheckable(value); + alexAttn_30dBAction->setCheckable(value); + + alexBtn->update(); +} + +void MainWindow::addReceiver() { +} + +/*! + \brief tune to last frequency. +*/ +void MainWindow::getLastFrequency() { +} + +/*! + \brief updates the main window title. +*/ +void MainWindow::updateTitle() { + + setWindowTitle( + QApplication::applicationName() + " " + \ + QApplication::applicationVersion() + " " + \ + set->getCallsign()); +} + +/*! + \brief show widget event. +*/ +void MainWindow::showWidgetEvent( + QObject *sender /*!<[in] the sender of the event. */ +) { + if (!sender) return; +} + +/*! + \brief hide widget event. +*/ +void MainWindow::closeWidgetEvent( + QObject *sender /*!<[in] the sender of the event. */ +) +{ + if (!sender) return; +} + +void MainWindow::setCurrentReceiver(QObject *sender, int rx) { + + Q_UNUSED(sender) + + MAIN_DEBUG << "setCurrentReceiver: " << rx; + //set->setCurrentReceiver(this, rx); + //m_dataEngine->io.currentReceiver = rx; + m_volumeSlider->setValue((int)(set->getMainVolume(rx) * 100)); + m_agcGainSlider->setValue(set->getAGCMaximumGain_dB(rx)); +} + +/*! + \brief enable the receiver buttons according to the actual number of available receivers. +*/ +void MainWindow::setNumberOfReceivers( + QObject *sender, /*!<[in] the sender of the event. */ + int value /*!<[in] the number of receivers. */ +) { + Q_UNUSED(sender) + + viewMenu->clear(); + for (int i = 0; i < value-1; i++) { + + viewMenu->addAction(rxDockWidgetList.at(i)->toggleViewAction()); + if (!rxDockWidgetList.at(i)->isVisible()) + rxDockWidgetList.at(i)->show(); + } + + for (int i = value-1; i < MAX_RECEIVERS-1; i++) { + + if (rxDockWidgetList.at(i)->isVisible()) + rxDockWidgetList.at(i)->hide(); + } +} + +/*! + \brief set the main volume. +*/ +void MainWindow::setMainVolume(int value) { + + if (value < 0 ) value = 0; + if (value > 100 ) value = 100; + + QString str = "%1 %"; + m_volLevelLabel->setText(str.arg(value, 2, 10, QLatin1Char(' '))); + + set->setMainVolume(this, set->getCurrentReceiver(), value / 100.0f); +} + +/*! + \brief mute Volume. +*/ +void MainWindow::muteBtnClickedEvent() { + + int rcvr = set->getNumberOfReceivers(); + if (muteBtn->btnState() == AeroButton::OFF) { + + muteBtn->setBtnState(AeroButton::ON); + m_volumeSlider->setEnabled(false); + + for (int i = 0; i < rcvr; i++) { + + rxVolumeList[i] = set->getMainVolume(i); + set->setMainVolume(this, i, 0.0f); + } + } + else if (muteBtn->btnState() == AeroButton::ON) { + + muteBtn->setBtnState(AeroButton::OFF); + m_volumeSlider->setEnabled(true); + + for (int i = 0; i < rcvr; i++) { + + set->setMainVolume(this, i, rxVolumeList.at(i)); + } + } +} + +void MainWindow::setTxAllowed(QObject *sender, bool value) { + + Q_UNUSED(sender) + + if (!value) { + + moxBtn->setEnabled(false); + tunBtn->setEnabled(false); + } + else if (set->getPenelopePresence() || set->getPennyLanePresence() || (m_hwInterface == QSDR::Hermes)) { + + moxBtn->setEnabled(true); + tunBtn->setEnabled(true); + } +} + +void MainWindow::setAGCMode(QObject *sender, int rx, AGCMode mode, bool hang) { + + Q_UNUSED(sender) + Q_UNUSED(hang) + + m_agcMode = mode; + + if(m_agcMode == (AGCMode) agcOFF) { + + int gain = (int) set->getAGCFixedGain_dB(rx); + m_agcGainLabel->setText("AGC-F:"); + m_agcGainSlider->blockSignals(true); + m_agcGainSlider->setValue(gain); + m_agcGainSlider->blockSignals(false); + + QString str = " %1 dB"; + m_agcGainLevelLabel->setText(str.arg(gain, 2, 10, QLatin1Char(' '))); + } + else { + + int gain = (int) set->getAGCMaximumGain_dB(rx); + m_agcGainLabel->setText("AGC-G:"); + m_agcGainSlider->blockSignals(true); + m_agcGainSlider->setValue(gain); + m_agcGainSlider->blockSignals(false); + + QString str = " %1 dB"; + m_agcGainLevelLabel->setText(str.arg(gain, 2, 10, QLatin1Char(' '))); + } +} + +void MainWindow::setAGCGain(int value) { + + QString str = " %1 dB"; + m_agcGainLevelLabel->setText(str.arg(value + 0, 2, 10, QLatin1Char(' '))); + + int rx = set->getCurrentReceiver(); + if (m_agcMode == (AGCMode) agcOFF) + set->setAGCFixedGain_dB(this, rx, (qreal) value); + else + set->setAGCMaximumGain_dB(this, rx, (qreal) value); +} + +void MainWindow::setAGCGain(QObject *sender, int rx, qreal value) { + + Q_UNUSED(sender) + Q_UNUSED(rx) + + m_agcGainSlider->blockSignals(true); + m_agcGainSlider->setValue((int) value); + + QString str = " %1 dB"; + m_agcGainLevelLabel->setText(str.arg((int) value + 0, 2, 10, QLatin1Char(' '))); + + m_agcGainSlider->blockSignals(false); +} + +void MainWindow::setSDRMode(bool) { + + MAIN_DEBUG << "setSDRMode"; + setServerMode(QSDR::SDRMode); + + //if (m_oldSampleRate == 48000 || m_oldSampleRate == 96000 || m_oldSampleRate == 192000) + // set->setSampleRate(this, m_oldSampleRate); + + //showMessage("[server]: switched to SDR mode."); +} + +/*! + \brief set \a QSDR::_ServerMode to \a QSDR::ChirpWSPR. +*/ +void MainWindow::setChirpWSPRMode(bool value) { + + Q_UNUSED(value) + + setServerMode(QSDR::ChirpWSPR); + + m_oldSampleRate = set->getSampleRate(); + setNumberOfReceivers(this, 1); + set->setCurrentReceiver(this, 1); + set->setSampleRate(this, 48000); + //m_dataEngine->createChirpDataProcessor(); + + MAIN_DEBUG << "switched to chirp decode mode"; +} + +void MainWindow::setAttenuator() { + + QAction *action = qobject_cast(sender()); + + int mercuryPos = mercuryAttnActionList.indexOf(action); + int alexPos = alexAttnActionList.indexOf(action); + + if (mercuryPos > -1) { + + foreach(QAction *act, mercuryAttnActionList) { + + act->setChecked(false); + } + mercuryAttnActionList.at(mercuryPos)->setChecked(true); + + switch (mercuryPos) { + + case 0: + + //attenuatorBtn->setText(tr("Attn 0 dB")); + //attenuatorBtn->setBtnState(AeroButton::OFF); + + set->setMercuryAttenuator(this, 1); + break; + + case 1: + + //attenuatorBtn->setText(tr("Attn -20 dB")); + //attenuatorBtn->setBtnState(AeroButton::ON); + + set->setMercuryAttenuator(this, 0); + break; + } + } + + if (alexPos > -1) { + + foreach(QAction *act, alexAttnActionList) { + act->setChecked(false); + } + alexAttnActionList.at(alexPos)->setChecked(true); + + int state = 0; + state &= 0x7F; // 0 0 1 1 1 1 1 1 1 + state |= alexPos << 7; + + set->setAlexState(this, state); + } + + if (mercuryAttnActionList.at(0)->isChecked()) { + + if (alexAttnActionList.at(0)->isChecked()) { + + attenuatorBtn->setText(tr("Attn 0 dB")); + attenuatorBtn->setBtnState(AeroButton::OFF); + } + else if (alexAttnActionList.at(1)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -10 dB")); + attenuatorBtn->setBtnState(AeroButton::ON); + } + else if (alexAttnActionList.at(2)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -20 dB")); + attenuatorBtn->setBtnState(AeroButton::ON); + } + else if (alexAttnActionList.at(3)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -30 dB")); + attenuatorBtn->setBtnState(AeroButton::ON); + } + } + else if (mercuryAttnActionList.at(1)->isChecked()) { + + if (alexAttnActionList.at(0)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -20 dB")); + } + else if (alexAttnActionList.at(1)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -30 dB")); + } + else if (alexAttnActionList.at(2)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -40 dB")); + } + else if (alexAttnActionList.at(3)->isChecked()) { + + attenuatorBtn->setText(tr("Attn -50 dB")); + } + attenuatorBtn->setBtnState(AeroButton::ON); + } +} + +void MainWindow::setAttenuatorButton() { + + foreach(QAction *act, mercuryAttnActionList) act->setChecked(false); + foreach(QAction *act, alexAttnActionList) act->setChecked(false); + + if (m_mercuryAttnState == 1) { + + mercuryAttnActionList.at(0)->setChecked(true); + + switch (m_alexAttnState) { + + case 0: + + attenuatorBtn->setText(tr("Attn 0 dB")); + attenuatorBtn->setBtnState(AeroButton::OFF); + break; + + case 1: + + attenuatorBtn->setText(tr("Attn -10 dB")); + attenuatorBtn->setBtnState(AeroButton::ON); + break; + + case 2: + + attenuatorBtn->setText(tr("Attn -20 dB")); + attenuatorBtn->setBtnState(AeroButton::ON); + break; + + case 3: + + attenuatorBtn->setText(tr("Attn -30 dB")); + attenuatorBtn->setBtnState(AeroButton::ON); + break; + } + } + else if (m_mercuryAttnState == 0) { + + mercuryAttnActionList.at(1)->setChecked(true); + switch (m_alexAttnState) { + + case 0: + + attenuatorBtn->setText(tr("Attn -20 dB")); + break; + + case 1: + + attenuatorBtn->setText(tr("Attn -30 dB")); + break; + + case 2: + + attenuatorBtn->setText(tr("Attn -40 dB")); + break; + + case 3: + + attenuatorBtn->setText(tr("Attn -50 dB")); + break; + } + attenuatorBtn->setBtnState(AeroButton::ON); + } + + if (m_alexAttnState > -1) + alexAttnActionList.at(m_alexAttnState)->setChecked(true); +} + +void MainWindow::mercuryAttenuatorChanged(QObject *sender, HamBand band, int value) { + + Q_UNUSED(sender) + Q_UNUSED(value) + Q_UNUSED(band) + + m_currentHamBand = set->getCurrentHamBand(0); + m_mercuryAttn[m_currentHamBand] = value; + m_mercuryAttnState = m_mercuryAttn.at(m_currentHamBand); + + setAttenuatorButton(); +} + +/*! + \brief set \a QSDR::_ServerMode to \a mode. +*/ +void MainWindow::setServerMode( + QSDR::_ServerMode mode /*!<[in] server mode. */ +) { + /* + if (mode != QSDR::ChirpWSPR && chirpBtn->btnState() == AeroButton::ON) + m_chirpWidget->hide(); + + if (mode == QSDR::ChirpWSPR && wideBandBtn->btnState() == AeroButton::ON) { + + //set->setWideBandStatus(false); + wideBandBtn->setBtnState(AeroButton::OFF); + wideBandBtn->setEnabled(false); + } + + chirpBtn->setEnabled(QSDR::ChirpWSPR == mode); + */ + + setSystemState(QSDR::NoError, m_hwInterface, mode, m_dataEngineState); +} + +/*! + \brief get all network interfaces and IP addresses. +*/ +void MainWindow::getNetworkInterfaces() { + + // find out which IP to connect to + QString localIP = QHostAddress(QHostAddress::LocalHost).toString(); + + // ip addresses from ini file + QString serverIpAddress = set->getServerAddr(); + QString hpsdrDeviceLocalIpAddress = set->getHPSDRDeviceLocalAddr(); + + MAIN_DEBUG << "server ip from ini-file: " << serverIpAddress; + MAIN_DEBUG << "HPSDR device local ip from ini-file: " << hpsdrDeviceLocalIpAddress; + + QList broadcastAddresses; + QList ipAddresses; + QList nics; + + m_ipList = QNetworkInterface::allAddresses(); + m_niList = QNetworkInterface::allInterfaces(); + + foreach (QNetworkInterface ni, m_niList) { + + //MAIN_DEBUG << "network interface " << ni.humanReadableName() << " :"; + //foreach (QNetworkAddressEntry entry, ni.addressEntries()) { + + // QHostAddress broadcastAddress = entry.broadcast(); + // MAIN_DEBUG << " -> broadcast address: " << qPrintable(broadcastAddress.toString()); + // //if (broadcastAddress != QHostAddress::Null && entry.ip() != QHostAddress::LocalHost) { + // if (entry.ip().toIPv4Address() && entry.ip() != QHostAddress::LocalHost) { + // //if (entry.ip() != QHostAddress::LocalHost) { + // broadcastAddresses << broadcastAddress; + // ipAddresses << entry.ip(); + // nics << ni; + // MAIN_DEBUG << " -> ip address: " << qPrintable(entry.ip().toString()); + // set->m_ipAddressesList.append(entry.ip()); + // set->m_networkInterfaces.append(ni); + // + // set->addServerNetworkInterface(ni.humanReadableName(), entry.ip().toString()); + // set->addHPSDRDeviceNIC(ni.humanReadableName(), entry.ip().toString()); + // } + //} + + foreach (QNetworkAddressEntry entry, ni.addressEntries()) { + + QHostAddress broadcastAddress = entry.broadcast(); + + //if (broadcastAddress != QHostAddress::Null && entry.ip() != QHostAddress::LocalHost) { + if (entry.ip().toIPv4Address() && entry.ip() != QHostAddress::LocalHost) { + //if (entry.ip() != QHostAddress::LocalHost) { + + MAIN_DEBUG << "network interface " << ni.humanReadableName() << " :"; + MAIN_DEBUG << " -> broadcast address: " << qPrintable(broadcastAddress.toString()); + broadcastAddresses << broadcastAddress; + ipAddresses << entry.ip(); + nics << ni; + MAIN_DEBUG << " -> ip address: " << qPrintable(entry.ip().toString()); + set->m_ipAddressesList.append(entry.ip()); + set->m_networkInterfaces.append(ni); + + set->addServerNetworkInterface(ni.humanReadableName(), entry.ip().toString()); + set->addHPSDRDeviceNIC(ni.humanReadableName(), entry.ip().toString()); + } + } + } + + set->setNumberOfNetworkInterfaces(nics.size()); + MAIN_DEBUG << "found " << nics.size() << " valid ip addresses."; + + //emit serverWidgetEvent(); + //emit metisWidgetEvent(); + + int serverIdx = -1; + int metisIdx = -1; + + if (ipAddresses.isEmpty()) { + + // if we did not find one, use IPv4 localhost + set->setServerAddr(this, localIP); + set->setHPSDRDeviceLocalAddr(this, localIP); + } + else { + + //int serverIdx = -1; + //int metisIdx = -1; + + for (int i = 0; i < nics.size(); ++i) { + if (broadcastAddresses.at(i) != QHostAddress::Null) { + + if (ipAddresses.at(i).toString() == serverIpAddress) { + + set->setServerWidgetNIC(i); + serverIdx = i; + } + if (ipAddresses.at(i).toString() == hpsdrDeviceLocalIpAddress) { + + set->setHPSDRWidgetNIC(i); + metisIdx = i; + } + } + } + } + + QString message; + for (int i = 0; i < nics.size(); ++i) { + if (broadcastAddresses.at(i) != QHostAddress::Null) { + + if (serverIdx < 0) { + set->setServerWidgetNIC(i); + set->setServerAddr(this, ipAddresses.at(i).toString()); + } + else { + + /*message = "[server]: network interface set to: %1 (%2)."; + showMessage( + message.arg( + nics.at(serverIdx).humanReadableName(), + ipAddresses.at(serverIdx).toString() ));*/ + } + + if (metisIdx < 0) { + + set->setHPSDRWidgetNIC(i); + set->setHPSDRDeviceLocalAddr(this, ipAddresses.at(i).toString()); + + MAIN_DEBUG << "HPSDR network device interface set to: " + << nics.at(i).humanReadableName() + << "(" << ipAddresses.at(i).toString() << ")"; + } + else { + + MAIN_DEBUG << "HPSDR network device interface set to: " + << nics.at(metisIdx).humanReadableName() + << "(" << ipAddresses.at(metisIdx).toString() << ")"; + } + } + + /*for (int i = 0; i < nics.size(); ++i) { + if (serverIdx != i) { + set->setServerWidgetNIC(i); + break; + } + } + + for (int i = 0; i < nics.size(); ++i) { + if (metisIdx != i) { + set->setHPSDRWidgetNIC(i); + break; + } + + }*/ + } + + //emit serverWidgetEvent(); + //emit metisWidgetEvent(); + + //set->setServerWidgetNIC(1); + MAIN_DEBUG << "using ip address " << qPrintable(set->getServerAddr()) << " for the server."; + MAIN_DEBUG << "using ip address " << qPrintable(set->getHPSDRDeviceLocalAddr()) << " for connecting to a HPSDR device."; + + +} + + +/*! + \brief load a wav-file. +*/ +void MainWindow::loadWavFile( + QObject *sender, /*!<[in] the sender of the event. */ + const QString &fileName /*!<[in] file name of the *.wav file. */ +) { + Q_UNUSED(sender) + + m_dataEngine->loadWavFile(fileName); +} + +/*! + \brief suspend playing wav-file. +*/ +void MainWindow::suspendSignal( + QObject *sender /*!<[in] the sender of the event. */ +) { + Q_UNUSED(sender) + + m_dataEngine->suspend(); +} + +/*! + \brief start playback. +*/ +void MainWindow::startPlaybackSignal( + QObject *sender /*!<[in] the sender of the event. */ +) { + Q_UNUSED(sender) + + m_dataEngine->startPlayback(); +} + +/*! + \brief show the audio settings dialog. +*/ +void MainWindow::showSettingsDialogSignal( + QObject *sender /*!<[in] the sender of the event. */ +) { + Q_UNUSED(sender) + + m_dataEngine->showSettingsDialog(); +} + +void MainWindow::showNetworkIODialog() { + + m_netIODialog->exec(); +} + +void MainWindow::showWarningDialog(const QString &str) { + + m_warningDialog->setWarningMessage(str); + m_warningDialog->exec(); +} + +void MainWindow::addNetworkIOComboBoxEntry(QString str) { + + m_netIODialog->addDeviceComboBoxItem(str); +} + +void MainWindow::clearNetworkIOComboBoxEntry() { + + m_netIODialog->clearDeviceComboBoxItem(); +} + +/*! + \brief generates an initial message for the logging widget- +*/ +//void MainWindow::initialMessage() { +// +// QString str = set->versionStr(); +// str.prepend("cuSDR "); +// str.append(". \nOpenGL enabled HPSDR Front end \n(C) 2010-2012 Hermann von Hasseln, DL3HVH.\n"); +// m_msgBrowser->appendPlainText(str); +// m_msgBrowser->appendPlainText(""); +//} + +//******************************************************************************* +// Application's window stuff + +/*! + \brief get the QRegion of the window borders. +*/ +void MainWindow::getRegion() { + + /*m_topBorderFrame = QRegion(QRect(8, 0, width() - 16, 2)); + m_topFrame = QRegion(QRect(8, 2, width() - 16, 3)); + m_leftFrame = QRegion(QRect(0, 8, 8, height() - 16)); + m_rightFrame = QRegion(QRect(width() - 8, 8, 8, height() - 16)); + m_bottomFrame = QRegion(QRect(8, height() - 8, width() - 16, 8)); + m_topLeftFrame = QRegion(QRect(0, 0, 8, 8)); + m_bottomLeftFrame = QRegion(QRect(0, height() - 8, 8, 8)); + m_topRightFrame = QRegion(QRect(width() - 8, 0, 8, 8)); + m_bottomRightFrame = QRegion(QRect(width() - 8, height() - 8, 8, 8));*/ +} + +/*! + \brief mouse wheel event implementation. +*/ +void MainWindow::wheelEvent( + QWheelEvent *event /*!<[in] event */ +) { + event->accept(); + QWidget::wheelEvent(event); +} + +/*! + \brief enter event implementation. +*/ +void MainWindow::enterEvent( + QEvent *event /*!<[in] event */ +) { + Q_UNUSED(event); +} + +/*! + \brief leave event implementation. +*/ +void MainWindow::leaveEvent( + QEvent *event /*!<[in] event */ +) { + Q_UNUSED(event); +} + +/*! + \brief resize event implementation. +*/ +void MainWindow::resizeEvent( + QResizeEvent *event /*!<[in] event */ +) { + //Q_UNUSED(event); + + //QTimer::singleShot(10, this, SLOT(getRegion())); + //m_resizeFrame = true; + //displayPanelToolBar->updateGeometry(); + m_oglDisplayPanel->update(); + QWidget::resizeEvent(event); +} + +/*! + \brief close event implementation. +*/ +void MainWindow::closeEvent( + QCloseEvent *event /*!<[in] event */ +) { + if (set->getMainPower()) + startButtonClickedEvent(); + + QSettings settings(QCoreApplication::applicationDirPath() + "/" + m_windowsSettingsFilename, QSettings::IniFormat); + settings.setValue("geometry", saveGeometry()); + settings.setValue("windowState", saveState()); + + mainBtnList.clear(); + + if (m_serverWidget) { + + disconnect(m_serverWidget, 0, 0, 0); + delete m_serverWidget; + m_serverWidget = NULL; + } + + if (m_dataEngine) { + + disconnect(m_dataEngine, 0, 0, 0); + delete m_dataEngine; + m_dataEngine = NULL; + } + + /*if (m_cudaInfoWidget && m_cudaPresence) { + + disconnect(m_cudaInfoWidget, 0, 0, 0); + delete m_cudaInfoWidget; + m_cudaInfoWidget = NULL; + }*/ + + if (m_oglDisplayPanel) { + + disconnect(m_oglDisplayPanel, 0, 0, 0); + delete m_oglDisplayPanel; + m_oglDisplayPanel = NULL; + } + + if (m_radioTabWidget) { + + disconnect(m_radioTabWidget, 0, 0, 0); + delete m_radioTabWidget; + m_radioTabWidget = NULL; + } + + if (m_chirpWidget) { + + disconnect(m_chirpWidget, 0, 0, 0); + delete m_chirpWidget; + m_chirpWidget = NULL; + } + + /*if (m_hpsdrWidget) { + + disconnect(m_hpsdrWidget, 0, 0, 0); + delete m_hpsdrWidget; + m_hpsdrWidget = NULL; + }*/ + + if (m_hpsdrTabWidget) { + + disconnect(m_hpsdrTabWidget, 0, 0, 0); + delete m_hpsdrTabWidget; + m_hpsdrTabWidget = NULL; + } + + if (m_displayTabWidget) { + + disconnect(m_displayTabWidget, 0, 0, 0); + delete m_displayTabWidget; + m_displayTabWidget = NULL; + } + + /*if (m_hpsdrServer) { + + disconnect(m_hpsdrServer, 0, 0, 0); + delete m_hpsdrServer; + m_hpsdrServer = NULL; + }*/ + QMainWindow::closeEvent(event); +} + +/*! + \brief show event implementation. +*/ +void MainWindow::showEvent( + QShowEvent *event /*!<[in] event */ +) { + QWidget::showEvent(event); +} + +/*! + \brief key pressed event implementation. +*/ +void MainWindow::keyPressEvent( + QKeyEvent *event /*!<[in] key event */ +) { + switch (event->key()) { + + case Qt::Key_Escape: + + setMainWindowGeometry(); + return; + + case Qt::Key_1: + + return; + } + + QWidget::keyPressEvent(event); +} + + +//*************************************************************************** +// NetworkIODialog class + +NetworkIODialog::NetworkIODialog(QWidget *parent) + : QDialog(parent) + , set(Settings::instance()) +{ + int btnWidth = 74; + int btnHeight = 18; + + m_deviceCards = set->getMetisCardsList(); + + setWindowModality(Qt::NonModal); + setWindowOpacity(0.9); + setStyleSheet(set->getDialogStyle()); + + setMouseTracking(true); + + m_titleFont.setStyleStrategy(QFont::PreferAntialias); + m_titleFont.setFixedPitch(true); + m_titleFont.setPixelSize(13); + m_titleFont.setFamily("Arial"); + m_titleFont.setBold(true); + + + QVBoxLayout *dialogLayout = new QVBoxLayout(this); + + m_deviceComboBox = new QComboBox(this); + m_deviceComboBox->setStyleSheet(set->getComboBoxStyle()); + m_deviceComboBox->setMinimumContentsLength(30); + + QScopedPointer titleLayout(new QHBoxLayout); + QLabel *titleLabel = new QLabel(tr("found more than one device:"), this); + titleLabel->setFont(m_titleFont); + titleLabel->setStyleSheet(set->getLabelStyle()); + titleLayout->addWidget(titleLabel); + dialogLayout->addLayout(titleLayout.data()); + titleLayout.take(); // ownership transferred to dialogLayout + + QScopedPointer metisDeviceLayout(new QHBoxLayout); + QLabel *ipAddressLabel = new QLabel(tr("Device (IP Addr):"), this); + ipAddressLabel->setStyleSheet(set->getLabelStyle()); + metisDeviceLayout->addWidget(ipAddressLabel); + metisDeviceLayout->addWidget(m_deviceComboBox); + dialogLayout->addLayout(metisDeviceLayout.data()); + metisDeviceLayout.take(); // ownership transferred to dialogLayout + + /*CHECKED_CONNECT( + m_metisDeviceComboBox, + SIGNAL(activated(int)), + this, + SLOT(metisDeviceChanged(int)));*/ + + AeroButton* okBtn = new AeroButton("Ok", this); + okBtn->setRoundness(10); + okBtn->setFixedSize(btnWidth, btnHeight); + CHECKED_CONNECT( + okBtn, + SIGNAL(clicked()), + this, + SLOT(okBtnClicked())); + + AeroButton* cancelBtn = new AeroButton("Cancel", this); + cancelBtn->setRoundness(10); + cancelBtn->setFixedSize(btnWidth, btnHeight); + CHECKED_CONNECT( + cancelBtn, + SIGNAL(clicked()), + this, + SLOT(reject())); + + QHBoxLayout *hbox = new QHBoxLayout; + hbox->setSpacing(1); + hbox->addWidget(okBtn); + hbox->addWidget(cancelBtn); + + dialogLayout->addLayout(hbox); + + setLayout(dialogLayout); +} + +NetworkIODialog::~NetworkIODialog() { +} + +void NetworkIODialog::okBtnClicked() { + + if (m_deviceCards.length() > 0) { + + set->setCurrentHPSDRDevice(m_deviceCards.at(m_deviceComboBox->currentIndex())); + NETWORKDIALOG_DEBUG << "Network device at: " << m_deviceCards.at(m_deviceComboBox->currentIndex()).ip_address.toString() << " selected."; + accept(); + } + else + NETWORKDIALOG_DEBUG << "HPSDR network device list length:" << m_deviceCards.length(); +} + +void NetworkIODialog::addDeviceComboBoxItem(QString str) { + + m_deviceComboBox->addItem(str); + m_deviceCards = set->getMetisCardsList(); +} + +void NetworkIODialog::clearDeviceComboBoxItem() { + + m_deviceComboBox->clear(); +} + + +//*************************************************************************** +// WarningDialog class + +WarningDialog::WarningDialog(QWidget *parent) + : QDialog(parent) + , set(Settings::instance()) + , m_btnWidth(74) + , m_btnHeight(18) +{ + setWindowModality(Qt::NonModal); + setWindowTitle("Warning"); + setWindowOpacity(0.9); + setStyleSheet(set->getDialogStyle()); + + setMouseTracking(true); + + m_titleFont.setStyleStrategy(QFont::PreferAntialias); + m_titleFont.setFixedPitch(true); + m_titleFont.setBold(true); + m_titleFont.setPixelSize(13); + m_titleFont.setFamily("Arial"); + m_titleFont.setBold(true); + + //m_warningIcon.QPixmap::fromImage(QImage(QLatin1String(":/img/warning.png")), Qt::ColorOnly); + + m_warningLabel = new QLabel("", this); + + okBtn = new AeroButton("Ok", this); + okBtn->setRoundness(10); + okBtn->setFixedSize(m_btnWidth, m_btnHeight); + + CHECKED_CONNECT( + okBtn, + SIGNAL(clicked()), + this, + SLOT(okBtnClicked())); +} + +WarningDialog::~WarningDialog() { +} + +void WarningDialog::paintEvent(QPaintEvent *) { + + QPainter p(this); + p.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing | QPainter::TextAntialiasing, true); + + //QRect titlebar_rect(0, 0, width(), height()); + + /*QLinearGradient titlebarGrad(0, 0, 0, 1); + titlebarGrad.setCoordinateMode(QGradient::ObjectBoundingMode); + titlebarGrad.setSpread(QGradient::PadSpread); + titlebarGrad.setColorAt(0, QColor(110, 110, 110)); + titlebarGrad.setColorAt(0.45, QColor(80, 80, 80)); + titlebarGrad.setColorAt(0.55, QColor(56, 56, 65)); + titlebarGrad.setColorAt(1, QColor(40, 40, 40));*/ + + // draw background rect + /*p.setPen(Qt::NoPen); + p.setBrush(QBrush(titlebarGrad)); + p.drawRect(titlebar_rect); + p.setPen(QColor(255, 255, 255, 140)); + p.drawLine(1, titlebar_rect.top(), width() - 2, titlebar_rect.top()); + p.setPen(QColor(255, 255, 255, 30)); + p.drawLine(1, titlebar_rect.bottom() - 2, width() - 2, titlebar_rect.bottom() - 2); + p.setPen(QColor(0, 0, 0, 255)); + p.drawLine(0, titlebar_rect.bottom(), width(), titlebar_rect.bottom());*/ + + QPixmap warningIcon = QPixmap::fromImage(QImage(QLatin1String(":/img/warning.png")), Qt::ColorOnly); + if (!warningIcon.isNull()) p.drawPixmap(13, 5, 16, 16, warningIcon); + + // draw text + p.setFont(m_titleFont); + p.setPen(QColor(95, 95, 95, 255)); + + // warning msg + p.drawText( + 40, 6, + m_msgFontWidth, m_msgFontHeight, + Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, + m_message); + + p.setPen(QColor(235, 235, 235, 255)); + p.drawText( + 39, 5, + m_msgFontWidth, m_msgFontHeight, + Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, + m_message); + + okBtn->move((width() - m_btnWidth)/2, 30); + + p.end(); +} + +void WarningDialog::setWarningMessage(const QString &msg) { + + m_message = msg; + + QFontMetrics tfm(m_titleFont); + m_msgFontWidth = tfm.width(m_message); + m_msgFontHeight = tfm.height(); + + this->setFixedWidth(m_msgFontWidth + 60); + this->setFixedHeight(60); +} + +void WarningDialog::okBtnClicked() { + + accept(); +} diff --git a/Source/src/cusdr_mainWidget.h b/Source/src/cusdr_mainWidget.h new file mode 100644 index 0000000..2281804 --- /dev/null +++ b/Source/src/cusdr_mainWidget.h @@ -0,0 +1,433 @@ +/** +* @file cusdr_mainWidget.h +* @brief main window widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-01-06 +*/ + +/* + * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_MAIN_H +#define CUSDR_MAIN_H + +#include +//#include +//#include +#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +#include + +#include "cusdr_settings.h" +#include "cusdr_fonts.h" +#include "Util/cusdr_buttons.h" +#include "DataEngine/cusdr_dataEngine.h" +#include "cusdr_hpsdrTabWidget.h" +#include "cusdr_radioTabWidget.h" +#include "cusdr_displayTabWidget.h" +#include "cusdr_serverWidget.h" +#include "cusdr_chirpWidget.h" +//#include "cusdr_alexTabWidget.h" +//#include "cusdr_extCtrlWidget.h" +//#include "cusdr_radioWidget.h" +//#include "cusdr_radioPopupWidget.h" +#include "GL/cusdr_oglWidebandPanel.h" +#include "GL/cusdr_oglReceiverPanel.h" +#include "GL/cusdr_oglDisplayPanel.h" +//#include "cusdr_graphicOptionsWidget.h" +//#include "cusdr_server.h" + + +#ifdef LOG_MAIN +#define MAIN_DEBUG qDebug().nospace() << "MainWindow::\t" +#else +#define MAIN_DEBUG nullDebug() +#endif + +#ifdef LOG_NETWORKDIALOG +#define NETWORKDIALOG_DEBUG qDebug().nospace() << "NetworkDialog::\t" +#else +#define NETWORKDIALOG_DEBUG nullDebug() +#endif + + +class NetworkIODialog; +class WarningDialog; + + +class MainWindow : public QMainWindow { + + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + + void setup(); + +public slots: + void update(); + void masterSwitchChanged(QObject *sender, bool power); + void startButtonClickedEvent(); + void widgetBtnClickedEvent(); + void wideBandBtnClickedEvent(); + //void avgBtnClickedEvent(); + //void gridBtnClickedEvent(); + //void peakHoldBtnClickedEvent(); + void alexBtnClickedEvent(); + void muteBtnClickedEvent(); + //void resizeWidget(); + + void showWidgetEvent(QObject *sender); + void closeWidgetEvent(QObject *sender); + + void loadWavFile(QObject *sender, const QString &fileName); + void suspendSignal(QObject *sender); + void startPlaybackSignal(QObject *sender); + void showSettingsDialogSignal(QObject *sender); + +private: + void setSystemState( + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + +#if defined(Q_OS_WIN32) + void getCPULoadThread(LPVOID lpParam); +#endif + + void setupConnections(); + void setupLayout(); + void createModeMenu(); + void createViewMenu(); + void createAttenuatorMenu(); + void createDisplayPanelToolBar(); + void createMainBtnToolBar(); + //void createDisplayPanel(); + void createStatusToolBar(); + //void initWidebandDisplay(); + void createReceiverPanels(int rx); + void updateFromSettings(); + //void runFFTWWisdom(); + void setAttenuatorButton(); + +private: + Settings* set; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QMutex m_mutex; + + QDir m_currentDir; + QToolBar* mainBtnToolBar; + QToolBar* displayPanelToolBar; + + QMainWindow* centralwidget; + + QList rxWidgetList; + QVector rxVolumeList; + + QDockWidget* widebandDock; + QDockWidget* rx1Dock; + QList dockWidgetList; + QList rxDockWidgetList; + + QList m_ipList; + QList m_niList; + + //QThreadEx* cpuLoadThread; + + CFonts* fonts; + TFonts m_fonts; + + QSize m_oldSize; + QPoint m_oldPosition; + + QPixmap m_originalPixmap; + QPixmap m_widgetMask; + + QTimer* m_resizeTimer; + + QPoint m_dragPosition; + QPoint m_pos; + QRect m_rect; + QString m_message; + + QGridLayout* m_contentLayout; + + QLabel* m_volumeLabel; + QLabel* m_volLevelLabel; + QLabel* m_agcGainLabel; + QLabel* m_agcGainLevelLabel; + QLabel* m_cpuLoadLabel; + QLabel* m_dateTimeLabel; + QLabel* m_statusBarMessage; + + QString m_windowsSettingsFilename; + QString m_cpuLoadString; + QString m_dateTimeString; + QString m_statusBarMessageString; + + QWidget* m_buttonWidget; + QWidget* m_secondButtonWidget; + + QSlider* m_volumeSlider; + QSlider* m_agcGainSlider; + AGCMode m_agcMode; + + DataEngine* m_dataEngine; + RadioPopupWidget* m_radioPopupWidget; + ServerWidget* m_serverWidget; + ChirpWidget* m_chirpWidget; + HPSDRTabWidget* m_hpsdrTabWidget; + RadioTabWidget* m_radioTabWidget; + DisplayTabWidget* m_displayTabWidget; + OGLDisplayPanel* m_oglDisplayPanel; + //CudaInfoWidget* m_cudaInfoWidget; + QGLWidebandPanel* m_wbDisplay; + + NetworkIODialog* m_netIODialog; + WarningDialog* m_warningDialog; + + HamBand m_currentHamBand; + + quint16 m_alexConfig; + QList m_alexStates; + QList m_mercuryAttn; + //QList m_clDevices; + + AeroButton* startBtn; + AeroButton* serverBtn; + AeroButton* hpsdrBtn; + AeroButton* modeBtn; + AeroButton* viewBtn; + AeroButton* chirpBtn; + AeroButton* openclBtn; + AeroButton* rxCtrlBtn; + AeroButton* wideBandBtn; + AeroButton* ctrlDisplayBtn; + AeroButton* displayBtn; + AeroButton* plusRxBtn; + AeroButton* quitBtn; + AeroButton* nullBtn; + + AeroButton* moxBtn; + AeroButton* tunBtn; + AeroButton* alexBtn; + AeroButton* lastFreqBtn; + AeroButton* attenuatorBtn; + AeroButton* muteBtn; + + QList mainBtnList; + + QMenu *modeMenu; + QMenu *viewMenu; + QMenu *attenuatorMenu; + + QActionGroup *modeActionGroup; + QAction *noServerModeAction; + QAction *sdrModeAction; + QAction *chirpWSPRAction; + + QActionGroup *mercuryAttnActionGroup; + QActionGroup *alexAttnActionGroup; + QAction *mercuryAttn_0dBAction; + QAction *mercuryAttn_20dBAction; + QAction *alexAttn_0dBAction; + QAction *alexAttn_10dBAction; + QAction *alexAttn_20dBAction; + QAction *alexAttn_30dBAction; + + QList mercuryAttnActionList; + QList alexAttnActionList; + + bool m_resizeFrame; + bool m_mousePressed; + bool m_quitHighBotton; + bool m_fullScreen; + bool m_cudaPresence; + bool m_mover; + bool m_msgBrowserVisible; + + double m_alpha; + + int m_deltaX_max; + int m_deltaY_max; + int m_resizePosition; + int m_numberOfReceivers; + + int m_alexAttnState; + int m_mercuryAttnState; + + int m_oldSampleRate; + + //qreal m_agcMaxGain; + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void ctrlDisplayBtnClickedEvent(); + void closeMainWindow(); + void maximizeMainWindow(); + void setMainWindowGeometry(); + void updateTitle(); + void updateStatusBar(short load); + void setFullScreen(); + void getRegion(); + + void setServerMode(QSDR::_ServerMode mode); + //void setReceiver(); + void setTxAllowed(QObject *sender, bool value); + void setCurrentReceiver(QObject *sender, int rx); + void setNumberOfReceivers(QObject *sender, int value); + //void setInternalDSPMode(bool value); + void setSDRMode(bool); + void setChirpWSPRMode(bool value); + void getNetworkInterfaces(); + void setMainVolume(int value); + //void setHamBand(QObject *sender, int rx, bool byButton, HamBand band); + void setAGCMode(QObject *sender, int rx, AGCMode mode, bool hang); + void setAGCGain(int value); + //void setAGCGain(QObject *sender, int rx, int value); + void setAGCGain(QObject *sender, int rx, qreal value); + void getLastFrequency(); + void addReceiver(); + + void alexPresenceChanged(bool value); + void alexConfigurationChanged(quint16 conf); + void alexStateChanged(HamBand band, const QList &states); + void setAttenuator(); + void mercuryAttenuatorChanged(QObject *sender, HamBand band, int value); + + void showStatusBarMessage(const QString &msg, int time); + void clearStatusBarMessage(); + void showNetworkIODialog(); + void showWarningDialog(const QString &msg); + + void addNetworkIOComboBoxEntry(QString str); + void clearNetworkIOComboBoxEntry(); + + void widebandVisibilityChanged(bool value); + void showRadioPopup(bool value); + +protected: + //void getSelectedFrame(QPoint p); + //void paintEvent(QPaintEvent *event); + void closeEvent(QCloseEvent *event); + void keyPressEvent(QKeyEvent *event); + void showEvent(QShowEvent *event); + //void focusInEvent(QFocusEvent *event); + //void focusOutEvent(QFocusEvent *event); + //void moveEvent(QMoveEvent *event); + void resizeEvent(QResizeEvent *event); + //void changeEvent(QEvent *event); + //void mousePressEvent(QMouseEvent *event); + //void mouseMoveEvent(QMouseEvent *event); + //void mouseReleaseEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + +signals: + void setAGCSliderValue(int value); +}; + +//*************************************************************************** +// NetworkIODialog class + +class NetworkIODialog : public QDialog { + + Q_OBJECT + +public: + NetworkIODialog(QWidget *parent = 0); + ~NetworkIODialog(); + +public slots: + void addDeviceComboBoxItem(QString str); + void clearDeviceComboBoxItem(); + +private: + Settings* set; + + QFont m_titleFont; + QComboBox* m_deviceComboBox; + + TNetworkDevicecard m_deviceCard; + QList m_deviceCards; + +private slots: + void okBtnClicked(); +}; + + +//*************************************************************************** +// WarningDialog class + +class WarningDialog : public QDialog { + + Q_OBJECT + +public: + WarningDialog(QWidget *parent = 0); + ~WarningDialog(); + +public slots: + void setWarningMessage(const QString &msg); + +protected: + void paintEvent(QPaintEvent *event); + +private: + Settings* set; + + QFont m_titleFont; + //QPixmap m_warningIcon; + + QLabel* m_warningLabel; + + AeroButton* okBtn; + + QString m_message; + + int m_btnWidth; + int m_btnHeight; + int m_msgFontWidth; + int m_msgFontHeight; + +private slots: + void okBtnClicked(); +}; + +#endif // CUSDR_MAIN_H diff --git a/Source/src/cusdr_networkWidget.cpp b/Source/src/cusdr_networkWidget.cpp new file mode 100644 index 0000000..723699a --- /dev/null +++ b/Source/src/cusdr_networkWidget.cpp @@ -0,0 +1,600 @@ +/** +* @file cusdr_networkWidget.cpp +* @brief Network settings widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-10-24 +*/ + +/* + * + * Copyright 2010 - 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define LOG_NETWORK_WIDGET + +// use: NETWORK_WIDGET_DEBUG + +//#include +//#include +//#include +//#include +#include + +#include "cusdr_networkWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 42 + + +NetworkWidget::NetworkWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(set->getCurrentServerMode()) + , m_hwInterface(set->getHWInterface()) + , m_hwInterfaceTemp(set->getHWInterface()) + , m_dataEngineState(QSDR::DataEngineDown) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(0) + , m_numberOfReceivers(1) + , m_hpsdrHardware(set->getHPSDRHardware()) +{ + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 8, 4, 0); + setMouseTracking(true); + + m_deviceCards = set->getMetisCardsList(); + + createDeviceNetworkInterfaceGroup(); + createDeviceSearchGroup(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 4, 0); + hbox1->addWidget(hpsdrInterfaceExclusiveBtnGroup()); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(0); + hbox2->setContentsMargins(4, 0, 4, 0); + hbox2->addWidget(deviceNIGroupBox); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(0); + hbox3->setContentsMargins(4, 0, 4, 0); + hbox3->addWidget(searchNetworkDeviceGroupBox); + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + deviceNIGroupBox->hide(); + searchNetworkDeviceGroupBox->hide(); + } + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addStretch(); + setLayout(mainLayout); + + setupConnections(); + setSocketBufSize(this, set->getSocketBufferSize()); +} + +NetworkWidget::~NetworkWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void NetworkWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(newHPSDRDeviceNIC(QString, QString)), + this, + SLOT(addDeviceNICEntry(QString, QString))); + + CHECKED_CONNECT( + set, + SIGNAL(hpsdrDeviceNICChanged(int)), + this, + SLOT(setDeviceNIC(int))); + + CHECKED_CONNECT( + set, + SIGNAL(metisCardListChanged(QList)), + this, + SLOT(setNetworkDeviceList(QList))); + + CHECKED_CONNECT( + set, + SIGNAL(hpsdrNetworkDeviceChanged(TNetworkDevicecard)), + this, + SLOT(setCurrentNetworkDevice(TNetworkDevicecard))); + + CHECKED_CONNECT( + set, + SIGNAL(socketBufferSizeChanged(QObject*, int)), + this, + SLOT(setSocketBufSize(QObject*, int))); +} + +void NetworkWidget::addNICChangedConnection() { + + CHECKED_CONNECT( + networkDeviceInterfaces, + SIGNAL(currentIndexChanged(int)), + set, + SLOT(setHPSDRDeviceNIC(int))); +} + +void NetworkWidget::setDeviceNIC(int index) { + + networkDeviceInterfaces->setCurrentIndex(index); +} + +QGroupBox* NetworkWidget::hpsdrInterfaceExclusiveBtnGroup() { + + networkPresenceBtn = new AeroButton("Network", this); + networkPresenceBtn->setRoundness(0); + networkPresenceBtn->setFixedSize (btn_width, btn_height); + + CHECKED_CONNECT( + networkPresenceBtn, + SIGNAL(clicked()), + this, + SLOT(interfaceBtnClicked())); + + noHWBtn = new AeroButton("None", this); + noHWBtn->setRoundness(0); + noHWBtn->setFixedSize (btn_width, btn_height); + + CHECKED_CONNECT( + noHWBtn, + SIGNAL(clicked()), + this, + SLOT(interfaceBtnClicked())); + + hwInterfaceChanged(); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addWidget(noHWBtn); + hbox1->addWidget(networkPresenceBtn); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + + QGroupBox *groupBox = new QGroupBox(tr("Hardware Interface"), this); + groupBox->setMinimumWidth(m_minimumGroupBoxWidth); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(set->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +void NetworkWidget::createDeviceNetworkInterfaceGroup() { + + networkDeviceInterfaces = new QComboBox(); + + networkDeviceInterfaces->setStyleSheet(set->getComboBoxStyle()); + networkDeviceInterfaces->setMinimumContentsLength(22); + + socketBufSizeBtn = new AeroButton("Enable", this); + socketBufSizeBtn->setRoundness(10); + socketBufSizeBtn->setFixedSize(btn_widths, btn_height); + socketBufSizeBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + socketBufSizeBtn, + SIGNAL(clicked()), + this, + SLOT(socketBufSizeBtnClicked())); + + socketBufferSizes = new QComboBox(); + socketBufferSizes->setStyleSheet(set->getComboBoxStyle()); + socketBufferSizes->addItem("1 kB"); + socketBufferSizes->addItem("8 kB"); + socketBufferSizes->addItem("16 kB"); + socketBufferSizes->addItem("32 kB"); + socketBufferSizes->addItem("64 kB"); + socketBufferSizes->addItem("128 kB"); + socketBufferSizes->addItem("256 kB"); + socketBufferSizes->addItem("512 kB"); + socketBufferSizes->setEnabled(false); + + CHECKED_CONNECT( + socketBufferSizes, + SIGNAL(currentIndexChanged(int)), + this, + SLOT(setSocketBufferSize(int))); + + socketBufferSizeLabel = new QLabel("Socket Buffer Size:", this); + socketBufferSizeLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + socketBufferSizeLabel->setStyleSheet(set->getLabelStyle()); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(1); + hbox1->addStretch(); + hbox1->addWidget(networkDeviceInterfaces); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(1); + //hbox2->addStretch(); + hbox2->addWidget(socketBufferSizeLabel); + hbox2->addWidget(socketBufSizeBtn); + hbox2->addSpacing(3); + hbox2->addStretch(); + hbox2->addWidget(socketBufferSizes); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(3); + vbox->addSpacing(5); + vbox->addLayout(hbox1); + vbox->addSpacing(5); + vbox->addLayout(hbox2); + + deviceNIGroupBox = new QGroupBox(tr("Local network interface"), this); + deviceNIGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + deviceNIGroupBox->setLayout(vbox); + deviceNIGroupBox->setStyleSheet(set->getWidgetStyle()); + deviceNIGroupBox->setFont(QFont("Arial", 8)); +} + +void NetworkWidget::createDeviceSearchGroup() { + + searchNetworkDeviceBtn = new AeroButton("search", this); + searchNetworkDeviceBtn->setRoundness(10); + searchNetworkDeviceBtn->setFixedSize(btn_width2, btn_height); + + CHECKED_CONNECT( + searchNetworkDeviceBtn, + SIGNAL(clicked()), + this, + SLOT(searchHPSDRDeviceBtnClicked())); + + networkDeviceIPAdresses = new QComboBox(); + + networkDeviceIPAdresses->setStyleSheet(set->getComboBoxStyle()); + networkDeviceIPAdresses->setMinimumContentsLength(22); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(1); + hbox1->addStretch(); + hbox1->addWidget(searchNetworkDeviceBtn); + hbox1->addSpacing(3); + hbox1->addWidget(networkDeviceIPAdresses); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(3); + vbox->addSpacing(5); + vbox->addLayout(hbox1); + vbox->addSpacing(5); + + searchNetworkDeviceGroupBox = new QGroupBox(tr("HPSDR device IP address"), this); + searchNetworkDeviceGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + searchNetworkDeviceGroupBox->setLayout(vbox); + searchNetworkDeviceGroupBox->setStyleSheet(set->getWidgetStyle()); + searchNetworkDeviceGroupBox->setFont(QFont("Arial", 8)); +} + +// ************************************************************************ + +void NetworkWidget::addDeviceNICEntry(QString niName, QString ipAddress) { + + //QString item = niName; + QString item = ipAddress; + //item.append(" ("); + //item.append(ipAddress); + //item.append(")"); + networkDeviceInterfaces->addItem(item); + //this->repaint(); +} + +void NetworkWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + if (m_hwInterface != hwmode) { + + m_hwInterface = hwmode; + hwInterfaceChanged(); + } + + //m_oldServerMode = m_serverMode; + if (m_serverMode != mode) { + + if (mode == QSDR::ChirpWSPR) + disableButtons(); + + if (m_serverMode == QSDR::ChirpWSPR) + enableButtons(); + + m_serverMode = mode; + } + + if (m_dataEngineState != state) { + + if (state == QSDR::DataEngineUp) + disableButtons(); + else + enableButtons(); + + m_dataEngineState = state; + } + + //if (!change) return; + update(); +} + +void NetworkWidget::hwInterfaceChanged() { + + switch (m_hwInterface) { + + case QSDR::NoInterfaceMode: + + noHWBtn->setBtnState(AeroButton::ON); + networkPresenceBtn->setBtnState(AeroButton::OFF); + break; + + case QSDR::Metis: + case QSDR::Hermes: + + noHWBtn->setBtnState(AeroButton::OFF); + networkPresenceBtn->setBtnState(AeroButton::ON); + break; + } + + m_hwInterfaceTemp = m_hwInterface; +} + +void NetworkWidget::interfaceBtnClicked() { + + AeroButton *button = qobject_cast(sender()); + + //if (button == networkPresenceBtn && m_hpsdrHardware == 0) { // HPSDR modules + if (button == networkPresenceBtn) { // HPSDR modules + + noHWBtn->setBtnState(AeroButton::OFF); + noHWBtn->update(); + networkPresenceBtn->setBtnState(AeroButton::ON); + + if (m_hpsdrHardware == 0) { + + m_hwInterface = QSDR::Metis; + NETWORK_WIDGET_DEBUG << "HW interface changed to Metis."; + } + else if (m_hpsdrHardware == 1) { + + m_hwInterface = QSDR::Hermes; + NETWORK_WIDGET_DEBUG << "HW interface changed to Hermes."; + } + + deviceNIGroupBox->show(); + searchNetworkDeviceGroupBox->show(); + //source10MhzExclusiveGroup->show(); + //source122_88MhzExclusiveGroup->show(); + //socketBufferSizeGroupBox->show(); + } + else + if (button == noHWBtn) { + + networkPresenceBtn->setBtnState(AeroButton::OFF); + networkPresenceBtn->update(); + noHWBtn->setBtnState(AeroButton::ON); + + m_hwInterface = QSDR::NoInterfaceMode; + emit messageEvent("[hpsdr]: changed to no-interface mode."); + deviceNIGroupBox->hide(); + searchNetworkDeviceGroupBox->hide(); + //source10MhzExclusiveGroup->hide(); + //source122_88MhzExclusiveGroup->hide(); + //socketBufferSizeGroupBox->hide(); + } + + qDebug() << "HPSDRWidget:: setSystemState."; + set->setSystemState( + this, + QSDR::NoError, + m_hwInterface, + m_serverMode, + m_dataEngineState); +} + +void NetworkWidget::searchHPSDRDeviceBtnClicked() { + + set->searchHpsdrNetworkDevices(); +} + +void NetworkWidget::socketBufSizeBtnClicked() { + + if (socketBufSizeBtn->btnState() == AeroButton::OFF) { + + socketBufferSizes->setEnabled(true); + socketBufferSizes->blockSignals(true); + setSocketBufSize(this, set->getSocketBufferSize()); + socketBufferSizes->blockSignals(false); + //NETWORK_WIDGET_DEBUG << "getSocketBufferSize() :" << set->getSocketBufferSize(); + set->setManualSocketBufferSize(this, true); + socketBufSizeBtn->setText("Disable"); + socketBufSizeBtn->setBtnState(AeroButton::ON); + } + else { + + socketBufferSizes->setEnabled(false); + set->setManualSocketBufferSize(this, false); + socketBufSizeBtn->setText("Enable"); + socketBufSizeBtn->setBtnState(AeroButton::OFF); + } + + socketBufSizeBtn->update(); +} + +void NetworkWidget::disableButtons() { + + noHWBtn->setEnabled(false); + networkPresenceBtn->setEnabled(false); +} + +void NetworkWidget::enableButtons() { + + noHWBtn->setEnabled(true); + networkPresenceBtn->setEnabled(true); +} + +void NetworkWidget::setNetworkDeviceList(QList list) { + + m_deviceCards = list; + + if (list.length() == 0 ) { + + emit messageEvent("[hpsdr]: Metis card list empty."); + return; + } + + networkDeviceIPAdresses->clear(); + foreach (TNetworkDevicecard device, list) { + + networkDeviceIPAdresses->addItem(device.ip_address.toString()); + networkDeviceIPAdresses->update(); + } +} + +void NetworkWidget::setCurrentNetworkDevice(TNetworkDevicecard card) { + + int i = 0; + foreach (TNetworkDevicecard dev, m_deviceCards) { + + if (dev.ip_address == card.ip_address) networkDeviceIPAdresses->setCurrentIndex(i); + i++; + } +} + +void NetworkWidget::setSocketBufSize(QObject *sender, int size) { + + Q_UNUSED (sender) + //if (sender == this) return; + + m_socketBufferSize = size; + + switch (m_socketBufferSize) { + + case 1: + socketBufferSizes->setCurrentIndex(0); + break; + + case 8: + socketBufferSizes->setCurrentIndex(1); + break; + + case 16: + socketBufferSizes->setCurrentIndex(2); + break; + + case 32: + socketBufferSizes->setCurrentIndex(3); + break; + + case 64: + socketBufferSizes->setCurrentIndex(4); + break; + + case 128: + socketBufferSizes->setCurrentIndex(5); + break; + + case 256: + socketBufferSizes->setCurrentIndex(6); + break; + + case 512: + socketBufferSizes->setCurrentIndex(7); + break; + } + +} + +void NetworkWidget::setSocketBufferSize(int value) { + + switch (value) { + + case 0: + set->setSocketBufferSize(this, 1); + break; + + case 1: + set->setSocketBufferSize(this, 8); + break; + + case 2: + set->setSocketBufferSize(this, 16); + break; + + case 3: + set->setSocketBufferSize(this, 32); + break; + + case 4: + set->setSocketBufferSize(this, 64); + break; + + case 5: + set->setSocketBufferSize(this, 128); + break; + + case 6: + set->setSocketBufferSize(this, 256); + break; + + case 7: + set->setSocketBufferSize(this, 512); + break; + } +} diff --git a/Source/src/cusdr_networkWidget.h b/Source/src/cusdr_networkWidget.h new file mode 100644 index 0000000..bc22b17 --- /dev/null +++ b/Source/src/cusdr_networkWidget.h @@ -0,0 +1,129 @@ +/** +* @file cusdr_networkWidget.h +* @brief Network settings widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-10-24 +*/ + +/* + * + * Copyright 2010 - 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_NETWORK_WIDGET_H +#define _CUSDR_NETWORK_WIDGET_H + +#include +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + +#ifdef LOG_NETWORK_WIDGET +# define NETWORK_WIDGET_DEBUG qDebug().nospace() << "NetworkWidget::\t" +#else +# define NETWORK_WIDGET_DEBUG nullDebug() +#endif + + +class NetworkWidget : public QWidget { + + Q_OBJECT + +public: + NetworkWidget(QWidget *parent = 0); + ~NetworkWidget(); + + +public slots: + void addDeviceNICEntry(QString niName, QString ipAddress); + void addNICChangedConnection(); + void setSocketBufSize(QObject *sender, int size); + void hwInterfaceChanged(); + +private: + Settings *set; + + QString m_message; + + QList m_deviceCards; + + QGroupBox *hpsdrInterfaceExclusiveBtnGroup(); + QGroupBox *receiversExclusiveBtnGroup(); + QGroupBox *source10MhzExclusiveGroup; + QGroupBox *source122_88MhzExclusiveGroup; + QGroupBox *deviceNIGroupBox; + QGroupBox *searchNetworkDeviceGroupBox; + QGroupBox *socketBufferSizeGroupBox; + + QComboBox *networkDeviceInterfaces; + QComboBox *networkDeviceIPAdresses; + QComboBox *socketBufferSizes; + QComboBox *m_receiverComboBox; + + QLabel *socketBufferSizeLabel; + + AeroButton *networkPresenceBtn; + AeroButton *noHWBtn; + + AeroButton *searchNetworkDeviceBtn; + AeroButton *socketBufSizeBtn; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_HWInterfaceMode m_hwInterfaceTemp; + QSDR::_DataEngineState m_dataEngineState; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_numberOfReceivers; + int m_hpsdrHardware; + int m_socketBufferSize; + + void setupConnections(); + void createDeviceNetworkInterfaceGroup(); + void createDeviceSearchGroup(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void interfaceBtnClicked(); + void searchHPSDRDeviceBtnClicked(); + void socketBufSizeBtnClicked(); + void setSocketBufferSize(int value); + void setDeviceNIC(int index); + void setNetworkDeviceList(QList list); + void setCurrentNetworkDevice(TNetworkDevicecard card); + void disableButtons(); + void enableButtons(); + +signals: + void messageEvent(QString message); +}; + +#endif // _CUSDR_NETWORK_WIDGET_H diff --git a/Source/src/cusdr_radioParameter.h b/Source/src/cusdr_radioParameter.h new file mode 100644 index 0000000..a4f0abb --- /dev/null +++ b/Source/src/cusdr_radioParameter.h @@ -0,0 +1,35 @@ +/** +* @file cusdr_radioParameter.h +* @brief Radio parameter header for cuSDR +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-09-22 +*/ + +/* + * Copyright 2011 Hermann von Hasseln, DL3HVH + * + * Based on the complex type CPX by Philip A Covington, p.covington@gmail.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_RADIO_PARAMETER_H +#define _CUSDR_RADIO_PARAMETER_H + + + + +#endif // _CUSDR_RADIO_PARAMETER_H diff --git a/Source/src/cusdr_radioPopupWidget.cpp b/Source/src/cusdr_radioPopupWidget.cpp new file mode 100644 index 0000000..7dc002e --- /dev/null +++ b/Source/src/cusdr_radioPopupWidget.cpp @@ -0,0 +1,2670 @@ +/** +* @file cusdr_radioPopupWidget.cpp +* @brief Radio control popup widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-22 +*/ + +/* + * Copyright 2010-2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#include +//#include + +#define LOG_RADIOPOPUP + +// use: RADIOPOPUP_DEBUG + +#include "cusdr_radioPopupWidget.h" + +#define btn_height 14 +#define btn_height1 16 +#define btn_width 40 +#define btn_widthb 66 +#define btn_widths 34 + + +RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx) + : QWidget(parent) + , set(Settings::instance()) + , m_sticky(false) + , m_receiver(rx) + , m_currentRx(set->getCurrentReceiver()) + , m_minimumWidgetWidth(210) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + + setMouseTracking(true); + setContentsMargins(4, 4, 4, 4); + setWindowOpacity(0.9); + + + //setFixedWidth(206); + //setFixedWidth(210); + //setMinimumHeight(100); + //setFixedHeight(240); + + setFocusPolicy(Qt::StrongFocus); + + QString style = QString::fromUtf8( + "border: 0px solid rgba(166, 196, 208, 255);" + //"border: 1px solid;"// rgba(166, 196, 208, 255);" + //"border-left-color: rgba(220, 120, 120, 255);" + //"border-top-color: rgba(220, 120, 120, 255);" + //"border-right-color: rgba(0, 0, 0, 255);" + //"border-bottom-color: rgba(0, 0, 0, 255);" + "color: rgb(166, 196, 208); " + //"background-color: rgba(40, 40, 40, 255); "); + "background-color: rgba(25, 25, 25, 255); "); + + setStyleSheet(style); + + fonts = new CFonts(this); + m_fonts = fonts->getFonts(); + + m_receiverDataList = set->getReceiverDataList(); + + m_hamBand = m_receiverDataList.at(m_receiver).hamBand; + //m_dspMode = m_receiverDataList.at(m_receiver).dspMode; + m_dspModeList = m_receiverDataList.at(m_receiver).dspModeList; + m_agcMode = m_receiverDataList.at(m_receiver).agcMode; + m_filterMode = m_receiverDataList.at(m_receiver).defaultFilterMode; + m_filterLo = m_receiverDataList.at(m_receiver).filterLo; + m_filterHi = m_receiverDataList.at(m_receiver).filterHi; + + m_spectrumAveraging = m_receiverDataList.at(m_receiver).spectrumAveraging; + m_panGrid = m_receiverDataList.at(m_receiver).panGrid; + m_peakHold = m_receiverDataList.at(m_receiver).peakHold; + m_panLocked = m_receiverDataList.at(m_receiver).panLocked; + m_clickVFO = m_receiverDataList.at(m_receiver).clickVFO; + m_showCross = m_receiverDataList.at(m_receiver).hairCross; + + m_panadapterMode = m_receiverDataList.at(m_receiver).panMode; + m_waterfallColorMode = m_receiverDataList.at(m_receiver).waterfallMode; + + m_lastCtrFrequencyList = m_receiverDataList.at(m_receiver).lastCenterFrequencyList; + m_lastVfoFrequencyList = m_receiverDataList.at(m_receiver).lastVfoFrequencyList; + + stickyBtn = new AeroButton("Lock", this); + stickyBtn->setRoundness(0); + stickyBtn->setGlass(false); + QColor col = QColor(35, 35, 35); + stickyBtn->setColor(col); + col = QColor(120, 120, 120); + stickyBtn->setHighlight(col); + col = QColor(160, 100, 100); + stickyBtn->setColorOn(col); + stickyBtn->setFixedSize(btn_width, btn_height1); + //stickyBtn->move(size().width() - btn_width - 2, 2); + stickyBtn->setBtnState(AeroButton::OFF); + CHECKED_CONNECT(stickyBtn, SIGNAL(clicked()), this, SLOT(setSticky())); + + createOptionsBtnGroup(); + createBandBtnGroup(); + createModeBtnGroup(); + createAgcBtnGroup(); + createFilterBtnWidgetA(); + createFilterBtnWidgetB(); + createFilterBtnWidgetC(); + + m_filterStackedWidget = new QStackedWidget(this); + m_filterStackedWidget->setContentsMargins(0, 0, 0, 0); + m_filterStackedWidget->setFixedHeight(30); + m_filterStackedWidget->addWidget(filterAWidget); + m_filterStackedWidget->addWidget(filterBWidget); + m_filterStackedWidget->addWidget(filterCWidget); + + + QString rxStr = tr(" Rx %1 "); + QLabel* rxLabel = new QLabel(rxStr.arg(m_receiver + 1)); + rxLabel->setStyleSheet("background-color: rgba(40, 40, 40, 255);"); + + QHBoxLayout* title = new QHBoxLayout(); + title->setContentsMargins(0, 0, 0, 0); + title->setSpacing(0); + title->addWidget(rxLabel); + title->addStretch(); + title->addWidget(stickyBtn); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->setSpacing(0); + mainLayout->setMargin(0); + mainLayout->addLayout(title); + mainLayout->addSpacing(16); + //mainLayout->addStretch(); + mainLayout->addLayout(optionsVBox); + mainLayout->addSpacing(16); + mainLayout->addLayout(bandVBox); + mainLayout->addSpacing(8); + mainLayout->addLayout(modeVBox); + mainLayout->addSpacing(8); + mainLayout->addWidget(m_filterStackedWidget); + mainLayout->addSpacing(16); + mainLayout->addLayout(agcVBox); + mainLayout->addStretch(); + + setLayout(mainLayout); + + // setup values from settings.ini + bandBtnList.at(m_hamBand)->setBtnState(AeroButton::ON); + bandBtnList.at(m_hamBand)->update(); + + dspModeChanged(this, 0, m_dspModeList.at(m_hamBand)); + agcModeChanged(this, 0, m_agcMode, false); + filterChanged(this, 0, m_filterLo, m_filterHi); + + DSPMode dspMode = m_dspModeList.at(m_hamBand); + if (dspMode == (DSPMode) LSB || dspMode == (DSPMode) USB || dspMode == (DSPMode) DIGU || dspMode == (DSPMode) DIGL) { + + m_filterStackedWidget->setCurrentIndex(0); + } + else + if (dspMode == (DSPMode) DSB || dspMode == (DSPMode) FMN || dspMode == (DSPMode) AM || dspMode == (DSPMode) SAM) { + + m_filterStackedWidget->setCurrentIndex(1); + } + else + if (dspMode == (DSPMode) CWL || dspMode == (DSPMode) CWU) { + + m_filterStackedWidget->setCurrentIndex(2); + } + + setupConnections(); + + m_timerID = 0; + m_closingTimer.start(); + m_timerID = startTimer(100); +} + +RadioPopupWidget::~RadioPopupWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); + + if (m_timerID) { + + killTimer(m_timerID); + m_timerID = 0; + } +} + +//QSize RadioPopupWidget::sizeHint() const { +// +// return QSize(m_minimumWidgetWidth, height()); +//} + +QSize RadioPopupWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void RadioPopupWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode)), + this, + SLOT(graphicModeChanged( + QObject *, + int, + PanGraphicsMode, + WaterfallColorMode))); + + CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(vfoFrequencyChanged(QObject *, int, int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), + this, + SLOT(bandChanged(QObject *, int, bool, HamBand))); + + CHECKED_CONNECT( + set, + SIGNAL(dspModeChanged(QObject *, int, DSPMode)), + this, + SLOT(dspModeChanged(QObject *, int, DSPMode))); + + CHECKED_CONNECT( + set, + SIGNAL(agcModeChanged(QObject *, int, AGCMode, bool)), + this, + SLOT(agcModeChanged(QObject *, int, AGCMode, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(filterFrequenciesChanged(QObject *, int, qreal, qreal)), + this, + SLOT(filterChanged(QObject *, int, qreal, qreal))); +} + +void RadioPopupWidget::createOptionsBtnGroup() { + + //m_optionsLabel = new QLabel("Options:", this); + //m_optionsLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + //m_optionsLabel->setStyleSheet(set->getLabelStyle()); + + avgBtn = new AeroButton("Pan Avg", this); + avgBtn->setRoundness(10); + avgBtn->setFont(m_fonts.smallFont); + + if (m_spectrumAveraging) + avgBtn->setBtnState(AeroButton::ON); + else + avgBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + avgBtn, + SIGNAL(clicked()), + this, + SLOT(avgBtnClicked())); + + gridBtn = new AeroButton("Pan Grid", this); + gridBtn->setRoundness(10); + gridBtn->setFont(m_fonts.smallFont); + + if (m_panGrid) + gridBtn->setBtnState(AeroButton::ON); + else + gridBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + gridBtn, + SIGNAL(clicked()), + this, + SLOT(gridBtnClicked())); + + peakHoldBtn = new AeroButton("Peak Hold", this); + peakHoldBtn->setRoundness(10); + peakHoldBtn->setFont(m_fonts.smallFont); + peakHoldBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + peakHoldBtn, + SIGNAL(clicked()), + this, + SLOT(peakHoldBtnClicked())); + + lockPanBtn = new AeroButton("Lock Pan", this); + lockPanBtn->setRoundness(10); + lockPanBtn->setFont(m_fonts.smallFont); + + if (m_panLocked) + lockPanBtn->setBtnState(AeroButton::ON); + else + lockPanBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + lockPanBtn, + SIGNAL(clicked()), + this, + SLOT(panLockedBtnClicked())); + + clickVfoBtn = new AeroButton("Click VFO", this); + clickVfoBtn->setRoundness(10); + clickVfoBtn->setFont(m_fonts.smallFont); + + if (m_clickVFO) + clickVfoBtn->setBtnState(AeroButton::ON); + else + clickVfoBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + clickVfoBtn, + SIGNAL(clicked()), + this, + SLOT(clickVfoBtnClicked())); + + showCrossBtn = new AeroButton("Hair Cross", this); + showCrossBtn->setRoundness(10); + showCrossBtn->setFont(m_fonts.smallFont); + + if (m_showCross) + showCrossBtn->setBtnState(AeroButton::ON); + else + showCrossBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + showCrossBtn, + SIGNAL(clicked()), + this, + SLOT(hairCrossBtnClicked())); + + midToVfoBtn = new AeroButton("Mid = VFO", this); + midToVfoBtn->setRoundness(10); + midToVfoBtn->setFont(m_fonts.smallFont); + + CHECKED_CONNECT( + midToVfoBtn, + SIGNAL(clicked()), + this, + SLOT(midToVfoBtnClicked())); + + vfoToMidBtn = new AeroButton("VFO = Mid", this); + vfoToMidBtn->setRoundness(10); + vfoToMidBtn->setFont(m_fonts.smallFont); + + CHECKED_CONNECT( + vfoToMidBtn, + SIGNAL(clicked()), + this, + SLOT(vfoToMidBtnClicked())); + + m_PanLineBtn = new AeroButton("Line", this); + m_PanLineBtn->setRoundness(10); + m_PanLineBtn->setFont(m_fonts.smallFont); + panadapterBtnList.append(m_PanLineBtn); + + CHECKED_CONNECT( + m_PanLineBtn, + SIGNAL(clicked()), + this, + SLOT(panModeChanged())); + + m_PanFilledLineBtn = new AeroButton("Filled Line", this); + m_PanFilledLineBtn->setRoundness(10); + m_PanFilledLineBtn->setFont(m_fonts.smallFont); + panadapterBtnList.append(m_PanFilledLineBtn); + + CHECKED_CONNECT( + m_PanFilledLineBtn, + SIGNAL(clicked()), + this, + SLOT(panModeChanged())); + + m_PanSolidBtn = new AeroButton("Solid", this); + m_PanSolidBtn->setRoundness(10); + m_PanSolidBtn->setFont(m_fonts.smallFont); + panadapterBtnList.append(m_PanSolidBtn); + + CHECKED_CONNECT( + m_PanSolidBtn, + SIGNAL(clicked()), + this, + SLOT(panModeChanged())); + + switch (m_panadapterMode) { + + case (PanGraphicsMode) Line: + + m_PanLineBtn->setBtnState(AeroButton::ON); + m_PanFilledLineBtn->setBtnState(AeroButton::OFF); + m_PanSolidBtn->setBtnState(AeroButton::OFF); + break; + + case (PanGraphicsMode) FilledLine: + + m_PanFilledLineBtn->setBtnState(AeroButton::ON); + m_PanLineBtn->setBtnState(AeroButton::OFF); + m_PanSolidBtn->setBtnState(AeroButton::OFF); + break; + + case (PanGraphicsMode) Solid: + + m_PanSolidBtn->setBtnState(AeroButton::ON); + m_PanLineBtn->setBtnState(AeroButton::OFF); + m_PanFilledLineBtn->setBtnState(AeroButton::OFF); + break; + } + + + m_WaterfallSimpleBtn = new AeroButton("Simple", this); + m_WaterfallSimpleBtn->setRoundness(10); + m_WaterfallSimpleBtn->setFont(m_fonts.smallFont); + waterfallBtnList.append(m_WaterfallSimpleBtn); + + CHECKED_CONNECT( + m_WaterfallSimpleBtn, + SIGNAL(clicked()), + this, + SLOT(waterfallModeChanged())); + + m_WaterfallEnhancedBtn = new AeroButton("Enhanced", this); + m_WaterfallEnhancedBtn->setRoundness(10); + m_WaterfallEnhancedBtn->setFont(m_fonts.smallFont); + waterfallBtnList.append(m_WaterfallEnhancedBtn); + + CHECKED_CONNECT( + m_WaterfallEnhancedBtn, + SIGNAL(clicked()), + this, + SLOT(waterfallModeChanged())); + + switch (m_waterfallColorMode) { + + case (WaterfallColorMode) Simple: + + m_WaterfallSimpleBtn->setBtnState(AeroButton::ON); + m_WaterfallEnhancedBtn->setBtnState(AeroButton::OFF); + break; + + case (WaterfallColorMode) Enhanced: + + m_WaterfallSimpleBtn->setBtnState(AeroButton::OFF); + m_WaterfallEnhancedBtn->setBtnState(AeroButton::ON); + break; + } + + /*QHBoxLayout* hbox0 = new QHBoxLayout(); + hbox0->setContentsMargins(0, 0, 0, 0); + hbox0->setSpacing(0); + hbox0->addWidget(m_optionsLabel); + hbox0->addStretch();*/ + + QHBoxLayout* hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(avgBtn); + hbox1->addWidget(gridBtn); + hbox1->addWidget(peakHoldBtn); + + QHBoxLayout* hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(lockPanBtn); + hbox2->addWidget(clickVfoBtn); + hbox2->addWidget(showCrossBtn); + + QHBoxLayout* hbox3 = new QHBoxLayout(); + hbox3->setContentsMargins(0, 0, 0, 0); + hbox3->setSpacing(0); + hbox3->addWidget(midToVfoBtn); + hbox3->addWidget(vfoToMidBtn); + + QHBoxLayout* hbox4 = new QHBoxLayout(); + hbox4->setContentsMargins(0, 0, 0, 0); + hbox4->setSpacing(0); + hbox4->addWidget(m_PanLineBtn); + hbox4->addWidget(m_PanFilledLineBtn); + hbox4->addWidget(m_PanSolidBtn); + + QHBoxLayout* hbox5 = new QHBoxLayout(); + hbox5->setContentsMargins(0, 0, 0, 0); + hbox5->setSpacing(0); + hbox5->addWidget(m_WaterfallSimpleBtn); + hbox5->addWidget(m_WaterfallEnhancedBtn); + + optionsVBox = new QVBoxLayout; + optionsVBox->setSpacing(1); + //optionsVBox->addLayout(hbox0); + optionsVBox->addLayout(hbox1); + optionsVBox->addLayout(hbox2); + optionsVBox->addLayout(hbox3); + optionsVBox->addSpacing(4); + optionsVBox->addLayout(hbox4); + optionsVBox->addLayout(hbox5); +} + +void RadioPopupWidget::createBandBtnGroup() { + + band2200mBtn = new AeroButton("2200m", this); + bandBtnList.append(band2200mBtn); + CHECKED_CONNECT(band2200mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band630mBtn = new AeroButton("630 m", this); + bandBtnList.append(band630mBtn); + CHECKED_CONNECT(band630mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band160mBtn = new AeroButton("160 m", this); + bandBtnList.append(band160mBtn); + CHECKED_CONNECT(band160mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band80mBtn = new AeroButton("80 m", this); + bandBtnList.append(band80mBtn); + CHECKED_CONNECT(band80mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band60mBtn = new AeroButton("60 m", this); + bandBtnList.append(band60mBtn); + CHECKED_CONNECT(band60mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band40mBtn = new AeroButton("40 m", this); + bandBtnList.append(band40mBtn); + CHECKED_CONNECT(band40mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band30mBtn = new AeroButton("30 m", this); + bandBtnList.append(band30mBtn); + CHECKED_CONNECT(band30mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band20mBtn = new AeroButton("20 m", this); + bandBtnList.append(band20mBtn); + CHECKED_CONNECT(band20mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band17mBtn = new AeroButton("17 m", this); + bandBtnList.append(band17mBtn); + CHECKED_CONNECT(band17mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band15mBtn = new AeroButton("15 m", this); + bandBtnList.append(band15mBtn); + CHECKED_CONNECT(band15mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band12mBtn = new AeroButton("12 m", this); + bandBtnList.append(band12mBtn); + CHECKED_CONNECT(band12mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band10mBtn = new AeroButton("10 m", this); + bandBtnList.append(band10mBtn); + CHECKED_CONNECT(band10mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band6mBtn = new AeroButton("6 m", this); + bandBtnList.append(band6mBtn); + CHECKED_CONNECT(band6mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + bandGenBtn = new AeroButton("Gen", this); + bandBtnList.append(bandGenBtn); + CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + foreach (AeroButton *btn, bandBtnList) { + + btn->setRoundness(0); + btn->setFixedHeight(btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + btn->update(); + } + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(band2200mBtn); + hbox1->addWidget(band630mBtn); + hbox1->addWidget(band160mBtn); + hbox1->addWidget(band80mBtn); + hbox1->addWidget(band60mBtn); + hbox1->addWidget(band40mBtn); + hbox1->addWidget(band30mBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(band20mBtn); + hbox2->addWidget(band17mBtn); + hbox2->addWidget(band15mBtn); + hbox2->addWidget(band12mBtn); + hbox2->addWidget(band10mBtn); + hbox2->addWidget(band6mBtn); + hbox2->addWidget(bandGenBtn); + + bandVBox = new QVBoxLayout; + bandVBox->setSpacing(1); + bandVBox->addLayout(hbox1); + bandVBox->addLayout(hbox2); + +} + +void RadioPopupWidget::createModeBtnGroup() { + + lsbBtn = new AeroButton("LSB", this); + dspModeBtnList.append(lsbBtn); + CHECKED_CONNECT(lsbBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + usbBtn = new AeroButton("USB", this); + dspModeBtnList.append(usbBtn); + CHECKED_CONNECT(usbBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + dsbBtn = new AeroButton("DSB", this); + dspModeBtnList.append(dsbBtn); + CHECKED_CONNECT(dsbBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + cwlBtn = new AeroButton("CWL", this); + dspModeBtnList.append(cwlBtn); + CHECKED_CONNECT(cwlBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + cwuBtn = new AeroButton("CWU", this); + dspModeBtnList.append(cwuBtn); + CHECKED_CONNECT(cwuBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + fmnBtn = new AeroButton("FMN", this); + dspModeBtnList.append(fmnBtn); + CHECKED_CONNECT(fmnBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + amBtn = new AeroButton("AM", this); + dspModeBtnList.append(amBtn); + CHECKED_CONNECT(amBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + diguBtn = new AeroButton("DIGU", this); + dspModeBtnList.append(diguBtn); + CHECKED_CONNECT(diguBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + diglBtn = new AeroButton("DIGL", this); + dspModeBtnList.append(diglBtn); + CHECKED_CONNECT(diglBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + specBtn = new AeroButton("SPEC", this); + dspModeBtnList.append(specBtn); + CHECKED_CONNECT(specBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + samBtn = new AeroButton("SAM", this); + dspModeBtnList.append(samBtn); + CHECKED_CONNECT(samBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + drmBtn = new AeroButton("DRM", this); + dspModeBtnList.append(drmBtn); + CHECKED_CONNECT(drmBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + foreach (AeroButton *btn, dspModeBtnList) { + + btn->setRoundness(0); + btn->setFixedHeight(btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + btn->update(); + } + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(lsbBtn); + hbox1->addWidget(usbBtn); + hbox1->addWidget(dsbBtn); + hbox1->addWidget(cwlBtn); + hbox1->addWidget(cwuBtn); + hbox1->addWidget(fmnBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(amBtn); + hbox2->addWidget(diguBtn); + hbox2->addWidget(specBtn); + hbox2->addWidget(diglBtn); + hbox2->addWidget(samBtn); + hbox2->addWidget(drmBtn); + + modeVBox = new QVBoxLayout; + modeVBox->setSpacing(1); + modeVBox->addLayout(hbox1); + modeVBox->addLayout(hbox2); +} + +void RadioPopupWidget::createAgcBtnGroup() { + + agcOFF = new AeroButton("Off", this); + agcOFF->setRoundness(0); + agcOFF->setFixedSize(btn_widths, btn_height); + agcOFF->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcOFF); + CHECKED_CONNECT(agcOFF, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcLONG = new AeroButton("Long", this); + agcLONG->setRoundness(0); + agcLONG->setFixedSize(btn_widths, btn_height); + agcLONG->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcLONG); + CHECKED_CONNECT(agcLONG, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcSLOW = new AeroButton("Slow", this); + agcSLOW->setRoundness(0); + agcSLOW->setFixedSize(btn_widths, btn_height); + agcSLOW->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcSLOW); + CHECKED_CONNECT(agcSLOW, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcMED = new AeroButton("Med", this); + agcMED->setRoundness(0); + agcMED->setFixedSize(btn_widths, btn_height); + agcMED->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcMED); + CHECKED_CONNECT(agcMED, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcFAST = new AeroButton("Fast", this); + agcFAST->setRoundness(0); + agcFAST->setFixedSize(btn_widths, btn_height); + agcFAST->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcFAST); + CHECKED_CONNECT(agcFAST, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + agcUSER = new AeroButton("User", this); + agcUSER->setRoundness(0); + agcUSER->setFixedSize(btn_widths, btn_height); + agcUSER->setStyleSheet(set->getMiniButtonStyle()); + agcModeBtnList.append(agcUSER); + CHECKED_CONNECT(agcUSER, SIGNAL(clicked()), this, SLOT(agcModeChangedByBtn())); + + showAGCLines = new AeroButton("Show Lines", this); + showAGCLines->setRoundness(0); + showAGCLines->setFixedSize(btn_widthb, btn_height); + showAGCLines->setStyleSheet(set->getMiniButtonStyle()); + CHECKED_CONNECT(showAGCLines, SIGNAL(clicked()), this, SLOT(agcShowLinesChanged())); + + if (m_receiverDataList.at(m_receiver).agcLines) + showAGCLines->setBtnState(AeroButton::ON); + else + showAGCLines->setBtnState(AeroButton::OFF); + + QHBoxLayout* hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(agcOFF); + hbox1->addWidget(agcLONG); + hbox1->addWidget(agcSLOW); + hbox1->addWidget(agcMED); + hbox1->addWidget(agcFAST); + hbox1->addWidget(agcUSER); + + QHBoxLayout* hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(showAGCLines); + hbox2->addStretch(); + + agcVBox = new QVBoxLayout; + agcVBox->setSpacing(1); + agcVBox->addLayout(hbox1); + agcVBox->addLayout(hbox2); +} + +void RadioPopupWidget::createFilterBtnWidgetA() { + + filter1kBtnA = new AeroButton("1k", this); + filter1kBtnA->setObjectName("1k"); + filterBtnListA.append(filter1kBtnA); + CHECKED_CONNECT(filter1kBtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter1k8BtnA = new AeroButton("1k8", this); + filter1k8BtnA->setObjectName("1k8"); + filterBtnListA.append(filter1k8BtnA); + CHECKED_CONNECT(filter1k8BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k1BtnA = new AeroButton("2k1", this); + filter2k1BtnA->setObjectName("2k1"); + filterBtnListA.append(filter2k1BtnA); + CHECKED_CONNECT(filter2k1BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k4BtnA = new AeroButton("2k4", this); + filter2k4BtnA->setObjectName("2k4"); + filterBtnListA.append(filter2k4BtnA); + CHECKED_CONNECT(filter2k4BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k7BtnA = new AeroButton("2k7", this); + filter2k7BtnA->setObjectName("2k7"); + filterBtnListA.append(filter2k7BtnA); + CHECKED_CONNECT(filter2k7BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k9BtnA = new AeroButton("2k9", this); + filter2k9BtnA->setObjectName("2k9"); + filterBtnListA.append(filter2k9BtnA); + CHECKED_CONNECT(filter2k9BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter3k3BtnA = new AeroButton("3k3", this); + filter3k3BtnA->setObjectName("3k3"); + filterBtnListA.append(filter3k3BtnA); + CHECKED_CONNECT(filter3k3BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter3k8BtnA = new AeroButton("3k8", this); + filter3k8BtnA->setObjectName("3k8"); + filterBtnListA.append(filter3k8BtnA); + CHECKED_CONNECT(filter3k8BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter4k4BtnA = new AeroButton("4k4", this); + filter4k4BtnA->setObjectName("4k4"); + filterBtnListA.append(filter4k4BtnA); + CHECKED_CONNECT(filter4k4BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter5kBtnA = new AeroButton("5k", this); + filter5kBtnA->setObjectName("5k"); + filterBtnListA.append(filter5kBtnA); + CHECKED_CONNECT(filter5kBtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar1BtnA = new AeroButton("Var1", this); + filterVar1BtnA->setObjectName("Var1"); + filterBtnListA.append(filterVar1BtnA); + CHECKED_CONNECT(filterVar1BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar2BtnA = new AeroButton("Var2", this); + filterVar2BtnA->setObjectName("Var2"); + filterBtnListA.append(filterVar2BtnA); + CHECKED_CONNECT(filterVar2BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + foreach(AeroButton *btn, filterBtnListA) { + + btn->setRoundness(0); + btn->setFixedHeight(btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + //filterBtnListA.at(set->getCurrentDSPMode())->setBtnState(AeroButton::ON); + + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(filter5kBtnA); + hbox1->addWidget(filter4k4BtnA); + hbox1->addWidget(filter3k8BtnA); + hbox1->addWidget(filter3k3BtnA); + hbox1->addWidget(filter2k9BtnA); + hbox1->addWidget(filter2k7BtnA); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(filter2k4BtnA); + hbox2->addWidget(filter2k1BtnA); + hbox2->addWidget(filter1k8BtnA); + hbox2->addWidget(filter1kBtnA); + hbox2->addWidget(filterVar1BtnA); + hbox2->addWidget(filterVar2BtnA); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(0); + vbox->setMargin(0); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + filterAWidget = new QWidget(); + filterAWidget->setContentsMargins(0, 0, 0, 0); + filterAWidget->setLayout(vbox); +} + +void RadioPopupWidget::createFilterBtnWidgetB() { + + filter16kBtnB = new AeroButton("16k", this); + filterBtnListB.append(filter16kBtnB); + CHECKED_CONNECT(filter16kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter12kBtnB = new AeroButton("12k", this); + filterBtnListB.append(filter12kBtnB); + CHECKED_CONNECT(filter12kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter10kBtnB = new AeroButton("10k", this); + filterBtnListB.append(filter10kBtnB); + CHECKED_CONNECT(filter10kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter8kBtnB = new AeroButton("8k", this); + filterBtnListB.append(filter8kBtnB); + CHECKED_CONNECT(filter8kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter6k6BtnB = new AeroButton("6k6", this); + filterBtnListB.append(filter6k6BtnB); + CHECKED_CONNECT(filter6k6BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter5k2BtnB = new AeroButton("5k2", this); + filterBtnListB.append(filter5k2BtnB); + CHECKED_CONNECT(filter5k2BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter4kBtnB = new AeroButton("4k", this); + filterBtnListB.append(filter4kBtnB); + CHECKED_CONNECT(filter4kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter3k1BtnB = new AeroButton("3k1", this); + filterBtnListB.append(filter3k1BtnB); + CHECKED_CONNECT(filter3k1BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k9BtnB = new AeroButton("2k9", this); + filterBtnListB.append(filter2k9BtnB); + CHECKED_CONNECT(filter2k9BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k4BtnB = new AeroButton("2k4", this); + filterBtnListB.append(filter2k4BtnB); + CHECKED_CONNECT(filter2k4BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar1BtnB = new AeroButton("Var1", this); + filterBtnListB.append(filterVar1BtnB); + CHECKED_CONNECT(filterVar1BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar2BtnB = new AeroButton("Var2", this); + filterBtnListB.append(filterVar2BtnB); + CHECKED_CONNECT(filterVar2BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + foreach(AeroButton *btn, filterBtnListB) { + + btn->setRoundness(0); + btn->setFixedHeight(btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + //filterBtnListA.at(set->getCurrentDSPMode())->setBtnState(AeroButton::ON); + + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(filter16kBtnB); + hbox1->addWidget(filter12kBtnB); + hbox1->addWidget(filter10kBtnB); + hbox1->addWidget(filter8kBtnB); + hbox1->addWidget(filter6k6BtnB); + hbox1->addWidget(filter5k2BtnB); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(filter4kBtnB); + hbox2->addWidget(filter3k1BtnB); + hbox2->addWidget(filter2k9BtnB); + hbox2->addWidget(filter2k4BtnB); + hbox2->addWidget(filterVar1BtnB); + hbox2->addWidget(filterVar2BtnB); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(0); + vbox->setMargin(0); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + filterBWidget = new QWidget(); + filterBWidget->setContentsMargins(0, 0, 0, 0); + filterBWidget->setLayout(vbox); +} + +void RadioPopupWidget::createFilterBtnWidgetC() { + + filter1kBtnC = new AeroButton("1k", this); + filterBtnListC.append(filter1kBtnC); + CHECKED_CONNECT(filter1kBtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter800BtnC = new AeroButton("800", this); + filterBtnListC.append(filter800BtnC); + CHECKED_CONNECT(filter800BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter750BtnC = new AeroButton("750", this); + filterBtnListC.append(filter750BtnC); + CHECKED_CONNECT(filter750BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter600BtnC = new AeroButton("600", this); + filterBtnListC.append(filter600BtnC); + CHECKED_CONNECT(filter600BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter500BtnC = new AeroButton("500", this); + filterBtnListC.append(filter500BtnC); + CHECKED_CONNECT(filter500BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter400BtnC = new AeroButton("400", this); + filterBtnListC.append(filter400BtnC); + CHECKED_CONNECT(filter400BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter250BtnC = new AeroButton("250", this); + filterBtnListC.append(filter250BtnC); + CHECKED_CONNECT(filter250BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter100BtnC = new AeroButton("100", this); + filterBtnListC.append(filter100BtnC); + CHECKED_CONNECT(filter100BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter50BtnC = new AeroButton("50", this); + filterBtnListC.append(filter50BtnC); + CHECKED_CONNECT(filter50BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter25BtnC = new AeroButton("25", this); + filterBtnListC.append(filter25BtnC); + CHECKED_CONNECT(filter25BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar1BtnC = new AeroButton("Var1", this); + filterBtnListC.append(filterVar1BtnC); + CHECKED_CONNECT(filterVar1BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar2BtnC = new AeroButton("Var2", this); + filterBtnListC.append(filterVar2BtnC); + CHECKED_CONNECT(filterVar2BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + foreach(AeroButton *btn, filterBtnListC) { + + btn->setRoundness(0); + btn->setFixedHeight(btn_height); + btn->setStyleSheet(set->getMiniButtonStyle()); + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + //filterBtnListC.at(set)->getCurrentDSPMode())->setBtnState(AeroButton::ON); + + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setContentsMargins(0, 0, 0, 0); + hbox1->setSpacing(0); + hbox1->addWidget(filter1kBtnC); + hbox1->addWidget(filter800BtnC); + hbox1->addWidget(filter750BtnC); + hbox1->addWidget(filter600BtnC); + hbox1->addWidget(filter500BtnC); + hbox1->addWidget(filter400BtnC); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setContentsMargins(0, 0, 0, 0); + hbox2->setSpacing(0); + hbox2->addWidget(filter250BtnC); + hbox2->addWidget(filter100BtnC); + hbox2->addWidget(filter50BtnC); + hbox2->addWidget(filter25BtnC); + hbox2->addWidget(filterVar1BtnC); + hbox2->addWidget(filterVar2BtnC); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(0); + vbox->setMargin(0); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + filterCWidget = new QWidget(); + filterCWidget->setContentsMargins(0, 0, 0, 0); + filterCWidget->setLayout(vbox); +} + + +void RadioPopupWidget::ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency) { + + Q_UNUSED (sender) + Q_UNUSED (mode) + + if (m_receiver != rx) return; + m_ctrFrequency = frequency; + + HamBand band = getBandFromFrequency(set->getBandFrequencyList(), frequency); + m_lastCtrFrequencyList[(int) band] = m_ctrFrequency; +} + +void RadioPopupWidget::vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency) { + + Q_UNUSED (sender) + Q_UNUSED (mode) + + if (m_receiver != rx) return; + m_vfoFrequency = frequency; + + HamBand band = getBandFromFrequency(set->getBandFrequencyList(), frequency); + m_lastVfoFrequencyList[(int) band] = m_vfoFrequency; +} + +void RadioPopupWidget::bandChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + int btn = bandBtnList.indexOf(button); + + foreach(AeroButton *btn, bandBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + set->setHamBand(this, m_receiver, true, (HamBand) btn); + + QString str = button->text(); + if (str == "2200m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m2200)); + else + if (str == "630 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m630)); + else + if (str == "160 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m160)); + else + if (str == "80 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m80)); + else + if (str == "60 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m60)); + else + if (str == "40 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m40)); + else + if (str == "30 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m30)); + else + if (str == "20 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m20)); + else + if (str == "17 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m17)); + else + if (str == "15 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m15)); + else + if (str == "12 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m12)); + else + if (str == "10 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m10)); + else + if (str == "6 m") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(m6)); + else + if (str == "Gen") + set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(gen)); +} + +void RadioPopupWidget::bandChanged(QObject *sender, int rx, bool byButton, HamBand band) { + + Q_UNUSED (byButton) + + if (sender == this) return; + + if (m_receiver != rx) return; + m_hamBand = band; + + foreach(AeroButton *btn, bandBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + bandBtnList.at(band)->setBtnState(AeroButton::ON); + bandBtnList.at(band)->update(); +} + +void RadioPopupWidget::dspModeChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + int btn = dspModeBtnList.indexOf(button); + + foreach(AeroButton *btn, dspModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + set->setDSPMode(this, m_receiver, (DSPMode) btn); + m_dspModeList[m_hamBand] = (DSPMode) btn; + filterChanged(this, m_receiver, m_filterLo, m_filterHi); + filterGroupChanged((DSPMode) btn); + + button->setBtnState(AeroButton::ON); + button->update(); +} + +void RadioPopupWidget::dspModeChanged(QObject *sender, int rx, DSPMode mode) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + m_dspModeList[m_hamBand] = mode; + + foreach(AeroButton *btn, dspModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + dspModeBtnList.at(mode)->setBtnState(AeroButton::ON); + dspModeBtnList.at(mode)->update(); +} + +void RadioPopupWidget::filterGroupChanged(DSPMode mode) { + + if (mode == 0 || mode == 1 || mode == 7 || mode == 9) { + + //m_filterStackedLayout->setCurrentIndex(0); + m_filterStackedWidget->setCurrentIndex(0); + } + else if (mode == 2 || mode == 5 || mode == 6 || mode == 10) { + + //m_filterStackedLayout->setCurrentIndex(1); + m_filterStackedWidget->setCurrentIndex(1); + } + else if (mode == 3 || mode == 4) { + + //m_filterStackedLayout->setCurrentIndex(2); + m_filterStackedWidget->setCurrentIndex(2); + } +} + +void RadioPopupWidget::filterChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + + QList btnList; + int filterList = 0; + + if (filterBtnListA.contains(button)) { + + btnList = filterBtnListA; + filterList = 0; + } + else if (filterBtnListB.contains(button)) { + + btnList = filterBtnListB; + filterList = 1; + } + else if (filterBtnListC.contains(button)) { + + btnList = filterBtnListC; + filterList = 2; + } + + foreach(AeroButton *btn, btnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + QString str = button->text(); + DSPMode dspMode = m_dspModeList.at(m_hamBand); + switch (filterList) { + + case 0: // filterBtnList A + + if (str == "1k") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -1150.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 1150.0f; + break; + + default: + break; + + } + } + else + if (str == "1k8") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -1950.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 1950.0f; + break; + + default: + break; + } + } + else + if (str == "2k1") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -2250.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 2250.0f; + break; + + default: + break; + + } + } + else + if (str == "2k4") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -2550.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 2550.0f; + break; + + default: + break; + + } + } + else + if (str == "2k7") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -2850.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 2850.0f; + break; + + default: + break; + + } + } + else + if (str == "2k9") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -3050.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 3050.0f; + break; + + default: + break; + + } + } + else + if (str == "3k3") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -3450.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 3450.0f; + break; + + default: + break; + + } + } + else + if (str == "3k8") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -3950.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 3950.0f; + break; + + default: + break; + } + } + else + if (str == "4k4") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -4550.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 4550.0f; + break; + + default: + break; + } + } + else + if (str == "5k") { + + switch (dspMode) { + + case (DSPMode) LSB: + m_filterLo = -5150.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 5150.0f; + break; + + default: + break; + } + } + break; + + case 1: // filterBtnList B + + if (str == "2k4") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -1200.0f; + m_filterHi = 1200.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + default: + break; + } + } + else + if (str == "2k9") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -1450.0f; + m_filterHi = 1450.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "3k1") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -1550.0f; + m_filterHi = 1550.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "4k") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "5k2") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -2600.0f; + m_filterHi = 2600.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "6k6") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -3300.0f; + m_filterHi = 3300.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "8k") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "10k") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -5000.0f; + m_filterHi = 5000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "12k") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -6000.0f; + m_filterHi = 6000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "16k") { + + switch (dspMode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -8000.0f; + m_filterHi = 8000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + break; + + case 2: // filterBtnList C + + if (str == "25") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -125.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 125.0f; + break; + + default: + break; + } + } + else + if (str == "50") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -150.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 150.0f; + break; + + default: + break; + } + } + else + if (str == "100") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -200.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 200.0f; + break; + + default: + break; + } + } + else + if (str == "250") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -350.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 350.0f; + break; + + default: + break; + } + } + else + if (str == "400") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -500.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 500.0f; + break; + + default: + break; + } + } + else + if (str == "500") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -600.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 600.0f; + break; + + default: + break; + } + } + else + if (str == "600") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -700.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 700.0f; + break; + + default: + break; + } + } + else + if (str == "750") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -850.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 850.0f; + break; + + default: + break; + } + } + else + if (str == "800") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -900.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 900.0f; + break; + + default: + break; + } + } + else + if (str == "1k") { + + switch (dspMode) { + + case (DSPMode) CWL: + m_filterLo = -1100.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 1100.0f; + break; + + default: + break; + } + } + break; + } + + set->setRXFilter(this, m_receiver, m_filterLo, m_filterHi); +} + +void RadioPopupWidget::filterChanged(QObject *sender, int rx, qreal low, qreal high) { + + Q_UNUSED(sender) + + if (m_receiver != rx) return; + m_filterLo = low; + m_filterHi = high; + + DSPMode dspMode = m_dspModeList.at(m_hamBand); + if (dspMode == (DSPMode ) LSB || dspMode == (DSPMode ) USB || dspMode == (DSPMode ) DIGU || dspMode == (DSPMode ) DIGL) { + + foreach(AeroButton *btn, filterBtnListA) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + if ((m_filterLo == -5150.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 5150.0)) { + filter5kBtnA->setBtnState(AeroButton::ON); + filter5kBtnA->update(); + } + else + if ((m_filterLo == -4550.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 4550.0)) { + filter4k4BtnA->setBtnState(AeroButton::ON); + filter4k4BtnA->update(); + } + else + if ((m_filterLo == -3950.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 3950.0)) { + filter3k8BtnA->setBtnState(AeroButton::ON); + filter3k8BtnA->update(); + } + else + if ((m_filterLo == -3450.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 3450.0)) { + filter3k3BtnA->setBtnState(AeroButton::ON); + filter3k3BtnA->update(); + } + else + if ((m_filterLo == -3050.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 3050.0)) { + filter2k9BtnA->setBtnState(AeroButton::ON); + filter2k9BtnA->update(); + } + else + if ((m_filterLo == -2850.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 2850.0)) { + filter2k7BtnA->setBtnState(AeroButton::ON); + filter2k7BtnA->update(); + } + else + if ((m_filterLo == -2550.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 2550.0)) { + filter2k4BtnA->setBtnState(AeroButton::ON); + filter2k4BtnA->update(); + } + else + if ((m_filterLo == -2250.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 2250.0)) { + filter2k1BtnA->setBtnState(AeroButton::ON); + filter2k1BtnA->update(); + } + else + if ((m_filterLo == -1950.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 1950.0)) { + filter1k8BtnA->setBtnState(AeroButton::ON); + filter1k8BtnA->update(); + } + else + if ((m_filterLo == -1150.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 1150.0)) { + filter1kBtnA->setBtnState(AeroButton::ON); + filter1kBtnA->update(); + } + } + else if (dspMode == (DSPMode ) DSB || dspMode == (DSPMode ) FMN || dspMode == (DSPMode ) AM || dspMode == (DSPMode ) SAM) { + + // filterGroupBBox + foreach(AeroButton *btn, filterBtnListB) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + if (m_filterLo == -8000.0 && m_filterHi == 8000.0) { + filter16kBtnB->setBtnState(AeroButton::ON); + filter16kBtnB->update(); + } + else + if (m_filterLo == -6000.0 && m_filterHi == 6000.0) { + filter12kBtnB->setBtnState(AeroButton::ON); + filter12kBtnB->update(); + } + else + if (m_filterLo == -5000.0 && m_filterHi == 5000.0) { + filter10kBtnB->setBtnState(AeroButton::ON); + filter10kBtnB->update(); + } + else + if (m_filterLo == -4000.0 && m_filterHi == 4000.0) { + filter8kBtnB->setBtnState(AeroButton::ON); + filter8kBtnB->update(); + } + else + if (m_filterLo == -3300.0 && m_filterHi == 3300.0) { + filter6k6BtnB->setBtnState(AeroButton::ON); + filter6k6BtnB->update(); + } + else + if (m_filterLo == -2600.0 && m_filterHi == 2600.0) { + filter5k2BtnB->setBtnState(AeroButton::ON); + filter5k2BtnB->update(); + } + else + if (m_filterLo == -2000.0 && m_filterHi == 2000.0) { + filter4kBtnB->setBtnState(AeroButton::ON); + filter4kBtnB->update(); + } + else + if (m_filterLo == -1550.0 && m_filterHi == 1550.0) { + filter3k1BtnB->setBtnState(AeroButton::ON); + filter3k1BtnB->update(); + } + else + if (m_filterLo == -1450.0 && m_filterHi == 1450.0) { + filter2k9BtnB->setBtnState(AeroButton::ON); + filter2k9BtnB->update(); + } + else + if (m_filterLo == -1200.0 && m_filterHi == 1200.0) { + filter2k4BtnB->setBtnState(AeroButton::ON); + filter2k4BtnB->update(); + } + } + else if (dspMode == (DSPMode ) CWL || dspMode == (DSPMode ) CWU) { + + // filterGroupCBox + foreach(AeroButton *btn, filterBtnListC) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + if ((m_filterLo == -1100.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 1100.0)) { + filter1kBtnC->setBtnState(AeroButton::ON); + filter1kBtnC->update(); + } + else + if ((m_filterLo == -900.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 900.0)) { + filter800BtnC->setBtnState(AeroButton::ON); + filter800BtnC->update(); + } + else + if ((m_filterLo == -850.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 850.0)) { + filter750BtnC->setBtnState(AeroButton::ON); + filter750BtnC->update(); + } + else + if ((m_filterLo == -700.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 700.0)) { + filter600BtnC->setBtnState(AeroButton::ON); + filter600BtnC->update(); + } + else + if ((m_filterLo == -600.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 600.0)) { + filter500BtnC->setBtnState(AeroButton::ON); + filter500BtnC->update(); + } + else + if ((m_filterLo == -500.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 500.0)) { + filter400BtnC->setBtnState(AeroButton::ON); + filter400BtnC->update(); + } + else + if ((m_filterLo == -350.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 350.0)) { + filter250BtnC->setBtnState(AeroButton::ON); + filter250BtnC->update(); + } + else + if ((m_filterLo == -200.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 200.0)) { + filter100BtnC->setBtnState(AeroButton::ON); + filter100BtnC->update(); + } + else + if ((m_filterLo == -150.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 150.0)) { + filter50BtnC->setBtnState(AeroButton::ON); + filter50BtnC->update(); + } + else + if ((m_filterLo == -125.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 125.0)) { + filter25BtnC->setBtnState(AeroButton::ON); + filter25BtnC->update(); + } + } +} + +void RadioPopupWidget::agcModeChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + int btn = agcModeBtnList.indexOf(button); + + foreach(AeroButton *btn, agcModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + set->setAGCMode(this, m_receiver, (AGCMode) btn); + m_agcMode = (AGCMode) btn; + + button->setBtnState(AeroButton::ON); + button->update(); +} + +void RadioPopupWidget::agcModeChanged(QObject *sender, int rx, AGCMode mode, bool hang) { + + Q_UNUSED(sender) + Q_UNUSED(hang) + + if (m_receiver != rx) return; + m_agcMode = mode; + + foreach(AeroButton *btn, agcModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + agcModeBtnList.at(mode)->setBtnState(AeroButton::ON); + agcModeBtnList.at(mode)->update(); +} + +void RadioPopupWidget::agcShowLinesChanged() { + + if (showAGCLines->btnState() == AeroButton::OFF) { + + showAGCLines->setBtnState(AeroButton::ON); + set->setAGCShowLines(this, m_receiver, true); + } + else { + + showAGCLines->setBtnState(AeroButton::OFF); + set->setAGCShowLines(this, m_receiver, false); + } +} + +void RadioPopupWidget::avgBtnClicked() { + + if (avgBtn->btnState() == AeroButton::OFF) { + + avgBtn->setBtnState(AeroButton::ON); + m_spectrumAveraging = true; + set->setSpectrumAveraging(this, m_receiver, true); + } + else { + + avgBtn->setBtnState(AeroButton::OFF); + m_spectrumAveraging = false; + set->setSpectrumAveraging(this, m_receiver, false); + } +} + +void RadioPopupWidget::gridBtnClicked() { + + if (gridBtn->btnState() == AeroButton::OFF) { + + gridBtn->setBtnState(AeroButton::ON); + m_panGrid = true; + set->setPanGrid(true, m_receiver); + } + else { + + gridBtn->setBtnState(AeroButton::OFF); + m_panGrid = false; + set->setPanGrid(false, m_receiver); + } +} + +void RadioPopupWidget::peakHoldBtnClicked() { + + if (peakHoldBtn->btnState() == AeroButton::OFF) { + + peakHoldBtn->setBtnState(AeroButton::ON); + m_peakHold = true; + set->setPeakHold(true, m_receiver); + } + else { + + peakHoldBtn->setBtnState(AeroButton::OFF); + m_peakHold = false; + set->setPeakHold(false, m_receiver); + } +} + +void RadioPopupWidget::panLockedBtnClicked() { + + if (lockPanBtn->btnState() == AeroButton::OFF) { + + lockPanBtn->setBtnState(AeroButton::ON); + m_panLocked = true; + set->setPanLocked(true, m_receiver); + } + else { + + lockPanBtn->setBtnState(AeroButton::OFF); + m_panLocked = false; + set->setPanLocked(false, m_receiver); + } +} + +void RadioPopupWidget::clickVfoBtnClicked() { + + if (clickVfoBtn->btnState() == AeroButton::OFF) { + + clickVfoBtn->setBtnState(AeroButton::ON); + m_clickVFO = true; + set->setClickVFO(true, m_receiver); + } + else { + + clickVfoBtn->setBtnState(AeroButton::OFF); + m_clickVFO = false; + set->setClickVFO(false, m_receiver); + } +} + +void RadioPopupWidget::hairCrossBtnClicked() { + + if (showCrossBtn->btnState() == AeroButton::OFF) { + + showCrossBtn->setBtnState(AeroButton::ON); + m_showCross = true; + set->setHairCross(true, m_receiver); + } + else { + + showCrossBtn->setBtnState(AeroButton::OFF); + m_showCross = false; + set->setHairCross(false, m_receiver); + } +} + +void RadioPopupWidget::midToVfoBtnClicked() { + + emit midToVfoBtnEvent(); +} + +void RadioPopupWidget::vfoToMidBtnClicked() { + + emit vfoToMidBtnEvent(); +} + +void RadioPopupWidget::setCurrentReceiver(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (m_receiver == value) return; + m_receiver = value; + + TReceiver rxData = set->getReceiverDataList().at(m_receiver); + + if (m_hamBand != rxData.hamBand) { + m_hamBand = rxData.hamBand; + + foreach(AeroButton *btn, bandBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + AeroButton *button = bandBtnList.at(m_hamBand); + button->setBtnState(AeroButton::ON); + button->update(); + + } + + DSPMode dspMode = m_dspModeList.at(m_hamBand); + if (dspMode != rxData.dspModeList.at(m_hamBand)) { + + dspMode = rxData.dspModeList.at(m_hamBand); + + foreach(AeroButton *btn, dspModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + AeroButton *button = dspModeBtnList.at(dspMode); + button->setBtnState(AeroButton::ON); + button->update(); + + filterGroupChanged(dspMode); + filterChanged(this, m_receiver, m_filterLo, m_filterHi); + } + + if (m_agcMode != rxData.agcMode) { + m_agcMode = rxData.agcMode; + } + + if (m_filterLo != rxData.filterLo || m_filterHi != rxData.filterHi) { + + m_filterLo = rxData.filterLo; + m_filterHi = rxData.filterHi; + filterChanged(this, m_receiver, m_filterLo, m_filterHi); + } +} + +void RadioPopupWidget::setSticky() { + + if (stickyBtn->btnState() == AeroButton::OFF) { + + stickyBtn->setBtnState(AeroButton::ON); + stickyBtn->setText("Unlock"); + m_sticky = true; + } + else { + + stickyBtn->setBtnState(AeroButton::OFF); + stickyBtn->setText("Lock"); + m_sticky = false; + } +} + +void RadioPopupWidget::panModeChanged() { + + AeroButton *button = qobject_cast(sender()); + int btnHit = panadapterBtnList.indexOf(button); + + foreach(AeroButton *btn, panadapterBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (btnHit) { + + case 0: + m_panadapterMode = (PanGraphicsMode) Line; + break; + + case 1: + m_panadapterMode = (PanGraphicsMode) FilledLine; + break; + + case 2: + m_panadapterMode = (PanGraphicsMode) Solid; + break; + } + + set->setGraphicsState(this, m_receiver, m_panadapterMode, m_waterfallColorMode); +} + +void RadioPopupWidget::waterfallModeChanged() { + + AeroButton *button = qobject_cast(sender()); + int btnHit = waterfallBtnList.indexOf(button); + + foreach(AeroButton *btn, waterfallBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + switch (btnHit) { + + case 0: + m_waterfallColorMode = (WaterfallColorMode) Simple; + break; + + case 1: + m_waterfallColorMode = (WaterfallColorMode) Enhanced; + break; + } + + set->setGraphicsState(this, m_receiver, m_panadapterMode, m_waterfallColorMode); +} + +// ********************** +bool RadioPopupWidget::showPopupWidget(QObject *sender, QPoint position) { + + Q_UNUSED(sender) + + m_mouseOver = true; + show(); + + QDesktopWidget *desktop = QApplication::desktop(); + QRect desktopRect = desktop->availableGeometry(desktop->screenNumber()); + + position.setX(position.x() - frameGeometry().width() / 2); + position.setY(position.y() - frameGeometry().height() / 2); + + move(position); + + // stop us being lost off the edge of the screen + if (frameGeometry().right() > desktopRect.right()) move(QPoint(desktopRect.right() - frameGeometry().width(), frameGeometry().top())); + if (frameGeometry().bottom() > desktopRect.bottom()) move(QPoint(frameGeometry().left(), desktopRect.bottom() - frameGeometry().height())); + if (frameGeometry().left() < desktopRect.left()) move(QPoint(desktopRect.left(), frameGeometry().top())); + if (frameGeometry().top() < desktopRect.top()) move(QPoint(frameGeometry().left(), desktopRect.top())); + + setFocus(); + + return true; +} + +void RadioPopupWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state +) { + Q_UNUSED(sender) + Q_UNUSED(err) + Q_UNUSED(hwmode) + Q_UNUSED(mode) + Q_UNUSED(state) + +} + +void RadioPopupWidget::graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallMode) +{ + Q_UNUSED (sender) + Q_UNUSED (rx) + + bool change = false; + + if (m_panadapterMode != panMode) { + + m_panadapterMode = panMode; + change = true; + } + + if (m_waterfallColorMode != waterfallMode) { + + m_waterfallColorMode = waterfallMode; + change = true; + } + + if (!change) return; + + update(); +} + +void RadioPopupWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void RadioPopupWidget::showEvent(QShowEvent *event) { + + m_closingTimer.restart(); + //emit showEvent(this); + + QWidget::showEvent(event); +} + +void RadioPopupWidget::hideEvent(QHideEvent *event) { + + //emit hidingEvent(this); + QWidget::hideEvent(event); +} + +void RadioPopupWidget::paintEvent(QPaintEvent *event) { + + QWidget::paintEvent(event); +} + +void RadioPopupWidget::resizeEvent(QResizeEvent *event) { + + createBackground(event->size()); + QWidget::resizeEvent(event); +} + +void RadioPopupWidget::mousePressEvent(QMouseEvent *event) { + + m_closingTimer.restart(); + + m_mouseDownPos = QCursor::pos(); + m_mouseDownWindowPos = pos(); + + QWidget::mousePressEvent(event); +} + +void RadioPopupWidget::mouseMoveEvent(QMouseEvent *event) { + + m_closingTimer.restart(); + + if (event->buttons() == Qt::LeftButton) { + + QPoint delta = QCursor::pos() - m_mouseDownPos; + QPoint new_pos = m_mouseDownWindowPos + delta; + + QDesktopWidget *desktop = QApplication::desktop(); +// QRect desktopRect = desktop->availableGeometry(); + QRect desktopRect = desktop->availableGeometry(desktop->screenNumber()); +// QRect desktopRect = desktop->screenGeometry(desktop->screenNumber()); +// QRect desktopRect = desktop->geometry(); + + QRect new_rect(QPoint(0, 0), size()); + new_rect.moveTopLeft(new_pos); + + // stop us being lost off the edge of the screen + if (new_rect.right() > desktopRect.right()) new_rect.moveLeft(desktopRect.right() - (new_rect.width() - 1)); + if (new_rect.bottom() > desktopRect.bottom()) new_rect.moveTop(desktopRect.bottom() - (new_rect.height() - 1)); + if (new_rect.left() < desktopRect.left()) new_rect.moveLeft(desktopRect.left()); + if (new_rect.top() < desktopRect.top()) new_rect.moveTop(desktopRect.top()); + + move(new_rect.topLeft()); + } + + QWidget::mouseMoveEvent(event); +} + +void RadioPopupWidget::mouseReleaseEvent(QMouseEvent *event) { + + m_closingTimer.restart(); + QWidget::mouseReleaseEvent(event); +} + +void RadioPopupWidget::enterEvent(QEvent *event) { + + m_closingTimer.restart(); + m_mouseOver = true; + QWidget::enterEvent(event); +} + +void RadioPopupWidget::leaveEvent(QEvent *event) { + + if (!m_sticky) { + + m_closingTimer.restart(); + m_mouseOver = false; + } + QWidget::leaveEvent(event); +} + +void RadioPopupWidget::timerEvent(QTimerEvent *event) { + + int timerId = event->timerId(); + + if (m_timerID > 0 && timerId == m_timerID) { + + if (!m_mouseOver && isVisible()) { + + if (m_closingTimer.elapsed() >= 100) close(); + } + return; + } + + QWidget::timerEvent(event); +} + +bool RadioPopupWidget::event(QEvent *event) { + + switch (event->type()) + { + + case QEvent::NonClientAreaMouseButtonPress: + // mouse press on the title bar or window edges + m_closingTimer.restart(); + m_mouseOver = true; + break; + + case QEvent::NonClientAreaMouseMove: + // mouse move on the title bar or window edges + m_closingTimer.restart(); +// mouse_over = true; + break; + + case QEvent::NonClientAreaMouseButtonRelease: + // mouse press on the title bar or window edges + m_closingTimer.restart(); + m_mouseOver = false; + break; + + default: + break; + } + + return QWidget::event(event); +} + +void RadioPopupWidget::createBackground(QSize size) { + + if (size.width() <= 0 || size.height() <= 0) return; + + QFont font(this->font()); + font.setPixelSize(12); + + QFontMetrics fm(font); + int font_height = fm.height(); + + QImage image = QImage(size, QImage::Format_ARGB32_Premultiplied); + if (image.isNull()) return; + + image.fill(QColor(0, 0, 0, 0).rgba()); + + QPainter painter(&image); + painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing | QPainter::TextAntialiasing, true); + painter.setFont(font); + + painter.fillRect(image.rect(), QColor(35, 35, 35)); + //painter.fillRect(image.rect(), QColor(0, 60, 129)); + + QString titleStr = windowTitle(); + QRect title_bar_rect(0, 0, image.width(), font_height + 6); + + QLinearGradient title_bar_gradient(0, 0, 0, 1); + title_bar_gradient.setCoordinateMode(QGradient::ObjectBoundingMode); + title_bar_gradient.setSpread(QGradient::PadSpread); + title_bar_gradient.setColorAt(0.0, QColor(100, 110, 128)); + title_bar_gradient.setColorAt(0.4, QColor(74, 80, 90)); + title_bar_gradient.setColorAt(0.6, QColor(56, 62, 70)); + title_bar_gradient.setColorAt(1.0, QColor(48, 56, 64)); + painter.setPen(Qt::NoPen); + painter.setBrush(QBrush(title_bar_gradient)); + + title_bar_rect.adjust(1, 1, 1, 1); + painter.setPen(Qt::black); + painter.drawText(title_bar_rect, Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, titleStr); + title_bar_rect.adjust(-1, -1, -1, -1); + painter.setPen(Qt::white); + painter.drawText(title_bar_rect, Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, titleStr); + + painter.setPen(QColor(255, 255, 255, 64)); + //painter.setPen(QColor(0, 255, 255, 255)); + painter.drawLine(0, 0, image.width() - 1, 0); // top line + painter.drawLine(0, 0, 0, image.height() - 1); // left line + painter.setPen(QColor(0, 0, 0, 64)); + painter.drawLine(0, image.height() - 1, image.width() - 1, image.height() - 1); // bottom line + painter.drawLine(image.width() - 1, 0, image.width() - 1, image.height() - 1); // right line + + painter.end(); + + QPalette palette; + palette.setBrush(backgroundRole(), QBrush(image)); + setPalette(palette); + setAutoFillBackground(true); +} diff --git a/Source/src/cusdr_radioPopupWidget.h b/Source/src/cusdr_radioPopupWidget.h new file mode 100644 index 0000000..892bc12 --- /dev/null +++ b/Source/src/cusdr_radioPopupWidget.h @@ -0,0 +1,314 @@ +/* +* @file cusdr_radioPopupWidget.h +* @brief Radio control popup widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-22 +*/ + +/* + * Copyright 2010-2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_RADIO_POPUP_WIDGET_H +#define _CUSDR_RADIO_POPUP_WIDGET_H + +#ifdef LOG_RADIOPOPUP +#define RADIOPOPUP_DEBUG qDebug().nospace() << "RadioPopup::\t" +#else +#define RADIOPOPUP_DEBUG nullDebug() +#endif + +#include +//#include +//#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_fonts.h" + +class RadioPopupWidget : public QWidget { + + Q_OBJECT + +public: + RadioPopupWidget(QWidget *parent = 0, int rx = 0); + ~RadioPopupWidget(); + + bool getSpectrumAveraging() { return m_spectrumAveraging; } + bool getPanGridStatus() { return m_panGrid; } + bool getPeakHoldStatus() { return m_peakHold; } + +public slots: + //QSize sizeHint() const; + QSize minimumSizeHint() const; + + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + bool showPopupWidget(QObject *sender, QPoint position); + +protected: + void showEvent(QShowEvent *event); + void hideEvent(QHideEvent *event); + void closeEvent(QCloseEvent *event); + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void timerEvent(QTimerEvent *event); + bool event(QEvent *event); + +private: + Settings* set; + + QTime m_closingTimer; + + CFonts* fonts; + TFonts m_fonts; + + PanGraphicsMode m_panadapterMode; + WaterfallColorMode m_waterfallColorMode; + + QVBoxLayout* optionsVBox; + QVBoxLayout* bandVBox; + QVBoxLayout* modeVBox; + QVBoxLayout* agcVBox; + //QVBoxLayout* mercuryBtnVBox(); + + QWidget* filterAWidget; + QWidget* filterBWidget; + QWidget* filterCWidget; + + QStackedLayout* m_filterStackedLayout; + QStackedWidget* m_filterStackedWidget; + + QList filterBtnListA; + QList filterBtnListB; + QList filterBtnListC; + QList panadapterBtnList; + QList waterfallBtnList; + + QLabel* m_optionsLabel; + + AeroButton* stickyBtn; + + AeroButton* lockPanBtn; + AeroButton* clickVfoBtn; + AeroButton* showCrossBtn; + AeroButton* midToVfoBtn; + AeroButton* vfoToMidBtn; + AeroButton* avgBtn; + AeroButton* peakHoldBtn; + AeroButton* gridBtn; + + AeroButton* m_PanLineBtn; + AeroButton* m_PanFilledLineBtn; + AeroButton* m_PanSolidBtn; + AeroButton* m_WaterfallSimpleBtn; + AeroButton* m_WaterfallEnhancedBtn; + + AeroButton* band2200mBtn; + AeroButton* band630mBtn; + AeroButton* band160mBtn; + AeroButton* band80mBtn; + AeroButton* band60mBtn; + AeroButton* band40mBtn; + AeroButton* band30mBtn; + AeroButton* band20mBtn; + AeroButton* band17mBtn; + AeroButton* band15mBtn; + AeroButton* band12mBtn; + AeroButton* band10mBtn; + AeroButton* band6mBtn; + AeroButton* bandGenBtn; + //AeroButton* bandxxBtn; + + QList bandBtnList; + + AeroButton* lsbBtn; + AeroButton* usbBtn; + AeroButton* dsbBtn; + AeroButton* cwlBtn; + AeroButton* cwuBtn; + AeroButton* fmnBtn; + AeroButton* amBtn; + AeroButton* diguBtn; + AeroButton* specBtn; + AeroButton* diglBtn; + AeroButton* samBtn; + AeroButton* drmBtn; + + QList dspModeBtnList; + + AeroButton* showAGCLines; + AeroButton* agcOFF; + AeroButton* agcLONG; + AeroButton* agcSLOW; + AeroButton* agcMED; + AeroButton* agcFAST; + AeroButton* agcUSER; + + QList agcModeBtnList; + + AeroButton* filter1kBtnA; + AeroButton* filter1k8BtnA; + AeroButton* filter2k1BtnA; + AeroButton* filter2k4BtnA; + AeroButton* filter2k7BtnA; + AeroButton* filter2k9BtnA; + AeroButton* filter3k3BtnA; + AeroButton* filter3k8BtnA; + AeroButton* filter4k4BtnA; + AeroButton* filter5kBtnA; + AeroButton* filterVar1BtnA; + AeroButton* filterVar2BtnA; + + AeroButton* filter2k4BtnB; + AeroButton* filter2k9BtnB; + AeroButton* filter3k1BtnB; + AeroButton* filter4kBtnB; + AeroButton* filter5k2BtnB; + AeroButton* filter6k6BtnB; + AeroButton* filter8kBtnB; + AeroButton* filter10kBtnB; + AeroButton* filter12kBtnB; + AeroButton* filter16kBtnB; + AeroButton* filterVar1BtnB; + AeroButton* filterVar2BtnB; + + AeroButton* filter25BtnC; + AeroButton* filter50BtnC; + AeroButton* filter100BtnC; + AeroButton* filter250BtnC; + AeroButton* filter400BtnC; + AeroButton* filter500BtnC; + AeroButton* filter600BtnC; + AeroButton* filter750BtnC; + AeroButton* filter800BtnC; + AeroButton* filter1kBtnC; + AeroButton* filterVar1BtnC; + AeroButton* filterVar2BtnC; + + QLabel* m_rxLabel; + + //QIcon agc_left; + //QIcon agc_right; + + QList m_receiverDataList; + QList m_dspModeList; + + HamBand m_hamBand; + //DSPMode m_dspMode; + AGCMode m_agcMode; + TDefaultFilterMode m_filterMode; + + QPoint m_mouseDownPos; + QPoint m_mouseDownWindowPos; + + bool m_mouseOver; + + //QList m_lastFrequencyList; + QList m_lastCtrFrequencyList; + QList m_lastVfoFrequencyList; + + long m_ctrFrequency; + long m_vfoFrequency; + + bool m_sticky; + bool m_spectrumAveraging; + bool m_panGrid; + bool m_peakHold; + bool m_panLocked; + bool m_clickVFO; + bool m_showCross; + + qreal m_filterLo; + qreal m_filterHi; + + int m_timerID; + int m_receiver; + int m_currentRx; + int current_band; + int current_dsp_mode; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + void createBackground(QSize size); + +private slots: + void graphicModeChanged( + QObject* sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setSticky(); + void createOptionsBtnGroup(); + void createBandBtnGroup(); + void createModeBtnGroup(); + void createAgcBtnGroup(); + void createFilterBtnWidgetA(); + void createFilterBtnWidgetB(); + void createFilterBtnWidgetC(); + + //QLabel *createLabel(const QString &text); + + void avgBtnClicked(); + void gridBtnClicked(); + void peakHoldBtnClicked(); + void panLockedBtnClicked(); + void clickVfoBtnClicked(); + void hairCrossBtnClicked(); + void midToVfoBtnClicked(); + void vfoToMidBtnClicked(); + void panModeChanged(); + void waterfallModeChanged(); + + void setCurrentReceiver(QObject *sender, int value); + void ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + void vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + void bandChangedByBtn(); + void bandChanged(QObject *sender, int rx, bool byButton, HamBand band); + void dspModeChangedByBtn(); + void dspModeChanged(QObject *sender, int rx, DSPMode mode); + void agcModeChangedByBtn(); + void agcModeChanged(QObject *sender, int rx, AGCMode mode, bool hang); + void agcShowLinesChanged(); + void filterChangedByBtn(); + void filterChanged(QObject *sender, int rx, qreal low, qreal high); + void filterGroupChanged(DSPMode mode); + +signals: + void showEvent(QObject *sender); + void hideEvent(QObject *sender); + void closeEvent(QObject *sender); + void newMessage(QString msg); + void midToVfoBtnEvent(); + void vfoToMidBtnEvent(); +}; + +#endif // _CUSDR_RADIO_POPUP_WIDGET_H diff --git a/Source/src/cusdr_radioTabWidget.cpp b/Source/src/cusdr_radioTabWidget.cpp new file mode 100644 index 0000000..da58064 --- /dev/null +++ b/Source/src/cusdr_radioTabWidget.cpp @@ -0,0 +1,185 @@ +/** +* @file cusdr_radioTabWidget.cpp +* @brief Radio settings tab widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-29 +*/ + +/* + * + * Copyright 2010 - 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "cusdr_radioTabWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +RadioTabWidget::RadioTabWidget(QWidget *parent) + : QTabWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + setStyleSheet(set->getTabWidgetStyle()); + setContentsMargins(4, 4, 4, 0); + setMouseTracking(true); + + m_radioWidget = new RadioWidget(this); + m_agcWidget = new AGCOptionsWidget(this); + m_transmitTabWidget = new TransmitTabWidget(this); + + this->addTab(m_radioWidget, " General "); + this->addTab(m_agcWidget, " AGC "); + this->addTab(m_transmitTabWidget, " Tx Ctrl "); + + if (!set->getPenelopePresence() && !set->getPennyLanePresence() && (set->getHWInterface() != QSDR::Hermes)) { + + setTabEnabled(2, false); + } + + setupConnections(); +} + +RadioTabWidget::~RadioTabWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize RadioTabWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize RadioTabWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void RadioTabWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(penelopePresenceChanged(bool)), + this, + SLOT(setPennyPresence(bool))); + + CHECKED_CONNECT( + set, + SIGNAL(pennyLanePresenceChanged(bool)), + this, + SLOT(setPennyPresence(bool))); +} + +void RadioTabWidget::systemStateChanged( + QObject *sender, /*!<[in] the sender of the signal. */ + QSDR::_Error err, /*!<[in] error state. */ + QSDR::_HWInterfaceMode hwmode, /*!<[in] HPSDR interface (Metis, Hermes, none). */ + QSDR::_ServerMode mode, /*!<[in] server mode. */ + QSDR::_DataEngineState state /*!<[in] data engine state. */ +) { + Q_UNUSED (sender) + Q_UNUSED (err) + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_hwInterface == QSDR::Hermes) + setTabEnabled(2, true); + else + setTabEnabled(2, false); + + if (m_serverMode != mode) + m_serverMode = mode; + + if (m_dataEngineState != state) + m_dataEngineState = state; +} + +void RadioTabWidget::setPennyPresence(bool value) { + + setTabEnabled(2, value); +} + +void RadioTabWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void RadioTabWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +void RadioTabWidget::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void RadioTabWidget::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void RadioTabWidget::mouseMoveEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void RadioTabWidget::mousePressEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void RadioTabWidget::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + + diff --git a/Source/src/cusdr_radioTabWidget.h b/Source/src/cusdr_radioTabWidget.h new file mode 100644 index 0000000..79a8f46 --- /dev/null +++ b/Source/src/cusdr_radioTabWidget.h @@ -0,0 +1,100 @@ +/** +* @file cusdr_radioTabWidget.h +* @brief Radio settings tab widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-09-29 +*/ + +/* + * + * Copyright 2010 - 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_RADIO_TABWIDGET_H +#define _CUSDR_RADIO_TABWIDGET_H + +//#include +//#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_radioWidget.h" +#include "cusdr_agcWidget.h" +#include "cusdr_transmitTabWidget.h" + + +class RadioTabWidget : public QTabWidget { + + Q_OBJECT + +public: + RadioTabWidget(QWidget *parent = 0); + ~RadioTabWidget(); + + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + Settings* set; + + QSDR::_Error m_error; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QString m_message; + + RadioWidget *m_radioWidget; + AGCOptionsWidget *m_agcWidget; + TransmitTabWidget *m_transmitTabWidget; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + +private slots: + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setPennyPresence(bool value); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString message); +}; + +#endif // _CUSDR_RADIO_TABWIDGET_H diff --git a/Source/src/cusdr_radioWidget.cpp b/Source/src/cusdr_radioWidget.cpp new file mode 100644 index 0000000..a62a5f7 --- /dev/null +++ b/Source/src/cusdr_radioWidget.cpp @@ -0,0 +1,2301 @@ +/** +* @file cusdr_radioWidget.cpp +* @brief Radio control widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-10 +*/ + +/* + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#include "cusdr_radioWidget.h" + +#define btn_height 14 +#define btn_width 60 +#define btn_widthb 70 +#define btn_widths 34 + + +RadioWidget::RadioWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_currentRx(set->getCurrentReceiver()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + //setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 0, 4, 0); + + m_receiverDataList = set->getReceiverDataList(); + + m_hamBand = m_receiverDataList.at(0).hamBand; + //m_dspMode = m_receiverDataList.at(0).dspMode; + m_dspModeList = m_receiverDataList.at(0).dspModeList; + //m_agcMode = m_receiverDataList.at(0).agcMode; + m_filterMode = m_receiverDataList.at(0).defaultFilterMode; + m_filterLo = m_receiverDataList.at(0).filterLo; + m_filterHi = m_receiverDataList.at(0).filterHi; + + m_lastCtrFrequencyList = m_receiverDataList.at(0).lastCenterFrequencyList; + m_lastVfoFrequencyList = m_receiverDataList.at(0).lastVfoFrequencyList; + + createBandBtnGroup(); + createModeBtnGroup(); + createFilterBtnGroupA(); + createFilterBtnGroupB(); + createFilterBtnGroupC(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(0); + hbox1->setMargin(0); + hbox1->addStretch(); + hbox1->addWidget(bandGroupBox); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addStretch(); + hbox2->addWidget(modeGroupBox); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(0); + hbox3->setMargin(0); + hbox3->addStretch(); + hbox3->addWidget(filterGroupABox); + + QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(0); + hbox4->setMargin(0); + hbox4->addStretch(); + hbox4->addWidget(filterGroupBBox); + + QHBoxLayout *hbox5 = new QHBoxLayout(); + hbox5->setSpacing(0); + hbox5->setMargin(0); + hbox5->addStretch(); + hbox5->addWidget(filterGroupCBox); + + QHBoxLayout *hbox6 = new QHBoxLayout(); + hbox6->setSpacing(0); + hbox6->setMargin(0); + hbox6->addStretch(); + hbox6->addWidget(mercuryBtnGroup()); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + mainLayout->addLayout(hbox4); + mainLayout->addLayout(hbox5); + mainLayout->addLayout(hbox6); + mainLayout->addStretch(); + + // setup values from settings.ini + bandBtnList.at(m_hamBand)->setBtnState(AeroButton::ON); + bandBtnList.at(m_hamBand)->update(); + + dspModeChanged(this, 0, m_dspModeList.at(m_hamBand)); + filterChanged(this, 0, m_filterLo, m_filterHi); + + DSPMode dspMode = m_dspModeList.at(m_hamBand); + + if (dspMode == (DSPMode) LSB || dspMode == (DSPMode) USB || dspMode == (DSPMode) DIGU || dspMode == (DSPMode) DIGL) { + + filterGroupBBox->hide(); + filterGroupCBox->hide(); + } + else + if (dspMode == (DSPMode) DSB || dspMode == (DSPMode) FMN || dspMode == (DSPMode) AM || dspMode == (DSPMode) SAM) { + + filterGroupABox->hide(); + filterGroupCBox->hide(); + } + else + if (dspMode == (DSPMode) CWL || dspMode == (DSPMode) CWU) { + + filterGroupABox->hide(); + filterGroupBBox->hide(); + } + + setLayout(mainLayout); + setupConnections(); +} + +RadioWidget::~RadioWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize RadioWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize RadioWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void RadioWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(currentReceiverChanged(QObject *, int)), + this, + SLOT(setCurrentReceiver(QObject *, int))); + + CHECKED_CONNECT( + set, + SIGNAL(vfoFrequencyChanged(QObject *, int, int, long)), + this, + SLOT(vfoFrequencyChanged(QObject *, int, int, long))); + + CHECKED_CONNECT( + set, + SIGNAL(hamBandChanged(QObject *, int, bool, HamBand)), + this, + SLOT(bandChanged(QObject *, int, bool, HamBand))); + + CHECKED_CONNECT( + set, + SIGNAL(dspModeChanged(QObject *, int, DSPMode)), + this, + SLOT(dspModeChanged(QObject *, int, DSPMode))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(agcModeChanged(QObject *, int, AGCMode)), +// this, +// SLOT(agcModeChanged(QObject *, int, AGCMode))); + + CHECKED_CONNECT( + set, + SIGNAL(filterFrequenciesChanged(QObject *, int, qreal, qreal)), + this, + SLOT(filterChanged(QObject *, int, qreal, qreal))); + + CHECKED_CONNECT( + set, + SIGNAL(mercuryAttenuatorChanged(QObject *, HamBand, int)), + this, + SLOT(setMercuryAttenuator(QObject *, HamBand, int))); +} + +void RadioWidget::createBandBtnGroup() { + + band2200mBtn = new AeroButton("2200m", this); + band2200mBtn->setRoundness(0); + //band2200mBtn->setGlass(false); + band2200mBtn->setFixedSize(btn_widths, btn_height); + band2200mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band2200mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band2200mBtn); + CHECKED_CONNECT(band2200mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band630mBtn = new AeroButton("630 m", this); + band630mBtn->setRoundness(0); + //band630Btn->setGlass(false); + band630mBtn->setFixedSize(btn_widths, btn_height); + band630mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band630Btn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band630mBtn); + CHECKED_CONNECT(band630mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band160mBtn = new AeroButton("160 m", this); + band160mBtn->setRoundness(0); + //band160mBtn->setGlass(false); + band160mBtn->setFixedSize(btn_widths, btn_height); + band160mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band160mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band160mBtn); + CHECKED_CONNECT(band160mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band80mBtn = new AeroButton("80 m", this); + band80mBtn->setRoundness(0); + //band80mBtn->setGlass(false); + band80mBtn->setFixedSize(btn_widths, btn_height); + band80mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band80mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band80mBtn); + CHECKED_CONNECT(band80mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band60mBtn = new AeroButton("60 m", this); + band60mBtn->setRoundness(0); + //band60mBtn->setGlass(false); + band60mBtn->setFixedSize(btn_widths, btn_height); + band60mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band60mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band60mBtn); + CHECKED_CONNECT(band60mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band40mBtn = new AeroButton("40 m", this); + band40mBtn->setRoundness(0); + //band40mBtn->setGlass(false); + band40mBtn->setFixedSize(btn_widths, btn_height); + band40mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band40mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band40mBtn); + CHECKED_CONNECT(band40mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band30mBtn = new AeroButton("30 m", this); + band30mBtn->setRoundness(0); + //band30mBtn->setGlass(false); + band30mBtn->setFixedSize(btn_widths, btn_height); + band30mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band30mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band30mBtn); + CHECKED_CONNECT(band30mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band20mBtn = new AeroButton("20 m", this); + band20mBtn->setRoundness(0); + //band20mBtn->setGlass(false); + band20mBtn->setFixedSize(btn_widths, btn_height); + band20mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band20mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band20mBtn); + CHECKED_CONNECT(band20mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band17mBtn = new AeroButton("17 m", this); + band17mBtn->setRoundness(0); + //band17mBtn->setGlass(false); + band17mBtn->setFixedSize(btn_widths, btn_height); + band17mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band17mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band17mBtn); + CHECKED_CONNECT(band17mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band15mBtn = new AeroButton("15 m", this); + band15mBtn->setRoundness(0); + //band15mBtn->setGlass(false); + band15mBtn->setFixedSize(btn_widths, btn_height); + band15mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band15mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band15mBtn); + CHECKED_CONNECT(band15mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band12mBtn = new AeroButton("12 m", this); + band12mBtn->setRoundness(0); + //band12mBtn->setGlass(false); + band12mBtn->setFixedSize(btn_widths, btn_height); + band12mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band12mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band12mBtn); + CHECKED_CONNECT(band12mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band10mBtn = new AeroButton("10 m", this); + band10mBtn->setRoundness(0); + //band10mBtn->setGlass(false); + band10mBtn->setFixedSize(btn_widths, btn_height); + band10mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band10mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band10mBtn); + CHECKED_CONNECT(band10mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + band6mBtn = new AeroButton("6 m", this); + band6mBtn->setRoundness(0); + //band6mBtn->setGlass(false); + band6mBtn->setFixedSize(btn_widths, btn_height); + band6mBtn->setStyleSheet(set->getMiniButtonStyle()); + //band6mBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(band6mBtn); + CHECKED_CONNECT(band6mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + bandGenBtn = new AeroButton("Gen", this); + bandGenBtn->setRoundness(0); + //bandGenBtn->setGlass(false); + bandGenBtn->setFixedSize(btn_widths, btn_height); + bandGenBtn->setStyleSheet(set->getMiniButtonStyle()); + //bandGenBtn->setTextColor(QColor(200, 200, 200)); + bandBtnList.append(bandGenBtn); + CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn())); + + /*bandxxBtn = new AeroButton("", this); + bandxxBtn->setRoundness(0); + bandxxBtn->setGlass(false); + bandxxBtn->setFixedSize(btn_widths, btn_height); + bandxxBtn->setHighlight(QColor(90, 90, 90)); + bandxxBtn->setStyleSheet(set->getMiniButtonStyle()); + bandxxBtn->setTextColor(QColor(200, 200, 200)); + bandxxBtn->setEnabled(false);*/ + + // only for testing + //current_band = 1; // 80 m + //band80mBtn->setBtnState(AeroButton::ON); + + QGridLayout *layout = new QGridLayout(); + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(band2200mBtn, 0, 0); + layout->addWidget(band630mBtn, 0, 1); + layout->addWidget(band160mBtn, 0, 2); + layout->addWidget(band80mBtn, 0, 3); + layout->addWidget(band60mBtn, 0, 4); + layout->addWidget(band40mBtn, 0, 5); + layout->addWidget(band30mBtn, 1, 0); + layout->addWidget(band20mBtn, 1, 1); + layout->addWidget(band17mBtn, 1, 2); + layout->addWidget(band15mBtn, 1, 3); + layout->addWidget(band12mBtn, 1, 4); + layout->addWidget(band10mBtn, 1, 5); + layout->addWidget(band6mBtn, 2, 0); + layout->addWidget(bandGenBtn, 2, 1); + //layout->addWidget(bandxxBtn, 2, 3); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(10); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + //vbox->addLayout(layout); + vbox->addLayout(hbox1); + + bandGroupBox = new QGroupBox(tr("Band"), this); + bandGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + bandGroupBox->setLayout(vbox); + bandGroupBox->setStyleSheet(set->getWidgetStyle()); + //bandGroupBox->setMinimumWidth(100); + bandGroupBox->setFont(QFont("Arial", 8)); +} + +void RadioWidget::createModeBtnGroup() { + + lsbBtn = new AeroButton("LSB", this); + lsbBtn->setRoundness(0); + //lsbBtn->setGlass(false); + lsbBtn->setFixedSize(btn_widths, btn_height); + lsbBtn->setStyleSheet(set->getMiniButtonStyle()); + //lsbBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(lsbBtn); + CHECKED_CONNECT(lsbBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + usbBtn = new AeroButton("USB", this); + usbBtn->setRoundness(0); + //usbBtn->setGlass(false); + usbBtn->setFixedSize(btn_widths, btn_height); + usbBtn->setStyleSheet(set->getMiniButtonStyle()); + //usbBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(usbBtn); + CHECKED_CONNECT(usbBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + dsbBtn = new AeroButton("DSB", this); + dsbBtn->setRoundness(0); + //dsbBtn->setGlass(false); + dsbBtn->setFixedSize(btn_widths, btn_height); + dsbBtn->setStyleSheet(set->getMiniButtonStyle()); + //dsbBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(dsbBtn); + CHECKED_CONNECT(dsbBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + cwlBtn = new AeroButton("CWL", this); + cwlBtn->setRoundness(0); + //cwlBtn->setGlass(false); + cwlBtn->setFixedSize(btn_widths, btn_height); + cwlBtn->setStyleSheet(set->getMiniButtonStyle()); + //cwlBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(cwlBtn); + CHECKED_CONNECT(cwlBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + cwuBtn = new AeroButton("CWU", this); + cwuBtn->setRoundness(0); + //cwuBtn->setGlass(false); + cwuBtn->setFixedSize(btn_widths, btn_height); + cwuBtn->setStyleSheet(set->getMiniButtonStyle()); + //cwuBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(cwuBtn); + CHECKED_CONNECT(cwuBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + fmnBtn = new AeroButton("FMN", this); + fmnBtn->setRoundness(0); + //fmnBtn->setGlass(false); + fmnBtn->setFixedSize(btn_widths, btn_height); + fmnBtn->setStyleSheet(set->getMiniButtonStyle()); + //fmnBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(fmnBtn); + CHECKED_CONNECT(fmnBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + amBtn = new AeroButton("AM", this); + amBtn->setRoundness(0); + //amBtn->setGlass(false); + amBtn->setFixedSize(btn_widths, btn_height); + amBtn->setStyleSheet(set->getMiniButtonStyle()); + //amBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(amBtn); + CHECKED_CONNECT(amBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + diguBtn = new AeroButton("DIGU", this); + diguBtn->setRoundness(0); + //diguBtn->setGlass(false); + diguBtn->setFixedSize(btn_widths, btn_height); + diguBtn->setStyleSheet(set->getMiniButtonStyle()); + //diguBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(diguBtn); + CHECKED_CONNECT(diguBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + diglBtn = new AeroButton("DIGL", this); + diglBtn->setRoundness(0); + //diglBtn->setGlass(false); + diglBtn->setFixedSize(btn_widths, btn_height); + diglBtn->setStyleSheet(set->getMiniButtonStyle()); + //diglBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(diglBtn); + CHECKED_CONNECT(diglBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + specBtn = new AeroButton("SPEC", this); + specBtn->setRoundness(0); + //specBtn->setGlass(false); + specBtn->setFixedSize(btn_widths, btn_height); + specBtn->setStyleSheet(set->getMiniButtonStyle()); + //specBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(specBtn); + CHECKED_CONNECT(specBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + samBtn = new AeroButton("SAM", this); + samBtn->setRoundness(0); + //samBtn->setGlass(false); + samBtn->setFixedSize(btn_widths, btn_height); + samBtn->setStyleSheet(set->getMiniButtonStyle()); + //samBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(samBtn); + CHECKED_CONNECT(samBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + drmBtn = new AeroButton("DRM", this); + drmBtn->setRoundness(0); + //drmBtn->setGlass(false); + drmBtn->setFixedSize(btn_widths, btn_height); + drmBtn->setStyleSheet(set->getMiniButtonStyle()); + //drmBtn->setTextColor(QColor(200, 200, 200)); + dspModeBtnList.append(drmBtn); + CHECKED_CONNECT(drmBtn, SIGNAL(clicked()), this, SLOT(dspModeChangedByBtn())); + + /*foreach(AeroButton *btn, dspModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + m_dspMode = set->getCurrentDSPMode(); + dspModeBtnList.at(m_dspMode)->setBtnState(AeroButton::ON);*/ + + QGridLayout *layout = new QGridLayout(); + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(lsbBtn, 0, 0); + layout->addWidget(usbBtn, 0, 1); + layout->addWidget(dsbBtn, 0, 2); + layout->addWidget(cwlBtn, 0, 3); + layout->addWidget(cwuBtn, 0, 4); + layout->addWidget(fmnBtn, 0, 5); + layout->addWidget(amBtn, 1, 0); + layout->addWidget(diguBtn, 1, 1); + layout->addWidget(specBtn, 1, 2); + layout->addWidget(diglBtn, 1, 3); + layout->addWidget(samBtn, 1, 4); + layout->addWidget(drmBtn, 1, 5); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + modeGroupBox = new QGroupBox(tr("Mode"), this); + modeGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + modeGroupBox->setLayout(vbox); + modeGroupBox->setStyleSheet(set->getWidgetStyle()); + //modeGroupBox->setMinimumWidth(100); + modeGroupBox->setFont(QFont("Arial", 8)); +} + +void RadioWidget::createFilterBtnGroupA() { + + filter1kBtnA = new AeroButton("1k", this); + filter1kBtnA->setObjectName("1k"); + filter1kBtnA->setRoundness(0); + //filter1kBtnA->setGlass(false); + filter1kBtnA->setFixedSize(btn_widths, btn_height); + filter1kBtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter1kBtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter1kBtnA); + CHECKED_CONNECT(filter1kBtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter1k8BtnA = new AeroButton("1k8", this); + filter1kBtnA->setObjectName("1k8"); + filter1k8BtnA->setRoundness(0); + //filter1k8BtnA->setGlass(false); + filter1k8BtnA->setFixedSize(btn_widths, btn_height); + filter1k8BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter1k8BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter1k8BtnA); + CHECKED_CONNECT(filter1k8BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k1BtnA = new AeroButton("2k1", this); + filter1kBtnA->setObjectName("2k1"); + filter2k1BtnA->setRoundness(0); + //filter2k1BtnA->setGlass(false); + filter2k1BtnA->setFixedSize(btn_widths, btn_height); + filter2k1BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter2k1BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter2k1BtnA); + CHECKED_CONNECT(filter2k1BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k4BtnA = new AeroButton("2k4", this); + filter1kBtnA->setObjectName("2k4"); + filter2k4BtnA->setRoundness(0); + //filter2k4BtnA->setGlass(false); + filter2k4BtnA->setFixedSize(btn_widths, btn_height); + filter2k4BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter2k4BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter2k4BtnA); + CHECKED_CONNECT(filter2k4BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k7BtnA = new AeroButton("2k7", this); + filter1kBtnA->setObjectName("2k7"); + filter2k7BtnA->setRoundness(0); + //filter2k7BtnA->setGlass(false); + filter2k7BtnA->setFixedSize(btn_widths, btn_height); + filter2k7BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter2k7BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter2k7BtnA); + CHECKED_CONNECT(filter2k7BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k9BtnA = new AeroButton("2k9", this); + filter1kBtnA->setObjectName("2k9"); + filter2k9BtnA->setRoundness(0); + //filter2k9BtnA->setGlass(false); + filter2k9BtnA->setFixedSize(btn_widths, btn_height); + filter2k9BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter2k9BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter2k9BtnA); + CHECKED_CONNECT(filter2k9BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter3k3BtnA = new AeroButton("3k3", this); + filter1kBtnA->setObjectName("3k3"); + filter3k3BtnA->setRoundness(0); + //filter3k3BtnA->setGlass(false); + filter3k3BtnA->setFixedSize(btn_widths, btn_height); + filter3k3BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter3k3BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter3k3BtnA); + CHECKED_CONNECT(filter3k3BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter3k8BtnA = new AeroButton("3k8", this); + filter1kBtnA->setObjectName("3k8"); + filter3k8BtnA->setRoundness(0); + //filter3k8BtnA->setGlass(false); + filter3k8BtnA->setFixedSize(btn_widths, btn_height); + filter3k8BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter3k8BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter3k8BtnA); + CHECKED_CONNECT(filter3k8BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter4k4BtnA = new AeroButton("4k4", this); + filter1kBtnA->setObjectName("4k4"); + filter4k4BtnA->setRoundness(0); + //filter4k4BtnA->setGlass(false); + filter4k4BtnA->setFixedSize(btn_widths, btn_height); + filter4k4BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter4k4BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter4k4BtnA); + CHECKED_CONNECT(filter4k4BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter5kBtnA = new AeroButton("5k", this); + filter1kBtnA->setObjectName("5k"); + filter5kBtnA->setRoundness(0); + //filter5kBtnA->setGlass(false); + filter5kBtnA->setFixedSize(btn_widths, btn_height); + filter5kBtnA->setStyleSheet(set->getMiniButtonStyle()); + //filter5kBtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filter5kBtnA); + CHECKED_CONNECT(filter5kBtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar1BtnA = new AeroButton("Var1", this); + filter1kBtnA->setObjectName("Var1"); + filterVar1BtnA->setRoundness(0); + //filterVar1BtnA->setGlass(false); + filterVar1BtnA->setFixedSize(btn_widths, btn_height); + filterVar1BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filterVar1BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filterVar1BtnA); + CHECKED_CONNECT(filterVar1BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar2BtnA = new AeroButton("Var2", this); + filter1kBtnA->setObjectName("Var2"); + filterVar2BtnA->setRoundness(0); + //filterVar2BtnA->setGlass(false); + filterVar2BtnA->setFixedSize(btn_widths, btn_height); + filterVar2BtnA->setStyleSheet(set->getMiniButtonStyle()); + //filterVar2BtnA->setTextColor(QColor(200, 200, 200)); + filterBtnListA.append(filterVar2BtnA); + CHECKED_CONNECT(filterVar2BtnA, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + foreach(AeroButton *btn, filterBtnListA) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + //filterBtnListA.at(set->getCurrentDSPMode())->setBtnState(AeroButton::ON); + + QGridLayout *layout = new QGridLayout; + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(filter5kBtnA, 0, 0); + layout->addWidget(filter4k4BtnA, 0, 1); + layout->addWidget(filter3k8BtnA, 0, 2); + layout->addWidget(filter3k3BtnA, 0, 3); + layout->addWidget(filter2k9BtnA, 0, 4); + layout->addWidget(filter2k7BtnA, 0, 5); + layout->addWidget(filter2k4BtnA, 1, 0); + layout->addWidget(filter2k1BtnA, 1, 1); + layout->addWidget(filter1k8BtnA, 1, 2); + layout->addWidget(filter1kBtnA, 1, 3); + layout->addWidget(filterVar1BtnA, 1, 4); + layout->addWidget(filterVar2BtnA, 1, 5); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + filterGroupABox = new QGroupBox(tr("Filter"), this); + filterGroupABox->setMinimumWidth(m_minimumGroupBoxWidth); + filterGroupABox->setLayout(vbox); + filterGroupABox->setStyleSheet(set->getWidgetStyle()); + filterGroupABox->setFont(QFont("Arial", 8)); +} + +void RadioWidget::createFilterBtnGroupB() { + + filter16kBtnB = new AeroButton("16k", this); + filter16kBtnB->setRoundness(0); + //filter16kBtnB->setGlass(false); + filter16kBtnB->setFixedSize(btn_widths, btn_height); + filter16kBtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter16kBtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter16kBtnB); + CHECKED_CONNECT(filter16kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter12kBtnB = new AeroButton("12k", this); + filter12kBtnB->setRoundness(0); + //filter12kBtnB->setGlass(false); + filter12kBtnB->setFixedSize(btn_widths, btn_height); + filter12kBtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter12kBtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter12kBtnB); + CHECKED_CONNECT(filter12kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter10kBtnB = new AeroButton("10k", this); + filter10kBtnB->setRoundness(0); + //filter10kBtnB->setGlass(false); + filter10kBtnB->setFixedSize(btn_widths, btn_height); + filter10kBtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter10kBtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter10kBtnB); + CHECKED_CONNECT(filter10kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter8kBtnB = new AeroButton("8k", this); + filter8kBtnB->setRoundness(0); + //filter8kBtnB->setGlass(false); + filter8kBtnB->setFixedSize(btn_widths, btn_height); + filter8kBtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter8kBtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter8kBtnB); + CHECKED_CONNECT(filter8kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter6k6BtnB = new AeroButton("6k6", this); + filter6k6BtnB->setRoundness(0); + //filter6k6BtnB->setGlass(false); + filter6k6BtnB->setFixedSize(btn_widths, btn_height); + filter6k6BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter6k6BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter6k6BtnB); + CHECKED_CONNECT(filter6k6BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter5k2BtnB = new AeroButton("5k2", this); + filter5k2BtnB->setRoundness(0); + //filter5k2BtnB->setGlass(false); + filter5k2BtnB->setFixedSize(btn_widths, btn_height); + filter5k2BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter5k2BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter5k2BtnB); + CHECKED_CONNECT(filter5k2BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter4kBtnB = new AeroButton("4k", this); + filter4kBtnB->setRoundness(0); + //filter4kBtnB->setGlass(false); + filter4kBtnB->setFixedSize(btn_widths, btn_height); + filter4kBtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter4kBtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter4kBtnB); + CHECKED_CONNECT(filter4kBtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter3k1BtnB = new AeroButton("3k1", this); + filter3k1BtnB->setRoundness(0); + //filter3k1BtnB->setGlass(false); + filter3k1BtnB->setFixedSize(btn_widths, btn_height); + filter3k1BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter3k1BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter3k1BtnB); + CHECKED_CONNECT(filter3k1BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k9BtnB = new AeroButton("2k9", this); + filter2k9BtnB->setRoundness(0); + //filter2k9BtnB->setGlass(false); + filter2k9BtnB->setFixedSize(btn_widths, btn_height); + filter2k9BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter2k9BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter2k9BtnB); + CHECKED_CONNECT(filter2k9BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter2k4BtnB = new AeroButton("2k4", this); + filter2k4BtnB->setRoundness(0); + //filter2k4BtnB->setGlass(false); + filter2k4BtnB->setFixedSize(btn_widths, btn_height); + filter2k4BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filter2k4BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filter2k4BtnB); + CHECKED_CONNECT(filter2k4BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar1BtnB = new AeroButton("Var1", this); + filterVar1BtnB->setRoundness(0); + //filterVar1BtnB->setGlass(false); + filterVar1BtnB->setFixedSize(btn_widths, btn_height); + filterVar1BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filterVar1BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filterVar1BtnB); + CHECKED_CONNECT(filterVar1BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar2BtnB = new AeroButton("Var2", this); + filterVar2BtnB->setRoundness(0); + //filterVar2BtnB->setGlass(false); + filterVar2BtnB->setFixedSize(btn_widths, btn_height); + filterVar2BtnB->setStyleSheet(set->getMiniButtonStyle()); + //filterVar2BtnB->setTextColor(QColor(200, 200, 200)); + filterBtnListB.append(filterVar2BtnB); + CHECKED_CONNECT(filterVar2BtnB, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + foreach(AeroButton *btn, filterBtnListB) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + //filterBtnListA.at(set->getCurrentDSPMode())->setBtnState(AeroButton::ON); + + QGridLayout *layout = new QGridLayout; + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(filter16kBtnB, 0, 0); + layout->addWidget(filter12kBtnB, 0, 1); + layout->addWidget(filter10kBtnB, 0, 2); + layout->addWidget(filter8kBtnB, 0, 3); + layout->addWidget(filter6k6BtnB, 0, 4); + layout->addWidget(filter5k2BtnB, 0, 5); + layout->addWidget(filter4kBtnB, 1, 0); + layout->addWidget(filter3k1BtnB, 1, 1); + layout->addWidget(filter2k9BtnB, 1, 2); + layout->addWidget(filter2k4BtnB, 1, 3); + layout->addWidget(filterVar1BtnB, 1, 4); + layout->addWidget(filterVar2BtnB, 1, 5); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + filterGroupBBox = new QGroupBox(tr("Filter"), this); + filterGroupBBox->setMinimumWidth(m_minimumGroupBoxWidth); + filterGroupBBox->setLayout(vbox); + filterGroupBBox->setStyleSheet(set->getWidgetStyle()); + filterGroupBBox->setFont(QFont("Arial", 8)); +} + +void RadioWidget::createFilterBtnGroupC() { + + filter1kBtnC = new AeroButton("1k", this); + filter1kBtnC->setRoundness(0); + //filter1kBtnC->setGlass(false); + filter1kBtnC->setFixedSize(btn_widths, btn_height); + filter1kBtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter1kBtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter1kBtnC); + CHECKED_CONNECT(filter1kBtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter800BtnC = new AeroButton("800", this); + filter800BtnC->setRoundness(0); + //filter800BtnC->setGlass(false); + filter800BtnC->setFixedSize(btn_widths, btn_height); + filter800BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter800BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter800BtnC); + CHECKED_CONNECT(filter800BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter750BtnC = new AeroButton("750", this); + filter750BtnC->setRoundness(0); + //filter750BtnC->setGlass(false); + filter750BtnC->setFixedSize(btn_widths, btn_height); + filter750BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter750BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter750BtnC); + CHECKED_CONNECT(filter750BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter600BtnC = new AeroButton("600", this); + filter600BtnC->setRoundness(0); + //filter600BtnC->setGlass(false); + filter600BtnC->setFixedSize(btn_widths, btn_height); + filter600BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter600BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter600BtnC); + CHECKED_CONNECT(filter600BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter500BtnC = new AeroButton("500", this); + filter500BtnC->setRoundness(0); + //filter500BtnC->setGlass(false); + filter500BtnC->setFixedSize(btn_widths, btn_height); + filter500BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter500BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter500BtnC); + CHECKED_CONNECT(filter500BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter400BtnC = new AeroButton("400", this); + filter400BtnC->setRoundness(0); + //filter400BtnC->setGlass(false); + filter400BtnC->setFixedSize(btn_widths, btn_height); + filter400BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter400BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter400BtnC); + CHECKED_CONNECT(filter400BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter250BtnC = new AeroButton("250", this); + filter250BtnC->setRoundness(0); + //filter250BtnC->setGlass(false); + filter250BtnC->setFixedSize(btn_widths, btn_height); + filter250BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter250BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter250BtnC); + CHECKED_CONNECT(filter250BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter100BtnC = new AeroButton("100", this); + filter100BtnC->setRoundness(0); + //filter100BtnC->setGlass(false); + filter100BtnC->setFixedSize(btn_widths, btn_height); + filter100BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter100BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter100BtnC); + CHECKED_CONNECT(filter100BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter50BtnC = new AeroButton("50", this); + filter50BtnC->setRoundness(0); + //filter50BtnC->setGlass(false); + filter50BtnC->setFixedSize(btn_widths, btn_height); + filter50BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter50BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter50BtnC); + CHECKED_CONNECT(filter50BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filter25BtnC = new AeroButton("25", this); + filter25BtnC->setRoundness(0); + //filter25BtnC->setGlass(false); + filter25BtnC->setFixedSize(btn_widths, btn_height); + filter25BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filter25BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filter25BtnC); + CHECKED_CONNECT(filter25BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar1BtnC = new AeroButton("Var1", this); + filterVar1BtnC->setRoundness(0); + //filterVar1BtnC->setGlass(false); + filterVar1BtnC->setFixedSize(btn_widths, btn_height); + filterVar1BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filterVar1BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filterVar1BtnC); + CHECKED_CONNECT(filterVar1BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + filterVar2BtnC = new AeroButton("Var2", this); + filterVar2BtnC->setRoundness(0); + //filterVar2BtnC->setGlass(false); + filterVar2BtnC->setFixedSize(btn_widths, btn_height); + filterVar2BtnC->setStyleSheet(set->getMiniButtonStyle()); + //filterVar2BtnC->setTextColor(QColor(200, 200, 200)); + filterBtnListC.append(filterVar2BtnC); + CHECKED_CONNECT(filterVar2BtnC, SIGNAL(clicked()), this, SLOT(filterChangedByBtn())); + + foreach(AeroButton *btn, filterBtnListC) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + //filterBtnListC.at(set)->getCurrentDSPMode())->setBtnState(AeroButton::ON); + + QGridLayout *layout = new QGridLayout(); + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(filter1kBtnC, 0, 0); + layout->addWidget(filter800BtnC, 0, 1); + layout->addWidget(filter750BtnC, 0, 2); + layout->addWidget(filter600BtnC, 0, 3); + layout->addWidget(filter500BtnC, 0, 4); + layout->addWidget(filter400BtnC, 0, 5); + layout->addWidget(filter250BtnC, 1, 0); + layout->addWidget(filter100BtnC, 1, 1); + layout->addWidget(filter50BtnC, 1, 2); + layout->addWidget(filter25BtnC, 1, 3); + layout->addWidget(filterVar1BtnC, 1, 4); + layout->addWidget(filterVar2BtnC, 1, 5); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + filterGroupCBox = new QGroupBox(tr("Filter"), this); + filterGroupCBox->setMinimumWidth(m_minimumGroupBoxWidth); + filterGroupCBox->setLayout(vbox); + filterGroupCBox->setStyleSheet(set->getWidgetStyle()); + filterGroupCBox->setFont(QFont("Arial", 8)); +} + +QGroupBox *RadioWidget::mercuryBtnGroup() { + + attenuatorBtn = new AeroButton("Attn.", this); + attenuatorBtn->setRoundness(0); + attenuatorBtn->setFixedSize (50, btn_height); + attenuatorBtn->setStyleSheet(set->getMiniButtonStyle()); + connect(attenuatorBtn, SIGNAL(released()), this, SLOT(attenuatorChanged())); + + ditherBtn = new AeroButton("Dither", this); + ditherBtn->setRoundness(0); + //ditherBtn->setGlass(false); + ditherBtn->setFixedSize (50, btn_height); + ditherBtn->setStyleSheet(set->getMiniButtonStyle()); + //ditherBtn->setTextColor(QColor(200, 200, 200)); + connect(ditherBtn, SIGNAL(released()), this, SLOT(ditherChanged())); + + randomBtn = new AeroButton("Rand", this); + randomBtn->setRoundness(0); + //randomBtn->setGlass(false); + randomBtn->setFixedSize(50, btn_height); + randomBtn->setStyleSheet(set->getMiniButtonStyle()); + //randomBtn->setTextColor(QColor(200, 200, 200)); + CHECKED_CONNECT(randomBtn, SIGNAL(released()), this, SLOT(randomChanged())); + + HamBand band = m_receiverDataList.at(0).hamBand; + + if (m_receiverDataList.at(0).mercuryAttenuators.at(band)) { + + attenuatorBtn->setBtnState(AeroButton::OFF); + attenuatorBtn->setText("Att 0dB"); + } + else { + + attenuatorBtn->setBtnState(AeroButton::ON); + attenuatorBtn->setText("Att -20dB"); + } + + if(set->getMercuryDither()) + ditherBtn->setBtnState(AeroButton::ON); + + if(set->getMercuryRandom()) + randomBtn->setBtnState(AeroButton::ON); + + QGridLayout *layout = new QGridLayout(); + layout->setVerticalSpacing(1); + layout->setHorizontalSpacing(1); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(attenuatorBtn, 0, 0); + layout->addWidget(ditherBtn, 0, 1); + layout->addWidget(randomBtn, 0, 2); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + hbox1->addLayout(layout); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + QGroupBox *groupBox = new QGroupBox(tr("Mercury"), this); + groupBox->setMinimumWidth(m_minimumGroupBoxWidth); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(set->getWidgetStyle()); + //groupBox->setMinimumWidth(175); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +QLabel *RadioWidget::createLabel(const QString &text) { + + QLabel *label = new QLabel(text, this); + label->setFrameStyle(QFrame::Box | QFrame::Raised); + return label; +} + + +//****************************************** +void RadioWidget::ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency) { + + Q_UNUSED(sender) + Q_UNUSED(mode) + + if (m_currentRx != rx) return; + m_ctrFrequency = frequency; + + HamBand band = getBandFromFrequency(set->getBandFrequencyList(), frequency); + m_lastCtrFrequencyList[(int) band] = m_ctrFrequency; +} + +void RadioWidget::vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency) { + + Q_UNUSED(sender) + Q_UNUSED(mode) + + if (m_currentRx != rx) return; + m_vfoFrequency = frequency; + + HamBand band = getBandFromFrequency(set->getBandFrequencyList(), frequency); + m_lastVfoFrequencyList[(int) band] = m_vfoFrequency; +} + +void RadioWidget::bandChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + int btn = bandBtnList.indexOf(button); + + foreach(AeroButton *btn, bandBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + set->setHamBand(this, m_currentRx, true, (HamBand) btn); + + QString str = button->text(); + + if (str == "2200m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m2200)); + else + if (str == "630 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m630)); + else + if (str == "160 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m160)); + else + if (str == "80 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m80)); + else + if (str == "60 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m60)); + else + if (str == "40 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m40)); + else + if (str == "30 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m30)); + else + if (str == "20 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m20)); + else + if (str == "17 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m17)); + else + if (str == "15 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m15)); + else + if (str == "12 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m12)); + else + if (str == "10 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m10)); + else + if (str == "6 m") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(m6)); + else + if (str == "Gen") + set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(gen)); + +} + +void RadioWidget::bandChanged(QObject *sender, int rx, bool byButton, HamBand band) { + + Q_UNUSED (byButton) + + if (sender == this) return; + + if (m_currentRx != rx) return; + m_hamBand = band; + + foreach(AeroButton *btn, bandBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + //m_lastFrequencyList[(int) band] = m_frequency; + bandBtnList.at(band)->setBtnState(AeroButton::ON); + bandBtnList.at(band)->update(); +} + +void RadioWidget::dspModeChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + int btn = dspModeBtnList.indexOf(button); + + foreach(AeroButton *btn, dspModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + set->setDSPMode(this, m_currentRx, (DSPMode) btn); + m_dspModeList[m_hamBand] = (DSPMode) btn; + filterChanged(this, m_currentRx, m_filterLo, m_filterHi); + filterGroupChanged((DSPMode) btn); + + button->setBtnState(AeroButton::ON); + button->update(); +} + +void RadioWidget::dspModeChanged(QObject *sender, int rx, DSPMode mode) { + + Q_UNUSED(sender) + + if (m_currentRx != rx) return; + m_dspModeList[m_hamBand] = mode; + + foreach(AeroButton *btn, dspModeBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + dspModeBtnList.at(mode)->setBtnState(AeroButton::ON); + dspModeBtnList.at(mode)->update(); +} + +void RadioWidget::filterGroupChanged(DSPMode mode) { + + if (mode == 0 || mode == 1 || mode == 7 || mode == 9) { + + filterGroupBBox->hide(); + filterGroupCBox->hide(); + filterGroupABox->show(); + } + else if (mode == 2 || mode == 5 || mode == 6 || mode == 10) { + + filterGroupABox->hide(); + filterGroupCBox->hide(); + filterGroupBBox->show(); + } + else if (mode == 3 || mode == 4) { + + filterGroupABox->hide(); + filterGroupBBox->hide(); + filterGroupCBox->show(); + } + /*else if (mode == 8 || mode == 11) + { + filterGroupA->hide(); + filterGroupB->hide(); + filterGroupC->hide(); + }*/ +} + +void RadioWidget::filterChangedByBtn() { + + AeroButton *button = qobject_cast(sender()); + + QList btnList; + int filterList = 0; + + if (filterBtnListA.contains(button)) { + + btnList = filterBtnListA; + filterList = 0; + } + else if (filterBtnListB.contains(button)) { + + btnList = filterBtnListB; + filterList = 1; + } + else if (filterBtnListC.contains(button)) { + + btnList = filterBtnListC; + filterList = 2; + } + + foreach(AeroButton *btn, btnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + button->setBtnState(AeroButton::ON); + button->update(); + + QString str = button->text(); + + DSPMode mode = m_dspModeList.at(m_hamBand); + switch (filterList) { + + case 0: // filterBtnList A + + if (str == "1k") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -1150.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 1150.0f; + break; + + default: + break; + + } + } + else + if (str == "1k8") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -1950.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 1950.0f; + break; + + default: + break; + } + } + else + if (str == "2k1") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -2250.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 2250.0f; + break; + + default: + break; + + } + } + else + if (str == "2k4") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -2550.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 2550.0f; + break; + + default: + break; + + } + } + else + if (str == "2k7") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -2850.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 2850.0f; + break; + + default: + break; + + } + } + else + if (str == "2k9") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -3050.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 3050.0f; + break; + + default: + break; + + } + } + else + if (str == "3k3") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -3450.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 3450.0f; + break; + + default: + break; + + } + } + else + if (str == "3k8") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -3950.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 3950.0f; + break; + + default: + break; + } + } + else + if (str == "4k4") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -4550.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 4550.0f; + break; + + default: + break; + } + } + else + if (str == "5k") { + + switch (mode) { + + case (DSPMode) LSB: + m_filterLo = -5150.0f; + m_filterHi = -150.0f; + break; + + case (DSPMode) USB: + m_filterLo = 150.0f; + m_filterHi = 5150.0f; + break; + + default: + break; + } + } + break; + + case 1: // filterBtnList B + + if (str == "2k4") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -1200.0f; + m_filterHi = 1200.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + default: + break; + } + } + else + if (str == "2k9") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -1450.0f; + m_filterHi = 1450.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "3k1") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -1550.0f; + m_filterHi = 1550.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "4k") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "5k2") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -2600.0f; + m_filterHi = 2600.0f; + break; + + case 5: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "6k6") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -3300.0f; + m_filterHi = 3300.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "8k") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "10k") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -5000.0f; + m_filterHi = 5000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "12k") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -6000.0f; + m_filterHi = 6000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + else + if (str == "16k") { + + switch (mode) { + + case (DSPMode) DSB: + case (DSPMode) AM: + case (DSPMode) SAM: + m_filterLo = -8000.0f; + m_filterHi = 8000.0f; + break; + + case (DSPMode) FMN: + m_filterLo = -2000.0f; + m_filterHi = 2000.0f; + break; + + /*case 6: + m_filterLo = -4000.0f; + m_filterHi = 4000.0f; + break;*/ + + default: + break; + } + } + break; + + case 2: // filterBtnList C + + if (str == "25") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -125.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 125.0f; + break; + + default: + break; + } + } + else + if (str == "50") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -150.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 150.0f; + break; + + default: + break; + } + } + else + if (str == "100") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -200.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 200.0f; + break; + + default: + break; + } + } + else + if (str == "250") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -350.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 350.0f; + break; + + default: + break; + } + } + else + if (str == "400") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -500.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 500.0f; + break; + + default: + break; + } + } + else + if (str == "500") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -600.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 600.0f; + break; + + default: + break; + } + } + else + if (str == "600") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -700.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 700.0f; + break; + + default: + break; + } + } + else + if (str == "750") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -850.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 850.0f; + break; + + default: + break; + } + } + else + if (str == "800") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -900.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 900.0f; + break; + + default: + break; + } + } + else + if (str == "1k") { + + switch (mode) { + + case (DSPMode) CWL: + m_filterLo = -1100.0f; + m_filterHi = -100.0f; + break; + + case (DSPMode) CWU: + m_filterLo = 100.0f; + m_filterHi = 1100.0f; + break; + + default: + break; + } + } + break; + } + + set->setRXFilter(this, m_currentRx, m_filterLo, m_filterHi); +} + +void RadioWidget::filterChanged(QObject *sender, int rx, qreal low, qreal high) { + + Q_UNUSED(sender) + + if (m_currentRx != rx) return; + m_filterLo = low; + m_filterHi = high; + + DSPMode mode = m_dspModeList.at(m_hamBand); + if (mode == (DSPMode ) LSB || mode == (DSPMode ) USB || mode == (DSPMode ) DIGU || mode == (DSPMode ) DIGL) { + + foreach(AeroButton *btn, filterBtnListA) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + if ((m_filterLo == -5150.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 5150.0)) { + filter5kBtnA->setBtnState(AeroButton::ON); + filter5kBtnA->update(); + } + else + if ((m_filterLo == -4550.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 4550.0)) { + filter4k4BtnA->setBtnState(AeroButton::ON); + filter4k4BtnA->update(); + } + else + if ((m_filterLo == -3950.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 3950.0)) { + filter3k8BtnA->setBtnState(AeroButton::ON); + filter3k8BtnA->update(); + } + else + if ((m_filterLo == -3450.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 3450.0)) { + filter3k3BtnA->setBtnState(AeroButton::ON); + filter3k3BtnA->update(); + } + else + if ((m_filterLo == -3050.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 3050.0)) { + filter2k9BtnA->setBtnState(AeroButton::ON); + filter2k9BtnA->update(); + } + else + if ((m_filterLo == -2850.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 2850.0)) { + filter2k7BtnA->setBtnState(AeroButton::ON); + filter2k7BtnA->update(); + } + else + if ((m_filterLo == -2550.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 2550.0)) { + filter2k4BtnA->setBtnState(AeroButton::ON); + filter2k4BtnA->update(); + } + else + if ((m_filterLo == -2250.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 2250.0)) { + filter2k1BtnA->setBtnState(AeroButton::ON); + filter2k1BtnA->update(); + } + else + if ((m_filterLo == -1950.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 1950.0)) { + filter1k8BtnA->setBtnState(AeroButton::ON); + filter1k8BtnA->update(); + } + else + if ((m_filterLo == -1150.0 && m_filterHi == -150.0) || (m_filterLo == 150.0 && m_filterHi == 1150.0)) { + filter1kBtnA->setBtnState(AeroButton::ON); + filter1kBtnA->update(); + } + } + else if (mode == (DSPMode ) DSB || mode == (DSPMode ) FMN || mode == (DSPMode ) AM || mode == (DSPMode ) SAM) { + + // filterGroupBBox + foreach(AeroButton *btn, filterBtnListB) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + if (m_filterLo == -8000.0 && m_filterHi == 8000.0) { + filter16kBtnB->setBtnState(AeroButton::ON); + filter16kBtnB->update(); + } + else + if (m_filterLo == -6000.0 && m_filterHi == 6000.0) { + filter12kBtnB->setBtnState(AeroButton::ON); + filter12kBtnB->update(); + } + else + if (m_filterLo == -5000.0 && m_filterHi == 5000.0) { + filter10kBtnB->setBtnState(AeroButton::ON); + filter10kBtnB->update(); + } + else + if (m_filterLo == -4000.0 && m_filterHi == 4000.0) { + filter8kBtnB->setBtnState(AeroButton::ON); + filter8kBtnB->update(); + } + else + if (m_filterLo == -3300.0 && m_filterHi == 3300.0) { + filter6k6BtnB->setBtnState(AeroButton::ON); + filter6k6BtnB->update(); + } + else + if (m_filterLo == -2600.0 && m_filterHi == 2600.0) { + filter5k2BtnB->setBtnState(AeroButton::ON); + filter5k2BtnB->update(); + } + else + if (m_filterLo == -2000.0 && m_filterHi == 2000.0) { + filter4kBtnB->setBtnState(AeroButton::ON); + filter4kBtnB->update(); + } + else + if (m_filterLo == -1550.0 && m_filterHi == 1550.0) { + filter3k1BtnB->setBtnState(AeroButton::ON); + filter3k1BtnB->update(); + } + else + if (m_filterLo == -1450.0 && m_filterHi == 1450.0) { + filter2k9BtnB->setBtnState(AeroButton::ON); + filter2k9BtnB->update(); + } + else + if (m_filterLo == -1200.0 && m_filterHi == 1200.0) { + filter2k4BtnB->setBtnState(AeroButton::ON); + filter2k4BtnB->update(); + } + } + else if (mode == (DSPMode ) CWL || mode == (DSPMode ) CWU) { + + // filterGroupCBox + foreach(AeroButton *btn, filterBtnListC) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + + if ((m_filterLo == -1100.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 1100.0)) { + filter1kBtnC->setBtnState(AeroButton::ON); + filter1kBtnC->update(); + } + else + if ((m_filterLo == -900.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 900.0)) { + filter800BtnC->setBtnState(AeroButton::ON); + filter800BtnC->update(); + } + else + if ((m_filterLo == -850.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 850.0)) { + filter750BtnC->setBtnState(AeroButton::ON); + filter750BtnC->update(); + } + else + if ((m_filterLo == -700.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 700.0)) { + filter600BtnC->setBtnState(AeroButton::ON); + filter600BtnC->update(); + } + else + if ((m_filterLo == -600.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 600.0)) { + filter500BtnC->setBtnState(AeroButton::ON); + filter500BtnC->update(); + } + else + if ((m_filterLo == -500.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 500.0)) { + filter400BtnC->setBtnState(AeroButton::ON); + filter400BtnC->update(); + } + else + if ((m_filterLo == -350.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 350.0)) { + filter250BtnC->setBtnState(AeroButton::ON); + filter250BtnC->update(); + } + else + if ((m_filterLo == -200.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 200.0)) { + filter100BtnC->setBtnState(AeroButton::ON); + filter100BtnC->update(); + } + else + if ((m_filterLo == -150.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 150.0)) { + filter50BtnC->setBtnState(AeroButton::ON); + filter50BtnC->update(); + } + else + if ((m_filterLo == -125.0 && m_filterHi == -100.0) || (m_filterLo == 100.0 && m_filterHi == 125.0)) { + filter25BtnC->setBtnState(AeroButton::ON); + filter25BtnC->update(); + } + } +} + +void RadioWidget::attenuatorChanged() { + + if (attenuatorBtn->btnState() == AeroButton::OFF) { + + set->setMercuryAttenuator(this, 0); + attenuatorBtn->setBtnState(AeroButton::ON); + attenuatorBtn->setText("Att -20dB"); + emit newMessage("[hpsdr]: attenuator -20 dB."); + } + else { + + set->setMercuryAttenuator(this, 1); + attenuatorBtn->setBtnState(AeroButton::OFF); + attenuatorBtn->setText("Att 0dB"); + emit newMessage("[hpsdr]: attenuator 0 dB."); + } +} + +void RadioWidget::setMercuryAttenuator(QObject *sender, HamBand band, int value) { + + Q_UNUSED(sender) + Q_UNUSED(band) + + if (value) { + + attenuatorBtn->setBtnState(AeroButton::OFF); + attenuatorBtn->setText("Att 0dB"); + emit newMessage("[hpsdr]: attenuator 0 dB."); + } + else { + + attenuatorBtn->setBtnState(AeroButton::ON); + attenuatorBtn->setText("Att -20dB"); + emit newMessage("[hpsdr]: attenuator -20 dB."); + } +} + +void RadioWidget::ditherChanged() { + + if (ditherBtn->btnState() == AeroButton::OFF) { + + set->setDither(this, true); + ditherBtn->setBtnState(AeroButton::ON); + emit newMessage("[hpsdr]: dither on."); + + } else { + + set->setDither(this, false); + ditherBtn->setBtnState(AeroButton::OFF); + emit newMessage("[hpsdr]: dither off."); + } +} + +void RadioWidget::randomChanged() { + + if (randomBtn->btnState() == AeroButton::OFF) { + + set->setRandom(this, true); + randomBtn->setBtnState(AeroButton::ON); + emit newMessage("[hpsdr]: random on."); + + } else { + + set->setRandom(this, false); + randomBtn->setBtnState(AeroButton::OFF); + emit newMessage("[hpsdr]: random off."); + } +} + +void RadioWidget::setCurrentReceiver(QObject *sender, int value) { + + Q_UNUSED(sender) + + if (m_currentRx == value) return; + m_currentRx = value; + + TReceiver rxData = set->getReceiverDataList().at(m_currentRx); + + if (m_hamBand != rxData.hamBand) { + m_hamBand = rxData.hamBand; + + foreach(AeroButton *btn, bandBtnList) { + + btn->setBtnState(AeroButton::OFF); + btn->update(); + } + AeroButton *button = bandBtnList.at(m_hamBand); + button->setBtnState(AeroButton::ON); + button->update(); + + } + +// DSPMode mode = m_dspModeList.at(m_hamBand); +// if (mode != rxData.dspModeList.at(m_hamBand)) { +// +// m_dspModeList[m_hamBand] = rxData.dspModeList.at(m_hamBand); +// +// foreach(AeroButton *btn, dspModeBtnList) { +// +// btn->setBtnState(AeroButton::OFF); +// btn->update(); +// } +// qDebug() << "*********************** RadioWidget: DSPmode changed by changed receiver!"; +// AeroButton *button = dspModeBtnList.at(mode); +// button->setBtnState(AeroButton::ON); +// button->update(); +// +// filterGroupChanged(mode); +// filterChanged(this, m_currentRx, m_filterLo, m_filterHi); +// } + +// if (m_agcMode != rxData.agcMode) { +// m_agcMode = rxData.agcMode; +// } + + if (m_filterLo != rxData.filterLo || m_filterHi != rxData.filterHi) { + + m_filterLo = rxData.filterLo; + m_filterHi = rxData.filterHi; + filterChanged(this, m_currentRx, m_filterLo, m_filterHi); + } +} + +// ********************** + +void RadioWidget::systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state +) { + Q_UNUSED(sender) + Q_UNUSED(err) + Q_UNUSED(hwmode) + Q_UNUSED(mode) + Q_UNUSED(state) + + +} + +void RadioWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void RadioWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + + diff --git a/Source/src/cusdr_radioWidget.h b/Source/src/cusdr_radioWidget.h new file mode 100644 index 0000000..5d30008 --- /dev/null +++ b/Source/src/cusdr_radioWidget.h @@ -0,0 +1,209 @@ +/** +* @file cusdr_radioWidget.h +* @brief Radio control widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2011-02-10 +*/ + +/* + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_RADIO_WIDGET_H +#define _CUSDR_RADIO_WIDGET_H + +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + + +class RadioWidget : public QWidget { + + Q_OBJECT + +public: + RadioWidget(QWidget *parent = 0); + ~RadioWidget(); + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + +private: + Settings *set; + + QGroupBox *bandGroupBox; + QGroupBox *modeGroupBox; + QGroupBox *filterGroupABox; + QGroupBox *filterGroupBBox; + QGroupBox *filterGroupCBox; + QGroupBox *mercuryBtnGroup(); + + QList filterBtnListA; + QList filterBtnListB; + QList filterBtnListC; + + AeroButton *band2200mBtn; + AeroButton *band630mBtn; + AeroButton *band160mBtn; + AeroButton *band80mBtn; + AeroButton *band60mBtn; + AeroButton *band40mBtn; + AeroButton *band30mBtn; + AeroButton *band20mBtn; + AeroButton *band17mBtn; + AeroButton *band15mBtn; + AeroButton *band12mBtn; + AeroButton *band10mBtn; + AeroButton *band6mBtn; + AeroButton *bandGenBtn; + //AeroButton *bandxxBtn; + + QList bandBtnList; + QList dspModeBtnList; + + AeroButton *lsbBtn; + AeroButton *usbBtn; + AeroButton *dsbBtn; + AeroButton *cwlBtn; + AeroButton *cwuBtn; + AeroButton *fmnBtn; + AeroButton *amBtn; + AeroButton *diguBtn; + AeroButton *specBtn; + AeroButton *diglBtn; + AeroButton *samBtn; + AeroButton *drmBtn; + + AeroButton *filter1kBtnA; + AeroButton *filter1k8BtnA; + AeroButton *filter2k1BtnA; + AeroButton *filter2k4BtnA; + AeroButton *filter2k7BtnA; + AeroButton *filter2k9BtnA; + AeroButton *filter3k3BtnA; + AeroButton *filter3k8BtnA; + AeroButton *filter4k4BtnA; + AeroButton *filter5kBtnA; + AeroButton *filterVar1BtnA; + AeroButton *filterVar2BtnA; + + AeroButton *filter2k4BtnB; + AeroButton *filter2k9BtnB; + AeroButton *filter3k1BtnB; + AeroButton *filter4kBtnB; + AeroButton *filter5k2BtnB; + AeroButton *filter6k6BtnB; + AeroButton *filter8kBtnB; + AeroButton *filter10kBtnB; + AeroButton *filter12kBtnB; + AeroButton *filter16kBtnB; + AeroButton *filterVar1BtnB; + AeroButton *filterVar2BtnB; + + AeroButton *filter25BtnC; + AeroButton *filter50BtnC; + AeroButton *filter100BtnC; + AeroButton *filter250BtnC; + AeroButton *filter400BtnC; + AeroButton *filter500BtnC; + AeroButton *filter600BtnC; + AeroButton *filter750BtnC; + AeroButton *filter800BtnC; + AeroButton *filter1kBtnC; + AeroButton *filterVar1BtnC; + AeroButton *filterVar2BtnC; + + AeroButton *attenuatorBtn; + AeroButton *ditherBtn; + AeroButton *randomBtn; + + QIcon agc_left; + QIcon agc_right; + + QList m_receiverDataList; + QList m_dspModeList; + HamBand m_hamBand; + //DSPMode m_dspMode; + AGCMode m_agcMode; + TDefaultFilterMode m_filterMode; + + //QList m_lastFrequencyList; + QList m_lastCtrFrequencyList; + QList m_lastVfoFrequencyList; + + long m_ctrFrequency; + long m_vfoFrequency; + + qreal m_filterLo; + qreal m_filterHi; + + int m_currentRx; + int current_band; + int current_dsp_mode; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + +private slots: + void createBandBtnGroup(); + void createModeBtnGroup(); + void createFilterBtnGroupA(); + void createFilterBtnGroupB(); + void createFilterBtnGroupC(); + + QLabel *createLabel(const QString &text); + + void setCurrentReceiver(QObject *sender, int value); + void ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + void vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + void bandChangedByBtn(); + void bandChanged(QObject *sender, int rx, bool byButton, HamBand band); + void dspModeChangedByBtn(); + void dspModeChanged(QObject *sender, int rx, DSPMode mode); + void filterChangedByBtn(); + void filterChanged(QObject *sender, int rx, qreal low, qreal high); + void filterGroupChanged(DSPMode mode); + + void attenuatorChanged(); + void setMercuryAttenuator(QObject *sender, HamBand band, int value); + void ditherChanged(); + void randomChanged(); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void newMessage(QString msg); +}; + +#endif // _CUSDR_RADIO_WIDGET_H diff --git a/Source/src/cusdr_receiverWidget.cpp b/Source/src/cusdr_receiverWidget.cpp new file mode 100644 index 0000000..f8ca464 --- /dev/null +++ b/Source/src/cusdr_receiverWidget.cpp @@ -0,0 +1,125 @@ +/** +* @file cusdr_receiverWidget.cpp +* @brief receiver widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-22 +*/ + +/* + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#include +//#include +#include + +#include "cusdr_receiverWidget.h" +#include "cusdr_settings.h" + +#define btn_height 15 +#define btn_width 60 +#define btn_widths 40 + + +ReceiverWidget::ReceiverWidget() + : QWidget() +{ + setObjectName("ReceiverWidget"); + + setMouseTracking(true); + //mouse_over = false; + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(1); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + //mainLayout->addWidget(dspBtnGroup()); + //mainLayout->addSpacing(5); + //mainLayout->addWidget(fftwExtGroup()); + mainLayout->addStretch(); + + setLayout(mainLayout); + + setContentsMargins(5, 5, 5, 5); +} + +ReceiverWidget::~ReceiverWidget() { + + disconnect(Settings::instance(), 0, this, 0); + disconnect(this, 0, 0, 0); +} + + + +// ********************** + +void ReceiverWidget::closeEvent(QCloseEvent *event) { + + //settings::instance()->serverFormRect = QRect(pos(), size()); + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void ReceiverWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +//*************************************************** + +MiniReceiverWidget::MiniReceiverWidget() + : QWidget() +{ + setObjectName("MiniReceiverWidget"); + + setMouseTracking(true); + //mouse_over = false; + + QFont titleFont; + titleFont.setStyleStrategy(QFont::PreferQuality); + titleFont.setPointSizeF(8); + titleFont.setFamily("Arial"); + + setContentsMargins(5, 5, 5, 5); +} + +MiniReceiverWidget::~MiniReceiverWidget() { + + disconnect(Settings::instance(), 0, this, 0); + disconnect(this, 0, 0, 0); +} + + + +// ********************** + +void MiniReceiverWidget::closeEvent(QCloseEvent *event) { + + //settings::instance()->serverFormRect = QRect(pos(), size()); + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void MiniReceiverWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} diff --git a/Source/src/cusdr_receiverWidget.h b/Source/src/cusdr_receiverWidget.h new file mode 100644 index 0000000..87309d5 --- /dev/null +++ b/Source/src/cusdr_receiverWidget.h @@ -0,0 +1,98 @@ +/** +* @file cusdr_receiverWidget.h +* @brief receiver widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-22 +*/ + +/* + * Copyright 2010, 2011 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_RECEIVER_WIDGET_H +#define CUSDR_RECEIVER_WIDGET_H + +//#include +//#include +//#include + +#include "cusdr_settings.h" +#include "Util/cusdr_buttons.h" + +class MiniReceiverWidget; + + +class ReceiverWidget : public QWidget { + + Q_OBJECT + +public: + ReceiverWidget(); + ~ReceiverWidget(); + +public slots: + //void dspServerChanged(); + //void setClientConnected(QObject *sender, bool value); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + +private: + QList miniRxList; + MiniReceiverWidget *miniRx; + + //QGroupBox *dspBtnGroup(); + //QGroupBox *fftwIntGroup(); + //QGroupBox *fftwExtGroup(); + + //QHButton *cudaBtn; + //QHButton *fftwIntBtn; + //QHButton *fftwExtBtn; + //QHButton *launchDSPBtn; + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); +}; + + +class MiniReceiverWidget : public QWidget { + + Q_OBJECT + +public: + MiniReceiverWidget(); + ~MiniReceiverWidget(); + +public slots: + //void dspServerChanged(); + //void setClientConnected(QObject *sender, bool value); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + +private: + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); +}; + +#endif // CUSDR_RECEIVER_WIDGET_H diff --git a/Source/src/cusdr_server.cpp b/Source/src/cusdr_server.cpp new file mode 100644 index 0000000..d1945ec --- /dev/null +++ b/Source/src/cusdr_server.cpp @@ -0,0 +1,495 @@ +/** +* @file cusdr_server.cpp +* @brief Server implementation class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-10-28 +*/ + +/* + * Copyright (C) John Melton, G0ORX/N6LYT and Dave McMcQuate, WA8YWQ + * + * Copyright 2010 adaptation for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +//#define LOG_SERVER + +#include "cusdr_server.h" +#include "cusdr_settings.h" + + + +HPSDRServer::HPSDRServer(QObject *parent) + : QTcpServer(parent) + , set(Settings::instance()) + , m_hwInterface(set->getHWInterface()) + , m_serverMode(set->getCurrentServerMode()) + , m_dataEngineState(QSDR::DataEngineDown) +{ + setupConnections(); + + for (int i = 0; i < MAX_RECEIVERS; i++) + m_receivers[i] = -1; + + m_separators = " ,\r\n"; +} + +HPSDRServer::~HPSDRServer() { + + serverStop(); + m_rxList.clear(); + //m_ipList.clear(); + //m_niList.clear(); + qDeleteAll(m_clientConnections); +} + +void HPSDRServer::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(masterSwitchChanged(QObject *, bool)), + this, + SLOT(masterSwitchChanged(QObject *, bool))); + + CHECKED_CONNECT( + set, + SIGNAL(systemStateChanged( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState)), + this, + SLOT(setSystemState( + QObject *, + QSDR::_Error, + QSDR::_HWInterfaceMode, + QSDR::_ServerMode, + QSDR::_DataEngineState))); + + CHECKED_CONNECT( + set, + SIGNAL(rxListChanged(QList)), + this, + SLOT(rxListChanged(QList))); + + CHECKED_CONNECT( + this, + SIGNAL(clientDisconnectedEvent(int)), + set, + SLOT(clientDisconnected(int))); + + CHECKED_CONNECT( + this, + SIGNAL(newConnection()), + this, + SLOT(handleNewConnection())); +} + +void HPSDRServer::setSystemState( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + Q_UNUSED (err) + + if (m_hwInterface != hwmode) m_hwInterface = hwmode; + + if (m_serverMode != mode) m_serverMode = mode; + + if (m_dataEngineState == state) return; + m_dataEngineState = state; +} + +bool HPSDRServer::startServer() { + + // listen for new connections + if (!listen(QHostAddress::Any, set->getListenPort())) { + + m_message = tr("[server]: unable to start the listening service: '%1'."); + emit messageEvent(m_message.arg(errorString())); + + return false; + } + + m_message = tr("[server]: is running on '%1:%2'."); + emit messageEvent(m_message.arg(set->getServerAddr()).arg(serverPort())); + + return true; +} + +void HPSDRServer::stopServer() { + + if (isListening()) { // was the listener started? + + // shut down output_thread(s) + emit messageEvent("[server]: shutting down the server..."); + + // clear TCP/IP connections list + foreach(QTcpSocket *socket, m_clientConnections) { + + socket->close(); + } + m_clientConnections.clear(); + SERVER_DEBUG << "masterSwitchChanged TCP client socket(s) closed."; + + // shutdown TCP/IP command server + serverStop(); + SERVER_DEBUG <<"masterSwitchChanged TCP server closed."; + } +} + +void HPSDRServer::rxListChanged(QList rxList) { + + QMutexLocker locker(&m_serverMutex); + m_rxList = rxList; + locker.unlock(); +} + +void HPSDRServer::masterSwitchChanged(QObject *sender, bool power) { + + Q_UNUSED(sender) + Q_UNUSED(power) +} + +void HPSDRServer::serverStop() { + + //disconnect(this, 0, 0, 0); + close(); +} + +void HPSDRServer::handleNewConnection() { + + while (hasPendingConnections()) { + + QTcpSocket *socket = nextPendingConnection(); + + CHECKED_CONNECT( + socket, + SIGNAL(disconnected()), + this, + SLOT(clientDisconnected())); + + CHECKED_CONNECT( + socket, + SIGNAL(readyRead()), + this, + SLOT(readCommand())); + + QString message = tr("[server]: client connected from %1 on port %2."); + emit messageEvent(message.arg(socket->peerAddress().toString()).arg(socket->peerPort())); + + m_clientConnections.append(socket); + } +} + +void HPSDRServer::clientDisconnected() { + + QTcpSocket *socket = qobject_cast(sender()); + + if (!socket) return; + + int client = m_clientConnections.indexOf(socket); + + m_clientConnections.removeAll(socket); + socket->deleteLater(); + + detachReceiver(client, client); + + m_message = tr("[server]: client %1 disconnected."); + emit messageEvent(m_message.arg(client)); + + emit clientDisconnectedEvent(client); +} + +void HPSDRServer::sendMessageToAllClients() { + + m_message = QString("This is the cudaSDR server!"); + + foreach(QTcpSocket *client, m_clientConnections) { + + client->write(m_message.toLatin1()); + } +} + +void HPSDRServer::readCommand() { + + QTcpSocket *socket = qobject_cast(sender()); + + m_bytesRead = socket->read(command, sizeof(command)); + + command[m_bytesRead] = 0; + + int client = m_clientConnections.indexOf(socket); + + response = parseCommand(command, client); + socket->write(response); + + //QString message = tr("[server]: response(rx %1): '%2'."); + //emit messageEvent(message.arg(receivers[client]).arg(response)); +} + +char *HPSDRServer::attachReceiver(int rx, int client) { + + if (m_rxList[rx]->property("socketState") == Receiver::RECEIVER_ATTACHED) + return CLIENT_ATTACHED; + + if (rx >= m_rxList.size()) + return RECEIVER_INVALID; + + if (m_rxList[rx]->getConnectedStatus()) + return RECEIVER_IN_USE; + + m_rxList[rx]->setProperty("socketState", "RECEIVER_ATTACHED"); + m_rxList[rx]->setReceiver(rx); + m_rxList[rx]->setClient(client); + m_rxList[rx]->setPeerAddress(m_clientConnections[client]->peerAddress()); + + m_rxList[rx]->setIQPort(-1); + set->setIQPort(this, rx, -1); + + SERVER_DEBUG << "attachReceiver client" + << m_rxList[rx]->getClient() + << "connected to receiver" + << m_rxList[rx]->getReceiver(); + + m_receivers[client] = rx; + + set->setClientConnected(this, true); + set->setClientNoConnected(this, client); + + static char resp[80]; + //sprintf_s(resp, "%s %d", "OK", set->getSampleRate()); + + set->setRxList(m_rxList); + + return resp; +} + +char *HPSDRServer::detachReceiver(int rx, int client) { + + //if (m_rxList[rx]->property("socketState") == HPSDRReceiver::RECEIVER_ATTACHED) + // return CLIENT_DETACHED; + + if (rx >= set->getNumberOfReceivers()) + return RECEIVER_INVALID; + + //if (m_rxList[rx]->client != (HPSDRClient *) NULL) + // return RECEIVER_NOT_OWNER; + + m_serverMutex.lock(); + m_rxList[rx]->setProperty("socketState", "RECEIVER_DETACHED"); + m_rxList[rx]->setConnectedStatus(false); + m_serverMutex.unlock(); + + SleeperThread::msleep(200); + + set->setRcveIQ(0); + set->setSendIQ(0); + + m_receivers[client] = -1; + + set->setRxList(m_rxList); + + return OK; +} + +char *HPSDRServer::setFrequency(long frequency, int rx) { + + if (m_rxList[rx]->property("socketState") == Receiver::RECEIVER_DETACHED) + return CLIENT_DETACHED; + + if (m_rxList[rx]->getReceiver() < 0) + return RECEIVER_INVALID; + + //emit frequencyChangedEvent(true, rx, frequency); + + set->setFrequency(this, true, rx, frequency); + + return OK; +} + +char *HPSDRServer::parseCommand(char *command, int client) { + + m_message = tr("[client %1]: command '%2'."); + + //token = strtok_s(command, seps, &next_token); + + if (token != NULL) { + + if (strcmp(token, "attach") == 0) { + + // select receiver + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + //int rx = atoi(token); + emit messageEvent(m_message.arg(client).arg(command)); + return attachReceiver(atoi(token), client); + } + else + return INVALID_COMMAND; + + } else if (strcmp(token, "detach") == 0) { + + // select receiver + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + //int rx = atoi(token); + emit messageEvent(m_message.arg(client).arg(command)); + return detachReceiver(atoi(token), client); + + } + else + return INVALID_COMMAND; + + } else if (strcmp(token, "frequency") == 0) { + + // set frequency + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + //long f = atol(token); + return setFrequency(atol(token), m_receivers[client]); + } + else + return INVALID_COMMAND; + + } else if (strcmp(token, "start") == 0) { + + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + if (strcmp(token, "iq") == 0) { + + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + emit setIQPortEvent(m_receivers[client], atoi(token)); + //emit setConnectedStatusEvent(receivers[client], true); + set->setRxConnectedStatus(this, m_receivers[client], true); + + // Remember the last receiver started, so that one will send demodulated data back to Mercury. + audioReceiver = m_receivers[client]; + + //emit newClientEvent(receivers[client]); + set->setClientNoConnected(this, m_receivers[client]); + //emit audioReceiverEvent(audioReceiver); + set->setAudioRx(this, audioReceiver); + + return OK; + } + else + return INVALID_COMMAND; + + } else if (strcmp(token, "bandscope") == 0) { + + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + m_rxList[client]->setBSPort(atoi(token)); + emit messageEvent(m_message.arg(client).arg(command)); + set->setRxList(m_rxList); + return OK; + + } else { + // invalid command string + return INVALID_COMMAND; + } + } + else + return INVALID_COMMAND; + } + else + return INVALID_COMMAND; + + } else if (strcmp(token, "stop" ) == 0) { + + //token = strtok_s(NULL, seps, &next_token); + + if (token != NULL) { + + if (strcmp(token, "iq") == 0) { + + m_rxList[client]->setIQPort(-1); + set->setRxList(m_rxList); + return OK; + + } else if (strcmp(token, "bandscope") == 0) { + + m_rxList[client]->setBSPort(-1); + set->setRxList(m_rxList); + return OK; + + } + else + return INVALID_COMMAND; + } + else + return INVALID_COMMAND; + + } + else if (strcmp(token, "selectAudio") == 0) { + + // change selection of which receiver's audio goes to Mercury headphone output + //token = strtok_s(NULL, seps, &next_token); + if (token != NULL) { + + selectAudio = atoi(token); + if ( (selectAudio >= 0) + && (selectAudio < set->getNumberOfReceivers()) + && (m_rxList[selectAudio]->getConnectedStatus()) + ) { + //m_dataEngine->AudioReceiverChanged(selectAudio); + emit messageEvent(m_message.arg(client).arg(command)); + //emit audioReceiverEvent(selectAudio); + set->setAudioRx(this, selectAudio); + return OK; + + } + else + return RECEIVER_INVALID; + } + else + return RECEIVER_INVALID; + + } + else + return INVALID_COMMAND; + + } + else + return INVALID_COMMAND; + + return INVALID_COMMAND; +} + +void HPSDRServer::newMessage(QString message) { + + emit messageEvent(message); +} diff --git a/Source/src/cusdr_server.h b/Source/src/cusdr_server.h new file mode 100644 index 0000000..d074f4c --- /dev/null +++ b/Source/src/cusdr_server.h @@ -0,0 +1,134 @@ +/** +* @file cusdr_server.h +* @brief Server implementation header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-10-28 +*/ + +/* + * Copyright (C) John Melton, G0ORX/N6LYT and Dave McMcQuate, WA8YWQ + * + * Copyright 2010 adaptation for cuSDR by Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef CUSDR_SERVER_H +#define CUSDR_SERVER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cusdr_receiver.h" + + +#ifdef LOG_SERVER +# define SERVER_DEBUG qDebug().nospace() << "Server::\t" +#else +# define SERVER_DEBUG nullDebug() +#endif + + +class HPSDRServer : public QTcpServer { + + Q_OBJECT + +public: + explicit HPSDRServer(QObject *parent = 0); + ~HPSDRServer(); + + +public slots: + bool startServer(); + void stopServer(); + void serverStop(); + + int getAudioReceiver() { return audioReceiver; } + +private: + Settings* set; + + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QList m_rxList; + QList m_clientConnections; + + int m_receivers[MAX_RECEIVERS]; + + QMutex m_serverMutex; + + QString m_message; + QString m_separators; + + qint64 m_bytesRead; + + char command[80]; + //char* seps; + char* token; + char* next_token; + char* response; + + int socketDescriptor; + int audioReceiver; + int selectAudio; + +private slots: + void setSystemState( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void masterSwitchChanged(QObject *sender, bool power); + void rxListChanged(QList rxList); + void setupConnections(); + void handleNewConnection(); + void clientDisconnected(); + void newMessage(QString message); + void sendMessageToAllClients(); + void readCommand(); + + char* attachReceiver(int rx, int client); + char* detachReceiver(int rx, int client); + char* parseCommand(char *command, int client); + char* setFrequency(long frequency, int client); + +signals: + void masterSwitchEvent(); + void messageEvent(QString message); + + void setIQPortEvent(int rx, int port); + void socketErrorEvent(int socketErrorCode, QString socketErrorString, QString addr, quint16 port); + void setPeerAddressEvent(int rx, QHostAddress address); + void clientConnectedEvent(int rx); + void clientDisconnectedEvent(int client); + void frequencyChangedEvent(bool value, int rx, long frequency); + void newClientEvent(int rx); + void audioReceiverEvent(int rx); +}; + + +#endif // CUSDR_SERVER_H diff --git a/Source/src/cusdr_serverWidget.cpp b/Source/src/cusdr_serverWidget.cpp new file mode 100644 index 0000000..bc2bcce --- /dev/null +++ b/Source/src/cusdr_serverWidget.cpp @@ -0,0 +1,334 @@ +/** +* @file cusdr_serverWidget.cpp +* @brief hpsdr server settings widget +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#define LOG_SERVER_WIDGET + +//#include +//#include +//#include +#include +#include +#include + +#include "cusdr_serverWidget.h" + +#define btn_height 15 +#define btn_width 80 +#define btn_width2 52 + +ServerWidget::ServerWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_serverMode(Settings::instance()->getCurrentServerMode()) + , m_minimumWidgetWidth(Settings::instance()->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(Settings::instance()->getMinimumGroupBoxWidth()) + , m_btnSpacing(5) +{ + //setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 0, 4, 0); + setMouseTracking(true); + + createServerNIGroup(); + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(0); + hbox1->setMargin(0); + hbox1->addStretch(); + hbox1->addWidget(serverNIGroupBox); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(0); + hbox2->setMargin(0); + hbox2->addStretch(); + hbox2->addWidget(portAddressesGroup()); + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addStretch(); + + setLayout(mainLayout); + + setupConnections(); + setPorts(); +} + +ServerWidget::~ServerWidget() { + + // disconnect all signals + disconnect(Settings::instance(), 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize ServerWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize ServerWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void ServerWidget::setupConnections() { + + CHECKED_CONNECT( + set, + SIGNAL(newServerNetworkInterface(QString, QString)), + this, + SLOT(addServerNIEntry(QString, QString))); + + CHECKED_CONNECT( + set, + SIGNAL(serverNICChanged(int)), + this, + SLOT(setServerNIC(int))); +} + +void ServerWidget::addNICChangedConnection() { + + CHECKED_CONNECT( + serverNetworkInterfaces, + SIGNAL(currentIndexChanged(int)), + set, + SLOT(setServerNetworkInterface(int))); +} + +void ServerWidget::createServerNIGroup() { + + serverNetworkInterfaces = new QComboBox(); + + serverNetworkInterfaces->setStyleSheet(Settings::instance()->getComboBoxStyle()); + serverNetworkInterfaces->setMinimumContentsLength(22); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(1); + hbox1->addWidget(serverNetworkInterfaces); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(5); + vbox->addSpacing(5); + vbox->addLayout(hbox1); + vbox->addSpacing(5); + //vbox->addLayout(hbox2); + + serverNIGroupBox = new QGroupBox(tr("Server network interface")); + serverNIGroupBox->setMinimumWidth(m_minimumGroupBoxWidth); + serverNIGroupBox->setLayout(vbox); + serverNIGroupBox->setStyleSheet(Settings::instance()->getWidgetStyle()); + serverNIGroupBox->setFont(QFont("Arial", 8)); +} + +void ServerWidget::addServerNIEntry(QString niName, QString ipAddress) { + + //QString item = niName; + QString item = ipAddress; + //item.append(" ("); + //item.append(ipAddress); + //item.append(")"); + serverNetworkInterfaces->addItem(item); +} + +QGroupBox *ServerWidget::portAddressesGroup() { + + portGridBox = new QGridLayout; + portGridBox->setVerticalSpacing(3); + //portGridBox->setHorizontalSpacing(43); + + labelServerPortLabel = new QLabel("Command Server Port:"); + labelServerPortLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + labelServerPortLabel->setStyleSheet(Settings::instance()->getLabelStyle()); + portGridBox->addWidget(labelServerPortLabel, 0, 0); + + labelServerPortText = new QLabel(""); + labelServerPortText->setFrameStyle(QFrame::Box | QFrame::Raised); + labelServerPortText->setStyleSheet(Settings::instance()->getLabelStyle()); + portGridBox->addWidget(labelServerPortText, 0, 1); + + labelListenerPortLabel = new QLabel("Listener Port:"); + labelListenerPortLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + labelListenerPortLabel->setStyleSheet(Settings::instance()->getLabelStyle()); + portGridBox->addWidget(labelListenerPortLabel, 1, 0); + + labelListenerPortText = new QLabel(""); + labelListenerPortText->setFrameStyle(QFrame::Box | QFrame::Raised); + labelListenerPortText->setStyleSheet(Settings::instance()->getLabelStyle()); + portGridBox->addWidget(labelListenerPortText, 1, 1); + + labelAudioPortLabel = new QLabel("Audio Port:"); + labelAudioPortLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + labelAudioPortLabel->setStyleSheet(Settings::instance()->getLabelStyle()); + portGridBox->addWidget(labelAudioPortLabel, 2, 0); + + labelAudioPortText = new QLabel(""); + labelAudioPortText->setFrameStyle(QFrame::Box | QFrame::Raised); + labelAudioPortText->setStyleSheet(Settings::instance()->getLabelStyle()); + portGridBox->addWidget(labelAudioPortText, 2, 1); + + /*le_server_port = new QLineEdit(QString::number(Settings::instance()->serverPort()), this); + le_server_port->setFont(font()); + le_server_port->setFixedSize(50, QFontMetrics(le_server_port->font()).height() + 4); + le_server_port->setInputMask("00000;"); + le_server_port->setMaxLength(7); + le_server_port->setStyleSheet(lineedit_style);*/ + + /*QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(1); + hbox1->addWidget(le_server_port); + hbox1->addStretch();*/ + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(portGridBox); + + QGroupBox *groupBox = new QGroupBox(tr("Port Addresses")); + groupBox->setMinimumWidth(m_minimumGroupBoxWidth); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(Settings::instance()->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +QGroupBox *ServerWidget::serverPortAddressGroup() { + + le_server_port = new QLineEdit(QString::number(Settings::instance()->getServerPort()), this); + le_server_port->setFont(font()); + le_server_port->setFixedSize(50, QFontMetrics(le_server_port->font()).height() + 4); + le_server_port->setInputMask("00000;"); + le_server_port->setMaxLength(7); + le_server_port->setStyleSheet(lineedit_style); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(1); + hbox1->addWidget(le_server_port); + hbox1->addStretch(); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + QGroupBox *groupBox = new QGroupBox(tr("Command Server port")); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(Settings::instance()->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +QGroupBox *ServerWidget::listenerPortAddressGroup() { + + le_listener_port = new QLineEdit(QString::number(Settings::instance()->getListenPort()), this); + le_listener_port->setFont(font()); + le_listener_port->setFixedSize(50, le_server_port->height()); + le_listener_port->setInputMask("00000;"); + le_listener_port->setMaxLength(7); + le_listener_port->setStyleSheet(lineedit_style); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(1); + hbox1->addWidget(le_listener_port); + hbox1->addStretch(); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + QGroupBox *groupBox = new QGroupBox(tr("Listener port")); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(Settings::instance()->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + +QGroupBox *ServerWidget::audioPortAddressGroup() { + + le_audio_port = new QLineEdit(QString::number(Settings::instance()->getAudioPort()), this); + le_audio_port->setFont(font()); + le_audio_port->setFixedSize(50, le_server_port->height()); + le_audio_port->setInputMask("00000;"); + le_audio_port->setMaxLength(7); + le_audio_port->setStyleSheet(lineedit_style); + + QHBoxLayout *hbox1 = new QHBoxLayout; + hbox1->setSpacing(1); + hbox1->addWidget(le_audio_port); + hbox1->addStretch(); + + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(1); + vbox->addLayout(hbox1); + + QGroupBox *groupBox = new QGroupBox(tr("Audio port")); + groupBox->setLayout(vbox); + groupBox->setStyleSheet(Settings::instance()->getWidgetStyle()); + groupBox->setFont(QFont("Arial", 8)); + + return groupBox; +} + + + +// *************************************************************** + +void ServerWidget::setServerNIC(int index) { + + serverNetworkInterfaces->setCurrentIndex(index); +} + +void ServerWidget::setPorts() { + + labelServerPortText->setText(QString::number(Settings::instance()->getServerPort())); + labelListenerPortText->setText(QString::number(Settings::instance()->getListenPort())); + labelAudioPortText->setText(QString::number(Settings::instance()->getAudioPort())); +} + +void ServerWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void ServerWidget::showEvent(QShowEvent *event) { + + //emit showEvent(this); + + QWidget::showEvent(event); +} + +void ServerWidget::portChanged(const QString &text) { + + bool ok = false; + int port = text.toInt(&ok); + if (!ok || port < 0 || port >= 65536) return; + //Settings::instance()->setServerPort(port_le, port); +} + diff --git a/Source/src/cusdr_serverWidget.h b/Source/src/cusdr_serverWidget.h new file mode 100644 index 0000000..e587572 --- /dev/null +++ b/Source/src/cusdr_serverWidget.h @@ -0,0 +1,118 @@ +/** +* @file cusdr_serverWidget.h +* @brief header file for hpsdr server settings widget +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-21 +*/ + +/* + * + * Copyright 2010 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_SERVER_WIDGET_H +#define _CUSDR_SERVER_WIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + +#ifdef LOG_SERVER_WIDGET +# define SERVER_WIDGET_DEBUG qDebug().nospace() << "ServerWidget::\t" +#else +# define SERVER_WIDGET_DEBUG nullDebug() +#endif + + +class ServerWidget : public QWidget { + + Q_OBJECT + +public: + ServerWidget(QWidget *parent = 0); + ~ServerWidget(); + + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + void addServerNIEntry(QString niName, QString ipAddress); + void addNICChangedConnection(); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + +private: + Settings *set; + + QStringList niList; + QTableWidget *serverNITable; + + QGroupBox *portAddressesGroup(); + QGroupBox *serverPortAddressGroup(); + QGroupBox *listenerPortAddressGroup(); + QGroupBox *audioPortAddressGroup(); + QGroupBox *serverNIGroupBox; + + QGridLayout *portGridBox; + QComboBox *serverNetworkInterfaces; + + QLabel *labelServerPortLabel; + QLabel *labelServerPortText; + QLabel *labelListenerPortLabel; + QLabel *labelListenerPortText; + QLabel *labelAudioPortLabel; + QLabel *labelAudioPortText; + + QLineEdit *le_server_address; + QLineEdit *le_server_port; + QLineEdit *le_listener_port; + QLineEdit *le_audio_port; + + QString lineedit_style; + + QSDR::_ServerMode m_serverMode; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + int m_btnSpacing; + + void createServerNIGroup(); + +private slots: + void setPorts(); + void setupConnections(); + void portChanged(const QString &text); + void setServerNIC(int index); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString ); +}; + +#endif // _CUSDR_SERVER_WIDGET_H diff --git a/Source/src/cusdr_settings.cpp b/Source/src/cusdr_settings.cpp new file mode 100644 index 0000000..2180c0c --- /dev/null +++ b/Source/src/cusdr_settings.cpp @@ -0,0 +1,4627 @@ +/** +* @file cusdr_settings.cpp +* @brief settings class for cuSDR +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-18 +*/ + +/* + * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + + +#define LOG_SETTINGS + +#include "cusdr_settings.h" +#include "Util/cusdr_styles.h" + +Settings *Settings::m_instance = NULL; /*!< set m_instance to NULL. */ + +/*! + \class Settings + \brief Settings class implements application specific and user defined variables for the application. +*/ + +Settings::Settings(QObject *parent) + :QObject(parent) + , m_dataEngineState(QSDR::DataEngineDown) + , setLoaded(false) + , m_mainPower(false) + , m_manualSocketBufferSize(false) + , m_peakHold(false) + , m_packetsToggle(true) + , m_radioPopupVisible(false) + , m_hpsdrNetworkDevices(0) + , m_mercuryReceivers(1) + , m_currentReceiver(0) +{ + m_devices.mercuryFWVersion = 0; + + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType >(); + qRegisterMetaType("qVectorFloat"); + + startTime = QDateTime::currentDateTime(); + + qDebug() << "************************************************************************"; + SETTINGS_DEBUG << "start at: " << qPrintable(startTime.toString()); + + settingsFilename = "settings.ini"; + settings = new QSettings(QCoreApplication::applicationDirPath() + "/" + settingsFilename, QSettings::IniFormat); + + m_titleString = "cudaSDR BETA "; + + #ifdef DEBUG + m_titleString = "cudaSDR Debug BETA "; + #endif + + m_versionString = "v0.3.2.13"; + + qDebug() << qPrintable(m_titleString); + + // receiver data + for (int i = 0; i < MAX_RECEIVERS; i++) { + + TReceiver receiverData; + m_receiverDataList.append(receiverData); + + QString str = "receiver"; + QString num; + num.setNum(i); + str.append(num); + + m_rxStringList << str; + + m_receiverDataList[i].agcHangThreshold = 0.0; + m_receiverDataList[i].peakHold = false; + + for (int j = 0; j < MAX_BANDS; j++) { + + m_receiverDataList[i].mercuryAttenuators << 0; + m_receiverDataList[i].dBmPanScaleMinList << 0.0; + m_receiverDataList[i].dBmPanScaleMaxList << 0.0; + m_receiverDataList[i].dspModeList << (DSPMode) LSB; + } + } + + // Alex parameter configurations + m_alexConfig = 0; + + for (int i = 0; i < 6; i++) { + + m_HPFLoFrequencyList.append((long)0); + m_HPFHiFrequencyList.append((long)0); + } + + for (int i = 0; i < 7; i++) { + + m_LPFLoFrequencyList.append((long)0); + m_LPFHiFrequencyList.append((long)0); + } + + // init alex states + for (int i = 0; i < MAX_BANDS; i++) { + + m_alexStates << 0; + } + + // Rx, Tx J6 pins list + // Bands: 160m, 80m, 60m, 40m, 30m, 20m, 17m, 15m, 12m, 10m, 6m + // Values: no pin, pins 1 to 7 (0..7) + // + // 0 0 0 0 0 0 0 0 + // | | | | | | | + // | | | | | | | + // | | | | | | +-------------- pin 1 (0 = deactivated, 1 = activated) + // | | | | | +---------------- pin 2 (0 = deactivated, 1 = activated) + // | | | | +------------------ pin 3 (0 = deactivated, 1 = activated) + // | | | +-------------------- pin 4 (0 = deactivated, 1 = activated) + // | | +---------------------- pin 5 (0 = deactivated, 1 = activated) + // | +------------------------ pin 6 (0 = deactivated, 1 = activated) + // +-------------------------- pin 7 (0 = deactivated, 1 = activated) + + for (int i = 0; i < MAX_BANDS-1; i++) { + + m_rxJ6pinList << 0; + m_txJ6pinList << 0; + } + + + m_bandList = getHamBandFrequencies(); + m_bandTextList = getHamBandText(); + m_defaultFilterList = getDefaultFilterFrequencies(); + + m_transmitter.txAllowed = false; + m_fft = 1; +} + +Settings::~Settings() { + + //m_clDevices.clear(); +} + +int Settings::loadSettings() { + + QString str; + int value; + + //QList bandList = HamBandStrings(); + + // user's call sign + str = settings->value("user/callSign", "Your Call sign").toString(); + //while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); + //while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); + + m_callsignString = str; + + // Window settings + value = settings->value("window/minimumWidgetWidth", 235).toInt(); + if (value < 235 || value > 300) m_minimumWidgetWidth = 235; + m_minimumWidgetWidth = value; + + value = settings->value("window/minimumGroupBoxWidth", 230).toInt(); + if (value < 230 || value > 295 || value > m_minimumWidgetWidth - 5) m_minimumGroupBoxWidth = 230; + m_minimumGroupBoxWidth = value; + + value = settings->value("window/multiRxView", 0).toInt(); + if (value < 0 || value > 2) m_multiRxView = 0; + m_multiRxView = value; + + + // network settings + str = settings->value("network/server_ipAddress", "127.0.0.1").toString(); + while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); + while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); + m_serverAddress = str; + + str = settings->value("network/hpsdr_local_ipAddress", "127.0.0.1").toString(); + while (str.startsWith('\"')) str = str.right(str.count() - 1).trimmed(); + while (str.endsWith('\"')) str = str.left(str.count() - 1).trimmed(); + m_hpsdrDeviceLocalAddr = str; + + value = settings->value("network/server_port", 52685).toInt(); + if (value < 0 || value > 65535) value = 52685; + m_serverPort = value; + + value = settings->value("network/listen_port", 11000).toInt(); + if (value < 0 || value > 65535) value = 11000; + m_listenerPort = value; + + value = settings->value("network/audio_port", 15000).toInt(); + if (value < 0 || value > 65535) value = 15000; + m_audioPort = value; + + value = settings->value("network/metis_port", 1024).toInt(); + if (value < 0 || value > 65535) value = 1024; + m_metisPort = value; + + value = settings->value("network/socketBufferSize", 32).toInt(); + if (value != 16 && value != 32 && value != 64 && value != 128 && value != 256) value = 32; + m_socketBufferSize = value; + + + // HPSDR hardware + value = settings->value("hpsdr/hardware", 0).toInt(); + if (value < 0 || value > 2) value = 0; + m_hpsdrHardware = value; + + str = settings->value("hpsdr/mercury", "true").toString(); + if (str == "true") + m_devices.mercuryPresence = true; + else + m_devices.mercuryPresence = false; + + str = settings->value("hpsdr/penelope", "false").toString(); + if (str == "true") + m_devices.penelopePresence = true; + else + m_devices.penelopePresence = false; + + str = settings->value("hpsdr/pennylane", "false").toString(); + if (str == "true") + m_devices.pennylanePresence = true; + else + m_devices.pennylanePresence = false; + + str = settings->value("hpsdr/excalibur", "false").toString(); + if (str == "true") + m_devices.excaliburPresence = true; + else + m_devices.excaliburPresence = false; + + str = settings->value("hpsdr/alex", "false").toString(); + if (str == "true") + m_devices.alexPresence = true; + else + m_devices.alexPresence = false; + + +// str = settings->value("hpsdr/hermes", "false").toString(); +// if (str == "true") +// m_devices.hermesPresence = true; +// else +// m_devices.hermesPresence = false; + + if (m_hpsdrHardware == 0) { + + str = settings->value("hpsdr/interface", "metis").toString(); + if (str == "metis") + m_hwInterface = QSDR::Metis; + else + m_hwInterface = QSDR::NoInterfaceMode; + } + else if (m_hpsdrHardware == 1) { + + m_hwInterface = QSDR::Hermes; + } + + str = settings->value("hpsdr/checkfw", "true").toString(); + if (str == "true") + m_checkFirmwareVersions = true; + else + m_checkFirmwareVersions = false; + + //checkHPSDRDevices(); + + value = settings->value("server/sample_rate", 48000).toInt(); + if ((value != 48000) & (value != 96000) & (value != 192000) & (value != 384000)) value = 48000; + setSampleRate(this, value); + + str = settings->value("server/dither", "off").toString(); + if (str.toLower() == "on") + m_mercuryDither = 1; + else + m_mercuryDither = 0; + + str = settings->value("server/random", "off").toString(); + if (str.toLower() == "on") + m_mercuryRandom = 1; + else + m_mercuryRandom = 0; + + str = settings->value("server/10mhzsource", "mercury").toString(); + if (str == "atlas") + m_10MHzSource = 0; + else if (str == "penelope") + m_10MHzSource = 1; + else if (str == "mercury") + m_10MHzSource = 2; + else if (str == "none") + m_10MHzSource = 3; + else + m_10MHzSource = 2; + + str = settings->value("server/122_88mhzsource", "mercury").toString(); + if (str == "penelope") + m_122_8MHzSource = 0; + else + m_122_8MHzSource = 1; + + str = settings->value("server/mic_source", "penelope").toString(); + if (str == "janus") + m_micSource = 0; + else + m_micSource = 1; + + str = settings->value("server/class", 0).toString(); + m_RxClass = (str.toLower() == "E"); + if (m_RxClass) + m_RxClass = 1; + else + m_RxClass = 0; + + value = settings->value("server/timing", 0).toInt(); + if (value < 0 || value > 1) value = 0; + m_RxTiming = value; + + /*value = settings->value("server/mainVolume", 10).toInt(); + if (value < 0) value = 0; + if (value > 100) value = 100; + m_mainVolume = value / 100.0f;*/ + + str = settings->value("server/mode", "sdr").toString(); + if (str == "sdr") { + + m_serverMode = QSDR::SDRMode; + setSpectrumSize(this, 4096); + } + else if (str == "chirpWSPR") { + + m_serverMode = QSDR::ChirpWSPR; + setSpectrumSize(this, 4096); + } + else if (str == "chirpWSPRFile") { + + m_serverMode = QSDR::ChirpWSPRFile; + setSpectrumSize(this, 4096); + } + else { + + m_serverMode = QSDR::SDRMode; + setSpectrumSize(this, 4096); + } + + +// value = settings->value("server/mouseWheelFreqStep", 1000).toInt(); +// if ((value != 1) & (value != 10) & (value != 100) & (value != 1000) & (value != 10000) & (value != 100000) & +// (value != 5) & (value != 50) & (value != 500) & (value != 5000) & (value != 50000) & (value != 500000)) +// value = 100; +// m_mouseWheelFreqStep = (double)value; + + //****************************************************************** + // Alexiares data settings + // m_alexConfig (qint16): + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + + m_alexConfig = 0; + double fLo; + double fHi; + + str = settings->value("alex/manual", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x01; + + str = settings->value("alex/bypassAll", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x02; + + str = settings->value("alex/amp6m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x04; + + fLo = settings->value("alex/amp6mLo", 50000000).toDouble(); + if ((fLo < 49000000) || (fLo > 52500000)) fLo = 50000000; + + fHi = settings->value("alex/amp6mHi", 54000000).toDouble(); + if ((fHi < 52500000) || (fHi > 55000000)) fHi = 54000000; + + m_HPFLoFrequencyList[5] = (long)fLo; + m_HPFHiFrequencyList[5] = (long)fHi; + + + str = settings->value("alex/hpf1_5MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x08; + + fLo = settings->value("alex/hpf1_5MHzLo", 1500000).toDouble(); + if ((fLo < 0) || (fLo > 2000000)) fLo = 1500000; + + fHi = settings->value("alex/hpf1_5MHzHi", 5500000).toDouble(); + if ((fHi < 1600000) || (fHi > 6000000)) fHi = 5500000; + + m_HPFLoFrequencyList[0] = (long)fLo; + m_HPFHiFrequencyList[0] = (long)fHi; + + + str = settings->value("alex/hpf6_5MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x10; + + fLo = settings->value("alex/hpf6_5MHzLo", 7000000).toDouble(); + if ((fLo < 6000000) || (fLo > 8000000)) fLo = 7000000; + + fHi = settings->value("alex/hpf6_5MHzHi", 7300000).toDouble(); + if ((fHi < 7000000) || (fHi > 9500000)) fHi = 7300000; + + m_HPFLoFrequencyList[1] = (long)fLo; + m_HPFHiFrequencyList[1] = (long)fHi; + + + str = settings->value("alex/hpf9_5MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x20; + + fLo = settings->value("alex/hpf9_5MHzLo", 10100000).toDouble(); + if ((fLo < 9000000) || (fLo > 11000000)) fLo = 10100000; + + fHi = settings->value("alex/hpf9_5MHzHi", 10150000).toDouble(); + if ((fHi < 10000000) || (fHi > 13000000)) fHi = 10150000; + + m_HPFLoFrequencyList[2] = (long)fLo; + m_HPFHiFrequencyList[2] = (long)fHi; + + + str = settings->value("alex/hpf13MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x40; + + fLo = settings->value("alex/hpf13MHzLo", 14000000).toDouble(); + if ((fLo < 12000000) || (fLo > 15000000)) fLo = 14000000; + + fHi = settings->value("alex/hpf13MHzHi", 18168000).toDouble(); + if ((fHi < 13700000) || (fHi > 19000000)) fHi = 18168000; + + m_HPFLoFrequencyList[3] = (long)fLo; + m_HPFHiFrequencyList[3] = (long)fHi; + + + str = settings->value("alex/hpf20MHz", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x80; + + fLo = settings->value("alex/hpf20MHzLo", 21000000).toDouble(); + if ((fLo < 18000000) || (fLo > 25000000)) fLo = 21000000; + + fHi = settings->value("alex/hpf20MHzHi", 29700000).toDouble(); + if ((fHi < 25000000) || (fHi > 32000000)) fHi = 29700000; + + m_HPFLoFrequencyList[4] = (long)fLo; + m_HPFHiFrequencyList[4] = (long)fHi; + + + str = settings->value("alex/lpf160m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x100; + + fLo = settings->value("alex/lpf160mLo", 1800000).toDouble(); + if ((fLo < 0) || (fLo > 1900000)) fLo = 1800000; + + fHi = settings->value("alex/lpf160mHi", 2000000).toDouble(); + if ((fHi < 1000000) || (fHi > 3000000)) fHi = 2000000; + + m_LPFLoFrequencyList[0] = (long)fLo; + m_LPFHiFrequencyList[0] = (long)fHi; + + + str = settings->value("alex/lpf80m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x200; + + fLo = settings->value("alex/lpf80mLo", 3500000).toDouble(); + if ((fLo < 2000000) || (fLo > 4000000)) fLo = 3500000; + + fHi = settings->value("alex/lpf80mHi", 4000000).toDouble(); + if ((fHi < 2000000) || (fHi > 5000000)) fHi = 4000000; + + m_LPFLoFrequencyList[1] = (long)fLo; + m_LPFHiFrequencyList[1] = (long)fHi; + + + str = settings->value("alex/lpf60_40m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x400; + + fLo = settings->value("alex/lpf60_40mLo", 5330000).toDouble(); + if ((fLo < 5000000) || (fLo > 11000000)) fLo = 5330000; + + fHi = settings->value("alex/lpf60_40mHi", 7300000).toDouble(); + if ((fHi < 5000000) || (fHi > 8000000)) fHi = 7300000; + + m_LPFLoFrequencyList[2] = (long)fLo; + m_LPFHiFrequencyList[2] = (long)fHi; + + + str = settings->value("alex/lpf30_20m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x800; + + fLo = settings->value("alex/lpf30_20mLo", 10100000).toDouble(); + if ((fLo < 9000000) || (fLo > 15000000)) fLo = 10100000; + + fHi = settings->value("alex/lpf30_20mHi", 14350000).toDouble(); + if ((fHi < 9000000) || (fHi > 15000000)) fHi = 14350000; + + m_LPFLoFrequencyList[3] = (long)fLo; + m_LPFHiFrequencyList[3] = (long)fHi; + + + str = settings->value("alex/lpf17_15m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x1000; + + fLo = settings->value("alex/lpf17_15mLo", 18068000).toDouble(); + if ((fLo < 17000000) || (fLo > 22000000)) fLo = 18068000; + + fHi = settings->value("alex/lpf17_15mHi", 21450000).toDouble(); + if ((fHi < 17000000) || (fHi > 22000000)) fHi = 21450000; + + m_LPFLoFrequencyList[4] = (long)fLo; + m_LPFHiFrequencyList[4] = (long)fHi; + + + str = settings->value("alex/lpf12_10m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x2000; + + fLo = settings->value("alex/lpf12_10mLo", 24890000).toDouble(); + if ((fLo < 23000000) || (fLo > 30000000)) fLo = 24890000; + + fHi = settings->value("alex/lpf12_10mHi", 29700000).toDouble(); + if ((fHi < 23000000) || (fHi > 30000000)) fHi = 29700000; + + m_LPFLoFrequencyList[5] = (long)fLo; + m_LPFHiFrequencyList[5] = (long)fHi; + + + str = settings->value("alex/lpf6m", "off").toString(); + if (str.toLower() == "on") + m_alexConfig |= 0x4000; + + fLo = settings->value("alex/lpf6mLo", 50000000).toDouble(); + if ((fLo < 30000000) || (fLo > 52000000)) fLo = 50000000; + + fHi = settings->value("alex/lpf6mHi", 54000000).toDouble(); + if ((fHi < 52000000) || (fHi > 66000000)) fHi = 54000000; + + m_LPFLoFrequencyList[6] = (long)fLo; + m_LPFHiFrequencyList[6] = (long)fHi; + + + SETTINGS_DEBUG << "Alex config: " << m_alexConfig; + + if (m_alexStates.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS; i++) { + + str = "alex/state"; + str.append(m_bandList.at(i).bandString); + + value = settings->value(str, 33).toInt(); + setAlexState(this, i, value); + } + } + + //****************************************************************** + // Penny open collector settings + + str = settings->value("penny/OCenabled", "off").toString(); + if (str.toLower() == "on") + m_pennyOCEnabled = true; + else + m_pennyOCEnabled = false; + + if (m_rxJ6pinList.length() == MAX_BANDS-1 && m_txJ6pinList.length() == MAX_BANDS-1 && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/rxState"; + str.append(m_bandList.at(i).bandString); + + value = settings->value(str, 0).toInt(); + if (value < 0 || value > 255) value = 0; + setRxJ6Pin(this, (HamBand) i, value); + } + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/txState"; + str.append(m_bandList.at(i).bandString); + + value = settings->value(str, 0).toInt(); + if (value < 0 || value > 255) value = 0; + setTxJ6Pin(this, (HamBand) i, value); + } + } + else { + + qWarning() << "rxJ6pinList or txJ6pinList or bandList have wrong length!"; + } + + //****************************************************************** + // wideband settings + + str = settings->value("wideband/widebandData", "on").toString(); + if (str.toLower() == "on") + m_widebandOptions.wideBandData = true; + else if (str.toLower() == "off") + m_widebandOptions.wideBandData = false; + else + m_widebandOptions.wideBandData = true; + + str = settings->value("wideband/widebandDisplay", "off").toString(); + if (str.toLower() == "on") + m_widebandOptions.wideBandDisplayStatus = true; + else if (str.toLower() == "off") + m_widebandOptions.wideBandDisplayStatus = false; + else + m_widebandOptions.wideBandDisplayStatus = false; + + if (!m_widebandOptions.wideBandData) m_widebandOptions.wideBandDisplayStatus = false; + + str = settings->value("wideband/averaging", "on").toString(); + if (str.toLower() == "on") + m_widebandOptions.averaging = true; + else if (str.toLower() == "off") + m_widebandOptions.averaging = false; + else + m_widebandOptions.averaging = true; + + value = settings->value("wideband/averagingCnt", 5).toInt(); + if ((value < 1) || (value > 100)) value = 5; + m_widebandOptions.averagingCnt = value; + + value = settings->value("wideband/dBmWideBandScaleMin", -140).toInt(); + if ((value < -200) || (value > 0)) value = -140; + m_widebandOptions.dBmWBScaleMin = (qreal)(1.0 * value); + + value = settings->value("wideband/dBmWideBandScaleMax", -10).toInt(); + if ((value < -100) || (value > 0)) value = -10; + m_widebandOptions.dBmWBScaleMax = (qreal)(1.0 * value); + + str = settings->value("wideband/panMode", "LINE").toString(); + if (str == "LINE") + m_widebandOptions.panMode = Line; + else if (str == "FILLEDLINE") + m_widebandOptions.panMode = FilledLine; + else if (str == "SOLID") + m_widebandOptions.panMode = Solid; + + //****************************************************************** + // receiver data settings + + for (int i = 0; i < MAX_RECEIVERS; i++) { + + QString cstr = m_rxStringList.at(i); + cstr.append("/dspCore"); + + str = settings->value(cstr, "qtdsp").toString(); + if (str == "qtdsp") { + + m_receiverDataList[i].dspCore = QSDR::QtDSP; + setSpectrumSize(this, 4096); + //SETTINGS_DEBUG << "DSP core for rx " << i << " is QtDSP."; + } + + cstr = m_rxStringList.at(i); + cstr.append("/freqRulerPosition"); + + value = settings->value(cstr, 5).toInt(); + if (value < 0) value = 0; + if (value > 10) value = 10; + m_receiverDataList[i].freqRulerPosition = value/10.0f; + + cstr = m_rxStringList.at(i); + cstr.append("/audioVolume"); + + value = settings->value(cstr, 10).toInt(); + if (value < 0) value = 0; + if (value > 100) value = 100; + m_receiverDataList[i].audioVolume = value/100.0f; + + cstr = m_rxStringList.at(i); + cstr.append("/mouseWheelFreqStep"); + + value = settings->value(cstr, 100).toInt(); + if ((value != 1) & (value != 10) & (value != 100) & (value != 1000) & (value != 10000) & (value != 100000) & + (value != 5) & (value != 50) & (value != 500) & (value != 5000) & (value != 50000) & (value != 500000)) + value = 100; + m_receiverDataList[i].mouseWheelFreqStep = (qreal)value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcGain"); + + value = settings->value(cstr, 100).toInt(); + if (value < -20) value = -20; + if (value > 120) value = 120; + m_receiverDataList[i].acgGain = value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcFixedGain"); + + value = settings->value(cstr, 30).toInt(); + if (value < -20) value = -20; + if (value > 50) value = 50; + m_receiverDataList[i].agcFixedGain_dB = value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcMaximumGain"); + + value = settings->value(cstr, 30).toInt(); + if (value < -20) value = -20; + if (value > 150) value = 150; + m_receiverDataList[i].agcMaximumGain_dB = value - 0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcSlope"); + + value = settings->value(cstr, 0).toInt(); + if (value < 0) value = 0; + if (value > 20) value = 20; + m_receiverDataList[i].agcVariableGain = (qreal)value; + + cstr = m_rxStringList.at(i); + cstr.append("/agcAttacktime"); + + value = settings->value(cstr, 1).toInt(); + if (value < 1) value = 1; + if (value > 10) value = 10; + m_receiverDataList[i].agcAttackTime = value/1000.0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcDecaytime"); + + value = settings->value(cstr, 250).toInt(); + if (value < 10) value = 10; + if (value > 5000) value = 5000; + m_receiverDataList[i].agcDecayTime = value/1000.0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcHangtime"); + + value = settings->value(cstr, 100).toInt(); + if (value < 10) value = 10; + if (value > 5000) value = 5000; + m_receiverDataList[i].agcHangTime = value/1000.0; + + cstr = m_rxStringList.at(i); + cstr.append("/agcLines"); + + str = settings->value(cstr, "on").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].agcLines = true; + else + m_receiverDataList[i].agcLines = false; + + cstr = m_rxStringList.at(i); + cstr.append("/agcMode"); + + str = settings->value(cstr, "MED").toString(); + if (str == "LONG") + m_receiverDataList[i].agcMode = agcLONG; + else if (str == "SLOW") + m_receiverDataList[i].agcMode = agcSLOW; + else if (str == "MED") + m_receiverDataList[i].agcMode = agcMED; + else if (str == "FAST") + m_receiverDataList[i].agcMode = agcFAST; + else + m_receiverDataList[i].agcMode = agcOFF; + + if (str == "MED" || str == "FAST") + m_receiverDataList[i].hangEnabled = false; + else + m_receiverDataList[i].hangEnabled = true; + + cstr = m_rxStringList.at(i); + cstr.append("/panMode"); + + str = settings->value(cstr, "LINE").toString(); + if (str == "LINE") + m_receiverDataList[i].panMode = Line; + else if (str == "FILLEDLINE") + m_receiverDataList[i].panMode = FilledLine; + else if (str == "SOLID") + m_receiverDataList[i].panMode = Solid; + + cstr = m_rxStringList.at(i); + cstr.append("/waterfallMode"); + + str = settings->value(cstr, "ENHANCED").toString(); + if (str == "SIMPLE") + m_receiverDataList[i].waterfallMode = Simple; + else if (str == "ENHANCED") + m_receiverDataList[i].waterfallMode = Enhanced; + + cstr = m_rxStringList.at(i); + cstr.append("/framesPerSecond"); + value = settings->value(cstr, 25).toInt(); + if (value < 0 || value > 200) value = 25; + m_receiverDataList[i].framesPerSecond = value; + + cstr = m_rxStringList.at(i); + cstr.append("/waterfallOffsetLo"); + value = settings->value(cstr, -5).toInt(); + if ((value < -50) || (value > 50)) value = -5; + m_receiverDataList[i].waterfallOffsetLo = value; + + cstr = m_rxStringList.at(i); + cstr.append("/waterfallOffsetHi"); + value = settings->value(cstr, 20).toInt(); + if ((value < -50) || (value > 50)) value = 20; + m_receiverDataList[i].waterfallOffsetHi = value; + + cstr = m_rxStringList.at(i); + cstr.append("/filterHi"); + value = settings->value(cstr, -150).toInt(); + if (value < -20000 || value > 20000) value = -150; + m_receiverDataList[i].filterHi = (qreal)(1.0f * value); + + cstr = m_rxStringList.at(i); + cstr.append("/filterLo"); + value = settings->value(cstr, -3050).toInt(); + if (value < -20000 || value > 20000) value = -3050; + m_receiverDataList[i].filterLo = (qreal)(1.0f * value); + + cstr = m_rxStringList.at(i); + cstr.append("/averaging"); + str = settings->value(cstr, "on").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].spectrumAveraging = true; + else + m_receiverDataList[i].spectrumAveraging = false; + + cstr = m_rxStringList.at(i); + cstr.append("/averagingCnt"); + value = settings->value(cstr, 5).toInt(); + if ((value < 1) || (value > 100)) value = 5; + m_receiverDataList[i].averagingCnt = value; + + cstr = m_rxStringList.at(i); + cstr.append("/grid"); + str = settings->value(cstr, "on").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].panGrid = true; + else + m_receiverDataList[i].panGrid = false; + + cstr = m_rxStringList.at(i); + cstr.append("/hairCross"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].hairCross = true; + else + m_receiverDataList[i].hairCross = false; + + cstr = m_rxStringList.at(i); + cstr.append("/panLocked"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].panLocked = true; + else + m_receiverDataList[i].panLocked = false; + + cstr = m_rxStringList.at(i); + cstr.append("/clickVFO"); + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].clickVFO = true; + else + m_receiverDataList[i].clickVFO = false; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency2200m"); + value = settings->value(cstr, 135700).toDouble(); + if ((value < 135700) || (value > 137800)) value = 135700; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency2200m"); + value = settings->value(cstr, 135700).toDouble(); + if ((value < 135700) || (value > 137800)) value = 135700; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency630m"); + value = settings->value(cstr, 472000).toDouble(); + if ((value < 472000) || (value > 479000)) value = 472000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency630m"); + value = settings->value(cstr, 472000).toDouble(); + if ((value < 472000) || (value > 479000)) value = 472000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency160m"); + value = settings->value(cstr, 1810000).toDouble(); + if ((value < 1810000) || (value > 2000000)) value = 1810000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency160m"); + value = settings->value(cstr, 1800000).toDouble(); + if ((value < 1810000) || (value > 2000000)) value = 1810000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency80m"); + value = settings->value(cstr, 3500000).toDouble(); + if ((value < 3500000) || (value > 3800000)) value = 3500000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency80m"); + value = settings->value(cstr, 3500000).toDouble(); + if ((value < 3500000) || (value > 3800000)) value = 3500000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency60m"); + value = settings->value(cstr, 5260000).toDouble(); + if ((value < 5260000) || (value > 5410000)) value = 5260000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency60m"); + value = settings->value(cstr, 5260000).toDouble(); + if ((value < 5260000) || (value > 5410000)) value = 5260000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency40m"); + value = settings->value(cstr, 7000000).toDouble(); + if ((value < 7000000) || (value > 7200000)) value = 7000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency40m"); + value = settings->value(cstr, 7000000).toDouble(); + if ((value < 7000000) || (value > 7200000)) value = 7000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency30m"); + value = settings->value(cstr, 10100000).toDouble(); + if ((value < 10100000) || (value > 10150000)) value = 10100000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency30m"); + value = settings->value(cstr, 10100000).toDouble(); + if ((value < 10100000) || (value > 10150000)) value = 10100000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency20m"); + value = settings->value(cstr, 14000000).toDouble(); + if ((value < 14000000) || (value > 14350000)) value = 14000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency20m"); + value = settings->value(cstr, 14000000).toDouble(); + if ((value < 14000000) || (value > 14350000)) value = 14000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency17m"); + value = settings->value(cstr, 18068000).toDouble(); + if ((value < 18068000) || (value > 18168000)) value = 18068000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency17m"); + value = settings->value(cstr, 18068000).toDouble(); + if ((value < 18068000) || (value > 18168000)) value = 18068000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency15m"); + value = settings->value(cstr, 21000000).toDouble(); + if ((value < 21000000) || (value > 21450000)) value = 21000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency15m"); + value = settings->value(cstr, 21000000).toDouble(); + if ((value < 21000000) || (value > 21450000)) value = 21000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency12m"); + value = settings->value(cstr, 24890000).toDouble(); + if ((value < 24890000) || (value > 24990000)) value = 24890000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency12m"); + value = settings->value(cstr, 24890000).toDouble(); + if ((value < 24890000) || (value > 24990000)) value = 24890000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency10m"); + value = settings->value(cstr, 28000000).toDouble(); + if ((value < 28000000) || (value > 29700000)) value = 28000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency10m"); + value = settings->value(cstr, 28000000).toDouble(); + if ((value < 28000000) || (value > 29700000)) value = 28000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequency6m"); + value = settings->value(cstr, 50000000).toDouble(); + if ((value < 50000000) || (value > 54000000)) value = 50000000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequency6m"); + value = settings->value(cstr, 50000000).toDouble(); + if ((value < 50000000) || (value > 54000000)) value = 50000000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastCenterFrequencyGen"); + value = settings->value(cstr, 1800000).toDouble(); + if ((value < 0) || (value > 50000000)) value = 3500000; + m_receiverDataList[i].lastCenterFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/lastVfoFrequencyGen"); + value = settings->value(cstr, 1800000).toDouble(); + if ((value < 0) || (value > MAXFREQUENCY)) value = 1800000; + m_receiverDataList[i].lastVfoFrequencyList << value; + + cstr = m_rxStringList.at(i); + cstr.append("/centerFrequency"); + value = settings->value(cstr, 3672000).toDouble(); + if ((value < 0) || (value > MAXFREQUENCY)) value = 1800000; + m_receiverDataList[i].ctrFrequency = value; + + setCtrFrequency(i, value); + + cstr = m_rxStringList.at(i); + cstr.append("/vfoFrequency"); + value = settings->value(cstr, 3672000).toDouble(); + if ((value < 0) || (value > 50000000)) value = 3600000; + m_receiverDataList[i].vfoFrequency = value; + + setVfoFrequency(i, value); + + + if (m_receiverDataList[i].dspModeList.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int j = 0; j < MAX_BANDS; j++) { + + cstr = m_rxStringList.at(i); + cstr.append("/dspMode"); + cstr.append(m_bandList.at(j).bandString); + + str = settings->value(cstr, "").toString(); + + if (str == "USB") + m_receiverDataList[i].dspModeList[j] = USB; + else if (str == "DSB") + m_receiverDataList[i].dspModeList[j] = DSB; + else if (str == "CWL") + m_receiverDataList[i].dspModeList[j] = CWL; + else if (str == "CWU") + m_receiverDataList[i].dspModeList[j] = CWU; + else if (str == "FMN") + m_receiverDataList[i].dspModeList[j] = FMN; + else if (str == "AM") + m_receiverDataList[i].dspModeList[j] = AM; + else if (str == "DIGU") + m_receiverDataList[i].dspModeList[j] = DIGU; + else if (str == "SPEC") + m_receiverDataList[i].dspModeList[j] = SPEC; + else if (str == "DIGL") + m_receiverDataList[i].dspModeList[j] = DIGL; + else if (str == "SAM") + m_receiverDataList[i].dspModeList[j] = SAM; + else if (str == "DRM") + m_receiverDataList[i].dspModeList[j] = DRM; + else + m_receiverDataList[i].dspModeList[j] = LSB; + + //SETTINGS_DEBUG << cstr << ": " << getDSPModeString(m_receiverDataList[i].dspModeList[j]); + } + } + + if (m_receiverDataList[i].mercuryAttenuators.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int j = 0; j < MAX_BANDS; j++) { + + cstr = m_rxStringList.at(i); + cstr.append("/attenuator"); + cstr.append(m_bandList.at(j).bandString); + + str = settings->value(cstr, "off").toString(); + if (str.toLower() == "on") + m_receiverDataList[i].mercuryAttenuators[j] = 0; // which is 'Preamp' off + else + m_receiverDataList[i].mercuryAttenuators[j] = 1; // which is 'Preamp' on + } + } + + int valueMin, valueMax; + if (m_receiverDataList[i].dBmPanScaleMinList.length() == MAX_BANDS && + m_receiverDataList[i].dBmPanScaleMaxList.length() == MAX_BANDS && + m_bandList.length() == MAX_BANDS + ) { + for (int j = 0; j < MAX_BANDS; j++) { + + cstr = m_rxStringList.at(i); + cstr.append("/dBmPanScaleMin"); + cstr.append(m_bandList.at(j).bandString); + + valueMin = settings->value(cstr, -120).toInt(); + if ((valueMin < -200) || (valueMin > 0)) valueMin = -120; + + cstr = m_rxStringList.at(i); + cstr.append("/dBmPanScaleMax"); + cstr.append(m_bandList.at(j).bandString); + + valueMax = settings->value(cstr, -10).toInt(); + if ((valueMax < -200) || (valueMax > 0)) valueMax = -10; + + if (valueMax <= valueMin) { + + valueMin = -120; + valueMax = -10; + } + + m_receiverDataList[i].dBmPanScaleMinList[j] = (qreal)(1.0 * valueMin); + m_receiverDataList[i].dBmPanScaleMaxList[j] = (qreal)(1.0 * valueMax); + } + } + } + + //****************************************************************** + // Chirp WSPR settings + value = settings->value("ChirpWSPR/lowerChirpFrequency", 500).toInt(); + if (value < 1 || value > 10000) value = 500; + m_lowerChirpFreq = value; + + value = settings->value("ChirpWSPR/upperChirpFrequency", 2500).toInt(); + if (value < 2 || value < m_lowerChirpFreq + 1 || value > 50000) value = 2500; + m_upperChirpFreq = value; + + value = settings->value("ChirpWSPR/chirpAmplitude", 75).toInt(); + if (value < 0 || value > 100) return -1; + m_chirpAmplitude = qreal(value / 100.0); + + value = settings->value("ChirpWSPR/chirpSamplingFrequency", 48000).toInt(); + if ((value != 8000) & (value != 48000) & (value != 96000)) value = 48000; + m_chirpSamplingFreq = value; + + value = settings->value("ChirpWSPR/chirpBufferDurationUs", 10000000).toInt(); + if (value < 0 || value > 100000000) value = 10000000; + m_chirpBufferDurationUs = (qint64)value; + + value = settings->value("ChirpWSPR/chirpChannels", 1).toInt(); + if ((value != 1) & (value != 2)) value = 1; + m_chirpChannels = value; + + value = settings->value("ChirpWSPR/chirpBufferLength", 4096).toInt(); + if ((value != 4096) & (value != 16384)) value = 4096; + m_chirpBufferLength = (qint64)value; + + value = settings->value("ChirpWSPR/chirpFilterLowerFrequency", 500).toInt(); + if (value < 10000 || value > 10000) value = 500; + m_chirpFilterLowerFrequency = value; + + value = settings->value("ChirpWSPR/chirpFilterUpperFrequency", 2500).toInt(); + if (value < 10000 || value > 10000) value = 2500; + m_chirpFilterUpperFrequency = value; + + //****************************************************************** + // graphics settings + + value = settings->value("graphics/dBmDistScaleMin", -20).toInt(); + if ((value < -200) || (value > 0)) value = -20; + m_dBmDistScaleMin = (qreal)(1.0 * value); + + value = settings->value("graphics/dBmDistScaleMax", 100).toInt(); + if ((value < -100) || (value > 200)) value = 100; + m_dBmDistScaleMax = (qreal)(1.0 * value); + + value = settings->value("graphics/sMeterHoldTime", 2000).toInt(); + if ((value < 0) || (value > 10000)) value = 2000; + m_sMeterHoldTime = value; + + + //****************************************************************** + // color settings + QColor color; + + color = settings->value("colors/panBackground", QColor(102, 69, 8)).value(); + if (!color.isValid()) color = QColor(102, 69, 8); + m_panadapterColors.panBackgroundColor = color; + + color = settings->value("colors/waterfall", QColor(246, 146, 6)).value(); + if (!color.isValid()) color = QColor(246, 146, 6); + m_panadapterColors.waterfallColor = color; + + color = settings->value("colors/panLine", QColor(246, 164, 76)).value(); + if (!color.isValid()) color = QColor(246, 164, 76); + m_panadapterColors.panLineColor = color; + + color = settings->value("colors/panLineFilled", QColor(246, 159, 7)).value(); + if (!color.isValid()) color = QColor(246, 159, 7); + m_panadapterColors.panLineFilledColor = color; + + color = settings->value("colors/panSolidTop", QColor(230, 246, 204)).value(); + if (!color.isValid()) color = QColor(230, 246, 204); + m_panadapterColors.panSolidTopColor = color; + + color = settings->value("colors/panSolidBottom", QColor(102, 96, 8)).value(); + if (!color.isValid()) color = QColor(102, 96, 8); + m_panadapterColors.panSolidBottomColor = color; + + color = settings->value("colors/panWideBandLine", QColor(73, 111, 7)).value(); + if (!color.isValid()) color = QColor(73, 111, 7); + m_panadapterColors.wideBandLineColor = color; + + color = settings->value("colors/panWideBandFilled", QColor(137, 172, 62)).value(); + if (!color.isValid()) color = QColor(137, 172, 62); + m_panadapterColors.wideBandFilledColor = color; + + color = settings->value("colors/panWideBandSolidTop", QColor(236, 38, 16)).value(); + if (!color.isValid()) color = QColor(236, 38, 16); + m_panadapterColors.wideBandSolidTopColor = color; + + color = settings->value("colors/panWideBandSolidBottom", QColor(232, 134, 29)).value(); + if (!color.isValid()) color = QColor(232, 134, 29); + m_panadapterColors.wideBandSolidBottomColor = color; + + color = settings->value("colors/distanceLine", QColor(246, 27, 45)).value(); + if (!color.isValid()) color = QColor(246, 27, 45); + m_panadapterColors.distanceLineColor = color; + + color = settings->value("colors/distanceLineFilled", QColor(232, 29, 86)).value(); + if (!color.isValid()) color = QColor(232, 29, 86); + m_panadapterColors.distanceLineFilledColor = color; + + color = settings->value("colors/panCenterLine", QColor(246, 7, 19)).value(); + if (!color.isValid()) color = QColor(246, 7, 19); + m_panadapterColors.panCenterLineColor = color; + + color = settings->value("colors/gridLine", QColor(7, 96, 96)).value(); + if (!color.isValid()) color = QColor(7, 96, 96); + m_panadapterColors.gridLineColor = color; + + SETTINGS_DEBUG << "reading done."; + + return 0; +} + +int Settings::saveSettings() { + + QString str; + //QList bandList = HamBandStrings(); + + settings->setValue(getTitleStr(), getVersionStr()); + settings->setValue("saved", QDateTime::currentDateTime().toString("dddd dd MMMM yyyy hh:mm:ss"));// << " local time\n\n"); + settings->setValue("user/callSign", m_callsignString); + + // window settings + settings->setValue("window/minimumWidgetWidth", m_minimumWidgetWidth); + settings->setValue("window/minimumGroupBoxWidth", m_minimumGroupBoxWidth); + settings->setValue("window/multiRxView", m_multiRxView); + + // network settings + settings->setValue("network/server_ipAddress", m_serverAddress); + settings->setValue("network/hpsdr_local_ipAddress", m_hpsdrDeviceLocalAddr); + settings->setValue("network/server_port", m_serverPort); + settings->setValue("network/listen_port", m_listenerPort); + settings->setValue("network/audio_port", m_audioPort); + settings->setValue("network/metis_port", m_metisPort); + settings->setValue("network/socketBufferSize", m_socketBufferSize); + + + // HPSDR hardware + settings->setValue("hpsdr/hardware", m_hpsdrHardware); + + switch (m_hpsdrHardware) { + + // Mercury/Penelope, PennyLane + case 0: + + if (m_devices.mercuryPresence) + settings->setValue("hpsdr/mercury", "true"); + else + settings->setValue("hpsdr/mercury", "false"); + + if (m_devices.penelopePresence) + settings->setValue("hpsdr/penelope", "true"); + else + settings->setValue("hpsdr/penelope", "false"); + + if (m_devices.pennylanePresence) + settings->setValue("hpsdr/pennylane", "true"); + else + settings->setValue("hpsdr/pennylane", "false"); + + if (m_devices.excaliburPresence) + settings->setValue("hpsdr/excalibur", "true"); + else + settings->setValue("hpsdr/excalibur", "false"); + break; + + // Hermes + case 1: + + if (m_devices.mercuryPresence) + settings->setValue("hpsdr/mercury", "true"); + else + settings->setValue("hpsdr/mercury", "false"); + + if (m_devices.penelopePresence) + settings->setValue("hpsdr/penelope", "true"); + else + settings->setValue("hpsdr/penelope", "false"); + + if (m_devices.pennylanePresence) + settings->setValue("hpsdr/pennylane", "true"); + else + settings->setValue("hpsdr/pennylane", "false"); + + if (m_devices.excaliburPresence) + settings->setValue("hpsdr/excalibur", "true"); + else + settings->setValue("hpsdr/excalibur", "false"); + break; + + // Cyclops + case 2: + break; + } + + if (m_devices.alexPresence) + settings->setValue("hpsdr/alex", "true"); + else + settings->setValue("hpsdr/alex", "false"); + + +// if (m_devices.hermesPresence) +// settings->setValue("hpsdr/hermes", "true"); +// else +// settings->setValue("hpsdr/hermes", "false"); + + switch (m_hpsdrHardware) { + + // Mercury/Penelope + case 0: + + if (m_hwInterface == QSDR::Metis) + settings->setValue("hpsdr/interface", "metis"); + else if (m_hwInterface == QSDR::NoInterfaceMode) + settings->setValue("hpsdr/interface", "noInterface"); + break; + + // Hermes + case 1: + + if (m_hwInterface == QSDR::Hermes) + settings->setValue("hpsdr/interface", "hermes"); + break; + + // Cyclops + case 2: + break; + } + + if (m_checkFirmwareVersions) + settings->setValue("hpsdr/checkfw", "true"); + else + settings->setValue("hpsdr/checkfw", "false"); + + + // server settings + settings->setValue("server/sample_rate", getSampleRate()); + + if (m_mercuryDither == 1) + settings->setValue("server/dither", "on"); + else + settings->setValue("server/dither", "off"); + + if (m_mercuryRandom == 1) + settings->setValue("server/random", "on"); + else + settings->setValue("server/random", "off"); + + if (m_10MHzSource == 0) + settings->setValue("server/10mhzsource", "atlas"); + else if (m_10MHzSource == 1) + settings->setValue("server/10mhzsource", "penelope"); + else if (m_10MHzSource == 2) + settings->setValue("server/10mhzsource", "mercury"); + else if (m_10MHzSource == 3) + settings->setValue("server/10mhzsource", "none"); + else + settings->setValue("server/10mhzsource", "mercury"); + + if (m_122_8MHzSource == 0) + settings->setValue("server/122_88mhzsource", "penelope"); + else if (m_122_8MHzSource == 1) + settings->setValue("server/122_88mhzsource", "mercury"); + + if (m_micSource == 0) + settings->setValue("server/mic_source", "janus"); + else if (m_micSource == 1) + settings->setValue("server/mic_source", "penelope"); + + settings->setValue("server/class", m_RxClass); + settings->setValue("server/timing", m_RxTiming); + //settings->setValue("server/mainVolume", (int)(m_mainVolume * 100)); + + //if (m_serverMode == QSDR::SDRMode) + settings->setValue("server/mode", "sdr"); + + //settings->setValue("server/mouseWheelFreqStep", m_mouseWheelFreqStep); + + //****************************************************************** + // Alexiares data settings + + // m_alexConfig (qint16) + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) + // | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* + // | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* + // | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* + // | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* + // | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* + // | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* + // | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* + // | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* + // | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* + // | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* + // +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + + if (m_alexConfig & 0x01) + settings->setValue("alex/manual", "on"); + else + settings->setValue("alex/manual", "off"); + + if (m_alexConfig & 0x02) + settings->setValue("alex/bypassAll", "on"); + else + settings->setValue("alex/bypassAll", "off"); + + if (m_alexConfig & 0x04) + settings->setValue("alex/amp6m", "on"); + else + settings->setValue("alex/amp6m", "off"); + + settings->setValue("alex/amp6mLo", (int)m_HPFLoFrequencyList.at(5)); + settings->setValue("alex/amp6mHi", (int)m_HPFHiFrequencyList.at(5)); + + if (m_alexConfig & 0x08) + settings->setValue("alex/hpf1_5MHz", "on"); + else + settings->setValue("alex/hpf1_5MHz", "off"); + + settings->setValue("alex/hpf1_5MHzLo", (int)m_HPFLoFrequencyList.at(0)); + settings->setValue("alex/hpf1_5MHzHi", (int)m_HPFHiFrequencyList.at(0)); + + if (m_alexConfig & 0x10) + settings->setValue("alex/hpf6_5MHz", "on"); + else + settings->setValue("alex/hpf6_5MHz", "off"); + + settings->setValue("alex/hpf6_5MHzLo", (int)m_HPFLoFrequencyList.at(1)); + settings->setValue("alex/hpf6_5MHzHi", (int)m_HPFHiFrequencyList.at(1)); + + if (m_alexConfig & 0x20) + settings->setValue("alex/hpf9_5MHz", "on"); + else + settings->setValue("alex/hpf9_5MHz", "off"); + + settings->setValue("alex/hpf9_5MHzLo", (int)m_HPFLoFrequencyList.at(2)); + settings->setValue("alex/hpf9_5MHzHi", (int)m_HPFHiFrequencyList.at(2)); + + if (m_alexConfig & 0x40) + settings->setValue("alex/hpf13MHz", "on"); + else + settings->setValue("alex/hpf13MHz", "off"); + + settings->setValue("alex/hpf13MHzLo", (int)m_HPFLoFrequencyList.at(3)); + settings->setValue("alex/hpf13MHzHi", (int)m_HPFHiFrequencyList.at(3)); + + if (m_alexConfig & 0x80) + settings->setValue("alex/hpf20MHz", "on"); + else + settings->setValue("alex/hpf20MHz", "off"); + + settings->setValue("alex/hpf20MHzLo", (int)m_HPFLoFrequencyList.at(4)); + settings->setValue("alex/hpf20MHzHi", (int)m_HPFHiFrequencyList.at(4)); + + if (m_alexConfig & 0x100) + settings->setValue("alex/lpf160m", "on"); + else + settings->setValue("alex/lpf160m", "off"); + + settings->setValue("alex/lpf160mLo", (int)m_LPFLoFrequencyList.at(0)); + settings->setValue("alex/lpf160mHi", (int)m_LPFHiFrequencyList.at(0)); + + if (m_alexConfig & 0x200) + settings->setValue("alex/lpf80m", "on"); + else + settings->setValue("alex/lpf80m", "off"); + + settings->setValue("alex/lpf80mLo", (int)m_LPFLoFrequencyList.at(1)); + settings->setValue("alex/lpf80mHi", (int)m_LPFHiFrequencyList.at(1)); + + if (m_alexConfig & 0x400) + settings->setValue("alex/lpf60_40m", "on"); + else + settings->setValue("alex/lpf60_40m", "off"); + + settings->setValue("alex/lpf60_40mLo", (int)m_LPFLoFrequencyList.at(2)); + settings->setValue("alex/lpf60_40mHi", (int)m_LPFHiFrequencyList.at(2)); + + if (m_alexConfig & 0x800) + settings->setValue("alex/lpf30_20m", "on"); + else + settings->setValue("alex/lpf30_20m", "off"); + + settings->setValue("alex/lpf30_20mLo", (int)m_LPFLoFrequencyList.at(3)); + settings->setValue("alex/lpf30_20mHi", (int)m_LPFHiFrequencyList.at(3)); + + if (m_alexConfig & 0x1000) + settings->setValue("alex/lpf17_15m", "on"); + else + settings->setValue("alex/lpf17_15m", "off"); + + settings->setValue("alex/lpf17_15mLo", (int)m_LPFLoFrequencyList.at(4)); + settings->setValue("alex/lpf17_15mHi", (int)m_LPFHiFrequencyList.at(4)); + + if (m_alexConfig & 0x2000) + settings->setValue("alex/lpf12_10m", "on"); + else + settings->setValue("alex/lpf12_10m", "off"); + + settings->setValue("alex/lpf12_10mLo", (int)m_LPFLoFrequencyList.at(5)); + settings->setValue("alex/lpf12_10mHi", (int)m_LPFHiFrequencyList.at(5)); + + if (m_alexConfig & 0x4000) + settings->setValue("alex/lpf6m", "on"); + else + settings->setValue("alex/lpf6m", "off"); + + settings->setValue("alex/lpf6mLo", (int)m_LPFLoFrequencyList.at(6)); + settings->setValue("alex/lpf6mHi", (int)m_LPFHiFrequencyList.at(6)); + + + //*********************************************************************** + for (int i = 0; i < MAX_BANDS; i++) { + + str = "alex/state"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_alexStates.at(i)); + } + + if (m_alexStates.length() == MAX_BANDS && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "alex/state"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_alexStates.at(i)); + } + } + + + //****************************************************************** + // Penny open collector settings + + if (m_pennyOCEnabled) + settings->setValue("penny/OCenabled", "on"); + else + settings->setValue("penny/OCenabled", "off"); + + if (m_rxJ6pinList.length() == MAX_BANDS-1 && m_txJ6pinList.length() == MAX_BANDS-1 && m_bandList.length() == MAX_BANDS) { + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/rxState"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_rxJ6pinList.at(i)); + } + + for (int i = 0; i < MAX_BANDS-1; i++) { + + str = "penny/txState"; + str.append(m_bandList.at(i).bandString); + + settings->setValue(str, m_txJ6pinList.at(i)); + } + } + + //****************************************************************** + // wideband settings + + if (m_widebandOptions.wideBandData) + settings->setValue("wideband/widebandData", "on"); + else + settings->setValue("wideband/widebandData", "off"); + + if (!m_widebandOptions.wideBandData) m_widebandOptions.wideBandDisplayStatus = false; + + if (m_widebandOptions.wideBandDisplayStatus) + settings->setValue("wideband/widebandDisplay", "on"); + else + settings->setValue("wideband/widebandDisplay", "off"); + + if (m_widebandOptions.averaging) + settings->setValue("wideband/averaging", "on"); + else + settings->setValue("wideband/averaging", "off"); + + settings->setValue("wideband/averagingCnt", m_widebandOptions.averagingCnt); + settings->setValue("wideband/dBmWideBandScaleMin", (int)m_widebandOptions.dBmWBScaleMin); + settings->setValue("wideband/dBmWideBandScaleMax", (int)m_widebandOptions.dBmWBScaleMax); + + if (m_widebandOptions.panMode == Line) + settings->setValue("wideband/panMode", "LINE"); + else if (m_widebandOptions.panMode == FilledLine) + settings->setValue("wideband/panMode", "FILLEDLINE"); + else if (m_widebandOptions.panMode == Solid) + settings->setValue("wideband/panMode", "SOLID"); + + + //****************************************************************** + // receiver data settings + + for (int i = 0; i < MAX_RECEIVERS; i++) { + + QString str = m_rxStringList.at(i); + str.append("/dspCore"); + + if (m_receiverDataList[i].dspCore == QSDR::QtDSP) + settings->setValue(str, "qtdsp"); + //else + // settings->setValue(str, "dttsp"); + + str = m_rxStringList.at(i); + str.append("/freqRulerPosition"); + settings->setValue(str, (int)(m_receiverDataList[i].freqRulerPosition * 10)); + + str = m_rxStringList.at(i); + str.append("/audioVolume"); + settings->setValue(str, (int)(m_receiverDataList[i].audioVolume * 100)); + + str = m_rxStringList.at(i); + str.append("/mouseWheelFreqStep"); + settings->setValue(str, (int)(m_receiverDataList[i].mouseWheelFreqStep)); + + str = m_rxStringList.at(i); + str.append("/agcGain"); + settings->setValue(str, m_receiverDataList[i].acgGain); + + str = m_rxStringList.at(i); + str.append("/agcFixedGain"); + settings->setValue(str, (int) m_receiverDataList[i].agcFixedGain_dB); + + str = m_rxStringList.at(i); + str.append("/agcMaximumGain"); + settings->setValue(str, (int) m_receiverDataList[i].agcMaximumGain_dB); + + str = m_rxStringList.at(i); + str.append("/agcSlope"); + settings->setValue(str, (int)m_receiverDataList[i].agcVariableGain); + + str = m_rxStringList.at(i); + str.append("/agcAttacktime"); + settings->setValue(str, (int)(m_receiverDataList[i].agcAttackTime * 1000)); + + str = m_rxStringList.at(i); + str.append("/agcDecaytime"); + settings->setValue(str, (int)(m_receiverDataList[i].agcDecayTime * 1000)); + + str = m_rxStringList.at(i); + str.append("/agcHangTime"); + settings->setValue(str, (int)(m_receiverDataList[i].agcHangTime * 1000)); + + str = m_rxStringList.at(i); + str.append("/agcLines"); + + if (m_receiverDataList[i].agcLines) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + +// str = m_rxStringList.at(i); +// str.append("/attenuator"); +// str.append(m_bandList.at(j).bandString); +// +// if (m_receiverDataList.at(i).mercuryAttenuators.at(j)) +// settings->setValue(str, "off"); +// else +// settings->setValue(str, "on"); + + str = m_rxStringList.at(i); + str.append("/agcMode"); + + if (m_receiverDataList[i].agcMode == agcOFF) + settings->setValue(str, "OFF"); + else if (m_receiverDataList[i].agcMode == agcLONG) + settings->setValue(str, "LONG"); + else if (m_receiverDataList[i].agcMode == agcSLOW) + settings->setValue(str, "SLOW"); + else if (m_receiverDataList[i].agcMode == agcMED) + settings->setValue(str, "MED"); + else if (m_receiverDataList[i].agcMode == agcFAST) + settings->setValue(str, "FAST"); + + str = m_rxStringList.at(i); + str.append("/panMode"); + + if (m_receiverDataList[i].panMode == Line) + settings->setValue(str, "LINE"); + else if (m_receiverDataList[i].panMode == FilledLine) + settings->setValue(str, "FILLEDLINE"); + else if (m_receiverDataList[i].panMode == Solid) + settings->setValue(str, "SOLID"); + + str = m_rxStringList.at(i); + str.append("/waterfallMode"); + + if (m_receiverDataList[i].waterfallMode == Simple) + settings->setValue(str, "SIMPLE"); + else if (m_receiverDataList[i].waterfallMode == Enhanced) + settings->setValue(str, "ENHANCED"); + + str = m_rxStringList.at(i); + str.append("/framesPerSecond"); + settings->setValue(str, m_receiverDataList[i].framesPerSecond); + + str = m_rxStringList.at(i); + str.append("/waterfallOffsetLo"); + settings->setValue(str, m_receiverDataList[i].waterfallOffsetLo); + + str = m_rxStringList.at(i); + str.append("/waterfallOffsetHi"); + settings->setValue(str, m_receiverDataList[i].waterfallOffsetHi); + + str = m_rxStringList.at(i); + str.append("/filterHi"); + settings->setValue(str, m_receiverDataList[i].filterHi); + + str = m_rxStringList.at(i); + str.append("/filterLo"); + settings->setValue(str, m_receiverDataList[i].filterLo); + + str = m_rxStringList.at(i); + str.append("/averaging"); + if (m_receiverDataList[i].spectrumAveraging) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/averagingCnt"); + settings->setValue(str, m_receiverDataList[i].averagingCnt); + + str = m_rxStringList.at(i); + str.append("/grid"); + if (m_receiverDataList[i].panGrid) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/hairCross"); + if (m_receiverDataList[i].hairCross) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/panLocked"); + if (m_receiverDataList[i].panLocked) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + str = m_rxStringList.at(i); + str.append("/clickVFO"); + if (m_receiverDataList[i].clickVFO) + settings->setValue(str, "on"); + else + settings->setValue(str, "off"); + + // center frequencies + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/lastCenterFrequency"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].lastCenterFrequencyList.at(j)); + } + + // vfo frequencies + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/lastVfoFrequency"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].lastVfoFrequencyList.at(j)); + } + + str = m_rxStringList.at(i); + str.append("/centerFrequency"); + settings->setValue(str, (int)m_receiverDataList[i].ctrFrequency); + + str = m_rxStringList.at(i); + str.append("/vfoFrequency"); + settings->setValue(str, (int)m_receiverDataList[i].vfoFrequency); + + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/dspMode"); + str.append(m_bandList.at(j).bandString); + + DSPMode mode = m_receiverDataList.at(i).dspModeList.at(j); + if (mode == LSB) + settings->setValue(str, "LSB"); + else if (mode == USB) + settings->setValue(str, "USB"); + else if (mode == DSB) + settings->setValue(str, "DSB"); + else if (mode == CWL) + settings->setValue(str, "CWL"); + else if (mode == CWU) + settings->setValue(str, "CWU"); + else if (mode == FMN) + settings->setValue(str, "FMN"); + else if (mode == AM) + settings->setValue(str, "AM"); + else if (mode == DIGU) + settings->setValue(str, "DIGU"); + else if (mode == SPEC) + settings->setValue(str, "SPEC"); + else if (mode == DIGL) + settings->setValue(str, "DIGL"); + else if (mode == SAM) + settings->setValue(str, "SAM"); + else if (mode == DRM) + settings->setValue(str, "DRM"); + } + + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/attenuator"); + str.append(m_bandList.at(j).bandString); + + if (m_receiverDataList.at(i).mercuryAttenuators.at(j)) + settings->setValue(str, "off"); + else + settings->setValue(str, "on"); + } + + for (int j = 0; j < MAX_BANDS; j++) { + + str = m_rxStringList.at(i); + str.append("/dBmPanScaleMin"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].dBmPanScaleMinList[j]); + + str = m_rxStringList.at(i); + str.append("/dBmPanScaleMax"); + str.append(m_bandList.at(j).bandString); + + settings->setValue(str, (int)m_receiverDataList[i].dBmPanScaleMaxList[j]); + } + } + + + //****************************************************************** + // Cuda settings + //settings->setValue("Cuda/lastDevice", m_cudaLastDevice); + + + //****************************************************************** + // Chirp WSPR settings + settings->setValue("ChirpWSPR/lowerChirpFrequency", m_lowerChirpFreq); + settings->setValue("ChirpWSPR/upperChirpFrequency", m_upperChirpFreq); + settings->setValue("ChirpWSPR/chirpAmplitude", int(m_chirpAmplitude * 100)); + settings->setValue("ChirpWSPR/chirpSamplingFrequency", m_chirpSamplingFreq); + settings->setValue("ChirpWSPR/chirpBufferDurationUs", m_chirpBufferDurationUs); + settings->setValue("ChirpWSPR/chirpChannels", m_chirpChannels); + settings->setValue("ChirpWSPR/chirpBufferLength", m_chirpBufferLength); + settings->setValue("ChirpWSPR/chirpFilterLowerFrequency", m_chirpFilterLowerFrequency); + settings->setValue("ChirpWSPR/chirpFilterUpperFrequency", m_chirpFilterUpperFrequency); + + + //settings->setValue("ChirpWSPR/chirpDownSampleRate", m_chirpDownSampleRate); + + + //****************************************************************** + // Graphics settings + + /*if (m_specAveraging) + settings->setValue("graphics/averaging", "on"); + else + settings->setValue("graphics/averaging", "off");*/ + + /*if (m_panGrid) + settings->setValue("graphics/grid", "on"); + else + settings->setValue("graphics/grid", "off");*/ + + settings->setValue("graphics/dBmDistScaleMin", (int)m_dBmDistScaleMin); + settings->setValue("graphics/dBmDistScaleMax", (int)m_dBmDistScaleMax); + + /*if (m_waterfallColorScheme == QSDRGraphics::simple) + settings->setValue("graphics/waterfall", "simple"); + else + if (m_waterfallColorScheme == QSDRGraphics::enhanced) + settings->setValue("graphics/waterfall", "enhanced"); + else + if (m_waterfallColorScheme == QSDRGraphics::spectran) + settings->setValue("graphics/waterfall", "spectran");*/ + + settings->setValue("graphics/sMeterHoldTime", m_sMeterHoldTime); + + + // Colors + settings->setValue("colors/panBackground", QVariant(m_panadapterColors.panBackgroundColor).toString()); + settings->setValue("colors/waterfall", QVariant(m_panadapterColors.waterfallColor).toString()); + settings->setValue("colors/panLine", QVariant(m_panadapterColors.panLineColor).toString()); + settings->setValue("colors/panLineFilled", QVariant(m_panadapterColors.panLineFilledColor).toString()); + settings->setValue("colors/panSolidTop", QVariant(m_panadapterColors.panSolidTopColor).toString()); + settings->setValue("colors/panSolidBottom", QVariant(m_panadapterColors.panSolidBottomColor).toString()); + settings->setValue("colors/panWideBandLine", QVariant(m_panadapterColors.wideBandLineColor).toString()); + settings->setValue("colors/panWideBandFilled", QVariant(m_panadapterColors.wideBandFilledColor).toString()); + settings->setValue("colors/panWideBandSolidTop", QVariant(m_panadapterColors.wideBandSolidTopColor).toString()); + settings->setValue("colors/panWideBandSolidBottom", QVariant(m_panadapterColors.wideBandSolidBottomColor).toString()); + settings->setValue("colors/distanceLine", QVariant(m_panadapterColors.distanceLineColor).toString()); + settings->setValue("colors/distanceLineFilled", QVariant(m_panadapterColors.distanceLineFilledColor).toString()); + settings->setValue("colors/panCenterLine", QVariant(m_panadapterColors.panCenterLineColor).toString()); + settings->setValue("colors/gridLine", QVariant(m_panadapterColors.gridLineColor).toString()); + + SETTINGS_DEBUG << "save settings done."; + return 0; +} + +//void Settings::setMainWindowsState(QObject* sender) { +// +// settings->setValue("geometry", sender.saveGeometry()); +// settings->setValue("windowState", saveState()); +//} + +//******************************************************* + +QList Settings::getCtrFrequencies() { + + QList frequencies; + + for (int i = 0; i < MAX_RECEIVERS; i++) + frequencies << m_receiverDataList[i].ctrFrequency; + + return frequencies; +} + +QList Settings::getVfoFrequencies() { + + QList frequencies; + + for (int i = 0; i < MAX_RECEIVERS; i++) + frequencies << m_receiverDataList[i].vfoFrequency; + + return frequencies; +} + +QString Settings::getDSPModeString(int mode) { + + switch (mode) { + + case 0: + return QString("LSB"); + + case 1: + return QString("USB"); + + case 2: + return QString("DSB"); + + case 3: + return QString("CWL"); + + case 4: + return QString("CWU"); + + case 5: + return QString("FMN"); + + case 6: + return QString("AM"); + + case 7: + return QString("DIGU"); + + case 8: + return QString("SPEC"); + + case 9: + return QString("DIGL"); + + case 10: + return QString("SAM"); + + case 11: + return QString("DRM"); + + default: + return QString("unknown mode"); + } +} + +//******************************************************* + +QString Settings::getTitleStr() { + + return m_titleString; +} + +QString Settings::getVersionStr() { + + return m_versionString; +} + +QString Settings::getSettingsFilename() { + + return settingsFilename; +} + +QString Settings::getCallsign() { + + return m_callsignString; +} + +QString Settings::getValue1000( + + double value, /*!<[in] Value to print. */ + int valuePrefix, /*!<[in] Value current prefix. */ + QString unitBase) /*!<[in] Unit base string. */ +{ + const int prefixBase = 1000; + int resPrefix = valuePrefix; + + static const char *prefixTab[prefixSiMax + 1] = { + "", /* prefixNothing */ + "k", /* prefixKilo */ + "M", /* prefixMega */ + "G", /* prefixGiga */ + "T", /* prefixTera */ + "P", /* prefixPeta */ + "E", /* prefixExa */ + "Z", /* prefixZetta */ + "Y", /* prefixYotta */ + }; + + /*while((value > (10 * prefixBase)) && (resPrefix < prefixSiMax)) { + value /= prefixBase; + resPrefix++; + }*/ + while((value > (prefixBase/10)) && (resPrefix < prefixSiMax)) { + value /= prefixBase; + resPrefix++; + } + + return QString("%1 %2%3").arg(value).arg(prefixTab[resPrefix]).arg(unitBase); +} + +QString Settings::getValue1024( + + double value, /*!<[in] Value to print. */ + int valuePrefix, /*!<[in] Value current prefix. */ + QString unitBase) /*!<[in] Unit base string. */ +{ + const int prefixBase = 1024; + int resPrefix = valuePrefix; + + static const char *prefixTab[prefixIecMax + 1] = { + "", /* prefixNothing */ + "Ki", /* prefixKibi */ + "Mi", /* prefixMebi */ + "Gi", /* prefixGibi */ + "Ti", /* prefixTebi */ + "Pi", /* prefixPebi */ + "Ei", /* prefixExbi */ + "Zi", /* prefixZebi */ + "Yi", /* prefixYobi */ + }; + + while((value > (10 * prefixBase)) && (resPrefix < prefixIecMax)) { + value /= prefixBase; + resPrefix++; + } + + return QString("%1 %2%3").arg(value).arg(prefixTab[resPrefix]).arg(unitBase); +} + +int Settings::getMinimumWidgetWidth() { + + return m_minimumWidgetWidth; +} + +int Settings::getMinimumGroupBoxWidth() { + + return m_minimumGroupBoxWidth; +} + +void Settings::debugSystemState() { + + qDebug() << " "; + SETTINGS_DEBUG << "**********************************************************"; + SETTINGS_DEBUG << "Error:\t\t\t" << qPrintable(getErrorString(m_systemError)); + SETTINGS_DEBUG << "HW Interface:\t\t" << qPrintable(getHWInterfaceModeString(m_hwInterface)); + SETTINGS_DEBUG << "Server Mode:\t\t" << qPrintable(getServerModeString(m_serverMode)); + SETTINGS_DEBUG << "DataEngine State:\t" << qPrintable(getHDataEngineStateString(m_dataEngineState)); + qDebug() << " "; +} + +QString Settings::getSDRStyle() { + + return sdrStyle; +} + +QString Settings::getWidgetStyle() { + + return widgetStyle; +} + +QString Settings::getMainWindowStyle() { + + return mainWindowStyle; +} + +QString Settings::getDockStyle() { + + return dockStyle; +} + +QString Settings::getDisplayToolbarStyle() { + + return displayToolbarStyle; +} + +QString Settings::getMainBtnToolbarStyle() { + + return mainBtnToolbarStyle; +} + +QString Settings::getStatusbarStyle() { + + return statusbarStyle; +} + +QString Settings::getMessageBoxStyle() { + + return messageBoxStyle; +} + +QString Settings::getLineEditStyle() { + + return lineEditStyle; +} + +QString Settings::getDialogStyle() { + + return dialogStyle; +} + +QString Settings::getColorDialogStyle() { + + return colorDialogStyle; +} + +QString Settings::getItemStyle() { + + return itemStyle; +} + +QString Settings::getLabelStyle() { + + return labelStyle; +} + +QString Settings::getSliderLabelStyle() { + + return sliderLabelStyle; +} + +QString Settings::getTableStyle() { + + return tableStyle; +} + +QString Settings::getComboBoxStyle() { + + return comboBoxStyle; +} + +QString Settings::getSpinBoxStyle() { + + return spinBoxStyle; +} + +QString Settings::getDoubleSpinBoxStyle() { + + return dSpinBoxStyle; +} + +QString Settings::getMenuStyle() { + + return menuStyle; +} + +QString Settings::getMiniButtonStyle() { + + return miniButtonStyle; +} + +QString Settings::getVolSliderStyle() { + + return volSliderStyle; +} + +QString Settings::getSplitterStyle() { + + return splitterStyle; +} + +QString Settings::getFrameStyle() { + + return frameStyle; +} + +QString Settings::getTabWidgetStyle() { + + return tabWidgetStyle; +} + +//QString Settings::getNewSliderStyle() { +// +// return m_newSliderStyle; +//} + + +//******************************************************* + +void Settings::setMainPower(QObject *sender, bool power) { + + if (m_mainPower == power) return; + + m_mainPower = power; + if (power) + m_mainPower = true; + else + m_mainPower = false; + + emit masterSwitchChanged(sender, m_mainPower); +} + +bool Settings::getMainPower() { + + return m_mainPower; +} + +void Settings::setSystemMessage(const QString &msg, int time) { + + emit systemMessageEvent(msg, time); +} + +void Settings::setSystemState( + + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state) +{ + Q_UNUSED (sender) + + //QMutexLocker locker(&settingsMutex); + + if (m_systemError != err) + m_systemError = err; + + if (m_hwInterface != hwmode) + m_hwInterface = hwmode; + + if (m_serverMode != mode) { + + m_serverMode = mode; + + if (m_serverMode == QSDR::ChirpWSPR) + setWidebandStatus(this, false); + } + + if (m_dataEngineState != state) + m_dataEngineState = state; + + if (m_dataEngineState == QSDR::DataEngineDown) + setCurrentReceiver(this, 0); + //m_currentReceiver = 0; + + //locker.unlock(); + + debugSystemState(); + emit systemStateChanged(this, m_systemError, m_hwInterface, m_serverMode, m_dataEngineState); +} + +QSDR::_ServerMode Settings::getCurrentServerMode() { + + return m_serverMode; +} + +QSDR::_HWInterfaceMode Settings::getHWInterface() { + + return m_hwInterface; +} + +QSDR::_DataEngineState Settings::getDataEngineState() { + + return m_dataEngineState; +} + +QString Settings::getErrorString(QSDR::_Error err) { + + QString str; + switch (err) { + + case 0: + str = "No error"; + break; + + case 1: + str = "Not implemented"; + break; + + case 2: + str = "Hardware IO error"; + break; + + case 3: + str = "Server mode error"; + break; + + case 4: + str = "open device error"; + break; + + case 5: + str = "dataReceiverThread error"; + break; + + case 6: + str = "dataProcessThread error"; + break; + + case 7: + str = "widebandDataProcessThread error"; + break; + + case 8: + str = "audioThread error"; + break; + + case 9: + str = "ChirpDataProcessThread error"; + break; + + case 10: + str = "underrun error"; + break; + + case 11: + str = "firmware error"; + break; + + case 12: + str = "fatal error"; + break; + } + return str; +} + +QString Settings::getHDataEngineStateString(QSDR::_DataEngineState mode) { + + QString str; + switch (mode) { + + case 0: + str = "down"; + break; + + case 1: + str = "up"; + break; + } + return str; +} + +QString Settings::getServerModeString(QSDR::_ServerMode mode) { + + QString str; + switch (mode) { + + case 0: + str = "no server mode"; + break; + + case 1: + str = "SDR mode"; + break; + + case 2: + str = "ChirpWSPR"; + break; + + case 3: + str = "ChirpWSPRFile"; + break; + + case 4: + str = "demo"; + break; + } + return str; +} + +QString Settings::getHWInterfaceModeString(QSDR::_HWInterfaceMode mode) { + + QString str; + switch (mode) { + + case 0: + str = "no interface"; + break; + + case 1: + str = "Metis"; + break; + + case 2: + str = "Hermes"; + break; + } + return str; +} + +void Settings::setTxAllowed(QObject *sender, bool value) { + + if (m_devices.penelopePresence || m_devices.pennylanePresence || (m_hwInterface == QSDR::Hermes)) + m_transmitter.txAllowed = value; + else + m_transmitter.txAllowed = false; + + emit txAllowedChanged(sender, m_transmitter.txAllowed); +} + +bool Settings::getTxAllowed() { + + return m_transmitter.txAllowed; +} + +void Settings::setGraphicsState( + + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode) +{ + Q_UNUSED (sender) + + //QMutexLocker locker(&settingsMutex); + + if (rx == -1) { + + m_widebandOptions.panMode = panMode; + } + else { + + m_receiverDataList[rx].panMode = panMode; + m_receiverDataList[rx].waterfallMode = waterfallColorMode; + } + + //locker.unlock(); + + //SETTINGS_DEBUG << "graphics mode:" << panMode << waterfallColorMode; + emit graphicModeChanged(this, rx, panMode, waterfallColorMode); +} + +PanGraphicsMode Settings::getPanadapterMode(int rx) { + + return m_receiverDataList[rx].panMode; +} + +WaterfallColorMode Settings::getWaterfallColorMode(int rx) { + + return m_receiverDataList.at(rx).waterfallMode; +} + +//QSDRGraphics::_Colors Settings::getColorItem() { +// +// return m_colorItem; +//} + +void Settings::setDefaultSkin(QObject *sender, bool value) { + + Q_UNUSED (sender) + + m_defaultSkin = value; +} + +bool Settings::getDefaultSkin() { + + return m_defaultSkin; +} + +void Settings::setSettingsFilename(QString filename) { + + filename = filename.trimmed(); + + //QMutexLocker locker(&settingsMutex); + + settingsFilename = filename; + //locker.unlock(); + + emit settingsFilenameChanged(filename); +} + +void Settings::setSettingsLoaded(bool value) { + + QMutexLocker locker(&settingsMutex); + + setLoaded = value; + + locker.unlock(); + + emit settingsLoadedChanged(setLoaded); +} + +bool Settings::getSettingsLoaded() { + + return setLoaded; +} + +void Settings::setCPULoad(short load) { + + emit cpuLoadChanged(load); +} + +void Settings::setCallsign(const QString &callsign) { + + QString cs = callsign.trimmed(); + + QMutexLocker locker(&settingsMutex); + + if (m_callsignString == cs) return; + + m_callsignString = cs; + + locker.unlock(); + emit callsignChanged(); +} + +void Settings::setRxList(QList rxList) { + + emit rxListChanged(rxList); +} + +void Settings::setMultiRxView(int view) { + + QMutexLocker locker(&settingsMutex); + + if (m_multiRxView == view) return; + m_multiRxView = view; + + locker.unlock(); + emit multiRxViewChanged(m_multiRxView); +} + +int Settings::getMultiRxView() { + + return m_multiRxView; +} + +void Settings::setMetisCardList(QList list) { + + QMutexLocker locker(&settingsMutex); + + m_metisCards = list; + + locker.unlock(); + emit metisCardListChanged(m_metisCards); +} + +void Settings::searchHpsdrNetworkDevices() { + + emit searchMetisSignal(); +} + +void Settings::clearMetisCardList() { + + m_metisCards.clear(); + + //emit metisCardListChanged(m_metisCards); +} + +void Settings::setCurrentHPSDRDevice(TNetworkDevicecard card) { + + m_currentHPSDRDevice = card; + + emit hpsdrNetworkDeviceChanged(m_currentHPSDRDevice); +} + +void Settings::setHPSDRDeviceNumber(int value) { + + m_hpsdrNetworkDevices = value; + emit networkDeviceNumberChanged(value); +} + +void Settings::showNetworkIODialog() { + + emit showNetworkIO(); +} + +void Settings::showWarningDialog(const QString &msg) { + + emit showWarning(msg); +} + +void Settings::addNetworkIOComboBoxEntry(QString str) { + + emit networkIOComboBoxEntryAdded(str); +} + +void Settings::clearNetworkIOComboBoxEntry() { + + emit clearNetworkIOComboBoxEntrySignal(); +} + +void Settings::setPBOPresence(bool value) { + + m_pboFound = value; +} + +bool Settings::getPBOPresence() { + + return m_pboFound; +} + +void Settings::setFBOPresence(bool value) { + + m_fboFound = value; +} + +bool Settings::getFBOPresence() { + + return m_fboFound; +} + +//******************************* +// Network settings + +void Settings::setNumberOfNetworkInterfaces(int value) { + + m_NetworkInterfacesNo = value; +} + +void Settings::addServerNetworkInterface(QString nicName, QString ipAddress) { + + emit newServerNetworkInterface(nicName, ipAddress); +} + +void Settings::addHPSDRDeviceNIC(QString nicName, QString ipAddress) { + + emit newHPSDRDeviceNIC(nicName, ipAddress); +} + +void Settings::setServerNetworkInterface(int index) { + + setServerAddr(this, this->m_ipAddressesList.at(index).toString()); + + //qDebug() << "m_networkInterfaces.at(index).humanReadableName():" << m_networkInterfaces.at(index).humanReadableName(); + //qDebug() << "m_ipAddressesList.at(index).toString():" << m_ipAddressesList.at(index).toString(); + + QString message = "[settings]: network interface set to: %1 (%2)."; + /*emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + +} + +void Settings::setHPSDRDeviceNIC(int index) { + + setHPSDRDeviceLocalAddr(this, this->m_ipAddressesList.at(index).toString()); + + QString message = "[settings]: HPSDR device network interface set to: %1 (%2)."; + /*emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + +} + +void Settings::setServerWidgetNIC(int index) { + + /*QString message = "[server]: network interface set to: %1 (%2)."; + emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + + emit serverNICChanged(index); +} + +void Settings::setHPSDRWidgetNIC(int index) { + + /*QString message = "[server]: HPSDR device network interface set to: %1 (%2)."; + emit messageEvent( + message.arg( + m_networkInterfaces.at(index).humanReadableName(), + m_ipAddressesList.at(index).toString() ));*/ + + emit hpsdrDeviceNICChanged(index); +} + +void Settings::setServerAddr(QObject *sender, QString addr) { + + QMutexLocker locker(&settingsMutex); + + m_serverAddress = addr; + + locker.unlock(); + emit serverAddrChanged(sender, m_serverAddress); +} + +QString Settings::getServerAddr() { + + return m_serverAddress; +} + +void Settings::setHPSDRDeviceLocalAddr(QObject *sender, QString addr) { + + QMutexLocker locker(&settingsMutex); + + m_hpsdrDeviceLocalAddr = addr; + + locker.unlock(); + emit hpsdrDeviceLocalAddrChanged(sender, m_hpsdrDeviceLocalAddr); +} + +QString Settings::getHPSDRDeviceLocalAddr() { + + return m_hpsdrDeviceLocalAddr; +} + +void Settings::setServerPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + + m_serverPort = port; + + locker.unlock(); + emit serverPortChanged(sender, m_serverPort); +} + +quint16 Settings::getServerPort() { + + return m_serverPort; +} + +void Settings::setListenPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + + m_listenerPort = port; + + locker.unlock(); + emit listenPortChanged(sender, m_listenerPort); +} + +quint16 Settings::getListenPort() { + + return m_listenerPort; +} + +void Settings::setAudioPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + m_audioPort = port; + locker.unlock(); + + emit audioPortChanged(sender, m_audioPort); +} + +quint16 Settings::getAudioPort() { + + return m_audioPort; +} + +void Settings::setMetisPort(QObject *sender, quint16 port) { + + QMutexLocker locker(&settingsMutex); + m_metisPort = port; + locker.unlock(); + + emit metisPortChanged(sender, m_metisPort); +} + +quint16 Settings::getMetisPort() { + + return m_metisPort; +} + +void Settings::setClientConnected(QObject *sender, bool value) { + + QMutexLocker locker(&settingsMutex); + m_clientConnected = value; + locker.unlock(); + + emit clientConnectedChanged(sender, m_clientConnected); +} + +bool Settings::getClientConnected() { + + return m_clientConnected; +} + +void Settings::setClientNoConnected(QObject* sender, int client) { + + QMutexLocker locker(&settingsMutex); + m_clientNoConnected = client; + locker.unlock(); + + emit clientNoConnectedChanged(sender, m_clientNoConnected); +} + +void Settings::setAudioRx(QObject* sender, int rx) { + + emit audioRxChanged(sender, rx); +} + +void Settings::setConnected(QObject *sender, bool value) { + + QMutexLocker locker(&settingsMutex); + m_connected = value; + locker.unlock(); + + emit connectedChanged(sender, m_connected); +} + +bool Settings::getConnected() { + + return m_connected; +} + +void Settings::clientDisconnected(int client) { + + emit clientDisconnectedEvent(client); +} + +void Settings::setRxConnectedStatus(QObject* sender, int rx, bool value) { + + emit rxConnectedStatusChanged(sender, rx, value); +} + +void Settings::setSocketBufferSize(QObject *sender, int value) { + + m_socketBufferSize = value; + //SETTINGS_DEBUG << "m_socketBufferSize = " << value; + emit socketBufferSizeChanged(sender, value); +} + +void Settings::setManualSocketBufferSize(QObject *sender, bool value) { + + m_manualSocketBufferSize = value; + //SETTINGS_DEBUG << "m_manualSocketBufferSize = " << value; + emit manualSocketBufferChanged(sender, m_manualSocketBufferSize); +} + + +//******************************* +// HPSDR hardware presence and firmware versions + +THPSDRDevices Settings::getHPSDRDevices() { + + return m_devices; +} + +void Settings::setHPSDRDevices(QObject *sender, THPSDRDevices devices) { + + Q_UNUSED(sender) + Q_UNUSED(devices) +} + +void Settings::checkHPSDRDevices() { + + SETTINGS_DEBUG << "mercuryPresence: " << m_devices.mercuryPresence; + SETTINGS_DEBUG << "penelopePresence: " << m_devices.penelopePresence; + SETTINGS_DEBUG << "pennylanePresence: " << m_devices.pennylanePresence; + SETTINGS_DEBUG << "excaliburPresence: " << m_devices.excaliburPresence; + SETTINGS_DEBUG << "alexPresence: " << m_devices.alexPresence; + SETTINGS_DEBUG << "hermesPresence: " << m_devices.hermesPresence; + + if (m_hpsdrHardware == 0) { // 0 = Mercury/Penelope + + if (m_devices.penelopePresence && m_devices.pennylanePresence) { + + m_devices.pennylanePresence = false; + m_devices.penelopePresence = true; + SETTINGS_DEBUG << "settings specifies both Penelope and Pennylane - choosing Penelope !"; + } + + if (m_devices.hermesPresence) { + + m_devices.hermesPresence = false; + SETTINGS_DEBUG << "settings specifies also Hermes - choosing Mercury/Penelope/Pennylane !"; + } + } + else if (m_hpsdrHardware == 1) { // 1 = Hermes + + if (m_devices.mercuryPresence || + m_devices.penelopePresence || + m_devices.pennylanePresence || + m_devices.excaliburPresence) + { + m_devices.mercuryPresence = false; + m_devices.penelopePresence = false; + m_devices.pennylanePresence = false; + m_devices.excaliburPresence = false; + SETTINGS_DEBUG << "settings specifies HPSDR Modules - choosing Hermes !"; + } + } +} + + +void Settings::setHPSDRHardware(int value) { + + m_hpsdrHardware = value; // 0 = Mercury/Penelope, 1 = Hermes, 2 = Cyclops + + emit hpsdrHardwareChanged(m_hpsdrHardware); +} + +void Settings::setHermesVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.hermesFWVersion = value; + locker.unlock(); + + emit hermesVersionChanged(m_devices.hermesFWVersion); +} + +void Settings::setMercuryPresence(bool value) { + + m_devices.mercuryPresence = value; + + emit mercuryPresenceChanged(m_devices.mercuryPresence); +} + +void Settings::setMercuryVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.mercuryFWVersion = value; + locker.unlock(); + + emit mercuryVersionChanged(m_devices.mercuryFWVersion); +} + +void Settings::setPenelopePresence(bool value) { + + m_devices.penelopePresence = value; + setTxAllowed(this, value); + + emit penelopePresenceChanged(m_devices.penelopePresence); +} + +void Settings::setPenelopeVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.penelopeFWVersion = value; + locker.unlock(); + + emit penelopeVersionChanged(m_devices.penelopeFWVersion); +} + +void Settings::setPennyLanePresence(bool value) { + + m_devices.pennylanePresence = value; + setTxAllowed(this, value); + + emit pennyLanePresenceChanged(m_devices.pennylanePresence); +} + +void Settings::setPennyLaneVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.pennylaneFWVersion = value; + locker.unlock(); + + emit pennyLaneVersionChanged(m_devices.pennylaneFWVersion); +} + +void Settings::setAlexPresence(bool value) { + + m_devices.alexPresence = value; + + emit alexPresenceChanged(m_devices.alexPresence); +} + +void Settings::setExcaliburPresence(bool value) { + + m_devices.excaliburPresence = value; + + emit excaliburPresenceChanged(m_devices.excaliburPresence); +} + +void Settings::setMetisVersion(int value) { + + QMutexLocker locker(&settingsMutex); + m_devices.metisFWVersion = value; + locker.unlock(); + + emit metisVersionChanged(m_devices.metisFWVersion); +} + +void Settings::setCheckFirmwareVersion(QObject *sender, bool value) { + + m_checkFirmwareVersions = value; + + emit checkFirmwareVersionChanged(sender, value); +} + +void Settings::setProtocolSync(int value) { + + emit protocolSyncChanged(value); +} + +void Settings::setADCOverflow(int value) { + + emit adcOverflowChanged(value); +} + +void Settings::setPacketLoss(int value) { + + emit packetLossChanged(value); +} + +void Settings::setSendIQ(int value) { + + emit sendIQSignalChanged(value); +} + +void Settings::setRcveIQ(int value) { + + emit rcveIQSignalChanged(value); +} + +/** + * Set the number of receivers to be supported by this server + * \param r The number of receivers: 0 to 6 + * This value is embedded into the command & control bytes that are sent to Mercury. + * Thus it determines how the I & Q samples read from EP6 are placed in the data stream to dspservers. + */ +void Settings::setReceivers(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_mercuryReceivers == value) return; + if (value > MAX_RECEIVERS) value = MAX_RECEIVERS; + + m_mercuryReceivers = value; + locker.unlock(); + + SETTINGS_DEBUG << "set number of receivers to: " << m_mercuryReceivers; + emit numberOfRXChanged(sender, value); +} + +//void Settings::setReceiver(QObject *sender, int value) { +// +// QMutexLocker locker(&settingsMutex); +// +// if (m_currentReceiver == value) return; +// if (value > MAX_RECEIVERS) value = MAX_RECEIVERS; +// +// m_currentReceiver = value; +// locker.unlock(); +// +// SETTINGS_DEBUG << "switch to receiver: " << m_currentReceiver; +// emit receiverChanged(value); +// emit frequencyChanged(this, true, value, m_receiverDataList[value].frequency); +//} + +void Settings::setCurrentReceiver(QObject *sender, int value) { + + //SETTINGS_DEBUG << "sender: " << sender; + QMutexLocker locker(&settingsMutex); + + if (value > MAX_RECEIVERS) { + + SETTINGS_DEBUG << "receiver number > MAX_RECEIVERS; setting to MAX_RECEIVERS."; + value = MAX_RECEIVERS; + } + + m_currentReceiver = value; + + HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; + DSPMode mode = m_receiverDataList.at(m_currentReceiver).dspModeList[band]; + locker.unlock(); + + setMercuryAttenuator(this, m_receiverDataList.at(m_currentReceiver).mercuryAttenuators.at(band)); + setFramesPerSecond(this, m_currentReceiver, m_receiverDataList.at(m_currentReceiver).framesPerSecond); + + SETTINGS_DEBUG << "switch to receiver: " << m_currentReceiver; + emit currentReceiverChanged(sender, value); + //emit frequencyChanged(sender, true, value, m_receiverDataList.at(m_currentReceiver).frequency); + long vfoF = m_receiverDataList.at(m_currentReceiver).vfoFrequency; + long ctrF = m_receiverDataList.at(m_currentReceiver).ctrFrequency; + + emit ctrFrequencyChanged(sender, true, value, ctrF); + emit vfoFrequencyChanged(sender, true, value, vfoF); + emit ncoFrequencyChanged(m_currentReceiver, vfoF - ctrF); + emit hamBandChanged(sender, m_currentReceiver, false, band); + emit dspModeChanged(sender, m_currentReceiver, mode); + emit mouseWheelFreqStepChanged(sender, m_currentReceiver, m_receiverDataList.at(m_currentReceiver).mouseWheelFreqStep); +} + +void Settings::setSampleRate(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + switch (value) { + + case 48000: + m_sampleRate = value; + m_mercurySpeed = 0; + m_outputSampleIncrement = 1; + m_chirpDownSampleRate = 4; + break; + + case 96000: + m_sampleRate = value; + m_mercurySpeed = 1; + m_outputSampleIncrement = 2; + m_chirpDownSampleRate = 8; + break; + + case 192000: + m_sampleRate = value; + m_mercurySpeed = 2; + m_outputSampleIncrement = 4; + m_chirpDownSampleRate = 16; + break; + + case 384000: + m_sampleRate = value; + m_mercurySpeed = 3; + m_outputSampleIncrement = 8; + m_chirpDownSampleRate = 32; + break; + + default: + SETTINGS_DEBUG << "Invalid sample rate (must be 48, 96,192, or 384 kHz)!\n"; + break; + } + + for (int i = 0; i < MAX_RECEIVERS; i++) + m_receiverDataList[i].sampleRate = m_sampleRate; + + emit sampleRateChanged(sender, value); +} + +void Settings::setMercuryAttenuator(QObject *sender, int value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(m_currentReceiver).mercuryAttenuators.length() != MAX_BANDS) + return; + + HamBand band = m_receiverDataList[m_currentReceiver].hamBand; + m_receiverDataList[m_currentReceiver].mercuryAttenuators[band] = value; + + emit mercuryAttenuatorChanged(sender, band, value); +} + +QList Settings::getMercuryAttenuators(int rx) { + + return m_receiverDataList[rx].mercuryAttenuators; +} + +void Settings::setDither(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + m_mercuryDither = value; + + emit ditherChanged(sender, value); +} + +void Settings::setRandom(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + m_mercuryRandom = value; + + emit randomChanged(sender, value); +} + +void Settings::set10MhzSource(QObject *sender, int source) { + + QMutexLocker locker(&settingsMutex); + + m_10MHzSource = source; + emit src10MhzChanged(sender, source); +} + +void Settings::set122_88MhzSource(QObject *sender, int source) { + + QMutexLocker locker(&settingsMutex); + + m_122_8MHzSource = source; + emit src122_88MhzChanged(sender, source); +} + +void Settings::setMicSource(QObject *sender, int source) { + + QMutexLocker locker(&settingsMutex); + + m_micSource = source; + emit micSourceChanged(sender, source); +} + +void Settings::setClass(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + m_RxClass = value; + emit classChanged(sender, value); +} + +void Settings::setTiming(QObject *sender, int value) { + + QMutexLocker locker(&settingsMutex); + + m_RxTiming = value; + emit timingChanged(sender, value); +} + +void Settings::setMouseWheelFreqStep(QObject *sender, int rx, qreal value) { + + QMutexLocker locker(&settingsMutex); + + //m_mouseWheelFreqStep = value; + m_receiverDataList[rx].mouseWheelFreqStep = value; + emit mouseWheelFreqStepChanged(sender, rx, value); +} + +double Settings::getMouseWheelFreqStep(int rx) { + + return m_receiverDataList[rx].mouseWheelFreqStep; +} + +qreal Settings::getMainVolume(int rx) { + + return m_receiverDataList[rx].audioVolume; +} + +void Settings::setMainVolume(QObject *sender, int rx, float volume) { + + if (volume < 0) volume = 0.0f; + if (volume > 1) volume = 1.0f; + + QMutexLocker locker(&settingsMutex); + + //if (m_receiverDataList[rx].audioVolume == volume) return; + m_receiverDataList[rx].audioVolume = volume; + + emit mainVolumeChanged(sender, rx, volume); +} + +void Settings::setMainVolumeMute(QObject *sender, int rx, bool value) { + + Q_UNUSED(sender) + Q_UNUSED(value) + + qreal vol = getMainVolume(rx); + if (value) + setMainVolume(this, rx, 0.0f); + else + setMainVolume(this, rx, vol); +} + +void Settings::setCtrFrequency(int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = getBandFromFrequency(m_bandList, frequency); + + m_receiverDataList[rx].ctrFrequency = frequency; + //m_receiverDataList[rx].hamBand = band; + //m_receiverDataList[rx].lastHamBand = band; + m_receiverDataList[rx].lastCenterFrequencyList[(int) band] = frequency; +} + +void Settings::setVfoFrequency(int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = getBandFromFrequency(m_bandList, frequency); + + m_receiverDataList[rx].vfoFrequency = frequency; + m_receiverDataList[rx].hamBand = band; + m_receiverDataList[rx].lastHamBand = band; + m_receiverDataList[rx].lastVfoFrequencyList[(int) band] = frequency; + + m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; +} + +void Settings::setCtrFrequency(QObject *sender, int mode, int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + m_receiverDataList[rx].ctrFrequency = frequency; + + HamBand band = getBandFromFrequency(m_bandList, frequency); + m_receiverDataList[rx].lastCenterFrequencyList[(int) band] = frequency; + locker.unlock(); + + switch (mode) { + + case 0: + break; + + case 1: + + setVFOFrequency(this, 0, rx, frequency); + break; + } + + //SETTINGS_DEBUG << "ctr freq (Rx " << rx << ") " << m_receiverDataList[rx].ctrFrequency; + emit ctrFrequencyChanged(sender, mode, rx, frequency); +} + +long Settings::getCtrFrequency(int rx) { + + return m_receiverDataList.at(rx).ctrFrequency; +} + +void Settings::setVFOFrequency(QObject *sender, int mode, int rx, long frequency) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).vfoFrequency == frequency) return; + m_receiverDataList[rx].vfoFrequency = frequency; + //SETTINGS_DEBUG << "vfo freq (Rx " << rx << ") " << m_receiverDataList[rx].vfoFrequency; + + HamBand band = getBandFromFrequency(m_bandList, frequency); + m_receiverDataList[rx].lastVfoFrequencyList[(int) band] = frequency; + + locker.unlock(); + if (m_receiverDataList.at(rx).hamBand != band) { + + //m_receiverDataList[rx].ctrFrequency = m_receiverDataList[rx].vfoFrequency; + setHamBand(this, rx, false, band); + } + + switch (mode) { + + case 0: // change only VFO + + m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; + //SETTINGS_DEBUG << "nco freq = " << m_receiverDataList[rx].ncoFrequency; + break; + + case 1: // change VFO and center freq; keep NCO frequency + + setCtrFrequency(this, 0, rx, frequency - m_receiverDataList.at(rx).ncoFrequency); + break; + + case 2: // change VFO, set center frequency from lastCenterFrequencyList + + setCtrFrequency(this, 0, rx, m_receiverDataList.at(rx).lastCenterFrequencyList.at((int) band)); + m_receiverDataList[rx].ncoFrequency = frequency - m_receiverDataList.at(rx).ctrFrequency; + break; + } + + emit vfoFrequencyChanged(sender, mode, rx, frequency); + + //SETTINGS_DEBUG << "nco freq (Rx " << rx << ") " << m_receiverDataList[rx].ncoFrequency; + emit ncoFrequencyChanged(rx, m_receiverDataList[rx].ncoFrequency); +} + +long Settings::getVfoFrequency(int rx) { + + return m_receiverDataList.at(rx).vfoFrequency; +} + +void Settings::setNCOFrequency(QObject *sender, bool value, int rx, long frequency) { + + Q_UNUSED(sender) + Q_UNUSED(value) + + //SETTINGS_DEBUG << "nco freq (Rx " << rx << ") " << m_receiverDataList[rx].ncoFrequency << "(direct)"; + m_receiverDataList[rx].ncoFrequency = frequency; + + emit ncoFrequencyChanged(rx, frequency); +} + +void Settings::setHamBand(QObject *sender, int rx, bool byButton, HamBand band) { + + //SETTINGS_DEBUG << "sender: " << sender; + QMutexLocker locker(&settingsMutex); + if (m_receiverDataList[rx].hamBand == band && sender != this) + return; + + m_receiverDataList[rx].lastHamBand = m_receiverDataList[rx].hamBand; + m_receiverDataList[rx].hamBand = band; + + //SETTINGS_DEBUG << "last Ham band: " << m_receiverDataList[rx].lastHamBand; + //SETTINGS_DEBUG << "Ham band: " << m_receiverDataList[rx].hamBand; + + if (m_receiverDataList[rx].hamBand == (HamBand) gen) + setTxAllowed(this, false); + else + setTxAllowed(this, true); + + locker.unlock(); + + setDSPMode(this, rx, m_receiverDataList.at(rx).dspModeList.at(band)); + setMercuryAttenuator(this, m_receiverDataList[rx].mercuryAttenuators[band]); + + emit hamBandChanged(sender, rx, byButton, band); +} + +HamBand Settings::getCurrentHamBand(int rx) { + + return m_receiverDataList[rx].hamBand; +} + +void Settings::setDSPMode(QObject *sender, int rx, DSPMode mode) { + + //SETTINGS_DEBUG << "sender: " << sender; + HamBand band = m_receiverDataList[m_currentReceiver].hamBand; + + m_receiverDataList[rx].dspModeList[band] = mode; + setRXFilter(this, rx, m_defaultFilterList.at((int) mode).filterLo, m_defaultFilterList.at((int) mode).filterHi); + + emit dspModeChanged(sender, rx, mode); +} + +AGCMode Settings::getAGCMode(int rx) { + + return m_receiverDataList.at(rx).agcMode; +} + +QString Settings::getAGCModeString(int rx) { + + AGCMode mode = getAGCMode(rx); + QString str; + switch (mode) { + + case (AGCMode) agcOFF: + str = "Off"; + break; + + case (AGCMode) agcLONG: + str = "Long"; + break; + + case (AGCMode) agcSLOW: + str = "Slow"; + break; + + case (AGCMode) agcMED: + str = "Med"; + break; + + case (AGCMode) agcFAST: + str = "Fast"; + break; + + case (AGCMode) agcUser: + str = "User"; + break; + } + return str; +} + +void Settings::setAGCMode(QObject *sender, int rx, AGCMode mode) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcMode == mode) return; + m_receiverDataList[rx].agcMode = mode; + + bool hang; + if (mode == (AGCMode) agcOFF || mode == (AGCMode) agcMED || mode == (AGCMode) agcFAST) { + + m_receiverDataList[rx].hangEnabled = false; + hang = false; + if (mode == (AGCMode) agcOFF) + emit agcFixedGainChanged_dB(sender, rx, m_receiverDataList[rx].agcFixedGain_dB); + } + else { + + m_receiverDataList[rx].hangEnabled = true; + hang = true; + } + + emit agcModeChanged(sender, rx, mode, hang); + emit agcHangEnabledChanged(sender, rx, hang); +} + +void Settings::setAGCShowLines(QObject *sender, int rx, bool value) { + + if (m_receiverDataList[rx].agcLines == value) return; + m_receiverDataList[rx].agcLines = value; + + emit showAGCLinesStatusChanged(sender, m_receiverDataList[rx].agcLines, rx); +} + +int Settings::getAGCGain(int rx) { + + return m_receiverDataList[rx].acgGain; +} + +void Settings::setAGCGain(QObject *sender, int rx, int value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].acgGain == value) return; + m_receiverDataList[rx].acgGain = value; + //SETTINGS_DEBUG << "acgGain " << value; + emit agcGainChanged(sender, rx, value); +} + +void Settings::setAGCMaximumGain_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcMaximumGain_dB == value) return; + m_receiverDataList[rx].agcMaximumGain_dB = value; + + //SETTINGS_DEBUG << "agcMaximumGain_dB = " << m_receiverDataList[rx].agcMaximumGain_dB << " (sender: " << sender << ")"; + emit agcMaximumGainChanged_dB(sender, rx, value); +} + +qreal Settings::getAGCMaximumGain_dB(int rx) { + + return m_receiverDataList[rx].agcMaximumGain_dB; +} + +void Settings::setAGCFixedGain_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcFixedGain_dB == value) return; + m_receiverDataList[rx].agcFixedGain_dB = value; + + //SETTINGS_DEBUG << "m_receiverDataList[rx].agcFixedGain_dB = " << m_receiverDataList[rx].agcFixedGain_dB; + emit agcFixedGainChanged_dB(sender, rx, value); +} + +qreal Settings::getAGCFixedGain_dB(int rx) { + + return m_receiverDataList[rx].agcFixedGain_dB; +} + +void Settings::setAGCThreshold_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].acgThreshold_dB == value) return; + m_receiverDataList[rx].acgThreshold_dB = value; + + //SETTINGS_DEBUG << "acgThreshold = " << m_receiverDataList[rx].acgThreshold; + emit agcThresholdChanged_dB(sender, rx, value); +} + +void Settings::setAGCHangThresholdSlider(QObject *sender, int rx, qreal value) { + + emit agcHangThresholdSliderChanged(sender, rx, value); +} + +int Settings::getAGCHangThreshold(int rx) { + + return m_receiverDataList[rx].agcHangThreshold; +} + +void Settings::setAGCHangThreshold(QObject *sender, int rx, int value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcHangThreshold == value) return; + m_receiverDataList[rx].agcHangThreshold = value; + + //SETTINGS_DEBUG << "agcHangThreshold = " << m_receiverDataList[rx].agcHangThreshold; + emit agcHangThresholdChanged(sender, rx, value); +} + +int Settings::getAGCHangLeveldB(int rx) { + + return m_receiverDataList[rx].agcHangThreshold; +} + +void Settings::setAGCHangLevel_dB(QObject *sender, int rx, qreal value) { + + //QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].agcHangLevel == value) return; + m_receiverDataList[rx].agcHangLevel = value; + + //SETTINGS_DEBUG << "agcHangLevel = " << m_receiverDataList[rx].agcHangLevel; + emit agcHangLevelChanged_dB(sender, rx, value); +} + +void Settings::setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang) { + + if (m_currentReceiver != rx) return; + + m_receiverDataList[rx].agcHangLevel = hang; + //SETTINGS_DEBUG << "agcHangLevel = " << m_receiverDataList[rx].agcHangLevel; + + emit agcLineLevelsChanged(sender, rx, thresh, hang); +} + +void Settings::setAGCVariableGain_dB(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcVariableGain == value) return; + m_receiverDataList[rx].agcVariableGain = value; + + SETTINGS_DEBUG << "agcVariableGain = " << m_receiverDataList[rx].agcVariableGain; + emit agcVariableGainChanged_dB(sender, rx, value); +} + +void Settings::setAGCAttackTime(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcAttackTime == value) return; + m_receiverDataList[rx].agcAttackTime = value; + + SETTINGS_DEBUG << "agcAttackTime = " << m_receiverDataList[rx].agcAttackTime; + emit agcAttackTimeChanged(sender, rx, value); +} + +void Settings::setAGCDecayTime(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcDecayTime == value) return; + m_receiverDataList[rx].agcDecayTime = value; + + SETTINGS_DEBUG << "agcDecayTime = " << m_receiverDataList[rx].agcDecayTime; + emit agcDecayTimeChanged(sender, rx, value); +} + +void Settings::setAGCHangTime(QObject *sender, int rx, qreal value) { + + if (m_currentReceiver != rx) return; + + if (m_receiverDataList[rx].agcHangTime == value) return; + m_receiverDataList[rx].agcHangTime = value; + + SETTINGS_DEBUG << "agcHangTime = " << m_receiverDataList[rx].agcHangTime; + emit agcHangTimeChanged(sender, rx, value); +} + +void Settings::setRXFilter(QObject *sender, int rx, qreal low, qreal high) { + + QMutexLocker locker(&settingsMutex); + + if (m_filterFrequencyLow == low && m_filterFrequencyHigh == high) return; + + m_filterFrequencyLow = low; + m_filterFrequencyHigh = high; + m_receiverDataList[rx].filterLo = low; + m_receiverDataList[rx].filterHi = high; + + emit filterFrequenciesChanged(sender, rx, m_filterFrequencyLow, m_filterFrequencyHigh); +} + +void Settings::setIQPort(QObject *sender, int rx, int port) { + + emit iqPortChanged(sender, rx, port); +} + +void Settings::setSpectrumBuffer(int rx, const qVectorFloat& buffer) { + + emit spectrumBufferChanged(rx, buffer); +} + +void Settings::setPostSpectrumBuffer(int rx, const float* buffer) { + + emit postSpectrumBufferChanged(rx, buffer); +} + +void Settings::setSMeterValue(int rx, float value) { + + emit sMeterValueChanged(rx, value); +} + +void Settings::setReceiverDataReady() { + + emit receiverDataReady(); +} + +void Settings::setSampleSize(QObject* sender, int rx, int size) { + + Q_UNUSED (sender) + + if (rx == 0) { + + SETTINGS_DEBUG << "set sample size to: " << size; + switch (size) { + + case 4096: + m_fft = 1; + break; + + case 8192: + m_fft = 2; + break; + + case 16384: + m_fft = 4; + break; + + case 32768: + m_fft = 8; + break; + } + + emit sampleSizeChanged(0, size); + } +} + +// Alex configuration: +// +// manual 0 +// bypassAll 1 +// amp6m 2 +// hpf1_5MHz 3 +// hpf6_5MHz 4 +// hpf9_5MHz 5 +// hpf13MHz 6 +// hpf20MHz 7 +// lpf160m 8 +// lpf80m 9 +// lpf60_40m 10 +// lpf30_20m 11 +// lpf17_15m 12 +// lpf12_10m 13 +// lpf6m 14 + +// m_alexConfig (qint16) +// +// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +// | | | | | | | | | | | | | | | +// | | | | | | | | | | | | | | +-----Alex - manual HPF/LPF filter select (0 = disable, 1 = enable) +// | | | | | | | | | | | | | +------ Alex - Bypass all HPFs (0 = disable, 1 = enable)* +// | | | | | | | | | | | | +-------- Alex - 6M low noise amplifier (0 = disable, 1 = enable)* +// | | | | | | | | | | | +---------- Alex - select 1.5MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | | | | +------------ Alex - select 6.5MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | | | +-------------- Alex - select 9.5MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | | +---------------- Alex - select 13MHz HPF (0 = disable, 1 = enable)* +// | | | | | | | +------------------ Alex - select 20MHz HPF (0 = disable, 1 = enable)* +// | | | | | | +-------------------- Alex - select 160m LPF (0 = disable, 1 = enable)* +// | | | | | +---------------------- Alex - select 80m LPF (0 = disable, 1 = enable)* +// | | | | +------------------------ Alex - select 60/40m LPF (0 = disable, 1 = enable)* +// | | | +-------------------------- Alex - select 30/20m LPF (0 = disable, 1 = enable)* +// | | +---------------------------- Alex - select 17/15m LPF (0 = disable, 1 = enable)* +// | +------------------------------ Alex - select 12/10m LPF (0 = disable, 1 = enable)* +// +-------------------------------- Alex - select 6m LPF (0 = disable, 1 = enable)* + +void Settings::setAlexConfiguration(QObject *sender, quint16 conf) { + + Q_UNUSED (sender) + + QMutexLocker locker(&settingsMutex); + m_alexConfig = conf; + + emit alexConfigurationChanged(m_alexConfig); +} + +void Settings::setAlexHPFLoFrequencies(int filter, long value) { + + m_HPFLoFrequencyList[filter] = value; +} + +void Settings::setAlexHPFHiFrequencies(int filter, long value) { + + m_HPFHiFrequencyList[filter] = value; +} + +void Settings::setAlexLPFLoFrequencies(int filter, long value) { + + m_LPFLoFrequencyList[filter] = value; +} + +void Settings::setAlexLPFHiFrequencies(int filter, long value) { + + m_LPFHiFrequencyList[filter] = value; +} + +/* + * Alex state encoding + * We use the same encoding as in the KISS Konsole by George Byrkit, K9TRV + * AA.TT.BBB.RR + * AA is RX Attenuator + * TT is TX antenna selection (0 is NOT valid!) + * BBB is RX special selection + * RR is TX antenna to use for RX (0 is NOT valid!) + * + */ +void Settings::setAlexState(QObject *sender, int pos, int value) { + + Q_UNUSED (sender) + + if (m_alexStates.length() != MAX_BANDS) + return; + else { + + if (m_alexStates.at(pos) == value) + return; + + int state = checkAlexState(value); + //qDebug() << "alex state at pos: " << pos <<" = " << state; + + m_alexStates.replace(pos, state); + + emit alexStateChanged((HamBand) pos, m_alexStates); + } +} + +void Settings::setAlexState(QObject *sender, int value) { + + Q_UNUSED(sender) + + HamBand band = m_receiverDataList[m_currentReceiver].hamBand; + + setAlexState(this, band, value); +} + +void Settings::setAlexStates(QObject *sender, const QList &states) { + + Q_UNUSED (sender) + + if (m_alexStates == states) return; + + m_alexStates = states; + + emit alexStatesChanged(m_alexStates); +} + +// check Alex state - adapted from KISS Konsole, (c) George Byrkit, K9TRV +int Settings::checkAlexState(int state) { + + if ((state & 0x3) == 0) { + + // if rx antenna selector is 0, set it to 1 + state |= 1; + } + + if (((state >> 5) & 0x3) == 0) { + + // if tx antenna selector is 0, set it to 1 + state |= 33; + } + return state; +} + +void Settings::setAlexToManual(QObject *sender, bool value) { + + //QMutexLocker locker(&settingsMutex); + + emit alexManualStateChanged(sender, value); +} + +void Settings::setRxJ6Pin(QObject *sender, HamBand band, int value) { + + Q_UNUSED (sender) + + if (m_rxJ6pinList.length() != MAX_BANDS-1) return; + if (m_rxJ6pinList[band] == value) return; + + m_rxJ6pinList[band] = value; + + emit rxJ6PinsChanged(m_rxJ6pinList); +} + +void Settings::setRxJ6Pins(QObject * sender, const QList &states) { + + Q_UNUSED (sender) + + //if (m_rxJ6pinList == states) return; + + m_rxJ6pinList = states; + + emit rxJ6PinsChanged(m_rxJ6pinList); +} + +void Settings::setTxJ6Pin(QObject *sender, HamBand band, int value) { + + Q_UNUSED (sender) + + if (m_txJ6pinList.length() != MAX_BANDS-1) return; + if (m_txJ6pinList[band] == value) return; + + m_txJ6pinList[band] = value; + + emit txJ6PinsChanged(m_txJ6pinList); +} + +void Settings::setTxJ6Pins(QObject * sender, const QList &states) { + + Q_UNUSED (sender) + + //if (m_txJ6pinList == states) return; + + m_txJ6pinList = states; + + emit txJ6PinsChanged(m_txJ6pinList); +} + +void Settings::setPennyOCEnabled(QObject *sender, bool value) { + + Q_UNUSED (sender) + + if (m_pennyOCEnabled == value) return; + + m_pennyOCEnabled = value; + + emit pennyOCEnabledChanged(m_pennyOCEnabled); +} + +//************************************** +//************************************** +// OpenCL stuff + +//void Settings::setOpenCLDevices(QList devices) { +// +// m_clDevices = devices; +//} + +//void Settings::setCudaPresence(bool value) { +// +// m_cudaPresence = value; +//} +// +//void Settings::setCudaDevices(int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cuda_devices == value) return; +// m_cuda_devices = value; +// locker.unlock(); +// +// emit cudaDevicesChanged(this, value); +//} +// +//void Settings::setCudaDriver(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cuda_driver_version == value) return; +// m_cuda_driver_version = value; +// locker.unlock(); +// +// emit cudaDriverChanged(sender, value); +//} +// +//void Settings::setCudaRuntime(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cuda_runtime_version == value) return; +// m_cuda_runtime_version = value; +// locker.unlock(); +// +// emit cudaRuntimeChanged(sender, value); +//} +// +//void Settings::setCurrentCudaDevice(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_current_cuda_device == value) return; +// m_current_cuda_device = value; +// locker.unlock(); +// +// emit cudaCurrentDeviceChanged(sender, value); +//} +// +//void Settings::setCudaLastDevice(QObject *sender, int value) { +// +// QMutexLocker locker(&mutex); +// if (m_cudaLastDevice == value) return; +// m_cudaLastDevice = value; +// locker.unlock(); +// +// emit cudaLastDeviceChanged(sender, value); +//} + +void Settings::setFreqRulerPosition(QObject *sender, int rx, float position) { + + Q_UNUSED (sender) + + if (position < 0) position = 0; + if (position > 1) position = 1; + + m_receiverDataList[rx].freqRulerPosition = position; + emit freqRulerPositionChanged(this, rx, position); +} + +//********************************************************************************** +// audio settings + +void Settings::setAudioFormat(QObject *sender, const QAudioFormat &format) { + + Q_UNUSED (sender) + + QMutexLocker locker(&settingsMutex); + + //if (m_format == format) return; + m_format = format; + + emit audioFormatChanged(sender, m_format); +} + +void Settings::setAudioPosition(QObject *sender, qint64 position) { + + emit audioPositionChanged(sender, position); +} + +void Settings::setAudioBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer) { + + emit audioBufferChanged(sender, position, length, buffer); +} + + +//********************************************************************************** +// wideband data & options + +void Settings::setWidebandSpectrumBuffer(const qVectorFloat &buffer) { + + emit widebandSpectrumBufferChanged(buffer); +} + +void Settings::resetWidebandSpectrumBuffer() { + + emit widebandSpectrumBufferReset(); +} + +void Settings::setWidebandOptions(QObject* sender, TWideband options) { + + QMutexLocker locker(&settingsMutex); + + m_widebandOptions = options; + + emit widebandOptionsChanged(sender, m_widebandOptions); +} + +void Settings::setWidebandStatus(QObject* sender, bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.wideBandDisplayStatus == value) return; + m_widebandOptions.wideBandDisplayStatus = value; + + emit widebandStatusChanged(sender, m_widebandOptions.wideBandDisplayStatus); +} + +void Settings::setWidebandData(QObject* sender, bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.wideBandData == value) return; + m_widebandOptions.wideBandData = value; + + emit widebandDataChanged(sender, m_widebandOptions.wideBandData); +} + +void Settings::setWidebandBuffers(QObject *sender, int value) { + + Q_UNUSED(sender) + + QMutexLocker locker(&settingsMutex); + m_widebandOptions.numberOfBuffers = value; +} + +void Settings::setWidebanddBmScaleMin(QObject *sender, qreal value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.dBmWBScaleMin == value) return; + m_widebandOptions.dBmWBScaleMin = value; + + locker.unlock(); + emit widebanddBmScaleMinChanged(sender, m_widebandOptions.dBmWBScaleMin); +} + +void Settings::setWidebanddBmScaleMax(QObject *sender, qreal value) { + + QMutexLocker locker(&settingsMutex); + + if (m_widebandOptions.dBmWBScaleMax == value) return; + m_widebandOptions.dBmWBScaleMax = value; + + locker.unlock(); + emit widebanddBmScaleMaxChanged(sender, m_widebandOptions.dBmWBScaleMax); +} + +void Settings::setWideBandRulerPosition(QObject *sender, float position) { + + if (m_widebandOptions.scalePosition == position) return; + if (position < 0) position = 0; + if (position > 1) position = 1; + m_widebandOptions.scalePosition = position; + + emit wideBandScalePositionChanged(sender, m_widebandOptions.scalePosition); +} + + +//********************************************************************************** +// chirp signal settings + +void Settings::switchToChirpSignalMode(QObject *sender) { + + emit chirpSignalModeChanged(sender); +} + +void Settings::setLowerChirpFreq(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_lowerChirpFreq == value) return; + if (m_lowerChirpFreq >= m_upperChirpFreq) + m_lowerChirpFreq = m_upperChirpFreq; + else + m_lowerChirpFreq = value; + + emit lowerChirpFreqChanged(this, m_lowerChirpFreq); +} + +void Settings::setUpperChirpFreq(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_upperChirpFreq == value) return; + if (m_lowerChirpFreq >= m_upperChirpFreq) + m_upperChirpFreq = m_lowerChirpFreq; + else + m_upperChirpFreq = value; + + emit upperChirpFreqChanged(this, m_upperChirpFreq); +} + +void Settings::setChirpAmplitude(qreal value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpAmplitude == value) return; + m_chirpAmplitude = value; + + emit chirpAmplitudeChanged(this, m_chirpAmplitude); +} + +void Settings::setChirpSamplingFreq(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpSamplingFreq == value) return; + m_chirpSamplingFreq = value; + + emit chirpSamplingFreqChanged(this, m_chirpSamplingFreq); +} + +void Settings::setChirpBufferDurationUs(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpBufferDurationUs == (qint64)value) return; + m_chirpBufferDurationUs = (qint64)(1000 * value); + + emit chirpBufferDurationUsChanged(this, m_chirpBufferDurationUs); +} + +void Settings::setChirpRepetitionTimes(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpRepetitionTimes == value) return; + m_chirpRepetitionTimes = value; + + emit chirpRepetitionTimesChanged(this, m_chirpRepetitionTimes); +} + +void Settings::setChirpReceiver(bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpReceiverOn == value) return; + m_chirpReceiverOn = value; + + emit chirpReceiverChanged(this, m_chirpReceiverOn); +} + +void Settings::setChirpAvgLength(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpAvgLength == value) return; + m_chirpAvgLength = value; + + emit chirpAvgLengthChanged(m_chirpAvgLength); +} + +void Settings::setChirpFFTShow(bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_showChirpFFT == value) return; + m_showChirpFFT = value; + + emit chirpFFTShowChanged(m_showChirpFFT); +} + +void Settings::setChirpUSB(bool value) { + + QMutexLocker locker(&settingsMutex); + + if (m_chirpUSB == value) return; + m_chirpUSB = value; + + emit chirpSidebandChanged(m_chirpUSB); +} + +//void Settings::setChirpDownSampleRate(int value) { +// +// if (m_chirpDownSampleRate == value) return; +// m_chirpDownSampleRate = value; +//} + +void Settings::setChirpBuffer(qint64 length, const QList &buffer) { + + emit chirpBufferChanged(length, buffer); +} + +void Settings::setChirpSpectrumBuffer(int sampleRate, qint64 length, const float *buffer) { + + emit chirpSpectrumBufferChanged(sampleRate, length, buffer); +} + +void Settings::setChirpSpectrum(qint64 position, qint64 length, const FrequencySpectrum &spectrum) { + + emit chirpSpectrumChanged(position, length, spectrum); +} + +void Settings::setChirpSpectrumList(const QList &spectrumList) { + + emit chirpSpectrumListChanged(spectrumList); +} + +void Settings::setChirpFilterLowerFrequency(int value) { + + if (m_chirpFilterLowerFrequency == value) return; + m_chirpFilterLowerFrequency = value; + + emit chirpFilterLowerFrequencyChanged(m_chirpFilterLowerFrequency); +} + +void Settings::setChirpFilterUpperFrequency(int value) { + + if (m_chirpFilterUpperFrequency == value) return; + m_chirpFilterUpperFrequency = value; + + emit chirpFilterUpperFrequencyChanged(m_chirpFilterUpperFrequency); +} + +//******************************** + +void Settings::setSpectrumSize(QObject *sender, int value) { + + if (m_spectrumSize == value) return; + + m_spectrumSize = value; + emit spectrumSizeChanged(sender, m_spectrumSize); +} + +void Settings::moveDisplayWidget(int value) { + + emit displayWidgetHeightChanged(value); +} + + +//********************************* +// color stuff + +void Settings::setPanadapterColors(TPanadapterColors type) { + + if (type.panBackgroundColor != m_panadapterColors.panBackgroundColor) + m_panadapterColors.panBackgroundColor = type.panBackgroundColor; + + if (type.waterfallColor != m_panadapterColors.waterfallColor) + m_panadapterColors.waterfallColor = type.waterfallColor; + + if (type.panLineColor != m_panadapterColors.panLineColor) + m_panadapterColors.panLineColor = type.panLineColor; + + if (type.panLineFilledColor != m_panadapterColors.panLineFilledColor) + m_panadapterColors.panLineFilledColor = type.panLineFilledColor; + + if (type.panSolidTopColor != m_panadapterColors.panSolidTopColor) + m_panadapterColors.panSolidTopColor = type.panSolidTopColor; + + if (type.panSolidBottomColor != m_panadapterColors.panSolidBottomColor) + m_panadapterColors.panSolidBottomColor = type.panSolidBottomColor; + + if (type.wideBandLineColor != m_panadapterColors.wideBandLineColor) + m_panadapterColors.wideBandLineColor = type.wideBandLineColor; + + if (type.wideBandFilledColor != m_panadapterColors.wideBandFilledColor) + m_panadapterColors.wideBandFilledColor = type.wideBandFilledColor; + + if (type.wideBandSolidBottomColor != m_panadapterColors.wideBandSolidTopColor) + m_panadapterColors.wideBandSolidTopColor = type.wideBandSolidTopColor; + + if (type.wideBandSolidBottomColor != m_panadapterColors.wideBandSolidBottomColor) + m_panadapterColors.wideBandSolidBottomColor = type.wideBandSolidBottomColor; + + if (type.distanceLineColor != m_panadapterColors.distanceLineColor) + m_panadapterColors.distanceLineColor = type.distanceLineColor; + + if (type.distanceLineFilledColor != m_panadapterColors.distanceLineFilledColor) + m_panadapterColors.distanceLineFilledColor = type.distanceLineFilledColor; + + if (type.panCenterLineColor != m_panadapterColors.panCenterLineColor) + m_panadapterColors.panCenterLineColor = type.panCenterLineColor; + + if (type.gridLineColor != m_panadapterColors.gridLineColor) + m_panadapterColors.gridLineColor = type.gridLineColor; + + emit panadapterColorChanged(); +} + +void Settings::setFramesPerSecond(QObject* sender, int rx, int value) { + + Q_UNUSED(sender) + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).framesPerSecond != value) + m_receiverDataList[rx].framesPerSecond = value; + + emit framesPerSecondChanged(this, rx, m_receiverDataList[rx].framesPerSecond); +} + +int Settings::getFramesPerSecond(int rx) { + + return m_receiverDataList.at(rx).framesPerSecond; +} + +void Settings::setSpectrumAveraging(QObject* sender, int rx, bool value) { + + if (rx == -1) + { + m_widebandOptions.averagingCnt = value; + } + else + { + m_receiverDataList[rx].spectrumAveraging = value; + } + + //SETTINGS_DEBUG << "Averaging for Rx " << rx << " : " << value; + emit spectrumAveragingChanged(sender, rx, value); +} + +bool Settings::getSpectrumAveraging(int rx) { + + if (rx == -1) + return m_widebandOptions.averaging; + else + return m_receiverDataList[rx].spectrumAveraging; +} + +int Settings::getSpectrumAveragingCnt(int rx) { + + if (rx == -1) + return m_widebandOptions.averagingCnt; + else + return m_receiverDataList[rx].averagingCnt; +} + +void Settings::setSpectrumAveragingCnt(QObject *sender, int rx, int value) { + + QMutexLocker locker(&settingsMutex); + + //if (m_specAveragingCnt == value) return + if (rx == -1) + m_widebandOptions.averagingCnt = value; + else + m_receiverDataList[rx].averagingCnt = value; + + emit spectrumAveragingCntChanged(sender, rx, value); +} + + + +void Settings::setPanGrid(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).panGrid == value) return; + m_receiverDataList[rx].panGrid = value; + + emit panGridStatusChanged(m_receiverDataList.at(rx).panGrid, rx); +} + +bool Settings::getPanGridStatus(int rx) { + + return m_receiverDataList[rx].panGrid; +} + +void Settings::setPeakHold(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).peakHold == value) return; + m_receiverDataList[rx].peakHold = value; + + emit peakHoldStatusChanged(m_receiverDataList.at(rx).peakHold, rx); +} + +bool Settings::getPeakHoldStatus(int rx) { + + return m_receiverDataList.at(rx).peakHold; +} + +void Settings::setPanLocked(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).panLocked == value) return; + m_receiverDataList[rx].panLocked = value; + + emit panLockedStatusChanged(m_receiverDataList.at(rx).panLocked, rx); +} + +bool Settings::getPanLockedStatus(int rx) { + + return m_receiverDataList[rx].panLocked; +} + +void Settings::setClickVFO(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).clickVFO == value) return; + m_receiverDataList[rx].clickVFO = value; + + emit clickVFOStatusChanged(m_receiverDataList.at(rx).clickVFO, rx); +} + +bool Settings::getClickVFOStatus(int rx) { + + return m_receiverDataList[rx].clickVFO; +} + +void Settings::setHairCross(bool value, int rx) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList.at(rx).hairCross == value) return; + m_receiverDataList[rx].hairCross = value; + + emit hairCrossStatusChanged(m_receiverDataList.at(rx).hairCross, rx); +} + +bool Settings::getHairCrossStatus(int rx) { + + return m_receiverDataList[rx].hairCross; +} + +void Settings::setWaterfallTime(int rx, int value) { + + Q_UNUSED(rx) + Q_UNUSED(value) + + QMutexLocker locker(&settingsMutex); + + //if (m_receiverDataList[rx].waterfallTime == value) return; + //m_receiverDataList[rx].waterfallTime = value; + + //emit waterfallTimeChanged(rx, value); +} + +void Settings::setWaterfallOffesetLo(int rx, int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].waterfallOffsetLo == value) return; + m_receiverDataList[rx].waterfallOffsetLo = value; + + emit waterfallOffesetLoChanged(rx, value); +} + +void Settings::setWaterfallOffesetHi(int rx, int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_receiverDataList[rx].waterfallOffsetHi == value) return; + m_receiverDataList[rx].waterfallOffsetHi = value; + + emit waterfallOffesetHiChanged(rx, value); +} + +void Settings::setSMeterHoldTime(int value) { + + QMutexLocker locker(&settingsMutex); + + if (m_sMeterHoldTime == value) return; + m_sMeterHoldTime = value; + + emit sMeterHoldTimeChanged(m_sMeterHoldTime); +} + +void Settings::setdBmPanScaleMin(int rx, qreal value) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; + m_receiverDataList[rx].dBmPanScaleMinList[band] = value; + + emit dBmScaleMinChanged(rx, value); +} + +void Settings::setdBmPanScaleMax(int rx, qreal value) { + + QMutexLocker locker(&settingsMutex); + + HamBand band = m_receiverDataList.at(m_currentReceiver).hamBand; + m_receiverDataList[rx].dBmPanScaleMaxList[band] = value; + + emit dBmScaleMaxChanged(rx, value); +} + +void Settings::setdBmDistScaleMin(qreal value) { + + Q_UNUSED(value) +} + +void Settings::setdBmDistScaleMax(qreal value) { + + Q_UNUSED(value) +} + +// ********************************************************************** + +void Settings::showRadioPopupWidget() { + + if (m_radioPopupVisible) + m_radioPopupVisible = false; + else + m_radioPopupVisible = true; + + emit showRadioPopupChanged(m_radioPopupVisible); +} diff --git a/Source/src/cusdr_settings.h b/Source/src/cusdr_settings.h new file mode 100644 index 0000000..1787840 --- /dev/null +++ b/Source/src/cusdr_settings.h @@ -0,0 +1,1586 @@ +/** +* @file cusdr_settings.h +* @brief settings header file for cuSDR +* @author by Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-11-18 +*/ + +/* + * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CUSDR_SETTINGS_H +#define CUSDR_SETTINGS_H + +//#define DEBUG + + +#include +#include +#include +#include +#include +#include +#include + +#include "cusdr_hamDatabase.h" + +// test for OpenCL +//#include "CL/qclcontext.h" + + +// ************************************** +// messages + +#define BANDSCOPE_IN_USE "Error: bandscope in use" +#define BANDSCOPE_NOT_OWNER "Error: Not owner of bandscope" + +#define RECEIVER_INVALID "Error: Invalid Receiver" +#define RECEIVER_IN_USE "Error: Receiver in use" +#define RECEIVER_NOT_OWNER "Error: Not owner of receiver" + +#define CLIENT_ATTACHED "Error: Client is already attached to receiver" +#define CLIENT_DETACHED "Error: Client is not attached to receiver" + +#define INVALID_COMMAND "Error: Invalid Command" + +#define OK "OK" + +// ************************************** +// constants + +#define ONEPI 3.14159265358979323846264338328 +#define TWOPI 6.28318530717958647692528676656 +//#define AGCOFFSET 33.0 + +#define MAXFREQUENCY 961440000 +#define MAXHPFREQUENCY 61440000 +#define MINDBM -180 +#define MAXDBM 10 +#define MINDISTDBM -150 +#define MAXDISTDBM 150 +#define MAX_FFTSIZE 262144 + +// ************************************** +// receiver settings + +#define MAX_RECEIVERS 8 +#define MAX_BANDS 14 +#define BUFFER_SIZE 1024 +#define SAMPLE_BUFFER_SIZE 4096 +#define BANDSCOPE_BUFFER_SIZE 4096 + +#define SMALL_PACKETS +#define BIGWIDEBANDSIZE 16384 +//#define BIGWIDEBANDSIZE 32768 +#define SMALLWIDEBANDSIZE 4096 + + +// ************************************** +// IO buffer, command & control settings + +#define IO_BUFFERS 16 +#define IO_BUFFER_SIZE 512 +#define IO_HEADER_SIZE 8 +#define IO_AUDIOBUFFER_SIZE 8192 + +#define SYNC 0x7F + +#define IQ_DATAGRAM_BUFFERS 512 +#define AUDIO_DATAGRAM_BUFFERS 512 + +#define METIS_HEADER_SIZE 8 +#define METIS_DATA_SIZE 1032 + +#define ALEX_PARAMETERS 15 + +// uncomment to compile code that allows for SYNC error recovery +#define RESYNC + +#define MOX_DISABLED 0x00 +#define MOX_ENABLED 0x01 + +#define ATLAS_10MHZ_SOURCE 0x00 +#define PENELOPE_10MHZ_SOURCE 0x04 +#define MERCURY_10MHZ_SOURCE 0x08 +#define PENELOPE_122_88MHZ_SOURCE 0x00 +#define MERCURY_122_88MHZ_SOURCE 0x10 +#define PENELOPE_PRESENT 0x20 +#define MERCURY_PRESENT 0x40 +#define MIC_SOURCE_PENELOPE 0x80 + +//#define MIC_SOURCE_JANUS 0x00 +//#define CONFIG_NONE 0x00 +//#define CONFIG_BOTH 0x60 + + +//#define SPEED_48KHZ 0x00 +//#define SPEED_96KHZ 0x01 +//#define SPEED_192KHZ 0x02 + +#define MODE_CLASS_E 0x01 +#define MODE_OTHERS 0x00 + +#define ALEX_ATTENUATION_0DB 0x00 +#define ALEX_ATTENUATION_10DB 0x01 +#define ALEX_ATTENUATION_20DB 0x02 +#define ALEX_ATTENUATION_30DB 0x03 +#define LT2208_GAIN_OFF 0x00 +#define LT2208_GAIN_ON 0x04 +#define LT2208_DITHER_OFF 0x00 +#define LT2208_DITHER_ON 0x08 +#define LT2208_RANDOM_OFF 0x00 +#define LT2208_RANDOM_ON 0x10 + +//#define SIMPLEX 0x00 +//#define DUPLEX 0x04 + + +// ************************************** +// Metis definitions + +//#define MAX_METIS_CARDS 10 +//#define DISCOVER_IDLE 0 +//#define DISCOVER_SENT 1 +#define DEVICE_PORT 1024 +#define DATA_PORT 8886 + +// ************************************** +// Audio definitions + +#define WAVEFORM_WINDOW_DURATION 250000 +#define WAVEFORM_TILE_LENGTH 4096 + +//#include "cusdr_about.h" +#include "AudioEngine/cusdr_fspectrum.h" +#include "Util/cusdr_queue.h" + + +// ************************************** +// Server modes + +namespace QSDR { + + enum _Error { + + NoError, + NotImplemented, + HwIOError, + ServerModeError, + OpenError, + DataReceiverThreadError, + DataProcessThreadError, + WideBandDataProcessThreadError, + AudioThreadError, + ChirpDataProcessThreadError, + UnderrunError, + FirmwareError, + FatalError + }; + + enum _DataEngineState { + + DataEngineDown, + DataEngineUp + }; + + enum _DSPCore { + + QtDSP, + CudaDSP, + ExternalDSP + }; + + enum _ServerMode { + + NoServerMode, + SDRMode, + ChirpWSPR, + ChirpWSPRFile, + DemoMode + }; + + enum _HWInterfaceMode { + + NoInterfaceMode, + Metis, + Hermes + }; +} + +Q_DECLARE_METATYPE(QSDR::_Error) +Q_DECLARE_METATYPE(QSDR::_DataEngineState) +Q_DECLARE_METATYPE(QSDR::_ServerMode) +Q_DECLARE_METATYPE(QSDR::_HWInterfaceMode) + + +// ************************************** +enum { + prefixNothing = 0, /*!< No prefix. */ + + /* SI units. */ + prefixKilo = 1, /*!< Kilo prefix 1000^1 = 10^3. */ + prefixMega = 2, /*!< Mega prefix 1000^2 = 10^6. */ + prefixGiga = 3, /*!< Giga prefix 1000^3 = 10^9. */ + prefixTera = 4, /*!< Tera prefix 1000^4 = 10^12. */ + prefixPeta = 5, /*!< Peta prefix 1000^5 = 10^15. */ + prefixExa = 6, /*!< Exa prefix 1000^6 = 10^18. */ + prefixZetta = 7, /*!< Zetta prefix 1000^7 = 10^21. */ + prefixYotta = 8, /*!< Yotta prefix 1000^8 = 10^24. */ + prefixSiMax = prefixYotta, + + /* IEC 60027 units. */ + prefixKibi = 1, /*!< Kibi prefix 1024^1 = 2^10. */ + prefixMebi = 2, /*!< Mebi prefix 1024^2 = 2^20. */ + prefixGibi = 3, /*!< Gibi prefix 1024^3 = 2^30. */ + prefixTebi = 4, /*!< Tebi prefix 1024^4 = 2^40. */ + prefixPebi = 5, /*!< Pebi prefix 1024^5 = 2^50. */ + prefixExbi = 6, /*!< Exbi prefix 1024^6 = 2^60. */ + prefixZebi = 7, /*!< Zebi prefix 1024^7 = 2^70. */ + prefixYobi = 8, /*!< Yobi prefix 1024^8 = 2^80. */ + prefixIecMax = prefixYobi, +}; + + +// ************************************** +// type definitions + +typedef QVector qVectorFloat; + +typedef struct _frequency { + + int freqMHz; + int freqkHz; + + long frequency; + +} TFrequency; + +typedef struct _hpsdrDevices { + + bool mercuryPresence; + bool penelopePresence; + bool pennylanePresence; + bool excaliburPresence; + bool alexPresence; + bool hermesPresence; + bool metisPresence; + + int mercuryFWVersion; + int penelopeFWVersion; + int pennylaneFWVersion; + int excaliburFWVersion; + int alexFWVersion; + int hermesFWVersion; + int metisFWVersion; + +} THPSDRDevices; + +typedef struct _ccParameterRx { + + THPSDRDevices devices; + + uchar roundRobin; // roundRobin is varied in a round-robin fashion in order to decode + // all values which are sent in sequence. + + bool ptt; // PTT (1 = active, 0 = inactive), GPIO[23]= Ozy J8-8, Hermes J16-1 + bool dash; // DASH (1 = active, 0 = inactive), GPIO[21]= Ozy J8-6, Hermes J6-2 + bool dot; // DOT (1 = active, 0 = inactive), GPIO[22]= Ozy J8-7, Hermes J6-3 + bool lt2208; // LT2208 Overflow (1 = active, 0 = inactive) + bool hermesI01; // Hermes I01 (0 = active, 1 = inactive) + bool hermesI02; // Hermes I02 (0 = active, 1 = inactive) + bool hermesI03; // Hermes I03 (0 = active, 1 = inactive) + bool hermesI04; // Hermes I04 (0 = active, 1 = inactive) + bool cyclopsPLL; // Cyclops PLL locked (0 = unlocked, 1 = locked) + bool cyclops; // Cyclops - Mercury frequency changed, bit toggles + + //int mercuryFirmwareVersion; // Mercury firmware version + //int penelopeFirmwareVersion; // Penelope firmware version + //int networkDeviceFirmwareVersion; // Metis/Hermes firmware version + + quint16 ain1; // Forward Power from Alex or Apollo + quint16 ain2; // Reverse Power from Alex or Apollo + quint16 ain3; // AIN3 from Penny or Hermes + quint16 ain4; // AIN4 from Penny or Hermes + quint16 ain5; // Forward Power from Penelope or Hermes + quint16 ain6; // AIN6,13.8v supply on Hermes + + bool mercury1_LT2208; //Mercury 1 LT2208 Overflow (1 = active, 0 = inactive) + bool mercury2_LT2208; //Mercury 2 LT2208 Overflow (1 = active, 0 = inactive) + bool mercury3_LT2208; //Mercury 3 LT2208 Overflow (1 = active, 0 = inactive) + bool mercury4_LT2208; //Mercury 4 LT2208 Overflow (1 = active, 0 = inactive) + + +} TCCParameterRx; + +typedef struct _ccParameterTx { + + bool mox; + bool ptt; + bool lineIn; + bool micGain20dB; + bool pennyOCenabled; + bool vnaMode; + + uchar clockByte; + uchar timeStamp; + uchar commonMercuryFrequencies; + + int hpsdr10MhzSource; + int hpsdr122_88MhzSource; + int hpsdrConfig; + int duplex; + int mercuryAttenuator; + int dither; + int random; + int currentAlexState; + + HamBand currentBand; + + QList mercuryAttenuators; + QList alexStates; + //QList alexConfiguration; + quint16 alexConfig; + QList rxJ6pinList; + QList txJ6pinList; + +} TCCParameterTx; + +typedef struct _hpsdrParameter { + + uchar control_in[5]; + uchar control_out[5]; + + QByteArray ccIn; + QByteArray ccOut; + + uchar output_buffer[IO_BUFFER_SIZE]; + //float in_buffer[2*BUFFER_SIZE]; + float out_buffer[2*BUFFER_SIZE]; + + qVectorFloat wbWindow; + + //CPX cpxIn; + //CPX cpxOut; + //CPX cpxTmp; + + QByteArray audioDatagram; + + QHQueue iq_queue; + QHQueue au_queue; + QHQueue wb_queue; + QHQueue > chirp_queue; + QHQueue > data_queue; + + QList inputBuffer; + + QList clientList; + + QMutex mutex; + QMutex networkIOMutex; + + QWaitCondition devicefound; + //QMutex iqMutex; + + QHostAddress hpsdrDeviceIPAddress; + QString hpsdrDeviceName; + + TCCParameterRx ccRx; + TCCParameterTx ccTx; + + int samplerate; + int speed; + int outputMultiplier; + + int metisFW; + int hermesFW; + int mercuryFW; + int penelopeFW; + int pennylaneFW; + + int clients; + int current_client; + int receivers; + int currentReceiver; + int audio_rx; + int timing; + + int currentMetisCard; + + //int hpsdr_10MhzSource; + //int hpsdr_122_88MhzSource; + int mic_source; + int rxClass; + int rx_freq_change; + int tx_freq_change; + + float mic_gain; + float mic_left_buffer[BUFFER_SIZE]; + float mic_right_buffer[BUFFER_SIZE]; + + qreal penelopeForwardVolts; + qreal penelopeForwardPower; + qreal alexForwardVolts; + qreal alexForwardPower; + qreal alexReverseVolts; + qreal alexReversePower; + qreal ain3Volts; + qreal ain4Volts; + qreal supplyVolts; + + bool rcveIQ_toggle; + bool sendIQ_toggle; + bool timeStamp; + bool mute; + + qint16 audiofileChannels; + +} THPSDRParameter; + +typedef struct _networkDeviceCard { + + QHostAddress ip_address; + char mac_address[18]; + int boardID; + QString boardName; + +} TNetworkDevicecard; + +typedef enum _panGraphicsMode { + + Line, // 0 + FilledLine, // 1 + Solid // 2 + +} PanGraphicsMode; + +typedef enum _waterfallColorMode { + + Simple, // 0 + Enhanced // 1 + +} WaterfallColorMode; + +Q_DECLARE_METATYPE (TNetworkDevicecard) +Q_DECLARE_METATYPE (QList) + +typedef struct _receiver { + + QSDR::_DSPCore dspCore; + + HamBand hamBand; + HamBand lastHamBand; + DSPMode dspMode; + AGCMode agcMode; + TDefaultFilterMode defaultFilterMode; + PanGraphicsMode panMode; + WaterfallColorMode waterfallMode; + + QList lastCenterFrequencyList; + QList lastVfoFrequencyList; + QList mercuryAttenuators; + QList dBmPanScaleMinList; + QList dBmPanScaleMaxList; + QList dspModeList; + + bool hangEnabled; + bool agcLines; + bool panLocked; + bool spectrumAveraging; + bool hairCross; + bool panGrid; + bool peakHold; + bool clickVFO; + + long ctrFrequency; + long vfoFrequency; + long ncoFrequency; + + float freqRulerPosition; + float audioVolume; + + qreal mouseWheelFreqStep; + qreal filterLo; + qreal filterHi; + qreal agcSlope; + qreal acgGain; + qreal acgThreshold_dB; + qreal agcHangThreshold; + qreal agcHangLevel; + qreal agcMaximumGain_dB; + qreal agcAttackTime; + qreal agcDecayTime; + qreal agcHangTime; + qreal agcFixedGain_dB; + qreal agcVariableGain; + + int sampleRate; + int framesPerSecond; + int waterfallOffsetLo; + int waterfallOffsetHi; + int averagingCnt; + +} TReceiver; + +typedef struct _wideband { + + PanGraphicsMode panMode; + + bool wideBandData; + bool wideBandDisplayStatus; + bool averaging; + + int numberOfBuffers; + int averagingCnt; + + float scalePosition; + + qreal dBmWBScaleMin; + qreal dBmWBScaleMax; + +} TWideband; + +typedef struct _transmitter { + + QSDR::_DSPCore dspCore; + + HamBand hamBand; + DSPMode dspMode; + AGCMode agcMode; + TDefaultFilterMode defaultFilterMode; + + bool txAllowed; + long frequency; + + float audioVolume; + +} TTransmitter; + +typedef struct t_panadapterColors { + + QColor panBackgroundColor; + QColor waterfallColor; + QColor panLineColor; + QColor panLineFilledColor; + QColor panSolidTopColor; + QColor panSolidBottomColor; + QColor wideBandLineColor; + QColor wideBandFilledColor; + QColor wideBandSolidTopColor; + QColor wideBandSolidBottomColor; + QColor distanceLineColor; + QColor distanceLineFilledColor; + QColor panCenterLineColor; + QColor gridLineColor; + +} TPanadapterColors; + + +typedef enum _smeterType { + + SIGNAL_STRENGTH, + AVG_SIGNAL_STRENGTH, + ADC_REAL, + ADC_IMAG, + AGC_GAIN, + MIC, + PWR, + ALC, + EQtap, + LEVELER, + COMP, + CPDR, + ALC_G, + LVL_G, + MIC_PK, + ALC_PK, + EQ_PK, + LEVELER_PK, + COMP_PK, + CPDR_PK + +} TMeterType; + +typedef enum _windowtype { + + RECTANGULAR_WINDOW, + HANNING_WINDOW, + WELCH_WINDOW, + PARZEN_WINDOW, + BARTLETT_WINDOW, + HAMMING_WINDOW, + BLACKMAN2_WINDOW, + BLACKMAN3_WINDOW, + BLACKMAN4_WINDOW, + EXPONENTIAL_WINDOW, + RIEMANN_WINDOW, + BLACKMANHARRIS_WINDOW, + NUTTALL_WINDOW + +} TWindowtype; + + +class Receiver; + +// ********************************************************************* +// thread class + +class QThreadEx : public QThread { + +protected: + void run() { exec(); } + +}; + +// ************************************** +// Settings class + +class Settings : public QObject { + + Q_OBJECT + +public: + static Settings *instance(QObject *parent = 0) { + + if (Settings::m_instance) + return Settings::m_instance; + + Settings::m_instance = new Settings(parent); + + return Settings::m_instance; + } + + static void delete_instance() { + + if (Settings::m_instance) { + + disconnect(Settings::m_instance, 0, 0, 0); + delete Settings::m_instance; + Settings::m_instance = 0; + } + } + + virtual ~Settings(); + + QMutex settingsMutex; + +private: + Settings(QObject *parent = 0); + + static Settings *m_instance; + + QSettings *settings; + QSettings *debugLog; + QErrorMessage *error; + +signals: + void systemMessageEvent(const QString &msg, int); + + void masterSwitchChanged(QObject *sender, bool power); + + void systemStateChanged( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void graphicModeChanged( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void cpuLoadChanged(short load); + void txAllowedChanged(QObject* sender, bool value); + void multiRxViewChanged(int view); + void sMeterValueChanged(int rx, float value); + void spectrumBufferChanged(int rx, const qVectorFloat& buffer); + void postSpectrumBufferChanged(int rx, const float* buffer); + + void sampleSizeChanged(int rx, int size); + void rxListChanged(QList rxList); + void clientConnectedChanged(QObject* sender, bool connect); + void clientNoConnectedChanged(QObject* sender, int client); + void audioRxChanged(QObject* sender, int rx); + void receiverChanged(int value); + void currentReceiverChanged(QObject *sender, int rx); + void connectedChanged(QObject *sender, bool connect); + + void clientConnectedEvent(int client); + void clientDisconnectedEvent(int client); + void rxConnectedStatusChanged(QObject* sender, int rx, bool value); + void framesPerSecondChanged(QObject* sender, int rx, int value); + + void settingsFilenameChanged(QString filename); + void settingsLoadedChanged(bool loaded); + + void newServerNetworkInterface(QString nicName, QString ipAddress); + void newHPSDRDeviceNIC(QString nicName, QString ipAddress); + void serverNICChanged(int); + void hpsdrDeviceNICChanged(int); + void socketBufferSizeChanged(QObject* sender, int value); + void manualSocketBufferChanged(QObject* sender, bool value); + //void metisCardListChanged(QList list); + void metisCardListChanged(const QList &list); + void hpsdrDevicesChanged(QObject *sender, THPSDRDevices devices); + void hpsdrNetworkDeviceChanged(TNetworkDevicecard card); + void networkDeviceNumberChanged(int value); + void networkIOComboBoxEntryAdded(QString str); + void clearNetworkIOComboBoxEntrySignal(); + void searchMetisSignal(); + void serverAddrChanged(QObject *sender, QString addr); + void hpsdrDeviceLocalAddrChanged(QObject *sender, QString addr); + void serverPortChanged(QObject *sender, quint16 port); + void listenPortChanged(QObject *sender, quint16 port); + void audioPortChanged(QObject *sender, quint16 port); + void metisPortChanged(QObject *sender, quint16 port); + + void showNetworkIO(); + void showWarning(const QString &msg); + + void callsignChanged(); + + void mouseWheelFreqStepChanged(QObject *sender, int rx, qreal value); + void mainVolumeChanged(QObject *sender, int rx, float volume ); + + //void hermesPresenceChanged(bool value); + void hpsdrHardwareChanged(int value); + void hermesVersionChanged(int value); + void mercuryPresenceChanged(bool value); + void mercuryVersionChanged(int value); + void penelopePresenceChanged(bool value); + void penelopeVersionChanged(int value); + void pennyLanePresenceChanged(bool value); + void pennyLaneVersionChanged(int value); + void alexPresenceChanged(bool value); + void excaliburPresenceChanged(bool value); + void metisVersionChanged(int value); + //void alexConfigurationChanged(const QList &conf); + void alexConfigurationChanged(quint16 config); + //void alexParametersChanged(TAlexParameters p); + void alexStatesChanged(const QList &states); + void alexStateChanged(HamBand band, const QList &states); + void alexStateChanged(int pos, int value); + void alexManualStateChanged(QObject *sender, bool value); + void checkFirmwareVersionChanged(QObject *sender, bool value); + void pennyOCEnabledChanged(bool value); + void rxJ6PinsChanged(const QList &states); + void txJ6PinsChanged(const QList &states); + + void protocolSyncChanged(int value); + void adcOverflowChanged(int value); + void packetLossChanged(int value); + void sendIQSignalChanged(int value); + void rcveIQSignalChanged(int value); + + void numberOfRXChanged(QObject *sender, int value); + void sampleRateChanged(QObject *sender, int value); + void mercuryAttenuatorChanged(QObject *sender, HamBand band, int value); + //void mercuryAttenuatorsChanged(QObject *sender, const QList &values); + void ditherChanged(QObject *sender, int value); + void randomChanged(QObject *sender, int value); + void src10MhzChanged(QObject *sender, int source); + void src122_88MhzChanged(QObject *sender, int source); + void micSourceChanged(QObject *sender, int source); + void classChanged(QObject *sender, int value); + void timingChanged(QObject *sender, int value); + void controlBytesOutChanged(QObject *sender, unsigned char *values); + //void ctrFrequencyChanged(QObject* sender, bool value, int rx, long frequency); + void ctrFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + //void vfoFrequencyChanged(QObject* sender, bool value, int rx, long frequency); + void vfoFrequencyChanged(QObject* sender, int mode, int rx, long frequency); + void ncoFrequencyChanged(int rx, long frequency); + + // wideband data + void widebandSpectrumBufferChanged(const qVectorFloat& buffer); + void widebandOptionsChanged(QObject* sender, TWideband options); + void widebandSpectrumBufferReset(); + void widebandStatusChanged(QObject* sender, bool value); + void widebandDataChanged(QObject* sender, bool value); + void widebanddBmScaleMinChanged(QObject *sender, qreal value); + void widebanddBmScaleMaxChanged(QObject *sender, qreal value); + void wideBandScalePositionChanged(QObject *sender, float position); + //void widebandAveragingChanged(QObject *sender, bool value); + //void widebandAveragingCntChanged(QObject *sender, int value); + + + void iqPortChanged(QObject* sender, int rx, int port); + + void hamBandChanged(QObject *sender, int rx, bool byButton, HamBand band); + void dspModeChanged(QObject *sender, int rx, DSPMode mode); + void agcModeChanged(QObject *sender, int rx, AGCMode mode, bool hangEnabled); + void agcHangEnabledChanged(QObject *sender, int rx, bool hang); + void agcGainChanged(QObject *sender, int rx, int value); + void agcThresholdChanged_dB(QObject *sender, int rx, qreal value); + void agcFixedGainChanged_dB(QObject *sender, int rx, qreal value); + void agcMaximumGainChanged_dB(QObject *sender, int rx, qreal value); + void agcHangThresholdChanged(QObject *sender, int rx, int value); + void agcHangThresholdSliderChanged(QObject *sender, int rx, qreal value); + void agcHangLevelChanged_dB(QObject *sender, int rx, qreal value); + void agcLineLevelsChanged(QObject *sender, int rx, qreal thresh, qreal hang); + void agcVariableGainChanged_dB(QObject *sender, int rx, qreal value); + void agcAttackTimeChanged(QObject *sender, int rx, qreal value); + void agcDecayTimeChanged(QObject *sender, int rx, qreal value); + void agcHangTimeChanged(QObject *sender, int rx, qreal value); + void filterFrequenciesChanged(QObject *sender, int rx, qreal low, qreal high); + + void cudaDevicesChanged(QObject *sender, int value); + void cudaDriverChanged(QObject *sender, int value); + void cudaRuntimeChanged(QObject *sender, int value); + void cudaCurrentDeviceChanged(QObject *sender, int value); + void cudaLastDeviceChanged(QObject* sender, int value); + + void freqRulerPositionChanged(QObject *sender, int rx, float position); + + + void audioFormatChanged(QObject *sender, const QAudioFormat &format); + void audioPositionChanged(QObject *sender, qint64 position); + void audioBufferChanged(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + //void audioBufferChanged(QObject *sender, const QByteArray &buffer); + + void chirpSignalModeChanged(QObject *sender); + void lowerChirpFreqChanged(QObject *sender, int value); + void upperChirpFreqChanged(QObject *sender, int value); + void chirpAmplitudeChanged(QObject *sender, qreal value); + void chirpSamplingFreqChanged(QObject *sender, int value); + void chirpBufferDurationUsChanged(QObject *sender, qint64 value); + void chirpRepetitionTimesChanged(QObject *sender, int value); + void chirpReceiverChanged(QObject *sender, int value); + void chirpBufferChanged(qint64 length, const QList &buffer); + void chirpAvgLengthChanged(int length); + void chirpFFTShowChanged(bool value); + void chirpSidebandChanged(bool value); + void chirpFilterLowerFrequencyChanged(int value); + void chirpFilterUpperFrequencyChanged(int value); + void chirpSpectrumBufferChanged(int sampleRate, qint64 length, const float *buffer); + void chirpSpectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum); + void chirpSpectrumListChanged(const QList &spectrumList); + + void displayWidgetHeightChanged(int value); + void spectrumSizeChanged(QObject *sender, int value); + void panadapterColorChanged(); + void panGridStatusChanged(bool value, int rx); + void peakHoldStatusChanged(bool value, int rx); + void panLockedStatusChanged(bool value, int rx); + void clickVFOStatusChanged(bool value, int rx); + void hairCrossStatusChanged(bool value, int rx); + void showAGCLinesStatusChanged(QObject *sender, bool value, int rx); + + void spectrumAveragingChanged(QObject *sender, int rx, bool value); + void spectrumAveragingCntChanged(QObject *sender, int rx, int value); + + + void waterfallTimeChanged(int rx, int value); + void waterfallOffesetLoChanged(int rx, int value); + void waterfallOffesetHiChanged(int rx, int value); + + void sMeterHoldTimeChanged(int value); + void dBmScaleMinChanged(int rx, qreal value); + void dBmScaleMaxChanged(int rx, qreal value); + + + void showRadioPopupChanged(bool value); + + void receiverDataReady(); + +public: + void debugSystemState(); + + int loadSettings(); + int saveSettings(); + + QSDR::_ServerMode getCurrentServerMode(); + QSDR::_HWInterfaceMode getHWInterface(); + QSDR::_DataEngineState getDataEngineState(); + + PanGraphicsMode getPanadapterMode(int rx); + WaterfallColorMode getWaterfallColorMode(int rx); + + QString getServerModeString(QSDR::_ServerMode mode); + QString getHWInterfaceModeString(QSDR::_HWInterfaceMode mode); + QString getHDataEngineStateString(QSDR::_DataEngineState mode); + QString getErrorString(QSDR::_Error err); + + QString getValue1000(double value, int valuePrefix, QString unitBase); + QString getValue1024(double value, int valuePrefix, QString unitBase); + + THPSDRDevices getHPSDRDevices(); + + bool getSettingsLoaded(); + bool getMainPower(); + bool getDefaultSkin(); + + int getMinimumWidgetWidth(); + int getMinimumGroupBoxWidth(); + int getMultiRxView(); + bool getPBOPresence(); + bool getFBOPresence(); + + bool getConnected(); + bool getClientConnected(); + bool getTxAllowed(); + + QString getTitleStr(); + QString getVersionStr(); + QString getSettingsFilename(); + QString getCallsign(); + + QString getSDRStyle(); + QString getWidgetStyle(); + QString getMainWindowStyle(); + QString getDockStyle(); + QString getDisplayToolbarStyle(); + QString getMainBtnToolbarStyle(); + QString getStatusbarStyle(); + QString getMessageBoxStyle(); + QString getLineEditStyle(); + QString getDialogStyle(); + QString getColorDialogStyle(); + QString getItemStyle(); + QString getLabelStyle(); + QString getSliderLabelStyle(); + QString getTableStyle(); + QString getComboBoxStyle(); + QString getSpinBoxStyle(); + QString getDoubleSpinBoxStyle(); + QString getMenuStyle(); + QString getMiniButtonStyle(); + QString getVolSliderStyle(); + QString getSplitterStyle(); + QString getFrameStyle(); + QString getTabWidgetStyle(); + //QString getNewSliderStyle(); + + + QString getServerAddr(); + QString getHPSDRDeviceLocalAddr(); + + quint16 getServerPort(); + quint16 getListenPort(); + quint16 getAudioPort(); + quint16 getMetisPort(); + + TNetworkDevicecard getCurrentMetisCard() { return m_currentHPSDRDevice; } + QList getMetisCardsList() { return m_metisCards; } + QList getReceiverDataList() { return m_receiverDataList; } + QList getBandFrequencyList() { return m_bandList; } + QList getHamBandTextList() { return m_bandTextList; } + QList getDefaultFilterList() { return m_defaultFilterList; } + TDefaultFilterMode getCurrentFilterMode() { return m_filterMode; } + quint16 getAlexConfig() { return m_alexConfig; } + QList getAlexStates() { return m_alexStates; } + QList getHPFLoFrequencies() { return m_HPFLoFrequencyList; } + QList getHPFHiFrequencies() { return m_HPFHiFrequencyList; } + QList getLPFLoFrequencies() { return m_LPFLoFrequencyList; } + QList getLPFHiFrequencies() { return m_LPFHiFrequencyList; } + QList getRxJ6Pins() { return m_rxJ6pinList; } + QList getTxJ6Pins() { return m_txJ6pinList; } + int getFramesPerSecond(int rx); + QString getDSPModeString(int mode); + + HamBand getCurrentHamBand(int rx); + QList getMercuryAttenuators(int rx); + //int getMercuryAttenuator(); + + bool getPennyOCEnabled() { return m_pennyOCEnabled; } + int getHpsdrNetworkDevices() { return m_hpsdrNetworkDevices; } + int getNetworkInterfacesNo() { return m_NetworkInterfacesNo; } + bool getMercuryPresence() { return m_devices.mercuryPresence; } + int getMercuryVersion() { return m_devices.mercuryFWVersion; } + bool getPenelopePresence() { return m_devices.penelopePresence; } + int getPenelopeVersion() { return m_devices.penelopeFWVersion; } + bool getPennyLanePresence() { return m_devices.pennylanePresence; } + int getPennyLaneVersion() { return m_devices.pennylaneFWVersion; } + bool getHermesPresence() { return m_devices.hermesPresence; } + int getHermesVersion() { return m_devices.hermesFWVersion; } + int getHPSDRHardware() { return m_hpsdrHardware; } + bool getAlexPresence() { return m_devices.alexPresence; } + bool getExcaliburPresence() { return m_devices.excaliburPresence; } + bool getMetisPresence() { return m_devices.metisPresence; } + int getMetisVersion() { return m_devices.metisFWVersion; } + int getSocketBufferSize() { return m_socketBufferSize; } + bool getManualSocketBufferSize() { return m_manualSocketBufferSize; } + bool getFirmwareVersionCheck() { return m_checkFirmwareVersions; } + + // wideband data & options + TWideband getWidebandOptions() { return m_widebandOptions; } + + bool getWidebandStatus() { return m_widebandOptions.wideBandDisplayStatus; } + bool getWidebandData() { return m_widebandOptions.wideBandData; } + qreal getWidebanddBmScaleMin() { return m_widebandOptions.dBmWBScaleMin; } + qreal getWidebanddBmScaleMax() { return m_widebandOptions.dBmWBScaleMax; } + int getWidebandBuffers() { return m_widebandOptions.numberOfBuffers; } + + + + bool getPanGridStatus(int rx); + bool getPeakHoldStatus(int rx); + bool getPanLockedStatus(int rx); + bool getClickVFOStatus(int rx); + bool getHairCrossStatus(int rx); + + int getMercurySpeed() { return m_mercurySpeed; } + int getOutputSampleIncrement() { return m_outputSampleIncrement; } + int getNumberOfReceivers() { return m_mercuryReceivers; } + //int getCurrentReceivers() { return m_mercuryReceivers; } + int getCurrentReceiver() { return m_currentReceiver; } + bool getFrequencyRx1onRx2() { return m_frequencyRx1onRx2; } + int getSampleRate() { return m_sampleRate; } + + //int getMercuryAttenuator() { return m_mercuryAttenuator; } + int getMercuryDither() { return m_mercuryDither; } + int getMercuryRandom() { return m_mercuryRandom; } + int get10MHzSource() { return m_10MHzSource; } + int get122_8MHzSource() { return m_122_8MHzSource; } + int getMicSource() { return m_micSource; } + int getRxClass() { return m_RxClass; } + int getRxTiming() { return m_RxTiming; } + + qreal getMainVolume(int rx); + qreal getMouseWheelFreqStep(int rx);// { return m_mouseWheelFreqStep; } + AGCMode getAGCMode(int rx); + QString getAGCModeString(int rx); + int getAGCGain(int rx); + qreal getAGCMaximumGain_dB(int rx); + qreal getAGCFixedGain_dB(int rx); + int getAGCHangThreshold(int rx); + int getAGCHangLeveldB(int rx); + + int getLowerChirpFreq() { return m_lowerChirpFreq; } + int getUpperChirpFreq() { return m_upperChirpFreq; } + qreal getChirpAmplitude() { return m_chirpAmplitude; } + int getChirpSamplingFreq() { return m_chirpSamplingFreq; } + qint64 getChirpBufferDurationUs() { return m_chirpBufferDurationUs; } + qint64 getChirpBufferLength() { return m_chirpBufferLength; } + int getChirpChannels() { return m_chirpChannels; } + int getChirpRepetitionTimes() { return m_chirpRepetitionTimes; } + int getChirpDownSampleRate() { return m_chirpDownSampleRate; } + int getChirpAvgLength() { return m_chirpAvgLength; } + int getChirpFilterLowerFrequency() { return m_chirpFilterLowerFrequency; } + int getChirpFilterUpperFrequency() { return m_chirpFilterUpperFrequency; } + bool getChirpReceiver() { return m_chirpReceiverOn; } + bool getChirpFFTShow() { return m_showChirpFFT; } + bool getChirpSideband() { return m_chirpUSB; } + + int getSpectrumSize() { return m_spectrumSize; } + + qreal getdBmDistScaleMin() { return m_dBmDistScaleMin; } + qreal getdBmDistScaleMax() { return m_dBmDistScaleMax; } + + int getSMeterHoldTime() { return m_sMeterHoldTime; } + + qreal getFilterFrequencyLow() { return m_filterFrequencyLow; } + qreal getFilterFrequencyHigh() { return m_filterFrequencyHigh; } + + QList m_ipAddressesList; + QList m_networkInterfaces; + + // audio + QAudio::Mode mode() const { return m_audioMode; } + QAudio::State state() const { return m_audioState; } + QAudioFormat getAudioFormat() const { return m_format; } + + // colors + TPanadapterColors getPanadapterColors() { return m_panadapterColors; } + + bool getSpectrumAveraging(int rx); + int getSpectrumAveragingCnt(int rx); + + int getFFTMultiplicator() { return m_fft; } + + QMutex debugMutex; + +public slots: + void setMainPower(QObject *sender, bool power); + void setDefaultSkin(QObject *sender, bool value); + void setSettingsFilename(QString filename); + + void setSystemMessage(const QString &msg, int time); + void setSettingsLoaded(bool loaded); + void setCPULoad(short load); + void setCallsign(const QString &callsign); + + void setPBOPresence(bool value); + void setFBOPresence(bool value); + + void setMainVolume(QObject *sender, int rx, float volume); + void setMainVolumeMute(QObject *sender, int rx, bool value); + + void setSystemState( + QObject *sender, + QSDR::_Error err, + QSDR::_HWInterfaceMode hwmode, + QSDR::_ServerMode mode, + QSDR::_DataEngineState state); + + void setGraphicsState( + QObject *sender, + int rx, + PanGraphicsMode panMode, + WaterfallColorMode waterfallColorMode); + + void setTxAllowed(QObject* sender, bool value); + void setMultiRxView(int view); + void setSMeterValue(int rx, float value); + void setSpectrumBuffer(int rx, const qVectorFloat &buffer); + void setPostSpectrumBuffer(int rx, const float*); + void setSampleSize(QObject* sender, int rx, int size); + void setRxList(QList rxList); + void setMetisCardList(QList list); + void searchHpsdrNetworkDevices(); + void clearMetisCardList(); + void setHPSDRDeviceNumber(int value); + void setCurrentHPSDRDevice(TNetworkDevicecard card); + void addNetworkIOComboBoxEntry(QString str); + void clearNetworkIOComboBoxEntry(); + void addServerNetworkInterface(QString nicName, QString ipAddress); + void addHPSDRDeviceNIC(QString nicName, QString ipAddress); + void setNumberOfNetworkInterfaces(int value); + void setServerNetworkInterface(int index); + void setHPSDRDeviceNIC(int index); + void setServerWidgetNIC(int index); + void setHPSDRWidgetNIC(int index); + void setServerAddr(QObject *sender, QString addr); + void setHPSDRDeviceLocalAddr(QObject *sender, QString addr); + void setServerPort(QObject *sender, quint16 port); + void setListenPort(QObject *sender, quint16 port); + void setAudioPort(QObject *sender, quint16 port); + void setMetisPort(QObject *sender, quint16 port); + void setClientConnected(QObject *sender, bool value); + void setClientNoConnected(QObject* sender, int client); + void setRxConnectedStatus(QObject* sender, int rx, bool value); + void setAudioRx(QObject* sender, int rx); + void setConnected(QObject *sender, bool value); + void setCheckFirmwareVersion(QObject *sender, bool value); + + void setHPSDRDevices(QObject *sender, THPSDRDevices devices); + //void setHermesPresence(bool value); + void setHermesVersion(int value); + void setHPSDRHardware(int value); + void setMercuryPresence(bool value); + void setMercuryVersion(int value); + void setPenelopePresence(bool value); + void setPenelopeVersion(int value); + void setPennyLanePresence(bool value); + void setPennyLaneVersion(int value); + void setAlexPresence(bool value); + void setExcaliburPresence(bool value); + void setMetisVersion(int value); + + //void setAlexConfiguration(QObject *sender, const QList &conf); + void setAlexConfiguration(QObject *sender, quint16 conf); + void setAlexHPFLoFrequencies(int filter, long value); + void setAlexHPFHiFrequencies(int filter, long value); + void setAlexLPFLoFrequencies(int filter, long value); + void setAlexLPFHiFrequencies(int filter, long value); + void setAlexStates(QObject *sender, const QList &states); + void setAlexState(QObject *sender, int pos, int value); + void setAlexState(QObject *sender, int value); + void setAlexToManual(QObject *sender, bool value); + int checkAlexState(int state); + + void setPennyOCEnabled(QObject *sender, bool value); + void setRxJ6Pin(QObject *sender, HamBand band, int value); + void setRxJ6Pins(QObject * sender, const QList &states); + void setTxJ6Pin(QObject *sender, HamBand band, int value); + void setTxJ6Pins(QObject * sender, const QList &states); + + void setIQPort(QObject *sender, int rx, int port); + + void setProtocolSync(int value); + void setADCOverflow(int value); + void setPacketLoss(int value); + void setSendIQ(int value); + void setRcveIQ(int value); + + void setReceivers(QObject *sender, int value); + //void setReceiver(QObject *sender, int value); + void setCurrentReceiver(QObject *sender, int value); + void setSampleRate(QObject *sender, int value); + void setMercuryAttenuator(QObject *sender, int value); + void setDither(QObject *sender, int value); + void setRandom(QObject *sender, int value); + void set10MhzSource(QObject *sender, int source); + void set122_88MhzSource(QObject *sender, int source); + void setMicSource(QObject *sender, int source); + void setClass(QObject *sender, int value); + void setTiming(QObject *sender, int value); + void setCtrFrequency(QObject *sender, int mode, int rx, long frequency); + void setCtrFrequency(int rx, long frequency); + long getCtrFrequency(int rx); + void setVFOFrequency(QObject *sender, int mode, int rx, long frequency); + void setVfoFrequency(int rx, long frequency); + long getVfoFrequency(int rx); + void setNCOFrequency(QObject *sender, bool value, int rx, long frequency); + + void clientDisconnected(int client); + void setFramesPerSecond(QObject *sender, int rx, int value); + void setMouseWheelFreqStep(QObject *sender, int rx, qreal value); + void setSocketBufferSize(QObject *sender, int value); + void setManualSocketBufferSize(QObject *sender, bool value); + + void setReceiverDataReady(); + + void setSpectrumSize(QObject *sender, int value); + void setdBmPanScaleMin(int rx, qreal value); + void setdBmPanScaleMax(int rx, qreal value); + + void setdBmDistScaleMin(qreal value); + void setdBmDistScaleMax(qreal value); + + void setHamBand(QObject* sender, int rx, bool byButton, HamBand band); + void setDSPMode(QObject* sender, int rx, DSPMode mode); + void setAGCMode(QObject* sender, int rx, AGCMode mode); + void setAGCGain(QObject* sender, int rx, int value); + void setAGCMaximumGain_dB(QObject *sender, int rx, qreal value); + void setAGCFixedGain_dB(QObject *sender, int rx, qreal value); + void setAGCThreshold_dB(QObject *sender, int rx, qreal value); + + void setAGCHangThresholdSlider(QObject *sender, int rx, qreal value); + void setAGCHangThreshold(QObject *sender, int rx, int value); + void setAGCHangLevel_dB(QObject *sender, int rx, qreal value); + void setAGCLineLevels(QObject *sender, int rx, qreal thresh, qreal hang); + void setAGCShowLines(QObject *sender, int rx, bool value); + void setAGCVariableGain_dB(QObject *sender, int rx, qreal value); + void setAGCAttackTime(QObject *sender, int rx, qreal value); + void setAGCDecayTime(QObject *sender, int rx, qreal value); + void setAGCHangTime(QObject *sender, int rx, qreal value); + void setRXFilter(QObject* sender, int rx, qreal low, qreal high); + + + // wideband data & options + void setWidebandBuffers(QObject *sender, int value); + void setWidebandSpectrumBuffer(const qVectorFloat &buffer); + void resetWidebandSpectrumBuffer(); + void setWidebandOptions(QObject* sender, TWideband options); + void setWidebandStatus(QObject* sender, bool value); + void setWidebandData(QObject* sender, bool value); + void setWidebanddBmScaleMin(QObject* sender, qreal value); + void setWidebanddBmScaleMax(QObject* sender, qreal value); + //void setWidebandAveraging(QObject *sender, bool value); + //void setWidebandAveragingCnt(QObject *sender, int value); + void setWideBandRulerPosition(QObject* sender, float pos); + + //void setOpenCLDevices(QList dev); + + /*void setCudaPresence(bool value); + void setCudaDevices(int value); + void setCudaLastDevice(QObject *sender, int vlaue); + void setCudaDriver(QObject *sender, int value); + void setCudaRuntime(QObject *sender, int value); + void setCurrentCudaDevice(QObject *sender, int value);*/ + + void setFreqRulerPosition(QObject* sender, int rx, float pos); + //void setRulerPosition(QObject *sender, float pos); + + void setAudioFormat(QObject *sender, const QAudioFormat &format); + void setAudioPosition(QObject *sender, qint64 position); + void setAudioBuffer(QObject *sender, qint64 position, qint64 length, const QByteArray &buffer); + //void setAudioBuffer(QObject *sender, const QByteArray &buffer); + + void switchToChirpSignalMode(QObject *sender); + void setLowerChirpFreq(int value); + void setUpperChirpFreq(int value); + void setChirpAmplitude(qreal value); + void setChirpSamplingFreq(int value); + void setChirpBufferDurationUs(int value); + void setChirpRepetitionTimes(int value); + void setChirpReceiver(bool value); + void setChirpAvgLength(int value); + void setChirpFFTShow(bool value); + void setChirpUSB(bool value); + void setChirpFilterLowerFrequency(int value); + void setChirpFilterUpperFrequency(int value); + //void setChirpDownSampleRate(int value); + //void setChirpBufferLength(qint64 length); + void setChirpBuffer(qint64 length, const QList &buffer); + //void setChirpSpectrumBuffer(const QList &buffer); + void setChirpSpectrumBuffer(int sampleRate, qint64 length, const float *buffer); + + //void setSpectrumBuffer(const float *buffer); + void setChirpSpectrum(qint64 position, qint64 length, const FrequencySpectrum &spectrum); + void setChirpSpectrumList(const QList &spectrumList); + + void moveDisplayWidget(int value); + + void setPanadapterColors(TPanadapterColors type); + void setPanGrid(bool value, int rx); + void setPeakHold(bool value, int rx); + void setPanLocked(bool value, int rx); + void setClickVFO(bool value, int rx); + void setHairCross(bool value, int rx); + + void setSpectrumAveraging(QObject *sender, int rx, bool value); + void setSpectrumAveragingCnt(QObject *sender, int rx, int value); + + + void setWaterfallTime(int rx, int value); + void setWaterfallOffesetLo(int rx, int value); + void setWaterfallOffesetHi(int rx, int value); + + void setSMeterHoldTime(int value); + + void showNetworkIODialog(); + void showWarningDialog(const QString &msg); + + void showRadioPopupWidget(); + + QList getCtrFrequencies(); + QList getVfoFrequencies(); + +private slots: + +private: + QSDR::_Error m_systemError; + QSDR::_ServerMode m_serverMode; + QSDR::_HWInterfaceMode m_hwInterface; + QSDR::_DataEngineState m_dataEngineState; + + QAudio::Mode m_audioMode; + QAudio::State m_audioState; + QAudioFormat m_format; + + THPSDRDevices m_devices; + TDefaultFilterMode m_filterMode; + TPanadapterColors m_panadapterColors; + TNetworkDevicecard m_currentHPSDRDevice; + TTransmitter m_transmitter; + TWideband m_widebandOptions; + + QList m_metisCards; + QList m_receiverDataList; + QList m_bandList; + QList m_bandTextList; + QList m_defaultFilterList; + //QList m_clDevices; + QList m_rxStringList; + QList m_alexStates; + QList m_HPFLoFrequencyList; + QList m_HPFHiFrequencyList; + QList m_LPFLoFrequencyList; + QList m_LPFHiFrequencyList; + QList m_rxJ6pinList; + QList m_txJ6pinList; + + QString m_titleString; + QString m_versionString; + QString m_serverAddress; + QString m_hpsdrDeviceLocalAddr; + QString m_callsignString; + QString settingsFilename; + + QDateTime startTime; + QDateTime now; + + QHostAddress m_hostAddress; + + + quint16 m_serverPort; + quint16 m_listenerPort; + quint16 m_audioPort; + quint16 m_metisPort; + quint16 m_alexConfig; + + bool setLoaded; + + bool m_mainPower; + bool m_defaultSkin; + bool m_connected; + bool m_clientConnected; + bool m_pboFound; + bool m_fboFound; + bool m_manualSocketBufferSize; + bool m_pennyOCEnabled; + + //bool main_mute; + bool m_checkFirmwareVersions; + bool m_specAveraging; + bool m_panGrid; + bool m_peakHold; + bool m_packetsToggle; + + bool m_frequencyRx1onRx2; + bool m_radioPopupVisible; + + int m_hpsdrHardware; + int m_hpsdrNetworkDevices; + int m_NetworkInterfacesNo; + int m_socketBufferSize; + int m_clientNoConnected; + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + int m_mercuryReceivers; + int m_currentReceiver; + int m_sampleRate; + int m_mercurySpeed; + + int m_mercuryAttenuator; + int m_mercuryDither; + int m_mercuryRandom; + + int m_outputSampleIncrement; + int m_10MHzSource; + int m_122_8MHzSource; + int m_micSource; + int m_RxClass; + int m_RxTiming; + + int m_framesPerSecond; + int m_multiRxView; + + //int m_wbBuffers; + int m_spectrumSize; + int m_sMeterHoldTime; + + long freq1; + + float m_mainVolume; + + int control_register; + bool connect_at_startup; + + qreal m_dBmDistScaleMin; + qreal m_dBmDistScaleMax; + + qreal m_filterFrequencyLow; + qreal m_filterFrequencyHigh; + + qreal m_chirpAmplitude; + + qint64 m_chirpBufferDurationUs; + qint64 m_chirpBufferLength; + + bool m_chirpReceiverOn; + bool m_showChirpFFT; + bool m_chirpUSB; + + int m_lowerChirpFreq; + int m_upperChirpFreq; + int m_chirpSamplingFreq; + int m_chirpChannels; + int m_chirpRepetitionTimes; + int m_chirpDownSampleRate; + int m_chirpAvgLength; + int m_chirpFilterLowerFrequency; + int m_chirpFilterUpperFrequency; + + int m_fft; + + /*bool m_cudaPresence; + int m_cuda_devices; + int m_cudaLastDevice; + int m_cuda_driver_version; + int m_cuda_runtime_version; + int m_current_cuda_device;*/ + + void checkHPSDRDevices(); +}; + + +//****************************************************** +// Macros + +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** The following Macro "CHECKED_CONNECT" is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ +// Macro which connects a signal to a slot, and which causes application to +// abort if the connection fails. This is intended to catch programming errors +// such as mis-typing a signal or slot name. It is necessary to write our own +// macro to do this - the following idiom +// Q_ASSERT(connect(source, signal, receiver, slot)); +// will not work because Q_ASSERT compiles to a no-op in release builds. + +#define CHECKED_CONNECT(source, signal, receiver, slot) \ + if(!connect(source, signal, receiver, slot)) \ + qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); + +#define CHECKED_CONNECT_OPT(source, signal, receiver, slot, opt) \ + if(!connect(source, signal, receiver, slot, opt)) \ + qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__); + + + +//****************************************************** +// Debug output + +class NullDebug { + +public: + template + NullDebug& operator << (const T) { return *this; } +}; + +inline NullDebug nullDebug() { return NullDebug(); } + + +#ifdef LOG_SETTINGS +# define SETTINGS_DEBUG qDebug().nospace() << "Settings::\t" +#else +# define SETTINGS_DEBUG nullDebug() +#endif + + +//****************************************************** +// sleeper function + +class SleeperThread : public QThread { + + public: + static void msleep(unsigned long msecs) {QThread::msleep(msecs);} + static void usleep(unsigned long usecs) {QThread::usleep(usecs);} +}; + +#endif // CUSDR_SETTINGS_H diff --git a/Source/src/cusdr_transmitOptionsWidget.cpp b/Source/src/cusdr_transmitOptionsWidget.cpp new file mode 100644 index 0000000..93a8110 --- /dev/null +++ b/Source/src/cusdr_transmitOptionsWidget.cpp @@ -0,0 +1,369 @@ +/** +* @file cusdr_transmitOptionsWidget.h +* @brief transmit control widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-16 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#include +//#include +//#include +//#include +#include +#include + +#include "cusdr_transmitOptionsWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +TransmitOptionsWidget::TransmitOptionsWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + //, m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) + , m_minimumGroupBoxWidth(0) +{ + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 8, 4, 0); + setMouseTracking(true); + + // create groups + createSourceGroup(); + createTransmitFilterGroup(); + createPTTOptionsGroup(); + + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 4, 0); + hbox1->addWidget(sourceGroup); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(0); + hbox2->setContentsMargins(4, 0, 4, 0); + hbox2->addWidget(transmitFilterGroup); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(0); + hbox3->setContentsMargins(4, 0, 4, 0); + hbox3->addWidget(pttOptionsGroup); + + /*QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(0); + hbox4->setContentsMargins(4, 0, 4, 0); + hbox4->addWidget(searchNetworkDeviceGroupBox); + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + deviceNIGroupBox->hide(); + searchNetworkDeviceGroupBox->hide(); + } + + QHBoxLayout *hbox5 = new QHBoxLayout(); + hbox5->setSpacing(0); + hbox5->setContentsMargins(4, 0, 4, 0); + hbox5->addWidget(source10MhzExclusiveGroup); + + QHBoxLayout *hbox6 = new QHBoxLayout(); + hbox6->setSpacing(0); + hbox6->setContentsMargins(4, 0, 4, 0); + hbox6->addWidget(source122_88MhzExclusiveGroup); + + QHBoxLayout *hbox7 = new QHBoxLayout(); + hbox7->setSpacing(0); + hbox7->setContentsMargins(4, 0, 4, 0); + hbox7->addWidget(numberOfReceiversGroup());*/ + + mainLayout->addLayout(hbox1); + mainLayout->addLayout(hbox2); + mainLayout->addLayout(hbox3); + /*mainLayout->addLayout(hbox4); + mainLayout->addLayout(hbox5); + mainLayout->addLayout(hbox6); + mainLayout->addLayout(hbox7);*/ + mainLayout->addStretch(); + setLayout(mainLayout); + + setupConnections(); +} + +TransmitOptionsWidget::~TransmitOptionsWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void TransmitOptionsWidget::setupConnections() { + +} + +void TransmitOptionsWidget::createSourceGroup() { + + QLabel* sourceLabel = new QLabel("Source:", this); + sourceLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + sourceLabel->setStyleSheet(set->getLabelStyle()); + + micInputBtn = new AeroButton("Mic Input", this); + micInputBtn->setRoundness(0); + micInputBtn->setFixedSize(btn_width, btn_height); + micInputBtn->setBtnState(AeroButton::ON); + + CHECKED_CONNECT( + micInputBtn, + SIGNAL(clicked()), + this, + SLOT(inputButtonClicked())); + + lineInputBtn = new AeroButton("Line Input", this); + lineInputBtn->setRoundness(0); + lineInputBtn->setFixedSize(btn_width, btn_height); + lineInputBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + lineInputBtn, + SIGNAL(clicked()), + this, + SLOT(inputButtonClicked())); + + + QLabel* maxLabel = new QLabel("Max Gain (dB):", this); + maxLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + maxLabel->setStyleSheet(set->getLabelStyle()); + + QLabel* minLabel = new QLabel("Min Gain (dB):", this); + minLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + minLabel->setStyleSheet(set->getLabelStyle()); + + micGainMaxSpinBox = new QSpinBox(this); + micGainMaxSpinBox->setMinimum(1); + micGainMaxSpinBox->setMaximum(70); + micGainMaxSpinBox->setStyleSheet(set->getSpinBoxStyle()); + micGainMaxSpinBox->setValue(10); + + micGainMinSpinBox = new QSpinBox(this); + micGainMinSpinBox->setMinimum(-96); + micGainMinSpinBox->setMaximum(0); + micGainMinSpinBox->setStyleSheet(set->getSpinBoxStyle()); + micGainMinSpinBox->setValue(-40); + + QLabel* boostLabel = new QLabel("20 dB Mic Boost:", this); + boostLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + boostLabel->setStyleSheet(set->getLabelStyle()); + + micBoostBtn = new AeroButton(" Off ", this); + micBoostBtn->setRoundness(0); + micBoostBtn->setFixedSize(btn_width, btn_height); + micBoostBtn->setBtnState(AeroButton::OFF); + + CHECKED_CONNECT( + micBoostBtn, + SIGNAL(clicked()), + this, + SLOT(boostButtonClicked())); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addWidget(sourceLabel); + hbox1->addStretch(); + hbox1->addWidget(micInputBtn); + hbox1->addWidget(lineInputBtn); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(4); + hbox2->addWidget(boostLabel); + hbox2->addStretch(); + hbox2->addWidget(micBoostBtn); + + QHBoxLayout *hbox3 = new QHBoxLayout(); + hbox3->setSpacing(4); + hbox3->addWidget(maxLabel); + hbox3->addStretch(); + hbox3->addWidget(micGainMaxSpinBox); + + QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(4); + hbox4->addWidget(minLabel); + hbox4->addStretch(); + hbox4->addWidget(micGainMinSpinBox); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + vbox->addSpacing(12); + vbox->addLayout(hbox3); + vbox->addLayout(hbox4); + + sourceGroup = new QGroupBox(tr("Mic / Line Options"), this); + sourceGroup->setMinimumWidth(m_minimumGroupBoxWidth); + sourceGroup->setLayout(vbox); + sourceGroup->setStyleSheet(set->getWidgetStyle()); + sourceGroup->setFont(QFont("Arial", 8)); +} + +void TransmitOptionsWidget::createTransmitFilterGroup() { + + QLabel* highLabel = new QLabel("High (Hz):", this); + highLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + highLabel->setStyleSheet(set->getLabelStyle()); + + QLabel* lowLabel = new QLabel("Low (Hz):", this); + lowLabel->setFrameStyle(QFrame::Box | QFrame::Raised); + lowLabel->setStyleSheet(set->getLabelStyle()); + + highFilterSpinBox = new QSpinBox(this); + highFilterSpinBox->setMinimum(1000); + highFilterSpinBox->setMaximum(5000); + highFilterSpinBox->setStyleSheet(set->getSpinBoxStyle()); + highFilterSpinBox->setValue(3100); + + lowFilterSpinBox = new QSpinBox(this); + lowFilterSpinBox->setMinimum(0); + lowFilterSpinBox->setMaximum(1000); + lowFilterSpinBox->setStyleSheet(set->getSpinBoxStyle()); + lowFilterSpinBox->setValue(200); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addWidget(highLabel); + hbox1->addStretch(); + hbox1->addWidget(highFilterSpinBox); + + QHBoxLayout *hbox2 = new QHBoxLayout(); + hbox2->setSpacing(4); + hbox2->addWidget(lowLabel); + hbox2->addStretch(); + hbox2->addWidget(lowFilterSpinBox); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + vbox->addLayout(hbox2); + + transmitFilterGroup = new QGroupBox(tr("Transmit Filter"), this); + transmitFilterGroup->setMinimumWidth(m_minimumGroupBoxWidth); + transmitFilterGroup->setLayout(vbox); + transmitFilterGroup->setStyleSheet(set->getWidgetStyle()); + transmitFilterGroup->setFont(QFont("Arial", 8)); +} + +void TransmitOptionsWidget::createPTTOptionsGroup() { + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(4); + hbox1->addStretch(); + //hbox1->addWidget(penelopeBtn); + //hbox1->addWidget(mercuryBtn); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->setSpacing(4); + vbox->addSpacing(6); + vbox->addLayout(hbox1); + + pttOptionsGroup = new QGroupBox(tr("PTT Options"), this); + pttOptionsGroup->setMinimumWidth(m_minimumGroupBoxWidth); + pttOptionsGroup->setLayout(vbox); + pttOptionsGroup->setStyleSheet(set->getWidgetStyle()); + pttOptionsGroup->setFont(QFont("Arial", 8)); +} + + +// ************************************************************************ + +void TransmitOptionsWidget::inputButtonClicked() { + + AeroButton *button = qobject_cast(sender()); + + micInputBtn->setBtnState(AeroButton::OFF); + micInputBtn->update(); + lineInputBtn->setBtnState(AeroButton::OFF); + lineInputBtn->update(); + + button->setBtnState(AeroButton::ON); + button->update(); +} + +void TransmitOptionsWidget::boostButtonClicked() { + + if (micBoostBtn->btnState() == AeroButton::OFF) { + + micBoostBtn->setBtnState(AeroButton::ON); + micBoostBtn->setText(" On "); + } + else { + + micBoostBtn->setBtnState(AeroButton::OFF); + micBoostBtn->setText(" Off "); + } +} + +void TransmitOptionsWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void TransmitOptionsWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +void TransmitOptionsWidget::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void TransmitOptionsWidget::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void TransmitOptionsWidget::mouseMoveEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void TransmitOptionsWidget::mousePressEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void TransmitOptionsWidget::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + + diff --git a/Source/src/cusdr_transmitOptionsWidget.h b/Source/src/cusdr_transmitOptionsWidget.h new file mode 100644 index 0000000..43c3714 --- /dev/null +++ b/Source/src/cusdr_transmitOptionsWidget.h @@ -0,0 +1,97 @@ +/** +* @file cusdr_transmitOptionsWidget.h +* @brief transmit control widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-06-16 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_TRANSMIT_OPTIONS_WIDGET_H +#define _CUSDR_TRANSMIT_OPTIONS_WIDGET_H + +#include +#include +#include +#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + + +class TransmitOptionsWidget : public QWidget { + + Q_OBJECT + +public: + TransmitOptionsWidget(QWidget *parent = 0); + ~TransmitOptionsWidget(); + + +public slots: + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + void setupConnections(); + void createSourceGroup(); + void createTransmitFilterGroup(); + void createPTTOptionsGroup(); + +private: + Settings* set; + + QString m_message; + + QGroupBox* sourceGroup; + QGroupBox* transmitFilterGroup; + QGroupBox* pttOptionsGroup; + + QSpinBox* highFilterSpinBox; + QSpinBox* lowFilterSpinBox; + QSpinBox* micGainMaxSpinBox; + QSpinBox* micGainMinSpinBox; + + AeroButton* micInputBtn; + AeroButton* lineInputBtn; + AeroButton* micBoostBtn; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + +private slots: + void inputButtonClicked(); + void boostButtonClicked(); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString message); +}; + +#endif // _CUSDR_TRANSMIT_OPTIONS_WIDGET_H diff --git a/Source/src/cusdr_transmitPAWidget.cpp b/Source/src/cusdr_transmitPAWidget.cpp new file mode 100644 index 0000000..bb08e3d --- /dev/null +++ b/Source/src/cusdr_transmitPAWidget.cpp @@ -0,0 +1,228 @@ +/** +* @file cusdr_transmitPAWidget.cpp +* @brief transmit PA control widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-28 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +//#include +//#include +//#include +//#include +#include +#include + +#include "cusdr_transmitPAWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +TransmitPAWidget::TransmitPAWidget(QWidget *parent) + : QWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(0) +{ + setMinimumWidth(m_minimumWidgetWidth); + setContentsMargins(4, 8, 4, 0); + setMouseTracking(true); + + createGainGroup(); + //createTransmitFilterGroup(); + //createPTTOptionsGroup(); + + + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this); + mainLayout->setSpacing(5); + mainLayout->setMargin(0); + mainLayout->addSpacing(8); + + QHBoxLayout *hbox1 = new QHBoxLayout(); + hbox1->setSpacing(0); + hbox1->setContentsMargins(4, 0, 4, 0); + hbox1->addWidget(gainGroup); + +// QHBoxLayout *hbox2 = new QHBoxLayout(); +// hbox2->setSpacing(0); +// hbox2->setContentsMargins(4, 0, 4, 0); +// hbox2->addWidget(transmitFilterGroup); +// +// QHBoxLayout *hbox3 = new QHBoxLayout(); +// hbox3->setSpacing(0); +// hbox3->setContentsMargins(4, 0, 4, 0); +// hbox3->addWidget(pttOptionsGroup); + + /*QHBoxLayout *hbox4 = new QHBoxLayout(); + hbox4->setSpacing(0); + hbox4->setContentsMargins(4, 0, 4, 0); + hbox4->addWidget(searchNetworkDeviceGroupBox); + + if (m_hwInterface == QSDR::NoInterfaceMode) { + + deviceNIGroupBox->hide(); + searchNetworkDeviceGroupBox->hide(); + } + + QHBoxLayout *hbox5 = new QHBoxLayout(); + hbox5->setSpacing(0); + hbox5->setContentsMargins(4, 0, 4, 0); + hbox5->addWidget(source10MhzExclusiveGroup); + + QHBoxLayout *hbox6 = new QHBoxLayout(); + hbox6->setSpacing(0); + hbox6->setContentsMargins(4, 0, 4, 0); + hbox6->addWidget(source122_88MhzExclusiveGroup); + + QHBoxLayout *hbox7 = new QHBoxLayout(); + hbox7->setSpacing(0); + hbox7->setContentsMargins(4, 0, 4, 0); + hbox7->addWidget(numberOfReceiversGroup());*/ + + mainLayout->addLayout(hbox1); + //mainLayout->addLayout(hbox2); + //mainLayout->addLayout(hbox3); + /*mainLayout->addLayout(hbox4); + mainLayout->addLayout(hbox5); + mainLayout->addLayout(hbox6); + mainLayout->addLayout(hbox7);*/ + mainLayout->addStretch(); + setLayout(mainLayout); + + setupConnections(); +} + +TransmitPAWidget::~TransmitPAWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +void TransmitPAWidget::setupConnections() { + +} + +void TransmitPAWidget::createGainGroup() { + +// QLabel *dBmLabel = new QLabel("dBm", this); +// dBmLabel->setFrameStyle(QFrame::Box | QFrame::Raised); +// dBmLabel->setStyleSheet(set->getLabelStyle()); + + // band label + QStringList bandNames; + bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "gen"; + + QList bandLabelList; + + for (int i = 0; i < MAX_BANDS-1; i++) { + + QLabel *label = new QLabel(bandNames.at(i), this); + label->setFrameStyle(QFrame::Box | QFrame::Raised); + label->setStyleSheet(set->getLabelStyle()); + + bandLabelList << label; + } + + // gain spinBox list + for (int i = 0; i < MAX_BANDS-1; i++) { + + QDoubleSpinBox *spinBox = new QDoubleSpinBox(); + spinBox->setStyleSheet(set->getComboBoxStyle()); + spinBox->setMinimum(38.8); + spinBox->setMaximum(100.0); + spinBox->setSingleStep(0.1); + spinBox->setStyleSheet(set->getDoubleSpinBoxStyle()); + + + //CHECKED_CONNECT(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setAttenuatorValue(int))); + + gainSpinBoxList << spinBox; + } + + QGridLayout* grid = new QGridLayout(this); + grid->setVerticalSpacing(1); + grid->setHorizontalSpacing(1); + grid->setContentsMargins(7, 7, 5, 7); + + //grid->addWidget(attnLabel, 0, 0, 1, 2, Qt::AlignCenter); + //grid->addWidget(emptyLabel1, 0, 2, 1, 1, Qt::AlignCenter); + + for (int i = 0; i < MAX_BANDS-1; i++) { + + grid->addWidget(bandLabelList.at(i), i+1, 0, 1, 1, Qt::AlignLeft); + grid->addWidget(gainSpinBoxList.at(i), i+1, 1, 1, 1, Qt::AlignCenter); + //grid->addWidget(dBmLabel, i+1, 3, 1, 1, Qt::AlignLeft); + } + + + gainGroup = new QGroupBox(tr("Gain by Band (dB)"), this); + gainGroup->setMinimumWidth(m_minimumGroupBoxWidth); + gainGroup->setLayout(grid); + gainGroup->setStyleSheet(set->getWidgetStyle()); + gainGroup->setFont(QFont("Arial", 8)); +} + + +// ************************************************************************ + +void TransmitPAWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void TransmitPAWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +void TransmitPAWidget::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void TransmitPAWidget::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void TransmitPAWidget::mouseMoveEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void TransmitPAWidget::mousePressEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void TransmitPAWidget::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + + diff --git a/Source/src/cusdr_transmitPAWidget.h b/Source/src/cusdr_transmitPAWidget.h new file mode 100644 index 0000000..9658cfe --- /dev/null +++ b/Source/src/cusdr_transmitPAWidget.h @@ -0,0 +1,88 @@ +/** +* @file cusdr_transmitPAWidget.h +* @brief transmit PA control widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-28 +*/ + +/* + * + * Copyright 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_TRANSMIT_PA_WIDGET_H +#define _CUSDR_TRANSMIT_PA_WIDGET_H + +//#include +#include +#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" + + +class TransmitPAWidget : public QWidget { + + Q_OBJECT + +public: + TransmitPAWidget(QWidget *parent = 0); + ~TransmitPAWidget(); + + +public slots: + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + void setupConnections(); + void createGainGroup(); + +private: + Settings* set; + + QString m_message; + + QGroupBox *gainGroup; + + QList gainSpinBoxList; + +// AeroButton* micInputBtn; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + +private slots: +// void inputButtonClicked(); +// void boostButtonClicked(); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString message); +}; + +#endif // _CUSDR_TRANSMIT_PS_WIDGET_H diff --git a/Source/src/cusdr_transmitTabWidget.cpp b/Source/src/cusdr_transmitTabWidget.cpp new file mode 100644 index 0000000..d059a94 --- /dev/null +++ b/Source/src/cusdr_transmitTabWidget.cpp @@ -0,0 +1,164 @@ +/** +* @file cusdr_transmitTabWidget.cpp +* @brief Transmit settings tab widget class for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-28 +*/ + +/* + * + * Copyright 2010-2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#include "cusdr_transmitTabWidget.h" + + +#define btn_height 15 +#define btn_width 74 +#define btn_width2 52 +#define btn_widths 40 + + +TransmitTabWidget::TransmitTabWidget(QWidget *parent) + : QTabWidget(parent) + , set(Settings::instance()) + , m_minimumWidgetWidth(set->getMinimumWidgetWidth()) + , m_minimumGroupBoxWidth(set->getMinimumGroupBoxWidth()) +{ + setStyleSheet(set->getTabWidgetStyle()); + //setMinimumWidth(m_minimumWidgetWidth); + //setMaximumWidth (247); + setContentsMargins(4, 4, 4, 0); + setMouseTracking(true); + + m_transmitOptionsWidget = new TransmitOptionsWidget(this); + m_transmitPAWidget = new TransmitPAWidget(this); + + this->addTab(m_transmitOptionsWidget, "Options"); + this->addTab(m_transmitPAWidget, "PA Settings"); + + if (!set->getPenelopePresence() && !set->getPennyLanePresence() && !QSDR::Hermes) { + + setTabEnabled(1, false); +// setTabEnabled(2, false); +// setTabEnabled(3, false); + } + +// if (!set->getAlexPresence()) +// setTabEnabled(4, false); + + setupConnections(); +} + +TransmitTabWidget::~TransmitTabWidget() { + + disconnect(set, 0, this, 0); + disconnect(this, 0, 0, 0); +} + +QSize TransmitTabWidget::sizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +QSize TransmitTabWidget::minimumSizeHint() const { + + return QSize(m_minimumWidgetWidth, height()); +} + +void TransmitTabWidget::setupConnections() { + +// CHECKED_CONNECT( +// set, +// SIGNAL(alexPresenceChanged(bool)), +// this, +// SLOT(setAlexPresence(bool))); + +// CHECKED_CONNECT( +// set, +// SIGNAL(penelopePresenceChanged(bool)), +// this, +// SLOT(setPennyPresence(bool))); +// +// CHECKED_CONNECT( +// set, +// SIGNAL(pennyLanePresenceChanged(bool)), +// this, +// SLOT(setPennyPresence(bool))); +} + +void TransmitTabWidget::setPennyPresence(bool value) { + + setTabEnabled(1, value); +// setTabEnabled(2, value); +// setTabEnabled(3, value); +} + +//void TransmitTabWidget::setAlexPresence(bool value) { +// +// setTabEnabled(4, value); +//} + +void TransmitTabWidget::addNICChangedConnection() { + + //m_hpsdrWidget->addNICChangedConnection(); +} + +void TransmitTabWidget::closeEvent(QCloseEvent *event) { + + emit closeEvent(this); + QWidget::closeEvent(event); +} + +void TransmitTabWidget::showEvent(QShowEvent *event) { + + emit showEvent(this); + QWidget::showEvent(event); +} + +void TransmitTabWidget::enterEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void TransmitTabWidget::leaveEvent(QEvent *event) { + + Q_UNUSED(event) +} + +void TransmitTabWidget::mouseMoveEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void TransmitTabWidget::mousePressEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + +void TransmitTabWidget::mouseReleaseEvent(QMouseEvent *event) { + + Q_UNUSED(event) +} + + diff --git a/Source/src/cusdr_transmitTabWidget.h b/Source/src/cusdr_transmitTabWidget.h new file mode 100644 index 0000000..d6a2766 --- /dev/null +++ b/Source/src/cusdr_transmitTabWidget.h @@ -0,0 +1,88 @@ +/** +* @file cusdr_transmitTabWidget.h +* @brief Transmit settings tab widget header file for cuSDR +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2012-08-28 +*/ + +/* + * + * Copyright 2010-2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _CUSDR_TRANSMIT_TABWIDGET_H +#define _CUSDR_TRANSMIT_TABWIDGET_H + +//#include +#include +//#include +//#include + +#include "Util/cusdr_buttons.h" +#include "cusdr_settings.h" +#include "cusdr_transmitOptionsWidget.h" +#include "cusdr_transmitPAWidget.h" + + +class TransmitTabWidget : public QTabWidget { + + Q_OBJECT + +public: + TransmitTabWidget(QWidget *parent = 0); + ~TransmitTabWidget(); + + +public slots: + QSize sizeHint() const; + QSize minimumSizeHint() const; + void addNICChangedConnection(); + +protected: + void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); + void enterEvent(QEvent *event); + void leaveEvent(QEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private: + Settings* set; + + QString m_message; + + TransmitOptionsWidget *m_transmitOptionsWidget; + TransmitPAWidget *m_transmitPAWidget; + + int m_minimumWidgetWidth; + int m_minimumGroupBoxWidth; + + void setupConnections(); + +private slots: + //void setAlexPresence(bool value); + void setPennyPresence(bool value); + +signals: + void showEvent(QObject *sender); + void closeEvent(QObject *sender); + void messageEvent(QString message); +}; + +#endif // _CUSDR_TRANSMIT_TABWIDGET_H diff --git a/Source/src/exception.h b/Source/src/exception.h new file mode 100644 index 0000000..adda4bc --- /dev/null +++ b/Source/src/exception.h @@ -0,0 +1,151 @@ +/* +* Copyright 1993-2013 NVIDIA Corporation. All rights reserved. +* +* Please refer to the NVIDIA end user license agreement (EULA) associated +* with this source code for terms and conditions that govern your use of +* this software. Any use, reproduction, disclosure, or distribution of +* this software and related documentation outside the terms of the EULA +* is strictly prohibited. +* +*/ + +/* CUda UTility Library */ +#ifndef _EXCEPTION_H_ +#define _EXCEPTION_H_ + +// includes, system +#include +#include +#include +#include + +//! Exception wrapper. +//! @param Std_Exception Exception out of namespace std for easy typing. +template +class Exception : public Std_Exception +{ + public: + + //! @brief Static construction interface + //! @return Alwayss throws ( Located_Exception) + //! @param file file in which the Exception occurs + //! @param line line in which the Exception occurs + //! @param detailed details on the code fragment causing the Exception + static void throw_it(const char *file, + const int line, + const char *detailed = "-"); + + //! Static construction interface + //! @return Alwayss throws ( Located_Exception) + //! @param file file in which the Exception occurs + //! @param line line in which the Exception occurs + //! @param detailed details on the code fragment causing the Exception + static void throw_it(const char *file, + const int line, + const std::string &detailed); + + //! Destructor + virtual ~Exception() throw(); + + private: + + //! Constructor, default (private) + Exception(); + + //! Constructor, standard + //! @param str string returned by what() + Exception(const std::string &str); + +}; + +//////////////////////////////////////////////////////////////////////////////// +//! Exception handler function for arbitrary exceptions +//! @param ex exception to handle +//////////////////////////////////////////////////////////////////////////////// +template +inline void +handleException(const Exception_Typ &ex) +{ + std::cerr << ex.what() << std::endl; + + exit(EXIT_FAILURE); +} + +//! Convenience macros + +//! Exception caused by dynamic program behavior, e.g. file does not exist +#define RUNTIME_EXCEPTION( msg) \ + Exception::throw_it( __FILE__, __LINE__, msg) + +//! Logic exception in program, e.g. an assert failed +#define LOGIC_EXCEPTION( msg) \ + Exception::throw_it( __FILE__, __LINE__, msg) + +//! Out of range exception +#define RANGE_EXCEPTION( msg) \ + Exception::throw_it( __FILE__, __LINE__, msg) + +//////////////////////////////////////////////////////////////////////////////// +//! Implementation + +// includes, system +#include + +//////////////////////////////////////////////////////////////////////////////// +//! Static construction interface. +//! @param Exception causing code fragment (file and line) and detailed infos. +//////////////////////////////////////////////////////////////////////////////// +/*static*/ template +void +Exception:: +throw_it(const char *file, const int line, const char *detailed) +{ + std::stringstream s; + + // Quiet heavy-weight but exceptions are not for + // performance / release versions + s << "Exception in file '" << file << "' in line " << line << "\n" + << "Detailed description: " << detailed << "\n"; + + throw Exception(s.str()); +} + +//////////////////////////////////////////////////////////////////////////////// +//! Static construction interface. +//! @param Exception causing code fragment (file and line) and detailed infos. +//////////////////////////////////////////////////////////////////////////////// +/*static*/ template +void +Exception:: +throw_it(const char *file, const int line, const std::string &msg) +{ + throw_it(file, line, msg.c_str()); +} + +//////////////////////////////////////////////////////////////////////////////// +//! Constructor, default (private). +//////////////////////////////////////////////////////////////////////////////// +template +Exception::Exception() : + Std_Exception("Unknown Exception.\n") +{ } + +//////////////////////////////////////////////////////////////////////////////// +//! Constructor, standard (private). +//! String returned by what(). +//////////////////////////////////////////////////////////////////////////////// +template +Exception::Exception(const std::string &s) : + Std_Exception(s) +{ } + +//////////////////////////////////////////////////////////////////////////////// +//! Destructor +//////////////////////////////////////////////////////////////////////////////// +template +Exception::~Exception() throw() { } + +// functions, exported + +#endif // #ifndef _EXCEPTION_H_ + diff --git a/Source/src/helper_cuda.h b/Source/src/helper_cuda.h new file mode 100644 index 0000000..3b3ff14 --- /dev/null +++ b/Source/src/helper_cuda.h @@ -0,0 +1,1185 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +//////////////////////////////////////////////////////////////////////////////// +// These are CUDA Helper functions for initialization and error checking + +#ifndef HELPER_CUDA_H +#define HELPER_CUDA_H + +#pragma once + +#include +#include +#include + +#include + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// Note, it is required that your SDK sample to include the proper header files, please +// refer the CUDA examples for examples of the needed CUDA headers, which may change depending +// on which CUDA functions are used. + +// CUDA Runtime error messages +#ifdef __DRIVER_TYPES_H__ +static const char *_cudaGetErrorEnum(cudaError_t error) +{ + switch (error) + { + case cudaSuccess: + return "cudaSuccess"; + + case cudaErrorMissingConfiguration: + return "cudaErrorMissingConfiguration"; + + case cudaErrorMemoryAllocation: + return "cudaErrorMemoryAllocation"; + + case cudaErrorInitializationError: + return "cudaErrorInitializationError"; + + case cudaErrorLaunchFailure: + return "cudaErrorLaunchFailure"; + + case cudaErrorPriorLaunchFailure: + return "cudaErrorPriorLaunchFailure"; + + case cudaErrorLaunchTimeout: + return "cudaErrorLaunchTimeout"; + + case cudaErrorLaunchOutOfResources: + return "cudaErrorLaunchOutOfResources"; + + case cudaErrorInvalidDeviceFunction: + return "cudaErrorInvalidDeviceFunction"; + + case cudaErrorInvalidConfiguration: + return "cudaErrorInvalidConfiguration"; + + case cudaErrorInvalidDevice: + return "cudaErrorInvalidDevice"; + + case cudaErrorInvalidValue: + return "cudaErrorInvalidValue"; + + case cudaErrorInvalidPitchValue: + return "cudaErrorInvalidPitchValue"; + + case cudaErrorInvalidSymbol: + return "cudaErrorInvalidSymbol"; + + case cudaErrorMapBufferObjectFailed: + return "cudaErrorMapBufferObjectFailed"; + + case cudaErrorUnmapBufferObjectFailed: + return "cudaErrorUnmapBufferObjectFailed"; + + case cudaErrorInvalidHostPointer: + return "cudaErrorInvalidHostPointer"; + + case cudaErrorInvalidDevicePointer: + return "cudaErrorInvalidDevicePointer"; + + case cudaErrorInvalidTexture: + return "cudaErrorInvalidTexture"; + + case cudaErrorInvalidTextureBinding: + return "cudaErrorInvalidTextureBinding"; + + case cudaErrorInvalidChannelDescriptor: + return "cudaErrorInvalidChannelDescriptor"; + + case cudaErrorInvalidMemcpyDirection: + return "cudaErrorInvalidMemcpyDirection"; + + case cudaErrorAddressOfConstant: + return "cudaErrorAddressOfConstant"; + + case cudaErrorTextureFetchFailed: + return "cudaErrorTextureFetchFailed"; + + case cudaErrorTextureNotBound: + return "cudaErrorTextureNotBound"; + + case cudaErrorSynchronizationError: + return "cudaErrorSynchronizationError"; + + case cudaErrorInvalidFilterSetting: + return "cudaErrorInvalidFilterSetting"; + + case cudaErrorInvalidNormSetting: + return "cudaErrorInvalidNormSetting"; + + case cudaErrorMixedDeviceExecution: + return "cudaErrorMixedDeviceExecution"; + + case cudaErrorCudartUnloading: + return "cudaErrorCudartUnloading"; + + case cudaErrorUnknown: + return "cudaErrorUnknown"; + + case cudaErrorNotYetImplemented: + return "cudaErrorNotYetImplemented"; + + case cudaErrorMemoryValueTooLarge: + return "cudaErrorMemoryValueTooLarge"; + + case cudaErrorInvalidResourceHandle: + return "cudaErrorInvalidResourceHandle"; + + case cudaErrorNotReady: + return "cudaErrorNotReady"; + + case cudaErrorInsufficientDriver: + return "cudaErrorInsufficientDriver"; + + case cudaErrorSetOnActiveProcess: + return "cudaErrorSetOnActiveProcess"; + + case cudaErrorInvalidSurface: + return "cudaErrorInvalidSurface"; + + case cudaErrorNoDevice: + return "cudaErrorNoDevice"; + + case cudaErrorECCUncorrectable: + return "cudaErrorECCUncorrectable"; + + case cudaErrorSharedObjectSymbolNotFound: + return "cudaErrorSharedObjectSymbolNotFound"; + + case cudaErrorSharedObjectInitFailed: + return "cudaErrorSharedObjectInitFailed"; + + case cudaErrorUnsupportedLimit: + return "cudaErrorUnsupportedLimit"; + + case cudaErrorDuplicateVariableName: + return "cudaErrorDuplicateVariableName"; + + case cudaErrorDuplicateTextureName: + return "cudaErrorDuplicateTextureName"; + + case cudaErrorDuplicateSurfaceName: + return "cudaErrorDuplicateSurfaceName"; + + case cudaErrorDevicesUnavailable: + return "cudaErrorDevicesUnavailable"; + + case cudaErrorInvalidKernelImage: + return "cudaErrorInvalidKernelImage"; + + case cudaErrorNoKernelImageForDevice: + return "cudaErrorNoKernelImageForDevice"; + + case cudaErrorIncompatibleDriverContext: + return "cudaErrorIncompatibleDriverContext"; + + case cudaErrorPeerAccessAlreadyEnabled: + return "cudaErrorPeerAccessAlreadyEnabled"; + + case cudaErrorPeerAccessNotEnabled: + return "cudaErrorPeerAccessNotEnabled"; + + case cudaErrorDeviceAlreadyInUse: + return "cudaErrorDeviceAlreadyInUse"; + + case cudaErrorProfilerDisabled: + return "cudaErrorProfilerDisabled"; + + case cudaErrorProfilerNotInitialized: + return "cudaErrorProfilerNotInitialized"; + + case cudaErrorProfilerAlreadyStarted: + return "cudaErrorProfilerAlreadyStarted"; + + case cudaErrorProfilerAlreadyStopped: + return "cudaErrorProfilerAlreadyStopped"; + + /* Since CUDA 4.0*/ + case cudaErrorAssert: + return "cudaErrorAssert"; + + case cudaErrorTooManyPeers: + return "cudaErrorTooManyPeers"; + + case cudaErrorHostMemoryAlreadyRegistered: + return "cudaErrorHostMemoryAlreadyRegistered"; + + case cudaErrorHostMemoryNotRegistered: + return "cudaErrorHostMemoryNotRegistered"; + + /* Since CUDA 5.0 */ + case cudaErrorOperatingSystem: + return "cudaErrorOperatingSystem"; + + case cudaErrorPeerAccessUnsupported: + return "cudaErrorPeerAccessUnsupported"; + + case cudaErrorLaunchMaxDepthExceeded: + return "cudaErrorLaunchMaxDepthExceeded"; + + case cudaErrorLaunchFileScopedTex: + return "cudaErrorLaunchFileScopedTex"; + + case cudaErrorLaunchFileScopedSurf: + return "cudaErrorLaunchFileScopedSurf"; + + case cudaErrorSyncDepthExceeded: + return "cudaErrorSyncDepthExceeded"; + + case cudaErrorLaunchPendingCountExceeded: + return "cudaErrorLaunchPendingCountExceeded"; + + case cudaErrorNotPermitted: + return "cudaErrorNotPermitted"; + + case cudaErrorNotSupported: + return "cudaErrorNotSupported"; + + /* Since CUDA 6.0 */ + case cudaErrorHardwareStackError: + return "cudaErrorHardwareStackError"; + + case cudaErrorIllegalInstruction: + return "cudaErrorIllegalInstruction"; + + case cudaErrorMisalignedAddress: + return "cudaErrorMisalignedAddress"; + + case cudaErrorInvalidAddressSpace: + return "cudaErrorInvalidAddressSpace"; + + case cudaErrorInvalidPc: + return "cudaErrorInvalidPc"; + + case cudaErrorIllegalAddress: + return "cudaErrorIllegalAddress"; + + /* Since CUDA 6.5*/ +#if 0 //RRK + case cudaErrorInvalidPtx: + return "cudaErrorInvalidPtx"; + + case cudaErrorInvalidGraphicsContext: + return "cudaErrorInvalidGraphicsContext"; + + case cudaErrorStartupFailure: + return "cudaErrorStartupFailure"; + + case cudaErrorApiFailureBase: + return "cudaErrorApiFailureBase"; +#endif + } + + return ""; +} +#endif + +#ifdef __cuda_cuda_h__ +// CUDA Driver API errors +static const char *_cudaGetErrorEnum(CUresult error) +{ + switch (error) + { + case CUDA_SUCCESS: + return "CUDA_SUCCESS"; + + case CUDA_ERROR_INVALID_VALUE: + return "CUDA_ERROR_INVALID_VALUE"; + + case CUDA_ERROR_OUT_OF_MEMORY: + return "CUDA_ERROR_OUT_OF_MEMORY"; + + case CUDA_ERROR_NOT_INITIALIZED: + return "CUDA_ERROR_NOT_INITIALIZED"; + + case CUDA_ERROR_DEINITIALIZED: + return "CUDA_ERROR_DEINITIALIZED"; + + case CUDA_ERROR_PROFILER_DISABLED: + return "CUDA_ERROR_PROFILER_DISABLED"; + + case CUDA_ERROR_PROFILER_NOT_INITIALIZED: + return "CUDA_ERROR_PROFILER_NOT_INITIALIZED"; + + case CUDA_ERROR_PROFILER_ALREADY_STARTED: + return "CUDA_ERROR_PROFILER_ALREADY_STARTED"; + + case CUDA_ERROR_PROFILER_ALREADY_STOPPED: + return "CUDA_ERROR_PROFILER_ALREADY_STOPPED"; + + case CUDA_ERROR_NO_DEVICE: + return "CUDA_ERROR_NO_DEVICE"; + + case CUDA_ERROR_INVALID_DEVICE: + return "CUDA_ERROR_INVALID_DEVICE"; + + case CUDA_ERROR_INVALID_IMAGE: + return "CUDA_ERROR_INVALID_IMAGE"; + + case CUDA_ERROR_INVALID_CONTEXT: + return "CUDA_ERROR_INVALID_CONTEXT"; + + case CUDA_ERROR_CONTEXT_ALREADY_CURRENT: + return "CUDA_ERROR_CONTEXT_ALREADY_CURRENT"; + + case CUDA_ERROR_MAP_FAILED: + return "CUDA_ERROR_MAP_FAILED"; + + case CUDA_ERROR_UNMAP_FAILED: + return "CUDA_ERROR_UNMAP_FAILED"; + + case CUDA_ERROR_ARRAY_IS_MAPPED: + return "CUDA_ERROR_ARRAY_IS_MAPPED"; + + case CUDA_ERROR_ALREADY_MAPPED: + return "CUDA_ERROR_ALREADY_MAPPED"; + + case CUDA_ERROR_NO_BINARY_FOR_GPU: + return "CUDA_ERROR_NO_BINARY_FOR_GPU"; + + case CUDA_ERROR_ALREADY_ACQUIRED: + return "CUDA_ERROR_ALREADY_ACQUIRED"; + + case CUDA_ERROR_NOT_MAPPED: + return "CUDA_ERROR_NOT_MAPPED"; + + case CUDA_ERROR_NOT_MAPPED_AS_ARRAY: + return "CUDA_ERROR_NOT_MAPPED_AS_ARRAY"; + + case CUDA_ERROR_NOT_MAPPED_AS_POINTER: + return "CUDA_ERROR_NOT_MAPPED_AS_POINTER"; + + case CUDA_ERROR_ECC_UNCORRECTABLE: + return "CUDA_ERROR_ECC_UNCORRECTABLE"; + + case CUDA_ERROR_UNSUPPORTED_LIMIT: + return "CUDA_ERROR_UNSUPPORTED_LIMIT"; + + case CUDA_ERROR_CONTEXT_ALREADY_IN_USE: + return "CUDA_ERROR_CONTEXT_ALREADY_IN_USE"; + + case CUDA_ERROR_INVALID_SOURCE: + return "CUDA_ERROR_INVALID_SOURCE"; + + case CUDA_ERROR_FILE_NOT_FOUND: + return "CUDA_ERROR_FILE_NOT_FOUND"; + + case CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND: + return "CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND"; + + case CUDA_ERROR_SHARED_OBJECT_INIT_FAILED: + return "CUDA_ERROR_SHARED_OBJECT_INIT_FAILED"; + + case CUDA_ERROR_OPERATING_SYSTEM: + return "CUDA_ERROR_OPERATING_SYSTEM"; + + case CUDA_ERROR_INVALID_HANDLE: + return "CUDA_ERROR_INVALID_HANDLE"; + + case CUDA_ERROR_NOT_FOUND: + return "CUDA_ERROR_NOT_FOUND"; + + case CUDA_ERROR_NOT_READY: + return "CUDA_ERROR_NOT_READY"; + + case CUDA_ERROR_LAUNCH_FAILED: + return "CUDA_ERROR_LAUNCH_FAILED"; + + case CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES: + return "CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES"; + + case CUDA_ERROR_LAUNCH_TIMEOUT: + return "CUDA_ERROR_LAUNCH_TIMEOUT"; + + case CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING: + return "CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING"; + + case CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED: + return "CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED"; + + case CUDA_ERROR_PEER_ACCESS_NOT_ENABLED: + return "CUDA_ERROR_PEER_ACCESS_NOT_ENABLED"; + + case CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE: + return "CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE"; + + case CUDA_ERROR_CONTEXT_IS_DESTROYED: + return "CUDA_ERROR_CONTEXT_IS_DESTROYED"; + + case CUDA_ERROR_ASSERT: + return "CUDA_ERROR_ASSERT"; + + case CUDA_ERROR_TOO_MANY_PEERS: + return "CUDA_ERROR_TOO_MANY_PEERS"; + + case CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED: + return "CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED"; + + case CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED: + return "CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED"; + + case CUDA_ERROR_UNKNOWN: + return "CUDA_ERROR_UNKNOWN"; + } + + return ""; +} +#endif + +#ifdef CUBLAS_API_H_ +// cuBLAS API errors +static const char *_cudaGetErrorEnum(cublasStatus_t error) +{ + switch (error) + { + case CUBLAS_STATUS_SUCCESS: + return "CUBLAS_STATUS_SUCCESS"; + + case CUBLAS_STATUS_NOT_INITIALIZED: + return "CUBLAS_STATUS_NOT_INITIALIZED"; + + case CUBLAS_STATUS_ALLOC_FAILED: + return "CUBLAS_STATUS_ALLOC_FAILED"; + + case CUBLAS_STATUS_INVALID_VALUE: + return "CUBLAS_STATUS_INVALID_VALUE"; + + case CUBLAS_STATUS_ARCH_MISMATCH: + return "CUBLAS_STATUS_ARCH_MISMATCH"; + + case CUBLAS_STATUS_MAPPING_ERROR: + return "CUBLAS_STATUS_MAPPING_ERROR"; + + case CUBLAS_STATUS_EXECUTION_FAILED: + return "CUBLAS_STATUS_EXECUTION_FAILED"; + + case CUBLAS_STATUS_INTERNAL_ERROR: + return "CUBLAS_STATUS_INTERNAL_ERROR"; + } + + return ""; +} +#endif + +#ifdef _CUFFT_H_ +// cuFFT API errors +static const char *_cudaGetErrorEnum(cufftResult error) +{ + switch (error) + { + case CUFFT_SUCCESS: + return "CUFFT_SUCCESS"; + + case CUFFT_INVALID_PLAN: + return "CUFFT_INVALID_PLAN"; + + case CUFFT_ALLOC_FAILED: + return "CUFFT_ALLOC_FAILED"; + + case CUFFT_INVALID_TYPE: + return "CUFFT_INVALID_TYPE"; + + case CUFFT_INVALID_VALUE: + return "CUFFT_INVALID_VALUE"; + + case CUFFT_INTERNAL_ERROR: + return "CUFFT_INTERNAL_ERROR"; + + case CUFFT_EXEC_FAILED: + return "CUFFT_EXEC_FAILED"; + + case CUFFT_SETUP_FAILED: + return "CUFFT_SETUP_FAILED"; + + case CUFFT_INVALID_SIZE: + return "CUFFT_INVALID_SIZE"; + + case CUFFT_UNALIGNED_DATA: + return "CUFFT_UNALIGNED_DATA"; + + case CUFFT_INCOMPLETE_PARAMETER_LIST: + return "CUFFT_INCOMPLETE_PARAMETER_LIST"; + + case CUFFT_INVALID_DEVICE: + return "CUFFT_INVALID_DEVICE"; + + case CUFFT_PARSE_ERROR: + return "CUFFT_PARSE_ERROR"; + + case CUFFT_NO_WORKSPACE: + return "CUFFT_NO_WORKSPACE"; +#if 0 //RRK + case CUFFT_NOT_IMPLEMENTED: + return "CUFFT_NOT_IMPLEMENTED"; + + case CUFFT_LICENSE_ERROR: + return "CUFFT_LICENSE_ERROR"; +#endif + } + + return ""; +} +#endif + + +#ifdef CUSPARSEAPI +// cuSPARSE API errors +static const char *_cudaGetErrorEnum(cusparseStatus_t error) +{ + switch (error) + { + case CUSPARSE_STATUS_SUCCESS: + return "CUSPARSE_STATUS_SUCCESS"; + + case CUSPARSE_STATUS_NOT_INITIALIZED: + return "CUSPARSE_STATUS_NOT_INITIALIZED"; + + case CUSPARSE_STATUS_ALLOC_FAILED: + return "CUSPARSE_STATUS_ALLOC_FAILED"; + + case CUSPARSE_STATUS_INVALID_VALUE: + return "CUSPARSE_STATUS_INVALID_VALUE"; + + case CUSPARSE_STATUS_ARCH_MISMATCH: + return "CUSPARSE_STATUS_ARCH_MISMATCH"; + + case CUSPARSE_STATUS_MAPPING_ERROR: + return "CUSPARSE_STATUS_MAPPING_ERROR"; + + case CUSPARSE_STATUS_EXECUTION_FAILED: + return "CUSPARSE_STATUS_EXECUTION_FAILED"; + + case CUSPARSE_STATUS_INTERNAL_ERROR: + return "CUSPARSE_STATUS_INTERNAL_ERROR"; + + case CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED: + return "CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED"; + } + + return ""; +} +#endif + +#ifdef CURAND_H_ +// cuRAND API errors +static const char *_cudaGetErrorEnum(curandStatus_t error) +{ + switch (error) + { + case CURAND_STATUS_SUCCESS: + return "CURAND_STATUS_SUCCESS"; + + case CURAND_STATUS_VERSION_MISMATCH: + return "CURAND_STATUS_VERSION_MISMATCH"; + + case CURAND_STATUS_NOT_INITIALIZED: + return "CURAND_STATUS_NOT_INITIALIZED"; + + case CURAND_STATUS_ALLOCATION_FAILED: + return "CURAND_STATUS_ALLOCATION_FAILED"; + + case CURAND_STATUS_TYPE_ERROR: + return "CURAND_STATUS_TYPE_ERROR"; + + case CURAND_STATUS_OUT_OF_RANGE: + return "CURAND_STATUS_OUT_OF_RANGE"; + + case CURAND_STATUS_LENGTH_NOT_MULTIPLE: + return "CURAND_STATUS_LENGTH_NOT_MULTIPLE"; + + case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED: + return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED"; + + case CURAND_STATUS_LAUNCH_FAILURE: + return "CURAND_STATUS_LAUNCH_FAILURE"; + + case CURAND_STATUS_PREEXISTING_FAILURE: + return "CURAND_STATUS_PREEXISTING_FAILURE"; + + case CURAND_STATUS_INITIALIZATION_FAILED: + return "CURAND_STATUS_INITIALIZATION_FAILED"; + + case CURAND_STATUS_ARCH_MISMATCH: + return "CURAND_STATUS_ARCH_MISMATCH"; + + case CURAND_STATUS_INTERNAL_ERROR: + return "CURAND_STATUS_INTERNAL_ERROR"; + } + + return ""; +} +#endif + +#ifdef NV_NPPIDEFS_H +// NPP API errors +static const char *_cudaGetErrorEnum(NppStatus error) +{ + switch (error) + { + case NPP_NOT_SUPPORTED_MODE_ERROR: + return "NPP_NOT_SUPPORTED_MODE_ERROR"; + + case NPP_ROUND_MODE_NOT_SUPPORTED_ERROR: + return "NPP_ROUND_MODE_NOT_SUPPORTED_ERROR"; + + case NPP_RESIZE_NO_OPERATION_ERROR: + return "NPP_RESIZE_NO_OPERATION_ERROR"; + + case NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY: + return "NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) <= 0x5000 + + case NPP_BAD_ARG_ERROR: + return "NPP_BAD_ARGUMENT_ERROR"; + + case NPP_COEFF_ERROR: + return "NPP_COEFFICIENT_ERROR"; + + case NPP_RECT_ERROR: + return "NPP_RECTANGLE_ERROR"; + + case NPP_QUAD_ERROR: + return "NPP_QUADRANGLE_ERROR"; + + case NPP_MEM_ALLOC_ERR: + return "NPP_MEMORY_ALLOCATION_ERROR"; + + case NPP_HISTO_NUMBER_OF_LEVELS_ERROR: + return "NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR"; + + case NPP_INVALID_INPUT: + return "NPP_INVALID_INPUT"; + + case NPP_POINTER_ERROR: + return "NPP_POINTER_ERROR"; + + case NPP_WARNING: + return "NPP_WARNING"; + + case NPP_ODD_ROI_WARNING: + return "NPP_ODD_ROI_WARNING"; +#else + + // These are for CUDA 5.5 or higher + case NPP_BAD_ARGUMENT_ERROR: + return "NPP_BAD_ARGUMENT_ERROR"; + + case NPP_COEFFICIENT_ERROR: + return "NPP_COEFFICIENT_ERROR"; + + case NPP_RECTANGLE_ERROR: + return "NPP_RECTANGLE_ERROR"; + + case NPP_QUADRANGLE_ERROR: + return "NPP_QUADRANGLE_ERROR"; + + case NPP_MEMORY_ALLOCATION_ERR: + return "NPP_MEMORY_ALLOCATION_ERROR"; + + case NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR: + return "NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR"; + + case NPP_INVALID_HOST_POINTER_ERROR: + return "NPP_INVALID_HOST_POINTER_ERROR"; + + case NPP_INVALID_DEVICE_POINTER_ERROR: + return "NPP_INVALID_DEVICE_POINTER_ERROR"; +#endif + + case NPP_LUT_NUMBER_OF_LEVELS_ERROR: + return "NPP_LUT_NUMBER_OF_LEVELS_ERROR"; + + case NPP_TEXTURE_BIND_ERROR: + return "NPP_TEXTURE_BIND_ERROR"; + + case NPP_WRONG_INTERSECTION_ROI_ERROR: + return "NPP_WRONG_INTERSECTION_ROI_ERROR"; + + case NPP_NOT_EVEN_STEP_ERROR: + return "NPP_NOT_EVEN_STEP_ERROR"; + + case NPP_INTERPOLATION_ERROR: + return "NPP_INTERPOLATION_ERROR"; + + case NPP_RESIZE_FACTOR_ERROR: + return "NPP_RESIZE_FACTOR_ERROR"; + + case NPP_HAAR_CLASSIFIER_PIXEL_MATCH_ERROR: + return "NPP_HAAR_CLASSIFIER_PIXEL_MATCH_ERROR"; + + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) <= 0x5000 + + case NPP_MEMFREE_ERR: + return "NPP_MEMFREE_ERR"; + + case NPP_MEMSET_ERR: + return "NPP_MEMSET_ERR"; + + case NPP_MEMCPY_ERR: + return "NPP_MEMCPY_ERROR"; + + case NPP_MIRROR_FLIP_ERR: + return "NPP_MIRROR_FLIP_ERR"; +#else + + case NPP_MEMFREE_ERROR: + return "NPP_MEMFREE_ERROR"; + + case NPP_MEMSET_ERROR: + return "NPP_MEMSET_ERROR"; + + case NPP_MEMCPY_ERROR: + return "NPP_MEMCPY_ERROR"; + + case NPP_MIRROR_FLIP_ERROR: + return "NPP_MIRROR_FLIP_ERROR"; +#endif + + case NPP_ALIGNMENT_ERROR: + return "NPP_ALIGNMENT_ERROR"; + + case NPP_STEP_ERROR: + return "NPP_STEP_ERROR"; + + case NPP_SIZE_ERROR: + return "NPP_SIZE_ERROR"; + + case NPP_NULL_POINTER_ERROR: + return "NPP_NULL_POINTER_ERROR"; + + case NPP_CUDA_KERNEL_EXECUTION_ERROR: + return "NPP_CUDA_KERNEL_EXECUTION_ERROR"; + + case NPP_NOT_IMPLEMENTED_ERROR: + return "NPP_NOT_IMPLEMENTED_ERROR"; + + case NPP_ERROR: + return "NPP_ERROR"; + + case NPP_SUCCESS: + return "NPP_SUCCESS"; + + case NPP_WRONG_INTERSECTION_QUAD_WARNING: + return "NPP_WRONG_INTERSECTION_QUAD_WARNING"; + + case NPP_MISALIGNED_DST_ROI_WARNING: + return "NPP_MISALIGNED_DST_ROI_WARNING"; + + case NPP_AFFINE_QUAD_INCORRECT_WARNING: + return "NPP_AFFINE_QUAD_INCORRECT_WARNING"; + + case NPP_DOUBLE_SIZE_WARNING: + return "NPP_DOUBLE_SIZE_WARNING"; + + case NPP_WRONG_INTERSECTION_ROI_WARNING: + return "NPP_WRONG_INTERSECTION_ROI_WARNING"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) >= 0x6000 + /* These are 6.0 or higher */ + case NPP_LUT_PALETTE_BITSIZE_ERROR: + return "NPP_LUT_PALETTE_BITSIZE_ERROR"; + + case NPP_ZC_MODE_NOT_SUPPORTED_ERROR: + return "NPP_ZC_MODE_NOT_SUPPORTED_ERROR"; + + case NPP_QUALITY_INDEX_ERROR: + return "NPP_QUALITY_INDEX_ERROR"; + + case NPP_CHANNEL_ORDER_ERROR: + return "NPP_CHANNEL_ORDER_ERROR"; + + case NPP_ZERO_MASK_VALUE_ERROR: + return "NPP_ZERO_MASK_VALUE_ERROR"; + + case NPP_NUMBER_OF_CHANNELS_ERROR: + return "NPP_NUMBER_OF_CHANNELS_ERROR"; + + case NPP_COI_ERROR: + return "NPP_COI_ERROR"; + + case NPP_DIVISOR_ERROR: + return "NPP_DIVISOR_ERROR"; + + case NPP_CHANNEL_ERROR: + return "NPP_CHANNEL_ERROR"; + + case NPP_STRIDE_ERROR: + return "NPP_STRIDE_ERROR"; + + case NPP_ANCHOR_ERROR: + return "NPP_ANCHOR_ERROR"; + + case NPP_MASK_SIZE_ERROR: + return "NPP_MASK_SIZE_ERROR"; + + case NPP_MOMENT_00_ZERO_ERROR: + return "NPP_MOMENT_00_ZERO_ERROR"; + + case NPP_THRESHOLD_NEGATIVE_LEVEL_ERROR: + return "NPP_THRESHOLD_NEGATIVE_LEVEL_ERROR"; + + case NPP_THRESHOLD_ERROR: + return "NPP_THRESHOLD_ERROR"; + + case NPP_CONTEXT_MATCH_ERROR: + return "NPP_CONTEXT_MATCH_ERROR"; + + case NPP_FFT_FLAG_ERROR: + return "NPP_FFT_FLAG_ERROR"; + + case NPP_FFT_ORDER_ERROR: + return "NPP_FFT_ORDER_ERROR"; + + case NPP_SCALE_RANGE_ERROR: + return "NPP_SCALE_RANGE_ERROR"; + + case NPP_DATA_TYPE_ERROR: + return "NPP_DATA_TYPE_ERROR"; + + case NPP_OUT_OFF_RANGE_ERROR: + return "NPP_OUT_OFF_RANGE_ERROR"; + + case NPP_DIVIDE_BY_ZERO_ERROR: + return "NPP_DIVIDE_BY_ZERO_ERROR"; + + case NPP_RANGE_ERROR: + return "NPP_RANGE_ERROR"; + + case NPP_NO_MEMORY_ERROR: + return "NPP_NO_MEMORY_ERROR"; + + case NPP_ERROR_RESERVED: + return "NPP_ERROR_RESERVED"; + + case NPP_NO_OPERATION_WARNING: + return "NPP_NO_OPERATION_WARNING"; + + case NPP_DIVIDE_BY_ZERO_WARNING: + return "NPP_DIVIDE_BY_ZERO_WARNING"; +#endif + + } + + return ""; +} +#endif + +#ifdef __DRIVER_TYPES_H__ +#ifndef DEVICE_RESET +#define DEVICE_RESET cudaDeviceReset(); +#endif +#else +#ifndef DEVICE_RESET +#define DEVICE_RESET +#endif +#endif + +template< typename T > +void check(T result, char const *const func, const char *const file, int const line) +{ + if (result) + { + fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n", + file, line, static_cast(result), _cudaGetErrorEnum(result), func); + DEVICE_RESET + // Make sure we call CUDA Device Reset before exiting + exit(EXIT_FAILURE); + } +} + +#ifdef __DRIVER_TYPES_H__ +// This will output the proper CUDA error strings in the event that a CUDA host call returns an error +#define checkCudaErrors(val) check ( (val), #val, __FILE__, __LINE__ ) + +// This will output the proper error string when calling cudaGetLastError +#define getLastCudaError(msg) __getLastCudaError (msg, __FILE__, __LINE__) + +inline void __getLastCudaError(const char *errorMessage, const char *file, const int line) +{ + cudaError_t err = cudaGetLastError(); + + if (cudaSuccess != err) + { + fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n", + file, line, errorMessage, (int)err, cudaGetErrorString(err)); + DEVICE_RESET + exit(EXIT_FAILURE); + } +} +#endif + +#ifndef MAX +#define MAX(a,b) (a > b ? a : b) +#endif + +// Beginning of GPU Architecture definitions +inline int _ConvertSMVer2Cores(int major, int minor) +{ + // Defines for GPU Architecture types (using the SM version to determine the # of cores per SM + typedef struct + { + int SM; // 0xMm (hexidecimal notation), M = SM Major version, and m = SM minor version + int Cores; + } sSMtoCores; + + sSMtoCores nGpuArchCoresPerSM[] = + { + { 0x10, 8 }, // Tesla Generation (SM 1.0) G80 class + { 0x11, 8 }, // Tesla Generation (SM 1.1) G8x class + { 0x12, 8 }, // Tesla Generation (SM 1.2) G9x class + { 0x13, 8 }, // Tesla Generation (SM 1.3) GT200 class + { 0x20, 32 }, // Fermi Generation (SM 2.0) GF100 class + { 0x21, 48 }, // Fermi Generation (SM 2.1) GF10x class + { 0x30, 192}, // Kepler Generation (SM 3.0) GK10x class + { 0x32, 192}, // Kepler Generation (SM 3.2) GK10x class + { 0x35, 192}, // Kepler Generation (SM 3.5) GK11x class + { 0x37, 192}, // Kepler Generation (SM 3.7) GK21x class + { 0x50, 128}, // Maxwell Generation (SM 5.0) GM10x class + { -1, -1 } + }; + + int index = 0; + + while (nGpuArchCoresPerSM[index].SM != -1) + { + if (nGpuArchCoresPerSM[index].SM == ((major << 4) + minor)) + { + return nGpuArchCoresPerSM[index].Cores; + } + + index++; + } + + // If we don't find the values, we default use the previous one to run properly + printf("MapSMtoCores for SM %d.%d is undefined. Default to use %d Cores/SM\n", major, minor, nGpuArchCoresPerSM[index-1].Cores); + return nGpuArchCoresPerSM[index-1].Cores; +} +// end of GPU Architecture definitions + +#ifdef __CUDA_RUNTIME_H__ +// General GPU Device CUDA Initialization +inline int gpuDeviceInit(int devID) +{ + int device_count; + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) + { + fprintf(stderr, "gpuDeviceInit() CUDA error: no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + if (devID < 0) + { + devID = 0; + } + + if (devID > device_count-1) + { + fprintf(stderr, "\n"); + fprintf(stderr, ">> %d CUDA capable GPU device(s) detected. <<\n", device_count); + fprintf(stderr, ">> gpuDeviceInit (-device=%d) is not a valid GPU device. <<\n", devID); + fprintf(stderr, "\n"); + return -devID; + } + + cudaDeviceProp deviceProp; + checkCudaErrors(cudaGetDeviceProperties(&deviceProp, devID)); + + if (deviceProp.computeMode == cudaComputeModeProhibited) + { + fprintf(stderr, "Error: device is running in , no threads can use ::cudaSetDevice().\n"); + return -1; + } + + if (deviceProp.major < 1) + { + fprintf(stderr, "gpuDeviceInit(): GPU device does not support CUDA.\n"); + exit(EXIT_FAILURE); + } + + checkCudaErrors(cudaSetDevice(devID)); + printf("gpuDeviceInit() CUDA Device [%d]: \"%s\n", devID, deviceProp.name); + + return devID; +} + +// This function returns the best GPU (with maximum GFLOPS) +inline int gpuGetMaxGflopsDeviceId() +{ + int current_device = 0, sm_per_multiproc = 0; + int max_perf_device = 0; + int device_count = 0, best_SM_arch = 0; + int devices_prohibited = 0; + + unsigned long long max_compute_perf = 0; + cudaDeviceProp deviceProp; + cudaGetDeviceCount(&device_count); + + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) + { + fprintf(stderr, "gpuGetMaxGflopsDeviceId() CUDA error: no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + // Find the best major SM Architecture GPU device + while (current_device < device_count) + { + cudaGetDeviceProperties(&deviceProp, current_device); + + // If this GPU is not running on Compute Mode prohibited, then we can add it to the list + if (deviceProp.computeMode != cudaComputeModeProhibited) + { + if (deviceProp.major > 0 && deviceProp.major < 9999) + { + best_SM_arch = MAX(best_SM_arch, deviceProp.major); + } + } + else + { + devices_prohibited++; + } + + current_device++; + } + + if (devices_prohibited == device_count) + { + fprintf(stderr, "gpuGetMaxGflopsDeviceId() CUDA error: all devices have compute mode prohibited.\n"); + exit(EXIT_FAILURE); + } + + // Find the best CUDA capable GPU device + current_device = 0; + + while (current_device < device_count) + { + cudaGetDeviceProperties(&deviceProp, current_device); + + // If this GPU is not running on Compute Mode prohibited, then we can add it to the list + if (deviceProp.computeMode != cudaComputeModeProhibited) + { + if (deviceProp.major == 9999 && deviceProp.minor == 9999) + { + sm_per_multiproc = 1; + } + else + { + sm_per_multiproc = _ConvertSMVer2Cores(deviceProp.major, deviceProp.minor); + } + + unsigned long long compute_perf = (unsigned long long) deviceProp.multiProcessorCount * sm_per_multiproc * deviceProp.clockRate; + + if (compute_perf > max_compute_perf) + { + // If we find GPU with SM major > 2, search only these + if (best_SM_arch > 2) + { + // If our device==dest_SM_arch, choose this, or else pass + if (deviceProp.major == best_SM_arch) + { + max_compute_perf = compute_perf; + max_perf_device = current_device; + } + } + else + { + max_compute_perf = compute_perf; + max_perf_device = current_device; + } + } + } + + ++current_device; + } + + return max_perf_device; +} + + +// Initialization code to find the best CUDA Device +inline int findCudaDevice(int argc, const char **argv) +{ + cudaDeviceProp deviceProp; + int devID = 0; + + // If the command-line has a device number specified, use it + if (checkCmdLineFlag(argc, argv, "device")) + { + devID = getCmdLineArgumentInt(argc, argv, "device="); + + if (devID < 0) + { + printf("Invalid command line parameter\n "); + exit(EXIT_FAILURE); + } + else + { + devID = gpuDeviceInit(devID); + + if (devID < 0) + { + printf("exiting...\n"); + exit(EXIT_FAILURE); + } + } + } + else + { + // Otherwise pick the device with highest Gflops/s + devID = gpuGetMaxGflopsDeviceId(); + checkCudaErrors(cudaSetDevice(devID)); + checkCudaErrors(cudaGetDeviceProperties(&deviceProp, devID)); + printf("GPU Device %d: \"%s\" with compute capability %d.%d\n\n", devID, deviceProp.name, deviceProp.major, deviceProp.minor); + } + + return devID; +} + +// General check for CUDA GPU SM Capabilities +inline bool checkCudaCapabilities(int major_version, int minor_version) +{ + cudaDeviceProp deviceProp; + deviceProp.major = 0; + deviceProp.minor = 0; + int dev; + + checkCudaErrors(cudaGetDevice(&dev)); + checkCudaErrors(cudaGetDeviceProperties(&deviceProp, dev)); + + if ((deviceProp.major > major_version) || + (deviceProp.major == major_version && deviceProp.minor >= minor_version)) + { + printf(" Device %d: <%16s >, Compute SM %d.%d detected\n", dev, deviceProp.name, deviceProp.major, deviceProp.minor); + return true; + } + else + { + printf(" No GPU device was found that can support CUDA compute capability %d.%d.\n", major_version, minor_version); + return false; + } +} +#endif + +// end of CUDA Helper Functions + + +#endif diff --git a/Source/src/helper_functions.h b/Source/src/helper_functions.h new file mode 100644 index 0000000..11538ba --- /dev/null +++ b/Source/src/helper_functions.h @@ -0,0 +1,42 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +// These are helper functions for the SDK samples (string parsing, timers, image helpers, etc) +#ifndef HELPER_FUNCTIONS_H +#define HELPER_FUNCTIONS_H + +#ifdef WIN32 +#pragma warning(disable:4996) +#endif + +// includes, project +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// includes, timer, string parsing, image helpers +#include // helper functions for timers +#include // helper functions for string parsing +#include // helper functions for image compare, dump, data comparisons + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +#endif // HELPER_FUNCTIONS_H diff --git a/Source/src/helper_image.h b/Source/src/helper_image.h new file mode 100644 index 0000000..4e8b25c --- /dev/null +++ b/Source/src/helper_image.h @@ -0,0 +1,1110 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +// These are helper functions for the SDK samples (image,bitmap) +#ifndef HELPER_IMAGE_H +#define HELPER_IMAGE_H + +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifndef MIN +#define MIN(a,b) ((a < b) ? a : b) +#endif +#ifndef MAX +#define MAX(a,b) ((a > b) ? a : b) +#endif + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +#include + +// namespace unnamed (internal) +namespace +{ + //! size of PGM file header + const unsigned int PGMHeaderSize = 0x40; + + // types + + //! Data converter from unsigned char / unsigned byte to type T + template + struct ConverterFromUByte; + + //! Data converter from unsigned char / unsigned byte + template<> + struct ConverterFromUByte + { + //! Conversion operator + //! @return converted value + //! @param val value to convert + float operator()(const unsigned char &val) + { + return static_cast(val); + } + }; + + //! Data converter from unsigned char / unsigned byte to float + template<> + struct ConverterFromUByte + { + //! Conversion operator + //! @return converted value + //! @param val value to convert + float operator()(const unsigned char &val) + { + return static_cast(val) / 255.0f; + } + }; + + //! Data converter from unsigned char / unsigned byte to type T + template + struct ConverterToUByte; + + //! Data converter from unsigned char / unsigned byte to unsigned int + template<> + struct ConverterToUByte + { + //! Conversion operator (essentially a passthru + //! @return converted value + //! @param val value to convert + unsigned char operator()(const unsigned char &val) + { + return val; + } + }; + + //! Data converter from unsigned char / unsigned byte to unsigned int + template<> + struct ConverterToUByte + { + //! Conversion operator + //! @return converted value + //! @param val value to convert + unsigned char operator()(const float &val) + { + return static_cast(val * 255.0f); + } + }; +} + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +#ifndef FOPEN +#define FOPEN(fHandle,filename,mode) fopen_s(&fHandle, filename, mode) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result != 0) +#endif +#ifndef SSCANF +#define SSCANF sscanf_s +#endif +#else +#ifndef FOPEN +#define FOPEN(fHandle,filename,mode) (fHandle = fopen(filename, mode)) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result == NULL) +#endif +#ifndef SSCANF +#define SSCANF sscanf +#endif +#endif + +inline bool +__loadPPM(const char *file, unsigned char **data, + unsigned int *w, unsigned int *h, unsigned int *channels) +{ + FILE *fp = NULL; + + if (FOPEN_FAIL(FOPEN(fp, file, "rb"))) + { + std::cerr << "__LoadPPM() : Failed to open file: " << file << std::endl; + return false; + } + + // check header + char header[PGMHeaderSize]; + + if (fgets(header, PGMHeaderSize, fp) == NULL) + { + std::cerr << "__LoadPPM() : reading PGM header returned NULL" << std::endl; + return false; + } + + if (strncmp(header, "P5", 2) == 0) + { + *channels = 1; + } + else if (strncmp(header, "P6", 2) == 0) + { + *channels = 3; + } + else + { + std::cerr << "__LoadPPM() : File is not a PPM or PGM image" << std::endl; + *channels = 0; + return false; + } + + // parse header, read maxval, width and height + unsigned int width = 0; + unsigned int height = 0; + unsigned int maxval = 0; + unsigned int i = 0; + + while (i < 3) + { + if (fgets(header, PGMHeaderSize, fp) == NULL) + { + std::cerr << "__LoadPPM() : reading PGM header returned NULL" << std::endl; + return false; + } + + if (header[0] == '#') + { + continue; + } + + if (i == 0) + { + i += SSCANF(header, "%u %u %u", &width, &height, &maxval); + } + else if (i == 1) + { + i += SSCANF(header, "%u %u", &height, &maxval); + } + else if (i == 2) + { + i += SSCANF(header, "%u", &maxval); + } + } + + // check if given handle for the data is initialized + if (NULL != *data) + { + if (*w != width || *h != height) + { + std::cerr << "__LoadPPM() : Invalid image dimensions." << std::endl; + } + } + else + { + *data = (unsigned char *) malloc(sizeof(unsigned char) * width * height **channels); + *w = width; + *h = height; + } + + // read and close file + if (fread(*data, sizeof(unsigned char), width * height **channels, fp) == 0) + { + std::cerr << "__LoadPPM() read data returned error." << std::endl; + } + + fclose(fp); + + return true; +} + +template +inline bool +sdkLoadPGM(const char *file, T **data, unsigned int *w, unsigned int *h) +{ + unsigned char *idata = NULL; + unsigned int channels; + + if (true != __loadPPM(file, &idata, w, h, &channels)) + { + return false; + } + + unsigned int size = *w **h * channels; + + // initialize mem if necessary + // the correct size is checked / set in loadPGMc() + if (NULL == *data) + { + *data = (T *) malloc(sizeof(T) * size); + } + + // copy and cast data + std::transform(idata, idata + size, *data, ConverterFromUByte()); + + free(idata); + + return true; +} + +template +inline bool +sdkLoadPPM4(const char *file, T **data, + unsigned int *w,unsigned int *h) +{ + unsigned char *idata = 0; + unsigned int channels; + + if (__loadPPM(file, &idata, w, h, &channels)) + { + // pad 4th component + int size = *w **h; + // keep the original pointer + unsigned char *idata_orig = idata; + *data = (T *) malloc(sizeof(T) * size * 4); + unsigned char *ptr = *data; + + for (int i=0; i 0); + assert(h > 0); + + std::fstream fh(file, std::fstream::out | std::fstream::binary); + + if (fh.bad()) + { + std::cerr << "__savePPM() : Opening file failed." << std::endl; + return false; + } + + if (channels == 1) + { + fh << "P5\n"; + } + else if (channels == 3) + { + fh << "P6\n"; + } + else + { + std::cerr << "__savePPM() : Invalid number of channels." << std::endl; + return false; + } + + fh << w << "\n" << h << "\n" << 0xff << std::endl; + + for (unsigned int i = 0; (i < (w*h*channels)) && fh.good(); ++i) + { + fh << data[i]; + } + + fh.flush(); + + if (fh.bad()) + { + std::cerr << "__savePPM() : Writing data failed." << std::endl; + return false; + } + + fh.close(); + + return true; +} + +template +inline bool +sdkSavePGM(const char *file, T *data, unsigned int w, unsigned int h) +{ + unsigned int size = w * h; + unsigned char *idata = + (unsigned char *) malloc(sizeof(unsigned char) * size); + + std::transform(data, data + size, idata, ConverterToUByte()); + + // write file + bool result = __savePPM(file, idata, w, h, 1); + + // cleanup + free(idata); + + return result; +} + +inline bool +sdkSavePPM4ub(const char *file, unsigned char *data, + unsigned int w, unsigned int h) +{ + // strip 4th component + int size = w * h; + unsigned char *ndata = (unsigned char *) malloc(sizeof(unsigned char) * size*3); + unsigned char *ptr = ndata; + + for (int i=0; i +inline bool +sdkReadFile(const char *filename, T **data, unsigned int *len, bool verbose) +{ + // check input arguments + assert(NULL != filename); + assert(NULL != len); + + // intermediate storage for the data read + std::vector data_read; + + // open file for reading + FILE *fh = NULL; + + // check if filestream is valid + if (FOPEN_FAIL(FOPEN(fh, filename, "r"))) + { + printf("Unable to open input file: %s\n", filename); + return false; + } + + // read all data elements + T token; + + while (!feof(fh)) + { + fscanf(fh, "%f", &token); + data_read.push_back(token); + } + + // the last element is read twice + data_read.pop_back(); + fclose(fh); + + // check if the given handle is already initialized + if (NULL != *data) + { + if (*len != data_read.size()) + { + std::cerr << "sdkReadFile() : Initialized memory given but " + << "size mismatch with signal read " + << "(data read / data init = " << (unsigned int)data_read.size() + << " / " << *len << ")" << std::endl; + + return false; + } + } + else + { + // allocate storage for the data read + *data = (T *) malloc(sizeof(T) * data_read.size()); + // store signal size + *len = static_cast(data_read.size()); + } + + // copy data + memcpy(*data, &data_read.front(), sizeof(T) * data_read.size()); + + return true; +} + +////////////////////////////////////////////////////////////////////////////// +//! Read file \filename and return the data +//! @return bool if reading the file succeeded, otherwise false +//! @param filename name of the source file +//! @param data uninitialized pointer, returned initialized and pointing to +//! the data read +//! @param len number of data elements in data, -1 on error +////////////////////////////////////////////////////////////////////////////// +template +inline bool +sdkReadFileBlocks(const char *filename, T **data, unsigned int *len, unsigned int block_num, unsigned int block_size, bool verbose) +{ + // check input arguments + assert(NULL != filename); + assert(NULL != len); + + // open file for reading + FILE *fh = fopen(filename, "rb"); + + if (fh == NULL && verbose) + { + std::cerr << "sdkReadFile() : Opening file failed." << std::endl; + return false; + } + + // check if the given handle is already initialized + // allocate storage for the data read + data[block_num] = (T *) malloc(block_size); + + // read all data elements + fseek(fh, block_num * block_size, SEEK_SET); + *len = fread(data[block_num], sizeof(T), block_size/sizeof(T), fh); + + fclose(fh); + + return true; +} + +////////////////////////////////////////////////////////////////////////////// +//! Write a data file \filename +//! @return true if writing the file succeeded, otherwise false +//! @param filename name of the source file +//! @param data data to write +//! @param len number of data elements in data, -1 on error +//! @param epsilon epsilon for comparison +////////////////////////////////////////////////////////////////////////////// +template +inline bool +sdkWriteFile(const char *filename, const T *data, unsigned int len, + const S epsilon, bool verbose, bool append = false) +{ + assert(NULL != filename); + assert(NULL != data); + + // open file for writing + // if (append) { + std::fstream fh(filename, std::fstream::out | std::fstream::ate); + + if (verbose) + { + std::cerr << "sdkWriteFile() : Open file " << filename << " for write/append." << std::endl; + } + + /* } else { + std::fstream fh(filename, std::fstream::out); + if (verbose) { + std::cerr << "sdkWriteFile() : Open file " << filename << " for write." << std::endl; + } + } + */ + + // check if filestream is valid + if (! fh.good()) + { + if (verbose) + { + std::cerr << "sdkWriteFile() : Opening file failed." << std::endl; + } + + return false; + } + + // first write epsilon + fh << "# " << epsilon << "\n"; + + // write data + for (unsigned int i = 0; (i < len) && (fh.good()); ++i) + { + fh << data[i] << ' '; + } + + // Check if writing succeeded + if (! fh.good()) + { + if (verbose) + { + std::cerr << "sdkWriteFile() : Writing file failed." << std::endl; + } + + return false; + } + + // file ends with nl + fh << std::endl; + + return true; +} + +////////////////////////////////////////////////////////////////////////////// +//! Compare two arrays of arbitrary type +//! @return true if \a reference and \a data are identical, otherwise false +//! @param reference timer_interface to the reference data / gold image +//! @param data handle to the computed data +//! @param len number of elements in reference and data +//! @param epsilon epsilon to use for the comparison +////////////////////////////////////////////////////////////////////////////// +template +inline bool +compareData(const T *reference, const T *data, const unsigned int len, + const S epsilon, const float threshold) +{ + assert(epsilon >= 0); + + bool result = true; + unsigned int error_count = 0; + + for (unsigned int i = 0; i < len; ++i) + { + float diff = (float)reference[i] - (float)data[i]; + bool comp = (diff <= epsilon) && (diff >= -epsilon); + result &= comp; + + error_count += !comp; + +#if 0 + + if (! comp) + { + std::cerr << "ERROR, i = " << i << ",\t " + << reference[i] << " / " + << data[i] + << " (reference / data)\n"; + } + +#endif + } + + if (threshold == 0.0f) + { + return (result) ? true : false; + } + else + { + if (error_count) + { + printf("%4.2f(%%) of bytes mismatched (count=%d)\n", (float)error_count*100/(float)len, error_count); + } + + return (len*threshold > error_count) ? true : false; + } +} + +#ifndef __MIN_EPSILON_ERROR +#define __MIN_EPSILON_ERROR 1e-3f +#endif + +////////////////////////////////////////////////////////////////////////////// +//! Compare two arrays of arbitrary type +//! @return true if \a reference and \a data are identical, otherwise false +//! @param reference handle to the reference data / gold image +//! @param data handle to the computed data +//! @param len number of elements in reference and data +//! @param epsilon epsilon to use for the comparison +//! @param epsilon threshold % of (# of bytes) for pass/fail +////////////////////////////////////////////////////////////////////////////// +template +inline bool +compareDataAsFloatThreshold(const T *reference, const T *data, const unsigned int len, + const S epsilon, const float threshold) +{ + assert(epsilon >= 0); + + // If we set epsilon to be 0, let's set a minimum threshold + float max_error = MAX((float)epsilon, __MIN_EPSILON_ERROR); + int error_count = 0; + bool result = true; + + for (unsigned int i = 0; i < len; ++i) + { + float diff = fabs((float)reference[i] - (float)data[i]); + bool comp = (diff < max_error); + result &= comp; + + if (! comp) + { + error_count++; +#if 0 + + if (error_count < 50) + { + printf("\n ERROR(epsilon=%4.3f), i=%d, (ref)0x%02x / (data)0x%02x / (diff)%d\n", + max_error, i, + *(unsigned int *)&reference[i], + *(unsigned int *)&data[i], + (unsigned int)diff); + } + +#endif + } + } + + if (threshold == 0.0f) + { + if (error_count) + { + printf("total # of errors = %d\n", error_count); + } + + return (error_count == 0) ? true : false; + } + else + { + if (error_count) + { + printf("%4.2f(%%) of bytes mismatched (count=%d)\n", (float)error_count*100/(float)len, error_count); + } + + return ((len*threshold > error_count) ? true : false); + } +} + +inline +void sdkDumpBin(void *data, unsigned int bytes, const char *filename) +{ + printf("sdkDumpBin: <%s>\n", filename); + FILE *fp; + FOPEN(fp, filename, "wb"); + fwrite(data, bytes, 1, fp); + fflush(fp); + fclose(fp); +} + +inline +bool sdkCompareBin2BinUint(const char *src_file, const char *ref_file, unsigned int nelements, const float epsilon, const float threshold, char *exec_path) +{ + unsigned int *src_buffer, *ref_buffer; + FILE *src_fp = NULL, *ref_fp = NULL; + + unsigned long error_count = 0; + size_t fsize = 0; + + if (FOPEN_FAIL(FOPEN(src_fp, src_file, "rb"))) + { + printf("compareBin2Bin unable to open src_file: %s\n", src_file); + error_count++; + } + + char *ref_file_path = sdkFindFilePath(ref_file, exec_path); + + if (ref_file_path == NULL) + { + printf("compareBin2Bin unable to find <%s> in <%s>\n", ref_file, exec_path); + printf(">>> Check info.xml and [project//data] folder <%s> <<<\n", ref_file); + printf("Aborting comparison!\n"); + printf(" FAILED\n"); + error_count++; + + if (src_fp) + { + fclose(src_fp); + } + + if (ref_fp) + { + fclose(ref_fp); + } + } + else + { + if (FOPEN_FAIL(FOPEN(ref_fp, ref_file_path, "rb"))) + { + printf("compareBin2Bin unable to open ref_file: %s\n", ref_file_path); + error_count++; + } + + if (src_fp && ref_fp) + { + src_buffer = (unsigned int *)malloc(nelements*sizeof(unsigned int)); + ref_buffer = (unsigned int *)malloc(nelements*sizeof(unsigned int)); + + fsize = fread(src_buffer, nelements, sizeof(unsigned int), src_fp); + fsize = fread(ref_buffer, nelements, sizeof(unsigned int), ref_fp); + + printf("> compareBin2Bin nelements=%d, epsilon=%4.2f, threshold=%4.2f\n", nelements, epsilon, threshold); + printf(" src_file <%s>, size=%d bytes\n", src_file, (int)fsize); + printf(" ref_file <%s>, size=%d bytes\n", ref_file_path, (int)fsize); + + if (!compareData(ref_buffer, src_buffer, nelements, epsilon, threshold)) + { + error_count++; + } + + fclose(src_fp); + fclose(ref_fp); + + free(src_buffer); + free(ref_buffer); + } + else + { + if (src_fp) + { + fclose(src_fp); + } + + if (ref_fp) + { + fclose(ref_fp); + } + } + } + + if (error_count == 0) + { + printf(" OK\n"); + } + else + { + printf(" FAILURE: %d errors...\n", (unsigned int)error_count); + } + + return (error_count == 0); // returns true if all pixels pass +} + +inline +bool sdkCompareBin2BinFloat(const char *src_file, const char *ref_file, unsigned int nelements, const float epsilon, const float threshold, char *exec_path) +{ + float *src_buffer, *ref_buffer; + FILE *src_fp = NULL, *ref_fp = NULL; + size_t fsize = 0; + + unsigned long error_count = 0; + + if (FOPEN_FAIL(FOPEN(src_fp, src_file, "rb"))) + { + printf("compareBin2Bin unable to open src_file: %s\n", src_file); + error_count = 1; + } + + char *ref_file_path = sdkFindFilePath(ref_file, exec_path); + + if (ref_file_path == NULL) + { + printf("compareBin2Bin unable to find <%s> in <%s>\n", ref_file, exec_path); + printf(">>> Check info.xml and [project//data] folder <%s> <<<\n", exec_path); + printf("Aborting comparison!\n"); + printf(" FAILED\n"); + error_count++; + + if (src_fp) + { + fclose(src_fp); + } + + if (ref_fp) + { + fclose(ref_fp); + } + } + else + { + if (FOPEN_FAIL(FOPEN(ref_fp, ref_file_path, "rb"))) + { + printf("compareBin2Bin unable to open ref_file: %s\n", ref_file_path); + error_count = 1; + } + + if (src_fp && ref_fp) + { + src_buffer = (float *)malloc(nelements*sizeof(float)); + ref_buffer = (float *)malloc(nelements*sizeof(float)); + + fsize = fread(src_buffer, nelements, sizeof(float), src_fp); + fsize = fread(ref_buffer, nelements, sizeof(float), ref_fp); + + printf("> compareBin2Bin nelements=%d, epsilon=%4.2f, threshold=%4.2f\n", nelements, epsilon, threshold); + printf(" src_file <%s>, size=%d bytes\n", src_file, (int)fsize); + printf(" ref_file <%s>, size=%d bytes\n", ref_file_path, (int)fsize); + + if (!compareDataAsFloatThreshold(ref_buffer, src_buffer, nelements, epsilon, threshold)) + { + error_count++; + } + + fclose(src_fp); + fclose(ref_fp); + + free(src_buffer); + free(ref_buffer); + } + else + { + if (src_fp) + { + fclose(src_fp); + } + + if (ref_fp) + { + fclose(ref_fp); + } + } + } + + if (error_count == 0) + { + printf(" OK\n"); + } + else + { + printf(" FAILURE: %d errors...\n", (unsigned int)error_count); + } + + return (error_count == 0); // returns true if all pixels pass +} + +inline bool +sdkCompareL2fe(const float *reference, const float *data, + const unsigned int len, const float epsilon) +{ + assert(epsilon >= 0); + + float error = 0; + float ref = 0; + + for (unsigned int i = 0; i < len; ++i) + { + + float diff = reference[i] - data[i]; + error += diff * diff; + ref += reference[i] * reference[i]; + } + + float normRef = sqrtf(ref); + + if (fabs(ref) < 1e-7) + { +#ifdef _DEBUG + std::cerr << "ERROR, reference l2-norm is 0\n"; +#endif + return false; + } + + float normError = sqrtf(error); + error = normError / normRef; + bool result = error < epsilon; +#ifdef _DEBUG + + if (! result) + { + std::cerr << "ERROR, l2-norm error " + << error << " is greater than epsilon " << epsilon << "\n"; + } + +#endif + + return result; +} + +inline bool +sdkLoadPPMub(const char *file, unsigned char **data, + unsigned int *w,unsigned int *h) +{ + unsigned int channels; + return __loadPPM(file, data, w, h, &channels); +} + +inline bool +sdkLoadPPM4ub(const char *file, unsigned char **data, + unsigned int *w, unsigned int *h) +{ + unsigned char *idata = 0; + unsigned int channels; + + if (__loadPPM(file, &idata, w, h, &channels)) + { + // pad 4th component + int size = *w **h; + // keep the original pointer + unsigned char *idata_orig = idata; + *data = (unsigned char *) malloc(sizeof(unsigned char) * size * 4); + unsigned char *ptr = *data; + + for (int i=0; i Compare (a)rendered: <" << src_file << ">\n"; + std::cerr << "> (b)reference: <" << ref_file << ">\n"; + } + + + if (sdkLoadPPM4ub(ref_file, &ref_data, &ref_width, &ref_height) != true) + { + if (verboseErrors) + { + std::cerr << "PPMvsPPM: unable to load ref image file: "<< ref_file << "\n"; + } + + return false; + } + + if (sdkLoadPPM4ub(src_file, &src_data, &src_width, &src_height) != true) + { + std::cerr << "PPMvsPPM: unable to load src image file: " << src_file << "\n"; + return false; + } + + if (src_height != ref_height || src_width != ref_width) + { + if (verboseErrors) std::cerr << "PPMvsPPM: source and ref size mismatch (" << src_width << + "," << src_height << ")vs(" << ref_width << "," << ref_height << ")\n"; + } + + if (verboseErrors) std::cerr << "PPMvsPPM: comparing images size (" << src_width << + "," << src_height << ") epsilon(" << epsilon << "), threshold(" << threshold*100 << "%)\n"; + + if (compareData(ref_data, src_data, src_width*src_height*4, epsilon, threshold) == false) + { + error_count=1; + } + + if (error_count == 0) + { + if (verboseErrors) + { + std::cerr << " OK\n\n"; + } + } + else + { + if (verboseErrors) + { + std::cerr << " FAILURE! "< Compare (a)rendered: <" << src_file << ">\n"; + std::cerr << "> (b)reference: <" << ref_file << ">\n"; + } + + + if (sdkLoadPPMub(ref_file, &ref_data, &ref_width, &ref_height) != true) + { + if (verboseErrors) + { + std::cerr << "PGMvsPGM: unable to load ref image file: "<< ref_file << "\n"; + } + + return false; + } + + if (sdkLoadPPMub(src_file, &src_data, &src_width, &src_height) != true) + { + std::cerr << "PGMvsPGM: unable to load src image file: " << src_file << "\n"; + return false; + } + + if (src_height != ref_height || src_width != ref_width) + { + if (verboseErrors) std::cerr << "PGMvsPGM: source and ref size mismatch (" << src_width << + "," << src_height << ")vs(" << ref_width << "," << ref_height << ")\n"; + } + + if (verboseErrors) std::cerr << "PGMvsPGM: comparing images size (" << src_width << + "," << src_height << ") epsilon(" << epsilon << "), threshold(" << threshold*100 << "%)\n"; + + if (compareData(ref_data, src_data, src_width*src_height, epsilon, threshold) == false) + { + error_count=1; + } + + if (error_count == 0) + { + if (verboseErrors) + { + std::cerr << " OK\n\n"; + } + } + else + { + if (verboseErrors) + { + std::cerr << " FAILURE! "< +#include +#include +#include + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#ifndef STRCASECMP +#define STRCASECMP _stricmp +#endif +#ifndef STRNCASECMP +#define STRNCASECMP _strnicmp +#endif +#ifndef STRCPY +#define STRCPY(sFilePath, nLength, sPath) strcpy_s(sFilePath, nLength, sPath) +#endif + +#ifndef FOPEN +#define FOPEN(fHandle,filename,mode) fopen_s(&fHandle, filename, mode) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result != 0) +#endif +#ifndef SSCANF +#define SSCANF sscanf_s +#endif +#ifndef SPRINTF +#define SPRINTF sprintf_s +#endif +#else // Linux Includes +#include +#include + +#ifndef STRCASECMP +#define STRCASECMP strcasecmp +#endif +#ifndef STRNCASECMP +#define STRNCASECMP strncasecmp +#endif +#ifndef STRCPY +#define STRCPY(sFilePath, nLength, sPath) strcpy(sFilePath, sPath) +#endif + +#ifndef FOPEN +#define FOPEN(fHandle,filename,mode) (fHandle = fopen(filename, mode)) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result == NULL) +#endif +#ifndef SSCANF +#define SSCANF sscanf +#endif +#ifndef SPRINTF +#define SPRINTF sprintf +#endif +#endif + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// CUDA Utility Helper Functions +inline int stringRemoveDelimiter(char delimiter, const char *string) +{ + int string_start = 0; + + while (string[string_start] == delimiter) + { + string_start++; + } + + if (string_start >= (int)strlen(string)-1) + { + return 0; + } + + return string_start; +} + +inline int getFileExtension(char *filename, char **extension) +{ + int string_length = (int)strlen(filename); + + while (filename[string_length--] != '.') + { + if (string_length == 0) + break; + } + + if (string_length > 0) string_length += 2; + + if (string_length == 0) + *extension = NULL; + else + *extension = &filename[string_length]; + + return string_length; +} + + +inline bool checkCmdLineFlag(const int argc, const char **argv, const char *string_ref) +{ + bool bFound = false; + + if (argc >= 1) + { + for (int i=1; i < argc; i++) + { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + + const char *equal_pos = strchr(string_argv, '='); + int argv_length = (int)(equal_pos == 0 ? strlen(string_argv) : equal_pos - string_argv); + + int length = (int)strlen(string_ref); + + if (length == argv_length && !STRNCASECMP(string_argv, string_ref, length)) + { + bFound = true; + continue; + } + } + } + + return bFound; +} + +// This function wraps the CUDA Driver API into a template function +template +inline bool getCmdLineArgumentValue(const int argc, const char **argv, const char *string_ref, T *value) +{ + bool bFound = false; + + if (argc >= 1) + { + for (int i=1; i < argc; i++) + { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) + { + if (length+1 <= (int)strlen(string_argv)) + { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + *value = (T)atoi(&string_argv[length + auto_inc]); + } + + bFound = true; + i=argc; + } + } + } + + return bFound; +} + +inline int getCmdLineArgumentInt(const int argc, const char **argv, const char *string_ref) +{ + bool bFound = false; + int value = -1; + + if (argc >= 1) + { + for (int i=1; i < argc; i++) + { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) + { + if (length+1 <= (int)strlen(string_argv)) + { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + value = atoi(&string_argv[length + auto_inc]); + } + else + { + value = 0; + } + + bFound = true; + continue; + } + } + } + + if (bFound) + { + return value; + } + else + { + return 0; + } +} + +inline float getCmdLineArgumentFloat(const int argc, const char **argv, const char *string_ref) +{ + bool bFound = false; + float value = -1; + + if (argc >= 1) + { + for (int i=1; i < argc; i++) + { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) + { + if (length+1 <= (int)strlen(string_argv)) + { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + value = (float)atof(&string_argv[length + auto_inc]); + } + else + { + value = 0.f; + } + + bFound = true; + continue; + } + } + } + + if (bFound) + { + return value; + } + else + { + return 0; + } +} + +inline bool getCmdLineArgumentString(const int argc, const char **argv, + const char *string_ref, char **string_retval) +{ + bool bFound = false; + + if (argc >= 1) + { + for (int i=1; i < argc; i++) + { + int string_start = stringRemoveDelimiter('-', argv[i]); + char *string_argv = (char *)&argv[i][string_start]; + int length = (int)strlen(string_ref); + + if (!STRNCASECMP(string_argv, string_ref, length)) + { + *string_retval = &string_argv[length+1]; + bFound = true; + continue; + } + } + } + + if (!bFound) + { + *string_retval = NULL; + } + + return bFound; +} + +////////////////////////////////////////////////////////////////////////////// +//! Find the path for a file assuming that +//! files are found in the searchPath. +//! +//! @return the path if succeeded, otherwise 0 +//! @param filename name of the file +//! @param executable_path optional absolute path of the executable +////////////////////////////////////////////////////////////////////////////// +inline char *sdkFindFilePath(const char *filename, const char *executable_path) +{ + // defines a variable that is replaced with the name of the executable + + // Typical relative search paths to locate needed companion files (e.g. sample input data, or JIT source files) + // The origin for the relative search may be the .exe file, a .bat file launching an .exe, a browser .exe launching the .exe or .bat, etc + const char *searchPath[] = + { + "./", // same dir + "./common/", // "/common/" subdir + "./common/data/", // "/common/data/" subdir + "./data/", // "/data/" subdir + "./src/", // "/src/" subdir + "./src//data/", // "/src//data/" subdir + "./inc/", // "/inc/" subdir + "./0_Simple/", // "/0_Simple/" subdir + "./1_Utilities/", // "/1_Utilities/" subdir + "./2_Graphics/", // "/2_Graphics/" subdir + "./3_Imaging/", // "/3_Imaging/" subdir + "./4_Financial/", // "/4_Financial/" subdir + "./5_Simulations/", // "/5_Simulations/" subdir + "./6_Advanced/", // "/6_Advanced/" subdir + "./7_CUDALibraries/", // "/7_CUDALibraries/" subdir + "./8_Android/", // "/8_Android/" subdir + "./samples/", // "/samples/" subdir + + "../", // up 1 in tree + "../common/", // up 1 in tree, "/common/" subdir + "../common/data/", // up 1 in tree, "/common/data/" subdir + "../data/", // up 1 in tree, "/data/" subdir + "../src/", // up 1 in tree, "/src/" subdir + "../inc/", // up 1 in tree, "/inc/" subdir + + "../0_Simple//data/", // up 1 in tree, "/0_Simple//" subdir + "../1_Utilities//data/", // up 1 in tree, "/1_Utilities//" subdir + "../2_Graphics//data/", // up 1 in tree, "/2_Graphics//" subdir + "../3_Imaging//data/", // up 1 in tree, "/3_Imaging//" subdir + "../4_Financial//data/", // up 1 in tree, "/4_Financial//" subdir + "../5_Simulations//data/", // up 1 in tree, "/5_Simulations//" subdir + "../6_Advanced//data/", // up 1 in tree, "/6_Advanced//" subdir + "../7_CUDALibraries//data/",// up 1 in tree, "/7_CUDALibraries//" subdir + "../8_Android//data/", // up 1 in tree, "/8_Android//" subdir + "../samples//data/", // up 1 in tree, "/samples//" subdir + "../../", // up 2 in tree + "../../common/", // up 2 in tree, "/common/" subdir + "../../common/data/", // up 2 in tree, "/common/data/" subdir + "../../data/", // up 2 in tree, "/data/" subdir + "../../src/", // up 2 in tree, "/src/" subdir + "../../inc/", // up 2 in tree, "/inc/" subdir + "../../sandbox//data/", // up 2 in tree, "/sandbox//" subdir + "../../0_Simple//data/", // up 2 in tree, "/0_Simple//" subdir + "../../1_Utilities//data/", // up 2 in tree, "/1_Utilities//" subdir + "../../2_Graphics//data/", // up 2 in tree, "/2_Graphics//" subdir + "../../3_Imaging//data/", // up 2 in tree, "/3_Imaging//" subdir + "../../4_Financial//data/", // up 2 in tree, "/4_Financial//" subdir + "../../5_Simulations//data/", // up 2 in tree, "/5_Simulations//" subdir + "../../6_Advanced//data/", // up 2 in tree, "/6_Advanced//" subdir + "../../7_CUDALibraries//data/", // up 2 in tree, "/7_CUDALibraries//" subdir + "../../8_Android//data/", // up 2 in tree, "/8_Android//" subdir + "../../samples//data/", // up 2 in tree, "/samples//" subdir + "../../../", // up 3 in tree + "../../../src//", // up 3 in tree, "/src//" subdir + "../../../src//data/", // up 3 in tree, "/src//data/" subdir + "../../../src//src/", // up 3 in tree, "/src//src/" subdir + "../../../src//inc/", // up 3 in tree, "/src//inc/" subdir + "../../../sandbox//", // up 3 in tree, "/sandbox//" subdir + "../../../sandbox//data/", // up 3 in tree, "/sandbox//data/" subdir + "../../../sandbox//src/", // up 3 in tree, "/sandbox//src/" subdir + "../../../sandbox//inc/", // up 3 in tree, "/sandbox//inc/" subdir + "../../../0_Simple//data/", // up 3 in tree, "/0_Simple//" subdir + "../../../1_Utilities//data/", // up 3 in tree, "/1_Utilities//" subdir + "../../../2_Graphics//data/", // up 3 in tree, "/2_Graphics//" subdir + "../../../3_Imaging//data/", // up 3 in tree, "/3_Imaging//" subdir + "../../../4_Financial//data/", // up 3 in tree, "/4_Financial//" subdir + "../../../5_Simulations//data/", // up 3 in tree, "/5_Simulations//" subdir + "../../../6_Advanced//data/", // up 3 in tree, "/6_Advanced//" subdir + "../../../7_CUDALibraries//data/", // up 3 in tree, "/7_CUDALibraries//" subdir + "../../../8_Android//data/", // up 3 in tree, "/8_Android//" subdir + "../../../samples//data/", // up 3 in tree, "/samples//" subdir + "../../../common/", // up 3 in tree, "../../../common/" subdir + "../../../common/data/", // up 3 in tree, "../../../common/data/" subdir + "../../../data/", // up 3 in tree, "../../../data/" subdir + "../../../../", // up 4 in tree + "../../../../src//", // up 4 in tree, "/src//" subdir + "../../../../src//data/", // up 4 in tree, "/src//data/" subdir + "../../../../src//src/", // up 4 in tree, "/src//src/" subdir + "../../../../src//inc/", // up 4 in tree, "/src//inc/" subdir + "../../../../sandbox//", // up 4 in tree, "/sandbox//" subdir + "../../../../sandbox//data/", // up 4 in tree, "/sandbox//data/" subdir + "../../../../sandbox//src/", // up 4 in tree, "/sandbox//src/" subdir + "../../../../sandbox//inc/", // up 4 in tree, "/sandbox//inc/" subdir + "../../../../0_Simple//data/", // up 4 in tree, "/0_Simple//" subdir + "../../../../1_Utilities//data/", // up 4 in tree, "/1_Utilities//" subdir + "../../../../2_Graphics//data/", // up 4 in tree, "/2_Graphics//" subdir + "../../../../3_Imaging//data/", // up 4 in tree, "/3_Imaging//" subdir + "../../../../4_Financial//data/", // up 4 in tree, "/4_Financial//" subdir + "../../../../5_Simulations//data/",// up 4 in tree, "/5_Simulations//" subdir + "../../../../6_Advanced//data/", // up 4 in tree, "/6_Advanced//" subdir + "../../../../7_CUDALibraries//data/", // up 4 in tree, "/7_CUDALibraries//" subdir + "../../../../8_Android//data/", // up 4 in tree, "/8_Android//" subdir + "../../../../samples//data/", // up 4 in tree, "/samples//" subdir + "../../../../common/", // up 4 in tree, "../../../common/" subdir + "../../../../common/data/", // up 4 in tree, "../../../common/data/" subdir + "../../../../data/", // up 4 in tree, "../../../data/" subdir + "../../../../../", // up 5 in tree + "../../../../../src//", // up 5 in tree, "/src//" subdir + "../../../../../src//data/", // up 5 in tree, "/src//data/" subdir + "../../../../../src//src/", // up 5 in tree, "/src//src/" subdir + "../../../../../src//inc/", // up 5 in tree, "/src//inc/" subdir + "../../../../../sandbox//", // up 5 in tree, "/sandbox//" subdir + "../../../../../sandbox//data/", // up 5 in tree, "/sandbox//data/" subdir + "../../../../../sandbox//src/", // up 5 in tree, "/sandbox//src/" subdir + "../../../../../sandbox//inc/", // up 5 in tree, "/sandbox//inc/" subdir + "../../../../../0_Simple//data/", // up 5 in tree, "/0_Simple//" subdir + "../../../../../1_Utilities//data/", // up 5 in tree, "/1_Utilities//" subdir + "../../../../../2_Graphics//data/", // up 5 in tree, "/2_Graphics//" subdir + "../../../../../3_Imaging//data/", // up 5 in tree, "/3_Imaging//" subdir + "../../../../../4_Financial//data/", // up 5 in tree, "/4_Financial//" subdir + "../../../../../5_Simulations//data/",// up 5 in tree, "/5_Simulations//" subdir + "../../../../../6_Advanced//data/", // up 5 in tree, "/6_Advanced//" subdir + "../../../../../7_CUDALibraries//data/", // up 5 in tree, "/7_CUDALibraries//" subdir + "../../../../../8_Android//data/", // up 5 in tree, "/8_Android//" subdir + "../../../../../samples//data/", // up 5 in tree, "/samples//" subdir + "../../../../../common/", // up 5 in tree, "../../../common/" subdir + "../../../../../common/data/", // up 5 in tree, "../../../common/data/" subdir + }; + + // Extract the executable name + std::string executable_name; + + if (executable_path != 0) + { + executable_name = std::string(executable_path); + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + // Windows path delimiter + size_t delimiter_pos = executable_name.find_last_of('\\'); + executable_name.erase(0, delimiter_pos + 1); + + if (executable_name.rfind(".exe") != std::string::npos) + { + // we strip .exe, only if the .exe is found + executable_name.resize(executable_name.size() - 4); + } + +#else + // Linux & OSX path delimiter + size_t delimiter_pos = executable_name.find_last_of('/'); + executable_name.erase(0,delimiter_pos+1); +#endif + } + + // Loop over all search paths and return the first hit + for (unsigned int i = 0; i < sizeof(searchPath)/sizeof(char *); ++i) + { + std::string path(searchPath[i]); + size_t executable_name_pos = path.find(""); + + // If there is executable_name variable in the searchPath + // replace it with the value + if (executable_name_pos != std::string::npos) + { + if (executable_path != 0) + { + path.replace(executable_name_pos, strlen(""), executable_name); + } + else + { + // Skip this path entry if no executable argument is given + continue; + } + } + +#ifdef _DEBUG + printf("sdkFindFilePath <%s> in %s\n", filename, path.c_str()); +#endif + + // Test if the file exists + path.append(filename); + FILE *fp; + FOPEN(fp, path.c_str(), "rb"); + + if (fp != NULL) + { + fclose(fp); + // File found + // returning an allocated array here for backwards compatibility reasons + char *file_path = (char *) malloc(path.length() + 1); + STRCPY(file_path, path.length() + 1, path.c_str()); + return file_path; + } + + if (fp) + { + fclose(fp); + } + } + + // File not found + return 0; +} + +#endif diff --git a/Source/src/helper_timer.h b/Source/src/helper_timer.h new file mode 100644 index 0000000..39ddc77 --- /dev/null +++ b/Source/src/helper_timer.h @@ -0,0 +1,499 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +// Helper Timing Functions +#ifndef HELPER_TIMER_H +#define HELPER_TIMER_H + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// includes, system +#include + +// includes, project +#include + +// Definition of the StopWatch Interface, this is used if we don't want to use the CUT functions +// But rather in a self contained class interface +class StopWatchInterface +{ + public: + StopWatchInterface() {}; + virtual ~StopWatchInterface() {}; + + public: + //! Start time measurement + virtual void start() = 0; + + //! Stop time measurement + virtual void stop() = 0; + + //! Reset time counters to zero + virtual void reset() = 0; + + //! Time in msec. after start. If the stop watch is still running (i.e. there + //! was no call to stop()) then the elapsed time is returned, otherwise the + //! time between the last start() and stop call is returned + virtual float getTime() = 0; + + //! Mean time to date based on the number of times the stopwatch has been + //! _stopped_ (ie finished sessions) and the current total time + virtual float getAverageTime() = 0; +}; + + +////////////////////////////////////////////////////////////////// +// Begin Stopwatch timer class definitions for all OS platforms // +////////////////////////////////////////////////////////////////// +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +// includes, system +#define WINDOWS_LEAN_AND_MEAN +#include +#undef min +#undef max + +//! Windows specific implementation of StopWatch +class StopWatchWin : public StopWatchInterface +{ + public: + //! Constructor, default + StopWatchWin() : + start_time(), end_time(), + diff_time(0.0f), total_time(0.0f), + running(false), clock_sessions(0), freq(0), freq_set(false) + { + if (! freq_set) + { + // helper variable + LARGE_INTEGER temp; + + // get the tick frequency from the OS + QueryPerformanceFrequency((LARGE_INTEGER *) &temp); + + // convert to type in which it is needed + freq = ((double) temp.QuadPart) / 1000.0; + + // rememeber query + freq_set = true; + } + }; + + // Destructor + ~StopWatchWin() { }; + + public: + //! Start time measurement + inline void start(); + + //! Stop time measurement + inline void stop(); + + //! Reset time counters to zero + inline void reset(); + + //! Time in msec. after start. If the stop watch is still running (i.e. there + //! was no call to stop()) then the elapsed time is returned, otherwise the + //! time between the last start() and stop call is returned + inline float getTime(); + + //! Mean time to date based on the number of times the stopwatch has been + //! _stopped_ (ie finished sessions) and the current total time + inline float getAverageTime(); + + private: + // member variables + + //! Start of measurement + LARGE_INTEGER start_time; + //! End of measurement + LARGE_INTEGER end_time; + + //! Time difference between the last start and stop + float diff_time; + + //! TOTAL time difference between starts and stops + float total_time; + + //! flag if the stop watch is running + bool running; + + //! Number of times clock has been started + //! and stopped to allow averaging + int clock_sessions; + + //! tick frequency + double freq; + + //! flag if the frequency has been set + bool freq_set; +}; + +// functions, inlined + +//////////////////////////////////////////////////////////////////////////////// +//! Start time measurement +//////////////////////////////////////////////////////////////////////////////// +inline void +StopWatchWin::start() +{ + QueryPerformanceCounter((LARGE_INTEGER *) &start_time); + running = true; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Stop time measurement and increment add to the current diff_time summation +//! variable. Also increment the number of times this clock has been run. +//////////////////////////////////////////////////////////////////////////////// +inline void +StopWatchWin::stop() +{ + QueryPerformanceCounter((LARGE_INTEGER *) &end_time); + diff_time = (float) + (((double) end_time.QuadPart - (double) start_time.QuadPart) / freq); + + total_time += diff_time; + clock_sessions++; + running = false; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Reset the timer to 0. Does not change the timer running state but does +//! recapture this point in time as the current start time if it is running. +//////////////////////////////////////////////////////////////////////////////// +inline void +StopWatchWin::reset() +{ + diff_time = 0; + total_time = 0; + clock_sessions = 0; + + if (running) + { + QueryPerformanceCounter((LARGE_INTEGER *) &start_time); + } +} + + +//////////////////////////////////////////////////////////////////////////////// +//! Time in msec. after start. If the stop watch is still running (i.e. there +//! was no call to stop()) then the elapsed time is returned added to the +//! current diff_time sum, otherwise the current summed time difference alone +//! is returned. +//////////////////////////////////////////////////////////////////////////////// +inline float +StopWatchWin::getTime() +{ + // Return the TOTAL time to date + float retval = total_time; + + if (running) + { + LARGE_INTEGER temp; + QueryPerformanceCounter((LARGE_INTEGER *) &temp); + retval += (float) + (((double)(temp.QuadPart - start_time.QuadPart)) / freq); + } + + return retval; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Time in msec. for a single run based on the total number of COMPLETED runs +//! and the total time. +//////////////////////////////////////////////////////////////////////////////// +inline float +StopWatchWin::getAverageTime() +{ + return (clock_sessions > 0) ? (total_time/clock_sessions) : 0.0f; +} +#else +// Declarations for Stopwatch on Linux and Mac OSX +// includes, system +#include +#include + +//! Windows specific implementation of StopWatch +class StopWatchLinux : public StopWatchInterface +{ + public: + //! Constructor, default + StopWatchLinux() : + start_time(), diff_time(0.0), total_time(0.0), + running(false), clock_sessions(0) + { }; + + // Destructor + virtual ~StopWatchLinux() + { }; + + public: + //! Start time measurement + inline void start(); + + //! Stop time measurement + inline void stop(); + + //! Reset time counters to zero + inline void reset(); + + //! Time in msec. after start. If the stop watch is still running (i.e. there + //! was no call to stop()) then the elapsed time is returned, otherwise the + //! time between the last start() and stop call is returned + inline float getTime(); + + //! Mean time to date based on the number of times the stopwatch has been + //! _stopped_ (ie finished sessions) and the current total time + inline float getAverageTime(); + + private: + + // helper functions + + //! Get difference between start time and current time + inline float getDiffTime(); + + private: + + // member variables + + //! Start of measurement + struct timeval start_time; + + //! Time difference between the last start and stop + float diff_time; + + //! TOTAL time difference between starts and stops + float total_time; + + //! flag if the stop watch is running + bool running; + + //! Number of times clock has been started + //! and stopped to allow averaging + int clock_sessions; +}; + +// functions, inlined + +//////////////////////////////////////////////////////////////////////////////// +//! Start time measurement +//////////////////////////////////////////////////////////////////////////////// +inline void +StopWatchLinux::start() +{ + gettimeofday(&start_time, 0); + running = true; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Stop time measurement and increment add to the current diff_time summation +//! variable. Also increment the number of times this clock has been run. +//////////////////////////////////////////////////////////////////////////////// +inline void +StopWatchLinux::stop() +{ + diff_time = getDiffTime(); + total_time += diff_time; + running = false; + clock_sessions++; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Reset the timer to 0. Does not change the timer running state but does +//! recapture this point in time as the current start time if it is running. +//////////////////////////////////////////////////////////////////////////////// +inline void +StopWatchLinux::reset() +{ + diff_time = 0; + total_time = 0; + clock_sessions = 0; + + if (running) + { + gettimeofday(&start_time, 0); + } +} + +//////////////////////////////////////////////////////////////////////////////// +//! Time in msec. after start. If the stop watch is still running (i.e. there +//! was no call to stop()) then the elapsed time is returned added to the +//! current diff_time sum, otherwise the current summed time difference alone +//! is returned. +//////////////////////////////////////////////////////////////////////////////// +inline float +StopWatchLinux::getTime() +{ + // Return the TOTAL time to date + float retval = total_time; + + if (running) + { + retval += getDiffTime(); + } + + return retval; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Time in msec. for a single run based on the total number of COMPLETED runs +//! and the total time. +//////////////////////////////////////////////////////////////////////////////// +inline float +StopWatchLinux::getAverageTime() +{ + return (clock_sessions > 0) ? (total_time/clock_sessions) : 0.0f; +} +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +inline float +StopWatchLinux::getDiffTime() +{ + struct timeval t_time; + gettimeofday(&t_time, 0); + + // time difference in milli-seconds + return (float)(1000.0 * (t_time.tv_sec - start_time.tv_sec) + + (0.001 * (t_time.tv_usec - start_time.tv_usec))); +} +#endif // WIN32 + +//////////////////////////////////////////////////////////////////////////////// +//! Timer functionality exported + +//////////////////////////////////////////////////////////////////////////////// +//! Create a new timer +//! @return true if a time has been created, otherwise false +//! @param name of the new timer, 0 if the creation failed +//////////////////////////////////////////////////////////////////////////////// +inline bool +sdkCreateTimer(StopWatchInterface **timer_interface) +{ + //printf("sdkCreateTimer called object %08x\n", (void *)*timer_interface); +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + *timer_interface = (StopWatchInterface *)new StopWatchWin(); +#else + *timer_interface = (StopWatchInterface *)new StopWatchLinux(); +#endif + return (*timer_interface != NULL) ? true : false; +} + + +//////////////////////////////////////////////////////////////////////////////// +//! Delete a timer +//! @return true if a time has been deleted, otherwise false +//! @param name of the timer to delete +//////////////////////////////////////////////////////////////////////////////// +inline bool +sdkDeleteTimer(StopWatchInterface **timer_interface) +{ + //printf("sdkDeleteTimer called object %08x\n", (void *)*timer_interface); + if (*timer_interface) + { + delete *timer_interface; + *timer_interface = NULL; + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Start the time with name \a name +//! @param name name of the timer to start +//////////////////////////////////////////////////////////////////////////////// +inline bool +sdkStartTimer(StopWatchInterface **timer_interface) +{ + //printf("sdkStartTimer called object %08x\n", (void *)*timer_interface); + if (*timer_interface) + { + (*timer_interface)->start(); + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Stop the time with name \a name. Does not reset. +//! @param name name of the timer to stop +//////////////////////////////////////////////////////////////////////////////// +inline bool +sdkStopTimer(StopWatchInterface **timer_interface) +{ + // printf("sdkStopTimer called object %08x\n", (void *)*timer_interface); + if (*timer_interface) + { + (*timer_interface)->stop(); + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Resets the timer's counter. +//! @param name name of the timer to reset. +//////////////////////////////////////////////////////////////////////////////// +inline bool +sdkResetTimer(StopWatchInterface **timer_interface) +{ + // printf("sdkResetTimer called object %08x\n", (void *)*timer_interface); + if (*timer_interface) + { + (*timer_interface)->reset(); + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +//! Return the average time for timer execution as the total time +//! for the timer dividied by the number of completed (stopped) runs the timer +//! has made. +//! Excludes the current running time if the timer is currently running. +//! @param name name of the timer to return the time of +//////////////////////////////////////////////////////////////////////////////// +inline float +sdkGetAverageTimerValue(StopWatchInterface **timer_interface) +{ + // printf("sdkGetAverageTimerValue called object %08x\n", (void *)*timer_interface); + if (*timer_interface) + { + return (*timer_interface)->getAverageTime(); + } + else + { + return 0.0f; + } +} + +//////////////////////////////////////////////////////////////////////////////// +//! Total execution time for the timer over all runs since the last reset +//! or timer creation. +//! @param name name of the timer to obtain the value of. +//////////////////////////////////////////////////////////////////////////////// +inline float +sdkGetTimerValue(StopWatchInterface **timer_interface) +{ + // printf("sdkGetTimerValue called object %08x\n", (void *)*timer_interface); + if (*timer_interface) + { + return (*timer_interface)->getTime(); + } + else + { + return 0.0f; + } +} + +#endif // HELPER_TIMER_H diff --git a/Source/src/main.cpp b/Source/src/main.cpp new file mode 100644 index 0000000..f7baf67 --- /dev/null +++ b/Source/src/main.cpp @@ -0,0 +1,385 @@ +/** +* @file main.cpp +* @brief main +* @author Hermann von Hasseln, DL3HVH +* @version 0.1 +* @date 2010-09-08 +*/ + +/* + * Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "Util/cusdr_splash.h" +#include "cusdr_settings.h" + + +#if defined(Q_OS_WIN32) + #include "Util/cusdr_cpuUsage.h" +#elif defined(Q_OS_LINUX) + #include "Util/cusdr_cpuUsage_unix.h" +#endif + +#include "fftw3.h" +#include "cusdr_mainWidget.h" + +//#include +#include +#include +#include +//#include +#include +#include +//#include + +//#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. +//#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows. +//#endif + +// CPU usage +#if defined(Q_OS_WIN32) + DWORD WINAPI WatchItThreadProc(LPVOID lpParam); + CpuUsage usage; + + DWORD WINAPI WatchItThreadProc(LPVOID lpParam) { + + Q_UNUSED(lpParam) + + DWORD dummy; + while (true) { + + short cpuUsage = usage.GetUsage(); + Settings::instance()->setCPULoad(cpuUsage); + + Sleep(1000); + } + return dummy; + } +#endif + +void cuSDRMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { + + Q_UNUSED(type) + + QString txt; + QDateTime date; + + txt = msg; + txt.prepend(": "); + txt.prepend(date.currentDateTime().toString()); + + QFile outFile("cudaSDR.log"); + outFile.open(QIODevice::WriteOnly | QIODevice::Append); + QTextStream ts(&outFile); + ts << txt << endl << flush; +} + +static void my_fftw_write_char(char c, void *f) { fputc(c, (FILE *) f); } +#define fftw_export_wisdom_to_file(f) fftw_export_wisdom(my_fftw_write_char, (void*) (f)) +#define fftwf_export_wisdom_to_file(f) fftwf_export_wisdom(my_fftw_write_char, (void*) (f)) +#define fftwl_export_wisdom_to_file(f) fftwl_export_wisdom(my_fftw_write_char, (void*) (f)) + +static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); } +#define fftw_import_wisdom_from_file(f) fftw_import_wisdom(my_fftw_read_char, (void*) (f)) +#define fftwf_import_wisdom_from_file(f) fftwf_import_wisdom(my_fftw_read_char, (void*) (f)) +#define fftwl_import_wisdom_from_file(f) fftwl_import_wisdom(my_fftw_read_char, (void*) (f)) + +void runFFTWWisdom() { + + QString directory = QDir::currentPath(); + + QDir currentDir = QDir(directory); + qDebug() << currentDir; + + if (currentDir.exists("wisdom")) { + + qDebug() << "wisdom exists !"; + return; + } + else { + + qDebug() << "wisdom does not exist - planning FFT..."; + + /*const char* wisdom_file = "wisdom"; + if (!fftw_import_wisdom_from_file(wisdom_file)) { + + int size = 64; + + QString str = "Planning FFT size %1"; + + fftwf_complex* cpxbuf; + fftwf_plan plan_fwd; + fftwf_plan plan_rev; + + while (size <= MAX_FFTSIZE) { + + qDebug() << str.arg(size); + cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size); + + plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT); + fftwf_execute(plan_fwd); + fftwf_destroy_plan(plan_fwd); + + plan_rev = fftwf_plan_dft_1d(size, cpxbuf, cpxbuf, FFTW_BACKWARD, FFTW_PATIENT); + fftwf_execute(plan_rev); + fftwf_destroy_plan(plan_rev); + + size *= 2; + } + fftw_export_wisdom_to_file(wisdom_file); + }*/ + //QProcess process; + //process.start("fftwf-wisdom.exe"); + //process.waitForFinished(); + } +} + +int main(int argc, char *argv[]) { + + #ifndef DEBUG + qInstallMessageHandler(cuSDRMessageHandler); + #endif + + QApplication app(argc, argv); + + Settings::instance(&app); + + app.setApplicationName(Settings::instance()->getTitleStr()); + app.setApplicationVersion(Settings::instance()->getVersionStr()); + + class SleeperThread : public QThread { + + public: + static void msleep(unsigned long msecs) {QThread::msleep(msecs);} + }; + + QPixmap splash_pixmap(":/img/cudaSDRLogo.png"); + + CSplashScreen* splash = new CSplashScreen(splash_pixmap); + + splash->setGeometry( + QStyle::alignedRect( + Qt::LeftToRight, + Qt::AlignCenter, + splash->size(), + app.desktop()->availableGeometry())); + + splash->show(); + + float splash_transparency = 0; + QTime splash_fade_timer; + splash_fade_timer.start(); + + while (splash_transparency < 1) { + + splash_transparency = (float)splash_fade_timer.elapsed() / 500;//1000; + if (splash_transparency > 1) splash_transparency = 1; + splash->setWindowOpacity(splash_transparency); + splash->repaint(); + } + + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": Loading settings .."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + SleeperThread::msleep(500); + + Settings::instance()->setSettingsFilename(QCoreApplication::applicationDirPath() + + "/" + Settings::instance()->getSettingsFilename()); + + Settings::instance()->setSettingsLoaded(Settings::instance()->loadSettings() >= 0); + + if (Settings::instance()->getSettingsLoaded()) { + + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": Settings loaded."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + SleeperThread::msleep(100); + } + else { + + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": Settings not loaded."), + Qt::AlignTop | Qt::AlignLeft, Qt::red); + + //splash->showMessage("\n " + QObject::tr(copyright), Qt::AlignBottom | Qt::AlignLeft, Qt::black); + } + + // **************************** + // check for OpenGL + + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": Checking for OpenGL V 2.0 ..."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + SleeperThread::msleep(100); + + if (!QGLFormat::hasOpenGL() && QGLFormat::OpenGL_Version_2_0) { + + qDebug() << "Init::\tOpenGL not found!"; + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": not found!"), + Qt::AlignTop | Qt::AlignLeft, Qt::red); + + splash->hide(); + + QMessageBox::critical(0, + QApplication::applicationName(), + QApplication::applicationName() + " requires OpenGL v2.0 or later to run.", + QMessageBox::Abort); + + return -1; + } + + if (!(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0)) { + + qDebug() << "Init::\tOpenGL found, but appears to be less than OGL v2.0."; + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": found but appears to be less than OGL v2.0"), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + splash->hide(); + + QMessageBox::critical(0, + QApplication::applicationName(), + QApplication::applicationName() + " requires OpenGL v2.0 or later to run.", + QMessageBox::Ok); + + return -1; + } + //if (QGLFormat::OpenGL_Version_2_0) + // qDebug() << "OpenGL version > 2.0"; + + qDebug() << "Init::\tOpenGL found."; + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": OpenGL found."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + SleeperThread::msleep(100); + + if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) { + + qDebug() << "Init::Framebuffer Objects not found!\n"; + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": fbuffers not found!"), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + Settings::instance()->setFBOPresence(false); + SleeperThread::msleep(100); + return -1; + //splash->hide(); + } + else { + + qDebug() << "Init::\tFramebuffer Objects found."; + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": OpenGL Frame Buffer support found."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + Settings::instance()->setFBOPresence(true); + } + SleeperThread::msleep(100); + + // **************************** + + // cpu usage +#if defined(Q_OS_WIN32) + CreateThread(NULL, 0, WatchItThreadProc, NULL, 0, NULL); +#endif + + // **************************** + // setup main window + + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": setting up main window .."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + qDebug() << "Init::\tmain window setup ..."; + MainWindow mainWindow; + mainWindow.setup(); + qDebug() << "Init::\tmain window setup done."; + + splash->showMessage( + "\n " + + Settings::instance()->getTitleStr() + " " + + Settings::instance()->getVersionStr() + + QObject::tr(": Displaying main window .."), + Qt::AlignTop | Qt::AlignLeft, Qt::yellow); + + SleeperThread::msleep(300); + + //app.processEvents(); + + mainWindow.show(); + app.processEvents(); + + /*splash_fade_timer.restart(); + while (splash_transparency > 0) + { + splash_transparency = 1 - (float)splash_fade_timer.elapsed() / 300; + if (splash_transparency < 0) splash_transparency = 0; + if (splash_transparency > 1) splash_transparency = 1; + splash->setWindowOpacity(splash_transparency); + splash->repaint(); + }*/ + splash->hide(); + + delete splash; + + mainWindow.update(); + mainWindow.setFocus(); + +#if defined(Q_OS_LINUX) + cusdr_cpuUsage *cpu_load = new cusdr_cpuUsage(); + cpu_load->start(); +#endif + + qDebug() << "Init::\trunning application ...\n"; + + return app.exec(); +}

    gsF)Bz_o)inA0X{$#w&xKXcO*zjJPRU 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 P00000NkvXXu0mjfAPmCa literal 0 HcmV?d00001 diff --git a/Source/res/img/cusdrLogo2.png b/Source/res/img/cusdrLogo2.png new file mode 100644 index 0000000000000000000000000000000000000000..1d85332e62c12f42fa0d830a488f1b939e9b5c21 GIT binary patch literal 107663 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–R*RirkqP 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 JT)$NP{{R}=!SVnA literal 0 HcmV?d00001 diff --git a/Source/res/img/cudaSDRLogo.png b/Source/res/img/cudaSDRLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7ef073e2c2746c4c9a1f79a47e31d63975971b GIT binary patch literal 254302 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 s|&U>Yb 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

  • iH$nSpn2jAWC?gz>Db4qvJ`|Usby^n2Nv&4d{ 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 F0RWj_E<^wT literal 0 HcmV?d00001 diff --git a/Source/res/img/close - Kopie.png b/Source/res/img/close - Kopie.png new file mode 100644 index 0000000000000000000000000000000000000000..698bde1b6601c214482ad089dd2e756b07c78692 GIT binary patch literal 396 zcmV;70dxL|P)p00009a7bBm000ie z000ie0hKEb8vp4qGxB3el zJBz=fzre}K(M}FhFk{goNRb+Zf;1HCP(eYgHRs_VrinxC$G1H9y!YObvxB2_I_>*D zrp`}>ZEs~^$29XRVSuzti^h0zVpm)Y(M@8@KRNl`0N8e5|q zG*r2?N*k(dbb~)Oc2)0;TurfcMyX`$%+(aVGm3Rb!POKiMMJbw)YW4DBsax*%sf)H qP?iXpWvhiU0kBiqo2B@&e)p00009a7bBm000ie z000ie0hKEb8vpwEIzI`ss8->kvF$l37OKV-muA&gSwkI&? z5qb(Aq9@4fP}-$LBs54zV0a@EZs>~2Y-@C(e61+-@V_~~bN+`bADbRnwmQAnQ&@h=Q8ukw(ebC zYuG3oIBVF3riz~|I_M@SfPTBnkh+<%bVav%mac5AtwbX%7bpNi2_yY>SMT^2NqXo7 zz4cf$0zd%pJYlDF{F)fsUgc|IOzHU1Xx3(uTVqoabeZxz(Pe5%g4`Pa-exi-A)n@% z&8K-&68>#RtA7%b%4G@1Epn+`mIJU`I>G|Fs-AxVlk{+UzN4Bh00000NkvXXu0mjf DEFZ6j literal 0 HcmV?d00001 diff --git a/Source/res/img/close_high.png b/Source/res/img/close_high.png new file mode 100644 index 0000000000000000000000000000000000000000..c8839136b54e437dc559bd8988e9a14cbbfa49dc GIT binary patch literal 439 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 literal 0 HcmV?d00001 diff --git a/Source/res/img/cuSDR_32.ico b/Source/res/img/cuSDR_32.ico new file mode 100644 index 0000000000000000000000000000000000000000..dd04595b766fa501cbba6b056f1c0f7df7c02b76 GIT binary patch literal 4286 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 maLWPEFMgTS8)jgoK150F#6d zKE*HX_uS=ANSe*FY zy*Y~3ba8RqdhtCWe-SV8b>fUJP6iXXOUy=Ou1_TPTQXVGw_fpB@%{Vu;#>QDwU=mr z(zm`oR_E+o-C}w6<|guyc!GDYzyBuMVQ+u)Kj7_mbo*Pxun@}cVIydNM|8;G|3o`{ zK!=El%<06|@t*i3SievwGQiqJ{`W)&Iz)i)L$55faXR6?c=4b=&Effj0lhM7dkEiu z;N_$Kv^ZXTq5mNA5e6Rjr(ZoL`~%BGX7wi`o$!C)^;4mbWg-JaX7P;Ue)Q{S{pdHq zD-jc2XhRIKJ@1PjSlff^gXss?htLnfLJWcq`3BJk37N>>z@wXk>Ho$c`q3@mrigD1 zrXSxL2n-T|=$s7x=YPQMf%KExh!F$PS=@o|4rG>zJdl1WF5ev>wB3ch7Xw)N_POEo zXAFZ(Fr2;vzQg(2Ad7HYOulm-b{50wyS=i|M)bQEL=cxb8_Pr4n0psV+)(=7MKN6Z zEZ-&arC|VJF-xujDL%&CCeQ^c0Z(<1jcf%+a*T5Wzjg=e01Vk6f*BeLD1lLZE z0s|+Z6PaZqe*;ah^}!A31jNqD&ET&v0yct?^i7UWji7J-7f!?12e+X2q6L27mKZLa z7)xI${Sp_6UN)A#*au(O%EkPwJchnVxEIhX#?qI{#|TjY?u$y!hBzVvm&KUKU!V%Q z2v@|pdJKJ~YBYVBa5dr4EEBmGHA3H&8rVd*3U0}s08A9|XZeiCekNxE{h!Dc`3Q@l z6*2*5W92;9^2P(Oi^-g=H6K1PoQ2GyK#YkjhI3-_*~0PkIT6HV)>cG(VS}bTf-dbo1d} zP>>14ZA2E@vtS2Ki5M~^0&6>U1U>@T!30A6$V8T_Q>W3@snbP(oHmWBNu3T%qifQp z1BAZ`3U;bCUFajs%0eb~swRCJkF&G9YZ_Gt)UudL*X{a@S|acM3RJDQZO=4b{qAWz zHg3;Ux*opzJyWSVA_HKGaQ$AP4w)wcY*Sb?>_rUx4H+bE3SAa01xRwBSUEgnQt(q1@iS;KK$j#suOdN`SD7GbU6m+h1K3t4&9o(QWulZ-Wg`4oSD7G&L`kda zL`m!FBq^Kf#G&*T+{N%IiPD+!mjE{l@2 ztBjT3R-K@*y*5#4M{T0wj;eSC*NPZ9$Fe9H+Y=EaZYBW*(8oRG>EoV&hdh<-DQ}hM zt!P^mpzKr{qPn9pLfx-AS~I97S~CO)u8P(Stc+CmD-ToK3BP-Bpt5s;pOQnqkAiKk zm%KG#mFFXGUFfH1e*-}!>2M*&8H$lb!Sagd^8dAPEBO{}_qLy}h1$rSDQlgV1K^$D8cmC>r+rJ;&Wg@JOm`F^sz zJU>|qpbt4Ju{i9gL>+ZivCZ>Tb14bX@~eu_i)n~8*nKk5@IX_dQC3ru(P1Jt#2M_Z zi_uT1j?j%M577=T@z?Y!@K$%r-J!ZI$6duC*F)8*$XDI7B2+u1Hd-&CK2ATqAx?i+ zU95geO_Xk2Ww>^DS+G_>Nq~k|fseXd-cD7goE^&c$F?ik9C1~&I^v?pBRJ-!WRvHm z>RcAA=~ox4m)M+ac(^6qIKL&`D8DJ$@IY;hZajRx1>R~dxjU5|3cOXEPXwuZRY&SX zHYV!tKAmQC{LC)nqLy7o1G4xZ=GA9XEl#zjTecFMNwYWwz2Q`nS;fhC)BO5qlY>>EMyaL# zdXa@Yb^P)@w09Ql)bT9~(2uH(GR|y@H!V1wY*y8hVpapLY)UjOY>YEGRu^TwuR7c? zr94nSs@O+2FwaBFGuu_eC2O0S!y$WB+e3D$Hbl<%(DJAV(T_bDZ*u%hx_RTdJr?KB z?Y3-#Tz@jo_*iAAeq51{j&HuFmS?fAP5|`y#yI1wmQ=IKv%Ae(+xA*sKDXE6{FyYf zTG$Vk1?h(8x@))|c2u=KV5>|4bo%eAEYdcsQdtgK?#15v(X|nzc8jLgv{^UKrkg!D zn{N8#+%7Y~{NdSMmiJoIXWcxLYIzYc%_n2c%MgF8BFJd>2|t5`vH+vx>M)aoC*#d4 z&ZJnLZ%sA7d2ZLN+h@~f-NJrXT2d^}V%^D;apvXqQD(VSp(dGS{)UMKp86r#E;?RW z_F66nZ8W!mUGv@b0;)oc_ckY3)L{Mf%STo}xwwDfBgofIC0f+gMwlGJ+60^%QyFZO z-Vkk?OZF!IwmlXPuN+OjoSOC8lALJ znNB3wptLp1QOmo;&oHe%+N|PqisiMoeT$#BKW^*()bWDf{`h>)qqfYCf9GuJIFn}d zrZwICIr{K#ORD9yrbLS~4KZd_wUH(TwNa*p4Y6i5r;;r$VNMSpp54>YmND;LYntI( z^zr4{-Ih;Ucg?zwbvF=m9(`)Sn&OHOql3jh21z;YdLc)*X?q`W()P~x)QhYNGd|Lc z{m-UbJa~J*`O}k&hq_wROrIdX%c!ZUI>IEoCfwwBeT-QdYCm%(eb#Ntu*^9#WF=46X&Eoqhy z&+lLIuDk24fNasz-O0SU-`w+{CFRq#Lfa2#_so8SwNFo{THb9=vbc<%HC0C#7ncSa z9?0LRpP0KtH@eVUKcy~BH=I+$nRTXYh-I!o@9aZ9-mILc+rw>*^c|u^{L|}qWEkN*hTC*zJTBJQSk6=W_L@P z`8)LQIeK=lA>Qm#ZInqvd5BR#Nr2&DAgeOmxV#be)2Zgqo?JTqiR|@vq0L9^{|4(G zqwn{dQ!E~!_Gf3X*NdBFJ>;CX58L?Y?;GrU7xQc?4lq1)*hxDy?GF`~xb=$GQL7cH z=+%mJ&@x#TflFn!ru?DendPh26QXgk>t1;g2aZ`fPtL7x*_svO$A5SG2 z^jtWyL2#!bQqcb7GFKAw_|mcN(`lBSr&7&7p#DzCpO9lu$IDv+GPAb*OPOoM+XUz( z)A8bF?>c^W7xVOTZuhwZtJ+T{nmlVvG{0RNW7<|3VO(DkW?WSjY0`wgTtkh|ZNUene7^eUfh{Nh$6|8)B7cGUg=dz~u{GAuaerjxXr zR`ZJ6sOX59TZOKWqrz6m(LM`j3h~oSDr%jAOFFFl4h#y?ECU zulK3_$yIj08&&@7IWPXH`P{$yNI_GwSvP8bk97~q!;D+=eDrenJ7~ryY*z9LStaM_ zw?x_+Gv|3@-T>`7dpf-xaGgDaa-T10?Yl(UF><}UR~k<(`tWwGgZX~?)n#Eum#d>q z9@WL0y{k_&`_zzV!f!}06*TYqk!i_X!JIj;n)&$txv&8I#cv*dW0Dz*`ZzuQ+b37p z9IuwR3t;cT9$l!Zy)Mq|HS&B_8*BWodDp@Z@1Fk6-e0tlX+5;Dt3KZJeSL!ITM}EJ zVBT4uVBCH6ga=n|FXIKnTrF{98k0=1zj-&}-(&UaTZ^t}I3ZNa$rU_v_jdHe}ZsoB+${}R6+|CqQH7?6dJG&sj;8a(dOmg_+uo1h<((!$ZJhBZ^y;G!Cfzq`BiWGWw`v7- z@uuClOYf^=OrGIh-7Cl56_FC-z$naqL~_`P36_>Xl7*ek(|)WvU1 zp2eQodm;orzngh>qmnt9wt!z7tKWljKVbjonA@J5MpI~O!^wmx2lJ`c9t$L$!`90O?zUCmdu*p}RdKN4weoO-=cf<+*7@{$ zm1sWVr{lT*_+HTQ>Ym`)tvW$N%1@uFVolyxMw`3=-d4q!beul0@e_H@@$P2olIC=y z)_3UXgOXswtA&9EZAC!_7fZtoZ&ySazo-b;`f%s;9`>AfPp=DV6U_NF@uvJ*Aq2JY zW`Y-Yn%D$Bb-rQRU;M)*!}j>m7m$@SGcR}yOQ=tAL+PJYiP zZp;GY#ayqAVOq1cGIh!GncBp;OijF{0Cjg)M45DyMHoFl5o+{+pe)?zMR}y*hfg2g zu9n5+GkjPOXmBORNAEPyf<9a+4L5p(_3hPhmfh{oZ?W-b4sBsDOMZ2% zseqs+&V>29GMLMSsY{&AH0@o*yu8=K^?@P1e*VwNo~jtr4($09GrW=Qt#=YN9gW+f z6yv!_YCF$h5@m(C|DipB#TKmzl(q3>JCB7@p0Qh$5)W+GI+5qEf2};)@-??{$Lj}7 z%i%wn(ojvNJW`LTh%#gi|L>w;!}}*fbzk48 zOW@vdg4*OoohQPLo)-og{FCdae-V8?kJ#%ap@xskB8}RyPxt+{<7|!3{%H`Dg=;gF z(Z+xYdtP;%IhPXi@A>1f8!}~KT1->M8s`3mY~o|rq7Tf~iqMb6!P+nI9N)tp_GF9EA#zzZ(ckR*daPha4u&XYDTS5 zCZt{=pjQ%Gj44}xX_(RLf*^xC**~w*}B3EpPvZV7yg#SyXtyPY)@%~;ro(M zqi5*Bzv$7uq7Z{eC1HjyQU8bXDC3@omy1XZg4d5OF{NQz0-PzRh&B;a;_R{rUBSI` zN7=Nx-oIdK66Xo?LVqfvjhNb`1EI>*rYz5;u%h|bNgwAXY^*pq}9`Vp=MjtK}1{*vqjWBxO+5U{p=Tql9 z!HH0vPenl*ABuyt-xdXFy}^v$l>}>lD33JizS)?9-vyu8W83mv`8cbG^aMR1&yJuz zeL2&-ZzJxxFy?Yu08=S+Tp-kqA%pWm?su?gW4;PdA3 zRl&Ws<30Dz=K$F~53iK;zF*1j+^4r1_+^pCUFcmW&_#N7r{y4*2e%#b{^dQUIddaZ zkJ;3vE@jSTJ2H>1mJvT2OP+(W=-DrGd{MuXMp3|O*-+HIb(8uy`d3vBW2xV@##`H% zPI2;DHZuUv!0vr68s*1*bT1bK=sv1WUfO=IEt`9WxwF5>E&Z z@@9Vna*N1!|2IBg7|-QMOn3sNynmmwW(C$=z`O8nzQ5+P!eE`ZXY<@U|GiY){pQIve#e`KeB5jP zvpc7|PefRdJNC~ZckQM$JGGodO8G#lt?F^~pbpQ$-}wPLkIQ4{zkPJA`cr9?Wk>TN zUT0g8PiI@9cV}z1>xY_@pWE~O)L!G9=Xihqo8zl{^O(2pCEUaFn8Ow1aHk+Z=UI8& zf_FC>(?7oY_d-wmi@W>}Zy)nJ-#rt2c>9F^{?&c_-n!0z^mk?Vxjc`~fs3j(`OBgZ z6ybGBqj?+E##;ZW zH^ISv)>L=TrBXqm8{`t>w<;e%9{HJ0npFqfw3-g@&_0WOFQBH&M|SF5gxNe=0DYK0^g{W*QaQ>P8*UpnTc zbLE(~&Q;(FdPnlPfH|}x&yyKW8WpKFsyWeH6nFcrl!(dX9fqYm5U?s z=*1zNc?`YELtn`qDI^R%KgC)#2l*X|`9pDE_^%Y1@(*EX!;lVQM@&{3ma6&*lgAsZ%-LbbU`j2EvFZ!n-QQe>L!nOpNa;=_uqD;kisI)D7pLZ{E1??tke|bRv6^xsv&= zmLEl-MtX(pNERz)M$#)~M$s!}VS@}%E8#?uP0?V$#t{#ILD3Z|pysK=85A$#&xnMsR%6QUtp2_6x zJY#^c$z(UuC$iTT^nH`2a1QH~M`Pxrc&p^tno#FxdL?H6Giv==8W3k9i+~>RRx6IS z#y*Zb)5$w9zW~o=Gb8+dk%7139=M7k69q!~r(a zGs4h!qFxUhizyxsu;GsT;Z6l$_P)fvMR$S|-ov)5W}ch-2e+5VwU9_Gqh!OnIRg_%<;Fl(YOn>pgYK%ob`m2xAk zHmHqtpiL(4a9<)B7Q8`j7oPtkNmeR_DK@Ib$<`{xi9D73*uRvHMr=~Z3|K3h?6pEV z8vTgGGZEvzMm7m+(t|h1rw6T*O(A`QKL)-yybqE?H_Gq9J7sUsdbw2eH4^vRYm?Ua zZL1YV+59Xsg0~#`EysMo)bg1lspZmO=@FO@!174c1t3?#m?iMpPh!Q__3lUP*mtSa z2w?aZyo|MtpwJuMD#g(@TXe^};=Tum{wkk=noIHiZ8_+!b@`Bo_TL1MFYVi|*}7+& zMgzX@%My6XdGVBT4*F66y*%APy*k}Ntp@L?iX`+afmY5VJ%g`wm!o>^?rrLIM2^~` zc+hkC%xF9d9=QMZ=)V;^AE^=4(wWFnI4hDDg&bk)JG+seX9+(WCyf1U@3Us{jN$ZG zkQ`1emK;Xb@K!60wnsjmm{&pqPo)swap#Wg)ViM?X!$ZHc+Q)gK=aqxzBjWu`RyLr%E`zpSdi2u@|9opBjc52@~?5X(= zVlSaTl_4AD_Bzg;7VxXaSSM0HX2V+|If4S{#gfPsSn^Gb5VLbK$7GGT{8?W#eK@^n z`Y?cSFDN1}mKtugMtQV@wZ#;lz;$xFQti~L4|{0c%!~g0ebK%&LD9ZcAu0U(P+UPIO4i+M)+^q<6Ka`4eI3~7mCbi5j!j7Dq``u32j`=Xa2m7n=`jw zsQ)x|82!^UVCqn?5DTUbqZY!3v#l_HN4%?i1J}##NwZh0KkTVa0ql^dwvRgmJ&FWR5U5Wp|Uk6898H$bN= zH$WfI{#cOY$S*#ypE>5G`fT5JtxI^1R+4t5pi49ca@@K7OlZ(vodd zs}AnazI8nK$G1iM_ArHeqL{n@Z9!h30h1S~M}T`^B`DY(2^;LeW`e@K@wg-DOhJ+Z z;v)owndwYk;pGpN8E}G|$cxpb$3187!n7NxNNbwZp2I>O(3}((?wtyC7eI_s1lquK~2gIN^ z(1VPbf?big2Wd=R^jbl#zlI<`*^MdOm%$wMQhmM8P3!Ntt;)qaaMotsaqde|KXT<^ zE^I#Yryy74PUh4LPA5$Kq#nqmA3}MEP$o9`xZZI*cj91r4vQi5+=)X(@?gk=sdi7XB_2C?Ec$gB<@VGgq=454RF7%T#j2LY^& zB6jq^3g12UcpvR>S};8-Tk`l^dfUFbJW-HE#`kSj#e&1{Yjg2 z#(6B6Iou9)@#e5|8A6G;cSgdwk@=CieGBlRR&KtZV>tT|+H(9LA;t}+EyqD7;A~*h z58Nl~<+39jH|ve}a$Yz+7CktcWUX4C;i_@%kf+wuqkg9Eb5n!(`5AkdygeyQZsK+( zCuA-^+h3QT?We)dOOHmqyBRz)u<3Qf-klv}(UZ3;7WOnIKVvs@GDa$oi__P%o;z40tolPV3E!-=O;R66EZv7UYjt^0`;;O3nmcP#|@%H z{ovu*vRN)SV%uiD30}Adv4I=pvJ$M6Yj!(nTt48g`EQn&?yF+~bKmF0yL9KKg$s^{ zuK0M&SLXxJc|2%dS58VG|5)Ih4@bOp+ktmSymi`-`WbiRrbP&H(<1qYJawO9uS=0z z6bfAy&WK&FG1h&-^r3c^;|KFZb3ra-Mq+c~=Jl1mZw#k%>p!#En1Qs}Xn^pTK_VVV zo3lD=r_9F=Bz@t{ojk;5sm$QAK;DR!!-_d07_+vlcv?|{47 zqXRoso*dYr0cbr2paX8I5BH-_h`E!wUGp~h?tXWz2M63$9`AQket_@(>xtH?jREUr z4_nWg61GZllBKNZUotyLP)i!-VAYG;8~ z$SoX_ZB?M z11Pi6!kmOmaLMQPezwyZav=9Tp;vjZTXJyKGRDarJ z^Z;@nt>;f0V*j)JNY~$V$N5@YPKnsQct(oXD(OtWwX%l;*2y06UniU8w^rt`?^>Bd zertsA{zZDf=g(4mb}X0L<+);JhA-@xH;Fy6bLGs8ZS$wc{jNX3Z<*W(mpPLL+oI<@ zlTia`0B3_qKB$G*SiP4A_UfW|#0cX)>+C)vI~PBYHXPo+4+iwniJ#bhAWRvK=ua7; zXXw4v?1_VH7t9#u__M;O?dvtidi`!NA>c2QiNTcFhSlDwnOb!~9t&SP^D?P2=X2+M&H9`VXR~n}i|oX&KeT`E9+(-ehZvG8n=|nf9jrrY0d!Dv zU)C8cwCS=wPA2h0W_3!qPUIW<0}s97p>JOS=fc*HN6rv}?J*B|@jm-{&!DhBz?}s~ zu3zZfKA0Q!{n|(3MIbeQDRVRYfz}%Iy$JnS)*d8eEtdPy+VB$_XD2%G32nsp1t{o3 z4E~I2b_a>u;&sUEYf>zVmf?eb}UG)qIezgH6p*} z!0+k*A7~+tKyzR}HeM)mYrpHYYYzO5?GNb@*;lv@JtZ=+0a_#m`>?$yJV5BqN2Y{lB9><9o;ipKTfghzuKYWbH&}Z9+Ti zhff1*G(>9&6P;T}Vl>ElmW48B>s?Rw==GBr4xF7ZCyV>~+QfZC{x82UPW1-~TD6}T zh|c0W5pz0Wk*&YbrUq6M#rI|59>h=9e9x{`M=a3^b7!cFbh2KE??lY$5^Vfuzqn3f z#lfxldJp0H??0b``4F4R_kDm~ur|Wq#CPAYi`&Fy@jd$5g*xdyIY&4HViWZktU~e= z`B*!NCH?G;|GbX1alT&u4}b6a?`UPzulyZAnCwp&Py$q7Cr~1O4kACNbN%CVb{{TA z#Oyvq?z0E6_r{B4QZE}PV)pz#`>}qpy?giQ8z-)l{Wx7*CN?e)*twi~>*CgknC*`! zx88N)J}w@6ez6BvAMtZ?pFG&T#r$LjBxf!sR))^ahTTVWPH%0Zc<$`pJw zE+Jd=h;)uc_K_kU*oXUx^siX7exN|O-#`ZcS^_>Jnc9A}5_csenKvWfNOnmuOqZmv zFKSN7zR~;+u>(*3R)=k&ePxI}&6W39*cXSY|}~GbEY+{m=gc DyNPh- literal 0 HcmV?d00001 diff --git a/Source/res/img/cuSDR_big.ico b/Source/res/img/cuSDR_big.ico new file mode 100644 index 0000000000000000000000000000000000000000..14c815518a40314ec51b729e53b2c7148dd36a4b GIT binary patch literal 165662 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