tqsl-2.8.1/0000755000175000017500000000000015003421217012476 5ustar rmurphyrmurphytqsl-2.8.1/.gitignore0000644000175000017500000002256715003421124014477 0ustar rmurphyrmurphy#cmake-generated files CMakeCache.txt CMakeFiles/ cmake_install.cmake install_manifest.txt CTestTestfile.cmake buildit.sh #emacs junk *~ #vim junk *.swp # builder stuff tests.txt linter cmake-notes cmake.sh cmake31.sh diff.ok gen-qsos.py lotw-upload.py DistributorBuild.txt adding-tags apps/INSTALL apps/lang/getpo.sh apps/lang/putpo.sh apps/lang/getmo.sh apps/makepo.sh apps/tqsl.po apps/tqslapp.pot cmake-debug.sh #windows-specific products UpgradeLog* *.vcxproj* *.vcproj* *.dir *.sln *.suo *.*sdf *.ncb Win32 ipch *.rc !*.rc.in bin/ lib/ _UpgradeReport_Files/ addlang.sh MOVE-TAG.bat /build*/ cmaker.bat tests/CTestTestfile.cmake ts2vc08.py win32-msi/tqsl-install/langfragde.wxs win32-msi/tqsl-install/langfrages.wxs win32-msi/tqsl-install/langfragfr.wxs win32-msi/tqsl-install/langfraghi.wxs win32-msi/tqsl-install/langfragit.wxs win32-msi/tqsl-install/langfragja.wxs win32-msi/tqsl-install/langfragpt.wxs win32-msi/tqsl-install/langfragru.wxs win32-msi/tqsl-install/langfragzh.wxs win32-msi/tqsl-install/update-lang.cmd apps/RelWithDebInfo src/RelWithDebInfo tqsl-*.msi #linux-specific products Makefile tqsl-*.tar.gz MOVE-TAG.sh *.AppImage #OSX-specific cruft .DS_Store apps/key-new.icns apps/key-new.ico tqsl-*.dmg tqsl-*.pkg makeit.sh check-notarization.sh staple.sh upload-for-notary.sh #Testing stuff tests/adifTest tests/cabrilloTest tests/tqsl/ tests/CMakeLists.txt tests/basictest.cpp tests/basicTest tests/gtest-1.7.0/libgtest.a tests/gtest-1.7.0/libgtest_main.a tests/gtest-1.7.0/CHANGES tests/gtest-1.7.0/CMakeLists.txt tests/gtest-1.7.0/CONTRIBUTORS tests/gtest-1.7.0/LICENSE tests/gtest-1.7.0/Makefile.am tests/gtest-1.7.0/Makefile.in tests/gtest-1.7.0/README tests/gtest-1.7.0/aclocal.m4 tests/gtest-1.7.0/build-aux/config.guess tests/gtest-1.7.0/build-aux/config.h.in tests/gtest-1.7.0/build-aux/config.sub tests/gtest-1.7.0/build-aux/depcomp tests/gtest-1.7.0/build-aux/install-sh tests/gtest-1.7.0/build-aux/ltmain.sh tests/gtest-1.7.0/build-aux/missing tests/gtest-1.7.0/cmake/internal_utils.cmake tests/gtest-1.7.0/codegear/gtest.cbproj tests/gtest-1.7.0/codegear/gtest.groupproj tests/gtest-1.7.0/codegear/gtest_all.cc tests/gtest-1.7.0/codegear/gtest_link.cc tests/gtest-1.7.0/codegear/gtest_main.cbproj tests/gtest-1.7.0/codegear/gtest_unittest.cbproj tests/gtest-1.7.0/configure tests/gtest-1.7.0/configure.ac tests/gtest-1.7.0/fused-src/gtest/gtest-all.cc tests/gtest-1.7.0/fused-src/gtest/gtest.h tests/gtest-1.7.0/fused-src/gtest/gtest_main.cc tests/gtest-1.7.0/include/gtest/gtest-death-test.h tests/gtest-1.7.0/include/gtest/gtest-message.h tests/gtest-1.7.0/include/gtest/gtest-param-test.h tests/gtest-1.7.0/include/gtest/gtest-param-test.h.pump tests/gtest-1.7.0/include/gtest/gtest-printers.h tests/gtest-1.7.0/include/gtest/gtest-spi.h tests/gtest-1.7.0/include/gtest/gtest-test-part.h tests/gtest-1.7.0/include/gtest/gtest-typed-test.h tests/gtest-1.7.0/include/gtest/gtest.h tests/gtest-1.7.0/include/gtest/gtest_pred_impl.h tests/gtest-1.7.0/include/gtest/gtest_prod.h tests/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h tests/gtest-1.7.0/include/gtest/internal/gtest-filepath.h tests/gtest-1.7.0/include/gtest/internal/gtest-internal.h tests/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h tests/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h tests/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump tests/gtest-1.7.0/include/gtest/internal/gtest-param-util.h tests/gtest-1.7.0/include/gtest/internal/gtest-port.h tests/gtest-1.7.0/include/gtest/internal/gtest-string.h tests/gtest-1.7.0/include/gtest/internal/gtest-tuple.h tests/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump tests/gtest-1.7.0/include/gtest/internal/gtest-type-util.h tests/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump tests/gtest-1.7.0/m4/acx_pthread.m4 tests/gtest-1.7.0/m4/gtest.m4 tests/gtest-1.7.0/m4/libtool.m4 tests/gtest-1.7.0/m4/ltoptions.m4 tests/gtest-1.7.0/m4/ltsugar.m4 tests/gtest-1.7.0/m4/ltversion.m4 tests/gtest-1.7.0/m4/lt~obsolete.m4 tests/gtest-1.7.0/msvc/gtest-md.vcproj tests/gtest-1.7.0/msvc/gtest.vcproj tests/gtest-1.7.0/msvc/gtest_main-md.vcproj tests/gtest-1.7.0/msvc/gtest_main.vcproj tests/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj tests/gtest-1.7.0/msvc/gtest_prod_test.vcproj tests/gtest-1.7.0/msvc/gtest_unittest-md.vcproj tests/gtest-1.7.0/msvc/gtest_unittest.vcproj tests/gtest-1.7.0/samples/prime_tables.h tests/gtest-1.7.0/samples/sample1.cc tests/gtest-1.7.0/samples/sample1.h tests/gtest-1.7.0/samples/sample10_unittest.cc tests/gtest-1.7.0/samples/sample1_unittest.cc tests/gtest-1.7.0/samples/sample2.cc tests/gtest-1.7.0/samples/sample2.h tests/gtest-1.7.0/samples/sample2_unittest.cc tests/gtest-1.7.0/samples/sample3-inl.h tests/gtest-1.7.0/samples/sample3_unittest.cc tests/gtest-1.7.0/samples/sample4.cc tests/gtest-1.7.0/samples/sample4.h tests/gtest-1.7.0/samples/sample4_unittest.cc tests/gtest-1.7.0/samples/sample5_unittest.cc tests/gtest-1.7.0/samples/sample6_unittest.cc tests/gtest-1.7.0/samples/sample7_unittest.cc tests/gtest-1.7.0/samples/sample8_unittest.cc tests/gtest-1.7.0/samples/sample9_unittest.cc tests/gtest-1.7.0/scripts/fuse_gtest_files.py tests/gtest-1.7.0/scripts/gen_gtest_pred_impl.py tests/gtest-1.7.0/scripts/gtest-config.in tests/gtest-1.7.0/scripts/pump.py tests/gtest-1.7.0/src/gtest-all.cc tests/gtest-1.7.0/src/gtest-death-test.cc tests/gtest-1.7.0/src/gtest-filepath.cc tests/gtest-1.7.0/src/gtest-internal-inl.h tests/gtest-1.7.0/src/gtest-port.cc tests/gtest-1.7.0/src/gtest-printers.cc tests/gtest-1.7.0/src/gtest-test-part.cc tests/gtest-1.7.0/src/gtest-typed-test.cc tests/gtest-1.7.0/src/gtest.cc tests/gtest-1.7.0/src/gtest_main.cc tests/gtest-1.7.0/test/gtest-death-test_ex_test.cc tests/gtest-1.7.0/test/gtest-death-test_test.cc tests/gtest-1.7.0/test/gtest-filepath_test.cc tests/gtest-1.7.0/test/gtest-linked_ptr_test.cc tests/gtest-1.7.0/test/gtest-listener_test.cc tests/gtest-1.7.0/test/gtest-message_test.cc tests/gtest-1.7.0/test/gtest-options_test.cc tests/gtest-1.7.0/test/gtest-param-test2_test.cc tests/gtest-1.7.0/test/gtest-param-test_test.cc tests/gtest-1.7.0/test/gtest-param-test_test.h tests/gtest-1.7.0/test/gtest-port_test.cc tests/gtest-1.7.0/test/gtest-printers_test.cc tests/gtest-1.7.0/test/gtest-test-part_test.cc tests/gtest-1.7.0/test/gtest-tuple_test.cc tests/gtest-1.7.0/test/gtest-typed-test2_test.cc tests/gtest-1.7.0/test/gtest-typed-test_test.cc tests/gtest-1.7.0/test/gtest-typed-test_test.h tests/gtest-1.7.0/test/gtest-unittest-api_test.cc tests/gtest-1.7.0/test/gtest_all_test.cc tests/gtest-1.7.0/test/gtest_break_on_failure_unittest.py tests/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc tests/gtest-1.7.0/test/gtest_catch_exceptions_test.py tests/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc tests/gtest-1.7.0/test/gtest_color_test.py tests/gtest-1.7.0/test/gtest_color_test_.cc tests/gtest-1.7.0/test/gtest_env_var_test.py tests/gtest-1.7.0/test/gtest_env_var_test_.cc tests/gtest-1.7.0/test/gtest_environment_test.cc tests/gtest-1.7.0/test/gtest_filter_unittest.py tests/gtest-1.7.0/test/gtest_filter_unittest_.cc tests/gtest-1.7.0/test/gtest_help_test.py tests/gtest-1.7.0/test/gtest_help_test_.cc tests/gtest-1.7.0/test/gtest_list_tests_unittest.py tests/gtest-1.7.0/test/gtest_list_tests_unittest_.cc tests/gtest-1.7.0/test/gtest_main_unittest.cc tests/gtest-1.7.0/test/gtest_no_test_unittest.cc tests/gtest-1.7.0/test/gtest_output_test.py tests/gtest-1.7.0/test/gtest_output_test_.cc tests/gtest-1.7.0/test/gtest_output_test_golden_lin.txt tests/gtest-1.7.0/test/gtest_pred_impl_unittest.cc tests/gtest-1.7.0/test/gtest_premature_exit_test.cc tests/gtest-1.7.0/test/gtest_prod_test.cc tests/gtest-1.7.0/test/gtest_repeat_test.cc tests/gtest-1.7.0/test/gtest_shuffle_test.py tests/gtest-1.7.0/test/gtest_shuffle_test_.cc tests/gtest-1.7.0/test/gtest_sole_header_test.cc tests/gtest-1.7.0/test/gtest_stress_test.cc tests/gtest-1.7.0/test/gtest_test_utils.py tests/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc tests/gtest-1.7.0/test/gtest_throw_on_failure_test.py tests/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc tests/gtest-1.7.0/test/gtest_uninitialized_test.py tests/gtest-1.7.0/test/gtest_uninitialized_test_.cc tests/gtest-1.7.0/test/gtest_unittest.cc tests/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc tests/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc tests/gtest-1.7.0/test/gtest_xml_outfiles_test.py tests/gtest-1.7.0/test/gtest_xml_output_unittest.py tests/gtest-1.7.0/test/gtest_xml_output_unittest_.cc tests/gtest-1.7.0/test/gtest_xml_test_utils.py tests/gtest-1.7.0/test/production.cc tests/gtest-1.7.0/test/production.h tests/gtest-1.7.0/xcode/Config/DebugProject.xcconfig tests/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig tests/gtest-1.7.0/xcode/Config/General.xcconfig tests/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig tests/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig tests/gtest-1.7.0/xcode/Config/TestTarget.xcconfig tests/gtest-1.7.0/xcode/Resources/Info.plist tests/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist tests/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj tests/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh tests/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc tests/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h tests/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc tests/gtest-1.7.0/xcode/Scripts/runtests.sh tests/gtest-1.7.0/xcode/Scripts/versiongenerate.py tests/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj tqsl-2.8.1/AUTHORS.txt0000644000175000017500000000013015003421124014353 0ustar rmurphyrmurphyKnown contributors (listed roughly in order by date) WA1GON K1MK KE3Z K1MU KC2YWE AA6YQtqsl-2.8.1/CMakeLists.txt0000644000175000017500000001466115003421124015243 0ustar rmurphyrmurphycmake_minimum_required (VERSION 3.14.7 FATAL_ERROR) project(TrustedQSL) find_package(OpenSSL REQUIRED) if ( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" ) if ( CMAKE_VERSION VERSION_LESS 2.8.12 ) SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) else() ADD_COMPILE_OPTIONS("-fPIC") endif ( CMAKE_VERSION VERSION_LESS 2.8.12 ) endif( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" ) SET (LINUX FALSE) IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux") SET(LINUX TRUE) ENDIF () # These attempts to play with LIB_SUFFIX aren't portable. # Comment this out, and let GNUInstallDirs do this. # Uncomment if you're sure it's needed. #SET (LIB_SUFFIX "") # # Pre-set LIB_SUFFIX for 64-bit Linux platforms #IF (LINUX AND CMAKE_SHARED_LIBRARY_PREFIX STREQUAL "lib64") # SET (LIB_SUFFIX "64") #ENDIF() # # Make sure that there's a value for LIB_SUFFIX #IF (LINUX AND NOT CMAKE_SHARED_LIBRARY_PREFIX AND NOT LIB_SUFFIX) # # check 64 bit # IF (CMAKE_SIZEOF_VOID_P EQUAL 4) # SET (LIB_SUFFIX "") # ELSE (CMAKE_SIZEOF_VOID_P EQUAL 4) # SET (LIB_SUFFIX "64") # ENDIF (CMAKE_SIZEOF_VOID_P EQUAL 4) #ENDIF (LINUX AND NOT CMAKE_SHARED_LIBRARY_PREFIX AND NOT LIB_SUFFIX) if(LINUX) include(GNUInstallDirs) if(NOT DEFINED CMAKE_INSTALL_LIBDIR) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(CMAKE_INSTALL_LIBDIR lib) else() set(CMAKE_INSTALL_LIBDIR lib64) endif() endif() if(NOT DEFINED CMAKE_INSTALL_DATADIR) set(CMAKE_INSTALL_DATADIR share) endif() if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) set(CMAKE_INSTLL_INCLUDEDIR include) endif() if(NOT DEFINED CMAKE_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR bin) endif() elseif (NOT WIN32 AND NOT APPLE) set(CMAKE_INSTALL_LIBDIR lib) set(CMAKE_INSTALL_DATADIR share) set(CMAKE_INSTALL_INCLUDEDIR include) set(CMAKE_INSTALL_BINDIR bin) endif(LINUX) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) # just windows for now... unix knows how to find libraries better set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) endif() set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmakemodules/") find_package(OptionalAddSubdirectory REQUIRED) option(USE_STATIC_MSVCRT "Use a static Visual C++ Runtime when building with MSVC") if(MSVC AND USE_STATIC_MSVCRT) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") endforeach(flag_var) else() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") set(gtest_force_shared_crt ON CACHE BOOL "Use shared (DLL) run-time lib even when Google Test is built as static lib." FORCE) endif() find_package(SQLite3 REQUIRED) if(NOT APPLE AND NOT WIN32) add_definitions("-DCONFDIR=\"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/TrustedQSL/\"") endif() # Get version number file(STRINGS "apps/tqslversion.ver" TQSLVERSION) string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9.]+)" "\\1" TQSL_VERSION_MAJOR ${TQSLVERSION}) string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9.]+)" "\\2" TQSL_VERSION_MINOR ${TQSLVERSION}) string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9.]+)" "\\3" TQSL_VERSION_UPDATE ${TQSLVERSION}) # Handle case where version number does not have an update i.e. 2.0 if (TQSL_VERSION_MAJOR STREQUAL ${TQSLVERSION}) string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\1" TQSL_VERSION_MAJOR ${TQSLVERSION}) string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\2" TQSL_VERSION_MINOR ${TQSLVERSION}) set(TQSL_VERSION_UPDATE "0") endif() # Handle case where there's a patch (fourth number) if (TQSL_VERSION_UPDATE MATCHES "[0-9]+\\.[0-9]+") string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\2" TQSL_VERSION_PATCH ${TQSL_VERSION_UPDATE}) string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\1" TQSL_VERSION_UPDATE ${TQSL_VERSION_UPDATE}) else() SET(TQSL_VERSION_PATCH "") endif() #get build # with git find_program(GIT_PROG git "C:\\Program Files (x86)\\Git\\bin" "C:\\Program Files\\Git\\bin") if(GIT_PROG) #we can use git execute_process(COMMAND ${GIT_PROG} describe RESULT_VARIABLE GITERROR ERROR_QUIET OUTPUT_VARIABLE HEAD_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT GITERROR) #git ran alright set(BUILD ${HEAD_COMMIT}) else() # Git error - hope this is a source distro if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h) file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h BUILDSTR REGEX "\\[.*\\]") string(REGEX REPLACE ".*\\[(.*)\\].*" "\\1" BUILD ${BUILDSTR}) endif() endif() else() # No git, again grab from source if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h) file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h BUILDSTR REGEX "\\[.*\\]") string(REGEX REPLACE ".*\\[(.*)\\].*" "\\1" BUILD ${BUILDSTR}) endif() endif() # If BUILD is set (we have a version) and BUILDSTR is not (we got that build from # git), then write a tqslbuild.h. Else leave it alone. if(BUILD AND NOT BUILDSTR) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h.in" "${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h") else() #hope this is a source distribution, which will always include a correct tqslbuild if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h") #but otherwise someone downloaded a snapshot without a buildfile set(BUILD "unknown") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h.in" "${CMAKE_CURRENT_SOURCE_DIR}/apps/tqslbuild.h") endif() endif() # In case the versions couldn't be deduced, set them if(NOT ${TQSL_VERSION_MAJOR}) set(TQSL_VERSION_MAJOR 2) endif() if(NOT TQSL_VERSION_MINOR) set(TQSL_VERSION_MINOR 1) endif() if (NOT TQSL_VERSION_UPDATE) set(TQSL_VERSION_UPDATE 0) endif() if (NOT TQSL_VERSION_PATCH) set(TQSL_VERSION_PATCH 0) endif() IF(TQSL_VERSION_UPDATE AND NOT TQSL_VERSION_UPDATE EQUAL 0) set(TQSLVERSION "${TQSL_VERSION_MAJOR}.${TQSL_VERSION_MINOR}.${TQSL_VERSION_UPDATE}") else() set(TQSLVERSION "${TQSL_VERSION_MAJOR}.${TQSL_VERSION_MINOR}") endif() if (NOT TQSL_VERSION_PATCH EQUAL 0) set(TQSLVERSION "${TQSL_VERSION_MAJOR}.${TQSL_VERSION_MINOR}.${TQSL_VERSION_UPDATE}.{TQSL_VERSION_PATCH}") endif() if(WIN32) set(TQSLLIBNAME "tqsllib2") #for compatibility with existing software else() set(TQSLLIBNAME "tqsllib") endif() add_subdirectory(src) #tqsllib add_subdirectory(apps) macro_optional_add_subdirectory(tests) enable_testing() tqsl-2.8.1/INSTALL0000644000175000017500000001423315003421124013527 0ustar rmurphyrmurphyTQSL/tqsllib ================== TQSL is the TrustedQSL application suite and tqsllib is the TrustedQSL library. These are the two major components of the TrustedQSL project: http://sourceforge.net/projects/trustedqsl/ =================================================================== Contents 1) Prerequisites 2) Building the Library under Linux/Unix 3) Building the Library under Mac OS X 4) Building the Library under Windows. =================================================================== 1) Prerequisites The TQSL applications depend upon the tqsllib library. First you should build and install that library and its prerequisites. The TrustedQSL library depends on several other libraries: OpenSSL (http://www.openssl.org/) - OpenSSL 1.1.1g was used for TQSL 2.5.5. expat 1.x XML parser library (http://expat.sourceforge.net/) - expat 2.2.9 zlib (http://zlib.net/) zlib 1.2.11 SQLite3 (https://sqlite.org) wxWidgets (http://wxwidgets.org/downloads) - wxWidgets 2.8.12 or 3.1.2 curl - (http://curl.haxx.se/download.html) - curl 7.70.0 You will need the "developer" versions of these. The version numbers above aren't mandatory, they're just what was recenty used. Most Unix and unix-like workstations will have these available. For those systems that do not, the packages are easily built. Instructions for building under the Windows environment are given below under "Building under Windows." In the instructions that follow, the versions of other packages that were used to build the tqsllib package as of the date this document was last updated are given in parentheses. =================================================================== 2) Building under Linux/Unix Many Linux distributions have a version of TrustedQSL already built and ready to use. Try installing package "TrustedQSL" using whatever commands your distribution uses for package instals: sudo yum install TrustedQSL sudo dnf install TrustedQSL sudo dnf install trustedqsl sudo apt-get install TrustedQSL sudo pkg-add TrustedQSL etc. If you need to build from source, follow the directions below. This is not intended for casual users, as you'll need to be able to install a C++ compiler and be able to search for and install the required development libraries. The quick answer: From the parent directory cmake . make make install (If you're not running as root (good!) the last should be "sudo make install"). That will install the library and applications under /usr/local. It also will install the needed header files under /usr/local/include. Configuration and help files will be installed in /usr/local/share. You can change the install location via: cmake -DCMAKE_INSTALL_PREFIX=/foo/bar . By default, only a shared version of the library is built. CMake option TQSLLIB_STATIC can be set to cause a static library to be built, either by using 'cmake -i' or by adding '-DTQSLLIB_STATIC=YES' to the cmake command above. If you installed the tqsllib library or its dependent libraries in locations that configure can't find, you'll need to specify those locations to cmake. For example, you can define the location for the Berkeley Database headers using BDB_PREFIX. (That points to the top-level directory, with /include for headers and /lib for libraries assumed below it.) If you choose to build with a different target directory (cmake with a pointer to the source), ensure that your build target/current directory is empty prior to invoking cmake. Vestiges of older builds can cause issues. If tqsl reports that it cannot open "libtqsllib.so" then you need to include "-DTQSL_RPATH" in the cmake command line. i.e. cmake -DTQSL_RPATH . =================================================================== 3) Building under Mac OS X You'll need to have the Mac developer's tools, Xcode, installed. This is done in much the same manner as building under Linux/Unix, above. To build a universal binary with compatibility from MacOS 10.10 upwards use the following shell script: #!/bin/sh # # Adjust this to where you've installed wxWidgets # PATH=$HOME/wx3/bin:$PATH # # arch_flags="-arch x86_64 -arch arm64" # # You need to download and install the OSX 10.4 universal SDK # to build a universal binary. gcc 4.0 is also needed. # sdk="/Library/Developer/CommandLineTools/SDKs/MacOSX10.12.sdk" ver_min="10.10" CMAKE_PREFIX_PATH="~/bdb/ ~/wx3/ ~/expat" cmake \ -DSQLite3_INCLUDE_DIR=$HOME/sqlite3 \ -DSQLite3_LIBRARY=$HOME/sqlite3/sqlite3.a \ -DCMAKE_BUILD_TYPE=Release \ -DZLIB_INCLUDE_DIR=$HOME/zlib/include \ -DZLIB_LIBRARIES=$HOME/zlib/lib/libz.a \ -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" \ -DCMAKE_OSX_DEPLOYMENT_TARGET=$ver_min \ -DOSX_PLATFORM="x86_64/arm64" \ -DEXPAT_INCLUDE_DIR=$HOME/expat/include/ \ -DEXPAT_LIBRARY=$HOME/expat/lib/libexpat.a \ -DOPENSSL_INCLUDE_DIR=$HOME/openssl/include/ \ -DOPENSSL_CRYPTO_LIBRARY=$HOME/openssl/lib/libcrypto.a \ -DOPENSSL_SSL_LIBRARY=$HOME/openssl/lib/libssl.a \ -DCURL_INCLUDE_DIR=$HOME/curl/include/ \ -DCURL_LIBRARY=$HOME/curl/lib/libcurl.a \ -DCMAKE_CXX_FLAGS="-I $HOME/zlib/include -I $HOME/openssl/include/ \ -I $sdk/System/Library/Frameworks/Carbon.framework/Headers \ -fno-stack-protector $arch_flags $WARN" \ -DCMAKE_C_FLAGS="-I $sdk/System/Library/Frameworks/Carbon.framework/Headers \ -fno-stack-protector $arch_flags $WARN" \ -DCMAKE_EXE_LINKER_FLAGS="$arch_flags -mmacosx-version-min=$ver_min" \ -DCMAKE_SHARED_LINKER_FLAGS="$arch_flags -mmacosx-version-min=$ver_min" \ $* . make The build will result in the directory apps/tqsl.app, which contains the complete Mac OS X application. You can simply move that folder to your system's Applications folder or the location of your choice, then launch the application from Finder. If you want to distribute the built application: ./macos_createdmg.sh will make tqsl-2.x.x.dmg, a Mac distributable disk image containing the TrustedQSL applications folder and document files. It will also create tqsl-2.x.x.pkg, a standard Mac install package. =================================================================== 4) Building under Windows See file WindowsBuildSetup.txt in the top-level directory for details on how to set up MSVC to compile TQSL. tqsl-2.8.1/LICENSE.txt0000644000175000017500000000465415003421124014327 0ustar rmurphyrmurphyLicense Terms and Conditions Copyright (C) 2001-2015 American Radio Relay League, Inc. All rights reserved. Portions (C) 2003-2025 The TrustedQSL Developers. Please see the AUTHORS.txt file for contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Any redistribution of source code must retain the above copyright notice, this list of conditions and the disclaimer shown in Paragraph 5 (below). 2. Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the disclaimer shown in Paragraph 5 (below) in the documentation and/or other materials provided with the distribution. 3. Products derived from or including this software may not use "Logbook of the World" or "LoTW" or any other American Radio Relay League, Incorporated trademarks or servicemarks in their names without prior written permission of the ARRL. See Paragraph 6 (below) for contact information. 4. Use of this software does not imply endorsement by ARRL of products derived from or including this software and vendors may not claim such endorsement. 5. Disclaimer: This software is provided "as-is" without representation, guarantee or warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability or of fitness for a particular purpose. The entire risk as to the quality and performance of the software is solely with you. Should the software prove defective, you (and not the American Radio Relay League, its officers, directors, employees or agents) assume the entire cost of all necessary servicing, repair or correction. In no event will ARRL be liable to you or to any third party for any damages, whether direct or indirect, including lost profits, lost savings, or other incidental or consequential damages arising out of the use or inability to use such software, regardless of whether ARRL has been advised of the possibility of such damages. 6. Contact information: American Radio Relay League, Inc. Attn: Logbook of the World Manager 225 Main St Newington, CT 06111 voice: 860-594-0200 fax: 860-594-0259 email: logbook@arrl.org Worldwide Web: www.arrl.org This software consists of voluntary contributions made by many individuals on behalf of the ARRL. More information on the "Logbook of The World" project and the ARRL is available from the ARRL Web site at www.arrl.org. tqsl-2.8.1/README0000644000175000017500000003446515003421217013372 0ustar rmurphyrmurphyThis is the TrustedQSL project, which provides tools for digitally signing Amateur Radio QSO records. src: Source code and documentation for tqsllib, the TrustedQSL library. apps: Source code for "tqsl" and other sample applications. html: Various legacy documents This document describes the changes to TrustedQSL since version 1.13 and explains how applications can use TQSL in their applications. Command Line Changes -------------------- Many applications use the 'tqsl' application in command line mode to sign log files. There were several new capabilities added to command line operation in 1.14. The first is that tqsl can now automatically sign and upload a log to the LoTW site for the user. This allows your application to simply write an adif file which is then processed and uploaded to LoTW without requiring the application to read the output file and either upload it or tell your user to upload it. The command line parser in 1.14 was rewritten and is less forgiving of improperly formatted command lines. Command Line Options -------------------- The following summarizes the command line options and what they do: Usage: tqsl [-a ] [-b ] [-e ] [-d] [-l ] [-s] [-f ] [-o ] [-u] [-x] [-p ] [-q] [-n] [-v] [-h] [-t ] [-c ] [Input ADIF or Cabrillo log file to sign] The following command line options may be specified on the command line: -a Specify dialog action - abort, all, compliant or ask This option instructs TQSL on how to handle QSOs that do not appear to be valid. There are many potential causes for invalid QSOs. Examples include QSOs with dates outside the valid range for the certificate being used, QSOs with invalid amateur callsigns, previously uploaded QSOs, and attempts to sign with an expired callsign certificate. This option specifies how tqsl should handle these exceptions. Using "-a ask" instructs tqsl to use a dialog to ask the user how to proceed. This is the default behavior if "-a" is not provided on the command line. Using "-a abort" instructs tqsl to issue an error message when an exception QSO is processed and immediately abort signing. Using "-a compliant" instructs tqsl to sign the QSOs which are compliant (not previously uploaded, in date range, and with valid callsigns) and ignore any exception QSOs. This is the recommended behavior for command line applications but is not the default action for compatibility reasons. Using "-a all" instructs tqsl to process all QSOs, ignoring previously uploaded QSOs and invalid callsigns. QSOs outside the range of valid dates for the selected station certificate will not be signed, as they would not be accepted by Logbook. -b Set begin date for the QSO date filter. -e Set end date for the QSL date filter. These options filter QSOs being signed to those after the begin date and before the end date. If neither of these are supplied, then no filtering will be performed. These values will override any date range entries provided by the user. This implies that "-d" (suppress date range dialog) should be used with -b or -e. -d Suppress date range dialog This option instructs tqsl to not ask the user to select a range of dates for processing QSOs. If this is used, all QSOs in the input file will be selected for processing. Command line tools will usually include this option to suppress tqsl dialogs. However, this means that the logging program is responsible for filtering QSOs before delivering them to tqsl. -f Select handling option for QTH details This option instructs tqsl on how to handle the MY_ fields in an ADIF log file. These specify the callsign, QTH details such as zones, gridsquare, state/county, etc. for a QSO. If the log includes this detail, TQSL can read these fields and take action to use that information to ensure that the Station Location is correct. By default, TQSL will report any discrepancies between QTH and the Station Location; TQSL can also be directed to ignore the QTH information. -f ignore Directs TQSL to ignore the QTH information -f report Directs TQSL to report any differences between the station location and the MY_ QTH deails -f update Directs TQSL to overwrite the Station Location information with data from the log. When using "-f update", the ideal practice should be to either specify all QTH information (state, county, grid, zones) in the ADIF "MY_" fields, or use an minimal Station Location with no QTH data. If no station location is provided on the command line, (the "-l" option specifies the station location name), an empty station location is used which has no callsign or QTH data. -i Import a TQSL file. This can be a public key (tq6) file, a key container (p12), or a backup (tbk) file. -l Select Station Location. This option selects a station location. This is used for signing logs or in conjunction with the "-s" option to define a location for editing. If an empty Station Location name is chosen (-l "") then TQSL enables the QTH handing specified with "-f update". -s Edit (if used with -l) or create Station Location This option can be used to create a new Station Location (-s without -l) or to edit an existing Station Location (when both -s and -l are provided). -o Output file name (defaults to input name minus extension plus .tq8) This option instructs tqsl where the signed output file will be stored. If it is not provided, the output file will be written to the same location as the input file with the extension changed to ".tq8" -u Upload after signing instead of saving This option instructs tqsl to upload the log file after it is successfully signed. -q Operate in batch mode, not menu-driven mode. -x Operate in batch mode, not menu-driven mode. If -x or -q are included on the command line, tqsl suppresses user dialogs and sends error messages to standard error. A logging application is expected to read this file and possibly display the contents to the user so they can see the results of the command action. If these options are not included, a calling application cannot distinguish between a successful signing and one where a user cancels the signing. -n Look for updated (new) versions of key files. If -n is given on the command line, tqsl checks for new versions of the tqsl program, an updated tqsl configuration file, and verifies that any user certificates are not about to expire. If any of these circumstances exist, the user is prompted to perform the required updates. When the check is completed, tqsl exits. This command line option can not be combined with any other command line options as it only performs an update check and does not sign any logs submitted with the command. -p Password for the signing key This option allows an application to provide the password for the private key that will be used to sign the log file. -v Display the version information and exit -h Display command line help These options allow the user to display the version number of tqsl or to obtain help on the command line usage. -t Open a diagnostic trace file at startup When supplied, this option enables diagnostic tracing at startup, opening the supplied file to record TQSL operations details. This is useful for debugging purposes. -c Use the given callsign when signing a log This option allows a logging program to specify what callsign to use for a log signing operation. This will override the callsign associated with the selected station location, if any. Command Line Usage ------------------ An application that uses the command line invokes the tqsl binary, optionally providing a set of options that dictate how tqsl operates. Normally, such an application should include the "-x" or "-q" options to indicate to tqsl that application popups should be suppressed. Errors discovered during the signing process are sent to the standard error file. Callers would normally indicate where those messages should be sent by adding "2> file.txt" to the command line used to run tqsl. This directs the shell (Windows or Unix) to write the error messages to that file. When operated in "batch" mode (i.e. -x or -q used), tqsl provides information that the calling program can use to determine if the signing operation succeeded. The first way is by capturing tqsl's exit status code. This provides information on success or failure using the following values: 0 - Success: all QSOs submitted were signed and saved or uploaded 1 - Cancelled by user 2 - The log was rejected by the LoTW server 3 - The response from the LoTW server was unexpected 4 - An error occurred in tqsl 5 - An error occurred in tqsllib (invalid filename, bad file format) 6 - Unable to open input file 7 - Unable to open output file 8 - No QSOs were processed because some QSOs were already uploaded or out of date range (no QSOs written) 9 - Some QSOs were processed, and some QSOs were ignored because they were already uploaded or out of date range (some QSOs were uploaded) 10 - Command syntax error 11 - LoTW network connection failed (no network or LoTW is unreachable) 12 - Unknown error 13 - The TQSL upload tracking database is locked. 14 - Already uploaded QSOs were detected 15 - An incorrect passprhase was used while loading a P12 file from the command line This exit status is also written to stderr in a format that can be parsed by the calling application. The last output from tqsl will be of the format hh:mm:ss AM|PM Final Status: Description (code) (For cases where the language is not English, this will be duplicated - first in the local language, then in English.) The first two fields are a timestamp, the words "Final Status:" always appears. Following that is a short descriptive message giving the exit status. The last thing on the line is the numeric exit code (as above) in parenthesis. Examples of output follows: 05:57:39 PM: Warning: Signing cancelled 05:57:39 PM: No records output 05:57:39 PM: Final Status: cancelled by user (1) 06:05:56 PM: /home/rmurphy/k1mu.adi: 414 QSO records were previously uploaded 06:05:56 PM: /home/rmurphy/k1mu.adi: wrote 1 records to /home/rmurphy/k1mu.tq8 06:05:56 PM: /home/rmurphy/k1mu.tq8 is ready to be emailed or uploaded. Note: TQSL assumes that this file will be uploaded to LoTW. Resubmitting these QSOs will cause them to be reported as duplicates. 06:05:56 PM: Final Status: Some QSOs were previously uploaded or out of date range (9) An example usage for signing a log would be tqsl -q -l "K1MU home" -p "Insecure" -a compliant -u -d k1mu.adi 2>temp.txt This indicates quiet mode (-q), selects a station location and a password, indicates that only compliant QSOs will be written (-a), uploads to LoTW (-u), suppresses date popups (-d), provides an input file (k1mu.adi), and finally writes log messages to temp.txt. The logging program would read and process that log once tqsl is done. An application would add "-o" to indicate where tqsl should write the signed log if "-u" (upload) is not provided. Command line applications are strongly encouraged to add "-a=compliant" to their invocations of tqsl, and to consider storing and displaying the log messages to their users. Application Changes ------------------- Some logging applications directly call tqsllib functions to sign log files. The application programming interface (API) to tqsllib has not changed in ways that introduce incompatibilities, but there are additional API calls which are necessary for applications to allow QSO upload tracking to work properly. Normally, an application will call tqsl_beginCabrilloConverter() or tqsl_beginADIFConverter to begin signing a log file. After the converter is created by those calls, the application should then call tqsl_setConverterAllowDuplicates(conv, false) which tells tqsllib that upload tracking should be enabled. If you do not call tqsl_setConverterAllowDuplicates, the library will assume that previously uploaded QSOs should be permitted (for compatibility reasons), which may cause unnecessary QSOs to be uploaded. If upload tracking is enabled, there is a new error return from tqsl_getConverterGABBI that indicates previosuly uploaded QSOs. In this case, tQSL_Error is set to TQSL_DUPLICATE_QSO. Software may need to be modified to handle this new result and act appropriately (ignore it, or abort the signing operation.) After successful processing of a log, an application should call either tqsl_convertCommit(conv) or tqsl_convertRollBack(conv) prior to calling tqsl_endConverter() to signal that a log conversion has completed. tqsl_converterCommit() indicates to tqsllib that the log has been successfully processed and that the QSOs should be added to the upload tracking database. Calling tqsl_converterRollBack() indicates to tqsllib that the log has not been successfully processed and that the QSO records should not be added to the upload tracking database. Simply adding the necessary call before the converter is closed is enough to bring the application up to date. change tqsl_endConverter(&conv) to tqsl_converterCommit(conv); tqsl_endConverter(&conv); Using tqsllib ------------- A minimal set of calls to permit an application to sign a log is the following. Of course, error checking should be performed for each call. tqsl_getStationLocation(&loc, location_name); tqsl_getLocationCallSign(loc, callsign, sizeof callsign); tqsl_getLocationDXCCEntity(loc, &dxcc); tqsl_selectCertificates(&certlist, &ncerts, callsign, dxcc); tqsl_beginADIFConverter(&conv, input_file, certlist, ncerts, loc); tqsl_setConverterAllowDuplicates(conv, false); tqsl_setConverterAppName(conv, "myAppName"); (tell tqsllib the name of your application) while (cp = tqsl_getConverterGABBI(conv) != 0) write the string pointed to by "cp" to your file tqsl_converterCommit(conv); tqsl_endConverter(&conv); tqsl_endStationLocationCapture(&loc); The tq8 files created by tqsl are compressed using zlib functions. You can also submit uncompressed files using a .tq7 extension. tqsl-2.8.1/WindowsBuildSetup.txt0000644000175000017500000003324615003421124016677 0ustar rmurphyrmurphy== Windows Build System setup for TrustedQSL == - By Robert, KC2YWE - Written 2/14/2013 - v1.0 - Initial writing V1.1 - Update to newer library versions, 7/25/2013 -- Conventions -- -- is a header - is a sub-item 'command' means type that command without the quotes; when quotes are needed, I use "" CAPS means extra important, not shouting When you need to get a file, I say: Download and run from: http://example.url/product "Link text on page to follow" (comment about which one to choose, maybe) If I don't mention something about an installer, leave it at the default unless you have a reason to change it. -- Prerequisites -- This is a Windows-specific tutorial. You must be running a version of Windows. These instructions were written for a clean install of Windows 7 64-bit in a virtual machine with all updates applied; any places where the instructions will differ based on Windows version or 32/64 bit will be noted to the best of my knowledge. I don't believe the setup is too sensitive to specific versions. You must read the whole document. I know it's long, but don't try to skim it or you might miss something that ends up breaking things later (there's a lot of potential pitfalls) -- Abbreviations -- TQSL = TrustedQSL VC, VC++ = Microsoft Visual C++ VS, VS2008, VS2010, VS2012 = Microsoft Visual Studio (includes VC++) and a version -- Assumptions -- The build system should be very flexible and should work with many versions of libraries, compilers, and platforms. But for simplicity's sake, the instructions given will be as specific as possible. In particular, this tutorial will focus on Visual Studio at the expense of MinGW (but it should work fine with MinGW). You should have familiarity with building software from source on Windows. Unix (including OSX) experience will mostly translate, and I'll give specific commands, but there's a lot of different ways this can go wrong and some troubleshooting experience will be helpful. You should have a lot of experience with C++ in particular. Most problems you run into will be in the form of compiler and linker errors. I will be using exact library versions, and even URLs. If you are reading this in several months, this will be out of date. YOU ARE ENCOURAGED TO USE NEWER VERSIONS, even if the instructions don't quite work - most of the instructions come from READMEs. I will store things directly in the C:\ directory. You can put them wherever you want, but you may need to help cmake find them. -- Variables -- This document will use VS2012 Express, which is free. It seems to be the nicest Visual Studio IDE, once you fix the menus. They will also work with VS2010 and VS2008, but I've only tested them with paid versions so I can't help with any express-only limitations. HOWEVER VS2012 WILL NOT TARGET WINDOWS 2000. It just won't work because the last version to target Win2K was VS2008. We still support Windows 2000, at least for a little longer, so "official" builds still need to be made with VS2008. I have it set up to use the 2008 compiler and runtimes as a "platform" in VS2012, but those directions are above the scope of this document. Feel free to use a "paid" version of Visual Studio, but the instructions may be slightly different. YOU MUST DECIDE IN ADVANCE WHAT RUNTIME YOU WILL USE. You can either statically link the Microsoft runtime, or dynamically link it. For distribution, I have everything statically linked, but if you are just running on your own personal machine(s) a dynamic runtime dependency may not bother you. It's just a DLL file that needs to be installed, and it is when you install Visual Studio, or you can install it separately (or may already have it). Whatever you decide, you need to decide before you start compiling stuff or else you'll have to re-compile *everything* due to weird linker errors. YOU MUST DECIDE IN ADVANCE WHAT COMPILER YOU WILL USE. Like the above, you will find yourself recompiling a lot if you try to switch compilers. In particular, much of the STL stuff is incompatible between versions. YOU MUST DECIDE IN ADVANCE WHETHER YOU WILL STATICALLY OR DYNAMICALLY LINK. All the libraries need to be compiled differently depending on your decision. Just like the runtime, this determines whether you have to schlep a bunch of DLLs along with you or not. NONE OF THESE AFFECT THE CODE. Static or dynamic runtimes or libraries, or compiler versions - the code will (should, in the case of compilers) be independent of these choices. These all affect YOUR setup, and most are irrelevant unless you try to move a binary somewhere else. DEFAULTS - this document is written for using a dynamic VC++ runtime and static libraries. -- Outline -- 1) Visual Studio, cmake, git, tqsl 2) Getting the source 3) Libraries (order irrelevant!) - openssl - zlib - curl - wxWidgets 2.8 4) Running cmake 5) Building -- 1) Visual Studio, cmake, git, tqsl -- These downloads and installs should run in parallel. If you find yourself waiting, cycle to the next item. - git * This installer "pauses" the VS2012 installer, even though it doesn't work while the VS2012 installer is running anyway. So maybe wait until it's done before starting VS2012 Express, or else you'll have to wait until VS2012 is done. Download msysgit as a prerequisite for TortoiseGit. TortoiseGit is optional if you're comfortable with the command line, but msysgit is required. Download and run from: http://code.google.com/p/msysgit/downloads/list?can=2&q="Full+installer+for+official+Git+for+Windows" Git-1.8.1.2-preview20130201.exe Next, etc. Uncheck 'Windows Explorer integration' if you're using TortoiseGit. You may find it convenient to have git in your command line (option 2). You should leave the line ending conversion as-is (checkout Windows/commit Unix, option 1). Download and run from: http://code.google.com/p/tortoisegit/wiki/Download "Download TortoiseGit 1.8.1.0 - 64-bit" (or 32 bit as appropriate) TortoiseGitPLink is probably the best choice. - Visual Studio 2012 Express Download and run from: http://www.microsoft.com/visualstudio/eng#downloads "Visual Studio Express 2012 for Windows Desktop" (not Windows 8!) - "Install now" When the installer loads, read and agree to the license terms, then 'Install' and accept the prompt. While it downloads, work on the other stuff. Next, etc. Add cmake to the current user path (3rd option); create an icon at your preference. - CMake Download and run from: http://www.cmake.org/cmake/resources/software.html cmake-2.8.10.2-win32-x86.exe - TrustedQSL Yes, for now you should have TrustedQSL installed. It's the fastest way to get the correct folder structure, config files, registry entries, etc. Download and run from: http://www.arrl.org/instructions "Step 1 - Download and install the software" > "Download the software for Windows here" -- 2) Get the source -- Decide where you want your source folder. I have mine in Documents\src. Right click in that folder and choose "Git clone...". Enter git://git.code.sf.net/p/trustedqsl/tqsl, click OK, and wait. It should create a folder called 'tqsl' in the folder you right-clicked in. Check it out and observe the folder structure. You'll see this document in there too ('WindowsBuildSetup.txt') - open it to make sure you're using the newest version. You should see a lot of Git options if you right-click in this folder; a Git tutorial will come later but you can play around for now. You can always delete the folder and re-clone it if you mess anything up. -- 3) Libraries (order is irrelevant) -- Now that you have the source, let's install the libraries needed to make it work. Most of these happen from the "Developer Command Prompt for VS2012". Open it and run 'nmake' and 'cl'; for 'cl' make sure it says "for x86". 64-bit builds should work (they do on Linux) but I've never tested it on Windows so I don't recommend it for now. - openssl You'll need Perl, sorry. Download and run from: http://www.activestate.com/activeperl/downloads "Download ActivePerl 5.16.2 for Windows (64-bit, x64)" (or 32 bit as appropriate) - you don't have to fill out the survey. Leave it at the defaults. While that's going, you'll also need something to open a .tar.gz, if you don't have anything. I recommend 7zip Download and run from: http://www.7-zip.org/ "64-bit x64" (or 32 bit as appropriate) - the install can't run at the same time as Perl. You'll also need the Netwide Assembler (nasm). It's not strictly required, but the assembly routines in OpenSSL only work with it, and apparently they're rather a lot faster. Download and run from: http://www.nasm.us/ "2.10.07/win32/nasm-2.10.07-installer.exe" Once you can open a .tar.gz, download OpenSSL - Download and extract to C:\openssl-src: http://www.openssl.org/source/ "openssl-1.0.1e.tar.gz" Go to the developer command prompt. Run 'set path=%localappdata%\nasm;%path%'. Make sure you can run 'nasm' and 'perl' (Ctrl-C to exit Perl). 'cd \openssl-src\openssl-1.0.1e' The below comes from "INSTALL.W32". Read it for more details if needed 'perl Configure VC-WIN32 --prefix=c:\openssl' 'ms\do_nasm' - observe a half-dozen 'perl' commands 'nmake -f ms\nt.mak' (for dynamic, ntdll.mak). It should build without error. 'nmake -f ms\nt.mak test' (can be skipped but might avoid a headache). Look for "passed all tests" 'nmake -f ms\nt.mak install' Make a new directory called "VC" and move "libeay32.lib" and "ssleay32.lib" into it. This is a CMake problem that will hopefully go away pretty soon, but it hasn't happened yet. - wxWidgets YOU NEED TO USE WXWIDGETS 2.8 for now; 2.9 has been tried and almost works but there are still some problems. Download and run from: http://wxwidgets.org/downloads/ "wxMSW" (under "Current Stable Release: wxWidgets 2.8.12") The below comes (mostly) from "BuildCVS.txt". Read it for more details if needed. In your developer command prompt, 'cd \wxWidgets-2.8.12\' You need to edit a file to fix a bug; comment out line 110 in src\msw\window.cpp ("//#include ") - Ref https://groups.google.com/d/msg/wx-dev/SFpDUR89zgY/et1UjdbAfO4J 'cd build\msw' 'nmake -f makefile.vc BUILD=release SHARED=0' (these should be the defaults, but specify them anyway) 'nmake -f makefile.vc BUILD=debug SHARED=0' (you need this or else debug builds won't link) !! You need to do work here if you want to use a static runtime !! as this builds with a dynamic one by default. !! See the wxWidgets wiki at !! wiki.wxWidgets.org/Compiling_WxWidgets_with_MSVC_(2) for !! info on how to do this. - curl Download and extract to C:\ (will make a new folder): http://curl.haxx.se/download.html "curl-7.39.0.tar.gz" The below comes from winbuild\BUILD.WINDOWS In your developer command prompt, 'cd \curl-7.39.0\winbuild' 'nmake -f Makefile.vc mode=static ENABLE_WINSSL=yes' Verify that a folder called 'builds\libcurl-vc-x86-release-static-ipv6-sspi-spnego-winssl' has been created. The 'winssl' part of that string is the most important because it means it will use the Windows APIs (and thus certificates) for SSL. - expat Download and run from: http://sourceforge.net/projects/expat/ "Download: expat-win32bin-2.1.0.exe" - Change the install folder to "C:\expat" to match our naming scheme Unfortunately, the binaries are DLLs. Go to C:\expat\Source and open the file 'expat.dsw'. Agree to convert it. Switch to the release config. Open the properties for 'expat_static', go to Librarian - General and change Output file to '..\..\Bin\libexpat.lib'. Go to the expat\Bin directory and verify that libexpat is about 500KB, which means it's statically linked. Delete all but libexpat.lib. - zlib Download and extract to C:\ (will make a new folder): http://zlib.net/ "zlib source code, version 1.2.8, tar.gz format" - "US (zlib.net)" ZLIB seems to disagree with running a release version in a debug build and crashes. So you'll want both. cmake will automatically set up the correct one to link based on the build type. Also, we'll get our first taste of cmake. - Open your developer command prompt; 'cd \zlib-1.2.8'. - Type 'cmake .' - Type 'msbuild /p:Configuration=Debug ALL_BUILD.vcxproj' - Type 'msbuild /p:Configuration=Release ALL_BUILD.vcxproj' - SQLite3 Download the SQLite source amalgamation. Unzip it into a build directory. Compile wwith cl -c -O2 sqlite3.c lib /OUT:sqlite3.lib sqlite3.obj -- 4) Running cmake -- Almost there! Open a command prompt and run cmake . -DCMAKE_LIBRARY_PATH="C:\expat\Bin" -DCMAKE_INCLUDE_PATH="C:\expat\Source\lib" -DwxWidgets_ROOT_DIR="C:\wxWidgets-2.8.12" -DBDB_INCLUDE_DIR="C:\db-6.0.20.NC\build_windows" -DBDB_LIBRARY="C:\db-6.0.20.NC\build_windows\Win32\Release\db.lib" -- 5) Building -- Whew! You thought this would be hard after all the rest, didn't you? Nope. Open TrustedQSL.sln and build. Both debug (default) and release will work. You'll find the binaries in tqsl\bin\Debug or tqsl\bin\Release as appropriate. == Final Thoughts == This is actually a lot simpler than the old process (even though it doesn't seem simpler!) because you still had to get all the libraries, but you also had to set up the compiler itself, which was rather more unpleasant than installing VS2012 Express. If you hate the all-caps menus in VS2012, you can turn them off easily. Create a key in HKEY_CURRENT_USER\Software\Microsoft\WDExpress\11.0\General\ called "SuppressUppercaseConversion", type DWORD, value 1 The cmake command line should be a lot shorter. I'm working on that. If you want to run any of these binaries on a new machine, all you have to do is install the 2012 redistributable: http://www.microsoft.com/en-us/download/details.aspx?id=30679 if it's not already installed. Please let me know if you have any trouble and I'll try to improve the document. Thanks for reading and I hope it helped! tqsl-2.8.1/apps/0000755000175000017500000000000015003421217013441 5ustar rmurphyrmurphytqsl-2.8.1/apps/.gitignore0000644000175000017500000000017015003421124015424 0ustar rmurphyrmurphytqslbuild.h !tqslbuild.h.in #Linux binaries tqsl tqslcert #Windows build artifacts Debug Release #OSX binaries *.app tqsl-2.8.1/apps/.project0000644000175000017500000000031315003421124015102 0ustar rmurphyrmurphy TrustedQSL tqsl-2.8.1/apps/CMakeLists.txt0000644000175000017500000002062215003421124016200 0ustar rmurphyrmurphyproject(tqsl) option(TQSL_FLATPAK "Set for Flatpak builds" OFF) if(WIN32) set(wxWidgets_USE_STATIC ON) add_definitions(-DCURL_STATICLIB) add_definitions(-DXML_STATIC) endif() find_package(CURL REQUIRED) find_package(EXPAT REQUIRED) find_package(wxWidgets COMPONENTS core base adv html REQUIRED) find_package(ZLIB REQUIRED) include(${wxWidgets_USE_FILE}) if(APPLE) find_library(CARBON_LIBRARY Carbon) find_path(CARBON_INCLUDE_DIR Carbon.h) endif() include_directories(${tqsllib_SOURCE_DIR} ${ZLIB_INCLUDE_DIR} ${EXPAT_INCLUDE_DIR} ${CURL_INCLUDE_DIR} ${CARBON_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${SQLite3_INCLUDE_DIRS} ) if(${BUILD} MATCHES "-(alpha|beta|test|rc[0-9])") message("${BUILD} is a test build") add_definitions(-DTQSL_TEST_BUILD) endif() if(APPLE) add_definitions(-DOSX_PLATFORM="${OSX_PLATFORM}") endif() if(WIN32) set(srcdir ${CMAKE_CURRENT_SOURCE_DIR}) set(TQSL_RCFILE "tqsl.rc") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${TQSL_RCFILE}.in" "${CMAKE_CURRENT_SOURCE_DIR}/${TQSL_RCFILE}") endif() if(APPLE) set(OSX_ICONFILE "tqslicons.icns") set(MACOSX_BUNDLE_INFO_STRING "tqsl") set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.arrl.tqsl") set(MACOSX_BUNDLE_LONG_VERSION_STRING "TQSL V ${TQSLVERSION} build ${BUILD}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${TQSLVERSION}") set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2001-2025 American Radio Relay League") set(MACOSX_BUNDLE_ICON_FILE ${OSX_ICONFILE}) SET_SOURCE_FILES_PROPERTIES(${OSX_ICONFILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(TQSL_RCFILE ${OSX_ICONFILE}) endif() if (NOT DEFINED TQSL_RPATH) SET (TQSL_RPATH FALSE) endif () # Setting rpath is a workaround that shouldn't be in a # product designed for multiple distributions. # However, users doing their own build from source need # to sometimes set this. If your install can't find libtqsllib.so # then add "-DTQSL_RPATH" to the cmake command line and try # a reinstall. # # Some other possible RPATH hacks commented out. YMMV. if(TQSL_RPATH) #rpath setup # SET(CMAKE_SKIP_BUILD_RPATH ${TQSL_RPATH}) # SET(CMAKE_BUILD_WITH_INSTALL_RPATH ${TQSL_RPATH}) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) LIST(APPEND CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) # SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_LIBDIR}) endif() set(TQSL_SRC tqsl.cpp extwizard.cpp tqslwiz.cpp dxcc.cpp stationdial.cpp qsodatadialog.cpp tqslvalidator.cpp tqsl_prefs.cpp wxutil.cpp tqslhelp.cpp crqwiz.cpp certtree.cpp getpassword.cpp loadcertwiz.cpp loctree.cpp jsonreader.cpp jsonval.cpp jsonwriter.cpp) set(TQSL_HDR tqslapp.h tqslwiz.h qsodatadialog.h tqslexcept.h tqslpaths.h stationdial.h dxcc.h tqsl_prefs.h extwizard.h certtree.h tqslvalidator.h tqslbuild.h tqslhelp.h certtree.h tqslctrls.h util.h getpassword.h extwizard.h loadcertwiz.h wxutil.h loctree.h tqsltrace.h json_defs.h jsonreader.h jsonval.h jsonwriter.h) set(TQSL_XPM left.xpm right.xpm bottom.xpm top.xpm key.xpm cert.xpm nocert.xpm broken-cert.xpm folder.xpm replaced.xpm expired.xpm home.xpm delete.xpm edit.xpm loc_add_dis.xpm properties.xpm download_dis.xpm loc_add.xpm upload_dis.xpm download.xpm file_edit_dis.xpm upload.xpm delete_dis.xpm edit_dis.xpm file_edit.xpm properties_dis.xpm save.xpm import.xpm lotw.xpm) add_executable(tqsl WIN32 MACOSX_BUNDLE ${TQSL_SRC} ${TQSL_HDR} ${TQSL_XPM} ${TQSL_RCFILE}) target_link_libraries(tqsl ${TQSLLIBNAME} ${wxWidgets_LIBRARIES} ${ZLIB_LIBRARIES} ${CURL_LIBRARIES} ${CARBON_LIBRARY} ${EXPAT_LIBRARIES}) if(WIN32) set(UPDATER_SRC tqslupdater.cpp) add_executable(tqslupdater WIN32 ${UPDATER_SRC} ${TQSL_HDR}) target_link_libraries(tqslupdater ${wxWidgets_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} Crypt32) endif() if(NOT APPLE AND NOT WIN32) install(TARGETS tqsl DESTINATION ${CMAKE_INSTALL_BINDIR}) install(DIRECTORY help DESTINATION ${CMAKE_INSTALL_DATADIR}/TrustedQSL) install(FILES tqsl.5 DESTINATION ${CMAKE_INSTALL_MANDIR}/man5) if (TQSL_FLATPAK) install(FILES icons/key128.png DESTINATION ${CMAKE_INSTALL_DATADIR}/app-info/icons/flatpak/128x128 RENAME org.arrl.trustedqsl.png) install(FILES icons/key64.png DESTINATION ${CMAKE_INSTALL_DATADIR}/app-info/icons/flatpak/64x64 RENAME org.arrl.trustedqsl.png) install(FILES org.arrl.trustedqsl.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) else() install(FILES icons/key48.png DESTINATION ${CMAKE_INSTALL_DATADIR}/pixmaps RENAME TrustedQSL.png) endif() install(FILES icons/key128.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps RENAME org.arrl.trustedqsl.png) install(FILES icons/key64.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/64x64/apps RENAME org.arrl.trustedqsl.png) install(FILES icons/key48.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/48x48/apps RENAME org.arrl.trustedqsl.png) install(FILES icons/key32.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/32x32/apps RENAME org.arrl.trustedqsl.png) install(FILES icons/key16.png DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/16x16/apps RENAME org.arrl.trustedqsl.png) install(FILES org.arrl.trustedqsl.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) install(FILES lang/ca_ES/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/ca_ES/LC_MESSAGES) install(FILES lang/de/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/de/LC_MESSAGES) install(FILES lang/es/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/es/LC_MESSAGES) install(FILES lang/fi/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/fi/LC_MESSAGES) install(FILES lang/fr/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/fr/LC_MESSAGES) install(FILES lang/hi_IN/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/hi_IN/LC_MESSAGES) install(FILES lang/it/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/it/LC_MESSAGES) install(FILES lang/ja/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/ja/LC_MESSAGES) install(FILES lang/pl_PL/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/pl_PL/LC_MESSAGES) install(FILES lang/pt/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/pt/LC_MESSAGES) install(FILES lang/ru/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/ru/LC_MESSAGES) install(FILES lang/sv_SE/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/sv_SE/LC_MESSAGES) install(FILES lang/tr_TR/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/tr_TR/LC_MESSAGES) install(FILES lang/zh_TW/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/zh_TW/LC_MESSAGES) install(FILES lang/zh_CN/tqslapp.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/zh_CN/LC_MESSAGES) install(FILES languages.dat DESTINATION ${CMAKE_INSTALL_DATADIR}/TrustedQSL) install(FILES cab_modes.dat DESTINATION ${CMAKE_INSTALL_DATADIR}/TrustedQSL) # # If adding files here, remember that they need to be added to # macos_createdmg.sh # install(FILES vuccgrids.dat DESTINATION ${CMAKE_INSTALL_DATADIR}/TrustedQSL) install(FILES prefixes.dat DESTINATION ${CMAKE_INSTALL_DATADIR}/TrustedQSL) # # Flatpak doesn't come with installed wxWidgets localizations # so add them in # if (TQSL_FLATPAK) install(FILES org.arrl.trustedqsl.metainfo.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) install(FILES lang/ca_ES/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/ca_ES/LC_MESSAGES) install(FILES lang/de/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/de/LC_MESSAGES) install(FILES lang/es/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/es/LC_MESSAGES) install(FILES lang/fi/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/fi/LC_MESSAGES) install(FILES lang/fr/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/fr/LC_MESSAGES) install(FILES lang/hi_IN/wxstd.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/hi_IN/LC_MESSAGES) install(FILES lang/it/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/it/LC_MESSAGES) install(FILES lang/ja/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/ja/LC_MESSAGES) install(FILES lang/pl_PL/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/pl_PL/LC_MESSAGES) install(FILES lang/ru/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/ru/LC_MESSAGES) install(FILES lang/sv_SE/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/sv_SE/LC_MESSAGES) install(FILES lang/tr_TR/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/tr_TR/LC_MESSAGES) install(FILES lang/zh_CN/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/zh_CN/LC_MESSAGES) install(FILES lang/zh_TW/wxstd-3.2.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/zh_TW/LC_MESSAGES) endif() endif() tqsl-2.8.1/apps/ChangeLog.txt0000644000175000017500000017212115003421124016032 0ustar rmurphyrmurphyTQSL changes ============ 2.8.1 ---------- Correct the Russian translation - the wrong file was being used. Revert gridsquare checks to repair "No QSOs to sign" errors. 2.8 ---------- Correct display of Chinese localization on Macs. Add an item to the Help menu to synchronize the QSO data from LotW so that TQSL has consistent information on uploaded QSOs. Allow import of a backup (.tbk) file using the command line "-i" switch. Change how TQSL detects multiple attempts to sign a log to ensure that the message that it's waiting for other signing to complete is displayed, and so that no "Application is not responding" messages are displayed. Change verbiage from "already uploaded" to "previously signed" to more accurately reflect how TQSL detects previously processed QSOs. Add a "Test sign a log" that does not track signed QSO and creates an uncompressed 'tq7' file as output. When creating a station location, entering a gridsquare that's incorrect for the primary administrative subdivision (state, province, etc.) was not flagged as an error. Correct this so that the incorrect grid is flagged. When there's no callsign certificates installed, ask if the operator wants to create a new one but state that if you intend to restore from a backup, there's no reason to do that. When backing up and restoring configuration data, don't save or restore preferences related to folder locations as those aren't necessarily the same across different systems (or with different operating systems). Fix TQSL crash when an invalid / out-of-range MY_DXCC entity was supplied. Fix detection of incorrect or inconsistent values for MY_ ADIF fields such as MY_GRIDQUARE, MY_STATE, MY_COUNTY, MY_IOTA to ensure that things like a grid from outside of the entity and state (province, etc.) are rejected. Invert the order of the year dropdown for callsign certificates. Starting with 1945 means most cases would require a lot of unnecessary scrolling. When loading P12 file from the command line, and the password is incorrect, exit TQSL to let the caller know to get the proper passphrase for the P12 file. Validate VUCC grid when updating from MY_VUCC. Allow twelve character grids when updating from MY_GRIDSQUARE and in Station Locations. Fix spurious error when updating IOTA value from MY_IOTA. Update certificate request handling to provide more detail and better guidance about when signing is needed. When requesting a new callsign certificate, filter the entity list to the entities that are appropriate for that callsign. Add a checkbox to disable that filter so any entity can be selected in the event the filter gets the entity wrong. 2.7.5 ---------- For US callsigns, restrict the pulldown menu for callsign certificate requests to US entities only. If there was a reliable means of identifying entities based on callsign prefixes, this could be done for other entities. But cases like FR, FT, make this a hard one to implement. Don't allow requesting an expired US-based callsign certificate if the user doesn't have an existing callsign certificate to validate it. Handle cert renewals - 2.7.4 had a regression where an unexpired callsign certificate could not be renewed. Uppercase fields in ADIF records so Logbook doesn't have "VA" and "va" in confirmations. 2.7.4 ---------- When a requesting a portable callsign "P5/K1MU" for a DXCC entity outside of the US where the base callsign is a US call, emit a warning to the user that CEPT and other portable operations are only valid for US Citizens as specified in FCC regulations. Fix issues causing TQSL on Linux to emit a stream of "Gtk-WARNING" messages. These were harmless but annoying. For hams requesting callsign certificate requests for US callsigns, some cases where there were empty fields in the ULS data could cause TQSL to block submitting a callsign certificate request for a new US-based callsign when details such as the address or name are empty in the ULS data and there were no existing callsign certificates able to be used to validate the new request. TQSL now allows the user to override the ULS data for these initial callsign certificate requests. When a callsign certificate is deleted, don't let the retained private key look like an overlapping request. Ignore the private keys if there's no certificate already in progress. Add a Entity and primary subdivision (state) data set to TQSL to permit validation of 4-character grid squares as valid for a given entity and state combination. When entering a Gridsquare that doesn't validate, don't allow skipping if the grid value changes. Pressing "Next" twice only works if the value of the grid doesn't change. Correct language selection to avoid wxLanguage shifting identifiers. Detect changes (including changes related to default details) in the Station Location editor and ask the user if they would like to save those. The prior behavior didn't make it clear when viewing a station location that TQSL had, for example, set their CQ Zone but that would not be retained unless the Station Location was saved. (tnx K5GZR) Detect network connectivity issues and block repeated probes of Logbook services for certificate status, etc. This keeps TQSL from stallng for several minutes if Logbook is down. Allow renewal of recently expired callsign certificates. When upload of a callsign certificate request fails, allow the user to save the request so it can be uploaded later rather than delete the request. Correct the display of modified fields when editing a station location and the user attempts to cancel the operation. Allow an empty location name command line argument to force QTH update mode as if "-f update" was specified. 2.7.3 ---------- Change "some QSOs suppressed" wording to "some QSOs not processed". When installing a TQ6 file (signed Callsign Certificate) where the contents referenced outdated certificate chain data, TQSL would issue error messages which weren't helpful. Improve upon that and suggest corrective action. Install a set of "orphaned" certificate chain entities as trusted to allow some callsign certificates that were being rejected to be installed. Update messages displayed when signing a log with previously uploaded QSOs. Previously TQSL would state that upload was "cancelled" when the user never explicitly cancelled. Fix handling of portable calls in the US to not perform a ULS lookup when the base callsign is not a US callsign. Update the labels on the certificate tree display to be less confusing. Suppress display of expired / replaced callsign certificates when there is a good cerificate for a given callsign. When there's more than one callsign certificate for a given callsign, just display one. When importing callsign certificates, tell the user when they try to install an expired certificate, better explain missing "private key" without using that jargon, and detect clock errors. Add a preference option to allow Callsign certificates to be stored using obsolete cryptographic algorithms to allow import by the Mac keyring. (This was previously added as a Mac-only change, now available for all platforms.) 2.7.2 ---------- Fix MacOS Sonoma issues with "Secure coding is not enabled for restorable state!" warnings. When unable to sign a log due to the uploads database being busy due to a concurrent signing operation, provide details as to the cause of the error, not a simple "Database Locked". Preliminary support for Voice Over on Macs. When unable to open the duplicates database, suppress spurious errors from automatic backups. Don't loop on trying to sign a log due to database locks. When signing a log fails before processing any ADIF records, ensure that the error message doesn't include a random "line number". Handle locked databases - don't re-create an empty database. Add a preference option for Mac users to allow Callsign certificates to be stored using obsolete cryptographic algorithms to allow import by the Mac keyring. 2.7.1 ---------- Add labeling to menu tabs to allow rendering via accessibility applications such as Mac VoiceOver. Much of TQSL does not support VoiceOver due to limitations in wxWidgets. Allow TQSL to run on Windows XP. Note that this is a stopgap and XP is well past end of support, continued operation is not guaranteed. For Mac, fix the date range dialog box to show more than one character for input. Fix one-by-one US callsign requests - they're stuck on the end date request. On Windows, if the main TQSL window is not visible (off screen), force it to appear on the default monitor. Handle corrupted private key with a less cryptic error message. 2.7 ---------- Fix Callsign Certificate request handling when Logbook returns an error message saying that there was an error. Don't mark it as pending ARRL action, leading operators to assume ARRL is working the request when it was never properly submitted. Add command line option to remove Uploads database in the event it gets jumbled to the point that SQLite3 can't repair it. Allow OPERATOR in ADIF files to have long values, as some applications incorrectly allow the entry of names in those fields, not callsigns. Any non-callsign entry in OPERATOR is ignored. Update portable call handling to swap prefix/suffix around when the callsign is in portable/home call arrangement (like MU/K1MU). Update configuration for Linux to follow packaging guidelines. Add a Flatpak build to permit build of a portable Linux package. Add a preference that allows the callsign fields in ADIF files to be ignored. Correct handling of portable calls for non-US stations working portable in the US (P5NOP/W4) to not require a ULS lookup for the base callsign. Detect download/upload threads not making progress and abort the attempt. Correct ADIF editor handling of certain modes (PKT, PAC, FM, etc.) so the mode is recognized properly. Correct a defect in the ADIF editor that was causing the SUBMODE to be emitted twice for each QSO. Add an ADIF header to files created using the ADIF editor. Save the last used Station Location and select that when signing a log. Correct defect that kept the IOTA identifier from appearing in the station location editor. (The location was being properly saved, but would not be set in the editor when attempting to edit the station location. Fix display of properties of a passphrase-protected private key so there is no longer an OpenSSL error displayed. Expand any of the certificate folders where there's a callsign certificate in that category (expired/replaced, etc.) Add header to exported ADIF files (patch from Florian, DF2ET). Allow ignoring callsign in ADIF files via a preference. Remove dependency on Oracle Berkeley DB and replace with the more stable LMDB (Lightning Memory-Mapped Database). Restore backed-up upload database whenever that database becomes corrupt. (This instability is why Oracle BDB was abandoned.) 2.6.5 ---------- Change the widget used for pulldown menus because Microsoft's windows 11 22H2 preview broke them and Microsoft refuses to fix the bug. Correct the portable callsign fix - it didn't work properly and didn't cover all cases. 2.6.4 ---------- Handle both "KH6/K1MU" and "K1MU/KH6" forms of portable callsigns. Checking for currently valid callsign certificates (change made in TQSL 2.6 "Validate a callsign certificate is still valid just before using it") causes station locations with no selected callsigns to generate an error and fail to sign the log. Correct this to bypass this check. Correct a crash when TQSL detects a callsign certificate that's about to expire during startup and the user selects "Yes" to renew that callsign certificate. 2.6.3 ---------- Handle the case where there's both a valid and an invalid callsign certificate for a given call - don't error out when detecting the invalid one, continue searching for a valid callsign certificate for the call. Include the filename of the log being signed in the station location verification page. Don't do a ULS test when requesting a new callsign certificate which has an end date. This allows requests for former callsigns. 2.6.2 ---------- Add an option for new callsign certificate requests for club calls, QSL managers, and DXpeditions. Expand gridsquare input field to be long enough for four six-digit locators. Allow properties of expired callsign certificates to be displayed from the right click menu. 2.6.1 ---------- Fix a major error in handing previously uploaded QSOs that can cause TQSL to either hang or keep asking how to handle those QSOs. 2.6 ---------- When defining a station location with only one park defined, do not force that park to be selected. Default to "[None]" and allow that to be saved. Don't allow renewal from a superseded callsign certificate. LoTW won't allow that to work without a current signing certificate. Remove the certificate type selection dialog. Explain what this was for - using a shared account for QSOs or a distinct one. Add a log-handling preference that permits ignoring seconds in QSO times to assist with discarding duplicate QSOs. Allow command line signing without a station location being specified. Handle station location setup with multiple certs for one call, moving from an entity without a PAS into one with so zones get set correctly Display full station location details when asking a user to validate that the right station location is being used. Validate a callsign certificate is still valid just before using it to sign a log (requires network access to validate against ARRL). Add separate folders under callsign certificate display to indicate status of each cert (valid, expired, replaced, etc.) Merge Station Location definition page to a single page. Force proper zones when there's a single zone for ITU or CQ. 2.5.10 (unreleased) ---------- Provide directions for how to upload a log when "Sign and Save" is used. When opening a Callsign Certificate file, show both TQ6 and P12 files. This makes it more obvious how to choose a P12 (as it doesn't require changing the file type pulldown.) Export a copy of any imported Callsign Certificate. Correct the sizing of the Callsign Certificate and Station Location property windows. Correct possible hang when displaying Callsign Certificate properties of a pending callsign certificate. 2.5.9 ---------- Fix problem that caused the TQSL preference for log handling to be ignored for command-line operations and forced to "Report" handling. Allow slashes in ADIF mode maps. Remove forced background settings, allowing colors to default to system settings. Correct Chinese translation variants so Traditional and Simplified use the right files. 2.5.8 ---------- Add Chinese (Traditional) translation from SZE-TO, VR2UPU. For Station Locations in places where there's only one CQ or ITU zone value possible, don't allow a choice. Add missed callsign certificate messages to those that can be translated. Correct last QSO date information when displaying callsign certificate properties. When there's no end date, report the date of the last QSO that can be signed. Verify the format of IOTA entries. Create a TQSL backup automatically when new Station Locations are added or edited. 2.5.7 ---------- Correct a crash when TQSL attempts to upload a file caused by a thread accessing the GUI incorrectly. 2.5.6 ---------- When importing a .p12 on the command line (-i call.p12), allow passing the related passphrase on the command line as wel (-p "passphrase"). Use 'passphrase' versus 'password' when discussing protecting Callsign Certificates. Change help from 'Postcard Password' to 'Postcard Validation Code'. The only place password should appear is with reference to the Logbook useraccount. Add Swedish translation from Roger, SM0LTV. Fix an error with command line handling introduced in TQSL 2.5.5 that could cause formerly correct command lines to be rejected (specifically passing an empty callsign certificate passphrase as -p "" rather than dropping the password option. If a user is editing an ADIF file using the TQSL ADIF editor and closes the editor window, TQSL would discard the file being edited. TQSL now asks the user if the changes should be saved before closing the editor. 2.5.5 ---------- When unable to find a match for a callsign certificate where the station location is in DXCC Entity "None" don't suppress the entity name. Fix issue on Windows systems when a TQSL update and a configuration file update both show up at the same time. Randomly choose one or the other for installation. Ensure that all ADIF modes are available in the TQSL ADIF Editor. Allow the TQSL ADIF editor to retain any ADIF field in the output. TQSL doesn't allow editing all fields, but it no longer discards fields that the editor does not handle. 2.5.4 ---------- Add Catalan localization provided by Xavier, EA3W. Correct the command line exit status values to properly reflect all QSOs suppressed and some QSOs suppressed situations. When looking up address information, use the DXCC entity number for the callsign certificate to ensure the right address is retrieved. Correct case sensitive callsign matches when comparing QSO data. This corrects a defect where OPERATOR set to 'k1mu' would issue an error. Loosen matching for US counties as there is no single source of "proper" county names. Fix issue where installing a new LoTW configuration file could corrupt the DXCC entity names. 2.5.3 ---------- Report on invalid data in ADIF fields - County misspelled, state in the county field is wrong, zones incorrect for the Entity/State. Ignore OPERATOR fields in an ADIF file if the value does not look like a callsign. Properly report callsigns where there are no callsign certificates available for that call versus reporting this as a date range error. Allow callsigns of up to 20 characters. Detect when a callsign is too long. 2.5.2 ---------- TQSL now issues an error message when an unrecognized file is loaded as a callsign certificate file. Do additional checks for ULS lookup failures to ensure that the data is not corrupt. Add the last update date for the ULS database to the message displayed saying that the ULS data is missing. Report when TQSL is unable to open the files needed to connect to Logbook. Allow ADIF log QTH data to override Station Location Details. Add a command line option and a preference field to control this behavior. Move the log signing preferences to a separate preference page to keep it from growing too large. When an ADIF log provides station details, detect mismatches and report those when signing a log. This allows improperly chosen callsign certificates and Station Locations to be detected. When https (Secure) connections to Logbook fail, fall back to trying http requests. This allows systems with anti-virus that interferes with network connections to recover. When fetching ULS data fails, do not reject callsign certificate requests - allow those to work without address data. Remove ULS check for US 1x1 callsigns. Add diagnostic log lines suggested by David, W1HKJ. Fix centering of date fields in the date range prompt dialog box. Select the current language in the language selection dialog. 2.5.1 ---------- Correct defect causing the entity name to not display properly when only one callsign certificate was active. 2.5 ---------- When installing a Callsign Certificate, don't display errors about expired root certificates. When listing DXCC entities, move the Deleted entities to the end of the list. This helps with the confusion between "Germany (DELETED)" and "FEDERAL REPUBLIC OF GERMANY", especially for persons where English is not a primary language. Allow the "DELETED" string in those names to be translated. Eliminate the use of the term "duplicates" when referring to already uploaded QSOs as that term means something else in normal usage. When editing a Station Location, do not force default values for station information fields. Only provide default values when a new station location is being created. Fix incorrect ADIF output for several modes when creating files using the ADIF editor built into TQSL. Use ARRL web service to validate US callsigns and pre-fill address info. Fix TQSL updates failing on Windows when the user's home directory has non-ASCII characters. Detect running TQSL "As Administrator" and warn the user. Allow this warning to be permanently overridden. Verify that the TQSL working directory is writable during startup. Disable prompting for callsign certificate password by default. Add a preference setting to allow this to be re-enabled if desired. Fix error that was not overriding station location details with the default values when editing an existing station location. Fix OSX error where the "Edit Station Location" icon was getting squashed. Update "Waiting for Callsign Certificate" icon to a clock versus the slashed circle. The latter was being interpreted as something broken versus something to wait for. Keep track of Callsign Certificate requests and reject attempts to request certificates for the same callsign more than 3 times in 24 hours. This limit will hopefully stop people from mistakenly re-requesting callsign certificates repeatedly for the same call because they don't realize that action needs to be taken by ARRL staff to complete the process. Correct defect that could cause TQSL to crash upon exit while attempting to back up. When requesting US 1x1 callsigns, which always require signing, don't ask for a certificate type for the request. Require that the user have a valid certificate for some other call to proceed. Remove the "1x1" callsign option from the certificate request type page. When creating callsign certificates, ask for the type of certificate first as that then drives the next set of questions to ask. 2.4.7 ---------- Correct defect that keeps TQSL updates on Windows from working properly. 2.4.6 ---------- Fix error messages for Windows command line users. The text was garbled due to changes made to implement Unicode on Windows (no changes for Linux or Mac). 2.4.5 ---------- Fix log messages for Windows command line users to not be a string of Hex characters. 2.4.4 ---------- Add localization for Turkish. Add support for a 64-bit build for MacOS. Add an indicator of what platforms are supported for an Mac build (i386/ppc or x86_64/i386). Fix error that was keeping the State and County from being defaulted when creating a new Station Location. Add another callsign certificate request type - one for a new callsign for the primary user. Add language support for Polish. Fix problem that was keeping Hindi from properly displaying on Windows. 2.4.3 ---------- Fix defect that was causing steate/province/oblast to be reset to "None" when editing a station location. This defect could also cause station location details to be forced to be the default location data for the callsign, making remote locations more difficult to edit. 2.4.2 ---------- Ensure that the exit status message emitted by TQSL appears in English so logging programs can use that to detect exit status. Improve setting of ITU and CQ zones when defining a Station Location. There were many cases where these were left empty. Fix issue with Windows updates of TQSL failing when the user's directory has a space embedded. Language fixes: Remove spurious error message when run on a system where the local language is not supported. Allow adding translations without making code changes. When displaying a callsign certificate where the private key is missing from the local system, specifically state that the private key is not found. Add a specific message for keys that cannot be opened. 2.4.1 ---------- Display "No Private Key" versus an error message when displaying a callsign certificate with no installed private key. Fix defect that meant that some callsign certificates (those with missing private keys) could not be restored from a .TBK file containing a good copy. Fix defect that was causing callsign certificate renewals to have "null null null" as the Name in some conditions. Fix defect that was required deleting an existing callsign certificate before importing a replacement .P12 file 2.4 ---------- Add Hindi translation. Pre-load callsign certificate requests from the ARRL address data when it is available for a given callsign. Provide default gridsquare, state, and county for station locations when available from the ARRL address data. Validate that gridsquares are consistent with the station's address. Retain all certificate private keys. Mark as deleted and allow them to be recovered. This allows the .TQ6 file downloaded from LoTW to always be used to recover a user's callsign certificate. Allow LMDB to be used with TQSL to work around Berkely DB licensing issues. 2.3.1 ---------- Update copyright messages to 2017. Add the ADIF satellite name to the pulldown menu in the ADIF editor to allow satellites to be more easily looked up. Add 'Saving QSOs' to the messages to be translated. Add Finnish translation from Juhani, OH8MXL. When renewing a callsign certificate and backing up to earlier pages in the wizard, don't display a spurious certificate type selection page. When editing an ADIF file that has an invalid mode setting, notify the user that it is being ignored. Fix password prompt on systems with debug assertions enabled in wxWidgets. Correct the invocation of the Windows Installer when an update is available. Add a missing error message. Correct the counts reported when duplicate QSOs are found along with QSOs with other errors. 2.3 ---------- Add Russian translation provided by Vic, US5WE. Add Spanish translation provided by Jordi, EA3GCV. Require the start/end date for new callsign certificate requests to be within the valid range for the associated DXCC entity. Detect out of range dates and report these errors to the user for correction. Correct defect that could cause a spurious "this language is not supported" error message on Linux systems without the English localization files installed. Fix build error using gcc-5/gcc-6. Update Callsign Certificate request wizard to request information so that it can determine if the request should be authenticated and, if so, suggest which Callsign Certificate to use for authentication. 2.2.2 ---------- Correct a defect that could cause TQSL to crash when a user restored a callsign certificate from a .P12 file, created a .TBK backup, then tried to restore a second callsign certificate. When a new version of TQSL is available, install it rather than providing a link to download the installer. Add Chinese translations provided by Caros, BH4TXN. Correct a defect that causes TQSL to crash when renewing a callsign certificate and the user uses "Cancel" to exit the password prompt. Provide a more informative error message when the private key for the selected callsign certificate can't be read when displaying certificate properties, signing a log, and using a certificate for signing another callsign certificate request. Fix TQSL infinite loop when attempting to export a callsign certificate when the private key cannot be read. Instead of hanging, emit an error message with details on the error and abort saving the certificate. Update Japanese translations with those supplied by Aki, JL3OXR. Update Italian translations with those supplied by Salvatore, I4FYV. Correct language switching on Linux systems to not display spurious error messages. Update compilation flags to avoid relocation error on x86_64. Correct compiler warning when building on Debian Jessie. Update copyright messages to 2016. 2.2.1 ---------- When running in batch mode (-x or -q on the command line, don't show the upload progress bar, just do the upload. When changing the selected language, ensure that the window position is retained. When TQSL is killed while in the process of signing/uploading a log, roll- back the duplicates database changes and cleanly close the database. When an old .TQ6 file is loaded into TQSL, and there was a valid private key for that certificate, TQSL could incorrectly delete a private key for a pending callsign certificate, causing installation of that certificate to fail. TQSL now verifies that the certificate being installed is active and will not delete certificates improperly. Don't delete/recreate the main window when language selection doesn't change the selected language. Display warning that changing the status log display will require a restart. Add "Replaced" and "Expired" indicators to callsign certificate properties display. Save preferences in .tbk files in numeric form so on/off preferences can be transferred across operating systems (Windows/Mac/Unix) properly. Ensure that the callsign certificate password window always appears on the top of other windows. This will cause the main TQSL window to always appear when prompting for a password. Add enhancements to the ADIF editor. Select the proper band when a frequency is being entered. Default to 160M when adding a new qso, and don't lose changes when moving backwards from a record being added. Correct memory leaks in station location handling. Report old and new QTH details when a duplicate QSO is detected. Store and restore the QTH data when duplicates data is processed in a backup (tbk) file. Allow alternate UI layout that puts the status log on a separate tab. Use the "Display status messages in separate tab" preference setting to enable this. Changing this setting requires restarting TQSL for it to take effect. This change will make handling large number of callsign certificates or station locations easier. Fix error that would cause installation of a new configuration file to fail on systems with non-ASCII characters in the user's home directory name. 2.2 ---------- widen fields for station location pages to accommodate long Park names. Permit long label names for station location fields. When renewing a password-protected callsign certificate, entering an incorrect password would display "Error: Invalid argument" versus the expected error relating to the incorrect password. TQSL now displays a "password not correct" error and allows the user to try again. Updates to correct portability issues for some Unix-based systems. Correction for a defect that doesn't permit more than one field to appear on a station location page that has dependent values. 2.1.3 ---------- Revert change in the behavior for command line applications. TQSL 2.1 changed the behavior for ADIF files to open those with the TQSL ADIF editor versus signing them unless "-x" or "-q" were on the command line. This was an incompatible change that is not consistent with the documentation and was removed. Fix defect that could cause newly imported callsign certificates to be deleted after the import completed. 2.1.2 ---------- Add Portuguese (Portugal) translations from Nuno, CT2IRY. (A separate Portuguese (Brazil) translation will eventually be needed.) Correct command line parsing defect that causes TQSL to quit without signing a log unless a station location is provided on the command line. Correct the TQSL editor to not use the language settings for decimal points as ADIF requires "." as the decimal separator. 2.1.1 ---------- Correct defect that generated a spurious error message on certificate renewals, which was entirely blocking renewals. 2.1 ---------- Use German translations from Andreas, DF4WC. Don't require selections for RX Freq, Propmode, or Satellite when entering a QSO into the ADIF editor. Suggest ".adi" as the file type for the editor when saving a new file, not ".adif". Correct support for localalized characters in Windows usernames. Thanks to Goran, SM4DHF for help with fixing this issue. Recognize tags in an ADIF file and map those to modes that LoTW supports. Warn a user when they try to renew a callsign certificate when there's already an existing certificate request for that callsign. Describe the purpose of the TrustedQSL configuration file when a new version of the configuration file is available for download. Add menu items to the Station Location and Callsign Certificate menu to permit undeleting of those items. When creating automatic backups upon exit, save multiple generations (default 10 versions) with a timestamp. This makes it more likely that mistakenly deleted callsign certificates and/or station locations can be successfully recovered. Update the UI for the ADIF editor to eliminate confusing behavior. Add accessibility labels to the editor. Warn the user that editing an arbitrary ADIF file within TQSL will cause fields to be lost. Ensure that TQSL windows gain focus when they are initially displayed. This eliminates a usability issue with accessibility tools. Close TQ8 file when signing a log file. This fixes a defect that would cause the file to remain open until TQSL exited. Attempt to recover from "Self-Signed" certificate errors caused by some misguided "anti-virus" products. Correct defect that could cause TQSL to crash when a user issues a callsign certificate renewal request at startup. When unable to create a callsign certificate request, TQSL would be unable to report the reason, displaying "NO ERROR". Provide the appropriate error message under this circumstance. When a certificate upload fails, pop up an error dialog with the details and delete the pending certificate request. Also delete the pending certificate request when the user cancels the creation. Fix duplicated message text when duplicates are detected. Clean up certificate upload messages. When importing a new callsign certificate, delete any existing pending callsign certificate requests, as well as any expired callsign certificates for that call sign. When displaying the properties of a pending callsign certificate, state that it's pending ARRL action and suppress the fields that are always "N/A", such as start/end date. Remove redundant "You do not need an account" message on certificate renwals. Support wxWidgets 2.9 and 3.0. TQSL is targeted for wxWidgets 2.8, but some Unix variants provide 2.9 (unstable) or 3.0. TQSL will be updated to use wxWidgets 3.0 for the next release. Allow QSO start/end dates to be for the next year when creating a callsign certificate request. This allows requests for future special event operations. When creating a callsign certificate request, verify that the QSO start date is before the QSO end date. When signing a log from the command line in "batch" mode (with -x specified), don't stall waiting on other copies of TQSL to complete signing before processing the command-line log. Instead, report an error message stating that the database is busy. This corrects an issue where logging programs calling TQSL to sign a log could appear to be "hung". Update TQSL to be more tolerant of non-english characters in file and directory names. Allow station locations to have callsign unspecified ('[None]'). When you use such a location for signing a log, TQSL will search for valid callsign certificates in that DXCC entity. If there is only one such callsign certificate, that will be chosen for signing the log. If there are multiple callsign certificates, TQSL will present a list of possible callsign certificates to use, with the callsign certificate with the latest expiration date selected. When submitting a log to LoTW, if you have defined exactly one Station Location, TQSL will automatically use that Station Location without prompting you to select it. Add a command line option "-c callsign" that allows a logging program to specify the callsign certificate to use when signing a log. This can be used with "Callsign='[None]' locations, or to override the callsign defined in a given station location. If the callsign is not valid for the DXCC entity for the selected station location, TQSL will issue an error and reject signing the log. Further changes for accessibility improvements, including not using changing text fields on dialog boxes to indicate errors. Update TQSL to interact better with accessibility libraries. These changes have been tested with MacOS VoiceOver. Properly handle station locations with callsign set to "NONE". They can't be used to sign a log, but they can be created and edited while waiting for a valid callsign certificate. Allow TQSL's messages to be translated to the local language. When update checks are being performed and the Logbook website is not reachable, don't keep trying after the initial failure. Improve startup performance and performance with a large number of callsign certificates. Add the ability to localize TQSL by allowing translation of many of the messages generated by TQSL. 2.0.3 ---------- Correct defect that doesn't allow creating station locations when only one callsign certificate is installed. 2.0.2 ---------- When run in command line "-n" mode (display new program and/or configuration files), TQSL could exit before the check was completed. Change the behavior so the program waits for the check to complete. Signing a log with a location that points to an incomplete certificate request would cause an "Invalid argument" error rather than the expected error message notify the user that they have no valid callsign certificates for that callsign. TQSL now properly displays the error. Don't display the main TQSL window when requesting the user enter the password for their callsign certificate when in batch mode. Add timestamps to diagnostic log entries. Ensure that station locations added from the "sign a log" selection dialog are added to the list of station locations. Allow restore from a .tbk file to restore multiple pending callsign certificates for a given callsign. Change message on upload dialog box when a certificate request is being uploaded to indicate that it's a callsign certificate request, not a log file being uploaded. When a renewed callsign certificate is installed, delete any older versions for that callsign. Correct defect that could cause errors when using files in directories containing non-ASCII characters on Windows. Correctly account for errors when signing a log so that the number of QSOs processed is displayed correctly. (For some cases where QSOs caused errors which the user chose to ignore, the number of QSOs processed could show up as a negative number.) On Windows, Use OpenSSL 1.0.1g to correct the Heartbleed bug. Add a newline after "Signing using.." message when signing a log so any errors show up under that message, not tacked onto the end of it. 2.0.1 ---------- Lock the duplicates database so only a single TQSL instance can access it in cases where users have multiple TQSL windows open. Don't use the Directory chooser widget in the preferences pane for selecting a backup directory on Linux systems. That widget is not usable and can crash TQSL. Use a simple text box instead. Don't prompt the user to renew a callsign certificate that's going to expire soon if they've already submitted a renewal. Correct handling of callsign certificates to avoid an "Invalid argument" loop in some circumstances during update checking. Fix crash when the callsign certificate status file is empty or invalid. Update the messages displayed during callsign certificate creation to make it more clear when signed requests are appropriate. Warn when a duplicate certificate request is being created that there are pending operations and that the user should wait. when checking for updated versions of TQSL, consider production releases to be "newer" than beta/alpha test versions. Correct defect in thread handling that causes hangs on pthread-based systems. Change handling of the Pending Callsign Certificate request list to avoid using a function that misbehaves on some Linux variants. When a user tries to sign a log using a Station Location that refers to an invalid Callsign Certificate, refuse the signing operation and let the user know that the Callsign Certificate is invalid. For uploaded files, use .tq8 as the extension, not the original .adi/.log to avoid user confusion. Remove hang when certain command line strings are empty (-p, for example). When editing a station location where there the associated callsign certificate is no longer installed, don't default to the first certificate. Display an error to properly notify the user. Correct handling of Station Location names with leading and/or trailing whitespace. Strip those characters when creating and editing a station location and ignore them when looking up existing station locations. Install and use a certificate bundle so TQSL is no longer dependent upon the host OS for certificate validation. On Windows, use OpenSSL for SSL connections rather than the unreliable Windows SChannel implementation. Word wrap the "overlapping certificate" message properly. Fix a crash that occurred when an error was displayed due to the automatic backup being performed at exit. Display errors that happen while saving creating callsign certificate requests more prominently. When prompting for a password, don't treat an empty password response as a cancel. Try to use that and report a password error if appropriate. When reporting errors, don't include the filename of the proximate cause twice in the same error message. Don't notify users of pending callsign certificate requests with the "are you ready to install" prompt. This is confusing as it seems to indicate that TQSL has the .TQ6 already downloaded and ready to install. Since we can't tell when LoTW has delivered the e-mail, don't prompt for the TQ6 at every startup. Use the LoTW certificate status web query to determine if any callsign certificates are current. Store this information when updates are done (by default, once daily) and use that to inform users that the callsign certificate they are using are no longer valid. Move the update operations performed at startup to a separate thread so the GUI can initialize while this work is ongoing. This replaces the 2.0 behavior of starting the updates (and blocking the GUI) two seconds after the GUI appeared. This also corrects a potential deadlock on OSX where the first-time user message could appear along with an update dialog, both of which locked each other out. Correct callsign certificate password handling to use UTF-8 for any new passwords. On Windows, try UTF-8 then UCS-2 to unlock. Issue more helpful error messages when errors occur while parsing an ADIF file, including what field is causing the error. Correct problem where using characters like "<", ">" or quote in a station location field could cause restoring a .tbk file to fail with a syntax error. Properly handle non-ASCII characters in station location names and in callsign certificate request name/address fields. Store these in a form that allows transport between UNIX and Windows. When asking about how to handle duplicate QSOs, don't count duplicate QSOs and QSOs with bad callsigns as "new" - ignore them. When importing certificates, default to .tq6 files. Force the callsign certificates and station locations pane of the UI to be fixed size. This fixes long lists of certificates or locations to use a scrollbar rather than having the pane stretch the whole UI. 2.0 ---------- Major feature Additions: Merge tqslcert into tqsl. Update the UI to be more user friendly. For the Callsign Certificaates tree display, don't display the certificate provider list if there's only one provider. Allow users to back up and restore their TQSL configuration in a portable file. Automatically back up the configuration to a user-specified directory (or to a default one) unless this is disabled. Add diagnostic logging capability. This is used to store a verbose log from cURL and to write a trace log that can be used by the developers to help determine the source of defects. Display unique icons in the certificate tree to allow expired and superseded certificates can be distinguished. Detect and report invalid frequencies in ADIF files (outside of ham bands, entered in KHz versus MHz.) Validate the format of Grid Squares when they're entered for a station location. This also fixes the case to be normal, upper case for the Field, lower case for the subsquare (FM18ju, for example). Other changes: Correct the defect that could cause invalid QSOs (bad call signs, for example) to result in a cancellation message from an attempt to sign the log but not provide detail on what QSO failed. Automatically back up the user's configuration whenever TQSL closes. Display the versions of the major software packages built into TQSL as part of the "Help/About" text. Don't ask the user to choose the file type for certificate load operations, just provide a file open dialog and allow them to choose. When issuing a callsign certificate request, default to "signed" unless there are no usable certificates to be used to sign the request. Add text to the dialog box explaining when unsigned requests should be used. Remove the initial "Certificate Providers" page from the certificate request wizard as it serves no current purpose. Always display all callsign certificates, including expired and superseded certificates. Use consistent terminology throughout - "Callsign Certificate" and "Station Location". Replace atoi() calls with strtol() to correct parsing of strings like '012' so they are not treated as octal. Enforce frequency entry in the ADIF editor, ensuring that frequencies are entered correctly (in MHz) and within an amateur band. Reject frequencies that are not consistent with the BAND setting. Correct the exit code for circumstances when -a abort is used and an bad QSO is detected. Display the error information on that QSO before exiting. Detect new versions of the TQSL configuration file when performing the "check for updates" operation (manual or automatic) and allow the user to update the configuration file if there is a newer one available. Add new command line options "-b" to select the start date for QSOs to be signed (begin) and "-e" to select the end date for QSOs to be signed. Warn users on startup when they have a certificate that's going to expire soon (in less than 60 days). Back up certificate details (address, entity) when backing up as .p12 file. Change title of certificate request window to reflect new or renewed certificate. Add the ability to automatically upload a certificate request. Make the preferences window a top-level window so it doesn't block activity in the help screen, etc. Delete obsolete mode maps when signing a log. When creating a station location, default to the callsign selected on the locations tree if one is selected. Add a button to the Log Operations window that opens the Logbook of the world website. Add a new command line option, -n, which checks for new versions of critical TQSL files then exits. This is designed for use by logging programs that operate TQSL on behalf of the user. Add network proxy preference settings to allow users to use the TQSL network based functions on networks that require all traffic to use a proxy. Grab window focus when prompting for the certificate password to ensure that the password window appears on top of the calling logger. Simplify the messages displayed on certificate import (relegate the details to the diagnostic log). Detect additional cURL errors and translate them into more user-friendly text. Don't use "Private Key" in certificate load error messages - use certificate request. Provide the callsign associated with certificate loading errors. Display detailed error on certificate import errors. Display system error reason when attempts to update the TrustedQSL configuration file fail. Track multiple pending certificate requests and warn the user when they try to ask for a new or renewed certificate for callsigns where requests are already pending. Fix pathname separators so Windows always uses "\" for folder/directory names, not mixed forward and backward slashes. Add more information to signing progress display including processed, error, and duplicate counts. Recover from invalid ADIF files by ignoring invalid data until the next EOR (end of record) field is seen. Add working directory string to diagnostic log. Update documentation to reference differences for Mac OS X menus. Delete pending log file when signing cancelled. Fix crash when location entity data is missing. Display the DXCC entity name in location properties, not the entity number. Correct Grid Square parsing to allow 'a' and 'z' in subsquare fields. Update documentation to reference Mac OS X GUI fields and menu layout. Move Diagnostic Mode menu to File menu - the OS X Help menu doesn't allow checked items. Correct other instances of DXCC entity number being used in user messages to emit entity name, not the number. Generate an error message on startup when stale mode maps are in place. Don't allow a user to redefine a standard mode. When the user chooses to not ignore errors in a log, don't save or upload it. Fix the way user dialog boxes (for things like date range, passwords, and requests for how to handle errors) get instantiated so that the windows can appear on top of logging programs using command line log signing. Attempt to determine the field containing the call-worked data in unknown Cabrillo contests without requiring the user to define a custom contest. Update the "Ignore Errors" dialog to have "Ignore" and "Cancel" options and to describe what each of those does. Correct batch/quiet mode (-q or -x command line options) to avoid unexpected windows from popping up before a dialog (password, errors, date range, etc.) Always print out the TQSL version number at the beginning of output for command line applications. Use new application icons contributed by K1GQ. Correct regression where duplicate QSOs would result in an action prompt even though "-a abort" was specified on the command line. Don't display the TQSL version number when "-n" is used on the command line. Strip leading and trailing spaces from the location name passed on the command line. Properly handle and report upload errors displayed by the LoTW website. Install TQSL icon when "make install" used on Linux. Make the new icons optional. Correct the suppression of the TQSL version number when "-n" is used on the command line. Report errors when critical files cannot be opened (station data, certificates, etc.) Correct the behavior when the user selects a callsign or a location in the station location pane then clicks "Create new station location". The callsign selected was used in the location setup, but the DXCC entity was not properly selected. Only display the DXCC entity once in the station location page. This fixes the display when there are multiple callsign certificates for a given callsign (one valid and one expired, for example). This defect would cause TQSL to show a pulldown menu with multiple copies of the same entity name. Suppress warning messages when the user has no locations defined or callsign certificates installed as this is normal for an initial setup. When "Sign and Save" or "Sign and Upload" are used, first check if the user has any callsign certificates installed. The former behavior would ask for the input and output files, then try to select a station location. Since there are none, offering to create a station location would then fail. Trim extra spaces from station location fields. These could cause signing to fail as LoTW was removing these but TQSL was not. Update TQSL to provide the current LoTW configuration file (v2.5) Correct error messages on version update website failures, so that it's clear that it was the check that failed, not the download. Increase the version check timeout slightly to limit premature check failures. When performing the automatic update check at startup, wait for the main GUI window to appear. Provide a status message in the window until the update check completes. This keeps TQSL from appearing to hang at startup if the update check is slow. Correct command line behavior to not pop up a window when invoked then close that window. Fix duplicate handling error introduced at RC6. 1.14.3 ------ On Windows, use a newer versions of libcurl that doesn't suffer from the defect fixed by http://support.microsoft.com/kb/975858. This defect causes an error message "schannel: failed to setup extended errors". On all platforms: show some additional libraries' versions in the about screen Correct a defect when tqsl is used as a command line tool to sign a user's log for their logging program. If while signing that log, tqsl detected that a newer version of tqsl was available, it would exit without signing or uploading those QSOs. 1.14.2 ------ Fixed an error when the TrustedQSL directory had Unicode characters, don't prompt for updates when called silently, fail properly when the user chooses to not ignore signing errors 1.14.1 ------ Minor bug fixes to internet functions and the command line parser, hang fixed on OSX, removed unnecessary field from upload 1.14 ---- Major feature additions: - Upload log files directly from TrustedQSL! Simply choose "sign and upload" from the File menu and your log will signed and uploaded automatically with no extra work. - Command line flag '-u' has been added to expose this functionality to tools authors. - The return value from tqsl can be used to determine whether the signing or upload succeeded or failed, and why 0=success; log signed and uploaded and accepted without incident 1=Cancelled by user 2=The log was rejected by the LoTW server 3=The response from the LoTW server was unexpected or unrecognized 4=An error occurred in tqsl 5=An error occurred in tqsllib (probably a bad filename) 6=Unable to open input file 7=Unable to open output file 8=All QSOs were duplicate or out of date range (no QSOs written) 9=Some QSOs were duplicate or out of date range (some QSOs written) 10=Command syntax error 11=LoTW network connection failed (no network or LoTW is unreachable) The exit status is also written to Standard Error (stderr) in an easily recognized format. - Automatically check for updates. If a new version is available, you will be periodically prompted to download and install it. You can also check manually - Duplicate checking. Any QSOs that have been successfully uploaded to Logbook of the World or saved to a file are registered in a database. Any exact duplicates are automatically stripped from future logs. This can be disabled on a case-by-case basis, in case a log was signed but never uploaded, or there was a server issue that led to an upload going unprocessed. - TQSL will now ensure that the CQ and ITU zones, and subdivisions if any (US state/county, Canadian province, Russian oblast) are valid with respect to each other. This should reduce the incidence of swapped CQ/ITU zones and in general should help ensure that more accurate location data is uploaded. When an attempt is made to use a location with errors (such as CQ/ITU zones being reversed) the user is notified to correct the errors. - Installer on Windows is now a Microsoft Windows Installer package, instead of an executable. This will allow for easier and cleaner upgrades - Added a new command line option, '-a', to allow command line users to control user interaction. This option takes a value from the set ask, abort, compliant, or all. For '-a ask', TQSL will ask users how to handle duplicates and date mismatches. '-a abort' will cause signing to terminate immediately when an error occurs. '-a compliant' will cause only correct (new or in date range) records to be output, and '-a all' will cause all of the input records (including duplicates) to be signed. Prompts for errors (date ranges bad, bad callsigns) will be suppressed for '-a compliant' or '-a all', but cause immediate aborts when '-a abort' is used. '-a ask' prompts the user in those cases. Minor changes: - TQSL/TQSLCERT now have window icons - Double-clicking an entry in the "Choose station location" window for signing now selects it, instead of opening it for editing - Command line parsing has been rewritten and should be more robust. Also, command-line documentation is available with '-h' - Files to sign and save are now prompted before location and date range - The build number is now shown in the About box; please include this when asking for help - The final confirmation before signing includes the signing station location - Output files on Unix systems are provided with a default .tq8 extension - The "Edit station location" window title now contains the callsign and station location name - Station locations can no longer be defined using expired or superseded certificates - Users are no longer prompted for a password while importing a .p12 file unless the file has a password set - When importing a certificate, detailed information is provided on the progress of the operation as well as the reason for any errors - Dozens of bug fixes and potential or real crashes fixed. TQSL/TQSLCERT and the rest of TrustedQSL now built with the CMake build system TQSL/TQSLCERT are now built with MSVC on Windows. ** Windows 98 support has been dropped. This will be one of the last releases to support Windows 2000. ** This will be one of the last releases to support OS X on PowerPC systems. 1.13 ---- No functional changes. Update to sync to updated tqsllib; updated build tools. 1.12 ---- When asking for the password to unlock a private key, say what callsign it's for. Remember certificate requests and assist the user with importing the .tq6. Prompt user to save their certificate after importing a .tq6 signed certificate. Suppress display of superseded certificates, controlled by a tqslcert preference setting. Fix windows wxWidgets crashes with several wizards (cert renew, new cert, etc.) Add checkbox to allow bypassing state selection. Fix crash on Windows when new certificate request wizard is started. Added support for validating zone numbers and requiring them. Allowed batch mode (-x) without displaying windows When double-clicking an entry on the "Edit Station Locations" dialog, open that entry for edit, don't just close the modal dialog. Change the "OK" button on the "Edit Station Locations" dialog to "Close" as that's what it does. Update password dialogs to enable "enter" to activate when possible. Add "-p " and "-o " arguments to tqsl. 1.11 ---- Added command-line option -d. (See on-line help for details.) Modified string handling to be compatible with Unicode versions of wxWindows/wxWidgets. Certificate request wizard now checks for date overlap of request with existing certificates. This allows non-overlapping requests to be generated. (TQSLCERT) Help-contents file tags now contain "type" parameter so that packages built with wxWindows >= 2.4 will show the help contents properly. 1.10 ---- Added command-line parameters and help page for same. (TQSL) Windows build now links the expat library statically, eliminating the need for libexpat.dll. (TQSL/TQSLCERT) 1.09 ---- ADIF editor now handles seconds in the TIME_ON field. (TQSL) User now gets chance to re-enter failed password during signing. (TQSL) Expanded explanation of QSO date-range dialog during signing. (TQSL) After loading new configuration data, DXCC list in CRQ wizard was hosed. (TQSLCERT) 1.08 ---- Added start-up warning if beta-test certificates are present. (TQSLCERT) Added version ident to outgoing .tq8 file. (TQSL) Added display of certificate info to getPassword dialog. (TQSL) 1.07 ---- Fixed GetPassword bug that kept the password from being accepted when trying to unlock the key during Certificate/Save. (TQSLCERT) 1.06 ---- Added support for new QSO data fields (propagation, satellite, rx band and rx freq. (TQSL) Added support for DXCC=NONE. (TQSLCERT) 1.05 ---- Now using TQSLLIB V1.2 Added QSO Date Range dialog. (TQSL) 1.04 ---- "Delete" button in Preferences/ADIF_Modes wasn't getting enabled (Windows only). (TQSL) Assertion error when adding Cabrillo mode to empty list in Preferences/Cabrillo_Specs (Windows only). (TQSL) Completed help files. 1.03 ---- Changed File menu items to be more descriptive (TQSL) Added optional call-sign format checking during signing. (TQSL) Added user-editable table of Cabrillo CONTEST specifications. (TQSL) Improved error reporting during log signing. (TQSL) Errors in log caused signing to be noncancellable. (TQSL) After signing error, same output file couldn't be reused. (TQSL) Added user data pointer to tqsllib callback functions. (TQSLLIB) Added PKCS#12 import and export. (TQSLLIB) Refactored wizard code for more consistent display. (TQSLCERT/TQSL) Added Certificate/Save and Certificate/Delete and added PKCS#12 support to File/Load_Certificate_File. (TQSLCERT) Added broken-certificate indicator to certificate list. (TQSLCERT) Improved error trapping and reporting in certificate-request wizard (TQSLCERT) 1.02 ---- TQSL now gives the user the option of ignoring errors that occur during signing. Errors are still reported, however. Fixed ADIF parser zero-length-field problem. (TQSLLIB) Fixed certificate request wizard State field focus problem. (TQSLCERT) Added "Edit Locations" command to Station menu. (TQSL) Fixed mishandling of ITU zone and CQ zone data in station location. (TQSLLIB) Improved MODE handling in both TQSL and TQSLLIB. There is now a table of mode aliases that can be added to by the user, allowing the user to map nonstandard ADIF MODE values to ones acceptable to TQSL. This is applied both during File/Sign and File/Open operations. Fixed Cabrillo converter typo in ARRL-VHF-JAN contest. (TQSLLIB) 1.01 ---- Fixed error-return value when certificate not found during signing. (TQSLLIB) Fixed certificate selection criteria during signing and add station location. (Was allowing use of certificates not yet loaded.) Added ADIF frequency-to-band conversion. (TQSLLIB) tqsl-2.8.1/apps/LICENSE.rtf0000644000175000017500000000547315003421124015246 0ustar rmurphyrmurphy{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Times New Roman;}} {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\qc\lang1033\f0\fs22 License Terms and Conditions\par \par Copyright (C) 2001-2003 American Radio Relay League, Inc. All rights\par reserved.\par \par Portions (C) 2013-2025 The TrustedQSL Developers\par \par Redistribution and use in source and binary forms, with or without\par modification, are permitted provided that the following conditions\par are met:\par \par 1. Any redistribution of source code must retain the above copyright\par notice, this list of conditions and the disclaimer shown in\par Paragraph 5 (below).\par \par 2. Redistribution in binary form must reproduce the above copyright\par notice, this list of conditions and the disclaimer shown in\par Paragraph 5 (below) in the documentation and/or other materials\par provided with the distribution.\par \par 3. Products derived from or including this software may not use\par "Logbook of the World" or "LoTW" or any other American Radio Relay\par League, Incorporated trademarks or servicemarks in their names\par without prior written permission of the ARRL. See Paragraph 6\par (below) for contact information.\par \par 4. Use of this software does not imply endorsement by ARRL of\par products derived from or including this software and vendors may not\par claim such endorsement. \par \par 5. Disclaimer: This software is provided "as-is" without\par representation, guarantee or warranty of any kind, either express or\par implied, including but not limited to the implied warranties of\par merchantability or of fitness for a particular purpose. The entire\par risk as to the quality and performance of the software is solely\par with you. Should the software prove defective, you (and not the\par American Radio Relay League, its officers, directors, employees or\par agents) assume the entire cost of all necessary servicing, repair or\par correction. In no event will ARRL be liable to you or to any third\par party for any damages, whether direct or indirect, including lost\par profits, lost savings, or other incidental or consequential damages\par arising out of the use or inability to use such software, regardless\par of whether ARRL has been advised of the possibility of such damages.\par \par 6. Contact information:\par \par American Radio Relay League, Inc.\par Attn: Logbook of the World Manager\par 225 Main St\par Newington, CT 06111\par voice: 860-594-0200\par fax: 860-594-0259\par email: logbook@arrl.org\par Worldwide Web: www.arrl.org\par \par This software consists of voluntary contributions made by many\par individuals on behalf of the ARRL. More information on the "Logbook\par of The World" project and the ARRL is available from the ARRL Web\par site at www.arrl.org.\par \par } tqsl-2.8.1/apps/TrustedQSL.spec.in0000644000175000017500000000207315003421124016733 0ustar rmurphyrmurphySummary: TrustedQSL ham-radio applications Name: TrustedQSL Version: @VERSION@ Release: 1 Copyright: Custom BSD-like Group: Applications/Ham Radio Source: %{name}-%{version}.tar.gz BuildRoot: /var/tmp/%{name}-buildroot Requires: tqsllib >= 2.3, wxwin BuildPrereq: tqsllib-devel %description The TrustedQSL applications are used for generating digitally signed QSO records (records of Amateur Radio contacts). This package contains the GUI application tqsl. %prep %setup -q -n TrustedQSL-%{version} %build cmake -DCMAKE_INSTALL_PREFIX=/usr ${TQSL_CONFIG_OPTS} . make %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install mkdir -p $RPM_BUILD_ROOT/usr/share/applications cp tqsl.desktop $RPM_BUILD_ROOT/usr/share/applications/TrustedQSL-tqsl.desktop mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps cp icons/key48.png $RPM_BUILD_ROOT/usr/share/pixmaps/TrustedQSL.png %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc LICENSE /usr/bin/tqsl /usr/share/TrustedQSL/help/tqslapp /usr/share/applications/TrustedQSL-tqsl.desktop /usr/share/pixmaps/TrustedQSL.png tqsl-2.8.1/apps/bottom.xpm0000644000175000017500000000310615003421124015470 0ustar rmurphyrmurphy/* XPM */ static const char *bottom_xpm[]={ "16 16 82 1", " c None", ". c #000000", "+ c #624D77", "@ c #0F0C13", "# c #B48DDC", "$ c #59466A", "% c #544267", "& c #A884CF", "* c #604C6A", "= c #C89EEE", "- c #3B2E48", "; c #5A4763", "> c #A884CE", ", c #DBADFE", "' c #A380C9", ") c #31263C", "! c #403246", "~ c #D7AAF8", "{ c #A481CA", "] c #2F253A", "^ c #A884D0", "/ c #DCAEFE", "( c #BC94E8", "_ c #9878BC", ": c #3B2E49", "< c #3E3146", "[ c #D9ABF8", "} c #C198EC", "| c #9374B5", "1 c #2D2337", "2 c #B48EDE", "3 c #BD95E9", "4 c #AE89D6", "5 c #A482CB", "6 c #6F5788", "7 c #C39AEA", "8 c #C299EE", "9 c #AF8AD7", "0 c #9072B2", "a c #CBA0F7", "b c #574469", "c c #D9ABFE", "d c #AC88D4", "e c #B28CDC", "f c #BA92E4", "g c #B08BD9", "h c #C89DF4", "i c #B58EDF", "j c #B790E2", "k c #AE88D6", "l c #AB87D3", "m c #AD88D5", "n c #AF8AD8", "o c #3A2D47", "p c #9E7DC3", "q c #AA86D2", "r c #A784CE", "s c #9D7CC2", "t c #3C2F4A", "u c #9877BB", "v c #9978BC", "w c #503E62", "x c #876BA7", "y c #A985D0", "z c #282032", "A c #9978BD", "B c #9272B3", "C c #17121D", "D c #9070B1", "E c #282031", "F c #9172B2", "G c #8F70B0", "H c #2D2438", "I c #18131E", "J c #9071B1", "K c #18121D", "L c #7D639B", "M c #30263B", "N c #7E639C", "O c #8D6FAE", "P c #15101A", "Q c #2E2438", "................", "..+......@....@.", "..#.....$%...$%.", "..&....*=-..;=-.", "..>...*,').!~{].", "..^..*/(_:<[}|1.", "..2.*/345678901.", "..abc39ddefgd01.", "..hij4klddm4l01.", "..nopqdlrsrdq01.", "..&.tuqdvwxyd01.", "..>..zA&B]CD^01.", "..>...EFGH.IJJH.", "..{....KLM..INM.", "..O.....PQ...PQ.", "................"}; tqsl-2.8.1/apps/broken-cert.xpm0000644000175000017500000000135015003421124016376 0ustar rmurphyrmurphy/* XPM */ static const char * broken_cert_xpm[] = { "16 16 17 1", " c #FDFDFDFDFDFD", ". c #D7D7D7D7D7D7", "X c #FFFFFFFFFFFF", "o c #DEDEDEDEDEDE", "O c #7B7B7B7B4E4E", "+ c #818181810505", "@ c #A9A9A9A90202", "# c #999999999191", "$ c #F7F7F7F70202", "% c #BBBBBBBB0202", "& c #D4D4D4D40202", "* c #E0E0E0E00202", "= c #979797970202", "- c #616161611212", "; c #ABABABABAAAA", ": c #C1C1C1C1C1C1", "> c #CFCFCFCFCFCF", " .Xo ", " O+XX@+# ", " .O$@X++%&O ", " +*+XX@$%+$O ", " #*=XX+&-$%%@. ", " O$+XXX$*@$+*# ", " #$=$=XXX@$=&; ", " :%=*$-+XX%%=o ", " O*+&$XXX+&# ", " O@@XX+%=# ", " ;XX@@-> ", " #&XX+&; ", " O%&XX*O ", " :%=$+X@&; ", " O@-+-X-%O ", " .:o>o>o>o "}; tqsl-2.8.1/apps/ca-bundle.crt0000644000175000017500000000610115003421124016000 0ustar rmurphyrmurphy## ## ca-bundle.crt -- Bundle of CA Root Certificates ## ## This file contains JUST the certificates needed to connect ## to the lotw.arrl.org website. # Certificates from https://certs.godaddy.com/repository/ # Go Daddy Class 2 Certification Authority -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- # Go Daddy Class 2 Certification Authority Root Certificate - G2 -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI 4uJEvlz36hz1 -----END CERTIFICATE----- tqsl-2.8.1/apps/cab_modes.dat0000644000175000017500000000004315003421124016041 0ustar rmurphyrmurphyCW,CW PH,SSB FM,FM RY,RTTY DG,DATA tqsl-2.8.1/apps/cert.xpm0000644000175000017500000000117015003421124015120 0ustar rmurphyrmurphy/* XPM */ static const char * cert_xpm[] = { "16 16 17 1", " c None", ". c #616112", "+ c #7B7B4E", "@ c #999991", "# c #D4D402", "$ c #ABABAA", "% c #A9A902", "& c #C1C1C1", "* c #CFCFCF", "= c #D7D7D7", "- c #E0E002", "; c #818105", "> c #DEDEDE", ", c #FDFDFD", "' c #979702", ") c #F7F702", "! c #BBBB02", ",,,,,,,=*>,,,,,,", ",,,,,+;%!%;@,,,,", ",,,=+)%;;;!#+,,,", ",,,;-;#-%)!;)+,,", ",,@-'-#;#.)!!%=,", ",,+););))-%);-@,", ",,@)')'))#%)'#$,", ",,&!'-).;;)!!'>,", ",,,+-;#)))!;#@,,", ",,,,+%%;';!'@,,,", ",,,,,$'%%%.*,,,,", ",,,,,@#';;#$,,,,", ",,,,,+!#;'-+,,,,", ",,,,&!');#%#$,,,", ",,,,+%.;.;.!+,,,", ",,,,=&>*>*>*>,,,"}; tqsl-2.8.1/apps/certtree.cpp0000644000175000017500000002604415003421124015765 0ustar rmurphyrmurphy/*************************************************************************** certtree.cpp - description ------------------- begin : Sun Jun 23 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #include "certtree.h" #include #include #include #include #include #include #include #include #include #include "tqslctrls.h" #include "util.h" #include "dxcc.h" #include "tqslerrno.h" #include "tqsltrace.h" #include "wxutil.h" #include "cert.xpm" #include "nocert.xpm" #include "broken-cert.xpm" #include "folder.xpm" #include "expired.xpm" #include "replaced.xpm" using std::pair; using std::vector; using std::map; using std::make_pair; enum { CERT_ICON = 0, NOCERT_ICON = 1, BROKEN_ICON = 2, EXPIRED_ICON = 3, REPLACED_ICON = 4, FOLDER_ICON = 5 }; ///////////// Certificate Tree Control //////////////// BEGIN_EVENT_TABLE(CertTree, wxTreeCtrl) EVT_TREE_ITEM_ACTIVATED(-1, CertTree::OnItemActivated) EVT_RIGHT_DOWN(CertTree::OnRightDown) EVT_TREE_KEY_DOWN(wxID_ANY, CertTree::OnKeyDown) END_EVENT_TABLE() CertTree::CertTree(wxWindow *parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxTreeCtrl(parent, id, pos, size, style), _ncerts(0) { tqslTrace("CertTree::CertTree", NULL); useContextMenu = true; wxBitmap certbm(cert_xpm); wxBitmap no_certbm(nocert_xpm); wxBitmap broken_certbm(broken_cert_xpm); wxBitmap folderbm(folder_xpm); wxBitmap expiredbm(expired_xpm); wxBitmap replacedbm(replaced_xpm); wxImageList *il = new wxImageList(16, 16, false, 5); il->Add(certbm); il->Add(no_certbm); il->Add(broken_certbm); il->Add(expiredbm); il->Add(replacedbm); il->Add(folderbm); SetImageList(il); ACCESSIBLE(this, WindowAccessible); this->SetName(_("Callsign Certificates")); tabTo = NULL; } CertTree::~CertTree() { tqslTrace("CertTree::~CertTree", NULL); if (_ncerts >0) tqsl_freeCertificateList(_certs, _ncerts); _ncerts = 0; } CertTreeItemData::~CertTreeItemData() { } typedef pair certitem; typedef vector certlist; static bool cl_cmp(const certitem& i1, const certitem& i2) { return i1.first < i2.first; } int CertTree::Build(int flags, const TQSL_PROVIDER *provider) { tqslTrace("CertTree::Build", "flags=%d, provider=%lx", flags, static_cast(const_cast(provider))); typedef map issmap; issmap issuers; DeleteAllItems(); wxTreeItemId rootId = AddRoot(_("Callsign Certificates"), FOLDER_ICON); if (tqsl_selectCertificates(&_certs, &_ncerts, 0, 0, 0, provider, flags)) { if (tQSL_Error != TQSL_SYSTEM_ERROR || tQSL_Errno != ENOENT) displayTQSLError(__("Error while accessing certificate store")); } // Separate certs into lists by issuer for (int i = 0; i < _ncerts; i++) { char issname[129]; if (tqsl_getCertificateIssuerOrganization(_certs[i], issname, sizeof issname)) { displayTQSLError(__("Error parsing certificate for issuer")); return _ncerts; } char callsign[129] = ""; if (tqsl_getCertificateCallSign(_certs[i], callsign, sizeof callsign - 4)) { displayTQSLError(__("Error parsing certificate for call sign")); return _ncerts; } strncat(callsign, " - ", sizeof callsign - strlen(callsign)-1); DXCC dxcc; int dxccEntity; if (tqsl_getCertificateDXCCEntity(_certs[i], &dxccEntity)) { displayTQSLError(__("Error parsing certificate for DXCC entity")); return _ncerts; } const char *entityName; if (dxcc.getByEntity(dxccEntity)) entityName = dxcc.name(); else entityName = ""; strncat(callsign, entityName, sizeof callsign - strlen(callsign)-1); callsign[sizeof callsign-1] = 0; issuers[wxString::FromUTF8(issname)].push_back(make_pair(wxString::FromUTF8(callsign), i)); } // Sort each issuer's list and add items to tree issmap::iterator iss_it; wxTreeItemId id = NULL; wxTreeItemId valid = NULL; wxTreeItemId replaced = NULL; wxTreeItemId invalid = NULL; wxTreeItemId pending = NULL; wxTreeItemId expired = NULL; int invalidCnt = 0; int pendingCnt = 0; int replacedCnt = 0; int expiredCnt = 0; _nissuers = issuers.size(); typedef map komap; komap alreadyPended; komap goodCerts; // Keep track of calls with good certificates // First pass, track good certs. for (iss_it = issuers.begin(); iss_it != issuers.end(); iss_it++) { certlist& list = iss_it->second; sort(list.begin(), list.end(), cl_cmp); for (int i = 0; i < static_cast(list.size()); i++) { int keyonly = 1; int exp = 0, sup = 0; int keytype = tqsl_getCertificatePrivateKeyType(_certs[list[i].second]); tqsl_isCertificateExpired(_certs[list[i].second], &exp); tqsl_isCertificateSuperceded(_certs[list[i].second], &sup); tqsl_getCertificateKeyOnly(_certs[list[i].second], &keyonly); if (keytype != TQSL_PK_TYPE_ERR && !keyonly && !sup && !exp) { wxString callsign = wxString(list[i].first).BeforeFirst(' '); goodCerts[callsign] = 1; } } } // Second pass, filter and populate the tree for (iss_it = issuers.begin(); iss_it != issuers.end(); iss_it++) { if (_nissuers > 1) { id = AppendItem(rootId, iss_it->first, FOLDER_ICON); } certlist& list = iss_it->second; sort(list.begin(), list.end(), cl_cmp); valid = AppendItem(_nissuers > 1 ? id : rootId, _("Active, usable certificates"), FOLDER_ICON); for (int i = 0; i < static_cast(list.size()); i++) { wxString callsign = wxString(list[i].first).BeforeFirst(' '); CertTreeItemData *cert = new CertTreeItemData(_certs[list[i].second]); int keyonly = 1; int exp = 0, sup = 0; int icon_type; int keytype = tqsl_getCertificatePrivateKeyType(_certs[list[i].second]); tqsl_isCertificateExpired(_certs[list[i].second], &exp); tqsl_isCertificateSuperceded(_certs[list[i].second], &sup); tqsl_getCertificateKeyOnly(_certs[list[i].second], &keyonly); if (keytype == TQSL_PK_TYPE_ERR) { if (goodCerts.find(callsign) != goodCerts.end()) continue; icon_type = BROKEN_ICON; if (!invalid) invalid = AppendItem(_nissuers > 1 ? id : rootId, _("Unusable: Missing Private Key"), FOLDER_ICON); AppendItem(invalid, list[i].first, icon_type, -1, cert); invalidCnt++; } else if (keyonly) { icon_type = NOCERT_ICON; // Is a request pending for this call? wxString reqPending = wxConfig::Get()->Read(wxT("RequestPending")); wxString callsign = wxString(list[i].first).BeforeFirst(' '); wxStringTokenizer tkz(reqPending, wxT(",")); while (tkz.HasMoreTokens()) { wxString pend = tkz.GetNextToken(); if (pend == callsign) { // Only show once if (alreadyPended.find(callsign) == alreadyPended.end()) { if (!pending) pending = AppendItem(_nissuers > 1 ? id : rootId, _("Incomplete Certificates - requires a matching TQ6"), FOLDER_ICON); AppendItem(pending, list[i].first, icon_type, -1, cert); pendingCnt++; alreadyPended[callsign] = 1; } break; } } } else if (sup) { if (goodCerts.find(callsign) != goodCerts.end()) continue; icon_type = REPLACED_ICON; if (!replaced) replaced = AppendItem(_nissuers > 1 ? id : rootId, _("Certificates replaced with a newer one"), FOLDER_ICON); AppendItem(replaced, list[i].first, icon_type, -1, cert); replacedCnt++; } else if (exp) { if (goodCerts.find(callsign) != goodCerts.end()) continue; icon_type = EXPIRED_ICON; if (!expired) expired = AppendItem(_nissuers > 1 ? id : rootId, _("Certificates that have expired"), FOLDER_ICON); AppendItem(expired, list[i].first, icon_type, -1, cert); expiredCnt++; } else { icon_type = CERT_ICON; AppendItem(valid, list[i].first, icon_type, -1, cert); } } if (id) Expand(id); } if (!valid) // Handle the no certificates case valid = AppendItem(_nissuers > 1 ? id : rootId, _("Active, usable certificates"), FOLDER_ICON); Expand(valid); Expand(rootId); if (invalidCnt > 0) Expand(invalid); if (pendingCnt > 0) Expand(pending); if (replacedCnt > 0) Expand(replaced); if (expiredCnt > 0) Expand(expired); return _ncerts; } void CertTree::SelectCert(tQSL_Cert cert) { long serial; if (tqsl_getCertificateSerial(cert, &serial)) return; // Iterate the tree, looking for a matching certificate wxTreeItemId root = GetRootItem(); wxTreeItemIdValue issCookie; wxTreeItemIdValue listsCookie; wxTreeItemIdValue certCookie; wxTreeItemId top; if (_nissuers > 1) { top = GetFirstChild(root, issCookie); } else { top = root; } while (top.IsOk()) { wxTreeItemId item = GetFirstChild(top, listsCookie); while (item.IsOk()) { wxTreeItemId subitem = GetFirstChild(item, certCookie); while (subitem.IsOk()) { tQSL_Cert cert = GetItemData(subitem)->getCert(); long s; tqsl_getCertificateSerial(cert, &s); if (s == serial) { // found it SelectItem(subitem); return; } subitem = GetNextChild(item, certCookie); } item = GetNextChild(top, listsCookie); } if (_nissuers > 1) { top = GetNextChild(root, issCookie); } else { break; } } return; // Not found } void CertTree::OnItemActivated(wxTreeEvent& event) { tqslTrace("CertTree::OnItemActivated", NULL); wxTreeItemId id = event.GetItem(); displayCertProperties(reinterpret_cast(GetItemData(id)), this); } void CertTree::OnRightDown(wxMouseEvent& event) { tqslTrace("CertTree::OnRightDown", NULL); if (!useContextMenu) return; wxTreeItemId id = HitTest(event.GetPosition()); if (id && GetItemData(id)) { SelectItem(id); tQSL_Cert cert = GetItemData(id)->getCert(); int keyonly = 1; int superseded = 1; int renewable = 1; int enable = 1; wxMenu *cm; int window = DEFAULT_CERT_FUZZ; wxConfig::Get()->Read(wxT("RenewalWindow"), &window, DEFAULT_CERT_FUZZ); // Null cert sets the renewal window tqsl_isCertificateRenewable(NULL, &window); if (cert) { tqsl_getCertificateKeyOnly(cert, &keyonly); tqsl_isCertificateSuperceded(cert, &superseded); tqsl_isCertificateRenewable(cert, &renewable); if (!renewable || superseded) { enable = 0; } char callsign[129]; if (tqsl_getCertificateCallSign(cert, callsign, sizeof callsign)) { cm = makeCertificateMenu((enable != 0), (keyonly != 0), NULL); } else { cm = makeCertificateMenu((enable != 0), (keyonly != 0), callsign); } } else { cm = makeCertificateMenu((enable != 0), (keyonly != 0), NULL); } PopupMenu(cm, event.GetPosition()); delete cm; } } void CertTree::SetTabTo(wxWindow *w) { tabTo = w; } void CertTree::OnKeyDown(wxTreeEvent& event) { const wxKeyEvent& keyev = event.GetKeyEvent(); long keycode = keyev.GetKeyCode(); if (keycode == WXK_TAB) { if (tabTo) { tabTo->SetFocus(); event.Skip(); } } } tqsl-2.8.1/apps/certtree.h0000644000175000017500000000373315003421124015432 0ustar rmurphyrmurphy/*************************************************************************** certtree.h - description ------------------- begin : Sun Jun 23 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __certtree_h #define __certtree_h #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include #include "tqsllib.h" #include "wxutil.h" class CertTreeItemData : public wxTreeItemData { public: explicit CertTreeItemData(tQSL_Cert cert) : _cert(cert) {path = wxEmptyString; basename = wxEmptyString;} ~CertTreeItemData(); tQSL_Cert getCert() { return _cert; } wxString path; wxString basename; private: tQSL_Cert _cert; }; class CertTree : public wxTreeCtrl { public: CertTree(wxWindow *parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style); virtual ~CertTree(); int Build(int flags = TQSL_SELECT_CERT_WITHKEYS, const TQSL_PROVIDER *provider = 0); void OnItemActivated(wxTreeEvent& event); void OnRightDown(wxMouseEvent& event); void OnKeyDown(wxTreeEvent& event); void SetTabTo(wxWindow*); bool useContextMenu; #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Woverloaded-virtual" #endif CertTreeItemData *GetItemData(wxTreeItemId id) { return reinterpret_cast(wxTreeCtrl::GetItemData(id)); } #ifdef __clang__ #pragma clang diagnostic pop #endif int GetNumCerts() const { return _ncerts; } int GetNumIssuers() const { return _nissuers; } void SelectCert(tQSL_Cert cert); private: tQSL_Cert *_certs; int _ncerts; int _nissuers; wxWindow* tabTo; DECLARE_EVENT_TABLE() }; #endif // __certtree_h tqsl-2.8.1/apps/crqwiz.cpp0000644000175000017500000020267315003421124015473 0ustar rmurphyrmurphy/*************************************************************************** crqwiz.cpp - description ------------------- begin : Sat Jun 15 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #include "crqwiz.h" #include #include #include #include #include #include #include #include #include #ifdef DEBUG #include #endif #include #include #include #include "dxcc.h" #include "util.h" #include "tqslctrls.h" #include "tqsltrace.h" #include "tqsl_prefs.h" #include "winstrdefs.h" extern int SaveAddressInfo(const char *callsign, int dxcc); extern int GetULSInfo(const char *callsign, wxString &name, wxString &attn, wxString &street, wxString &city, wxString &state, wxString &zip); using std::string; using std::make_pair; extern int get_address_field(const char *callsign, const char *field, string& result); static wxString callTypeChoices[] = { _("This callsign replaces my existing callsign"), _("This is my former callsign"), _("I am the QSL manager for this callsign"), _("This is a club callsign"), _("This is a DXpedition callsign"), _("This is a special event callsign"), _("None of these apply") }; // List of DXCC entities in the US. static int USEntities[] = { 6, // Alaska 9, // American Samoa 20, // Baker and Howland 43, // Desecheo Island 103, // Guam 105, // Guantanamo Bay 110, // Hawaii 123, // Johnston Island 138, // Kure Island 166, // Mariana Islands 174, // Midway Island 182, // Navassa Island 197, // Palmyra & Jarvis 202, // Puerto Rico 285, // US Virgin Islands 291, // USA 297, // Wake Island 515, // Swains Island -1 }; typedef map prefixMap; static prefixMap prefixRegex; static prefixMap entityNames; static void initPrefixes() { if (prefixRegex.size() > 0) return; char prefixfile[TQSL_MAX_PATH_LEN]; FILE *lfp; #ifdef _WIN32 snprintf(prefixfile, sizeof prefixfile, "%s\\prefixes.dat", tQSL_RsrcDir); wchar_t *wfilename = utf8_to_wchar(prefixfile); if ((lfp = _wfopen(wfilename, L"rb, ccs=UTF-8")) == NULL) { free_wchar(wfilename); return; } #else snprintf(prefixfile, sizeof prefixfile, "%s/prefixes.dat", tQSL_RsrcDir); if ((lfp = fopen(prefixfile, "rb")) == NULL) { return; } #endif char pBuf[1024]; while (fgets(pBuf, sizeof pBuf, lfp)) { if (pBuf[0] == '/' && pBuf[1] == '/') // Comments continue; wxStringTokenizer pData(wxString::FromUTF8(pBuf), wxT(",")); int entnum = strtol(pData.GetNextToken().ToUTF8(), NULL, 10); if (entnum == 0) // Entity is first char continue; prefixRegex[entnum] = pData.GetNextToken(); // Then regex wxString eName = pData.GetNextToken(); while (pData.CountTokens() > 0) { eName = eName + pData.GetLastDelimiter(); eName = eName + pData.GetNextToken(); } eName = eName.Trim(); // Last is entity name // Translate "(Deleted)" to local language wxString del = wxGetTranslation(wxT("DELETED")); if (del != wxT("DELETED")) eName.Replace(wxT("Deleted"), wxGetTranslation(wxT("DELETED"))); entityNames[entnum] = eName; } fclose(lfp); } static bool isUSCallsign(wxString& call) { wxString first = call.Upper().Left(1); wxString second = call.Upper().Left(2); if (call.size() < 3) { return false; } if (call.Find(wxT("/")) != wxNOT_FOUND) { return false; } if (first == wxT("W") || first == wxT("K") || first == wxT("N") || (second >= wxT("AA") && second <= wxT("AL"))) { return true; } return false; } static bool isUSEntity(int entity) { for (int i = 0; USEntities[i] > 0; i++) { if (entity == USEntities[i]) { return true; } } return false; } CRQWiz::CRQWiz(TQSL_CERT_REQ *crq, tQSL_Cert xcert, wxWindow *parent, wxHtmlHelpController *help, const wxString& title) : ExtWizard(parent, help, title), cert(xcert), _crq(crq) { tqslTrace("CRQWiz::CRQWiz", "crq=%lx, xcert=%lx, title=%s", reinterpret_cast(cert), reinterpret_cast(xcert), S(title)); dxcc = -1; validcerts = false; // No signing certs to use onebyone = false; signIt = CRQ_SIGN_MAYBE; // Not forcing signing of this portable = false; // Not portable replacementCall = false; // Not a replacement renewal = (_crq != NULL); // It's a renewal if there's a CRQ provided usa = validusa = false; // Not usa expired = false; initPrefixes(); // Initialize prefix regex list // Get count of valid certificates int ncerts = 0; if (!tqsl_selectCertificates(NULL, &ncerts, NULL, 0, NULL, NULL, 0)) { validcerts = (ncerts > 0); } nprov = 1; networkError = false; if (tqsl_getNumProviders(&nprov)) nprov = 0; providerPage = new CRQ_ProviderPage(this, _crq); signPage = new CRQ_SignPage(this, _crq); callsignPage = new CRQ_CallsignPage(this, _crq); namePage = new CRQ_NamePage(this, _crq); emailPage = new CRQ_EmailPage(this, _crq); wxConfig *config = reinterpret_cast(wxConfig::Get()); config->Read(wxT("CertPwd"), &CertPwd, DEFAULT_CERTPWD); pwPage = new CRQ_PasswordPage(this); typePage = new CRQ_TypePage(this); if (nprov != 1) wxWizardPageSimple::Chain(providerPage, callsignPage); wxWizardPageSimple::Chain(callsignPage, typePage); wxWizardPageSimple::Chain(typePage, namePage); wxWizardPageSimple::Chain(namePage, emailPage); wxWizardPageSimple::Chain(emailPage, pwPage); if (!cert) wxWizardPageSimple::Chain(pwPage, signPage); if (nprov == 1) _first = callsignPage; else _first = providerPage; AdjustSize(); CenterOnParent(); } bool CRQWiz::ShouldBeSigned(void) { switch (signIt) { case CRQ_NOT_SIGNED: // Don't sign if no certs case CRQ_SIGN_RENEWAL: // or a renewal return false; case CRQ_SIGN_PORTABLE: // Portable must be signed case CRQ_SIGN_REPLACEMENT: // Replacement signed by current case CRQ_SIGN_1X1: // 1x1 must be signed case CRQ_SIGN_QSL_MGR: // QSL Mgr - Maybe case CRQ_SIGN_SPC_EVENT: // Special event - Maybe case CRQ_SIGN_NONE: // NONE - always signed case CRQ_SIGN_MAYBE: // Dunno. Maybe. default: return true; } } bool CRQWiz::MustBeSigned(void) { switch (signIt) { case CRQ_NOT_SIGNED: // Don't sign if no certs case CRQ_SIGN_RENEWAL: // or a renewal case CRQ_SIGN_MAYBE: // Dunno. Maybe. case CRQ_SIGN_SPC_EVENT: // Special event - Maybe case CRQ_SIGN_QSL_MGR: // QSL Mgr - Maybe return false; case CRQ_SIGN_PORTABLE: // Portable must be signed case CRQ_SIGN_REPLACEMENT: // Replacement signed by current case CRQ_SIGN_1X1: // 1x1 must be signed case CRQ_SIGN_NONE: // NONE - always signed default: return true; } } // Page constructors BEGIN_EVENT_TABLE(CRQ_ProviderPage, CRQ_Page) EVT_COMBOBOX(ID_CRQ_PROVIDER, CRQ_ProviderPage::UpdateInfo) END_EVENT_TABLE() static bool prov_cmp(const TQSL_PROVIDER& p1, const TQSL_PROVIDER& p2) { return strcasecmp(p1.organizationName, p2.organizationName) < 0; } CRQ_ProviderPage::CRQ_ProviderPage(CRQWiz *parent, TQSL_CERT_REQ *crq) : CRQ_Page(parent) { tqslTrace("CRQ_ProviderPage::CRQ_ProviderPage", "parent=%lx, crq=%lx", reinterpret_cast(parent), reinterpret_cast(crq)); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxWindowDC dc(this); dc.SetFont(this->GetFont()); Parent()->maxWidth = 0; wxCoord em_w, em_h; dc.GetTextExtent(wxString(wxT("M")), &em_w, &em_h); if (Parent()->maxWidth < em_w * 40) Parent()->maxWidth = em_w * 40; wxString lbl = _("This will create a new Callsign Certificate request file."); lbl += wxT("\n\n"); lbl += _("Once you supply the requested information and the request file has been created, you must send the request file to the certificate issuer."); wxStaticText *st = new wxStaticText(this, -1, lbl); st->SetSize(Parent()->maxWidth + em_w * 2, em_h * 5); st->Wrap(Parent()->maxWidth + em_w * 3); sizer->Add(st, 0, wxALL, 10); sizer->Add(new wxStaticText(this, -1, _("Certificate Issuer:")), 0, wxLEFT|wxRIGHT, 10); tc_provider = new tqslComboBox(this, ID_CRQ_PROVIDER, wxT(""), wxDefaultPosition, wxDefaultSize, 0, 0, wxCB_DROPDOWN|wxCB_READONLY); ACCESSIBLE(tc_provider, ComboBoxAx); tc_provider->SetName(wxT("Certificate Issuer")); sizer->Add(tc_provider, 0, wxLEFT|wxRIGHT|wxEXPAND, 10); tc_provider_info = new wxStaticText(this, ID_CRQ_PROVIDER_INFO, wxT(""), wxDefaultPosition, wxSize(0, em_h*5)); sizer->Add(tc_provider_info, 0, wxALL|wxEXPAND, 10); int nprov = 0; if (tqsl_getNumProviders(&nprov)) wxMessageBox(getLocalizedErrorString(), _("Error"), wxOK | wxICON_ERROR, this); for (int i = 0; i < nprov; i++) { TQSL_PROVIDER prov; if (!tqsl_getProvider(i, &prov)) providers.push_back(prov); } sort(providers.begin(), providers.end(), prov_cmp); int selected = -1; for (int i = 0; i < static_cast(providers.size()); i++) { tc_provider->Append(wxString::FromUTF8(providers[i].organizationName), reinterpret_cast(i)); if (crq && !strcmp(providers[i].organizationName, crq->providerName) && !strcmp(providers[i].organizationalUnitName, crq->providerUnit)) { selected = i; } } tc_provider->SetSelection((selected < 0) ? 0 : selected); if (providers.size() < 2 || selected >= 0) tc_provider->Enable(false); DoUpdateInfo(); AdjustPage(sizer, wxT("crq.htm")); } void CRQ_ProviderPage::DoUpdateInfo() { tqslTrace("CRQ_ProviderPage::DoUpdateInfo", NULL); int sel = tc_provider->GetSelection(); if (sel >= 0) { long idx = (long)(tc_provider->GetClientData(sel)); if (idx >=0 && idx < static_cast(providers.size())) { Parent()->provider = providers[idx]; wxString info; info = wxString::FromUTF8(Parent()->provider.organizationName); if (Parent()->provider.organizationalUnitName[0] != 0) info += wxString(wxT("\n ")) + wxString::FromUTF8(Parent()->provider.organizationalUnitName); if (Parent()->provider.emailAddress[0] != 0) info += wxString(wxT("\n")) += _("Email: ") + wxString::FromUTF8(Parent()->provider.emailAddress); if (Parent()->provider.url[0] != 0) info += wxString(wxT("\n")) + _("URL: ") + wxString::FromUTF8(Parent()->provider.url); tc_provider_info->SetLabel(info); } } } void CRQ_ProviderPage::UpdateInfo(wxCommandEvent&) { tqslTrace("CRQ_ProviderPage::UpdateInfo", NULL); DoUpdateInfo(); } static wxDateTime::Month mons[] = { wxDateTime::Inv_Month, wxDateTime::Jan, wxDateTime::Feb, wxDateTime::Mar, wxDateTime::Apr, wxDateTime::May, wxDateTime::Jun, wxDateTime::Jul, wxDateTime::Aug, wxDateTime::Sep, wxDateTime::Oct, wxDateTime::Nov, wxDateTime::Dec }; BEGIN_EVENT_TABLE(CRQ_CallsignPage, CRQ_Page) EVT_TEXT(ID_CRQ_CALL, CRQ_Page::check_valid) EVT_TEXT(ID_CRQ_DXCC, tqslComboBox::OnTextEntry) EVT_TEXT(ID_CRQ_QBYEAR, tqslComboBox::OnTextEntry) EVT_TEXT(ID_CRQ_QBMONTH, tqslComboBox::OnTextEntry) EVT_TEXT(ID_CRQ_QBDAY, tqslComboBox::OnTextEntry) EVT_TEXT(ID_CRQ_QEYEAR, tqslComboBox::OnTextEntry) EVT_TEXT(ID_CRQ_QEMONTH, tqslComboBox::OnTextEntry) EVT_TEXT(ID_CRQ_QEDAY, tqslComboBox::OnTextEntry) EVT_COMBOBOX(ID_CRQ_DXCC, CRQ_Page::check_valid) EVT_COMBOBOX(ID_CRQ_QBYEAR, CRQ_Page::check_valid) EVT_COMBOBOX(ID_CRQ_QBMONTH, CRQ_Page::check_valid) EVT_COMBOBOX(ID_CRQ_QBDAY, CRQ_Page::check_valid) EVT_COMBOBOX(ID_CRQ_QEYEAR, CRQ_Page::check_valid) EVT_COMBOBOX(ID_CRQ_QEMONTH, CRQ_Page::check_valid) EVT_COMBOBOX(ID_CRQ_QEDAY, CRQ_Page::check_valid) EVT_CHECKBOX(ID_CRQ_SHOWALL, CRQ_CallsignPage::OnShowHide) END_EVENT_TABLE() CRQ_CallsignPage::CRQ_CallsignPage(CRQWiz *parent, TQSL_CERT_REQ *crq) : CRQ_Page(parent) { tqslTrace("CRQ_CallsignPage::CRQ_CallsignPage", "parent=%lx, crq=%lx", reinterpret_cast(parent), reinterpret_cast(crq)); initialized = false; _parent = parent; showAll = false; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxStaticText *dst = new wxStaticText(this, -1, _("DXCC entity:")); wxSize sz = getTextSize(this); int em_h = sz.GetHeight(); int em_w = sz.GetWidth(); wxStaticText *st = new wxStaticText(this, -1, _("Call sign:"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE|wxALIGN_RIGHT); st->SetSize(dst->GetSize()); wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(st, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); wxString cs; if (crq && crq->callSign[0]) cs = wxString::FromUTF8(crq->callSign); tc_call = new wxTextCtrl(this, ID_CRQ_CALL, cs, wxDefaultPosition, wxSize(em_w*15, -1)); tc_call->SetMaxLength(TQSL_CALLSIGN_MAX); ACCESSIBLE(tc_call, WindowAccessible); tc_call->SetName(wxT("Call sign")); hsizer->Add(tc_call, 0, wxEXPAND, 0); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 10); if (crq && crq->callSign[0]) tc_call->Enable(false); hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(dst, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); #if wxUSE_ACCESSIBILITY && __WXMAC__ tc_dxcc = new tqslComboBox(this, ID_CRQ_DXCC, wxT(""), wxDefaultPosition, wxSize(em_w*25, -1), 0, 0, wxCB_DROPDOWN); #else tc_dxcc = new tqslComboBox(this, ID_CRQ_DXCC, wxT(""), wxDefaultPosition, wxSize(em_w*25, -1), 0, 0, wxCB_DROPDOWN|wxCB_READONLY); #endif hsizer->Add(tc_dxcc, 1, 0, 0); ACCESSIBLE(tc_dxcc, ComboBoxAx); tc_dxcc->SetName(wxT("DXCC Entity")); tc_showall = new wxCheckBox(this, ID_CRQ_SHOWALL, wxT("Show All Entities")); hsizer->Add(tc_showall); sizer->Add(hsizer, 0, wxALL, 10); DXCC dx; bool ok = dx.getFirst(); while (ok) { wxString ename = entityNames[dx.number()]; if (ename.IsEmpty()) ename = wxString::FromUTF8(dx.name()); tc_dxcc->Append(ename, reinterpret_cast(dx.number())); ok = dx.getNext(); } const char *ent = "NONE"; if (crq) { if (dx.getByEntity(crq->dxccEntity)) { if (entityNames[crq->dxccEntity].IsEmpty()) ent = dx.name(); else ent = entityNames[crq->dxccEntity].ToUTF8(); tc_dxcc->Enable(false); } } int i = tc_dxcc->FindString(wxString::FromUTF8(ent)); if (i >= 0) tc_dxcc->SetSelection(i); struct { tqslComboBox **cb; int id; } boxes[][3] = { { {&tc_qsobeginy, ID_CRQ_QBYEAR}, {&tc_qsobeginm, ID_CRQ_QBMONTH}, {&tc_qsobegind, ID_CRQ_QBDAY} }, { {&tc_qsoendy, ID_CRQ_QEYEAR}, {&tc_qsoendm, ID_CRQ_QEMONTH}, {&tc_qsoendd, ID_CRQ_QEDAY} } }; int year = wxDateTime::GetCurrentYear() + 1; int sels[2][3]; int dates[2][3]; if (crq) { dates[0][0] = crq->qsoNotBefore.year; dates[0][1] = crq->qsoNotBefore.month; dates[0][2] = crq->qsoNotBefore.day; dates[1][0] = crq->qsoNotAfter.year; dates[1][1] = crq->qsoNotAfter.month; dates[1][2] = crq->qsoNotAfter.day; } wxString label = _("Date of the first QSO you made or will make using this callsign:"); for (int i = 0; i < 2; i++) { sels[i][0] = sels[i][1] = sels[i][2] = 0; sizer->Add(new wxStaticText(this, -1, label), 0, wxBOTTOM, 5); hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(new wxStaticText(this, -1, wxT("Y")), 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 20); *(boxes[i][0].cb) = new tqslComboBox(this, boxes[i][0].id, wxT(""), wxDefaultPosition, wxSize(em_w*8, -1), 0, 0, wxCB_DROPDOWN/*|wxCB_READONLY*/); hsizer->Add(*(boxes[i][0].cb), 0, wxLEFT, 5); ACCESSIBLE(*(boxes[i][0].cb), ComboBoxAx); (*boxes[i][0].cb)->SetName(i ? wxT("QSO End Year") : wxT("QSO Begin Year")); hsizer->Add(new wxStaticText(this, -1, wxT("M")), 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 10); *(boxes[i][1].cb) = new tqslComboBox(this, boxes[i][1].id, wxT(""), wxDefaultPosition, wxSize(em_w*6, -1), 0, 0, wxCB_DROPDOWN/*|wxCB_READONLY*/); hsizer->Add(*(boxes[i][1].cb), 0, wxLEFT, 5); ACCESSIBLE(*(boxes[i][1].cb), ComboBoxAx); (*boxes[i][1].cb)->SetName(i ? wxT("QSO End Month") : wxT("QSO Begin Month")); hsizer->Add(new wxStaticText(this, -1, wxT("D")), 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 10); *(boxes[i][2].cb) = new tqslComboBox(this, boxes[i][2].id, wxT(""), wxDefaultPosition, wxSize(em_w*6, -1), 0, 0, wxCB_DROPDOWN/*|wxCB_READONLY*/); hsizer->Add(*(boxes[i][2].cb), 0, wxLEFT, 5); ACCESSIBLE(*(boxes[i][2].cb), ComboBoxAx); (*boxes[i][2].cb)->SetName(i ? wxT("QSO End Day of Month") : wxT("QSO Begin Day of Month")); // for end-date boxes, add a blank entry at the top if (i > 0) { for (int j = 0; j < 3; j++) (*(boxes[i][j].cb))->Append(wxT("")); } for (int j = year; j >= 1945; j--) { wxString s; s.Printf(wxT("%d"), j); if (crq && dates[i][0] == j) sels[i][0] = year - j + i; (*(boxes[i][0].cb))->Append(s); } for (int j = 1; j <= 12; j++) { wxString s; s.Printf(wxT("%d"), j); if (crq && dates[i][1] == j) sels[i][1] = j - 1 + i; (*(boxes[i][1].cb))->Append(s); } for (int j = 1; j <= 31; j++) { wxString s; s.Printf(wxT("%d"), j); if (crq && dates[i][2] == j) sels[i][2] = j - 1 + i; (*(boxes[i][2].cb))->Append(s); } sizer->Add(hsizer, 0, wxLEFT|wxRIGHT, 10); if (i == 0) sizer->Add(0, 40); label = _("Date of the last QSO you made or will make using this callsign:\n(Leave this date blank if this is still your valid callsign.)"); } if (crq) { tc_qsobeginy->SetSelection(sels[0][0]); tc_qsobeginm->SetSelection(sels[0][1]); tc_qsobegind->SetSelection(sels[0][2]); wxDateTime now = wxDateTime::Now(); wxDateTime qsoEnd(crq->qsoNotAfter.day, mons[crq->qsoNotAfter.month], crq->qsoNotAfter.year, 23, 59, 59); if (qsoEnd < now) { _parent->expired = true; // Looks like this is a cert for an expired call sign, // so keep the QSO end date as-is. Otherwise, leave it // blank so CA can fill it in. tc_qsoendy->SetSelection(sels[1][0]); tc_qsoendm->SetSelection(sels[1][1]); tc_qsoendd->SetSelection(sels[1][2]); } } tc_cs_status = new wxStaticText(this, -1, wxT(""), wxDefaultPosition, wxSize(_parent->maxWidth, em_h*4)); sizer->Add(tc_cs_status, 0, wxALL|wxEXPAND, 10); AdjustPage(sizer, wxT("crq0.htm")); initialized = true; } CRQ_Page * CRQ_CallsignPage::GetNext() const { tqslTrace("CRQ_CallsignPage::GetNext", NULL); if (_parent->cert) { // Renewal _parent->signIt = CRQ_SIGN_RENEWAL; reinterpret_cast(_parent->namePage)->Preset(reinterpret_cast(_parent->callsignPage)); return _parent->namePage; } if (_parent->dxcc == 0) { // NONE always requires signature _parent->signIt = CRQ_SIGN_NONE; return _parent->namePage; } if (_parent->onebyone) { // 1x1 always requires signature _parent->signIt = CRQ_SIGN_1X1; return _parent->namePage; } if (!_parent->validcerts) { // No certs, can't sign. _parent->signIt = CRQ_NOT_SIGNED; reinterpret_cast(_parent->namePage)->Preset(reinterpret_cast(_parent->callsignPage)); return _parent->namePage; } if (_parent->portable) { // Portable, no need to ask _parent->signIt = CRQ_SIGN_PORTABLE; reinterpret_cast(_parent->namePage)->Preset(reinterpret_cast(_parent->callsignPage)); return _parent->namePage; } return _parent->typePage; } CRQ_Page * CRQ_CallsignPage::GetPrev() const { tqslTrace("CRQ_CallsignPage::GetPrev", NULL); if (_parent->nprov > 1) return _parent->providerPage; return _parent->callsignPage; } void CRQ_CallsignPage::ShowHide() { showAll = tc_showall->GetValue(); validate(); } BEGIN_EVENT_TABLE(CRQ_NamePage, CRQ_Page) EVT_TEXT(ID_CRQ_NAME, CRQ_Page::check_valid) EVT_TEXT(ID_CRQ_ADDR1, CRQ_Page::check_valid) EVT_TEXT(ID_CRQ_CITY, CRQ_Page::check_valid) END_EVENT_TABLE() CRQ_NamePage::CRQ_NamePage(CRQWiz *parent, TQSL_CERT_REQ *crq) : CRQ_Page(parent) { tqslTrace("CRQ_NamePage::CRQ_NamePage", "parent=%lx, crq=%lx", reinterpret_cast(parent), reinterpret_cast(crq)); initialized = false; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); _parent = parent; wxStaticText *zst = new wxStaticText(this, -1, _("Zip/Postal")); wxSize sz = getTextSize(this); int em_w = sz.GetWidth(); int def_w = em_w * 20; wxStaticText *st = new wxStaticText(this, -1, _("Name"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE|wxALIGN_RIGHT); st->SetSize(zst->GetSize()); wxConfig *config = reinterpret_cast(wxConfig::Get()); wxString val; wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(st, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); wxString s; if (crq && crq->name[0]) s = wxString::FromUTF8(crq->name); else if (config->Read(wxT("Name"), &val)) s = val; tc_name = new wxTextCtrl(this, ID_CRQ_NAME, s, wxDefaultPosition, wxSize(def_w, -1)); ACCESSIBLE(tc_name, WindowAccessible); tc_name->SetName(wxT("Name")); hsizer->Add(tc_name, 1, 0, 0); sizer->Add(hsizer, 0, wxALL, 10); tc_name->SetMaxLength(TQSL_CRQ_NAME_MAX); s = wxT(""); if (crq && crq->address1[0]) s = wxString::FromUTF8(crq->address1); else if (config->Read(wxT("Addr1"), &val)) s = val; hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(new wxStaticText(this, -1, _("Address"), wxDefaultPosition, zst->GetSize(), wxST_NO_AUTORESIZE|wxALIGN_RIGHT), 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); tc_addr1 = new wxTextCtrl(this, ID_CRQ_ADDR1, s, wxDefaultPosition, wxSize(def_w, -1)); ACCESSIBLE(tc_addr1, WindowAccessible); tc_addr1->SetName(wxT("Address line 1")); hsizer->Add(tc_addr1, 1, 0, 0); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_addr1->SetMaxLength(TQSL_CRQ_ADDR_MAX); s = wxT(""); if (crq && crq->address2[0]) s = wxString::FromUTF8(crq->address2); else if (config->Read(wxT("Addr2"), &val)) s = val; hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(new wxStaticText(this, -1, wxT(""), wxDefaultPosition, zst->GetSize(), wxST_NO_AUTORESIZE|wxALIGN_RIGHT), 0, wxRIGHT, 5); tc_addr2 = new wxTextCtrl(this, ID_CRQ_ADDR2, s, wxDefaultPosition, wxSize(def_w, -1)); ACCESSIBLE(tc_addr2, WindowAccessible); tc_addr2->SetName(wxT("Address line 2")); hsizer->Add(tc_addr2, 1, 0, 0); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_addr2->SetMaxLength(TQSL_CRQ_ADDR_MAX); s = wxT(""); if (crq && crq->city[0]) s = wxString::FromUTF8(crq->city); else if (config->Read(wxT("City"), &val)) s = val; hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(new wxStaticText(this, -1, _("City"), wxDefaultPosition, zst->GetSize(), wxST_NO_AUTORESIZE|wxALIGN_RIGHT), 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); tc_city = new wxTextCtrl(this, ID_CRQ_CITY, s, wxDefaultPosition, wxSize(def_w, -1)); ACCESSIBLE(tc_city, WindowAccessible); tc_city->SetName(wxT("City")); hsizer->Add(tc_city, 1, 0, 0); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_city->SetMaxLength(TQSL_CRQ_CITY_MAX); s = wxT(""); if (crq && crq->state[0]) s = wxString::FromUTF8(crq->state); else if (config->Read(wxT("State"), &val)) s = val; hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(new wxStaticText(this, -1, _("State"), wxDefaultPosition, zst->GetSize(), wxST_NO_AUTORESIZE|wxALIGN_RIGHT), 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); tc_state = new wxTextCtrl(this, ID_CRQ_STATE, s, wxDefaultPosition, wxSize(def_w, -1)); ACCESSIBLE(tc_state, WindowAccessible); tc_state->SetName(wxT("State")); hsizer->Add(tc_state, 1, 0, 0); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_state->SetMaxLength(TQSL_CRQ_STATE_MAX); s = wxT(""); if (crq && crq->postalCode[0]) s = wxString::FromUTF8(crq->postalCode); else if (config->Read(wxT("ZIP"), &val)) s = val; hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(zst, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); tc_zip = new wxTextCtrl(this, ID_CRQ_ZIP, s, wxDefaultPosition, wxSize(def_w, -1)); hsizer->Add(tc_zip, 1, 0, 0); ACCESSIBLE(tc_zip, WindowAccessible); tc_zip->SetName(wxT("ZIP")); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_zip->SetMaxLength(TQSL_CRQ_POSTAL_MAX); s = wxT(""); if (crq && crq->country[0]) s = wxString::FromUTF8(crq->country); else if (config->Read(_("Country"), &val)) s = val; hsizer = new wxBoxSizer(wxHORIZONTAL); hsizer->Add(new wxStaticText(this, -1, _("Country"), wxDefaultPosition, zst->GetSize(), wxST_NO_AUTORESIZE|wxALIGN_RIGHT), 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); tc_country = new wxTextCtrl(this, ID_CRQ_COUNTRY, s, wxDefaultPosition, wxSize(def_w, -1)); ACCESSIBLE(tc_country, WindowAccessible); tc_country->SetName(wxT("Country")); hsizer->Add(tc_country, 1, 0, 0); sizer->Add(hsizer, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_country->SetMaxLength(TQSL_CRQ_COUNTRY_MAX); tc_addr_status = new wxStaticText(this, -1, wxT("")); sizer->Add(tc_addr_status, 0, wxALL|wxEXPAND, 10); AdjustPage(sizer, wxT("crq1.htm")); initialized = true; } void CRQ_NamePage::Preset(CRQ_CallsignPage *ip) { wxString s; string t; if (!_parent->networkError) { if (SaveAddressInfo(_parent->callsign.ToUTF8(), _parent->dxcc) < 0) { // Timeout, net error _parent->networkError = true; } } if (!_parent->name.IsEmpty()) { tc_name->SetValue(_parent->name); } else if (get_address_field(_parent->callsign.ToUTF8(), "name", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_name->SetValue(s); } if (!_parent->addr1.IsEmpty()) { tc_addr1->SetValue(_parent->addr1); } else if (get_address_field(_parent->callsign.ToUTF8(), "addr1", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_addr1->SetValue(s); } if (!_parent->addr2.IsEmpty()) { if (_parent->addr2 == wxT(".")) _parent->addr2 = wxT(""); tc_addr2->SetValue(_parent->addr2); } else if (get_address_field(_parent->callsign.ToUTF8(), "addr2", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_addr2->SetValue(s); } if (!_parent->city.IsEmpty()) { tc_city->SetValue(_parent->city); } else if (get_address_field(_parent->callsign.ToUTF8(), "city", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_city->SetValue(s); } if (!_parent->state.IsEmpty()) { tc_state->SetValue(_parent->state); } else if (get_address_field(_parent->callsign.ToUTF8(), "addrState", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_state->SetValue(s); } if (!_parent->zip.IsEmpty()) { tc_zip->SetValue(_parent->zip); } else if (get_address_field(_parent->callsign.ToUTF8(), "mailCode", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_zip->SetValue(s); } if (!_parent->country.IsEmpty()) { tc_country->SetValue(_parent->country); } else if (get_address_field(_parent->callsign.ToUTF8(), "aCountry", t) == 0) { s = wxString::FromUTF8(t.c_str()); tc_country->SetValue(s); } } CRQ_Page * CRQ_NamePage::GetNext() const { tqslTrace("CRQ_NamePage::GetNext", NULL); return _parent->emailPage; } CRQ_Page * CRQ_NamePage::GetPrev() const { tqslTrace("CRQ_NamePage::GetPrev", NULL); if ((_parent->dxcc == 0) || _parent->onebyone || _parent->portable) return _parent->callsignPage; if (_parent->validcerts) return _parent->typePage; return _parent->callsignPage; } BEGIN_EVENT_TABLE(CRQ_EmailPage, CRQ_Page) EVT_TEXT(ID_CRQ_EMAIL, CRQ_Page::check_valid) END_EVENT_TABLE() CRQ_EmailPage::CRQ_EmailPage(CRQWiz *parent, TQSL_CERT_REQ *crq) : CRQ_Page(parent) { tqslTrace("CRQ_EmailPage::CRQ_EmailPage", "parent=%lx, crq=%lx", reinterpret_cast(parent), reinterpret_cast(crq)); initialized = false; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); _parent = parent; wxSize sz = getTextSize(this); int em_w = sz.GetWidth(); wxStaticText *st = new wxStaticText(this, -1, _("Your e-mail address")); wxConfig *config = reinterpret_cast(wxConfig::Get()); wxString val; wxString s; if (crq && crq->emailAddress[0]) s = wxString::FromUTF8(crq->emailAddress); else if (config->Read(wxT("Email"), &val)) s = val; sizer->Add(st, 0, wxLEFT|wxRIGHT|wxTOP, 10); tc_email = new wxTextCtrl(this, ID_CRQ_EMAIL, s, wxDefaultPosition, wxSize(em_w*30, -1)); sizer->Add(tc_email, 0, wxLEFT|wxRIGHT|wxBOTTOM, 10); tc_email->SetMaxLength(TQSL_CRQ_EMAIL_MAX); ACCESSIBLE(tc_email, WindowAccessible); tc_email->SetName(wxT("e-mail")); wxStaticText *tc_warn = new wxStaticText(this, -1, _("Note: The e-mail address you provide here is the address to which the issued Certificate will be sent. Make sure it's the correct address!")); sizer->Add(tc_warn, 0, wxALL, 10); tc_warn->Wrap(_parent->maxWidth); tc_em_status = new wxStaticText(this, -1, wxT("")); sizer->Add(tc_em_status, 0, wxALL|wxEXPAND, 10); AdjustPage(sizer, wxT("crq2.htm")); initialized = true; } CRQ_Page * CRQ_EmailPage::GetNext() const { tqslTrace("CRQ_EmailPage::GetNext", NULL); if (_parent->CertPwd) { return _parent->pwPage; } else { if (_parent->ShouldBeSigned()) { return _parent->signPage; } else { return NULL; } } return NULL; } CRQ_Page * CRQ_EmailPage::GetPrev() const { tqslTrace("CRQ_EmailPage::GetPrev", NULL); return _parent->namePage; } BEGIN_EVENT_TABLE(CRQ_PasswordPage, CRQ_Page) EVT_TEXT(ID_CRQ_PW1, CRQ_Page::check_valid) EVT_TEXT(ID_CRQ_PW2, CRQ_Page::check_valid) END_EVENT_TABLE() CRQ_PasswordPage::CRQ_PasswordPage(CRQWiz *parent) : CRQ_Page(parent) { tqslTrace("CRQ_PasswordPage::CRQ_PasswordPage", "parent=%lx", reinterpret_cast(parent)); initialized = false; _parent = parent; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxSize sz = getTextSize(this); em_w = sz.GetWidth(); em_h = sz.GetHeight(); wxString lbl = _("You may protect this Callsign Certificate using a passphrase. If you are using a computer system that is shared with others, you should specify a passphrase to protect this Callsign Certificate. However, if you are using a computer in a private residence, no passphrase need be specified."); wxStaticText *st = new wxStaticText(this, -1, lbl); st->SetSize(_parent->maxWidth, em_h * 5); st->Wrap(_parent->maxWidth); sizer->Add(st, 0, wxLEFT|wxRIGHT|wxTOP, 10); fwdPrompt = new wxStaticText(this, -1, _("Leave the passphrase blank and click 'Next' unless you want to use a passphrase.")); fwdPrompt->SetSize(_parent->maxWidth, em_h * 5); fwdPrompt->Wrap(_parent->maxWidth); sizer->Add(fwdPrompt, 0, wxLEFT|wxRIGHT|wxTOP, 10); sizer->Add(new wxStaticText(this, -1, _("Passphrase:")), 0, wxLEFT|wxRIGHT|wxTOP, 10); tc_pw1 = new wxTextCtrl(this, ID_CRQ_PW1, wxT(""), wxDefaultPosition, wxSize(em_w*20, -1), wxTE_PASSWORD); tc_pw1->SetName(wxT("Passphrase")); ACCESSIBLE(tc_pw1, WindowAccessible); sizer->Add(tc_pw1, 0, wxLEFT|wxRIGHT, 10); sizer->Add(new wxStaticText(this, -1, _("Enter the passphrase again for verification:")), 0, wxLEFT|wxRIGHT|wxTOP, 10); tc_pw2 = new wxTextCtrl(this, ID_CRQ_PW2, wxT(""), wxDefaultPosition, wxSize(em_w*20, -1), wxTE_PASSWORD); ACCESSIBLE(tc_pw2, WindowAccessible); tc_pw2->SetName(wxT("Repeat the Passphrase")); sizer->Add(tc_pw2, 0, wxLEFT|wxRIGHT, 10); wxStaticText *tc_pwwarn = new wxStaticText(this, -1, _("DO NOT lose the passphrase you choose! You will be unable to use the Certificate without this passphrase!")); tc_pwwarn->Wrap(em_w * 40); sizer->Add(tc_pwwarn, 0, wxALL, 10); tc_pwd_status = new wxStaticText(this, -1, wxT("")); sizer->Add(tc_pwd_status, 0, wxALL|wxEXPAND, 10); AdjustPage(sizer, wxT("crq3.htm")); initialized = true; } CRQ_Page * CRQ_PasswordPage::GetNext() const { tqslTrace("CRQ_PasswordPage::GetNext", NULL); if (_parent->ShouldBeSigned()) { fwdPrompt->SetLabel(_("Leave the passphrase blank and click 'Next' unless you want to use a passphrase.")); fwdPrompt->SetSize(_parent->maxWidth, em_h * 5); fwdPrompt->Wrap(_parent->maxWidth); return _parent->signPage; } else { fwdPrompt->SetLabel(_("Leave the passphrase blank and click 'Finish' unless you want to use a passphrase.")); fwdPrompt->SetSize(_parent->maxWidth, em_h * 5); fwdPrompt->Wrap(_parent->maxWidth); return NULL; } } CRQ_Page * CRQ_PasswordPage::GetPrev() const { tqslTrace("CRQ_PasswordPage::GetPrev", NULL); return _parent->emailPage; } BEGIN_EVENT_TABLE(CRQ_TypePage, CRQ_Page) EVT_RADIOBOX(ID_CRQ_TYPE, CRQ_Page::check_valid) END_EVENT_TABLE() CRQ_TypePage::CRQ_TypePage(CRQWiz *parent) : CRQ_Page(parent) { tqslTrace("CRQ_TypePage::CRQ_TypePage", "parent=%lx", reinterpret_cast(parent)); initialized = false; _parent = parent; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxArrayString ch; for (unsigned int i = 0; i < sizeof callTypeChoices / sizeof callTypeChoices[0]; i++) { ch.Add(wxGetTranslation(callTypeChoices[i])); } certType = new wxRadioBox(this, ID_CRQ_TYPE, _("What is this Callsign Certificate for?"), wxDefaultPosition, wxDefaultSize, ch, 1, wxRA_SPECIFY_COLS); sizer->Add(certType, 0, wxALL|wxEXPAND, 10); } bool CRQ_TypePage::TransferDataFromWindow() { static int signThisType[] = { CRQ_SIGN_REPLACEMENT, // Replaces former call CRQ_SIGN_REPLACEMENT, // Is former call CRQ_SIGN_QSL_MGR, // QSL manager CRQ_SIGN_QSL_MGR, // Club CRQ_SIGN_QSL_MGR, // DXpedition CRQ_SIGN_SPC_EVENT, // Special event CRQ_SIGN_MAYBE, // None of the above 0 }; tqslTrace("CRQ_TypePage::TransferDataFromWindow", NULL); int selected = certType->GetSelection(); if (selected == wxNOT_FOUND || selected > static_cast(sizeof signThisType / sizeof signThisType[0])) return false; _parent->signIt = signThisType[selected]; _parent->certType = selected; if (_parent->dxcc == 0) _parent->signIt = CRQ_SIGN_NONE; return true; } CRQ_Page * CRQ_TypePage::GetPrev() const { tqslTrace("CRQ_TypePage::GetPrev", NULL); if (_parent->nprov > 1) return _parent->providerPage; else return _parent->callsignPage; } CRQ_Page * CRQ_TypePage::GetNext() const { tqslTrace("CRQ_TypePage::GetNext", NULL); return _parent->namePage; } BEGIN_EVENT_TABLE(CRQ_SignPage, CRQ_Page) EVT_TREE_SEL_CHANGED(ID_CRQ_CERT, CRQ_SignPage::CertSelChanged) EVT_RADIOBOX(ID_CRQ_SIGN, CRQ_Page::check_valid) EVT_WIZARD_PAGE_CHANGING(wxID_ANY, CRQ_SignPage::OnPageChanging) END_EVENT_TABLE() void CRQ_SignPage::CertSelChanged(wxTreeEvent& event) { tqslTrace("CRQ_SignPage::CertSelChanged", NULL); if (cert_tree->GetItemData(event.GetItem())) _parent->signIt = CRQ_SIGN_MAYBE; wxCommandEvent dummy; check_valid(dummy); } CRQ_SignPage::CRQ_SignPage(CRQWiz *parent, TQSL_CERT_REQ *crq) : CRQ_Page(parent) { tqslTrace("CRQ_SignPage::CRQ_SignPage", "parent=%lx", reinterpret_cast(parent)); initialized = false; wxSize sz = getTextSize(this); em_h = sz.GetHeight(); em_w = sz.GetWidth(); _parent = parent; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); introText = new wxStaticText(this, -1, wxT(""), wxDefaultPosition, wxSize(em_w * 50, em_h * 8)); sizer->Add(introText); introText->Wrap(_parent->maxWidth); tc_sign_status = new wxStaticText(this, -1, wxT(""), wxDefaultPosition, wxSize(_parent->maxWidth, em_h*3)); cert_tree = new CertTree(this, ID_CRQ_CERT, wxDefaultPosition, wxSize(em_w*30, em_h*8), wxTR_HAS_BUTTONS | wxSUNKEN_BORDER); sizer->Add(cert_tree, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND); cert_tree->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); ACCESSIBLE(cert_tree, TreeCtrlAx); sizer->Add(tc_sign_status, 0, wxALL|wxEXPAND, 10); // Default to 'signed' unless there's no valid certificates to use for signing. if (cert_tree->Build(0, &(_parent->provider)) > 0) { _parent->signIt = CRQ_NOT_SIGNED; cert_tree->Show(false); introContent = _("Since you have no Callsign Certificates, you must " "submit an 'Unsigned' certificate request. This will allow you to " "create your initial Callsign Certificate for LoTW use. " "Click 'Finish' to complete this Callsign Certificate request."); introText->SetLabel(introContent); } introText->Wrap(em_w * 50); AdjustPage(sizer, wxT("crq4.htm")); initialized = true; } void CRQ_SignPage::refresh() { tqslTrace("CRQ_SignPage::refresh", NULL); if (cert_tree->Build(0, &(_parent->provider)) > 0 || _parent->ShouldBeSigned()) { cert_tree->Show(true); if (_parent->MustBeSigned()) { wxString it(wxT("\n\n\n")); it += _("This Callsign Certificate request requires approval using an existing Callsign Certificate."); introText->SetLabel(it); } else { wxString introContent = wxString(_("Is this new certificate for a callsign where you already have a LoTW account, and you want the QSOs for this call to be added to an existing LoTW account? ")); introContent += wxT("\n\n"); introContent += _("If so, choose a callsign below for the primary LoTW account. If not, click 'Finish', and a new LoTW account will be set up for these QSOs."); introContent += wxT("\n\n"); introContent += _("CAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause issues with handling awards."); introText->SetLabel(introContent); } introText->Wrap(em_w * 50); } else { // No certificates _parent->signIt = CRQ_NOT_SIGNED; introText->SetLabel(introContent); introText->Wrap(_parent->maxWidth); } } CRQ_Page * CRQ_SignPage::GetPrev() const { tqslTrace("CRQ_SignPage::GetPrev", NULL); if (_parent->CertPwd) return _parent->pwPage; else return _parent->emailPage; } // Page validation bool CRQ_ProviderPage::TransferDataFromWindow() { // Nothing to validate return true; } static bool validCallSign(const string& call) { // Check for invalid characters if (call.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/") != string::npos) return false; // Need at least one letter if (call.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ") == string::npos) return false; // Need at least one number size_t num; if ((num = call.find_first_of("0123456789")) == string::npos) return false; // At least one letter after the number - catches "/KP4" for example if (call.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ", num) == string::npos) return false; return true; } static bool validPrefix(const string& prefix) { wxRegEx r; prefixMap::iterator it; for (it = prefixRegex.begin(); it != prefixRegex.end(); it++) { if (it->second.IsEmpty()) continue; wxString p = it->second + wxT("\\d*$"); if (r.Compile(p, wxRE_EXTENDED) && r.Matches(wxString::FromUTF8(prefix.c_str()))) { return true; } } return false; } const char * CRQ_CallsignPage::validate() { tqslTrace("CRQ_CallsignPage::validate", NULL); tQSL_Cert *certlist = 0; int ncert = 0; DXCC dx; bool dxok; wxRegEx r; wxString prefix; vector allowedDXCC; wxArrayString bits; wxString callsign; const char *dxccname = NULL; bool ok = true; if (!initialized) return 0; #ifdef DEBUG while (1) { std::ifstream lotsacalls("callsigns.txt"); string call; while(lotsacalls >> call) { _parent->callsign = call; #else _parent->callsign = tc_call->GetValue().MakeUpper(); #endif valMsg = wxT(""); if (tc_call->GetValue().Len() > TQSL_CALLSIGN_MAX) { valMsg = wxString::Format(_("The callsign is too long. Only %d characters are allowed."), TQSL_CALLSIGN_MAX); tc_cs_status->SetLabel(valMsg); tc_cs_status->Wrap(_parent->maxWidth); return 0; } // First check if there's a slash. If so, it's a portable. Use the base callsign _parent->portable = false; callsign = _parent->callsign; _parent->modifier = wxT(""); _parent->home_call = callsign; if (!callsign.IsEmpty()) { bits.Clear(); wxStringTokenizer callsplitter(_parent->callsign, wxT("/")); while (callsplitter.CountTokens() > 0) { wxString temp = callsplitter.GetNextToken(); if ((temp == wxT("F") || temp == wxT("I") || temp == wxT("M") || temp.size() >= 2) && (temp != wxT("MM") && temp != wxT("QRP"))) { bits.Add(temp); } } switch (bits.GetCount()) { case 0: // Single char or MM - nothing to see. break; case 1: _parent->home_call = bits[0]; _parent->modifier = wxT(""); break; case 2: _parent->home_call = bits[1]; // Assumes P5/W1AW _parent->modifier = bits[0]; break; default: // more than one slash, give up break; } } _parent->usa = false; // Assume not USA // Shuffle time. Is one of these a valid callsign? if (!_parent->modifier.IsEmpty()) { // Is this Home/mod or mod/home ? if (validCallSign(std::string(_parent->modifier.mb_str())) && validPrefix(std::string(_parent->home_call.mb_str()))) { _parent->modifier = bits[1]; // Flip them as it's P5/W1AW _parent->home_call = bits[0]; } _parent->portable = true; _parent->signIt = CRQ_SIGN_PORTABLE; if (isUSCallsign(_parent->modifier)) { _parent->usa = true; } } else { _parent->portable = false; if (isUSCallsign(_parent->home_call)) { _parent->usa = true; } } #ifdef DEBUG std::cout << "callsign " <<_parent->callsign << " prefix " << _parent->modifier << " base " << _parent->home_call; #endif int sel; _parent->onebyone = false; if (_parent->callsign.Len() < 3) ok = false; if (ok) { string call = string(_parent->callsign.ToUTF8()); // Check for invalid characters if (call.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/") != string::npos) ok = false; // Need at least one letter if (call.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ") == string::npos) ok = false; // Need at least one number if (call.find_first_of("0123456789") == string::npos) ok = false; // Invalid callsign patterns // Starting with 0, Q, (no longer: C7, or 4Y) // 1x other than 1A, 1M, 1S string first = call.substr(0, 1); string second = call.substr(1, 1); string third = call.substr(2, 1); if (first == "0" || first == "Q" || (first == "1" && second != "A" && second != "M" && second != "S")) ok = false; if (call.size() == 3 && (first == "W" || first == "K" || first == "N") && (second >= "0" && second <= "9") && (third != "X")) { _parent->onebyone = true; } } if (!ok) { valMsg = _("You must enter a valid call sign."); tc_dxcc->Clear(); goto notok; } #ifndef DEBUG sel = tc_dxcc->GetSelection(); if (sel >= 0) _parent->dxcc = (long)(tc_dxcc->GetClientData(sel)); tc_dxcc->Clear(); #endif int found; found = -1; prefix = _parent->home_call; if (!_parent->modifier.IsEmpty()) { prefix = _parent->modifier; } #ifdef DEBUG DXCC dx; #endif if (!showAll) { prefixMap::iterator it; for (it = prefixRegex.begin(); it != prefixRegex.end(); it++) { #ifndef DEBUG if (_parent->usa && isUSEntity(it->first)) { allowedDXCC.push_back(it->first); } else { #else { #endif if (it->second.IsEmpty()) continue; if (r.Compile(it->second, wxRE_EXTENDED) && r.Matches(prefix)) { #ifdef DEBUG dx.getByEntity(it->first); std::cout << " " << it->first << ":" << entityNames[it->first]; #endif allowedDXCC.push_back(it->first); } } } } #ifdef DEBUG std::cout << std::endl; } lotsacalls.close(); exit(0); } #else dxok = dx.getFirst(); while (dxok) { if (showAll || allowedDXCC.size() == 0 || dx.number() == 0) { wxString ename = entityNames[dx.number()]; if (ename.IsEmpty()) ename = wxString::FromUTF8(dx.name()); tc_dxcc->Append(ename, reinterpret_cast(dx.number())); if (sel >= 0 && dx.number() == _parent->dxcc) { found = tc_dxcc->GetCount() - 1; } dxok = dx.getNext(); continue; } for (size_t i = 0; i < allowedDXCC.size(); i++) { if (allowedDXCC[i] == dx.number()) { wxString ename = entityNames[dx.number()]; if (ename.IsEmpty()) ename = wxString::FromUTF8(dx.name()); tc_dxcc->Append(ename, reinterpret_cast(dx.number())); break; } } if (sel >= 0 && dx.number() == _parent->dxcc) { found = tc_dxcc->GetCount() - 1; } dxok = dx.getNext(); } if (found >= 0) { tc_dxcc->SetSelection(found); } else { tc_dxcc->SetSelection(1); } long old_dxcc; old_dxcc = _parent->dxcc; tQSL_Date oldStartDate; tQSL_Date oldEndDate; tQSL_Date startDate; tQSL_Date endDate; tqsl_getDXCCStartDate(old_dxcc, &oldStartDate); tqsl_getDXCCEndDate(old_dxcc, &oldEndDate); sel = tc_dxcc->GetSelection(); if (sel >= 0) _parent->dxcc = (long)(tc_dxcc->GetClientData(sel)); tqsl_getDXCCStartDate(_parent->dxcc, &startDate); tqsl_getDXCCEndDate(_parent->dxcc, &endDate); if (sel < 0 || _parent->dxcc < 0) { valMsg = _("You must select a DXCC entity."); goto notok; } if (_parent->dxcc != old_dxcc) { if (tqsl_isDateValid(&startDate) && !tqsl_isDateNull(&startDate) && tqsl_compareDates(&_parent->qsonotbefore, &oldStartDate) == 0) { tc_qsobeginy->SetSelection(startDate.year - 1945); tc_qsobeginm->SetSelection(startDate.month - 1); tc_qsobegind->SetSelection(startDate.day - 1); } if ((tqsl_isDateValid(&endDate) || tqsl_isDateNull(&endDate)) && tqsl_compareDates(&_parent->qsonotafter, &oldEndDate) == 0) { if (tqsl_isDateNull(&endDate)) { tc_qsoendy->SetSelection(0); tc_qsoendm->SetSelection(0); tc_qsoendd->SetSelection(0); } else { tc_qsoendy->SetSelection(endDate.year - 1944); tc_qsoendm->SetSelection(endDate.month); tc_qsoendd->SetSelection(endDate.day); } } } _parent->qsonotbefore.year = strtol(tc_qsobeginy->GetValue().ToUTF8(), NULL, 10); _parent->qsonotbefore.month = strtol(tc_qsobeginm->GetValue().ToUTF8(), NULL, 10); _parent->qsonotbefore.day = strtol(tc_qsobegind->GetValue().ToUTF8(), NULL, 10); _parent->qsonotafter.year = strtol(tc_qsoendy->GetValue().ToUTF8(), NULL, 10); _parent->qsonotafter.month = strtol(tc_qsoendm->GetValue().ToUTF8(), NULL, 10); _parent->qsonotafter.day = strtol(tc_qsoendd->GetValue().ToUTF8(), NULL, 10); if (!tqsl_isDateValid(&_parent->qsonotbefore)) { valMsg = _("QSO begin date: You must choose proper values for Year, Month and Day."); goto notok; } if (!tqsl_isDateNull(&_parent->qsonotafter) && !tqsl_isDateValid(&_parent->qsonotafter)) { valMsg = _("QSO end date: You must either choose proper values for Year, Month and Day or leave all three blank."); goto notok; } if (tqsl_isDateValid(&_parent->qsonotbefore) && tqsl_isDateValid(&_parent->qsonotafter) && tqsl_compareDates(&_parent->qsonotbefore, &_parent->qsonotafter) > 0) { valMsg = _("QSO end date cannot be before QSO begin date."); goto notok; } char startStr[50], endStr[50]; tqsl_convertDateToText(&endDate, endStr, sizeof endStr); if (tqsl_getDXCCEntityName(_parent->dxcc, &dxccname)) dxccname = "UNKNOWN"; if (!tqsl_isDateValid(&startDate)) { startDate.year = 1945; startDate.month = 11; startDate.day = 1; } tqsl_convertDateToText(&startDate, startStr, sizeof startStr); if (tqsl_isDateValid(&endDate) && tqsl_isDateNull(&_parent->qsonotafter)) { _parent->qsonotafter = endDate; if (tqsl_isDateNull(&endDate)) { tc_qsoendy->SetSelection(0); tc_qsoendm->SetSelection(0); tc_qsoendd->SetSelection(0); } else { tc_qsoendy->SetSelection(endDate.year - 1944); tc_qsoendm->SetSelection(endDate.month); tc_qsoendd->SetSelection(endDate.day); } } if (tqsl_isDateValid(&endDate)) { tqsl_convertDateToText(&endDate, endStr, sizeof endStr); } else { endStr[0] = '\0'; } if (tqsl_isDateValid(&startDate) && tqsl_compareDates(&_parent->qsonotbefore, &startDate) < 0) { valMsg = wxString::Format(_("The date of your first QSO is before the first valid date (%hs) of the selected DXCC Entity %hs"), startStr, dxccname); goto notok; } if (tqsl_isDateValid(&endDate) && tqsl_compareDates(&_parent->qsonotbefore, &endDate) > 0) { valMsg = wxString::Format(_("The date of your first QSO is after the last valid date (%hs) of the selected DXCC Entity %hs"), endStr, dxccname); goto notok; } if (tqsl_isDateValid(&startDate) && !tqsl_isDateNull(&_parent->qsonotafter) && tqsl_compareDates(&_parent->qsonotafter, &startDate) < 0) { valMsg = wxString::Format(_("The date of your last QSO is before the first valid date (%hs) of the selected DXCC Entity %hs"), startStr, dxccname); goto notok; } if (tqsl_isDateValid(&endDate) && tqsl_compareDates(&_parent->qsonotafter, &endDate) > 0) { valMsg = wxString::Format(_("The date of your last QSO is after the last valid date (%hs) of the selected DXCC Entity %hs"), endStr, dxccname); goto notok; } _parent->callsign.MakeUpper(); // Check for US 1x1 callsigns _parent->usa = false; for (int i = 0; USEntities[i] > 0; i++) { if (_parent->dxcc == USEntities[i]) { _parent->usa = true; break; } } if (!_parent->usa || _parent->callsign.Len() != 3 || FindFocus() == tc_call) { _parent->onebyone = false; } else { // 1x1 callsigns - must have W/K/N as the first character // a number as the second and letters A-Z *except* X as // the final character char first = _parent->callsign[0]; char second = _parent->callsign[1]; char third = _parent->callsign[2]; if (first != 'W' && first != 'K' && first != 'N') { valMsg = _("US 1x1 callsigns must start with W, K, or N"); goto notok; } if (second < '0' || second > '9') { valMsg = _("US 1x1 callsigns must have a number as the second character"); goto notok; } if (third < 'A' || third > 'Z' || third == 'X') { valMsg = _("US 1x1 callsigns must end in letters A-Z excluding 'X'"); goto notok; } } // Check for valid 1x1 callsign if (_parent->onebyone && !tqsl_isDateValid(&_parent->qsonotafter)) { valMsg = _("US 1x1 callsign requests must provide an end date"); goto notok; } // Are there any valid certificates for this DXCC entity? bool existsValidForEntity; existsValidForEntity = false; if (!tqsl_selectCertificates(NULL, &ncert, NULL, _parent->dxcc, 0, &(_parent->provider), 0)) { existsValidForEntity = (ncert > 0); } // Data looks okay, now let's make sure this isn't a duplicate request // (unless it's a renewal). if (tqsl_selectCertificates(&certlist, &ncert, _parent->callsign.ToUTF8(), _parent->dxcc, 0, &(_parent->provider), 0)) { ncert = 0; } if (!_parent->renewal && ncert > 0) { // New request, have cert for this callsign char cert_before_buf[40], cert_after_buf[40]; for (int i = 0; i < ncert; i++) { // See if this cert overlaps the user-specified date range tQSL_Date cert_not_before, cert_not_after; int cert_dxcc = 0; tqsl_getCertificateQSONotBeforeDate(certlist[i], &cert_not_before); tqsl_getCertificateQSONotAfterDate(certlist[i], &cert_not_after); tqsl_getCertificateDXCCEntity(certlist[i], &cert_dxcc); if (cert_dxcc == _parent->dxcc && ((tqsl_isDateValid(&_parent->qsonotafter) && !(tqsl_compareDates(&_parent->qsonotbefore, &cert_not_after) == 1 || tqsl_compareDates(&_parent->qsonotafter, &cert_not_before) == -1)) || (!tqsl_isDateValid(&_parent->qsonotafter) && !(tqsl_compareDates(&_parent->qsonotbefore, &cert_not_after) == 1)))) { ok = false; // Overlap! tqsl_convertDateToText(&cert_not_before, cert_before_buf, sizeof cert_before_buf); tqsl_convertDateToText(&cert_not_after, cert_after_buf, sizeof cert_after_buf); } } tqsl_freeCertificateList(certlist, ncert); if (ok == false) { DXCC dxcc; dxcc.getByEntity(_parent->dxcc); // TRANSLATORS: first argument is callsign (%s), second is the related DXCC entity name (%hs) valMsg = wxString::Format(_("You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: "), _parent->callsign.c_str(), dxcc.name()); // TRANSLATORS: here "to" separates two dates in a date range valMsg += wxString::FromUTF8(cert_before_buf) + _(" to ") + wxString::FromUTF8(cert_after_buf); } } { wxString pending = wxConfig::Get()->Read(wxT("RequestPending")); wxStringTokenizer tkz(pending, wxT(",")); while (tkz.HasMoreTokens()) { wxString pend = tkz.GetNextToken(); if (pend == _parent->callsign) { wxString fmt = _("You have already requested a Callsign Certificate for %s and can not request another until that request has been processed by LoTW Staff."); fmt += wxT("\n\n"); fmt += _("Please wait until you receive an e-mail bearing your requested Callsign Certificate."); fmt += wxT("\n\n"); fmt += _("If you are sure that the earlier request is now invalid you should delete the pending Callsign Certificate for %s."); valMsg = wxString::Format(fmt, _parent->callsign.c_str(), _parent->callsign.c_str()); goto notok; } } } { wxString requestRecord = wxConfig::Get()->Read(wxT("RequestRecord")); wxString requestList; wxStringTokenizer rectkz(requestRecord, wxT(",")); time_t now = time(NULL); time_t yesterday = now - 24 * 60 * 60; // 24 hours ago int numRequests = 0; while (rectkz.HasMoreTokens()) { wxString rec = rectkz.GetNextToken(); char csign[512]; time_t rectime; strncpy(csign, rec.ToUTF8(), sizeof csign); char *s = csign; while (*s != ':' && *s != '\0') s++; *s = '\0'; rectime = strtol(++s, NULL, 10); if (rectime < yesterday) continue; // More than 24 hours old if (strcmp(csign, _parent->callsign.ToUTF8()) == 0) { // Same call numRequests++; } if (!requestList.IsEmpty()) { requestList = requestList + wxT(","); } requestList = requestList + wxString::Format(wxT("%hs:%Lu"), csign, rectime); } wxConfig::Get()->Write(wxT("RequestRecord"), requestList); wxConfig::Get()->Flush(); if (numRequests > 3) { wxString fmt = _("You have already requested more than three Callsign Certificates for %s in the past 24 hours. You should submit a request only once, then wait for that request to be processed by LoTW Staff. This may take several business days."); fmt += wxT("\n\n"); fmt += _("Please wait until you receive an e-mail bearing your requested Callsign Certificate."); fmt += wxT("\n\n"); valMsg = wxString::Format(fmt, _parent->callsign.c_str(), _parent->callsign.c_str()); } if (!_parent->renewal && existsValidForEntity) { _parent->signIt = CRQ_SIGN_REPLACEMENT; } } #endif // DEBUG notok: tc_cs_status->SetLabel(valMsg); tc_cs_status->Wrap(_parent->maxWidth); return 0; } bool CRQ_CallsignPage::TransferDataFromWindow() { tqslTrace("CRQ_CallsignPage::TransferDataFromWindow", NULL); bool ok; validate(); bool hasEndDate = (!tqsl_isDateNull(&_parent->qsonotafter) && tqsl_isDateValid(&_parent->qsonotafter)); bool notInULS = false; _parent->signIt = CRQ_SIGN_MAYBE; _parent->goodULSData = false; // Is this in the ULS? if (valMsg.IsEmpty() && _parent->usa && !_parent->onebyone && isUSCallsign(_parent->callsign)) { wxString name, attn, addr1, city, state, zip; int stat; if (_parent->networkError) { stat = 3; // reflect network error } else { stat = GetULSInfo(_parent->callsign.ToUTF8(), name, attn, addr1, city, state, zip); } // handle portable/home and home/portable if (stat == 2 && _parent->portable && !_parent->networkError) { stat = GetULSInfo(_parent->modifier.ToUTF8(), name, attn, addr1, city, state, zip); } int stat2 = 0; switch (stat) { case 0: _parent->validusa = true; // Good data returned if (name == wxT("null")) name = wxT(""); _parent->name = name; _parent->namePage->setName(name); if (addr1 == wxT("null")) addr1 = _parent->addr1; if (attn == wxT("null")) { attn = wxT(""); _parent->addr1 = addr1; _parent->addr2 = wxT(""); _parent->namePage->setAddr1(addr1); _parent->namePage->setAddr2(attn); } else { _parent->addr1 = attn; _parent->addr2 = addr1; _parent->namePage->setAddr1(attn); _parent->namePage->setAddr2(addr1); } if (city == wxT("null")) city = _parent->city; _parent->city = city; _parent->namePage->setCity(city); if (state == wxT("null")) state = _parent->state; _parent->state = state; _parent->namePage->setState(state); if (zip == wxT("null")) zip = _parent->zip; _parent->zip = zip; _parent->namePage->setZip(zip); _parent->country = wxT("USA"); _parent->namePage->setCountry(_parent->country); if (!_parent->name.IsEmpty() && !_parent->addr1.IsEmpty() && !_parent->city.IsEmpty()) { _parent->goodULSData = true; } break; case 1: break; // Error reading ULS info case 2: stat2 = GetULSInfo("W1AW", name, attn, addr1, city, state, zip); if (stat2 == 2) // Also nothing for a good call break; if (hasEndDate) { // Allow former calls if (!_parent->validcerts) { valMsg = _("You cannot request a Callsign Certificate for a former callsign unless you hold a valid Callsign Certificate to be used to verify that request."); } notInULS = true; break; } valMsg = wxString::Format(_("The callsign %s is not currently registered in the FCC ULS database.\nIf this is a newly registered call, you must wait at least one business day for it to be valid. Please enter a currently valid callsign."), _parent->callsign.c_str()); break; case 3: _parent->networkError = true; // Error reading break; } } // Is this potentially CEPT ? if (valMsg.IsEmpty() && _parent->usa && !_parent->modifier.IsEmpty() && !isUSCallsign(_parent->modifier)) { wxMessageBox(_("If you are using a US callsign outside of the US persuant to CEPT, IARP or other Reciprocity arrangements, FCC rules require you to be a US Citizen."), _("Warning"), wxOK | wxICON_WARNING, this); } if (valMsg.IsEmpty()) { // If this call has a slash, then it may be a portable call from // outside the US. We really can't tell at this point so just // let it go. if (!_parent->modifier.IsEmpty()) { _parent->signIt = CRQ_SIGN_PORTABLE; } ok = true; } else { wxMessageBox(valMsg, _("Error"), wxOK | wxICON_ERROR, this); ok = false; } if (ok && _parent->dxcc == 0) { if (!_parent->validcerts) { wxString msg = _("You cannot select DXCC Entity NONE as you must sign any request for entity NONE and you have no valid Callsign Certificates that you can use to sign this request."); wxMessageBox(msg, _("TQSL Error"), wxOK | wxICON_ERROR, this); return false; } _parent->signIt = CRQ_SIGN_NONE; wxString msg = _("You have selected DXCC Entity NONE"); msg += wxT("\n\n"); msg += _("QSO records signed using the Certificate will not be valid for DXCC award credit (but will be valid for other applicable awards). If the Certificate is to be used for signing QSOs from maritime/marine mobile, shipboard, or air mobile operations, that is the correct selection. Otherwise, you probably should use the \"Back\" button to return to the DXCC page after clicking \"OK\""); wxMessageBox(msg, _("TQSL Warning"), wxOK | wxICON_WARNING, this); } if (ok && _parent->onebyone) { if (!_parent->validcerts) { wxString msg = _("You cannot request a certificate for a 1x1 callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request."); wxMessageBox(msg, _("TQSL Error"), wxOK | wxICON_ERROR, this); return false; } _parent->signIt = CRQ_SIGN_1X1; } if (ok && _parent->signIt == CRQ_SIGN_PORTABLE) { if (!_parent->validcerts) { wxString msg = _("You cannot request a certificate for a portable callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request."); wxMessageBox(msg, _("TQSL Error"), wxOK | wxICON_ERROR, this); return false; } } if (ok && hasEndDate && !notInULS && !_parent->onebyone) { // If it has an end date and it's a current call wxString msg = _("You have chosen a QSO end date for this Callsign Certificate. The 'QSO end date' should ONLY be set if that date is the date when that callsign's license expired or the license was replaced by a new callsign."); msg += wxT("\n\n"); msg += _("If you set an end date, you will not be able to sign QSOs past that date, even if the Callsign Certificate itself is still valid."); msg += wxT("\n\n"); msg += _("If you still hold this callsign (or if you plan to renew the license for the callsign), you should not set a 'QSO end date'."); msg += wxT("\n"); msg += _("Do you really want to keep this 'QSO end date'?"); if (wxMessageBox(msg, _("Warning"), wxYES_NO|wxICON_EXCLAMATION, this) == wxNO) { tc_qsoendy->SetSelection(0); tc_qsoendm->SetSelection(0); tc_qsoendd->SetSelection(0); return false; } } _parent->callsign = tc_call->GetValue(); _parent->callsign.MakeUpper(); tc_call->SetValue(_parent->callsign); return ok; } static bool cleanString(wxString &str) { str.Trim(); str.Trim(FALSE); return str.IsEmpty(); } const char * CRQ_NamePage::validate() { tqslTrace("CRQ_NamePage::validate", NULL); if (!initialized) return 0; valMsg = wxT(""); _parent->name = tc_name->GetValue(); _parent->addr1 = tc_addr1->GetValue(); _parent->city = tc_city->GetValue(); if (cleanString(_parent->name)) { valMsg = _("You must enter your name"); } else if (cleanString(_parent->addr1)) { valMsg = _("You must enter your address"); } else if (cleanString(_parent->city)) { valMsg = _("You must enter your city"); } tc_addr_status->SetLabel(valMsg); if (!valMsg.IsEmpty()) { tc_name->Enable(true); tc_addr1->Enable(true); tc_addr2->Enable(true); tc_city->Enable(true); tc_state->Enable(true); tc_zip->Enable(true); tc_country->Enable(true); return 0; } // // If this is not a renewal, and it's in the USA, and there's no certs to sign it with, // and we got a valid ULS address, then this is an initial certificate and must match the FCC database. Say so. // if (_parent->goodULSData && !_parent->renewal && _parent->validusa && !_parent->validcerts) { tc_addr_status->SetLabel(_("This address must match the FCC ULS database.\nIf this address information is incorrect, please correct your FCC record.")); tc_name->Enable(false); tc_addr1->Enable(false); tc_addr2->Enable(false); tc_city->Enable(false); tc_state->Enable(false); tc_zip->Enable(false); tc_country->Enable(false); } return 0; } bool CRQ_NamePage::TransferDataFromWindow() { tqslTrace("CRQ_NamePage::TransferDataFromWindow", NULL); _parent->name = tc_name->GetValue(); _parent->addr1 = tc_addr1->GetValue(); _parent->addr2 = tc_addr2->GetValue(); _parent->city = tc_city->GetValue(); _parent->state = tc_state->GetValue(); _parent->zip = tc_zip->GetValue(); _parent->country = tc_country->GetValue(); bool ok; validate(); if (valMsg.IsEmpty()) { ok = true; } else { wxMessageBox(valMsg, _("Error"), wxOK | wxICON_ERROR, this); ok = false; } cleanString(_parent->name); cleanString(_parent->addr1); cleanString(_parent->addr2); cleanString(_parent->city); cleanString(_parent->state); cleanString(_parent->zip); cleanString(_parent->country); tc_name->SetValue(_parent->name); tc_addr1->SetValue(_parent->addr1); tc_addr2->SetValue(_parent->addr2); tc_city->SetValue(_parent->city); tc_state->SetValue(_parent->state); tc_zip->SetValue(_parent->zip); tc_country->SetValue(_parent->country); wxConfig *config = reinterpret_cast(wxConfig::Get()); config->Write(wxT("Name"), _parent->name); config->Write(wxT("Addr1"), _parent->addr1); config->Write(wxT("Addr2"), _parent->addr2); config->Write(wxT("City"), _parent->city); config->Write(wxT("State"), _parent->state); config->Write(wxT("ZIP"), _parent->zip); config->Write(wxT("Country"), _parent->country); return ok; } const char * CRQ_EmailPage::validate() { tqslTrace("CRQ_EmailPage::validate()", NULL); if (!initialized) return 0; valMsg = wxT(""); _parent->email = tc_email->GetValue(); cleanString(_parent->email); int i = _parent->email.First('@'); int j = _parent->email.Last('.'); if (i < 1 || j < i+2 || j == static_cast(_parent->email.length())-1) valMsg = _("You must enter a valid email address"); tc_em_status->SetLabel(valMsg); return 0; } bool CRQ_EmailPage::TransferDataFromWindow() { tqslTrace("CRQ_EmailPage::TransferDataFromWindow", NULL); bool ok; validate(); if (valMsg.IsEmpty()) { ok = true; } else { wxMessageBox(valMsg, _("Error"), wxOK | wxICON_ERROR, this); ok = false; } _parent->email = tc_email->GetValue(); cleanString(_parent->email); wxConfig *config = reinterpret_cast(wxConfig::Get()); config->Write(wxT("Email"), _parent->email); return ok; } const char * CRQ_PasswordPage::validate() { tqslTrace("CRQ_PasswordPage::validate", NULL); if (!initialized) return 0; valMsg = wxT(""); wxString pw1 = tc_pw1->GetValue(); wxString pw2 = tc_pw2->GetValue(); if (pw1 != pw2) valMsg = _("The two copies of the passphrase do not match."); tc_pwd_status->SetLabel(valMsg); return 0; } bool CRQ_PasswordPage::TransferDataFromWindow() { tqslTrace("CRQ_PasswordPage::TransferDataFromWindow", NULL); bool ok; validate(); if (valMsg.IsEmpty()) { ok = true; } else { wxMessageBox(valMsg, _("Error"), wxOK | wxICON_ERROR, this); ok = false; } _parent->password = tc_pw1->GetValue(); return ok; } void CRQ_SignPage::OnPageChanging(wxWizardEvent& ev) { tqslTrace("CRQ_SignPage::OnPageChanging", "Direction=", ev.GetDirection()); validate(); if (!valMsg.IsEmpty() && ev.GetDirection()) { ev.Veto(); wxMessageBox(valMsg, _("TQSL Error"), wxOK | wxICON_ERROR, this); } } const char * CRQ_SignPage::validate() { tqslTrace("CRQ_SignPage::validate", NULL); bool error = false; if (!initialized) return 0; valMsg = wxT(""); wxString nextprompt = _("Click 'Finish' to complete this Callsign Certificate request."); bool doSigned = _parent->ShouldBeSigned(); cert_tree->Show(doSigned); if (!_parent->MustBeSigned()) { nextprompt = _("Please select a Callsign Certificate for the account where you would like the QSOs to be stored"); } else { if (_parent->signIt == CRQ_SIGN_REPLACEMENT) { valMsg = _("Please select the Callsign Certificate for your current personal callsign to validate your request."); } else { valMsg = _("Please select a Callsign Certificate to validate this request"); } if (!cert_tree->GetSelection().IsOk() || cert_tree->GetItemData(cert_tree->GetSelection()) == NULL) { error = true; if (_parent->signIt == CRQ_SIGN_REPLACEMENT) { valMsg = _("Please select the Callsign Certificate for your current personal callsign to validate your request."); } else { valMsg = _("Please select a Callsign Certificate to validate this request"); } } else { char callsign[512]; tQSL_Cert cert = cert_tree->GetItemData(cert_tree->GetSelection())->getCert(); if (0 == tqsl_getCertificateCallSign(cert, callsign, sizeof callsign)) { wxString fmt = wxT("\n\n"); fmt += _("QSOs for %hs will be stored in the LoTW account for %s."); nextprompt+=wxString::Format(fmt, _parent->callsign.c_str(), callsign); } } } tc_sign_status->SetLabel(error ? valMsg : nextprompt); tc_sign_status->Wrap(_parent->maxWidth); return 0; } bool CRQ_SignPage::TransferDataFromWindow() { tqslTrace("CRQ_SignPage::TransferDataFromWindow", NULL); validate(); _parent->cert = 0; CertTreeItemData *data = reinterpret_cast(cert_tree->GetItemData(cert_tree->GetSelection())); if (data) _parent->cert = data->getCert(); return true; } tqsl-2.8.1/apps/crqwiz.h0000644000175000017500000001616415003421124015136 0ustar rmurphyrmurphy/*************************************************************************** crqwiz.h - description ------------------- begin : Sat Jun 15 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __crqwiz_h #define __crqwiz_h #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include #include #include #include #include "extwizard.h" #include "certtree.h" #ifndef ADIF_BOOLEAN #define ADIF_BOOLEAN // Hack! #endif #include "tqsllib.h" using std::vector; class CRQ_Page; class CRQ_NamePage; enum { CRQ_NOT_SIGNED = 0, // Not signing at all CRQ_SIGN_MAYBE = 1, // Not forcing signature CRQ_SIGN_PORTABLE = 2, // Portable call, must sign CRQ_SIGN_REPLACEMENT = 3, // Replacement or former call CRQ_SIGN_QSL_MGR = 4, // QSL manager, Club, DXpedition CRQ_SIGN_1X1 = 5, // US 1x1 CRQ_SIGN_SPC_EVENT = 6, // Special event CRQ_SIGN_NONE = 7, // Entity NONE CRQ_SIGN_RENEWAL = 8 // Renewing }; class CRQWiz : public ExtWizard { public: CRQWiz(TQSL_CERT_REQ *crq, tQSL_Cert cert, wxWindow* parent, wxHtmlHelpController *help = 0, const wxString& title = _("Request a new Callsign Certificate")); CRQ_Page *GetCurrentPage() { return reinterpret_cast(wxWizard::GetCurrentPage()); } #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Woverloaded-virtual" #endif bool RunWizard(); #ifdef __clang__ #pragma clang diagnostic pop #endif bool ShouldBeSigned(void); // Should this be signed? bool MustBeSigned(void); // Should this be signed? bool validcerts; // True if there are valid certificates int nprov; // Number of providers int signIt; // Should this be signed? Why? bool CertPwd; // Should we prompt for a password? wxCoord maxWidth; // Width of longest string tQSL_Cert _cert; bool renewal; // True if this is a renewal // ProviderPage data CRQ_Page *providerPage; TQSL_PROVIDER provider; // CallsignPage data CRQ_Page *callsignPage; wxString callsign; wxString home_call; wxString modifier; tQSL_Date qsonotbefore, qsonotafter; bool usa; // Set true when a US entity bool validusa; // Set true when currently valid int dxcc; bool onebyone; // US 1x1 callsign // NamePage data CRQ_NamePage *namePage; wxString name, addr1, addr2, city, state, zip, country; // EmailPage data CRQ_Page *emailPage; wxString email; // PasswordPage data CRQ_Page *pwPage; wxString password; // TypePage data CRQ_Page *typePage; int certType; // SignPage data CRQ_Page *signPage; tQSL_Cert cert; TQSL_CERT_REQ *_crq; bool portable; // Portable call int forceSigning; // Whether or not to force signing bool replacementCall; // Replacement for existing callsign. Require signing bool networkError; // Got a network error - timeout, etc. bool goodULSData; // Got ULS info and it's complete bool expired; // Set true if the request has an end-date in the past private: CRQ_Page *_first; }; class CRQ_Page : public ExtWizard_Page { public: explicit CRQ_Page(CRQWiz* parent = NULL) : ExtWizard_Page(parent) {valMsg = wxT("");} CRQWiz *Parent() { return reinterpret_cast(_parent); } wxString valMsg; }; class CRQ_ProviderPage : public CRQ_Page { public: explicit CRQ_ProviderPage(CRQWiz *parent, TQSL_CERT_REQ *crq = 0); virtual bool TransferDataFromWindow(); private: void DoUpdateInfo(); void UpdateInfo(wxCommandEvent&); vector providers; tqslComboBox *tc_provider; wxStaticText *tc_provider_info; DECLARE_EVENT_TABLE() }; class CRQ_CallsignPage : public CRQ_Page { public: explicit CRQ_CallsignPage(CRQWiz *parent, TQSL_CERT_REQ *crq = 0); virtual bool TransferDataFromWindow(); virtual const char *validate(); virtual CRQ_Page *GetPrev() const; virtual CRQ_Page *GetNext() const; void OnShowHide(wxCommandEvent&) { ShowHide(); } void ShowHide(); wxCheckBox *tc_showall; bool showAll; // Set true to show all private: wxTextCtrl *tc_call; tqslComboBox *tc_qsobeginy, *tc_qsobeginm, *tc_qsobegind, *tc_dxcc;; tqslComboBox *tc_qsoendy, *tc_qsoendm, *tc_qsoendd; wxStaticText *tc_cs_status; bool initialized; // Set true when validating makes sense CRQWiz *_parent; DECLARE_EVENT_TABLE() }; class CRQ_NamePage : public CRQ_Page { public: explicit CRQ_NamePage(CRQWiz *parent, TQSL_CERT_REQ *crq = 0); virtual bool TransferDataFromWindow(); virtual const char *validate(); virtual CRQ_Page *GetPrev() const; virtual CRQ_Page *GetNext() const; void Preset(CRQ_CallsignPage *ip); void setName(wxString &s) { tc_name->SetValue(s);} void setAddr1(wxString &s) { tc_addr1->SetValue(s);} void setAddr2(wxString &s) { tc_addr2->SetValue(s);} void setCity(wxString &s) { tc_city->SetValue(s);} void setState(wxString &s) { tc_state->SetValue(s);} void setZip(wxString &s) { tc_zip->SetValue(s);} void setCountry(wxString &s) { tc_country->SetValue(s);} private: wxTextCtrl *tc_name, *tc_addr1, *tc_addr2, *tc_city, *tc_state, *tc_zip, *tc_country; wxStaticText *tc_addr_status; bool initialized; CRQWiz *_parent; DECLARE_EVENT_TABLE() }; class CRQ_EmailPage : public CRQ_Page { public: explicit CRQ_EmailPage(CRQWiz *parent, TQSL_CERT_REQ *crq = 0); virtual bool TransferDataFromWindow(); virtual const char *validate(); virtual CRQ_Page *GetPrev() const; virtual CRQ_Page *GetNext() const; private: CRQWiz *_parent; wxTextCtrl *tc_email; wxStaticText *tc_em_status; bool initialized; DECLARE_EVENT_TABLE() }; class CRQ_PasswordPage : public CRQ_Page { public: explicit CRQ_PasswordPage(CRQWiz *parent); virtual bool TransferDataFromWindow(); virtual const char *validate(); virtual CRQ_Page *GetPrev() const; virtual CRQ_Page *GetNext() const; private: wxTextCtrl *tc_pw1, *tc_pw2; wxStaticText *tc_pwd_status; bool initialized; CRQWiz *_parent; wxStaticText *fwdPrompt; int em_w; int em_h; DECLARE_EVENT_TABLE() }; class CRQ_TypePage : public CRQ_Page { public: explicit CRQ_TypePage(CRQWiz *parent); virtual bool TransferDataFromWindow(); virtual CRQ_Page *GetPrev() const; virtual CRQ_Page *GetNext() const; // TypePage data private: bool initialized; wxRadioBox *certType; CRQWiz *_parent; DECLARE_EVENT_TABLE() }; class CRQ_SignPage : public CRQ_Page { public: explicit CRQ_SignPage(CRQWiz *parent, TQSL_CERT_REQ *crq = 0); virtual bool TransferDataFromWindow(); void CertSelChanged(wxTreeEvent&); virtual const char *validate(); virtual void refresh(); virtual CRQ_Page *GetPrev() const; private: CertTree *cert_tree; wxStaticText *tc_sign_status; bool initialized; int em_w; int em_h; void OnPageChanging(wxWizardEvent &); CRQWiz *_parent; wxStaticText* introText; wxString introContent; DECLARE_EVENT_TABLE() }; inline bool CRQWiz::RunWizard() { return wxWizard::RunWizard(_first); } struct prefixlist { int entity; const char *regex; }; #endif // __crqwiz_h tqsl-2.8.1/apps/delete.xpm0000644000175000017500000002673415003421124015442 0ustar rmurphyrmurphy/* XPM */ static const char * delete_xpm[] = { "48 48 430 2", " c None", ". c #C64D4D", "+ c #B00E0E", "@ c #AF0F0F", "# c #CE6262", "$ c #AC0D0D", "% c #DFA7A7", "& c #B22C2C", "* c #AF0000", "= c #AF2020", "- c #ECC2C2", "; c #AE1B1B", "> c #AC0000", ", c #AC0101", "' c #E5A38E", ") c #B11512", "! c #B00E0B", "~ c #EFBEAA", "{ c #AC0808", "] c #AB0000", "^ c #DC7E68", "/ c #FDB5B4", "( c #F3BAAD", "_ c #AE0604", ": c #F0AE9C", "< c #FDBCBB", "[ c #DE8470", "} c #A90000", "| c #D9765E", "1 c #F89592", "2 c #FC8383", "3 c #FD9F9F", "4 c #F2B8AA", "5 c #AC0604", "6 c #EFAB9A", "7 c #FC9292", "8 c #FBB2B0", "9 c #DC836D", "0 c #A70000", "a c #D56C53", "b c #F48B87", "c c #F47B7B", "d c #F99B9B", "e c #F1B5A4", "f c #AA0604", "g c #A60000", "h c #A40000", "i c #EEA997", "j c #F78F8E", "k c #F9B0AD", "l c #DB816B", "m c #A50000", "n c #D06043", "o c #EF807B", "p c #ED7474", "q c #F49695", "r c #EFB1A0", "s c #A80604", "t c #A20000", "u c #9B0000", "v c #A00000", "w c #A70604", "x c #EDA894", "y c #F28989", "z c #F7ADAA", "A c #D97E69", "B c #A30000", "C c #BD361F", "D c #EC7B70", "E c #E66D6D", "F c #EF9190", "G c #EDAD9A", "H c #A30603", "I c #970000", "J c #8C0000", "K c #8F0000", "L c #9C0603", "M c #EAA48F", "N c #ED8684", "O c #FBCDCB", "P c #BA331B", "Q c #A10000", "R c #A40704", "S c #DD7650", "T c #E26A67", "U c #DF6565", "V c #E98B89", "W c #EAA894", "X c #960603", "Y c #8A0000", "Z c #8B0000", "` c #810000", " . c #790000", ".. c #860603", "+. c #E6A189", "@. c #E7817F", "#. c #F19F9D", "$. c #EEB4A3", "%. c #9F0000", "&. c #A20604", "*. c #DD744F", "=. c #DC6461", "-. c #D85D5D", ";. c #E48582", ">. c #E5A38C", ",. c #830603", "'. c #7A0000", "). c #7B0000", "!. c #760000", "~. c #6B0000", "{. c #710603", "]. c #E09D84", "^. c #E07D7A", "/. c #E88B88", "(. c #ECAD9A", "_. c #9D0000", ":. c #A00604", "<. c #DB734D", "[. c #D85D59", "}. c #D35656", "|. c #DE7D7A", "1. c #DF9D84", "2. c #720603", "3. c #660000", "4. c #610000", "5. c #640603", "6. c #DA997E", "7. c #DA7774", "8. c #D25656", "9. c #E07672", "0. c #EAA58E", "a. c #9A0000", "b. c #9E0604", "c. c #DA724A", "d. c #D45853", "e. c #CF4E4E", "f. c #CE4E4E", "g. c #CC4E4E", "h. c #D67773", "i. c #DA967A", "j. c #670603", "k. c #630603", "l. c #D59376", "m. c #D2736F", "n. c #CB4E4E", "o. c #D76460", "p. c #E5997D", "q. c #990000", "r. c #9C0604", "s. c #DA7149", "t. c #D1514C", "u. c #CB4646", "v. c #CA4646", "w. c #C64646", "x. c #D06F6B", "y. c #D68F70", "z. c #D48D6D", "A. c #CD6D68", "B. c #C54646", "C. c #D2544F", "D. c #DF8665", "E. c #9A0603", "F. c #D97047", "G. c #CF4A44", "H. c #C93E3E", "I. c #C73E3E", "J. c #C23E3E", "K. c #CC6560", "L. c #CB6460", "M. c #C13E3E", "N. c #C63E3E", "O. c #C83E3E", "P. c #D05455", "Q. c #E99D9B", "R. c #E3967A", "S. c #950000", "T. c #980603", "U. c #D86F45", "V. c #CD453E", "W. c #C73737", "X. c #C63737", "Y. c #C43737", "Z. c #C13737", "`. c #C73B3B", " + c #DC797A", ".+ c #E49B9C", "++ c #DC908C", "@+ c #D67A50", "#+ c #920000", "$+ c #930000", "%+ c #D76E43", "&+ c #CB3E37", "*+ c #C53030", "=+ c #C43030", "-+ c #C53232", ";+ c #D25858", ">+ c #E18B8B", ",+ c #DD8B8C", "'+ c #BE4040", ")+ c #AF170C", "!+ c #D16B39", "~+ c #900000", "{+ c #910000", "]+ c #940603", "^+ c #D76D41", "/+ c #CB3931", "(+ c #C93A3A", "_+ c #C73839", ":+ c #C32C2C", "<+ c #BE2121", "[+ c #C33434", "}+ c #CA4F4F", "|+ c #CF6666", "1+ c #C75152", "2+ c #AD0606", "3+ c #B5170D", "4+ c #D26A3B", "5+ c #920603", "6+ c #D77B53", "7+ c #BE1F19", "8+ c #B20000", "9+ c #B9120A", "0+ c #D26C3E", "a+ c #920604", "b+ c #8E0000", "c+ c #8D0000", "d+ c #900604", "e+ c #BF120A", "f+ c #B80000", "g+ c #BF120B", "h+ c #D26D41", "i+ c #8E0604", "j+ c #D36D41", "k+ c #C5170E", "l+ c #BE0000", "m+ c #BD0000", "n+ c #C5180F", "o+ c #D36F43", "p+ c #890000", "q+ c #8C0604", "r+ c #D46F44", "s+ c #CA180F", "t+ c #C40000", "u+ c #C30000", "v+ c #C20000", "w+ c #C10000", "x+ c #CA1810", "y+ c #D47047", "z+ c #870000", "A+ c #8A0604", "B+ c #D01810", "C+ c #CB0000", "D+ c #CA0000", "E+ c #C70000", "F+ c #C50000", "G+ c #C80000", "H+ c #D4714B", "I+ c #860000", "J+ c #850000", "K+ c #880604", "L+ c #D5724B", "M+ c #D51810", "N+ c #D00000", "O+ c #CE0000", "P+ c #CC130D", "Q+ c #CD130D", "R+ c #D51811", "S+ c #D5734E", "T+ c #880605", "U+ c #840000", "V+ c #830000", "W+ c #870605", "X+ c #D6744D", "Y+ c #DB1811", "Z+ c #D60000", "`+ c #D50000", " @ c #D20000", ".@ c #D41912", "+@ c #B17350", "@@ c #B27452", "#@ c #D30000", "$@ c #DB1912", "%@ c #D6795A", "&@ c #870706", "*@ c #820000", "=@ c #850705", "-@ c #D67755", ";@ c #E01912", ">@ c #DC0000", ",@ c #DB0000", "'@ c #D90000", ")@ c #DA1913", "!@ c #B5775A", "~@ c #130605", "{@ c #B6785C", "]@ c #DB1A14", "^@ c #DA0000", "/@ c #E01A15", "(@ c #D67C65", "_@ c #850706", ":@ c #D87B5F", "<@ c #E61A14", "[@ c #E30000", "}@ c #E10000", "|@ c #E11A15", "1@ c #B97B64", "2@ c #1F0606", "3@ c #230000", "4@ c #210000", "5@ c #1E0606", "6@ c #BB7C68", "7@ c #E21B16", "8@ c #E61B17", "9@ c #D88270", "0@ c #7F0D09", "a@ c #EC1B16", "b@ c #E90000", "c@ c #E80000", "d@ c #E81B17", "e@ c #BE7F6E", "f@ c #250606", "g@ c #340000", "h@ c #500000", "i@ c #510000", "j@ c #300000", "k@ c #C08171", "l@ c #E81C18", "m@ c #EC1C19", "n@ c #D98576", "o@ c #850707", "p@ c #820303", "q@ c #A03E3E", "r@ c #7E110C", "s@ c #7B2D21", "t@ c #831E16", "u@ c #DA8473", "v@ c #F11C18", "w@ c #EF0000", "x@ c #EE0000", "y@ c #EE1C18", "z@ c #C48273", "A@ c #2B0606", "B@ c #360000", "C@ c #5A0000", "D@ c #580000", "E@ c #320000", "F@ c #2D0606", "G@ c #C68376", "H@ c #EE1C19", "I@ c #F11C19", "J@ c #DB897C", "K@ c #A54949", "L@ c #AD5959", "M@ c #8F1F1F", "N@ c #7F120D", "O@ c #A25E4F", "P@ c #F2675C", "Q@ c #F50000", "R@ c #F41C19", "S@ c #CA8577", "T@ c #350706", "U@ c #380000", "V@ c #590000", "W@ c #350000", "X@ c #370706", "Y@ c #CC857A", "Z@ c #F41C1A", "`@ c #F46B63", " # c #B96963", ".# c #9D3939", "+# c #8B1515", "@# c #7C251B", "## c #7F0F0B", "$# c #BD5E55", "%# c #F1534B", "&# c #CE867B", "*# c #400807", "=# c #3C0000", "-# c #3A0000", ";# c #440807", "># c #D0877D", ",# c #F51D1A", "'# c #F1544E", ")# c #BD6058", "!# c #891111", "~# c #8C1616", "{# c #BD5F58", "]# c #F1544D", "^# c #D3877E", "/# c #4E0807", "(# c #420000", "_# c #520807", ":# c #D4887E", "<# c #F51D1B", "[# c #D5887E", "}# c #5B0807", "|# c #4B0000", "1# c #5C0000", "2# c #5B0000", "3# c #600807", "4# c #D7887E", "5# c #F26A63", "6# c #D8897F", "7# c #680807", "8# c #550000", "9# c #600000", "0# c #5F0000", "a# c #6D0807", "b# c #D9897F", "c# c #F36C65", "d# c #7F0E0A", "e# c #A0594E", "f# c #741612", "g# c #650000", "h# c #821211", "i# c #E48681", "j# c #8B0B0B", "k# c #793426", "l# c #77251C", "m# c #70130E", "n# c #6C0000", "o# c #6E0000", "p# c #A12B2B", "q# c #E26868", "r# c #AA2B2B", "s# c #7C2319", "t# c #7C1811", "u# c #790908", "v# c #9D2323", "w# c #C84C4C", " ", " ", " ", " ", " ", " ", " . + @ # ", " $ % & * * = - ; ", " > , ' ) > > > > ! ~ { > ", " ] ] ^ / ( _ ] ] ] ] _ : < [ ] ] ", " } } | 1 2 3 4 5 } } } } 5 6 7 2 8 9 } } ", " 0 0 a b c c c d e f 0 g h 0 f i j c c c k l 0 0 ", " m m n o p p p p p q r s h t u v w x y p p p p p z A m m ", " t B C D E E E E E E E F G H u I J K L M N E E E E E E E O P B t ", " Q Q R S T U U U U U U U V W X Y Z ` ...+.@.U U U U U U U #.$.R Q Q ", " %.%.&.*.=.-.-.-.-.-.-.-.;.>.,.'.).!.~.{.].^.-.-.-.-.-.-.-./.(.&.%.%. ", " _._.:.<.[.}.}.}.}.}.}.}.|.1.2.3.4.5.6.7.8.}.}.}.}.}.}.9.0.:._._. ", " a.u b.c.d.e.e.e.e.e.f.g.h.i.j.k.l.m.n.f.e.e.e.e.e.o.p.b.u a. ", " a.q.r.s.t.u.u.u.u.u.v.w.x.y.z.A.B.v.u.u.u.u.u.C.D.r.q.a. ", " I I E.F.G.H.H.H.H.H.I.J.K.L.M.N.O.H.H.H.P.Q.R.E.I I ", " S.S.T.U.V.W.W.W.W.X.Y.Z.Z.Y.X.W.`. +.+++@+T.S.S. ", " #+$+X %+&+*+*+*+*+*+=+=+-+;+>+,+'+)+!+X $+#+ ", " ~+{+]+^+/+(+_+:+<+[+}+|+1+2+] 3+4+]+{+~+ ", " K K 5+6+7+8+8+8+8+8+8+8+8+9+0+a+K K ", " b+c+d+0+e+f+f+f+f+f+f+f+f+g+h+d+c+b+ ", " Z Z i+j+k+l+l+l+l+m+m+l+l+l+l+n+o+i+Z Z ", " p+p+q+r+s+t+t+t+u+v+w+w+u+t+t+t+t+x+y+q+p+p+ ", " z+z+A+y+B+C+C+C+D+D+E+F+F+G+D+C+C+C+C+B+H+A+z+z+ ", " I+J+K+L+M+N+N+N+N+N+O+C+P+Q+C+O+N+N+N+N+N+R+S+T+J+I+ ", " U+V+W+X+Y+Z+Z+Z+Z+Z+`+ @.@+@@@.@#@`+Z+Z+Z+Z+Z+$@%@&@V+U+ ", " *@` =@-@;@>@>@>@>@>@,@'@)@!@~@~@{@]@^@,@>@>@>@>@>@/@(@_@` *@ ", " *@` _@:@<@[@[@[@[@[@[@}@|@1@2@3@4@5@6@7@}@[@[@[@[@[@[@8@9@_@` *@ ", " 0@` _@A a@b@b@b@b@b@b@c@d@e@f@g@h@i@j@f@k@l@c@b@b@b@b@b@b@m@n@o@p@q@ ", " r@s@t@u@v@w@w@w@w@w@w@x@y@z@A@B@C@ D@E@F@G@H@x@w@w@w@w@w@w@I@J@K@L@M@ ", " N@s@O@P@Q@Q@Q@Q@Q@Q@Q@R@S@T@U@V@ D@W@X@Y@Z@Q@Q@Q@Q@Q@Q@Q@`@ #.#+# ", " @###$#%#Q@Q@Q@Q@Q@Z@&#*#=#C@ D@-#;#>#,#Q@Q@Q@Q@Q@'#)#!#~# ", " ` ` {#]#Q@Q@Q@,#^#/#(#C@ V@(#_#:#<#Q@Q@Q@'#)#` ` ", " ` ` )#'#Q@<#[#}#|#1# 2#|#3#4#<#Q@'#)#` ` ", " ` ` )#5#6#7#8#9# 0#D@a#b#c#)#` ` ", " ` d#e#f#4.g# 3.g#h#i#j#` ", " k#l#m#n# o#p#q#r# ", " s#t#u# v#w# ", " ", " ", " ", " ", " ", " "}; tqsl-2.8.1/apps/delete_dis.xpm0000644000175000017500000001666015003421124016276 0ustar rmurphyrmurphy/* XPM */ static const char * delete_dis_xpm[] = { "48 48 171 2", " c None", ". c #898989", "+ c #5F5F5F", "@ c #989898", "# c #5C5C5C", "$ c #C3C3C3", "% c #6F6F6F", "& c #575757", "* c #676767", "= c #D7D7D7", "- c #646464", "; c #565656", "> c #B9B9B9", ", c #616161", "' c #5D5D5D", ") c #CCCCCC", "! c #5A5A5A", "~ c #555555", "{ c #A2A2A2", "] c #D8D8D8", "^ c #D0D0D0", "/ c #595959", "( c #C6C6C6", "_ c #DCDCDC", ": c #A7A7A7", "< c #545454", "[ c #9B9B9B", "} c #C5C5C5", "| c #BFBFBF", "1 c #CECECE", "2 c #585858", "3 c #C4C4C4", "4 c #C7C7C7", "5 c #D5D5D5", "6 c #A4A4A4", "7 c #535353", "8 c #949494", "9 c #BDBDBD", "0 c #B7B7B7", "a c #CACACA", "b c #525252", "c c #C2C2C2", "d c #D3D3D3", "e c #A3A3A3", "f c #B5B5B5", "g c #B0B0B0", "h c #515151", "i c #4D4D4D", "j c #505050", "k c #C0C0C0", "l c #A1A1A1", "m c #6E6E6E", "n c #AEAEAE", "o c #A9A9A9", "p c #4B4B4B", "q c #464646", "r c #474747", "s c #4F4F4F", "t c #BCBCBC", "u c #B8B8B8", "v c #E3E3E3", "w c #6A6A6A", "x c #969696", "y c #4C4C4C", "z c #454545", "A c #404040", "B c #3C3C3C", "C c #444444", "D c #B3B3B3", "E c #C8C8C8", "F c #9E9E9E", "G c #9A9A9A", "H c #434343", "I c #3D3D3D", "J c #3B3B3B", "K c #353535", "L c #3A3A3A", "M c #B2B2B2", "N c #ADADAD", "O c #4E4E4E", "P c #ACACAC", "Q c #B1B1B1", "R c #333333", "S c #303030", "T c #929292", "U c #939393", "V c #8E8E8E", "W c #8D8D8D", "X c #AAAAAA", "Y c #A5A5A5", "Z c #A0A0A0", "` c #8C8C8C", " . c #919191", ".. c #888888", "+. c #868686", "@. c #9D9D9D", "#. c #858585", "$. c #909090", "%. c #838383", "&. c #828282", "*. c #808080", "=. c #959595", "-. c #7F7F7F", ";. c #4A4A4A", ">. c #7E7E7E", ",. c #7D7D7D", "'. c #7C7C7C", "). c #818181", "!. c #B4B4B4", "~. c #494949", "{. c #7A7A7A", "]. c #7B7B7B", "^. c #B6B6B6", "/. c #484848", "(. c #777777", "_. c #6B6B6B", ":. c #656565", "<. c #8A8A8A", "[. c #696969", "}. c #5E5E5E", "|. c #8B8B8B", "1. c #6C6C6C", "2. c #626262", "3. c #606060", "4. c #6D6D6D", "5. c #707070", "6. c #636363", "7. c #8F8F8F", "8. c #424242", "9. c #727272", "0. c #686868", "a. c #737373", "b. c #414141", "c. c #767676", "d. c #797979", "e. c #878787", "f. c #0C0C0C", "g. c #717171", "h. c #121212", "i. c #111111", "j. c #101010", "k. c #747474", "l. c #151515", "m. c #1A1A1A", "n. c #282828", "o. c #181818", "p. c #A6A6A6", "q. c #848484", "r. c #1B1B1B", "s. c #2D2D2D", "t. c #2C2C2C", "u. c #191919", "v. c #ABABAB", "w. c #787878", "x. c #1D1D1D", "y. c #1C1C1C", "z. c #1E1E1E", "A. c #232323", "B. c #252525", "C. c #9F9F9F", "D. c #A8A8A8", "E. c #2A2A2A", "F. c #212121", "G. c #313131", "H. c #2E2E2E", "I. c #373737", "J. c #2F2F2F", "K. c #323232", "L. c #3F3F3F", "M. c #363636", "N. c #666666", " ", " ", " ", " ", " ", " ", " . + + @ ", " # $ % & & * = - ", " ; ; > , ; ; ; ; ' ) ! ; ", " ~ ~ { ] ^ / ~ ~ ~ ~ / ( _ : ~ ~ ", " < < [ } | 1 1 2 < < < < 2 3 4 | 5 6 < < ", " 7 7 8 9 0 0 0 a a & 7 7 b 7 & c c 0 0 0 d e 7 7 ", " b b . f g g g g g 3 4 ; b h i j ~ k 9 g g g g g ^ l b b ", " h h m n o o o o o o o | $ 7 i p q r s t u o o o o o o o v w h h ", " j j < x 6 { { { { { { { > | y z z A B C 0 D { { { { { { { 4 E < j j ", " s s 7 x F G G G G G G G D u H I I J K L M N G G G G G G G u $ 7 s s ", " O O b 8 @ 8 8 8 8 8 8 8 P Q L R S R P : 8 8 8 8 8 8 8 o t b O O ", " i i h T U V V V V V V W 6 X K R Y Z ` V V V V V V [ Q h i i ", " i y j .V ............+.@.e Z G #.............$.{ j y i ", " p p O $.. %.%.%.%.%.&.*.x =.-.&.%.%.%.%.T c n O p p ", " ;.;.i V #.-.-.-.-.>.,.'.'.,.>.-.).X | !.U i ;.;. ", " ~.~.y W ).{.{.{.{.{.{.{.].=.^.!.-.' #.y ~.~. ", " /./.p ` >.).-.(.% ].` G ` / ~ , +.p /./. ", " r r ;.=._./ / / / / / / / , ..p r r ", " r q ;...- # # # # # # # # :.. ;.q r ", " z z ~.<.[.+ + + + }.}.+ + + + w |.~.z z ", " C C /.` 1.2.2.2., , 3.3., 2.2.2.2.4.W /.C C ", " H H r W 5.:.:.:.:.:.6.2.2.- :.:.:.:.:.5.7.r H H ", " H 8.q $.9.0.0.0.0.0.* :.1.4.:.* 0.0.0.0.0.a. .q 8.H ", " 8.b.q .c._._._._._.w [.a.*.&.a.[.w _._._._._.c.@ q b.8. ", " b.A z =.d.m m m m m 4.1.c.e.f.f.. (.4.4.m m m m m {.@.z A b. ", " b.A z [ ,.g.g.g.g.g.g.5.].V h.i.j.h. .'.5.g.g.g.g.g.g.>.6 z A b. ", " C A z l ).k.k.k.k.k.k.k.-.x l.m.n.n.o.l.@ *.k.k.k.k.k.k.k.&.: q 8.% ", " z O y p.q.(.(.(.(.(.(.(.%.[ o.r.s. t.u.u.F %.(.(.(.(.(.(.(.#.v.(.%.& ", " q O w.: {.{.{.{.{.{.{.+.Z x.y.t. t.m.z.e e.{.{.{.{.{.{.{.v.V _.j ", " p z . F {.{.{.{.{.e.6 A.z.s. t.x.B.p.e.{.{.{.{.{.C.<.i h ", " A A <.C.{.{.{.e.D.E.F.s. t.F.t.o ..{.{.{.C.<.A A ", " A A <.C.{...o G.B.H. s.B.R X ..{.C.<.A A ", " A A <.X v.I.E.S J.t.L P P <.A A ", " A C (.H S K. R K.~.M p A ", " s ~.L.M. I.N.Y w ", " ;.q A 3.<. ", " ", " ", " ", " ", " ", " "}; tqsl-2.8.1/apps/download.xpm0000644000175000017500000004155615003421124016006 0ustar rmurphyrmurphy/* XPM */ static const char * download_xpm[] = { "48 48 775 2", " c None", ". c #BD3030", "+ c #D76363", "@ c #C03A3A", "# c #D86C6C", "$ c #D66666", "% c #D25A5A", "& c #CF5252", "* c #CD4B4B", "= c #9C0000", "- c #C13E3E", "; c #D86969", "> c #D06060", ", c #D86565", "' c #DB5B5B", ") c #CE4E4E", "! c #CC4848", "~ c #CB4646", "{ c #C74444", "] c #C54141", "^ c #C23D3D", "/ c #BF3939", "( c #BD3535", "_ c #BA3131", ": c #B82D2D", "< c #B72C2C", "[ c #930000", "} c #9B0000", "| c #BE3232", "1 c #D65B5B", "2 c #D35050", "3 c #AF4C4C", "4 c #803838", "5 c #C75E5E", "6 c #DA6F6F", "7 c #D35959", "8 c #CF4C4C", "9 c #CC4444", "0 c #C63D3D", "a c #C23838", "b c #C03535", "c c #BD3131", "d c #B92E2E", "e c #B72D2D", "f c #B52D2D", "g c #B42D2D", "h c #B52E2E", "i c #B62E2E", "j c #B62F2F", "k c #B52F2F", "l c #B32E2E", "m c #B12D2D", "n c #820000", "o c #BD2B2B", "p c #D24F4F", "q c #DA4E4E", "r c #823232", "s c #000101", "t c #BB5E5E", "u c #DE7F7F", "v c #D56666", "w c #D45858", "x c #D54E4E", "y c #D64646", "z c #D54040", "A c #D63E3E", "B c #D43D3D", "C c #D23B3B", "D c #CF3939", "E c #CB3737", "F c #C63535", "G c #C23333", "H c #BE3131", "I c #BA2E2E", "J c #B62828", "K c #B32222", "L c #B01F1F", "M c #AE1C1C", "N c #AC1B1B", "O c #AB1C1C", "P c #AB2020", "Q c #A92323", "R c #A92525", "S c #7F0000", "T c #9A0000", "U c #BC2929", "V c #D14C4C", "W c #D94E4E", "X c #833030", "Y c #020000", "Z c #BA5959", "` c #DB7575", " . c #D35F5F", ".. c #D35555", "+. c #D44C4C", "@. c #D54545", "#. c #D54141", "$. c #D74040", "%. c #D84141", "&. c #D94141", "*. c #D64141", "=. c #D44040", "-. c #D03F3F", ";. c #CC3C3C", ">. c #C73737", ",. c #C23232", "'. c #BB2B2B", "). c #B52525", "!. c #AE2020", "~. c #A10B0B", "{. c #9D0000", "]. c #6F0000", "^. c #810000", "/. c #D14D4D", "(. c #D95050", "_. c #843232", ":. c #030000", "<. c #B95555", "[. c #D35D5D", "}. c #D35454", "|. c #D34B4B", "1. c #D44545", "2. c #D64040", "3. c #D24040", "4. c #D04040", "5. c #CF4141", "6. c #CD4242", "7. c #CB4242", "8. c #C94343", "9. c #C64848", "0. c #AD1F1F", "a. c #6D0000", "b. c #D04949", "c. c #D43F3F", "d. c #7F2222", "e. c #B85252", "f. c #D96D6D", "g. c #D35353", "h. c #D74141", "i. c #CE4040", "j. c #CC4040", "k. c #C94040", "l. c #C74040", "m. c #C54040", "n. c #C34242", "o. c #A71E1E", "p. c #6E0400", "q. c #920000", "r. c #B71717", "s. c #C52525", "t. c #CC2020", "u. c #7B1313", "v. c #B85050", "w. c #D96C6C", "x. c #D25C5C", "y. c #D25151", "z. c #D03C3C", "A. c #D13A3A", "B. c #D43B3B", "C. c #D53C3C", "D. c #D83F3F", "E. c #D84040", "F. c #D84242", "G. c #D74242", "H. c #D54343", "I. c #D34343", "J. c #D04444", "K. c #CE4343", "L. c #CB4343", "M. c #C64444", "N. c #C44646", "O. c #A71F1F", "P. c #7B3102", "Q. c #7D0000", "R. c #B51010", "S. c #C41F1F", "T. c #CC2121", "U. c #7C1414", "V. c #B84F4F", "W. c #D96A6A", "X. c #D25B5B", "Y. c #C63838", "Z. c #B82B2B", "`. c #B92929", " + c #B82828", ".+ c #B82626", "++ c #B82525", "@+ c #B82424", "#+ c #B82323", "$+ c #B92222", "%+ c #B92323", "&+ c #BA2525", "*+ c #BA2727", "=+ c #BA2929", "-+ c #BB2E2E", ";+ c #BC3131", ">+ c #BA2C2C", ",+ c #B82222", "'+ c #B61B1B", ")+ c #A21313", "!+ c #9B0101", "~+ c #A8CE10", "{+ c #9C9D12", "]+ c #7F0700", "^+ c #910000", "/+ c #C42020", "(+ c #7B1414", "_+ c #D25959", ":+ c #D35151", "<+ c #C93939", "[+ c #C02D2D", "}+ c #C12C2C", "|+ c #C02B2B", "1+ c #BF2A2A", "2+ c #BE2929", "3+ c #BE2A2A", "4+ c #B92828", "5+ c #B31919", "6+ c #AC0707", "7+ c #A50000", "8+ c #A20000", "9+ c #9E0000", "0+ c #A80000", "a+ c #AD0000", "b+ c #A00C0C", "c+ c #A6C60E", "d+ c #B0D822", "e+ c #997B0B", "f+ c #8E0000", "g+ c #B74D4D", "h+ c #D86868", "i+ c #D25858", "j+ c #BF2F2F", "k+ c #BF2E2E", "l+ c #BD2E2E", "m+ c #BD2D2D", "n+ c #B91E1E", "o+ c #B40C0C", "p+ c #B10707", "q+ c #AF0707", "r+ c #AC0404", "s+ c #A90202", "t+ c #A70202", "u+ c #A40000", "v+ c #A00000", "w+ c #AA0000", "x+ c #AE0000", "y+ c #A00D0D", "z+ c #8FA914", "A+ c #93AE14", "B+ c #98B312", "C+ c #A2C110", "D+ c #A6C50E", "E+ c #A8C715", "F+ c #ADCB21", "G+ c #ACD41E", "H+ c #995406", "I+ c #980000", "J+ c #CB2020", "K+ c #D76767", "L+ c #D25757", "M+ c #D34E4E", "N+ c #C63737", "O+ c #BA2D2D", "P+ c #BA2B2B", "Q+ c #B61D1D", "R+ c #B31313", "S+ c #B21313", "T+ c #B10D0D", "U+ c #AF0909", "V+ c #AE0808", "W+ c #AC0606", "X+ c #AA0505", "Y+ c #A80303", "Z+ c #A50202", "`+ c #A20101", " @ c #9F0000", ".@ c #A90000", "+@ c #99B70E", "@@ c #95AB26", "#@ c #9DB624", "$@ c #A3BF23", "%@ c #A8C421", "&@ c #ACC920", "*@ c #ADCA20", "=@ c #ACCA20", "-@ c #ACCA1F", ";@ c #ACCC20", ">@ c #A5C51C", ",@ c #983002", "'@ c #B5050F", ")@ c #C31F1F", "!@ c #CB1F1F", "~@ c #7A1313", "{@ c #B74C4C", "]@ c #D76565", "^@ c #D15656", "/@ c #D34949", "(@ c #D03131", "_@ c #CB1414", ":@ c #C80101", "<@ c #C60000", "[@ c #C50000", "}@ c #C40000", "|@ c #C20000", "1@ c #BE0000", "2@ c #BB0000", "3@ c #B70000", "4@ c #B30000", "5@ c #AF0000", "6@ c #A60000", "7@ c #A30000", "8@ c #AB0000", "9@ c #A00E0E", "0@ c #98B60E", "a@ c #94AA25", "b@ c #9CB523", "c@ c #A2BD22", "d@ c #A8C420", "e@ c #ACC91F", "f@ c #A8CA24", "g@ c #9BAA18", "h@ c #B22310", "i@ c #C4171E", "j@ c #7A1212", "k@ c #B64A4A", "l@ c #D76666", "m@ c #CE3D3D", "n@ c #C71616", "o@ c #C70000", "p@ c #CA0000", "q@ c #CB0000", "r@ c #C80000", "s@ c #C30000", "t@ c #C00000", "u@ c #B80000", "v@ c #B40000", "w@ c #B00000", "x@ c #AC0000", "y@ c #A20707", "z@ c #ACCA21", "A@ c #ABC91D", "B@ c #AAC91A", "C@ c #A9C716", "D@ c #A2BF15", "E@ c #95BC13", "F@ c #988B0F", "G@ c #BF1C1B", "H@ c #CC1B1E", "I@ c #D55E5E", "J@ c #C72E2E", "K@ c #C10D0D", "L@ c #C20202", "M@ c #C90000", "N@ c #C10000", "O@ c #BF0000", "P@ c #BC0000", "Q@ c #B50000", "R@ c #B20000", "S@ c #9DB625", "T@ c #A7C31E", "U@ c #A9C718", "V@ c #A8C713", "W@ c #A6C60F", "X@ c #A4C50A", "Y@ c #A4C508", "Z@ c #A3C406", "`@ c #A2C305", " # c #9CBC06", ".# c #92AF08", "+# c #84AB09", "@# c #9A6C11", "## c #CD161E", "$# c #7B1112", "%# c #040000", "&# c #B13939", "*# c #C82E2E", "=# c #C01515", "-# c #C20E0E", ";# c #C30505", "># c #97B50D", ",# c #90A81E", "'# c #95B015", ")# c #9AB70E", "!# c #9EBE08", "~# c #A2C404", "{# c #A3C405", "]# c #A2C306", "^# c #9DBC08", "/# c #93B009", "(# c #87A20A", "_# c #799C0B", ":# c #AA4F15", "<# c #7E0A12", "[# c #AB2222", "}# c #C62626", "|# c #C01818", "1# c #C20C0C", "2# c #C30404", "3# c #B10000", "4# c #96B40A", "5# c #88A10D", "6# c #8FAB09", "7# c #97B508", "8# c #9EBE06", "9# c #88A20A", "0# c #7A940C", "a# c #73820D", "b# c #5E280C", "c# c #070000", "d# c #AC2322", "e# c #C01616", "f# c #C20B0B", "g# c #C30303", "h# c #BD0000", "i# c #98B50E", "j# c #8DA619", "k# c #95AF14", "l# c #9AB80F", "m# c #9FBE0A", "n# c #A2C307", "o# c #7C940C", "p# c #687D0C", "q# c #415408", "r# c #160B01", "s# c #AA1F22", "t# c #C52424", "u# c #C1100F", "v# c #C10808", "w# c #C30202", "x# c #9AB714", "y# c #94AC28", "z# c #9BB423", "A# c #A0BB1C", "B# c #A4C115", "C# c #A5C50F", "D# c #A4C509", "E# c #687B0C", "F# c #47580B", "G# c #282203", "H# c #A81C20", "I# c #C32223", "J# c #B62C2C", "K# c #BD0E0E", "L# c #C30101", "M# c #BA0000", "N# c #9EB91B", "O# c #9EB33A", "P# c #A3BA34", "Q# c #A7C02C", "R# c #A9C523", "S# c #AAC81A", "T# c #A7C712", "U# c #697D0D", "V# c #415308", "W# c #140900", "X# c #AB1C1D", "Y# c #BD201F", "Z# c #BBB4B5", "`# c #BD8A8B", " $ c #C20201", ".$ c #A8BA4E", "+$ c #ACC147", "@$ c #AEC53E", "#$ c #B0CA34", "$$ c #AFCB28", "%$ c #ACCA1E", "&$ c #A8C714", "*$ c #A5C50A", "=$ c #6E820C", "-$ c #3B2406", ";$ c #080000", ">$ c #AC1C1C", ",$ c #BC2020", "'$ c #B9A6A7", ")$ c #C3CFD0", "!$ c #BF2929", "~$ c #B60000", "{$ c #A6C02B", "]$ c #B2C364", "^$ c #B5C75B", "/$ c #B5CB51", "($ c #B6CE45", "_$ c #B5CF38", ":$ c #B1CD2A", "<$ c #ABCA1E", "[$ c #7C9D0B", "}$ c #7A500D", "|$ c #5D030B", "1$ c #AB1B1B", "2$ c #BF2223", "3$ c #A28889", "4$ c #BDC9CB", "5$ c #C04041", "6$ c #A9C233", "7$ c #BDCB7A", "8$ c #BECE70", "9$ c #BED164", "0$ c #BDD357", "a$ c #BBD347", "b$ c #B5D038", "c$ c #B0CD29", "d$ c #ABC91B", "e$ c #88AB0B", "f$ c #7A780A", "g$ c #9D1013", "h$ c #790C0E", "i$ c #050000", "j$ c #AB1A1A", "k$ c #BD1F1E", "l$ c #AC9FA0", "m$ c #B2B0B2", "n$ c #BF2C2D", "o$ c #B90000", "p$ c #ADC53B", "q$ c #C8D38F", "r$ c #C7D584", "s$ c #C6D677", "t$ c #C4D767", "u$ c #C0D756", "v$ c #BAD345", "w$ c #B4CF34", "x$ c #AECB24", "y$ c #A8C716", "z$ c #93B509", "A$ c #869C0A", "B$ c #8A1F10", "C$ c #C21117", "D$ c #7A0E0E", "E$ c #AB1919", "F$ c #BE2020", "G$ c #949092", "H$ c #954142", "I$ c #B2C943", "J$ c #D2DBA4", "K$ c #D0DC97", "L$ c #CDDC88", "M$ c #CADB76", "N$ c #C6DA64", "O$ c #BFD650", "P$ c #B8D13E", "Q$ c #B1CD2C", "R$ c #ABC91C", "S$ c #9DBD08", "T$ c #92B608", "U$ c #873C0B", "V$ c #B00B15", "W$ c #C91716", "X$ c #780D0D", "Y$ c #AB1717", "Z$ c #BD1F1F", "`$ c #918F91", " % c #9B4041", ".% c #B6CC4A", "+% c #DBE3B8", "@% c #D8E1A9", "#% c #D4E097", "$% c #CFDF84", "%% c #CADD6F", "&% c #C2D85A", "*% c #BBD346", "=% c #B3CE33", "-% c #A8C712", ";% c #9FC808", ">% c #816003", ",% c #9D010C", "'% c #C01617", ")% c #C61616", "!% c #AB1616", "~% c #BC1E1E", "{% c #838688", "]% c #9D3738", "^% c #BED451", "/% c #EAF0CA", "(% c #E5EEB7", "_% c #DFECA4", ":% c #D8E88F", "<% c #CDDF7A", "[% c #C6DA63", "}% c #BDD54D", "|% c #B6D038", "1% c #A5CE09", "2% c #909105", "3% c #800300", "4% c #B2090C", "5% c #BF1616", "6% c #C61515", "7% c #770C0C", "8% c #A91616", "9% c #A71C1C", "0% c #B80707", "a% c #A9C816", "b% c #ABCE18", "c% c #9EB809", "d% c #7B1900", "e% c #B30C0C", "f% c #BE1515", "g% c #C61414", "h% c #770B0B", "i% c #A81616", "j% c #C21414", "k% c #C20504", "l% c #A30505", "m% c #A7C811", "n% c #ABD018", "o% c #7B3F03", "p% c #830000", "q% c #B20C0C", "r% c #C51414", "s% c #A81515", "t% c #C21313", "u% c #BE0808", "v% c #C00101", "w% c #9C0101", "x% c #AAD112", "y% c #87740D", "z% c #6E0000", "A% c #8D0000", "B% c #970000", "C% c #B10B0B", "D% c #BD1414", "E% c #C51313", "F% c #770A0A", "G% c #A81414", "H% c #C11212", "I% c #BE0707", "J% c #9F0D0D", "K% c #6C1F02", "L% c #770000", "M% c #8C0000", "N% c #C51212", "O% c #A71313", "P% c #C11111", "Q% c #BD0505", "R% c #640200", "S% c #7A0000", "T% c #960000", "U% c #BD1313", "V% c #C41111", "W% c #760909", "X% c #A71212", "Y% c #C11010", "Z% c #660000", "`% c #B10A0A", " & c #BC1313", ".& c #A71111", "+& c #C10E0E", "@& c #BD0404", "#& c #A70000", "$& c #9E0D0D", "%& c #670000", "&& c #8B0000", "*& c #BC1212", "=& c #C41010", "-& c #A71010", ";& c #C00D0D", ">& c #BD0303", ",& c #6B0000", "'& c #790000", ")& c #BC1111", "!& c #C30F0F", "~& c #760808", "{& c #A70F0F", "]& c #C00C0C", "^& c #BD0202", "/& c #9F0E0E", "(& c #590000", "_& c #7C0000", ":& c #B10909", "<& c #BB1111", "[& c #C30E0E", "}& c #A70E0E", "|& c #C00A0A", "1& c #9E0505", "2& c #540404", "3& c #8A0000", "4& c #B00909", "5& c #BB1010", "6& c #760707", "7& c #AA1919", "8& c #C41919", "9& c #C20808", "0& c #C50505", "a& c #C70303", "b& c #C90101", "c& c #A10000", "d& c #420B0B", "e& c #7E0000", "f& c #BB0F0F", "g& c #C20D0D", "h& c #750606", "i& c #010000", "j& c #AA1A1A", "k& c #C51E1E", "l& c #C21616", "m& c #C91515", "n& c #CC1414", "o& c #CE1313", "p& c #D01111", "q& c #D11010", "r& c #D10E0E", "s& c #CE0D0D", "t& c #CB0B0B", "u& c #C60B0B", "v& c #C00909", "w& c #B90808", "x& c #B20707", "y& c #AB0606", "z& c #A60404", "A& c #A10303", "B& c #9E0202", "C& c #9D0101", "D& c #A40101", "E& c #570909", "F& c #900000", "G& c #B00808", "H& c #BA0D0D", "I& c #C10B0B", "J& c #780A0A", "K& c #130E0E", "L& c #C61D1D", "M& c #C31515", "N& c #C71515", "O& c #C91414", "P& c #C81313", "Q& c #BF1111", "R& c #B40F0F", "S& c #AA0E0E", "T& c #A10C0C", "U& c #990909", "V& c #950707", "W& c #930505", "X& c #940404", "Y& c #970202", "Z& c #B20202", "`& c #6A0707", " * c #B10C0C", ".* c #B90C0C", "+* c #B01010", "@* c #A10D0D", "#* c #B70F0F", "$* c #B20606", "%* c #AA0404", "&* c #A20202", "** c #950000", "=* c #A00101", "-* c #990303", ";* c #900404", ">* c #850505", ",* c #790707", "'* c #6C0909", ")* c #600A0A", "!* c #590B0B", "~* c #7A0303", "{* c #CB2727", "]* c #C92222", "^* c #CA1A1A", "/* c #C70606", "(* c #9A0202", "_* c #920404", ":* c #870606", "<* c #7C0707", "[* c #700909", "}* c #620A0A", "|* c #560C0C", "1* c #4A0E0E", "2* c #951717", "3* c #B02B2B", "4* c #9C2828", "5* c #891919", "6* c #770E0E", "7* c #680B0B", "8* c #5A0D0D", "9* c #4C0E0E", "0* c #411010", " ", " . + ", " @ # $ % & * ", " = - ; > , ' ) ! ~ { ] ^ / ( _ : < < ", " [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g g f h i j j j k l m ", " n [ } o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R ", " S [ T U V W X Y Z ` ...+.@.#.$.%.%.&.&.%.*.=.-.;.>.,.'.).!.~.{.= ", " ].^.[ T U /.(._.:.<.6 [.}.|.1.2.$.$.$.$.$.2.=.3.4.5.6.7.8.{ 9.0.= = ", " a.^.[ T U b.c.d.:.e.f.[.g.+.@.h.%.%.h.$.$.2.=.3.4.i.j.k.l.m.n.o.T = ", " p.^.q.} r.s.t.u.:.v.w.x.y.4.z.A.B.C.A D.E.F.G.H.I.J.K.L.8.M.N.O.T = ", " P.Q.q.} R.S.T.U.:.V.W.X.2 Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+= ", " ~+{+]+^+T R./+T.(+:.V.; _+:+<+[+}+|+1+2+3+3+U 4+5+6+7+8+9+} 0+a+b+!+= ", " c+d+e+f+T R./+T.u.:.g+h+i+p <+j+k+j+l+m+n+o+p+q+r+s+t+u+8+v+w+x+y+!+= ", " z+A+B+C+D+c+c+c+E+F+G+H+I+R.S.J+u.:.g+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @9+.@x+y+!+= ", "+@@@#@$@%@&@*@*@*@=@-@;@>@,@'@)@!@~@:.{@]@^@2 /@(@_@:@<@[@}@|@1@2@3@4@5@w+6@7@8@a+9@!+= ", "0@a@b@c@d@e@-@-@-@=@=@&@f@g@h@i@!@j@:.k@l@i+m@n@}@o@p@q@q@q@p@r@<@s@t@1@2@u@v@w@x@y@= = ", "0@a@b@c@%@&@z@=@-@A@B@C@D@E@F@G@H@j@:.g+I@J@K@L@[@r@p@p@p@p@M@o@}@N@O@P@u@Q@R@x+x@7@9+= ", "0@@@S@c@T@U@V@W@X@Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#[@r@p@p@p@p@M@o@}@N@O@2@u@Q@R@x+x@8+9+= ", ">#,#'#)#!#`@~#{#{#Z@Z@]#^#/#(#_#:#<#%#[#}#|#1#2#[@r@p@p@p@p@r@<@}@N@1@2@u@Q@3#x+x@8+9+= ", "4#5#6#7#8#]#Z@Z@Z@Z@Z@]#^#/#9#0#a#b#c#d#s.e#f#g#[@r@p@p@p@p@r@<@}@N@h#2@u@v@3#x+x@8+9+= ", "i#j#k#l#m#n#Z@Z@Z@Z@Z@]#^#/#9#o#p#q#r#s#t#u#v#w#[@r@p@p@p@p@r@<@}@t@1@2@3@v@3#x+8@8+9+= ", "x#y#z#A#B#C#D#Z@Z@Z@Z@]#^#/#9#o#E#F#G#H#I#J#K#L#<@r@p@p@p@p@r@<@s@t@1@M#3@v@w@a+8@8+9+= ", "N#O#P#Q#R#S#T#X@Z@Z@Z@]#^#/#9#o#U#V#W#X#Y#Z#`# $<@r@p@p@p@p@o@<@s@t@h#M#3@v@w@a+8@8+9+= ", "c@.$+$@$#$$$%$&$*$Z@Z@]#^#/#9#o#=$-$;$>$,$'$)$!$<@M@p@p@p@M@o@[@s@t@h#M#~$4@w@a+8@8+9+= ", "{$]$^$/$($_$:$<$V@D#Z@]#^#/#9#[$}$|$;$1$2$3$4$5$<@M@p@p@p@M@o@[@s@O@h#M#~$4@w@a+w+8+9+= ", "6$7$8$9$0$a$b$c$d$W@Z@]#^#/#e$f$g$h$i$j$k$l$m$n$<@M@p@p@p@M@o@[@|@O@h#o$~$4@w@x@w+8+9+= ", "p$q$r$s$t$u$v$w$x$y$*$]#^#z$A$B$C$D$%#E$F$G$H$[@<@M@p@p@p@M@o@[@|@O@P@o$~$4@5@x@w+8+9+= ", "I$J$K$L$M$N$O$P$Q$R$c+]#S$T$U$V$W$X$i$Y$Z$`$ %<@<@M@p@p@p@M@o@[@|@O@2@o$Q@R@5@x@w+8+9+= ", ".%+%@%#%$%%%&%*%=%=@-%n#;%>%,%'%)%X$i$!%~%{%]%o@<@M@p@p@p@M@<@[@|@1@P@u@Q@R@5@x@.@8+9+= ", "^%/%(%_%:%<%[%}%|%x$E+1%2%3%4%5%6%7%%#8%|#9%0%}@<@M@p@p@p@M@<@}@N@1@P@u@Q@R@5@8@.@8+9+= ", " a%b%c%d%[ e%f%g%h%%#i%j%k%N@s@<@M@p@p@p@r@<@}@N@1@2@u@Q@3#x+8@.@l%9+= ", " m%n%o%p%I+q%f%r%h%%#s%t%u%v%s@<@M@p@p@p@r@<@}@N@1@2@3@v@3#x+8@0+y+w%= ", " x%y%z%A%B%C%D%E%F%i$G%H%I%v%s@<@M@p@p@p@r@<@}@N@1@2@3@v@3#x+8@0+J%w%= ", " K%L%M%B%C%D%N%F%%#O%P%Q%t@s@<@M@p@p@p@r@<@s@t@h#M#3@v@w@x+8@0+J%w%= ", " R%S%M%T%C%U%V%W%i$X%Y%Q%t@s@o@M@p@p@M@r@<@s@t@h#M#3@v@w@a+w+0+J%w%= ", " Z%S%M%T%`% &V%W%i$.&+&@&t@}@o@M@p@p@M@r@[@s@t@h#M#3@4@w@a+w+#&$&!+= ", " %&S%&&T%`%*&=&W%i$-&;&>&t@}@o@M@p@p@M@o@[@s@t@P@M#~$4@w@a+w+#&J%w%= ", " ,&'&&&T%`%)&!&~&i${&]&^&t@}@o@M@p@p@M@o@[@s@O@P@M#~$4@5@a+w+#&/&w%= ", " (&_&&&T%:&<&[&~&i$}&|&h#t@}@o@M@p@p@M@o@[@|@O@P@o$~$4@5@x@.@#&1&{.} ", " 2&_&3&T%4&5&-#6&i$7&8&]&9&0&a&b&p@p@M@o@}@|@O@h#M#3@v@3#a+w+#&c& @c& ", " d&e&3&T%4&f&g&h&i&j&k&l&6%m&n&o&p&q&r&s&t&u&v&w&x&y&z&A&B&w%!+C&D&0+ ", " E&F&T%G&H&I&J&K&1$L&M&N&O&P&N%Q&R&S&T&U&V&W&X&Y&w%v+7+0+.@w+.@5@Z& ", " `&= *D%.*+*@*#*K#0%$*%*&*} T%**I+{.7@0+w+.@6@=*-*;*>*,*'*)*!* ", " ~*e#{*]*^*/*t@2@~$w@.@`+(*_*:*<*[*}*|*1* ", " 2*3*4*5*6*7*8*9*0* ", " ", " ", " "}; tqsl-2.8.1/apps/download_dis.xpm0000644000175000017500000001614215003421124016636 0ustar rmurphyrmurphy/* XPM */ static const char * download_dis_xpm[] = { "48 48 150 2", " c None", ". c #767676", "+ c #9D9D9D", "@ c #7D7D7D", "# c #A2A2A2", "$ c #9E9E9E", "% c #969696", "& c #909090", "* c #8C8C8C", "= c #4E4E4E", "- c #7F7F7F", "; c #A0A0A0", "> c #989898", ", c #9B9B9B", "' c #8E8E8E", ") c #8A8A8A", "! c #888888", "~ c #858585", "{ c #838383", "] c #7C7C7C", "^ c #797979", "/ c #757575", "( c #727272", "_ c #717171", ": c #494949", "< c #4D4D4D", "[ c #787878", "} c #919191", "| c #5C5C5C", "1 c #929292", "2 c #A4A4A4", "3 c #8D8D8D", "4 c #818181", "5 c #7A7A7A", "6 c #777777", "7 c #737373", "8 c #707070", "9 c #6F6F6F", "0 c #414141", "a c #747474", "b c #949494", "c c #5A5A5A", "d c #000000", "e c #AEAEAE", "f c #868686", "g c #848484", "h c #6A6A6A", "i c #676767", "j c #656565", "k c #636363", "l c #666666", "m c #3F3F3F", "n c #939393", "o c #595959", "p c #010101", "q c #898989", "r c #A8A8A8", "s c #999999", "t c #8B8B8B", "u c #878787", "v c #6D6D6D", "w c #565656", "x c #373737", "y c #404040", "z c #8F8F8F", "A c #5B5B5B", "B c #363636", "C c #505050", "D c #A3A3A3", "E c #828282", "F c #626262", "G c #474747", "H c #979797", "I c #3E3E3E", "J c #484848", "K c #A1A1A1", "L c #6E6E6E", "M c #686868", "N c #575757", "O c #959595", "P c #525252", "Q c #515151", "R c #4F4F4F", "S c #545454", "T c #6B6B6B", "U c #606060", "V c #585858", "W c #555555", "X c #5E5E5E", "Y c #616161", "Z c #696969", "` c #4C4C4C", " . c #9F9F9F", ".. c #7E7E7E", "+. c #5F5F5F", "@. c #535353", "#. c #5D5D5D", "$. c #464646", "%. c #808080", "&. c #646464", "*. c #6C6C6C", "=. c #020202", "-. c #7B7B7B", ";. c #444444", ">. c #353535", ",. c #030303", "'. c #2E2E2E", "). c #0B0B0B", "!. c #434343", "~. c #313131", "{. c #151515", "]. c #454545", "^. c #2D2D2D", "/. c #0A0A0A", "(. c #B7B7B7", "_. c #202020", ":. c #040404", "<. c #AFAFAF", "[. c #C9C9C9", "}. c #303030", "|. c #C4C4C4", "1. c #9A9A9A", "2. c #424242", "3. c #A5A5A5", "4. c #B1B1B1", "5. c #ACACAC", "6. c #A6A6A6", "7. c #BFBFBF", "8. c #B9B9B9", "9. c #B2B2B2", "0. c #CDCDCD", "a. c #C5C5C5", "b. c #BBBBBB", "c. c #DDDDDD", "d. c #D2D2D2", "e. c #C8C8C8", "f. c #4B4B4B", "g. c #3D3D3D", "h. c #4A4A4A", "i. c #3B3B3B", "j. c #323232", "k. c #333333", "l. c #3C3C3C", "m. c #2C2C2C", "n. c #262626", "o. c #101010", "p. c #383838", "q. c #3A3A3A", "r. c #393939", "s. c #282828", " ", " . + ", " @ # $ % & * ", " = - ; > $ , ' ) ! ~ { - ] ^ / ( _ _ ", " : < [ > } @ | 1 2 % 3 ! 4 @ 5 6 7 ( _ 8 8 _ _ ( ( ( ( ( 8 9 ", " 0 : < a & b c d * e + % } ' ) ) ! f g 4 @ 5 6 a 9 h i j k k j l i ", " m : < ( ' n o p q r s b & 3 t t * * 3 3 * t ) u g - 5 7 v i w = = ", " x y : < ( z b A p u 2 > n z * t t t t t t t ) q ! ! u f f ~ u l = = ", " B y : < ( * q C p ~ D > n & 3 * * * * t t t ) q ! u f g { E E F < = ", " x y : < i / . G p g # H } ! f ~ u ! ) t * 3 * * t ) ! u f ~ ~ k < = ", " I I : < F _ . J p { K % } - _ _ 8 9 L L v v L 9 8 _ a . 7 v M c = = ", " 9 N m J < F ( . G p { ; O 1 4 . . / a 7 a a ( 8 l o P Q R < S w w = = ", " h @ P G < F ( . G p E ; O & 4 6 . 6 / / T U | A V W S P Q C W N w = = ", " X Y F M Z h h h L . ^ R ` F _ / G p E .b & ..7 ( Z k F +.| A o N W @.Q R R S N w = = ", "F M v _ ( a / / / / a . 8 < #._ / $.p 4 $ n } ' %.9 &.k F F Y +.#.A o N W @.Q W w N = = ", "F i *.9 ( a a a a / / a 6 Y Y v / $.p %.$ O ~ L F k j j j j j &.k Y U +.#.| c V w S = = ", "F i *.9 ( a / / a 7 _ L h i @.v 7 $.p E s 5 i F F &.j j j j &.k F U +.X | c o N w Q R = ", "F M v 9 8 9 v h i l j &.Y A c W _ $.=./ -.h M &.F &.j j j j &.k F U +.#.| c o N w Q R = ", "Y k F F k &.&.&.&.j j &.F | w @.+.;.=.l . *.i k F &.j j j j &.k F U +.#.| c V N w Q R = ", "+.N c X F &.j j j j j &.F | w C G >.,.i / T l k F &.j j j j &.k F U X #.| c V N w Q R = ", "Y +.Y k &.j j j j j j &.F | w C ;.'.).&.a M &.F F &.j j j j &.k F U +.#.A c V N W Q R = ", "j h T T T h i j j j j &.F | w C !.~.{.F ( _ j F k &.j j j j &.k Y U +.#.A c V w W Q R = ", "h . 6 . a _ *.i j j j &.F | w C ].^./.k L (.D Y k &.j j j j k k Y U X #.A c V w W Q R = ", "9 g g 4 - ^ a v i j j &.F | w C G _.:.&.L <.[.a k &.j j j &.k F Y U X #.A o V w W Q R = ", "/ n } ' q { -.a v i j &.F | w S !.}.:.k 8 O |.%.k &.j j j &.k F Y +.X #.A o V w W Q R = ", "5 # .1.O 3 g -.( h j &.F | A 2.w 2.=.F v 3.4./ k &.j j j &.k F Y +.X | A o V w W Q R = ", "%.4.5.6. .% * 4 6 L i &.F +.@.< Z ;.=.F 9 1 T F k &.j j j &.k F Y +.X | A o N w W Q R = ", "f 7.8.9.r .n u ] ( h &.F +.: #.9 2.=.Y L & v k k &.j j j &.k F Y +.#.| c o N w W Q R = ", "t 0.a.b.4.6.s * %./ *.j M 2.R T L 2.=.U v ~ h k k &.j j j &.k F Y +.X | c o N w S Q R = ", "1 c.d.e.b.5.$ } g 6 L T f.y #.h v 0 =.+.*.Y +.F k &.j j j &.k F U +.X | c o N W S Q R = ", " 9 7 U g.: +.Z v 0 =.+.T k U Y k &.j j j &.k F U +.#.| c V N W S S R = ", " *.a m 0 ` +.Z *.0 =.X h k U Y k &.j j j &.k F U +.#.A c V N W S w = = ", " _ h.x $.f.X M *.y =.X Z F U Y k &.j j j &.k F U +.#.A c V N W S w = = ", " x i.$.f.X M T y =.#.Z Y U Y k &.j j j &.k Y U X #.A c V N W S w = = ", " j.g.$.f.X M h m =.| M Y U Y k &.j j &.&.k Y U X #.A c V w W S w = = ", " k.g.$.f.#.i h m =.| i U U F k &.j j &.&.F Y U X #.A o V w W @.W = = ", " k.g.].f.#.i h m =.A l U U F k &.j j &.k F Y U X #.A o V w W @.w = = ", " >.l.].f.#.l Z m =.A l +.U F k &.j j &.k F Y +.X #.A o N w W @.w = = ", " m.I ].f.#.l M m =.c j X U F k &.j j &.k F Y +.X | A o N w S @.Q = < ", " m.I ].f.| j M I =.Y L l j j j j j j &.k F Y +.X #.A c V w W @.C R C ", " n.m ].f.| j i g.d F _ *.v 9 8 8 8 8 9 v T M &.U | V W P C = = R P S ", " }.J f.| k l 0 o.k _ *.L L v T M Y | w Q = ` ` ` = C P S S W S N c ", " p.= X M F U N k j +.| N P < f.h.` = Q S W S @.C = h.].y q.>.j. ", " I T ^ / ( l U #.A V S Q = f.$.0 l.B ~.m. ", " w v F Q 2.r.k.^.s. ", " ", " ", " "}; tqsl-2.8.1/apps/dxcc.cpp0000644000175000017500000001074315003421124015070 0ustar rmurphyrmurphy/*************************************************************************** dxcc.cpp - description ------------------- begin : Tue Jun 18 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #include #include #include "dxcc.h" #include "tqsllib.h" #include "tqsltrace.h" #include "winstrdefs.h" #include "wxutil.h" bool DXCC::_init = false; static int num_entities = 0; static struct _dxcc_entity { int number; const char *name; const char *zonemap; } *entity_list = 0, *deleted_entity_list = 0; static int _ent_cmp(const void *a, const void *b) { return strcasecmp(((struct _dxcc_entity *)a)->name, ((struct _dxcc_entity *)b)->name); } bool DXCC::init() { tqslTrace("DXCC::init", NULL); if (!_init) { // Don't leak the DCCC data when reloading if (entity_list && num_entities != 0) { for (int i = 0; i < num_entities; i++) { if (entity_list && entity_list[i].name) free(const_cast(entity_list[i].name)); if (entity_list && entity_list[i].zonemap) free(const_cast(entity_list[i].zonemap)); } delete entity_list; } // TRANSLATORS: This is part of an deleted DXCC entity name wxString del = wxGetTranslation(_("DELETED")); char cdel[128]; strncpy(cdel, del.ToUTF8(), sizeof cdel); cdel[sizeof cdel - 1] = '\0'; if (tqsl_getNumDXCCEntity(&num_entities)) return false; entity_list = new struct _dxcc_entity[num_entities]; deleted_entity_list = new struct _dxcc_entity[num_entities]; int activeEntities = 0; int deletedEntities = 0; for (int i = 0; i < num_entities; i++) { const char *entityName; const char *zonemap; int entityNum; int deleted; if (tqsl_getDXCCEntity(i, &entityNum, &entityName)) return false; if (tqsl_getDXCCZoneMap(entityNum, &zonemap)) zonemap = ""; if (tqsl_getDXCCDeleted(entityNum, &deleted)) return false; char testName[TQSL_CRQ_COUNTRY_MAX+1]; strncpy(testName, entityName, sizeof testName); char *p = strstr(testName, "DELETED"); if (deleted || p != NULL) { // Remove "(DELETED)" and replace it with translation char fixedName[TQSL_CRQ_COUNTRY_MAX+1]; *p = '\0'; strncpy(fixedName, testName, sizeof fixedName); strncat(fixedName, cdel, sizeof fixedName - strlen(fixedName) - 1); p += strlen("DELETED"); // Go past the DELETED string strncat(fixedName, p, sizeof fixedName - strlen(fixedName) - 1); deleted_entity_list[deletedEntities].number = entityNum; deleted_entity_list[deletedEntities].name = strdup(fixedName); if (zonemap) { deleted_entity_list[deletedEntities++].zonemap = strdup(zonemap); } else { deleted_entity_list[deletedEntities++].zonemap = NULL; } } else { entity_list[activeEntities].number = entityNum; entity_list[activeEntities].name = strdup(entityName); if (zonemap) { entity_list[activeEntities++].zonemap = strdup(zonemap); } else { entity_list[activeEntities++].zonemap = NULL; } } } qsort(entity_list, activeEntities, sizeof(struct _dxcc_entity), &_ent_cmp); qsort(deleted_entity_list, deletedEntities, sizeof(struct _dxcc_entity), &_ent_cmp); for (int j = 0; activeEntities < num_entities; ) { entity_list[activeEntities++] = deleted_entity_list[j++]; } delete deleted_entity_list; deleted_entity_list = NULL; } _init = true; return _init; } bool DXCC::getFirst() { tqslTrace("DXCC::getFirst", NULL); if (!init()) return false; _index = -1; return getNext(); } bool DXCC::getNext() { int newidx = _index+1; if (newidx < 0 || newidx >= num_entities) { tqslTrace("DXCC::getNext", "index error, newidx=%d, n=%d", newidx, num_entities); return false; } _index = newidx; _number = entity_list[newidx].number; _name = entity_list[newidx].name; _zonemap = entity_list[newidx].zonemap; return true; } bool DXCC::getByEntity(int e) { tqslTrace("DXCC::getByEntity", "e=%d", e); _number = 0; _name = ""; _zonemap = ""; if (!init()) return false; for (int i = 0; i < num_entities; i++) { if (entity_list[i].number == e) { _index = i; _number = entity_list[i].number; _name = entity_list[i].name; _zonemap = entity_list[i].zonemap; return true; } } return false; } // // Reload the DXCC map after a config file change // void DXCC::reset() { _init = false; } tqsl-2.8.1/apps/dxcc.h0000644000175000017500000000163415003421124014534 0ustar rmurphyrmurphy/*************************************************************************** dxcc.h - description ------------------- begin : Tue Jun 18 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __dxcc_h #define __dxcc_h #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif class DXCC { public: DXCC() {} int number() const { return _number; } const char * name() const { return _name; } const char * zonemap() const { return _zonemap; } bool getFirst(); bool getNext(); bool getByEntity(int e); void reset(); static bool init(); private: static bool _init; int _number, _index; const char *_name; const char *_zonemap; }; #endif // __dxcc_h tqsl-2.8.1/apps/edit.xpm0000644000175000017500000002415215003421124015115 0ustar rmurphyrmurphy/* XPM */ static const char * edit_xpm[] = { "48 48 343 2", " c None", ". c #ECB362", "+ c #F2BB6E", "@ c #F2BA6C", "# c #FAC479", "$ c #FFCA81", "% c #FBC479", "& c #FAC375", "* c #FFC97D", "= c #FBC375", "- c #FAC272", "; c #FFC779", "> c #FBC373", ", c #F2B865", "' c #EFB360", ") c #FAC06F", "! c #FFC676", "~ c #FBC271", "{ c #FABF6B", "] c #FFC472", "^ c #FBC06D", "/ c #F1B26F", "( c #F6B979", "_ c #F2B472", ": c #E49F4B", "< c #E6A35C", "[ c #E9A661", "} c #E7A35D", "| c #E39E4B", "1 c #EDA43F", "2 c #F2B45C", "3 c #F2B35B", "4 c #F3B45C", "5 c #EDA53F", "6 c #EA8A05", "7 c #EC8C05", "8 c #ED8D07", "9 c #EE900E", "0 c #EA8B05", "a c #ED8E09", "b c #EF9210", "c c #EE8E0A", "d c #EA8B06", "e c #EB8C08", "f c #EE8F0B", "g c #EE900D", "h c #F09313", "i c #EC8D0A", "j c #EF910D", "k c #EF920F", "l c #F19515", "m c #EC8F0C", "n c #F09210", "o c #F09312", "p c #F19617", "q c #F29D25", "r c #F5B862", "s c #F5B964", "t c #F29E27", "u c #F19717", "v c #F09412", "w c #ED9110", "x c #F19413", "y c #F19514", "z c #F29719", "A c #F2981A", "B c #F4AE4B", "C c #F7C888", "D c #F8CD92", "E c #F8CF95", "F c #F8CB8C", "G c #F5B152", "H c #EF9314", "I c #F29615", "J c #F29617", "K c #F3991B", "L c #F4A434", "M c #F7C279", "N c #F9D29C", "O c #F9D39E", "P c #F9D49F", "Q c #F9D4A0", "R c #F9D5A2", "S c #F8C986", "T c #F4A639", "U c #F29717", "V c #EE9314", "W c #F09619", "X c #F39718", "Y c #F39819", "Z c #F49A1D", "` c #F49D23", " . c #F7B962", ".. c #FAD39D", "+. c #FAD6A4", "@. c #FAD7A5", "#. c #FAD7A7", "$. c #FAD8A7", "%. c #FAD8A9", "&. c #FAD9AA", "*. c #FAD9AB", "=. c #FADAAD", "-. c #FAD7A6", ";. c #F7BC6A", ">. c #F49F27", ",. c #F2991D", "'. c #F4991B", "). c #F49A1C", "!. c #F59B1F", "~. c #F6A93F", "{. c #F9CD91", "]. c #FBDAAD", "^. c #FBDBAE", "/. c #FBDBAF", "(. c #FBDBB0", "_. c #FBDCB2", ":. c #FBDDB3", "<. c #FBDDB5", "[. c #FBDEB6", "}. c #FAD5A2", "|. c #F7B04E", "1. c #F39C23", "2. c #F59B1E", "3. c #F59C1F", "4. c #F59D21", "5. c #F6A32E", "6. c #F9C47A", "7. c #FBDEB5", "8. c #FBDFB7", "9. c #FBE0B9", "0. c #FBE0BA", "a. c #FBE1BB", "b. c #FBE1BD", "c. c #FCE1BD", "d. c #FCE2BF", "e. c #FBE2BE", "f. c #F9C987", "g. c #F6A431", "h. c #F49C23", "i. c #F69D21", "j. c #F69E23", "k. c #F6A027", "l. c #F8B354", "m. c #FBD7A6", "n. c #FCE0BA", "o. c #FCE1BC", "p. c #FCE2BE", "q. c #FCE4C1", "r. c #FCE4C2", "s. c #FCE4C3", "t. c #FCE5C4", "u. c #FCE5C5", "v. c #FCE5C6", "w. c #FCE6C7", "x. c #FCE6C8", "y. c #F8BC67", "z. c #F6A028", "A. c #F69D22", "B. c #F59F28", "C. c #F79F24", "D. c #F79F25", "E. c #F9B659", "F. c #FAC883", "G. c #FAC986", "H. c #FCE2BD", "I. c #FCE3BF", "J. c #FCE3C1", "K. c #FCE4C4", "L. c #FCE6C6", "M. c #FCE7CA", "N. c #FCE8CB", "O. c #FDE8CC", "P. c #FDE8CD", "Q. c #FDE9CE", "R. c #FBCE91", "S. c #FBCD8F", "T. c #F9BC69", "U. c #F7A026", "V. c #F8A128", "W. c #F8A026", "X. c #F7A027", "Y. c #FDE7C9", "Z. c #FDE8CB", "`. c #FDE9CD", " + c #FDEACF", ".+ c #FDEAD0", "++ c #FDEAD1", "@+ c #FDEBD4", "#+ c #FDECD4", "$+ c #FCEAD0", "%+ c #F7A22B", "&+ c #F8A027", "*+ c #F8A127", "=+ c #F9A32B", "-+ c #F9A229", ";+ c #F8A229", ">+ c #FDEBD2", ",+ c #FDEBD3", "'+ c #FDECD3", ")+ c #FDECD5", "!+ c #FDEDD6", "~+ c #FDEDD7", "{+ c #FDEDD8", "]+ c #FDEED9", "^+ c #F8A32C", "/+ c #FAA52E", "(+ c #FAA42C", "_+ c #FAA32B", ":+ c #FCE3C0", "<+ c #FDECD6", "[+ c #FDEEDA", "}+ c #FDEFDA", "|+ c #FDEFDC", "1+ c #FDF0DD", "2+ c #FEF0DE", "3+ c #FEF0DF", "4+ c #FEF1E0", "5+ c #FDEBD1", "6+ c #F9A42E", "7+ c #FBA732", "8+ c #FBA52F", "9+ c #F9A42D", "0+ c #FDEFDB", "a+ c #FEEFDC", "b+ c #FEF0DD", "c+ c #FEF1DE", "d+ c #FEF1DF", "e+ c #FEF2E1", "f+ c #FEF2E2", "g+ c #FEF3E4", "h+ c #FEF3E5", "i+ c #F9A530", "j+ c #FBA632", "k+ c #FCA935", "l+ c #FCA732", "m+ c #FBA631", "n+ c #FAA52F", "o+ c #FDE4C2", "p+ c #FEF1E1", "q+ c #FCC982", "r+ c #FBB048", "s+ c #FEF4E7", "t+ c #FEF5E8", "u+ c #FEF5E9", "v+ c #FEF5EA", "w+ c #FAA632", "x+ c #FCA834", "y+ c #FDAB38", "z+ c #FDA935", "A+ c #FCA833", "B+ c #FDE4C1", "C+ c #FEF2E3", "D+ c #FEF3E3", "E+ c #FEF4E6", "F+ c #FCC57A", "G+ c #FEF6ED", "H+ c #FEF7EE", "I+ c #FBA733", "J+ c #FDAA37", "K+ c #FEAD3D", "L+ c #FEAB38", "M+ c #FCA936", "N+ c #FBA834", "O+ c #FDE4C3", "P+ c #FEF4E8", "Q+ c #FEF6EB", "R+ c #FEF6EC", "S+ c #FCCA83", "T+ c #FEF8F0", "U+ c #FEF8F1", "V+ c #FEF8F2", "W+ c #FEF9F2", "X+ c #FBA936", "Y+ c #FEAD3C", "Z+ c #FFB34B", "`+ c #FFB146", " @ c #FDAF42", ".@ c #FCAC3F", "+@ c #FDE5C4", "@@ c #FEF7EF", "#@ c #FEF8EF", "$@ c #FDCF90", "%@ c #FDF3E5", "&@ c #FEFAF5", "*@ c #FEFBF6", "=@ c #FDEBD0", "-@ c #FCAD41", ";@ c #FDAE42", ">@ c #FFBA5B", ",@ c #FFB857", "'@ c #FDB552", ")@ c #FCB24E", "!@ c #FCB24D", "~@ c #FDE3C1", "{@ c #FEF9F3", "]@ c #FEFAF4", "^@ c #FDD59E", "/@ c #FDF7ED", "(@ c #FEFCF8", "_@ c #FEFCF9", ":@ c #FEFDFA", "<@ c #FCB34F", "[@ c #FFC16B", "}@ c #FFBF69", "|@ c #FDBC63", "1@ c #FCB95E", "2@ c #FDE1BE", "3@ c #FEFAF6", "4@ c #FEFBF7", "5@ c #FEFBF8", "6@ c #FDDBAC", "7@ c #FDFBF6", "8@ c #FEFDFC", "9@ c #FEFEFC", "0@ c #FDBC62", "a@ c #FFC77A", "b@ c #FDC372", "c@ c #FCC06E", "d@ c #FCC983", "e@ c #FCC478", "f@ c #FCC67B", "g@ c #FDC272", "h@ c #FFCD87", "i@ c #FFCE8B", "j@ c #FCC981", "k@ c #FCC67D", "l@ c #FECE8B", "m@ c #FFCF8E", "n@ c #FED192", "o@ c #FCCA86", "p@ c #FBC983", "q@ c #FBC883", "r@ c #FED092", "s@ c #FCCC89", "t@ c #FBCB89", "u@ c #F7C47F", "v@ c #F5C37E", "w@ c #F6C47F", "x@ c #FCCC8A", "y@ c #E0B377", "z@ c #E1B273", "A@ c #E0B273", "B@ c #2E2C2A", " ", " ", " ", " . + + + + + + + + @ ", " # $ $ $ $ $ $ $ $ $ % ", " & * * * * * * * * * * = ", " - ; ; ; ; ; ; ; ; ; ; ; > , , , , , , , , , , , , , , , , , , , , , , , , , , ' ", " ) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ ", " { ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ", " / ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( _ ", " : < [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ } | ", "1 2 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 2 5 ", "6 7 7 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 7 7 6 ", "0 8 8 a b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b c 8 8 d ", "e f f g h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h g f f e ", "i j j k l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l k j j i ", "m n n o p p p p p p p p p p p p p p p p p p q r s t u p p p p p p p p p p p p p p p p p v n n m ", "w x x y z z z z z z z z z z z z z z z z A B C D E F G A z z z z z z z z z z z z z z z z y x x w ", "H I I J K K K K K K K K K K K K K K K L M N O P Q R R S T K K K K K K K K K K K K K K K U I I V ", "W X X Y Z Z Z Z Z Z Z Z Z Z Z Z Z ` ...+.@.#.$.%.&.*.=.-.;.>.Z Z Z Z Z Z Z Z Z Z Z Z Z Y X X W ", ",.'.'.).!.!.!.!.!.!.!.!.!.!.!.!.~.{.*.].].^./.(._._.:.<.<.[.}.|.!.!.!.!.!.!.!.!.!.!.!.!.).'.'.,.", "1.2.2.3.4.4.4.4.4.4.4.4.4.4.5.6./._._.7.7.[.8.8.9.0.0.a.b.c.d.e.f.g.4.4.4.4.4.4.4.4.4.4.3.2.2.h.", " i.i.i.j.j.j.j.j.j.j.j.k.l.m.8.9.n.n.o.o.c.p.d.d.q.r.s.t.u.v.w.x.[.y.z.j.j.j.j.j.j.j.j.A.i.i.B.", " C.C.C.D.D.D.D.D.D.D.D.E.F.G.H.I.J.J.r.K.t.u.L.w.x.M.M.N.O.P.P.Q.R.S.T.U.D.D.D.D.D.D.D.C.C.C. ", " V.W.W.X.X.X.X.X.X.X.X.X.X.X.p.w.x.Y.Y.Z.Z.O.`.Q.Q. +.+.+++@+#+$+%+X.X.X.X.X.X.X.X.X.X.&+W.*+ ", " =+-+-+;+;+;+;+;+;+;+;+;+;+;+I.Q.Q. + +.+.+>+,+'+)+!+~+{+{+]+]+.+^+;+;+;+;+;+;+;+;+;+;+-+-+=+ ", " /+(+_+=+=+=+=+=+=+=+=+=+=+=+:+,+#+<+<+~+{+{+]+[+}+}+|+1+2+3+4+5+6+=+=+=+=+=+=+=+=+=+=+_+(+/+ ", " 7+8+/+9+9+9+9+9+9+9+9+9+9+9+J.]+[+[+0+a+b+c+d+d+d+e+e+f+f+g+h+++i+9+9+9+9+9+9+9+9+9+9+/+8+j+ ", " k+l+m+n+n+n+n+n+n+n+n+n+n+n+o+d+d+4+p+e+f+q+r+r+r+r+`.s+t+u+v+++w+n+n+n+n+n+n+n+n+n+n+m+l+x+ ", " y+z+A+m+m+m+m+m+m+m+m+m+m+m+B+C+D+g+E+E+s+F+m+m+m+m+>+G+G+H+H+.+I+m+m+m+m+m+m+m+m+m+m+A+z+J+ ", " K+L+M+N+N+N+N+N+N+N+N+N+N+N+O+P+u+v+v+Q+R+S+N+N+N+N+0+T+U+V+W+.+X+N+N+N+N+N+N+N+N+N+N+M+L+Y+ ", " Z+`+ @.@.@.@.@.@.@.@.@.@.@.@+@H+H+@@#@T+T+$@.@.@.@.@%@&@&@&@*@=@-@.@.@.@.@.@.@.@.@.@.@;@`+Z+ ", " >@,@'@)@)@)@)@)@)@)@)@)@)@!@~@U+W+{@]@]@&@^@)@)@)@)@/@(@_@:@:@.+<@)@)@)@)@)@)@)@)@)@)@'@,@>@ ", " [@}@|@1@1@1@1@1@1@1@1@1@1@1@2@3@3@4@4@4@5@6@1@1@1@1@7@8@9@9@9@Y.1@1@1@1@1@1@1@1@1@1@1@0@}@[@ ", " ; a@b@c@c@c@c@c@c@c@c@c@c@c@F+q+q+q+q+q+d@e@c@c@c@c@q+d@d@d@d@f@c@c@c@c@c@c@c@c@c@c@c@g@a@; ", " h@i@j@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@j@l@h@ ", " m@n@o@p@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@p@o@r@m@ ", " s@t@u@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@w@t@x@ ", " y@z@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@z@y@ ", " B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@ ", " ", " ", " ", " ", " ", " ", " ", " "}; tqsl-2.8.1/apps/edit_dis.xpm0000644000175000017500000001466115003421124015760 0ustar rmurphyrmurphy/* XPM */ static const char * edit_dis_xpm[] = { "48 48 107 2", " c #FFFFFF", ". c #B9B9B9", "+ c #C1C1C1", "@ c #C0C0C0", "# c #CACACA", "$ c #D0D0D0", "% c #C9C9C9", "& c #CFCFCF", "* c #C8C8C8", "= c #CDCDCD", "- c #BEBEBE", "; c #BABABA", "> c #C6C6C6", ", c #CCCCCC", "' c #C5C5C5", ") c #CBCBCB", "! c #C7C7C7", "~ c #BBBBBB", "{ c #BCBCBC", "] c #A8A8A8", "^ c #ACACAC", "/ c #AFAFAF", "( c #A7A7A7", "_ c #ADADAD", ": c #959595", "< c #979797", "[ c #989898", "} c #9B9B9B", "| c #969696", "1 c #999999", "2 c #9C9C9C", "3 c #9A9A9A", "4 c #9E9E9E", "5 c #9F9F9F", "6 c #9D9D9D", "7 c #A0A0A0", "8 c #A6A6A6", "9 c #BFBFBF", "0 c #A1A1A1", "a c #A2A2A2", "b c #B6B6B6", "c c #D2D2D2", "d c #D4D4D4", "e c #A3A3A3", "f c #D6D6D6", "g c #D7D7D7", "h c #D8D8D8", "i c #D9D9D9", "j c #CECECE", "k c #A4A4A4", "l c #DADADA", "m c #DBDBDB", "n c #DCDCDC", "o c #DDDDDD", "p c #DEDEDE", "q c #C3C3C3", "r c #A5A5A5", "s c #B2B2B2", "t c #DFDFDF", "u c #E0E0E0", "v c #E1E1E1", "w c #B8B8B8", "x c #E2E2E2", "y c #E3E3E3", "z c #E4E4E4", "A c #E5E5E5", "B c #AAAAAA", "C c #E7E7E7", "D c #E8E8E8", "E c #E9E9E9", "F c #A9A9A9", "G c #E6E6E6", "H c #EAEAEA", "I c #EBEBEB", "J c #D3D3D3", "K c #ABABAB", "L c #ECECEC", "M c #EDEDED", "N c #EEEEEE", "O c #EFEFEF", "P c #F0F0F0", "Q c #AEAEAE", "R c #F1F1F1", "S c #F2F2F2", "T c #F3F3F3", "U c #B0B0B0", "V c #F4F4F4", "W c #B1B1B1", "X c #F5F5F5", "Y c #F6F6F6", "Z c #B4B4B4", "` c #F7F7F7", " . c #F8F8F8", ".. c #B3B3B3", "+. c #F9F9F9", "@. c #FAFAFA", "#. c #B5B5B5", "$. c #FBFBFB", "%. c #B7B7B7", "&. c #C2C2C2", "*. c #BDBDBD", "=. c #FCFCFC", "-. c #FDFDFD", ";. c #FEFEFE", ">. c #D5D5D5", ",. c #D1D1D1", "'. c #2C2C2C", " ", " ", " ", " . + + + + + + + + @ ", " # $ $ $ $ $ $ $ $ $ # ", " % & & & & & & & & & & % ", " * = = = = = = = = = = = % - - - - - - - - - - - - - - - - - - - - - - - - - - ; ", " > , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , * ", " ' ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ! ", " ~ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { ", " ] ^ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ^ ( ", "^ ~ ; ; ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ; ; ~ _ ", ": < < [ } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } [ < < : ", "| [ [ 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 [ [ | ", "< 3 3 } 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 } 3 3 < ", "[ } } 2 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 2 } } [ ", "1 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 9 @ ( 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4 6 6 1 ", "} 4 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a b = c d $ . a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 4 } ", "6 7 7 7 e e e e e e e e e e e e e e e _ * f g h h i i j / e e e e e e e e e e e e e e e 0 7 7 6 ", "7 0 0 a k k k k k k k k k k k k k ( @ g l m m n n o o p m q ] k k k k k k k k k k k k k a 0 0 7 ", "e e e k r r r r r r r r r r r r s c o p p t t t u u u u u v i w r r r r r r r r r r r r k e e e ", "8 r r 8 ( ( ( ( ( ( ( ( ( ( ^ # t u u v v v x x y y y z z z A A j _ ( ( ( ( ( ( ( ( ( ( 8 r r 8 ", " ( ( ( ] ] ] ] ] ] ] ] B ~ m x y y y z z z A A A C C C D D D D E v q B ] ] ] ] ] ] ] ] ( ( ( F ", " F F F F F F F F F F F - j & A G G G C C D D D D E E E H H I I I J c q B F F F F F F F F F F ", " K B B B B B B B B B B B B B A D E H H H H H I I I L L L L M N L K B B B B B B B B B B B B K ", " _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ G I I L L L L M M N N O O O O P P L ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ", " Q Q _ _ _ _ _ _ _ _ _ _ _ _ G M N N N O O O P P P P R R S S T M Q _ _ _ _ _ _ _ _ _ _ _ Q Q ", " U / Q _ _ _ _ _ _ _ _ _ _ _ G P P P R R S S S S S T T T T V V L Q _ _ _ _ _ _ _ _ _ _ Q / U ", " s W U / / / / / / / / / / / C S S T T T T & w w w w I X Y Y Y L / / / / / / / / / / / U W W ", " Z s W U U U U U U U U U U U C T V V X X X ) U U U U M ` ` . .L U U U U U U U U U U U W s .. ", " b Z s W W W W W W W W W W W C X Y Y Y ` ` $ W W W W R +.+.+.@.L s W W W W W W W W W W s Z b ", " { ; w #.#.#.#.#.#.#.#.#.#.#.D . . .+.+.+.d #.#.#.#.V @.@.@.$.M b #.#.#.#.#.#.#.#.#.#.%.; { ", " &.@ *.~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ; G +.@.@.@.@.@.l ~ ~ ~ ~ .=.=.-.-.L ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ *.@ &. ", " * > q + + + + + + + + + + + z $.$.$.$.$.$.t + + + + $.-.;.;.;.H + + + + + + + + + + + q > * ", " = = % ! ! ! ! ! ! ! ! ! ! ! ) & & & & & & # ! ! ! ! & & & & & , ! ! ! ! ! ! ! ! ! ! ! % = = ", " J d & , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , & J J ", " >.f $ & j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j & $ >.>. ", " ,.$ # % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % # $ ,. ", " w %.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.w ", " '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'. ", " ", " ", " ", " ", " ", " ", " ", " "}; tqsl-2.8.1/apps/expired.xpm0000644000175000017500000000230415003421124015623 0ustar rmurphyrmurphy/* XPM */ static const char * expired_xpm[] = { "16 16 56 1", " c None", ". c #FDE55E", "+ c #FEEA80", "@ c #FEED92", "# c #FEEE97", "$ c #FEEC88", "% c #FEEC8D", "& c #FDE976", "* c #E2CA45", "= c #FADF4C", "- c #FDE76B", "; c #FEEA7E", "> c #BFC1CC", ", c #FDE769", "' c #FDE664", ") c #FDE354", "! c #F0D649", "~ c #D6BF41", "{ c #EDD448", "] c #FDE250", "^ c #FBFBFB", "/ c #FCFCFC", "( c #FDFDFD", "_ c #FEFEFE", ": c #F2D84A", "< c #E9D047", "[ c #DCC543", "} c #CFB93F", "| c #F6F6F6", "1 c #F5F5F5", "2 c #9C9C9C", "3 c #F8F8F8", "4 c #CDB73F", "5 c #CEB83F", "6 c #F3F3F3", "7 c #F0F0F0", "8 c #EFEFEF", "9 c #F7F7F7", "0 c #C6B13C", "a c #EDEDED", "b c #E9E9E9", "c c #E8E8E8", "d c #E4E4E4", "e c #E2E2E2", "f c #B64F54", "g c #B00000", "h c #DEDEDE", "i c #CF6767", "j c #FE6464", "k c #FCAFAD", "l c #737373", "m c #FAFAF7", "n c #EC4F4F", "o c #DA3939", "p c #C51D1D", "q c #FFFFFF", "qqqqqqqqqqqqqqqq", "q.+@#qq$%$&qqqqq", "*=-;>>>>,')!qqqq", "~{]>^/(_>:<[qqqq", "}*>|123^_>~4qqqq", "5>678269^_>0qqqq", "q>abc2a63(>qqqqq", "q>bde2222/fggqqq", "q>cehec81igjggqq", "q>>dedb7|gjkjgqq", "ql2>cba6fgjmjggq", "l2l>>>>>gnnnnngq", "llqqqqqqgoomoogq", "qqqqqqqgpooooopg", "qqqqqqqqgggggggq", "qqqqqqqqqqqqqqqq"}; tqsl-2.8.1/apps/extwizard.cpp0000644000175000017500000000437115003421124016170 0ustar rmurphyrmurphy/*************************************************************************** extwizard.cpp - description ------------------- begin : Thu Aug 7 2003 copyright : (C) 2003 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include "extwizard.h" #include "tqsltrace.h" BEGIN_EVENT_TABLE(ExtWizard, wxWizard) EVT_WIZARD_PAGE_CHANGED(-1, ExtWizard::OnPageChanged) END_EVENT_TABLE() void ExtWizard::OnPageChanged(wxWizardEvent& ev) { tqslTrace("ExtWizard::OnPageChanged", "Direction=%d", ev.GetDirection()); GetCurrentPage()->refresh(); GetCurrentPage()->SetFocus(); GetCurrentPage()->validate(); } void ExtWizard::ReportSize(const wxSize& size) { tqslTrace("ExtWizard::ReportSize", "size=%d %d", size.GetWidth(), size.GetHeight()); if (size.GetWidth() > _minsize.GetWidth()) _minsize.SetWidth(size.GetWidth()); if (size.GetHeight() > _minsize.GetHeight()) _minsize.SetHeight(size.GetHeight()); } ExtWizard::ExtWizard(wxWindow *parent, wxHtmlHelpController *help, const wxString& title) { tqslTrace("ExtWizard::ExtWizard", "parent=%lx, title=%s", reinterpret_cast(parent), S(title)); SetExtraStyle(wxWIZARD_EX_HELPBUTTON); Create(parent, wxID_ANY, title); _help = help; CenterOnParent(); } BEGIN_EVENT_TABLE(ExtWizard_Page, wxWizardPageSimple) EVT_WIZARD_HELP(-1, ExtWizard_Page::OnHelp) END_EVENT_TABLE() // FindWindowById(wxID_FORWARD,this->GetParent())->Hide()//Or->Disable() void ExtWizard_Page::check_valid(TQ_WXTEXTEVENT&) { tqslTrace("ExtWizard_Page::check_valid", NULL); validate(); } void ExtWizard_Page::AdjustPage(wxBoxSizer *sizer, const wxString& helpfile) { tqslTrace("ExtWizard_Page::AdjustPage", NULL); _helpfile = helpfile; if (!_helpfile.IsEmpty() && _parent->HaveHelp()) { FindWindowById(wxID_HELP, this->GetParent())->Enable(); // or Show() } else { FindWindowById(wxID_HELP, this->GetParent())->Disable(); // or Hide() } SetAutoLayout(TRUE); SetSizer(sizer); sizer->SetSizeHints(this); Layout(); _parent->ReportSize(sizer->CalcMin()); } tqsl-2.8.1/apps/extwizard.h0000644000175000017500000000430615003421124015633 0ustar rmurphyrmurphy/*************************************************************************** extwizard.h - description ------------------- begin : Thu Aug 7 2003 copyright : (C) 2003 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #ifndef __extwizard_h #define __extwizard_h #include #include "wxutil.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include #include class ExtWizard_Page; class ExtWizard : public wxWizard { public: explicit ExtWizard(wxWindow *parent, wxHtmlHelpController *help = 0, const wxString& title = wxEmptyString); #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Woverloaded-virtual" #endif ExtWizard_Page *GetCurrentPage() { return reinterpret_cast(wxWizard::GetCurrentPage()); } #ifdef __clang__ #pragma clang diagnostic pop #endif wxHtmlHelpController *GetHelp() { return _help; } void DisplayHelp(const wxString& file) { if (_help) _help->Display(file); } void ReportSize(const wxSize& size); void AdjustSize() { SetPageSize(_minsize); } bool HaveHelp() const { return _help != 0; } protected: void OnPageChanged(wxWizardEvent&); wxHtmlHelpController *_help; wxSize _minsize; DECLARE_EVENT_TABLE() }; class ExtWizard_Page : public wxWizardPageSimple { public: explicit ExtWizard_Page(ExtWizard *parent) : wxWizardPageSimple(parent), _parent(parent), _helpfile(wxT("")) { } virtual const char *validate() { return NULL; } // Returns error message string or NULL=no error virtual void refresh() { } // Updates page contents based on page-specific criteria void check_valid(TQ_WXTEXTEVENT&); protected: ExtWizard *_parent; void AdjustPage(wxBoxSizer *sizer, const wxString& helpfile = wxT("")); private: void OnHelp(wxWizardEvent&) { if (_helpfile != wxT("")) _parent->DisplayHelp(_helpfile); } wxString _helpfile; DECLARE_EVENT_TABLE(); }; #endif // __extwizard_h tqsl-2.8.1/apps/file_edit.xpm0000644000175000017500000002521715003421124016117 0ustar rmurphyrmurphy/* XPM */ static const char * file_edit_xpm[] = { "48 48 377 2", " c None", ". c #9E9E9E", "+ c #A8A8A8", "@ c #A9A9A9", "# c #ABABAB", "$ c #ACACAC", "% c #AAAAAA", "& c #A6A6A6", "* c #A4A4A4", "= c #A2A2A2", "- c #A0A0A0", "; c #9C9C9C", "> c #9A9A9A", ", c #989898", "' c #969696", ") c #949494", "! c #929292", "~ c #909090", "{ c #8E8E8E", "] c #8C8C8C", "^ c #8A8A8A", "/ c #888888", "( c #868686", "_ c #858585", ": c #878787", "< c #898989", "[ c #8B8B8B", "} c #848484", "| c #999999", "1 c #E7E7E7", "2 c #F6F6F6", "3 c #F5F5F5", "4 c #F4F4F4", "5 c #F3F3F3", "6 c #F2F2F2", "7 c #F1F1F1", "8 c #F0F0F0", "9 c #EFEFEF", "0 c #E1E1E1", "a c #808080", "b c #9D9D9D", "c c #E2E2E2", "d c #DEDEDE", "e c #DFDFDF", "f c #E5E5E5", "g c #E0E0E0", "h c #E3E3E3", "i c #E4E4E4", "j c #E6E6E6", "k c #EDEDED", "l c #DDDDDD", "m c #9B9B9B", "n c #EEEEEE", "o c #BFBFBF", "p c #BBBBBB", "q c #BCBCBC", "r c #BDBDBD", "s c #BEBEBE", "t c #979797", "u c #E8E8E8", "v c #E9E9E9", "w c #EAEAEA", "x c #919191", "y c #C1C1C1", "z c #C0C0C0", "A c #EBEBEB", "B c #838383", "C c #8F8F8F", "D c #8D8D8D", "E c #D4D4D4", "F c #DCDCDC", "G c #ECECEC", "H c #E2E1DE", "I c #828281", "J c #B8B8B8", "K c #E8E8E7", "L c #BFB7A6", "M c #85714B", "N c #684B1C", "O c #5E4310", "P c #E5E4E2", "Q c #ADA18A", "R c #7C5F32", "S c #C98A75", "T c #ED867F", "U c #D75E4E", "V c #734313", "W c #E3E0DD", "X c #A09276", "Y c #7D5D30", "Z c #E5988A", "` c #FF8686", " . c #FF5F5F", ".. c #FE3838", "+. c #C33419", "@. c #5C410C", "#. c #C3C3C3", "$. c #B8B5AF", "%. c #8F7E5D", "&. c #86683E", "*. c #E8A293", "=. c #F98181", "-. c #FF5454", ";. c #FD2E2E", ">. c #EB1919", ",. c #C41812", "'. c #61410C", "). c #C2C2C2", "!. c #AFAAA0", "~. c #7C6843", "{. c #90744C", "]. c #DEC298", "^. c #EFCF9D", "/. c #EDAF89", "(. c #F33E39", "_. c #E31717", ":. c #C41010", "<. c #9C1E0D", "[. c #5D400C", "}. c #828282", "|. c #AAA396", "1. c #745F35", "2. c #96753A", "3. c #DBB88B", "4. c #E5C394", "5. c #F1CE94", "6. c #F1CD8F", "7. c #DC7E5E", "8. c #BC0F0F", "9. c #9B1A0B", "0. c #6C3A0C", "a. c #ECEBEA", "b. c #BCB3A2", "c. c #745C2E", "d. c #A48241", "e. c #DCB671", "f. c #DDB771", "g. c #D6A651", "h. c #DCAA6B", "i. c #F0CA89", "j. c #DBA26A", "k. c #8F1D0A", "l. c #673F0C", "m. c #7E7E7E", "n. c #EAE9E7", "o. c #B4A994", "p. c #755C2B", "q. c #B38F4E", "r. c #DDB772", "s. c #DDB670", "t. c #D3A044", "u. c #CB9023", "v. c #C9913E", "w. c #E2B97C", "x. c #A1784D", "y. c #5E4011", "z. c #7C7C7C", "A. c #E6E5E2", "B. c #A79A7F", "C. c #765B26", "D. c #C09C59", "E. c #DCB56C", "F. c #D09C3A", "G. c #CB9022", "H. c #C98E21", "I. c #A27124", "J. c #8E683C", "K. c #715A31", "L. c #585247", "M. c #7A7A7A", "N. c #C4C4C4", "O. c #B9B6B0", "P. c #8C7D5E", "Q. c #7B5E26", "R. c #CBA662", "S. c #DBB266", "T. c #CE9731", "U. c #C58B21", "V. c #966A18", "W. c #6B4C12", "X. c #88744F", "Y. c #CDC8BF", "Z. c #606060", "`. c #787878", " + c #B2ADA5", ".+ c #7F6D4A", "++ c #83652B", "@+ c #D2AD69", "#+ c #D9AE5F", "$+ c #CD942B", "%+ c #CA8F21", "&+ c #C08820", "*+ c #8B6216", "=+ c #6B4E16", "-+ c #958564", ";+ c #E1DDD7", ">+ c #777777", ",+ c #D6D6D6", "'+ c #C2C2C1", ")+ c #AEA99D", "!+ c #76623A", "~+ c #917135", "{+ c #D8B26D", "]+ c #DEB873", "^+ c #D7AA56", "/+ c #CC9226", "(+ c #B9831F", "_+ c #825C15", ":+ c #694E1B", "<+ c #A6987D", "[+ c #E8E6E2", "}+ c #747474", "|+ c #D2D2D2", "1+ c #EDEDEC", "2+ c #C1B9A9", "3+ c #766033", "4+ c #9F7E40", "5+ c #DBB570", "6+ c #D4A44B", "7+ c #CA8F22", "8+ c #AF7C1D", "9+ c #785513", "0+ c #6F5626", "a+ c #B8AD99", "b+ c #EDECEA", "c+ c #616161", "d+ c #737373", "e+ c #ECEBE9", "f+ c #BAB09C", "g+ c #786031", "h+ c #AD8B4B", "i+ c #DCB56E", "j+ c #D29F41", "k+ c #C88E21", "l+ c #A5741B", "m+ c #725112", "n+ c #796336", "o+ c #C6BEAE", "p+ c #F1F0EF", "q+ c #717171", "r+ c #E6E4E1", "s+ c #ADA189", "t+ c #745A28", "u+ c #BB9856", "v+ c #DCB46B", "w+ c #D09B38", "x+ c #C78D21", "y+ c #996D19", "z+ c #6B4C11", "A+ c #7F6B44", "B+ c #D1CBC0", "C+ c #F4F4F3", "D+ c #6F6F6F", "E+ c #C5C5C5", "F+ c #BAB8B3", "G+ c #908165", "H+ c #785C27", "I+ c #C8A361", "J+ c #DAB165", "K+ c #CE962F", "L+ c #C28920", "M+ c #8E6417", "N+ c #694B14", "O+ c #816F4D", "P+ c #B8B5AD", "Q+ c #6D6D6D", "R+ c #BBBAB7", "S+ c #867657", "T+ c #81642C", "U+ c #CFAA67", "V+ c #D8AD5C", "W+ c #CC942A", "X+ c #BA841F", "Y+ c #845D15", "Z+ c #684D18", "`+ c #8C7E61", " @ c #6B6B6B", ".@ c #C1C0C0", "+@ c #A29988", "@@ c #755D29", "#@ c #D7C58E", "$@ c #DFC181", "%@ c #D6A852", "&@ c #CB9226", "*@ c #B37F1E", "=@ c #7B5713", "-@ c #6B5120", ";@ c #9D917B", ">@ c #BFBEBB", ",@ c #696969", "'@ c #DCD9D4", ")@ c #7E6A42", "!@ c #B5A16A", "~@ c #E5DCAE", "{@ c #E4D9A8", "]@ c #D5AF5B", "^@ c #C98F22", "/@ c #A8771C", "(@ c #765F32", "_@ c #C3BAA8", ":@ c #F0EFEE", "<@ c #F7F7F7", "[@ c #676767", "}@ c #ECECEB", "|@ c #AEA28B", "1@ c #826830", "2@ c #DFCE95", "3@ c #E2D39D", "4@ c #E1D098", "5@ c #DDC583", "6@ c #A17522", "7@ c #6E4E12", "8@ c #826D44", "9@ c #D0C9BC", "0@ c #F8F8F8", "a@ c #F9F9F9", "b@ c #656565", "c@ c #D6D1C9", "d@ c #7B6438", "e@ c #BFA564", "f@ c #DEC787", "g@ c #DEC888", "h@ c #DCC483", "i@ c #BB9F5D", "j@ c #74581D", "k@ c #8E7B58", "l@ c #DCD8CF", "m@ c #F5F5F4", "n@ c #636363", "o@ c #EAE9E8", "p@ c #9D8D70", "q@ c #786643", "r@ c #A28C59", "s@ c #C8AB64", "t@ c #A68947", "u@ c #7D6129", "v@ c #7F693F", "w@ c #A79B82", "x@ c #DCDAD4", "y@ c #C4BDB0", "z@ c #6B552A", "A@ c #322A1A", "B@ c #423111", "C@ c #745B2A", "D@ c #887653", "E@ c #ACA290", "F@ c #C8C5C0", "G@ c #D4D3D3", "H@ c #D5D5D5", "I@ c #D7D7D7", "J@ c #D9D9D9", "K@ c #DBDBDB", "L@ c #5F5F5F", "M@ c #DCDBD7", "N@ c #897854", "O@ c #5D4516", "P@ c #705C36", "Q@ c #9A8D73", "R@ c #BFB9AE", "S@ c #CFCECC", "T@ c #D3D3D3", "U@ c #D1D1D1", "V@ c #CFCFCF", "W@ c #CDCDCD", "X@ c #CCCCCC", "Y@ c #DADADA", "Z@ c #5D5D5D", "`@ c #C8C1B4", " # c #9B8C6E", ".# c #BCB3A1", "+# c #DDDBD5", "@# c #E9E8E8", "## c #535353", "$# c #E6E4E2", "%# c #E7E6E5", "&# c #555555", "*# c #545454", " ", " ", " ", " . + @ # $ $ # % + & * = - . ; > , ' ) ! ~ { ] ^ / ( _ : < [ ] ] ^ } ", " | 1 2 3 3 2 2 2 2 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 8 8 8 8 8 9 9 0 a ", " b 6 c d e e f 0 g 0 0 0 c c c h h h h i i i i i i i i i i i i i i j k ( ", " b 6 0 l d d i g e g g 0 0 0 c c c c h h h h h h h i i i i h h h h f k ( ", " ; 6 c d d e f g g g 0 0 c c c h h h h i i i i i i i i i i i i i i j k _ ", " m 6 c d e e f 0 0 0 0 c c h h h i i i i f f f f f f f f f f f f f j n _ ", " > 6 h e e g j 0 0 e o p q q q q q q r r r r r r r r r r r s f f f 1 n _ ", " | 6 h e g g j c c e s p p q q q q q q r r r r r r r r r r r f j j 1 n _ ", " t 6 h g g 0 1 c c g o q q q q q q r r r r r r r r r r r r r j 1 1 u n } ", " ' 7 i g 0 0 1 h h h h h i i f f f j j j j j j 1 1 1 1 1 1 1 1 1 1 v n } ", " ) 7 i 0 0 c u h h i i f f j j j 1 1 1 u u u u u u v v v u u u u u v n } ", " ! 7 i 0 c c u i i i f f j j 1 1 1 u u u v v v v v v v v v v v v v w n } ", " x 7 f c c h u i i c y r r s s s s s o o o o o z z z z z z z v v v A n B ", " C 7 f c h h u f f c z r r r s s s s s s o o o o o o o o o o v w w A n B ", " D 8 j E F i v f j h y r r s s s s o o o o o o o o o o o o o w A A G H I ", " [ 8 j J l f v j j j j 1 1 1 u u v v v w w w w A A A A A A A A A K L M N O ", " < 9 j c G f w j j 1 1 u v v v w w A A A G G G G k k k k k k G P Q R S T U V ", " / 9 1 i f f w 1 1 1 u v v w w w A A G G G k k k k k k k k k W X Y Z ` ...+.@. ", " ( 9 1 i f f A 1 1 f #.o z z z z z z y y y y y y y y y y y $.%.&.*.=.-.;.>.,.'. ", " } 9 1 f f j A u u f ).o o o o o o z z z z z z z y y y z !.~.{.].^./.(._.:.<.[. ", " }.9 u f j j A u u j #.o o o o o z z z z z y y y y y y |.1.2.3.4.5.6.7.8.9.0. ", " a n u f j 1 G u v v v v w w A A G k k k n n n 9 9 a.b.c.d.e.f.g.h.i.j.k.l. ", " m.n u j j 1 G v v w w A A G k k n n 9 9 8 8 8 8 n.o.p.q.r.s.t.u.v.w.x.y. ", " z.n u j 1 1 G v v w A A G G k n n 9 9 8 8 7 7 A.B.C.D.r.E.F.G.H.I.J.K.L. ", " M.n u j 1 u G v w 1 N.z z y y y ).).).#.#.).O.P.Q.R.r.S.T.G.U.V.W.X.Y.Z. ", " `.k u j 1 u G w w 1 #.o o z z z y y y ).y +.+++@+r.#+$+%+&+*+=+-+;+k Z. ", " >+k v p ,+u G w w u #.o z z z y y y ).'+)+!+~+{+]+^+/+G.(+_+:+<+[+6 k Z. ", " }+G v |+k v k w w A A A G k k n 9 9 1+2+3+4+5+f.6+u.7+8+9+0+a+b+5 5 k c+ ", " d+G v 1 v v k w A A G k k n 9 8 8 e+f+g+h+r.i+j+G.k+l+m+n+o+p+4 5 5 k c+ ", " q+G v 1 u v k w A A G k n n 9 8 r+s+t+u+]+v+w+G.x+y+z+A+B+C+3 4 4 5 k c+ ", " D+G v 1 u v k A A v E+y y ).).F+G+H+I+r.J+K+G.L+M+N+O+P+E+E+4 3 4 4 k c+ ", " Q+G v 1 u v k A A u N.z z y R+S+T+U+r.V+W+%+X+Y+Z+`+F+N.N.N.4 3 4 4 k c+ ", " @A v 1 u v k A A v N.z z .@+@@@#@$@%@&@G.*@=@-@;@>@E+E+N.N.3 3 3 4 k c+ ", " ,@w v 1 u v k A A G G G k '@)@!@~@{@]@^@/@m+(@_@:@<@<@<@2 2 2 3 3 4 k c+ ", " [@w v 1 u v k A A G k n }@|@1@2@3@4@5@6@7@8@9@C+<@0@a@a@0@<@2 3 3 4 k c+ ", " b@w v 1 u v k A A G k n c@d@e@f@g@h@i@j@k@l@m@<@<@0@0@0@0@<@2 3 3 4 k c+ ", " n@w v 1 u v k A A G k o@p@q@r@s@t@u@v@w@x@k n 9 8 7 6 6 5 4 4 4 4 4 k c+ ", " c+w v 1 u v k A A w j y@z@A@B@C@D@E@F@G@H@H@H@I@J@K@l g c i j v A k w Z. ", " L@v v 1 u v k A A v M@N@O@P@Q@R@S@T@U@V@W@X@W@V@U@E I@Y@l g c f u w 1 L@ ", " Z@v w v v w n G G G `@ #.#+#@#u j f i i i i i f j 1 v w G k n 8 7 6 k c+ ", " ##E G G G G k G G G $#%#G k k k k k k k k k k k k k k k k k k k k k Y@&# ", " *#Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+&# ", " ", " ", " "}; tqsl-2.8.1/apps/file_edit_dis.xpm0000644000175000017500000001676315003421124016764 0ustar rmurphyrmurphy/* XPM */ static const char * file_edit_dis_xpm[] = { "48 48 175 2", " c None", ". c #9E9E9E", "+ c #A8A8A8", "@ c #A9A9A9", "# c #ABABAB", "$ c #ACACAC", "% c #AAAAAA", "& c #A6A6A6", "* c #A4A4A4", "= c #A2A2A2", "- c #A0A0A0", "; c #9C9C9C", "> c #9A9A9A", ", c #989898", "' c #969696", ") c #949494", "! c #929292", "~ c #909090", "{ c #8E8E8E", "] c #8C8C8C", "^ c #8A8A8A", "/ c #888888", "( c #868686", "_ c #858585", ": c #878787", "< c #898989", "[ c #8B8B8B", "} c #848484", "| c #999999", "1 c #E7E7E7", "2 c #F6F6F6", "3 c #F5F5F5", "4 c #F4F4F4", "5 c #F3F3F3", "6 c #F2F2F2", "7 c #F1F1F1", "8 c #F0F0F0", "9 c #EFEFEF", "0 c #E1E1E1", "a c #808080", "b c #9D9D9D", "c c #E2E2E2", "d c #DEDEDE", "e c #DFDFDF", "f c #E5E5E5", "g c #E0E0E0", "h c #E3E3E3", "i c #E4E4E4", "j c #E6E6E6", "k c #EDEDED", "l c #DDDDDD", "m c #9B9B9B", "n c #EEEEEE", "o c #BFBFBF", "p c #BBBBBB", "q c #BCBCBC", "r c #BDBDBD", "s c #BEBEBE", "t c #979797", "u c #E8E8E8", "v c #E9E9E9", "w c #EAEAEA", "x c #919191", "y c #C1C1C1", "z c #C0C0C0", "A c #EBEBEB", "B c #838383", "C c #8F8F8F", "D c #8D8D8D", "E c #D4D4D4", "F c #DCDCDC", "G c #ECECEC", "H c #828282", "I c #B8B8B8", "J c #B7B7B7", "K c #737373", "L c #4E4E4E", "M c #454545", "N c #626262", "O c #777777", "P c #4A4A4A", "Q c #939393", "R c #616161", "S c #A7A7A7", "T c #818181", "U c #505050", "V c #434343", "W c #C3C3C3", "X c #B5B5B5", "Y c #7F7F7F", "Z c #6B6B6B", "` c #B0B0B0", " . c #787878", ".. c #5A5A5A", "+. c #464646", "@. c #3C3C3C", "#. c #444444", "$. c #C2C2C2", "%. c #6A6A6A", "&. c #C5C5C5", "*. c #D2D2D2", "=. c #B9B9B9", "-. c #646464", ";. c #424242", ">. c #363636", ",. c #383838", "'. c #606060", "). c #C7C7C7", "!. c #D1D1D1", "~. c #D0D0D0", "{. c #343434", "]. c #414141", "^. c #B4B4B4", "/. c #5E5E5E", "(. c #BABABA", "_. c #CDCDCD", ":. c #7E7E7E", "<. c #959595", "[. c #7C7C7C", "}. c #5D5D5D", "|. c #9F9F9F", "1. c #767676", "2. c #6D6D6D", "3. c #5C5C5C", "4. c #525252", "5. c #7A7A7A", "6. c #C4C4C4", "7. c #B6B6B6", "8. c #C8C8C8", "9. c #ADADAD", "0. c #6E6E6E", "a. c #676767", "b. c #B1B1B1", "c. c #656565", "d. c #D6D6D6", "e. c #636363", "f. c #AEAEAE", "g. c #5F5F5F", "h. c #747474", "i. c #585858", "j. c #A3A3A3", "k. c #535353", "l. c #717171", "m. c #707070", "n. c #6C6C6C", "o. c #CBCBCB", "p. c #6F6F6F", "q. c #4D4D4D", "r. c #666666", "s. c #4F4F4F", "t. c #696969", "u. c #D9D9D9", "v. c #A1A1A1", "w. c #DBDBDB", "x. c #D8D8D8", "y. c #7B7B7B", "z. c #F7F7F7", "A. c #CACACA", "B. c #F8F8F8", "C. c #F9F9F9", "D. c #7D7D7D", "E. c #DADADA", "F. c #575757", "G. c #2B2B2B", "H. c #323232", "I. c #D3D3D3", "J. c #D5D5D5", "K. c #D7D7D7", "L. c #797979", "M. c #474747", "N. c #CECECE", "O. c #CFCFCF", "P. c #CCCCCC", "Q. c #555555", "R. c #545454", " ", " ", " ", " . + @ # $ $ # % + & * = - . ; > , ' ) ! ~ { ] ^ / ( _ : < [ ] ] ^ } ", " | 1 2 3 3 2 2 2 2 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 8 8 8 8 8 9 9 0 a ", " b 6 c d e e f 0 g 0 0 0 c c c h h h h i i i i i i i i i i i i i i j k ( ", " b 6 0 l d d i g e g g 0 0 0 c c c c h h h h h h h i i i i h h h h f k ( ", " ; 6 c d d e f g g g 0 0 c c c h h h h i i i i i i i i i i i i i i j k _ ", " m 6 c d e e f 0 0 0 0 c c h h h i i i i f f f f f f f f f f f f f j n _ ", " > 6 h e e g j 0 0 e o p q q q q q q r r r r r r r r r r r s f f f 1 n _ ", " | 6 h e g g j c c e s p p q q q q q q r r r r r r r r r r r f j j 1 n _ ", " t 6 h g g 0 1 c c g o q q q q q q r r r r r r r r r r r r r j 1 1 u n } ", " ' 7 i g 0 0 1 h h h h h i i f f f j j j j j j 1 1 1 1 1 1 1 1 1 1 v n } ", " ) 7 i 0 0 c u h h i i f f j j j 1 1 1 u u u u u u v v v u u u u u v n } ", " ! 7 i 0 c c u i i i f f j j 1 1 1 u u u v v v v v v v v v v v v v w n } ", " x 7 f c c h u i i c y r r s s s s s o o o o o z z z z z z z v v v A n B ", " C 7 f c h h u f f c z r r r s s s s s s o o o o o o o o o o v w w A n B ", " D 8 j E F i v f j h y r r s s s s o o o o o o o o o o o o o w A A G 0 H ", " [ 8 j I l f v j j j j 1 1 1 u u v v v w w w w A A A A A A A A A u J K L M ", " < 9 j c G f w j j 1 1 u v v v w w A A A G G G G k k k k k k G i = N ' m O P ", " / 9 1 i f f w 1 1 1 u v v w w w A A G G G k k k k k k k k k g Q R S - T N U V ", " ( 9 1 i f f A 1 1 f W o z z z z z z y y y y y y y y y y y X Y Z ` m ...+.@.#. ", " } 9 1 f f j A u u f $.o o o o o o z z z z z z z y y y z % %.O &.*.=.-.;.>.,.;. ", " H 9 u f j j A u u j W o o o o o z z z z z y y y y y y * '. .q ).!.~.~ {.{.]. ", " a n u f j 1 G u v v v v w w A A G k k k n n n 9 9 A ^./._ =.(.% ` _.% {.#. ", " :.n u j j 1 G v v w w A A G k k n n 9 9 8 8 8 8 v % /.! (.=.* <.t r :.V ", " [.n u j 1 1 G v v w A A G G k n n 9 9 8 8 7 7 f m }.|.(.I - <.Q 1.2.3.4. ", " 5.n u j 1 u G v w 1 6.z z y y y $.$.$.W W $.7.:.'.@ (.X m <.~ 2.L 1.8.'. ", " .k u j 1 u G w w 1 W o o z z z y y y $.y 9.0.a.` (.b.| ) ] c.U ( l k '. ", " O k v p d.u G w w u W o z z z y y y $.$.@ e.K X p f.t <.: g.U | j 6 k '. ", " h.G v *.k v k w w A A A G k k n 9 9 k (.R T I (.+ <.) a i.i.f.G 5 5 k R ", " K G v 1 v v k w A A G k k n 9 8 8 A b.N { (.I j.<.! .k.-.o 8 4 5 5 k R ", " l.G v 1 u v k w A A G k n n 9 8 i = 3.m p J |.<.! m.L n.o.4 3 4 4 5 k R ", " p.G v 1 u v k A A v &.y y $.$.I H /.& (.^.> <.{ a.q.m.X &.&.4 3 4 4 k R ", " 2.G v 1 u v k A A u 6.z z y (.O r.9.(.` , ) / '.s.Y I 6.6.6.4 3 4 4 k R ", " Z A v 1 u v k A A v 6.z z z > /.&.W $ ' <.B ..k.! s &.&.6.6.3 3 3 4 k R ", " t.w v 1 u v k A A G G G k u.Z v.w.x.b.Q y.k.R p 9 z.z.z.2 2 2 3 3 4 k R ", " a.w v 1 u v k A A G k n G j.t._.*.~.&. .U p.A.4 z.B.C.C.B.z.2 3 3 4 k R ", " c.w v 1 u v k A A G k n !.r.& ).8.6.- ..D.x.3 z.z.B.B.B.B.z.2 3 3 4 k R ", " e.w v 1 u v k A A G k v { a.D $ ^ e.Z ; E.k n 9 8 7 6 6 5 4 4 4 4 4 k R ", " R w v 1 u v k A A w j s F.G.H.}.O j.&.I.J.J.J.K.u.w.l g c i j v A k w '. ", " g.v v 1 u v k A A v w.L.M./.{ =.N.I.!.O._.P._.O.!.E K.E.l g c f u w 1 g. ", " }.v w v v w n G G G $.D ^.w.u u j f i i i i i f j 1 v w G k n 8 7 6 k R ", " k.E G G G G k G G G i j G k k k k k k k k k k k k k k k k k k k k k E.Q. ", " R.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.R R R R R R R R R R R R R R R R Q. ", " ", " ", " "}; tqsl-2.8.1/apps/folder.xpm0000644000175000017500000000117215003421124015440 0ustar rmurphyrmurphy/* XPM */ static const char * folder_xpm[] = { "16 16 17 1", " c None", ". c #56560E", "+ c #FEFEFE", "@ c #8A8A7A", "# c #8E8E02", "$ c #92920E", "% c #EEEEEE", "& c #CACA02", "* c #5E5E32", "= c #FEFE02", "- c #66664A", "; c #6A6A52", "> c #828202", ", c #828222", "' c #818154", ") c #828232", "! c #F6F6F6", "++++++++++++++++", "++++++++++++++++", "!.>>>>@+++++++++", "-&====$,,,,,,,,'", ")=============='", ")=============='", ")=============='", ")=============='", ")=============='", ")=============='", ")=============='", ")=============='", "*$$$$$$$$$$$$##;", "%%%%%%%%%%%%%%%!", "++++++++++++++++", "++++++++++++++++"}; tqsl-2.8.1/apps/getpassword.cpp0000644000175000017500000002121415003421124016504 0ustar rmurphyrmurphy/*************************************************************************** getpassword.cpp - description ------------------- begin : Tue Aug 5 2003 copyright : (C) 2003 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include "getpassword.h" #include "tqsltrace.h" #include "wxutil.h" #define GPW_ID_LOW 6400 #define GPW_ID_PW1 GPW_ID_LOW #define GPW_ID_PW2 GPW_ID_LOW+1 #define GPW_ID_OK GPW_ID_LOW+2 #define GPW_ID_CAN GPW_ID_LOW+3 #define GPW_ID_HELP GPW_ID_LOW+4 #define GPW_ID_OK2 GPW_ID_LOW+5 #define GPW_ID_UN GPW_ID_LOW+6 #define GPW_ID_PW3 GPW_ID_LOW+7 #define GPW_ID_OK3 GPW_ID_LOW+8 #define GPW_ID_CAN2 GPW_ID_LOW+9 #define GPW_ID_HELP2 GPW_ID_LOW+10 BEGIN_EVENT_TABLE(GetPasswordDialog, wxDialog) EVT_BUTTON(GPW_ID_OK, GetPasswordDialog::OnOk) EVT_BUTTON(GPW_ID_CAN, GetPasswordDialog::OnCancel) EVT_BUTTON(GPW_ID_HELP, GetPasswordDialog::OnHelp) END_EVENT_TABLE() GetPasswordDialog::GetPasswordDialog(wxWindow *parent, const wxString& title, const wxString& message, wxHtmlHelpController *help, wxString helpfile) : wxDialog(parent, -1, title), _help(help), _helpfile(helpfile) { tqslTrace("GetPassword::GetPasswordDialog", "parent=%lx, title=%s, message=%s", reinterpret_cast(parent), S(title), S(helpfile)); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxSize sz = getTextSize(this); int em_w = sz.GetWidth(); wxStaticText *st = new wxStaticText(this, -1, message); st->Wrap(em_w * 40); sizer->Add(st, 1, wxALL|wxEXPAND, 10); _pw = new wxTextCtrl(this, GPW_ID_PW1, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD); sizer->Add(_pw, 0, wxLEFT|wxRIGHT|wxEXPAND, 10); wxBoxSizer *butsizer = new wxBoxSizer(wxHORIZONTAL); wxButton *okButton = new wxButton(this, GPW_ID_OK, _("OK")); butsizer->Add(okButton, 0, 0, 0); okButton->SetDefault(); butsizer->Add(new wxButton(this, GPW_ID_CAN, _("Cancel")), 0, wxLEFT, 20); if (_help && !_helpfile.IsEmpty()) butsizer->Add(new wxButton(this, GPW_ID_HELP, _("Help")), 0, wxLEFT, 20); sizer->Add(butsizer, 0, wxALL|wxALIGN_CENTER, 10); SetAutoLayout(TRUE); SetSizer(sizer); sizer->Fit(this); sizer->SetSizeHints(this); CentreOnParent(); } bool GetPasswordDialog::TransferDataFromWindow() { tqslTrace("GetPasswordDialog::TransferDataFromWindow", NULL); _password = _pw->GetValue(); return true; } void GetPasswordDialog::OnOk(wxCommandEvent&) { tqslTrace("GetPasswordDialog::OnOk", NULL); if (TransferDataFromWindow()) EndModal(wxID_OK); } void GetPasswordDialog::OnCancel(wxCommandEvent&) { tqslTrace("GetPasswordDialog::OnCancel", NULL); EndModal(wxID_CANCEL); } void GetPasswordDialog::OnHelp(wxCommandEvent&) { tqslTrace("GetPasswordDialog::OnHelp", NULL); if (_help && !_helpfile.IsEmpty()) _help->Display(_helpfile); } BEGIN_EVENT_TABLE(GetNewPasswordDialog, wxDialog) EVT_TEXT(GPW_ID_PW1, GetNewPasswordDialog::PWChange) EVT_TEXT(GPW_ID_PW2, GetNewPasswordDialog::PWChange) EVT_BUTTON(GPW_ID_OK, GetNewPasswordDialog::OnOk) EVT_BUTTON(GPW_ID_CAN, GetNewPasswordDialog::OnCancel) EVT_BUTTON(GPW_ID_HELP, GetNewPasswordDialog::OnHelp) END_EVENT_TABLE() GetNewPasswordDialog::GetNewPasswordDialog(wxWindow *parent, const wxString& title, const wxString& message, bool blankok, wxHtmlHelpController *help, wxString helpfile) : wxDialog(parent, -1, title), _blankok(blankok), _help(help), _helpfile(helpfile) { tqslTrace("GetNewPasswordDialog::GetNewPasswordDialog", "parent=%lx, title=%s, message=%s, blankok=%d", reinterpret_cast(parent), S(title), S(message)); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxSize sz = getTextSize(this); int em_w = sz.GetWidth(); wxStaticText *st = new wxStaticText(this, -1, message); st->Wrap(em_w * 40); sizer->Add(st, 1, wxALL|wxEXPAND, 10); sizer->Add(new wxStaticText(this, -1, _("New passphrase:")), 0, wxLEFT|wxRIGHT, 10); _pw1 = new wxTextCtrl(this, GPW_ID_PW1, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD); sizer->Add(_pw1, 0, wxLEFT|wxRIGHT|wxEXPAND, 10); sizer->Add(new wxStaticText(this, -1, _("Enter again to confirm:")), 0, wxLEFT|wxRIGHT, 10); _pw2 = new wxTextCtrl(this, GPW_ID_PW2, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD); sizer->Add(_pw2, 0, wxLEFT|wxRIGHT|wxEXPAND, 10); _pwstatus = new wxStaticText(this, -1, wxT("")); sizer->Add(_pwstatus, 0, wxALL|wxEXPAND, 10); wxBoxSizer *butsizer = new wxBoxSizer(wxHORIZONTAL); _okbut = new wxButton(this, GPW_ID_OK, _("OK")); _okbut->Enable(_blankok); butsizer->Add(_okbut, 0, 0, 0); butsizer->Add(new wxButton(this, GPW_ID_CAN, _("Cancel")), 0, wxLEFT, 20); if (_help && !_helpfile.IsEmpty()) butsizer->Add(new wxButton(this, GPW_ID_HELP, _("Help")), 0, wxLEFT, 20); sizer->Add(butsizer, 0, wxALL|wxALIGN_CENTER, 10); SetAutoLayout(TRUE); SetSizer(sizer); sizer->Fit(this); sizer->SetSizeHints(this); CentreOnParent(); } void GetNewPasswordDialog::PWChange(wxCommandEvent&) { tqslTrace("GetNewPasswordDialog::PWChange", NULL); _password = wxT(""); wxString pw1 = _pw1->GetValue(); wxString pw2 = _pw2->GetValue(); if (pw1 != pw2) { _pwstatus->SetLabel(_("Passphrase entries do not match")); _okbut->Enable(false); return; } if (!_blankok && pw1.IsEmpty()) { _pwstatus->SetLabel(wxT("")); _okbut->Enable(false); return; } _password = pw1; if (!pw1.IsEmpty()) _pwstatus->SetLabel(_("Passphrase confirmed")); _okbut->Enable(true); _okbut->SetDefault(); } void GetNewPasswordDialog::OnOk(wxCommandEvent&) { tqslTrace("GetNewPasswordDialog::OnOk", NULL); EndModal(wxID_OK); } void GetNewPasswordDialog::OnCancel(wxCommandEvent&) { tqslTrace("GetNewPasswordDialog::OnCancel", NULL); EndModal(wxID_CANCEL); } void GetNewPasswordDialog::OnHelp(wxCommandEvent&) { tqslTrace("GetNewPasswordDialog::OnHelp", NULL); if (_help && !_helpfile.IsEmpty()) _help->Display(_helpfile); } BEGIN_EVENT_TABLE(GetUserAndPasswordDialog, wxDialog) EVT_BUTTON(GPW_ID_OK3, GetUserAndPasswordDialog::OnOk) EVT_BUTTON(GPW_ID_CAN2, GetUserAndPasswordDialog::OnCancel) EVT_BUTTON(GPW_ID_HELP2, GetUserAndPasswordDialog::OnHelp) END_EVENT_TABLE() GetUserAndPasswordDialog::GetUserAndPasswordDialog(wxWindow *parent, const wxString& title, const wxString& message, wxHtmlHelpController *help, wxString helpfile) : wxDialog(parent, -1, title), _help(help), _helpfile(helpfile) { tqslTrace("GetUserAndPassword::GetUserAndPasswordDialog", "parent=%lx, title=%s, message=%s", reinterpret_cast(parent), S(title), S(helpfile)); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxSize sz = getTextSize(this); int em_w = sz.GetWidth(); wxStaticText *st = new wxStaticText(this, -1, message); st->Wrap(em_w * 40); sizer->Add(st, 1, wxALL|wxEXPAND, 10); wxBoxSizer *userSizer = new wxBoxSizer(wxHORIZONTAL); userSizer->Add(new wxStaticText(this, -1, _("LoTW Username:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTRE, 10); _un = new wxTextCtrl(this, GPW_ID_UN, wxT(""), wxDefaultPosition, wxSize(em_w * 15, -1)); userSizer->Add(_un, 0, wxLEFT|wxRIGHT, 10); sizer->Add(userSizer); wxBoxSizer *pwdSizer = new wxBoxSizer(wxHORIZONTAL); pwdSizer->Add(new wxStaticText(this, -1, _("LoTW Password:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTRE, 10); _pw = new wxTextCtrl(this, GPW_ID_PW3, wxT(""), wxDefaultPosition, wxSize(em_w*15, -1), wxTE_PASSWORD); pwdSizer->Add(_pw, 0, wxLEFT|wxRIGHT, 10); sizer->Add(pwdSizer); wxBoxSizer *butsizer = new wxBoxSizer(wxHORIZONTAL); wxButton *okButton = new wxButton(this, GPW_ID_OK3, _("OK")); butsizer->Add(okButton, 0, 0, 0); okButton->SetDefault(); butsizer->Add(new wxButton(this, GPW_ID_CAN2, _("Cancel")), 0, wxLEFT, 200); if (_help && !_helpfile.IsEmpty()) butsizer->Add(new wxButton(this, GPW_ID_HELP2, _("Help")), 0, wxLEFT, 20); sizer->Add(butsizer, 0, wxALL|wxALIGN_CENTER, 10); SetAutoLayout(TRUE); SetSizer(sizer); sizer->Fit(this); sizer->SetSizeHints(this); CentreOnParent(); } bool GetUserAndPasswordDialog::TransferDataFromWindow() { tqslTrace("GetUserAndPasswordDialog::TransferDataFromWindow", NULL); _username = _un->GetValue(); _password = _pw->GetValue(); return true; } void GetUserAndPasswordDialog::OnOk(wxCommandEvent&) { tqslTrace("GetUserAndPasswordDialog::OnOk", NULL); if (TransferDataFromWindow()) EndModal(wxID_OK); } void GetUserAndPasswordDialog::OnCancel(wxCommandEvent&) { tqslTrace("GetUserAndPasswordDialog::OnCancel", NULL); EndModal(wxID_CANCEL); } void GetUserAndPasswordDialog::OnHelp(wxCommandEvent&) { tqslTrace("GetUserAndPasswordDialog::OnHelp", NULL); if (_help && !_helpfile.IsEmpty()) _help->Display(_helpfile); } tqsl-2.8.1/apps/getpassword.h0000644000175000017500000000506515003421124016157 0ustar rmurphyrmurphy/*************************************************************************** getpassword.h - description ------------------- begin : Tue Aug 5 2003 copyright : (C) 2003 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __getpassword_h #define __getpassword_h #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include class GetPasswordDialog : public wxDialog { public: GetPasswordDialog(wxWindow *parent, const wxString& title = _("Enter passphrase"), const wxString& message = _("Enter passphrase"), wxHtmlHelpController *help = 0, wxString helpfile = wxT("")); wxString Password() { return _password; } virtual bool TransferDataFromWindow(); private: void OnOk(wxCommandEvent&); void OnCancel(wxCommandEvent&); void OnHelp(wxCommandEvent&); wxHtmlHelpController *_help; wxString _helpfile; wxString _password; wxTextCtrl *_pw; DECLARE_EVENT_TABLE() }; class GetNewPasswordDialog : public wxDialog { public: GetNewPasswordDialog(wxWindow *parent, const wxString& title = _("New passphrase"), const wxString& message = _("Enter new passphrase"), bool blankok = false, wxHtmlHelpController *help = 0, wxString helpfile = wxT("")); wxString Password() { return _password; } private: void PWChange(wxCommandEvent&); void OnOk(wxCommandEvent&); void OnCancel(wxCommandEvent&); void OnHelp(wxCommandEvent&); bool _blankok; wxHtmlHelpController *_help; wxString _helpfile; wxString _password; wxTextCtrl *_pw1, *_pw2; wxButton *_okbut; wxStaticText *_pwstatus; DECLARE_EVENT_TABLE() }; class GetUserAndPasswordDialog : public wxDialog { public: GetUserAndPasswordDialog(wxWindow *parent, const wxString& title = _("Enter your Logbook of the World user and password"), const wxString& message = _("Enter password"), wxHtmlHelpController *help = 0, wxString helpfile = wxT("")); wxString Username() { return _username; } wxString Password() { return _password; } virtual bool TransferDataFromWindow(); private: void OnOk(wxCommandEvent&); void OnCancel(wxCommandEvent&); void OnHelp(wxCommandEvent&); wxHtmlHelpController *_help; wxString _helpfile; wxString _username; wxString _password; wxTextCtrl *_un; wxTextCtrl *_pw; DECLARE_EVENT_TABLE() }; #endif // __getpassword_h tqsl-2.8.1/apps/help/0000755000175000017500000000000015003421124014366 5ustar rmurphyrmurphytqsl-2.8.1/apps/help/tqslapp/0000755000175000017500000000000015003421217016055 5ustar rmurphyrmurphytqsl-2.8.1/apps/help/tqslapp/BrokenCert.bmp0000644000175000017500000000162615003421124020615 0ustar rmurphyrmurphyBM6(`N{{aaaaaaN{{ԪN{{N{{ԪaaN{{N{{ԑaaԪN{{aaN{{N{{N{{N{{tqsl-2.8.1/apps/help/tqslapp/CertProp.bmp0000644000175000017500000066440615003421124020330 0ustar rmurphyrmurphyBMi6( hzzsm\WSOJG/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)@<9LHDe_[qje}up~zsm^YT/,)1/-򢟝1/-/,)HC@e^Zqjexr^YTοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿ墟IDAga\ga\-*'οοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿۢ-*'OJGXRO0.,οοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿ.,*B>;.+)οοοοοοοοͿͿͿͿͿͿͿͿͿͿР.+)-*'-*'-*'㦠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<WfTbSbSdSeTeSfSfSfShQiQiOiOiOiOiOiOiOiOiOiOjOiOiOiOiOiOiOiOiOiQhQhRgReReReSdSeSdTbTbXf>-*'-*'WѧI ~V٦IUJ ~VئIXԨJ {U|L ֤ | Y֫K ŀ } ëKYւYۧIYL֣Y֫K ŀ YժK VڦI z };HVHVGVGVGVGVFXDYDZCZCZC[C[C[C[C[C[VXhXUhXUhXUVYC[VXhXUhXUhXUVXC[C[C[C[CYCYCYCXEWFVFVGVHVHVHV;-*'-*' VJΰKTSKӢVץHWž{ {T|  KYL֣ ˆ KWLգXՅKRڦI | | ~ ~Uw 93+ٿٿؾؾ׽ּּջԺӹӹҸѷѷѷжжжϵϵϵϵϵϵδδδδϵϵϵϵϵжжжϵϵϵϵϵϵϵϵжѷѷѷѷѷѷѷѶҶѶҶѶҶѶҶеѵеѵеѵееѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶѶҷҷҷҷҷҷҷҷҷҷӸӸӸӸӸӸӸӸӸӸӸԹԹԹԹԹԹԹԹԹչԹչԹչԹչԹչԹչԹչԹչԹչԹչԹչԹչԹչԹչպֺպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպպֺպֺպֺպֺֻ׻ֻ׻׼ؼ׼׽ӻպշո۽׽α?5.5,#ֻڿ׿7*"6.'Ɽukatkbrkbrkbrjcrjctkbtkaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaujbukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukawkawkayjawk_yk_wk_yk_wk_yk_wk_yk_wk_yk_wk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_yk_wk_yk_wk_yk_wk_yk_wk_yk_wk_yk_wk_yk_wk_yk_wk_yk_wl^yk_wl^yk_wl^yk_wl^yk_wl^yk_wl^yk_wl^yk_ul_rlarlaul^wm\wm\ul^tl_tl_tl_ul^yl\ym[{m[yl\ul_ul_ukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukaukawkawi]ջؾ7,$2,'ukasg]ֹپ6-$1+&tj`ui_ؽ6-$3-(tkaujb׿ؽ6-$2,'of\pe]ؽپ6-$0*%ypfypg7.%3-(ri`ri`ؽ7.%2,'qjaog`7.%2,'rkbrjc6-$2,'rkbrjc6-$2,'rkbrjc6-$2,'rkbrjc6-$2,'rkbᐂlybpVz_x[xYxYxYxYxYw[w[w\w\w[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYw[xYwUzXy[vZuYw[z\z^l󈈈rrrrrrpppmmmlllrrrpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppprrruuuoooooopppnnnuuurjc6-$3-(tkbޝiyĭps㎎tjc6-$3-(tkbޑzZذթتةڨڨڨ٪ثثججث٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪٪کդتܰ׫ѥ޲ȋx]uwwtvvtjc6-$3-(tkbۏyV׳خܮةܪۨۨ۩۩ګګ٬ګ۩۩ککککک۩۩۩ګګګګۨۨ۩ګککککککګګګګکۨککککګکګکګکګکګکګکګکۨ۩٫جج٫٬٭ӌ|_lnnmootkb6-$2,%tkbےyWںڰݮܫ۪߫ެݮݯݯݯݮݮެެݬݮݬެݮݮܪ߯ۮگذݰܦޮڬܭޯݬ۪ۨ߭ް׭ݴݰݪܦޭܮݮݮܯݮܯݮܯݮܯݮܯݮܯݮܯݮޫޫޮݯܯܯެݮԊx[ppppppsj`7-#2,%tkbؐwUٽڲ߰ޯݬ߭߭ްݱݱްݰޯ߯ޯޯޯޯޯޯޯ߯ܬܯܳݶݲ߳۱߶ܴڮݮ߯ڭ۴޺شگܪ߰ڭݰްݰްݰްݰްݰްݰްݰްݰޯ߬߬߯ްݰݰ߭ޯӌw[ppppppsk^9-!2,%sjaېyY߶߲߲߲߳߳߳߳߳߳߳߳߳߳ޯܹsvf  mʺc8 Ԯۿۿ9h>ܰ߳߳Ռw[qqqitH<4*A1*QZgll\ !$"ÿF0%U^hRADB.)&19 -!    V_i EJH83* tlm r_'¼᮪!/ D6* EEK@2&]_gdgk  |BHG-//L0/&,1=4&    xig:1- th\ZajE>E5--')4  .# Y]bO@D9+/-21-,.  dih;0(ਪ +%į@.A34   !"A.)Q`iGE;H2&#,625& ^ZfVBAC12R^`dmj 0"#0-=  I3-%+8qi\qsgg;33(+3+##nkc3*&0,'ukdH.'B/"<.($I/(5.1 *<C3-$óC3#m}*$zvq=6Cw}lL<,Ź 4Fsgcꃇ>Ka* g9CCL,'Ƶv}:, ⑃D?H% j((ĽO1&%2463+,wGD6I;/*29Tc[vpY#724%/9A<=$,3鍃&,52-¾562ójxm1CB2.-/12.O1=.%/5@O86 F2 $*=37+I:73-@㋆ # %+8'k9DAоL.$.8I>:tf`A/$/-30,?!tUG5nkf4+(2.)tleN1(I4%?/(+9E2*I-&?1%)*4"+?333C.&"*21'* {w?8?8>U϶Q3 T."I0&B3#>4*پ&/= K1!#10µS2"$21,.(ɿQ.* ǷR7#+;l{~@H>J1'++1%.<-2;81.1*7ý50-ÿ-.* .32F()/.R0 ?0 //=:00D*#)=K5#%+B.5(õJ1' '37K3!۹-@$.8L2$ µR1".:㈆~RB6O5$&)7,(;+01F5"nje5,(/,(pjcB.-F4#B2&"/?   P1(C2%'-:&,?    E/),"Ǵ  '.h]eXauCMMUSHͿP3$R/%J1'<, D4(",6$K/("0.öQ0!+10,4*¿N0+ʼT3# F.(&,7(+@   912  .%(ü4.3-12*21N2!)03M- B4"(,>    Q3 ",=F/ #+B-7'¯K/$  "$$K2ع  %.;H3²S5$ vs6%K1 %+>S_e-/:-1,H5&qkd4+'/,(pjc $" 2#$-;%! 564ǽ! >/& 볪!!-*?20ƴAI8ʻ%dbhdna5$z6M]A;4)m3CB 'H4)>/&싀B9CD,&&42" "#Ż42')wBE6P:5")8#D1. ⷬ%0 )?-,87;翳H;90-6),0Xir.5..-25ż%3&09G%/7-ô%#,:G7'#*C04!N82ﻱBA=I4%!0C/.)1B% m?BF %8 ȺJ4"(.A *:2%º4/1//)B1$skd3+$/*'oibB)%-05ONW=6C fk\912`SU 5G TFG925KPOĵ++14,3} 醉 -"$v &ÿH/3B>=  903^PQ Ӽ F+(9N roj G5*'373./ZTYK4$   #pkj5/0⫰ ÷%6C ODG()-GQQƳ ƹ--9666u#&72#!#$6/,XSR =56_RT9;M DG891  '5+% 8Jhig  ȶ/01!  ./-]TP /?  F5 &(:wz~bjjZdkzifD.(Ľ/0,@0$skd3+$2+(qibF1/1-85026./J/!5.+R3$=405,)215++7---(+:)502 % ,6 p0#**<82-8)'E.&12.@1(skd3+$4+(rjc .-10*+.*0G.$=40H0$.,+72)((4.-7/12>0*117@4( 3̾O5$912 0ĸ126񧮱H@9KC6^[]-('23/:.(ulc4,%5,)skd1/5D1,B0)435**6.)2134  ulc6-$7,(skdulc6-$7,(ulctkb6-$6+'ulcsja4+"6+'ulcri`3*!6,%tkbme^2) 6,%tkbjb[0'6,%tkbg_X/&6,%rlae]V,#5.%smbc[Tξξʾ+"3-&slcbZS̼ͽȼ+!.*)vofc\Sͻͽȼ( -)(pg^d[Qоμʺʾ) 3*&嶨xlbxlbvlbtkarlarlaukawkazkbxlbrl_pm_tkbrkbnlann^rm^tl_yicwherlapm_rlatkbtjctjcrkbrlatl_tl_tkatkaukaukarlaplarlatkbuieuicum`sm`tkbujbwkaul_rlarlaulcujbukaujbtietietjculctjcuicwjbukarlapm_rl_rl_tkatkbujbukawk_ukatjctjcvlbwk_wjbuicriftiewjbyjaukaukaul_ul_tkbtjcuicuicwjbukawkaukawkavlbxlbvlbwkaukawkaukawkaukawkaul_wkaul_wkaul_wkaul_wkaul_xlbvm`xlbvm`wkawk_wkawk_wkaul_ukaul_ukaul_ukaul_ul_wk_wk_wl^wk_wl^wk_wl^wk_wl^wk_wl^wk_wl^wk_wl^wk_wl^wk_wl^wk_wl^wk_vk]th\shZrfZrfZqeYqeYpdZmdWlbXlcVlbXkbUjaTj_Qh\Pg\N`UG^SE\OAYL>XH;WG:VG7VG7VG7VG7VG7VG7WH8YJ:ZJ=[K>`PCaQDcSFdTGdTGcSFbREaQD\L?[K>YIYMA\PD]TGbXNd[Nf\Rh^Th^Th^Th^Th^Te[QdZPcYObXNbXNaWM`WN`WN]TK]TK]TK]TK]TK]TK\SJ\SJ\SJ\SJ\SJ\SJ\SJ\SJ\SJ\SJ]TK^UL^UL_VM`WNaXObYPbYPf\Uf\Ug]Vh^Wg]Vf\Ue[TdZS`VO_UN\TM[SLZRK[SL[SL\TM]VM^VO^UQ_VS`WT`WSaYRb[Rd]Td\UcZWcYYcYYcZWbYUbZS]WP\VOYVNXUMWTLVSKURJTQIROGROGROGSPHSPHTQIVQHWQJYSLYSLYSNZTMZTO\TM\TM\UL_WP`YPaYRb[Rc[Tc\Sf\Ud\Ua]XebZc]RѾ,!8,&ԾѸθ͵͵ͳʲ˱ʲ̲͵ϷѹӻҺս־־ӽиθζθθϹϻϻѼҽ.#:-%ٿؾؾؾؾؾؾؾؾ׻׻׻׻׻׻׻׻׼׼׹׹׹׹׹׹ֻֻֻֻֻֻֻֻֻֻֻֻֻպպԹҴвͲ˰ɮȬūĪ׿ֻӸѶͱȬ{vokhgfhhknqsz~ţɨʨȧĢ¡}yxrroqrsvy}§ȯʹһվªŭǮǮůĮí¬Կҿ­įŰƱųDzƴDzųƱųƱųƱƴDzȶʵ˹ιμнϾ˼˺ɺɸȹ˺̽ϾѾҿϿͽ̼ʺ˻̼ͽ;ο/$ :,&߿۽۽۽۽ڼڼڼڼٻٻٻ׺׺׺׺ععععععععععضضضضضֵֵַַַַַ׸ָ׸ָ׸ָָշԶԶմӲѰϰ̭ʫȩħĦæĦ¥ܿڽۼյа˩Ģ~ysomiiihkmqs›uƟyˣϨШϨˣǡ~ǟ|Ýzšwtsrssx{~âǥˬвԸۿ¤ŪǬʮɭȮǭƮƮŭŭŭƮǮǮȯɰʱ˲̶ͷθθͷͷͷͷͷ̶̶̶θϹкҼԾտҽѼллѼӾѿ2'6*&ܾܾܾܾܾ۽۽۽ڽڽڻڻڻٺٺٺٺٺٺڸٸڸٸٸٸٸٸڷٶٶٶٶصص׶׶׶׶׶׶׶׶ططط׶׶ֵֵմԳԱЯέ̫ɨǨŦää䣣ݽڸձΪɥŠztpnmlill—pęrǜuȟx̢}ϦЦϦͣ~ɢ|ȞyĝwĚusrsÙtšwzà~Ǥʩέҳڻŧǩɮ˰˰˰˱ʰɱʲʲʲ˳̴͵ζииѹӻԼսս־տտԾԾԾԾԾԾӽԾտ3)5(&ݿܾܾܾ۽۽۽ڽټټڻټٺٺٺٺٺٺٸٸٸٸٸٸٸطٶٶٶصصصص׶׶׶׶׶׶׶׶׶׶׶׶ֵֵմԳӲүϮͬ˪ɨǨŦä䣣££¡޻صձЬͨǢ|ŞxÜvÚsq—p—pØqŚsƛtɞwȟx͢{ͤ}Υ~ͤ}̣|ɢ|ʠ{ǠzƟyŞxŞxƟyǠzȠ}ɤ˨ЭұմٺƩɫɮ˰ͲͲͳͳͳ̴͵ζϷиѹӻԼԼսս־׿׿6*7)*ڿ۽ڿټټټػٺٺٺٺٺٺٺٺڸٸٸٸطططططعععععع׹׸ָ׸ָ׸ַָԶմӲѰϮͬˬɪƩħħææ¥¥æħŦĥܻڷֳ԰ΪʤȢȡ{ŞxśvśvƜwƜwǝxɟzȡ{ˡ|ʣ}ˤ~ˤ~ʣ}Ȣɡ~ǡ~ǡ~ǡ~ǡ~ɣ̦ͨϩѭֲٷݻħȭ̱̲ͳδδ͵͵͵͵ϷѹӻԼս־׿8, 6**ڿڿڿڿټټټػٺٺٺٺٺٺٺٺٸٸٸٸططططططعطعطعط׸׶׸׶׸ֵնմӲѰϮͬˬɪƩħææ¥¥æħƩǪƧäݼܹصԯЫΨ̦ɣɡ~Ƞ}Ƞ}Ƞ}Ƞ}ɢ|ʣ}ˤ~ʥ˦˦ʤʤ˥ʦʦʦ˧ͩЫЭ԰ճڸݾŨɮ̱δδδϵζζζζиӹԼؾ6- 4+(3%'îݿݿݿݿܾܾܾ۾ڽڽڽڽټټټڻڻڹڹڹڹڹٸٸٸڷڷڷٶٶٶٶٶطٶطٶطٶطٶطص׶״ֳֵԱүЭΫ˪ɨǨŦĥĥĥĥŦǨǩȪɪǨģ¡ݼ۸״հӮЫϩ̧̧̦̦̦ͧͨΩϩΪΪͩϫͫΫϬЭүֳֶڸݻŦȫˮϱѳеежжжжжѷҸԹ׽ھ7,$2,'- .ݿݿݿݿݿ۾۾۾ڽڽڽټټڻڻڹڹڹڹڹڹڹڹڷڷڷڷڷڷڷڷڷٶٶٶٶٶٶٶٶصص״״ֳԱӰЭΫ̫ʩǨƧŦŦŦŦƧǨȪʫʫɪǦƥŤ¡ᾜ޻۸ٶسհԯҭҭѬЬѭӮҮӯӯӯѯүѱԱԴ״ظۺۼῡäǨʫ̯ϱѳҴҷҷѷѷжѷѷҸӸպؽڿ6,%0,'&5ݿݿݿݿܾ۾۾۾ڽڽڽۼۼۼۼڹڹڹڹڹڹڹڹڷڷڷڷڷڷڷڷڷٶٶٶٶٶٶٶصصִִ԰ӯЭΫ̫ʩǦƥŦĥĥĥŦǨɪʫʫʫʩɨȧƥġŸ߿޾ݺڷص״ֳղճճ׳ֳֳֳ״յֵնٸعܻܽ£ƧǪʭͰϲѳѶҷӸӷҶҶѷѷҸҸԹֻپrhy>6M2.G*'@''?--E21K20N--K-0L-2K-1M.2N.2N,3N,2O,2O-3P-3P-3P-3P/3P/3P/3P/3P-3P+3P*2O*2O,3N,3N-1M-1M*.J*.G*.G)-E(,E*,D)*D)+C>?Shht7,(/,(P_a  Q?8S`^U_f̹+µOK/+9WBb gS쩮XB6"!+ Z_^ rbV޼md`NA?'"+2|wjJ.'$ reF%ݿܾ۾ܾ۾۽۾ۼڽۼۼܺڻ۹ڻ۹ڻ۹ڹڷٸڷٸڷٸڷٸڷٸڷطٶطٶ׶صֵ״ղӰѮϬ̫˩ȧƧĥĥæĥħǨȫʫˬˬˬ˪ʩɨǦƣâŸ࿞ܽۼڻعڹٹٹٸٸڹڹۺٺڻټ۾¥ŨȪ˭̮γѳѶҷҷԸӹӷѷѷѷѷҸҸջ׽6/D|ٵⶼ紺簶㬳䮴鰷﮼ﭻ﮻ﭻ쯺쮹믹魷筷箵氶㦮}63C5,(/+*?]hG_e{G\kφpXlUC' c]޴PF426R7Q8)  ocQTF:E%ѱeWo]Wh Ǿ/!#ȻrZZWBDEAGjqHP\hRD.qO$ܾ۽۽ۼڽۼڽڻټڻڻ۹ڻڸٺٸٺٸٺٸٺٸعطعط׹׶շֵԳӱѯϭ̭ʫȩƨĦĦèĦĩǩǬɫʬʬ˭ˬˬʫɪɧƧƤĥ£ݿܿ޿ݾݾݾ޿޿¤èĩƫǬɮ˰ͲγϵҶѷҸӹӹѹӸиѸииѹҺԼ־hdpӅztsw{zvvuvwwvvvvvvvxxxxwwvxwyxzyyzxyxxyÃåւndu5-&/,(7[mD`k{B]rʄhWsU* ೭OG:84˫⵬OCCָOF8& #= ")icV˺MBD|}?/lpB%7̺좨nL۽۽۽۽۽۽ڼڼڻڻڻڻڻڻٺٺٺٺٺٺعععع׹ָշշԳӱѯϭ̭ʫȪƨƨĩĩèĩŪƫǬȪɫʬʬɬɪȫɪǪǨŨƨŧŧĦ奥¥¥¥ĦħĩĩƫǭȮɯʰ̲ͳδδϵжѷҸҹҹҹҹѸѸѸҹѹҺֽؿ00Byluiuhxdwavbucvfxeyczfzg{d|e}g|i}jlnli~i~l~nolj}i}f|f}g|h|jyixiwhvftgtgthulxw~3+B2-$//#;_qC[mE]uͅjUrQ ̶GG;<8ɦ⵩OC= NG4B,.U]jNG4!#+ir|fH/ԾA,jrH$6ϻlKݿݿܾܾܾܾܾڽڽڽڽڽټټټڻٻٻغغغغغٸٸططط׶ֵֵӲұЯϭ̭ʫȩƧƧħææĦŧƨǩǩȪǬȭȭɫȭɫǬȪǬǬƫƫƫƫŪŪŪƫƫƫƫƬȮɯɯʰ˱̲ͳͳϵϵжѶҷҷӸӸӸҷѸзѸѸҹӺԼؾ3ek`f]gYiXiWhWiWhUhUkVl[kZmWnVnYl^neroyowjvavYolwqwtzhofq]pSlUqWn\o\j]iZiWiVjWhYfZfZgdm60.#-.$:\l I]n" ̼!րkZqQ+#.?!ʾ:9"<,ve\暉vWI7$%)βP]mx}Z[e D+pXXucd}>?Il} ȹzVH1"'qN#ݿݿݿݿܾܾܾܾڽڽڽڽڽڽټټڻٻٻٻغغغغٸٸٸطط׶ֵֵԳӲѰϮͮˬɪȩǨƧħæĦŧƨǩȪȪȪɫȭɫɮʬȭȭȭȭǬǬǬǬǬǬǬȭȭȭȭɮʰʰ˱˱̲ͳδδϵϵжѶѷҷѷҷиѸϷзиҹҺӻսٿ0V\SXPXLZK\J[K[JZI[H]K^N\M^H^G`I_ScPYEHtJMsFLwGT`lRVKKyHGqCG|DOQaMfC`H_I\N[NZL[I\H]I\LYMXP[W`52.#)++=[fM[gsq-ID;}z   䰱>C4dZP")3}2t ˰#. 4  '&*ʻҹk_]&%udbP=/LC6ea\MQKqH!ݿݾݾݾݾܽܽܽܽܽۼۼۼۼۼۼڻڻڹڹڹڹٸٸٸٸٸٸط׶׶ֵմӲұЯέ̫ʫɪȩǨƧŦħŨŨƩȩȩɪɪȫʫɬʫ˭ʬʬʬʬʬʬʬ˭˭˭˭˭̮̮̮˰̱̱ͲγγϴϵϵζζϷϷиииϺкιϹϺҼҽӾ4KQIPFOAQ?R@S@S>R>QARBRBQAS@S>U=VI^CIvSOl`[zWSl?HL\BX=WCYBSCOBN?Q>R?SBSEQFOBMHQ64-$-++C`iyxejOuK&߿޾ݿݾݿݾܾܾܽܽ۾ۼڽۼڽۼۼڻڻڻڻڻٺٺٺٺ׹عָ׶նԵҳбί̭ͮˬɬɬȫȪƩǩǬȪȫɪȫʫɬˬʭˬ̮̮̮̮̮̮̮̮̮̮̱̱ͯͯͲΰͲβγϳϵѵжжжжϷѷиииѹѹѹϺѹѼӻԿ׿ 2BI@F=F8G6J9I8I6J5I;K9K8K7K8K7M5NAUGPOPj]S`EIeGNFS@T6M6L5H8E7F6G5I5I8IT=U?R@RBQERFQVZ]Y|`Xc\U\XWXZUZFO;M:P?S

O?NQ䨟50-ulo6,,ݿݿݿܿܿܿ۾۾ڽټټػ׺ԷӶҵҵӶԷոֹ׺ټڽڽ۾۾DCS짪֩ۦݣࢬ⥬夭桮桭磭鱰⵱Ⱞ⨳몬⵲㱳ܲⰱ륭駮禭䨭䧫榪䥬ޥި䥦?>>000ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉000<<۹ݶXBwYR8::f:::::::ꠠIII^^^dddLLL::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8:f:::f::ꠠSSSrrrvvvVVVѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::ꠠ^^^}}}aaaѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ꠠhhh}}}kkkѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ꠠvvv~~~xxxѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::f::::fې::fffffې::::::ې:fꠠ@@@DDDwwwCCC000222333222IIIKKK@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې:::ې:::fې:f::::f:ې:ꠠ@@@@@@777***000///,,,:::@@@@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::ꠠ@@@@@@zzz111%%%...---%%%333zzz@@@@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ꠠ@@@@@@zzzzzzzzz***!!!---,,,!!!,,,zzzzzzzzz@@@@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ꠠKKKEEEzzzzzzzzzzzzzzz###---,,,%%%zzzzzzzzzzzzzzzMMMQQQѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::ې::ې:fffff:::ې:ff:ϕꠠ\\\oooWWWWWWgggdddѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::fffffې::f:ې:::ېϕꠠ􉉉______ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8ff::::f::::::f::::fېf::::fېfffffې::ې:fې:ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::ېff::::::::fې:f:::ې:ې:ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::::ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ϕꠠڻ컻ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ϕꠠԵѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::f::::fېf::::fېfffffې::ې:fې:eefϕꠠè::ېfff:::ې::fې:fff:::::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::fې:f:::ې:ې:::;bbcwwxwwxwwxϕꠠί:::fې:ې:ې::ېf::::ې:f:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::ϕꠠй::::::ې::ې::::ې::ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ϕꠠ::::::ې::ې::::ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ϕꠠ::ff::ې::ې::ffff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::::::ې::f::::fېf::::fېfffffې::ې:fې:ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::ې::ې::ې::::::fې:f:::ې:ې:ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::::ې::ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ϕꠠѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ϕꠠ򶳮ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::::::::ϕꠠpppxxxݽǨġƢȤ˧̨ΪԵ|||pppѹ?ѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::::ϕꠠpppxxx޾ʪǣɥ˧ͩϫѭն|||pppѹ?ѹ𕌉Q8z^U=YErUO6::ϕꠠpppxxx࿿гЯѰӲԴֶ׷۾|||pppѹ?ѹ𕌉mmmmmmQ8~aV?T@vWO6ϕꠠpppxxxNJ|||pppѹ?ѹ𕌉Q8~bx\O6ϕꠠpppxxx|||pppѹ?ѹ𕌉mmmmmmW[Mppp:f::::fff:::fې:::fff:::::::ې::۶:fېf:::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ѹ?ѹ𕌉cKcKcKcKcK푑mmmmmmmmm2Tff:f:::f۶::::ϕꠠpppCzHc4!% ) . 3 7=BGMQV]bgnsx!"$%<[Hppp:fff۶::ff:::ې:ېf:ff:::ې:::::ff::fې:ffffېf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ѹ?ѹ𕌉2Tf:ې:::ې::fې::::f:f:::fϕꠠpppD{Oo!= - 0 5 :?DINTY^djov{ !#$'<_Ippp:fې::::::ې::ې::ې::::ې::::::ې:::۶f:ff:ffff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ѹ?ѹ𕌉2T::ې::ې::ffffff۶::ff::f:ϕꠠpppCzKm&G7 ;?DJNSZ_dkpu| !#$(?\Gppp:::::f::ې::ې:f:::::::f:fېff۶f:f:ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ѹ?ѹ𕌉2T::ېf:ې::f::ff:ې::f:fffې:ЕꠠpppD}Lr&O@EJPTY`ekqv|!"#%&=\Hpppf::fff::ff::۶ff::ff:ff:ff::ff:ffff:fff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:ѹ?ѹ𕌉2T::ې:fff::ېf:::ېӕꠠpppR`qMS(ZNQW\ahmsy~!"#%(=_Dppp::ې::ff::ې::ې:ې:::ې::ې::ff::ې::ېf:f:ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ffѹ?ѹ𕌉Jff""""""""TЭꠠpppbhogD~O-eX]bhnsy!"$%)@]Dppp:fff:::fېff::::::::ѹ?ѹ𕌉mmmVVzˬꠠpppbhpmGvEQ-ncinuz !#$&'>]Hpppff:::ې:::::ې::::::ې::ѹ?ѹ𕌉ꠠpppciqqOzN~GW0zrv| "#$&)>`Dpppѹ?ѹ𕌉mmmꠠpppdjruTXePT5} "#$&)A]Dpppѹ?ѹ𕌉ꠠpppekryX\buFV6!"#%'(?]Hpppѹ?ѹ𕌉ꠠpppels}^agmuE\9&%'*?aDpppѹ?ѹ𕌉ꠠpppfltс˃ΖhnuEZ=)*A]Dpppѹ?ѹ𕌉2^^RjjꠠpppXY[fltfmtfmugnuXY[H[>@^Hpppѹ?ѹ𕌉㑑2T::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې:ꠠpppFaaEpppѹ?ѹ𕌉㑑2Tf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ېf::ېUUUwwwꠠpppFFpppѹ?ѹ𕌉푑2Tff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ff!!!IIIyyyꠠppppppѹ?ѹ𕌉cKcKcKcKcK푑mmmmmmmmm2Tff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ff555[[[ꠠppppppѹ?ѹ𕌉2Tff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:f:ff---ꠠppppppѹ?ѹ𕌉2Tff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff::ꠠppppppѹ?ѹ𕌉2T:fېff::::::::ꠠuuuuuuѹ?ѹ𕌉2T:ې:::::ې::::::ې::ꠠ葑ѹ?ѹ𕌉Jff""""""""Tꠠwwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwѹ?ѹ𕌉VVzꠠѹ?ѹ𕌉ꠠѹ?ѹ𕌉ꠠѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?տտտտտѹ𕌉ϕ󕌉ѹտտտտտ?տտվվվѹ𕌉ѕ󕌉ѹտվտտտ?ԾԾԾԾԾѹ𕌉TTҖvv00ҴҕTTҖѹԾԾԾԾԾ?ԾԾԾԾԾѹ𕌉UԗUww00ԶԕUԗUѹԾԾԾԾԾ?ԽԽԽԽԽѹ𕌉1Wؚz1WؚWz1ع1zؚWz1Wؚz1z1zz11عWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz1ؕ1zWWWW1z11zz11zz11عWz1zz11عWz1zz11عzz11ع1zWz1z1zz11عWWW1z11عzz11عzz11عz1ؚWWWW1z11عWz1z1z1عWz1ѹԽԽԽԽԽ?ԽԽԽԽԽѹ𕌉{11ڻڜWڜW1{W1Wڻ{{{11ڻ1{{1ڻڜW{1{{11ڻW{1ڻWڜW{{11ڻ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{ڕ1{WڜWW{{11ڻ1{{1{{11{{11{{Wڻ11{{{{11ڻ1Wڻ{{{11{{11ڻ{{11ڻ1{WڜWWڜWڜW{{11ڻ{W1ڜ{{11ڻ{{11ڻ{{11ڻ1{ڜW{{11ڻ1{{1ڻ{W1ڜWڜW{ڻ{Wڻ11{ڻ{ѹԽԽԽԽԽ?ӽӽӽӽӽѹ𕌉{11ۼ{{11ۼ{X1X{1ۼ{{11ۼۜ1Xۼ{{{11{{11ۼۜ1X{{{11ۼ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜە::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې:1Xۼ{{11ۼ{{{11{{11{{11ۼۜXX{{11X{1ۼ{{11{{11ۼ{{11ۼۜ1Xۼ{{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11ۼۜXXۜѹӽӽӽӽӽ?ӼӼӼӼӼѹ𕌉}22ݾ}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾݝYY}}22ݾݝ2Y}}2Y}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝݕf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ېf::ې}22ݾ}2}2}}22}}22ݾYYݝ}}22}}22ݾ}}22}}22ݾ}}22ݾ}}22ݾ}2Y}}22ݾ}}22ݾ}}22ݾ}}22ݾ}}22}}22ݾ}2}2ݾ}}22ݾ}2YݝYYݝѹӼӼӼӼӼ?ӼӼӼӼӼѹ𕌉55^^5ɨ^^^5555^^ɨ55Ʉ^^^^555^^^55Ʉ55^^5ɨ^5^^5^5^^때ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ff^5^^55Ʉ55^5^^ɨ55^^555^^5^5^^555^55Ʉ55Ʉ55Ʉ555^^^55ɨ^^55^5^^ѹӼӼӼӼӼ?ӼӼӼӼӻѹ𕌉555^555^ʄ55^555^^55ʄ55^^55ʄ5^^555ʄ5^쨄55^^55알ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ff55ʄ55ʄ55ʄ5555ʄ55ʄ55ʄ55^^55ʄ55ʄ55^^5^^555^5ʨ^^55ʄ5ʄ555ʄ55ѹӼӼӼӼӼ?ӻӻӻӻӻѹ𕌉555̅5_̅555핌ff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:f:ff5___55̅555___55_555ѹӻӻӻӻӻ?һһһһһѹ𕌉555Ά555Ά55ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff::``55Ά5555``55Ά55Ϊ5`Ά5555ѹһһһһһ?һһһһһѹ𕌉𕌉:fېff::::::::66·66``ѹһһһһһ?һһһһһѹ𕌉񕌉:ې:::::ې::::::ې::ѹһһһһһ?ҺҺҺҺҺѹ𕌉򕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉򕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉ѹҺҺҺҺҺ?ѺѺѺѺѺѹ𕌉ѹѺѺѺѺѺ?ѺѺѺѺѺѹ𕌉ѹѺѺѺѺѺ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹ̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼ѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹ3~b8Z~ѹѹѹѹѹѹ?ѹѹѹѹѹѹ[3߮6Y~ѹѹѹѹѹѹ?ѹѹѹѹѹѹމa2ޮ6Y}ѹѹѹѹѹѹ?ѹѹѹѹѹѹܮ6X|ܮ6X|6X|܉2[ܮX[[[3|a363X|[[6X|܉26|ܮ6X|ܮ6X|ܮXр2܉26|ܮXX3|a363X|[[6X|܉26|ܮ6X|ܮ6X|܉233|a363X|6X|6X|aa❮6X|a26X|6X|ܮ6X|܉23܉2[6X|[[6X|6X|ܮ6X|ܮXX3|a363X|[[܉2[ܮ6X|ܮ6X|܉2[6X|6X6[XXѹѹѹѹѹѹ?ѹѹѹѹѹѹڬ6W{ڬ6W{6W{W~1ڇ{2{~16W{`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{ڬ6W{ڬWWڇ`12{~1`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{`Wڇ{`ڇ2໇61{6W{6W{6~~16W{WW6~6{6W{ڬ6W{`Wڇ{W~1ڬ6W{ڬ6W{ڬ6W{6W{ڬ6W{2{~1`ڇ2໇61{6W{ڬW~1ڬ6W{ڬ6W{W~1ڬ6W{W~1ڇ`1ѹѹѹѹѹѹ?ѹѹѹѹѹѹ٫6Wz٫6Wz6Wz`1ߛ6~Y6Wzه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz٫6Wzه`1ߛYW`1ߛه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz2zWه`1ߛ62zz6Wz6Wz6~W6Wzه21ߺ٫6Wz6Wz٫6Wz2zWه`1ߛ٫6Wz٫6Wz٫6Wz6Wz٫6Wz`1ߛه`1ߛ62zz6Wzه`1ߛ٫6Wz٫6Wz`1ߛ٫6Wz6Wz2zWѹѹѹѹѹѹ?ѹѹѹѹѹѹ׫6Vy׫6Vy6Vy1Yׇ1V6Vy`6y6Vy׫6Vy`1ޚYV6Vy׫6Vy׫6Vyׇ`1ޚYV`1ޚ`6y6Vy׫6Vy`1ޚYV6Vy׫6Vyׇ`1ޚ`6y6Vy6Vy1}1׫6Vyׇ21޹׫6Vy6Vy׫6Vyׇ`1ޚׇ1Y6Vy׫6Vy׫6Vy6Vy׫6Vy`1ޚ`6y6Vyׇ1Y׫6Vy׫6Vy1Y6Vy6VyYVѹѹѹѹѹѹ?ѹѹѹѹѹѹ֪VV5Vy5Vy5Vy`}12yV֪5Vy֪5Vy5Vy֪5VyVVֆ51yVY``ݙ֪5Vy֪VVֆ51y2y}1֪5Vy5Vy֪5VyVVֆ51yVY``ݙֆֆ21ݸ֪5Vy5Vy5Vy`֪Y֪5VyVV5}5yVY``ݙֆֆ21ݸ֪5Vy`}1V}1֪5Vy֪5Vy5Vy֪5Vy2y}1֪5Vy5Vy֪5Vy`}1֪V5y5Vy`}15VyV2ݸ51yѹѹѹѹѹѹ?ѹѹѹѹѹѹԪ5UwԪ5Uw5UwԆ0_ۗԪU{0ԪUXXXUX5UwԆ0UԪ5U_{w{0Ԫ5UwԆ0U1wUXXUX5UwԆ0UԪ5U_{w{0Ԇ_0ۗXXԪ5Uw5Uw1wU5UwԆ0{05Uw5U_{w{0Ԇ_0ۗԆ0_ۗ5U5XUX5UwU{05Uw1wUXXUXԆ0_ۗԪ5UwԪ5UwԆ0_ۗ5Uw5Uw0{0ѹѹѹѹѹѹ?ѹѹѹѹѹѹԩ5Uwԩ5Uw_ԅ1۶ԩ5Uwԩ5Uwԩ5Uwԩ5Uw1wUԩ5Uw5Uw1wUԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwѹѹѹѹѹѹ?ѹѹѹѹѹѹ8\ɀ8\ɀb38\ɀ8\ɀ8\ɀ8\ɀ3\8\ɀ8\ɀ3\8\ɀ\\8\ɀ8\ɀ8\ɀ8\ɀѹѹѹѹѹѹ?ѹѹѹѹѹѹ]ӄ484ʂ8]ʂbb84ʂ8]ʂ84ʂ558]ʂ8]ʂ84ʂ5584ʂb584ʂ8]ʂ8]ʂ8]ʂѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?444ѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹB444444иииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииD444444ϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷG444444εεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεӺqziziziziziziziziziziziziziziziziziziziziziziziziziziziqӺεεӺqziziziziziziziziziziziziziziziziziziziziziziziziziziziqӺεε5&O"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C5&OεεεεεεεεJ444444ʹʹʹʹʹʹʹʹʹ ʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹqʾʾqʹʹqʾʾqʹʹ8)P웚8)PʹʹʹʹʹʹʹʹN444444̳̳̳̳̳̳̳̳aV  ̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳Hs(̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳yhзззззззззззззззззззззззззззؑyh̳̳yhзззззззззззззззззззззззззззؑyh̳̳"Coo~oo~o~o~o~noon~nonnn~onn~n~n~o~o~o~o~o~o~ҵ"C̳̳̳̳̳̳̳̳R444444˲˲˲˲˲˲˲˲HwX ˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲GG˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲xg˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲֐xg˲˲xg˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲֐xg˲˲"CdudududududududududududududududududududududududueududuΫ"C˲˲˲˲˲˲˲˲V444444ɱɱɱɱɱɱɱɱɱ %Xksbɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱ3Gdɱɱɱɱ[q(ɱɱɱGQɱɱGq(ɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱvfŬŬŬŬŬŬŬŬ|fVSfVSfVSfVSfVSfVSfVSfVSfVS|ŬŬŬŬŬŬŬŬҏvfɱɱvfŬŬŬŬŬŬŬŬ|fVSfVSfVSfVSfVSfVSfVSfVSfVS|ŬŬŬŬŬŬŬŬҏvfɱɱ"CWjXjXjXjWjWjXjWj__fVSfVSfVS__Xj__fVSfVSfVS__WjXjWjWjWjWiXjXjɠ"Cɱɱɱɱɱɱɱɱ[444444ȰȰȰȰȰȰȰȰȰȰCxe #ȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰ3FcȰȰȰ[[~ȰȰFq'ȰcȰȰ-cq'Ȱ3FcȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰveؾؾؾؾؾؾؾؾfVSfVSؾؾؾؾؾؾؾؾΎveȰȰveؾؾؾؾؾؾؾؾfVSfVSؾؾؾؾؾؾؾؾΎveȰȰ"CJ^K^K^J_J^J^J^J^fVSfVSYZfVSfVSK^J_J^J_J_K^J^J^Ę"CȰȰȰȰȰȰȰȰ_444444ǮǮǮǮǮǮǮǮǮǮǮ-.fvh#(ǮǮǮǮǮǮǮǮǮǮǮǮǮǮ3FbǮǮǮ-bFǮǮǮZ'|ǮǮǮǮ3pPǮ3FbǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮudϵϵϵϵϵϵϵϵfVSfVSϵϵϵϵϵϵϵϵʍudǮǮudϵϵϵϵϵϵϵϵfVSfVSϵϵϵϵϵϵϵϵʍudǮǮ"C>S>S>S>S>S>S=S>SSUfVSfVSfVSSU>S>S>S>S>S>S>S>S"CǮǮǮǮǮǮǮǮd444444ŬŬŬŬŬŬŬŬŬŬŬŬ 6~je #ŬŬŬŬŬŬŬŬŬŬŬŬ2EaŬŬ~Z'{ŬŬŬŬ2,aaŬŬŬ~'EŬ2EaŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬtcͲͲͲͲͲͲͲͲfVSfVSͲͲͲͲͲͲͲͲɍtcŬŬtcͳͳͳͳͳͳͳͳfVSfVSfVSfVSfVSfVSfVSͳͳͳͳͳͳͳͳɍtcŬŬ"C3I3J3J3J3J3J4J4I3JNQfVSfVSNQ4I3I3I3I4J4J3I3I3I"CŬŬŬŬŬŬŬŬi444444īīīīīīīīīīīīī۹ݶXBwYR8ff::::f::::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmT:~aV<񸷷T>z[R8::::ېff::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmQ8~aV?T@vWO6ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmW۹ݶXBwYR8f::::fې::::ې::fff:::fff:::ې::f:fffې:000333777<<z[R8:ې:::::::::ېf:f:::ېf:::ې///111:::GGGUUU\\\```bbbcccdddeeedddccc```\\\VVVGGG:::111///ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6///222===LLL]]]______```bbbccceeeggggggfffdddcccaaa``````^^^MMM===222///ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6///666FFFWWW[[[\\\]]]___aaaccceeeggghhhhhhgggfffdddbbb```^^^]]]\\\WWWFFF666///ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6000:::PPPYYYXXXYYY[[[]]]___aaaccceeehhhiiijjjiiigggdddbbb```^^^\\\YYYYYYZZZQQQ:::000ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW>>000ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉000<<۹ݶXBwYR8::f:::::::III^^^dddLLL::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8:f:::f::SSSrrrvvvVVVѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::^^^}}}aaaѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6hhh}}}kkkѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6vvv~~~xxxѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::f::::fې::fffffې::::::ې:f@@@DDDwwwCCC000222333222IIIKKK@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ffffffff:::ff:ff::::ffff::ff۶f:ffѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې:::ې:::fې:f::::f:ې:@@@@@@777***000///,,,:::@@@@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ff::ېf:ff۶::ې::ff:::fې::ff:fې::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::@@@@@@zzz111%%%...---%%%333zzz@@@@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉:fېff:ې:fې::fېff:ې:fې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6@@@@@@zzzzzzzzz***!!!---,,,!!!,,,zzzzzzzzz@@@@@@ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉:ې::::ې::ې::ې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6KKKEEEzzzzzzzzzzzzzzz###---,,,%%%zzzzzzzzzzzzzzzMMMQQQѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::ې::ې:fffff:::ې:ff:\\\oooWWWWWWgggdddѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::fffffې::f:ې:::ې􉉉______ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉fffffff:ېѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ffffff::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉::ېfff:::f:::ې::::f::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې::::::f::ff:::ې::::f:::fې::ې:::fѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉f:::ې:::ې::fffې:::ې:::::fې:::f:::ې:ې::ې::ېf:::::fې::ې:::::fff::f:::ې::ې:::f:::ې:ېf:ff::۶ff:۶f::ff::ې:::ff::ff:fې:f::::ې:ffѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8ff::::f::::::f::::fېf::::fېfffffې::ې:fې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ff::ff:fې::ې::::ې::::::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:f::ې::f:۶::::f:::::fff:ff::۶:fې::۶:fېfff:::::ffѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::ېff::::::::fې:f:::ې:ې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ffffffff:::ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::::۶ff:۶f:f:::::ې::ffff::ېf:::ېf:۶fff:::f::ffѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ff::ېf:ff۶::ې::ff::ff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ېf::f::ff::::ې:::::fېff:ې:fې::ې:fې::fې::f::fې::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ڻ컻ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉:fېff::ې::::f:::f:::ې::ې::::ff:fېf::::fېf::::fېfffffې::ې:fې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6ԵѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉:ې:::::ې::::::ې::۶:fې:::::fې::ff::::fې::ې:::::fې:f:::ې:ې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::f::::fېf::::fېfffffې::ې:fې:è::ېfff:::ې::fې:fff:::::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉:fېff::ې::::f:::f:::ې::fff:::fff:::ې::f:fffې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::fې:f:::ې:ې:ί:::fې:ې:ې::ېf::::ې:f:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉:ې:::::ې::::::ې::۶:fې:::::fې::::ېf:f:::ېf:::ېѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::й::::::ې::ې::::ې::ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉::ې::ffffѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6::::::ې::ې::::ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6::ff::ې::ې::ffff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::::::ې::f::::fېf::::fېfffffې::ې:fې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::ې::ې::ې::::::fې:f:::ې:ې:ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8z^U=YErUO6::::ې::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉fffffff:ېѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmQ8~aV?T@vWO6ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉ffffff::ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉Q8~bx\O6򶳮ѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉::ېfff:::f:::ې::::f::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې::::::f::::fff::::ې::ې::::f:::fې::ې:::fѹѺҺҺҺҺ?ѺҺҺҺҺѹ𕌉mmmmmmW۹ݶXBwYR8::::::::pppxxxݽǨġƢȤ˧̨ΪԵ|||pppѹ?ѹ𕌉ff۶::ې::f::fې::ې::::fې:::::::ې::ې::ې::ff۶::fې:::ې::::::::::::ې::ې::ې::ې::::ې::ې::ې::::ې::f:۶::::::::ې:ې::ې:ff::ې:::fې::ѹ?ѹ𕌉mmmmmmT:~aV<񸷷T>z[R8::::::::pppxxx޾ʪǣɥ˧ͩϫѭն|||pppѹ?ѹ𕌉ff::ff:fې::ې::::ې::::::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:f::ې::f:۶::::::ff::۶:fې::۶:fېfff:::::ffѹ?ѹ𕌉Q8z^U=YErUO6::pppxxx࿿гЯѰӲԴֶ׷۾|||pppѹ?ѹ𕌉ffffffff:::ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::::۶ff:۶f:f:f::ff::ېf:::ېf:۶fff:::f::ffѹ?ѹ𕌉mmmmmmQ8~aV?T@vWO6pppxxxNJ|||pppѹ?ѹ𕌉ff::ېf:ff۶::ې::ff::ff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ېf::f::ff::::ff:ې:fې::ې:fې::fې::f::fې::ѹ?ѹ𕌉Q8~bx\O6pppxxx|||pppѹ?ѹ𕌉:fېff::ې::::f:::f::::::fېf::::fېf::::fېfffffې::ې:fې:ѹ?ѹ𕌉mmmmmmW[Mppp:f::::fff:::fې:::fff:::::::ې::۶:fېf:::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ѹ?ѹ𕌉f:::ې:::ې::fffې:::ې:::::fې:::f:::ې:ې::ې::ېf:::::fې::ې:::::fff::f:::ې::ې:::f:::ې:ېf:ff::۶ff:۶f::fff:۶:::ې:::ff::ѹ?ѹ𕌉cKcKcKcKcK푑mmmmmmmmm2Tff:f:::f۶::::pppCzHc4!% ) . 3 7=BGMQV]bgnsx!"$%<[Hppp:fff۶::ff:::ې:ېf:ff:::ې:::::ff::fې:ffffېf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ѹ?ѹ𕌉ff۶::ې::f::fې::ې::::fې:::::::ې::ې::ې::ff۶::fې:::ې::::::::::::ې::ې::ې::ې::::ې::ې::ې::::ې::f:۶::::::::::ې::ېf:::ѹ?ѹ𕌉2Tf:ې:::ې::fې::::f:f:::fpppD{Oo!= - 0 5 :?DINTY^djov{ !#$'<_Ippp:fې::::::ې::ې::ې::::ې::::::ې:::۶f:ff:ffff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ѹ?ѹ𕌉ff::ff:fې::ې::::ې::::::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:f::ې::f:۶::ff:f:::f۶::::ѹ?ѹ𕌉2T::ې::ې::ffffff۶::ff::f:pppCzKm&G7 ;?DJNSZ_dkpu| !#$(?\Gppp:::::f::ې::ې:f:::::::f:fېff۶f:f:ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ѹ?ѹ𕌉ffffffff:::ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::::۶ff:۶f:ff:ې:::ې::fې::::f:f:::fѹ?ѹ𕌉2T::ېf:ې::f::ff:ې::f:fffې:pppD}Lr&O@EJPTY`ekqv|!"#%&=\Hpppf::fff::ff::۶ff::ff:ff:ff::ff:ffff:fff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:ѹ?ѹ𕌉ff::ېf:ff۶::ې::ff::ff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ېf::f::ff::ې::ې::ffffff۶::ff::f:ѹ?ѹ𕌉2T::ې:fff::ېf:::ېpppR`qMS(ZNQW\ahmsy~!"#%(=_Dppp::ې::ff::ې::ې:ې:::ې::ې::ff::ې::ېf:f:ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ffѹ?ѹ𕌉:fېff::ې::::f:::f:::ېf:ې::f::ff:ې::f:fffې:ѹ?ѹ𕌉Jff""""""""TpppbhogD~O-eX]bhnsy!"$%)@]Dppp:fff:::fېff::::::::ѹ?ѹ𕌉:ې:::::ې::::::ې::۶:fې:::::fې::ې:fff::ېf:::ېѹ?ѹ𕌉mmmVVzpppbhpmGvEQ-ncinuz !#$&'>]Hpppff:::ې:::::ې::::::ې::ѹ?ѹ𕌉::ې::ffffѹ?ѹ𕌉pppciqqOzN~GW0zrv| "#$&)>`Dpppѹ?ѹ𕌉ѹ?ѹ𕌉mmmpppdjruTXePT5} "#$&)A]Dpppѹ?ѹ𕌉ѹ?ѹ𕌉pppekryX\buFV6!"#%'(?]Hpppѹ?ѹ𕌉ffffѹ?ѹ𕌉pppels}^agmuE\9&%'*?aDpppѹ?ѹ𕌉ffffѹ?ѹ𕌉pppfltс˃ΖhnuEZ=)*A]Dpppѹ?ѹ𕌉::ېfff:::f:::ې::::f::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې:::fې:ѹ?ѹ𕌉2^^RjjpppXY[fltfmtfmugnuXY[H[>@^Hpppѹ?ѹ𕌉f:::ې:::ې::fffې:::ې:::::fې:::f:::ې:ې::ې::ېf:::::fې::ې:::::fff::f:::ې::ې:::f:::ې:ېf:ffېf::ې돏Ŀѹ?ѹ𕌉㑑2T::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې:pppFaaEpppѹ?ѹ𕌉ff۶::ې::f::fې::ې::::fې:::::::ې::ې::ې::ff۶::fې:::ې::::::::::::ې::ې::ې::ې::::ې::ې::ې::ffuuuѹ?ѹ𕌉㑑2Tf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ېf::ېpppFFpppѹ?ѹ𕌉ff::ff:fې::ې::::ې::::::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:fffsssѹ?ѹ𕌉푑2Tff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ffppppppѹ?ѹ𕌉ffffffff:::ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::f:ff{{{ѹ?ѹ𕌉cKcKcKcKcK푑mmmmmmmmm2Tff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ffppppppѹ?ѹ𕌉ff::ېf:ff۶::ې::ff::ff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ې::ѹ?ѹ𕌉2Tff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:f:ffppppppѹ?ѹ𕌉:fېff::ې::::f:::ѹ?ѹ𕌉2Tff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff::ppppppѹ?ѹ𕌉:ې:::::ې::::::ې::۶:fې::::ѹ?ѹ𕌉2T:fېff::::::::uuuuuuѹ?ѹ𕌉::ې::ffѹ?ѹ𕌉2T:ې:::::ې::::::ې::葑ѹ?ѹ𕌉ѹ?ѹ𕌉Jff""""""""Twwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwѹ?ѹ𕌉ѹ?ѹ𕌉VVzѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?ѹ𕌉½½ѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?ѹ𕌉ѹ?տտտտտѹ𕌉ϕ󕌉󕌉ѹտտտտտ?տտտտտѹ𕌉󕌉󕌉ϕѹտտտտտ?տտվվվѹ𕌉ѕ󕌉󕌉ѹտվտտտ?տտվվվѹ𕌉󕌉󕌉ѕѹտվտտտ?ԾԾԾԾԾѹ𕌉TTҖvv00ҴҕTTҖTTҖѹԾԾԾԾԾ?ԾԾԾԾԾѹ𕌉TTҖvv00ҴTTҖҕѹԾԾԾԾԾ?ԾԾԾԾԾѹ𕌉UԗUww00ԶԕUԗUUԗUѹԾԾԾԾԾ?ԾԾԾԾԾѹ𕌉UԗUww00ԶUԗUԕѹԾԾԾԾԾ?ԽԽԽԽԽѹ𕌉1Wؚz1WؚWz1ع1zؚWz1Wؚz1z1zz11عWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz1ؕ1zWWWW1z11zz11zz11عWz1zz11عWz1zz11عzz11ع1zWz1z1zz11عWWW1z11عzz11عzz11عz1ؚWWWW1z11عWz1z1z1عWz11z1عzWz1WWW1z11عWz11zWW1z11عWz1z1Wؚz1WؚWz1عѹԽԽԽԽԽ?ԽԽԽԽԽѹ𕌉1Wؚz1WؚWz1ع1zؚWz1Wؚz1z1zz11عWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz11z1عzWz1WWW1z11عWWW1z11عz1Wؚzz11عzz11عz1Wؚz1Wؚz1ؚWWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz11zWWWW1z11zz11zz11عWz1zz11عWz1zz11عzz11ع1zWz1z1zz11عWWW1z11عzz11عzz11عz1ؚWWWW1z11عWz1z1z1عWz1ؕffѹԽԽԽԽԽ?ԽԽԽԽԽѹ𕌉{11ڻڜWڜW1{W1Wڻ{{{11ڻ1{{1ڻڜW{1{{11ڻW{1ڻWڜW{{11ڻ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{ڕ1{WڜWW{{11ڻ1{{1{{11{{11{{Wڻ11{{{{11ڻ1Wڻ{{{11{{11ڻ{{11ڻ1{WڜWWڜWڜW{{11ڻ{W1ڜ{{11ڻ{{11ڻ{{11ڻ1{ڜW{{11ڻ1{{1ڻ{W1ڜWڜW{ڻ{Wڻ11{ڻ{ڜW1{{11ڻ{W1ڜ{{11ڻ1{{1ڻ{W1ڜ{W1ڜ1{{1{{Wڻ11{ڻ{{{11ڻڜWڜW1{W1Wڻ{{{11ڻѹԽԽԽԽԽ?ԽԽԽԽԽѹ𕌉{11ڻڜWڜW1{W1Wڻ{{{11ڻ1{{1ڻڜW{1{{11ڻW{1ڻWڜW{{11ڻ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{ڜW1{{11ڻ{W1ڜ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11ڻ{{11ڻڜWڜW1{W1{ڜW{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{1{WڜWW{{11ڻ1{{1{{11{{11{{Wڻ11{{{{11ڻ1Wڻ{{{11{{11ڻ{{11ڻ1{WڜWWڜWڜW{{11ڻ{W1ڜ{{11ڻ{{11ڻ{{11ڻ1{ڜW{{11ڻ1{{1ڻ{W1ڜWڜW{ڻ{Wڻ11{ڻ{ڕffѹԽԽԽԽԽ?ӽӽӽӽӽѹ𕌉{11ۼ{{11ۼ{X1X{1ۼ{{11ۼۜ1Xۼ{{{11{{11ۼۜ1X{{{11ۼ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜە::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې:1Xۼ{{11ۼ{{{11{{11{{11ۼۜXX{{11X{1ۼ{{11{{11ۼ{{11ۼۜ1Xۼ{{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11ۼۜXXۜۜXXۜ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11ۼ{{11ۼۜXXۜ{{11ۼ{{11ۼ{X1X{1ۼ{{11ۼѹӽӽӽӽӽ?ӽӽӽӽӽѹ𕌉{11ۼ{{11ۼ{X1X{1ۼ{{11ۼۜ1Xۼ{{{11{{11ۼۜ1X{{{11ۼ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜۜXXۜ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼ{{11ۼ{{11ۼ{X1{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜ1Xۼ{{11ۼ{{{11{{11{{11ۼۜXX{{11X{1ۼ{{11{{11ۼ{{11ۼۜ1Xۼ{{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11ۼۜXXۜە::ېfې:fff:::fې::ff:::fې::f:ff:ѹӽӽӽӽӽ?ӼӼӼӼӼѹ𕌉}22ݾ}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾݝYY}}22ݾݝ2Y}}2Y}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝݕf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ېf::ې}22ݾ}2}2}}22}}22ݾYYݝ}}22}}22ݾ}}22}}22ݾ}}22ݾ}}22ݾ}2Y}}22ݾ}}22ݾ}}22ݾ}}22ݾ}}22}}22ݾ}2}2ݾ}}22ݾ}2YݝYYݝYY}}22ݾ}2}2ݾ}}22ݾ}}22ݾ}}22ݾYYݝ}}22ݾ}}22ݾ}Y2}}22ݾ}}22ݾѹӼӼӼӼӼ?ӼӼӼӼӼѹ𕌉}22ݾ}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾݝYY}}22ݾݝ2Y}}2Y}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝYY}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾ}}22ݾ}Y2}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝ}22ݾ}2}2}}22}}22ݾYYݝ}}22}}22ݾ}}22}}22ݾ}}22ݾ}}22ݾ}2Y}}22ݾ}}22ݾ}}22ݾ}}22ݾ}}22}}22ݾ}2}2ݾ}}22ݾ}2YݝYYݝݕf:::ېf::::ې:ېf:f::ې:ېf::ې::ff:۶f:fې::ѹӼӼӼӼӼ?ӼӼӼӼӼѹ𕌉55^^5ɨ^^^5555^^ɨ55Ʉ^^^^555^^^55Ʉ55^^5ɨ^5^^5^5^^때ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ff^5^^55Ʉ55^5^^ɨ55^^555^^5^5^^555^55Ʉ55Ʉ55Ʉ555^^^55ɨ^^55^5^^^^55^^55Ʉ5555^5^^55^^5ɨ^^^55ѹӼӼӼӼӼ?ӼӼӼӼӼѹ𕌉55^^5ɨ^^^5555^^ɨ55Ʉ^^^^555^^^55Ʉ55^^5ɨ^5^^5^5^^^^55^^55Ʉ55^^5ɨ^5^^555^^5ɨ^5^^^55Ʉ55^^5ɨ^5^^5^5^^^5^^55Ʉ55^5^^ɨ55^^555^^5^5^^555^55Ʉ55Ʉ55Ʉ555^^^55ɨ^^55^5^^때ff::ې::ې::ې::ې::::ff::::f:f:::ѹӼӼӼӼӼ?ӼӼӼӼӻѹ𕌉555^555^ʄ55^555^^55ʄ55^^55ʄ5^^555ʄ5^쨄55^^55알ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ff55ʄ55ʄ55ʄ5555ʄ55ʄ55ʄ55^^55ʄ55ʄ55^^5^^555^5ʨ^^55ʄ5ʄ555ʄ55^^5ʄ555ʄ5^^5555555555^55ѹӼӼӼӼӼ?ӼӼӼӼӻѹ𕌉555^555^ʄ55^555^^55ʄ55^^55ʄ5^^555ʄ5^쨄55^^55^^5ʄ555ʄ5^^555ʄ5^쨄55^^555^^^55ʄ5^^555ʄ5^쨄55^^5555ʄ55ʄ55ʄ5555ʄ55ʄ55ʄ55^^55ʄ55ʄ55^^5^^555^5ʨ^^55ʄ5ʄ555ʄ55알ff::::ې::ې::::ff::::f:۶::::ѹӼӼӼӼӼ?ӻӻӻӻӻѹ𕌉555̅5_̅555핌ff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:f:ff5___55̅555___55_5555_̅__555555ѹӻӻӻӻӻ?ӻӻӻӻӻѹ𕌉555̅5_̅5555_̅__555555555___55̅555___55_555핌ff::ff::ې::::f:ff::ff:۶fff::ѹӻӻӻӻӻ?һһһһһѹ𕌉555Ά555Ά55ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff::``55Ά5555``55Ά55Ϊ5`Ά55555Ά5555555ѹһһһһһ?һһһһһѹ𕌉555Ά555Ά555Ά55555Ά555555Ά55``55Ά5555``55Ά55Ϊ5`Ά5555ff:ې:::ې:ff::::::::::f::ѹһһһһһ?һһһһһѹ𕌉𕌉:fېff::::::::66·66``ѹһһһһһ?һһһһһѹ𕌉66·66``𕌉:fېff::::::ѹһһһһһ?һһһһһѹ𕌉񕌉:ې:::::ې::::::ې::ѹһһһһһ?һһһһһѹ𕌉񕌉:ې:::::::ѹһһһһһ?ҺҺҺҺҺѹ𕌉򕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉򕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉򕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉򕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉ѹҺҺҺҺҺ?ҺҺҺҺҺѹ𕌉ѹҺҺҺҺҺ?ѺѺѺѺѺѹ𕌉ѹѺѺѺѺѺ?ѺѺѺѺѺѹ𕌉ѹѺѺѺѺѺ?ѺѺѺѺѺѹ𕌉ѹѺѺѺѺѺ?ѺѺѺѺѺѹ𕌉ѹѺѺѺѺѺ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹ̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼ѹѹѹѹѹѹ?ѹѹѹѹѹѹ̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼ѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹ3~b8Z~ѹѹѹѹѹѹ?ѹѹѹѹѹѹ3~b8Z~ѹѹѹѹѹѹ?ѹѹѹѹѹѹ[3߮6Y~ѹѹѹѹѹѹ?ѹѹѹѹѹѹ[3߮6Y~ѹѹѹѹѹѹ?ѹѹѹѹѹѹމa2ޮ6Y}ѹѹѹѹѹѹ?ѹѹѹѹѹѹމa2ޮ6Y}ѹѹѹѹѹѹ?ѹѹѹѹѹѹܮ6X|ܮ6X|6X|܉2[ܮX[[[3|a363X|[[6X|܉26|ܮ6X|ܮ6X|ܮXр2܉26|ܮXX3|a363X|[[6X|܉26|ܮ6X|ܮ6X|܉233|a363X|6X|6X|aa❮6X|a26X|6X|ܮ6X|܉23܉2[6X|[[6X|6X|ܮ6X|ܮXX3|a363X|[[܉2[ܮ6X|ܮ6X|܉2[6X|6X6[XXѹѹѹѹѹѹ?ѹѹѹѹѹѹܮ6X|ܮ6X|6X|܉2[ܮX[[[3|a363X|[[6X|܉26|ܮ6X|ܮ6X|ܮXр2܉26|ܮXX3|a363X|[[6X|܉26|ܮ6X|ܮ6X|܉233|a363X|6X|6X|aa❮6X|a26X|6X|ܮ6X|܉23܉2[6X|[[6X|6X|ܮ6X|ܮXX3|a363X|[[܉2[ܮ6X|ܮ6X|܉2[6X|6X6[XXѹѹѹѹѹѹ?ѹѹѹѹѹѹڬ6W{ڬ6W{6W{W~1ڇ{2{~16W{`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{ڬ6W{ڬWWڇ`12{~1`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{`Wڇ{`ڇ2໇61{6W{6W{6~~16W{WW6~6{6W{ڬ6W{`Wڇ{W~1ڬ6W{ڬ6W{ڬ6W{6W{ڬ6W{2{~1`ڇ2໇61{6W{ڬW~1ڬ6W{ڬ6W{W~1ڬ6W{W~1ڇ`1ѹѹѹѹѹѹ?ѹѹѹѹѹѹڬ6W{ڬ6W{6W{W~1ڇ{2{~16W{`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{ڬ6W{ڬWWڇ`12{~1`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{`Wڇ{`ڇ2໇61{6W{6W{6~~16W{WW6~6{6W{ڬ6W{`Wڇ{W~1ڬ6W{ڬ6W{ڬ6W{6W{ڬ6W{2{~1`ڇ2໇61{6W{ڬW~1ڬ6W{ڬ6W{W~1ڬ6W{W~1ڇ`1ѹѹѹѹѹѹ?ѹѹѹѹѹѹ٫6Wz٫6Wz6Wz`1ߛ6~Y6Wzه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz٫6Wzه`1ߛYW`1ߛه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz2zWه`1ߛ62zz6Wz6Wz6~W6Wzه21ߺ٫6Wz6Wz٫6Wz2zWه`1ߛ٫6Wz٫6Wz٫6Wz6Wz٫6Wz`1ߛه`1ߛ62zz6Wzه`1ߛ٫6Wz٫6Wz`1ߛ٫6Wz6Wz2zWѹѹѹѹѹѹ?ѹѹѹѹѹѹ٫6Wz٫6Wz6Wz`1ߛ6~Y6Wzه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz٫6Wzه`1ߛYW`1ߛه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz2zWه`1ߛ62zz6Wz6Wz6~W6Wzه21ߺ٫6Wz6Wz٫6Wz2zWه`1ߛ٫6Wz٫6Wz٫6Wz6Wz٫6Wz`1ߛه`1ߛ62zz6Wzه`1ߛ٫6Wz٫6Wz`1ߛ٫6Wz6Wz2zWѹѹѹѹѹѹ?ѹѹѹѹѹѹ׫6Vy׫6Vy6Vy1Yׇ1V6Vy`6y6Vy׫6Vy`1ޚYV6Vy׫6Vy׫6Vyׇ`1ޚYV`1ޚ`6y6Vy׫6Vy`1ޚYV6Vy׫6Vyׇ`1ޚ`6y6Vy6Vy1}1׫6Vyׇ21޹׫6Vy6Vy׫6Vyׇ`1ޚׇ1Y6Vy׫6Vy׫6Vy6Vy׫6Vy`1ޚ`6y6Vyׇ1Y׫6Vy׫6Vy1Y6Vy6VyYVѹѹѹѹѹѹ?ѹѹѹѹѹѹ׫6Vy׫6Vy6Vy1Yׇ1V6Vy`6y6Vy׫6Vy`1ޚYV6Vy׫6Vy׫6Vyׇ`1ޚYV`1ޚ`6y6Vy׫6Vy`1ޚYV6Vy׫6Vyׇ`1ޚ`6y6Vy6Vy1}1׫6Vyׇ21޹׫6Vy6Vy׫6Vyׇ`1ޚׇ1Y6Vy׫6Vy׫6Vy6Vy׫6Vy`1ޚ`6y6Vyׇ1Y׫6Vy׫6Vy1Y6Vy6VyYVѹѹѹѹѹѹ?ѹѹѹѹѹѹ֪VV5Vy5Vy5Vy`}12yV֪5Vy֪5Vy5Vy֪5VyVVֆ51yVY``ݙ֪5Vy֪VVֆ51y2y}1֪5Vy5Vy֪5VyVVֆ51yVY``ݙֆֆ21ݸ֪5Vy5Vy5Vy`֪Y֪5VyVV5}5yVY``ݙֆֆ21ݸ֪5Vy`}1V}1֪5Vy֪5Vy5Vy֪5Vy2y}1֪5Vy5Vy֪5Vy`}1֪V5y5Vy`}15VyV2ݸ51yѹѹѹѹѹѹ?ѹѹѹѹѹѹ֪VV5Vy5Vy5Vy`}12yV֪5Vy֪5Vy5Vy֪5VyVVֆ51yVY``ݙ֪5Vy֪VVֆ51y2y}1֪5Vy5Vy֪5VyVVֆ51yVY``ݙֆֆ21ݸ֪5Vy5Vy5Vy`֪Y֪5VyVV5}5yVY``ݙֆֆ21ݸ֪5Vy`}1V}1֪5Vy֪5Vy5Vy֪5Vy2y}1֪5Vy5Vy֪5Vy`}1֪V5y5Vy`}15VyV2ݸ51yѹѹѹѹѹѹ?ѹѹѹѹѹѹԪ5UwԪ5Uw5UwԆ0_ۗԪU{0ԪUXXXUX5UwԆ0UԪ5U_{w{0Ԫ5UwԆ0U1wUXXUX5UwԆ0UԪ5U_{w{0Ԇ_0ۗXXԪ5Uw5Uw1wU5UwԆ0{05Uw5U_{w{0Ԇ_0ۗԆ0_ۗ5U5XUX5UwU{05Uw1wUXXUXԆ0_ۗԪ5UwԪ5UwԆ0_ۗ5Uw5Uw0{0ѹѹѹѹѹѹ?ѹѹѹѹѹѹԪ5UwԪ5Uw5UwԆ0_ۗԪU{0ԪUXXXUX5UwԆ0UԪ5U_{w{0Ԫ5UwԆ0U1wUXXUX5UwԆ0UԪ5U_{w{0Ԇ_0ۗXXԪ5Uw5Uw1wU5UwԆ0{05Uw5U_{w{0Ԇ_0ۗԆ0_ۗ5U5XUX5UwU{05Uw1wUXXUXԆ0_ۗԪ5UwԪ5UwԆ0_ۗ5Uw5Uw0{0ѹѹѹѹѹѹ?ѹѹѹѹѹѹԩ5Uwԩ5Uw_ԅ1۶ԩ5Uwԩ5Uwԩ5Uwԩ5Uw1wUԩ5Uw5Uw1wUԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwѹѹѹѹѹѹ?ѹѹѹѹѹѹԩ5Uwԩ5Uw_ԅ1۶ԩ5Uwԩ5Uwԩ5Uwԩ5Uw1wUԩ5Uw5Uw1wUԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwѹѹѹѹѹѹ?ѹѹѹѹѹѹ8\ɀ8\ɀb38\ɀ8\ɀ8\ɀ8\ɀ3\8\ɀ8\ɀ3\8\ɀ\\8\ɀ8\ɀ8\ɀ8\ɀѹѹѹѹѹѹ?ѹѹѹѹѹѹ8\ɀ8\ɀb38\ɀ8\ɀ8\ɀ8\ɀ3\8\ɀ8\ɀ3\8\ɀ\\8\ɀ8\ɀ8\ɀ8\ɀѹѹѹѹѹѹ?ѹѹѹѹѹѹ]ӄ484ʂ8]ʂbb84ʂ8]ʂ84ʂ558]ʂ8]ʂ84ʂ5584ʂb584ʂ8]ʂ8]ʂ8]ʂѹѹѹѹѹѹ?ѹѹѹѹѹѹ]ӄ484ʂ8]ʂbb84ʂ8]ʂ84ʂ558]ʂ8]ʂ84ʂ5584ʂb584ʂ8]ʂ8]ʂ8]ʂѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?ѹѹѹѹѹѹѹѹѹѹѹѹ?444ѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹB444444ѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹB444444иииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииD444444иииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииD444444ϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷG444444ϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷG444444εεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεӺqziziziziziziziziziziziziziziziziziziziziziziziziziziziqӺεεӺqziziziziziziziziziziziziziziziziziziziziziziziziziziziqӺεε5&O"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C5&OεεεεεεεεJ444444εεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεӺqziziziziziziziziziziziziziziziziziziziziziziziziziziziqӺεεӺqziziziziziziziziziziziziziziziziziziziziziziziziziziziqӺεε5&O"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C5&OεεεεεεεεJ444444ʹʹʹʹʹʹʹʹʹ ʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹqʾʾqʹʹqʾʾqʹʹ8)P웚8)PʹʹʹʹʹʹʹʹN444444ʹʹʹʹʹʹʹʹʹ ʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹqʾʾqʹʹqʾʾqʹʹ8)P웚8)PʹʹʹʹʹʹʹʹN444444̳̳̳̳̳̳̳̳aV  ̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳Hs(̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳yhзззззззззззззззззззззззззззؑyh̳̳yhзззззззззззззззззззззззззззؑyh̳̳"Coo~oo~o~o~o~noon~nonnn~onn~n~n~o~o~o~o~o~o~ҵ"C̳̳̳̳̳̳̳̳R444444̳̳̳̳̳̳̳̳aV  ̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳Hs(̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳yhзззззззззззззззззззззззззззؑyh̳̳yhзззззззззззззззззззззззззззؑyh̳̳"Coo~oo~o~o~o~noon~nonnn~onn~n~n~o~o~o~o~o~o~ҵ"C̳̳̳̳̳̳̳̳R444444˲˲˲˲˲˲˲˲HwX ˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲GG˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲xg˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲֐xg˲˲xg˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲֐xg˲˲"CdudududududududududududududududududududududududueududuΫ"C˲˲˲˲˲˲˲˲V444444˲˲˲˲˲˲˲˲HwX ˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲GG˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲xg˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲֐xg˲˲xg˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲֐xg˲˲"CdudududududududududududududududududududududududueududuΫ"C˲˲˲˲˲˲˲˲V444444ɱɱɱɱɱɱɱɱɱ %Xksbɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱ3Gdɱɱɱɱ[q(ɱɱɱGQɱɱGq(ɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱvfŬŬŬŬŬŬŬŬ|fVSfVSfVSfVSfVSfVSfVSfVSfVS|ŬŬŬŬŬŬŬŬҏvfɱɱvfŬŬŬŬŬŬŬŬ|fVSfVSfVSfVSfVSfVSfVSfVSfVS|ŬŬŬŬŬŬŬŬҏvfɱɱ"CWjXjXjXjWjWjXjWj__fVSfVSfVS__Xj__fVSfVSfVS__WjXjWjWjWjWiXjXjɠ"Cɱɱɱɱɱɱɱɱ[444444ɱɱɱɱɱɱɱɱɱ %Xksbɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱ3Gdɱɱɱɱ[q(ɱɱɱGQɱɱGq(ɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱvfŬŬŬŬŬŬŬŬ|fVSfVSfVSfVSfVSfVSfVSfVSfVS|ŬŬŬŬŬŬŬŬҏvfɱɱvfŬŬŬŬŬŬŬŬ|fVSfVSfVSfVSfVSfVSfVSfVSfVS|ŬŬŬŬŬŬŬŬҏvfɱɱ"CWjXjXjXjWjWjXjWj__fVSfVSfVS__Xj__fVSfVSfVS__WjXjWjWjWjWiXjXjɠ"Cɱɱɱɱɱɱɱɱ[444444ȰȰȰȰȰȰȰȰȰȰCxe #ȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰ3FcȰȰȰ[[~ȰȰFq'ȰcȰȰ-cq'Ȱ3FcȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰveؾؾؾؾؾؾؾؾfVSfVSؾؾؾؾؾؾؾؾΎveȰȰveؾؾؾؾؾؾؾؾfVSfVSؾؾؾؾؾؾؾؾΎveȰȰ"CJ^K^K^J_J^J^J^J^fVSfVSYZfVSfVSK^J_J^J_J_K^J^J^Ę"CȰȰȰȰȰȰȰȰ_444444ȰȰȰȰȰȰȰȰȰȰCxe #ȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰ3FcȰȰȰ[[~ȰȰFq'ȰcȰȰ-cq'Ȱ3FcȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰveؾؾؾؾؾؾؾؾfVSfVSؾؾؾؾؾؾؾؾΎveȰȰveؾؾؾؾؾؾؾؾfVSfVSؾؾؾؾؾؾؾؾΎveȰȰ"CJ^K^K^J_J^J^J^J^fVSfVSYZfVSfVSK^J_J^J_J_K^J^J^Ę"CȰȰȰȰȰȰȰȰ_444444ǮǮǮǮǮǮǮǮǮǮǮ-.fvh#(ǮǮǮǮǮǮǮǮǮǮǮǮǮǮ3FbǮǮǮ-bFǮǮǮZ'|ǮǮǮǮ3pPǮ3FbǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮudϵϵϵϵϵϵϵϵfVSfVSϵϵϵϵϵϵϵϵʍudǮǮudϵϵϵϵϵϵϵϵfVSfVSϵϵϵϵϵϵϵϵʍudǮǮ"C>S>S>S>S>S>S=S>SSUfVSfVSfVSSU>S>S>S>S>S>S>S>S"CǮǮǮǮǮǮǮǮd444444ǮǮǮǮǮǮǮǮǮǮǮ-.fvh#(ǮǮǮǮǮǮǮǮǮǮǮǮǮǮ3FbǮǮǮ-bFǮǮǮZ'|ǮǮǮǮ3pPǮ3FbǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮudϵϵϵϵϵϵϵϵfVSfVSϵϵϵϵϵϵϵϵʍudǮǮudϵϵϵϵϵϵϵϵfVSfVSϵϵϵϵϵϵϵϵʍudǮǮ"C>S>S>S>S>S>S=S>SSUfVSfVSfVSSU>S>S>S>S>S>S>S>S"CǮǮǮǮǮǮǮǮd444444ŬŬŬŬŬŬŬŬŬŬŬŬ 6~je #ŬŬŬŬŬŬŬŬŬŬŬŬ2EaŬŬ~Z'{ŬŬŬŬ2,aaŬŬŬ~'EŬ2EaŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬtcͲͲͲͲͲͲͲͲfVSfVSͲͲͲͲͲͲͲͲɍtcŬŬtcͳͳͳͳͳͳͳͳfVSfVSfVSfVSfVSfVSfVSͳͳͳͳͳͳͳͳɍtcŬŬ"C3I3J3J3J3J3J4J4I3JNQfVSfVSNQ4I3I3I3I4J4J3I3I3I"CŬŬŬŬŬŬŬŬi444444ŬŬŬŬŬŬŬŬŬŬŬŬ 6~je #ŬŬŬŬŬŬŬŬŬŬŬŬ2EaŬŬ~Z'{ŬŬŬŬ2,aaŬŬŬ~'EŬ2EaŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬtcͲͲͲͲͲͲͲͲfVSfVSͲͲͲͲͲͲͲͲɍtcŬŬtcͳͳͳͳͳͳͳͳfVSfVSfVSfVSfVSfVSfVSͳͳͳͳͳͳͳͳɍtcŬŬ"C3I3J3J3J3J3J4J4I3JNQfVSfVSNQ4I3I3I3I4J4J3I3I3I"CŬŬŬŬŬŬŬŬi444444īīīīīīīīīīīīīmj jxrTXRSaVŹ,^Rο?Q@;_Gª-V7$M-]vԳ§̮JnzÝݹǥ|(^37Y00^3 J^0g;Z/,d;1a7*[/2f7.e4H6t@ުFo^ari[]tqsl-2.8.1/apps/help/tqslapp/Pending.bmp0000644000175000017500000000206615003421124020142 0ustar rmurphyrmurphyBM66( jjjjjggjjjjjkjjg[PffP[gjjjjjj b\\ bjjjjj bpp bjjjg\\gjj[.y;[jjP1{FdPjgfSMofggf0z^fgjP1{aPjj[0{ b[jjg\&u^\gjjj bpV5~p bjjjjj b\\ bjjjjjjg[PffP[gjjjjjjjjggjjjjjtqsl-2.8.1/apps/help/tqslapp/RenewUpload.bmp0000644000175000017500000067075615003421124021024 0ustar rmurphyrmurphyBMq6(q⽺^\Z865653210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210432VUR{y;X8rcMKI渶@?={>((|{yonlRPNA@>%%%TkieeeJHF/.,IHFꥣnlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinli.-,-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nliһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\@\@Y>U:P4K4XGnli-,+-,+nliяفh]A#AK*S3W8U6Q3S5YY=W=V;V;U8aO쎎fff9ff9fۏ9fۏ999fۏf9ff9fۏ9fۏf9ff9fۏ9fۏ9fۏ9f9f999fۏf9ۏ9fۏ9fۏf9ۏf9f9f9ff9fۏ9fۏ9fۏ9fۏ9fۏf9ff9fۏ9fۏ9fۏf9ff9fۏffff9ۏ99ۏ99fۏf9ff999fۏf9ff9fۏ9fۏ9fۏ9fۏ9ۏ9nli-,+-,+nliF(786668@B^AŶoW:\?\?\?[?[>[>Z>Z=P3ff99ff99ۏ9fۏ9fۏff99ۏff99ۏffffff99ۏ9fۏffff9fۏfۏ99fۏfۏ9ff99ۏ9fۏffff9fۏ9ۏ99ۏ9ff99ۏ9fۏ9fۏffff9fۏff99ۏffff9fۏff99ۏ9fۏff9f9fۏff9fۏff99ۏff99ۏff99ۏ9fۏf9ff9fۏffnli-,+-,+nli~~{s?;;8878=DDF!R2Q1R2[=\?\?\?\?\?[?[>Z=Y;[G999f9f9fۏ9fۏ999fۏ9f9ffۏ99fff9ffۏ99f9f999fۏff9ffۏ9ff9f9f9f9fۏ9fۏ9ffۏ9ff9f9ffۏ99fۏ9f9fۏ99ۏ99ۏffffff9f999fۏ9fff9f9ۏ99fۏ9fnli-,+-,+nliǡԛbJO(@<<::8<>O-q^saweW=V7Z<[=\?\?\?[?[>Z=Y=;;;6gLנmZN+V7Y:Z;Z<[=[=Z=<<6]?ըzAS2T4U6V7V7V8V8V7U5T5YDڎfۏ9ff9fۏ9fۏ9fۏfۏ9ff9fۏff9fۏ9fۏ99ۏnli-,+-,+nli{{|vk[3Z3Y2W2Q)D?>=;EĶĿľgT@O,Q0Q1R2R2R2R1Q1P0O5{{|nli-,+-,+nlinnopa`6]5\4[3Z4T.G@>>8u_we>J'K*L*L*L*K*K)J)K/nnonli-,+-,+nlinnotcd;_7^6]5\4[4Y3R*H @==t^ֵ<E F"E"E"F#E"F#I+nnonli-,+-,+nli{{|vg>c;c;`8_7]6\5\5Y3R+I!@7 hNÿr\8BBBBB D!G,{{|99ۏ9fۏ9fۏnli-,+-,+nliڥnGd;f=du»;?AAAA@YDڎ999fۏ9fۏnli-,+-,+nliڂ^h>g=f>e=c;a:_8W0T+\3[4Z4O'x[P1ABBBD =ff9fۏ9fۏnli-,+-,+nliǡΘuNg=h?f>f=d<_6ϐypR-P'P&HΙeHO(Q,P,O+N+G$ˢf9ۏ99ۏff99ۏfff9fۏ99ۏ99ۏ9f999fۏ9fۏ9fۏffff99ۏfff9fۏ9f9fff9fۏ99ۏ9f999fۏf99fۏff9fۏ9fۏ9fۏffff9f9fۏff9fۏ9fۏ9fۏff9f999fۏff9f9fۏ9ff99fۏfff9fۏ9fffffff99ۏfۏ999ۏ9fۏ9ۏ9ff9fۏ9fۏ99ۏ99ۏ99ۏf9nli-,+-,+nli~~봣ki>jAi@h?g=^4ķśwѪY8P*Q,P,O*J$fP~~9fۏfffff9f9999fۏfff99ff9ۏ9999ۏ99fffۏ9f9ۏ99ۏ9fۏ9fۏ9fۏ9fۏfff99ff9ۏfۏ9f99fۏfff9f9ۏ99ۏff99ۏ9fۏ9fۏ9fۏ9fۏ9ۏ99ۏ9fۏ99fۏ9fۏ9fۏ9fۏ9fۏ9ۏ9f9ۏ99ۏ9fۏfۏ99fۏfۏ9ff99ۏ9ff9ۏfۏ99ۏ99fۏ9fۏfff99fۏfff99fۏ99ۏff9fۏ9fۏfff99999ۏ99fffۏ9f9nli-,+-,+nli᧒zSj@mDkBh?a6ŶٸL&R,Q,P+O*B9fۏf9f9ff9ۏ99ۏ9f9ff9fۏ9fۏ99ۏ9ff9۶99ۏf999ۏ9fۏ9fۏ9fۏ9fۏf9ff9fۏ9fۏ9fۏ9f9fۏf9fff999ۏ999fۏ9fۏ9fۏ9fۏ9fۏ9ff9f99fۏ9fۏ9fۏ9fۏ9fۏf9f999ۏ9fۏf99fۏf9999fۏ9fۏ9fۏf99f9fۏ9fۏf9ff9fۏf9ff9fۏ999ff999ۏ9fۏ9fۏf9ff99ۏ9ff9۶99nli-,+-,+nliَzoEmDnEkBc7ñԺfDR+U.S,Q+Gve펎9fۏ99ۏf9ffff9fۏf9ff9fۏ9fۏ999f9999ۏf9ۏ9fۏ9fۏ9fۏ9fۏf9ff9fۏ9fۏ9fۏff9fۏf9fff9ۏ999fۏ9fۏ9fۏ9fۏ9fۏ9ۏ9f99f9fۏ9fۏ9fۏ9fۏ9fۏf9f9ۏ9fۏ9f9fۏ9f999fۏ9fۏ9fۏ9f9ۏ99fۏ9fۏf9ff9fۏf9ff9fۏffff9ۏ99ۏ99fۏ9fۏf9ff999f9999ۏffnli-,+-,+nlinmBnEnEj?|V㵣hDU,Z3W1V0L$]@۷9fۏ9fff99ۏffffff99ۏ9fۏ9fۏfff999ۏ99ۏ99fۏffff9fۏ9fۏff99ۏ9fۏ9fۏf9ۏ99ۏ9fۏff99ۏ9fۏff99ۏ9fۏf9ff9fۏff9ۏ99fۏfۏ9fۏ99fۏ9fۏ9fۏ9fۏ9ۏ99fۏ9fۏ9fۏfۏ9fۏ99fۏfۏ9ff99ۏ9fۏ9fۏ9fۏfۏ9ff9fۏ9fۏff99ۏ9fۏff99ۏ9fۏff9f9fۏffffffff99ۏfff999ۏ99ۏ999nli-,+-,+nli땕ǺpqFmBoFi?e8pHۂ_ߐrݐr^jDY0\3^6\4[4Q)^>ӕ9fۏ9f9f9ff9ۏ9f9fۏ9fۏff9fۏf9ff9ffۏ9ffff9f9fۏ9fۏ9f9ۏ99fۏ9fff999fۏff9f9ۏ99fۏ9f9f9f9f9fff9fۏfۏ99fۏ9fffff9f9f9fff9f999fۏ9fۏ9fۏ9f9fffff9f9fۏ9f9fۏ99ۏ99ۏffff9ffۏ99fff9fۏf9f9nli-,+-,+nli؏ȿ|SmAnDnEjAg=d8a7c7c:duSfۏ99fۏ9fۏ9fۏ99ۏ99ۏf999ۏ9fۏfۏ9ff9fۏffffnli-,+-,+nli배Ĵʧ}xŘŪ뿿nli-,+-,+nli٩~~~~nli-,+-,+nliǨ{{|nnonno{{|nli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+HGE򩨦nlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinli-,+HGE-,+HGE-,+HGE-,+HGE-,+HGE-,+HGE-,+HGE-,+HGEƆ-,+HGEƆ-,+HGEƇfn=Dr19^19^4:^5;`7e:@e:Af;Ag;Ag;Ai;Ai;Bi;Bi;Ai;Bi;Ai;Ai;Ag;Ah;Bi;Ai;Ai;Ag;Ag:Af:@e8>e7=e7^٧<>^-,+HGE¬PQڪĭQR٭QĈRوņRQ٪ÇíPfjܪդԢԣգףأڢۢܢݢޢߡࡰᡰᡰᡰᡰᡰᡰᡰᡰᡰᡰᡰᡰᡰᡰᡰࢯߢޢݢܢۣڣأףգԥԫտܮfk-,+HGE۬PņLJQQڪR٭QņņRLJQQڪRܬP5:^آЛΜϛћқӛ՛כ؛ٚښۚݚݚޚޚޚޚޚޚޚޚޚޚޚޚޚޚޚݚݚۚڛٛ؛כ՛ӛқќϜΣ5:^-,+HGEŅRܬPLJQQڪR٭QņņQ۫R۫P(.Qٔ˓˓̓ΒϒВҒӒՒّ֑ؑۑۑܑݑݑݑݑݑݑݑݑܑݑݑݑݑܑۑۑّؒ֒ՒӒҒВϓΓ̓˕˼).Q-,+IHFŅRܬPņĈR٭QĭQRوQ۫RڇQ%*N؋ȋɋʋˋ̋ΊЊъӊՊ֊؉ىډۉۉۇŅʼnۇŅʼnۉډي؊֊ՊӊъЋ΋̋ˋʋɋȶ&*N.-,JHFŅRܬPĈņR٭QRQڪLJQPP!(KׅƅDžȅʅ˅ͅ΄Є҄ԄՄׄ؄ڃۃۃۂ鵼鵼邉ł鵼鵼邉ۄڄ؄ׄՄԄ҄Ѕ΅ͅ˅ʅȅDžƲ"(K.-,JHFŅRܬPR٭Q 'Kցŀƀǀɀʀ~~~~~~鲹鲹鲹鲹~~~~΀̀ʀɀǀƁŰ 'K.-,KIGŅRܬPRڭQ&KՀ~~~~~~}}}}}}~~鱹鱹鱹鱹~~}}}}~~~~~~ŀį&K/.,LJHŅQܬPR٭Q")Mփƃǃȃʃ˃͂ςтӂՂւ؁فہ܁܁܁܁܁ƀ곻곻ꀈƁ܁܁܁ہق؂ւՂӂтσ̓˃ʃȃǃƱ")M0/-NLJ;?Y᧭֧קاڧڧܧާߧ৯᧯㧯䦯妯榯榯禯禯禯睤ϗ𗜾Ϧ禯禯榯榯姯䧯㧯᧮৮ߧާܧڧڧاק;?Y1/.POL>B[⫰ث٫ګܫܫޫ߫૱᫲⫲䫲媲檲窲窲課課蠦ϙ񙞾Ϫ課窲窲櫲嫲䫲⫱᫱૱߫ޫܫܫګ٫>B[210RPNAD]㯳گۯܯݮޮழ᮴⮴㮵䮵段歵筵譵魵魵風Л򛠿򛠿Э魵譵箵段段䮴㮴⮴᮴ழޯݯܯۯAD]432VTQEJa涻޶߶߶ᶻⶻ㶻䶻嶻涼絼赼鵼굼뵼뵼뵼려Ҡ뵼뵼굼鵼趼綻涻嶻䶻㶻ⶻᶻ߶߶EJa;:80?KMb缿໿ỿ⻿㻿ӣӺӣӺ廿仿㻿⻿ἿKMbjjjU((MQdMQdNfcbQSeQSeUSQ䭪RTfRTfめ܅fcaVXkVXj㿽ZXVģvtpVTQSQOOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKOMKONLQOMomjtqsl-2.8.1/apps/help/tqslapp/TQ5.bmp0000644000175000017500000000215615003421124017167 0ustar rmurphyrmurphyBMn6(ea`YWWOOOcefDHIPUVNVVPUVQVUUUUWUUZUTZUTb``|yվϲ\WV䗎[WV둍 '    %UXVx|SXVis: -U8;Q=<WXVky/-3^IR/ ѬX:9 WXTnd#(B** WXTlYXT=Tov r o:8 UNKs~W#j {c] ?/ `[Z肃rxv} GHFzZd^_iclomk~MKJⓡ蘘`[]}op{ztqsl-2.8.1/apps/help/tqslapp/TQ6.bmp0000644000175000017500000000225215003421124017165 0ustar rmurphyrmurphyBM6( wUU % U%(11656)*#))F|BZf  9yCNxw 9>hvd{ }dQK8rnH~~'[a8FYXP[ xn[U]7[6R+EECCB?I%ƩG20 @??????A H,leڎ:۶ffې::f:f:ff:ې:f:ff:ېffohb-*'-*'ohb{{|ukdB_8^6_7R,ECCC?I%ƩG20 @??????AF)xVJ{{|ohb-*'-*'ohbnnosfgDb:`9a9a:V.EBCAH$ȯG21 @??????@F&{O@nnoohb-*'-*'ohbnnouijGe>dV/BF ŹG21 B@@@@@@AG)yYL{{|:fې:fohb-*'-*'ohbښrQlEkCkBkAjBjBjBjBa:V0I31 BAAAAAACI+qjڎfې:f:ې:fېf:ffohb-*'-*'ohbz\rKoGoFoFmFmFmFlEkCkCݳÃC,2 A@@AA@AE"M1ffff:fېf:ffohb-*'-*'ohbǢּsvRsJrIrIrIrIqHpHoHkEoKrMqLrNgBW0T.P)N'K&M&M'O*T2YCң:fېfې:fffې:::ې:f:fې:::f:ffffff:fې:fې:fېf::fېff:f:f:fې:::f:::fې:fې:f:fff:fې:fې:f:::fې::::f::fېfې::f:::::::ې::fېffohb-*'-*'ohb륓ՄbwQuNvMuMuMuMtKsJsKh?`8^9Z2h@jCg@d>b<_9^7[6[6]>pf:fېfffې:ې:ې::fې:ې:f::fې:۶f:۶ffې:f::ff:ې:fې:fېff::ېfff::f:ff::fې:۶f:۶ff:ې::ې:fېfې:f::fې:fېf:ې::ېf::fېff::ې:ې:fې::fې:۶f:۶f:۶f:۶f:ې::fېffohb-*'-*'ohbҕ}[zRyRyQyPyPxPxOqGڅdˢacF}u폏:fېf:::ې:f:fې::::ېff:fې:fې:fېff:fې:fې:fې:fې:::fېffff:fff:fې:fې:ff:ې:fې:fېff:fې:fېf:ې:f:fې:fې:f:::fې:f::ې:f:fې:fې:fې:fې:fېfې::fېffohb-*'-*'ohb˫ߍm^YYWW|R\躧e9pGlCiBh@gBhIl^ٸ:fې:::f:f:fې:ې:ff:fff:fېf:ې::ې:fې:fې:fې:fېff::ېffffff:fff:fې:fې:fېf:ې::ېf:ff:fې:f:fېff::ې:ې:ff:fېfې::fېff:fېff:fېf::fېffohb-*'-*'ohb땕ٲnb][ZY|R˸߇eoFrIpGmElGmNp^ӕ:fېf:::ېfې::fې:fff:::fې:fې:f:ې::fې:fې:fې:fې:::fېff:ff::::fې:fېff:fې:f:ې::f:ې:ff::ې:fې:::fېff:f:f:fې:fې:fې:fې:fې:fېfې:ffohb-*'-*'ohbؐػ|hca\[WhtJxOvMsMrOrTufᐐ:fې:ff:f::fېf:ff:fې:ff::fې:fې:fېff:fې:ff::fې:fېf::fېff:fې:fې:ff::ff:fې::fېffohb-*'-*'ohbѐ̿tifb]|RyM{R}W{VzWxXw^Ӑ:fېf:ې:ې:f::fېffffېff:۶f:۶f:fې:fې:fېffېff:۶f:۶f:fې:fېf::ff:fېfې::ې::ff:fې:۶f:۶f:۶f:۶ff:۶ffffohb-*'-*'ohbؕҿ汜|qlމg܇dׅbЁc~a~hfې:fې:ff:fېfې:ff:f:f:fې::ې:fې:fېf:ې:f:f:fې:fې::f:ېf:ېf:ې:f:ff:ېf:ffohb-*'-*'ohb배Ŀ뿿ohb-*'-*'ohb٩ohb-*'-*'ohbǨ{{|nnonno{{|ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'解rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'οͿͿ̿̿̿ͿͿͿ̾̾ͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾ͿͿ̾̾̾̾ͿͿͿͿͿ-*'-*'Ϳ̿̿̿ͿͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿ-*'-*'Ϳ̿̿̿ͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾ͿͿ-*'-*'ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾-*'-*'ͿͿͿͿͿͿͿͿͿͿ̾̾ͿͿ-*'-*'ͿͿͿͿͿͿͿͿ-*'-*'ͿͿͿͿͿ-*'-*'ͿͿͿͿͿͿ-*'-*'ͿͿͿͿW`*4f (P (P")Q#*S$+T%-U%-V'.W(/X)0Y)1Z)1[)1[)1])1])2])1])1])2])1])1])1[)1\)1])1])1])1[)1[)1Z)0Y(/X'.W%-V%-U$+T#*S")Q (P (P+4gX`-*'-*' ~ ŀLVPNۨJ ŀYILPբ )-Ny}̳୵୵୵㭵䭷䫸竹諹諹꫹뫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫺쬺묺鬺鬹许家家䮶᮶ᴺ᮲y}).N-*'-*' U}VŀV}VۨJ ۧI ۧIWLգW٦HWZ~tp~p~pppooonnllllllllllllmmmmmoopppqqqqquȟԄX[-*'-*' LU֤ ŀYԪKY֪KLU֤LUգWڦI &Opzdqdqcrcrcrbtbvbvbv`x`x`y`z`z`z`z`z`z`z`z`z`{`{a{a{a{a{a{a{azayaycwcwcwcudsdsdsererq{!&O-*'-*'  ŀLVפ ŀYԫKY׫KLVפLUգVڦI>XfTbTbTdTeTeSfSfSfShRiRiPjPjPjPjPjPjPjPjPjPkPkQkQkQkQkQkQkQkQkSjSjTiTgTgTgUfUfUeUcUcYg>-*'-*' L ֤VKӲVۨJV} ۨJLVפLUգVڦI;HVHVHVHVGVGVFXDYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD]WYhXUhXUhXUWYE]E]E]E]E[E[E[EZGYHWHWIWIWIWIW;-*'-*'V|K LUTK ŀLU֤LUգW 9 6(8> ¾Ĥÿ乷𹷵ÿ䥤Ƈօ烀~~~}}ͻͻͻ}}*T𣡞*T𣡞*T𣡞*T*T*T*T*T*TTTҪ*T***T****TT***T***T*T*TTT*T*T𣡞*T*TT**TT*T*循得徃得*T**T*TTTT*T**TTT****T*T**T**T𣡞*T*TT**T*T*TҪ徾Ҫ*T*T*TT*TT*T***TT****T*TT*T**T𣡞*T*T*T*T*TTTҗ徾得*TTT*T*TTT*T*TT*T**T*TT**T*T𣡞T**TT**TT***Ҫ得徃Ҫ*T*T*T*TT*TTTT*TTT***TTTTT***TT**T𣡞*T*T*T*T*T**ҪҪ҃ҪҪҪ*TT**T*T**T*TTTTT*TT*TT**T*T*T𣡞*T*T*T*T***T*TT**T*T𢠝*T*T*T*T**T*T*T*T*T𢠝*T*T*TҪTT*T***T𢠝𜚕𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𗔑hfd𢠝𢠝𠠠𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𜚕𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𜛘gec𣠝𣡞𣡞𣡞𘕒khf𣡞𣡞𣡞𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𣡞𣡞𣡞𝚖𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𢠝𜙗𜙗𜙗𜙗ywu𜙗𡞛𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𝚖𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𚘕}zxvsxvsΔΔΔxvs𔔔디𔔔디𔔔디xvs𤢟𤢟𤢟𤢟𤢟'Pw'PwP'w'PwP'w𤢟'Pwoooooo'PwPw''Pwoooooo'PwPPoooooo𤢟'Pwoooooo'Pw''wwww''Ǡ'Pwoooooo'PwwP'oooooo𤢟PPoooooo'Pwww''PP'Pwoooooo'Pw''wwoooooo𤢟PwwPw''oooooo'PwPPww'''Pwoooooo'Pw'wPoooooo𤢟ww'''wP'PwPP''ww'Pw'Pw'wP𤢟Pw'PP'P'PPw'PPP'Pw'PwwP'𤢟wP'''ww'P'''wP'w'PwPP𤢟Pw'PPPP'w'wPw'𤢟𤢟𞛗𤢟𤢟𔔔디𔔔디𔔔디𤢟ΔΔΔ𤢟𤢟𥣠𥣠𥣠𥣠𥣠'w'w'wP𥣠'wǠPww''Pw'PP𥣠ww''PPwP'''ww𥣠'ww'Pw'w'P'wP'''Pw'wPw'PPP'Pw'Pw'PwPPPww''Pw'wP'''PwPPw'P'P'PPP'Pw'wP'''Pw'Pw'Pw'Pw'ww''Pw'PwPP'Pw'Pw'PwPP'PwPPPPPP'Pw'Pw'PwPPw''wPPP'Pw'Pw'wP'wP'''Pw'Pw'PwPww''PwPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'Pw'PwPP𞛘''ww'PwPw'Pw'w''wwP''P'PPw''Pw'Pw'Pw'Pw'ww'PP'w'wPw'w''w'PwPw'Pw'wP''PwPw'w''w'Pw'Pw'PwPw''Pw'Pw'Pw'Pw'Pw'Pw'ww''Pw'ww''ww''Pw'Pw'Pw'PwwP''''PwPPwP''wPP'w'PwwP''P'PPw'w''w'Pw'PwPP'w'w'ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'Pw'Pwww''𞛘PP'PwwP'wP'''ww'ww''ww'wP''Pw'Pw'Pw'Pw'wPww'''PwwP'''ww'PwwP''Pw'wP'PwwP'''ww'Pw'PwP'''P'Pw'Pw'Pw'Pw'Pw'Pw'wP'Pw'wP'wP'Pw'Pw'Pw'Pw'ww''ww'wP'PP'Pw'Pw'Pw'ww''ww'wP'''ww'Pw'Pwww'''PwwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'PwPP𞛘PP'Pww'PP'wPPw'Pw'P'Pw'Pw'Pw'Pww'w'ww'''PwP'w'Pww'P'PwPP'PwP'w'Pw'Pw'P''w''Pw'Pw'Pw'Pw'Pw'Pww'w''Pww'w'w'w''Pw'Pw'Pw'PwPPw'PwP'PP'Pw'Pw'PwPPw'PP'w'Pw'Pwww'''PwwP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw''ww𞛘PP'Pw'PwPw''PwPPPP'PwPw''PwPw'PP'PwPPPP'w'w'Pw'Pw'PwPw'Pw'w''w'Pw'PwPPPP'Pw'wP'Pw'Pw'PwPw'PP'PwPP'PwPPPP'Pw'Pw'Pw'PwPPPPPPw''w'Pw'PwPw'PPPP'Pw'Pw'PwPP'w'w'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPP𞛘''ww'Pww'PPP'wPPw'w'PPP'Pww'w''Pw'wPw'ww''PwPPPPw'P'Pww'w''PwPP'PPwww''PwPP'PwPw'PP'Pww'w''Pw'wP'Pw'wP'wPPP'Pw'Pw'Pw'wPPw'w'P'Pw'Pw'P'PPP'wPPw'PP'Pw'Pww'ww''Pw'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'ww''𞛘'ww''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP𞛘ww''Ǡ'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw''ww𞛘'wǠP'Pw'Pww''w'Pw'Pw'Pw'Pww''wPw''Pww''ww''ww''w'Pw'Pw'Pww''w'Pw'Pw'Pww''wPw'𞛘🜙𦤡𦤡'w'w'wP'wP𦤡ww''Pw'Pw'𦤡w''wPPwP'wP'𦤡P'w'wP'''PwPPw'Pw''w'PwPP'Pw'Pww'P'Pw'wP'''PwPPPP'w'wPPPPPPw''wPPP'Pw'Pw'Pw'Pw'wP'''PwPww''Pww'Pw''w'Pww''ww''w'Pw'Pw'Pw'Pw'Pw'Pw'wP'''Pw'Pw'ww'w'PPPP'PwPP'Pw'Pw'PwPww''PwPP'Pw'Pw'PwPPPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPw'𦤡'PwPPPw'w''w'PwPw'PPwP''Pw'Pw'Pw'PwPw''PwPw'w''w'ww''PwPw''wPww'ww'PPPw'wP''''PwPPwP''wPP'w'Pw'Pw'PwPw'w''wPP'w'wPw'PPwP''Pw'w'''w''wPPPw''Pw'Pw'Pw'Pw'Pw'PwPw'w''w'PwPw'Pw''wPP'w'ww''Pw'Pw'PwPP'w'w'Pw'Pw'Pw'Pw'ww''ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPw'𦤡'PwwP'wP'''ww'PwwP'wP'PP'Pw'Pw'Pw'PwwP''PwwP'''ww'wP'PwwP'''ww'wǠP'wPwP''ww''ww'wP'PP'Pw'Pw'Pw'Pw'PwwP'''wwww'''PwwP'wP'PP'Pw''www'PP'wwǠw''Ǡ'Pw'Pw'Pw'Pw'Pw'PwwP'''wwP'''PwP''Pw'Pw'wP'Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pw'wPwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw𦤡'Pw''wwP'w'Pww'PwP'PP'Pw'Pw'Pw'Pww'P'PwP'ww'w''PwPP'ww'w'PwP'''wwPPw'PwP'PP'Pw'Pw'Pw'Pw'PwP'www'''Pww'PwP'PP'Pwww'''Pwww''''ww'Pw'Pw'Pw'Pw'Pw'PwP'w'P''w'w'P'Pw'Pww'w''Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pww'w'wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw𦤡'Pw'wP'Pw'Pw'PwPw'PPw''w'Pw'PwPw'PP'PwPw''Pw'PwPP'Pw'wǠP'ww''wPww'''wPPPPPPPw''w'Pw'PwPw'Pw'PP'PwPP'w'w'PwPw'PPw''wPw'PPP'''w''ww''Pw'Pw'PwPw'Pw'PP'Pw'Pw'wP'PwPw''Pw'PwPP'PwPPPPPP'w'w'PwPw'PP'PwPP'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPw'𦤡'Pw'wPPPPPw'Pw'PPw'PP'Pww'w'w'P'PwPP'wPPPPPPw'Pw'wP'''ww'wPPw'w'P'Pw'Pw'Pww'P'ww'PPw'ww''Pww'Pw'P'P'PPPPP'PwwP''Pw'Pw'Pw'Pww'P'ww'PP'PwPPw'P'Pw'Pw'wP'Pw'PPwww'w'ww''PwPP'Pww'w''Pw'wP'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'Pw'𦤡'PwwP''Pw'Pw'Pw'Pw'Pw'PwwP'''wwPw''wPwP''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𦤡'PwPP'PwPP'Pw'Pw'Pw'Pw'wPPPwP'wwP'w'ww''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𦣞Pw'Pw''Pw'Pw'wPPPPw''Pww''w'Pw'Pw'Pww''w'Pww''w'Pw'Pww''w𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𩦢gdb🜙𔒏urp𫩥~𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𮬨𮬨𮬨𧤟𮬨𮬨𮬨𮬨𮬨𮬨𮬨𮬨ΔΔΔ𮬨𔔔디𔔔디𔔔디𮬨𮬨𮬨𮬨xxxxxx(𮬨xxxxxx(𯭩xxxxxx(𯭩'PwUUUUUU++'PwP'w'Pw++P'wxxxxUx(𯭩'PwUUU+++Ԁ++oooooo'PwPw''Pw++oooooo'PwPPxxxxUx(oooooo𯭩'PwUUUU+UU+oooooo'Pw''wwww''Ǡ'PwU+oooooo'PwwP'xxxxUx(oooooo𯭩PPUU+++UUԀ+U++Ԁ+++oooooo'Pwww''PP'Pw+Ԁ+++oooooo'Pw''wwxxxxUx(oooooo𯭩PwwPw''UUUU+Ԁ+++Ԁ++Ԁ++oooooo'PwPPww'''Pw++Ԁ++oooooo'Pw'wPxxxxUx(oooooo𯭩ww'''wPUU+Ԁ++Ԁ+UԀ+U+++'PwPP''ww'PwU+++'Pw'wPxxxxUx(𯭩Pw'PPUU+Ԁ++Ԁ+UU+ԀU++'P'PPw'PPP'Pw+ԀU++'PwwP'xxxxUx(𯭩wP'''ww+UUUUU++UԀ+Ԁ+U+'P'''wP'wU+'PwPPxxUx(𯭩Pw'PPUUUԀ++U+Ԁ+PP'w'w+Ԁ+Pw'xxxUx(𯭩xxxxxx(𯭩xxxxxx(𯭩xxxxxx(𯭩𯭩𔔔디𔔔디𔔔디𯭩ΔΔΔ𯭩𯭩𯭩𯭩𯭩𨥠𯭩'w'w'wP'wP𯭩ww''Pw'Pw'𯭩w''wPPwP'wP'𯭩P'w'wP'''PwPPw'Pw''w'PwPP'Pw'Pww'P'Pw'Pw'PwPPPP'w'wPPPPPPw''wPPP'Pw'Pw'Pw'Pw'wP'''PwPww''Pww'Pw''w'Pww''ww''w'Pw'Pw'Pw'Pw'Pw'Pw'wP'''Pw'Pw'ww'w'PPPP'PwPP'Pw'Pw'PwPww''PwPP'Pw'Pw'PwPPPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPw'𯭩'PwPPPw'w''w'PwPw'PPwP''Pw'Pw'Pw'PwPw''Pw'Pw'Pw'ww''PwPw''wPww'ww'PPPw'wP''''PwPPwP''wPP'w'Pw'Pw'PwPw'w''wPP'w'wPw'PPwP''Pw'w'''w''wPPPw''Pw'Pw'Pw'Pw'Pw'PwPw'w''w'PwPw'Pw''wPP'w'ww''Pw'Pw'PwPP'w'w'Pw'Pw'Pw'Pw'ww''ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPw'𰮪'PwwP'wP'''ww'PwwP'wP'PP'Pw'Pw'Pw'PwwP''Pw'Pw'Pw'wP'PwwP'''ww'wǠP'wPwP''ww''ww'wP'PP'Pw'Pw'Pw'Pw'PwwP'''wwww'''PwwP'wP'PP'Pw''www'PP'wwǠw''Ǡ'Pw'Pw'Pw'Pw'Pw'PwwP'''wwP'''PwP''Pw'Pw'wP'Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pw'wPwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw𰮪'Pw''wwP'w'Pww'PwP'PP'Pw'Pw'Pw'Pww'P'Pw'Pw'Pww'w''PwPP'ww'w'PwP'''wwPPw'PwP'PP'Pw'Pw'Pw'Pw'PwP'www'''Pww'PwP'PP'Pwww'''Pwww''''ww'Pw'Pw'Pw'Pw'Pw'PwP'w'P''w'w'P'Pw'Pww'w''Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pww'w'wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw𰮪'Pw'wP'Pw'Pw'PwPw'PPw''w'Pw'PwPw'PP'PwPw''Pw'PwPw'PP'Pw'wǠP'ww''wPww'''wPPPPPPPw''w'Pw'PwPw'Pw'PP'PwPP'w'w'PwPw'PPw''wPw'PPP'''w''ww''Pw'Pw'PwPw'Pw'PP'Pw'Pw'wP'PwPw''Pw'PwPP'PwPPPPPP'w'w'PwPw'PP'PwPP'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPw'𰮪'Pw'wPPPPPw'Pw'PPw'PP'Pww'w'w'PPw''Pw'P'PPP'wPPPPPPw'Pw'wP'''ww'wPPw'w'P'Pw'Pw'Pww'P'ww'PPw'ww''Pww'Pw'P'P'PPPPP'PwwP''Pw'Pw'Pw'Pww'P'ww'PP'PwPPw'P'Pw'Pw'wP'Pw'PPwww'w'ww''PwPP'Pww'w''Pw'wP'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'Pw'𰮪'PwwP''Pw'Pw'Pw'Pw'Pw'PwwP'''wwPw''wPwP''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𰮪'PwPP'PwPP'Pw'PwPP'Pw'wPPPwP'wwP'w'ww''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𰮪Pw'Pw''PwPw'w''w'wPPPPw''Pww''w'Pw'Pw'Pww''w'Pww''w'Pw'Pww''w𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𱯫𱯫𱯫¼𱯫𱯫𱯫𱯫𱯫'w'w𱯫ww''𲰬PP***T**TT*TT*T*TT*TT**өT*TT*TTTT*TT**өT*TT**TT**T**TT**T**өT𲰬P'wPPPPw'w'w'w'w'P'Pw'PwPP'PwPPPPPw'T*TT*T**TT*T*T*TTT***TT**T*T*T**TTT**TT**T*TT**T*T*T*TTTTTT**T𲰬'PwPP''wwwP'PPwwPPwwPw''Pw'Pw'Pw'Pw'PwwP''''PwPw'**T**T*T*TTT*T*T*TT**өT*TTT*T*T*өT*TT**TTT*T****ө*T*T*T**TT*TTTnnnnnn𠠠jjjbbbbbbbbbbbbbbbbbbbbbjjj𫨣'PwwP'Pw''wP'wP'wPwP''Pw'Pw'Pw'Pw'Pw'ww''ww'*T*T*TTT*TTT*T*T*T***T*T***өT*T*T*TT****T***өT*T**TT*T*T*TT*TTT****өTnnnnnnҩꘘ𲰬'Pw''wwPPPPw'wP'wP'w'P'Pw'Pw'Pw'Pw'PwPPw'P*T*T*T*T*TTT*TTT*T*T*T*T*****TTT*T***TTT*****TTT***TTTTTTT******nnnnnnkkkkkkPP(Px(Pxx((xx((xx((xPx((xȠP(Px(PxPx((Px(PxPP(PxPP(Pxx(PPP𲰬'Pw'wP'Pwww''ww'''PwPw'PPPP'Pw'Pw'PwPPPPPw'*T*T*TT**TTT*T*T*T*TT**T*****T*TT*T****T*****TTT***T*T*TT*өTTT*****nnnnnnbbbbbbxx(xx((Px(PxPPxP((x(((x((xPPPx(Px((xP(Px(Px(Px(Px(Px(Px(Px(Px(PxPx((xx(𲰬'Pw'wP'w'''PwP'wP'w'P'PPwww'PP'PwPwP'wPPw'Pw'*T*T*T***TTT*T*T*TT*T**T*****T*TT**TT**T*****T*TT*TTT*T*T*T*TTT*T****bbbbbb(xȠP(Px(PxxP(PP((xxx(PP(xxȠx((PP(Px(Px(Px(Px(Px(Px(Px(Px(PxxP((xP𲰬'PwwP'ww''PP'wP'wP'Pw'Pw*T*T*T**T*TTT*T*T*TTTT**TT****T*T*TT*T****TT****T*T***T**T*TTTTT*TT****Tbbbbbbx(P(Px(PxxP(PPxx(((Pxxx((((xx(xx((xȠP(Px(Px(Px(Px(Px(Px(Px(Px(Pxx(Px(x(𲰬'PwPPPPww''w'Pwww'Pww'Pw'Pw*T*TTT*TTTT*TTT*TTT*TTT*TTTTT*T*TTTT**TTTTTT**TTbbbbbb(xPPx(PPPPx((xPPP(((x((xx(xx((((xx(Px(PxPPPPPP(Px(Px(Px(Px(PxPx(PP𲰬Pw'Pw'Pw''ww''ww'w''wbbbbbbPx((Pxx(x(x(PPP(PxxP(((xxxx(((Px(Px(Px(PPxxx(PP(PxPP(Pxx(P(xP𲰬bbbbbbPx((Px(xx((xx((Px(Px(Px(Px(Px𲰬bbbbbbxP(xx(PxxP((((Px(Px(Px(Px(Px(Px𲰬kkkkkkPP(PxPP(Px(PxPPx((xx((x𲰬ҟᘘ𲰬𩩩kkkbbbbbbbbbbbbbbbbbbbbbkkk𲰬𲰬~{x}{𝚗𣠜𕓏rol𘕒𳱭𳱭𳱭𳱭𳱭𳱭𳱭𳱭'wP𳱭Pw'𳱭wP'𳱭w'w''wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPw'+Ԁ+UUUԀ++ԪUUUUU+UԀ+UԀ𳱭PPwwPw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPw'++ԀUUU++UUUԀ+Ԁ++UԀ+UԀ𴲮'wPwP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw+++UU+++ԀUUUU+ԪU+UԀ+UԀ𴲮wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'PwUUUU+Ԁ++Ԁ++Ԁ++ԪUUU+UUU+UԀ𴲮ww'''Pw'Pw'PwPP'PwPP'w'wPPPPPw'UU+U+UԀUU++++ԀUU+U+UԀ+Ԁ++UԀ𭪥wP'PP'Pw'Pw'wP'Pww'ww''Pw'PPwww'Pw'++Ԁ++ԀUUUU++Ԁ++UUUԀ++UԀ+UԀ+UԀ𴲮'wP'Pw'Pw+++ԀUU+++Ԁ+Ԁ++Ԁ+UUU++UԀ+UԀ+UԀ𴲮w'Pww'Pw'PwUU+Ԁ++Ԁ+U++++UԀ+UUUUU++UԀ+Ԁ++UԀ𴲮'ww''Pw'Pww''wUU+UԀUUUUUUUUU+ԀUԀ+𴲮𴲮𵳯𵳯𵳯𵳯𵳯𵳯𵳯𵳯𵳯𨥢𗔑𝚗𰭪𵳯𵳯𵳯𵳯𶴰𶴰𶴰𶴰𶴰𶴰𶴰󶴰󶴰󶴰󶴰󶴰DDD󃃃󯬦DDD󶴰DDD󃃃󶴰!!!󟟟󃃃󟟟DDDDDD󟟟ddd󟟟󟟟ddd!!!!!!!!!󃃃󺺺󟟟󃃃dddDDD󟟟ddd󃃃!!!󃃃ddd󃃃󃃃!!!!!!󟟟DDD!!!󺺺DDDDDDddd!!!dddddd󃃃$#"󶶵#"!󶴰!!!!!!󺺺!!!󟟟!!!󺺺DDDDDD󃃃!!!!!!!!!Ӻ󟟟DDD󃃃DDD󃃃ddd!!!dddDDD󟟟ddd󃃃!!!ӃDDD!!!ddd󃃃󃃃ӃDDD!!!󃃃󺺺DDDDDDDDD󃃃!!!!!!󺺺󶶵󶶵󶴰!!!󟟟DDD󃃃󺺺dddDDD󟟟ddd󺺺ddd󟟟dddDDD!!!!!!!!!Ӄddd!!!!!!ddd!!!󺺺DDD󟟟ddd󃃃!!!󃃃!!!󟟟ddd󃃃󃃃󃃃ddd󟟟dddDDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃󶶵󶶵󶴰!!!󃃃DDDDDDDDD󟟟!!!!!!DDD󟟟dddDDD!!!!!!!!!ӃDDDdddDDD!!!󺺺DDD!!!DDD󟟟ddd󃃃ddd󃃃!!!󟟟ddd󃃃󃃃DDD󟟟!!!DDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃DDD󶶵󷵱!!!DDD󺺺DDD󟟟󺺺!!!󺺺ddd!!!󟟟ddd!!!!!!DDD󺺺DDD󟟟ddd󟟟!!!ddd󺺺ddd󺺺DDD󟟟ddd󃃃!!!󃃃dddddd!!!ddd󃃃DDDDDD!!!󺺺dddDDDDDD󺺺DDD󃃃󺺺DDDDDD!!!󺺺DDD󟟟󶶵󷵱!!!󺺺!!!󟟟!!!󺺺DDDDDD󺺺󃃃ddd󺺺!!!󟟟!!!ddd󟟟ddd󺺺DDD󟟟󟟟ddd󃃃󺺺!!!󃃃!!!ddd󃃃!!!!!!DDD󺺺DDDzzzDDDddd󟟟!!!󶶵󷵱!!!DDD󟟟ddd!!!󟟟ddd󃃃󟟟ddd󺺺DDD󺺺DDD󶶵󷵱!!!󟟟ddd󺺺ddd󟟟ddd󃃃DDDdddӃ󺺺DDD!!!󶶵󶶵󷵱!!!󟟟ddd󃃃dddDDDddddddDDDddd!!!󶶵󶶵󷵱#"!󶶵$#"󸶲춲nkhᳰqli󕓑okhpkgþ}zzwt{w̖ܷ˧tqsl-2.8.1/apps/help/tqslapp/addcert2.bmp0000644000175000017500000225613615003421124020261 0ustar rmurphyrmurphyBM^\ 6((\ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹ(ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuѹ?ѹ䏏䏏䏏ѹ?ѹuuuuuuuuuuuuuuuuuuѹ?ѹppppppppppppppppppѹ?ѹppppppppppppppppppѹ?ѹppppppppppppppppppѹ?ѹppp֙y1Vָy1V֙VVV1y11ָy1yyVy11ָVy1ppppppyy11ָVy1ָy1y1ָV֙VVV֙Vy1ָV1y֙pppppp1yVVVV1y11yy11ָyy11ָy1֙Vy1y1yy11ָpppѹ?ѹpppع1zWؚzz11عWz1zz11ع1zz1ع1zؚWzz11عWz1ppppppzz11عؚWz1عWؚWؚWWؚ1WعzzW1ؚؚWz1عpppppp1zWؚWWzz11ع1zz1zz11عzz11ع1zؚWؚWؚWzz11عpppѹ?ѹpppW1ڻ{{{11ڻڜWW{11ڻ{{{11{{11ڻ{{111{Wpppppp{{11ڻ1{{{W{11{{11ڻW{1{{11ڻ{1Wppppppڜ1Wڻ{{11ڻ{{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻpppѹ?ѹpppۜXۜX{{11ۼ{{11ۼ{1{1{{11ۼ{1Xۜpppppp{{11ۼ{{11{{11{1Xۜ1{{1{{11ۼXXۜpppppp{{11ۼ{1{1{{11ۼ{{11{{11ۼ{1X{{11ۼpppѹ?ѹpppY2ݾ}}22ݾ}YݝY2}ݝY}}22}Y2ݝpppppp}}22ݾYݝY}}22ݾYYݝ}}22ݾ}Y2ݝ22}ݾ}}}22ݾ}2Ypppppp}Y2ݝYݝY}2ݝYY}2ݾ2}ݝYݝYYݝ}}22}}22ݾpppѹ?ѹppp5^55^^55Ʉ^^55^5Ʉpppppp55^ɨ^55Ʉ55Ʉ^Ʉ555Ʉ5Ʉ5^5pppppp55Ʉ55Ʉ55^^^^55Ʉ55pppѹ?ѹppp5^555555pppppp^5555^ʄ5555^5pppppp5^^^55pppѹ?ѹppp5_55pppppp5̅55555pppppp__55pppѹ?ѹppp55pppppppppppp55pppѹ?ѹppppppppppppppppppѹ?ѹppppppppppppppppppѹ?ѹppppppppppppppppppѹ?ѹuuuuuuuuuuuuuuuuuuѹ?ѹ葑葑葑ѹ?ѹ𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹ𠠠ѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ66````66ѹ?ѹ栠ܻ66```666ѹ?ѹà666`·`·66`66·6`66```666·6666`666·6666`·66````666·66·66`·666`6·66666`·`6·6666·66·66666````666·66·66·66```66666·666`6666·6666·6`6`66·66```666`·66`66ѹ?ѹƻ򻻺6``6·`6666`6``6`66·666·6·66``6```·6``6666·`66`666·6·66·66·`66666`·66·666666`·6````·6666``66``66666·6·66·66·66`66666````6Ϋ`6666·666·6``6Ϋ`66`6``66666·6·`6``6Ϋ`66ѹ?ѹ𥥤ݥ6·6``Ϋ666`66666666·66·6666`66`·666666·666666·66·66·66``Ϋ66`·666·66666Ϋ`6``6``6666·6666666666·66·66·66·6666·6666·6666`6Ϋ6666·66````66`6Ϋ666`666666·66·66·66`6Ϋ66ѹ?ѹ𒒑¾66Ϋ6`·``666`6`Ϋ6666·66·666```6`·6`Ϋ6666·666666·66·66``66·6666·66666`·``Ϋ`6`666666`Ϋ666`6666·66·66·6666·66666`66`6Ϋ6666·66Ϋ````66`6Ϋ666`6`Ϋ6666·66·66`6Ϋ66ѹ?ѹ𒒑򽹴򒒑66·`6`6``Ϋ66·````666`66``66``66``````666``6·666```66·66`6``Ϋ66``666``6``6````6`6``6``666```6666``66·`6·`666·6``6``66``6Ϋ`6``6·66``````6Ϋ`66·````666```66Ϋ``6Ϋ`6`ѹ?ѹ𥥥þܥ6·6`·666`666``66·``6666·6666·`6``66·66``6·6``66·66·6666·66·66·66``66·`6`6Ϋ66``66·66``66·6666·`666`Ϋ`6`6``666``66·6`66``666`6`·6``666``66·66``66·6·66`66``ѹ?ѹƺ齸½뺺`6666`·666666·66666666·666666ѹ?ѹƿà6666666666·6666666`66·666666ѹ?ѹ桡ۺ6666·66666666ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ66``6666ѹ?ѹ栠ܻ66``6666ѹ?ѹà666`·`·66`66·6`66```666·6666`666·6666`·66````666·66·66`·666`6·66666`·`6·66```6666666·66·666``666·66```6666`66·666`6`66·66```666`·66`66`·6ѹ?ѹƻ򻻺6``6·`6666`6``6`66·666·6·66``6```·6``6666·`66`666·6·66·66·`66666`·66·666666`·6````·66·`6666666·66·66`66·6·66·`666·66`6·66````6Ϋ`66`6``66666·6·`6``6Ϋ`66·`66·ѹ?ѹ𥥤ݥ6·6``Ϋ666`66666666·66·6666`66`·666666·666666·66·66·66``Ϋ66`·666·66666Ϋ`6``6``66·66·666666·66·66·6666·66·66·66·666`66·6666`6Ϋ666`666666·66·66·66`6Ϋ66``ѹ?ѹ𒒑¾66Ϋ6`·``666`6`Ϋ6666·66·666```6`·6`Ϋ6666·666666·66·66``66·6666·66666`·``Ϋ`6`666·66·666666·66·66·6666·66·66·66·666`666`66`6Ϋ666`6`Ϋ6666·66·66`6Ϋ66``ѹ?ѹ𒒑򽹴򒒑66·`6`6``Ϋ66·````666`66``66``66``````666``6·666```66·66`6``Ϋ66``666``6``6````6`·66·66·6``666·`6·`6·6666·66·66·6666·``Ϋ66``66``6Ϋ`66·````666```66Ϋ``6Ϋ`6``6``ѹ?ѹ𥥥þܥ6·6`·666`666``66·``6666·6666·`6``66·66``6·6``66·66·6666·66·66·66``66·`6`6Ϋ666``666```666`Ϋ`6`6666·666``666`666``66·66·6``666``66·66``66·6·66`66``66ѹ?ѹƺ齸½뺺`6666`·666666·6666·6666·666666ѹ?ѹƿà6666666666·666666·66·6666·66·666666ѹ?ѹ桡ۺ6666·66666666ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ666``6·``ѹ?ѹ栠ܻ666Ϋ``6``ѹ?ѹà666`·`·66`66·6`66```666·6666`666·6666`·66`·6`````6`6`6````666·66·66`·666`6·6666ѹ?ѹƻ򻻺6``6·`6666`6``6`66·666·6·66``6```·6``6666·`6`666``6`·666·66`666·6·66·66·`66666`·66·6666ѹ?ѹ𥥤ݥ6·6``Ϋ666`66666666·66·6666`66`·666666·666·666`·666``6666·66·66·66``Ϋ66`·666·6666ѹ?ѹ𒒑¾66Ϋ6`·``666`6`Ϋ6666·66·666```6`·6`Ϋ6666·666·6666·666666666·66·66``66·6666·6666ѹ?ѹ𒒑򽹴򒒑66·`6`6``Ϋ66·````666`66``66``66``````666``6·666·666`666·66``6```66·66`6``Ϋ66``666``6ѹ?ѹ𥥥þܥ6·6`·666`666``66·``6666·6666·`6``66·66``6·6`666Ϋ`·666·666·6``66·66·6666·66·66·66``ѹ?ѹƺ齸½뺺`6666`·66666`·66666`66·66ѹ?ѹƿà666666666Ϋ`6`6``666·6666ѹ?ѹ桡ۺ666``6·66·66ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ66`6·``ѹ?ѹ栠ܻ6666``ѹ?ѹà666`66666`6`66·66```666`·66`66```66666```666`·66``666`·666`·666·66·66·66```666`·6```6666`66·6`66·66·66```666·6666```666`6·66·66ѹ?ѹƻ򻻺6``6·6666``6Ϋ`66`6``66666·6·`6``6Ϋ`66`66666·666·6·`6`66·6·`66·``·`66·66·66·66``666·6·`66·666·66·6```666·6666·66·66·666·6·6666·666·66`·66``66ѹ?ѹ𥥤ݥ6·6666666`6Ϋ666`666666·66·66·66`6Ϋ6666·666666·66·666666``Ϋ66``66·66·66·6666·66``66·666`·66``Ϋ6666·66·6666·66·666666·66`·666·6666ѹ?ѹ𒒑¾66Ϋ6`·666666`6Ϋ666`6`Ϋ6666·66·66`6Ϋ6666·6666·66·666666``6```66·66·666`66``6666````6666·66·66·66·6666·66·66666`Ϋ66ѹ?ѹ𒒑򽹴򒒑66·`6·6``6``6Ϋ`66·````666```66Ϋ``6Ϋ`6`66·6``6``666666`6````66`6``66·`6·`6``66```6````66````6666·`6·`6``6``6````66``666`ѹ?ѹ𥥥þܥ6·6`·666``6``666``66·66``66·6·66`66``6``666``66·6·6666666·66·66`666`Ϋ`6`66·66·6666·6`·66``66`666`Ϋ`6`66·66``66·66·66·66``ѹ?ѹƺ齸½뺺`6666`·6666·66666·6`·66`·``66ѹ?ѹƿà666666·66666·66·666ѹ?ѹ桡ۺ66ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ666`6```66``66ѹ?ѹ栠ܻ66`````666`666ѹ?ѹѹà666`·66·`6`6Ϋ6`66```666·66```666·6`6666Ϋ6`·666`66`·6```66666·66·66Ϋ6`·6`666666·6`66·66```666```66666·6`6`66·66```666```666·6`66666`·`6·6666·66·66666````666·66·66·66```66666·666`6666·6666·6`6`66·66```666`·66`66ѹ?ѹƻ쫣W>J5J4W>򻻺6``666``6`6`66`6``6`·6·6·66·`666``6Ϋ`66666·666``6Ϋ`66`6666·6·666Ϋ`66``6·6``6Ϋ`666666``6Ϋ`66·666`·6·6·666·66·6``6Ϋ`66`6``66666·6·`666``6Ϋ`666666`·6````·6666``66``66666·6·66·66·66`66666````6Ϋ`6666·666·6``6Ϋ`66`6``66666·6·`6``6Ϋ`66ѹ?ѹ𥥤W?]?ǃǂ ]= X?ݥ6·66666Ϋ```6·666`666666·66·66·66·66`6Ϋ66666666`6Ϋ6666·66·66·66`6Ϋ66·6666`6Ϋ666666·66`6Ϋ66·66·666666·66````66`6Ϋ666`666666·66·66·66·66`6Ϋ66666Ϋ`6``6``6666·6666666666·66·66·66·6666·6666·6666`6Ϋ6666·66````66`6Ϋ666`666666·66·66·66`6Ϋ66ѹ?ѹ𒒑򜐂G3Ə"ѝ јƄH366Ϋ6`·66```6·666`6`Ϋ6666·66·66·66·66`6Ϋ666666·66`6Ϋ666666·66`6Ϋ666`66`6Ϋ666666·66`6Ϋ66·66·6666·66Ϋ````66`6Ϋ666`6`Ϋ6666·66·66·66`6Ϋ66666`·``Ϋ`6`666666`Ϋ666`6666·66·66·6666·66666`66`6Ϋ6666·66Ϋ````66`6Ϋ666`6`Ϋ6666·66·66`6Ϋ66ѹ?ѹ𒒑}_K0Ր]Ѣ(NJH3򒒑66·`666``66·66·````66``66·66·66·66``6Ϋ`6``6666·6``6Ϋ`6`66``66·6·6·66``66``6Ϋ`6`6``6``6Ϋ`66·66``66````````6Ϋ`66·````666```66·66``6Ϋ`6``6``6````6`6``6``666```6666``66·`6·`666·6``6``66``6Ϋ`6``6·66``````6Ϋ`66·````666```66Ϋ``6Ϋ`6`ѹ?ѹ𥥥ľ]D$Ʋi\@W?ܥ6·6`·66666Ϋ6`66·`666``66·66·666``666·6`66``66``6`66``6·666·`666`6·66·66·6`66``66``6`66·66·6666·6`6`·6``666``66·66``66·6``666·6`66``66·`6`6Ϋ66``66·66``66·6666·`666`Ϋ`6`6``666``66·6`66``666`6`·6``666``66·66``66·6·66`66``ѹ?ѹƺ颗`G'xcHfQ6X@ 뺺`6666`·666``·66`666666`666666666666666666666·666666ѹ?ѹſà666`````66·66·66·666`6666666666·666666·66666`66·666666ѹ?ѹ桡ۺ666666666666666666ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ666`6```666666ѹ?ѹ栠ܻ66`````6666666ѹ?ѹà666`·66·`6`6Ϋ6`66```666·66```666·6`6666Ϋ6`·666`66`·6```66666·66·66Ϋ6`·6`666666·6`66·66```666```66666·6`6`66·66```666```666·6`66666`·`6·66```6666666·66·666``666·66```6666`66·666`6`66·66```666`·66`66`·6ѹ?ѹƻ򻻺6``666``6`6`66`6``6`·6·6·66·`666``6Ϋ`66666·666``6Ϋ`66`6666·6·666Ϋ`66``6·6``6Ϋ`666666``6Ϋ`66·666`·6·6·666·66·6``6Ϋ`66`6``66666·6·`666``6Ϋ`666666`·6````·66·`6666666·66·66`66·6·66·`666·66`6·66````6Ϋ`66`6``66666·6·`6``6Ϋ`66·`66·ѹ?ѹ𥥤ݥ6·66666Ϋ```6·666`666666·66·66·66·66`6Ϋ66666666`6Ϋ6666·66·66·66`6Ϋ66·6666`6Ϋ666666·66`6Ϋ66·66·666666·66````66`6Ϋ666`666666·66·66·66·66`6Ϋ66666Ϋ`6``6``66·66·666666·66·66·6666·66·66·66·666`66·6666`6Ϋ666`666666·66·66·66`6Ϋ66``ѹ?ѹ𒒑¾66Ϋ6`·66```6·666`6`Ϋ6666·66·66·66·66`6Ϋ666666·66`6Ϋ666666·66`6Ϋ666`66`6Ϋ666666·66`6Ϋ66·66·6666·66Ϋ````66`6Ϋ666`6`Ϋ6666·66·66·66`6Ϋ66666`·``Ϋ`6`666·66·666666·66·66·6666·66·66·66·666`666`66`6Ϋ666`6`Ϋ6666·66·66`6Ϋ66``ѹ?ѹ𒒑򽹴򒒑66·`666``66·66·````66``66·66·66·66``6Ϋ`6``6666·6``6Ϋ`6`66``66·6·6·66``66``6Ϋ`6`6``6``6Ϋ`66·66``66````````6Ϋ`66·````666```66·66``6Ϋ`6``6``6````6`·66·66·6``666·`6·`6·6666·66·66·6666·``Ϋ66``66``6Ϋ`66·````666```66Ϋ``6Ϋ`6``6``ѹ?ѹ𥥥þܥ6·6`·66666Ϋ6`66·`666``66·66·666``666·6`66``66``6`66``6·666·`666`6·66·66·6`66``66``6`66·66·6666·6`6`·6``666``66·66``66·6``666·6`66``66·`6`6Ϋ666``666```666`Ϋ`6`6666·666``666`666``66·66·6``666``66·66``66·6·66`66``66ѹ?ѹƺ齸½뺺`6666`·666``·66`666666`66666666666666666·6666·666666ѹ?ѹƿà666`````66·66·66·666`6666666666·666666·6666·66·6666·66·666666ѹ?ѹ桡ۺ666666666666666666ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ````6```66`````6·ѹ?ѹ栠ܻ`6``6Ϋ```66`6```6ѹ?ѹà666`·`·666·6`6`6666```666```666·6666·6`666``666666````666·66·66`·666`6·66666`·6`6666```666`666```6666````666·66·66`·666`6·66666`66·66```666·66·66·6````666`·666666`66```66666·666`6666·66·66·66```666·6666·6`666``666666````666·66·66`·666`6·66666`ѹ?ѹƻ򻻺6``6·`66·``6```6Ϋ`66666`·6·6·666·6·666·66`66`66·6·666Ϋ`6`666·6·66·66·`66666`·66·6666`6666666·666·66```·6``666·66```Ϋ666·6·66·66·`66666`·66·66666`````66`666·66·666`666·6·`6``66Ϋ``6Ϋ`66`66666``66`6·6666·66·66·66·666·6·666·66`66`66·6·666Ϋ`6`666·6·66·66·`66666`·66·66666·6ѹ?ѹ𥥤ݥ6·6``Ϋ666666`6Ϋ6666·666666·66·66````6666·6666·66`66666·66·66·66``Ϋ66`·666·66666·666666666·66`66`·6666·666`·66·66·66·66``Ϋ66`·666·66666`·666666·66·66·66·6666·66·66·6666·66`6Ϋ6666·6666·66666`6666·66·66·6666·66·66````6666·6666·66`66666·66·66·66``Ϋ66`·666·6666``ѹ?ѹ𒒑¾66Ϋ6`·``6`Ϋ6666`6Ϋ6666·6666·66·66````6666·6666·66`66666·66·66``66·6666·66666·6666666·66``6`·6`666666·66·66``66·6666·6666666`Ϋ6666·66·66·66·6666·66·6`66·66`6Ϋ6666·66666`666`6666·66·66·66·66·66````6666·6666·66`66666·66·66``66·6666·666666ѹ?ѹ𒒑򽹴򒒑66·`6`6````666```6Ϋ`6``6``66``6`````6`66·666666·6·66```66·66`6``Ϋ66``666``66·6666``6````````66```6``66·66`6``Ϋ66``666``6`6``666`66·66·66·666```66Ϋ``6666Ϋ``6Ϋ`6`66·6``6``6666·``Ϋ6`6666·`6·`6``6`````6`66·666666·6·66```66·66`6``Ϋ66``666``6``ѹ?ѹ𥥥þܥ6·6`·666·66·``6`66``6666·66``6`6`·``66·6666`666`6·``66·66·6666·66·66·66```66666``66·`6``66·66·66·66·66·6666·66·66·66``66·66·66``6``666`6Ϋ``66·6·666·`66`66``6``666``66·`666``66``Ϋ66`666`Ϋ`6`66·66``6`6`·``66·6666`666`6·``66·66·6666·66·66·66``6·6ѹ?ѹƺ齸½뺺`6666`·66666666·666`·66666```66·666```66`666`666·66666666·666`ѹ?ѹƿà6666666666·66666Ϋ`6`66``66·6666``66·66Ϋ6`·66666`·66·6666666666·6666`6ѹ?ѹ桡ۺ66666666·666`6666·66````66666666·66`6·ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ66````ѹ?ѹ栠ܻ66`6``ѹ?ѹà666`·6`6666·66·66·66```666·6666·6`666``666666````666·66·66`·666`6·6666ѹ?ѹƻ򻻺6``666`6·6666·66·66·66·666·6·666·66`66`66·6·666Ϋ`6`666·6·66·66·`66666`·66·6666ѹ?ѹ𥥤ݥ6·6666`6666·66·66·6666·66·66````6666·6666·66`66666·66·66·66``Ϋ66`·666·6666ѹ?ѹ𒒑¾66Ϋ6`·666`6666·66·66·66·66·66````6666·6666·66`66666·66·66``66·6666·6666ѹ?ѹ𒒑򽹴򒒑66·`666·``Ϋ6`6666·`6·`6``6`````6`66·666666·6·66```66·66`6``Ϋ66``666``6ѹ?ѹ𥥥þܥ6·6`·6`666``66``Ϋ66`666`Ϋ`6`66·66``6`6`·``66·6666`666`6·``66·66·6666·66·66·66``ѹ?ѹƺ齸½뺺`6666`·666666·66ѹ?ѹƿà6666666666·6666ѹ?ѹ桡ۺ666666·66ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ``66``66````ѹ?ѹ栠ܻ`666``66`6``ѹ?ѹà666666·666`6666·66·66·66·666`66·66`·66`6666```666·666````666·66·66`·666`6·66666`66```6666`6`66`·6```66666·66·6666·66·66·6````666·66·66·66·66·66666`6666·66·6666·6`6``666·666666·6666`·66````666·66·66`·666`6·6666ѹ?ѹƻ򻻺66666·666Ϋ``6Ϋ`6666·66·66``6666`6``66·`66·``6Ϋ`6666·666·6·666`666·6·66·66·`66666`·66·6666``6Ϋ`66666·666`6``6Ϋ`66`6666·6·666Ϋ`66``66·66·66``6Ϋ`6`·6·6·66·66·66``6666Ϋ``6Ϋ`6666·66·666·66``66·6·6666``6666·`66`666·6·66·66·`66666`·66·6666ѹ?ѹ𥥤ݥ66·`666````66·66`6Ϋ6666·66·66·6666666`6666``Ϋ66`6Ϋ666666·66·666666·66·66·66``Ϋ66`·666·666666`6Ϋ6666·66666`66`6Ϋ6666·66·66·66`6Ϋ66·6666·66·66·66`6Ϋ6666·66·66·66·666666·66`6Ϋ6666·66·66````666666·6666666666·666666·66·66·66``Ϋ66`·666·6666ѹ?ѹ𒒑¾66``66Ϋ````66·66`6Ϋ6666·66·666`Ϋ66666`6`Ϋ66``66`6Ϋ6666·66·666666·66·66``66·6666·666666`6Ϋ6666666`66`6Ϋ666666·66`6Ϋ666`66·66·66·66`6Ϋ6666·66·66·666`Ϋ6666·66`6Ϋ6666·66·66Ϋ````666666·66666`Ϋ6666·666666·66·66``66·6666·6666ѹ?ѹ𒒑򽹴򒒑66``Ϋ66·66````66Ϋ``6Ϋ`6`66·`6·`6``666`66·````666``6````6Ϋ`6``6``666```66·66`6``Ϋ66``666``6``6Ϋ`6```66·````6Ϋ`6`66``66·6·6·66``6666·`6·`6``6Ϋ```66·66·66·66``666`66Ϋ``6Ϋ`6`66·`6·`6````6`66666`6```666``6·666```66·66`6``Ϋ66``666``6ѹ?ѹ𥥥þܥ666·6``666`6`·`66`66``Ϋ`666`Ϋ`6`66·66```666``66·66``66·6`66``66·66``66·66·6666·66·66·66``6`66``66·`666``6`66``6·666·`666`6·66·66·`666`Ϋ`6`6`66·66`6·66·66```66`66```666`Ϋ`6`6`6`·``6666·66``Ϋ66``66·66``6·6``66·66·6666·66·66·66``ѹ?ѹƺ齸½뺺`6666`·66666`66666·6666666666`6`66666·66ѹ?ѹƿà6``66`·6666·666666666666·66Ϋ6`·666`·6666·6666ѹ?ѹ桡ۺ``6666·66666666````66·66ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹƧ``66``ѹ?ѹ栠ܻ`666``ѹ?ѹà666666·6`6``666·666666·6666`·66`66·66`·66`6666```666·666````666·66·66`·666`6·6666ѹ?ѹƻ򻻺66666·66``66·6·6666``6666·`666`6``66·`66·``6Ϋ`6666·666·6·666`666·6·66·66·`66666`·66·6666ѹ?ѹ𥥤ݥ66·`666````666666·6666666666·66666`6666``Ϋ66`6Ϋ666666·66·666666·66·66·66``Ϋ66`·666·6666ѹ?ѹ𒒑¾66``66Ϋ````666666·66666`Ϋ6666·66666`6`Ϋ66``66`6Ϋ6666·66·666666·66·66``66·6666·6666ѹ?ѹ𒒑򽹴򒒑66``Ϋ66·66````6`66666`6```666``6·6666·````666``6````6Ϋ`6``6``666```66·66`6``Ϋ66``666``6ѹ?ѹ𥥥þܥ666·6``666`6`·``6666·66``Ϋ66``66·66``6·6`666``66·66``66·6`66``66·66``66·66·6666·66·66·66``ѹ?ѹƺ齸½뺺`6666`·66666666666·66ѹ?ѹƿà6``6666666·6666ѹ?ѹ桡ۺ6666·66ѹ?ѹƧѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹ``ѹ?ѹ``ѹ?ѹ666666·66`·66````666·66·66`·666`6·66666`66·66```666·66·66·6````666`·66666`·6666`6666·ѹ?ѹ666666·66·`66·6```Ϋ666·6·66·66·`66666`·66·66666`````66`666·66·666`666·6·`6``66·`66·66Ϋ``6Ϋ`6666·ѹ?ѹ666666·66``6`·66·66·66·66``Ϋ66`·666·66666`·666666·66·66·66·6666·66·66·6666``66·66`6Ϋ66ѹ?ѹ666666·66``6666·66·66``66·6666·6666666`Ϋ6666·66·66·66·6666·66·6`66``66·66`6Ϋ66ѹ?ѹ666``6·66`6```6``66·66`6``Ϋ66``666``6`6``666`66·66·66·666```66Ϋ``6666`6``66Ϋ``6Ϋ`6`66·ѹ?ѹ6666``666666·66·66·6666·66·66·66``66·66·66``6``666`6Ϋ``66·6·666·6666`66`66``66·ѹ?ѹ66666```66·666```66`666`6ѹ?ѹ``66666``66·6666``66·66Ϋ6`·6666666`·ѹ?ѹ6666·66````ѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?444ѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹB444444ииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииD444444ϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷϷG444444εεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεεε5&O"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C5&OεεεJ444444ʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹ4Heʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹ.e\̀ʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹʹ8)P웚8)PʹʹʹN444444̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳4He̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳R.̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̳̚"Coo~oo~o~o~o~noon~nonnn~onn~n~n~o~o~o~o~o~o~ҵ"C̳̳̳R444444˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲3Gd˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲\(ˀ˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲˲"CdudududududududududududududududududududududududueududuΫ"C˲˲˲V444444ɱɱɱɱɱɱ3Gdɱɱ3q-ɘ(Qɱ[q(3Gdɱ[[Q3Gdɱ(Q[[ɱQQɱɱɱɱ-d[-3-Gdɱɱɱɱ3Gdɱɱ3Gdɱ(Qɱ3(dɱ3(dɱɱɱɱɱɱ(-ɘɱ-d[-3-Gdɱ3Gdɱ3Gd[[ɱ3Gdɱ[q(3Gdɱ3Gdɱɱ3Gdɱɱɱɱɱ(-ɘɱ(Qɱ3GdɱɱQQɱ3Gdɱ3Gdɱɱ3GdɱɱGGɱ-d[-3-GdɱQQɱ(Qɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱɱ"CWjXjXjXjWjWjXjWj__fVSfVSfVS__Xj__fVSfVSfVS__WjXjWjWjWjWiXjXjɠ"Cɱɱɱ[444444ȰȰȰȰȰȰ3FcȰȰ3FcȰFq'ȰȰȰȰFFȰ3q3cȰ-cFȰ[3cȰFq'ȰȰȰȰȰȰ3qq'Ȱ3FcȰȰȰȰ[-ȗ3'cȰȰȰȰ3FcȰȰ3FcȰFq'ȰȰȰȰ3q3-'q'Ȱ3q[QFq'ȰȰȰȰȰ[FȰȰc[-ȗ3'cȰ3FcȰ3FcȰȰȰ3qq'Ȱ3FcȰFFȰ3q3cȰ3FcȰȰ3FcȰȰȰȰ[FȰȰcȰFq'ȰȰȰȰ3FcȰȰ3FcȰȰ3FcȰ3FcȰȰ3FcȰ-cq'ȰȰȰ[-ȗ3'cȰ3FcȰȰFq'ȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰȰ"CJ^K^K^J_J^J^J^J^fVSfVSYZfVSfVSK^J_J^J_J_K^J^J^Ę"CȰȰȰ_444444ǮǮǮǮǮǮ3FbǮ3pp'ǮZ'|ǮǮǮ-'ǕǮǮ3FbǮ3FbǮǮ3FbZ'|ǮǮǮǮǮ3pFǮ3FbǮǮǮǮZ'|Ǯ3-bbǮǮǮǮ3FbǮǮ3FbZ'|ǮǮǮǮ3-bb-FǕZ-b|-'ǕǮǮǮǮ-bFǮǮǮǮǮZ'|Ǯ3-bbǮ3FbǮ3FbǮǮ3pFǮ3Fb-'ǕǮǮ3FbǮ3FbǮǮ3FbǮǮǮǮ-bFǮǮǮǮǮZ'|ǮǮǮǮ3FbǮǮ3FbǮǮ3FbǮ3FbǮǮ3FbZ'|ǮǮǮZ'|Ǯ3-bbǮ3FbǮZ'|ǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮǮ"C>S>S>S>S>S>S=S>SSUfVSfVSfVSSU>S>S>S>S>S>S>S>S"CǮǮǮd444444ŬŬŬŬŬŬ2Ea~Z'{Ŭ~'N~~,'œŬŬ2EaŬ2EaŬŬ2Ea~'N~'o'ŬŬŬ2EaŬŬŬŬŬZ2aŬŬŬŬ2EaŬŬ2Ea~'N~~,'œ2N{~a~,'œ2,aaŬŬŬ~Z'{ŬŬŬŬŬŬZ2aŬ2EaŬ2Ea~'o'ŬŬŬ2Ea~~,'œŬŬ2EaŬ2EaŬŬ2EaŬŬŬ~Z'{ŬŬŬŬŬ~'NŬ2EaŬŬ2EaŬŬ2EaŬ2EaŬŬ2Ea~Z'{ŬŬŬŬZ2aŬ2EaŬ~'NŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬ"C3I3J3J3J3J3J4J4I3JNQfVSfVSNQ4I3I3I3I4J4J3I3I3I"CŬŬŬi444444īīīīīīENīīī2Eߨ`īYn&īEߌEī2n2ߨ`ī2Eߨ`īī2Eߨ`ī2Eߨ`īYn&YNīīīī2Eߨ`īīīīīīīī2Eߨ`īīīīENīYYzī2Eߨ`īYn&YNīY2,&n&ī2nn&īīī~~,&ēīīīīīīīīī2Eߨ`ī2Eߨ`ī2Eߨ`YNīīīī2Eߨ`īEߌEī2n2ߨ`īENīYYzīīī~~,&ēīīīīīī2Eߨ`īYn&īEn&īī2Eߨ`īī2Eߨ`ī2Eߨ`īī2Eߨ`ī,`n&īīīīīīī2Eߨ`ī2Eߨ`īī2Eߨ`īYn&īīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīī"C,C,C,C,C,C,C,C,C,C,CKMfVSfVSKM,C,C,C,C,C,C,C,C,C,C"Cīīīn444444éééééé2Dݨ_éY},Ñé}&Yyé}&}n&2Dݨ_é2Dݨ_éé2Dݨ_é}&Yyé,_DDNééééNyNééééé2DYn_n&éé}&YyNy݋Déé2Dݨ_é}N&ééé}Y&yééééééNyNéé2Dݨ_é2Dݨ_é,_݋Dé2Dݨ_é}&}n&2Dݨ_é2DYn_n&éééé}Y&yéééééé}&Yyé2D2NDNé2D_Dn&é2Dݨ_éé,_݋DéNyNéDNé}&Yyééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé"C퇕߇߇߇߇߇߇utfVSfVSut߇߇߇߇߇߇"Cééés4444442Dݦ_2Dݦ_2Dݦ_,_݊D2Dݦ_2Dݦ_,_݊D2Dݦ_2Dݦ_2Dݦ_"C틘⋙ዙጘዙዙዘዙwufVSfVSfVSwu⋙ዙ⋙ዙጙዙ⋙"Cy4444442Cܥ^XXw2Cܥ^|&܉C|܉^2Cܥ^2Cܥ^|&܉C|܉^2Cܥ^C܉C2Cܥ^"C䐝䐝䐞㐝䐝䐝䐝fVSfVSywfVSfVS㐝㐝䐝䐝䐞䐞䐝"C}444444ڿڿڿڿڿBڈBڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ+]{+ڿڿڿڿڿڿڿ1Bڤ]1Bڤ]ڿڿڿڿڿ{1%ڤ]ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ+]{+ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ{1%ڤ]ڿW{+{1%ڤ]ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ"C敢敢敢散散敢敢|zfVSfVSfVS|z|zfVSfVSfVS|z敢敢敢敢敢敢敢"Cڿڿڿރ444444پپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپ"C癧虧虦虦虦虦癧虦癦癦虧虦癦虦虦虦蚦虦癧蚦虧虦虦虧虦虦"Cپپپ444444ԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹ"C霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩"CԹԹԹ444444ԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸ5&O5&OԸԸԸ444444ӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷM=]"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"CM=]ӷӷӷ444444ҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶBBBѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴ[T444дддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддд֩444BBBJC444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444tqsl-2.8.1/apps/help/tqslapp/addcert3.bmp0000644000175000017500000223442615003421124020260 0ustar rmurphyrmurphyBM9 6(8 ˫澾𾾾歭̽ڵ鮮𫫫𫫫𪪪𪪪ͻͻЖKlkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksϏ<ͻ𪪪րÎ~ր𪪪ۖ<~ŽݝK𪪪*Tրx𫫫*Txx𫫫*Txx𫫫*T*T*T*T*T*TTTT**T***TTT*T**x*T*T*T*T*TTT*T*Tx***T***T*T*TTT*T*T𫫫*T*TT**TT*T**T*T**T******TT*x*T*T*T*T*T***T*TxTTT****T*T**T**T𫫫*T*TT**T*T*T*T*T*TT***T*T***Tx*T*T*T*T*T*T*T*Tx*TT****T*TT*T**T𫫫*T*T*T*T*TTTT**T**T*T**T***x*T*T*T*T*T***T*TxT*T**T*TT**T*T𫫫T**TT**TT****TTT*T***T*TxTT*TTTTT*TTTT*TTx***TTTTT***TT**T𫫫*T*T*T*T*T**TT*TTTTT*T*TTTx*T*T*TT**T*T*T**xT*TT*TT**T*T*T𫫫*T*T*T*T*T*T*Tx*T*Tx*T*T𪪪*T*T*T*TT**Tx*T*Tx*T*T𪪪*T*T*TTT*TxT******Tx***T𪪪xx𪪪xx𪪪x𪪪ݞKÏ~ۖ<𪪪րÎ𪪪ۖ<րxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxݝK𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𠠠𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𪪪𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𫫫𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𬬬𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𭭭𮮮'w'w'Pw𮮮ww'''Pw𮮮PP'Pw𮮮PPw''wPPP'Pw'Pw'Pww'PPww''PwPPP'Pww'PPPPP'Pw𮮮wP''''PwPPwP''wPP'w'Pw'PwPw'PP'w'w'wPP'wPw''ww''Pw'Pw𮮮'ww''ww'wP'PP'Pw'Pw'Pw'PwwP'ww'''Pw'Pw'PwwP''wP'Pw𮮮PPw'PwP'PP'Pw'Pw'Pw'Pww'Pww'''Pw'Pw'Pww'Pw'w''Pw𮮮PPPPPPw''w'Pw'PwPw'Pw''PwPw'PP'w'w'Pw'Pw'PwPw'PP'Pw𮮮'wPPw'w'P'Pw'Pw'P'PPP'P'PPPw'Pw'ww''Pw'Pw'Pww'P'wPPP𮮮'Pw𮮮'Pw𮮮𮮮𮮮𮮮𥥥'wP'w'w'Pw'wP𧧧Pw'ww'''PwPw'𧧧wP'PP'PwwP'𧧧'Pw'Pww'P'wP'''PwPPw'PPPw'P'Pww'PPPPPPP'Pw'Pww'Pw'w''wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'Pww'w'w'P'PwPP'Pw'Pw'PwPP'wP'''PwPPw'P'Pww''w'PwPPw''wPPP'Pw'PwPPPPP'Pw'Pw'Pww'P'Pw'PwPP'P'PPPw'P'PwPPw''w'Pw'Pw'wP'''Pw'PwPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPPw''w'wP'wP'''Pw'Pw'PwPww''Pw'wP'''PwPPw'P𧧧'Pw'PwPw'Pw'w''w'ww'Pw''ww'Pw''PwPw''ww''Pw'Pw'Pw'PwPw'PPwwPw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPPwwPw''Pw'Pw'Pw'Pw'Pw'ww'Pw'w''w'PwPw''PwPPwP''PwwP''''PwPPwP''wPP'w'Pw'ww''wPP'w'Pw'PwPw''Pw'Pw'PwPw'wP'Pw''Pw'ww'PPwP''Pw'PwPw'w''w'Pw'ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'Pw'PwPPwP'wP''P'PPw'w''w'Pw'PwPP'w'wPw'w''w'PwPw'𧧧'Pw'PwwP'wP'''ww'wPwP''wPwP''PwwP'wP''Pw'Pw'Pw'PwwP''wPwP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw'wPwP''Pw'Pw'Pw'Pw'PwwP'wP'''ww'PwwP''PwwP'PP'Pw'ww''ww'wP'PP'Pw'Pw'PwwP''Pw'Pw'Pw'PwwP''Pw'Pw'Pw'Pw'wPwP''Pw'wPwP'PP'Pw'PwwP'''ww'PwwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw'PwwP'PP'ww''ww'wP'''ww'Pw'Pwww'''PwwP'''ww'PwwP'𧧧PP'Pww'PP'ww'w'w'Pw'w'w'P'Pww'PwP''Pw'Pw'Pw'Pww'PwP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'PwwP'w'P'Pw'Pw'Pw'Pw'PwwP'P'w'Pww'P'PwwP'PP'PwPPw'PwP'PP'Pw'Pw'PwwP''Pw'Pw'Pw'Pww'P'Pw'Pw'Pw'PwPPw'P'Pww'w'wP'PP'Pw'PwP'w'PwwP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw'PwwP'PPPPw'PP'w'Pw'Pwww'''PwP'w'Pww'P𧧧'Pw'ww'Ǡ'Pw'PwPw''PwPP'PwPw'PP'PwPw''Pw'PwPw''ww''Pw'PwPw'PP'PwPw'ww'''Pw'Pw'PwPP'PwPP'w'wPPPPww'''PwPw'Pw''Pw'Pw'Pw'Pw'ww''Pw'Pw'PwPw''PwPPw''wPw'PPPPPPw''w'Pw'PwPw''ww''Pw'PwPw'Pw''PwPw'PPPP'PwPw'w''w'PwPw'Pw'PPPPw''wPPPP'Pw'Pw'ww''Pw'Pw'PwPP'PwPP'w'wPPPP'PwPPw''wPPPP'Pw'Pw'PwPP'w'w'Pw'Pw'PwPw'𧧧'Pw'Pw'Pww'PPP'wPw'P'wPw'P'Pww'P'wPPPPP'Pww'w'w'PwP'PP'Pw'Pw'wP'Pww'ww''Pw'PPwww'wP'w'P'P'PPP'PwPw''Pw'wPPPPPw'PPw'w'P'P'PPP'wPPw'w'P'Pw'Pw'P'PPP'wP'Pw'Pw'P'PPP'P'PPPw'P'PPwww'PP'Pww'w'w'P'P'PPP'wPw'P'PPwww'PP'Pw'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'PPw'P'wPPw'PP'Pw'Pww'ww''PwPPPPw'P𧧧'Pw'Pw'Pw'Pw'Pw'Pw'Pw'wP'Pw'Pw'wP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𧧧'Pw'ww'Ǡ'Pw'Pw'Pw'Pw'Pww'Pww'Pw'Pww'Pww'PwPP'PwPP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𧧧P'w'Pw'Pw'Pw'ww''Pw'Pww''w'ww'w''wPw'w''wPw''Pw'Pw'Pww''w'Pww''w'Pw𧧧𧧧𧧧𧧧𧧧𧧧𧧧𧧧𧧧𩩩𢢢𬬬𬬬𯯯𐇂𯯯𐇂𯯯𐇂Ԫ+UU+UU+UԀUU++Ԁ+UԀ+UԀ+UԀ+U+UԀ+UԀ+UԀ+UԀ+UԀUԀ++UԀUU+UԀ+UԀ+UԀ+UUԀ++UԀ++Ԁ+++UԀ+UԀUԀ+U+++Ԁ+UԀ++Ԁ+++UԀUU++Ԁ+UԀ+UԀ+UԀU+ԪUUU+++Ԁ++𯯯𐇂mmmMzz+UԀ+ԪUUU+U+UUԀ+UUU+UԀ+UԀ+UԀU++UԀ+UԀ+UԀ+UԀ+U+++UԀUU+UԀ+UԀ+UԀU+U++UԀ+Ԁ++Ԁ++UԀ+UԀU++UU++UԀ+Ԁ++Ԁ++U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀUU+U+Ԁ++Ԁ+𯯯𐇂``+UԀUԀ++UUUU+U+++ԀU+Ԁ+UԀ+UԀ++Ԁ+UԀ+Ԁ++UԀ+UԀ+U++U+UԀUU+UԀ+UԀ+UԀUUU++UԀU++++UԀ+UԀ+UԀU+U+Ԁ+Ԁ++UԀU++++UԀ+U+++ԀU+Ԁ+UԀ+UԀUUUU+UU++++UԀ𰰰𐇂mmmMzz+UԀ+UUUUU++Ԁ+UԀ+UԀUUU+Ԁ+UԀ+UԀUU+UԀUUU+UUUԀ+UUUԀ+UUU+UUUUUԀ+UԀ+UUUU++ԀUUUUUU++UU𰰰𐇂MzzMzz𰰰𐇂mmmMzz𰰰𐇂𰰰𐇂mmm𰰰𐇂𰰰𐇂mmm𰰰𐇂Mzz``````Mzz𰰰𐇂mmmԪ𰰰𐇂MzzMzz+U𰰰𐇂mmmԪ+UԀU+UU+UԀU++UԀ+++U+UԀU++UԀ+UԀU++UԀ+UԀ++ԀUU+UԀ++ԀUԀ+𰰰𐇂``+UԀ+Ԁ+UU+UԀUԀ++UԀU+UUU++UԀUԀ++UԀ+UԀUԀ++UԀ+UԀ++ԀUUUԀ++UԀ++Ԁ+UԀ𰰰𐇂mmmmmmmmmmmmmmmmmmMzz+UԀUUUU+UԀ++++Ԫ+UԀ++ԀU+++Ԁ+UԀ++++Ԫ+UԀ+UԀ++++Ԫ+UԀ+UԀ+U+UԀ+UU++UԀ+U+UԀ+UԀ𰰰𐇂Mzzԑ+U++ԀUU+UԀ++UU+UԀ+UԀ+UԀUԀ++UԀ++UU+UԀ+UԀ++UU+UԀ+U+U+UԀUU+UԀU+++Ԁ+UԀUU+UԀ+UԀ+U𰰰𐇂mmm``UUUU+UԀUU+++UԀ+UԀ+UԀUU+UԀUU+++UԀ+UԀUU+++UԀ+UԀ+UԀ+UԀ+++U+UԀ+UԀ+UԀUU𰰰𐇂Ԫ+UU+UU+UԀUU++Ԁ+UԀ+UԀ+UԀ+U+UԀUU++Ԁ+UԀ+UԀUU++Ԁ+UԀ+UԀUԀ++UԀU+++Ԁ+UԀUԀ++UԀ+UԀ𰰰𐇂mmmMzz+UԀ+ԪUUU+U+UUԀ+UUU+UԀ+UԀ+UԀU++U+UUԀ+UUU+UԀ+U+UUԀ+UUU+UԀ+U+++UԀ+UU++U+++UԀ+UԀ𰰰𐇂``+UԀUԀ++UUUU+U+++ԀU+Ԁ+UԀ+UԀ++Ԁ+U+++ԀU+Ԁ+U+++ԀU+Ԁ+U++U+UԀU+Ԁ+Ԁ++U++U+UԀ+UԀ𱱱𐇂mmmMzz+UԀ+UUUUU++Ԁ+UԀ+UԀUUUU++ԀUU++ԀUU+UԀUԀ+UU+UԀUU𱱱𐇂MzzMzz𱱱𐇂mmmMzz𱱱𐇂𱱱𐇂mmm𱱱𐇂𱱱𐇂mmm𱱱𐇂Mzz``````Mzz𱱱𐇂mmmԪ𱱱𐇂MzzMzz𱱱𐇂mmmԪ+UԀU+UU+UԀU++UԀ+++++UԀ++ԀUU+UԀUԀ+U+ԀUU+UԀUԀ++ԪU+UԀUԀ+UUUU+UԀUԀ++ԪU+UԀU++UԀUԀ++UԀ+Ԁ+UU++UԀ++ԪU𱱱𐇂``+UԀ+Ԁ+UU+UԀUԀ++UԀU+UUU+UU+UԀ++ԀUU+UԀ+UԀ+UԀUUԀ+Ԁ++UԀU++U+UԀ+UԀԀ+Ԁ+UUUԀ++UԀU++U+UԀUԀ++UԀ+UԀ+UԀ+UԀUUUUU++U𱱱𐇂mmmmmmmmmmmmmmmmmmMzz+UԀUUUU+UԀ++++Ԫ+UԀ++ԀU+++ԀU++UԀ+U+UԀUU+UԀ+UԀ+UԀU++ԪU+UԀUU+UԀ+UԀ+ԪU+UU++UԀUU+UԀ++++Ԫ+UԀ+UԀ+UԀ+Ԁ+UU+UUU𱱱𐇂Mzzԑ+U++ԀUU+UԀ++UU+UԀ+UԀ+UԀ+U+UԀ+UԀ+UԀUU+UԀUU+UԀ+UԀ+UԀ++Ԁ+U+UԀ+Ԁ++ԪU+UԀ+UԀ+UU+++Ԁ+UԀ+Ԁ++ԪU+UԀ++UU+UԀ+UԀ+UԀU+UUU++Ԁ++ԪU𱱱𐇂mmm``UUUU+UԀUU+++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUU+UԀUU+UԀ+U+U+UԀ++++Ԁ+UԀUU+U+++UUU++++Ԁ+UԀUU+++UԀUUUUUU++++++Ԁ𱱱𐇂Ԫ+UU+UU+UԀUU++Ԁ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUԀ++UԀUU+UԀ+UԀ+UԀ+UUԀ++UԀ++Ԁ+++UԀ+UԀUԀ+U+++Ԁ+UԀ++Ԁ+++UԀUU++Ԁ+UԀ+UԀ+UԀU+ԪUUU+++Ԁ++𱱱𐇂mmmMzz+UԀ+ԪUUU+U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀ+UԀ+U+++UԀUU+UԀ+UԀ+UԀU+U++UԀ+Ԁ++Ԁ++UԀ+UԀU++UU++UԀ+Ԁ++Ԁ++U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀUU+U+Ԁ++Ԁ+𘘘𱱱𐇂``+UԀUԀ++UUUU+U+++ԀU+Ԁ+UԀ+UԀ+UԀ+UԀ+U++U+UԀUU+UԀ+UԀ+UԀUUU++UԀU++++UԀ+UԀ+UԀU+U+Ԁ+Ԁ++UԀU++++UԀ+U+++ԀU+Ԁ+UԀ+UԀUUUU+UU++++UԀ𱱱𐇂mmmMzz+UԀ+UUUUU++Ԁ+UԀ+UԀ+UԀ+UԀUU+UԀUUU+UUUԀ+UUUԀ+UUU+UUUUUԀ+UԀ+UUUU++ԀUUUUUU++UU𱱱𐇂MzzMzz𱱱𐇂mmmMzz𱱱𐇂𱱱𐇂mmm𱱱𐇂𱱱𐇂mmm𱱱𐇂Mzz``````Mzz𱱱𐇂mmmԪ𲲲𐇂MzzMzz𲲲𐇂mmmԪ+UԀU+UU+UԀU++UԀ++UԀ++ԪUUԀ+UԀ++ԪUUU+UԀU+UԀ++ԪU𲲲𐇂``+UԀ+Ԁ+UU+UԀUԀ++UԀU+UUU++U+UԀU++UԀ+Ԁ++UԀ+Ԁ+U++U𲲲𐇂mmmmmmmmmmmmmmmmmmMzz+UԀUUUU+UԀ++++Ԫ+UԀ++ԀU+UU+UԀUU+ԪU+UԀUUUU𲲲𐇂Mzzԑ+U++ԀUU+UԀ++UU+UԀ+UԀ+UԀ+U+Ԁ++ԪU+UԀ+Ԁ++ԪU+U+U++Ԁ+Ԁ++ԪU𲲲𐇂mmm``UUUU+UԀUU+++UԀ+UԀ+UԀ++++Ԁ+UԀ++++Ԁ+UUU++++Ԁ𲲲𐇂Ԫ+UU+UU+UԀUU++Ԁ+UԀ+UԀ+UԀ++Ԁ+++UԀ++Ԁ++UԀ++UU+++Ԁ++𲲲𐇂mmmMzz+UԀ+ԪUUU+U+UUԀ+UUU+UԀ+UԀ+UԀ+Ԁ++Ԁ++UԀ+Ԁ++Ԁ+U++UԀ+ԪU+Ԁ++Ԁ+𲲲𐇂``+UԀUԀ++UUUU+U+++ԀU+Ԁ+UԀ+UԀU++++UԀ+UԀU++++UԀU++UԀUԀ+U++++UԀ𲲲𐇂mmmMzz+UԀ+UUUUU++Ԁ+UԀ+UԀUU+UԀUUUU+UԀ+UUU𲲲𐇂MzzMzz𲲲𐇂mmmMzz𲲲𐇂𲲲𐇂mmm𲲲𐇂𲲲𐇂mmm𲲲𐇂Mzz``````Mzz𲲲𐇂mmmԪ𳳳𐇂MzzMzz+U𳳳𐇂mmmԪUԀ+++UU+U+Ԁ+UUUԀ++ԪUUUUU+UԀ+UԀUԀ+++UԀ++UԀ+Ԁ++UԀ++ԀUUUԀ++UԀ𳳳𐇂``+U+UԀU+UUU++UԀU+++ԀUUU++UUUԀ+Ԁ++UԀ+UԀ+U+UԀU+UU+UԀ+UԀ+UԀ+UԀ++ԀԀ+Ԁ++UԀ+UԀ𳳳𐇂mmmmmmmmmmmmmmmmmmMzz+UԀ+UԀ++ԀU+UU+Ԁ+++Ԁ+++UU+++ԀUUUU+ԪU+UԀ+UԀ+UԀ+UԀ++ԀU++UԀ+UԀ+Ԁ++UԀ+U+UԀ+ԪU+UԀ+UԀ𳳳𐇂MzzԑU++UԀ+UԀ+UԀ+Ԁ+UUUԀ+UUUU+Ԁ++Ԁ++Ԁ++ԪUUU+UUU+UԀ+UU++UԀ+UԀ+UԀ+UԀ+UԀU++UԀUU+UԀ+U+UԀUU𳳳𐇂mmm``++++Ԁ+UԀ+UԀ+Ԁ+UUUUUU+U+UԀUU++++ԀUU+U+UԀ+Ԁ++UԀ++++Ԁ+UԀ+UԀUUUU+UԀ+UԀ+UԀ+UUUUU++𳳳𐇂ԪU++UԀ+UԀ+Ԁ+UU+U++Ԁ++ԀUUUU++Ԁ++UUUԀ++UԀ+UԀ+UԀU++UԀ+UԀ+UԀ+UԀU+Ԫ+UԀUԀ++UԀUԀ++UԀ+++U𳳳𐇂mmmMzz+U+UԀ+UԀUU+Ԁ+U++++ԀUU+++Ԁ+Ԁ++Ԁ+UUU++UԀ+UԀ+UԀ+U+UԀ+UԀ+UԀ+UԀ+UԀ+U+++UԀU++UԀUԀ+UU𳳳𐇂``++ԀUU+UԀ+UԀUU+UԀ++ԀUU+Ԁ++Ԁ+U++++UԀ+UUUUU++UԀ+Ԁ++UԀ++ԀUU+UԀ+UԀ+UԀ+UԀUU+U++U+UԀU++UԀU+++Ԁ𴴴𐇂mmmMzz++Ԫ+UԀ+UԀUԀ+UUUU+UԀUUUUUUUUU+ԀUԀ+++Ԫ+UԀ+UԀUUUUUU+UԀUUUUUԀ+UU𴴴𐇂MzzMzz𴴴𐇂mmmMzz𴴴𐇂𴴴𐇂mmm𴴴𐇂𴴴𐇂𴴴𐇂𴴴𐇂UU𴴴𐇂㑑1]] QiiUU𴴴𐇂㑑1SUԀ++ԪUUUUU+UԀ+U+UU+UUU+UԀUU+U+++UԀ+U+UUU+UԀ+UUU+U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUU𴴴𐇂푑1SU++U+Ԁ++UԀ+UԀU++U+UUԀ++UU+Ԁ+Ԁ+U+Ԁ++ԀUԀ+U++UԀUԀ++Ԁ+UԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ+𴴴𐇂cKcKcKcKcK푑mmmmmmmmm1SUUU++UԀ+UԀ+Ԁ++Ԁ+U++UԀ+UԀ+UU+++Ԁ+UԀ+U+UԀU+U+U++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++U𴴴𐇂1S+Ԁ++ԪUU++UԀ+UԀUU+UԀ+U+UԀ+UԀ+Ԁ+U+Ԁ+UԀUU+UԀ+UU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ+𴴴𐇂1S++++Ԁ+Ԁ++UԀ+UԀUUUU+UԀUԀ++UԀ+UԀUU+UԀU+Ԁ++Ԁ+UԀ+UԀUԀ++Ԁ++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UU𴴴𐇂1S++Ԁ+++UUU+UԀ+UU+Ԁ+U+UԀ+UԀ+UUU+U+Ԁ++UԀ+U+U+U+U+UUU+UԀUԀ++UԀ+UUUUU+U+U𴴴𐇂1S+Ԁ++Ԁ++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ𴴴𐇂1SU++++UԀ+UԀ+UԀ+UԀ+UԀUU+UԀ𵵵𐇂mmmIee !!!!!!!!SUU++Ԁ+UԀ+UԀ++ԀU+++Ԁ𵵵𐇂 UUy𵵵𐇂mmm𵵵𐇂𵵵𐇂mmm𵵵𐇂((((((((((((((((((((((((((((((((((((((((((((((((((((((𘘘𵵵𐇂(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𵵵𐇂xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(𵵵𐇂(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𵵵𐇂1]] QiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(𵵵𐇂1S(xxxx+x׏x׏x׏xUx׏x׏x׏xx׏xxxxxx+xx׏xxUx׏x׏xx׏xxץx׏xUxxUx𵵵𐇂1Sxxץxxץx+׏x׏x׏xxx+޼x׏xץx+׏x׏xx׏xxxxץxxץx޼xxxx׏xx׏xx׏x׏xx׏x޼xxxx+׏x׏xx޼xxxxxx+޼x(𵵵𐇂1S(xxץxxxxxxUx׏x׏x׏xx+ץx׏x+xx׏x׏xx׏xxxxץxxxxxxUxxxx׏xx׏xx׏x׏xx׏xUxxxxUx׏x׏xxUxxxxx+ץx𵵵𐇂1SxxUxxxxxx׏x׏x׏޼xxx׏x+xx׏x׏xx׏xxxxUxxxxxx׏xx׏xx׏x׏xx׏xUxxxx׏x׏x޼xxx(𵵵𐇂1S(xx+xxxxxxxxx׏x׏x׏xxxx׏xץx+׏xxxUxxxx+xxxxxx׏x޼x޼xx׏xx׏x׏xx׏x޼xxxxxxx׏x׏xx׏x޼xxxx𵵵𐇂1SxxUxxxxxxUxx׏x׏xץx׏x׏x޼xxxxxUxxxxxxxUxҪx䏀޼x׏xxץxUxxxUxץx(𵵵𐇂1S(xxץxxxxxxxxxxxx׏x׏xxxxxxxxxxxxxxxxxxxxxxxxxxץxxxxxxxxxxxxxxxx׏xxxxx׏xxxxxxxxxxxxxxxxx׏xxxxxxxxxxxxx𵵵𐇂1Sxxץxxץxxxxxxx׏x׏xxxxxxxxxxxxxxxxxxxxxxxxxxץxxץxxxxxxxxxxx׏xxxxxץxxxxxxxxxxxxxxxxx׏xxxxxxxxxxxxx(𶶶𐇂Iee !!!!!!!!S(xxxxx+xxxxxxx׏x׏xxxxx׏xxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxx׏x+׏xxxxxxxxxxxxxxxxxxxxxxxxxxxx𶶶𐇂 UUyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(𶶶𐇂(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𶶶𐇂xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(𶶶𐇂((((((((((((((((((((((((((((((((((((((((((((((((((((((𶶶𐇂𶶶𐇂𶶶𶶶'wP'Pw'Pw'Pw'Pw'wP'wP'wP𷷷Pw''Pw'Pw'Pw'PwPw'Pw'Pw'𷷷wP''Pw'Pw'Pw'PwwP'wP'wP'𷷷'Pw'Pw'Pw'PwPPPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'Pw'Pww'PPww''PwPPP'Pww'PPPPP'Pww'PPww''PwPPP'Pw'Pw'Pww'PPP'wP'''Pw'P'PPP'P'PPP'Pww''w'wP'wP'''Pw'PwPPP'PwPP'Pw'Pw'PwPww''Pw'wP'''Pw'Pw'Pww'wP'ww''ww'Ǡ'PwPPPP'Pw'Pw'PwPww''PwPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPPw'P'PwPP'Pw'Pw'PwPP'wP'''PwPPw'P𷷷'Pw'Pw'Pw'Pw'ww''ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'Pw'PwPw'PP'w'w'wPP'wPw''ww''Pw'PwPw'PP'w'w'wPP'w'Pw'PwPw''ww'Pw'w''wPw'wP'Pw'wP''PwPPwP'wP''P'PPw'w''w'Pw'wPP'w'ww''Pw'Pw'PwPP'w'wPw'w''w'Pw'PwPw'PPPP'Pw'ww''Pw'Pw'Pw'PwPP'w'w'ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'Pw'ww'Pw''Pw'Pw'Pw'Pw'Pw'ww'Pw'w''w'PwPw'𷷷'Pw'Pw'Pw'Pw'wPwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw'PwwP'ww'''Pw'Pw'PwwP''wP'Pw'PwwP'ww'''Pw'Pw'Pw'Pw'PwwP''wPwP'''ww'Pw'wP'Pw'wP'PwwP'PP'ww''ww'wP'''ww'Pw'Pw'Pw'wP'Pw'Pw'Pwww'''PwwP'''ww'Pw'PwwP'PP'Pw'wP'Pw'Pw'Pw'Pwww'''PwwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'PwwP'wP''Pw'Pw'Pw'Pw'PwwP'wP'''ww'PwwP'𷷷'Pw'Pw'Pw'Pww'w'wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw'Pww'Pww'''Pw'Pw'Pww'Pw'w''Pw'Pww'Pww'''Pw'Pw'Pw'Pw'Pww'Pw'w'P'w'PwPP'PwPP'PwwP'PPPPw'PP'w'Pw'Pw'Pww'w''Pw'Pw'Pwww'''PwP'w'Pw'Pww'PPP'Pww'w''Pw'Pw'Pw'Pwww'''PwwP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'PwwP'w'P'Pw'Pw'Pw'Pw'PwwP'P'w'Pww'P𷷷'PwPw'PP'PwPP'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPw''PwPw'PP'w'w'Pw'Pw'PwPw'PP'PwPw''PwPw'PP'w'w'Pw'Pw'PwPw''PwPw'PP'PwPw'w''wPw'w''wPw'PPw''wPPPP'Pw'Pw'Pw'PwPP'PwPPPPPP'w'w'PwPPPP'PwPw'PPPP'PwPP'Pw'PwPPPPPP'w'w'ww''Pw'Pw'PwPP'PwPP'w'wPPPP'ww''PwPw'Pw''Pw'Pw'Pw'Pw'ww''Pw'Pw'PwPw'𷷷'Pw'Pww'w''Pw'wP'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww''P'PPPw'Pw'ww''Pw'Pw'Pww'P'wPPP'P'PPPw'Pw'ww''Pw'Pw'Pw'Pw'P'PPPw'P'wPPP'Pww'w''Pww'w''P'PPPw'P'wPPw'PP'Pw'Pw'Pw'wP'Pw'PPwww'w'ww''PwPP'PPwww'w'P'ww'Pw'Ǡ'Pw'wPPP'Pw'PPwww'w'ww''Pw'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww''wPw'P'P'PPP'PwPw''Pw'wPPPPPw'P𷷷'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𷷷'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP'Pw𷷷Pww''Pww''w'Pw'Pww''ww''w'Pww''ww''ww''w'Pw'Pww''ww''wPw'w''w𷷷𷷷𷷷𷷷𷷷𷷷𷷷𸸸𸸸𸸸𸸸𸸸𸸸𸸸󸸸󸸸󸸸󸸸󸸸DDD󃃃󸸸DDD󸸸DDD󃃃󸸸!!!󟟟󃃃󟟟DDDDDD󟟟ddd󟟟󟟟ddd!!!!!!!!!󃃃󺺺󟟟󃃃dddDDD󟟟ddd󃃃!!!󃃃ddd󃃃󃃃!!!!!!󟟟DDD!!!󺺺DDDDDDddd!!!dddddd󃃃$#"󶶵#"!󸸸!!!!!!󺺺!!!󟟟!!!󺺺DDDDDD󃃃!!!!!!!!!Ӻ󟟟DDD󃃃DDD󃃃ddd!!!dddDDD󟟟ddd󃃃!!!ӃDDD!!!ddd󃃃󃃃ӃDDD!!!󃃃󺺺DDDDDDDDD󃃃!!!!!!󺺺󶶵󶶵󸸸!!!󟟟DDD󃃃󺺺dddDDD󟟟ddd󺺺ddd󟟟dddDDD!!!!!!!!!Ӄddd!!!!!!ddd!!!󺺺DDD󟟟ddd󃃃!!!󃃃!!!󟟟ddd󃃃󃃃󃃃ddd󟟟dddDDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃󶶵󶶵󸸸!!!󃃃DDDDDDDDD󟟟!!!!!!DDD󟟟dddDDD!!!!!!!!!ӃDDDdddDDD!!!󺺺DDD!!!DDD󟟟ddd󃃃ddd󃃃!!!󟟟ddd󃃃󃃃DDD󟟟!!!DDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃DDD󶶵󹹹!!!DDD󺺺DDD󟟟󺺺!!!󺺺ddd!!!󟟟ddd!!!!!!DDD󺺺DDD󟟟ddd󟟟!!!ddd󺺺ddd󺺺DDD󟟟ddd󃃃!!!󃃃dddddd!!!ddd󃃃DDDDDD!!!󺺺dddDDDDDD󺺺DDD󃃃󺺺DDDDDD!!!󺺺DDD󟟟󶶵󹹹!!!󺺺!!!󟟟!!!󺺺DDDDDD󺺺󃃃ddd󺺺!!!󟟟!!!ddd󟟟ddd󺺺DDD󟟟󟟟ddd󃃃󺺺!!!󃃃!!!ddd󃃃!!!!!!DDD󺺺DDDzzzDDDddd󟟟!!!󶶵󹹹!!!DDD󟟟ddd!!!󟟟ddd󃃃󟟟ddd󺺺DDD󺺺DDD󶶵󹹹!!!󟟟ddd󺺺ddd󟟟ddd󃃃DDDdddӃ󺺺DDD!!!󶶵󶶵󹹹!!!󟟟ddd󃃃dddDDDddddddDDDddd!!!󶶵󶶵󹹹#"!󶶵$#"󺺺뿿tqsl-2.8.1/apps/help/tqslapp/addcertaccept.htm0000644000175000017500000001211415003421124021351 0ustar rmurphyrmurphyAccepting an Additional Callsign Certificate

Accepting an Additional Callsign Certificate

LoTW requires that you accept an additional Callsign Certificate using the same computer from which you generated the request for that additional Callsign Certificate.

These instructions assume that your Callsign Certificates reside in the folder C:\MyLoTWCertificates (if you've stored them in a different folder, adjust the instructions accordingly).

When you receive an email message from the ARRL with an attached file named theCallsign.tq6 (for example, K4CY.tq6),
1.Direct your email application to open the email message, and save the attached file into the folder C:\MyLoTWCertificates.
2.To proceed, the file theCallsign.tq5 must be present in C:\MyLoTWCertificates; if you deleted this file, you'll have to start over by requesting a new certificate from the ARRL.
3.Start TQSL and select the Callsign Certificates tab:
   3.aClick the Load a Callsign Certificate button; the Select Certificate File dialog will appear
   3.bIn the Select Certificate File dialog,
       3.b.1.Set the Files of type selector (on OS X, set the Enable selector) to Certificate Request response files (*.tq6)
       3.b.2.Select the file theCallsign.tq6 in your C:\MyLotWCertificates folder
       3.b.3.Click the Open button; a small Install Certificate dialog will appear.
   3.cIn the Install Certificate dialog, you'll be asked if its okay to install a trusted root certificate; click the Yes button
   3.dIn the Load Certificate File dialog, click the Finish button
   3.eThe Callsign Certificates tab will show an entry for your Callsign Certificate, with a yellow medal valid icon: .
   3.fProtect your new Callsign Certificate by directing TQSL to create a Backup File.
   3.gYou can terminate TQSL by selecting its File menu's Exit command (on OS X, by selecting the Application menu's Quit tqsl command).
4.At the completion of these actions, the folder C:\MyLoTWCertificates will contain
   *the file theCallsign.tq6 -- contains the actual Callsign Certificate, in a form that cannot be moved to another folder or saved on an archival storage device
5.If you have TQSL installed on multiple computers, then perform the following steps on each such computer:
   5.aDelete the files theCallsign.tq6 and theCallsign.p12 if they are present, as these files now contain obsolete information
   5.bObtain a copy of the Backup File you created in step 3.f (via your home network, or by using a thumb drive)
   5.cStart TQSL, and direct it to Restore from the backup file you obtained in step 5.b; this will update all Callsign Certificates, Station Locations, and Preferences on this computer to match those on the computer you used to accept the Callsign Certificate in step 3
tqsl-2.8.1/apps/help/tqslapp/addcertreq.htm0000644000175000017500000002674315003421124020716 0ustar rmurphyrmurphyRequesting an Additional Callsign Certificate

Requesting an Additional Callsign Certificate

When submitting a QSO to LoTW, you must present a Callsign Certificate that matches the station callsign you used over the air when making the QSO. Thus if you've made QSOs using callsigns other than your present primary callsign, you'll need to request a Callsign Certificate for each. This process is more straightforward and rapid than requesting your Initial Callsign Certificate because your initial certificate is used to authenticate your request.

If you've already requested a Callsign Certificate for a callsign but have not yet received a response, don't initiate another request; doing so will invalidate the Callsign Certificate you requested, which may be in process or in transit. If you're concerned with the delay in receiving a response to your Callsign Certificate request, send email to LoTW-help@arrl.org .

LoTW requires that you request an additional Callsign Certificate using the same computer with which you will accept that additional callsign certificate.

These instructions assume that your Callsign Certificates reside in the folder C:\MyLoTWCertificates (if you've stored them in a different folder, adjust the instructions accordingly).

To request an additional Callsign Certificate,
1.Start TQSL and select the Callsign Certificates tab, which displays a list of your Callsign Certificates.
2.Open TQSL's Callsign Certificate menu and select the Request New Callsign Certificate... command; the Request a New Callsign Certificate dialog will appear.
 
 
   3.aSpecify your station callsign, DXCC entity, begin date, and end date
      After entering these details,, click the Next button
       3.a.1.Specify* the station callsign for which you seek a Callsign Certificate
       3.a.2.Select the DXCC entity associated with this station callsign. If the necessary DXCC entity does not appear, select the Show All Entities checkbox to allow you to select from all available DXCC entities.
       3.a.3Specify the date of the first QSO you made or will make with this station callsign
       3.a.4.If additional QSOs will be made using this callsign, don't specify a date of the last QSO you made or will make -- leave the Y, M, and D selectors blank; otherwise, set the Y, M, and D selectors to the date of the last QSO made using this callsign
       3.a.5.Click the Next button
       * If you've already requested a Callsign Certificate for the station callsign you specify, TQSL will not permit you to proceed: you should wait until you receive an email message from the ARRL bearing the Callsign Certificate you've already requested. If you are certain that your earlier request was lost or invalidated, select the Callsign Certificates tab, right-click the entry for the pending Callsign Certificate request, and select the Delete Callsign Certificate command; after you delete the pending Callsign Certificate request, you'll be permitted to request a Callsign Certificate for the specified station callsign.
   3.bThe callsign certificate type dialog will appear.
      After selecting the appropriate usage,, click the Next button
 
 
   3.cEnter your name and address
       3.c.1.for US callsigns, the mailing address you enter must match your address in the FCC database
       3.c.2.click the Next button
   3.dEnter your email address; click the Next button
   3.eIf you would like the QSOs for this new callsign to be uploaded to the same Logbook of the World account as one of your other calls, then you should choose a callsign certificate for that account. Otherwise, a new LoTW account will be created to store the QSOs for this new callsign.:
      
      Choose "Yes" and click on the related Callsign Certificate, or choose "No". Then click the Finish button
   3.fIf your computer has internet access, you will be asked if you want to upload this certificate request to LoTW; click the Yes button, and then select TQSL's Status Log tab to view results of the upload. If your computer does not have internet access,
       3.f.1.You will be prompted to save a file whose name is the callsign and whose extension is .tq5; save this .tq5 file in the folder C:\MyLoTWCertificates
       3.f.2.This file will be referred to as Callsign.tq5
   3.gThe Callsign Certificates tab will now show an entry for your Callsign Certificate with a pending icon:   (because the Callsign Certificate doesn't actually yet exist, and thus is not functional).
   3.hYou can close TQSL by opening its File menu and selecting the Exit command (on OS X, by selecting the Application menu's Quit tqsl command).
4.If you did not upload the Callsign.tq5 file to LoTW in step 3.f, move it to a computer with internet access, and upload it to the ARRL via https://lotw.arrl.org/lotwuser/upload ; use the Browse or Choose File button to navigate to the folder C:\MyLotWCertificates and select the Callsign.tq5 file you find there.

If you were not prompted to select a Callsign Certificate to validate your request (TQSL skipped step 3.e above),

5.If you are a US licensee, you will receive a post card in the mail
   5.aAbove your address on the front of the postcard, you will find your 8-character Postcard Validation Code
   5.bUsing your web browser, visit https://lotw.arrl.org/lotw/password
       5.b.1.Enter your callsign (the one you specified in step 3.a.1 above)
       5.b.2.Enter your Postcard Validation Code
       5.b.3.Click the Submit Password button
       5.b.4.Within 3 business days, you will receive an email message containing your LoTW Account Username and Password, with your Callsign Certificate attached
6.If you are not a US licensee, you will receive an email message asking you to submit proof of authorization to operate an Amateur Radio station (for example, a copy of your license) and a copy of one other official document that shows your name (for example, a driver's license). Specific documentation requirements are described in https://lotw.arrl.org/lotw-help/authentication After your documentation is reviewed and accepted, you will receive an email message containing your LoTW Account Username and Password, with your Callsign Certificate attached

If you submitted a request for a Callsign Certificate for a callsign for which you already hold a Callsign Certificate, LoTW staff will contact you via email to determine your intentions.

Note: Obtaining a Callsign Certificate for a callsign in certain DXCC entities also requires submission of a Landing Permit and/or Proof of Entry; see https://lotw.arrl.org/lotw-help/specialdocumentationrequirements.

If you do not receive an email message bearing your Callsign Certificate after 3 business days, do not submit another Callsign Certificate request; instead, send an email message to LoTW-help@arrl.org inquiring about the delayed response.

tqsl-2.8.1/apps/help/tqslapp/addctype.bmp0000644000175000017500000222532215003421124020357 0ustar rmurphyrmurphyBM* 6(* }}zx~}|zxŸ|zyxwvĤ乷ͻͻЖKlkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksϏ<ͻրÎ~րۖ<~ŽݝK*Tրx*Txx*Txx*T*T*T*T*T*TTTT**T***TTT*T**x*T***T****TTx***T***T*T*TTT*T*T*T*TT**TT*T**T*T**T******TT*x*T**T*TTTT*T**xTTT****T*T**T**T*T*TT**T*T*T*T*T*TT***T*T***Tx*T*T*TT*TT*T**x*TT****T*TT*T**T*T*T*T*T*TTTT**T**T*T**T***x*TTT*T*TTT*T*TxT*T**T*TT**T*TT**TT**TT****TTT*T***T*Tx*T*T*T*TT*TTTT*TTTx***TTTTT***TT**T*T*T*T*T*T**TT*TTTTT*T*TTTx*TT**T*T**T*TTTTxT*TT*TT**T*T*T*T*T*T*T*T*T*Tx*T***T*TT*x*T*T*T*T*T*TT**Tx*T**T*T*Tx*T*T*T*T*TTT*TxTT*Tx***TxxxxxݞKÏ~ۖ<րÎۖ<րxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxݝK𠠠(Px(Px(x(x͎jjjbbbjjj(Px(Pxxx((𠠠ttt곳ttt(Px(PxPP𠠠ꘘ(Px(x(xx((x(Px(Pxx(Px((x(PxPP(Px(Pxx(PPPx(P(xP(((Px(P(PPP(P(PPP(PxPPtttttt(Pxx((xPPxP((Px(PxPx(PPxP((Px(Px(Px(PxPx((xx(Px(Px(x((xPx(xP(Px(xP((PxxP((((Px󼼼(Px(xP(PxxP(PP(Px(PxxP(xP(PP(Px(Px(Px(PxxP((xPxP(xP(((xx(Px(xP(Px(xP(Px(xx((xx(kkkkkk(PxPP(PxxP(PP(Px(Pxx(PxP(PP(Px(Px(Px(Pxx(Px(x(x(PP(x(PxPP(PxPP(PxPPx(Pbbbbbb(Px(Px(PxPPx((xPPPP(PxPx(PPx((x(Px(PxPx(PP(PxPx(PP(PxPx((PxPx(x((xPx(x((x(PxPPPPkkkkkk(PxPx((Pxx(P(PPxxx(x(Px(PPx(PP(Pxx(x(x(P(xPx(PPP(Pxx(x((Pxx(x((Px(xPPx(󳳳(Pxxx(((Px(Px(Px(Px(Pxtttttt(P((P(PxPP(Px(Px(Px🟟ꘘPP(PxPx((Px(Px🟟tttώttt͏kkkbbbkkk(Px(xP͎jjjbbbjjj(PxPx(𠠠ttt곳ttt(PxxP(𠠠ꘘ(Px(Px(Px(PxPP(PxPP(xP(((PxPP(P(PPPx(PPP(Px(xP(((Px(Pxx(P(xPx(P(Px(PxPPPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(Pxtttttt(Px(Px(Px(Px(xx((Px(xx(Px(x((x(xx(Px(xP(Px((xx((PxPx(x((x(PxPx(xP((P(PPx((Px(Px(Px(xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px󼼼(Px(Px(Px(Px(xP(Px(xPxP(((xx(xP(Px(xPxP(xP((PxxP(((xx(PxxP((xx((xx(xP((Px(Px(PxxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(Pxkkkkkk(Px(Px(Px(Pxx(x((Pxx(x(P(xx(x((PxPPx(PxP((PxP(x(Pxx(PPPx(Px(P(Px(Px(PxxP(P(x(Px(Pxx(x((Pxxx(((Px(Px(Pxbbbbbb(PxPx(PP(PxPP(PxPP(PxPPPx(x((x(PxPx((xx((Px(Px(Px(PxPx(PPPP(PxPx(PPPP(Px(xx((Px(Px(PxPP(PxPP(x(xPPPPkkkkkk(Px(Pxx(x((Px(xP(Px(xPPP(xP(Pxx(x(x(P(xP(PxPP(Pxx(P(xPPx(x(P(PPxxx(PP(xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx(󳳳(Px(Px(Px(Px(Px(Pxtttttt(Px(Px(Px(Px(Px(Px🟟ꘘPxx((Pxx((xx((xx((x(Px(Px(Pxx((x🟟tttώttt͏kkkbbbkkk(Px(xP͎jjjbbbjjj(PxPx(𠠠ttt곳ttt(PxxP(𠠠ꘘ(Px(Px(Px(PxPP(PxPP(xP(((PxP(xPPPP(P(PPPx(PPxx((Px(PxPP(Pxx((x(Px(PxPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(Pxtttttt(Px(Px(Px(Px(xx((Px(xx(Px(x((x(PxPP((xxxP(Px(xP(Px(PP(x(x(Px(Px(PxPPxP((Px(Px(xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px󼼼(Px(Px(Px(Px(xP(Px(xPxP(((xx(PxxP(Px((xP(Px(xPxP(xx(((Px(Px(Px(PxxP(PP(Px(PxxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(Pxkkkkkk(Px(Px(Px(Pxx(x((Pxx(x(P(x(Px((xxPPPPx((PxPPx(Pxx(((Px(Px(Px(PxxP(PP(Px(PxxP(P(x(Px(Pxx(x((Pxxx(((Px(Px(Pxbbbbbb(PxPx(PP(PxPP(PxPP(Px(Px(xP(PxPx(x((x(PxPx(PP(x(x(Px(Px(PxPPx((xPPPP(xx((Px(Px(PxPP(PxPP(x(xPPPPkkkkkk(Px(Pxx(x((Px(xP(Px(xPPP(Px(xP(x(((P(Pxx(x(x(Px(xx((Px(PxPP(Pxx(P(PPxxx((xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx(󳳳(Px(Px(PxxP(xx((PP(Px(Px(Px(Pxtttttt(Px(Px(PxPPPPxx(((Px(Px(Px(Px🟟ꘘPxx((Pxx((xx((xPx(Px(Px((Pxx((xx((x(Px(Pxx((x🟟tttώttt͏kkkbbbkkk(xP͎jjjbbbjjjPx(𠠠ttt곳tttxP(𠠠ꘘ(Px(Px(Px(PxPP(PxPP(xP(((PxPP(PxPPP(Px(P(PPPPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(Pxtttttt(Px(Px(Px(Px(xx((Px(xx(Px(x((x(xx((Px(xPP(xPx(xP((xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px󼼼(Px(Px(Px(Px(xP(Px(xPxP(((xxxP((Px(Px(Px(Px(xPxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(Pxkkkkkk(Px(Px(Px(Pxx(x((Pxx(x(P(xxP((Px(Px(Px(PxPPxP(P(x(Px(Pxx(x((Pxxx(((Px(Px(Pxbbbbbb(PxPx(PP(PxPP(PxPP(Px(xx((Px(Px(PxPx(x((x(xx((Px(Px(PxPP(PxPP(x(xPPPPkkkkkk(Px(Pxx(x((Px(xP(Px(xPPP(xP(Px(Px(Px(Pxx(x((xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx(󳳳(Px(Px(Px(Px(Px(Pxtttttt(Px(Px(Px(Px(Px(Px🟟ꘘPxx((Pxx((xx((x(Px(Px(Px(Pxx((x🟟tttώttt͏kkkbbbkkk(xP(xP͎jjjbbbjjjPx(Px(𠠠ttt곳tttx((xxP(xP(𠠠ꘘPP(xP(((Px(Px(Px(PxPP(Px(Pxx(P(x(xPPPx((Px(Px(Px(xP(((Px(Px(Px(xP(((PxPxx((Pxx(P(Px(Pxx((x(PxPP(Px(Px(PxPPPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(PxttttttPPPx(x((x(Px(Px(Px(Px(Px(PxPx(Px((xPxx(xx((Px(Px(Px(PxPx(x((x(Px(PxPx(x((xPP(x(xPx((Px(PxPPxP((Px(Px(Px(Px(Px(xx((xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px󼼼PPxP(((xx(Px(Px(Px(Px(Px(PxxP(xP(((xx(xȠP(Px(Px(Px(PxxP(((xx(Px(PxxP(((xxxx(((PxxP((Px(PxxP(PP(Px(Px(Px(Px(Px(xPxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(PxkkkkkkPPP(x(Px(Px(Px(Px(Px(Pxx(PPP(xx(x(P(Px(Px(Px(PxP(x(Px(PxP(xxx(((Pxx(P(Px(PxxP(PP(Px(Px(Px(Px(Pxx(x(xP(P(x(Px(Pxx(x((Pxxx(((Px(Px(PxbbbbbbPP(PxPx(Px(PP(PxPx(PP(PxPx((xȠP(xx((xP(PxPx(Px(PP(PxPPPP(PxPP(x(x(PxPx(Px((PxPPx((xPx((PxPx(PP(PxPP(xx((Px(Px(PxPP(PxPP(x(xPPPPkkkkkkPPPP(Pxx(P(xx(PP(Pxx(x(x(PPPPx(Px((Px(Pxx(P(xx(PP(PPxxx(PPx(xx((Pxx(P(P(PPPPx(x(P(P(PPPPP(Pxx(x((Px(xP(xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx(󳳳PP(Px(PxxP(((xxPx((Px(Px(Px(Px(Px(PxttttttPP(Px(Px(xPPPxP(xx(PxPP(Px(Px(Px(Px🟟ꘘPP(Px(xPPP(PxPx((Pxx((x(Px(Pxx((x🟟tttώttt͏kkkbbbkkk(x(x(xP͎jjjbbbjjjxx((Px(𠠠ttt곳tttPPxP(𠠠ꘘ(Px(Px(Px(PxPP(PxPP(Px(Px(PxPP(Pxx((x(Px(Px(Px(Pxx(P(PxPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(Pxtttttt(Px(Px(Px(Px(xx((Px(xx((Px(Px(PxxP((((Px(PxPPxP((Px(Px(Px(PxPx((Px(xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px󼼼(Px(Px(Px(Px(xP(Px(xP(Px(Px(Px(xx((xx((PxxP(PP(Px(Px(Px(PxxP((PxxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(Pxkkkkkk(Px(Px(Px(Pxx(x((Pxx(x((Px(Px(PxPPx(P(PxxP(PP(Px(Px(Px(Pxx(P(PxxP(P(x(Px(Pxx(x((Pxxx(((Px(Px(Pxbbbbbb(PxPx(PP(PxPP(PxPPPx(Px(PPPPPP(PxPPx((xPx(Px(Px(PP(PxPx(Px((xx((Px(Px(PxPP(PxPP(x(xPPPPkkkkkk(Px(Pxx(x((Px(xP(Px(xP(Pxx(P(xx((xPPx(Px(x(P(P(PPP(Pxx(P(xx(x(P(P(PPP(xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx(󳳳(Px(Px(Px(Px(Pxtttttt(Px(PxPP(Px(Px🟟ꘘPxx((Pxx((xx((xPx((Px(Pxx((x🟟tttώttt͏kkkbbbkkk(xP(Px(x(x(xP(xP͵ʌKh_hʌK͵Px((Pxxx((Px(Px(ўi_______ОixP((PxPPxP(xP(ўi_________Оi(Px(Px(Px(PxPPPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(Px(Pxx(P(P(PPP(Px(xP(((PxPPx(PPP(Px(Px(PxPPx(xP(xx((xx(Ƞ(PxPPPP(Px(Px(PxPxx((PxPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(Px̴___YSPRY___͵(Px(Px(Px(Px(xx((xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px(PxPx(Px(xP((PxPx(x((x(xx(Px((xx((Px(Px(PxxP((((PxPx(PPPP(Px(xx((Px(Px(Px(PxPP(x(x(xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(P8ɍK__Yg!ӿg [__ɌK(Px(Px(Px(Px(xPxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(Px(PxxP((Px(xP(PxxP(((xxxP(xP((xP(Px(Px(Px(xx((xx(xP(PP(Px(xP(Px(Px(Px(Pxxx(((PxxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(Pxh__WԿϩW__h(Px(Px(Px(Pxx(x(xP(P(x(Px(Pxx(x((Pxxx(((Px(Px(Px(Pxx(P(PxPP(PxP(xxP(x(Px(x((Px(Px(PxPPx(Px(PPP(Pxx(x((Px(Px(Px(Pxxx(((PxxP(P(x(Px(Pxx(x((Pxxx(((Px(Px(P8___YY___(PxPx(PP(PxPP(xx((Px(Px(PxPP(PxPP(x(xPPPPPx((PxPx(Px(x((x(Px(Px(xx((PxPx(PPPx(Px(PPPPPP(PxPx(PPPP(PxPP(Px(PxPPPPPP(x(x(xx((Px(Px(PxPP(PxPP(x(xPPPPh__[ֿZ__h(Px(Pxx(x((Px(xP(xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx((P(PPPx(P(Pxx(x((PxPP(xPx(P(xP(Pxx(P(xx((xPPx(x(P(xx(Px(Ƞ(Px(xPPP(Px(PPxxx(x(xx((Px(xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx(ɍK__]o Ϸn \__ɌK(Px(Px(Px(Px(Px(Px(Px(Px̴___\[Z[\___̴(Px(Px(Px(Px(Px(Px(Px(PxОh_________џiPxx((Pxx((x(Px(Pxx((x(Pxx((xx((x(Px(Pxx((xОh_______џi̴ɍKh_hɍK̴(xPPx(xP((xx(PP(Px(Px(xP(((PxPP(PxPPPP(Px(Px(PxPPPP(xP(((Px(Px(PxPP(PxPxx((Px(Px(PxPPx(P(PxPP(Px(Px(PxPP(xP(((PxPPx(P(Pxx((x(PxxP((x(xPP(Px(PxPx(x((x(Px(Px(xx((Px(Px(Px(Px(xx((xx(Px(x((x(Px(Px(xx((PxPP(x(x(Px(Px(xx(Px((Px(Px(Px(Px(Px(xx(Px(x((x(PxPx((PxPPxP((PxxP(xx(((xPxxP(((xx(Px(PxxP(((xx(Px(Px(xP(Px(Px(Px(Px(xPxP(xP(((xx(Px(Px(xP(Pxxx(((Px(Px(PxxP(xP((Px(Px(Px(Px(PxxP(xP(((xx(PxxP((PxxP(PP(PxPPPP(xx((xx((Px(PxP(x(Px(Pxx(x((Px(Px(Px(Pxx(x(xP(P(x(Px(Pxx(x((Pxxx(((Px(Px(PxxP(x(P(Px(Px(Px(Px(PxxP(P(x(Pxx(P(PxxP(PP(PxPPPPx(P(PxPPPx(PP(Px(Px(PxPP(PxPx(PP(PxPP(xx((Px(Px(PxPP(PxPP(x(xPPPP(xx((PxPx(Px((Px(Px(Px(Px(xx((Px(Px(PxPx((PxPPx((xPx(xx((((xx((xxPPPP(Pxx(x(PPPP(Px(xPPP(Pxx(x((Px(xP(xPPP(Px(Px(xP(Pxx(xx((Px(PPxxx((xPx(P(P(PPP(PxPx((Px(xPPPPPx(PPx(x(P(P(PPPPx(xx(((xxxPP(((xx(Px(Px(Px(Px(Px(Px(Px(Px(Px(Px(xx(PPx(x((xx((Px(Px(Px(Px(Px(Px(PxPP(PxPPxxPx(PP(PxPP(Pxx((x(Pxx((x(Px(Pxx((xx((xPx(x((xPx(PPDDD󃃃DDDDDD󃃃!!!󟟟󃃃󟟟DDDDDD󟟟ddd󟟟󟟟ddd!!!!!!!!!󃃃󺺺󟟟󃃃dddDDD󟟟ddd󃃃!!!󃃃ddd󃃃󃃃!!!!!!󟟟DDD!!!󺺺DDDDDDddd!!!dddddd󃃃$#"󶶵#"!!!!!!!󺺺!!!󟟟!!!󺺺DDDDDD󃃃!!!!!!!!!Ӻ󟟟DDD󃃃DDD󃃃ddd!!!dddDDD󟟟ddd󃃃!!!ӃDDD!!!ddd󃃃󃃃ӃDDD!!!󃃃󺺺DDDDDDDDD󃃃!!!!!!󺺺󶶵󶶵!!!󟟟DDD󃃃󺺺dddDDD󟟟ddd󺺺ddd󟟟dddDDD!!!!!!!!!Ӄddd!!!!!!ddd!!!󺺺DDD󟟟ddd󃃃!!!󃃃!!!󟟟ddd󃃃󃃃󃃃ddd󟟟dddDDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃󶶵󶶵!!!󃃃DDDDDDDDD󟟟!!!!!!DDD󟟟dddDDD!!!!!!!!!ӃDDDdddDDD!!!󺺺DDD!!!DDD󟟟ddd󃃃ddd󃃃!!!󟟟ddd󃃃󃃃DDD󟟟!!!DDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃DDD󶶵!!!DDD󺺺DDD󟟟󺺺!!!󺺺ddd!!!󟟟ddd!!!!!!DDD󺺺DDD󟟟ddd󟟟!!!ddd󺺺ddd󺺺DDD󟟟ddd󃃃!!!󃃃dddddd!!!ddd󃃃DDDDDD!!!󺺺dddDDDDDD󺺺DDD󃃃󺺺DDDDDD!!!󺺺DDD󟟟󶶵!!!󺺺!!!󟟟!!!󺺺DDDDDD󺺺󃃃ddd󺺺!!!󟟟!!!ddd󟟟ddd󺺺DDD󟟟󟟟ddd󃃃󺺺!!!󃃃!!!ddd󃃃!!!!!!DDD󺺺DDDzzzDDDddd󟟟!!!󶶵!!!DDD󟟟ddd!!!󟟟ddd󃃃󟟟ddd󺺺DDD󺺺DDD󶶵!!!󟟟ddd󺺺ddd󟟟ddd󃃃DDDdddӃ󺺺DDD!!!󶶵󶶵!!!󟟟ddd󃃃dddDDDddddddDDDddd!!!󶶵󶶵#"!󶶵$#"tqsl-2.8.1/apps/help/tqslapp/additional-info.htm0000644000175000017500000000107115003421124021624 0ustar rmurphyrmurphyTQSL Additional Information

Additional Information

tqsl-2.8.1/apps/help/tqslapp/addstnl0.bmp0000644000175000017500000003737615003421124020303 0ustar rmurphyrmurphyBM>6(=  @@bbbrt¶:;RS*+ffBDºZ[ NO23~npz|^_JK&'ikVZbfvxFG67..VVbb"">?''''''''''''''''''''' 'P '''M 'M  ''M  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  '' '''''''' ''''''''  ''''''''''  '''''''''''''''' ''''''''''  ''''''''''''''''''  ''''''''''''' ''''''''''''  ''''''''''''  ''' ''''''' ''''''' ''  '' ''''''''''  ''''''''' ' '''''''''''  '' '''''''''''  ''''''''''''''' '''''' ''''''''  '''' '''''''''''''  '' '''''''' ''''''''  '' '''''''  '' '''' ''' '  '''''  '' ''' ''' '  ''''  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''M' M'  'M'  ''N'N' 'N' ''OO 'O ''''''''''''''''''''''''''' ' ' ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<'L''<'K''<'K' '<'L' ' '<'L' ' '.' 'L' ' '/' 'L'' ' '0' ' /'' ' ''''''''''' ' 0' ' ' '''''' ''''''''''' ' 0''' ' ' ''''''''''''' ' 0''' ' ' ' ''''''''' '''''' ' 0''' ' ' '''''''''''''' '0'' ' ' ' ''''''''''''''' ' 1''' ' ' ' ''' ''''''' 'C'' '' ' '''''@'''' ' ''''L''' ' ' '<'L' ' '<'L'' '<'[' '<'K''<'M''<'{'<'x'<'x'<'x' '<'x' '<'x' '<'x'' '<'K'' ''''''''' 'L' ' ''''''''''''' 'L''' '''''''''''' 'L''' ' ''''''''' 'L''' ''''''''' ' L'' ' ''''''''''' 'M''' ''''''''' 'p'' '' ''''' '' g'''' ''' ''x''' ' '<'x' '<'x''<'x'<'y'<'{''''''''''''''''''''''''''''''''''''''''''''''''''''':::55&55&5&&;;%;% % 6 666444 4 <<<3<3 # 8."" "9/9////) )  )  00!0!! !!!11 >+>+ ??,??,,?,, --- ((====== $$$$*$$**$*:::5 &;;;%%;% % % 6 6644 4 <<<3< 3 #  8.8.8."" //9/99/9//)) ) ) )  000!0!!1111+++>++,,?,?,----(((====$$*$**   : :55 5&&;; % 6664 44 < <<3<<3#3###  8.."" "9/9///))  ) ) 0000!0!!0!!111 +>+>>+,,??,, ----- (7====$$*$*$***  ::555 &;;% % 6644 4 << < <<<333#3##  8 ..8.8.8."" 9/9/9/9///) ) 00!0!!111 >+>>+>+? , ,?,?,---((((( == $***  :::5& ;;;%%%%% 44 4   <<<<<33#33##   8 88.8.8.""9""9///)))) )) ) ) 00!0!0!!1111 >>++>++++ ?,???,,,?-- --(((======$$**$*** 7  ::55 55&&&& ;;;%;%%  666444   <<<<33##3##  8 8 88.8888""" /"/9/9////)) )) )  000!0!!0!!111>++>>>,?,?,?  ------(((==$$**  : :::5*55&&&&;;;%%%%%% 6166444 44   <<<<<33#3#  . 88..8.."/"99/99/ ))    00!0!00 ! !!!11111 +++ ,,??,,,??-- -((7===== $$$$*$***** ::55&&&&&;;;%;%%  666 664  <<<<33#3#   .8 8.8 "/9"9/99/)) )) ) )  000!0!!11 >>>+>>+>+?,,?,,?--(-(==$$*$$*  :::5&&&;;;;%% % 66644444 <<<<<<< 3 # 8.8 "9/))) )  00!0!111 >+>> ??,,?? --((====$$$*$$*$$**  :::5&&5&&;;%%%% % ,666 664444    <<3 3#  88.8..88.88 "//9//9/)) ) )  00!0!11111+ ?, ?,??,?,?-((=7=====$$*** :::::5&55&;;; %%%%%6  6444  < <<<3<3<3#3#  8.8.8.. "//)) ))  ) ))  0000 !1111>+?,,?,,?----(=== $$$*'' '  ::5 5&&&5&&;;;%;%;% %% %6%6 666666644  4 44 4 < < <<<33#3#  8 .8.8.8. "/99/9/)) )  00 !111>++++?,,?,,?, ,,----(((===$ * *'''' :::55 5&&&;&;;%;%;% %  66444 4 < < < <<3<3<33#33###  8 8.88.""9""9//9//)  )   00!00!!!11111 >++>>+>+> ,,?,,,?,------(((===$$$**22'2  ::::55&55&5&5&;;%;;%;%%; % % % 66 66 44444 4 4 < < <<3<333##3##  8 8 .8.8.88""9"/9/9/)) ) )  0!0!0!!111 >++>>+>+ ?,,,?,??,,,---((7=====$$*$**22  :::55&&5&55&&;;%%;%;% % 6 66644 4 < <<3<33#3##  8 .8.888"" 9"/9/9/9//))) ) )  00!0!!11111 +>>+>>+>> ,?,?,????----(-(( =======$$$*$*   ::::555 &&5&&&&&;;;%%;%% % % 6 6 664444 4 << < <<<3333#3##  88 88"""99"99/9/9)) )  0!!0!!1111 >>>>+>+++? ?,?,?,?--- -((==(==$$$**$**  : 5&&5&&5& ;%%;% 6  4 << 3#  8  "9//)  )  0 ! 1 >>+>+> ?,?,?? --(( =  $**    :  5&&5&  ;%%;% 664 <<3 #  8  "9  )  0 ! 1 >  ?? --  =  $**tqsl-2.8.1/apps/help/tqslapp/backuprestore.htm0000644000175000017500000001412215003421124021435 0ustar rmurphyrmurphyBacking Up and Restoring Callsign Certificates, Station Locations, and Preferences

Backing Up and Restoring Callsign Certificates, Station Locations, and Preferences

TQSL can be directed to save all of your Callsign Certificates, Station Locations, and Preferences in a single Backup File with a .tbk file extension. If you copy this Backup File to a safe place, you'll be able to quickly recover from a computer failure by directing TQSL to restore your Callsign Certificates, Station Locations, and Preferences.

You can configure TQSL to when terminating, automatically create a Backup File named tqslconfig.tbk in a specified folder. You can also configure TQSL to retain a specified number of such automatically-created Backup Files.

Safe Places to Store your Callsign Certificates, Station Locations, and Preferences

An external hard drive, a thumb drive, or another computer on your home network will provide local backup that you can quickly access, but will not provide protection against a local catastrophe. A free "cloud storage service" like DropBox or Google Drive or Microsoft SkyDrive can provide better protection, but requires internet access for both backup and recovery. Ideally, important files should be saved both locally and in cloud storage.

Creating or Updating a Backup File
To save your Callsign Certificates, Station Locations, and Preferences to a Backup File,
1.Select the File menu's Backup Station Locations, Certificates, and Preferences... command.
2.In the Enter file to save to dialog that appears,
   2.aNavigate to the Folder in which you want the Backup File created.
   2.bSpecify the File name of the Backup File to be created, or select an existing Backup File to be replaced with an updated version..
   2.cClick the Save button

Configuring TQSL to Automatically Create a Backup File When Terminating
To configure TQSL to automatically create a Backup File named tqslconfig.tbk when terminating,
1.Select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command).
2.In the Preferences dialog that appears, select the Options tab; on this tab,
   2.aCheck the Allow automatic configuration backup box.
   2.bClick the Browse button to the right of the Backup File Folder textbox and use the Browse For Folder dialog that appears to select the folder in which Backup Files will automatically be created when terminating.
   2.cSpecify the Number of Backups to retain setting.
   2.dClick the OK button.
The most recent automatically created Backup File is named tqslconfig.tbk. Older retained Backup Files are named tqslconfig-yyyy-mm-dd-hh-nn, where yyyy-mm-dd-hh-nn is the UTC date and time at which the Backup File was created:
   yyyy:year
   mm:month
   dd:day
   hh:hour
   nn:minute

Restoring from a Backup File
To restore Callsign Certificates, Station Locations, and Preferences from a selected Backup File,
1.Select the File menu's Restore Station Locations, Certificates, and Preferences... command.
2.In the Select saved configuration file dialog that appears,
   2.aNavigate to the Folder that contains the Backup File you wish to restore.
   2.bSelect the Backup File to be restored.
   2.cClick the Open button
tqsl-2.8.1/apps/help/tqslapp/cab-modes.htm0000644000175000017500000000347715003421124020431 0ustar rmurphyrmurphyDefining custom Cabrillo modes

Cabrillo Mode Definitions

When processing a log, TQSL can process both ADIF and Cabrillo format log files. ADIF is the preferred format for logs as it is better able to convey the details of a QSO, but Cabrillo is also supported.

One detail when processing Cabrillo logs is that the mode of a QSO is specified by a two-character encoding in a fixed field of the log. Traditionally, this permitted modes such as PH (Phone), CW, RY (RTTY). The designator "DG" is now permitted for Digital operations.

TQSL supports the following modes and translations:
SpecifierResulting Mode
CWCW
PHSSB
FMFM
RYRTTY
DGDATA

TQSL allows an operator to add or alter these mode "mappings" by use of a configuration file. This file is called cab_mode.dat and is stored in the TQSL working directory, which is either %AppData%\TrustedQSL (Windows) or $HOME/.tqsl (UNIX, OSX).

Create this file using a text editor with one mode specification per line, with the Cabrillo specification followed by the desired mode, with a comma separating the entries. For example, mapping can be specified to direct TQSL to upload DG QSOs as FT8 by making a cab_mode.dat file with the following content:

DG,FT8

Entries in the user's file will override any stock configuration and can add new mappings.

Be sure to use a plain text editor (such as Notepad), not a word processor, when creating or editing this file. tqsl-2.8.1/apps/help/tqslapp/cabrillo.htm0000644000175000017500000000234315003421124020355 0ustar rmurphyrmurphyPredefined Cabrillo Contest Definitions

Predefined Cabrillo Contest Definitions

Without additional configuration, TQSL can digitally sign and submit Cabrillo files that specify any of the following contests:

  • AP-SPRINT
  • ARRL-10, ARRL-160
  • ARRL-DX-CW, ARRL-DX-SSB, ARRL-RTTY
  • ARRL-SS-CW, ARRL-SS-SSB
  • ARRL-UHF-AUG
  • ARRL-VHF-JAN, ARRL-VHF-JUN, ARRL-VHF-SEP
  • BARTG-RTTY
  • CQ-160-CW, CQ-160-SSB
  • CQ-VHF
  • CQ-WPX-CW, CQ-WPX-RTTY, CQ-WPX-SSB
  • CQ-WW-CW, CQ-WW-RTTY, CQ-WW-SSB
  • DARC-WAEDC-CW, DARC-WAEDC-RTTY, DARC-WAEDC-SSB
  • IARU-HF
  • NA-SPRINT-CW, NA-SPRINT-SSB
  • NAQP-CW, NAQP-RTTY, NAQP-SSB
  • NEQP
  • OCEANIA-DX-CW, OCEANIA-DX-SSB
  • RSGB-IOTA
  • SAC-CW, SAC-SSB
  • STEW-PERRY
  • TARA-RTTY
  • WAEDC

To digitally sign and submit a Cabrillo file that specifies a contest not on the above list, you can add a Cabrillo contest definition.

tqsl-2.8.1/apps/help/tqslapp/certaccept.htm0000644000175000017500000001425515003421124020710 0ustar rmurphyrmurphyAccepting an Initial Callsign Certificate

Accepting an Initial Callsign Certificate

LoTW requires that you accept your Initial Callsign Certificate using the same computer from which you generated the request for your Initial Callsign Certificate.

These instructions assume that your Callsign Certificate reside in the folder C:\MyLoTWCertificates (if you've stored them in a different folder, adjust the instructions accordingly).

When you receive an email message from the ARRL with an attached file named YourCallsign.tq6 (for example, CT2IRY.tq6),
1.Direct your email application to open the email message.
   1.aThe attached file contains your Initial Callsign Certificate -- save it into the folder C:\MyLotWCertificates
   1.bThe message will contain a Web Account Username and a Web Account Password; be sure to record these, as they are required to view your uploaded QSOs and LoTW-generated confirmations via https://lotw.arrl.org/lotwuser/default
2.Start TQSL and select the Callsign Certificates tab. note: You will need to expand the "Certificates that are awaiting ARRL approval" list by clicking the "+" to the left of the folder icon to see the pending callsign certificate.
 
   2aClick the Load a Callsign Certificate button; the Select Certificate File dialog will appear
   2.bIn the Select Certificate File dialog,
       2.b.1.Set the Files of type selector (on OS X, set the Enable selector) to Certificate Request response files (*.tq6)
       2.b.2.Select the file YourCallsign.tq6 in your C:\MyLotWCertificates folder
       2.b.3.Click the Open button; a small Install Certificate dialog will appear.
   2.cIn the Install Certificate dialog, you may be asked if its okay to install a trusted root certificate; click the Yes button
   2.dIn the Load Certificate File dialog, click the Finish button
   2.eThe Callsign Certificates tab will show an entry for your Callsign Certificate, with a yellow medal valid icon: . Note that this now appears under the Active, usable certificates category.
    
   2.fTo protect your new Callsign Certificate, direct TQSL to create a Backup File.
   2.gYou can terminate TQSL by selecting its File menu's Exit command (on OS X, by selecting the Application menu's Quit tqsl command).
3.At the completion of this phase, the folder C:\MyLotWCertificates will contain
   *the Certificate Request file YourCallsign.tq5 -- request sent to ARRL (no longer needed)
   *the Certificate file YourCallsign.tq6 -- contains your actual Callsign Certificate, in a form that cannot be moved or copied
4.If you have TQSL installed on multiple computers, then perform the following steps on each such computer:
   4.aDelete the files YourCallsign.tq6 and YourCallsign.p12 if they are present, as these files now contain obsolete information
   4.bObtain a copy of the Backup File you created in step 3.f (via your home network, or by using a thumb drive)
   4.cStart TQSL, and direct it to Restore from the backup file you obtained in step 5.b; this will update all Callsign Certificates, Station Locations, and Preferences on this computer to match those on the computer you used to accept the Callsign Certificate in step 3

A table illustrating the icons used by Windows to designate the above-mentioned LoTW file types in Windows Explorer is provided here. tqsl-2.8.1/apps/help/tqslapp/certaccept1.bmp0000644000175000017500000430155615003421124020766 0ustar rmurphyrmurphyBMn6(F8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𿿿zzz𿿿zzz𿿿zzz𿿿𿿿zzz𿿿𿿿zzz𿿿𿿿zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𿿿𿿿zzz𿿿𿿿zzz𿿿𿿿zzz𿿿zzz𿿿zzz𿿿zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'wPPw'wP'PPPP'wP'''PwPPPPP'PwPPPw'w''wPww''Pwww'ww''PwPw'w''w'Pw'wPP'w'ww''PwPPwP'PP'w'w'wȠP'PwwP'''ww'Pw'Pw'Pw'wP'PwwP'PPww'''Pww'P'PwP'w'Pw'Pw'Pww'w''PwwP'PPww'''Pw'wP'Pw'Pw'Pw'Pw'PwPP'PwPPw''wPP'w'wPw'PPPPPP'Pw'Pw'wP'Pww'Pw'ww''PwPw''Pw'Pw'PwwP'ww'Pw'Pw'PwPP'Pw*U*UU**UU**UUU*U*U*UUUUU*U***U***U***U*U*UUU*UU**U*U*U***U*UUU*U*U*UUU*U***UUU*UUU***U*UUU*U**UU*UUUUU**U**UU****UU***UUU****U*U***UUU***U*UUUU**U*U*U*U*U**U****UU**UUUU*U*U**UUUU***U******ԪUU**UU*U**UU****UU****U*U*U*U***U*U*U*UU**U*U*U*U*UU*U****UU**UU*UU*U*U*UU*UUU*U**U*U*U*U*U*UU**UU*U*U**U*U***U***U*U*UU**U*U*U*U*U*UU*U**U*U*UU*UU*UUU*UU*UUU**U*****U*UU**U*UU****U*U***U*U*UUU*UUU**UUUU***UU*U**U*U*U*U***U*U*UU**UUU**U***U*UU*****UU*UUUUU**U*U*U*UUUUUU*UU*U*U*U*U***U*UU*U**U*U*UUU*UU**U*UUUUU*UUU*U*U***U*UUU*U*U*U*U*UU**U*U*U*U*U*U*U*U*U*UU**U*U*U*U*U*U*UUU*U*UUU*U***U*U******U***̿̿̿̿̿222000111222222222222222000222̿000333777<<>>000̿000<<>>DDDIIIRRR\\\\\\[[[YYYWWWSSSOOOEEEJJJDDDDDDCCCBBBBBBEEEHHH===)))+++,,,---...222UUUTTTRRRRRRPPPOOOLLLDDD̿555>>>DDDIIIUUUZZZYYYYYYXXXVVVTTTSSSPPP999EEECCCBBBAAABBBEEEIIIMMMBBB,,,///111222333777[[[ZZZXXXUUUSSSRRROOOKKK***̿:::===DDDHHHTTTWWWVVVVVVTTTTTTVVVWWWTTTNNNOOOCCCBBBAAAAAAEEEJJJNNNSSSGGG111444666777888<<>>DDDFFFVVVQQQMMMKKKNNNSSSZZZaaahhhnnnqqq]]]BBBBBBCCCIIIQQQZZZdddnnnvvvjjjNNNTTTXXXYYYYYY[[[{{{sssjjjccc[[[UUUQQQDDD̿;;;AAAFFFFFFUUUOOOKKKKKKOOOWWWaaakkkttt{{{}}}gggBBBDDDHHHQQQ[[[fffqqq}}}zzz^^^dddhhhiiiiiikkk~~~tttjjjcccZZZRRRLLL̿999>>>DDDFFFEEEVVVOOOLLLNNNTTT]]]hhhttt~~~nnnEEEJJJOOOZZZaaammmyyykkkrrrwwwyyyyyyzzzwwwqqqhhh```YYYNNN̿;;;AAADDDDDD@@@BBBQQQOOORRRZZZeeeqqq}}}{{{KKKNNNUUUaaaeeeEEELLLWWWbbblllvvv}}}{{{pppcccTTTaaayyynnneee]]]UUU̿888===BBBDDDBBB===<<>>888444RRRZZZ```iiitttnnnFFFJJJCCCVVVWWW___oookkkmmmxxx~~~wwwlllbbbCCC̿;;;@@@BBB@@@888000---222VVVGGGVVV```DDDSSSFFFKKKOOOKKK]]]ZZZaaarrr{{{{{{zzznnnggg̿888<<>>CCCGGGKKKOOOTTTWWWlll]]]bbbtttǾ|||pppiii̿888===@@@???999666222333444777:::===BBBEEEJJJOOOTTTZZZ___YYYdddbbbsssȾ{{{pppMMM̿888===?????????===111333555999<<>>DDDJJJQQQXXX```hhhqqq{{{lllZZZKKK@@@@@@̿*U***U*U*U*U*****U***U***U***U*U*UUU*UU**U*U*U***U*UUU*U*U*UUU*U***UUU*UBBBJJJ999777333222333???>>>@@@FFFMMMTTT\\\dddmmmwwwxxxaaaPPPEEEBBB̿*U*UU**U*UU*******UUU*U***UUU****U*U***UUU***U*UUUU**U*U*U*U*U**U****UU*CCCHHHEEE555222222333JJJ===AAAHHHOOOWWW```gggqqq{{{~~~gggUUUJJJDDD̿*U**U**U*UU****UU*Ԫ**U****UU****U*U*U*U***U*U*U*UU**U*U*U*U*UU*U****UU*GGGEEEGGG666333222<<>>???===;;;===???GGGTTTXXXTTTTTT^^^fffnnnvvvvvvbbbTTT̿*UU**U*UU**UUU*UU*UUU*UU*U*U*U*U***U*UU*U**U*U*UUU*UU**U*UUUUU*UAAA<<<;;;999:::===DDDNNN\\\oooZZZ^^^fffooovvv{{{hhhYYY̿*U*U*U*U*U*U*U*U*U::::::888999<<>>999:::<<>>AAAGGGLLLVVVbbbooo|||xxxYYY̿DDD>>>BBBGGGNNNVVVcccrrr~~~zzz̿DDDAAAHHHNNNWWWfffqqqhhhzzzppp̿EEEFFFMMMWWWfff]]]RRRdddqqqvvv{{{|||www̿MMMLLLVVVbbbTTTNNNUUUpppkkkpppuuu|||̿WWWQQQ^^^jjjgggeeegggxxxiii{{{||||||www̿\\\bbboooiii|||yyywwwttt̿dddgggqqqkkksssmmmmmmnnnnnnlll̿ddddddmmmfffdddeeeeeedddnnn̿̏pppqqqggg```dddfff̿̿̿̿̿̿̿̿̿̿VVVmmmbbbQQQBBB999333---(((̿>>>kkkyyyuuurrrfff```]]][[[XXXTTTQQQNNNKKKFFFAAA<<<666111,,,̿888NNN^^^hhhbbb```WWWccceee___\\\WWWRRRMMMKKKJJJLLLNNNQQQTTTUUUTTTSSSPPPNNNJJJEEE@@@:::555222̿000HHHKKK\\\cccfffAAAcccqqqlllnnnnnnmmmkkkhhhaaa\\\VVVQQQNNNLLLLLLLLLNNNPPPRRRTTTTTTUUUTTTWWWZZZ̿&&&???EEEKKK\\\eeeggg===bbbqqqlllmmmoooppppppppppppooommmkkkhhhddd```\\\XXXUUURRRPPPNNNNNNOOORRRTTT̿,,,>>>EEEKKK\\\eeehhh>>>aaannnfffeeeeeeeeeeeeeeeeeedddcccbbbaaa___^^^]]][[[ZZZXXXVVVUUUSSSPPPOOOPPP̿,,,>>>EEEKKK]]]fffhhh???ZZZeee^^^```bbbcccdddeeeeeedddcccbbbaaa___^^^\\\[[[YYYWWWVVVTTTSSSQQQNNNMMM̿555<<>>>>>IIIMMMbbbqqqvvvHHHqqqqqqpppooonnnnnnmmmmmmnnnooopppqqqtttvvvsssmmmhhhZZZNNNNNN̿777@@@IIIMMMggguuuvvvGGGcccMMMNNN̿666@@@IIIMMMrrrPPPbbbMMMNNN̿777@@@IIIMMMrrr[[[fffNNNNNN̿???IIIMMMrrrYYYzzzsssmmmgggVVVNNNNNN̿AAAIIIMMMtttZZZ}}}zzzwwwtttooojjjgggeeecccccceeefffggg̿jjjjjggjjjjjIIIMMMxxx}}}\\\}}}zzzwwwsssrrrqqqppppppqqqqqqrrrrrrrrrrrrrrrpppooo̿kjjg[PffP[gjjjNNN|||yyyuuurrrqqqqqq̿jjj b\\ bjjj}}}̿jj bpp bjjvvv̿jg\\gj+UԀU+UU+UԀU++UԀ+++++UԀ++ԀUU+UԀUԀ+U+ԀUU+UԀUԀ++ԪU+UԀUԀ+UUUU+UԀUԀ++ԪU+UԀU++UԀUԀ++UԀ+Ԁ+UU++UԀ++ԪU̿j[.y;[j+UԀ+Ԁ+UU+UԀUԀ++UԀU+UUU+UU+UԀ++ԀUU+UԀ+UԀ+UԀUUԀ+Ԁ++UԀU++U+UԀ+UԀԀ+Ԁ+UUUԀ++UԀU++U+UԀUԀ++UԀ+UԀ+UԀ+UԀUUUUU++U̿mmmmmmmmmmmmmmmmmmjP1{FdPj+UԀUUUU+UԀ++++Ԫ+UԀ++ԀU+++ԀU++UԀ+U+UԀUU+UԀ+UԀ+UԀU++ԪU+UԀUU+UԀ+UԀ+ԪU+UU++UԀUU+UԀ++++Ԫ+UԀ+UԀ+UԀ+Ԁ+UU+UUU̿gfSMofg+U++ԀUU+UԀ++UU+UԀ+UԀ+UԀ+U+UԀ+UԀ+UԀUU+UԀUU+UԀ+UԀ+UԀ++Ԁ+U+UԀ+Ԁ++ԪU+UԀ+UԀ+UU+++Ԁ+UԀ+Ԁ++ԪU+UԀ++UU+UԀ+UԀ+UԀU+UUU++Ԁ++ԪUmmmgf0z^fgUUUU+UԀUU+++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUU+UԀUU+UԀ+U+U+UԀ++++Ԁ+UԀUU+U+++UUU++++Ԁ+UԀUU+++UԀUUUUUU++++++ԀjP1{aPj+UU+UU+UԀUU++Ԁ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUԀ++UԀUU+UԀ+UԀ+UԀ+UUԀ++UԀ++Ԁ+++UԀ+UԀUԀ+U+++Ԁ+UԀ++Ԁ+++UԀUU++Ԁ+UԀ+UԀ+UԀU+ԪUUU+++Ԁ++mmmj[0{ b[j+UԀ+ԪUUU+U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀ+UԀ+U+++UԀUU+UԀ+UԀ+UԀU+U++UԀ+Ԁ++Ԁ++UԀ+UԀU++UU++UԀ+Ԁ++Ԁ++U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀUU+U+Ԁ++Ԁ+jg\&u^\gj+UԀUԀ++UUUU+U+++ԀU+Ԁ+UԀ+UԀ+UԀ+UԀ+U++U+UԀUU+UԀ+UԀ+UԀUUU++UԀU++++UԀ+UԀ+UԀU+U+Ԁ+Ԁ++UԀU++++UԀ+U+++ԀU+Ԁ+UԀ+UԀUUUU+UU++++UԀmmmjj bpV5~p bjj+UԀ+UUUUU++Ԁ+UԀ+UԀ+UԀ+UԀUU+UԀUUU+UUUԀ+UUUԀ+UUU+UUUUUԀ+UԀ+UUUU++ԀUUUUUU++UUjjj b\\ bjjjmmmjjjg[PffP[gjjjjjjjjggjjjjj᭭mmm᭭c%h'i(i(i(i(i(i'᭭X!h'i'i'j'j'k'k&k&l&l%k$᭭+U+UԀ+UԀg$m&l%m%m%n%o%o$p%p#p#q#q#r#m ᭭U++UԀ+UԀo$q$p#q#q#r#s$qt#ru#u!u!v!v!w!x ᭭㑑2^^RjjU++UԀ+UԀt"s"t"u!u!u!x% mjoy!wz zz{{{᭭㑑2T+++U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUUUU+UԀ+UԀ+U+++UԀUU+U+++UԀ+UԀ+U+U+++UԀ++Ԁ++Ԁ+U+++UԀ+UԀUU+UԀ+UԀ+UԀU++UԀUԀ++ԪU+UԀ+Ԁ++UԀ+Ԁ+UԀ++U+++UԀ+U+UUU+U+UUU+UԀ++Ԁ+U+U+++UԀ+UԀw w x y yy|" tGMЯx~~᭭푑2TUUUԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ++UԀ+UԀ+UԀU+Ԁ++Ԁ+UԀU+Ԁ++Ԁ+UԀUԀ+U+Ԁ++Ԁ++++Ԁ++UUUԀ+U+Ԁ++Ԁ+UԀ+UԀ+UԀ+UԀ+UԀUU++ԀU++U+UԀ+UԀ+UԀ+UԀ+UԀU+Ԁ++ԀUԀ+U+UԀ+U++UԀUUU+U++U+UU+Ԁ++Ԁ+UԀ{||}}{/5Ó{ ᭭cKcKcKcKcK푑mmmmmmmmm2T+UU++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++U+UԀ+UԀ+UԀU+++Ԁ+UԀU+++Ԁ+UԀU+U+++Ԁ++Ԁ+UU+Ԫ++ԀU+++Ԁ+UԀ+UԀ+UԀ+UԀ+UԀ+++UԀUU+UԀ+Ԁ++UԀ+Ԁ++UԀU+++Ԁ+UԀ+U+UԀ+U+UԀU+UU+Ԁ++Ԁ+U+++Ԁ+UԀ!qu ᭭2TU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ++UԀ+UԀ+UԀU+Ԁ+UԀU+Ԁ+UԀ+UU+Ԁ+++U++++ԀU+Ԁ+UԀ+UԀ+UԀ+UԀ+UԀ+++UԀ+Ԁ++ԪU+UԀU++UԀU++UԀU+Ԁ+UԀUU+UԀUU+UԀU+UUUU+UU+Ԁ+UԀ׶SW ᭭2T+++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UU+UԀU+UU+UԀ+UԀ+UԀUԀ++UԀUԀ++UԀUUU+++Ԁ++Ԁ++UԀ+UԀ+UԀ+UԀUUUUUU++Ԁ++++ԀUUUU+UԀ+UԀU+Ԁ++ԀU+Ԁ++ԀUԀ+UU++ԀUUUU+UԀ+UԀ ə8< ᭭2TU++U+U+UUU+UԀUԀ++UԀ+UUUUU+U+UUU+U+Ԁ+UUUUUU+U+UUU+UUUUU+UԀU+UU+UԀUU+UԀ+UUԀ++++UԀ++Ԁ+++UԀU+Ԫ+UԀU+Ԫ+UԀUU+U+Ԁ++U+Ԁ++U+UUU+U+UU+UU+UԀwzԧ!vxKN!%    ᭭2T+U+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ++Ԁ++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ \_̑ɅBE    ᭭2T+U+UԀUU+UԀ+UԀ+UԀ+UԀ+UԀU++++UԀ+UԀUU+UԀUU+UԀ+UԀ su ʁ'*eg  ᭭mmmJff""""""""T++++ԀU+++Ԁ+UԀ++Ԁ++ԀUUUUUU+UԀ+UԀ   :=[] ̀!no    ᭭VVz      ~       ᭭mmm   }~  ᭭       {| ᭭mmmᏏ~᭭ᣣ ڄHH᭭mmmᚚȝ᭭᧧֨᭭mmmUU᪪՟᭭2^^RjjUUᠠͥtt11^^ŵ᭭*Ummm2TUԀ++ԪUUUUU+UԀ+U+UU+UUU+UԀUU+U+++UԀ+U+UUU+UԀ+UUU+U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUUዋġءՌՉٙ᭭U*2TU++U+Ԁ++UԀ+UԀU++U+UUԀ++UU+Ԁ+Ԁ+U+Ԁ++ԀUԀ+U++UԀUԀ++Ԁ+UԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ+ᩩ᭭U*mmmmmmmmmmmmmmmmmm2TUUU++UԀ+UԀ+Ԁ++Ԁ+U++UԀ+UԀ+UU+++Ԁ+UԀ+U+UԀU+U+U++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++UẺ᭭U****U***UU**U*U***U***U***U*U*UUU*UU**U*U*U***U*UUU*U*U*UUU*U***UUU*U2T+Ԁ++ԪUU++UԀ+UԀUU+UԀ+U+UԀ+UԀ+Ԁ+U+Ԁ+UԀUU+UԀ+UU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ+ᙙƿ᭭*UUUU*U***UU**U***UUU****U*U***UUU***U*UUUU**U*U*U*U*U**U****UU*mmm2T++++Ԁ+Ԁ++UԀ+UԀUUUU+UԀUԀ++UԀ+UԀUU+UԀU+Ԁ++Ԁ+UԀ+UԀUԀ++Ԁ++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UUᢢ{}{᭭*UU*UUU******UU****UU****U*U*U*U***U*U*U*UU**U*U*U*U*UU*U****UU*2T++Ԁ+++UUU+UԀ+UU+Ԁ+U+UԀ+UԀ+UUU+U+Ԁ++UԀ+U+U+U+U+UUU+UԀUԀ++UԀ+UUUUU+U+Uᦦ׹᭭*UU*UUU****UU*U*U**U*U***U***U*U*UU**U*U*U*U*U*UU*U**U*Ummm2T+Ԁ++Ԁ++UԀ+UԀ+UԀ+UԀ+UԀ+UԀᦦտ᭭*UUU***UUU***U***U*U*UUU*UUU**UUUU***UU*U**U*U*U*U***U*U*UU*2TU++++UԀ+UԀ+UԀ+UԀ+UԀUU+UԀᢢʰᘘprp᭭*U*UUU***UUUU*UU*U*U*U*U***U*UU*U**U*U*UUU*UU**U*UUUUU*UmmmJff""""""""TUU++Ԁ+UԀ+UԀ++ԀU+++ԀᘘϲỻϽ᭭*U*U*U*U*U*U*U*U*UVVz᷷Ɲᦦ}~᭭*U*U*U*U*U*U*UUU*UmmmᦦĘᢢٱ᭭*U*U***U*U******U***Ẻȥ᭭᭭mmm᜜οᚚ᭭((((((((((((((((((((((((((((((((((((((((((((((((((((((ᤤ°Ѱ᭭xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(ᢢγ᭭(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxḸ᭭xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(ṹ᭭㑑2^^Rjj(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx᭭㑑2Txxxx+x׏x׏x׏xUx׏x׏x׏xx׏xxxxxx+xx׏xxUx׏x׏xx׏xxץx׏xUxxUx(᭭푑2T(xxץxxץx+׏x׏x׏xxx+޼x׏xץx+׏x׏xx׏xxxxץxxץx޼xxxx׏xx׏xx׏x׏xx׏x޼xxxx+׏x׏xx޼xxxxxx+޼x᭭cKcKcKcKcK푑mmmmmmmmm2TxxץxxxxxxUx׏x׏x׏xx+ץx׏x+xx׏x׏xx׏xxxxץxxxxxxUxxxx׏xx׏xx׏x׏xx׏xUxxxxUx׏x׏xxUxxxxx+ץx(᭭2T(xxUxxxxxx׏x׏x׏޼xxx׏x+xx׏x׏xx׏xxxxUxxxxxx׏xx׏xx׏x׏xx׏xUxxxx׏x׏x޼xxx᭭2Txx+xxxxxxxxx׏x׏x׏xxxx׏xץx+׏xxxUxxxx+xxxxxx׏x޼x޼xx׏xx׏x׏xx׏x޼xxxxxxx׏x׏xx׏x޼xxxx(᭭2T(xxUxxxxxxUxx׏x׏xץx׏x׏x޼xxxxxUxxxxxxxUxҪx䏀޼x׏xxץxUxxxUxץx᭭2Txxץxxxxxxxxxxxx׏x׏xxxxxxxxxxxxxxxxxxxxxxxxxxץxxxxxxxxxxxxxxxx׏xxxxx׏xxxxxxxxxxxxxxxxx׏xxxxxxxxxxxxx(᭭2T(xxץxxץxxxxxxx׏x׏xxxxxxxxxxxxxxxxxxxxxxxxxxץxxץxxxxxxxxxxx׏xxxxxץxxxxxxxxxxxxxxxxx׏xxxxxxxxxxxxx᭭Jff""""""""Txxxxx+xxxxxxx׏x׏xxxxx׏xxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxxxx׏x+׏xxxxxxxxxxxxxxxxxxxxxxxxxxxx(᭭VVz(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx((xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(((((((((((((((((((((((((((((((((((((((((((((((((((((((xP(PxPx((PxxP((Px+UPx(x((xPxx((PxPP(P(PPPx(P(Px(xP(((PxPP(Pxx((x(Px(PxPPPPPP(xP(((PxPP(Pxx((x(Px(PxPx(x((xPP(xP(((PxPP(Pxx((x(Px(PxPPU+(PxPPxP(PP(x(xPPPx(Px(xP(Px((PxPx(x((x(Px(PxPPxP((Px(Px(xx(xx(xx((PxPx(x((x(Px(PxPPxP((Px(Px(PxPPxP((xx(Px(x((x(Px(PxPPxP((Px(Px(xx(U+(PxxP(PPxx(((Px(xPxP((Px(xPxP((PxxP(((xx(Px(PxxP(PP(Px(Px(xP(xȠP(PxxP(((xx(Px(PxxP(PP(Px(Px(PxxP(PPxP(xP(((xx(Px(PxxP(PP(Px(Px(xP+++U+++UԀ+UԀ+UԀUU+UԀU++UԀ+UԀ+UԀ+++U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUU(PxxP(PPxx(((PxxP(((xx(PxPPx(P(PxP(x(Px(PxxP(PP(Px(Pxx(x(x(P(PxP(x(Px(PxxP(PP(Px(Px(PxxP(PPxP(P(x(Px(PxxP(PP(Px(Pxx(x(UUU+Ԁ++Ԁ+UԀ+UԀ+Ԁ++UԀUU++Ԁ+UԀ+UԀUUUԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ+(PxPPx((xPP(x(xxx(((xPPx(x((x(PxPx(Px((Px(Px(PxPPx((xPPPPPP(xP(Px(Px(Px(PxPPx((xPPPP(PxPPx((x(xx((Px(Px(PxPPx((xPPPPPP+UU+++Ԁ+UԀ+UԀ+U+UԀ+++UԀ+UԀ+UԀ+UU++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++U(Pxx(Px(xx((PxxP(((xx(Pxx(x(x(P(P(PPPPPPP(Pxx(P(PPxxx((xPPx(PPPPPP(Pxx(P(PPxxx((Pxx(P(xPPPPP(Pxx(P(PPxxx((xPU+U+Ԁ+UԀ+UԀ+Ԁ++UԀ+++UԀ+UԀ+UԀU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ+(Px(xPxP((PxPx((Px(Px(Px(Px+++UԀ+UԀ+UԀUU+UԀUU++ԀUUUU+++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UU(PxP(x(xx((PxxP(xx(Px(Px(Px(PxU+UU+UԀ+UԀ+U+UԀ+++UԀ+UUԀ+U++U+U+UUU+UԀUԀ++UԀ+UUUUU+U+U(PxPx(x((xPPx((x(Pxx((x+U+UԀ+UԀ+U+UԀ+UԀ+UԀ+U+UԀ+UԀ+U+UԀUU+UԀ+++UԀ+UԀ++Ԁ++++ԀU+++Ԁ*U*UU**UU**U*U*U*U*UUUUU*U***UUU*U***U*UU***UU*U***UUU*U***U*U***U***U*U*UUU*UU**U*U*U***U*UUU*U*U*UUU*U***UUU*U*U*U*U*U*U*UUU*U*U*UU****UU****U*UUUU**U*U*UUUU***U****U*UUUU**U*UUUU****U*U***UUU***U*UUUU**U*U*U*U*U**U****UU**U*UU**UU*U**U*U*UU**ԪU*UU****U*UU*UU*U*U*UU*UUU*U****U*UU*UU*U*U*UU****U*U*U*U***U*U*U*UU**U*U*U*U*UU*U****UU**U*UU**U*U*U*U*U*U*U*U*UU**U*UU*UU*U*U*UU*UUU*U**U*UU*UU*U*UU*U**U*U***U***U*U*UU**U*U*U*U*U*UU*U**U*U*U*U*U*U*UUUUU*U*U*UU**U*U*U*U*UUU**UUUU*UUU*****U*U*UUU**UUUU***U*U*UUU*UUU**UUUU***UU*U**U*U*U*U***U*U*UU*U**UU**UU****U*U*U*UU*UUUUUU*U*U*UU**U*U*UUUUU*U*U*UU*U*UU*U*U*U*U***U*UU*U**U*U*UUU*UU**U*UUUUU*U*U*U*U*U*U***U*UU**U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*UU**U*U*U*U*U*U*U*U*UUU*U*U*U*UU****UUU***U*****U*U******U****U*U*U aV  HwX ++Ԁ %Xksb+UԀ++ԀUUUԀ+Cxe #+UԀU++UԀ+Ԁ++UԀ-.fvh#(+UԀU+++Ԁ+ԪU+UԀ 6~je #+UԀUU+Ԁ++U+UԀ>>000̿jbV000<<>>DDDIIIRRR\\\\\\[[[YYYWWWSSSOOOEEEJJJDDDDDDCCCBBBBBBEEEHHH===)))+++,,,---...222UUUTTTRRRRRRPPPOOOLLLDDD̿jbV555>>>DDDIIIUUUZZZYYYYYYXXXVVVTTTSSSPPP999EEECCCBBBAAABBBEEEIIIMMMBBB,,,///111222333777[[[ZZZXXXUUUSSSRRROOOKKK***̿jbV:::===DDDHHHTTTWWWVVVVVVTTTTTTVVVWWWTTTNNNOOOCCCBBBAAAAAAEEEJJJNNNSSSGGG111444666777888<<>>DDDFFFVVVQQQMMMKKKNNNSSSZZZaaahhhnnnqqq]]]BBBBBBCCCIIIQQQZZZdddnnnvvvjjjNNNTTTXXXYYYYYY[[[{{{sssjjjccc[[[UUUQQQDDD̿jbV;;;AAAFFFFFFUUUOOOKKKKKKOOOWWWaaakkkttt{{{}}}gggBBBDDDHHHQQQ[[[fffqqq}}}zzz^^^dddhhhiiiiiikkk~~~tttjjjcccZZZRRRLLL̿jbV999>>>DDDFFFEEEVVVOOOLLLNNNTTT]]]hhhttt~~~nnnEEEJJJOOOZZZaaammmyyykkkrrrwwwyyyyyyzzzwwwqqqhhh```YYYNNN̿jbV;;;AAADDDDDD@@@BBBQQQOOORRRZZZeeeqqq}}}{{{KKKNNNUUUaaaeeeEEELLLWWWbbblllvvv}}}{{{pppcccTTTaaayyynnneee]]]UUU̿jbV888===BBBDDDBBB===<<>>888444RRRZZZ```iiitttnnnFFFJJJCCCVVVWWW___oookkkmmmxxx~~~wwwlllbbbCCC̿jbV;;;@@@BBB@@@888000---222VVVGGGVVV```DDDSSSFFFKKKOOOKKK]]]ZZZaaarrr{{{{{{zzznnnggg̿jbV888<<>>CCCGGGKKKOOOTTTWWWlll]]]bbbtttǾ|||pppiii̿jbV888===@@@???999666222333444777:::===BBBEEEJJJOOOTTTZZZ___YYYdddbbbsssȾ{{{pppMMM̿jbV888===?????????===111333555999<<>>DDDJJJQQQXXX```hhhqqq{{{lllZZZKKK@@@@@@̿*U***U*U*U*U*****U***U***U***U*U*UUU*UU**U*U*U***U*UUU*U*U*UUU*U***UUU*UjbVBBBJJJ999777333222333???>>>@@@FFFMMMTTT\\\dddmmmwwwxxxaaaPPPEEEBBB̿*U*UU**U*UU*******UUU*U***UUU****U*U***UUU***U*UUUU**U*U*U*U*U**U****UU*jbVCCCHHHEEE555222222333JJJ===AAAHHHOOOWWW```gggqqq{{{~~~gggUUUJJJDDD̿*U**U**U*UU****UU*Ԫ**U****UU****U*U*U*U***U*U*U*UU**U*U*U*U*UU*U****UU*jbVGGGEEEGGG666333222<<>>???===;;;===???GGGTTTXXXTTTTTT^^^fffnnnvvvvvvbbbTTT̿*UU**U*UU**UUU*UU*UUU*UU*U*U*U*U***U*UU*U**U*U*UUU*UU**U*UUUUU*UjbVAAA<<<;;;999:::===DDDNNN\\\oooZZZ^^^fffooovvv{{{hhhYYY̿*U*U*U*U*U*U*U*U*UjbV::::::888999<<>>999:::<<>>AAAGGGLLLVVVbbbooo|||xxxYYY̿jbVDDD>>>BBBGGGNNNVVVcccrrr~~~zzz̿jbVDDDAAAHHHNNNWWWfffqqqhhhzzzppp̿jbVEEEFFFMMMWWWfff]]]RRRdddqqqvvv{{{|||www̿jbVMMMLLLVVVbbbTTTNNNUUUpppkkkpppuuu|||̿jbVWWWQQQ^^^jjjgggeeegggxxxiii{{{||||||www̿jbV\\\bbboooiii|||yyywwwttt̿jbVdddgggqqqkkksssmmmmmmnnnnnnlll̿jbVddddddmmmfffdddeeeeeedddnnn̿jbV̏pppqqqggg```dddfff̿jbV̿jbV̿jbV̿jbV̿jbVjbVjbVjbVjbVjbVjbVjbVjbV̿jbV̿jbV̿jbV̿jbV̿jbVVVVmmmbbbQQQBBB999333---(((̿jbV>>>kkkyyyuuurrrfff```]]][[[XXXTTTQQQNNNKKKFFFAAA<<<666111,,,̿jbV888NNN^^^hhhbbb```WWWccceee___\\\WWWRRRMMMKKKJJJLLLNNNQQQTTTUUUTTTSSSPPPNNNJJJEEE@@@:::555222̿jbV000HHHKKK\\\cccfffAAAcccqqqlllnnnnnnmmmkkkhhhaaa\\\VVVQQQNNNLLLLLLLLLNNNPPPRRRTTTTTTUUUTTTWWWZZZ̿jbV&&&???EEEKKK\\\eeeggg===bbbqqqlllmmmoooppppppppppppooommmkkkhhhddd```\\\XXXUUURRRPPPNNNNNNOOORRRTTT̿jbV,,,>>>EEEKKK\\\eeehhh>>>aaannnfffeeeeeeeeeeeeeeeeeedddcccbbbaaa___^^^]]][[[ZZZXXXVVVUUUSSSPPPOOOPPP̿jbV,,,>>>EEEKKK]]]fffhhh???ZZZeee^^^```bbbcccdddeeeeeedddcccbbbaaa___^^^\\\[[[YYYWWWVVVTTTSSSQQQNNNMMM̿jbV555<<>>>>>IIIMMMbbbqqqvvvHHHqqqqqqpppooonnnnnnmmmmmmnnnooopppqqqtttvvvsssmmmhhhZZZNNNNNN̿jbV777@@@IIIMMMggguuuvvvGGGcccMMMNNN̿jbV666@@@IIIMMMrrrPPPbbbMMMNNN̿jbV777@@@IIIMMMrrr[[[fffNNNNNN̿jbV???IIIMMMrrrYYYzzzsssmmmgggVVVNNNNNN̿jbVAAAIIIMMMtttZZZ}}}zzzwwwtttooojjjgggeeecccccceeefffggg̿jbVIIIMMMxxx}}}\\\}}}zzzwwwsssrrrqqqppppppqqqqqqrrrrrrrrrrrrrrrpppooo̿jbVNNN|||yyyuuurrrqqqqqq̿jbV}}}̿jbVvvv̿jbV̿jbV̿jbV̿jbVjbVjbVjbVjbVjbVjbVjbVjbV᭭jbV᭭jbVc%h'i(i(i(i(i(i'᭭jbVX!h'i'i'j'j'k'k&k&l&l%k$᭭jbVN{{aaaaaaN{{g$m&l%m%m%n%o%o$p%p#p#q#q#r#m ᭭jbVԪo$q$p#q#q#r#s$qt#ru#u!u!v!v!w!x ᭭jbVN{{N{{t"s"t"u!u!u!x% mjoy!wz zz{{{᭭jbVԪ+UԀU+UU+UԀU++UԀ+++++UԀ++ԀUU+UԀUԀ+U+ԀUU+UԀUԀ++ԪU+UԀUԀ+UUUU+UԀUԀ++ԪU+UԀU++UԀUԀ++UԀ+Ԁ+UU++UԀ++ԪUw w x y yy|" tGMЯx~~᭭jbVaa+UԀ+Ԁ+UU+UԀUԀ++UԀU+UUU+UU+UԀ++ԀUU+UԀ+UԀ+UԀUUԀ+Ԁ++UԀU++U+UԀ+UԀԀ+Ԁ+UUUԀ++UԀU++U+UԀUԀ++UԀ+UԀ+UԀ+UԀUUUUU++U{||}}{/5Ó{ ᭭jbVmmmmmmmmmmmmmmmmmmN{{+UԀUUUU+UԀ++++Ԫ+UԀ++ԀU+++ԀU++UԀ+U+UԀUU+UԀ+UԀ+UԀU++ԪU+UԀUU+UԀ+UԀ+ԪU+UU++UԀUU+UԀ++++Ԫ+UԀ+UԀ+UԀ+Ԁ+UU+UUU!qu ᭭jbVN{{ԑ+U++ԀUU+UԀ++UU+UԀ+UԀ+UԀ+U+UԀ+UԀ+UԀUU+UԀUU+UԀ+UԀ+UԀ++Ԁ+U+UԀ+Ԁ++ԪU+UԀ+UԀ+UU+++Ԁ+UԀ+Ԁ++ԪU+UԀ++UU+UԀ+UԀ+UԀU+UUU++Ԁ++ԪU׶SW ᭭jbVmmmaaUUUU+UԀUU+++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUU+UԀUU+UԀ+U+U+UԀ++++Ԁ+UԀUU+U+++UUU++++Ԁ+UԀUU+++UԀUUUUUU++++++Ԁ ə8< ᭭jbVԪ+UU+UU+UԀUU++Ԁ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUԀ++UԀUU+UԀ+UԀ+UԀ+UUԀ++UԀ++Ԁ+++UԀ+UԀUԀ+U+++Ԁ+UԀ++Ԁ+++UԀUU++Ԁ+UԀ+UԀ+UԀU+ԪUUU+++Ԁ++wzԧ!vxKN!%    ᭭jbVmmmN{{+UԀ+ԪUUU+U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀ+UԀ+U+++UԀUU+UԀ+UԀ+UԀU+U++UԀ+Ԁ++Ԁ++UԀ+UԀU++UU++UԀ+Ԁ++Ԁ++U+UUԀ+UUU+UԀ+UԀ+UԀ+UԀUU+U+Ԁ++Ԁ+ \_̑ɅBE    ᭭jbVaa+UԀUԀ++UUUU+U+++ԀU+Ԁ+UԀ+UԀ+UԀ+UԀ+U++U+UԀUU+UԀ+UԀ+UԀUUU++UԀU++++UԀ+UԀ+UԀU+U+Ԁ+Ԁ++UԀU++++UԀ+U+++ԀU+Ԁ+UԀ+UԀUUUU+UU++++UԀ su ʁ'*eg  ᭭jbVmmmN{{+UԀ+UUUUU++Ԁ+UԀ+UԀ+UԀ+UԀUU+UԀUUU+UUUԀ+UUUԀ+UUU+UUUUUԀ+UԀ+UUUU++ԀUUUUUU++UU   :=[] ̀!no    ᭭jbVN{{N{{      ~       ᭭jbVmmmN{{   }~  ᭭jbV       {| ᭭jbVmmmᏏ~᭭jbVᣣ ڄHH᭭jbVᚚȝ᭭jbV᧧֨᭭jbVUU᪪՟᭭jbV㑑2^^RjjUUᠠͥtt11^^ŵ᭭*UjbV㑑2TUԀ++ԪUUUUU+UԀ+U+UU+UUU+UԀUU+U+++UԀ+U+UUU+UԀ+UUU+U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUUዋġءՌՉٙ᭭U*jbV푑2TU++U+Ԁ++UԀ+UԀU++U+UUԀ++UU+Ԁ+Ԁ+U+Ԁ++ԀUԀ+U++UԀUԀ++Ԁ+UԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ+ᩩ᭭U*jbVcKcKcKcKcK푑mmmmmmmmm2TUUU++UԀ+UԀ+Ԁ++Ԁ+U++UԀ+UԀ+UU+++Ԁ+UԀ+U+UԀU+U+U++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++UẺ᭭U****U***UU**U*U***U***U***U*U*UUU*UU**U*U*U***U*UUU*U*U*UUU*U***UUU*UjbV2T+Ԁ++ԪUU++UԀ+UԀUU+UԀ+U+UԀ+UԀ+Ԁ+U+Ԁ+UԀUU+UԀ+UU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ+ᙙƿ᭭*UUUU*U***UU**U***UUU****U*U***UUU***U*UUUU**U*U*U*U*U**U****UU*jbV2T++++Ԁ+Ԁ++UԀ+UԀUUUU+UԀUԀ++UԀ+UԀUU+UԀU+Ԁ++Ԁ+UԀ+UԀUԀ++Ԁ++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UUᢢ{}{᭭*UU*UUU******UU****UU****U*U*U*U***U*U*U*UU**U*U*U*U*UU*U****UU*jbV2T++Ԁ+++UUU+UԀ+UU+Ԁ+U+UԀ+UԀ+UUU+U+Ԁ++UԀ+U+U+U+U+UUU+UԀUԀ++UԀ+UUUUU+U+Uᦦ׹᭭*UU*UUU****UU*U*U**U*U***U***U*U*UU**U*U*U*U*U*UU*U**U*UjbV2T+Ԁ++Ԁ++UԀ+UԀ+UԀ+UԀ+UԀ+UԀᦦտ᭭*UUU***UUU***U***U*U*UUU*UUU**UUUU***UU*U**U*U*U*U***U*U*UU*jbV2TU++++UԀ+UԀ+UԀ+UԀ+UԀUU+UԀᢢʰᘘprp᭭*U*UUU***UUUU*UU*U*U*U*U***U*UU*U**U*U*UUU*UU**U*UUUUU*UjbVmmmJff""""""""TUU++Ԁ+UԀ+UԀ++ԀU+++ԀᘘϲỻϽ᭭*U*U*U*U*U*U*U*U*UjbVVVz᷷Ɲᦦ}~᭭*U*U*U*U*U*U*UUU*UjbVmmmᦦĘᢢٱ᭭*U*U***U*U******U***jbVẺȥ᭭᭭jbVmmm᜜οᚚ᭭jbVᤤ°Ѱ᭭jbVᢢγ᭭jbV+UḸ᭭jbVU+ṹ᭭jbV㑑2^^RjjU+᭭jbV㑑2T+++U+++UԀ+UԀ+UԀUU+UԀU++UԀ+UԀ+UԀ+++U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUU᭭jbV푑2TUUU+Ԁ++Ԁ+UԀ+UԀ+Ԁ++UԀUU++Ԁ+UԀ+UԀUUUԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ+᭭jbVcKcKcKcKcK푑mmmmmmmmm2T+UU+++Ԁ+UԀ+UԀ+U+UԀ+++UԀ+UԀ+UԀ+UU++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++U᭭jbV2TU+U+Ԁ+UԀ+UԀ+Ԁ++UԀ+++UԀ+UԀ+UԀU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ+᭭jbV2T+++UԀ+UԀ+UԀUU+UԀUU++ԀUUUU+++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UU᭭jbV2TU+UU+UԀ+UԀ+U+UԀ+++UԀ+UUԀ+U++U+U+UUU+UԀUԀ++UԀ+UUUUU+U+U᭭jbV2T+U+UԀ+UԀ+U+UԀ+UԀ+UԀ᭭jbV2T+U+UԀ+UԀ+U+UԀUU+UԀ᭭jbVJff""""""""T+++UԀ+UԀ++Ԁ++++ԀU+++Ԁ᭭jbVVVzjbVjbVjbVjbVjbVjbVjbVjbV(xP(PxjbVPx((PxjbVxP((Px+UjbVPx(x((xPxx((PxPP(P(PPPx(P(Px(xP(((PxPP(Pxx((x(Px(PxPPPPPP(xP(((PxPP(Pxx((x(Px(PxPx(x((xPP(xP(((PxPP(Pxx((x(Px(PxPPU+jbV(PxPPxP(PP(x(xPPPx(Px(xP(Px((PxPx(x((x(Px(PxPPxP((Px(Px(xx(xx(xx((PxPx(x((x(Px(PxPPxP((Px(Px(PxPPxP((xx(Px(x((x(Px(PxPPxP((Px(Px(xx(U+jbV(PxxP(PPxx(((Px(xPxP((Px(xPxP((PxxP(((xx(Px(PxxP(PP(Px(Px(xP(xȠP(PxxP(((xx(Px(PxxP(PP(Px(Px(PxxP(PPxP(xP(((xx(Px(PxxP(PP(Px(Px(xP+++U+++UԀ+UԀ+UԀUU+UԀU++UԀ+UԀ+UԀ+++U+UԀUU+UԀ+UԀ+UԀUU+U+++UԀUU+UUUjbV(PxxP(PPxx(((PxxP(((xx(PxPPx(P(PxP(x(Px(PxxP(PP(Px(Pxx(x(x(P(PxP(x(Px(PxxP(PP(Px(Px(PxxP(PPxP(P(x(Px(PxxP(PP(Px(Pxx(x(UUU+Ԁ++Ԁ+UԀ+UԀ+Ԁ++UԀUU++Ԁ+UԀ+UԀUUUԀ++UԀ+UԀ+UԀ+UԀ+UԀ+Ԁ+U+Ԁ++Ԁ+UԀUԀ++Ԁ+jbV(PxPPx((xPP(x(xxx(((xPPx(x((x(PxPx(Px((Px(Px(PxPPx((xPPPPPP(xP(Px(Px(Px(PxPPx((xPPPP(PxPPx((x(xx((Px(Px(PxPPx((xPPPPPP+UU+++Ԁ+UԀ+UԀ+U+UԀ+++UԀ+UԀ+UԀ+UU++UԀ+UԀ+UԀ+UԀ+UԀU+U+++Ԁ+UԀU++UjbV(Pxx(Px(xx((PxxP(((xx(Pxx(x(x(P(P(PPPPPPP(Pxx(P(PPxxx((xPPx(PPPPPP(Pxx(P(PPxxx((Pxx(P(xPPPPP(Pxx(P(PPxxx((xPU+U+Ԁ+UԀ+UԀ+Ԁ++UԀ+++UԀ+UԀ+UԀU++U+UԀ+UԀ+UԀ+UԀ+UԀU+U+Ԁ+UԀ+U+Ԁ+jbV(Px(xPxP((PxPx((Px(Px(Px(Px+++UԀ+UԀ+UԀUU+UԀUU++ԀUUUU+++UԀUԀ+UԀ++UԀ+UԀ+UԀ+UԀ+Ԁ++UԀ+UԀ+UԀUԀ+UUjbV(PxP(x(xx((PxxP(xx(Px(Px(Px(PxU+UU+UԀ+UԀ+U+UԀ+++UԀ+UUԀ+U++U+U+UUU+UԀUԀ++UԀ+UUUUU+U+UjbV(PxPx(x((xPPx((x(Pxx((x+U+UԀ+UԀ+U+UԀ+UԀ+UԀjbV+U+UԀ+UԀ+U+UԀUU+UԀjbV+++UԀ+UԀ++Ԁ++++ԀU+++ԀjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVmmmmmmmmmmjbVmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmεmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmjbVmmjbVmmmmmmmmmmmΝmmmmmmmmmΝmmmmmΝmmmmmmmmmmΝmmmmmmmmmmmmmmmmmmmmmm浅mmmmmmmmmmmmmmmΝmmmmmmmmmΝmmmmmmmmmmmmmmmmmmmmmmmmmmm浝mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmΝmmmmmmΝmmmmmmmmmmmmΝmmmmmmmmmΝmmmmmmmmmΝmmmmmmmmmmmΝmmmmmmmmmΝjbVmmmmm浅m浅mmmmmmmΝmmmmmmΝmm浅mmmmmmΝmmmmmmΝεmmmm浅mmmΝmmmmmmmΝεmm浅mmmmmm浅mmmmm浅mmmm浅mmm浅mjbVmmm浵mΝmmmmm浵mmΝmmmmmΝmmmm浵mmΝmmmΝmmmmmmΝm浵mmmmΝmmmmmm浵mmmmmm浵mmmmΝjbVmmm浵mmmmmmmmmmmΝmmmΝmmmmmmmmmmm浵mmΝmmmmmΝmmmmmmmmmmm浵mmΝmmmmmmmmmmmmm浵mm浅m浵mmmmmmmmmmmmmmmΝmmmmmm浵mmmmmmmmmmmmmmmmmmmmmΝmmm浵mmmmmmmmmmmΝmmmmΝjbVmmmmmmmmmmmΝmmm浅mmmmΝmmmmmmΝmmmΝmmmmmmΝmm浅mmmmmΝmmmΝmmmmmm浝ΝmmmmΝmmmmΝmmmm浅mm浅mmmmm浅mmm浅mmmmmmmmmmmmmmmmmmmm浅mmmmmjbVmmmmmmmmmmmm浅mmmmmmmmΝmmmmmmmmΝmmmmmmmmmΝmmmmmmmmmmΝmmmmmmm浅mmmmmmmmmΝmmmmmmmΝmmmmmmmΝmmmmmmmmmΝmmmmmmmmmmΝmmmmmmm浅mmmmmmmmΝmmmmmmmmmmΝmmmmmmmmmmmmmm浅mmmmmmmmmmmmmmmmmmmmmΝmmmmmmmmmm浅mmmmmmmmΝmmmmmmmΝmmmmmmmmmΝmmmmmmmmmmmmmmmmmmmεmmmmm浅jbVmmmmmmmmΝmmmΝmmmmmmjbVmmmεmmmmmmΝεmmmmΝεmmmΝmmmmjbVmmmmmmmmmmm浅mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbV jbVaV  jbVHwX ++ԀjbV %Xksb+UԀ++ԀUUUԀ+jbVCxe #+UԀU++UԀ+Ԁ++UԀjbV-.fvh#(+UԀU+++Ԁ+ԪU+UԀjbV 6~je #+UԀUU+Ԁ++U+UԀjbV Viewing a Callsign Certificate's Properties

Viewing a Callsign Certificate's Properties

To View a Callsign Certificate's properties,
1. Start TQSL and select the Callsign Certificates tab, which lists your Callsign Certificates.
 
   
2. Click on the Callsign Certificate in question, and then click the Display the Callsign Certificate properties button; a Certificate Properties window will display the Certificate's properties:
  

 

tqsl-2.8.1/apps/help/tqslapp/certificatesecurity.htm0000644000175000017500000000252115003421124022636 0ustar rmurphyrmurphy Maintaining Callsign Certificate Security

Maintaining Callsign Certificate Security

The Callsign Certificate that the ARRL issues to an LoTW user authenticates contacts submitted by that user. A Callsign Certificate can optionally be passphrase-protected. LoTW users are expected to protect their Callsign Certificates so that contacts are not fabricated. Therefore, the ARRL strongly recommends that Callsign Certificates maintained on shared or public computers be passphrase-protected.

If a Callsign Certificate is discovered to have been compromised, all contacts submitted with that Callsign Certificate will be removed from LoTW, all confirmations generated by those contacts will be invalidated, and all award credit generated by those confirmations will be revoked. Users who allow their Callsign Certificates to be compromised, or who knowingly exploit compromised Callsign Certificates may lose their privileges of using LoTW and participating in ARRL-sponsored award programs.

If you know of compromised callsign certificates or other security violations, please alert LoTW staff via LoTW-help@arrl.org

tqsl-2.8.1/apps/help/tqslapp/certificatevalidity.htm0000644000175000017500000000500715003421124022616 0ustar rmurphyrmurphy Determining if a Callsign Certificate is Valid

Determining if a Callsign Certificate is Valid

When a Callsign Certificate is issued for a Callsign, any previous Callsign Certificate for that Callsign is rendered invalid. LoTW will reject QSOs digitally signed by an invalid Callsign Certificate.

Each Callsign Certificate has a unique serial number. LoTW maintains a list of your valid Callsign Certificates that includes the serial number for each. To verify that a Callsign Certificate in TQSL is valid, you can compare it's serial number with the serial number displayed by LoTW.

TQSL displays a Callisign Certificate's serial number when you direct it to display that Callsign Certificate's properties:

 

To display LoTW's list of valid Callsign Certificates

1. Log in to your LoTW Account
   
2. Click the Your Account tab
   
3.  In the Logbook Web Account Menu on the left, click the Your Certificates button; LotW will display your Callsign Certificates, with the serial number for each: 
   
 

If the serial number displayed in TQSL matches the serial number displayed by LoTW, the Callsign Certificate in TQSL is valid.

tqsl-2.8.1/apps/help/tqslapp/certreplace.htm0000644000175000017500000002436215003421124021064 0ustar rmurphyrmurphy Replacing an Expired Callsign Certificate

Replacing an Expired Callsign Certificate

If one of your Callsign Certificates expired before you renewed it, you can request a replacement using the procedure below. You can also use this procedure the obtain a replacement for a passphrase-protected Callsign Certificate whose passphrase you've forgotten.

These instructions assume that your Callsign Certificates reside in the folder C:\MyLoTWCertificates (if you've stored them in a different folder, adjust the instructions accordingly).

1.  Start TQSL; if you're not running the current version, you should upgrade before proceeding.
   
2.  Verify that the Callsign Certificate has expired by displaying its properties.
   
3.  If the Callsign Certificate has indeed expired, or if it's passphrase-protected and you've forgotton the passphrase, delete it.
   
4. Select the Callsign Certificate menu's Request New Callsign Certificate Request... command.
   
5. The Request a New Callsign Certificate dialog will appear:
 
  In this dialog,
    5.a Specify the callsign, DXCC entity, begin date, and end date
         5.a.1. Specify the callsign, without any portable identifiers
         5.a.2. Select the DXCC entity associated with the callsign
         5.a.3. Set the QSO begin date to the date of the first QSO made with the callsign
         5.a.4. For an active callsign, leave the QSO end date blank; for an inactive callsign, set the QSO end date to the date of the last QSO you made with this callsign 
         5.a.5. Click the Next button
    5.b Enter your name and address
         5.b.1. For US callsigns, the mailing address you enter must match your address in the FCC database
         5.b.2. Click the Next button
    5.c Enter your email address. Then click the Next button
    5.d You will be prompted to enter a passphrase
         5.d.1. If you're using a shared computer, you should protect your Callsign Certificate by entering the same passphrase in both textboxes; you'll be asked to provide this passphrase each time you direct TQSL to digitally sign a log file. If you control access to the computer you're using, you can leave both textboxes empty, thereby avoiding the need to provide a passphrase each time you direct TQSL to digitally sign a log file.
         5.d.2. Click the Next button
   5.eIf needed, TQSL will recommend the appropriate Callsign Certificate to validate your request:
      
      Click on the recommended Callsign Certificate, and then click the Finish button
    5.f If your computer has internet access, you will be asked if you want to upload this certificate request to LoTW; click the Yes button, and then select TQSL's Status Log tab to view results of the upload. If your computer does not have internet access,
         5.f.1. you will be prompted to save a file whose name is the callsign and whose extension is .tq5; save this .tq5 file in the folder C:\MyLotWCertificates
         5.f.2. this file will be referred to in these instructions as Callsign.tq5
    5.g Select the Callsign Certificates tab; an entry for your Callsign Certificate will be displayed with a pending icon:  (because the certificate is not yet functional).
    5.h If you did not upload the certificate request to LoTW in step 5.f, protect your pending Callsign Certificate, by directing TQSL to create a Backup File.
    5.i You can terminate TQSL by selecting its File menu's Exit command (on OS X, by selecting the Application menu's Quit tqsl command).
     
6. If you did not upload the Callsign.tq5 file to LoTW in step 5.f, move it to a computer with internet access, and upload it to the ARRL via https://lotw.arrl.org/lotwuser/upload ; use the Browse or Choose File button on this web page to navigate to the folder into which you saved the Callsign.tq5 file, and then click the Upload File button.


Make sure that your email address is correctly specified. Within 3 business days, you will receive an email message from the ARRL with your Callsign Certificate attached. 

If you do not receive an email message bearing your Callsign Certificate after 3 business days, do not submit another Callsign Certificate request; instead, send an email message to LoTW-help@arrl.org inquiring about the delayed response.

When you receive the emaill message with your Callsign Certificate attached, follow these instructions using the same computer you used for steps 1-6 above.

tqsl-2.8.1/apps/help/tqslapp/certreq.htm0000644000175000017500000002455415003421124020243 0ustar rmurphyrmurphy Requesting an Initial Callsign Certificate and LoTW Account Password

Requesting an Initial Callsign Certificate and LoTW Account Password

LoTW requires that you request your initial Callsign Certificate using the same computer with which you will accept your initial Callsign Certificate.

When you direct TQSL to request a Callsign Certificate, it generates a public key and private key pair, sends the public key and your callsign to the ARRL, and saves the private key on your computer. LoTW responds by combining your callsign and public key into a Callsign Certificate that it sends you via email. A Callsign Certificate can only be used to submit QSOs if the associated private key is present on your computer, so you should accept a Callsign Certificate using the same computer with which you requested it.

If you've already requested your initial Callsign Certificate but have not yet received a response, don't initiate another request; doing so will invalidate the Callsign Certificate you requested, which may be in process or in transit. If you're concerned with the delay in receiving a response to your initial Callsign Certificate request, send email to LoTW-help@arrl.org .

To request your Initial Callsign Certificate,
1.Create a folder in which to maintain your Callsign Certificates. In these instructions, the folder C:\MyLoTWCertificates will be assumed, but you can choose any folder that does not conflict with your operating system's policies.
   1.aOn Windows Vista, Windows 7, Windows 8, and Windows 10, using a folder within C:\Program Files or C:\Program Files (x86) would require starting TQSL with Run as Administrator, because these versions of Windows consider those two folders to be protected; thus it's best to choose or create a folder that resides elsewhere.
2.If you start TQSL before receiving your Initial Callsign Certificate from the ARRL, or if you have not installed a Callsign Certificate on the computer you're using, an Alert dialog will appear that informs you that you have no Callsign Certificate, and asks if you want to request one. Click the Yes button to request your Initial Callsign Certificate; if you have one or more Callign Certificates on another computer, you can copy them to the computer you're using.
 Alternatively, start TQSL, and select the Callsign Certificate menu's Request New Callsign Certificate Request... command.
3. The Request a New Callsign Certificate dialog will appear:
 
 
 In this dialog,
   3.aSpecify your callsign, DXCC entity, and begin date
       3.a.1.Specify your present primary callsign, without any portable identifiers
       3.a.2.Select your DXCC entity. If that entity does not appear in the list, click the Show All Entities checkbox to permit all DXCC enttities to appear in the selection list.
       3.a.3.Specify the date of the first QSO you made or will make with your present primary callsign
       3.a.4.Don't specify a date of the last QSO you made or will make -- leave the Y, M, and D selectors blank
       3.a.5.Click the Next button
   3.bEnter your name and address
       3.b.1.For US callsigns, the mailing address you enter must match your address in the FCC database
       3.b.2.Click the Next button
   3.cEnter your email address; then click the Next button
   3.dIf your computer has internet access, you will be asked if you want to upload this certificate request to LoTW; click the Yes button, and then select TQSL's Status Log tab to view results of the upload. If your computer does not have internet access,
       3.d.1.You will be prompted to save a file whose name is your callsign and whose extension is .tq5; save this YourCallsign.tq5 file in the folder C:\MyLotWCertificates
       3.d.2.This file will be referred to in these instructions as YourCallsign.tq5
   3.eSelect the Callsign Certificates tab; an entry for your Callsign Certificate will be displayed with a pending icon:  under the Certificates that are awaiting ARRL approvalheading (because the certificate is not yet functional).
   3.fIf you did not upload the certificate request to LoTW in step 4.e, protect your pending Callsign Certificate, by directing TQSL to create a Backup File.
   3.gYou can terminate TQSL by selecting its File menu's Exit command (on OS X, by selecting the Application menu's Quit tqsl command).
4.If you did not upload the YourCallsign.tq5 file to LoTW in step 3.d, move it to a computer with internet access, and upload it to the ARRL via https://lotw.arrl.org/lotwuser/upload; use the Browse or Choose File button to navigate to the folder C:\MyLotWCertificates and select the YourCallsign.tq5 file you find there.
5.If you are a US licensee, you will receive a post card in the mail
   5.aAbove your address on the front of the postcard, you will find your 8-character Postcard Validation Code
   5.bUsing your web browser, visit https://lotw.arrl.org/lotw/password
       5.b.1.Enter your callsign (the one you specified in step 4a.1 above)
       5.b.2.Enter your Postcard Validation Code
       5.b.3Click the Submit Password button
       5.b.4.Within 3 business days, you will receive an email message containing your LoTW Account Username and Password, with your Callsign Certificate attached
6.If you are not a US licensee, you will receive an email message asking you to submit proof of license (for example, a copy of your license) and a copy of one other official document that shows your name (for example, a driver's license). For additional details, see https://lotw.arrl.org/lotw-help/authentication. After your documentation is reviewed and accepted, you will receive an email message containing your LoTW Account Username and Password, with your Callsign Certificate attached.

Note: Obtaining a Callsign Certificate for a callsign in certain DXCC entities also requires submission of a Landing Permit and/or Proof of Entry .

If you do not receive an email message bearing your Callsign Certificate after 3 business days, do not submit another Callsign Certificate request; instead, send an email message to LoTW-help@arrl.org inquiring about the delayed response.

tqsl-2.8.1/apps/help/tqslapp/certreq1.bmp0000644000175000017500000223715615003421124020320 0ustar rmurphyrmurphyBMn> 6(8> ¾Ĥÿ乷𹷵ÿ䥤Ƈօ烀~~~}}ͻͻͻ}}*T𣡞*T𣡞*T𣡞*T*T*T*T*T*TTTҪ*T***T****TT***T***T*T*TTT*T*T𣡞*T*TT**TT*T*循得徃得*T**T*TTTT*T**TTT****T*T**T**T𣡞*T*TT**T*T*TҪ徾Ҫ*T*T*TT*TT*T***TT****T*TT*T**T𣡞*T*T*T*T*TTTҗ徾得*TTT*T*TTT*T*TT*T**T*TT**T*T𣡞T**TT**TT***Ҫ得徃Ҫ*T*T*T*TT*TTTT*TTT***TTTTT***TT**T𣡞*T*T*T*T*T**ҪҪ҃ҪҪҪ*TT**T*T**T*TTTTT*TT*TT**T*T*T𣡞*T*T*T*T***T*TT**T*T𢠝*T*T*T*T**T*T*T*T*T𢠝*T*T*TҪTT*T***T𢠝𜚕𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𗔑hfd𢠝𢠝𠠠𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𜚕𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𜛘gec𣠝𣡞𣡞𣡞𘕒khf𣡞𣡞𣡞𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𢠝𣡞𣡞𣡞𝚖𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𢠝𜙗𜙗𜙗𜙗ywu𜙗𡞛𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𝚖𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𣡞𚘕}zxvsxvsΔΔΔxvs𔔔디𔔔디𔔔디xvs𤢟𤢟𤢟𤢟𤢟'Pw'PwP'w'PwP'w𤢟'Pwoooooo'PwPw''Pwoooooo'PwPPoooooo𤢟'Pwoooooo'Pw''wwww''Ǡ'Pwoooooo'PwwP'oooooo𤢟PPoooooo'Pwww''PP'Pwoooooo'Pw''wwoooooo𤢟PwwPw''oooooo'PwPPww'''Pwoooooo'Pw'wPoooooo𤢟ww'''wP'PwPP''ww'Pw'Pw'wP𤢟Pw'PP'P'PPw'PPP'Pw'PwwP'𤢟wP'''ww'P'''wP'w'PwPP𤢟Pw'PPPP'w'wPw'𤢟𤢟𞛗𤢟𤢟𔔔디𔔔디𔔔디𤢟ΔΔΔ𤢟𤢟𥣠𥣠𥣠𥣠𥣠'w'w'wP𥣠'wǠPww''Pw'PP𥣠ww''PPwP'''ww𥣠'ww'Pw'w'P'wP'''Pw'wPw'PPP'Pw'Pw'PwPPPww''Pw'wP'''PwPPw'P'P'PPP'Pw'wP'''Pw'Pw'Pw'Pw'ww''Pw'PwPP'Pw'Pw'PwPP'PwPPPPPP'Pw'Pw'PwPPw''wPPP'Pw'Pw'wP'wP'''Pw'Pw'PwPww''PwPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'Pw'PwPP𞛘''ww'PwPw'Pw'w''wwP''P'PPw''Pw'Pw'Pw'Pw'ww'PP'w'wPw'w''w'PwPw'Pw'wP''PwPw'w''w'Pw'Pw'PwPw''Pw'Pw'Pw'Pw'Pw'Pw'ww''Pw'ww''ww''Pw'Pw'Pw'PwwP''''PwPPwP''wPP'w'PwwP''P'PPw'w''w'Pw'PwPP'w'w'ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'Pw'Pwww''𞛘PP'PwwP'wP'''ww'ww''ww'wP''Pw'Pw'Pw'Pw'wPww'''PwwP'''ww'PwwP''Pw'wP'PwwP'''ww'Pw'PwP'''P'Pw'Pw'Pw'Pw'Pw'Pw'wP'Pw'wP'wP'Pw'Pw'Pw'Pw'ww''ww'wP'PP'Pw'Pw'Pw'ww''ww'wP'''ww'Pw'Pwww'''PwwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'PwPP𞛘PP'Pww'PP'wPPw'Pw'P'Pw'Pw'Pw'Pww'w'ww'''PwP'w'Pww'P'PwPP'PwP'w'Pw'Pw'P''w''Pw'Pw'Pw'Pw'Pw'Pww'w''Pww'w'w'w''Pw'Pw'Pw'PwPPw'PwP'PP'Pw'Pw'PwPPw'PP'w'Pw'Pwww'''PwwP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw''ww𞛘PP'Pw'PwPw''PwPPPP'PwPw''PwPw'PP'PwPPPP'w'w'Pw'Pw'PwPw'Pw'w''w'Pw'PwPPPP'Pw'wP'Pw'Pw'PwPw'PP'PwPP'PwPPPP'Pw'Pw'Pw'PwPPPPPPw''w'Pw'PwPw'PPPP'Pw'Pw'PwPP'w'w'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPP𞛘''ww'Pww'PPP'wPPw'w'PPP'Pww'w''Pw'wPw'ww''PwPPPPw'P'Pww'w''PwPP'PPwww''PwPP'PwPw'PP'Pww'w''Pw'wP'Pw'wP'wPPP'Pw'Pw'Pw'wPPw'w'P'Pw'Pw'P'PPP'wPPw'PP'Pw'Pww'ww''Pw'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'ww''𞛘'ww''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP𞛘ww''Ǡ'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw''ww𞛘'wǠP'Pw'Pww''w'Pw'Pw'Pw'Pww''wPw''Pww''ww''ww''w'Pw'Pw'Pww''w'Pw'Pw'Pww''wPw'𞛘🜙𦤡𦤡'w'w'wP'wP𦤡ww''Pw'Pw'𦤡w''wPPwP'wP'𦤡P'w'wP'''PwPPw'Pw''w'PwPP'Pw'Pww'P'Pw'wP'''PwPPPP'w'wPPPPPPw''wPPP'Pw'Pw'Pw'Pw'wP'''PwPww''Pww'Pw''w'Pww''ww''w'Pw'Pw'Pw'Pw'Pw'Pw'wP'''Pw'Pw'ww'w'PPPP'PwPP'Pw'Pw'PwPww''PwPP'Pw'Pw'PwPPPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPw'𦤡'PwPPPw'w''w'PwPw'PPwP''Pw'Pw'Pw'PwPw''PwPw'w''w'ww''PwPw''wPww'ww'PPPw'wP''''PwPPwP''wPP'w'Pw'Pw'PwPw'w''wPP'w'wPw'PPwP''Pw'w'''w''wPPPw''Pw'Pw'Pw'Pw'Pw'PwPw'w''w'PwPw'Pw''wPP'w'ww''Pw'Pw'PwPP'w'w'Pw'Pw'Pw'Pw'ww''ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPw'𦤡'PwwP'wP'''ww'PwwP'wP'PP'Pw'Pw'Pw'PwwP''PwwP'''ww'wP'PwwP'''ww'wǠP'wPwP''ww''ww'wP'PP'Pw'Pw'Pw'Pw'PwwP'''wwww'''PwwP'wP'PP'Pw''www'PP'wwǠw''Ǡ'Pw'Pw'Pw'Pw'Pw'PwwP'''wwP'''PwP''Pw'Pw'wP'Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pw'wPwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw𦤡'Pw''wwP'w'Pww'PwP'PP'Pw'Pw'Pw'Pww'P'PwP'ww'w''PwPP'ww'w'PwP'''wwPPw'PwP'PP'Pw'Pw'Pw'Pw'PwP'www'''Pww'PwP'PP'Pwww'''Pwww''''ww'Pw'Pw'Pw'Pw'Pw'PwP'w'P''w'w'P'Pw'Pww'w''Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pww'w'wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw𦤡'Pw'wP'Pw'Pw'PwPw'PPw''w'Pw'PwPw'PP'PwPw''Pw'PwPP'Pw'wǠP'ww''wPww'''wPPPPPPPw''w'Pw'PwPw'Pw'PP'PwPP'w'w'PwPw'PPw''wPw'PPP'''w''ww''Pw'Pw'PwPw'Pw'PP'Pw'Pw'wP'PwPw''Pw'PwPP'PwPPPPPP'w'w'PwPw'PP'PwPP'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPw'𦤡'Pw'wPPPPPw'Pw'PPw'PP'Pww'w'w'P'PwPP'wPPPPPPw'Pw'wP'''ww'wPPw'w'P'Pw'Pw'Pww'P'ww'PPw'ww''Pww'Pw'P'P'PPPPP'PwwP''Pw'Pw'Pw'Pww'P'ww'PP'PwPPw'P'Pw'Pw'wP'Pw'PPwww'w'ww''PwPP'Pww'w''Pw'wP'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'Pw'𦤡'PwwP''Pw'Pw'Pw'Pw'Pw'PwwP'''wwPw''wPwP''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𦤡'PwPP'PwPP'Pw'Pw'Pw'Pw'wPPPwP'wwP'w'ww''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𦣞Pw'Pw''Pw'Pw'wPPPPw''Pww''w'Pw'Pw'Pww''w'Pww''w'Pw'Pww''w𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𭪧𩦢gdb🜙𔒏urp𫩥~𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𭫧𮬨𮬨𮬨𧤟𮬨𮬨𮬨𮬨𮬨𮬨𮬨𮬨ΔΔΔ𮬨𔔔디𔔔디𔔔디𮬨𮬨𮬨𮬨xxxxxx(𮬨xxxxxx(𯭩xxxxxx(𯭩'PwUUUUUU++'PwP'w'Pw++P'wxxxxUx(𯭩'PwUUU+++Ԁ++oooooo'PwPw''Pw++oooooo'PwPPxxxxUx(oooooo𯭩'PwUUUU+UU+oooooo'Pw''wwww''Ǡ'PwU+oooooo'PwwP'xxxxUx(oooooo𯭩PPUU+++UUԀ+U++Ԁ+++oooooo'Pwww''PP'Pw+Ԁ+++oooooo'Pw''wwxxxxUx(oooooo𯭩PwwPw''UUUU+Ԁ+++Ԁ++Ԁ++oooooo'PwPPww'''Pw++Ԁ++oooooo'Pw'wPxxxxUx(oooooo𯭩ww'''wPUU+Ԁ++Ԁ+UԀ+U+++'PwPP''ww'PwU+++'Pw'wPxxxxUx(𯭩Pw'PPUU+Ԁ++Ԁ+UU+ԀU++'P'PPw'PPP'Pw+ԀU++'PwwP'xxxxUx(𯭩wP'''ww+UUUUU++UԀ+Ԁ+U+'P'''wP'wU+'PwPPxxUx(𯭩Pw'PPUUUԀ++U+Ԁ+PP'w'w+Ԁ+Pw'xxxUx(𯭩xxxxxx(𯭩xxxxxx(𯭩xxxxxx(𯭩𯭩𔔔디𔔔디𔔔디𯭩ΔΔΔ𯭩𯭩𯭩𯭩𯭩𨥠𯭩'w'w'wP'wP𯭩ww''Pw'Pw'𯭩w''wPPwP'wP'𯭩P'w'wP'''PwPPw'Pw''w'PwPP'Pw'Pww'P'Pw'Pw'PwPPPP'w'wPPPPPPw''wPPP'Pw'Pw'Pw'Pw'wP'''PwPww''Pww'Pw''w'Pww''ww''w'Pw'Pw'Pw'Pw'Pw'Pw'wP'''Pw'Pw'ww'w'PPPP'PwPP'Pw'Pw'PwPww''PwPP'Pw'Pw'PwPPPP'wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPw'𯭩'PwPPPw'w''w'PwPw'PPwP''Pw'Pw'Pw'PwPw''Pw'Pw'Pw'ww''PwPw''wPww'ww'PPPw'wP''''PwPPwP''wPP'w'Pw'Pw'PwPw'w''wPP'w'wPw'PPwP''Pw'w'''w''wPPPw''Pw'Pw'Pw'Pw'Pw'PwPw'w''w'PwPw'Pw''wPP'w'ww''Pw'Pw'PwPP'w'w'Pw'Pw'Pw'Pw'ww''ww'Pw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPw'𰮪'PwwP'wP'''ww'PwwP'wP'PP'Pw'Pw'Pw'PwwP''Pw'Pw'Pw'wP'PwwP'''ww'wǠP'wPwP''ww''ww'wP'PP'Pw'Pw'Pw'Pw'PwwP'''wwww'''PwwP'wP'PP'Pw''www'PP'wwǠw''Ǡ'Pw'Pw'Pw'Pw'Pw'PwwP'''wwP'''PwP''Pw'Pw'wP'Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pw'wPwP'wP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw𰮪'Pw''wwP'w'Pww'PwP'PP'Pw'Pw'Pw'Pww'P'Pw'Pw'Pww'w''PwPP'ww'w'PwP'''wwPPw'PwP'PP'Pw'Pw'Pw'Pw'PwP'www'''Pww'PwP'PP'Pwww'''Pwww''''ww'Pw'Pw'Pw'Pw'Pw'PwP'w'P''w'w'P'Pw'Pww'w''Pw'Pw'Pwww'''Pw'Pw'Pw'Pw'Pww'w'wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'Pw𰮪'Pw'wP'Pw'Pw'PwPw'PPw''w'Pw'PwPw'PP'PwPw''Pw'PwPw'PP'Pw'wǠP'ww''wPww'''wPPPPPPPw''w'Pw'PwPw'Pw'PP'PwPP'w'w'PwPw'PPw''wPw'PPP'''w''ww''Pw'Pw'PwPw'Pw'PP'Pw'Pw'wP'PwPw''Pw'PwPP'PwPPPPPP'w'w'PwPw'PP'PwPP'ww''Pw'Pw'PwPP'PwPP'w'wPPPPPw'𰮪'Pw'wPPPPPw'Pw'PPw'PP'Pww'w'w'PPw''Pw'P'PPP'wPPPPPPw'Pw'wP'''ww'wPPw'w'P'Pw'Pw'Pww'P'ww'PPw'ww''Pww'Pw'P'P'PPPPP'PwwP''Pw'Pw'Pw'Pww'P'ww'PP'PwPPw'P'Pw'Pw'wP'Pw'PPwww'w'ww''PwPP'Pww'w''Pw'wP'wPPP'Pw'Pw'wP'Pww'ww''Pw'PPwww'Pw'𰮪'PwwP''Pw'Pw'Pw'Pw'Pw'PwwP'''wwPw''wPwP''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𰮪'PwPP'PwPP'Pw'PwPP'Pw'wPPPwP'wwP'w'ww''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw𰮪Pw'Pw''PwPw'w''w'wPPPPw''Pww''w'Pw'Pw'Pww''w'Pww''w'Pw'Pww''w𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𰮪𱯫𱯫𱯫¼𱯫𱯫𱯫𱯫𱯫'w'w𱯫ww''𲰬PP***T**TT*TT*T*TT*TT**өT*TT*TTTT*TT**өT*TT**TT**T**TT**T**өT𲰬P'wPPPPw'w'w'w'w'P'Pw'PwPP'PwPPPPPw'T*TT*T**TT*T*T*TTT***TT**T*T*T**TTT**TT**T*TT**T*T*T*TTTTTT**T𲰬'PwPP''wwwP'PPwwPPwwPw''Pw'Pw'Pw'Pw'PwwP''''PwPw'**T**T*T*TTT*T*T*TT**өT*TTT*T*T*өT*TT**TTT*T****ө*T*T*T**TT*TTTnnnnnn𠠠jjjbbbbbbbbbbbbbbbbbbbbbjjj𫨣'PwwP'Pw''wP'wP'wPwP''Pw'Pw'Pw'Pw'Pw'ww''ww'*T*T*TTT*TTT*T*T*T***T*T***өT*T*T*TT****T***өT*T**TT*T*T*TT*TTT****өTnnnnnnҩꘘ𲰬'Pw''wwPPPPw'wP'wP'w'P'Pw'Pw'Pw'Pw'PwPPw'P*T*T*T*T*TTT*TTT*T*T*T*T*****TTT*T***TTT*****TTT***TTTTTTT******nnnnnnkkkkkkPP(Px(Pxx((xx((xx((xPx((xȠP(Px(PxPx((Px(PxPP(PxPP(Pxx(PPP𲰬'Pw'wP'Pwww''ww'''PwPw'PPPP'Pw'Pw'PwPPPPPw'*T*T*TT**TTT*T*T*T*TT**T*****T*TT*T****T*****TTT***T*T*TT*өTTT*****nnnnnnbbbbbbxx(xx((Px(PxPPxP((x(((x((xPPPx(Px((xP(Px(Px(Px(Px(Px(Px(Px(Px(PxPx((xx(𲰬'Pw'wP'w'''PwP'wP'w'P'PPwww'PP'PwPwP'wPPw'Pw'*T*T*T***TTT*T*T*TT*T**T*****T*TT**TT**T*****T*TT*TTT*T*T*T*TTT*T****bbbbbb(xȠP(Px(PxxP(PP((xxx(PP(xxȠx((PP(Px(Px(Px(Px(Px(Px(Px(Px(PxxP((xP𲰬'PwwP'ww''PP'wP'wP'Pw'Pw*T*T*T**T*TTT*T*T*TTTT**TT****T*T*TT*T****TT****T*T***T**T*TTTTT*TT****Tbbbbbbx(P(Px(PxxP(PPxx(((Pxxx((((xx(xx((xȠP(Px(Px(Px(Px(Px(Px(Px(Px(Pxx(Px(x(𲰬'PwPPPPww''w'Pwww'Pww'Pw'Pw*T*TTT*TTTT*TTT*TTT*TTT*TTTTT*T*TTTT**TTTTTT**TTbbbbbb(xPPx(PPPPx((xPPP(((x((xx(xx((((xx(Px(PxPPPPPP(Px(Px(Px(Px(PxPx(PP𲰬Pw'Pw'Pw''ww''ww'w''wbbbbbbPx((Pxx(x(x(PPP(PxxP(((xxxx(((Px(Px(Px(PPxxx(PP(PxPP(Pxx(P(xP𲰬bbbbbbPx((Px(xx((xx((Px(Px(Px(Px(Px𲰬bbbbbbxP(xx(PxxP((((Px(Px(Px(Px(Px(Px𲰬kkkkkkPP(PxPP(Px(PxPPx((xx((x𲰬ҟᘘ𲰬𩩩kkkbbbbbbbbbbbbbbbbbbbbbkkk𲰬𲰬~{x}{𝚗𣠜𕓏rol𘕒𳱭𳱭𳱭𳱭𳱭𳱭𳱭𳱭'wP𳱭Pw'𳱭wP'𳱭w'w''wP'''Pw'Pw'PwPP'PwPww''Pw'Pw'PwPw'+Ԁ+UUUԀ++ԪUUUUU+UԀ+UԀ𳱭PPwwPw'w''w'Pw'Pw'ww''PwPP'w'w'Pw'PwPw'++ԀUUU++UUUԀ+Ԁ++UԀ+UԀ𴲮'wPwP'''ww'Pw'Pw'wP'Pwww'''Pw'Pw'Pw+++UU+++ԀUUUU+ԪU+UԀ+UԀ𴲮wP'P'w'Pw'Pww'w''Pwww'''Pw'Pw'PwUUUU+Ԁ++Ԁ++Ԁ++ԪUUU+UUU+UԀ𴲮ww'''Pw'Pw'PwPP'PwPP'w'wPPPPPw'UU+U+UԀUU++++ԀUU+U+UԀ+Ԁ++UԀ𭪥wP'PP'Pw'Pw'wP'Pww'ww''Pw'PPwww'Pw'++Ԁ++ԀUUUU++Ԁ++UUUԀ++UԀ+UԀ+UԀ𴲮'wP'Pw'Pw+++ԀUU+++Ԁ+Ԁ++Ԁ+UUU++UԀ+UԀ+UԀ𴲮w'Pww'Pw'PwUU+Ԁ++Ԁ+U++++UԀ+UUUUU++UԀ+Ԁ++UԀ𴲮'ww''Pw'Pww''wUU+UԀUUUUUUUUU+ԀUԀ+𴲮𴲮𵳯𵳯𵳯𵳯𵳯𵳯𵳯𵳯𵳯𨥢𗔑𝚗𰭪𵳯𵳯𵳯𵳯𶴰𶴰𶴰𶴰𶴰𶴰𶴰󶴰󶴰󶴰󶴰󶴰DDD󃃃󯬦DDD󶴰DDD󃃃󶴰!!!󟟟󃃃󟟟DDDDDD󟟟ddd󟟟󟟟ddd!!!!!!!!!󃃃󺺺󟟟󃃃dddDDD󟟟ddd󃃃!!!󃃃ddd󃃃󃃃!!!!!!󟟟DDD!!!󺺺DDDDDDddd!!!dddddd󃃃$#"󶶵#"!󶴰!!!!!!󺺺!!!󟟟!!!󺺺DDDDDD󃃃!!!!!!!!!Ӻ󟟟DDD󃃃DDD󃃃ddd!!!dddDDD󟟟ddd󃃃!!!ӃDDD!!!ddd󃃃󃃃ӃDDD!!!󃃃󺺺DDDDDDDDD󃃃!!!!!!󺺺󶶵󶶵󶴰!!!󟟟DDD󃃃󺺺dddDDD󟟟ddd󺺺ddd󟟟dddDDD!!!!!!!!!Ӄddd!!!!!!ddd!!!󺺺DDD󟟟ddd󃃃!!!󃃃!!!󟟟ddd󃃃󃃃󃃃ddd󟟟dddDDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃󶶵󶶵󶴰!!!󃃃DDDDDDDDD󟟟!!!!!!DDD󟟟dddDDD!!!!!!!!!ӃDDDdddDDD!!!󺺺DDD!!!DDD󟟟ddd󃃃ddd󃃃!!!󟟟ddd󃃃󃃃DDD󟟟!!!DDD󺺺DDD󃃃󺺺DDDDDDDDDDDD!!!󃃃DDD󶶵󷵱!!!DDD󺺺DDD󟟟󺺺!!!󺺺ddd!!!󟟟ddd!!!!!!DDD󺺺DDD󟟟ddd󟟟!!!ddd󺺺ddd󺺺DDD󟟟ddd󃃃!!!󃃃dddddd!!!ddd󃃃DDDDDD!!!󺺺dddDDDDDD󺺺DDD󃃃󺺺DDDDDD!!!󺺺DDD󟟟󶶵󷵱!!!󺺺!!!󟟟!!!󺺺DDDDDD󺺺󃃃ddd󺺺!!!󟟟!!!ddd󟟟ddd󺺺DDD󟟟󟟟ddd󃃃󺺺!!!󃃃!!!ddd󃃃!!!!!!DDD󺺺DDDzzzDDDddd󟟟!!!󶶵󷵱!!!DDD󟟟ddd!!!󟟟ddd󃃃󟟟ddd󺺺DDD󺺺DDD󶶵󷵱!!!󟟟ddd󺺺ddd󟟟ddd󃃃DDDdddӃ󺺺DDD!!!󶶵󶶵󷵱!!!󟟟ddd󃃃dddDDDddddddDDDddd!!!󶶵󶶵󷵱#"!󶶵$#"󸶲춲nkhᳰqli󕓑okhpkgþ}zzwt{w̖ܷ˧tqsl-2.8.1/apps/help/tqslapp/certs-icons.htm0000644000175000017500000000147615003421124021025 0ustar rmurphyrmurphyTQSL Callsign Certificate Icons

TQSL Callsign Certificate Icons

Callsign Certificates can be in one of four states, each designated by an icon:

IconCallsign Certificate State
 Pending
 Valid
 Replaced
 Expired
 Broken
tqsl-2.8.1/apps/help/tqslapp/cmdline.htm0000644000175000017500000003715215003421124020207 0ustar rmurphyrmurphyTQSL Command Line Interface

Command Line Interface

When starting TQSL, you may specify command line options that

Most command line options are single-letter switches, some of which require an argument; such arguments should be separated from the switch letter by one or more spaces. Arguments that contain spaces or other shell-special characters should be quoted in a manner suitable for the operating system and shell that's being used. If more than one command line switch is specified, each switch must be separated from the preceding switch by one or more spaces.

A filename not preceded by a switch is assumed to be the name of a log file whose QSOs are to be signed unless the Open ADIF files in ADIF editor box is checked, the named file has an .ADI extension, and the command line includes neither a -q or -x switch, in which case the named log file will be displayed in TQSL's ADIF Editor.

After taking the actions specified by command line options, TQSL will enter its menu-driven mode of operation unless one of the -q, -x or -n switches are present, in which case it will terminate.

OptionDescription
-a The action to be taken if a already uploaded, out-of-date-range, or invalid QSO is encountered while signing a log file's QSOs:
  -a ask        a dialog will be provided that prompts the user to specify how to proceed
  -a abort      no QSOs will be signed
  -a compliant  neither already uploaded QSO nor out-of-date-range QSOs will be signed; all other QSOs will be signed
  -a all        all QSOs, including already uploaded and out-of-date-range QSOs, will be signed

If no -a switch is specified and a already uploaded or out-of-date-range QSO is encountered while signing QSOs, a dialog will be provided that prompts the user to specify how to proceed.

-b date
-e date
Specifies the beginning (-b)date of QSOs to be signed or the end date (-e) for QSOs to be signed. QSOs before the begin date or after the end date will not be signed. If these are used, -d should also be specified to suppress the QSO date-range dialog.
-c Callsign If present, specifies the Callsign Certificate to be used when signing log files, overriding any Callsign Certificate specified in the Station Location selected by -l. If the specified Callsign Certificate's DXCC entity does not match the DXCC entity specified in the Station Location selected by -l, an error message will be displayed and no QSOs will be signed.
-d Suppress the date-range dialog; if this switch is present, the QSO date-range dialog will not be displayed before signing a log.
-f This option instructs tqsl how to handle the MY_ fields in an ADIF log file. These specify the callsign, QTH details such as zones, gridsquare, state/county, etc. for a QSO. If the log includes this detail, TQSL can read these fields and take action to use that information to ensure that the Station Location is correct. By default, TQSL will report any discrepancies between QTH and the Station Location; TQSL can also be directed to ignore the QTH information.
   -f ignore      Directs TQSL to ignore the QTH information
  -f report      Directs TQSL to report any differences between the station location and the MY_ QTH details
  -f update      Directs TQSL to overwrite the Station Location information with data from the log.

When using "-f update", the ideal practice should be to either specify all QTH information (state, county, grid, zones) in the ADIF "MY_" fields or to use an empty Station Location.
-h Display command line help.
-i Filename Load a specified Callsign Certificate File (.tq6), a Certificate Container File (.p12), a Configuration Data File (Config.tq6), or a TQSL Backup File (tqslconfig.tbk) .
-l Station_Location Select a defined Station Location to be used when signing log files. If the specified Station Location contains embedded spaces, it must be quoted in a manner suitable for the operating system and shell that's being used. If the specified Station Location doesn't exist, no QSOs will be signed or uploaded unless -s is also specified. If -l is not present and a log file is being signed, a dialog will be provided that prompts the user to select a Station Location.
-n Checks for and reports the availablility of
TQSL displays the above information (if any) to stderr, then exits without digitally signing any specified filename. This command line option should therefore not be used with any other command line option.
-o Filename Specify the name of the digitally signed log file to be created. If the specified Filename contains embedded spaces, it must be quoted in a manner suitable for the operating system and shell that's being used. If -o is not present, the specified log filename with its extension set to .tq8 will be used.
-p Passphrase Specify the passphrase that gains access to a passphrase-protected Callsign Certificate when signing a log file. If the specified Passphrase contains embedded spaces or other shell-special characters, it must be quoted in a manner suitable for the operating system and shell that's being used. If -p is not present, a log file is being signed, and the specified or selected Station Location includes a passphrase-protected Callsign Certificate, a dialog will be provided that prompts the user to specify the passphrase.
-q Operate in batch mode: status information will be routed to stderr, and TQSL will terminate after taking the actions specified by command line options.
-s If the -l switch is also present, a dialog will be provided that enables the specified Station Location to be edited; otherwise, a dialog will be provided that enables a new Station Location to be defined.
-t Filename Enable Diagnostic Mode and specify the name of the log file into which diagnostic information is written.
-u Instead of saving the digitally signed log file, upload it to LoTW over the Internet. After processing, the uploaded file will be shown in LoTW's Your Activity list with the specified filename preceded by <TQSLUpl YYYYMMDD-HHMM>, where YYYY is the current year, MM is the current month, DD is the current day, HH is the current hour, and MM is the current minute.

-v Display TQSL version information, and terminate.
-x Operate in batch mode: status information will be routed to stderr, and TQSL will terminate after taking the actions specified by command line options.
Filename A command line option that is not a single-letter switch or the argument associated with a single-letter switch will be considered the name of the ADIF or Cabrillo log file to be digitally signed using the specified or selected Station Location. If the specified Filename contains embedded spaces, it must be quoted in a manner suitable for the operating system and shell that's being used. If -u is present, the resulting signed log file will be uploaded to LoTW via the internet. Otherwise, the resulting signed log file will be saved in the Filename specified by the -o switch; if -o is not present, the resulting log file will be saved in the same directory as the log file using the .tq8 extension, overwriting any existing .tq8 file of the same name.

If the Open ADIF files in ADIF editor box is checked, if the named file has an .ADI extension, and if the command line includes neither a -q or -x switch, then the named log file will be displayed in TQSL's ADIF Editor rather than signed.

Invocation Examples:
Without displaying the QSO date-range dialog and ignoring already uploaded QSOs, digitally sign the "cqww log.adi" log file using the "CQWW Portable" Station Location, upload the digitally signed log file to LoTW, route stderr to the file results.txt and then terminate:

    tqsl -d -u -a compliant -x -l "CQWW Portable" "cqww log.adi" 2>results.txt

Edit the "Home" station location before beginning menu-driven operation:

    tqsl -l Home -s

Add a station location, and then terminate:

    tqsl -s -x

Display the "cqww log.adi" log file in TQSL's ADIF Editor:

    tqsl "cqww log.adi"

Check for new versions and expiring or pending Callsign Certificates, and then terminate:

    tqsl -n 2>news.txt

Note that in the above examples, the redirection of stderr is performed by the Command Processor, not by TQSL."

Status Information
If invoked with -q or -x, status information will be routed to stderr. The last line of stderr will have the following format: HH:MM:SS AM/PM Final Status: Description (Code) where
  • HH:MM:SS AM/PM is the timestamp
  • Description is a textual summary the status that contains no left or right parenthesis
  • Code is an integer uniquely identifying the status, as described in the following table

CodeDescription
0success: all qsos submitted were signed and saved or signed and uploaded
1cancelled by user
2rejected by LoTW
3unexpected response from TQSL server
4TQSL error
5TQSLlib error
6unable to open input file
7unable to open output file
8No QSOs were processed since some QSOs were already uploaded or out of date range
9Some QSOs were processed, and some QSOs were ignored because they were already uploaded or out of date range
10command syntax error
11LoTW Connection error (no network or LoTW is unreachable)
12Unknown Error
13When siging a log, the TQSL upload tracking database was locked
14Some QSOs in a log being signed were already uploaded
15When importing a P12 file on the command line, an invalid passphrase was given

Status Examples:
05:57:39 PM: Warning: Signing cancelled
05:57:39 PM: No records output
05:57:39 PM: Final Status: cancelled by user (1)

06:05:56 PM: /home/rmurphy/k1mu.adi: 414 QSO records were already uploaded
06:05:56 PM: /home/rmurphy/k1mu.adi: wrote 1 records to /home/rmurphy/k1mu.tq8
06:05:56 PM: /home/rmurphy/k1mu.tq8 is ready to be emailed or uploaded.
Note: TQSL assumes that this file will be uploaded to LoTW.
Resubmitting these QSOs will cause them to be reported as already uploaded.
06:05:56 PM: Final Status: Some QSOs were already uploaded or out of date range (9)

17:21:32 PM: /Signing using Callsign W4TV, DXCC Entity UNITED STATES OF AMERICA
17:21:32 PM: /Warning: Your custom mode map WSPR conflicts with the standard mode definition for WSPR and was deleted.
17:21:32 PM: /Attempting to upload 2 QSOs
17:21:33 PM: /C:\Program Files\LogsAreUs\LotWUpload.ADI: Log uploaded successfully with result "File queued for processing"!
17:21:33 PM: /After reading this message, you may close this program.
17:21:33 PM: /Final Status: Success (0)

in response to -n
17:21:32 PM: A new TQSL release (v2.0) is available.
17:21:32 PM: A new TrustedQSL configuration file (V2.4) is available.
17:21:32 PM: The certificate for VE6LB expires in 9 days.
17:21:33 PM: The certificate for VE6LB/A3 expires in 15 days.
17:21:33 PM: A Callsign Certificate for VE6LB/P5 is pending.
tqsl-2.8.1/apps/help/tqslapp/configops.htm0000644000175000017500000000173015003421124020554 0ustar rmurphyrmurphyTQSL Configuration Operations

Configuration Operations

tqsl-2.8.1/apps/help/tqslapp/configxml.htm0000644000175000017500000000336615003421124020562 0ustar rmurphyrmurphyChecking and Updating TQSL's Configuration Data

Checking and Updating TQSL's Configuration Data

TQSL is driven by Configuration Data that defines

  • Bands
  • Modes
  • Propagation Modes
  • Satellite Names
  • DXCC Entities
  • Primary Administrative Subdivisions (e.g. US States, Canadian Provinces, Russian Oblasts)
  • Secondary Administrative Subdivisions (e.g. US Counties)

Occasionally, the ARRL releases updated versions of TQSL's Configuration Data.

Determining What Version of Configuration Data TQSL is Currently Using
Select the Help menu's About command (on OS X, select the Application menu's About command); TQSL will display an About dialog that displays the Configuration Data version it's using.
 

Determining Whether a New Version of Configuration Data is Currently Available
If your computer has access to the internet, you can determine whether a new version of Configuration Data is available by selecting the Help menu's Check for Updates... command. If a newer version is available, the Update Available dialog will appear, showing the new version available and providing an OK box that if clicked will download and install the new version:
 

The Check for Updates... command will also inform you if a new version of TQSL is available. tqsl-2.8.1/apps/help/tqslapp/contents.hhc0000644000175000017500000001774615003421124020412 0ustar rmurphyrmurphy

tqsl-2.8.1/apps/help/tqslapp/crq0.htm0000644000175000017500000000161415003421124017433 0ustar rmurphyrmurphyRequesting a Callsign Certificate: Specifying Your Callsign, DXCC Entity and QSO Dates

Requesting a Callsign Certificate: Specifying Your Callsign, DXCC Entity and QSO Dates

1.Specify the station callsign for which you seek a Callsign Certificate, without any portable identifiers.
2.Select the DXCC entity.
3.Set the QSO begin date to the date of the first QSO made using this callsign.
4.If additional QSOs will be made using this callsign, leave the QSO end date blank; otherwise, set the QSO end date to the day after the date of the last QSO made using this callsign.
5.Click the Next button.

tqsl-2.8.1/apps/help/tqslapp/crq1.htm0000644000175000017500000000101615003421124017430 0ustar rmurphyrmurphyRequesting a Callsign Certificate: Specifying Your Name and Address

Requesting a Callsign Certificate: Specifying Your Name and Address

1.Specify your Name and Address. For US callsigns, the Address you specify must match your address in the FCC database
2.Click the Next button.

tqsl-2.8.1/apps/help/tqslapp/crq2.htm0000644000175000017500000000044515003421124017436 0ustar rmurphyrmurphyRequesting a Callsign Certificate: Specifying Your Email Address

Requesting a Callsign Certificate: Specifying Your Email Address

Specify the email address to which your requested Callsign Certificate will be sent.

tqsl-2.8.1/apps/help/tqslapp/crq3.htm0000644000175000017500000000134115003421124017433 0ustar rmurphyrmurphyRequesting a Callsign Certificate: Specifying a Passphrase

Requesting a Callsign Certificate: Specifying a Passphrase

If you're using a shared computer, you should protect your Callsign Certificate by specifying the same passphrase in both textboxes; you'll be asked to provide this passphrase each time you direct TQSL to digitally sign a log file, so be sure to remember it. If you control access to the computer you're using, you can leave both textboxes empty, thereby avoiding the need to provide a passphrase each time you direct TQSL to digitally sign a log file.

tqsl-2.8.1/apps/help/tqslapp/crq4.htm0000644000175000017500000000052215003421124017434 0ustar rmurphyrmurphyRequesting a Callsign Certificate: Authenticating

Requesting a Callsign Certificate: Authenticating

Explain under what circumstances the user should or should not use an existing Callsign Certificate to Authenticate the request for a new Callsign Certificate.

tqsl-2.8.1/apps/help/tqslapp/daterng.bmp0000644000175000017500000076051615003421124020215 0ustar rmurphyrmurphyBMN6()fffWWW/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)FFFTTTppp}}}hhh/,)1/-񢟝1/-/,)OOOooo}}}hhhοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿ⢟PPPrrrrrr-*'οοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿοע-*'WWWaaa0.,οοοοοοοͿͿͿͿͿͿͿͿͿͿͿͿοο.,*III +οοοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿοοοοʠ222-*'οοοͿ-*'-*'㥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbοοοͿ-*'-*'ohbohbοοοͿ-*'-*'ohbohbοοͿͿ-*'-*'ohbohbοͿͿͿ-*'-*'ohbohbοͿͿͿ-*'-*'ohbohbοͿͿͿ-*'-*'ohbohbͿͿͿͿ-*'-*'ohbohbͿͿͿ̾-*'-*'ohbohbͿͿͿ̾-*'-*'ohbohbͿͿͿ̾-*'-*'ohbohbͿͿ̾̾-*'-*'ohbohbͿ̾̾̾-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿ̾̾̾-*'-*'ohb䏏䏏ohbͿ̾̾̾-*'-*'ohbuuuuuuuuuuuuohb̾̾̾̾-*'-*'ohbppppppppppppohb̾̾̾̾-*'-*'ohbppppppppppppohb̾̾̾̾-*'-*'ohbppppppppppppohb̾̾̾̾-*'-*'ohbppp1y֙Vyy11ָVy1pppppp1yVVVV1y11yy11ָyy11ָy1֙Vy1y1yy11ָpppohb̾̾̾̾-*'-*'ohbppp1zz1عؚWz1zz11عWz1pppppp1zWؚWWzz11ع1zz1zz11عzz11ع1zؚWؚWؚWzz11عpppohb̾̾̾̾-*'-*'ohbpppڜ1Wڻ{{{11{{111{Wppppppڜ1Wڻ{{11ڻ{{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻpppohb̾̾̾̾-*'-*'ohbppp{{11ۼۜXX{1Xۜpppppp{{11ۼ{1{1{{11ۼ{{11{{11ۼ{1X{{11ۼpppohb̾̾̾̾-*'-*'ohbppp}}22ݾݝYY}}22}Y2ݝpppppp}Y2ݝYݝY}2ݝYY}2ݾ2}ݝYݝYYݝ}}22}}22ݾpppohb̾̾̾̾-*'-*'ohbppp5^Ʉ55Ʉ55^5Ʉpppppp55Ʉ55Ʉ55^^^^55Ʉ55pppohb̾̾̾̾-*'-*'ohbppp5ʄ5^ʄ555pppppp5^^^55pppohb̾̾̾̾-*'-*'ohbppp5̅555pppppp__55pppohb̾̾̾̾-*'-*'ohbppp55pppppp55pppohb̾̾̾̾-*'-*'ohbppppppppppppohb̾̾̾̾-*'-*'ohbppppppppppppohb̾̾̾̾-*'-*'ohbppppppppppppohb̾̾̾˽-*'-*'ohbuuuuuuuuuuuuohb̾̾̾˽-*'-*'ohb葑葑ohb̾̾̾˽-*'-*'ohb𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb̾̾˽˽-*'-*'ohbohb̾˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˽-*'-*'ohbohb˽˽˽˼-*'-*'ohbohb˽˽˽˼-*'-*'ohbohb˽˽˽˼-*'-*'ohbohb˽˽˼˼-*'-*'ohbohb˽˼˼˼-*'-*'ohbohb˽˼˼˼-*'-*'ohbohb˽˼˼˼-*'-*'ohbohb˼˼˼˼-*'-*'ohbohb˼˼˼ʻ-*'-*'ohbohb˼˼ʻʻ-*'-*'ohbohb˼ʻʻʻ-*'-*'ohbohb˼ʻʻʻ-*'-*'ohbohb˼ʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻʻ-*'-*'ohbohbʻʻʻɻ-*'-*'ohbohbʻʻʻɻ-*'-*'ohbohbʻʻʻɻ-*'-*'ohbohbʻʻɻɻ-*'-*'ohbohbʻɻɻɻ-*'-*'ohbohbʻɻɻɻ-*'-*'ohbohbʻɻɻɻ-*'-*'ohbohbɻɻɻɻ-*'-*'ohbohbɻɻɻȺ-*'-*'ohbohbɻɻɻȺ-*'-*'ohbohbɻɻɻȺ-*'-*'ohbohbɻɻȺȺ-*'-*'ohbohbɻȺȺȺ-*'-*'ohbohbɻȺȺȺ-*'-*'ohbohbɻȺȺȺ-*'-*'ohbohbȺȺȺȺ-*'-*'ohbohbȺȺȺȺ-*'-*'ohbohbȺȺȺȺ-*'-*'ohb6``6·ohbȺȺȺǹ-*'-*'ohb6Ϋ``6ohbȺȺȺǹ-*'-*'ohb666666```66666·```666`·6666`·666666666666·666666·66·6`ohbȺȺȺǹ-*'-*'ohb6666666`·6·666``666·6·`6```6666666666666·666666``66``6·6ohbȺȺǹǹ-*'-*'ohb666666·6666666666·66·66·666·66666666666·`666·66·`6666666·6666``ohbȺǹǹǹ-*'-*'ohb666666·666666``66·66·6`6·6666666666``666``66·66``666``666``Ϋ66``66ohbȺǹǹǹ-*'-*'ohb666``6``6666````66Ϋ``666·6`666``666``666``666`66``Ϋ66·66·66``Ϋ66·6666``Ϋ66````ohbȺǹǹǹ-*'-*'ohb6666``66666666·6·666·`666`666`666`666`6666·6``66·666·6``666666·66666·6ohbǹǹǹǹ-*'-*'ohb6666666`666`·```·6```·6```·6```·6`6666`·66666`6666`·66666666`666`6`ohbǹǹǹǹ-*'-*'ohb66·666`666Ϋ``666`666`666`666·6``66``66`6``6ohbǹǹǹǹ-*'-*'ohb666``6·ohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohb½½ohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹǹ-*'-*'ohbohbǹǹǹȺ-*'-*'ohbohbǹǹǹȺ-*'-*'ohbohbǹǹǹȺ-*'-*'ohbohbǹǹȺȺ-*'-*'ohbohbǹȺȺȺ-*'-*'ohbohbǹȺȺȺ-*'-*'ohbohbǹȺȺȺ-*'-*'ohbohbȺȺȺȺ-*'-*'ohbohbȺȺȺɻ-*'-*'ohbohbȺȺȺɻ-*'-*'ohbohbȺȺɻʼ-*'-*'ohbohbȺȺɻ̾-*'-*'ohbohbȺɻʼ̾-*'-*'ohbٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷohbȺʼ˽Ϳ-*'-*'ohbϵɤohbɻ˽̾Ϳ-*'-*'ohbϵɤohbʼ̾ͿͿ-*'-*'ohbϵɤohb˽̾Ϳ-*'-*'ohbϵɤohb̾ͿͿ-*'-*'ohbϵɤohbͿͿ-*'-*'ohbϵɤohbͿ-*'-*'ohbϵɤohbͿ-*'-*'ohb6``6·ϵɤohbͿ-*'-*'ohb6Ϋ``6ϵɤohb-*'-*'ohb66·`·6```666·66`·666·```666`·6666`·666666666666·666666·66·6`ϵɤohb-*'-*'ohb`666·`6666·6·66`666``666·6·`6```6666666666666·666666``66``6·6ϵɤohb-*'-*'ohb``66·66·66·6666666666·66·66·666·66666666666·`666·66·`6666666·6666``ϵɤohb-*'-*'ohb``6666·666666``66·66·6`6·6666666666``666``66·66``666``666``Ϋ66``66ϵɤohb-*'-*'ohb``66``6`6666````66Ϋ``666·6`666``666``666``666`66``Ϋ66·66·66``Ϋ66·6666``Ϋ66````ϵɤohb-*'-*'ohb``6·666·66``6·6666666·6·666·`666`666`666`666`6666·6``66·666·6``666666·66666·6ϵɤohb-*'-*'ohb6`·``6666666`666`·```·6```·6```·6```·6`6666`·66666`6666`·66666666`666`6`ϵɤohb-*'-*'ohb6·666666`666Ϋ``666`666`666`666·6``66``66`6``6ϵɤohb-*'-*'ohb6``6·ϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbĭ\{={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={=\ĭohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb``6``6·ohb-*'-*'ohb`66Ϋ``6ohb-*'-*'ohb666`6``66666·66·66```66666·66·66```666`66666·66```66666·66·66```666```666`·6666`·6`66666````66666```666```666`·666`·66`66·66```666·6666·66Ϋ`·6`6ohb-*'-*'ohb66``6Ϋ``66·666·66·66·666·66·666``666·66```·6````66·`66666``666`·6·6·666·6·`6```6Ϋ``6Ϋ`66666Ϋ```6Ϋ``666666`·6·6·666·6·`6``·`66·6·6666Ϋ`66·666·6·6666·66`·6`6ohb-*'-*'ohb6666`6Ϋ666666·66·6666·66````66·6666·66`66`·666666·66·6666·6666666666·66·66·666·666`6Ϋ6666`6Ϋ66`666·6666666666·66·66·66````66`6Ϋ6666·66·6666·666`ohb-*'-*'ohb6666`6Ϋ666666·66·66·66Ϋ````666`66``6`·6`6`Ϋ66·66·66666`Ϋ666666·66·66·6`6·666`6Ϋ6666`6Ϋ66`666·66666666·66·66·6```6666`6Ϋ66·66·66666`ohb-*'-*'ohb`666```6Ϋ`666666·`6·`6``````66``66````````66``66·66·66·6``6``666```66``66Ϋ``666·6``6Ϋ`6`66·6·6``6Ϋ`66·6``6``66``66Ϋ``66`6````66·6·6·66``6``6·66`6ohb-*'-*'ohb66`66`6666`666`Ϋ`6`66·6`6`·66·66·66·`6``66·66·666``666``66·66``6666·6·666·`66`66```666`6·6`6``666``6666·6·666·666·6`666`6·6666·66``66`6·ohb-*'-*'ohb```·66666·6666666`·6666·6666666`666666ohb-*'-*'ohb666·6666·66·6666666Ϋ`6666·666666`6666666ohb-*'-*'ohb6666666`666666`6·666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb``66ohb-*'-*'ohb``66ohb-*'-*'ohb```666```666`·6666`·`6·66·66·666666·6``·66666`·666`6·6666·66```6666`6666·6666·6`666``666```666·66```66666·6666```66666·666`6``666```66`6``666`·666·66·66·66·`6ohb-*'-*'ohb6`·6·6·666·6·`6``66`·6````·66·66·666666``6Ϋ``6666Ϋ```·`66666`·66·6666``6`·6·6``6Ϋ`6666·66666`66`66·66`·6·6``6`·6·666·6666`66666````6Ϋ``66·6·`666`6`66·6·`666·66·66```6ohb-*'-*'ohb666666·66·66·666Ϋ`6``6``66·66·666666·66`66666`6Ϋ66``Ϋ66`·666·6666·66666666`6Ϋ6666·6666·6666·6666·6666·66666666·666666·6666·6666`6Ϋ6666·66·666`6666·6666·66·66·66ohb-*'-*'ohb6666·66·66·6`6`·``Ϋ`6`666·66·666666·66`66666`6Ϋ6```66·6666·66666`Ϋ666666`6Ϋ6666·6666·6666·6666·66666`Ϋ666666·666666·66666`66`6Ϋ6666·66·666`6666·6666·66·666`ohb-*'-*'ohb``66``66Ϋ``66``6````6`·66·66·666``6``6Ϋ`6666·6·6``66`6``Ϋ66``666``6``66``66``6Ϋ`6`666``66`66·6666``66``66``66666``666·6``6``66``6Ϋ`6666·66·66·``Ϋ6666·6666·66·66``66ohb-*'-*'ohb6666·6·666·66·`6`6Ϋ66·66·6666``6`6·6`666`6·66·66·66·66·66``66·666`66``66·66````66·6666·66·66·6666·66``6``666``66·6`66666``6`666``66666·6`6·66·66·ohb-*'-*'ohb666666·6666666666666666·666666`666ohb-*'-*'ohb666666·66·6666666666666666666666·6666666`·66·66ohb-*'-*'ohb6666·66666666666666``66ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb`6·66````ohb-*'-*'ohb6666````ohb-*'-*'ohb6`66·6``·66`6666·6`66`·66````66666·66`·6`·6```666·66```666·6666`6```666```666`·6666`66```666·66`·666·66```66666·6666·6666```666·66·6666`6ohb-*'-*'ohb6·6```6666·6`·6·`66·66`6·6666``6Ϋ`66`6``6Ϋ``66666``·`66·`6666·6·66`666·66666`·666`·6·6·666·6·`6````6Ϋ`66666·6·66`6``66`66666````66666`·6·6·66·66666`·66ohb-*'-*'ohb6`·66``6`·66``666`6666·66`6Ϋ6666·66`666·6666·66``66·66·66·6666·66·6666`·666666666·66·66·6666`6Ϋ6666·66·6666·666666·6666·66666666·6666·66·6666`·666ohb-*'-*'ohb66````66````666`6666·66`6Ϋ6666·66`666·66666```6666·6666·66·6666·66666666·66·66·6`66`6Ϋ6666·6666·6`Ϋ6666·66666`6`Ϋ6666·6666·66·6666·6666ohb-*'-*'ohb66````66``Ϋ`6``66·``Ϋ6`66``6Ϋ`6`66Ϋ``6Ϋ`66·6``6``66`6``66``6`66·666``6``66``66``66Ϋ``66``6Ϋ`6```6666Ϋ``666`66·6``6``66``666``6``66·666``6``66ohb-*'-*'ohb6`·66``6`·6666`666``66``Ϋ66·6`66``6·66`6``666``66·666·666·66``6``666·66``666666·6·666·6`66``66·``66`·666·66``6``666``66·66·66``66·66·66``66ohb-*'-*'ohb6·6`·66`·``6·6`·66666·6666666666`66666·6666ohb-*'-*'ohb6·66·66·6666666·666666·6666666`·6666·6666·66ohb-*'-*'ohb6666``6666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb`6·66ohb-*'-*'ohb6666ohb-*'-*'ohb66·66666`66```666·66·66`·66``·666·66·66·6``·66`66·6``·666·666`66·66·66```66666·6666·66666`6``666`·666·66·66·66·`6ohb-*'-*'ohb66·6666``6Ϋ`666`·6·6``66`6``6Ϋ`·`66·``66``6``66·6```6666·6`·6·`66·66·66``6Ϋ`66·66·66`66666``66·6666·66`6`66·6·`666·66·66```6ohb-*'-*'ohb66·666666`6Ϋ666666·666666·66`6``Ϋ6666·6666666`·66``6`·66``66·6666`6Ϋ66·66·6666·6666·6666·6666·666`6666·6666·66·66·66ohb-*'-*'ohb66·666666`6Ϋ6666666`Ϋ6666·66`6``6`Ϋ666`Ϋ666666````66````66·6666`6Ϋ66·66·6666·66666`66·6666·666`6666·6666·66·666`ohb-*'-*'ohb666``6``6Ϋ`6```66``666`66Ϋ``6Ϋ``6````66·66``666`6666````66``Ϋ`6``66·6```6Ϋ`66·`6·`666·6``6``66666``666·``Ϋ6666·6666·66·66``66ohb-*'-*'ohb66·66``6`66``66·66·66``6·66`66·66·66·66·`Ϋ`6·66`·66``6`·6666`6``6``666`Ϋ`6`6``666``66·66·66```666``66666·6`6·66·66·ohb-*'-*'ohb666666666·6`·66`·``6·6`·6`666·6666`666ohb-*'-*'ohb66666666666·66·66·66`·66·6666666`·66·66ohb-*'-*'ohb6666``66``66ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb`````````6·ohb-*'-*'ohb`6``````66ohb-*'-*'ohb666`6``66666·66·66```66666·`·666`·6```66666·66`·6`·6```666·66```666·6666`6```666·6666```6666·66`6666·6666```666·66·6666`66`66·6````666```666`·666`·6ohb-*'-*'ohb66``6Ϋ``66·666·66·66·666·66·6·`66·```6`66666``·`66·`6666·6·66`666·66666`·66666·6·66666`·6·6·66Ϋ``6Ϋ`66``66666`·6·6·66·66666`·666·6```6666·6`·66`·6·6·666·6·`6``·`66·ohb-*'-*'ohb6666`6Ϋ666666·66·6666·66``````Ϋ666666·6666·66``66·66·66·6666·66·6666`·66666·66·6666·666666·66`6Ϋ66666666·6666·66·6666`·6666`·66``6`·66666666·66·66·66``ohb-*'-*'ohb6666`6Ϋ666666·66·66·66Ϋ``````6`6666·66666```6666·6666·66·6666·666666·6666·6666``66`6Ϋ666`Ϋ6666·6666·66·6666·666666````66``6666·66·66·6```ohb-*'-*'ohb`666```6Ϋ`666666·`6·`6```````6````66·6666·6``6``66`6``66``6`66·666``6``66``6``6``66````6Ϋ`6```666``6``66·666``6``6666````66````66``66Ϋ``66`6``ohb-*'-*'ohb66`66`6666`666`Ϋ`6`66·6`6`·66·66·6·66``666``66·666·666·66``6``666·66``6666·66``66``6`66``66·66``66·66·66``666`·66``6`·666666·6·666·66ohb-*'-*'ohb```·66666·666666666`·666·6`·66`·``6·6`·66666ohb-*'-*'ohb666·6666·666666·66666·666·666·66·66·66666ohb-*'-*'ohb6666666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'L-*'-*' PƂ-*'-*'USӆX`+4g (P (P")Q#*S$+T%-U%-V'.W(/X)0Y)1Z)1[)1[)1])1])2])1])1])2])1])1])1[)1\)1])1])1])1[)1[)1Z)0Y(/X'.W%-V%-U$+T#*S")Q (P (P+4gX`-*'-*'XKYMפ ÀVTN֣TLƃL€OO֥OO֤Qǃ).Ny}ʹ᮶᮶᮶家殸欹鬺ꬺꬺ쬺쬺ꬺꬹ鮸殶殶家⮶ⴺ⮲y}).N-*'-*' LգWPVY׃VƀܩKVܨKNץXN֤€NPפRܨJÀOOץOO֥ᆵO~X[uqqqqqpppoommmmmmmmmmmmmmmmmoopppqqqqquɟՄX[-*'-*'U|WڧIMVפ īKVۨKLVƂNTգłƃL€OO֤OO֥QۨKǃ!&Oq{ererdsdsdscucxcwcwayayaza{a{a{a{a{a{a{a{a{a{a{a{a{a{a{a{a{azayaycwcwcwcudsdsdsererq{!&O-*'-*'YԂYŀXǁ ܨJNإVܩKNץ€TԅRÁOOئOOצQݩL>YgUcUcUeUfUgThTgTgTiSjSjQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkSjSjTiTgTgTgUfUfUeUcUcYg>-*'-*'YԪJY׫K ܨJ ~ÀVܩKNTץNץ€TԬMƃOÁONSԆSԇQハRѮN;IWIWIWIWHXHXGYEZE[E[E[E]E]E]E]E]E]WYhXUhXUhXUWYE]WYhXUhXUhXUWYE]E]E]E]E[E[E[EZGYHWHWIWIWIWIW;-*'-*' êK ÂWۨJT€VۨKNT֤ƂLSN֤łPMүOOQܩKQOKSO֤ 9=M=M=M=O=P=P=O=O=O=O=Q=QSetting a Date Range

Setting a Date Range

If the Prompt for QSO Date Range option is enabled, TQSL will display the QSO Date Range dialog to prompt you to specify a Start Date and an End Date when Submitting a Log File to LoTW via the Internet or Submitting a Log File from a Computer without Internet Access. Any QSOs in the log file outside of this range will be ignored.

Dates should be entered in YYYY-MM-DD format:

Either date can be left blank, in which case only the other date is checked.

The QSO Date Range dialog can be used to prevent QSOs already submitted to LoTW that haven't been subsequently modified from being submitted again, sparing LoTW from processing QSOs that have already been processed. For example, if the last log file submitted contained QSOs made between 2013-02-20 and 2013-02-27, set the Start Date to 2013-02-27 and leave the End Date blank.Only QSOs made on 2013-02-27 or later will be submitted.

Display of the QSO Date Range dialog can be suppressed, but this should only be done if you are certain that the QSOs being submitted have never been submitted before, or have been modified since they were last submitted.

tqsl-2.8.1/apps/help/tqslapp/deletecert.htm0000644000175000017500000000151215003421124020703 0ustar rmurphyrmurphyDeleting a Callsign Certificate

Deleting a Callsign Certificate

To delete a Callsign Certificate,
1.Select TQSL's Callsign Certificates tab, which lists your Callsign Certificates.
 
  
2.Select the Callsign Certificate you wish to delete by clicking it.
3.Select the Callsign Certificate menu's Delete Callsign Certificate command.
tqsl-2.8.1/apps/help/tqslapp/diagmode.htm0000644000175000017500000000221015003421124020330 0ustar rmurphyrmurphyEnabling and Disabling Diagnostic Mode

Enabling and Disabling Diagnostic Mode

When enabled, Diagnostic Mode configures TQSL to route information to a log file for use in diagnosing and correcting internet connectivity problems and latent defects.

  • To enable Diagnostic Mode, select the File menu's Diagnostic Mode command; a checkmark will appear to the left of the Diagnostic Mode command, and you'll be prompted to specify the name and location of the log file into which diagnostic information will be saved.
  • To terminate Diagnostic Mode, select the File menu's Diagnostic Mode command; a checkmark will no longer appear to the the left of the Diagnostic Mode command.

The default name of the log file is tqsldiag.log. On Windows, the log file's default location is My Documents; on OSX and Linux, the log file's default location is specified by $HOME.

tqsl-2.8.1/apps/help/tqslapp/duplicate.bmp0000644000175000017500000071003615003421124020533 0ustar rmurphyrmurphyBM6($pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭ppppppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭᭭ppppppxxxx𭭭᭭ppppppxxxx𭭭᭭ppppppxxxx𭭭qq&&K&q᭭ppppppxxxx𭭭qq&&qq&&᭭ppppppxx&qKKKK&q&&qq&&qq&&q&Kq&q&qq&&xx𭭭qq&&&q&qq&q&q&q&q&Kqq&&q&KKKK&q&&KKK&q&&&qK&q&q&qKKq&᭭ppppppxx&qKKKqq&&&qq&qq&&qq&&&qKKKqq&&xx𭭭qq&&KKᖖKK&Kq&qKqq&&Kq&qq&&KK&qKqq&&&qq&&Kq&qq&&qq&KKqK&qq&&&qq&Kq&qqK&&qq᭭ppppppxx&Kqq&&qqq&&qq&&qq&&qq&&qq&&qq&&xx𭭭qq&&qK&qq&&qq&&qq&&qq&&&Kqqq&&qq&&qK&q&&qqq&&qq&&qq&&&Kqqq&&KK&Kqqq&&KK᭭ppppppxxqq&&q&q&qq&&qq&&qq&&q&Kqq&&xx𭭭q&q&q&K&qKK&q&&qq&&qq&&&Kqqq&&qq&&qK&q&q&qq&&qq&&qq&&KKKKqq&&KKKK᭭ppppppxxqK&KKq&KKq&&qKKKqq&&qq&&xx𭭭qq&&Kq&ỖKKqq&&qq&&qq&&q&&qKKqq&&KK&qKKKKKqq&&qq&&KKKKqq&&KKqK&KK᭭ppppppxx&&qq&q&qqq&&KqKKKq&&qqq&&xx𭭭qq&&KKq&&qqq&&qq&&qK&&&KKqq&&q&K&q&qq&q&&Kqqq&&KK&Kqqq&&&qq&᭭ppppppxx&qKKKqq&&xx𭭭qq&&qK&qq&&qq&&qq&&qq&&&qq&Kq&&KqKK&qq&Kq&᭭ppppppxxKKqq&&xx𭭭q&&qqq&&qq&&qq&&qq&&&qq&q&q&&qq&᭭ppppppxxqq&&xx𭭭qq&&qq&&᭭ppppppxxxx𭭭᭭ppppppxxxx𭭭᭭ppppppxxxx𭭭᭭ppppppxxxx𭭭᭭ppppppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭᭭ppppppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppappppaDpppaD'ppp6''ppp'Dppppppppppppppppppppppppww''P'www''PPPPPPww''P'wppppppww''ww''ww''PPPPPw'ww''ww''pppppp'wPww''ww''w'wwPw''ǠPw'ww'''w'ww'w'w'w'w'Pww''w'PPPP'w''PPP'w'''wP'w'w'wPPw'Pw'w'Pww''w'w'w'Pww''w'Pw'Pw'w'Pw'Pw'PPP'w''ww''ww''Pw'ww''w'PPw''PwPw'ww''ww''ww''ww''w'w'PPP'w''ww''ww''w'P'PwPw'ww''ww''ww''Pw'PPP'w''ww''ww''w'w'PPP'w''PPP'w''''ww'wPP'w''w'Pww''w'PPPP'w''PPP'w''w'w'PPP'w'''wP'w'w'wPPw'wP'pppppp'wPPPwǠw''ww'''wPww''Pw'ww''PPPP'Pw'wǠPww''Pw'ww''PP'wǠPww'''ww''Pw'ww''ww'PPwP'ww'''ww'Pw'wwP''wwwP'PP'wǠPww''PPww''Pw'ww''PP'wǠP'wPPPwwP''wwwwP''wwwP'ww''ww''ww''wwP''wwww''PP'wǠP'Pwww''w''Pw'PwPPPwww''ww''ww''ww''PPww'''ww'ww''ww''PP'wǠPw''Pw'PwPPPwww''ww''ww'''Pwww''ww'''ww'ww''ww''PPww'''ww''Pw'ww'w'w'wP''ww'ww''Pw'ww''PP'wǠPww'''ww''Pw'ww'PP'Pw'ww''ww'PPwP'ww'''ww'Pw'wwP''wwwP'pppppp'Pwww''ww''ww''ww'''wPww''wP'ww''ww''ww''ww'''Pwww''ww''wP'wǠ''www''ww''ww'''Pwww''PP'Pwww''PPww''ww''wP'ww''ww''ww'''Pwww''ww''wP'wǠw''ww''PPPPww''ww''ww''ww''PPww''ww''wP'Pw'ww'''wǠPw'PP'wPPww''ww''ww''ww''ww''w''www''ww''ww''ww''wP''wǠPw'PP'wPPww''ww''ww''Pw'ww''w''www''ww''ww''ww''w''www''ww''ww''PPPPww''ww''ww'''Pwww''ww''wP'wǠ''www''ww''ww''ww''ww''ww'''Pwww''PP'Pwww''PPppppppw''ww''ww''ww''w'Pw'w'w'P'wPP'w''ww''ww'''Pwww''ww''wP'w'w'ww''ww''ww''PPPPww''PPPPww''ww''wP'ww''w'P'wPP'w'''Pwww''ww''wP'wǠw''w'PPPPPww''ww''ww''ww''PPww''ww''wP'wǠw''ww'''PwPPwǠP'wP'ww''ww''ww''ww''w'Pw'w'ww''ww''ww''wP''PwPPwǠP'wP'ww''ww''ww''ww''ww''w'w'ww''ww''w'Pw'w'ww''ww''ǠPPPPww''ww''ww'''Pwww''ww''wP'w'w'ww''ww''w'PwǠw''ww''ww''PPPPww''PPPPppppppP'ww''ww'''wPww''wP'ww''Pw'ǠPPww''ww''ww''w''wPPwǠw''PP'wǠPPPPPww''ww''PPPPww''PPwǠP'PPww''ǠPP'wǠPw'PPPww''w''wPPwǠ'PPP'wǠP'wPPPww''wP'PPwǠP'PPww''w'PPw'ww''wP'PPww''PP'wǠPPPww''PP'wPPPPw'Pw'PPw'ww''ww''PPww''PPww''ww''PP'wǠPPP'wPPPPw'Pww''w'PPw'PPww''PPww''w'PPPww''PPPPww''PPPPww''ww''w''wPPwǠw''PP'wǠPPPPPww''PPww''PPww''ww''PPPPww''PPwǠP'PPpppppp''wwww''ww''ǠPwwPw''P'www''PPw''www''ww''wP'''PPww''w'P'w'ww'w''Pwww''PP'Pwww'''ww''ww'w'Pww''PwPw''wwP'''PPww''PwPw'PPPw''w'ww''ww''wPP'w''PwPww'''ww'ww''w'Pw'w'ww''wP'P'wwǠw''PwPww''ww''w''w'w'www''ww''w'Pww''wP'P'wwǠw''ww''PwPw'w''w'www''ww''PwPw''w'w'ww'w''wP'Pwww''ww''wP'''PPww''w'P'w'ww'w'w''ww'w''Pwww''PP'Pwww'''ww'pppppp'wPPPwǠw''ww''w'Pww''wP'ww''ww''ww''ww'''ww'Pw''PwPP'ww'Pw'w'Pww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww'''ww'Pw''PwPP'ww'Pw'ppppppPPww''ww''ww''ww''w''www''ww''ww''ww'''ww'w'w''ww'ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww'''ww'w'w''ww'ppppppww''ww''wP'ww''ww''wP'ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ppppppppppppppppppww''PPPP'wPP'wppppppww''PPPP'wǠPPw'pppppp'wPww''ww''w'wwPw''ǠPw''wPPPP'w''ww''ww''w'Pw'w'ww''Pw'w'PPPP'w''w'w'PPP'w''ww''ww''PPP'w''w'Pww''ww''w'Pww''w'Pw'Pw'w'Pw'Pw'ww''ww''ww''Pw'PPP'w''ww''ww''Pw'ww''w'PPw'ww''ww''ww''w'w''Pwww'''w'ww'w'w'Pw'Pww''ww''ww''ww''ww''ww''w'w'ww''ww''PPP'w''w'w'PPP'w'''wPwP'pppppp'wPPPwǠw''ww'''wPww''Pw''wPPPwǠw'''ww'ww''ww'''wPPPww''wP'PP'wǠPww'''ww'ww'''wǠPww'''ww'ww''ww'''Pw'ww'PP'wǠPww''ww''ww''Pw'ww''PP'wǠP'wPPPwwP''wwwwP''wwww''ww''ww'''Pwww''wP'ww''ww''ww''wwP''wwww''PP'wǠP'Pwww''ww''ww''ww''PPPw'ww''PPPP'wPPP'wǠPww''ww''ww''ww''ww''ww''PPww''ww'''Pw'ww'PP'Pw'ww''ww'wP'pppppp'Pwww''ww''ww''ww'''wP'Pww''www''ww''ww''ww''ww''ww''ww''ww''wP'w''www''ww''wP'wǠ''www''ww''ww''ww''ww''ww''wP'wǠw''ww''ww'''Pwww''ww''wP'wǠw''ww''PPPPwǠw''ww''ww''Pw'ww''ww''ww''ww''ww''PPww''ww''wP'Pw'ww''ww''ww''ww''ww'''ww'ww''wP'ww''ww''ww''wP'wǠw''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''ww''PPppppppw''ww''ww''ww''w'Pww''w'w'ww''ww''ww''w'PwǠw''ww''ww''wP'w'w'ww''wP'w'w'ww''ww''ww''ww''ww''wP'wǠw''ww''ww'''Pwww''ww''wP'wǠw''w'PPPPPww''ww''ww''ww''ww''ww''ww''ww''ww''PPww''ww''wP'wǠw''ww''ww''ww''ww''w'P'ww'w'w'w'PwǠw''ww''wP'wǠw''ww''ww''ww''ww''ww''w'PwǠw''ww''ww''ww''w'PwǠw''ww''ww''ppppppP'ww''ww'''wPww''wP'wP'PPw'PPw''wPPPww''ww''ww''ǠPP'wǠPPPw''w'ww'PPw'PPw'PPww''PP'wǠPw'PPw'w''wPPwǠ'PPP'wǠP'wPPPww''wP'PPwǠP'PPwǠw''w'PPw'PPww''ww''w'PPw'ww''wP'PPww''PP'wǠPPPww''ww''ww''ww''PPww'''ww'ww''Pw'ǠPPww'''wPPP'wǠPw''wP'wPw'w''wP'wPw'PPww''w'PPw'PPww''PPww''PPww''PPpppppp''wwww''ww''ǠPwwPw''P'w''ww'w'www''PwPPPw''www'''ww'w'P'w'wwP'''P'w'w'www''PwPw'w'w'Pww''PwPwP'''PPww''PwPw'PPPw''w'ww''ww'ww''ww''PwPw'w''wPP'w''PwPww'''ww'ww''w'Pw'w'Pw'ww''w''wPw'ww''PPw''wPPw'PwP'''PǠP'wPwP'''PǠP'wPw''www''PwPw'w'w''ww'w''ww'pppppp'wPPPwǠw''ww''w'P'wPPPww''w'Pww''ww''ww''ww''ww''ww''wP'ww'''Pwww''wP'ww''ww'''wPppppppPPww''ww''ww''ww''PPww''ww''ww''ww''ww''ww''ww''ww''ww''ww'''Pwww''ww'''wǠPw''www''ww''Pw'ppppppww''ww''wP'ww''wP'ww''ww''ww''ww''PPww'''wPww''ww''P'wppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppPPP'w'wPP'www''ww''PPPPww'''wPP'wppppppPPww'''wǠPPw'ww''ww''Pw'PPww''PPww''ppppppww''ww''ww''ww''Pw'ww''w'PPw'w'Pw'Pww''ww''Pw'PPP'w''ww''ww''ww''Pw''wP'wP'w'w'wP'PwPw''wP'PwPw'ww''ww''ww''w'wwPw''ww''PPP'w''w'Pw'Pw'w'PPP'w''ww''Pw'w'Pww''ww''PPP'w''wP'w'w'PPP'w''ww''ww''w'w'PPP'w''PPP'w''''www'w'w'w'w'w'ww''ww''Pw'ww''Pw'ww''ww''w'w'PPP'w''ww''w'Pww'''wPP'w''w'Pww''w'PPPP'w''PPP'w''Pw'w'Pw'Pw'Pww'''ww'w'P'PwPPP'w''ww''ww''PPP'w''ww''ww''w'Pww''ww''w'w'Ǡ'PwPw''wP'w'w'wPPw'wP'ppppppww''ww''ww''ww''wwP''wwww''PP'wǠP'Pwww'''wPPP'wǠPww''ww''wP'ww'''ww'ww''ww''ww''wwP''wwww'''ww'PPwP'ww'''ww'Pw'Pw'wwP''ww'ww'w''Pw'PwPPPwww''ww''ww'''wPww''ww''ww'''ww'ww''Pw'ww''Pw'PPww'''ww'ww''wP'PP'wǠPww''ww''ww'''ww''wPPPw'PPww'''ww'ww''ww''PPww'''ww''Pw'ww'w'w'ww'''wǠPPPPPww''ww''wwP''wwww'''Pwww''ww''ww''PP'Pw'ww'ww''ǠPP'wǠPww''wP''ww'ww''Pw'ww''PP'wǠPww'''ww''Pw'ww'wP'PP'wǠPww''PP'wǠPww'''P'''wP'''w''ww'ww'''ww'ww''ww'''Pw'ww'ww''ww''PP'wǠPww''ww''PPw''Pw'PwPPPw'ww'PPwP'ww'''ww'Pw'wwP''wwwP'ppppppww''ww''ww''ww''PPww''ww''wP'Pw'ww''ww''ww''wP'wǠw''ww''ww''w''www''ww''ww''ww''PPww'''Pwww''PP'Pwww'''ww'PPPP'wǠPw'PP'wPPww''ww''ww''ww''ww''ww''w''www''ww'''Pwww'''Pwww''w''www''ww''ww''ww''wP'ww''ww''w''www''P'ww'Pww''w''www''ww''ww''ww''w''www''ww''ww''PPPPww''wP'wǠw''ww''ww''ww''PPwǠw''Pw'ww''ww''ww''ww''ww''ww''ww''ww''wP'wǠw''ww''ww''ww'''Pwww''ww''wP'wǠ''www''ww''ww''ww''ww''wP'ww''ww''wP'ww''PPPPPwǠww'Pw''www''ww''ww''ww''ww''ww''ww''ww''wP'ww''ww''ww'''wǠPw'PP'wPP'Pwww''PP'Pwww''PPppppppww''ww''ww''ww''PPww''ww''wP'wǠw''ww''ww''ww''wP'wǠw''ww''ww''w'w'ww''ww''ww''PPww''ww''PPPPww''PP'ww'PPww'''PwPPwǠP'wP'ww''ww''ww''ww''ww''ww''w'w'ww'''Pwww'''Pww'Pw'w'ww''ww''ww''wP'ww''ww''w'w'PP'Pww'Pw'w'ww''ww''w'Pw'w'ww''ww''ǠPPPPww''wP'wǠ'PwǠ'PwǠw''ww''PPww''ww''ww''ww''ww''w'PwǠw''ww''ww''ww''wP'wǠw''ww''ww''ww'''Pwww''ww''wP'w'w'ww''ww''ww''ww''wP'ww''ww''wP'ww''wP'wP'P'wP'ww'w'ww''ww''ww''ww''ww''ww''ww''wP'ww''ww''w'P'PwPPwǠP'wP'ww''PPPPww''PPPPppppppww''w'PPw'ww''wP'PPww''PP'wǠPPPww'''wPPP'wǠPw'PPw'ww''PPww''w'PPw'wP'PPww''ww''PPPPww''PP'ww'wP'PPPPPP'wPPPPw'Pw'PPw'ww'''wPw'PPw'PPw''wPPwǠ''wPPPPww''PPw'Pww''ǠPP'wǠPw'PPw'PPPPPPPPww''PPww''w'PPPww''PPPPww''PPPPw''w'ww'PPww''PPww''w'PPw'wP'PPwǠw''PPww''w'PPw'PPww''PPww''ww''ǠPP'wǠPw'Pww''ww''w''wPPwǠw''PP'wǠPPPPPww''ww''ǠPP'wǠPww''PP'wǠPww'''ww'wPww'PPPPPw'PPw'PPww''w'PPw'PP'wǠPw'PPw'PPww''PP'wPPPPw'Pww''PPPPww''PPwǠP'PPppppppww''ww''PwPww'''ww'ww''w'Pw'w'PPw'Pww''PwP'ww''w'www''ww''PwP'ww'ww'''Pwww''PP'Pwww''Pw''ww''ww'ww''wP'P'wwǠw''PwPww''ǠPwwPw''PwP'w'wwP'''PPwP'''PPw''w'w'www''PwP'ww'w'Pww''PwP'w'wwP'PPw''w'w'www''ww''PwPw''w'w'ww'w''wP'PwwP'''P'ww''ww''www''PwP'ww'ww''w'w'ww''PwPw''ww'w'Pw'w'Pww''PwPww''ww''wP'''PPww''w'P'w'ww'w''ww'w'Pww''w'Pww'''PwPPPw'Pw''w'www''PwPw'w'ww''PwPw'Pww''PwPw''www''wP'P'w'Pwww''PP'Pwww'''ww'ppppppww''ww''ww''ww'''ww''ww'Pw''PwPP'ww'Pw''Pw'wPww''ww''ww''ww''ww''ww''ww''ww''wP'ww''ww''ww''ww''ww''PP'w'''Pww''ww'''ww'Pw''PwPP'ww'Pw'ppppppPP'w''ww''ww''ww''ww''w'P'ww'w'w''ww''wǠPPw'ww''ww''ww''ww''ww''ww''ww''ww''ww''ww'''Pwww''ww''ww''ww'''wPP'w''w''wPPww'''ww'w'w''ww'pppD''ww''ww'''wPP'www''ww''ww''ww''ww''ww''ww''PPww''ww''ww''pppD'pppD''pppD'pppS6ppppaDpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp++Ԁ+UԀpppppp+++UԀppppppUU+UԀ++ԀppppppUԀ++ԪU+UԀ+UԀ+U+U+++UԀU++UԀUU+++U+UUU+UԀ++Ԁ+U+++UԀU++UԀ+UU++UԀ++ԀUUUUUUU+Ԁ+UUU+UUUUU+UU++UԀppppppU++U+UԀ+UԀUԀ+U+Ԁ++ԀUU++ԀU++++UԀU+UUUԀ+U++UԀUUU+U+Ԁ++ԀUU++ԀUԀ+UU++ԀU++UԀ+Ԁ+UUUԀ++Ԁ++UԀUUUԀ++UԀUԀ++Ԁ++UԀUԀ+UU++ԀppppppUU+UԀ+UԀU+U+++Ԁ+++UԀ+Ԁ++Ԁ+++ԀU++UԀ+U+UԀU+UUU+++Ԁ+++UԀU++++UԀU+++Ԁ+ԪU+UU++U+UԀU+U++UԀU+U++UԀU++++UԀpppppp+Ԁ++ԪU+UԀ+UԀ+UU+Ԁ+++UԀUU+U+UԀ+UԀ+UԀUU+UԀU+UUU+Ԁ+++UԀ+U+++UԀUU+Ԁ++UU+++Ԁ+Ԁ++UԀ++Ԁ+U+UԀ+UU++UԀ+U+++UԀpppppp++++Ԁ+UԀUԀ++UԀUԀ++UԀUU++ԀUUUU+UԀ+UԀU+Ԁ++Ԁ+UԀUU++Ԁ+UԀUU++Ԁ+UԀUԀ+UU++Ԁ+ԪU+Ԁ++U+++UUU+UԀ+U+UԀUԀ++UԀ+UԀUԀ++Ԁ++UԀ+UԀUԀ+UU++Ԁpppppp++Ԁ+++UԀ+U+UUU+UUU+++UԀ+UU++UԀ+UԀ+U+Ԁ++UԀ+UUU+++UԀ+U+++UԀUUUԀ+UԀ+U+++Ԁ+U+UԀ+U+UUU+U+UUU+U+++UԀpppppp+Ԁ++Ԁ++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀU+++ԀU++UU++UԀU++UԀ+UԀ+UԀppppppU++++UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UUUU+U+Ԁ+Ԁ++UԀUU+UԀ+UԀ+UԀppppppUU+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UUUUԀ+UԀ++UԀppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppptqsl-2.8.1/apps/help/tqslapp/example1.htm0000644000175000017500000000402015003421124020274 0ustar rmurphyrmurphyTQSL Station Locations: an Example

TQSL Station Locations: an Example

This example illustrates an operator with two Station Locations: one for his home QTH, and one for a holiday operation in another DXCC entity. Dave K1ZZ would be issued a Callsign Certificate for K1ZZ, and would define the following Station Location for his home QTH in Coventry, CT:
  • a Callsign Certificate: K1ZZ
  • a DXCC entity: Continental US
  • a State: CT
  • a County: Tolland
  • a Grid Square: FN31tt
  • a CQ zone: 5
  • an ITU zone: 8

Dave might name this Station Location K1ZZ-Coventry, incorporating both the callsign and the operating location for easy recall.

If Dave were to operate occasionally from the US Virgin Islands, he would obtain a Callsign Certificate for KP2/K1ZZ specifying the US Virgin Islands as its DXCC entity, and then define a second Station Location for a QTH in the town of Cruz Bay on the island of St. John:

  • a Callsign Certificate: KP2/K1ZZ
  • a DXCC entity: US Virgin Islands
  • a Grid Square: FK78oh
  • a CQ zone: 8
  • an ITU zone: 11
  • an IOTA Reference Number: NA-106

This Station Location might be named KP2/K1ZZ-CruzBay, again incorporating both the callsign and operating location.

When using TQSL to digitally sign a file of QSOs made from his home in Coventry, CT, Dave would select his K1ZZ-Coventry Station Location. When using TQSL to digitally sign a file of QSOs made from Cruz Bay, Dave would select his KP2/K1ZZ-CruzBay Station Location. TQSL would use this information to digitally sign the file and optionally upload it to LoTW.

tqsl-2.8.1/apps/help/tqslapp/expiration.bmp0000644000175000017500000066440615003421124020754 0ustar rmurphyrmurphyBMi6( hzzsm\WSOJG/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)@<9LHDe_[qje}up~zsm^YT/,)1/-򢟝1/-/,)HC@e^Zqjexr^YTοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿ墟IDAga\ga\-*'οοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿۢ-*'OJGXRO0.,οοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿ.,*B>;.+)οοοοοοοοͿͿͿͿͿͿͿͿͿͿР.+)-*'-*'-*'㦠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<WfTbSbSdSeTeSfSfSfShQiQiOiOiOiOiOiOiOiOiOiOjOiOiOiOiOiOiOiOiOiQhQhRgReReReSdSeSdTbTbXf>-*'-*'WѧI ~V٦IUJ ~VئIXԨJ {U|L ֤ | Y֫K ŀ } ëKYւYۧIYL֣Y֫K ŀ YժK VڦI z };HVHVGVGVGVGVFXDYDZCZCZC[C[C[C[C[C[VXhXUhXUhXUVYC[VXhXUhXUhXUVXC[C[C[C[CYCYCYCXEWFVFVGVHVHVHV;-*'-*' VJΰKTSKӢVץHWž{ {T|  KYL֣ ˆ KWLգXՅKRڦI | | ~ ~Uw 9Determining When a Callsign Certificate Will Expire

Determining When a Callsign Certificate Will Expire

Callsign Certificates are valid for 3 years. To determine when a Callsign Certificate will expire,
1.Start TQSL and select the Callsign Certificates tab, which lists your Callsign Certificates.
 
2.Click on the Callsign Certificate in question, and then click the Display the callsign certificate properties button; a Certificate Properties window will display the Certificate's expiration date:
  

A Callsign Certificate that has already expired is shown on the Callsign Certificates tab with an expired icon:  .

Once a day on startup, TQSL will inform you if a Callsign Certificate will expire within 60 days, and you will typically receive an email notification from the ARRL a few weeks before a certificate expires. tqsl-2.8.1/apps/help/tqslapp/expired.bmp0000644000175000017500000000206615003421124020216 0ustar rmurphyrmurphyBM66( 9999999999ssssss99999999ssssssOOOOOOOOOOsssTOddddddddggddTO?TQSL File Operations

File Operations

tqsl-2.8.1/apps/help/tqslapp/files-icons.htm0000644000175000017500000000327115003421124021002 0ustar rmurphyrmurphyTQSL LoTW Files and Icons

LoTW Files and Icons

LoTW uses four kinds of files, distinguished by Filename Extension.

  • on Windows, Windows Explorer displays these files with an Icon and Type:
    Filename ExtensionIconFile TypeCreated ByUsage
    .tq5 Callsign Certificate RequestTQSLCallsign Certificate Request File submitted to ARRL
    .tq6 Callsign CertificateARRLCallsign Certificate File referenced and managed by TQSL (cannot be backed-up, recovered, or moved to another PC)
    .tq8 Digitally Signed LogTQSL or logging applicationDigitally Signed Log File submitted to LoTW
    .p12 Personal Information ExchangeTQSLCertificate Container File managed by TQSL; can be backed-up, recovered, or moved to another PC
    .tbk TQSL BackupTQSLBackup File created by TQSL that contains all certificates, station locations, and preferences in a form that can be backed-up, recovered, or moved to another PC
tqsl-2.8.1/apps/help/tqslapp/glossary.htm0000644000175000017500000000445515003421124020437 0ustar rmurphyrmurphyTQSL Glossary of Terms

Glossary of Terms

ADIF (Amateur Data Interchange Format) -- A log file format that many logging applications can export. It is not necessary to view or modify ADIF files in order to use TQSL, but for more information, see http://adif.org.uk .

Cabrillo -- A log file format used for the submission of contest logs. It is not necessary to view or modify Cabrillo files in order to use TQSL, but for more information, see http://www.kkn.net/~trey/cabrillo .

Callsign Certificate -- A unique file issued by the ARRL to a user that is used to digitally sign a log file, thereby confirming its authenticity.

Digital Signature -- A cryptographic means of enabling a sender to convey information to a receiver in a manner that assures the receiver that

  • the information comes from the sender
  • the information has not been subsequently modified
      LoTW users employ the TQSL application to generate a digitally signed log file containing their QSOs for submission to LoTW.

Digital Signed Log File -- A log file that has been digitally signed by TQSL and can be submitted to LoTW.

Log File -- A file containing QSO records in either ADIF or Cabrillo format. Mode Group -- a collection of similar modes. The Phone mode group, for example, includes the modes AM, FM, and SSB. Other mode groups include CW, Data, and Image. Mode groups are defined in TQSL's Configuration Data.

Station Location -- a collection of information specifying a Callsign Certificate and an operating location:

  • a DXCC entity
  • a State
  • a County
  • a Grid Square
  • a CQ zone
  • an ITU zone
  • an IOTA Reference Number

tqsl-2.8.1/apps/help/tqslapp/index.htm0000644000175000017500000001446515003421124017705 0ustar rmurphyrmurphyTQSL Introduction

Introduction

TQSL is an application used to digitally sign and upload QSOs to the ARRL's Logbook of the World (LoTW) online service, and to manage the Callsign Certificates used when digitally signing.

TQSL accepts QSOs in a log file whose format is either ADIF or Cabrillo, which many logging applications can export. TQSL also includes a simple QSO Data Editor that can be used to create and edit log files in ADIF format.

To digitally sign the QSOs in a log file, TQSL requires you to present a Callsign Certificate issued to you by the ARRL, and requires you to specify the location from which you operated when making every QSO in that log file. To make this easy, TQSL lets you define and name a Station Location that specifies your operating location and optionally a Callsign Certificate.

TQSL provides the ability to map modes not defined by the ADIF standard to modes that it can recognize, and the ability to specify information about less popular Cabrillo formats that it needs to properly interpret the QSO data in a Cabrillo-format log file.

When you start TQSL, it will inform you if

When you start TQSL, it will check each existing Callsign Certificate and mark any expired entries on the Callsign Certificates tab with an expired icon  . If internet access is available, TQSL will also check the validity of each existing Callsign Certificate with LoTW, and mark any obsolete entries on the Callsign Certificates tab with a replaced icon  ; this over-the-internet check is made no more than once each day.

Getting Started with LoTW
Before you can submit QSOs to LoTW, you must first

Then you'll be able to

Secondary Callsign Certificate Operations

Secondary Station Location Operations

Configuration Operations

File Operations

Additional Information
tqsl-2.8.1/apps/help/tqslapp/installation.htm0000644000175000017500000000461615003421124021274 0ustar rmurphyrmurphyInstalling or Upgrading TQSL

Installing or Upgrading TQSL

The TQSL application used by LoTW is free to download and use, and is available for Microsoft Windows and Apple OS X. If you are running anti-spyware or anti-malware applications such as Bit Defender, configure these applications to allow TQSL to run.

Note : TQSL can submit digitally signed QSOs and Callsign Certificate requests to LoTW via the internet. The firewall or another anti-malware application on your computer may by default prevent TQSL: from accessing the internet. Consult the documentation for the application you're using to learn how to declare TQSL as "safe" so it can access the internet.

The current version of TQSL is 2.4.1 . If you have an older version of TQSL installed on your computer, you normally need not un-install it; installing the current version will replace the older version.

Installing TQSL on Microsoft Windows
TQSL will run on the following versions of Microsoft Windows:
  • Windows 2000
  • Windows NT
  • Windows XP (32-bit and 64-bit)
  • Windows Vista (32-bit and 64-bit)
  • Windows 7 (32-bit and 64-bit)
  • Windows 8 (32-bit and 64-bit)
  • Windows 10 (32-bit and 64-bit)
  • Windows 11 (32-bit and 64-bit)

Download TQSL 2.4.1 for Windows here .

Troubleshooting while upgrading from TQSL version 1.x

Installing TQSL on Apple OS X
TQSL will run on both PowerPC and Intel processors on OS X version 10.4 and later. Download TQSL 2.4.1 for OS X here .

Building TQSL for Linux
Linux users can build the software from the source code for the tqsllib library, and the TQSL 2.4.1 application, which is available here. ARRL does not maintain packages for the many Linux distributions. For assistance with obtaining a packaged version for your Linux distribution, contact your distribution's maintainer. tqsl-2.8.1/apps/help/tqslapp/key-concepts.htm0000644000175000017500000001105015003421124021165 0ustar rmurphyrmurphy Key Terms and Concepts

Key Terms and Concepts

ADIF (Amateur Data Interchange Format) -- A log file format that many logging applications can export that describes one or more QSOs. It is not necessary to view or modify ADIF files in order to use TQSL , but for more information, see http://adif.org.uk .

 

Cabrillo -- A log file format used for the submission of contest logs that describes one or more QSOs. It is not necessary to view or modify Cabrillo files in order to use TQSL , but for more information, see http://www.kkn.net/~trey/cabrillo .

 

Callsign Certificate -- A unique file issued to a user by the ARRL in response to a request  generated by the TQSL application that is used to digitally sign a log file, thereby confirming its authenticity. TQSL also enables you to view your Callsign Certificates and renew them before they expire.

 

Digital Signature -- A cryptographic means of enabling a sender to convey information to a receiver in a manner that assures the receiver that

  • the information comes from the sender
  • the information has not been subsequently modified
    LoTW users can employ the TQSL application to generate a digitally signed log file containing their QSOs for submission to LoTW, or they can use one of the many logging applications with this capability.
   

Log File -- A file containing QSO records in either ADIF or Cabrillo format. A Digitally Signed Log File  has been digitally signed by TQSL and can be submitted to LoTW.

 

LoTW Account -- the web page from which an LoTW user can
  • view the results of LoTW's processing of a digitally signed log file submitted to LoTW
  • view the status of each of your Callsign Certificates
  • view QSOs that have been submitted to and accepted by LoTW
  • view QSOs that have been confirmed by LoTW
  • view DXCC, VUCC, WAS, and WPX Award Credit
  • submit QSOs confirmed via LoTW for additional DXCC, VUCC, WAS, and WPX Award Credit
The username and password needed to log in to your LoTW Account are specified in the email message from the ARRL that conveys your first Callsign Certificate.

 

Mode Group -- a collection of similar modes. The Phone mode group, for example, includes the modes AM, FM, and SSB. Other mode groups include CW, Data, and Image. Mode groups are defined in TQSL's Configuration Data.

 

Station Location -- a collection of information specifying an operating location and optionally a Callsign Certificate. Station Locations can be created, modified, and deleted with TQSL. A Station Location specifies the following geographic information:

  • a DXCC entity
  • a State
  • a County
  • a Grid Square
  • a CQ zone
  • an ITU zone
  • an IOTA Reference Number

 

TrustedQSL -- a specification and library for digitally signed QSO records that is used in LoTW

tqsl-2.8.1/apps/help/tqslapp/load-certificate.htm0000644000175000017500000001140515003421124021764 0ustar rmurphyrmurphy Loading a Callsign Certificate From a File

Loading a Callsign Certificate From a File

1. Start TQSL and select the Callsign Certificates tab, which lists your Callsign Certificates .
 
   
2. Click the Load a Callsign Certificate button; in the Select Certificate file dialog that appears,
  1. Set Look in to the folder containing the file
  2. Set the Files of type selector (on OS X, set the Enable selector) to Callsign Certificate container files (*.p12)
  3. Click on the desired  Certificate Container file
  4. Click the Open button.
3.  In the Load Certificate file dialog, enter the passphrase you specified when you created the Certificate Container file (if any), and click the Next button; the New Passphrase dialog will appear.
4. In the New Passphrase dialog,
  1. If your computer is shared or publicly accessible, specify a passphrase in both textboxes; otherwise leave these boxes blank.
  2. Click the Ok button; the Load Certificate file dialog will display Loading complete .
5. In the Load Certificate file dialog, click the Finish button.

Note: when a Callsign Certificate is loaded, any pending request for a new Callsign Certificate with the same callsign is deleted, as are any expired Callsign Certificates for that callsign.

tqsl-2.8.1/apps/help/tqslapp/localization.htm0000644000175000017500000000207415003421124021257 0ustar rmurphyrmurphy Localizing TQSL

Localizing TQSL

In TQSL 2.4, the text that appears in TQSL's windows, dialogs, and error messages can be presented in Chinese, English, Finnish, French, German, Hindi, Italian, Japanese, Portuguese, or Spanish. Some of these translations were accomplished using Google Translate, and thus would benefit from improvements by fluent speakers.

If you'd like to help improve one or more translations for the benefit of all TQSL users,
  1. if you're not already a member, join the ARRL-LoTW Yahoo Group by sending an email message to ARRL-LOTW-owner@yahoogroups.com
  2. post a message on the ARRL-LoTW Yahoo Group that identifies the language(s) whose translation you'd like to help improve
You'll be connected with other users working on those languages so that the work can be efficiently distributed, and so that the results are available to the LoTW user community. tqsl-2.8.1/apps/help/tqslapp/login.htm0000644000175000017500000000130415003421124017672 0ustar rmurphyrmurphyLogging in to Your LoTW Web Account to View QSOs and QSLs

Logging in to Your LoTW Web Account to View QSOs and QSLs

You can log in to your LoTW Web Account to view your submitted QSOs and confirmed QSOs (QSLs) by directing a we browser to navigate to https://lotw.arrl.org/lotwuser/default, and to apply for DXCC, VUCC, WAS, and WPX award credits. If your computer has Internet access, TQSL can direct your web browser to navigate there: on the Main window's Log Operations tab, click the Log in to the Logbook of the World Site button. tqsl-2.8.1/apps/help/tqslapp/logopstab.bmp0000644000175000017500000253226615003421124020564 0ustar rmurphyrmurphyBM 6(? (r h' S1#L>8/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)?;8LGDe^Zpid|to@'xZNb][/,)1/-󢟝1/-/,)GB@d]YpidghhͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾̾碟HC@f`\qqq-*'ͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;οοοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳݢ-*'NIF```0.,ͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾Ϳ.,*B=;222ͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼̽̽;;οοοοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾ҡ-*(-*'ͿͿͿͿ-*'-*'ͿͿͿͿޡohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿ̾ohbohb-*'-*'ͿͿ̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohb뺺ohb-*'-*'̾̾̾̾ohb랞ohb-*'-*'̾̾̾̾ohb뎎ohb-*'-*'̾̾̾̾ohb|||vvvvvvxxxohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˼˼˼ohbohb-*'-*'˼˼˼˼ohb돏Ŀohb-*'-*'˼˼˼˼ohbuuuohb-*'-*'˼˼˼˼ohbsssohb-*'-*'˼˼˼˼ohb{{{ohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼̽̽;ohbohb-*'-*'̽̽;;ohb½½ohb-*'-*'̽̽;;ohbohb-*'-*'̽̽;οohbohb-*'-*'̽;;οohb``ohb-*'-*';;οohb``ohb-*'-*';;οohb66·`·6```666`·66``666`·66`6``6ohb-*'-*';οohb`666·`6666·6·`6`66·6·`66·66``6Ϋ`6`·66ohb-*'-*';οohb``66·66·66·66·6666``6666`6`666ohb-*'-*'οohb``6666·66·6666``6666`6Ϋ6666ohb-*'-*'οohb``66``66·6666`6``66``6Ϋ```66ohb-*'-*'ohb``6·666·6``6666666666`66ohb-*'-*'ohb6`·``666666ohb-*'-*'ohb6·6666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉ohbͿ̾-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿ̾-*'-*'ohb𕌉䏏ohbͿ̾;-*'-*'ohb𕌉uuuuuuohbͿ;;-*'-*'ohb𕌉ppp                     pppohbͿ̾;̽-*'-*'ohb𕌉ppp                        pppohbͿ̾̽̽-*'-*'ohb𕌉ppp               )          pppohb̾̽̽˼-*'-*'ohb𕌉ppp           )) * * * * * * *     pppohb;̽˼˼-*'-*'ohb𕌉ppp            * *((0((01-/1-/1-/1-/1-/1-/((0'#&     pppohb̽̽˼˼-*'-*'ohb𕌉ppp           * *((01-/738?;B?;BDBHDBHDBHDBHDBH?;B?;B7381-/1-/'#&   pppohb̽̽˼˼-*'-*'ohb𕌉ppp          * *((0*1:?;BDBHCHTTKQZSXZSXeVXeVXeVX`NOTKQYECR?=F76=/.2(''#&  pppohb̽˼˼ʻ-*'-*'ohb𕌉ppp        ) *((0*1:738DBHTKQZSXi\bZSXe`]e`]e`]e`]e`]e`]eVXTKQ`NOTKQR?=F761-/'#&  pppohb˼˼ʻʻ-*'-*'ohb𕌉ppp         *((0*1:?;BTKQZSXTYfe`]hegnonlqunonnonnonnonhege`]e`]DBHTKQ`NOYEC?;B=/.'#&   pppohb˼˼ʻʻ-*'-*'ohb𕌉ppp        *((0*1:?;BTKQeVXe`]hegheguwxuwxuwxuwxuwxuwxuwxe`]none`]ZSXeVXCHT738aKH?;B=/.'#& pppohb˼˼ʻʻ-*'-*'ohb𕌉ppp        *((0*1:?;BTKQi\be`]nonuwxuwxlqu{{{uwxnonheg?;BZSXeVXhegheg?;B((0((0`NOR?==/.'#& pppohb˼ʻʻʻ-*'-*'ohb𕌉ppp      ) **1:?;BTKQeVXe`]lquuwx{e`]?;BgguvgguhegTYfDBH*1:*1:ZSXCHT((0((0aKHR?=1-/(  pppohbʻʻʻʻ-*'-*'ohb𕌉ppp       *((0738DBHZSXe`]TYfnonhegTYf/CHTTYfJP\uwxJP\TYfgguCHTCHT?;BDBHnonnone`]738'#&YEC=/.2(' pppohbʻʻʻʻ-*'-*'ohb𕌉ppp     ) **1:?;BTKQeVXZSXuwxlquuwx  ?;B{KervlquTYfCHT*1:ZSX{e`]e`]e`]((0((0((0R?==/.(  pppohbʻʻʻʻ-*'-*'ohb𕌉ppp      *((0738DBHeVXZSXuwx{TYfDBH//CHT{TYfTYfnonCHTTKQZSXnonheg?;B738heg7381-/?;BaKHR?=F762('2(' pppohbʻʻʻʻ-*'-*'ohb𕌉ppp      **1:?;BTKQe`]{hegJP\gguSa//'#&oZZoZZoZZhQOhQOaKH܇sthQOܨaKHYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp     **1:DBHZSXnonuwxgguJP\p//JP\stxegoUQoZZhQOYEChQOaKHR?=aKHYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp    )((0738DBHi\bxegCHTlqu/ TYf{}nkxegoZZoUQoUQhQOhQOoUQxegoZZaKHYECaKHaKHoUQhQOYECaKH=/.uwxpppohbʻʻʻʻ-*'-*'ohb𕌉ppp     *((0738DBH}nkhegi\buwxJP\prZSXp/SavCHTCHTDBH?;BCHT?;B?;BZSXDBH738((01-/'#&'#&aKHF762(' pppohbʻʻʻʻ-*'-*'ohb𕌉ppp   *((01-/?;BDBHTKQxstlqu*1:'#&TYfJP\JP\JP\DBH?;B?;B?;BTKQDBH7381-/1-/1-/738TKQhQOF76F762('( pppohbʻʻʻʻ-*'-*'ohb𕌉ppp 1-/KerCHTCHTJP\TYfi\bststpTYf{hegheg*1:Saggu{gguKerJP\CHTi\beVXTKQeVXpJP\eVXDBHTKQhQOTYfSaoZZaKHJP\DBH*1:R?=1-/*1:YECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp  YEC`NOeVXLoZZpxegVSai\bxegstgguhegxjrhegi\bSai\bi\boZZeVXpeVXhQOe`]hQOoUQaKHaKHYECYECF76pppohbʻʻʻʻ-*'-*'ohb𕌉ppp  R?='`NO738eVXi\bxegxegxegxegsToLgguggu'i\bxegxeg/xjrTKQeVX'JP\oUQoZZF76oUQaKHYECF76pppohbʻʻʻʻ-*'-*'ohb𕌉ppp R?='`NO'#&?;BoZZ}nkstLxeggguNmpr{'xjrheg'st'oZZDBHTKQl/paKH2('oUQ'aKH'pYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp R?='`NO *738oZZ'}nke{'lqu{xjrexjrYR}nk'eVXDBH`NOYLY`NO2('oUQ'aKHLYEC2('pppohbʻʻʻʻ-*'-*'ohb𕌉pppR?='`NO ((0eVXest}nkxe}nklђprxjr{e{{LstqKereVXhQOe}nkhQO'hQOhQOoUQeYECYECYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp aKHeaKHF76'#&YECLstRlчststxjrъ{xjrst{LststLxegi\beeVX`NOQoUQeaKHaKHYECYECYEC=/.pppffffohbʻʻʻʻ-*'-*'ohb𕌉ppp2('aKHaKHaKHR?= ((0hQOoZZstst{ststxegxjr{stxegi\beVXZSXoZZi\bhQOR?=ZSXoZZaKHhQOR?=aKHYECYECYECYECYECR?=pppffffohbʻʻʻʻ-*'-*'ohb𕌉ppp 1-/R?=hQOɿÚuwxssgzpr?;BR?=DBH1-/1-/DBH aKHR?=2('ppp:f:ff:::ې::::fې::ffff:::::ې:::f:ff::::f:f::۶fې::f::fff:::::ې:::ې::f:f::::fff:::::ې::fې:::ohbʻʻʻ˼-*'-*'ohb𕌉ppp    ((0738R?=hQOȻɿ䶨ЌlquTYfTYfTYfgzBZNm?;B738YEC1-/2('2('aKHF762('  ppp::ff:۶f:fې::::ې::::f:ff:۶ff:::::ff::ff:۶f:fې::ې:::۶fff:۶fff:۶f::fې:ff:۶f::f:::::ff:f:::ېf:::ې:ff:۶f:::::fې:ې:f:::ې::ېf:ffohbʻʻ˼˼-*'-*'ohb𕌉ppp   2('738DBH`NO愆prU~prToTYfssgzTo1-/R?=?;BYECF761-/(  ppp::::f:f:::::ې::::::ې::f:::ې::::ې::::::f:f:::ې::f:۶::f:۶::f:۶:::f::f:::::ې::::ې::fffff۶ې:fې::f:۶::::ې::::ff۶::ې::ې::ohbʻʻ˼˼-*'-*'ohb𕌉ppp    2('F76R?=`NOllU~U~YECgzgzgzTKQZSXZSXYECF76=/.(  ppp::::f:۶::::::ې::::::ې::f:::ې:::::f::::f:۶::::ې::f:۶::f:۶::f:۶:f::f:::::ې:::::ff:f:f:f:::f:۶::::ې::::ff::ې::ې:fohbʻʻ˼˼-*'-*'ohb𕌉ppp   2('738R?=aKH擳撍sspr}nk`NOYECF76=/.(  ppp::ff:۶fff:::::ff:::۶ff:۶f::ې:ff:ff::::ff:۶fff::::ې:ې:ff:۶fff:۶f::f:ff:۶f::::ې:ff:ff:::ې:fې:fffff:۶f:f::ff::ff::ې::۶ff::ohbʻ˼˼˼-*'-*'ohb𕌉ppp  '#&1-/F76R?=YEC`NOȻɴݨxxxaKHYECF76=/.2('(  ppp:::f::::ې::ff:ې::f:ff:::ff::ې:::f::f:::f:ې:f:f::f:ې:ff::ff:::ff::ې:fېfffې:fې::f::ff۶::ې::ff:::ې:::ېohb˼˼˼˼-*'-*'ohb𕌉ppp  '#&2('=/.F76R?=R?=YECaKHaKHaKHaKHaKHYECR?=F76=/.2(''#&  ppp::::::ې::::::::f:::ې::ff::::f:::::::fېff::ohb˼˼˼˼-*'-*'ohb𕌉pppYECYEC2('YECYECYECYECYECYEC aKHF76aKHaKHhQOaKHhQOhQOaKHhQOhQOhQOR?==/.1-/2('(    ppp::::::::ې:::::::::fې::ې::::::ېff:::::ې:::ې::ohb˼˼˼˼-*'-*'ohb𕌉pppR?=YEC R?=YECYECYEC2('YECF76R?=}nkYECsthQOaKHaKHR?=(   ppp::::::ff::::::ohb˼˼˼˼-*'-*'ohb𕌉pppR?=YEC YECYECYEC=/.YECF76aKHF76aKHaKHaKH2('(   pppohb˼˼˼˼-*'-*'ohb𕌉pppYECR?=YECYECR?=YECYECYEC YECF76stF76stYECYEC pppohb˼˼˼˼-*'-*'ohb𕌉pppF76YECYECYECYECYECYECYECYECYECYEC2('YECYECYECYECYECYECYECYEC( pppohb˼˼˼˼-*'-*'ohb𕌉ppppppohb˼˼˼˼-*'-*'ohb𕌉ppppppohb˼˼˼˼-*'-*'ohb𕌉ppppppohb˼˼˼˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉uuuuuuohb˽˽˽˽-*'-*'ohb𕌉葑ohb˽˽˽˽-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb˽˽˽˽-*'-*'ohb𕌉䏏ohb˽˽˽˽-*'-*'ohb𕌉uuuuuuohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉pppTTT````````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUUUpppohb˽˽˽˽-*'-*'ohb𕌉pppSSSUUUpppohb˽˽˽˽-*'-*'ohb𕌉ppp]]]naaapppohb˽˽˽˽-*'-*'ohb𕌉ppp___TxE]6\ps___pppohb˽˽˽˽-*'-*'ohb𕌉pppaaa氽*Uk*21B*[tSv```pppohb˽˽˽˽-*'-*'ohb𕌉pppcccpCfxYdG)a}?iaaapppohb˽˽˽̾-*'-*'ohb𕌉pppeee8d{dވރ]XtX{aaapppohb˽˽̾̾-*'-*'ohb𕌉pppggg싢0hߝ"uNnDmaaapppohb˽˽̾̾-*'-*'ohb𕌉pppiiiBj~j["wQr2_vaaapppohb˽˽̾̾-*'-*'ohb𕌉pppkkk)]uׁR&"W{ Qk{aaapppohb˽̾̾̾-*'-*'ohb𕌉pppmmmWv,dgr\*!]Mha~aaapppohb̾̾̾̾-*'-*'ohb𕌉pppooo³e'\xare/" dKiMoaaapppohb̾̾̾̾-*'-*'ohb𕌉pppqqq扡(ZtVsk8"!mLkDkaaapppohb̾̾̾̾-*'-*'ohb𕌉pppsss윰1`xKrnA"!tQr6cyaaapppohb̾̾̾̾-*'-*'ohb𕌉pppttt3`v@~pqK#"|Ux&Voaaapppohb̾̾̾̾-*'-*'ohb𕌉pppwww黻ÿ:bv5qmsV&"\Ni}```pppohb̾̾̾̾-*'-*'ohb𕌉pppxxxÿJm+eir_+! bNkd```pppohb̾̾̾̾-*'-*'ohb𕌉pppzzz°^}&^{brf1"!jLkOt```pppohb̾̾̾̾-*'-*'ohb𕌉ppp|||&[vYrl:"!$q|Mx@^pppohb̾̾̾̾-*'-*'ohb𕌉ppp݀좳.\tAqqQk܉j  ?gpppohb̾̾̾̾-*'-*'ohb𕌉ppp݂ÿ5_t:u۔^~  :lpppohb̾̾̾̾-*'-*'ohb𕌉ppp݄¿Ch|Ltޝ9>  @]pppohb̾̾̾̾-*'-*'ohb𕌉ppp놆ÿ]~>h聁TT.. Aapppffff::ffohb̾̾̾̾-*'-*'ohb𕌉ppp눈v0]}円__884 A\pppffff::ffohb̾̾̾̾-*'-*'ohb𕌉ppp뉉务2_|uN^Csppp:f::::fff:::fې:::fff:::ې:::::::f::ې:f۶::::ې::ې::ې:::::f::fې:::f:ې::::ې::ې::::f:fff:::ې::::fff::::ff::::f::ې:ffff:::fff:::ې::ې::::f:ohb̾̾̾̾-*'-*'ohb𕌉ppp싋游覷KqKhC^ppp:fff۶::ff:::ې:ېf:ff:::ې:ې:::::ff:ې::ff::ې::::ې::ې::ff::۶ff:۶f::ېf:::::fې::ې::::ې::ې:::::fې:::::ې:ې:::::fې:ې:f::ې:ې::f:ې::ff:۶f:::ې::fې:ې:ې::ې:::::fې::ohb̾̾̾̾-*'-*'ohb𕌉ppp썍⁂ppp:fې::::::ې::ې::ې::::ې::ې:::::ې:::::ې::ې::::ې::ې::ې::::ې::f:۶::ff۶::fې:::ې::::ې::ې::::fې:::::ې::ې::::ې::::::::ې:::f::ې::f:۶::ې::ې::::ې::ې::::fې:::ohb̾̾̾̾-*'-*'ohb𕌉ppp쏏ppp:::::f::ې::ې:f::ې::::::۶:fې::ff::ې::::ې::ې:::f::ې::f:۶::ff::ې::::ې::::ې::ې::::ې::::::ې::::ې::::::::ې:::f::ې::f:::ې::::ې::ې::::ې::::ohb̾̾̾̾-*'-*'ohb𕌉ppp쑑pppf::fff::ff::۶ff::ff:ff:::ېf:ې::ff::ې:f::ې::ې::ff::::۶ff:۶f:ff:ff۶::ff:::ff:ې:::ff:ff::ff:ff:ff::::::::ېff۶::ff:۶fffff::ې:::ff:ff::ohb̾̾̾̾-*'-*'ohb𕌉ppp풒ppp::ې::ff::ې::ې:ې:::ې::ې::ff:ې:fې:::::ې::ې::f:ې::ې::ېf::f::ff::ې::ې::ې::ff::ې::ff::::ې::ff::::::f:::ff::ې:f::ې::ې::ې::ff::ohb̾̾̾̾-*'-*'ohb𕌉ppp픔ppp:fff::f::::fې:::f::ې::f:::f:::::::ohb̾̾̾̾-*'-*'ohb𕌉ppp햖pppff:::::f:f۶:f:fې::ې:::fې::::::::::ې::ohb̾̾̾̾-*'-*'ohb𕌉ppp࿿pppff::ff::::::ohb̾̾̾̾-*'-*'ohb𕌉ppp߾pppohb̾̾̾̾-*'-*'ohb𕌉ppp߿pppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉ppp𜜜텅pppohb̾̾̾̾-*'-*'ohb𕌉ppp𝝝톆pppohb̾̾̾̾-*'-*'ohb𕌉ppp𝝝톆pppohb̾̾̾̾-*'-*'ohb𕌉ppp񙙙ကpppohb̾̾̾̾-*'-*'ohb𕌉ppp񞞞pppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉uuuuuuohb̾̾̾̾-*'-*'ohb𕌉葑ohb̾̾̾̾-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb̾̾̾Ϳ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉ohb̾ͿͿͿ-*'-*'ohb𕌉ohbͿͿͿͿ-*'-*'ohb𕌉ohbͿͿͿͿ-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿͿͿͿ-*'-*'ohb𕌉䏏ohbͿͿͿͿ-*'-*'ohb𕌉uuuuuuohbͿͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉pppҎpppohbͿͿͿͿ-*'-*'ohb𕌉pppҐyyypppohbͿͿͿͿ-*'-*'ohb𕌉pppxxxxxxxxxxxxxxxxxxxxxpppohbͿͿͿͿ-*'-*'ohb𕌉pppԈxxxxxx000---555CCCxxxpppohbͿͿͿͿ-*'-*'ohb𕌉pppԃxxxxxxJJJJJJxxxpppohbͿͿͿο-*'-*'ohb𕌉pppԓxxxxxxJJJJJJxxxpppohbͿͿοο-*'-*'ohb𕌉ppp֖¼xxxxxxJJJJJJxxxpppohbͿͿοο-*'-*'ohb𕌉ppp֖Ч˸xxxxxxJJJJJJxxxpppohbͿͿοο-*'-*'ohb𕌉ppp֖٣ʱxxxxxxJJJJJJxxxpppohbͿοοο-*'-*'ohb𕌉ppp֖ܿ«xxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppؖݦʻxxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppؖޛɞxxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppؖߝҟxxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږ௯לyyyxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږԠʫʓyyyyyyJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږӳ󛛛zzzyyyJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږ῿zzzzzzJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppۖ⽽{{{zzzKKKKKKxxxpppohbοοοο-*'-*'ohb𕌉pppۖNo||||{{{KKKKKKyyypppohbοοοο-*'-*'ohb𕌉pppۖRw&V%S||||||LLLKKKyyypppohbοοοο-*'-*'ohb𕌉pppݖά2_rŐJq=_||||||LLLLLLzzzpppohbοοο-*'-*'ohb𕌉pppݖ&V^@jiŠ3_bt}}}|||LLLLLLzzzpppohbοο-*'-*'ohb𕌉pppݖ;eJrQwD0]d$T~}}}}}}MMMLLLzzzpppohbοο-*'-*'ohb𕌉pppݖxÕ:ehɊIDDMtNu5_~~~}}}))))))JJJMMM{{{pppohbο-*'-*'ohb𕌉ppp떖+Yn͎)XCDDIeŇ8dg~~~~~~111///111BBB|||pppffff::ffohbο-*'-*'ohb𕌉ppp덗*Y_ȂHqCCCCD)Ykȋ'V~~~~~~~~~}}}}}}|||pppffff::ffohb-*'-*'ohb𕌉ppp>>;;;???\\\pppohb-*'-*'ohb𕌉pppDOO? ? ? ?8d{{{JJJ;;;GGGpppohb-*'-*'ohb𕌉pppK @<<<<<<<<EDn>>??8d~ޜMpppohb-*'-*'ohb𕌉pppNF99999999 ?MM~Cm>>>H2_𜜜pppohb-*'-*'ohb𕌉pppNN 844444445L;f @=> A`̓N𛛛pppohb-*'-*'ohb𕌉pppNL 4...... 3M2_== B}ޙOpppohb-*'-*'ohb𕌉pppLM1^:++++ 5Lx==NߜOpppohb-*'-*'ohb𕌉pppdʆܰ%S@?F/\쭕 A B_c΅Mpppohb-*'-*'ohb𕌉pppMqΐˁ㝛p3`p̑4aNpppohb-*'-*'ohb𕌉ppp+[ަխvٔ8dNpppohb-*'-*'ohb𕌉pppLL Q(X)XPMpppohb-*'-*'ohb𕌉uuuuuuohb-*'-*'ohb𕌉葑ohb-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ãS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=????????????????????????????????????????????????????????????????????????[>Uohb-*'-*'ohb𕌉<>!!!>= """?$?GIHFDHMP R T V W S T UTPI@"?>EL T\ Ja'f+j.m0o1u7splgb] Z VN@>DL V_gVj1q5v9y;z<~A"{upic] Y T&&&@ D H J JO3-%zrib\ V ^9@̜4(r>QΥ;ŕ,!{q`***AjBpHa _i s }&.6+Σ'ӬJ׶dܿ{ȍЛצݫkմۛՉsܼ[ҬBǜ<\]+kE---B` zSyR[e o z%/ū9ʱAOʢҫ;׵ZܽrƅΕՠڨެߧܟؑh׵OͥCǝayEnGnFBc;iBkDpHxQZe p |(è4ʱ@йKԿT]eg`ŕ4ڻJܽgẏѐԖ֗֔Ӌmٺ]ԱmęA~g |U{SBxRvP{T^j u".Ȯ:ζFӽQ[dlrt|̤_cmx}zrqܿ|̪ŲJ2q `}XF<ffff::ffohb-*'-*'ohb𕌉!r ` F<::ې::f:ې::::fff:::::ې:ff:fff:::ې::::fff::::ff::::f::ې:ffff:::fff:::::fې:fff::::ff:::fې::f::ې::ې::fff:::fff:::ې:ffff:::ې::ې::::ېfې::f:f:f:::ې::fohb-*'-*'ohb𕌉Ϸ@ҼHQX_cfgfc_YRҽHՇqӾ[ȱL-*'-*'AljkVVEV; MP֤QMاQ~‚οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾ͿͿ̾̾̾;;̽̾̾ͿͿ̾̾ͿZVR¶¶¶÷~qlfVShXUhXUhXUhXUhXUhXUhXUhXUhXU~qløĸĹĹøĸunjŹŹŹŹŹźyfVSfVSfVSfVSfVSfVSfVSfVSfVSfVSzƻƻƺƺƺƺ%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD]WYhXUhXUhXUWYD]D]D]D]D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'8HxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvwyyyyʮ'-J-*'-*'cV7<8. 13οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾ͿͿͿͿ[WS℁~fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk||||||||||}}}ͱ*0L-*'-*'  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿοͿͿͿ[WS冃fVSiYVFO䄌τфӄӄփ׃كۃރ߃ₐゐ悐灐灐遐omhYVfVShYVom遏邏炏悏わハ჎߄݄ۄلׅօӅӅѵ.3N-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿͿ[WSꊇfVSiYVOX萙אِِؐݐݐᐚ䐚君珛鏛돛쎛펛펛fVSfVSurfVSfVS펚폚폚돚鏚萚呛呛㑛ᑛߑݑّّܑؼ49Q-*' οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ[WS댉䜒fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST^阠٘ۘݘݘᘢ㘢嘢嘣阣阣엣헣yvfWUfWUfWUyuyufWUfWUfWUyu혢혢뙣陣虣噣噣㙢ᙢߙݙݙ8=S᠞+*)A/.,*οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ[WSZb렦ݠݠࠦᠨ㠨䠨堩蟪韪럪ퟪퟫ젪頪顩衩塩䡧㡧ᡧࡧ;@U.,*GECC0.+(οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾Ϳ[WS_f᦬᦬᦬㦭夭央褮餮뤯쥮륮饮祮姭䧭㧭᧭?BV衟-*'b`](,οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾[WT`iᬱᬲ䬳嬳嬴謴髴骳荒הּ쬴鬳鬳笳嬳嬲䬱?DY렝b`]{xua@=4$ .+(.,*cbadmBFZ/-+.+(c`^{xuuTTR73% -*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'\ZWmjg{tqsl-2.8.1/apps/help/tqslapp/lotw.htm0000644000175000017500000000352715003421124017560 0ustar rmurphyrmurphyLogbook of the World

Logbook of the World

Logbook of the World (LoTW) is an online service that enables you to

  • electronically submit contacts (QSOs) for confirmation
  • view your submitted QSOs and resulting confirmations online
  • view your  DXCC , VUCC , WAS , and WPX award progress online
  • electronically submit confirmations for credit toward DXCC, VUCC, WAS, and WPX awards
Before submitting QSOs to LoTW, a user must obtain a unique Callsign Certificate from the ARRL, and define a Station Location that defines the location from which the QSOs were made.

To submit a QSO-bearing log file to LoTW, a user presents that file with his or her Callsign Certificate and Station Location to an ARRL-supplied application called TQSL. TQSL generates a digitally signed file, and optionally submits it to LoTW by uploading it over the internet. The Callsign Certificate authenticates the source of each uploaded QSO. In combination with LoTW's double blind approach to QSO matching, which prevents users from seeing what other users have uploaded, this maintains the integrity of the QSO verification process that has long been the hallmark of ARRL awards.

tqsl-2.8.1/apps/help/tqslapp/main.htm0000644000175000017500000000742015003421124017513 0ustar rmurphyrmurphyTQSL Introduction

Introduction

TQSL is an application used to digitally sign and upload QSOs to the ARRL's Logbook of the World (LoTW) online service, and to manage the Callsign Certificates used when digitally signing.

TQSL accepts QSOs in a log file whose format is either ADIF or Cabrillo, which many logging applications can export. TQSL also includes a simple QSO Data Editor that can be used to create and edit log files in ADIF format.

To digitally sign the QSOs in a log file, TQSL requires you to present a Callsign Certificate issued to you by the ARRL, and requires you to specify the location from which you operated when making every QSO in that log file. To make this easy, TQSL lets you define and name a Station Location that specifies:

  • a Callsign Certificate
  • specifying the callsign you used over the air
  • a DXCC entity
  • a Primary Administrative Subdivison (e.g. an Oblast, Province, or State)
  • a Secondary Administrative Subdivison (e.g. a County)
  • a National Park included in the ARRL's National Parks On The Air (NPOTA) event
  • a Grid Square
  • a CQ zone
  • an ITU zone
  • an IOTA Reference Number

This collection of information is comparable to what you'd print on your QSL cards. It can be given a name that is presented to TQSL when uploading QSOs made with that callsign from that location. For an example, click here.

TQSL provides the ability to map modes not defined by the ADIF standard to modes that it can recognize, and the ability to specify information about less popular Cabrillo formats that it needs to properly interpret the QSO data in a Cabrillo-format log file.

When you start TQSL, it will inform you if

When you start TQSL, it will check each existing Callsign Certificate and mark any expired entries on the Callsign Certificates tab with an expired icon  . If internet access is available, TQSL will also check the validity of each existing Callsign Certificate with LoTW, and mark any obsolete entries on the Callsign Certificates tab with a replaced icon  ; this over-the-internet check is made no more than once each day.

Getting Started with LoTW
Before you can submit QSOs to LoTW, you must first

Then you'll be able to submit a Log File to LoTW via the Internet . tqsl-2.8.1/apps/help/tqslapp/moving.htm0000644000175000017500000001445015003421124020067 0ustar rmurphyrmurphyCopying Callsign Certificates and Station Locations from One Computer to Another

Copying Callsign Certificates and Station Locations from One Computer to Another

If you have TQSL running on one computer (the source) and wish to set it up on a second computer (the destination), you must

Copying All Callsign Certificates and Station Locations to Another Computer
You can copy all of your Callsign Certificates and Station Locations at once by
1.Directing TQSL to create a Backup File.
2.Copying the Backup File from the source computer to the destination computer.
3.On the destination computer, directing TQSL to restore Callsign Certificates, Station Locations, and Preferences from the copied Backup File.

Copying One Callsign Certificate to Another Computer
A Callsign Certificate (.tq6) file cannot be copied from one computer to another. Only a Certificate Container (.p12) file can be copied in this manner.
1.If you have not created a Certificate Container file for the Callsign Certificate you wish to copy,
   1.aStart TQSL on the source computer.
   1.bOn the Callsign Certificates tab, click on the Callsign Certificate you wish to copy, and then click the Save callsign certificate button.
   1.cIn the Enter the name for the new Certificate Container file dialog,
       1.c.1.Set Save in to C:\MyLotWCertificates
       1.c.2.Note the File name specified.
       1.c.3.Click the Save button.
   1.dIn the Certificate Container Passphrase dialog, leave the New passphrase and Enter again to confirm boxes empty unless you are using a shared computer, in which case you should specify the same passphrase in both boxes.
   1.eIn the Click the OK button
2.Copy the Certificate Container file from C:\MyLotWCertificates on the source computer to C:\MyLotWCertificates on the destination computer.
3.On the destination computer, startTQSL and select the Callsign Certificate tab, which lists your Callsign Certificates.
   3.aClick the Load a Callsign Certificate button; in the Select Certificate file dialog that appears,
       3.a.1.Set Look in to C:\MyLotWCertificates
       3.a.2.Set the Files of type selector (on OS X, set the Enable selector) to Callsign Certificate container files (*.p12)
       3.a.3.Click on the Certificate Container file you copied in step 2.
       3.a.3.Click the Open button.
   3.bIn the Load Certificate file dialog, enter the passphrase you specified when you created the Certificate Container file (if any), and click the Next button; the New Passphrase dialog will appear.
   3.cIn the New Passphrase dialog,
       3.c.1.If your computer is shared, specify a passphrase in both textboxes; otherwise leave these boxes blank.
       3.c.2.Click the Ok button; the Load Certificate file dialog will display Loading complete.
   3.dIn the Load Certificate file dialog, click the Finish button.
tqsl-2.8.1/apps/help/tqslapp/netproxy.htm0000644000175000017500000000315115003421124020454 0ustar rmurphyrmurphyConfiguring a Network Proxy for Internet Access

Configuring a Network Proxy for Internet Access

Some corporate or university networks may require TQSL to employ a Proxy Server to gain access to the Internet for submitting digitally signed QSOs or obtaining status information. If your organization's Network Administrator informs you that this is the case, he or she will provide you with an appropriate Proxy Address, Port Number, and Proxy Type; otherwise, you should not configure TQSL to employ a Proxy Server, as doing so could prevent TQSL from accessing the Internet. To configure TQSL to use a Proxy Server for Internet access,
1.Select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display its Preferences dialog.
2.Select the Preferences dialog's Network Proxy tab.
3.Check the Enable a Network Proxy box.
4.Enter the Proxy Address specified by your Network Administrator.
5.Enter Port Number specified by your Network Administrator.
6.Select the Proxy Type specified by your Network Administrator.

tqsl-2.8.1/apps/help/tqslapp/newp12pw.bmp0000644000175000017500000004520615003421124020244 0ustar rmurphyrmurphyBMJ*(6\H  }}bbb>>^^**RRnn66FFjj¾²zz~~ffvvZZJJ22""rvbb::..&&BBVVºNNrrjnz~¶nr~vz^bfjbfZ^FJ6:¶RVJN:>NRVZ26"&BF.2&* >B*.22bb>>&&¾ºVVJJzznnƾ7_5__3___3____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____ APAPAP A_____ AAMAAMAAM A_____ AMAAMAAMA A_____ AMAAMAAMA A_____ AMAAMAA.AA A_____ AMAAMAA.AA A_____ AMAAMAA.AA A_____ A"AAAAAAAAAAAAAAAAAAAAAAA A_____ A!AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA A_____ A AAAAA AAAAAAAAAAAAAAAAAAAAAAA A_____ A AAAA!AAA AAAAAAAAAAAAAAAAAAAAA A_____ A AAAA!AAA AAAAAAAAAAAAAAAAAAAAAA A_____ A AAAAA AAAAA AAAAAAAAAAAAAAAAAAA AAAAAAA A_____ A AAAAAAAAA AAAAAAAAAAAAAAAA A_____ A!AAA"AAAAAAAAA A!A A_____ A"AA"AAAAAAAA A!A A_____ AMAAMAAMA A_____ AMAAMAAMA A_____ AMAAMAAMA A_____ AMAAMAAMA A_____ ANAANAANA A_____ AOAOAO A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____A/A_____4AA_____3AAA_____7AA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA AAAAAAA_____ AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA_____ AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA_____ AA AAAAAAAAAAA AAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AA4A"AA_____ A A&A A#AA_____A/A_____A/A_____A/A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____ A A_____A/A_____(AAA_____(AAA_____(AAA_____ AAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAA AAAAAAAAAAAAA_____ AAAAA AAAAAAAAAAAA AAAAAAAAAAAA_____ A AAAAAAA AAAAAAAAAAAAA AAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAA AAAAA_____ AAHAA_____ AAHAA_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____"ANAA_____"AOAA_____"AOAA_____ AAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAA AAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAA_____ AAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____)AAAAAAA_____)AAAAAAA_____A/A_____A/A_____A/A_____A/A_____AAiA_____A AhA_____A!AgA_____ AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAA A_____ AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAA A AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA_____ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAA AAAAA A_____ AAAAAAAAAAAA AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA AAAA A_____ AAAAAAAAAAAAAAA AAAAAAA AAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A_____ AAAAAAAAAAAAAAAAA AA1AAAAAAAAAAAAAAAAAA A_____ AAAAAAAA A A AAAAAAA0AAAAAAAA AA A_____A/A_____A/A_____A/A_____A/A_____AFA$A A_____AGA$AA_____AHA$AA_____AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA AAAAA_____AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA_____AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA_____ AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA AAAAAAAAAAAAA_____ AA AAAAAAAAAEAA:A_____ AAAAAAAAAAAAAA>AAAA7A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____,AAAA_____,AAAA_____,AAAA_____ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWA_____ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AAAAAAAZA_____ AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA A AAAAAA^A_____ AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA A AAAAAAZA_____ AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA AAAAAAAZA_____ AA AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAA AAAAAAAAAAAAA AAAAA AAAAAAAZA_____ AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[A_____ AACAAAAAAAAAAAAAAAAAAAAAAaA_____ A ACAAAAAAAAAA AAAAAaA_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A_____A/A____3____ {{gmm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHY;;sr|zz____ mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHY;;sr|zz____    mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY____      mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY____     m(`8iy'b77qf 6nnaXX5p99c WW%u[<]Z:tt^$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY ____     m(`8 ' b77qf 6d&nnaXX5\p999WW%u[<Z:tt$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY ____    m(`88e'b 6d&nnaXX5 \pph99c!WWu[<<Z:tt$$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYYkkkk____   m(`8ie'b77qf 6&nnaXX5pph99c"WWu[<<Z:tt$$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY****____   m(`8ie'''b77qf 6&&nna55\\p9WWu[<<Z tt$$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY____   m(`8ie'b7 6d&nnaXX5%\p999W%u[<<Z$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY____   m( `8ie'b7q 6d&nnaXX55pp99cW%u[<<]Z:^$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY))____    m( `88 'b7q 6 d&nna XX55\\pph9cWW%%uu[[<]]ZZ::tt^^$$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYYllll____    m(`8y'b7qqf 6&nna55\\pph9cWW%%uu[[<]]ZZ::tt^^$$$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY++++____    mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY ____    mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY ____    mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHYY____ mm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHY;;sr|zz____ {{gmm(`8iye'b7qqf j6d&nnaXX5\\pph9cWW%%uu[[<]]ZZ::tt^^$VV NN22ooRR"PPDxxJ>/#MvF!L@1 I=.ECC,K?0 G--Q44TwBBUO33SHHY;;sr|zz___3___3__4_6_tqsl-2.8.1/apps/help/tqslapp/newpw.bmp0000644000175000017500000004416015003421124017717 0ustar rmurphyrmurphyBMpH&(4JF  ||bbb&&ZZBBvvjj66JJffRR¾²..bb~~rr>>vzVVnr^^NN ""**::22ºFFnnzzfjz~¶jn~RVZ^JNbfrvVZ^bBF¶>BNR*."6:FJ:>.226"&&&>>22JJbbVVzznn¾ºƾ5H3HH1HHH1HHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH ?P?P?P ?HHHHH ??M??M??M ?HHHHH ?M??M??M? ?HHHHH ?M??M??M? ?HHHHH ?M??M??.?? ?HHHHH ?M??M??.?? ?HHHHH ?M??M??.?? ?HHHHH ?"??????????????????????? ?HHHHH ?!?????????????????????????????? ??????? ?HHHHH ? ????? ??????????????????????? ?HHHHH ? ????!??? ????????????????????? ?HHHHH ? ????!??? ?????????????????????? ?HHHHH ? ????? ????? ??????????????????? ??????? ?HHHHH ? ????????? ???????????????? ?HHHHH ?!???"????????? ?!? ?HHHHH ?"??"???????? ?!? ?HHHHH ?M??M??M? ?HHHHH ?M??M??M? ?HHHHH ?M??M??M? ?HHHHH ?M??M??M? ?HHHHH ?N??N??N? ?HHHHH ?O?O?O ?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH?-?HHHHH4??HHHHH3???HHHHH7??HHHHH ??????????????????????????? ??????? ???????HHHHH ???????????? ???????????????????????? ????????????HHHHH ??????????????????????????????? ????????????HHHHH ????????????????????????????? ????????????HHHHH ??????????? ???????????????????? ????????????HHHHH ?? ??????????? ??????? ????????????????????????????????HHHHH ???????????????????????????????????HHHHH ??4?"??HHHHH ? ?&? ?#??HHHHH?-?HHHHH?-?HHHHH?-?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH ? ?HHHHH?-?HHHHH(???HHHHH(???HHHHH(???HHHHH ?????????????????????HHHHH ????????????? ??????????????????HHHHH ???????????????? ?????????????HHHHH ????? ???????????? ????????????HHHHH ? ??????? ????????????? ????????????HHHHH ?????????????????????????????????????HHHHH ???????????????????? ?????HHHHH ??H??HHHHH ??H??HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH*?)??HHHHH)??)??HHHHH-?*??HHHHH ?????????????????????HHHHH ???????????????????????????????HHHHH??????????????????? ??????HHHHH ????????????????????????HHHHH ? ??????????????????????????HHHHH ???????????????????? ???????????????HHHHH ???? ??????????????????HHHHH4?????HHHHH??????HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH ?R?`??R?HHHHH ?R?^????Q?HHHHH ?R?a??Q?HHHHH ?????????????????????? ????????????????????????????????????? ?HHHHH ??????????????????????????????????????????? ?????????????????????????????????????????????????????????? ?HHHHH ???????????? ?????? ?????????? ?????????????? ?????? ?????????????????????? ?????????? ?HHHHH ?????????????????????????????? ???????????????????????????????????????? ???????????? ?HHHHH ??????????????????????????????????? ???????? ????????????????????????????????? ????????????? ?HHHHH ?????????? ???????? ?????????????????????????????????????????????????&????????????????????????????? ?????????? ?HHHHH ????????????????????????????????????????? ?????????????????????!?HHHHH???????? ???? ???%?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH,?J?6?}?HHHHH,?J?7?|?HHHHH,?J?8?{?HHHHH ?????????????????????????????????????????v?HHHHH ???????????????? ?????????????????????????????????????????????z?HHHHH ??????????????? ??????????????????????????????? ?????z?HHHHH ??????????????? ???????????????????????????????????z?HHHHH ?????????????????? ?????????????????????????????????????y?HHHHH ?? ???????????????????????????? ?????????????????????????????????????y?HHHHH ????????????????????? ????????????????????????????y?HHHHH ??C??-? ??HHHHH ? ?C???? ??HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHHH?-?HHHH1HHHH zz4Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II];xw{yyHHHH Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II];xw{yyHHHH   Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]yHHHH    Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]yHHHH   Zl99e' ga6mm77f:: 888d%%^  \\<<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]] yHHHH   Zl 999' ga6mm77`:pp888d%oo  \\<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]] yHHHH   Zl99 e''na6 mm77`:p$b8d%oo  \\<<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]iiiiyHHHH  Zl9 ''na6mm7`f:"b8d%oo  \\<<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]((((yHHHH   Zl999''na6m7`f:phb8d%oo \\<<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]yHHHH   Zl999'nna6%77`:ppb88%oo <qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]yHHHH  Zl99 e'nna677`f::b88%%^  <<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]&&yHHHH   Zl9e'nnga67`f:pphb8d%oo^^ \\<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]kkkkyHHHH   Zl9e'nnga6m7`f:pphb8d%oo^^ \\<qqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]))))yHHHH   Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]] yHHHH   Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]] yHHHH   Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II]]yHHHH Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II];xw{yyHHHH zz4Zll9e'nnga6jmm7`f:pphb8d%oo^^ \\<ccqqSS3_PP--ssWW QQ1XX!!rrUUDK>vv0#VV **BuG"ML J=/EAA,R2O$N.FCC+t@@Y  T55[II];xw{yyHHH1HHH1HH2H4Htqsl-2.8.1/apps/help/tqslapp/pref-adi.htm0000644000175000017500000000711215003421124020254 0ustar rmurphyrmurphyAdding and Deleting ADIF Mode Mappings

Adding and Deleting ADIF Mode Mappings

Because new modes may not yet be specified in ADIF, and because LoTW may not accept all modes specified in ADIF, TQSL enables you to "map" a new mode to a mode or mode group recognized by LoTW. This most often takes the form of mapping a new digital mode CoolNewDigitalMode to the DATA mode group. Note that TQSL will refuse to map a mode that is accepted by LoTW.

Adding ADIF Mode Mappings
To create a mapping from a new mode to an existing mode or mode group,
1.Select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display TQSL's Preferences dialog.
2.In the Preferences dialog, select the ADIF Modes tab; TQSL will display any mappings you've already defined.
  

In the example shown above, when BPSK appears in the MODE field of an ADIF record during digital signing, the QSO will specify PSK31 in the digitally signed log file.

3.Click the Add... button.
4.In the Add ADIF mode dialog,
   4.aType the mode to be mapped into the ADIF Mode box.
   4.bSelect the mode to which the specified mode should be mapped in the Resulting TQSL mode list.
     

   4.cClick the OK button.
    
    Now, when MCW appears in the MODE field of an ADIF record during digital signing, the QSO will specify CW in the digitally signed log file. Were MCW a mode accepted by LoTW, TQSL would refuse to add the mapping when the OK button was clicked.

Deleting ADIF Mode Mappings
To delete a mapping that you've already specified, click on the list entry to select it, then choose Delete.
1.Select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display TQSL's Preferences dialog.
2.In the Preferences dialog, select the ADIF Modes tab; TQSL will display the mappings you've already defined.
3.Click on the entry for the mapping you wish to delete, and then click the Delete button.

tqsl-2.8.1/apps/help/tqslapp/pref-adi1.bmp0000644000175000017500000154506615003421124020343 0ustar rmurphyrmurphyBM66(<pppeeeZZZDDD:::/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)?;8LGCe^Zpid|tnhhhZZZFFF/,)1/-󢟝1/-/,)GB?d]Yphd^^^FFFοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺɻʼ˽̾̾Ϳ碟HC@f_[LLL-*'οοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳޢ-*'NIFAAA0.,οοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾.,*A=:"""οοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿӠ-*(-*'-*'-*'㥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𫫫𫫫𫫫ohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuu𫫫uuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuu𫫫uuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuu𫫫ohb-*'-*'ohb䏏𫫫䏏𫫫䏏𫫫ohb-*'-*'ohbuuuuuu𫫫uuuuuu𫫫uuuuuu𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppvv00Ҵppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppww00Զppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppyy11ָyy11ָy1y1yy11y1V֙ppp𫫫ppp1y֙Vyy11ָ֙Vy1ppp𫫫ppp1yVVVV1y11yy11ָyy11ָy1֙Vy1y1yy11ָppp𫫫ohb-*'-*'ohbpppzz11عzz11عWؚWzz11zz11عWz1عppp𫫫ppp1zz1عؚWz1zz11ع1zz1ppp𫫫ppp1zWؚWWzz11ع1zz1zz11عzz11ع1zؚWؚWؚWzz11عppp𫫫ohb-*'-*'ohbppp{{11ڻ{{11{{11ڻ{{11{{11ڻڜ1Wڻ{ppp𫫫pppڜ1Wڻ{{{11{{11ڻ1{Wppp𫫫pppڜ1Wڻ{{11ڻ{{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻppp𫫫ohb-*'-*'ohbppp{{11ۼ{{11{1X{{11{{11ۼۜ1Xۼ{ppp𫫫ppp{{11ۼۜXX{11X{{{1ۼppp𫫫ppp{{11ۼ{1{1{{11ۼ{{11{{11ۼ{1X{{11ۼppp𫫫ohb-*'-*'ohbppp}2}2ݾYYݝ}}22}}22}22ݾ}YYݝppp𫫫ppp}}22ݾݝYY}22222ݾ}ppp𫫫ppp}Y2ݝYݝY}2ݝYY}2ݾ2}ݝYݝYYݝ}}22}}22ݾppp𫫫ohb-*'-*'ohbppp5555Ʉ55Ʉ55^555^^ppp𫫫ppp5^Ʉ55Ʉ5555Ʉppp𫫫ppp55Ʉ55Ʉ55^^^^55Ʉ55ppp𫫫ohb-*'-*'ohbppp555555ppp𫫫ppp5ʄ5^ʄ555ʄ55ʄppp𫫫ppp5^^^55ppp𫫫ohb-*'-*'ohbppp555555ppp𫫫ppp5̅555__ppp𫫫ppp__55ppp𫫫ohb-*'-*'ohbppp55ppp𫫫pppppp𫫫ppp55ppp𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbuuuuuu𫫫uuuuuu𫫫uuuuuu𫫫ohb-*'-*'ohb葑𫫫葑𫫫葑𫫫ohb-*'-*'ohb𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𫫫𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𫫫𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𫫫ohb-*'-*'ohb𫫫𫫫𫫫ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohbͿ-*'-*'ohbohbͿ-*'-*'ohbohbο-*'-*'ohbohbͿ;-*'-*'ohbohbͿͿ;-*'-*'ohbohbͿͿ;;-*'-*'ohbohbͿ;;̽-*'-*'ohbohbͿ;;˼-*'-*'ohbohbͿ;̽˼-*'-*'ohbohb;̽˼˼-*'-*'ohbohb;˼˼ʻ-*'-*'ohbohb̽˼˼ʻ-*'-*'ohbohb̽˼˼˼-*'-*'ohbohb˼˼˼˼-*'-*'ohbohb˼˼˼˽-*'-*'ohbohb˼˼˽˽-*'-*'ohbohb̽˽˽˼-*'-*'ohbohb˼˽˼˼-*'-*'ohbohb˽˼˼̽-*'-*'ohbohb˽˼˼̽-*'-*'ohbohb˼˼̽̽-*'-*'ohbohb˼̽̽˽-*'-*'ohbohb̽̽˽˽-*'-*'ohbohb̽̽˽̾-*'-*'ohbohb̽˽̾;-*'-*'ohbohb˽˽;̽-*'-*'ohbohb˽̾̽̾-*'-*'ohbohb̾;̾Ϳ-*'-*'ohbohb;̾ͿͿ-*'-*'ohbohb̽̾ͿͿ-*'-*'ohbohb̾ͿͿ-*'-*'ohbohbͿ̾-*'-*'ohbohb̾Ϳ-*'-*'ohbohbͿ-*'-*'ohbohb-*'-*'ohbohbͿ-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb䏏ohb-*'-*'ohbuuuuuuohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbpppy11ָyy1y1yy11ָy1y1ָVy1y1y1ָpppohb-*'-*'ohbpppzz11عؚWؚWWؚWzz11عWؚWzW1ؚWؚWpppohb-*'-*'ohbppp{{11ڻ{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻpppohb-*'-*'ohbppp{{11ۼۜXX{1X{{11{1Xۜ{{11ۼ{1Xۜpppohb-*'-*'ohbppp}}22ݾݝYYݝYYݝ}}22}}22ݾYYݝ}}22ݾ}}22ݾYYݝ}}22ݾpppohb-*'-*'ohbppp5555Ʉ55Ʉ55Ʉ55Ʉ5Ʉ555Ʉpppohb-*'-*'ohbppp555^5555pppohb-*'-*'ohbppp5_5555pppohb-*'-*'ohbppp55pppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbuuuuuuohb-*'-*'ohb葑ohb-*'-*'ohbwwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbãS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-*'-*'ٿٝTIMPSӮױ¿UإHKTӢTJϰKTӢ 껍 {LUԢX٦IYժK ŀ L פL ֤WۧI | οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺȺɻǹȺȺɻɻ˽̾̾]YUǼƻǼǼǼǼȼrnhXUhXUhXUhXUhXUhXUhXUhXUhXUhXU~pl÷øøø¶¶smh·····÷~xfVSfVSfVSfVSfVSfVSfVSfVSfVSfVS~yøøøøøø%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'ٿٺ}j]YZã˨¿V֤HVפHKTS~{ { إHTإHXԄJQ |  Lգ ~VzͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺǹǹǹǹȺȺɻʼ˽Ϳ^ZUùĺĺĺĻĻĻfVSfVSrlg׾fVSfVS"yHxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvvxxxxʭ'-J-*'-*'οοοοͿͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺȺȺǹǹǹǹǹǹǹǹɻɻȺɻɼʽ˽̾Ϳ^ZVჀ}fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk|||||||||||||~~~~Ͱ*0L-*'-*'οοοοͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺǹǹǹǹǹǹǹǹǹȺȺɻɻɼɼʼ˽̾ͿͿ^ZV⅂fVSfVSFOㄌ΄Є҄҄Ճփ؃ڃ݃ރႏ₏傏恏恏聏omhYVfVShYVom聏肏悏傏₏⃏ރ݃ۃكׄքӄӄѴ.3N-*'-*'οοοͿͿͿͿ̾ͿͿͿͿͿͿͿͿͿͿͿ˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻ˼ʼʼʼʼɻɻɻɻɻɻǹǹǹǹǹǹǹǹȺȺȺɼɼɼɻʼʼ˽̾^ZV艆fVSfVSOW琙֐אؐؐܐܐߐ㐚䐚揚菚ꏚ뎚쎚쎚fVSfVSurfVSfVS쎚쏚쏚ꏚ菚琚䐚吚㐚ᐚߐݐܐِِػ49Q-*'1,$οͿͿͿͿ̾̾̾̾ͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻ˼˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹǹȺȺȺȻɼɼɻɻʼʼ˽Ϳ^ZVꋈ㛑fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST]蘠ؘژܘܘߘ☢䘢䘢蘢蘢뗢엢yufWUfWUfWUyuyufWUfWUfWUyu옢옢꘢阢蘢嘢嘢㘢ᘢߘݘݘ8=Sߠ20.g\K.,*ͿͿ̾̾̾̾̾̾ͿͿͿͿͿͿ̾̾̾̾˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻ˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹȺȺȺȻȻȻɻɻɻɻʼ˽̾Ϳ^ZV퍊Zbꠦܠܠߠࠨ⠨㠨䠨矩蟩꟩쟩쟪ퟩ쟩韩頨蠩堩䠧㠧ᠧࠧ;@U.,*QNKw_.+(ͿͿ̾̾̾̾̾̾ͿͿͿͿ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹȺȺȺȺȻȻȻȺȺɻɻɻʼ˽̾Ϳ^ZV폍_f즬ববব⦭䤭䤭礭褭꤮줮줮冷줭뤭餮礮妭䦭㦭᦭?BV硟-*'qmiiyYͿͿ̾̾̾̾̾̾̾̾Ϳ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼ʼʼʼʼʼȺȺȺȺȺȺǹǹȺȺȻȻȻȻȺȺȺɻʼʼʼ˽˽˾̿^ZV퐍`i쬱଱ଲ㬳䬳䬳笳諳諳쪲쪲﫳쪲髳髳竳嫳嫲䫱?DYꠝqmix'duV.+(.,*dcbdmBFZ/-+.+(rnj}'q$c rVdQ,-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'jgc}yutqsl-2.8.1/apps/help/tqslapp/pref-adi2.bmp0000644000175000017500000077625615003421124020352 0ustar rmurphyrmurphyBM6(7xxur[YVNLJ/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)=;9HFE`^[khfvspxur][X/,)1/-򢟝1/-/,)DBA_][khfba_οοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿ㢟JIIjhg00.-*'οοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿآ-*'%$#AAA0.,οοοοοοοοͿͿͿͿͿͿͿͿͿͿ.,*111"""οοοοοοοοͿͿͿͿͿͿͿͿͿͿˡ"""-*'-*'-*'㥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohbο-*'-*'ohbohbοο-*'-*'ohbohbοο-*'-*'ohbohbοο-*'-*'ohbohbοοο-*'-*'ohbohbοοοο-*'-*'ohbohbοοοο-*'-*'ohbohbοοοο-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<YgUcUcUeUfUgTgTgTgTiSjSjQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkQkSjSjTiTgTgTgUfUfUeUcUcYg>-*'-*' M פM פ MإV}Y}WۧIYŀYիKWۧILUգWڦIWL֣ | «KYՂ «K KYԩJ };IWIWIWIWHXHWGYEZE[E[E[E]E]E]E]E]E]WYhXUhXUhXUWYE]WYhXUhXUhXUWYE]E]E]E]E[E[E[EZGYHWHWIWIWIWIW;-*'-*'W|K YQKLNפ QKN}K W|XԩKWڦILUգV٦IWIP ٦IWLբWQOIK 9=M=M=M=O=O=O=O=O=O=O=Q=Q-*'-*'ٿٝTIMPSӮױ¿UإHKTӢTJϰKTӢ 껍 {LUԢX٦IYժK ŀ L פL ֤WۧI | οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺȺɻǹȺȺɻɻ˽̾̾]YUǼƻǼǼǼǼȼrnhXUhXUhXUhXUhXUhXUhXUhXUhXUhXU~pl÷øøø¶¶smh·····÷~xfVSfVSfVSfVSfVSfVSfVSfVSfVSfVS~yøøøøøø%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'ٿٺ}j]YZã˨¿V֤HVפHKTS~{ { إHTإHXԄJQ |  Lգ ~VzͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺǹǹǹǹȺȺɻʼ˽Ϳ^ZUùĺĺĺĻĻĻfVSfVSrlg׾fVSfVS"yHxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvvxxxxʭ'-J-*'-*'οοοοͿͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺȺȺǹǹǹǹǹǹǹǹɻɻȺɻɼʽ˽̾Ϳ^ZVჀ}fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk|||||||||||||~~~~Ͱ*0L-*'-*'οοοοͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺǹǹǹǹǹǹǹǹǹȺȺɻɻɼɼʼ˽̾ͿͿ^ZV⅂fVSfVSFOㄌ΄Є҄҄Ճփ؃ڃ݃ރႏ₏傏恏恏聏omhYVfVShYVom聏肏悏傏₏⃏ރ݃ۃكׄքӄӄѴ.3N-*'-*'οοοͿͿͿͿ̾ͿͿͿͿͿͿͿͿͿͿͿ˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻ˼ʼʼʼʼɻɻɻɻɻɻǹǹǹǹǹǹǹǹȺȺȺɼɼɼɻʼʼ˽̾^ZV艆fVSfVSOW琙֐אؐؐܐܐߐ㐚䐚揚菚ꏚ뎚쎚쎚fVSfVSurfVSfVS쎚쏚쏚ꏚ菚琚䐚吚㐚ᐚߐݐܐِِػ49Q-*'1,$οͿͿͿͿ̾̾̾̾ͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻ˼˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹǹȺȺȺȻɼɼɻɻʼʼ˽Ϳ^ZVꋈ㛑fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST]蘠ؘژܘܘߘ☢䘢䘢蘢蘢뗢엢yufWUfWUfWUyuyufWUfWUfWUyu옢옢꘢阢蘢嘢嘢㘢ᘢߘݘݘ8=Sߠ20.g\K.,*ͿͿ̾̾̾̾̾̾ͿͿͿͿͿͿ̾̾̾̾˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻ˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹȺȺȺȻȻȻɻɻɻɻʼ˽̾Ϳ^ZV퍊Zbꠦܠܠߠࠨ⠨㠨䠨矩蟩꟩쟩쟪ퟩ쟩韩頨蠩堩䠧㠧ᠧࠧ;@U.,*QNKw_.+(ͿͿ̾̾̾̾̾̾ͿͿͿͿ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹȺȺȺȺȻȻȻȺȺɻɻɻʼ˽̾Ϳ^ZV폍_f즬ববব⦭䤭䤭礭褭꤮줮줮冷줭뤭餮礮妭䦭㦭᦭?BV硟-*'qmiiyYͿͿ̾̾̾̾̾̾̾̾Ϳ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼ʼʼʼʼʼȺȺȺȺȺȺǹǹȺȺȻȻȻȻȺȺȺɻʼʼʼ˽˽˾̿^ZV퐍`i쬱଱ଲ㬳䬳䬳笳諳諳쪲쪲﫳쪲髳髳竳嫳嫲䫱?DYꠝqmix'duV.+(.,*dcbdmBFZ/-+.+(rnj}'q$c rVdQ,-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'jgc}yutqsl-2.8.1/apps/help/tqslapp/pref-cab.htm0000644000175000017500000001130415003421124020242 0ustar rmurphyrmurphyAdding and Deleting Cabrillo Contest Definitions

Adding and Deleting Cabrillo Contest Definitions

TQSL can digitally sign and submit Cabrillo logs for the set of contests described in the Configuration Data file. When directed to digitally sign a Cabrillo log for a contest that is not in this set, TQSL will attempt to extract the necessary information from each QSO by searching for valid callsigns. If this process succeeds, the log will be digitally signed; if this process fails, you will be prompted to define a Contest Definition that specifies

  • the contest's Type: HF, or VHF (and above)
  • the contest's Field: the numeric designator of the field of a QSO line in a Cabrillo log file that contains the callsign of the station that was worked

The Cabrillo contest log file format varies depending on the particular contest; details of the Cabrillo format can be found at http://www.kkn.net/~trey/cabrillo/ .

Note that Cabrillo fields are numbered with 1 being the first field after the "QSO:" line tag. For example:

QSO: 21042 CW 1997-11-01 2101 N5KO     1 B 74 SCV WA2VRR   1 A 74 VA
In the ARRL Sweepstakes Cabrillo log line immediately above, the callsign worked (WA2VRR) appears in field 10.

Use the Preferences dialog's Cabrillo Specs tab to specify the required information.

Adding a Cabrillo Contest Definition
To specify Type and Field information for a contest,
1.Select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display TQSL's Preferences dialog.
2.In the Preferences dialog, select the Cabrillo Specs tab; TQSL will display any Cabrillo information you've already defined.
  

In the above example, a Cabrillo file that contains DL-DX-RTTY in the CONTEST line will be treated as an HF contest that contains the callsign worked in field 8 of each QSO line.

3.Click the Add button, and the Add Contest dialog will appear.
4.In the Add Contest dialog,

   4.aType the CONTEST Name as it will appear in the CONTEST line of the Cabrillo log file.
   4.bCheck HF or VHF box as appropriate (VHF includes UHF and microwave contests).
   4.cType the field number of the callsign worked field.
    
   4.dClick the OK button:
    
    Now, a Cabrillo file with a contest name of JIDX-CW will also be treated as an HF contest that contains the callsign worked in field 8 of each QSO line.

Deleting a Cabrillo Definition
To delete a Cabrillo contest definition, select it by clicking on the entry in the list, then click the Delete button.
1.Select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display TQSL's Preferences dialog.
2.In the Preferences dialog, select the Cabrillo Specs tab; TQSL will display the Cabrillo information you've already defined.
3.Select the definition you wish to delete, and click the Delete button.

tqsl-2.8.1/apps/help/tqslapp/pref-cab1.bmp0000644000175000017500000154506615003421124020333 0ustar rmurphyrmurphyBM66(<fffWWW/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)FFFTTTppp}}}))/,)1/-󢟝1/-/,)OOOooo}}}dhhhοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺɻʼ˽̾̾Ϳ碟PPPrrrrrb-*'οοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳޢ-*'WWWaaS0.,οοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾.,*III22+οοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿӠ222-*'-*'-*'㥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𫫫𫫫𫫫ohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuu𫫫uuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuu𫫫uuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuu𫫫ohb-*'-*'ohb䏏𫫫䏏𫫫䏏𫫫ohb-*'-*'ohbuuuuuu𫫫uuuuuu𫫫uuuuuu𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppvv00Ҵppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppww00Զppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppyy11ָyy11ָy1y1yy11y1V֙ppp𫫫ppp1y֙Vyy11ָ֙Vy1ppp𫫫ppp1yVVVV1y11yy11ָyy11ָy1֙Vy1y1yy11ָppp𫫫ohb-*'-*'ohbpppzz11عzz11عWؚWzz11zz11عWz1عppp𫫫ppp1zz1عؚWz1zz11ع1zz1ppp𫫫ppp1zWؚWWzz11ع1zz1zz11عzz11ع1zؚWؚWؚWzz11عppp𫫫ohb-*'-*'ohbppp{{11ڻ{{11{{11ڻ{{11{{11ڻڜ1Wڻ{ppp𫫫pppڜ1Wڻ{{{11{{11ڻ1{Wppp𫫫pppڜ1Wڻ{{11ڻ{{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻppp𫫫ohb-*'-*'ohbppp{{11ۼ{{11{1X{{11{{11ۼۜ1Xۼ{ppp𫫫ppp{{11ۼۜXX{11X{{{1ۼppp𫫫ppp{{11ۼ{1{1{{11ۼ{{11{{11ۼ{1X{{11ۼppp𫫫ohb-*'-*'ohbppp}2}2ݾYYݝ}}22}}22}22ݾ}YYݝppp𫫫ppp}}22ݾݝYY}22222ݾ}ppp𫫫ppp}Y2ݝYݝY}2ݝYY}2ݾ2}ݝYݝYYݝ}}22}}22ݾppp𫫫ohb-*'-*'ohbppp5555Ʉ55Ʉ55^555^^ppp𫫫ppp5^Ʉ55Ʉ5555Ʉppp𫫫ppp55Ʉ55Ʉ55^^^^55Ʉ55ppp𫫫ohb-*'-*'ohbppp555555ppp𫫫ppp5ʄ5^ʄ555ʄ55ʄppp𫫫ppp5^^^55ppp𫫫ohb-*'-*'ohbppp555555ppp𫫫ppp5̅555__ppp𫫫ppp__55ppp𫫫ohb-*'-*'ohbppp55ppp𫫫pppppp𫫫ppp55ppp𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbpppppp𫫫pppppp𫫫pppppp𫫫ohb-*'-*'ohbuuuuuu𫫫uuuuuu𫫫uuuuuu𫫫ohb-*'-*'ohb葑𫫫葑𫫫葑𫫫ohb-*'-*'ohb𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𫫫𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𫫫𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𫫫ohb-*'-*'ohb𫫫𫫫𫫫ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohbͿ-*'-*'ohbohbͿ-*'-*'ohbohbο-*'-*'ohbohbͿ;-*'-*'ohbohbͿͿ;-*'-*'ohbohbͿͿ;;-*'-*'ohbohbͿ;;̽-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿ;;˼-*'-*'ohb䏏ohbͿ;̽˼-*'-*'ohbuuuuuuohb;̽˼˼-*'-*'ohbppppppohb;˼˼ʻ-*'-*'ohbppppppohb̽˼˼ʻ-*'-*'ohbppppppohb̽˼˼˼-*'-*'ohbpppy11ָyy1y1yy11ָy1y1ָVy1y1y1ָpppohb˼˼˼˼-*'-*'ohbpppzz11عؚWؚWWؚWzz11عWؚWzW1ؚWؚWpppohb˼˼˼˽-*'-*'ohbppp{{11ڻ{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻpppohb˼˼˽˽-*'-*'ohbppp{{11ۼۜXX{1X{{11{1Xۜ{{11ۼ{1Xۜpppohb̽˽˽˼-*'-*'ohbppp}}22ݾݝYYݝYYݝ}}22}}22ݾYYݝ}}22ݾ}}22ݾYYݝ}}22ݾpppohb˼˽˼˼-*'-*'ohbppp5555Ʉ55Ʉ55Ʉ55Ʉ5Ʉ555Ʉpppohb˽˼˼̽-*'-*'ohbppp555^5555pppohb˽˼˼̽-*'-*'ohbppp5_5555pppohb˼˼̽̽-*'-*'ohbppp55pppohb˼̽̽˽-*'-*'ohbppppppohb̽̽˽˽-*'-*'ohbppppppohb̽̽˽̾-*'-*'ohbppppppohb̽˽̾;-*'-*'ohbuuuuuuohb˽˽;̽-*'-*'ohb葑ohb˽̾̽̾-*'-*'ohbwwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb̾;̾Ϳ-*'-*'ohbohb;̾ͿͿ-*'-*'ohbohb̽̾ͿͿ-*'-*'ohbohb̾ͿͿ-*'-*'ohbohbͿ̾-*'-*'ohbohb̾Ϳ-*'-*'ohbohbͿ-*'-*'ohbohb-*'-*'ohbohbͿ-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb䏏ohb-*'-*'ohbuuuuuuohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbpppy11ָyVVV1y11yy11ָVy1yV1֙yV1֙yV1֙pppohb-*'-*'ohbpppzz11عؚ1Wعz1zz1zz11عzW1ؚzW1ؚzW1ؚzW1ؚpppohb-*'-*'ohbppp{{11ڻ{{11ڻ{{11{{11ڻ{{11ڻpppohb-*'-*'ohbppp{{11ۼ{{11ۼ{{11{{11ۼ{{11ۼpppohb-*'-*'ohbppp}2}2ݾYݝY}}22}}22ݾ}}22ݾpppohb-*'-*'ohbppp5555Ʉ555Ʉ5pppohb-*'-*'ohbppp555555pppohb-*'-*'ohbppp55̅55̅55̅55pppohb-*'-*'ohbppp55pppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohb::ې:f::ېf:f:::::ې::::::::::ې::::ېuuuuuuohb-*'-*'ohb::ff::::ff:f:f::ff::::::::::ې::fff:葑ohb-*'-*'ohb::::ې::::::۶fff:::ېf:::::::::::ې::::::ېwwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb::ff۶:::ff:::fff:ې:ff:::::::::::::ې::ff:fohb-*'-*'ohb::ff۶::::ff::ې::f:::::f:::f:::ff:ېohb-*'-*'ohb::::ې::::::۶:f::::ff::::::f:::::ې::::ې::ohb-*'-*'ohb:::f:::::ffې::f::f:::::fffې:::::ې::::ېf:ohb-*'-*'ohb:f:::fffff::ې:::::::ې:::::f::ېohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𠠠𠠠𠠠ohb-*'-*'ohb𠠠𠠠𠠠ãS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[[>Uohb-*'-*'ohb𠠠𠠠𠠠<>>-*'-*'ٿٝTIMPSӮױ¿UإHKTӢTJϰKTӢ 껍 {LUԢX٦IYժK ŀ L פL ֤WۧI | οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺȺɻǹȺȺɻɻ˽̾̾]YUǼƻǼǼǼǼȼrnhXUhXUhXUhXUhXUhXUhXUhXUhXUhXU~pl÷øøø¶¶smh·····÷~xfVSfVSfVSfVSfVSfVSfVSfVSfVSfVS~yøøøøøø%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'ٿٺ}j]YZã˨¿V֤HVפHKTS~{ { إHTإHXԄJQ |  Lգ ~VzͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺǹǹǹǹȺȺɻʼ˽Ϳ^ZUùĺĺĺĻĻĻfVSfVSrlg׾fVSfVS"yHxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvvxxxxʭ'-J-*'-*'οοοοͿͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺȺȺǹǹǹǹǹǹǹǹɻɻȺɻɼʽ˽̾Ϳ^ZVჀ}fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk|||||||||||||~~~~Ͱ*0L-*'-*'οοοοͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺǹǹǹǹǹǹǹǹǹȺȺɻɻɼɼʼ˽̾ͿͿ^ZV⅂fVSfVSFOㄌ΄Є҄҄Ճփ؃ڃ݃ރႏ₏傏恏恏聏omhYVfVShYVom聏肏悏傏₏⃏ރ݃ۃكׄքӄӄѴ.3N-*'-*'οοοͿͿͿͿ̾ͿͿͿͿͿͿͿͿͿͿͿ˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻ˼ʼʼʼʼɻɻɻɻɻɻǹǹǹǹǹǹǹǹȺȺȺɼɼɼɻʼʼ˽̾^ZV艆fVSfVSOW琙֐אؐؐܐܐߐ㐚䐚揚菚ꏚ뎚쎚쎚fVSfVSurfVSfVS쎚쏚쏚ꏚ菚琚䐚吚㐚ᐚߐݐܐِِػ49Q-*'///οͿͿͿͿ̾̾̾̾ͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻ˼˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹǹȺȺȺȻɼɼɻɻʼʼ˽Ϳ^ZVꋈ㛑fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST]蘠ؘژܘܘߘ☢䘢䘢蘢蘢뗢엢yufWUfWUfWUyuyufWUfWUfWUyu옢옢꘢阢蘢嘢嘢㘢ᘢߘݘݘ8=Sߠ///ddd.,*ͿͿ̾̾̾̾̾̾ͿͿͿͿͿͿ̾̾̾̾˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻ˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹȺȺȺȻȻȻɻɻɻɻʼ˽̾Ϳ^ZV퍊Zbꠦܠܠߠࠨ⠨㠨䠨矩蟩꟩쟩쟪ퟩ쟩韩頨蠩堩䠧㠧ᠧࠧ;@U.,*MMM.+(ͿͿ̾̾̾̾̾̾ͿͿͿͿ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹȺȺȺȺȻȻȻȺȺɻɻɻʼ˽̾Ϳ^ZV폍_f즬ববব⦭䤭䤭礭褭꤮줮줮冷줭뤭餮礮妭䦭㦭᦭?BV硟-*'kkkͿͿ̾̾̾̾̾̾̾̾Ϳ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼ʼʼʼʼʼȺȺȺȺȺȺǹǹȺȺȻȻȻȻȺȺȺɻʼʼʼ˽˽˾̿^ZV퐍`i쬱଱ଲ㬳䬳䬳笳諳諳쪲쪲﫳쪲髳髳竳嫳嫲䫱?DYꠝkkk.+(.,*dcbdmBFZ/-+.+(lllppp-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'eeewwwtqsl-2.8.1/apps/help/tqslapp/pref-cab2.bmp0000644000175000017500000047527615003421124020340 0ustar rmurphyrmurphyBMz6(zAct1*@@/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)" HH>```kkkBfv/,)1/-򢟝1/-/,)EEE```Mll```οοοοοοοοͿͿͿͿͿͿ̾̾ͿͿ梟iK*jjj-*'οοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿܢ-*'QQQZZZ0.,οοοοοοοͿͿͿͿͿͿͿͿͿͿͿͿ.,*DDD///οοοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿѠ///-*'-*'-*'ࣝohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb䏏䏏ohb-*'-*'ohbuuuuuuuuuuuuohb-*'-*'ohbppppppppppppohb-*'-*'ohbppppppppppppohb-*'-*'ohbppppppppppppohb-*'-*'ohbppp1y֙Vyy11ָ֙Vy1pppppp1yVVVV1y11yy11ָyy11ָy1֙Vy1y1yy11ָpppohb-*'-*'ohbppp1zz1عؚWz1zz11ع1zz1pppppp1zWؚWWzz11ع1zz1zz11عzz11ع1zؚWؚWؚWzz11عpppohb-*'-*'ohbpppڜ1Wڻ{{{11{{11ڻ1{Wppppppڜ1Wڻ{{11ڻ{{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻpppohb-*'-*'ohbppp{{11ۼۜXX{11X{{{1ۼpppppp{{11ۼ{1{1{{11ۼ{{11{{11ۼ{1X{{11ۼpppohb-*'-*'ohbppp}}22ݾݝYY}22222ݾ}pppppp}Y2ݝYݝY}2ݝYY}2ݾ2}ݝYݝYYݝ}}22}}22ݾpppohb-*'-*'ohbppp5^Ʉ55Ʉ5555Ʉpppppp55Ʉ55Ʉ55^^^^55Ʉ55pppohb-*'-*'ohbppp5ʄ5^ʄ555ʄ55ʄpppppp5^^^55pppohb-*'-*'ohbppp5̅555__pppppp__55pppohb-*'-*'ohbppppppppp55pppohb-*'-*'ohbppppppppppppohb-*'-*'ohbppppppppppppohb-*'-*'ohbppppppppppppohb-*'-*'ohbuuuuuuuuuuuuohb-*'-*'ohb葑葑ohb-*'-*'ohb𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwww𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohbο-*'-*'ohbohbοο-*'-*'ohbohbοοο-*'-*'ohbohbοοο-*'-*'ohbohbοοο-*'-*'ohbohbοοοο-*'-*'ohbohbοοοͿ-*'-*'ohbohbοοοͿ-*'-*'ohbohbοοοͿ-*'-*'ohbohbοοͿͿ-*'-*'ohbohbοͿͿͿ-*'-*'ohbohbοͿͿͿ-*'-*'ohbohbοͿͿͿ-*'-*'ohbohbͿͿͿͿ-*'-*'ohbohbͿͿͿ̾-*'-*'ohbohbͿͿͿ̾-*'-*'ohbohbͿͿͿ̾-*'-*'ohb::ېohbͿͿ̾̾-*'-*'ohbfff:ohbͿ̾̾̾-*'-*'ohb::::ېohbͿ̾̾̾-*'-*'ohbff:fohbͿ̾̾̾-*'-*'ohbf:ېohb̾̾̾̾-*'-*'ohb::ې::ohb̾̾̾̾-*'-*'ohb::ېf:ohb̾̾̾̾-*'-*'ohb::ېohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohb½½ohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohb6````666·66·666·66`6`6666Ϋ`·666```6666666·66·66```66666`66``666·66·66·666666·6666·ohb̾̾̾̾-*'-*'ohb6```Ϋ666·6·66·666`666·`666·6``6Ϋ`6666`·6``6`·6·66666``666`·6·666`6`66·6·66·66·66·666Ϋ```6666·ohb̾̾̾Ϳ-*'-*'ohb6`·66·66·66·66`````Ϋ·6`·66`6Ϋ66666`6666666666·6666·6666666·`66·6666·66·66·66·66`6Ϋ6666ohb̾̾̾Ϳ-*'-*'οohb6666·66·666·6`6`6`6`666`6Ϋ666`6`Ϋ666666666`Ϋ66·666666·66·66·6666·66·66·66·66`6Ϋ6`Ϋ66ohb̾ͿͿ̾-*'-*'οohb`6``66·666·6`·6`````6Ϋ`6`66`6``66``666`Ϋ66``66·66``6666``66·666666·`6·`666·6·6``666`66·ohb̾ͿͿ̾-*'-*'ohb66·66·66·666`·```·6`·66`66``Ϋ66`6·66·666666·66·66·6666`Ϋ`66·6666`666`Ϋ`6``666`6·66·66``66·ohbͿͿͿ̾-*'-*'ohb6```66·66``6666`666666666666`6666`·6666ohbͿͿ̾̾-*'-*'ohb``66·666666·``66666`Ϋ6666666·66666ohbͿ̾̾̾-*'-*'ohb66·666666666666ohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'οohbohb̾̾̾˽-*'-*'οοohbohb̾̾˽˽-*'-*'οοοohbohb̾˽˽˽-*'-*'οοοohbohb̾˽˽˽-*'-*'οοοοohbohb˽˽˽˽-*'-*'οοοohbohb˽˽˽̽-*'-*'οοohbohb˽˽̾̽-*'-*'Ϳohbohb˽̾̾̾-*'-*'Ϳohbohb˽̾̾̾-*'-*'ohbohb̾̾̾̽-*'-*'ohbohb̽̾̽̽-*'-*'ohbohb̾̽̽;-*'-*'ohbohb̾̽̽;-*'-*'ohbohb̽̽;̽-*'-*'ohbohb̽;̽˽-*'-*'ohbohb;̽˽˽-*'-*'ohbohb;̽˽̾-*'-*'ohbohb;˽̾;-*'-*'ohbƧƧohb˽˽;̽-*'-*'ohb栠ܻ栠ܻohb˽̾̽̾-*'-*'ohbѹà6666·66à``6666·66ohb̾;̾Ϳ-*'-*'ohbƻ쫣W>J5J4W>򻻺6666·66ƻ򻻺``6666·66ohb;̾ͿͿ-*'-*'ohb𥥤W?]?ǃǂ ]= X?ݥ6666·66𥥤ݥ6``66666·66ohb̽̾ͿͿ-*'-*'ohb𒒑򜐂G3Ə"ѝ јƄH36666·66𒒑¾```66666·66ohb̾ͿͿ-*'-*'ohb𒒑}_K0Ր]Ѣ(NJH3򒒑666`𒒑򽹴򒒑````666`ohbͿ̾-*'-*'ohb𥥥ľ]D$Ʋi\@W?ܥ6666·66𥥥þܥ6·6`·66666·66ohb̾ͿͿ-*'-*'ohbƺ颗`G'xcHfQ6X@ 뺺6666·66ƺ齸½뺺66·66·6666·66ohbͿͿ-*'-*'ohbſà66666`ƿà666666666`ohbͿ-*'-*'ohb桡ۺ桡ۺohbͿ-*'-*'ohbƧƧohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb``66ohb-*'-*'ohb`666ohb-*'-*'ohb6`6`6666`·666`·6`·6`·666·6`66ohb-*'-*'ohb6`````6Ϋ`6666·`6``·`66·`6`66·666`6``ohb-*'-*'ohb6`·66`6Ϋ6666·66·66``6666````666`66ohb-*'-*'ohb6666`6Ϋ6666·66·6```6666````666`6`ohb-*'-*'ohb`6``6Ϋ`6``6·66Ϋ``66`6``6666````66·````66ohb-*'-*'ohb66·6`66``6·666·666·6666`6``666``66·ohb-*'-*'ohb6```666666ohb-*'-*'ohb``666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷٷohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵf:ې:f۶::ېf:f::f:ې::fɤohb-*'-*'ohbϵf:ې::ې::ff:f:f:fff:f:::ېf:::ې:ɤohb-*'-*'ohbϵ::ې::ې::::۶fff::fېfffff۶ې:fɤohb-*'-*'ohbϵ::ې::ې::fff:ې:ff:::f:f:f:f:ɤohb-*'-*'ohbϵ::ې::ې::ff::ېf::ې:fې:fffɤohb-*'-*'ohbϵ::ې::ې::::۶:f::::ې:fېfffې:fې:ɤohb-*'-*'ohbϵ::ې::ې:::ffې::f:fffff::::f::ɤohb-*'-*'ohbϵ:::f۶:fffffff::::ېffɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbϵɤohb-*'-*'ohbĭ\{={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={={=\ĭohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb6`6`66`66666·66·6666`6```666·66·66·66·66·66·ohb-*'-*'ohb6```6·6`·666`66666`6666666`6·666·6·66·66·66``66·ohb-*'-*'ohb6`·6`·66·666·`666666``66666·`6666·66·66·66·66·66ohb-*'-*'ohb6666``Ϋ66·66·666666``6666·66·66·66·66·66·666`ohb-*'-*'ohb`666``Ϋ66``666666``6666``66``66·`6·`6``66·66·ohb-*'-*'ohb66·6`·66·66`Ϋ`666666``6666`Ϋ`6666·`666`Ϋ`6`66·66·ohb-*'-*'ohb6```6·6`·6`6666`·6666666`·``66`6666`·66ohb-*'-*'ohb``6·66·6`666```666·666·66·666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb666`·```666```6666````66666·6666·66·66·6`6`6`66`66666·66·66ohb-*'-*'ohb6``66`·6·66`·6·66```Ϋ666·6·666Ϋ`6666·66·66``6Ϋ`6```6·6`·666`66666`66666ohb-*'-*'ohb6·66666·66666`·66·66·66`6Ϋ6666·66·66·66`66`·6`·66·666·`666666``66ohb-*'-*'ohb66Ϋ6`·6666·66666666·66`6Ϋ6666·66·66·66`66666``Ϋ66·66·666666``66ohb-*'-*'ohb66·`6Ϋ``66``66`6``66·6·66`66·66·66``6Ϋ``666``Ϋ66``666666``66ohb-*'-*'ohb6·6`·666·6666·66·`666`6·66``Ϋ66·66·66·6`66·6`·66·66`Ϋ`666666``66ohb-*'-*'ohb`6666`·66666```6666·666```6·6`·6`6666`·6666666`·``66ohb-*'-*'ohb666666``6666·66·66``6·66·6`666```666·666·6ohb-*'-*'ohb66666666·66ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'V_*3f(P(P!)Q"*S#+T$-U$-V&.W'/X(0Y)1Z)1[)1[)1])1])2])1])1])2])1])1])1[)1\)1])2])2])2[)2[)2Z)1Y(0X'/W%.V%.U$,T#+S")Q (P (P+4gX`-*'-*'  ƂKNQפTOئȆăăNRެSȈ',Mx|˳߬߬߬⬴䬶䪷窸誹諹꫹뫹쫹쫹쫹쫹쬻ꬻꬺ鮹殶殶家⮶ⴺ⮲y}).N-*'-*' UXNץNץ€R€ODŽDžONެNޫNĄĄNެOKޭP~ĆXJ֦VY}so}o}ooonnnnnllllllmmmmmmmmmmmoopppqqqqquɟՄX[-*'-*' ƂNT֤XլL€MQԯOQԯOăăMޫONӰRJXJا &Noycpcpbqbqbqasauavav`x_x`y`z`z`z`z`{a{a{a{a{a{a{a|a|a|a|a|a|a{azazcxcwcwcudsdsdsererq{!&O-*'-*' ŀ ŀƂNTץX֬MÁQԯPQկPńńNެONTڨX٩WJا>WeSaSaScSdSdReReRfRhQiRiPjPjPjPjPkPkQkQkQkQkQkQkQlQlQlQlQlQlQlSkSjTiTgTgTgUfUfUeUcUcYg>-*'-*' L ֤NץNץQTÁNăެNSڧNެOTKکŇWJا;GUGUGUGUFUFUEWCXCZCZCZD\D\D\D\D\D]WYhXUhXUhXUWYE]WYhXUhXUhXUWYE^E^E^E]E[E[E[EZGYHWHWIWIWIWIW;-*'-*'V|K XQLNN֤QLN€QܩKȆȇMąKտJȉ 9;K;K;K;L;M;M;M;N;M;N6φ4_φ445Lj45><..>> / />>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>9“9Ħohb-*'-*'ohbƨX<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-*'-*'ٿٝTIMPSӮױ¿UإHKTӢTJϰKTӢ 껍 {LUԢX٦IYժK ŀ L פL ֤WۧI | οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺȺɻǹȺȺɻɻ˽̾̾]YUǼƻǼǼǼǼȼrnhXUhXUhXUhXUhXUhXUhXUhXUhXUhXU~pl÷øøø¶¶smh·····÷~xfVSfVSfVSfVSfVSfVSfVSfVSfVSfVS~yøøøøøø%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'ٿٺ}j]YZã˨¿V֤HVפHKTS~{ { إHTإHXԄJQ |  Lգ ~VzͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺɻɻɻɻȺȺȺȺȺȺȺȺȺȺǹǹǹǹȺȺɻʼ˽Ϳ^ZUùĺĺĺĻĻĻfVSfVSrlg׾fVSfVS"yHxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvvxxxxʭ'-J-*'-*'οοοοͿͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺȺȺǹǹǹǹǹǹǹǹɻɻȺɻɼʽ˽̾Ϳ^ZVჀ}fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk|||||||||||||~~~~Ͱ*0L-*'-*'οοοοͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻʼʼʼʼɻɻɻɻɻɻȺǹǹǹǹǹǹǹǹǹȺȺɻɻɼɼʼ˽̾ͿͿ^ZV⅂fVSfVSFOㄌ΄Є҄҄Ճփ؃ڃ݃ރႏ₏傏恏恏聏omhYVfVShYVom聏肏悏傏₏⃏ރ݃ۃكׄքӄӄѴ.3N-*'-*'οοοͿͿͿͿ̾ͿͿͿͿͿͿͿͿͿͿͿ˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻ˼ʼʼʼʼɻɻɻɻɻɻǹǹǹǹǹǹǹǹȺȺȺɼɼɼɻʼʼ˽̾^ZV艆fVSfVSOW琙֐אؐؐܐܐߐ㐚䐚揚菚ꏚ뎚쎚쎚fVSfVSurfVSfVS쎚쏚쏚ꏚ菚琚䐚吚㐚ᐚߐݐܐِِػ49Q-*'1,$οͿͿͿͿ̾̾̾̾ͿͿͿͿͿͿͿͿ̾̾̾˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻ˼˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹǹȺȺȺȻɼɼɻɻʼʼ˽Ϳ^ZVꋈ㛑fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST]蘠ؘژܘܘߘ☢䘢䘢蘢蘢뗢엢yufWUfWUfWUyuyufWUfWUfWUyu옢옢꘢阢蘢嘢嘢㘢ᘢߘݘݘ8=Sߠ20.g\K.,*ͿͿ̾̾̾̾̾̾ͿͿͿͿͿͿ̾̾̾̾˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻ˼˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹǹǹȺȺȺȻȻȻɻɻɻɻʼ˽̾Ϳ^ZV퍊Zbꠦܠܠߠࠨ⠨㠨䠨矩蟩꟩쟩쟪ퟩ쟩韩頨蠩堩䠧㠧ᠧࠧ;@U.,*QNKw_.+(ͿͿ̾̾̾̾̾̾ͿͿͿͿ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼˼ʼʼʼʼɻɻɻȺȺȺǹǹǹȺȺȺȺȻȻȻȺȺɻɻɻʼ˽̾Ϳ^ZV폍_f즬ববব⦭䤭䤭礭褭꤮줮줮冷줭뤭餮礮妭䦭㦭᦭?BV硟-*'qmiiyYͿͿ̾̾̾̾̾̾̾̾Ϳ̾̾̾̾̾˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻ˼ʼʼʼʼʼȺȺȺȺȺȺǹǹȺȺȻȻȻȻȺȺȺɻʼʼʼ˽˽˾̿^ZV퐍`i쬱଱ଲ㬳䬳䬳笳諳諳쪲쪲﫳쪲髳髳竳嫳嫲䫱?DYꠝqmix'duV.+(.,*dcbdmBFZ/-+.+(rnj}'q$c rVdQ,-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'jgc}yutqsl-2.8.1/apps/help/tqslapp/pref-log.htm0000644000175000017500000002043015003421124020276 0ustar rmurphyrmurphySetting TQSL Log Handling Options

Setting TQSL Log Handling Options

To inspect or change TQSL's log handling options, select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display its Preferences dialog; this dialog's Log Handling tab provides control over several settings that govern TQSL's log signing operations:

Specify ADIF and Cabrillo File Extensions
Because there are no standard file extensions (.XXX) consistently used for ADIF AND Cabrillo files, TQSL lets you specify the extensions used on your system for each file types. The Select File to Sign and Upload and Select File to Sign and Save dialogs set their Files of type selectors based on the extensions specified on this tab:

In the example shown above, files whose names end in .log or .cab will be treated as Cabrillo files, while those with names ending in .adi or .ADI are ADIF files. When using an operating system like Windows that doesn't distinguish case in file names, the two ADIF entries shown in this example would be unnecessary.

Allow Nonamateur Callsigns
The Allow nonamateur call signs checkbox lets you to choose whether TQSL should treat a nonamateur call-worked as an error. An amateur callsign must meet these requirements:
  • contains only the letters A through Z, the digits 0 through 9, and the slash character
  • contains at least one number and one letter
  • is at least three characters in length
  • does not begin or end with a slash character
  • does not begin with 0
  • does not begin with 1 unless it begins with 1A, 1M, or 1S

LoTW will not accept a QSO whose callsign does not conform to the above requirements so you should leave TQSL's Allow nonamateur call signs box unchecked.

Prompt for QSO Date Range
This checkbox determines whether TQSL will display the QSO Date Range dialog when Submitting a Log File to LoTW via the Internet or when Submitting a Log File from a Computer without Internet Access.

The QSO Date Range dialog can be used to prevent QSOs already submitted to LoTW that haven't been subsequently modified from being submitted again, sparing LoTW from processing QSOs that have already been processed.

Display details of already uploaded QSOs when signing a log
If, when signing and uploading a file or signing and saving a file, TQSL encounters QSOs that have already been submitted to LoTW, then if this box is checked the details of each already uploaded QSO will be reported in the Status Log; if this box is not checked, no details will be reported.

Ignore seconds in QSO times
If, when signing and uploading a file or signing and saving a file, and this box is checked, then the seconds part of the QSO time are set to zero. This is useful if your log contains mistakenly logged QSOs, such as those from WSJT-X when the station contacted sends multiple confirmations. The previously uploaded QSOs can then be ignored when signing a log.
Ignore callsigns in ADIF files
If, when signing and uploading a file or signing and saving a file, and this box is checked, then the callsigns of the operator in the ADIF file (STATION_CALLSIGN, OPERATOR) for the QSO record are ignored. This is useful if your log contains an invalid callsign for logged QSOs.
Set options for handling QTH details in ADIF logs
If, when signing and uploading a file or signing and saving a file, TQSL encounters station information in the log that indicates callsign, DXCC entity, or QTH information such as gridsquare, zone, state, etc. TQSL can verify this against the Station Location and either report on or update the Station Location with the information from the log. This set of options allows either ignoring, reporting on, or updating the Station Location using the log data.

The Handle QTH information in ADIF logs with what action? selection dictates what action TQSL takes when procssing QTH indications in an ADIF file.

TQSL uses the Station Callsign and fields such as MY_STATE or MY_GRIDSQUARE as indications of what station was used to make a particular QSO.

The Handle QTH information in ADIF logs with what action? selection allows selection of one of three options.

  • If the Ignore QTH details from your log option is selected, station details are ignored.
  • If the Report on QTH differences option is selected, TQSL will report on any differences between a QSO and the selected Callsign Certificate and Station Location.
  • If the Override Station Location with QTH details from your log option is selected, TQSL will track changes in the Station Callsign and location data and use that data for each QSO signed. It is possible to have unique Station Callsigns and QTH data for each QSO in a log.
The Override option requires that you have a valid Callsign Certificate for any callsign changes. Note that any change to QTH data is "sticky" - for example, if you sign a QSO with MY_ITU_ZONE set to "5", then subsequent QSOs will continue to use that until another QSO with a different zone value is processed.

If you are using Override and the ADIF file being signed has complete QTH and Station Callsign information, you may wish to use "[NONE]" as the callsign for the Station Location chosen for signing, as well as setting minimal data for that Station Location. This eliminates the risk of misusing this Station Location for logs which lack complete station data.

ADIF fields defininng station data

The following ADIF fields will be used when included with a QSO in an ADIF file.
MY_CNTYCounty (secondary administrative subdivision)
MY_COUNTRYCounty (DXCC Entity)
MY_CQ_ZONECQ Zone number
MY_DXCCDXCC Entity number
MY_GRIDSQUAREMaidenhead Gridsquare
MY_IOTAIOTA reference number
MY_ITU_ZONEITU Zone number
MY_STATEState/Province/Oblast (primary administrative subdivision)
MY_VUCC_GRIDSList of up to four Maidenhead Gridsquares
OPERATORCallsign used [only used if STATION_CALLSIGN is not provided.]
STATION_CALLSIGNCallsign used for QSOs
tqsl-2.8.1/apps/help/tqslapp/pref-opt.bmp0000644000175000017500000207765615003421124020335 0ustar rmurphyrmurphyBM6(xŸ̼δпɬѽеϭЫϫϪϪ𫫫𫫫𫫫Ϫͻ𫫫ͻ𫫫ͻ𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫Ϫ*T𫫫𫫫𫫫Ϫ*T𫫫𫫫𫫫Ϫ*T𫫫𫫫𫫫Ϫ*T*T*T*T*T*TTT𫫫TT*TT*𫫫***T***T*T*TTT*T*T𫫫Ϫ*T*TT**TT*T*𫫫TTT**T**𫫫TTT****T*T**T**T𫫫Ϫ*T*TT**T*T*T𫫫*TT**TTT𫫫*TT****T*TT*T**T𫫫Ϫ*T*T*T*T*TTT𫫫T****T**𫫫T*T**T*TT**T*T𫫫ϪT**TT**TT***𫫫***TTT𫫫***TTTTT***TT**T𫫫Ϫ*T*T*T*T*T**𫫫T****TT*𫫫T*TT*TT**T*T*T𫫫Ϫ*T*T*T𫫫*TT**T*өT𫫫*T*T𫫫Ϫ*T*T*T𫫫T****TT*𫫫*T*T𫫫Ϫ*T*T*T𫫫T**T*T𫫫***T𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫Ϫ𫫫𫫫𫫫ϪϪϪϪϪϪϪϪϪϪϪ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ󫫫Ϫ*}*}*}S󫫫Ϫӑkkkbbbkkk}}**S}*󫫫Ϫttt곳ttt}**}SS}S*󫫫ϪꘘSS*}S}*S*S}*S}*S}S}}**S}}*SSSSS*}S***S}SS*S}}**}*S}*S}S}*}**}SS*}S***S}SS*S}}**}*S}*S}}**}}**}*S}SS*S}*S}*}*}*S}*S}*S}S}}**S}}*SSS*}S***S}*S}*S}SS*S}*S}}**}*S}*S}*S}SS}**}SSS*S}*S}*S}}**}S}}**S}󫫫ϪttttttSSS}*}S**S*SS}**S}*S}*S}SS*}*}S}*}}*}}**S}S}*}**}*S}*S}SS}S**S}*S}*S}SS}S**}}*S}*}**}*S}*S}SS}S**S}*S}*}***}**}SSS}**S}*S}*S}*S}S}**}S*S}*S}*S}SS*}*}S}**S}S}*}**}*S}*S}*}}**S}*S}SS}S**S}*S}*S}}S****S}SS}S**}SS*}*S}*S}SS}S*SS*}*}󫫫Ϫ󼼼*}S}S**}}**}}*}S**S}*S}*S}}}***S}}S**}ϦS*S}}S***}}*S}*S}}S*SS*S}*S}*S}}S*SS}S*}S***}}*S}*S}}S*SS*S}*S}**}}}*SS*}}Ϧ}**Ϧ*S}*S}*S}*S}}S***}}*S}*S}*S}}}***S}}S**S}}S***}}*S}*S}*}S*S}*S}}S*SS*S}*S}*S}*}}**}}*}S*SS*S}*S}*S}*S}}S*SS}}***S}󫫫Ϫllllll}S***}}SS}*S}*S*S}*S}*S}}}***S}}*S}*S*S}S*}*S}*S}}S*SS*S}*S}*S}}S*SS}S*S*}*S}*S}}S*SS*S}*S}}}***S}}}****}}*S}*S}*S}*S}SS*}}**S}*S}*S}}}***S}}*S*S}S*}*S}*S}}*}**S}*S}}S*SS*S}*S}*S}SS}*S}S*SS*S}*S}*S}*S}}S*SS}}***S}󫫫Ϫbbbbbb}}***}SSSSS*S}S}*S}*S}**S}SS*}*}*S}S}**}S*S}*S}*S}*S}SS}**}SSSS*S}SS}**}*}}**S}*S}*S}SS}**}SSSSSSS***}**}}**S}*S}S}*SS*}ϦS*}}**S}S*}SS*}*}*S}S}**S}*S}*S}*S}SS*S}S}*SS}**}S}*S}*SSSSSSSS}**}*S}*S}S}**S}SS}**}SS*}*}󫫫Ϫllllll}S***}}*}SS}*}*S*S*SSS*S*SSS*S}}*}}**S}}*SS}*SSSSSS*S}}*S*SS}}}**S}}*S*}SSSSS*S}}*S*SS}}}*SS*S}}S**S}SS*S}}*}*SSS}**S}*S}*S}}*}}**S}}*SSSSS*S}*S}*}SS}**S*SSS}*S*S}}*S*}}**}SS}*}*S*S}*S}*S*SSS*S}}*S}*}}**S}󫫫Ϫ󳳳*}S}S**S}S}**S}*S}*S}*S}*S}*S}}S***}}*S}*S}*S}*S}*S}*S}*S}*S}󫫫ϪttttttS*}*}}**S}}S*}}*S}*S}*S}*S}*S}*S}*}SSS*S}*S}*S}*S}*S}*S}SS*S}󫫫ϪꘘS}*}**}*S}SS}**}*S}}**}}**}*S}*}SS}}**S}*S}*S}}**}*S}S}**S}󫫫Ϫtttώttt󫫫ϪԒlllbbblll󫫫ϫ󫫫ϫ󫫫ϫ󫫫ϫ󫫫ϫ󫫫ϫ󫫫ϫ󫫫ϫ󫫫ϫ*S}󫫫ϫӻ͏Ni_i͏Nӻ*S}󫫫Ϫբm_______Ԣm*S}}**}󫫫Ϫբm_________Ԣm*S}*}}*}*S*S*SSS}**}*S}SS}**}*S}*S}*}*}*S}*S}*S}S}}**S}*S}*S}*S}}*S*S}}*S*S}*S}SS}*SSS󫫫Ϫӻ___YSPRY___ӻ*S}*S}S}*S}*}S*SS}S**S}*S}SS}S**S}*S}S}**}S*S}*S}*S}SS*}*}*S}*S}*S}S}**S}S}**S}*S}*}}*S}**}}*󫫫Ϫ̐N__Yg!ӿg [__̏N*S}*}}*}S**S}*}S}S*SS*S}*S}}S*SS*S}*S}}S***}}*S}*S}*S}}}***S}*S}*S}*S}}S**S}}S**S}*S}}S*}S**}S󫫫Ϫi__WԿϩW__i*S}}S*}*S*S}SS}S*SS*S}*S}}S*SS*S}*S}SS*}}**S}*S}*S}}}***S}*S}*S}*S}}*S*S}}*S*S}*S}}S*}*S}*}*󫫫Ϫ___YY___SS*S}S}*S}*}**}SS}**}S}**S}SS}**}SSSS*}ϦS*}}**S}S*}SS*}*}*S}*S}*S}*S}S}*S}**S}S}*SSSS*}}**S}S}*SS󫫫Ϫi__[ֿZ__i*S}S}*}*S*S}}*}*}*S*S*SSS}*S*SS}}}*SSS}**S}*S}*S}}*}}**S}*S}S}}*S}*}*S*S*SSS}*S*SS}}}**}S}*S*}S󫫫Ϫ̐N__]o Ϸn \__̏N*S}*S}*S}}S***}}*S}*S}*S}*S}*S}*S}󫫫Ϫӻ___\[Z[\___ӻ*S}SS*S}*}SSS*S}*S}*S}*S}SSSS󫫫ЫԢl_________գmSS*}SS}}**S}*S}*S}}**}S}*S}*󫫫ЫԢl_______գm󫫫Ыӻ̐Ni_i̐Nӻ󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы*}S*}*}*}S󫫫ЫӑkkkbbbkkkS}*}}**S}*󫫫Ыttt곳ttt}S*}**}SS}S*󫫫ЫꘘSSS}}**S}*S}*S}}**}*S}}*S*}*}*S}*S}*S}S}}**S}}*SSS*}S***S}*S}*S}SS*S}*S}}**}*S}*S}*S}SS}**}SSS*S}*S}*S}}**}S}}**S}󫫫ЫttttttSSSS*}*}*S}*S}SS}S**S}S}*S}**}S*S}*S}*S}SS*}*}S}**S}S}*}**}*S}*S}*}}**S}*S}SS}S**S}*S}*S}}S****S}SS}S**}SS*}*S}*S}SS}S*SS*}*}󫫫Ы󼼼SS}}***S}*S}*S}}S*SS*S}}S*}S***}}*S}*S}*S}}}***S}}S**S}}S***}}*S}*S}*}S*S}*S}}S*SS*S}*S}*S}*}}**}}*}S*SS*S}*S}*S}*S}}S*SS}}***S}󫫫ЫllllllSS}}***S}*S}*S}}S*SS*S}}*SSS*}}**S}*S}*S}}}***S}}*S*S}S*}*S}*S}}*}**S}*S}}S*SS*S}*S}*S}SS}*S}S*SS*S}*S}*S}*S}}S*SS}}***S}󫫫ЫbbbbbbSSSS*}*}SSSSSS}**}S}**S}S}**}ϦS*}}**S}S*}SS*}*}*S}S}**S}*S}*S}*S}SS*S}S}*SS}**}S}*S}*SSSSSSSS}**}*S}*S}S}**S}SS}**}SS*}*}󫫫ЫllllllSS}*}}**S}*SS}}}*}*S*S*SSS}*SSSS}**S}*S}*S}}*}}**S}}*SSSSS*S}*S}*}SS}**S*SSS}*S*S}}*S*}}**}SS}*}*S*S}*S}*S*SSS*S}}*S}*}}**S}󫫫Ы󳳳SS}S***}}*S}*S}*S}*S}*S}*S}*S}*S}󫫫ЫttttttSS*}SSS*S}*S}*S}*S}*S}*S}SS*S}󫫫ЫꘘSS*}SS}}**S}*S}*S}}**}*S}S}**S}󫫫Ыtttώttt󫫫ЫԒlllbbblll󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы󫫫Ы*}S󫫫ЫS}*󫫫Ы}**}}S*󫫫Ы*S}*S}*}S***S}*S}*S}S}}**S}*S}}*S*}*}*S}*S}*S}*S}*S}*S}*S}}**}*S}*S}*S}*S}*}S***S}SS*S}}**}*S}*S}*S}*S}*S}S}**}ϦSS*}SS*S}*S}}**}S}}**S}SS}**}}**}*S}SS*S}*S}}**}}**}*S}*S}*}S***S}SS*}S***S}SSSS*S}}**}*S}*S}}S*󫫫ѫ*S}*S}S}*}**}*S}*S}SS*}*}*S}S}*S}**}S*S}*S}*S}*S}*S}*S}*S}SS}S**S}*S}*S}*S}S}*}**}*S}*S}SS}S**S}*S}*S}*S}*S}S}**}S*S}SSSS*S}*S}SS}S*SS*}*}*}}**}***}**}SSS}**S}*S}*S}*S}*}***}**}SSS}**S}*S}S}*}**}*S}S}*}**}*}}**S}*S}SS}S**S}*S}}S*󫫫ѫ*S}*S}}S***}}*S}*S}}}***S}*S}}S*}S***}}*S}*S}*S}*S}*S}*S}*S}}S*SS*S}*S}*S}*S}}S***}}*S}*S}}S*SS*S}*S}*S}*S}*S}SS*S}}S*SS*S}*S}}S*SS}}***S}*}S**}}}*SS*}}Ϧ}**Ϧ*S}*S}*S}*S}**}}}*SS*}}Ϧ}**Ϧ*S}*S}}S***}}*S}}S***}}}S**S}*S}}S*SS*S}*S}󫫫ѫ*S}*S}S*}*S}*S}}}***S}*S}}*SSS*}}**S}*S}*S}*S}*S}*S}*S}}S*SS*S}*S}*S}*S}S*}*S}*S}}S*SS*S}*S}*S}*S}*S}*}}**}ϦS*S}**}}SS*S}*S}}S*SS}}***S}}*}*}}***S}}}****}}*S}*S}*S}*S}}}***S}}}****}}*S}*S}S*}*S}S*}}S**S}*S}}S*SS*S}*S}SS󫫫ѫS*}*S}SSSSSS*}*}*S}*S}S}**}ϦS*}}**S}S*}*S}SSSS*S}SS}**}S}*S}*S}*SS*S}*S}*S}SS}**}SSSS*S}SSSS}}****}}*S}*}SSSSS*S}SS}**}SS*}*}SSSSS***}**}}**S}*S}S}*SSSSS***}**}}*S}*SS*S}*S}*S}*}}**S}*S}SS}**}SSSS}}**󫫫ѫ*S}*S}SS*SS}}}*}*}}**S}*S}}*SSSS}**S}*S}*S}*S}*SS}}}*S}*}*S*S*SSS*S}}*S*}}*SSSS*S}}*S*SS}}}**S}*SS}}}***}}}}***S}*}SSS*S}*S}}*S}*}}**S}*}SSS*S}}S**S}SS*S}}*}*SS*S}}S**S}}*}*SSSSSS*}SSS*S}}*S*SS}}}*S}*󫫫ѫ*S}*S}*S}*S}}S***}}*S}*S}*S}*S}*S}*}}**}}**S}}S*SS*S}*S}*S}*S}*S}*S}*S}*}}*󫫫ѫ*S}*S}*S}*S}*}SSS*S}*S}*S}SS*S}}S****S}*S}SSSS*S}*S}*S}*S}*S}*S}*S}}}S}*󫫫ѫ*S}*S}*S}*S}*}SS}}**S}*S}}**}S}*}**}}**}SSS}*SSS}**S}}**}*S}*S}}**}SS󫫫ѫ󫫫ѫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ󫫫ҫ*}S*}S󫫫ҫkkkbbbbbbbbbbbbbbbbbbbbbkkkS}*S}*󫫫ҫꘘ}S*}S*󫫫ҫllllllSSS}}**S}*S}*S}}**}*S}}*SSS*}S***S}*S}*S}SS*S}S}}**S}*S}*S}SS*S}*S}*S}S}**}ϦSS*}SS*S}*S}*S}*S}}*SSS󫫫ҫbbbbbbSSSS*}*}*S}*S}SS}S**S}S}**}}*S}*}**}*S}*S}*}}**S}SS*}*}*S}*S}*}}**S}*S}*S}S}**}S*S}SSSS*S}*S}*S}*S}S}**}}*󫫫ҫbbbbbbSS}}***S}*S}*S}}S*SS*S}}S*}S*}S***}}*S}*S}*}S*S}}}***S}*S}*S}*}S*S}*S}*S}SS*S}}S*SS*S}*S}*S}*S}}S**}S󫫫ҫbbbbbbSS}}***S}*S}*S}}S*SS*S}}*S}S*S*}*S}*S}}*}**S}}}***S}*S}*S}}*}**S}*S}*S}*}}**}ϦS*S}**}}SS*S}*S}*S}*S}}*S}*}*󫫫ҫbbbbbbSSSS*}*}SSSSSS}**}S}**S}S}**}}**S}*S}*S}SS*S}SS*}*}SSSSSS*S}SSSS}}****}}*S}*}SSSSS*S}*S}*S}*S}S}*SS󫫫ӬbbbbbbSS}*}}**S}*SS}}}*}*S*S*SSS}*S*}SSS*S}*S}*}S*S}}*}}**S}*SS}}}**}S*S}*SS}}}***}}}}***S}*}SSS*S}S}**S}*S}}*S*}S󫫫ӬbbbbbbSS*S}*S}*}}**}}**S}}S*SS*S}*S}*S}󫫫ӬbbbbbbSS*S}*S}}S****S}*S}SSSS*S}SS*S}󫫫ӬllllllSS*S}*S}}**}}**}SSS}*SSS}*S}*}**}*S}󫫫Ӭᘘ󫫫Ӭlllbbbbbbbbbbbbbbbbbbbbblll󫫫Ӭ󫫫Ӭ󫫫Ӭ󫫫Ӭ󫫫Ӭ󫫫Ҭ󫫫ã󫫫ǥ󫫫ǥ󫫫ǥ󫫫ǥ󫫫ǥ*}S󫫫ǥkkkbbbbbbbbbbbbbbbbbbbbbkkkS}*󫫫ǥꘘ}S*}**}󫫫ȥllllllSSS}}**S}*S}*S}}**}*S}}*SSS}*SSS}**}*S}*S}S}}**S}SS*S}*S}*S}*}*}SSSSSS*S}*S}*S}*S}}*SSS󫫫ȥbbbbbbSSSS*}*}*S}*S}SS}S**S}S}**}}*S}**}}*SS}S**S}*S}SS*}*}*}}**S}*S}*S}S}**}S}}*}}*SSS}**S}*S}*S}*S}*S}S}**}}*󫫫ȥbbbbbbSS}}***S}*S}*S}}S*SS*S}}S**}S}S*}S*}S*SS*S}*S}}}***S}*}S*S}*S}*S}}S***}}*}ϦS*}S}S**S}*S}*S}*S}*S}}S**}S󫫫ȥbbbbbbSS}}***S}*S}*S}}S*SS*S}}*S}*}*}*S}S*}S*SS*S}*S}}}***S}}*}**S}*S}*S}SS*}}*}*S}S***}}*S}*S}*S}*S}*S}}*S}*}*󫫫ȥbbbbbbSSSS*}*}SSSSSS}**}S}**S}S}*SS*S}S}**}}*SS}**}SSSSSS*}*}SS*S}SSSS*}ϦS*}}**}S}}***}S*S}*S}S}*S}*SS*S}S}*SS󫫫ȥbbbbbbSS}*}}**S}*SS}}}*}*S*S*SSS}*S*}S}*S*}S}*S*SS}}}*}*}}**S}*}S*S}*SS}}}*SSS}*S}*}S***}}SS*S}*S}}*S*}}*}*S*}S󫫫ȥbbbbbbSS*S}}S***}}S}**}S}S**S}󫫫ȥbbbbbbSS*S}*}SSS}S*}}S*}*}}**S}󫫫ȥllllllSS*S}}**}*}SSSS}*}**}󫫫ȥᘘ󫫫Ȧlllbbbbbbbbbbbbbbbbbbbbblll󫫫Ȧ󫫫Ȧ󫫫˧󫫫󫫫Ъ󫫫Ъ󫫫խ󫫫խ󫫫ծ󫫫ծ󫫫ծ󫫫ծ*S}*}*}*}*}*S}*}S*}S*}S󫫫ծբmi_______i٬}*S}}}**}}***S}S}*S}*S}*󫫫ծ٭}___________Ԣm*S}SSSS*S}}**}}S*}S*}S*󫫫ծi___________iS*}*S}SS*S*SSS*S}*}S***S}SSS}}**S}}*SSS*}S***S}*S}*S}SS}**}*S}*}S***S}*S}*S}}*S*}S***S}S}}**S}SSSSS*S}*S*SSS*S}}**}*}S***S}S}}**S}}*SS}}**S}*}*}SSSSSS}**}}**}*S}*S}}*S*S}*S}SS*S}S}}**S}*S}*S}*S}*S}*S}S}}**S}*}S***S}*S}}**}S}}**S}󫫫ծ_____i_______*S}SS*S}*}}*S}*}S**S}S}*}**}}S****S}SS*}*}S}**S}S}*}**}*S}*S}*}}*SS}S**S}S}*}**}*S}*S}S}*S}*}**}SS*}*}}S****S}*}SS*}S}*}S**S}SS}S*S}*}**}SS*}*}S}*SS*}*}S}**}S}}*}}*SSS}**}}**}***}**}SSS}**S}*S}S}**S}*S}*}}**S}SS*}*}*S}*S}*S}*S}*S}SS*}*}S}*}**}*S}SS}S*SS*}*}󫫫ծ____ӛ`қ_______*S}}S**S}*}S*S}*}S*S}}S***}}*}}**}}*}}***S}}S**S}}S***}}*S}*S}*}S}S*SS*S}}S***}}*S}*S}}S*}S***}}}}***S}*}}**}}**S}*S}*S}*}S*S}}S*SS}S***}}}}***S}}S*}}***S}}S***}}*}ϦS*}S}S**}S**}}}*SS*}}Ϧ}**Ϧ*S}*S}}S**S}*S}*}S*S}}}***S}*S}*S}*S}*S}*S}}}***S}}S***}}*S}}S*SS}}***S}󫫫ծ___ӛ`ß_àқ______*S}**}}*S}}*}**S}SS*S}S*}SS}*S}}***S}}*S*S}S*}*S}*S}}*}*}S*SS*S}S*}*S}*S}}*SS*}}}***S}SS}*S*S}*S}*S}SS*S}}S*SSS*}}}***S}}*S}}***S}SS*}}*}*S}S***}}}*}*}}***S}}}****}}*S}*S}}*S*S}*S}}*}**S}}}***S}*S}*S}*S}*S}*S}}}***S}S*}*S}}S*SS}}***S}󫫫֮___ΑP___àқ_____*S}*}S*S}SSS}*}**}*S}*S}SSSSSS*}*}*S}S}**S}*S}*S}*S}SSSS}**}*S}*S}*S}S}**S}S}**S}SS*}*}SSSS*S}*S}S}*}**}*S}SS}**}*S}SS*}*}*S}S}*SS*}*}*}ϦS*}}**}S}}***}SSSSSS***}**}}*S}*SS*S}S}*SSSSSS*S}SS*}*}SSSS*S}SSSSSS*}*}*S}*S}SS}**}SS*}*}󫫫֮________àқ____*S}*}S*S}*}S*S}}*}**S}SS*}SS}*}*}}**S}}*SSSSS*S}*S}*}S}*SS}*SS*S}*S*SSS}*SSS}*}}**S}*}SS}**S}*S}*S}}*}**S}}*SSS}*}}**S}}*S}*}}**S}SSS}*S}*}S***}}*}SSS*S}}S**S}}*}*}*S*SS}}}**}S*S}}*}}**S}*SS}}}**S}*SS}}}*}*}}**S}SS*S}}*S}*}}**S}󫫫֮_________ӛ____*S}}S**S}*S}*S}*S}*S}*S}*S}*S}*S}*S}}S***}}S}**}S}S**S}*S}󫫫֮_____________*S}SS*S}*S}*S}*S}SS*S}*S}*S}*S}*S}*}SSS}S*}}S*}*}}**S}*S}󫫫֮i___________iS}*}**}*S}*S}}**}*S}S}**S}*S}*S}*S}*S}*}SSSS}**S}}**}}**}*S}󫫫֮Ԣl___________٭}󫫫֮ج|i_______iգm󫫫֮󫫫֮󫫫֮󫫫׮󫫫׮󫫫׮󫫫׮󫫫׮󫫫׮󫫫׮󫫫׮󫫫׮*S}*}S*}S*}S󫫫ׯբmi_______i٬}*S}S}*S}*S}*󫫫ׯ٭}___________Ԣm*S}}**}}S*}S*}S*󫫫ׯi___________i*S}*S}}**}*S}*S}*S}*S*SSSSS*S}}**}*S}*}*}SSSSS*}*}S***S}SS}*S*S}*}S***S}*S}*S}S}}**S}}*S}**}}**}*S}*S}}*S*S}*S}SS*S}S}}**S}*S}*S}*S}*S}*S}S}}**S}󫫫ׯ_____i_______*S}*S}SS}S**S}*S}*S}S}*}S**S}*S}SS}S**S}S}**}S}}*}}*SSS}**S}SSS}*}**}*S}S}**S}S}*}**}*S}*S}SS*}*}S}**}***}**}SSS}**S}*S}S}**S}*S}*}}**S}SS*}*}*S}*S}*S}*S}*S}SS*}*}󫫫ׯ____ӛ`қ_______*S}*S}}S*SS*S}*S}*S}*S}*}S*S}*S}}S*SS*S}}S***}}*}ϦS*}S}S**S}}S*}S***}}*S}}S**S}}S***}}*S}*S}}}***S}}S***}}}*SS*}}Ϧ}**Ϧ*S}*S}}S**S}*S}*}S*S}}}***S}*S}*S}*S}*S}*S}}}***S}󫫫ׯ___ӛ`ß_àқ______SS*S}}S*SS*S}*S}*S}*S}SS*S}*S}}S*SS*S}SS*}}*}*S}S***}}*S}**}}S*}*S}}*S*S}S*}*S}*S}}}***S}}*S}}***S}}}****}}*S}*S}}*S*S}*S}}*}**S}}}***S}*S}*S}*S}*S}*S}}}***S}󫫫ׯ___ΑP___àқ_____*S}*}}*ϦS}*SS}**}S}*S}*SSS}*}**}*S}*S}SS}**}S}**}ϦS*}}**}S}}***}S*S}*}S*S}*S}*S}S}*S}**S}SSSSSS*}*}*S}S}*SSS***}**}}*S}*SS*S}S}*SSSSSS*S}SS*}*}SSSS*S}SSSSSS*}*}󫫫ׯ________àқ____*S}*S}*S*SSS}*S*S}}*S*}}**S}}*}*SSS}*}*S*S*SSSSSS}*S}*}S***}}*S}*}SSSSS}*S*S*SSSSS*SS}}}*}*}}**S}}*SSS*S}}S**S}}*}*}*S*SS}}}**}S*S}}*}}**S}*SS}}}**S}*SS}}}*}*}}**S}󫫫ׯ_________ӛ____*S}*S}*S}*S}}S***}}S}**}S}S**S}}S**S}*S}󫫫ׯ_____________*S}*}}**S}SS*}SSS}S*}}S*}*}}**S}SS*S}*S}󫫫دi___________iS*}S}**}SSSS}*S}**S}}**}}**}󫫫دԢl___________٭}󫫫دج|i_______iգm󫫫د󫫫د󫫫د󫫫د󫫫د󫫫د󫫫د󫫫ذ󫫫ذ󫫫ذ󫫫ذ󫫫ذ*}S󫫫ذkkkbbbbbbbbbbbbbbbbbbbbbkkkS}*󫫫ذꘘ}S*󫫫ذllllllS}**}ϦS*S}*S}}**}}**}}**}*S}*S}}**}*S}*S}*}S***S}*S}*S}*S}*}S***S}SS}*SSSS*S}*S}SS*}S***S}*S}*S}SS*S}S}}**S}*S}*S}SS󫫫ذbbbbbbS}**}S*S}*S}SS}S**}***}**}SSS}**S}*S}SS}S**S}*S}S}*}**}*S}*S}*S}S}*}**}*S}S}**}SS*}*S}*}}*S}*}**}*S}*S}*}}**S}SS*}*}*S}*S}*}}*󫫫ذbbbbbbSS*S}*S}}S*SS**}}}*SS*}}Ϧ}***S}*S}}S*SS*S}*S}}S***}}*S}*S}*S}}S***}}*S}}S**S}*S}*S}}S*}S***}}*S}*S}*}S*S}}}***S}*S}*S}*}S󫫫ذbbbbbb*}}**}ϦS*S}*S}}S*SS}}***S}}}****}}*S}*S}}S*SS*S}*S}S*}*S}*S}*S}S*}*S}}*S*S}*S}*S}}S*S*}*S}*S}}*}**S}}}***S}*S}*S}}*}*󫫫ذbbbbbb}}****}}*S}*S}SS}**}SSS***}**}}*SSSSSS}**}SSSS*S}S}*S}*SS*S}*S}*S}S}**S}*S}S}**}}**S}*S}*S}SS*S}SS*}*}SSSSSS󫫫ذbbbbbb**}}}}***S}*S}}*SSS*S}}S**SS}}}*}*S*SS}}}*SS*S}}*S*}}*SSSS}*S*S}*S}*S*SSS*}SSS*S}*S}*}S*S}}*}}**S}*SS}}}**}S󫫫ذbbbbbb*}}**}}**S}*S}*S}*S}*S}󫫫ذbbbbbb}S****S}*S}*S}*S}*S}*S}󫫫ذllllllSS*S}*S}*S}*S}}**}󫫫ذᘘ󫫫ذlllbbbbbbbbbbbbbbbbbbbbblll󫫫ذ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫ٱ󫫫۱󫫫۱󫫫۱󫫫۱󫫫۱󫫫۱󫫫۱󫫫۱+U+++UԀU++UԀ+UԀ+U+++UԀU++UԀ+UԀ+UԀUԀ++ԪUU+ԀUUUԀ++ԪUU+ԀUU+UԀ󫫫۱U+Ԁ++ԀUU++Ԁ+UԀU+Ԁ++ԀUU++Ԁ+UԀ+UԀU++U+UԀUUUUU++U+UԀUUUU+UԀ󫫫۱U+++Ԁ+++UԀ+UԀU+++Ԁ+++UԀ+UԀ+UԀUU+UԀU+UUUU+UԀU+UU+UԀ󫫫۱U+Ԁ+++UԀ+UԀU+Ԁ+++UԀ+UԀ+UԀ+Ԁ++ԪU+UԀ++ԀUU+Ԁ++ԪU+UԀ++ԀUU+UԀ󫫫۱+UԀUU++Ԁ+UԀ+UԀUU++Ԁ+UԀ+UԀ++++Ԁ+UԀ+UUU++++Ԁ+UԀ+UUUUU󫫫۱UU+++UԀ+UԀUU+++UԀ+UԀUԀ+++Ԁ+++UԀ+UUU++Ԁ+++UԀ+UUU+UԀ󫫫۱+UԀ+UԀ+UԀ+Ԁ++Ԁ++UԀU+UU+Ԁ++Ԁ++UԀU+UU+UԀ󫫫۱+UԀ+UԀUUU++++UԀ+UԀUUUUU++++UԀ+UԀUUUU+UԀ󫫫۱+UԀ++Ԁ+UԀ++ԀU+UUUԀ+UUUUUԀ+UUUԀ+󫫫۱󫫫۱󫫫۱󫫫ܲ󫫫ܲ󫫫ܲ󫫫ܲ󫫫ܲ󫫫ܲ󫫫ܲ󫫫ܲS|))|ϦSS)|SS)S|)S|)S|)S||)S|)|S)||))||)SS|)S)S|)S|SS)S||))|)S|)S|SSS|)󫫫ܲS|))|S)S|SSSS)S|)S|)S|)S|S|)S|)SSSS)S|S|))S|)S|)||))S|SS|S))S|)S|)||)S|)󫫫ܲSS)S||S)SS)S|)S|)S|)S||S)|S)SS)S||S))S|)S|)|S)S||S)SS)S|)S|)|S󫫫ݲ)||))|ϦS)S|))||SS)S|)S|)S|)S||)S|)SSS)S||)S)S|)S||)|))S||S)SS)S|)S||)|)󫫫ݲ||))))||)S|)|SSSSS)S|)S|)S|)S|S|))S|S|)SSSS)S|)S|S|)SSSSSS)S|SS|))|SSSSSSS|)󫫫ݲ))||||)))S|)|SSS)S|S|))S|)S||)S|)S)||)S|)SS|)S)SS|||))|S)S||)S)SS|||))|SS|)󫫫ݲ)||))||))S||S)SS)S|)S|)S|)S|󫫫ݲ|S))))S|)S|SSSS)S|SS)S|)S|󫫫ݲSSS|)SSS|)S|)|))|)S||))|󫫫ݲ󫫫ݲ󫫫ݲ󫫫ݲ󫫫޳󫫫޳󫫫޳󫫫޳󫫫޳󫫫޳󫫫޳󫫫޳󫫫޳󫫫޳󫫫ߴ󫫫ߴ󫫫ߴ󫫫ߴ+U󫫫ߴU+󫫫ߴU+󫫫ߴ+UԀ++ԀU++UԀUU+U+UUU+UԀ󫫫ߴ+UԀUUU+UU++Ԁ+Ԁ+UԀ+U++UԀ󫫫ߴ+UԀU+UU+++UԀU++UԀ+U+UԀ󫫫ഴ+UԀU+UU+++UԀU++UԀUU+UԀ󫫫ഴ+UԀUU++ԀUU++Ԁ+Ԁ+U+Ԁ++ԀUԀ+󫫫ഴ+UԀ+U+++UԀ+U+U+Ԁ++U+UUU󫫫ഴ+UԀ+UԀ󫫫ഴ+UԀ+UԀ󫫫ഴ+UԀ+UԀ󫫫ഴ󫫫ഴ󫫫ഴ󫫫ഴ󫫫ᵵ󫫫ᵵ󫫫ᵵ󫫫ᵵ󫫫ᵵ󫫫ᵵ󫫫ᵵ|)|))|S)))S|)S)SSS)S|)S|)S|)S||))|)S|)S|)S||)S|)|S)||))||)SS|)S)S|)S|SS)S||))|)S|)S|SSS|)󫫫ᵵSS||S|)|))|S|)|S))S|)S|)S|)S|SS|S))S|)S|)S|S|)S|)SSSS)S|S|))S|)S|)||))S|SS|S))S|)S|)||)S|)󫫫ᵵ)|S|S)))||)S|)|S)S|)S|)S|)S||S)SS)S|)S|)S||S)|S)SS)S||S))S|)S|)|S)S||S)SS)S|)S|)|S󫫫ᵵ|S)S)|)S|SS)S|)S|)S|)S||S)SS)S|)S|)S||)S|)SSS)S||)S)S|)S||)|))S||S)SS)S|)S||)|)󫫫⵵||)))S|S|)|))|S|))S|)S|)S|SS|))|)S|)S|)S|)S|S|))S|S|)SSSS)S|)S|S|)SSSSSS)S|SS|))|SSSSSSS|)󫫫⵵|S)SS)S||)|))S)SSS)S|)S|)S||)SS|))S|)S||)S|)S)||)S|)SS|)S)SS|||))|S)S||)S)SS|||))|SS|)󫫫⵵)|S)S|)S|)S|)S|)S|)S|󫫫⵵|)S||)S|)S|)S|SS)S|)S|󫫫⵵)||))S||))|)S|)S|S|)|))|)S||))|󫫫⵵󫫫⵵󫫫⵵󫫫⵵󫫫⵵󫫫㶶󫫫㶶󫫫㶶󫫫㶶󫫫㶶󫫫㶶󫫫㶶󫫫㶶󫫫㶶󫫫䷷󫫫䷷𫫫䷷𫫫䷷(Qy(Qy𬬬𫫫䷷(Qy(Qy𬬬嬬嬬𫫫䷷(Qy)|S)|S(Qy𬬬欬欬𫫫ssEQQ(Q(QQQQQ(Qyy((y(Qy(QyQQS|)S|)Qy((yʢQQ(yQQ(Qy(QyQ(y(Qyy((yQyy((Qyy(QQQy(y((yQ(((Qy(Q(QQQ(Qy(Qy(Qy(Qyy((yQQ(Q(QQQy(QQQQQ(Qy(y(yy(QQQy((yy((yy(𬬬第第𫫫EsQQQy(Qy(yQ((Qy(QyQQyQ((Qy(Qy(yy(|S)|S)Qy((yQ(QyQQQQ(Qy(QyQy((QyQQyQ(QQ(y(yQy((yy(QQyyQy(y((yQy(yQ((Qy(Qy(Qy(QyQQyQ(yy(yy(Qy(yQ(Qy((yy((yy((Qyy((yQy((Qy(y(((y((yQQQy(QQ𬬬第第𫫫䊷(yQyQ((Qy(yQ(Qy(QyyQ(QQ(Qy(Qy(yQS|)|))|S||))S|)S|)S|)|S)))S|)S|)S|S||))S|)S|)S|)S|)S|S||))S|QQ(QyyQ(QQ(Qy(Qy((yyyy((ʢ(QyyQ(QQyy(((QyyQ((yQ(yQyQ(((yy(Qy(yQ(Qy(Qy(Qy(QyyQ(QQ(yʢQ(Qy(yQyQ(yQ((yQ(Qy(yQ(QyyQ((Qy((yyy(QQ(yyʢy((yQ(𬬬謬謬𫫫䊷yQ(((yy(QyQQ(Qy(QyyQ(QQ(Qy(Qyy(y()S|SS|S)SS)|)|)S|)S|S|)|))|)S|)S|SS)|)|)S|)S|)S|)S|SS)|)|(yy((yʢQ(Qy((yyQQ(Qy(Qyyy((QQ(QyyQ(QQyy(((Qyy(Qy(y(yQ(Q(y(QyQQ(Qy(Qy(Qy(QyyQ(QQy(Q(QyQQy(QyQ(y(y((QyQQ(Qyy(Q(Qyyy(((Qyyy((((yyyQ(𬬬鬬鬬𫫫Esyy(((yQQy(y((y(Qy(QyQQy((yQQQQQQ)S||S)SS||)))S|)S|)S||S)))||)S|)S|||)))S|)S|)S|)S|)S|||)))S|yy((((yy(Qy(yQQQQQ(QyQQyy(((QyQQy((yQQ(y(y(QyQy(QQyy(((QyQy(y((yQy((Qy(Qy(QyQQy((y(yQQy(y((y(QyQy((yy(QQ(Qy(Qy(Qy(QyQy((QyQQQ(((y((yy(QQ𬬬鬬鬬𫫫ssEyQ(((yy(Qyy(y(QQ(Qyy(Q(QQyyy((yQ)S||S)SS||)))S|)S|)S|S)|)S|)S|||)))S|)S|)S|)S|)S|||)))S|((yyyy(((Qy(yQQQ(Qy(QyQQ((yy(Qyy(Qy(yy((Qyy(Q(yQyQ(QQ(Qyy(y((Q(QQQ(Qy(Qy(Qyy(QQy((Qyy(y(y(Q(yQ(yQ(QyQy((Qyy(QQQQQ(QyyQ(y(𬬬鬬鬬𫫫䊷(yQyQ((Qy)S|SS|))|SS)|)|S)|)S|SSSSSS)|)|)S|)S|SSSSSS)|)|(yy((yy((QyyQ(QQ(Qy(Q(QQy(QQQ(Qy(Qy(yQ(Qy(Qy(QyQy((Qyyy(((Qy(Qy𬬬鬬鬬𫫫䊷Q(y(yy((Qy)S||)S|)||))S|)S|)S|SS)SS|||)|)||))S|)S|)S|)SS|||)|)||))S|yQ((((Qy(QyQQQQ(Qy(Q(((yQ(y(Qyy(Qyy(Qy(Qy(QyyQ(yy(Q((Q(Qy(Qy𬬬ꬬꬬ𫫫䊷Qy(y((y)S|)S|)S|)S|)S|QQQy(QQQy(QQ(y(y(Qy(yy((Qyy((y(Qy(QyQQQQ(Qy𬬬묬묬𫫫䷷)S|)S|)S|)S|)S|𬬬쬬쬬𫫫䷷)S|)S|)S|)S|)S||))|𬬬𫫫䷷𬬬𫫫䷷𬬬שּׁשּׁ𫫫䷷𬬬𬬬𬬬𫫫常𬬬𫫫常𫫫常𫫫常常常常常常游游游游游¿¿游+UԀ+UԀ+U+UԀ+U+UԀ+U+UԀ+UԀUU+UUUllllll%$#$#"游Ҫ+UԀ+UԀUԀ++UԀUԀ++UԀUԀ++UԀ+UԀ+Ԁ+UԀ++Ԁ+游هTW[z_vb+UԀ+UԀU++UԀU++UԀU++UԀ+UԀU+U++U游ٍOSVY|]UU+UԀ+U+UԀ+U+UԀ+U+UԀ+UԀU++U+Ԁ+游ْKNQTX+UԀ+Ԁ+ԪUԀ++UԀUԀ++UԀ+UԀUԀ+UԀ++UԀUԀ+UUUU+Ԁ++UԀUԀ+UU繹ٝSIMPSӭױ+UԀ+UԀ+U+UUU+UUԀ++U+U+UUU+U+UUԀ++U+U+U繹ٹ}j]YY¢˧+UԀ+UԀ+UԀ繹ٲhilnq˱ɷ+UԀ+Ԁ+UU繹ؾ˱˱U+ԀU+繹llllll$#"%$#躺¹麺꾾ʿtqsl-2.8.1/apps/help/tqslapp/pref-opt.htm0000644000175000017500000000667615003421124020337 0ustar rmurphyrmurphySetting TQSL Options

Setting TQSL Options

To inspect or change TQSL's options, select the File menu's Display or Modify Preferences... command (on OS X, select the Application menu's Preferences command) to display its Preferences dialog; this dialog's Options tab provides control over several settings that govern TQSL's operation:

Enable automatic Backup File creation on termination
If you want TQSL to automatically create a Backup File when it terminates, check the Allow automatic configuration backup box, click the Browse button to the right of the Backup File Folder textbox, and use the Browse For Folder dialog that appears to select the folder in which Backup Files will automatically be created when terminating. The most recent Backup File created on TQSL termination will be named tqslconfig.tbk. TQSL will automatically retain the number of previous Backup Files specified by the Number of Backups to retain setting, deleting the oldest Backup Files in excess of this setting. Retained Backup Files will include the date and time of their creation in their filename.

Open ADIF files in ADIF editor
If this box is checked and TQSL is started with a command line that specifies a file with an .ADI extension but does not specify -q or -x switches, then TQSL will display the contents of the specified ADIF file in its ADIF Editor instead of signing the contents of the ADIF file; if this box is not checked, then when started from a command line that specifies an ADIF file, TQSL will always sign the files contents.

Display status messages in a separate tab
With this box unchecked, TQSL displays status messages in a Status Log pane below the three Log Operations, Station Locations, and Callsign Certificates tabs:

Enabling this option and then restarting this TQSL adds a fourth Status Log tab to the right of the other three. This enables more Station Locations and Callsign Certificates to be visible without scrolling:

Any change to the Display status messages in a separate tab option will take effect after TQSL is next restarted.

Enable passphrases for Callsign Certificates
If this box is checked, when a user creates a new Callsign Certificate, they will be prompted for a passphrase to protect that file. This option is not recommended unless the Callsign Certificate is stored on a shared computer system.

tqsl-2.8.1/apps/help/tqslapp/primary.htm0000644000175000017500000000140515003421124020247 0ustar rmurphyrmurphyTQSL Primary Operations

Primary Operations

tqsl-2.8.1/apps/help/tqslapp/promptforcall.bmp0000644000175000017500000126123615003421124021451 0ustar rmurphyrmurphyBMb6(\RhbΚ^\Z865653210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210210432VUR󫫫MKI渶@?=|{yonlRPNA@>wwweeeJHF/.,IHFꥣnlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinlinli.-,-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nlinli-,+-,+nliһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<S虢ޙ♤䙥晥虥虥뙥왥zwfVSfVSfVSzwzwfVSfVSfVSzw왥뙥虥虥晤䙤♤9>SjjjWfTbTbTdTeTeSfSfSfShRiRiPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjRiRiShSfSfSfTeTeTdTbTbXf>-*'-*'YԪJY׫K ۨJ ~ ~WۧILU֤L ֤ | ؤGοͿ̾ͿͿ̾̾̽;;̾ʽʽʽʽ˽ʼʼʼɻɻɻȺȺȻȻȻȺȺȺȻȻȻɻɻɻɻʼ˽Ϳ;HVHVHVHVGVGVFXDYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*' êK ÂWۨJV}WڦILUգ  J Ϳ̾̾ͿͿ̾̾̽;̾˾˾ʽɼɼʼʼʼʼȺȺȺȺȺȻȻȻȻȻȺȺɻɻɻʼ˽̾Ϳ 9̿˾˾̿̾˽ʽ˾˾ʽ˾˽˾˽̿̿?DY꫰૱㫲䫲䫲櫲課課몲쪲者者쪲쪲髲髲竲嫲嫱䫰?DYꠝF2X?oPaFW?/,)0.,BFZBFZ/-+.+(H4Y@eI}ZrRfJZAK6-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'D1P:`EiLqRtqsl-2.8.1/apps/help/tqslapp/qsodata.htm0000644000175000017500000000771015003421124020225 0ustar rmurphyrmurphyTQSL Creating and Editing an ADIF File

Creating and Editing an ADIF File

TQSL includes a simple QSO Data Editor that can be used to create and edit small log files in the ADIF format. This Editor is rudimentary, intended only as a means for those who do not have access to a logging application create and edit log files. The Editor provides access to only the most critical QSO data fields:

  • Callsign
  • Date
  • Time
  • Band
  • RX Band
  • Frequency
  • RX Frequency
  • Mode
  • Propagation Mode
  • Satellite

To activate the Editor, select the File menu's Create New ADIF file command to display the QSO Data dialog:

After setting each field to the desired value, click the Add QSO button to add another QSO. When more than one QSO record is present, you can use the arrow buttons to step through the records - though you will not be permitted to step away from a record that contains an error or whose critical fields have not yet been specified. This includes the blank record at the end if you have just clicked Add QSO.

You can delete the currently-displayed QSO by clicking the Delete button.

After all QSO records have been entered, click the Ok button to save them to an ADIF file of your choice.

To edit an existing ADIF file, select the File menu's Edit existing ADIF file command. After you choose the file to edit, the QSO Data dialog will display the first QSO in the file.

Required QSO Fields

Call Sign

The call sign of the station worked.

UTC Date (YYYY-MM-DD)

The QSO date in Coordinated Universal Time (UTC, sometimes called GMT) must be entered in YYYY-MM-DD format(e.g., 2002-08-11 for August 11, 2002).

UTC Time (HHMM)

The QSO time in Coordinated Universal Time can be entered in HHMMSS or HH:MM:SS format. Seconds may be omitted (HHMM or HH:MM).

Mode

The Mode selector is populated with the modes recognized by LoTW. You can create a mapping for modes not present in the selector.

Band

The Band selector specifies the band on which the QSO took place. In the case of crossband QSOs where you transmit on one band and receive on another, select the band on which your station transmitted. All amateur bands from 137 kHz (2190 meters) through the millimeter waves are supported by LoTW.

Optional QSO Fields

RX Band

Leave this field blank unless you are logging a crossband QSO, in which case you should select the band on which your station received.

Frequency

Record the frequency in megahertz on which the QSO took place; this frequency should be consistent with the selected Band field. In cross-band QSOs, specify the frequency on which your station transmitted.

RX Frequency

Leave this field blank unless you are logging a crossband QSO, in which case you should specify the frequency in megahertz on which your station received.

Propagation Mode

Select the propagation mode used to make the QSO, if known. LoTW uses this field to distinguish among the various VHF/UHF propagation modes for those awards that require this information. It is also required to designate Satellite QSOs for DXCC, WAS, VUCC and other awards or endorsements available for contacts made via amateur satellites.

Satellite

If you have set the Propagation Mode selector to Satellite, set this selector to the name of the amateur satellite used to make the QSO. tqsl-2.8.1/apps/help/tqslapp/renewing.htm0000644000175000017500000002727415003421124020416 0ustar rmurphyrmurphy Renewing a Callsign Certificate

Renewing a Callsign Certificate

Every Callsign Certificate expires after 3 years. A Callsign Certificate is easy to renew before it expires; after a Callsign Certificate expires, your only recourse is to request a replacement Callsign Certificate .

Note that if you renew Callsign Certificate before it expires, requesting the renewal immediately invalidates the existing Callsign Certificate.

These instructions for renewing a Callsign Certificate assume that

  • your Callsign Certificates reside in the folder C:\\MyLoTWCertificates (if you've stored them in a different folder, adjust the instructions accordingly)
  • you are renewing a Callsign Certificate before it expires
  • the Callsign Certificate to be renewed is named YourCallsign.tq6 , e.g. K1MU.tq6

If your Callsign Certificate has already expired, you must request a replacement Callsign Certificate .

To initiate the renewal of your unexpired Callsign Certificate,

1. Delete the Callsign Certificate Request file C:\\MyLoTWCertificates\\YourCallsign.tq5 if it's present; this original certificate request is no longer needed.
   
2. Start TQSL and select the Callsign Certificates tab, which lists your Callsign Certificates.
   
3. In the Callsign Certificates tab, click on the certificate to be renewed:
 
  and then click the Renew the Callsign Certificate button.
   
4. The Request a New Callsign Certificate window will appear, showing that you are creating a new Callsign Certificate Request file; click the Next button.
   
5. The Request a New Callsign Certificate window will now show your Callsign and DXCC entity (both grayed out because they can't be changed):
 
    5.a the QSO begin date should already be set to the begin date specified on your current certificate
    5.b for an active callsign, the QSO end date should be remain blank; for an inactive callsign, the QSO end date should already be set to the end date specified on your current certificate
    5.c click the Next button
     
6. The Request a New Callsign Certificate window will now show your name and address; make any necessary corrections, and click the Next button.  
     
7. The Request a New Callsign Certificate window will now show your email address; make any necessary corrections, and click the Next button.  
     
8. The Request a New Callsign Certificate window will now prompt you to specify a passphrase; leave both passphrase boxes empty, and click the Finish button.  
  If you're using a shared computer, you should protect the Callsign Certificate by entering the same passphrase in both textboxes; you'll be asked to provide this passphrase each time you direct TQSL to digitally sign a log file using the requested Callsign Certificate.  
  If you control access to the computer you're using, you can leave both textboxes empty, thereby avoiding the need to provide a passphrase each time you direct TQSL to digitally sign a log file.  
  Then click the Finish button.  
     
9. If your computer has internet access, you will be asked if you want to upload this certificate request to LoTW; click the Yes button, and then select TQSL's Status Log tab to view results of the upload.

If your computer does not have internet access, click the No button, and you will be prompted to save a file whose name is the callsign and whose extension is .tq5. Save this Callsign.tq5 file, move it to a computer with internet access, and then upload it via https://lotw.arrl.org/lotwuser/upload ; use the Browse or Choose File button on this web page to navigate to the folder into which you saved the Callsign.tq5 file, and then click the Upload File button.

 
   
     
10. If the Callsign Certificate you've selected to renew is passphrase-protected, you'll be prompted to specify the passphrase:  
   
  Enter the password and click the OK button. If you've forgotten the passphrase, click the Cancel button and request a replacement Callsign Certificate.  
     
11. TQSL's Callsign Certificates tab will display an entry for your new certificate request with a pending icon:  ; you can terminate TQSL by opening its File menu and selecting the Exit command (on OS X , by selecting the Application menu's Quit tqsl command).  

Make sure that your email address is correctly specified in the Account Settings section of your LoTW Web Account's Your Account tab.

ARRL staff will review your request and send you a new Callsign Certificate via email, an action that is typically completed within 1 business day; if you do not receive your new Callsign Certificate after 3 business days, do not direct TQSL to delete the pending Callsign Certificate so you can make another request; instead, send an email message to LoTW-help@arrl.org asking why your requested Callsign Certificate has not arrived.

When you receive email from the ARRL message with an attached file named Callsign.tq6, then using the same computer with which you performed steps 1-11 above,

12. Save the attached file into the folder C:\\MyLoTWCertificates .
   
13. In the folder  C:\\MyLoTWCertificates , double-click the entry for YourCallsign.tq6 ; TQSL will start, and load your renewed Callsign Certificate, showing the results in the Status Log on the lower half of its window; any older Callsign Certificates for Callsign will automatically be deleted. If you select TQSL's  Callsign Certificates tab, the entry for your new Callsign Certificate will be displayed with a yellow medal icon:
 
   
14. To protect your renewed Callsign Certificate(s), direct TQSL to create a Backup File .

 

tqsl-2.8.1/apps/help/tqslapp/renewing1.bmp0000644000175000017500000264446615003421124020477 0ustar rmurphyrmurphyBM6I 6(?I kM`FV>A/8(/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)D<.QH8l`JuhP{mTcGV>B0/,)1/-󢟝1/-/,)LD4h]GocLZAB0ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼̽̽;;οοοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ碟KC3eZFI5-*'ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼˼̽̽;;οοοοοοοοοοͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾Ϳޢ-*'NE5=,0.,ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼˼˼̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳ.,*A:-ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼˼̽̽;;οοοοοοοοοοοοͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾̾ӡ-(-*'-*'-*'ߢohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'Ϳohbohb-*'-*'Ϳohbohb-*'-*'Ϳohb뺺ohb-*'-*'ͿͿohb랞ohb-*'-*'ͿͿͿohb뎎ohb-*'-*'ͿͿͿͿohb|||vvvvvvxxxohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿ̾ohbohb-*'-*'ͿͿ̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˼˼˼ohbohb-*'-*'˼˼˼˼ohb돏Ŀohb-*'-*'˼˼˼˼ohbuuuohb-*'-*'˼˼˼˼ohbsssohb-*'-*'˼˼˼˼ohb{{{ohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼̽̽;ohbohb-*'-*'̽̽;;ohb½½ohb-*'-*'̽̽;;ohbohb-*'-*'̽̽;οohbohb-*'-*'̽;;οohb``ohb-*'-*';;οohb``ohb-*'-*';;οohb66·`·6```666`·66``666`·66`6``6ohb-*'-*';οohb`666·`6666·6·`6`66·6·`66·66``6Ϋ`6`·66ohb-*'-*';οohb``66·66·66·66·6666``6666`6`666ohb-*'-*'οohb``6666·66·6666``6666`6Ϋ6666ohb-*'-*'οohb``66``66·6666`6``66``6Ϋ```66ohb-*'-*'ohb``6·666·6``6666666666`66ohb-*'-*'ohb6`·``666666ohb-*'-*'ohb6·6666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉ohbͿ̾-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿ̾-*'-*'ohb𕌉䏏ohbͿ̾;-*'-*'ohb𕌉uuuuuuohbͿ;;-*'-*'ohb𕌉ppppppohbͿ̾;̽-*'-*'ohb𕌉ppppppohbͿ̾̽̽-*'-*'ohb𕌉ppppppohb̾̽̽˼-*'-*'ohb𕌉ppps:q8s9s:t:t:t:s:q8r:pppohb;̽˼˼-*'-*'ohb𕌉pppr8u;~@FOV\^^\VOF@u;r9pppohb̽̽˼˼-*'-*'ohb𕌉pppp7t9DSdlqsuvwvtqleSDu9q7pppohb̽̽˼˼-*'-*'ohb𕌉pppp6v:GYmppqsuwyyxvtrqqnZGv:p6pppohb̽˼˼ʻ-*'-*'ohb𕌉pppp6~?Rfklmpruwyz{zxvsqnmlfR~?p6pppohb˼˼ʻʻ-*'-*'ohb𕌉ppps8C^hghkmpruw{|}|yvsqnlihi_Cs8pppohb˼˼ʻʻ-*'-*'ohb𕌉pppr8G]ecehjjjmoqsuvtqpmkjkifdf^Hr8pppohb˼˼ʻʻ-*'-*'ohb𕌉ppps8F`a`behicԨxժ{֫{׫{ج{٬{ج{ج{׫{֪{ժ{ԩ{djifcabbGs8pppohb˼ʻʻʻ-*'-*'ohb𕌉pppp6AY^]`beghbdihfca^_ZBp6pppohbʻʻʻʻ-*'-*'ohb𕌉pppp5{=W[Z\_adfg_bhheb`][\X|=p5pppohbʻʻʻʻ-*'-*'ohb𕌉pppt9JZWY[^`cef_̟p͡rѭѭ̡r̠r_gfda_\ZX[Kt9pppf:ېohbʻʻʻʻ-*'-*'ohb𕌉pppo6ATTUXZ]_bdfeder%Ȼt)eeegec`^\ZWUVBo6ppp::ohbʻʻʻʻ-*'-*'ohb𕌉ppps8LTRTWY\^`befiis%ȼu)iihfdb_]ZXUSUMs8ppp:::f:::fې::ې:::fohbʻʻʻʻ-*'-*'ohb𕌉pppp6|>RPQSVXZ\_acefgq%ȹs)ggedb`^\YWURPS}?p6ppp:ff::ff:fې:f::::ې:ffohbʻʻʻʻ-*'-*'ohb𕌉ppps8FOMPRTVY[]_acdep%ȸr)eedb`^\ZXVSQOPGs8ppp:ې::ې:ff::ې:::fې::ohbʻʻʻʻ-*'-*'ohb𕌉pppw;MLLOQSUWY[]_`bbo%ȷq)bca`^\ZYVTRPMMNx;ppp::۶:fې::۶:fېfff:::::ffohbʻʻʻʻ-*'-*'ohb𕌉pppo4{=MLLMOQSVWY\_abao%ȵq)`a_^\ZYWTRPNLLN}>o4ppp::ېf:::ېf:۶fff:::f::ffohbʻʻʻʻ-*'-*'ohb𕌉pppo6@QS UY]di"m&p(t,w.z2~6ŀ8ŀ8Nӻ~@omf`ZXVUSQNMLLL@o6ppp:ې:fې::ې:fې::fې::f::fې::ohbʻʻʻʻ-*'-*'ohb𕌉pppp6J h(m/o1q4s5t6u6w6w6y6z6{6{6}6|5MXŃ?Ń?ĄAŇG>t-cUQOMLLLLBp6pppf::::fېf::::fېfffffې::ې:fې:ohbʻʻʻʻ-*'-*'ohb𕌉pppp6Or6u:u:u:u:u:w:x:y:z:{:|:}:~:}:QT}9~:}:}:~=CMT~Et6c!UMLKBp6ppp::::fې:f:::ې:ې:ohbʻʻʻʻ-*'-*'ohb𕌉pppp6Ru;w>w>w>w>w>x>y>z>{>|>}>}>~>~=TX~=>~>}>|>|>z>z>|C~GJIx>d!MBp7pppohbʻʻʻʻ-*'-*'ohb𕌉pppp7Uy@{B{B{B{B{B{B{B|B}B~B~B|@}A|?X\ABBB~B}B|B{B{B{B{B{B{COV_(q7pppohbʻʻʻʻ-*'-*'ohb𕌉pppq7U{C}F}F}F}F}F}F}F}F~FF~EyAܿۿƯ_FFFFF~F~F}F}F}F}F}F}F}FMf2r8pppohbʻʻʻʻ-*'-*'ohb𕌉pppr8R}FKKKKKKKKKKJ{EÒeJKKKKKKKKKKKKKRa+t9ppp::ffff::::ohbʻʻʻʻ-*'-*'ohb𕌉pppr8M|GOOOOOOOOOONJĕiNOOOOOOOOOOOOOTX!t9ppp::f:ff::::ohbʻʻʻʻ-*'-*'ohb𕌉pppG zESSSSSSSSSSSQڽ۾ڽڽڽڽڽڽճ^SSSSSSSSSSSSSSWLppp::ې::fې::f::fff:::::ېfff:::::ې:::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې::::f:::f:f::ې::fff:::ې::fې::::f::ohbʻʻʻ˼-*'-*'ohb𕌉ppp|@vAWWWWWWWWWWWVVVUUUUUUUVWWWWWWWWWWWWWWRCppp::ff::ېf::::f:ې::ې:::ې::ې:f:::::ff:f:::ې:ې::ې::ېf:::::fې::ې:::::fff::f:::ې::ې:::f:::ې:ېf:ff::f:ې::ff:۶f::f:ff::f:::ffېf::ې::۶ff:۶f::ohbʻʻ˼˼-*'-*'ohb𕌉pppz=_'Î^\\\\\\\\\\\\\Œ[Y`řrřraXŒ[\\\\\\\\\\\\\œei4|>ppp::::ې::ff۶:::f::::ې::ffff::ې::::ې::::::ې::ې::ې::ff۶::fې:::ې::::::::::::ې::ې::ې::ې::::ې::ې::ې:::::f::::f:۶:::f::::::ې::ې::ff::ې::f:۶::ohbʻʻ˼˼-*'-*'ohb𕌉pppy;FÒdÐ`Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_[jk[Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Đ`ˠxI {=ppp::ff۶::ff:::f::ې::۶ffff::ې:::::f::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:f:::f::::f:۶:::f:f۶::::ې:::fff::ې::f:۶::ohbʻʻ˼˼-*'-*'ohb𕌉ppp}?r<ǕgƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdƒdfgƒcƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdənP@ppp::ff۶::f:ff۶::ېff۶::ffffff::ې:ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::::ېff۶:fff:۶f::ېffff:::f::ې::ff::f:ff::۶ff:۶f:fohbʻ˼˼˼-*'-*'ohb𕌉ppp}>TdǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhƔgˣˤƓfǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhƛr[@ppp::::ې::::f:::ff::::ې:f:fې:ff:::ff::ېff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ېf:::ff::ff:ff:::ff::ې::ff:ff:::ې::ې::f::f::ffohb˼˼˼˼-*'-*'ohb𕌉pppEp;͟vʘlʘlʘlʘlʘlʘlʘlʘlʘlʘlɗkЫѬȖjʘlʘlʘlʘlʘlʘlʘlʘlʘlʘlϤ}{HHppp:::f::::ې::::ې::::f:::::f:ohb˼˼˼˼-*'-*'ohb𕌉pppH R×mΡy˛p˛p˛p˛p˛p˛p˛p˛p˛p˛oΤΥ˚o˛p˛p˛p˛p˛p˛p˛p˛p˛pϢzȠyWJ ppp:f::::::ې::::ې::::::ې::۶:fې::::::ې:::fېohb˼˼˼˼-*'-*'ohb𕌉pppRf-ɟyϡyΞtΞtΞtΞtΞtΞtΞtΞtΞt͝sٵٶ͝sΞtΞtΞtΞtΞtΞtΞtΞtΞtТzͧl3Uppp::::::ې::ffffohb˼˼˼˼-*'-*'ohb𕌉ppp\ yEհҥϡxϡxϡxϡxϡxϡxϡxϡxϡxϡyز¨éسϡyϡxϡxϡxϡxϡxϡxϡxϡxϡxҦ״}J_#pppohb˼˼˼˼-*'-*'ohb𕌉pppf,SҰխѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}ѥ}֭ճZi/pppohb˼˼˼˼-*'-*'ohb𕌉pppp8RִڶӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧڵظXs;pppohb˼˼˼˼-*'-*'ohb𕌉ppp}JS̩۷֬ժժժժժժժժժժժժժժܷ֬ϬWLpppohb˼˼˼˼-*'-*'ohb𕌉ppp^TƟw׹Ȱ޼د׭׭׭׭׭׭׭׭׭׭د޼ȰغȢzX_pppohb˼˼˼˼-*'-*'ohb𕌉pppefɣ|ٽι˴©߾߼߻߻߼࿣éʳ˳׹ʥ}jgpppohb˼˼˼˽-*'-*'ohb𕌉pppǢ{Ğt˨ԵèʲѼӿҽ˳Īն̩ƠvȤ}pppohb˼˼˽˽-*'-*'ohb𕌉pppбϯбӴԷԷӵѲѱѲpppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉uuuuuuohb˽˽˽˽-*'-*'ohb𕌉葑ohb˽˽˽˽-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb˽˽˽˽-*'-*'ohb𕌉䏏ohb˽˽˽˽-*'-*'ohb𕌉uuuuuuohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉ppp4Q*d4j7i7[0C"pppohb˽˽˽˽-*'-*'ohb𕌉ppp$D2V=fHrPwTuRlJR8!3`1FKNPQQPMJx>= pppohb˽˽˽˽-*'-*'ohb𕌉ppp%Y?amu|wnmggT k+GKNPQQRSSRQNJx>$pppohb˽˽˽˽-*'-*'ohb𕌉ppp(kMpu}zb^ ~;GKLKJKLNPQSTSQLG= pppohb˽˽˽˽-*'-*'ohb𕌉ppp^@\ooi >GIHFDHMP R T V W S T UTPI@"pppohb˽˽˽˽-*'-*'ohb𕌉pppxRam~xc|9EFDAADr5LORTU[" W V V V UQKpppohb˽˽˽˽-*'-*'ohb𕌉pppN3|Vco}i-l)DDB?@EJw;RVY[!\"b(^] [ Y X VQGpppohb˽˽˽˽-*'-*'ohb𕌉pppgD|Vcn~u d\CC@=?EL R~BY ]#a&d(e)k/hfb_\ Y WPN-pppohb˽˽˽̾-*'-*'ohb𕌉pppqJ{Tbl ~r/q-A@>>EL T\ Ja'f+j.m0o1u7splgb] Z VNpppohb˽˽̾̾-*'-*'ohb𕌉pppxQ_jw t A@>>DL V_gVj1q5v9y;z<~A"{upic] Y Tpppohb˽˽̾̾-*'-*'ohb𕌉pppuMZfrzz} y~D??BL Xdo yf{> D H J JO3-%zrib\ V ^9pppohb˽˽̾̾-*'-*'ohb𕌉ppppH}Vbhvrv ª _1?@BM \iv'0(yOUY\[_I̡@ș5‘* }sh_ Y {Kpppohb˽̾̾̾-*'-*'ohb𕌉pppwO\fiyqrz Ȳ ι)̹/R=@EP^lz+8”Dʟ9` h$o%r$p(r`ײUѪH˟9Ĕ,!}sg [Upppohb̾̾̾̾-*'-*'ohb𕌉pppqI}Vafgysw ˵+:CPFGT]mv*8EřQͣFē's.~2436nڹcԮT̢EÕ6)zpeXpppohb̾̾̾̾-*'-*'ohb𕌉pppwN[cc[b}zʵ':P_[XW`k{| ~GKVd'u18Ž=ǖ@̜?͞<ʙ4*{ eP$g2&vlbpppohb̾̾̾̾-*'-*'ohb𕌉pppoF{S]b]zSxS ůѾ5PͼPcGo1bkx.×9Z^#o.8?ʙDϡGҨGԪEҨ>̜4(r>QΥ;ŕ,!{q`pppohb̾̾̾̾-*'-*'ohb𕌉pppsJW^^}VpIgAíϼ/J/^ d igsv5ɟJЪUϩ*p'v2<ǕCΡIөK֯KرI֮CФ8œ[ͤsܼ[ӬCɛ1%ulOpppohb̾̾̾̾-*'-*'ohb𕌉pppvNY]YqKa;Z4d?g[ p^f m i v Ř9ͥPӯeٹoں:4?˛FѧL֯OسOٴJװDѥsۺ|bֱH˟5'{pppohb̾̾̾̾-*'-*'ohb𕌉pppnFyQZ[xRkF`:b:f=g?mEsKxQX_f n uyCV ɝ;ϩTճiۼ|ŅIʜ?͠HԬRٳV۶TڵM֯Ǥٕe׳L̢8)(~pppohb̾̾̾̾-*'-*'ohb𕌉pppoG{RYWsMlGd<e<g?lDrIwO~V]e m v~'ĕˠ;ѫT׵kܽ~ǏЗWծG֮TٵY۷Vٴϰޥٕ~d׳L̢7)1jLpppohb̾̾̾̾-*'-*'ohb𕌉ppppH{SW~Y~YzSa:e=iAoFtLyR[c l u~$Tfț͢2ҬQ׶jܿ~ȐѝؤbܺMٴVٵԶݢؐzaձIʠ4=[Bpppohb̾̾̾̾-*'-*'ohb𕌉pppqI{SZmZgAc;f>jBpHa _i s }&.6+Σ'ӬJ׶dܿ{ȍЛצݫkմۛՉsܼ[ҬBǜ<\]+kEpppohb̾̾̾̾-*'-*'ohb𕌉pppqI{UtnkFd<d<e>` zSyR[e o z%/ū9ʱAOʢҫ;׵ZܽrƅΕՠڨެߧܟؑh׵OͥCǝayEnGnFpppohb̾̾̾̾-*'-*'ohb𕌉pppvPvgebb:kEptM~V`k v",Ū7˳BкLӾT^,̤"׳Fڻdyˋҗןڤܥܣ۝דуoٺWЫQʣuI[ vNsKpppohb̾̾̾̾-*'-*'ohb𕌉ppp݆bstMnFf>c;iBkDpHxQZe p |(è4ʱ@йKԿT]eg`ŕ4ڻJܽgẏѐԖ֗֔Ӌmٺ]ԱmęA~g |U{Spppohb̾̾̾̾-*'-*'ohb𕌉ppp`rsMnEf=d;f>xRvP{T^j u".Ȯ:ζFӽQ[dlrt|̤_cmx}zrqܿ|̪ŲJ2q `}Xpppfff:ېohb̾̾̾̾-*'-*'ohb𕌉ppp_lhkCe=d;e=e uP}Wb n z&ĩ2˳?ѺLWajpw}ڂׂ{ɏ˞̩ͧˤƘnّrUƭ7{i\pppff::ohb̾̾̾̾-*'-*'ohb𕌉pppa eklGf@d=tNvwSYf r (ǭ5͵CҼOZdmu{ف܅݇܇ۆ؃~xqi^ҼRݐyZ̶>!r ` ppp::::ې::ې::::ې::۶:fېf:fff:::::ې:::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې::::::f:::::f:::fې::ې:::fohb̾̾̾̾-*'-*'ohb𕌉ppp^ac`abl p[i v!*ɯ8ηDӾQ\fow}ڃ܇݊݋܊ۇك~wmbԾSq`ѽB%{ ppp::ffff::::ff::fې:ffffېf:::::ff:f:::ې:ې::ې::ېf:::::fې::ې:::::fff::f:::ې::ې:::f:::ې:ېf:ff::۶ff:۶f:::ff::ff:fې:f::::ې:ffohb̾̾̾̾-*'-*'ohb𕌉ppp}W~W{TwOyS}Vdx{tx"è*ɰ8ϷEӽQ]gow~ڄ܈݋ލ݌܉څ׀xocT؄bHì*yppp::ېf:::::::ې:::۶f:ff:ff::ې::::ې::::::ې::ې::ې::ff۶::fې:::ې::::::::::::ې::ې::ې::ې::::ې::ې::ې::::ې::f:۶:::ې::ې:ff::ې:::fې::ohb̾̾̾̾-*'-*'ohb𕌉pppzT xRvPrKtMzT`q )~#è*ʰ6ϷCӽP\fow~ل܈݋ݍ݌܊چ׀yocTihKDz/~ppp:::f۶:::::f:fېff۶f:f:::ې:::::f::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:f::ې::f:۶::::۶:fې::۶:fېfff:::::ffohb̾̾̾̾-*'-*'ohb𕌉ppptLtLqIsKyR_n6#ç*ɯ3ζ@ҼMYdmu|؂ۇ܊݋݋܈ڄwm`[̵A`qUƲ8$ppp::f:۶ff:::ff:ff::ff:ffff:f::ې:ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::::۶ff:۶f:f::ېf:::ېf:۶fff:::f::ffohb̾̾̾̾-*'-*'ohb𕌉ppprJsJsJuL{T_p )͸Dĭ?"(Ƭ0ʹ<ѺHU`jryلۇ܈܇ۅف{shtԉw4b=rkppp::ff::ې::ff::ې::ېf:f::ff:::ff::ېff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ېf::f::ff:ې:fې::ې:fې::fې::f::fې::ohb̾̾̾̾-*'-*'ohb𕌉ppptMrHuKxNWbr !ʴ4J͸J[ϺP˱7ϷBҼNZdmtzقڃڃف|uma֋сҾ_/$pppp::f:::ې::::ې::::f:::f:f::::fېf::::fېfffffې::ې:fې:ohb̾̾̾̾-*'-*'ohb𕌉pppsKuKzPYeuʴ-Ѿ=MV+Ƭ2ӿSdԾT]fmtx{||yuneYz~ϺY)}pppp::ې::ې::::ې::::::ې::۶:fې:::::fې::::fې:f:::ې:ې:ohb̾̾̾̾-*'-*'ohb𕌉pppvL|RYhw«̸-:FNмH^nʲ<һIS\djorsrojd[S\{gŭJ:yppp::::ې::ffffohb̾̾̾̾-*'-*'ohb𕌉ppp{T |QZiyưκ/=EOX^rɱ>Ϸ@ҼHQX_cfgfc_YRҽHՇqӾ[ȱLѸ,ͱɫƦâ <  xA@pppohbοοοο-*'-*'ohb𕌉ppp;ŭȄwgVEӺ4ϴ$ˮǨ ťâ z BApppohbοοοο-*'-*'ohb𕌉ppp3©z˽pξdѾWӽGӻ8е)ͰɫƦģâ xz y-,pppohbοοο-*'-*'ohb𕌉ppp+dò[ǵQ˵Eζ8ϵ*ͱʫǨ Ťģâ | Pz ]#"ɽA@pppohbοο-*'-*'ohb𕌉ppp"NG>Ů4ʰ(˯ʬǨ ťģģâ | n$; ))pppohbοο-*'-*'ohb𕌉ppp:4,#ũȪǧ Ťģģģâ | }iSA  pppohbο-*'-*'ohb𕌉ppp(#ť Ťģģģģâ | {h XG"( #",,pppfff:ېohbο-*'-*'ohb𕌉ppp âģģģģģâ | }hTA "$$pppff::ohb-*'-*'ohb𕌉ppp âģģģģģâ z s (^"#%% ppp::ېfff:::f:::fff:::::ې:::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې::::::f:::::f:::fې::ې:::fohb-*'-*'ohb𕌉ppp âĢģģģģâ yO ~""&& pppf:::ې:::ې::fffې:fff:::::ff:f:::ې:ې::ې::ېf:::::fې::ې:::::fff::f:::ې::ې:::f:::ې:ېf:ff::۶ff:۶f:::ff::ff:fې:f::::ې:ffohb-*'-*'ohb𕌉ppp&%"çǩǨƦ ŤŤģâ l{99..pppff۶::ې::f::fې::::ې::::ې::::::ې::ې::ې::ff۶::fې:::ې::::::::::::ې::ې::ې::ې::::ې::ې::ې::::ې::f:۶:::ې::ې:ff::ې:::fې::ohb-*'-*'ohb𕌉ppp%#"!Ĩ ɬ!ʬ ʬʬɫɪǩzMM^^.. pppff::ff:fې:f::ې:::::f::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:f::ې::f:۶::::۶:fې::۶:fېfff:::::ffohb-*'-*'ohb𕌉ppp%#" Ĩɬʬʬʬ ʬ ʬ ɬ$ʨ#zJJffXX==pppffffffffff::::ې:ff:ff:::fff::ې::f:ff۶::ff:::ff::fff:::f::ې::ې::ې:::fff::۶ff::::۶ff:۶f:f::ېf:::ېf:۶fff:::f::ffohb-*'-*'ohb𕌉ppp&$#!Ĩ ɬ ʭ ʭ ʭ ʬʬ ̬ť0zLLeeVVPPII11pppff::ېf:ff::ې:ff:::ff::ېff::ې::ې::::ې::ې::ې::ffff::ې::ff:ff:::f:۶ff::ې:ې:::ېf::f::ff:ې:fې::ې:fې::fې::f::fې::ohb-*'-*'ohb𕌉pppŦƦƦƦǨ!˭ԬT {MMggWWNN77--++  ppp:fېff::ې::::ې::::f:::f:f::::fېf::::fېfffffې::ې:fې:ohb-*'-*'ohb𕌉pppƦ"ذ { !!{MMhhXXOO99//..//..--  ppp:ې:::ې::::ې::::::ې::۶:fې:::::fې::::fې:f:::ې:ې:ohb-*'-*'ohb𕌉pppΨ !!{OOiiYYQQ99--,,++**))****))(( ppp::::ې::ffffohb-*'-*'ohb𕌉ppp1{}!!|OOjj[[PP88++))((&&%%$$##""##%%''))..11,,""pppohb-*'-*'ohb𕌉pppn%% {PPll\\QQ@@<<::;;<<>>??@@BBBBCCCCDDCCCCCCDDFFpppohb-*'-*'ohb𕌉pppm))II??""RRmm]]SSLLEEAAAAAAAA@@@@@@@@@@@@@@@@@@@@@@BBpppohb-*'-*'ohb𕌉pppo))MMPP22UUoo]]TTKKEE@@@@@@@@@@@@@@@@@@@@AABBBBCCDDHHpppohb-*'-*'ohb𕌉ppp))LLNN00YYuu__UULLEEAA@@AAAAAAAAAAAA@@??<<7722++%% pppohb-*'-*'ohb𕌉ppp++OONN22^^ffXXNNFF@@>>==;;9977553311..(("" ##%%pppohb-*'-*'ohb𕌉ppp22[[PPLL88^^ooYYLLDD==885511..----------....////////..--pppohb-*'-*'ohb𕌉ppp>>ii``ee[[NNHHFFDDAA==995511--,,,,pppohb-*'-*'ohb𕌉ppp::llffZZRRKKpppohb-*'-*'ohb𕌉ppp00ccpppohb-*'-*'ohb𕌉ppppppohb-*'-*'ohb𕌉uuuuuuohb-*'-*'ohb𕌉葑ohb-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb𕌉䏏ohb-*'-*'ohb𕌉uuuuuuohb-*'-*'ohb𕌉pppc%h'i(i(i(i(i(i'pppohb-*'-*'ohb𕌉pppX!h'i'i'j'j'k'k&k&l&l%k$pppohb-*'-*'ohb𕌉pppg$m&l%m%m%n%o%o$p%p#p#q#q#r#m pppohb-*'-*'ohb𕌉pppo$q$p#q#q#r#s$qt#ru#u!u!v!v!w!x pppohb-*'-*'ohb𕌉pppt"s"t"u!u!u!x% mjoy!wz zz{{{pppohb-*'-*'ohb𕌉pppw w x y yy|" tGMЯx~~pppohb-*'-*'ohb𕌉ppp{||}}{/5Ó{ pppohb-*'-*'ohb𕌉N{{aaaaaaN{{ppp!qu pppohb-*'-*'ohb𕌉Ԫppp׶SW pppohb-*'-*'ohb𕌉N{{N{{ppp ə8< pppohb-*'-*'ohb𕌉Ԫ::fې::f::ې:f:ې:ff::ې::f::f::::::ې::ې:::::fې::::ې::ې:f:::::f:::::::::::f:f:::fېpppwzԧ!vxKN!%    pppohb-*'-*'ohb𕌉aa:::ې::ffffې:f::::ې:::fې::fې:۶f::f:ې::::::::fff::::::ff:::::f::::ې:fې::::ff:ې::::ې::::ff:::fff:ff:ppp \_̑ɅBE    pppohb-*'-*'ohb𕌉N{{:::۶f:fېff::ې::۶:fې::۶:fې::::ې:::ېf::ې::::::::::ff:::ې:::::ff:fې::ې:::ې:::ېf:::ې::::ېf:::۶:fې:ې:ppp su ʁ'*eg  pppohb-*'-*'ohb𕌉mmmmmmmmmmmmmmmmmmN{{ԑ::f:::fff:::ې::::f::ې:::::ې::ې::ې::ې::::::::ffff::::۶:fې::::ff::ff۶::::۶:fې::ff::ې::::::ې::::۶:fېppp   :=[] ̀!no    pppohb-*'-*'ohb𕌉aa:::::ېf:ff::ې::fې:::::ې::ff::ې::::::ې::ffff::::ېf:::::ff::ff۶:f::ېf:ې::ff۶::ې::::ې::f:::ېf:::ېf:ppp      ~       pppohb-*'-*'ohb𕌉mmmԪ::::ې::ې:fې::۶:fې:fې::::ې::f۶f::ې::::::::::ff:::ې:fې:::::ff:fې::ې:::ې:fې::::ې:ff::ې::::ff::::ې:ې:fې:ppp   }~  pppohb-*'-*'ohb𕌉N{{::ې::ې:fffff:::ې:ff:::::f::::fې::ې:::::::::f:fېff::f::::fې:::::fېff:ې:fې:::f::::fېf::::fې:::::ې::::f::::ffff::::fېppp       {| pppohb-*'-*'ohb𕌉mmmaa::fffffې::f:ې:::ې:::::ې:::::::ff::::f:::ې::::ff:::ې:ې::ې::f:::ff:::::ې:fff::pppڏ~pppohb-*'-*'ohb𕌉N{{pppڣ ڄHHpppohb-*'-*'ohb𕌉mmmN{{N{{pppۚȝpppohb-*'-*'ohb𕌉N{{pppۧ֨pppohb-*'-*'ohb𕌉mmmppp۪՟pppohb-*'-*'ohb𕌉fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffpppݠͥtt11^^ŵpppohb-*'-*'ohb𕌉mmmN{{aaaaaaN{{f333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fppp݋ġءՌՉٙpppohb-*'-*'ohb𕌉Ԫ33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333pppݩpppohb-*'-*'ohb𕌉mmmN{{N{{f3333333333333333333333333333333Z333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fpppݺpppohb-*'-*'ohb𕌉Ԫ3Z333Z3333333Z333Z3333333333333Z3Z333Z33Z3333333333Z33Z33333Z3333333Z33Z3333333Z333Z3333ZZ33Z3Z3Z3333ppp뙙ƿpppffohb-*'-*'ohb𕌉mmmaaf3333Z333Z3333Z33ZZ333333333333333Z3Z33Z3Z333Z33Z3333Z333333333Z33Z33333Z33Z33Z3333333Z333ZZ333Z3333333333ZZ3333ZZ3333Z3333Z3Z33333Z3fppp뢢{}{pppffohb-*'-*'ohb𕌉N{{3Z3Z33333Z333333Z3333333333Z333ZZ3ZZ3Z333Z33Z3333Z333Z333333333Z33Z333Z33Z333333333333333ZZ3333333Z3Z33ZZ3333Z3333Z333333Z33ppp릦׹ppp:f:ffff:::fff:::fff::::ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې:::ohb-*'-*'ohb𕌉mmmmmmmmmmmmmmmmmmN{{ԑf33Z333Z333333Z33Z3333333Z333Z333ZZ3ZZ3Z333Z33Z3333Z333333333333Z333Z3333Z33Z33333333333Z3333Z33333333Z33Z3ZZ3333Z333Z3Z333333Z333fppp즦տppp::ff:۶f:::ې::fې:ې::::ې::fff۶:::ې:ې::ې::ېf:::::fې::ې:::::fffff::f:::ې::ې:::f:::ې:ېf:ffohb-*'-*'ohb𕌉aa333Z333Z33333Z33333333333333Z333ZZ3Z3Z333Z33ZZ33333333333Z3333Z333Z33Z333333Z333333333Z3ZZZZZ33Z33Z33333333Z33ppp좢ʰ옘prpppp::::f:۶::ې::ې::::::ې:::fې::ې::ې::ې::ff۶::fې:::ې:::::fې::::::ې::ې::ې::ې::::ې::ې::ې::ohb-*'-*'ohb𕌉mmmԪf33Z333Z3333333Z33333Z3333333333Z333ZZ33Z3Z333Z33Z3333Z333Z333333333Z333Z3333Z33Z333333333333333ZZ33333333Z333ZZ3333Z3333Z3333333Z333fppp옘ϲ컻Ͻppp::::f:::ې::::::::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:fohb-*'-*'ohb𕌉N{{333333333333333ZZ3333333333333Z333Z33Z3Z333Z33Z3333Z33333333333Z33333333Z33Z3333333333ZZ333Z3333333333333ZZ3333Z3333Z3Z3333333ppp췷Ɲ즦}~ppp::ff:۶fffff::fff:ff::ې::f:ff۶::ff:::ff:f:ff:::f::ې::ې::ې:::fff::۶ff::ohb-*'-*'ohb𕌉mmmaaf333Z3333Z33333Z333Z333333333333Z333Z333Z33333333Z3333333Z3333333Z33333Z3333333Z333fpppĘٱppp:::f::ې::::ې::ې::ې::ې::::ې::ې::ې::ff::ې::ې::ff:ff:::f:۶ff::ې:ې:::ېohb-*'-*'ohb𕌉N{{333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333pppȥppp:::::fff::ې:::fff::f:::ohb-*'-*'ohb𕌉mmmN{{N{{f333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fppp휜ο횚ppp::::ff::ې::::ff::ې::۶:fې::::ohb-*'-*'ohb𕌉N{{333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333ppp襤°Ѱppp::::ې::ffohb-*'-*'ohb𕌉mmmffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffpppγpppohb-*'-*'ohb𕌉ppp︸pppohb-*'-*'ohb𕌉pppﹹpppohb-*'-*'ohb𕌉f:ېppppppohb-*'-*'ohb𕌉2^^Rjj::ppppppohb-*'-*'ohb𕌉㑑2Tfې::f::ې:f:f::ې::fff:::ې::ې::ې:ffff:::fې:::fې:ppppppohb-*'-*'ohb𕌉㑑2Tf::ې:fff:::ې:::fffff::f:::ې::ې:::f:::ې:ېf:ffېf::ېppppppohb-*'-*'ohb𕌉푑2T::۶:fې::ff۶:::fې::::::ې::ې::ې::ې::::ې::ې::ې::ffppppppohb-*'-*'ohb𕌉cKcKcKcKcK푑mmmmmmmmm2T::ې::ffff:::::f۶::::ې::ې::ې::ې::::ې::ې:fffppppppohb-*'-*'ohb𕌉2T::ې::ffff::f:ff:::f::ې::ې::ې:::fff::۶ff::f:ffppppppohb-*'-*'ohb𕌉2T:::fې::ff::::ې::ې::ff:ff:::f:۶ff::ې:ې:::ې::ppppppohb-*'-*'ohb𕌉2T:::ې:fې::fېff:::fff::f:::uuuuuuohb-*'-*'ohb𕌉2T:::ې::ې:::ff::ې::۶:fې::::葑ohb-*'-*'ohb𕌉Jff""""""""Tffwwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𕌉VVzohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉󕌉ϕohb-*'-*'ohb𕌉󕌉ѕohb-*'-*'ohb𕌉TTҖvv00Ҵҕohb-*'-*'ohb𕌉UԗUww00Զԕohb-*'-*'ohb𕌉1Wؚz1WؚWz1ع1zؚWz1Wؚz1z1zz11عWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz11z1عzWz1WWW1z11عWWW1z11عz1Wؚzz11عzz11عz1Wؚz1Wؚz1ؚWWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz1ؕffohb-*'-*'ohb𕌉{11ڻڜWڜW1{W1Wڻ{{{11ڻ1{{1ڻڜW{1{{11ڻW{1ڻWڜW{{11ڻ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{ڜW1{{11ڻ{W1ڜ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11ڻ{{11ڻڜWڜW1{W1{ڜW{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{ڕffohb-*'-*'ohb𕌉{11ۼ{{11ۼ{X1X{1ۼ{{11ۼۜ1Xۼ{{{11{{11ۼۜ1X{{{11ۼ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜۜXXۜ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼ{{11ۼ{{11ۼ{X1{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜە:ffff:::ې::ې::fې:::f:ې:::::f::ې::fff:::ې::ې::ې:ffff:::fې:::fې:ohb-*'-*'ohb𕌉}22ݾ}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾݝYY}}22ݾݝ2Y}}2Y}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝYY}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾ}}22ݾ}Y2}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝݕ:fff۶:::ې:ې::ې::ېf:::::fې::ې:::::fffff::f:::ې::ې:::f:::ې:ېf:ffېf::ېohb-*'-*'ohb𕌉55^^5ɨ^^^5555^^ɨ55Ʉ^^^^555^^^55Ʉ55^^5ɨ^5^^5^5^^^^55^^55Ʉ55^^5ɨ^5^^555^^5ɨ^5^^^55Ʉ55^^5ɨ^5^^5^5^^때:fې::ې::ې::ې::ff۶::fې:::ې:::::fې::::::ې::ې::ې::ې::::ې::ې::ې::ffohb-*'-*'ohb𕌉555^555^ʄ55^555^^55ʄ55^^55ʄ5^^555ʄ5^쨄55^^55^^5ʄ555ʄ5^^555ʄ5^쨄55^^555^^^55ʄ5^^555ʄ5^쨄55^^55알::::ې::ې::ff::ې::::ې:::::::f۶::::ې::ې::ې::ې::::ې::ې:fffohb-*'-*'ohb𕌉555̅5_̅5555_̅__55555555핌f:ff::ې::f:ff۶::ff:::ff:f:ff:::f::ې::ې::ې:::fff::۶ff::f:ffohb-*'-*'ohb𕌉555Ά555Ά555Ά55555Ά555555Ά55::ې::ې::ې::::ې::ې::ې::ff::ې::ې::ff:ff:::f:۶ff::ې:ې:::ې::ohb-*'-*'ohb𕌉𕌉:fff::ې:::fff::f:::ohb-*'-*'ohb𕌉񕌉ff::ې::::ff::ې::۶:fې::::ohb-*'-*'ohb𕌉򕌉::ې::ffohb-*'-*'ohb𕌉򕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼ohb-*'-*'ohbohb-*'-*'ohb3~b8Z~ohb-*'-*'ohb[3߮6Y~ohb-*'-*'ohbމa2ޮ6Y}ohb-*'-*'ohbܮ6X|ܮ6X|6X|܉2[ܮX[[[3|a363X|[[6X|܉26|ܮ6X|ܮ6X|ܮXр2܉26|ܮXX3|a363X|[[6X|܉26|ܮ6X|ܮ6X|܉233|a363X|6X|6X|aa❮6X|a26X|6X|ܮ6X|܉23܉2[6X|[[6X|6X|ܮ6X|ܮXX3|a363X|[[܉2[ܮ6X|ܮ6X|܉2[6X|6X6[XXohb-*'-*'ohbڬ6W{ڬ6W{6W{W~1ڇ{2{~16W{`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{ڬ6W{ڬWWڇ`12{~1`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{`Wڇ{`ڇ2໇61{6W{6W{6~~16W{WW6~6{6W{ڬ6W{`Wڇ{W~1ڬ6W{ڬ6W{ڬ6W{6W{ڬ6W{2{~1`ڇ2໇61{6W{ڬW~1ڬ6W{ڬ6W{W~1ڬ6W{W~1ڇ`1ohb-*'-*'ohb٫6Wz٫6Wz6Wz`1ߛ6~Y6Wzه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz٫6Wzه`1ߛYW`1ߛه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz2zWه`1ߛ62zz6Wz6Wz6~W6Wzه21ߺ٫6Wz6Wz٫6Wz2zWه`1ߛ٫6Wz٫6Wz٫6Wz6Wz٫6Wz`1ߛه`1ߛ62zz6Wzه`1ߛ٫6Wz٫6Wz`1ߛ٫6Wz6Wz2zWohb-*'-*'ohb׫6Vy׫6Vy6Vy1Yׇ1V6Vy`6y6Vy׫6Vy`1ޚYV6Vy׫6Vy׫6Vyׇ`1ޚYV`1ޚ`6y6Vy׫6Vy`1ޚYV6Vy׫6Vyׇ`1ޚ`6y6Vy6Vy1}1׫6Vyׇ21޹׫6Vy6Vy׫6Vyׇ`1ޚׇ1Y6Vy׫6Vy׫6Vy6Vy׫6Vy`1ޚ`6y6Vyׇ1Y׫6Vy׫6Vy1Y6Vy6VyYVohb-*'-*'ohb֪VV5Vy5Vy5Vy`}12yV֪5Vy֪5Vy5Vy֪5VyVVֆ51yVY``ݙ֪5Vy֪VVֆ51y2y}1֪5Vy5Vy֪5VyVVֆ51yVY``ݙֆֆ21ݸ֪5Vy5Vy5Vy`֪Y֪5VyVV5}5yVY``ݙֆֆ21ݸ֪5Vy`}1V}1֪5Vy֪5Vy5Vy֪5Vy2y}1֪5Vy5Vy֪5Vy`}1֪V5y5Vy`}15VyV2ݸ51yohb-*'-*'ohbԪ5UwԪ5Uw5UwԆ0_ۗԪU{0ԪUXXXUX5UwԆ0UԪ5U_{w{0Ԫ5UwԆ0U1wUXXUX5UwԆ0UԪ5U_{w{0Ԇ_0ۗXXԪ5Uw5Uw1wU5UwԆ0{05Uw5U_{w{0Ԇ_0ۗԆ0_ۗ5U5XUX5UwU{05Uw1wUXXUXԆ0_ۗԪ5UwԪ5UwԆ0_ۗ5Uw5Uw0{0ohb-*'-*'ohbԩ5Uwԩ5Uw_ԅ1۶ԩ5Uwԩ5Uwԩ5Uwԩ5Uw1wUԩ5Uw5Uw1wUԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwohb-*'-*'ohb8\ɀ8\ɀb38\ɀ8\ɀ8\ɀ8\ɀ3\8\ɀ8\ɀ3\8\ɀ\\8\ɀ8\ɀ8\ɀ8\ɀohb-*'-*'ohb]ӄ484ʂ8]ʂbb84ʂ8]ʂ84ʂ558]ʂ8]ʂ84ʂ5584ʂb584ʂ8]ʂ8]ʂ8]ʂohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'몦rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ̾̽̽˼˼ʻʻʻ˼˼˼˽˽˽˼˼˼̽̽;;;̾̾̾Ϳ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿ;̽˼˼ʻʻ˼˼˼˽˽˽˼˼˼˼̽;;;̾̾̾ͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿͿ̾̽̽˼˼˼˼˼˽˽˼˼˼˼˼̽̽;;̾̾̾ͿͿοͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾̾̽;̽̽˼˽˽˼˼˼˼˼̽̽̽̽̾̾̾ͿͿο;Ϳ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ̾̾;;̽̽˽˽˼˼˼˼˼̽̽̽̽˽̾̾Ϳοο;Ϳ-*'-*' οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿ;;̾̾˽˽˼˼˼˼̽̽̽̽˽˽̾Ϳοο;Ϳ-*'-*'aV  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿͿͿ̾̽˼˼˼˼̽̽̽˽˽˽˽̾οο;ͿͿ-*'-*'HwX οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾;;̽̽˼̽̽̽̽̽˽˽˽̾;;;ͿͿͿο-*'-*' %XksbPοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾Ϳ;;̽̽˼̽̽̽˽˽˽˽̾;̽̽ͿͿοफ़vqkZVQZVQZVRZVR[VR[VR[VR[VR[WR[WS[WR[WS[WS[WS[WS\XS\XT\XS\XS\XS\XT\XT\XT\XT\XT\XU\XU\XU\XU^ZW^ZW^ZW^ZW^ZW^ZW^ZW]YU_[W_[W]YU\XU\XU\XU^[W^[W^[W_[X_[X_[X_[X_[X&b&S&S&S'T(T (V!)V!*W"+X$-X%-Y%.Z'/Z'0[(0])1])1])1])1^)1])1])1])2])1])1])1[)1\)1])1])1])1[)1[)1Z)0Y(/X'.W%-V%-U$+T#*S")Q (P (P*4fXa-*'-*'Cxe #PNդM۩N}ņοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾Ϳ;;̽;̽̽̽˽˽˽̾̾;;̽̾Ϳο^ZUz.<꯵ܯޮ߮୵୵⭵䭷孷嫹髹髹뫹쫹쫹쬻뫺髺髹譸孵孵䭵᭵᳹᭱͐*.O-*'-*'-.fvh#(ڧJR‚QOئKƒ}οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾ͿͿο;ο;;̽˽˽˽̾̾;̽̽̾ͿͿͿο坖ƼŻŻżŻƼƽƼƽƽƽƽƽǾǾǾǾǾȿǾǾǾǾԀwqȿȿ(5r|r}p}p~p~ppppooonnlllllllllllllllllnnooopppp~p~t~ȞԘW[-*'-*' 6~je #QÂRӬOMܫO~οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾οοο;̾˽˽̾̾;̽̽̾ͿͿ̾Ϳοpjeļ;;;;ͿͿͿ¹{smºººººººûûûºººûûûûûûûüüüû#.}dpdpdqdqcrcrcrbtbvbv`v`x`y`y`z`z`z`z`z`z`z`z`z`{`{`{`{`{`{`{`{`z`y`ybwbvbvbtcrcrcrdqdqpz!&O-*'-*'-*'-*'AljkVVEV; MP֤QMاQ~‚οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾ͿͿ̾̾̾;;̽̾̾ͿͿ̾̾ͿZVR¶¶¶÷~qlfVShXUhXUhXUhXUhXUhXUhXUhXUhXU~qløĸĹĹøĸunjŹŹŹŹŹźyfVSfVSfVSfVSfVSfVSfVSfVSfVSfVSzƻƻƺƺƺƺ%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD]WYhXUhXUhXUWYD]D]D]D]D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'8HxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvwyyyyʮ'-J-*'-*'cV7<8. 13οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾ͿͿͿͿ[WS℁~fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk||||||||||}}}ͱ*0L-*'-*'  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿοͿͿͿ[WS冃fVSiYVFO䄌τфӄӄփ׃كۃރ߃ₐゐ悐灐灐遐omhYVfVShYVom遏邏炏悏わハ჎߄݄ۄلׅօӅӅѵ.3N-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿͿ[WSꊇfVSiYVOX萙אِِؐݐݐᐚ䐚君珛鏛돛쎛펛펛fVSfVSurfVSfVS펚폚폚돚鏚萚呛呛㑛ᑛߑݑّّܑؼ49Q-*' οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ[WS댉䜒fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST^阠٘ۘݘݘᘢ㘢嘢嘣阣阣엣헣yvfWUfWUfWUyuyufWUfWUfWUyu혢혢뙣陣虣噣噣㙢ᙢߙݙݙ8=S᠞ A/.,*οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ[WSZb렦ݠݠࠦᠨ㠨䠨堩蟪韪럪ퟪퟫ젪頪顩衩塩䡧㡧ᡧࡧ;@U.,*%%%C0.+(οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾Ϳ[WS_f᦬᦬᦬㦭夭央褮餮뤯쥮륮饮祮姭䧭㧭᧭?BV衟-*'olj(,οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾[WT`iᬱᬲ䬳嬳嬴謴髴骳荒הּ쬴鬳鬳笳嬳嬲䬱?DY렝omiya@=4$ .+(.,*cbadmBFZ/-+.+(544uTTR73% -*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'D1P:EDDtqsl-2.8.1/apps/help/tqslapp/renewing2.bmp0000644000175000017500000220754615003421124020472 0ustar rmurphyrmurphyBMf 6(s0 ~xs`ZWRMJ/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)B>/-+οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾ɡ/-+-*'˽˽̾̾-*'-*'ञohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb˽˽̾̾-*'-*'ohbohb˽̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohb𸵰һQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<YgUcUcUeUfUfTgTgThTjSjSjQkQkQkQkQkQkQkQkQkQlQlQlQlQlQlQlQlQlQlSkSjTiThThThUgUgUfUdUdYh>-*'-*'VL֤ }LVפYܩKVƃVܩK€ۧKVSO~NNNԤNNԤRҫLMPNPեLQJԣ儾NͬOKRԣ䃽L˭PͨRHԣĄJăz٧P}ĆxݥTE͜;IWIWIWIWHWHWGYEZE\E[E[E]E]E]E]E]E]WYhXUhXUhXUWYE^WYhXUhXUhXUWYE^E^E^E]E[E\E\E[GZHXHXIXIXIXIX;-*'-*'WڦILU֤UڧIYօKRNץƂWԃU~OKLOӡNLϬNNӣNNԣڧL憿PNLNLLN~MQӢKMHاNL˫PHÃ~ăJĆz}UҡF֤N 9=M=M=M=N=O=O=O=O=O=O=Q=Q>>>>>lllIIIIIIIIIlllooolllmmmlll ......>>>>>>>>>IIIIIItqsl-2.8.1/apps/help/tqslapp/restoredeletedcert.htm0000644000175000017500000000235415003421124022460 0ustar rmurphyrmurphy Restoring a Deleted Callsign Certificate

Restoring a Deleted Callsign Certificate

TQSL retains the most recently-deleted Callsign Certificate for each of your callsigns, enabling you to recover an inadvertently deleted Callsign Certificate.

To restore a Callsign Certificate,
1.Select the Callsign Certificate menu's Restore Deleted Callsign Certificate command.
2.In the Callsign Certificates dialog that appears,
   2.aClick on the Callsign Certificate you wish to restore.
   2.bClick the OK button.

 

Note: if there are no deleted Callsign Certificates to restore, the Callsign Certificate menu's Restore Deleted Callsign Certificate command will be disabled. tqsl-2.8.1/apps/help/tqslapp/restoredeletedstnloc.htm0000644000175000017500000000230215003421124023016 0ustar rmurphyrmurphy Restoring a Deleted Station Location

Restoring a Deleted Station Location

TQSL retains the most recently-deleted Station Location for each of your Station Locations, enabling you to recover an inadvertently deleted Station Location.

To restore a Station Location,
1.Select the Station Location menu's Restore Deleted Station Location command.
2.In the Station Location dialog that appears,
   2.aClick on the Station Location you wish to restore.
   2.bClick the OK button.

 

Note: if there are no deleted Station Location to restore, the Station Location menu's Restore Deleted Station Location command will be disabled. tqsl-2.8.1/apps/help/tqslapp/save-certificate.htm0000644000175000017500000000330415003421124022002 0ustar rmurphyrmurphy Saving a Callsign Certificate to a File

Saving a Callsign Certificate to a File

1. Start TQSL and select the Callsign Certificates tab, which lists your Callsign Certificates .
 
   
2. Click on the Callsign Certificate you wish to save to a file, and then click the Save the Callsign Certificate button. An Enter the name for the new Certificate Container file window will appear; it enables you to specify the name and location of the file into which the Callsign Certificate should be saved. After specifying the name and location, click the Save button.
3.  A Certificate Container Passphrase window will appear; if the Certificate Container file will be stored on a shared or public computer, protect it by specifying a passphrase, and clicking the OK button.

 

tqsl-2.8.1/apps/help/tqslapp/savestnl.bmp0000644000175000017500000005252215003421124020417 0ustar rmurphyrmurphyBMRU6(T  @@ ff&':;bbbFG¶VXrtº23NO^_~¾npz|..BDfjRSbfJKZ[vx67*+bb"">?jl= =(== =(== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(== P == =(==(M(M (M = =(==(M(M (M == =(==(M(M (M = =(==(M(M (M == =(==(M(M (M = =(==(M(M (M == =(==(M(M (M = =(==(M(M (M == =(==( ( ( = =(==((  ( == =(==(( ( = =(==( ( (  == =(==(( (  = =(==(( (  == =(==( ( (  = =(==( ( ( == =(==( (  ( = =(==(M(M (M == =(==(M(M (M = =(==(M(M (M == =(==(M(M (M = =(==(M(M (M == =(==(M(M (M = =(==(N(N (N == =(==O(O( O( = =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(== (( = =(==  == =(=== =(==== =(=== =(==  == =(==  (( = =(==  (( == =(==  +((d( = =(==  +((d( == =(==  ((((((((((d( = =(==  ((((((( ((((((((((((d( == =(==  ((((( (((((((((d( = =(==  (((((((((((((d( == =(==  (((((((((((((d( = =(==  (((((( ((((((( ((((((d( == =(==  (((((((((((d( = =(==  (%((d( == =(==  (("((d( = =(==  (( == =(==  (( = =(==   == =(==  = =(==== =(=== =(==== =(=== =(==  !== =(==     = =(==    $== =(==    = =(==     == =(==     = =(== !== =(==  7= =(==  7== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(== (( == =(== ( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== M( (( (( = =(== L("(((( == =(== L("(((( = =(== ((( (((((((((((((((((((((((( == =(== ((((((((((((((((((( ((((((((((((((((((( (((( = =(== ((((((((((((((( ((((((((((((((((((((( == =(== (((((((( (((( ((((((((((((((( (((((( = =(== (((((((( ((( ((((((((((((((((((( == =(== (((((((((((((( ((((((((((((((( (((((( = =(== (((((((((((((((((((((((( (((((( == =(== (((( ( (((( (((((((((((((( = =(== (( ( (( (((((((((((( (( == =(== ((( = =(== ((( == =(== ((( = =(== ((( == =(== )( ((D(( = =(== (("((C(( == =(== (("((C(( = =(== (((((((((((((((((B(( == =(== ((((( (((((((((((((((((( ((B(( = =(== ((((( (((((((( (((((((((B(( == =(== ((((( ((((((((((((( ((((B(( = =(== (((( ((((((((((((((((B(( == =(== ((((( ((((((((((( ((((B(( = =(== (((((((((((((( ((((C(( == =(== (((((((((((((C(( = =(== (((((((((((D(( == =(== ((( = =(== ((( == =(== ((( = =(== ( == =(==  = =(=== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==\ \== =(==[     \= =(==[     \== =(==`   \= =(==^     \== =(==\    \= =(==[]== =(==[ #: m= =(==\ #; j== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(==+= =(==+== =(==+= =(== == =(== = =(==  == =(==  = =(==  == =(== = =(==== =(==  %$ = =(==   $ == =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(==== =(=== =(===#===================2= =========0======---9= =(==   ***77'77'7'':::88$8$$$666 6 ;%;%;%%;% 2,,,,3333 99/>>>>44"4"""""555 # 00 11< < ? ? ? ? & & &=== =(== ***7 '::::8888$8$$66 6 ;%;;%;%  2 ,, ,,33333//9/9/9/++>>>>444"4""55##55### 0011!1<1< < ? ?? ? ? & &&  == =(==   * *77 7'':: 8$$$6 66 ; ;%;;%;%2222,,,,3333 9//9//>>>>> 4444"4""4""55##5##000111<1< << < ? ??.? ? ?  & &= =(==    **777 '::88$$66 6 ;; ; %%;;%;%%%222 , ,3,3333 9/9/99/9+>>> 44"4""5#5#5##00000 11<1< < ? ?? ? ?? & &&&( = =(==   ((*((*((((*((((7('((( ((:((:((:(((((8(((66( ((6 (( (( ;(;;((%%((;%;%%%222 ,,,,333399/99//++>>>>>44"4"4""55#5#5###000111<1< < ? ? ?? & & &&&( ! = =(==   ((*(*((((77 ((77'((''(('( ((::((:(((:((((88((8$$(($((((((6((6((6 (( (( (;((;;((%((;%((%%2222, ,,,3333 //9/9/9/>>>>444"4""4""5#55##00001111!1< < ? ?? ? ? && ( .  . = =(==   ((*( **((*((((7*((77'((''(('((((((::((:((((((((8(($1(($$((((66((6 ((66(( (( (( ;((;((;%((;%;%%%22 ,,,333/99/9//+>>>>>44"4"44" """5555##5###0000111 <1<1<1<< << < ? ? ?.? ?? & && ( &   = =(==  (*((*((((((77''(''(('(::((:((((:((((88((8$$(($8$$((((((6( (( ((;((;;((%((;%((%22 ,,,33 /99/99/++>>>444"4""55###0000 11< < ? ? ? & &  ( = =(==   ((((*((*((*((((7'('(('((((::((:((:((((8((8(($(($$((((666((66(( ((;((;;((;((;%((%;%;%%  2,,,, 39/9//>>>44"4"555 #  0 1 <1<1<< << < ? ? ? ?  & &&(==== = =(==    ((*((*((*((((7(''7''((((((:((:(((((((8((8,$$(($8$$((((6((6((6((6 (( (( (( ((;;((%(%((% 2 ,,,,3333 //9//9++>>> >>>>>44"4"555##55# 0 1<1< << ? ? ?.?  &&& (-- = =(==  (**(*((((**((((7(('77((('((:((::( (((($8((88$((6(66( (( ;( ;;((%((;;;%22 ,,3333 // ++>>>> 4444 "55##55# 0011<1< < ? ?? ?  ? & ()) = =(==   *(*((((7 ((7''(('7((''::((:::888$$8$$(($$$$$66  6 66 6(( ; ; %;%;%;%%22 ,,3333 /99/9/++>>>>44 "55#5#00011!<1<1< ? ? & & ( = =(==   ((*((**((77( 7'(('':':((:((::88((8$$666 6(( ((; ; ; %;;;%;%%%2222,,, ,3,3333399//9//+>>>>44"44"""555#5#5###000011<1< < ? ?? ?. ? ??  &&( = =(==   ****77'77'7'7'::::::888888$$8$$ 66666 6 6 ; ; %;%%;;%%2222,,,3339/9 /9/++>>>>>4"4"4""55#5##0000111<1<1< << < ? ? & &&(  = =(==    ***77''7'77''::::88$8$$$66 6 ; ;%;;%%222,,,,3339/9/9/9//+>>>>44"4""555#55##00011 <1<1<< << < ? .?? ?? ? & &  (  == =(==   ****777 ''7'''''::::8888$8$ $$6666 6 ;; ; %;;%%;%%%222,,,,,33339999/9/9>>>>4""4""555##5##000011<<1< < ? ? ? && &&(= =(==  * 7''7''7' :: 8$  6 ;%;% 2  , 3 9// >  4 " 5 #  0  1 < ? & & && == =(==    *  7''7'  :: 8 $$6 ;%;% 2 ,, 3 9  >  4 " 5 # 0   1 < ?  & &  === =(== =(== =(( ==tqsl-2.8.1/apps/help/tqslapp/secondarycertops.htm0000644000175000017500000000152615003421124022157 0ustar rmurphyrmurphyTQSL Secondary Callsign Certificate Operations

Secondary Callsign Certificate Operations

tqsl-2.8.1/apps/help/tqslapp/secondarystnlocops.htm0000644000175000017500000000101215003421124022512 0ustar rmurphyrmurphyTQSL Secondary Station Location Operations

Secondary Station Location Operations

tqsl-2.8.1/apps/help/tqslapp/selectlanguage.htm0000644000175000017500000000210315003421124021543 0ustar rmurphyrmurphy Selecting the Language Used by TQSL

Selecting the Language Used by TQSL

The text that appears in TQSL's windows, dialogs, and error messages can be presented in Chinese, English, Finnish, French, German, Hindi, Italian, Japanese, Portuguese, or Spanish.

To select the language TQSL should use,
1.Select the File menu's Language command.
2.In the Language dialog that appears,
   2.aClick on the language you wish TQSL to use.
   2.bClick the OK button.

 

Note: to assist in improving the translations, see Localizing TQSL. tqsl-2.8.1/apps/help/tqslapp/sign1.bmp0000644000175000017500000265232615003421124017613 0ustar rmurphyrmurphyBMT 6(0T SSSccchhhbbbFFFJJJjjjhhhfffccc```^^^SSSpppppppppppppppppppppppppppppppppppppppUUU+Ԁ++UU++pppUU++++U+++ppp++++Ԁ++UԀ++UU+++++Ԁ++Ԁ++Ԁ++Ԁ++UԀ+UUU+++Ԁ++++U+UUU+++++Ԁ++UԀ++++U++Ԁ+UUԀ++UԀU+Ԁ++Ԁ++Ԁ+++UUUU++++UU+++UԀ+++UUU+++++Ԁ++Ԁ++Ԁ++Ԁ++UԀ++U+++++++++U+U++UԀ+++UUU+++UUU+++UԀ+UUU+++Ԁ++Ԁ++++UUU+++UUU+++++Ԁ+UU++++U++Ԁ+UUUU+++UUU+++Ԁ++UUU+++ԀU+ppp++UUUUԀU++U++Ԁ+Ԁ+++ԪU++Ԁ++Ԁ++Ԁ++ԀU+U+++Ԁ+++++UԀ++U+++++UUԀU++ԀUU+Ԁ+UUU++++Ԁ+UԀ+ԀU++Ԁ++UԀ+UUUUԀ++Ԁ++Ԁ+++U+++Ԁ+U++Ԁ+ԀU++ԀUUU+++++UU++Ԁ++Ԁ++U+UU+ԪU+++ԪUUU++UU++U+UU+ԪU++U+UU+UԀ+Ԁ++++Ԁ+ԀU++Ԁ+++Ԁ+Ԁ++Ԁ++UU+++Ԁ++UԀ+Ԁ++Ԁ+U++Ԁ+Ԁ++U+Ԁ++UU+ԪU+++Ԁ++UԀ+Ԁ+UU+UԀ+Ԁ+ԀU+ppp++ԀU+++UUԪ++++Ԁ++U+Ԫ++Ԁ++Ԁ++Ԁ++Ԁ++++Ԁ++Ԁ++++UԀ+++++Ԁ++++Ԁ++UUԪ+++UԀ++UU+UԀ++UU+ԪU+UU+UU++Ԁ++Ԁ++++++Ԁ++Ԁ++++UUԪ++++Ԁ++++Ԁ++++Ԁ++Ԁ++++Ԁ++U+++U+Ԫ+++++++++U++U+Ԫ++++Ԁ++++++++Ԁ++UU++Ԁ++Ԁ++Ԁ++++++Ԁ++Ԁ++++UUUU++++Ԁ+++U++Ԁ++U+Ԫ++Ԁ++Ԁ++++Ԁ++++++ppp+++UUU++++Ԁ++U+Ԫ++Ԁ++Ԁ++Ԁ++Ԁ++++Ԁ++Ԁ++++Ԁ++++++Ԁ+++++UUU+U++UUUU++UUUU+UԀUUԪU+U+++Ԁ++Ԁ++++++Ԁ++++UU+U++Ԁ+++++UԪ++Ԁ++Ԁ++++Ԁ++U+++U+Ԫ+U+++UԪ+++U++U+Ԫ++++Ԁ+UԪ++++++UU++Ԁ++Ԁ+++U++Ԁ++++ԪUUUU++++Ԁ+++U++Ԁ++U+++Ԁ+++++UԪ++++ppp++U+ԪUU++U+UUԪ++++++Ԁ+Ԁ+++ԀU+ԀU+Ԁ++Ԁ++++Ԁ+++UU+UU++++Ԁ+UU+UU++U+UUUU++++UUUU++UUԪU+UUUU+UUUU+UԀ++Ԁ++Ԁ+++UUU++++U+UUUU++++Ԁ+UU+UU++++ԀU+ԀU+++ԪUU+ԪU++Ԁ+Ԁ+UU+++UUU++++ԀUUUU+ԪU+U++ԪUU++UU++UUU+UUUU+++UUU++UUUU++UUUU++++++ԀUUԪ++UU+ԪUUUUU++UU++UU++ppp++UU++Ԁ++Ԁ++++U+++U+ԀU+++UԪU+U+++++UU+++Ԁ++UU+++UU+++UU++Ԁ++Ԁ++Ԁ+UԀ++UU+UԀ++++++ԀU+U+Ԫ++Ԁ++Ԁ++UU++Ԁ++++++Ԁ++Ԁ+UU+++UU++ԀU+++UԪU+U+Ԁ++UU+++U+Ԁ++Ԁ++UU++ԀU+++UU+U++UU+Ԁ+++Ԁ++++Ԁ++++Ԁ++Ԁ++UU++Ԁ++Ԁ+++U+UԀ++++U+++UU++Ԁ+U++Ԁ++Ԁ++Ԁ++ppp++U+++++++++Ԁ+++Ԁ+UԀ++UԀUU+Ԁ+UԀ+++Ԁ++++Ԁ++++++++++++++++++++ppp++Ԁ++++Ԁ++++Ԁ++++Ԁ+++Ԁ++Ԁ++Ԁ+++Ԁ++Ԁ++++Ԁ++++++++++++++++++++ppp++++++Ԁ++++++++++++++++++pppppppppU+Ԁ++ppp++++ppp++U+Ԁ+UUԀ+++Ԁ++Ԁ+++U++Ԁ+UUUU+++UԀ+UԀ++UU+++Ԁ++Ԁ++Ԁ++Ԁ++UԀ+UUU+++++UUU+++UԀ+UUU+++++Ԁ++UԀ+++Ԁ++Ԁ++Ԁ+++UԀU+Ԁ++Ԁ++Ԁ+++++++UU++++U++Ԁ+UUUU+++UUU+++Ԁ++UUU+++UԀ++U+U+U+++Ԁ++UU+ppp++U+UU+ԪUU+UU++Ԁ+++Ԁ+UUU+++Ԁ+++++Ԁ+ԀU++ԀU++U++Ԁ+Ԁ++Ԁ++Ԁ++UUԀU++ԀU+++++Ԁ+++Ԁ+ԀU+U+++++Ԁ++ԀU++Ԁ++Ԁ++Ԁ++UU++UԀ+UUUUԀ++Ԁ++Ԁ+++++ԪUUUU++Ԁ+Ԁ++U+Ԁ++UU+ԪU+++Ԁ++UԀ+Ԁ+UU+UԀ+Ԁ+U+UU+ԪU++UU+ԪU+++U+++ԀU+++Ԁ+U+ppp+++ԀU++Ԁ++U+++Ԁ+++++UԀ++UUԪ++++Ԁ++UUUUԪ++++Ԁ++Ԁ++Ԁ++Ԁ++UU++Ԁ++++++Ԁ++Ԁ++++Ԁ++++Ԁ++UU++Ԁ++Ԁ++Ԁ+++ԪU+UU+UU++Ԁ++Ԁ++++U+Ԫ++++++Ԁ+++U++Ԁ++U+Ԫ++Ԁ++Ԁ++++Ԁ++++++++Ԁ++U+++++U+++UUUUUԪԀ+Uppp++Ԁ++Ԁ++Ԁ++U+++Ԁ+U++++UUUU++++UUUU++++Ԁ++Ԁ++Ԁ+++UUU++Ԁ++++Ԁ++Ԁ++++Ԁ++++Ԁ++UU++Ԁ++Ԁ+++U+UԀUUԪU+U+++Ԁ++Ԁ++++U+Ԫ+U++++Ԁ+++U++Ԁ++U+++Ԁ+++++UԪ++++++Ԁ++U+++++U+++U+U+U+U+ppp++UU++UU+ԪU++ԪUU++Ԁ++Ԁ++++UUUU++UUU+UUԪU+UUԪ++++++ԀU+ԀU+UU++U+UU++Ԁ+UU+UU++++Ԁ+UU+Ԁ++U+UU++Ԁ++Ԁ++UU++UU+UUUU+UԀ++Ԁ++Ԁ++++Ԁ+Ԁ+UU++++++++ԀUUԪ++UU+ԪUUUUU++UU++UU++++ԪUU+ԪU++UU+ԪU+++Ԁ+UԀ+UUUppp++UԪU++Ԁ+U+Ԁ+++Ԁ++Ԁ+++UԀ++UU++++Ԁ++++Ԁ++++U+++UԪU+U++Ԁ+++UU+++UU++Ԁ+Ԁ++UU+++UU++++U+Ԁ++Ԁ++Ԁ++ԀU+U+Ԫ++Ԁ++Ԁ++U+++U+Ԁ++Ԁ++++U+++UU++Ԁ+U++Ԁ++Ԁ++Ԁ+++Ԁ++U+++U+++UԀUUUԀ+UԀ+pppU++++UԀ+++++++Ԁ+UԀ++UԀUU++++Ԁ++++++Ԁ++U+++++Ԁ++++++++++++++++UU++++U++ppp+Ԁ++++++Ԁ++Ԁ++Ԁ+++++Ԁ++++++Ԁ+++++UԀ++Ԁ++++Ԁ++Ԁ+++++++++++++++UU+++++ԀUUppp++++UU++++Ԁ++++++++++ppppppppp+UԀ+UԀ++UU+UԀ+UԀ++UU++pppUUUU++U+UUUU++U+++ppp+U++ԀUU++ԪUԀ+++Ԁ++UԀ+U++++++Ԁ++Ԁ+++UU+++Ԁ+++U++++++ԀU++++Ԁ+U+UԀU+Ԁ++++Ԁ++Ԁ+UUUU+++UUU+++UԀ+UU++UԀ+++ԀUԀ+++UԀ+UԀ+U+UԀ+++Ԁ++Ԁ++UԀ+++++UUU+++UUU+++++ԀUԀ++U++++++Ԁ++Ԁ++Ԁ++UUU+++Ԁ++Ԁ++Ԁ++UUU++++U+++UU++++U++Ԁ+UUUU+++UUU+++Ԁ++UUU+++ԀU+ppp+UUU++ԀUU+UԀ+ԪUԀU++ԀUU++ԀU++ԀUU++++Ԁ++Ԁ++U++Ԁ+Ԁ++++U+Ԁ+++++Ԁ+UU++UUUU+ԪU++UԀ+UUUUԀ++++Ԁ++UU+ԪU+++Ԁ++UԀ+Ԁ+ԀU++ԀUU++U+UUU+U+UUԀU++ԀU+U+U++U++UUU+++ԀU++Ԁ++UU+++Ԁ++UԀ+Ԁ++Ԁ+U+UU+ԪU+++ԪUUUUU++Ԁ++Ԁ++Ԁ+++Ԁ+Ԁ++Ԁ++UU+UԀ+Ԁ+UU+ԪU++U++Ԁ+Ԁ++U+Ԁ++UU+ԪU+++Ԁ++UԀ+Ԁ+UU+UԀ+Ԁ+ԀU+ppp+UԀ++++++UUԪ++++UU++++++Ԁ++Ԁ++Ԁ++++Ԁ+++++U++++UUUU++++++Ԁ++U++ԪU+UU+UU++++Ԁ++Ԁ++U+Ԫ++Ԁ++Ԁ++++UU++Ԁ++++Ԁ++++Ԁ++Ԁ++UU++++ԪUU++Ԁ++++Ԁ++UU++++++Ԁ++Ԁ++++UUUU++Ԁ++U+++U+Ԫ++++++Ԁ++Ԁ++++Ԁ++Ԁ++Ԁ++Ԁ++++++++U+Ԫ++++++Ԁ+++U++Ԁ++U+Ԫ++Ԁ++Ԁ++++Ԁ++++++ppp++++Ԁ++++UU+UԪ++UU++Ԁ++++Ԁ++Ԁ++Ԁ++++Ԁ+++++U++++ԪUUUU++Ԁ++UUԪ++U++UԀUUԪU+U+++++Ԁ++Ԁ++U+++Ԁ++++UU++Ԁ++++UU+U++Ԁ+UUU++++ԪUU++UU+U++UU+++U++Ԁ++++ԪUUUU++Ԁ++U+++U+Ԫ+U+UԪ++Ԁ++Ԁ++Ԁ++Ԁ++Ԁ+++UԪ++++++U+Ԫ++++++Ԁ+++U++Ԁ++U+++Ԁ+++++UԪ++++pppU+++Ԁ+Ԁ+++++U+UUUU+++UU+UU+Ԁ++U++ԀU+ԀU+Ԁ+++++U++ԀUUԪ+UU+UUUU+Ԁ+++UUUU+ԪUUU+UUUU+U+UU+Ԁ++UU+ԪUUUUU++U+UU+Ԁ+++++U+Ԁ++ԪUU++U+UU+++++U++ԪU+Ԁ++U+UU+UUU++UUUU++UUUU++ԪUU+ԪU++Ԁ+Ԁ+UU++UU++++ԀU+ԀU+UU++Ԁ++UU++UU++UU+ԪU+U++++++ԀUUԪ++UU+ԪUUUUU++UU++UU++ppp++Ԁ++ԀUU++++++Ԁ++Ԁ++UU++UU++UUԪU+++UԪU+U++++Ԁ++UUԪU+++UU++UU+U+UԀUU++++Ԁ+U++ԀU+U+Ԫ++UU++Ԁ+U++Ԁ++++UUUU++U+++Ԁ+++Ԁ+++Ԁ+++Ԁ++Ԁ+U+++Ԁ++++++++UU++Ԁ++Ԁ+++U+UԀ+Ԁ++UU+++U+Ԁ++Ԁ++ԀU+++UԪU+U++Ԁ++Ԁ++Ԁ++Ԁ+++U++UU++++U+++UU++Ԁ+U++Ԁ++Ԁ++Ԁ++ppp+UUUUU++++UU++UU+++U++++UUU+++++ԀU+Ԁ++++++++ԀU+++++++++++++++++pppUUUU++++UU++UU+U++++UU+UԀ++++Ԁ++++++++Ԁ++++++++++Ԁ++++++++++ppp+Ԁ++Ԁ++++Ԁ++++++Ԁ+UU++++++++++++++ppppppppp+UԀ+UԀ++UU+UԀ+UԀ+UԀ+UԀ++UU+UԀ+UԀ++pppUUUU++U+UUUUUUUU++U+UUUU++ppp+U++ԀUU++ԪUԀ+++Ԁ++UԀ+U++++++Ԁ++Ԁ+++UU+++Ԁ+++U++++++ԀU++++Ԁ+U+UԀU+Ԁ++++Ԁ++Ԁ+UUUU+++UUU+++UԀ+UU++UԀ+++ԀUԀ+++UԀ+UԀ+U+UUU+++UUU+++Ԁ++Ԁ++Ԁ+UԀU+Ԁ+++UUԀ++++Ԁ+++++Ԁ+U+U++UUU+++UԀ+UԀ++U+U++ԀUU++ԪUԀ+++Ԁ++UԀ+U++++++Ԁ++Ԁ+++UU+++Ԁ+++U++++++ԀU++++Ԁ+U+UԀU+Ԁ++++Ԁ++Ԁ+UUUU+++UUU+++UԀ+UU++UԀ+++ԀUԀ+++UԀ+UԀ+U+UԀ+++Ԁ++Ԁppp+UUU++ԀUU+UԀ+ԪUԀU++ԀUU++ԀU++ԀUU++++Ԁ++Ԁ++U++Ԁ+Ԁ++++U+Ԁ+++++Ԁ+UU++UUUU+ԪU++UԀ+UUUUԀ++++Ԁ++UU+ԪU+++Ԁ++UԀ+Ԁ+ԀU++ԀUU++U+UUU+U+UUԀU++ԀU+U++++Ԁ++UԀ+Ԁ+Ԁ++Ԁ++Ԁ++UԀ+UUUUԀ++UU+ԪUU+UU++Ԁ++UU+UUU+ԪU+++UԀ+Ԁ+ԀU++ԀU+UU+ԪU+UUU++ԀUU+UԀ+ԪUԀU++ԀUU++ԀU++ԀUU++++Ԁ++Ԁ++U++Ԁ+Ԁ++++U+Ԁ+++++Ԁ+UU++UUUU+ԪU++UԀ+UUUUԀ++++Ԁ++UU+ԪU+++Ԁ++UԀ+Ԁ+ԀU++ԀUU++U+UUU+U+UUԀU++ԀU+U+U++U++UUU+ppp+UԀ++++++UUԪ++++UU++++++Ԁ++Ԁ++Ԁ++++Ԁ+++++U++++UUUU++++++Ԁ++U++ԪU+UU+UU++++Ԁ++Ԁ++U+Ԫ++Ԁ++Ԁ++++UU++Ԁ++++Ԁ++++Ԁ++Ԁ++UU++++Ԁ++Ԁ++++Ԁ+++ԪU+UU+UU++++U+++Ԁ+++UԀ++++++++U+Ԫ++++++UU++Ԁ++U++UԀ++++++UUԪ++++UU++++++Ԁ++Ԁ++Ԁ++++Ԁ+++++U++++UUUU++++++Ԁ++U++ԪU+UU+UU++++Ԁ++Ԁ++U+Ԫ++Ԁ++Ԁ++++UU++Ԁ++++Ԁ++++Ԁ++Ԁ++UU++++ԪUU++Ԁ++++Ԁppp++++Ԁ++++UU+UԪ++UU++Ԁ++++Ԁ++Ԁ++Ԁ++++Ԁ+++++U++++ԪUUUU++Ԁ++UUԪ++U++UԀUUԪU+U+++++Ԁ++Ԁ++U+++Ԁ++++UU++Ԁ++++UU+U++Ԁ+UUU++++Ԁ++++Ԁ+++UԀUUԪU+U+++++U+++Ԁ+U+UԀ+++UԪ++++U+Ԫ++++++UU++Ԁ++U+++++Ԁ++++UU+UԪ++UU++Ԁ++++Ԁ++Ԁ++Ԁ++++Ԁ+++++U++++ԪUUUU++Ԁ++UUԪ++U++UԀUUԪU+U+++++Ԁ++Ԁ++U+++Ԁ++++UU++Ԁ++++UU+U++Ԁ+UUU++++ԪUU++UU+UpppU+++Ԁ+Ԁ+++++U+UUUU+++UU+UU+Ԁ++U++ԀU+ԀU+Ԁ+++++U++ԀUUԪ+UU+UUUU+Ԁ+++UUUU+ԪUUU+UUUU+U+UU+Ԁ++UU+ԪUUUUU++U+UU+Ԁ+++++U+Ԁ++ԪUU++U+UU++UUUU++Ԁ++Ԁ++ԀUU+UUUU+U+UUU+ԪU++ԪUU+++++UUU+++UUU+ԪU+UUU++U+UU++ԪUU+ԪUU+++Ԁ+Ԁ+++++U+UUUU+++UU+UU+Ԁ++U++ԀU+ԀU+Ԁ+++++U++ԀUUԪ+UU+UUUU+Ԁ+++UUUU+ԪUUU+UUUU+U+UU+Ԁ++UU+ԪUUUUU++U+UU+Ԁ+++++U+Ԁ++ԪUU++U+UU+++++U++ԪU+Ԁppp++Ԁ++ԀUU++++++Ԁ++Ԁ++UU++UU++UUԪU+++UԪU+U++++Ԁ++UUԪU+++UU++UU+U+UԀUU++++Ԁ+U++ԀU+U+Ԫ++UU++Ԁ+U++Ԁ++++UUUU++U+++Ԁ+++Ԁ+++Ԁ+++Ԁ+++Ԁ++Ԁ++Ԁ++Ԁ++ԀU+U+Ԫ++UU+U+Ԁ+++Ԁ++Ԁ++UU++ԀUU+U++UU+++++Ԁ++U++Ԁ++ԀUU++++++Ԁ++Ԁ++UU++UU++UUԪU+++UԪU+U++++Ԁ++UUԪU+++UU++UU+U+UԀUU++++Ԁ+U++ԀU+U+Ԫ++UU++Ԁ+U++Ԁ++++UUUU++U+++Ԁ+++Ԁ+++Ԁ+++Ԁ++Ԁ+U+++Ԁ++ppp+UUUUU++++UU++UU+++U++++UUU+++++ԀU+Ԁ++++++++UU+UԀ+++++UUUUU++++UU++UU+++U++++UUU+++++ԀU+Ԁ++++++++ԀU+pppUUUU++++UU++UU+U++++UU+UԀ++++Ԁ++++++Ԁ+++++Ԁ+++++UUUU++++UU++UU+U++++UU+UԀ++++Ԁ++++++++Ԁppp+Ԁ++Ԁ++++Ԁ++++++Ԁ+UU+++++Ԁ++Ԁ++++Ԁ++++++Ԁ+UUppppppppppppppppppppppppppppppppppppppppppppppppUUUUUUUU+UUUpppUUUUUUUUUUU+ppp++Ԁ++U+Ԁ++++Ԁ++Ԁ++++U++UU+++UԀ+++Ԁ++++U++UUUU+++Ԁ++Ԁ++UԀ+++U+Ԁ++++++UԀ++U++++Ԁ+++UԀ++ԀU+U++U+U++++++UUU+++UԀ+++Ԁ++Ԁ++U++U++++++Ԁ++Ԁ+++++UԀ++++Ԁ++Ԁ+U+++++U+++++++++++U+U+++UԀ𿿿𿿿pppU+++Ԁ+++UԀ++Ԁ++++Ԁ++Ԁ+++++UԀ++U++Ԁ+ԀU++++Ԁ+++++UԀ+++UUUԪ+++Ԁ+Ԁ++Ԁ++ԀU+++++UԀ++Ԁ+++++++Ԁ+++Ԁ+++++UԀ+ԪU+Ԁ+++UU+U+U+UUU+UUU++++++ԀU+++ԀU++Ԁ++UԀ+ԪU++U+Ԁ++++++++UUU++++++UU+++++U++++Ԁ+UԀ++++UU+Ԁ++++Ԁ++++UU+++UUU+UU+𿿿𿿿pppUUԪ++UԀ+++Ԁ++++Ԁ++Ԁ++++UԀ+++++++UUԪ++Ԁ++++UԀ++++UԀ++Ԁ++Ԁ++Ԁ++UUԪ++UԀ+++Ԁ+++++++ԪU++Ԁ++ԀU+++Ԁ++++++++ԪUUU+Ԫ+UԀ+UԀ++++++Ԁ++Ԁ++Ԁ++UUUU++++Ԁ+++ԀU++Ԁ++++++++++UU+++Ԁ+++++UU+UԀ++Ԁ+++Ԁ+++ԀU+++Ԁ++++ԀU+++Ԫ+UԀ+Ԁ+𿿿𿿿pppUU++Ԁ++++Ԁ++++Ԁ++Ԁ++++Ԁ++++++++UU++Ԁ++++Ԁ++++++++Ԁ++Ԁ++UU++Ԁ++++Ԁ++++++U+++Ԁ++UU++Ԁ++++++UUU+Ԁ++++++++++Ԁ++Ԁ++Ԁ++UUUU++++Ԁ++Ԁ++Ԁ++Ԁ++++++++UUUU++++Ԫ+UԀ++++UU++UUԪ++++Ԫ+UԀ++UU++Ԁ++++++Ԁ++++Ԫ+UԀ𿿿pppUU++UU+++UU+Ԁ+++UU+UU++++++U+UUԪ+++UU+UU++U+UU++Ԁ++U+UUԪ++UU+++UU++++++Ԁ++Ԁ++UUԪ++Ԁ++Ԁ++++++UU++ԀU+U++++UU+Ԁ++Ԁ++Ԁ++UUUU++++Ԁ++UU++Ԁ++++++Ԁ++UUUU++++ԀU+++++UU++UUԪ+U++ԀU+Ԁ++UUԪ++Ԁ++++Ԁ++U+++ԀU+++ԀU+𿿿pppUU++Ԁ++Ԁ++UU++Ԁ++UU++++++++Ԁ++Ԁ++UU++++Ԁ++Ԁ++Ԁ++++Ԁ++Ԁ++Ԁ++UU++++Ԁ++Ԁ+++Ԁ+UU++Ԁ++++++++Ԫ+U++++Ԁ++Ԁ++++UU+UU++++++U+UԀ++++Ԁ++UԪU++Ԁ++++++++++UU+++Ԁ+UԀ+++++UU+UԀ++Ԁ+++Ԁ+UԀ++++Ԁ+UU++Ԁ++++UU++++Ԁ+Ԁ+UԀ+𿿿ppp+UԀUU+UUU++Ԁ++++Ԁ++Ԁ++ԀU++++UԀ+++++Ԁ+++++++UUԀ++U+UUU+UUU++++++++++U++++UԀ++Ԁ+++++++++U+UԀUU++U++++UԀ+++++UԀUU+Ԁ+UԀ+++U++++UԀU++++UԀ+++++Ԁ++++U++++UUUU++++UԀppp+Ԁ+++++++UU++Ԁ++++++UU+UԀ+UU+Ԁ+++++UUUUUUUUU++Ԁ++Ԁ++Ԁ+++++++Ԁ+++++++UU++++U+++Ԁ++++UU+++Ԁ+Ԁ++Ԁ++U+++UU+++++Ԁ+UUU++ppp++Ԁ++ppppppppppppppppppppppppPPpppPPppp'w'wPw'PPP'w''Pw''wPP'w''Pw'w'Pw'PPw'pppP'ww''wP'ww'''ww'wP'wP''ww'wwP''wwww''PP'wǠP'Pwww''pppPPww''w''www''ww''ww''ww''PPww''ww''wP'Pw'ww''pppPPww''w'w'ww''ww''ww''PPww''ww''wP'wǠw''ww''pppPPww''PPww''ww''ww''wP'PPww''PP'wǠPPPww''pppPP'ww''w'w'wPP'w''ww'''ww'ww''w'Pw'w'ppp'PwPPww''ww''ww''pppw'w'ww''ww''ww''pppppppppppppppppppppppppppppppppppppppppp᭭ppp᭭ppp                     ᭭ppp                        ᭭ppp               )          ᭭ppp           )) * * * * * * *     ᭭ppp            * *((0((01-/1-/1-/1-/1-/1-/((0'#&     ᭭ppp           * *((01-/738?;B?;BDBHDBHDBHDBHDBH?;B?;B7381-/1-/'#&   ᭭ppp          * *((0*1:?;BDBHCHTTKQZSXZSXeVXeVXeVX`NOTKQYECR?=F76=/.2(''#&  ᭭ppp        ) *((0*1:738DBHTKQZSXi\bZSXe`]e`]e`]e`]e`]e`]eVXTKQ`NOTKQR?=F761-/'#&  ᭭ppp         *((0*1:?;BTKQZSXTYfe`]hegnonlqunonnonnonnonhege`]e`]DBHTKQ`NOYEC?;B=/.'#&   ᭭ppp        *((0*1:?;BTKQeVXe`]hegheguwxuwxuwxuwxuwxuwxuwxe`]none`]ZSXeVXCHT738aKH?;B=/.'#& ᭭ppp        *((0*1:?;BTKQi\be`]nonuwxuwxlqu{{{uwxnonheg?;BZSXeVXhegheg?;B((0((0`NOR?==/.'#& ᭭ppp      ) **1:?;BTKQeVXe`]lquuwx{e`]?;BgguvgguhegTYfDBH*1:*1:ZSXCHT((0((0aKHR?=1-/(  ᭭ppp       *((0738DBHZSXe`]TYfnonhegTYf/CHTTYfJP\uwxJP\TYfgguCHTCHT?;BDBHnonnone`]738'#&YEC=/.2(' ᭭ppp     ) **1:?;BTKQeVXZSXuwxlquuwx  ?;B{KervlquTYfCHT*1:ZSX{e`]e`]e`]((0((0((0R?==/.(  ᭭ppp      *((0738DBHeVXZSXuwx{TYfDBH//CHT{TYfTYfnonCHTTKQZSXnonheg?;B738heg7381-/?;BaKHR?=F762('2(' ᭭ppp      **1:?;BTKQe`]{hegJP\gguSa//'#&oZZoZZoZZhQOhQOaKH܇sthQOܨaKHYEC᭭ppp     **1:DBHZSXnonuwxgguJP\p//JP\stxegoUQoZZhQOYEChQOaKHR?=aKHYEC᭭ppp    )((0738DBHi\bxegCHTlqu/ TYf{}nkxegoZZoUQoUQhQOhQOoUQxegoZZaKHYECaKHaKHoUQhQOYECaKH=/.uwx᭭ppp     *((0738DBH}nkhegi\buwxJP\prZSXp/SavCHTCHTDBH?;BCHT?;B?;BZSXDBH738((01-/'#&'#&aKHF762(' ᭭ppp   *((01-/?;BDBHTKQxstlqu*1:'#&TYfJP\JP\JP\DBH?;B?;B?;BTKQDBH7381-/1-/1-/738TKQhQOF76F762('( ᭭ppp 1-/KerCHTCHTJP\TYfi\bststpTYf{hegheg*1:Saggu{gguKerJP\CHTi\beVXTKQeVXpJP\eVXDBHTKQhQOTYfSaoZZaKHJP\DBH*1:R?=1-/*1:YEC᭭ppp  YEC`NOeVXLoZZpxegVSai\bxegstgguhegxjrhegi\bSai\bi\boZZeVXpeVXhQOe`]hQOoUQaKHaKHYECYECF76᭭ppp  R?='`NO738eVXi\bxegxegxegxegsToLgguggu'i\bxegxeg/xjrTKQeVX'JP\oUQoZZF76oUQaKHYECF76᭭ppp R?='`NO'#&?;BoZZ}nkstLxeggguNmpr{'xjrheg'st'oZZDBHTKQl/paKH2('oUQ'aKH'pYEC᭭ppp R?='`NO *738oZZ'}nke{'lqu{xjrexjrYR}nk'eVXDBH`NOYLY`NO2('oUQ'aKHLYEC2('᭭pppR?='`NO ((0eVXest}nkxe}nklђprxjr{e{{LstqKereVXhQOe}nkhQO'hQOhQOoUQeYECYECYEC᭭ppp aKHeaKHF76'#&YECLstRlчststxjrъ{xjrst{LststLxegi\beeVX`NOQoUQeaKHaKHYECYECYEC=/.᭭UUUUppp2('aKHaKHaKHR?= ((0hQOoZZstst{ststxegxjr{stxegi\beVXZSXoZZi\bhQOR?=ZSXoZZaKHhQOR?=aKHYECYECYECYECYECR?=᭭UUUUppp 1-/R?=hQOɿÚuwxssgzpr?;BR?=DBH1-/1-/DBH aKHR?=2('᭭*U*UU*******U**UUUU********U*UU****U*U**ԪU**U**UUU**********U*U****UUU*******U***ppp    ((0738R?=hQOȻɿ䶨ЌlquTYfTYfTYfgzBZNm?;B738YEC1-/2('2('aKHF762('  ᭭**UU*ԪU*U********U*UU*ԪUU*****UU**UU*ԪU*U*****ԪUUU*ԪUUU*ԪU**U*UU*ԪU**U*****UU*U***U****UU*ԪU*****U**U*****U*UUppp   2('738DBH`NO愆prU~prToTYfssgzTo1-/R?=?;BYECF761-/(  ᭭****U*U*************U*************U*U*****U*Ԫ**U*Ԫ**U*Ԫ***U**U***********UUUUUԪ*U**U*Ԫ********UUԪ******ppp    2('F76R?=`NOllU~U~YECgzgzgzTKQZSXZSXYECF76=/.(  ᭭****U*Ԫ**************U********U****U*Ԫ******U*Ԫ**U*Ԫ**U*Ԫ*U**U**********UU*U*U*U***U*Ԫ********UU*****Uppp   2('738R?=aKH擳撍sspr}nk`NOYECF76=/.(  ᭭**UU*ԪUUU*****UU***ԪUU*ԪU***UU*UU****UU*ԪUUU******UU*ԪUUU*ԪU**U*UU*ԪU*****UU*UU****U*UUUUU*ԪU*U**UU**UU****ԪUU**ppp  '#&1-/F76R?=YEC`NOȻɴݨxxxaKHYECF76=/.2('(  ᭭***U******UU***U*UU***UU*****U**U***U**U*U**U**UU**UU***UU***UUUU*U**U**UUԪ****UU******ppp  '#&2('=/.F76R?=R?=YECaKHaKHaKHaKHaKHYECR?=F76=/.2(''#&  ᭭**************U*****UU****U*******UUU**pppYECYEC2('YECYECYECYECYECYEC aKHF76aKHaKHhQOaKHhQOhQOaKHhQOhQOhQOR?==/.1-/2('(    ᭭*****************U********UU**********pppR?=YEC R?=YECYECYEC2('YECF76R?=}nkYECsthQOaKHaKHR?=(   ᭭******UU******pppR?=YEC YECYECYEC=/.YECF76aKHF76aKHaKHaKH2('(   ᭭pppYECR?=YECYECR?=YECYECYEC YECF76stF76stYECYEC ᭭pppF76YECYECYECYECYECYECYECYECYECYEC2('YECYECYECYECYECYECYECYEC( ᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppppppppppppppppppppppppppp᭭ppp᭭ppp᭭ppp᭭ppp᭭pppTTT````````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUUU᭭pppSSSUUU᭭ppp]]]naaa᭭ppp___TxE]6\ps___᭭pppaaa氽*Uk*21B*[tSv```᭭pppcccpCfxYdG)a}?iaaa᭭pppeee8d{dވރ]XtX{aaa᭭pppggg싢0hߝ"uNnDmaaa᭭pppiiiBj~j["wQr2_vaaa᭭pppkkk)]uׁR&"W{ Qk{aaa᭭pppmmmWv,dgr\*!]Mha~aaa᭭pppooo³e'\xare/" dKiMoaaa᭭pppqqq扡(ZtVsk8"!mLkDkaaa᭭pppsss윰1`xKrnA"!tQr6cyaaa᭭pppttt3`v@~pqK#"|Ux&Voaaa᭭pppwww黻ÿ:bv5qmsV&"\Ni}```᭭pppxxxÿJm+eir_+! bNkd```᭭pppzzz°^}&^{brf1"!jLkOt```᭭ppp|||&[vYrl:"!$q|Mx@^᭭pppက좳.\tAqqQk܉j  ?g᭭pppႂÿ5_t:u۔^~  :l᭭pppᄄ¿Ch|Ltޝ9>  @]᭭pppᆆÿ]~>h聁TT.. Aa᭭UUUU**UUpppለv0]}円__884 A\᭭UUUU**UUppp቉务2_|uN^Cs᭭*U****UUU***U***UUU**********U***UԪ*************U**U***U***********U*UUU*******UUU****UU****U***UUUU***UUU*********U*pppዋ游覷KqKhC^᭭*UUUԪ**UU****U*UU*********UU***UU**********UU**ԪUU*ԪU**U*****U*************U***********U**U*****U***UU*ԪU*****U*********U**pppፍ⁂᭭*U******************************************U*Ԫ**UUԪ**U*************U**********************U****U*Ԫ**************U***pppᏏ᭭*****U*****U********Ԫ*U**UU***********U****U*Ԫ**UU*************************************U****U*****************pppᑑ᭭U**UUU**UU**ԪUU**UU*UU***U***UU***U******UU****ԪUU*ԪU*UU*UUԪ**UU***UU****UU*UU**UU*UU*UU********UUԪ**UU*ԪUUUUU*****UU*UU**pppᒒ᭭****UU************UU**U*********U*****U**U**UU********UU****UU******UU******U***UU***U********UU**pppᔔ᭭*UUU**U****U***U****U***U*******pppᖖ᭭UU*****U*UԪ*U*U*****U************pppᗗ࿿᭭UU**UU******pppᙙ߾᭭pppᚚ߿᭭pppᛛ᭭ppp᜜텅᭭ppp᝝톆᭭ppp᝝톆᭭pppᙙက᭭pppឞ᭭ppp᭭ppp᭭ppp᭭ppp᭭ppp᭭ppppppppppppppppppppppppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpppxxxxpppxxxxpppxxxxpppxxᎎxxpppxxᐐyyyxxpppxxxxxxxxxxxxxxxxxxxxxxxxxpppxxለxxxxxx000---555CCCxxxxxpppxxჃxxxxxxJJJJJJxxxxxpppxxᓓxxxxxxJJJJJJxxxxxpppxxᖖ¼xxxxxxJJJJJJxxxxxpppxxᖖЧ˸xxxxxxJJJJJJxxxxxpppxxᖖ٣ʱxxxxxxJJJJJJxxxxxpppxxᖖܿ«xxxxxxJJJJJJxxxxxpppxxᖖݦʻxxxxxxJJJJJJxxxxxpppxxᖖޛɞxxxxxxJJJJJJxxxxxpppxxᖖߝҟxxxxxxJJJJJJxxxxxpppxxᖖ௯לyyyxxxJJJJJJxxxxxpppxxᖖԠʫʓyyyyyyJJJJJJxxxxxpppxxᖖӳ󛛛zzzyyyJJJJJJxxxxxpppxxᖖ῿zzzzzzJJJJJJxxxxxpppxxᖖ⽽{{{zzzKKKKKKxxxxxpppxxᖖNo||||{{{KKKKKKyyyxxpppxxᖖRw&V%S||||||LLLKKKyyyxxpppxxᖖά2_rŐJq=_||||||LLLLLLzzzxxpppxxᖖ&V^@jiŠ3_bt}}}|||LLLLLLzzzxxpppxxᖖ;eJrQwD0]d$T~}}}}}}MMMLLLzzzxxpppxxᖖxÕ:ehɊIDDMtNu5_~~~}}}))))))JJJMMM{{{xxpppxxᖖ+Yn͎)XCDDIeŇ8dg~~~~~~111///111BBB|||xxUUUU**UUpppxxፗ*Y_ȂHqCCCCD)Ykȋ'V~~~~~~~~~}}}}}}|||xxUUUU**UUpppxx>>;;;???\\\xxpppxxDOO? ? ? ?8d᜜{{{JJJ;;;GGGxxpppxxK @<<<<<<<<EDn>>??8d~ޜMᙙxxpppxxNF99999999 ?MM~Cm>>>H2_᜜xxpppxxNN 844444445L;f @=> A`̓NᛛxxpppxxNL 4...... 3M2_== B}ޙOxxpppxxLM1^:++++ 5Lx==NߜOxxpppxxdʆܰ%S@?F/\쭕 A B_c΅MxxpppxxMqΐˁ㝛p3`p̑4aNxxpppxx+[ަխvٔ8dNxxpppxxLL Q(X)XPMxxpppxxxxpppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpppxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpppppppppppppppppppppppp᭭ppp᭭ppp᭭ppp4Q*d4j7i7[0C"᭭ppp$D2V=fHrPwTuRlJR8!3`1FKNPQQPMJx>= ᭭ppp%Y?amu|wnmggT k+GKNPQQRSSRQNJx>$᭭ppp(kMpu}zb^ ~;GKLKJKLNPQSTSQLG= ᭭ppp^@\ooi >GIHFDHMP R T V W S T UTPI@"᭭pppxRam~xc|9EFDAADr5LORTU[" W V V V UQK᭭pppN3|Vco}i-l)DDB?@EJw;RVY[!\"b(^] [ Y X VQG᭭pppgD|Vcn~u d\CC@=?EL R~BY ]#a&d(e)k/hfb_\ Y WPN-᭭pppqJ{Tbl ~r/q-A@>>EL T\ Ja'f+j.m0o1u7splgb] Z VN᭭pppxQ_jw t A@>>DL V_gVj1q5v9y;z<~A"{upic] Y T᭭pppuMZfrzz} y~D??BL Xdo yf{> D H J JO3-%zrib\ V ^9᭭ppppH}Vbhvrv ª _1?@BM \iv'0(yOUY\[_I̡@ș5‘* }sh_ Y {K᭭pppwO\fiyqrz Ȳ ι)̹/R=@EP^lz+8”Dʟ9` h$o%r$p(r`ײUѪH˟9Ĕ,!}sg [U᭭pppqI}Vafgysw ˵+:CPFGT]mv*8EřQͣFē's.~2436nڹcԮT̢EÕ6)zpeX᭭pppwN[cc[b}zʵ':P_[XW`k{| ~GKVd'u18Ž=ǖ@̜?͞<ʙ4*{ eP$g2&vlb᭭pppoF{S]b]zSxS ůѾ5PͼPcGo1bkx.×9Z^#o.8?ʙDϡGҨGԪEҨ>̜4(r>QΥ;ŕ,!{q`᭭pppsJW^^}VpIgAíϼ/J/^ d igsv5ɟJЪUϩ*p'v2<ǕCΡIөK֯KرI֮CФ8œ[ͤsܼ[ӬCɛ1%ulO᭭pppvNY]YqKa;Z4d?g[ p^f m i v Ř9ͥPӯeٹoں:4?˛FѧL֯OسOٴJװDѥsۺ|bֱH˟5'{᭭pppnFyQZ[xRkF`:b:f=g?mEsKxQX_f n uyCV ɝ;ϩTճiۼ|ŅIʜ?͠HԬRٳV۶TڵM֯Ǥٕe׳L̢8)(~᭭pppoG{RYWsMlGd<e<g?lDrIwO~V]e m v~'ĕˠ;ѫT׵kܽ~ǏЗWծG֮TٵY۷Vٴϰޥٕ~d׳L̢7)1jL᭭ppppH{SW~Y~YzSa:e=iAoFtLyR[c l u~$Tfț͢2ҬQ׶jܿ~ȐѝؤbܺMٴVٵԶݢؐzaձIʠ4=[B᭭pppqI{SZmZgAc;f>jBpHa _i s }&.6+Σ'ӬJ׶dܿ{ȍЛצݫkմۛՉsܼ[ҬBǜ<\]+kE᭭pppqI{UtnkFd<d<e>` zSyR[e o z%/ū9ʱAOʢҫ;׵ZܽrƅΕՠڨެߧܟؑh׵OͥCǝayEnGnF᭭pppvPvgebb:kEptM~V`k v",Ū7˳BкLӾT^,̤"׳Fڻdyˋҗןڤܥܣ۝דуoٺWЫQʣuI[ vNsK᭭pppbstMnFf>c;iBkDpHxQZe p |(è4ʱ@йKԿT]eg`ŕ4ڻJܽgẏѐԖ֗֔Ӌmٺ]ԱmęA~g |U{S᭭ppp`rsMnEf=d;f>xRvP{T^j u".Ȯ:ζFӽQ[dlrt|̤_cmx}zrqܿ|̪ŲJ2q `}X᭭UUUU**UUppp_lhkCe=d;e=e uP}Wb n z&ĩ2˳?ѺLWajpw}ڂׂ{ɏ˞̩ͧˤƘnّrUƭ7{i\᭭UUUU**U*pppa eklGf@d=tNvwSYf r (ǭ5͵CҼOZdmu{ف܅݇܇ۆ؃~xqi^ҼRݐyZ̶>!r ` ᭭****U*****UUU******UU*UUU*******UUU****UU****U***UUUU***UUU*****U*UUU****UU***U**U******UUU***UUU****UUUU*********U**U*U*U*****Uppp^ac`abl p[i v!*ɯ8ηDӾQ\fow}ڃ܇݊݋܊ۇك~wmbԾSq`ѽB%{ ᭭U******U************UU*ԪU*U***********U**U*****U***UU*ԪU*****U****U*****U***U*UU*ԪU**********U****U**********U*UU*ԪU**UU*ԪU***U***U****ppp}W~W{TwOyS}Vdx{tx"è*ɰ8ϷEӽQ]gow~ڄ܈݋ލ݌܉څ׀xocT؄bHì*y᭭UUԪ**U***************U*U**********************U****U*Ԫ************************U*Ԫ************************UUUU****U*****U***UUUUUԪ*UpppzT xRvPrKtMzT`q )~#è*ʰ6ϷCӽP\fow~ل܈݋ݍ݌܊چ׀yocTihKDz/~᭭UU****************U*Ԫ*********************U****U*********************U*Ԫ********************ԪUUUU****U*****U***U*U*U*U*ppptLtLqIsKyR_n6#ç*ɯ3ζ@ҼMYdmu|؂ۇ܊݋݋܈ڄwm`[̵A`qUƲ8$᭭UU**UU***UU*UU**UU*ԪUUU**UU*UU*UU********UUԪ**UU*ԪUUUUU******UU******ԪUU*ԪU**U*U*UU*****UUU****UUUU**ԪUU*ԪU**UU*ԪU****U*UUUppprJsJsJuL{T_p )͸Dĭ?"(Ƭ0ʹ<ѺHU`jryلۇ܈܇ۅف{shtԉw4b=rk᭭UU******UU*****U******UU******U***UU***U*****************UU***UԪU*U***UU***ԪUU*******U*U***U***U***UUUU*U*ppptMrHuKxNWbr !ʴ4J͸J[ϺP˱7ϷBҼNZdmtzقڃڃف|uma֋сҾ_/$p᭭*UUU************************UU****U**pppsKuKzPYeuʴ-Ѿ=MV+Ƭ2ӿSdԾT]fmtx{||yuneYz~ϺY)}p᭭*******************************UU*****UUpppvL|RYhw«̸-:FNмH^nʲ<һIS\djorsrojd[S\{gŭJ:y᭭************ppp{T |QZiyưκ/=EOX^rɱ>Ϸ@ҼHQX_cfgfc_YRҽHՇqӾ[ȱL<᭭ppp~V Ygy""CKOZlYŬ0˲8η@һFԿLRVYZYWTxdлRԂeϹQªD6᭭ppp\dvw W]fm'+Ŭ1Ȱ6̴<ϹBҼGԿKMNNMPvӿYŭ4w\ȲK=᭭ppph s  r| ʷCνJ+ì?$,Ӿdoɱ9͵=θAϹBкCкDйCWιIŭ3ì?23y{Z^egnp&&ZZBCJNRS66JJ>>>L'>S'>'7>'>'>'>'> '>'> ' >'>'>>'L>'g>,'>'>'I> '>>>>>(|(>'>>'(|(>>>>>(|(>'>>'(|(>>>>>(|(>'>>']([(>>>>>](Y((>'>>'](Y((>>>>>](Y((>'>>'](Y((>>>>>]((Q((Pd(>'>>']((Q(((Md(>>>>>](((L((M(d(>'>>']((L(((M(d(>>>>>]((L(((M(d(>'>>']((L(((M(d(>>>>>]((L(((M(d(>'>>'](( (((((( ((( (d(>>>>>](( (((((((((( ((((((d(>'>>'](( (( (((( (((((((d(>>>>>](( (((((( (((((((d(>'>>']((((((((((( ( ((((((((d(>>>>>]((((((((((((( (((((((d(>'>>>]((((((((( (((( (d(>>>>'](((((((( ((&(d(>'>>>](((((((( ((&(d(>>>>']((L(((M(d(>'>>>]((L(((M(d(>>>>']((L(((M(d(>'>>>]((M(((M(d(>>>>']((N((N(d(>'>>>]((Q((Od(>>>>'](Y((>'>>>](Y((>>>>'](Y((>'>>>](Y((>>>>'](Z(>'>>>](\(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>> (h (>>>>' (h (>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>'((((((((((((((((((>'>>>((((((((( (((((((((((((((((((((((>>>>'(((((((((((((((((((((>'>>>((((((((((((((((((((((>>>>'((( (((((((( ((((((((((((((>'>>>((((((((((((((((((((( (((((((((((((((>>>>'(((((((((( ((((((((((((>'>>>( (((7((((((>>>>'( ((((0((((>''>>(|(>>>>'(|(>'>>>(|(>>'>'(|(>'>>>(|(>>'>'(|(>'>>>(|(>>'>>((((((((((((((( ((((((((>'>>>(((((((( (((((((((((((((((((((>>'>>((((((((((((((((((((((((((((>'>>>(((((((((((((((((( ((((( ((>>'>>((((((( ((((((((((((( ((((((((>'>>>(((((((((((((((((((((((((((>>'>>((((((((((((((((((( (((((((>'>>>(((((((( (((((((((((((((((((((>>'>>((((( ((((((((((( ((((((((>'>>>(|(>>'>>(|(>'>>>(|(>>'>>(|(>'>>>9((@(>>'>>8(((?(>''>><((?(>>>>>((((((((((((((((((((((( (>'>>>((((((((((((((((((((( ((((((((((( (>>>>>((((((( ((((((((( ((((((((((>'>>>( ((((((((((((( (((( ((((((>>>>'( ((((((((((((( ((((((((>'>>>((((((((((((((((((((((((( ((((((>>>>'( ((((((( (((( (((( ((((((>'>>>(( ((($((((((((((>>>>'( ((( (((((((((((>'>>>(|(>>>>'(|(>'>>>(|(>>>>'(|(>'>'>D(&(3(U(:(4((>>'>'C(((1((U(8((2(((>''>>C(((5(U(<(6((>>>>'(((((((((((((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((((((((((((((((((( (>'>>>((((((( ((((((((((((((( ((((((((((((((((((((((( ((((((((((((((((((((((((( ((((((((( ((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>>'>((((( ( (((((( ((((((( ((((((((((((((((((((( ((((((((((((((((((((( ((((((((((((((((((((((((((((( (((((((((((((((((((((((((>'>>>(((((( ((((((((((((( (((((((((((((((((((((( ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>>>>((((((( (((((((((((((( ((((((((((((((((((((((( ((((((((((((((((((((( ((((((( (((((((((((((((((((((((((((((((((((((((((((((((((>'>>>(((((((( ((((((((( ((((((( (((((((((((((((((((((( (((((((((((((((((((((((( ((((((((( (((((((((( ((((((((((((((((((((((((((((((((((((((((((((((((( (>>>>>((((((((((((((((((((( ((((((((((((((((((((((( (((((((((( (((((((( ((((((((((( (((((((((((((((((>'>>>((((((((((((((((((((((((((((((3(0(>>>>>(((((((((((((((((((((((((((((((((((>'>>>(|(>>>>>(|(>'>>>(|(>>>>>(|(>'>>>(|(>>>>>(|(>'>>>(|(>>>>'(|(>'>>>(|(>>>>>(|(>'>>>(|(>>>>'(|(>'>>>(|(>>> >'>'>'>'>''>'> '>''>''>''> ''>''>''>''>'>' >'>>'>>'>' >'>'>>'>'>''>>''>'>'> ' >'>'>>''> '>'>'>'>'>>'>''>'>' >'>''>'>'''''>''>'>'>>'>''>>'>''>'>>> ":":":&:&&;;;;# ## 33%%=%==$$$7 77 8 ?8??8?889999 4...... 2***  !!!!/!!))) ---55<6666, ,  '''>'>>>":":":"&:&:&&&&;#;;# # 3 33%%%==%==$$77 ?? ?889 4+44+ .....2222 **** **  ///!!!/ !))----550< 6<66666,,, , ,  ''>>>>  ":":&:&; # # 3 3%=%== $777 ? 889 ++4+4+ ....2222** **   /!//!! ))--5-- 5<66, , ''>>>>>  ":":&:&;; ##;#;## # # 3 3 %===$$7  ?88?99 4+4+4....222****** * *  /!!!!))---5555<6666,,, , , ''>'>>>  ":"::&&;# # 3%% ==$$#7$77    ?8899 99 + 444.......22 ** ** * *   //!//!!)) ))---55555<<666,, , ,   0''>>>>>  ":":"&&&&&;;;#;;#;## # # 333353%%%%=====$$$$777  ??89 9 4 4++4....22**** **   ///!!!!!)))--505<<<<66,,, , , ,, ,''>'>>>  ":"":::&&;;;##;# # #  3%3%%=%===$$$777   ??99 9 4 44+44 ........ 22222** ** /!!!!!)))-555<5<66,, ,     ''>>>>> ":": &&&&&;;##;#  33(%%%%%===$#7777   ??8899 9 44 44+4+4 .....222 *****   //!/!!!!)))-)---555< 6<66666,,, ,  ''>'>>>":":&&&&;;;#;# # # 333%% ======'$77$77 7  8?999 4 2 **** /!!/!!)) ----55 <66666,, ,, , ,  ' >>''''>>>>>" :":::&::&;;;# # # # 3  33 %% ===$ $$77  ???99 44+4.... 222*** *  //!!!!))-550<666666,,, , ''>'>>> "::&&&;;# # 3 3 %%%%=$%$$$777  ?88889 4+4.....2 ** * ** /!/!!! )----- 5<6666,,,, ,, (( (''>>>>>  ":":: &&&&;;;;# # # #3 3333%%==$=$7$7 ? ?88?9 4+4..22** *   //!!/!/!!!))--55<<666,, ((((''>'>'> ":&:&&&& ;;;#;;# 3 3333%=%%=$$77 77 ? ??899 99 4 4+444.....22 * *  !/!!) ))---5555<<666,,, ,  11 11''>>>>>  " :""&":":&:&&;;#;# # ##3 3 33%%=%= ==$$$7$7 7 ? ?88899 9 4 4+44...222** * *  //!!!!!))--5-5 5<<<66666,,, ,, ,    1''>'>>>  " ::"":&&::&:&&;;#;# ## # 3 3 33%%=%===$$7$7 7 ? ?88?899 9 4 44+44.....222** * *  //!!!))-)--55<5< 666666,,, ,, ,   >'>>>>'  " :":"&":&&:&&;;;##;# # # 33 33%%%==%= =$$$$77$7 7 ?? ?8?999 9 44 44.....2222*** *  //!/!!))))--555 5<<66<66,, ,  ''>'>>>":&":&;# # 3 %==$7 ?9 4..2*  * ////!!))--5<<6,  '>>>'>":":&;# # 3%=$7 ?9 4.2* //!! ))56,  ' '>'>>>'>>>>>>tqsl-2.8.1/apps/help/tqslapp/signdone.bmp0000644000175000017500000006600615003421124020370 0ustar rmurphyrmurphyBMl6(.j  @@ bbb&'VWBCnn67bbJK¶z|./^_vx>?jlRSqseg~Z^NRFG:;"#23**ZZNN~~0!.!!!,!!!!+!!!!(!!!!!&!!!!!#!!!!!!!!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!! !!!! !!!!! !!!! !!!!! !!!!! !!!!!&3u3o!!!!'1t4n!!!!!'5t5m! !!!   }!! !!!       }!! !!!      }!! !!!   }! !!!      }!!!!!        }!!!!    }!!!!! )  + # }!!!!! "  ( # }!!!!! !!!! !!!!!&33u)!!!!'11t)!!!!!'55t)!! !!!   #!! !!!          "! !!!         "!! !!!       "! !!!           "!!!!!        #!!!!!        "!!!!!  '  "!!!!(  #!!!!! !!!! !!!!! !!!!! X{!!!!!!Yz! !!!  8!! !!!   8! !!!  8!!!!!     8!!!!!  8!! !!!     8! !!!     8!! !!!K   8! !!!!   8!!!!! !!!!! !!!!!"!!!!$!!!!!&!!!!(!!!!!(!!!!!%!!!!!%!!!!%!!!!!%!!!!%!!!!!%!!!!!. !!!!!u!!!!u!!!!!!!!!  !!!!! !!!!! !!!!! !!!!  !!!!!!!!!  # !!!!!   !!!!!%!!!!!%!!!!%!!!!!%!!!!%!!!!!%!!!!!&!!!!!'!!!!!!!!!!!  9999)9)9))66666666686888888787777757755555%55% % % % % 4 4 4444<<<<33<<3<'<'3' '' ' 2 ; ; ; 2;#2##2##2/##/##/&/////&&/&/ &-&----$$$--$$$$$??? 0??0 00 0 1 1 = =1=1==1(=(1 (....*,***,* *+ *+ ++ >> > > >>> !!!!!!   999)9)9))))6666666688888888787777575555%5%5 % % 4 4 444<<<3<3'<'<' ' ' ; ; ;2;;22#2#2#2# #//#///&/&//& &&-&-&-&--$--$-$$-$$???0 ? ? = 1 11=1=11(1(=((( ....., ****,** **+*++ +> +>+> :>>>>> !!!!   99999)9))9))666666666688888887877757775555%5%5%5% % % 4 44 44443<<<<3<3'<''3' ' ' ' ;; ;; ;2;;2;;#2#2#/#//////&/&&&&-&-- $--$$$-$$$$????0 0 0 0 1= == 1=11==(=((1((( .....**,**,* +* * ++ ++> >> >:> !!!!        999)99)))666666668888 87878788 775555%%55%5% % 4 4444<<3<<33'<<' '' ' 22 2;;2#;##2# /##/#/#/#///&/&/ &-&-&&-&-$-$$- $?0 ?00? ?? ? == =11==1(11((((  .... ****  * ++ + +> > >>>!!!!      99))9)))6666666688888 87777877 7777755%%5%%5% % 44 4443<<<3<3''<33' ' ' 2;2 ;2;;22;2#22##/#////&/&/& -&-----$-$$-$$$00? 00? ? 0 1=1 1==1((1(( .......****,* ++**+ + > > >>> " " "!!!!       9))9 )666666666688888877 7 7775575 5% % 44 4 <3''<<3 ' ;22;#;# /##/##/#/#//&/&/&/& &-&&---$$- $0??? 0 11=((= ((  ... ****,,* + + > >:>>:::: :: :!!!!       9 ) 666666666 888787878 7775 5%5% 44<3< ' ' ;2;2;22 #/#/#///// & -&--&---$$- $$ 0 ? 0 1=1=1= (( .......*,***** ++ + ++ >> : >:>!!!!    9 9)))66666668888887 777755%5% % % 44<3<3<' ' ; 22;2 ###/#/#/#///////&//&/&&-&---$$- $ 0 ? = 11=11=1(( ( ......  *,***** * *+ +>> >     !!!!     99)99)))6666666668888777 775555% % % %% 4  4 <<'<<' ;2; 22;;2;;2;22 # //&//&/&&//& &------$$-$--$$$$$0??? =1= 1==1(1=(. .....,*****+ ** +  > >:>>:> !!!!!!!!!!!!!!!!!!!     999)99))))) 6666666668888888787 7755%55%55% %% 4  44444<<3<3'<<' '' '' ; ; 2;2#;2###/#/#/#//&/&/&&& &&-&----$-$-- $$?0??0 00 00 = 1 11=1(==( (((((.......,**** ** **++ +> >>> !! !!!!!!!!!!!!!!   9999))9)))666668888888777775555%5%%55% % % 44 4444<<3<3<''<' ' '' 2 ;2 22;2#2;2## ///&/&&/&&-&&---$-$-$$-$ $$$$?000?0? 0 00 1 1= ==11==1=((=(((( .....***** * *++* + ++ > > >:>>  !!!!      9999)99)9)))) 6666666 6888888787777555%5%5%5% % % % 4 4 4444<<<<33'33'<' ' ' ' ; 2 ; ;2#2#;# ##/#//#///&/&&/&/&&&&-&&----$-$- $$???00 0 ? ? = = = 1==1=1(11(1(((( ..... ****,** * *+*+ + + > >+>>:>>> !!!!    999)9)9)))6666668888888877777555%5%5% % % 4 4 444<<<3<'<'<' ' ' ; ; ;2;#;2##/##/// //&//&/&/& &-&--- --$$--$-$-$$$$0???0?0 0 ? = = =1=1=1=(=(=(((...*****+* *+ + > : >:>>>  !!!!     9999)9)9))) 66666888 888777777555%5%%5% % % 4 4 444<<<<3<<3<<'<'<' ' ' ; ;; 22;#2##;###////&/&//&&&&----$-$--$$$??0 ?0?0 0 ? = =1 1==11(=(1((( .... ,****** * *++ +>>+>>>   !!!!      99)99 )))6666666 88 8888777 7775 5%55% %% 4 444<33<3<<'<< ' '' ; 2;22#2 ###///&/&&/&/ & &&---$-$$-$- $$$??0?0?0?0? ?? 1 =1=11=(== (((....., ****,*, *+**+ > >:>   !!!!     99))9))6666688 8887877755%5% % 44 44<<''<' ' ; ;2#2##////&/&& ---$-$$???0?0? ? = =11((1((. ....,*,**,*,* +* +> >:>>!!!!     9 ) 6 6  88  7  5 % 4  < ' ; # /&/ &-$- $ ?00? =1= (   ... **,,,, * + >   !!!!!!!!!      9 ) 666  88 7  5 % 4  < ' ; #  / &  - $  ? = (  .... ,,, * >   !! !!!!+!!!!,!!-!!/!tqsl-2.8.1/apps/help/tqslapp/signing.htm0000644000175000017500000003132415003421124020225 0ustar rmurphyrmurphySubmitting a Log File from a Computer without Internet Access

Submitting a Log File from a Computer without Internet Access

To digitally sign a log file for submission to the ARRL's Logbook of the World (LoTW) online service,
1.Verify that all of the QSOs in the log file were made with the same Station Callsign (the callsign you used over the air during the QSO), and from the same location. If this isn't the case, use your logging application or a text editor to split the log file into multiple log files, each of whose QSOs were made with the same Station Callsign from the same operating location, and separately submit each log file.
2.Start TQSL. If you do this before receiving your Initial Callsign Certificate, an Alert window will appear that informs you that you have no Certificate, and asks if you want to request one; click the Yes button, and proceed as described here.
3.Select the Log Operations tab
  
  and click the Sign a log and upload it automatically to LoTW button.
4.In the Select File to Sign dialog,
   4.aSet the Files of type selector (on OS X, set the Enable selector) to ADIF files or Cabrillo files.
       *You can digitally sign Cabrillo log files for these contests without additional configuration.
       *When submitting a Cabrillo log file, mode PH is submitted as SSB
       *If your logging application does not ensure that only new or newly modified QSOs are presented to TQSL for submission to LoTW, enabling the Prompt for QSO Date Range option will help spare LoTW from having to process QSOs that it's already processed.
       *You can change the file extensions displayed when you set the Files of type selector.
       *You can enable or disable the submission of nonamateur callsigns.
   4.bNavigate to the folder containing the log file you wish to submit
   4.cSelect log file you wish to submit
   4.dClick the Open button
5.In the Select file to write to dialog, navigate to the folder where you want the digitally signed log file created, specify the name of the file to be created, and click the Save button.
6.If you've defined exactly one Station Location, TQSL will automatically use that Station Location and display the TQSL - Verify QTH details dialog (proceed to step 7). Otherwise, it will display the Select Station Location for Signing dialog so you can select the Station Location that specifies the operating location used to make the log file's QSOs, and then click the Ok button.
  
,
  If you select a Station Location that doesn't specify a Callsign Certificate (its Call Sign is set to [None]),
  * if you have exactly one Callsign Certificate whose DXCC entity matches the DXCC entity in the selected Station Location, TQSL will submit your QSOs with that Station Location and Callsign Certificate
  * if you have more than one Callsign Certificate whose DXCC entity matches the DXCC entity in the selected Station Location, TQSL will prompt you to select the Callsign Certificate with which to submit your QSOs:
  

7.In the TQSL - Verify QTH details dialog, verify that the information displayed is correct, and click the OK button. If any of the characteristics of this Station Location are incorrect, click the Cancel button and select a correct Station Location.
  
8.If TQSL is configured to not submit QSOs that lie outside a specified date range, the QSO Date Range dialog will appear; specify the desired Start Date and End Date, and click the Ok button.

If your logging application does not ensure that only new or newly modified QSOs are presented to TQSL for submission to LoTW, the QSO Date Range dialog can help prevent the submission of QSOs that have already been uploaded and processed.

9.If the Callsign Certificate associated with the selected Station Location is passphrase-protected, the Enter passphrase dialog will appear; enter the passphrase, and click the OK button.
10.If TQSL detects any QSOs in the log file that have already been submitted to LoTW and haven't been subsequently modified, it will display the Already Uploaded QSOs Detected dialog:
  
   10.aClick the New QSOs Only button to continue processing, ignoring the already uploaded QSOs (recommended)
   10.bClick the Cancel button to abandon processing so you can either select a log file that doesn't contain already uploaded QSOs, or use the QSO Date Range dialog to exclude already uploaded QSOs
   10.cClick the Re-Upload QSOs button to submit the already uploaded QSOs; note that the digitally signed log file submitted to LoTW will be marked as containing already uploaded QSOs
    Note: if all QSOs in the log file are already uploaded, the New QSOs Only button will not be displayed
11.The Status Log in TQSL's main window will display the results of the operation, including the number of QSOs ignored because their dates were outside of the specified Date Range, and the number of already uploaded QSOs detected:
  

   If TQSL detects any of the following errors in a QSO, it displays an Errors Detected window with the details:

  • the QSO does not specify a valid amateur callsign and the Allow nonamateur call signs option is not enabled; a valid amateur callsign
       - contains only the letters A through Z, the digits 0 through 9, and the slash character
       - contains at least one number and one letter
      - is at least three characters in length
      - does not begin or end with a slash character
      - does not begin with 0
      - does not begin with 1 unless it begins with 1A, 1M, or 1S
    Note: LoTW will not accept QSOs with callsigns that don't comply with the above requirements, so leaving TQSL's Allow nonamateur call signs option disabled is recommended.
  • the QSO's callsign could not be identified within a Cabrillo record because the callsign is not at least 4 characters in length with at least one letter and one number:  
    Unable to find a valid call-worked field
    This error can be overcome by specifying a Cabrillo Contest Definition that identifies the position of the callsign within each record
  • the QSO does not specify a valid band
  • the QSO does not specify a valid mode
  • the QSO does not specify a valid date and time
  • the QSO's date and time are inconsistent with the date range in the Callsign Certificate specified by the Station Location you selected when digitally signing the file containing the QSO
  • the QSO specifies am invalid Satellite name
  • the QSO specifies a Satellite name, but the QSO's propagation mode is not set to SAT
  • the Callsign Certificate (specified by the Station Location you selected when digitally signing the file containing the QSO) has expired or been superceded
  • the exact same QSO has already been submitted to LoTW (this is referred to as already uploaded)
12.Submit the signed log file to LoTW.
   12.aMove the signed log file to a computer with internet access
   12.bDirect a web browser on that computer to navigate to https://lotw.arrl.org/lotwuser/default
   12.cLogin using your LoTW web username and password
   12.dSelect the Upload File tab
   12.eClick the Choose File button, and select the signed log file you moved in step 10.a
   12.fClick the Upload file button
     
    Alternatively, you can attach the signed log file to an email message, and send the message to lotw-logs@arrl.org
 

tqsl-2.8.1/apps/help/tqslapp/signupload.htm0000644000175000017500000003002615003421124020732 0ustar rmurphyrmurphySubmitting a Log File to LoTW via the Internet

Submitting a Log File to LoTW via the Internet

To digitally sign a log file and upload via the Internet to the ARRL's Logbook of the World (LoTW) online service,
1.Verify that all of the QSOs in the log file were made with the same Station Callsign (the callsign you used over the air during the QSO), and from the same location. If this isn't the case, use your logging application or a text editor to split the log file into multiple log files, each of whose QSOs were made with the same Station Callsign from the same operating location, and separately submit each log file.
2.Start TQSL. If you do this before receiving your Initial Callsign Certificate, an Alert window will appear that informs you that you have no Certificate, and asks if you want to request one; click the Yes button, and proceed as described here.
3.Select the Log Operations tab
  
  and click the Sign a log and upload it automatically to LoTW button.
4.In the Select File to Sign dialog,
   4.aSet the Files of type selector (on OS X, set the Enable selector) to ADIF files or Cabrillo files.
       *You can digitally sign Cabrillo log files for these contests without additional configuration.
       *When submitting a Cabrillo log file, mode PH is submitted as SSB
       *If your logging application does not ensure that only new or newly modified QSOs are presented to TQSL for submission to LoTW, enabling the Prompt for QSO Date Range option will help spare LoTW from having to process QSOs that it's already processed.
       *You can change the file extensions displayed when you set the Files of type selector.
       *You can enable or disable the submission of nonamateur callsigns.
   4.bNavigate to the folder containing the log file you wish to submit
   4.cSelect log file you wish to submit
   4.dClick the Open button
5.If you've defined exactly one Station Location, TQSL will automatically use that Station Location and display the TQSL - Verify QTH details dialog dialog (proceed to step 6). Otherwise, it will display the Select Station Location for Signing dialog so you can select the Station Location that specifies the operating location used to make the log file's QSOs, and then click the Ok button.
  
,
  If you select a Station Location that doesn't specify a Callsign Certificate (its Call Sign is set to [None]),
  * if you have exactly one Callsign Certificate whose DXCC entity matches the DXCC entity in the selected Station Location, TQSL will submit your QSOs with that Station Location and Callsign Certificate
  * if you have more than one Callsign Certificate whose DXCC entity matches the DXCC entity in the selected Station Location, TQSL will prompt you to select the Callsign Certificate with which to submit your QSOs:
  

6.In the TQSL - Verify QTH details dialog, verify that the information displayed is correct, and click the OK button. If any of the characteristics of this Station Location are incorrect, click the Cancel button and select a correct Station Location.
  
7.If TQSL is configured to not submit QSOs that lie outside a specified date range, the QSO Date Range dialog will appear; specify the desired Start Date and End Date, and click the Ok button.

If your logging application does not ensure that only new or newly modified QSOs are presented to TQSL for submission to LoTW, the QSO Date Range dialog can help prevent the submission of QSOs that have already been uploaded and processed.

8.If the Callsign Certificate associated with the selected Station Location is passphrase-protected, the Enter passphrase dialog will appear; enter the passphrase, and click the OK button.
9.If TQSL detects any QSOs in the log file that have already been submitted to LoTW and haven't been subsequently modified, it will display the Already Uploaded QSOs Detected dialog:
  
   9.aClick the New QSOs Only button to continue processing, ignoring the already uploaded QSOs (recommended)
   9.bClick the Cancel button to abandon processing so you can either select a log file that doesn't contain already uploaded QSOs, or use the QSO Date Range dialog to exclude already uploaded QSOs
   9.cClick the Re-Upload QSOs button to submit the already uploaded QSOs; note that the digitally signed log file submitted to LoTW will be marked as containing already uploaded QSOs
    Note: if all QSOs in the log file are already uploaded, the New QSOs Only button will not be displayed
10.The Status Log in TQSL's main window will display the results of the operation, including the number of QSOs ignored because their dates were outside of the specified Date Range, and the number of already uploaded QSOs detected:
  
   10.aIf the upload to LoTW failed, a dialog box will be displayed offering to repeat the upload; click Yes to upload the digitally signed file again, or click No to abandon the operation.
   10.bIf TQSL detects any of the following errors in a QSO, it displays an Errors Detected window with the details:

  • the QSO does not specify a valid amateur callsign and the Allow nonamateur call signs option is not enabled; a valid amateur callsign
       - contains only the letters A through Z, the digits 0 through 9, and the slash character
       - contains at least one number and one letter
      - is at least three characters in length
      - does not begin or end with a slash character
      - does not begin with 0
      - does not begin with 1 unless it begins with 1A, 1M, or 1S
    Note: LoTW will not accept QSOs with callsigns that don't comply with the above requirements, so leaving TQSL's Allow nonamateur call signs option disabled is recommended.
  • the QSO's callsign could not be identified within a Cabrillo record because the callsign is not at least 4 characters in length with at least one letter and one number:  
    Unable to find a valid call-worked field
    This error can be overcome by specifying a Cabrillo Contest Definition that identifies the position of the callsign within each record
  • the QSO does not specify a valid band
  • the QSO does not specify a valid mode
  • the QSO does not specify a valid date and time
  • the QSO's date and time are inconsistent with the date range in the Callsign Certificate specified by the Station Location you selected when digitally signing the file containing the QSO
  • the QSO specifies am invalid Satellite name
  • the QSO specifies a Satellite name, but the QSO's propagation mode is not set to SAT
  • the Callsign Certificate (specified by the Station Location you selected when digitally signing the file containing the QSO) has expired or been superceded
  • the exact same QSO has already been submitted to LoTW (this is referred to as already uploaded)
11.After processing, the uploaded file will be shown in LoTW's Your Activity list with the filename selected in step 4.c above preceded by <TQSLUpl YYYYMMDD-HHMM>, where YYYY is the current year, MM is the current month, DD is the current day, HH is the current hour, and MM is the current minute.
 

tqsl-2.8.1/apps/help/tqslapp/signupload1.bmp0000644000175000017500000264446615003421124021026 0ustar rmurphyrmurphyBM6I 6(?I kM`FV>A/8(/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)?;9LGDe^Zqie|tocGV>B0/,)1/-󢟝1/-/,)GC@d^YqidZAB0ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼̽̽;;οοοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ碟HD@g`\I5-*'ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼˼̽̽;;οοοοοοοοοοͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾Ϳޢ-*'OIF=,0.,ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼˼˼̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳ.,*B>;ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼˼̽̽;;οοοοοοοοοοοοͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾̾ӡ-*(-*'-*'-*'ߢohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'Ϳohbohb-*'-*'Ϳohbohb-*'-*'Ϳohb뺺ohb-*'-*'ͿͿohb랞ohb-*'-*'ͿͿͿohb뎎ohb-*'-*'ͿͿͿͿohb|||vvvvvvxxxohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbffff:fffff::ffohb-*'-*'ͿͿͿͿohbfffffff:f:::ffohb-*'-*'ͿͿͿͿohb:::fې::fې:::ې::::::fff:::fff:::ې::ې::::f:fff:::::ې::fې:::ې::ې::ې::fې:fې:fff:::f:ې::۶:fې::ې:f:ff:::::ې::ې::fff:::::ې:f::ې:ffې:::fff:::::ې::fې::f:::ff:ې::fff:::ې::ې::ې::ېf:ohb-*'-*'ͿͿͿ̾ohb:ff:ې::f:ff::::ff:::ې::fې:ې:ې::ې:::::fې::f:::::ې::ېf::ې::ې::ې::ffېf::ېf:::::ې::fې::ff:ې::ې:ff:۶ff::ې:::ې::ې::ې:::ې::ې::f::ff:۶fېf::ېfff:::::ې::ېf::ې::f:ې::ff:۶f:fې::ې:::::ې:ې::ې::ې::ېf:ohb-*'-*'ͿͿ̾̾ohb:ې:::::ې::::::::::ې::ې::::ې::ې::::fې:::::ې::::ې::ff::ې::ې::ې::ffff۶::ې::fې:::ې::ffff::f:۶::::::ې::ې::::ې::ffff::::ې::f:ff۶::::ې::::ې::ff:::f::::f:f:::ې::::ې::ې::ې::ې::ohb-*'-*'Ϳ̾̾̾ohb::۶:fې::::ې:f۶:::::f::ې::::ې::ې::::ې::::::ې::::ې::ff::ې::ې:::fffff::ې:::::fffff::f:۶::::::ې::ې::ې::۶ffff::::ې::f:ff:f::ې::::ې::ff:::f::::f:۶::::ې::::ې::ې::ې::ohb-*'-*'Ϳ̾̾̾ohb::ېf:::::۶ff:::f:fff::ffff::ې:::ff:ff::::ې:ff:ې::f:ff::ېf:ېf:ff::f:ff۶f:ffffff::ff::ffffff:۶f::::::ېf:ېf:ffffff:f::ff:۶ff:ffff::::ې:ff:ې::f:ff::ېff۶:fff:۶fff:::fff::ېf:ېf:ohb-*'-*'Ϳ̾̾̾ohb:ې:fې:ff::fې:::ې::ff::ff::ې::ې::ې::ې::ff:::ff:::ff::::f:::f۶f:f::ې::::::ې::ې::ې:f:fې:f::::f:::f۶f:f::ې:f:fېff::ې:f::ې::ې:ff:::ff::::f:::ff::ff:f::ې::ff::ېf:::f۶f:fohb-*'-*'̾̾̾̾ohbf::::fېf:::::::ې::::::ې::ohb-*'-*'̾̾̾̾ohb:::fې::::ې::::ې::::::::ې::::ohb-*'-*'̾̾̾̾ohbff::::::::ohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbې::ff::ff::::ffohb-*'-*'̾̾̾̾ohb::ff::f:::::ffohb-*'-*'̾̾̾̾ohb:f:ffې::ې::f::ې:f::ې:ffff:::fff:::ېf::::f::ې:f::ې:f:ff::ff::::f::ې:ffff:::fff:::ې::fff:::fې::ff:::ې:f:f::fې:fې::::ff:::ې::ې::::ې:fېf:ې::fff:::::::::fې::ff:::ې::fې:::::ې::ې:::::ff:::ې:::ff:::ې::fff::::::f:::f:::f:f::fې:fې:::ې::::f:::ohb-*'-*'̾̾̾̾ohb::ff:۶ff::f:::ېf:::ې::fې:۶f::f:ې::ff:۶f:::ې::fې:ې:ېf::ff:ې::ff::::ې::ff:۶f:fې::f::ې:ې::f:ې::ff:۶f:::ې::fې:ې:ff:fې:ې:ېf::f::ې::f:fffېf::ېf::ې::ېf::ې:ې::ې:::ې:::fې:ffffې::ېf:::::::ffېf::f::ې:ې::ېf:::::ې::ff:f::f::ې:fff::ې:ff:fې:ې:::۶ff:۶f::::f:ې::ff:۶f:fffېf::ېf::::ې:::::fې::ohb-*'-*'̾̾̾̾ohb::::f:::fffff۶ې:fې::::ې:::f::ې::f:۶::ې::ې:::::ې:::::ې::::::f:f:::::::ې:::f::ې::f:۶::ې::ې::::ې::::::ff۶::::ې::::::ffff::ې::::ې::ې::ffff:۶f:ff:ff::ې::ې::::::::ff۶::::ې::ې::::::ې::ې::ff::ې::::ې::::::ې::::::::ې::f:۶:::::f::::f:۶::::ffff۶::ې::::fې::::fohb-*'-*'̾̾̾̾ohb::::f:::f:f:f:f:::::ې:::f::ې::f:::ې::::::۶:fې::ff::::::f:۶::::::::ې:::f::ې::f:::ې:::::f۶::::ff::::ې:::::fffff::ې::::ې::ې::۶ffff:fېff۶f:f:::ې::ې:::::::fff::::ې::ې::::::ې:::fff::ې:::::f۶:::::f۶::::::ې::f:۶:::::f::::f:۶:::fffff::ې::::ې:::::fohb-*'-*'̾̾̾̾ohb::ff:۶f:::ې:fې:fff::::::ېff۶::ff:۶fffff::::ېf:ې::ff::::ې::ff:۶fff::::::::ېff۶::ff:۶fffff::ff::ff::f:ff۶:::::f:fff::f:ff۶f:ff::ې::::ې::ې::ffffff:ffff:fې::ې::ې:ff::fff::f:ff۶::::ې::ې:::f۶::ې::ff:::f::ې::::ff::ې::::ff::ff::::۶ff:۶f:f::ېff۶:fff:۶f:fff::f:ff۶f:ff۶:::ff:ff::::ohb-*'-*'̾̾̾̾ohb:::f:ې::fېfffې:fې:::::f:::ff::ې:f::ې:::ې:fې:::::ې::::ې:::f::::::f:::ff::ې:f::ې::ې::ې::::ې::::۶ffff::ې::::f:::ې::ې:::f:fې::ېf:f:۶:::ff:::ff::ff::ې::ې::::ې:::ې:::::ې::ې::ېf:ې::::ې::ې::::ې::ې::f::f::fff:::ff::ff:fff::ې::::ې::ې::ff::::ohb-*'-*'̾̾̾̾ohb::::۶ff::::f::ې::::::::f::::fې:::f::::::::::f:::ې::::ې::::ې::fې::ېf::::::f:fې::f::ohb-*'-*'̾̾̾̾ohb::::ې::::ېff۶:::::::::::f:f:::::::::fې::ې::::ې::ې::::ې::ff:ېf:f۶::ې:::::fې::ff:ff:ohb-*'-*'̾̾̾̾ohb::::::::::ff::ې:::::::۶ffې:::::ff:۶ffې:ohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohb::ff::f:ېohb-*'-*'̾̾̾˽ohb::ff::::ohb-*'-*'̾̾˽˽ohb:::fېfې:fې:::ې::ې::ې:::ffff:::ې::::f:fې::f:ff::::f::ې:ffff:::fff::::ې::f::ې:ffې:ohb-*'-*'̾˽˽˽ohb:ff:ېf:f:ff::ې::ې::ې::f:ېf:::ې:::::fې::f:ff:۶ff::ې:ې::f:ې::ff:۶f:::ې::fې:ې:::ې:ې:fff::::ې:fې:ېf::ېohb-*'-*'̾˽˽˽ohb:ې:::::ې::::ې::ې::ې:::fې::ې::ې::::fې:::::ې::f:::::ې:::f::ې::f:۶::ې::ې:::::fې:fې::ff:fې::ffohb-*'-*'̾˽˽˽ohb::۶:fې::::ې:f۶::ې::ې::ې:::fې::ې::ې::::ې::::::ې::f:::::ې:::f::ې::f:::ې:::::fې::ffff::ffffohb-*'-*'˽˽˽˽ohb::ېf:::::۶ff::::ېf:ېf:::ېff::ې:::ff:ff::::۶ff:۶f::::::ېff۶::ff:۶fffff::::::ffff::ff۶f:ffohb-*'-*'˽˽˽˽ohb:ې:fې::::ې:::ېf:::f۶f:ff:::ff:ff:::ې::ff:::ې::f::::f:::ff::ې:f::ې::::ې:fې::ff:fې::::ohb-*'-*'˽˽˽˽ohbf::::fې::::::::::::ff:fې:ې:fې::fېff:ې:fې:ohb-*'-*'˽˽˽˽ohb::::::::ې:::::::::ې::ې::ې::ې:ohb-*'-*'˽˽˽˽ohb::::ohb-*'-*'˽˽˽˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbfffffffff:ې:fffohb-*'-*'˽˽˼˼ohbffffffff::fff:ohb-*'-*'˽˼˼˼ohb::ې::f:ې::::ې::ې::::f::ff:::fې:::ې::::f::ffff:::ې::ې::fې:::f:ې:::::::f:::fې::ې:::f:fې::ېf:f::f:f::::::fff:::fې:::ې::ې::f::f::::::ې::ې:::::fې::::ې::ې:f:::::f:::::::::::f:f:::fېohb-*'-*'˼˼˼˼ohbf:::ې:::fې::ې::::ې::ې:::::fې::f::ې:ېf::::ې:::::fې:::fff۶:::ې:ې::ې::ېf:::::fې::ې:::::ff::ff:fې:f::::ې:ff:ې:::ff:f:f:fff:fff::::::ېf:::ېf::ې::fې:۶f::f:ې::::::::fff::::::ff:::::f::::ې:fې::::ff:ې::::ې::::ff:::fff:ff:돏Ŀohb-*'-*'˼˼˼˼ohbff۶::fې:::ې::::ې::ې::::fې:::::::ff۶::ې::::fې::::fې::ې::ې::ې::ff۶::fې:::ې:::::ې::ې:ff::ې:::fې::::::۶fff:۶:fې:fې::::::ې::ې::ې::ffff::::ې:::ېf::ې::::::::::ff:::ې:::::ff:fې::ې:::ې:::ېf:::ې::::ېf:::۶:fې:ې:uuuohb-*'-*'˼˼˼˼ohbff::ې::::ې::::ې::ې::::ې::::::::ff::ې::::ې::::::::ې::ې::ff::ې::::ې::::::۶:fې::۶:fېfff:::::ff::fff:ې::::::::::ې::ې::ې::ffff::::ې::ې::ې::ې::::::::ffff::::۶:fې::::ff::ff۶::::۶:fې::ff::ې::::::ې::::۶:fېsssohb-*'-*'˼˼˼˼ohbff::ff:::ff:ې:::ff:ff::::::f:ff۶:::ff:ff::f:ff::ې::f:ff۶::ff:::ff:::ېf:::ېf:۶fff:::f::ff::ff::ېf:f::::ff:ې::ې::ې::ffff::::ې::ff::ې::::::ې::ffff::::ېf:::::ff::ff۶:f::ېf:ې::ff۶::ې::::ې::f:::ېf:::ېf:{{{ohb-*'-*'˼˼˼˼ohbff::ې::ې::ff::ې::ff::::::::ې::ې::ff::::ې::ې::ې::::ې::ې::ې::ff:ې:fې::ې:fې::fې::f::fې::::::۶:f::::ې::ې::::ff:ff::::::f:fې::::ې::f۶f::ې::::::::::ff:::ې:fې:::::ff:fې::ې:::ې:fې::::ې:ff::ې::::ff::::ې:ې:fې:ohb-*'-*'˼˼˼˼ohb:fېff:fff::ې::f::::fېf::::fېfffffې::ې:fې::::ffې::f:fff:fff::::::::::f::::fې::ې:::::::::f:fېff::f::::fې:::::fېff:ې:fې:::f::::fېf::::fې:::::ې::::f::::ffff::::fېohb-*'-*'˼˼˼˼ohb:ې:::::::ff::ې::::::::fې:f:::ې:ې::fffffffff::ې::ې::ې:::::::ې:::::::ff::::f:::ې::::ff:::ې:ې::ې::f:::ff:::::ې:fff::ohb-*'-*'˼˼˼̽ohb::ې::ohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼̽̽;ohbohb-*'-*'̽̽;;ohb½½ohb-*'-*'̽̽;;ohbohb-*'-*'̽̽;οohbohb-*'-*'̽;;οohb``ohb-*'-*';;οohb``ohb-*'-*';;οohb66·`·6```666`·66``666`·66`6``6ohb-*'-*';οohb`666·`6666·6·`6`66·6·`66·66``6Ϋ`6`·66ohb-*'-*';οohb``66·66·66·66·6666``6666`6`666ohb-*'-*'οohb``6666·66·6666``6666`6Ϋ6666ohb-*'-*'οohb``66``66·6666`6``66``6Ϋ```66ohb-*'-*'ohb``6·666·6``6666666666`66ohb-*'-*'ohb6`·``666666ohb-*'-*'ohb6·6666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉ohbͿ̾-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿ̾-*'-*'ohb𕌉䏏ohbͿ̾;-*'-*'ohb𕌉uuuuuuohbͿ;;-*'-*'ohb𕌉ppp                     pppohbͿ̾;̽-*'-*'ohb𕌉ppp                        pppohbͿ̾̽̽-*'-*'ohb𕌉ppp               )          pppohb̾̽̽˼-*'-*'ohb𕌉ppp           )) * * * * * * *     pppohb;̽˼˼-*'-*'ohb𕌉ppp            * *((0((01-/1-/1-/1-/1-/1-/((0'#&     pppohb̽̽˼˼-*'-*'ohb𕌉ppp           * *((01-/738?;B?;BDBHDBHDBHDBHDBH?;B?;B7381-/1-/'#&   pppohb̽̽˼˼-*'-*'ohb𕌉ppp          * *((0*1:?;BDBHCHTTKQZSXZSXeVXeVXeVX`NOTKQYECR?=F76=/.2(''#&  pppohb̽˼˼ʻ-*'-*'ohb𕌉ppp        ) *((0*1:738DBHTKQZSXi\bZSXe`]e`]e`]e`]e`]e`]eVXTKQ`NOTKQR?=F761-/'#&  pppohb˼˼ʻʻ-*'-*'ohb𕌉ppp         *((0*1:?;BTKQZSXTYfe`]hegnonlqunonnonnonnonhege`]e`]DBHTKQ`NOYEC?;B=/.'#&   pppohb˼˼ʻʻ-*'-*'ohb𕌉ppp        *((0*1:?;BTKQeVXe`]hegheguwxuwxuwxuwxuwxuwxuwxe`]none`]ZSXeVXCHT738aKH?;B=/.'#& pppohb˼˼ʻʻ-*'-*'ohb𕌉ppp        *((0*1:?;BTKQi\be`]nonuwxuwxlqu{{{uwxnonheg?;BZSXeVXhegheg?;B((0((0`NOR?==/.'#& pppohb˼ʻʻʻ-*'-*'ohb𕌉ppp      ) **1:?;BTKQeVXe`]lquuwx{e`]?;BgguvgguhegTYfDBH*1:*1:ZSXCHT((0((0aKHR?=1-/(  pppohbʻʻʻʻ-*'-*'ohb𕌉ppp       *((0738DBHZSXe`]TYfnonhegTYf/CHTTYfJP\uwxJP\TYfgguCHTCHT?;BDBHnonnone`]738'#&YEC=/.2(' pppohbʻʻʻʻ-*'-*'ohb𕌉ppp     ) **1:?;BTKQeVXZSXuwxlquuwx  ?;B{KervlquTYfCHT*1:ZSX{e`]e`]e`]((0((0((0R?==/.(  pppohbʻʻʻʻ-*'-*'ohb𕌉ppp      *((0738DBHeVXZSXuwx{TYfDBH//CHT{TYfTYfnonCHTTKQZSXnonheg?;B738heg7381-/?;BaKHR?=F762('2(' pppohbʻʻʻʻ-*'-*'ohb𕌉ppp      **1:?;BTKQe`]{hegJP\gguSa//'#&oZZoZZoZZhQOhQOaKH܇sthQOܨaKHYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp     **1:DBHZSXnonuwxgguJP\p//JP\stxegoUQoZZhQOYEChQOaKHR?=aKHYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp    )((0738DBHi\bxegCHTlqu/ TYf{}nkxegoZZoUQoUQhQOhQOoUQxegoZZaKHYECaKHaKHoUQhQOYECaKH=/.uwxpppohbʻʻʻʻ-*'-*'ohb𕌉ppp     *((0738DBH}nkhegi\buwxJP\prZSXp/SavCHTCHTDBH?;BCHT?;B?;BZSXDBH738((01-/'#&'#&aKHF762(' pppohbʻʻʻʻ-*'-*'ohb𕌉ppp   *((01-/?;BDBHTKQxstlqu*1:'#&TYfJP\JP\JP\DBH?;B?;B?;BTKQDBH7381-/1-/1-/738TKQhQOF76F762('( pppohbʻʻʻʻ-*'-*'ohb𕌉ppp 1-/KerCHTCHTJP\TYfi\bststpTYf{hegheg*1:Saggu{gguKerJP\CHTi\beVXTKQeVXpJP\eVXDBHTKQhQOTYfSaoZZaKHJP\DBH*1:R?=1-/*1:YECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp  YEC`NOeVXLoZZpxegVSai\bxegstgguhegxjrhegi\bSai\bi\boZZeVXpeVXhQOe`]hQOoUQaKHaKHYECYECF76pppohbʻʻʻʻ-*'-*'ohb𕌉ppp  R?='`NO738eVXi\bxegxegxegxegsToLgguggu'i\bxegxeg/xjrTKQeVX'JP\oUQoZZF76oUQaKHYECF76pppohbʻʻʻʻ-*'-*'ohb𕌉ppp R?='`NO'#&?;BoZZ}nkstLxeggguNmpr{'xjrheg'st'oZZDBHTKQl/paKH2('oUQ'aKH'pYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp R?='`NO *738oZZ'}nke{'lqu{xjrexjrYR}nk'eVXDBH`NOYLY`NO2('oUQ'aKHLYEC2('pppohbʻʻʻʻ-*'-*'ohb𕌉pppR?='`NO ((0eVXest}nkxe}nklђprxjr{e{{LstqKereVXhQOe}nkhQO'hQOhQOoUQeYECYECYECpppohbʻʻʻʻ-*'-*'ohb𕌉ppp aKHeaKHF76'#&YECLstRlчststxjrъ{xjrst{LststLxegi\beeVX`NOQoUQeaKHaKHYECYECYEC=/.pppffffohbʻʻʻʻ-*'-*'ohb𕌉ppp2('aKHaKHaKHR?= ((0hQOoZZstst{ststxegxjr{stxegi\beVXZSXoZZi\bhQOR?=ZSXoZZaKHhQOR?=aKHYECYECYECYECYECR?=pppffffohbʻʻʻʻ-*'-*'ohb𕌉ppp 1-/R?=hQOɿÚuwxssgzpr?;BR?=DBH1-/1-/DBH aKHR?=2('ppp:f:ff:::ې::::fې::ffff:::::ې:::f:ff::::f:f::۶fې::f::fff:::::ې:::ې::f:f::::fff:::::ې::fې:::ohbʻʻʻ˼-*'-*'ohb𕌉ppp    ((0738R?=hQOȻɿ䶨ЌlquTYfTYfTYfgzBZNm?;B738YEC1-/2('2('aKHF762('  ppp::ff:۶f:fې::::ې::::f:ff:۶ff:::::ff::ff:۶f:fې::ې:::۶fff:۶fff:۶f::fې:ff:۶f::f:::::ff:f:::ېf:::ې:ff:۶f:::::fې:ې:f:::ې::ېf:ffohbʻʻ˼˼-*'-*'ohb𕌉ppp   2('738DBH`NO愆prU~prToTYfssgzTo1-/R?=?;BYECF761-/(  ppp::::f:f:::::ې::::::ې::f:::ې::::ې::::::f:f:::ې::f:۶::f:۶::f:۶:::f::f:::::ې::::ې::fffff۶ې:fې::f:۶::::ې::::ff۶::ې::ې::ohbʻʻ˼˼-*'-*'ohb𕌉ppp    2('F76R?=`NOllU~U~YECgzgzgzTKQZSXZSXYECF76=/.(  ppp::::f:۶::::::ې::::::ې::f:::ې:::::f::::f:۶::::ې::f:۶::f:۶::f:۶:f::f:::::ې:::::ff:f:f:f:::f:۶::::ې::::ff::ې::ې:fohbʻʻ˼˼-*'-*'ohb𕌉ppp   2('738R?=aKH擳撍sspr}nk`NOYECF76=/.(  ppp::ff:۶fff:::::ff:::۶ff:۶f::ې:ff:ff::::ff:۶fff::::ې:ې:ff:۶fff:۶f::f:ff:۶f::::ې:ff:ff:::ې:fې:fffff:۶f:f::ff::ff::ې::۶ff::ohbʻ˼˼˼-*'-*'ohb𕌉ppp  '#&1-/F76R?=YEC`NOȻɴݨxxxaKHYECF76=/.2('(  ppp:::f::::ې::ff:ې::f:ff:::ff::ې:::f::f:::f:ې:f:f::f:ې:ff::ff:::ff::ې:fېfffې:fې::f::ff۶::ې::ff:::ې:::ېohb˼˼˼˼-*'-*'ohb𕌉ppp  '#&2('=/.F76R?=R?=YECaKHaKHaKHaKHaKHYECR?=F76=/.2(''#&  ppp::::::ې::::::::f:::ې::ff::::f:::::::fېff::ohb˼˼˼˼-*'-*'ohb𕌉pppYECYEC2('YECYECYECYECYECYEC aKHF76aKHaKHhQOaKHhQOhQOaKHhQOhQOhQOR?==/.1-/2('(    ppp::::::::ې:::::::::fې::ې::::::ېff:::::ې:::ې::ohb˼˼˼˼-*'-*'ohb𕌉pppR?=YEC R?=YECYECYEC2('YECF76R?=}nkYECsthQOaKHaKHR?=(   ppp::::::ff::::::ohb˼˼˼˼-*'-*'ohb𕌉pppR?=YEC YECYECYEC=/.YECF76aKHF76aKHaKHaKH2('(   pppohb˼˼˼˼-*'-*'ohb𕌉pppYECR?=YECYECR?=YECYECYEC YECF76stF76stYECYEC pppohb˼˼˼˼-*'-*'ohb𕌉pppF76YECYECYECYECYECYECYECYECYECYEC2('YECYECYECYECYECYECYECYEC( pppohb˼˼˼˼-*'-*'ohb𕌉ppppppohb˼˼˼˼-*'-*'ohb𕌉ppppppohb˼˼˼˼-*'-*'ohb𕌉ppppppohb˼˼˼˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˼˽˽-*'-*'ohb𕌉ppppppohb˼˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉uuuuuuohb˽˽˽˽-*'-*'ohb𕌉葑ohb˽˽˽˽-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉ohb˽˽˽˽-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb˽˽˽˽-*'-*'ohb𕌉䏏ohb˽˽˽˽-*'-*'ohb𕌉uuuuuuohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉ppppppohb˽˽˽˽-*'-*'ohb𕌉pppTTT````````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUUUpppohb˽˽˽˽-*'-*'ohb𕌉pppSSSUUUpppohb˽˽˽˽-*'-*'ohb𕌉ppp]]]naaapppohb˽˽˽˽-*'-*'ohb𕌉ppp___TxE]6\ps___pppohb˽˽˽˽-*'-*'ohb𕌉pppaaa氽*Uk*21B*[tSv```pppohb˽˽˽˽-*'-*'ohb𕌉pppcccpCfxYdG)a}?iaaapppohb˽˽˽̾-*'-*'ohb𕌉pppeee8d{dވރ]XtX{aaapppohb˽˽̾̾-*'-*'ohb𕌉pppggg싢0hߝ"uNnDmaaapppohb˽˽̾̾-*'-*'ohb𕌉pppiiiBj~j["wQr2_vaaapppohb˽˽̾̾-*'-*'ohb𕌉pppkkk)]uׁR&"W{ Qk{aaapppohb˽̾̾̾-*'-*'ohb𕌉pppmmmWv,dgr\*!]Mha~aaapppohb̾̾̾̾-*'-*'ohb𕌉pppooo³e'\xare/" dKiMoaaapppohb̾̾̾̾-*'-*'ohb𕌉pppqqq扡(ZtVsk8"!mLkDkaaapppohb̾̾̾̾-*'-*'ohb𕌉pppsss윰1`xKrnA"!tQr6cyaaapppohb̾̾̾̾-*'-*'ohb𕌉pppttt3`v@~pqK#"|Ux&Voaaapppohb̾̾̾̾-*'-*'ohb𕌉pppwww黻ÿ:bv5qmsV&"\Ni}```pppohb̾̾̾̾-*'-*'ohb𕌉pppxxxÿJm+eir_+! bNkd```pppohb̾̾̾̾-*'-*'ohb𕌉pppzzz°^}&^{brf1"!jLkOt```pppohb̾̾̾̾-*'-*'ohb𕌉ppp|||&[vYrl:"!$q|Mx@^pppohb̾̾̾̾-*'-*'ohb𕌉ppp݀좳.\tAqqQk܉j  ?gpppohb̾̾̾̾-*'-*'ohb𕌉ppp݂ÿ5_t:u۔^~  :lpppohb̾̾̾̾-*'-*'ohb𕌉ppp݄¿Ch|Ltޝ9>  @]pppohb̾̾̾̾-*'-*'ohb𕌉ppp놆ÿ]~>h聁TT.. Aapppffff::ffohb̾̾̾̾-*'-*'ohb𕌉ppp눈v0]}円__884 A\pppffff::ffohb̾̾̾̾-*'-*'ohb𕌉ppp뉉务2_|uN^Csppp:f::::fff:::fې:::fff:::ې:::::::f::ې:f۶::::ې::ې::ې:::::f::fې:::f:ې::::ې::ې::::f:fff:::ې::::fff::::ff::::f::ې:ffff:::fff:::ې::ې::::f:ohb̾̾̾̾-*'-*'ohb𕌉ppp싋游覷KqKhC^ppp:fff۶::ff:::ې:ېf:ff:::ې:ې:::::ff:ې::ff::ې::::ې::ې::ff::۶ff:۶f::ېf:::::fې::ې::::ې::ې:::::fې:::::ې:ې:::::fې:ې:f::ې:ې::f:ې::ff:۶f:::ې::fې:ې:ې::ې:::::fې::ohb̾̾̾̾-*'-*'ohb𕌉ppp썍⁂ppp:fې::::::ې::ې::ې::::ې::ې:::::ې:::::ې::ې::::ې::ې::ې::::ې::f:۶::ff۶::fې:::ې::::ې::ې::::fې:::::ې::ې::::ې::::::::ې:::f::ې::f:۶::ې::ې::::ې::ې::::fې:::ohb̾̾̾̾-*'-*'ohb𕌉ppp쏏ppp:::::f::ې::ې:f::ې::::::۶:fې::ff::ې::::ې::ې:::f::ې::f:۶::ff::ې::::ې::::ې::ې::::ې::::::ې::::ې::::::::ې:::f::ې::f:::ې::::ې::ې::::ې::::ohb̾̾̾̾-*'-*'ohb𕌉ppp쑑pppf::fff::ff::۶ff::ff:ff:::ېf:ې::ff::ې:f::ې::ې::ff::::۶ff:۶f:ff:ff۶::ff:::ff:ې:::ff:ff::ff:ff:ff::::::::ېff۶::ff:۶fffff::ې:::ff:ff::ohb̾̾̾̾-*'-*'ohb𕌉ppp풒ppp::ې::ff::ې::ې:ې:::ې::ې::ff:ې:fې:::::ې::ې::f:ې::ې::ېf::f::ff::ې::ې::ې::ff::ې::ff::::ې::ff::::::f:::ff::ې:f::ې::ې::ې::ff::ohb̾̾̾̾-*'-*'ohb𕌉ppp픔ppp:fff::f::::fې:::f::ې::f:::f:::::::ohb̾̾̾̾-*'-*'ohb𕌉ppp햖pppff:::::f:f۶:f:fې::ې:::fې::::::::::ې::ohb̾̾̾̾-*'-*'ohb𕌉ppp࿿pppff::ff::::::ohb̾̾̾̾-*'-*'ohb𕌉ppp߾pppohb̾̾̾̾-*'-*'ohb𕌉ppp߿pppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉ppp𜜜텅pppohb̾̾̾̾-*'-*'ohb𕌉ppp𝝝톆pppohb̾̾̾̾-*'-*'ohb𕌉ppp𝝝톆pppohb̾̾̾̾-*'-*'ohb𕌉ppp񙙙ကpppohb̾̾̾̾-*'-*'ohb𕌉ppp񞞞pppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉ppppppohb̾̾̾̾-*'-*'ohb𕌉uuuuuuohb̾̾̾̾-*'-*'ohb𕌉葑ohb̾̾̾̾-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb̾̾̾Ϳ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉ohb̾ͿͿͿ-*'-*'ohb𕌉ohbͿͿͿͿ-*'-*'ohb𕌉ohbͿͿͿͿ-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohbͿͿͿͿ-*'-*'ohb𕌉䏏ohbͿͿͿͿ-*'-*'ohb𕌉uuuuuuohbͿͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉pppҎpppohbͿͿͿͿ-*'-*'ohb𕌉pppҐyyypppohbͿͿͿͿ-*'-*'ohb𕌉pppxxxxxxxxxxxxxxxxxxxxxpppohbͿͿͿͿ-*'-*'ohb𕌉pppԈxxxxxx000---555CCCxxxpppohbͿͿͿͿ-*'-*'ohb𕌉pppԃxxxxxxJJJJJJxxxpppohbͿͿͿο-*'-*'ohb𕌉pppԓxxxxxxJJJJJJxxxpppohbͿͿοο-*'-*'ohb𕌉ppp֖¼xxxxxxJJJJJJxxxpppohbͿͿοο-*'-*'ohb𕌉ppp֖Ч˸xxxxxxJJJJJJxxxpppohbͿͿοο-*'-*'ohb𕌉ppp֖٣ʱxxxxxxJJJJJJxxxpppohbͿοοο-*'-*'ohb𕌉ppp֖ܿ«xxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppؖݦʻxxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppؖޛɞxxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppؖߝҟxxxxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږ௯לyyyxxxJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږԠʫʓyyyyyyJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږӳ󛛛zzzyyyJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppږ῿zzzzzzJJJJJJxxxpppohbοοοο-*'-*'ohb𕌉pppۖ⽽{{{zzzKKKKKKxxxpppohbοοοο-*'-*'ohb𕌉pppۖNo||||{{{KKKKKKyyypppohbοοοο-*'-*'ohb𕌉pppۖRw&V%S||||||LLLKKKyyypppohbοοοο-*'-*'ohb𕌉pppݖά2_rŐJq=_||||||LLLLLLzzzpppohbοοο-*'-*'ohb𕌉pppݖ&V^@jiŠ3_bt}}}|||LLLLLLzzzpppohbοο-*'-*'ohb𕌉pppݖ;eJrQwD0]d$T~}}}}}}MMMLLLzzzpppohbοο-*'-*'ohb𕌉pppݖxÕ:ehɊIDDMtNu5_~~~}}}))))))JJJMMM{{{pppohbο-*'-*'ohb𕌉ppp떖+Yn͎)XCDDIeŇ8dg~~~~~~111///111BBB|||pppffff::ffohbο-*'-*'ohb𕌉ppp덗*Y_ȂHqCCCCD)Ykȋ'V~~~~~~~~~}}}}}}|||pppffff::ffohb-*'-*'ohb𕌉ppp>>;;;???\\\pppohb-*'-*'ohb𕌉pppDOO? ? ? ?8d{{{JJJ;;;GGGpppohb-*'-*'ohb𕌉pppK @<<<<<<<<EDn>>??8d~ޜMpppohb-*'-*'ohb𕌉pppNF99999999 ?MM~Cm>>>H2_𜜜pppohb-*'-*'ohb𕌉pppNN 844444445L;f @=> A`̓N𛛛pppohb-*'-*'ohb𕌉pppNL 4...... 3M2_== B}ޙOpppohb-*'-*'ohb𕌉pppLM1^:++++ 5Lx==NߜOpppohb-*'-*'ohb𕌉pppdʆܰ%S@?F/\쭕 A B_c΅Mpppohb-*'-*'ohb𕌉pppMqΐˁ㝛p3`p̑4aNpppohb-*'-*'ohb𕌉ppp+[ަխvٔ8dNpppohb-*'-*'ohb𕌉pppLL Q(X)XPMpppohb-*'-*'ohb𕌉uuuuuuohb-*'-*'ohb𕌉葑ohb-*'-*'ohb𕌉wwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ãS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=????????????????????????????????????????????????????????????????????????[>Uohb-*'-*'ohb𕌉<>!!!>= """?$?GIHFDHMP R T V W S T UTPI@"?>EL T\ Ja'f+j.m0o1u7splgb] Z VN@>DL V_gVj1q5v9y;z<~A"{upic] Y T&&&@ D H J JO3-%zrib\ V ^9@̜4(r>QΥ;ŕ,!{q`***AjBpHa _i s }&.6+Σ'ӬJ׶dܿ{ȍЛצݫkմۛՉsܼ[ҬBǜ<\]+kE---B` zSyR[e o z%/ū9ʱAOʢҫ;׵ZܽrƅΕՠڨެߧܟؑh׵OͥCǝayEnGnFBc;iBkDpHxQZe p |(è4ʱ@йKԿT]eg`ŕ4ڻJܽgẏѐԖ֗֔Ӌmٺ]ԱmęA~g |U{SBxRvP{T^j u".Ȯ:ζFӽQ[dlrt|̤_cmx}zrqܿ|̪ŲJ2q `}XF<ffff::ffohb-*'-*'ohb𕌉!r ` F<::ې::f:ې::::fff:::::ې:ff:fff:::ې::::fff::::ff::::f::ې:ffff:::fff:::::fې:fff::::ff:::fې::f::ې::ې::fff:::fff:::ې:ffff:::ې::ې::::ېfې::f:f:f:::ې::fohb-*'-*'ohb𕌉Ϸ@ҼHQX_cfgfc_YRҽHՇqӾ[ȱL-*'-*'AljkVVEV; MP֤QMاQ~‚οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾ͿͿ̾̾̾;;̽̾̾ͿͿ̾̾ͿZVR¶¶¶÷~qlfVShXUhXUhXUhXUhXUhXUhXUhXUhXU~qløĸĹĹøĸunjŹŹŹŹŹźyfVSfVSfVSfVSfVSfVSfVSfVSfVSfVSzƻƻƺƺƺƺ%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD]WYhXUhXUhXUWYD]D]D]D]D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'8HxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvwyyyyʮ'-J-*'-*'cV7<8. 13οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾ͿͿͿͿ[WS℁~fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk||||||||||}}}ͱ*0L-*'-*'  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿοͿͿͿ[WS冃fVSiYVFO䄌τфӄӄփ׃كۃރ߃ₐゐ悐灐灐遐omhYVfVShYVom遏邏炏悏わハ჎߄݄ۄلׅօӅӅѵ.3N-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿͿ[WSꊇfVSiYVOX萙אِِؐݐݐᐚ䐚君珛鏛돛쎛펛펛fVSfVSurfVSfVS펚폚폚돚鏚萚呛呛㑛ᑛߑݑّّܑؼ49Q-*' οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ[WS댉䜒fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST^阠٘ۘݘݘᘢ㘢嘢嘣阣阣엣헣yvfWUfWUfWUyuyufWUfWUfWUyu혢혢뙣陣虣噣噣㙢ᙢߙݙݙ8=S᠞+*)A/.,*οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ[WSZb렦ݠݠࠦᠨ㠨䠨堩蟪韪럪ퟪퟫ젪頪顩衩塩䡧㡧ᡧࡧ;@U.,*GECC0.+(οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾Ϳ[WS_f᦬᦬᦬㦭夭央褮餮뤯쥮륮饮祮姭䧭㧭᧭?BV衟-*'b`](,οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾[WT`iᬱᬲ䬳嬳嬴謴髴骳荒הּ쬴鬳鬳笳嬳嬲䬱?DY렝b`]{xua@=4$ .+(.,*cbadmBFZ/-+.+(c`^{xuuTTR73% -*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'\ZWmjg{tqsl-2.8.1/apps/help/tqslapp/stnloc.bmp0000644000175000017500000143765615003421124020102 0ustar rmurphyrmurphyBM?6(x?```RRR/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)BBBOOOiiivvvbbb/,)1/-󢟝1/-/,)KKKiiivvvbbbοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ碟KKKkkkkkk-*'οοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾̾ޢ-*'RRR0.,οοοοοοοͿͿͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳ.,*EEE///οοοοοοοοͿͿͿͿͿͿͿ̾ͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾Ϳӡ///-*'-*'-*'㥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbүohb-*'-*'ohb𯯯㯯𸵰ohb-*'-*'ohb𯯯𹶱ohb-*'-*'ohb𯯯𶳮򶳮ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯𵲭⃃Ъ􃃪⾗ohb-*'-*'ohb𯯯𵲭⾗􃃪⾗⃪⾗ohb-*'-*'ohb𯯯𵲭⾗Ъohb-*'-*'ohb𯯯𵲭Ѓohb-*'-*'ohb𯯯𵲭о⪃ohb-*'-*'ohb𯯯𵲭⾗ohb-*'-*'ohb𯯯𵲭⾗􃃪⾗ohb-*'-*'ohb𯯯𵲭⃃⾗ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯𵲭ohb-*'-*'ohb𯯯㯯𶳮򶳮ohb-*'-*'ohbү𸵱ohb-*'-*'ohb𾻷ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb䏏ohb-*'-*'ohbuuuuuuohb-*'-*'ohb66·66·66·66·6``·666```66666·`·6```666```666·6`66666`6`6````666```666·6`6666ppppppohb-*'-*'ohb`666``66``6``6``6`·6·6`666·`6666·6·`666``6Ϋ`666666``6Ϋ`6`666·6·`666``6Ϋ`6666ppppppohb-*'-*'ohb``Ϋ6666·666666·666666``66·66·66·66·66·66`6Ϋ66666666`6Ϋ6666·66·66·66·66`6Ϋ6666ppppppohb-*'-*'ohb``6`Ϋ666`Ϋ6666·6`Ϋ6666``6666·66·66·66`6Ϋ66666666`6Ϋ6666·66·66·66`6Ϋ6666ppp1yVVVV1y11yy11ָyy11ָy1֙Vy1y1yy11ָpppohb-*'-*'ohb````66·66``666`66Ϋ``66``66``66``66·66``6Ϋ`6``666``6Ϋ`6```66·66``6Ϋ`6``6ppp1zWؚWWzz11ع1zz1zz11عzz11ع1zؚWؚWؚWzz11عpppohb-*'-*'ohb``66·66·66·`Ϋ`6·666·66``6·666·6``666·6`66``666```66·6``666·6`66``pppڜ1Wڻ{{11ڻ{{{11{{11ڻ{{11{{11ڻ{{11ڻ{{11ڻpppohb-*'-*'ohb6`·``6666666`·``66666666ppp{{11ۼ{1{1{{11ۼ{{11{{11ۼ{1X{{11ۼpppohb-*'-*'ohb6·66666666·66666·666666·66ppp}Y2ݝYݝY}2ݝYY}2ݾ2}ݝYݝYYݝ}}22}}22ݾpppohb-*'-*'ohb6666ppp55Ʉ55Ʉ55^^^^55Ʉ55pppohb-*'-*'ohbppp5^^^55pppohb-*'-*'ohbppp__55pppohb-*'-*'ohbppp55pppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbppppppohb-*'-*'ohbuuuuuuohb-*'-*'ohb葑ohb-*'-*'ohb𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb䏏ohb-*'-*'ohbuuuuuuohb-*'-*'ohbppppppohb-*'-*'ohbpppvv00Ҵpppohb-*'-*'ohb𐇂pppww00Զpppohb-*'-*'ohb𐇂pppyy11ָyy11ָy1y1yy11y1V֙pppohb-*'-*'ohb𐇂pppzz11عzz11عWؚWzz11zz11عWz1عpppohb-*'-*'ohb𐇂ppp{{11ڻ{{11{{11ڻ{{11{{11ڻڜ1Wڻ{pppohb-*'-*'ohb𐇂ppp{{11ۼ{{11{1X{{11{{11ۼۜ1Xۼ{pppohb-*'-*'ohb𐇂ppp}2}2ݾYYݝ}}22}}22}22ݾ}YYݝpppohb-*'-*'ohb𐇂ppp5555Ʉ55Ʉ55^555^^pppohb-*'-*'ohb𐇂꿿ꪪppp555555pppohb-*'-*'ohb𐇂ꧧꗗppp555555pppohb-*'-*'ohb𐇂꒒ꂂppp55pppohb-*'-*'ohb𐇂{{{xxxppppppohb-*'-*'ohb𐇂sssvvvppppppohb-*'-*'ohb𐇂uuuvvvppppppohb-*'-*'ohb𐇂ꏏ|||uuuuuuohb-*'-*'ohb𐇂葑ohb-*'-*'ohb𐇂𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂뺺ohb-*'-*'ohb𐇂랞ohb-*'-*'ohb𐇂뎎ohb-*'-*'ohb𐇂|||vvvvvvxxxohbͿ-*'-*'ohb𐇂ohbο-*'-*'ohb𐇂ohbͿο-*'-*'ohb𐇂ohbͿͿ;-*'-*'ohb𐇂ohbͿ;;-*'-*'ohb𐇂ohbο;̽-*'-*'ohb𐇂ohbͿ;;̽-*'-*'ohb𐇂ohbͿ;;̽-*'-*'ohb𐇂ohb;;̽̽-*'-*'ohb𐇂ohb;̽̽ʻ-*'-*'ohb𐇂ohb;̽˼ʻ-*'-*'ohb𐇂ohb;˼˼ʻ-*'-*'ohb𐇂ohb̽˼ʻʻ-*'-*'ohb𐇂ohb˼ʻʻʻ-*'-*'ohb𐇂ohb˼ʻʻ˼-*'-*'ohb𐇂ohb˼ʻ˼˼-*'-*'ohb𐇂ohbʻ˼˼˽-*'-*'ohb𐇂ohbʻ˼˽˽-*'-*'ohb𐇂ohb˼˽˽˼-*'-*'ohb𐇂ohb˼˽˼˼-*'-*'ohb𐇂ohb˽˼˼̽-*'-*'ohb𐇂ohb˽˼˼̽-*'-*'ohb𐇂ohb˼˼̽̽-*'-*'ohb𐇂ohb˼̽̽˽-*'-*'ohb𐇂ohb̽̽˽˽-*'-*'ohb𐇂ohb̽̽˽̾-*'-*'ohb𐇂ohb̽˽̾;-*'-*'ohb𐇂ohb˽˽;̽-*'-*'ohb𐇂ohb˽̾̽̾-*'-*'ohb𐇂ohb̾;̾Ϳ-*'-*'ohb𐇂ohb;̾ͿͿ-*'-*'ohb𐇂ohb̽̾Ϳο-*'-*'ohb𐇂ohb̾ͿͿ-*'-*'ohb𐇂ohbͿ̾-*'-*'ohb𐇂ohb̾Ϳ-*'-*'ohb𐇂ohbͿ-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂fff:ېffohb-*'-*'ohb𐇂ff::f:ohb-*'-*'ohb𐇂ff:::ې::::f:::fې::ې:::f::::ې::::ې::::ې::::ېfې::f::fff:::ې:f::::ohb-*'-*'ohb𐇂ff::ې:::ff::ff:fې:f::::ې:ff::::ې::::ې::::ff:ې:ېf::ې::f:ff:::ې::f::::ohb-*'-*'ohb𐇂:ff:::::ې:ې::ې:ff::ې:::fې::::::ې::::ې::::ې::ffffff::ff۶::::ې::ې::::::ohb-*'-*'ohb𐇂fff:::ff::۶:fې::۶:fېfff:::::ff:ې:::ې::ې::::ې:::::fffffff:::::f::ې::::::ohb-*'-*'ohb𐇂ffff:ې:::ff::ېf:::ېf:۶fff:::f::ff:::ې:ې:::ff::ff:ff::fffff:ff::ېff::ff:f:ff:ohb-*'-*'ohb𐇂:ې:fې::ې:::ff:ې:fې::ې:fې::fې::f::fې::::ff۶::ې::ff::ff::ې:f:fې::::ff::ې::ېff::ffohb-*'-*'ohb𐇂::ې::fff::::fېf::::fېf::::fېfffffې::ې:fې:::f:::::::ohb-*'-*'ohb𐇂::::ېf::ې:::::fې:f:::ې:ې::f:::f::ohb-*'-*'ohb𐇂::::ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂𸵰ohb-*'-*'ohb𐇂𹶱ohb-*'-*'ohb𐇂::f:::ې:::f:ې::f:ffې::::f::fې::ffې:::f:::ې:::f:ې:𶳮򶳮ohb-*'-*'ohb𐇂::f:fې:f:::::f::ې:::::ff:۶fېf::ې:ff:ې::ېf:ff:۶fېf::ې::f:fې:f:::::f::ې:::𵲭ohb-*'-*'ohb𐇂:::ېf::ff::ې::::ff:fې::::::f:ff:ې:::ې::ې::f:ff:::ېf::ff::ې::::ff:fې::𵲭ohb-*'-*'ohb𐇂::ې::ې::fff:::::::ې:::::ې:::::f:ff::۶:fې::ې::ې::f:ff:ff:::ې::ې::fff:::::::ې::::𵲭ohb-*'-*'ohb𐇂::ff::fff:::f::ې::::ff:۶ff:ff::ېf:ې::ې::۶ff:۶ff:ff::ff::fff:::f::ې::𵲭􃃗􃃗⾗􃃗Ѓ⾗􃃗ohb-*'-*'ohb𐇂::f۶f:::fې::f:::ff:fې:::f:::ې:fې::::ې::f::::f۶f:::fې::f:::ff:fې𵲭􃃪Ъ􃃪Ъ⃃Ъ􃃪Ъohb-*'-*'ohb𐇂f::::fې::fffffې::::::ې:f::f::::fې::ې::f::::fې::fffffې::::::ې:f𵲭⾗⾗ohb-*'-*'ohb𐇂:ې:::fې:f::::f:ې:::::::ې:::ې:::fې:f::::f:ې:𵲭Ѓо⃃о􃃗ohb-*'-*'ohb𐇂::𵲭Ъ⾗⪃ohb-*'-*'ohb𐇂𵲭􃃗⾾􃃗􃗾⾗􃃗ohb-*'-*'ohb𐇂𵲭􃃗Ъohb-*'-*'ohb𐇂𵲭􃃗Ъohb-*'-*'ohb𐇂𵲭ohb-*'-*'ohb𐇂::fې::f::ې:f:ې:ff:f:ffې::::f::fې::ffې:::fې::f::ې:f:ې:ff𵲭ohb-*'-*'ohb𐇂:::ې::ffffې:f::::ې:::fې:::ff:۶fېf::ې:ff:ې::ېf:ff:۶fېf::ې:::ې::ffffې:f::::ې:::fې:𵲭ohb-*'-*'ohb𐇂:::۶f:fېff::ې::۶:fې::۶:fې::::f:ff:ې:::ې::ې::f:ff:::۶f:fېff::ې::۶:fې::۶:fې𵲭ohb-*'-*'ohb𐇂::f:::fff:::ې::::f::ې:::::f:ff::۶:fې::ې::ې::f:ff:ff:::f:::fff:::ې::::f:𶳮򶳮ohb-*'-*'ohb𐇂:::::ېf:ff::ې::fې:::ff:۶ff:ff::ېf:ې::ې::۶ff:۶ff:ff:::::ېf:ff::ې::fې:𸵱ohb-*'-*'ohb𐇂::::ې::ې:fې::۶:fې:fې:::f:::ې:fې::::ې::f::::::ې::ې:fې::۶:fې:fې𾻷ohb-*'-*'ohb𐇂::ې::ې:fffff:::ې:ff:::f::::fې::ې::::ې::ې:fffff:::ې:ff:ohb-*'-*'ohb𐇂::fffffې::f:ې:::ې::::::ې::::fffffې::f:ې:::ېohb-*'-*'ohb𐇂::ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂f:ېfff:ېohb-*'-*'ohb𐇂::f:::ohb-*'-*'ohb𐇂:::f:::fې::ې:::f:ې::ffff:::::ې::fff:::ې::::fff::::::f:::fې::ې:::fohb-*'-*'ohb𐇂:ff::ff:fې:f::::ې:ff:f:::ېf:::ې::::ې::ې:::ې:::ې:ې:::::fې:ې::ff::ff:fې:f::::ې:ff𸵰ohb-*'-*'ohb𐇂:ې::ې:ff::ې:::fې::fffff۶ې:fې::ې::ffff::::ې::ې::::ې:::::ې::ې:ff::ې:::fې::𹶱ohb-*'-*'ohb𐇂::۶:fې::۶:fېfff:::::ff:ې:f:f:f:f:::۶ffff::ې::ې::::ې:::::ې:::۶:fې::۶:fېfff:::::ff𶳮򶳮ohb-*'-*'ohb𐇂::ېf:::ېf:۶fff:::f::ff:ې:fې:fffffffff::ff:ff:ff::::ېf:::ېf:۶fff:::f::ff𵲭ohb-*'-*'ohb𐇂:ې:fې::ې:fې::fې::f::fې:::fېfffې:fې:::ې:f:f::::ې::ff:::ې:fې::ې:fې::fې::f::fې::𵲭ohb-*'-*'ohb𐇂f::::fېf::::fېfffffې::ې:fې:ff::::f::::::f::::fېf::::fېfffffې::ې:fې:𵲭ohb-*'-*'ohb𐇂::::fې:f:::ې:ې:::::ېff::::::::fې:f:::ې:ې:𵲭􃃗⾪􃃃⾗Ѓ⾗ohb-*'-*'ohb𐇂::::𵲭⾗⾗ohb-*'-*'ohb𐇂𵲭⾗ohb-*'-*'ohb𐇂𵲭⾗ohb-*'-*'ohb𐇂f:ېf:ې𵲭􃃗⃃Ъ⾗ohb-*'-*'ohb𐇂::::𵲭􃃗⾗⃗⾗ohb-*'-*'ohb𐇂:::f:::fې::ې:::f:f:ffې::::f::fې::ffې::::f:::fې::ې:::f𵲭ohb-*'-*'ohb𐇂:ff::ff:fې:f::::ې:ff::ff:۶fېf::ې:ff:ې::ېf:ff:۶fېf::ې:ff::ff:fې:f::::ې:ff𵲭􃃗⾗ohb-*'-*'ohb𐇂:ې::ې:ff::ې:::fې::::::f:ff:ې:::ې::ې::f:ff:ې::ې:ff::ې:::fې::𵲭ohb-*'-*'ohb𐇂::۶:fې::۶:fېfff:::::ff:ې:::::f:ff::۶:fې::ې::ې::f:ff:ې:::۶:fې::۶:fېfff:::::ff𵲭ohb-*'-*'ohb𐇂::ېf:::ېf:۶fff:::f::ff::ff:۶ff:ff::ېf:ې::ې::۶ff:۶ff:ff::ېf:::ېf:۶fff:::f::ff𵲭ohb-*'-*'ohb𐇂:ې:fې::ې:fې::fې::f::fې:::::f:::ې:fې::::ې::f:::ې:fې::ې:fې::fې::f::fې::𵲭ohb-*'-*'ohb𐇂f::::fېf::::fېfffffې::ې:fې:::f::::fې::ې::f::::fېf::::fېfffffې::ې:fې:𶳮򶳮ohb-*'-*'ohb𐇂::::fې:f:::ې:ې:::::::ې::::::fې:f:::ې:ې:𸵱ohb-*'-*'ohb𐇂::𾻷ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂ohb-*'-*'ohb𐇂f:ېf:ېohb-*'-*'ohb𐇂::::ohb-*'-*'ohb𐇂:::f:::fې::ې:::f:f:ffې::::f::fې::ffې:::::ې::ې::ې::fې::::f:::fې::ې:::fohb-*'-*'ohb𐇂:ff::ff:fې:f::::ې:ff::ff:۶fېf::ې:ff:ې::ېf:ff:۶fېf::ې::::ې::ې::ې::ېf::ې:ff::ff:fې:f::::ې:ffohb-*'-*'ohb𐇂:ې::ې:ff::ې:::fې::::::f:ff:ې:::ې::ې::f:ff::::ې::ې::ې::ff:ې::ې:ff::ې:::fې::ohb-*'-*'ohb𐇂::۶:fې::۶:fېfff:::::ff:ې:::::f:ff::۶:fې::ې::ې::f:ff::::ې::ې::ې::ff:ې:::۶:fې::۶:fېfff:::::ffohb-*'-*'ohb𐇂::ېf:::ېf:۶fff:::f::ff::ff:۶ff:ff::ېf:ې::ې::۶ff:۶ff:ff::ې::ې::ې::f:ff::ېf:::ېf:۶fff:::f::ffuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb-*'-*'ohb𐇂:ې:fې::ې:fې::fې::f::fې:::::f:::ې:fې::::ې::f::::::ې::ې::ې:::::ې:fې::ې:fې::fې::f::fې::䏏ohb-*'-*'ohb𐇂f::::fېf::::fېfffffې::ې:fې:::f::::fې::ې::::::::ې::f::::fېf::::fېfffffې::ې:fې:uuuuuuohb-*'-*'ohb𐇂::::fې:f:::ې:ې:::::::ې::::::ې::ې::ې::::::fې:f:::ې:ې:ppppppohb-*'-*'ohb𐇂::::ې::ppppppohb-*'-*'ohb𐇂ppppppohb-*'-*'ohb𐇂pppyy11ָVy1ָy1y1ָ1VָyVy1ָyV1֙yV1֙yV1֙pppohb-*'-*'ohb𐇂pppzz11عؚWz1عWؚWz11Wz1WzWWWعzzW1ؚzW1ؚzW1ؚpppohb-*'-*'ohb𐇂ppp{{11ڻ1{{{W{11{{11ڻ1{W{1WڻW1{WڜWpppohb-*'-*'ohb𐇂::ې::fې:::::ې::::::ې:f::ې::fې::f:fېf:ې::::돏Ŀppp{{11ۼ{{11{{11{1Xۜ1Xۼ{XX{X1{ۜX1pppohb-*'-*'ohb𐇂fff:۶:::ې:::ff::::::ff:۶f::fff:ff:۶f::fې:ffffې::::uuuppp}}22ݾYݝY}}22ݾYYݝ}}22ݾYYݝ2}YYYݝY}2Yݾpppohb-*'-*'ohb𐇂::::::::ې::ېf:::::::ې::f:۶::ې::::ې::f::۶f:ff:ff::::sssppp55^ɨ^55Ʉ55Ʉ55Ʉ^5^5pppohb-*'-*'ohb𐇂ff:f:::f۶:::::ې:::::ې::f:۶:::f::ې::f::fېff۶f:f:::::{{{ppp^5555^ʄ55pppohb-*'-*'ohb𐇂f:ې:::ې::fې::::f:f:::f::ff:۶f::ff::ې::۶ff:۶fff:ffff:f:ff:ppp5̅555pppohb-*'-*'ohb𐇂::ې::ې::ffffff۶::ff::f:::::ې:f::ې::ې:ې::f::ېf:f:۶::ffppppppohb-*'-*'ohb𐇂::ېf:ې::f::ff:ې::f:fffې:::::::::ppppppohb-*'-*'ohb𐇂::ې:fff::ېf:::ې::::::::ppppppohb-*'-*'ohb𐇂::ppppppohb-*'-*'ohb𐇂uuuuuuohb-*'-*'ohb𐇂葑ohb-*'-*'ohb𐇂𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𐇂ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'멦rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺʼ˽̾ͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹȺɻʼ˽̾ͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺɻɻʼ˽̾Ϳ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺɻɻɻɻʼ˽̾ͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺɻɻɻɻʼʼ˽̾Ϳ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹȺȺɻɻɻɻʼʼ˽̾ͿͿ-*'-*'֢GLvοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹȺȺȺȺȺɻɻɻɻʼʼ˽̾Ϳ-*'-*'ުKzۅM̙οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹȺȺȺȺȺȺȺɻɻɻɻʼ˽̾ͿͿ-*'-*'N{֡FοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹȺȺȺȺȺȺȺȺɻɻɻɻʼʼ˽̾ͿW_*4f (P (P")Q#*S$+T%-U%-V'.W(/X)0Y)1Z)1[)1[)1])1])2])1])1])2])1])1])1[)1\)1])1])1])1[)1[)1Z)0Y(/X'.W%-V%-U$+T#*S")Q (P (P*4fW`-*'-*' ULӢ VإH { ~UإJSMԢVKMSԢW٦JNSբNSգVLSLQڧJSҪKQNբSѫKSЫK|PNҟRͪKÀ߫L}ÀQ˩KQ˪KāކLLz֡GοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹȺȺȺȺȺȺȺȺɻɻɻɻʼʼ˽̾ͿͿ(,Mx|̴୵୵୵㭵䭷䫸竹諹諹꫹뫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쬺쬺쬺쬺쬺묺꫹諹諸筷䭵䭵㭵୵೹ୱy})-N-*'-*'} JVJ XLԢTإHKTӢ~ Jϋ}VMԢ}MSԢ~T~NTգNT֣VۧJXN֤NפTN֤RLъSҬLT҅TҫLSѫL}QͅRͫL⇿ÀKÀÀQÀQ˩KQ˩KÀÀĂJ٥IաGοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹȺȺȺȺȺȺȺȺȺɻɻɻɻʼʼ˽̾̾VZ~tp~p~pppooonnlllllllllllllllllnnooopppp~p~t~ǞӄW[-*'-*' ּKTӢ VإHWԨJKTӡ 뻋U€MSԢ}MSӢÀāNSգNTբVڧJUڧJRƨJRۨJOSӫLщSҫL~~SѫLSѪK}|}RͪKᇿNLџQ˩KQ˩KÀÁN֡GοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺɻȺȺȺȺȺȺȺȺȺȺȺȺɻɻɻɻʼʼ˽̾Ϳ &Npzdqdqcrcrcrbtbvbvbv`x`x`y`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`y`x`xbvbvbvbtcrcrcrdqdqpz &O-*'-*' ٥HU٦I VJXJKTԢ ئHMԢ~MSԢāŁNT֤NTפVܨKVܨKRǨJRܨKLҊSӫL~TӫLSҫL}}}RΫLإIĀNLџÀQ˪KQ̪KÀĀłM֡GοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺɻɻȺȺȺȺȺȺȺȺȺȺȺɻɻɻȺɻɻ˽̾̾>XfTbTbTdTeTeSfSfSfShRiRiPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjRiRiShSfSfSfTeTeTdTbTbXf>-*'-*'V{V٦I | XԩJ ~U|KUԢV{MԢ~NTգNգTTLXՅVܨKXՅNץTԅLҊTԬLLSӅTܨJRƂ~KRυR٦IO}ÀOÀLĀQؤHOÀÀ|ۧK}ڥJކ֡GοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺɻɻɻȺȺȺȺȺȺȺȺȺȺɻɻɻȺɻɻʼ̾̾Ϳ;HVHVHVHVGVGVFXDYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'VJ ~ T{T~VJץJ€KMSԢW٦JNTTۧJVۧJSۨJSҪLQNգS҆LPNԢKPNҠR΅KN~OKÀ~MMJQ˅KM}MОÀ}JOLI֡GοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺɻɻɻȺȺȺȺȺȺȺȺȺȺȺȺǹȺȺɻɻ˽̾̾ 9Defining, Modifying, or Deleting a Station Location

Defining, Modifying, or Deleting a Station Location

A Station Location specifies an operating location and, optionally, a Callsign Certificate; it contains information you'd typically include on your QSL card.

If when submitting QSOs to LoTW you select a Station Location that specifies a Callsign Certificate, TQSL will submit your QSOs with that Station Location and Callsign Certificate.

If when submitting QSOs to LoTW you select a Station Location that doesn't specify a Callsign Certificate (it's Call Sign is set to [None]),
if you have exactly one Callsign Certificate whose DXCC entity matches the DXCC entity in the selected Station Location, TQSL will submit your QSOs with that Station Location and Callsign Certificate
if you have more than one Callsign Certificate whose DXCC entity matches the DXCC entity in the selected Station Location, TQSL will prompt you to select the Callsign Certificate with which to submit your QSOs

Defining a New Station Location
1.In TQSL, select the Station Locations tab and click the Create a new Station Location button; the Add Station Location dialog will appear.
  

2.In the Add Station Location dialog, specify your callsign, grid square, ITU zone, CQ zone, and IOTA Reference Number
  
The example above shows this for a station in the United States:
   2.aeither set the Call Sign box to the callsign to be associated with this Station Location, or leave the Call Sign box set to [None] box
   2.bspecify the Grid Square in which your station is located (this is particularly important if you operate on VHF or UHF frequencies or via Satellites, as it provides Grid Square credit to your QSO partners pursuing VUCC awards)
   2.cspecify the ITU Zone in which your station is located
   2.dspecify the CQ Zone in which your station is located
   2.eif your station is located on an island, specify its IOTA Reference Number; use a two-character continent abbreviation followed by a dash and a 3 digit number, e.g. OC-005. If you do not know your IOTA designation, you can find this information at http://www.iota-world.org
   2.fIf appropriate for your DXCC entity, additional fields will appear on the Station Location page, such as US State, County, Province, or Oblast. Filling these fields will cause the ITU Zone and CQ Zone to change to allow only appropriate zone values for that subdivision.
   3.ain the Add Station Location dialog, select your US State (this is particularly important as it provides US State credit to your QSO partners pursuing WAS awards)
   3.bselect your US County
   3.cif you are participating as an activator in the ARRL's National Parks On The Air (NPOTA) event, select the Park in which you're operating so your QSO partners will receive NPOTA credit; if you are operating from a location within several Parks, choose the Park selector entry that specifies those Parks joined by + characters, e.g. Appalachian Trail + Shenandoah
   3.dclick the Next button
    Note: If you specify a Grid Square that is inconsistent with your location, the Grid is not correct for your QTH message will appear; if you are certain that the specified Grid Square is correct, click the Next button.

4.In the Add Station Location dialog, specify a Station Location Name.
  
   4.ato make this name meaningful, it is recommended that it incorporate both your callsign and town name, or callsign and location name (see Additional Information below)
   4.bclick the Finish button
5.To protect your new Station Location, direct TQSL to create a Backup File.
6.If you have TQSL installed on multiple computers, then perform the following steps on each such computer:
   6.aObtain a copy of the Backup File you created in step 5 (via your home network, or by using a thumb drive)
   6.bStart TQSL, and direct it to Restore from the backup file you obtained in step 6.a; this will update all Callsign Certificates, Station Locations, and Preferences on this computer to match those on the computer you used to define the Station Location in step 1.

Modifying an Existing Station Location

TQSL will not permit you to modify a Station Location whose Callsign Certificate has been deleted; more information is available here.

To modify a Station Location,
1.In TQSL, select the Station Locations tab, which lists your Station Locations:
  
2.On the Stations Locations tab, click on the name of the Station Location you wish to modify:
  
  and then click the Edit Station Location button; the Edit Station Location dialog will appear.
3.In the Edit Station Location dialog, select a different callsign, or modify the grid square, ITU zone, CQ zone, or IOTA tag as desired.
4.If your station is in a DXCC entity for which a Province, Oblast, State, and/or County can be selected, modify your selection(s) as desired.
5.Click the Next button.
6.Modify the Station Location Name as desired.
7.Click the Finish button.
8.To protect your modified Station Location, direct TQSL to create a Backup File.
9.If you have TQSL installed on multiple computers, then perform the following steps on each such computer:
   9.aObtain a copy of the Backup File you created in step 8 (via your home network, or by using a thumb drive)
   9.bStart TQSL, and direct it to Restore from the backup file you obtained in step 9.a; this will update all Callsign Certificates, Station Locations, and Preferences on this computer to match those on the computer you used to define the Station Location in step 1.

Deleting an Existing Station Location
1.In TQSL , select the Station Locations tab, which lists your Station Locations:
  
  
2.On the Stations Locations tab, click on the name of the StationLocation you wish to modify:
  
  and then click the Delete Station Location button; in the confirmation dialog that appears, click the Yes button.
  

 

Additional Information
  • If you always operate with the same callsign and from one location, use a name that combines them both, e.g. K9UW(Amherst) or AA5AU-Louisiana. If you operate with more than one callsign or from more than one location, see this example.
  • You can copy a Station Location from one computer to another
tqsl-2.8.1/apps/help/tqslapp/stnloc0.bmp0000644000175000017500000532216615003421124020153 0ustar rmurphyrmurphyBMv6(@𭭭𿿿𭭭𭭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭&Kq᭭𿿿̿𭭭᭭𭭭᭭𭭭&Kq᭭𿿿̿𭭭᭭𭭭᭭𭭭&Kq᭭𿿿̿𭭭᭭𭭭᭭𭭭&Kq&Kqq&K&Kq&K&KKK᭭𿿿̴̴̴̃̃̃̏̃̿𭭭&Kq&q&qq&qK&qq&&qq&KK᭭𭭭q&q&ỻ&qK&&&Kq&Kq&KqKKq&K&Kq᭭𭭭&Kq&KqKq&&KqKq&qK&᭭𿿿̴̴̴̨̨̏̏̏̏̃̏̿𭭭&Kqq&&qKq&KKKK&Kq&&qq᭭𭭭KKqqKq&q&&q&Kq&Kq&qq&Kq&&Kq᭭𭭭&Kq&KqqK&&Kq&Kq&qK᭭𿿿̴̴̴̴̴̴̛̛̃̏̃̏̃̿𭭭&Kq&qK&KqqK&KK&Kq&q&q᭭𭭭&qKqK&ᖻ&&qq&Kq&KqqK&qK&&Kq᭭𭭭&Kq&Kqq&K&Kq&KqKK᭭𿿿̴̴̴̨̛̛̃̏̏̃̏̿𭭭&KqKK&Kqq&KKK&Kq&qK᭭𭭭qK&K&q&Kq&KqqK&q&K&Kq᭭𭭭K&q&KqKq&&KqKq&q&&q᭭𿿿̴̴̴̴̴̨̃̃̏̃̏̿𭭭&Kq&Kq&Kq&KqKq&KKKK&KqKK᭭𭭭qq&&&KqKKKKᖻ&qq&&KqKq&&Kq᭭𭭭&Kq&Kqq&Kᖖ&Kq&Kqq&q&᭭𿿿̴̴̴̴̛̛̃̏̃̃̏̃̿𭭭&KqKq&&Kqq&K&qq&Kq&KKKK᭭𭭭qK&KK&KKqqq&&qKq&Kᖖ&Kq᭭𭭭&Kq&Kq&Kq᭭𿿿̴̴̴̏̏̏̏̿𭭭&Kqqq&&&Kq&KqK&q᭭𭭭&qK&Kq᭭𭭭&Kq&Kq&Kq᭭𿿿̴̴̴̨̛̏̏̿𭭭&K&&K&Kq&Kq᭭𭭭q&Kqq&Kq᭭𭭭&Kq&Kq&Kq᭭𿿿̴̴̴̃̏̿𭭭KK&Kq᭭𭭭&qq&&Kq᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭᭭𿿿̿𭭭᭭𭭭᭭𭭭𿿿𭭭𭭭𠠠'Pww''wPPP'Pw'Pw'Pw'PwPPP'PwPPPPPPw'P'Pww'PPPPP'wP'''PwPPPP'wP'''PwPPw'P'PwPPwP''wPP'w'Pw'Pw'Pw'wPP'w'ww''Pw'ww'Pw''PwPw''ww''PwPw'w''www'ww''PwPw'w''w'PwPw''PwwP'PP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'wP'Pw'wPwP''PwwP'wP''PwwP'''ww'wȠP'PwwP'''ww'PwwP'PPwP'PP'Pw'Pw'Pw'Pw'Pw'Pw'Pww'w''Pww'w'w'P'Pww'PwP''PwP'ww'P'PwP'w'Pww'PPwwPw''ȠPPw''w'Pw'PwPw'Pw'PP'Pw'PwPP'PwPP'PwPw''Pw'PwPw''ww''Pw'Pw'wP'Pw'Pw'Pw'PwPw'ww'''wPw'P'Pw'Pw'Pww'P'ww''Pw'Pw'wPPP'wPw'P'Pww'P'wPPPPPPw'PPPPPPw'PPw'PP'Pw'Pw'PwPw''Pw'PwwP'''ww'Pw'Pw'PwwP'ww'Pw'PwPw'PP'PwPP𿿿𿿿̿𿿿̿zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzzPPPwȠwPPPwP''PwwwPwwwP'𿿿ɫ̿zzzzzzPP'PȠwwPwPwwPwȠwP'w𿿿ɫ̿zzzzzzPP''PPPwPPȠPww''PwwPw'''P𿿿ɫ̻̿Pw''PPP'PPPwP'w'PPPw'PwPw'PP''PPP'''wPzzzzzzPPw'PPȠP'wwP''wPP'ȠwPwwPPw𿿿ɫ̻̿Pw'Pw'wP'w'P'wȠPwȠP'Pw'PP'PwzzzzzzPPP'wPww𿿿̿Pw''Pww'PȠw'PȠP'Pw'PwPPw'PP'wPzzzzzzP''''''P''wPww𿿿̿Pw''www'PȠw'PPPw'wPw'PP'wPzzzzzz𿿿̿Pw'wP''ww'w'PPPPPw'Pw'PPP'wzzzzzz𿿿̿PwPw''P'''wP'Pw'''''''''P'P'wwPwPP''''''wP'Ƞzzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿̿zzzzzz𿿿zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𿿿𿿿̿𿿿̿𭭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭wwP𿿿̿𭭭K&qKK᭭Pww𿿿̿𭭭KKKK᭭'PPP''PPP'wP'P'PwP'PP''PPPw''PwwwPwPw''Ƞ'ww'𿿿ɫ̿𭭭KK&Kq&q&qq&&q&Kq&Kqq&KKK᭭Pw''wPPP'PPPPwwPwPwwwPwPPwPwPPw𿿿ɫ̿𭭭KK&Kqq&&qKKqK&ᖖ&Kq&KqKq&KK᭭PwwPP'PPPPwwPwPwwwPwPPwwPPP𿿿ɫ̻̿'PPP''PPP''PPP''PP''ȠP''wPP'PPPPPPwPwP'P'PwP'PwwwPwwP'PPwwP'𭭭KK&Kq&qK&KqqK&KK&Kq&KqqK&KKVVVVVV᭭PwwPwP'PwP'PwwwPw'wwP'PwP''ww'PPwwPP𿿿ɫ̻̿Pw''wPPw'Pw'wPPPP'PPPPwwPwPPwwȠ𭭭KK&KqKK&KqqK&KK&Kq&Kqq&KKKVVVVVV᭭wP''PwPP𿿿̿Pww'Pww'PPw'PP'PPPPwwPw'PwwP''w𭭭KK&Kq&Kq&KqKKq&&qKKKKᖖ&KqKq&KKVVVᛛVVV᭭w''P'''ȠP𿿿̿Pww'Pww'P'PPPwP'PwP''wwP'PwP'PwP'PPP𭭭KK&KqKq&&Kqq&K&KKqqq&q&KKKVVVᛛVVV᭭𿿿̿wP''PwPP''ww'''ww𭭭KK&Kqqq&&&KqKKᳳᳳ᭭𿿿̿w''P'''ȠPP''P'''wPPw'''''''''P'𭭭KK&K&&K&KqKK᭭𿿿̿𭭭K&qKK&KqKK᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿𭭭᭭𭭭᭭𭭭𭭭𭭭᭭𭭭᭭𭭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭K&qKK᭭𭭭᭭𭭭KKKK᭭𭭭᭭𭭭KK&Kq&q&qq&&q&Kq&Kqq&KKK᭭𭭭K&qKK᭭𭭭KK&Kqq&&qKKqK&ᖖ&Kq&KqKq&KK᭭𭭭KKKK᭭''PPPP''PwPPw''PPwwPPPwP''Pw''wP'PPwwP'𭭭KK&Kq&qK&KqqK&KK&Kq&KqqK&KKVVVVVV᭭𭭭KK&Kq&q&qq&&q&Kq&Kqq&KKK᭭PwwP'wPP'PȠwwPwPPPPwȠ𭭭KK&KqKK&KqqK&KK&Kq&Kqq&KKKVVVVVV᭭𭭭KK&Kqq&&qKKqK&ᖖ&Kq&KqKq&KK᭭w'PwP'PPPww''PP'PwP''w𭭭KK&Kq&Kq&KqKKq&&qKKKKᖖ&KqKq&KKVVVᛛVVV᭭Pw'w'P''wPP''PPw'''wPP'PPPPPPwPwP'P'PwP'PwwwPwwP'PPwwP'𭭭KK&Kq&qK&KqqK&KK&Kq&KqqK&KKVVVVVV᭭wP''w'ww'PȠP'wwP''ww'PwP'PPP𭭭KK&KqKq&&Kqq&K&KKqqq&q&KKKVVVᛛVVV᭭Pw'w'PPw'PPwPPPP'PPPPwwPwPPwwȠ𭭭KK&KqKK&KqqK&KK&Kq&Kqq&KKKVVVVVV᭭PPwP'PPPP𭭭KK&Kqqq&&&KqKKᳳᳳ᭭Pw'w'PPP'PwPw'PP'PPPPwwPw'PwwP''w𭭭KK&Kq&Kq&KqKKq&&qKKKKᖖ&KqKq&KKVVVᛛVVV᭭'P'''wP'𭭭KK&K&&K&KqKK᭭Pw'w'PPP'Pw'PPPwP'PwP''wwP'PwP'PwP'PPP𭭭KK&KqKq&&Kqq&K&KKqqq&q&KKKVVVᛛVVV᭭𭭭K&qKK&KqKK᭭Pw'w'PPP'Pw''ww𭭭KK&Kqqq&&&KqKKᳳᳳ᭭𭭭᭭PwP'Pw'''''''''P'PPPPwPw'''''''''P'𭭭KK&K&&K&KqKK᭭𭭭᭭𭭭K&qKK&KqKK᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭𭭭᭭𭭭᭭𭭭xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwxxwPwxxPwP''PPP'''ȠPPwwPwwwP'PPwww''''PPPP''PwPwP'P'Pww''PP''PPPw''PwwPPPwP''PwwwwP'PPwwP'xxPw'PPPwwPwwPPwPwPwwP'wPPPwPwPwwwPw'PwȠwwPwPwwPPwȠxxPww'P''PPwwPwwPPwPww'PwP'PPwPwPwwwPwȠPww''Pww'PwP''wxx'wP'wPP'ȠwPwwPPPPww''wP''wPPPPww''PwwwPwPȠP'wwP''wPP'ȠwPwP'PPPxxwP'Pw'wPwPPwP'xxw''P'''PPPwwwPw'P'''wP'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𿿿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̼̝}}mm}mmmmmmmmm}mm}}̼}mmmmmm}̬mmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}}̬}}}}mmmmmmmmm}mm}}̼̬mmmmmmm̬̼m}mmmmmm̬mmmmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̬}}}}mmmmmmmmm}mm}}̼̬}m}}mmmmmmmmm}}m}̍mmmmmm}̼m}mmmmmm̬mmmmmmm}m̼}mmmmmm̬̬mmmmm}m̼̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm}}mmmmmmmmm̬̬mmmmm}m̼̼̍}}mm}mmmmmmmmm}}}̼̼m}mmmmmm̬mmmmmmm}m̼̿𿿿̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm}mmmmmm}mmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̝m}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̬mmmmmmm̬}mmmmmmm̬mmmmmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̝m}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̝m}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̍mmmmmm}}mmmmmmm̬mmmmmmmm̬}mmmmmm̬̍mmmmmm}mm̼̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm}̝mm}mmmmmmm̬mmmmm}m̼̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̼}mmmmmmm̬mmmmmmmm̬̿𿿿}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmm}̍mmmmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬mmmmmmm̬̝mm}mmmmm̬̍mmmmmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mmmmmm}̝mm}mmmmm̬̍mmmmmmmm̬}mmmmmm̬mmmmmmmmmm}̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm}̼m}mmmmmmmm̬̬mmmmm}m̼̬m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̬̝mm}mmmmm̬̍mmmmmmmm̬̿𿿿̝mm}mmmmmm}mm̼̼̍mm}mmmmmm}mm̼}mmmmmm}̬mmmmmmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼̬}mmmmmmmmm}mm̼̝mm}mmmmmmmmm}̼̼̝m}mmmmmmmmm}̬mmmmmmm̬mmmmmmm}̼m}mmmmmmm̬mmmmmmm̬}mmmmmm̬̝mm}mmmmmmmmm}̼̼̝m}mmmmmmmmm}mmmmmmmmmm}mm̼̍mm}mmmmmmmmm}m̼̍mmmmmm}mmmmmmm}̼m}mmmmmmm}mmmmmm̬̬mmmmmmmmmmm}m̼̍mmmmmm}}mmmmmm̬}mmmmmm}}mmmmmmmmm̬̬mmmmm}m̼̼m}mmmmmmmmm}}m̼̼̝}}mmmmmmmmm}m̼mmmmmmm}̼m}mmmmmmm̿𿿿mmmmmmm}m̼̼m}mmmmmmm}mmmmmm}}mmmmmmmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̝mm}mmmmmmm̼m}mmmmmm}m̼}mmmmmmmm̬̬mmmmmmm̬̍mmmmmm}m̼̝mm}mmm}mm̼̬mmmmmmm̬}mmmmmm̬̼m}mmmmmm}m̼}mmmmmmmm̬}mmmmmmmmm}̼̼}mmmmmmmmm}̍mmmmmm}̍mmmmmm}m̼̝mm}mmm}mm̼}mmmmmm̬̍mmmmmmmm}mm̼̍mmmmmm}}mmmmmm̬}mmmmmm}̝mm}mmmmmmm̬mmmmm}m̼}mmmmmmmmm}̍mm}mmmmmm}̍mmmmmm}m̼̝mm}mmm}mm̼̿𿿿̬mmmmm}mm̼̝mm}mmmmm̬}mmmmmm}̝mm}mmm}mmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmm}mm̼̝mm}mmmmm̬̼m}mmm}mm̼̬mmmmmmm̬̬mmmmm}mm̼}mmmmmm}m̼̬mmmmmmm̬}mmmmmm̬̝mm}mmmmm̬̼m}mmm}mm̼̬mmmmmmmmm}mmmmmm}mm̼̍mmmmmm}̬mmmmm}mm̼}mmmmmm}m̼}mmmmmm̬mmmmmm̬mmmm}̍mmmmmm}}mmmmmm̬}mmmmmm}̼m}mmmmmmmm̬̬mmmmm}m̼̝mm}mmmmmm}̍mmmmmmmm̬̬mmmmm}mm̼}mmmmmm}m̼̿𿿿̝mm}mmm}m̼̼m}mmm}mm̼}mmmmmm}̼m}mmmmmm}mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}mmmmmmmm}mmmmmmm}mmmmmm̬̬mmmmmmm̬}mmmmmm}̼m}mmmmmm̬̬mmmmmmm̬}mmmmmm̬}mmmmmmm}mmmmmm̬}mmmmmm}m̼̼m}mmmmmmm̍mmmmmm}}mmmmmm}̼m}mmmmmm̬}mmmmmm̬̝mm}mmmm̍mmm}m̼̍mmmmmm}}mmmmmm̬}mmmmmm}}mmmmmmmmm̬̬mmmmm}m̼}mmmmmm}m̼mmmmmmm}}mmmmmm}̼m}mmmmmm̬̿wwP𿿿̍mmmmmm}mmmmmmm̬}mmmmmm}}mmmmmm}m̼mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmm}m̼mmmmmmm̬mmmmmmm̬̬mmmmmmm̬̝mm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̬mmmmmmm̬}mmmmmm̬mmmmmmm̬mmmmmmm̬̼m}mmmmmm̬̍mmmmmmmm̬̍mmmmmm}̝mm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm̬}mmmmmm̬̬mm}mm̼̍mmmmmm}}mmmmmm̬}mmmmmm}̍mmmmmmmmm}̬mmmmm}m̼̼m}mmmmmm̬̍mmmmmm}̝mm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̿Pww𿿿̍mmmmmm}}mmmmmm}}mmmmmm}̝mm}mmm}mm̼̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̬mmmmm}mm̼̝mm}mmmmm̬̬mmmmmmm̬̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̬mmmmmmm̬}mmmmmm̬̝mm}mmmmm̬̝mm}mmmmm̬̬mmmmm}mm̼̍mmmmmm}̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmm̬̼m}mmmmm̬mmmmm̍mmmmmm}}mmmmmm̬}mmmmmm}̝mm}mmmmmm}̬mmmmm}m̼̬mmmmm}mm̼̼̼̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}ɫ̿PP''PPP'''wP'PPP'P'PPP''PPP''PPP''PPP'PP''PPPPPPwPPwwwPwPw''PPwwPw''Ƞ'ww'𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̼m}mmmmmm}̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼m}mmm}mm̼̬}mmmmmmmmm}̬mmmmmmm̬̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼̬mmmmmmm̬}mmmmmm̬̬}mmmmmmmmm}̍mmmmmm}m̼mmmmmmm̬̍mmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼}mmmmmm̬̝mm}mmmm̝mm}mm̬̍mmmmmm}}mmmmmm̬}mmmmmm}̼̍mm}mmm}}m̬mmmmm}m̼̝mm}mmm}m̼̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼ɫ̿PP'PwPPw'PwPw''wPPw''wPPPPwwwPwPPPwwPPwPwPPw𿿿}mmmmmm}̍mmmmmm}}mmmmmm}}mmmmmm}m̼̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼m}mmmmmm̬̬}}mmmmmmmmmmmmmmm}m̼̬mmmmmmm̬̬mmmmmmm̬̍mmmmmm}m̼̬mmmmmmm̬}mmmmmm̬̬}}mmmmmmmmmmmmmmm}m̼̍mmmmmmmmmmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬mmmmmmm̬̍mmmmmm}m̼}mmmmmm̬}mmmmmm̬̼m}mmm̬̍mmmmmm}}mmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}}̼̬mmmmm}m̼̍mmmmmm}m̼̬mmmmmmm̬̍mmmmmm}m̼ɫ̻̿PP'wPw'''w'PwwPwwPw'ȠPwwwPwPPPwwPPwwPPP𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̝mm}mmm}mm̼̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼m}mmmmmm̬̼̝m}mmmmmmmmmmmmmmmmmmmmm}mm̼̬mmmmmmm̬mmmmmmm̬̼m}mmmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̼̝m}mmmmmmmmmmmmmmmmmmmmm}mm̼}mmmmmmmmmmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̼m}mmmmmm̬}mmmmmm̬̼m}mmmmm̬}mmmm̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̬mmmmm}m̼̍mmmmmmmmmmmmmm̬̼m}mmmmmm̬ɫ̻̿PP'wPw'''wPPwwPwwPȠP'wwP'PwP''ww'Pww'ww'PPwwPP𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̼m}mmmmmm}̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼m}mmmmmm̬̍mm}mmmmmmmmmmmmmmmmmmmmm}}̼̬mmmmmmm̬̝mm}mmmm̝mm}mmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mm}mmmmmmmmmmmmmmmmmmmmm}}̼̍mmmmmmmmmmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̝mm}mmmm̝mm}mmmmm̬}mmmmmm̬̝mm}mmmm̝mm}mm̬̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̬mmmmm}m̼̍mmmmmm}m̼̝mm}mmmm̝mm}mmmmm̬̿PPP'wP'wPPwwP''PwwP''PwPPPPPP𿿿}mmmmmm}̍mmmmmm}}mmmmmm}}mmmmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼m}mmmmmm̬}mmmmmmmmmmmm}mm}̼̬mmmmmmm̬̼m}mmm}mm̼}mmmmmm}̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmm}mm}̼̍mmmmmm}m̼̼m}mmmmmm̬̍mmmmmm}̼m}mmm}mm̼}mmmmmm}}mmmmmm̬}mmmmmm̬̼m}mmm̬̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼mm}mmmmmmmm̬̬mmmmm}m̼̍mmmmmm}m̼̼m}mmm}mm̼}mmmmmm}̿P''''''wP'ȠPwPwPww''P'''ȠPw''P'''ȠPP'''''''''wP'Pww𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̝mm}mmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̬mmmmm}mm̼̝mm}mmmmmm}̼̬mmmmmmm̬}mmmmmm}̼m}mmm}mm̼̬mmmmmmm̬}mmmmmm̬̝mm}mmmmmm}̼̝mm}mmmmm̬̬mmmmm}mm̼̍mmmmmm}}mmmmmm}̼m}mmm}mm̼}mmmmmm̬m}mmmmm̬}mmmm̍mmmmmm}}mmmmmm̬}mmmmmm}̝mm}mmmmmm}̬mmmmm}m̼̝mm}mmmmm̬}mmmmmm}̼m}mmm}mm̼̿𿿿}mmmmmm}̍mmmmmm}}mmmmmm}m}mmmmmmm̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmmmm̬}mmmmmm}̬mmmmmmm̬̝mm}mmm}m̼̍mmmmmmm̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼m}mmmmmm̬̍mmmmmmmm̬̍mmmmmm}̝mm}mmm}m̼̍mmmmmmm}mmmmmm̬mm}mmmm̝mm}mm̬mmmmmm}}mmmmmm̬}mmmmmm}mmmmmmmm̬mmmmm}m̼̼m}mmmmmm̬̼̼̝mm}mmm}m̼̍mmmmmmm̿𿿿}mmmmmm}̍mmmmmm}}mmmmmm}}mmmmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}mmmmmmmmmmmm}mm̼̝mm}mmmm̬mmmmmmm̬mmmm}mm̼mmmmmmm̬̬mmmmmmm̬}mmmmmm̬mmmm}mm̼̝mm}mmmm}mmmmmm}m̼̼m}mmmmmmm̍mmmmmm}mmmm}mm̼mmmmmmm̬}mmmmmm̬}mmmmmm̬̼m}mmm}mmmmmm}}mmmmmm̬}mmmmmm}̍mmmmmmm̬mmmmm}m̼}mmmmmm}m̼̬mmmmmmm̼mmmm}mm̼mmmmmmm̬̿𿿿}mmmmmm}̍mmmmmm}}mmmmmm}mm}mmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmmmmm̬mmmm}mm̼}mmmmmmm̬mmmmmmm̬̍mmmmmm}mmmmmmm̬̬mmmmmmm̬}mmmmmm̬mmmm}mm̼}mmmmmmm̬mmmmmmmm}}mmmmmm}mm̼̍mmmmmm}̍mmmmmm}mmmmmmm̬}mmmmmmm}mmmmm̬̍mmm}mmmmmmm}}mmmmmm̬}mmmmmm}}mmmmmmm̬mmmmm}m̼̝mm}mmmmmm}}mmmmmm}m̼̍mmmmmm}mmmmmmm̬̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmmmmmmmm̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̝mm}mmmmmm}m̼}mmmmmm}m̼̝mm}mmmmmm̬̬mmmmmmm̬̬mmmmm}mmmmmmm}̬mmmmmmm̬}mmmmmm̬}mmmmmm}m̼̝mm}mmmmmm̬}mmmmmmmmm}̼̼}mmmmmmmmm}̍mmmmmm}̬mmmmm}mmmmmmm}}mmmmmmmm}mmmm̬mm}mmmmmmmm}}mmmmmm̬}mmmmmm}̬mmmmmmmm}̬mmmmm}m̼mmmmmmmmmm}̍mmmmmmmmm̬̬mmmmm}mmmmmmm}̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼̬}mmmmmmmmm}mm̼̬mmmmmmmm}m̼̼mm}mmmmmm}m̼̬mmmmmmm̬}mmm}mmm}}mmm}mm̼̬mmmmmmm̬}mmmmmm̬̬mmmmmmmm}m̼̼mm}mmmmmm}m̼mmmmmmmmmm}mm}̼̍mm}mmmmmmmmm}m̼̍mmmmmm}}mmm}mmm}}mmm}mm̼}mmmmmm}}}mmmmmm̬mmmm}}}mmmmmm}}mmmmmm̬}mmmmmm}̼̍mm}mmmmmmmm̬̬mmmmm}m̼̼m}mmmmmmmmm}m̼̬}}mmmmmmmmmm}mmm}mmm}}mmm}mm̼̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmmmm̬̍mmmmmm}̬mmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̬̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̝mm}mmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̝mm}mmmmmmmmmm}mmmmmmmmmmmmmm̬̍mmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̬mmmmm}m̼̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̝mm}mmmmmmmmmm̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmm̍mmmmmm}̬mmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̼m}mmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̼m}mmmmmmmmm̬}mmmmmmmmmmmmm̬mmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̬mmmmm}m̼̼̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}̼̼m}mmmmmmmmm̬̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmm̬̍mmmmmm}̬mmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}m}̼̝}}mm}mmmmmmmmm}}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̍mmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̼̝}}mm}mmmmmmmmm}}m̼̝}m}}mmmmmmmmm}}m}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̍mmmmmm}m̼}mmmmmmmmmmmm̬mmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}}̼̬mmmmm}m̼̼̝}}mm}mmmmmmmmm}}}̼̍mmmmmm}m̼̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿𿿿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿PPwwPPȠ𿿿̬}m̼m}m̼̬̍m̬̬}m̼̼̍}̬̬}m̼̼m}mmmmmm}m̼̿wȠwPw𿿿̬}m̼}}m̼̬̍m̬̬}m̼̍mmm}̬}m̼m}m̼mm̿'PPP''PPP'PwȠwPPPwP''PwwwPww''PPPP''PwPPwwwP'P'PPP'PwwwwPw𿿿̬}m̼̍mm̬̬̍m̬̬}m̼}}}}̼}m̼}}̼̝̍m}̬ɫ̿Pw''wP'PȠwwPwPwwPwwPwwP'wPwwwPPP'wPwwwwPw𿿿̬}m}m}̼̬̍m̬̬}m̼̝}}̼m̬}m̼}m̼̬}m̼ɫ̿PwwPww''PwwPwww'PwP'PwwPPP'wPwwwwPw𿿿̬mmmmm̬̬̍m̬̬}m̼m̬̝̝}}̼}m̼}m̼̬}m̼ɫ̻̿PwwPP'wwP'PwwPwwwP''wPwwPPPPwP''wwwP'PwP'𿿿̬}m}m̼̬̍m̬̬}mm̬̼}}}m̼}m̼̬}m̼ɫ̻̿wP''PwPwwPwwPPwP'𿿿̬}m̼}m̬̍m̬̬}m}}̍̍m}m̼}m̼̬}m̼̿w''P'''ȠPPwwPww'P'''wP'Pww𿿿̬}m̼m}̼m}mm̬̬}m}}}̼̬mm}mm̼}m̼̬}m̼̿𿿿̬}m̼̼m}m̍̍mm̬̬mmm}}mm̼}m̼̬}m̼̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿ww'PP'''''''PP'wPȠPw''ww''w'ww'w''wP'w'w'Pw'P'Pw'w'P'w'ww'w''wP'w'w'PwP'Pw''wP'w'ww'w'w'P'w'ww'P'ȠPw'P'w'w'ww'w''wP'w'wP'wPw'Pw''w'ww'w''wP'w'ww''wPw'Pw''w'ww'w'w'P'w'wP'wPȠȠPww'w'Pw'PP'w'ww'w''wP'w'w'wP'Ƞw'Pw'Pw''wP'w'ww'w''wPP'PP'w'wPP''wPPw'w'w''w'ww'w'w''wPP'w'wPPPw'Pw''ww''w'ww'w''ww'PP'w'wPPPw'Pw''wP'w'ww'w''wPw'P'w'wPw''wPPw'w'P'w'ww'w'w'P'wP'w'ww''ww''wPw'Pw''w'ww'w''wP'wP'w'wPw''wPPw'Pw''w'ww'w''wPw'P'w'w'wPPw'Pw'P'w'w'ww'w'w'P'wP'w'wPw''wPPw'PP'w'ww'w''wP'wP'w'wPPPPPȠPPP'w'ww'w''wPw'P'w'w'wPPw'PȠP'ww''w'ww'w'w'P'wP'w'w'wPw'w'Pw'w''w'w'ww'w'PP'wP'w'w'w'ww'w'Pw''wP'w'ww'w'PPw'P'w'w'w'ww'w'PP''wP'w'ww'w'PP'wP'w'w'w'ww'w'PP'Pw''w'ww'w'PP'wP'w'w'w'ww'w'PPP'w'w'ww'w'PPw'P'w'w'w'ww'w'P''''w''w'ww'w'PP'wP'w'w'w'ww'w'Pw''PP'w'ww'w'PP'wP'w'w'w'ww'w'Pw'Ƞ'PP'w'ww'w'PPw'P'w'w'w'ww'w'Pw''w'w'w'ww'w'PP'wP'w'w'w'ww'w'Pw''ww''w'ww'w'P'w'wP'w'w'w'ww'w'Pw''ww''w'ww'w'Pw'w'P'w'w'w'ww'w'Pw''ww'P'PȠw'w'ww'w'Pw''wP'w'w'w'ww'w'Pw''ww'P''ȠP'w'ww'w'P'w'wP'w'w'w'ww'w'Pw''ww'PP'Ƞw'w'ww'w'Pw'w'P'w'w'w'ww'w'Pw''wP'PwP'Ƞ'w'ww'w'Pw''wP'w'w'w'ww'w'Pw''wP'P'wP'w'ww'w'P'w'wP'w'w'w'ww'w'Pw''wPȠ''ww''w'ww'w'Pw'w'P'w'w'w'ww'w'Pw''wPȠ'PP''Pw'ww'w'Pw''wP'w'w'w'ww'w'Pw''w'ww''ww'w'P'w'wP'w'w'w'ww'w'Pw''w'w'P'ww'w'Pw'w'P'w'w'w'ww'w'Pw''w'wP''ww'ww'Pw''wP'ww'w'w'ww'w'Pw''w'wP'ww'''''w'w''''w'w'ww'w'Pw''w'P'P'ww'w'w''w'w'ww'w'Pw''w'P'w'ww'w''w'w'w'ww'w'Pw''w'PP'ww''w'w'w'w'ww'w'Pw''wȠPw''ww'w'w''w'w'ww'w'Pw'PȠP'w'ww'w''w'w'w'ww'w'Pw'Pw''w'ww''wP'w'w'ww'w''wPPw'wP'w''ww'w'w''w'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPww''Pw'w'wPPPPPPw''ww''w'PwPP'Pw'PwPPPP'wP'''PwPP'Pww''w'Pw'PwPPwwPPwP''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP'w'wPw''wPww'ww'PPPw''ww''w'''w''wPPPw''Pw'Pw'Pw'Pwww'ww''PwPw'w''w'Pw'PwPPwP''Pw'Pw'wPwP'PP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pwww'''PwwP'''ww'wȠP'wPwP''wP''www'PP'wwȠw''Ƞ'Pw'Pw'Pw'Pw'wȠP'PwwP'''ww'Pw'PwwP'PP'Pw'PwwP'wP'PP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pwww'''PwPP'ww'w'PwP'''www'w'ww'''Pwww''''ww'Pw'Pw'Pw'Pww'P'PwP'w'Pw'PwwP'PP'Pw'Pwww''PPw''wPPPP'Pw'PwPw'Pw'Pw'PP'PwPPPPPP'w'w'wȠP'ww''wPww'''wPPPPPP'''w''ww''Pw'PwPw'PP'wP'Pw'Pw'Pw'PwPPw''wPPPPwP'w'P'PPwww'Pw''Pw'P'PPP'Pww'P'ww''Pw'PPwww'w'ww''PwPPPw'Pw'wP'''ww'wPPP'PwwP''PwPP'Pww'w'Pw'PPPPPP'Pww'P'PPwww''wP'PwwP'''wwPw''wPwP''Pw'PwPw''Pw'Pww'PwwPP'wPPPwP'wwP'w'ww''Pw'PwwP'ww'Pw'Pw'ww'Pw'w''ww''w'wPPPPw'w''w'PwPPw''wUԀ++ԪUU++UԀU++UԀUUUU+U+++UԀUU+UԀ++Ԁ+UԀ+UԀUԀ+++ԀUU+U+++UԀUU+UԀ++Ԁ+UԀ+UԀU++UUU++ԀUU++ԀԀ+Ԁ++UԀU+Ԁ++Ԁ+UԀ+UԀUUU++UԀ+UԀ+UԀUUU++Ԁ+U+Ԁ++Ԁ+UԀ+UԀUUU++UԀ+UԀUU+++UԀ+++UԀ+ԪU+UԀU+++Ԁ+UԀ+UԀU+UU+UԀ+UԀ+UԀU+UUU+U+++Ԁ+UԀ+UԀU+UU+UԀ+UԀ+Ԁ++ԪU+++UԀ+++UԀ+U+UԀU+Ԁ+UԀ+UԀU+UU+UԀ+UԀ+UԀU+UUU+U+Ԁ+UԀ+UԀU+UU+UԀ+UԀ++++ԀUU++ԀUU++Ԁ+U+UԀ+UԀ+UԀ+UԀUU++ԀUUUU+UԀUU++Ԁ+Ԁ++UԀ+UԀ+UԀUU++ԀUUUU++Ԁ+++++UԀ+++UԀUԀ+UUUUUU+UԀ+U+UUԀ++UԀ+U+UUUUU+UԀ+U+UUԀ++Ԁ++Ԁ++UԀ+UԀU++UԀ+UԀ+UԀ+UԀU++++UԀ+UԀ+UԀU++UԀ+UԀ+UԀ+UԀUU+UԀ+UԀUU++Ԁ+UԀ++Ԁtqsl-2.8.1/apps/help/tqslapp/stnloc1.bmp0000644000175000017500000533455615003421124020162 0ustar rmurphyrmurphyBMn6(8kkkkkkkkkkkkkkkkkkfffppplgblgblgblgblgblgbljh333SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSfffppp'''.YYD.DpppkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkPLFZSJ]VL`XNb[Pd\Qf^Rg_Th`Th`UiaUiaUjaUjaUjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVf^RjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbV𭭭𿿿xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭𭭭᭭𿿿̿xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭&Kq᭭𿿿̿xxxx𭭭᭭𭭭&Kq᭭𿿿̿xxxx𭭭᭭𭭭&Kq᭭𿿿̿xxxx𭭭᭭𭭭&Kq&Kqq&K&Kq&K&KKK᭭𿿿̴̴̴̃̃̃̏̃̿xx&Kq&q&qq&qK&qq&&qq&KKxx𭭭q&q&ỻ&qK&&&Kq&Kq&KqKKq&K&Kq᭭𭭭&Kq&KqKq&&KqKq&qK&᭭𿿿̴̴̴̨̨̏̏̏̏̃̏̿xx&Kqq&&qKq&KKKK&Kq&&qqxx𭭭KKqqKq&q&&q&Kq&Kq&qq&Kq&&Kq᭭𭭭&Kq&KqqK&&Kq&Kq&qK᭭𿿿̴̴̴̴̴̴̛̛̃̏̃̏̃̿xx&Kq&qK&KqqK&KK&Kq&q&qxx𭭭&qKqK&ᖻ&&qq&Kq&KqqK&qK&&Kq᭭𭭭&Kq&Kqq&K&Kq&KqKK᭭𿿿̴̴̴̨̛̛̃̏̏̃̏̿xx&KqKK&Kqq&KKK&Kq&qKxx𭭭qK&K&q&Kq&KqqK&q&K&Kq᭭𭭭K&q&KqKq&&KqKq&q&&q᭭𿿿̴̴̴̴̴̨̃̃̏̃̏̿xx&Kq&Kq&Kq&KqKq&KKKK&KqKKxx𭭭qq&&&KqKKKKᖻ&qq&&KqKq&&Kq᭭𭭭&Kq&Kqq&Kᖖ&Kq&Kqq&q&᭭𿿿̴̴̴̴̛̛̃̏̃̃̏̃̿xx&KqKq&&Kqq&K&qq&Kq&KKKKxx𭭭qK&KK&KKqqq&&qKq&Kᖖ&Kq᭭𭭭&Kq&Kq&Kq᭭𿿿̴̴̴̏̏̏̏̿xx&Kqqq&&&Kq&KqK&qxx𭭭&qK&Kq᭭𭭭&Kq&Kq&Kq᭭𿿿̴̴̴̨̛̏̏̿xx&K&&K&Kq&Kqxx𭭭q&Kqq&Kq᭭𭭭&Kq&Kq&Kq᭭𿿿̴̴̴̃̏̿xxKK&Kqxx𭭭&qq&&Kq᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxx𭭭᭭𭭭᭭𿿿̿xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭᭭𭭭𿿿xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx𭭭𠠠𭭭𭭭᭭𭭭᭭zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𭭭᭭zzzzzz𭭭᭭zzzzzz𭭭K&qKK᭭zzzzzz𭭭KKKK᭭zzzzzz𭭭KK&Kq&q&qq&&q&Kq&Kqq&KKK᭭zzzzzz𭭭KK&Kqq&&qKKqK&ᖖ&Kq&KqKq&KK᭭zzzzzzPPPwǠwPPPwP''PwwwPwwwP'𭭭KK&Kq&qK&KqqK&KK&Kq&KqqK&KKVVVVVV᭭zzzzzzPP'PǠwwPwPwwPwǠwP'w𭭭KK&KqKK&KqqK&KK&Kq&Kqq&KKKVVVVVV᭭zzzzzzPP''PPPwPPǠPww''PwwPw'''P𭭭KK&Kq&Kq&KqKKq&&qKKKKᖖ&KqKq&KKVVVᛛVVV᭭Pw''PPP'PPPwP'w'PPPw'PwPw'PP''PPP'''wPzzzzzzPPw'PPǠP'wwP''wPP'ǠwPwwPPw𭭭KK&KqKq&&Kqq&K&KKqqq&q&KKKVVVᛛVVV᭭Pw'Pw'wP'w'P'wǠPwǠP'Pw'PP'PwzzzzzzPPP'wPww𭭭KK&Kqqq&&&KqKKᳳᳳ᭭Pw''Pww'PǠw'PǠP'Pw'PwPPw'PP'wPzzzzzzP''''''P''wPww𭭭KK&K&&K&KqKK᭭Pw''www'PǠw'PPPw'wPw'PP'wPzzzzzz𭭭K&qKK&KqKK᭭Pw'wP''ww'w'PPPPPw'Pw'PPP'wzzzzzz𭭭᭭PwPw''P'''wP'Pw'''''''''P'P'wwPwPP''''''wP'Ǡzzzzzz𭭭᭭zzzzzz𭭭᭭zzzzzz𭭭᭭zzzzzz𭭭᭭zzzzzz𭭭᭭zzzzzz𭭭zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𭭭𭭭᭭𭭭᭭𿿿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿wwP𭭭&Kq&qK&&&Kq&Kq&Kq&Kq&qK&&&Kq&qq&&qq&᭭𿿿̿Pww𭭭&KqKq&q&&q&Kq&Kq&KqKq&q&&qKKKK᭭𿿿̿'PPP''PPP'wP'P'PwP'PP''PPPw''PwwwPwPw''Ǡ'ww'𭭭&KqqK&ᖻ&&qq&Kq&Kq&KqqK&ᖻ&&qqKKVVVVVV᭭𿿿̬mmmmmmmm̬̿Pw''wPPP'PPPPwwPwPwwwPwPPwPwPPw𭭭&KqK&q&Kq&Kq&KqK&qKKVVVVVV᭭𿿿̝}m}̼̿PwwPP'PPPPwwPwPwwwPwPPwwPPP𭭭KK&Kq&KqKq&&Kq&KqKKKKVVVᛛVVV᭭'PPP''PPP''PPP''PP''ǠP''wPP'PPPPPPwPwP'P'PwP'PwwwPwwP'PPwwP'𿿿m̬ɫ̿PwwPwP'PwP'PwwwPw'wwP'PwP''ww'PPwwPP𭭭&KqKK&Kq&K&KKq&KK&qq&Kq&VVVᛛVVV᭭Pw''wPPw'Pw'wPPPP'PPPPwwPwPPwwǠ𿿿m}ɫ̿wP''PwPP𭭭&Kq&Kqᳳᳳ᭭Pww'Pww'PPw'PP'PPPPwwPw'PwwP''w𿿿̬}m̼ɫ̻̿w''P'''ǠP𭭭&KqKK᭭Pww'Pww'P'PPPwP'PwP''wwP'PwP'PwP'PPP𿿿̼m}mmmmmm}ɫ̻̿𭭭Kq&q&&qKq&᭭wP''PwPP''ww'''ww𿿿}̼̿𭭭᭭w''P'''ǠPP''P'''wPPw'''''''''P'𿿿m̬̿𭭭᭭𿿿}mmmmmmmm̬̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭𿿿̿𿿿̿𿿿𭭭𭭭᭭𭭭᭭𿿿𭭭᭭𿿿̿𭭭&qK᭭𿿿̿𭭭Kq&᭭𿿿̿𭭭qK&᭭𿿿̿𭭭q&&q&Kq&KqKqq&&Kq&Kq&Kq&Kq&Kq&qK&&&Kq᭭𿿿̿𭭭&qq&&Kq&KqKK&q&q&Kq&Kq&Kq&KqKq&q&&q᭭𿿿̿''PPPP''PwPPw''PPwwPPPwP''Pw''wP'PPwwP'𭭭&&qqqq&&&Kq&Kqqq&&&Kq&Kq&Kq&Kq&KqqK&ᖻ&&qqVVVVVV᭭𿿿}mmmmmmm̿PwwP'wPP'PǠwwPwPPPPwǠ𭭭qq&&&&qq&Kq&Kqqq&&&Kq&Kq&Kq&Kq&KqK&qVVVVVV᭭𿿿̝̍}m̼m}̿w'PwP'PPPww''PP'PwP''w𭭭&qq&KK&KqKq&KK&q&q&KqKKKKᖖ&Kq&KqVVVᛛVVV᭭Pw'w'P''wPP''PPw'''wPP'PPPPPPwPwP'P'PwP'PwwwPwwP'PPwwP'𿿿}}̬̍mɫ̿wP''w'ww'PǠP'wwP''ww'PwP'PPP𭭭&qKKK&Kq&K&KKKq&qq&&Kq&Kq&KKqqq&&KqKKVVVᛛVVV᭭Pw'w'PPw'PPwPPPP'PPPPwwPwPPwwǠ𿿿̝̝}}̼m̬ɫ̿PPwP'PPPP𭭭qK&KKᳳᳳ᭭Pw'w'PPP'PwPw'PP'PPPPwwPw'PwwP''w𿿿̝mm}mmm̬ɫ̻̿'P'''wP'𭭭KKKK᭭Pw'w'PPP'Pw'PPPwP'PwP''wwP'PwP'PwP'PPP𿿿̼}}̼̍m̬ɫ̻̿𭭭Kq&KKq&&qq&&qq&&q᭭Pw'w'PPP'Pw''ww𿿿̝̝}}̼m̬̿𭭭᭭PwP'Pw'''''''''P'PPPPwPw'''''''''P'𿿿̬}m̼}m̼̿𭭭᭭𿿿̍mmmmmm}̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭᭭𿿿̿𭭭𿿿̿𿿿̿𿿿zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz++ԀzzzzzzU+zzzwzzzUUzzzwPwzzz+UԀ+UԀU++UԀUU+U+UԀUUU+UԀzzzPwP''PPP'''ǠPPwwPwwwP'PPwww''''PPPP''PwPwP'P'Pww''PP''PPPw''PwwPPPwP''PwwwwP'PPwwP'zzz+UԀ+UԀUԀ++UԀUUU+UԀ++UԀ+UU+ԀzzzPw'PPPwwPwwPPwPwPwwP'wPPPwPwPwwwPw'PwǠwwPwPwwPPwǠzzz+UԀ+UԀ++++Ԫ+UԀUU+Ԁ+UU+UԀ+UԀ+UԀzzzPww'P''PPwwPwwPPwPww'PwP'PPwPwPwwwPwǠPww''Pww'PwP''wzzz+UԀ+UԀ++UU+UԀUU++UU+UԀ+UԀ+UԀzzz'wP'wPP'ǠwPwwPPPPww''wP''wPPPPww''PwwwPwPǠP'wwP''wPP'ǠwPwP'PPPzzzUU+UԀUU+++UԀUU+U+UԀ+UԀ+UԀzzzwP'Pw'wPwPPwP'zzz+UԀ+UԀUU++Ԁ+UԀUU++ԀUU+UԀ+UԀ+UԀzzzw''P'''PPPwwwPw'P'''wP'zzz+UԀ+U+UUԀ+UUU+UԀUU++UUzzzzzz+UԀ+U+++ԀU+Ԁ+UUUU+UԀ+UԀzzzzzzUԀ+UU++ԀUUUԀ+++Ԁzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz𿿿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̼̝}}mm}mmmmmmmmm}mm}}̼}mmmmmm}̬mmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}}̬}}}}mmmmmmmmm}mm}}̼̬mmmmmmm̬̼m}mmmmmm̬mmmmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̬}}}}mmmmmmmmm}mm}}̼̬}m}}mmmmmmmmm}}m}̍mmmmmm}̼m}mmmmmm̬mmmmmmm}m̼}mmmmmm̬̬mmmmm}m̼̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm}}mmmmmmmmm̬̬mmmmm}m̼̼̍}}mm}mmmmmmmmm}}}̼̼m}mmmmmm̬mmmmmmm}m̼̿𿿿̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm}mmmmmm}mmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̝m}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̬mmmmmmm̬}mmmmmmm̬mmmmmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̝m}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̝m}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̍mmmmmm}}mmmmmmm̬mmmmmmmm̬}mmmmmm̬̍mmmmmm}mm̼̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm}̝mm}mmmmmmm̬mmmmm}m̼̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̼}mmmmmmm̬mmmmmmmm̬̿𿿿}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmm}̍mmmmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬mmmmmmm̬̝mm}mmmmm̬̍mmmmmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mmmmmm}̝mm}mmmmm̬̍mmmmmmmm̬}mmmmmm̬mmmmmmmmmm}̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm}̼m}mmmmmmmm̬̬mmmmm}m̼̬m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̬̝mm}mmmmm̬̍mmmmmmmm̬̿𿿿̝mm}mmmmmm}mm̼̼̍mm}mmmmmm}mm̼}mmmmmm}̬mmmmmmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼̬}mmmmmmmmm}mm̼̝mm}mmmmmmmmm}̼̼̝m}mmmmmmmmm}̬mmmmmmm̬mmmmmmm}̼m}mmmmmmm̬mmmmmmm̬}mmmmmm̬̝mm}mmmmmmmmm}̼̼̝m}mmmmmmmmm}mmmmmmmmmm}mm̼̍mm}mmmmmmmmm}m̼̍mmmmmm}mmmmmmm}̼m}mmmmmmm}mmmmmm̬̬mmmmmmmmmmm}m̼̍mmmmmm}}mmmmmm̬}mmmmmm}}mmmmmmmmm̬̬mmmmm}m̼̼m}mmmmmmmmm}}m̼̼̝}}mmmmmmmmm}m̼mmmmmmm}̼m}mmmmmmm̿𿿿mmmmmmm}m̼̼m}mmmmmmm}mmmmmm}}mmmmmmmmmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̝mm}mmmmmmm̼m}mmmmmm}m̼}mmmmmmmm̬̬mmmmmmm̬̍mmmmmm}m̼̝mm}mmm}mm̼̬mmmmmmm̬}mmmmmm̬̼m}mmmmmm}m̼}mmmmmmmm̬}mmmmmmmmm}̼̼}mmmmmmmmm}̍mmmmmm}̍mmmmmm}m̼̝mm}mmm}mm̼}mmmmmm̬̍mmmmmmmm}mm̼̍mmmmmm}}mmmmmm̬}mmmmmm}̝mm}mmmmmmm̬mmmmm}m̼}mmmmmmmmm}̍mm}mmmmmm}̍mmmmmm}m̼̝mm}mmm}mm̼̿𿿿̬mmmmm}mm̼̝mm}mmmmm̬}mmmmmm}̝mm}mmm}mmmmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmm}mm̼̝mm}mmmmm̬̼m}mmm}mm̼̬mmmmmmm̬̬mmmmm}mm̼}mmmmmm}m̼̬mmmmmmm̬}mmmmmm̬̝mm}mmmmm̬̼m}mmm}mm̼̬mmmmmmmmm}mmmmmm}mm̼̍mmmmmm}̬mmmmm}mm̼}mmmmmm}m̼}mmmmmm̬mmmmmm̬mmmm}̍mmmmmm}}mmmmmm̬}mmmmmm}̼m}mmmmmmmm̬̬mmmmm}m̼̝mm}mmmmmm}̍mmmmmmmm̬̬mmmmm}mm̼}mmmmmm}m̼̿𿿿̝mm}mmm}m̼̼m}mmm}mm̼}mmmmmm}̼m}mmmmmm}mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}mmmmmmmm}mmmmmmm}mmmmmm̬̬mmmmmmm̬}mmmmmm}̼m}mmmmmm̬̬mmmmmmm̬}mmmmmm̬}mmmmmmm}mmmmmm̬}mmmmmm}m̼̼m}mmmmmmm̍mmmmmm}}mmmmmm}̼m}mmmmmm̬}mmmmmm̬̝mm}mmmm̍mmm}m̼̍mmmmmm}}mmmmmm̬}mmmmmm}}mmmmmmmmm̬̬mmmmm}m̼}mmmmmm}m̼mmmmmmm}}mmmmmm}̼m}mmmmmm̬̿wwP𿿿̍mmmmmm}mmmmmmm̬}mmmmmm}}mmmmmm}m̼mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmm}m̼mmmmmmm̬mmmmmmm̬̬mmmmmmm̬̝mm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̬mmmmmmm̬}mmmmmm̬mmmmmmm̬mmmmmmm̬̼m}mmmmmm̬̍mmmmmmmm̬̍mmmmmm}̝mm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmm̬}mmmmmm̬̬mm}mm̼̍mmmmmm}}mmmmmm̬}mmmmmm}̍mmmmmmmmm}̬mmmmm}m̼̼m}mmmmmm̬̍mmmmmm}̝mm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̿Pww𿿿̍mmmmmm}}mmmmmm}}mmmmmm}̝mm}mmm}mm̼̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̬mmmmm}mm̼̝mm}mmmmm̬̬mmmmmmm̬̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̬mmmmmmm̬}mmmmmm̬̝mm}mmmmm̬̝mm}mmmmm̬̬mmmmm}mm̼̍mmmmmm}̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmm̬̼m}mmmmm̬mmmmm̍mmmmmm}}mmmmmm̬}mmmmmm}̝mm}mmmmmm}̬mmmmm}m̼̬mmmmm}mm̼̼̼̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}ɫ̿PP''PPP'''wP'PPP'P'PPP''PPP''PPP''PPP'PP''PPPPPPwPPwwwPwPw''PPwwPw''Ǡ'ww'𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̼m}mmmmmm}̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼m}mmm}mm̼̬}mmmmmmmmm}̬mmmmmmm̬̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼̬mmmmmmm̬}mmmmmm̬̬}mmmmmmmmm}̍mmmmmm}m̼mmmmmmm̬̍mmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼}mmmmmm̬̝mm}mmmm̝mm}mm̬̍mmmmmm}}mmmmmm̬}mmmmmm}̼̍mm}mmm}}m̬mmmmm}m̼̝mm}mmm}m̼̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̼ɫ̿PP'PwPPw'PwPw''wPPw''wPPPPwwwPwPPPwwPPwPwPPw𿿿}mmmmmm}̍mmmmmm}}mmmmmm}}mmmmmm}m̼̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼m}mmmmmm̬̬}}mmmmmmmmmmmmmmm}m̼̬mmmmmmm̬̬mmmmmmm̬̍mmmmmm}m̼̬mmmmmmm̬}mmmmmm̬̬}}mmmmmmmmmmmmmmm}m̼̍mmmmmmmmmmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬mmmmmmm̬̍mmmmmm}m̼}mmmmmm̬}mmmmmm̬̼m}mmm̬̍mmmmmm}}mmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}}̼̬mmmmm}m̼̍mmmmmm}m̼̬mmmmmmm̬̍mmmmmm}m̼ɫ̻̿PP'wPw'''w'PwwPwwPw'ǠPwwwPwPPPwwPPwwPPP𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̝mm}mmm}mm̼̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼m}mmmmmm̬̼̝m}mmmmmmmmmmmmmmmmmmmmm}mm̼̬mmmmmmm̬mmmmmmm̬̼m}mmmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̼̝m}mmmmmmmmmmmmmmmmmmmmm}mm̼}mmmmmmmmmmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̼m}mmmmmm̬}mmmmmm̬̼m}mmmmm̬}mmmm̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̬mmmmm}m̼̍mmmmmmmmmmmmmm̬̼m}mmmmmm̬ɫ̻̿PP'wPw'''wPPwwPwwPǠP'wwP'PwP''ww'Pww'ww'PPwwPP𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̼m}mmmmmm}̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼m}mmmmmm̬̍mm}mmmmmmmmmmmmmmmmmmmmm}}̼̬mmmmmmm̬̝mm}mmmm̝mm}mmmmm̬̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mm}mmmmmmmmmmmmmmmmmmmmm}}̼̍mmmmmmmmmmmmmm}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̝mm}mmmm̝mm}mmmmm̬}mmmmmm̬̝mm}mmmm̝mm}mm̬̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̬mmmmm}m̼̍mmmmmm}m̼̝mm}mmmm̝mm}mmmmm̬̿PPP'wP'wPPwwP''PwwP''PwPPPPPP𿿿}mmmmmm}̍mmmmmm}}mmmmmm}}mmmmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼m}mmmmmm̬}mmmmmmmmmmmm}mm}̼̬mmmmmmm̬̼m}mmm}mm̼}mmmmmm}̬mmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmm}mm}̼̍mmmmmm}m̼̼m}mmmmmm̬̍mmmmmm}̼m}mmm}mm̼}mmmmmm}}mmmmmm̬}mmmmmm̬̼m}mmm̬̍mmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmm}̼mm}mmmmmmmm̬̬mmmmm}m̼̍mmmmmm}m̼̼m}mmm}mm̼}mmmmmm}̿P''''''wP'ǠPwPwPww''P'''ǠPw''P'''ǠPP'''''''''wP'Pww𿿿}mmmmmm}̍mmmmmm}}mmmmmm}̝mm}mmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̬mmmmm}mm̼̝mm}mmmmmm}̼̬mmmmmmm̬}mmmmmm}̼m}mmm}mm̼̬mmmmmmm̬}mmmmmm̬̝mm}mmmmmm}̼̝mm}mmmmm̬̬mmmmm}mm̼̍mmmmmm}}mmmmmm}̼m}mmm}mm̼}mmmmmm̬m}mmmmm̬}mmmm̍mmmmmm}}mmmmmm̬}mmmmmm}̝mm}mmmmmm}̬mmmmm}m̼̝mm}mmmmm̬}mmmmmm}̼m}mmm}mm̼̿𿿿}mmmmmm}̍mmmmmm}}mmmmmm}m}mmmmmmm̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmmmm̬}mmmmmm}̬mmmmmmm̬̝mm}mmm}m̼̍mmmmmmm̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼m}mmmmmm̬̍mmmmmmmm̬̍mmmmmm}̝mm}mmm}m̼̍mmmmmmm}mmmmmm̬mm}mmmm̝mm}mm̬mmmmmm}}mmmmmm̬}mmmmmm}mmmmmmmm̬mmmmm}m̼̼m}mmmmmm̬̼̼̝mm}mmm}m̼̍mmmmmmm̿𿿿}mmmmmm}̍mmmmmm}}mmmmmm}}mmmmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}mmmmmmmmmmmm}mm̼̝mm}mmmm̬mmmmmmm̬mmmm}mm̼mmmmmmm̬̬mmmmmmm̬}mmmmmm̬mmmm}mm̼̝mm}mmmm}mmmmmm}m̼̼m}mmmmmmm̍mmmmmm}mmmm}mm̼mmmmmmm̬}mmmmmm̬}mmmmmm̬̼m}mmm}mmmmmm}}mmmmmm̬}mmmmmm}̍mmmmmmm̬mmmmm}m̼}mmmmmm}m̼̬mmmmmmm̼mmmm}mm̼mmmmmmm̬̿𿿿}mmmmmm}̍mmmmmm}}mmmmmm}mm}mmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̍mmmmmmmmm̬mmmm}mm̼}mmmmmmm̬mmmmmmm̬̍mmmmmm}mmmmmmm̬̬mmmmmmm̬}mmmmmm̬mmmm}mm̼}mmmmmmm̬mmmmmmmm}}mmmmmm}mm̼̍mmmmmm}̍mmmmmm}mmmmmmm̬}mmmmmmm}mmmmm̬̍mmm}mmmmmmm}}mmmmmm̬}mmmmmm}}mmmmmmm̬mmmmm}m̼̝mm}mmmmmm}}mmmmmm}m̼̍mmmmmm}mmmmmmm̬̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmmmmmmmm̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̝mm}mmmmmm}m̼}mmmmmm}m̼̝mm}mmmmmm̬̬mmmmmmm̬̬mmmmm}mmmmmmm}̬mmmmmmm̬}mmmmmm̬}mmmmmm}m̼̝mm}mmmmmm̬}mmmmmmmmm}̼̼}mmmmmmmmm}̍mmmmmm}̬mmmmm}mmmmmmm}}mmmmmmmm}mmmm̬mm}mmmmmmmm}}mmmmmm̬}mmmmmm}̬mmmmmmmm}̬mmmmm}m̼mmmmmmmmmm}̍mmmmmmmmm̬̬mmmmm}mmmmmmm}̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmmmmmm̬̍mmmmmm}̬mmmmm}m̼̬mmmmmmm̬}mmmmmm̬}mmmmmm}̼̬}mmmmmmmmm}mm̼̬mmmmmmmm}m̼̼mm}mmmmmm}m̼̬mmmmmmm̬}mmm}mmm}}mmm}mm̼̬mmmmmmm̬}mmmmmm̬̬mmmmmmmm}m̼̼mm}mmmmmm}m̼mmmmmmmmmm}mm}̼̍mm}mmmmmmmmm}m̼̍mmmmmm}}mmm}mmm}}mmm}mm̼}mmmmmm}}}mmmmmm̬mmmm}}}mmmmmm}}mmmmmm̬}mmmmmm}̼̍mm}mmmmmmmm̬̬mmmmm}m̼̼m}mmmmmmmmm}m̼̬}}mmmmmmmmmm}mmm}mmm}}mmm}mm̼̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmmmm̬̍mmmmmm}̬mmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̬̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̝mm}mmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̬̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̝mm}mmmmmmmmmm}mmmmmmmmmmmmmm̬̍mmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̬mmmmm}m̼̼m}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̝mm}mmmmmmmmmm̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmmmm̍mmmmmm}̬mmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̼m}mmmmmmmmm̬}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}m̼̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}mm̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̼m}mmmmmmmmm̬}mmmmmmmmmmmmm̬mmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̬mmmmm}m̼̼̍mm}mmmmmmmmmmmmmmmmmmmmmmmmmmm}̼̼m}mmmmmmmmm̬̿𿿿}mmmmmm}̍mmmmmm}}mmmmmmmm̬̍mmmmmm}̬mmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}m}̼̝}}mm}mmmmmmmmm}}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̍mmmmmm}m̼}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm̼̝}}mm}mmmmmmmmm}}m̼̝}m}}mmmmmmmmm}}m}̍mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}̍mmmmmm}m̼}mmmmmmmmmmmm̬mmmmmmmmmm}}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm}}}̼̬mmmmm}m̼̼̝}}mm}mmmmmmmmm}}}̼̍mmmmmm}m̼̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿𿿿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿PPwwPPǠ𿿿̬}m̼m}m̼̬̍m̬̬}m̼̼̍}̬̬}m̼̼m}mmmmmm}m̼̿wǠwPw𿿿̬}m̼}}m̼̬̍m̬̬}m̼̍mmm}̬}m̼m}m̼mm̿'PPP''PPP'PwǠwPPPwP''PwwwPww''PPPP''PwPPwwwP'P'PPP'PwwwwPw𿿿̬}m̼̍mm̬̬̍m̬̬}m̼}}}}̼}m̼}}̼̝̍m}̬ɫ̿Pw''wP'PǠwwPwPwwPwwPwwP'wPwwwPPP'wPwwwwPw𿿿̬}m}m}̼̬̍m̬̬}m̼̝}}̼m̬}m̼}m̼̬}m̼ɫ̿PwwPww''PwwPwww'PwP'PwwPPP'wPwwwwPw𿿿̬mmmmm̬̬̍m̬̬}m̼m̬̝̝}}̼}m̼}m̼̬}m̼ɫ̻̿PwwPP'wwP'PwwPwwwP''wPwwPPPPwP''wwwP'PwP'𿿿̬}m}m̼̬̍m̬̬}mm̬̼}}}m̼}m̼̬}m̼ɫ̻̿wP''PwPwwPwwPPwP'𿿿̬}m̼}m̬̍m̬̬}m}}̍̍m}m̼}m̼̬}m̼̿w''P'''ǠPPwwPww'P'''wP'Pww𿿿̬}m̼m}̼m}mm̬̬}m}}}̼̬mm}mm̼}m̼̬}m̼̿𿿿̬}m̼̼m}m̍̍mm̬̬mmm}}mm̼}m̼̬}m̼̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿̿𿿿ww'PP'''''''PP'wPǠPw''ww''w'ww'w''wP'w'w'Pw'P'Pw'w'P'w'ww'w''wP'w'w'PwP'Pw''wP'w'ww'w'w'P'w'ww'P'ǠPw'P'w'w'ww'w''wP'w'wP'wPw'Pw''w'ww'w''wP'w'ww''wPw'Pw''w'ww'w'w'P'w'wP'wPǠǠPww'w'Pw'PP'w'ww'w''wP'w'w'wP'Ǡw'Pw'Pw''wP'w'ww'w''wPP'PP'w'wPP''wPPw'w'w''w'ww'w'w''wPP'w'wPPPw'Pw''ww''w'ww'w''ww'PP'w'wPPPw'Pw''wP'w'ww'w''wPw'P'w'wPw''wPPw'w'P'w'ww'w'w'P'wP'w'ww''ww''wPw'Pw''w'ww'w''wP'wP'w'wPw''wPPw'Pw''w'ww'w''wPw'P'w'w'wPPw'Pw'P'w'w'ww'w'w'P'wP'w'wPw''wPPw'PP'w'ww'w''wP'wP'w'wPPPPPǠPPP'w'ww'w''wPw'P'w'w'wPPw'PǠP'ww''w'ww'w'w'P'wP'w'w'wPw'w'Pw'w''w'w'ww'w'PP'wP'w'w'w'ww'w'Pw''wP'w'ww'w'PPw'P'w'w'w'ww'w'PP''wP'w'ww'w'PP'wP'w'w'w'ww'w'PP'Pw''w'ww'w'PP'wP'w'w'w'ww'w'PPP'w'w'ww'w'PPw'P'w'w'w'ww'w'P''''w''w'ww'w'PP'wP'w'w'w'ww'w'Pw''PP'w'ww'w'PP'wP'w'w'w'ww'w'Pw'Ǡ'PP'w'ww'w'PPw'P'w'w'w'ww'w'Pw''w'w'w'ww'w'PP'wP'w'w'w'ww'w'Pw''ww''w'ww'w'P'w'wP'w'w'w'ww'w'Pw''ww''w'ww'w'Pw'w'P'w'w'w'ww'w'Pw''ww'P'PǠw'w'ww'w'Pw''wP'w'w'w'ww'w'Pw''ww'P''ǠP'w'ww'w'P'w'wP'w'w'w'ww'w'Pw''ww'PP'Ǡw'w'ww'w'Pw'w'P'w'w'w'ww'w'Pw''wP'PwP'Ǡ'w'ww'w'Pw''wP'w'w'w'ww'w'Pw''wP'P'wP'w'ww'w'P'w'wP'w'w'w'ww'w'Pw''wPǠ''ww''w'ww'w'Pw'w'P'w'w'w'ww'w'Pw''wPǠ'PP''Pw'ww'w'Pw''wP'w'w'w'ww'w'Pw''w'ww''ww'w'P'w'wP'w'w'w'ww'w'Pw''w'w'P'ww'w'Pw'w'P'w'w'w'ww'w'Pw''w'wP''ww'ww'Pw''wP'ww'w'w'ww'w'Pw''w'wP'ww'''''w'w''''w'w'ww'w'Pw''w'P'P'ww'w'w''w'w'ww'w'Pw''w'P'w'ww'w''w'w'w'ww'w'Pw''w'PP'ww''w'w'w'w'ww'w'Pw''wǠPw''ww'w'w''w'w'ww'w'Pw'PǠP'w'ww'w''w'w'w'ww'w'Pw'Pw''w'ww''wP'w'w'ww'w''wPPw'wP'w''ww'w'w''w'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPww''Pw'w'wPPPPPPw''ww''w'PwPP'Pw'PwPPPP'wP'''PwPP'Pww''w'Pw'PwPPwwPPwP''Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'PwPP'w'wPw''wPww'ww'PPPw''ww''w'''w''wPPPw''Pw'Pw'Pw'Pwww'ww''PwPw'w''w'Pw'PwPPwP''Pw'Pw'wPwP'PP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pwww'''PwwP'''ww'wǠP'wPwP''wP''www'PP'wwǠw''Ǡ'Pw'Pw'Pw'Pw'wǠP'PwwP'''ww'Pw'PwwP'PP'Pw'PwwP'wP'PP'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pw'Pwww'''PwPP'ww'w'PwP'''www'w'ww'''Pwww''''ww'Pw'Pw'Pw'Pww'P'PwP'w'Pw'PwwP'PP'Pw'Pwww''PPw''wPPPP'Pw'PwPw'Pw'Pw'PP'PwPPPPPP'w'w'wǠP'ww''wPww'''wPPPPPP'''w''ww''Pw'PwPw'PP'wP'Pw'Pw'Pw'PwPPw''wPPPPwP'w'P'PPwww'Pw''Pw'P'PPP'Pww'P'ww''Pw'PPwww'w'ww''PwPPPw'Pw'wP'''ww'wPPP'PwwP''PwPP'Pww'w'Pw'PPPPPP'Pww'P'PPwww''wP'PwwP'''wwPw''wPwP''Pw'PwPw''Pw'Pww'PwwPP'wPPPwP'wwP'w'ww''Pw'PwwP'ww'Pw'Pw'ww'Pw'w''ww''w'wPPPPw'w''w'PwPPw''wUԀ++ԪUU++UԀU++UԀUUUU+U+++UԀUU+UԀ++Ԁ+UԀ+UԀUԀ+++ԀUU+U+++UԀUU+UԀ++Ԁ+UԀ+UԀU++UUU++ԀUU++ԀԀ+Ԁ++UԀU+Ԁ++Ԁ+UԀ+UԀUUU++UԀ+UԀ+UԀUUU++Ԁ+U+Ԁ++Ԁ+UԀ+UԀUUU++UԀ+UԀUU+++UԀ+++UԀ+ԪU+UԀU+++Ԁ+UԀ+UԀU+UU+UԀ+UԀ+UԀU+UUU+U+++Ԁ+UԀ+UԀU+UU+UԀ+UԀ+Ԁ++ԪU+++UԀ+++UԀ+U+UԀU+Ԁ+UԀ+UԀU+UU+UԀ+UԀ+UԀU+UUU+U+Ԁ+UԀ+UԀU+UU+UԀ+UԀ++++ԀUU++ԀUU++Ԁ+U+UԀ+UԀ+UԀ+UԀUU++ԀUUUU+UԀUU++Ԁ+Ԁ++UԀ+UԀ+UԀUU++ԀUUUU++Ԁ+++++UԀ+++UԀUԀ+UUUUUU+UԀ+U+UUԀ++UԀ+U+UUUUU+UԀ+U+UUԀ++Ԁ++Ԁ++UԀ+UԀU++UԀ+UԀ+UԀ+UԀU++++UԀ+UԀ+UԀU++UԀ+UԀ+UԀ+UԀUU+UԀ+UԀUU++Ԁ+UԀ++Ԁtqsl-2.8.1/apps/help/tqslapp/stnloc1.htm0000644000175000017500000000331215003421124020146 0ustar rmurphyrmurphySpecifying a Station Location

Specifying a Station Location

1.select your callsign
2.specify the Grid Square in which your station is located (this is particularly important if you operate on VHF or UHF frequencies or via Satellites, as it provides Grid Square credit to your QSO partners pursuing VUCC awards)
3.specify the ITU Zone in which your station is located
4.specify the CQ Zone in which your station is located
5.if your station is located on an island, specify its IOTA Reference Number; use a two-character continent abbreviation followed by a dash and a 3 digit number, e.g. OC-005. If you do not know your IOTA designation, you can find this information at http://www.iota-world.org
6.click the Next button
 Note: if the DXCC Entity, ITU Zone, and CQ Zone are mutually inconsistent, an Invalid zone selections for DXCC entity message will be displayed, and the Next button will be disabled; you must select consistent ITU and CQ zones before proceeding.
7.Depending upon your callsign's DXCC entity, you may be prompted to specify your Province, Oblast, State, and/or County.
tqsl-2.8.1/apps/help/tqslapp/stnloc2.bmp0000644000175000017500000177532615003421124020163 0ustar rmurphyrmurphyBM6(~wr_ZVQMI/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)B>;OJGib^uniyt~wra[X/,)1/-񢟝1/-/,)JFChb^uni|wa[XοοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺǹȺȺɻʼ˽̾̾Ϳ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοο㢟KFDjd`jd`-*'οοοοͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾ͿͿ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοآ-*'QMI[UR0.,οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾ͿͿ;̽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοο0.,D@>/,*οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοˠ/,*-*'-*'-*'⥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<YgUcUcUeUfUfTgTgTgTiSjSjQkQkQkQkQkQkQkQkQkQlQlQlQlQlQlQlQlQlQlSkSjTiTgTgTgUfUfUeUcUcYh>-*'-*' L ֤L פ LפV}Y} KWۧIWŀY׫K ŀWŀ ëK } ڧI ۧIW ٦ISzU֣G yRy ԢF }䴉I ʘ;IWIWIWIWHWHWGYEZE[E[E[E]E]E]E]E]E]WYhXUhXUhXUWYE^WYhXUhXUhXUWYE^E^E^E]E[E[E[EZGYHWHWIWIWIWIX;-*'-*'W|K YQKLN֤ QKN} }WWL֤Y|  ˆ UJ פHSIU~ y { w z 9=M=M=M=N=O=O=O=O=O=O=Q=QNaming a Station Location

Naming a Station Location

In the Add Station Location dialog, specify a Station Location Name.
1.to make this name meaningful, it is recommended that it incorporate both your callsign and town name, or callsign and location name (see Additional Information below)
2.click the Finish button
tqsl-2.8.1/apps/help/tqslapp/stnloc2park.bmp0000644000175000017500000175551615003421124021040 0ustar rmurphyrmurphyBMN6(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹѹ(ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹѹ?ѹuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>9“9Ӽ葑ѹ?ѹ𐐐wwwpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwԾV<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<S>S>S>S>S>S=S>SSUfVSfVSfVSSU>S>S>S>S>S>S>S>S"CǮǮǮd444444ŬŬŬŬŬŬ2EaŬŬŬ~~,'œŬŬ2EaŬ2EaŬ2EaŬŬŬŬŬŬŬ~'EŬ2EaŬŬZ2aŬ2EaŬŬ2Ea~Z'{ŬŬN{EŬ2EaŬŬ2EaŬŬŬŬ2EaŬŬŬ~Z'{ŬŬN{E~Z'{ŬŬŬŬZ2aŬ2EaŬŬ2Ea~Z'{ŬŬN{EŬ2EaŬŬ2EaŬŬŬŬŬŬŬŬŬŬ2oo'ŬŬ2oNŬŬ2oo'ŬŬ2oNŬ2EaŬŬ,aEŬŬZEŬŬ~Z'{ŬŬŬŬ2,aaŬŬŬ~'Z{ŬŬŬŬZNZNŬ2oo'2oo'ŬŬZ2aŬZE{Ŭ~,EœŬ2EaŬZ2aŬ2EaŬŬ2Ea~~,'œŬŬ2Ea~'Z{Ŭ2oo'ŬŬ2oNŬŬ2oo'ŬŬ2oNŬ2EaŬŬ,aEŬŬZEŬŬ~Z'{ŬŬŬŬ2,aaŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬŬ"C3I3J3J3J3J3J4J4I3JNQfVSfVSNQ4I3I3I3I4J4J3I3I3I"CŬŬŬi444444īīīīīīEYzīEߌEī2n2ߨ`ī2Eߨ`ī2Eߨ`īīīīīī,`ߌEīī2Eߨ`īīīīī2Eߨ`ī2Eߨ`īī2Eߨ`īEߌEī~2&ߨ`īENīYYzīīīī2Eߨ`īīīīEߌEī~2&ߨ`ī,`n&īīīīīīī2Eߨ`ī2Eߨ`īī2Eߨ`īEߌEī~2&ߨ`īENīYYzīīīY~,ēīīīī~~,&ēī2,`ߨ`īī~~,&ēī2,`ߨ`ī2En&īYYzīīNz~nE~,&ēī~~,&ēīīīī,`ߌEīīīīīīīīīīīīNzߌEī~,Eē2Nzߨ`YNīīīīī2Eߨ`YNīīNzߌEī2Eߨ`īīīī2Eߨ`īENīYYzīEߌEī2n2ߨ`īīīīīī~~,&ēī2,`ߨ`īī~~,&ēī2,`ߨ`ī2En&īYYzīīNz~nE~,&ēī~~,&ēīīīī,`ߌEīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīīī"C,C,C,C,C,C,C,C,C,C,CKMfVSfVSKM,C,C,C,C,C,C,C,C,C,C"Cīīīn444444éééééé2Dݨ_éééé}&}n&2Dݨ_é2D_DNééééDn&éééDNéNyNéDNé2Dݨ_é}&݋Déé2DYn_n&ééééé2Dݨ_éééé}&݋Dééé,_݋DéNyNéDNé2Dݨ_é}&݋Déé2DYn_n&ééééY},Ñééééé2,_ݨ_}},&Ñééé2,_ݨ_}},&Ñé2DYn_݋Déé}},&Ñ,_݋Dé}Y&yéééé2,_ݨ_éééééééééééé2,_ݨ_é2,__YDyéYDyéNyNé,_݋DééY},Ñ2Dݨ_éNyNéé2DYn_n&éé}&}n&2Dݨ_ééééééé2,_ݨ_}},&Ñééé2,_ݨ_}},&Ñé2DYn_݋Déé}},&Ñ,_݋Dé}Y&yéééé2,_ݨ_ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé"C퇕߇߇߇߇߇߇utfVSfVSut߇߇߇߇߇߇"Cééés4444442Dݦ_2Dݦ_2Dݦ_Y},2Dݦ_2Dݦ_2Dݦ_2Dݦ_2mm&2mm&2mm&2mm&Mxm&Mxm&YM,_݊D}Y&x}},&2m}mDM&2,_ݦ_2Dݦ_2Dݦ_2mm&2mm&2mm&2mm&Mxm&Mxm&YM,_݊D}Y&x"C틘⋙ዙጘዙዙዘዙwufVSfVSfVSwu⋙ዙ⋙ዙጙዙ⋙"Cy4444442Cܥ^2Cܥ^2Cܥ^|X&w|܉^2Cܥ^2Cܥ^2Cܥ^2Cܥ^|X+&2+Cܥ^|X+&2+Cܥ^|2&ܥ^|X&w2+^ܥ^X2ܥ^+^l&XL|&l&2ll&2Cܥ^2Cܥ^|X+&2+Cܥ^|X+&2+Cܥ^|2&ܥ^|X&w2+^ܥ^X2ܥ^+^l&"C䐝䐝䐞㐝䐝䐝䐝fVSfVSywfVSfVS㐝㐝䐝䐝䐞䐞䐝"C}444444ڿڿڿڿڿBڈBڿڿڿڿ1Bڤ]{1%ڤ]ڿڿڿڿڿڿڿڿWWڿvڿڿڿڿڿڿڿڿڿڿڿڿڿڿ{1%ڤ]ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ1Bڤ]ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ{1%ڤ]ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿLvLڿڿڿڿڿڿLvLڿڿڿڿW{+ڿLvk%ڿڿڿWLڿڿWk%ڿڿڿڿڿڿڿڿڿڿڿڿڿLvڈBڿڿ1Bڤ]ڿڿWLڿڿڿڿڿڿڿڿڿڿڿڿ1Bڤ]ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ1Bڤ]ڿڿڿڿڿڿڿڿLvLڿڿڿڿڿڿLvLڿڿڿڿW{+ڿLvk%ڿڿڿWLڿڿWk%ڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿڿ"C敢敢敢散散敢敢|zfVSfVSfVS|z|zfVSfVSfVS|z敢敢敢敢敢敢敢"Cڿڿڿރ444444پپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپ"C癧虧虦虦虦虦癧虦癦癦虧虦癦虦虦虦蚦虦癧蚦虧虦虦虧虦虦"Cپپپ444444ԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹԹ"C霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩霩"CԹԹԹ444444ԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸԸ5&O5&OԸԸԸ444444ӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷӷM=]"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"CM=]ӷӷӷ444444ҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶҶBBBѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴѴ[T444дддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддд֩444BBBJC444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444tqsl-2.8.1/apps/help/tqslapp/stnloc3.bmp0000644000175000017500000177532615003421124020164 0ustar rmurphyrmurphyBM6(~wr_ZVQMI/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)B>;OJGib^uniyt~wra[X/,)1/-񢟝1/-/,)JFChb^uni|wa[XοοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺǹȺȺɻʼ˽̾̾Ϳ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοο㢟KFDjd`jd`-*'οοοοͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾ͿͿ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοآ-*'QMI[UR0.,οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾ͿͿ;̽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοο0.,D@>/,*οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοˠ/,*-*'-*'-*'⥠ohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbuuupppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<YgUcUcUeUfUfTgTgTgTiSjSjQkQkQkQkQkQkQkQkQkQlQlQlQlQlQlQlQlQlQlSkSjTiTgTgTgUfUfUeUcUcYh>-*'-*' L ֤L פ LפV}Y} KWۧIWŀY׫K ŀWŀ ëK } ڧI ۧIW ٦ISzU֣G yRy ԢF }䴉I ʘ;IWIWIWIWHWHWGYEZE[E[E[E]E]E]E]E]E]WYhXUhXUhXUWYE^WYhXUhXUhXUWYE^E^E^E]E[E[E[EZGYHWHWIWIWIWIX;-*'-*'W|K YQKLN֤ QKN} }WWL֤Y|  ˆ UJ פHSIU~ y { w z 9=M=M=M=N=O=O=O=O=O=O=Q=Q8/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)?;8LGDe^Zpid|to@'xZNb][/,)1/-󢟝1/-/,)GB@d]YpidghhͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾̾碟HC@f`\qqq-*'ͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;οοοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾Ϳݢ-*'NIF```0.,ͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾Ϳ.,*B=;222ͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼̽̽;;οοοοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾ҡ-*(-*'ͿͿͿͿ-*'-*'ͿͿͿͿޡohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿͿohbohb-*'-*'ͿͿͿ̾ohbohb-*'-*'ͿͿ̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'Ϳ̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohb뺺ohb-*'-*'̾̾̾̾ohb랞ohb-*'-*'̾̾̾̾ohb뎎ohb-*'-*'̾̾̾̾ohb|||vvvvvvxxxohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾̾ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾̾˽ohbohb-*'-*'̾̾˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'̾˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˽ohbohb-*'-*'˽˽˽˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˽˼˼ohbohb-*'-*'˽˼˼˼ohbohb-*'-*'˼˼˼˼ohb돏Ŀohb-*'-*'˼˼˼˼ohbuuuohb-*'-*'˼˼˼˼ohbsssohb-*'-*'˼˼˼˼ohb{{{ohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼˼ohbohb-*'-*'˼˼˼̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼˼̽̽ohbohb-*'-*'˼̽̽;ohbohb-*'-*'̽̽;;ohb½½ohb-*'-*'̽̽;;ohbohb-*'-*'̽̽;οohbohb-*'-*'̽;;οohb``ohb-*'-*';;οohb``ohb-*'-*';;οohb66·`·6```666`·66``666`·66`6``6ohb-*'-*';οohb`666·`6666·6·`6`66·6·`66·66``6Ϋ`6`·66ohb-*'-*';οohb``66·66·66·66·6666``6666`6`666ohb-*'-*'οohb``6666·66·6666``6666`6Ϋ6666ohb-*'-*'οohb``66``66·6666`6``66``6Ϋ```66ohb-*'-*'ohb``6·666·6``6666666666`66ohb-*'-*'ohb6`·``666666ohb-*'-*'ohb6·6666666ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohbͿ-*'-*'ohb𕌉::ohbͿ-*'-*'ohb𕌉::ohbͿ̾-*'-*'ohb𕌉::ې::ې::ې::ې:ffې:fff:::::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې::f:f:::f:f::fې:fې:ohbͿ̾-*'-*'ohb𕌉f:::ff::ff:ff::::ې:f:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::f:ff:۶f::f:ې::ff:۶f:fffېf::ېf::ېohbͿ̾;-*'-*'ohb𕌉ff۶::::ې::::::::ې::ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::::ې::f::::f::::f:۶::::ffff򶳮ohbͿ;;-*'-*'ohb𕌉ff:f۶:::f۶::::::ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::::ې::f::::f::::f:۶:::fffffohbͿ̾;̽-*'-*'ohb𕌉ffff::ې::ff:::f::ffff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:::۶ff:۶f::ېff۶:fff:۶f:fff::f:ff۶f:ffohbͿ̾̽̽-*'-*'ohb𕌉ff::ې::ې::ېf۶f:ې:::ېff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff:ې::ff:::ff::ff:fff::ې::::ohb̾̽̽˼-*'-*'ohb𕌉:fېff:::::fېff::::::::::222000111222222222222222000222ohb;̽˼˼-*'-*'ohb𕌉:ې::::::ې:::::ې::::::ې::::000333777<<>>000ohb˼˼ʻʻ-*'-*'ohb𕌉000<<۹ݶXBwYR8::f:::::::III^^^dddLLL::ohb˼˼˼˼-*'-*'ohb𕌉mmmT:~aV<񸷷T>z[R8:f:::f::SSSrrrvvvVVVohb˼˼˼˼-*'-*'ohb𕌉Q8z^U=YErUO6::^^^}}}aaaohb˼˼˼˼-*'-*'ohb𕌉mmmQ8~aV?T@vWO6hhh}}}kkkohb˼˼˼˼-*'-*'ohb𕌉Q8~bx\O6vvv~~~xxxohb˼˼˼˼-*'-*'ohb𕌉mmmW۹ݶXBwYR8::f::::fې::ې::f::::fې::fffffې::::::ې:f@@@DDDwwwCCC000222333222IIIKKK@@@ohb˽˽˽̾-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې:::ې:::fې:f::::f:ې:@@@@@@777***000///,,,:::@@@@@@ohb˽˽̾̾-*'-*'ohb𕌉Q8z^U=YErUO6::@@@@@@zzz111%%%...---%%%333zzz@@@@@@ohb˽˽̾̾-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6@@@@@@zzzzzzzzz***!!!---,,,!!!,,,zzzzzzzzz@@@@@@ohb˽˽̾̾-*'-*'ohb𕌉Q8~bx\O6KKKEEEzzzzzzzzzzzzzzz###---,,,%%%zzzzzzzzzzzzzzzMMMQQQohb˽̾̾̾-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::ې::ې:fffff:::ې:ff:\\\oooWWWWWWgggdddohb̾̾̾̾-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::fffffې::f:ې:::ې􉉉______ohb̾̾̾̾-*'-*'ohb𕌉Q8z^U=YErUO6::ohb̾̾̾̾-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6ohb̾̾̾̾-*'-*'ohb𕌉Q8~bx\O6ohb̾̾̾̾-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8ff::::f::::::f::::fېf::::fېfffffې::ې:fې:ohbοοοο-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::ېff::::::::fې:f:::ې:ې:ohbοοοο-*'-*'ohb𕌉Q8z^U=YErUO6::::ohbοοοο-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6ڻ컻ohbοοοο-*'-*'ohb𕌉Q8~bx\O6Եohbοοοο-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::f::::fېf::::fېfffffې::ې:fې:è::ېfff:::ې::fې:fff:::::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::fې:f:::ې:ې:ί:::fې:ې:ې::ېf::::ې:f:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ohb-*'-*'ohb𕌉Q8z^U=YErUO6::й::::::ې::ې::::ې::ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6::::::ې::ې::::ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ohb-*'-*'ohb𕌉Q8~bx\O6::ff::ې::ې::ffff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:ohb-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::::::ې::f::::fېf::::fېfffffې::ې:fې:ohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::ې::ې::ې::::::fې:f:::ې:ې:ohb-*'-*'ohb𕌉Q8z^U=YErUO6::::ې::ohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6ohb-*'-*'ohb𕌉Q8~bx\O6򶳮ohb-*'-*'ohb𕌉mmmmmmW=????????????????????????????????????????????????????????????????????????[>Uohb-*'-*'ohb𕌉2Tf::::fېf::::fېfffffې::ې:fې:<>!!!>۹ݶXBwYR8::::::::z[R8::::::::[MF<:f::::fff:::fې:::fff:::::::ې::۶:fېf:::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ohb-*'-*'ohb𕌉cKcKcKcKcK푑mmmmmmmmm2Tff:f:::f۶::::]HG`DG@^HH-*'-*'AljkVVEV; MP֤QMاQ~‚οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾ͿͿ̾̾̾;;̽̾̾ͿͿ̾̾ͿZVR¶¶¶÷~qlfVShXUhXUhXUhXUhXUhXUhXUhXUhXU~qløĸĹĹøĸunjŹŹŹŹŹźyfVSfVSfVSfVSfVSfVSfVSfVSfVSfVSzƻƻƺƺƺƺ%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD]WYhXUhXUhXUWYD]D]D]D]D\DZDZDZDYFXGVGVHVHVHVHV;-*'-*'8HxxxxxvvvvvvvvvvvvvvkihYVfVSkivvvvvvvvvvvvvwyyyyʮ'-J-*'-*'cV7<8. 13οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾ͿͿͿͿ[WS℁~fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~|||||||||||||mkhYVhYVmk||||||||||}}}ͱ*0L-*'-*'  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿοͿͿͿ[WS冃fVSiYVFO䄌τфӄӄփ׃كۃރ߃ₐゐ悐灐灐遐omhYVfVShYVom遏邏炏悏わハ჎߄݄ۄلׅօӅӅѵ.3N-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿͿ[WSꊇfVSiYVOX萙אِِؐݐݐᐚ䐚君珛鏛돛쎛펛펛fVSfVSurfVSfVS펚폚폚돚鏚萚呛呛㑛ᑛߑݑّّܑؼ49Q-*' οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ[WS댉䜒fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST^阠٘ۘݘݘᘢ㘢嘢嘣阣阣엣헣yvfWUfWUfWUyuyufWUfWUfWUyu혢혢뙣陣虣噣噣㙢ᙢߙݙݙ8=S᠞+*)A/.,*οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ[WSZb렦ݠݠࠦᠨ㠨䠨堩蟪韪럪ퟪퟫ젪頪顩衩塩䡧㡧ᡧࡧ;@U.,*GECC0.+(οοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾Ϳ[WS_f᦬᦬᦬㦭夭央褮餮뤯쥮륮饮祮姭䧭㧭᧭?BV衟-*'b`](,οͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾[WT`iᬱᬲ䬳嬳嬴謴髴骳荒הּ쬴鬳鬳笳嬳嬲䬱?DY렝b`]{xua@=4$ .+(.,*cbadmBFZ/-+.+(c`^{xuuTTR73% -*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'\ZWmjg{tqsl-2.8.1/apps/help/tqslapp/stnloc5.bmp0000644000175000017500000277407615003421124020170 0ustar rmurphyrmurphyBM> 6( (r h' S1#L>8/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)%%%111777<<<@'xZNb][/,)1/-𢟝1/-/,)OOOooo}}}ghhͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾̾Ϳ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻᢟPPPrrrqqq-*'ͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼̽̽̽̽;οοοοοοοοοͿͿͿͿͿͿͿͿͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾ͿͿͿ;̽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻ˼բ-*'WWW```0.,ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˼˼˼˼˼˼̽̽̽;;οοοοοοοοοοͿͿͿͿͿͿͿ̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾ͿͿͿ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼˼.,*III222ͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˼˼˼˼˼˼̽̽;;οοοοοοοοοοοͿͿͿͿͿͿ̾̾ͿͿοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼Ǡ222-*'ͿͿͿͿ˼˼˼˼-*'-*'ͿͿͿͿޢohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb˼˼˼˼-*'-*'ͿͿͿͿohbohb˼˼˼˼-*'-*'ͿͿͿͿohbohb˼˼˼˼-*'-*'ͿͿͿͿohbohb˼˼˼˼-*'-*'ͿͿͿͿohbohb˼˼˼˼-*'-*'ͿͿͿͿohbohb˼˼˼˽-*'-*'ͿͿͿͿohbohb˼˼˼˽-*'-*'ͿͿͿͿohbohb˼˼˼˽-*'-*'ͿͿͿͿohbohb˼˼˽˽-*'-*'ͿͿͿ̾ohbohb˼˽˽˽-*'-*'ͿͿͿ̾ohb뺺ohb˼˽˽˽-*'-*'ͿͿͿ̾ohb랞ohb˼˽˽˽-*'-*'ͿͿ̾̾ohb뎎ohb˽˽˽˽-*'-*'Ϳ̾̾̾ohb|||vvvvvvxxxohb˽˽˽˽-*'-*'Ϳ̾̾̾ohbohb˽˽˽˽-*'-*'Ϳ̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾̾ohbohb˽˽˽˽-*'-*'̾̾̾˽ohbohb˽˽˽̾-*'-*'̾̾̾˽ohbohb˽˽˽̾-*'-*'̾̾̾˽ohbohb˽˽˽̾-*'-*'̾̾˽˽ohbohb˽˽̾̾-*'-*'̾˽˽˽ohbohb˽̾̾̾-*'-*'̾˽˽˽ohbohb˽̾̾̾-*'-*'̾˽˽˽ohbohb˽̾̾̾-*'-*'˽˽˽˽ohbohb̾̾̾̾-*'-*'˽˽˽˽ohbohb̾̾̾̾-*'-*'˽˽˽˽ohb돏Ŀohb̾̾̾̾-*'-*'˽˽˽˽ohbuuuohb̾̾̾̾-*'-*'˽˽˽˽ohbsssohb̾̾̾̾-*'-*'˽˽˽˼ohb{{{ohb̾̾̾̾-*'-*'˽˽˼˼ohbohb̾̾̾̾-*'-*'˽˽˼˼ohbohb̾̾̾̾-*'-*'˽˽˼˼ohbohb̾̾̾̾-*'-*'˽˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼˼ohb½½ohb̾̾̾̾-*'-*'˼˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼˼ohbohb̾̾̾̾-*'-*'˼˼˼̽ohb``ohb̾̾̾̾-*'-*'˼˼̽̽ohb``ohb̾̾̾̾-*'-*'˼˼̽̽ohb66·`·6```666`·66``666`·66`6``6ohb̾̾̾̾-*'-*'˼˼̽̽ohb`666·`6666·6·`6`66·6·`66·66``6Ϋ`6`·66ohb̾̾̾̾-*'-*'˼̽̽;ohb``66·66·66·66·6666``6666`6`666ohb̾̾̾̾-*'-*'̽̽;;ohb``6666·66·6666``6666`6Ϋ6666ohb̾̾̾̾-*'-*'̽̽;;ohb``66``66·6666`6``66``6Ϋ```66ohb̾̾̾̾-*'-*'̽̽;οohb``6·666·6``6666666666`66ohb̾̾̾̾-*'-*'̽;;οohb6`·``666666ohb̾̾̾̾-*'-*';;οohb6·6666666ohb̾̾̾̾-*'-*';οοohbohb̾̾̾̾-*'-*'οοohbohb̾̾̾̾-*'-*'οοohbohb̾̾̾̾-*'-*'οohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohbohb̾̾̾̾-*'-*'ohb𕌉ohb̾̾̾̾-*'-*'ohb𕌉ohb̾̾̾̾-*'-*'ohb𕌉ohb̾̾̾Ϳ-*'-*'ohb𕌉ohb̾̾̾Ϳ-*'-*'ohb𕌉ohb̾̾̾Ϳ-*'-*'ohb𕌉ohb̾̾ͿͿ-*'-*'ohb𕌉uuuppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppuuuohb̾ͿͿͿ-*'-*'ohb𕌉䏏ohb̾ͿͿͿ-*'-*'ohb𕌉uuuuuuohb̾ͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉ppppppohbͿͿͿͿ-*'-*'ohb𕌉ppps:q8s9s:t:t:t:s:q8r:pppohbͿͿͿͿ-*'-*'ohb𕌉pppr8u;~@FOV\^^\VOF@u;r9pppohbͿͿͿͿ-*'-*'ohb𕌉pppp7t9DSdlqsuvwvtqleSDu9q7pppohbͿͿͿͿ-*'-*'ohb𕌉pppp6v:GYmppqsuwyyxvtrqqnZGv:p6pppohbͿͿͿͿ-*'-*'ohb𕌉pppp6~?Rfklmpruwyz{zxvsqnmlfR~?p6pppohbͿͿͿͿ-*'-*'ohb𕌉ppps8C^hghkmpruw{|}|yvsqnlihi_Cs8pppohbͿͿͿͿ-*'-*'ohb𕌉pppr8G]ecehjjjmoqsuvtqpmkjkifdf^Hr8pppohbͿͿͿο-*'-*'ohb𕌉ppps8F`a`behicԨxժ{֫{׫{ج{٬{ج{ج{׫{֪{ժ{ԩ{djifcabbGs8pppohbͿͿοο-*'-*'ohb𕌉pppp6AY^]`beghbdihfca^_ZBp6pppohbͿοοο-*'-*'ohb𕌉pppp5{=W[Z\_adfg_bhheb`][\X|=p5pppohbͿοοο-*'-*'ohb𕌉pppt9JZWY[^`cef_̟p͡rѭѭ̡r̠r_gfda_\ZX[Kt9pppohbͿοοο-*'-*'ohb𕌉pppo6ATTUXZ]_bdfeder%Ȼt)eeegec`^\ZWUVBo6pppohbοοοο-*'-*'ohb𕌉ppps8LTRTWY\^`befiis%ȼu)iihfdb_]ZXUSUMs8pppohbοοοο-*'-*'ohb𕌉pppp6|>RPQSVXZ\_acefgq%ȹs)ggedb`^\YWURPS}?p6pppohbοοοο-*'-*'ohb𕌉ppps8FOMPRTVY[]_acdep%ȸr)eedb`^\ZXVSQOPGs8pppohbοοοο-*'-*'ohb𕌉pppw;MLLOQSUWY[]_`bbo%ȷq)bca`^\ZYVTRPMMNx;pppohbοοοο-*'-*'ohb𕌉pppo4{=MLLMOQSVWY\_abao%ȵq)`a_^\ZYWTRPNLLN}>o4pppohbοοοο-*'-*'ohb𕌉pppo6@QS UY]di"m&p(t,w.z2~6ŀ8ŀ8Nӻ~@omf`ZXVUSQNMLLL@o6pppohbοοοο-*'-*'ohb𕌉pppp6J h(m/o1q4s5t6u6w6w6y6z6{6{6}6|5MXŃ?Ń?ĄAŇG>t-cUQOMLLLLBp6pppohbοοοο-*'-*'ohb𕌉pppp6Or6u:u:u:u:u:w:x:y:z:{:|:}:~:}:QT}9~:}:}:~=CMT~Et6c!UMLKBp6pppohbοοοο-*'-*'ohb𕌉pppp6Ru;w>w>w>w>w>x>y>z>{>|>}>}>~>~=TX~=>~>}>|>|>z>z>|C~GJIx>d!MBp7pppohbοοο-*'-*'ohb𕌉pppp7Uy@{B{B{B{B{B{B{B|B}B~B~B|@}A|?X\ABBB~B}B|B{B{B{B{B{B{COV_(q7pppohbοοο-*'-*'ohb𕌉pppq7U{C}F}F}F}F}F}F}F}F~FF~EyAܿۿƯ_FFFFF~F~F}F}F}F}F}F}F}FMf2r8pppohbοοο-*'-*'ohb𕌉PUXPUXSXYpppfffff۶ې:fې::ې::ffff::::ې::ې::::ې:::::ې::ې:ff::ې:::fې::ohb-*'-*'ohb𕌉 霟::::ې::::ې::::ff:ې:ېf::ې::f:ff:::ې::f::::pppy;FÒdÐ`Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_[jk[Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Ï_Đ`ˠxI {=pppf:f:f:f:::۶ffff::ې::ې::::ې:::::ې:::۶:fې::۶:fېfff:::::ffohb-*'-*'ohb𕌉ꑙ::::ې::::ې::::ې::ffffff::ff۶::::ې::ې::::::ppp}?r<ǕgƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdƒdfgƒcƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdƓdənP@ppp:ې:fې:fffffffff::ff:ff:ff::::ېf:::ېf:۶fff:::f::ffohb-*'-*'ohb𕌉mmmmmmmmmmmmmmmmmmS:N7}x덈M7P7::ې::ې::::ې:::::fffffff:::::f::ې::::::ppp}>TdǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhƔgˣˤƓfǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhǕhƛr[@ppp:fېfffې:fې:::ې:f:f::::ې::ff:::ې:fې::ې:fې::fې::f::fې::ohb-*'-*'ohb𕌉V;y\Z@jlmrtvS:wYS9:::ې:ې:::ff::ff:ff::fffff:ff::ېff::ff:f:ff:pppEp;͟vʘlʘlʘlʘlʘlʘlʘlʘlʘlʘlɗkЫѬȖjʘlʘlʘlʘlʘlʘlʘlʘlʘlʘlϤ}{HHpppff::::f::::::f::::fېf::::fېfffffې::ې:fې:ohb-*'-*'ohb𕌉mmmT:|^Z?UVWUVW붵XByZQ8::ff۶::ې::ff::ff::ې:f:fې::::ff::ې::ېff::ffpppH R×mΡy˛p˛p˛p˛p˛p˛p˛p˛p˛p˛oΤΥ˚o˛p˛p˛p˛p˛p˛p˛p˛p˛pϢzȠyWJ ppp::::ېff::::::::fې:f:::ې:ې:ohb-*'-*'ohb𕌉T:{^Y>۹ݶXBwYR8::f:::::::pppRf-ɟyϡyΞtΞtΞtΞtΞtΞtΞtΞtΞt͝sٵٶ͝sΞtΞtΞtΞtΞtΞtΞtΞtΞtТzͧl3Uppp::::ohb-*'-*'ohb𕌉mmmT:~aV<񸷷T>z[R8:f:::f::ppp\ yEհҥϡxϡxϡxϡxϡxϡxϡxϡxϡxϡyز¨éسϡyϡxϡxϡxϡxϡxϡxϡxϡxϡxҦ״}J_#pppohb-*'-*'ohb𕌉Q8z^U=YErUO6::pppf,SҰխѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}Ѥ}ѥ}֭ճZi/pppohb-*'-*'ohb𕌉mmmQ8~aV?T@vWO6pppp8RִڶӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧӧڵظXs;ppp::ff::f:ېohb-*'-*'ohb𕌉Q8~bx\O6ppp}JS̩۷֬ժժժժժժժժժժժժժժܷ֬ϬWLppp::f:::::ohb-*'-*'ohb𕌉mmmW۹ݶXBwYR8::f::::fې::ې::f::::fې::fffffې::::::ې:fpppjj_pppohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې:::ې:::fې:f::::f:ې:pppjj_pppohb-*'-*'ohb𕌉Q8z^U=YErUO6::pppv{lla++pppohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6pppnnc//pppohb-*'-*'ohb𕌉Q8~bx\O6ppp nnc33 pppohb-*'-*'ohb𕌉mmmmmmW>$$ºpppohb-*'-*'ohb𕌉pppZZrAA.-ºûpppohb-*'-*'ohb𕌉2^^Rjjppp""""""""""""""""""""""""""""""%%ED""""""""""""""""""""""""""""22úĻŽpppohb-*'-*'ohb𕌉㑑2T::f:::ې:::f:ې:ppp''''''''''''''''''''''''''''''''''..DD''''''''''''''''''''''''''''''''77¹ûļŽƾpppohb-*'-*'ohb𕌉㑑2T::f:fې:f:::::f::ې:::ppp,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<<ºûļŽƾǿpppohb-*'-*'ohb𕌉푑2T:::ېf::ff::ې::::ff:fې::ppp000000000000000000000000000000000000000000000000000000000000000000000000UUºûżƾǿpppohb-*'-*'ohb𕌉cKcKcKcKcK푑mmmmmmmmm2T::ې::ې::fff:::::::ې::::ppp55555555555555555555555555555555555555555555555555555555555555555555YX¹úļŽƾǿºpppohb-*'-*'ohb𕌉2T::ff::fff:::f::ې::ppp::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::]\ºûļŽƾǿûpppohb-*'-*'ohb𕌉2T::f۶f:::fې::f:::ff:fېppp?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>`_ºûļŽƾļpppohb-*'-*'ohb𕌉2Tf::::fې::fffffې::::::ې:fpppCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCccúĻżƾǿŽpppohb-*'-*'ohb𕌉2T:ې:::fې:f::::f:ې:pppHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHggúļŽƾǿǿpppohb-*'-*'ohb𕌉Jff""""""""TpppMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLkjûļŽƾǿpppohb-*'-*'ohb𕌉mmmVVzpppRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQRQomûļƽǿpppohb-*'-*'ohb𕌉pppVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVmmĻŽƾǿpppohb-*'-*'ohb𕌉mmmppp[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]Žƾǿpppohb-*'-*'ohb𕌉PUXPUXSXY۹ݶXBwYR8::f::::fې::ې::::ې::ې:fffff:::ې:ff:ppp揎揎揎揎揎揎揎揎揎揎揎揎揎挋ĿǿΏ収揎揎揎揎揎揎揎揎揎揎揎揎欪֞ppp::f:::ohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::fffffې::f:ې:::ېppp锓锓锓锓锓锓锓锓锓锓锓锓酄·є蔓锓锓锓锓锓锓锓锓锓锓鯭١ppp::ې::ې::ې::fې:::::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f:::::::f:::fې::ې:::f::ې:ې::ffff:::::ې::fff:::ې::::fff::::::f:::fې::ې:::fohb-*'-*'ohb𕌉Q8z^U=YErUO6::ppp환환환환환환환환환환|ĺԙ왘환환환환환환환환ۥppp::ffff::fff:fff:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f:::::ff::ff:fې:f::::ې:ff::ې:f:::ېf:::ې::::ې::ې:::ې:::ې:ې:::::fې:ې::ff::ff:fې:f::::ې:ffohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6ppp|Ǿםީppp::::ې::::ې::::ې::ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶:::::ې::ې:ff::ې:::fې::fffff۶ې:fې::ې::ffff::::ې::ې::::ې:::::ې::ې:ff::ې:::fې::ohb-*'-*'ohb𕌉Q8~bx\O6ppp~ڢ᭩ppp::ff۶:f۶:::f::ې:fff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::::۶:fې::۶:fېfff:::::fff:f:f:f:::۶ffff::ې::ې::::ې:::::ې:::۶:fې::۶:fېfff:::::ffohb-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8f33Z33Z333333333333Z3333333333333333Z333333333333333333ZZ3333ppp؇}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}pppohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R83Z3333333333333333Z3333333333333333Z333333Z3333Z33333Z333Z333fpppyzrnnnnnnnnnnnzxnnnn{nnnnnnnnnnnrzypppohb-*'-*'ohb𕌉Q8z^U=YErUO6f33333333333333333333333Z3333333333333333Z333333333333333333333333333333333333333pppkic^^^^^^^^^^^^^^^^^^^^^^^^^^bikpppohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO63333333333333333333333333333333333333333333333333333333333333333333333333333333333fppp[WRNNNNNNNNNNMNNNNONNNNNNNNNNRW[pppohb-*'-*'ohb𕌉Q8~bx\O6f3333333333333333333333333333333333333333333333333333333333333333333333333333333333pppKFB???????????????A??????????BFKpppohb-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::f::::fېf::::fېfffffې::ې:fې:ppp#bj'pppohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::fې:f:::ې:ې:ppp4y9pppohb-*'-*'ohb𕌉Q8z^U=YErUO6::pppKRpppohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6ppp %bd' pppohb-*'-*'ohb𕌉Q8~bx\O6ppp  pppohb-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8::f::::fې::ې::::::::ې::f::::fېf::::fېfffffې::ې:fې:pppbnnnnnnnnlppp::::::ې::ې::ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::::۶:fې::۶:fېfff:::::fff:f:f:f:::۶ffff::ې::ې::::ې:::::ې:::۶:fې::۶:fېfff:::::ffohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::ې::::::ې::ې::ې::::::fې:f:::ې:ې:pppppp::ff::ې::ې::ff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:::ېf:::ېf:۶fff:::f::ff::ې:ې:fې:fffffffff::ff:ff:ff::::ېf:::ېf:۶fff:::f::ffohb-*'-*'ohb𕌉Q8z^U=YErUO6::::ې::pppppp::::ې:::ې:ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff:ې:fې::ې:fې::fې::f::fې::ې::ې:fېfffې:fې:::ې:f:f::::ې::ff:::ې:fې::ې:fې::fې::f::fې::ohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6pppppp:::::::fېff::::::::f::::fېf::::fېfffffې::ې:fې:ff::::f::::::f::::fېf::::fېfffffې::ې:fې:ohb-*'-*'ohb𕌉Q8~bx\O6uuuuuu::ې::ې::ې:::ې:::::ې::::::ې::::::fې:f:::ې:ې:::::ېff::::::::fې:f:::ې:ې:ohb-*'-*'ohb𕌉mmmmmmW۹ݶXBwYR8::::::::pppxxxݽǨġƢȤ˧̨ΪԵ|||pppohb-*'-*'ohb𕌉mmmmmmT:~aV<񸷷T>z[R8::::::::pppxxx޾ʪǣɥ˧ͩϫѭն|||pppohb-*'-*'ohb𕌉Q8z^U=YErUO6::pppxxx࿿гЯѰӲԴֶ׷۾|||pppohb-*'-*'ohb𕌉mmmmmmQ8~aV?T@vWO6pppxxxNJ|||pppohb-*'-*'ohb𕌉Q8~bx\O6pppxxx|||pppohb-*'-*'ohb𕌉mmmmmmW[Mppp:f::::fff:::fې:::fff:::::::ې::۶:fېf:::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::ohb-*'-*'ohb𕌉cKcKcKcKcK푑mmmmmmmmm2Tff:f:::f۶::::pppCzHc4!% ) . 3 7=BGMQV]bgnsx!"$%<[Hppp:fff۶::ff:::ې:ېf:ff:::ې:::::ff::fې:ffffېf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ohb-*'-*'ohb𕌉2Tf:ې:::ې::fې::::f:f:::fpppD{Oo!= - 0 5 :?DINTY^djov{ !#$'<_Ippp:fې::::::ې::ې::ې::::ې::::::ې:::۶f:ff:ffff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ohb-*'-*'ohb𕌉2T::ې::ې::ffffff۶::ff::f:pppCzKm&G7 ;?DJNSZ_dkpu| !#$(?\Gppp:::::f::ې::ې:f:::::::f:fېff۶f:f:ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ohb-*'-*'ohb𕌉2T::ېf:ې::f::ff:ې::f:fffې:pppD}Lr&O@EJPTY`ekqv|!"#%&=\Hpppf::fff::ff::۶ff::ff:ff:ff::ff:ffff:fff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:ohb-*'-*'ohb𕌉2T::ې:fff::ېf:::ېpppR`qMS(ZNQW\ahmsy~!"#%(=_Dppp::ې::ff::ې::ې:ې:::ې::ې::ff::ې::ېf:f:ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ffohb-*'-*'ohb𕌉Jff""""""""TpppbhogD~O-eX]bhnsy!"$%)@]Dppp:fff:::fېff::::::::ohb-*'-*'ohb𕌉mmmVVzpppbhpmGvEQ-ncinuz !#$&'>]Hpppff:::ې:::::ې::::::ې::ohb-*'-*'ohb𕌉pppciqqOzN~GW0zrv| "#$&)>`Dpppohb-*'-*'ohb𕌉mmmpppdjruTXePT5} "#$&)A]Dpppohb-*'-*'ohb𕌉pppekryX\buFV6!"#%'(?]Hpppohb-*'-*'ohb𕌉pppels}^agmuE\9&%'*?aDpppohb-*'-*'ohb𕌉pppfltс˃ΖhnuEZ=)*A]Dpppohb-*'-*'ohb𕌉2^^RjjpppXY[fltfmtfmugnuXY[H[>@^Hpppohb-*'-*'ohb𕌉㑑2T::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې:pppFaaEpppohb-*'-*'ohb𕌉㑑2Tf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ېf::ېpppFFpppohb-*'-*'ohb𕌉푑2Tff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ffppppppohb-*'-*'ohb𕌉cKcKcKcKcK푑mmmmmmmmm2Tff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ffppppppohb-*'-*'ohb𕌉2Tff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:f:ffppppppohb-*'-*'ohb𕌉2Tff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff::ppppppohb-*'-*'ohb𕌉2T:fېff::::::::uuuuuuohb-*'-*'ohb𕌉2T:ې:::::ې::::::ې::葑ohb-*'-*'ohb𕌉Jff""""""""Twwwppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppwwwohb-*'-*'ohb𕌉VVzohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ϕ󕌉ohb-*'-*'ohb𕌉ѕ󕌉ohb-*'-*'ohb𕌉TTҖvv00ҴҕTTҖohb-*'-*'ohb𕌉UԗUww00ԶԕUԗUohb-*'-*'ohb𕌉1Wؚz1WؚWz1ع1zؚWz1Wؚz1z1zz11عWWW1z11عWWW1z11عz1Wؚzz11عzz11عWz1ؕ1zWWWW1z11zz11zz11عWz1zz11عWz1zz11عzz11ع1zWz1z1zz11عWWW1z11عzz11عzz11عz1ؚWWWW1z11عWz1z1z1عWz1ohb-*'-*'ohb𕌉{11ڻڜWڜW1{W1Wڻ{{{11ڻ1{{1ڻڜW{1{{11ڻW{1ڻWڜW{{11ڻ{{11ڻ1{{1ڻ{W1ڜ{{11ڻWڜW1{W{{11ڻ{{11{{Wڻ11{ڻ{ڕ1{WڜWW{{11ڻ1{{1{{11{{11{{Wڻ11{{{{11ڻ1Wڻ{{{11{{11ڻ{{11ڻ1{WڜWWڜWڜW{{11ڻ{W1ڜ{{11ڻ{{11ڻ{{11ڻ1{ڜW{{11ڻ1{{1ڻ{W1ڜWڜW{ڻ{Wڻ11{ڻ{ohb-*'-*'ohb𕌉{11ۼ{{11ۼ{X1X{1ۼ{{11ۼۜ1Xۼ{{{11{{11ۼۜ1X{{{11ۼ{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11{{11ۼ{X1{{11ۼ{{11ۼۜXXۜە::ېfې:fff:::fff:::ې:f:::::f:f:ffff:::fff:::ې:f::::fې:1Xۼ{{11ۼ{{{11{{11{{11ۼۜXX{{11X{1ۼ{{11{{11ۼ{{11ۼۜ1Xۼ{{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11ۼ{{11{{11ۼ{11ۼ{{{11ۼ{{11ۼ{{11ۼۜXXۜohb-*'-*'ohb𕌉}22ݾ}}22ݾ}Y2}}22ݾ}}22ݾ}}22ݾݝYY}}22ݾݝ2Y}}2Y}}22ݾ}2}2ݾ}}22ݾ}}22}}22ݾ}Y2}}22ݾ}}22ݾYYݝݕf:::ېf::::ې:ېf:::ff:۶f::::::ff:۶f:f:::ې:ېf:::ff:۶f::::ېf::ې}22ݾ}2}2}}22}}22ݾYYݝ}}22}}22ݾ}}22}}22ݾ}}22ݾ}}22ݾ}2Y}}22ݾ}}22ݾ}}22ݾ}}22ݾ}}22}}22ݾ}2}2ݾ}}22ݾ}2YݝYYݝohb-*'-*'ohb𕌉55^^5ɨ^^^5555^^ɨ55Ʉ^^^^555^^^55Ʉ55^^5ɨ^5^^5^5^^때ff::ې::ې::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::ې::f:۶::::ff^5^^55Ʉ55^5^^ɨ55^^555^^5^5^^555^55Ʉ55Ʉ55Ʉ555^^^55ɨ^^55^5^^ohb-*'-*'ohb𕌉555^555^ʄ55^555^^55ʄ55^^55ʄ5^^555ʄ5^쨄55^^55알ff::::ې::ې::ې::f:۶::::::::f:۶::::ې::ې::ې::f:۶::::ff55ʄ55ʄ55ʄ5555ʄ55ʄ55ʄ55^^55ʄ55ʄ55^^5^^555^5ʨ^^55ʄ5ʄ555ʄ55ohb-*'-*'ohb𕌉555̅5_̅555핌ff::ff::ې::ff:۶f:ff:::ff:۶f:fff::ې::ff:۶f:ff:f:ff5___55̅555___55_555ohb-*'-*'ohb𕌉555Ά555Ά55ff:ې:::ې:ff:::ې:f::ff:::fff::ې:ff:::ې:f::ff::``55Ά5555``55Ά55Ϊ5`Ά5555ohb-*'-*'ohb𕌉𕌉:fېff::::::::66·66``ohb-*'-*'ohb𕌉񕌉:ې:::::ې::::::ې::ohb-*'-*'ohb𕌉򕌉ohb-*'-*'ohb𕌉򕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohb𕌉ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohb̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼ohb-*'-*'ohbohb-*'-*'ohb3~b8Z~ohb-*'-*'ohb[3߮6Y~ohb-*'-*'ohbމa2ޮ6Y}ohb-*'-*'ohbܮ6X|ܮ6X|6X|܉2[ܮX[[[3|a363X|[[6X|܉26|ܮ6X|ܮ6X|ܮXр2܉26|ܮXX3|a363X|[[6X|܉26|ܮ6X|ܮ6X|܉233|a363X|6X|6X|aa❮6X|a26X|6X|ܮ6X|܉23܉2[6X|[[6X|6X|ܮ6X|ܮXX3|a363X|[[܉2[ܮ6X|ܮ6X|܉2[6X|6X6[XXohb-*'-*'ohbڬ6W{ڬ6W{6W{W~1ڇ{2{~16W{`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{ڬ6W{ڬWWڇ`12{~1`ڇ2໇61{6W{ڬ6W{WWڇ`16W{ڬ6W{`Wڇ{`ڇ2໇61{6W{6W{6~~16W{WW6~6{6W{ڬ6W{`Wڇ{W~1ڬ6W{ڬ6W{ڬ6W{6W{ڬ6W{2{~1`ڇ2໇61{6W{ڬW~1ڬ6W{ڬ6W{W~1ڬ6W{W~1ڇ`1ohb-*'-*'ohb٫6Wz٫6Wz6Wz`1ߛ6~Y6Wzه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz٫6Wzه`1ߛYW`1ߛه`1ߛ62zz6Wz٫6Wz`1ߛYW6Wz٫6Wz2zWه`1ߛ62zz6Wz6Wz6~W6Wzه21ߺ٫6Wz6Wz٫6Wz2zWه`1ߛ٫6Wz٫6Wz٫6Wz6Wz٫6Wz`1ߛه`1ߛ62zz6Wzه`1ߛ٫6Wz٫6Wz`1ߛ٫6Wz6Wz2zWohb-*'-*'ohb׫6Vy׫6Vy6Vy1Yׇ1V6Vy`6y6Vy׫6Vy`1ޚYV6Vy׫6Vy׫6Vyׇ`1ޚYV`1ޚ`6y6Vy׫6Vy`1ޚYV6Vy׫6Vyׇ`1ޚ`6y6Vy6Vy1}1׫6Vyׇ21޹׫6Vy6Vy׫6Vyׇ`1ޚׇ1Y6Vy׫6Vy׫6Vy6Vy׫6Vy`1ޚ`6y6Vyׇ1Y׫6Vy׫6Vy1Y6Vy6VyYVohb-*'-*'ohb֪VV5Vy5Vy5Vy`}12yV֪5Vy֪5Vy5Vy֪5VyVVֆ51yVY``ݙ֪5Vy֪VVֆ51y2y}1֪5Vy5Vy֪5VyVVֆ51yVY``ݙֆֆ21ݸ֪5Vy5Vy5Vy`֪Y֪5VyVV5}5yVY``ݙֆֆ21ݸ֪5Vy`}1V}1֪5Vy֪5Vy5Vy֪5Vy2y}1֪5Vy5Vy֪5Vy`}1֪V5y5Vy`}15VyV2ݸ51yohb-*'-*'ohbԪ5UwԪ5Uw5UwԆ0_ۗԪU{0ԪUXXXUX5UwԆ0UԪ5U_{w{0Ԫ5UwԆ0U1wUXXUX5UwԆ0UԪ5U_{w{0Ԇ_0ۗXXԪ5Uw5Uw1wU5UwԆ0{05Uw5U_{w{0Ԇ_0ۗԆ0_ۗ5U5XUX5UwU{05Uw1wUXXUXԆ0_ۗԪ5UwԪ5UwԆ0_ۗ5Uw5Uw0{0ohb-*'-*'ohbԩ5Uwԩ5Uw_ԅ1۶ԩ5Uwԩ5Uwԩ5Uwԩ5Uw1wUԩ5Uw5Uw1wUԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwԩ5Uwohb-*'-*'ohb8\ɀ8\ɀb38\ɀ8\ɀ8\ɀ8\ɀ3\8\ɀ8\ɀ3\8\ɀ\\8\ɀ8\ɀ8\ɀ8\ɀohb-*'-*'ohb]ӄ484ʂ8]ʂbb84ʂ8]ʂ84ʂ558]ʂ8]ʂ84ʂ5584ʂb584ʂ8]ʂ8]ʂ8]ʂohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'쪦rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾ͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾ͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿο-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿ;̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾ͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾ͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾̾̾ͿͿͿͿͿͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽̾ͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾ͿͿͿͿ-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾ͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾ͿͿͿ-*'-*' οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾ͿͿͿͿͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾ͿͿ-*'-*'aV  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾Ϳ-*'-*'HwX οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾Ϳ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾ͿͿͿ-*'-*' %XksbPοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾ͿͿ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾ͿͿͿ᧠xrl[WR[WR\WS\WS\WS\XS\XS\WS\XS\XT\WS\XT\XT\XT\XT\XT\XT\XT\XT\XT\XT\XT\XT\XT\XU]XU]XU]XU^ZW^ZW_[W_[W_[W_[W_[W^ZW]YV]YV_[X]YV\XU\XU\XU]YU_[W_[W_[X_[X_[X_[X_[X&b&S&S&S'T(T (V!)V!*W"+X$-X%-Y%.Z'/Z'0[(0])1])1])1])1^)1])1])1])2])1])1])1[)1\)1])1])1])1[)1[)1Z)0Y(/X'.W%-V%-U$+T#*S")Q (P (P+4gYa-*'-*'Cxe #PNդM۩N}ņοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾Ϳ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾ͿͿͿ_[W{.<꯵ܯޮ߮୵୵⭵㭷䭷䫹諹諹꫹뫹뫹쫹쫹쫹쫹쫹쫹쭻묺鬺ꬹ鮸殶家䮶᮶ⴺ⮲Α*.O-*'-*'-.fvh#(ۧJRÂQOئKƒ}οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾ͿͿ̾;̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿ̾̾̾̾̾̾̾̾̾ͿͿͿͿͿ林ǾƾƾǾƽǾǾƾǾȾȾǾǾȿȿǾǾȿȿȿȿȿՀwr(5r|r}p}p~p~ppppooonnllllllllllmmmmmmmoopppqqqqquɟՙX[-*'-*' 6~je #QĂRӭOMܫO~οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾Ϳ;;̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿ̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿqlgŽϿºº»|smûûûûûûûûûû»»»ûûûûûûüûûûû#.}dpdpdqdqcrcrcrbtbvbv`v`x`y`y`z`z`z`z`z`z`z`{`za{a{a{a{a{a{a{a{azayaycwcwcwcudsdsdsererq{!&O-*'-*'-*'-*'AljkVVEV; NP֤QMاQ~‚οοοοͿͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻɻ˽̾̾Ϳ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿ̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿ\WSķ÷ĸĸ÷÷ĸqmhXUhXUhXUhXUhXUhXUhXUhXUhXUhXU~qlŸƹƹƹŹŹuojƺƺƺƺƺƺzfVSfVSfVSfVSfVSfVSfVSfVSfVSfVSzƻƻźźźź%xHUHVHVHVHVGVGVFYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYE]WYhXUhXUhXUWYE]E]E]E]E]E[E[E[EZGYHWHWIWIWIWIW;-*'-*'8HxxxxxvvvvvvvvvvvvwwkihYVfVSkiwwwwwwwwwwwwwwyyyyˮ'-J-*'-*'cV7<8. 13οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿ;̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼̽̽̽̽̽̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽ͿͿͿͿͿͿͿͿͿͿ\XT℁~fVSfVSfVSfVSfVSfVSfVSfVSBL~~~~~||||||||||||}nkhYVhYVnk}}}}}}}}}}}}}α*0L-*'-*'  οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾̾ͿͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼̽̽̽̽̽̽̾̾̾̾̾˽˽˽˽˽˽˽˽˽̾ͿͿͿͿͿͿͿͿ\XT䇃fVSfVSFOㄌ΄Є҄҄Ճփ؃ڃ݃ރ႐ゐ悐灐灐邐pmhYVfVShYVpm邐郐烐惐バㄐℏބ܄ڄ؅ׅԅԅҵ.3N-*'-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼̽̽̽̽̽̽̽̾̾̾̾˽˽˽˽˽˽˽˽̾̾ͿͿͿͿͿͿ\XTꊇfVSfVSOX琙֐אؐؐܐܐߐ㐚䐛珛鏛돛쎛펛폛fVSfVSurfVSfVS폛퐛퐛됛鐛鑛摜摜䑜⑜ޑݑڑڑټ49Q-*' οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾Ϳ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼̽̽̽̽̽̽̽̽̾̾˽˽˽˽˽˽˽˽˽̾̾̾̿ͿͿͿͿͿ\XT쌉䜒fVSfVSfVSfVSfVSfVSfVSfVSfVSfVST^蘠ؘژܘܘߘ☢䘢䘣阣阣엣헣yvfWUfWUfWUyvyvfWUfWUfWUyv홣홣왤Ꙥ除晤晤䙣♣ޙޙ8=S䠞,*)A/.,*οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ̾̾ͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ̽̽̽̽̽̽̽̽̾̾˽˽˽˽˽˽˽˽̾̾̾̿̿̿ͿͿͿͿͿ\XTZbꠦܠܠߠࠨ⠨㠨䠩蟪韩럪ퟪퟫ꠫ꡪ顪桪塨䡨⡨ᡨ;@U.,*GECC0.+(οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻɻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ̽̽̽̽̽̽̽̽̾˽˽˽˽˽˽̾̾̾̾̿̿̿̾ͿͿͿͿ\XT_f즬ববব⦭䤭䤮褮餭뤮쥯ꥯ襯槮姮䧮⧮?BV롟-*'c`](,οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻɻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻ˽̾̾Ϳ̾̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ̽̽̽̽̽̽˼˼˽˽˽˽˽˽̾̾̿̿̿̿̾̾ͿͿ\XT`i쬱଱ଲ㬳䬳䬳謴髴髳荒ꬴꬴ謴欴欳嬲?DYc`]|xua@=4$ .+(.,*cbbdmBFZ/-+.+(da^|xuuTTR73% -*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*'-*']ZXmjg|tqsl-2.8.1/apps/help/tqslapp/stnprop.bmp0000644000175000017500000247147215003421124020300 0ustar rmurphyrmurphyBM:s 6(Ts pppkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkSSS___bbbeeegggjjjkkkmmmnnnnnnoooooooooppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVf^RjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbVjbV𭭭𭭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭KK&KqKq&᭭𭭭q&q&ỻ&qK&&&Kq&Kq&KqKKq&K&Kq᭭𭭭KKKq&&Kq&qq&᭭𭭭KKqqKq&q&&q&Kq&Kq&qq&Kq&&Kq᭭𭭭&qKqK&ᖖ&KqKK᭭𭭭&qKqK&ᖻ&&qq&Kq&KqqK&qK&&Kq᭭𭭭qK&&&qq&Kqq&&q᭭𭭭qK&K&q&Kq&KqqK&q&K&Kq᭭𭭭qq&&&qKKK᭭𭭭qq&&&KqKKKKᖻ&qq&&KqKq&&Kq᭭𭭭qK&&&qq&KKqqq&᭭𭭭qK&KK&KKqqq&&qKq&Kᖖ&Kq᭭𭭭&qKqK&ᖖ&Kq&qK᭭𭭭&qK&Kq᭭𭭭K&q&qq&&KqKq&᭭𭭭q&Kqq&Kq᭭𭭭Kq&&Kq&qK᭭𭭭&qq&&Kq᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭᭭𭭭𭭭'Pw''ȠwPPPPw'PP'w'w'w'w''Pw''Ƞw'w''PPPw'w'PPw'PP'P''PPPPPPw''wPwȠ'w'PPPPP''wPPPP''wPw'w'PPw'PP'w'wP'wPwȠ'w'PPP''Pw'PP'w'PP'wPPPPP''Pw'PP''wP'P'ȠP'wP'w''PPP'wPPPw'PP'ww'w'PPPw'w'PP'ww'PP''w''PPP'wPPPw'PP'ww'w'PPPP'ww'Ƞ'wPPPPPPPw'w'w'w'PP'ww'Ƞ'wP'wPP'ww'w'PPPPw'w'w'w''w'wPPPPPw'PPw'w'PPPPPw'PwPPPPw'PwPw'w'PPw'P'w'wPPPPw'w'PPw'w''w'wPPw'w'w'P'w'wPPPPw'w''w'wPPw'w'PP'wȠP'w'wPP'wPP'wPPPPw'P'w'ww'w'PPPPw'P'w'wPPw'w''wPP'wPPPPw'P'w'ww'w'PPPPPPPPPPPPw'w'Pw'PP'w'wPPw'w'PPPP'w'wPPPPPw'PPw'w'PPPPw'PPPPw'PPw'w'PP'w'ww'w'PPPPw'w'PP'w'wPP'w'ww'w'PPPP'w'wPPPP'PPPP'w'wPPPPPP'w'ww'w'w'w'PPPP'w'ww'w'PP'w'wPPPPPP'w'ww'w'w'w'PP'w'wPPPP'wPw'P'w'ww'P'ȠwP'ww'w'PP'wP'ww'PPPPPw'PPw'w'PPPP'wwP'PP'wwP'w'w'PP'w'wPPPPPPw'w'PP'ww''wP'w'wPPPPPP'ww''wPPPw'P'wPPw'P'ȠwP'wPPPP'w'wPPw'w'PPPP'w'wPP'wPw'P'ȠwP'wPPPP'w'wPPw'w'PPPPPPPPPPw'P'PPww''P'ww'w'PPPP'w'wPPPPPPPw'PPw'w'PPPPw''P'PPw''P'w'w'PP'w'ww'w'PPPPw'w'PP'w'wPPPP'w'ww'w'PPPP'w'wPPPPPP'w'wPPPww''P'wPPPP'w'ww'w'w'w'PPPP'w'ww'w'PPww''P'wPPPP'w'ww'w'w'w'PP'w'wPPPPPPPPw'w''wP'w'ww''wPPw'w''wPPPPPw'w'PPPPPPPw'PPw'w''wPPPw'P'PPPPw'P'PPw'w''wPPP'w'wPPPPw'w''wPw'w'PPPPPPPP'w'wPPPPw'w'PPPPPPPPw'P'ȠPPw''wPPPPPPPP'w'ww'w''wPPPPP'w'wPPPPw''wPPPPPPPP'w'ww'w''wPPPPPPPw'P'wPw'w'P'ww''wPPPw''wPw'PP''P'wPw'P'wPw'PP'wPPw''wPȠP'wP'ww'w'P''''wPPPPw''PPPPw''Pw'PP''P'wPw'PP'w'ww''ww'w'P''''wPw'PP'ww'P'wPw'PP'wP'''PȠP'''PȠw'PP'ww'P'wP'ww'w'w''ww'Pw''wP'ww'PPw'PP'ww'PP''P'wPPPw'PP'ww'P'wPPw''wP'ww'PPw'PP'ww'PP''P'wP'ww'Ƞ'w'wPPw'w'PP'ww'Ƞ'w'wPPPPPw'PPw'w'PPPPw'w'PPPw''wPPPPPPPPP'P''ȠwPPPPw'w'PP'P''ȠwPPPPPP'w'wwȠwPw'w'PPPPwȠwPwȠwPw'w'wȠwPP''PwȠwPwȠwPPPPPwȠwPPP'wP''PP'w'PP'wPP'ww'Pw'Pww'Pw'Pww'PPPPP''P'w''PPPP''wPP''PPPP''PPPPPPw'Pw''wPwȠ'w'PP'w''PPP'wP'wPwȠ'w'PPPPP''wPPPP''wP'wPwȠ'w'PPP''Pw'PP'w'PP'wPPPPP''Pw'PP''wP'P'ȠP'wP'w''PPP'wPPPw'PP'ww'w'PPPw'w'PP'ww'PP''w''PPP'wPPPw'PP'ww'w'PPPw'w'PP'wPP'wPwȠ'w'PPP''P'w''''w'Ƞ'P'ȠP'w''wPP''wPPPP''w'P''PPPw'w'PP'wP'PPPP''wPPP'wP'PPPw'w'PPP''P'wP'PPPPPPPPPw'w''w'w'wPP'wPw'PwPw'w''w'wPPw'w''w'wPPPPPw'P'wPPw'w'PP'wPP'wPPPPw'w'PPPPPw'PwPPPPw'PwPPPw'w'PPw'w''w'wPPw'w'w'P'w'wPPPPw'w''w'wPPw'w'PP'wȠP'w'wPP'wPP'wPPPPw'P'w'ww'w'PPPPw'P'w'wPPw'w''wPP'wPPPPw'P'w'ww'w'PPPw'w'P'w'wPPPPw'w'PPw'w''w'wP'ww'P'wȠP'w'wP'Ƞww'PPw'PwPPw''w'ww'w''w'wPPw'w'PPw'w'PPPw'PwPPPw'w'PPw'w'PPw'w''w'ww'w'PPPPPPPP'w'w'w'wPPw'PP'w'wP'''P'w'wPPPPPw''w'''w'PPw'w'PP'w'wPPPPPPw'w'PPPPw'PPPPw'PPPPw'w'PP'w'wPP'w'ww'w'PPPP'w'wPPPP'PPPP'w'wPPPPPP'w'ww'w'w'w'PPPP'w'ww'w'PP'w'wPPPPPP'w'ww'w'w'w'PPPw''w'ww'w'PPPPw'w'PP'w'ww'w''PwP'wP'PPw'w''w'ww'PPPw'w'w''w'wPPw'w'PP'w'wPPw'PPPP'w'wPPw'w'PP'w'w'w'wPPP'ȠPPP'ww'w'P'ȠwP'w'wwP''ww'PPPP'ww'PPPPPw''wPPPPPw'w'PPw'P'ȠwP'wPPPPw'w'PPPP'wwP'PP'wwP'PPw'w'PP'ww''wP'w'wPPPPPP'ww''wPPPw'P'wPPw'P'ȠwP'wPPPP'w'wPPw'w'PPPP'w'wPP'wPw'P'ȠwP'wPPPP'w'wPPw'w'PPPw''w'wPPPPPPw'w'PP'ww''w'ww'w'w'P'w'w'ww'w''wwP'PPPP'ww'PPw'w'PP'w'w'wP'wwP'PP'w'w'wPw'w'PP'ww''w'w'wPPPP'wPP'w'wPPww''P'ww''P''w'wPPPP'wP'w'wPPPPPPPw'w'P'wPPPw'w'PPww''P'wPPPPw'w'PPPPw''P'PPw''P'PPw'w'PP'w'wPPPP'w'ww'w'PPPP'w'wPPPPPP'w'wPPPww''P'wPPPP'w'ww'w'w'w'PPPP'w'ww'w'PPww''P'wPPPP'w'ww'w'w'w'PPPw''w'ww'w'PPPPw'w'PP'w'wPP'w'ww'w''w'wP'w'ww'w'w''P'Pw'w'w''w'wPPPPw'w'PP'w'wPPw''P'PP'w'wPPw'w'PP'w'wPP'w'wPPPPw'w'PPw'w'PPw''wPPw'P'PPw'w'PPPPw'Pw'w'PPPPPPPw''wPPPPPw'w''wPw''wPPPPPPw'w''wPPPw'P'PPPPw'P'PPPPw'w''wPw'w'PPPPPPPP'w'wPPPPw'w'PPPPPPPPw'P'ȠPPw''wPPPPPPPP'w'ww'w''wPPPPP'w'wPPPPw''wPPPPPPPP'w'ww'w''wPPw'ȠPP'w'wPPPPw'w''wPw'w'PP'w'ww'w'w'P'Ƞ'w'ww'w'w'P'PPPw''wPw'w'PPPPw'w''wPw'w'PPw'P'PPPPw'w'PPw'w''wPw'w'PPw'w'PPPPw'w'PPw'PP'wPw''wPPw''Pw'PP'w'ww'ȠPPw'PP'wP'''PPwȠP'w'''w'ȠPw''ww'w'P''''wPPw''wP'ww''ww'w'P''''wPPPPw''PPPPw''P'ww'w'P''''wPw'PP'ww'P'wPw'PP'wP'''PȠP'''PȠw'PP'ww'P'wP'ww'w'w''ww'Pw''wP'ww'PPw'PP'ww'PP''P'wPPPw'PP'ww'P'wPPw''wP'ww'PPw'PP'ww'PP''P'wP'wPw'PP'wP'''PȠ'ww'w'P''''wPw'PP'ww'w''w'ww'w'w'w''w'wPw''PPPP''w'w'PP'wPPw'PP''P'wP'wP'''PPw''PPP'wP'''Pw'PP''P'wPw'PP'w'wP'PPPPPP'wPPPw'PPw'w'PPPPw'w'PPw'w'PPPw''wPPPPPPPPPPw'PPw'w'P'ww'PPw''wPP'ww'PPw'PPP'wPPPPP'w'wwȠwPw'w'wȠwPwȠwPw'w'PPPPwȠwPw'w'wȠwPP''PwȠwPwȠwPPPPPwȠwPPP'w'wwȠwPw'w''w''wPP''P'P''wPPw'PPPPPP'w'www''PPw'w'w''wPPP'Pw'Pw'PwPPPPPw''Pw'wP'''Pw'Pw'Pw'Pw'wP'''Pw'ww''ww'PPwwPPwP''wPP'w'Pw'Pw'PwwP''''PwPw''PwPw'w''w'Pw'Pw'PwPw'w''wPPPP'wPwP'PP'Pw'Pw'Pw'Pw'Pw'ww''ww''PwwP'''ww'Pw'Pw'PwwP'''wwPPwP'wP'PP'Pw'Pw'Pw'Pw'PwPPw'P'PwP'w'Pw'Pw'PwP'wPPww''PPw''w'Pw'PwPPPP'PwPPPPPw'PP'Pw'PwPw''Pw'PwPPPPwP'w'P'Pw'Pw'PPwww'PwP'wPPw'Pw''PwPP'Pw'P'PPw'PP'ww'Pw''wP'Pw'Pw'Pww'Pww'Pw'PwPP'ww'Pw'w''wPw''wPPw'wP'PPPP'wP'''PwPPw'PPw'w''w'Pw'PwPww''Pw'Pw'Pw'Pw'Pw'wP'''Pwww'ww''PwPw'w''w'PwPw'Pw''ww''Pw'PwPP'w'w'Pw'Pw'Pw'PwPw'w''w'wȠP'PwwP'''ww'PwwP'''wwww'''Pw'Pwww'''Pw'Pw'Pw'Pw'PwwP'''www'P'PwP'w'Pww'Pww''''ww'Pw'Pwww'''Pw'Pw'Pw'Pw'PwP'w'wP'Pw'Pw'Pw'PwPw'Pw''ww'PP'PwPw'PP'w'w'PwPPPP'Pw'PwPw'PPPPPPw'PPw''wPPP'Pw'P'PPPw'ww''Pw'Pw'PPwww''PwPPPw''Pw'PwwP'PPwP'ww'Pw'PwPPPPPPPw'PPw''ww''ww''ww''ww'w''w'wPPw''w'Pw'Pww'PPw'PPPPwwPw''wP'PwPPwP''Pw'PwPw'Pw'w''w'wPwP'''ww'ww'wP'PP'Pw'PwwP'PPwP'PP'ww''ww'wP'PP'Pw'Pww'PPw'ww'''wȠP'ww'w''wPPw''wPPPP'PwPw'Pw''PwwP'PPPw''wȠPw'P'PPwww'w'PPw''ww''wPwP'''wwPP'Pww'Pww'wPPPPPPP'ww''wP'wP'wPPP'Pw'ww'PPw''w'Pw'Pww'PPw''wPPP'PwPw'PP'PwPPwP''Pw'PwPw'Pw'Pw'Pw'PP'Pw''wwwP''ww'wP'PP'Pw'PwwP''ww'PPPP'Pw'Pw'Pw'ww'wP'PP'Pw'Pww'Pww''PPPP'Pw'Pw'Pww''wPPw''wPPPP'PwPw'Pw'w'PPP'Pw'Pw'Pw'wȠPw'P'PPwww'w'PPw'''wwPPPP'Pw'Pw'PwPPww''PPPP'Pw'Pw'PwPP'Pw'PwPPPww''Pw'Pw'wPPw''Pww''w'PwPw''PwPPPw''Pw'PwPww''PwPPPww''PwPPP'Pw'wP'''Pw'Pww'PPw''Pw'PwP'w'PwPP'wP'PwPPP'Pw'wP'Pw'Pw'PwPP'w'www'ww'PP'w'w'wPP'wPw'w''w'PwPw'Pw''Pw'PwPw''PwPPPw'Pw''Pw'wPP'w'Pw'Pw'Pw'Pwww'''Pw'wȠPww'''Pw'Pw'PwwP'''ww'PwwP''Pw'Pw''wwww''Ƞ'PwPP'ww'PP'Pw'Pw'PwwP''Pw'Pw'Pwww'''Pww'Pww'''Pw'Pw'PwP'w'Pww'P'Pw'Pwww''PP'PwPPww''PP'Pw'Pw'Pwww'''w'wPw''PwPP'w'w'wPPP'w'w'Pw'Pw'PwPw''PwPw'Pw'PP'PwPPww'''PwPPw'P'Pw'Pw'PwwP''P'PPP'Pww'ww''PwPw'w'ww''Pw'Pw'PwPP'P'PPPw'PPw''Pw'PwPP''ww'PwPP''wwPP'Pw'Pw'Pw'wP'PwPw''Pw'P'PPw'PPP'PwPPww''PPw''wPP'PwwP'ww'Pw'P'''wP'w'wPPPP'Pw'Pww'w'w''w'PwPPPw'PP'w'wPPPw'w''ww''P''P''Ƞw'ww'Pw'Pw'PP'wP'w'''wPPȠ'Pw''''P''wwPP'wPPw'PP'wP'Pw''''P''ww'Pw''''wP'ȠwPw''wPPw''wPPw'Pw''wP'ww''wPPw'Pw''P''''wP'wPPw'P''ȠP'ww'Pw'Pw'PP'wP'wP'Ƞw'P'wPPP'wPPPPP'wPw'P'wPw'P'ȠPPw''wPPP'wPP'wPw''wP'ww'w'PPw''PP''wPPP'ww''ww'Pw'Pw'PP'wP'w'wPPPPw'PPPPP'wPPP'Pw'Pw'w'PPP'wPPw'Pw''wP'ww''wPPw''PP'w'PPPw''wPPw''w'ww'Pw'Pw'PP'wP'ww''Pw'ww'wP'Ƞw'Pw'PPPw''wPPP'wPw'wP'Ƞw'Pw'P'wPPw'w'Pw'Pw''wP'wPPw'Pw''wP'ww''wPPw''w''wPw''Pw'Pw''wPPw''wP'ww''ww'Pw'PP'wP'ww'w'P'wP'Ƞ'wPPPPw'w''wPP'wP'wP'Ƞ'wP'wP''Pw'Pw'Pw'w''w'wPPPP'wPw''wP'ww'w'PPw''ww'P'w'Pw'w''wP'ww'P'ww'w''Pwww'Pw'PP'wP'ww'P'ww'P'w'wPPP'w'ww'PP'wPw'P'w'wPP'w'wPw'P'w'ww''wPPPPw'Pw''wP'ww''wPPw'w'w'PPP'w'ww'w'w''w'w'ww''ww'Pw'Pw'PP'wP'ww'PP'wP'wPPP'ww''wPPP'wP'wP'wP'ww''wPPw''ww''wP'wPw'PPw'Pw''wP'ww''wPPw''ww'Pw''ww''wPPw'PP'ww''ww'Pw'Pw'PP'wP'ww'Pw'PPPPPPw'PPP'wPPPPP'wPPPPw'w'P'wP'wPP'wPw''wP'ww'Pw'Pw''wPPP'w'PPw''ww''ww'w''wPw'Pw'PP'wP'ww'P'ww'PPP'ww'PP'wPw'Pw'PP'wPw''ww''wP'wPPPPw''wP'ww'w'P'Pw'P'w'ww''ww'Pw''ww''ww'Pw'Pw'PP'wP'ww''w'w'Pww'PPP'wPP'wP'Pww'Pw'PPPw'P'w'wPw'Pw'PPw''wP'ww'Pw'''ȠPPw'w'w'P'w'ww'Pw''ww''ww'Pw'Pw'PP'wP'ww''wPPw''Pw'PPPPPw'PP'wPPw''Pw'PPPw'PPPPPw''wP'wP'wPPw''wP'w'''wPPw'Pw'PPPw''ww'Pw''ww'w''wPw'Pw'PP'ww''ww''wPw'P'wPPPPP'wPPP'ww'w'P'wP'wPPw'PPPP'wP'wP'wP'wPPw''ww''w'ȠPPw'PPPP'wP'ww'Pw''ww''ww'Pw'Pw'PP'ww''ww''wPP'P''ȠwPPw'Pw'PPP'ww'P'P''ȠwPPPw'PPw'Pw'P'wPw'Pw'PPw''ww''wPPw'Pw'w'Pw'P'ww'Pw''ww''wPPw'Pw'PP'ww''ww''wP'w'PP'wPP'w'w'ww'PP'ww''w'PP'wPw''wPPw''w'w'ww''wP'wP'wPPw''ww''ww'Pw'PPw'Pw''w'w'ww''ww'Pw''ww'w'PPw'Pw'PP'wP'ww'P'ww'P'PP'ww''w'wPP'wPw'P'w'PP'wPw''ww''w'w'wP'wP'wPPw''wP'ww'w'w'Pw'w'P'ww''w'w'ww'Pw''ww''wPPw'Pw'PP'wP'ww'PP'ww'PPw'w'PPPP'wP'ww''wPPPPw'w'w'PP'wPw'Pw'PPw''wP'ww'PPPw''wPw'w'PP'ww'Pw''ww''wPPw'Pw'PP'wP'ww'PPP'ww'PPPP'wPPPP'wPP'ww'P'ww''wPPw'P'wPP'wP'wP'ww'Pw''wP'ww'PPPw''ww'PPȠP'wPP'ww'Pw''wPP''PPw'Pw'PP'wP'ww'PPP'w'wPPPPw'PPPP'wPP'w'wPPw''w'wPw'Pw'PP'wȠP'wPPw'Pw''wP'ww''wPPw'w'w''ww'Pw'PP'ww'Pw''wPPw'Pw'PP'wP'ww'w'w''ww'w'PPPPw'Pw'PP'wP'ww'w'P'wP''Pw'Pw'Pw'Pw''wwwP'PP'Pwww''wP'ww'Pw'Pw'Pw'PPPw'Pw''ww'Pw''wPPw'Pw'PP'wP'ww''Pw'wPP'ȠwPw'w'PP'w''''wPP'wPPP'ȠwPw'w'P'P'Pw'w'Pw''w''''w'w'''PP'''w''wP'ww'P'PPw''wP'Ƞw''PP'w''''w'ww'Pw''wPPw'Pw''ww''wP'w'PPP'ww'w'P'ww''wPPP'Pw'Pw'w'P'wPPw''wP'ww'Pw''ww'w'P'ww'Pw''wPPw'Pw''ww''wP'wP'wP'w'Ƞ'ww''wP'ww''wPP'w'ȠP''ȠPPw''wP'wPPw''wP'wP'Pw'Pw'P''wP'ww'Pw''wPPw'Pw''ww''wP'w''wP'Ƞww''P'''wPPȠ'ww'Pw''ww''wPw''P'''wPPȠw'Pw''''wP'ȠwPw'Pw''wPPw''wP'w'''wPPȠPw'w''P''''wPPw''wP'ww'P'w'wP'ww'Pw'PPw'''''''wPPȠ'wP'ww'P'w'wP'ww'Pw'Pw''ȠP'wPPPP'w'wPw''wPw''Pw''wPPPP'w'wP'ww'Pw'Pw''wPPw'P'w'wP'ww'Pw'PP''Ƞww'PwP'wPPw'P'w'wPw'ww'P'wPw'w'PȠ'P'w'wPw'PP'w'wP'w'wPw'Pw'PPPP'wP'wPP'w'wPPw''ww'Pw'Pw''wP'wP'ww'P'w'wPPw'w'PPw'w'Pw''w'wPw'w'P'w'wPP'w'wPPw'Pw''wP'wP'w'wP'w'wPPw''wPPw'PPPP'wP'PPP'w'wPPw'w'PPw''wPPw''wPPPP'w'wPP'w'wPPw''ww''ww''ww'Pw'P'w'wPPP'wPPw''ww''ww''ww'P'wP'w'wPPPw'PPw''ww''ww''wP''wwPP'w'wPPP'wPPw''ww''ww''wPP'PP'w'wPPP'wPPw''ww''ww''wPw'w'P'w'wPPPPPPw''ww''ww''wPw''PP'w'wPPPPPPw''ww''ww''wPw'PȠP'w'wPPPPPPw''ww''ww''wPw'PȠPwP'ȠP'w'wP'wPPPPw''ww''ww''wPw''wPP'P'w'wPw'PP'wPw''ww''ww''wPw''wP'ȠwP'w'wP'wPPw'Pw''ww''ww''wPP'w'Pww'P'w'wP'wPPw'Pw''ww''ww''wPP'P'P'w'wPwȠ'PP'wPw''ww''ww''wPPȠPPw''w'wP'ww'wPww'Pw''ww''ww''wP'PȠPw''w'w'''w'P'''w''ww''ww''wP'Pw'P'w'ww'Pw''ww''ww''wP'Pw'w''w'w'wPw''ww''ww''wP'ww'P'w'ww''ww''ww''ww''wP'wP'P'w'ww'w'w''ww''ww'++Ԁ++UU++Ԁ++Ԁ+U+UԀ+UԀ+UԀUU++Ԁ+UԀ+UԀ+UԀU++UԀ+UUU+U+++UԀ+UԀ+UԀUUU++UԀ+UԀ++Ԁ+UԀ+UԀ+UԀ+U+Ԁ+UԀ++UԀ+UԀ+UԀU++++UԀU++U+UԀ+UԀ+UԀUU++ԀUԀ++UԀU+Ԁ++Ԁ+UԀ+UԀ+Ԁ+U++UԀ+UԀUUU++UԀ+UԀ+UԀUԀ+++++ԀU++UԀ+UԀ+UԀ+Ԁ++Ԁ+U+++Ԁ+UԀ+UԀ+UԀ+++UԀU++UԀU+++Ԁ+UԀ+UԀ+U+UԀ+UԀU+UU+UԀ+UԀ+UԀU+++++Ԁ+U+UԀ+UԀ+UԀUU+UUU+Ԁ++UԀ+UԀ+UԀ+++UԀ+U+UԀU+Ԁ+UԀ+UԀ+Ԁ++UԀ+UԀU+UU+UԀ+UԀ+UԀ+U+Ԁ+UU+UԀUԀ+UԀ++UԀ+UԀUUUU+ԪU+Ԁ++UԀU+ԀUU++Ԁ+UԀUԀ++UԀ+UԀ+UԀ+UԀUUU+U+ԀUU++ԀU+UԀ+UU+UԀUԀ++UUU+U+U+UUU+UԀU++UU+UUUԀ++UԀ+UԀ+UԀ+++UԀ+UUUUU+UԀ+UԀ+UU++UԀ+UԀ+U+U+U+Ԁ++UU+UU+UԀU+++Ԁ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUUUUUU+UUU+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀ+UԀUԀ+UU++ԀU++UU++UԀ+UԀ+UԀ++Ԁ+UԀ+UԀ+UԀkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppkkk_____________________________________________kkkfffpppPLFZSJ]VL`XNb[Pd\Qf^Rtqsl-2.8.1/apps/help/tqslapp/sync.htm0000644000175000017500000000245715003421124017550 0ustar rmurphyrmurphySynchronizing TQSL and LoTW

Managing the TQSL Signed QSO Data

TQSL maintains a record of QSOs which have been signed for upload to LoTW. If a QSO is signed but is not subsequently uploaded, TQSL will flag an attempt to sign that QSO again as 'previously signed'. For a small number of QSOs, those can be individually re-signed for upload, but if there is a larger error, it is better to ensure that TQSL and LoTW have the same set of "already uploaded" QSOs. The "Syncronize upoad data with LoTW" entry on the help menu can be used to correct any discrepancies.

Your computer must have access to the internet to perform this operation. You must have a set of login credentials for LoTW to be used to download your QSO data from LoTW.

Begin this operation by selecting the Help menu's Synchronize upload data with LoTW... command.


Waiting for TQSL to process the request will cause "TQSL is not responding" messages, which should be expected and ignored.

tqsl-2.8.1/apps/help/tqslapp/tqslapp.hhp0000644000175000017500000000030315003421124020233 0ustar rmurphyrmurphy[OPTIONS] Compiled file=tqslapp.chm Contents file=contents.hhc Default topic=main.htm Display compile progress=No Language=0x409 English (United States) Title=TQSL Help [INFOTYPES] tqsl-2.8.1/apps/help/tqslapp/tqslstyle.css0000644000175000017500000000076615003421124020641 0ustar rmurphyrmurphyH3{font-family:"Arial" sans-serif;font-size:24px;} H4{font-family:"Arial" sans-serif;font-size:22px;} H5{font-family:"Arial" sans-serif;font-size:18px;} p{font-family:"Arial" sans-serif;font-size:16px;} body{font-family:"Arial" sans-serif;font-size:16px;} ul{font-family:"Arial" sans-serif;font-size:16px;line-height:150%} ol{font-family:"Arial" sans-serif;font-size:16px;line-height:150%} table {width:100%;font-family:"Arial" sans-serif;font-size:16px;} td {vertical-align:top;padding:5px;} tqsl-2.8.1/apps/help/tqslapp/unlock.bmp0000644000175000017500000002347015003421124020053 0ustar rmurphyrmurphyBM8'.( %  ~~bbb::VV**ff¶BBvv""FF^^rrº~~JJ..nn¾22NN^bjnz~Z^ >>&&RV66ZZjjzzRRbbrvbfVZfjvz~nrFJNR&*26*.:>.2BF>B"&"6:JN¶VV22>>JJ²nnzzbb&&¾º ƾAAAAAAAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA,?P?P-?AAAAA,??M??M-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?"??????????????-?AAAAA,?!????????????????????????-?AAAAA,? ????? ?????????????-?AAAAA,? ????!??? ??????????-?AAAAA,? ????!??? ???????????-?AAAAA,? ????? ????? ?????????????-?AAAAA,? ????????? ???????-?AAAAA,?!???"??????-?AAAAA,?"??"?????-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?M??M?-?AAAAA,?N??N?-?AAAAA,?O?O-?AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA ? ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ?  ?AAAAA ? ?AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAAA??6??AAAAAA??7??AAAAAA??8? ?AAAAA ??????????????????????????????????????????????????????????? ?AAAAA ??????????????????????? ???????????????????????????????????????????????????????????????????? ?AAAAA ?????????????? ??????? ???????????????????????????????????? ????????????? ????? ?AAAAA ????????????????????? ???????????????????????????????????????????????????? ?AAAAA ????????????????????????? ??????????????????????????????????????????????????????? ?AAAAA ?? ?????????? ?????????????????????????? ???????????????????????????? ???????????????????????????????? ?AAAAA ????????????????????????? ????????????????????????????????????????? ?AAAAA ?????C???? ???-? ??AAAAA ? ????C???? ????? ??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAA??AAAAAAAA }{4YsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Prjz%x|yyAAAA YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Prjz%x|yyAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PryAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PryAAAA   YYsF8\ kk99966w] _an: 5oocpp( ZB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Pr +yAAAA   YYsF8 \ kk9 66w] !''^::`ooc Xp(B7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Pr yAAAA   YYsF8\ kk9966w] _''^:ooXp( BB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PrhhhhyAAAA  YYsF8 \ kk9966w] _a^::5ooXp( BB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PrmmmmyAAAA   YYsF8\ kk996w] _a'^:f`55ooXp((BB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PrMMyAAAA   YYsF8 kk99] +''^::`obXpB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PryAAAA  YYsF8\ k996] _an^:5obpp(ZB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Pr$$yAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg( ZZBB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PriiiiyAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg( ZZBB7 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Pr))))yAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Pr yAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Pr yAAAA   YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&PryAAAA YYsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Prjz%x|yyAAAA }{4YsF8\ kk9ed6w] _a'nn^:f`55oocbXXppg(ZZB77 llNN;11**EvvLRR<,"ttVVJSS=uu-UU>/HT2K##WIDD.GCC3!!Oq@@Q0[&&Prjz%x|yyAAAAAAAAAAtqsl-2.8.1/apps/help/tqslapp/unlock.htm0000644000175000017500000000100715003421124020055 0ustar rmurphyrmurphyUnlock Private Key

Unlock Private Key

If a private key is passphrase-protected, whenever you need to access the private key you will need to supply the passphrase.

In TQSL, you need to unlock the key when you save the certificate to a PKCS#12 file or when you use an existing certificate to sign a certificate request.

tqsl-2.8.1/apps/help/tqslapp/update.htm0000644000175000017500000000232215003421124020045 0ustar rmurphyrmurphyChecking for Updates

Checking for Updates

If your computer has access to the internet, you can determine whether a new version of TQSL or its Configuration Data is available by selecting the Help menu's Check for Updates... command.

If an update for TQSL is available, the Update Available dialog will appear, showing

  • the URL from which the new version can be downloaded
  • the URL at which a description of the new version can be reviewed

If a Configuration Data update is available, the Update Available dialog will appear, showing the new version available and providing an OK box that if clicked will download and install the new version:
 

If no updates are available, the No Updates dialog will appear:
 

Click the OK button to dismiss either dialog. tqsl-2.8.1/apps/help/tqslapp/update1.bmp0000644000175000017500000044624615003421124020135 0ustar rmurphyrmurphyBML6(fpLgggXXX2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$GGGUUUqqq}}}iii2+%1-)𤟚3/*2+%PPPooo}}}iii ۻۺۺۺںڹڹڹڸڸڸڸڸڸٸٸطططططضض׶ִֵմճԳԲӲӲұұұұҰѰѰѰѰѰѰЯЯЯЯЯЯЯЯЯϯϮϮϮϮήήήήήήέέέ̬̬̬̬̬̬ͭͭͭͭͬͬͬͬͬͬͬͬ˫˫˫˫˫˫ʪʪʪʪʪʪʪʪʪ˫˫˫˫ˬ̬ͭήϯаѱӳԴյֶ׷ظٹٹںںڻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻںںںںںٹٹظظ׷ֶյԴӳҲѱаϯϯήήέͭͬͬͬͬͬͬͬͬͬͬͬͭͭͭͭͭͭͭέέήήήήήήήήήήήήήϮϮϮϮϮϮϮϮϯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯааааѰѰѰѰѰѰѰѰѰѰѰұұұұұұұұұұұұұұұұұұұӱӱӱӱӱӱӱӱӱӱӱӱӲӲԲԲԲԲԲԲԲԲԲճճճճճճճմմմմֵֵֵֶֶठPPPrrrrrr2+%ܼۻۻۻۺۺۺڹڹڹڹڸڸڸڸڸڸٸظططططض׶׵ֵմճԳԳӲӲӲұұұұѰѰѰѰѰааЯЯЯЯЯЯЯЯЯϮϮϮϮήήήήήήήέέ̬̬̬̬̬̬̬ͭͭͭͭͭͬͬͬͬͬͬͬ˫˫˫˫˫ʪʪʪʪʪʪʪʪʪʪ˫˫˫˫̬̬ͭήϰаѲӳԴյֶ׸عٹٺںںۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻںںںںںٹٹظظ׷ֶյԴӲҲѱаϯϮήέͭͭͬͬͬͬͬͬͬͬͬͬͬͭͭͭͭͭͭͭέέήήήήήήήήήήήήήϮϮϮϮϮϮϮϮЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯааааааѰѰѰѰѰѰѰѰѰѰѰұұұұұұұұұұұұұұұұұұӱӱӱӱӱӱӱӱӱӱӱӱӱӲӲԲԲԲԲԲԲԲԲճճճճճճճմմմմִֵֵֵֶ׶׷׷Ӥ2+%WWWbbb1-)ܼܼܼۻۻۻۺۺۺڹڹڹڹڸڸڸڸڸڸظظطططض׶׵ֵմճԳԳӲӲӲұұұұѰѰѰѰѰааЯЯЯЯЯЯЯЯЯϮϮϮϮήήήήήήήέέ̬̬̬̬̬̬̬ͭͭͭͭͭͬͬͬͬͬͬͬ˫˫˫˫˫ʪʪʪʪʪʪʪʪʪʪ˫˫˫˫̬̬ͭήϰаѲӳԴյֶ׸عٹٺںںۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻںںںںںٹٹظظ׷ֶյԴӲҲѱаϯϮήέͭͭͬͬͬͬͬͬͬͬͬͬͬͭͭͭͭͭͭͭέέήήήήήήήήήήήήήϮϮϮϮϮϮϮϮЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯааааааѰѰѰѰѰѰѰѰѰѰѰұұұұұұұұұұұұұұұұұұӱӱӱӱӱӱӱӱӱӱӱӱӱӲӲԲԲԲԲԲԲԲճճճճճճճմմմմִֵֵֵֶֶ׷׷׷׸1-)III222ܼܼܼۻۻۻۺۺۺڹڹڹڹڹڸڸڸڸڸٸظظطضض׶׵ֵմճԳԲӲӲӱұұұұѰѰѰѰѰааЯЯЯЯЯЯЯЯЯϮϮϮϮήήήήήήήέέ̬̬̬̬̬̬̫ͭͭͭͭͭͬͬͬͬͬͬͬ˫˫˫˫˫ʪʪʪʪʪʪʪʪʪ˫˫˫˫ˬ̬̭ͮϯаѱҲӳԴյַظعٹٺںںۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻۻںںںںڹٹٹظط׷ֶյӳҲұѰаϯϮήέͭͭͬͬͬͬͬͬͬͬͬͬͭͭͭͭͭͭͭέέέήήήήήήήήήήήήήϮϮϮϮϮϮϮϮЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯааааааѰѰѰѰѰѰѰѰѰѰҰұұұұұұұұұұұұұұұұұұӱӱӱӱӱӱӱӱӱӱӱӲӲӲӲԲԲԲԲԲԲճճճճճճճմմմմִֵֵֵֶֶ׷׷׷׸׸Ƥ2222+$ݾܼܼܽ׸׸ظع2+$2+$ݿܼܽܽܯyj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\yj\׸ظعع2+$2+$ܾݾܽܽyj\yj\ظععغ2+$2+$ܾݾݾܽyj\yj\عععٺ2+$2+$ݿݾݾݾyj\yj\ععٺٺ2+$2+$ݿݿݾݾyj\yj\عٺٺٻ2+$2+$ݿݿݾyj\yj\غٺٻٻ2+$2+$޿ݿݿyj\yj\ٺٻٻٻ2+$2+$޿ݿyj\yj\ٺٻٻڼ2+$2+$޿yj\yj\ٻٻڼڽ2+$2+$yj\yj\ٻڼڼڽ2+$2+$yj\yj[ڼڼڽڽ2+$2+$yj[yj[ڼڽڽ۾2+$2+$xj[һQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6]̃54LJ5464̃>6ȇ6]φ464ȇ64̃>\gXcXcXeXfXfWgWgWgWiVjVjTkTkTkTlTlTlTlTkTkTkTkTkTkTkTkTkTkTkTkVjVjWiWgWgWgXfXfXeXcXc\g?2+$3,%ߓ NUԝMUԝJxMUԝxZNן[K[ˀẀO٠ | ]ұMYI]́ {]́ M ́ ́]χ]H]Pם ]˰K ~ܿ۽ػ׹ָָշնյԵԴӴҳҳҳҳҳҳҲҲѲҲҳҲҲҲҲҲҲҲұұбϰί̭ˬɫɩǨǧƧƨǨǨǨǩƩƩƨŦ¤ۿھپؽ׼׻׻ֻԹӷжδϵպڿèȫ˯ϲҵԷԷָ׺׺׺׺׻ػػؼټٽھھھڿڿڿ;LWLWLWLWKWKWJYHZH[H[H[H]H]H]H^H^H^YYfVSfVSfVSYYH]YYfVSfVSfVSYYH]H]H]H]H[H[H[HZJYKWKWLWLWLWLW;2+$3,%ߓ xMԝxxMUԝyZHQOןOQM̀̀L_O١M Y{ PUؠ z ́ ́]H]ϊLTH ܿۼٻغ׹ָշշնԶԴӴӴӴҳҳҳҳҳҳҲҲҳҳҳҲҲҲҲҲҲҲѱаίͭˬɫʩȨǨƨƨǨǨǩǩǪǪƨŦ¤ۿڿپٽؼ׼׼ֻչӸжϵжջèȫ˯ϲҵշշֹ׺׺׻ػػؼؼؼپھھڿڿڿ 9@M@M@M@N@O@O@O@O@O@O@Q@Q?R?S>S>S>SfVSfVSUUfVShXU>R?R?R@Q@Q@O@O@O@O@O@O@N@M@M@M 92+$3,%ߒ Y~]άJYݥGxMUӝx̀zOĠU ́]ϰL ۾ڽػ׹׹ַָָԶԶԵӵӴӴӴӴҳҳҳӳӳӳӳҳҳҳҳҲӲӲҲҲѲбϯ̬ͭʫʪȩǨƨƨǨǩȪȪǪǪǨŧ¥ۿھٽؽ׼׼ֺּӸзϵжֻĩɬ˰ϳҶոոֹ׻׻ػؼؼؼٽٽھڿڿڿ 9:C:E:E:F9F9G7G6G6H6I6I6J6J6J6J6J6JQQfVShXUfVSQR5J6J6J6J6I6I6H6G7G8G8F9F9E:E:C 92+$3,%ޒ߄ ޥGxJXӜwMUӝx̀z̀ ̀]ΰL ܾٽٻغ׹ָֹշննԶӵӵӵӴӴӴӴҳӳӴӴӴӳӳҳҳҳӳӲҲҲѲбϰ̬ͮʬʪȩǨƨƨȪȪȪȪǪǪǩƧæۿڿپؽ׼ؽ׼ֺӹѷ϶зּĪɭ̱дҶոչ׺ػػؼؼؽٽٽپڿڿڿ 98B8C8C8C7C7E6E4E4F4G4H4H4H4H4H4H4H4GPPfVSfVSPP4G4G4G4G4G4G4G4F4E6E7E7C8C8C8C8C 92+$3,%XݤFߵUMӜY}vMTқẁyYL ̀]ΰL ۾ٽٻػغ׹ָոշԶԶԶԶӵӵӵӴԴԴӵӴӴӴӴӴӳԳӳӳӳҳҳѲбϰ̭ͮʬʪȩǨǩǪȪȪȪȪǫǫȩƨç¥ڿٿؾؽؽ׽ֻԹҸжѷּŪʭ̱дӷֹֹ׻ؼؼؼٽٽٽھڿڿ ;>H>I>I>I=I=KI=I>I>H ;2+$2+$ۿٽؼػغ׺׹ַָԷԷԶԶԶӵӵӵԵԵԵԵԵӵӴӴӴԴԳԳӳҳҳѳвϰ̭ͮʬʪɪȩǩǪȪȪȫȫȫȫȪƨèæڿٿپؽؾؽ׻ԺҸзѸ׽ūʮͲѵӸֺֺ׻ؽٽٽٽپپڿ(.J||||zzzzzzzzzzzzzzzmjfVSfVSmjzzzzzzzzzzzzz||||ɰ(.J2+$2+$ۿڼټػ׻׺ָֹֹշԷԷԷԶԶԶӵԵԶԶԵԵԵӵӵӴԴԴԴԳӳӳҳвϱ̭ͯʭ˫ɪȩǪǫȫȫɫɫɬɬȪƩĨæڿپؾؾٽ׼Ժӹзѹ׽¨ƬʯͳѵԸֺ׻ؼٽٽپپپڿ+0Lق˂͂ςрҀӀ׀ـۀۀ߀߀‌「》個個plfVSfVSpl䀋》》​߀߀ۀۀـ׀Ӏ҂тς̳͂+0L2+$1*$ھٽټؼغ׺׹չոոոշշԷԷԶԶննԶԶԶԵԵԵӵԵԴԴԴӴӳҳѲбίͮ˭˫ɪȪǫǫɫɫɬɬɬɬȫǩĨç¥ٿپٿپ׽ջӺҸӺ׾éƭ˯γѶԹ׻׻ؼپپپڿڿڿ.3Nۈψш҈ԇՇ׆چ܆ކ߆←←冐愐焐脐qnfVShYVfVSqn煐慐児⅐←߆ކ܆ڇׇՇԈ҈шз.3N2+$0)#ۿھھٽػ׻׻׺ֹֹչոոոշԷշշշշշնԶԶԶնյյԵԴԴӴӴҴѳвίͮ˭ˬɫȫȫȫɬɬɬɬʭʭɫǪũĨ¦§ڿٿٿؾջԺҹӻ׾éǭ˰δҷպ׼׼ؽپڿڿڿ59Q┚֔ההڔ۔ݔߔᔜ㔜㓜擜瓜铛뒛뒛뒛fVSfVSwrfVShYV듛듛铛瓛攛㔛㔛ᔜߔݔ۔ڔהؔ׾59Q2+$333ڿڽٽؼؼ׻׺ֺֹֹֹչոոոַոոշշշշԶԶնննյյյӵӴҴѳвΰͯˮˬʫɫȬȬɬɭʭʭʭʮɬȪŪĨç§ٿؾռԻҹӻؿĪǮ̱ϵҷպؼؼپڿڿڿ9=Sᜡٜۜۜݜߜᜤ㜤㜤朤眤霤뛤뛣훣{vfVSfVSfVS{v{vfVSfVSfVS{v훣뜣뜣霣眣朣㜤㜤ᜣߜݜܜܜ9=Sۤ222kkk4/+ڿڿپٽؽؼؼ׻ֺֺֺֺֹֹչոָָָֹոշշշշնննննյԵԵӵѳвΰ̮̬ͯʬɬȬȭʭʭʭ˭ʮʮʭȫŪũ稧ؿֽԻӺԼؿīȯ̱ϵӸջؽؽپڿ<@U大ۤޤߤᤪ⤪㤪棫磫磫꣫룫룪꣪磫礪椪㤪⤨ᤨनߤ<@U1-(RRR.("ο;̼̼̼̽̽̽˼˼˼̼˽̽̽ͽ;;ξ;̾̾̾̽˽̽;ڿڿڿٽؽؼ׼׼׻׻ָָֺֺֺֺֹֹֹֹֹոոշշַַննննԵԵӵҴѳϱί̭ͯʭɬɭɭʭʮˮˮˮ˯ʭȬƫũè騧ֽռӻԽŬȯͲ϶Ըֻؽؾٿ@BV媮ߪߪ᪮⨯㨯娯稯騰ꨰ먰侮隷隷隷隷隷먰ꨯ騯稯娯㪮⪮⪮મ@BV㤠2+%rrr9dϿξͽͼ̻ʺɹȸǷǷƷŶŶŶŶŶŶŶŶŶŶƶƷǸǸƷŷŷŷǷǷǸȸ˻ͽϿھپپټؼ׼׼׻׻׻ֺֺ׺׹׺ַַַַָָָֺֹֹֹֹննԶԶӶҴѳϱΰ̭ͯˮʭɭɮʮʮˮ̯˯˯ʮɬƬŪĩé騨ֽֿԼսŬɰͳжԹּپپڿ@EY篲߯⯴㯴㯴寴箴箴ꮴ뮴דּדּ﮳﮳뮴ꮴ篴篴寴䯴䯳㯲@EY짢rrro!9+%-)%CG[CG[1-(2+%rrrƀ%@zPxxx+$,%,& +%+%*%*$*$*$)$)#(#("'!'!&!&!&!& &!&!&!&!&!& & & & & & & % % %%% % % & '!'"(#)#*$+%+%,& -'!/("0)"1*#1*$2+$2+%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%3,%2,%2+%2+$2+$1+$1*$1*#0*#0)#0)#0)#0)#0)#0)#0)#0)#0)#0)#/)"/(".(!.'!-'!-'!-' -& ,& ,& ,& ,& ,&+%+%*$*$+%,& .'!/("/)"0*#1*$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$2+$kkk}}}tqsl-2.8.1/apps/help/tqslapp/update2.bmp0000644000175000017500000061466615003421124020141 0ustar rmurphyrmurphyBM6(p}||ollQPPCBB/,)0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*0-*/,)EEESSSooo|||pooUTT/,)1/-񢟝1/-/,)NNNnnn|||wvvVUUοοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹȺȺǹǹȺɻʼ˽̾̾ͿͿ̾̽̽˼˼˼ʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοο䢟OOOqqqa__-*'οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺǹȺȺɻʼ˽̾ͿͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿοοοοοοοοοο٢-*'VVVRQQ0.,οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻʼ˽̾̾ͿͿ̾̽̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿοοοοοοοοο0.,HHH+**οοοοͿͿͿͿ̾̾̾̾̾̾̾̾̾̾̾̾˽˽˽˽˽˽˽˽˼˼˼˼ʻʻʻʻʻʻʻʻʻʻɻɻɻɻȺȺȺȺȺȺǹǹǹǹǹǹǹǹǹǹǹȺȺȺȺɻɻʼ˽̾ͿͿͿ;̽˼˼ʻʻʻʻʻʻʻʻʻʻʻʻ˼˼˼˼˼˼˼˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿͿοοοοοοοο̠222-*'-*'-*'ᥟohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbһQ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]7[6R+EECCB?I%ƩG20 @??????A H,leڎfې:fې:ff:fېfې:ff::ې:f:f:fې::f:::ې::ېfې:ff::ې:ff:ېohb-*'-*'ohb{{|ukdB_8^6_7R,ECCC?I%ƩG20 @??????AF)xVJ{{|ohb-*'-*'ohbnnosfgDb:`9a9a:V.EBCAH$ȯG21 @??????@F&{O@nnoohb-*'-*'ohbnnouijGe>dV/BF ŹG21 B@@@@@@AG)yYL{{|::ې:fېohb-*'-*'ohbښrQlEkCkBkAjBjBjBjBa:V0I31 BAAAAAACI+qjڎ:::fېohb-*'-*'ohbz\rKoGoFoFmFmFmFlEkCkCݳÃC,2 A@@AA@AE"M1ff:fېohb-*'-*'ohbǢּsvRsJrIrIrIrIqHpHoHkEoKrMqLrNgBW0T.P)N'K&M&M'O*T2YCң:fې::ېfff:fې:fېffffffff:f:fې:fې:fې:fېfffff:fې:f:fffff::ېf::fې:f:::fېff:fffohb-*'-*'ohb륓ՄbwQuNvMuMuMuMtKsJsKh?`8^9Z2h@jCg@d>b<_9^7[6[6]>pf:fېfff::ff:ې:fې:ې:f::::fې:ې::fېfې::fې:fې:fې:fې:ې::ff:ېfې:f::fېfff:ff::ېf:ې::ې:fېfې:ffohb-*'-*'ohbҕ}[zRyRyQyPyPxPxOqGڅdˢacF}u폏fff:ff:fې:fې:fې:ې:ff:fې:ې::fې:f:fې:fې:fې:fې:ې::fې:fې:fېff:fېf:ff:::fېf:ې:fې:ffohb-*'-*'ohb˫ߍm^YYWW|R\躧e9pGlCiBh@gBhIl^ٸff::ff::ې:fې:fېfې:ffffffff:fې:fېfې:f:fې:ff:fېff:fې:fېf:ې::ې:fېff::ېff::ې:fې:fې:fېfې::fohb-*'-*'ohb땕ٲnb][ZY|R˸߇eoFrIpGmElGmNp^ӕ:::f:f:fې:fې:f:fff:۶f:ff::fff:f:f:f:ې::fې:f:fې:fې:f:ې:ff:f:::fېffff:fffohb-*'-*'ohbؐػ|hca\[WhtJxOvMsMrOrTufᐐfې:ff:fې:fې:fې:fېffohb-*'-*'ohbѐ̿tifb]|RyM{R}W{VzWxXw^Ӑf:::ې:fې:fې:fې:fېffohb-*'-*'ohbؕҿ汜|qlމg܇dׅbЁc~a~hfې:ff::ې:fېffohb-*'-*'ohb배Ŀ뿿ohb-*'-*'ohb٩ohb-*'-*'ohbǨ{{|nnonno{{|ohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'ohbohb-*'-*'騤rkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerkerke-*'-*'-*'-*'ͿͿ̽̽˼˼ʻʻʻʻʻ˼˼˼˼˼˼˼̽̽̽̽̽̽̽̽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿ̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿ-*'-*';;̽˼ʻʻʻʻʻʻʻʻ˼˼˼˼̽̽̽̽̽̽̽̽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿ̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿ-*'-*'ͿͿͿͿ̽̽˼ʻʻʻʻʻʻʻʻʻʻ˼̽̽̽̽̽̽̽̽̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿ-*'-*'ͿͿ;;̾̾˼˼˼˼ʻʻʻʻʻʻʻʻ˼̽̽̽̽̽̽̽̾̾̾̾̾̾̾̾̾̾̾̾̾˽̾̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿ-*'-*';;̽̽˼˽˽˼˼˼˼ʻʻʻʻʻ˼˼˼˼˼̽̽̽̾̾̾̾̾̾̾̾̾̾̾˽˽˽̾̾̾̾̾̾̾ͿͿͿͿͿͿͿͿͿ-*'-*'οο;̽˼˼˼˽˽˽˽˼˼˼ʻʻ˼˼˼˼˼˼˼˼̾̾̾̾̾̾̾̾̾̾˽˽˽˽̾̾̾̾̾̾ͿͿͿͿͿͿͿ-*'-*'~ ͿͿ;;̽˼˼˼˼˼˽˽˽˼˼˼̽˼˼˼˼˼˼˽˽˽̾̾̾̾̾̾˽˽˽˽˽˽̾̾̾ͿͿͿͿͿͿͿͿͿ-*'-*'~ ͿͿ̾;̽̽̽̽˼˼˼˼˼˽˽˼̽̽̽˼˼˼˽˽˽˽˽˽̾̾˽˽˽˽˽˽˽˽̾ͿͿͿͿͿͿͿͿͿ-*'-*' οͿ̾˽˽˽̽̽̽˼˼˼˼˼˽̾̾̾̽̽̽˼˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽ͿͿͿͿͿͿͿͿW`*4f (P (P")Q#*S$+T%-U%-V'.W(/X)0Y)1Z)1[)1[)1])1])2])1])1])2])1])1])1[)1\)1])1])1])1[)1[)1Z)0Y(/X'.W%-V%-U$+T#*S")Q (P (P*4fW`-*'-*'UբGW{ }WգGK NLz GKOҠ ~ |ULԢ J;ο;̾̾˽˽˽̽̽̽̽˼˼̽̽̽̾̾̾̽̽̾˽˽˽˽˽˽˽˽˽˽˽˽̾ͿͿͿͿͿͿͿ)-Ny}̳୵୵୵䭵孷嫸諹髹髹뫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹쫹뫹髹髹譸孵䭵䭵᭶ᳺ᭲y})-N-*'-*'U֤GS{TפH ֤HK Ҡ z գHK ҠWKҠ KҡWӨJ ~YժKWK ~Ϳ̽̽;̾̾˽˽˽̽̽̽;̽̽̽̽̽̾̾̿̾̾̾̾˽˽˽˽˽˽̾̾̾̾ͿͿͿͿͿWZ~tp~p~pppooonnlllllllllllllllllnnooopppp~pt~ȞԄW[-*'-*'UգG } zWҧIWӧI I | UգH |KSҡK ӡ ~XթKѲLUգVzοοͿͿ̾̽̽;̾̾˽˽˽;;;;̽̽̽̽̾̿̿̿̿̾̾̾˽˽̾̾̾̿̿̿ͿͿͿͿͿ &Opzdqdqcrcrcrbtbvbvbv`x`x`y`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`z`y`x`xbwbvbvbtcrcscsdrdrp{!&O-*'-*'U֤GK ӡ {WӨJWԨJ }WҧI͌ U֤H }KTӢXYժKҲUڦI ٦Hο̾̾ͿͿ̾̾̽;̾̾˽̾̾;;;;;̽̾̾̾̿̿̿̿̾̾̾̾̿̿̿̿ͿͿͿͿ>XfTbTbTdTeTeSfSfSfShRiRiPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjPjRiRiShSfSfSfTfTfTeTcUcYg>-*'-*'U֤G ֤H {T{ פH }WҧI͌ } zK ҡ KӢVYժKWۨJ } Ϳ̾̾ͿͿ̾̾̽;;Ϳ̾̾̾̾;;;Ϳ̾̾̾̾̾̿̿̿̿̿̿̾̾ͿͿͿ;HVHVHVHVGVGVFXDYDZDZDZD\D\D\D\D\D\WYhXUhXUhXUWYD\WYhXUhXUhXUWYD\D\D\D\DZDZDZDYFXGWGWHWHWHWIW;-*'-*'UգGWϧI z } |WҦI̋ |WPIKMӡVKԢX| ŀVzͿͿͿ̾̾ͿͿ̾̾;οοͿͿ̾̾̾ͿͿͿͿ̾̾̾̾̾̿̿̾̾̾̾Ϳ 9 c #5E7ABC", ", c #3D558D", "' c #A5A8AE", ") c #C1BFB9", "! c #455986", "~ c #5572B5", "{ c #3A5490", "] c #3C5692", "^ c #999EA9", "/ c #E5E1D5", "( c #F1EEE5", "_ c #B7B7B8", ": c #3E5487", "< c #5B7ABC", "[ c #38528B", "} c #5E7BBC", "| c #3E5994", "1 c #9BA0AC", "2 c #DBD6CB", "3 c #BFBDB9", "4 c #AFAEA9", "5 c #DDD9D0", "6 c #B3B3B6", "7 c #42588C", "8 c #5977BA", "9 c #3A548F", "0 c #5E7CBF", "a c #3F5A96", "b c #9CA1AD", "c c #E4E0D4", "d c #CBC8C2", "e c #575655", "f c #B1AFA9", "g c #EBE7DD", "h c #B4B5B6", "i c #42588E", "j c #5A79BE", "k c #3B5693", "l c #5C79BC", "m c #405A98", "n c #9CA1AC", "o c #E5E0D4", "p c #EBE9E4", "q c #CECCC5", "r c #6D6C6A", "s c #767472", "t c #BAB7B1", "u c #E5E3DE", "v c #EEEAE1", "w c #B1B2B4", "x c #3A538E", "y c #5977BC", "z c #39538D", "A c #374E85", "B c #787D8A", "C c #E3DED1", "D c #ECECE7", "E c #DCE1DA", "F c #C7CBC3", "G c #C4C8C0", "H c #D4D8D1", "I c #E9EAE5", "J c #EAE8E3", "K c #87888D", "L c #374D7F", "M c #375088", "N c #959289", "O c #ECEAE6", "P c #EBEBE6", "Q c #EBEBE7", "R c #EAE9E5", "S c #9C9991", "T c #9E9C99", "U c #E9E7E2", "V c #ECF1EC", "W c #890604", "X c #8D0C0C", "Y c #8D0D0D", "Z c #8A0302", "` c #ECF2ED", " . c #A09F9C", ".. c #9C9B98", "+. c #ECF0EB", "@. c #93110F", "#. c #CA1D1E", "$. c #CC1E1E", "%. c #BB0D0D", "&. c #9F9E9B", "*. c #9A1211", "=. c #D42222", "-. c #D32021", ";. c #CE807D", ">. c #EDF0EB", ",. c #94110F", "'. c #BE1B1B", "). c #BD1919", "!. c #6F2422", "~. c #A4A2A0", "{. c #F4F2EE", "]. c #F7FCF7", "^. c #9A1110", "/. c #D11E20", "(. c #D21F20", "_. c #C20D0D", ":. c #F7FDF8", "<. c #A6A6A3", "[. c #585550", "}. c #595853", "|. c #51423C", "1. c #52120B", "2. c #591610", "3. c #54120B", "4. c #513D36", "5. c #595953", "6. c #5A5852", "7. c #FFFFFF", "7.7.7.7.7.7.7.. + 7.7.7.7.7.7.7.", "7.7.7.7.7.7.@ # $ % 7.7.7.7.7.7.", "7.7.7.7.7.& * = - ; % 7.7.7.7.7.", "7.7.7.7.@ > , ' ) ! ~ % 7.7.7.7.", "7.7.7.{ * ] ^ / ( _ : < [ 7.7.7.", "7.7.{ } | 1 2 3 4 5 6 7 8 [ 7.7.", "7.9 0 a b c d e e f g h i j @ 7.", "k l m n o p q r s t u v w x y z ", "x A B C p D E F G H I J g K L M ", "7.7.N O P Q Q Q Q Q Q Q R S 7.7.", "7.7.T U V Q W X Y Z Q ` U .7.7.", "7.7...U +.Q @.#.$.%.Q V U &.7.7.", "7.7...U +.Q *.=.-.;.Q >.U &.7.7.", "7.7...U +.Q ,.'.).!.Q >.U &.7.7.", "7.7.~.{.].Q ^./.(._.Q :.{.<.7.7.", "7.7.[.[.}.|.1.2.2.3.4.5.[.6.7.7."}; tqsl-2.8.1/apps/icons/0000755000175000017500000000000015003421124014551 5ustar rmurphyrmurphytqsl-2.8.1/apps/icons/key128.png0000644000175000017500000007620215003421124016311 0ustar rmurphyrmurphyPNG  IHDR>a AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~@IDATx}\>3nqW!bMR} m)RAh#l63r̲о;ss߹,*ʥԍ:srpP#~G3;1~N% =X+.v ~6,/)Ape_ClSU V0e˖eaUEEK֭Z׸ޛo#-)- ~ոsA@8p^ ~>?zd~J|(n ۷n=cA?Å驧ԅK;}f|ʉOȅzë+z{J>s_ Vߞ3i;Ff%z),,Ն )|&U( cnyVQQQ\EX'G8@yp"|?;qD޿T({7SRࡾ)&.<_q8 `fɃvG!&:.u u!O{ɼM{Vn{#D HVFLjXu*P_hkqGt$հ S>(4hcȑL:eܟ-ݼys}Prvr2eJ211K?|H1/V`kJh@\4 5S* 3f#[:67w\H3_%SYD96%f(ML&Dz܀9%o$J~U0UQ=+XL45ǁ#']lAjjYFK%Zrv#Jh+VljUȫ~{eK5}{ڷJ܍Y+ Dž&H^^~ѪO9e/3(AW#de4$Eސ9GhRbdR*"`hH_/\Ĕ m\\28UʃU4Y$JS+Hs14X&-A"*ӦmQ'˭ UxUJq#?[2ڨQUPYi$K$BSyC~jo.Oh$6 uRRmm,SDt:}٥' }yE[n%qԨSș6|pRV4,u$/ȑPXffHFA#ݤT`IZhnPUT<9cʤGE#%!@IBGx$ӷ 5tSFUAEQ`)SaJ! i#G% có@ }n"Zi;Mpxێ#WǂqYzb9eg%D%! iF9 D(䌼jmJ˪-FqGTVcKTשЏ2$v\@io~jK^.ݷ9GjW:m`UIpXV$eiyVd0i41j5H̒l̎dYDuJ?UD >uE#E#@lf+ d@?n{X̀? `KB'@T? c\X̀;c#"Ϫ@<r)h=)ˤ%#A/ k}wLZ%tYىXfFh% CZmkm%oCd<؂NT3(N7}#4`͚1UjU@WB3&. I&L3_jnQd%BSQsmUtc"se"D:-*n7St5'%8ۼ\,# JÀPE 29 c^ި&;0>|X5b6UASX%!7z1v3(JBcP賐&8pq9K3/>2T~NKeR#yUA  N Pgg;)U:YE@X2ZlCI'ш2z賵)ŚD\3Q6Rg{'T fwH\Nڿgأ VuZ]t%/hOv[sR# 6\>$?i2Z+C\5zOoI_gN:y+(yt 8a?wѻ8GTA4A+5UMC|_$MprH@0 V~WE z!`~ɷ,rv|4bZG % ,xp%`"I9K!EBMf6mI@9!ЊגQ bNo G+4Qր_aOh)kCm]]n꫍b֬Yك{YӒYI +lf&){Iz)&P<̐F鎑ӱu!kiW:W&γ͞:YY&/2mb&r$ey¾`K::tFcیV3y}>V;+S`Ao֠TjH2B5AF0!7ڹc?顫 ڽ=!C( V=vgVvJs֭l= HwQXo-}ԁvQ\2JͶ!RSٰe<5\xrb,IiSM,$}6if(ϋJk=&e G}؂l;=H}yAQ =?# @,CTd &(N=s7ܿ|>.9v׬ j]\XniXpH4v1h X^Qiu@0M=Dڴ4Lʲ;wt*zQcs >E7_F+Տ{z8/(׭[x7͹lҕֵK:Jrʰ*oU?> 6= _@ݚED*$!/9{)1$tu̹[tuƝ)bn`Ѱ,wݦ C+LF~YSYU=Z = 9Gc+Ni{^΃x_,If6TpAYua,[:=㬠{ z{W1ĤZQ;n8u'Z H $r4h넍͜A> L@C0y]mmtALvuТjo/E2>ҺZ/"LSBs7=e]v:=lj!hMAOW M!''L)j#u4Ј!:ݑDM 5^L.DzgVEz2:c\/,/wq-ΪWZ5yy:;#QZ %L]jo풭vSޥg؅@$FWp8R_,1Tӭu.`{w.g~6#3$FF Mҵh6 qڨwR!*jufwY :DcY@E'ՑRHrS'Kh]u~t%JM.?2hӮ픑:N1|}J#WGgLweJEƇ{13qLI٭) s-=tb&Ҙx`שr ϭ@4$L4z P T.y?# 5v1]\=U\d AQ[XX!(Lh$Nb 0vڜ[Dy,dA#G~4ȽV}Z'ekX !4֭M;v=)ʫh`a6 W@{!Cw"h6227RmwY)dvp!$Ym.,5 Ε+*/wr1Cr$#4'hѽX;G(֖(6s~1LҨV`l?΂؏ hcuk.pZ}aW1`5ƆHMU$EH`.MDPg jTatR(죺&+M̄`L:L|,Nֿ D;l(tMļBk4Դ%8aTw^KQ`(D`*H lˈ)JϜ]&D=tC:0qLZ /3/`/Q@#b vP|<eL>38(ׯ_xIm\]Q$2L4Ғu1kl 2ܳvwQC}]~$%Puu3u8}d =#ƏA$3mܸRĩ2L;ɑI>ڵyt1ږAk*w'}+4Y#M^uR[K90d.ВPRUzpűJy_"HҘ$gilF5GwdzyqT;dW1FǖNj)bJJͰ.,yZس[{[Ut嵳)=EC;G5Dn/O8jj^ @-J2ғ dJ ={ ҩOwX%?\NZ2h t|>uVQ o=wlbӰj`Ѱd3{3x+Q/\xH*fGY8o:߃^(Qcnb:qh?/-` 7=QMV@ + TRRKk ULGu4pjnj%#,#6  Ɔ|$ҾŔU/ûЁ) o& E5“k̍! D.];zxfdP0 u$ٚ^y7ddH P\xaT*#|ԉn]7 [~y XQG7ahɲ>[\0{1Fh:5?X 332`翊?Fo-FBٴTO)I9tj!G|Q}ʥLڳ4~`98_Z[VbH2hAڲ}t[>8\냃JI]p];2#^Y5 𴗂 u{6ް{%BE6xGF#ƅгRYbZN34!Y Yi\uU4x8ۨ1Zy̤an<2XԴ%D5, Lw޵S3(ĪRfNLX)売 &Lʊ)ޣ0hiׁHN$H96/GM_ȸ< wz⼙io8aN,-Hl?V}4/!;H~81E70< <&_P sqqL,̬wz?c٫sSSS蚹*R/*ewAM-$};]={. 0ܴRB s˼߇IBAm<}`^CU(?'b-EqϔW@H,B̡@&i@]+Uos M|?/_0cJDjfv~c^zaҪ~,*8zƟNX;;x0ݼ= uu _W} a9c{ n\=Ǐ8q  zWB+7k_w|ɇho dJzxjh+VeѩSZ[Jt[{;&gK#;:jwh֭x "^5ݍSE:V.w(Ef];JRVv:,0Py2zs7xefI6`WP$ X`O_JA{-员]Vj@{ |>ҍGϾ۟X/Un[wbOHV0ݶCMsЭw~pj-y-{),zTYD-t 4xH?*ڷG54 Ӛ飏6b:(=ICGV$EaqtT:;jwf֬qXS! c40?SZϵVUf[*j`6ɋAy^Ooinj^k#R墅xe(%RXE';%I3B.6z~B6/焳kܘQ?/H$wz ULC PfZc"߾۩| τg]AӊOQu}**G${ڵ`@VIt߽w9+ISf΀uMPIJ`QJz*%!ƍMADDE aKM >[mB@B?!y*yO⺂I/´`e;`ݗ"i"{Hvǖ3}ګK# NHBGSAٌ@<:zIl4}4(^Ck/=r8)DچX0B0,+ИE[~NQ?6]e844Q2j* >  B"/0S)3A"A3 Q;Ȓ` Pr/m{lێ~ I2;w,^,|I9fx 뼢/ #XWCK!C(|5Md>ȿ@KgĢ051cK}PYU3yNDdw V|3;I)v8~{e@Tz{FjBGKS;,(;ذ1 WaA/сe6v6Ѣ@8(=t0| yaQɣR覅yEؕdӁS5D?Z [B`ڌA+חνqҊ_B Q(Tngn zθ<w>DG7\R.Kv);]OSP`6#?#@֯_ޞ=dF )0Z)''lPT!>lJޘ ;PNvPKfrulu{CQCe- 8 `ܸz=VfYa<^,hZ ˃=s'ʨ,%>E]G0lױj*h'L͹d3p-m34ft|]T-m߹WnUd$ZTU{Sͽr_,X`$# -_ͱdc]=> e!lF@{]\ծxf|fύxOqGAZxt:ֲ>׏3iţ-5f V+">P?ax+ b5,M2T9Q#suHqՕ͐RA5/A9^VRuьhِ) }{m즡#!\M& {ӡEpC'+BGZ""U+˨ډ { NT6P+d;)v; 8>&u&愅Xy$,,9MZc?V8o\PbJP 5]"DPK=Xw` i^=QW?f6h?vn7O-T8upޔք !.6%U gV#A Hpw":X C`;@4w\ZrB嚃z?YI^W]^Lkn.lom$+ 2P 3TGӫ &+D'NTCU3g  MԎͤ҈#hἫ)%X"(Ebο?XӐe\EYʗaHaDt4. $}֎X/naN C Ŧ&z8bU7rwq5O#'y'42Xg $ -K%7հyӃU>?/E &ڗwHəyҔiPT4^HXuuNl=jX|X,BNi3'{G GAso^!0>߰:\ndYx#}Ɉ7h$# ;iڴp$e\ͩ * /&8./`Ac1_wt< :DnP/٬k"ȔSRa@$57qQIߖD+-ǁH`!刬~uY  c%7d"YFꋜ1K5B|V!#Yyz?\_𯟔(ՉFN>=@0hI -9L+S'aI@d4uRuh뺝 ! 'goW#,vԫWg2d GzvR:qbq!$F 적@ր 9`O:"}>(F$QC-& /*]He[$k7Ӱ[2-9) l&P,XiO:h24V=n"c`E<+mQY_v==ƽ-Ď8c/<ĢLlڸ9JIS&A/Aeӣ!qt X3w>KXQkS_Ml&ߕ gӄ+w>fcO`w}:FfkX#e{`%TE'NAMI ^8`_ho`W?i /?*ȃ\}qւ8JJ,n>r#v/&/lH`4{Vz7SCy{C% :C7pYfFj|&:]vd-.#UaJPB0f1kO'g`UH}c/ND~mi>qP6 HvYҊh8b婱̝dۡE kPA28'4KGDY D 7y8b|*XV}V ^)in u(i>jr rO> bi1D%e D*Bz1dw qR -% d/lcx܅!lK@߇" ֺaX*BK`r.(B*`e!,׬7q# 4>IEc 0w@ |fOjFDJJȿ5NZ^ѷ.-|qq{hc哪+kaU)@S(*}OD \kWQuKm?TLӭtbRaۗjd ›& 6&$ Ⱁ k6ޟ)b?>#.{hR#Tb)zd@<@GgTzց 59C@^ILL?f ۱YJF=6Ø'_߼vϞmͱ2@b_P\&Y `VLaAq f1B`?40򊎯n`Zęmn#FjxOxiׇ>Z_T>|D_pdJxwa 6rEv" A>HcI3Nct dq[Q#dID Z6˱JH٦4e`9 iOHĀ!‡%#P<\L>LF,D=33O6UiɌ=^X==`+̇c@Ύ8R^[; kb;uA;nU̡fI)Z Dͦk7:M;vtMm̞ZN޴iSg<1Y090Y tρ#Qnfͽnp/mv>[1͙=E@ MnXV0%X(/? v2BRKQA Į'd!Pj]__$BfwZ-Ͳ-!E1}w*?a}K,J,Ћ.f, ?y >]|hagW` Ǒ rk.5#4!g܀,(^zo~z M@565@|g`j ֽ3hVqbKFBh- X&b\4 =I<ȋ ռ3Nw3ɏ|b`,?nG78fa]%$ѱi[+ # 1,9w^I]u%G4D#/xP7cC4hx _EɰQ !^MM (m05sƢ0X5|RG\W)*p~nUU@̓p[=Ԁ0* D `'0 lϱ}B\PO|38ѥq#\6/D DR9Wi3 4>ʩ9 |1vD qc㲡ϮŪ/``.RhfJq;D4@*D_"DҲR ZZ|y}B.˭KJF0FǛ1A H.JOEXS(n%K6*;]Òj|pA>M5^E!*F ̢8'49!M#B .RzEV6(&CHEO\UW܈ ^,pe*(I,KE(! N\"7;x *JmhgW"PHCO}Zo{}Yz:~Ь+FWL젒Ӥ^ !Ko_ zȑN%-ztFӡg'AiP`Ió`$jkaqS'9A\Q"x?o7n(ϟcv,.ojo ıI ;8Q ^*`Vl@:bP?|~ IgPNӇ/:dԨ+y 0%Hq\h _3%58N0|}A/FUˈ$tX?C/𓽫w8@}Ʊ/`pGSm'Ȫ3!BGv%$ Hngm=e OPmD!@%#?-`@1N* ap z#d>y CEÇ*DS>mg%QcK CV l !dG>bD/7 =ss%,`\KpCBJ7:ur?e-F<߃12+/x~9HK, uJJGJ^rT6m=Qf-yLtQ Ov*:YLɰi!1aP"XV=x:1a [ѩu}jXA`$wc=8ǙƒSBVSɰߴ8_@>^6L#GC|d찙e X 9ԢVĪ)[*` l>2@843>| #Fʇ5Yxb|<";o޸w~\(>Y9NŎd*XٴRm'1IDAT?7PI} %!f 0+D5G,HVa2|,=E)RԞF09@:C flR Vl'u+8:f~;Rk6':-DAw ;Z$Ƴ'!tA/9P\hGD54;icHt~S(]`BnX!9,m!/`!V  nJr$mJT5;<4~8~$B {T<;ssV\{1Tpd!FAXv!:*X2-twn MnDw۰{K.oYS|a_t9C~5y?6#e^@c 6=ak1pO"Դ#zm@@1剮_f924ʆVRSSP&l aDYjo}p ifܱ9Y b7=,r%i]{&gmA_ôiWy\-R8Հ *@J5&+!@ug n1(ǁ,^+SҰ!D~Q$tw0natl-3o}j*C\ $ r680E8xe9bʢ6.y"4S#3b7^qϼJCgG([KES:Ն5ۤ$G$9=Y,c!1ɰGOƒ.4.!x<|(@J N~LPn'"Vu}w><X*8G|旓 dрM0XXMc͛'  ˏs1w"4#0sT86ӍEd*#RlD0ƻo}$WvJƎe3W%*i%d] YA9;@~Xgy7{줟7wOLOӄ=SȅoWO[um5Hzo*:U>9`*>8e3? pd` ŋgǬ- vE<\тb7:tWHzz.(ҍw,@Ա`R~THCz ;vyD>7`^+l hgSnn>Cŵ8{kf 7h*,,LūlB۶ms2fG `2d ¦СCOfo);qTqŏhcqlַyO~0fՇ53lGض4&ɃVx*Ejjh۝?fďڄ-b$e>Y͆. ur[A8UQ| M $a`_{xI=  sC1$ PV+Zn"8r<ŚT:qO"@8 Q,3[|~A^nU,)/~ū"laμa֯Tݔ<؃=/؝JP(oEUaƢI-쿪tfS=ZQu?/,mOYW=_q]ž_|#/T?D`l ?Y=o@[VzKSx6rlDAzZu2/~1&cLKJ1{#ݔylo|ҧN:!'=mMOO)@"3E#>so`Lgԏc^JKILat? FN_ދT{DA=4,nMtὕP qgعsF-SFDa;R _~;vp:ELJs H٣_ZQ "{n8eG}"i$l@2&iy/l Zez唅d 导O2xEC/mjt@$߼7ca_- `q sHӭ➞|i @/ KV^䌴}}0(\Zy fJ2'!̄o#g1,ɋ !Ya>AO\BdDQDB+#ߘRf42y4|' `-6-ӑmivzUYA<(zf F;dޞu:}7TW Ӈ6wmKd~~5.'V/OWBvLY ZF`frESoJ#fw.L;ʣQz/tdlQx.m:mبHYi)5 :u[_WC6Gdt%ᅤZ@)f< c%p` T,#5rg:C;8O&p6W0^ E^d{A.¯Ո1!RlH^+̭]WU\2BK /\w /?\6gu72-ial'%Jjލe/$C4KLl{ӈ&d2J5Xp Hҏ?^zoIΞBfl-d9LRj=\X(;D[AŎX*|xώ j_ FJjZCn6u > V+H*s?GP2~d.-+Ɉ~ԅh,;^zϿ8 ;qCǯa\WAx3pⷂ_pؽLj}r|@=ڨ#y }D.[xSvp0Tq⭙Ł6} b>D582w>',v/?#2}Z?X*أy,َ\~HcxK+WY/΂} XU;I HW6 *;>!U 9R BL].Ҙ43=nAĦ"1$--u c;cWٿ -%Y>!2ioG5R2!4hQ vɶc9 D  KeR6 ̱Sl$0Mɷ'%~eVL.-x'r,l5r3"^< A:ߌS><@&8Ƿ8 VoT)`;- mxc騂E އʿgkN[WUe0NlRðTa+Rub gF$K2^TmUNkL*;ݧ$=e& lb(IHX4$ IBhC'vhHf4!L:,5&%8$! `0 -YXoo[o{'Y1)`^w|xkETuMiF0Hm%@%;O'ጹBtV"DV5PCrgB <P;H>y E"je$)Y+ڤVr I!/Vi%Ug6JeZE}2,KA[_+vpg0jiQbq[fۑRȹή.~,N 9 &3襰T(0'~yP6.VD7|}i'8o$IN&`ɽ#;sݷ\#/fN}:h )| iLRA `H!2k@ss$EF3*(c ^ @6,|lJwv#ð4n Ae#m\7xԕRe Ï)ۂG UmMH#)*EmϢJI!{Xe.Ꝟg&#t1Vh΢݌iǐ)=@8=zg*=?6>haC|1 :pSR *25Hݼ uR÷_&CFF;`xʯVO(vjKu92TZrȰ!K,J tȣeaWA&`W"$!B R #Ēox#gLRa^Bih^B o}o~9+ 3Fb}+=U2za{,6(#*VvY7PK(n.շ2 S.іOcg[!4XQE4ۮ5PU Bl^$̮c6+LD%Z0%^0$! j\b[pwLqRlXRW%#C!s?gXoN&svE#86ʯWuU)ww(AB Y$*BU5qUCg,;B Qg רhOs[^+`2M_(MPJ(xe(>;P?jS'Oo B.z?_x3 ^|0O+'Z }֖7se;g?ê%`pD^jdqF6T\Vfе!‹V7R^U XlH εs~K<թeU3@Y{蛈q׫|nȁc=_ce^ZiFVU)sEGp!"]^:Eip &`GcQ~`Z|L/zgKjyۣߵ眓.(C?Jzݓ9gs/h{*omHФB] eu|]uczxdLu!m#vUjRN`RdN!;mF_TO/.!->ݏ=Mw'2p lj }aM-Bρ)C룤ˠ31Qý$b|'NzAC_OH[F&^)[2ʌM\uh 1@ugTMIqu, :jj\]ɫ;]9۝G)-1lGQ P ]@ayoT?7=?P٣BrUOP7͎cF?sU}&:,CݻwS[A|# %<4i6<ׄ^f*8Lz)o`&d6ϓŰ}\#p֗f4l?wO}goU^a\>jOpڍ P28nVɔ*@Rtxݴx`EziSe@#_硨BUD2YtYNBAu2w~w}!/golb8Vz.ReF~\]@e1fNNZ`EqLΘ]>o1?vQ'I|, m'ٴUn\;b6>*@"Ap#'U 왃I]?.a - >ѫDg& 8WS9 uqAL {=/6.y]wd_qǓdZq,b^1V@!ìr$ѹXܴ ߰ ֖ @tƺ[E-|E|m65.OI_#"E>G%hOuP+k;`ܖaap,() H)ř*gjպ @P g]}/v^q='t2iPwKGy,xaBdO a a*FB.z{-jF;DOf|gzОU@vОE+ o!t(?7 ܭ2jlEw!G$B(ISK}*^%*jKyP2Ǎpko|롑[Qak@~L6ʸg/&Ο9.Pg=ߐhG:?#W}?-W&G\ ?0dR͆ѦwEmb==NiV󳲲Q&ܯF֪EF$ǏO#--Ш}{'*~"L v4lt$~ua9 fk!`._ݲu]?<&{6 32EcǗMf와(_b*]R KuvubK"h Ys[;tz@b0Q7Ϋe#o5H.Ple>?f4wu;*7=ۻS? 6پ5šXJOS,y`)%\o۶m.~. )H0v3l 'g1cVJ/ f>]`a*ɜNfݧm!XD5L۰xlgRPhy9)`.A Gۆξ+fn>q;*qokDMeOox}?JWml{rj(nCʜIjPzV' 5@,ʬG'y6T&"a\q0XPr <ܹeiwP'2`v{p+i|Ow&n\,zO?#^"+$@!A|rctF l,ÐhۛR-.VY "Az Kte8u啬i|G|YB&(&rzF.~+! M˘e;;Afm'$p]6 5s<GU56uP m2D v-9EZ{ɤ6^*L˱ }ĤS^/c;B?o͠.O9E3@%%lyƪwhTp l pA]߽DYt`䃔)pS0@uyW!~O窕+O'247 F\!ė1IbӪh!@3Dx`Ƕ^Q71)ģgP~Oы33@~]!#T+*T˨U+fÌ>566Kׯ:0/U.lbMi[V-Sc>4ˈ?z`b2*Ըo[/ >%3Yvu>666ސgI *gCuܺDG&p$&lD!h/}*\`7RYUm\P͈ vhmm t-nsVdXawÄZeفfңcŚbJL7c5O > Nr @0y&'%9 \NbF^=2:em0[؆\m/G4ٝ+g4w@ LF(Hmyʎ訜iZ#Vjn& > ?{._Z^L&RKɣż\[moɣiS "SY _$ Hހpu N%4G|䄏a%.A=+7-59 Hۯlj2u5Wx=k7QHl X R0ILM\.bl+I). a1Znr'z@|m$DTY`>>0N-EgR7W5QzReA&H@pƌφnn=SėH 'wY/z%'A%\-ipҕ2$\ CϺ`Lǧls%ʧl9rp?|Pka2 H|cD0_: ]ttZPD`,n6n9o5lipRW)Dro(P IyҮPwgϹnȤ@q3g4 ㅺ|#GJ';/Cl0c7OTF ``VqTro@(!;m o4<r9s\ WwR^z;r?"D&YI )s4xְ ʣNDĵzӇvx]wsV# >=6<(1%<$H]Hc.sX@c0@?i62kر@#YsZ_}Q9sʁU9i3Y7Ffd60 OKE3UnrUB:10v O+o[n?/-Ci)^sԨƁ̥Εyff c@%]6V/9c43|<$td"|ǘSE&Ƌs@TߦjWEuA?69a䗺^}ɓdgU`2 e<^ ,iCB M$ڕ==mraauP#N(Tn2^޽32ҷL\!uE wU͛O7IvwGvpG, CϝMNu12P;!4^!*DĂ5ĮBT2B˾3;OFp*2,, @݄\& Dyŵ ڮLuO)g ` \Ş,}O -*׆k>7r󴎰j&b*Qc$ᙩΑ f : I#0DJq"cxzl!#P0TJNaBdhN35wfd83DyuO<&#S@rx3]Ks,gϧ2G1S55l VԹ ?-iJ\4:*Rlo^ʾviֿEi+î.LD P]VSRRO"vGvF( ["5(J yG%/[`%{O5aoĽ!R"lgn1wY dV!VeTr' xh|ǏЮ{KV8 ( e+E3,TPWZ|%akw\ÍZs_.Nbgq-"NNu&L3rCþ|hƯnoC7oB3u5j:|=3zݯ+;t9WޤVz8?-dK?ggb9԰*Oq%B7!C}jxhӰ l {i\s@&CG;vsxa,x"ӲN*&oH1dτ)2/HXbZszbmw\ 4IENDB`tqsl-2.8.1/apps/icons/key16.png0000644000175000017500000000703715003421124016225 0ustar rmurphyrmurphyPNG  IHDRa AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~IDAT85SklUݙ}1ۖ1]BmbkJlDcHDjLք&> jjhn[v~I&gs~9B$Df'NP9w`x+OvuSzJ%z:[a_ȝA+ tLr>=\8Y4P@P4=8t>nR Uvr?,Xf&lk64vkG$jZa"E_JItuI;~'x{% ' Ryy 3 j}l 1ѠTX `=r"I"8 1m$dޯpZkal(ZԜ6r8K%.VGWX=&`@R!--2k7 sgd5d١BI),Qns ɻ]-gx }dkM4X.}nBˉt( [mo>~IDՅ5Q{7Nz*|?*}S LxևgQmg;4Le1ԺWUt$.7j,jT8onkzm U siV(<-(HFG% .q({kdٜ{vm9|`PЌOG#3 1Q1h}USs9ṩzޑWϡȌP#Y. yXjfj:Y_]Q~]?}dq!Bqa8C Ygg~!X#IENDB`tqsl-2.8.1/apps/icons/key32.png0000644000175000017500000001266315003421124016224 0ustar rmurphyrmurphyPNG  IHDR szz AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ -IDATX W t;elI!OYDDEN-iG[m-؇k)S`iZ9Z# h) w} =;{?wio*ʔ,,뛨3zEI<92T?,GG(p^ ȀUL2NJE }2kQ`_@ӆF\õX߳_9g,DFF♾`b;aܪu﮼iޜ֔\]fU^͚ -[9Eu!d2l:v6 ~   $%7ec>{oy_QQbLK7S`8M!HIV0aMFlilAP=|'tT8 WNNuq ; $ ="z T٬y3BT j@KAꟁ&Z,#$ "[u,Hf-((ݏ"ljإi~ºڍa)7` E;k8*$-UfnZ=r7$1ERVD21Hee%fV0I. kz^kj$Q/.,iQMk˔!2xG'׾D*wC 0bI,(tv ƘQT^Z=WAH5Xc~3SӦg;槻 jؗ9 d{;S=l?tNw/wU5f3@i,T~+#9[Xp=kQ܌ť*HlUOqҤIep_=q$S2ަL,.Ubvw4ttCwa^ޡz / vl!f6r>?>;PpZ5>S sXK:,c Pux^'v3RARi|r+Ⱦ>nws[o_xA0褠BF1M ):ACKQ3%MgO)G[Z٪b<}tnϾg^r9x/0%BIhU|QRi{PbUDF4Nuak&zi^`0opL;80M/h3/^7/z@|j=׭8Sj?ʖm0% $!i4" Us83nR][c<:tQ5/A()HDL]p3Ar@,wFƎVTLnڶݗ[Xo^:DaSTaASEsp`x̛w͒76Tya8 }c==]8OVV4ULIENDB`tqsl-2.8.1/apps/icons/key48.png0000644000175000017500000001634415003421124016233 0ustar rmurphyrmurphyPNG  IHDR00W /iCCPICC ProfileHǝwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz7)bKGD pHYs  tIME 56IDATh͚yp=ftKealc!@aC8C\! & X`!! (Lb %Y4FCS3!Ęjyާ߳nXx'_n,k :QRuƒdX dLUVC*yF&!zX< T|t5AŸfdlQ!J$*}= Ü`A\* ta4x: D5A>(WK;N*"d.*.@A*d42DFB"8f 騪D8oh8q/OӪK^8Gq87\y_WnSwmAФcxh;Sxgk~"ah%֧rY- Y<ŀkBn`qZO=ڳIj#Lsj:,oV\"tHz=<}2[78D'\`04.Jĵ\M(d2Iaڽ,9EOLvŗxVs1L}݋o?ר,_ 00Q&CAq#=~4,i&JcL#ϦM l~s +ލD")fUBYtH'turǎ Z+ˮ3˙pp;D D__?PjZ?8LQQm9pWMH_@{FɬA#jfρci?8&dɖ1It 'Vl2(=̝7vt]`; F8z&CaAAlYY|/w;e4:NCy\]?0|@1Nd `4@JQ:9Jr)(g(bu#((̧x$Jia>@wn.{6zo1}$&l~Z' RpJ緼.VcgTUpH8k LL}I͢ 2SAiihF7S*J{uL+gfr6$EfjU]]UV1{V5^P(HFغi #!0ȫ-;#Kµ[/y(DY,1]"]aEy\>?f)fI<9%E,Z:{p%salYYo& PS3p0H{UM(.*[G$?֍madI\eƊ+f@*DHP$l\wgwŒI.d:RQU]UU%o{}ql|e SUU失 5$//E1J z/lNH+W\qC Μ" V%Y]fTue4!/Oi8<7pSѣqdlPdiTtMXr)>˴RJ T:e#?YFc4t_:+ASX;.2eGP` 2 /~o߄,.Im6|X MCɾL]A|TF,Ƕݜ{B:1L8VfdhhK^7g 1Y2?:<`}m_{3D^B'6-{xe=zGaYB)VOa杜}`IOc4 )DrsCI$$N{ aS~ҡZ|+ Fq*;7_ÔŐeÖ[2(.$ 2)4!Fii>8%E.sdd)XL2DYar=.M`Zi>{̼k7uoFH8@β2*˘^QΝ+$c˛_,^};srQyI ֽ-pWLyφ{&l:nccd,at(|9_L2¾z/[qXXu篼9^˿}<71-=gy[N <#'ow;v,6lN6}njiGj)p,8 ³ӗ~ﴹ ;Suj:f[$}6>Zv 2sEH s+X$LAS/h vJSY<u'J΀! 2D3*\eAR?y.Ezz*& ~%zZ(A22~_Ze]MYxr$ L%QQ F?^M?!pnH%2c|N3B}灞COGIeT f Ey$Q;Z d2qQX\AW;v՟m*X;wUާ"փփE0I+qב}8?+T`"j ==$"Xd\uHVsKλbҋ~z:b^{ Ȍ[D@WO@gv*fC39kܗL%Q,E%$Q|^/X SXLyzž<مKM FyoFg5&z1s@ŬsصN&]`2/#m?BQ)>m6Q0ӄz>u)pMo & zDkO@Ccs7vk:2to[;=~?4vusD dy]\dD iP(wkƺY&LFHYG# uo3gJ,YIݛO2zJUH8n*V!tl *j κoyit#V {J4?|we'@T~fs`'4vh".dٜEW (ҩ3sgWl)ˮj0vn|z8\L.t`ӟBs>2qw<G20st2m-x{1bZy3g mϼx=v $D.4!FNL`]~-럆?%bPLY.f>p(L _lʫ7˖IKoad| 5!w^yᠿg фbdd֖fp$j*):n>01]W#s's9OICW3gm?áUMowzyK}=_i8e!1QHI5\|g `0IKSSV@q4ع!f;E_K<QT=lQU]A<"8e)-̦bx44ytFvoYWD&la1; a3:: ZZ:8j.V^>:ڡ)f3Ο2ё"H`%T<7 5,ڥV^j|}͓IH _EuV2꘮(S:8PVzZiid(mTSZUÑV:}򚅗-[yy$0GnaW.1%rMdM|Xw=Gp[EnJΤSӹ+\2QRBcbSHyDҨ{P4ypX6n_]]z܅KDĨæ$O /t|2n2GvYeS9~|gXu܅KBhH) ϲ>*p,zeBJ;sn;WP6pu VIENDB`tqsl-2.8.1/apps/icons/key64.png0000644000175000017500000002450615003421124016230 0ustar rmurphyrmurphyPNG  IHDR@@iq AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~IDATx{ tՕWRwK־Y66ى !$,ɂ!' `fd0'fqlɶlɲ[zU]Jn,` ;Uկ^+ȲO M${|ZJ?kuL|RkwE.܆O>/[Lߨ`er$~ڔ슕=mU3}ߦmEjt͖dTn^qŊgz ee:F+K0> (AY4#u)E{K23D!'Q@o- Ԭ`~\eyMw'ьW,s \4)^b'kVM[sѕW?[+Z|C#a!-R2 6L;dXƟ<)<'7M~/\׌\U+t)MAk0c`ȋϋogB gXLR3F )ZbŊ"-|J"$|-+2TSAJ|6&?oᑓCpֻ7=ϰaʀZRd6R2LM=pfQ]]?9ꅤ#!ahx!?bj2czUr\N*xh9vr'LIle5&bS,N;K c@^E|k` b H 84e''"zq^6ʞL &1^Ո0LA\? gV*BR Y`T >:1t̒ΙS A` 2(^sEs0Km<1P2G/eyg,환̟}XI-C A3A kfD$A]2eWVɠ15}Iύ>:^iqw^,I׋{RȠM^$SIh:X,TGM4;ӊra3"GݡÆ"{`t}/X?=o!D"D`P*`;^qChLjS1~x 1qo|^SÔB (;ۀ5ŽvFԨSAPDכH$:-oh##] fc"ryfI&P0}AɄDBc4i)cv{&g}3ܞBocbns )ĥr2y_]yfnȪ\90,!E9E 2-f,o{$"D}CY:8$1%n$ )b9d0/q$$%NOЃyN4Doh²Ճ>rHN= zJ {J&D-G޽uNCwvt`|#pļG<TP$G!H!-Ak'IP؜8&=YU9m'ǛpEځ(+M]hiƐ۫ܜ,EY&i E+"a 6Ye.oW_}(^Vg p̢1Qzɛ4FɣLOBlb &Ϋ #L_Xc?w.e_ơuXp|4!#7BD0 pe<OCKsd1FX -'^+_I=E'pΝ;dnwܚM8Z[ihokbh *H ;1 %,fD)|Chy+M&EwGw Ҝ/BOEf*t\zp3{Lѥ;45Am~a_zpx/oa2ɲu(EñdX}NSbwf"˪a C~ @є%epv,5hUV{v6Z782䓭 x{>c nSS.ijKD0ۿװk}'a!'=#T&GG.%aeiFA.G?LއVQz{OS!@zb )FH 4` 4A\RIE8~]v 8?*48wZTPF-!aNU lbc sRt84}^v (v~BsR&;wi4$қ{p6StO{02-_lC  m",InlُP =AG"z|m8,Ev5s},.rY9k:-y_b{Z10Kv@ɋ &xYn-8H$]p1҉ o6طIrD2OH9EM0F_3έƎwS8p0$EN:J(w˖1EB0D#10 O%}?v]iW&;nz;O &JS"A9y#a#x_w[|T!YX"̣Z3zdU?Λ_;: ˦JEskp5!vʉi ("N +Z`AKaGPM}"Y _Zt?]7  Ru> %B,(Wc9x"ٗɝ!O D~D(ڝlYwO8?BT*e1:eW6l]vsqHn".d)u{K͠>QT\H"Qفlz9hjj0uD~~I<Ϳ{u$8{J cc$.7bS :5l/F%1Q{k 1` O.Ekp ha+/Nw P1BGI gWW*axQس(}8θ )F u)*-`" 6?VKR3إ57\Hi3Szk~EGg_gC@sg'5yW$!8vky k4'r10'2@בzW^pF%%6G4 [1gLe,mo8X+0Џ,RA^;gŗ<|0ź/ѓ%d6- C :Fv+S(05>t%ZTL+SN>P(_57 m |cŃW$Զ:o$+M~?OrCwGP͂U5faf}wvj&j./Eu2 I/յc6lY򍒅W?ۙ}2 LUؑ=0M7+ĦOh=~q^)tJ:#,~ /2jPLqU, ]ųX r^8wSXe?yUgtβ,_`hzs%~ ׋8_jUA^G7$0>V}UUa7= {lnxl{ܓ[ck yj5 `9_o'mr nj/#2B0ST8Nb6~g\cwZޚ6l%ēF%oM)OʱㆁEuWp.~M5`,kscZi>3/ulMG´-BgP_F^%W".FiοQ[bL% hPOYIM{ib˖%Q_ c{JsEX3#p5g~ߦtt3@3k^nfn{*Μ͙`;O<󼢺OB3&=Ldng@?}n=uPnhEY;ʆ5~mK_Lґ'H:ꄗ])DJo\5=ܠka 8zclc;-*ڶ=kEJX[^gÞIoFF cpCSȊ,O>7ӀM{ FqHPʨX~TCax܈V@`L4g)`kVf*5:;:"ⲅBY/9" ?mkduM(Hǔ).W622,d\#$ ,R1\C/ݟKlʏ|/'[4BD#D PKs#A6>=Ei}u-#kT fe$Z<.n7@gR&/z=s.#߭lAͯ_Prcl:"eO%/")/IM3]Qcg9kS7޾58trM@4(*gv^}߱Ɂަ0 0ҝ=vmHt:E5Q+No-/1|yr$ǔ49'şymF_=Y`˟l\3)&d*<31թ41utuyd(aQQ8QYao`Sm 5Vh,Վ+%8O/Jǧ==Ϗ5jy<$FjC "MD`ϑ+'6=ka0ۋԯhe*=;V5*LGw/qdH#(+Cvg(X^xgLmr5TK`[q|~u1Hz?DV&P| b*KE?;<}esKݵ6š@4.6t0XUVry5b̼Y߹t˝ZK+SPLY O9(IIg%3],uvW) eB)])007(zfj![aMꩉS55^!)('ߧM۶ F:r}*I1ŕAn6.utTPp(G2lʪYGwN3N(AQ! Q0\pѧ#&: ^a6¢"/Gf&sifm.ϡwg1':R{Nx|XĖXZ3ܳB^@u"sxdD٩`6lDbEz `X.QZBNLػ0wYVmy5rBsM uQH_r2vIv]Xd{ctrO7lm S4͇:{Gv5ū'0x)epR8뼁B֠GjE=~ނ1EjLQ }"҅9jj{!;?y&t ה"2@c`-]Ɠw\H/  %v3?hx{oM2VGBmOn}jd3q'f If* Gn%K*k,t7} A^N+`^N_eŏn^cCg=}g}LxC!TF"R]a}AN:نfU< VpZ>/^| k~ C*ZN⼎i<_qM-[`=`gHX2o)4udv2:^>wUkY'E;f %1ĊȺGt*!/T5Tfуfnjά+O W̨C#l\R"6Ykw?05+\zW׮Bpņ@9Sa濢 YNɰRg0Qhmmئ:@DP*K,yD sԡIa=9|CcU /al/MwFOxa6% xxFU R[koT>g/p4cHݷ7=dD4ǜl7!='oIENDB`tqsl-2.8.1/apps/import.xpm0000644000175000017500000003007415003421124015502 0ustar rmurphyrmurphy/* XPM */ static const char * import_xpm[] = { "48 48 468 2", " c None", ". c #B9B9B9", "+ c #C2C2C2", "@ c #C7C7C7", "# c #CACACA", "$ c #C8C8C8", "% c #B8B8B8", "& c #CFCFCF", "* c #D1D1D1", "= c #D2D2D2", "- c #D4D4D4", "; c #A2A2A2", "> c #C1C1C1", ", c #D7D7D7", "' c #E2E2E2", ") c #DEDEDE", "! c #DCDCDC", "~ c #D8D8D8", "{ c #D6D6D6", "] c #CECECE", "^ c #B3B3B3", "/ c #A4A4A4", "( c #C5C5C5", "_ c #D0D0D0", ": c #B0B0B0", "< c #ABABAB", "[ c #C9C9C9", "} c #DFDFDF", "| c #E9E9E9", "1 c #EBEBEB", "2 c #D9D9D9", "3 c #DADADA", "4 c #9C9C9C", "5 c #C3C3C3", "6 c #BFBFBF", "7 c #9A9A9A", "8 c #E7E7E7", "9 c #E8E8E8", "0 c #DDDDDD", "a c #DBDBDB", "b c #BABABA", "c c #CBCBCB", "d c #A5A5A5", "e c #ADADAD", "f c #E6E6E6", "g c #EAEAEA", "h c #C4C4C4", "i c #A6A6A6", "j c #989898", "k c #E4E4E4", "l c #E5E5E5", "m c #B1B2B1", "n c #848584", "o c #BABBBA", "p c #C8C9C8", "q c #B7B7B7", "r c #D5D5D5", "s c #C6C6C6", "t c #9D9D9D", "u c #E3E3E3", "v c #E0E0E0", "w c #7E7F7D", "x c #B2B3B2", "y c #BBBBBB", "z c #C0C1C0", "A c #C3C4C3", "B c #CCCCCC", "C c #C0C0C0", "D c #B2B2B2", "E c #DBDBDC", "F c #CFD0CF", "G c #BDBEBD", "H c #CCCDCC", "I c #E8E9E8", "J c #ECEDEC", "K c #F3F3F3", "L c #F2F2F2", "M c #F4F5F4", "N c #F0F0F0", "O c #F8F8F8", "P c #D3D3D3", "Q c #959595", "R c #E1E1E1", "S c #C0C0BF", "T c #707270", "U c #B5B6B5", "V c #CACBCA", "W c #D0D1D0", "X c #D2D3D2", "Y c #D7D8D7", "Z c #DBDCDB", "` c #E7E8E7", " . c #EEEEEE", ".. c #F1F1F1", "+. c #CDCDCD", "@. c #DCDDDC", "#. c #DEDFDE", "$. c #E3E4E3", "%. c #E6E7E6", "&. c #ECECEC", "*. c #EDEDED", "=. c #EFEFEF", "-. c #F5F5F5", ";. c #F7F7F7", ">. c #F8F9F8", ",. c #FAFAFA", "'. c #FCFCFC", "). c #FDFDFD", "!. c #FFFFFF", "~. c #7B7D7B", "{. c #999A99", "]. c #BFC0BF", "^. c #C5C6C5", "/. c #C9CAC9", "(. c #CBCCCB", "_. c #CDCECD", ":. c #D5D6D5", "<. c #D9DAD9", "[. c #EFF0EF", "}. c #999999", "|. c #D9D8D9", "1. c #DAD9DA", "2. c #E6E8E6", "3. c #E6E9E6", "4. c #E7EAE7", "5. c #E9EBE9", "6. c #EAECEA", "7. c #A9A9A9", "8. c #DDE0DD", "9. c #E0E1E0", "0. c #E8E3E8", "a. c #EEE5EE", "b. c #F2E6F2", "c. c #F3E7F3", "d. c #F3E8F3", "e. c #F0E9F0", "f. c #EAE8EA", "g. c #E8EAE8", "h. c #F4F4F4", "i. c #8B8B8B", "j. c #DFDEDF", "k. c #DDDFDD", "l. c #E2E1E2", "m. c #EDE2ED", "n. c #E4E1E4", "o. c #C4DDC4", "p. c #A1D8A1", "q. c #8CD58C", "r. c #89D589", "s. c #99D999", "t. c #B9E0B9", "u. c #E1E8E1", "v. c #F9EDF9", "w. c #F6EFF6", "x. c #EFF1EF", "y. c #D6D7D6", "z. c #A0A0A0", "A. c #ACACAC", "B. c #AEAEAE", "C. c #ADB0AD", "D. c #BDB0BD", "E. c #AAB1AA", "F. c #74C374", "G. c #31C731", "H. c #05BF05", "I. c #00BD00", "J. c #00BC00", "K. c #00BE00", "L. c #1AC41A", "M. c #5ECE5E", "N. c #9EC19E", "O. c #C5B5C5", "P. c #AAAAAA", "Q. c #9F9F9F", "R. c #00B700", "S. c #00BB00", "T. c #01BF01", "U. c #02BF02", "V. c #00B800", "W. c #00B500", "X. c #A7A7A7", "Y. c #A8A8A8", "Z. c #05BC04", "`. c #02BC02", " + c #02BD02", ".+ c #03BD03", "++ c #02BE02", "@+ c #03BF03", "#+ c #01BE01", "$+ c #02C002", "%+ c #03B502", "&+ c #03B602", "*+ c #03B702", "=+ c #02B701", "-+ c #02B801", ";+ c #02B901", ">+ c #01B901", ",+ c #00B600", "'+ c #01BB00", ")+ c #A3A3A3", "!+ c #BDBDBD", "~+ c #05B104", "{+ c #05B204", "]+ c #05B303", "^+ c #04B303", "/+ c #05B403", "(+ c #02B401", "_+ c #0CB70B", ":+ c #84DA84", "<+ c #A0E39F", "[+ c #48CA48", "}+ c #00B400", "|+ c #05B804", "1+ c #01BA01", "2+ c #8F8F8F", "3+ c #939393", "4+ c #08AC06", "5+ c #07AD06", "6+ c #07AD05", "7+ c #07AE05", "8+ c #06AF05", "9+ c #07AF05", "0+ c #03AF01", "a+ c #14B513", "b+ c #E5F7E5", "c+ c #7FD77E", "d+ c #00AD00", "e+ c #08B407", "f+ c #04B403", "g+ c #04B503", "h+ c #0AA807", "i+ c #09A807", "j+ c #09A907", "k+ c #09AA06", "l+ c #09AB07", "m+ c #05AA03", "n+ c #15B014", "o+ c #E0F3DF", "p+ c #7CD37B", "q+ c #00A900", "r+ c #0AAF08", "s+ c #06B004", "t+ c #06B104", "u+ c #0CA309", "v+ c #0CA409", "w+ c #0BA408", "x+ c #0DA50A", "y+ c #0DA60B", "z+ c #0AA608", "A+ c #0BA709", "B+ c #07A605", "C+ c #18AC15", "D+ c #E3F3E3", "E+ c #7ED17D", "F+ c #00A400", "G+ c #0CAB0A", "H+ c #08AA06", "I+ c #0BAC09", "J+ c #0E9E0B", "K+ c #0E9F0B", "L+ c #0D9F0A", "M+ c #0EA00B", "N+ c #079E04", "O+ c #039D01", "P+ c #0FA20C", "Q+ c #0DA20A", "R+ c #09A106", "S+ c #19A817", "T+ c #7FCF7E", "U+ c #009F00", "V+ c #0EA60B", "W+ c #0CA70A", "X+ c #08A506", "Y+ c #00A200", "Z+ c #09A707", "`+ c #109A0C", " @ c #119C0D", ".@ c #089904", "+@ c #3DAD3A", "@@ c #5DBB5B", "#@ c #009700", "$@ c #119F0E", "%@ c #0C9D09", "&@ c #1BA418", "*@ c #E3F2E3", "=@ c #80CD7F", "-@ c #009A00", ";@ c #14A411", ">@ c #029D00", ",@ c #21AA1F", "'@ c #6FC96E", ")@ c #0DA30A", "!@ c #0BA308", "~@ c #0BA508", "{@ c #12950E", "]@ c #12960E", "^@ c #11960D", "/@ c #149810", "(@ c #CDE4CC", "_@ c #FFFBFF", ":@ c #75C273", "<@ c #049400", "[@ c #0E990B", "}@ c #1EA01B", "|@ c #81CA7F", "1@ c #049700", "2@ c #069904", "3@ c #2AA827", "4@ c #D1ECD0", "5@ c #67C265", "6@ c #019A00", "7@ c #10A10D", "8@ c #0DA00A", "9@ c #149110", "0@ c #14910F", "a@ c #14920F", "b@ c #159311", "c@ c #0C9008", "d@ c #5FB35C", "e@ c #F9F6F9", "f@ c #91CC8F", "g@ c #079003", "h@ c #1E9B19", "i@ c #E5F2E5", "j@ c #85C983", "k@ c #008B00", "l@ c #45AF42", "m@ c #E4F3E4", "n@ c #C4E6C3", "o@ c #1C9F19", "p@ c #0E9A0A", "q@ c #109B0D", "r@ c #0F9C0C", "s@ c #168D11", "t@ c #168E11", "u@ c #178F12", "v@ c #068800", "w@ c #7ABD77", "x@ c #FFFDFF", "y@ c #A7D4A5", "z@ c #21971D", "A@ c #E1F0E0", "B@ c #78C076", "C@ c #4EAE4B", "D@ c #F7FBF7", "E@ c #DDF0DD", "F@ c #259D21", "G@ c #0A9205", "H@ c #14970F", "I@ c #11970D", "J@ c #11980D", "K@ c #188813", "L@ c #188912", "M@ c #188A12", "N@ c #1A8B14", "O@ c #0B8505", "P@ c #99C997", "Q@ c #C7E3C6", "R@ c #E9F3E8", "S@ c #D2E8D1", "T@ c #F1F8F1", "U@ c #F0F7EF", "V@ c #3CA338", "W@ c #0A8C05", "X@ c #179313", "Y@ c #13930F", "Z@ c #1A8414", "`@ c #1A8514", " # c #1A8614", ".# c #198613", "+# c #14840E", "@# c #B6D7B4", "## c #FBFCFB", "$# c #FEFEFE", "%# c #FCFDFC", "&# c #57AB53", "*# c #098504", "=# c #1A8E15", "-# c #168D10", ";# c #168E10", "># c #158F10", ",# c #1C8016", "'# c #1C8015", ")# c #1C8115", "!# c #1B8115", "~# c #1D8316", "{# c #188112", "]# c #21861B", "^# c #D0E4CF", "/# c #F9FBF9", "(# c #75B671", "_# c #0A7F04", ":# c #1C8917", "<# c #188812", "[# c #1E7B17", "}# c #1E7C17", "|# c #1E7D17", "1# c #1D7D16", "2# c #1F7F19", "3# c #167B0F", "4# c #358C2F", "5# c #E5EFE5", "6# c #F8FAF7", "7# c #93C390", "8# c #0D7B07", "9# c #1E8418", "0# c #1B8314", "a# c #207719", "b# c #207818", "c# c #207918", "d# c #1F7918", "e# c #1F7917", "f# c #227C1B", "g# c #14740C", "h# c #4D9647", "i# c #F3F7F3", "j# c #AFD0AC", "k# c #15780E", "l# c #1E7E18", "m# c #1D7E17", "n# c #1D7F16", "o# c #22741A", "p# c #22731A", "q# c #21751A", "r# c #217519", "s# c #25781D", "t# c #116D09", "u# c #6FA76A", "v# c #CADEC8", "w# c #21791A", "x# c #1E7716", "y# c #207A19", "z# c #1F7A18", "A# c #1F7B18", "B# c #246F1C", "C# c #24711C", "D# c #23701B", "E# c #23711B", "F# c #23721B", "G# c #24731C", "H# c #1F7117", "I# c #23741C", "J# c #1F7217", "K# c #23751B", "L# c #217619", "M# c #217719", "N# c #207819", "O# c #24671C", "P# c #266D1E", "Q# c #256C1D", "R# c #256D1D", "S# c #256D1C", "T# c #256E1C", "U# c #256F1D", "V# c #25701C", "W# c #206D19", "X# c #215819", "Y# c #27681E", "Z# c #27691E", "`# c #276A1E", " $ c #276B1E", ".$ c #266B1D", "+$ c #266C1D", "@$ c #246B1C", "#$ c #25631D", "$$ c #27681F", "%$ c #28691F", "&$ c #28691E", " ", " ", " ", " ", " ", " ", " ", " ", " . + @ # # $ + ", " % @ & * = = - - - = @ ", " ; > * * & = , ' ) ! ~ { ~ ] ^ ", " / ( _ + : < ^ [ } | 1 | ' 2 3 * : ", " 4 5 ] 6 7 @ ' 8 9 1 | 0 a _ ", " b c $ d e { 8 f 8 | g 0 a h ", " i $ [ h j ; _ k l 8 f 9 9 3 2 m n o p ", " q [ r s t i = u u k f f 9 v 0 s w x y z A 5 h $ + B ] ] + s ", "j C [ ~ & D y ~ v ' u u k f k E F G } a H ! I | g 1 J g 3 2 2 g K L M L N O g ! ", "; h B ~ P # : Q j q * ! v v R u u k l ' S T U V V H H F W X r Y 3 Z ) v R u l ` g 1 ...) ", "i ( +.- r = +.( C $ - a 0 0 } v v R u k ) r 6 ( @ $ [ # c +.] & _ * = P - { , ~ 2 3 a ! 0 k [ ", "i ( c P = r r - r , 3 3 a 0 0 ) v v R u 0 , . s @.@.#.v ' $.l %.9 | g &.*.=...K -.;.>.,.'.).!.& ", "; h $ _ B # B B & & _ * P P - { , , a v a - ~.{.z ].+ h ^.$ /.(._.F = - :.Y <.a 0 } R u l l [.r ", "}.> h ] s 6 C + h ( s $ B ] & _ * = r ) , ~ ~ c B +.] & _ * = - r { , |.1.3 a ! 0 ) } v v g # ", " b h # @ + 5 s @ @ $ # +.& & _ = = { 3 r , ~ ! 0 ) } v R u k l f %.2.3.4.5.6.*.=.N ..N ,.a ", " 7.( h # # B B ] & _ * = P - { , , 2 r - { , , 2 3 a ! 0 ) #.8.9.0.a.b.c.d.e.f.2.g.1 h.{ ", " i.6 5 s [ # c +.] & * * P - r { ~ r r 2 ~ 3 a ! ! ! 0 j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y. ", " z.@ + ( $ # B & _ * = P P - - * - +.d 7.< < < A.e B.C.D.E.F.G.H.I.J.J.J.K.L.M.N.O. ", " P.[ h $ B & * P r r { { r * * r Q. R.S.I.K.T.U.U.U.K.I.J.V.W. ", " X.c ] ] * - { ~ ~ ~ { - ~ { Y. Z.`. +.+ +I.I.++@+#+K.T.U.$+U.++ ", " 7 > r 2 3 ! 0 0 0 ) ! $ t %+&+&+*+=+-+;+>+,+W.V.'+J.J.J.I.I.K. ", " )+!++.{ 2 { & C i ~+{+{+]+^+/+(+_+:+<+[+}+|+-+-+;+;+1+1+ ", " 2+3+2+ 4+5+6+7+7+8+9+0+a+b+!.c+d+e+^+f+f+g+g+&+ ", " h+i+j+j+k+k+l+m+n+o+!.p+q+r+8+8+s+s+t+~+{+ ", " u+u+v+w+x+y+z+A+B+C+D+!.E+F+G+H+l+I+4+4+5+6+ ", " J+K+L+M+N+O+P+Q+R+S+D+!.T+U+V+W+X+Y+Z+h+i+j+j+", " `+`+ @.@+@@@#@$@%@&@*@!.=@-@;@>@,@'@)@!@v+w+~@", " {@]@^@/@(@_@:@<@[@}@*@!.|@1@2@3@4@!.5@6@7@8@8@", " 9@0@a@b@c@d@e@_@f@g@h@i@!.j@k@l@m@!.n@o@p@q@r@r@", " s@s@t@u@v@w@_@x@y@z@A@!.B@C@D@!.E@F@G@H@I@I@J@", " K@L@L@M@N@O@P@x@x@Q@R@!.S@T@!.U@V@W@X@a@a@Y@Y@", " Z@Z@`@`@ #.#+#@#!.##).'.$#%#%#&#*#=#-#s@t@;#>#", " ,#,#'#)#!#~#{#]#^#!./#)./#!.(#_#:#<#K@L@L@M@ ", " [#}#}#|#1#2#3#4#5#!.6#!.7#8#9#0#0#Z@Z@`@`@ ", " a#a#b#c#d#e#f#g#h#i#!.j#k#l#m#n#n#,#,#'# ", " o#p#o#q#q#r#s#t#u#v#w#x#y#z#z#A#[#[# ", " B#C#D#E#E#F#G#H#I#J#K#r#q#L#L#M#N# ", " O#P#Q#R#S#T#U#B#V#D#D#E#E#F#W# ", " X#Y#Z#Z#`#`# $.$.$+$Q#@$ ", " #$$$%$%$%$%$&$Z# "}; tqsl-2.8.1/apps/json_defs.h0000755000175000017500000001456515003421124015577 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: json_defs.h // Purpose: shared build defines // Author: Luciano Cattani // Created: 2007/10/20 // RCS-ID: $Id: json_defs.h,v 1.6 2008/03/12 10:48:19 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_JSON_DEFS_H_ #define _WX_JSON_DEFS_H_ // Defines for component version. // The following symbols should be updated for each new component release // since some kind of tests, like those of AM_WXCODE_CHECKFOR_COMPONENT_VERSION() // for "configure" scripts under unix, use them. #define wxJSON_MAJOR 1 #define wxJSON_MINOR 2 #define wxJSON_RELEASE 1 // For non-Unix systems (i.e. when building without a configure script), // users of this component can use the following macro to check if the // current version is at least major.minor.release #define wxCHECK_JSON_VERSION(major, minor, release) \ (wxJSON_MAJOR > (major) || \ (wxJSON_MAJOR == (major) && wxJSON_MINOR > (minor)) || \ (wxJSON_MAJOR == (major) && wxJSON_MINOR == (minor) && wxJSON_RELEASE >= (release))) // Defines for shared builds. // Simple reference for using these macros and for writin components // which support shared builds: // // 1) use the WXDLLIMPEXP_MYCOMP in each class declaration: // class WXDLLIMPEXP_MYCOMP myCompClass { [...] }; // // 2) use the WXDLLIMPEXP_MYCOMP in the declaration of each global function: // WXDLLIMPEXP_MYCOMP int myGlobalFunc(); // // 3) use the WXDLLIMPEXP_DATA_MYCOMP() in the declaration of each global // variable: // WXDLLIMPEXP_DATA_MYCOMP(int) myGlobalIntVar; // #ifdef WXMAKINGDLL_JSON #define WXDLLIMPEXP_JSON WXEXPORT #define WXDLLIMPEXP_DATA_JSON(type) WXEXPORT type #elif defined(WXUSINGDLL) #define WXDLLIMPEXP_JSON WXIMPORT #define WXDLLIMPEXP_DATA_JSON(type) WXIMPORT type #else // not making nor using DLL #define WXDLLIMPEXP_JSON #define WXDLLIMPEXP_DATA_JSON(type) type #endif // the __PRETTY_FUNCTION__ macro expands to the full class's // member name in the GNU GCC. // For other compilers we use the standard __wxFUNCTION__ macro #if !defined( __GNUC__ ) #define __PRETTY_FUNCTION__ __WXFUNCTION__ #endif // define wxJSON_USE_UNICODE if wxWidgets was built with // unicode support #if defined( wxJSON_USE_UNICODE ) #undef wxJSON_USE_UNICODE #endif // do not modify the following lines #if wxUSE_UNICODE == 1 #define wxJSON_USE_UNICODE #endif // the following macro, if defined, cause the wxJSONValue to store // pointers to C-strings as pointers to statically allocated // C-strings. By default this macro is not defined // #define wxJSON_USE_CSTRING // the following macro, if defined, cause the wxJSONvalue and its // referenced data structure to store and increment a static // progressive counter in the ctor. // this is only useful for debugging purposes // #define WXJSON_USE_VALUE_COUNTER // the following macro is used by wxJSON internally and you should not // modify it. If the platform seems to support 64-bits integers, // the following lines define the 'wxJSON_64BIT_INT' macro #if defined( wxLongLong_t ) #define wxJSON_64BIT_INT #endif // // the following macro, if defined, cause the wxJSON library to // always use 32-bits integers also when the platform seems to // have native 64-bits support: by default the macro if not defined // #if defined(__WIN32__) || defined(_WIN32) #define wxJSON_NO_64BIT_INT #endif // #if defined( wxJSON_NO_64BIT_INT ) && defined( wxJSON_64BIT_INT ) #undef wxJSON_64BIT_INT #endif // // it seems that some compilers do not define 'long long int' limits // constants. For example, this is the output of the Borland BCC 5.5 // compiler when I tried to compile wxJSON with 64-bits integer support: // Error E2451 ..\src\jsonreader.cpp 1737: Undefined symbol 'LLONG_MAX' // in function wxJSONReader::Strtoll(const wxString &,__int64 *) // *** 1 errors in Compile *** // so, if the constants are not defined, I define them by myself #if !defined( LLONG_MAX ) #define LLONG_MAX 9223372036854775807 #endif #if !defined( ULLONG_MAX ) #define ULLONG_MAX 18446744073709551615 #endif #if !defined( LLONG_MIN ) #define LLONG_MIN -9223372036854775808 #endif // the same applies for all other integer constants #if !defined( INT_MIN ) #define INT_MIN -32768 #endif #if !defined( INT_MAX ) #define INT_MAX 32767 #endif #if !defined( UINT_MAX ) #define UINT_MAX 65535 #endif #if !defined( LONG_MIN ) #define LONG_MIN -2147483648 #endif #if !defined( LONG_MAX ) #define LONG_MAX 2147483647 #endif #if !defined( ULONG_MAX ) #define ULONG_MAX 4294967295 #endif #if !defined( SHORT_MAX ) #define SHORT_MAX 32767 #endif #if !defined( SHORT_MIN ) #define SHORT_MIN -32768 #endif #if !defined( USHORT_MAX ) #define USHORT_MAX 65535 #endif // // define the wxJSON_ASSERT() macro to expand to wxASSERT() // unless the wxJSON_NOABORT_ASSERT is defined // #define wxJSON_NOABORT_ASSERT #if defined(wxJSON_NOABORT_ASSERT) #define wxJSON_ASSERT(cond) #else #define wxJSON_ASSERT(cond) wxASSERT(cond); #endif // // the following macros are used by the wxJSONWriter::WriteStringValues() // when the wxJSONWRITER_SPLIT_STRING flag is set #define wxJSONWRITER_LAST_COL 50 #define wxJSONWRITER_SPLIT_COL 75 #define wxJSONWRITER_MIN_LENGTH 15 #define wxJSONWRITER_TAB_LENGTH 4 // // some compilers (i.e. MSVC++) defines their own 'snprintf' function // so if it is not defined, define it in the following lines // please note that we cannot use the wxWidget's counterpart 'wxSnprintf' // because the latter uses 'wxChar' but wxJSON only use 'char' #if !defined(snprintf) && defined(_MSC_VER) #define snprintf _snprintf #endif // // check if wxWidgets is compiled using --enable-stl in which case // we have to use different approaches when declaring the array and // key/value containers (see the docs: wxJSON internals: array and hash_map #undef wxJSON_USE_STL #if defined( wxUSE_STL ) && wxUSE_STL == 1 #define wxJSON_USE_STL #endif // // defines the MIN and MAX macro for numeric arguments // note that the safest way to define such functions is using templates #define MIN(a, b) a < b ? a : b #define MAX(a, b) a > b ? a : b #endif // _WX_JSON_DEFS_H_ tqsl-2.8.1/apps/jsonreader.cpp0000755000175000017500000021502415003421124016305 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: jsonreader.cpp // Purpose: the wxJSONReader class: a JSON text parser // Author: Luciano Cattani // Created: 2007/10/14 // RCS-ID: $Id: jsonreader.cpp,v 1.12 2008/03/12 10:48:19 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG_ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma implementation "jsonreader.cpp" #pragma clang diagnostic pop #endif #include "jsonreader.h" #include #include #include #include #include /*! \class wxJSONReader \brief The JSON parser The class is a JSON parser which reads a JSON formatted text and stores values in the \c wxJSONValue structure. The ctor accepts two parameters: the \e style flag, which controls how much error-tolerant should the parser be and an integer which is the maximum number of errors and warnings that have to be reported (the default is 30). If the JSON text document does not contain an open/close JSON character the function returns an \b invalid value object; in other words, the wxJSONValue::IsValid() function returns FALSE. This is the case of a document that is empty or contains only whitespaces or comments. If the document contains a starting object/array character immediately followed by a closing object/array character (i.e.: \c {}) then the function returns an \b empty array or object JSON value. This is a valid JSON object of type wxJSONTYPE_OBJECT or wxJSONTYPE_ARRAY whose wxJSONValue::Size() function returns ZERO. \par JSON text The wxJSON parser just skips all characters read from the input JSON text until the start-object '{' or start-array '[' characters are encontered (see the GetStart() function). This means that the JSON input text may contain anything before the first start-object/array character except these two chars themselves unless they are included in a C/C++ comment. Comment lines that appear before the first start array/object character, are non ignored if the parser is constructed with the wxJSONREADER_STORE_COMMENT flag: they are added to the comment's array of the root JSON value. Note that the parsing process stops when the internal DoRead() function returns. Because that function is recursive, the top-level close-object '}' or close-array ']' character cause the top-level DoRead() function to return thus stopping the parsing process regardless the EOF condition. This means that the JSON input text may contain anything \b after the top-level close-object/array character. Here are some examples: Returns a wxJSONTYPE_INVALID value (invalid JSON value) \code // this text does not contain an open array/object character \endcode Returns a wxJSONTYPE_OBJECT value of Size() = 0 \code { } \endcode Returns a wxJSONTYPE_ARRAY value of Size() = 0 \code [ ] \endcode Text before and after the top-level open/close characters is ignored. \code This non-JSON text does not cause the parser to report errors or warnings { } This non-JSON text does not cause the parser to report errors or warnings \endcode \par Extensions The wxJSON parser recognizes all JSON text plus some extensions that are not part of the JSON syntax but that many other JSON implementations do recognize. If the input text contains the following non-JSON text, the parser reports the situation as \e warnings and not as \e errors unless the parser object was constructed with the wxJSONREADER_STRICT flag. In the latter case the wxJSON parser is not tolerant. \li C/C++ comments: the parser recognizes C and C++ comments. Comments can optionally be stored in the value they refer to and can also be written back to the JSON text document. To know more about comment storage see \ref wxjson_comments \li case tolerance: JSON syntax states that the literals \c null, \c true and \c false must be lowercase; the wxJSON parser also recognizes mixed case literals such as, for example, \b Null or \b FaLSe. A \e warning is emitted. \li wrong or missing closing character: wxJSON parser is tolerant about the object / array closing character. When an open-array character '[' is encontered, the parser expects the corresponding close-array character ']'. If the character encontered is a close-object char '}' a warning is reported. A warning is also reported if the character is missing when the end-of-file is reached. \li multi-line strings: this feature allows a JSON string type to be split in two or more lines as in the standard C/C++ languages. The drawback is that this feature is error-prone and you have to use it with care. For more info about this topic read \ref wxjson_tutorial_style_split Note that you can control how much error-tolerant should the parser be and also you can specify how many and what extensions are recognized. See the constructor's parameters for more details. \par Unicode vs ANSI The parser can read JSON text from two very different kind of objects: \li a string object (\b wxString) \li a stream object (\b wxInputStream) When the input is from a string object, the character represented in the string is platform- and mode- dependent; in other words, characters are represented differently: in ANSI builds they depend on the charset in use and in Unicode builds they depend on the platform (UCS-2 on win32, UCS-4 or UTF-8 on GNU/Linux). When the input is from a stream object, the only recognized encoding format is UTF-8 for both ANSI and Unicode builds. \par Example: \code wxJSONValue value; wxJSONReader reader; // open a text file that contains the UTF-8 encoded JSON text wxFFileInputStream jsonText(_T("filename.utf8"), _T("r")); // read the file int numErrors = reader.Parse(jsonText, &value); if (numErrors > 0) { ::MessageBox(_T("Error reading the input file")); } \endcode Starting from version 1.1.0 the wxJSON reader and the writer has changed in their internal organization. To know more about ANSI and Unicode mode read \ref wxjson_tutorial_unicode. */ // if you have the debug build of wxWidgets and wxJSON you can see // trace messages by setting the: // WXTRACE=traceReader StoreComment // environment variable #if defined(JSONDEBUG) static const wxChar* traceMask = _T("traceReader"); static const wxChar* storeTraceMask = _T("StoreComment"); #endif //! Ctor /*! Construct a JSON parser object with the given parameters. JSON parser objects should always be constructed on the stack but it does not hurt to have a global JSON parser. \param flags this parameter controls how much error-tolerant should the parser be \param maxErrors the maximum number of errors (and warnings, too) that are reported by the parser. When the number of errors reaches this limit, the parser stops to read the JSON input text and no other error is reported. The \c flag parameter is the combination of ZERO or more of the following constants OR'ed together: \li wxJSONREADER_ALLOW_COMMENTS: C/C++ comments are recognized by the parser; a warning is reported by the parser \li wxJSONREADER_STORE_COMMENTS: C/C++ comments, if recognized, are stored in the value they refer to and can be rewritten back to the JSON text \li wxJSONREADER_CASE: the parser recognizes mixed-case literal strings \li wxJSONREADER_MISSING: the parser allows missing or wrong close-object and close-array characters \li wxJSONREADER_MULTISTRING: strings may be split in two or more lines \li wxJSONREADER_COMMENTS_AFTER: if STORE_COMMENTS if defined, the parser assumes that comment lines appear \b before the value they refer to unless this constant is specified. In the latter case, comments appear \b after the value they refer to. \li wxJSONREADER_NOUTF8_STREAM: suppress UTF-8 conversion when reading a string value from a stream: the reader assumes that the input stream is encoded in ANSI format and not in UTF-8; only meaningful in ANSI builds, this flag is simply ignored in Unicode builds. You can also use the following shortcuts to specify some predefined flag's combinations: \li wxJSONREADER_STRICT: all wxJSON extensions are reported as errors, this is the same as specifying a ZERO value as \c flags. \li wxJSONREADER_TOLERANT: this is the same as ALLOW_COMMENTS | CASE | MISSING | MULTISTRING; all wxJSON extensions are turned on but comments are not stored in the value objects. \par Example: The following code fragment construct a JSON parser, turns on all wxJSON extensions and also stores C/C++ comments in the value object they refer to. The parser assumes that the comments appear before the value: \code wxJSONReader reader(wxJSONREADER_TOLERANT | wxJSONREADER_STORE_COMMENTS); wxJSONValue root; int numErrors = reader.Parse(jsonText, &root); \endcode */ wxJSONReader::wxJSONReader(int flags, int maxErrors) { m_flags = flags; m_maxErrors = maxErrors; m_noUtf8 = false; #if !defined(wxJSON_USE_UNICODE) // in ANSI builds we can suppress UTF-8 conversion for both the writer and the reader if (m_flags & wxJSONREADER_NOUTF8_STREAM) { m_noUtf8 = true; } #endif } //! Dtor - does nothing wxJSONReader::~wxJSONReader() { } //! Parse the JSON document. /*! The two overloaded versions of the \c Parse() function read a JSON text stored in a wxString object or in a wxInputStream object. If \c val is a NULL pointer, the function does not store the values: it can be used as a JSON checker in order to check the syntax of the document. Returns the number of \b errors found in the document. If the returned value is ZERO and the parser was constructed with the \c wxJSONREADER_STRICT flag, then the parsed document is \e well-formed and it only contains valid JSON text. If the \c wxJSONREADER_TOLERANT flag was used in the parser's constructor, then a return value of ZERO does not mean that the document is \e well-formed because it may contain comments and other extensions that are not fatal for the wxJSON parser but other parsers may fail to recognize. You can use the \c GetWarningCount() function to know how many wxJSON extensions are present in the JSON input text. Note that the JSON value object \c val is not cleared by this function unless its type is of the wrong type. In other words, if \c val is of type wxJSONTYPE_ARRAY and it already contains 10 elements and the input document starts with a '[' (open-array char) then the elements read from the document are \b appended to the existing ones. On the other hand, if the text document starts with a '{' (open-object) char then this function must change the type of the \c val object to \c wxJSONTYPE_OBJECT and the old content of 10 array elements will be lost. \par Different input types The real parsing process in done using UTF-8 streams. If the input is from a \b wxString object, the Parse function first converts the input string in a temporary \b wxMemoryInputStream which contains the UTF-8 conversion of the string itself. Next, the overloaded Parse function is called. @param doc the JSON text that has to be parsed @param val the wxJSONValue object that contains the parsed text; if NULL the parser do not store anything but errors and warnings are reported @return the total number of errors encontered */ int wxJSONReader:: Parse(const wxString& doc, wxJSONValue* val) { #if !defined(wxJSON_USE_UNICODE) // in ANSI builds input from a string never use UTF-8 conversion bool noUtf8_bak = m_noUtf8; // save the current setting m_noUtf8 = true; #endif // convert the string to a UTF-8 / ANSI memory stream and calls overloaded Parse() char* readBuff = 0; wxCharBuffer utf8CB = doc.ToUTF8(); // the UTF-8 buffer #if !defined(wxJSON_USE_UNICODE) wxCharBuffer ansiCB(doc.c_str()); // the ANSI buffer if (m_noUtf8) { readBuff = ansiCB.data(); } else { readBuff = utf8CB.data(); } #else readBuff = utf8CB.data(); #endif // now construct the temporary memory input stream size_t len = strlen(readBuff); wxMemoryInputStream is(readBuff, len); int numErr = Parse(is, val); #if !defined(wxJSON_USE_UNICODE) m_noUtf8 = noUtf8_bak; #endif return numErr; } //! \overload Parse(const wxString&, wxJSONValue*) int wxJSONReader::Parse(wxInputStream& is, wxJSONValue* val) { // if val == 0 the 'temp' JSON value will be passed to DoRead() wxJSONValue temp; m_level = 0; m_depth = 0; m_lineNo = 1; m_colNo = 1; m_peekChar = -1; m_errors.clear(); m_warnings.clear(); // if a wxJSONValue is not passed to the Parse function // we set the temporary object created on the stack // I know this will slow down the validation of input if (val == 0) { val = &temp; } wxASSERT(val); // set the wxJSONValue object's pointers for comment storage m_next = val; m_next->SetLineNo(-1); m_lastStored = 0; m_current = 0; int ch = GetStart(is); switch (ch) { case '{' : val->SetType(wxJSONTYPE_OBJECT); break; case '[' : val->SetType(wxJSONTYPE_ARRAY); break; default : AddError(_T("Cannot find a start object/array character")); return m_errors.size(); break; } // returning from DoRead() could be for EOF or for // the closing array-object character // if -1 is returned, it is as an error because the lack // of close-object/array characters // note that the missing close-chars error messages are // added by the DoRead() function ch = DoRead(is, *val); return m_errors.size(); } //! Returns the start of the document /*! This is the first function called by the Parse() function and it searches the input stream for the starting character of a JSON text and returns it. JSON text start with '{' or '['. If the two starting characters are inside a C/C++ comment, they are ignored. Returns the JSON-text start character or -1 on EOF. @param is the input stream that contains the JSON text @return -1 on errors or EOF; one of '{' or '[' */ int wxJSONReader::GetStart(wxInputStream& is) { int ch = 0; do { switch (ch) { case 0 : ch = ReadChar(is); break; case '{' : return ch; break; case '[' : return ch; break; case '/' : ch = SkipComment(is); StoreComment(0); break; default : ch = ReadChar(is); break; } } while (ch >= 0); return ch; } //! Return a reference to the error message's array. const wxArrayString& wxJSONReader::GetErrors() const { return m_errors; } //! Return a reference to the warning message's array. const wxArrayString& wxJSONReader::GetWarnings() const { return m_warnings; } //! Return the depth of the JSON input text /*! The function returns the number of times the recursive \c DoRead function was called in the parsing process thus returning the maximum depth of the JSON input text. */ int wxJSONReader::GetDepth() const { return m_depth; } //! Return the size of the error message's array. int wxJSONReader::GetErrorCount() const { return m_errors.size(); } //! Return the size of the warning message's array. int wxJSONReader::GetWarningCount() const { return m_warnings.size(); } //! Read a character from the input JSON document. /*! The function returns the next byte from the UTF-8 stream as an INT. In case of errors or EOF, the function returns -1. The function also updates the \c m_lineNo and \c m_colNo data members and converts all CR+LF sequence in LF. This function only returns one byte UTF-8 (one code unit) at a time and not Unicode code points. The only reason for this function is to process line and column numbers. @param is the input stream that contains the JSON text @return the next char (one single byte) in the input stream or -1 on error or EOF */ int wxJSONReader::ReadChar(wxInputStream& is) { if (is.Eof()) { return -1; } unsigned char ch = is.GetC(); size_t last = is.LastRead(); // returns ZERO if EOF if (last == 0) { return -1; } // the function also converts CR in LF. only LF is returned // in the case of CR+LF int nextChar; if (ch == '\r') { m_colNo = 1; nextChar = PeekChar(is); if (nextChar == -1) { return -1; } else if (nextChar == '\n') { ch = is.GetC(); } } if (ch == '\n') { ++m_lineNo; m_colNo = 1; } else { ++m_colNo; } return static_cast(ch); } //! Peek a character from the input JSON document /*! This function just calls the \b Peek() function on the stream and returns it. @param is the input stream that contains the JSON text @return the next char (one single byte) in the input stream or -1 on error or EOF */ int wxJSONReader::PeekChar(wxInputStream& is) { int ch = -1; unsigned char c; if (!is.Eof()) { c = is.Peek(); ch = c; } return ch; } //! Reads the JSON text document (internal use) /*! This is a recursive function that is called by \c Parse() and by the \c DoRead() function itself when a new object / array character is encontered. The function returns when a EOF condition is encontered or when the corresponding close-object / close-array char is encontered. The function also increments the \c m_level data member when it is entered and decrements it on return. It also sets \c m_depth equal to \c m_level if \c m_depth is less than \c m_level. The function is the heart of the wxJSON parser class but it is also very easy to understand because JSON syntax is very easy. Returns the last close-object/array character read or -1 on EOF. @param is the input stream that contains the JSON text @param parent the JSON value object that is the parent of all subobjects read by the function until the next close-object/array (for the top-level \c DoRead function \c parent is the root JSON object) @return one of close-array or close-object char or -1 on error or EOF */ int wxJSONReader::DoRead(wxInputStream& is, wxJSONValue& parent) { ++m_level; if (m_depth < m_level) { m_depth = m_level; } // 'value' is the wxJSONValue structure that has to be // read. Data read from the JSON text input is stored // in the following object. wxJSONValue value(wxJSONTYPE_INVALID); // sets the pointers to the current, next and last-stored objects // in order to determine the value to which a comment refers to m_next = &value; m_current = &parent; m_current->SetLineNo(m_lineNo); m_lastStored = 0; // the 'key' string is stored from 'value' when a ':' is encontered wxString key; // the character read: -1=EOF, 0=to be read int ch = 0; do { // we read until ch < 0 switch (ch) { case 0 : ch = ReadChar(is); break; case ' ' : case '\t' : case '\n' : case '\r' : ch = SkipWhiteSpace(is); break; case -1 : // the EOF break; case '/' : ch = SkipComment(is); StoreComment(&parent); break; case '{' : if (parent.IsObject()) { if (key.empty()) { AddError(_T("\'{\' is not allowed here (\'name\' is missing")); } if (value.IsValid()) { AddError(_T("\'{\' cannot follow a \'value\'")); } } else if (parent.IsArray()) { if (value.IsValid()) { AddError(_T("\'{\' cannot follow a \'value\' in JSON array")); } } else { wxJSON_ASSERT(0); // always fails } // the openobject char cause the DoRead() to be called recursively value.SetType(wxJSONTYPE_OBJECT); ch = DoRead(is, value); break; case '}' : if (!parent.IsObject()) { AddWarning(wxJSONREADER_MISSING, _T("Trying to close an array using the \'}\' (close-object) char")); } // close-object: store the current value, if any StoreValue(ch, key, value, parent); m_current = &parent; m_next = 0; m_current->SetLineNo(m_lineNo); ch = ReadChar(is); return ch; break; case '[' : if (parent.IsObject()) { if (key.empty()) { AddError(_T("\'[\' is not allowed here (\'name\' is missing")); } if (value.IsValid()) { AddError(_T("\'[\' cannot follow a \'value\' text")); } } else if (parent.IsArray()) { if (value.IsValid()) { AddError(_T("\'[\' cannot follow a \'value\'")); } } else { wxJSON_ASSERT(0); // always fails } // open-array cause the DoRead() to be called recursively value.SetType(wxJSONTYPE_ARRAY); ch = DoRead(is, value); break; case ']' : if (!parent.IsArray()) { // wrong close-array char (should be close-object) AddWarning(wxJSONREADER_MISSING, _T("Trying to close an object using the \']\' (close-array) char")); } StoreValue(ch, key, value, parent); m_current = &parent; m_next = 0; m_current->SetLineNo(m_lineNo); return 0; // returning ZERO for reading the next char break; case ',' : // store the value, if any StoreValue(ch, key, value, parent); key.clear(); ch = ReadChar(is); break; case '\"' : ch = ReadString(is, value); // read a JSON string type m_current = &value; m_next = 0; break; case '\'' : ch = ReadMemoryBuff(is, value); // read a memory buffer type m_current = &value; m_next = 0; break; case ':' : // key / value separator m_current = &value; m_current->SetLineNo(m_lineNo); m_next = 0; if (!parent.IsObject()) { AddError(_T("\':\' can only used in object's values")); } else if (!value.IsString()) { AddError(_T("\':\' follows a value which is not of type \'string\'")); } else if (!key.empty()) { AddError(_T("\':\' not allowed where a \'name\' string was already available")); } else { // the string in 'value' is set as the 'key' key = value.AsString(); value.SetType(wxJSONTYPE_INVALID); } ch = ReadChar(is); break; default : // no special char: it is a literal or a number // errors are checked in the 'ReadValue()' function. m_current = &value; m_current->SetLineNo(m_lineNo); m_next = 0; ch = ReadValue(is, ch, value); break; } // end switch } while (ch >= 0); // the DoRead() should return when the close-object/array char is encontered // if we are here, the EOF condition was encontered so one or more close-something // characters are missing if (parent.IsArray()) { AddWarning(wxJSONREADER_MISSING, _T("\']\' missing at end of file")); } else if (parent.IsObject()) { AddWarning(wxJSONREADER_MISSING, _T("\'}\' missing at end of file")); } else { wxJSON_ASSERT(0); } // we store the value, as there is a missing close-object/array char StoreValue(ch, key, value, parent); --m_level; return ch; } //! Store a value in the parent object. /*! The function is called by \c DoRead() when a the comma or a close-object/array character is encontered and stores the current value read by the parser in the parent object. The function checks that \c value is not invalid and that \c key is not an empty string if \c parent is an object. \param ch the character read: a comma or close objecty/array char \param key the \b key string: must be empty if \c parent is an array \param value the current JSON value to be stored in \c parent \param parent the JSON value that is the parent of \c value. \return none */ void wxJSONReader::StoreValue(int ch, const wxString& key, wxJSONValue& value, wxJSONValue& parent) { // if 'ch' == } or ] than value AND key may be empty when a open object/array // is immediately followed by a close object/array // // if 'ch' == , (comma) value AND key (for TypeMap) cannot be empty // #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) ch=%d char=%c"), __PRETTY_FUNCTION__, ch, static_cast(ch)); wxLogTrace(traceMask, _T("(%s) value=%s"), __PRETTY_FUNCTION__, value.AsString().c_str()); #endif m_current = 0; m_next = &value; m_lastStored = 0; m_next->SetLineNo(-1); if (!value.IsValid() && key.empty()) { // OK, if the char read is a close-object or close-array if (ch == '}' || ch == ']') { m_lastStored = 0; #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) key and value are empty, returning"), __PRETTY_FUNCTION__); #endif } else { AddError(_T("key or value is missing for JSON value")); } } else { // key or value are not empty if (parent.IsObject()) { if (!value.IsValid()) { AddError(_T("cannot store the value: \'value\' is missing for JSON object type")); } else if (key.empty()) { AddError(_T("cannot store the value: \'key\' is missing for JSON object type")); } else { // OK, adding the value to parent key/value map #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) adding value to key:%s"), __PRETTY_FUNCTION__, key.c_str()); #endif parent[key] = value; m_lastStored = &(parent[key]); m_lastStored->SetLineNo(m_lineNo); } } else if (parent.IsArray()) { if (!value.IsValid()) { AddError(_T("cannot store the item: \'value\' is missing for JSON array type")); } if (!key.empty()) { AddError(_T("cannot store the item: \'key\' (\'%s\') is not permitted in JSON array type"), key); } #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) appending value to parent array"), __PRETTY_FUNCTION__); #endif parent.Append(value); const wxJSONInternalArray* arr = parent.AsArray(); wxJSON_ASSERT(arr); m_lastStored = &(arr->Last()); m_lastStored->SetLineNo(m_lineNo); } else { wxJSON_ASSERT(0); // should never happen } } value.SetType(wxJSONTYPE_INVALID); value.ClearComments(); } //! Add a error message to the error's array /*! The overloaded versions of this function add an error message to the error's array stored in \c m_errors. The error message is formatted as follows: \code Error: line xxx, col xxx - \endcode The \c msg parameter is the description of the error; line's and column's number are automatically added by the functions. The \c fmt parameter is a format string that has the same syntax as the \b printf function. Note that it is the user's responsiability to provide a format string suitable with the arguments: another string or a character. */ void wxJSONReader::AddError(const wxString& msg) { wxString err; err.Printf(_T("Error: line %d, col %d - %s"), m_lineNo, m_colNo, msg.c_str()); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) %s"), __PRETTY_FUNCTION__, err.c_str()); #endif if (static_cast(m_errors.size()) < m_maxErrors) { m_errors.Add(err); } else if (static_cast(m_errors.size()) == m_maxErrors) { m_errors.Add(_T("ERROR: too many error messages - ignoring further errors")); } // else if (m_errors > m_maxErrors) do nothing, thus ignore the error message } //! \overload AddError(const wxString&) void wxJSONReader::AddError(const wxString& fmt, const wxString& str) { wxString s; s.Printf(fmt.c_str(), str.c_str()); AddError(s); } //! \overload AddError(const wxString&) void wxJSONReader::AddError(const wxString& fmt, wxChar c) { wxString s; s.Printf(fmt.c_str(), c); AddError(s); } //! Add a warning message to the warning's array /*! The warning description is as follows: \code Warning: line xxx, col xxx - \endcode Warning messages are generated by the parser when the JSON text that has been read is not well-formed but the error is not fatal and the parser recognizes the text as an extension to the JSON standard (see the parser's ctor for more info about wxJSON extensions). Note that the parser has to be constructed with a flag that indicates if each individual wxJSON extension is on. If the warning message is related to an extension that is not enabled in the parser's \c m_flag data member, this function calls AddError() and the warning message becomes an error message. The \c type parameter is one of the same constants that specify the parser's extensions. If type is ZERO than the function always adds a warning */ void wxJSONReader::AddWarning(int type, const wxString& msg) { // if 'type' AND 'm_flags' == 1 than the extension is // ON. Otherwise it is OFF anf the function calls AddError() if (type != 0) { if ((type & m_flags) == 0) { AddError(msg); return; } } wxString err; err.Printf(_T("Warning: line %d, col %d - %s"), m_lineNo, m_colNo, msg.c_str()); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) %s"), __PRETTY_FUNCTION__, err.c_str()); #endif if (static_cast(m_warnings.size()) < m_maxErrors) { m_warnings.Add(err); } else if (static_cast(m_warnings.size()) == m_maxErrors) { m_warnings.Add(_T("Error: too many warning messages - ignoring further warnings")); } // else do nothing, thus ignore the warning message } //! Skip all whitespaces. /*! The function reads characters from the input text and returns the first non-whitespace character read or -1 if EOF. Note that the function does not rely on the \b isspace function of the C library but checks the space constants: space, TAB and LF. */ int wxJSONReader::SkipWhiteSpace(wxInputStream& is) { // just read one byte at a time and check for whitespaces int ch; do { ch = ReadChar(is); if (ch < 0) { break; } } while (ch == ' ' || ch == '\n' || ch == '\t') ; //NOLINT(whitespace/semicolon) #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) end whitespaces line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); #endif return ch; } //! Skip a comment /*! The function is called by DoRead() when a '/' (slash) character is read from the input stream assuming that a C/C++ comment is starting. Returns the first character that follows the comment or -1 on EOF. The function also adds a warning message because comments are not valid JSON text. The function also stores the comment, if any, in the \c m_comment data member: it can be used by the DoRead() function if comments have to be stored in the value they refer to. */ int wxJSONReader::SkipComment(wxInputStream& is) { static const wxChar* warn = _T("Comments may be tolerated in JSON text but they are not part of JSON syntax"); // if it is a comment, then a warning is added to the array // otherwise it is an error: values cannot start with a '/' // read the char next to the first slash int ch = ReadChar(is); if (ch < 0) { return -1; } #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) start comment line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); #endif // the temporary UTF-8/ANSI buffer that holds the comment string. This will be // converted to a wxString object using wxString::FromUTF8() or From8BitData() wxMemoryBuffer utf8Buff; unsigned char c; if (ch == '/') { // C++ comment, read until end-of-line // C++ comment strings are in UTF-8 format. we store all // UTF-8 code units until the first LF or CR+LF AddWarning(wxJSONREADER_ALLOW_COMMENTS, warn); m_commentLine = m_lineNo; utf8Buff.AppendData("//", 2); while (ch >= 0) { if (ch == '\n') { break; } if (ch == '\r') { ch = PeekChar(is); if (ch == '\n') { ch = ReadChar(is); } break; } else { // store the char in the UTF8 temporary buffer c = (unsigned char) ch; utf8Buff.AppendByte(c); } ch = ReadChar(is); } // now convert the temporary UTF-8 buffer m_comment = wxString::FromUTF8((const char*) utf8Buff.GetData(), utf8Buff.GetDataLen()); // check if a C-style comment } else if (ch == '*') { // C-style comment AddWarning(wxJSONREADER_ALLOW_COMMENTS, warn); m_commentLine = m_lineNo; utf8Buff.AppendData("/*", 2); while (ch >= 0) { // check the END-COMMENT chars ('*/') if (ch == '*') { ch = PeekChar(is); if (ch == '/') { ch = ReadChar(is); // read the '/' char ch = ReadChar(is); // read the next char that will be returned utf8Buff.AppendData("*/", 2); break; } } // store the char in the UTF8 temporary buffer c = (unsigned char) ch; utf8Buff.AppendByte(c); ch = ReadChar(is); } // now convert the temporary buffer in a wxString object if (m_noUtf8) { m_comment = wxString::From8BitData((const char*) utf8Buff.GetData(), utf8Buff.GetDataLen()); } else { m_comment = wxString::FromUTF8((const char*) utf8Buff.GetData(), utf8Buff.GetDataLen()); } } else { // it is not a comment, return the character next the first '/' AddError(_T("Strange '/' (did you want to insert a comment?)")); // we read until end-of-line OR end of C-style comment OR EOF // because a '/' should be a start comment while (ch >= 0) { ch = ReadChar(is); if (ch == '*' && PeekChar(is) == '/') { break; } if (ch == '\n') { break; } } // read the next char that will be returned ch = ReadChar(is); } #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) end comment line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); wxLogTrace(storeTraceMask, _T("(%s) end comment line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); wxLogTrace(storeTraceMask, _T("(%s) comment=%s"), __PRETTY_FUNCTION__, m_comment.c_str()); #endif return ch; } //! Read a string value /*! The function reads a string value from input stream and it is called by the \c DoRead() function when it enconters the double quote characters. The function read all bytes up to the next double quotes (unless it is escaped) and stores them in a temporary UTF-8 memory buffer. Also, the function processes the escaped characters defined in the JSON syntax. Next, the function tries to convert the UTF-8 buffer to a \b wxString object using the \b wxString::FromUTF8 function. Depending on the build mode, we can have the following: \li in Unicode the function always succeeds, provided that the buffer contains valid UTF-8 code units. \li in ANSI builds the conversion may fail because of the presence of unrepresentable characters in the current locale. In this case, the default behaviour is to perform a char-by-char conversion; every char that cannot be represented in the current locale is stored as \e unicode \e escaped \e sequence \li in ANSI builds, if the reader is constructed with the wxJSONREADER_NOUTF8_STREAM then no conversion takes place and the UTF-8 temporary buffer is simply \b copied to the \b wxString object The string is, finally, stored in the provided wxJSONValue argument provided that it is empty or it contains a string value. This is because the parser class recognizes multi-line strings like the following one: \code [ "This is a very long string value which is split into more" "than one line because it is more human readable" ] \endcode Because of the lack of the value separator (,) the parser assumes that the string was split into several double-quoted strings. If the value does not contain a string then an error is reported. Splitted strings cause the parser to report a warning. */ int wxJSONReader::ReadString(wxInputStream& is, wxJSONValue& val) { // the char last read is the opening quotes (") wxMemoryBuffer utf8Buff; char ues[8]; // stores a Unicode Escaped Esquence: \uXXXX int ch = 0; while (ch >= 0) { ch = ReadChar(is); unsigned char c = (unsigned char) ch; if (ch == '\\') { // an escape sequence ch = ReadChar(is); switch (ch) { case -1 : // EOF break; case 't' : utf8Buff.AppendByte('\t'); break; case 'n' : utf8Buff.AppendByte('\n'); break; case 'b' : utf8Buff.AppendByte('\b'); break; case 'r' : utf8Buff.AppendByte('\r'); break; case '\"' : utf8Buff.AppendByte('\"'); break; case '\\' : utf8Buff.AppendByte('\\'); break; case '/' : utf8Buff.AppendByte('/'); break; case 'f' : utf8Buff.AppendByte('\f'); break; case 'u' : ch = ReadUES(is, ues); if (ch < 0) { // if EOF, returns return ch; } // append the escaped character to the UTF8 buffer AppendUES(utf8Buff, ues); // many thanks to Bryan Ashby who discovered this bug continue; // break; default : AddError(_T("Unknown escaped character \'\\%c\'"), ch); } } else { // we have read a non-escaped character so we have to append it to // the temporary UTF-8 buffer until the next quote char if (ch == '\"') { break; } utf8Buff.AppendByte(c); } } // if UTF-8 conversion is disabled (ANSI builds only) we just copy the // bit data to a wxString object wxString s; if (m_noUtf8) { s = wxString::From8BitData((const char*) utf8Buff.GetData(), utf8Buff.GetDataLen()); } else { // perform UTF-8 conversion // first we check that the UTF-8 buffer is correct, i.e. it contains valid // UTF-8 code points. // this works in both ANSI and Unicode builds. size_t convLen = wxConvUTF8.ToWChar(0, // wchar_t destination 0, // size_t destLenght (const char*) utf8Buff.GetData(), // char_t source utf8Buff.GetDataLen()); // size_t sourceLenght if (convLen == wxCONV_FAILED) { AddError(_T("String value: the UTF-8 stream is invalid")); s.append(_T("")); } else { #if defined(wxJSON_USE_UNICODE) // in Unicode just convert to wxString s = wxString::FromUTF8((const char*) utf8Buff.GetData(), utf8Buff.GetDataLen()); #else // in ANSI, the conversion may fail and an empty string is returned // in this case, the reader do a char-by-char conversion storing // unicode escaped sequences of unrepresentable characters s = wxString::FromUTF8((const char*) utf8Buff.GetData(), utf8Buff.GetDataLen()); if (s.IsEmpty()) { int r = ConvertCharByChar(s, utf8Buff); // return number of escaped sequences if (r > 0) { AddWarning(0, _T("The string value contains unrepresentable Unicode characters")); } } #endif } } #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); wxLogTrace(traceMask, _T("(%s) string read=%s"), __PRETTY_FUNCTION__, s.c_str()); wxLogTrace(traceMask, _T("(%s) value=%s"), __PRETTY_FUNCTION__, val.AsString().c_str()); #endif // now assign the string to the JSON-value 'value' // must check that: // 'value' is empty // 'value' is a string; concatenate it but emit warning if (!val.IsValid()) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) assigning the string to value"), __PRETTY_FUNCTION__); #endif val = s; } else if (val.IsString()) { AddWarning(wxJSONREADER_MULTISTRING, _T("Multiline strings are not allowed by JSON syntax")); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) concatenate the string to value"), __PRETTY_FUNCTION__); #endif val.Cat(s); } else { AddError(_T("String value \'%s\' cannot follow another value"), s); } // store the input text's line number when the string was stored in 'val' val.SetLineNo(m_lineNo); // read the next char after the closing quotes and returns it if (ch >= 0) { ch = ReadChar(is); } return ch; } //! Reads a token string /*! This function is called by the ReadValue() when the first character encontered is not a special char and it is not a double-quote. The only possible type is a literal or a number which all lies in the US-ASCII charset so their UTF-8 encodeing is the same as US-ASCII. The function simply reads one byte at a time from the stream and appends them to a \b wxString object. Returns the next character read. A token cannot include \e unicode \e escaped \e sequences so this function does not try to interpret such sequences. @param is the input stream @param ch the character read by DoRead @param s the string object that contains the token read @return -1 in case of errors or EOF */ int wxJSONReader::ReadToken(wxInputStream& is, int ch, wxString& s) { int nextCh = ch; while (nextCh >= 0) { switch (nextCh) { case ' ' : case ',' : case ':' : case '[' : case ']' : case '{' : case '}' : case '\t' : case '\n' : case '\r' : case '\b' : #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); wxLogTrace(traceMask, _T("(%s) token read=%s"), __PRETTY_FUNCTION__, s.c_str()); #endif return nextCh; break; default : s.Append((unsigned char) nextCh, 1); break; } // read the next character nextCh = ReadChar(is); } #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) EOF on line=%d col=%d"), __PRETTY_FUNCTION__, m_lineNo, m_colNo); wxLogTrace(traceMask, _T("(%s) EOF - token read=%s"), __PRETTY_FUNCTION__, s.c_str()); #endif return nextCh; } //! Read a value from input stream /*! The function is called by DoRead() when it enconters a char that is not a special char nor a double-quote. It assumes that the string is a numeric value or a literal boolean value and stores it in the wxJSONValue object \c val. The function also checks that \c val is of type wxJSONTYPE_INVALID otherwise an error is reported because a value cannot follow another value: maybe a (,) or (:) is missing. If the literal starts with a digit, a plus or minus sign, the function tries to interpret it as a number. The following are tried by the function, in this order: \li if the literal starts with a digit: signed integer, then unsigned integer and finally double conversion is tried \li if the literal starts with a minus sign: signed integer, then double conversion is tried \li if the literal starts with plus sign: unsigned integer then double conversion is tried Returns the next character or -1 on EOF. */ int wxJSONReader::ReadValue(wxInputStream& is, int ch, wxJSONValue& val) { wxString s; int nextCh = ReadToken(is, ch, s); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value=%s"), __PRETTY_FUNCTION__, val.AsString().c_str()); #endif if (val.IsValid()) { AddError(_T("Value \'%s\' cannot follow a value: \',\' or \':\' missing?"), s); return nextCh; } // variables used for converting numeric values bool r; double d; #if defined(wxJSON_64BIT_INT) wxInt64 i64; wxUint64 ui64; #else unsigned long int ul; long int l; #endif // first try the literal strings lowercase and nocase if (s == _T("null")) { val.SetType(wxJSONTYPE_NULL); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value = NULL"), __PRETTY_FUNCTION__); #endif return nextCh; } else if (s.CmpNoCase(_T("null")) == 0) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value = NULL"), __PRETTY_FUNCTION__); #endif AddWarning(wxJSONREADER_CASE, _T("the \'null\' literal must be lowercase")); val.SetType(wxJSONTYPE_NULL); return nextCh; } else if (s == _T("true")) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value = TRUE"), __PRETTY_FUNCTION__); #endif val = true; return nextCh; } else if (s.CmpNoCase(_T("true")) == 0) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value = TRUE"), __PRETTY_FUNCTION__); #endif AddWarning(wxJSONREADER_CASE, _T("the \'true\' literal must be lowercase")); val = true; return nextCh; } else if (s == _T("false")) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value = FALSE"), __PRETTY_FUNCTION__); #endif val = false; return nextCh; } else if (s.CmpNoCase(_T("false")) == 0) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) value = FALSE"), __PRETTY_FUNCTION__); #endif AddWarning(wxJSONREADER_CASE, _T("the \'false\' literal must be lowercase")); val = false; return nextCh; } // try to convert to a number if the token starts with a digit, a plus or a minus // sign. The function first states what type of conversion are tested: // 1. first signed integer (not if 'ch' == '+') // 2. unsigned integer (not if 'ch' == '-') // 3. finally double bool tSigned = true, tUnsigned = true, tDouble = true; switch (ch) { case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : // first try a signed integer, then a unsigned integer, then a double break; case '+' : // the plus sign forces a unsigned integer tSigned = false; break; case '-' : // try signed and double tUnsigned = false; break; default : AddError(_T("Literal \'%s\' is incorrect (did you forget quotes?)"), s); return nextCh; } if (tSigned) { #if defined(wxJSON_64BIT_INT) r = Strtoll(s, &i64); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) convert to wxInt64 result=%d"), __PRETTY_FUNCTION__, r); #endif if (r) { // store the value val = i64; return nextCh; } #else r = s.ToLong(&l); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) convert to int result=%d"), __PRETTY_FUNCTION__, r); #endif if (r) { // store the value val = static_cast(l); return nextCh; } #endif } if (tUnsigned) { #if defined(wxJSON_64BIT_INT) r = Strtoull(s, &ui64); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) convert to wxUint64 result=%d"), __PRETTY_FUNCTION__, r); #endif if (r) { // store the value val = ui64; return nextCh; } #else r = s.ToULong(&ul); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) convert to int result=%d"), __PRETTY_FUNCTION__, r); #endif if (r) { // store the value val = (unsigned int) ul; return nextCh; } #endif } if (tDouble) { r = s.ToDouble(&d); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) convert to double result=%d"), __PRETTY_FUNCTION__, r); #endif if (r) { // store the value val = d; return nextCh; } } // the value is not syntactically correct AddError(_T("Literal \'%s\' is incorrect (did you forget quotes?)"), s); return nextCh; return nextCh; } //! Read a 4-hex-digit unicode character. /*! The function is called by ReadString() when the \b \\u sequence is encontered; the sequence introduces a control character in the form: \code \uXXXX \endcode where XXXX is a four-digit hex code.. The function reads four chars from the input UTF8 stream by calling ReadChar() four times: if EOF is encontered before reading four chars, -1 is also returned and no sequence interpretation is performed. The function stores the 4 hexadecimal digits in the \c uesBuffer parameter. Returns the character after the hex sequence or -1 if EOF. \b NOTICE: although the JSON syntax states that only control characters are represented in this way, the wxJSON library reads and recognizes all unicode characters in the BMP. */ int wxJSONReader::ReadUES(wxInputStream& is, char* uesBuffer) { int ch; for (int i = 0; i < 4; i++) { ch = ReadChar(is); if (ch < 0) { return ch; } uesBuffer[i] = (unsigned char) ch; } uesBuffer[4] = 0; // makes a ASCIIZ string return 0; } //! The function appends a Unice Escaped Sequence to the temporary UTF8 buffer /*! This function is called by \c ReadString() when a \e unicode \e escaped \e sequence is read from the input text as for example: \code \u0001 \endcode which represents a control character. The \c uesBuffer parameter contains the 4 hexadecimal digits that are read from \c ReadUES. The function tries to convert the 4 hex digits in a \b wchar_t character which is appended to the memory buffer \c utf8Buff after converting it to UTF-8. If the conversion from hexadecimal fails, the function does not store the character in the UTF-8 buffer and an error is reported. The function is the same in ANSI and Unicode. Returns -1 if the buffer does not contain valid hex digits. sequence. On success returns ZERO. @param utf8Buff the UTF-8 buffer to which the control char is written @param uesBuffer the four-hex-digits read from the input text @return ZERO on success, -1 if the four-hex-digit buffer cannot be converted */ int wxJSONReader::AppendUES(wxMemoryBuffer& utf8Buff, const char* uesBuffer) { unsigned long l; int r = sscanf(uesBuffer, "%lx", &l); // r is the assigned items if (r != 1) { AddError(_T("Invalid Unicode Escaped Sequence")); return -1; } #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) unicode sequence=%s code=%ld"), __PRETTY_FUNCTION__, uesBuffer, l); #endif wchar_t ch = (wchar_t) l; char buffer[16]; size_t len = wxConvUTF8.FromWChar(buffer, 10, &ch, 1); // seems that the wxMBConv classes always appends a NULL byte to // the converted buffer if (len > 1) { len = len - 1; } utf8Buff.AppendData(buffer, len); // should never fail wxASSERT(len != wxCONV_FAILED); return 0; } //! Store the comment string in the value it refers to. /*! The function searches a suitable value object for storing the comment line that was read by the parser and temporarily stored in \c m_comment. The function searches the three values pointed to by: \li \c m_next \li \c m_current \li \c m_lastStored The value that the comment refers to is: \li if the comment is on the same line as one of the values, the comment refer to that value and it is stored as \b inline. \li otherwise, if the comment flag is wxJSONREADER_COMMENTS_BEFORE, the comment lines are stored in the value pointed to by \c m_next \li otherwise, if the comment flag is wxJSONREADER_COMMENTS_AFTER, the comment lines are stored in the value pointed to by \c m_current or m_latStored Note that the comment line is only stored if the wxJSONREADER_STORE_COMMENTS flag was used when the parser object was constructed; otherwise, the function does nothing and immediately returns. Also note that if the comment line has to be stored but the function cannot find a suitable value to add the comment line to, an error is reported (note: not a warning but an error). */ void wxJSONReader::StoreComment(const wxJSONValue* parent) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) m_comment=%s"), __PRETTY_FUNCTION__, m_comment.c_str()); wxLogTrace(storeTraceMask, _T("(%s) m_flags=%d m_commentLine=%d"), __PRETTY_FUNCTION__, m_flags, m_commentLine); wxLogTrace(storeTraceMask, _T("(%s) m_current=%p"), __PRETTY_FUNCTION__, m_current); wxLogTrace(storeTraceMask, _T("(%s) m_next=%p"), __PRETTY_FUNCTION__, m_next); wxLogTrace(storeTraceMask, _T("(%s) m_lastStored=%p"), __PRETTY_FUNCTION__, m_lastStored); #endif // first check if the 'store comment' bit is on if ((m_flags & wxJSONREADER_STORE_COMMENTS) == 0) { m_comment.clear(); return; } // check if the comment is on the same line of one of the // 'current', 'next' or 'lastStored' value if (m_current != 0) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) m_current->lineNo=%d"), __PRETTY_FUNCTION__, m_current->GetLineNo()); #endif if (m_current->GetLineNo() == m_commentLine) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) comment added to \'m_current\' INLINE"), __PRETTY_FUNCTION__); #endif m_current->AddComment(m_comment, wxJSONVALUE_COMMENT_INLINE); m_comment.clear(); return; } } if (m_next != 0) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) m_next->lineNo=%d"), __PRETTY_FUNCTION__, m_next->GetLineNo()); #endif if (m_next->GetLineNo() == m_commentLine) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) comment added to \'m_next\' INLINE"), __PRETTY_FUNCTION__); #endif m_next->AddComment(m_comment, wxJSONVALUE_COMMENT_INLINE); m_comment.clear(); return; } } if (m_lastStored != 0) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) m_lastStored->lineNo=%d"), __PRETTY_FUNCTION__, m_lastStored->GetLineNo()); #endif if (m_lastStored->GetLineNo() == m_commentLine) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) comment added to \'m_lastStored\' INLINE"), __PRETTY_FUNCTION__); #endif m_lastStored->AddComment(m_comment, wxJSONVALUE_COMMENT_INLINE); m_comment.clear(); return; } } // if comment is BEFORE, store the comment in the 'm_next' // or 'm_current' value // if comment is AFTER, store the comment in the 'm_lastStored' // or 'm_current' value if (m_flags & wxJSONREADER_COMMENTS_AFTER) { // comment AFTER if (m_current) { if (m_current == parent || !m_current->IsValid()) { AddError(_T("Cannot find a value for storing the comment (flag AFTER)")); } else { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) comment added to m_current (AFTER)"), __PRETTY_FUNCTION__); #endif m_current->AddComment(m_comment, wxJSONVALUE_COMMENT_AFTER); } } else if (m_lastStored) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) comment added to m_lastStored (AFTER)"), __PRETTY_FUNCTION__); #endif m_lastStored->AddComment(m_comment, wxJSONVALUE_COMMENT_AFTER); } else { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) cannot find a value for storing the AFTER comment"), __PRETTY_FUNCTION__); #endif AddError(_T("Cannot find a value for storing the comment (flag AFTER)")); } } else { // comment BEFORE can only be added to the 'next' value if (m_next) { #if defined(JSONDEBUG) wxLogTrace(storeTraceMask, _T("(%s) comment added to m_next (BEFORE)"), __PRETTY_FUNCTION__); #endif m_next->AddComment(m_comment, wxJSONVALUE_COMMENT_BEFORE); } else { // cannot find a value for storing the comment AddError(_T("Cannot find a value for storing the comment (flag BEFORE)")); } } m_comment.clear(); } //! Return the number of bytes that make a character in stream input /*! This function returns the number of bytes that represent a unicode code point in various encoding. For example, if the input stream is UTF-32 the function returns 4. Because the only recognized format for streams is UTF-8 the function just calls UTF8NumBytes() and returns. The function is, actually, not used at all. */ int wxJSONReader::NumBytes(char ch) { int n = UTF8NumBytes(ch); return n; } //! Compute the number of bytes that makes a UTF-8 encoded wide character. /*! The function counts the number of '1' bit in the character \c ch and returns it. The UTF-8 encoding specifies the number of bytes needed by a wide character by coding it in the first byte. See below. Note that if the character does not contain a valid UTF-8 encoding the function returns -1. \code UCS-4 range (hex.) UTF-8 octet sequence (binary) ------------------- ----------------------------- 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx \endcode */ int wxJSONReader::UTF8NumBytes(char ch) { int num = 0; // the counter of '1' bits for (int i = 0; i < 8; i++) { if ((ch & 0x80) == 0) { break; } ++num; ch = ch << 1; } // note that if the char contains more than six '1' bits it is not // a valid UTF-8 encoded character if (num > 6) { num = -1; } else if (num == 0) { num = 1; } return num; } //! Convert a UTF-8 memory buffer one char at a time /*! This function is used in ANSI mode when input from a stream is in UTF-8 format and the UTF-8 buffer read cannot be converted to the locale wxString object. The function performs a char-by-char conversion of the buffer and appends every representable character to the string \c s. Characters that cannot be represented are stored as \e unicode \e escaped \e sequences in the form: \code \uXXXX \endcode where XXXX is a for-hex-digits Unicode code point. The function returns the number of characters that cannot be represented in the current locale. */ int wxJSONReader::ConvertCharByChar(wxString& s, const wxMemoryBuffer& utf8Buffer) { size_t len = utf8Buffer.GetDataLen(); char* buff = reinterpret_cast(utf8Buffer.GetData()); char* buffEnd = buff + len; int result = 0; char temp[16]; // the UTF-8 code-point while (buff < buffEnd) { temp[0] = *buff; // the first UTF-8 code-unit // compute the number of code-untis that make one UTF-8 code-point int numBytes = NumBytes(*buff); ++buff; for (int i = 1; i < numBytes; i++) { if (buff >= buffEnd) { break; } temp[i] = *buff; // the first UTF-8 code-unit ++buff; } //if (buff >= buffEnd) { // break; //} // now convert 'temp' to a wide-character wchar_t dst[10]; size_t outLength = wxConvUTF8.ToWChar(dst, 10, temp, numBytes); // now convert the wide char to a locale dependent character // len = wxConvLocal.FromWChar(temp, 16, dst, outLength); // len = wxConviso8859_1.FromWChar(temp, 16, dst, outLength); len = wxConvLibc.FromWChar(temp, 16, dst, outLength); if (len == wxCONV_FAILED) { ++result; wxString t; t.Printf(_T("\\u%04X"), static_cast(dst[0])); s.Append(t); } else { s.Append(temp[0], 1); } } // end while return result; } //! Read a memory buffer type /*! This function is called by DoRead() when the single-quote character is encontered which starts a \e memory \e buffer type. This type is a \b wxJSON extension so the function emits a warning when such a type encontered. If the reader is constructed without the \c wxJSONREADER_MEMORYBUFF flag then the warning becomes an error. To know more about this JSON syntax extension read \ref wxjson_tutorial_memorybuff @param is the input stream @param val the JSON value that will hold the memory buffer value @return the last char read or -1 in case of EOF */ //union byte { // unsigned char c[2]; // short int b; //}; int wxJSONReader::ReadMemoryBuff(wxInputStream& is, wxJSONValue& val) { static const wxChar* membuffError = _T("the \'memory buffer\' type contains %d invalid digits"); AddWarning(wxJSONREADER_MEMORYBUFF, _T("the \'memory buffer\' type is not valid JSON text")); wxMemoryBuffer buff; int ch = 0; int errors = 0; unsigned char byte = 0; while (ch >= 0) { ch = ReadChar(is); if (ch < 0) { break; } if (ch == '\'') { break; } // the conversion is done two chars at a time unsigned char c1 = (unsigned char) ch; ch = ReadChar(is); if (ch < 0) { break; } unsigned char c2 = (unsigned char) ch; c1 -= '0'; c2 -= '0'; if (c1 > 9) { c1 -= 7; } if (c2 > 9) { c2 -= 7; } if (c1 > 15) { ++errors; } else if (c2 > 15) { ++errors; } else { byte = (c1 * 16) + c2; buff.AppendByte(byte); } } // end while if (errors > 0) { wxString err; err.Printf(membuffError, errors); AddError(err); } // now assign the memory buffer object to the JSON-value 'value' // must check that: // 'value' is invalid OR // 'value' is a memory buffer; concatenate it if (!val.IsValid()) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) assigning the memory buffer to value"), __PRETTY_FUNCTION__); #endif val = buff; } else if (val.IsMemoryBuff()) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) concatenate memory buffer to value"), __PRETTY_FUNCTION__); #endif val.Cat(buff); } else { AddError(_T("Memory buffer value cannot follow another value")); } // store the input text's line number when the string was stored in 'val' val.SetLineNo(m_lineNo); // read the next char after the closing quotes and returns it if (ch >= 0) { ch = ReadChar(is); } return ch; } #if defined(wxJSON_64BIT_INT) //! Converts a decimal string to a 64-bit signed integer /*! This function implements a simple variant of the \b strtoll C-library function. I needed this implementation because the wxString::To(U)LongLong function does not work on my system: \li GNU/Linux Fedora Core 6 \li GCC version 4.1.1 \li libc.so.6 The wxWidgets library (actually I have installed version 2.8.7) relies on \b strtoll in order to do the conversion from a string to a long long integer but, in fact, it does not work because the 'wxHAS_STRTOLL' macro is not defined on my system. The problem only affects the Unicode builds while it seems that the wxString::To(U)LongLong function works in ANSI builds. Note that this implementation is not a complete substitute of the strtoll function because it only converts decimal strings (only base 10 is implemented). @param str the string that contains the decimal literal @param i64 the pointer to long long which holds the converted value @return TRUE if the conversion succeeds */ bool wxJSONReader::Strtoll(const wxString& str, wxInt64* i64) { wxChar sign = ' '; wxUint64 ui64; bool r = DoStrto_ll(str, &ui64, &sign); // check overflow for signed long long switch (sign) { case '-' : if (ui64 > (wxUint64) LLONG_MAX + 1) { r = false; } else { *i64 = (wxInt64) (ui64 * -1); } break; // case '+' : default : if (ui64 > LLONG_MAX) { r = false; } else { *i64 = (wxInt64) ui64; } break; } return r; } //! Converts a decimal string to a 64-bit unsigned integer. /*! Similar to \c Strtoll but for unsigned integers */ bool wxJSONReader::Strtoull(const wxString& str, wxUint64* ui64) { wxChar sign = ' '; bool r = DoStrto_ll(str, ui64, &sign); if (sign == '-') { r = false; } return r; } //! Perform the actual conversion from a string to a 64-bit integer /*! This function is called internally by the \c Strtoll and \c Strtoull functions and it does the actual conversion. The function is also able to check numeric overflow. @param str the string that has to be converted @param ui64 the pointer to a unsigned long long that holds the converted value @param sign the pointer to a wxChar character that will get the sign of the literal string, if any @return TRUE if the conversion succeeds */ bool wxJSONReader::DoStrto_ll(const wxString& str, wxUint64* ui64, wxChar* sign) { // the conversion is done by multiplying the individual digits // in reverse order to the corresponding power of 10 // // 10's power: 987654321.9876543210 // // LLONG_MAX: 9223372036854775807 // LLONG_MIN: -9223372036854775808 // ULLONG_MAX: 18446744073709551615 // // the function does not take into account the sign: only a // unsigned long long int is returned int maxDigits = 20; // 20 + 1 (for the sign) wxUint64 power10[] = { wxULL(1), wxULL(10), wxULL(100), wxULL(1000), wxULL(10000), wxULL(100000), wxULL(1000000), wxULL(10000000), wxULL(100000000), wxULL(1000000000), wxULL(10000000000), wxULL(100000000000), wxULL(1000000000000), wxULL(10000000000000), wxULL(100000000000000), wxULL(1000000000000000), wxULL(10000000000000000), wxULL(100000000000000000), wxULL(1000000000000000000), wxULL(10000000000000000000) }; wxUint64 temp1 = wxULL(0); // the temporary converted integer int strLen = str.length(); if (strLen == 0) { // an empty string is converted to a ZERO value: the function succeeds *ui64 = wxLL(0); return true; } int index = 0; wxChar ch = str[0]; if (ch == '+' || ch == '-') { *sign = ch; ++index; ++maxDigits; } if (strLen > maxDigits) { return false; } // check the overflow: check the string length and the individual digits // of the string; the overflow is checked for unsigned long long if (strLen == maxDigits) { wxString uLongMax(_T("18446744073709551615")); int j = 0; for (int i = index; i < strLen - 1; i++) { ch = str[i]; if (ch < '0' || ch > '9') { return false; } if (ch > uLongMax[j]) { return false; } if (ch < uLongMax[j]) { break; } ++j; } } // get the digits in the reverse order and multiply them by the // corresponding power of 10 int exponent = 0; for (int i = strLen - 1; i >= index; i--) { wxChar ch = str[i]; if (ch < '0' || ch > '9') { return false; } ch = ch - '0'; // compute the new temporary value temp1 += ch * power10[exponent]; ++exponent; } *ui64 = temp1; return true; } #endif // defined(wxJSON_64BIT_INT) /* { } */ tqsl-2.8.1/apps/jsonreader.h0000755000175000017500000001131515003421124015747 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: jsonreader.h // Purpose: the parser of JSON text // Author: Luciano Cattani // Created: 2007/09/15 // RCS-ID: $Id: jsonreader.h,v 1.3 2008/03/03 19:05:45 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #if !defined(_WX_JSONREADER_H) #define _WX_JSONREADER_H #ifdef __GNUG_ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma interface "jsonreader.h" #pragma clang diagnostic pop #endif // For compilers that support precompilation, includes "wx/wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWidgets headers) #ifndef WX_PRECOMP #include #include #include #endif #include #include "json_defs.h" #include "jsonval.h" // The flags of the parser enum { wxJSONREADER_STRICT = 0, wxJSONREADER_ALLOW_COMMENTS = 1, wxJSONREADER_STORE_COMMENTS = 2, wxJSONREADER_CASE = 4, wxJSONREADER_MISSING = 8, wxJSONREADER_MULTISTRING = 16, wxJSONREADER_COMMENTS_AFTER = 32, wxJSONREADER_NOUTF8_STREAM = 64, wxJSONREADER_MEMORYBUFF = 128, wxJSONREADER_TOLERANT = wxJSONREADER_ALLOW_COMMENTS | wxJSONREADER_CASE | wxJSONREADER_MISSING | wxJSONREADER_MULTISTRING, wxJSONREADER_COMMENTS_BEFORE = wxJSONREADER_ALLOW_COMMENTS | wxJSONREADER_STORE_COMMENTS }; class WXDLLIMPEXP_JSON wxJSONReader { public: explicit wxJSONReader(int flags = wxJSONREADER_TOLERANT, int maxErrors = 30); virtual ~wxJSONReader(); int Parse(const wxString& doc, wxJSONValue* val); int Parse(wxInputStream& doc, wxJSONValue* val); int GetDepth() const; int GetErrorCount() const; int GetWarningCount() const; const wxArrayString& GetErrors() const; const wxArrayString& GetWarnings() const; static int UTF8NumBytes(char ch); #if defined(wxJSON_64BIT_INT) static bool Strtoll(const wxString& str, wxInt64* i64); static bool Strtoull(const wxString& str, wxUint64* ui64); static bool DoStrto_ll(const wxString& str, wxUint64* ui64, wxChar* sign); #endif protected: int DoRead(wxInputStream& doc, wxJSONValue& val); void AddError(const wxString& descr); void AddError(const wxString& fmt, const wxString& str); void AddError(const wxString& fmt, wxChar ch); void AddWarning(int type, const wxString& descr); int GetStart(wxInputStream& is); int ReadChar(wxInputStream& is); int PeekChar(wxInputStream& is); void StoreValue(int ch, const wxString& key, wxJSONValue& value, wxJSONValue& parent); int SkipWhiteSpace(wxInputStream& is); int SkipComment(wxInputStream& is); void StoreComment(const wxJSONValue* parent); int ReadString(wxInputStream& is, wxJSONValue& val); int ReadToken(wxInputStream& is, int ch, wxString& s); int ReadValue(wxInputStream& is, int ch, wxJSONValue& val); int ReadUES(wxInputStream& is, char* uesBuffer); int AppendUES(wxMemoryBuffer& utf8Buff, const char* uesBuffer); int NumBytes(char ch); int ConvertCharByChar(wxString& s, const wxMemoryBuffer& utf8Buffer); int ReadMemoryBuff(wxInputStream& is, wxJSONValue& val); //! Flag that control the parser behaviour, int m_flags; //! Maximum number of errors stored in the error's array int m_maxErrors; //! The current line number (start at 1). int m_lineNo; //! The current column number (start at 1). int m_colNo; //! The current level of object/array annidation (start at ZERO). int m_level; //! The depth level of the read JSON text int m_depth; //! The pointer to the value object that is being read. wxJSONValue* m_current; //! The pointer to the value object that was last stored. wxJSONValue* m_lastStored; //! The pointer to the value object that will be read. wxJSONValue* m_next; //! The comment string read by SkipComment(). wxString m_comment; //! The starting line of the comment string. int m_commentLine; //! The array of error messages. wxArrayString m_errors; //! The array of warning messages. wxArrayString m_warnings; //! The character read by the PeekChar() function (-1 none) int m_peekChar; //! ANSI: do not convert UTF-8 strings bool m_noUtf8; }; #endif // not defined _WX_JSONREADER_H tqsl-2.8.1/apps/jsonval.cpp0000755000175000017500000030752515003421124015635 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: jsonval.cpp // Purpose: the wxJSON class that holds a JSON value // Author: Luciano Cattani // Created: 2007/10/01 // RCS-ID: $Id: jsonval.cpp,v 1.12 2008/03/06 10:25:18 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG_ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma interface "jsonval.cpp" #pragma clang diagnostic pop #endif // For compilers that support precompilation, includes "wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif #include #include #include #include #include "jsonval.h" WX_DEFINE_OBJARRAY(wxJSONInternalArray); // the trace mask used in wxLogTrace() function // static const wxChar* traceMask = _T("jsonval"); #if defined(JSONDEBUG) //#if wxUSE_LOG && wxUSE_LOG_DEBUG static const wxChar* traceMask = _T("jsonval"); static const wxChar* compareTraceMask = _T("sameas"); static const wxChar* cowTraceMask = _T("traceCOW"); #endif /******************************************************************* class wxJSONRefData *******************************************************************/ /*! \class wxJSONRefData \brief The reference counted JSON value data (internal use). Starting from version 0.4, the JSON value class use the reference counting technique (also know as \e copy-on-write) described in the \b wxWidgets documentation in order to speed up processing. The class is used internally by the wxJSONValue class which does all processing. To know more about COW see \ref json_internals_cow */ #if defined(WXJSON_USE_VALUE_COUNTER) // The progressive counter (used for debugging only) int wxJSONRefData::sm_progr = 1; #endif //! Constructor. wxJSONRefData::wxJSONRefData() { m_lineNo = -1; m_refCount = 1; m_memBuff = 0; #if defined(WXJSON_USE_VALUE_COUNTER) m_progr = sm_progr; ++sm_progr; #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) JSON refData ctor progr=%d"), __PRETTY_FUNCTION__, m_progr); #endif #endif } // Dtor wxJSONRefData::~wxJSONRefData() { if (m_memBuff) { delete m_memBuff; } } // Return the number of objects that reference this data. int wxJSONRefData::GetRefCount() const { return m_refCount; } /******************************************************************* class wxJSONValue *******************************************************************/ /*! \class wxJSONValue \brief The JSON value class implementation. This class holds a JSON value which may be of various types (see the wxJSONType constants for a description of the types). To know more about the internal representation of JSON values see \ref pg_json_internals. Starting from version 0.5 the wxJSON library supports 64-bits integers on platforms that have native support for very large integers. Note that the integer type is still stored as a generic wxJSONTYPE_(U)INT constant regardless the size of the value but the JSON value class defines functions in order to let the user know if an integer value fits in 16, 32 or 64 bit integer. To know more about 64-bits integer support see \ref json_internals_integer Storing values in a JSON value object of this class is very simple. The following is an example: \code wxJSONValue v(_T("A string")); // store a string value in the object wxString s = v.AsString(); // get the string value v = 12; // now 'v' contains an integer value int i = v.AsInt(); // get the integer \endcode \par The C-string JSON value object The wxJSONValue(const wxChar*) ctor allows you to create a JSON value object that contains a string value which is stored as a \e pointer-to-static-string. Beware that this ctor DOES NOT copy the string: it only stores the pointer in a data member and the pointed-to buffer is not deleted by the dtor. If the string is not static you have to use the wxJSONValue(const wxString&) constructor. Also note that this does NOT mean that the value stored in this JSON object cannot change: you can assign whatever other value you want, an integer, a double or an array of values. What I intended is that the pointed-to string must exist for the lifetime of the wxJSONValue object. The following code is perfectly legal: \code wxJSONvalue aString("this is a static string"); aString = 10; \endcode To know more about this topic see \ref json_internals_cstring. Starting from version 1.3 the class can hold binary memory buffers as an extension to the JSON syntax. Memory buffers are stored as \b wxMemoryBuffer objects which contain binary data. The class uses reference counting for the copy and assignment operation but it is not a \e copy-on-write structure. To know more about memory buffers read \ref wxjson_tutorial_memorybuff \sa the \ref wxjson_tutorial. */ #if defined(WXJSON_USE_VALUE_COUNTER) // The progressive counter (used for debugging only) int wxJSONValue::sm_progr = 1; #endif //! Constructors. /*! The overloaded constructors allow the user to construct a JSON value object that holds the specified value and type of value. The default ctor construct a valid JSON object that contains a \b null value. If you want to create an \b invalid JSON value object you have to use the \c wxJSONValue(wxJSONTYPE_INVALID) ctor. Note that this object is not a valid JSON value - to know more about this topic see the SetType() function. To create an empty array or key/value map use the following: \code wxJSONvalue v1(wxJSONTYPE_ARRAY); wxJSONvalue v2(wxJSONTYPE_OBJECT); \endcode */ wxJSONValue::wxJSONValue() { m_refData = 0; Init(wxJSONTYPE_NULL); } //! Initialize the JSON value class. /*! The function is called by the ctors and allocates a new instance of the wxJSONRefData class and sets the type of the JSON value. Note that only the type is set, not the value. Also note that this function may be called from other memberfunctions if the \c m_refData data member is NULL. */ wxJSONRefData* wxJSONValue::Init(wxJSONType type) { wxJSONRefData* data = GetRefData(); if (data != 0) { UnRef(); } // we allocate a new instance of the referenced data data = new wxJSONRefData(); wxJSON_ASSERT(data); // in release builds we do not have ASSERT so we check 'data' before // using it if (data) { data->m_type = type; data->m_commentPos = wxJSONVALUE_COMMENT_BEFORE; } SetRefData(data); #if defined(WXJSON_USE_VALUE_COUNTER) m_progr = sm_progr; ++sm_progr; #if defined(JSONDEBUG) wxLogTrace(cowTraceMask, _T("(%s) Init a new object progr=%d"), __PRETTY_FUNCTION__, m_progr); #endif #endif return data; } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(wxJSONType type) { m_refData = 0; Init(type); } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(int i) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_INT); wxJSON_ASSERT(data); if (data != 0) { // the 'VAL_INT' macro expands to 'm_valLong' or 'm_valInt64' depending // on 64-bits integer support being enabled on not data->m_value.VAL_INT = i; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(unsigned int ui) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_UINT); wxJSON_ASSERT(data); if (data != 0) { // the 'VAL_UINT' macro expands to 'm_valULong' or 'm_valUInt64' depending // on 64-bits integer support being enabled on not data->m_value.VAL_UINT = ui; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(short int i) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_INT); wxJSON_ASSERT(data); if (data != 0) { // the 'VAL_INT' macro expands to 'm_valLong' or 'm_valInt64' depending // on 64-bits integer support being enabled on not data->m_value.VAL_INT = i; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(unsigned short ui) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_UINT); wxJSON_ASSERT(data); if (data != 0) { // the 'VAL_UINT' macro expands to 'm_valULong' or 'm_valUInt64' depending // on 64-bits integer support being enabled on not data->m_value.VAL_UINT = ui; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(bool b ) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_BOOL); wxJSON_ASSERT(data); if (data != 0) { data->m_value.m_valBool = b; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(double d) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_DOUBLE); wxJSON_ASSERT(data); if (data != 0) { data->m_value.m_valDouble = d; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(const wxChar* str) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_CSTRING); wxJSON_ASSERT(data); if (data != 0) { #if !defined(WXJSON_USE_CSTRING) data->m_type = wxJSONTYPE_STRING; data->m_valString.assign(str); #else data->m_value.m_valCString = str; #endif } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(const wxString& str) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_STRING); wxJSON_ASSERT(data); if (data != 0) { data->m_valString.assign(str); } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(long int l) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_INT); wxJSON_ASSERT(data); if (data != 0) { data->m_value.VAL_INT = l; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(unsigned long int ul) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_UINT); wxJSON_ASSERT(data); if (data != 0) { data->m_value.VAL_UINT = ul; } } //! Construct a JSON value object of type \e memory \e buffer /*! Note that this ctor makes a deep copy of \c buff so changes made to the original buffer does not reflect to the buffer stored in this JSON value. */ wxJSONValue::wxJSONValue(const wxMemoryBuffer& buff) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_MEMORYBUFF); wxJSON_ASSERT(data); if (data != 0) { data->m_memBuff = new wxMemoryBuffer(); const void* ptr = buff.GetData(); size_t buffLen = buff.GetDataLen(); if (buffLen > 0) { data->m_memBuff->AppendData(ptr, buffLen); } } } //! Construct a JSON value object of type \e memory \e buffer /*! Note that this ctor makes a deep copy of \c buff so changes made to the original buffer does not reflect to the buffer stored in this JSON value. */ wxJSONValue::wxJSONValue(const void* buff, size_t len) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_MEMORYBUFF); wxJSON_ASSERT(data); if (data != 0 && len > 0) { data->m_memBuff = new wxMemoryBuffer(); data->m_memBuff->AppendData(buff, len); } } //! Copy constructor /*! The function copies the content of \c other in this object. Note that the JSON value object is not really copied; the function calls Ref() in order to increment the reference count of the \c wxJSONRefData structure. */ wxJSONValue::wxJSONValue(const wxJSONValue& other) { m_refData = 0; Ref(other); // the progressive counter of the ctor is not copied from // the other wxJSONValue object: only data is shared, the // progressive counter is not shared because this object // is a copy of 'other' and it has its own progressive #if defined(WXJSON_USE_VALUE_COUNTER) m_progr = sm_progr; ++sm_progr; #if defined(JSONDEBUG) wxLogTrace(cowTraceMask, _T("(%s) Copy ctor - progr=%d other progr=%d"), __PRETTY_FUNCTION__, m_progr, other.m_progr); #endif #endif } //! Dtor - calls UnRef(). wxJSONValue::~wxJSONValue() { UnRef(); } // functions for retrieving the value type: they are all 'const' //! Return the type of the value stored in the object. /*! This function is the only one that does not ASSERT that the \c m_refData data member is not NULL. In fact, if the JSON value object does not contain a pointer to a wxJSONRefData structure, the function returns the wxJSONTYPE_INVALID constant which represent an invalid JSON value object. Also note that the pointer to the referenced data structure should NEVER be NULL. \par Integer types Integers are stored internally in a \b signed/unsigned \b long \b int or, on platforms that support 64-bits integers, in a \b wx(U)Int64 data type. When constructed, it is assigned a generic integer type that only depends on the sign: wxJSON_(U)INT regardless the size of the stored value. This function can be used to know the actual size requirement of the stored value and how it can be retrieved. The value returned by this function is: - for signed integers: - \b wxJSONTYPE_SHORT if the value is between SHORT_MIN and SHORT_MAX - \b wxJSONTYPE_LONG if the value is between LONG_MIN and LONG_MAX and greater than SHORT_MAX and less than SHORT_MIN - \b wxJSONTYPE_INT64 if the value is greater than LONG_MAX and less than LONG_MIN - for unsigned integers: - \b wxJSONTYPE_USHORT if the value is between 0 and USHORT_MAX - \b wxJSONTYPE_ULONG if the value is between 0 and ULONG_MAX and greater than USHORT_MAX - \b wxJSONTYPE_UINT64 if the value is greater than ULONG_MAX Note that this function never returns the wxJSONTYPE_(U)INT constant because the \b int data type may have the same width as SHORT or LONG depending on the platform. This does not mean that you cannot use \b int as the return value: if you use \b wxWidgets to develop application in only one platform, you can use \b int because you know the size of the data type. Otherwise, if is preferable to always use \b long instead of \b int. Also note that the class defines the \c IsInt() memberfunction which works fine regardless the actual width of the \b int data type. This function returns TRUE if the stored value fits in a \b int data type whatever its size is on the current platform (16 or 32-bits). \sa SetType IsInt */ wxJSONType wxJSONValue::GetType() const { wxJSONRefData* data = GetRefData(); wxJSONType type = wxJSONTYPE_INVALID; if (data) { type = data->m_type; // for integers and unsigned ints check the storage requirements // note that ints are stored as 'long' or as 'long long' switch (type) { case wxJSONTYPE_INT : // check if the integer fits in a SHORT INT if (data->m_value.VAL_INT >= SHORT_MIN && data->m_value.VAL_INT <= SHORT_MAX) { type = wxJSONTYPE_SHORT; // check if the value fits in LONG INT } else if (data->m_value.VAL_INT >= LONG_MIN && data->m_value.VAL_INT <= LONG_MAX) { type = wxJSONTYPE_LONG; } else { type = wxJSONTYPE_INT64; } break; case wxJSONTYPE_UINT : if (data->m_value.VAL_UINT <= USHORT_MAX) { type = wxJSONTYPE_USHORT; } else if (data->m_value.VAL_UINT <= ULONG_MAX) { type = wxJSONTYPE_ULONG; } else { type = wxJSONTYPE_UINT64; } break; default : break; } } return type; } //! Return TRUE if the type of the value is wxJSONTYPE_NULL. bool wxJSONValue::IsNull() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_NULL) { r = true; } return r; } //! Return TRUE if the value stored is valid /*! The function returns TRUE if the wxJSONValue object was correctly initialized - that is it contains a valid value. A JSON object is valid if its type is not equal to wxJSONTYPE_INVALID. Please note that the default ctor of wxJSONValue constructs a \b valid JSON object of type \b null. To create an invalid object you have to use; \code wxJSONValue v(wxJSONTYPE_INVALID); \endcode */ bool wxJSONValue::IsValid() const { wxJSONType type = GetType(); bool r = false; if (type != wxJSONTYPE_INVALID) { r = true; } return r; } //! Return TRUE if the type of the value stored is integer. /*! This function returns TRUE if the stored value is of type signed integer and the numeric value fits in a \b int data type. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_INT and: \code INT_MIN <= m_value <= INT_MAX \endcode Note that if you are developing cross-platform applications you should never use \b int as the integer data type but \b long for 32-bits integers and \b short for 16-bits integers. This is because the \b int data type may have different width on different platforms. Regardless the width of the data type (16 or 32 bits), the function returns the correct result because it relies on the INT_MAX and INT_MIN macros. \sa \ref json_internals_integer */ bool wxJSONValue::IsInt() const { wxJSONType type = GetType(); bool r = false; // if the type is SHORT the value fits into an INT, too if (type == wxJSONTYPE_SHORT) { r = true; } else if (type == wxJSONTYPE_LONG) { // in case of LONG, check if the bit width is the same if (INT_MAX == LONG_MAX) { r = true; } } return r; } //! Return TRUE if the type of the value stored is 16-bit integer. /*! This function returns TRUE if the stored value is of type signed integer and the numeric value fits in a \b short \b int data type (16-bit integer). In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_INT and: \code SHORT_MIN <= m_value <= SHORT_MAX \endcode \sa \ref json_internals_integer */ bool wxJSONValue::IsShort() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_SHORT) { r = true; } return r; } //! Return TRUE if the type of the value stored is a unsigned int. /*! This function returns TRUE if the stored value is of type unsigned integer and the numeric value fits int a \b int data type. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_UINT and: \code 0 <= m_value <= UINT_MAX \endcode Note that if you are developing cross-platform applications you should never use \b unsigned \b int as the integer data type but \b unsigned \b long for 32-bits integers and \b unsigned \b short for 16-bits integers. This is because the \b unsigned \b int data type may have different width on different platforms. Regardless the width of the data type (16 or 32 bits), the function returns the correct result because it relies on the UINT_MAX macro. \sa \ref json_internals_integer */ bool wxJSONValue::IsUInt() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_USHORT) { r = true; } else if (type == wxJSONTYPE_ULONG) { if (INT_MAX == LONG_MAX) { r = true; } } return r; } //! Return TRUE if the type of the value stored is a unsigned short. /*! This function returns TRUE if the stored value is of type unsigned integer and the numeric value fits in a \b unsigned \b short \b int data type. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_UINT and: \code 0 <= m_value <= USHORT_MAX \endcode \sa \ref json_internals_integer */ bool wxJSONValue::IsUShort() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_USHORT) { r = true; } return r; } //! Return TRUE if the stored value is an integer which fits in a long int /*! This function returns TRUE if the stored value is of type signed LONG integer and the numeric value fits int a \b long \b int data type. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_INT and: \code LONG_MIN <= m_value <= LONG_MAX \endcode \sa \ref json_internals_integer */ bool wxJSONValue::IsLong() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_LONG || type == wxJSONTYPE_SHORT) { r = true; } return r; } //! Return TRUE if the stored value is an integer which fits in a unsigned long int /*! This function returns TRUE if the stored value is of type unsigned LONG integer and the numeric value fits int a \b unsigned \b long \b int data type. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_UINT and: \code 0 <= m_value <= ULONG_MAX \endcode \sa \ref json_internals_integer */ bool wxJSONValue::IsULong() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_ULONG || type == wxJSONTYPE_USHORT) { r = true; } return r; } //! Return TRUE if the type of the value stored is a boolean. bool wxJSONValue::IsBool() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_BOOL) { r = true; } return r; } //! Return TRUE if the type of the value stored is a double. bool wxJSONValue::IsDouble() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_DOUBLE) { r = true; } return r; } //! Return TRUE if the type of the value stored is a wxString object. bool wxJSONValue::IsString() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_STRING) { r = true; } return r; } //! Return TRUE if the type of the value stored is a pointer to a static C string. /*! This function returns TRUE if, and only if the stored value is a pointer to a static C-string and the C-string storage is enabled in the wxJSON library. By default, C-string storage is not enabled in the library so this function always returns FALSE. To know more about C-strings read \ref json_internals_cstring */ bool wxJSONValue::IsCString() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_CSTRING) { r = true; } return r; } //! Return TRUE if the type of the value stored is an array type. bool wxJSONValue::IsArray() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_ARRAY) { r = true; } return r; } //! Return TRUE if the type of this value is a key/value map. bool wxJSONValue::IsObject() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_OBJECT) { r = true; } return r; } //! Return TRUE if the type of this value is a binary memory buffer. bool wxJSONValue::IsMemoryBuff() const { wxJSONType type = GetType(); bool r = false; if (type == wxJSONTYPE_MEMORYBUFF) { r = true; } return r; } // get the stored value; all these functions are 'const' //! Return the stored value as an integer. /*! The function returns the stored value as an integer. Note that the function does not check that the type of the value is actually an integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value \c IsInt(). \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ int wxJSONValue::AsInt() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); int i = static_cast(data->m_value.VAL_INT); wxJSON_ASSERT(IsInt()); return i; } //! Return the stored value as a boolean. /*! The function returns the stored value as a boolean. Note that the function does not check that the type of the value is actually a boolean and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value is wxJSONTYPE_BOOL. \sa \ref wxjson_tutorial_get */ bool wxJSONValue::AsBool() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSON_ASSERT(data->m_type == wxJSONTYPE_BOOL); return data->m_value.m_valBool; } //! Return the stored value as a double. /*! The function returns the stored value as a double. Note that the function does not check that the type of the value is actually a double and it just returns the content of the wxJSONValueHolder union as if it was a double. However, in debug builds, the function ASSERTs that the type of the stored value \c IsDouble(). \sa \ref wxjson_tutorial_get */ double wxJSONValue::AsDouble() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); double d = data->m_value.m_valDouble; wxJSON_ASSERT(IsDouble()); return d; } //! Return the stored value as a wxWidget's string. /*! The function returns a string representation of the value stored in the JSON object. All value types are converted to a string by this function and returned as a string: \li For integer the string is the string representation of the numerical value in decimal notation; the function uses the \b wxString::Printf() function for the conversion \li for doubles, the value is converted to a string using the \b wxString::Printf("%.10g") function; the format string specifies a precision of ten decimal digits and suppress trailing ZEROes \li for booleans the string returned is: \b true or \b false. \li if the value is a NULL value the \b null literal string is returned. \li if the value is of type wxJSONTYPE_INVALID, the literal string \b <invalid> is returned. Note that this is NOT a valid JSON text. \li if the value is of type wxJSONTYPE_MEMORYBUFF the string returned contains the hexadecimal digits of the first 5 bytes preceded by the length of the buffer, enclosed in parenthesis If the value is an array or map, the returned string is the number of elements is the array/object enclosed in the JSON special characters that identifies the array/object. Example: \code [0] // an empty array {12} // an object of 12 elements \endcode \sa \ref wxjson_tutorial_get */ wxString wxJSONValue::AsString() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxString s; int size = Size(); switch (data->m_type) { case wxJSONTYPE_STRING : s.assign(data->m_valString); break; case wxJSONTYPE_CSTRING : s.assign(data->m_value.m_valCString); break; case wxJSONTYPE_INT : #if defined(wxJSON_64BIT_INT) s.Printf(_T("%") wxLongLongFmtSpec _T("i"), data->m_value.m_valInt64); #else s.Printf(_T("%ld"), data->m_value.m_valLong); #endif break; case wxJSONTYPE_UINT : #if defined(wxJSON_64BIT_INT) s.Printf(_T("%") wxLongLongFmtSpec _T("u"), data->m_value.m_valUInt64); #else s.Printf(_T("%lu"), data->m_value.m_valULong); #endif break; case wxJSONTYPE_DOUBLE : s.Printf(_T("%.10g"), data->m_value.m_valDouble); break; case wxJSONTYPE_BOOL : s.assign((data->m_value.m_valBool ? _T("true") : _T("false"))); break; case wxJSONTYPE_NULL : s.assign(_T("null")); break; case wxJSONTYPE_INVALID : s.assign(_T("")); break; case wxJSONTYPE_ARRAY : s.Printf(_T("[%d]"), size); break; case wxJSONTYPE_OBJECT : s.Printf(_T("{%d}"), size); break; case wxJSONTYPE_MEMORYBUFF : s = MemoryBuffToString(*(data->m_memBuff), 5); break; default : s.assign(_T("wxJSONValue::AsString(): Unknown JSON type \'")); s.append(TypeToString(data->m_type)); s.append(_T("\'")); wxFAIL_MSG(s); break; } return s; } //! Return the stored value as a pointer to a static C string. /*! If the type of the value is stored as a C-string data type the function just returns that pointer. If the stored value is a wxString object, the function returns the pointer returned by the \b wxString::c_str() function. If the stored value is of all other JSON types, the functions returns a NULL pointer. Note that in versions prior to 0.5, the function returned a NULL pointer also if the value is a \c wxString object. \sa \ref json_internals_cstring \sa \ref wxjson_tutorial_get */ const wxChar* wxJSONValue::AsCString() const { const wxChar* s = 0; wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); switch (data->m_type) { case wxJSONTYPE_CSTRING : s = data->m_value.m_valCString; break; case wxJSONTYPE_STRING : s = data->m_valString.c_str(); break; default : break; } return s; } //! Return the stored value as a unsigned int. /*! The function returns the stored value as a unsigned integer. Note that the function does not check that the type of the value is actually a unsigned integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value is wxJSONTYPE_UINT. \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ unsigned int wxJSONValue::AsUInt() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); unsigned int ui = (unsigned) data->m_value.VAL_UINT; wxJSON_ASSERT(IsUInt()); return ui; } //! Returns the value as a long integer /*! The function returns the stored value as a long integer. Note that the function does not check that the type of the value is actually a long integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value \c IsLong(). \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ long int wxJSONValue::AsLong() const { long int l; wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); l = (long) data->m_value.VAL_INT; wxJSON_ASSERT(IsLong()); return l; } //! Returns the value as a unsigned long integer /*! The function returns the stored value as a unsigned long integer. Note that the function does not check that the type of the value is actually a unsigned long integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value \c IsLong(). \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ unsigned long int wxJSONValue::AsULong() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); unsigned long int ul = (unsigned long) data->m_value.VAL_UINT; wxJSON_ASSERT(IsULong()); // expands only in debug builds return ul; } //! Returns the value as a short integer /*! The function returns the stored value as a short integer. Note that the function does not check that the type of the value is actually a short integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value \c IsShort(). \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ short int wxJSONValue::AsShort() const { short int i; wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); i = (short) data->m_value.VAL_INT; wxJSON_ASSERT(IsShort()); return i; } //! Returns the value as a unsigned short integer /*! The function returns the stored value as a unsigned short integer. Note that the function does not check that the type of the value is actually a unsigned short and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value \c IsUShort(). \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ unsigned short wxJSONValue::AsUShort() const { unsigned short ui; wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); ui = (unsigned short) data->m_value.VAL_UINT; wxJSON_ASSERT(IsUShort()); return ui; } //! Stores the value of this object in the provided argument /*! The functions of the form \c AsXxxxxx(T&) are the same as the \c AsXxxxxxx() but store the value in the provided argument and return TRUE if the value of this object is of the correct type. By using these functions you can get the value and test if the JSON value is of the expected type in only one step. For example: \code int i; wxJSONValue v(10); if (!v.AsInt(i)) { cout << "Error: value is not of the expected type"; } \endcode This is the same as: \code int i; wxJSONValue v(10); if (v.IsInt() { i = v.AsInt(); } else { cout << "Error: value is not of the expected type"; } \endcode Thanks to \b catalin who has suggested this new feature. */ bool wxJSONValue::AsInt(int& i) const { bool r = false; if (IsInt()) { i = AsInt(); r = true; } return r; } bool wxJSONValue::AsUInt(unsigned int& ui) const { bool r = false; if (IsUInt()) { ui = AsUInt(); r = true; } return r; } bool wxJSONValue::AsShort(short int& s) const { bool r = false; if (IsShort()) { s = AsShort(); r = true; } return r; } bool wxJSONValue::AsUShort(unsigned short& us) const { bool r = false; if (IsUShort()) { us = AsUShort(); r = true; } return r; } bool wxJSONValue::AsLong(long int& l) const { bool r = false; if (IsLong()) { l = AsLong(); r = true; } return r; } bool wxJSONValue::AsULong(unsigned long& ul) const { bool r = false; if (IsULong()) { ul = AsULong(); r = true; } return r; } bool wxJSONValue::AsBool(bool& b) const { bool r = false; if (IsBool()) { b = AsBool(); r = true; } return r; } bool wxJSONValue::AsDouble(double& d) const { bool r = false; if (IsDouble()) { d = AsDouble(); r = true; } return r; } //! Return this string value in the provided argument /*! This function is different from \c AsString because the latter always returns a string also when this object does not contain a string. In that case, a string representation of this value is returned. This function, instead, returns TRUE only if this object contains a string, that is only if \c IsString() returns TRUE. Also note that the string value is only stored in \c str if this object actually contains a \b string or \b c-string value. \c str will never contain a string representation of other types. */ bool wxJSONValue::AsString(wxString& str) const { bool r = IsString(); if (r) { str = AsString(); } return r; } bool wxJSONValue::AsCString(wxChar* ch) const { bool r = IsCString(); if (r) { ch = const_cast(AsCString()); } return r; } //! Returns the value as a memory buffer /*! The function returns the \e memory \e buffer object stored in this JSON object. Note that as of wxWidgets 2.8 and 2.9 the \b wxMemoryBuffer object uses reference counting when copying the actual buffer but the class itself is not a \e copy-on-write structure so changes made to one buffer affects all other copies made from it. This means that if you make a change to the returned copy of the memory buffer, the change affects also the memory buffer stored in this JSON value. If this JSON object does not contain a \e wxJSONTYPE_MEMORYBUFF type the function returns an empty memory buffer object. An empty memory buffer is also returned if this JSON type contains a valid, empty memory buffer. You have to use the IsMemoryBuff() function to known the type of the JSON value contained in this object, or the overloaded version of this function. */ wxMemoryBuffer wxJSONValue::AsMemoryBuff() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxMemoryBuffer buff; if (data->m_memBuff) { buff = *(data->m_memBuff); } wxJSON_ASSERT(IsMemoryBuff()); return buff; } //! Returns the value as a memory buffer /*! The function returns the \e memory \e buffer object stored in this JSON object. Note that as of wxWidgets 2.8 and 2.9 the \b wxMemoryBuffer object uses reference counting when copying the actual buffer but the class itself is not a \e copy-on-write structure so changes made to one buffer affects all other copies made from it. This means that if you make a change to the returned copy of the memory buffer, the change affects also the memory buffer stored in this JSON value. If this JSON object does not contain a \e wxJSONTYPE_MEMORYBUFF type the function returns an empty memory buffer object. An empty memory buffer is also returned if this JSON type contains a valid, empty memory buffer. You have to use the IsMemoryBuff() function to known the type of the JSON value contained in this object, or the overloaded version of this function. */ bool wxJSONValue::AsMemoryBuff(wxMemoryBuffer& buff) const { bool r = IsMemoryBuff(); if (r) { buff = AsMemoryBuff(); } return r; } // internal use //! Return the stored value as a map object. /*! This function is for testing and debugging purposes and you should never use it. To retrieve values from an array or map JSON object use the \c Item() or ItemAt() memberfunctions or the subscript operator. If the stored value is not a map type, returns a NULL pointer. */ const wxJSONInternalMap* wxJSONValue::AsMap() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); const wxJSONInternalMap* v = 0; if (data->m_type == wxJSONTYPE_OBJECT) { v = &(data->m_valMap); } return v; } //! Return the stored value as an array object. /*! This function is for testing and debugging purposes and you should never use it. To retrieve values from an array or map JSON object use the \c Item() or ItemAt() memberfunctions or the subscript operator. If the stored value is not an array type, returns a NULL pointer. */ const wxJSONInternalArray* wxJSONValue::AsArray() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); const wxJSONInternalArray* v = 0; if (data->m_type == wxJSONTYPE_ARRAY) { v = &(data->m_valArray); } return v; } // retrieve the members and other info //! Return TRUE if the object contains an element at the specified index. /*! If the stoerd value is not an array or a map, the function returns FALSE. */ bool wxJSONValue::HasMember(unsigned index) const { bool r = false; int size = Size(); if (index < (unsigned) size) { r = true; } return r; } //! Return TRUE if the object contains an element at the specified key. /*! If the stored value is not a key/map map, the function returns FALSE. */ bool wxJSONValue::HasMember(const wxString& key) const { bool r = false; wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); if (data && data->m_type == wxJSONTYPE_OBJECT) { wxJSONInternalMap::iterator it = data->m_valMap.find(key); if (it != data->m_valMap.end()) { r = true; } } return r; } //! Return the size of the array or map stored in this value. /*! Note that both the array and the key/value map may have a size of ZERO elements. If the stored value is not an array nor a key/value hashmap, the function returns -1. */ int wxJSONValue::Size() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); int size = -1; if (data->m_type == wxJSONTYPE_ARRAY) { size = static_cast(data->m_valArray.GetCount()); } if (data->m_type == wxJSONTYPE_OBJECT) { size = static_cast(data->m_valMap.size()); } return size; } //! Return the array of keys of this JSON object. /*! If the stored value is a key/value map, the function returns an array of strings containing the \e key of all elements. Note that the returned array may be empty if the map has ZERO elements. An empty string array is also returned if the stored value is not a key/value map. Also note that in debug builds, the function wxJSON_ASSERTs that the type of the stored object is wxJSONTYPE_OBJECT. */ wxArrayString wxJSONValue::GetMemberNames() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSON_ASSERT(data->m_type == wxJSONTYPE_OBJECT); wxArrayString arr; if (data->m_type == wxJSONTYPE_OBJECT) { wxJSONInternalMap::iterator it; for (it = data->m_valMap.begin(); it != data->m_valMap.end(); it++) { arr.Add(it->first); } } return arr; } // appending items, resizing and deleting items // NOTE: these functions are not 'const' so we have to call // the COW() function before accessing data //! Append the specified value in the array. /*! The function appends the value specified in the parameter to the array contained in this object. If this object does not contain an array type, the actual content is deleted, a new array type is created and the JSON value \c value is appended to the newly created array. Returns a reference to the appended object. */ wxJSONValue& wxJSONValue::Append(const wxJSONValue& value) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); if (data->m_type != wxJSONTYPE_ARRAY) { // we have to change the type of the actual object to the array type SetType(wxJSONTYPE_ARRAY); } // we add the wxJSONValue object to the wxObjArray: note that the // array makes a copy of the JSON-value object by calling its // copy ctor thus using reference count data->m_valArray.Add(value); wxJSONValue& v = data->m_valArray.Last(); return v; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(int i) { wxJSONValue v(i); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(short int i) { wxJSONValue v(i); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(long int l) { wxJSONValue v(l); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(bool b) { wxJSONValue v(b); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(unsigned int ui) { wxJSONValue v(ui); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(unsigned short ui) { wxJSONValue v(ui); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(unsigned long ul) { wxJSONValue v(ul); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(double d) { wxJSONValue v(d); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(const wxChar* str) { wxJSONValue v(str); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(const wxString& str) { wxJSONValue v(str); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(const wxMemoryBuffer& buff) { wxJSONValue v(buff); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(const void* buff, size_t len) { wxJSONValue v(buff, len); wxJSONValue& r = Append(v); return r; } //! Concatenate a string to this string object. /*! The function concatenates \c str to the string contained in this object and returns TRUE if the operation is succefull. If the value stored in this value is not a string object the function does nothing and returns FALSE. Note that in order to be successful, the value must contain a \b wxString object and not a pointer to C-string. */ bool wxJSONValue::Cat(const wxString& str) { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_STRING) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); data->m_valString.append(str); r = true; } return r; } //! Concatenate a memory buffer to this memory buffer object. /*! The function concatenates \c buff to the \b wxMemoryBuffer object contained in this object and returns TRUE if the operation is succefull. If the value stored in this value is not a memory buffer object the function does nothing and returns FALSE. */ bool wxJSONValue::Cat(const wxMemoryBuffer& buff) { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_MEMORYBUFF) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); data->m_memBuff->AppendData(buff.GetData(), buff.GetDataLen()); r = true; } return r; } //! \overload Cat(const wxString&) bool wxJSONValue::Cat(const wxChar* str) { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_STRING) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); data->m_valString.append(str); r = true; } return r; } //! Remove the item at the specified index or key. /*! The function removes the item at index \c index or at the specified key in the array or map. If this object does not contain an array (for a index parameter) or a map (for a key parameter), the function does nothing and returns FALSE. If the element does not exist, FALSE is returned. */ bool wxJSONValue::Remove(int index) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_ARRAY) { data->m_valArray.RemoveAt(index); r = true; } return r; } //! \overload Remove(int) bool wxJSONValue::Remove(const wxString& key) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_OBJECT) { wxJSONInternalMap::size_type count = data->m_valMap.erase(key); if (count > 0) { r = true; } } return r; } //! Clear the object value. /*! This function causes the object to be empty. The function simply calls UnRef() making this object to become invalid and set its type to wxJSONTYPE_INVALID. */ void wxJSONValue::Clear() { UnRef(); SetType(wxJSONTYPE_INVALID); } // retrieve an item //! Return the item at the specified index. /*! The function returns a reference to the object at the specified index. If the element does not exist, the array is enlarged to \c index + 1 elements and a reference to the last element will be returned. New elements will contain NULL values. If this object does not contain an array, the old value is replaced by an array object which will be enlarged to the needed dimension. */ wxJSONValue& wxJSONValue::Item(unsigned index) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); if (data->m_type != wxJSONTYPE_ARRAY) { data = SetType(wxJSONTYPE_ARRAY); } int size = Size(); wxJSON_ASSERT(size >= 0); // if the desired element does not yet exist, we create as many // elements as needed; the new values will be 'null' values if (index >= (unsigned) size) { wxJSONValue v(wxJSONTYPE_NULL); int missing = index - size + 1; data->m_valArray.Add(v, missing); } return data->m_valArray.Item(index); } //! Return the item at the specified key. /*! The function returns a reference to the object in the map that has the specified key. If \c key does not exist, a new NULL value is created with the provided key and a reference to it is returned. If this object does not contain a map, the old value is replaced by a map object. */ wxJSONValue& wxJSONValue::Item(const wxString& key) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) searched key=\'%s\'"), __PRETTY_FUNCTION__, key.c_str()); wxLogTrace(traceMask, _T("(%s) actual object: %s"), __PRETTY_FUNCTION__, GetInfo().c_str()); #endif wxJSONRefData* data = COW(); wxJSON_ASSERT(data); if (data->m_type != wxJSONTYPE_OBJECT) { // deletes the contained value; data = SetType(wxJSONTYPE_OBJECT); return data->m_valMap[key]; } #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) searching key \'%s' in the actual object"), __PRETTY_FUNCTION__, key.c_str()); #endif return data->m_valMap[key]; } //! Return the item at the specified index. /*! The function returns a copy of the object at the specified index. If the element does not exist, the function returns an \b invalid value. */ wxJSONValue wxJSONValue::ItemAt(unsigned index) const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSONValue v(wxJSONTYPE_INVALID); if (data->m_type == wxJSONTYPE_ARRAY) { int size = Size(); wxJSON_ASSERT(size >= 0); if (index < (unsigned) size) { v = data->m_valArray.Item(index); } } return v; } //! Return the item at the specified key. /*! The function returns a copy of the object in the map that has the specified key. If \c key does not exist, an \b invalid value is returned. */ wxJSONValue wxJSONValue::ItemAt(const wxString& key) const { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) searched key=\'%s\'"), __PRETTY_FUNCTION__, key.c_str()); wxLogTrace(traceMask, _T("(%s) actual object: %s"), __PRETTY_FUNCTION__, GetInfo().c_str()); #endif wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSONValue v(wxJSONTYPE_INVALID); if (data->m_type == wxJSONTYPE_OBJECT) { wxJSONInternalMap::const_iterator it = data->m_valMap.find(key); if (it != data->m_valMap.end()) { v = it->second; } } return v; } //! Return the item at the specified index. /*! The function returns a reference to the object at the specified index. If the element does not exist, the array is enlarged to \c index + 1 elements and a reference to the last element will be returned. New elements will contain NULL values. If this object does not contain an array, the old value is replaced by an array object. */ wxJSONValue& wxJSONValue::operator[] (unsigned index) { wxJSONValue& v = Item(index); return v; } //! Return the item at the specified key. /*! The function returns a reference to the object in the map that has the specified key. If \c key does not exist, a new NULL value is created with the provided key and a reference to it is returned. If this object does not contain a map, the old value is replaced by a map object. */ wxJSONValue& wxJSONValue::operator[] (const wxString& key) { wxJSONValue& v = Item(key); return v; } // // assignment operators // note that reference counting is only used if the original // value is a wxJSONValue object // in all other cases, the operator= function deletes the old // content and assigns the new one //! Assign the specified value to this object replacing the old value. /*! The assignment operator assigns to this object the value specified in the right operand of the assignment operator. Note that the old value is deleted but not the other data members in the wxJSONRefData structure. This is particularly useful for the parser class which stores comment lines in a temporary wxJSONvalue object that is of type wxJSONTYPE_INVALID. As comment lines may appear before the value they refer to, comments are stored in a value that is not yet being read. when the value is read, it is assigned to the temporary JSON value object without deleting the comment lines. */ wxJSONValue& wxJSONValue::operator = (int i) { wxJSONRefData* data = SetType(wxJSONTYPE_INT); data->m_value.VAL_INT = i; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (bool b) { wxJSONRefData* data = SetType(wxJSONTYPE_BOOL); data->m_value.m_valBool = b; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (unsigned int ui) { wxJSONRefData* data = SetType(wxJSONTYPE_UINT); data->m_value.VAL_UINT = ui; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (long l) { wxJSONRefData* data = SetType(wxJSONTYPE_INT); data->m_value.VAL_INT = l; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (unsigned long ul) { wxJSONRefData* data = SetType(wxJSONTYPE_UINT); data->m_value.VAL_UINT = ul; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (short i) { wxJSONRefData* data = SetType(wxJSONTYPE_INT); data->m_value.VAL_INT = i; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (unsigned short ui) { wxJSONRefData* data = SetType(wxJSONTYPE_UINT); data->m_value.VAL_UINT = ui; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (double d) { wxJSONRefData* data = SetType(wxJSONTYPE_DOUBLE); data->m_value.m_valDouble = d; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (const wxChar* str) { wxJSONRefData* data = SetType(wxJSONTYPE_CSTRING); data->m_value.m_valCString = str; #if !defined(WXJSON_USE_CSTRING) data->m_type = wxJSONTYPE_STRING; data->m_valString.assign(str); #endif return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (const wxString& str) { wxJSONRefData* data = SetType(wxJSONTYPE_STRING); data->m_valString.assign(str); return *this; } //! Assigns to this object a memory buffer type /*! As with the ctor, this function makes a deep copy of the memory buffer \c buff so changes made to the original buffer does not reflect to the memory buffer stored in this JSON value. */ wxJSONValue& wxJSONValue::operator = (const wxMemoryBuffer& buff) { wxJSONRefData* data = SetType(wxJSONTYPE_MEMORYBUFF); data->m_memBuff = new wxMemoryBuffer(); const void* ptr = buff.GetData(); size_t len = buff.GetDataLen(); if (data->m_memBuff && len) { data->m_memBuff->AppendData(ptr, len); } return *this; } //! Assignment operator using reference counting. /*! Unlike all other assignment operators, this one makes a swallow copy of the other JSON value object. The function calls \c Ref() to get a shared referenced data. \sa \ref json_internals_cow */ wxJSONValue& wxJSONValue::operator = (const wxJSONValue& other) { Ref(other); return *this; } // finding elements //! Return a value or a default value. /*! This function returns a copy of the value object for the specified key. If the key is not found, a copy of \c defaultValue is returned. Note that the returned values are not real copy of the \c key or the default values because \e copy-on-write is used by this class. However, you have to treat them as real copies; in other words, if you change the values of the returned object your changes does not reflect in the original value. Example: \code wxJSONValue defaultValue(0); wxJSONvalue v1; v1["key"] = 100; // 'v1["key"]' contains the integer 100 // 'v2' contains 100 but it is a swallow copy of 'v1["key"]' wxJSONValue v2 = v1.Get("key", defaultValue); // 'v1["key"]' still contains 100 v2 = 200; // if you want your change to be reflected in the 'v1' object // you have to assign it v1["key"] = v2; \endcode */ wxJSONValue wxJSONValue::Get(const wxString& key, const wxJSONValue& defaultValue) const { // NOTE: this function does many wxJSONValue copies. // so implementing COW is a good thing // this is the first copy (the default value) wxJSONValue v(defaultValue); wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); if (data->m_type == wxJSONTYPE_OBJECT) { wxJSONInternalMap::iterator it = data->m_valMap.find(key); if (it != data->m_valMap.end()) { v = it->second; } } return v; } // protected functions //! Find an element /*! The function returns a pointer to the element at index \c index or a NULL pointer if \c index does not exist. A NULL pointer is also returned if the object does not contain an array nor a key/value map. */ wxJSONValue* wxJSONValue::Find(unsigned index) const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSONValue* vp = 0; if (data->m_type == wxJSONTYPE_ARRAY) { size_t size = data->m_valArray.GetCount(); if (index < size) { vp = &(data->m_valArray.Item(index)); } } return vp; } //! Find an element /*! The function returns a pointer to the element with key \c key or a NULL pointer if \c key does not exist. A NULL pointer is also returned if the object does not contain a key/value map. */ wxJSONValue* wxJSONValue::Find(const wxString& key) const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSONValue* vp = 0; if (data->m_type == wxJSONTYPE_OBJECT) { wxJSONInternalMap::iterator it = data->m_valMap.find(key); if (it != data->m_valMap.end()) { vp = &(it->second); } } return vp; } //! Return a string description of the type /*! This static function is only useful for debugging purposes and should not be used by users of this class. It simply returns a string representation of the JSON value type stored in a object. For example, if \c type is wxJSONTYPE_INT the function returns the string "wxJSONTYPE_INT". If \c type is out of range, an empty string is returned (should never happen). */ wxString wxJSONValue::TypeToString(wxJSONType type) { static const wxChar* str[] = { _T("wxJSONTYPE_INVALID"), // 0 _T("wxJSONTYPE_NULL"), // 1 _T("wxJSONTYPE_INT"), // 2 _T("wxJSONTYPE_UINT"), // 3 _T("wxJSONTYPE_DOUBLE"), // 4 _T("wxJSONTYPE_STRING"), // 5 _T("wxJSONTYPE_CSTRING"), // 6 _T("wxJSONTYPE_BOOL"), // 7 _T("wxJSONTYPE_ARRAY"), // 8 _T("wxJSONTYPE_OBJECT"), // 9 _T("wxJSONTYPE_LONG"), // 10 _T("wxJSONTYPE_INT64"), // 11 _T("wxJSONTYPE_ULONG"), // 12 _T("wxJSONTYPE_UINT64"), // 13 _T("wxJSONTYPE_SHORT"), // 14 _T("wxJSONTYPE_USHORT"), // 15 _T("wxJSONTYPE_MEMORYBUFF"), // 16 }; wxString s; int idx = static_cast(type); if (idx >= 0 && idx < 17) { s = str[idx]; } return s; } //! Returns information about the object /*! The function is only useful for debugging purposes and will probably be dropped in future versions. Returns a string that contains info about the object such as: \li the type of the object \li the size \li the progressive counter \li the pointer to referenced data \li the progressive counter of referenced data \li the number of share of referenced data The \c deep parameter is used to specify if the function will be called recursively in order to dump sub-items. If the parameter is TRUE than a deep dump is executed. The \c indent is the initial indentation: it is incremented by 3 every time the Dump() function is called recursively. */ wxString wxJSONValue::Dump(bool deep, int indent) const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxJSONType type = GetType(); wxString s; if (indent > 0) { s.append(indent, ' '); } wxString s1; wxString s2; #if defined(WXJSON_USE_VALUE_COUNTER) s1.Printf(_T("Object: Progr=%d Type=%s Size=%d comments=%d\n"), m_progr, TypeToString(type).c_str(), Size(), data->m_comments.GetCount()); s2.Printf(_T(" : RefData=%p Progr=%d Num shares=%d\n"), data, data->m_progr, data->GetRefCount()); #else s1.Printf(_T("Object: Type=%s Size=%d comments=%d\n"), TypeToString(type).c_str(), Size(), data->m_comments.GetCount()); s2.Printf(_T(" : RefData=%p Num shares=%d\n"), data, data->GetRefCount()); #endif s.append(s1); if (indent > 0) { s.append(indent, ' '); } s.append(s2); wxString sub; // if we have to do a deep dump, we call the Dump() function for // every sub-item if (deep) { indent += 3; const wxJSONInternalMap* map; int size;; wxJSONInternalMap::const_iterator it; switch (type) { case wxJSONTYPE_OBJECT : map = AsMap(); size = Size(); for (it = map->begin(); it != map->end(); ++it) { const wxJSONValue& v = it->second; sub = v.Dump(true, indent); s.append(sub); } break; case wxJSONTYPE_ARRAY : size = Size(); for (int i = 0; i < size; i++) { const wxJSONValue* v = Find(i); wxJSON_ASSERT(v); sub = v->Dump(true, indent); s.append(sub); } break; default : break; } } return s; } //! Returns information about the object /*! The function is only useful for debugging purposes and will probably be dropped in future versions. You should not rely on this function to exist in future versions. */ wxString wxJSONValue::GetInfo() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxString s; #if defined(WXJSON_USE_VALUE_CONTER) s.Printf(_T("Object: Progr=%d Type=%s Size=%d comments=%d\n"), data->m_progr, wxJSONValue::TypeToString(data->m_type).c_str(), Size(), data->m_comments.GetCount()); #else s.Printf(_T("Object: Type=%s Size=%d comments=%d\n"), wxJSONValue::TypeToString(data->m_type).c_str(), Size(), data->m_comments.GetCount()); #endif if (data->m_type == wxJSONTYPE_OBJECT) { wxArrayString arr = GetMemberNames(); for (unsigned int i = 0; i < arr.size(); i++) { s.append(_T(" Member name: ")); s.append(arr[i]); s.append(_T("\n")); } } return s; } //! The comparison function /*! This function returns TRUE if this object looks like \c other. Note that this class does not define a comparison operator (the classical \b operator== function) because the notion of \b equal for JSON values objects is not applicable. The comment strings array are not compared: JSON value objects are \b the \b same if they contains the same values, regardless the comment's strings. Note that the function does not return the element that cause the comparison to return FALSE. There is not a good structure to tell this information. If you need it for debugging purposes, you have to turn on the \b sameas tracing feature by setting the WXTRACE environment variable (you need a debug version of the application): \code export WXTRACE=sameas // for unix systems that use bash \endcode Note that if the two JSON value objects share the same referenced data, the function immediately returns TRUE without doing a deep comparison which is, sure, useless. For further info see \ref json_internals_compare. */ bool wxJSONValue::IsSameAs(const wxJSONValue& other) const { // this is a recursive function: it calls itself // for every 'value' object in an array or map bool r = false; // some variables used in the switch statement int size; wxJSONInternalMap::const_iterator it; // get the referenced data for the two objects wxJSONRefData* data = GetRefData(); wxJSONRefData* otherData = other.GetRefData(); if (data == otherData) { #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) objects share the same referenced data - r=TRUE"), __PRETTY_FUNCTION__); #endif return true; } // if the type does not match the function compares the values if // they are of compatible types such as INT, UINT and DOUBLE if (data->m_type != otherData->m_type) { // if the types are not compatible, returns false // otherwise compares the compatible types: INT, UINT and DOUBLE double val; switch (data->m_type) { case wxJSONTYPE_INT : if (otherData->m_type == wxJSONTYPE_UINT) { // compare the bits and returns true if value is between 0 and LLONG_MAX if ((data->m_value.VAL_UINT <= LLONG_MAX) && (data->m_value.VAL_UINT == otherData->m_value.VAL_UINT)) { r = true; } } else if (otherData->m_type == wxJSONTYPE_DOUBLE) { val = data->m_value.VAL_INT; if (val == otherData->m_value.m_valDouble) { r = true; } } else { r = false; } break; case wxJSONTYPE_UINT : if (otherData->m_type == wxJSONTYPE_INT) { // compare the bits and returns true if value is between 0 and LLONG_MAX if ((data->m_value.VAL_UINT <= LLONG_MAX) && (data->m_value.VAL_UINT == otherData->m_value.VAL_UINT)) { r = true; } } else if (otherData->m_type == wxJSONTYPE_DOUBLE) { val = data->m_value.VAL_UINT; if (val == otherData->m_value.m_valDouble) { r = true; } } else { r = false; } break; case wxJSONTYPE_DOUBLE : if (otherData->m_type == wxJSONTYPE_INT) { val = otherData->m_value.VAL_INT; if (val == data->m_value.m_valDouble) { r = true; } } else if (otherData->m_type == wxJSONTYPE_UINT) { val = otherData->m_value.VAL_UINT; if (val == data->m_value.m_valDouble) { r = true; } } else { r = false; } break; default: r = false; break; } return r; } // the two objects have the same 'm_type' // for comparing wxJSONTYPE_CSTRING we use two temporary wxString // objects: this is to avoid using strcmp() and wcscmp() which // may not be available on all platforms wxString s1, s2; r = true; int r1; switch (data->m_type) { case wxJSONTYPE_INVALID : case wxJSONTYPE_NULL : // there is no need to compare the values break; case wxJSONTYPE_INT : if (data->m_value.VAL_INT != otherData->m_value.VAL_INT) { r = false; } break; case wxJSONTYPE_UINT : if (data->m_value.VAL_UINT != otherData->m_value.VAL_UINT) { r = false; } break; case wxJSONTYPE_DOUBLE : if (data->m_value.m_valDouble != otherData->m_value.m_valDouble) { r = false; } break; case wxJSONTYPE_CSTRING : s1 = wxString(data->m_value.m_valCString); s2 = wxString(otherData->m_value.m_valCString); if (s1 != s2) { r = false; } break; case wxJSONTYPE_BOOL : if (data->m_value.m_valBool != otherData->m_value.m_valBool) { r = false; } break; case wxJSONTYPE_STRING : if (data->m_valString != otherData->m_valString) { r = false; } break; case wxJSONTYPE_MEMORYBUFF : // we cannot simply use the operator ==; we need a deep comparison r1 = CompareMemoryBuff(*(data->m_memBuff), *(otherData->m_memBuff)); if (r1 != 0) { r = false; } break; case wxJSONTYPE_ARRAY : size = Size(); #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Comparing an array object - size=%d"), __PRETTY_FUNCTION__, size); #endif if (size != other.Size()) { #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Sizes does not match"), __PRETTY_FUNCTION__); #endif return false; } // compares every element in this object with the element of // the same index in the 'other' object for (int i = 0; i < size; i++) { #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Comparing array element=%d"), __PRETTY_FUNCTION__, i); #endif wxJSONValue v1 = ItemAt(i); wxJSONValue v2 = other.ItemAt(i); if (!v1.IsSameAs(v2)) { return false; } } break; case wxJSONTYPE_OBJECT : size = Size(); #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Comparing a map object - size=%d"), __PRETTY_FUNCTION__, size); #endif if (size != other.Size()) { #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Comparison failed - sizes does not match"), __PRETTY_FUNCTION__); #endif return false; } // for every key calls itself on the value found in // the other object. if 'key' does no exist, returns FALSE for (it = data->m_valMap.begin(); it != data->m_valMap.end(); it++) { wxString key = it->first; #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Comparing map object - key=%s"), __PRETTY_FUNCTION__, key.c_str()); #endif wxJSONValue otherVal = other.ItemAt(key); bool isSame = it->second.IsSameAs(otherVal); if (!isSame) { #if defined(JSONDEBUG) wxLogTrace(compareTraceMask, _T("(%s) Comparison failed for the last object"), __PRETTY_FUNCTION__); #endif return false; } } break; default : // should never happen wxFAIL_MSG(_T("wxJSONValue::IsSameAs() unexpected wxJSONType")); break; } return r; } //! Add a comment to this JSON value object. /*! The function adds a comment string to this JSON value object and returns the total number of comment strings belonging to this value. Note that the comment string must be a valid C/C++ comment because the wxJSONWriter does not modify it. In other words, a C++ comment string must start with '//' and must end with a new-line character. If the final LF char is missing, the automatically adds it. You can also add C-style comments which must be enclosed in the usual C-comment characters. For C-style comments, the function does not try to append the final comment characters but allows trailing whitespaces and new-line chars. The \c position parameter is one of: \li wxJSONVALUE_COMMENT_BEFORE: the comment will be written before the value \li wxJSONVALUE_COMMENT_INLINE: the comment will be written on the same line \li wxJSONVALUE_COMMENT_AFTER: the comment will be written after the value \li wxJSONVALUE_COMMENT_DEFAULT: the old value of comment's position is not changed; if no comments were added to the value object this is the same as wxJSONVALUE_COMMENT_BEFORE. To know more about comment's storage see \ref json_comment_add */ int wxJSONValue::AddComment(const wxString& str, int position) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) comment=%s"), __PRETTY_FUNCTION__, str.c_str()); #endif int r = -1; int len = str.length(); if (len < 2) { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T(" error: len < 2")); #endif return -1; } if (str[0] != '/') { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T(" error: does not start with\'/\'")); #endif return -1; } if (str[1] == '/') { // a C++ comment: check that it ends with '\n' #if defined(JSONDEBUG) wxLogTrace(traceMask, _T(" C++ comment")); #endif if (str.GetChar(len - 1) != '\n') { wxString temp(str); temp.append(1, '\n'); data->m_comments.Add(temp); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T(" C++ comment: LF added")); #endif } else { data->m_comments.Add(str); } r = data->m_comments.size(); } else if (str[1] == '*') { // a C-style comment: check that it ends with '*/' #if defined(JSONDEBUG) wxLogTrace(traceMask, _T(" C-style comment")); #endif int lastPos = len - 1; wxChar ch = str.GetChar(lastPos); // skip leading whitespaces while (ch == ' ' || ch == '\n' || ch == '\t') { --lastPos; ch = str.GetChar(lastPos); } if (str.GetChar(lastPos) == '/' && str.GetChar(lastPos - 1) == '*') { data->m_comments.Add(str); r = data->m_comments.size(); } } else { #if defined(JSONDEBUG) wxLogTrace(traceMask, _T(" error: is not a valid comment string")); #endif r = -1; } // if the comment was stored, store the position if (r >= 0 && position != wxJSONVALUE_COMMENT_DEFAULT) { data->m_commentPos = position; } return r; } //! Add one or more comments to this JSON value object. /*! The function adds the strings contained in \c comments to the comment's string array of this value object by calling the AddComment(const wxString&,int) function for every string in the \c comment array. Returns the number of strings correctly added. */ int wxJSONValue::AddComment(const wxArrayString& comments, int position) { int siz = comments.GetCount(); int r = 0; for (int i = 0; i < siz; i++) { int r2 = AddComment(comments[i], position); if (r2 >= 0) { ++r; } } return r; } //! Return a comment string. /*! The function returns the comment string at index \c idx. If \c idx is out of range, an empty string is returned. If \c idx is equal to -1, then the function returns a string that contains all comment's strings stored in the array. */ wxString wxJSONValue::GetComment(int idx) const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxString s; int size = data->m_comments.GetCount(); if (idx < 0) { for (int i = 0; i < size; i++) { s.append(data->m_comments[i]); } } else if (idx < size) { s = data->m_comments[idx]; } return s; } //! Return the number of comment strings. int wxJSONValue::GetCommentCount() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); int d = data->m_comments.GetCount(); #if defined(JSONDEBUG) wxLogTrace(traceMask, _T("(%s) comment count=%d"), __PRETTY_FUNCTION__, d); #endif return d; } //! Return the comment position. int wxJSONValue::GetCommentPos() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); return data->m_commentPos; } //! Get the comment string's array. const wxArrayString& wxJSONValue::GetCommentArray() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); return data->m_comments; } //! Clear all comment strings void wxJSONValue::ClearComments() { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); data->m_comments.clear(); } //! Set the type of the stored value. /*! The function sets the type of the stored value as specified in the provided argument. If the actual type is equal to \c type, nothing happens and this JSON value object retains the original type and value. If the type differs, however, the original type and value are lost. The function just sets the type of the object and not the value itself. If the object does not have a data structure it is allocated using the CreateRefData() function unless the type to be set is wxJSONTYPE_INVALID. In this case and if a data structure is not yet allocated, it is not allocated. If the object already contains a data structure it is not deleted but the type is changed in the original data structure. Complex values in the old structure are cleared. The \c type argument can be one of the following: \li wxJSONTYPE_INVALID: an empty (not initialized) JSON value \li wxJSONTYPE_NULL: a NULL value \li wxJSONTYPE_INT: an integer value \li wxJSONTYPE_UINT: an unsigned integer \li wxJSONTYPE_DOUBLE: a double precision number \li wxJSONTYPE_BOOL: a boolean \li wxJSONTYPE_CSTRING: a C string \li wxJSONTYPE_STRING: a wxString object \li wxJSONTYPE_ARRAY: an array of wxJSONValue objects \li wxJSONTYPE_OBJECT: a hashmap of key/value pairs where \e value is a wxJSONValue object \li wxJSONTYPE_LONG: a 32-bits integer value \li wxJSONTYPE_ULONG: an unsigned 32-bits integer \li wxJSONTYPE_INT64: a 64-bits integer value \li wxJSONTYPE_UINT64: an unsigned 64-bits integer \li wxJSONTYPE_SHORT: a signed short integer \li wxJSONTYPE_USHORT: an unsigned short integer \li wxJSONTYPE_MEMORYBUFF: a binary memory buffer The integer storage depends on the platform: for platforms that support 64-bits integers, integers are always stored as 64-bits integers. On platforms that do not support 64-bits integers, ints are stored as \b long \b int. To know more about the internal representation of integers, read \ref json_internals_integer. Note that there is no need to set a type for the object in order to assign a value to it. In other words, if you want to construct a JSON value which holds an integer value of 10, just use the specific constructor: \code wxJSONValue value(10); \endcode which sets the integer type and also the numeric value. Moreover, there is no need to set the type for none of the handled types, not only for primitive types but for complex types, too. For example, if you want to construct an array of JSON values, just use the default ctor and call the Append() member function which will append the first element to the array and will set the array type: \code wxJSONValue value; value.Append("a string"); \endcode \sa GetType */ wxJSONRefData* wxJSONValue::SetType(wxJSONType type) { wxJSONRefData* data = GetRefData(); wxJSONType oldType = GetType(); // check that type is within the allowed range wxJSON_ASSERT((type >= wxJSONTYPE_INVALID) && (type <= wxJSONTYPE_MEMORYBUFF)); if ((type < wxJSONTYPE_INVALID) || (type > wxJSONTYPE_MEMORYBUFF)) { type = wxJSONTYPE_INVALID; } // the function unshares the referenced data but does not delete the // structure. This is because the wxJSON reader stores comments // that appear before the value in a temporary value of type wxJSONTYPE_INVALID // which is invalid and, next, it stores the JSON value in the same // wxJSONValue object. // If we would delete the structure using 'Unref()' we loose the // comments data = COW(); // do nothing if the actual type is the same as 'type' if (type == oldType) { return data; } // change the type of the referened structure // NOTE: integer types are always stored as the generic integer types if (type == wxJSONTYPE_LONG || type == wxJSONTYPE_INT64 || type == wxJSONTYPE_SHORT) { type = wxJSONTYPE_INT; } if (type == wxJSONTYPE_ULONG || type == wxJSONTYPE_UINT64 || type == wxJSONTYPE_USHORT) { type = wxJSONTYPE_UINT; } wxJSON_ASSERT(data); data->m_type = type; // clears complex objects of the old type switch (oldType) { case wxJSONTYPE_STRING: data->m_valString.clear(); break; case wxJSONTYPE_ARRAY: data->m_valArray.Clear(); break; case wxJSONTYPE_OBJECT: data->m_valMap.clear(); break; case wxJSONTYPE_MEMORYBUFF: // we first have to delete the actual memory buffer, if any if (data->m_memBuff) { delete data->m_memBuff; data->m_memBuff = 0; } break; default : // there is not need to clear primitive types break; } // if the WXJSON_USE_CSTRING macro is not defined, the class forces // C-string to be stored as wxString objects #if !defined(WXJSON_USE_CSTRING) if (data->m_type == wxJSONTYPE_CSTRING) { data->m_type = wxJSONTYPE_STRING; } #endif return data; } //! Return the line number of this JSON value object /*! The line number of a JSON value object is set to -1 when the object is constructed. The line number is set by the parser class, wxJSONReader, when a JSON text is read from a stream or a string. it is used when reading a comment line: comment lines that appear on the same line as a value are considered \b inline comments of the value. */ int wxJSONValue::GetLineNo() const { // return ZERO if there is not a referenced data structure int n = 0; wxJSONRefData* data = GetRefData(); if (data != 0) { n = data->m_lineNo; } return n; } //! Set the line number of this JSON value object. void wxJSONValue::SetLineNo(int num) { wxJSONRefData* data = COW(); wxJSON_ASSERT(data); data->m_lineNo = num; } //! Set the pointer to the referenced data. void wxJSONValue::SetRefData(wxJSONRefData* data) { m_refData = data; } //! Increments the referenced data counter. void wxJSONValue::Ref(const wxJSONValue& clone) { // nothing to be done if (m_refData == clone.m_refData) return; // delete reference to old data UnRef(); // reference new data if (clone.m_refData) { m_refData = clone.m_refData; ++(m_refData->m_refCount); } } //! Unreferences the shared data /*! The function decrements the number of shares in wxJSONRefData::m_refCount and if it is ZERO, deletes the referenced data. It is called by the destructor and by the copy-on-write functions. */ void wxJSONValue::UnRef() { if (m_refData) { wxASSERT_MSG(m_refData->m_refCount > 0, _T("invalid ref data count")); if (--m_refData->m_refCount == 0) { delete m_refData; m_refData = NULL; } } } //! Makes an exclusive copy of shared data void wxJSONValue::UnShare() { AllocExclusive(); } //! Do a deep copy of the other object. /*! This function allocates a new ref-data structure and copies it from the object \c other. */ void wxJSONValue::DeepCopy(const wxJSONValue& other) { UnRef(); wxJSONRefData* data = CloneRefData(other.m_refData); SetRefData(data); } //! Return the pointer to the referenced data structure. wxJSONRefData* wxJSONValue::GetRefData() const { wxJSONRefData* data = m_refData; return data; } //! Make a copy of the referenced data. /*! The function allocates a new instance of the wxJSONRefData structure, copies the content of \c other and returns the pointer to the newly created structure. This function is called by the wxObject::UnRef() function when a non-const member function is called on multiple referenced data. */ wxJSONRefData* wxJSONValue::CloneRefData(const wxJSONRefData* otherData) const { wxJSON_ASSERT(otherData); // make a static cast to pointer-to-wxJSONRefData const wxJSONRefData* other = otherData; // allocate a new instance of wxJSONRefData using the default // ctor; we cannot use the copy ctor of a wxJSONRefData wxJSONRefData* data = new wxJSONRefData(); // copy the referenced data structure's data members data->m_type = other->m_type; data->m_value = other->m_value; data->m_commentPos = other->m_commentPos; data->m_comments = other->m_comments; data->m_lineNo = other->m_lineNo; data->m_valString = other->m_valString; data->m_valArray = other->m_valArray; data->m_valMap = other->m_valMap; // if the data contains a wxMemoryBuffer object, then we have // to make a deep copy of the buffer by allocating a new one because // wxMemoryBuffer is not a copy-on-write structure if (other->m_memBuff) { data->m_memBuff = new wxMemoryBuffer(); const void* ptr = data->m_memBuff->GetData(); size_t len = data->m_memBuff->GetDataLen(); if (data->m_memBuff && len) { data->m_memBuff->AppendData(ptr, len); } } #if defined(JSONDEBUG) wxLogTrace(cowTraceMask, _T("(%s) CloneRefData() PROGR: other=%d data=%d"), __PRETTY_FUNCTION__, other->GetRefCount(), data->GetRefCount()); #endif return data; } //! Create a new data structure /*! The function allocates a new instance of the wxJSONRefData structure and returns its pointer. The type of the JSON value is set to wxJSONTYPE_INVALID (= a not initialized value). */ wxJSONRefData* wxJSONValue::CreateRefData() const { wxJSONRefData* data = new wxJSONRefData(); data->m_type = wxJSONTYPE_INVALID; return data; } //! Make sure the referenced data is unique /*! This function is called by all non-const member functions and makes sure that the referenced data is unique by calling \b UnShare() If the referenced data is shared acrosss other wxJSONValue instances, the \c UnShare() function makes a private copy of the shared data. */ wxJSONRefData* wxJSONValue::COW() { #if wxUSE_LOG && wxUSE_LOG_DEBUG #if defined(JSONDEBUG) wxJSONRefData* data = GetRefData(); wxLogTrace(cowTraceMask, _T("(%s) COW() START data=%p data->m_count=%d"), __PRETTY_FUNCTION__, data, data->GetRefCount()); #endif #endif UnShare(); #if wxUSE_LOG && wxUSE_LOG_DEBUG #if defined(JSONDEBUG) data = GetRefData(); wxLogTrace(cowTraceMask, _T("(%s) COW() END data=%p data->m_count=%d"), __PRETTY_FUNCTION__, data, data->GetRefCount()); #endif #endif return GetRefData(); } //! Makes a private copy of the referenced data void wxJSONValue::AllocExclusive() { if (!m_refData) { m_refData = CreateRefData(); } else if (m_refData->GetRefCount() > 1) { // note that ref is not going to be destroyed in this case const wxJSONRefData* ref = m_refData; UnRef(); // ... so we can still access it m_refData = CloneRefData(ref); } //else: ref count is 1, we are exclusive owners of m_refData anyhow wxASSERT_MSG(m_refData && m_refData->GetRefCount() == 1, _T("wxObject::AllocExclusive() failed.")); } //! Convert memory buffer object to a string representation. /*/ The function returns a string representation of the data contained in the memory buffer object \c buff. The string is conposed of two hexadecimal digits for every byte contained in the memory buffer; bytes are separated by a space character. The string starts with the actual length of the data enclosed in parenthesis. The string will contain \c len bytes if \c len is less than the length of the actual data in \c buff. Note that the(len) printed in the output refers to the length of the buffer which may be greater than the length that has to be printed. \b Example: This is an example of printing a memory buffer object that contains 10 bytes: \code 0x80974653(10) 00 01 02 03 04 05 06 07 08 09 \endcode */ wxString wxJSONValue::MemoryBuffToString(const wxMemoryBuffer& buff, size_t len) { size_t buffLen = buff.GetDataLen(); void* ptr = buff.GetData(); wxString s = MemoryBuffToString(ptr, MIN(buffLen, len), buffLen); return s; } //! Convert a binary memory buffer to a string representation. /*/ The function returns a string representation of the data contained in the binary memory buffer pointed to by \c buff for \c len bytes. The string is composed of two hexadecimal digits for every byte contained in the memory buffer; bytes are separated by a space character. The string starts with pointer to binary data followed by the length of the data enclosed in parenthesis. \b Example: This is an example of printing ten bytes from a memory buffer: \code 0x80974653(10) 00 01 02 03 04 05 06 07 08 09 \endcode @param buff the pointer to the memory buffer data @len the length of the data that has to be printed @actualLen the real length of the memory buffer that has to be printed just after the pointer; may be greater than \c len. If this parameter is -1 then it is equal to \c len */ wxString wxJSONValue::MemoryBuffToString(const void* buff, size_t len, size_t actualLen) { wxString s; size_t buffLen = actualLen; if (buffLen == static_cast (-1)) { buffLen = len; } s.Printf(_T("%p (%u) "), buff, buffLen); unsigned char* ptr = (unsigned char*) buff; for (unsigned int i = 0; i < len; i++) { unsigned char c = *ptr; ++ptr; // now convert the character char c1 = c / 16; char c2 = c % 16; c1 += '0'; c2 += '0'; if (c1 > '9') { c1 += 7; } if (c2 > '9') { c2 += 7; } s.Append(c1, 1); s.Append(c2, 1); s.Append(' ', 1); // a space separates the bytes } return s; } //! Compares two memory buffer objects /*! The function is the counterpart of the comparison operator == for two wxMemoryBuffer objects. You may noticed that the wxMemoryBuffer class does not define comparison operators so if you write a code snippset like the following: \code wxMemoryBuffer b1; wxMemoryBuffer b2; b1.AppendData("1234567890", 10); b2.AppendData("1234567890", 10); bool r = b1 == b2; \endcode you may expect that \b r is TRUE, because both objects contain the same data. This is not true. The result you get is FALSE because the default comparison operator is used, which just compares the data members of the class. The data member is the pointer to the allocated memory that contains the data and they are not equal. This function uses the (fast) \b memcmp function to compare the actual data contained in the nenory buffer objects thus doing a deep comparison. The function returns the return value of \b memcmp: the memcmp() function returns an integer less than, equal to, or greater than zero if the first n bytes of \c buff1 is found, respectively, to be less than, to match, or be greater than the first n bytes of \c buff2. */ int wxJSONValue::CompareMemoryBuff(const wxMemoryBuffer& buff1, const wxMemoryBuffer& buff2) { int r; size_t buff1Len = buff1.GetDataLen(); size_t buff2Len = buff2.GetDataLen(); if (buff1Len > buff2Len) { r = 1; } else if (buff1Len < buff2Len) { r = -1; } else { r = memcmp(buff1.GetData(), buff2.GetData(), buff1Len); } return r; } //! Compares a memory buffer object and a memory buffer /*! The function compares the data contained in a memory buffer object with a memory buffer. This function uses the (fast) \b memcmp function to compare the actual data contained in the nenory buffer object thus doing a deep comparison. The function returns the return value of \b memcmp: The memcmp() function returns an integer less than, equal to, or greater than zero if the first n bytes of \c buff1 is found, respectively, to be less than, to match, or be greater than the first n bytes of \c buff2. */ int wxJSONValue::CompareMemoryBuff(const wxMemoryBuffer& buff1, const void* buff2) { int r; size_t buff1Len = buff1.GetDataLen(); r = memcmp(buff1.GetData(), buff2, buff1Len); return r; } //! Converts an array of INTs to a memory buffer /*! This static function converts an array of INTs stored in a wxJSONvalue object into a memory buffer object. The wxJSONvalue object passed as parameter must be of type ARRAY and must contain INT types whose values are between 0 and 255. Every element of the array si converted to a BYTE value and appended to the returned wxMemoryBuffer object. The following rules apply in the conversion: \li if \c value is not an ARRAY type, an empty memory buffer is returned \li if the \c value array contains elements of type other than INT, those elements are ignored \li if the \c value array contains elements of type INT which value is outside the range 0..255, those elements are ignored \li if the \c value array contains only ignored elements an empty wxMemoryBuffer object is returned. This function can be used to get a memory buffer object from valid JSON text. Please note that the wxJSONReader cannot know which array of INTs represent a binary memory buffer unless you use the \b wxJSON \e memory \e buffer extension in the writer and in the reader. */ wxMemoryBuffer wxJSONValue::ArrayToMemoryBuff(const wxJSONValue& value) { wxMemoryBuffer buff; if (value.IsArray()) { int len = value.Size(); for (int i = 0; i < len; i++) { short int byte; unsigned char c; // we do not use opertaor [] because it is not const // bool r = value[i].AsShort(byte); bool r = value.ItemAt(i).AsShort(byte); if (r && (byte >= 0 && byte <= 255)) { c = (unsigned char) byte; buff.AppendByte(c); } } } return buff; } /************************************************************************* 64-bits integer support *************************************************************************/ #if defined(wxJSON_64BIT_INT) //! \overload wxJSONValue() wxJSONValue::wxJSONValue(wxInt64 i) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_INT); wxJSON_ASSERT(data); if (data != 0) { data->m_value.VAL_INT = i; } } //! \overload wxJSONValue() wxJSONValue::wxJSONValue(wxUint64 ui) { m_refData = 0; wxJSONRefData* data = Init(wxJSONTYPE_UINT); wxJSON_ASSERT(data); if (data != 0) { data->m_value.VAL_UINT = ui; } } //! Return TRUE if the stored value is a 32-bits integer /*! This function is only available on 64-bits platforms and returns TRUE if, and only if, the stored value is of type \b wxJSONTYPE_INT and the numeric value fits in a 32-bits signed integer. The function just calls IsLong() and returns the value returned by that function. The use of this function is deprecated: use \c IsLong() instead */ bool wxJSONValue::IsInt32() const { bool r = IsLong(); return r; } //! Return TRUE if the stored value is a unsigned 32-bits integer /*! This function is only available on 64-bits platforms and returns TRUE if, and only if, the stored value is of type \b wxJSONTYPE_UINT and the numeric value fits in a 32-bits unsigned integer. The function just calls IsULong() and returns the value returned by that function. The use of this function is deprecated: use \c IsULong() instead */ bool wxJSONValue::IsUInt32() const { bool r = IsULong(); return r; } //! Return TRUE if the stored value is integer. /*! This function returns TRUE if the stored value is of type signed integer. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_INT The function is only available if 64-bits integer support is enabled. \sa \ref json_internals_integer */ bool wxJSONValue::IsInt64() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_INT) { r = true; } return r; } //! Return TRUE if the stored value is a unsigned integer /*! This function returns TRUE if the stored value is of type unsigned integer. In other words, the function returns TRUE if the \c wxJSONRefData::m_type data member is of type \c wxJSONTYPE_UINT. The function is only available if 64-bits integer support is enabled. \sa \ref json_internals_integer */ bool wxJSONValue::IsUInt64() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); bool r = false; if (data->m_type == wxJSONTYPE_UINT) { r = true; } return r; } //! Returns the low-order 32 bits of the value as an integer /*! This function is only available on 64-bits platforms and returns the low-order 32-bits of the integer stored in the JSON value. Note that all integer types are stored as \b wx(U)Int64 data types by the JSON value class and that the function does not check that the numeric value fits in a 32-bit integer. The function just calls AsLong() and casts the value in a wxInt32 data type \sa \ref wxjson_tutorial_get */ wxInt32 wxJSONValue::AsInt32() const { wxInt32 i; i = (wxInt32) AsLong(); return i; } //! Returns the low-order 32 bits of the value as an unsigned integer /*! This function is only available on 64-bits platforms and returns the low-order 32-bits of the integer stored in the JSON value. Note that all integer types are stored as \b wx(U)Int64 data types by the JSON value class and that the function does not check that the numeric value fits in a 32-bit integer. The function just calls AsULong() and casts the value in a wxUInt32 data type \sa \ref wxjson_tutorial_get */ wxUint32 wxJSONValue::AsUInt32() const { wxUint32 ui; ui = (wxUint32) AsULong(); return ui; } //! Return the numeric value as a 64-bit integer. /*! This function is only available on 64-bits platforms and returns the numeric value as a 64-bit integer. Note that the function does not check that the type of the value is actually an integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function ASSERTs that the type of the stored value is wxJSONTYPE_INT. \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ wxInt64 wxJSONValue::AsInt64() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxInt64 i64 = data->m_value.m_valInt64; wxJSON_ASSERT(IsInt64()); // exapnds only in debug builds return i64; } //! Return the numeric value as a 64-bit unsigned integer. /*! This function is only available on 64-bits platforms and returns the numeric value as a 64-bit unsigned integer. Note that the function does not check that the type of the value is actually an integer and it just returns the content of the wxJSONValueHolder union. However, in debug builds, the function wxJSON_ASSERTs that the type of the stored value is wxJSONTYPE_UINT. \sa \ref json_internals_integer \sa \ref wxjson_tutorial_get */ wxUint64 wxJSONValue::AsUInt64() const { wxJSONRefData* data = GetRefData(); wxJSON_ASSERT(data); wxUint64 ui64 = data->m_value.m_valUInt64; wxJSON_ASSERT(IsUInt64()); // exapnds only in debug builds return ui64; } bool wxJSONValue::AsInt32(wxInt32& i32) const { bool r = IsInt32(); if (r) { i32 = AsInt32(); } return r; } bool wxJSONValue::AsUInt32(wxUint32& ui32) const { bool r = IsUInt32(); if (r) { ui32 = AsUInt32(); } return r; } bool wxJSONValue::AsInt64(wxInt64& i64) const { bool r = IsInt64(); if (r) { i64 = AsInt64(); } return r; } bool wxJSONValue::AsUInt64(wxUint64& ui64) const { bool r = IsUInt64(); if (r) { ui64 = AsUInt64(); } return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(wxInt64 i) { wxJSONValue v(i); wxJSONValue& r = Append(v); return r; } //! \overload Append(const wxJSONValue&) wxJSONValue& wxJSONValue::Append(wxUint64 ui) { wxJSONValue v(ui); wxJSONValue& r = Append(v); return r; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (wxInt64 i) { wxJSONRefData* data = SetType(wxJSONTYPE_INT); data->m_value.VAL_INT = i; return *this; } //! \overload operator = (int) wxJSONValue& wxJSONValue::operator = (wxUint64 ui) { wxJSONRefData* data = SetType(wxJSONTYPE_UINT); data->m_value.VAL_UINT = ui; return *this; } #endif // defined(wxJSON_64BIT_INT) /* { } */ tqsl-2.8.1/apps/jsonval.h0000755000175000017500000003540115003421124015271 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: jsonval.h // Purpose: the wxJSONValue class: it holds a JSON value // Author: Luciano Cattani // Created: 2007/09/15 // RCS-ID: $Id: jsonval.h,v 1.4 2008/01/10 21:27:15 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #if !defined(_WX_JSONVAL_H) #define _WX_JSONVAL_H #ifdef __GNUG_ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma interface "jsonval.h" #pragma clang diagnostic pop #endif // For compilers that support precompilation, includes "wx/wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWidgets headers) #ifndef WX_PRECOMP #include #include #include #include #endif #include "json_defs.h" // forward declarations class WXDLLIMPEXP_JSON wxJSONReader; class WXDLLIMPEXP_JSON wxJSONRefData; #if defined(wxJSON_USE_STL) // if compiling on MinGW we use the STL-style declaration of wxWidget's // container classes class WXDLLIMPEXP_JSON wxJSONValue; WX_DECLARE_OBJARRAY(wxJSONValue, wxJSONInternalArray); WX_DECLARE_STRING_HASH_MAP(wxJSONValue, wxJSONInternalMap); #else class WXDLLIMPEXP_JSON wxJSONInternalMap; class WXDLLIMPEXP_JSON wxJSONInternalArray; #endif //! The type of the value held by the wxJSONRefData class enum wxJSONType { wxJSONTYPE_INVALID = 0, /*!< the object is not uninitialized */ wxJSONTYPE_NULL, /*!< the object contains a NULL value */ wxJSONTYPE_INT, /*!< the object contains an integer */ wxJSONTYPE_UINT, /*!< the object contains an unsigned integer */ wxJSONTYPE_DOUBLE, /*!< the object contains a double */ wxJSONTYPE_STRING, /*!< the object contains a wxString object */ wxJSONTYPE_CSTRING, /*!< the object contains a static C-string */ wxJSONTYPE_BOOL, /*!< the object contains a boolean */ wxJSONTYPE_ARRAY, /*!< the object contains an array of values */ wxJSONTYPE_OBJECT, /*!< the object contains a map of keys/values */ wxJSONTYPE_LONG, /*!< the object contains a 32-bit integer */ wxJSONTYPE_INT64, /*!< the object contains a 64-bit integer */ wxJSONTYPE_ULONG, /*!< the object contains an unsigned 32-bit integer */ wxJSONTYPE_UINT64, /*!< the object contains an unsigned 64-bit integer */ wxJSONTYPE_SHORT, /*!< the object contains a 16-bit integer */ wxJSONTYPE_USHORT, /*!< the object contains a 16-bit unsigned integer */ wxJSONTYPE_MEMORYBUFF /*!< the object contains a binary memory buffer */ }; // the comment position: every value only has one comment position // althrough comments may be split into several lines enum { wxJSONVALUE_COMMENT_DEFAULT = 0, wxJSONVALUE_COMMENT_BEFORE, wxJSONVALUE_COMMENT_AFTER, wxJSONVALUE_COMMENT_INLINE, }; /*********************************************************************** class wxJSONValue ***********************************************************************/ // class WXDLLIMPEXP_JSON wxJSONValue : public wxObject class WXDLLIMPEXP_JSON wxJSONValue { friend class wxJSONReader; public: // ctors and dtor wxJSONValue(); explicit wxJSONValue(wxJSONType type); explicit wxJSONValue(int i); explicit wxJSONValue(unsigned int i); explicit wxJSONValue(short i); explicit wxJSONValue(unsigned short i); explicit wxJSONValue(long int i); explicit wxJSONValue(unsigned long int i); #if defined(wxJSON_64BIT_INT) explicit wxJSONValue(wxInt64 i); explicit wxJSONValue(wxUint64 ui); #endif explicit wxJSONValue(bool b); explicit wxJSONValue(double d); explicit wxJSONValue(const wxChar* str); // assume static ASCIIZ strings explicit wxJSONValue(const wxString& str); explicit wxJSONValue(const wxMemoryBuffer& buff); wxJSONValue(const void* buff, size_t len); wxJSONValue(const wxJSONValue& other); virtual ~wxJSONValue(); // functions for retrieving the value type wxJSONType GetType() const; bool IsValid() const; bool IsNull() const; bool IsInt() const; bool IsUInt() const; bool IsShort() const; bool IsUShort() const; bool IsLong() const; bool IsULong() const; #if defined(wxJSON_64BIT_INT) bool IsInt32() const; bool IsInt64() const; bool IsUInt32() const; bool IsUInt64() const; #endif bool IsBool() const; bool IsDouble() const; bool IsString() const; bool IsCString() const; bool IsArray() const; bool IsObject() const; bool IsMemoryBuff() const; // function for retrieving the value as ... int AsInt() const; unsigned int AsUInt() const; short AsShort() const; unsigned short AsUShort() const; long int AsLong() const; unsigned long AsULong() const; bool AsInt(int& i) const; bool AsUInt(unsigned int& ui) const; bool AsShort(short int& s) const; bool AsUShort(unsigned short& us) const; bool AsLong(long int& l) const; bool AsULong(unsigned long& ul) const; #if defined(wxJSON_64BIT_INT) wxInt32 AsInt32() const; wxUint32 AsUInt32() const; wxInt64 AsInt64() const; wxUint64 AsUInt64() const; bool AsInt32(wxInt32& i32) const; bool AsUInt32(wxUint32& ui32) const; bool AsInt64(wxInt64& i64) const; bool AsUInt64(wxUint64& ui64) const; #endif bool AsBool() const; double AsDouble() const; wxString AsString() const; const wxChar* AsCString() const; bool AsBool(bool& b) const; bool AsDouble(double& d) const; bool AsString(wxString& str) const; bool AsCString(wxChar* ch) const; wxMemoryBuffer AsMemoryBuff() const; bool AsMemoryBuff(wxMemoryBuffer& buff) const; const wxJSONInternalMap* AsMap() const; const wxJSONInternalArray* AsArray() const; // get members names, size and other info bool HasMember(unsigned index) const; bool HasMember(const wxString& key) const; int Size() const; wxArrayString GetMemberNames() const; // appending items, resizing and deleting items wxJSONValue& Append(const wxJSONValue& value); wxJSONValue& Append(bool b); wxJSONValue& Append(int i); wxJSONValue& Append(unsigned int ui); wxJSONValue& Append(short int i); wxJSONValue& Append(unsigned short int ui); wxJSONValue& Append(long int l); wxJSONValue& Append(unsigned long int ul); #if defined(wxJSON_64BIT_INT) wxJSONValue& Append(wxInt64 i); wxJSONValue& Append(wxUint64 ui); #endif wxJSONValue& Append(double d); wxJSONValue& Append(const wxChar* str); wxJSONValue& Append(const wxString& str); wxJSONValue& Append(const wxMemoryBuffer& buff); wxJSONValue& Append(const void* buff, size_t len); bool Remove(int index); bool Remove(const wxString& key); void Clear(); bool Cat(const wxChar* str); bool Cat(const wxString& str); bool Cat(const wxMemoryBuffer& buff); // retrieve an item wxJSONValue& Item(unsigned index); wxJSONValue& Item(const wxString& key); wxJSONValue ItemAt(unsigned index) const; wxJSONValue ItemAt(const wxString& key) const; wxJSONValue& operator[] (unsigned index); wxJSONValue& operator[] (const wxString& key); wxJSONValue& operator = (int i); wxJSONValue& operator = (unsigned int ui); wxJSONValue& operator = (short int i); wxJSONValue& operator = (unsigned short int ui); wxJSONValue& operator = (long int l); wxJSONValue& operator = (unsigned long int ul); #if defined(wxJSON_64BIT_INT) wxJSONValue& operator = (wxInt64 i); wxJSONValue& operator = (wxUint64 ui); #endif wxJSONValue& operator = (bool b); wxJSONValue& operator = (double d); wxJSONValue& operator = (const wxChar* str); wxJSONValue& operator = (const wxString& str); wxJSONValue& operator = (const wxMemoryBuffer& buff); // wxJSONValue& operator = (const void* buff, size_t len); cannot be declared wxJSONValue& operator = (const wxJSONValue& value); // get the value or a default value wxJSONValue Get(const wxString& key, const wxJSONValue& defaultValue) const; // comparison function bool IsSameAs(const wxJSONValue& other) const; // comment-related functions int AddComment(const wxString& str, int position = wxJSONVALUE_COMMENT_DEFAULT); int AddComment(const wxArrayString& comments, int position = wxJSONVALUE_COMMENT_DEFAULT); wxString GetComment(int idx = -1) const; int GetCommentPos() const; int GetCommentCount() const; void ClearComments(); const wxArrayString& GetCommentArray() const; // debugging functions wxString GetInfo() const; wxString Dump(bool deep = false, int mode = 0) const; //misc functions wxJSONRefData* GetRefData() const; wxJSONRefData* SetType(wxJSONType type); int GetLineNo() const; void SetLineNo(int num); // public static functions: mainly used for debugging static wxString TypeToString(wxJSONType type); static wxString MemoryBuffToString(const wxMemoryBuffer& buff, size_t len = -1); static wxString MemoryBuffToString(const void* buff, size_t len, size_t actualLen = -1); static int CompareMemoryBuff(const wxMemoryBuffer& buff1, const wxMemoryBuffer& buff2); static int CompareMemoryBuff(const wxMemoryBuffer& buff1, const void* buff2); static wxMemoryBuffer ArrayToMemoryBuff(const wxJSONValue& value); protected: wxJSONValue* Find(unsigned index) const; wxJSONValue* Find(const wxString& key) const; void DeepCopy(const wxJSONValue& other); wxJSONRefData* Init(wxJSONType type); wxJSONRefData* COW(); // overridden from wxObject virtual wxJSONRefData* CloneRefData(const wxJSONRefData *data) const; virtual wxJSONRefData* CreateRefData() const; void SetRefData(wxJSONRefData* data); void Ref(const wxJSONValue& clone); void UnRef(); void UnShare(); void AllocExclusive(); //! the referenced data wxJSONRefData* m_refData; // used for debugging purposes: only in debug builds. #if defined(WXJSON_USE_VALUE_COUNTER) int m_progr; static int sm_progr; #endif }; #if !defined(wxJSON_USE_STL) // if using wxWidget's implementation of container classes we declare // the OBJARRAY are HASH_MAP _after_ the wxJSONValue is fully known WX_DECLARE_OBJARRAY(wxJSONValue, wxJSONInternalArray); WX_DECLARE_STRING_HASH_MAP(wxJSONValue, wxJSONInternalMap); #endif /*********************************************************************** class wxJSONRefData ***********************************************************************/ //! The actual value held by the wxJSONValue class (internal use) /*! Note that this structure is a \b union as in versions prior to 0.4.x The union just stores primitive types and not complex types which are stored in separate data members of the wxJSONRefData structure. This organization give us more flexibility when retrieving compatible types such as ints unsigned ints, long and so on. To know more about the internal structure of the wxJSONValue class see \ref pg_json_internals. */ union wxJSONValueHolder { int m_valInt; unsigned int m_valUInt; short int m_valShort; unsigned short m_valUShort; long int m_valLong; unsigned long m_valULong; double m_valDouble; const wxChar* m_valCString; bool m_valBool; #if defined(wxJSON_64BIT_INT) wxInt64 m_valInt64; wxUint64 m_valUInt64; #endif }; // // access to the (unsigned) integer value is done through // the VAL_INT macro which expands to the 'long' integer // data member of the 'long long' integer if 64-bits integer // support is enabled #if defined(wxJSON_64BIT_INT) #define VAL_INT m_valInt64 #define VAL_UINT m_valUInt64 #else #define VAL_INT m_valLong #define VAL_UINT m_valULong #endif // class WXDLLIMPEXP_JSON wxJSONRefData : public wxObjectRefData class WXDLLIMPEXP_JSON wxJSONRefData { // friend class wxJSONReader; friend class wxJSONValue; friend class wxJSONWriter; public: wxJSONRefData(); virtual ~wxJSONRefData(); int GetRefCount() const; // there is no need to define copy ctor //! the references count int m_refCount; //! The actual type of the value held by this object. wxJSONType m_type; //! The JSON value held by this object. /*! This data member contains the JSON data types defined by the JSON syntax with the exception of the complex objects. This data member is an union of the primitive types so that it is simpler to cast them in other compatible types. */ wxJSONValueHolder m_value; //! The JSON string value. wxString m_valString; //! The JSON array value. wxJSONInternalArray m_valArray; //! The JSON object value. wxJSONInternalMap m_valMap; //! The position of the comment line(s), if any. /*! The data member contains one of the following constants: \li \c wxJSONVALUE_COMMENT_BEFORE \li \c wxJSONVALUE_COMMENT_AFTER \li \c wxJSONVALUE_COMMENT_INLINE */ int m_commentPos; //! The array of comment lines; may be empty. wxArrayString m_comments; //! The line number when this value was read /*! This data member is used by the wxJSONReader class and it is used to store the line number of the JSON text document where the value appeared. This value is compared to the line number of a comment line in order to obtain the value which a comment refersto. */ int m_lineNo; //! The pointer to the memory buffer object /*! Note that despite using reference counting, the \b wxMemoryBuffer is not a \e copy-on-write structure so the wxJSON library uses some tricks in order to avoid the side effects of copying / assigning wxMemoryBuffer objects */ wxMemoryBuffer* m_memBuff; // used for debugging purposes: only in debug builds. #if defined(WXJSON_USE_VALUE_COUNTER) int m_progr; static int sm_progr; #endif }; #endif // not defined _WX_JSONVAL_H tqsl-2.8.1/apps/jsonwriter.cpp0000755000175000017500000012065615003421124016365 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: jsonwriter.cpp // Purpose: the wxJSONWriter class: a JSON text generator // Author: Luciano Cattani // Created: 2007/10/12 // RCS-ID: $Id: jsonwriter.cpp,v 1.6 2008/03/03 19:05:47 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG_ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma implementation "jsonwriter.cpp" #pragma clang diagnostic pop #endif #include "jsonwriter.h" #include #include #include #include #include #if defined(JSONDEBUG) static const wxChar* writerTraceMask = _T("traceWriter"); #endif /*! \class wxJSONWriter \brief The JSON document writer This class is a JSON document writer and it is used to write a wxJSONValue object to an output stream or to a string object. The ctor accepts some parameters which can be used to change the style of the output. The default output is in human-readable format that uses a three-space indentation for object / array sub-items and separates every value with a linefeed character. \par Examples Using the default writer constructor \code // construct the JSON value object and add values to it wxJSONValue root; root["key1"] = "some value"; ... // construct the string that will contain the JSON text wxString str; // construct a JSON writer: use the default writer's settings wxJSONWriter writer; // call the writer's Write() memberfunction writer.Write(root, str); \endcode To write a JSON value object using a four-spaces indentation and forcing all comment strings to appear before the value they refer to, use the following code: \code wxJSONWriter writer(wxJSONWRITER_STYLED | // want a styled output wxJSONWRITER_WRITE_COMMENTS | // want comments in the document wxJSONWRITER_COMMENTS_BEFORE, // force comments before value 0, // initial indentation 4); // indentation step writer.Write(value, document); \endcode The following code construct a JSON writer that produces the most compact text output but it is hard to read by humans: \code wxJSONWriter writer(wxJSONWRITER_NONE); writer.Write(value, document); \endcode \par The two types of output objects You can write JSON text to two different kind of objects: \li a string object (\b wxString) \li a stream object (\b wxOutputStream) When writing to a string object, the output is platform- and mode-dependent. In ANSI builds, the JSON text output in the string object will contain one-byte characters: the actual characters represented is locale dependent. In Unicode builds, the JSON text output in the string contains wide characters which encoding format is platform dependent: UCS-2 in Windows, UCS-4 in GNU/Linux. Starting from wxWidgets version 2.9 the internal encoding for Unicode builds in linux/unix systems is UTF-8. When writing to a stream object, the JSON text output is always encoded in UTF-8 in both ANSI and Unicode builds. In ANSI builds the user may want to suppress UTF-8 encoding so that the JSON text can be stored in ANSI format. Note that this is not valid JSON text unless all characters written to the JSON text document are in the US-ASCII character set (0x00..0x7F). To know more read \ref wxjson_tutorial_unicode_ansi \par Efficiency In versions up to 1.0 the JSON writer wrote every character to the output object (the string or the stream). This is very inefficient because the writer converted each char to UTF-8 when writing to streams but we have to note that only string values have to be actually converted. Special JSON characters, numbers and literals do not need the conversion because they lay in the US-ASCII plane (0x00-0x7F) and no conversion is needed as the UTF-8 encoding is the same as US-ASCII. For more info about the unicode topic see \ref wxjson_tutorial_unicode. \par The problem of writing doubles You can customize the output of doubles by specifying the format string that has to be used by the JSON writer class. To know more about this issue read \ref wxjson_tutorial_write_doubles */ //! Ctor. /*! Construct the JSON writer object with the specified parameters. Note that if \c styled is FALSE the indentation is totally suppressed and the values of the other two parameters are simply ignored. \param indent the initial indentation in number of spaces. Default is ZERO. If you specify the wxJSONWRITER_TAB_INDENT flag for the \e style, this value refers to the number of TABs in the initial indentation \param step the indentation increment for new objects/arrays in number of spaces (default is 3). This value is ignored if you specify the wxJSONWRITER_TAB_INDENT flag for the \e style: the indentation increment is only one TAB character. \param style this is a combination of the following constants OR'ed together: \li wxJSONWRITER_NONE: no indentation is performed and no LF character is written between values. This style produces strict JSON text but it is hard to read by humans \li wxJSONWRITER_STYLED: output is human-readable: values are separated by LF characters and sub-items are indented. This style produces strict JSON text that is easy to read by humans. \li wxJSONWRITER_WRITE_COMMENTS: this flag force the writer to write C/C++ comment strings, if any. The comments will be written in their original position. C/C++ comments may not be recognized by other JSON implementations because they are not strict JSON text. \li wxJSONWRITER_COMMENTS_BEFORE: this flag force the writer to write C/C++ comments always before the value they refer to. In order for this style to take effect, you also have to specify the wxJSONWRITER_WRITE_COMMENTS flag. \li wxJSONWRITER_COMMENTS_AFTER: this flag force the writer to write C/C++ comments always after the value they refer to. In order for this style to take effect, you also have to specify the wxJSONWRITER_WRITE_COMMENTS flag. \li wxJSONWRITER_SPLIT_STRINGS: this flag cause the writer to split strings in more than one line if they are too long. \li wxJSONWRITER_NO_LINEFEEDS: this flag cause the JSON writer to not add newlines between values. It is ignored if wxJSONWRITER_STYLED is not set. This style produces strict JSON text. \li wxJSONWRITER_ESCAPE_SOLIDUS: the solidus character (/) should only be escaped if the JSON text is meant for embedding in HTML. Unlike in older 0.x versions, it is disabled by default and this flag cause the solidus char to be escaped. This style produces strict JSON text. \li wxJSONWRITER_MULTILINE_STRING:this is a multiline-string mode where newlines and tabs are not escaped. This is not strict JSON, but it helps immensely when manually editing json files with multiline strings \li wxJSONWRITER_RECOGNIZE_UNSIGNED: this flag cause the JSON writer to prepend a plus sign (+) to unsigned integer values. This is used by the wxJSON reader to force the integer to be stored in an \b unsigned \b int. Note that this feature may be incompatible with other JSON implementations. \li wxJSONWRITER_TAB_INDENT: this flag cause the indentation of sub-objects / arrays to be done using a TAB character instead of SPACES. In order for this style to take effect, you also have to specify the wxJSONWRITER_STYLED flag. This style produces strict JSON text. \li wxJSONWRITER_NO_INDENTATION: this flag cause the JSON writer to not add indentation. It is ignored if wxJSONWRITER_STYLED is not set. This style produces strict JSON text. \li wxJSONWRITER_NOUTF8_STREAM: suppress UTF-8 conversion when writing string values to the stream thus producing ANSI text output; only meaningful in ANSI builds, this flag is simply ignored in Unicode builds. \li wxJSONWRITER_MEMORYBUFF: Note that for the style wxJSONWRITER_NONE the JSON text output is a bit different from that of old 0.x versions although it is syntactically equal. If you rely on the old JSON output formatting read the following page \ref wxjson_tutorial_style_none. To know more about the writer's styles see \ref wxjson_tutorial_style */ wxJSONWriter::wxJSONWriter(int style, int indent, int step) { m_indent = indent; m_step = step; m_style = style; m_noUtf8 = false; if (m_style == wxJSONWRITER_NONE) { m_indent = 0; m_step = 0; } // set the default format string for doubles as // 10 significant digits and suppress trailing ZEROes SetDoubleFmtString("%.10g"); #if !defined(wxJSON_USE_UNICODE) // in ANSI builds we can suppress UTF-8 conversion for both the writer and the reader if (m_style == wxJSONWRITER_NOUTF8_STREAM) { m_noUtf8 = true; } #endif } //! Dtor - does nothing wxJSONWriter::~wxJSONWriter() { } //! Write the JSONvalue object to a JSON text. /*! The two overloaded versions of this function let the user choose the output object which can be: \li a string object (\b wxString) \li a stream object (\b wxOutputStream) The two types of output object are very different because the text outputted is encoded in different formats depending on the build mode. When writing to a string object, the JSON text output is encoded differently depending on the build mode and the platform. Writing to a stream always produce UTF-8 encoded text. To know more about this topic read \ref wxjson_tutorial_unicode. Also note that the Write() function does not return a status code. If you are writing to a string, you do not have to warry about this issue: no errors can occur when writing to strings. On the other hand, when writing to a stream there could be errors in the write operation. If an error occurs, the \c Write(9 function immediately returns without trying further output operations. You have to check the status of the stream by calling the stream's memberfunctions. Example: \code // construct the JSON value object and add values to it wxJSONValue root; root["key1"] = "some value"; // write to a stream wxMemoryOutputStream mem; wxJSONWriter writer; writer.Write(root, mem); wxStreamError err = mem.GetLastError(); if (err != wxSTREAM_NO_ERROR) { MessageBox(_T("ERROR: cannot write the JSON text output")); } \endcode */ void wxJSONWriter::Write(const wxJSONValue& value, wxString& str) { #if !defined(wxJSON_USE_UNICODE) // in ANSI builds output to a string never use UTF-8 conversion bool noUtf8_bak = m_noUtf8; // save the current setting m_noUtf8 = true; #endif wxMemoryOutputStream os; Write(value, os); // get the address of the buffer wxFileOffset len = os.GetLength(); wxStreamBuffer* osBuff = os.GetOutputStreamBuffer(); void* buffStart = osBuff->GetBufferStart(); if (m_noUtf8) { str = wxString::From8BitData((const char*) buffStart, len); } else { str = wxString::FromUTF8((const char*) buffStart, len); } #if !defined(wxJSON_USE_UNICODE) m_noUtf8 = noUtf8_bak; // restore the old setting #endif } //! \overload Write(const wxJSONValue&, wxString&) void wxJSONWriter::Write(const wxJSONValue& value, wxOutputStream& os) { m_level = 0; DoWrite(os, value, 0, false); } //! Set the format string for double values. /*! This function sets the format string used for printing double values. Double values are outputted to JSON text using the \b snprintf function with a default format string of: \code %.10g \endcode which prints doubles with a precision of 10 decimal digits and suppressing trailing ZEROes. Note that the parameter is a pointer to \b char and not to \b wxChar. This is because the JSON writer always procudes UTF-8 encoded text and decimal digits in UTF-8 are made of only one UTF-8 code-unit (1 byte). */ void wxJSONWriter::SetDoubleFmtString(const char* fmt) { m_fmt = const_cast(fmt); } //! Perform the real write operation. /*! This is a recursive function that gets the type of the \c value object and calls several protected functions depending on the type: \li \c WriteNullvalue for type NULL \li \c WriteStringValue() for STRING and CSTRING types \li \c WriteIntValue for INT types \li \c WriteUIntValue for UINT types \li \c WriteBoolValue for BOOL types \li \c WriteDoubleValue for DOUBLE types \li \c WriteMemoryBuff for MEMORYBUFF types If the value is an array or key/value map (types ARRAY and OBJECT), the function iterates through all JSON value object in the array/map and calls itself for every item in the container. */ int wxJSONWriter::DoWrite(wxOutputStream& os, const wxJSONValue& value, const wxString* key, bool comma) { // note that this function is recursive // some variables that cannot be allocated in the switch statement const wxJSONInternalMap* map = 0; int size; m_colNo = 1; m_lineNo = 1; // determine the comment position; it is one of: // // wxJSONVALUE_COMMENT_BEFORE // wxJSONVALUE_COMMENT_AFTER // wxJSONVALUE_COMMENT_INLINE // // or -1 if comments have not to be written int commentPos = -1; if (value.GetCommentCount() > 0 && (m_style & wxJSONWRITER_WRITE_COMMENTS)) { commentPos = value.GetCommentPos(); if ((m_style & wxJSONWRITER_COMMENTS_BEFORE) != 0) { commentPos = wxJSONVALUE_COMMENT_BEFORE; } else if ((m_style & wxJSONWRITER_COMMENTS_AFTER) != 0) { commentPos = wxJSONVALUE_COMMENT_AFTER; } } int lastChar = 0; // check if WriteComment() writes the last LF char // first write the comment if it is BEFORE if (commentPos == wxJSONVALUE_COMMENT_BEFORE) { lastChar = WriteComment(os, value, true); if (lastChar < 0) { return lastChar; } else if (lastChar != '\n') { WriteSeparator(os); } } lastChar = WriteIndent(os); if (lastChar < 0) { return lastChar; } // now write the key if it is not NULL if (key) { lastChar = WriteKey(os, *key); } if (lastChar < 0) { return lastChar; } // now write the value wxJSONInternalMap::const_iterator it; // declare the map object long int count = 0; wxJSONType t = value.GetType(); switch (t) { case wxJSONTYPE_INVALID : WriteInvalid(os); wxFAIL_MSG(_T("wxJSONWriter::WriteEmpty() cannot be called (not a valid JSON text")); break; case wxJSONTYPE_INT : case wxJSONTYPE_SHORT : case wxJSONTYPE_LONG : case wxJSONTYPE_INT64 : lastChar = WriteIntValue(os, value); break; case wxJSONTYPE_UINT : case wxJSONTYPE_USHORT : case wxJSONTYPE_ULONG : case wxJSONTYPE_UINT64 : lastChar = WriteUIntValue(os, value); break; case wxJSONTYPE_NULL : lastChar = WriteNullValue(os); break; case wxJSONTYPE_BOOL : lastChar = WriteBoolValue(os, value); break; case wxJSONTYPE_DOUBLE : lastChar = WriteDoubleValue(os, value); break; case wxJSONTYPE_STRING : case wxJSONTYPE_CSTRING : lastChar = WriteStringValue(os, value.AsString()); break; case wxJSONTYPE_MEMORYBUFF : lastChar = WriteMemoryBuff(os, value.AsMemoryBuff()); break; case wxJSONTYPE_ARRAY : ++m_level; os.PutC('['); // the inline comment for objects and arrays are printed in the open char if (commentPos == wxJSONVALUE_COMMENT_INLINE) { commentPos = -1; // we have already written the comment lastChar = WriteComment(os, value, false); if (lastChar < 0) { return lastChar; } if (lastChar != '\n') { lastChar = WriteSeparator(os); } } else { // comment is not to be printed inline, so write a LF lastChar = WriteSeparator(os); if (lastChar < 0) { return lastChar; } } // now iterate through all sub-items and call DoWrite() recursively size = value.Size(); for (int i = 0; i < size; i++) { bool comma = false; if (i < size - 1) { comma = true; } wxJSONValue v = value.ItemAt(i); lastChar = DoWrite(os, v, 0, comma); if (lastChar < 0) { return lastChar; } } --m_level; lastChar = WriteIndent(os); if (lastChar < 0) { return lastChar; } os.PutC(']'); break; case wxJSONTYPE_OBJECT : ++m_level; os.PutC('{'); // the inline comment for objects and arrays are printed in the open char if (commentPos == wxJSONVALUE_COMMENT_INLINE) { commentPos = -1; // we have already written the comment lastChar = WriteComment(os, value, false); if (lastChar < 0) { return lastChar; } if (lastChar != '\n') { WriteSeparator(os); } } else { lastChar = WriteSeparator(os); } map = value.AsMap(); size = value.Size(); count = 0; for (it = map->begin(); it != map->end(); ++it) { // get the key and the value wxString key = it->first; const wxJSONValue& v = it->second; bool comma = false; if (count < size - 1) { comma = true; } lastChar = DoWrite(os, v, &key, comma); if (lastChar < 0) { return lastChar; } count++; } --m_level; lastChar = WriteIndent(os); if (lastChar < 0) { return lastChar; } os.PutC('}'); break; default : // a not yet defined wxJSONType: we FAIL wxFAIL_MSG(_T("wxJSONWriter::DoWrite() undefined wxJSONType type")); break; } // writes the comma character before the inline comment if (comma) { os.PutC(','); } if (commentPos == wxJSONVALUE_COMMENT_INLINE) { lastChar = WriteComment(os, value, false); if (lastChar < 0) { return lastChar; } } else if (commentPos == wxJSONVALUE_COMMENT_AFTER) { WriteSeparator(os); lastChar = WriteComment(os, value, true); if (lastChar < 0) { return lastChar; } } if (lastChar != '\n') { lastChar = WriteSeparator(os); } return lastChar; } //! Write the comment strings, if any. int wxJSONWriter::WriteComment(wxOutputStream& os, const wxJSONValue& value, bool indent) { // the function returns the last character written which should be // a LF char or -1 in case of errors // if nothing is written, returns ZERO int lastChar = 0; // only write comments if the style include the WRITE_COMMENTS flag if ((m_style & wxJSONWRITER_WRITE_COMMENTS) == 0) { return lastChar; } const wxArrayString cmt = value.GetCommentArray(); int cmtSize = cmt.GetCount(); for (int i = 0; i < cmtSize; i++) { if (indent) { WriteIndent(os); } else { os.PutC('\t'); } WriteString(os, cmt[i]); lastChar = cmt[i].Last(); if (lastChar != '\n') { os.PutC('\n'); lastChar = '\n'; } } return lastChar; } //! Writes the indentation to the JSON text. /*! The two functions write the indentation as \e spaces in the JSON output text. When called with a int parameter, the function writes the specified number of spaces. If no parameter is given, the function computes the number of spaces using the following formula: If the wxJSONWRITER_TAB_INDENT flag is used in the writer's cnstructor, the function calls WriteTabIndent(). The function also checks that wxJSONWRITER_STYLED is set and the wxJSONWRITER_NO_INDENTATION is not set. */ int wxJSONWriter::WriteIndent(wxOutputStream& os) { int lastChar = WriteIndent(os, m_level); return lastChar; } //! Write the specified number of indentation (spaces or tabs) /*! The function is called by WriteIndent() and other writer's functions. It writes the indentation as specified in the \c num parameter which is the actual \b level of annidation. The function checks if wxJSONWRITER_STYLED is set: if not, no indentation is performed. Also, the function checks if wxJSONWRITER_TAB_INDENT is set: if it is, indentation is done by writing \b num TAB characters otherwise, it is performed by writing a number of spaces computed as: \code numSpaces = m_indent + (m_step * num) \endcode */ int wxJSONWriter::WriteIndent(wxOutputStream& os, int num) { int lastChar = 0; if (!(m_style & wxJSONWRITER_STYLED) || (m_style & wxJSONWRITER_NO_INDENTATION)) { return lastChar; } int numChars = m_indent + (m_step * num); char c = ' '; if (m_style & wxJSONWRITER_TAB_INDENT) { c = '\t'; numChars = num; } for (int i = 0; i < numChars; i++) { os.PutC(c); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } } return c; } //! Write the provided string to the output object. /*! The function writes the string \c str to the output object that was specified in the wxJSONWriter::Write() function. The function may split strings in two or more lines if the string contains LF characters if the \c m_style data member contains the wxJSONWRITER_SPLIT_STRING flag. The function does not actually write the string: for every character in the provided string the function calls WriteChar() which does the actual character output. The function returns ZERO on success or -1 in case of errors. */ int wxJSONWriter::WriteStringValue(wxOutputStream& os, const wxString& str) { // JSON values of type STRING are written by converting the whole string // to UTF-8 and then copying the UTF-8 buffer to the 'os' stream // one byte at a time and processing them os.PutC('\"'); // open quotes // the buffer that has to be written is either UTF-8 or ANSI c_str() depending // on the 'm_noUtf8' flag char* writeBuff = 0; wxCharBuffer utf8CB = str.ToUTF8(); // the UTF-8 buffer #if !defined(wxJSON_USE_UNICODE) wxCharBuffer ansiCB(str.c_str()); // the ANSI buffer if (m_noUtf8) { writeBuff = ansiCB.data(); } else { writeBuff = utf8CB.data(); } #else writeBuff = utf8CB.data(); #endif // NOTE: in ANSI builds UTF-8 conversion may fail (see samples/test5.cpp, // test 7.3) although I do not know why if (writeBuff == 0) { const char* err = ""; os.Write(err, strlen(err)); return 0; } size_t len = strlen(writeBuff); int lastChar = 0; // store the column at which the string starts // splitting strings only happen if the string starts within // column wxJSONWRITER_LAST_COL (default 50) // see 'include/wx/json_defs.h' for the defines int tempCol = m_colNo; // now write the UTF8 buffer processing the bytes size_t i; for (i = 0; i < len; i++) { bool shouldEscape = false; unsigned char ch = *writeBuff; ++writeBuff; // point to the next byte // the escaped character char escCh = 0; // for every character we have to check if it is a character that // needs to be escaped: note that characters that should be escaped // may be not if some writer's flags are specified switch (ch) { case '\"' : // quotes shouldEscape = true; escCh = '\"'; break; case '\\' : // reverse solidus shouldEscape = true; escCh = '\\'; break; case '/' : // solidus shouldEscape = true; escCh = '/'; break; case '\b' : // backspace shouldEscape = true; escCh = 'b'; break; case '\f' : // formfeed shouldEscape = true; escCh = 'f'; break; case '\n' : // newline shouldEscape = true; escCh = 'n'; break; case '\r' : // carriage-return shouldEscape = true; escCh = 'r'; break; case '\t' : // horizontal tab shouldEscape = true; escCh = 't'; break; default : shouldEscape = false; break; } // end switch // if the character is a control character that is not identified by a // lowercase letter, we should escape it if (!shouldEscape && ch < 32) { char b[8]; snprintf(b, sizeof b, "\\u%04X", static_cast(ch)); os.Write(b, 6); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } // the char is not a control character } else { // some characters that should be escaped are not escaped // if the writer was constructed with some flags if (shouldEscape && !(m_style & wxJSONWRITER_ESCAPE_SOLIDUS)) { if (ch == '/') { shouldEscape = false; } } if (shouldEscape && (m_style & wxJSONWRITER_MULTILINE_STRING)) { if (ch == '\n' || ch == '\t') { shouldEscape = false; } } // now write the character prepended by ESC if it should be escaped if (shouldEscape) { os.PutC('\\'); os.PutC(escCh); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } } else { // a normal char or a UTF-8 units: write the character os.PutC(ch); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } } } // check if SPLIT_STRING flag is set and if the string has to // be split if ((m_style & wxJSONWRITER_STYLED) && (m_style & wxJSONWRITER_SPLIT_STRING)) { // split the string if the character written is LF if (ch == '\n') { // close quotes and CR os.Write("\"\n", 2); lastChar = WriteIndent(os, m_level + 2); // write indentation os.PutC('\"'); // reopen quotes if (lastChar < 0) { return lastChar; } // split the string only if there is at least wxJSONWRITER_MIN_LENGTH // character to write and the character written is a punctuation or space // BUG: the following does not work because the columns are not counted } else if ((m_colNo >= wxJSONWRITER_SPLIT_COL) && (tempCol <= wxJSONWRITER_LAST_COL)) { if (IsSpace(ch) || IsPunctuation(ch)) { if (len - i > wxJSONWRITER_MIN_LENGTH) { // close quotes and CR os.Write("\"\n", 2); lastChar = WriteIndent(os, m_level + 2); // write indentation os.PutC('\"'); // reopen quotes if (lastChar < 0) { return lastChar; } } } } } } // end for os.PutC('\"'); // close quotes return 0; } //! Write a generic string /*! The function writes the wxString object \c str to the output object. The string is written as is; you cannot use it to write JSON strings to the output text. The function converts the string \c str to UTF-8 and writes the buffer.. */ int wxJSONWriter::WriteString(wxOutputStream& os, const wxString& str) { #if defined(JSONDEBUG) wxLogTrace(writerTraceMask, _T("(%s) string to write=%s"), __PRETTY_FUNCTION__, str.c_str()); #endif int lastChar = 0; char* writeBuff = 0; // the buffer that has to be written is either UTF-8 or ANSI c_str() depending // on the 'm_noUtf8' flag wxCharBuffer utf8CB = str.ToUTF8(); // the UTF-8 buffer #if !defined(wxJSON_USE_UNICODE) wxCharBuffer ansiCB(str.c_str()); // the ANSI buffer if (m_noUtf8) { writeBuff = ansiCB.data(); } else { writeBuff = utf8CB.data(); } #else writeBuff = utf8CB.data(); #endif // NOTE: in ANSI builds UTF-8 conversion may fail (see samples/test5.cpp, // test 7.3) although I do not know why if (writeBuff == 0) { const char* err = ""; os.Write(err, strlen(err)); return 0; } size_t len = strlen(writeBuff); os.Write(writeBuff, len); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } #if defined(JSONDEBUG) wxLogTrace(writerTraceMask, _T("(%s) result=%d"), __PRETTY_FUNCTION__, lastChar); #endif return lastChar; } //! Write the NULL JSON value to the output stream. /*! The function writes the \b null literal string to the output stream. */ int wxJSONWriter::WriteNullValue(wxOutputStream& os) { os.Write("null", 4); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } return 0; } //! Writes a value of type INT. /*! This function is called for every value objects of INT type. This function uses the \n snprintf function to get the US-ASCII representation of the integer and simply copy it to the output stream. Returns -1 on stream errors or ZERO if no errors. */ int wxJSONWriter::WriteIntValue(wxOutputStream& os, const wxJSONValue& value) { int r = 0; char buffer[32]; // need to store 64-bits integers (max 20 digits) size_t len; wxJSONRefData* data = value.GetRefData(); wxASSERT(data); #if defined(wxJSON_64BIT_INT) #if wxCHECK_VERSION(2, 9, 0) || !defined(wxJSON_USE_UNICODE) // this is fine for wxW 2.9 and for wxW 2.8 ANSI snprintf(buffer, sizeof buffer, "%" wxLongLongFmtSpec "d", data->m_value.m_valInt64); #else // this is for wxW 2.8 Unicode: in order to use the cross-platform // format specifier, we use the wxString's sprintf() function and then // convert to UTF-8 before writing to the stream wxString s; s.Printf(_T("%") wxLongLongFmtSpec _T("d"), data->m_value.m_valInt64); wxCharBuffer cb = s.ToUTF8(); const char* cbData = cb.data(); len = strlen(cbData); wxASSERT(len < 32); memcpy(buffer, cbData, len); buffer[len] = 0; #endif #else snprintf(buffer, sizeof buffer, "%ld", data->m_value.m_valLong); #endif len = strlen(buffer); os.Write(buffer, len); if (os.GetLastError() != wxSTREAM_NO_ERROR) { r = -1; } return r; } //! Writes a value of type UNSIGNED INT. /*! This function is called for every value objects of UINT type. This function uses the \n snprintf function to get the US-ASCII representation of the integer and simply copy it to the output stream. The function prepends a \b plus \b sign if the \c wxJSONWRITER_RECOGNIZE_UNSIGNED flag is set in the \c m_flags data member. Returns -1 on stream errors or ZERO if no errors. */ int wxJSONWriter::WriteUIntValue(wxOutputStream& os, const wxJSONValue& value) { int r = 0; size_t len; // prepend a plus sign if the style specifies that unsigned integers // have to be recognized by the JSON reader if (m_style & wxJSONWRITER_RECOGNIZE_UNSIGNED) { os.PutC('+'); } char buffer[32]; // need to store 64-bits integers (max 20 digits) wxJSONRefData* data = value.GetRefData(); wxASSERT(data); #if defined(wxJSON_64BIT_INT) #if wxCHECK_VERSION(2, 9, 0) || !defined(wxJSON_USE_UNICODE) // this is fine for wxW 2.9 and for wxW 2.8 ANSI snprintf(buffer, sizeof buffer, "%" wxLongLongFmtSpec "u", data->m_value.m_valUInt64); #else // this is for wxW 2.8 Unicode: in order to use the cross-platform // format specifier, we use the wxString's sprintf() function and then // convert to UTF-8 before writing to the stream wxString s; s.Printf(_T("%") wxLongLongFmtSpec _T("u"), data->m_value.m_valInt64); wxCharBuffer cb = s.ToUTF8(); const char* cbData = cb.data(); len = strlen(cbData); wxASSERT(len < 32); memcpy(buffer, cbData, len); buffer[len] = 0; #endif #else snprintf(buffer, sizeof buffer, "%lu", data->m_value.m_valULong); #endif len = strlen(buffer); os.Write(buffer, len); if (os.GetLastError() != wxSTREAM_NO_ERROR) { r = -1; } return r; } //! Writes a value of type DOUBLE. /*! This function is called for every value objects of DOUBLE type. This function uses the \n snprintf function to get the US-ASCII representation of the integer and simply copy it to the output stream. Returns -1 on stream errors or ZERO if no errors. Note that writing a double to a decimal ASCII representation could lay to unexpected results depending on the format string used in the conversion. See SetDoubleFmtString for details. */ int wxJSONWriter::WriteDoubleValue(wxOutputStream& os, const wxJSONValue& value) { int r = 0; char buffer[32]; wxJSONRefData* data = value.GetRefData(); wxASSERT(data); snprintf(buffer, sizeof buffer, m_fmt, data->m_value.m_valDouble); size_t len = strlen(buffer); os.Write(buffer, len); if (os.GetLastError() != wxSTREAM_NO_ERROR) { r = -1; } return r; } //! Writes a value of type BOOL. /*! This function is called for every value objects of BOOL type. This function prints the literals \b true or \b false depending on the value in \c value. Returns -1 on stream errors or ZERO if no errors. */ int wxJSONWriter::WriteBoolValue(wxOutputStream& os, const wxJSONValue& value) { int r = 0; const char* f = "false"; const char* t = "true"; wxJSONRefData* data = value.GetRefData(); wxASSERT(data); const char* c = f; // defaults to FALSE if (data->m_value.m_valBool) { c = t; } size_t len = strlen(c); os.Write(c, len); if (os.GetLastError() != wxSTREAM_NO_ERROR) { r = -1; } return r; } //! Write the key of a key/value element to the output stream. int wxJSONWriter::WriteKey(wxOutputStream& os, const wxString& key) { #if defined(JSONDEBUG) wxLogTrace(writerTraceMask, _T("(%s) key write=%s"), __PRETTY_FUNCTION__, key.c_str()); #endif int lastChar = WriteStringValue(os, key); os.Write(" : ", 3); return lastChar; } //! Write the invalid JSON value to the output stream. /*! An invalid wxJSONValue is a value that was not initialized and it is an error. You should never write invalid values to JSON text because the output is not valid JSON text. Note that the NULL value is a legal JSON text and it is written: \code null \endcode This function writes a non-JSON text to the output stream: \code \endcode In debug mode, the function always fails with an wxFAIL_MSG failure. */ int wxJSONWriter::WriteInvalid(wxOutputStream& os) { wxFAIL_MSG(_T("wxJSONWriter::WriteInvalid() cannot be called (not a valid JSON text")); int lastChar = 0; os.Write("", 9); return lastChar; } //! Write a JSON value of type \e memory \e buffer /*! The type wxJSONTYPE_MEMORYBUFF is a \b wxJSON extension that is not correctly read by other JSON implementations. By default, the function writes such a type as an array of INTs as follows: \code [ 0,32,45,255,6,...] \endcode If the writer object was constructed using the \c wxJSONWRITER_MEMORYBUFF flag, then the output is much more compact and recognized by the \b wxJSON reader as a memory buffer type: \code '00203FFF06..' \endcode */ int wxJSONWriter::WriteMemoryBuff(wxOutputStream& os, const wxMemoryBuffer& buff) { #define MAX_BYTES_PER_ROW 20 char str[16]; // if STYLED and SPLIT_STRING flags are set, the function writes 20 bytes on every row // the following is the counter of bytes written. // the string is split only for the special meory buffer type, not for array of INTs int bytesWritten = 0; bool splitString = false; if ((m_style & wxJSONWRITER_STYLED) && (m_style & wxJSONWRITER_SPLIT_STRING)) { splitString = true; } size_t buffLen = buff.GetDataLen(); unsigned char* ptr = (unsigned char*) buff.GetData(); wxASSERT(ptr); char openChar = '\''; char closeChar = '\''; bool asArray = false; if ((m_style & wxJSONWRITER_MEMORYBUFF) == 0) { // if the special flag is not specified, write as an array of INTs openChar = '['; closeChar = ']'; asArray = true; } // write the open character os.PutC(openChar); for (size_t i = 0; i < buffLen; i++) { unsigned char c = *ptr; ++ptr; if (asArray) { snprintf(str, sizeof(str) - 2, "%d", c); size_t len = strlen(str); wxASSERT(len <= 3); wxASSERT(len >= 1); str[len] = ','; // do not write the comma char for the last element if (i < buffLen - 1) { ++len; } os.Write(str, len); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } } else { // now convert the byte in two hex digits char c1 = c / 16; char c2 = c % 16; c1 += '0'; c2 += '0'; if (c1 > '9') { c1 += 7; } if (c2 > '9') { c2 += 7; } os.PutC(c1); os.PutC(c2); if (os.GetLastError() != wxSTREAM_NO_ERROR) { return -1; } if (splitString) { ++bytesWritten; } if ((bytesWritten >= MAX_BYTES_PER_ROW) && ((buffLen - i) >= 5)) { // split the string if we wrote 20 bytes, but only is we have to // write at least 5 bytes os.Write("\'\n", 2); int lastChar = WriteIndent(os, m_level + 2); // write indentation os.PutC('\''); // reopen quotes if (lastChar < 0) { return lastChar; } bytesWritten = 0; } } } // write the close character os.PutC(closeChar); return closeChar; } //! Writes the separator between values /*! The function is called when a value has been written to the JSON text output and it writes the separator character: LF. The LF char is actually written only if the wxJSONWRITER_STYLED flag is specified and wxJSONWRITER_NO_LINEFEEDS is not set. Returns the last character written which is LF itself or -1 in case of errors. Note that LF is returned even if the character is not actually written. */ int wxJSONWriter::WriteSeparator(wxOutputStream& os) { int lastChar = '\n'; if ((m_style & wxJSONWRITER_STYLED) && !(m_style & wxJSONWRITER_NO_LINEFEEDS)) { os.PutC('\n'); } return lastChar; } //! Returns TRUE if the character is a space character. bool wxJSONWriter::IsSpace(wxChar ch) { bool r = false; switch (ch) { case ' ' : case '\t' : case '\r' : case '\f' : case '\n' : r = true; break; default : break; } return r; } //! Returns TRUE if the character if a puctuation character bool wxJSONWriter::IsPunctuation(wxChar ch) { bool r = false; switch (ch) { case '.' : case ',' : case ';' : case ':' : case '!' : case '?' : r = true; break; default : break; } return r; } /* { } */ tqsl-2.8.1/apps/jsonwriter.h0000755000175000017500000000741315003421124016025 0ustar rmurphyrmurphy///////////////////////////////////////////////////////////////////////////// // Name: jsonwriter.h // Purpose: the generator of JSON text from a JSON value // Author: Luciano Cattani // Created: 2007/09/15 // RCS-ID: $Id: jsonwriter.h,v 1.4 2008/03/03 19:05:45 luccat Exp $ // Copyright: (c) 2007 Luciano Cattani // Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #if !defined(_WX_JSONWRITER_H) #define _WX_JSONWRITER_H #ifdef __GNUG_ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma interface "jsonwriter.h" #pragma clang diagnostic pop #endif // For compilers that support precompilation, includes "wx/wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWidgets headers) #ifndef WX_PRECOMP #include #include #endif #include #include "json_defs.h" #include "jsonval.h" enum { wxJSONWRITER_NONE = 0, wxJSONWRITER_STYLED = 1, wxJSONWRITER_WRITE_COMMENTS = 2, wxJSONWRITER_COMMENTS_BEFORE = 4, wxJSONWRITER_COMMENTS_AFTER = 8, wxJSONWRITER_SPLIT_STRING = 16, wxJSONWRITER_NO_LINEFEEDS = 32, wxJSONWRITER_ESCAPE_SOLIDUS = 64, wxJSONWRITER_MULTILINE_STRING = 128, wxJSONWRITER_RECOGNIZE_UNSIGNED = 256, wxJSONWRITER_TAB_INDENT = 512, wxJSONWRITER_NO_INDENTATION = 1024, wxJSONWRITER_NOUTF8_STREAM = 2048, wxJSONWRITER_MEMORYBUFF = 4096 }; // class declaration class WXDLLIMPEXP_JSON wxJSONWriter { public: explicit wxJSONWriter(int style = wxJSONWRITER_STYLED, int indent = 0, int step = 3); ~wxJSONWriter(); void Write(const wxJSONValue& value, wxString& str); void Write(const wxJSONValue& value, wxOutputStream& os); void SetDoubleFmtString(const char* fmt); protected: int DoWrite(wxOutputStream& os, const wxJSONValue& value, const wxString* key, bool comma); int WriteIndent(wxOutputStream& os); int WriteIndent(wxOutputStream& os, int num); bool IsSpace(wxChar ch); bool IsPunctuation(wxChar ch); int WriteString(wxOutputStream& os, const wxString& str); int WriteStringValue(wxOutputStream& os, const wxString& str); int WriteNullValue(wxOutputStream& os); int WriteIntValue(wxOutputStream& os, const wxJSONValue& v); int WriteUIntValue(wxOutputStream& os, const wxJSONValue& v); int WriteBoolValue(wxOutputStream& os, const wxJSONValue& v); int WriteDoubleValue(wxOutputStream& os, const wxJSONValue& v); int WriteMemoryBuff(wxOutputStream& os, const wxMemoryBuffer& buff); int WriteInvalid(wxOutputStream& os); int WriteSeparator(wxOutputStream& os); int WriteKey(wxOutputStream& os, const wxString& key); int WriteComment(wxOutputStream& os, const wxJSONValue& value, bool indent); int WriteError(const wxString& err); private: //! The style flag is a combination of wxJSONWRITER_(something) constants. int m_style; //! The initial indentation value, in number of spaces. int m_indent; //! The indentation increment, in number of spaces. int m_step; //! JSON value objects can be nested; this is the level of annidation (used internally). int m_level; // The line number when printing JSON text output (not yet used) int m_lineNo; // The column number when printing JSON text output int m_colNo; // Flag used in ANSI mode that controls UTF-8 conversion bool m_noUtf8; // The format string for printing doubles char* m_fmt; }; #endif // not defined _WX_JSONWRITER_H tqsl-2.8.1/apps/key-new.xpm0000644000175000017500000000503115003421124015542 0ustar rmurphyrmurphy/* XPM */ static const char * key_xpm[] = { "16 16 122 2", " c None", ". c #670003", "+ c #650003", "@ c #5C0202", "# c #6F0001", "$ c #DBBB83", "% c #C2A774", "& c #AC936C", "* c #B09772", "= c #8D7356", "- c #C2A67C", "; c #640002", "> c #950004", ", c #7E0001", "' c #810306", ") c #C7A873", "! c #D1B17A", "~ c #B79865", "{ c #AA936B", "] c #C2A67E", "^ c #840003", "/ c #6E0002", "( c #500000", "_ c #980307", ": c #B8966A", "< c #BCA371", "[ c #B6996D", "} c #AF966C", "| c #786A52", "1 c #A18C6B", "2 c #7C0002", "3 c #7E0002", "4 c #6A0003", "5 c #950102", "6 c #988262", "7 c #C3A56C", "8 c #A4885F", "9 c #BEA070", "0 c #C1A36F", "a c #A89063", "b c #BDA378", "c c #7D6F58", "d c #920104", "e c #850304", "f c #3C0000", "g c #A28258", "h c #BB8C5A", "i c #BAA06D", "j c #A58A60", "k c #C3A677", "l c #AB9165", "m c #796850", "n c #430002", "o c #7D0002", "p c #830203", "q c #71493B", "r c #8C291E", "s c #8B3123", "t c #A0412C", "u c #AB9468", "v c #AE8F64", "w c #BFA370", "x c #D7B57B", "y c #B2976C", "z c #4F0000", "A c #813C32", "B c #8E3128", "C c #8C1D16", "D c #BC9F6C", "E c #A16F4C", "F c #BFA06E", "G c #A48960", "H c #8C7558", "I c #B7986A", "J c #90795B", "K c #CBBE93", "L c #B96D55", "M c #830000", "N c #980D0A", "O c #A25B40", "P c #605642", "Q c #CAAB7F", "R c #CDB18B", "S c #B5996B", "T c #976446", "U c #6B0104", "V c #810000", "W c #B69E73", "X c #BFA57F", "Y c #A38E61", "Z c #BC5E3D", "` c #653329", " . c #530606", ".. c #7F0406", "+. c #740305", "@. c #590002", "#. c #AC9068", "$. c #BBA17A", "%. c #9E8156", "&. c #C0A170", "*. c #502C26", "=. c #3F0000", "-. c #510303", ";. c #8C0002", ">. c #9F845F", ",. c #AE976F", "'. c #987D53", "). c #B59462", "!. c #6C0002", "~. c #907858", "{. c #A68E6B", "]. c #90754C", "^. c #B39466", "/. c #7F0003", "(. c #A5906D", "_. c #8E7247", ":. c #B19164", "<. c #8B0003", "[. c #7B6647", "}. c #9B7F55", "|. c #420002", "1. c #510002", " ", " . + @ # $ % & * = - ", " ; > , ' ) ! ~ { ] ", " ^ / ( _ : < [ } | 1 ", " 2 3 4 5 6 7 8 9 0 a b c ", " d e f g h i j 9 k l m ", " n o p q r s t u v w x y ", " z A B C D E F G H I J ", " K L M N O P ", " Q R S T U V ", " W X Y Z ` ... +.@. ", " #.$.%.&.*.=.-. ;./ ", " >.,.'.). ^ !. ", " ~.{.].^. /.+ ", " (._.:. <.3 ", " [.}. |.1. "}; tqsl-2.8.1/apps/key.ico0000644000175000017500000000706615003421124014733 0ustar rmurphyrmurphy &h( @*VRrvn>R.*nf2&>JjFz2z޺Vzb*&F fZNNB.6JFF^Njj.NVNBJ~~ZBBB~VN*F>^^^:VJj&N~*6*jFJ~zJ&::fF2>Fnn~::J.B^J>>>NN^RFFbN:>:bV6>VnzRR:V*ھRRZZ:JVºFn~>Jb2*."BNB^J6VVb>BVJR2JBfnF:>JJRZ^JBJzNrBJ2266:JFVb.bJNvBB 22NrvvJFR.:2N:6*FNbbVJFBF>FJF2RJ:VJNFvzJfB:>F FZFBFbjRJnnN>N""..F>>RFFVVZZbbJB**BNJNNJFʔPLO 7:Qf%ŧuоj%D@7~n^تb\o[a˖FJ.krcPΜ#_zb̘Bl!{TIAG4${0 v ;i,h#UwNΝem5} :j5b0 '3Z8*=mm/HXAW9MS +R])0-ppJM K(@2>>8]<_/.B(Y`X tqsl-2.8.1/apps/key.xpm0000644000175000017500000000427115003421124014760 0ustar rmurphyrmurphy/* XPM */ static const char * key_xpm[] = { "16 16 100 2", " c None", ". c #090902", "+ c #0E0A03", "@ c #000000", "# c #000100", "$ c #020202", "% c #010102", "& c #F5F563", "* c #F9F256", "= c #A79B37", "- c #9E9E3C", "; c #9F9A38", "> c #A1972E", ", c #33310B", "' c #000003", ") c #FBEF4C", "! c #FFFF61", "~ c #FDF251", "{ c #CCB439", "] c #C7C13D", "^ c #080702", "/ c #E7E050", "( c #FDFA50", "_ c #FFFF64", ": c #E6DE4C", "< c #C9A530", "[ c #AEA161", "} c #C5C13D", "| c #67682D", "1 c #ECE650", "2 c #DFD642", "3 c #EDDC47", "4 c #E3D742", "5 c #CDB332", "6 c #90902B", "7 c #C6C057", "8 c #CFBD59", "9 c #D7CE46", "0 c #D7D344", "a c #E1CB49", "b c #FFFF60", "c c #EAD848", "d c #AA8D2E", "e c #3C381E", "f c #FFFF7A", "g c #FFFF6F", "h c #E7DE50", "i c #ECEA52", "j c #DCD74D", "k c #F7E75A", "l c #FFFF68", "m c #E1D755", "n c #939241", "o c #FFFD6C", "p c #F8F26A", "q c #F8F46B", "r c #E0CD56", "s c #CBC356", "t c #A09445", "u c #D8C056", "v c #88863B", "w c #090906", "x c #9A913C", "y c #FFFF70", "z c #F0ED6D", "A c #A68F3F", "B c #544026", "C c #131010", "D c #050508", "E c #06070A", "F c #0B0A0A", "G c #0A0A05", "H c #867E36", "I c #ECEA6A", "J c #E9DE65", "K c #232017", "L c #1A1812", "M c #2E2D11", "N c #ECE166", "O c #FFFF76", "P c #EDE368", "Q c #282316", "R c #989543", "S c #FFFF78", "T c #E5DF65", "U c #232014", "V c #0C0D07", "W c #6B5825", "X c #FFFE73", "Y c #DED162", "Z c #1C190F", "` c #A49D48", " . c #FFFF77", ".. c #D5CB58", "+. c #140F0C", "@. c #040302", "#. c #D3D161", "$. c #BFB356", "%. c #0D080A", "&. c #070605", " . + @ # $ ", " % & * = - ; > , ", " ' ) ! ~ { ] ^ ", " @ / ( _ : < [ } @ ", " | 1 2 3 ! 4 5 6 ", " @ 7 8 9 0 a b c d @ ", " e f g h i j k l m ^ ", " n o p q r s t u v w ", " @ x y z A B C D E F ", " G H I J K L @ ", " M N O P Q @ ", " @ R S T U ", " V W X Y Z ", "@ ` ...+. ", "@.#.$.%. ", " w &. "}; tqsl-2.8.1/apps/lang/0000755000175000017500000000000015003421124014357 5ustar rmurphyrmurphytqsl-2.8.1/apps/lang/ca_ES/0000755000175000017500000000000015003421124015331 5ustar rmurphyrmurphytqsl-2.8.1/apps/lang/ca_ES/tqslapp.mo0000644000175000017500000024377015003421124017367 0ustar rmurphyrmurphy ,:::,::&;6;O;)l;0;;+;7<DF<<<<<<=.0=)_=V=G=(>=>X>_>;u> >>>$>? ?"?>?D?$J?o? ??<?#?%@'.@V@)h@D@$@@&A&+A7RA A A5AAA: BTGBBBB BBC C C'C/C7CC{C'C!C$CC& D3D%D0D6 EBDE EEEEE FF$FAFGFPFiaFF FF FFG"G1G KGUG oG zG GG'GGGVG?UH/H(HH+I#0I)TI~I I!I I=IJ%J9JPJ'dJJJ&JJKS*K ~KK4KK(K$L@L.M;3MAoM3M+M=NBONYNINF6OT}OOO#O'P59P oP}PP P P PPPPPPQ-3QaQ|QiQ Q Q R,RBRVReR@jR}R)S;SBSKSdS~SS(S#S(ST+;TgT<T!T'T/U(8U/aUU;UUUV!V1&VXVnV VVVVV,VW(W^%D^j^|^^^H^Q_IV_ _ _0_5_!`&&`M`U`Bd`U``a "a-aAarambccd|7ee eee(f@f^fnRh1i,iS j'tjjjj1j:k-Ak-ok-kkkk' l"2l$Ul!zll8mRAmPmNm4nKnan}nnnn nn+n'o*oDo _omosoooo o ooo ooooop@#pdpspp pppppq q;qcZqqIrPrmrprrrrs)s HsRs msxssBs8s t,t3tHthtyttt t t2tu5(uG^u_u=vcDvv"vRvT6w w wwww$wx4x&Jxqx xx xx x xxx#xyy!y3:yny6yyFyLz-fzdzxz7r|k|} }@}I}]}l}"}}}$}"}~)~$;~`~~~~~~&~I Wl>s   !'= eq#ƀ #(Cl$|*́-&F`y*.)܂&8Hfw+:(4!N#p…ޅ/K+g ÆΆֆ  (32I |(wЇ'HLpJ 0&G&n,+‰9\*+]_K\^6g%čD3',[}1(/0X.\u515)a#ɕ[awC5.y+4ԗ! +I avlu$Ew3b9DЛ8N^S=V[^1d6;͞+ 5L]]N% ,0]BzRܠC/s֡ݡ&,)KuTǣ ܣ&8Ǥ56<QƦs.EϨHhe&6_]<"0/N ~]A!?$aԮ+ :5Qp¯1 \<YDZ:! \gn ; в ڲ   +8Mu_մٴ4C>)>!(6JDVƶ<$R$w *7* gKP!#E#NNr ͹#׹84!<!^4ĺ ֺ"D/J,z.ֻ+_0{40D _ k?v&ݽ<V63!Ǿ " CMU@k/)< J+j2/.b=K*I!d%  $|7 !- MW v $5^%G?0 =3U:6 ()<Cf -+@l6^OfF2,2("[ ~N^R6FPR!ct_]8y*38^:( - 7*Cnt{%' c# 1Sq  &!0#Rv;39!R7t#F33K<*6/4dtC +3!_6"-%)S?}&#"D<23H:1lJ ;k6;@5[IU319e2"#*CDH>8;I:U<IS< <Q8 2:A ]~ly\ 9G;(CRYy I?{7+&!-;*i_72b!85F41{01)C4[-3- ba)a ",Oa|5+!@b , 3TVe1(Ir)9s#,)V^ y'(:c!r _K%e.&; Q_:n@MUUGy!m&iW x '&&"93Q    1Hb&yG,McMzcM,pz5U,] %%!.G*v,*!* L d " . B  , X@       #% 2I  |   ,   #" F 0e 2  / 8 I  i @ + % %C2X27 (D(^@K4D;2)4^ x&'//,_@" 5"Xn  (: .#Ae-lS8#'#K4oB>&'gfgfQ1)$W9aYM  (#!6L!3!g!">"4#(6#_#m$$C%%&C'&V'6}'>')''('E(/m(!(u(i5)s)1*E*Y*-+=+W+GE,>,,j,<-/0/6/;/XB/S/I/990s00~0b"1-191#1N2"`2[2L2,3=3 V3a3$3 3333,3#43:4n4'4%4f4;55 66 16<6B626/7A672x7'7*778|9Q:*;G;;G<f =s=2|>p>A ?'b?0?:?A?h8A;A&A;B@B `BBB$B9B1CQHCC{DAEx[E%E E`FH|F FFF F>G BG MGZG]G-dGGGGGGG: j`8tcI%c-r~\,AVjCH9Y-'9Bm<{")?3 ^W&' +D\._s>+W58&VwgJK}@kN;(OZs0yn R9MYHX)$RrG;NU]l\|Pm$ohwIBVFq*Sz=!U^<xGFj/Fyf b2a< =d7G ota_~~2x| p %4IBn8+rYlQPS*g7'L| DeLvc K2N/7 okv@ p nK3:aMh!z#dJ{A{m}e1QzkOs[XP"puu>,g]wbMWulLC}56#E;"fqv],?Ri6Z1-_)6%OTxU$=E@`fd[`hiq^ J4b#A5:>(!Q0E TiHX&S1CZ/ e[4 D?(T.3*.0ty to %d QSO Records%d of %d QSOs are previously signed; aborted%s Uploaded with result: %s%s is ready to be emailed or uploaded.%s uploaded successfully%s uploaded with result: %s%s: %d QSO records were previously signed%s: %d QSOs were outside the selected date range%s: %s upload was rejected%s: %s upload was rejected with result "%s"%s: Couldn't upload the file: CURL returned "%hs" (%hs)%s: Got an unexpected response on %s upload! Maybe the site is down?%s: Invalid Grid Field%s: Invalid Grid Square%s: Invalid Grid Sub-subsquare%s: Invalid Grid Subsquare%s: Invalid Gridsquare Format%s: Log uploaded successfully%s: Log uploaded successfully with result: %s%s: Unable to connect to the upload site.%s: Unable to upload - either your Internet connection is down or LoTW is unreachable.%s: Unable to upload. The network is down or the LoTW site is too busy.%s: Upload cancelled%s: wrote %d records to %s&About&Add Station Location&Backup Station Locations, Certificates, and Preferences...&Contents&Delete&Delete Callsign Certificate&Display Station Location Properties&Edit&Edit Station Location&Edit existing ADIF file...&File&Help&Load Callsign Certificate from File&Preferences...&Properties&Renew Callsign Certificate&Restore Station Locations, Certificates, and Preferences...&Restore a Deleted Station Location&Save Callsign Certificate to File...&Sign and save ADIF or Cabrillo file...&Station Location&Test Signing an ADIF or Cabrillo file...'Satellite' propagation mode selected, so a Satellite must be chosen'Save Callsign Certificate' command.A new TQSL release (V%s) is available!A new TQSL release (V%s) is available.A new TrustedQSL configuration file (V%s) is available.ADIF Mode:ADIF ModesADIF content is not valid. '%hs' is not valid for %hsADIF field has invalid contentsADIF file extensions:ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*.*)|*.*Aborting due to user cancellingAboutActive, usable certificatesAdd ADIF modeAdd ADIF mode mapping:Add QSOAdd Station LocationAdd...AddressAdministrator ErrorAfter reading this message, you may close this program.AlertAll QSOs are previously signed; abortedAllow TQSL to continue this time.Allow automatic configuration backupAllow nonamateur call signsAlways allow running as Administrator.An updated TrustedQSL configuration file (V%s) is available! The configuration file installs definitions for entities, modes, etc.Another copy of TQSL is signing a logAre you sure you want to delete the certificate?Are you sure you want to delete this station location?Are you sure you want to proceed? Click 'No' to review the choicesAre you sure?Attempting to upload %d QSOsAttempting to upload %sAttempting to upload one QSOAwaiting response from ARRLBackup ErrorBackup File Folder:Backup operation failed: %hsBand:Begins: Buffer too smallCAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause issues with handling awards.CONTESTCONTEST Name:CQ ZoneCQ Zone: Cabrillo CONTESTCabrillo CONTEST definitions:Cabrillo SpecsCabrillo file extensions:Call SignCall Sign cannot be emptyCall Sign:Call sign:Call sign: Call-Worked Field Number:Call-worked field must be %d or greaterCallsign &CertificateCallsign CertificateCallsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6Callsign Certificate does not match QSO detailsCallsign Certificate not TQSL compatibleCallsign CertificatesCallsign certificate could not be installedCan't open TQSL update file %s: %hsCan't open new configuration file %s: %hsCancelCancelledCertificate Authority certificateCertificate Container PassphraseCertificate Container files (*.p12)|*.p12|All files (*.*)|*.*Certificate ExpiringCertificate Issuer:Certificate PropertiesCertificate RequestCertificate not initialized for signingCertificate provider not foundCertificate saved in file %sCertificates replaced with a newer oneCertificates that have expiredChanges have not been savedChanges to the status message configuration will take affect when TQSL is restartedCheck ErrorCheck for &Updates...Check for updates to tqsl and the configuration fileChecking for TQSL updates...Choose a Callsign Certificate to restoreChoose a Station Location to restoreChoosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'CityClick 'Cancel' if this is not the correct Station Location.Click 'Cancel' to abandon processing this log file (Recommended).Click 'Cancel' to abandon processing this log file.Click 'Cancel' to abandon signing this log.Click 'Finish' to complete this Callsign Certificate request.Click 'Ignore' to continue signing this log while ignoring errors.Click 'New QSOs Only' to sign normally, without the previously signed QSOs (Recommended).Click 'OK' to install the new configuration file, or Cancel to ignore it.Click 'OK' to install the new version of TQSL, or Cancel to ignore it.Click 'Re-Upload QSOs' to re-process this log while allowing previously signed QSOs.CloseCommand Syntax ErrorConfiguration file cannot be openedConfiguration file successfully updatedConfiguration files (*.tbk)|*.tbk|All files (*.*)|*.*Confirm CloseContestContest name cannot be blankContest typeContinentConverting Could not spawn upload thread!CountryCountyCounty: Create &New ADIF file...Create a new Station LocationCreate an ADIF file for signing and uploadingCustom ADIF mode mappings:DELETEDDO NOT lose the passphrase you choose! You will be unable to use the Certificate without this passphrase!DXCC EntityDXCC Entity: DXCC entity:Data for this DXCC entity could not be foundDatabase Error: %hsDatabase errorDateDate of the first QSO you made or will make using this callsign:Date of the last QSO you made or will make using this callsign: (Leave this date blank if this is still your valid callsign.)Date out of rangeDeleteDelete "Delete Station Location Delete a Station LocationDia&gnostic ModeDisplay &DocumentationDisplay Callsign Certificate &PropertiesDisplay Station Location PropertiesDisplay Station Location Properties for Display a Callsign CertificateDisplay a Callsign Certificate's PropertiesDisplay command line helpDisplay details of previously signed QSOs when signing a logDisplay or Modify &Preferences...Display status messages in separate tabDisplay the Callsign Certificate properties forDisplay the version information and exitDo you really want to keep this 'QSO end date'?Do you want to renew it now?Do you want to upload this certificate request to LoTW now?Download from:Duplicate QSO detectedE&xit TQSL Alt-XEditEdit (if used with -l) or create Station LocationEdit Station LocationEdit Station Location Edit Station Location : %hs - %sEdit a Station LocationEdit...Email: Enable a Network ProxyEnable passphrases for Callsign CertificatesEnd Date (YYYY-MM-DD)End date is invalidEnd date of %s is invalidEnter a name for this Station LocationEnter a passphrase for this callsign certificate.Enter again to confirm:Enter file to save toEnter new passphraseEnter passphraseEnter the Passphrase to unlock the callsign certificateEnter the name for the new Certificate Container fileEnter the passphrase again for verification:Enter the passphrase for the certificate container file.Enter the passphrase to unlock the .p12 file:Enter the passphrase to unlock the callsign certificate for %hs -- %hs (This is the passphrase you made up when you installed the callsign certificate.)ErrorError checking for expired callsign certificates:Error compressing before uploadError creating Callsign Certificate RequestError creating callsign certificate request: %hsError downloading new configuration file:Error downloading new file:Error downloading new version information:Error downloading update version information:Error importing station locations: %hsError opening certificate request file %s: %hsError opening diagnostic log %s: %hsError opening input fileError opening output fileError opening save file %s: %hsError parsing certificate for DXCC entityError parsing certificate for call signError parsing certificate for issuerError parsing saved configuration file: %hsError parsing station location file: %hsError performing automatic backup: %hsError renaming backup file %s: %hsError while accessing certificate storeError writing new configuration file %s: %hsError: Could not upload file (CURL Init error)Errors DetectedErrors: %dExit TQSL so I can re-run as a normal userExit after processing log (otherwise start normally)Expected nameExpiredExpires: Export P12 files compatible with Apple KeychainExport to %s failed: %hsFieldFile name for diagnostic tracking logFile syntax errorFile syntax error: %hsFinal Status: %hs (%d)Frequency (MHz):Grid %s is not correct for your %s. Click 'Next' again to use it anyway.Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it anyway.Grid %s is not correct for your QTH. Click 'Next' again to use it anyway.Grid SquareGrid Square: Gridsquare is inconsistent with Station LocationHandle QTH information in ADIF logs with what action?HelpI am the QSL manager for this callsignIOTA IDIOTA Locator: IOTA reference %s is not correct. Must have a number after the '-'IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, OC- or SA-IOTA value %s is not valid.ITU ZoneITU Zone: If so, choose a callsign below for the primary LoTW account. If not, click 'Finish', and a new LoTW account will be set up for these QSOs.If you are planning to restore from a backup, please choose 'No'.If you are sure that the earlier request is now invalid you should delete the pending Callsign Certificate for %s.If you are using a US callsign outside of the US persuant to CEPT, IARP or other Reciprocity arrangements, FCC rules require you to be a US Citizen.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence no passphrase need be specified.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence, no passphrase need be specified.If you set an end date, you will not be able to sign QSOs past that date, even if the Callsign Certificate itself is still valid.If you still hold this callsign (or if you plan to renew the license for the callsign), you should not set a 'QSO end date'.IgnoreIgnore QTH details from your logIgnore callsigns in ADIF filesIgnore seconds in QSO timesImport a certificate file (.p12 or .tq6)Import completed successfullyIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is recommended, but a logger that does its own upload tracking may incorrectly set the status in this case. A logger that doesn't track uploads should be unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, will correctly mark all selected QSOs as sent - they are in your account even though they would not be in this specific batchIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'Incomplete Certificates - requires a matching TQ6Incorrect passphrase when importing P12 fileIncorrect settings can cause TQSL to be unable to upload logs or check for updates.Input ADIF or Cabrillo log file to signInstall CertificateInvalid %hs: "%hs"Invalid argumentInvalid contact - QSO does not specify a CallsignInvalid contact - QSO does not specify a band or frequencyInvalid contact - QSO does not specify a dateInvalid contact - QSO does not specify a modeInvalid contact - QSO does not specify a timeInvalid date formatInvalid error code: %dInvalid time formatInvalid zone selections for DXCC entityInvalid zone selections for oblastInvalid zone selections for provinceInvalid zone selections for stateIs this new certificate for a callsign where you already have a LoTW account, and you want the QSOs for this call to be added to an existing LoTW account? LanguageLeave the passphrase blank and click 'Finish' unless you want to use a passphrase.Leave the passphrase blank and click 'Next' unless you want to use a passphrase.Leave the passphrase blank and click 'OK' unless you want to use a passphrase.LoTW Connection FailedLoad Certificate FileLoad a Callsign CertificateLoading completeLocation data errorLog FileLog File ErrorLog HandlingLog OperationsLog files (*.log)|*.log|All files (*.*)|*.*Log in to the Logbook of the World SiteMemory allocation failureMissing from this computerMode ConflictMode:More details at:NO ERRORNONENameName existsNetwork ProxyNew DBNew PassphraseNew QSOs OnlyNew passphraseNew passphrase:New...No Callsign CertificatesNo CertificateNo Certificate Request matches the selected Callsign CertificateNo Private KeyNo QSO recordsNo QSOs to uploadNo UpdatesNo callsign certificate for keyNo logfile to sign!No records outputNo status information availableNoneNone of these applyNote: TQSL assumes that this file will be uploaded to LoTW.Note: TQSL has not recorded signing these QSOs. You can submit this log file to LoTW or discard it.Note: The e-mail address you provide here is the address to which the issued Certificate will be sent. Make sure it's the correct address!NoticeNumber of Backups to retain:OKOK to install OblastOblast: Once you supply the requested information and the request file has been created, you must send the request file to the certificate issuer.One QSO RecordOpen ADIF files in ADIF editorOpen FileOperator aborted operationOperator: OptionsOrganization: Output file name (defaults to input name minus extension plus .tq8Override Station Location with QTH details from your logPKCS#12 file not TQSL compatiblePark: Passphrase confirmedPassphrase entries do not matchPassphrase errorPassphrase for the signing keyPassphrase not correctPassphrase protectedPassphrase:Passphrase: Please choose a callsign for this Station LocationPlease choose language:Please install a callsign certificate then try again.Please review the introductory documentation before using this program.Please select a Callsign Certificate for the account where you would like the QSOs to be storedPlease select a Callsign Certificate to validate this requestPlease select the Callsign Certificate for your current personal callsign to validate your request.Please try again later.Please try uploading the %s later.Please verify that this is the correct Station Location for the QSOs being signed.Please wait until you receive an e-mail bearing your requested Callsign Certificate.Port Number:PreferencesPreviously Signed QSO detectedPreviously Signed QSOs DetectedPreviously Signed: %dPreviously signed QSOs were detectedPreviously signed: %dPrivate Key not foundPrompt for QSO Date range when signingPropagation Mode:PropertiesProvinceProvince: Proxy Address:Proxy Type:ProxyTypeQSO DataQSO Data ErrorQSO Data: Invalid Mode ignored - %sQSO Date RangeQSO End Date: QSO Frequency is invalidQSO Frequency is out of range for the selected bandQSO RX Frequency is invalidQSO RX Frequency is out of range for the selected bandQSO Start Date: QSO begin date: You must choose proper values for Year, Month and Day.QSO date is not within the date range specified on your Callsign CertificateQSO end date cannot be before QSO begin date.QSO end date: You must either choose proper values for Year, Month and Day or leave all three blank.QSO records signed using the Certificate will not be valid for DXCC award credit (but will be valid for other applicable awards). If the Certificate is to be used for signing QSOs from maritime/marine mobile, shipboard, or air mobile operations, that is the correct selection. Otherwise, you probably should use the "Back" button to return to the DXCC page after clicking "OK"QSOs for %hs will be stored in the LoTW account for %s.QSOs prior to the starting date or after the ending date will not be signed or included in the output file.QSOs: %dQuiet Mode - same behavior as -xRX Band:RX Frequency (MHz):Re-Upload QSOsRenew a Callsign CertificateRenew the Callsign Certificate forReplacedReport on QTH differencesRequest &New Callsign Certificate...Request a new Callsign CertificateRequest cancelledRestore Complete.Restore Deleted Callsign CertificateRestore operation failed: %hsRestoring Callsign CertificatesRestoring PreferencesRestoring QSO recordsRestoring Station LocationsRestoring callsign certificate for %hsResubmitting these QSOs will cause them to be reported as already signed.Resulting TQSL mode:Retry?Satellite choice requires that Propagation Mode be 'Satellite'Satellite:Save FileSave Station DataSave a Callsign CertificateSave operation complete.Save requestSave the Callsign Certificate forSaved configuration files (*.tbk)|*.tbkSaving QSOsSaving Station LocationsSaving TQSL PreferencesSaving callsign certificate for %hsSaving callsign certificatesSelect CallsignSelect Certificate FileSelect Station DataSelect Station Location for SigningSelect a Callsign Certificate to processSelect a FolderSelect a Station Location to processSelect a Station Location to process Select file to SignSelect file to write toSelect or enter name of this station locationSelect saved configuration fileSelected Station LocationSelects Station LocationSerial: Sign a log and save it for uploading laterSign a log and upload it automatically to LoTWSign and &upload ADIF or Cabrillo File...Signing File: Signing QSO DataSigning abandonedSigning abortedSigning aborted due to errorsSigning aborted.Signing cancelledSigning using Callsign %hs, DXCC Entity %hsSince you have no Callsign Certificates, you must submit an 'Unsigned' certificate request. This will allow you to create your initial Callsign Certificate for LoTW use. Click 'Finish' to complete this Callsign Certificate request.Some QSOs not processedSpecify QSO verification action - ignore, report or updateSpecify default callsign for log signingSpecify dialog action - abort, all, compliant or askSpecify end date for QSOs to signSpecify start date for QSOs to signStart Date (YYYY-MM-DD)Start date is invalidStart date of %s is invalidStateState: Station Data input completeStation LocationStation Location NameStation Location PropertiesStation Location data errorStation Location does not match QSO detailsStation LocationsStation name must be providedStatus LogSuccessSuppress date range dialogSystem error: %hsSystem error: %hs : %hsTQSL ConfirmTQSL ErrorTQSL Update AvailableTQSL Version %hs and Configuration Data Version %sTQSL WarningTQSL compressed data files (*.tq8)|*.tq8TQSL data files (*.tq7)|*.tq7TQSL is unable to sign QSOs because another instance of TQSL is busy. Terminate any other copies of TQSL and try again.TQSL must not be run 'As Administrator'TQSL must wait for other running copies of TQSL to exit before backing up...TQSL must wait for other running copies of TQSL to exit before signing ...TQSLLib ErrorThe %s '%hs' has value '%hs' while QSO has '%hs'The -a parameter %hs is not recognizedThe -f parameter %hs is not recognizedThe TQSL configuration file cannot be parsedThe TQSL upload tracking database is lockedThe callsign %s is not currently registered in the FCC ULS database. If this is a newly registered call, you must wait at least one business day for it to be valid. Please enter a currently valid callsign.The callsign certificate for callsign %hs has expired. This station location cannot be used to sign a log file until a valid callsign certificate is installed.The callsign is too long. Only %d characters are allowed.The certificate for %hs expires in %d daysThe certificate for %hs expires in %d days.The date of your first QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your first QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe file has not been saved. Should the QSOs be saved?The format of this file is incorrect.The invalid data was ignored.The log being signed has '%hs' set to value '%hs' which is not validThe log file you are uploading using your QSO Logging system consists entirely of previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The log file you are uploading using your QSO Logging system includes some previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The only reason to re-sign previously signed QSOs is if a previous upload was not processed by LoTW, either because it was never uploaded, or there was a server failureThe private key for callsign %hs serial %ld is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe private key for this Callsign Certificate is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe selected callsign could not be foundThe selected station location could not be foundThe two copies of the passphrase do not match.There are no callsign certificates for callsign %hs. This station location cannot be edited.There are no current callsign certificates for callsign %hs. This station location cannot be used to sign a log file.There are no deleted Callsign Certificates to restoreThere are no deleted Station Locations to restoreThere are no valid callsign certificates for callsignThere is a newer callsign certificate for callsign %hs. This station location cannot be used to sign a log file until the new certificate is installed.There is no valid callsign certificate for %hs in entity %hs available. This QSO cannot be signedThis Callsign Certificate cannot be installed as it has expired. Check if your computer is set to the proper date and that this is the latest Callsign Certificate. This Callsign Certificate cannot be installed as the first date where it is valid is in the future. Check if your computer is set to the proper date. This Callsign Certificate request requires approval using an existing Callsign Certificate.This address must match the FCC ULS database. If this address information is incorrect, please correct your FCC record.This callsign certificate is already active and cannot be restored.This callsign certificate is already installedThis callsign replaces my existing callsignThis file can not be processed due to a system errorThis file is not a valid P12 fileThis is a DXpedition callsignThis is a club callsignThis is a special event callsignThis is my former callsignThis log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and %d QSOs which are new.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and no new QSOs.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and one QSO which is new.This log has invalid QSO informationThis log has too many previously uploaded QSOs. Please only upload new QSOs or break the log into smaller pieces (50,000 QSOs or less).This mode definition conflicts with a standard mode definition for %sThis passphrase will have to be entered each time you use this callsign certificate for signing or when saving the key.This should be corrected before signing a log file.This will create a new Callsign Certificate request file.This will remove the selected callsign certificate from your system.This will remove this station location from your system.TimeTo import this passphrase protected P12 file, you must pass the passphrase on the command lineTo submit the signed log file to LoTW: 1. Move the signed log file to a computer with internet access 2. Log in to your LoTW Web Account 3. Select the Upload File tab 4. Click the Choose File button, and select the signed log file you created (%s) 5. Click the Upload file button Alternatively, you can attach the signed log file to an email message, and send the message to lotw-logs@arrl.orgTrusted root certificateTypeUPURL: US 1x1 callsign requests must provide an end dateUS 1x1 callsigns must end in letters A-Z excluding 'X'US 1x1 callsigns must have a number as the second characterUS 1x1 callsigns must start with W, K, or NUTC Date (YYYY-MM-DD):UTC Time (HHMM):Unable to check for updates - either your Internet connection is down or LoTW is unreachable.Unable to check for updates. The network is down or the LoTW site is too busy.Unable to connect to the update site.Unable to initialize random number generatorUnable to open %s for outputUnable to open ca-bundle.crt. Your TQSL installation is incompleteUnable to read - no permissionUnable to update - either your Internet connection is down or LoTW is unreachable.Unable to update. The network is down or the LoTW site is too busy.Undelete ErrorUnexpected LoTW ResponseUnknownUnknown custom errorUnusable: Missing Private KeyUpdateUpdate CompletedUploadUpload RejectedUpload after signing instead of savingUploading Callsign CertificateUploading Callsign Certificate Request...Uploading Signed DataUploading signed log data...Uploads database errorUse the "New" Button of the dialog you're about to see to define a Station Location.Use these settings to configure a network proxy for Internet uploads and downloads. You should only enable a proxy if directed by your network administrator.User CancelledValueVerify QTH details: WPX PrefixWarningWarning: The TQSL ADIF editor only processes a limited number of ADIF fields. Using the editor on an ADIF file can cause QSO details to be lost!What is this Callsign Certificate for?Wipe the TQSL uploads databaseWould you like to back up your callsign certificate now?Would you like to request a callsign certificate now?Wrote %d QSO records to %sYou WILL be able to recover it from a container (.p12) file,You cannot request a Callsign Certificate for a former callsign unless you hold a valid Callsign Certificate to be used to verify that request.You cannot request a certificate for a 1x1 callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot request a certificate for a portable callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot select DXCC Entity NONE as you must sign any request for entity NONE and you have no valid Callsign Certificates that you can use to sign this request.You do not need an account on LoTW to do this.You have already requested a Callsign Certificate for %s and can not request another until that request has been processed by LoTW Staff.You have already requested more than three Callsign Certificates for %s in the past 24 hours. You should submit a request only once, then wait for that request to be processed by LoTW Staff. This may take several business days.You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: You have changed the following fields in this Station Location: %s Do you want to discard those changes?You have chosen a QSO end date for this Callsign Certificate. The 'QSO end date' should ONLY be set if that date is the date when that callsign's license expired or the license was replaced by a new callsign.You have no Station Locations defined.You have no callsign certificate installed on this computer with which to sign log submissions.You have no callsign certificates to use to sign a log file.You have selected DXCC Entity NONEYou may leave either date (or both dates) blank.You may now send your new certificate request (You may protect this Callsign Certificate using a passphrase. If you are using a computer system that is shared with others, you should specify a passphrase to protect this Callsign Certificate. However, if you are using a computer in a private residence, no passphrase need be specified.You may set the starting and/or ending QSO dates in order to select QSOs from the input file.You must define at least one Station Location to use for signing.You must enter a valid call sign.You must enter a valid email addressYou must enter your addressYou must enter your cityYou must enter your nameYou must select a %hsYou must select a DXCC entity.You must select a band or enter a frequencyYou will NOT be able to recover it by loading a .TQ6 file.You will have to enter the passphrase any time you load the file into TrustedQSL.You will not be able to use this tq6 file to recover your callsign certificate if it gets lost. For security purposes, you should back up your certificate on removable media for safe-keeping.Your QTH Details changed for this QSO. Originally these were: %s Now they are:%s Please verify that you intended to change this QSO! Your certificate request did not upload properly.Your custom mode map %s conflicts with the standard mode definition for %hs and was deleted.Your e-mail addressYour system is up to dateYour upload appears to have failed. Do you want to save this request for uploading later?Your upload appears to have failed. Should TQSL try again?Zip/Postal[None]are the newest availablecertificate?if you have created one via the Callsign Certificate menu'sin entityon line %dor see:tQSL Cert Request files (*.to TQSL formatto:|ADIF files (|All files (|All files (*.*)|*.*|Cabrillo files (Project-Id-Version: TQSL v2.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2025-02-16 18:01-0500 PO-Revision-Date: 2025-02-17 15:54+0100 Last-Translator: Xavi Pérez, EA3W Language-Team: Language: ca_ES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.5 a %d Registres QSO%d de %d els QSO estan prèviament signats; avortats%s Penjat amb el resultat: %s%s està preparat per enviar-lo per correu electrònic o penjar-lo.%s s'ha carregat correctament%s penjat amb el resultat: %s%s: %d QSO que ja han pujat els registres%s: %d Els QSO estaven fora de l'interval de dates seleccionat%s: %s es va rebutjar la càrrega%s: %s es va rebutjar la càrrega amb el resultat "%s"%s: No s'ha pogut carregar el fitxer: s'ha retornat CURL "%hs" (%hs)%s: a obtingut una resposta inesperada %s pujat! Potser el lloc està fora de servei ?%s: Camp del locator no vàlid%s: Locator no vàlid%s: Subquadrat del locator no vàlid%s: Subquadrat del locator no vàlid%s: Format del locator no vàlid%s: S'ha carregat correctament el registre%s: Registre carregat correctament amb el resultat: %s%s: No es pot connectar al lloc de pujada.%s: No es pot carregar: la teva connexió a Internet s'ha reduït o el programa LoTW no hi pot accedir.%s: No es pot carregar La xarxa està ocupada o el lloc LoTW està massa ocupat.%s: S'ha cancel·lat la pujada%s: va escriure %d registres a %sQu&ant a&Afegeix la ubicació de l'estacióCòpies de seguretat d'U&bicacions d'estació, certificats i preferències ...&ContingutsEs&borrarEsborrar un certificat d'in&dicatiu&Visualitza les propietats de la ubicació de l'estació&Editar&Edita la ubicació de l'estació&Edita un fitxer ADIF existent...&FitxerA&judaCarregar e&l certificat d'indicatiu des de un fitxer&Preferències...&Propietats&Renovar un certificat d'indicatiu&Restaura les ubicacions d'estació, certificats i preferències ...&Restaura una ubicació suprimida de l'estacióDe&sar el certificat d'indicatiu a fitxer...Regi&stra i desa el fitxer ADIF o Cabrillo ...Ubicació de l'e&stació&Prova Signant un fitxer ADIF o Cabrillo...Has seleccionat el mode de propagació "Satèl·lit", de manera que has de triar un satèl·litComandament "Desa el certificat de l'indicatiu".Hi ha una nova versió TQSL (V%s) està disponible !Una nova versió de TQSL (V%s) està disponible.Hi ha disponible un nou fitxer de configuració de TrustedQSL (V%s).Mode ADIF :Modes ADIFEl contingut ADIF no és vàlid. '%hs' no és vàlid per a %hsEl fitxer ADIF té contingut no vàlidExtensions de fitxer ADIF :Fitxers ADIF (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*Fitxers ADIF (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*.*)|*.*Avortament a causa de la cancel·lació de l'usuariSobreCertificats actius i utilitzablesAfegir mode ADIFAfegir mode mapeig ADIF :Afegeix QSOAfegeix la ubicació de l'estacióAfegir...AdreçaError d'administradorDesprés de llegir aquest missatge, pots tancar aquest programa.AlertaTots els QSO estan signats prèviament; avortatPermet que TQSL continuï aquesta vegada.Permetre còpia de seguretat de la configuració automàticaPermetre indicatius no oficialsPermet sempre executar com a administrador.Un fitxer actualitzat de configuració TrustedQSL (V%s) està disponible ! El fitxer de configuració instal·la definicions per a entitats, modes, etc.Una altra còpia de TQSL està signant un registreEstàs segur que vols esborrar el certificat ?Estàs segur que vols esborrar aquesta ubicació d'estació ?Estàs segur de que vols continuar? Fes clic a "No" per revisar les opcionsEstàs segur ?S'està intentant pujar %d QSOS'està intentant pujar %sS'està intentant carregar un QSOEn espera de resposta de l'ARRLError en la còpia de seguretatCarpeta de les còpies de seguretat :Còpia de seguretat fallida: %hsBanda :Comença el : Buffer massa petitATENCIÓ: barrejar QSO per a indicatius no relacionats en un compte de LoTW pot causar problemes amb la gestió dels premis.CONCURSNom del CONCURS :Zona CQZona CQ : CONCURS CabrilloDefinicions de Cabrillo CONCURS :Especificacions CabrilloExtensions de fitxer Cabrillo :IndicatiuEl indicatiu no pot estar buitIndicatiu :Indicatiu :Indicatiu : Camp Indicatius treballats número :El camp Indicatius treballats ha de ser %d o superior&Certificat d'indicatiuCertificat d'indicatiuArxius contenidor de certificats d'indicatiu (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Arxius contenidor de certificats d'indicatiu (*.p12,*.tq6))|*.p12;*.tq6El certificat d'indicatiu no coincideix amb els detalls del QSOEl certificat d'indicatiu no compatible amb TQSLCertificats d'indicatiuNo s'ha pogut instal·lar el certificat d'indicatiuNo es pot obrir el fitxer d'actualització de TQSL %s: %hsNo es pot obrir el fitxer de configuració nou %s: %hsCancel·larCancel·latCertificat de l'autoritat del certificatContrasenya del contenidor del certificatContenidors de certificats (*.p12)|*.p12|Tots els fitxers (*.*)|*.*Certificat CaducatEmissor del certificat :Característiques del certificatSol·licitud de certificatNo s'ha inicialitzat el certificat per signarEl proveïdor de certificats no s'ha trobatCertificat desat al fitxer %sEls certificats s'han substituït per uns de més nousCertificats caducatsEls canvis no s'han desatLes modificacions de la configuració del missatge d'estat es veuran quan es reiniciï el TQSLComprovació d’errorBuscar act&ualitzacions...Comprova si hi ha actualitzacions de TQSL i el fitxer de configuracióS'està comprovant les actualitzacions de TQSL ...Tria un certificat d'indicatiu per recuperarTria una ubicació d'estació per a ser recuperadaL’elecció de “Cancel·lar” sol ser segura, però un registrador defectuós que no verifica els missatges d’estat reportats per TrustedQSL pot produir un comportament estrany (però inofensiu) com intentar carregar un fitxer buit o marcar tots els QSO escollits com a “enviats”.PoblacióFes clic a "Cancel·la" si aquesta no és la ubicació de l'estació correcta.Fes clic a "Cancel·la" per abandonar el processament d'aquest fitxer de registre (recomanat).Fes clic a "Cancel·la" per abandonar el processament d'aquest fitxer de registre.Fes clic a "Cancel·lar" per abandonar la signatura d'aquest registre.Fes clic a "Finalitzar" per completar la sol·licitud de certificat d'indicatiu.Fes clic a "Ignora" per continuar signant aquest registre tot ignorant els errors.Fes clic a "Només QSO nous" per signar normalment, sense els QSO signats anteriorment (recomanat).Fes clic a 'D'acord' per instal·lar el fitxer de configuració nou, o Anul·la per ignorar-lo.Fes clic a "D'acord" per instal·lar la nova versió de TQSL o bé "Anul·la" per ignorar-la.Fes clic a “Tornar a carregar els QSO” per tornar a processar aquest registre i permetre els QSO signats prèviament.TancaError de sintaxi de SCommandNo es pot obrir el fitxer de configuracióS'ha actualitzat correctament el fitxer de configuracióFitxers de configuració (*.tbk)|*.tbk|All files (*.*)|*.*Confirma que vols TancarConcursEl nom del concurs no pot estar en blancTipus de concursContinentConvertint No s'ha pogut generar el fil de càrrega !PaísComtatComarca o Comtat : Crea un &nou fitxer ADIF...Crea una ubicació de l'estació novaCrea un fitxer ADIF per signar i penjarPersonalitzar mapeig mode ADIF :ESBORRATNO perdis la contrasenya que triïs! No podràs utilitzar el certificat sense aquesta contrasenya !Entitat DXCCEntitat DXCC : Entitat DXCC :No s'ha pogut trobar dades d'aquesta entitat DXCCError de base de dades: %hsError de base de dadesDataData del primer QSO que has realitzat o realitzaràs mitjançant aquest indicatiu :Data de l'últim QSO que vas realitzar o que faràs mitjançant aquest indicatiu : (Deixa aquesta data en blanc si encara és el teu indicatiu vàlid.)Data fora d'intervalEsborraEsborra "Esborrar la ubicació d'estació Esborra una ubicació de l'estacióMode de dia&gnòsticVisualitza la &DocumentacióMostrar el certificat i propietats de signatura d'indicatiuVisualitza les propietats d'ubicació de l'estacióMostrar característiques de la ubicació d'estació per Mostrar un certificat d'indicatiuMostra les característiques del certificat d'indicatiuMostra l'ajuda a la línia d'ordresMostra els detalls dels QSO signats anteriorment en signar un registreVisualització o modificació de &Preferències ...Mostrar els missatges d'estat en una altra pestanyaMostrar les característiques del certificat d'indicatiu perMostra la informació de la versió i surtVols mantenir aquesta "data de finalització de QSO" ?Vols renovar-lo ara ?Vols pujar una sol·licitud de certificat ara ?Descarrega de :S'ha detectat un QSO duplicatSortir de TQSL Alt-XEditarEdita (si s’utilitza amb -l) o crea una ubicació de l’estacióEdita la ubicació de l'estacióEditar la ubicació d'estació Edita la ubicació de l'estació : %hs - %sEdita una ubicació de l'estacióEdita...Mail : Habilitar un Proxy de XarxaActiva las contrasenya per als certificats d'indicatiuData de finalització (YYYY-MM-DD)La data final no és vàlidaLa data de finalització de %s no és vàlidaIntrodueix un nom per a aquesta ubicacióIntrodueix una contrasenya per a aquest certificat d'indicatiu.Torna a entrar-la per a confirmar-la :Introdueix el fitxer per desar-lo aIntrodueix la contrasenyaIntrodueix la contrasenyaIntrodueix la contrasenya per desbloquejar el certificat d'indicatiuIntroduir el nom pel nou contenidor de certificatsTorna a introduir la contrasenya per verificar-la :Introdueix la contrasenya per a el fitxer del contenidor del certificat.Introdueix la contrasenya per desbloquejar el fitxer .p12:Introdueix la contrasenya per desbloquejar el certificat d'indicatiu de %hs -- %hs (Aquesta és la contrasenya que vas crear quan vas instal·lar el certificat d'indicatiu.)ErrorS'ha produït un error en comprovar els certificats d'indicatiu caducats :S'ha produït un error en comprimir-se abans de la càrregaError creant la sol·licitud de certificat d'indicatiuError creant la sol·licitud de certificat d'indicatiu: %hsS'ha produït un error en baixar el fitxer de configuració nou:S'ha produït un error en descarregar el nou fitxer :S'ha produït un error en descarregar la informació de la nova versió :S'ha produït un error en descarregar la informació de la versió d'actualització :Error en importar les ubicacions de l'estació: %hsError obrint el fitxer sol·licitud de certificat %s: %hsError en obrir el diagnòstic del registre %s: %hsError en obrir el fitxer d'entradaError en obrir el fitxer de sortidaError en obrir el fitxer per desar %s: %hsS'ha produït un error en analitzar el certificat de l'entitat DXCCS'ha produït un error en analitzar el certificat per signar l'indicatiuS'ha produït un error en analitzar el certificat de l'emissorError al analitzar el fitxer de configuració desat: %hsError al analitzar el fitxer d'ubicació de l'estació: %hsError en realitzar la còpia de seguretat automàtica: %hsS'ha produït un error en canviar el nom del fitxer de la còpia de seguretat %s: %hsS'ha produït un error en accedir a la botiga de certificatsS'ha produït un error en escriure el fitxer de configuració nou %s: %hsError: no s'ha pogut carregar el fitxer (error d'inici CURL)S'han detectat errorsErrors: %dSurt de TQSL per poder tornar a executar com a usuari normalSurt després del processament del registre (en cas contrari comença normalment)S'esperava un nomCaducatVenç el : Exporta fitxers P12 compatibles amb Apple KeychainExportació fallida a %s: %hsCampNom del fitxer per al registre de seguiment de diagnòsticError de sintaxi del fitxerError de sintaxi del fitxer: %hsEstat final: %hs (%d)Freqüència en MHz :El locator %s no és correcta per al teu %s. Fes clic a "Següent" de nou per utilitzar-lo de totes maneres.El locator %s no és correcta per a la teva entitat DXCC. Fes clic a "Següent" de nou per utilitzar-lo de totes maneres.El Locator %s no és correcte per al teu QTH. Clica 'Següent' de nou per usar-lo igualment.LocatorLocator : El locator no és coherent amb la ubicació de l'estacióAmb quina acció es gestiona la informació de QTH als registres ADIF ?AjudaSóc el gestor de QSL d'aquest indicatiuID IOTAIOTA : La IOTA %s no és correcte. Ha de tenir un número després del "-"La IOTA %s no és correcte. Ha de començar per AF-, AN-, AS-, EU-, NA-, OC- o SA-El valor IOTA %s no és vàlid.Zona ITUZona ITU : Si és així, tria un indicatiu de trucada a continuació per al compte LoTW principal. Si no, fes clic a "Finalitza" i es configurarà un nou compte de LoTW per a aquests QSO.Si tens previst restaurar des d'una còpia de seguretat, selecciona "No".Si estàs segur que la sol·licitud anterior no és vàlida, has de suprimir el certificat de designació pendent per a %s.Si utilitzes un indicatiu d'Estats Units fora dels Estats Units de conformitat amb CEPT, IARP i altres acords de reciprocitat, les normes de la FCC requereixen que siguis un ciutadà dels Estats Units.Si utilitzes un sistema informàtic que es comparteix amb altres, hauries d'especificar una contrasenya per protegir aquest certificat. Tanmateix, si utilitzes un ordinador en una residència privada, no cal especificar cap contrasenya.Si utilitzes un sistema informàtic que es comparteix amb altres, hauries d'especificar una contrasenya per protegir aquest certificat. Tanmateix, si utilitzes un ordinador en una residència privada, no cal especificar cap contrasenya.Si defineixes una data de finalització, no pots signar QSO després d'aquesta data, tot i que el certificat d'indicatiu encara sigui vàlid.Si encara mantens aquest indicatiu (o si tens previst renovar la llicència), no hauries d’establir una data de finalització de QSO.IgnoraIgnora els detalls del QTH del teu registreIgnora els indicatius als fitxers ADIFIgnora els segons en temps al QSOImporta un fitxer de certificat (.p12 o .tq6)La importació s'ha completat correctamentMentrestant, tingues en compte que alguns registradors poden presentar un comportament estrany si es fa clic en una opció diferent a "Tornar a carregar QSO". Es recomana "Només QSO nous", però un registrador que realitza el seu propi seguiment de càrregues pot establir l'estat incorrectament en aquest cas. Un registre que no fa el seguiment de les càrregues no s'hauria de veure afectat escollint "Només QSO nous" i si rastreja l'estat del "QSO enviat", marcarà correctament tots els QSO seleccionats com a enviats, encara que es trobin al teu compte, encara que no estiguessin en el lot específicMentrestant, tingues en compte que alguns registradors poden presentar un comportament estrany si es fa clic en una opció diferent a "Tornar a carregar QSO". L’elecció de “Cancel·lar” sol ser segura, però un registrador defectuós que no verifica els missatges d’estat reportats per TrustedQSL pot produir un comportament estrany (però inofensiu) com intentar carregar un fitxer buit o marcar tots els QSO escollits com a “enviats”.Certificats incomplets : falta un fitxer TQ6 coincidentContrasenya incorrecta en a importar el fitxer P12Una configuració incorrecta pot fer que el TQSL no pugui pujar els logs o buscar actualitzacions.Introdueix fitxer de registre ADIF o Cabrillo per signarInstal·la el certificatNo vàlid %hs: "%hs"Argument no vàlidContacte no vàlid: el QSO no especifica un IndicatiuContacte no vàlid: el QSO no especifica una banda ni una freqüènciaContacte no vàlid: el QSO no especifica una dataContacte no vàlid: el QSO no especifica un modeContacte no vàlid: el QSO no especifica una horaFormat de data no vàlidCodi d'error invàlid: %dFormat d'hora no vàlidSeleccions de zones no vàlides per a l'entitat DXCCSeleccions de zones no vàlides per a l'àreaSeleccions de zones no vàlides per a la provínciaSeleccions de zones no vàlides per a l'estatAquest nou certificat és per a un indicatiu que ja tens a un compte de LoTW i vols que els QSO d'aquest indicatiu s'afegeixin a un compte de LoTW existent ? IdiomaDeixa la contrasenya en blanc i fas clic a "Finalitza" tret que vulguis utilitzar una contrasenya.Deixa la contrasenya en blanc i fes clic a "Següent" tret que vulguis utilitzar una contrasenya.Deixa la contrasenya en blanc i fes clic a "D'acord", tret que vulguis utilitzar una contrasenya.Ha fallat la connexió a LoTWCarregar un fitxer de certificatCàrrega un certificat d'indicatiuCàrrega completaError de dades d'ubicacióFitxer de registreError del fitxer de registreGestió del log o registreOperacions de registreFitxers de registre (*.log)|*.log|All files (*.*)|*.*Inicia sessió al lloc Logbook of the WorldFallada d'assignació de memòriaNo es troba en aquest ordinadorConflicte de ModeMode :Més detalls a :CAP ERRORCAPNomEl nom ja existeixProxy de xarxaDB nouNova contrasenyaNomés QSO nousNova contrasenyaNova contrasenya :Nou...No hi ha certificats d'indicatiuSense certificatEl certificat d'indicatiu seleccionat no coincideix amb cap sol·licitud de certificatCap clau privadaNo hi ha registres de QSONo hi ha QSO per carregarSense actualitzacionsNo hi ha cap certificat d'indicatiu per a la clauNo hi ha fitxer de registre per signar !No hi ha registres de sortidaNo hi ha informació d’estat disponibleCapCap d'aquests s'aplicaNota: TQSL assumeix que aquest fitxer es penjarà a LoTW.Nota: TQSL no ha registrat la signatura d'aquests QSO. Pots enviar aquest fitxer de registre a LoTW o descartar-lo.Nota: L'adreça de correu electrònic que proporciones aquí és l'adreça a la qual s'enviarà el certificat emès. Assegurat que sigui l’adreça correcta !AvísNombre de còpies de seguretat a conservar :D'acordD’acord per instal·lar DistricteÀrea : Un cop has subministrat la informació sol·licitada i creat el fitxer de sol·licitud, has d'enviar el fitxer de sol·licitud a l'emissor del certificat.Un registre de QSOObrir els fitxers ADIF en un editor ADIFObre el fitxerOperació avortada per l'operadorOperador : OpcionsOrganització : Nom del fitxer de sortida (els valors per defecte del nom d’entrada menys l’extensió .tq8)Anul·la la ubicació de l'estació amb els detalls de QTH del teu registreFitxer PKCS#12 no compatible amb TQSLParc : S'ha confirmat la contrasenyaLes entrades de la contrasenya no coincideixenError de contrasenyaContrasenya per a la clau de signaturaLa contrasenya no és correctaContrasenya protegidaContrasenya :Contrasenya : Selecciona un indicatiu per a aquesta ubicació d'estacióSi us plau, tria un idioma :Instal·la un certificat d'indicatiu i torna-ho a provar de nou.Consulta la documentació introductòria abans d’utilitzar aquest programa.Selecciona un certificat d'indicatiu per al compte on vols que s'emmagatzemin els QSOSelecciona un certificat d'indicatiu per a validar aquesta sol·licitudPer validar la sol·licitud, selecciona el certificat d'indicatiu per a la teva sol·licitud d'indicatiu personal actual.Si us plau, intenta-ho més tard.Prova a penjar la versió %s després.Si us plau, verifica que aquesta és la ubicació de l'estació correcta per als QSO que s'estan signant.Espera fins que rebis un correu electrònic amb el certificat d'indicatiu sol·licitat.Port Número :PreferènciesS'ha detectat un QSO signat prèviamentS'han detectat QSO signats prèviamentSignat prèviament: %dS'han detectat QSO signats prèviamentSignat prèviament: %dClau privada no trobadaSol·licitar un interval de dates QSO quan es signiMode de propagació :PropietatsProvínciaProvíncia : Adreça del Proxy :Tipus de Proxy :Tipus de ProxyData del QSOError de dades al QSODades de QSO: s'ha ignorat el mode no vàlid - %sInterval de dates del QSOData final dels QSO : La freqüència del QSO no és vàlidaLa freqüència del QSO està fora de gamma per a la banda seleccionadaLa freqüència de RX del QSO no és vàlidaLa freqüència de RX del QSO està fora del rang per a la banda seleccionadaData inici dels QSO : Data d’inici de QSO: Has de triar els valors adequats per a Any, Mes i Dia.La data del QSO no està dins de l'interval de dates especificades al vostre certificat d'indicatiuLa data de finalització del QSO no pot ser abans de la data d'inici del QSO.Data de finalització del QSO: has de triar els valors adequats per a Any, Mes i Dia o deixar els tres en blanc.Els registres QSO signats mitjançant el Certificat no seran vàlids per a crèdits de concessió de DXCC (però seran vàlids per a altres premis aplicables). Si el certificat s'ha d'utilitzar per a la signatura de QSO en operacions mòbils marítimes o mòbils aeris, aquesta serà la selecció correcta. En cas contrari, probablement has de fer servir el botó "Enrere" per tornar a la pàgina DXCC després de fer clic a "D'acord".Els QSO de %hs s'emmagatzemaran al compte LoTW de %s.Els QSO anteriors a la data d’inici o després de la data de finalització no seran signats ni inclosos al fitxer de sortida.QSO: %dMode tranquil: el mateix comportament que -xBanda de recepció :Freqüència de RX en MHz :Torna a penjar els QSORenova un certificat d'indicatiuRenovar el certificat d'indicatiu perRenovatInforme sobre les diferències de QTHSol·licitar un &Nou certificat d'indicatiu...Sol·licitar un nou certificat d'indicatiuSol·licitud cancel·ladaRestauració completa.Recuperar el certificat d'indicatiu esborratHa fallat l'operació de restauració: %hsRestaurar certificats d'indicatiuRestaurar PreferènciesRestaurar registres de QSORestaurar ubicacions de l'estacióRestaurar el certificat per l'indicatiu de %hsSi tornes a enviar aquests QSO, s'informarà que ja estan signats.Resultat en mode TQSL :Torna-ho a provar ?L'elecció del mode satèl·lit requereix que el mode de propagació sigui "satèl·lit"Satèl·lit :Desar el fitxerDesa les dades de l'estacióDesa un certificat d'indicatiuOperació de desar completada.Desar sol·licitudDesar el certificat d'indicatiu perS'han desat fitxers de configuració (*.tbk)|*.tbkDesant QSODesant ubicacions d'estacióDesant TQSL PreferènciesS'ha desat el certificat d'indicatiu per %hsDesant certificats d'indicatiuSelecciona un indicatiuSelecciona el fitxer del certificatSelecciona dades de l'estacióSelecciona la ubicació de l'estació per signarSelecciona un certificat d'indicatiu per processarSelecciona una carpetaSelecciona una ubicació d'estació a gestionarSelecciona una ubicació de l'estació a gestionar Selecciona el fitxer per signarSelecciona el fitxer on escriureSelecciona o introdueix el nom d'aquesta ubicació de l'estacióSelecciona el fitxer de configuració desatSelecciona la ubicació de l'estacióSelecciona la ubicació de l'estacióNúmero de sèrie : Signa un registre i desa'l per penjar-lo més tardSigna un registre i penja'l automàticament a LoTWInicia la sessió i penja el fitxer ADIF o Cabrillo ...Fitxer de signatura : Signatura de dades del QSOS'ha abandonat la signaturaLa signatura s'ha avortatLa sessió s'ha avortat a causa d'errorsLa signatura s'ha cancel·lat.La signatura s'ha cancel·latFirma sessió mitjançant l'indicatiu %hs, de l'entitat DXCC %hsAtès que no tens certificats d'indicatiu, has d'enviar una sol·licitud de certificat "Sense signar". Això et permetrà crear el teu certificat d'indicatiu inicial per a l'ús de LoTW. Fes clic a "Finalitzar" per completar aquesta sol·licitud de certificat d'indicatiu.Alguns QSO no s'han processatEspecifica l'acció de verificació de QSO: ignorar, informar o actualitzarEspecifica l'indicatiu predeterminat per a la signatura del registreEspecifica l'acció de diàleg: anul·la, compleix o demanaEspecifica la data de finalització per signar QSOEspecifica la data d'inici per signar QSOData d'inici (YYYY-MM-DD)La data d’inici no és vàlidaLa data d’inici de %s no és vàlidaComarcaEstat : Entrada de dades de l'estació completaUbicació de l'estacióNom d'ubicació de l'estacióCaracterístiques de la ubicació de l'estacióError de dades de la ubicació de l'estacióLa ubicació de l'estació no coincideix amb els detalls del QSOUbicacions de l'estacióCal introduir un nom de l'estacióEstat del registreÈxitSuprimeix el quadre de diàleg de l'interval de datesError de sistema: %hsError de sistema: %hs : %hsConfirma TQSLError TQSLDisponible l’actualització per a TQSLVersió de TQSL %hs i versió de dades de configuració %sAvís TQSLFitxers de dades comprimits TQSL (*.tq8)|*.tq8Fitxers de dades TQSL (*.tq7)|*.tq7TQSL no pot signar QSO perquè una altra instància de TQSL està ocupada. Finalitza qualsevol altra còpia de TQSL i torna-ho a provar.TQSL no s'ha d'executar "com a administrador"TQSL ha d’esperar a que surtin altres còpies en execució de TQSL abans de fer una còpia de seguretat...TQSL ha d'esperar que surtin altres còpies en execució de TQSL abans de signar...Error de TQSLLibEl %s '%hs' té valor '%hs', mentre que el QSO té '%hs'El paràmetre -a %hs no es reconeixEl paràmetre -f %hs no es reconeixEl fitxer de configuració TQSL no pot ser analitzatLa base de dades de seguiment de càrrega de TQSL està bloquejadaL'indicatiu %s no està registrat actualment a la base de dades FCC ULS. Si es tracta d'un indicatiu registrat recentment, has d'esperar almenys un dia hàbil perquè sigui vàlid. Introdueix un indicatiu vàlid actual.El certificat d'indicatiu per a l'indicatiu %hs ha caducat. Aquesta ubicació de l'estació no es pot utilitzar per signar un fitxer de registre fins que s'instal·li un certificat d'indicatiu vàlid.L'indicatiu és massa llarg. Només es permeten %d caràcters.El certificat de %hs caduca en %d diesEl certificat de %hs caduca en %d dies.La data del primer QSO és posterior a la darrera data vàlida (%hs) de l'entitat DXCC seleccionada %hsLa data del primer QSO és anterior a la primera data vàlida (%hs) de l'entitat DXCC seleccionada %hsLa data del darrer QSO és posterior a la darrera data vàlida (%hs) de l'entitat DXCC seleccionada %hsLa data del darrer QSO és anterior a la primera data vàlida (%hs) de l'entitat DXCC seleccionada %hsEl fitxer no s'ha desat. S'han de desar els QSO ?El format d'aquest fitxer és incorrecte.Les dades no vàlides s'han ignorat.El registre que estàs signant té '%hs' establert amb el valor '%hs' que no és vàlidEl fitxer de registre que penges mitjançant el teu llibre de guàrdia consta completament de QSO prèviament carregats que creen treballs innecessaris per a LoTW. És possible que hi hagi una versió més recent del llibre de guàrdia que impedeixi això. Si us plau, consulta el venedor del teu llibre de guàrdia per obtenir una versió actualitzada.El fitxer de registre que penges mitjançant el teu llibre de guàrdia inclou alguns QSO carregats anteriorment que creen treballs innecessaris per a LoTW. És possible que hi hagi una versió més recent del llibre de guàrdia que impedeixi això. Si us plau, consulta el venedor del teu llibre de guàrdia per obtenir una versió actualitzada.L'únic motiu per tornar a signar QSO signats anteriorment és si LoTW no ha processat una càrrega anterior, ja sigui perquè no s'ha carregat mai o hi ha hagut una fallada del servidorLa clau privada per a l'indicatiu %hs número de sèrie %ld no és present en aquest ordinador; pots aconseguir-lo carregant un fitxer .tbk o .p12La clau privada per aquest certificat d'indicatiu no està present en aquest ordinador; pots aconseguir-lo carregant fitxer .tbk o .p12No es pot trobar l'indicatiu seleccionatNo s'ha trobat la ubicació de l'estació seleccionadaLes dues còpies de la contrasenya no coincideixen.No hi ha certificats de signatura d'indicatiu %hs. Aquesta ubicació de l'estació no es pot modificar.No hi ha certificats d'indicatiu actuals per a signar amb l'indicatiu %hs. Aquesta ubicació de l'estació no es pot utilitzar per a signar un fitxer de registre.No hi ha cap certificat d'indicatiu esborrat per ser recuperatNo hi ha cap ubicació d'estació per ser recuperadaNo hi ha certificats d'indicatiu vàlidsHi ha un certificat d'indicatiu més recent per a l'indicatiu %hs. Aquesta ubicació de l'estació no es pot utilitzar per signar un fitxer de registre fins que no estigui instal·lat.No hi ha disponible cap certificat d'indicatiu vàlid per a %hs a l'entitat %hs . Aquest QSO no es pot signarAquest certificat d'indicatiu no es pot instal·lar perquè ha caducat. Comprova si el teu ordinador està configurat a la data adequada i que aquest és l'últim certificat d'indicatiu. Aquest certificat d'indicatiu no es pot instal·lar ja que la primera data en què és vàlid és en el futur. Comprova si el teu ordinador està configurat a la data adequada. Aquesta sol·licitud de certificat d'indicatiu de trucada requereix aprovació mitjançant un certificat d'indicatiu de trucada existent.Aquesta adreça ha de coincidir amb la base de dades FCC ULS. Si aquesta informació d'adreça és incorrecta, correig el teu registre de la FCC.Aquest certificat d'indicatiu ja està actiu i no es pot restaurar.Aquest certificat ja està instal·latAquest indicatiu substitueix el meu indicatiu existentAquest fitxer no pot ser processat degut a un error de sistemaAquest fitxer no és un fitxer P12 vàlidAquest és un indicatiu d'Expedició DXAquest és un indicatiu del ràdio clubAquest és un indicatiu d'esdeveniment especialAquest és el meu indicatiu anticAquest registre conté %d QSO(s) que sembla que ja s'han signat prèviament per pujar a LoTW, i %d QSO que són nous.Aquest registre conté %d QSO(s) que sembla que s'han signat prèviament per pujar a LoTW, i cap QSO nou.Aquest registre conté %d QSO(s) que sembla que ja s'han signat prèviament per pujar a LoTW, i un QSO que és nou.Aquest registre té informació de QSO no vàlidsAquest registre té massa QSO penjats anteriorment. Penja només QSO nous o divideix el registre en trossos més petits (50.000 QSO o menys).Aquesta definició de mode entra en conflicte amb una definició de mode estàndard de %sAquesta contrasenya s'haurà d'introduir cada vegada que utilitzes aquest certificat d'indicatiu per signar o quan desis la clau.Això s'ha de corregir abans de signar un fitxer de registre.D’aquesta manera es crearà un nou fitxer de sol·licitud del certificat d'indicatiu.Això eliminarà el certificat d'indicatiu seleccionat del teu sistema.Això esborrarà aquesta ubicació d'estació del teu sistema.HoraPer importar aquest fitxer P12 protegit amb contrasenya, has de passar la contrasenya a la línia d'ordresPer enviar el fitxer de registre signat a LoTW: 1. Mou el fitxer de registre signat a un ordinador amb accés a Internet 2. Inicia sessió al teu compte web de LoTW 3. Selecciona la pestanya Carrega fitxer 4. Fes clic al botó Tria un fitxer i selecciona el fitxer de registre signat que has creat (%s) 5. Fes clic al botó Carrega fitxer Alternativament, pots adjuntar el fitxer de registre signat a un missatge de correu electrònic i enviar-lo a lotw-logs@arrl.orgCertificat arrel de confiançaTipusPUJAURL : Les sol·licituds d'indicatiu 1x1 dels EUA han de proporcionar una data de finalitzacióEls indicatius 1x1 dels EUA han d'acabar amb lletres de la A a la Z, excepte la "X"Els indicatius 1x1 dels EUA han de tenir un número com a segon caràcterEls indicatius 1x1 dels EUA han de començar per W, K o NData en UTC (AAAA-MM-DD) :Hora en UTC (HHMM) :No es poden comprovar si hi ha actualitzacions: bé la teva connexió a Internet està desactivada o no es pot accedir a LoTW.No es pot comprovar si hi ha actualitzacions. La xarxa es lenta o el lloc LoTW està massa ocupat.No es pot connectar al lloc d'actualització.No es pot inicialitzar el generador de números aleatorisNo es pot obrir %s per a la sortidaNo es pot obrir ca-bundle.crt. La vostra instal·lació TQSL no està completaImpossible llegir - sense permisosNo es pot actualitzar: la vostra connexió a Internet és lenta o no es pot accedir a LoTW.No es pot actualitzar. La xarxa és lenta o el lloc LoTW està massa ocupat.Error d'esborratResposta LoTW inesperadaDesconegutError personalitzat desconegutInutilitzable: falta la clau privadaActualitzaS'ha completat l'actualitzacióPujarCàrrega rebutjadaCàrrega després de signar en lloc de desarCàrrega del certificat d'indicatiuCarregant sol·licitud de certificat d'indicatiu...Càrrega dades signadesCarregant dades del registre signat ...Error de càrrega de la base de dadesUtilitza el botó "Nou" del diàleg que estàs a punt de veure per definir la ubicació de l'estació.Utilitza aquestes dades per configurar un proxy de xarxa per a pujar i descarregar via Internet. Només has d’habilitar un proxy si està sota la direcció de l’administrador de xarxa.Usuari cancel·latValorVerifica els detalls del QTH : Prefix WPXAvísAvís: L'editor TQSL només processa un nombre limitat de camps ADIF. Si fas servir l'editor d'un fitxer ADIF, pots perdre els detalls de QSO !Per a què serveix aquest certificat d'indicatiu ?Esborrar la base de dades de càrregues de TQSLVols fer una còpia de seguretat del certificat d'indicatiu ara ?Vols sol·licitar ara un certificat de signatura ?Va escriure %d de registres de QSO a %sPodràs recuperar-lo des d'un fitxer .P12,No pots sol·licitar un certificat d'indicatiu per a un indicatiu anterior tret que tinguis un certificat d'indicatiu vàlid que s'utilitzarà per verificar aquesta sol·licitud.No pots sol·licitar un certificat per a un indicatiu 1x1 ja que has de signar aquestes sol·licituds, però no tens certificats d'indicatiu vàlids que puguis utilitzar per signar aquesta sol·licitud.No pots sol·licitar un certificat per a un indicatiu portable, ja que tens que signar aquestes sol·licituds, però no tens cap certificat d'indicatiu vàlid que puguis utilitzar per signar aquesta sol·licitud.No pots seleccionar entitat DXCC NONE (cap) ja que has de signar qualsevol sol·licitud per a l'entitat NONE i no tens certificats d'indicatiu vàlids que pots utilitzar per signar aquesta sol·licitud.No et cal un compte al LoTW per fer això.Ja has sol·licitat un certificat de signatura per a %s i no pots sol·licitar-lo fins que el personal de LoTW ho hagi processat.Ja has sol·licitat més de tres certificats d'indicatiu per a %s durant les últimes 24 hores. Només has d'enviar una sol·licitud una vegada i, a continuació, esperar que el personal de LoTW la processi. Això pot trigar diversos dies laborables.Tens un certificat superposat per a %s (DXCC =%hs) que té dates QSO : Has canviat els camps següents en aquesta ubicació de l'estació: %s Vols descartar aquests canvis ?Has escollit una data de finalització de QSO per a aquest certificat d'indicatiu. La "data de finalització de QSO" NOMÉS s'hauria de definir si aquesta data és la data en què la llicència t'ha caducat o si la llicència ha estat substituïda per una de nova.No tens definides les ubicacions de les estacions.No tens instal·lat en aquest ordinador un certificat d'indicatiu amb el qual signar els enviaments de registre.No tens certificats d'indicatiu per signar un fitxer de registre.Has seleccionat Entitat DXCC NONE (Cap)Pots deixar la data (o les dues dates) en blanc.Ara, pots enviar la teva nova sol·licitud de certificat (Pots protegir aquest certificat d'indicatiu mitjançant una contrasenya. Si utilitzes un sistema informàtic que es comparteix amb altres, hauries d'especificar una contrasenya per protegir aquest certificat d'indicatiu. Tanmateix, si utilitzes un ordinador en una residència privada, no cal especificar cap contrasenya.Pots definir les dates d'inici i / o finalització del QSO per seleccionar els QSO del fitxer d'entrada.Has de definir almenys una ubicació d'estació per signar.Has d’introduir un indicatiu vàlid.Has d’introduir una adreça de correu electrònic vàlidaHas d'introduir la teva adreçaHas d’entrar la teva poblacióHas d'introduir el teu nomCal que seleccionis un %hsHas de seleccionar una entitat DXCC.Has de seleccionar una banda o introduir una freqüènciaNo podràs recuperar-lo carregant un fitxer .TQ6.Hauries d'introduir la contrasenya cada cop que carreguis el fitxer a TrustedQSL.No pots utilitzar aquest fitxer tq6 per recuperar el certificat d'indicatiu si es perd. A efectes de seguretat, has de fer una còpia de seguretat del certificat en suports extraïbles per tal de guardar-los de forma segura.Els teus detalls de QTH han canviat per a aquest QSO. Originalment, eren aquestes: %s Ara són:%s Verifica que tenies la intenció de canviar aquest QSO ! La teva sol·licitud de certificat no s'ha carregat correctament.El teu mapa de mode personalitzat %s entra en conflicte amb la definició del mode estàndard per a %hs i s'ha esborrat.La teva adreça de correu electrònicEl teu sistema està actualitzatSembla que la teva pujada ha fallat. Vols desar aquesta sol·licitud per carregar-la més tard ?Sembla que la teva pujada ha fallat. TQSL hauria de tornar-ho a provar ?Codi Postal[Cap]són els més nous disponiblescertificat ?si has creat un, amb el comanda 'Desar certificat d'indicatiu'en entitaten línia %do veure:fitxers de certificats tQSL sol·licitats (*.al format TQSLa:|Fitxers ADIF (|Tots els fitxers (|Tots els arxius (*.*)|*.*|Fitxers Cabrillo (tqsl-2.8.1/apps/lang/ca_ES/tqslapp.po0000644000175000017500000034721215003421124017366 0ustar rmurphyrmurphy# TrustedQSL # Copyright (C) 2015-2025 The American Radio Relay League # This file is distributed under the same license as the TQSL package. # Copyright (C) 2022 The TrustedQSL Developers # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: TQSL v2.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-16 18:01-0500\n" "PO-Revision-Date: 2025-02-17 15:54+0100\n" "Last-Translator: Xavi Pérez, EA3W \n" "Language-Team: \n" "Language: ca_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" #: certtree.cpp:80 certtree.cpp:110 tqsl.cpp:1548 tqsl.cpp:7099 msgid "Callsign Certificates" msgstr "Certificats d'indicatiu" #: certtree.cpp:113 msgid "Error while accessing certificate store" msgstr "S'ha produït un error en accedir a la botiga de certificats" #: certtree.cpp:119 msgid "Error parsing certificate for issuer" msgstr "S'ha produït un error en analitzar el certificat de l'emissor" #: certtree.cpp:124 msgid "Error parsing certificate for call sign" msgstr "" "S'ha produït un error en analitzar el certificat per signar l'indicatiu" #: certtree.cpp:131 msgid "Error parsing certificate for DXCC entity" msgstr "S'ha produït un error en analitzar el certificat de l'entitat DXCC" #: certtree.cpp:186 certtree.cpp:252 msgid "Active, usable certificates" msgstr "Certificats actius i utilitzables" #: certtree.cpp:202 msgid "Unusable: Missing Private Key" msgstr "Inutilitzable: falta la clau privada" #: certtree.cpp:218 msgid "Incomplete Certificates - requires a matching TQ6" msgstr "Certificats incomplets : falta un fitxer TQ6 coincident" #: certtree.cpp:232 msgid "Certificates replaced with a newer one" msgstr "Els certificats s'han substituït per uns de més nous" #: certtree.cpp:240 msgid "Certificates that have expired" msgstr "Certificats caducats" #: crqwiz.cpp:45 msgid "This callsign replaces my existing callsign" msgstr "Aquest indicatiu substitueix el meu indicatiu existent" #: crqwiz.cpp:46 msgid "This is my former callsign" msgstr "Aquest és el meu indicatiu antic" #: crqwiz.cpp:47 msgid "I am the QSL manager for this callsign" msgstr "Sóc el gestor de QSL d'aquest indicatiu" #: crqwiz.cpp:48 msgid "This is a club callsign" msgstr "Aquest és un indicatiu del ràdio club" #: crqwiz.cpp:49 msgid "This is a DXpedition callsign" msgstr "Aquest és un indicatiu d'Expedició DX" #: crqwiz.cpp:50 msgid "This is a special event callsign" msgstr "Aquest és un indicatiu d'esdeveniment especial" #: crqwiz.cpp:51 msgid "None of these apply" msgstr "Cap d'aquests s'aplica" #: crqwiz.cpp:263 msgid "This will create a new Callsign Certificate request file." msgstr "" "D’aquesta manera es crearà un nou fitxer de sol·licitud del certificat " "d'indicatiu." #: crqwiz.cpp:265 msgid "" "Once you supply the requested information and the request file has been " "created, you must send the request file to the certificate issuer." msgstr "" "Un cop has subministrat la informació sol·licitada i creat el fitxer de " "sol·licitud, has d'enviar el fitxer de sol·licitud a l'emissor del " "certificat." #: crqwiz.cpp:272 msgid "Certificate Issuer:" msgstr "Emissor del certificat :" #: crqwiz.cpp:283 crqwiz.cpp:1665 crqwiz.cpp:1787 crqwiz.cpp:1841 #: crqwiz.cpp:1876 loadcertwiz.cpp:130 loadcertwiz.cpp:305 loadcertwiz.cpp:380 #: loadcertwiz.cpp:382 tqsl.cpp:3009 tqsl.cpp:3472 tqsl.cpp:3488 tqsl.cpp:3552 #: tqsl.cpp:3568 tqsl.cpp:5714 tqsl.cpp:7504 tqsl.cpp:7722 tqsl_prefs.cpp:1046 #: tqsl_prefs.cpp:1053 tqslwiz.cpp:1267 tqslwiz.cpp:1374 msgid "Error" msgstr "Error" #: crqwiz.cpp:318 msgid "Email: " msgstr "Mail : " #: crqwiz.cpp:320 msgid "URL: " msgstr "URL : " #: crqwiz.cpp:365 msgid "DXCC entity:" msgstr "Entitat DXCC :" #: crqwiz.cpp:369 msgid "Call sign:" msgstr "Indicatiu :" #: crqwiz.cpp:448 msgid "Date of the first QSO you made or will make using this callsign:" msgstr "" "Data del primer QSO que has realitzat o realitzaràs mitjançant aquest " "indicatiu :" #: crqwiz.cpp:502 msgid "" "Date of the last QSO you made or will make using this callsign:\n" "(Leave this date blank if this is still your valid callsign.)" msgstr "" "Data de l'últim QSO que vas realitzar o que faràs mitjançant aquest " "indicatiu :\n" "(Deixa aquesta data en blanc si encara és el teu indicatiu vàlid.)" #: crqwiz.cpp:582 msgid "Zip/Postal" msgstr "Codi Postal" #: crqwiz.cpp:587 stationdial.cpp:70 msgid "Name" msgstr "Nom" #: crqwiz.cpp:613 msgid "Address" msgstr "Adreça" #: crqwiz.cpp:643 msgid "City" msgstr "Població" #: crqwiz.cpp:658 stationdial.cpp:362 stationdial.cpp:373 msgid "State" msgstr "Comarca" #: crqwiz.cpp:684 crqwiz.cpp:687 msgid "Country" msgstr "País" #: crqwiz.cpp:786 msgid "Your e-mail address" msgstr "La teva adreça de correu electrònic" #: crqwiz.cpp:801 msgid "" "Note: The e-mail address you provide here is the address to which the issued " "Certificate will be sent. Make sure it's the correct address!" msgstr "" "Nota: L'adreça de correu electrònic que proporciones aquí és l'adreça a la " "qual s'enviarà el certificat emès. Assegurat que sigui l’adreça correcta !" #: crqwiz.cpp:847 msgid "" "You may protect this Callsign Certificate using a passphrase. If you are " "using a computer system that is shared with others, you should specify a " "passphrase to protect this Callsign Certificate. However, if you are using a " "computer in a private residence, no passphrase need be specified." msgstr "" "Pots protegir aquest certificat d'indicatiu mitjançant una contrasenya. Si " "utilitzes un sistema informàtic que es comparteix amb altres, hauries " "d'especificar una contrasenya per protegir aquest certificat d'indicatiu. " "Tanmateix, si utilitzes un ordinador en una residència privada, no cal " "especificar cap contrasenya." #: crqwiz.cpp:852 crqwiz.cpp:881 msgid "" "Leave the passphrase blank and click 'Next' unless you want to use a " "passphrase." msgstr "" "Deixa la contrasenya en blanc i fes clic a \"Següent\" tret que vulguis " "utilitzar una contrasenya." #: crqwiz.cpp:856 msgid "Passphrase:" msgstr "Contrasenya :" #: crqwiz.cpp:862 msgid "Enter the passphrase again for verification:" msgstr "Torna a introduir la contrasenya per verificar-la :" #: crqwiz.cpp:868 msgid "" "DO NOT lose the passphrase you choose! You will be unable to use the " "Certificate without this passphrase!" msgstr "" "NO perdis la contrasenya que triïs! No podràs utilitzar el certificat sense " "aquesta contrasenya !" #: crqwiz.cpp:886 msgid "" "Leave the passphrase blank and click 'Finish' unless you want to use a " "passphrase." msgstr "" "Deixa la contrasenya en blanc i fas clic a \"Finalitza\" tret que vulguis " "utilitzar una contrasenya." #: crqwiz.cpp:917 msgid "What is this Callsign Certificate for?" msgstr "Per a què serveix aquest certificat d'indicatiu ?" #: crqwiz.cpp:1007 msgid "" "Since you have no Callsign Certificates, you must submit an 'Unsigned' " "certificate request. This will allow you to create your initial Callsign " "Certificate for LoTW use. Click 'Finish' to complete this Callsign " "Certificate request." msgstr "" "Atès que no tens certificats d'indicatiu, has d'enviar una sol·licitud de " "certificat \"Sense signar\". Això et permetrà crear el teu certificat " "d'indicatiu inicial per a l'ús de LoTW. Fes clic a \"Finalitzar\" per " "completar aquesta sol·licitud de certificat d'indicatiu." #: crqwiz.cpp:1025 msgid "" "This Callsign Certificate request requires approval using an existing " "Callsign Certificate." msgstr "" "Aquesta sol·licitud de certificat d'indicatiu de trucada requereix aprovació " "mitjançant un certificat d'indicatiu de trucada existent." #: crqwiz.cpp:1028 msgid "" "Is this new certificate for a callsign where you already have a LoTW " "account, and you want the QSOs for this call to be added to an existing LoTW " "account? " msgstr "" "Aquest nou certificat és per a un indicatiu que ja tens a un compte de LoTW " "i vols que els QSO d'aquest indicatiu s'afegeixin a un compte de LoTW " "existent ? " #: crqwiz.cpp:1030 msgid "" "If so, choose a callsign below for the primary LoTW account. If not, click " "'Finish', and a new LoTW account will be set up for these QSOs." msgstr "" "Si és així, tria un indicatiu de trucada a continuació per al compte LoTW " "principal. Si no, fes clic a \"Finalitza\" i es configurarà un nou compte de " "LoTW per a aquests QSO." #: crqwiz.cpp:1033 msgid "" "CAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause " "issues with handling awards." msgstr "" "ATENCIÓ: barrejar QSO per a indicatius no relacionats en un compte de LoTW " "pot causar problemes amb la gestió dels premis." #: crqwiz.cpp:1126 #, c-format msgid "The callsign is too long. Only %d characters are allowed." msgstr "L'indicatiu és massa llarg. Només es permeten %d caràcters." #: crqwiz.cpp:1223 msgid "You must enter a valid call sign." msgstr "Has d’introduir un indicatiu vàlid." #: crqwiz.cpp:1326 msgid "You must select a DXCC entity." msgstr "Has de seleccionar una entitat DXCC." #: crqwiz.cpp:1357 msgid "QSO begin date: You must choose proper values for Year, Month and Day." msgstr "" "Data d’inici de QSO: Has de triar els valors adequats per a Any, Mes i Dia." #: crqwiz.cpp:1361 msgid "" "QSO end date: You must either choose proper values for Year, Month and Day " "or leave all three blank." msgstr "" "Data de finalització del QSO: has de triar els valors adequats per a Any, " "Mes i Dia o deixar els tres en blanc." #: crqwiz.cpp:1366 msgid "QSO end date cannot be before QSO begin date." msgstr "" "La data de finalització del QSO no pot ser abans de la data d'inici del QSO." #: crqwiz.cpp:1398 msgid "" "The date of your first QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "La data del primer QSO és anterior a la primera data vàlida (%hs) de " "l'entitat DXCC seleccionada %hs" #: crqwiz.cpp:1402 msgid "" "The date of your first QSO is after the last valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "La data del primer QSO és posterior a la darrera data vàlida (%hs) de " "l'entitat DXCC seleccionada %hs" #: crqwiz.cpp:1406 msgid "" "The date of your last QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "La data del darrer QSO és anterior a la primera data vàlida (%hs) de " "l'entitat DXCC seleccionada %hs" #: crqwiz.cpp:1410 msgid "" "The date of your last QSO is after the last valid date (%hs) of the selected " "DXCC Entity %hs" msgstr "" "La data del darrer QSO és posterior a la darrera data vàlida (%hs) de " "l'entitat DXCC seleccionada %hs" #: crqwiz.cpp:1433 msgid "US 1x1 callsigns must start with W, K, or N" msgstr "Els indicatius 1x1 dels EUA han de començar per W, K o N" #: crqwiz.cpp:1437 msgid "US 1x1 callsigns must have a number as the second character" msgstr "" "Els indicatius 1x1 dels EUA han de tenir un número com a segon caràcter" #: crqwiz.cpp:1441 msgid "US 1x1 callsigns must end in letters A-Z excluding 'X'" msgstr "" "Els indicatius 1x1 dels EUA han d'acabar amb lletres de la A a la Z, excepte " "la \"X\"" #: crqwiz.cpp:1447 msgid "US 1x1 callsign requests must provide an end date" msgstr "" "Les sol·licituds d'indicatiu 1x1 dels EUA han de proporcionar una data de " "finalització" #. TRANSLATORS: first argument is callsign (%s), second is the related DXCC entity name (%hs) #: crqwiz.cpp:1492 msgid "" "You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: " msgstr "Tens un certificat superposat per a %s (DXCC =%hs) que té dates QSO : " #. TRANSLATORS: here "to" separates two dates in a date range #: crqwiz.cpp:1494 msgid " to " msgstr " a " #: crqwiz.cpp:1503 #, c-format msgid "" "You have already requested a Callsign Certificate for %s and can not request " "another until that request has been processed by LoTW Staff." msgstr "" "Ja has sol·licitat un certificat de signatura per a %s i no pots sol·licitar-" "lo fins que el personal de LoTW ho hagi processat." #: crqwiz.cpp:1505 crqwiz.cpp:1545 msgid "" "Please wait until you receive an e-mail bearing your requested Callsign " "Certificate." msgstr "" "Espera fins que rebis un correu electrònic amb el certificat d'indicatiu " "sol·licitat." #: crqwiz.cpp:1507 #, c-format msgid "" "If you are sure that the earlier request is now invalid you should delete " "the pending Callsign Certificate for %s." msgstr "" "Si estàs segur que la sol·licitud anterior no és vàlida, has de suprimir el " "certificat de designació pendent per a %s." #: crqwiz.cpp:1543 #, c-format msgid "" "You have already requested more than three Callsign Certificates for %s in " "the past 24 hours. You should submit a request only once, then wait for that " "request to be processed by LoTW Staff. This may take several business days." msgstr "" "Ja has sol·licitat més de tres certificats d'indicatiu per a %s durant les " "últimes 24 hores. Només has d'enviar una sol·licitud una vegada i, a " "continuació, esperar que el personal de LoTW la processi. Això pot trigar " "diversos dies laborables." #: crqwiz.cpp:1639 msgid "" "You cannot request a Callsign Certificate for a former callsign unless you " "hold a valid Callsign Certificate to be used to verify that request." msgstr "" "No pots sol·licitar un certificat d'indicatiu per a un indicatiu anterior " "tret que tinguis un certificat d'indicatiu vàlid que s'utilitzarà per " "verificar aquesta sol·licitud." #: crqwiz.cpp:1644 #, c-format msgid "" "The callsign %s is not currently registered in the FCC ULS database.\n" "If this is a newly registered call, you must wait at least one business day " "for it to be valid. Please enter a currently valid callsign." msgstr "" "L'indicatiu %s no està registrat actualment a la base de dades FCC ULS.\n" "Si es tracta d'un indicatiu registrat recentment, has d'esperar almenys un " "dia hàbil perquè sigui vàlid. Introdueix un indicatiu vàlid actual." #: crqwiz.cpp:1654 msgid "" "If you are using a US callsign outside of the US persuant to CEPT, IARP or " "other Reciprocity arrangements, FCC rules require you to be a US Citizen." msgstr "" "Si utilitzes un indicatiu d'Estats Units fora dels Estats Units de " "conformitat amb CEPT, IARP i altres acords de reciprocitat, les normes de la " "FCC requereixen que siguis un ciutadà dels Estats Units." #: crqwiz.cpp:1654 crqwiz.cpp:1706 loadcertwiz.cpp:218 tqsl.cpp:6234 #: tqsl.cpp:7050 tqsl.cpp:7178 tqsl_prefs.cpp:448 msgid "Warning" msgstr "Avís" #: crqwiz.cpp:1670 msgid "" "You cannot select DXCC Entity NONE as you must sign any request for entity " "NONE and you have no valid Callsign Certificates that you can use to sign " "this request." msgstr "" "No pots seleccionar entitat DXCC NONE (cap) ja que has de signar qualsevol " "sol·licitud per a l'entitat NONE i no tens certificats d'indicatiu vàlids " "que pots utilitzar per signar aquesta sol·licitud." #: crqwiz.cpp:1671 crqwiz.cpp:1684 crqwiz.cpp:1693 crqwiz.cpp:1890 tqsl.cpp:155 #: tqsl.cpp:193 msgid "TQSL Error" msgstr "Error TQSL" #: crqwiz.cpp:1676 msgid "You have selected DXCC Entity NONE" msgstr "Has seleccionat Entitat DXCC NONE (Cap)" #: crqwiz.cpp:1678 msgid "" "QSO records signed using the Certificate will not be valid for DXCC award " "credit (but will be valid for other applicable awards). If the Certificate " "is to be used for signing QSOs from maritime/marine mobile, shipboard, or " "air mobile operations, that is the correct selection. Otherwise, you " "probably should use the \"Back\" button to return to the DXCC page after " "clicking \"OK\"" msgstr "" "Els registres QSO signats mitjançant el Certificat no seran vàlids per a " "crèdits de concessió de DXCC (però seran vàlids per a altres premis " "aplicables). Si el certificat s'ha d'utilitzar per a la signatura de QSO en " "operacions mòbils marítimes o mòbils aeris, aquesta serà la selecció " "correcta. En cas contrari, probablement has de fer servir el botó \"Enrere\" " "per tornar a la pàgina DXCC després de fer clic a \"D'acord\"." #: crqwiz.cpp:1679 stationdial.cpp:458 msgid "TQSL Warning" msgstr "Avís TQSL" #: crqwiz.cpp:1683 msgid "" "You cannot request a certificate for a 1x1 callsign as you must sign those " "requests, but you have no valid Callsign Certificates that you can use to " "sign this request." msgstr "" "No pots sol·licitar un certificat per a un indicatiu 1x1 ja que has de " "signar aquestes sol·licituds, però no tens certificats d'indicatiu vàlids " "que puguis utilitzar per signar aquesta sol·licitud." #: crqwiz.cpp:1692 msgid "" "You cannot request a certificate for a portable callsign as you must sign " "those requests, but you have no valid Callsign Certificates that you can use " "to sign this request." msgstr "" "No pots sol·licitar un certificat per a un indicatiu portable, ja que tens " "que signar aquestes sol·licituds, però no tens cap certificat d'indicatiu " "vàlid que puguis utilitzar per signar aquesta sol·licitud." #: crqwiz.cpp:1699 msgid "" "You have chosen a QSO end date for this Callsign Certificate. The 'QSO end " "date' should ONLY be set if that date is the date when that callsign's " "license expired or the license was replaced by a new callsign." msgstr "" "Has escollit una data de finalització de QSO per a aquest certificat " "d'indicatiu. La \"data de finalització de QSO\" NOMÉS s'hauria de definir si " "aquesta data és la data en què la llicència t'ha caducat o si la llicència " "ha estat substituïda per una de nova." #: crqwiz.cpp:1701 msgid "" "If you set an end date, you will not be able to sign QSOs past that date, " "even if the Callsign Certificate itself is still valid." msgstr "" "Si defineixes una data de finalització, no pots signar QSO després d'aquesta " "data, tot i que el certificat d'indicatiu encara sigui vàlid." #: crqwiz.cpp:1703 msgid "" "If you still hold this callsign (or if you plan to renew the license for the " "callsign), you should not set a 'QSO end date'." msgstr "" "Si encara mantens aquest indicatiu (o si tens previst renovar la llicència), " "no hauries d’establir una data de finalització de QSO." #: crqwiz.cpp:1705 msgid "Do you really want to keep this 'QSO end date'?" msgstr "Vols mantenir aquesta \"data de finalització de QSO\" ?" #: crqwiz.cpp:1737 msgid "You must enter your name" msgstr "Has d'introduir el teu nom" #: crqwiz.cpp:1739 msgid "You must enter your address" msgstr "Has d'introduir la teva adreça" #: crqwiz.cpp:1741 msgid "You must enter your city" msgstr "Has d’entrar la teva població" #: crqwiz.cpp:1759 msgid "" "This address must match the FCC ULS database.\n" "If this address information is incorrect, please correct your FCC record." msgstr "" "Aquesta adreça ha de coincidir amb la base de dades FCC ULS.\n" "Si aquesta informació d'adreça és incorrecta, correig el teu registre de la " "FCC." #: crqwiz.cpp:1828 msgid "You must enter a valid email address" msgstr "Has d’introduir una adreça de correu electrònic vàlida" #: crqwiz.cpp:1863 msgid "The two copies of the passphrase do not match." msgstr "Les dues còpies de la contrasenya no coincideixen." #: crqwiz.cpp:1904 msgid "Click 'Finish' to complete this Callsign Certificate request." msgstr "" "Fes clic a \"Finalitzar\" per completar la sol·licitud de certificat " "d'indicatiu." #: crqwiz.cpp:1910 msgid "" "Please select a Callsign Certificate for the account where you would like " "the QSOs to be stored" msgstr "" "Selecciona un certificat d'indicatiu per al compte on vols que " "s'emmagatzemin els QSO" #: crqwiz.cpp:1913 crqwiz.cpp:1920 msgid "" "Please select the Callsign Certificate for your current personal callsign to " "validate your request." msgstr "" "Per validar la sol·licitud, selecciona el certificat d'indicatiu per a la " "teva sol·licitud d'indicatiu personal actual." #: crqwiz.cpp:1915 crqwiz.cpp:1922 msgid "Please select a Callsign Certificate to validate this request" msgstr "Selecciona un certificat d'indicatiu per a validar aquesta sol·licitud" #: crqwiz.cpp:1929 msgid "QSOs for %hs will be stored in the LoTW account for %s." msgstr "Els QSO de %hs s'emmagatzemaran al compte LoTW de %s." #. TRANSLATORS: This is part of an deleted DXCC entity name #: dxcc.cpp:49 msgid "DELETED" msgstr "ESBORRAT" #: getpassword.cpp:48 getpassword.cpp:121 qsodatadialog.cpp:387 tqsl.cpp:452 #: tqsl_prefs.cpp:70 tqsl_prefs.cpp:289 tqsl_prefs.cpp:1019 stationdial.h:46 #: tqslapp.h:132 msgid "OK" msgstr "D'acord" #: getpassword.cpp:51 getpassword.cpp:124 qsodatadialog.cpp:386 #: stationdial.cpp:225 tqsl.cpp:309 tqsl.cpp:364 tqsl.cpp:453 tqsl.cpp:577 #: tqsl.cpp:637 tqsl.cpp:1987 tqsl_prefs.cpp:73 tqsl_prefs.cpp:292 #: tqsl_prefs.cpp:1022 msgid "Cancel" msgstr "Cancel·lar" #: getpassword.cpp:53 getpassword.cpp:126 qsodatadialog.cpp:385 #: stationdial.cpp:223 tqsl_prefs.cpp:67 msgid "Help" msgstr "Ajuda" #: getpassword.cpp:111 msgid "New passphrase:" msgstr "Nova contrasenya :" #: getpassword.cpp:114 msgid "Enter again to confirm:" msgstr "Torna a entrar-la per a confirmar-la :" #: getpassword.cpp:146 msgid "Passphrase entries do not match" msgstr "Les entrades de la contrasenya no coincideixen" #: getpassword.cpp:157 msgid "Passphrase confirmed" msgstr "S'ha confirmat la contrasenya" #: loadcertwiz.cpp:41 msgid "Import completed successfully" msgstr "La importació s'ha completat correctament" #: loadcertwiz.cpp:75 msgid "OK to install " msgstr "D’acord per instal·lar " #: loadcertwiz.cpp:76 msgid "certificate?" msgstr "certificat ?" #: loadcertwiz.cpp:77 msgid "Install Certificate" msgstr "Instal·la el certificat" #: loadcertwiz.cpp:109 msgid "This callsign certificate is already installed" msgstr "Aquest certificat ja està instal·lat" #: loadcertwiz.cpp:118 msgid "Trusted root certificate" msgstr "Certificat arrel de confiança" #: loadcertwiz.cpp:121 msgid "Certificate Authority certificate" msgstr "Certificat de l'autoritat del certificat" #: loadcertwiz.cpp:124 wxutil.cpp:278 msgid "Callsign Certificate" msgstr "Certificat d'indicatiu" #: loadcertwiz.cpp:168 msgid "Enter a passphrase for this callsign certificate." msgstr "Introdueix una contrasenya per a aquest certificat d'indicatiu." #: loadcertwiz.cpp:170 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using " "a computer in a private residence no passphrase need be specified." msgstr "" "Si utilitzes un sistema informàtic que es comparteix amb altres, hauries " "d'especificar una contrasenya per protegir aquest certificat. Tanmateix, si " "utilitzes un ordinador en una residència privada, no cal especificar cap " "contrasenya." #: loadcertwiz.cpp:172 msgid "" "This passphrase will have to be entered each time you use this callsign " "certificate for signing or when saving the key." msgstr "" "Aquesta contrasenya s'haurà d'introduir cada vegada que utilitzes aquest " "certificat d'indicatiu per signar o quan desis la clau." #: loadcertwiz.cpp:174 tqsl.cpp:6983 msgid "" "Leave the passphrase blank and click 'OK' unless you want to use a " "passphrase." msgstr "" "Deixa la contrasenya en blanc i fes clic a \"D'acord\", tret que vulguis " "utilitzar una contrasenya." #: loadcertwiz.cpp:176 msgid "New Passphrase" msgstr "Nova contrasenya" #: loadcertwiz.cpp:215 msgid "" "You will not be able to use this tq6 file to recover your callsign " "certificate if it gets lost. For security purposes, you should back up your " "certificate on removable media for safe-keeping." msgstr "" "No pots utilitzar aquest fitxer tq6 per recuperar el certificat d'indicatiu " "si es perd. A efectes de seguretat, has de fer una còpia de seguretat del " "certificat en suports extraïbles per tal de guardar-los de forma segura." #: loadcertwiz.cpp:217 msgid "Would you like to back up your callsign certificate now?" msgstr "Vols fer una còpia de seguretat del certificat d'indicatiu ara ?" #: loadcertwiz.cpp:253 msgid "" "Callsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*." "tq6;*.TQ6" msgstr "" "Arxius contenidor de certificats d'indicatiu (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;" "*.P12;*.tq6;*.TQ6" #: loadcertwiz.cpp:255 msgid "Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6" msgstr "" "Arxius contenidor de certificats d'indicatiu (*.p12,*.tq6))|*.p12;*.tq6" #: loadcertwiz.cpp:257 tqsl.cpp:4545 msgid "|All files (*.*)|*.*" msgstr "|Tots els arxius (*.*)|*.*" #: loadcertwiz.cpp:261 msgid "Select Certificate File" msgstr "Selecciona el fitxer del certificat" #: loadcertwiz.cpp:305 loadcertwiz.cpp:380 tqsl.cpp:6202 msgid "This file is not a valid P12 file" msgstr "Aquest fitxer no és un fitxer P12 vàlid" #: loadcertwiz.cpp:321 msgid "Loading complete" msgstr "Càrrega completa" #: loadcertwiz.cpp:336 msgid "No status information available" msgstr "No hi ha informació d’estat disponible" #: loadcertwiz.cpp:343 msgid "Enter the passphrase to unlock the .p12 file:" msgstr "Introdueix la contrasenya per desbloquejar el fitxer .p12:" #: loadcertwiz.cpp:377 tqsl.cpp:2275 msgid "Passphrase error" msgstr "Error de contrasenya" #: loctree.cpp:93 tqsl.cpp:1441 tqsl.cpp:7209 msgid "Station Locations" msgstr "Ubicacions de l'estació" #: qsodatadialog.cpp:166 qsodatadialog.cpp:200 qsodatadialog.cpp:208 msgid "NONE" msgstr "CAP" #: qsodatadialog.cpp:193 msgid "UP" msgstr "PUJA" #: qsodatadialog.cpp:255 msgid "Call Sign:" msgstr "Indicatiu :" #: qsodatadialog.cpp:263 msgid "UTC Date (YYYY-MM-DD):" msgstr "Data en UTC (AAAA-MM-DD) :" #: qsodatadialog.cpp:271 msgid "UTC Time (HHMM):" msgstr "Hora en UTC (HHMM) :" #: qsodatadialog.cpp:280 msgid "Mode:" msgstr "Mode :" #: qsodatadialog.cpp:289 msgid "Band:" msgstr "Banda :" #: qsodatadialog.cpp:299 msgid "RX Band:" msgstr "Banda de recepció :" #: qsodatadialog.cpp:308 msgid "Frequency (MHz):" msgstr "Freqüència en MHz :" #: qsodatadialog.cpp:315 msgid "RX Frequency (MHz):" msgstr "Freqüència de RX en MHz :" #: qsodatadialog.cpp:323 msgid "Propagation Mode:" msgstr "Mode de propagació :" #: qsodatadialog.cpp:332 msgid "Satellite:" msgstr "Satèl·lit :" #: qsodatadialog.cpp:375 msgid "Add QSO" msgstr "Afegeix QSO" #: qsodatadialog.cpp:379 stationdial.cpp:218 tqsl_prefs.cpp:182 #: tqsl_prefs.cpp:837 msgid "Delete" msgstr "Esborra" #: qsodatadialog.cpp:505 msgid "QSO Frequency is invalid" msgstr "La freqüència del QSO no és vàlida" #: qsodatadialog.cpp:505 qsodatadialog.cpp:512 qsodatadialog.cpp:521 #: qsodatadialog.cpp:528 qsodatadialog.cpp:538 qsodatadialog.cpp:543 #: qsodatadialog.cpp:548 qsodatadialog.cpp:553 tqslvalidator.cpp:77 msgid "QSO Data Error" msgstr "Error de dades al QSO" #: qsodatadialog.cpp:512 msgid "QSO Frequency is out of range for the selected band" msgstr "La freqüència del QSO està fora de gamma per a la banda seleccionada" #: qsodatadialog.cpp:521 msgid "QSO RX Frequency is invalid" msgstr "La freqüència de RX del QSO no és vàlida" #: qsodatadialog.cpp:528 msgid "QSO RX Frequency is out of range for the selected band" msgstr "" "La freqüència de RX del QSO està fora del rang per a la banda seleccionada" #: qsodatadialog.cpp:538 msgid "You must select a band or enter a frequency" msgstr "Has de seleccionar una banda o introduir una freqüència" #: qsodatadialog.cpp:543 msgid "Call Sign cannot be empty" msgstr "El indicatiu no pot estar buit" #: qsodatadialog.cpp:548 msgid "'Satellite' propagation mode selected, so a Satellite must be chosen" msgstr "" "Has seleccionat el mode de propagació \"Satèl·lit\", de manera que has de " "triar un satèl·lit" #: qsodatadialog.cpp:553 msgid "Satellite choice requires that Propagation Mode be 'Satellite'" msgstr "" "L'elecció del mode satèl·lit requereix que el mode de propagació sigui " "\"satèl·lit\"" #: qsodatadialog.cpp:570 #, c-format msgid "QSO Data: Invalid Mode ignored - %s" msgstr "Dades de QSO: s'ha ignorat el mode no vàlid - %s" #: qsodatadialog.cpp:592 msgid "No QSO records" msgstr "No hi ha registres de QSO" #: qsodatadialog.cpp:606 msgid "Save File" msgstr "Desar el fitxer" #: qsodatadialog.cpp:608 tqsl.cpp:1925 msgid "" "ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files " "(*.*)|*.*" msgstr "" "Fitxers ADIF (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files " "(*.*)|*.*" #: qsodatadialog.cpp:610 tqsl.cpp:1927 msgid "ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*" msgstr "Fitxers ADIF (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*" #: qsodatadialog.cpp:699 #, c-format msgid "Wrote %d QSO records to %s" msgstr "Va escriure %d de registres de QSO a %s" #: qsodatadialog.cpp:752 msgid "The file has not been saved. Should the QSOs be saved?" msgstr "El fitxer no s'ha desat. S'han de desar els QSO ?" #: qsodatadialog.cpp:752 msgid "Confirm Close" msgstr "Confirma que vols Tancar" #: qsodatadialog.cpp:876 msgid "One QSO Record" msgstr "Un registre de QSO" #: qsodatadialog.cpp:878 #, c-format msgid "%d QSO Records" msgstr "%d Registres QSO" #: stationdial.cpp:56 tqsl.cpp:6508 msgid "&Properties" msgstr "&Propietats" #: stationdial.cpp:66 msgid "Properties" msgstr "Propietats" #: stationdial.cpp:71 msgid "Value" msgstr "Valor" #: stationdial.cpp:182 msgid "Select Station Data" msgstr "Selecciona dades de l'estació" #: stationdial.cpp:193 msgid "Save Station Data" msgstr "Desa les dades de l'estació" #: stationdial.cpp:201 msgid "Enter a name for this Station Location" msgstr "Introdueix un nom per a aquesta ubicació" #: stationdial.cpp:201 msgid "Selected Station Location" msgstr "Selecciona la ubicació de l'estació" #: stationdial.cpp:211 msgid "New..." msgstr "Nou..." #: stationdial.cpp:214 tqsl_prefs.cpp:835 msgid "Edit..." msgstr "Edita..." #: stationdial.cpp:297 msgid "Delete \"" msgstr "Esborra \"" #: stationdial.cpp:297 msgid "TQSL Confirm" msgstr "Confirma TQSL" #: stationdial.cpp:363 msgid "Call Sign" msgstr "Indicatiu" #: stationdial.cpp:364 msgid "Province" msgstr "Província" #: stationdial.cpp:365 msgid "Continent" msgstr "Continent" #: stationdial.cpp:366 msgid "CQ Zone" msgstr "Zona CQ" #: stationdial.cpp:367 msgid "DXCC Entity" msgstr "Entitat DXCC" #: stationdial.cpp:368 msgid "Grid Square" msgstr "Locator" #: stationdial.cpp:369 msgid "IOTA ID" msgstr "ID IOTA" #: stationdial.cpp:370 msgid "ITU Zone" msgstr "Zona ITU" #: stationdial.cpp:371 msgid "Oblast" msgstr "Districte" #: stationdial.cpp:372 msgid "County" msgstr "Comtat" #: stationdial.cpp:374 msgid "WPX Prefix" msgstr "Prefix WPX" #: stationdial.cpp:453 msgid "You have no Station Locations defined." msgstr "No tens definides les ubicacions de les estacions." #: stationdial.cpp:455 msgid "You must define at least one Station Location to use for signing." msgstr "Has de definir almenys una ubicació d'estació per signar." #: stationdial.cpp:457 msgid "" "Use the \"New\" Button of the dialog you're about to see to define a Station " "Location." msgstr "" "Utilitza el botó \"Nou\" del diàleg que estàs a punt de veure per definir la " "ubicació de l'estació." #: tqsl.cpp:189 msgid "Success" msgstr "Èxit" #: tqsl.cpp:190 msgid "User Cancelled" msgstr "Usuari cancel·lat" #: tqsl.cpp:191 msgid "Upload Rejected" msgstr "Càrrega rebutjada" #: tqsl.cpp:192 msgid "Unexpected LoTW Response" msgstr "Resposta LoTW inesperada" #: tqsl.cpp:194 msgid "TQSLLib Error" msgstr "Error de TQSLLib" #: tqsl.cpp:195 msgid "Error opening input file" msgstr "Error en obrir el fitxer d'entrada" #: tqsl.cpp:196 msgid "Error opening output file" msgstr "Error en obrir el fitxer de sortida" #: tqsl.cpp:197 tqsl.cpp:2720 msgid "No QSOs to upload" msgstr "No hi ha QSO per carregar" #: tqsl.cpp:198 msgid "Some QSOs not processed" msgstr "Alguns QSO no s'han processat" #: tqsl.cpp:199 msgid "Command Syntax Error" msgstr "Error de sintaxi de SCommand" #: tqsl.cpp:200 msgid "LoTW Connection Failed" msgstr "Ha fallat la connexió a LoTW" #: tqsl.cpp:201 msgid "Unknown" msgstr "Desconegut" #: tqsl.cpp:202 msgid "The TQSL upload tracking database is locked" msgstr "La base de dades de seguiment de càrrega de TQSL està bloquejada" #: tqsl.cpp:203 msgid "Previously signed QSOs were detected" msgstr "S'han detectat QSO signats prèviament" #: tqsl.cpp:204 msgid "Incorrect passphrase when importing P12 file" msgstr "Contrasenya incorrecta en a importar el fitxer P12" #: tqsl.cpp:210 msgid "Final Status: %hs (%d)" msgstr "Estat final: %hs (%d)" #. TRANSLATORS: this is followed by the callsign and entity name #: tqsl.cpp:260 msgid "" "Enter the passphrase to unlock the callsign certificate for %hs -- %hs\n" "(This is the passphrase you made up when you installed the callsign " "certificate.)" msgstr "" "Introdueix la contrasenya per desbloquejar el certificat d'indicatiu de %hs " "-- %hs\n" "(Aquesta és la contrasenya que vas crear quan vas instal·lar el certificat " "d'indicatiu.)" #: tqsl.cpp:271 tqsl.cpp:7704 getpassword.h:32 getpassword.h:33 msgid "Enter passphrase" msgstr "Introdueix la contrasenya" #: tqsl.cpp:302 msgid "Signing QSO Data" msgstr "Signatura de dades del QSO" #: tqsl.cpp:305 msgid "Converting " msgstr "Convertint " #: tqsl.cpp:305 msgid "to TQSL format" msgstr "al format TQSL" #: tqsl.cpp:327 msgid "Uploading Signed Data" msgstr "Càrrega dades signades" #: tqsl.cpp:327 msgid "Uploading signed log data..." msgstr "Carregant dades del registre signat ..." #: tqsl.cpp:421 msgid "QSO Date Range" msgstr "Interval de dates del QSO" #: tqsl.cpp:424 msgid "" "You may set the starting and/or ending QSO dates in order to select QSOs " "from the input file." msgstr "" "Pots definir les dates d'inici i / o finalització del QSO per seleccionar " "els QSO del fitxer d'entrada." #: tqsl.cpp:426 msgid "" "QSOs prior to the starting date or after the ending date will not be signed " "or included in the output file." msgstr "" "Els QSO anteriors a la data d’inici o després de la data de finalització no " "seran signats ni inclosos al fitxer de sortida." #: tqsl.cpp:428 msgid "You may leave either date (or both dates) blank." msgstr "Pots deixar la data (o les dues dates) en blanc." #: tqsl.cpp:436 msgid "Start Date (YYYY-MM-DD)" msgstr "Data d'inici (YYYY-MM-DD)" #: tqsl.cpp:443 msgid "End Date (YYYY-MM-DD)" msgstr "Data de finalització (YYYY-MM-DD)" #: tqsl.cpp:470 msgid "Start date is invalid" msgstr "La data d’inici no és vàlida" #: tqsl.cpp:478 msgid "End date is invalid" msgstr "La data final no és vàlida" #: tqsl.cpp:518 msgid "Previously Signed QSOs Detected" msgstr "S'han detectat QSO signats prèviament" #: tqsl.cpp:524 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and no new QSOs." msgstr "" "Aquest registre conté %d QSO(s) que sembla que s'han signat prèviament per " "pujar a LoTW, i cap QSO nou." #: tqsl.cpp:526 msgid "Click 'Cancel' to abandon processing this log file (Recommended)." msgstr "" "Fes clic a \"Cancel·la\" per abandonar el processament d'aquest fitxer de " "registre (recomanat)." #: tqsl.cpp:528 tqsl.cpp:538 tqsl.cpp:545 msgid "" "Click 'Re-Upload QSOs' to re-process this log while allowing previously " "signed QSOs." msgstr "" "Fes clic a “Tornar a carregar els QSO” per tornar a processar aquest " "registre i permetre els QSO signats prèviament." #: tqsl.cpp:532 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and %d QSOs which are new." msgstr "" "Aquest registre conté %d QSO(s) que sembla que ja s'han signat prèviament " "per pujar a LoTW, i %d QSO que són nous." #: tqsl.cpp:534 tqsl.cpp:541 msgid "" "Click 'New QSOs Only' to sign normally, without the previously signed QSOs " "(Recommended)." msgstr "" "Fes clic a \"Només QSO nous\" per signar normalment, sense els QSO signats " "anteriorment (recomanat)." #: tqsl.cpp:536 tqsl.cpp:543 msgid "Click 'Cancel' to abandon processing this log file." msgstr "" "Fes clic a \"Cancel·la\" per abandonar el processament d'aquest fitxer de " "registre." #: tqsl.cpp:539 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and one QSO which is new." msgstr "" "Aquest registre conté %d QSO(s) que sembla que ja s'han signat prèviament " "per pujar a LoTW, i un QSO que és nou." #: tqsl.cpp:556 msgid "" "The log file you are uploading using your QSO Logging system consists " "entirely of previously uploaded QSOs that create unnecessary work for LoTW. " "There may be a more recent version of your QSO Logging system that would " "prevent this. Please check with your QSO Logging system's vendor for an " "updated version." msgstr "" "El fitxer de registre que penges mitjançant el teu llibre de guàrdia consta " "completament de QSO prèviament carregats que creen treballs innecessaris per " "a LoTW. És possible que hi hagi una versió més recent del llibre de guàrdia " "que impedeixi això. Si us plau, consulta el venedor del teu llibre de " "guàrdia per obtenir una versió actualitzada." #: tqsl.cpp:558 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is " "usually safe, but a defective logger not checking the status messages " "reported by TrustedQSL may produce strange (but harmless) behavior such as " "attempting to upload an empty file or marking all chosen QSOs as 'sent'" msgstr "" "Mentrestant, tingues en compte que alguns registradors poden presentar un " "comportament estrany si es fa clic en una opció diferent a \"Tornar a " "carregar QSO\". L’elecció de “Cancel·lar” sol ser segura, però un " "registrador defectuós que no verifica els missatges d’estat reportats per " "TrustedQSL pot produir un comportament estrany (però inofensiu) com intentar " "carregar un fitxer buit o marcar tots els QSO escollits com a “enviats”." #: tqsl.cpp:561 msgid "" "The log file you are uploading using your QSO Logging system includes some " "previously uploaded QSOs that create unnecessary work for LoTW. There may be " "a more recent version of your QSO Logging system that would prevent this. " "Please check with your QSO Logging system's vendor for an updated version." msgstr "" "El fitxer de registre que penges mitjançant el teu llibre de guàrdia inclou " "alguns QSO carregats anteriorment que creen treballs innecessaris per a " "LoTW. És possible que hi hagi una versió més recent del llibre de guàrdia " "que impedeixi això. Si us plau, consulta el venedor del teu llibre de " "guàrdia per obtenir una versió actualitzada." #: tqsl.cpp:563 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is " "recommended, but a logger that does its own upload tracking may incorrectly " "set the status in this case. A logger that doesn't track uploads should be " "unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, " "will correctly mark all selected QSOs as sent - they are in your account " "even though they would not be in this specific batch" msgstr "" "Mentrestant, tingues en compte que alguns registradors poden presentar un " "comportament estrany si es fa clic en una opció diferent a \"Tornar a " "carregar QSO\". Es recomana \"Només QSO nous\", però un registrador que " "realitza el seu propi seguiment de càrregues pot establir l'estat " "incorrectament en aquest cas. Un registre que no fa el seguiment de les " "càrregues no s'hauria de veure afectat escollint \"Només QSO nous\" i si " "rastreja l'estat del \"QSO enviat\", marcarà correctament tots els QSO " "seleccionats com a enviats, encara que es trobin al teu compte, encara que " "no estiguessin en el lot específic" #: tqsl.cpp:565 msgid "" "Choosing 'Cancel' is usually safe, but a defective logger not checking the " "status messages reported by TrustedQSL may produce strange (but harmless) " "behavior such as attempting to upload an empty file or marking all chosen " "QSOs as 'sent'" msgstr "" "L’elecció de “Cancel·lar” sol ser segura, però un registrador defectuós que " "no verifica els missatges d’estat reportats per TrustedQSL pot produir un " "comportament estrany (però inofensiu) com intentar carregar un fitxer buit o " "marcar tots els QSO escollits com a “enviats”." #: tqsl.cpp:576 msgid "New QSOs Only" msgstr "Només QSO nous" #: tqsl.cpp:578 msgid "Re-Upload QSOs" msgstr "Torna a penjar els QSO" #: tqsl.cpp:603 msgid "" "The only reason to re-sign previously signed QSOs is if a previous upload " "was not processed by LoTW, either because it was never uploaded, or there " "was a server failure" msgstr "" "L'únic motiu per tornar a signar QSO signats anteriorment és si LoTW no ha " "processat una càrrega anterior, ja sigui perquè no s'ha carregat mai o hi ha " "hagut una fallada del servidor" #: tqsl.cpp:605 msgid "Are you sure you want to proceed? Click 'No' to review the choices" msgstr "" "Estàs segur de que vols continuar? Fes clic a \"No\" per revisar les opcions" #: tqsl.cpp:606 msgid "Are you sure?" msgstr "Estàs segur ?" #: tqsl.cpp:629 msgid "Errors Detected" msgstr "S'han detectat errors" #: tqsl.cpp:636 msgid "Ignore" msgstr "Ignora" #: tqsl.cpp:678 msgid "" "Your custom mode map %s conflicts with the standard mode definition for %hs " "and was deleted." msgstr "" "El teu mapa de mode personalitzat %s entra en conflicte amb la definició del " "mode estàndard per a %hs i s'ha esborrat." #: tqsl.cpp:955 msgid "Error renaming backup file %s: %hs" msgstr "" "S'ha produït un error en canviar el nom del fitxer de la còpia de seguretat " "%s: %hs" #: tqsl.cpp:1091 tqsl.cpp:1110 msgid "Checking for TQSL updates..." msgstr "S'està comprovant les actualitzacions de TQSL ..." #: tqsl.cpp:1157 msgid "Sign and &upload ADIF or Cabrillo File..." msgstr "Inicia la sessió i penja el fitxer ADIF o Cabrillo ..." #: tqsl.cpp:1158 msgid "&Sign and save ADIF or Cabrillo file..." msgstr "Regi&stra i desa el fitxer ADIF o Cabrillo ..." #: tqsl.cpp:1159 msgid "&Test Signing an ADIF or Cabrillo file..." msgstr "&Prova Signant un fitxer ADIF o Cabrillo..." #: tqsl.cpp:1161 msgid "&Backup Station Locations, Certificates, and Preferences..." msgstr "" "Còpies de seguretat d'U&bicacions d'estació, certificats i preferències ..." #: tqsl.cpp:1162 msgid "&Restore Station Locations, Certificates, and Preferences..." msgstr "&Restaura les ubicacions d'estació, certificats i preferències ..." #: tqsl.cpp:1164 msgid "Create &New ADIF file..." msgstr "Crea un &nou fitxer ADIF..." #: tqsl.cpp:1165 msgid "&Edit existing ADIF file..." msgstr "&Edita un fitxer ADIF existent..." #: tqsl.cpp:1168 msgid "&Preferences..." msgstr "&Preferències..." #: tqsl.cpp:1170 msgid "Display or Modify &Preferences..." msgstr "Visualització o modificació de &Preferències ..." #: tqsl.cpp:1173 tqsl.cpp:7281 tqsl.cpp:7283 msgid "Language" msgstr "Idioma" #: tqsl.cpp:1175 msgid "Dia&gnostic Mode" msgstr "Mode de dia&gnòstic" #: tqsl.cpp:1180 tqslupdater.cpp:111 msgid "E&xit TQSL\tAlt-X" msgstr "Sortir de TQSL\tAlt-X" #: tqsl.cpp:1185 msgid "&Display Station Location Properties" msgstr "&Visualitza les propietats de la ubicació de l'estació" #: tqsl.cpp:1187 msgid "&Edit Station Location" msgstr "&Edita la ubicació de l'estació" #: tqsl.cpp:1188 msgid "&Add Station Location" msgstr "&Afegeix la ubicació de l'estació" #: tqsl.cpp:1194 msgid "&Restore a Deleted Station Location" msgstr "&Restaura una ubicació suprimida de l'estació" #: tqsl.cpp:1207 msgid "&Contents" msgstr "&Continguts" #: tqsl.cpp:1209 msgid "Display &Documentation" msgstr "Visualitza la &Documentació" #: tqsl.cpp:1214 msgid "Check for &Updates..." msgstr "Buscar act&ualitzacions..." #: tqsl.cpp:1216 msgid "&About" msgstr "Qu&ant a" #: tqsl.cpp:1219 tqsl_prefs.cpp:104 msgid "&File" msgstr "&Fitxer" #: tqsl.cpp:1220 msgid "&Station Location" msgstr "Ubicació de l'e&stació" #: tqsl.cpp:1221 msgid "Callsign &Certificate" msgstr "&Certificat d'indicatiu" #: tqsl.cpp:1222 msgid "&Help" msgstr "A&juda" #: tqsl.cpp:1237 tqsl.cpp:1322 msgid "Log Operations" msgstr "Operacions de registre" #: tqsl.cpp:1244 tqsl.cpp:1560 msgid "Status Log" msgstr "Estat del registre" #: tqsl.cpp:1270 msgid "Sign a log and upload it automatically to LoTW" msgstr "Signa un registre i penja'l automàticament a LoTW" #: tqsl.cpp:1285 msgid "Sign a log and save it for uploading later" msgstr "Signa un registre i desa'l per penjar-lo més tard" #: tqsl.cpp:1301 msgid "Create an ADIF file for signing and uploading" msgstr "Crea un fitxer ADIF per signar i penjar" #: tqsl.cpp:1316 msgid "Log in to the Logbook of the World Site" msgstr "Inicia sessió al lloc Logbook of the World" #: tqsl.cpp:1354 msgid "Select a Station Location to process " msgstr "Selecciona una ubicació de l'estació a gestionar " #: tqsl.cpp:1387 msgid "Create a new Station Location" msgstr "Crea una ubicació de l'estació nova" #: tqsl.cpp:1402 tqsl.cpp:7121 msgid "Edit a Station Location" msgstr "Edita una ubicació de l'estació" #: tqsl.cpp:1419 tqsl.cpp:7123 msgid "Delete a Station Location" msgstr "Esborra una ubicació de l'estació" #: tqsl.cpp:1436 tqsl.cpp:7125 msgid "Display Station Location Properties" msgstr "Visualitza les propietats d'ubicació de l'estació" #: tqsl.cpp:1464 tqsl.cpp:6867 msgid "Select a Callsign Certificate to process" msgstr "Selecciona un certificat d'indicatiu per processar" #: tqsl.cpp:1492 msgid "Load a Callsign Certificate" msgstr "Càrrega un certificat d'indicatiu" #: tqsl.cpp:1509 tqsl.cpp:6859 msgid "Save a Callsign Certificate" msgstr "Desa un certificat d'indicatiu" #: tqsl.cpp:1526 tqsl.cpp:6652 tqsl.cpp:6861 tqsl.cpp:6928 msgid "Renew a Callsign Certificate" msgstr "Renova un certificat d'indicatiu" #: tqsl.cpp:1543 msgid "Display a Callsign Certificate's Properties" msgstr "Mostra les característiques del certificat d'indicatiu" #: tqsl.cpp:1577 tqsl.cpp:1714 tqsl.cpp:1744 msgid "Add Station Location" msgstr "Afegeix la ubicació de l'estació" #: tqsl.cpp:1663 msgid "About" msgstr "Sobre" #: tqsl.cpp:1676 msgid "Log File" msgstr "Fitxer de registre" #: tqsl.cpp:1677 msgid "Log files (*.log)|*.log|All files (*.*)|*.*" msgstr "Fitxers de registre (*.log)|*.log|All files (*.*)|*.*" #: tqsl.cpp:1684 msgid "Error opening diagnostic log %s: %hs" msgstr "Error en obrir el diagnòstic del registre %s: %hs" #: tqsl.cpp:1685 msgid "Log File Error" msgstr "Error del fitxer de registre" #. TRANSLATORS: uncommon error - error in a station location, followed by the ignore message that follows. #: tqsl.cpp:1772 tqsl.cpp:3186 tqsl.cpp:7242 msgid "The invalid data was ignored." msgstr "Les dades no vàlides s'han ignorat." #: tqsl.cpp:1773 msgid "Location data error" msgstr "Error de dades d'ubicació" #: tqsl.cpp:1777 tqsl.cpp:1804 tqsl.cpp:3191 tqsl.cpp:7247 msgid "Edit Station Location : %hs - %s" msgstr "Edita la ubicació de l'estació : %hs - %s" #: tqsl.cpp:1813 tqsl.cpp:6127 msgid "Edit Station Location" msgstr "Edita la ubicació de l'estació" #: tqsl.cpp:1813 tqsl.cpp:7552 tqsl.cpp:7654 tqsl_prefs.cpp:101 msgid "Close" msgstr "Tanca" #: tqsl.cpp:1923 msgid "Open File" msgstr "Obre el fitxer" #: tqsl.cpp:2078 msgid "Please choose a callsign for this Station Location" msgstr "Selecciona un indicatiu per a aquesta ubicació d'estació" #: tqsl.cpp:2079 msgid "Select Callsign" msgstr "Selecciona un indicatiu" #: tqsl.cpp:2111 msgid "There are no valid callsign certificates for callsign" msgstr "No hi ha certificats d'indicatiu vàlids" #: tqsl.cpp:2113 msgid "in entity" msgstr "en entitat" #: tqsl.cpp:2115 msgid "Signing aborted." msgstr "La signatura s'ha cancel·lat." #: tqsl.cpp:2126 msgid "Signing using Callsign %hs, DXCC Entity %hs" msgstr "Firma sessió mitjançant l'indicatiu %hs, de l'entitat DXCC %hs" #: tqsl.cpp:2146 msgid "Another copy of TQSL is signing a log" msgstr "Una altra còpia de TQSL està signant un registre" #: tqsl.cpp:2147 msgid "" "TQSL must wait for other running copies of TQSL to exit before signing ..." msgstr "" "TQSL ha d'esperar que surtin altres còpies en execució de TQSL abans de " "signar..." #: tqsl.cpp:2152 msgid "Aborting due to user cancelling" msgstr "Avortament a causa de la cancel·lació de l'usuari" #: tqsl.cpp:2180 tqsl.cpp:2436 msgid "Cancelled" msgstr "Cancel·lat" #: tqsl.cpp:2234 tqsl.cpp:2244 #, c-format msgid "QSOs: %d" msgstr "QSO: %d" #: tqsl.cpp:2236 #, c-format msgid "Previously Signed: %d" msgstr "Signat prèviament: %d" #: tqsl.cpp:2238 tqsl.cpp:2248 #, c-format msgid "Errors: %d" msgstr "Errors: %d" #: tqsl.cpp:2246 #, c-format msgid "Previously signed: %d" msgstr "Signat prèviament: %d" #: tqsl.cpp:2255 msgid "" "This log has too many previously uploaded QSOs. Please only upload new QSOs " "or break the log into smaller pieces (50,000 QSOs or less)." msgstr "" "Aquest registre té massa QSO penjats anteriorment. Penja només QSO nous o " "divideix el registre en trossos més petits (50.000 QSO o menys)." #: tqsl.cpp:2327 tqsl.cpp:2411 #, c-format msgid "on line %d" msgstr "en línia %d" #: tqsl.cpp:2337 #, c-format msgid "" "Your QTH Details changed for this QSO.\n" "\n" "Originally these were: %s\n" "Now they are:%s\n" "\n" "Please verify that you intended to change this QSO!\n" msgstr "" "Els teus detalls de QTH han canviat per a aquest QSO.\n" "\n" "Originalment, eren aquestes: %s\n" "Ara són:%s\n" "\n" "Verifica que tenies la intenció de canviar aquest QSO !\n" #: tqsl.cpp:2359 msgid "Click 'Ignore' to continue signing this log while ignoring errors." msgstr "" "Fes clic a \"Ignora\" per continuar signant aquest registre tot ignorant els " "errors." #: tqsl.cpp:2361 msgid "Click 'Cancel' to abandon signing this log." msgstr "" "Fes clic a \"Cancel·lar\" per abandonar la signatura d'aquest registre." #: tqsl.cpp:2389 msgid "Signing cancelled" msgstr "La signatura s'ha cancel·lat" #: tqsl.cpp:2392 msgid "Duplicate QSO detected" msgstr "S'ha detectat un QSO duplicat" #: tqsl.cpp:2395 msgid "Signing aborted" msgstr "La signatura s'ha avortat" #: tqsl.cpp:2414 msgid "Signing aborted due to errors" msgstr "La sessió s'ha avortat a causa d'errors" #: tqsl.cpp:2418 #, c-format msgid "%s: %d QSOs were outside the selected date range" msgstr "%s: %d Els QSO estaven fora de l'interval de dates seleccionat" #: tqsl.cpp:2455 msgid "All QSOs are previously signed; aborted" msgstr "Tots els QSO estan signats prèviament; avortat" #: tqsl.cpp:2462 #, c-format msgid "%d of %d QSOs are previously signed; aborted" msgstr "%d de %d els QSO estan prèviament signats; avortats" #: tqsl.cpp:2479 #, c-format msgid "%s: %d QSO records were previously signed" msgstr "%s: %d QSO que ja han pujat els registres" #: tqsl.cpp:2507 msgid "Invalid contact - QSO does not specify a Callsign" msgstr "Contacte no vàlid: el QSO no especifica un Indicatiu" #: tqsl.cpp:2508 msgid "Invalid contact - QSO does not specify a band or frequency" msgstr "Contacte no vàlid: el QSO no especifica una banda ni una freqüència" #: tqsl.cpp:2509 msgid "Invalid contact - QSO does not specify a mode" msgstr "Contacte no vàlid: el QSO no especifica un mode" #: tqsl.cpp:2510 msgid "Invalid contact - QSO does not specify a date" msgstr "Contacte no vàlid: el QSO no especifica una data" #: tqsl.cpp:2511 msgid "Invalid contact - QSO does not specify a time" msgstr "Contacte no vàlid: el QSO no especifica una hora" #: tqsl.cpp:2513 msgid "This callsign certificate is already active and cannot be restored." msgstr "Aquest certificat d'indicatiu ja està actiu i no es pot restaurar." #: tqsl.cpp:2548 #, c-format msgid "Unable to open %s for output" msgstr "No es pot obrir %s per a la sortida" #: tqsl.cpp:2558 msgid "No records output" msgstr "No hi ha registres de sortida" #: tqsl.cpp:2621 #, c-format msgid "%s: wrote %d records to %s" msgstr "%s: va escriure %d registres a %s" #: tqsl.cpp:2624 #, c-format msgid "%s is ready to be emailed or uploaded." msgstr "%s està preparat per enviar-lo per correu electrònic o penjar-lo." #: tqsl.cpp:2625 msgid "Note: TQSL assumes that this file will be uploaded to LoTW." msgstr "Nota: TQSL assumeix que aquest fitxer es penjarà a LoTW." #: tqsl.cpp:2626 msgid "" "Resubmitting these QSOs will cause them to be reported as already signed." msgstr "Si tornes a enviar aquests QSO, s'informarà que ja estan signats." #: tqsl.cpp:2628 #, c-format msgid "" "To submit the signed log file to LoTW:\n" "1. Move the signed log file to a computer with internet access\n" "2. Log in to your LoTW Web Account\n" "3. Select the Upload File tab\n" "4. Click the Choose File button, and select the signed log file you created " "(%s)\n" "5. Click the Upload file button\n" "\n" "Alternatively, you can attach the signed log file to an email message, and " "send the message to lotw-logs@arrl.org" msgstr "" "Per enviar el fitxer de registre signat a LoTW:\n" "1. Mou el fitxer de registre signat a un ordinador amb accés a Internet\n" "2. Inicia sessió al teu compte web de LoTW\n" "3. Selecciona la pestanya Carrega fitxer\n" "4. Fes clic al botó Tria un fitxer i selecciona el fitxer de registre signat " "que has creat (%s)\n" "5. Fes clic al botó Carrega fitxer\n" "\n" "Alternativament, pots adjuntar el fitxer de registre signat a un missatge de " "correu electrònic i enviar-lo a lotw-logs@arrl.org" #: tqsl.cpp:2630 msgid "" "Note: TQSL has not recorded signing these QSOs. You can submit this log file " "to LoTW or discard it." msgstr "" "Nota: TQSL no ha registrat la signatura d'aquests QSO. Pots enviar aquest " "fitxer de registre a LoTW o descartar-lo." #: tqsl.cpp:2735 msgid "Error compressing before upload" msgstr "S'ha produït un error en comprimir-se abans de la càrrega" #: tqsl.cpp:2842 msgid "Unable to open ca-bundle.crt. Your TQSL installation is incomplete" msgstr "" "No es pot obrir ca-bundle.crt. La vostra instal·lació TQSL no està completa" #: tqsl.cpp:2907 msgid "Error: Could not upload file (CURL Init error)" msgstr "Error: no s'ha pogut carregar el fitxer (error d'inici CURL)" #: tqsl.cpp:2942 msgid "Attempting to upload one QSO" msgstr "S'està intentant carregar un QSO" #: tqsl.cpp:2944 #, c-format msgid "Attempting to upload %d QSOs" msgstr "S'està intentant pujar %d QSO" #: tqsl.cpp:2947 #, c-format msgid "Attempting to upload %s" msgstr "S'està intentant pujar %s" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate" msgstr "Càrrega del certificat d'indicatiu" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate Request..." msgstr "Carregant sol·licitud de certificat d'indicatiu..." #: tqsl.cpp:2963 msgid "Could not spawn upload thread!" msgstr "No s'ha pogut generar el fil de càrrega !" #: tqsl.cpp:2997 #, c-format msgid "" "%s: Log uploaded successfully with result:\n" "\n" "%s" msgstr "" "%s: Registre carregat correctament amb el resultat:\n" "\n" "%s" #: tqsl.cpp:2999 tqsl.cpp:3020 msgid "After reading this message, you may close this program." msgstr "Després de llegir aquest missatge, pots tancar aquest programa." #: tqsl.cpp:3007 tqsl.cpp:3012 #, c-format msgid "" "%s uploaded with result:\n" "\n" "%s" msgstr "" "%s penjat amb el resultat:\n" "\n" "%s" #: tqsl.cpp:3009 #, c-format msgid "" "%s Uploaded with result:\n" "\n" "%s" msgstr "" "%s Penjat amb el resultat:\n" "\n" "%s" #: tqsl.cpp:3019 #, c-format msgid "%s: Log uploaded successfully" msgstr "%s: S'ha carregat correctament el registre" #: tqsl.cpp:3022 #, c-format msgid "%s uploaded successfully" msgstr "%s s'ha carregat correctament" #: tqsl.cpp:3029 #, c-format msgid "%s: %s upload was rejected with result \"%s\"" msgstr "%s: %s es va rebutjar la càrrega amb el resultat \"%s\"" #: tqsl.cpp:3033 #, c-format msgid "%s: %s upload was rejected" msgstr "%s: %s es va rebutjar la càrrega" #: tqsl.cpp:3039 #, c-format msgid "%s: Got an unexpected response on %s upload! Maybe the site is down?" msgstr "" "%s: a obtingut una resposta inesperada %s pujat! Potser el lloc està fora de " "servei ?" #: tqsl.cpp:3051 #, c-format msgid "" "%s: Unable to upload - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "%s: No es pot carregar: la teva connexió a Internet s'ha reduït o el " "programa LoTW no hi pot accedir." #: tqsl.cpp:3052 tqsl.cpp:3056 tqsl.cpp:3060 #, c-format msgid "Please try uploading the %s later." msgstr "Prova a penjar la versió %s després." #: tqsl.cpp:3055 #, c-format msgid "%s: Unable to upload. The network is down or the LoTW site is too busy." msgstr "" "%s: No es pot carregar La xarxa està ocupada o el lloc LoTW està massa " "ocupat." #: tqsl.cpp:3059 #, c-format msgid "%s: Unable to connect to the upload site." msgstr "%s: No es pot connectar al lloc de pujada." #: tqsl.cpp:3063 #, c-format msgid "%s: Upload cancelled" msgstr "%s: S'ha cancel·lat la pujada" #: tqsl.cpp:3068 msgid "%s: Couldn't upload the file: CURL returned \"%hs\" (%hs)" msgstr "%s: No s'ha pogut carregar el fitxer: s'ha retornat CURL \"%hs\" (%hs)" #: tqsl.cpp:3081 msgid "Your upload appears to have failed. Should TQSL try again?" msgstr "" "Sembla que la teva pujada ha fallat. TQSL hauria de tornar-ho a provar ?" #: tqsl.cpp:3081 tqsl.cpp:6794 msgid "Retry?" msgstr "Torna-ho a provar ?" #: tqsl.cpp:3110 msgid "" "There are no callsign certificates for callsign %hs. This station location " "cannot be edited." msgstr "" "No hi ha certificats de signatura d'indicatiu %hs. Aquesta ubicació de " "l'estació no es pot modificar." #: tqsl.cpp:3110 tqsl.cpp:3112 tqsl.cpp:3146 msgid "No Certificate" msgstr "Sense certificat" #: tqsl.cpp:3112 tqsl.cpp:3132 msgid "" "There are no current callsign certificates for callsign %hs. This station " "location cannot be used to sign a log file." msgstr "" "No hi ha certificats d'indicatiu actuals per a signar amb l'indicatiu %hs. " "Aquesta ubicació de l'estació no es pot utilitzar per a signar un fitxer de " "registre." #: tqsl.cpp:3134 msgid "" "There is a newer callsign certificate for callsign %hs. This station " "location cannot be used to sign a log file until the new certificate is " "installed." msgstr "" "Hi ha un certificat d'indicatiu més recent per a l'indicatiu %hs. Aquesta " "ubicació de l'estació no es pot utilitzar per signar un fitxer de registre " "fins que no estigui instal·lat." #: tqsl.cpp:3136 msgid "" "The callsign certificate for callsign %hs has expired. This station location " "cannot be used to sign a log file until a valid callsign certificate is " "installed." msgstr "" "El certificat d'indicatiu per a l'indicatiu %hs ha caducat. Aquesta ubicació " "de l'estació no es pot utilitzar per signar un fitxer de registre fins que " "s'instal·li un certificat d'indicatiu vàlid." #: tqsl.cpp:3187 tqsl.cpp:3207 tqsl.cpp:7243 msgid "Station Location data error" msgstr "Error de dades de la ubicació de l'estació" #: tqsl.cpp:3206 msgid "This should be corrected before signing a log file." msgstr "Això s'ha de corregir abans de signar un fitxer de registre." #: tqsl.cpp:3376 msgid "TQSL Update Available" msgstr "Disponible l’actualització per a TQSL" #: tqsl.cpp:3388 #, c-format msgid "A new TQSL release (V%s) is available!" msgstr "Hi ha una nova versió TQSL (V%s) està disponible !" #: tqsl.cpp:3390 #, c-format msgid "" "An updated TrustedQSL configuration file (V%s) is available!\n" "The configuration file installs definitions for entities, modes, etc." msgstr "" "Un fitxer actualitzat de configuració TrustedQSL (V%s) està disponible !\n" "El fitxer de configuració instal·la definicions per a entitats, modes, etc." #: tqsl.cpp:3398 msgid "Download from:" msgstr "Descarrega de :" #: tqsl.cpp:3407 msgid "More details at:" msgstr "Més detalls a :" #: tqsl.cpp:3415 msgid "Click 'OK' to install the new version of TQSL, or Cancel to ignore it." msgstr "" "Fes clic a \"D'acord\" per instal·lar la nova versió de TQSL o bé " "\"Anul·la\" per ignorar-la." #: tqsl.cpp:3420 msgid "" "Click 'OK' to install the new configuration file, or Cancel to ignore it." msgstr "" "Fes clic a 'D'acord' per instal·lar el fitxer de configuració nou, o Anul·la " "per ignorar-lo." #: tqsl.cpp:3472 msgid "Can't open new configuration file %s: %hs" msgstr "No es pot obrir el fitxer de configuració nou %s: %hs" #: tqsl.cpp:3488 tqsl.cpp:3568 msgid "Error writing new configuration file %s: %hs" msgstr "" "S'ha produït un error en escriure el fitxer de configuració nou %s: %hs" #: tqsl.cpp:3496 msgid "Configuration file successfully updated" msgstr "S'ha actualitzat correctament el fitxer de configuració" #: tqsl.cpp:3496 msgid "Update Completed" msgstr "S'ha completat l'actualització" #: tqsl.cpp:3512 tqsl.cpp:3592 msgid "" "Unable to update - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "No es pot actualitzar: la vostra connexió a Internet és lenta o no es pot " "accedir a LoTW." #: tqsl.cpp:3513 tqsl.cpp:3516 tqsl.cpp:3519 tqsl.cpp:3593 tqsl.cpp:3596 #: tqsl.cpp:3599 tqsl.cpp:4113 tqsl.cpp:4119 tqsl.cpp:4125 tqsl.cpp:4148 #: tqsl.cpp:4154 tqsl.cpp:4160 msgid "Please try again later." msgstr "Si us plau, intenta-ho més tard." #: tqsl.cpp:3515 tqsl.cpp:3595 msgid "Unable to update. The network is down or the LoTW site is too busy." msgstr "" "No es pot actualitzar. La xarxa és lenta o el lloc LoTW està massa ocupat." #: tqsl.cpp:3518 tqsl.cpp:3598 tqsl.cpp:4123 tqsl.cpp:4158 msgid "Unable to connect to the update site." msgstr "No es pot connectar al lloc d'actualització." #: tqsl.cpp:3521 msgid "Error downloading new configuration file:" msgstr "S'ha produït un error en baixar el fitxer de configuració nou:" #: tqsl.cpp:3523 tqsl.cpp:3603 tqsl.cpp:3894 msgid "Update" msgstr "Actualitza" #: tqsl.cpp:3552 msgid "Can't open TQSL update file %s: %hs" msgstr "No es pot obrir el fitxer d'actualització de TQSL %s: %hs" #: tqsl.cpp:3601 msgid "Error downloading new file:" msgstr "S'ha produït un error en descarregar el nou fitxer :" #: tqsl.cpp:3857 msgid "Error checking for expired callsign certificates:" msgstr "" "S'ha produït un error en comprovar els certificats d'indicatiu caducats :" #: tqsl.cpp:3858 msgid "Check Error" msgstr "Comprovació d’error" #: tqsl.cpp:3861 msgid "The certificate for %hs expires in %d days." msgstr "El certificat de %hs caduca en %d dies." #: tqsl.cpp:3864 msgid "The certificate for %hs expires in %d days" msgstr "El certificat de %hs caduca en %d dies" #: tqsl.cpp:3866 msgid "Do you want to renew it now?" msgstr "Vols renovar-lo ara ?" #: tqsl.cpp:3868 msgid "Certificate Expiring" msgstr "Certificat Caducat" #: tqsl.cpp:3912 #, c-format msgid "A new TQSL release (V%s) is available." msgstr "Una nova versió de TQSL (V%s) està disponible." #: tqsl.cpp:3929 #, c-format msgid "A new TrustedQSL configuration file (V%s) is available." msgstr "Hi ha disponible un nou fitxer de configuració de TrustedQSL (V%s)." #: tqsl.cpp:3942 msgid "Your system is up to date" msgstr "El teu sistema està actualitzat" #: tqsl.cpp:3944 msgid "TQSL Version %hs and Configuration Data Version %s" msgstr "Versió de TQSL %hs i versió de dades de configuració %s" #: tqsl.cpp:3946 msgid "are the newest available" msgstr "són els més nous disponibles" #: tqsl.cpp:3947 msgid "No Updates" msgstr "Sense actualitzacions" #: tqsl.cpp:4111 tqsl.cpp:4146 msgid "" "Unable to check for updates - either your Internet connection is down or " "LoTW is unreachable." msgstr "" "No es poden comprovar si hi ha actualitzacions: bé la teva connexió a " "Internet està desactivada o no es pot accedir a LoTW." #: tqsl.cpp:4117 tqsl.cpp:4152 msgid "" "Unable to check for updates. The network is down or the LoTW site is too " "busy." msgstr "" "No es pot comprovar si hi ha actualitzacions. La xarxa es lenta o el lloc " "LoTW està massa ocupat." #: tqsl.cpp:4128 msgid "Error downloading new version information:" msgstr "S'ha produït un error en descarregar la informació de la nova versió :" #: tqsl.cpp:4163 msgid "Error downloading update version information:" msgstr "" "S'ha produït un error en descarregar la informació de la versió " "d'actualització :" #: tqsl.cpp:4482 msgid "You have no callsign certificates to use to sign a log file." msgstr "No tens certificats d'indicatiu per signar un fitxer de registre." #: tqsl.cpp:4484 msgid "Please install a callsign certificate then try again." msgstr "Instal·la un certificat d'indicatiu i torna-ho a provar de nou." #: tqsl.cpp:4485 msgid "No Callsign Certificates" msgstr "No hi ha certificats d'indicatiu" #: tqsl.cpp:4510 msgid "|ADIF files (" msgstr "|Fitxers ADIF (" #: tqsl.cpp:4522 msgid "|Cabrillo files (" msgstr "|Fitxers Cabrillo (" #: tqsl.cpp:4525 msgid "Select file to Sign" msgstr "Selecciona el fitxer per signar" #: tqsl.cpp:4541 msgid "TQSL compressed data files (*.tq8)|*.tq8" msgstr "Fitxers de dades comprimits TQSL (*.tq8)|*.tq8" #: tqsl.cpp:4542 msgid "TQSL data files (*.tq7)|*.tq7" msgstr "Fitxers de dades TQSL (*.tq7)|*.tq7" #: tqsl.cpp:4544 msgid "Select file to write to" msgstr "Selecciona el fitxer on escriure" #: tqsl.cpp:4560 tqsl.cpp:6263 msgid "Select Station Location for Signing" msgstr "Selecciona la ubicació de l'estació per signar" #: tqsl.cpp:4593 msgid "Signing abandoned" msgstr "S'ha abandonat la signatura" #: tqsl.cpp:4811 msgid "" "TQSL must wait for other running copies of TQSL to exit before backing up..." msgstr "" "TQSL ha d’esperar a que surtin altres còpies en execució de TQSL abans de " "fer una còpia de seguretat..." #: tqsl.cpp:4828 tqsl.cpp:5384 msgid "Error opening save file %s: %hs" msgstr "Error en obrir el fitxer per desar %s: %hs" #: tqsl.cpp:4844 msgid "Saving callsign certificates" msgstr "Desant certificats d'indicatiu" #: tqsl.cpp:4888 msgid "Saving callsign certificate for %hs" msgstr "S'ha desat el certificat d'indicatiu per %hs" #: tqsl.cpp:4921 msgid "Saving Station Locations" msgstr "Desant ubicacions d'estació" #: tqsl.cpp:4937 msgid "Saving TQSL Preferences" msgstr "Desant TQSL Preferències" #: tqsl.cpp:4951 msgid "Saving QSOs" msgstr "Desant QSO" #: tqsl.cpp:4997 msgid "Save operation complete." msgstr "Operació de desar completada." #: tqsl.cpp:5006 msgid "Error performing automatic backup: %hs" msgstr "Error en realitzar la còpia de seguretat automàtica: %hs" #: tqsl.cpp:5007 msgid "Backup Error" msgstr "Error en la còpia de seguretat" #: tqsl.cpp:5009 tqsl.cpp:5028 msgid "Backup operation failed: %hs" msgstr "Còpia de seguretat fallida: %hs" #: tqsl.cpp:5019 msgid "Enter file to save to" msgstr "Introdueix el fitxer per desar-lo a" #: tqsl.cpp:5020 msgid "Configuration files (*.tbk)|*.tbk|All files (*.*)|*.*" msgstr "Fitxers de configuració (*.tbk)|*.tbk|All files (*.*)|*.*" #: tqsl.cpp:5065 msgid "Restoring callsign certificate for %hs" msgstr "Restaurar el certificat per l'indicatiu de %hs" #: tqsl.cpp:5111 msgid "Restoring Preferences" msgstr "Restaurar Preferències" #: tqsl.cpp:5173 msgid "Restoring Station Locations" msgstr "Restaurar ubicacions de l'estació" #: tqsl.cpp:5194 msgid "Restoring QSO records" msgstr "Restaurar registres de QSO" #: tqsl.cpp:5252 msgid "Error importing station locations: %hs" msgstr "Error en importar les ubicacions de l'estació: %hs" #: tqsl.cpp:5316 msgid "Restoring Callsign Certificates" msgstr "Restaurar certificats d'indicatiu" #: tqsl.cpp:5323 tqsl.cpp:5331 tqsl.cpp:5336 msgid "Error parsing saved configuration file: %hs" msgstr "Error al analitzar el fitxer de configuració desat: %hs" #: tqsl.cpp:5340 msgid "Restore Complete." msgstr "Restauració completa." #: tqsl.cpp:5354 msgid "Error parsing station location file: %hs" msgstr "Error al analitzar el fitxer d'ubicació de l'estació: %hs" #: tqsl.cpp:5366 msgid "Select saved configuration file" msgstr "Selecciona el fitxer de configuració desat" #: tqsl.cpp:5367 msgid "Saved configuration files (*.tbk)|*.tbk" msgstr "S'han desat fitxers de configuració (*.tbk)|*.tbk" #: tqsl.cpp:5397 msgid "Restore operation failed: %hs" msgstr "Ha fallat l'operació de restauració: %hs" #: tqsl.cpp:5687 msgid "Exit TQSL so I can re-run as a normal user" msgstr "Surt de TQSL per poder tornar a executar com a usuari normal" #: tqsl.cpp:5688 msgid "Allow TQSL to continue this time." msgstr "Permet que TQSL continuï aquesta vegada." #: tqsl.cpp:5689 msgid "Always allow running as Administrator." msgstr "Permet sempre executar com a administrador." #: tqsl.cpp:5690 msgid "TQSL must not be run 'As Administrator'" msgstr "TQSL no s'ha d'executar \"com a administrador\"" #: tqsl.cpp:5690 msgid "Administrator Error" msgstr "Error d'administrador" #: tqsl.cpp:5833 msgid "Specify dialog action - abort, all, compliant or ask" msgstr "Especifica l'acció de diàleg: anul·la, compleix o demana" #: tqsl.cpp:5834 msgid "Specify start date for QSOs to sign" msgstr "Especifica la data d'inici per signar QSO" #: tqsl.cpp:5835 msgid "Specify default callsign for log signing" msgstr "Especifica l'indicatiu predeterminat per a la signatura del registre" #: tqsl.cpp:5836 msgid "Suppress date range dialog" msgstr "Suprimeix el quadre de diàleg de l'interval de dates" #: tqsl.cpp:5837 msgid "Specify end date for QSOs to sign" msgstr "Especifica la data de finalització per signar QSO" #: tqsl.cpp:5838 msgid "Specify QSO verification action - ignore, report or update" msgstr "" "Especifica l'acció de verificació de QSO: ignorar, informar o actualitzar" #: tqsl.cpp:5840 msgid "Display command line help" msgstr "Mostra l'ajuda a la línia d'ordres" #: tqsl.cpp:5841 msgid "Import a certificate file (.p12 or .tq6)" msgstr "Importa un fitxer de certificat (.p12 o .tq6)" #: tqsl.cpp:5843 msgid "Selects Station Location" msgstr "Selecciona la ubicació de l'estació" #: tqsl.cpp:5845 msgid "Check for updates to tqsl and the configuration file" msgstr "Comprova si hi ha actualitzacions de TQSL i el fitxer de configuració" #: tqsl.cpp:5846 msgid "Output file name (defaults to input name minus extension plus .tq8" msgstr "" "Nom del fitxer de sortida (els valors per defecte del nom d’entrada menys " "l’extensió .tq8)" #: tqsl.cpp:5847 msgid "Passphrase for the signing key" msgstr "Contrasenya per a la clau de signatura" #: tqsl.cpp:5848 msgid "Quiet Mode - same behavior as -x" msgstr "Mode tranquil: el mateix comportament que -x" #: tqsl.cpp:5851 msgid "Edit (if used with -l) or create Station Location" msgstr "Edita (si s’utilitza amb -l) o crea una ubicació de l’estació" #: tqsl.cpp:5852 msgid "File name for diagnostic tracking log" msgstr "Nom del fitxer per al registre de seguiment de diagnòstic" #: tqsl.cpp:5853 msgid "Upload after signing instead of saving" msgstr "Càrrega després de signar en lloc de desar" #: tqsl.cpp:5854 msgid "Display the version information and exit" msgstr "Mostra la informació de la versió i surt" #: tqsl.cpp:5855 msgid "Wipe the TQSL uploads database" msgstr "Esborrar la base de dades de càrregues de TQSL" #: tqsl.cpp:5856 msgid "Exit after processing log (otherwise start normally)" msgstr "" "Surt després del processament del registre (en cas contrari comença " "normalment)" #: tqsl.cpp:5859 msgid "Input ADIF or Cabrillo log file to sign" msgstr "Introdueix fitxer de registre ADIF o Cabrillo per signar" #: tqsl.cpp:6049 tqsl.cpp:6052 #, c-format msgid "Start date of %s is invalid" msgstr "La data d’inici de %s no és vàlida" #: tqsl.cpp:6063 tqsl.cpp:6066 #, c-format msgid "End date of %s is invalid" msgstr "La data de finalització de %s no és vàlida" #: tqsl.cpp:6088 msgid "The -a parameter %hs is not recognized" msgstr "El paràmetre -a %hs no es reconeix" #. TRANSLATORS: -f is the command line switch for log QTH handling #: tqsl.cpp:6109 msgid "The -f parameter %hs is not recognized" msgstr "El paràmetre -f %hs no es reconeix" #: tqsl.cpp:6190 tqsl.cpp:6196 msgid "" "To import this passphrase protected P12 file, you must pass the passphrase " "on the command line" msgstr "" "Per importar aquest fitxer P12 protegit amb contrasenya, has de passar la " "contrasenya a la línia d'ordres" #: tqsl.cpp:6218 msgid "No logfile to sign!" msgstr "No hi ha fitxer de registre per signar !" #: tqsl.cpp:6234 msgid "" "Warning: The TQSL ADIF editor only processes a limited number of ADIF " "fields.\n" "\n" "Using the editor on an ADIF file can cause QSO details to be lost!" msgstr "" "Avís: L'editor TQSL només processa un nombre limitat de camps ADIF.\n" "\n" "Si fas servir l'editor d'un fitxer ADIF, pots perdre els detalls de QSO !" #: tqsl.cpp:6346 msgid "Please review the introductory documentation before using this program." msgstr "" "Consulta la documentació introductòria abans d’utilitzar aquest programa." #: tqsl.cpp:6347 msgid "Notice" msgstr "Avís" #: tqsl.cpp:6352 msgid "" "You have no callsign certificate installed on this computer with which to " "sign log submissions." msgstr "" "No tens instal·lat en aquest ordinador un certificat d'indicatiu amb el qual " "signar els enviaments de registre." #: tqsl.cpp:6354 msgid "Would you like to request a callsign certificate now?" msgstr "Vols sol·licitar ara un certificat de signatura ?" #: tqsl.cpp:6356 msgid "If you are planning to restore from a backup, please choose 'No'." msgstr "" "Si tens previst restaurar des d'una còpia de seguretat, selecciona \"No\"." #: tqsl.cpp:6357 msgid "Alert" msgstr "Alerta" #: tqsl.cpp:6479 msgid "Display Callsign Certificate &Properties" msgstr "Mostrar el certificat i propietats de signatura d'indicatiu" #: tqsl.cpp:6481 msgid "&Load Callsign Certificate from File" msgstr "Carregar e&l certificat d'indicatiu des de un fitxer" #: tqsl.cpp:6482 msgid "&Save Callsign Certificate to File..." msgstr "De&sar el certificat d'indicatiu a fitxer..." #: tqsl.cpp:6486 msgid "Request &New Callsign Certificate..." msgstr "Sol·licitar un &Nou certificat d'indicatiu..." #: tqsl.cpp:6487 msgid "&Renew Callsign Certificate" msgstr "&Renovar un certificat d'indicatiu" #: tqsl.cpp:6492 msgid "&Delete Callsign Certificate" msgstr "Esborrar un certificat d'in&dicatiu" #: tqsl.cpp:6498 msgid "Restore Deleted Callsign Certificate" msgstr "Recuperar el certificat d'indicatiu esborrat" #: tqsl.cpp:6511 msgid "&Edit" msgstr "&Editar" #: tqsl.cpp:6513 msgid "&Delete" msgstr "Es&borrar" #: tqsl.cpp:6560 msgid "Load Certificate File" msgstr "Carregar un fitxer de certificat" #: tqsl.cpp:6652 crqwiz.h:63 msgid "Request a new Callsign Certificate" msgstr "Sol·licitar un nou certificat d'indicatiu" #: tqsl.cpp:6732 msgid "Do you want to upload this certificate request to LoTW now?" msgstr "Vols pujar una sol·licitud de certificat ara ?" #: tqsl.cpp:6735 msgid "You do not need an account on LoTW to do this." msgstr "No et cal un compte al LoTW per fer això." #: tqsl.cpp:6737 msgid "Upload" msgstr "Pujar" #: tqsl.cpp:6747 tqsl.cpp:6796 msgid "tQSL Cert Request files (*." msgstr "fitxers de certificats tQSL sol·licitats (*." #: tqsl.cpp:6749 tqsl.cpp:6798 msgid "|All files (" msgstr "|Tots els fitxers (" #: tqsl.cpp:6750 tqsl.cpp:6799 msgid "Save request" msgstr "Desar sol·licitud" #: tqsl.cpp:6753 tqsl.cpp:6802 msgid "Request cancelled" msgstr "Sol·licitud cancel·lada" #: tqsl.cpp:6766 msgid "Error creating callsign certificate request: %hs" msgstr "Error creant la sol·licitud de certificat d'indicatiu: %hs" #: tqsl.cpp:6766 msgid "Error creating Callsign Certificate Request" msgstr "Error creant la sol·licitud de certificat d'indicatiu" #: tqsl.cpp:6779 msgid "Error opening certificate request file %s: %hs" msgstr "Error obrint el fitxer sol·licitud de certificat %s: %hs" #: tqsl.cpp:6789 tqsl.cpp:7376 tqsl.cpp:7520 msgid "Certificate Request" msgstr "Sol·licitud de certificat" #: tqsl.cpp:6793 msgid "Your certificate request did not upload properly." msgstr "La teva sol·licitud de certificat no s'ha carregat correctament." #: tqsl.cpp:6794 msgid "" "Your upload appears to have failed.\n" "Do you want to save this request for uploading later?" msgstr "" "Sembla que la teva pujada ha fallat.\n" "Vols desar aquesta sol·licitud per carregar-la més tard ?" #: tqsl.cpp:6812 msgid "You may now send your new certificate request (" msgstr "Ara, pots enviar la teva nova sol·licitud de certificat (" #: tqsl.cpp:6817 msgid "to:" msgstr "a:" #: tqsl.cpp:6824 msgid "or " msgstr "o " #: tqsl.cpp:6825 msgid "see:" msgstr "veure:" #: tqsl.cpp:6863 msgid "Display a Callsign Certificate" msgstr "Mostrar un certificat d'indicatiu" #: tqsl.cpp:6911 tqsl.cpp:6913 msgid "Save the Callsign Certificate for" msgstr "Desar el certificat d'indicatiu per" #: tqsl.cpp:6916 tqsl.cpp:6918 msgid "Display the Callsign Certificate properties for" msgstr "Mostrar les característiques del certificat d'indicatiu per" #: tqsl.cpp:6922 tqsl.cpp:6924 msgid "Renew the Callsign Certificate for" msgstr "Renovar el certificat d'indicatiu per" #: tqsl.cpp:6969 msgid "Enter the name for the new Certificate Container file" msgstr "Introduir el nom pel nou contenidor de certificats" #: tqsl.cpp:6970 msgid "Certificate Container files (*.p12)|*.p12|All files (*.*)|*.*" msgstr "Contenidors de certificats (*.p12)|*.p12|Tots els fitxers (*.*)|*.*" #: tqsl.cpp:6977 msgid "Enter the passphrase for the certificate container file." msgstr "" "Introdueix la contrasenya per a el fitxer del contenidor del certificat." #: tqsl.cpp:6979 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using " "a computer in a private residence, no passphrase need be specified." msgstr "" "Si utilitzes un sistema informàtic que es comparteix amb altres, hauries " "d'especificar una contrasenya per protegir aquest certificat. Tanmateix, si " "utilitzes un ordinador en una residència privada, no cal especificar cap " "contrasenya." #: tqsl.cpp:6981 msgid "" "You will have to enter the passphrase any time you load the file into " "TrustedQSL." msgstr "" "Hauries d'introduir la contrasenya cada cop que carreguis el fitxer a " "TrustedQSL." #: tqsl.cpp:6985 msgid "Certificate Container Passphrase" msgstr "Contrasenya del contenidor del certificat" #: tqsl.cpp:7026 msgid "Export to %s failed: %hs" msgstr "Exportació fallida a %s: %hs" #: tqsl.cpp:7028 #, c-format msgid "Certificate saved in file %s" msgstr "Certificat desat al fitxer %s" #: tqsl.cpp:7039 msgid "This will remove the selected callsign certificate from your system." msgstr "Això eliminarà el certificat d'indicatiu seleccionat del teu sistema." #: tqsl.cpp:7041 msgid "You will NOT be able to recover it by loading a .TQ6 file." msgstr "No podràs recuperar-lo carregant un fitxer .TQ6." #: tqsl.cpp:7043 msgid "You WILL be able to recover it from a container (.p12) file," msgstr "Podràs recuperar-lo des d'un fitxer .P12," #: tqsl.cpp:7045 msgid "if you have created one via the Callsign Certificate menu's" msgstr "si has creat un, amb el comanda 'Desar certificat d'indicatiu'" #: tqsl.cpp:7047 msgid "'Save Callsign Certificate' command." msgstr "Comandament \"Desa el certificat de l'indicatiu\"." #: tqsl.cpp:7049 msgid "Are you sure you want to delete the certificate?" msgstr "Estàs segur que vols esborrar el certificat ?" #: tqsl.cpp:7087 msgid "There are no deleted Callsign Certificates to restore" msgstr "No hi ha cap certificat d'indicatiu esborrat per ser recuperat" #: tqsl.cpp:7087 tqsl.cpp:7197 msgid "Undelete Error" msgstr "Error d'esborrat" #: tqsl.cpp:7098 msgid "Choose a Callsign Certificate to restore" msgstr "Tria un certificat d'indicatiu per recuperar" #: tqsl.cpp:7127 msgid "Select a Station Location to process" msgstr "Selecciona una ubicació d'estació a gestionar" #: tqsl.cpp:7147 msgid "Edit Station Location " msgstr "Editar la ubicació d'estació " #: tqsl.cpp:7150 msgid "Delete Station Location " msgstr "Esborrar la ubicació d'estació " #: tqsl.cpp:7153 msgid "Display Station Location Properties for " msgstr "Mostrar característiques de la ubicació d'estació per " #: tqsl.cpp:7175 msgid "This will remove this station location from your system." msgstr "Això esborrarà aquesta ubicació d'estació del teu sistema." #: tqsl.cpp:7177 msgid "Are you sure you want to delete this station location?" msgstr "Estàs segur que vols esborrar aquesta ubicació d'estació ?" #: tqsl.cpp:7197 msgid "There are no deleted Station Locations to restore" msgstr "No hi ha cap ubicació d'estació per ser recuperada" #: tqsl.cpp:7208 msgid "Choose a Station Location to restore" msgstr "Tria una ubicació d'estació per a ser recuperada" #: tqsl.cpp:7280 tqsl.cpp:7283 msgid "Please choose language:" msgstr "Si us plau, tria un idioma :" #: tqsl.cpp:7351 msgid "Certificate Properties" msgstr "Característiques del certificat" #: tqsl.cpp:7354 msgid "Begins: " msgstr "Comença el : " #: tqsl.cpp:7355 msgid "Expires: " msgstr "Venç el : " #: tqsl.cpp:7356 msgid "Organization: " msgstr "Organització : " #: tqsl.cpp:7358 msgid "Serial: " msgstr "Número de sèrie : " #: tqsl.cpp:7359 msgid "Operator: " msgstr "Operador : " #: tqsl.cpp:7360 tqsl.cpp:7579 msgid "Call sign: " msgstr "Indicatiu : " #: tqsl.cpp:7361 tqsl.cpp:7580 msgid "DXCC Entity: " msgstr "Entitat DXCC : " #: tqsl.cpp:7362 msgid "QSO Start Date: " msgstr "Data inici dels QSO : " #: tqsl.cpp:7363 msgid "QSO End Date: " msgstr "Data final dels QSO : " #: tqsl.cpp:7364 msgid "Passphrase: " msgstr "Contrasenya : " #: tqsl.cpp:7485 msgid "Missing from this computer" msgstr "No es troba en aquest ordinador" #: tqsl.cpp:7489 tqsl.cpp:7514 msgid "Passphrase protected" msgstr "Contrasenya protegida" #: tqsl.cpp:7493 msgid "Private Key not found" msgstr "Clau privada no trobada" #: tqsl.cpp:7497 msgid "Unable to read - no permission" msgstr "Impossible llegir - sense permisos" #: tqsl.cpp:7505 msgid "" msgstr "" #: tqsl.cpp:7508 msgid "No Private Key" msgstr "Cap clau privada" #: tqsl.cpp:7511 msgid "None" msgstr "Cap" #: tqsl.cpp:7522 msgid "Awaiting response from ARRL" msgstr "En espera de resposta de l'ARRL" #: tqsl.cpp:7536 msgid "Replaced" msgstr "Renovat" #: tqsl.cpp:7541 msgid "Expired" msgstr "Caducat" #: tqsl.cpp:7576 msgid "Station Location Properties" msgstr "Característiques de la ubicació de l'estació" #: tqsl.cpp:7581 msgid "Grid Square: " msgstr "Locator : " #: tqsl.cpp:7582 msgid "ITU Zone: " msgstr "Zona ITU : " #: tqsl.cpp:7583 msgid "CQ Zone: " msgstr "Zona CQ : " #: tqsl.cpp:7584 msgid "IOTA Locator: " msgstr "IOTA : " #: tqsl.cpp:7585 tqsl.cpp:7592 msgid "State: " msgstr "Estat : " #: tqsl.cpp:7586 msgid "County: " msgstr "Comarca o Comtat : " #: tqsl.cpp:7587 tqsl.cpp:7589 tqsl.cpp:7593 msgid "Park: " msgstr "Parc : " #: tqsl.cpp:7588 tqsl.cpp:7591 msgid "Province: " msgstr "Província : " #: tqsl.cpp:7590 msgid "Oblast: " msgstr "Àrea : " #: tqsl.cpp:7596 msgid "Verify QTH details: " msgstr "Verifica els detalls del QTH : " #: tqsl.cpp:7657 msgid "Signing File: " msgstr "Fitxer de signatura : " #: tqsl.cpp:7663 msgid "" "Please verify that this is the correct Station Location for the QSOs being " "signed." msgstr "" "Si us plau, verifica que aquesta és la ubicació de l'estació correcta per " "als QSO que s'estan signant." #: tqsl.cpp:7666 msgid "Click 'Cancel' if this is not the correct Station Location." msgstr "" "Fes clic a \"Cancel·la\" si aquesta no és la ubicació de l'estació correcta." #: tqsl.cpp:7694 msgid "Enter the Passphrase to unlock the callsign certificate" msgstr "Introdueix la contrasenya per desbloquejar el certificat d'indicatiu" #: tqsl_prefs.cpp:56 msgid "Preferences" msgstr "Preferències" #: tqsl_prefs.cpp:78 msgid "Options" msgstr "Opcions" #: tqsl_prefs.cpp:82 msgid "Log Handling" msgstr "Gestió del log o registre" #: tqsl_prefs.cpp:85 msgid "ADIF Modes" msgstr "Modes ADIF" #: tqsl_prefs.cpp:88 msgid "Cabrillo Specs" msgstr "Especificacions Cabrillo" #: tqsl_prefs.cpp:91 msgid "Network Proxy" msgstr "Proxy de xarxa" #: tqsl_prefs.cpp:172 msgid "Custom ADIF mode mappings:" msgstr "Personalitzar mapeig mode ADIF :" #: tqsl_prefs.cpp:181 tqsl_prefs.cpp:834 msgid "Add..." msgstr "Afegir..." #: tqsl_prefs.cpp:261 msgid "Add ADIF mode" msgstr "Afegir mode ADIF" #: tqsl_prefs.cpp:270 msgid "Add ADIF mode mapping:" msgstr "Afegir mode mapeig ADIF :" #: tqsl_prefs.cpp:274 msgid "ADIF Mode:" msgstr "Mode ADIF :" #: tqsl_prefs.cpp:282 msgid "Resulting TQSL mode:" msgstr "Resultat en mode TQSL :" #: tqsl_prefs.cpp:328 #, c-format msgid "This mode definition conflicts with a standard mode definition for %s" msgstr "" "Aquesta definició de mode entra en conflicte amb una definició de mode " "estàndard de %s" #: tqsl_prefs.cpp:329 msgid "Mode Conflict" msgstr "Conflicte de Mode" #: tqsl_prefs.cpp:353 msgid "Allow automatic configuration backup" msgstr "Permetre còpia de seguretat de la configuració automàtica" #: tqsl_prefs.cpp:357 msgid "Backup File Folder:" msgstr "Carpeta de les còpies de seguretat :" #: tqsl_prefs.cpp:363 msgid "Select a Folder" msgstr "Selecciona una carpeta" #: tqsl_prefs.cpp:370 msgid "Number of Backups to retain:" msgstr "Nombre de còpies de seguretat a conservar :" #: tqsl_prefs.cpp:381 msgid "Open ADIF files in ADIF editor" msgstr "Obrir els fitxers ADIF en un editor ADIF" #: tqsl_prefs.cpp:388 msgid "Display status messages in separate tab" msgstr "Mostrar els missatges d'estat en una altra pestanya" #: tqsl_prefs.cpp:393 msgid "Enable passphrases for Callsign Certificates" msgstr "Activa las contrasenya per als certificats d'indicatiu" #: tqsl_prefs.cpp:399 msgid "Export P12 files compatible with Apple Keychain" msgstr "Exporta fitxers P12 compatibles amb Apple Keychain" #: tqsl_prefs.cpp:448 msgid "" "Changes to the status message configuration will take affect when TQSL is " "restarted" msgstr "" "Les modificacions de la configuració del missatge d'estat es veuran quan es " "reiniciï el TQSL" #: tqsl_prefs.cpp:475 msgid "Cabrillo file extensions:" msgstr "Extensions de fitxer Cabrillo :" #: tqsl_prefs.cpp:480 msgid "ADIF file extensions:" msgstr "Extensions de fitxer ADIF :" #: tqsl_prefs.cpp:486 msgid "Allow nonamateur call signs" msgstr "Permetre indicatius no oficials" #: tqsl_prefs.cpp:491 msgid "Prompt for QSO Date range when signing" msgstr "Sol·licitar un interval de dates QSO quan es signi" #: tqsl_prefs.cpp:496 msgid "Display details of previously signed QSOs when signing a log" msgstr "Mostra els detalls dels QSO signats anteriorment en signar un registre" #: tqsl_prefs.cpp:501 msgid "Ignore seconds in QSO times" msgstr "Ignora els segons en temps al QSO" #: tqsl_prefs.cpp:506 msgid "Ignore callsigns in ADIF files" msgstr "Ignora els indicatius als fitxers ADIF" #: tqsl_prefs.cpp:517 msgid "Ignore QTH details from your log" msgstr "Ignora els detalls del QTH del teu registre" #: tqsl_prefs.cpp:517 msgid "Report on QTH differences" msgstr "Informe sobre les diferències de QTH" #: tqsl_prefs.cpp:517 msgid "Override Station Location with QTH details from your log" msgstr "" "Anul·la la ubicació de l'estació amb els detalls de QTH del teu registre" #: tqsl_prefs.cpp:519 msgid "Handle QTH information in ADIF logs with what action?" msgstr "Amb quina acció es gestiona la informació de QTH als registres ADIF ?" #: tqsl_prefs.cpp:706 msgid "" "Use these settings to configure a network proxy for Internet uploads and " "downloads. You should only enable a proxy if directed by your network " "administrator." msgstr "" "Utilitza aquestes dades per configurar un proxy de xarxa per a pujar i " "descarregar via Internet. Només has d’habilitar un proxy si està sota la " "direcció de l’administrador de xarxa." #: tqsl_prefs.cpp:708 msgid "" "Incorrect settings can cause TQSL to be unable to upload logs or check for " "updates." msgstr "" "Una configuració incorrecta pot fer que el TQSL no pugui pujar els logs o " "buscar actualitzacions." #: tqsl_prefs.cpp:714 msgid "Enable a Network Proxy" msgstr "Habilitar un Proxy de Xarxa" #: tqsl_prefs.cpp:718 msgid "Proxy Address:" msgstr "Adreça del Proxy :" #: tqsl_prefs.cpp:726 msgid "Port Number:" msgstr "Port Número :" #: tqsl_prefs.cpp:733 msgid "Proxy Type:" msgstr "Tipus de Proxy :" #: tqsl_prefs.cpp:736 msgid "ProxyType" msgstr "Tipus de Proxy" #: tqsl_prefs.cpp:797 msgid "Cabrillo CONTEST definitions:" msgstr "Definicions de Cabrillo CONCURS :" #: tqsl_prefs.cpp:809 tqsl_prefs.cpp:820 msgid "CONTEST" msgstr "CONCURS" #: tqsl_prefs.cpp:810 tqsl_prefs.cpp:821 msgid "Type" msgstr "Tipus" #: tqsl_prefs.cpp:811 tqsl_prefs.cpp:822 msgid "Field" msgstr "Camp" #: tqsl_prefs.cpp:966 tqsl_prefs.h:272 msgid "Edit" msgstr "Editar" #: tqsl_prefs.cpp:989 msgid "Contest" msgstr "Concurs" #: tqsl_prefs.cpp:999 msgid "Cabrillo CONTEST" msgstr "CONCURS Cabrillo" #: tqsl_prefs.cpp:1001 msgid "CONTEST Name:" msgstr "Nom del CONCURS :" #: tqsl_prefs.cpp:1007 msgid "Contest type" msgstr "Tipus de concurs" #: tqsl_prefs.cpp:1012 msgid "Call-Worked Field Number:" msgstr "Camp Indicatius treballats número :" #: tqsl_prefs.cpp:1046 msgid "Contest name cannot be blank" msgstr "El nom del concurs no pot estar en blanc" #: tqsl_prefs.cpp:1052 #, c-format msgid "Call-worked field must be %d or greater" msgstr "El camp Indicatius treballats ha de ser %d o superior" #. TRANSLATORS: Invalid date component, such as "Invalid Month: 15" #: tqslvalidator.cpp:76 msgid "Invalid %hs: \"%hs\"" msgstr "No vàlid %hs: \"%hs\"" #: tqslwiz.cpp:168 tqslwiz.cpp:1286 #, c-format msgid "" "You have changed the following fields in this Station Location: %s\n" "Do you want to discard those changes?" msgstr "" "Has canviat els camps següents en aquesta ubicació de l'estació: %s\n" "Vols descartar aquests canvis ?" #: tqslwiz.cpp:169 tqslwiz.cpp:1287 msgid "Changes have not been saved" msgstr "Els canvis no s'han desat" #: tqslwiz.cpp:334 tqslwiz.cpp:531 msgid "[None]" msgstr "[Cap]" #: tqslwiz.cpp:1024 tqslwiz.cpp:1193 msgid "You must select a %hs" msgstr "Cal que seleccionis un %hs" #: tqslwiz.cpp:1055 #, c-format msgid "%s: Invalid Grid Field" msgstr "%s: Camp del locator no vàlid" #: tqslwiz.cpp:1059 #, c-format msgid "%s: Invalid Grid Square" msgstr "%s: Locator no vàlid" #: tqslwiz.cpp:1063 #, c-format msgid "%s: Invalid Grid Subsquare" msgstr "%s: Subquadrat del locator no vàlid" #: tqslwiz.cpp:1067 #, c-format msgid "%s: Invalid Grid Sub-subsquare" msgstr "%s: Subquadrat del locator no vàlid" #: tqslwiz.cpp:1071 #, c-format msgid "%s: Invalid Gridsquare Format" msgstr "%s: Format del locator no vàlid" #: tqslwiz.cpp:1078 #, c-format msgid "" "Grid %s is not correct for your QTH. Click 'Next' again to use it anyway." msgstr "" "El Locator %s no és correcte per al teu QTH. Clica 'Següent' de nou per usar-" "lo igualment." #: tqslwiz.cpp:1112 #, c-format msgid "" "Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it " "anyway." msgstr "" "El locator %s no és correcta per a la teva entitat DXCC. Fes clic a " "\"Següent\" de nou per utilitzar-lo de totes maneres." #: tqslwiz.cpp:1115 #, c-format msgid "" "Grid %s is not correct for your %s. Click 'Next' again to use it anyway." msgstr "" "El locator %s no és correcta per al teu %s. Fes clic a \"Següent\" de nou " "per utilitzar-lo de totes maneres." #: tqslwiz.cpp:1141 #, c-format msgid "IOTA value %s is not valid." msgstr "El valor IOTA %s no és vàlid." #: tqslwiz.cpp:1149 #, c-format msgid "" "IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, " "OC- or SA-" msgstr "" "La IOTA %s no és correcte. Ha de començar per AF-, AN-, AS-, EU-, NA-, OC- o " "SA-" #: tqslwiz.cpp:1156 #, c-format msgid "IOTA reference %s is not correct. Must have a number after the '-'" msgstr "La IOTA %s no és correcte. Ha de tenir un número després del \"-\"" #: tqslwiz.cpp:1163 msgid "Invalid zone selections for state" msgstr "Seleccions de zones no vàlides per a l'estat" #: tqslwiz.cpp:1164 msgid "Invalid zone selections for province" msgstr "Seleccions de zones no vàlides per a la província" #: tqslwiz.cpp:1165 msgid "Invalid zone selections for oblast" msgstr "Seleccions de zones no vàlides per a l'àrea" #: tqslwiz.cpp:1166 msgid "Invalid zone selections for DXCC entity" msgstr "Seleccions de zones no vàlides per a l'entitat DXCC" #: tqslwiz.cpp:1315 msgid "Station Data input complete" msgstr "Entrada de dades de l'estació completa" #: tqslwiz.cpp:1319 msgid "Select or enter name of this station location" msgstr "Selecciona o introdueix el nom d'aquesta ubicació de l'estació" #: tqslwiz.cpp:1342 tqslwiz.cpp:1348 msgid "Station Location Name" msgstr "Nom d'ubicació de l'estació" #: tqslwiz.cpp:1386 msgid "Station name must be provided" msgstr "Cal introduir un nom de l'estació" #: wxutil.cpp:139 msgid "Memory allocation failure" msgstr "Fallada d'assignació de memòria" #: wxutil.cpp:140 msgid "Unable to initialize random number generator" msgstr "No es pot inicialitzar el generador de números aleatoris" #: wxutil.cpp:141 msgid "Invalid argument" msgstr "Argument no vàlid" #: wxutil.cpp:142 msgid "Operator aborted operation" msgstr "Operació avortada per l'operador" #: wxutil.cpp:143 msgid "No Certificate Request matches the selected Callsign Certificate" msgstr "" "El certificat d'indicatiu seleccionat no coincideix amb cap sol·licitud de " "certificat" #: wxutil.cpp:144 msgid "Buffer too small" msgstr "Buffer massa petit" #: wxutil.cpp:145 msgid "Invalid date format" msgstr "Format de data no vàlid" #: wxutil.cpp:146 msgid "Certificate not initialized for signing" msgstr "No s'ha inicialitzat el certificat per signar" #: wxutil.cpp:147 msgid "Passphrase not correct" msgstr "La contrasenya no és correcta" #: wxutil.cpp:148 msgid "Expected name" msgstr "S'esperava un nom" #: wxutil.cpp:149 msgid "Name exists" msgstr "El nom ja existeix" #: wxutil.cpp:150 msgid "Data for this DXCC entity could not be found" msgstr "No s'ha pogut trobar dades d'aquesta entitat DXCC" #: wxutil.cpp:151 msgid "Invalid time format" msgstr "Format d'hora no vàlid" #: wxutil.cpp:152 msgid "" "QSO date is not within the date range specified on your Callsign Certificate" msgstr "" "La data del QSO no està dins de l'interval de dates especificades al vostre " "certificat d'indicatiu" #: wxutil.cpp:153 msgid "Certificate provider not found" msgstr "El proveïdor de certificats no s'ha trobat" #: wxutil.cpp:154 msgid "No callsign certificate for key" msgstr "No hi ha cap certificat d'indicatiu per a la clau" #: wxutil.cpp:155 msgid "Configuration file cannot be opened" msgstr "No es pot obrir el fitxer de configuració" #: wxutil.cpp:156 msgid "" "The private key for this Callsign Certificate is not present on this " "computer; you can obtain it by loading a .tbk or .p12 file" msgstr "" "La clau privada per aquest certificat d'indicatiu no està present en aquest " "ordinador; pots aconseguir-lo carregant fitxer .tbk o .p12" #: wxutil.cpp:157 msgid "PKCS#12 file not TQSL compatible" msgstr "Fitxer PKCS#12 no compatible amb TQSL" #: wxutil.cpp:158 msgid "Callsign Certificate not TQSL compatible" msgstr "El certificat d'indicatiu no compatible amb TQSL" #: wxutil.cpp:159 msgid "Date out of range" msgstr "Data fora d'interval" #: wxutil.cpp:160 msgid "Previously Signed QSO detected" msgstr "S'ha detectat un QSO signat prèviament" #: wxutil.cpp:161 msgid "Database error" msgstr "Error de base de dades" #: wxutil.cpp:162 msgid "The selected station location could not be found" msgstr "No s'ha trobat la ubicació de l'estació seleccionada" #: wxutil.cpp:163 msgid "The selected callsign could not be found" msgstr "No es pot trobar l'indicatiu seleccionat" #: wxutil.cpp:164 msgid "The TQSL configuration file cannot be parsed" msgstr "El fitxer de configuració TQSL no pot ser analitzat" #: wxutil.cpp:165 msgid "This file can not be processed due to a system error" msgstr "Aquest fitxer no pot ser processat degut a un error de sistema" #: wxutil.cpp:166 msgid "The format of this file is incorrect." msgstr "El format d'aquest fitxer és incorrecte." #: wxutil.cpp:167 msgid "Callsign certificate could not be installed" msgstr "No s'ha pogut instal·lar el certificat d'indicatiu" #: wxutil.cpp:168 msgid "Callsign Certificate does not match QSO details" msgstr "El certificat d'indicatiu no coincideix amb els detalls del QSO" #: wxutil.cpp:169 msgid "Station Location does not match QSO details" msgstr "La ubicació de l'estació no coincideix amb els detalls del QSO" #: wxutil.cpp:170 msgid "New DB" msgstr "DB nou" #: wxutil.cpp:171 msgid "Gridsquare is inconsistent with Station Location" msgstr "El locator no és coherent amb la ubicació de l'estació" #: wxutil.cpp:172 msgid "ADIF field has invalid contents" msgstr "El fitxer ADIF té contingut no vàlid" #: wxutil.cpp:173 msgid "" "This Callsign Certificate cannot be installed as the first date where it is " "valid is in the future. Check if your computer is set to the proper date.\n" "\n" msgstr "" "Aquest certificat d'indicatiu no es pot instal·lar ja que la primera data en " "què és vàlid és en el futur. Comprova si el teu ordinador està configurat a " "la data adequada.\n" "\n" #: wxutil.cpp:174 msgid "" "This Callsign Certificate cannot be installed as it has expired. Check if " "your computer is set to the proper date and that this is the latest Callsign " "Certificate.\n" "\n" msgstr "" "Aquest certificat d'indicatiu no es pot instal·lar perquè ha caducat. " "Comprova si el teu ordinador està configurat a la data adequada i que aquest " "és l'últim certificat d'indicatiu.\n" "\n" #: wxutil.cpp:187 msgid "NO ERROR" msgstr "CAP ERROR" #: wxutil.cpp:190 msgid "Unknown custom error" msgstr "Error personalitzat desconegut" #: wxutil.cpp:197 msgid "" "TQSL is unable to sign QSOs because another instance of TQSL is busy.\n" "Terminate any other copies of TQSL and try again." msgstr "" "TQSL no pot signar QSO perquè una altra instància de TQSL està ocupada.\n" "Finalitza qualsevol altra còpia de TQSL i torna-ho a provar." #: wxutil.cpp:199 msgid "Database Error: %hs" msgstr "Error de base de dades: %hs" #: wxutil.cpp:201 msgid "Uploads database error" msgstr "Error de càrrega de la base de dades" #: wxutil.cpp:207 msgid "System error: %hs : %hs" msgstr "Error de sistema: %hs : %hs" #: wxutil.cpp:211 msgid "System error: %hs" msgstr "Error de sistema: %hs" #: wxutil.cpp:219 msgid "File syntax error: %hs" msgstr "Error de sintaxi del fitxer: %hs" #: wxutil.cpp:223 msgid "File syntax error" msgstr "Error de sintaxi del fitxer" #: wxutil.cpp:259 msgid "" "The private key for callsign %hs serial %ld is not present on this computer; " "you can obtain it by loading a .tbk or .p12 file" msgstr "" "La clau privada per a l'indicatiu %hs número de sèrie %ld no és present en " "aquest ordinador; pots aconseguir-lo carregant un fitxer .tbk o .p12" #: wxutil.cpp:266 #, c-format msgid "Invalid error code: %d" msgstr "Codi d'error invàlid: %d" #: wxutil.cpp:280 msgid "Station Location" msgstr "Ubicació de l'estació" #. TRANSLATORS: This message is for QSO details. For example, 'The Station Location GRIDSQUARE has value FM18ju while QSO has FM18jt' #: wxutil.cpp:283 msgid "The %s '%hs' has value '%hs' while QSO has '%hs'" msgstr "El %s '%hs' té valor '%hs', mentre que el QSO té '%hs'" #: wxutil.cpp:291 msgid "This log has invalid QSO information" msgstr "Aquest registre té informació de QSO no vàlids" #. TRANSLATORS: This message is for QSO details. For example, 'The log being signed has 'US County' set to Foobar which is not valid' #: wxutil.cpp:293 msgid "The log being signed has '%hs' set to value '%hs' which is not valid" msgstr "" "El registre que estàs signant té '%hs' establert amb el valor '%hs' que no " "és vàlid" #: wxutil.cpp:302 msgid "" "There is no valid callsign certificate for %hs in entity %hs available. This " "QSO cannot be signed" msgstr "" "No hi ha disponible cap certificat d'indicatiu vàlid per a %hs a l'entitat " "%hs . Aquest QSO no es pot signar" #: wxutil.cpp:310 msgid "ADIF content is not valid. '%hs' is not valid for %hs" msgstr "El contingut ADIF no és vàlid. '%hs' no és vàlid per a %hs" #: getpassword.h:51 msgid "New passphrase" msgstr "Nova contrasenya" #: getpassword.h:52 msgid "Enter new passphrase" msgstr "Introdueix la contrasenya" #: qsodatadialog.h:86 msgid "QSO Data" msgstr "Data del QSO" #: tqslvalidator.h:58 msgid "Date" msgstr "Data" #: tqslvalidator.h:69 msgid "Time" msgstr "Hora" #~ msgid "" #~ "TQSL must wait for other running copies of TQSL to exit before signing..." #~ msgstr "" #~ "TQSL ha d’esperar a que surtin altres còpies en curs de TQSL abans de " #~ "signar..." #~ msgid "The duplicates database is locked" #~ msgstr "La base de dades duplicada està bloquejada" #~ msgid "Already Uploaded QSOs Detected" #~ msgstr "QSO carregats ja detectats" #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and no new QSOs." #~ msgstr "" #~ "Aquest registre conté %d QSO que sembla que ja s'han signat per a la " #~ "càrrega a LoTW, i no hi ha QSO nous." #~ msgid "" #~ "Click 'Re-Upload QSOs' to re-process this log while allowing already " #~ "uploaded QSOs." #~ msgstr "" #~ "Fes clic a \"Torna a carregar els QSO\" per tornar a processar aquest " #~ "registre alhora que permet que els QSO ja s'hagin penjat." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and %d QSOs which are new." #~ msgstr "" #~ "Aquest registre conté %d QSO que sembla que ja s’han signat per a la " #~ "càrrega a LoTW, i %d QSO que són nous." #~ msgid "" #~ "Click 'New QSOs Only' to sign normally, without the already uploaded QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Fes clic a \"Només QSO nous\" per signar normalment, sense que els QSO ja " #~ "es pengin (Recomanat)." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and one QSO which is new." #~ msgstr "" #~ "Aquest registre conté %d QSO que sembla que ja s’han signat per a la " #~ "càrrega a LoTW, i un QSO que és nou." #~ msgid "" #~ "The only reason to re-sign already uploaded QSOs is if a previous upload " #~ "was not processed by LoTW, either because it was never uploaded, or there " #~ "was a server failure" #~ msgstr "" #~ "Els únics motius per tornar a signar QSO ja carregats és si LoTW no ha " #~ "processat una càrrega anterior, que mai es va penjar, o bé que hi ha " #~ "hagut un error al servidor" #, c-format #~ msgid "Already Uploaded: %d" #~ msgstr "Ja Penjat: %d" #, c-format #~ msgid "Already uploaded: %d" #~ msgstr "Ja penjat: %d" #~ msgid "All QSOs are already uploaded; aborted" #~ msgstr "Tots els QSO ja han penjat; avortat" #, c-format #~ msgid "%d of %d QSOs are already uploaded; aborted" #~ msgstr "%d de %d QSO ja han penjat; avortat" #, c-format #~ msgid "%s: %d QSO records were already uploaded" #~ msgstr "%s: %d Ja s'han penjat els registres de QSO" #~ msgid "" #~ "Resubmitting these QSOs will cause them to be reported as already " #~ "uploaded." #~ msgstr "" #~ "Tornar a enviar aquests QSO, farà que es notifiquin que ja es van penjar." #~ msgid "Display details of already uploaded QSOs when signing a log" #~ msgstr "Mostrar detalls de QSO ja pujats quan es signi un log o registre" #~ msgid "tQSL Certificates" #~ msgstr "certificats tQSL" #~ msgid "My current personal callsign" #~ msgstr "El meu indicatiu personal actual" #~ msgid "" #~ "My new personal callsign (I have a Callsign Certificate for my former " #~ "callsign)" #~ msgstr "" #~ "El meu nou indicatiu personal (tinc un certificat d'indicatiu per al meu " #~ "indicatiu anterior)" #~ msgid "" #~ "My former personal callsign or a portable modifier for my current or " #~ "former callsign" #~ msgstr "" #~ "El meu indicatiu de formador personal o un modificador portable per al " #~ "meu actual o indicatiu de formador" #~ msgid "A primary club callsign" #~ msgstr "Indicatiu de Ràdio Club primari" #~ msgid "" #~ "A secondary club callsign (I have a Callsign Certificate for the primary " #~ "club callsign)" #~ msgstr "" #~ "Un indicatiu de ràdio club secundari (tinc un certificat d'indicatiu per " #~ "al indicatiu principal del ràdio club)" #~ msgid "A DXpedition, Portable, or holiday operation with multiple operators" #~ msgstr "Una operació de DX, portàtil o de vacances amb diversos operadors" #~ msgid "" #~ "A DXpedition, Portable, or holiday operation where I am the only operator" #~ msgstr "Una operació de DX, portàtil o de vacances on sóc l’únic operador" #~ msgid "An operator that uses me as a QSL manager" #~ msgstr "Un operador amb QSL manager" #~ msgid "A special event callsign with multiple operators" #~ msgstr "Un indicatiu especial amb diversos operadors" #~ msgid "A special event callsign where I am the only operator" #~ msgstr "Un indicatiu especial amb un sol operador" #~ msgid "Please select a Callsign Certificate to validate your request." #~ msgstr "" #~ "Selecciona un certificat d'indicatiu per validar la teva sol·licitud." #~ msgid "This Callsign Certificate is for:" #~ msgstr "Aquest certificat d'indicatiu és per:" #~ msgid "" #~ "Please select your club's primary Callsign Certificate to validate your " #~ "request." #~ msgstr "" #~ "Selecciona el certificat principal d’assignació del teu ràdio club per " #~ "validar la teva sol·licitud." #~ msgid "" #~ "You have already requested more than three Callsign Certificates for %s " #~ "in the past 24 hours. You should submit a request only once, then wait " #~ "for that request to processed by LoTW Staff. This may take several " #~ "business days." #~ msgstr "" #~ "Ja has sol·licitat més de tres certificats d'indicatiu per a %s en les " #~ "darreres 24 hores. Hauries d’enviar una sol·licitud només una vegada i " #~ "esperar que el personal de LoTW la processés. Poden passar diversos dies " #~ "laborables." #~ msgid "" #~ "You are saying that the requested Certificate for %s belongs to the same " #~ "person as %hs and are using the selected Certificate to prove %hs's " #~ "identity." #~ msgstr "" #~ "Digues que el certificat sol·licitat per a %s pertany a la mateixa " #~ "persona que %hs i està utilitzant el certificat seleccionat per demostrar " #~ "la identitat de %hs." #~ msgid "" #~ "Callsign Certificate container files (*.p12;*.P12)|*.p12;*.P12|" #~ "Certificate Request response files (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgstr "" #~ "Carpeta de fitxers del certificat d'indicatiu (*.p12;*.P12)|*.p12;*.P12| " #~ "Fitxers de resposta de sol·licitud de certificat (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgid "" #~ "Callsign Certificate container files (*.p12)|*.p12|Certificate Request " #~ "response files (*.tq6)|*.tq6" #~ msgstr "" #~ "Carpeta de fitxers del certificat d'indicatiu (*.p12;*.p12)| Fitxers de " #~ "resposta de sol·licitud de certificat (*.tq6;*.tq6)|*.tq6" #~ msgid "Go to the first QSO in this log" #~ msgstr "Vés al primer QSO d’aquest registre" #~ msgid "Go to the previous QSO in this log" #~ msgstr "Vés al QSO anterior d’aquest registre" #~ msgid "Go to the next QSO in this log" #~ msgstr "Vés al següent QSO d’aquest registre" #~ msgid "Go to the last QSO in this log" #~ msgstr "Vés a l’últim QSO d’aquest registre" #~ msgid "No QSOs written" #~ msgstr "No hi ha QSO escrits" #~ msgid "Some QSOs suppressed" #~ msgstr "Alguns QSO s'han esborrat" #~ msgid "The file (%s) will be signed using:" #~ msgstr "El fitxer (%s) es signarà mitjançant:" #~ msgid "Station Location:" #~ msgstr "Ubicació de l'estació:" #~ msgid "DXCC:" #~ msgstr "DXCC:" #~ msgid "Is this correct?" #~ msgstr "És correcte això ?" #~ msgid "TQSL - Confirm signing" #~ msgstr "TQSL - Confirmeu la signatura" #~ msgid "%s: %d QSO records were outside the selected date range" #~ msgstr "" #~ "%s: %d Els registres de QSO estaven fora de l'interval de dates " #~ "seleccionat" #~ msgid "No records to upload" #~ msgstr "No hi ha registres a penjar" #~ msgid "Your certificate request did not upload properly" #~ msgstr "La teva sol·licitud de certificat no s'ha pujat adequadament" #~ msgid "Please try again." #~ msgstr "Si us plau, intenta-ho de nou." #~ msgid "Certificate Request:" #~ msgstr "Sol·licitud de certificat:" #~ msgid "Allow 'None' for " #~ msgstr "Permetre 'Cap' per " #~ msgid "%s: Invalid Grid Square Field" #~ msgstr "%s: camp Locator no vàlid" #~ msgid "%s: Invalid Subsquare" #~ msgstr "%s: subcasella no vàlida" #~ msgid "Already Uploaded QSO suppressed" #~ msgstr "El QSO pujat ja s'ha suprimit" #~ msgid "" #~ "There is no valid callsign certificate for %hs available. This QSO cannot " #~ "be signed" #~ msgstr "" #~ "No hi ha cap certificat vàlid disponible d'indicatiu per %hs . No es pot " #~ "signar aquest QSO" #~ msgid "Invalid, unusable" #~ msgstr "No vàlid, no utilitzable" #~ msgid "Certificates that are awaiting ARRL approval" #~ msgstr "Certificats que estan pendents de l'aprovació per part de l'ARRL" #~ msgid "" #~ "If so, choose a callsign below for the primary LoTW account. If not, " #~ "choose 'No', and a new LoTW account will be set up for these QSOs." #~ msgstr "" #~ "Si és així, tria a continuació un indicatiu per al compte LoTW principal. " #~ "Si no, tria \"No\" i es crearà un compte de LoTW nou per a aquests QSO." #~ msgid "" #~ "This is a Club call, I'm the QSL manager for this call, or this is a " #~ "DXpedition call" #~ msgstr "" #~ "Aquest és un indicatiu de Club, sóc el gestor de QSL d'aquest indicatiu, " #~ "o aquest és un indicatiu de DXpedition" #~ msgid "No, Create a new LoTW account for this call" #~ msgstr "No, crea un compte de LoTW nou per a aquest indicatiu" #~ msgid "Yes, Save these QSOs into an existing LoTW account" #~ msgstr "Sí, desa aquests QSO en un compte de LoTW existent" #~ msgid "Add QSOs for the new callsign to an existing LoTW account?" #~ msgstr "" #~ "Vols afegir els QSO per al nou indicatiu a un compte de LoTW existent?" #~ msgid "Since you have no callsign certificates, you must " #~ msgstr "Com que no tens cap certificat d'indicatiu, ho tens de fer " #~ msgid "" #~ "This portable callsign request requires approval using an existing " #~ "callsign certificate" #~ msgstr "" #~ "Aquesta sol·licitud d'indicatiu portable requereix de l'aprovació " #~ "mitjançant un certificat d'indicatiu existent" #~ msgid "" #~ "The callsign %s is not currently registered in the FCC ULS database as of " #~ "%s.\n" #~ "If this is a newly registered call, you must wait at least one business " #~ "day for it to be valid. Please enter a currently valid callsign." #~ msgstr "" #~ "L'indicatiu %s no està registrat actualment a la base de dades FCC ULS a " #~ "partir de %s.\n" #~ "Si es tracta d'un nou indicatiu registrat, has d'esperar almenys un dia " #~ "hàbil perquè sigui vàlid. Introdueix un indicatiu vàlid actual." #~ msgid "" #~ "Please select a callsign certificate for the account where you would like " #~ "the QSOs to be stored" #~ msgstr "" #~ "Selecciona un certificat d'indicatiu per al compte on vulguis que " #~ "s'emmagatzemin els QSO" #~ msgid "To submit the signed log file to LoTW:\n" #~ msgstr "Per enviar el fitxer de registre signat a LoTW:\n" #~ msgid "" #~ "My former personal callsign or a portable modifier for my current callsign" #~ msgstr "" #~ "El meu antic indicatiu personal o un modificador portable per al meu " #~ "indicatiu actual" #~ msgid "" #~ "You may protect this Callsign Certificate using a password. If you are " #~ "using a computer system that is shared with others, you should specify a " #~ "password to protect this Callsign Certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Pots protegir aquest certificat mitjançant una contrasenya o paraula de " #~ "pas. Si utilitzes un sistema informàtic que es comparteix amb altres, has " #~ "d’especificar una contrasenya per protegir aquest certificat d'indicatiu. " #~ "Tanmateix, si utilitzes un ordinador en una residència privada, no cal " #~ "que especifiquis cap contrasenya. Aquesta contrasenya no te relació amb " #~ "la que utilitzes per accedir a LoTW." #~ msgid "" #~ "Leave the password blank and click 'Next' unless you want to use a " #~ "password." #~ msgstr "" #~ "Deixa la contrasenya en blanc i fes clic a \"Següent\" tret que vulguis " #~ "utilitzar una contrasenya. Aquesta contrasenya no te relació amb la que " #~ "utilitzes per accedir a LoTW, es una paraula de pas per a aquest " #~ "certificat d'indicatiu." #~ msgid "Password:" #~ msgstr "Contrasenya:" #~ msgid "Enter the password again for verification:" #~ msgstr "Torna a introduir la contrasenya per verificar-la:" #~ msgid "" #~ "DO NOT lose the password you choose! You will be unable to use the " #~ "Certificate without this password!" #~ msgstr "" #~ "NO perdis la contrasenya triada ! No pots utilitzar el Certificat sense " #~ "contrasenya!" #~ msgid "" #~ "Leave the password blank and click 'Finish' unless you want to use a " #~ "password." #~ msgstr "" #~ "Deixa la contrasenya en blanc i fes clic a \"Finalitzar\" tret que " #~ "vulguis utilitzar una contrasenya o paraula de pas per aquest certificat." #~ msgid "The two copies of the password do not match." #~ msgstr "Les dues còpies de la contrasenya no coincideixen." #~ msgid "New password:" #~ msgstr "Contrasenya nova" #~ msgid "Password entries do not match" #~ msgstr "Les contrasenyes no coincideixen" #~ msgid "Password confirmed" #~ msgstr "Contrasenya confirmada" #~ msgid "Enter a password for this callsign certificate." #~ msgstr "Introdueix una contrasenya per a aquest certificat d'indicatiu." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence no password need be specified." #~ msgstr "" #~ "Si utilitzes un sistema informàtic que es comparteix amb altres, has " #~ "d’especificar una contrasenya o paraula de pas per protegir aquest " #~ "certificat. Tanmateix, si utilitzes un ordinador en una residència " #~ "privada no cal que especifiquis cap contrasenya." #~ msgid "" #~ "This password will have to be entered each time you use this callsign " #~ "certificate for signing or when saving the key." #~ msgstr "" #~ "Aquesta contrasenya l’hauràs d’introduir cada vegada que utilitzis aquest " #~ "certificat d'indicatiu per signar o quan guardis la clau." #~ msgid "" #~ "Leave the password blank and click 'OK' unless you want to use a password." #~ msgstr "" #~ "Deixa la contrasenya en blanc i fes clic a \"D'acord\" tret de que " #~ "vulguis utilitzar una contrasenya." #~ msgid "New Password" #~ msgstr "Contrasenya nova" #~ msgid "Enter the password to unlock the .p12 file:" #~ msgstr "Introdueix la contrasenya per desbloquejar el fitxer .p12:" #~ msgid "Password error" #~ msgstr "Error de contrasenya" #~ msgid "" #~ "Enter the password to unlock the callsign certificate for %hs -- %hs\n" #~ "(This is the password you made up when you installed the callsign " #~ "certificate.)" #~ msgstr "" #~ "Introdueix la contrasenya per desbloquejar el certificat d'indicatiu per " #~ "a %hs -- %hs\n" #~ "(Aquesta és la contrasenya que has creat al instal·lar el certificat " #~ "d'indicatiu, i no té res a veure amb la que utilitzes per accedir a LoTW)." #~ msgid "Enter password" #~ msgstr "Introdueix la contrasenya" #~ msgid "Password for the signing key" #~ msgstr "Contrasenya de la clau de signatura" #~ msgid "Enter the password for the certificate container file." #~ msgstr "Introduir la contrasenya per al contenidor de certificats." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Si estàs fent servir un ordinador compartit, cal que especifiquis una " #~ "contrasenya per protegir aquest certificat. No obstant això, si estàs " #~ "fent servir un ordinador en residència privada, no cal especificar cap " #~ "contrasenya. Aquesta contrasenya no té res a veure amb la que utilitzeu " #~ "per accedir a LoTW." #~ msgid "" #~ "You will have to enter the password any time you load the file into " #~ "TrustedQSL." #~ msgstr "" #~ "Hauràs d'introduir la contrasenya cada cop que carreguis el fitxer al " #~ "TrustedQSL." #~ msgid "Certificate Container Password" #~ msgstr "Contrasenya del contenidor de certificats" #~ msgid "Password: " #~ msgstr "Contrasenya: " #~ msgid "Password protected" #~ msgstr "Contrasenya protegida" #~ msgid "Enter the password to unlock the callsign certificate" #~ msgstr "" #~ "Introdueix la contrasenya per desbloquejar el certificat d'indicatiu" #~ msgid "Enable passwords for Callsign Certificates" #~ msgstr "Habilitar contrasenyes per a certificats d'indicatius" #~ msgid "Password not correct" #~ msgstr "Contrasenya incorrecta" #~ msgid "New password" #~ msgstr "Nova contrasenya" #~ msgid "Enter new password" #~ msgstr "Entra una nova contrasenya" tqsl-2.8.1/apps/lang/ca_ES/wxstd-3.2.mo0000644000175000017500000045644015003421124017354 0ustar rmurphyrmurphy== z?1?3s Ƥ Ӥ  =]y ȥ ۥ  &,1^ox    Φ٦ ߦ  !)27FNV_ev} ҧڧ  $*3;BRZ `n  Ũ٨  $/5; BOTZox} ǩ˩ԩ   ) 9 FP d nzêʪҪ ت (5;JR[dm  ëǫܫ"84V$$"լ!% , :FU\^actvz~ ʭխ ׭ +>F W d p }#/׮/315e6ү) ?`xðذ "?UmDZ۱   $/7U4k.ϲ޲  1A U`6p5³"" >:K ϴ ״ 1Kb~ ׵ *D!c"-¶10"(S| Ƿ !(< KViov   ƸѸ)C]x0 Fǹ),Vu%#"*+(V&%ƻ%6I"f?ɼ919 k$! (((Q-z%3ξ -;i %ֿ9)W )#9']" %C JW _j| B)'-!U)w+,"6Y&u#)$&6Uh | 3"5$S#x + ( 3%O$u &!&#+"O#r*!# .@IO/V N*R(e)  ("*CKPC_$ 26'i!!(7O.o'#C#.Rn(99Vg|  ",:1g0%%07!I#k    *;&Y-  ~Yi ""2 Q<2"  -8=CJ-Q)  1Rr &AXu L Z`$ +%Hn  )J0,{$ 23F$z/1*.Hw -" 0C"t9$0'"C&f"$8'GG!+/A 1O.2)"L2d/7/8%h##3; =F"(%$ 7TX*(((D$m$'"*8c!5$= ]+~.-$C"a#"+ '6 ^-'":5R'&-S%/y4&,22)e-&& +)U(t-!;0))Z323 -=k$;)*2T! **=["y(   &+HYa gr x/ J!7Y w 4 'Eek} #!3#U2y8 %3J[`i|* '#,@E Z e s2  ,1/@p" '6Vn QwZ?1$q72)+C$_j%&+L%x/35T[nt- *"((B#k66#M8q1%A![}!!!1 Jk& /-H eo th~%6Pe%2:@6E |0    #!)Eo | ? I S _ j u          & 2 < I U`r {             0 8  ?  J  V a &z           ' !0 "R Cu   ' +  8 = B J N ` x       * & 1 O a  $  %%6\w')& '.(Nw7!@ FP Ycv:06go v8(/B_v#)9Rg$%$ /$Lq$$$7$Ty$$   &1 7B0S&  #"C1f9    )3 <J P^ t ( &4=EVf w 3  )H2 { %"(,16G!O3q2'3Z0# "+DN     $-C.r  ! )4/Jz$ O!  2 >  R _ h <     !!%>! d!n!)!!#!!?!4"D"K"["t""""""'"%#;#*X########### #-$1<$+n$%$)$$ $$%#%*%2% 7%6E%|%% % %%%%%% &&&6&Q&l&&#&&&&' '' '#',6'0c'''''' (&(;(Q(ze((() )03)d)o)g*-~***'** +&$+K+[+/l++++++,,,,F,Y,t,,,,,N,#7-[-n-. .;.M.d.|..... .!/'/'7/_/*r////// 000L0l00M1\a1171a2j2OC3@3Y3#.4R4e4Bv444445 555)5 :5F5AK555555%5L6a666636*6 7@7#Z7$~7#7!7 7# 8 .83O88*8$8 8& 9!49V9t9"99 9 999,98:Q:0k:$:::$:';.;$F;'k;;;;";;#<,<J<i< <<!<<=$=#B=$f=#===!= >"&>I>f>>> >>>?,?4?+K?w??'?&??@-@@@R@m@@@+@@ @A A8A;ANA hA rA"~A AfAB&B,BHB bBBBBBBB,C CCC(CD(D .D9D JDVD ]D iDtDD"D.D-D&EAEYE&rEEEEEE"F9F!RFtF"FF,FF1G$HG%mGGG/G<G HH H#H+H 4H AH;MHH:ITI0pI=I;I>J;ZJ5JJcKyK96L,pLL.gM-M!M MMNN N&NN#N/!O0QOO-OOO*P(-P#VP'zP'P"PP Q %Q FQ!gQ$QQQ)QQQR RR%R",R ORZRaR/jRRR#RR/S:5S pS zS SSSS SS5S" T90T:jT/TTT T TTTU!U'U+FU"rU(UUU#U V0VAVHVYVkV}VVVVVVV WW2WFWXWiW|WWWWWWWWXX3XIXaXxXXXXXXX Y"Y7YPYeY~YYYYYY ZZ1ZCZUZkZ~ZZZZZZZ[[5[J[a[w[[[[[[\\0\F\\\s\\\\\\\\]&]9]N]g]]]]]]]]^^9^S^n^^^^^ ^^^ _$_ <_]_y__ ___` ` `` $`2`(;`d`k`p`w`"{` ```` `&`)a*a>a EaPa Yaeama aa-aaaabb0b@b$Rbwb {bbbbbb c(c@cZcyc cccc d*d!Idkddddde"e@e\eteeeeCef f ff$f"-fPfcfhf pf zf f f$fff fffg 5g Cg dgog wg"gg gg|h3h*hh h iiZi=ljj3jjjkkk)k2k AkOk_kgk pkzk kkk#k$k k l",lOl Ql[ldl wll l llll9lm)m2m ;mFm `mlmtmm m m mmmmm n nn"n1n 9n EnQnZnnnvn}nn nn nn.n nn oo"o)o0oBoKo So ]ohopoooo!oo oo o ppp)p0pLp epsp {ppp pp p pp ppppq q qq/qAqRqVq ^qhqqqzqqqqqqqq rr "r 0rt"at8t+t't&u48umuquyu u uuuuuuuuuuuuuuuuuu u v v v ,v:v w JwVw _w$iw6wwww3w8x<Vxxxxxx"y%yB߀4"+W  Ɓ  $*3H_o   ӂ  (?Vm: ǃԃS);7e("Ƅ% 0/1`/8…2:.)i43ȆB)?)iF!ڇ)H&@o32"::+u %3҉@AG/O% -/H]$$& 22$e*+9&+B%n**D;/Pk*8 *,WiƏ͏ݏ 6KE01֐1/:3jE115H)~70..@0o21ӓ)8CQ +ڔ!9(<b-1͕)8)'b7=–+/,,\/5:,*?W*5˜  $;CI<O T5S),} @   *47 l"wA +"K6n$Xʜ4#8X$-6'$C'h@:ў6 XC0*͟ 9IS"+E2DZo ɡ$/IT@@ߢ: 3[,ɣ. %/Hd {Ф /(5X1 ˥ӥ& Ʀ%Ѧ( 9IS::!u ר2(+T Zd+zѩ!"!1Sn"ڪ(3,\)#,׫.3 ESf457+,c/$>$GC$Ǯޮ"%> ]Wg>#",:;g<E.&:U='α;@2,s/&в%@K^?/F*a9!ƴ*-)A*kBٵ%F'eB=жPU_=&+;F>4޸%E9B?¹E2H.{-DغCFa+#ԻB);5e.wʼ!B:d33ӽ5-=1k5Ӿ&40O$/?տ2*H(s*%89&:`%'%-/=/m361;:0v,:.,>_kB=1L8~@aAZC0<>N/=19-3g?.6 JA:W>@^=D,"=O@&22(/[CA>1P 35B %P3v!8!7H P]d$j0"*AQsd8.@Shay*&EI.Q" HRZ&n$.AH+t +#(.'5$] ) #:<K)& &  "(+>6j;'(..L%{) qjfW'RB?6 $).N'}2H4{,4!1HE ;,5FZ n0|2*(3!\~BB%$JJC$#"F!b!!!> Yz$ , ;T rz.DMi~)9X#w H = ^n.088Az  v           & 3 =I R ^ j t          * 2 = HVjq*x8,+1:)K u  ) J' r $$!  *E] x 9<E!gO380l554  >DJ6$ $$*6O 5<5T  9:V!t-  R5=CF'  ) "4(W#   &;%[ &%%/U%u%%'%Gm%%   <Xap/- !9 Yz%5?0 N\en  "?1Cb3u:%*;U k x  # 01b%" [ G Q \fy 03 &.7>W&`B=r?>'/W^f{ (Q : JVj{.6TEcj ,>5V(2 __u|.aB U %g +  $ )  % +/ 2[  .  a K a g z    # $ $ ;D E 1 ? 08 i p        " 9 ,)A-k/ %+73kq x "  ))3S1030O f  1(9Xp  !-.2}Ks=0] /%%<B33Rh%w9/OoZ-'=1 8S'f!%& L/m3*I$t7yRR83pliY  ?L!!!Z! """?"B"[" c"o"x"" ""X"####B#(^#*#^#!$3$+<$*h$C$>$,%"C%)f%/%7%+%+$&6P&2&G&!'5$'-Z','*'0',(/>(9n(( ( (((6(U,))9)A)* *(<*+e**(*+*++6+,H+u+-+!+#+&,,/,\,-{,!,#,*,--*H--s-%-%-)-.)2.\. z.,..-.!/#7/[/ w//6/'//80.M09|00&00$161'U1}11111$1 2"2(2<2Z2b2.r2 22:3R3,X3-3!333.3."4Q4a4F 5g5v5z5(5(5556 6%6 ,6 86C6_6$}616/6!7&7A7)^77777 7'8D8(a818:8!849(N99w98919:!:3%:IY::::::::F:>;,;.<+/<X[<Y<\=Uk=Y=>'>>6?'?@4@8A4QAA/AAAAA+B.4BcB>BIB, CC8CM|C,C7C0/D`D7D<D7D5,E4bE,E!E*E+F8=F-vF:FF.FKGaG%dGG(G GG&GGGH1H9H)RH=|H<HDHKNZNuNNNNNNN O &OGObO|OOOOOOP+PCPLPRPaPuPPPPPPPQ!Q9QNQgQQ QQQQQRR6R QR[RcRkRsR{RRR RRRRR R R R RR RRRRSSS+S;S?SDSJSRS"VSyS S SSSSS SSS S TTT%T+TCTTVT TTTT-TT#U3U6U!9U.[U5UUUU U VVV7V>V@DV VVVVVVW>WSWWW_WfWkW qW{W WW WWW W WWWWWX X )X4XEXZXqXXXXXXXXKX,Y2Y9YAYFY-LY[zYYYY Y Y Y% Z1Z LZWZhZ~Z"Z!Z6Z [ ([ 2[&?['f[#[[d\=~\5\\\!\]8hxu|{y^%W4{`Ja='s(zpb3_Jk*La`T:aV}+.CDf$0s0j2{:EpFAW4 NP--E|P;S &;Y@uyZ|C$Ona=oJITV?v%/<?2v90,/ZqdPYEi> 3$/=K1 )p[#3YyiS}d7kaP|qb 1+G$$svWsR#@S6e Tdo@EbxK[q)^r98+X* zN`84IO>w.#{f*>y f:k*,^_.1ryBN>cBppsAh\/PdBDgd2jDx<$tL:QbU !~tQ,5)}h]ZW)zE!2$"B/MuCn0J>@])Q CHM@ Kt-Ago?x/5)2 v41K"G^ we 7&b!q8G+WO t/RlnE'?%kh-,6^ FzB'Nh7>+w  ^\K'_UtNgkRP_iv[rx)N} =?0##sT*qB=I nHEFDnm pMJdcoH4a}~`2{C oj8c6Opk.0J1M[iYIM Xt%`cV>?,OR(`S/g|P<b]DL-' -TQgmme[eLU:vM99RL\_kLw6.ge"+8zC9oT(molHA; ;`UmO(XWOsAw=AHaI+#l| ~R}SB%p]^53 ]hY;3j\Hx?RoGeA!Gn45Ff%Q*::$\>  7em Fi(u; ) GqX'g8:,96Z\v4P.L&[c"6m&1jr7;Urys6 F3G3]hw-RZ|_L"&CiU?X{\""2NU QIct~,!xnV1'=nY&.<U.IfqrgdcY VTK~<wZy<<ybD&5[d2AH#SD~ Xeh%j@ != {i Hcw S~50C^u6,]1uM<tj+Mq5]bJv#OXia'4lG F5!9Z@;  (8V*_Y|9lzWm! Q_f%l"zSWurVF {3 @}lxTVfrK}7`-~ \f lX(&([jD*EJZ0QNu77kzIKB Please send this report to the program maintainer, thank you! Thank you and we're sorry for the inconvenience! (copy %d of %d) (error %ld: %s) (in module "%s") - Preview bold extra bold extra heavy extra light heavy italic light medium semi bold strikethrough thin#10 Envelope, 4 1/8 x 9 1/2 in#11 Envelope, 4 1/2 x 10 3/8 in#12 Envelope, 4 3/4 x 11 in#14 Envelope, 5 x 11 1/2 in#9 Envelope, 3 7/8 x 8 7/8 in%%d of %lu%i of %u%ld byte%ld bytes%lu of %lu%s (%d items)%s (or %s)%s Error%s Information%s Preferences%s Warning%s did not fit the tar header for entry '%s'%s files (%s)|%s%u of %u&About&Actual Size&After a paragraph:&Alignment&Apply&Apply Style&Arrange Icons&Ascending&Back&Based on:&Before a paragraph:&Bg colour:&Blur distance:&Bold&Bottom&Bottom:&Box&Bullet style:&CD-ROM&Cancel&Cascade&Cell&Character code:&Clear&Close&Color&Colour:&Convert&Copy&Copy URL&Customize...&Debug report preview:&Delete&Delete Style...&Descending&Details&Down&Edit&Edit Style...&Execute&File&Find...&Finish&First&Floating mode:&Floppy&Font&Font family:&Font for Level...&Font:&Forward&From:&Harddisk&Height:&Help&Hide details&Home&Horizontal offset:&Indentation (tenths of a mm)&Indeterminate&Index&Info&Italic&Jump to&Justified&Last&Left&Left:&List level:&Log&Move&Move the object to:&Network&New&Next&Next >&Next Paragraph&Next Tip&Next style:&No&Notes:&Number:&OK&Open...&Outline level:&Page Break&Paste&Picture&Point size:&Position (tenths of a mm):&Position mode:&Preferences&Previous&Previous Paragraph&Print...&Properties&Quit&Redo&Redo &Rename Style...&Replace&Restart numbering&Restore&Right&Right:&Save&See details&Show tips at startup&Size&Size:&Skip&Spacing (tenths of a mm)&Spell Check&Stop&Strikethrough&Style:&Styles:&Subset:&Symbol:&Synchronize values&Table&Top&Top:&Underline&Underlining:&Undo&Undo &Unindent&Up&Vertical alignment:&Vertical offset:&View...&Weight:&Width:&Window&Yes'%s' contains invalid character(s)'%s' has extra '..', ignored.'%s' is not a correct numeric value for option '%s'.'%s' is not a valid message catalog.'%s' is not one of the valid strings'%s' is one of the invalid strings'%s' is probably a binary buffer.(*)(Help)(None)(Normal text)(bookmarks)(error %d: %s)(none)**)+, 64-bit edition-...1.11.21.31.41.51.61.71.81.910 x 11 in10 x 14 in11 x 17 in12 x 11 in15 x 11 in26 3/4 Envelope, 3 5/8 x 6 1/2 in9 x 11 in: file does not exist!: unknown charset: unknown encoding< &Back

Bold italic face.
bold italic underlined
Bold face. Italic face. >A debug report has been generated in the directory A debug report has been generated. It can be found inA non empty collection must consist of 'element' nodesA standard bullet name.A0 sheet, 841 x 1189 mmA1 sheet, 594 x 841 mmA2 420 x 594 mmA3 Extra 322 x 445 mmA3 Extra Transverse 322 x 445 mmA3 Rotated 420 x 297 mmA3 Transverse 297 x 420 mmA3 sheet, 297 x 420 mmA4 Extra 9.27 x 12.69 inA4 Plus 210 x 330 mmA4 Rotated 297 x 210 mmA4 Transverse 210 x 297 mmA4 sheet, 210 x 297 mmA4 small sheet, 210 x 297 mmA5 Extra 174 x 235 mmA5 Rotated 210 x 148 mmA5 Transverse 148 x 210 mmA5 sheet, 148 x 210 mmA6 105 x 148 mmA6 Rotated 148 x 105 mmABCDEFGabcdefg12345ASCIIAboutAbout %sAbsoluteActiveBorderActiveCaptionActual SizeAddAdd ColumnAdd RowAdd current page to bookmarksAdd to custom coloursAddToPropertyCollection called on a generic accessorAddToPropertyCollection called w/o valid adderAdding book %sAdvancedAfter a paragraph:Align LeftAlign RightAlignmentAllAll files (%s)|%sAll files (*)|*All files (*.*)|*.*All stylesAlphabetic ModeAlready Registered Object passed to SetObjectClassInfoAlready dialling ISP.Alt+An optional corner radius for adding rounded corners.And includes the following files: Animation file is not of type %ld.AppWorkspaceAppend log to file '%s' (choosing [No] will overwrite it)?ApplicationApplyAquaArabicArabic (ISO-8859-6)Argument %u not found.ArtistsAscendingAttributesAvailable fonts.B4 (ISO) 250 x 353 mmB4 (JIS) Rotated 364 x 257 mmB4 Envelope, 250 x 353 mmB4 sheet, 250 x 354 mmB5 (ISO) Extra 201 x 276 mmB5 (JIS) Rotated 257 x 182 mmB5 (JIS) Transverse 182 x 257 mmB5 Envelope, 176 x 250 mmB5 sheet, 182 x 257 millimeterB6 (JIS) 128 x 182 mmB6 (JIS) Rotated 182 x 128 mmB6 Envelope, 176 x 125 mmBMP: Couldn't allocate memory.BMP: Couldn't save invalid image.BMP: Couldn't write RGB color map.BMP: Couldn't write data.BMP: Couldn't write the file (Bitmap) header.BMP: Couldn't write the file (BitmapInfo) header.BMP: header has biClrUsed=%d when biBitCount=%d.BMP: wxImage doesn't have own wxPalette.BackBackgroundBackground &colour:Background colourBaltic (ISO-8859-13)Baltic (old) (ISO-8859-4)Before a paragraph:BitmapBlackBlueBlue:BoldBorderBordersBottomBottom margin (mm):Box PropertiesBox stylesBring All to FrontBrownBrowseBullet &Alignment:Bullet styleBulletsButtonFaceButtonHighlightButtonShadowButtonTextC sheet, 17 x 22 inC&learC&olour:C3 Envelope, 324 x 458 mmC4 Envelope, 229 x 324 mmC5 Envelope, 162 x 229 mmC6 Envelope, 114 x 162 mmC65 Envelope, 114 x 229 mmCD-ROMCHM handler currently supports only local files!Ca&pitalsCan't &Undo Can't automatically determine the image format for non-seekable input.Can't close registry key '%s'Can't copy values of unsupported type %d.Can't create registry key '%s'Can't create threadCan't delete key '%s'Can't delete the INI file '%s'Can't delete value '%s' from key '%s'Can't enumerate subkeys of key '%s'Can't enumerate values of key '%s'Can't export value of unsupported type %d.Can't find current position in file '%s'Can't get info about registry key '%s'Can't get the JavaScript objectCan't initialize zlib deflate stream.Can't initialize zlib inflate stream.Can't monitor non-existent directory "%s" for changes.Can't open registry key '%s'Can't read from inflate stream: %sCan't read inflate stream: unexpected EOF in underlying stream.Can't read value of '%s'Can't read value of key '%s'Can't run JavaScript script without a valid HTML documentCan't save image to file '%s': unknown extension.Can't save log contents to file.Can't set thread priorityCan't set value of '%s'Can't write to child process's stdinCan't write to deflate stream: %sCancelCannot enumerate files '%s'Cannot enumerate files in directory '%s'Cannot find active dialup connection: %sCannot find the location of address book fileCannot get an active instance of "%s"Cannot get priority range for scheduling policy %d.Cannot get the hostnameCannot get the official hostnameCannot hang up - no active dialup connection.Cannot initialize OLECannot initialize socketsCannot load icon from '%s'.Cannot load resources from '%s'.Cannot load resources from file '%s'.Cannot open HTML document: %sCannot open HTML help book: %sCannot open contents file: %sCannot open file for PostScript printing!Cannot open index file: %sCannot open resources file '%s'.Cannot print empty page.Cannot read typename from '%s'!Cannot resume thread %lxCannot retrieve thread scheduling policy.Cannot set locale to language "%s".Cannot start thread: error writing TLS.Cannot suspend thread %lxCannot wait for thread terminationCaptionTextCase sensitiveCategorized ModeCell PropertiesCeltic (ISO-8859-14)Cen&tredCenteredCentral European (ISO-8859-2)CentreCentre text.CentredCh&oose...Change List StyleChange Object StyleChange PropertiesChange StyleChanges won't be saved to avoid overwriting the existing file "%s"Changing current directory to "%s" failedCharacter stylesCheck to add a period after the bullet.Check to add a right parenthesis.Check to edit all borders simultaneously.Check to enclose the bullet in parentheses.Check to indicate right-to-left text layout.Check to make the font bold.Check to make the font italic.Check to make the font underlined.Check to restart numbering.Check to show a line through the text.Check to show the text in capitals.Check to show the text in small capitals.Check to show the text in subscript.Check to show the text in superscript.Check to suppress hyphenation.Choose ISP to dialChoose a directory:Choose a fileChoose colourChoose fontCircular dependency involving module "%s" detected.Cl&oseClass not registered.ClearClear the log contentsClick to apply the selected style.Click to browse for a symbol.Click to cancel changes to the font.Click to cancel the font selection.Click to change the font colour.Click to change the text background colour.Click to change the text colour.Click to choose the font for this level.Click to close this window.Click to confirm changes to the font.Click to confirm the font selection.Click to create a new box style.Click to create a new character style.Click to create a new list style.Click to create a new paragraph style.Click to create a new tab position.Click to delete all tab positions.Click to delete the selected style.Click to delete the selected tab position.Click to edit the selected style.Click to rename the selected style.CloseClose AllClose current documentClose this windowCollapseColorColourColour selection dialog failed with error %0lx.Colour:Column %uCommand line argument %d couldn't be converted to Unicode and will be ignored.Common dialog failed with error code %0lx.Compositing not supported by this system, please enable it in your Window Manager.Compressed HTML Help file (*.chm)|*.chm|ComputerConfig entry name cannot start with '%c'.ConfirmConnecting...ContentsControlDarkControlLightConversion to charset '%s' doesn't work.ConvertCopied to clipboard:"%s"Copies:CopyCopy selectionCopying more than one selected block to clipboard is not supported.CornerCorner &radius:Could not create temporary file '%s'Could not extract %s into %s: %sCould not find tab for idCould not locate file '%s'.Could not register custom DirectWrite font loader.Could not set current working directoryCould not start document preview.Could not start printing.Could not transfer data to windowCouldn't add an image to the image list.Couldn't create OpenGL contextCouldn't create a timerCouldn't enumerate translationsCouldn't find symbol '%s' in a dynamic libraryCouldn't get the current thread pointerCouldn't initialize GIF hash table.Couldn't load a PNG image - file is corrupted or not enough memory.Couldn't load sound data from '%s'.Couldn't obtain folder nameCouldn't open audio: %sCouldn't register clipboard format '%s'.Couldn't retrieve information about list control item %d.Couldn't save PNG image.Couldn't terminate threadCreate Parameter %s not found in declared RTTI ParametersCreate directoryCreate new directoryCreate new documentCreating %s "%s" failed.Cu&tCurrent directory:CustomCustom sizeCustomize ColumnsCutCut selectionCyrillic (ISO-8859-5)D sheet, 22 x 34 inDDE poke request failedDIB Header: Encoding doesn't match bitdepth.DIB Header: Image height > 32767 pixels for file.DIB Header: Image width > 32767 pixels for file.DIB Header: Unknown bitdepth in file.DIB Header: Unknown encoding in file.DL Envelope, 110 x 220 mmDashedDebug report "%s"Debug report couldn't be created.Debug report generation has failed.DecorativeDefault encodingDefault fontDefault printerDeleteDelete A&llDelete ColumnDelete RowDelete StyleDelete TextDelete itemDelete selectionDelete style %s?Deleted stale lock file '%s'.Deleting password for "%s" failed: %s.Dependency "%s" of module "%s" doesn't exist.DescendingDesktopDeveloped by DevelopersDial up functions are unavailable because the remote access service (RAS) is not installed on this machine. Please install it.Did you know...DirectFB error %d occurred.DirectoriesDirectory '%s' couldn't be createdDirectory '%s' couldn't be deletedDirectory does not existDirectory doesn't exist.Discard changes and reload the last saved version?Display all index items that contain given substring. Search is case insensitive.Display options dialogDisplays help as you browse the books on the left.Do you want to save changes to %s?Document:Documentation by Documentation writersDon't SaveDoneDone.DottedDoubleDouble Japanese Postcard Rotated 148 x 200 mmDoubly used id : %dDownDragE sheet, 34 x 44 inEOF while reading from inotify descriptorEditEdit itemElapsed time:Enable the height value.Enable the maximum width value.Enable the minimum height value.Enable the minimum width value.Enable the width value.Enable vertical alignment.Enables a background colour.Enables a shadow.Enables the blur distance.Enables the shadow colour.Enables the shadow opacity.Enables the shadow spread.Enter a box style nameEnter a character style nameEnter a list style nameEnter a new style nameEnter a paragraph style nameEnter command to open file "%s":Entries foundEnvelope Invite 220 x 220 mmEnvironment variables expansion failed: missing '%c' at position %u in '%s'.ErrorError closing epoll descriptorError closing kqueue instanceError copying the file '%s' to '%s'.Error creating directoryError in reading image DIB.Error in resource: %sError reading config options.Error running JavaScript: %sError saving user configuration data.Error while printing: Error: Error: %s (%d)Esperanto (ISO-8859-3)Estimated time:Executable files (*.exe)|*.exe|ExecuteExecution of command '%s' failedExecutive, 7 1/4 x 10 1/2 inExpandExporting registry key: file "%s" already exists and won't be overwritten.Extended Unix Codepage for Japanese (EUC-JP)Extraction of '%s' into '%s' failed.Face NameFailed to access lock file.Failed to add custom font "%s".Failed to add descriptor %d to epoll descriptor %dFailed to allocate %luKb of memory for bitmap data.Failed to allocate colour for OpenGLFailed to allocate memory for LZMA compression.Failed to allocate memory for LZMA decompression.Failed to change video modeFailed to check format of image file "%s".Failed to clean up debug report directory "%s"Failed to close file handleFailed to close lock file '%s'Failed to close the clipboard.Failed to close the display "%s"Failed to connect: missing username/password.Failed to connect: no ISP to dial.Failed to copy dialog contents to the clipboard.Failed to copy registry value '%s'Failed to copy the contents of registry key '%s' to '%s'.Failed to copy the file '%s' to '%s'Failed to copy the registry subkey '%s' to '%s'.Failed to create DDE stringFailed to create MDI parent frame.Failed to create a temporary file nameFailed to create an anonymous pipeFailed to create an instance of "%s"Failed to create connection to server '%s' on topic '%s'Failed to create cursor.Failed to create directory "%s"Failed to create directory '%s' (Do you have the required permissions?)Failed to create epoll descriptorFailed to create font configuration object.Failed to create registry entry for '%s' files.Failed to create the standard find/replace dialog (error code %d)Failed to create wake up pipe used by event loop.Failed to display HTML document in %s encodingFailed to empty the clipboard.Failed to enumerate video modesFailed to establish an advise loop with DDE serverFailed to establish dialup connection: %sFailed to execute '%s' Failed to execute curl, please install it in PATH.Failed to find CLSID of "%s"Failed to find match for regular expression: %sFailed to find web view emulation level in the registryFailed to get ISP names: %sFailed to get OLE automation interface for "%s"Failed to get data from the clipboardFailed to get the local system timeFailed to get the working directoryFailed to initialize GUI: no built-in themes found.Failed to initialize LZMA compression: unexpected error %u.Failed to initialize LZMA decompression: unexpected error %u.Failed to initialize MS HTML Help.Failed to initialize OpenGLFailed to initiate dialup connection: %sFailed to insert text in the control.Failed to inspect the lock file '%s'Failed to install signal handlerFailed to join a thread, potential memory leak detected - please restart the programFailed to kill process %dFailed to load bitmap "%s" from resources.Failed to load icon "%s" from resources.Failed to load icons from resource '%s'.Failed to load image %%d from file '%s'.Failed to load image %d from stream.Failed to load image from file "%s".Failed to load metafile from file "%s".Failed to load mpr.dll.Failed to load resource "%s".Failed to load shared library '%s'Failed to load sound from "%s" (error %d).Failed to lock resource "%s".Failed to lock the lock file '%s'Failed to modify descriptor %d in epoll descriptor %dFailed to modify file times for '%s'Failed to monitor I/O channelsFailed to open '%s' for readingFailed to open '%s' for writingFailed to open CHM archive '%s'.Failed to open URL "%s" in default browser.Failed to open URL "%s" in the default browserFailed to open directory "%s" for monitoring.Failed to open display "%s".Failed to open temporary file.Failed to open the clipboard.Failed to parse Plural-Forms: '%s'Failed to prepare playing "%s".Failed to put data on the clipboardFailed to read PID from lock file.Failed to read config options.Failed to read document from the file "%s".Failed to read event from DirectFB pipeFailed to read from wake-up pipeFailed to read text file "%s".Failed to redirect child process input/outputFailed to redirect the child process IOFailed to register DDE server '%s'Failed to register font configuration using private fonts.Failed to remember the encoding for the charset '%s'.Failed to remove debug report file "%s"Failed to remove lock file '%s'Failed to remove stale lock file '%s'.Failed to rename registry value '%s' to '%s'.Failed to rename the file '%s' to '%s' because the destination file already exists.Failed to rename the registry key '%s' to '%s'.Failed to reset web view to standard emulation levelFailed to retrieve file times for '%s'Failed to retrieve text of RAS error messageFailed to retrieve the supported clipboard formatsFailed to save document to the file "%s".Failed to save the bitmap image to file "%s".Failed to send DDE advise notificationFailed to set FTP transfer mode to %s.Failed to set clipboard data.Failed to set permissions on lock file '%s'Failed to set process priorityFailed to set temporary file permissionsFailed to set thread concurrency level to %luFailed to set thread priority %d.Failed to set up non-blocking pipe, the program might hang.Failed to set web view to modern emulation levelFailed to store image '%s' to memory VFS!Failed to switch DirectFB pipe to non-blocking modeFailed to switch wake up pipe to non-blocking modeFailed to terminate a thread.Failed to terminate the advise loop with DDE serverFailed to terminate the dialup connection: %sFailed to touch the file '%s'Failed to unload shared libraryFailed to unlock lock file '%s'Failed to unregister DDE server '%s'Failed to unregister descriptor %d from epoll descriptor %dFailed to update user configuration file.Failed to upload the debug report (error code %d).Failed to write to lock file '%s'FalseFamilyFatal ErrorFileFile "%s" could not be opened for reading.File "%s" could not be opened for writing.File '%s' already exists, do you really want to overwrite it?File '%s' couldn't be removedFile '%s' couldn't be renamed '%s'File couldn't be loaded.File dialog failed with error code %0lx.File errorFile name exists already.File type:FilesFiles (%s)FilterFindFind and replace in documentFind in documentFind...FirstFirst pageFixedFixed font:Fixed size face.
bold italic FloatingFloppyFolio, 8 1/2 x 13 inFontFont &weight:Font file "%s" cannot be used as it is not inside the font directory "%s".Font file "%s" couldn't be loadedFont file "%s" doesn't exist.Font size:Font st&yle:Font:Fonts index file %s disappeared while loading fonts.Fork failedForwardForward hrefs are not supportedFound %i matchesFrom:FuchsiaGIF: data stream seems to be truncated.GIF: error in GIF image format.GIF: not enough memory.GTK+ installed on this machine is too old to support screen compositing, please install GTK+ 2.12 or later.GTK+ themeGeneralGeneric PostScriptGerman Legal Fanfold, 8 1/2 x 13 inGerman Std Fanfold, 8 1/2 x 12 inGetProperty called w/o valid getterGetPropertyCollection called on a generic accessorGetPropertyCollection called w/o valid collection getterGo backGo forwardGo one level up in document hierarchyGo to home directoryGo to parent directoryGraphics art by GrayGrayTextGreek (ISO-8859-7)GreenGreen:GrooveGzip not supported by this version of zlibHTML Help Project (*.hhp)|*.hhp|HTML anchor %s does not exist.HTML files (*.html;*.htm)|*.html;*.htm|HarddiskHebrew (ISO-8859-8)HelpHelp Browser OptionsHelp IndexHelp PrintingHelp TopicsHelp books (*.htb)|*.htb|Help books (*.zip)|*.zip|Help directory "%s" not found.Help file "%s" not found.Help: %sHide this notification message.HighlightHighlightTextHomeHome directoryHow the object will float relative to the text.ICO: Error in reading mask DIB.ICO: Error writing the image file!ICO: Image too tall for an icon.ICO: Image too wide for an icon.ICO: Invalid icon index.IFF: data stream seems to be truncated.IFF: error in IFF image format.IFF: not enough memory.IFF: unknown error!!!ISO-2022-JPIf possible, try changing the layout parameters to make the printout more narrow.If you have any additional information pertaining to this bug report, please enter it here and it will be joined to it:If you wish to suppress this debug report completely, please choose the "Cancel" button, but be warned that it may hinder improving the program, so if at all possible please do continue with the report generation. Ignoring malformed extra data record, ZIP file may be corruptedIgnoring value "%s" of the key "%s".Illegal Object Class (Non-wxEvtHandler) as Event SourceIllegal Parameter Count for ConstructObject MethodIllegal Parameter Count for Create MethodIllegal directory name.Illegal file specification.Image and mask have different sizes.Image file is not of type %d.Image is not of type %s.Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dllImpossible to get child process inputImpossible to get permissions for file '%s'Impossible to overwrite the file '%s'Impossible to set permissions for the file '%s'InactiveBorderInactiveCaptionInactiveCaptionTextIncorrect GIF frame size (%u, %d) for the frame #%uIncorrect number of arguments.IndentIndents && SpacingIndexIndian (ISO-8859-12)InfoInitialization failed in post init, aborting.InsertInsert FieldInsert ImageInsert ObjectInsert TextInserts a page break before the paragraph.InsetInvalid TIFF image index.Invalid display mode specification '%s'.Invalid geometry specification '%s'Invalid inotify event for "%s"Invalid lock file '%s'.Invalid message catalog.Invalid or Null Object ID passed to GetObjectClassInfoInvalid or Null Object ID passed to HasObjectClassInfoInvalid regular expression '%s': %sInvalid value %ld for a boolean key "%s" in config file.ItalicItaly Envelope, 110 x 230 mmJPEG: Couldn't load - file is probably corrupted.JPEG: Couldn't save image.Japanese Double Postcard 200 x 148 mmJapanese Envelope Chou #3Japanese Envelope Chou #3 RotatedJapanese Envelope Chou #4Japanese Envelope Chou #4 RotatedJapanese Envelope Kaku #2Japanese Envelope Kaku #2 RotatedJapanese Envelope Kaku #3Japanese Envelope Kaku #3 RotatedJapanese Envelope You #4Japanese Envelope You #4 RotatedJapanese Postcard 100 x 148 mmJapanese Postcard Rotated 148 x 100 mmJump toJustifiedJustify text left and right.KOI8-RKOI8-UL&ine spacing:LZMA compression error when flushing output: %sLZMA compression error: %sLZMA decompression error: %sLandscapeLastLast pageLast repeated message ("%s", %u time) wasn't outputLast repeated message ("%s", %u times) wasn't outputLedger, 17 x 11 inLeftLeft (&first line):Left margin (mm):Left-align text.Legal Extra 9 1/2 x 15 inLegal, 8 1/2 x 14 inLetter Extra 9 1/2 x 12 inLetter Extra Transverse 9.275 x 12 inLetter Plus 8 1/2 x 12.69 inLetter Rotated 11 x 8 1/2 inLetter Small, 8 1/2 x 11 inLetter Transverse 8 1/2 x 11 inLetter, 8 1/2 x 11 inLicenseLightLimeLine %lu of map file "%s" has invalid syntax, skipped.Line spacing:Link contained '//', converted to absolute link.List StyleList stylesLists font sizes in points.Lists the available fonts.Load %s fileLoading : Lock file '%s' has incorrect owner.Lock file '%s' has incorrect permissions.Log saved to the file '%s'.Lower case lettersLower case roman numeralsMDI childMS HTML Help functions are unavailable because the MS HTML Help library is not installed on this machine. Please install it.Ma&ximizeMacArabicMacArmenianMacBengaliMacBurmeseMacCelticMacCentralEurRomanMacChineseSimpMacChineseTradMacCroatianMacCyrillicMacDevanagariMacDingbatsMacEthiopicMacExtArabicMacGaelicMacGeorgianMacGreekMacGujaratiMacGurmukhiMacHebrewMacIcelandicMacJapaneseMacKannadaMacKeyboardGlyphsMacKhmerMacKoreanMacLaotianMacMalayalamMacMongolianMacOriyaMacRomanMacRomanianMacSinhaleseMacSymbolMacTamilMacTeluguMacThaiMacTibetanMacTurkishMacVietnameseMake a selection:MarginsMaroonMatch caseMax height:Max width:Media playback error: %sMemory VFS already contains file '%s'!MenuMessageMetal themeMethod or property not found.Mi&nimizeMin height:Min width:MinimizeMissing a required parameter.ModernModifiedModule "%s" initialization failedMonarch Envelope, 3 7/8 x 7 1/2 inMonitoring individual files for changes is not supported currently.Move downMove upMoves the object to the next paragraph.Moves the object to the previous paragraph.Multiple Cell PropertiesNameNavyNetworkNewNew &Box Style...New &Character Style...New &List Style...New &Paragraph Style...New StyleNew itemNewNameNext pageNoNo animation handler for type %ld defined.No bitmap handler for type %d defined.No default application configured for HTML files.No entries found.No font for displaying text in encoding '%s' found, but an alternative encoding '%s' is available. Do you want to use this encoding (otherwise you will have to choose another one)?No font for displaying text in encoding '%s' found. Would you like to select a font to be used for this encoding (otherwise the text in this encoding will not be shown correctly)?No handler found for animation type.No handler found for image type.No image handler for type %d defined.No image handler for type %s defined.No matching page found yetNo soundNo unused colour in image being masked.No valid mappings found in the file "%s".NoneNordic (ISO-8859-10)NormalNormal face
and underlined. Normal font:Not %sNot available for this platformNot enough free disk space for download.Not underlinedNote, 8 1/2 x 11 inNoticeNumbered outlineOKOLE Automation error in %s: %sObject PropertiesObject implementation does not support named arguments.Objects must have an id attributeOliveOpaci&ty:Opacity:Open FileOpen HTML documentOpen an existing documentOpen file "%s"Open...OpenGL 3.0 or later is not supported by the OpenGL driver.Operation not permitted.Option '%s' can't be negatedOption '%s' requires a value.Option '%s': '%s' cannot be converted to a date.OptionsOrangeOrientationOut of window IDs. Recommend shutting down application.OutlineOutsetOverflow while coercing argument values.PCX: couldn't allocate memoryPCX: image format unsupportedPCX: invalid imagePCX: this is not a PCX file.PCX: unknown error !!!PCX: version number too lowPNM: Couldn't allocate memory.PNM: File format is not recognized.PNM: File seems truncated.PRC 16K 146 x 215 mmPRC 16K RotatedPRC 32K 97 x 151 mmPRC 32K RotatedPRC 32K(Big) 97 x 151 mmPRC 32K(Big) RotatedPRC Envelope #1 102 x 165 mmPRC Envelope #1 Rotated 165 x 102 mmPRC Envelope #10 324 x 458 mmPRC Envelope #10 Rotated 458 x 324 mmPRC Envelope #2 102 x 176 mmPRC Envelope #2 Rotated 176 x 102 mmPRC Envelope #3 125 x 176 mmPRC Envelope #3 Rotated 176 x 125 mmPRC Envelope #4 110 x 208 mmPRC Envelope #4 Rotated 208 x 110 mmPRC Envelope #5 110 x 220 mmPRC Envelope #5 Rotated 220 x 110 mmPRC Envelope #6 120 x 230 mmPRC Envelope #6 Rotated 230 x 120 mmPRC Envelope #7 160 x 230 mmPRC Envelope #7 Rotated 230 x 160 mmPRC Envelope #8 120 x 309 mmPRC Envelope #8 Rotated 309 x 120 mmPRC Envelope #9 229 x 324 mmPRC Envelope #9 Rotated 324 x 229 mmPaddingPage %dPage %d of %dPage SetupPage setupPagesPaper sizeParagraph stylesPassing a already registered object to SetObjectPassing an unknown object to GetObjectPassword:PastePaste selectionPeri&odPermissionsPicture PropertiesPipe creation failedPlease choose a valid font.Please choose an existing file.Please choose the page to display:Please choose which ISP do you want to connect toPlease select the columns to show and define their order:Please wait while printing...Point SizePortraitPositionPostScript filePreferencesPreparingPreview:Previous pagePrintPrint PreviewPrint Preview FailurePrint RangePrint SetupPrint in colourPrint operation could not be initializedPrint previe&w...Print preview creation failed.Print preview...Print spoolingPrint this pagePrint to FilePrint...PrinterPrinter command:Printer optionsPrinter options:Printer...Printer:PrintingPrinting Printing ErrorPrinting is not supported by the system web controlPrinting page %dPrinting page %d of %dPrinting page %d...Printing...PrintoutProcessing debug report has failed, leaving the files in "%s" directory.Progress:PropertiesPropertyProperty ErrorPurpleQuarto, 215 x 275 mmQuestionQuitQuit this programRead error on file '%s'Reading password for "%s" failed: %s.ReadyRedRed:RedoRedo last actionRefreshRegistry key '%s' already exists.Registry key '%s' does not exist, cannot rename it.Registry key '%s' is needed for normal system operation, deleting it will leave your system in unusable state: operation aborted.Registry value "%s" is not binary (but of type %s)Registry value "%s" is not numeric (but of type %s)Registry value "%s" is not text (but of type %s)Registry value '%s' already exists.RegularRelativeRelevant entries:Remaining time:RemoveRemove BulletRemove current page from bookmarksRenderer "%s" has incompatible version %d.%d and couldn't be loaded.Renumber ListRep&lace...ReplaceReplace &allReplace with:Replace...Required information entry is empty.Resource '%s' is not a valid message catalog.Retrieving JavaScript script output is not supported with WebKit v1Revert to SavedRidgeRig&ht-to-leftRightRight margin (mm):Right-align text.RomanRow %iRunScriptAsync not supportedS&tandard bullet name:SaveSave %s fileSave &As...Save AsSave As...Save current documentSave current document with a different filenameSave log contents to fileSaving password for "%s" failed: %s.ScriptScrollbarSearchSearch contents of help book(s) for all occurrences of the text you typed aboveSearch directionSearch for:Search in all booksSearching...SectionsSeek error on file '%s'Seek error on file '%s' (large files not supported by stdio)Select &AllSelect AllSelect a document templateSelect a document viewSelect regular or bold.Select regular or italic style.Select underlining or no underlining.SelectionSelects the list level to edit.Separator expected after the option '%s'.Set Cell StyleSetProperty called w/o valid setterSetup...Several active dialup connections found, choosing one randomly.Sh&adow spread:ShadowShadow c&olour:Show &hidden directoriesShow &hidden filesShow about dialogShow allShow all items in indexShow/hide navigation panelShows a Unicode subset.Shows a preview of the bullet settings.Shows a preview of the font settings.Shows a preview of the font.Shows a preview of the paragraph settings.Shows the font preview.SilverSimple monochrome themeSingleSizeSize:SkipSlantSmall C&apitalsSolidSorry, could not open this file.Sorry, not enough memory to create a preview.Sorry, that name is taken. Please choose another.Sorry, the format for this file is unknown.Sound data are in unsupported format.Sound file '%s' is in unsupported format.SpacingSpell CheckStandardStatement, 5 1/2 x 8 1/2 inStaticStatus:StopStrikethroughString To Colour : Incorrect colour specification : %sStyleStyle:Subscrip&tSupe&rscriptSuperA/SuperA/A4 227 x 356 mmSuperB/SuperB/A3 305 x 487 mmSuppress hyphe&nationSwissSymbolSymbol &font:SymbolsTIFF: Couldn't allocate memory.TIFF: Error loading image.TIFF: Error reading image.TIFF: Error saving image.TIFF: Error writing image.TIFF: Image size is abnormally big.Table PropertiesTabloid Extra 11.69 x 18 inTabloid, 11 x 17 inTabsTealTeletypeTemplatesThai (ISO-8859-11)The FTP server doesn't support passive mode.The FTP server doesn't support the PORT command.The available bullet styles.The available styles.The background colour.The border line style.The bottom margin size.The bottom padding size.The bottom position.The bullet character.The character code.The charset '%s' is unknown. You may select another charset to replace it with or choose [Cancel] if it cannot be replacedThe clipboard format '%d' doesn't exist.The default style for the next paragraph.The directory '%s' does not exist Create it now?The document "%s" doesn't fit on the page horizontally and will be truncated if printed. Would you like to proceed with printing it nevertheless?The file '%s' doesn't exist and couldn't be opened. It has been removed from the most recently used files list.The first line indent.The following debug report will be generated The font colour.The font family.The font from which to take the symbol.The font point size.The font size in points.The font size units, points or pixels.The font style.The font weight.The format of file '%s' couldn't be determined.The horizontal offset.The left indent.The left margin size.The left padding size.The left position.The line spacing.The list item number.The locale ID is unknown.The object height.The object maximum height.The object maximum width.The object minimum height.The object minimum width.The object width.The outline level.The previous message repeated %u time.The previous message repeated %u times.The previous message repeated once.The range to show.The report contains the files listed below. If any of these files contain private information, please uncheck them and they will be removed from the report. The required parameter '%s' was not specified.The right indent.The right margin size.The right padding size.The right position.The shadow blur distance.The shadow colour.The shadow opacity.The shadow spread.The spacing after the paragraph.The spacing before the paragraph.The style name.The style on which this style is based.The style preview.The system cannot find the file specified.The tab position.The tab positions.The text couldn't be saved.The top margin size.The top padding size.The top position.The value for the option '%s' must be specified.The value of the corner radius.The version of remote access service (RAS) installed on this machine is too old, please upgrade (the following required function is missing: %s).The vertical offset.There was a problem during page setup: you may need to set a default printer.This document doesn't fit on the page horizontally and will be truncated when it is printed.This is not a %s.This platform does not support background transparency.This program was compiled with a too old version of GTK+, please rebuild with GTK+ 2.12 or newer.This program wasn't compiled with EGL support required under Wayland, either install EGL libraries and rebuild or run it under X11 backend by setting environment variable GDK_BACKEND=x11 before starting your program.Thread module initialization failed: cannot store value in thread local storageThread module initialization failed: failed to create thread keyThread module initialization failed: impossible to allocate index in thread local storageThread priority setting is ignored.Tile &HorizontallyTile &VerticallyTimeout while waiting for FTP server to connect, try passive mode.Tip of the DayTips not available, sorry!To:Too many EndStyle calls!TooltipTooltipTextTopTop margin (mm):Translations by TranslatorsTrueTrying to remove file '%s' from memory VFS, but it is not loaded!Turkish (ISO-8859-9)TypeType a font name.Type a size in points.Type mismatch in argument %u.Type must have enum - long conversionType operation "%s" failed: Property labeled "%s" is of type "%s", NOT "%s".US Std Fanfold, 14 7/8 x 11 inUS-ASCIIUnable to add inotify watchUnable to add kqueue watchUnable to associate handle with I/O completion portUnable to close I/O completion port handleUnable to close inotify instanceUnable to close path '%s'Unable to close the handle for '%s'Unable to create I/O completion portUnable to create IOCP worker threadUnable to create inotify instanceUnable to create kqueue instanceUnable to dequeue completion packetUnable to get events from kqueueUnable to initialize GTK+, is DISPLAY set properly?Unable to open path '%s'Unable to open requested HTML document: %sUnable to play sound asynchronously.Unable to post completion statusUnable to read from inotify descriptorUnable to remove inotify watch %iUnable to remove kqueue watchUnable to set up watch for '%s'Unable to start IOCP worker threadUndeleteUnderlineUnderlinedUndoUndo last actionUnexpected characters following option '%s'.Unexpected event for "%s": no matching watch descriptor.Unexpected parameter '%s'Unexpectedly new I/O completion port was createdUngraceful worker thread terminationUnicodeUnicode 16 bit (UTF-16)Unicode 16 bit Big Endian (UTF-16BE)Unicode 16 bit Little Endian (UTF-16LE)Unicode 32 bit (UTF-32)Unicode 32 bit Big Endian (UTF-32BE)Unicode 32 bit Little Endian (UTF-32LE)Unicode 7 bit (UTF-7)Unicode 8 bit (UTF-8)UnindentUnits for the bottom border width.Units for the bottom margin.Units for the bottom outline width.Units for the bottom padding.Units for the bottom position.Units for the corner radius.Units for the left border width.Units for the left margin.Units for the left outline width.Units for the left padding.Units for the left position.Units for the maximum object height.Units for the maximum object width.Units for the minimum object height.Units for the minimum object width.Units for the object height.Units for the object width.Units for the right border width.Units for the right margin.Units for the right outline width.Units for the right padding.Units for the right position.Units for the top border width.Units for the top margin.Units for the top outline width.Units for the top padding.Units for the top position.Units for this value.UnknownUnknown DDE error %08xUnknown Object passed to GetObjectClassInfoUnknown PNG resolution unit %dUnknown Property %sUnknown TIFF resolution unit %d ignoredUnknown base %d. Base 10 will be used.Unknown dynamic library errorUnknown encoding (%d)Unknown error %08xUnknown exceptionUnknown image data format.Unknown long option '%s'Unknown name or named argument.Unknown option '%s'Unmatched '{' in an entry for mime type %s.Unnamed commandUnspecifiedUnsupported clipboard format.Unsupported theme '%s'.UpUpper case lettersUpper case roman numeralsUsage: %sUse &shadowUse the current alignment setting.Username:Using private fonts is not supported on this system: Pango library is too old, 1.38 or later required.Validation conflictValueValue must be %s or higher.Value must be %s or less.Value must be between %s and %s.Version Vertical alignment.View files as a detailed viewView files as a list viewViewsWARNING: using XIM input method is unsupported and may result in problems with input handling and flickering. Consider unsetting GTK_IM_MODULE or setting to "ibus".Waiting for IO on epoll descriptor %d failedWarning: WeightWestern European (ISO-8859-1)Western European with Euro (ISO-8859-15)Whether the font is underlined.WhiteWhole wordWhole words onlyWin32 themeWindowWindowFrameWindowTextWindows Arabic (CP 1256)Windows Baltic (CP 1257)Windows Central European (CP 1250)Windows Chinese Simplified (CP 936) or GB-2312Windows Chinese Traditional (CP 950) or Big-5Windows Cyrillic (CP 1251)Windows Greek (CP 1253)Windows Hebrew (CP 1255)Windows Japanese (CP 932) or Shift-JISWindows Johab (CP 1361)Windows Korean (CP 949)Windows Thai (CP 874)Windows Turkish (CP 1254)Windows Vietnamese (CP 1258)Windows Western European (CP 1252)Windows/DOS OEM (CP 437)Windows/DOS OEM Cyrillic (CP 866)Write error on file '%s'XML parsing error: '%s' at line %dXPM: Malformed pixel data!XPM: incorrect colour description in line %dXPM: incorrect header format!XPM: malformed colour definition '%s' at line %d!XPM: no colors left to use for mask!XPM: truncated image data at line %d!YellowYesYou cannot add a new directory to this section.You have entered invalid value. Press ESC to cancel editing.ZoomZoom &InZoom &OutZoom InZoom OutZoom to &FitZoom to Fita DDEML application has created a prolonged race condition.a DDEML function was called without first calling the DdeInitialize function, or an invalid instance identifier was passed to a DDEML function.a client's attempt to establish a conversation has failed.a memory allocation failed.a parameter failed to be validated by the DDEML.a request for a synchronous advise transaction has timed out.a request for a synchronous data transaction has timed out.a request for a synchronous execute transaction has timed out.a request for a synchronous poke transaction has timed out.a request to end an advise transaction has timed out.a server-side transaction was attempted on a conversation that was terminated by the client, or the server terminated before completing a transaction.a transaction failed.an application initialized as APPCLASS_MONITOR has attempted to perform a DDE transaction, or an application initialized as APPCMD_CLIENTONLY has attempted to perform server transactions.an internal call to the PostMessage function has failed. an internal error has occurred in the DDEML.an invalid transaction identifier was passed to a DDEML function. Once the application has returned from an XTYP_XACT_COMPLETE callback, the transaction identifier for that callback is no longer valid.assuming this is a multi-part zip concatenatedattempt to change immutable key '%s' ignored.bad arguments to library functionbad signaturebad zipfile offset to entrybinaryboldbuild %lucan't close file '%s'can't close file descriptor %dcan't commit changes to file '%s'can't create file '%s'can't delete user configuration file '%s'can't determine if the end of file is reached on descriptor %dcan't find central directory in zipcan't find length of file on file descriptor %dcan't find user's HOME, using current directory.can't flush file descriptor %dcan't get seek position on file descriptor %dcan't load any font, abortingcan't open file '%s'can't open global configuration file '%s'.can't open user configuration file '%s'.can't open user configuration file.can't re-initialize zlib deflate streamcan't re-initialize zlib inflate streamcan't read from file descriptor %dcan't remove file '%s'can't remove temporary file '%s'can't seek on file descriptor %dcan't write buffer '%s' to disk.can't write to file descriptor %dcan't write user configuration file.checkedchecksum errorchecksum failure reading tar header blockcmcompression errordatedecompression errordefaultdoubledump of the process state (binary)eighteentheightheleventhentry '%s' appears more than once in group '%s'error in data formaterror opening fileerror reading zip central directoryerror reading zip local headererror writing zip entry '%s': bad crc or lengtherror writing zip entry '%s': file too large without ZIP64extraboldextraheavyextralightfailed to evaluatefailed to flush the file '%s'falsefifteenthfifthfile '%s', line %zu: '%s' ignored after group header.file '%s', line %zu: '=' expected.file '%s', line %zu: key '%s' was first found at line %d.file '%s', line %zu: value for immutable key '%s' ignored.file '%s': unexpected character %c at line %zu.filesfirstfont sizefourteenthfourthgenerate verbose log messagesheavyimageincomplete header block in tarincorrect event handler string, missing dotincorrect size given for tar entryinput compressed using unknown XZ optioninput is corruptedinput is not in XZ formatinvalid data in extended tar headerinvalid message box return valueinvalid zip fileitalickeyboard keyAddkeyboard keyAlt+keyboard keyBackkeyboard keyBackspacekeyboard keyCancelkeyboard keyCapitalkeyboard keyClearkeyboard keyCommandkeyboard keyCtrl+keyboard keyDecimalkeyboard keyDelkeyboard keyDeletekeyboard keyDividekeyboard keyDownkeyboard keyEndkeyboard keyEnterkeyboard keyEsckeyboard keyEscapekeyboard keyExecutekeyboard keyFkeyboard keyHelpkeyboard keyHomekeyboard keyInskeyboard keyInsertkeyboard keyKP_keyboard keyKP_Addkeyboard keyKP_Beginkeyboard keyKP_Decimalkeyboard keyKP_Deletekeyboard keyKP_Dividekeyboard keyKP_Downkeyboard keyKP_Endkeyboard keyKP_Enterkeyboard keyKP_Equalkeyboard keyKP_Fkeyboard keyKP_Homekeyboard keyKP_Insertkeyboard keyKP_Leftkeyboard keyKP_Multiplykeyboard keyKP_Nextkeyboard keyKP_PageDownkeyboard keyKP_PageUpkeyboard keyKP_Priorkeyboard keyKP_Rightkeyboard keyKP_Separatorkeyboard keyKP_Spacekeyboard keyKP_Subtractkeyboard keyKP_Tabkeyboard keyKP_Upkeyboard keyLeftkeyboard keyMenukeyboard keyMultiplykeyboard keyNum *keyboard keyNum +keyboard keyNum ,keyboard keyNum -keyboard keyNum .keyboard keyNum /keyboard keyNum =keyboard keyNum Beginkeyboard keyNum Deletekeyboard keyNum Downkeyboard keyNum Endkeyboard keyNum Enterkeyboard keyNum Homekeyboard keyNum Insertkeyboard keyNum Lockkeyboard keyNum Page Downkeyboard keyNum Page Upkeyboard keyNum Rightkeyboard keyNum Spacekeyboard keyNum Tabkeyboard keyNum Upkeyboard keyNum leftkeyboard keyNum_lockkeyboard keyPage Downkeyboard keyPage Upkeyboard keyPageDownkeyboard keyPageUpkeyboard keyPausekeyboard keyPgDnkeyboard keyPgUpkeyboard keyPrintkeyboard keyRawCtrl+keyboard keyReturnkeyboard keyRightkeyboard keySPECIALkeyboard keyScroll Lockkeyboard keyScroll_lockkeyboard keySelectkeyboard keySeparatorkeyboard keyShift+keyboard keySnapshotkeyboard keySpacekeyboard keySubtractkeyboard keyTabkeyboard keyUpkeyboard keyWindows_Leftkeyboard keyWindows_Menukeyboard keyWindows_Rightkeyboard keyaltkeyboard keyctrlkeyboard keynum keyboard keyrawctrlkeyboard keyshiftlibcurl could not be initializedlightmacOS menu itemAbout %smacOS menu itemAbout...macOS menu itemHide %smacOS menu itemHide ApplicationmacOS menu itemHide OthersmacOS menu itemPreferences...macOS menu itemQuit %smacOS menu itemQuit ApplicationmacOS menu itemServicesmacOS menu itemShow Allmediummidnightnineteenthninthno DDE error.no errorno fonts found in %s, using builtin fontnonamenoonnormalnumobjects cannot have XML Text Nodesout of memoryprocess context descriptionptpxread errorreading zip stream (entry %s): bad crcreading zip stream (entry %s): bad lengthreentrancy problem.secondseek errorsemiboldseventeenthseventhshow this help messagesixteenthsixthspecify display mode to use (e.g. 640x480-16)specify the theme to usestandard Windows menu&Helpstandard/circlestandard/circle-outlinestandard/diamondstandard/squarestandard/trianglestored file length not in Zip headerstrstrikethroughsystem cursor nameArrowsystem cursor nameBlanksystem cursor nameBullseyesystem cursor nameCharactersystem cursor nameCrosssystem cursor nameDefaultsystem cursor nameHandsystem cursor nameI-Beamsystem cursor nameLeft Buttonsystem cursor nameMagnifiersystem cursor nameMiddle Buttonsystem cursor nameNo Entrysystem cursor namePaint Brushsystem cursor namePencilsystem cursor namePoint Leftsystem cursor namePoint Rightsystem cursor nameQuestion Arrowsystem cursor nameRight Arrowsystem cursor nameRight Buttonsystem cursor nameSizingsystem cursor nameSizing N-Ssystem cursor nameSizing NE-SWsystem cursor nameSizing NW-SEsystem cursor nameSizing W-Esystem cursor nameSpraycansystem cursor nameWaitsystem cursor nameWait Arrowsystem cursor nameWatchtar entry not opentenththe response to the transaction caused the DDE_FBUSY bit to be set.thinthirdthirteenthtodaytomorrowtrailing backslash ignored in '%s'translator-creditstruetwelfthtwentiethuncheckedunderlinedundeterminedunexpected " at position %d in '%s'.unexpected end of fileunknownunknown (%lu)unknown class %sunknown compression errorunknown decompression errorunknown errorunknown error (error code %08x).unknown-%dunnamedunnamed%dunsupported Zip compression methodusing catalog '%s' from '%s'.write errorwxGLCanvas is only supported on Wayland and X11 currently. You may be able to work around this by setting environment variable GDK_BACKEND=x11 before starting your program.wxGetTimeOfDay failed.wxWidgets could not open display for '%s': exiting.wxWidgets could not open display. Exiting.xxxxyesterdayzlib error %d~Project-Id-Version: wxWidgets 3.1 Report-Msgid-Bugs-To: PO-Revision-Date: 2022-07-03 20:43+0200 Last-Translator: Andriy Byelikov Language-Team: Language: ca MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: Poedit 3.0.1 Envieu aquest informe al mantenidor del programa. Gràcies! Gràcies i disculpeu les molèsties! (còpia %d de %d) (error %ld: %s) (al mòdul "%s") - Previsualitza negreta extra negreta extra pesada extra lleugera pesada cursiva lleugera mitjana semi negreta ratllat primaSobre núm. 10, 4 1/8 x 9 1/2 polz.Sobre núm. 11, 4 1/2 x 10 3/8 polz.Sobre núm. 12, 4 3/4 x 11 polz.Sobre núm. 14, 5 x 11 1/2 polz.Sobre núm. 9, 3 7/8 x 8 7/2 polz.%%d de %lu%i de %u%ld byte%ld bytes%lu de %lu%s (%d elements)%s (o %s)Error: %sInformació: %sPreferències de %sAdvertència: %s%s no s'ajustava a la capçalera tar per a l'entrada '%s'Fitxers %s (%s)|%s%u de %uQu&ant aMid&a realDesprés d'un p&aràgraf:&Alineació&Aplica&Aplica l'estil&Organitza les icones&Ascendent&Endarrere&Basat en:A&bans d'un paràgraf:Color de &fons:Distància del &difuminat:&Negreta&Inferior&Inferior:&CaixaEstil de &pic:&CD-ROM&Cancel·laEn &cascada&Cel·la&Codi de caràcter:&NetejaTan&ca&Color&Color:&Converteix&Copia&Copia l'URL&Personalitza...Previsualització &de l'informe de depuració:&Suprimeix&Suprimeix l'estil...&Descendent&DetallsA&vall&Edita&Edita l'estil...&Executa&Fitxer&Cerca...&Finalitza&PrimerMode &flotant:&Disquet&Tipus de lletra&Família del tipus de lletra:Tip&us de lletra per al nivell...&Tipus de lletra:Enda&vant&De:&Disc dur&Alçada:&Ajuda&Amaga els detalls&IniciDesplaçament &horitzontal:Sagnat (dèc&imes de mm)&IndeterminatÍ&ndex&InformacióCurs&iva&Vés a&JustificatÚ<im&Esquerra&Esquerra:Nivell de la &llista:&Registre&Mou&Mou l'objecte a:&Xarxa&Nou&SegüentE&ndavant >Paràgraf següe&ntSegüe&nt consellSegüe&nt estil:&No&Notes:&Número:D'ac&ord&Obre...Nivell del c&ontorn:Salt de &pàgina&Enganxa&ImatgeMida en &punts:&Posició (dècimes de mm):&Mode de posicionament:&Preferències&Anterior&Paràgraf anteriorIm&primeix...&Propietats&Surt&Refés&Refés &Canvia el nom de l'estil...&Substitueix&Reinicia la numeració&RestauraD&retaD&reta:De&saMo&stra els detallsMo&stra els consells en iniciar&Mida&Mida:&OmetE&spaiat (dècimes de mm)&Comprova l'ortografiaA&tura&RatllatE&stil:E&stils:&Subconjunt:&Símbol:&Sincronitza els valors&TaulaDal&t de tot&Superior:S&ubratllatS&ubratllat:&Desfés&Desfés Desfés el sa&gnatAm&untAlineació &vertical:Desplaçament &vertical:&Visualitza...&Pes:A&mplada:&Finestra&Sí'%s' conté caràcters no permesos'%s' té '..' extra, s'ha ignorat.'%s' no és valor numèric correcte per a l'opció '%s'.'%s' no és un missatge de catàleg vàlid.'%s' no és una de les cadenes vàlides'%s' és una de les cadenes invàlides'%s' és probablement memòria intermèdia binària.(*)(Ajuda)(Cap)(Text normal)(preferits)(error %d: %s)(cap)**)+, edició de 64 bits-...1.11.21.31.41.51.61.71.81.910 x 11 polz.10 x 14 polz.11 x 17 polz.12 x 11 polz.15 x 11 polz.2Sobre 6 3/4, 3 5/8 x 6 1/2 polz.9 x 11 polz.: el fitxer no existeix!: joc de caràcters desconegut: codificació desconeguda< &EndarrereNegreta i cursiva.
negreta i cursiva subratllada
Negreta. Cursiva. >S'ha generat un informe de depuració al driectori S'ha generat un informe de depuració. Podeu trobar-lo aUna col·lecció no buida ha de consistir de nodes 'element'Un nom de pic estàndard.Full A0, 841 x 1189 mmFull A1, 594 x 841 mmA2, 420 x 594 mmA3 extra, 322 x 445 mmA3 extra transversal, 322 x 445 mmA3 girat, 420 x 297 mmA3 transversal, 297 x 420 mmFull A3, 297 x 420 mmA4 extra, 9,27 x 12,69 polz.A4 plus, 210 x 330 mmA4 girat, 297 x 210 mmA4 transversal, 210 x 297 mmFull A4, 210 x 297 mmFull petit A4, 210 x 297 mmA5 extra, 174 x 235 mmA5 girat, 210 x 148 mmA5 transversal, 148 x 210 mmFull A5, 148 x 210 mmA6, 105 x 148 mmA6 girat, 148 x 105 mmABCDabcd1234ÀÈÉÍÏÒóúüçl·lASCIIQuant aQuant a %sAbsolutActiveBorderActiveCaptionMida realSumaAfegeix una columnaAfegeix una filaAfegeix la pàgina actual als preferitsAfegeix als colors personalitzatsS'ha cridat AddToPropertyCollection en un mètode d'accés genèricS'ha cridat AddToPropertyCollection sense un afegidor vàlidS'està afegint el llibre %sAvançatDesprés d'un paràgraf:Alinea a l'esquerraAlinea a la dretaAlineacióTotTots els fitxers (%s)|%sTots els fitxers (*)|*Tots els fitxers (*.*)|*.*Tots els estilsMode alfabèticS'ha passat un objecte ja registrat a SetObjectClassInfoJa s'està trucant al proveïdor d'Internet.Alt+Un radi de cantonada opcional per a afegir cantonades arrodonides.I inclou els següents fitxers: El fitxer d'animació no és del tipus %ld.AppWorkspaceVoleu afegir el registre al fitxer '%s'? (si trieu [No], se sobreescriurà)AplicacióAplicaCianÀrabÀrab (ISO-8859-6)No s'ha trobat l'argument %u.ArtistesAscendentAtributsTipus de lletra disponibles.B4 (ISO), 250 x 354 mmB4 (JIS) girat, 364 x 257 mmSobre B4, 250 x 353 mmFull B4, 250 x 354 mmB5 (ISO) extra, 201 x 276 mmB5 (JIS) girat, 257 x 182 mmB5 (JIS) transversal, 182 x 257 mmSobre B5, 176 x 250 mmFull B5, 182 x 257 mil·límetresB6 (JIS), 128 x 182 mmB6 (JIS) girat, 182 x 128 mmSobre B6, 176 x 125 mmBMP: No s'ha pogut assignar la memòria.BMP: No s'ha pogut desar una imatge invàlida.BMP: No s'ha pogut escriure el mapa de colors RGB.BMP: No s'han pogut escriure les dades.BMP: No s'ha pogut escriure la capçalera del fitxer (Bitmap).BMP: No s'ha pogut escriure la capçalera del fitxer (BitmapInfo).BMP: capçalera té biClrUsed=%d quan biBitCount=%d.BMP: wxImage no té una wxPallette pròpia.EndarrereFons&Color de fons:Color de fonsBàltic (ISO-8859-13)Bàltic (antic) (ISO-8859-4)Abans d'un paràgraf:Mapa de bitsNegreBlauBlau:NegretaVoraVoresInferiorMarge inferior (mm):Propietats de la caixaEstils de caixaPorta tot al davantMarróNavega&Alineació del pic:Estil de picPicsButtonFaceButtonHighlightButtonShadowButtonTextFull C, 17 x 22 polz.&NetejaC&olor:Sobre C3, 324 x 458 mmSobre C4, 229 x 324 mmSobre C5, 162 x 229 mmSobre C6, 114 x 162 mmSobre C65, 114 x 229 mmCD-ROMEl gestor de CHM actualment només suporta fitxers locals!Ma&júsculesNo es pot &desfer No es pot determinar automàticament el format d'imatge en una entrada seqüencial.No es pot tancar la clau de registre '%s'No es poden copiar els valors del tipus no suportat %d.No es pot crear la clau de registre '%s'No es pot crear el fil d'execucióNo es pot suprimir la clau '%s'No es pot suprimir el fitxer INI '%s'No es pot suprimir el valor '%s' de la clau '%s'No es poden enumerar les subclaus de la clau '%s'No es poden enumerar els valors de la clau '%s'No es pot exportar el valor del tipus de no suportat %d.No es pot trobar la posició actual al fitxer '%s'No es pot obtenir informació de la clau del registre '%s'No es pot obtenir l'objecte de JavaScriptNo es pot inicialitzar el flux de deflació de zlib.No es pot inicialitzar el flux d'inflació de zlib.No es pot supervisar si hi ha canvis al directori inexistent "%s".No es pot obrir la clau del registre '%s'No es pot llegir del flux d'inflació: %sNo es pot llegir el flux d'inflació: EOF inesperat al flux subjacent.No es pot llegir el valor de '%s'No es pot llegir el valor de la clau '%s'No es pot executar un script de JavaScript sense un document HTML vàlidNo es pot desar la imatge al fitxer '%s': extensió desconeguda.No es pot desar el contingut de registre al fitxer.No es pot definir la prioritat del fil d'execucióNo es pot definir el valor de '%s'No es pot escriure a l'entrada estàndard del procés fillNo es pot escriure al flux de deflació: %sCancel·laNo es poden enumerar els fitxers '%s'No es poden enumerar els fitxers del directori '%s'No es pot trobar cap connexió activa de marcatge telefònic: %sNo es pot trobar la ubicació del fitxer de la llibreta d'adrecesNo es pot obtenir una instància activa de "%s"No es pot obtenir el rang de prioritats per a la política de planificació %d.No es pot obtenir el nom del servidorNo es pot obtenir el nom oficial del servidorNo es pot penjar - no hi ha cap connexió de marcatge telefònic activa.No es pot inicialitzar OLENo es poden inicialitzar els sòcolsNo es pot carregar la icona de '%s'.No es poden carregar recursos de '%s'.No es poden carregar els recursos del fitxer '%s'.No es pot obrir el document HTML: %sNo es pot obrir el llibre d'ajuda HTML: %sNo es pot obrir el fitxer de continguts: %sNo es pot obrir el fitxer per a la impressió PostScript!No es pot obrir el fitxer d'índex: %sNo es pot obrir el fitxer de recursos '%s'.No es pot imprimir una pàgina buida.No es pot llegir el nom del tipus de '%s'!No es pot reprendre el fil d'execució %lxNo es pot obtenir la política de planificació de fils d'execució.No es pot definir la configuració local a la llengua "%s".No es pot iniciar el fil d'execució: s'ha produït un error en escriure el TLS.No es pot suspendre el fil d'execució %lxNo es pot esperar a la finalització del fil d'execucióCaptionTextDistingeix entre majúscules i minúsculesMode categoritzatPropietats de la cel·laCèltic (ISO-8859-14)Cen&tratCentratEuropeu central (ISO-8859-2)CentreCentra el text.CentratT&ria...Canvia l'estil de llistaCanvia l'estil d'objecteCanvia les propietatsCanvia l'estilEls canvis no es desaran per a evitar sobreescriure el fitxer existent "%s"No s'ha pogut canviar el directori actual a "%s"Estils de caràcterMarqueu-ho per a afegir un punt després del pic.Marqueu-ho per a afegir un parèntesi a la dreta.Marqueu-ho per a editar totes les vores alhora.Marqueu-ho per a envoltar el pic entre parèntesis.Marqueu-ho per a indicar una disposició de text de dreta a esquerra.Marqueu-ho per a fer que la lletra sigui negreta.Marqueu-ho per a fer que la lletra sigui cursiva.Marqueu-ho per a fer que la lletra sigui subratllada.Marqueu-ho per a reiniciar la numeració.Marqueu-ho per a mostrar una ratlla a través del text.Marqueu-ho per a mostrar el text en majúscules.Marqueu-ho per a mostrar el text en versaleta.Marqueu-ho per a mostrar el text en subíndex.Marqueu-ho per a mostrar el text en superíndex.Marqueu-ho per a suprimir la divisió de paraules.Trieu el proveïdor d'Internet a qui voleu trucarTrieu un directori:Trieu un fitxerTrieu un colorTrieu el tipus de lletraS'ha detectat una dependència circular que implica el mòdul "%s".&TancaClasse no registrada.NetejaNeteja el contingut del registreFeu clic per a aplicar l'estil seleccionat.Feu clic per a cercar un símbol.Feu clic per a cancel·lar els canvis al tipus de lletra.Feu clic per a cancel·lar la selecció del tipus de lletra.Feu clic per a canviar el color de la lletra.Feu clic per a canviar el color de fons del text.Feu clic per a canviar el text del color.Feu clic per a triar el tipus de lletra d'aquest nivell.Feu clic per a tancar aquesta finestra.Feu clic per a confirmar els canvis al tipus de lletra.Feu clic per a confirmació la selecció del tipus de lletra.Feu clic per a crear un estil de caixa nou.Feu clic per a crear un estil de caràcter nou.Feu clic per a crear un estil de llista nou.Feu clic per a crear un estil de paràgraf nou.Feu clic per a crear una posició de tabulació nova.Feu clic per a suprimir totes les posicions de tabulació.Feu clic per a suprimir l'estil seleccionat.Feu clic per a suprimir la posició de tabulació seleccionada.Feu clic per a editar l'estil seleccionat.Feu clic per a canviar el nom de l'estil seleccionat.TancaTanca-ho totTanca el document actualTanca aquesta finestraContrauColorColorEl diàleg de selecció de color ha fallat amb l'error %0lx.Color:Columna %uNo s'ha pogut convertir a Unicode l'argument %d de la línia d'ordres i s'ignorarà.El diàleg normal ha fallat amb el codi d'error %0lx.Aquest sistema no suporta la composició, activeu-la al vostre gestor de finestres.Fitxer d'ajuda HTML comprimit (*.chm)|*.chm|OrdinadorEl nom d'una entrada de configuració no pot començar amb '%c'.ConfirmaS'està connectant...ContingutControlDarkControlLightLa conversió al joc de caràcters '%s' no funciona.ConverteixS'ha copiat al porta-retalls: "%s"Còpies:CopiaCopia la seleccióNo es suporta copiar més d'un bloc seleccionat al porta-retalls.Cantonada&Radi de la cantonada:No s'ha pogut crear el fitxer temporal '%s'No s'ha pogut extreure %s a %s: %sNo s'ha pogut trobar la pestanya per a l'identificadorNo s'ha pogut trobar el fitxer '%s'.No s'ha pogut enregistrar el carregador personalitzat de tipus de lletra de DirectWrite.No s'ha pogut definir el directori de treball actualNo s'ha pogut iniciar la previsualització del document.No s'ha pogut iniciar la impressió.No s'han pogut transferir dades a la finestraNo s'ha pogut afegir una imatge a la llista d'imatges.No s'ha pogut crear el context d'OpenGLNo s'ha pogut crear un temporitzadorNo s'han pogut enumerar les traduccionsNo s'ha pogut trobar el símbol '%s' en una biblioteca dinàmicaNo s'ha pogut obtenir el punter del fil d'execució actualNo s'ha pogut inicialitzar la taula de resums del GIF.No s'ha pogut carregar una imatge PNG - el fitxer és corrupte o no hi ha prou memòria.No s'han pogut carregar les dades de so de '%s'.No s'ha pogut obtenir el nom de la carpetaNo s'ha pogut obrir l'àudio: %sNo s'ha pogut registrar el format '%s' del porta-retalls.No es pot obtenir la informació de l'element de control de la llista %d.No s'ha pogut desar la imatge PNG.No s'ha pogut finalitzar el fil d'execucióNo s'ha trobat el paràmetre Create %s als paràmetres RTTI declaratsCrea un directoriCrea un directori nouCrea un document nouNo s'ha pogut crear %s "%s".Re&tallaDirectori actual:PersonalitzatMida personalitzadaPersonalitza les columnesRetallaRetalla la seleccióCiríl·lic (ISO-8859-5)Full D, 22 x 34 polz.Ha fallat la petició d'atiar el DDECapçalera DIB: La codificació no coincideix amb la profunditat de bits.Capçalera DIB: Alçada de la imatge > 32767 píxels per fitxer.Capçalera DIB: Amplada de la imatge > 32767 píxels per fitxer.Capçalera DIB: Profunditat de bits desconeguda al fitxer.Capçalera DIB: Codificació desconeguda al fitxer.Sobre DL, 110 x 220 mmRatllatInforme de depuració "%s"No s'ha pogut crear l'informe de depuració.No s'ha pogut generar l'informe de depuració.DecoratiuCodificació per defecteTipus de lletra per defecteImpressora per defecteSuprimeixSuprimeix-ho &totSuprimeix la columnaSuprimeix la filaSuprimeix l'estilSuprimeix el textSuprimeix l'elementSuprimeix la seleccióVoleu suprimir l'estil %s?S'ha suprimit el fitxer antic de blocatge '%s'.No s'ha pogut suprimir la clau d'accés per "%s": %s.La dependència "%s" del mòdul "%s" no existeix.DescendentDesktopDesenvolupat per DesenvolupadorsLes funcions de marcatge telefònic no estan disponibles perquè el servei d'accés remot (RAS) no està instal·lat en aquest dispositiu. Instal·leu-lo.Sabíeu que...S'ha produït un error %d de DirectFB.DirectorisNo s'ha pogut crear el directori '%s'No s'ha pogut suprimir el directori '%s'El directori no existeixEl directori no existeix.Voleu descartar els canvis i tornar a carregar la darrera versió desada?Mostra tots els elements de l'índex que continguin la subcadena donada. La cerca no distingeix entre majúscules i minúscules.Mostra el diàleg d'opcionsMostra l'ajuda mentre navegueu pels llibres de l'esquerra.Voleu desar els canvis fets a %s?Document:Documentació feta per Redactors de la documentacióNo desisFetFet.PuntejatDobleTargeta postal japonesa doble girada, 148 x 200 mmIdentificador utilitzat dues vegades: %dAvallArrossegaFull E, 34 x 44 polz.EOF mentre es llegia del descriptor inotifyEditaEdita l'elementTemps transcorregut:Activa el valor d'alçada.Activa el valor màxim d'amplada.Activa el valor d'alçada mínima.Activa el valor mínim d'amplada.Activa el valor d'amplada.Activa l'alineació vertical.Activa un color de fons.Activa una ombra.Activa la distància de difuminat.Activa el color de l'ombra.Activa l'opacitat de l'ombra.Activa la difusió de l'ombra.Introduïu un nom per a l'estil de caixaIntroduïu un nom per a l'estil de caràcterIntroduïu un nom per a l'estil de llistaIntroduïu un nom per a l'estil nouIntroduïu un nom per a l'estil de paràgrafIntroduïu l'ordre per a obrir el fitxer "%s":Entrades trobadesSobre d'invitació, 220 x 220 mmNo s'han pogut expandir les variables d'entorn: manca '%c' a la posició %u a '%s'.ErrorS'ha produït un error en tancar el descriptor epollS'ha produït un error en tancar la instància kqueueS'ha produït un error en copiar el fitxer '%s' a '%s'.S'ha produït un error en crear el directoriS'ha produït un error en llegir la imatge DIB.S'ha produït un error al recurs: %sS'ha produït un error en llegir les opcions de configuració.Error executant JavaScript: %sS'ha produït un error en desar les dades de configuració de l'usuari.S'ha produït un error en imprimir: Error: Error: %s (%d)Esperanto (ISO-8859-3)Temps estimat:Fitxers executables (*.exe)|*.exe|ExecutaHa fallat l'execució de l'ordre '%s'Executiu, 7 1/4 x 10 1/2 polz.ExpandeixExportació de la clau del registre: el fitxer "%s" ja existeix i no se sobreescriurà.Codificació de pàgina estesa d'Unix per al japonès (EUC-JP)No s'ha pogut executar '%s' a '%s'.Nom del tipus de lletraNo s'ha pogut accedir el fitxer de blocatge.No s'ha pogut afegir el tipus de lletra personalitzat "%s".No s'ha pogut afegir el descriptor %d al descriptor epoll %dNo s'ha pogut assignar %luKb de memòria per a dades de mapa de bits.No s'ha pogut assignar el color per a l'OpenGLNo s'ha pogut assignar memòria per a la compressió LZMA.No s'ha pogut assignar memòria per a la descompressió LZMA.No s'ha pogut canviar el mode de vídeoNo s'ha pogut comprovar el format del fitxer d'imatge "%s".No s'ha pogut netejar el directori d'informes de depuració "%s"No s'ha pogut tancar el manegador del fitxerNo s'ha pogut tancar el fitxer de blocatge '%s'No s'ha pogut tancar el porta-retalls.No s'ha pogut tancar la pantalla "%s"No s'ha pogut connectar: manca el nom d'usuari o la contrasenya.No s'ha pogut connectar: no hi ha cap proveïdor d'Internet al qual trucar.No s'ha pogut copiar el contingut del diàleg al porta-retalls.No s'ha pogut copiar el valor del registre '%s'No s'ha pogut copiar el contingut de la clau del registre '%s' a '%s'.No s'ha pogut copiar el fitxer '%s' a '%s'No s'ha pogut copiar la subclau del registre '%s' a '%s'.No s'ha pogut crear la cadena DDENo s'ha pogut crear el marc pare de l'MDI.No s'ha pogut crear un nom de fitxer temporalNo s'ha pogut crear una canonada anònimaNo s'ha pogut crear una instància de "%s"No s'ha pogut crear una connexió al servidor '%s' en el tema '%s'No s'ha pogut crear el cursor.No s'ha pogut crear el directori "%s"No s'ha pogut crear el directori '%s' (Teniu els permisos necessaris?)No s'ha pogut crear el descriptor epollNo s'ha pogut crear l'objecte de configuració de tipus de lletra.No s'ha pogut crear l'entrada del registre dels fitxers '%s'.No s'ha pogut crear el diàleg estàndard de cerca/substitueix (codi d'error %d)No s'ha pogut crear la canonada de despertament utilitzada pel bucle d'esdeveniments.No s'ha pogut mostrar el document HTML amb la codificació %sNo s'ha pogut buidar el porta-retalls.No s'han pogut enumerar els modes de vídeoNo s'ha pogut establir un bucle d'avís amb el servidor DDENo s'ha pogut establir la connexió de marcatge telefònic: %sNo s'ha pogut executar '%s' No s'ha pogut executar curl, instal·leu-lo al PATH.No s'ha pogut trobar el CLSID de "%s"No s'ha pogut trobar cap coincidència per a l'expressió regular: %sNo s'ha pogut trobar el nivell d'emulació de web view al registreNo s'han pogut obtenir els noms dels proveïdors d'Internet: %sNo s'ha pogut obtenir la interfície d'automatització OLE per a "%s"No s'han pogut obtenir les dades del porta-retallsNo s'ha pogut obtenir l'hora del sistema localNo s'ha pogut obtenir el directori de treballNo s'ha pogut inicialitzar la GUI: no s'ha trobat cap tema integrat.No s'ha pogut inicialitzar la compressió LZMA: error inesperat %u.No s'ha pogut inicialitzar la descompressió LZMA: error inesperat %u.No s'ha pogut inicialitzar l'ajuda MS HTML.No s'ha pogut inicialitzar l'OpenGLNo s'ha pogut inicialitzar la connexió de marcatge telefònic: %sNo s'ha pogut inserir el text al control.No s'ha pogut inspeccionar el fitxer de blocatge '%s'No s'ha pogut instal·lar el gestor de senyalsNo s'ha pogut sincronitzar amb un fil d'execució, s'ha detectat una possible fuita de memòria - reinicieu el programaNo s'ha pogut matar el procés %dNo s'ha pogut carregar el mapa de bits "%s" dels recursos.No s'ha pogut carregar la icona "%s" dels recursos.No s'han pogut carregar les icones del recurs '%s'.No s'ha pogut carregar la imatge %%d del fitxer '%s'.No s'ha pogut carregar la imatge %d del flux.No s'ha pogut carregar la imatge del fitxer "%s".No s'ha pogut carregar el metafitxer del fitxer "%s".No s'ha pogut carregar mpr.dll.No s'ha pogut carregar el recurs "%s".No s'ha pogut carregar la biblioteca compartida '%s'No s'ha pogut carregar el so de "%s" (error %d).No s'ha pogut blocar el recurs "%s".No s'ha pogut blocar el fitxer de blocatge '%s'No s'ha pogut modificar el descriptor %d al descriptor epoll %dNo s'han pogut modificar les hores del fitxer '%s'No s'han pogut supervisar els canals d'E/SNo s'ha pogut obrir '%s' per a llegir-loNo s'ha pogut obrir '%s' per a escriure-hiNo s'ha pogut obrir l'arxiu CHM '%s'.No s'ha pogut obrir l'URL "%s" al navegador per defecte.No s'ha pogut obrir l'URL "%s" al navegador predeterminatNo s'ha pogut obrir el directori "%s" per a supervisar-lo.No s'ha pogut obrir la pantalla "%s".No s'ha pogut obrir el fitxer temporal.No s'ha pogut obrir el porta-retalls.No s'ha pogut analitzar el Plural-Forms: '%s'No s'ha pogut preparar la reproducció de "%s".No s'han pogut posar les dades al porta-retallsNo s'ha pogut llegir el PID del fitxer de blocatge.No s'han pogut llegir les opcions de la configuració.No s'ha pogut llegir el document del fitxer "%s".No s'ha pogut llegir l'esdeveniment de la canonada DirectFBNo s'ha pogut llegir la canonada de despertamentNo s'ha pogut llegir el fitxer de text "%s".No s'ha pogut redirigir l'entrada/sortida del procés fillNo s'ha pogut redirigir l'E/S del procés fillNo s'ha pogut registrar el servidor DDE '%s'No s'ha pogut registrar la configuració de tipus de lletra utilitzant tipus de lletra privats.No s'ha pogut recordar la codificació del joc de caràcters '%s'.No s'ha pogut suprimir el fitxer d'informe de depuració "%s"No s'ha pogut suprimir el fitxer de blocatge '%s'No s'ha pogut suprimir el fitxer de blocatge antic '%s'.No s'ha pogut canviar el nom del valor del registre '%s' a '%s'.No s'ha pogut canviar el nom del fitxer '%s' a '%s' perquè el fitxer de destinació ja existeix.No s'ha pogut canviar el nom de la clau del registre '%s' a '%s'.No s'ha pogut restablir web view a un nivell d'emulació estàndardNo s'han pogut obtenir les hores del fitxer '%s'No s'ha pogut recuperar el text del missatge d'error del RASNo s'han pogut obtenir els formats del porta-retalls suportatsNo s'ha pogut desar el document al fitxer "%s".No s'ha pogut desar la imatge de mapa de bits al fitxer "%s".No s'ha pogut enviar una notificació d'avís DDENo s'ha pogut definir el mode de transferència FTP a %s.No s'han pogut definir les dades del porta-retalls.No s'han pogut definir els permisos del fitxer de blocatge '%s'No s'ha pogut definir la prioritat del procésNo s'ha pogut definir els permisos del fitxer temporalNo s'ha pogut definir el nivell de concurrència del fil d'execució a %luNo s'ha pogut definir la prioritat del fil d'execució %d.No s'ha pogut configurar la canonada no blocant, és possible que el programa es pengi.No s'ha pogut establir web view a un nivell d'emulació modernNo s'ha pogut emmagatzemar la imatge '%s' al VFS de la memòria!No s'ha pogut canviar la canonada DirectFB al mode no blocantNo s'ha pogut canviar la canonada de despertament al mode no blocantNo s'ha pogut finalitzar el fil d'execució.No s'ha pogut finalitzar el bucle d'avís amb el servidor DDENo s'ha pogut finalitzar la connexió de marcatge telefònic: %sNo s'ha pogut fer touch al fitxer '%s'No s'ha pogut descarregar la biblioteca compartidaNo s'ha pogut desblocar el fitxer de blocatge '%s'No s'ha pogut desregistrar el servidor DDE '%s'No s'ha pogut desregistrar el descriptor %d del descriptor epoll %dNo s'ha pogut actualitzar el fitxer de configuració de l'usuari.No s'ha pogut pujar l'informe de depuració (codi d'error %d).No s'ha pogut escriure al fitxer de blocatge '%s'FalsFamíliaError fatalFitxerNo s'ha pogut obrir el fitxer "%s" per a llegir-lo.No s'ha pogut obrir el fitxer "%s" per a escriure-hi.El fitxer '%s' ja existex, esteu segur que el voleu sobreescriure?No s'ha pogut suprimir el fitxer '%s'No s'ha pogut canviar el nom del fitxer '%s' a '%s'No s'ha pogut carregar el fitxer.El diàleg de fitxer ha fallat amb el codi d'error %0lx.Error de fitxerAquest nom de fitxer ja existeix.Tipus de fitxer:FitxersFitxers (%s)FiltreCercaTroba i substitueix dins el documentCerca dins el documentCerca...PrimerPrimera pàginaFixaTipus de lletra de mida fixa:De mida fixa.
negreta cursiva FlotantDisquetFoli, 8 1/2 x 13 polz.Tipus de lletra&Pes de la lletra:El fitxer de tipus de lletra "%s" no es pot utilitzar ja que no es troba dins el directori de tipus de lletra "%s".No s'ha pogut carregar el fitxer de tipus de lletra "%s"El fitxer de tipus de lletra "%s" no existeix.Mida de la lletra:&Estil de la lletra:Tipus de lletra:El fitxer d'índex de tipus de lletra %s ha desaparegut mentre es carregaven els tipus de lletra.No s'ha pogut bifurcarEndavantEls href de reenviament no estan suportatsS'han trobat %i coincidènciesDe:FúcsiaGIF: sembla que s'ha truncat el flux de dades.GIF: error al format d'imatge GIF.GIF: no hi ha prou memòria.El GTK+ instal·lat en aquest dispositiu és massa antic i no suporta la composició de pantalla, instal·leu el GTK+ 2.12 o posterior.Tema GTK+GeneralPostScript genèricGerman Legal Fanfold, 8 1/2 x 13 polz.German Std Fanfold, 8 1/2 x 12 polz.S'ha cridat GetProperty sense un getter vàlidS'ha cridat GetPropertyCollection en un mètode d'accés genèricS'ha cridat GetPropertyCollection sense un getter de col·lecció vàlidVés endarrereVés endavantPuja un nivell en la jerarquia del documentVés al directori de l'usuariVés al directori pareArt gràfic per GrisGrayTextGrec (ISO-8859-7)VerdVerd:RanuraAquesta versió de zlib no suporta GzipProjecte d'ajuda HTML (*.hhp)|*.hhp|L'àncora l'HTML %s no existeix.Fitxers HTML (*.html;*.htm)|*.html;*.htm|Disc durHebreu (ISO-8859-8)AjudaOpcions del navegador de l'ajudaÍndex de l'ajudaAjuda de la impressióTemes de l'ajudaLlibres d'ajuda (*.htb)|*.htb|Llibres d'ajuda (*.zip)|*.zip|No s'ha trobat el directori d'ajuda "%s".No s'ha trobat el fitxer d'ajuda "%s".Ajuda: %sAmaga aquest missatge de notificació.HighlightHighlightTextIniciDirectori de l'usuariCom flotarà l'objecte en relació al text.ICO: S'ha produït un error en llegir la màscara DIB.ICO: S'ha produït un error en escriure el fitxer d'imatge!ICO: Imatge massa alta per a una icona.ICO: Imatge massa ampla per a una icona.ICO: Índex d'icona invàlid.IFF: sembla que s'ha truncat el flux de dades.IFF: error en el format d'imatge IFF.IFF: no hi ha prou memòria.IFF: s'ha produït un error desconegut!!!ISO-2022-JPSi és possible, proveu de canviar els paràmetres de disposició per a fer que la impressió sigui més estreta.Si teniu informació addicional relativa a aquest informe d'errors, introduïu-la aquí i s'hi adjuntarà:Si voleu suprimir completament aquest informe de depuració, trieu el botó "Cancel·la", però tingueu en compte que això pot impedir que es millori el programa, de manera que si us és possible, continueu amb la generació de l'informe. Ignorant el registre de dades addicionals mal format, el fitxer ZIP pot estar corromputS'ignora el valor "%s" de la clau "%s".Classe d'objecte invàlida (no és un wxEvtHandler) com a origen de l'esdevenimentNombre de paràmetres incorrecte per al mètode ConstructObjectNombre de paràmetres incorrecte per al mètode CreateNom de directori no permès.Especificació de fitxer no permesa.La imatge i la màscara tenen mides diferents.El fitxer d'imatge no és del tipus %d.La imatge no és del tipus %s.No és possible crear un control d'edició rica, s'utilitzarà en el seu lloc un control de text simple. Reinstal·leu riched32.dllNo és possible obtenir l'entrada del procés fillNo és possible obtenir els permisos del fitxer '%s'No és possible sobreescriure el fitxer '%s'No és possible definir els permisos del fitxer '%s'InactiveBorderInactiveCaptionInactiveCaptionTextMida de fotograma de GIF incorrecta (%u, %d) per al fotograma número %uNombre incorrecte d'arguments.SagnatIndentació i espaiatÍndexIndi (ISO-8859-12)InformacióHa fallat la inicialització a post init, s'està avortant.InsereixInsereix un campInsereix una imatgeInsereix un objecteInsereix textInsereix un salt de pàgina abans del paràgraf.InteriorÍndex d'imatge TIFF invàlid.Especificació de mode de pantalla invàlida '%s'.Especificació de geometria invàlida '%s'Esdeveniment inotify invàlid per a "%s"Fitxer de blocatge invàlid '%s'.Catàleg de missatges invàlid.Identificador d'objecte passat a GetObjectClassInfo nul o invàlidIdentificador d'objecte passat a HasObjectClassInfo nul o invàlidExpressió regular invàlida '%s': %sValor invàlid %ld per a la clau booleana "%s" al fitxer de configuració.CursivaSobre italià, 110 x 230 mmJPEG: No s'ha pogut carregar - probablement el fitxer és corrupte.JPEG: No s'ha pogut desar la imatge.Postal japonesa doble, 200 x 148 mmSobre japonès Chou núm. 3Sobre japonès Chou núm. 3 giratSobre japonès Chou núm. 4Sobre japonès Chou núm. 4 giratSobre japonès Kaku núm. 2Sobre japonès Kaku núm. 2 giratSobre japonès Kaku núm. 3Sobre japonès Kaku núm. 3 giratSobre japonès You núm. 4Sobre japonès You núm. 4 giratPostal japonesa, 100 x 148 mmPostal japonesa girada, 148 x 100 mmVés aJustificatJustifica el text a l'esquerra i a la dreta.KOI8-RKOI8-U&Interlineat:Error de compressió LZMA a l'hora de buidar la sortida: %sError de compressió LZMA: %sError de descompressió LZMA: %sApaïsatÚltimÚltima pàginaNo s'ha mostrat el darrer missatge repetit ("%s", %u vegada)No s'ha mostrat el darrer missatge repetit ("%s", %u vegades)Ledger, 17 x 11 polz.EsquerraEsquerra (&primera línia):Marge esquerre (mm):Alinea el text a l'esquerra.Legal extra, 9 1/2 x 15 polz.Legal, 8 1/2 x 14 polz.Carta extra, 9 1/2 x 12 polz.Carta extra transversal, 9,275 x 12 polz.Carta plus, 8 1/2 x 12,69 polz.Carta girada, 11 x 8 1/2 polz.Carta petita, 8 1/2 x 11 polz.Carta transversal, 8 1/2 x 11 polz.Carta, 8 1/2 x 11 polz.LlicènciaPrimaLlimaLa línia %lu del fitxer de mapa "%s" té sintaxi invàlida, s'ha omès.Interlineat:L'enllaç contenia '//', s'ha convertit a un enllaç absolut.Estil de llistaEstils de llistaMostra una llista de mides de lletra en punts.Mostra la llista de tipus de lletra disponibles.Carrega el fitxer %sS'està carregant: El fitxer de blocatge '%s' té un propietari incorrecte.El fitxer de blocatge '%s' té els permisos incorrectes.Registre desat al fitxer '%s'.Lletres en minúsculesNombres romans en minúsculesFill de l'MDILes funcions de l'ajuda MS HTML no estan disponibles perquè la biblioteca de l'ajuda MS HTML no està instal·lada en aquest dispositiu. Instal·leu-la.Ma&ximitzaMacArabicMacArmenianMacBengaliMacBurmeseMacCelticMacCentralEurRomanMacChineseSimpMacChineseTradMacCroatianMacCyrillicMacDevanagariMacDingbatsMacEthiopicMacExtArabicMacGaelicMacGeorgianMacGreekMacGujaratiMacGurmukhiMacHebrewMacIcelandicMacJapaneseMacKannadaMacKeyboardGlyphsMacKhmerMacKoreanMacLaotianMacMalayalamMacMongolianMacOriyaMacRomanMacRomanianMacSinhaleseMacSymbolMacTamilMacTeluguMacThaiMacTibetanMacTurkishMacVietnameseCrea una selecció:MargesMarróDistingeix entre majúscules i minúsculesAlçada màxima:Amplada màxima:S'ha produït un error en la reproducció del mitjà: %sEl VFS en memòria ja conté el fitxer '%s'!MenúMissatgeTema metàl·licNo s'ha trobat el mètode o la propietat.Mi&nimitzaAlçada mínima:Amplada mínima:MinimitzaManca un paràmetre necessari.ModernModificatNo s'ha pogut inicialitzar el mòdul "%s"Sobre Monarch, 3 7/8 x 1/2 polz.Actualment no està suportat supervisar els canvis de fitxers individuals.Mou cap avallMou cap amuntMou l'objecte al paràgraf següent.Mou l'objecte al paràgraf anterior.Propietats de múltiples cel·lesNomBlau maríXarxaNou&Estil de caixa nou...Estil de &caràcter nou...Estil de &llista nou...Estil de &paràgraf nou...Estil nouElement nouNom nouPàgina següentNoNo hi ha definit cap gestor d'animació per al tipus %ld.No hi ha definit cap gestor de mapa de bits per al tipus %d.No hi ha configurada cap aplicació per defecte per als fitxers HTML.No s'ha trobat cap entrada.No s'ha trobat cap tipus de lletra per a mostrar text amb la codificació '%s', però hi ha una codificació alternativa, '%s'. Voleu fer servir aquesta codificació (si no, n'haureu de triar una altra)?No s'ha trobat cap tipus de lletra per a mostrar text amb la codificació '%s'. Voleu triar un tipus de lletra perquè es faci servir per a aquesta codificació (si no, el text amb aquesta codificació no es mostrarà correctament)?No s'ha trobat cap gestor per al tipus d'animació.No s'ha trobat cap gestor per al tipus d'imatge.No hi ha definit cap gestor d'imatge per al tipus %d.No hi ha definit cap gestor d'imatge per al tipus %s.Encara no s'ha trobat cap pàgina que hi coincideixiNo hi ha soNo hi ha cap color sense utilitzar a la imatge que voleu emmascarar.No s'ha trobat cap assignació vàlida al fitxer "%s".CapNòrdic (ISO-8859-10)NormalText normal
i subratllat. Tipus de lletra normal:No %sNo disponible per aquesta plataformaNo hi ha espai suficient al disc per a la descàrrega.No subratllatNota, 8 1/2 x 11 polz.AvísEsquema numeratD'acordS'ha produït un error d'automatització OLE a %s: %sPropietats de l'objecteLa implementació de l'objecte no suporta arguments amb nom.Els objectes han de tenir un atribut d'identificacióOlivaOpaci&tat:Opacitat:Obre un fitxerObre un document HTMLObre un document existentObre el fitxer "%s"Obre...El controlador d'OpenGL no suporta OpenGL 3.0 o superior.L'operació no és permesa.L'opció '%s' no es pot negarL'opció '%s' requereix un valor.Opció '%s': '%s' no es pot convertir a data.OpcionsCarabassaOrientacióS'han esgotat els identificadors de finestra. És recomanable tancar l'aplicació.ContornExteriorS'ha produït un desbordament en forçar els valors dels arguments.PCX: no s'ha pogut assignar la memòriaPCX: format d'imatge no suportatPCX: imatge invàlidaPCX: això no és un fitxer PCX.PCX: s'ha produït un error desconegut!!!PCX: número de versió massa baixPNM: No s'ha pogut assignar la memòria.PNM: Format de fitxer no reconegut.PNM: El fitxer sembla truncat.PRC 16K, 146 x 215 mmPRC 16K giratPRC 32K, 97 x 151 mmPRC 32K giratPRC 32K (Gros), 97 x 151 mmPRC 32K (Gros) giratSobre PRC núm. 1, 114 x 162 mmSobre PRC núm. 1 girat, 165 x 102 mmSobre PRC núm. 10, 324 x 458 mmSobre PRC núm. 10 girat, 458 x 324 mmSobre PRC núm. 2, 102 x 176 mmSobre PRC núm. 2 girat, 176 x 102 mmSobre PRC núm. 3, 125 x 176 mmSobre PRC núm. 3 girat, 176 x 125 mmSobre PRC núm. 4, 110 x 208 mmSobre PRC núm. 4 girat, 208 x 110 mmSobre PRC núm. 5, 110 x 220 mmSobre PRC núm. 5 girat, 220 x 110 mmSobre PRC núm. 6, 120 x 230 mmSobre PRC núm. 6 girat, 230 x 120 mmSobre PRC núm. 7, 160 x 230 mmSobre PRC núm. 7 girat, 230 x 160 mmSobre PRC núm. 8, 120 x 309 mmSobre PRC núm. 8 girat, 309 x 120 mmSobre PRC núm. 9, 229 x 324 mmSobre PRC núm. 9 girat, 324 x 229 mmSeparacióPàgina %dPàgina %d de %dConfiguració de la pàginaConfiguració de la pàginaPàginesMida del paperEstils de paràgrafS'ha passat un objecte ja registrat a SetObjectS'ha passat un objecte desconegut a GetObjectClau d'accés:EnganxaEnganxa la seleccióPerí&odePermisosPropietats de la imatgeNo s'ha pogut crear la canonadaTrieu un tipus de lletra vàlid.Trieu un fitxer existent.Trieu la pàgina que vulgueu mostrar:Trieu a quin proveïdor d'Internet us voleu connectarSeleccioneu les columnes que es mostraran i definiu-ne l'ordre:Espereu mentre s'imprimeix...Mida en puntsVerticalPosicióFitxer PostScriptPreferènciesS'està preparantPrevisualització:Pàgina anteriorImprimeixPrevisualització de la impressióS'ha produït un error en la previsualització de la impressióRang d'impressióConfiguració de la impressióImprimeix en colorNo s'ha pogut inicialitzar l'operació d'impressióPre&visualitza la impressió...No s'ha pogut crear la previsualització de la impressió.Previsualització de la impressió...Cua d'impressióImprimeix aquesta pàginaImprimeix a un fitxerImprimeix...ImpressoraOrdre de la impressora:Opcions de la impressoraOpcions de la impressora:Impressora...Impressora:S'està imprimintS'està imprimint S'ha produït un error d'impressióEl control web del sistema no suporta impressióS'està imprimint la pàgina %dS'està imprimint la pàgina %d de %dS'està imprimint la pàgina %d...S'està imprimint...ImpressióNo s'ha pogut processar l'informe de depuració, es deixaran els fitxers al directori "%s".Progrés:PropietatsPropietatError de propietatPorpraQuarto, 215 x 275 mmQüestióSurtSurt d'aquest programaS'ha produït un error de lectura al fitxer '%s'No s'ha pogut llegir la clau d'accés per "%s": %s.LlestVermellVermell:RefésRefés la darrera accióRefrescaLa clau del registre '%s' ja existeix.La clau del registre '%s' no existeix, no en podeu canviar el nom.La clau del registre '%s' és necessària per al funcionament normal del sistema, si la suprimiu, deixareu el sistema en un estat inservible: s'ha avortat l'operació.El valor del registre "%s" no és binari (sinó del tipus %s)El valor del registre "%s" no és numèric (sinó del tipus %s)El valor del registre "%s" no és de text (sinó del tipus %s)El valor del registre '%s' ja existeix.NormalRelatiuEntrades rellevants:Temps restant:SuprimeixSuprimeix el picElimina la pàgina actual dels preferitsEl renderitzador "%s" té la versió incompatible %d.%d i no s'ha pogut carregar.Torna a numerar la llistaSu&bstitueix...SubstitueixSubstitueix-ho &totSubstitueix per:Substitueix...L'entrada d'informació necessària és buida.El recurs '%s' no és un catàleg de missatges vàlid.L'obtenció de la sortida d'un script de JavaScript no està suportada amb WebKit v1Reverteix a la versió desadaArruga&De dreta a esquerraDretaMarge dret (mm):Alinea el text a la dreta.RomanFila %iRunScriptAsync no suportatNom del pic es&tàndard:DesaDesa el fitxer %s&Anomena i desa...Anomena i desaAnomena i desa...Desa el document actualDesa el document actual amb un nom de fitxer diferentDesa el contingut del registre al fitxerNo s'ha pogut desar la clau d'accés per "%s": %s.ScriptScrollbarCercaCerca totes les coincidències del text que heu escrit a dalt al contingut dels llibres d'ajudaDirecció de la cercaCerca:Cerca a tots els llibresS'està cercant...SeccionsS'ha produït un error de cerca al fitxer '%s'S'ha produït un error de cerca al fitxer '%s' (els fitxers grossos no estan suportats per stdio)Seleccion&a-ho totSelecciona-ho totSeleccioneu una plantilla de documentSeleccioneu una visualització del documentSelecciona normal o negreta.Selecciona l'estil normal o cursiva.Selecciona subratllat o sense subratllat.SeleccióSelecciona el nivell de la llista a editar.S'esperava un separador després de l'opció '%s'.Defineix l'estil de la cel·laS'ha cridat SetProperty sense un setter vàlidConfigura...S'han trobat diverses connexions actives de marcatge telefònic, se'n triarà una aleatòriament.Difusió de l'ombr&a:OmbraC&olor de l'ombra:&Mostra els directoris ocults&Mostra els fitxers ocultsMostra el diàleg Quant aMostra-ho totMostra tots els elements a l'índexMostra/amaga el plafó de navegacióMostra un subconjunt d'Unicode.Mostra una previsualització de la configuració dels pics.Mostra una previsualització de la configuració del tipus de lletra.Mostra una previsualització del tipus de lletra.Mostra una previsualització de la configuració del paràgraf.Mostra la previsualització del tipus de lletra.ArgentTema monocrom simpleSimpleMidaMida:OmetInclinatVers&aletaSòlidNo s'ha pogut obrir aquest fitxer.No hi ha prou memòria per a crear una previsualització.Aquest nom ja s'utilitza. Trieu-ne un altre.El format d'aquest fitxer és desconegut.Les dades del so tenen un format no suportat.El fitxer de so '%s' té un format no suportat.EspaiatComprovació ortogràficaEstàndardStatement, 5 1/2 x 8 1/2 polz.EstàticEstat:AturaRatllatCadena a color: Especificació del color incorrecta: %sEstilEstil:Subín&dexSupe&ríndexSuperA/SuperA/A4, 227 x 356 mmSuperB/SuperB/A3, 305 x 487 mm&Suprimeix la divisió de paraulesSuísSímbol&Tipus de lletra per a símbols:SímbolsTIFF: No s'ha pogut assignar la memòria.TIFF: S'ha produït un error en carregar la imatge.TIFF: S'ha produït un error en llegir la imatge.TIFF: S'ha produït un error en desar la imatge.TIFF: S'ha produït un error en escriure la imatge.TIFF: La mida de la imatge és anormalment gran.Propietats de la taulaTabloide extra, 11,69 x 18 polz.Tabloide, 11 x 17 polz.TabulacionsXarxetTeletipPlantillesTailandès (ISO-8859-11)El servidor FTP no suporta l'ús del mode passiu.El servidor FTP no suporta l'ordre PORT.Els estils de pic disponibles.Els estils disponibles.El color de fons.L'estil de la línia de la vora.La mida del marge inferior.La mida de l'espaiat inferior.La posició inferior.El caràcter del pic.El codi del caràcter.El joc de caràcters '%s' és desconegut. Podeu seleccionar un altre joc de caràcters per a substituir-lo o triar [Cancel·la] si no pot ser substituïtEl format del porta-retalls '%d' no existeix.L'estil per defecte per al paràgraf següent.El directori '%s' no existeix. El voleu crear ara?El document "%s" no cap horitzontalment a la pàgina i es truncarà si s'imprimeix. Voleu continuar i imprimir-lo igualment?El fitxer '%s' no existeix i no s'ha pogut obrir. S'ha suprimit de la llista de fitxers utilitzats més recentment.El sagnat de la primera línia.El següent informe de depuració serà generat El color de la lletra.La família del tipus de lletra.El tipus de lletra del qual prendre el símbol.La mida en punts del tipus de lletra.La mida del tipus de lletra en punts.Les unitats, punts o píxels de la mida del tipus de lletra.L'estil del tipus de lletra.El pes de la lletra.No s'ha pogut determinar el format del fitxer '%s'.El desplaçament horitzontal.El sagnat esquerre.La mida del marge esquerre.La mida de l'espaiat esquerre.La posició esquerra.L'interlineat.El número de l'element de la llista.L'identificador de la configuració local és desconegut.L'alçada de l'objecte.L'alçada màxima de l'objecte.L'amplada màxima de l'objecte.L'alçada mínima de l'objecte.L'amplada mínima de l'objecte.L'amplada de l'objecte.El nivell del contorn.El missatge anterior s'ha repetit %u vegada.El missatge anterior s'ha repetit %u vegades.El missatge anterior s'ha repetit una vegada.L'interval a mostrar.L'informe conté els fitxers que es mostren a continuació. Si algun d'aquests fitxers conté informació privada, desmarqueu-los i se suprimiran de l'informe. No s'ha especificat el paràmetre necessari '%s'.El sagnat dret.La mida del marge dret.La mida de l'espaiat dret.La posició dreta.La distància del difuminat de l'ombra.El color de l'ombra.L'opacitat de l'ombra.La difusió de l'ombra.L'espaiat després del paràgraf.L'espaiat abans del paràgraf.El nom de l'estil.L'estil en què es basa aquest estil.La previsualització de l'estil.El sistema no pot trobar el fitxer especificat.La posició de la tabulació.Les posicions de la tabulació.No s'ha pogut desar el text.La mida del marge superior.La mida de l'espaiat superior.La posició superior.Cal especificar el valor de l'opció '%s'.El valor del radi de les cantonades.La versió del servei d'accés remot (RAS) instal·lada en aquest dispositiu és massa antiga, actualitzeu-la (hi manca la següent funció necessària: %s).El desplaçament vertical.Hi ha hagut un problema durant la configuració de la pàgina: pot ser que us calgui establir una impressora per defecte.Aquest document no cap horitzontalment a la pàgina i es truncarà en imprimir-lo.Això no és un %s.Aquesta plataforma no suporta la transparència al fons.Aquest programa s'ha compilat amb una versió massa antiga del GTK+, recompileu-lo amb el GTK+ 2.12 o posterior.Aquest programa no ha estat compilat amb el suport EGL requerit baix Wayland, o bé instal·li les biblioteques EGL i recompili, o bé executi'l baix un backend X11 establint la variable d'entorn GDK_BACKEND=x11 abans d'iniciar el seu programa.No s'ha pogut inicialitzar el mòdul de fils d'execució: no es pot emmagatzemar el valor a l'emmagatzematge local del fil d'execucióNo s'ha pogut inicialitzar el mòdul de fils d'execució: no s'ha pogut crear la clau del fil d'execucióNo s'ha pogut inicialitzar el mòdul de fils d'execució: no és possible assignar l'índex a l'emmagatzematge local del fil d'execucióLa configuració de prioritat del fil d'execució és ignorada.Mosaic &horitzontalMosaic &verticalS'ha excedit el temps límit d'espera en connectar al servidor FTP, proveu el mode passiu.Consell del diaEls consells no estan disponibles!A:Massa crides a EndStyle!TooltipTooltipTextSuperiorMarge superior (mm):Traduccions de TraductorsCertS'està provant de suprimir el fitxer '%s' del VFS en memòria, però no està carregat!Turc (ISO-8859-9)TipusEscriviu un nom de tipus de lletra.Escriviu una mida en punts.El tipus de l'argument %u no coincideix.El tipus ha de ser convertir d'enum a longL'operació de tipus "%s" ha fallat: La propietat etiquetada "%s" és del tipus "%s", NO "%s".US Std Fanfold, 14 7/8 x 11 polz.US-ASCIINo s'ha pogut afegir la supervisió inotifyNo s'ha pogut afegir la supervisió kqueueNo s'ha pogut associar el manegador amb el port de compleció d'E/SNo s'ha pogut tancar el manegador del port de compleció d'E/SNo s'ha pogut tancar la instància d'inotifyNo s'ha pogut tancar el camí '%s'No s'ha pogut tancar el manegador de '%s'No s'ha pogut crear el port de compleció d'E/SNo s'ha pogut crear el fil d'execució de treballs IOCPNo s'ha pogut crear la instància d'inotifyNo s'ha pogut crear la instància de kqueueNo s'ha pogut treure de la cua el paquet de complecióNo s'han pogut obtenir els esdeveniments de kqueueNo s'ha pogut inicialitzar el GTK+, teniu definit correctament DISPLAY?No s'ha pogut obrir el camí '%s'No s'ha pogut obrir el document HTML sol·licitat: %sNo s'ha pogut reproduir el so asíncronament.No s'ha pogut publicar l'estat de complecióNo s'ha pogut llegir el descriptor inotifyNo s'ha pogut suprimir la supervisió inotify %iNo s'ha pogut suprimir la supervisió kqueueNo s'ha pogut configurar la supervisió de '%s'No s'ha pogut iniciar el fil d'execució de treballs IOCPDesfés la supressióSubratllaSubratllatDesfésDesfés la darrera accióHi ha caràcters inesperats després de l'opció '%s'.Esdeveniment inesperat per a "%s": no hi ha cap descriptor de supervisió coincident.Paràmetre inesperat '%s'S'ha creat un port de compleció d'E/S inesperadament nouEl fil d'execució de treballs ha finalitzat de manera inadequadaUnicodeUnicode de 16 bits (UTF-16)Unicode de 16 bits Big Endian (UTF-16BE)Unicode de 16 bits Little Endian (UTF-16LE)Unicode de 32 bits (UTF-32)Unicode de 32 bits Big Endian (UTF-32BE)Unicode de 32 bits Little Endian (UTF-32LE)Unicode de 7 bits (UTF-7)Unicode de 8 bits (UTF-8)Desfés el sagnatUnitats per a l'amplada de la vora inferior.Unitats per al marge inferior.Unitats per a l'amplada del contorn inferior.Unitats per a l'espaiat inferior.Unitats per a la posició inferior.Unitats per al radi de les cantonades.Unitats per a l'amplada de la vora esquerra.Unitats per al marge esquerre.Unitats per a l'amplada del contorn esquerre.Unitats per a l'espaiat esquerre.Unitats per a la posició esquerra.Unitats per a l'alçada màxima d'objecte.Unitats per a l'amplada màxima de l'objecte.Unitats per a l'alçada mínima d'objecte.Unitats per a l'amplada mínima de l'objecte.Unitats per a l'alçada de l'objecte.Unitats per a l'amplada de l'objecte.Unitats per a l'amplada de la vora dreta.Unitats per al marge dret.Unitats per a l'amplada del contorn dret.Unitats per a l'espaiat dret.Unitats per a la posició dreta.Unitats per a l'amplada de la vora superior.Unitats per al marge superior.Unitats per a l'amplada del contorn superior.Unitats per a l'espaiat superior.Unitats per a la posició superior.Unitats per a aquest valor.DesconegutError DDE desconegut %08xS'ha passat un objecte desconegut a GetObjectClassInfoUnitat de resolució PNG desconeguda %dPropietat desconeguda %sS'ha ignorat la unitat de resolució TIFF desconeguda %dBase %d desconeguda. S'utilitzarà la base 10.S'ha produït un error desconegut de biblioteca dinàmicaCodificació desconeguda (%d)S'ha produït un error desconegut %08xExcepció desconegudaFormat de dades d'imatge desconegut.Opció llarga desconeguda '%s'Argument o argument amb nom desconegut.Opció desconeguda '%s''{' no tancat en una entrada per a tipus mime %s.Ordre sense nomNo especificatFormat de porta-retalls no suportat.Tema no suportat '%s'.AmuntLletres majúsculesNombres romans en majúsculesÚs: %s&Utilitza ombraUtilitza la configuració d'alineació actual.Nom d'usuari:Utilitzar tipus de lletra privats no està suportat a aquest sistema: la biblioteca Pango és massa antiga, es requereix 1.38 o posterior.Conflicte de validacióValorEl valor ha de ser més gran o igual que %s.El valor ha de ser més petit o igual que %s.El valor ha de ser entre %s i %s.Versió Alineació vertical.Mostra els fitxers en visualització detalladaMostra els fitxers en visualització de llistaVisualitzacionsADVERTÈNCIA: l'ús del mètode d'entrada XIM no és compatible i pot provocar problemes amb la gestió de l'entrada i parpelleig. Consideri desestablir GTK_IM_MODULE o establir-lo a "ibus".S'ha produït un error mentre s'esperava l'E/S del descriptor epoll %dAdvertència: PesEuropa occidental (ISO-8859-1)Europa occidental amb euro (ISO-8859-15)Si el tipus de lletra està subratllada.BlancParaula senceraNomés paraules senceresTema Win32WindowWindowFrameWindowTextÀrab del Windows (CP 1256)Bàltic del Windows (CP 1257)Europa central del Windows (CP 1250)Xinès simplificat del Windows (CP 936) o GB-2312Xinès tradicional del Windows (CP 950) o Big-5Ciríl·lic del Windows (CP 1251)Grec del Windows (CP 1253)Hebreu del Windows (CP 1255)Japonès del Windows (CP 932) o Shift-JISJohab del Windows (CP 1361)Coreà del Windows (CP 949)Tailandès del Windows (CP 874)Turc del Windows (CP 1254)Vietnamita del Windows (CP 1258)Europa occidental del Windows (CP 1252)OEM del Windows/DOS (CP 437)Ciríl·lic OEM del Windows/DOS (CP 866)S'ha produït un error en escriure al fitxer '%s'S'ha produït un error d'anàlisi XML: '%s' a la línia %dXPM: Dades de píxel incorrectes!XPM: descripció del color incorrecta a la línia %dXPM: format de la capçalera incorrecte!XPM: definició del color incorrecta '%s' a la línia %d!XPM: no resten colors per a utilitzar per a la màscara!XPM: dades de la imatge truncades a la línia %d!GrocSíNo podeu afegir un directori nou a aquesta secció.Heu introduït un valor invàlid. Premeu Esc per a cancel·lar l'edició.AmpliaAmpl&iaAll&unyaAmpliaAllunyaAmplia &fins a ajustarAmplia fins a ajustaruna aplicació DDEML ha creat una situació de competició prolongada.s'ha cridat una funció DDEML sense cridar abans la funció DdeInitialize, o s'ha passat un identificador d'instància invàlid a una funció DDEML.un client no ha pogut establir una conversa.no s'ha pogut fer una assignació de memòria.el DDEML no ha pogut validar un paràmetre.s'ha excedit el temps límit d'una sol·licitud per a una transacció d'avís síncrona.s'ha excedit el temps límit d'una sol·licitud per a una transacció de dades síncrona.s'ha excedit el temps límit d'una sol·licitud per a una transacció d'execució síncrona.s'ha excedit el temps límit d'una sol·licitud per a una transacció poke síncrona.s'ha excedit el temps límit d'una sol·licitud per a finalitzar una transacció d'avís.s'ha provat d'executar una transacció de servidor en una conversa que ha estat finalitzada pel client, o el servidor ha finalitzat abans de completar una transacció.no s'ha pogut executar una transacció.una aplicació inicialitzada com a APPCLASS_MONITOR ha provat d'executar una transacció DDE, o bé una aplicació inicialitzada com a APPCMD_CLIENTONLY ha provat d'executar transaccions de servidor.ha fallat una crida interna a la funció PostMessage. s'ha produït un error intern al DDEML.s'ha passat un identificador de transacció invàlid a una funció DDEML. Un cop que l'aplicació ha retornat d'una crida XTYP_XACT_COMPLETE, l'identificador de transacció d'aquesta crida ja no és vàlid.s'assumeix que això és un zip multipart concatenats'ha ignorat l'intent de canviar la clau immutable '%s'.arguments erronis per a una funció de la bibliotecasignatura erròniadesplaçament a l'entrada del fitxer zip erronibinarinegretacompilació %luno es pot tancar el fitxer '%s'no es pot tancar el descriptor de fitxer %dno es poden publicar els canvis al fitxer '%s'no es pot crear el fitxer '%s'no es pot suprimir el fitxer de configuració de l'usuari '%s'no es pot determinar si s'ha arribat al final del fitxer al descriptor %dno es pot trobar el directori central al zipno es pot trobar la llargada del fitxer al descriptor del fitxer %dno es pot trobar el directori de l'usuari, s'utilitzarà el directori actual.no es pot buidar el descriptor del fitxer %dno es pot cercar la posició al descriptor de fitxer %dno es pot carregar cap tipus de lletra, s'avortano es pot obrir el fitxer '%s'no es pot obrir el fitxer de configuració global '%s'.no es pot obrir el fitxer de configuració de l'usuari '%s'.no es pot obrir el fitxer de configuració de l'usuari.no es pot reinicialitzar el flux de deflació de zlibno es pot reinicialitzar el flux d'inflació de zlibno es pot llegir del descriptor de fitxer %dno es pot suprimir el fitxer '%s'no es pot suprimir el fitxer temporal '%s'no es pot cercar el descriptor de fitxer %dno es pot escriure la memòria intermèdia '%s' al disc.no es pot escriure al descriptor de fitxer %dno es pot escriure al fitxer de configuració de l'usuari.marcats'ha produït un error de suma de verificacióha fallat la suma de verificació en llegir el bloc de la capçalera de tarcms'ha produït un error de compressiódatas'ha produït un error de descompressióper defectedoblebolcat de l'estat del procés (binari)divuitèvuitèonzèl'entrada '%s' apareix més d'un cop al grup '%s'error al format de dadess'ha produït un error en obrir el fitxers'ha produït un error en llegir el directori central del zips'ha produït un error en llegir la capçalera local del ziperror a l'hora d'escriure l'entrada zip '%s': crc o longitud erroniserror a l'hora d'escriure l'entrada zip '%s': fitxer massa gran sense ZIP64extranegretaextrapesadaextralleugerano s'ha pogut evaluarno s'ha pogut buidar el fitxer '%s'falsquinzècinquèfitxer '%s', línia %zu: s'ha ignorat '%s' després de la capçalera de grup.fitxer '%s', línia %zu: '=' inesperat.fitxer '%s', línia %zu: s'ha trobat la clau '%s' per primer cop a la línia %d.fitxer '%s', línia %zu: s'ha ignorat el valor per a clau immutable '%s'.fiitxer '%s': caràcter inesperat %c a la línia %zu.fitxersprimermida del tipus de lletracatorzèquartgenera missatges de registre detallatspesadaimatgebloc de capçalera incomplet al tarcadena de manegador d'esdeveniment incorrecte, hi manca un punts'ha proporcionat una mida incorrecta per a una entrada del tarl'entrada està comprimida amb una opció XZ desconegudal'entrada està corrompudal'entrada no està en format XZdades invàlides a la capçalera estesa del tarvalor de retorn de la capsa de missatges invàlidfitxer zip invàlidcursivaSumaAlt+EndarrereRetrocésCancel·laMajúsculesNetejaOrdreCtrl+DecimalSuprSuprimeixDivisióAvallFiRetornEscEscapadaExecutaFAjudaIniciInserInsereixKP_Suma (teclat numèric)Inici (teclat numèric)Decimal (teclat numèric)Suprimeix (teclat numèric)Divisió (teclat numèric)Avall (teclat numèric)Fi (teclat numèric)Retorn (teclat numèric)Igual (teclat numèric)KP_FInici (teclat numèric)Insereix (teclat numèric)Esquerra (teclat numèric)Multiplicació (teclat numèric)Següent (teclat numèric)Av Pàg (teclat numèric)Re Pàg (teclat numèric)Anterior (teclat numèric)Dreta (teclat numèric)Separador (teclat numèric)Espai (teclat numèric)Resta (teclat numèric)Tab (teclat numèric)Amunt (teclat numèric)EsquerraMenúMultiplicació* (teclat numèric)+ (teclat numèric), (teclat numèric)- (teclat numèric). (teclat numèric)/ (teclat numèric)= (teclat numèric)Inici (teclat numèric)Suprimeix (teclat numèric)Avall (teclat numèric)Fi (teclat numèric)Retorn (teclat numèric)Inici (teclat numèric)Insereix (teclat numèric)Bloq NúmAv Pàg (teclat numèric)Re Pàg (teclat numèric)Dreta (teclat numèric)Espai (teclat numèric)Tab (teclat numèric)Amunt (teclat numèric)Esquerra (teclat numèric)Bloq NúmAv PàgRe PàgAv PàgRe PàgPausaAvPàgRePàgImprimeixRawCtrl+RetornDretaESPECIALBloq DesplBloq DesplSeleccionaSeparadorMaj+Impr PantEspaiRestaTabAmuntWindows (esquerra)Windows (menú)Windows (dreta)altctrlnúm rawctrlmajno s'ha pogut inicialitzar libcurllleugeraQuant a %sQuant a...Amaga %sAmaga l'aplicacióAmaga els altresPreferències...Surt de %sSurt de l'aplicacióServeisMostra-ho totmitjanamitjanitdinovènovèno hi ha cap error DDE.no hi ha cap errorno s'ha trobat cap tipus de lletra a %s, es farà servir el tipus de lletra integratsense nommigdianormalnúmels objectes no poden tenir nodes XML de texts'ha esgotat la memòriadescripció del context del procésptpxs'ha produït un error de lecturaen llegir el flux zip (entrada %s): crc erronien llegir el flux zip (entrada %s): longitud erròniaproblema de reentrada.segons'ha produït un error de cercaseminegretadissetèsetèmostra aquest missatge d'ajudasetzèsisèespecifiqueu el mode de pantalla a utilitzar (p. ex. 640x480-16)especifiqueu el tema a utilitzar&Ajudaestàndard/cercleestàndard/circumferènciaestàndard/diamantestàndard/quadratestàndard/trianglela mida del fitxer emmagatzemat no és a la capçalera del ZipstrratllatFletxaBuitDianaCaràcterCreuPredeterminatMàPerfil en IBotó esquerreLupaBotó del migSense entradaPinzellLlapisApunta a l'esquerraApunta a la dretaFletxa amb interrogacióFletxa dretaBotó dretRedimensionamentRedimensionament N-SRedimensionament NE-SORedimensionament NO-SERedimensionament O-EEspraiEsperaFletxa d'esperaRellotgeentrada tar no obertadesèla resposta a la transacció ha provocat que es defineixi el bit DDE_FBUSY.primatercertretzèavuidemàs'ha ignorat la barra inversa al final a '%s'Eduard Ereza Martínez Andriy Byelikov https://github.com/andriybyelikovcertdotzèvintèno marcatsubratllatindeterminat" inesperat a la posició %d de '%s'.final del fitxer inesperatdesconegutdesconegut (%lu)classe %s desconegudaerror de compressió desconeguterror de descompressió desconeguts'ha produït un error desconeguts'ha produït un error desconegut (codi d'error %08x).desconegut-%dsense nomsense nom %dmètode de compressió Zip no suportats'utilitzarà el catàleg '%s' de '%s'.s'ha produït un error d'escripturawxGLCanvas actualment només està suportat a Wayland i X11. Una possible solució alternativa és establir la variable d'entorn GDK_BACKEND=x11 abans d'iniciar el seu programa.wxGetTimeOfDay ha fallat.wxWidgets no ha pogut obrir la pantalla de '%s': se sortirà.wxWidgets no ha pogut obrir la pantalla. Se sortirà.xxxxahirs'ha produït un error de zlib %d~tqsl-2.8.1/apps/lang/de/0000755000175000017500000000000015003421124014747 5ustar rmurphyrmurphytqsl-2.8.1/apps/lang/de/tqslapp.mo0000644000175000017500000023725715003421124017010 0ustar rmurphyrmurphy ,:::,::&;6;O;)l;0;;+;7<DF<<<<<<=.0=)_=V=G=(>=>X>_>;u> >>>$>? ?"?>?D?$J?o? ??<?#?%@'.@V@)h@D@$@@&A&+A7RA A A5AAA: BTGBBBB BBC C C'C/C7CC{C'C!C$CC& D3D%D0D6 EBDE EEEEE FF$FAFGFPFiaFF FF FFG"G1G KGUG oG zG GG'GGGVG?UH/H(HH+I#0I)TI~I I!I I=IJ%J9JPJ'dJJJ&JJKS*K ~KK4KK(K$L@L.M;3MAoM3M+M=NBONYNINF6OT}OOO#O'P59P oP}PP P P PPPPPPQ-3QaQ|QiQ Q Q R,RBRVReR@jR}R)S;SBSKSdS~SS(S#S(ST+;TgT<T!T'T/U(8U/aUU;UUUV!V1&VXVnV VVVVV,VW(W^%D^j^|^^^H^Q_IV_ _ _0_5_!`&&`M`U`Bd`U``a "a-aAarambccd|7ee eee(f@f^fnRh1i,iS j'tjjjj1j:k-Ak-ok-kkkk' l"2l$Ul!zll8mRAmPmNm4nKnan}nnnn nn+n'o*oDo _omosoooo o ooo ooooop@#pdpspp pppppq q;qcZqqIrPrmrprrrrs)s HsRs msxssBs8s t,t3tHthtyttt t t2tu5(uG^u_u=vcDvv"vRvT6w w wwww$wx4x&Jxqx xx xx x xxx#xyy!y3:yny6yyFyLz-fzdzxz7r|k|} }@}I}]}l}"}}}$}"}~)~$;~`~~~~~~&~I Wl>s   !'= eq#ƀ #(Cl$|*́-&F`y*.)܂&8Hfw+:(4!N#p…ޅ/K+g ÆΆֆ  (32I |(wЇ'HLpJ 0&G&n,+‰9\*+]_K\^6g%čD3',[}1(/0X.\u515)a#ɕ[awC5.y+4ԗ! +I avlu$Ew3b9DЛ8N^S=V[^1d6;͞+ 5L]]N% ,0]BzRܠC/s֡ݡ&,)KuTǣ ܣ&8Ǥ56<QƦs.EϨHhe&6_]<"0/N ~]A!?$aԮ+ :5Qp¯1 \<YDZ:! \gn ; в ڲ   +8MG_9 5O j#7 +F4^{ڶ!!1Sr8-˷ugo׸ :7rz# ƹѹ, %'M _mC.к1;1m;vG*%,.2[A м ۼ; "C?WY - CdtB-$.-S!#ǿ0a9:em~ &; AOy_  1J bm #7%Y;B;/D9[5@ $"GBf, ":&]d? \9}(:(D[B_TMGE\jaUe]j{ /,5:b! (+07@ ]=~) ` Q [ g4rG  #B%b"3E*B3m3(10DP 8*?] y#-#-4Q$;A/&q70D*;.@j8$> BH*;2$%$J/o;2)A8.z:6/:K@ 1;P ` kKy'$*BV[fb\% <.'/7>Ov N" [&f%!4 L+x0<+mo1 ;Si6=*+%*Q|'$%#:^ZkQV3Iet0%/ IW] q} L%r *$&KRPqm0#  ")2# * CMVMe=)""6Yi 5"NQfeTs++ ^L[  !!!Ce"z"> '5 =G V a ku*?-BKQK4=xry;er'ENa%y+)%; O9p-,#)I4iS W q{&,0"Sf ~-$! /'H:p#0$$>>c160>:o#":'Q!y H < 0@ 7q 9    4 : #B f o   2  #   #, P b z   ,  -  6 6 M aG0''99/s3M-.jjIkk F'0`BT?86.5qdDj:H3b"y/T4 4AFv!"  "= j` g k3!)!!Kj""AN#@#P#9"$\$\a$$#&&&&=&F'=`'2'''p'mk(.(6)!?)Ka))n)t<*** *&*(+>+M+ j+t+,+$+2+,**,U,Cl,,--- ---(U.~.5.7." /B./tq//015X2213N-4k|44$5f5@P6$6:6?617a7?`8.818!9#9 C9d9%989G9W'::N;<;s0<<$<l<MJ==== =E=> >$>*>1>O>_>c>s>>>: j`8tcI%c-r~\,AVjCH9Y-'9Bm<{")?3 ^W&' +D\._s>+W58&VwgJK}@kN;(OZs0yn R9MYHX)$RrG;NU]l\|Pm$ohwIBVFq*Sz=!U^<xGFj/Fyf b2a< =d7G ota_~~2x| p %4IBn8+rYlQPS*g7'L| DeLvc K2N/7 okv@ p nK3:aMh!z#dJ{A{m}e1QzkOs[XP"puu>,g]wbMWulLC}56#E;"fqv],?Ri6Z1-_)6%OTxU$=E@`fd[`hiq^ J4b#A5:>(!Q0E TiHX&S1CZ/ e[4 D?(T.3*.0ty to %d QSO Records%d of %d QSOs are previously signed; aborted%s Uploaded with result: %s%s is ready to be emailed or uploaded.%s uploaded successfully%s uploaded with result: %s%s: %d QSO records were previously signed%s: %d QSOs were outside the selected date range%s: %s upload was rejected%s: %s upload was rejected with result "%s"%s: Couldn't upload the file: CURL returned "%hs" (%hs)%s: Got an unexpected response on %s upload! Maybe the site is down?%s: Invalid Grid Field%s: Invalid Grid Square%s: Invalid Grid Sub-subsquare%s: Invalid Grid Subsquare%s: Invalid Gridsquare Format%s: Log uploaded successfully%s: Log uploaded successfully with result: %s%s: Unable to connect to the upload site.%s: Unable to upload - either your Internet connection is down or LoTW is unreachable.%s: Unable to upload. The network is down or the LoTW site is too busy.%s: Upload cancelled%s: wrote %d records to %s&About&Add Station Location&Backup Station Locations, Certificates, and Preferences...&Contents&Delete&Delete Callsign Certificate&Display Station Location Properties&Edit&Edit Station Location&Edit existing ADIF file...&File&Help&Load Callsign Certificate from File&Preferences...&Properties&Renew Callsign Certificate&Restore Station Locations, Certificates, and Preferences...&Restore a Deleted Station Location&Save Callsign Certificate to File...&Sign and save ADIF or Cabrillo file...&Station Location&Test Signing an ADIF or Cabrillo file...'Satellite' propagation mode selected, so a Satellite must be chosen'Save Callsign Certificate' command.A new TQSL release (V%s) is available!A new TQSL release (V%s) is available.A new TrustedQSL configuration file (V%s) is available.ADIF Mode:ADIF ModesADIF content is not valid. '%hs' is not valid for %hsADIF field has invalid contentsADIF file extensions:ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*.*)|*.*Aborting due to user cancellingAboutActive, usable certificatesAdd ADIF modeAdd ADIF mode mapping:Add QSOAdd Station LocationAdd...AddressAdministrator ErrorAfter reading this message, you may close this program.AlertAll QSOs are previously signed; abortedAllow TQSL to continue this time.Allow automatic configuration backupAllow nonamateur call signsAlways allow running as Administrator.An updated TrustedQSL configuration file (V%s) is available! The configuration file installs definitions for entities, modes, etc.Another copy of TQSL is signing a logAre you sure you want to delete the certificate?Are you sure you want to delete this station location?Are you sure you want to proceed? Click 'No' to review the choicesAre you sure?Attempting to upload %d QSOsAttempting to upload %sAttempting to upload one QSOAwaiting response from ARRLBackup ErrorBackup File Folder:Backup operation failed: %hsBand:Begins: Buffer too smallCAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause issues with handling awards.CONTESTCONTEST Name:CQ ZoneCQ Zone: Cabrillo CONTESTCabrillo CONTEST definitions:Cabrillo SpecsCabrillo file extensions:Call SignCall Sign cannot be emptyCall Sign:Call sign:Call sign: Call-Worked Field Number:Call-worked field must be %d or greaterCallsign &CertificateCallsign CertificateCallsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6Callsign Certificate does not match QSO detailsCallsign Certificate not TQSL compatibleCallsign CertificatesCallsign certificate could not be installedCan't open TQSL update file %s: %hsCan't open new configuration file %s: %hsCancelCancelledCertificate Authority certificateCertificate Container PassphraseCertificate Container files (*.p12)|*.p12|All files (*.*)|*.*Certificate ExpiringCertificate Issuer:Certificate PropertiesCertificate RequestCertificate not initialized for signingCertificate provider not foundCertificate saved in file %sCertificates replaced with a newer oneCertificates that have expiredChanges have not been savedChanges to the status message configuration will take affect when TQSL is restartedCheck ErrorCheck for &Updates...Check for updates to tqsl and the configuration fileChecking for TQSL updates...Choose a Callsign Certificate to restoreChoose a Station Location to restoreChoosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'CityClick 'Cancel' if this is not the correct Station Location.Click 'Cancel' to abandon processing this log file (Recommended).Click 'Cancel' to abandon processing this log file.Click 'Cancel' to abandon signing this log.Click 'Finish' to complete this Callsign Certificate request.Click 'Ignore' to continue signing this log while ignoring errors.Click 'New QSOs Only' to sign normally, without the previously signed QSOs (Recommended).Click 'OK' to install the new configuration file, or Cancel to ignore it.Click 'OK' to install the new version of TQSL, or Cancel to ignore it.Click 'Re-Upload QSOs' to re-process this log while allowing previously signed QSOs.CloseCommand Syntax ErrorConfiguration file cannot be openedConfiguration file successfully updatedConfiguration files (*.tbk)|*.tbk|All files (*.*)|*.*Confirm CloseContestContest name cannot be blankContest typeContinentConverting Could not spawn upload thread!CountryCountyCounty: Create &New ADIF file...Create a new Station LocationCreate an ADIF file for signing and uploadingCustom ADIF mode mappings:DELETEDDO NOT lose the passphrase you choose! You will be unable to use the Certificate without this passphrase!DXCC EntityDXCC Entity: DXCC entity:Data for this DXCC entity could not be foundDatabase Error: %hsDatabase errorDateDate of the first QSO you made or will make using this callsign:Date of the last QSO you made or will make using this callsign: (Leave this date blank if this is still your valid callsign.)Date out of rangeDeleteDelete "Delete Station Location Delete a Station LocationDia&gnostic ModeDisplay &DocumentationDisplay Callsign Certificate &PropertiesDisplay Station Location PropertiesDisplay Station Location Properties for Display a Callsign CertificateDisplay a Callsign Certificate's PropertiesDisplay command line helpDisplay details of previously signed QSOs when signing a logDisplay or Modify &Preferences...Display status messages in separate tabDisplay the Callsign Certificate properties forDisplay the version information and exitDo you really want to keep this 'QSO end date'?Do you want to renew it now?Do you want to upload this certificate request to LoTW now?Download from:Duplicate QSO detectedE&xit TQSL Alt-XEditEdit (if used with -l) or create Station LocationEdit Station LocationEdit Station Location Edit Station Location : %hs - %sEdit a Station LocationEdit...Email: Enable a Network ProxyEnable passphrases for Callsign CertificatesEnd Date (YYYY-MM-DD)End date is invalidEnd date of %s is invalidEnter a name for this Station LocationEnter a passphrase for this callsign certificate.Enter again to confirm:Enter file to save toEnter new passphraseEnter passphraseEnter the Passphrase to unlock the callsign certificateEnter the name for the new Certificate Container fileEnter the passphrase again for verification:Enter the passphrase for the certificate container file.Enter the passphrase to unlock the .p12 file:Enter the passphrase to unlock the callsign certificate for %hs -- %hs (This is the passphrase you made up when you installed the callsign certificate.)ErrorError checking for expired callsign certificates:Error compressing before uploadError creating Callsign Certificate RequestError creating callsign certificate request: %hsError downloading new configuration file:Error downloading new file:Error downloading new version information:Error downloading update version information:Error importing station locations: %hsError opening certificate request file %s: %hsError opening diagnostic log %s: %hsError opening input fileError opening output fileError opening save file %s: %hsError parsing certificate for DXCC entityError parsing certificate for call signError parsing certificate for issuerError parsing saved configuration file: %hsError parsing station location file: %hsError performing automatic backup: %hsError renaming backup file %s: %hsError while accessing certificate storeError writing new configuration file %s: %hsError: Could not upload file (CURL Init error)Errors DetectedErrors: %dExit TQSL so I can re-run as a normal userExit after processing log (otherwise start normally)Expected nameExpiredExpires: Export P12 files compatible with Apple KeychainExport to %s failed: %hsFieldFile name for diagnostic tracking logFile syntax errorFile syntax error: %hsFinal Status: %hs (%d)Frequency (MHz):Grid %s is not correct for your %s. Click 'Next' again to use it anyway.Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it anyway.Grid %s is not correct for your QTH. Click 'Next' again to use it anyway.Grid SquareGrid Square: Gridsquare is inconsistent with Station LocationHandle QTH information in ADIF logs with what action?HelpI am the QSL manager for this callsignIOTA IDIOTA Locator: IOTA reference %s is not correct. Must have a number after the '-'IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, OC- or SA-IOTA value %s is not valid.ITU ZoneITU Zone: If so, choose a callsign below for the primary LoTW account. If not, click 'Finish', and a new LoTW account will be set up for these QSOs.If you are planning to restore from a backup, please choose 'No'.If you are sure that the earlier request is now invalid you should delete the pending Callsign Certificate for %s.If you are using a US callsign outside of the US persuant to CEPT, IARP or other Reciprocity arrangements, FCC rules require you to be a US Citizen.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence no passphrase need be specified.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence, no passphrase need be specified.If you set an end date, you will not be able to sign QSOs past that date, even if the Callsign Certificate itself is still valid.If you still hold this callsign (or if you plan to renew the license for the callsign), you should not set a 'QSO end date'.IgnoreIgnore QTH details from your logIgnore callsigns in ADIF filesIgnore seconds in QSO timesImport a certificate file (.p12 or .tq6)Import completed successfullyIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is recommended, but a logger that does its own upload tracking may incorrectly set the status in this case. A logger that doesn't track uploads should be unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, will correctly mark all selected QSOs as sent - they are in your account even though they would not be in this specific batchIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'Incomplete Certificates - requires a matching TQ6Incorrect passphrase when importing P12 fileIncorrect settings can cause TQSL to be unable to upload logs or check for updates.Input ADIF or Cabrillo log file to signInstall CertificateInvalid %hs: "%hs"Invalid argumentInvalid contact - QSO does not specify a CallsignInvalid contact - QSO does not specify a band or frequencyInvalid contact - QSO does not specify a dateInvalid contact - QSO does not specify a modeInvalid contact - QSO does not specify a timeInvalid date formatInvalid error code: %dInvalid time formatInvalid zone selections for DXCC entityInvalid zone selections for oblastInvalid zone selections for provinceInvalid zone selections for stateIs this new certificate for a callsign where you already have a LoTW account, and you want the QSOs for this call to be added to an existing LoTW account? LanguageLeave the passphrase blank and click 'Finish' unless you want to use a passphrase.Leave the passphrase blank and click 'Next' unless you want to use a passphrase.Leave the passphrase blank and click 'OK' unless you want to use a passphrase.LoTW Connection FailedLoad Certificate FileLoad a Callsign CertificateLoading completeLocation data errorLog FileLog File ErrorLog HandlingLog OperationsLog files (*.log)|*.log|All files (*.*)|*.*Log in to the Logbook of the World SiteMemory allocation failureMissing from this computerMode ConflictMode:More details at:NO ERRORNONENameName existsNetwork ProxyNew DBNew PassphraseNew QSOs OnlyNew passphraseNew passphrase:New...No Callsign CertificatesNo CertificateNo Certificate Request matches the selected Callsign CertificateNo Private KeyNo QSO recordsNo QSOs to uploadNo UpdatesNo callsign certificate for keyNo logfile to sign!No records outputNo status information availableNoneNone of these applyNote: TQSL assumes that this file will be uploaded to LoTW.Note: TQSL has not recorded signing these QSOs. You can submit this log file to LoTW or discard it.Note: The e-mail address you provide here is the address to which the issued Certificate will be sent. Make sure it's the correct address!NoticeNumber of Backups to retain:OKOK to install OblastOblast: Once you supply the requested information and the request file has been created, you must send the request file to the certificate issuer.One QSO RecordOpen ADIF files in ADIF editorOpen FileOperator aborted operationOperator: OptionsOrganization: Output file name (defaults to input name minus extension plus .tq8Override Station Location with QTH details from your logPKCS#12 file not TQSL compatiblePark: Passphrase confirmedPassphrase entries do not matchPassphrase errorPassphrase for the signing keyPassphrase not correctPassphrase protectedPassphrase:Passphrase: Please choose a callsign for this Station LocationPlease choose language:Please install a callsign certificate then try again.Please review the introductory documentation before using this program.Please select a Callsign Certificate for the account where you would like the QSOs to be storedPlease select a Callsign Certificate to validate this requestPlease select the Callsign Certificate for your current personal callsign to validate your request.Please try again later.Please try uploading the %s later.Please verify that this is the correct Station Location for the QSOs being signed.Please wait until you receive an e-mail bearing your requested Callsign Certificate.Port Number:PreferencesPreviously Signed QSO detectedPreviously Signed QSOs DetectedPreviously Signed: %dPreviously signed QSOs were detectedPreviously signed: %dPrivate Key not foundPrompt for QSO Date range when signingPropagation Mode:PropertiesProvinceProvince: Proxy Address:Proxy Type:ProxyTypeQSO DataQSO Data ErrorQSO Data: Invalid Mode ignored - %sQSO Date RangeQSO End Date: QSO Frequency is invalidQSO Frequency is out of range for the selected bandQSO RX Frequency is invalidQSO RX Frequency is out of range for the selected bandQSO Start Date: QSO begin date: You must choose proper values for Year, Month and Day.QSO date is not within the date range specified on your Callsign CertificateQSO end date cannot be before QSO begin date.QSO end date: You must either choose proper values for Year, Month and Day or leave all three blank.QSO records signed using the Certificate will not be valid for DXCC award credit (but will be valid for other applicable awards). If the Certificate is to be used for signing QSOs from maritime/marine mobile, shipboard, or air mobile operations, that is the correct selection. Otherwise, you probably should use the "Back" button to return to the DXCC page after clicking "OK"QSOs for %hs will be stored in the LoTW account for %s.QSOs prior to the starting date or after the ending date will not be signed or included in the output file.QSOs: %dQuiet Mode - same behavior as -xRX Band:RX Frequency (MHz):Re-Upload QSOsRenew a Callsign CertificateRenew the Callsign Certificate forReplacedReport on QTH differencesRequest &New Callsign Certificate...Request a new Callsign CertificateRequest cancelledRestore Complete.Restore Deleted Callsign CertificateRestore operation failed: %hsRestoring Callsign CertificatesRestoring PreferencesRestoring QSO recordsRestoring Station LocationsRestoring callsign certificate for %hsResubmitting these QSOs will cause them to be reported as already signed.Resulting TQSL mode:Retry?Satellite choice requires that Propagation Mode be 'Satellite'Satellite:Save FileSave Station DataSave a Callsign CertificateSave operation complete.Save requestSave the Callsign Certificate forSaved configuration files (*.tbk)|*.tbkSaving QSOsSaving Station LocationsSaving TQSL PreferencesSaving callsign certificate for %hsSaving callsign certificatesSelect CallsignSelect Certificate FileSelect Station DataSelect Station Location for SigningSelect a Callsign Certificate to processSelect a FolderSelect a Station Location to processSelect a Station Location to process Select file to SignSelect file to write toSelect or enter name of this station locationSelect saved configuration fileSelected Station LocationSelects Station LocationSerial: Sign a log and save it for uploading laterSign a log and upload it automatically to LoTWSign and &upload ADIF or Cabrillo File...Signing File: Signing QSO DataSigning abandonedSigning abortedSigning aborted due to errorsSigning aborted.Signing cancelledSigning using Callsign %hs, DXCC Entity %hsSince you have no Callsign Certificates, you must submit an 'Unsigned' certificate request. This will allow you to create your initial Callsign Certificate for LoTW use. Click 'Finish' to complete this Callsign Certificate request.Some QSOs not processedSpecify QSO verification action - ignore, report or updateSpecify default callsign for log signingSpecify dialog action - abort, all, compliant or askSpecify end date for QSOs to signSpecify start date for QSOs to signStart Date (YYYY-MM-DD)Start date is invalidStart date of %s is invalidStateState: Station Data input completeStation LocationStation Location NameStation Location PropertiesStation Location data errorStation Location does not match QSO detailsStation LocationsStation name must be providedStatus LogSuccessSuppress date range dialogSystem error: %hsSystem error: %hs : %hsTQSL ConfirmTQSL ErrorTQSL Update AvailableTQSL Version %hs and Configuration Data Version %sTQSL WarningTQSL compressed data files (*.tq8)|*.tq8TQSL data files (*.tq7)|*.tq7TQSL is unable to sign QSOs because another instance of TQSL is busy. Terminate any other copies of TQSL and try again.TQSL must not be run 'As Administrator'TQSL must wait for other running copies of TQSL to exit before backing up...TQSL must wait for other running copies of TQSL to exit before signing ...TQSLLib ErrorThe %s '%hs' has value '%hs' while QSO has '%hs'The -a parameter %hs is not recognizedThe -f parameter %hs is not recognizedThe TQSL configuration file cannot be parsedThe TQSL upload tracking database is lockedThe callsign %s is not currently registered in the FCC ULS database. If this is a newly registered call, you must wait at least one business day for it to be valid. Please enter a currently valid callsign.The callsign certificate for callsign %hs has expired. This station location cannot be used to sign a log file until a valid callsign certificate is installed.The callsign is too long. Only %d characters are allowed.The certificate for %hs expires in %d daysThe certificate for %hs expires in %d days.The date of your first QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your first QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe file has not been saved. Should the QSOs be saved?The format of this file is incorrect.The invalid data was ignored.The log being signed has '%hs' set to value '%hs' which is not validThe log file you are uploading using your QSO Logging system consists entirely of previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The log file you are uploading using your QSO Logging system includes some previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The only reason to re-sign previously signed QSOs is if a previous upload was not processed by LoTW, either because it was never uploaded, or there was a server failureThe private key for callsign %hs serial %ld is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe private key for this Callsign Certificate is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe selected callsign could not be foundThe selected station location could not be foundThe two copies of the passphrase do not match.There are no callsign certificates for callsign %hs. This station location cannot be edited.There are no current callsign certificates for callsign %hs. This station location cannot be used to sign a log file.There are no deleted Callsign Certificates to restoreThere are no deleted Station Locations to restoreThere are no valid callsign certificates for callsignThere is a newer callsign certificate for callsign %hs. This station location cannot be used to sign a log file until the new certificate is installed.There is no valid callsign certificate for %hs in entity %hs available. This QSO cannot be signedThis Callsign Certificate cannot be installed as it has expired. Check if your computer is set to the proper date and that this is the latest Callsign Certificate. This Callsign Certificate cannot be installed as the first date where it is valid is in the future. Check if your computer is set to the proper date. This Callsign Certificate request requires approval using an existing Callsign Certificate.This address must match the FCC ULS database. If this address information is incorrect, please correct your FCC record.This callsign certificate is already active and cannot be restored.This callsign certificate is already installedThis callsign replaces my existing callsignThis file can not be processed due to a system errorThis file is not a valid P12 fileThis is a DXpedition callsignThis is a club callsignThis is a special event callsignThis is my former callsignThis log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and %d QSOs which are new.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and no new QSOs.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and one QSO which is new.This log has invalid QSO informationThis log has too many previously uploaded QSOs. Please only upload new QSOs or break the log into smaller pieces (50,000 QSOs or less).This mode definition conflicts with a standard mode definition for %sThis passphrase will have to be entered each time you use this callsign certificate for signing or when saving the key.This should be corrected before signing a log file.This will create a new Callsign Certificate request file.This will remove the selected callsign certificate from your system.This will remove this station location from your system.TimeTo import this passphrase protected P12 file, you must pass the passphrase on the command lineTo submit the signed log file to LoTW: 1. Move the signed log file to a computer with internet access 2. Log in to your LoTW Web Account 3. Select the Upload File tab 4. Click the Choose File button, and select the signed log file you created (%s) 5. Click the Upload file button Alternatively, you can attach the signed log file to an email message, and send the message to lotw-logs@arrl.orgTrusted root certificateTypeUPURL: US 1x1 callsign requests must provide an end dateUS 1x1 callsigns must end in letters A-Z excluding 'X'US 1x1 callsigns must have a number as the second characterUS 1x1 callsigns must start with W, K, or NUTC Date (YYYY-MM-DD):UTC Time (HHMM):Unable to check for updates - either your Internet connection is down or LoTW is unreachable.Unable to check for updates. The network is down or the LoTW site is too busy.Unable to connect to the update site.Unable to initialize random number generatorUnable to open %s for outputUnable to open ca-bundle.crt. Your TQSL installation is incompleteUnable to read - no permissionUnable to update - either your Internet connection is down or LoTW is unreachable.Unable to update. The network is down or the LoTW site is too busy.Undelete ErrorUnexpected LoTW ResponseUnknownUnknown custom errorUnusable: Missing Private KeyUpdateUpdate CompletedUploadUpload RejectedUpload after signing instead of savingUploading Callsign CertificateUploading Callsign Certificate Request...Uploading Signed DataUploading signed log data...Uploads database errorUse the "New" Button of the dialog you're about to see to define a Station Location.Use these settings to configure a network proxy for Internet uploads and downloads. You should only enable a proxy if directed by your network administrator.User CancelledValueVerify QTH details: WPX PrefixWarningWarning: The TQSL ADIF editor only processes a limited number of ADIF fields. Using the editor on an ADIF file can cause QSO details to be lost!What is this Callsign Certificate for?Wipe the TQSL uploads databaseWould you like to back up your callsign certificate now?Would you like to request a callsign certificate now?Wrote %d QSO records to %sYou WILL be able to recover it from a container (.p12) file,You cannot request a Callsign Certificate for a former callsign unless you hold a valid Callsign Certificate to be used to verify that request.You cannot request a certificate for a 1x1 callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot request a certificate for a portable callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot select DXCC Entity NONE as you must sign any request for entity NONE and you have no valid Callsign Certificates that you can use to sign this request.You do not need an account on LoTW to do this.You have already requested a Callsign Certificate for %s and can not request another until that request has been processed by LoTW Staff.You have already requested more than three Callsign Certificates for %s in the past 24 hours. You should submit a request only once, then wait for that request to be processed by LoTW Staff. This may take several business days.You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: You have changed the following fields in this Station Location: %s Do you want to discard those changes?You have chosen a QSO end date for this Callsign Certificate. The 'QSO end date' should ONLY be set if that date is the date when that callsign's license expired or the license was replaced by a new callsign.You have no Station Locations defined.You have no callsign certificate installed on this computer with which to sign log submissions.You have no callsign certificates to use to sign a log file.You have selected DXCC Entity NONEYou may leave either date (or both dates) blank.You may now send your new certificate request (You may protect this Callsign Certificate using a passphrase. If you are using a computer system that is shared with others, you should specify a passphrase to protect this Callsign Certificate. However, if you are using a computer in a private residence, no passphrase need be specified.You may set the starting and/or ending QSO dates in order to select QSOs from the input file.You must define at least one Station Location to use for signing.You must enter a valid call sign.You must enter a valid email addressYou must enter your addressYou must enter your cityYou must enter your nameYou must select a %hsYou must select a DXCC entity.You must select a band or enter a frequencyYou will NOT be able to recover it by loading a .TQ6 file.You will have to enter the passphrase any time you load the file into TrustedQSL.You will not be able to use this tq6 file to recover your callsign certificate if it gets lost. For security purposes, you should back up your certificate on removable media for safe-keeping.Your QTH Details changed for this QSO. Originally these were: %s Now they are:%s Please verify that you intended to change this QSO! Your certificate request did not upload properly.Your custom mode map %s conflicts with the standard mode definition for %hs and was deleted.Your e-mail addressYour system is up to dateYour upload appears to have failed. Do you want to save this request for uploading later?Your upload appears to have failed. Should TQSL try again?Zip/Postal[None]are the newest availablecertificate?if you have created one via the Callsign Certificate menu'sin entityon line %dor see:tQSL Cert Request files (*.to TQSL formatto:|ADIF files (|All files (|All files (*.*)|*.*|Cabrillo files (Project-Id-Version: TQSL V2.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2025-02-16 18:01-0500 PO-Revision-Date: 2025-02-26 11:26+0100 Last-Translator: Andreas Rehberg Language-Team: TQSL Developers Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.1 bis %d QSO Einträge%d von %d QSOs wurden bereits zuvor signiert; abgebrochen%s Hochgeladen mit Ergebnis: %s%s ist bereit, zum Mailen oder hochgeladen zu werden.%s erfolgreich hochgeladen%s hochgeladen mit Ergebnis: %s%s: %d QSOs wurden bereits signiert%s: %d QSOs sind ausserhalb des ausgewählten Zeitraums%s: %s Hochladen wurde abgelehnt%s: %s Hochladen wurde abgelehnt wegen "%s"%s: Die Datei konnte nicht hochgeladen werden: CURL meldet "%hs" (%hs)%s: Erhielt eine unerwartete Antwort auf %s Upload! Vielleicht ist die Seite nicht erreichbar?%s: Ungültiges Lokator-Feld%s: Ungültiger Lokator%s: Ungültiges Lokator-Mikrofeld%s: Ungültiges Lokator-Kleinfeld%s: Ungültiges Lokator-Format%s: Log erfolgreich hochgeladen%s: Log mit diesem Ergebnis erfolgreich hochgeladen: %s%s: Kann nicht zur Upload-Webseite verbinden.%s: Hochladen leider nicht möglich - entweder ist die Internetverbindung ausgefallen oder LoTW ist nicht erreichbar.%s: kann nicht hochladen. Das Netzwerk ist nicht verfügbar oder die LoTW Webseite ist zu beschäftigt.%s: Hochladen abgebrochen%s: schrieb %d Datensätze in %s&Über&Hinzufügen eines Standortes&Sichern von Standorten, Zertifikaten und Einstellungen...&InhaltLöschenRufzeichen-Zertifikat löschen&Anzeige der Standort-EigenschaftenBearbeiten&Bearbeiten des Standortes&Bearbeiten einer vorhandenden ADIF-Datei...&Datei&HilfeRufzeichen-Zertifikat aus Datei laden&Einstellungen...EigenschaftenRufzeichen-Zertifikat erneuern&Wiederherstellen von Standorten, Zertifikaten und Einstellungen...&Wiederherstellen eines gelöschten StandortesRufzeichen-Zertifikat in eine Datei schreiben ...&Signieren und speichern einer ADIF- oder Cabrillo-Datei…Standort&Signieren und hochladen einer ADIF- oder Cabrillo-Datei…"Satelliten"-Mode angegeben, daher muss ein Satellit ausgewählt werdenBefehl "Rufzeichen-Zertifikate speichern".Eine neue TQSL-Version (V%s) ist verfügbar!Eine steht neue TQSL-Version (V%s) zur Verfügung.Es ist eine neue TrustedQSL-Konfigurationsdatei (V%s) verfügbar.ADIF-Mode:ADIF-ModesADIF-Inhalt ist ungültig. '%hs' ist nicht gültig für %hsInhalt des ADIF-Feldes ungültigADIF-Dateiendungen:ADIF-Dateien (*.adi;*.adif)|*.adi;*.adif|Alle Dateien (*.*)|*.*ADIF-Dateien (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|Alle Dateien (*.*)|*.*Vom Benutzer abgebrochenÜberAktive, nutzbare ZertifikateADIF-Mode hinzufügenADIF-Mode-Zuordnung hinzufügen:QSO hinzufügenStandort hinzufügenHinzufügen...AdresseAdministrator-FehlerNach dem Lesen dieser Meldung können Sie das Programm schließen.WarnungEs wurden bereits alle QSOs signiert, AbbruchTQSL jetzt die Fortsetzung erlauben.Automatische Konfigurationssicherung erlaubenNicht-Amateur-Rufzeichen erlaubenImmer als Administrator ausführen.Eine aktualisierte TrustedQSL-Konfigurationsdatei (V%s) ist verfügbar! Die Konfigurationsdatei installiert Definitionen für Länder, Betriebsarten usw.Eine andere TQSL-Instanz signiert gerade ein LogSind Sie sicher, dass Sie das Zertifikat löschen wollen?Sind Sie sicher, dass Sie diesen Standort löschen wollen?Sind Sie sicher, dass Sie fortfahren möchten? Klicken Sie auf 'Nein', um die Auswahl zu überprüfenSind Sie sicher?Versuche %d QSOs hochzuladenVersuche %s hochzuladenVersuche ein QSO hochzuladenWarten auf Antwort der ARRLBackup-FehlerOrdner der Backupdateien:Backup-Vorgang ist fehlgeschlagen: %hsBand:Gültig ab: Puffer zu kleinACHTUNG: das Vermischen nicht zusammen gehörender Rufzeichen in einem LoTW-Konto kann zu Problemen mit Diplomen führen.CONTESTCONTEST-Name:CQ-ZoneCQ Zone: Cabrillo-CONTESTCabrillo-CONTEST-Definitionen:Cabrillo-SpezifikationenCabrillo-Dateiendungen:RufzeichenRufzeichen darf nicht leer seinRufzeichen:Rufzeichen:Rufzeichen: Gearbeitetes Rufzeichen Feldnummer:Gearbeitetes Rufzeichen-Feld muss %d oder mehr betragenRufzeichen &ZertifikatRufzeichen-ZertifikatRufzeichen-Zertifikate-Containerdateien (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Rufzeichen-Zertifikate-Containerdateien (*.p12,*.tq6))|*.p12;*.tq6Rufzeichen-Zertifikat stimmt nicht mit QSO-Details übereinRufzeichen-Zertifikat nicht kompatibel mit TQSLRufzeichen-ZertifikateDas Rufzeichen-Zertifikat konnte nicht installiert werdenTQSL-Update-Datei kann nicht geöffnet werden %s: %hsDie neue Konfigurationsdatei %s: %hs kann nicht geöffnet werdenAbbrechenAbgebrochenZertifikat der ZertifizierungsstelleZertifikats-Container-PasswortZertifikats-Container-Dateien (*.p12)|*.p12|Alle Dateien (*.*)|*.*Auslaufendes ZertifikatAussteller des Zertifikats:ZertifikatseigenschaftenZertifikatsanforderungZertifikat zum Signieren nicht initialisiertZertifikatsanbieter nicht gefundenZertifikat in der Datei %s gespeichertDurch neue ersetzte ZertifikateAbgelaufene ZertifikateÄnderungen nicht gespeichertÄnderungen an der Konfiguration der Status-Nachrichten werden wirksam, wenn TQSL neu gestartet wirdFehler bei der ÜberprüfungAuf &Aktualisierungen prüfen...Nach Updates für tqsl und die Konfigurationsdatei suchenÜberprüfe auf TQSL-Aktualisierungen...Wählen Sie ein Rufzeichen-Zertifikat zum WiederherstellenStandort zum Wiederherstellen auswählenDie Auswahl 'Abbrechen' ist in der Regel sicher, aber ein Log-Programm, das die Statusmeldungen von TrustedQSL nicht überprüft könnte seltsam (aber harmlos) reagieren. In dem es z. B. versucht eine leere Datei hochzuladen oder alle ausgewählten QSOs als 'gesendet' markiert.OrtKlicken Sie 'abbrechen' wenn dies nicht der richtige Standort ist.Klicken Sie auf 'Abbrechen', um die Verarbeitung dieses Logs zu beenden (empfohlen).Klicken Sie auf 'Abbrechen', um die Verarbeitung dieser Log-Datei zu beenden.Klicken Sie auf 'Abbrechen', um die Signierung dieses Logs abzubrechen.Klicken Sie auf 'Fertig stellen', um diese Rufzeichen-Zertifikatsanforderung abzuschließen.Klicken Sie auf 'Ignorieren', um mit der Signierung dieses Logs fortzufahren und die Fehler zu ignorieren.Klicken Sie auf 'nur neue QSOs', um ohne die bereits hochgeladenen QSOs (empfohlen) fortzufahren.Klicken Sie auf 'OK', um die neue Konfigurationsdatei zu installieren, oder Abbrechen zum ignorieren.Klicken Sie auf 'OK', um die neue Version von TQSL, oder brechen Sie ab, um es zu ignorieren.Klicken Sie auf 'QSOs nochmals hochladen', um dieses Log erneut zu laden inkl. bereits hochgeladener QSOs.SchließenBefehl SyntaxfehlerKonfigurationsdatei kann nicht geöffnet werdenKonfigurationsdatei erfolgreich aktualisiertKonfigurationsdateien (*.tbk)|*.tbk|Alle Dateien (*.*)|*.*Schliessen bestätigenContestContest-Name darf nicht leer seinContest-TypKontinentKonvertieren Hochladen konnte nicht gestartet werden!LandCountyCounty: Neue ADIF-Datei erstellen...Erstellen eines neuen StandortesNeue ADIF-Datei für die Signatur und das Hochladen erstellenBenutzerdefinierte ADIF-Mode-Zuordnungen:GELÖSCHTVerlieren Sie das Passwort nicht. Das Zertifikat kann ohne dieses Passwort nicht benutzt werden!DXCC-LandDXCC-Land: DXCC-Land:Daten für dieses DXCC konnten nicht gefunden werdenDatenbankfehler: %hsDatenbankfehlerDatumDatum des ersten QSOs oder geplanten ersten QSOs mit diesem Rufzeichen:Datum des letzten oder geplanten letzten QSOs mit diesem Rufzeichen: (Bitte frei lassen, wenn dies Ihr aktuelles Rufzeichen ist.)Datum außerhalb des BereichsLöschenLöschen "Standort löschen Löschen eines StandortesDia&gnose-ModusAnzeigen der &AnleitungRufzeichen-Zertifikat anzeigenStandort-Eigenschaften anzeigenStandort-Eigenschaften anzeigen für Ein Rufzeichen-Zertifikat anzeigenEigenschaften eines Rufzeichen-Zertifikats anzeigenBefehlszeilen-Hilfe anzeigenZeige Details zuvor signierter QSOs an während ein Log signiert wirdAnzeigen oder Ändern der Einstellungen...Statusmeldungen in separater Registerkarte anzeigenAnzeige der Rufzeichen-Zertifikateigenschaften fürVersionsinformation anzeigen und beendenMöchten Sie wirklich dieses QSO-Enddatum setzen?Möchten Sie es jetzt erneuern?Möchten Sie diese Zertifikats-Anforderung jetzt zum LoTW hochladen?Herunterladen von:Doppelte QSOs erkanntTQSL &Beenden Alt-XBearbeitenBearbeiten (wenn mit -l verwendet) oder Standort anlegenStandort bearbeitenStandort bearbeiten Standort bearbeiten: %hs - %sBearbeiten eines StandortesBearbeiten...E-Mail: Aktivieren Sie einen Netzwerk-ProxyPasswort für Rufzeichen-Zertifikate eingebenEnddatum (JJJJ-MM-TT)Enddatum ist ungültigEnddatum von %s ist ungültigNamen für diesen Standort eingebenPasswort für dieses Rufzeichen-Zertifikat eingeben.Zur Bestätigung wiederholen:Geben Sie die Datei zum Speichern anNeues Passwort eingebenPasswort eingebenPasswort zum Entsperren des Rufzeichen-Zertifikats eingebenGeben Sie den Namen für die neue Zertifikats-Container-Datei einPasswort zur Bestätigung wiederholen:Passwort für die Zertifikats-Container-Datei eingeben.Passwort zum Entsperren der .p12-Datei eingeben:Geben Sie das Passwort zum Entsperren des Rufzeichen-Zertifikats ein für %hs -- %hs (das ist das Passwort, das Sie bei der Installation des Rufzeichen-Zertifikats angegeben haben.)FehlerFehler bei der Überprüfung auf abgelaufene Rufzeichen-Zertifikate:Fehler beim Komprimieren vor dem HochladenFehler beim Erstellen der Rufzeichen-ZertifikatsanforderungFehler beim Erstellen der Rufzeichen-Zertifikatsanforderung: %hsFehler beim Herunterladen der neuen Konfigurationsdatei:Fehler beim Herunterladen der Datei:Fehler beim Herunterladen von Informationen zur neuen Version:Fehler beim Herunterladen von Informationen zur aktuellen Version:Fehler beim Importieren der Standorte: %hsFehler beim Öffnen der Zertifikatanforderungsdatei %s: %hsFehler beim Öffnen des Diagnoseprotokolls %s: %hsFehler beim Öffnen der EingabedateiFehler beim Öffnen der AusgabedateiFehler beim Öffnen der Sicherungsdatei %s: %hsFehler beim Analysieren des Zertifikates für das DXCC-LandFehler beim Analysieren des Rufzeichen-ZertifikatsFehler-Analyse-Zertifikat für AusstellerFehler bei der Analyse der gespeicherten Konfigurationsdatei: %hsFehler bei der Analyse der Standort-Datei: %hsFehler bei der Durchführung des automatischen Backup: %hsFehler bei der Umbenennung der Sicherungsdatei %s: %hsFehler beim Zugriff auf den ZertifikatsspeicherFehler beim Schreiben der neuen Konfigurationsdatei %s:%hsFehler: Datei konnte nicht hochgeladen werden (CURL Init-Fehler)Fehler gefundenFehler: %dTQSL verlassen zum Neustart als normaler BenutzerNach Verarbeitung des Logs verlassen (sonst normal starten)Erwarteter NameAbgelaufenGültig bis: P12-Dateien exportieren, die mit dem Apple-Verschlüsselung kompatibel sindExportieren nach %s fehlgeschlagen: %hsFeldDateiname für das DiagnoseprotokollDatei SyntaxfehlerDatei Syntaxfehler: %hsEndstatus: %hs (%d)Frequenz (MHz):Lokator %s passt nicht zu Ihrem %s. 'Next' nochmals anklicken, um ihn dennoch zu verwenden.Lokator %s passt nicht zu Ihrem DXCC-Land. 'Next' nochmals anklicken, um ihn dennoch zu verwenden.Lokator %s passt nicht zu Ihrem QTH. 'Next' nochmals anklicken, um ihn dennoch zu verwenden.LokatorLokator: Lokator passt nicht zum StandortQTH-Informationen in ADIF-Logs mit welcher Aktion behandeln?HilfeIch bin der QSL-Manager für dieses RufzeichenIOTA-IDIOTA-Lokator: IOTA %s ist falsch. Nach dem '-' muss eine Zahl folgen.IOTA %s ist falsch. Sie muss mit AF-, AN-, AS-, EU-, NA-, OC- oder SA- beginnenIOTA-Angabe %s ungültig.ITU-ZoneITU Zone: Wenn ja, wählen Sie unten ein Rufzeichen für das primäre LoTW-Konto. Wenn nicht, klicken Sie auf "Fertigstellen", und ein neues LoTW-Konto wird für diese QSOs eingerichtet.Wenn Sie aus einem Backup wiederherstellen möchten, wählen Sie bitte 'Nein'.Wenn Sie sicher sind, dass die frühere Anforderung jetzt ungültig ist, sollten Sie das ausstehende Rufzeichen-Zertifikat für %s löschen.Nach den Regularien des FCC müssen Sie US-Bürger sein, um ein US-Rufzeichen gemäss CEPT, IARP oder anderer reziproker Vereinbarungen zu benutzen.Wenn dieser Computer von weiteren Personen verwendet wird sollten Sie ein Passwort benutzen; ansonsten kann darauf verzichtet werden.Wenn dieser Computer von weiteren Personen verwendet wird sollten Sie ein Passwort benutzen; ansonsten kann darauf verzichtet werden.Wenn Sie ein Enddatum festlegen, können QSOs nach diesem Datum nicht signiert werden, auch wenn das Rufzeichen-Zertifikat selbst noch gültig ist.Wenn Sie dieses Rufzeichen aktuell verwenden (oder wenn die Lizenz für das Rufzeichen demnächst erneuert werden soll), sollte kein QSO-Enddatum festgelegt werden.IgnorierenQTH-Details aus eigenem Log ignorierenRufzeichen in ADIF-Dateien ignorierenSekunden in QSO-Zeiten ignorierenImportieren einer Zertifikats-Datei (.p12 oder .tq6)Import erfolgreich abgeschlossenIn der Zwischenzeit beachten Sie bitte, dass einige Log-Programme sich ggf. anders als erwartet verhalten, wenn eine andere Option als 'Duplikate zulassen' angeklickt wird. 'Nur neue QSOs' wird empfohlen. Manche Log-Programme mit eigener 'Hochgeladen-Markierung' könnten den Status der hochgeladenen QSOs aber ggf. falsch speichernIn der Zwischenzeit beachten Sie bitte, dass einige Log-Programme sich ggf. anders als erwartet verhalten, wenn eine andere Option als 'Duplikate zulassen' angeklickt wird. Die Auswahl 'Abbrechen' ist in der Regel sicher, aber ein Log-Programm, das die Statusmeldungen von TrustedQSL nicht überprüft könnte seltsam (aber harmlos) reagieren. In dem es z. B. versucht eine leere Datei hochzuladen oder alle ausgewählten QSOs als 'gesendet' markiert.Unvollständiges Zertifikat - passende TQ6 fehltFalsches Passwort beim Import der P12-DateiFalsche Einstellungen können dazu führen, dass TQSL keine Protokolle hochladen oder nach Updates suchen kann.ADIF- oder Cabrillo-Log-Datei zum Signieren ladenZertifikat installierenUngültige %hs: "%hs"Ungültiges BefehlsargumentUngültiger Kontakt - kein Rufzeichen im QSO angegebenUngültiger Kontakt - kein Band oder keine Frequenz angegebenUngültiger Kontakt - kein Datum angegebenUngültiger Kontakt - keinen Mode angegebenUngültiger Kontakt - keine Zeit angegebenUngültiges DatumsformatUngültiger Fehlercode: %dUngültiges ZeitformatUngültige Zonen-Auswahl für DXCC-LandUngültige Zonen-Auswahl für OblastUngültige Zonen-Auswahl für ProvinzUngültige Zonen-Auswahl für StaatIst dieses Zertifikat für ein Rufzeichen für das Sie bereits ein LoTW-Konto besitzen und diese QSOs sollen diesem Konto hinzugefügt werden? SpracheWenn Sie kein Passwort benutzen wollen, lassen Sie das Feld leer und klicken auf 'Finish'.Lassen Sie das Kennwort leer und klicken Sie auf 'Weiter', ausser wenn Sie ein Kennwort verwenden möchten.Wenn Sie kein Passwort benutzen wollen, lassen Sie das Feld leer und klicken auf 'OK'.LoTW-Verbindung fehlgeschlagenLade ZertifikatsdateiRufzeichen-Zertifikat ladenFertig geladenStandortdatenfehlerLogdateiLogdateifehlerLog-BehandlungLog-OperationenLog-Dateien (*.log)|*.log|Alle Dateien (*.*)|*.*Melden Sie sich auf der LoTW Seite anSpeicherzuordnungsfehlerFehlt auf diesem ComputerMode-KonfliktMode:Mehr Details unter:KEIN FEHLERKEINNameName existiert bereitsNetzwerk-ProxyNeue DBNeues PasswortNur neue QSOsNeues PasswortNeues Passwort:Neu...Keine Rufzeichen-ZertifikateKein ZertifikatDem gewählten Rufzeichen-Zertifikat entspricht keine ZertifikatsanforderungKein privater SchlüsselKeine QSO EinträgeKeine QSOs zum hochladenKeine UpdatesKein Rufzeichen-Zertifikat für SchlüsselKeine Logdatei zum Signieren!Keine Daten ausgegebenKeine Statusinformationen verfügbarKeinesKeiner dieser Punkte trifft zuHinweis: TQSL geht davon aus, dass diese Datei zum LoTW hochgeladen werden soll.Hinweis: TQSL hat diese QSOs noch nicht signiert. Sie können dieses Log zu LoTW hochladen oder es verwerfen.Hinweis: Die hier von Ihnen übermittelte E-Mail-Adresse ist die Adresse, an die das ausgestellte Zertifikat gesendet wird. Stellen Sie sicher, dass die Adresse richtig ist!HinweisAnzahl der zu speichernden Backups:OkOk zum Installieren OblastOblast: Sobald Sie die angeforderten Informationen bereitgestellt haben und die Anforderungsdatei erstellt wurde, müssen Sie die Anforderungsdatei an den Aussteller des Zertifikats senden.Ein QSO EintragADIF-Dateien im ADIF-Editor öffnenDatei öffnenVom Anwender abgebrochenInhaber: OptionenOrganisation: Name der Ausgabedatei (Standard: Eingabedateiname minus Erweiterung und .tq8)Überschreiben Sie den Standort mit QTH-Details aus Ihrem LogPKCS # 12-Datei nicht kompatibel mit TQSLPark: Passwort bestätigtPasswörter stimmen nicht übereinPasswort FehlerPasswort für die SignierungPasswort falschPasswortgeschütztPasswort:Passwort: Bitte wählen Sie ein Rufzeichen für diesen StandortBitte wählen Sie die Sprache aus:Bitte installieren Sie ein Rufzeichen-Zertifikat und versuchen es dann erneut.Bitte lesen Sie die Einführungsdokumentation bevor Sie dieses Programm benutzen.Bitte wählen Sie ein Rufzeichen-Zertifikat für das Konto, in dem die QSOs gespeichert werden sollenBitte wählen Sie ein Rufzeichen-Zertifikat aus, um Ihre Anforderung zu überprüfenBitte wählen Sie das Rufzeichen-Zertifikat für Ihr aktuelles persönliches Rufzeichen aus, um die Anforderung zu überprüfen.Bitte versuchen Sie es später noch einmal.Bitte versuchen Sie %s später hochzuladen.Bitte prüfen Sie, ob dies der richtige Standort ist für den die QSOs signiert werden sollen.Bitte warten Sie, bis Sie eine E-Mail mit dem angeforderten Rufzeichen-Zertifikat erhalten.Portnummer:EinstellungenBereits hochgeladene QSO gefundenBereits hochgeladene QSO gefundenBereits signiert: %dBereits hochgeladene QSOs gefundenBereits signiert: %dPrivaten Schlüssel nicht gefundenAufforderung zur Eingabe des QSO-Zeitraums für die SignierungAusbreitungsmodus:EigenschaftenProvinzProvinz: Proxy-Adresse:Proxy-Typ:Proxy-TypQSO-DatenQSO Daten-FehlerQSO Daten: Ungültiger Mode ignoriert - %sQSO-DatumsbereichQSO-Enddatum: QSO-Frequenz ist ungültigQSO-Frequenz außerhalb des Bereichs für das ausgewählte BandQSO RX-Frequenz ist ungültigQSO RX-Frequenz außerhalb des Bereichs für das ausgewählte BandQSO-Startdatum: QSO Beginn-Datum: Sie müssen gültige Werte für Jahr, Monat und Tag auswählen.QSO-Datum nicht innerhalb des im Rufzeichen-Zertifikat angegebenen BereichsQSO-Enddatum darf nicht vor dem Beginn-Datum liegen.QSO-Enddatum: Sie müssen entweder gültige Werte für Jahr, Monat und Tag auswählen oder alle drei Felder leer lassen.QSO-Datensätze, die mit diesem Zertifikat signiert werden, zählen nicht für das DXCC (sind aber ggf. für andere Diplome gültig). Soll das Zertifikat zum Signieren von QSOs aus maritimen/Maritim Mobile oder mobilem Funkbetrieb verwendet werden, ist dies die richtige Auswahl. Andernfalls sollten Sie die Schaltfläche "Zurück" verwenden, um zur DXCC Seite zurückzukehren.Die QSOs für %hs werden im LoTW-Konto für %s gespeichert.QSOs vor dem Startdatum oder nach dem Enddatum werden nicht signiert und sind nicht in der Ausgabedatei enthalten.QSOs: %dLeise-Modus - gleiches Verhalten wie -xRX-Band:RX-Frequenz (MHz):QSOs nochmals hochladenErneuern eines Rufzeichen-ZertifikatsErneuern Sie das Rufzeichen-Zertifikat fürErsetztQTH-Unterschiede meldenNeues Rufzeichen-Zertifikat anfordern ...Neues Rufzeichen-Zertifikat anfordernAnfrage abgebrochenWiederherstellung abgeschlossen.Wiederherstellen eines gelöschten Rufzeichen-ZertifikatsWiederherstellungsvorgang fehlgeschlagen: %hsWiederherstellung der Rufzeichen-ZertifikateWiederherstellung der EinstellungenWiederherstellung der QSO-DatenWiederherstellung der StandorteWiederherstellen des Rufzeichen-Zertifikats für %hsWenn Sie diese QSOs erneut hochladen werden diese als bereits hochgeladen gemeldet.Resultierender TQSL-Mode:Wiederholen?Die Auswahl eines Satelliten verlangt, dass der Ausbreitungs-Mode 'Satellite' sein mussSatellit:Datei speichernStationsdaten speichernSpeichern eines Rufzeichen-ZertifikatsSpeichern abgeschlossen.Anfrage speichernSpeichern Sie das Rufzeichen-Zertifikat fürGespeicherte Konfigurationsdateien (*.tbk)|*.tbkSpeichern der QSOsSpeichern der StandorteSpeichern der TQSL-EinstellungenSpeichern des Rufzeichen-Zertifikats für %hsSpeichern der Rufzeichen-ZertifikateWählen Sie ein RufzeichenWählen Sie eine ZertifikatsdateiStationsdaten auswählenStandort für die Signierung auswählenWählen Sie ein Rufzeichen-Zertifikat zur Verarbeitung ausWählen Sie einen OrdnerStandort zur Bearbeitung auswählenWählen Sie einen Standort zur Bearbeitung Wählen Sie eine Datei zum SignierenWählen Sie eine Datei zum SpeichernWählen Sie aus oder geben Sie den Namen dieses Standortes einWählen Sie eine gespeicherte KonfigurationsdateiStandort auswählenWählt StandortSeriennummer: Log signieren und speichern, um es später hochzuladenLog signieren und automatisch auf LoTW hochladenSignieren und hochladen einer ADIF- oder Cabrillo-Datei…Signiere Datei: Signierung QSO-DatenSignierung abgebrochenSignierung abgebrochenSignieren wegen Fehlern abgebrochenSignierung abgebrochen.Signierung abgebrochenSignierung mit Rufzeichen %hs, DXCC %hsDa Sie keine Rufzeichen-Zertifikate besitzen, müssen Sie einen "unsignierten" Zertifikatsantrag stellen. Dadurch können Sie Ihr erstes Rufzeichen-Zertifikat für die Verwendung in LoTW erstellen. Klicken Sie auf "Fertigstellen", um diese Rufzeichen-Zertifikatsanforderung abzuschließen.Einige QSOs nicht abgearbeitetQSO-Überprüfungsaktion angeben - ignorieren, melden oder aktualisierenGeben Sie das Standard-Rufzeichen für die Log-Signierung anWählen Sie - Abbruch, alle, richtig oder fragenGeben Sie das Enddatum für die zu signierenden QSOs anGeben Sie das Startdatum für die zu signierenden QSOs anStartdatum (JJJJ-MM-TT)Startdatum ist ungültigStartdatum von %s ist ungültigStaatStaat: Standort-Dateneingabe abgeschlossenStandortName des StandortesStandort-EigenschaftenStandort DatenfehlerStandort stimmt nicht mit den QSO-Details übereinStandorteStationsname muss eingegeben werdenStatusprotokollErfolgreichAuswahl des Zeitraums unterdrückenSystemfehler: %hsSystemfehler: %hs : %hsTQSL bestätigenTQSL-FehlerTQSL-Update verfügbarTQSL- %hs und Konfigurationsdaten-Version %sTQSL-WarnungTQSL komprimierte Daten-Dateien (*.tq8)|*.tq8TQSL Datendateien (*.tq7)|*.tq7TQSL kann keine QSOs signieren, da TQSL bereits im Hintergrund läuft. Beenden Sie alle anderen TQSL-Instanzen und versuchen Sie es erneut.TQSL darf nicht 'als Administrator' ausgeführt werdenTQSL muss auf andere laufende Kopien TQSL warten, um speichern zu können ...TQSL muss warten bis weitere laufende Instanzen beendet sind bevor der Signiervorgang beginnt ...TQSLLib-Fehler%s '%hs' hat den Wert '%hs' das QSO jedoch '%hs'Der Parameter -a %hs wird nicht erkanntDer Parameter -f %hs wird nicht erkanntDie TQSL-Konfigurationsdatei kann nicht analysiert werdenDie TQSL-Upload-Tracking-Datenbank ist gesperrtDas Rufzeichen %s ist derzeit nicht in der ULS-Datenbank der FCC registriert. Wenn es sich um ein neu registriertes Rufzeichen handelt, müssen Sie mindestens einen Arbeitstag warten, bis es gültig ist. Bitte geben Sie ein aktuell gültiges Rufzeichen ein.Das Rufzeichen-Zertifikat für %hs ist abgelaufen. Dieser Standort kann nicht zum signieren verwendet werden bis ein gültiges Rufzeichen-Zertifikat installiert wurde.Rufzeichen zu lang. Es sind nur %d Zeichen erlaubt.Das Zertifikat für %hs läuft in %d Tagen abDas Zertifikat für %hs läuft in %d Tagen ab.Das Datum Ihres ersten QSOs liegt nach dem letzten Gültigkeitstag (%hs) des ausgewählten DXCC-Landes %hsDas Datum Ihres ersten QSOs liegt vor dem ersten Gültigkeitstages (%hs) des ausgewählten DXCC-Landes %hsDas Datum Ihres letzten QSOs liegt nach dem letzten Gültigkeitstag (%hs) des ausgewählten DXCC-Landes %hsDas Datum Ihres letzten QSOs liegt vor dem ersten Gültigkeitstages (%hs) des ausgewählten DXCC-Landes %hsDie Datei wurde nicht gespeichert. Sollen die QSOs gespeichert werden?Falsches Dateiformat.Die ungültigen Daten wurden ignoriert.Im Log steht '%hs' auf '%hs'. Dies ist ungültigDie Log-Datei, die Sie mit Hilfe Ihres Log-Programms hochladen wollen besteht ausschließlich aus bereits zuvor hochgeladenen QSOs (Dubletten), die eine unnötige Last für LoTW darstellen. Möglicherweise gibt es eine neuere Version Ihres Log-Programms, das dies vermeidet. Bitte überprüfen Sie beim Anbieter, ob eine aktualisierte Version vorliegt.Die Log-Datei, die Sie mit Hilfe Ihres Log-Programms hochladen wollen enthält einige bereits zuvor hochgeladenen QSOs (Dubletten), die eine unnötige Last für LoTW darstellen. Möglicherweise gibt es eine neuere Version Ihres Log-Programms, das dies vermeidet. Bitte überprüfen Sie beim Anbieter, ob eine aktualisierte Version vorliegt.Der einzige Grund, doppelte QSOs nochmals zu signieren ist, wenn eine vorherige Datei nicht von LoTW verarbeitet wurde; möglicherweise schlug das Hochladen fehl oder es gab einen Server-AusfallDer private Schlüssel für das Rufzeichen %hs Nr. %ld befindet sich nicht auf diesem Computer; laden Sie eine .tbk oder .p12 DateiDer private Schlüssel für dieses Rufzeichen-Zertifikat befindet sich nicht auf diesem Computer; laden Sie eine .tbk oder .p12 DateiDas ausgewählte Rufzeichen konnte nicht gefunden werdenDer ausgewählte Standort konnte nicht gefunden werdenDie beiden Passwörter stimmen nicht überein.Es sind keine Rufzeichen-Zertifikate für Rufzeichen %hs vorhanden. Dieser Standort kann nicht bearbeitet werden.Es sind keine aktuellen Rufzeichen-Zertifikate für Rufzeichen %hs vorhanden. Dieser Standort kann nicht verwendet werden, um ein Log zu signieren.Es sind keine Rufzeichen-Zertifikate zur Wiederherstellung vorhandenKeine gelöschten Standorte zum Wiederherstellen vorhandenEs liegen keine gültigen Rufzeichen-Zertifikate für das Rufzeichen vorEs gibt ein neueres Rufzeichen-Zertifikat für %hs. Dieser Standort kann nicht zum signieren verwendet werden bis dieses installiert wurde.Kein gültiges Rufzeichenzertifikat für %hs in %hs verfügbar. Das QSO kann nicht signiert werdenDieses Rufzeichen-Zertifikat kann nicht installiert werden, da es abgelaufen ist. Prüfen Sie, ob Ihr Computer auf das richtige Datum eingestellt ist und ob es sich um das neueste Rufzeichen-Zertifikat handelt. Dieses Rufzeichen-Zertifikat kann nicht installiert werden, da der erste Gültigkeitstag in der Zukunft liegt. Stellen Sie sicher, dass Ihr Computer auf das richtige Datum eingestellt ist. Dieser Antrag auf ein Rufzeichen-Zertifikat erfordert eine Bestätigung mittels eines bestehenden Rufzeichen-Zertifikats.Die Adresse muss mit der in der FCC ULS Datenbank übereinstimmen. Falls diese fehlerhaft ist, korrigieren Sie bitte den FCC-Datensatz.Das Rufzeichen-Zertifikat ist bereits aktiv und kann nicht wiederhergestellt werden.Dieses Rufzeichen-Zertifikat ist bereits installiertDieses Rufzeichen ersetzt mein bisheriges RufzeichenDiese Datei kann aufgrund eines Systemfehlers nicht verarbeitet werdenDies ist keine gültige P12 DateiDies ist ein DXpedition-RufzeichenDies ist ein Klub-RufzeichenDies ist ein SonderrufzeichenDies ist mein früheres RufzeichenDieses Log enthält %d QSO(s), die bereits für zum Hochladen auf LoTW signiert scheinen und %d neue QSOs.Dieses Log enthält %d QSO(s), die bereits zum Hochladen auf LoTW signiert wurden und keine neuen QSOs.Dieses Log enthält %d QSO(s), die bereits für zum Hochladen auf LoTW signiert scheinen und ein neues QSO.Log enthält ungültige QSO-InformationenDieses Log hat zu viele bereits hochgeladene QSOs. Bitte laden Sie nur neue QSOs hoch oder unterteilen Sie das Log in kleinere Teile (50.000 QSOs oder weniger).Dieser Mode stimmt nicht überein mit den Standardmode-Definitionen für %sDieses Passwort muss jedes Mal eingegeben werden, wenn Sie dieses Spielerzeichenzertifikat zum Signieren oder beim Speichern des Schlüssels verwenden.Dies sollte vor der Signierung einer Log-Datei korrigiert werden.Dies erstellt eine neue Rufzeichen-Zertifikatsanforderungsdatei.Hierdurch wird das ausgewählte Rufzeichen-Zertifikat von Ihrem System entfernt.Dieser Standort wird dauerhaft von Ihrem System entfernt.ZeitZum Import dieser geschützten Datei muss das Passwort in der Kommandozeile eingetragen seinSo senden Sie die signierte Logdatei an LoTW: 1. Kopieren Sie die signierte Logdatei auf einen Computer mit Internetzugang 2. Melden Sie sich bei Ihrem LoTW-Webkonto an 3. Wählen Sie die Registerkarte Datei hochladen 4. Klicken Sie auf die Schaltfläche Datei auswählen und wählen Sie die signierte Logdatei aus (%s) 5. Klicken Sie auf die Schaltfläche Datei hochladen Alternativ können Sie die signierte Logdatei an eine E-Mail anhängen und die Nachricht an lotw-logs@arrl.org sendenVertrauenswürdiges Root-ZertifikatTypUPURL: US 1x1-Rufzeichenanforderungen müssen ein Enddatum enthaltenUS 1x1-Rufzeichen müssen mit den Buchstaben A-Z enden - exklusive 'X'US 1x1-Rufzeichen müssen als zweites Zeichen eine Zahl habenUS 1x1-Rufzeichen müssen mit W, K oder N beginnenUTC-Datum (JJJJ-MM-TT):UTC-Zeit (SSMM):Kann nicht nach Updates suchen - entweder ist die Internetverbindung ausgefallen oder LoTW ist nicht erreichbar.Kann nicht nach Updates suchen. Das Netzwerk ist nicht verfügbar oder die LoTW Webseite ist zu beschäftigt.Keine Verbindung zur Update-Webseite möglich.Zufallszahlengenerator kann nicht initialisiert werdenKann %s nicht zur Ausgabe öffnenKann ca-bundle.crt nicht öffnen. Ihre TQSL-Installation ist unvollständigLesefehler - keine BerechtigungAktualisieren fehlgeschlagen - entweder ist die Internetverbindung ausgefallen oder LoTW ist nicht erreichbar.Keine Aktualisierung möglich. Entweder ist das Netzwerk nicht verfügbar oder die LoTW-Website ist zu beschäftigt.Wiederherstellungs-FehlerUnerwartete LoTW-AntwortUnbekanntUnbekannter benutzerdefinierter FehlerNicht nutzbar: privater Schlüssel fehltAktualisierungAktualisierung abgeschlossenHochladenUpload wurde abgelehntNach Signierung hochladen statt zu speichernHochladen des Rufzeichen-ZertifikatsHochladen der Rufzeichen-Zertifikatsanforderung...Signierte Daten hochladenSignierte Log-Daten werden hochgeladen ...Upload DatenbankfehlerVerwenden Sie die Schaltfläche "Neu", um einen Standort anzulegen.Verwenden Sie diese Einstellungen, um einen Netzwerk-Proxy für Internet-Uploads und Downloads zu konfigurieren. Sie sollten dies nur aktivieren, wenn Sie vom Netzwerkadministrator dazu aufgefordert werden.Vom Benutzer abgebrochenWertQTH-Details prüfen: WPX-PräfixWarnungAchtung: Der TQSL ADIF-Editor verarbeitet nur eine begrenzte Anzahl von ADIF-Feldern Durch die Benutzung können QSO-Details verloren gehen!Wozu dient dieses Rufzeichen-Zertifikat?TQSL-Upload-Datenbank löschenMöchten Sie Ihr Rufzeichen-Zertifikat jetzt sichern?Möchten Sie jetzt ein Rufzeichen-Zertifikat anfordern?%d QSO-Einträge in %s geschriebenEs KANN aus einem Container (.p12) Datei wiederhergestellt werden,Ohne gültiges Rufzeichen-Zertifikat können Sie kein Rufzeichen-Zertifikat für ein früheres Rufzeichen anfordern.Sie können für 1x1 Rufzeichen keine Zertifikate anfordern, da diese signiert werden müssen. Sie besitzen aber kein gültiges Rufzeichen-Zertifikat, das Sie hierzu verwenden können.Sie können kein Zertifikat für ein portables Rufzeichen beantragen, da Sie diese Anträge signieren müssen, aber Sie besitzen keine gültigen Rufzeichenzertifikate, die Sie zum Signieren dieses Antrags verwenden können.Sie können nicht KEIN als DXCC-Land auswählen, da Sie jede Anfrage für KEIN unterzeichnen müssen und Sie keine gültigen Rufzeichen-Zertifikate haben, die Sie verwenden können, um diese Anforderung zu signieren.Zur Durchführung benötigen Sie kein Konto auf LoTW.Sie haben bereits ein Rufzeichen-Zertifikat für %s angefordert und können kein weiteres anfordern, bis diese Anforderung von LoTW-Mitarbeitern bearbeitet wurde.Sie haben in den letzten 24 Stunden bereits mehr als drei Rufzeichen-Zertifikate für %s beantragt. Sie sollten einen Antrag nur einmal stellen und dann warten, bis dieser Antrag vom LoTW-Personal bearbeitet wird. Dies kann mehrere Arbeitstage dauern.Sie haben ein überlappendes Zertifikat für %s (DXCC = %hs) für QSO-Zeiten: Sie haben die folgenden Felder für diesen Standort geändert: %s Möchten Sie diese Änderungen verwerfen?Sie haben ein QSO-Enddatum für dieses Rufzeichen-Zertifikat ausgewählt. Das QSO-Enddatum sollte NUR DANN festgelegt werden, wenn zu diesem Datum die Lizenz abgelaufen ist oder die Lizenz durch eine neue ersetzt wurde.Sie haben keine Standorte definiert.Auf diesem Computer ist kein Rufzeichen-Zertifikat installiert, mit dem Logs signiert werden könnten.Sie haben keine Rufzeichen-Zertifikate, um ein Log zu signieren.Sie haben kein DXCC-Land ausgewähltSie können ein Datumfeld (oder beide Felder) leer lassen.Jetzt können Sie Ihre neue Zertifikatsanforderung abschicken (Sie können dieses Rufzeichen-Zertifikat durch ein Passwort schützen. Wenn dieser Computer von weiteren Personen verwendet wird sollten Sie ein Passwort benutzen; ansonsten kann darauf verzichtet werden.Sie können die QSO Start- und/oder Enddaten eingeben, um QSOs aus der Eingabedatei auszuwählen.Sie müssen mindestens einen Standort zum Signieren definieren.Sie müssen ein gültiges Rufzeichen eingeben.Sie müssen eine gültige E-Mail-Adresse eingebenSie müssen Ihre Adresse eingebenSie müssen Ihre Stadt eingebenSie müssen Ihren Namen eingebenSie müssen ein %hs wählenSie müssen ein DXCC-Land auswählen.Sie müssen ein Band wählen oder eine Frequenz eingebenSie können es durch das Laden einer .TQ6 Datei NICHT wiederherstellen.Sie müssen das Passwort jedes Mal eingeben wenn Sie die Datei in TrustedQSL hochladen.Sollte das Rufzeichen-Zertifikat verloren gehen, kann es mit dieser tq6-Datei nicht wieder hergestellt werden. Aus Sicherheitsgründen sollten Sie Ihr Zertifikat auf Wechselmedien (z. B. USB-Stick) sichern.Ihre QTH-Details für dieses QSO wurden geändert. Diese waren ursprünglich: %s Jetzt sind sie: %s Bitte stellen Sie sicher, dass Sie dieses QSO ändern wollen! Ihre Zertifikatsanforderung wurde nicht richtig hochgeladen.Ihre benutzerdefinierte Mode-Tabelle %s kollidiert mit den Standard-Mode-Definitionen für %hs und wurde gelöscht.Ihre E-Mail-AdresseIhr System ist auf dem neusten StandIhr Upload scheint fehlgeschlagen zu sein. Möchten Sie diese Anfrage speichern, um sie später hochzuladen?Hochladen scheint fehlgeschlagen zu sein. Soll TQSL es noch einmal versuchen?PLZ[ohne]sind auf dem neusten StandZertifikat?wenn Sie diesen über das Rufzeichen-Zertifikats-Menü erstellt habenim Landin Zeile %doder siehe:tQSL Cert Antrags-Dateien (*.ins TQSL-Formatan:|ADIF-Dateien (|Alle Dateien (|Alle Dateien (*.*)|*.*|Cabrillo-Dateien (tqsl-2.8.1/apps/lang/de/tqslapp.po0000644000175000017500000036455315003421124017013 0ustar rmurphyrmurphy# TrustedQSL # Copyright (C) 2015-2025 The American Radio Relay League # This file is distributed under the same license as the tqsl package. # Rick Murphy/K1MU. # msgid "" msgstr "" "Project-Id-Version: TQSL V2.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-16 18:01-0500\n" "PO-Revision-Date: 2025-02-26 11:26+0100\n" "Last-Translator: Andreas Rehberg\n" "Language-Team: TQSL Developers\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.1\n" #: certtree.cpp:80 certtree.cpp:110 tqsl.cpp:1548 tqsl.cpp:7099 msgid "Callsign Certificates" msgstr "Rufzeichen-Zertifikate" #: certtree.cpp:113 msgid "Error while accessing certificate store" msgstr "Fehler beim Zugriff auf den Zertifikatsspeicher" #: certtree.cpp:119 msgid "Error parsing certificate for issuer" msgstr "Fehler-Analyse-Zertifikat für Aussteller" #: certtree.cpp:124 msgid "Error parsing certificate for call sign" msgstr "Fehler beim Analysieren des Rufzeichen-Zertifikats" #: certtree.cpp:131 msgid "Error parsing certificate for DXCC entity" msgstr "Fehler beim Analysieren des Zertifikates für das DXCC-Land" #: certtree.cpp:186 certtree.cpp:252 msgid "Active, usable certificates" msgstr "Aktive, nutzbare Zertifikate" #: certtree.cpp:202 msgid "Unusable: Missing Private Key" msgstr "Nicht nutzbar: privater Schlüssel fehlt" #: certtree.cpp:218 msgid "Incomplete Certificates - requires a matching TQ6" msgstr "Unvollständiges Zertifikat - passende TQ6 fehlt" #: certtree.cpp:232 msgid "Certificates replaced with a newer one" msgstr "Durch neue ersetzte Zertifikate" #: certtree.cpp:240 msgid "Certificates that have expired" msgstr "Abgelaufene Zertifikate" #: crqwiz.cpp:45 msgid "This callsign replaces my existing callsign" msgstr "Dieses Rufzeichen ersetzt mein bisheriges Rufzeichen" #: crqwiz.cpp:46 msgid "This is my former callsign" msgstr "Dies ist mein früheres Rufzeichen" #: crqwiz.cpp:47 msgid "I am the QSL manager for this callsign" msgstr "Ich bin der QSL-Manager für dieses Rufzeichen" #: crqwiz.cpp:48 msgid "This is a club callsign" msgstr "Dies ist ein Klub-Rufzeichen" #: crqwiz.cpp:49 msgid "This is a DXpedition callsign" msgstr "Dies ist ein DXpedition-Rufzeichen" #: crqwiz.cpp:50 msgid "This is a special event callsign" msgstr "Dies ist ein Sonderrufzeichen" #: crqwiz.cpp:51 msgid "None of these apply" msgstr "Keiner dieser Punkte trifft zu" #: crqwiz.cpp:263 msgid "This will create a new Callsign Certificate request file." msgstr "Dies erstellt eine neue Rufzeichen-Zertifikatsanforderungsdatei." #: crqwiz.cpp:265 msgid "" "Once you supply the requested information and the request file has been " "created, you must send the request file to the certificate issuer." msgstr "" "Sobald Sie die angeforderten Informationen bereitgestellt haben und die " "Anforderungsdatei erstellt wurde, müssen Sie die Anforderungsdatei an den " "Aussteller des Zertifikats senden." #: crqwiz.cpp:272 msgid "Certificate Issuer:" msgstr "Aussteller des Zertifikats:" #: crqwiz.cpp:283 crqwiz.cpp:1665 crqwiz.cpp:1787 crqwiz.cpp:1841 #: crqwiz.cpp:1876 loadcertwiz.cpp:130 loadcertwiz.cpp:305 loadcertwiz.cpp:380 #: loadcertwiz.cpp:382 tqsl.cpp:3009 tqsl.cpp:3472 tqsl.cpp:3488 tqsl.cpp:3552 #: tqsl.cpp:3568 tqsl.cpp:5714 tqsl.cpp:7504 tqsl.cpp:7722 tqsl_prefs.cpp:1046 #: tqsl_prefs.cpp:1053 tqslwiz.cpp:1267 tqslwiz.cpp:1374 msgid "Error" msgstr "Fehler" #: crqwiz.cpp:318 msgid "Email: " msgstr "E-Mail: " #: crqwiz.cpp:320 msgid "URL: " msgstr "URL: " #: crqwiz.cpp:365 msgid "DXCC entity:" msgstr "DXCC-Land:" #: crqwiz.cpp:369 msgid "Call sign:" msgstr "Rufzeichen:" #: crqwiz.cpp:448 msgid "Date of the first QSO you made or will make using this callsign:" msgstr "" "Datum des ersten QSOs oder geplanten ersten QSOs mit diesem Rufzeichen:" #: crqwiz.cpp:502 msgid "" "Date of the last QSO you made or will make using this callsign:\n" "(Leave this date blank if this is still your valid callsign.)" msgstr "" "Datum des letzten oder geplanten letzten QSOs mit diesem Rufzeichen:\n" "(Bitte frei lassen, wenn dies Ihr aktuelles Rufzeichen ist.)" #: crqwiz.cpp:582 msgid "Zip/Postal" msgstr "PLZ" #: crqwiz.cpp:587 stationdial.cpp:70 msgid "Name" msgstr "Name" #: crqwiz.cpp:613 msgid "Address" msgstr "Adresse" #: crqwiz.cpp:643 msgid "City" msgstr "Ort" #: crqwiz.cpp:658 stationdial.cpp:362 stationdial.cpp:373 msgid "State" msgstr "Staat" #: crqwiz.cpp:684 crqwiz.cpp:687 msgid "Country" msgstr "Land" #: crqwiz.cpp:786 msgid "Your e-mail address" msgstr "Ihre E-Mail-Adresse" #: crqwiz.cpp:801 msgid "" "Note: The e-mail address you provide here is the address to which the issued " "Certificate will be sent. Make sure it's the correct address!" msgstr "" "Hinweis: Die hier von Ihnen übermittelte E-Mail-Adresse ist die Adresse, an " "die das ausgestellte Zertifikat gesendet wird. Stellen Sie sicher, dass die " "Adresse richtig ist!" #: crqwiz.cpp:847 msgid "" "You may protect this Callsign Certificate using a passphrase. If you are " "using a computer system that is shared with others, you should specify a " "passphrase to protect this Callsign Certificate. However, if you are using a " "computer in a private residence, no passphrase need be specified." msgstr "" "Sie können dieses Rufzeichen-Zertifikat durch ein Passwort schützen. Wenn " "dieser Computer von weiteren Personen verwendet wird sollten Sie ein " "Passwort benutzen; ansonsten kann darauf verzichtet werden." #: crqwiz.cpp:852 crqwiz.cpp:881 msgid "" "Leave the passphrase blank and click 'Next' unless you want to use a " "passphrase." msgstr "" "Lassen Sie das Kennwort leer und klicken Sie auf 'Weiter', ausser wenn Sie " "ein Kennwort verwenden möchten." #: crqwiz.cpp:856 msgid "Passphrase:" msgstr "Passwort:" #: crqwiz.cpp:862 msgid "Enter the passphrase again for verification:" msgstr "Passwort zur Bestätigung wiederholen:" #: crqwiz.cpp:868 msgid "" "DO NOT lose the passphrase you choose! You will be unable to use the " "Certificate without this passphrase!" msgstr "" "Verlieren Sie das Passwort nicht. Das Zertifikat kann ohne dieses Passwort " "nicht benutzt werden!" #: crqwiz.cpp:886 msgid "" "Leave the passphrase blank and click 'Finish' unless you want to use a " "passphrase." msgstr "" "Wenn Sie kein Passwort benutzen wollen, lassen Sie das Feld leer und klicken " "auf 'Finish'." #: crqwiz.cpp:917 msgid "What is this Callsign Certificate for?" msgstr "Wozu dient dieses Rufzeichen-Zertifikat?" #: crqwiz.cpp:1007 msgid "" "Since you have no Callsign Certificates, you must submit an 'Unsigned' " "certificate request. This will allow you to create your initial Callsign " "Certificate for LoTW use. Click 'Finish' to complete this Callsign " "Certificate request." msgstr "" "Da Sie keine Rufzeichen-Zertifikate besitzen, müssen Sie einen \"unsignierten" "\" Zertifikatsantrag stellen. Dadurch können Sie Ihr erstes Rufzeichen-" "Zertifikat für die Verwendung in LoTW erstellen. Klicken Sie auf " "\"Fertigstellen\", um diese Rufzeichen-Zertifikatsanforderung abzuschließen." #: crqwiz.cpp:1025 msgid "" "This Callsign Certificate request requires approval using an existing " "Callsign Certificate." msgstr "" "Dieser Antrag auf ein Rufzeichen-Zertifikat erfordert eine Bestätigung " "mittels eines bestehenden Rufzeichen-Zertifikats." #: crqwiz.cpp:1028 msgid "" "Is this new certificate for a callsign where you already have a LoTW " "account, and you want the QSOs for this call to be added to an existing LoTW " "account? " msgstr "" "Ist dieses Zertifikat für ein Rufzeichen für das Sie bereits ein LoTW-Konto " "besitzen und diese QSOs sollen diesem Konto hinzugefügt werden? " #: crqwiz.cpp:1030 msgid "" "If so, choose a callsign below for the primary LoTW account. If not, click " "'Finish', and a new LoTW account will be set up for these QSOs." msgstr "" "Wenn ja, wählen Sie unten ein Rufzeichen für das primäre LoTW-Konto. Wenn " "nicht, klicken Sie auf \"Fertigstellen\", und ein neues LoTW-Konto wird für " "diese QSOs eingerichtet." #: crqwiz.cpp:1033 msgid "" "CAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause " "issues with handling awards." msgstr "" "ACHTUNG: das Vermischen nicht zusammen gehörender Rufzeichen in einem LoTW-" "Konto kann zu Problemen mit Diplomen führen." #: crqwiz.cpp:1126 #, c-format msgid "The callsign is too long. Only %d characters are allowed." msgstr "Rufzeichen zu lang. Es sind nur %d Zeichen erlaubt." #: crqwiz.cpp:1223 msgid "You must enter a valid call sign." msgstr "Sie müssen ein gültiges Rufzeichen eingeben." #: crqwiz.cpp:1326 msgid "You must select a DXCC entity." msgstr "Sie müssen ein DXCC-Land auswählen." #: crqwiz.cpp:1357 msgid "QSO begin date: You must choose proper values for Year, Month and Day." msgstr "" "QSO Beginn-Datum: Sie müssen gültige Werte für Jahr, Monat und Tag auswählen." #: crqwiz.cpp:1361 msgid "" "QSO end date: You must either choose proper values for Year, Month and Day " "or leave all three blank." msgstr "" "QSO-Enddatum: Sie müssen entweder gültige Werte für Jahr, Monat und Tag " "auswählen oder alle drei Felder leer lassen." #: crqwiz.cpp:1366 msgid "QSO end date cannot be before QSO begin date." msgstr "QSO-Enddatum darf nicht vor dem Beginn-Datum liegen." #: crqwiz.cpp:1398 msgid "" "The date of your first QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "Das Datum Ihres ersten QSOs liegt vor dem ersten Gültigkeitstages (%hs) des " "ausgewählten DXCC-Landes %hs" #: crqwiz.cpp:1402 msgid "" "The date of your first QSO is after the last valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "Das Datum Ihres ersten QSOs liegt nach dem letzten Gültigkeitstag (%hs) des " "ausgewählten DXCC-Landes %hs" #: crqwiz.cpp:1406 msgid "" "The date of your last QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "Das Datum Ihres letzten QSOs liegt vor dem ersten Gültigkeitstages (%hs) des " "ausgewählten DXCC-Landes %hs" #: crqwiz.cpp:1410 msgid "" "The date of your last QSO is after the last valid date (%hs) of the selected " "DXCC Entity %hs" msgstr "" "Das Datum Ihres letzten QSOs liegt nach dem letzten Gültigkeitstag (%hs) des " "ausgewählten DXCC-Landes %hs" #: crqwiz.cpp:1433 msgid "US 1x1 callsigns must start with W, K, or N" msgstr "US 1x1-Rufzeichen müssen mit W, K oder N beginnen" #: crqwiz.cpp:1437 msgid "US 1x1 callsigns must have a number as the second character" msgstr "US 1x1-Rufzeichen müssen als zweites Zeichen eine Zahl haben" #: crqwiz.cpp:1441 msgid "US 1x1 callsigns must end in letters A-Z excluding 'X'" msgstr "US 1x1-Rufzeichen müssen mit den Buchstaben A-Z enden - exklusive 'X'" #: crqwiz.cpp:1447 msgid "US 1x1 callsign requests must provide an end date" msgstr "US 1x1-Rufzeichenanforderungen müssen ein Enddatum enthalten" #. TRANSLATORS: first argument is callsign (%s), second is the related DXCC entity name (%hs) #: crqwiz.cpp:1492 msgid "" "You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: " msgstr "" "Sie haben ein überlappendes Zertifikat für %s (DXCC = %hs) für QSO-Zeiten: " #. TRANSLATORS: here "to" separates two dates in a date range #: crqwiz.cpp:1494 msgid " to " msgstr " bis " #: crqwiz.cpp:1503 #, c-format msgid "" "You have already requested a Callsign Certificate for %s and can not request " "another until that request has been processed by LoTW Staff." msgstr "" "Sie haben bereits ein Rufzeichen-Zertifikat für %s angefordert und können " "kein weiteres anfordern, bis diese Anforderung von LoTW-Mitarbeitern " "bearbeitet wurde." #: crqwiz.cpp:1505 crqwiz.cpp:1545 msgid "" "Please wait until you receive an e-mail bearing your requested Callsign " "Certificate." msgstr "" "Bitte warten Sie, bis Sie eine E-Mail mit dem angeforderten Rufzeichen-" "Zertifikat erhalten." #: crqwiz.cpp:1507 #, c-format msgid "" "If you are sure that the earlier request is now invalid you should delete " "the pending Callsign Certificate for %s." msgstr "" "Wenn Sie sicher sind, dass die frühere Anforderung jetzt ungültig ist, " "sollten Sie das ausstehende Rufzeichen-Zertifikat für %s löschen." #: crqwiz.cpp:1543 #, c-format msgid "" "You have already requested more than three Callsign Certificates for %s in " "the past 24 hours. You should submit a request only once, then wait for that " "request to be processed by LoTW Staff. This may take several business days." msgstr "" "Sie haben in den letzten 24 Stunden bereits mehr als drei Rufzeichen-" "Zertifikate für %s beantragt. Sie sollten einen Antrag nur einmal stellen " "und dann warten, bis dieser Antrag vom LoTW-Personal bearbeitet wird. Dies " "kann mehrere Arbeitstage dauern." #: crqwiz.cpp:1639 msgid "" "You cannot request a Callsign Certificate for a former callsign unless you " "hold a valid Callsign Certificate to be used to verify that request." msgstr "" "Ohne gültiges Rufzeichen-Zertifikat können Sie kein Rufzeichen-Zertifikat " "für ein früheres Rufzeichen anfordern." #: crqwiz.cpp:1644 #, c-format msgid "" "The callsign %s is not currently registered in the FCC ULS database.\n" "If this is a newly registered call, you must wait at least one business day " "for it to be valid. Please enter a currently valid callsign." msgstr "" "Das Rufzeichen %s ist derzeit nicht in der ULS-Datenbank der FCC " "registriert.\n" "Wenn es sich um ein neu registriertes Rufzeichen handelt, müssen Sie " "mindestens einen Arbeitstag warten, bis es gültig ist. Bitte geben Sie ein " "aktuell gültiges Rufzeichen ein." #: crqwiz.cpp:1654 msgid "" "If you are using a US callsign outside of the US persuant to CEPT, IARP or " "other Reciprocity arrangements, FCC rules require you to be a US Citizen." msgstr "" "Nach den Regularien des FCC müssen Sie US-Bürger sein, um ein US-Rufzeichen " "gemäss CEPT, IARP oder anderer reziproker Vereinbarungen zu benutzen." #: crqwiz.cpp:1654 crqwiz.cpp:1706 loadcertwiz.cpp:218 tqsl.cpp:6234 #: tqsl.cpp:7050 tqsl.cpp:7178 tqsl_prefs.cpp:448 msgid "Warning" msgstr "Warnung" #: crqwiz.cpp:1670 msgid "" "You cannot select DXCC Entity NONE as you must sign any request for entity " "NONE and you have no valid Callsign Certificates that you can use to sign " "this request." msgstr "" "Sie können nicht KEIN als DXCC-Land auswählen, da Sie jede Anfrage für KEIN " "unterzeichnen müssen und Sie keine gültigen Rufzeichen-Zertifikate haben, " "die Sie verwenden können, um diese Anforderung zu signieren." #: crqwiz.cpp:1671 crqwiz.cpp:1684 crqwiz.cpp:1693 crqwiz.cpp:1890 tqsl.cpp:155 #: tqsl.cpp:193 msgid "TQSL Error" msgstr "TQSL-Fehler" #: crqwiz.cpp:1676 msgid "You have selected DXCC Entity NONE" msgstr "Sie haben kein DXCC-Land ausgewählt" #: crqwiz.cpp:1678 msgid "" "QSO records signed using the Certificate will not be valid for DXCC award " "credit (but will be valid for other applicable awards). If the Certificate " "is to be used for signing QSOs from maritime/marine mobile, shipboard, or " "air mobile operations, that is the correct selection. Otherwise, you " "probably should use the \"Back\" button to return to the DXCC page after " "clicking \"OK\"" msgstr "" "QSO-Datensätze, die mit diesem Zertifikat signiert werden, zählen nicht für " "das DXCC (sind aber ggf. für andere Diplome gültig). Soll das Zertifikat zum " "Signieren von QSOs aus maritimen/Maritim Mobile oder mobilem Funkbetrieb " "verwendet werden, ist dies die richtige Auswahl. Andernfalls sollten Sie die " "Schaltfläche \"Zurück\" verwenden, um zur DXCC Seite zurückzukehren." #: crqwiz.cpp:1679 stationdial.cpp:458 msgid "TQSL Warning" msgstr "TQSL-Warnung" #: crqwiz.cpp:1683 msgid "" "You cannot request a certificate for a 1x1 callsign as you must sign those " "requests, but you have no valid Callsign Certificates that you can use to " "sign this request." msgstr "" "Sie können für 1x1 Rufzeichen keine Zertifikate anfordern, da diese signiert " "werden müssen. Sie besitzen aber kein gültiges Rufzeichen-Zertifikat, das " "Sie hierzu verwenden können." #: crqwiz.cpp:1692 msgid "" "You cannot request a certificate for a portable callsign as you must sign " "those requests, but you have no valid Callsign Certificates that you can use " "to sign this request." msgstr "" "Sie können kein Zertifikat für ein portables Rufzeichen beantragen, da Sie " "diese Anträge signieren müssen, aber Sie besitzen keine gültigen " "Rufzeichenzertifikate, die Sie zum Signieren dieses Antrags verwenden können." #: crqwiz.cpp:1699 msgid "" "You have chosen a QSO end date for this Callsign Certificate. The 'QSO end " "date' should ONLY be set if that date is the date when that callsign's " "license expired or the license was replaced by a new callsign." msgstr "" "Sie haben ein QSO-Enddatum für dieses Rufzeichen-Zertifikat ausgewählt. Das " "QSO-Enddatum sollte NUR DANN festgelegt werden, wenn zu diesem Datum die " "Lizenz abgelaufen ist oder die Lizenz durch eine neue ersetzt wurde." #: crqwiz.cpp:1701 msgid "" "If you set an end date, you will not be able to sign QSOs past that date, " "even if the Callsign Certificate itself is still valid." msgstr "" "Wenn Sie ein Enddatum festlegen, können QSOs nach diesem Datum nicht " "signiert werden, auch wenn das Rufzeichen-Zertifikat selbst noch gültig ist." #: crqwiz.cpp:1703 msgid "" "If you still hold this callsign (or if you plan to renew the license for the " "callsign), you should not set a 'QSO end date'." msgstr "" "Wenn Sie dieses Rufzeichen aktuell verwenden (oder wenn die Lizenz für das " "Rufzeichen demnächst erneuert werden soll), sollte kein QSO-Enddatum " "festgelegt werden." #: crqwiz.cpp:1705 msgid "Do you really want to keep this 'QSO end date'?" msgstr "Möchten Sie wirklich dieses QSO-Enddatum setzen?" #: crqwiz.cpp:1737 msgid "You must enter your name" msgstr "Sie müssen Ihren Namen eingeben" #: crqwiz.cpp:1739 msgid "You must enter your address" msgstr "Sie müssen Ihre Adresse eingeben" #: crqwiz.cpp:1741 msgid "You must enter your city" msgstr "Sie müssen Ihre Stadt eingeben" #: crqwiz.cpp:1759 msgid "" "This address must match the FCC ULS database.\n" "If this address information is incorrect, please correct your FCC record." msgstr "" "Die Adresse muss mit der in der FCC ULS Datenbank übereinstimmen.\n" "Falls diese fehlerhaft ist, korrigieren Sie bitte den FCC-Datensatz." #: crqwiz.cpp:1828 msgid "You must enter a valid email address" msgstr "Sie müssen eine gültige E-Mail-Adresse eingeben" #: crqwiz.cpp:1863 msgid "The two copies of the passphrase do not match." msgstr "Die beiden Passwörter stimmen nicht überein." #: crqwiz.cpp:1904 msgid "Click 'Finish' to complete this Callsign Certificate request." msgstr "" "Klicken Sie auf 'Fertig stellen', um diese Rufzeichen-Zertifikatsanforderung " "abzuschließen." #: crqwiz.cpp:1910 msgid "" "Please select a Callsign Certificate for the account where you would like " "the QSOs to be stored" msgstr "" "Bitte wählen Sie ein Rufzeichen-Zertifikat für das Konto, in dem die QSOs " "gespeichert werden sollen" #: crqwiz.cpp:1913 crqwiz.cpp:1920 msgid "" "Please select the Callsign Certificate for your current personal callsign to " "validate your request." msgstr "" "Bitte wählen Sie das Rufzeichen-Zertifikat für Ihr aktuelles persönliches " "Rufzeichen aus, um die Anforderung zu überprüfen." #: crqwiz.cpp:1915 crqwiz.cpp:1922 msgid "Please select a Callsign Certificate to validate this request" msgstr "" "Bitte wählen Sie ein Rufzeichen-Zertifikat aus, um Ihre Anforderung zu " "überprüfen" #: crqwiz.cpp:1929 msgid "QSOs for %hs will be stored in the LoTW account for %s." msgstr "Die QSOs für %hs werden im LoTW-Konto für %s gespeichert." #. TRANSLATORS: This is part of an deleted DXCC entity name #: dxcc.cpp:49 msgid "DELETED" msgstr "GELÖSCHT" #: getpassword.cpp:48 getpassword.cpp:121 qsodatadialog.cpp:387 tqsl.cpp:452 #: tqsl_prefs.cpp:70 tqsl_prefs.cpp:289 tqsl_prefs.cpp:1019 stationdial.h:46 #: tqslapp.h:132 msgid "OK" msgstr "Ok" #: getpassword.cpp:51 getpassword.cpp:124 qsodatadialog.cpp:386 #: stationdial.cpp:225 tqsl.cpp:309 tqsl.cpp:364 tqsl.cpp:453 tqsl.cpp:577 #: tqsl.cpp:637 tqsl.cpp:1987 tqsl_prefs.cpp:73 tqsl_prefs.cpp:292 #: tqsl_prefs.cpp:1022 msgid "Cancel" msgstr "Abbrechen" #: getpassword.cpp:53 getpassword.cpp:126 qsodatadialog.cpp:385 #: stationdial.cpp:223 tqsl_prefs.cpp:67 msgid "Help" msgstr "Hilfe" #: getpassword.cpp:111 msgid "New passphrase:" msgstr "Neues Passwort:" #: getpassword.cpp:114 msgid "Enter again to confirm:" msgstr "Zur Bestätigung wiederholen:" #: getpassword.cpp:146 msgid "Passphrase entries do not match" msgstr "Passwörter stimmen nicht überein" #: getpassword.cpp:157 msgid "Passphrase confirmed" msgstr "Passwort bestätigt" #: loadcertwiz.cpp:41 msgid "Import completed successfully" msgstr "Import erfolgreich abgeschlossen" #: loadcertwiz.cpp:75 msgid "OK to install " msgstr "Ok zum Installieren " #: loadcertwiz.cpp:76 msgid "certificate?" msgstr "Zertifikat?" #: loadcertwiz.cpp:77 msgid "Install Certificate" msgstr "Zertifikat installieren" #: loadcertwiz.cpp:109 msgid "This callsign certificate is already installed" msgstr "Dieses Rufzeichen-Zertifikat ist bereits installiert" #: loadcertwiz.cpp:118 msgid "Trusted root certificate" msgstr "Vertrauenswürdiges Root-Zertifikat" #: loadcertwiz.cpp:121 msgid "Certificate Authority certificate" msgstr "Zertifikat der Zertifizierungsstelle" #: loadcertwiz.cpp:124 wxutil.cpp:278 msgid "Callsign Certificate" msgstr "Rufzeichen-Zertifikat" #: loadcertwiz.cpp:168 msgid "Enter a passphrase for this callsign certificate." msgstr "Passwort für dieses Rufzeichen-Zertifikat eingeben." #: loadcertwiz.cpp:170 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using " "a computer in a private residence no passphrase need be specified." msgstr "" "Wenn dieser Computer von weiteren Personen verwendet wird sollten Sie ein " "Passwort benutzen; ansonsten kann darauf verzichtet werden." #: loadcertwiz.cpp:172 msgid "" "This passphrase will have to be entered each time you use this callsign " "certificate for signing or when saving the key." msgstr "" "Dieses Passwort muss jedes Mal eingegeben werden, wenn Sie dieses " "Spielerzeichenzertifikat zum Signieren oder beim Speichern des Schlüssels " "verwenden." #: loadcertwiz.cpp:174 tqsl.cpp:6983 msgid "" "Leave the passphrase blank and click 'OK' unless you want to use a " "passphrase." msgstr "" "Wenn Sie kein Passwort benutzen wollen, lassen Sie das Feld leer und klicken " "auf 'OK'." #: loadcertwiz.cpp:176 msgid "New Passphrase" msgstr "Neues Passwort" #: loadcertwiz.cpp:215 msgid "" "You will not be able to use this tq6 file to recover your callsign " "certificate if it gets lost. For security purposes, you should back up your " "certificate on removable media for safe-keeping." msgstr "" "Sollte das Rufzeichen-Zertifikat verloren gehen, kann es mit dieser tq6-" "Datei nicht wieder hergestellt werden. Aus Sicherheitsgründen sollten Sie " "Ihr Zertifikat auf Wechselmedien (z. B. USB-Stick) sichern." #: loadcertwiz.cpp:217 msgid "Would you like to back up your callsign certificate now?" msgstr "Möchten Sie Ihr Rufzeichen-Zertifikat jetzt sichern?" #: loadcertwiz.cpp:253 msgid "" "Callsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*." "tq6;*.TQ6" msgstr "" "Rufzeichen-Zertifikate-Containerdateien (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*." "P12;*.tq6;*.TQ6" #: loadcertwiz.cpp:255 msgid "Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6" msgstr "Rufzeichen-Zertifikate-Containerdateien (*.p12,*.tq6))|*.p12;*.tq6" #: loadcertwiz.cpp:257 tqsl.cpp:4545 msgid "|All files (*.*)|*.*" msgstr "|Alle Dateien (*.*)|*.*" #: loadcertwiz.cpp:261 msgid "Select Certificate File" msgstr "Wählen Sie eine Zertifikatsdatei" #: loadcertwiz.cpp:305 loadcertwiz.cpp:380 tqsl.cpp:6202 msgid "This file is not a valid P12 file" msgstr "Dies ist keine gültige P12 Datei" #: loadcertwiz.cpp:321 msgid "Loading complete" msgstr "Fertig geladen" #: loadcertwiz.cpp:336 msgid "No status information available" msgstr "Keine Statusinformationen verfügbar" #: loadcertwiz.cpp:343 msgid "Enter the passphrase to unlock the .p12 file:" msgstr "Passwort zum Entsperren der .p12-Datei eingeben:" #: loadcertwiz.cpp:377 tqsl.cpp:2275 msgid "Passphrase error" msgstr "Passwort Fehler" #: loctree.cpp:93 tqsl.cpp:1441 tqsl.cpp:7209 msgid "Station Locations" msgstr "Standorte" #: qsodatadialog.cpp:166 qsodatadialog.cpp:200 qsodatadialog.cpp:208 msgid "NONE" msgstr "KEIN" #: qsodatadialog.cpp:193 msgid "UP" msgstr "UP" #: qsodatadialog.cpp:255 msgid "Call Sign:" msgstr "Rufzeichen:" #: qsodatadialog.cpp:263 msgid "UTC Date (YYYY-MM-DD):" msgstr "UTC-Datum (JJJJ-MM-TT):" #: qsodatadialog.cpp:271 msgid "UTC Time (HHMM):" msgstr "UTC-Zeit (SSMM):" #: qsodatadialog.cpp:280 msgid "Mode:" msgstr "Mode:" #: qsodatadialog.cpp:289 msgid "Band:" msgstr "Band:" #: qsodatadialog.cpp:299 msgid "RX Band:" msgstr "RX-Band:" #: qsodatadialog.cpp:308 msgid "Frequency (MHz):" msgstr "Frequenz (MHz):" #: qsodatadialog.cpp:315 msgid "RX Frequency (MHz):" msgstr "RX-Frequenz (MHz):" #: qsodatadialog.cpp:323 msgid "Propagation Mode:" msgstr "Ausbreitungsmodus:" #: qsodatadialog.cpp:332 msgid "Satellite:" msgstr "Satellit:" #: qsodatadialog.cpp:375 msgid "Add QSO" msgstr "QSO hinzufügen" #: qsodatadialog.cpp:379 stationdial.cpp:218 tqsl_prefs.cpp:182 #: tqsl_prefs.cpp:837 msgid "Delete" msgstr "Löschen" #: qsodatadialog.cpp:505 msgid "QSO Frequency is invalid" msgstr "QSO-Frequenz ist ungültig" #: qsodatadialog.cpp:505 qsodatadialog.cpp:512 qsodatadialog.cpp:521 #: qsodatadialog.cpp:528 qsodatadialog.cpp:538 qsodatadialog.cpp:543 #: qsodatadialog.cpp:548 qsodatadialog.cpp:553 tqslvalidator.cpp:77 msgid "QSO Data Error" msgstr "QSO Daten-Fehler" #: qsodatadialog.cpp:512 msgid "QSO Frequency is out of range for the selected band" msgstr "QSO-Frequenz außerhalb des Bereichs für das ausgewählte Band" #: qsodatadialog.cpp:521 msgid "QSO RX Frequency is invalid" msgstr "QSO RX-Frequenz ist ungültig" #: qsodatadialog.cpp:528 msgid "QSO RX Frequency is out of range for the selected band" msgstr "QSO RX-Frequenz außerhalb des Bereichs für das ausgewählte Band" #: qsodatadialog.cpp:538 msgid "You must select a band or enter a frequency" msgstr "Sie müssen ein Band wählen oder eine Frequenz eingeben" #: qsodatadialog.cpp:543 msgid "Call Sign cannot be empty" msgstr "Rufzeichen darf nicht leer sein" #: qsodatadialog.cpp:548 msgid "'Satellite' propagation mode selected, so a Satellite must be chosen" msgstr "" "\"Satelliten\"-Mode angegeben, daher muss ein Satellit ausgewählt werden" #: qsodatadialog.cpp:553 msgid "Satellite choice requires that Propagation Mode be 'Satellite'" msgstr "" "Die Auswahl eines Satelliten verlangt, dass der Ausbreitungs-Mode " "'Satellite' sein muss" #: qsodatadialog.cpp:570 #, c-format msgid "QSO Data: Invalid Mode ignored - %s" msgstr "QSO Daten: Ungültiger Mode ignoriert - %s" #: qsodatadialog.cpp:592 msgid "No QSO records" msgstr "Keine QSO Einträge" #: qsodatadialog.cpp:606 msgid "Save File" msgstr "Datei speichern" #: qsodatadialog.cpp:608 tqsl.cpp:1925 msgid "" "ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files " "(*.*)|*.*" msgstr "" "ADIF-Dateien (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|Alle " "Dateien (*.*)|*.*" #: qsodatadialog.cpp:610 tqsl.cpp:1927 msgid "ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*" msgstr "ADIF-Dateien (*.adi;*.adif)|*.adi;*.adif|Alle Dateien (*.*)|*.*" #: qsodatadialog.cpp:699 #, c-format msgid "Wrote %d QSO records to %s" msgstr "%d QSO-Einträge in %s geschrieben" #: qsodatadialog.cpp:752 msgid "The file has not been saved. Should the QSOs be saved?" msgstr "Die Datei wurde nicht gespeichert. Sollen die QSOs gespeichert werden?" #: qsodatadialog.cpp:752 msgid "Confirm Close" msgstr "Schliessen bestätigen" #: qsodatadialog.cpp:876 msgid "One QSO Record" msgstr "Ein QSO Eintrag" #: qsodatadialog.cpp:878 #, c-format msgid "%d QSO Records" msgstr "%d QSO Einträge" #: stationdial.cpp:56 tqsl.cpp:6508 msgid "&Properties" msgstr "Eigenschaften" #: stationdial.cpp:66 msgid "Properties" msgstr "Eigenschaften" #: stationdial.cpp:71 msgid "Value" msgstr "Wert" #: stationdial.cpp:182 msgid "Select Station Data" msgstr "Stationsdaten auswählen" #: stationdial.cpp:193 msgid "Save Station Data" msgstr "Stationsdaten speichern" #: stationdial.cpp:201 msgid "Enter a name for this Station Location" msgstr "Namen für diesen Standort eingeben" #: stationdial.cpp:201 msgid "Selected Station Location" msgstr "Standort auswählen" #: stationdial.cpp:211 msgid "New..." msgstr "Neu..." #: stationdial.cpp:214 tqsl_prefs.cpp:835 msgid "Edit..." msgstr "Bearbeiten..." #: stationdial.cpp:297 msgid "Delete \"" msgstr "Löschen \"" #: stationdial.cpp:297 msgid "TQSL Confirm" msgstr "TQSL bestätigen" #: stationdial.cpp:363 msgid "Call Sign" msgstr "Rufzeichen" #: stationdial.cpp:364 msgid "Province" msgstr "Provinz" #: stationdial.cpp:365 msgid "Continent" msgstr "Kontinent" #: stationdial.cpp:366 msgid "CQ Zone" msgstr "CQ-Zone" #: stationdial.cpp:367 msgid "DXCC Entity" msgstr "DXCC-Land" #: stationdial.cpp:368 msgid "Grid Square" msgstr "Lokator" #: stationdial.cpp:369 msgid "IOTA ID" msgstr "IOTA-ID" #: stationdial.cpp:370 msgid "ITU Zone" msgstr "ITU-Zone" #: stationdial.cpp:371 msgid "Oblast" msgstr "Oblast" #: stationdial.cpp:372 msgid "County" msgstr "County" #: stationdial.cpp:374 msgid "WPX Prefix" msgstr "WPX-Präfix" #: stationdial.cpp:453 msgid "You have no Station Locations defined." msgstr "Sie haben keine Standorte definiert." #: stationdial.cpp:455 msgid "You must define at least one Station Location to use for signing." msgstr "Sie müssen mindestens einen Standort zum Signieren definieren." #: stationdial.cpp:457 msgid "" "Use the \"New\" Button of the dialog you're about to see to define a Station " "Location." msgstr "Verwenden Sie die Schaltfläche \"Neu\", um einen Standort anzulegen." #: tqsl.cpp:189 msgid "Success" msgstr "Erfolgreich" #: tqsl.cpp:190 msgid "User Cancelled" msgstr "Vom Benutzer abgebrochen" #: tqsl.cpp:191 msgid "Upload Rejected" msgstr "Upload wurde abgelehnt" #: tqsl.cpp:192 msgid "Unexpected LoTW Response" msgstr "Unerwartete LoTW-Antwort" #: tqsl.cpp:194 msgid "TQSLLib Error" msgstr "TQSLLib-Fehler" #: tqsl.cpp:195 msgid "Error opening input file" msgstr "Fehler beim Öffnen der Eingabedatei" #: tqsl.cpp:196 msgid "Error opening output file" msgstr "Fehler beim Öffnen der Ausgabedatei" #: tqsl.cpp:197 tqsl.cpp:2720 msgid "No QSOs to upload" msgstr "Keine QSOs zum hochladen" #: tqsl.cpp:198 msgid "Some QSOs not processed" msgstr "Einige QSOs nicht abgearbeitet" #: tqsl.cpp:199 msgid "Command Syntax Error" msgstr "Befehl Syntaxfehler" #: tqsl.cpp:200 msgid "LoTW Connection Failed" msgstr "LoTW-Verbindung fehlgeschlagen" #: tqsl.cpp:201 msgid "Unknown" msgstr "Unbekannt" #: tqsl.cpp:202 msgid "The TQSL upload tracking database is locked" msgstr "Die TQSL-Upload-Tracking-Datenbank ist gesperrt" #: tqsl.cpp:203 msgid "Previously signed QSOs were detected" msgstr "Bereits hochgeladene QSOs gefunden" #: tqsl.cpp:204 msgid "Incorrect passphrase when importing P12 file" msgstr "Falsches Passwort beim Import der P12-Datei" #: tqsl.cpp:210 msgid "Final Status: %hs (%d)" msgstr "Endstatus: %hs (%d)" #. TRANSLATORS: this is followed by the callsign and entity name #: tqsl.cpp:260 msgid "" "Enter the passphrase to unlock the callsign certificate for %hs -- %hs\n" "(This is the passphrase you made up when you installed the callsign " "certificate.)" msgstr "" "Geben Sie das Passwort zum Entsperren des Rufzeichen-Zertifikats ein für %hs " "-- %hs\n" "(das ist das Passwort, das Sie bei der Installation des Rufzeichen-" "Zertifikats angegeben haben.)" #: tqsl.cpp:271 tqsl.cpp:7704 getpassword.h:32 getpassword.h:33 msgid "Enter passphrase" msgstr "Passwort eingeben" #: tqsl.cpp:302 msgid "Signing QSO Data" msgstr "Signierung QSO-Daten" #: tqsl.cpp:305 msgid "Converting " msgstr "Konvertieren " #: tqsl.cpp:305 msgid "to TQSL format" msgstr "ins TQSL-Format" #: tqsl.cpp:327 msgid "Uploading Signed Data" msgstr "Signierte Daten hochladen" #: tqsl.cpp:327 msgid "Uploading signed log data..." msgstr "Signierte Log-Daten werden hochgeladen ..." #: tqsl.cpp:421 msgid "QSO Date Range" msgstr "QSO-Datumsbereich" #: tqsl.cpp:424 msgid "" "You may set the starting and/or ending QSO dates in order to select QSOs " "from the input file." msgstr "" "Sie können die QSO Start- und/oder Enddaten eingeben, um QSOs aus der " "Eingabedatei auszuwählen." #: tqsl.cpp:426 msgid "" "QSOs prior to the starting date or after the ending date will not be signed " "or included in the output file." msgstr "" "QSOs vor dem Startdatum oder nach dem Enddatum werden nicht signiert und " "sind nicht in der Ausgabedatei enthalten." #: tqsl.cpp:428 msgid "You may leave either date (or both dates) blank." msgstr "Sie können ein Datumfeld (oder beide Felder) leer lassen." #: tqsl.cpp:436 msgid "Start Date (YYYY-MM-DD)" msgstr "Startdatum (JJJJ-MM-TT)" #: tqsl.cpp:443 msgid "End Date (YYYY-MM-DD)" msgstr "Enddatum (JJJJ-MM-TT)" #: tqsl.cpp:470 msgid "Start date is invalid" msgstr "Startdatum ist ungültig" #: tqsl.cpp:478 msgid "End date is invalid" msgstr "Enddatum ist ungültig" #: tqsl.cpp:518 msgid "Previously Signed QSOs Detected" msgstr "Bereits hochgeladene QSO gefunden" #: tqsl.cpp:524 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and no new QSOs." msgstr "" "Dieses Log enthält %d QSO(s), die bereits zum Hochladen auf LoTW signiert " "wurden und keine neuen QSOs." #: tqsl.cpp:526 msgid "Click 'Cancel' to abandon processing this log file (Recommended)." msgstr "" "Klicken Sie auf 'Abbrechen', um die Verarbeitung dieses Logs zu beenden " "(empfohlen)." #: tqsl.cpp:528 tqsl.cpp:538 tqsl.cpp:545 msgid "" "Click 'Re-Upload QSOs' to re-process this log while allowing previously " "signed QSOs." msgstr "" "Klicken Sie auf 'QSOs nochmals hochladen', um dieses Log erneut zu laden " "inkl. bereits hochgeladener QSOs." #: tqsl.cpp:532 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and %d QSOs which are new." msgstr "" "Dieses Log enthält %d QSO(s), die bereits für zum Hochladen auf LoTW " "signiert scheinen und %d neue QSOs." #: tqsl.cpp:534 tqsl.cpp:541 msgid "" "Click 'New QSOs Only' to sign normally, without the previously signed QSOs " "(Recommended)." msgstr "" "Klicken Sie auf 'nur neue QSOs', um ohne die bereits hochgeladenen QSOs " "(empfohlen) fortzufahren." #: tqsl.cpp:536 tqsl.cpp:543 msgid "Click 'Cancel' to abandon processing this log file." msgstr "" "Klicken Sie auf 'Abbrechen', um die Verarbeitung dieser Log-Datei zu beenden." #: tqsl.cpp:539 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and one QSO which is new." msgstr "" "Dieses Log enthält %d QSO(s), die bereits für zum Hochladen auf LoTW " "signiert scheinen und ein neues QSO." #: tqsl.cpp:556 msgid "" "The log file you are uploading using your QSO Logging system consists " "entirely of previously uploaded QSOs that create unnecessary work for LoTW. " "There may be a more recent version of your QSO Logging system that would " "prevent this. Please check with your QSO Logging system's vendor for an " "updated version." msgstr "" "Die Log-Datei, die Sie mit Hilfe Ihres Log-Programms hochladen wollen " "besteht ausschließlich aus bereits zuvor hochgeladenen QSOs (Dubletten), die " "eine unnötige Last für LoTW darstellen. Möglicherweise gibt es eine neuere " "Version Ihres Log-Programms, das dies vermeidet. Bitte überprüfen Sie beim " "Anbieter, ob eine aktualisierte Version vorliegt." #: tqsl.cpp:558 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is " "usually safe, but a defective logger not checking the status messages " "reported by TrustedQSL may produce strange (but harmless) behavior such as " "attempting to upload an empty file or marking all chosen QSOs as 'sent'" msgstr "" "In der Zwischenzeit beachten Sie bitte, dass einige Log-Programme sich ggf. " "anders als erwartet verhalten, wenn eine andere Option als 'Duplikate " "zulassen' angeklickt wird. Die Auswahl 'Abbrechen' ist in der Regel sicher, " "aber ein Log-Programm, das die Statusmeldungen von TrustedQSL nicht " "überprüft könnte seltsam (aber harmlos) reagieren. In dem es z. B. versucht " "eine leere Datei hochzuladen oder alle ausgewählten QSOs als 'gesendet' " "markiert." #: tqsl.cpp:561 msgid "" "The log file you are uploading using your QSO Logging system includes some " "previously uploaded QSOs that create unnecessary work for LoTW. There may be " "a more recent version of your QSO Logging system that would prevent this. " "Please check with your QSO Logging system's vendor for an updated version." msgstr "" "Die Log-Datei, die Sie mit Hilfe Ihres Log-Programms hochladen wollen " "enthält einige bereits zuvor hochgeladenen QSOs (Dubletten), die eine " "unnötige Last für LoTW darstellen. Möglicherweise gibt es eine neuere " "Version Ihres Log-Programms, das dies vermeidet. Bitte überprüfen Sie beim " "Anbieter, ob eine aktualisierte Version vorliegt." #: tqsl.cpp:563 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is " "recommended, but a logger that does its own upload tracking may incorrectly " "set the status in this case. A logger that doesn't track uploads should be " "unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, " "will correctly mark all selected QSOs as sent - they are in your account " "even though they would not be in this specific batch" msgstr "" "In der Zwischenzeit beachten Sie bitte, dass einige Log-Programme sich ggf. " "anders als erwartet verhalten, wenn eine andere Option als 'Duplikate " "zulassen' angeklickt wird. 'Nur neue QSOs' wird empfohlen. Manche Log-" "Programme mit eigener 'Hochgeladen-Markierung' könnten den Status der " "hochgeladenen QSOs aber ggf. falsch speichern" #: tqsl.cpp:565 msgid "" "Choosing 'Cancel' is usually safe, but a defective logger not checking the " "status messages reported by TrustedQSL may produce strange (but harmless) " "behavior such as attempting to upload an empty file or marking all chosen " "QSOs as 'sent'" msgstr "" "Die Auswahl 'Abbrechen' ist in der Regel sicher, aber ein Log-Programm, das " "die Statusmeldungen von TrustedQSL nicht überprüft könnte seltsam (aber " "harmlos) reagieren. In dem es z. B. versucht eine leere Datei hochzuladen " "oder alle ausgewählten QSOs als 'gesendet' markiert." #: tqsl.cpp:576 msgid "New QSOs Only" msgstr "Nur neue QSOs" #: tqsl.cpp:578 msgid "Re-Upload QSOs" msgstr "QSOs nochmals hochladen" #: tqsl.cpp:603 msgid "" "The only reason to re-sign previously signed QSOs is if a previous upload " "was not processed by LoTW, either because it was never uploaded, or there " "was a server failure" msgstr "" "Der einzige Grund, doppelte QSOs nochmals zu signieren ist, wenn eine " "vorherige Datei nicht von LoTW verarbeitet wurde; möglicherweise schlug das " "Hochladen fehl oder es gab einen Server-Ausfall" #: tqsl.cpp:605 msgid "Are you sure you want to proceed? Click 'No' to review the choices" msgstr "" "Sind Sie sicher, dass Sie fortfahren möchten? Klicken Sie auf 'Nein', um die " "Auswahl zu überprüfen" #: tqsl.cpp:606 msgid "Are you sure?" msgstr "Sind Sie sicher?" #: tqsl.cpp:629 msgid "Errors Detected" msgstr "Fehler gefunden" #: tqsl.cpp:636 msgid "Ignore" msgstr "Ignorieren" #: tqsl.cpp:678 msgid "" "Your custom mode map %s conflicts with the standard mode definition for %hs " "and was deleted." msgstr "" "Ihre benutzerdefinierte Mode-Tabelle %s kollidiert mit den Standard-Mode-" "Definitionen für %hs und wurde gelöscht." #: tqsl.cpp:955 msgid "Error renaming backup file %s: %hs" msgstr "Fehler bei der Umbenennung der Sicherungsdatei %s: %hs" #: tqsl.cpp:1091 tqsl.cpp:1110 msgid "Checking for TQSL updates..." msgstr "Überprüfe auf TQSL-Aktualisierungen..." #: tqsl.cpp:1157 msgid "Sign and &upload ADIF or Cabrillo File..." msgstr "Signieren und hochladen einer ADIF- oder Cabrillo-Datei…" #: tqsl.cpp:1158 msgid "&Sign and save ADIF or Cabrillo file..." msgstr "&Signieren und speichern einer ADIF- oder Cabrillo-Datei…" #: tqsl.cpp:1159 msgid "&Test Signing an ADIF or Cabrillo file..." msgstr "&Signieren und hochladen einer ADIF- oder Cabrillo-Datei…" #: tqsl.cpp:1161 msgid "&Backup Station Locations, Certificates, and Preferences..." msgstr "&Sichern von Standorten, Zertifikaten und Einstellungen..." #: tqsl.cpp:1162 msgid "&Restore Station Locations, Certificates, and Preferences..." msgstr "&Wiederherstellen von Standorten, Zertifikaten und Einstellungen..." #: tqsl.cpp:1164 msgid "Create &New ADIF file..." msgstr "Neue ADIF-Datei erstellen..." #: tqsl.cpp:1165 msgid "&Edit existing ADIF file..." msgstr "&Bearbeiten einer vorhandenden ADIF-Datei..." #: tqsl.cpp:1168 msgid "&Preferences..." msgstr "&Einstellungen..." #: tqsl.cpp:1170 msgid "Display or Modify &Preferences..." msgstr "Anzeigen oder Ändern der Einstellungen..." #: tqsl.cpp:1173 tqsl.cpp:7281 tqsl.cpp:7283 msgid "Language" msgstr "Sprache" #: tqsl.cpp:1175 msgid "Dia&gnostic Mode" msgstr "Dia&gnose-Modus" #: tqsl.cpp:1180 tqslupdater.cpp:111 msgid "E&xit TQSL\tAlt-X" msgstr "TQSL &Beenden\tAlt-X" #: tqsl.cpp:1185 msgid "&Display Station Location Properties" msgstr "&Anzeige der Standort-Eigenschaften" #: tqsl.cpp:1187 msgid "&Edit Station Location" msgstr "&Bearbeiten des Standortes" #: tqsl.cpp:1188 msgid "&Add Station Location" msgstr "&Hinzufügen eines Standortes" #: tqsl.cpp:1194 msgid "&Restore a Deleted Station Location" msgstr "&Wiederherstellen eines gelöschten Standortes" #: tqsl.cpp:1207 msgid "&Contents" msgstr "&Inhalt" #: tqsl.cpp:1209 msgid "Display &Documentation" msgstr "Anzeigen der &Anleitung" #: tqsl.cpp:1214 msgid "Check for &Updates..." msgstr "Auf &Aktualisierungen prüfen..." #: tqsl.cpp:1216 msgid "&About" msgstr "&Über" #: tqsl.cpp:1219 tqsl_prefs.cpp:104 msgid "&File" msgstr "&Datei" #: tqsl.cpp:1220 msgid "&Station Location" msgstr "Standort" #: tqsl.cpp:1221 msgid "Callsign &Certificate" msgstr "Rufzeichen &Zertifikat" #: tqsl.cpp:1222 msgid "&Help" msgstr "&Hilfe" #: tqsl.cpp:1237 tqsl.cpp:1322 msgid "Log Operations" msgstr "Log-Operationen" #: tqsl.cpp:1244 tqsl.cpp:1560 msgid "Status Log" msgstr "Statusprotokoll" #: tqsl.cpp:1270 msgid "Sign a log and upload it automatically to LoTW" msgstr "Log signieren und automatisch auf LoTW hochladen" #: tqsl.cpp:1285 msgid "Sign a log and save it for uploading later" msgstr "Log signieren und speichern, um es später hochzuladen" #: tqsl.cpp:1301 msgid "Create an ADIF file for signing and uploading" msgstr "Neue ADIF-Datei für die Signatur und das Hochladen erstellen" #: tqsl.cpp:1316 msgid "Log in to the Logbook of the World Site" msgstr "Melden Sie sich auf der LoTW Seite an" #: tqsl.cpp:1354 msgid "Select a Station Location to process " msgstr "Wählen Sie einen Standort zur Bearbeitung " #: tqsl.cpp:1387 msgid "Create a new Station Location" msgstr "Erstellen eines neuen Standortes" #: tqsl.cpp:1402 tqsl.cpp:7121 msgid "Edit a Station Location" msgstr "Bearbeiten eines Standortes" #: tqsl.cpp:1419 tqsl.cpp:7123 msgid "Delete a Station Location" msgstr "Löschen eines Standortes" #: tqsl.cpp:1436 tqsl.cpp:7125 msgid "Display Station Location Properties" msgstr "Standort-Eigenschaften anzeigen" #: tqsl.cpp:1464 tqsl.cpp:6867 msgid "Select a Callsign Certificate to process" msgstr "Wählen Sie ein Rufzeichen-Zertifikat zur Verarbeitung aus" #: tqsl.cpp:1492 msgid "Load a Callsign Certificate" msgstr "Rufzeichen-Zertifikat laden" #: tqsl.cpp:1509 tqsl.cpp:6859 msgid "Save a Callsign Certificate" msgstr "Speichern eines Rufzeichen-Zertifikats" #: tqsl.cpp:1526 tqsl.cpp:6652 tqsl.cpp:6861 tqsl.cpp:6928 msgid "Renew a Callsign Certificate" msgstr "Erneuern eines Rufzeichen-Zertifikats" #: tqsl.cpp:1543 msgid "Display a Callsign Certificate's Properties" msgstr "Eigenschaften eines Rufzeichen-Zertifikats anzeigen" #: tqsl.cpp:1577 tqsl.cpp:1714 tqsl.cpp:1744 msgid "Add Station Location" msgstr "Standort hinzufügen" #: tqsl.cpp:1663 msgid "About" msgstr "Über" #: tqsl.cpp:1676 msgid "Log File" msgstr "Logdatei" #: tqsl.cpp:1677 msgid "Log files (*.log)|*.log|All files (*.*)|*.*" msgstr "Log-Dateien (*.log)|*.log|Alle Dateien (*.*)|*.*" #: tqsl.cpp:1684 msgid "Error opening diagnostic log %s: %hs" msgstr "Fehler beim Öffnen des Diagnoseprotokolls %s: %hs" #: tqsl.cpp:1685 msgid "Log File Error" msgstr "Logdateifehler" #. TRANSLATORS: uncommon error - error in a station location, followed by the ignore message that follows. #: tqsl.cpp:1772 tqsl.cpp:3186 tqsl.cpp:7242 msgid "The invalid data was ignored." msgstr "Die ungültigen Daten wurden ignoriert." #: tqsl.cpp:1773 msgid "Location data error" msgstr "Standortdatenfehler" #: tqsl.cpp:1777 tqsl.cpp:1804 tqsl.cpp:3191 tqsl.cpp:7247 msgid "Edit Station Location : %hs - %s" msgstr "Standort bearbeiten: %hs - %s" #: tqsl.cpp:1813 tqsl.cpp:6127 msgid "Edit Station Location" msgstr "Standort bearbeiten" #: tqsl.cpp:1813 tqsl.cpp:7552 tqsl.cpp:7654 tqsl_prefs.cpp:101 msgid "Close" msgstr "Schließen" #: tqsl.cpp:1923 msgid "Open File" msgstr "Datei öffnen" #: tqsl.cpp:2078 msgid "Please choose a callsign for this Station Location" msgstr "Bitte wählen Sie ein Rufzeichen für diesen Standort" #: tqsl.cpp:2079 msgid "Select Callsign" msgstr "Wählen Sie ein Rufzeichen" #: tqsl.cpp:2111 msgid "There are no valid callsign certificates for callsign" msgstr "Es liegen keine gültigen Rufzeichen-Zertifikate für das Rufzeichen vor" #: tqsl.cpp:2113 msgid "in entity" msgstr "im Land" #: tqsl.cpp:2115 msgid "Signing aborted." msgstr "Signierung abgebrochen." #: tqsl.cpp:2126 msgid "Signing using Callsign %hs, DXCC Entity %hs" msgstr "Signierung mit Rufzeichen %hs, DXCC %hs" #: tqsl.cpp:2146 msgid "Another copy of TQSL is signing a log" msgstr "Eine andere TQSL-Instanz signiert gerade ein Log" #: tqsl.cpp:2147 msgid "" "TQSL must wait for other running copies of TQSL to exit before signing ..." msgstr "" "TQSL muss warten bis weitere laufende Instanzen beendet sind bevor der " "Signiervorgang beginnt ..." #: tqsl.cpp:2152 msgid "Aborting due to user cancelling" msgstr "Vom Benutzer abgebrochen" #: tqsl.cpp:2180 tqsl.cpp:2436 msgid "Cancelled" msgstr "Abgebrochen" #: tqsl.cpp:2234 tqsl.cpp:2244 #, c-format msgid "QSOs: %d" msgstr "QSOs: %d" #: tqsl.cpp:2236 #, c-format msgid "Previously Signed: %d" msgstr "Bereits signiert: %d" #: tqsl.cpp:2238 tqsl.cpp:2248 #, c-format msgid "Errors: %d" msgstr "Fehler: %d" #: tqsl.cpp:2246 #, c-format msgid "Previously signed: %d" msgstr "Bereits signiert: %d" #: tqsl.cpp:2255 msgid "" "This log has too many previously uploaded QSOs. Please only upload new QSOs " "or break the log into smaller pieces (50,000 QSOs or less)." msgstr "" "Dieses Log hat zu viele bereits hochgeladene QSOs. Bitte laden Sie nur neue " "QSOs hoch oder unterteilen Sie das Log in kleinere Teile (50.000 QSOs oder " "weniger)." #: tqsl.cpp:2327 tqsl.cpp:2411 #, c-format msgid "on line %d" msgstr "in Zeile %d" #: tqsl.cpp:2337 #, c-format msgid "" "Your QTH Details changed for this QSO.\n" "\n" "Originally these were: %s\n" "Now they are:%s\n" "\n" "Please verify that you intended to change this QSO!\n" msgstr "" "Ihre QTH-Details für dieses QSO wurden geändert.\n" "\n" "Diese waren ursprünglich: %s\n" "Jetzt sind sie: %s\n" "\n" "Bitte stellen Sie sicher, dass Sie dieses QSO ändern wollen!\n" #: tqsl.cpp:2359 msgid "Click 'Ignore' to continue signing this log while ignoring errors." msgstr "" "Klicken Sie auf 'Ignorieren', um mit der Signierung dieses Logs fortzufahren " "und die Fehler zu ignorieren." #: tqsl.cpp:2361 msgid "Click 'Cancel' to abandon signing this log." msgstr "" "Klicken Sie auf 'Abbrechen', um die Signierung dieses Logs abzubrechen." #: tqsl.cpp:2389 msgid "Signing cancelled" msgstr "Signierung abgebrochen" #: tqsl.cpp:2392 msgid "Duplicate QSO detected" msgstr "Doppelte QSOs erkannt" #: tqsl.cpp:2395 msgid "Signing aborted" msgstr "Signierung abgebrochen" #: tqsl.cpp:2414 msgid "Signing aborted due to errors" msgstr "Signieren wegen Fehlern abgebrochen" #: tqsl.cpp:2418 #, c-format msgid "%s: %d QSOs were outside the selected date range" msgstr "%s: %d QSOs sind ausserhalb des ausgewählten Zeitraums" #: tqsl.cpp:2455 msgid "All QSOs are previously signed; aborted" msgstr "Es wurden bereits alle QSOs signiert, Abbruch" #: tqsl.cpp:2462 #, c-format msgid "%d of %d QSOs are previously signed; aborted" msgstr "%d von %d QSOs wurden bereits zuvor signiert; abgebrochen" #: tqsl.cpp:2479 #, c-format msgid "%s: %d QSO records were previously signed" msgstr "%s: %d QSOs wurden bereits signiert" #: tqsl.cpp:2507 msgid "Invalid contact - QSO does not specify a Callsign" msgstr "Ungültiger Kontakt - kein Rufzeichen im QSO angegeben" #: tqsl.cpp:2508 msgid "Invalid contact - QSO does not specify a band or frequency" msgstr "Ungültiger Kontakt - kein Band oder keine Frequenz angegeben" #: tqsl.cpp:2509 msgid "Invalid contact - QSO does not specify a mode" msgstr "Ungültiger Kontakt - keinen Mode angegeben" #: tqsl.cpp:2510 msgid "Invalid contact - QSO does not specify a date" msgstr "Ungültiger Kontakt - kein Datum angegeben" #: tqsl.cpp:2511 msgid "Invalid contact - QSO does not specify a time" msgstr "Ungültiger Kontakt - keine Zeit angegeben" #: tqsl.cpp:2513 msgid "This callsign certificate is already active and cannot be restored." msgstr "" "Das Rufzeichen-Zertifikat ist bereits aktiv und kann nicht wiederhergestellt " "werden." #: tqsl.cpp:2548 #, c-format msgid "Unable to open %s for output" msgstr "Kann %s nicht zur Ausgabe öffnen" #: tqsl.cpp:2558 msgid "No records output" msgstr "Keine Daten ausgegeben" #: tqsl.cpp:2621 #, c-format msgid "%s: wrote %d records to %s" msgstr "%s: schrieb %d Datensätze in %s" #: tqsl.cpp:2624 #, c-format msgid "%s is ready to be emailed or uploaded." msgstr "%s ist bereit, zum Mailen oder hochgeladen zu werden." #: tqsl.cpp:2625 msgid "Note: TQSL assumes that this file will be uploaded to LoTW." msgstr "" "Hinweis: TQSL geht davon aus, dass diese Datei zum LoTW hochgeladen werden " "soll." #: tqsl.cpp:2626 msgid "" "Resubmitting these QSOs will cause them to be reported as already signed." msgstr "" "Wenn Sie diese QSOs erneut hochladen werden diese als bereits hochgeladen " "gemeldet." #: tqsl.cpp:2628 #, c-format msgid "" "To submit the signed log file to LoTW:\n" "1. Move the signed log file to a computer with internet access\n" "2. Log in to your LoTW Web Account\n" "3. Select the Upload File tab\n" "4. Click the Choose File button, and select the signed log file you created " "(%s)\n" "5. Click the Upload file button\n" "\n" "Alternatively, you can attach the signed log file to an email message, and " "send the message to lotw-logs@arrl.org" msgstr "" "So senden Sie die signierte Logdatei an LoTW:\n" "1. Kopieren Sie die signierte Logdatei auf einen Computer mit " "Internetzugang\n" "2. Melden Sie sich bei Ihrem LoTW-Webkonto an\n" "3. Wählen Sie die Registerkarte Datei hochladen\n" "4. Klicken Sie auf die Schaltfläche Datei auswählen und wählen Sie die " "signierte Logdatei aus (%s)\n" "5. Klicken Sie auf die Schaltfläche Datei hochladen\n" "\n" "Alternativ können Sie die signierte Logdatei an eine E-Mail anhängen und die " "Nachricht an lotw-logs@arrl.org senden" #: tqsl.cpp:2630 msgid "" "Note: TQSL has not recorded signing these QSOs. You can submit this log file " "to LoTW or discard it." msgstr "" "Hinweis: TQSL hat diese QSOs noch nicht signiert. Sie können dieses Log zu " "LoTW hochladen oder es verwerfen." #: tqsl.cpp:2735 msgid "Error compressing before upload" msgstr "Fehler beim Komprimieren vor dem Hochladen" #: tqsl.cpp:2842 msgid "Unable to open ca-bundle.crt. Your TQSL installation is incomplete" msgstr "" "Kann ca-bundle.crt nicht öffnen. Ihre TQSL-Installation ist unvollständig" #: tqsl.cpp:2907 msgid "Error: Could not upload file (CURL Init error)" msgstr "Fehler: Datei konnte nicht hochgeladen werden (CURL Init-Fehler)" #: tqsl.cpp:2942 msgid "Attempting to upload one QSO" msgstr "Versuche ein QSO hochzuladen" #: tqsl.cpp:2944 #, c-format msgid "Attempting to upload %d QSOs" msgstr "Versuche %d QSOs hochzuladen" #: tqsl.cpp:2947 #, c-format msgid "Attempting to upload %s" msgstr "Versuche %s hochzuladen" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate" msgstr "Hochladen des Rufzeichen-Zertifikats" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate Request..." msgstr "Hochladen der Rufzeichen-Zertifikatsanforderung..." #: tqsl.cpp:2963 msgid "Could not spawn upload thread!" msgstr "Hochladen konnte nicht gestartet werden!" #: tqsl.cpp:2997 #, c-format msgid "" "%s: Log uploaded successfully with result:\n" "\n" "%s" msgstr "" "%s: Log mit diesem Ergebnis erfolgreich hochgeladen:\n" "\n" "%s" #: tqsl.cpp:2999 tqsl.cpp:3020 msgid "After reading this message, you may close this program." msgstr "Nach dem Lesen dieser Meldung können Sie das Programm schließen." #: tqsl.cpp:3007 tqsl.cpp:3012 #, c-format msgid "" "%s uploaded with result:\n" "\n" "%s" msgstr "" "%s hochgeladen mit Ergebnis:\n" "\n" "%s" #: tqsl.cpp:3009 #, c-format msgid "" "%s Uploaded with result:\n" "\n" "%s" msgstr "" "%s Hochgeladen mit Ergebnis:\n" "\n" "%s" #: tqsl.cpp:3019 #, c-format msgid "%s: Log uploaded successfully" msgstr "%s: Log erfolgreich hochgeladen" #: tqsl.cpp:3022 #, c-format msgid "%s uploaded successfully" msgstr "%s erfolgreich hochgeladen" #: tqsl.cpp:3029 #, c-format msgid "%s: %s upload was rejected with result \"%s\"" msgstr "%s: %s Hochladen wurde abgelehnt wegen \"%s\"" #: tqsl.cpp:3033 #, c-format msgid "%s: %s upload was rejected" msgstr "%s: %s Hochladen wurde abgelehnt" #: tqsl.cpp:3039 #, c-format msgid "%s: Got an unexpected response on %s upload! Maybe the site is down?" msgstr "" "%s: Erhielt eine unerwartete Antwort auf %s Upload! Vielleicht ist die Seite " "nicht erreichbar?" #: tqsl.cpp:3051 #, c-format msgid "" "%s: Unable to upload - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "%s: Hochladen leider nicht möglich - entweder ist die Internetverbindung " "ausgefallen oder LoTW ist nicht erreichbar." #: tqsl.cpp:3052 tqsl.cpp:3056 tqsl.cpp:3060 #, c-format msgid "Please try uploading the %s later." msgstr "Bitte versuchen Sie %s später hochzuladen." #: tqsl.cpp:3055 #, c-format msgid "%s: Unable to upload. The network is down or the LoTW site is too busy." msgstr "" "%s: kann nicht hochladen. Das Netzwerk ist nicht verfügbar oder die LoTW " "Webseite ist zu beschäftigt." #: tqsl.cpp:3059 #, c-format msgid "%s: Unable to connect to the upload site." msgstr "%s: Kann nicht zur Upload-Webseite verbinden." #: tqsl.cpp:3063 #, c-format msgid "%s: Upload cancelled" msgstr "%s: Hochladen abgebrochen" #: tqsl.cpp:3068 msgid "%s: Couldn't upload the file: CURL returned \"%hs\" (%hs)" msgstr "" "%s: Die Datei konnte nicht hochgeladen werden: CURL meldet \"%hs\" (%hs)" #: tqsl.cpp:3081 msgid "Your upload appears to have failed. Should TQSL try again?" msgstr "" "Hochladen scheint fehlgeschlagen zu sein. Soll TQSL es noch einmal versuchen?" #: tqsl.cpp:3081 tqsl.cpp:6794 msgid "Retry?" msgstr "Wiederholen?" #: tqsl.cpp:3110 msgid "" "There are no callsign certificates for callsign %hs. This station location " "cannot be edited." msgstr "" "Es sind keine Rufzeichen-Zertifikate für Rufzeichen %hs vorhanden. Dieser " "Standort kann nicht bearbeitet werden." #: tqsl.cpp:3110 tqsl.cpp:3112 tqsl.cpp:3146 msgid "No Certificate" msgstr "Kein Zertifikat" #: tqsl.cpp:3112 tqsl.cpp:3132 msgid "" "There are no current callsign certificates for callsign %hs. This station " "location cannot be used to sign a log file." msgstr "" "Es sind keine aktuellen Rufzeichen-Zertifikate für Rufzeichen %hs vorhanden. " "Dieser Standort kann nicht verwendet werden, um ein Log zu signieren." #: tqsl.cpp:3134 msgid "" "There is a newer callsign certificate for callsign %hs. This station " "location cannot be used to sign a log file until the new certificate is " "installed." msgstr "" "Es gibt ein neueres Rufzeichen-Zertifikat für %hs. Dieser Standort kann " "nicht zum signieren verwendet werden bis dieses installiert wurde." #: tqsl.cpp:3136 msgid "" "The callsign certificate for callsign %hs has expired. This station location " "cannot be used to sign a log file until a valid callsign certificate is " "installed." msgstr "" "Das Rufzeichen-Zertifikat für %hs ist abgelaufen. Dieser Standort kann nicht " "zum signieren verwendet werden bis ein gültiges Rufzeichen-Zertifikat " "installiert wurde." #: tqsl.cpp:3187 tqsl.cpp:3207 tqsl.cpp:7243 msgid "Station Location data error" msgstr "Standort Datenfehler" #: tqsl.cpp:3206 msgid "This should be corrected before signing a log file." msgstr "Dies sollte vor der Signierung einer Log-Datei korrigiert werden." #: tqsl.cpp:3376 msgid "TQSL Update Available" msgstr "TQSL-Update verfügbar" #: tqsl.cpp:3388 #, c-format msgid "A new TQSL release (V%s) is available!" msgstr "Eine neue TQSL-Version (V%s) ist verfügbar!" #: tqsl.cpp:3390 #, c-format msgid "" "An updated TrustedQSL configuration file (V%s) is available!\n" "The configuration file installs definitions for entities, modes, etc." msgstr "" "Eine aktualisierte TrustedQSL-Konfigurationsdatei (V%s) ist verfügbar!\n" "Die Konfigurationsdatei installiert Definitionen für Länder, Betriebsarten " "usw." #: tqsl.cpp:3398 msgid "Download from:" msgstr "Herunterladen von:" #: tqsl.cpp:3407 msgid "More details at:" msgstr "Mehr Details unter:" #: tqsl.cpp:3415 msgid "Click 'OK' to install the new version of TQSL, or Cancel to ignore it." msgstr "" "Klicken Sie auf 'OK', um die neue Version von TQSL, oder brechen Sie ab, um " "es zu ignorieren." #: tqsl.cpp:3420 msgid "" "Click 'OK' to install the new configuration file, or Cancel to ignore it." msgstr "" "Klicken Sie auf 'OK', um die neue Konfigurationsdatei zu installieren, oder " "Abbrechen zum ignorieren." #: tqsl.cpp:3472 msgid "Can't open new configuration file %s: %hs" msgstr "Die neue Konfigurationsdatei %s: %hs kann nicht geöffnet werden" #: tqsl.cpp:3488 tqsl.cpp:3568 msgid "Error writing new configuration file %s: %hs" msgstr "Fehler beim Schreiben der neuen Konfigurationsdatei %s:%hs" #: tqsl.cpp:3496 msgid "Configuration file successfully updated" msgstr "Konfigurationsdatei erfolgreich aktualisiert" #: tqsl.cpp:3496 msgid "Update Completed" msgstr "Aktualisierung abgeschlossen" #: tqsl.cpp:3512 tqsl.cpp:3592 msgid "" "Unable to update - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "Aktualisieren fehlgeschlagen - entweder ist die Internetverbindung " "ausgefallen oder LoTW ist nicht erreichbar." #: tqsl.cpp:3513 tqsl.cpp:3516 tqsl.cpp:3519 tqsl.cpp:3593 tqsl.cpp:3596 #: tqsl.cpp:3599 tqsl.cpp:4113 tqsl.cpp:4119 tqsl.cpp:4125 tqsl.cpp:4148 #: tqsl.cpp:4154 tqsl.cpp:4160 msgid "Please try again later." msgstr "Bitte versuchen Sie es später noch einmal." #: tqsl.cpp:3515 tqsl.cpp:3595 msgid "Unable to update. The network is down or the LoTW site is too busy." msgstr "" "Keine Aktualisierung möglich. Entweder ist das Netzwerk nicht verfügbar oder " "die LoTW-Website ist zu beschäftigt." #: tqsl.cpp:3518 tqsl.cpp:3598 tqsl.cpp:4123 tqsl.cpp:4158 msgid "Unable to connect to the update site." msgstr "Keine Verbindung zur Update-Webseite möglich." #: tqsl.cpp:3521 msgid "Error downloading new configuration file:" msgstr "Fehler beim Herunterladen der neuen Konfigurationsdatei:" #: tqsl.cpp:3523 tqsl.cpp:3603 tqsl.cpp:3894 msgid "Update" msgstr "Aktualisierung" #: tqsl.cpp:3552 msgid "Can't open TQSL update file %s: %hs" msgstr "TQSL-Update-Datei kann nicht geöffnet werden %s: %hs" #: tqsl.cpp:3601 msgid "Error downloading new file:" msgstr "Fehler beim Herunterladen der Datei:" #: tqsl.cpp:3857 msgid "Error checking for expired callsign certificates:" msgstr "Fehler bei der Überprüfung auf abgelaufene Rufzeichen-Zertifikate:" #: tqsl.cpp:3858 msgid "Check Error" msgstr "Fehler bei der Überprüfung" #: tqsl.cpp:3861 msgid "The certificate for %hs expires in %d days." msgstr "Das Zertifikat für %hs läuft in %d Tagen ab." #: tqsl.cpp:3864 msgid "The certificate for %hs expires in %d days" msgstr "Das Zertifikat für %hs läuft in %d Tagen ab" #: tqsl.cpp:3866 msgid "Do you want to renew it now?" msgstr "Möchten Sie es jetzt erneuern?" #: tqsl.cpp:3868 msgid "Certificate Expiring" msgstr "Auslaufendes Zertifikat" #: tqsl.cpp:3912 #, c-format msgid "A new TQSL release (V%s) is available." msgstr "Eine steht neue TQSL-Version (V%s) zur Verfügung." #: tqsl.cpp:3929 #, c-format msgid "A new TrustedQSL configuration file (V%s) is available." msgstr "Es ist eine neue TrustedQSL-Konfigurationsdatei (V%s) verfügbar." #: tqsl.cpp:3942 msgid "Your system is up to date" msgstr "Ihr System ist auf dem neusten Stand" #: tqsl.cpp:3944 msgid "TQSL Version %hs and Configuration Data Version %s" msgstr "TQSL- %hs und Konfigurationsdaten-Version %s" #: tqsl.cpp:3946 msgid "are the newest available" msgstr "sind auf dem neusten Stand" #: tqsl.cpp:3947 msgid "No Updates" msgstr "Keine Updates" #: tqsl.cpp:4111 tqsl.cpp:4146 msgid "" "Unable to check for updates - either your Internet connection is down or " "LoTW is unreachable." msgstr "" "Kann nicht nach Updates suchen - entweder ist die Internetverbindung " "ausgefallen oder LoTW ist nicht erreichbar." #: tqsl.cpp:4117 tqsl.cpp:4152 msgid "" "Unable to check for updates. The network is down or the LoTW site is too " "busy." msgstr "" "Kann nicht nach Updates suchen. Das Netzwerk ist nicht verfügbar oder die " "LoTW Webseite ist zu beschäftigt." #: tqsl.cpp:4128 msgid "Error downloading new version information:" msgstr "Fehler beim Herunterladen von Informationen zur neuen Version:" #: tqsl.cpp:4163 msgid "Error downloading update version information:" msgstr "Fehler beim Herunterladen von Informationen zur aktuellen Version:" #: tqsl.cpp:4482 msgid "You have no callsign certificates to use to sign a log file." msgstr "Sie haben keine Rufzeichen-Zertifikate, um ein Log zu signieren." #: tqsl.cpp:4484 msgid "Please install a callsign certificate then try again." msgstr "" "Bitte installieren Sie ein Rufzeichen-Zertifikat und versuchen es dann " "erneut." #: tqsl.cpp:4485 msgid "No Callsign Certificates" msgstr "Keine Rufzeichen-Zertifikate" #: tqsl.cpp:4510 msgid "|ADIF files (" msgstr "|ADIF-Dateien (" #: tqsl.cpp:4522 msgid "|Cabrillo files (" msgstr "|Cabrillo-Dateien (" #: tqsl.cpp:4525 msgid "Select file to Sign" msgstr "Wählen Sie eine Datei zum Signieren" #: tqsl.cpp:4541 msgid "TQSL compressed data files (*.tq8)|*.tq8" msgstr "TQSL komprimierte Daten-Dateien (*.tq8)|*.tq8" #: tqsl.cpp:4542 msgid "TQSL data files (*.tq7)|*.tq7" msgstr "TQSL Datendateien (*.tq7)|*.tq7" #: tqsl.cpp:4544 msgid "Select file to write to" msgstr "Wählen Sie eine Datei zum Speichern" #: tqsl.cpp:4560 tqsl.cpp:6263 msgid "Select Station Location for Signing" msgstr "Standort für die Signierung auswählen" #: tqsl.cpp:4593 msgid "Signing abandoned" msgstr "Signierung abgebrochen" #: tqsl.cpp:4811 msgid "" "TQSL must wait for other running copies of TQSL to exit before backing up..." msgstr "" "TQSL muss auf andere laufende Kopien TQSL warten, um speichern zu können ..." #: tqsl.cpp:4828 tqsl.cpp:5384 msgid "Error opening save file %s: %hs" msgstr "Fehler beim Öffnen der Sicherungsdatei %s: %hs" #: tqsl.cpp:4844 msgid "Saving callsign certificates" msgstr "Speichern der Rufzeichen-Zertifikate" #: tqsl.cpp:4888 msgid "Saving callsign certificate for %hs" msgstr "Speichern des Rufzeichen-Zertifikats für %hs" #: tqsl.cpp:4921 msgid "Saving Station Locations" msgstr "Speichern der Standorte" #: tqsl.cpp:4937 msgid "Saving TQSL Preferences" msgstr "Speichern der TQSL-Einstellungen" #: tqsl.cpp:4951 msgid "Saving QSOs" msgstr "Speichern der QSOs" #: tqsl.cpp:4997 msgid "Save operation complete." msgstr "Speichern abgeschlossen." #: tqsl.cpp:5006 msgid "Error performing automatic backup: %hs" msgstr "Fehler bei der Durchführung des automatischen Backup: %hs" #: tqsl.cpp:5007 msgid "Backup Error" msgstr "Backup-Fehler" #: tqsl.cpp:5009 tqsl.cpp:5028 msgid "Backup operation failed: %hs" msgstr "Backup-Vorgang ist fehlgeschlagen: %hs" #: tqsl.cpp:5019 msgid "Enter file to save to" msgstr "Geben Sie die Datei zum Speichern an" #: tqsl.cpp:5020 msgid "Configuration files (*.tbk)|*.tbk|All files (*.*)|*.*" msgstr "Konfigurationsdateien (*.tbk)|*.tbk|Alle Dateien (*.*)|*.*" #: tqsl.cpp:5065 msgid "Restoring callsign certificate for %hs" msgstr "Wiederherstellen des Rufzeichen-Zertifikats für %hs" #: tqsl.cpp:5111 msgid "Restoring Preferences" msgstr "Wiederherstellung der Einstellungen" #: tqsl.cpp:5173 msgid "Restoring Station Locations" msgstr "Wiederherstellung der Standorte" #: tqsl.cpp:5194 msgid "Restoring QSO records" msgstr "Wiederherstellung der QSO-Daten" #: tqsl.cpp:5252 msgid "Error importing station locations: %hs" msgstr "Fehler beim Importieren der Standorte: %hs" #: tqsl.cpp:5316 msgid "Restoring Callsign Certificates" msgstr "Wiederherstellung der Rufzeichen-Zertifikate" #: tqsl.cpp:5323 tqsl.cpp:5331 tqsl.cpp:5336 msgid "Error parsing saved configuration file: %hs" msgstr "Fehler bei der Analyse der gespeicherten Konfigurationsdatei: %hs" #: tqsl.cpp:5340 msgid "Restore Complete." msgstr "Wiederherstellung abgeschlossen." #: tqsl.cpp:5354 msgid "Error parsing station location file: %hs" msgstr "Fehler bei der Analyse der Standort-Datei: %hs" #: tqsl.cpp:5366 msgid "Select saved configuration file" msgstr "Wählen Sie eine gespeicherte Konfigurationsdatei" #: tqsl.cpp:5367 msgid "Saved configuration files (*.tbk)|*.tbk" msgstr "Gespeicherte Konfigurationsdateien (*.tbk)|*.tbk" #: tqsl.cpp:5397 msgid "Restore operation failed: %hs" msgstr "Wiederherstellungsvorgang fehlgeschlagen: %hs" #: tqsl.cpp:5687 msgid "Exit TQSL so I can re-run as a normal user" msgstr "TQSL verlassen zum Neustart als normaler Benutzer" #: tqsl.cpp:5688 msgid "Allow TQSL to continue this time." msgstr "TQSL jetzt die Fortsetzung erlauben." #: tqsl.cpp:5689 msgid "Always allow running as Administrator." msgstr "Immer als Administrator ausführen." #: tqsl.cpp:5690 msgid "TQSL must not be run 'As Administrator'" msgstr "TQSL darf nicht 'als Administrator' ausgeführt werden" #: tqsl.cpp:5690 msgid "Administrator Error" msgstr "Administrator-Fehler" #: tqsl.cpp:5833 msgid "Specify dialog action - abort, all, compliant or ask" msgstr "Wählen Sie - Abbruch, alle, richtig oder fragen" #: tqsl.cpp:5834 msgid "Specify start date for QSOs to sign" msgstr "Geben Sie das Startdatum für die zu signierenden QSOs an" #: tqsl.cpp:5835 msgid "Specify default callsign for log signing" msgstr "Geben Sie das Standard-Rufzeichen für die Log-Signierung an" #: tqsl.cpp:5836 msgid "Suppress date range dialog" msgstr "Auswahl des Zeitraums unterdrücken" #: tqsl.cpp:5837 msgid "Specify end date for QSOs to sign" msgstr "Geben Sie das Enddatum für die zu signierenden QSOs an" #: tqsl.cpp:5838 msgid "Specify QSO verification action - ignore, report or update" msgstr "QSO-Überprüfungsaktion angeben - ignorieren, melden oder aktualisieren" #: tqsl.cpp:5840 msgid "Display command line help" msgstr "Befehlszeilen-Hilfe anzeigen" #: tqsl.cpp:5841 msgid "Import a certificate file (.p12 or .tq6)" msgstr "Importieren einer Zertifikats-Datei (.p12 oder .tq6)" #: tqsl.cpp:5843 msgid "Selects Station Location" msgstr "Wählt Standort" #: tqsl.cpp:5845 msgid "Check for updates to tqsl and the configuration file" msgstr "Nach Updates für tqsl und die Konfigurationsdatei suchen" #: tqsl.cpp:5846 msgid "Output file name (defaults to input name minus extension plus .tq8" msgstr "" "Name der Ausgabedatei (Standard: Eingabedateiname minus Erweiterung und .tq8)" #: tqsl.cpp:5847 msgid "Passphrase for the signing key" msgstr "Passwort für die Signierung" #: tqsl.cpp:5848 msgid "Quiet Mode - same behavior as -x" msgstr "Leise-Modus - gleiches Verhalten wie -x" #: tqsl.cpp:5851 msgid "Edit (if used with -l) or create Station Location" msgstr "Bearbeiten (wenn mit -l verwendet) oder Standort anlegen" #: tqsl.cpp:5852 msgid "File name for diagnostic tracking log" msgstr "Dateiname für das Diagnoseprotokoll" #: tqsl.cpp:5853 msgid "Upload after signing instead of saving" msgstr "Nach Signierung hochladen statt zu speichern" #: tqsl.cpp:5854 msgid "Display the version information and exit" msgstr "Versionsinformation anzeigen und beenden" #: tqsl.cpp:5855 msgid "Wipe the TQSL uploads database" msgstr "TQSL-Upload-Datenbank löschen" #: tqsl.cpp:5856 msgid "Exit after processing log (otherwise start normally)" msgstr "Nach Verarbeitung des Logs verlassen (sonst normal starten)" #: tqsl.cpp:5859 msgid "Input ADIF or Cabrillo log file to sign" msgstr "ADIF- oder Cabrillo-Log-Datei zum Signieren laden" #: tqsl.cpp:6049 tqsl.cpp:6052 #, c-format msgid "Start date of %s is invalid" msgstr "Startdatum von %s ist ungültig" #: tqsl.cpp:6063 tqsl.cpp:6066 #, c-format msgid "End date of %s is invalid" msgstr "Enddatum von %s ist ungültig" #: tqsl.cpp:6088 msgid "The -a parameter %hs is not recognized" msgstr "Der Parameter -a %hs wird nicht erkannt" #. TRANSLATORS: -f is the command line switch for log QTH handling #: tqsl.cpp:6109 msgid "The -f parameter %hs is not recognized" msgstr "Der Parameter -f %hs wird nicht erkannt" #: tqsl.cpp:6190 tqsl.cpp:6196 msgid "" "To import this passphrase protected P12 file, you must pass the passphrase " "on the command line" msgstr "" "Zum Import dieser geschützten Datei muss das Passwort in der Kommandozeile " "eingetragen sein" #: tqsl.cpp:6218 msgid "No logfile to sign!" msgstr "Keine Logdatei zum Signieren!" #: tqsl.cpp:6234 msgid "" "Warning: The TQSL ADIF editor only processes a limited number of ADIF " "fields.\n" "\n" "Using the editor on an ADIF file can cause QSO details to be lost!" msgstr "" "Achtung: Der TQSL ADIF-Editor verarbeitet nur eine begrenzte Anzahl von ADIF-" "Feldern\n" "\n" "Durch die Benutzung können QSO-Details verloren gehen!" #: tqsl.cpp:6346 msgid "Please review the introductory documentation before using this program." msgstr "" "Bitte lesen Sie die Einführungsdokumentation bevor Sie dieses Programm " "benutzen." #: tqsl.cpp:6347 msgid "Notice" msgstr "Hinweis" #: tqsl.cpp:6352 msgid "" "You have no callsign certificate installed on this computer with which to " "sign log submissions." msgstr "" "Auf diesem Computer ist kein Rufzeichen-Zertifikat installiert, mit dem Logs " "signiert werden könnten." #: tqsl.cpp:6354 msgid "Would you like to request a callsign certificate now?" msgstr "Möchten Sie jetzt ein Rufzeichen-Zertifikat anfordern?" #: tqsl.cpp:6356 msgid "If you are planning to restore from a backup, please choose 'No'." msgstr "" "Wenn Sie aus einem Backup wiederherstellen möchten, wählen Sie bitte 'Nein'." #: tqsl.cpp:6357 msgid "Alert" msgstr "Warnung" #: tqsl.cpp:6479 msgid "Display Callsign Certificate &Properties" msgstr "Rufzeichen-Zertifikat anzeigen" #: tqsl.cpp:6481 msgid "&Load Callsign Certificate from File" msgstr "Rufzeichen-Zertifikat aus Datei laden" #: tqsl.cpp:6482 msgid "&Save Callsign Certificate to File..." msgstr "Rufzeichen-Zertifikat in eine Datei schreiben ..." #: tqsl.cpp:6486 msgid "Request &New Callsign Certificate..." msgstr "Neues Rufzeichen-Zertifikat anfordern ..." #: tqsl.cpp:6487 msgid "&Renew Callsign Certificate" msgstr "Rufzeichen-Zertifikat erneuern" #: tqsl.cpp:6492 msgid "&Delete Callsign Certificate" msgstr "Rufzeichen-Zertifikat löschen" #: tqsl.cpp:6498 msgid "Restore Deleted Callsign Certificate" msgstr "Wiederherstellen eines gelöschten Rufzeichen-Zertifikats" #: tqsl.cpp:6511 msgid "&Edit" msgstr "Bearbeiten" #: tqsl.cpp:6513 msgid "&Delete" msgstr "Löschen" #: tqsl.cpp:6560 msgid "Load Certificate File" msgstr "Lade Zertifikatsdatei" #: tqsl.cpp:6652 crqwiz.h:63 msgid "Request a new Callsign Certificate" msgstr "Neues Rufzeichen-Zertifikat anfordern" #: tqsl.cpp:6732 msgid "Do you want to upload this certificate request to LoTW now?" msgstr "Möchten Sie diese Zertifikats-Anforderung jetzt zum LoTW hochladen?" #: tqsl.cpp:6735 msgid "You do not need an account on LoTW to do this." msgstr "Zur Durchführung benötigen Sie kein Konto auf LoTW." #: tqsl.cpp:6737 msgid "Upload" msgstr "Hochladen" #: tqsl.cpp:6747 tqsl.cpp:6796 msgid "tQSL Cert Request files (*." msgstr "tQSL Cert Antrags-Dateien (*." #: tqsl.cpp:6749 tqsl.cpp:6798 msgid "|All files (" msgstr "|Alle Dateien (" #: tqsl.cpp:6750 tqsl.cpp:6799 msgid "Save request" msgstr "Anfrage speichern" #: tqsl.cpp:6753 tqsl.cpp:6802 msgid "Request cancelled" msgstr "Anfrage abgebrochen" #: tqsl.cpp:6766 msgid "Error creating callsign certificate request: %hs" msgstr "Fehler beim Erstellen der Rufzeichen-Zertifikatsanforderung: %hs" #: tqsl.cpp:6766 msgid "Error creating Callsign Certificate Request" msgstr "Fehler beim Erstellen der Rufzeichen-Zertifikatsanforderung" #: tqsl.cpp:6779 msgid "Error opening certificate request file %s: %hs" msgstr "Fehler beim Öffnen der Zertifikatanforderungsdatei %s: %hs" #: tqsl.cpp:6789 tqsl.cpp:7376 tqsl.cpp:7520 msgid "Certificate Request" msgstr "Zertifikatsanforderung" #: tqsl.cpp:6793 msgid "Your certificate request did not upload properly." msgstr "Ihre Zertifikatsanforderung wurde nicht richtig hochgeladen." #: tqsl.cpp:6794 msgid "" "Your upload appears to have failed.\n" "Do you want to save this request for uploading later?" msgstr "" "Ihr Upload scheint fehlgeschlagen zu sein.\n" "Möchten Sie diese Anfrage speichern, um sie später hochzuladen?" #: tqsl.cpp:6812 msgid "You may now send your new certificate request (" msgstr "Jetzt können Sie Ihre neue Zertifikatsanforderung abschicken (" #: tqsl.cpp:6817 msgid "to:" msgstr "an:" #: tqsl.cpp:6824 msgid "or " msgstr "oder " #: tqsl.cpp:6825 msgid "see:" msgstr "siehe:" #: tqsl.cpp:6863 msgid "Display a Callsign Certificate" msgstr "Ein Rufzeichen-Zertifikat anzeigen" #: tqsl.cpp:6911 tqsl.cpp:6913 msgid "Save the Callsign Certificate for" msgstr "Speichern Sie das Rufzeichen-Zertifikat für" #: tqsl.cpp:6916 tqsl.cpp:6918 msgid "Display the Callsign Certificate properties for" msgstr "Anzeige der Rufzeichen-Zertifikateigenschaften für" #: tqsl.cpp:6922 tqsl.cpp:6924 msgid "Renew the Callsign Certificate for" msgstr "Erneuern Sie das Rufzeichen-Zertifikat für" #: tqsl.cpp:6969 msgid "Enter the name for the new Certificate Container file" msgstr "Geben Sie den Namen für die neue Zertifikats-Container-Datei ein" #: tqsl.cpp:6970 msgid "Certificate Container files (*.p12)|*.p12|All files (*.*)|*.*" msgstr "Zertifikats-Container-Dateien (*.p12)|*.p12|Alle Dateien (*.*)|*.*" #: tqsl.cpp:6977 msgid "Enter the passphrase for the certificate container file." msgstr "Passwort für die Zertifikats-Container-Datei eingeben." #: tqsl.cpp:6979 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using " "a computer in a private residence, no passphrase need be specified." msgstr "" "Wenn dieser Computer von weiteren Personen verwendet wird sollten Sie ein " "Passwort benutzen; ansonsten kann darauf verzichtet werden." #: tqsl.cpp:6981 msgid "" "You will have to enter the passphrase any time you load the file into " "TrustedQSL." msgstr "" "Sie müssen das Passwort jedes Mal eingeben wenn Sie die Datei in TrustedQSL " "hochladen." #: tqsl.cpp:6985 msgid "Certificate Container Passphrase" msgstr "Zertifikats-Container-Passwort" #: tqsl.cpp:7026 msgid "Export to %s failed: %hs" msgstr "Exportieren nach %s fehlgeschlagen: %hs" #: tqsl.cpp:7028 #, c-format msgid "Certificate saved in file %s" msgstr "Zertifikat in der Datei %s gespeichert" #: tqsl.cpp:7039 msgid "This will remove the selected callsign certificate from your system." msgstr "" "Hierdurch wird das ausgewählte Rufzeichen-Zertifikat von Ihrem System " "entfernt." #: tqsl.cpp:7041 msgid "You will NOT be able to recover it by loading a .TQ6 file." msgstr "Sie können es durch das Laden einer .TQ6 Datei NICHT wiederherstellen." #: tqsl.cpp:7043 msgid "You WILL be able to recover it from a container (.p12) file," msgstr "Es KANN aus einem Container (.p12) Datei wiederhergestellt werden," #: tqsl.cpp:7045 msgid "if you have created one via the Callsign Certificate menu's" msgstr "wenn Sie diesen über das Rufzeichen-Zertifikats-Menü erstellt haben" #: tqsl.cpp:7047 msgid "'Save Callsign Certificate' command." msgstr "Befehl \"Rufzeichen-Zertifikate speichern\"." #: tqsl.cpp:7049 msgid "Are you sure you want to delete the certificate?" msgstr "Sind Sie sicher, dass Sie das Zertifikat löschen wollen?" #: tqsl.cpp:7087 msgid "There are no deleted Callsign Certificates to restore" msgstr "Es sind keine Rufzeichen-Zertifikate zur Wiederherstellung vorhanden" #: tqsl.cpp:7087 tqsl.cpp:7197 msgid "Undelete Error" msgstr "Wiederherstellungs-Fehler" #: tqsl.cpp:7098 msgid "Choose a Callsign Certificate to restore" msgstr "Wählen Sie ein Rufzeichen-Zertifikat zum Wiederherstellen" #: tqsl.cpp:7127 msgid "Select a Station Location to process" msgstr "Standort zur Bearbeitung auswählen" #: tqsl.cpp:7147 msgid "Edit Station Location " msgstr "Standort bearbeiten " #: tqsl.cpp:7150 msgid "Delete Station Location " msgstr "Standort löschen " #: tqsl.cpp:7153 msgid "Display Station Location Properties for " msgstr "Standort-Eigenschaften anzeigen für " #: tqsl.cpp:7175 msgid "This will remove this station location from your system." msgstr "Dieser Standort wird dauerhaft von Ihrem System entfernt." #: tqsl.cpp:7177 msgid "Are you sure you want to delete this station location?" msgstr "Sind Sie sicher, dass Sie diesen Standort löschen wollen?" #: tqsl.cpp:7197 msgid "There are no deleted Station Locations to restore" msgstr "Keine gelöschten Standorte zum Wiederherstellen vorhanden" #: tqsl.cpp:7208 msgid "Choose a Station Location to restore" msgstr "Standort zum Wiederherstellen auswählen" #: tqsl.cpp:7280 tqsl.cpp:7283 msgid "Please choose language:" msgstr "Bitte wählen Sie die Sprache aus:" #: tqsl.cpp:7351 msgid "Certificate Properties" msgstr "Zertifikatseigenschaften" #: tqsl.cpp:7354 msgid "Begins: " msgstr "Gültig ab: " #: tqsl.cpp:7355 msgid "Expires: " msgstr "Gültig bis: " #: tqsl.cpp:7356 msgid "Organization: " msgstr "Organisation: " #: tqsl.cpp:7358 msgid "Serial: " msgstr "Seriennummer: " #: tqsl.cpp:7359 msgid "Operator: " msgstr "Inhaber: " #: tqsl.cpp:7360 tqsl.cpp:7579 msgid "Call sign: " msgstr "Rufzeichen: " #: tqsl.cpp:7361 tqsl.cpp:7580 msgid "DXCC Entity: " msgstr "DXCC-Land: " #: tqsl.cpp:7362 msgid "QSO Start Date: " msgstr "QSO-Startdatum: " #: tqsl.cpp:7363 msgid "QSO End Date: " msgstr "QSO-Enddatum: " #: tqsl.cpp:7364 msgid "Passphrase: " msgstr "Passwort: " #: tqsl.cpp:7485 msgid "Missing from this computer" msgstr "Fehlt auf diesem Computer" #: tqsl.cpp:7489 tqsl.cpp:7514 msgid "Passphrase protected" msgstr "Passwortgeschützt" #: tqsl.cpp:7493 msgid "Private Key not found" msgstr "Privaten Schlüssel nicht gefunden" #: tqsl.cpp:7497 msgid "Unable to read - no permission" msgstr "Lesefehler - keine Berechtigung" #: tqsl.cpp:7505 msgid "" msgstr "" #: tqsl.cpp:7508 msgid "No Private Key" msgstr "Kein privater Schlüssel" #: tqsl.cpp:7511 msgid "None" msgstr "Keines" #: tqsl.cpp:7522 msgid "Awaiting response from ARRL" msgstr "Warten auf Antwort der ARRL" #: tqsl.cpp:7536 msgid "Replaced" msgstr "Ersetzt" #: tqsl.cpp:7541 msgid "Expired" msgstr "Abgelaufen" #: tqsl.cpp:7576 msgid "Station Location Properties" msgstr "Standort-Eigenschaften" #: tqsl.cpp:7581 msgid "Grid Square: " msgstr "Lokator: " #: tqsl.cpp:7582 msgid "ITU Zone: " msgstr "ITU Zone: " #: tqsl.cpp:7583 msgid "CQ Zone: " msgstr "CQ Zone: " #: tqsl.cpp:7584 msgid "IOTA Locator: " msgstr "IOTA-Lokator: " #: tqsl.cpp:7585 tqsl.cpp:7592 msgid "State: " msgstr "Staat: " #: tqsl.cpp:7586 msgid "County: " msgstr "County: " #: tqsl.cpp:7587 tqsl.cpp:7589 tqsl.cpp:7593 msgid "Park: " msgstr "Park: " #: tqsl.cpp:7588 tqsl.cpp:7591 msgid "Province: " msgstr "Provinz: " #: tqsl.cpp:7590 msgid "Oblast: " msgstr "Oblast: " #: tqsl.cpp:7596 msgid "Verify QTH details: " msgstr "QTH-Details prüfen: " #: tqsl.cpp:7657 msgid "Signing File: " msgstr "Signiere Datei: " #: tqsl.cpp:7663 msgid "" "Please verify that this is the correct Station Location for the QSOs being " "signed." msgstr "" "Bitte prüfen Sie, ob dies der richtige Standort ist für den die QSOs " "signiert werden sollen." #: tqsl.cpp:7666 msgid "Click 'Cancel' if this is not the correct Station Location." msgstr "Klicken Sie 'abbrechen' wenn dies nicht der richtige Standort ist." #: tqsl.cpp:7694 msgid "Enter the Passphrase to unlock the callsign certificate" msgstr "Passwort zum Entsperren des Rufzeichen-Zertifikats eingeben" #: tqsl_prefs.cpp:56 msgid "Preferences" msgstr "Einstellungen" #: tqsl_prefs.cpp:78 msgid "Options" msgstr "Optionen" #: tqsl_prefs.cpp:82 msgid "Log Handling" msgstr "Log-Behandlung" #: tqsl_prefs.cpp:85 msgid "ADIF Modes" msgstr "ADIF-Modes" #: tqsl_prefs.cpp:88 msgid "Cabrillo Specs" msgstr "Cabrillo-Spezifikationen" #: tqsl_prefs.cpp:91 msgid "Network Proxy" msgstr "Netzwerk-Proxy" #: tqsl_prefs.cpp:172 msgid "Custom ADIF mode mappings:" msgstr "Benutzerdefinierte ADIF-Mode-Zuordnungen:" #: tqsl_prefs.cpp:181 tqsl_prefs.cpp:834 msgid "Add..." msgstr "Hinzufügen..." #: tqsl_prefs.cpp:261 msgid "Add ADIF mode" msgstr "ADIF-Mode hinzufügen" #: tqsl_prefs.cpp:270 msgid "Add ADIF mode mapping:" msgstr "ADIF-Mode-Zuordnung hinzufügen:" #: tqsl_prefs.cpp:274 msgid "ADIF Mode:" msgstr "ADIF-Mode:" #: tqsl_prefs.cpp:282 msgid "Resulting TQSL mode:" msgstr "Resultierender TQSL-Mode:" #: tqsl_prefs.cpp:328 #, c-format msgid "This mode definition conflicts with a standard mode definition for %s" msgstr "" "Dieser Mode stimmt nicht überein mit den Standardmode-Definitionen für %s" #: tqsl_prefs.cpp:329 msgid "Mode Conflict" msgstr "Mode-Konflikt" #: tqsl_prefs.cpp:353 msgid "Allow automatic configuration backup" msgstr "Automatische Konfigurationssicherung erlauben" #: tqsl_prefs.cpp:357 msgid "Backup File Folder:" msgstr "Ordner der Backupdateien:" #: tqsl_prefs.cpp:363 msgid "Select a Folder" msgstr "Wählen Sie einen Ordner" #: tqsl_prefs.cpp:370 msgid "Number of Backups to retain:" msgstr "Anzahl der zu speichernden Backups:" #: tqsl_prefs.cpp:381 msgid "Open ADIF files in ADIF editor" msgstr "ADIF-Dateien im ADIF-Editor öffnen" #: tqsl_prefs.cpp:388 msgid "Display status messages in separate tab" msgstr "Statusmeldungen in separater Registerkarte anzeigen" #: tqsl_prefs.cpp:393 msgid "Enable passphrases for Callsign Certificates" msgstr "Passwort für Rufzeichen-Zertifikate eingeben" #: tqsl_prefs.cpp:399 msgid "Export P12 files compatible with Apple Keychain" msgstr "" "P12-Dateien exportieren, die mit dem Apple-Verschlüsselung kompatibel sind" #: tqsl_prefs.cpp:448 msgid "" "Changes to the status message configuration will take affect when TQSL is " "restarted" msgstr "" "Änderungen an der Konfiguration der Status-Nachrichten werden wirksam, wenn " "TQSL neu gestartet wird" #: tqsl_prefs.cpp:475 msgid "Cabrillo file extensions:" msgstr "Cabrillo-Dateiendungen:" #: tqsl_prefs.cpp:480 msgid "ADIF file extensions:" msgstr "ADIF-Dateiendungen:" #: tqsl_prefs.cpp:486 msgid "Allow nonamateur call signs" msgstr "Nicht-Amateur-Rufzeichen erlauben" #: tqsl_prefs.cpp:491 msgid "Prompt for QSO Date range when signing" msgstr "Aufforderung zur Eingabe des QSO-Zeitraums für die Signierung" #: tqsl_prefs.cpp:496 msgid "Display details of previously signed QSOs when signing a log" msgstr "Zeige Details zuvor signierter QSOs an während ein Log signiert wird" #: tqsl_prefs.cpp:501 msgid "Ignore seconds in QSO times" msgstr "Sekunden in QSO-Zeiten ignorieren" #: tqsl_prefs.cpp:506 msgid "Ignore callsigns in ADIF files" msgstr "Rufzeichen in ADIF-Dateien ignorieren" #: tqsl_prefs.cpp:517 msgid "Ignore QTH details from your log" msgstr "QTH-Details aus eigenem Log ignorieren" #: tqsl_prefs.cpp:517 msgid "Report on QTH differences" msgstr "QTH-Unterschiede melden" #: tqsl_prefs.cpp:517 msgid "Override Station Location with QTH details from your log" msgstr "Überschreiben Sie den Standort mit QTH-Details aus Ihrem Log" #: tqsl_prefs.cpp:519 msgid "Handle QTH information in ADIF logs with what action?" msgstr "QTH-Informationen in ADIF-Logs mit welcher Aktion behandeln?" #: tqsl_prefs.cpp:706 msgid "" "Use these settings to configure a network proxy for Internet uploads and " "downloads. You should only enable a proxy if directed by your network " "administrator." msgstr "" "Verwenden Sie diese Einstellungen, um einen Netzwerk-Proxy für Internet-" "Uploads und Downloads zu konfigurieren. Sie sollten dies nur aktivieren, " "wenn Sie vom Netzwerkadministrator dazu aufgefordert werden." #: tqsl_prefs.cpp:708 msgid "" "Incorrect settings can cause TQSL to be unable to upload logs or check for " "updates." msgstr "" "Falsche Einstellungen können dazu führen, dass TQSL keine Protokolle " "hochladen oder nach Updates suchen kann." #: tqsl_prefs.cpp:714 msgid "Enable a Network Proxy" msgstr "Aktivieren Sie einen Netzwerk-Proxy" #: tqsl_prefs.cpp:718 msgid "Proxy Address:" msgstr "Proxy-Adresse:" #: tqsl_prefs.cpp:726 msgid "Port Number:" msgstr "Portnummer:" #: tqsl_prefs.cpp:733 msgid "Proxy Type:" msgstr "Proxy-Typ:" #: tqsl_prefs.cpp:736 msgid "ProxyType" msgstr "Proxy-Typ" #: tqsl_prefs.cpp:797 msgid "Cabrillo CONTEST definitions:" msgstr "Cabrillo-CONTEST-Definitionen:" #: tqsl_prefs.cpp:809 tqsl_prefs.cpp:820 msgid "CONTEST" msgstr "CONTEST" #: tqsl_prefs.cpp:810 tqsl_prefs.cpp:821 msgid "Type" msgstr "Typ" #: tqsl_prefs.cpp:811 tqsl_prefs.cpp:822 msgid "Field" msgstr "Feld" #: tqsl_prefs.cpp:966 tqsl_prefs.h:272 msgid "Edit" msgstr "Bearbeiten" #: tqsl_prefs.cpp:989 msgid "Contest" msgstr "Contest" #: tqsl_prefs.cpp:999 msgid "Cabrillo CONTEST" msgstr "Cabrillo-CONTEST" #: tqsl_prefs.cpp:1001 msgid "CONTEST Name:" msgstr "CONTEST-Name:" #: tqsl_prefs.cpp:1007 msgid "Contest type" msgstr "Contest-Typ" #: tqsl_prefs.cpp:1012 msgid "Call-Worked Field Number:" msgstr "Gearbeitetes Rufzeichen Feldnummer:" #: tqsl_prefs.cpp:1046 msgid "Contest name cannot be blank" msgstr "Contest-Name darf nicht leer sein" #: tqsl_prefs.cpp:1052 #, c-format msgid "Call-worked field must be %d or greater" msgstr "Gearbeitetes Rufzeichen-Feld muss %d oder mehr betragen" #. TRANSLATORS: Invalid date component, such as "Invalid Month: 15" #: tqslvalidator.cpp:76 msgid "Invalid %hs: \"%hs\"" msgstr "Ungültige %hs: \"%hs\"" #: tqslwiz.cpp:168 tqslwiz.cpp:1286 #, c-format msgid "" "You have changed the following fields in this Station Location: %s\n" "Do you want to discard those changes?" msgstr "" "Sie haben die folgenden Felder für diesen Standort geändert: %s\n" "Möchten Sie diese Änderungen verwerfen?" #: tqslwiz.cpp:169 tqslwiz.cpp:1287 msgid "Changes have not been saved" msgstr "Änderungen nicht gespeichert" #: tqslwiz.cpp:334 tqslwiz.cpp:531 msgid "[None]" msgstr "[ohne]" #: tqslwiz.cpp:1024 tqslwiz.cpp:1193 msgid "You must select a %hs" msgstr "Sie müssen ein %hs wählen" #: tqslwiz.cpp:1055 #, c-format msgid "%s: Invalid Grid Field" msgstr "%s: Ungültiges Lokator-Feld" #: tqslwiz.cpp:1059 #, c-format msgid "%s: Invalid Grid Square" msgstr "%s: Ungültiger Lokator" #: tqslwiz.cpp:1063 #, c-format msgid "%s: Invalid Grid Subsquare" msgstr "%s: Ungültiges Lokator-Kleinfeld" #: tqslwiz.cpp:1067 #, c-format msgid "%s: Invalid Grid Sub-subsquare" msgstr "%s: Ungültiges Lokator-Mikrofeld" #: tqslwiz.cpp:1071 #, c-format msgid "%s: Invalid Gridsquare Format" msgstr "%s: Ungültiges Lokator-Format" #: tqslwiz.cpp:1078 #, c-format msgid "" "Grid %s is not correct for your QTH. Click 'Next' again to use it anyway." msgstr "" "Lokator %s passt nicht zu Ihrem QTH. 'Next' nochmals anklicken, um ihn " "dennoch zu verwenden." #: tqslwiz.cpp:1112 #, c-format msgid "" "Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it " "anyway." msgstr "" "Lokator %s passt nicht zu Ihrem DXCC-Land. 'Next' nochmals anklicken, um ihn " "dennoch zu verwenden." #: tqslwiz.cpp:1115 #, c-format msgid "" "Grid %s is not correct for your %s. Click 'Next' again to use it anyway." msgstr "" "Lokator %s passt nicht zu Ihrem %s. 'Next' nochmals anklicken, um ihn " "dennoch zu verwenden." #: tqslwiz.cpp:1141 #, c-format msgid "IOTA value %s is not valid." msgstr "IOTA-Angabe %s ungültig." #: tqslwiz.cpp:1149 #, c-format msgid "" "IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, " "OC- or SA-" msgstr "" "IOTA %s ist falsch. Sie muss mit AF-, AN-, AS-, EU-, NA-, OC- oder SA- " "beginnen" #: tqslwiz.cpp:1156 #, c-format msgid "IOTA reference %s is not correct. Must have a number after the '-'" msgstr "IOTA %s ist falsch. Nach dem '-' muss eine Zahl folgen." #: tqslwiz.cpp:1163 msgid "Invalid zone selections for state" msgstr "Ungültige Zonen-Auswahl für Staat" #: tqslwiz.cpp:1164 msgid "Invalid zone selections for province" msgstr "Ungültige Zonen-Auswahl für Provinz" #: tqslwiz.cpp:1165 msgid "Invalid zone selections for oblast" msgstr "Ungültige Zonen-Auswahl für Oblast" #: tqslwiz.cpp:1166 msgid "Invalid zone selections for DXCC entity" msgstr "Ungültige Zonen-Auswahl für DXCC-Land" #: tqslwiz.cpp:1315 msgid "Station Data input complete" msgstr "Standort-Dateneingabe abgeschlossen" #: tqslwiz.cpp:1319 msgid "Select or enter name of this station location" msgstr "Wählen Sie aus oder geben Sie den Namen dieses Standortes ein" #: tqslwiz.cpp:1342 tqslwiz.cpp:1348 msgid "Station Location Name" msgstr "Name des Standortes" #: tqslwiz.cpp:1386 msgid "Station name must be provided" msgstr "Stationsname muss eingegeben werden" #: wxutil.cpp:139 msgid "Memory allocation failure" msgstr "Speicherzuordnungsfehler" #: wxutil.cpp:140 msgid "Unable to initialize random number generator" msgstr "Zufallszahlengenerator kann nicht initialisiert werden" #: wxutil.cpp:141 msgid "Invalid argument" msgstr "Ungültiges Befehlsargument" #: wxutil.cpp:142 msgid "Operator aborted operation" msgstr "Vom Anwender abgebrochen" #: wxutil.cpp:143 msgid "No Certificate Request matches the selected Callsign Certificate" msgstr "" "Dem gewählten Rufzeichen-Zertifikat entspricht keine Zertifikatsanforderung" #: wxutil.cpp:144 msgid "Buffer too small" msgstr "Puffer zu klein" #: wxutil.cpp:145 msgid "Invalid date format" msgstr "Ungültiges Datumsformat" #: wxutil.cpp:146 msgid "Certificate not initialized for signing" msgstr "Zertifikat zum Signieren nicht initialisiert" #: wxutil.cpp:147 msgid "Passphrase not correct" msgstr "Passwort falsch" #: wxutil.cpp:148 msgid "Expected name" msgstr "Erwarteter Name" #: wxutil.cpp:149 msgid "Name exists" msgstr "Name existiert bereits" #: wxutil.cpp:150 msgid "Data for this DXCC entity could not be found" msgstr "Daten für dieses DXCC konnten nicht gefunden werden" #: wxutil.cpp:151 msgid "Invalid time format" msgstr "Ungültiges Zeitformat" #: wxutil.cpp:152 msgid "" "QSO date is not within the date range specified on your Callsign Certificate" msgstr "" "QSO-Datum nicht innerhalb des im Rufzeichen-Zertifikat angegebenen Bereichs" #: wxutil.cpp:153 msgid "Certificate provider not found" msgstr "Zertifikatsanbieter nicht gefunden" #: wxutil.cpp:154 msgid "No callsign certificate for key" msgstr "Kein Rufzeichen-Zertifikat für Schlüssel" #: wxutil.cpp:155 msgid "Configuration file cannot be opened" msgstr "Konfigurationsdatei kann nicht geöffnet werden" #: wxutil.cpp:156 msgid "" "The private key for this Callsign Certificate is not present on this " "computer; you can obtain it by loading a .tbk or .p12 file" msgstr "" "Der private Schlüssel für dieses Rufzeichen-Zertifikat befindet sich nicht " "auf diesem Computer; laden Sie eine .tbk oder .p12 Datei" #: wxutil.cpp:157 msgid "PKCS#12 file not TQSL compatible" msgstr "PKCS # 12-Datei nicht kompatibel mit TQSL" #: wxutil.cpp:158 msgid "Callsign Certificate not TQSL compatible" msgstr "Rufzeichen-Zertifikat nicht kompatibel mit TQSL" #: wxutil.cpp:159 msgid "Date out of range" msgstr "Datum außerhalb des Bereichs" #: wxutil.cpp:160 msgid "Previously Signed QSO detected" msgstr "Bereits hochgeladene QSO gefunden" #: wxutil.cpp:161 msgid "Database error" msgstr "Datenbankfehler" #: wxutil.cpp:162 msgid "The selected station location could not be found" msgstr "Der ausgewählte Standort konnte nicht gefunden werden" #: wxutil.cpp:163 msgid "The selected callsign could not be found" msgstr "Das ausgewählte Rufzeichen konnte nicht gefunden werden" #: wxutil.cpp:164 msgid "The TQSL configuration file cannot be parsed" msgstr "Die TQSL-Konfigurationsdatei kann nicht analysiert werden" #: wxutil.cpp:165 msgid "This file can not be processed due to a system error" msgstr "Diese Datei kann aufgrund eines Systemfehlers nicht verarbeitet werden" #: wxutil.cpp:166 msgid "The format of this file is incorrect." msgstr "Falsches Dateiformat." #: wxutil.cpp:167 msgid "Callsign certificate could not be installed" msgstr "Das Rufzeichen-Zertifikat konnte nicht installiert werden" #: wxutil.cpp:168 msgid "Callsign Certificate does not match QSO details" msgstr "Rufzeichen-Zertifikat stimmt nicht mit QSO-Details überein" #: wxutil.cpp:169 msgid "Station Location does not match QSO details" msgstr "Standort stimmt nicht mit den QSO-Details überein" #: wxutil.cpp:170 msgid "New DB" msgstr "Neue DB" #: wxutil.cpp:171 msgid "Gridsquare is inconsistent with Station Location" msgstr "Lokator passt nicht zum Standort" #: wxutil.cpp:172 msgid "ADIF field has invalid contents" msgstr "Inhalt des ADIF-Feldes ungültig" #: wxutil.cpp:173 msgid "" "This Callsign Certificate cannot be installed as the first date where it is " "valid is in the future. Check if your computer is set to the proper date.\n" "\n" msgstr "" "Dieses Rufzeichen-Zertifikat kann nicht installiert werden, da der erste " "Gültigkeitstag in der Zukunft liegt. Stellen Sie sicher, dass Ihr Computer " "auf das richtige Datum eingestellt ist.\n" #: wxutil.cpp:174 msgid "" "This Callsign Certificate cannot be installed as it has expired. Check if " "your computer is set to the proper date and that this is the latest Callsign " "Certificate.\n" "\n" msgstr "" "Dieses Rufzeichen-Zertifikat kann nicht installiert werden, da es abgelaufen " "ist. Prüfen Sie, ob Ihr Computer auf das richtige Datum eingestellt ist und " "ob es sich um das neueste Rufzeichen-Zertifikat handelt.\n" "\n" #: wxutil.cpp:187 msgid "NO ERROR" msgstr "KEIN FEHLER" #: wxutil.cpp:190 msgid "Unknown custom error" msgstr "Unbekannter benutzerdefinierter Fehler" #: wxutil.cpp:197 msgid "" "TQSL is unable to sign QSOs because another instance of TQSL is busy.\n" "Terminate any other copies of TQSL and try again." msgstr "" "TQSL kann keine QSOs signieren, da TQSL bereits im Hintergrund läuft.\n" "Beenden Sie alle anderen TQSL-Instanzen und versuchen Sie es erneut." #: wxutil.cpp:199 msgid "Database Error: %hs" msgstr "Datenbankfehler: %hs" #: wxutil.cpp:201 msgid "Uploads database error" msgstr "Upload Datenbankfehler" #: wxutil.cpp:207 msgid "System error: %hs : %hs" msgstr "Systemfehler: %hs : %hs" #: wxutil.cpp:211 msgid "System error: %hs" msgstr "Systemfehler: %hs" #: wxutil.cpp:219 msgid "File syntax error: %hs" msgstr "Datei Syntaxfehler: %hs" #: wxutil.cpp:223 msgid "File syntax error" msgstr "Datei Syntaxfehler" #: wxutil.cpp:259 msgid "" "The private key for callsign %hs serial %ld is not present on this computer; " "you can obtain it by loading a .tbk or .p12 file" msgstr "" "Der private Schlüssel für das Rufzeichen %hs Nr. %ld befindet sich nicht auf " "diesem Computer; laden Sie eine .tbk oder .p12 Datei" #: wxutil.cpp:266 #, c-format msgid "Invalid error code: %d" msgstr "Ungültiger Fehlercode: %d" #: wxutil.cpp:280 msgid "Station Location" msgstr "Standort" #. TRANSLATORS: This message is for QSO details. For example, 'The Station Location GRIDSQUARE has value FM18ju while QSO has FM18jt' #: wxutil.cpp:283 msgid "The %s '%hs' has value '%hs' while QSO has '%hs'" msgstr "%s '%hs' hat den Wert '%hs' das QSO jedoch '%hs'" #: wxutil.cpp:291 msgid "This log has invalid QSO information" msgstr "Log enthält ungültige QSO-Informationen" #. TRANSLATORS: This message is for QSO details. For example, 'The log being signed has 'US County' set to Foobar which is not valid' #: wxutil.cpp:293 msgid "The log being signed has '%hs' set to value '%hs' which is not valid" msgstr "Im Log steht '%hs' auf '%hs'. Dies ist ungültig" #: wxutil.cpp:302 msgid "" "There is no valid callsign certificate for %hs in entity %hs available. This " "QSO cannot be signed" msgstr "" "Kein gültiges Rufzeichenzertifikat für %hs in %hs verfügbar. Das QSO kann " "nicht signiert werden" #: wxutil.cpp:310 msgid "ADIF content is not valid. '%hs' is not valid for %hs" msgstr "ADIF-Inhalt ist ungültig. '%hs' ist nicht gültig für %hs" #: getpassword.h:51 msgid "New passphrase" msgstr "Neues Passwort" #: getpassword.h:52 msgid "Enter new passphrase" msgstr "Neues Passwort eingeben" #: qsodatadialog.h:86 msgid "QSO Data" msgstr "QSO-Daten" #: tqslvalidator.h:58 msgid "Date" msgstr "Datum" #: tqslvalidator.h:69 msgid "Time" msgstr "Zeit" #~ msgid "" #~ "TQSL must wait for other running copies of TQSL to exit before signing..." #~ msgstr "" #~ "TQSL muss vor der Signierung warten bis andere laufende Instanzen von " #~ "TQSL enden..." #~ msgid "The duplicates database is locked" #~ msgstr "Die Duplikate-Datenbank ist gesperrt" #~ msgid "Already Uploaded QSOs Detected" #~ msgstr "Bereits hochgeladene QSO gefunden" #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and no new QSOs." #~ msgstr "" #~ "Dieses Log enthält %d QSO(s), die bereits zum Hochladen auf LoTW signiert " #~ "wurden und keine neuen QSOs." #~ msgid "" #~ "Click 'Re-Upload QSOs' to re-process this log while allowing already " #~ "uploaded QSOs." #~ msgstr "" #~ "Klicken Sie auf 'QSOs nochmals hochladen', um dieses Log erneut zu laden " #~ "inkl. bereits hochgeladener QSOs." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and %d QSOs which are new." #~ msgstr "" #~ "Dieses Log enthält %d QSO(s), die bereits für zum Hochladen auf LoTW " #~ "signiert scheinen und %d neue QSOs." #~ msgid "" #~ "Click 'New QSOs Only' to sign normally, without the already uploaded QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Klicken Sie auf 'nur neue QSOs', um ohne die bereits hochgeladenen QSOs " #~ "(empfohlen) fortzufahren." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and one QSO which is new." #~ msgstr "" #~ "Dieses Log enthält %d QSO(s), die bereits für zum Hochladen auf LoTW " #~ "signiert scheinen und ein neues QSO." #~ msgid "" #~ "The only reason to re-sign already uploaded QSOs is if a previous upload " #~ "was not processed by LoTW, either because it was never uploaded, or there " #~ "was a server failure" #~ msgstr "" #~ "Der einzige Grund bereits hochgeladene QSOs erneut zu signieren ist, wenn " #~ "diese nicht im LoTW angekommen sind - entweder weil das Hochladen nicht " #~ "funktioniert hat oder wegen eines Server-Fehlers" #, c-format #~ msgid "Already Uploaded: %d" #~ msgstr "Bereits hochgeladen: %d" #, c-format #~ msgid "Already uploaded: %d" #~ msgstr "Bereits hochgeladen: %d" #~ msgid "All QSOs are already uploaded; aborted" #~ msgstr "Es wurden bereits alle QSOs hochgeladen, Abbruch" #, c-format #~ msgid "%d of %d QSOs are already uploaded; aborted" #~ msgstr "%d von %d QSOs wurden bereits hochgeladen; Abbruch" #, c-format #~ msgid "%s: %d QSO records were already uploaded" #~ msgstr "%s: %d QSOs wurden bereits hochgeladen" #~ msgid "" #~ "Resubmitting these QSOs will cause them to be reported as already " #~ "uploaded." #~ msgstr "" #~ "Wenn Sie diese QSOs erneut hochladen werden diese als bereits hochgeladen " #~ "gemeldet." #~ msgid "Display details of already uploaded QSOs when signing a log" #~ msgstr "" #~ "Zeige Details der bereits hochgeladenen QSOs beim Signieren eines Logs" #~ msgid "tQSL Certificates" #~ msgstr "tQSL-Zertifikate" #~ msgid "My current personal callsign" #~ msgstr "Meine aktuellen persönlichen Rufzeichen" #~ msgid "" #~ "My new personal callsign (I have a Callsign Certificate for my former " #~ "callsign)" #~ msgstr "" #~ "Mein neues persönliches Rufzeichen (ich besitze ein Rufzeichen-Zertifikat " #~ "für mein altes Rufzeichen)" #~ msgid "" #~ "My former personal callsign or a portable modifier for my current or " #~ "former callsign" #~ msgstr "" #~ "Mein ehemaliges persönliches Rufzeichen oder eine /P-Angabe für mein " #~ "aktuelles oder ehemaliges Rufzeichen" #~ msgid "A primary club callsign" #~ msgstr "Ein primäres Club Rufzeichen" #~ msgid "" #~ "A secondary club callsign (I have a Callsign Certificate for the primary " #~ "club callsign)" #~ msgstr "" #~ "Ein sekundäres Club Rufzeichen (ich habe ein Rufzeichen-Zertifikat für " #~ "das primäre Club Rufzeichen)" #~ msgid "A DXpedition, Portable, or holiday operation with multiple operators" #~ msgstr "" #~ "Ein Expeditions-, Portabel- oder Urlaubs-Betrieb mit mehreren Operatoren" #~ msgid "" #~ "A DXpedition, Portable, or holiday operation where I am the only operator" #~ msgstr "" #~ "Ein Expeditions-, Portabel- oder Urlaubs-Betrieb mit mir als einzigem OP" #~ msgid "An operator that uses me as a QSL manager" #~ msgstr "Ein Funkamateur, für den ich QSL-Manager bin" #~ msgid "A special event callsign with multiple operators" #~ msgstr "Ein Sonderrufzeichen mit mehreren OPs" #~ msgid "A special event callsign where I am the only operator" #~ msgstr "Ein Sonderrufzeichen mit mir als einzigem OP" #~ msgid "Please select a Callsign Certificate to validate your request." #~ msgstr "" #~ "Bitte wählen Sie ein Rufzeichen-Zertifikat aus, um Ihre Anforderung zu " #~ "überprüfen." #~ msgid "This Callsign Certificate is for:" #~ msgstr "Dieses Rufzeichen-Zertifikat ist für:" #~ msgid "" #~ "Please select your club's primary Callsign Certificate to validate your " #~ "request." #~ msgstr "" #~ "Bitte wählen Sie das primäre Rufzeichen-Zertifikat Ihres Clubs aus, um " #~ "Ihre Anforderung zu überprüfen." #~ msgid "" #~ "You have already requested more than three Callsign Certificates for %s " #~ "in the past 24 hours. You should submit a request only once, then wait " #~ "for that request to processed by LoTW Staff. This may take several " #~ "business days." #~ msgstr "" #~ "Sie haben in den letzten 24 Std. bereits mehr als drei Rufzeichen-" #~ "Zertifikate für %s angefordert. Bitte fordern Sie dies nur einmal an und " #~ "warten dann auf die Antwort von LoTW. Das kann mehrere Arbeitstage dauern." #~ msgid "" #~ "You are saying that the requested Certificate for %s belongs to the same " #~ "person as %hs and are using the selected Certificate to prove %hs's " #~ "identity." #~ msgstr "" #~ "Sie bestätigen, dass das angeforderte Zertifikat für %s zur gleichen " #~ "Person gehört wie %hs und verwendet werden soll, um die Identität von %hs " #~ "nachzuweisen." #~ msgid "" #~ "Callsign Certificate container files (*.p12;*.P12)|*.p12;*.P12|" #~ "Certificate Request response files (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgstr "" #~ "Rufzeichen-Zertifikat-Container-Dateien (*.p12; *. P12)|*.p12;*. P12|" #~ "Zertifikatsanforderung-Antwort-Dateien (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgid "" #~ "Callsign Certificate container files (*.p12)|*.p12|Certificate Request " #~ "response files (*.tq6)|*.tq6" #~ msgstr "" #~ "Rufzeichen-Zertifikat-Container-Dateien (*.p12)|*.p12|" #~ "Zertifikatsanforderung-Antwort-Dateien (*.tq6)|*.tq6" #~ msgid "Go to the first QSO in this log" #~ msgstr "Zum ersten QSO in diesem Log" #~ msgid "Go to the previous QSO in this log" #~ msgstr "Zum vorherigen QSO in diesem Log" #~ msgid "Go to the next QSO in this log" #~ msgstr "Zum nächsten QSO in diesem Log" #~ msgid "Go to the last QSO in this log" #~ msgstr "Zum letzten QSO in diesem Log" #~ msgid "No QSOs written" #~ msgstr "Keine QSOs geschrieben" #~ msgid "Some QSOs suppressed" #~ msgstr "Einige QSOs unterdrückt" #~ msgid "The file (%s) will be signed using:" #~ msgstr "Die Datei (%s) wird signiert mit:" #~ msgid "Station Location:" #~ msgstr "Standort:" #~ msgid "DXCC:" #~ msgstr "DXCC:" #~ msgid "Is this correct?" #~ msgstr "Ist das richtig?" #~ msgid "TQSL - Confirm signing" #~ msgstr "TQSL-Signierung bestätigen" #~ msgid "%s: %d QSO records were outside the selected date range" #~ msgstr "%s: %d QSOs waren außerhalb des gewählten Zeitraums" #~ msgid "No records to upload" #~ msgstr "Nichts zum Hochladen da" #~ msgid "Password protected P12 files cannot be imported on the command line" #~ msgstr "" #~ "Über die Kommandozeile können keine passwortgeschützten P12-Dateien " #~ "importiert werden" #~ msgid "Your certificate request did not upload properly" #~ msgstr "Die Zertifikatsanforderung wurde nicht richtig hochgeladen" #~ msgid "Please try again." #~ msgstr "Bitte versuchen Sie es erneut." #~ msgid "Certificate Request:" #~ msgstr "Zertifikatsanforderung:" #~ msgid "Allow 'None' for " #~ msgstr "Zulassen von 'ohne' für " #~ msgid "%s: Invalid Grid Square Field" #~ msgstr "%s: Ungültiges Lokator-Feld" #~ msgid "%s: Invalid Subsquare" #~ msgstr "%s: Ungültiges Kleinfeld" #~ msgid "Already Uploaded QSO suppressed" #~ msgstr "Bereits hochgeladene QSOs unterdrückt" #~ msgid "" #~ "There is no valid callsign certificate for %hs available. This QSO cannot " #~ "be signed" #~ msgstr "" #~ "Es ist kein gültiges Rufzeichenzertifikat für %hs verfügbar. Dieses QSO " #~ "kann nicht signiert werden." #~ msgid "Invalid, unusable" #~ msgstr "Ungültig, nicht nutzbar" #~ msgid "Certificates that are awaiting ARRL approval" #~ msgstr "Zertifikate, die auf ARRL-Freigabe warten" #~ msgid "" #~ "If so, choose a callsign below for the primary LoTW account. If not, " #~ "choose 'No', and a new LoTW account will be set up for these QSOs." #~ msgstr "" #~ "Wenn ja, wählen Sie unten ein Rufzeichen für das primäre LoTW-Konto. Wenn " #~ "nicht, wählen Sie \"Nein\", und ein neues LoTW-Konto wird für diese QSOs " #~ "eingerichtet." #~ msgid "" #~ "This is a Club call, I'm the QSL manager for this call, or this is a " #~ "DXpedition call" #~ msgstr "" #~ "Das ist ein Klub-Rufzeichen, ich bin der QSL-Manager dafür oder das ist " #~ "ein DXpeditions-Rufzeichen" #~ msgid "No, Create a new LoTW account for this call" #~ msgstr "Nein, neues LoTW-Konto für dieses Rufzeichen erstellen" #~ msgid "Yes, Save these QSOs into an existing LoTW account" #~ msgstr "Ja, diese QSOs in einem vorhandenen LoTW-Konto speichern" #~ msgid "Add QSOs for the new callsign to an existing LoTW account?" #~ msgstr "" #~ "QSOs für das neue Rufzeichen einem vorhandenen LoTW-Konto hinzufügen?" #~ msgid "Since you have no callsign certificates, you must " #~ msgstr "Da Sie keine Rufzeichen-Zertifikate besitzen, müssen Sie " #~ msgid "" #~ "This portable callsign request requires approval using an existing " #~ "callsign certificate" #~ msgstr "" #~ "Die Anforderung für das Portabel-Rufzeichen muss mit einem vorhandenen " #~ "Rufzeichen-Zertifikat bestätigt werden." #~ msgid "" #~ "The callsign %s is not currently registered in the FCC ULS database as of " #~ "%s.\n" #~ "If this is a newly registered call, you must wait at least one business " #~ "day for it to be valid. Please enter a currently valid callsign." #~ msgstr "" #~ "Das Rufzeichen %s ist derzeit %s nicht in der FCC-ULS-Datenbank " #~ "registriert.\n" #~ "Wenn dies ein neu registriertes Rufzeichen ist, müssen Sie mind. einen " #~ "Werktag warten, bis es gültig ist. Bitte geben Sie ein aktuell gültiges " #~ "Rufzeichen ein." #~ msgid "" #~ "Please select a callsign certificate for the account where you would like " #~ "the QSOs to be stored" #~ msgstr "" #~ "Bitte wählen Sie ein Rufzeichen-Zertifikat für das Konto, in dem die QSOs " #~ "gespeichert werden sollen" #~ msgid "To submit the signed log file to LoTW:\n" #~ msgstr "Zur Übermittlung des signierten Logs an LoTW:\n" #~ msgid "" #~ "Since you have no callsign certificates, you must submit an 'Unsigned' " #~ "certificate request. This will allow you to create your initial callsign " #~ "certificate for LoTW use. Click 'Finish' to complete this callsign " #~ "certificate request." #~ msgstr "" #~ "Da Sie keine Rufzeichen-Zertifikate haben, müssen Sie eine " #~ "Zertifikatanforderung \"Ohne Signatur\" einreichen. So können Sie Ihr " #~ "erstes Rufzeichen-Zertifikat zur LoTW-Verwendung erstellen. Klicken Sie " #~ "auf 'Fertig stellen', um diese Rufzeichen-Zertifikatsanforderung " #~ "abzuschließen." #~ msgid "" #~ "My former personal callsign or a portable modifier for my current callsign" #~ msgstr "" #~ "Meine ehemaligen persönlichen Rufzeichen oder eine portabel Erweiterung " #~ "für mein aktuelles Rufzeichen" #~ msgid "" #~ "You may protect this Callsign Certificate using a password. If you are " #~ "using a computer system that is shared with others, you should specify a " #~ "password to protect this Callsign Certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Sie können dieses Rufzeichen-Zertifikat mit einem Kennwort schützen. Wenn " #~ "Sie ein Computersystem verwenden, das Sie zusammen mit anderen nutzen, " #~ "sollten Sie ein Kennwort zum Schutz dieses Rufzeichen-Zertifikats " #~ "angeben. Wenn Sie den Computer in einer privaten Umgebung verwenden, " #~ "müssen Sie kein Kennwort angegeben." #~ msgid "" #~ "Leave the password blank and click 'Next' unless you want to use a " #~ "password." #~ msgstr "" #~ "Lassen Sie das Kennwort leer und klicken Sie auf 'Weiter', wenn Sie ein " #~ "Kennwort verwenden möchten." #~ msgid "Password:" #~ msgstr "Kennwort:" #~ msgid "Enter the password again for verification:" #~ msgstr "Geben Sie das Kennwort zur Bestätigung erneut ein:" #~ msgid "" #~ "DO NOT lose the password you choose! You will be unable to use the " #~ "Certificate without this password!" #~ msgstr "" #~ "Bewahren Sie das Kennwort sicher auf! Das Zertifikat kann ohne das " #~ "Kennwort nicht verwendet werden!" #~ msgid "" #~ "Leave the password blank and click 'Finish' unless you want to use a " #~ "password." #~ msgstr "" #~ "Lassen Sie das Kennwort leer und klicken Sie auf 'Fertig stellen', wenn " #~ "Sie kein Kennwort verwenden möchten." #~ msgid "The two copies of the password do not match." #~ msgstr "Die beiden Eingaben für das Kennwort stimmen nicht überein." #~ msgid "New password:" #~ msgstr "Neues Kennwort:" #~ msgid "Password entries do not match" #~ msgstr "Kennworteingaben stimmen nicht überein." #~ msgid "Password confirmed" #~ msgstr "Kennwort bestätigt" #~ msgid "Enter a password for this callsign certificate." #~ msgstr "Geben Sie ein Kennwort für dieses Rufzeichen-Zertifikat ein." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence no password need be specified." #~ msgstr "" #~ "Wenn Sie den Computer mit anderen Personen gemeinsam verwenden, sollten " #~ "Sie ein Kennwort zum Schutz dieses Zertifikats angeben. Bei Verwendung " #~ "des Computers in einer privaten Umgebung muss kein Kennwort angegeben " #~ "werden." #~ msgid "" #~ "This password will have to be entered each time you use this callsign " #~ "certificate for signing or when saving the key." #~ msgstr "" #~ "Dieses Kennwort müssen Sie jedes Mal eingegeben wenn Sie dieses " #~ "Rufzeichen-Zertifikat zum Signieren oder zum Speichern des Schlüssels " #~ "verwenden." #~ msgid "" #~ "Leave the password blank and click 'OK' unless you want to use a password." #~ msgstr "" #~ "Lassen Sie das Kennwort leer und klicken Sie auf 'OK', wenn Sie kein " #~ "Kennwort verwenden möchten." #~ msgid "New Password" #~ msgstr "Neues Kennwort" #~ msgid "Enter the password to unlock the .p12 file:" #~ msgstr "Geben Sie das Kennwort ein, um die P12-Datei zu entsperren:" #~ msgid "Password error" #~ msgstr "Kennwort-Fehler" #~ msgid "" #~ "Enter the password to unlock the callsign certificate for %hs -- %hs\n" #~ "(This is the password you made up when you installed the callsign " #~ "certificate.)" #~ msgstr "" #~ "Geben Sie das Kennwort ein, um das Rufzeichen-Zertifikat für %hs zu " #~ "entsperren -- %hs\n" #~ "(Dies ist das Kennwort, das Sie bei der Installation des Rufzeichen-" #~ "Zertifikats erstellt haben.)" #~ msgid "Enter password" #~ msgstr "Kennwort eingeben" #~ msgid "Password for the signing key" #~ msgstr "Kennwort für den Signaturschlüssel" #~ msgid "Enter the password for the certificate container file." #~ msgstr "Geben Sie das Kennwort für die Zertifikats-Container-Datei ein." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Wenn Sie den Computer mit anderen Personen gemeinsam verwenden, sollten " #~ "Sie ein Kennwort zum Schutz dieses Zertifikats angeben. Bei Verwendung " #~ "des Computers in einer privaten Umgebung muss kein Kennwort angegeben " #~ "werden." #~ msgid "" #~ "You will have to enter the password any time you load the file into " #~ "TrustedQSL." #~ msgstr "" #~ "Sie müssen das Kennwort jedes Mal eingeben, wenn Sie die Datei in " #~ "TrustedQSL laden." #~ msgid "Certificate Container Password" #~ msgstr "Zertifikats-Container Kennwort" #~ msgid "Password: " #~ msgstr "Kennwort: " #~ msgid "Password protected" #~ msgstr "durch Kennwort geschützt" #~ msgid "Enter the password to unlock the callsign certificate" #~ msgstr "" #~ "Geben Sie das Kennwort ein, um das Rufzeichen-Zertifikat zu entsperren" #~ msgid "Enable passwords for Callsign Certificates" #~ msgstr "Passwörter für Rufzeichen-Zertifikate aktivieren" #~ msgid "Password not correct" #~ msgstr "Kennwort nicht richtig" #~ msgid "New password" #~ msgstr "Neues Kennwort" #~ msgid "Enter new password" #~ msgstr "Geben Sie das neue Kennwort ein" #~ msgid "Duplicate QSOs Detected" #~ msgstr "Doppelte QSOs erkannt" #~ msgid "" #~ "Click 'Allow Duplicates' to re-process this log while allowing duplicate " #~ "QSOs." #~ msgstr "" #~ "Klicken Sie auf 'Duplikate zulassen', um dieses Log nochmals zu " #~ "verarbeiten, wobei doppelte QSOs zugelassen werden." #~ msgid "" #~ "Click 'Exclude duplicates' to sign normally, without the duplicate QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Klicken Sie auf 'Duplikate ausschließen', um normal - ohne doppelte QSOs " #~ "- zu signieren (empfohlen)." #~ msgid "" #~ "Click 'Allow duplicates' to re-process this log while allowing duplicate " #~ "QSOs." #~ msgstr "" #~ "Klicken Sie auf 'Duplikate zulassen', um dieses Log nochmals zu " #~ "verarbeiten, wobei doppelte QSOs zugelassen werden." #~ msgid "" #~ "The log file you are uploading using your QSO Logging system consists " #~ "entirely of previously uploaded QSOs (duplicates) that create unnecessary " #~ "work for LoTW. There may be a more recent version of your QSO Logging " #~ "system that would prevent this. Please check with your QSO Logging " #~ "system's vendor for an updated version." #~ msgstr "" #~ "Die Log-Datei, die Sie mit Hilfe Ihres Log-Programms hochladen wollen " #~ "besteht ausschließlich aus bereits zuvor hochgeladenen QSOs (Dubletten), " #~ "die eine unnötige Last für LoTW darstellen. Möglicherweise gibt es eine " #~ "neuere Version Ihres Log-Programms, das dies vermeidet. Bitte überprüfen " #~ "Sie beim Anbieter, ob eine aktualisierte Version vorliegt." #~ msgid "" #~ "In the meantime, please note that some loggers may exhibit strange " #~ "behavior if an option other than 'Allow duplicates' is clicked. Choosing " #~ "'Cancel' is usually safe, but a defective logger not checking the status " #~ "messages reported by TrustedQSL may produce strange (but harmless) " #~ "behavior such as attempting to upload an empty file or marking all chosen " #~ "QSOs as 'sent'" #~ msgstr "" #~ "In der Zwischenzeit beachten Sie bitte, dass einige Log-Programme sich " #~ "ggf. merkwürdig verhalten, wenn eine andere Option als 'Duplikate " #~ "zulassen' angeklickt wird. Die Auswahl 'Abbrechen' ist in der Regel " #~ "sicher, aber ein Log-Programm, das die Statusmeldungen von TrustedQSL " #~ "nicht überprüft könnte seltsam (aber harmlos) reagieren. In dem es z. B. " #~ "versucht eine leere Datei hochzuladen oder alle ausgewählten QSOs als " #~ "'gesendet' markiert." #~ msgid "" #~ "The log file you are uploading using your QSO Logging system includes " #~ "some previously uploaded QSOs (duplicates) that create unnecessary work " #~ "for LoTW. There may be a more recent version of your QSO Logging system " #~ "that would prevent this. Please check with your QSO Logging system's " #~ "vendor for an updated version." #~ msgstr "" #~ "Die Log-Datei, die Sie mit Hilfe Ihres Log-Programms hochladen wollen " #~ "enthält einige bereits zuvor hochgeladenen QSOs (Dubletten), die eine " #~ "unnötige Last für LoTW darstellen. Möglicherweise gibt es eine neuere " #~ "Version Ihres Log-Programms, das dies vermeidet. Bitte überprüfen Sie " #~ "beim Anbieter, ob eine aktualisierte Version vorliegt." #~ msgid "" #~ "In the meantime, please note that some loggers may exhibit strange " #~ "behavior if an option other than 'Allow duplicates' is clicked. 'Exclude " #~ "duplicates' is recommended, but a logger that does its own duplicate " #~ "tracking may incorrectly set the status in this case. A logger that " #~ "doesn't track duplicates should be unaffected by choosing 'Exclude " #~ "duplicates' and if it tracks 'QSO sent' status, will correctly mark all " #~ "selected QSOs as sent - they are in your account even though they would " #~ "not be in this specific batch" #~ msgstr "" #~ "In der Zwischenzeit beachten Sie bitte, dass einige Log-Programme sich " #~ "ggf. merkwürdig verhalten, wenn eine andere Option als 'Duplikate " #~ "zulassen' angeklickt wird. 'Duplikate ausschließen' wird empfohlen. Wird " #~ "allerdings ein Log-Programm verwendet, das bereits selbst doppelte QSOs " #~ "verwaltet, wird der Status möglicherweise nicht korrekt abgebildet. Ein " #~ "Log-Programm, das selbst keine Duplikate erkennt wird durch 'Duplikate " #~ "ausschließen' nicht beeinträchtigt und markiert alle ausgewählten QSOs " #~ "als gesendet im 'QSO gesendet'-Status." #~ msgid "Exclude duplicates" #~ msgstr "Duplikate ausschließen" #~ msgid "Allow duplicates" #~ msgstr "Duplikate zulassen" #~ msgid "" #~ "The only reason to re-sign duplicate QSOs is if a previous upload was not " #~ "processed by LoTW, either because it was never uploaded, or there was a " #~ "server failure" #~ msgstr "" #~ "Der einzige Grund, doppelte QSOs nochmals zu signieren ist, wenn eine " #~ "vorherige Datei nicht von LoTW verarbeitet wurde. Möglicherweise schlug " #~ "das Hochladen fehl oder es gab einen Server-Ausfall." #~ msgid "Duplicates: %d" #~ msgstr "Duplikate: %d" #~ msgid "All QSOs are duplicates; aborted" #~ msgstr "Alle QSOs sind Duplikate; abgebrochen" #~ msgid "%d of %d QSOs are duplicates; aborted" #~ msgstr "%d von %d QSOs sind Duplikate; abgebrochen" #~ msgid "%s: %d QSO records were duplicates" #~ msgstr "%s: %d QSOs waren Duplikate" #~ msgid "" #~ "Resubmitting these QSOs will cause them to be reported as duplicates." #~ msgstr "" #~ "Werden diese QSOs erneut gesendet, werden sie als Duplikate gemeldet." #~ msgid "TQSL must not be run 'As Administrator'. Quitting." #~ msgstr "" #~ "TQSL darf nicht als Administrator ausgeführt werden und wird beendet." #~ msgid "Display details of duplicate QSOs when signing a log" #~ msgstr "Details von doppelten QSOs bei der Signierung eines Logs anzeigen" #~ msgid "Duplicate QSO suppressed" #~ msgstr "Doppelte QSOs unterdrückt" #~ msgid "A special event (1x1) callsign" #~ msgstr "Ein Sonderrufzeichen (1 x 1)" #~ msgid "Callsign Certificate or Certificate Request not found" #~ msgstr "" #~ "Rufzeichen-Zertifikat oder Zertifikatsanforderung wurde nicht gefunden" #~ msgid "" #~ "Callsign Certificate or Certificate Request not found for callsign %hs " #~ "serial %ld" #~ msgstr "" #~ "Rufzeichen-Zertifikat oder Zertifikatsanforderung nicht gefunden für " #~ "Rufzeichen %hs serielle % ld" #~ msgid "QSO begin date:" #~ msgstr "QSO Beginn-Datum:" #~ msgid "QSO end date:" #~ msgstr "QSO Enddatum:" #~ msgid "" #~ "If the requested certificate is for your personal callsign, then you " #~ "should select 'Signed' and choose a callsign certificate for another of " #~ "your personal callsigns from the list below to be used to sign this " #~ "request." #~ msgstr "" #~ "Wenn das angeforderte Zertifikat für Ihr persönliches Rufzeichen ist, " #~ "dann wählen Sie 'Signiert' und wählen Sie ein Rufzeichen-Zertifikat für " #~ "ein weiteres Ihrer persönlichen Rufzeichen aus der Liste unten, das zum " #~ "Signieren dieser Anfrage verwendet werden soll." #~ msgid "" #~ "If you don't have a Callsign Certificate for another personal callsign, " #~ "or if the requested Callsign Certificate is for a club station or for use " #~ "by a QSL manager on behalf of another operator, select 'Unsigned'." #~ msgstr "" #~ "Wenn Sie kein Rufzeichen-Zertifikat für ein weiteres persönliches " #~ "Rufzeichen haben oder das angeforderte Rufzeichen-Zertifikat für eine " #~ "Club-Station oder für die Verwendung durch einen QSL-Manager im Namen " #~ "eines anderen OMs ist, wählen Sie \"Ohne Signatur\"." #~ msgid "Unsigned" #~ msgstr "Ohne Signatur" #~ msgid "Signed" #~ msgstr "Signiert" #~ msgid "Sign Request" #~ msgstr "Anforderung signieren" #~ msgid "This request MUST be signed since DXCC Entity is set to NONE" #~ msgstr "" #~ "Diese Anforderung muss signiert werden, da das DXCC-Land auf KEIN " #~ "eingestellt oder leer ist" #~ msgid "" #~ "You have one or more callsign certificates that could be used to sign " #~ "this certificate request." #~ msgstr "" #~ "Sie haben ein oder mehrere Rufzeichen-Zertifikate, die zum Signieren " #~ "dieser Zertifikatsanforderung verwendet werden können." #~ msgid "" #~ "It is strongly recommended that you sign the request unless the callsign " #~ "certificates shown are not actually yours." #~ msgstr "" #~ "Es wird unbedingt empfohlen, den Antrag zu signieren. Es sei denn, die " #~ "angezeigten Rufzeichen-Zertifikate sind nicht Ihre eigenen." #~ msgid "Do you want to sign the certificate request?" #~ msgstr "Möchten Sie die Zertifikatsanforderung signieren?" #~ msgid "" #~ "Select \"Yes\" to sign the request, \"No\" to continue without signing." #~ msgstr "" #~ "Wählen Sie \"Ja\", um die Anforderung zu signieren, \"Nein\" um ohne " #~ "Signierung fortzufahren." #~ msgid "Can't write new configuration file %s: %hs" #~ msgstr "Die neue Konfigurationsdatei %s:%hs kann nicht erstellt werden" #~ msgid "Checking for TQSL updates...\n" #~ msgstr "Überprüfen auf TQSL-Aktualisierungen…\n" #~ msgid "A new TrustedQSL configuration file (V%s) is available!" #~ msgstr "Eine neue TrustedQSL Konfigurationsdatei (V%s) ist verfügbar!" tqsl-2.8.1/apps/lang/de/wxstd-3.2.mo0000644000175000017500000044773215003421124016776 0ustar rmurphyrmurphy< xH?I?ˡܡ   +8?GN VapvѢ  3 > LW`o ~,ǣУ ף   &1 7B WcsyΤդܤ *2 COX^ds| ƥ٥  1O^eks | ǦЦզۦ  #, <HO Xe  Ƨҧاާ"* 0=SY`f Ũ٨  4FOX`h"m4$$"-!Prv} ̪ΪҪ֪ڪު   "- / PZq ȫ ի# //_r356*BZq Э0HczŮ39?H Q ^ lx |4ï.'6? R ] isw 6Ȱ5"P"s : ޱ' / 9DUkֲ /Nd!"ݳ-1H(z Ǵٴ#).49@HOc r}  ŵе  6Pj0 ׶ F5)S}Ʒ%# "/*R(}&͸%%69p"? 9&1` ͺ$! ,3(O(x-%ϻ3) A-b ܼ%#A`)~ ý)6#`'"ƾ %:CLj q~  ɿBֿ)C'T!|)+,!>"]&#)$&6]| 3""9\$z# + (1Z%v$ &! &+#R"v#*!# . 4>Ugpv/} N*R9()   ( IQjrwC$ 'A2]'!!(?^v.'#C#Uy(9)9C}  5I,a10%%=W^!p#      ( 4@Qb&-  ~ ""20Qc2" ",> T_djq-x)  8 Xy1Mh L4$4R%o 3PJW,$ 2:3m$/1(*D.o -"G0j"9$0N"j&"$85NGn!+/A41v.2)Is2/7 C/_%##3;1=m"(%$9 ^T*((B(k$$'"<*_!5$%Dd +.-.Kj"#"+1'] -'":>5y'&-SL/4&,,2Y)-&& 2+P|(-!;0P)3230-d$;)Q2{! **=D"(  *5 ;FMRo  / J!^ 4 %6<'Dlk ##6!Z#|28 %EZq* '"JSgl 2 ; ESX/g" '5]} Qw ?X$72)(Rj$j%M+s%/3(\{-  *IO(i#66=#t81'%Bh!!!!6X q& /$To  h!&:L]w%#CYag6l 0   0 =#H)l | f p z          " ,8 A M Y c p |         ! , 7EW_ f q }&     )GN!W"yC '+F_diqu  *& 1D v  = $   %7 %]   ' )    &  A N U (u        7 !E g  m w      :  "?0] 8(8Vi#,<P`y$%$1V$s$$$9^${$$$, 4 B MX ^i0z&  .J"j19 "+4 D PZ cq w  (.= M[dl}  30 DPHY   %#IOSX]n!v32N30# -= D"RDu     $-'CU   + 3>/T$ O+ <H \ir<  (%H nx)#?>NUe~'% E *b            -!1F!+x!%!)!! !""-"4"<" A"6O""" " """""# ## #@#[#v#######$$$ #$-$,@$0m$$$$$$%0%E%[%zo%(%)&0=&n&o'q'-'''''((&.(U(e(/v(((((() )6)P)c)~)))))N)#A*e*x*.+E+W+n++++++ +!,1,'A,i,*|,,,,,,-0%-V-v-.M.\k..7.a/t/OM0@0Y0#81\1o1B11111 2 22"232 D2P2AU222222%2L3k333333*3 )4J4#d4$4#4!4 4#5 853Y55*5$5 5&6!>6`6~6"66 6 666,68"7[70u7$777$7'888$P8'u8888"88#969T9s9 99!99 :$':#L:$p:#:::!:;"0;S;p;;; ;;< <6<><+U<<<'<&<=!=7=J=\=w===+== > >*>B>E>X> r> |>"> >f>?0?6?R? l???????,@ @@@(@A2A 8ACA TA`A gA sA~AA"A.A-B0BKBcB&|BBBBBC" CCC!\C~C"CC,CD1 D$RD%wDDD/D<DEE #E-E5E >E KE;WEE:#F^F0zF=F;F>%G;dG5GGmHH9@I,zII.qJ-J!J JJK!K &K0KFK!eKK)K>K#L/+L0[LL-LLL* M(7M#`M'M'M"MM N /N PN!qN$NNN)NNNOO'O/O"6O YOdOkO/tOOO#OO/P:?P zP P PPPP PP5P"Q9:Q:tQ/QQQ Q QRR%R+R1R+PR"|R(RRR#R S:SKSRScSuSSSSSSSTT(T ~-+7+Q/}6$6 (@9i./Ґ/.2.a30đ.:$0_/ ˒ܒ #.)X _Zi7ēg+dM    :! \"ib /"%R!x#T*!>`(~&"Η& ?3.s3W֘5.-d&9= 1RIlʚ* &4K]p %қ4$-%R x! ֜+4% Zdv ѝ ߝ0!9R; ȞӞ  ٟ12Lh:q2PP/ ѡۡ ' 13<p % ٢" !C"e" ģ,",&O(v$Ĥ/<l [+/7O&!Ц ) ,7d#ŧ ' <bG41ߨ $ABF;˩0;8>t(@ܪ;$Y,~',ӫG9H@3ìY6QO.ح/.7(f5PŮ#0:Tk7?D8C}C7#='aD-α6&S?zS)I828)5VNY*"*>M7+ĵ+c!99ܶ:7Q-30*88c6,Ӹ-C.4r3'۹+./B^A?-#&Q$x17ϻ='E0m3.Ҽ$&&<M<;ǽTSX4+7 HE_QS@6CHAXF=74W:8<K=;dE*CpFM.IKx:/2/5bI<69V+;?%Me0?"$1G y      ,5C y q00%a N ' Hdi/q k v,),@A\ #!).7OU\4c!) &", O Z h8t)#   +9?0S%"!!/.^} N [1?)8i//7WwD<Y<:-5A"w = $.=L]-l !(-* Hi??, Z64"+!:)\!)!)!)@ j("*  !:AHIX    %!Ce L_9n  #) +$0P&$ z b n x           *6 ? K W a n z          * 5CU]#l3  ( FRb s ~ 1%NW l+v/   #:P f q .727Q-*$!$F"k28-& Ta$jI $$'L8`(    !( >AJ+$E >L S=_ +''*@_x(&-BRn%&%-S%q%%%=c%%%  /;DTi~  >4  &8?N`+z(++H'+p      :H]0l+ $0 8E[ r~ C " 6AVJ   6<sz~  4Ty@FICK. (RE  ,9YV%$!- OYl9:RYh[o    ^1% /(X'`3,Qg}" $76\0#,07SZb ky $#01'<Y -49 ? M[z)# #-#Q#u.   + ; D :W 4 '   $ = U m    <: 3w D  w  ' 5 G 2W   /  ;Vo 5Pjk6Oi8E~'  :Y w%2 )#M]q8neP<:NnEw>[v-U5,Dqv  v]tx({&g54E:H/-84/O+*30 C;'@1/3J8~460# T q    / M 5!5U!+!!!$!'!$"$<"'a""""#" "'#&6#$]##$##&#%$$+$(P$)y$($)$$ %%7% ]%'~%$%!%*%&,8&#e&&& &&3&-'M'/g'-'8''(0(D(%a(+((A()%)25)h)))$)))9) *)****+$2+W+`+w++ ++H, ,,,& -$4-Y- _-k- {-- - ---$-6.58.n...)../#/B/^/!~//#/ ///.00J0 {040(0*0%1*10-1\^1 1 1 1 1 11 2H2a2L3,d303Y3W4Zt4W4U'5}5$ 6/6G7-d77B8M819H90`9999$9090 :!::0\:\:+:@;FW;6;5;+ <!7<8Y<0<0<3<3(=+\="=-=4=)>38>2l> >>2>>> ??)?2?'G? o?z??6???2?1$@NV@K@ @ @ AA7-AeA lAxAAA,ALARGHGPGXG`GhGnGvG~GGGGG G GG G G GGG GG H H H/H3H8H=HBH)KHuH{H H HHH HH HH H HHI I""IEINIVI]I*aIIIII I9I5 J@J_J fJrJ {JJJ JJHJ$K%K,K;KPK_KpK,KKKKKAK&L,L 3L>LDL8KL LLL LL LL*LM M)M9M$NM!sMM%M M M M+M2N PN^NOL>O0OOOOO}yPV$_vF1(x: <L9:;5{6?N;Dvbj}3j{n |ps( Il,S!]Zdx+K!|`O'Hxt+>vU-~Uo(x7ce^7?G/w@#)8 wKy3>G`9pV$d&C$ b0Rp }e'{? u0fXr.iuQzgN|eGtJ35FBP<"5W_|:rq  T&ejBnc/][mCYa(A/|%V7-:[r 8Yl>q1S-2F)>Np&{ /TbaME6j=XUEk IMctqwv> rzgLQ._8]2 ~%0Q9('=$?.38zzPkTC3 @cj(!InfZZfn9 *ZLCO;wlr(NF*GRBYON)  i" 43]p{<m  kxh)dHuw_ ~a ;2  -P7"7W,+ hoWgE!A`V9)uZ;5yaI~,Y0/Sv=# hK@G+MLYAdAupV pR 0?,sDd<$0~\kcj6d,1kzl%teQvO=EU'BF&nqOyw\ U:`6o`i ^.r X, }YulseTm7-|uG6ohEA "TsGW+JzoKf<^V([rL@K@%*Cqb\C")QagG.b2!O;,#n7L}WHas?14wfN+t*g 1yt\Kq9h2m*8F%H:5iJy.59Ig8+Mq^ KXx}UJ\)Q-};ERd[4T{C*kA"SYce lt\P1xD9jsp[/E>NoIFnsU`[]^iv'RWaTH$X*JWB0ofgT\] `2=6RL#LSySRq1v< X4lOXzbMQ4\rD=-yD3&h ]O R0eD.&M_4`2|. VEm{;_/B  X@bozm=$M*I8KiZP]&i)Amg4f_'-i% d~b%YW#D!|&?_j>SHk":'hM<A [D$#!56u!S>BJ<w2F#k#f:P?}aJI{Vt6~c'UP,^n%Z7Hc8/3 mJChN5[^x1"HZ=~l@QB+4@s^ Please send this report to the program maintainer, thank you! Thank you and we're sorry for the inconvenience! (copy %d of %d) (error %ld: %s) (in module "%s") - Preview bold extra bold extra heavy extra light heavy italic light medium semi bold strikethrough thin#10 Envelope, 4 1/8 x 9 1/2 in#11 Envelope, 4 1/2 x 10 3/8 in#12 Envelope, 4 3/4 x 11 in#14 Envelope, 5 x 11 1/2 in#9 Envelope, 3 7/8 x 8 7/8 in%%d of %lu%i of %u%ld byte%ld bytes%lu of %lu%s (%d items)%s (or %s)%s Error%s Information%s Preferences%s Warning%s did not fit the tar header for entry '%s'%s files (%s)|%s%u of %u&About&Actual Size&After a paragraph:&Alignment&Apply&Apply Style&Arrange Icons&Ascending&Back&Based on:&Before a paragraph:&Bg colour:&Blur distance:&Bold&Bottom&Bottom:&Box&Bullet style:&CD-ROM&Cancel&Cascade&Cell&Character code:&Clear&Close&Color&Colour:&Convert&Copy&Copy URL&Customize...&Debug report preview:&Delete&Delete Style...&Descending&Details&Down&Edit&Edit Style...&Execute&File&Find...&Finish&First&Floating mode:&Floppy&Font&Font family:&Font for Level...&Font:&Forward&From:&Harddisk&Height:&Help&Hide details&Home&Horizontal offset:&Indentation (tenths of a mm)&Indeterminate&Index&Info&Italic&Jump to&Justified&Last&Left&Left:&List level:&Log&Move&Move the object to:&Network&New&Next&Next >&Next Paragraph&Next Tip&Next style:&No&Notes:&Number:&OK&Open...&Outline level:&Page Break&Paste&Picture&Point size:&Position (tenths of a mm):&Position mode:&Preferences&Previous&Previous Paragraph&Print...&Properties&Quit&Redo&Redo &Rename Style...&Replace&Restart numbering&Restore&Right&Right:&Save&See details&Show tips at startup&Size&Size:&Skip&Spacing (tenths of a mm)&Spell Check&Stop&Strikethrough&Style:&Styles:&Subset:&Symbol:&Synchronize values&Table&Top&Top:&Underline&Underlining:&Undo&Undo &Unindent&Up&Vertical alignment:&Vertical offset:&View...&Weight:&Width:&Window&Yes'%s' contains invalid character(s)'%s' has extra '..', ignored.'%s' is not a correct numeric value for option '%s'.'%s' is not a valid message catalog.'%s' is not one of the valid strings'%s' is one of the invalid strings'%s' is probably a binary buffer.(*)(Help)(None)(Normal text)(bookmarks)(error %d: %s)(none)**)+, 64-bit edition-...1.11.21.31.41.51.61.71.81.910 x 11 in10 x 14 in11 x 17 in12 x 11 in15 x 11 in26 3/4 Envelope, 3 5/8 x 6 1/2 in9 x 11 in: file does not exist!: unknown charset: unknown encoding< &BackBold italic face.
bold italic underlined
Bold face. Italic face. >A debug report has been generated in the directory A debug report has been generated. It can be found inA non empty collection must consist of 'element' nodesA standard bullet name.A0 sheet, 841 x 1189 mmA1 sheet, 594 x 841 mmA2 420 x 594 mmA3 Extra 322 x 445 mmA3 Extra Transverse 322 x 445 mmA3 Rotated 420 x 297 mmA3 Transverse 297 x 420 mmA3 sheet, 297 x 420 mmA4 Extra 9.27 x 12.69 inA4 Plus 210 x 330 mmA4 Rotated 297 x 210 mmA4 Transverse 210 x 297 mmA4 sheet, 210 x 297 mmA4 small sheet, 210 x 297 mmA5 Extra 174 x 235 mmA5 Rotated 210 x 148 mmA5 Transverse 148 x 210 mmA5 sheet, 148 x 210 mmA6 105 x 148 mmA6 Rotated 148 x 105 mmABCDEFGabcdefg12345ASCIIAboutAbout %sAbsoluteActiveBorderActiveCaptionActual SizeAddAdd ColumnAdd RowAdd current page to bookmarksAdd to custom coloursAddToPropertyCollection called on a generic accessorAddToPropertyCollection called w/o valid adderAdding book %sAdvancedAfter a paragraph:Align LeftAlign RightAlignmentAllAll files (%s)|%sAll files (*)|*All files (*.*)|*.*All stylesAlphabetic ModeAlready Registered Object passed to SetObjectClassInfoAlready dialling ISP.Alt+An optional corner radius for adding rounded corners.And includes the following files: Animation file is not of type %ld.AppWorkspaceAppend log to file '%s' (choosing [No] will overwrite it)?ApplicationApplyAquaArabicArabic (ISO-8859-6)Argument %u not found.ArtistsAscendingAttributesAvailable fonts.B4 (ISO) 250 x 353 mmB4 (JIS) Rotated 364 x 257 mmB4 Envelope, 250 x 353 mmB4 sheet, 250 x 354 mmB5 (ISO) Extra 201 x 276 mmB5 (JIS) Rotated 257 x 182 mmB5 (JIS) Transverse 182 x 257 mmB5 Envelope, 176 x 250 mmB5 sheet, 182 x 257 millimeterB6 (JIS) 128 x 182 mmB6 (JIS) Rotated 182 x 128 mmB6 Envelope, 176 x 125 mmBMP: Couldn't allocate memory.BMP: Couldn't save invalid image.BMP: Couldn't write RGB color map.BMP: Couldn't write data.BMP: Couldn't write the file (Bitmap) header.BMP: Couldn't write the file (BitmapInfo) header.BMP: wxImage doesn't have own wxPalette.BackBackgroundBackground &colour:Background colourBaltic (ISO-8859-13)Baltic (old) (ISO-8859-4)Before a paragraph:BitmapBlackBlueBlue:BoldBorderBordersBottomBottom margin (mm):Box PropertiesBox stylesBring All to FrontBrownBrowseBullet &Alignment:Bullet styleBulletsButtonFaceButtonHighlightButtonShadowButtonTextC sheet, 17 x 22 inC&learC&olour:C3 Envelope, 324 x 458 mmC4 Envelope, 229 x 324 mmC5 Envelope, 162 x 229 mmC6 Envelope, 114 x 162 mmC65 Envelope, 114 x 229 mmCD-ROMCHM handler currently supports only local files!Ca&pitalsCan't &Undo Can't automatically determine the image format for non-seekable input.Can't close registry key '%s'Can't copy values of unsupported type %d.Can't create registry key '%s'Can't create threadCan't delete key '%s'Can't delete the INI file '%s'Can't delete value '%s' from key '%s'Can't enumerate subkeys of key '%s'Can't enumerate values of key '%s'Can't export value of unsupported type %d.Can't find current position in file '%s'Can't get info about registry key '%s'Can't get the JavaScript objectCan't initialize zlib deflate stream.Can't initialize zlib inflate stream.Can't monitor non-existent directory "%s" for changes.Can't open registry key '%s'Can't read from inflate stream: %sCan't read inflate stream: unexpected EOF in underlying stream.Can't read value of '%s'Can't read value of key '%s'Can't run JavaScript script without a valid HTML documentCan't save image to file '%s': unknown extension.Can't save log contents to file.Can't set thread priorityCan't set value of '%s'Can't write to child process's stdinCan't write to deflate stream: %sCancelCannot enumerate files '%s'Cannot enumerate files in directory '%s'Cannot find active dialup connection: %sCannot find the location of address book fileCannot get an active instance of "%s"Cannot get priority range for scheduling policy %d.Cannot get the hostnameCannot get the official hostnameCannot hang up - no active dialup connection.Cannot initialize OLECannot initialize socketsCannot load icon from '%s'.Cannot load resources from '%s'.Cannot load resources from file '%s'.Cannot open HTML document: %sCannot open HTML help book: %sCannot open contents file: %sCannot open file for PostScript printing!Cannot open index file: %sCannot open resources file '%s'.Cannot print empty page.Cannot read typename from '%s'!Cannot resume thread %lxCannot retrieve thread scheduling policy.Cannot set locale to language "%s".Cannot start thread: error writing TLS.Cannot suspend thread %lxCannot wait for thread terminationCaptionTextCase sensitiveCategorized ModeCell PropertiesCeltic (ISO-8859-14)Cen&tredCenteredCentral European (ISO-8859-2)CentreCentre text.CentredCh&oose...Change List StyleChange Object StyleChange PropertiesChange StyleChanges won't be saved to avoid overwriting the existing file "%s"Changing current directory to "%s" failedCharacter stylesCheck to add a period after the bullet.Check to add a right parenthesis.Check to edit all borders simultaneously.Check to enclose the bullet in parentheses.Check to indicate right-to-left text layout.Check to make the font bold.Check to make the font italic.Check to make the font underlined.Check to restart numbering.Check to show a line through the text.Check to show the text in capitals.Check to show the text in small capitals.Check to show the text in subscript.Check to show the text in superscript.Check to suppress hyphenation.Choose ISP to dialChoose a directory:Choose a fileChoose colourChoose fontCircular dependency involving module "%s" detected.Cl&oseClass not registered.ClearClear the log contentsClick to apply the selected style.Click to browse for a symbol.Click to cancel changes to the font.Click to cancel the font selection.Click to change the font colour.Click to change the text background colour.Click to change the text colour.Click to choose the font for this level.Click to close this window.Click to confirm changes to the font.Click to confirm the font selection.Click to create a new box style.Click to create a new character style.Click to create a new list style.Click to create a new paragraph style.Click to create a new tab position.Click to delete all tab positions.Click to delete the selected style.Click to delete the selected tab position.Click to edit the selected style.Click to rename the selected style.CloseClose AllClose current documentClose this windowCollapseColorColourColour selection dialog failed with error %0lx.Colour:Column %uCommand line argument %d couldn't be converted to Unicode and will be ignored.Common dialog failed with error code %0lx.Compositing not supported by this system, please enable it in your Window Manager.Compressed HTML Help file (*.chm)|*.chm|ComputerConfig entry name cannot start with '%c'.ConfirmConnecting...ContentsControlDarkControlLightConversion to charset '%s' doesn't work.ConvertCopied to clipboard:"%s"Copies:CopyCopy selectionCopying more than one selected block to clipboard is not supported.CornerCorner &radius:Could not create temporary file '%s'Could not extract %s into %s: %sCould not find tab for idCould not locate file '%s'.Could not register custom DirectWrite font loader.Could not set current working directoryCould not start document preview.Could not start printing.Could not transfer data to windowCouldn't add an image to the image list.Couldn't create OpenGL contextCouldn't create a timerCouldn't enumerate translationsCouldn't find symbol '%s' in a dynamic libraryCouldn't get the current thread pointerCouldn't initialize GIF hash table.Couldn't load a PNG image - file is corrupted or not enough memory.Couldn't load sound data from '%s'.Couldn't obtain folder nameCouldn't open audio: %sCouldn't register clipboard format '%s'.Couldn't retrieve information about list control item %d.Couldn't save PNG image.Couldn't terminate threadCreate Parameter %s not found in declared RTTI ParametersCreate directoryCreate new directoryCreate new documentCreating %s "%s" failed.Cu&tCurrent directory:CustomCustom sizeCustomize ColumnsCutCut selectionCyrillic (ISO-8859-5)D sheet, 22 x 34 inDDE poke request failedDIB Header: Encoding doesn't match bitdepth.DIB Header: Image height > 32767 pixels for file.DIB Header: Image width > 32767 pixels for file.DIB Header: Unknown bitdepth in file.DIB Header: Unknown encoding in file.DL Envelope, 110 x 220 mmDashedDebug report "%s"Debug report couldn't be created.Debug report generation has failed.DecorativeDefault encodingDefault fontDefault printerDeleteDelete A&llDelete ColumnDelete RowDelete StyleDelete TextDelete itemDelete selectionDelete style %s?Deleted stale lock file '%s'.Deleting password for "%s" failed: %s.Dependency "%s" of module "%s" doesn't exist.DescendingDesktopDeveloped by DevelopersDial up functions are unavailable because the remote access service (RAS) is not installed on this machine. Please install it.Did you know...DirectFB error %d occurred.DirectoriesDirectory '%s' couldn't be createdDirectory '%s' couldn't be deletedDirectory does not existDirectory doesn't exist.Discard changes and reload the last saved version?Display all index items that contain given substring. Search is case insensitive.Display options dialogDisplays help as you browse the books on the left.Do you want to save changes to %s?Document:Documentation by Documentation writersDon't SaveDoneDone.DottedDoubleDouble Japanese Postcard Rotated 148 x 200 mmDoubly used id : %dDownDragE sheet, 34 x 44 inEOF while reading from inotify descriptorEditEdit itemElapsed time:Enable the height value.Enable the maximum width value.Enable the minimum height value.Enable the minimum width value.Enable the width value.Enable vertical alignment.Enables a background colour.Enables a shadow.Enables the blur distance.Enables the shadow colour.Enables the shadow opacity.Enables the shadow spread.Enter a box style nameEnter a character style nameEnter a list style nameEnter a new style nameEnter a paragraph style nameEnter command to open file "%s":Entries foundEnvelope Invite 220 x 220 mmEnvironment variables expansion failed: missing '%c' at position %u in '%s'.ErrorError closing epoll descriptorError closing kqueue instanceError copying the file '%s' to '%s'.Error creating directoryError in reading image DIB.Error in resource: %sError reading config options.Error running JavaScript: %sError saving user configuration data.Error while printing: Error: Error: %s (%d)Esperanto (ISO-8859-3)Estimated time:Executable files (*.exe)|*.exe|ExecuteExecution of command '%s' failedExecutive, 7 1/4 x 10 1/2 inExpandExporting registry key: file "%s" already exists and won't be overwritten.Extended Unix Codepage for Japanese (EUC-JP)Extraction of '%s' into '%s' failed.Face NameFailed to access lock file.Failed to add custom font "%s".Failed to add descriptor %d to epoll descriptor %dFailed to allocate %luKb of memory for bitmap data.Failed to allocate colour for OpenGLFailed to allocate memory for LZMA compression.Failed to allocate memory for LZMA decompression.Failed to change video modeFailed to check format of image file "%s".Failed to clean up debug report directory "%s"Failed to close file handleFailed to close lock file '%s'Failed to close the clipboard.Failed to close the display "%s"Failed to connect: missing username/password.Failed to connect: no ISP to dial.Failed to copy dialog contents to the clipboard.Failed to copy registry value '%s'Failed to copy the contents of registry key '%s' to '%s'.Failed to copy the file '%s' to '%s'Failed to copy the registry subkey '%s' to '%s'.Failed to create DDE stringFailed to create MDI parent frame.Failed to create a temporary file nameFailed to create an anonymous pipeFailed to create an instance of "%s"Failed to create connection to server '%s' on topic '%s'Failed to create cursor.Failed to create directory "%s"Failed to create directory '%s' (Do you have the required permissions?)Failed to create epoll descriptorFailed to create font configuration object.Failed to create registry entry for '%s' files.Failed to create the standard find/replace dialog (error code %d)Failed to create wake up pipe used by event loop.Failed to display HTML document in %s encodingFailed to empty the clipboard.Failed to enumerate video modesFailed to establish an advise loop with DDE serverFailed to establish dialup connection: %sFailed to execute '%s' Failed to execute curl, please install it in PATH.Failed to find CLSID of "%s"Failed to find match for regular expression: %sFailed to find web view emulation level in the registryFailed to get ISP names: %sFailed to get OLE automation interface for "%s"Failed to get data from the clipboardFailed to get the local system timeFailed to get the working directoryFailed to initialize GUI: no built-in themes found.Failed to initialize LZMA compression: unexpected error %u.Failed to initialize LZMA decompression: unexpected error %u.Failed to initialize MS HTML Help.Failed to initialize OpenGLFailed to initiate dialup connection: %sFailed to insert text in the control.Failed to inspect the lock file '%s'Failed to install signal handlerFailed to join a thread, potential memory leak detected - please restart the programFailed to kill process %dFailed to load bitmap "%s" from resources.Failed to load icon "%s" from resources.Failed to load icons from resource '%s'.Failed to load image %%d from file '%s'.Failed to load image %d from stream.Failed to load image from file "%s".Failed to load metafile from file "%s".Failed to load mpr.dll.Failed to load resource "%s".Failed to load shared library '%s'Failed to load sound from "%s" (error %d).Failed to lock resource "%s".Failed to lock the lock file '%s'Failed to modify descriptor %d in epoll descriptor %dFailed to modify file times for '%s'Failed to monitor I/O channelsFailed to open '%s' for readingFailed to open '%s' for writingFailed to open CHM archive '%s'.Failed to open URL "%s" in default browser.Failed to open URL "%s" in the default browserFailed to open directory "%s" for monitoring.Failed to open display "%s".Failed to open temporary file.Failed to open the clipboard.Failed to parse Plural-Forms: '%s'Failed to prepare playing "%s".Failed to put data on the clipboardFailed to read PID from lock file.Failed to read config options.Failed to read document from the file "%s".Failed to read event from DirectFB pipeFailed to read from wake-up pipeFailed to read text file "%s".Failed to redirect child process input/outputFailed to redirect the child process IOFailed to register DDE server '%s'Failed to register font configuration using private fonts.Failed to remember the encoding for the charset '%s'.Failed to remove debug report file "%s"Failed to remove lock file '%s'Failed to remove stale lock file '%s'.Failed to rename registry value '%s' to '%s'.Failed to rename the file '%s' to '%s' because the destination file already exists.Failed to rename the registry key '%s' to '%s'.Failed to reset web view to standard emulation levelFailed to retrieve file times for '%s'Failed to retrieve text of RAS error messageFailed to retrieve the supported clipboard formatsFailed to save document to the file "%s".Failed to save the bitmap image to file "%s".Failed to send DDE advise notificationFailed to set FTP transfer mode to %s.Failed to set clipboard data.Failed to set permissions on lock file '%s'Failed to set process priorityFailed to set temporary file permissionsFailed to set thread concurrency level to %luFailed to set thread priority %d.Failed to set up non-blocking pipe, the program might hang.Failed to set web view to modern emulation levelFailed to store image '%s' to memory VFS!Failed to switch DirectFB pipe to non-blocking modeFailed to switch wake up pipe to non-blocking modeFailed to terminate a thread.Failed to terminate the advise loop with DDE serverFailed to terminate the dialup connection: %sFailed to touch the file '%s'Failed to unload shared libraryFailed to unlock lock file '%s'Failed to unregister DDE server '%s'Failed to unregister descriptor %d from epoll descriptor %dFailed to update user configuration file.Failed to upload the debug report (error code %d).Failed to write to lock file '%s'FalseFamilyFatal ErrorFileFile "%s" could not be opened for reading.File "%s" could not be opened for writing.File '%s' already exists, do you really want to overwrite it?File '%s' couldn't be removedFile '%s' couldn't be renamed '%s'File couldn't be loaded.File dialog failed with error code %0lx.File errorFile name exists already.File type:FilesFiles (%s)FilterFindFind and replace in documentFind in documentFind...FirstFirst pageFixedFixed font:Fixed size face.
bold italic FloatingFloppyFolio, 8 1/2 x 13 inFontFont &weight:Font file "%s" cannot be used as it is not inside the font directory "%s".Font file "%s" couldn't be loadedFont file "%s" doesn't exist.Font size:Font st&yle:Font:Fonts index file %s disappeared while loading fonts.Fork failedForwardForward hrefs are not supportedFound %i matchesFrom:FuchsiaGIF: data stream seems to be truncated.GIF: error in GIF image format.GIF: not enough memory.GTK+ installed on this machine is too old to support screen compositing, please install GTK+ 2.12 or later.GTK+ themeGeneralGeneric PostScriptGerman Legal Fanfold, 8 1/2 x 13 inGerman Std Fanfold, 8 1/2 x 12 inGetProperty called w/o valid getterGetPropertyCollection called on a generic accessorGetPropertyCollection called w/o valid collection getterGo backGo forwardGo one level up in document hierarchyGo to home directoryGo to parent directoryGraphics art by GrayGrayTextGreek (ISO-8859-7)GreenGreen:GrooveGzip not supported by this version of zlibHTML Help Project (*.hhp)|*.hhp|HTML anchor %s does not exist.HTML files (*.html;*.htm)|*.html;*.htm|HarddiskHebrew (ISO-8859-8)HelpHelp Browser OptionsHelp IndexHelp PrintingHelp TopicsHelp books (*.htb)|*.htb|Help books (*.zip)|*.zip|Help directory "%s" not found.Help file "%s" not found.Help: %sHide this notification message.HighlightHighlightTextHomeHome directoryHow the object will float relative to the text.ICO: Error in reading mask DIB.ICO: Error writing the image file!ICO: Image too tall for an icon.ICO: Image too wide for an icon.ICO: Invalid icon index.IFF: data stream seems to be truncated.IFF: error in IFF image format.IFF: not enough memory.IFF: unknown error!!!ISO-2022-JPIf possible, try changing the layout parameters to make the printout more narrow.If you have any additional information pertaining to this bug report, please enter it here and it will be joined to it:If you wish to suppress this debug report completely, please choose the "Cancel" button, but be warned that it may hinder improving the program, so if at all possible please do continue with the report generation. Ignoring malformed extra data record, ZIP file may be corruptedIgnoring value "%s" of the key "%s".Illegal Object Class (Non-wxEvtHandler) as Event SourceIllegal Parameter Count for ConstructObject MethodIllegal Parameter Count for Create MethodIllegal directory name.Illegal file specification.Image and mask have different sizes.Image file is not of type %d.Image is not of type %s.Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dllImpossible to get child process inputImpossible to get permissions for file '%s'Impossible to overwrite the file '%s'Impossible to set permissions for the file '%s'InactiveBorderInactiveCaptionInactiveCaptionTextIncorrect GIF frame size (%u, %d) for the frame #%uIncorrect number of arguments.IndentIndents && SpacingIndexIndian (ISO-8859-12)InfoInitialization failed in post init, aborting.InsertInsert FieldInsert ImageInsert ObjectInsert TextInserts a page break before the paragraph.InsetInvalid TIFF image index.Invalid display mode specification '%s'.Invalid geometry specification '%s'Invalid inotify event for "%s"Invalid lock file '%s'.Invalid message catalog.Invalid or Null Object ID passed to GetObjectClassInfoInvalid or Null Object ID passed to HasObjectClassInfoInvalid regular expression '%s': %sInvalid value %ld for a boolean key "%s" in config file.ItalicItaly Envelope, 110 x 230 mmJPEG: Couldn't load - file is probably corrupted.JPEG: Couldn't save image.Japanese Double Postcard 200 x 148 mmJapanese Envelope Chou #3Japanese Envelope Chou #3 RotatedJapanese Envelope Chou #4Japanese Envelope Chou #4 RotatedJapanese Envelope Kaku #2Japanese Envelope Kaku #2 RotatedJapanese Envelope Kaku #3Japanese Envelope Kaku #3 RotatedJapanese Envelope You #4Japanese Envelope You #4 RotatedJapanese Postcard 100 x 148 mmJapanese Postcard Rotated 148 x 100 mmJump toJustifiedJustify text left and right.KOI8-RKOI8-UL&ine spacing:LZMA compression error when flushing output: %sLZMA compression error: %sLZMA decompression error: %sLandscapeLastLast pageLast repeated message ("%s", %u time) wasn't outputLast repeated message ("%s", %u times) wasn't outputLedger, 17 x 11 inLeftLeft (&first line):Left margin (mm):Left-align text.Legal Extra 9 1/2 x 15 inLegal, 8 1/2 x 14 inLetter Extra 9 1/2 x 12 inLetter Extra Transverse 9.275 x 12 inLetter Plus 8 1/2 x 12.69 inLetter Rotated 11 x 8 1/2 inLetter Small, 8 1/2 x 11 inLetter Transverse 8 1/2 x 11 inLetter, 8 1/2 x 11 inLicenseLightLimeLine %lu of map file "%s" has invalid syntax, skipped.Line spacing:Link contained '//', converted to absolute link.List StyleList stylesLists font sizes in points.Lists the available fonts.Load %s fileLoading : Lock file '%s' has incorrect owner.Lock file '%s' has incorrect permissions.Log saved to the file '%s'.Lower case lettersLower case roman numeralsMDI childMS HTML Help functions are unavailable because the MS HTML Help library is not installed on this machine. Please install it.Ma&ximizeMacArabicMacArmenianMacBengaliMacBurmeseMacCelticMacCentralEurRomanMacChineseSimpMacChineseTradMacCroatianMacCyrillicMacDevanagariMacDingbatsMacEthiopicMacExtArabicMacGaelicMacGeorgianMacGreekMacGujaratiMacGurmukhiMacHebrewMacIcelandicMacJapaneseMacKannadaMacKeyboardGlyphsMacKhmerMacKoreanMacLaotianMacMalayalamMacMongolianMacOriyaMacRomanMacRomanianMacSinhaleseMacSymbolMacTamilMacTeluguMacThaiMacTibetanMacTurkishMacVietnameseMake a selection:MarginsMaroonMatch caseMax height:Max width:Media playback error: %sMemory VFS already contains file '%s'!MenuMessageMetal themeMethod or property not found.Mi&nimizeMin height:Min width:MinimizeMissing a required parameter.ModernModifiedModule "%s" initialization failedMonarch Envelope, 3 7/8 x 7 1/2 inMonitoring individual files for changes is not supported currently.Move downMove upMoves the object to the next paragraph.Moves the object to the previous paragraph.Multiple Cell PropertiesNameNavyNetworkNewNew &Box Style...New &Character Style...New &List Style...New &Paragraph Style...New StyleNew itemNewNameNext pageNoNo animation handler for type %ld defined.No bitmap handler for type %d defined.No default application configured for HTML files.No entries found.No font for displaying text in encoding '%s' found, but an alternative encoding '%s' is available. Do you want to use this encoding (otherwise you will have to choose another one)?No font for displaying text in encoding '%s' found. Would you like to select a font to be used for this encoding (otherwise the text in this encoding will not be shown correctly)?No handler found for animation type.No handler found for image type.No image handler for type %d defined.No image handler for type %s defined.No matching page found yetNo soundNo unused colour in image being masked.No valid mappings found in the file "%s".NoneNordic (ISO-8859-10)NormalNormal face
and underlined. Normal font:Not %sNot available for this platformNot enough free disk space for download.Not underlinedNote, 8 1/2 x 11 inNoticeNumbered outlineOKOLE Automation error in %s: %sObject PropertiesObject implementation does not support named arguments.Objects must have an id attributeOliveOpaci&ty:Opacity:Open FileOpen HTML documentOpen an existing documentOpen file "%s"Open...OpenGL 3.0 or later is not supported by the OpenGL driver.Operation not permitted.Option '%s' can't be negatedOption '%s' requires a value.Option '%s': '%s' cannot be converted to a date.OptionsOrangeOrientationOut of window IDs. Recommend shutting down application.OutlineOutsetOverflow while coercing argument values.PCX: couldn't allocate memoryPCX: image format unsupportedPCX: invalid imagePCX: this is not a PCX file.PCX: unknown error !!!PCX: version number too lowPNM: Couldn't allocate memory.PNM: File format is not recognized.PNM: File seems truncated.PRC 16K 146 x 215 mmPRC 16K RotatedPRC 32K 97 x 151 mmPRC 32K RotatedPRC 32K(Big) 97 x 151 mmPRC 32K(Big) RotatedPRC Envelope #1 102 x 165 mmPRC Envelope #1 Rotated 165 x 102 mmPRC Envelope #10 324 x 458 mmPRC Envelope #10 Rotated 458 x 324 mmPRC Envelope #2 102 x 176 mmPRC Envelope #2 Rotated 176 x 102 mmPRC Envelope #3 125 x 176 mmPRC Envelope #3 Rotated 176 x 125 mmPRC Envelope #4 110 x 208 mmPRC Envelope #4 Rotated 208 x 110 mmPRC Envelope #5 110 x 220 mmPRC Envelope #5 Rotated 220 x 110 mmPRC Envelope #6 120 x 230 mmPRC Envelope #6 Rotated 230 x 120 mmPRC Envelope #7 160 x 230 mmPRC Envelope #7 Rotated 230 x 160 mmPRC Envelope #8 120 x 309 mmPRC Envelope #8 Rotated 309 x 120 mmPRC Envelope #9 229 x 324 mmPRC Envelope #9 Rotated 324 x 229 mmPaddingPage %dPage %d of %dPage SetupPage setupPagesPaper sizeParagraph stylesPassing a already registered object to SetObjectPassing an unknown object to GetObjectPassword:PastePaste selectionPeri&odPermissionsPicture PropertiesPipe creation failedPlease choose a valid font.Please choose an existing file.Please choose the page to display:Please choose which ISP do you want to connect toPlease select the columns to show and define their order:Please wait while printing...Point SizePortraitPositionPostScript filePreferencesPreparingPreview:Previous pagePrintPrint PreviewPrint Preview FailurePrint RangePrint SetupPrint in colourPrint operation could not be initializedPrint previe&w...Print preview creation failed.Print preview...Print spoolingPrint this pagePrint to FilePrint...PrinterPrinter command:Printer optionsPrinter options:Printer...Printer:PrintingPrinting Printing ErrorPrinting is not supported by the system web controlPrinting page %dPrinting page %d of %dPrinting page %d...Printing...PrintoutProcessing debug report has failed, leaving the files in "%s" directory.Progress:PropertiesPropertyProperty ErrorPurpleQuarto, 215 x 275 mmQuestionQuitQuit this programRead error on file '%s'Reading password for "%s" failed: %s.ReadyRedRed:RedoRedo last actionRefreshRegistry key '%s' already exists.Registry key '%s' does not exist, cannot rename it.Registry key '%s' is needed for normal system operation, deleting it will leave your system in unusable state: operation aborted.Registry value "%s" is not binary (but of type %s)Registry value "%s" is not numeric (but of type %s)Registry value "%s" is not text (but of type %s)Registry value '%s' already exists.RegularRelativeRelevant entries:Remaining time:RemoveRemove BulletRemove current page from bookmarksRenderer "%s" has incompatible version %d.%d and couldn't be loaded.Renumber ListRep&lace...ReplaceReplace &allReplace with:Replace...Required information entry is empty.Resource '%s' is not a valid message catalog.Retrieving JavaScript script output is not supported with WebKit v1Revert to SavedRidgeRig&ht-to-leftRightRight margin (mm):Right-align text.RomanRow %iS&tandard bullet name:SaveSave %s fileSave &As...Save AsSave As...Save current documentSave current document with a different filenameSave log contents to fileSaving password for "%s" failed: %s.ScriptScrollbarSearchSearch contents of help book(s) for all occurrences of the text you typed aboveSearch directionSearch for:Search in all booksSearching...SectionsSeek error on file '%s'Seek error on file '%s' (large files not supported by stdio)Select &AllSelect AllSelect a document templateSelect a document viewSelect regular or bold.Select regular or italic style.Select underlining or no underlining.SelectionSelects the list level to edit.Separator expected after the option '%s'.Set Cell StyleSetProperty called w/o valid setterSetup...Several active dialup connections found, choosing one randomly.Sh&adow spread:ShadowShadow c&olour:Show &hidden directoriesShow &hidden filesShow about dialogShow allShow all items in indexShow/hide navigation panelShows a Unicode subset.Shows a preview of the bullet settings.Shows a preview of the font settings.Shows a preview of the font.Shows a preview of the paragraph settings.Shows the font preview.SilverSimple monochrome themeSingleSizeSize:SkipSlantSmall C&apitalsSolidSorry, could not open this file.Sorry, not enough memory to create a preview.Sorry, that name is taken. Please choose another.Sorry, the format for this file is unknown.Sound data are in unsupported format.Sound file '%s' is in unsupported format.SpacingSpell CheckStandardStatement, 5 1/2 x 8 1/2 inStaticStatus:StopStrikethroughString To Colour : Incorrect colour specification : %sStyleStyle:Subscrip&tSupe&rscriptSuperA/SuperA/A4 227 x 356 mmSuperB/SuperB/A3 305 x 487 mmSuppress hyphe&nationSwissSymbolSymbol &font:SymbolsTIFF: Couldn't allocate memory.TIFF: Error loading image.TIFF: Error reading image.TIFF: Error saving image.TIFF: Error writing image.TIFF: Image size is abnormally big.Table PropertiesTabloid Extra 11.69 x 18 inTabloid, 11 x 17 inTabsTealTeletypeTemplatesThai (ISO-8859-11)The FTP server doesn't support passive mode.The FTP server doesn't support the PORT command.The available bullet styles.The available styles.The background colour.The border line style.The bottom margin size.The bottom padding size.The bottom position.The bullet character.The character code.The charset '%s' is unknown. You may select another charset to replace it with or choose [Cancel] if it cannot be replacedThe clipboard format '%d' doesn't exist.The default style for the next paragraph.The directory '%s' does not exist Create it now?The document "%s" doesn't fit on the page horizontally and will be truncated if printed. Would you like to proceed with printing it nevertheless?The file '%s' doesn't exist and couldn't be opened. It has been removed from the most recently used files list.The first line indent.The following debug report will be generated The font colour.The font family.The font from which to take the symbol.The font point size.The font size in points.The font size units, points or pixels.The font style.The font weight.The format of file '%s' couldn't be determined.The horizontal offset.The left indent.The left margin size.The left padding size.The left position.The line spacing.The list item number.The locale ID is unknown.The object height.The object maximum height.The object maximum width.The object minimum height.The object minimum width.The object width.The outline level.The previous message repeated %u time.The previous message repeated %u times.The previous message repeated once.The range to show.The report contains the files listed below. If any of these files contain private information, please uncheck them and they will be removed from the report. The required parameter '%s' was not specified.The right indent.The right margin size.The right padding size.The right position.The shadow blur distance.The shadow colour.The shadow opacity.The shadow spread.The spacing after the paragraph.The spacing before the paragraph.The style name.The style on which this style is based.The style preview.The system cannot find the file specified.The tab position.The tab positions.The text couldn't be saved.The top margin size.The top padding size.The top position.The value for the option '%s' must be specified.The value of the corner radius.The version of remote access service (RAS) installed on this machine is too old, please upgrade (the following required function is missing: %s).The vertical offset.There was a problem during page setup: you may need to set a default printer.This document doesn't fit on the page horizontally and will be truncated when it is printed.This is not a %s.This platform does not support background transparency.This program was compiled with a too old version of GTK+, please rebuild with GTK+ 2.12 or newer.This program wasn't compiled with EGL support required under Wayland, either install EGL libraries and rebuild or run it under X11 backend by setting environment variable GDK_BACKEND=x11 before starting your program.Thread module initialization failed: cannot store value in thread local storageThread module initialization failed: failed to create thread keyThread module initialization failed: impossible to allocate index in thread local storageThread priority setting is ignored.Tile &HorizontallyTile &VerticallyTimeout while waiting for FTP server to connect, try passive mode.Tip of the DayTips not available, sorry!To:Too many EndStyle calls!TooltipTooltipTextTopTop margin (mm):Translations by TranslatorsTrueTrying to remove file '%s' from memory VFS, but it is not loaded!Turkish (ISO-8859-9)TypeType a font name.Type a size in points.Type mismatch in argument %u.Type must have enum - long conversionType operation "%s" failed: Property labeled "%s" is of type "%s", NOT "%s".US Std Fanfold, 14 7/8 x 11 inUS-ASCIIUnable to add inotify watchUnable to add kqueue watchUnable to associate handle with I/O completion portUnable to close I/O completion port handleUnable to close inotify instanceUnable to close path '%s'Unable to close the handle for '%s'Unable to create I/O completion portUnable to create IOCP worker threadUnable to create inotify instanceUnable to create kqueue instanceUnable to dequeue completion packetUnable to get events from kqueueUnable to initialize GTK+, is DISPLAY set properly?Unable to open path '%s'Unable to open requested HTML document: %sUnable to play sound asynchronously.Unable to post completion statusUnable to read from inotify descriptorUnable to remove inotify watch %iUnable to remove kqueue watchUnable to set up watch for '%s'Unable to start IOCP worker threadUndeleteUnderlineUnderlinedUndoUndo last actionUnexpected characters following option '%s'.Unexpected event for "%s": no matching watch descriptor.Unexpected parameter '%s'Unexpectedly new I/O completion port was createdUngraceful worker thread terminationUnicodeUnicode 16 bit (UTF-16)Unicode 16 bit Big Endian (UTF-16BE)Unicode 16 bit Little Endian (UTF-16LE)Unicode 32 bit (UTF-32)Unicode 32 bit Big Endian (UTF-32BE)Unicode 32 bit Little Endian (UTF-32LE)Unicode 7 bit (UTF-7)Unicode 8 bit (UTF-8)UnindentUnits for the bottom border width.Units for the bottom margin.Units for the bottom outline width.Units for the bottom padding.Units for the bottom position.Units for the corner radius.Units for the left border width.Units for the left margin.Units for the left outline width.Units for the left padding.Units for the left position.Units for the maximum object height.Units for the maximum object width.Units for the minimum object height.Units for the minimum object width.Units for the object height.Units for the object width.Units for the right border width.Units for the right margin.Units for the right outline width.Units for the right padding.Units for the right position.Units for the top border width.Units for the top margin.Units for the top outline width.Units for the top padding.Units for the top position.Units for this value.UnknownUnknown DDE error %08xUnknown Object passed to GetObjectClassInfoUnknown PNG resolution unit %dUnknown Property %sUnknown TIFF resolution unit %d ignoredUnknown base %d. Base 10 will be used.Unknown dynamic library errorUnknown encoding (%d)Unknown error %08xUnknown exceptionUnknown image data format.Unknown long option '%s'Unknown name or named argument.Unknown option '%s'Unmatched '{' in an entry for mime type %s.Unnamed commandUnspecifiedUnsupported clipboard format.Unsupported theme '%s'.UpUpper case lettersUpper case roman numeralsUsage: %sUse &shadowUse the current alignment setting.Username:Using private fonts is not supported on this system: Pango library is too old, 1.38 or later required.Validation conflictValueValue must be %s or higher.Value must be %s or less.Value must be between %s and %s.Version Vertical alignment.View files as a detailed viewView files as a list viewViewsWARNING: using XIM input method is unsupported and may result in problems with input handling and flickering. Consider unsetting GTK_IM_MODULE or setting to "ibus".Waiting for IO on epoll descriptor %d failedWarning: WeightWestern European (ISO-8859-1)Western European with Euro (ISO-8859-15)Whether the font is underlined.WhiteWhole wordWhole words onlyWin32 themeWindowWindowFrameWindowTextWindows Arabic (CP 1256)Windows Baltic (CP 1257)Windows Central European (CP 1250)Windows Chinese Simplified (CP 936) or GB-2312Windows Chinese Traditional (CP 950) or Big-5Windows Cyrillic (CP 1251)Windows Greek (CP 1253)Windows Hebrew (CP 1255)Windows Japanese (CP 932) or Shift-JISWindows Johab (CP 1361)Windows Korean (CP 949)Windows Thai (CP 874)Windows Turkish (CP 1254)Windows Vietnamese (CP 1258)Windows Western European (CP 1252)Windows/DOS OEM (CP 437)Windows/DOS OEM Cyrillic (CP 866)Write error on file '%s'XML parsing error: '%s' at line %dXPM: Malformed pixel data!XPM: incorrect colour description in line %dXPM: incorrect header format!XPM: malformed colour definition '%s' at line %d!XPM: no colors left to use for mask!XPM: truncated image data at line %d!YellowYesYou cannot add a new directory to this section.You have entered invalid value. Press ESC to cancel editing.ZoomZoom &InZoom &OutZoom InZoom OutZoom to &FitZoom to Fita DDEML application has created a prolonged race condition.a DDEML function was called without first calling the DdeInitialize function, or an invalid instance identifier was passed to a DDEML function.a client's attempt to establish a conversation has failed.a memory allocation failed.a parameter failed to be validated by the DDEML.a request for a synchronous advise transaction has timed out.a request for a synchronous data transaction has timed out.a request for a synchronous execute transaction has timed out.a request for a synchronous poke transaction has timed out.a request to end an advise transaction has timed out.a server-side transaction was attempted on a conversation that was terminated by the client, or the server terminated before completing a transaction.a transaction failed.an application initialized as APPCLASS_MONITOR has attempted to perform a DDE transaction, or an application initialized as APPCMD_CLIENTONLY has attempted to perform server transactions.an internal call to the PostMessage function has failed. an internal error has occurred in the DDEML.an invalid transaction identifier was passed to a DDEML function. Once the application has returned from an XTYP_XACT_COMPLETE callback, the transaction identifier for that callback is no longer valid.assuming this is a multi-part zip concatenatedattempt to change immutable key '%s' ignored.bad arguments to library functionbad signaturebad zipfile offset to entrybinaryboldbuild %lucan't close file '%s'can't close file descriptor %dcan't commit changes to file '%s'can't create file '%s'can't delete user configuration file '%s'can't determine if the end of file is reached on descriptor %dcan't find central directory in zipcan't find length of file on file descriptor %dcan't find user's HOME, using current directory.can't flush file descriptor %dcan't get seek position on file descriptor %dcan't load any font, abortingcan't open file '%s'can't open global configuration file '%s'.can't open user configuration file '%s'.can't open user configuration file.can't re-initialize zlib deflate streamcan't re-initialize zlib inflate streamcan't read from file descriptor %dcan't remove file '%s'can't remove temporary file '%s'can't seek on file descriptor %dcan't write buffer '%s' to disk.can't write to file descriptor %dcan't write user configuration file.checkedchecksum errorchecksum failure reading tar header blockcmcompression errordatedecompression errordefaultdoubledump of the process state (binary)eighteentheightheleventhentry '%s' appears more than once in group '%s'error in data formaterror opening fileerror reading zip central directoryerror reading zip local headererror writing zip entry '%s': bad crc or lengtherror writing zip entry '%s': file too large without ZIP64extraboldextraheavyextralightfailed to evaluatefailed to flush the file '%s'falsefifteenthfifthfile '%s', line %zu: '%s' ignored after group header.file '%s', line %zu: '=' expected.file '%s', line %zu: key '%s' was first found at line %d.file '%s', line %zu: value for immutable key '%s' ignored.file '%s': unexpected character %c at line %zu.filesfirstfont sizefourteenthfourthgenerate verbose log messagesheavyimageincomplete header block in tarincorrect event handler string, missing dotincorrect size given for tar entryinput compressed using unknown XZ optioninput is corruptedinput is not in XZ formatinvalid data in extended tar headerinvalid message box return valueinvalid zip fileitalickeyboard keyAddkeyboard keyAlt+keyboard keyBackkeyboard keyBackspacekeyboard keyCancelkeyboard keyCapitalkeyboard keyClearkeyboard keyCommandkeyboard keyCtrl+keyboard keyDecimalkeyboard keyDelkeyboard keyDeletekeyboard keyDividekeyboard keyDownkeyboard keyEndkeyboard keyEnterkeyboard keyEsckeyboard keyEscapekeyboard keyExecutekeyboard keyFkeyboard keyHelpkeyboard keyHomekeyboard keyInskeyboard keyInsertkeyboard keyKP_keyboard keyKP_Addkeyboard keyKP_Beginkeyboard keyKP_Decimalkeyboard keyKP_Deletekeyboard keyKP_Dividekeyboard keyKP_Downkeyboard keyKP_Endkeyboard keyKP_Enterkeyboard keyKP_Equalkeyboard keyKP_Fkeyboard keyKP_Homekeyboard keyKP_Insertkeyboard keyKP_Leftkeyboard keyKP_Multiplykeyboard keyKP_Nextkeyboard keyKP_PageDownkeyboard keyKP_PageUpkeyboard keyKP_Priorkeyboard keyKP_Rightkeyboard keyKP_Separatorkeyboard keyKP_Spacekeyboard keyKP_Subtractkeyboard keyKP_Tabkeyboard keyKP_Upkeyboard keyLeftkeyboard keyMenukeyboard keyMultiplykeyboard keyNum *keyboard keyNum +keyboard keyNum ,keyboard keyNum -keyboard keyNum .keyboard keyNum /keyboard keyNum =keyboard keyNum Beginkeyboard keyNum Deletekeyboard keyNum Downkeyboard keyNum Endkeyboard keyNum Enterkeyboard keyNum Homekeyboard keyNum Insertkeyboard keyNum Lockkeyboard keyNum Page Downkeyboard keyNum Page Upkeyboard keyNum Rightkeyboard keyNum Spacekeyboard keyNum Tabkeyboard keyNum Upkeyboard keyNum leftkeyboard keyNum_lockkeyboard keyPage Downkeyboard keyPage Upkeyboard keyPageDownkeyboard keyPageUpkeyboard keyPausekeyboard keyPgDnkeyboard keyPgUpkeyboard keyPrintkeyboard keyRawCtrl+keyboard keyReturnkeyboard keyRightkeyboard keySPECIALkeyboard keyScroll Lockkeyboard keyScroll_lockkeyboard keySelectkeyboard keySeparatorkeyboard keyShift+keyboard keySnapshotkeyboard keySpacekeyboard keySubtractkeyboard keyTabkeyboard keyUpkeyboard keyWindows_Leftkeyboard keyWindows_Menukeyboard keyWindows_Rightkeyboard keyaltkeyboard keyctrlkeyboard keynum keyboard keyrawctrlkeyboard keyshiftlibcurl could not be initializedlightmacOS menu itemAbout %smacOS menu itemAbout...macOS menu itemHide %smacOS menu itemHide OthersmacOS menu itemPreferences...macOS menu itemQuit %smacOS menu itemServicesmacOS menu itemShow Allmediummidnightnineteenthninthno DDE error.no errorno fonts found in %s, using builtin fontnonamenoonnormalnumobjects cannot have XML Text Nodesout of memoryprocess context descriptionptpxread errorreading zip stream (entry %s): bad crcreading zip stream (entry %s): bad lengthreentrancy problem.secondseek errorsemiboldseventeenthseventhshow this help messagesixteenthsixthspecify display mode to use (e.g. 640x480-16)specify the theme to usestandard Windows menu&Helpstandard/circlestandard/circle-outlinestandard/diamondstandard/squarestandard/trianglestored file length not in Zip headerstrstrikethroughtar entry not opentenththe response to the transaction caused the DDE_FBUSY bit to be set.thinthirdthirteenthtodaytomorrowtrailing backslash ignored in '%s'translator-creditstruetwelfthtwentiethuncheckedunderlinedundeterminedunexpected " at position %d in '%s'.unexpected end of fileunknownunknown (%lu)unknown class %sunknown compression errorunknown decompression errorunknown errorunknown error (error code %08x).unknown-%dunnamedunnamed%dunsupported Zip compression methodusing catalog '%s' from '%s'.write errorwxGLCanvas is only supported on Wayland and X11 currently. You may be able to work around this by setting environment variable GDK_BACKEND=x11 before starting your program.wxGetTimeOfDay failed.wxWidgets could not open display for '%s': exiting.wxWidgets could not open display. Exiting.xxxxyesterdayzlib error %d~Project-Id-Version: wxWidgets 3.1.6 Report-Msgid-Bugs-To: PO-Revision-Date: 2022-04-09 12:47+0200 Last-Translator: Milo Ivir Language-Team: wxWidgets Team Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n!=1); X-Generator: Poedit 2.4.3 Bitte senden Sie diesen Bericht an den Programmautor. Vielen Dank! Vielen Dank, und wir entschuldigen uns für die Unannehmlichkeiten. (Kopie %d von %d) (Fehler %ld: %s) (im Modul „%s“) - Vorschau fett sehr fett sehr schwer sehr dünn heavy kursiv dünn mittel halbfett durchgestrichen dünn#10 Umschlag, 4 1/8 × 9 1/2 Zoll#11 Umschlag, 4 1/2 × 10 3/8 Zoll#12 Umschlag, 4 3/4 × 11 Zoll#14 Umschlag, 5 × 11 1/2 Zoll#9 Umschlag, 3 7/8 × 8 7/8 Zoll%%d von %lu%i von %u%ld Byte%ld Bytes%lu von %lu%s (%d Elemente)%s (oder %s)%s Fehler%s Information%s-Einstellungen%s Warnung%s passte nicht zum tar Kopfeintrag für den Eintrag „%s“%s-Dateien (%s)|%s%u von %uÜbe&rT&atsächliche Größe&Nach einem Absatz:&AusrichtungÜ&bernehmen&Stil anwenden&Icons anordnen&Aufsteigend&Zurück&Basierend auf:&Vor einem Absatz:&Hg Farbe:Entfernung der &Weichzeichnung:&Fett&Unten&Unten:&RahmenStil des &Gliederungspunktes:&CD-ROMAb&brechen&Kaskadieren&Zelle&Zeichencode:&Löschen&Schließen&Farbe&Farbe:&Konvertieren&KopierenURL &kopieren&Anpassen …&Vorschau des Fehlerberichts:&LöschenStil &löschen …&Absteigend&Einzelheiten&Runter&BearbeitenStil &bearbeiten …&Ausführen&Datei&Suchen...&Fertigstellen&Erste&Schwebemodus:&Diskette&Schriftart&Schriftart:&Schriftart für Ebene …&Schriftart:&Vorwärts&Von:&Festplatte&Höhe:&Hilfe&Einzelheiten ausblenden&Start&Horizontaler Versatz:&Einrückung (Zehntel-mm)&Unbestimmt&Index&Information&Kursiv&Springen zu&Blocksatz&Letztes&Links&Links:&Listenebene:&Log&Bewegen&Bewege das Objekt zu:&Netzwerk&Neu&Weiter&Weiter >&Nächster Absatz&Nächster Tipp&Nächster Stil:&NeinB&emerkungen:&Nummer:&OKÖ&ffnen …&Umrandungsebene:&SeitenumbruchEin&fügen&BildSchriftgröße in &Punkt:&Position (Zehntel-mm):&Positionierungs-Modus:&Einstellungen&Zurück&Vorheriger Absatz&Drucken …&Eigenschaften&Beenden&Wiederholen&Wiederholen Stil &umbenennen …&Ersetzen&Starte Nummerierung erneut&Wiederherstellen&Rechts&Rechts:&Speichern&Einzelheiten anzeigen&Tipps beim Programmstart zeigen&Größe&Größe:Ü&berspringen&Zeichenabstand (Zehntel-mm)&Rechtschreibprüfung&Stopp&Durchstreichen&Stil:&Stile:&Teilsatz:&Symbol:&Werte synchronisieren&Tabelle&Oben&Oben:&Unterstreichen&Unterstreichen:&Rückgängig&Rückgängig &Einrückung entfernrn&Hoch&Vertikale Ausrichtung:&Vertikaler Versatz:&Ansicht …&Dicke:&Breite:&Fenster&Ja„%s“ enthält ungültige(s) Zeichen„%s“ hat extra „..“, ignoriert.„%s“ ist kein gültiger numerischer Wert für Option „%s“.„%s“ ist kein gültiger Nachrichtenkatalog.„%s“ ist keine gültige Zeichenkette„%s“ ist eine ungültige Zeichenkette„%s“ ist vermutlich ein Binärpuffer.(*)(Hilfe)(Kein)(Normaler Text)(Lesezeichen)(Fehler %d: %s)(Kein)**)+, 64-bit Edition-…1.11.21.31.41.51.61.71.81.910 × 11 Zoll10 × 14 Zoll11 × 17 Zoll12 × 11 Zoll15 × 11 Zoll26 3/4 Umschlag, 3 5/8 × 6 1/2 Zoll9 × 11 Zoll: Datei existiert nicht!: unbekannter Zeichensatz: unbekannte Kodierung< &ZurückFette kursive Schrift
fett kursiv unterstrichen
Fette Schrift. Kursive Schrift. >Ein Fehlerbericht wurde erstellt im Verzeichnis Ein Fehlerbericht wurde erstellt. Er liegt im VerzeichnisEine nicht leere Sammlung muss aus „element“-Knoten bestehenEin vordefinierter Gliederungspunkt.A0 Blatt, 841 × 1189 mmA1 Blatt, 594 × 841 mmA2 420 × 594 mmA3 Extra 322 × 445 mmA3 Extra Quer 322 × 445 mmA3 Rotiert 420 × 297 mmA3 Quer 297 × 420 mmA3 Blatt, 297 × 420 mmA4 Extra 9.27 × 12.69 ZollA4 Plus 210 × 330 mmA4 Rotiert 297 × 210 mmA4 Quer 210 × 297 mmA4 Blatt, 210 × 297 mmA4 klein Blatt, 210 × 297 mmA5 Extra 174 × 235 mmA5 Rotiert 210 × 148 mmA5 Quer 148 × 210 mmA5 Blatt, 148 × 210 mmA6 105 × 148 mmA6 Rotiert 148 × 105 mmABCDEFGabcdefg12345ÄÖÜßäöüASCIIÜberÜber %sAbsolutActiveBorderActiveCaptionTatsächliche GrößeHinzufügenSpalte hinzufügenZeile hinzufügenAktuelle Seite zu Lesezeichen hinzufügenZu Benutzerfarben hinzufügenAddToPropertyCollection aufgerufen für einen allgemeinen accessorAddToPropertyCollection aufgerufen ohne gültigen adderBuch %s wird hinzugefügtErweitertNach einem Absatz:LinksbündigRechtsbündigAusrichtungAlleAlle Dateien (%s)|%sAlle Dateien (*)|*Alle Dateien (*.*)|*.*Alle StileAlphabetischer ModusEin bereits registriertes Objekt wurde an SetObjectClassInfo übergebenISP wird bereits angewählt.Alt+Optionaler Eckradius, um abgerundete Ecken hinzuzufügen.Und enthält die folgenden Dateien: Animationsdatei hat nicht den Typ %ld.AppWorkspaceAn Logdatei „%s“ anhängen ([Nein] wird sie ersetzen)?AnwendungÜbernehmenCyanArabischArabisch (ISO-8859-6)Hilfeverzeichnis %u nicht gefunden.KünstlerAbsteigendEigenschaftenVerfügbare Schriftarten.B4 (ISO) 250 × 353 mmB4 (JIS) Rotiert 364 × 257 mmB4 Umschlag, 250 × 353 mmB4 Blatt, 250 × 354 mmB5 (ISO) Extra 201 × 276 mmB5 (JIS) Rotiert 257 × 182 mmB5 (JIS) Quer 182 × 257 mmB5 Umschlag, 176 × 250 mmB5 Blatt, 182 × 257 mmB6 (JIS) 128 × 182 mmB6 (JIS) Rotiert 182 × 128 mmB6 Umschlag, 176 × 125 mmBMP: Speicheranforderung fehlgeschlagen.BMP: Konnte ungültiges Bild nicht speichern.BMP: Konnte RGB Farbtabelle nicht speichern.BMP: Konnte Daten nicht speichern.BMP: Dateikopf (Bitmap) konnte nicht geschrieben werden.BMP: Dateikopf (BitmapInfo) konnte nicht geschrieben werden.BMP: wxImage hat keine eigene wxPalette.ZurückHintergrundHintergrund&farbe:HintergrundfarbeBaltisch (ISO-8859-13)Baltisch (alt) (ISO-8859-4)Vor einem Absatz:BitmapSchwarzBlauBlau:FettRahmenRahmenUntenUnterer Rand (mm)Rahmen-EigenschaftenRahmen-StileAlles nach vorne bringenBraunDurchsuchen&Ausrichtung der Gliederungspunkte:Stil der GliederungspunkteGliederungspunkteButtonFaceButtonHighlightButtonShadowButtonTextC Blatt, 17 × 22 Zoll&Löschen&Farbe:C3 Umschlag, 324 × 458 mmC4 Umschlag, 229 × 324 mmC5 Umschlag, 162 × 229 mmC6 Umschlag, 114 × 162 mmC65 Umschlag, 114 × 229 mmCD-ROMCHM-Handler unterstützt derzeit nur lokale Dateien!Ka&pitalienK&ann nicht rückgängig machen Das Bildformat für nicht durchsuchbare Eingabe kann nicht automatisch bestimmt werden.Kann Registrierungsschlüssel „%s“ nicht schließen.Kann Inhalte des nicht unterstützten Typs %d nicht kopieren.Kann Registrierungsschlüssel „%s“ nicht erzeugen.Kann Thread nicht erzeugenKann Schlüssel „%s“ nicht löschenKann INI-Datei „%s“ nicht löschenKann Wert „%s“ von Schlüssel „%s“ nicht löschen.Kann Unterschlüssel von „%s“ nicht auflistenKann Werte von Schlüssel „%s“ nicht auflistenKann Wert des nicht unterstützten Typs %d nicht kopieren.Kann aktuelle Position in Datei „%s“ nicht finden.Kann keine Information über den Registrierungsschlüssel „%s“ findenKann das JavaScript-Objekt nicht erhaltenKann das Entpacken der zlib-Daten nicht initialisieren.Kann das Komprimieren der zlib-Daten nicht initialisieren.Das nicht vorhandene Verzeichnis „%s“ kann nicht auf Änderungen überwacht werden.Kann Registrierungsschlüssel „%s“ nicht öffnenKann nicht vom entpackten Datenstrom lesen:%sKann den Entkomprimier-Strom nicht lesen: Unerwartetes EOF im zugrundeliegenden Strom.Kann Wert von „%s“ nicht lesenKann Wert von Eintrag „%s“ nicht lesenJavaScript kann nicht ohne ein gültiges HTML-Dokument ausgeführt werdenKann Bild nicht aus Datei „%s“ laden: Unbekannte Dateiendung.Kann Logtexte nicht in Datei speichern.Kann Thread-Priorität nicht setzenKann Wert von „%s“ nicht setzenKann nicht in den Standard-Eingabekanal des Kindprozesses schreibenKann nicht in den gepackten Datenstrom schreiben: %sAbbrechenKann Dateien „%s“ nicht auflistenKann Dateien in Verzeichnis „%s“ nicht auflistenKann keine aktive DFÜ-Verbindung finden: %sKann Adressbuchdatei nicht findenKann kein aktives Exemplar von „%s“ bekommenKein Prioritätsbereich für Scheduling-Verfahren %d ermittelbar.Hostnamen nicht ermittelbarOffizieller Hostname nicht ermittelbarKann nicht auflegen - keine aktive DFÜ-Verbindung vorhanden.Kann OLE nicht initialisierenKann Sockets nicht initialisierenKann das Icon nicht von „%s“ laden.Kann die Ressourcen nicht aus „%s“ laden.Kann die Ressourcen nicht aus der Datei „%s“ laden.HTML-Dokument %s kann nicht geöffnet werdenHTML-Hilfebuch %s kann nicht geöffnet werdenKann den Inhalt der Datei %s nicht öffnenKann Datei für den Postscriptdruck nicht öffnen!Kann Indexdatei %s nicht öffnenKann die Ressourcendatei „%s“ nicht öffnen.Leere Seite kann nicht gedruckt werden.Kann die Typnamen nicht aus „%s“ lesen!Kann Thread %lx nicht fortsetzenKann Scheduling-Verfahren der Threads nicht ermitteln.Lokalisierung kann nicht auf die Sprache „%s“ gesetzt werden.Kann Thread nicht starten: Fehler beim Beschreiben des TLS.Kann Thread %lx nicht anhaltenKann nicht auf Threadende wartenCaptionTextGroß-/KleinschreibungKategorie-ModusZelleneigenschaftenKeltisch (ISO-8859-14)Zen&triertZentriertZentraleuropäisch (ISO-8859-2)ZentriereZentriere den Text.ZentriertWä&hle …Stil der Liste ändernStil des Objektes ändernEigenschaften ändernStil ändernÄnderungen werden nicht gesichert um das Überschreiben der vorhandenen Datei „%s“ zu vermeiden.Wechseln des aktuellen Ordners auf „%s“ fehlgeschlagenZeichenstilKlicken um einen Punkt nach dem Gliederungspunkt hinzuzufügen.Klicken um eine schließende Klammer hinzuzufügen.Markieren um alle Ecken gleichzeitig anzupassen.Klicken um den Gliederungspunkt in Klammern zu setzen.Markieren um rechts-nach-links-Textausrichtung zu aktivieren.Klicken um die Schriftart auf fett zu stellen.Klicken um die Schriftart auf kursiv zu stellen.Klicken um die Schriftart auf unterstrichen zu stellen.Klicken um die Nummerierung neu zu starten.Klicken um eine Linie durch den Text zu ziehen.Markieren um den Text in Großbuchstaben anzuzeigen.Markieren um den Text in Kapitälchen darzustellen.Klicken um den Text tiefgestellt anzuzeigen.Klicken um den Text hochgestellt anzuzeigen.Markieren um Silbentrennung zu unterdrücken.Anzuwählenden ISP auswählenVerzeichnis wählen:Datei wählenFarbe wählenSchriftart wählenZirkuläre Abhängigkeit betreffend das Modul „%s“ erkannt.S&chließenKlasse nicht registriert.LöschenLogtexte löschenKlicken um den ausgewählten Stil anzuwenden.Klicken um nach einem Symbol zu navigieren.Klicken um die Änderungen der Schriftart zu verwerfen.Klicken um Wahl der Schriftart abzubrechen.Klicken um die Farbe der Schriftart zu ändern.Klicken um die Hintergrundfarbe des Textes zu ändern.Klicken um die Textfarbe zu ändern.Klicken um die Schriftart für diese Ebene zu wählen.Klicken um dieses Fenster zu schließen.Klicken um die Änderungen der Schriftart zu bestätigen.Klicken um Wahl der Schriftart zu bestätigen.Klicken um einen neuen Rahmen-Stil zu erzeugen.Klicken um einen neuen Zeichenstil zu erzeugen.Klicken um einen neuen Listenstil zu erzeugen.Klicken um einen neuen Absatzstil zu erzeugen.Klicken um eine neue Tabulatorposition zu erzeugen.Klicken um alle Tabulatorpositionen zu löschen.Klicken um den ausgewählten Stil zu löschen.Klicken um die ausgewählte Tabulatorposition zu löschen.Klicken um den ausgewählten Stil zu bearbeiten.Klicken um den ausgewählten Stil umzubenennen.SchließenAlles SchließenAktuelles Dokument schließenFenster schließenZusammenklappenFarbeFarbeFarbauswahldialog schlug mit Fehler %0lx fehl.Farbe:Spalte %uKommandozeilenargument %d konnte nicht nach Unicode konvertiert werden und wird ignoriert.Allgemeiner Dialog schlug fehl mit dem Fehlercode %0lx.Zusammenfügen wird nicht durch dieses System unterstützt, bitte über den Fenster Manager einstellen.Komprimierte HTML-Hilfedatei (*.chm)|*.chm|ComputerDie Bezeichnung des Konfigurations-Eintrags kann nicht mit „%c“ beginnen.BestätigenVerbinde …InhalteControlDarkControlLightKonvertierung zum Zeichensatz „%s“ funktioniert nicht.KonvertierenIn Zwischenablage kopiert:„%s“Kopien:KopierenAuswahl kopierenDas Kopieren von mehr als einem ausgewählten Block in die Zwischenablage wird nicht unterstützt.EckeEck&radius:Konnte temporäre Datei „%s“ nicht erzeugenKonnte nicht %s in %s extrahieren: %sKonnte Seite für ID nicht findenKonnte Datei „%s“ nicht finden.Der benutzerspezifische DirectWrite Schriftartlader konnte nicht registriert werden.Konnte das Arbeitsverzeichnis nicht setzenKann Druckvorschau nicht starten.Kann Ausdruck nicht beginnen.Kann Daten nicht ins Fenster übertragenKann Bild nicht zur Liste hinzufügen.Kann keinen OpenGL Inhalt erzeugenKann keinen Timer erzeugenKonnte Übersetzungen nicht aufzählenKann Symbol „%s“ in der dynamischen Bibliothek nicht findenKann den aktuellen Threadzeiger nicht bekommenGIF Hash-Tabelle konnte nicht initialisiert werden.Konnte PNG-Bild nicht laden - Datei ist beschädigt oder der Speicher reicht nicht aus.Klangdaten konnten nicht von „%s“ geladen werden.Verzeichnisname konnte nicht ermittelt werdenFehler beim Öffnen der Audiodatei: %sKonnte Zwischenablage-Format „%s“ nicht registrieren.Kann keine Informationen über das Listenelement %d bekommen.Konnte PNG-Bild nicht speichern.Kann Thread nicht beendenErzeugungsparameter %s nicht in den deklarierten RTTI-Parametern gefundenVerzeichnis anlegenNeues Verzeichnis anlegenNeues Dokument anlegenErstellung von %s „%s“ fehlgeschlagen.&AusschneidenAktuelles Verzeichnis:BenutzerdefiniertAngepasste GrößeSpalten anpassenAusschneidenAuswahl ausschneidenKyrillisch (ISO-8859-5)D Blatt, 22 × 34 ZollDDE „poke“ Anfrage fehlgeschlagenDIB-Header: Kodierung entspricht nicht der Bittiefe.DIB-Header: Bildhöhe > 32767 Pixel.DIB-Header: Bildbreite > 32767 Pixel.DIB-Header: Unbekannte Bittiefe.DIB-Header: Unbekannte Kodierung.DL Umschlag, 110 × 220 mmGestricheltFehlerbericht „%s“Fehlerbericht konnte nicht erstellt werden.Das Erstellen des Fehlerberichts ist fehlgeschlagen.DekorativStandardkodierungStandardschriftartStandarddruckerLöschenA&lles löschenSpalte löschenZeile löschenStil löschenText löschenElement löschenAuswahl löschenStil %s löschen?Ungenutzte Sperr-Datei „%s“ wurde gelöscht.Löschen des Passwortes für „%s“ fehlgeschlagen: %s.Abhängigkeit „%s“ des Moduls „%s“ existiert nicht.AbsteigendArbeitsoberflächeEntwickelt von EntwicklerDFÜ-Verbindungs-Funktionen stehen nicht zur Verfügung, da der RAS-Dienst (Remote Access Service) auf dieser Maschine nicht installiert ist. Bitte installieren.Wussten Sie schon …DirectFB-Fehler %d aufgetreten.VerzeichnisseVerzeichnis „%s“ konnte nicht angelegt werdenVerzeichnis „%s“ konnte nicht gelöscht werdenVerzeichnis existiert nichtVerzeichnis existiert nicht.Änderungen verwerfen und letzte gesicherte Version laden?Alle Indexelemente anzeigen, die den gegebenen Suchbegriff enthalten. Groß-/Kleinschreibung wird nicht beachtet.Einstellungen-Dialog anzeigenAnzeigen bieten Unterstützung beim Navigieren der Bücher auf der linken Seite.Möchten Sie die Änderungen nach %s speichern?Dokument:Dokumentation von Autoren der DokumentationNicht speichernFertigFertig.GepunktetVerdoppelnDoppelte Japanische Postkarte Rotiert 148 × 200 mmID doppelt verwendet: %dHerunterFreigebenE Blatt, 34 × 44 ZollEOF beim Lesen vom inotify BezeichnerBearbeitenElement bearbeitenBenötigte Zeit:Höhenwert einschalten.Maximalen Breitenwert einschalten.Minimalen Höhenwert einschalten.Minimalen Breitenwert einschalten.Breitenwert einschalten.Vertikale Ausrichtung einschalten.Aktiviert eine Hintergrundfarbe.Aktiviert einen Schatten.Aktiviert die Entfernung der Weichzeichnung.Aktiviert die Farbe des Schattens.Aktiviert die Deckkraft des Schattens.Aktiviert die Ausbreitung des Schattens.Namen für den Rahmen-Stil eintragenName des Zeichenstils eintragenName des Listenstils eintragenNeuen Stilnamen eintragenName des Absatzstils eintragenBefehl zum Öffnen von Datei „%s“ eingeben:Einträge gefundenUmschlag Einladung 220 × 220 mmAuswerten der Umgebungsvariablen schlug fehl. Es fehlt „%c“ an Position %u in „%s“.FehlerFehler beim Schließen des epol BezeichnersFehler schließt kqueue VorgangFehler beim Speichern der Datei „%s“ nach „%s“.Fehler beim Anlegen des VerzeichnissesFehler beim Lesen des DIB-Bildes.Fehler in der Ressource: %sFehler beim Parsen der Optionen.Fehler beim Ausführen von JavaScript: %sFehler beim Speichern der Benutzer-Optionen.Fehler während des Druckens: Fehler: Fehler: %s (%d)Esperanto (ISO-8859-3)Geschätzte Zeit:Ausführbare Dateien (*.exe)|*.exe|AusführenBefehlsausführung „%s“ schlug fehlExecutive, 7 1/4 × 10 1/2 ZollAufklappenExportiere Registrierungsschlüssel: Datei „%s“ besteht bereits und wird nicht überschrieben.Erweiterter Unix-Zeichensatz für Japanisch (EUC-JP)Extrahieren von „%s“ in „%s“ schlug fehl.SchriftnameFehler beim Zugriff auf Sperr-Datei.Konnte benutzerspezifische Schriftart „%s“ nicht hinzufügen.Das Hinzufügen des Bezeichners %d zum epoll Bezeichner %d schlug fehlAnforderung von %lu Kb Speicher für Bitmap fehlgeschlagen.Anforderung von Farbe für OpenGL fehlgeschlagenSpeicheranforderung für LZMA-Komprimierung fehlgeschlagen.Speicheranforderung für LZMA-Entkomprimierung fehlgeschlagen.Änderung des Video-Modus fehlgeschlagenÜberprüfung des Formats der Bilddatei „%s“ fehlgeschlagen.Konnte Fehlerberichtsverzeichnis „%s“ nicht aufräumen.Konnte Datei-Handle nicht schließenKonnte Sperr-Datei „%s“ nicht schließenKonnte Zwischenablage nicht schließen.Konnte das Display „%s“ nicht schließenVerbindung fehlgeschlagen: Es fehlt der Benutzername bzw. das Passwort.Verbindungsversuch fehlgeschlagen: kein anwählbares ISP.Kopieren des Dialoginhalts in die Zwischenablage fehlgeschlagen.Kopieren des Registry-Werts „%s“ fehlgeschlagenKopieren des Inhalts des Registrierungsschlüssels „%s“ nach „%s“ fehlgeschlagen.Konnte die Datei „%s“ nicht nach „%s“ kopierenKopieren des Registrierungsschlüssels von „%s“ in „%s“ fehlgeschlagen.Erstellung der DDE-Zeichenkette fehlgeschlagenErstellung des MDI-Hauptrahmens fehlgeschlagen.Konnte keinen temporären Dateinamen erstellenKonnte keine anonyme Unix-Pipe erstellenErzeugen eines Exemplars von „%s“ fehlgeschlagen.Aufbau der Verbindung zum Server „%s“ „on topic“ „%s“ fehlgeschlagenCursor konnte nicht erzeugt werden.Konnte das Verzeichnis „%s“ nicht erstellen.Konnte Verzeichnis „%s“ nicht erstellen (Haben Sie die nötigen Zugriffsrechte?)Epoll Beschreibungselement konnte nicht erstellt werdenErzeugung des Schriftart-Konfigurationsobjektes fehlgeschlagen.Konnte keinen Registrierungseintrag für „%s“-Dateien erstellen.Konnte keinen Standard-Finden/Ersetzen-Dialog erstellen (Fehler %d)Erzeugung der Weckleitung für die Ereignisschleife fehlgeschlagen.Konnte HTML-Dokument nicht in der Kodierung %s anzeigenKonnte Zwischenablage nicht leeren.Auflisten der Video-Modi fehlgeschlagenAufbau einer „advise Schleife“ mit dem DDE-Server fehlgeschlagenAufbau der DFÜ-Verbindung fehlgeschlagen: %sKann „%s“ nicht ausführen Konnte curl nicht starten, bitte im PATH installieren.Konnte CLSID von „%s“ nicht findenKonnte keine Übereinstimmung mit regulärem Ausdruck %s findenDer Grad der Web Ansichtnachbildung konnte in der Registratur nicht gefunden werdenKonnte ISP-Namen „%s“ nicht ermittelnKonnte die OLE Automatisierungsschnittstelle für „%s“ nicht bekommenKonnte Daten nicht aus der Zwischenablage kopierenVersuch örtliche Systemzeit zu bekommen, fehlgeschlagenKonnte Arbeitsverzeichnis nicht ermittelnKonnte GUI nicht initialisieren: kein Thema gefunden.Die Initialisierung der LZMA-Komprimierung ist fehlgeschlagen: unerwarteter Fehler %u.Die Initialisierung der LZMA Entkomprimierung ist fehlgeschlagen: unerwarteter Fehler %u.Konnte MS-HTML-Hilfe nicht initialisieren.Konnte OpenGL nicht initialisierenVersuch fehlgeschlagen, die Einwählverbindung einzuleiten: %sEinfügen von Text in das Steuerelement fehlgeschlagen.Konnte die Sperr-Datei „%s“ nicht lesenKonnte Signalbearbeitung nicht installierenThread-Verbindung fehlgeschlagen. Dies ist ein mögliches Speicherleck - Bitte Programm neu startenKonnte Prozess %d nicht abbrechenKonnte das Bitmap „%s“ aus der Ressource nicht laden.Konnte das Symbol „%s“ aus der Ressource nicht laden.Konnte die Symbole aus der Ressource „%s“ nicht laden.Konnte das Bild %%d aus der Datei „%s“ nicht laden.Konnte das Bild %d aus dem Strom nicht laden.Konnte das Bild aus der Datei „%s“ nicht laden.Konnte Metadatei aus Datei „%s“ nicht laden.Konnte mpr.dll nicht laden.Konnte die Ressource „%s“ nicht laden.Laden der dynamischen Bibliothek „%s“ fehlgeschlagenFehler beim Laden des Klangs von „%s“ (Fehler %d).Konnte die Ressource „%s“ nicht sperren.Konnte die Sperr-Datei „%s“ nicht sperrenWechsel von Beschreibung %d in Epoll Beschreibung %d fehlgeschlagenKonnte Zugriffszeit von Datei „%s“ nicht ändernDie Überwachung der I/O Kanäle ist fehlgeschlagenKonnte „%s“ nicht zum Lesen öffnenKonnte „%s“ nicht zum Schreiben öffnenCHM-Archiv „%s“ lässt sich nicht öffnen.Konnte die URL „%s“ nicht im voreingestellten Browser öffnen.Konnte die URL „%s“ nicht im voreingestellten Browser öffnenKonnte das Verzeichnis „%s“ nicht zur Überwachung öffnen.Öffnen des Displays „%s“ fehlgeschlagen.Konnte temporäre Datei nicht öffnen.Konnte Zwischenablage nicht öffnen.Analyse der Pluralformen fehlgeschlagen: „%s“Fehler bei der Vorbereitung zum Abspielen von „%s“.Versuch Daten in der Zwischenablage abzulegen, fehlgeschlagenKonnte keine PID von Sperr-Datei lesen.Lesen der Konfigurationsoptionen fehlgeschlagen.Konnte Dokument aus der Datei „%s“ nicht lesen.Konnte Ereignis von DirectFB Kanal nicht lesenKonnte nicht aus dem Weckkanal lesenKonnte Textdatei „%s“ nicht lesen.Umleitung der Ein-/Ausgabe des Unterprozesses fehlgeschlagenUmleitung der Ein-/Ausgabe des Unterprozesses fehlgeschlagenVersuch DDE-Server „%s“ zu registrieren, fehlgeschlagenRegistrierung der Schriftart-Konfiguration mit privaten Schriftarten fehlgeschlagen.Versuch fehlgeschlagen, an die Kodierung für den Zeichensatz „%s“ zu erinnern.Konnte Fehlerberichtsdatei „%s“ nicht entfernen.Konnte Sperr-Datei „%s“ nicht löschen.Konnte unbenutzte Sperr-Datei „%s“ nicht entfernen.Umbenennen des Registrierungswertes „%s“ in „%s“ fehlgeschlagen.Umbenennen der Datei „%s“ nach „%s“ fehlgeschlagen, da die Zieldatei bereits existiert.Umbenennen des Registrierungsschlüssels von „%s“ in „%s“ fehlgeschlagen.Das Setzen der Web Ansicht auf den Grad der Standard-Nachbildung ist fehlgeschlagenKonnte Zugriffszeit von Datei „%s“ nicht ermittelnVersuch den Inhalt der RAS-Fehlernachricht zu holen, fehlgeschlagenKonnte die von der Zwischenablage unterstützten Formate nicht ermittelnDas Dokument konnte nicht in die Datei „%s“ gesichert werden.Das Bitmap-Bild konnte nicht in der Datei „%s“ geschrieben werden.Versuch fehlgeschlagen, eine DDE-Benachrichtigung zu schickenKonnte den FTP-Transfermodus nicht auf „%s“ setzen.Konnte Dateien nicht in die Zwischenablage kopieren.Konnte die Zugriffsrechte für Datei „%s“ nicht setzenVersuch fehlgeschlagen, die Prozess-Priorität zu setzenKonnte die Zugriffsrechte der temporären Datei nicht setzenVersuch fehlgeschlagen, die Thread-Nebenläufigkeit auf Stufe %lu zu setzenVersuch fehlgeschlagen, die Thread-Priorität %d zu setzen.Das Erzeugen einer nicht blockierenden Pipe ist fehlgeschlagen, das Programm könnte stehen bleiben.Das Setzen der Web Ansicht auf moderne Nachbildung ist fehlgeschlagenVersuch das Bild „%s“ im VFS-Speicher zu laden, fehlgeschlagen!Wechsel von DirectFB Pipe in den Nicht blockierenden Modus schlug fehlAufweck-Pipe in den nicht blockierenden Modus umzuschalten ist fehlgeschlagenVersuch den Thread zu beenden, fehlgeschlagen.Versuch fehlgeschlagen, die „advise Schleife“ mit DDE-Server zu beendenVersuch fehlgeschlagen, die DFÜ-Verbindung zu beenden: %sKonnte die Datei „%s“ nicht „berühren“Entladen der dynamischen Bibliothek fehlgeschlagenKonnte die Sperrung von Datei „%s“ nicht aufhebenDie Registrierung des DDE-Servers „%s“ konnte nicht aufgehoben werdenKonnte Descriptor %d vom Epoll Descriptor nicht %d austragenKann Benutzer-Konfigurationsdatei nicht aktualisieren.Konnte den Fehlerbericht nicht hochladen (Fehlercode %d).Konnte Sperr-Datei „%s“ nicht schreibenFalschFamilieNicht behebbarer FehlerDateiDie Datei „%s“ konnte nicht zum Lesen geöffnet werden.Die Datei „%s“ konnte nicht zum Schreiben geöffnet werden.Datei „%s“ existiert bereits, möchten Sie diese wirklich überschreiben?Die Datei „%s“ konnte nicht gelöscht werdenDie Datei „%s“ konnte nicht nach „%s“ umbenannt werden.Datei konnte nicht geladen werden.Datei Dialog schlug fehl mit dem Fehlercode %0lx.DateifehlerDateiname bereits vorhanden.Dateityp:DateienDateien (%s)FilterSuchenSuchen und Ersetzen im DokumentSuche im DokumentSuchen...Erste(r)Erste SeiteFestgesetztSchrift fester Breite:Schrift fester Breite.
fett kursiv SchwebendDisketteFolio, 8 1/2 × 13 ZollSchriftartSchrift&dicke:Die Schriftartdatei "%s" kann nicht verwendet werden, da sie sich nicht im Schriftartenverzeichnis "%s" befindet.Schriftartdatei "%s" konnte nicht geladen werdenSchriftartdatei "%s" existiert nicht.Schriftgröße:Schrifst&il:Schrift:Indexdatei der Schriftarten %s während des Ladens der Schriften verschwunden.„Fork“ fehlgeschlagenVorwärtsForward hrefs werden nicht unterstütztSuchbegriff %i mal gefundenVon:MagentaGIF: Datenstrom scheint unvollständig zu sein.GIF: Fehler im GIF-Bildformat.GIF: nicht genug Speicher.Das GTK+, das auf dieser Maschine installiert ist, ist zu alt um Bildschirmanordnung zu unterstützen, bitte GTK+ 2.12 oder neuer installieren.GTK+ ThemaAllgemeinGenerisches PostScriptGerman Legal Endlospapier, 21,59 × 33,02 cmGerman Std Endlospapier, 8 1/2 × 12 ZollGetProperty aufgerufen ohne gültigen getterGetPropertyCollection aufgerufen für einen allgemeinen accessorGetPropertyCollection aufgerufen ohne gültigen Collection getterZurückVorwärtsIn die nächste Dokumentebene gehenGehe zum BenutzerverzeichnisGehe zum „Parent“-VerzeichnisGrafikgestaltung von GrauGrayTextGriechisch (ISO-8859-7)GrünGrün:GrooveGzip wird nicht von dieser zlib-Version unterstütztHTML-Hilfe-Projekt (*.hhp)|*.hhp|HTML-Anker %s existiert nicht.HTML-Dateien (*.html;*.htm)|*.html;*.htm|FestplatteHebräisch (ISO-8859-8)HilfeHilfe zu den Browser-EinstellungenHilfeindexHilfe druckenHilfethemenHilfe-Bücher (*.htb)|*.htb|Hilfe-Bücher (*.zip)|*.zip|Hilfeverzeichnis „%s“ nicht gefunden.Hilfedatei „%s“ nicht gefunden.Hilfe: %sDiese Meldung ausblenden.HervorhebenHighlightTextStartBenutzerverzeichnisWie das Objekt relativ zum Text angeordnet wird.ICO: Fehler beim Lesen der DIB-Maske.ICO: Schreibfehler beim Speichern!ICO: Bild zu groß für ein Icon.ICO: Bild zu breit für ein Icon.ICO: Ungültiger Icon-Index.IFF: Datenstrom scheint unvollständig zu sein.IFF: Fehler im IFF-Bildformat.IFF: nicht genug Speicher.IFF: unbekannter Fehler!ISO-2022-JPWenn möglich die Layout-Parameter ändern um den Ausdruck schmaler zu machen.Falls Sie weitere Informationen betreffend diesen Fehlerberichtes haben, tragen Sie sie bitte hier ein, um sie zum Bericht hinzuzufügen:Falls Sie diesen Fehlerbericht vollständig unterdrücken möchten, drücken Sie bitte „Abbrechen“. Bedenken Sie aber bitte, dass dies eventuell die Verbesserung des Programms behindern kann, nach Möglichkeit sollten Sie also den Fehlerbericht erstellen. Fehlformatierte Zusatzinformation wird ignoriert, ZIP-Datei ist möglicherweise beschädigtIgnoriere Wert „%s“ des Schlüssels „%s“.Ungültige Objektklasse (nicht wxEvtHandler) als EreignisquelleUngültige Anzahl Parameter für ConstructObject-MethodeUngültige Anzahl Parameter für Create-MethodeUngültiger Verzeichnisname.Ungültige Dateiangabe.Bild und Bildmaske haben verschiedene Größen.Bilddatei hat nicht den Typ %d.Bilddatei hat nicht den Typ %s.Versuch eine „rich edit control“ zu erstellen fehlgeschlagen, verwende stattdessen ein einfaches Text-Control. Bitte „riched32.dll“ neu installierenEs war nicht möglich, die Eingabe des Unterprozesses zu verarbeitenKonnte die Zugriffsrechte der Datei „%s“ nicht ermittelnVersuch die Datei „%s“ zu überschreiben, fehlgeschlagenKonnte die Zugriffsrechte für Datei „%s“ nicht setzenInactiveBorderInactiveCaptionInactiveCaptionTextUngültige GIF Bildgröße (%u, %d) für das Bild #%uFehlerhafte Anzahl von Argumenten.EinrückenEinrückungen && ZeichenabstandIndexIndisch (ISO-8859-12)InfoInitialisierung in „post init“ fehlgeschlagen, breche ab.EinfügenFeld einfügenBild einfügenObjekt einfügenText einfügenFügt einen Seitenumbruch vor dem Absatz ein.EinfügenUngültiger Index des TIFF-Bilds.Ungültige Angabe „%s“ des Displays.Ungültige Angabe „%s“ der FenstergrößeUngültiges inotify-Ereignis für „%s“Ungültige Sperr-Datei „%s“.Ungültiger Nachrichtenkatalog.Ungültige oder Null-Objekt-ID an GetObjectClassInfo übergebenUngültige oder Null-Objekt-ID an HasObjectClassInfo übergebenUngültiger regulärer Ausdruck „%s“: %sUngültiger Wert %ld für einen booleschen Schlüssel „%s“ in der Konfigurationsdatei.KursivItaly Umschlag, 110 × 230 mmJPEG: Lesefehler - Datei ist vermutlich beschädigt.JPEG: Konnte Bild nicht speichern.Japanische Doppelte Postkarte 200 × 148 mmJapanischer Briefumschlag Chou #3Japanischer Briefumschlag Chou #3 RotiertJapanischer Briefumschlag Chou #4Japanischer Briefumschlag Chou #4 RotiertJapanischer Briefumschlag Kaku #2Japanischer Briefumschlag Kaku #2 RotiertJapanischer Briefumschlag Kaku #3Japanischer Briefumschlag Kaku #3 RotiertJapanischer Briefumschlag You #4Japanischer Briefumschlag You #4 RotiertJapanische Postkarte 100 × 148 mmJapanische Postkarte Rotiert 100 × 148 mmSpringen zuBlocksatzText rechts und links ausrichten.KOI8-RKOI8-UZe&ilenabstand:EIn LZMA-Komprimierungsfehler ist aufgetreten beim Leeren der Ausgabe: %sLZMA Komprimierungsfehler: %sLZMA Fehler beim Entpacken: %sQuerformatLetzte(r)Letzte SeiteDie letzte wiederholte Nachricht („%s“, %u Mal) wurde nicht ausgegebenDie letzte wiederholte Nachricht („%s“, %u Mal) wurde nicht ausgegebenLedger, 17 × 11 ZollLinksLinks (&erste Zeile):Linker Rand (mm):Linksbündiger Text.Legal Extra 9 1/2 × 15 ZollLegal, 8 1/2 × 14 ZollLetter Extra 9 1/2 × 12 ZollBrief Extra Quer 9.275 × 12 ZollBrief Plus 8 1/2 × 12.69 ZollBrief Rotiert 11 × 8 1/2 ZollLetter Small, 8 1/2 × 11 ZollBrief Quer 8 1/2 × 11 ZollLetter, 8 1/2 × 11 ZollLizenzDünnZitronengrünZeile %lu der Abbildungsdatei „%s“ hat ungültige Syntax, übersprungen.Zeilenabstand:Verweis enthielt „//“, in absoluten Link umgewandelt.ListenstilListenstileSchriftgröße der Listen in Punkt.Listet die verfügbaren Schriftarten auf.%s-Datei ladenLaden: Sperr-Datei „%s“ hat falschen Besitzer.Sperr-Datei „%s“ hat falsche Zugriffsrechte.Logtext in Datei „%s“ gespeichert.KleinbuchstabenRömische Ziffern in KleinbuchstabenMDI childDie MS-HTML-Hilfe funktioniert nicht, da die MS-HTML-Hilfe-Bibliothek nicht installiert ist. Bitte installieren Sie diese.Ma&ximierenMacArabicMacArmenianMacBengaliMacBurmeseMacCelticMacCentralEurRomanMacChineseSimpMacChineseTradMacCroatianMacCyrillicMacDevanagariMacDingbatsMacEthiopicMacExtArabicMacGaelicMacGeorgianMacGreekMacGujaratiMacGurmukhiMacHebrewMacIcelandicMacJapaneseMacKannadaMacKeyboardGlyphsMacKhmerMacKoreanMacLaotianMacMalayalamMacMongolianMacOriyaMacRomanMacRomanianMacSinhaleseMacSymbolMacTamilMacTeluguMacThaiMacTibetanMacTurkishMacVietnameseBitte auswählen:RänderKastanienbraunGroß- und Kleinschreibung beachtenMaximale Höhe:Maximale Breite:Medienwiedergabe-Fehler: %sVFS-Speicher beinhaltet bereits die Datei „%s“!MenüNachrichtMetal-ThemaMethode oder Eigenschaft nicht gefunden.Mi&nimierenMinimale Höhe:Minimale Breite:MinimierenEin notwendiger Parameter fehlt.ModernGeändertInitialisierung von Modul „%s“ fehlgeschlagenMonarch Envelope, 3 7/8 × 7 1/2 ZollÜberwachen einzelner Dateien auf Änderungen wird zurzeit nicht unterstützt.Abwärts verschiebenNach obenVerschiebt das Objekt zum nächsten Absatz.Verschiebt das Objekt in den vorherigen Absatz.Mehrfache ZelleneigenschaftenNameMarineblauNetzwerkNeuNeuer &Rahmenstil …Neuer &Zeichenstil …Neuer &Listenstil …Neuer &Absatzstil …Neuer StilNeues ElementNeuerNameNächste SeiteNeinKein Animationshandler für Typ %ld definiert.Keine Bildbehandlungsroutine für den Typ %d definiert.Keine voreingestellte Anwendung für HTML-Dateien.Keine Einträge gefunden.Keine Schriftart für die Kodierung „%s“ gefunden, es ist aber eine Alternativkodierung „%s“ verfügbar. Möchten Sie diese Kodierung wählen (sonst müssen Sie eine andere auswählen)?Keine Schriftart für die Kodierung „%s“ gefunden, Möchten Sie eine Schriftart für die Kodierung wählen (sonst wird der Text mit dieser Kodierung nicht richtig dargestellt)?Kein Handler für den Animationstyp gefunden.Dieses Bildformat wird nicht unterstützt.Bildformat %d wurde nicht definiert.Bildformat %s wurde nicht definiert.Passende Seite noch nicht gefundenKein TonKeine unbenutzte Farbe wurde im Bild unterdrückt.Keine gültige Abbildung in der Datei „%s“ gefunden.KeinNordisch (ISO-8859-10)NormalNormale Schrift
und unterstrichen. Normal Font:Nicht %sNicht verfügbar für diese PlatformNicht genügend freier Festplattenplatz für das Herunterladen vorhanden.Nicht unterstrichenNote, 8 1/2 × 11 ZollBemerkungNummerierung umrandetOKOLE-Automatisierungsfehler in %s: %sObjekteigenschaftenObjekt-Umsetzung unterstützt keine benannten Argumente.Objekte müssen ein ID-Attribut besitzenOlivgrünDeckkraf&t:Deckkraft:Datei öffnenÖffne HTML-DokumentÖffne ein existierendes DokumentÖffne Datei „%s“Öffnen …OpenGL 3.0 und neuer, wird vom OpenGL-Treiber nicht unterstützt.Ausführung nicht erlaubt.Option „%s“ konnte nicht negiert werdenOption „%s“ erwartet einen Wert.Option „%s“: „%s“ kann nicht in ein Datum umgewandelt werden.EinstellungenOrangeAusrichtungKeine Fenster-IDs mehr verfügbar. Bitte Applikation beenden.UmrandungBeginnÜberlauf beim Umwandeln der Argumentwerte.PCX: Speicheranforderung fehlgeschlagenPCX: Bildformat wird nicht unterstütztPCX: ungültiges BildPCX: dies ist keine PCX-Datei.PCX: unbekannter Fehler!PCX: Versionsnummer zu niedrigPNM: Speicheranforderung fehlgeschlagen.PNM: Datei-Format wurde nicht erkannt.PNM: Datei wurde abgeschnitten.PRC 16K 146 × 215 mmPRC 16K RotiertPRC 32K 97 × 151 mmPRC 32K RotiertPRC 32K(Groß) 97 × 151 mmPRC 32K(Groß) RotiertPRC Umschlag #1 102 × 165 mmPRC Umschlag #1 Rotated 165 × 102 mmPRC Umschlag #10 324 × 458 mmPRC Umschlag #10 Rotiert 458 × 324 mmPRC Umschlag #2 102 × 176 mmPRC Umschlag #2 Rotiert 176 × 102 mmPRC Umschlag #3 125 × 176 mmPRC Umschlag #3 Rotiert 176 × 125 mmPRC Umschlag #4 110 × 208 mmPRC Umschlag #4 Rotiert 208 × 110 mmPRC Umschlag #5 110 × 220 mmPRC Umschlag #5 Rotiert 220 × 110 mmPRC Umschlag #6 120 × 230 mmPRC Umschlag #6 Rotiert 230 × 120 mmPRC Umschlag #7 160 × 230 mmPRC Umschlag #7 Rotiert 230 × 160 mmPRC Umschlag #8 120 × 309 mmPRC Umschlag #8 Rotiert 309 × 120 mmPRC Umschlag #9 229 × 324 mmPRC Umschlag #9 Rotiert 324 × 229 mmAuffüllungSeite %dSeite %d von %dSeiten-EinstellungenSeiten-EinstellungenSeitenPapierformatAbsatzstileEin bereits registriertes Objekt wurde an SetObject übergebenEin unbekanntes Objekt wurde an GetObject übergebenKennwort:EinfügenAuswahl einfügenP&unktZugriffsrechteBildeigenschaftenKonnte keine Pipe anlegenBitte wählen Sie eine gültige Schriftart.Bitte wählen Sie eine bestehende Datei.Bitte wählen Sie die darzustellende Seite:Bitte gewünschte ISP-Verbindung auswählenBitte darzustellende Spalten auswählen und deren Reihenfolge festlegen:Bitte warten Sie während gedruckt wird …Größe in PunktHochformatPositionPostScript-DateiEinstellungenVorbereitungVorschau:Vorherige SeiteDruckenDruckvorschauFehler bei der DruckvorschauSeitenbereichDruckereinstellungenFarbig druckenDruckoperation konnte nicht initialisiert werdenDruck&vorschau …Erzeugung der Druckvorschau fehlgeschlagen.Druckvorschau …DruckersteuerungDiese Seite druckenIn Datei druckenDrucken …DruckerDruckbefehl:Drucker-EinstellungenDrucker-Einstellungen:Drucker …Drucker:DruckenDrucken von Fehler beim DruckenDrucken wird vom Web-Kontrollelement des Systems nicht unterstütztSeite %d wird gedrucktDrucke Seite %d von %dDrucke Seite %d …Drucke …AusdruckBearbeitung des Fehlerberichts fehlgeschlagen, belasse die Dateien im Ordner „%s“.Fortschritt:EigenschaftenEigenschaftEigenschaftsfehlerViolettQuarto, 215 × 275 mmFrageBeendenDieses Programm beendenLesefehler in Datei „%s“Lesen des Passwortes für „%s“ fehlgeschlagen: %s.BereitRotRot:WiederholenLetzte Aktion wiederholenAktualisiereRegistrierungsschlüssel „%s“ bereits vorhanden.Registrierungsschlüssel „%s“ existiert nicht, Umbenennung daher nicht möglich.Registrierungsschlüssel „%s“ wird vom System benötigt, durch seine Entfernung wird das System unbrauchbar: Abbruch.Registrierungswert „%s“ ist nicht binär (ist aber von der Art %s)Registrierungswert „%s“ ist nicht numerisch (ist aber von der Art %s)Registrierungswert „%s“ ist kein Text (ist aber von der Art %s)Registrierungswert „%s“ bereits vorhanden.RegulärRelativRelevante Einträge:Verbleibende Zeit:EntfernenGliederungspunkt entfernenAktuelle Seite aus Lesezeichen entfernenRenderer „%s“ hat eine ungültige Version %d.%d und kann nicht geladen werden.Liste neu nummerieren&Ersetzen...ErsetzenAlle &ersetzenErsetzen durch:Ersetzen...Erforderlicher Informationseintrag ist leer.Ressource „%s“ ist kein gültiger Nachrichtenkatalog.Das Erhalten einer Ausgabe einer JavaScript Meldung wird mit WebKit v1 nicht unterstütztGespeicherte Version wiederherstellenGratRec&hts nach linksRechtsRechter Rand (mm):Rechtsbündiger Text.RomanZeile %i&Vordefinierter Gliederungspunkt:SpeichernDatei %s speichernSpeichern &unter …Speichern unterSpeichern unter…Aktuelles Dokument speichernAktuelles Dokument mit einen anderen Dateinamen speichernLogtexte in Datei speichernSpeichern des Passwortes für „%s“ fehlgeschlagen: %s.SkriptBildlaufleisteSuchenDen Inhalt der Hilfebücher nach allen Vorkommen des oben eingegebenen Begriffs durchsuchenSuchrichtungSuchen nach:Alle Bücher durchsuchenSuchen …AbschnitteSuchfehler in Datei „%s“Positionierungsfehler bei Datei „%s“ (große Dateien werden nicht von stdio unterstützt).&Alles auswählenAlles auswählenDokument-Vorlage wählenDokument-Anzeige („View“) wählenNormal oder fett wählen.Normal oder kursiv wählen.Unterstrichen oder nicht unterstrichen wählen.AuswahlWählt die Listenebene zur Bearbeitung.Trennungszeichen nach der Option „%s“ erwartet.Stil der Zelle einstellenSetProperty aufgerufen ohne gültigen SetterEinstellungen …Mehrere aktive DFÜ-Verbindungen gefunden, eine davon wird zufällig ausgewählt.Schatten-Ausbreitung:SchattenSchattenf&arbe:Versteckte Verzeic&hnisse anzeigenV&ersteckte Dateien anzeigenZeige den „Über“-DialogAlles zeigenAlle Themen im Index anzeigenSuchbaum ein-/ausblendenZeigt einen Unicode-Teilzeichensatz.Zeigt eine Vorschau der Gliederungspunkteinstellungen.Zeigt eine Vorschau der Schriftarteinstellungen.Zeigt eine Vorschau der Schriftart.Zeigt eine Vorschau der Absatzeinstellungen.Zeigt die Schriftvorschau.SilberEinfaches einfarbiges ThemaEinzelGrößeGröße:ÜberspringenGeneigtKa&pitälchenFettDatei konnte nicht geöffnet werden.Nicht genug Speicher für Vorschau.Name bereits vergeben. Bitte anderen auswählen.Unbekanntes Dateiformat.Klangdaten haben ein nicht unterstütztes Format.Klangdatei „%s“ besitzt ein nicht unterstütztes Format.ZwischenraumRechtschreibprüfungStandardStatement, 5 1/2 × 8 1/2 ZollStatischStatus:StoppDurchstreichenString To Colour: Falsche Farbangabe „%s“StilStil:Tiefgestell&tHochge&stelltSuperA/SuperA/A4 227 × 356 mmSuperB/SuperB/A3 305 × 487 mmSilbe&ntrennung unterdrückenSwissSymbolSymbolschri&ftart:SymboleTIFF: Speicheranforderung fehlgeschlagen.TIFF: Fehler beim Laden des Bildes.TIFF: Fehler beim Lesen des Bildes.TIFF: Schreibfehler beim Speichern.TIFF: Schreibfehler beim Speichern.TIFF: Bildgröße ist außergewöhnlich groß.TabelleneigenschaftenTabloid Extra 11.69 × 18 ZollTabloid, 11 × 17 ZollTabulatorenEntenbraunSchreibmaschineVorlagenThai (ISO-8859-11)Der FTP-Server unterstützt keinen passiven Transfermodus.Der FTP-Server unterstützt nicht das PORT-Kommando.Die verfügbaren Gliederungspunktstile.Die verfügbaren Schriftarten.Die Hintergrundfarbe.Das Rahmenlinien-Format.Die untere Randgröße.Die untere Auffüllung.Abstand nach unten.Die Gliederungspunktzeichen.Der Zeichencode.Die Zeichensatz „%s“ ist nicht bekannt. Wählen Sie einen Ersatzzeichensatz oder „Abbrechen“, falls er nicht ersetzt werden kannDas Format „%d“ für die Zwischenablage existiert nicht.Der voreingestellte Stil für den nächsten Absatz.Verzeichnis „%s“ existiert nicht. Soll es jetzt erstellt werden?Das Dokument „%s“ ist zu breit für die Seite und wird beim Drucken abgeschnitten. Wollen Sie dennoch mit dem Drucken fortfahren?Die Datei „%s“ existiert nicht und konnte nicht geöffnet werden. Sie wurde aus der Liste kürzlich verwendeter Dateien entfernt.Der Ersteinzug.Die folgende Debugmeldung wird erzeugt Die Schriftfarbe.Die Schriftart.Die Schriftart aus der das Symbol entnommen wurde.Die Schriftgröße in Punkt.Die Schriftgröße in Punkt.Einheit der Schriftgröße in Punkt oder Pixel.Der Schriftschnitt.Die Schriftdicke.Das Format der Datei „%s“ konnte nicht bestimmt werden.Der horizontale Versatz.Der Linkseinzug.Der linke Rand.Die linke Auffüllung.Abstand nach links.Der Zeilenabstand.Die Nummer des Listenelements.Die lokale ID ist unbekannt.Die Objekthöhe.Die maximale Objekthöhe.Die maximale Objektbreite.Die minimale Objekthöhe.Die minimale Objektbreite.Die Objektbreite.Die Umrandungsebene.Die vorangegangene Nachricht wurde %u Mal wiederholt.Die vorangegangene Nachricht wurde %u Mal wiederholt.Die vorangegangene Nachricht wurde ein Mal wiederholt.Der anzuzeigende Bereich.Der Fehlerbericht enthält die unten aufgelisteten Dateien. Bitte stellen Sie sicher, dass alle Dateien, die vertrauliche Informationen enthalten, nicht ausgewählt sind; sie werden dann aus dem Fehlerbericht entfernt. Der benötigte Parameter „%s“ wurde nicht angegeben.Der Rechtseinzug.Der rechte Rand.Die rechte Auffüllung.Abstand nach rechts.Die Schatten-Weichzeichnungsentfernung.Die Schattenfarbe.Die Schattendeckkraft.Die Schatten-Ausbreitung.Der Abstand nach einem Absatz.Der Abstand vor einem Absatz.Der Stilname.Der Stil auf dem dieser Stil basiert.Die Schriftvorschau.Das System kann die angegebene Datei nicht finden.Die Tabulatorposition.Die Tabulatorpositionen.Der Text konnte nicht gespeichert werden.Der obere Rand.Die obere Füllung.Abstand nach oben.Der Wert für die Option „%s“ muss angegeben werden.Wert des Eckradius.Die Version des auf dieser Maschine installierten RAS-Dienstes ist zu alt. Bitte auf den neusten Stand bringen (die folgende benötigte Funktion fehlt: %s).Der vertikale Versatz.Es gab ein Problem bei der Seiteneinrichtung: eventuell müssen Sie einen Standarddrucker einrichten.Dieses Dokument ist zu breit für die Seite und wird beim Drucken abgeschnitten.Dies ist kein %s.Diese Plattform unterstützt keine Hintergrundtransparenz.Dieses Programm wurde mit einer zu alten Version von GTK+ übersetzt, bitte mit GTK+2.12 oder neuer erstellen.Dieses Programm ist nicht mit EGL-Unterstützung kompiliert worden, die unter Wayland benötigt wird, entweder installieren Sie die EGL-Bibliotheken and erzeugen sie das Programm neu oder lassen Sie es unter einem X11 Hintergrund laufen, indem Sie die Umgebungsvariable GDK_BACKEND=x11 setzen, bevor Sie ihr Programm starten.Thread-Modul-Initialisierung fehlgeschlagen: Wert konnte nicht im lokalen Speicherbereich des Thread gespeichert werdenThread-Modul-Initialisierung fehlgeschlagen: Thread-Schlüssel konnte nicht erstellt werdenThread-Modul-Initialisierung fehlgeschlagen: Index konnte nicht im lokalen Speicherbereich des Thread allokiert werdenThread-Prioritätseinstellung wird ignoriert.&Horizontal anordnen&Vertikal anordnenTimeout beim Warten auf eine Verbindung zum FTP-Server, versuchen Sie passiven Modus.Tipp des TagesBedauere, Tipps stehen nicht zur Verfügung!Bis:Zu viele EndStyle-Aufrufe!MinihilfeMinihilfe-TextObenOberer Rand (mm):Übersetzungen von ÜbersetzerWahrBeim Versuch die Datei „%s“ aus dem VFS-Speicher zu entfernen, wurde festgestellt, dass sie gar nicht geladen war!Türkisch (ISO-8859-9)TypSchriftart eingeben.Größe in Punkt eingeben.Typfehler in Argument %u.Typ muss eine enum-long-Umwandlung habenDie Typoperation „%s“ ist fehlgeschlagen: Die Eigenschaft bezeichnet mit „%s“ ist vom Typ „%s“, NICHT „%s“.US Std Endlospapier, 14 7/8 × 11 ZollUS-ASCIIInotify-Überwachung konnte nicht hinzugefügt werdenKqueue-Überwachung konnte nicht hinzugefügt werdenDas Handle konnte nicht mit dem I/O-Completion-Port verknüpft werdenI/O-Completion-Port-Handle konnte nicht geschlossen werdenInotify-Instanz konnte nicht geschlossen werdenPfad „%s“ konnte nicht geschlossen werdenDas Handle für „%s“ konnte nicht geschlossen werdenDer I/O-Completion-Port konnte nicht erstellt werdenErzeugen des IOCP-Arbeitsthreads fehlgeschlagenErzeugen der Inotify-Instanz fehlgeschlagenErzeugen der Kqueue-Instanz fehlgeschlagenNicht möglich das Komplettierungspaket aufzulösenEreignisse von Kqueue zu erhalten fehlgeschlagenNicht möglich GTK+ zu initialisieren, ist DISPLAY korrekt gesetzt?Pfad „%s“ lässt sich nicht öffnenDas angeforderte HTML-Dokument konnte nicht geöffnet werden: %sDer Klang kann nicht asynchron abgespielt werden.Nicht möglich den Ausführungsstatus zu sendenKonnte nicht vom Inotify-Beschreibungselement lesenZurücksetzen der inotify-Überwachung nicht möglich %iZurücksetzen der kqueue-Überwachung nicht möglichKonnte die Überwachung für „%s“ nicht aufsetzen.IOCP-Arbeitsthread konnte nicht gestartet werdenLöschen rückgängig machenUnterstreichenUnterstrichenRückgängigLetzte Aktion zurücknehmenUnerwartete Zeichen folgen der Option „%s“.Unerwartetes Ereignis für „%s“: Kein passender Überwachungs-Deskriptor.Unerwarteter Parameter „%s“Neuer unerwarteter I/O-Completion-Port wurde erstelltUnfreundliche Beendigung des ArbeitsthreadsUnicodeUnicode 16 Bit (UTF-16)Unicode 16 Bit Big Endian (UTF-16BE)Unicode 16 Bit Little Endian (UTF-16LE)Unicode 32 Bit (UTF-32)Unicode 32 Bit Big Endian (UTF-32BE)Unicode 32 Bit Little Endian (UTF-32LE)Unicode 7 Bit (UTF-7)Unicode 8 Bit (UTF-8)Einrücken aufhebenEinheit für die untere Randbreite.Einheiten für den unteren Rand.Einheiten für die untere Umrissbreite.Einheiten für die untere Auffüllung.Einheit für den Abstand nach unten.Einheit des Eckradius.Einheiten für die linke Randbreite.Einheiten für den linken Rand.Einheiten für die linke Umrissbreite.Einheiten für die linke Auffüllung.Einheit für den Abstand nach links.Einheiten für die maximale Objekthöhe.Einheiten für die maximale Objektbreite.Einheiten für die minimale Objekthöhe.Einheiten für die minimale Objektbreite.Einheiten für die Objekthöhe.Einheiten für die Objektbreite.Einheiten für die rechte Randbreite.Einheiten für den rechten Rand.Einheiten für die rechte Umrissbreite.Einheit für die Auffüllung rechts.Einheit des Abstands nach rechts.Einheit für die Breite des oberen Randes.Einheiten für den oberen Rand.Einheit für die Breite des oberen Umrisses.Einheit für die obere Auffüllung.Einheit des Abstands nach oben.Einheiten für diesen Wert.UnbekanntUnbekannter DDE-Fehler %08xUnbekanntes Objekt an GetObjectClassInfo übergebenUnbekannte Einheit für die PNG-Auflösung %dUnbekannte Eigenschaft %sUnbekannte TIFF-Auflösungseinheit %d ignoriertUnbekannte Basis %d. Basis 10 wird verwendet.Unbekannter Fehler bei Behandlung dynamischer BibliothekUnbekannte Kodierung (%d)Unbekannter Fehler %08xUnbekannte AusnahmeUnbekanntes Bilddateiformat.Unbekannte „long“-Option „%s“Unbekannter Name oder unbekanntes Argument.Unbekannte Option „%s“Unzutreffendes „{“-Zeichen in einem Eintrag des MIME-Typs %s.Unbenanntes KommandoNicht angegebenNicht unterstütztes Format in der Zwischenablage.Unbekanntes Thema „%s“.HochGroßbuchstabenRömische Ziffern in GroßbuchstabenVerwendung: %s&Schatten verwendenBenutze die aktuellen Einstellungen für die Ausrichtung.Benutzername:Die Benutzung von privaten Schriftarten wird auf diesem System nicht unterstützt: Die Pango-Bibliothek ist zu alt, die Version 1.38 oder eine spätere wird dazu benötigt.Verifizierungs-KonfliktWertWert muss %s oder höher sein.Wert muss %s oder kleiner sein.Wert muss zwischen %s und %s liegen.Version Vertikale Ausrichtung.Dateien mit Details anzeigenDateien als Liste anzeigenDarstellungWARNUNG: Das Benutzen der XIM-Eingabemethode wird nicht unterstützt und kann zu Problemen mit der Eingabebehandlung und zum Flackern führen. Erwägen Sie das Zurücksetzen von GTK_IM_MODULE oder das Setzen auf "ibus".Warten auf Eingabe-/Ausgabe-Epoll-Beschreibungselement %d fehlgeschlagenWarnung: DickeWesteuropäisch (ISO-8859-1)Westeuropäisch mit Euro (ISO-8859-15)Ob der Schrifttyp unterstrichen ist.WeißGanzes WortNur ganze WorteWin32-ThemaFensterWindowFrameWindowTextWindows Arabisch (CP 1256)Windows Baltisch (CP 1257)Windows Zentraleuropäisch (CP 1250)Windows Vereinfachtes Chinesisch (CP 936) oder GB-2312Windows Traditionelles Chinesisch (CP 950) oder Big-5Windows Kyrillisch (CP 1251)Windows Griechisch (CP 1253)Windows Hebräisch (CP 1255)Windows Japanisch (CP 932) oder Shift-JISWindows Johab (CP 1361)Windows Koreanisch (CP 949)Windows Thailändisch (CP 874)Windows Türkisch (CP 1254)Windows Vietnamesisch (CP 1258)Windows Westeuropäisch (CP 1252)Windows/DOS OEM (CP 437)Windows/DOS OEM Kyrillisch (CP 866)Schreibfehler bei Datei „%s“Fehler beim Lesen des XML: „%s“ in Zeile %dXPM: Ungültige Pixeldaten!XPM: nicht korrekte Farbbeschreibung in Zeile %dXPM: nicht korrektes Kopfformat!XPM: ungültige Farbdefinition „%s“ in Zeile %d!XPM: keine Farben für die Maske übrig!XPM: abgeschnittene Bilddaten in Zeile %d!GelbJaSie können hier kein neues Verzeichnis anlegen.Sie haben einen ungültigen Wert eingegeben. Drücken Sie ESC um die Bearbeitung zu beenden.VergrößernVer&größernVer&kleinernVergrößernVerkleinern&Passende GrößeEinpassenEine DDEML-Anwendung hat eine „prolonged race condition“ ausgelöst.Eine DDEML-Funktion wurde aufgerufen, ohne vorher die Deinitialisierungs-Funktion aufzurufen, oder ein ungültiger „instance identifier“ wurde an eine DDEML-Funktion übergeben.Der Versuch eines Clients, eine Verbindung herzustellen, ist fehlgeschlagen.Eine Speicheranforderung ist fehlgeschlagen.Ein Parameter wurde von DDEML nicht verifiziert.Eine Anfrage für eine „synchronous advise transaction“ ist fehlgeschlagen (time-out)Eine Anfrage für eine „synchronous data transaction“ ist fehlgeschlagen (time-out)Eine Anfrage für eine „synchronous execute transaction“ ist fehlgeschlagen (time-out)Eine Anfrage für eine „synchronous poke transaction“ ist fehlgeschlagen (time-out)Eine Anfrage, eine „advise transaction“ zu beenden ist, fehlgeschlagen (time-out)Ein Verbindungs-Versuch vom Server wurde vom Client unterbrochen, oder der Server beendete bevor die Transaktion vollständig beendet wurde.Eine Transaktion ist fehlgeschlagen.Eine Anwendung, die als ein „APPCLASS_MONITOR“ gestartet wurde, versuchte eine DDE-Transaktion auszuführen, oder eine Anwendung, die als ein „APPCMD_CLIENTONLY“ gestartet wurde, versuchte eine Server-Transaktion auszuführen.Ein interner Aufruf zur „PostMessage“-Funktion ist fehlgeschlagen. Ein interner Fehler ist im DDEML aufgetreten.Eine ungültige Transaktions-Identifizierung wurde an eine DDEML-Funktion übergeben. Sobald die Anwendung aus einem „XTYP_XACT_COMPLETE“-Callback zurückkehrt, ist die Transaktions-Identifizierung für diesen Callback nicht mehr gültig.Nehme an, dies ist ein mehrteiliges, zusammenhängendes Zip-ArchivVersuch den unveränderlichen Schlüssel „%s“ anzupassen wurde ignoriert.Ungültige Argumente für die BibliotheksfunktionUngültige Unterschriftungültiges Offset zum Einsprung in der ZipdateibinärfettErzeugungsversion %luKann Datei „%s“ nicht schließenKann Dateibeschreibung „%d“ nicht schließenKann Änderungen in Datei „%s“ nicht sichernKann Datei „%s“ nicht anlegenKann Konfigurationsdatei „%s“ nicht löschenAuf Dateibeschreibung „%d“ kann nicht festgestellt werden, ob das Dateiende erreicht istkann Zentralverzeichnis im Zip nicht findenKann auf Dateibeschreibung „%d“ die Dateilänge nicht findenKann Benutzerverzeichnis nicht finden, verwende aktuelles Verzeichnis.Kann auf die Dateibeschreibung „%d“ nicht entladenKann auf die Dateibeschreibung %d nicht positionierenKann keine Schriftarten mehr laden, AbbruchKann Datei „%s“ nicht öffnenKann globale Konfigurationsdatei „%s“ nicht öffnen.Kann Konfigurationsdatei „%s“ nicht öffnen.Kann Benutzer-Konfigurationsdatei nicht öffnen.Kann den zlib deflate-stream nicht reinitialisierenKann den zlib inflate-stream nicht reinitialisierenKann Dateibeschreibung „%d“ nicht lesenKann Datei „%s“ nicht löschenKann temporäre Datei „%s“ nicht löschenKann auf der Dateibeschreibung „%d“ nicht suchenKann den Puffer „%s“ nicht schreiben.Kann auf Dateibeschreibung „%d“ nicht schreibenKann Benutzer-Konfigurationsdatei nicht schreiben.ausgewähltPrüfsummen-FehlerPrüfsummenfehler beim Lesen der tar-KopfeintragescmFehler beim KomprimierenDatumFehler beim EntpackenStandardDoppelte GenauigkeitDump des bearbeiteten Zustands (binär)achtzehnteachteelfteEintrag „%s“ erscheint in Gruppe „%s“ mehrfachFehler im DatenformatFehler beim Öffnen der DateiFehler beim Lesen des Zentralverzeichnisses im ZipFehler beim Lesen des lokalen Headers in ZipdateiFehler beim Schreiben von Zip-Eintrag „%s“: Falsche Prüfsumme oder LängeFehler beim Schreiben des Zip-Eintrages „%s“: Datei zu groß ohne ZIP64sehr fettsehr schwerextra dünnAuswertung fehlgeschlagenVersuch, die Datei „%s“ zu entladen, fehlgeschlagenfalschfünfzehntefünfteDatei „%s“, Zeile %zu: „%s“ hinter Gruppenkopf ignoriert.Datei „%s“, Zeile %zu: „=“ erwartet.Datei „%s“, Zeile %zu: Eintrag „%s“ taucht erstmals in Zeile %d auf.Datei „%s“, Zeile %zu: Wert für nicht-änderbaren Eintrag „%s“ ignoriert.Datei „%s“: unerwartetes Zeichen %c in Zeile %zu.DateienersteSchriftgrößevierzehntevierteausführliche Log-Nachrichten erstellenschwerBildunvollständiger Kopfeintrag in tarEvent-Handler-Zeichenkette falsch, Punkt fehltFalsche Größe für tar-EintragDie Eingabe wurde mit einer unbekannten XZ-Option komprimiertEingabe ist beschädigtEingabe ist nicht im XZ-Formatungültige Daten in erweitertem tar-Kopfeintragungültiger Rückgabewert des HinweisfenstersUngültige Zip-DateikursivHinzufügenAlt+ZurückRücktasteAbbrechenGroßbuchstabenLöschenBefehlstasteStrg+DezimaltrennzeichenEntfLöschenDivisionHerunterEndeEingabeEscEscAusführenFHilfeStartEinfgEinfügenNum_Num_PlusNum_AnfangNum_DezimalNum_EntfNum_DivisionNum_RunterNum_EndeNum_EingabeNum_GleichKP_FNum_Pos1Num_EinfgNum_LinksNum_MalNum_NächsterNum_Bild↓Num_Bild↑Num_VorigerNum_RechtsNum_TrennzeichenNum_LeertasteNum_MinusNum_TabNum_HochLinksMenüMultipliziereNum *Num +Num ,Num -Num .Num /Num =Num AnfangNum LöschenNum RunterNum EndeNum EingabeNum Pos1Num EinfgNum-TasteNum Bild↓Num Bild↑Num RechtsNum LeerNum TabNum HochNum LinksNum-TasteBild↓Bild↑Bild↓Bild↑PauseBild↓Bild↑DruckenRawCtrl+EingabeRechtsSPEZIALRollen-TasteRollen-TasteAuswahlTrennzeichenUmschalt+DrucktasteLeerMinusTabulatorHochWindows_LinksWindows_MenüWindows_RechtsaltstrgNum strgUmschaltlibcurl konnte nicht initialisiert werdendünnÜber %sÜber …%s ausblendenAndere ausblendenEinstellungen …%s beendenDiensteAlles zeigenmittelMitternachtneunzehnteneuntekein DDE-Fehler.kein FehlerKeine Schriftarten in %s, gefundennamenlosmittagsNormalnumObjekte können keine XML-Textknoten habennicht genug SpeicherBearbeite KontextbeschreibungptpxLesefehlerBeim Lesen von Zipstream (Eintrag %s): Falsche PrüfsummeBeim Lesen von Zipstream (Eintrag %s): Falsche LängeProbleme beim Wiedereintreten.zweiteSeek-FehlerhalbfettsiebzehntesiebteZeige diesen HilfstextsechzehntesechsteGeben Sie eine zu verwendende Bildschirmauflösung ein (z. B. 640x48-16)geben Sie das zu benutzende Thema an&HilfeStandard/KreisStandard/KreisumrissStandard/RauteStandard/QuadratStandard/DreieckGespeicherte Dateilänge nicht in Zip-HeaderstrDurchstreichentar-Eintrag nicht geöffnetzehntedas Ergebnis zur Transaktion hat das „DDE_FBUSY“-Bit gesetzt.dünndrittedreizehnteheutemorgenAbschließenden Gegenschrägstrich in „%s“ ignoriertÜbersetzerwahrzwölftezwanzigstenicht ausgewähltunterstrichenuntentschiedenunerwartetes " an Position %d in „%s“.Unerwartetes Ende der Dateiunbekanntunbekannt (%lu)Unbekannte Klasse %sUnbekannter Fehler beim KomprimierenUnbekannter Fehler beim Entpackenunbekannter Fehlerunbekannter Fehler (Fehlercode %08x).unbekannt-%dUnbenanntUnbenannt%dnicht unterstütztes Zip-KompressionsformatVerwende Nachrichtenkatalog „%s“ von „%s“.SchreibfehlerwxGLCanvas wird im Moment nur auf Wayland und X11 unterstützt. Sie können das möglicherweise umgehen, indem Sie die Umgebungsvariable GDK_BACKEND=x11 setzen, bevor Sie ihr Programm starten.wxGetTimeOfDay fehlgeschlagen.wxWidgets konnte „open display“ nicht ausführen für „%s“: Abbruch.wxWidgets konnte Display nicht öffnen. Abbruch.xxxxGesternzlib-Fehler %d~tqsl-2.8.1/apps/lang/es/0000755000175000017500000000000015003421124014766 5ustar rmurphyrmurphytqsl-2.8.1/apps/lang/es/tqslapp.mo0000644000175000017500000024124715003421124017021 0ustar rmurphyrmurphy ,:::,::&;6;O;)l;0;;+;7<DF<<<<<<=.0=)_=V=G=(>=>X>_>;u> >>>$>? ?"?>?D?$J?o? ??<?#?%@'.@V@)h@D@$@@&A&+A7RA A A5AAA: BTGBBBB BBC C C'C/C7CC{C'C!C$CC& D3D%D0D6 EBDE EEEEE FF$FAFGFPFiaFF FF FFG"G1G KGUG oG zG GG'GGGVG?UH/H(HH+I#0I)TI~I I!I I=IJ%J9JPJ'dJJJ&JJKS*K ~KK4KK(K$L@L.M;3MAoM3M+M=NBONYNINF6OT}OOO#O'P59P oP}PP P P PPPPPPQ-3QaQ|QiQ Q Q R,RBRVReR@jR}R)S;SBSKSdS~SS(S#S(ST+;TgT<T!T'T/U(8U/aUU;UUUV!V1&VXVnV VVVVV,VW(W^%D^j^|^^^H^Q_IV_ _ _0_5_!`&&`M`U`Bd`U``a "a-aAarambccd|7ee eee(f@f^fnRh1i,iS j'tjjjj1j:k-Ak-ok-kkkk' l"2l$Ul!zll8mRAmPmNm4nKnan}nnnn nn+n'o*oDo _omosoooo o ooo ooooop@#pdpspp pppppq q;qcZqqIrPrmrprrrrs)s HsRs msxssBs8s t,t3tHthtyttt t t2tu5(uG^u_u=vcDvv"vRvT6w w wwww$wx4x&Jxqx xx xx x xxx#xyy!y3:yny6yyFyLz-fzdzxz7r|k|} }@}I}]}l}"}}}$}"}~)~$;~`~~~~~~&~I Wl>s   !'= eq#ƀ #(Cl$|*́-&F`y*.)܂&8Hfw+:(4!N#p…ޅ/K+g ÆΆֆ  (32I |(wЇ'HLpJ 0&G&n,+‰9\*+]_K\^6g%čD3',[}1(/0X.\u515)a#ɕ[awC5.y+4ԗ! +I avlu$Ew3b9DЛ8N^S=V[^1d6;͞+ 5L]]N% ,0]BzRܠC/s֡ݡ&,)KuTǣ ܣ&8Ǥ56<QƦs.EϨHhe&6_]<"0/N ~]A!?$aԮ+ :5Qp¯1 \<YDZ:! \gn ; в ڲ   +8MD_?A]v59˵2!:TX# 'E%c.,׷^Jcø #Y lw/ù"˹$$#H YfC{+$->.ZW42=Hp ļ@Ҽ(<FY`&("/R!g  ˾:@$(e'3/*1?NX*5B` |LUj r|# #  + 7&D4kW@-An"/=6\ )7PYt)&%'7_}X G*&r#03"J)[tH>TXZhcqZd0 .<G)q/ &  $'D)l*i 3@ O.]Iq!"$6<4s$)&A$`3++@R:kB!.P(p" ?+'D-l9H#"A(d"P@=BND*!' 0H6y#;1/B>r2$# '-5U3/<<,8i;,6 5Bx ;I-64?t;!'h9vo ?< (&OWKjZ$6 ?JDp2sB''$O't05ptE21xm/H]t5>1/00`1+2F.yGrNrt46Jgv?09KQ cpx !@LP!.H(c#4we,FNelu"(5^o \F*Kv'+"1TjC8NOe?W M*nZcX k*x))-)Is  +)@#SDw&H,RBWHb67D|1 JWo "#7!O(q&$!D> H ,-Cq2 " ( $H m !  0 6 1 4H :}  $ > 0< 'm '  6 1 +. Z m      /   L7[C62A ^& ($&)F?p*$'Lc =0$?d+fW@#/(S8|BB&(kjlkc0)'*IRC<l/<&,c_}-n9/ b !!S&"z"9##@#3d#A##$#$(5$^${}$w$yq%-%&V& '<'H'?"(=b((n()*++ +P3+c+Q+?:,z,,p,l-0-:-#-Q."c.X.Z.:/N/ k/w/0/////+040$I0n0$0$0v0G1122 .2 :2F2 2+3;@3'|3#37344M55/66z7PO8d89.9T9=R:):0:6:!";lD<><&<==U=s==="=6=/>XI>>`?7?k)@@@W@G!AiA xAA A?A A A B B&B8BGBMB^BtBB: j`8tcI%c-r~\,AVjCH9Y-'9Bm<{")?3 ^W&' +D\._s>+W58&VwgJK}@kN;(OZs0yn R9MYHX)$RrG;NU]l\|Pm$ohwIBVFq*Sz=!U^<xGFj/Fyf b2a< =d7G ota_~~2x| p %4IBn8+rYlQPS*g7'L| DeLvc K2N/7 okv@ p nK3:aMh!z#dJ{A{m}e1QzkOs[XP"puu>,g]wbMWulLC}56#E;"fqv],?Ri6Z1-_)6%OTxU$=E@`fd[`hiq^ J4b#A5:>(!Q0E TiHX&S1CZ/ e[4 D?(T.3*.0ty to %d QSO Records%d of %d QSOs are previously signed; aborted%s Uploaded with result: %s%s is ready to be emailed or uploaded.%s uploaded successfully%s uploaded with result: %s%s: %d QSO records were previously signed%s: %d QSOs were outside the selected date range%s: %s upload was rejected%s: %s upload was rejected with result "%s"%s: Couldn't upload the file: CURL returned "%hs" (%hs)%s: Got an unexpected response on %s upload! Maybe the site is down?%s: Invalid Grid Field%s: Invalid Grid Square%s: Invalid Grid Sub-subsquare%s: Invalid Grid Subsquare%s: Invalid Gridsquare Format%s: Log uploaded successfully%s: Log uploaded successfully with result: %s%s: Unable to connect to the upload site.%s: Unable to upload - either your Internet connection is down or LoTW is unreachable.%s: Unable to upload. The network is down or the LoTW site is too busy.%s: Upload cancelled%s: wrote %d records to %s&About&Add Station Location&Backup Station Locations, Certificates, and Preferences...&Contents&Delete&Delete Callsign Certificate&Display Station Location Properties&Edit&Edit Station Location&Edit existing ADIF file...&File&Help&Load Callsign Certificate from File&Preferences...&Properties&Renew Callsign Certificate&Restore Station Locations, Certificates, and Preferences...&Restore a Deleted Station Location&Save Callsign Certificate to File...&Sign and save ADIF or Cabrillo file...&Station Location&Test Signing an ADIF or Cabrillo file...'Satellite' propagation mode selected, so a Satellite must be chosen'Save Callsign Certificate' command.A new TQSL release (V%s) is available!A new TQSL release (V%s) is available.A new TrustedQSL configuration file (V%s) is available.ADIF Mode:ADIF ModesADIF content is not valid. '%hs' is not valid for %hsADIF field has invalid contentsADIF file extensions:ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*.*)|*.*Aborting due to user cancellingAboutActive, usable certificatesAdd ADIF modeAdd ADIF mode mapping:Add QSOAdd Station LocationAdd...AddressAdministrator ErrorAfter reading this message, you may close this program.AlertAll QSOs are previously signed; abortedAllow TQSL to continue this time.Allow automatic configuration backupAllow nonamateur call signsAlways allow running as Administrator.An updated TrustedQSL configuration file (V%s) is available! The configuration file installs definitions for entities, modes, etc.Another copy of TQSL is signing a logAre you sure you want to delete the certificate?Are you sure you want to delete this station location?Are you sure you want to proceed? Click 'No' to review the choicesAre you sure?Attempting to upload %d QSOsAttempting to upload %sAttempting to upload one QSOAwaiting response from ARRLBackup ErrorBackup File Folder:Backup operation failed: %hsBand:Begins: Buffer too smallCAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause issues with handling awards.CONTESTCONTEST Name:CQ ZoneCQ Zone: Cabrillo CONTESTCabrillo CONTEST definitions:Cabrillo SpecsCabrillo file extensions:Call SignCall Sign cannot be emptyCall Sign:Call sign:Call sign: Call-Worked Field Number:Call-worked field must be %d or greaterCallsign &CertificateCallsign CertificateCallsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6Callsign Certificate does not match QSO detailsCallsign Certificate not TQSL compatibleCallsign CertificatesCallsign certificate could not be installedCan't open TQSL update file %s: %hsCan't open new configuration file %s: %hsCancelCancelledCertificate Authority certificateCertificate Container PassphraseCertificate Container files (*.p12)|*.p12|All files (*.*)|*.*Certificate ExpiringCertificate Issuer:Certificate PropertiesCertificate RequestCertificate not initialized for signingCertificate provider not foundCertificate saved in file %sCertificates replaced with a newer oneCertificates that have expiredChanges have not been savedChanges to the status message configuration will take affect when TQSL is restartedCheck ErrorCheck for &Updates...Check for updates to tqsl and the configuration fileChecking for TQSL updates...Choose a Callsign Certificate to restoreChoose a Station Location to restoreChoosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'CityClick 'Cancel' if this is not the correct Station Location.Click 'Cancel' to abandon processing this log file (Recommended).Click 'Cancel' to abandon processing this log file.Click 'Cancel' to abandon signing this log.Click 'Finish' to complete this Callsign Certificate request.Click 'Ignore' to continue signing this log while ignoring errors.Click 'New QSOs Only' to sign normally, without the previously signed QSOs (Recommended).Click 'OK' to install the new configuration file, or Cancel to ignore it.Click 'OK' to install the new version of TQSL, or Cancel to ignore it.Click 'Re-Upload QSOs' to re-process this log while allowing previously signed QSOs.CloseCommand Syntax ErrorConfiguration file cannot be openedConfiguration file successfully updatedConfiguration files (*.tbk)|*.tbk|All files (*.*)|*.*Confirm CloseContestContest name cannot be blankContest typeContinentConverting Could not spawn upload thread!CountryCountyCounty: Create &New ADIF file...Create a new Station LocationCreate an ADIF file for signing and uploadingCustom ADIF mode mappings:DELETEDDO NOT lose the passphrase you choose! You will be unable to use the Certificate without this passphrase!DXCC EntityDXCC Entity: DXCC entity:Data for this DXCC entity could not be foundDatabase Error: %hsDatabase errorDateDate of the first QSO you made or will make using this callsign:Date of the last QSO you made or will make using this callsign: (Leave this date blank if this is still your valid callsign.)Date out of rangeDeleteDelete "Delete Station Location Delete a Station LocationDia&gnostic ModeDisplay &DocumentationDisplay Callsign Certificate &PropertiesDisplay Station Location PropertiesDisplay Station Location Properties for Display a Callsign CertificateDisplay a Callsign Certificate's PropertiesDisplay command line helpDisplay details of previously signed QSOs when signing a logDisplay or Modify &Preferences...Display status messages in separate tabDisplay the Callsign Certificate properties forDisplay the version information and exitDo you really want to keep this 'QSO end date'?Do you want to renew it now?Do you want to upload this certificate request to LoTW now?Download from:Duplicate QSO detectedE&xit TQSL Alt-XEditEdit (if used with -l) or create Station LocationEdit Station LocationEdit Station Location Edit Station Location : %hs - %sEdit a Station LocationEdit...Email: Enable a Network ProxyEnable passphrases for Callsign CertificatesEnd Date (YYYY-MM-DD)End date is invalidEnd date of %s is invalidEnter a name for this Station LocationEnter a passphrase for this callsign certificate.Enter again to confirm:Enter file to save toEnter new passphraseEnter passphraseEnter the Passphrase to unlock the callsign certificateEnter the name for the new Certificate Container fileEnter the passphrase again for verification:Enter the passphrase for the certificate container file.Enter the passphrase to unlock the .p12 file:Enter the passphrase to unlock the callsign certificate for %hs -- %hs (This is the passphrase you made up when you installed the callsign certificate.)ErrorError checking for expired callsign certificates:Error compressing before uploadError creating Callsign Certificate RequestError creating callsign certificate request: %hsError downloading new configuration file:Error downloading new file:Error downloading new version information:Error downloading update version information:Error importing station locations: %hsError opening certificate request file %s: %hsError opening diagnostic log %s: %hsError opening input fileError opening output fileError opening save file %s: %hsError parsing certificate for DXCC entityError parsing certificate for call signError parsing certificate for issuerError parsing saved configuration file: %hsError parsing station location file: %hsError performing automatic backup: %hsError renaming backup file %s: %hsError while accessing certificate storeError writing new configuration file %s: %hsError: Could not upload file (CURL Init error)Errors DetectedErrors: %dExit TQSL so I can re-run as a normal userExit after processing log (otherwise start normally)Expected nameExpiredExpires: Export P12 files compatible with Apple KeychainExport to %s failed: %hsFieldFile name for diagnostic tracking logFile syntax errorFile syntax error: %hsFinal Status: %hs (%d)Frequency (MHz):Grid %s is not correct for your %s. Click 'Next' again to use it anyway.Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it anyway.Grid %s is not correct for your QTH. Click 'Next' again to use it anyway.Grid SquareGrid Square: Gridsquare is inconsistent with Station LocationHandle QTH information in ADIF logs with what action?HelpI am the QSL manager for this callsignIOTA IDIOTA Locator: IOTA reference %s is not correct. Must have a number after the '-'IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, OC- or SA-IOTA value %s is not valid.ITU ZoneITU Zone: If so, choose a callsign below for the primary LoTW account. If not, click 'Finish', and a new LoTW account will be set up for these QSOs.If you are planning to restore from a backup, please choose 'No'.If you are sure that the earlier request is now invalid you should delete the pending Callsign Certificate for %s.If you are using a US callsign outside of the US persuant to CEPT, IARP or other Reciprocity arrangements, FCC rules require you to be a US Citizen.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence no passphrase need be specified.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence, no passphrase need be specified.If you set an end date, you will not be able to sign QSOs past that date, even if the Callsign Certificate itself is still valid.If you still hold this callsign (or if you plan to renew the license for the callsign), you should not set a 'QSO end date'.IgnoreIgnore QTH details from your logIgnore callsigns in ADIF filesIgnore seconds in QSO timesImport a certificate file (.p12 or .tq6)Import completed successfullyIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is recommended, but a logger that does its own upload tracking may incorrectly set the status in this case. A logger that doesn't track uploads should be unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, will correctly mark all selected QSOs as sent - they are in your account even though they would not be in this specific batchIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'Incomplete Certificates - requires a matching TQ6Incorrect passphrase when importing P12 fileIncorrect settings can cause TQSL to be unable to upload logs or check for updates.Input ADIF or Cabrillo log file to signInstall CertificateInvalid %hs: "%hs"Invalid argumentInvalid contact - QSO does not specify a CallsignInvalid contact - QSO does not specify a band or frequencyInvalid contact - QSO does not specify a dateInvalid contact - QSO does not specify a modeInvalid contact - QSO does not specify a timeInvalid date formatInvalid error code: %dInvalid time formatInvalid zone selections for DXCC entityInvalid zone selections for oblastInvalid zone selections for provinceInvalid zone selections for stateIs this new certificate for a callsign where you already have a LoTW account, and you want the QSOs for this call to be added to an existing LoTW account? LanguageLeave the passphrase blank and click 'Finish' unless you want to use a passphrase.Leave the passphrase blank and click 'Next' unless you want to use a passphrase.Leave the passphrase blank and click 'OK' unless you want to use a passphrase.LoTW Connection FailedLoad Certificate FileLoad a Callsign CertificateLoading completeLocation data errorLog FileLog File ErrorLog HandlingLog OperationsLog files (*.log)|*.log|All files (*.*)|*.*Log in to the Logbook of the World SiteMemory allocation failureMissing from this computerMode ConflictMode:More details at:NO ERRORNONENameName existsNetwork ProxyNew DBNew PassphraseNew QSOs OnlyNew passphraseNew passphrase:New...No Callsign CertificatesNo CertificateNo Certificate Request matches the selected Callsign CertificateNo Private KeyNo QSO recordsNo QSOs to uploadNo UpdatesNo callsign certificate for keyNo logfile to sign!No records outputNo status information availableNoneNone of these applyNote: TQSL assumes that this file will be uploaded to LoTW.Note: TQSL has not recorded signing these QSOs. You can submit this log file to LoTW or discard it.Note: The e-mail address you provide here is the address to which the issued Certificate will be sent. Make sure it's the correct address!NoticeNumber of Backups to retain:OKOK to install OblastOblast: Once you supply the requested information and the request file has been created, you must send the request file to the certificate issuer.One QSO RecordOpen ADIF files in ADIF editorOpen FileOperator aborted operationOperator: OptionsOrganization: Output file name (defaults to input name minus extension plus .tq8Override Station Location with QTH details from your logPKCS#12 file not TQSL compatiblePark: Passphrase confirmedPassphrase entries do not matchPassphrase errorPassphrase for the signing keyPassphrase not correctPassphrase protectedPassphrase:Passphrase: Please choose a callsign for this Station LocationPlease choose language:Please install a callsign certificate then try again.Please review the introductory documentation before using this program.Please select a Callsign Certificate for the account where you would like the QSOs to be storedPlease select a Callsign Certificate to validate this requestPlease select the Callsign Certificate for your current personal callsign to validate your request.Please try again later.Please try uploading the %s later.Please verify that this is the correct Station Location for the QSOs being signed.Please wait until you receive an e-mail bearing your requested Callsign Certificate.Port Number:PreferencesPreviously Signed QSO detectedPreviously Signed QSOs DetectedPreviously Signed: %dPreviously signed QSOs were detectedPreviously signed: %dPrivate Key not foundPrompt for QSO Date range when signingPropagation Mode:PropertiesProvinceProvince: Proxy Address:Proxy Type:ProxyTypeQSO DataQSO Data ErrorQSO Data: Invalid Mode ignored - %sQSO Date RangeQSO End Date: QSO Frequency is invalidQSO Frequency is out of range for the selected bandQSO RX Frequency is invalidQSO RX Frequency is out of range for the selected bandQSO Start Date: QSO begin date: You must choose proper values for Year, Month and Day.QSO date is not within the date range specified on your Callsign CertificateQSO end date cannot be before QSO begin date.QSO end date: You must either choose proper values for Year, Month and Day or leave all three blank.QSO records signed using the Certificate will not be valid for DXCC award credit (but will be valid for other applicable awards). If the Certificate is to be used for signing QSOs from maritime/marine mobile, shipboard, or air mobile operations, that is the correct selection. Otherwise, you probably should use the "Back" button to return to the DXCC page after clicking "OK"QSOs for %hs will be stored in the LoTW account for %s.QSOs prior to the starting date or after the ending date will not be signed or included in the output file.QSOs: %dQuiet Mode - same behavior as -xRX Band:RX Frequency (MHz):Re-Upload QSOsRenew a Callsign CertificateRenew the Callsign Certificate forReplacedReport on QTH differencesRequest &New Callsign Certificate...Request a new Callsign CertificateRequest cancelledRestore Complete.Restore Deleted Callsign CertificateRestore operation failed: %hsRestoring Callsign CertificatesRestoring PreferencesRestoring QSO recordsRestoring Station LocationsRestoring callsign certificate for %hsResubmitting these QSOs will cause them to be reported as already signed.Resulting TQSL mode:Retry?Satellite choice requires that Propagation Mode be 'Satellite'Satellite:Save FileSave Station DataSave a Callsign CertificateSave operation complete.Save requestSave the Callsign Certificate forSaved configuration files (*.tbk)|*.tbkSaving QSOsSaving Station LocationsSaving TQSL PreferencesSaving callsign certificate for %hsSaving callsign certificatesSelect CallsignSelect Certificate FileSelect Station DataSelect Station Location for SigningSelect a Callsign Certificate to processSelect a FolderSelect a Station Location to processSelect a Station Location to process Select file to SignSelect file to write toSelect or enter name of this station locationSelect saved configuration fileSelected Station LocationSelects Station LocationSerial: Sign a log and save it for uploading laterSign a log and upload it automatically to LoTWSign and &upload ADIF or Cabrillo File...Signing File: Signing QSO DataSigning abandonedSigning abortedSigning aborted due to errorsSigning aborted.Signing cancelledSigning using Callsign %hs, DXCC Entity %hsSince you have no Callsign Certificates, you must submit an 'Unsigned' certificate request. This will allow you to create your initial Callsign Certificate for LoTW use. Click 'Finish' to complete this Callsign Certificate request.Some QSOs not processedSpecify QSO verification action - ignore, report or updateSpecify default callsign for log signingSpecify dialog action - abort, all, compliant or askSpecify end date for QSOs to signSpecify start date for QSOs to signStart Date (YYYY-MM-DD)Start date is invalidStart date of %s is invalidStateState: Station Data input completeStation LocationStation Location NameStation Location PropertiesStation Location data errorStation Location does not match QSO detailsStation LocationsStation name must be providedStatus LogSuccessSuppress date range dialogSystem error: %hsSystem error: %hs : %hsTQSL ConfirmTQSL ErrorTQSL Update AvailableTQSL Version %hs and Configuration Data Version %sTQSL WarningTQSL compressed data files (*.tq8)|*.tq8TQSL data files (*.tq7)|*.tq7TQSL is unable to sign QSOs because another instance of TQSL is busy. Terminate any other copies of TQSL and try again.TQSL must not be run 'As Administrator'TQSL must wait for other running copies of TQSL to exit before backing up...TQSL must wait for other running copies of TQSL to exit before signing ...TQSLLib ErrorThe %s '%hs' has value '%hs' while QSO has '%hs'The -a parameter %hs is not recognizedThe -f parameter %hs is not recognizedThe TQSL configuration file cannot be parsedThe TQSL upload tracking database is lockedThe callsign %s is not currently registered in the FCC ULS database. If this is a newly registered call, you must wait at least one business day for it to be valid. Please enter a currently valid callsign.The callsign certificate for callsign %hs has expired. This station location cannot be used to sign a log file until a valid callsign certificate is installed.The callsign is too long. Only %d characters are allowed.The certificate for %hs expires in %d daysThe certificate for %hs expires in %d days.The date of your first QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your first QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe file has not been saved. Should the QSOs be saved?The format of this file is incorrect.The invalid data was ignored.The log being signed has '%hs' set to value '%hs' which is not validThe log file you are uploading using your QSO Logging system consists entirely of previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The log file you are uploading using your QSO Logging system includes some previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The only reason to re-sign previously signed QSOs is if a previous upload was not processed by LoTW, either because it was never uploaded, or there was a server failureThe private key for callsign %hs serial %ld is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe private key for this Callsign Certificate is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe selected callsign could not be foundThe selected station location could not be foundThe two copies of the passphrase do not match.There are no callsign certificates for callsign %hs. This station location cannot be edited.There are no current callsign certificates for callsign %hs. This station location cannot be used to sign a log file.There are no deleted Callsign Certificates to restoreThere are no deleted Station Locations to restoreThere are no valid callsign certificates for callsignThere is a newer callsign certificate for callsign %hs. This station location cannot be used to sign a log file until the new certificate is installed.There is no valid callsign certificate for %hs in entity %hs available. This QSO cannot be signedThis Callsign Certificate cannot be installed as it has expired. Check if your computer is set to the proper date and that this is the latest Callsign Certificate. This Callsign Certificate cannot be installed as the first date where it is valid is in the future. Check if your computer is set to the proper date. This Callsign Certificate request requires approval using an existing Callsign Certificate.This address must match the FCC ULS database. If this address information is incorrect, please correct your FCC record.This callsign certificate is already active and cannot be restored.This callsign certificate is already installedThis callsign replaces my existing callsignThis file can not be processed due to a system errorThis file is not a valid P12 fileThis is a DXpedition callsignThis is a club callsignThis is a special event callsignThis is my former callsignThis log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and %d QSOs which are new.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and no new QSOs.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and one QSO which is new.This log has invalid QSO informationThis log has too many previously uploaded QSOs. Please only upload new QSOs or break the log into smaller pieces (50,000 QSOs or less).This mode definition conflicts with a standard mode definition for %sThis passphrase will have to be entered each time you use this callsign certificate for signing or when saving the key.This should be corrected before signing a log file.This will create a new Callsign Certificate request file.This will remove the selected callsign certificate from your system.This will remove this station location from your system.TimeTo import this passphrase protected P12 file, you must pass the passphrase on the command lineTo submit the signed log file to LoTW: 1. Move the signed log file to a computer with internet access 2. Log in to your LoTW Web Account 3. Select the Upload File tab 4. Click the Choose File button, and select the signed log file you created (%s) 5. Click the Upload file button Alternatively, you can attach the signed log file to an email message, and send the message to lotw-logs@arrl.orgTrusted root certificateTypeUPURL: US 1x1 callsign requests must provide an end dateUS 1x1 callsigns must end in letters A-Z excluding 'X'US 1x1 callsigns must have a number as the second characterUS 1x1 callsigns must start with W, K, or NUTC Date (YYYY-MM-DD):UTC Time (HHMM):Unable to check for updates - either your Internet connection is down or LoTW is unreachable.Unable to check for updates. The network is down or the LoTW site is too busy.Unable to connect to the update site.Unable to initialize random number generatorUnable to open %s for outputUnable to open ca-bundle.crt. Your TQSL installation is incompleteUnable to read - no permissionUnable to update - either your Internet connection is down or LoTW is unreachable.Unable to update. The network is down or the LoTW site is too busy.Undelete ErrorUnexpected LoTW ResponseUnknownUnknown custom errorUnusable: Missing Private KeyUpdateUpdate CompletedUploadUpload RejectedUpload after signing instead of savingUploading Callsign CertificateUploading Callsign Certificate Request...Uploading Signed DataUploading signed log data...Uploads database errorUse the "New" Button of the dialog you're about to see to define a Station Location.Use these settings to configure a network proxy for Internet uploads and downloads. You should only enable a proxy if directed by your network administrator.User CancelledValueVerify QTH details: WPX PrefixWarningWarning: The TQSL ADIF editor only processes a limited number of ADIF fields. Using the editor on an ADIF file can cause QSO details to be lost!What is this Callsign Certificate for?Wipe the TQSL uploads databaseWould you like to back up your callsign certificate now?Would you like to request a callsign certificate now?Wrote %d QSO records to %sYou WILL be able to recover it from a container (.p12) file,You cannot request a Callsign Certificate for a former callsign unless you hold a valid Callsign Certificate to be used to verify that request.You cannot request a certificate for a 1x1 callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot request a certificate for a portable callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot select DXCC Entity NONE as you must sign any request for entity NONE and you have no valid Callsign Certificates that you can use to sign this request.You do not need an account on LoTW to do this.You have already requested a Callsign Certificate for %s and can not request another until that request has been processed by LoTW Staff.You have already requested more than three Callsign Certificates for %s in the past 24 hours. You should submit a request only once, then wait for that request to be processed by LoTW Staff. This may take several business days.You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: You have changed the following fields in this Station Location: %s Do you want to discard those changes?You have chosen a QSO end date for this Callsign Certificate. The 'QSO end date' should ONLY be set if that date is the date when that callsign's license expired or the license was replaced by a new callsign.You have no Station Locations defined.You have no callsign certificate installed on this computer with which to sign log submissions.You have no callsign certificates to use to sign a log file.You have selected DXCC Entity NONEYou may leave either date (or both dates) blank.You may now send your new certificate request (You may protect this Callsign Certificate using a passphrase. If you are using a computer system that is shared with others, you should specify a passphrase to protect this Callsign Certificate. However, if you are using a computer in a private residence, no passphrase need be specified.You may set the starting and/or ending QSO dates in order to select QSOs from the input file.You must define at least one Station Location to use for signing.You must enter a valid call sign.You must enter a valid email addressYou must enter your addressYou must enter your cityYou must enter your nameYou must select a %hsYou must select a DXCC entity.You must select a band or enter a frequencyYou will NOT be able to recover it by loading a .TQ6 file.You will have to enter the passphrase any time you load the file into TrustedQSL.You will not be able to use this tq6 file to recover your callsign certificate if it gets lost. For security purposes, you should back up your certificate on removable media for safe-keeping.Your QTH Details changed for this QSO. Originally these were: %s Now they are:%s Please verify that you intended to change this QSO! Your certificate request did not upload properly.Your custom mode map %s conflicts with the standard mode definition for %hs and was deleted.Your e-mail addressYour system is up to dateYour upload appears to have failed. Do you want to save this request for uploading later?Your upload appears to have failed. Should TQSL try again?Zip/Postal[None]are the newest availablecertificate?if you have created one via the Callsign Certificate menu'sin entityon line %dor see:tQSL Cert Request files (*.to TQSL formatto:|ADIF files (|All files (|All files (*.*)|*.*|Cabrillo files (Project-Id-Version: TQSL V2.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2025-02-16 18:01-0500 PO-Revision-Date: 2025-02-17 16:45+0100 Last-Translator: Jordi Quintero Language-Team: TQSL Developers Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.5 a %d registros de QSOOperación abortada: %d de %d QSO están firmados anteriormente%s Cargado/s con resultado %s%s está listo para ser enviado por correo electrónico o subido.%s: subido correctamente%s cargado/s con resultado %s%s: %d registros de QSO fueron firmados anteriormente%s: %d QSO estaban fuera del rango de fechas seleccionado%s: %s subida fue rechazada%s: %s subida ha sido rechazada con resultado "%s"%s: No se pudo subir el fichero: CURL retornó "%hs"( %hs)%s: se obtuvo una respuesta inesperada al subir %s ! ¿Tal vez el sitio web no funcione?%s: campo de cuadrícula no válido%s: cuadrícula no válida%s: subcuadrícula no válida%s: subcuadrícula no válida%s: formato de cuadrícula no válido%s: Libro subido correctamente%s: Libro subido con éxito con resultado: %s%s: no se puede conectar al sitio de subida.%s: no se pudo subir - o bien su conexión de Internet no funciona o LoTW no está disponible.%s: no se pudo subir. No hay red o el sitio web de LoTW está muy ocupado.%s: Subida cancelada%s: escribió %d registros a %s&Acerca de&Añadir Ubicación de la Estación&Hacer copia de seguridad de las Ubicación de estaciones, Certificados y Preferencias...&Contenido&Borrar&Borrar Certificado&Mostrar Propiedades de Ubicación de Estación&Editar&Editar Ubicación de la Estación&Editar un fichero ADIF existente...&Fichero&Ayuda&Cargar certificado desde un fichero&Preferencias...&Propiedades&Renovar certificado&Restaurar Ubicación de Estaciones, Certificados y Preferencias...&Restaurar una ubicación estación borrada&Guardar certificado a un fichero...&Firmar y guardar ficheros ADIF o Cabrillo...Ubicación de la &Estación&Prueba de firma de fichero ADIF o Cabrillo...Modo de propagación 'Satélite' seleccionado, por lo que debe seleccionar un satéliteComando 'Guardar certificado'.¡Una nueva versión de TQSL (V%s) está disponible!Está disponible una nueva versión de TQSL (V%s).Está disponible un nuevo fichero de configuración de TrustedQSL (V%s).Modo ADIF:Modos de ADIFEl contenido de ADIF no es válido. '%hs' no es válido para %hsEl campo ADIF tiene contenido no válidoExtensiones de fichero ADIF:Ficheros ADIF (*.adi;*.adif)|*.adi;*.adif|Todos los ficheros (*.*)|*.*Ficheros ADIF (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|Todos los ficheros (*.*)|* *Abortando por cancelación del usuarioAcercaCertificados activos y utilizablesAñadir modo de ADIFAñadir asignación de modo ADIF:Añadir QSOAñadir ubicación de estaciónAñadir...DirecciónError de administradorDespués de leer este mensaje, puede cerrar este programa.AlertaOperación abortada: Todos los QSO están firmados anteriormentePermitir a TQSL para continuar esta vez.Permitir copia de seguridad automáticaPermitir indicativos que no sean de radioaficionadoPermitir siempre ejecución como administrador.¡Un fichero actualizado de configuración de TrustedQSL (V %s) está disponible! El fichero de configuración instala definiciones para entidades, modos, etc..Otra copia de TQSL está firmando un libro¿Está seguro que desea eliminar el certificado?¿Está seguro que desea eliminar esta ubicación de estación?¿Está seguro que desea proceder? Haga clic en 'No' para revisar las opciones¿Estás seguro?Intentando subir %d QSOsIntentando subir %sIntentando subir un QSOEsperando respuesta de ARRLError de copia de seguridadCarpeta de ficheros de copia de seguridad:Error en la operación de restauración de copia de seguridad: %hsBanda:Comienza: Búfer demasiado pequeñoATENCIÓN: mezclar QSO de indicativos no relacionados a una cuenta de LoTW puede provocar problemas al manejar los diplomas.CONCURSONombre del concurso:Zona CQZona CQ: CONCURSO CabrilloDefiniciones de CONCURSOS Cabrillo:Especificaciones de CabrilloExtensiones de fichero Cabrillo:IndicativoEl indicativo no puede estar vacíoIndicativo:Indicativo:Indicativo: Número de campo indicativo trabajado:El campo de indicativo trabajado debe ser %d o mayor&Certificado de IndicativoCertificado de indicativoFicheros de certificado de indicativo (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Ficheros de certificado de indicativo (*.p12,*.tq6))|*.p12;*.tq6El certificado de indicativo no coincide con los detalles del QSOCertificado no compatible con TQSLCertificados de IndicativoEl certificado de indicativo no pudo instalarseNo se puede abrir el fichero de actualización de TQSL %s:%hsNo se puede abrir el fichero de configuración %s: %hsCancelarCanceladoCertificado de autoridad de verificaciónFrase de contraseña para el contenedor del certificadoFicheros contenedores de Certificados (*.p12)|*.p12|Todos los ficheros (*.*)|*.*Vencimiento de certificadoEmisor del certificado:Propiedades de certificadoSolicitud de certificadoCertificado no inicializado para la firmaProveedor de certificado no encontradoCertificado guardado en el fichero %sCertificados reemplazados por uno nuevoCertificados que han expiradoLos cambios no se han guardadoLos cambios en la configuración de mensajes de estado tendrán efecto al reiniciar TQSLError de comprobaciónComprobar &Actualizaciones...Comprobar si hay actualizaciones de TQSL y el fichero de configuraciónComprobando actualizaciones de TQSL...Elija un certificado para restaurarElija una ubicación de estación para restaurarEscoger 'Cancelar' suele ser seguro, pero un programa de registro defectuoso que no compruebe los mensajes de estado informados por TrustedQSL puede producir comportamientos extraños (aunque no sean peligrosos para sus datos) como el intentar subir un fichero vacío o marcar todos los QSOs como 'enviados'CiudadHaga clic en 'Cancelar' si esta no es la ubicación de estación correcta.Haga clic en "Cancelar" para dejar de procesamiento este fichero de registro (recomendado).Haga clic en 'Cancelar' para dejar de procesar este fichero de registro.Haga clic en "Cancelar" para abandonar la firma de este libro.Haga clic en "Finalizar" para completar esta solicitud de Certificado de Indicativo.Haga clic en 'Ignorar' para continuar firmando este libro mientras se ignoran los errores.Haga clic en 'Sólo nuevos QSO' para firmar normalmente, sin los QSO firmados previamente (Recomendado).Haga clic en 'Aceptar' para instalar el nuevo fichero de configuración, o Cancelar para ignorarlo.Haga clic en "Aceptar" para instalar la nueva versión de TQSL, o Cancelar para ignorarlo.Haga clic en 'Resubir QSO' para procesar de nuevo este libro permitiendo QSO firmados anteriormente.CerrarError en la sintaxis del comandoEl fichero de configuración no se puede abrirEl fichero de configuración se ha actualizado correctamenteFicheros de configuración (* .tbk)|* .tbk|Todos los ficheros (*.*)|*.*Confirmar CerrarConcursoEl nombre del concurso no puede estar en blancoTipo de concursoContinenteConvirtiendo ¡No puede producir la carga del hilo!PaísCondadoCondado: Crear un &Nuevo fichero ADIF...Crear una nueva Ubicación de estaciónCrear un fichero ADIF para firmar y subirAsignaciones personalizadas de modos ADIF:BORRADO¡NO PIERDA la frase de contraseña que ha escogido! Sin esta frase, ¡no podrá utilizar el certificado!Entidad DXCCEntidad DXCC: Entidad DXCC:No se encontraron datos para esta entidad DXCCError en base de datos: %hsError de base de datosFechaFecha del primer QSO realizado (o que realizará) usando este indicativo:Fecha del último QSO realizado (o que realizará): (Deje esta fecha en blanco si este es su indicativo válido).Fecha fuera de rangoBorrarBorrar "Eliminar ubicación de estación Borrar una ubicación de estaciónModo Dia&gnósticoMostrara &DocumentaciónMostrar &Propiedades del certificadoMostrar las Propiedades de una Ubicación de EstaciónMostrar propiedades de ubicación de estación para Mostrar un Certificado de IndicativoMostrar las propiedades de un certificadoMostrar la ayuda de línea de comandosMostrar detalles de QSO firmados anteriormente al firmar un libroMostrar o modificar &Preferencias...Mostrar mensajes de estado en una pestaña separadaMostrar las propiedades de certificado paraMostrar la información de versión y salir¿Realmente desea mantener esta "fecha de finalización de QSO'?¿Desea renovarlo ahora?¿Desea enviar ahora esta solicitud de certificado a LoTW?Descargar desde:Detectado QSO duplicado&Salir de TQSL Alt-XEditarEditar (si está utilizado con -l) o crear ubicación de estaciónEditar la ubicación de estaciónEditar ubicación de estación Editar Ubicación de Estación: %hs - %sEditar una ubicación de estaciónEditar...Correo-e: Habilitar un Proxy de redHabilitar frases de contraseña para Certificados de IndicativoFecha final (AAAA-MM-DD)La fecha de finalización no es válidaNo es válida la fecha de finalización de %sIntroduzca un nombre para esta ubicación de la estaciónIntroduzca una frase de contraseña para este certificado de indicativo.Introduzca de nuevo para confirmar:Introducir fichero para guardar enIntroduzca la nueva frase de contraseñaIntroduzca la frase de contraseñaIntroduzca la frase de contraseña para desbloquear el certificado de indicativoIntroduzca el nombre del nuevo fichero contenedor de certificadoIntroduzca la frase de contraseña de nuevo para verificarla:Introduzca la frase de contraseña para el fichero contenedor del certificado.Introduzca la frase de contraseña para desbloquear el fichero .p12:Introduzca la frase de contraseña para desbloquear el certificado de indicativo para %hs -- %hs (Es la frase de contraseña que definió cuando instaló el certificado de indicativo)&ErrorError al comprobar certificados caducados:Error al compremir antes de subirError al crear solicitud de certificadoError al crear la solicitud del certificado: %hsError al descargar el nuevo fichero de configuración:Error descargando el nuevo fichero:Error al descargar la nueva información sobre la versión:Error al descargar la versión de actualización:Error al importar ubicaciones de estación: %hsError al abrir el fichero de solicitud del certificado %s: %hsError al abrir el registro de diagnóstico %s: %hsError al abrir el fichero de entradaError al abrir el fichero de salidaError al abrir fichero de copia %s: %hsError al analizar el certificado para la entidad DXCCError al analizar el certificado para el indicativoError al analizar el certificado para el emisorError al analizar el fichero de configuración guardado: %hsError al analizar el fichero de ubicación de estación: %hsError al realizar la copia de seguridad automática: %hsError al renombrar el fichero de copia de seguridad %s: %hsError al acceder al almacén de certificadosError al escribir en fichero de configuración %s: %hsError: No se pudo cargar el fichero (error CURL Init)Errores detectadosErrores: %dSaliendo de TQSL para ejecutar de nuevo como usuario normalSalir después de procesar el libro (de lo contrario iniciar normalmente)Nombre esperadoExpiradoExpira: Exportar ficheros P12 compatibles con Apple KeychainExportar a %s falló: %hsCampoNombre del fichero de seguimiento de diagnóstico del libroError de sintaxis del ficheroError de sintaxis de fichero: %hsEstado Final: %hs (%d)Frecuencia (MHz):La cuadrícula %s no es correcta para su %s. Pulse 'Siguiente' otra vez para utilizarla de todas formas.La cuadrícula %s no es correcta para su entidad del DXCC. Pulse 'Siguiente' otra vez para utilizarla de todas formas.La cuadrícula %s no es correcta para su QTH. Haga clic en 'Siguiente' otra vez para utilizarla de todos modos.QTH LocatorCuadrícula: La cuadrícula no es consistente con la ubicación de estación¿Manejar información del QTH en logs ADIF con esa acción?AyudaSoy el QSL Mánager para este indicativoID IOTALocalizador IOTA: La referencia IOTA %s no es correcta. Debe tener un número después de '-'La referencia IOTA %s no es correcta. Debe comenzar con AF-, AN-, AS-, EU-, NA-, OC- o SA-La referencia IOTA %s no es válida.Zona ITUZona ITU: Si es así, seleccione un indicativo más abajo para la cuenta primaria de LoTW. Si no, clique 'Finalizar' y se asignará una nueva cuenta de LoTW para estos QSO.Seleccione 'No' si planea restaurarlos desde una copia de seguridad.Si está seguro de que la solicitud anterior no es válida, tendrá que borrar el Certificado pendiente para %s.Si está utilizando un indicativo norteamericano fuera de Estados Unidos (de conformidad con CEPT, IARP u otros acuerdos de reciprocidad), la normativa de la FCC requiere que sea un ciudadano norteamericano.Si comparte su ordenador con otras personas, debería especificar una frase de contraseña para proteger este certificado de indicativo. Si no comparte su ordenador con nadie, no es necesario especificarla.Si comparte su ordenador con otras personas, debería especificar una frase de contraseña para proteger este certificado de indicativo. Si no comparte su ordenador con nadie, no es necesario especificarla.Si establece una fecha de finalización, no podrá firmar QSO después de esa fecha, incluso si el Certificado en sí sigue siendo válido.Si aún mantiene este indicativo (o si va a renovar la licencia para ese indicativo), no debe establecer una "fecha fin de QSO '.IgnorarIgnorar los detalles de QTH en su libroIgnorar indicativos en ficheros ADIFIgnorar los segundos en la hora del QSOImportar un fichero de certificado (p.12 o .tq6)La operación de Importar se ha completado con éxitoPor favor observe que algunos programas de log pueden comportarse de forma extraña si hace clic en una opción diferente a "Subir de nuevo QSOs". Se recomienda clicar en 'Sólo nuevos QSOs'. Pero un programa de log que haga su propio seguimiento de subida puede asignar incorrectamente el estado en este caso. Un programa de log que no haga seguimiento de las subidasPor favor observe que algunos programas de log pueden comportarse de forma extraña si hace clic en una opción diferente a "Subir de nuevo QSOs". Pulsar en 'Cancelar' es seguro en la mayoría de ocasiones. Pero un programa de log que no compruebe los mensajes de estado informados por Trusted QSL puede producir extraños comportamientos (no dañinos) tales como intentar subir un fichero vacío o marcar los QSOs seleccionados como 'enviados'.Certificados incompletos - se requiere el fichero TQ6 correspondienteContraseña incorrecta al importar el fichero P12Una configuración incorrecta puede causar que TQSL no pueda subir libros o comprobar si hay actualizaciones.Introducir libro en ADIF o Cabrillo para firmarInstalar certificadoNo válidos %hs: "%hs"Argumento no válidoContacto no válido - QSO no especifica un indicativoContacto no válido - QSO no especifica una banda o frecuenciaContacto no válido - QSO no especifica una fechaContacto no válido - QSO no especifica un modoContacto no válido - QSO no especifica una horaFormato de fecha no válidaCódigo de error no válido: %dFormato de hora no válidoSelecciones de zona para entidad DXCC no válidasSelecciones de zona para oblast no válidasSelecciones de zonas para la provincia no válidasSelecciones de zona para el estado no válidas¿Es este nuevo certificado para un indicativo donde ya tiene una cuenta de LoTW y desea añadir los QSO para este indicativo a una cuenta existente de LoTW? IdiomaDeje la frase de contraseña en blanco y haga clic en 'Finalizar' a menos que desee usar una frase de contraseña.Deje la frase de contraseña en blanco y haga clic en 'Siguiente' a menos que desee usar una frase de contraseña.Deje la frase de contraseña en blanco y haga clic en 'Aceptar' a menos que desee utilizar una frase de contraseña.Falló la conexión al LoTWCargar fichero de certificadoCargar un certificadoOperación de subida completadaError en datos de ubicaciónFichero de registroError en fichero de registroManejo del logOperaciones del libroFicheros de registro (*.log)|*.log|Todos los ficheros (*.*)|*.*Inicie sesión en la web de Logbook of the WorldFallo de asignación de memoriaNo existe en este ordenadorConflicto de modoModo:Más detalles en:NO HAY ERRORNINGUNONombreNombre existeProxy de la redNueva base de datosNueva frase de contraseñaSólo Nuevos QSOsNueva frase de contraseñaNueva frase de contraseña:Nuevo...No hay certificados de indicativoSin certificadoNo coincide ninguna solicitud de certificado con el certificado seleccionadoNo hay Clave PrivadaNo hay registros de QSONo hay QSO para subirNo hay actualizacionesNingún certificado para la clave¡No hay ningún fichero de libro para firmar!No hay salida de registrosNo hay información de estado disponibleNingunoNinguno de los anteriores se aplicaNota: TQSL asume que este fichero se subirá a LoTW.Nota: TQSL no ha registrado que estos QSO se hayan firmado. Puede presentar este fichero de libro a LoTW o descartarlo.Nota: La dirección de correo electrónico que proporcione aquí es la dirección a la que se enviará el Certificado emitido. ¡Asegúrese de que sea la dirección correcta!NotaNúmero de copias de seguridad para retener:AceptarAceptar para instalar OblastOblast: Una vez que proporcione la información solicitada y el fichero de solicitud se haya creado, debe enviar el fichero de solicitud a la entidad emisora ​​de certificados.Un registro de QSOAbrir ficheros ADIF en el editor de ADIFAbrir el ficheroOperación abortadaOperador: OpcionesOrganización: Nombre del fichero de salida (por defecto igual a nombre entrada menos extensión más .tq8)Reemplazar ubicación de estación con los detalles de QTH de su libroFichero PKCS #12 no es compatible con TQSLParque: Frase de contraseña confirmadaLas frases de contraseñas no coincidenError en frase de contraseñaFrase de contraseña para la clave de firmaFrase de contraseña incorrectaProtegido por frase de contraseñaFrase de contraseña:Frase de contraseña: Por favor, elija un indicativo para la ubicación de esta estaciónPor favor elija idioma:Por favor, instale un certificado e inténtelo de nuevo.Por favor, revise la documentación introductoria antes de usar este programa.Por favor, seleccione un certificado para la cuenta donde desee guardar los QSOPor favor seleccione un certificado para validar esta solicitudPor favor, seleccione el Certificado de su indicativo actual para validar su solicitud.Por favor inténtalo más tarde.Por favor trate de subir el %s más tarde.Por favor verifique que esta es la ubicación de estación correcta para los QSO a firmar.Por favor, espere hasta que reciba un correo electrónico que contendrá el Certificado solicitado.Número de Puerto:PreferenciasSe han detectado QSO firmados anteriomenteSe han detectado QSO previamente firmadosFirmados anteriormente: %dSe han detectado QSO previamente firmadosFirmados anteriormente: %dClave privada no encontradaPedir el rango de fechas de QSO al firmarModo de propagación:PropiedadesProvinciaProvincia: Dirección de proxy:Tipo de proxy:TipoProxyDatos de QSOError en datos del QSODatos de QSO: Ignorado Modo no válido - %sRango de fechas de QSOFecha de fin QSO: La frecuencia del QSO no es válidaLa frecuencia del QSO está fuera del rango de la banda seleccionadaLa frecuencia RX del QSO no es válidaLa frecuencia RX del QSO está fuera de rango para la banda seleccionadaFecha de inicio QSO: Fecha inicio QSO: Debe seleccionar los valores adecuados para el año, mes y día.La fecha del QSO no está dentro del intervalo de fechas especificado en su certificadoLa fecha final de QSO no puede ser anterior a la fecha de inicio de QSO.Fecha fin de QSO: Debe elegir los valores adecuados para el año, mes y día o dejarlos en blanco.Los QSO firmados usando el Certificado no serán válidos para otorgar crédito DXCC (pero serán válidos para otros diplomas aplicables). Si el Certificado se va a utilizar para firmar QSO desde operaciones móvil marítimo, a bordo de un barco u operaciones aéreas, es la selección correcta. De lo contrario, probablemente deba utilizar el botón "Atrás" para volver a la página DXCC después de hacer clic en "Aceptar"Los QSO para %hs se guardarán en la cuenta LoTW de %s.Los QSOs con anterioridad a la fecha de inicio o después de la fecha de finalización no se firmarán o serán incluidos en el fichero de salida.QSOs: %dModo Silencioso - el mismo comportamiento como -xBanda de RX:Frecuencia de RX (MHz):Subir de nuevo QSOsRenovar un certificadoRenovar el certificado paraReemplazadoInformar de diferencias de QTHSolicitar un &Nuevo certificado...Solicitar un nuevo certificadoSolicitud canceladaRestauración completa.Restaurar certificados eliminadosOperación de restauración fallida: %hsRestaurando Certificados de IndicativoRestaurando PreferenciasRestaurando registros de QSORestaurando Ubicaciones de estaciónRecuperando certificados para %hsSubir de nuevo estos QSO provocará que se marquen como ya firmados.Modo de TQSL resultante:¿Reintentar?La opción Satélite requiere que el modo de propagación sea 'Satelite'Satélite:Guardar FicheroGuardar Datos de la EstaciónGuardar un certificadoCompleta la operación de copia de seguridad.Guardar peticiónGuardar el certificado paraFicheros de configuración guardados (*.tbk)|*.tbkGuardando QSOGuardando Ubicaciones de estaciónGuardando Preferencias TQSLGuardando certificados de indicativo %hsGuardando certificados de indicativoSeleccione el indicativoSeleccione fichero de certificadoSeleccione Datos de la EstaciónSeleccione la ubicación de estación par firmarSeleccionar un Certificado de Indicativo para procesarSeleccione una carpetaSeleccione una ubicación de estación para procesarSeleccione una ubicación de estación para procesar Seleccionar fichero para firmarSeleccionar fichero para escribir enSeleccione o escriba el nombre de esta ubicación de estaciónSeleccione el fichero de configuración guardadoUbicación de la estación seleccionadaSeleccionar una ubicación de estaciónSerie: Firmar un registro y guardarlo para subirlo más tardeFirmar un libro y subirlo automáticamente a LoTWFirmar y &Subir ficheros ADIF o Cabrillo...Fichero de firma: Firmando datos de QSOOperación de firma abandonadaFirma abortadaFirma anulada debido a erroresFirma abortada.Firma canceladaFirmar usando Indicativos %hs, Entidad DXCC %hsComo no tienen certificados, debe realizar una solicitud de certificado sin firmar. Esto le permitirá crear un certificado inicial para uso en LoTW. Haga clic en 'Finalizar' para completar esta solicitud.Algunos QSO no se han procesadoEspecificar acción de verificación de QSO - ignorar, informar o actualizarEspecificar indicativo por defecto para firmar el libroEspecifique la acción de diálogo - abortar, todo, aceptar o pedirEspecificar fecha de finalización de QSOs para firmarEspecificar la fecha de inicio de QSOs para firmarFecha de inicio (AAAA-MM-DD)La fecha de inicio no es válidaNo es válida la Fecha de inicio de %sEstadoProvincia: Entrada de datos de estación completadaUbicación de estaciónNombre de la ubicación de estaciónPropiedades de ubicación de estaciónError en datos de ubicación de estaciónLa ubicación de estación no coincide con los detalles del QSOUbicaciones de EstaciónDebe proporcionarse el nombre de estaciónRegistro de estadoOperación realizada con éxitoSuprimir diálogo de rango de fechasError del sistema: %hsError del sistema: %hs : %hsConfirmar TQSLError en TQSLActualización TQSL disponibleVersión de TQSL %hs y versión de configuración de datos %sAdvertencia de TQSLFicheros de datos TQSL comprimidos (*.tq8)|*.tq8Ficheros de datos TQSL (*.tq7)|*.tq7TQSL no puede firmar QSO porque otra instancia de TQSL está ocupada. Finalice las otras copias en ejecución de TQSL e inténtelo de nuevo.TQSL no puede ejecutarse como administradorTQSL debe esperar a cerrar otras copias en ejecución de TQSL antes de realizar copias de seguridad...TQSL debe esperar a que finalicen otras copias de TQSL en ejecución antes de firmar...Error en TQSLLibEl %s '%hs' tiene un valor '%hs' mientras que el QSO tiene '%hs'El parámetro -a %hs no se reconoceEl parámetro -f %hs no se ha reconocidoNo se pudo analizar el fichero de configuración de TQSLLa base de datos de seguimiento de subidas de TQSL está bloqueadaEl indicativo %s no está registrado actualmente en la base de datos del FCC ULS. Si es un indicativo registrado nuevo, debe esperar al menos un día laborable para que sea válido. Por favor, entre un indicativo que sea válido.El certificado para el indicativo %hs ha expirado. Esta ubicación de estación no puede utilizarse para firmar un fichero de libro hasta que instale un certificado válido.El indicativo es demasiado largo. Sólo se permiten %d caracteres.El certificado de %hs vence en %d diasEl certificado de %hs vence en %d días.La fecha de su primer QSO es posterior a la última fecha válida (%hs) de la entidad DXCC seleccionada %hsLa fecha de su primer QSO es anterior a la primera fecha válida (%hs) de la entidad DXCC seleccionada %hsLa fecha de su último QSO es posterior a la última fecha válida (%hs) de la entidad DXCC seleccionada %hsLa fecha de su último QSO es anterior a la primera fecha válida (%hs) de la entidad DXCC seleccionada %hsNo se ha guardado el fichero. ¿Guardar los QSO?El formato de este fichero es incorrecto.Los datos no válidos fueron ignorados.El log que se está firmando tiene '%hs' asignado a '%hs' y no es válidoEl fichero de log que está subiendo utilizando su sistema de log de QSO, incluye completamente QSOs anteriormente subidos que crean un trabajo innecesario en LoTW. Quizá haya una versión más reciente de su sistema de log que prevenga esto. Por favor, compruebe si existe una versión más reciente de su sistema de log.El fichero de log que está subiendo utilizando su sistema de log de QSO, incluye algunos QSO subidos anteriormente que crean un trabajo innecesario en LoTW. Quizá haya una versión más reciente de su sistema de log que prevenga esto. Por favor, compruebe si existe una versión más reciente de su sistema de log.Las únicas razones para firmar de nuevo QSO previamente firmados es si una subida previa no fue procesada por LoTW, bien porque nunca se subieron o porque hubo un fallo en el servidorLa clave privada para el indicativo %hs con número de serie %ld no está presente en este ordenador. Puede obtenerla cargando un fichero .tbk o .p12La clave privada para este Certificado de indicativo no está presente en este ordenador. Puede obtenerla cargando un fichero .tbk o .p12El indicativo seleccionado no se pudo encontrarNo se pudo encontrar la ubicación de estación seleccionadaNo coinciden las dos frases de contraseñas.No hay certificados para el indicativo %hs. No se puede modificar esta ubicación de estación.No hay certificados para el indicativo %hs. Esta ubicación de estación no puede utilizarse para firmar un fichero de libro.No hay certificados eliminados para restaurarNo hay ubicaciones de estación eliminadas para restaurarNo hay certificados válidos para el indicativoHay un certificado más nuevo para el indicativo %hs. Esta ubicación de estación no puede utilizarse para firmar un fichero de libro hasta que lo instale.No hay un certificado válido disponible para %hs en la entidad %hs, Este QSO no puede ser firmadoEste certificado no puede instalarse porque ha expirado. Compruebe que su ordenador tenga la fecha correcta y que este es el último certificado. Este certificado no puede instalarse ya que la primera fecha de validez es en el futuro. Compruebe si su ordenador tiene la fecha correcta. Esta solicitud de certificado requiere aprobación usando un certificado existente.Esta dirección debe coincidir con la base de datos de la FCC ULS. si esta dirección es correcta, por favor corrija su registro en la FCC.Este certificado ya está activo y no se puede restaurar.Este certificado ya está instaladoEste indicativo reemplaza a mi indicativo existenteEste fichero no puede ser procesado debido a un error del sistemaNo es un fichero P12 válidoEste es un indicativo de DXpediciónEs un indicativo de clubEste es un indicativo de evento especialEste es mi indicativo anteriorEste libro contiene %d QSO(s) que parecen haber sido firmados previamente para subirlos a LoTW y hay %d QSO que son nuevos.Este libro contiene %d QSO(s) que parecen haber sido firmados previamente para subirlos a LoTW, no habiendo nuevos QSO.Este libro contiene %d QSO(s) que parecen haber sido firmados previamente para subirlos a LoTW y hay un QSO que es nuevo.Este log tiene información de QSO no válidaEste libro tiene demasiados QSO subidos anteriormente. Por favor, suba sólo nuevos QSO o divida el libro en ficheros más pequeños (de 50000 QSO o menos).Esta definición de modo entra conflicto con una definición de modo estándar para %sEsta frase de contraseña deberá introducirla cada vez que utilice este certificado de indicativo tanto para firmar o cuando guarde la clave.Esto debe ser corregido antes de firmar un fichero de libro.Esto creará un nuevo fichero de solicitud de Certificado de Indicativo.Con esto eliminará de su sistema el certificado seleccionado.Con esto eliminará la ubicación de estación de su sistema.HoraPara importar este fichero P12 protegido con frase de contraseña, debe pasar la frase en la línea de comandoPara presentar un fichero de libro firmado a LoTW: 1. Mueva el fichero de libro firmado a un ordenador con acceso a internet 2. Inicie sesión en su cuenta web de LOTW 3. Seleccione la pestaña Cargar fichero 4. Haga clic en el botón para seleccionar el fichero y seleccione el fichero de libro firmado que ha creado (%s) 5. Haga clic en el botón Subir fichero Alternativamente, puede adjuntar el fichero de libro firmado en un correo electrónico y enviarlo a lotw-logs@arrl.orgCertificado raíz verificadoTipoARRIBAPágina Internet: Las solicitudes de indicativos norteamericanos 1x1 deben incluir una fecha finalLos indicativos norteamericanos 1x1deben finalizar con una letra de la A a la Z (excluyendo la 'X')Los indicativos norteamericanos 1x1 deben tener un número como segundo carácterLos indicativos norteamericanos 1x1 deben comenzar con W, K o NFecha UTC (AAAA-MM-DD):Hora UTC (HHMM):No se puede comprobar si hay actualizaciones - o su conexión a Internet no funciona o LoTW no está disponible.No se puede comprobar si hay actualizaciones. La red no funciona o el sitio de LOTW está demasiado ocupado.No se puede conectar al sitio de actualización.No se pudo inicializar el generador de números aleatoriosNo se puede abrir %s para la salidaNo ha sido posible abrir ca-bundle.crt. La instalación de TQSL no está completaNo se pudo leer - no tiene permisoNo se puede actualizar - su conexión a Internet no funciona o LoTW no está disponible.No se puede actualizar. La red no funciona o el sitio web de LoTW está demasiado ocupado.Error de no borradoRespuesta inesperada de LoTWDesconocidoError desconocidoNo utlilizable: no se encuentra la Clave PrivadaActualizaciónActualización completadaSubirOperación de subida rechazadaCargar después de firmar en vez de guardarSubiendo certificadoSubiendo solicitud de certificado...Subiendo Datos FirmadosSubiendo datos del libro firmados...Error en la base de datos de subidasUtilice el botón "Nuevo" del cuadro de diálogo que está a punto de ver para definir una Ubicación de la estación.Utilice estos ajustes para configurar a un proxy de la red para subidas y descargas de Internet. Sólo debe habilitar un proxy si se lo indica el administrador de red.Cancelado por el usuarioValorVerifique los detalles de QTH: Prefijo WPXAdvertenciaADVERTENCIA: El editor de ADIF de TQSL sólo procesa un número limitado de campos ADIF. ¡Utilizar el editor en un fichero ADIF puede causar pérdida de datos en los QSO!¿Para qué es este certificado?Limpiar la base de datos de subidas de TQSL¿Desea hacer una copia de seguridad del certificado ahora?¿Desea solicitar un certificado ahora?Escribió %d registros de QSO en %sPODRÁ recuperarlo desde un fichero contenedor (. p12),No puede solicitar un certificado para un indicativo anterior a menos que disponga de un certificado válido para verificar esta solicitud.No puede solicitar un certificado para un indicativo 1x1 ya que debe firmar esas solicitudes y no tiene ningún Certificado de Indicativo válido que pueda utilizar para firmar esta solicitud.No puede solicitar un certificado para un indicativo portable ya que debe firmar estar solicitudes y no dispone de certificados válidos para poder firmar esta solicitud.No puede seleccionar la entidad DXCC a NINGUNO ya que debe firmar cualquier solicitud de entidad NINGUNO y no tiene certificados válidos que puedan utilizarse para firmar esta solicitud.No necesita una cuenta de LoTW para hacer esto.Ya ha solicitado un Certificado de Indicativo para %s y no puede solicitar otra hasta que la solicitud haya sido procesada por la dirección de LoTW.Ya ha solicitado más de tres certificados para %s en las últimas 24 horas. Debe realizar una solicitud sólo una vez y esperar que sea procesada por el equipo de LoTW. Esto puede tardar varios días laborables.Tiene un Certificado coincidente para %s (DXCC=%hs) que contiene fechas de QSO: Ha cambiado los campos siguientes en la ubicación de estación: %s ¿Desea descartar estos cambios?Ha seleccionado una fecha fin de QSO para ese Certificado. La 'fecha fin de QSO' SÓLO debe establecerse si es la fecha en que la licencia expirará o la licencia se cambiará por un nuevo indicativo.No ha definido ninguna ubicación de estacion.No tiene ningún certificado instalado en este equipo para firmar envíos de libros.No tiene ningún certificado para firmar un fichero de libro.Ha seleccionado la Entidad DXCC a NINGUNOPuede dejar la fecha (o ambas fechas) en blanco.Ahora puede enviar su nueva solicitud de certificado (Puede proteger este Certificado de Indicativo utilizando una frase de contraseña. Si comparte su ordenador con otras personas, debería especificar una frase de contraseña para proteger este certificado de indicativo. Si no comparte su ordenador con nadie, no es necesario especificarla.Puede configurar las fechas de inicio y / o fin de QSO para seleccionar los QSO desde el fichero de entrada.Debe definir al menos una ubicación de estación para firmar.Debe introducir un indicativo válido.Debe introducir una dirección de correo electrónico válidaDebe introducir su direcciónDebe introducir su ciudadDebe introducir su nombreDebe seleccionar un %hsDebe seleccionar una entidad DXCC.Debe seleccionar una banda o introducir una frecuenciaNO podrá recuperarlo si carga un fichero .TQ6.Deberá introducir la frase de contraseña cada vez que cargue el fichero en TrustedQSL.En caso que lo pierda, no podrá utilizar este fichero TQ6 para recuperar su certificado. Por razones de seguridad, debe hacer una copia de seguridad del certificado en un medio extraíble.Los detalles de su QTH cambiaron para este QSO. Originalmente eran: %s Ahora son: %s ¡Por favor verifique que pretendía modificar este QSO! Su solicitud de certificado no se subió correctamente.Su modo personalizado %s entra en conflicto con la definición estándar de modos para %hs y fue eliminado.Su dirección de emailSu sistema está actualizadoSu subida aparece como fallida. ¿Desea guardar esta solicitud para subirla más tarde?Su subida parece que ha fallado. ¿Quiere que TQSL lo intente de nuevo?Código Postal[Ninguno]son la más nuevas disponiblescertificado?si ha creado uno mediante el menú de Certificado de Indicativoen la entidaden línea %do ver:ficheros de solicitud de Cert TQSL (*.a formato TQSLpara:|Ficheros ADIF (|Todos los ficheros (|Todos los ficheros (*.*)|*.*|Ficheros Cabrillo (tqsl-2.8.1/apps/lang/es/tqslapp.po0000644000175000017500000036632215003421124017026 0ustar rmurphyrmurphy# TrustedQSL # Copyright (C) 2015-2025 The American Radio Relay League # This file is distributed under the same license as the tqsl package. # Rick Murphy/K1MU. # msgid "" msgstr "" "Project-Id-Version: TQSL V2.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-16 18:01-0500\n" "PO-Revision-Date: 2025-02-17 16:45+0100\n" "Last-Translator: Jordi Quintero\n" "Language-Team: TQSL Developers\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" #: certtree.cpp:80 certtree.cpp:110 tqsl.cpp:1548 tqsl.cpp:7099 msgid "Callsign Certificates" msgstr "Certificados de Indicativo" #: certtree.cpp:113 msgid "Error while accessing certificate store" msgstr "Error al acceder al almacén de certificados" #: certtree.cpp:119 msgid "Error parsing certificate for issuer" msgstr "Error al analizar el certificado para el emisor" #: certtree.cpp:124 msgid "Error parsing certificate for call sign" msgstr "Error al analizar el certificado para el indicativo" #: certtree.cpp:131 msgid "Error parsing certificate for DXCC entity" msgstr "Error al analizar el certificado para la entidad DXCC" #: certtree.cpp:186 certtree.cpp:252 msgid "Active, usable certificates" msgstr "Certificados activos y utilizables" #: certtree.cpp:202 msgid "Unusable: Missing Private Key" msgstr "No utlilizable: no se encuentra la Clave Privada" #: certtree.cpp:218 msgid "Incomplete Certificates - requires a matching TQ6" msgstr "Certificados incompletos - se requiere el fichero TQ6 correspondiente" #: certtree.cpp:232 msgid "Certificates replaced with a newer one" msgstr "Certificados reemplazados por uno nuevo" #: certtree.cpp:240 msgid "Certificates that have expired" msgstr "Certificados que han expirado" #: crqwiz.cpp:45 msgid "This callsign replaces my existing callsign" msgstr "Este indicativo reemplaza a mi indicativo existente" #: crqwiz.cpp:46 msgid "This is my former callsign" msgstr "Este es mi indicativo anterior" #: crqwiz.cpp:47 msgid "I am the QSL manager for this callsign" msgstr "Soy el QSL Mánager para este indicativo" #: crqwiz.cpp:48 msgid "This is a club callsign" msgstr "Es un indicativo de club" #: crqwiz.cpp:49 msgid "This is a DXpedition callsign" msgstr "Este es un indicativo de DXpedición" #: crqwiz.cpp:50 msgid "This is a special event callsign" msgstr "Este es un indicativo de evento especial" #: crqwiz.cpp:51 msgid "None of these apply" msgstr "Ninguno de los anteriores se aplica" #: crqwiz.cpp:263 msgid "This will create a new Callsign Certificate request file." msgstr "Esto creará un nuevo fichero de solicitud de Certificado de Indicativo." #: crqwiz.cpp:265 msgid "" "Once you supply the requested information and the request file has been " "created, you must send the request file to the certificate issuer." msgstr "" "Una vez que proporcione la información solicitada y el fichero de solicitud " "se haya creado, debe enviar el fichero de solicitud a la entidad emisora ​​de " "certificados." #: crqwiz.cpp:272 msgid "Certificate Issuer:" msgstr "Emisor del certificado:" #: crqwiz.cpp:283 crqwiz.cpp:1665 crqwiz.cpp:1787 crqwiz.cpp:1841 #: crqwiz.cpp:1876 loadcertwiz.cpp:130 loadcertwiz.cpp:305 loadcertwiz.cpp:380 #: loadcertwiz.cpp:382 tqsl.cpp:3009 tqsl.cpp:3472 tqsl.cpp:3488 tqsl.cpp:3552 #: tqsl.cpp:3568 tqsl.cpp:5714 tqsl.cpp:7504 tqsl.cpp:7722 tqsl_prefs.cpp:1046 #: tqsl_prefs.cpp:1053 tqslwiz.cpp:1267 tqslwiz.cpp:1374 msgid "Error" msgstr "&Error" #: crqwiz.cpp:318 msgid "Email: " msgstr "Correo-e: " #: crqwiz.cpp:320 msgid "URL: " msgstr "Página Internet: " #: crqwiz.cpp:365 msgid "DXCC entity:" msgstr "Entidad DXCC:" #: crqwiz.cpp:369 msgid "Call sign:" msgstr "Indicativo:" #: crqwiz.cpp:448 msgid "Date of the first QSO you made or will make using this callsign:" msgstr "" "Fecha del primer QSO realizado (o que realizará) usando este indicativo:" #: crqwiz.cpp:502 msgid "" "Date of the last QSO you made or will make using this callsign:\n" "(Leave this date blank if this is still your valid callsign.)" msgstr "" "Fecha del último QSO realizado (o que realizará):\n" "(Deje esta fecha en blanco si este es su indicativo válido)." #: crqwiz.cpp:582 msgid "Zip/Postal" msgstr "Código Postal" #: crqwiz.cpp:587 stationdial.cpp:70 msgid "Name" msgstr "Nombre" #: crqwiz.cpp:613 msgid "Address" msgstr "Dirección" #: crqwiz.cpp:643 msgid "City" msgstr "Ciudad" #: crqwiz.cpp:658 stationdial.cpp:362 stationdial.cpp:373 msgid "State" msgstr "Estado" #: crqwiz.cpp:684 crqwiz.cpp:687 msgid "Country" msgstr "País" #: crqwiz.cpp:786 msgid "Your e-mail address" msgstr "Su dirección de email" #: crqwiz.cpp:801 msgid "" "Note: The e-mail address you provide here is the address to which the issued " "Certificate will be sent. Make sure it's the correct address!" msgstr "" "Nota: La dirección de correo electrónico que proporcione aquí es la dirección " "a la que se enviará el Certificado emitido. ¡Asegúrese de que sea la " "dirección correcta!" #: crqwiz.cpp:847 msgid "" "You may protect this Callsign Certificate using a passphrase. If you are " "using a computer system that is shared with others, you should specify a " "passphrase to protect this Callsign Certificate. However, if you are using a " "computer in a private residence, no passphrase need be specified." msgstr "" "Puede proteger este Certificado de Indicativo utilizando una frase de " "contraseña. Si comparte su ordenador con otras personas, debería especificar " "una frase de contraseña para proteger este certificado de indicativo. Si no " "comparte su ordenador con nadie, no es necesario especificarla." #: crqwiz.cpp:852 crqwiz.cpp:881 msgid "" "Leave the passphrase blank and click 'Next' unless you want to use a " "passphrase." msgstr "" "Deje la frase de contraseña en blanco y haga clic en 'Siguiente' a menos que " "desee usar una frase de contraseña." #: crqwiz.cpp:856 msgid "Passphrase:" msgstr "Frase de contraseña:" #: crqwiz.cpp:862 msgid "Enter the passphrase again for verification:" msgstr "Introduzca la frase de contraseña de nuevo para verificarla:" #: crqwiz.cpp:868 msgid "" "DO NOT lose the passphrase you choose! You will be unable to use the " "Certificate without this passphrase!" msgstr "" "¡NO PIERDA la frase de contraseña que ha escogido! Sin esta frase, ¡no podrá " "utilizar el certificado!" #: crqwiz.cpp:886 msgid "" "Leave the passphrase blank and click 'Finish' unless you want to use a " "passphrase." msgstr "" "Deje la frase de contraseña en blanco y haga clic en 'Finalizar' a menos que " "desee usar una frase de contraseña." #: crqwiz.cpp:917 msgid "What is this Callsign Certificate for?" msgstr "¿Para qué es este certificado?" #: crqwiz.cpp:1007 msgid "" "Since you have no Callsign Certificates, you must submit an 'Unsigned' " "certificate request. This will allow you to create your initial Callsign " "Certificate for LoTW use. Click 'Finish' to complete this Callsign " "Certificate request." msgstr "" "Como no tienen certificados, debe realizar una solicitud de certificado sin " "firmar. Esto le permitirá crear un certificado inicial para uso en LoTW. Haga " "clic en 'Finalizar' para completar esta solicitud." #: crqwiz.cpp:1025 msgid "" "This Callsign Certificate request requires approval using an existing " "Callsign Certificate." msgstr "" "Esta solicitud de certificado requiere aprobación usando un certificado " "existente." #: crqwiz.cpp:1028 msgid "" "Is this new certificate for a callsign where you already have a LoTW account, " "and you want the QSOs for this call to be added to an existing LoTW account? " msgstr "" "¿Es este nuevo certificado para un indicativo donde ya tiene una cuenta de " "LoTW y desea añadir los QSO para este indicativo a una cuenta existente de " "LoTW? " #: crqwiz.cpp:1030 msgid "" "If so, choose a callsign below for the primary LoTW account. If not, click " "'Finish', and a new LoTW account will be set up for these QSOs." msgstr "" "Si es así, seleccione un indicativo más abajo para la cuenta primaria de " "LoTW. Si no, clique 'Finalizar' y se asignará una nueva cuenta de LoTW para " "estos QSO." #: crqwiz.cpp:1033 msgid "" "CAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause " "issues with handling awards." msgstr "" "ATENCIÓN: mezclar QSO de indicativos no relacionados a una cuenta de LoTW " "puede provocar problemas al manejar los diplomas." #: crqwiz.cpp:1126 #, c-format msgid "The callsign is too long. Only %d characters are allowed." msgstr "El indicativo es demasiado largo. Sólo se permiten %d caracteres." #: crqwiz.cpp:1223 msgid "You must enter a valid call sign." msgstr "Debe introducir un indicativo válido." #: crqwiz.cpp:1326 msgid "You must select a DXCC entity." msgstr "Debe seleccionar una entidad DXCC." #: crqwiz.cpp:1357 msgid "QSO begin date: You must choose proper values for Year, Month and Day." msgstr "" "Fecha inicio QSO: Debe seleccionar los valores adecuados para el año, mes y " "día." #: crqwiz.cpp:1361 msgid "" "QSO end date: You must either choose proper values for Year, Month and Day or " "leave all three blank." msgstr "" "Fecha fin de QSO: Debe elegir los valores adecuados para el año, mes y día o " "dejarlos en blanco." #: crqwiz.cpp:1366 msgid "QSO end date cannot be before QSO begin date." msgstr "" "La fecha final de QSO no puede ser anterior a la fecha de inicio de QSO." #: crqwiz.cpp:1398 msgid "" "The date of your first QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "La fecha de su primer QSO es anterior a la primera fecha válida (%hs) de la " "entidad DXCC seleccionada %hs" #: crqwiz.cpp:1402 msgid "" "The date of your first QSO is after the last valid date (%hs) of the selected " "DXCC Entity %hs" msgstr "" "La fecha de su primer QSO es posterior a la última fecha válida (%hs) de la " "entidad DXCC seleccionada %hs" #: crqwiz.cpp:1406 msgid "" "The date of your last QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "La fecha de su último QSO es anterior a la primera fecha válida (%hs) de la " "entidad DXCC seleccionada %hs" #: crqwiz.cpp:1410 msgid "" "The date of your last QSO is after the last valid date (%hs) of the selected " "DXCC Entity %hs" msgstr "" "La fecha de su último QSO es posterior a la última fecha válida (%hs) de la " "entidad DXCC seleccionada %hs" #: crqwiz.cpp:1433 msgid "US 1x1 callsigns must start with W, K, or N" msgstr "Los indicativos norteamericanos 1x1 deben comenzar con W, K o N" #: crqwiz.cpp:1437 msgid "US 1x1 callsigns must have a number as the second character" msgstr "" "Los indicativos norteamericanos 1x1 deben tener un número como segundo " "carácter" #: crqwiz.cpp:1441 msgid "US 1x1 callsigns must end in letters A-Z excluding 'X'" msgstr "" "Los indicativos norteamericanos 1x1deben finalizar con una letra de la A a la " "Z (excluyendo la 'X')" #: crqwiz.cpp:1447 msgid "US 1x1 callsign requests must provide an end date" msgstr "" "Las solicitudes de indicativos norteamericanos 1x1 deben incluir una fecha " "final" #. TRANSLATORS: first argument is callsign (%s), second is the related DXCC entity name (%hs) #: crqwiz.cpp:1492 msgid "You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: " msgstr "" "Tiene un Certificado coincidente para %s (DXCC=%hs) que contiene fechas de " "QSO: " #. TRANSLATORS: here "to" separates two dates in a date range #: crqwiz.cpp:1494 msgid " to " msgstr " a " #: crqwiz.cpp:1503 #, c-format msgid "" "You have already requested a Callsign Certificate for %s and can not request " "another until that request has been processed by LoTW Staff." msgstr "" "Ya ha solicitado un Certificado de Indicativo para %s y no puede solicitar " "otra hasta que la solicitud haya sido procesada por la dirección de LoTW." #: crqwiz.cpp:1505 crqwiz.cpp:1545 msgid "" "Please wait until you receive an e-mail bearing your requested Callsign " "Certificate." msgstr "" "Por favor, espere hasta que reciba un correo electrónico que contendrá el " "Certificado solicitado." #: crqwiz.cpp:1507 #, c-format msgid "" "If you are sure that the earlier request is now invalid you should delete the " "pending Callsign Certificate for %s." msgstr "" "Si está seguro de que la solicitud anterior no es válida, tendrá que borrar " "el Certificado pendiente para %s." #: crqwiz.cpp:1543 #, c-format msgid "" "You have already requested more than three Callsign Certificates for %s in " "the past 24 hours. You should submit a request only once, then wait for that " "request to be processed by LoTW Staff. This may take several business days." msgstr "" "Ya ha solicitado más de tres certificados para %s en las últimas 24 horas. " "Debe realizar una solicitud sólo una vez y esperar que sea procesada por el " "equipo de LoTW. Esto puede tardar varios días laborables." #: crqwiz.cpp:1639 msgid "" "You cannot request a Callsign Certificate for a former callsign unless you " "hold a valid Callsign Certificate to be used to verify that request." msgstr "" "No puede solicitar un certificado para un indicativo anterior a menos que " "disponga de un certificado válido para verificar esta solicitud." #: crqwiz.cpp:1644 #, c-format msgid "" "The callsign %s is not currently registered in the FCC ULS database.\n" "If this is a newly registered call, you must wait at least one business day " "for it to be valid. Please enter a currently valid callsign." msgstr "" "El indicativo %s no está registrado actualmente en la base de datos del FCC " "ULS.\n" "Si es un indicativo registrado nuevo, debe esperar al menos un día laborable " "para que sea válido. Por favor, entre un indicativo que sea válido." #: crqwiz.cpp:1654 msgid "" "If you are using a US callsign outside of the US persuant to CEPT, IARP or " "other Reciprocity arrangements, FCC rules require you to be a US Citizen." msgstr "" "Si está utilizando un indicativo norteamericano fuera de Estados Unidos (de " "conformidad con CEPT, IARP u otros acuerdos de reciprocidad), la normativa de " "la FCC requiere que sea un ciudadano norteamericano." #: crqwiz.cpp:1654 crqwiz.cpp:1706 loadcertwiz.cpp:218 tqsl.cpp:6234 #: tqsl.cpp:7050 tqsl.cpp:7178 tqsl_prefs.cpp:448 msgid "Warning" msgstr "Advertencia" #: crqwiz.cpp:1670 msgid "" "You cannot select DXCC Entity NONE as you must sign any request for entity " "NONE and you have no valid Callsign Certificates that you can use to sign " "this request." msgstr "" "No puede seleccionar la entidad DXCC a NINGUNO ya que debe firmar cualquier " "solicitud de entidad NINGUNO y no tiene certificados válidos que puedan " "utilizarse para firmar esta solicitud." #: crqwiz.cpp:1671 crqwiz.cpp:1684 crqwiz.cpp:1693 crqwiz.cpp:1890 tqsl.cpp:155 #: tqsl.cpp:193 msgid "TQSL Error" msgstr "Error en TQSL" #: crqwiz.cpp:1676 msgid "You have selected DXCC Entity NONE" msgstr "Ha seleccionado la Entidad DXCC a NINGUNO" #: crqwiz.cpp:1678 msgid "" "QSO records signed using the Certificate will not be valid for DXCC award " "credit (but will be valid for other applicable awards). If the Certificate is " "to be used for signing QSOs from maritime/marine mobile, shipboard, or air " "mobile operations, that is the correct selection. Otherwise, you probably " "should use the \"Back\" button to return to the DXCC page after clicking " "\"OK\"" msgstr "" "Los QSO firmados usando el Certificado no serán válidos para otorgar crédito " "DXCC (pero serán válidos para otros diplomas aplicables). Si el Certificado " "se va a utilizar para firmar QSO desde operaciones móvil marítimo, a bordo de " "un barco u operaciones aéreas, es la selección correcta. De lo contrario, " "probablemente deba utilizar el botón \"Atrás\" para volver a la página DXCC " "después de hacer clic en \"Aceptar\"" #: crqwiz.cpp:1679 stationdial.cpp:458 msgid "TQSL Warning" msgstr "Advertencia de TQSL" #: crqwiz.cpp:1683 msgid "" "You cannot request a certificate for a 1x1 callsign as you must sign those " "requests, but you have no valid Callsign Certificates that you can use to " "sign this request." msgstr "" "No puede solicitar un certificado para un indicativo 1x1 ya que debe firmar " "esas solicitudes y no tiene ningún Certificado de Indicativo válido que pueda " "utilizar para firmar esta solicitud." #: crqwiz.cpp:1692 msgid "" "You cannot request a certificate for a portable callsign as you must sign " "those requests, but you have no valid Callsign Certificates that you can use " "to sign this request." msgstr "" "No puede solicitar un certificado para un indicativo portable ya que debe " "firmar estar solicitudes y no dispone de certificados válidos para poder " "firmar esta solicitud." #: crqwiz.cpp:1699 msgid "" "You have chosen a QSO end date for this Callsign Certificate. The 'QSO end " "date' should ONLY be set if that date is the date when that callsign's " "license expired or the license was replaced by a new callsign." msgstr "" "Ha seleccionado una fecha fin de QSO para ese Certificado. La 'fecha fin de " "QSO' SÓLO debe establecerse si es la fecha en que la licencia expirará o la " "licencia se cambiará por un nuevo indicativo." #: crqwiz.cpp:1701 msgid "" "If you set an end date, you will not be able to sign QSOs past that date, " "even if the Callsign Certificate itself is still valid." msgstr "" "Si establece una fecha de finalización, no podrá firmar QSO después de esa " "fecha, incluso si el Certificado en sí sigue siendo válido." #: crqwiz.cpp:1703 msgid "" "If you still hold this callsign (or if you plan to renew the license for the " "callsign), you should not set a 'QSO end date'." msgstr "" "Si aún mantiene este indicativo (o si va a renovar la licencia para ese " "indicativo), no debe establecer una \"fecha fin de QSO '." #: crqwiz.cpp:1705 msgid "Do you really want to keep this 'QSO end date'?" msgstr "¿Realmente desea mantener esta \"fecha de finalización de QSO'?" #: crqwiz.cpp:1737 msgid "You must enter your name" msgstr "Debe introducir su nombre" #: crqwiz.cpp:1739 msgid "You must enter your address" msgstr "Debe introducir su dirección" #: crqwiz.cpp:1741 msgid "You must enter your city" msgstr "Debe introducir su ciudad" #: crqwiz.cpp:1759 msgid "" "This address must match the FCC ULS database.\n" "If this address information is incorrect, please correct your FCC record." msgstr "" "Esta dirección debe coincidir con la base de datos de la FCC ULS.\n" "si esta dirección es correcta, por favor corrija su registro en la FCC." #: crqwiz.cpp:1828 msgid "You must enter a valid email address" msgstr "Debe introducir una dirección de correo electrónico válida" #: crqwiz.cpp:1863 msgid "The two copies of the passphrase do not match." msgstr "No coinciden las dos frases de contraseñas." #: crqwiz.cpp:1904 msgid "Click 'Finish' to complete this Callsign Certificate request." msgstr "" "Haga clic en \"Finalizar\" para completar esta solicitud de Certificado de " "Indicativo." #: crqwiz.cpp:1910 msgid "" "Please select a Callsign Certificate for the account where you would like the " "QSOs to be stored" msgstr "" "Por favor, seleccione un certificado para la cuenta donde desee guardar los " "QSO" #: crqwiz.cpp:1913 crqwiz.cpp:1920 msgid "" "Please select the Callsign Certificate for your current personal callsign to " "validate your request." msgstr "" "Por favor, seleccione el Certificado de su indicativo actual para validar su " "solicitud." #: crqwiz.cpp:1915 crqwiz.cpp:1922 msgid "Please select a Callsign Certificate to validate this request" msgstr "Por favor seleccione un certificado para validar esta solicitud" #: crqwiz.cpp:1929 msgid "QSOs for %hs will be stored in the LoTW account for %s." msgstr "Los QSO para %hs se guardarán en la cuenta LoTW de %s." #. TRANSLATORS: This is part of an deleted DXCC entity name #: dxcc.cpp:49 msgid "DELETED" msgstr "BORRADO" #: getpassword.cpp:48 getpassword.cpp:121 qsodatadialog.cpp:387 tqsl.cpp:452 #: tqsl_prefs.cpp:70 tqsl_prefs.cpp:289 tqsl_prefs.cpp:1019 stationdial.h:46 #: tqslapp.h:132 msgid "OK" msgstr "Aceptar" #: getpassword.cpp:51 getpassword.cpp:124 qsodatadialog.cpp:386 #: stationdial.cpp:225 tqsl.cpp:309 tqsl.cpp:364 tqsl.cpp:453 tqsl.cpp:577 #: tqsl.cpp:637 tqsl.cpp:1987 tqsl_prefs.cpp:73 tqsl_prefs.cpp:292 #: tqsl_prefs.cpp:1022 msgid "Cancel" msgstr "Cancelar" #: getpassword.cpp:53 getpassword.cpp:126 qsodatadialog.cpp:385 #: stationdial.cpp:223 tqsl_prefs.cpp:67 msgid "Help" msgstr "Ayuda" #: getpassword.cpp:111 msgid "New passphrase:" msgstr "Nueva frase de contraseña:" #: getpassword.cpp:114 msgid "Enter again to confirm:" msgstr "Introduzca de nuevo para confirmar:" #: getpassword.cpp:146 msgid "Passphrase entries do not match" msgstr "Las frases de contraseñas no coinciden" #: getpassword.cpp:157 msgid "Passphrase confirmed" msgstr "Frase de contraseña confirmada" #: loadcertwiz.cpp:41 msgid "Import completed successfully" msgstr "La operación de Importar se ha completado con éxito" #: loadcertwiz.cpp:75 msgid "OK to install " msgstr "Aceptar para instalar " #: loadcertwiz.cpp:76 msgid "certificate?" msgstr "certificado?" #: loadcertwiz.cpp:77 msgid "Install Certificate" msgstr "Instalar certificado" #: loadcertwiz.cpp:109 msgid "This callsign certificate is already installed" msgstr "Este certificado ya está instalado" #: loadcertwiz.cpp:118 msgid "Trusted root certificate" msgstr "Certificado raíz verificado" #: loadcertwiz.cpp:121 msgid "Certificate Authority certificate" msgstr "Certificado de autoridad de verificación" #: loadcertwiz.cpp:124 wxutil.cpp:278 msgid "Callsign Certificate" msgstr "Certificado de indicativo" #: loadcertwiz.cpp:168 msgid "Enter a passphrase for this callsign certificate." msgstr "Introduzca una frase de contraseña para este certificado de indicativo." #: loadcertwiz.cpp:170 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using a " "computer in a private residence no passphrase need be specified." msgstr "" "Si comparte su ordenador con otras personas, debería especificar una frase de " "contraseña para proteger este certificado de indicativo. Si no comparte su " "ordenador con nadie, no es necesario especificarla." #: loadcertwiz.cpp:172 msgid "" "This passphrase will have to be entered each time you use this callsign " "certificate for signing or when saving the key." msgstr "" "Esta frase de contraseña deberá introducirla cada vez que utilice este " "certificado de indicativo tanto para firmar o cuando guarde la clave." #: loadcertwiz.cpp:174 tqsl.cpp:6983 msgid "" "Leave the passphrase blank and click 'OK' unless you want to use a passphrase." msgstr "" "Deje la frase de contraseña en blanco y haga clic en 'Aceptar' a menos que " "desee utilizar una frase de contraseña." #: loadcertwiz.cpp:176 msgid "New Passphrase" msgstr "Nueva frase de contraseña" #: loadcertwiz.cpp:215 msgid "" "You will not be able to use this tq6 file to recover your callsign " "certificate if it gets lost. For security purposes, you should back up your " "certificate on removable media for safe-keeping." msgstr "" "En caso que lo pierda, no podrá utilizar este fichero TQ6 para recuperar su " "certificado. Por razones de seguridad, debe hacer una copia de seguridad del " "certificado en un medio extraíble." #: loadcertwiz.cpp:217 msgid "Would you like to back up your callsign certificate now?" msgstr "¿Desea hacer una copia de seguridad del certificado ahora?" #: loadcertwiz.cpp:253 msgid "" "Callsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*." "tq6;*.TQ6" msgstr "" "Ficheros de certificado de indicativo (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*." "tq6;*.TQ6" #: loadcertwiz.cpp:255 msgid "Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6" msgstr "Ficheros de certificado de indicativo (*.p12,*.tq6))|*.p12;*.tq6" #: loadcertwiz.cpp:257 tqsl.cpp:4545 msgid "|All files (*.*)|*.*" msgstr "|Todos los ficheros (*.*)|*.*" #: loadcertwiz.cpp:261 msgid "Select Certificate File" msgstr "Seleccione fichero de certificado" #: loadcertwiz.cpp:305 loadcertwiz.cpp:380 tqsl.cpp:6202 msgid "This file is not a valid P12 file" msgstr "No es un fichero P12 válido" #: loadcertwiz.cpp:321 msgid "Loading complete" msgstr "Operación de subida completada" #: loadcertwiz.cpp:336 msgid "No status information available" msgstr "No hay información de estado disponible" #: loadcertwiz.cpp:343 msgid "Enter the passphrase to unlock the .p12 file:" msgstr "Introduzca la frase de contraseña para desbloquear el fichero .p12:" #: loadcertwiz.cpp:377 tqsl.cpp:2275 msgid "Passphrase error" msgstr "Error en frase de contraseña" #: loctree.cpp:93 tqsl.cpp:1441 tqsl.cpp:7209 msgid "Station Locations" msgstr "Ubicaciones de Estación" #: qsodatadialog.cpp:166 qsodatadialog.cpp:200 qsodatadialog.cpp:208 msgid "NONE" msgstr "NINGUNO" #: qsodatadialog.cpp:193 msgid "UP" msgstr "ARRIBA" #: qsodatadialog.cpp:255 msgid "Call Sign:" msgstr "Indicativo:" #: qsodatadialog.cpp:263 msgid "UTC Date (YYYY-MM-DD):" msgstr "Fecha UTC (AAAA-MM-DD):" #: qsodatadialog.cpp:271 msgid "UTC Time (HHMM):" msgstr "Hora UTC (HHMM):" #: qsodatadialog.cpp:280 msgid "Mode:" msgstr "Modo:" #: qsodatadialog.cpp:289 msgid "Band:" msgstr "Banda:" #: qsodatadialog.cpp:299 msgid "RX Band:" msgstr "Banda de RX:" #: qsodatadialog.cpp:308 msgid "Frequency (MHz):" msgstr "Frecuencia (MHz):" #: qsodatadialog.cpp:315 msgid "RX Frequency (MHz):" msgstr "Frecuencia de RX (MHz):" #: qsodatadialog.cpp:323 msgid "Propagation Mode:" msgstr "Modo de propagación:" #: qsodatadialog.cpp:332 msgid "Satellite:" msgstr "Satélite:" #: qsodatadialog.cpp:375 msgid "Add QSO" msgstr "Añadir QSO" #: qsodatadialog.cpp:379 stationdial.cpp:218 tqsl_prefs.cpp:182 #: tqsl_prefs.cpp:837 msgid "Delete" msgstr "Borrar" #: qsodatadialog.cpp:505 msgid "QSO Frequency is invalid" msgstr "La frecuencia del QSO no es válida" #: qsodatadialog.cpp:505 qsodatadialog.cpp:512 qsodatadialog.cpp:521 #: qsodatadialog.cpp:528 qsodatadialog.cpp:538 qsodatadialog.cpp:543 #: qsodatadialog.cpp:548 qsodatadialog.cpp:553 tqslvalidator.cpp:77 msgid "QSO Data Error" msgstr "Error en datos del QSO" #: qsodatadialog.cpp:512 msgid "QSO Frequency is out of range for the selected band" msgstr "La frecuencia del QSO está fuera del rango de la banda seleccionada" #: qsodatadialog.cpp:521 msgid "QSO RX Frequency is invalid" msgstr "La frecuencia RX del QSO no es válida" #: qsodatadialog.cpp:528 msgid "QSO RX Frequency is out of range for the selected band" msgstr "La frecuencia RX del QSO está fuera de rango para la banda seleccionada" #: qsodatadialog.cpp:538 msgid "You must select a band or enter a frequency" msgstr "Debe seleccionar una banda o introducir una frecuencia" #: qsodatadialog.cpp:543 msgid "Call Sign cannot be empty" msgstr "El indicativo no puede estar vacío" #: qsodatadialog.cpp:548 msgid "'Satellite' propagation mode selected, so a Satellite must be chosen" msgstr "" "Modo de propagación 'Satélite' seleccionado, por lo que debe seleccionar un " "satélite" #: qsodatadialog.cpp:553 msgid "Satellite choice requires that Propagation Mode be 'Satellite'" msgstr "La opción Satélite requiere que el modo de propagación sea 'Satelite'" #: qsodatadialog.cpp:570 #, c-format msgid "QSO Data: Invalid Mode ignored - %s" msgstr "Datos de QSO: Ignorado Modo no válido - %s" #: qsodatadialog.cpp:592 msgid "No QSO records" msgstr "No hay registros de QSO" #: qsodatadialog.cpp:606 msgid "Save File" msgstr "Guardar Fichero" #: qsodatadialog.cpp:608 tqsl.cpp:1925 msgid "" "ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*." "*)|*.*" msgstr "" "Ficheros ADIF (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|Todos los " "ficheros (*.*)|* *" #: qsodatadialog.cpp:610 tqsl.cpp:1927 msgid "ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*" msgstr "Ficheros ADIF (*.adi;*.adif)|*.adi;*.adif|Todos los ficheros (*.*)|*.*" #: qsodatadialog.cpp:699 #, c-format msgid "Wrote %d QSO records to %s" msgstr "Escribió %d registros de QSO en %s" #: qsodatadialog.cpp:752 msgid "The file has not been saved. Should the QSOs be saved?" msgstr "No se ha guardado el fichero. ¿Guardar los QSO?" #: qsodatadialog.cpp:752 msgid "Confirm Close" msgstr "Confirmar Cerrar" #: qsodatadialog.cpp:876 msgid "One QSO Record" msgstr "Un registro de QSO" #: qsodatadialog.cpp:878 #, c-format msgid "%d QSO Records" msgstr "%d registros de QSO" #: stationdial.cpp:56 tqsl.cpp:6508 msgid "&Properties" msgstr "&Propiedades" #: stationdial.cpp:66 msgid "Properties" msgstr "Propiedades" #: stationdial.cpp:71 msgid "Value" msgstr "Valor" #: stationdial.cpp:182 msgid "Select Station Data" msgstr "Seleccione Datos de la Estación" #: stationdial.cpp:193 msgid "Save Station Data" msgstr "Guardar Datos de la Estación" #: stationdial.cpp:201 msgid "Enter a name for this Station Location" msgstr "Introduzca un nombre para esta ubicación de la estación" #: stationdial.cpp:201 msgid "Selected Station Location" msgstr "Ubicación de la estación seleccionada" #: stationdial.cpp:211 msgid "New..." msgstr "Nuevo..." #: stationdial.cpp:214 tqsl_prefs.cpp:835 msgid "Edit..." msgstr "Editar..." #: stationdial.cpp:297 msgid "Delete \"" msgstr "Borrar \"" #: stationdial.cpp:297 msgid "TQSL Confirm" msgstr "Confirmar TQSL" #: stationdial.cpp:363 msgid "Call Sign" msgstr "Indicativo" #: stationdial.cpp:364 msgid "Province" msgstr "Provincia" #: stationdial.cpp:365 msgid "Continent" msgstr "Continente" #: stationdial.cpp:366 msgid "CQ Zone" msgstr "Zona CQ" #: stationdial.cpp:367 msgid "DXCC Entity" msgstr "Entidad DXCC" #: stationdial.cpp:368 msgid "Grid Square" msgstr "QTH Locator" #: stationdial.cpp:369 msgid "IOTA ID" msgstr "ID IOTA" #: stationdial.cpp:370 msgid "ITU Zone" msgstr "Zona ITU" #: stationdial.cpp:371 msgid "Oblast" msgstr "Oblast" #: stationdial.cpp:372 msgid "County" msgstr "Condado" #: stationdial.cpp:374 msgid "WPX Prefix" msgstr "Prefijo WPX" #: stationdial.cpp:453 msgid "You have no Station Locations defined." msgstr "No ha definido ninguna ubicación de estacion." #: stationdial.cpp:455 msgid "You must define at least one Station Location to use for signing." msgstr "Debe definir al menos una ubicación de estación para firmar." #: stationdial.cpp:457 msgid "" "Use the \"New\" Button of the dialog you're about to see to define a Station " "Location." msgstr "" "Utilice el botón \"Nuevo\" del cuadro de diálogo que está a punto de ver para " "definir una Ubicación de la estación." #: tqsl.cpp:189 msgid "Success" msgstr "Operación realizada con éxito" #: tqsl.cpp:190 msgid "User Cancelled" msgstr "Cancelado por el usuario" #: tqsl.cpp:191 msgid "Upload Rejected" msgstr "Operación de subida rechazada" #: tqsl.cpp:192 msgid "Unexpected LoTW Response" msgstr "Respuesta inesperada de LoTW" #: tqsl.cpp:194 msgid "TQSLLib Error" msgstr "Error en TQSLLib" #: tqsl.cpp:195 msgid "Error opening input file" msgstr "Error al abrir el fichero de entrada" #: tqsl.cpp:196 msgid "Error opening output file" msgstr "Error al abrir el fichero de salida" #: tqsl.cpp:197 tqsl.cpp:2720 msgid "No QSOs to upload" msgstr "No hay QSO para subir" #: tqsl.cpp:198 msgid "Some QSOs not processed" msgstr "Algunos QSO no se han procesado" #: tqsl.cpp:199 msgid "Command Syntax Error" msgstr "Error en la sintaxis del comando" #: tqsl.cpp:200 msgid "LoTW Connection Failed" msgstr "Falló la conexión al LoTW" #: tqsl.cpp:201 msgid "Unknown" msgstr "Desconocido" #: tqsl.cpp:202 msgid "The TQSL upload tracking database is locked" msgstr "La base de datos de seguimiento de subidas de TQSL está bloqueada" #: tqsl.cpp:203 msgid "Previously signed QSOs were detected" msgstr "Se han detectado QSO previamente firmados" #: tqsl.cpp:204 msgid "Incorrect passphrase when importing P12 file" msgstr "Contraseña incorrecta al importar el fichero P12" #: tqsl.cpp:210 msgid "Final Status: %hs (%d)" msgstr "Estado Final: %hs (%d)" #. TRANSLATORS: this is followed by the callsign and entity name #: tqsl.cpp:260 msgid "" "Enter the passphrase to unlock the callsign certificate for %hs -- %hs\n" "(This is the passphrase you made up when you installed the callsign " "certificate.)" msgstr "" "Introduzca la frase de contraseña para desbloquear el certificado de " "indicativo para %hs -- %hs\n" "(Es la frase de contraseña que definió cuando instaló el certificado de " "indicativo)" #: tqsl.cpp:271 tqsl.cpp:7704 getpassword.h:32 getpassword.h:33 msgid "Enter passphrase" msgstr "Introduzca la frase de contraseña" #: tqsl.cpp:302 msgid "Signing QSO Data" msgstr "Firmando datos de QSO" #: tqsl.cpp:305 msgid "Converting " msgstr "Convirtiendo " #: tqsl.cpp:305 msgid "to TQSL format" msgstr "a formato TQSL" #: tqsl.cpp:327 msgid "Uploading Signed Data" msgstr "Subiendo Datos Firmados" #: tqsl.cpp:327 msgid "Uploading signed log data..." msgstr "Subiendo datos del libro firmados..." #: tqsl.cpp:421 msgid "QSO Date Range" msgstr "Rango de fechas de QSO" #: tqsl.cpp:424 msgid "" "You may set the starting and/or ending QSO dates in order to select QSOs from " "the input file." msgstr "" "Puede configurar las fechas de inicio y / o fin de QSO para seleccionar los " "QSO desde el fichero de entrada." #: tqsl.cpp:426 msgid "" "QSOs prior to the starting date or after the ending date will not be signed " "or included in the output file." msgstr "" "Los QSOs con anterioridad a la fecha de inicio o después de la fecha de " "finalización no se firmarán o serán incluidos en el fichero de salida." #: tqsl.cpp:428 msgid "You may leave either date (or both dates) blank." msgstr "Puede dejar la fecha (o ambas fechas) en blanco." #: tqsl.cpp:436 msgid "Start Date (YYYY-MM-DD)" msgstr "Fecha de inicio (AAAA-MM-DD)" #: tqsl.cpp:443 msgid "End Date (YYYY-MM-DD)" msgstr "Fecha final (AAAA-MM-DD)" #: tqsl.cpp:470 msgid "Start date is invalid" msgstr "La fecha de inicio no es válida" #: tqsl.cpp:478 msgid "End date is invalid" msgstr "La fecha de finalización no es válida" #: tqsl.cpp:518 msgid "Previously Signed QSOs Detected" msgstr "Se han detectado QSO previamente firmados" #: tqsl.cpp:524 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and no new QSOs." msgstr "" "Este libro contiene %d QSO(s) que parecen haber sido firmados previamente " "para subirlos a LoTW, no habiendo nuevos QSO." #: tqsl.cpp:526 msgid "Click 'Cancel' to abandon processing this log file (Recommended)." msgstr "" "Haga clic en \"Cancelar\" para dejar de procesamiento este fichero de " "registro (recomendado)." #: tqsl.cpp:528 tqsl.cpp:538 tqsl.cpp:545 msgid "" "Click 'Re-Upload QSOs' to re-process this log while allowing previously " "signed QSOs." msgstr "" "Haga clic en 'Resubir QSO' para procesar de nuevo este libro permitiendo QSO " "firmados anteriormente." #: tqsl.cpp:532 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and %d QSOs which are new." msgstr "" "Este libro contiene %d QSO(s) que parecen haber sido firmados previamente " "para subirlos a LoTW y hay %d QSO que son nuevos." #: tqsl.cpp:534 tqsl.cpp:541 msgid "" "Click 'New QSOs Only' to sign normally, without the previously signed QSOs " "(Recommended)." msgstr "" "Haga clic en 'Sólo nuevos QSO' para firmar normalmente, sin los QSO firmados " "previamente (Recomendado)." #: tqsl.cpp:536 tqsl.cpp:543 msgid "Click 'Cancel' to abandon processing this log file." msgstr "" "Haga clic en 'Cancelar' para dejar de procesar este fichero de registro." #: tqsl.cpp:539 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and one QSO which is new." msgstr "" "Este libro contiene %d QSO(s) que parecen haber sido firmados previamente " "para subirlos a LoTW y hay un QSO que es nuevo." #: tqsl.cpp:556 msgid "" "The log file you are uploading using your QSO Logging system consists " "entirely of previously uploaded QSOs that create unnecessary work for LoTW. " "There may be a more recent version of your QSO Logging system that would " "prevent this. Please check with your QSO Logging system's vendor for an " "updated version." msgstr "" "El fichero de log que está subiendo utilizando su sistema de log de QSO, " "incluye completamente QSOs anteriormente subidos que crean un trabajo " "innecesario en LoTW. Quizá haya una versión más reciente de su sistema de log " "que prevenga esto. Por favor, compruebe si existe una versión más reciente de " "su sistema de log." #: tqsl.cpp:558 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is " "usually safe, but a defective logger not checking the status messages " "reported by TrustedQSL may produce strange (but harmless) behavior such as " "attempting to upload an empty file or marking all chosen QSOs as 'sent'" msgstr "" "Por favor observe que algunos programas de log pueden comportarse de forma " "extraña si hace clic en una opción diferente a \"Subir de nuevo QSOs\". " "Pulsar en 'Cancelar' es seguro en la mayoría de ocasiones. Pero un programa " "de log que no compruebe los mensajes de estado informados por Trusted QSL " "puede producir extraños comportamientos (no dañinos) tales como intentar " "subir un fichero vacío o marcar los QSOs seleccionados como 'enviados'." #: tqsl.cpp:561 msgid "" "The log file you are uploading using your QSO Logging system includes some " "previously uploaded QSOs that create unnecessary work for LoTW. There may be " "a more recent version of your QSO Logging system that would prevent this. " "Please check with your QSO Logging system's vendor for an updated version." msgstr "" "El fichero de log que está subiendo utilizando su sistema de log de QSO, " "incluye algunos QSO subidos anteriormente que crean un trabajo innecesario en " "LoTW. Quizá haya una versión más reciente de su sistema de log que prevenga " "esto. Por favor, compruebe si existe una versión más reciente de su sistema " "de log." #: tqsl.cpp:563 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is " "recommended, but a logger that does its own upload tracking may incorrectly " "set the status in this case. A logger that doesn't track uploads should be " "unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, " "will correctly mark all selected QSOs as sent - they are in your account even " "though they would not be in this specific batch" msgstr "" "Por favor observe que algunos programas de log pueden comportarse de forma " "extraña si hace clic en una opción diferente a \"Subir de nuevo QSOs\". Se " "recomienda clicar en 'Sólo nuevos QSOs'. Pero un programa de log que haga su " "propio seguimiento de subida puede asignar incorrectamente el estado en este " "caso. Un programa de log que no haga seguimiento de las subidas" #: tqsl.cpp:565 msgid "" "Choosing 'Cancel' is usually safe, but a defective logger not checking the " "status messages reported by TrustedQSL may produce strange (but harmless) " "behavior such as attempting to upload an empty file or marking all chosen " "QSOs as 'sent'" msgstr "" "Escoger 'Cancelar' suele ser seguro, pero un programa de registro defectuoso " "que no compruebe los mensajes de estado informados por TrustedQSL puede " "producir comportamientos extraños (aunque no sean peligrosos para sus datos) " "como el intentar subir un fichero vacío o marcar todos los QSOs como " "'enviados'" #: tqsl.cpp:576 msgid "New QSOs Only" msgstr "Sólo Nuevos QSOs" #: tqsl.cpp:578 msgid "Re-Upload QSOs" msgstr "Subir de nuevo QSOs" #: tqsl.cpp:603 msgid "" "The only reason to re-sign previously signed QSOs is if a previous upload was " "not processed by LoTW, either because it was never uploaded, or there was a " "server failure" msgstr "" "Las únicas razones para firmar de nuevo QSO previamente firmados es si una " "subida previa no fue procesada por LoTW, bien porque nunca se subieron o " "porque hubo un fallo en el servidor" #: tqsl.cpp:605 msgid "Are you sure you want to proceed? Click 'No' to review the choices" msgstr "" "¿Está seguro que desea proceder? Haga clic en 'No' para revisar las opciones" #: tqsl.cpp:606 msgid "Are you sure?" msgstr "¿Estás seguro?" #: tqsl.cpp:629 msgid "Errors Detected" msgstr "Errores detectados" #: tqsl.cpp:636 msgid "Ignore" msgstr "Ignorar" #: tqsl.cpp:678 msgid "" "Your custom mode map %s conflicts with the standard mode definition for %hs " "and was deleted." msgstr "" "Su modo personalizado %s entra en conflicto con la definición estándar de " "modos para %hs y fue eliminado." #: tqsl.cpp:955 msgid "Error renaming backup file %s: %hs" msgstr "Error al renombrar el fichero de copia de seguridad %s: %hs" #: tqsl.cpp:1091 tqsl.cpp:1110 msgid "Checking for TQSL updates..." msgstr "Comprobando actualizaciones de TQSL..." #: tqsl.cpp:1157 msgid "Sign and &upload ADIF or Cabrillo File..." msgstr "Firmar y &Subir ficheros ADIF o Cabrillo..." #: tqsl.cpp:1158 msgid "&Sign and save ADIF or Cabrillo file..." msgstr "&Firmar y guardar ficheros ADIF o Cabrillo..." #: tqsl.cpp:1159 msgid "&Test Signing an ADIF or Cabrillo file..." msgstr "&Prueba de firma de fichero ADIF o Cabrillo..." #: tqsl.cpp:1161 msgid "&Backup Station Locations, Certificates, and Preferences..." msgstr "" "&Hacer copia de seguridad de las Ubicación de estaciones, Certificados y " "Preferencias..." #: tqsl.cpp:1162 msgid "&Restore Station Locations, Certificates, and Preferences..." msgstr "&Restaurar Ubicación de Estaciones, Certificados y Preferencias..." #: tqsl.cpp:1164 msgid "Create &New ADIF file..." msgstr "Crear un &Nuevo fichero ADIF..." #: tqsl.cpp:1165 msgid "&Edit existing ADIF file..." msgstr "&Editar un fichero ADIF existente..." #: tqsl.cpp:1168 msgid "&Preferences..." msgstr "&Preferencias..." #: tqsl.cpp:1170 msgid "Display or Modify &Preferences..." msgstr "Mostrar o modificar &Preferencias..." #: tqsl.cpp:1173 tqsl.cpp:7281 tqsl.cpp:7283 msgid "Language" msgstr "Idioma" #: tqsl.cpp:1175 msgid "Dia&gnostic Mode" msgstr "Modo Dia&gnóstico" #: tqsl.cpp:1180 tqslupdater.cpp:111 msgid "E&xit TQSL\tAlt-X" msgstr "&Salir de TQSL\tAlt-X" #: tqsl.cpp:1185 msgid "&Display Station Location Properties" msgstr "&Mostrar Propiedades de Ubicación de Estación" #: tqsl.cpp:1187 msgid "&Edit Station Location" msgstr "&Editar Ubicación de la Estación" #: tqsl.cpp:1188 msgid "&Add Station Location" msgstr "&Añadir Ubicación de la Estación" #: tqsl.cpp:1194 msgid "&Restore a Deleted Station Location" msgstr "&Restaurar una ubicación estación borrada" #: tqsl.cpp:1207 msgid "&Contents" msgstr "&Contenido" #: tqsl.cpp:1209 msgid "Display &Documentation" msgstr "Mostrara &Documentación" #: tqsl.cpp:1214 msgid "Check for &Updates..." msgstr "Comprobar &Actualizaciones..." #: tqsl.cpp:1216 msgid "&About" msgstr "&Acerca de" #: tqsl.cpp:1219 tqsl_prefs.cpp:104 msgid "&File" msgstr "&Fichero" #: tqsl.cpp:1220 msgid "&Station Location" msgstr "Ubicación de la &Estación" #: tqsl.cpp:1221 msgid "Callsign &Certificate" msgstr "&Certificado de Indicativo" #: tqsl.cpp:1222 msgid "&Help" msgstr "&Ayuda" #: tqsl.cpp:1237 tqsl.cpp:1322 msgid "Log Operations" msgstr "Operaciones del libro" #: tqsl.cpp:1244 tqsl.cpp:1560 msgid "Status Log" msgstr "Registro de estado" #: tqsl.cpp:1270 msgid "Sign a log and upload it automatically to LoTW" msgstr "Firmar un libro y subirlo automáticamente a LoTW" #: tqsl.cpp:1285 msgid "Sign a log and save it for uploading later" msgstr "Firmar un registro y guardarlo para subirlo más tarde" #: tqsl.cpp:1301 msgid "Create an ADIF file for signing and uploading" msgstr "Crear un fichero ADIF para firmar y subir" #: tqsl.cpp:1316 msgid "Log in to the Logbook of the World Site" msgstr "Inicie sesión en la web de Logbook of the World" #: tqsl.cpp:1354 msgid "Select a Station Location to process " msgstr "Seleccione una ubicación de estación para procesar " #: tqsl.cpp:1387 msgid "Create a new Station Location" msgstr "Crear una nueva Ubicación de estación" #: tqsl.cpp:1402 tqsl.cpp:7121 msgid "Edit a Station Location" msgstr "Editar una ubicación de estación" #: tqsl.cpp:1419 tqsl.cpp:7123 msgid "Delete a Station Location" msgstr "Borrar una ubicación de estación" #: tqsl.cpp:1436 tqsl.cpp:7125 msgid "Display Station Location Properties" msgstr "Mostrar las Propiedades de una Ubicación de Estación" #: tqsl.cpp:1464 tqsl.cpp:6867 msgid "Select a Callsign Certificate to process" msgstr "Seleccionar un Certificado de Indicativo para procesar" #: tqsl.cpp:1492 msgid "Load a Callsign Certificate" msgstr "Cargar un certificado" #: tqsl.cpp:1509 tqsl.cpp:6859 msgid "Save a Callsign Certificate" msgstr "Guardar un certificado" #: tqsl.cpp:1526 tqsl.cpp:6652 tqsl.cpp:6861 tqsl.cpp:6928 msgid "Renew a Callsign Certificate" msgstr "Renovar un certificado" #: tqsl.cpp:1543 msgid "Display a Callsign Certificate's Properties" msgstr "Mostrar las propiedades de un certificado" #: tqsl.cpp:1577 tqsl.cpp:1714 tqsl.cpp:1744 msgid "Add Station Location" msgstr "Añadir ubicación de estación" #: tqsl.cpp:1663 msgid "About" msgstr "Acerca" #: tqsl.cpp:1676 msgid "Log File" msgstr "Fichero de registro" #: tqsl.cpp:1677 msgid "Log files (*.log)|*.log|All files (*.*)|*.*" msgstr "Ficheros de registro (*.log)|*.log|Todos los ficheros (*.*)|*.*" #: tqsl.cpp:1684 msgid "Error opening diagnostic log %s: %hs" msgstr "Error al abrir el registro de diagnóstico %s: %hs" #: tqsl.cpp:1685 msgid "Log File Error" msgstr "Error en fichero de registro" #. TRANSLATORS: uncommon error - error in a station location, followed by the ignore message that follows. #: tqsl.cpp:1772 tqsl.cpp:3186 tqsl.cpp:7242 msgid "The invalid data was ignored." msgstr "Los datos no válidos fueron ignorados." #: tqsl.cpp:1773 msgid "Location data error" msgstr "Error en datos de ubicación" #: tqsl.cpp:1777 tqsl.cpp:1804 tqsl.cpp:3191 tqsl.cpp:7247 msgid "Edit Station Location : %hs - %s" msgstr "Editar Ubicación de Estación: %hs - %s" #: tqsl.cpp:1813 tqsl.cpp:6127 msgid "Edit Station Location" msgstr "Editar la ubicación de estación" #: tqsl.cpp:1813 tqsl.cpp:7552 tqsl.cpp:7654 tqsl_prefs.cpp:101 msgid "Close" msgstr "Cerrar" #: tqsl.cpp:1923 msgid "Open File" msgstr "Abrir el fichero" #: tqsl.cpp:2078 msgid "Please choose a callsign for this Station Location" msgstr "Por favor, elija un indicativo para la ubicación de esta estación" #: tqsl.cpp:2079 msgid "Select Callsign" msgstr "Seleccione el indicativo" #: tqsl.cpp:2111 msgid "There are no valid callsign certificates for callsign" msgstr "No hay certificados válidos para el indicativo" #: tqsl.cpp:2113 msgid "in entity" msgstr "en la entidad" #: tqsl.cpp:2115 msgid "Signing aborted." msgstr "Firma abortada." #: tqsl.cpp:2126 msgid "Signing using Callsign %hs, DXCC Entity %hs" msgstr "Firmar usando Indicativos %hs, Entidad DXCC %hs" #: tqsl.cpp:2146 msgid "Another copy of TQSL is signing a log" msgstr "Otra copia de TQSL está firmando un libro" #: tqsl.cpp:2147 msgid "" "TQSL must wait for other running copies of TQSL to exit before signing ..." msgstr "" "TQSL debe esperar a que finalicen otras copias de TQSL en ejecución antes de " "firmar..." #: tqsl.cpp:2152 msgid "Aborting due to user cancelling" msgstr "Abortando por cancelación del usuario" #: tqsl.cpp:2180 tqsl.cpp:2436 msgid "Cancelled" msgstr "Cancelado" #: tqsl.cpp:2234 tqsl.cpp:2244 #, c-format msgid "QSOs: %d" msgstr "QSOs: %d" #: tqsl.cpp:2236 #, c-format msgid "Previously Signed: %d" msgstr "Firmados anteriormente: %d" #: tqsl.cpp:2238 tqsl.cpp:2248 #, c-format msgid "Errors: %d" msgstr "Errores: %d" #: tqsl.cpp:2246 #, c-format msgid "Previously signed: %d" msgstr "Firmados anteriormente: %d" #: tqsl.cpp:2255 msgid "" "This log has too many previously uploaded QSOs. Please only upload new QSOs " "or break the log into smaller pieces (50,000 QSOs or less)." msgstr "" "Este libro tiene demasiados QSO subidos anteriormente. Por favor, suba sólo " "nuevos QSO o divida el libro en ficheros más pequeños (de 50000 QSO o menos)." #: tqsl.cpp:2327 tqsl.cpp:2411 #, c-format msgid "on line %d" msgstr "en línea %d" #: tqsl.cpp:2337 #, c-format msgid "" "Your QTH Details changed for this QSO.\n" "\n" "Originally these were: %s\n" "Now they are:%s\n" "\n" "Please verify that you intended to change this QSO!\n" msgstr "" "Los detalles de su QTH cambiaron para este QSO.\n" "\n" "Originalmente eran: %s\n" "Ahora son: %s\n" "\n" "¡Por favor verifique que pretendía modificar este QSO!\n" #: tqsl.cpp:2359 msgid "Click 'Ignore' to continue signing this log while ignoring errors." msgstr "" "Haga clic en 'Ignorar' para continuar firmando este libro mientras se ignoran " "los errores." #: tqsl.cpp:2361 msgid "Click 'Cancel' to abandon signing this log." msgstr "Haga clic en \"Cancelar\" para abandonar la firma de este libro." #: tqsl.cpp:2389 msgid "Signing cancelled" msgstr "Firma cancelada" #: tqsl.cpp:2392 msgid "Duplicate QSO detected" msgstr "Detectado QSO duplicado" #: tqsl.cpp:2395 msgid "Signing aborted" msgstr "Firma abortada" #: tqsl.cpp:2414 msgid "Signing aborted due to errors" msgstr "Firma anulada debido a errores" #: tqsl.cpp:2418 #, c-format msgid "%s: %d QSOs were outside the selected date range" msgstr "%s: %d QSO estaban fuera del rango de fechas seleccionado" #: tqsl.cpp:2455 msgid "All QSOs are previously signed; aborted" msgstr "Operación abortada: Todos los QSO están firmados anteriormente" #: tqsl.cpp:2462 #, c-format msgid "%d of %d QSOs are previously signed; aborted" msgstr "Operación abortada: %d de %d QSO están firmados anteriormente" #: tqsl.cpp:2479 #, c-format msgid "%s: %d QSO records were previously signed" msgstr "%s: %d registros de QSO fueron firmados anteriormente" #: tqsl.cpp:2507 msgid "Invalid contact - QSO does not specify a Callsign" msgstr "Contacto no válido - QSO no especifica un indicativo" #: tqsl.cpp:2508 msgid "Invalid contact - QSO does not specify a band or frequency" msgstr "Contacto no válido - QSO no especifica una banda o frecuencia" #: tqsl.cpp:2509 msgid "Invalid contact - QSO does not specify a mode" msgstr "Contacto no válido - QSO no especifica un modo" #: tqsl.cpp:2510 msgid "Invalid contact - QSO does not specify a date" msgstr "Contacto no válido - QSO no especifica una fecha" #: tqsl.cpp:2511 msgid "Invalid contact - QSO does not specify a time" msgstr "Contacto no válido - QSO no especifica una hora" #: tqsl.cpp:2513 msgid "This callsign certificate is already active and cannot be restored." msgstr "Este certificado ya está activo y no se puede restaurar." #: tqsl.cpp:2548 #, c-format msgid "Unable to open %s for output" msgstr "No se puede abrir %s para la salida" #: tqsl.cpp:2558 msgid "No records output" msgstr "No hay salida de registros" #: tqsl.cpp:2621 #, c-format msgid "%s: wrote %d records to %s" msgstr "%s: escribió %d registros a %s" #: tqsl.cpp:2624 #, c-format msgid "%s is ready to be emailed or uploaded." msgstr "%s está listo para ser enviado por correo electrónico o subido." #: tqsl.cpp:2625 msgid "Note: TQSL assumes that this file will be uploaded to LoTW." msgstr "Nota: TQSL asume que este fichero se subirá a LoTW." #: tqsl.cpp:2626 msgid "" "Resubmitting these QSOs will cause them to be reported as already signed." msgstr "Subir de nuevo estos QSO provocará que se marquen como ya firmados." #: tqsl.cpp:2628 #, c-format msgid "" "To submit the signed log file to LoTW:\n" "1. Move the signed log file to a computer with internet access\n" "2. Log in to your LoTW Web Account\n" "3. Select the Upload File tab\n" "4. Click the Choose File button, and select the signed log file you created " "(%s)\n" "5. Click the Upload file button\n" "\n" "Alternatively, you can attach the signed log file to an email message, and " "send the message to lotw-logs@arrl.org" msgstr "" "Para presentar un fichero de libro firmado a LoTW:\n" "1. Mueva el fichero de libro firmado a un ordenador con acceso a internet\n" "2. Inicie sesión en su cuenta web de LOTW\n" "3. Seleccione la pestaña Cargar fichero\n" "4. Haga clic en el botón para seleccionar el fichero y seleccione el fichero " "de libro firmado que ha creado (%s)\n" "5. Haga clic en el botón Subir fichero\n" "\n" "Alternativamente, puede adjuntar el fichero de libro firmado en un correo " "electrónico y enviarlo a lotw-logs@arrl.org" #: tqsl.cpp:2630 msgid "" "Note: TQSL has not recorded signing these QSOs. You can submit this log file " "to LoTW or discard it." msgstr "" "Nota: TQSL no ha registrado que estos QSO se hayan firmado. Puede presentar " "este fichero de libro a LoTW o descartarlo." #: tqsl.cpp:2735 msgid "Error compressing before upload" msgstr "Error al compremir antes de subir" #: tqsl.cpp:2842 msgid "Unable to open ca-bundle.crt. Your TQSL installation is incomplete" msgstr "" "No ha sido posible abrir ca-bundle.crt. La instalación de TQSL no está " "completa" #: tqsl.cpp:2907 msgid "Error: Could not upload file (CURL Init error)" msgstr "Error: No se pudo cargar el fichero (error CURL Init)" #: tqsl.cpp:2942 msgid "Attempting to upload one QSO" msgstr "Intentando subir un QSO" #: tqsl.cpp:2944 #, c-format msgid "Attempting to upload %d QSOs" msgstr "Intentando subir %d QSOs" #: tqsl.cpp:2947 #, c-format msgid "Attempting to upload %s" msgstr "Intentando subir %s" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate" msgstr "Subiendo certificado" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate Request..." msgstr "Subiendo solicitud de certificado..." #: tqsl.cpp:2963 msgid "Could not spawn upload thread!" msgstr "¡No puede producir la carga del hilo!" #: tqsl.cpp:2997 #, c-format msgid "" "%s: Log uploaded successfully with result:\n" "\n" "%s" msgstr "" "%s: Libro subido con éxito con resultado:\n" "\n" "%s" #: tqsl.cpp:2999 tqsl.cpp:3020 msgid "After reading this message, you may close this program." msgstr "Después de leer este mensaje, puede cerrar este programa." #: tqsl.cpp:3007 tqsl.cpp:3012 #, c-format msgid "" "%s uploaded with result:\n" "\n" "%s" msgstr "" "%s cargado/s con resultado\n" "\n" "%s" #: tqsl.cpp:3009 #, c-format msgid "" "%s Uploaded with result:\n" "\n" "%s" msgstr "" "%s Cargado/s con resultado\n" "\n" "%s" #: tqsl.cpp:3019 #, c-format msgid "%s: Log uploaded successfully" msgstr "%s: Libro subido correctamente" #: tqsl.cpp:3022 #, c-format msgid "%s uploaded successfully" msgstr "%s: subido correctamente" #: tqsl.cpp:3029 #, c-format msgid "%s: %s upload was rejected with result \"%s\"" msgstr "%s: %s subida ha sido rechazada con resultado \"%s\"" #: tqsl.cpp:3033 #, c-format msgid "%s: %s upload was rejected" msgstr "%s: %s subida fue rechazada" #: tqsl.cpp:3039 #, c-format msgid "%s: Got an unexpected response on %s upload! Maybe the site is down?" msgstr "" "%s: se obtuvo una respuesta inesperada al subir %s ! ¿Tal vez el sitio web no " "funcione?" #: tqsl.cpp:3051 #, c-format msgid "" "%s: Unable to upload - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "%s: no se pudo subir - o bien su conexión de Internet no funciona o LoTW no " "está disponible." #: tqsl.cpp:3052 tqsl.cpp:3056 tqsl.cpp:3060 #, c-format msgid "Please try uploading the %s later." msgstr "Por favor trate de subir el %s más tarde." #: tqsl.cpp:3055 #, c-format msgid "%s: Unable to upload. The network is down or the LoTW site is too busy." msgstr "" "%s: no se pudo subir. No hay red o el sitio web de LoTW está muy ocupado." #: tqsl.cpp:3059 #, c-format msgid "%s: Unable to connect to the upload site." msgstr "%s: no se puede conectar al sitio de subida." #: tqsl.cpp:3063 #, c-format msgid "%s: Upload cancelled" msgstr "%s: Subida cancelada" #: tqsl.cpp:3068 msgid "%s: Couldn't upload the file: CURL returned \"%hs\" (%hs)" msgstr "%s: No se pudo subir el fichero: CURL retornó \"%hs\"( %hs)" #: tqsl.cpp:3081 msgid "Your upload appears to have failed. Should TQSL try again?" msgstr "Su subida parece que ha fallado. ¿Quiere que TQSL lo intente de nuevo?" #: tqsl.cpp:3081 tqsl.cpp:6794 msgid "Retry?" msgstr "¿Reintentar?" #: tqsl.cpp:3110 msgid "" "There are no callsign certificates for callsign %hs. This station location " "cannot be edited." msgstr "" "No hay certificados para el indicativo %hs. No se puede modificar esta " "ubicación de estación." #: tqsl.cpp:3110 tqsl.cpp:3112 tqsl.cpp:3146 msgid "No Certificate" msgstr "Sin certificado" #: tqsl.cpp:3112 tqsl.cpp:3132 msgid "" "There are no current callsign certificates for callsign %hs. This station " "location cannot be used to sign a log file." msgstr "" "No hay certificados para el indicativo %hs. Esta ubicación de estación no " "puede utilizarse para firmar un fichero de libro." #: tqsl.cpp:3134 msgid "" "There is a newer callsign certificate for callsign %hs. This station location " "cannot be used to sign a log file until the new certificate is installed." msgstr "" "Hay un certificado más nuevo para el indicativo %hs. Esta ubicación de " "estación no puede utilizarse para firmar un fichero de libro hasta que lo " "instale." #: tqsl.cpp:3136 msgid "" "The callsign certificate for callsign %hs has expired. This station location " "cannot be used to sign a log file until a valid callsign certificate is " "installed." msgstr "" "El certificado para el indicativo %hs ha expirado. Esta ubicación de estación " "no puede utilizarse para firmar un fichero de libro hasta que instale un " "certificado válido." #: tqsl.cpp:3187 tqsl.cpp:3207 tqsl.cpp:7243 msgid "Station Location data error" msgstr "Error en datos de ubicación de estación" #: tqsl.cpp:3206 msgid "This should be corrected before signing a log file." msgstr "Esto debe ser corregido antes de firmar un fichero de libro." #: tqsl.cpp:3376 msgid "TQSL Update Available" msgstr "Actualización TQSL disponible" #: tqsl.cpp:3388 #, c-format msgid "A new TQSL release (V%s) is available!" msgstr "¡Una nueva versión de TQSL (V%s) está disponible!" #: tqsl.cpp:3390 #, c-format msgid "" "An updated TrustedQSL configuration file (V%s) is available!\n" "The configuration file installs definitions for entities, modes, etc." msgstr "" "¡Un fichero actualizado de configuración de TrustedQSL (V %s) está " "disponible!\n" "El fichero de configuración instala definiciones para entidades, modos, etc.." #: tqsl.cpp:3398 msgid "Download from:" msgstr "Descargar desde:" #: tqsl.cpp:3407 msgid "More details at:" msgstr "Más detalles en:" #: tqsl.cpp:3415 msgid "Click 'OK' to install the new version of TQSL, or Cancel to ignore it." msgstr "" "Haga clic en \"Aceptar\" para instalar la nueva versión de TQSL, o Cancelar " "para ignorarlo." #: tqsl.cpp:3420 msgid "" "Click 'OK' to install the new configuration file, or Cancel to ignore it." msgstr "" "Haga clic en 'Aceptar' para instalar el nuevo fichero de configuración, o " "Cancelar para ignorarlo." #: tqsl.cpp:3472 msgid "Can't open new configuration file %s: %hs" msgstr "No se puede abrir el fichero de configuración %s: %hs" #: tqsl.cpp:3488 tqsl.cpp:3568 msgid "Error writing new configuration file %s: %hs" msgstr "Error al escribir en fichero de configuración %s: %hs" #: tqsl.cpp:3496 msgid "Configuration file successfully updated" msgstr "El fichero de configuración se ha actualizado correctamente" #: tqsl.cpp:3496 msgid "Update Completed" msgstr "Actualización completada" #: tqsl.cpp:3512 tqsl.cpp:3592 msgid "" "Unable to update - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "No se puede actualizar - su conexión a Internet no funciona o LoTW no está " "disponible." #: tqsl.cpp:3513 tqsl.cpp:3516 tqsl.cpp:3519 tqsl.cpp:3593 tqsl.cpp:3596 #: tqsl.cpp:3599 tqsl.cpp:4113 tqsl.cpp:4119 tqsl.cpp:4125 tqsl.cpp:4148 #: tqsl.cpp:4154 tqsl.cpp:4160 msgid "Please try again later." msgstr "Por favor inténtalo más tarde." #: tqsl.cpp:3515 tqsl.cpp:3595 msgid "Unable to update. The network is down or the LoTW site is too busy." msgstr "" "No se puede actualizar. La red no funciona o el sitio web de LoTW está " "demasiado ocupado." #: tqsl.cpp:3518 tqsl.cpp:3598 tqsl.cpp:4123 tqsl.cpp:4158 msgid "Unable to connect to the update site." msgstr "No se puede conectar al sitio de actualización." #: tqsl.cpp:3521 msgid "Error downloading new configuration file:" msgstr "Error al descargar el nuevo fichero de configuración:" #: tqsl.cpp:3523 tqsl.cpp:3603 tqsl.cpp:3894 msgid "Update" msgstr "Actualización" #: tqsl.cpp:3552 msgid "Can't open TQSL update file %s: %hs" msgstr "No se puede abrir el fichero de actualización de TQSL %s:%hs" #: tqsl.cpp:3601 msgid "Error downloading new file:" msgstr "Error descargando el nuevo fichero:" #: tqsl.cpp:3857 msgid "Error checking for expired callsign certificates:" msgstr "Error al comprobar certificados caducados:" #: tqsl.cpp:3858 msgid "Check Error" msgstr "Error de comprobación" #: tqsl.cpp:3861 msgid "The certificate for %hs expires in %d days." msgstr "El certificado de %hs vence en %d días." #: tqsl.cpp:3864 msgid "The certificate for %hs expires in %d days" msgstr "El certificado de %hs vence en %d dias" #: tqsl.cpp:3866 msgid "Do you want to renew it now?" msgstr "¿Desea renovarlo ahora?" #: tqsl.cpp:3868 msgid "Certificate Expiring" msgstr "Vencimiento de certificado" #: tqsl.cpp:3912 #, c-format msgid "A new TQSL release (V%s) is available." msgstr "Está disponible una nueva versión de TQSL (V%s)." #: tqsl.cpp:3929 #, c-format msgid "A new TrustedQSL configuration file (V%s) is available." msgstr "Está disponible un nuevo fichero de configuración de TrustedQSL (V%s)." #: tqsl.cpp:3942 msgid "Your system is up to date" msgstr "Su sistema está actualizado" #: tqsl.cpp:3944 msgid "TQSL Version %hs and Configuration Data Version %s" msgstr "Versión de TQSL %hs y versión de configuración de datos %s" #: tqsl.cpp:3946 msgid "are the newest available" msgstr "son la más nuevas disponibles" #: tqsl.cpp:3947 msgid "No Updates" msgstr "No hay actualizaciones" #: tqsl.cpp:4111 tqsl.cpp:4146 msgid "" "Unable to check for updates - either your Internet connection is down or LoTW " "is unreachable." msgstr "" "No se puede comprobar si hay actualizaciones - o su conexión a Internet no " "funciona o LoTW no está disponible." #: tqsl.cpp:4117 tqsl.cpp:4152 msgid "" "Unable to check for updates. The network is down or the LoTW site is too busy." msgstr "" "No se puede comprobar si hay actualizaciones. La red no funciona o el sitio " "de LOTW está demasiado ocupado." #: tqsl.cpp:4128 msgid "Error downloading new version information:" msgstr "Error al descargar la nueva información sobre la versión:" #: tqsl.cpp:4163 msgid "Error downloading update version information:" msgstr "Error al descargar la versión de actualización:" #: tqsl.cpp:4482 msgid "You have no callsign certificates to use to sign a log file." msgstr "No tiene ningún certificado para firmar un fichero de libro." #: tqsl.cpp:4484 msgid "Please install a callsign certificate then try again." msgstr "Por favor, instale un certificado e inténtelo de nuevo." #: tqsl.cpp:4485 msgid "No Callsign Certificates" msgstr "No hay certificados de indicativo" #: tqsl.cpp:4510 msgid "|ADIF files (" msgstr "|Ficheros ADIF (" #: tqsl.cpp:4522 msgid "|Cabrillo files (" msgstr "|Ficheros Cabrillo (" #: tqsl.cpp:4525 msgid "Select file to Sign" msgstr "Seleccionar fichero para firmar" #: tqsl.cpp:4541 msgid "TQSL compressed data files (*.tq8)|*.tq8" msgstr "Ficheros de datos TQSL comprimidos (*.tq8)|*.tq8" #: tqsl.cpp:4542 msgid "TQSL data files (*.tq7)|*.tq7" msgstr "Ficheros de datos TQSL (*.tq7)|*.tq7" #: tqsl.cpp:4544 msgid "Select file to write to" msgstr "Seleccionar fichero para escribir en" #: tqsl.cpp:4560 tqsl.cpp:6263 msgid "Select Station Location for Signing" msgstr "Seleccione la ubicación de estación par firmar" #: tqsl.cpp:4593 msgid "Signing abandoned" msgstr "Operación de firma abandonada" #: tqsl.cpp:4811 msgid "" "TQSL must wait for other running copies of TQSL to exit before backing up..." msgstr "" "TQSL debe esperar a cerrar otras copias en ejecución de TQSL antes de " "realizar copias de seguridad..." #: tqsl.cpp:4828 tqsl.cpp:5384 msgid "Error opening save file %s: %hs" msgstr "Error al abrir fichero de copia %s: %hs" #: tqsl.cpp:4844 msgid "Saving callsign certificates" msgstr "Guardando certificados de indicativo" #: tqsl.cpp:4888 msgid "Saving callsign certificate for %hs" msgstr "Guardando certificados de indicativo %hs" #: tqsl.cpp:4921 msgid "Saving Station Locations" msgstr "Guardando Ubicaciones de estación" #: tqsl.cpp:4937 msgid "Saving TQSL Preferences" msgstr "Guardando Preferencias TQSL" #: tqsl.cpp:4951 msgid "Saving QSOs" msgstr "Guardando QSO" #: tqsl.cpp:4997 msgid "Save operation complete." msgstr "Completa la operación de copia de seguridad." #: tqsl.cpp:5006 msgid "Error performing automatic backup: %hs" msgstr "Error al realizar la copia de seguridad automática: %hs" #: tqsl.cpp:5007 msgid "Backup Error" msgstr "Error de copia de seguridad" #: tqsl.cpp:5009 tqsl.cpp:5028 msgid "Backup operation failed: %hs" msgstr "Error en la operación de restauración de copia de seguridad: %hs" #: tqsl.cpp:5019 msgid "Enter file to save to" msgstr "Introducir fichero para guardar en" #: tqsl.cpp:5020 msgid "Configuration files (*.tbk)|*.tbk|All files (*.*)|*.*" msgstr "Ficheros de configuración (* .tbk)|* .tbk|Todos los ficheros (*.*)|*.*" #: tqsl.cpp:5065 msgid "Restoring callsign certificate for %hs" msgstr "Recuperando certificados para %hs" #: tqsl.cpp:5111 msgid "Restoring Preferences" msgstr "Restaurando Preferencias" #: tqsl.cpp:5173 msgid "Restoring Station Locations" msgstr "Restaurando Ubicaciones de estación" #: tqsl.cpp:5194 msgid "Restoring QSO records" msgstr "Restaurando registros de QSO" #: tqsl.cpp:5252 msgid "Error importing station locations: %hs" msgstr "Error al importar ubicaciones de estación: %hs" #: tqsl.cpp:5316 msgid "Restoring Callsign Certificates" msgstr "Restaurando Certificados de Indicativo" #: tqsl.cpp:5323 tqsl.cpp:5331 tqsl.cpp:5336 msgid "Error parsing saved configuration file: %hs" msgstr "Error al analizar el fichero de configuración guardado: %hs" #: tqsl.cpp:5340 msgid "Restore Complete." msgstr "Restauración completa." #: tqsl.cpp:5354 msgid "Error parsing station location file: %hs" msgstr "Error al analizar el fichero de ubicación de estación: %hs" #: tqsl.cpp:5366 msgid "Select saved configuration file" msgstr "Seleccione el fichero de configuración guardado" #: tqsl.cpp:5367 msgid "Saved configuration files (*.tbk)|*.tbk" msgstr "Ficheros de configuración guardados (*.tbk)|*.tbk" #: tqsl.cpp:5397 msgid "Restore operation failed: %hs" msgstr "Operación de restauración fallida: %hs" #: tqsl.cpp:5687 msgid "Exit TQSL so I can re-run as a normal user" msgstr "Saliendo de TQSL para ejecutar de nuevo como usuario normal" #: tqsl.cpp:5688 msgid "Allow TQSL to continue this time." msgstr "Permitir a TQSL para continuar esta vez." #: tqsl.cpp:5689 msgid "Always allow running as Administrator." msgstr "Permitir siempre ejecución como administrador." #: tqsl.cpp:5690 msgid "TQSL must not be run 'As Administrator'" msgstr "TQSL no puede ejecutarse como administrador" #: tqsl.cpp:5690 msgid "Administrator Error" msgstr "Error de administrador" #: tqsl.cpp:5833 msgid "Specify dialog action - abort, all, compliant or ask" msgstr "Especifique la acción de diálogo - abortar, todo, aceptar o pedir" #: tqsl.cpp:5834 msgid "Specify start date for QSOs to sign" msgstr "Especificar la fecha de inicio de QSOs para firmar" #: tqsl.cpp:5835 msgid "Specify default callsign for log signing" msgstr "Especificar indicativo por defecto para firmar el libro" #: tqsl.cpp:5836 msgid "Suppress date range dialog" msgstr "Suprimir diálogo de rango de fechas" #: tqsl.cpp:5837 msgid "Specify end date for QSOs to sign" msgstr "Especificar fecha de finalización de QSOs para firmar" #: tqsl.cpp:5838 msgid "Specify QSO verification action - ignore, report or update" msgstr "" "Especificar acción de verificación de QSO - ignorar, informar o actualizar" #: tqsl.cpp:5840 msgid "Display command line help" msgstr "Mostrar la ayuda de línea de comandos" #: tqsl.cpp:5841 msgid "Import a certificate file (.p12 or .tq6)" msgstr "Importar un fichero de certificado (p.12 o .tq6)" #: tqsl.cpp:5843 msgid "Selects Station Location" msgstr "Seleccionar una ubicación de estación" #: tqsl.cpp:5845 msgid "Check for updates to tqsl and the configuration file" msgstr "Comprobar si hay actualizaciones de TQSL y el fichero de configuración" #: tqsl.cpp:5846 msgid "Output file name (defaults to input name minus extension plus .tq8" msgstr "" "Nombre del fichero de salida (por defecto igual a nombre entrada menos " "extensión más .tq8)" #: tqsl.cpp:5847 msgid "Passphrase for the signing key" msgstr "Frase de contraseña para la clave de firma" #: tqsl.cpp:5848 msgid "Quiet Mode - same behavior as -x" msgstr "Modo Silencioso - el mismo comportamiento como -x" #: tqsl.cpp:5851 msgid "Edit (if used with -l) or create Station Location" msgstr "Editar (si está utilizado con -l) o crear ubicación de estación" #: tqsl.cpp:5852 msgid "File name for diagnostic tracking log" msgstr "Nombre del fichero de seguimiento de diagnóstico del libro" #: tqsl.cpp:5853 msgid "Upload after signing instead of saving" msgstr "Cargar después de firmar en vez de guardar" #: tqsl.cpp:5854 msgid "Display the version information and exit" msgstr "Mostrar la información de versión y salir" #: tqsl.cpp:5855 msgid "Wipe the TQSL uploads database" msgstr "Limpiar la base de datos de subidas de TQSL" #: tqsl.cpp:5856 msgid "Exit after processing log (otherwise start normally)" msgstr "" "Salir después de procesar el libro (de lo contrario iniciar normalmente)" #: tqsl.cpp:5859 msgid "Input ADIF or Cabrillo log file to sign" msgstr "Introducir libro en ADIF o Cabrillo para firmar" #: tqsl.cpp:6049 tqsl.cpp:6052 #, c-format msgid "Start date of %s is invalid" msgstr "No es válida la Fecha de inicio de %s" #: tqsl.cpp:6063 tqsl.cpp:6066 #, c-format msgid "End date of %s is invalid" msgstr "No es válida la fecha de finalización de %s" #: tqsl.cpp:6088 msgid "The -a parameter %hs is not recognized" msgstr "El parámetro -a %hs no se reconoce" #. TRANSLATORS: -f is the command line switch for log QTH handling #: tqsl.cpp:6109 msgid "The -f parameter %hs is not recognized" msgstr "El parámetro -f %hs no se ha reconocido" #: tqsl.cpp:6190 tqsl.cpp:6196 msgid "" "To import this passphrase protected P12 file, you must pass the passphrase on " "the command line" msgstr "" "Para importar este fichero P12 protegido con frase de contraseña, debe pasar " "la frase en la línea de comando" #: tqsl.cpp:6218 msgid "No logfile to sign!" msgstr "¡No hay ningún fichero de libro para firmar!" #: tqsl.cpp:6234 msgid "" "Warning: The TQSL ADIF editor only processes a limited number of ADIF " "fields.\n" "\n" "Using the editor on an ADIF file can cause QSO details to be lost!" msgstr "" "ADVERTENCIA: El editor de ADIF de TQSL sólo procesa un número limitado de " "campos ADIF.\n" "\n" "¡Utilizar el editor en un fichero ADIF puede causar pérdida de datos en los " "QSO!" #: tqsl.cpp:6346 msgid "Please review the introductory documentation before using this program." msgstr "" "Por favor, revise la documentación introductoria antes de usar este programa." #: tqsl.cpp:6347 msgid "Notice" msgstr "Nota" #: tqsl.cpp:6352 msgid "" "You have no callsign certificate installed on this computer with which to " "sign log submissions." msgstr "" "No tiene ningún certificado instalado en este equipo para firmar envíos de " "libros." #: tqsl.cpp:6354 msgid "Would you like to request a callsign certificate now?" msgstr "¿Desea solicitar un certificado ahora?" #: tqsl.cpp:6356 msgid "If you are planning to restore from a backup, please choose 'No'." msgstr "Seleccione 'No' si planea restaurarlos desde una copia de seguridad." #: tqsl.cpp:6357 msgid "Alert" msgstr "Alerta" #: tqsl.cpp:6479 msgid "Display Callsign Certificate &Properties" msgstr "Mostrar &Propiedades del certificado" #: tqsl.cpp:6481 msgid "&Load Callsign Certificate from File" msgstr "&Cargar certificado desde un fichero" #: tqsl.cpp:6482 msgid "&Save Callsign Certificate to File..." msgstr "&Guardar certificado a un fichero..." #: tqsl.cpp:6486 msgid "Request &New Callsign Certificate..." msgstr "Solicitar un &Nuevo certificado..." #: tqsl.cpp:6487 msgid "&Renew Callsign Certificate" msgstr "&Renovar certificado" #: tqsl.cpp:6492 msgid "&Delete Callsign Certificate" msgstr "&Borrar Certificado" #: tqsl.cpp:6498 msgid "Restore Deleted Callsign Certificate" msgstr "Restaurar certificados eliminados" #: tqsl.cpp:6511 msgid "&Edit" msgstr "&Editar" #: tqsl.cpp:6513 msgid "&Delete" msgstr "&Borrar" #: tqsl.cpp:6560 msgid "Load Certificate File" msgstr "Cargar fichero de certificado" #: tqsl.cpp:6652 crqwiz.h:63 msgid "Request a new Callsign Certificate" msgstr "Solicitar un nuevo certificado" #: tqsl.cpp:6732 msgid "Do you want to upload this certificate request to LoTW now?" msgstr "¿Desea enviar ahora esta solicitud de certificado a LoTW?" #: tqsl.cpp:6735 msgid "You do not need an account on LoTW to do this." msgstr "No necesita una cuenta de LoTW para hacer esto." #: tqsl.cpp:6737 msgid "Upload" msgstr "Subir" #: tqsl.cpp:6747 tqsl.cpp:6796 msgid "tQSL Cert Request files (*." msgstr "ficheros de solicitud de Cert TQSL (*." #: tqsl.cpp:6749 tqsl.cpp:6798 msgid "|All files (" msgstr "|Todos los ficheros (" #: tqsl.cpp:6750 tqsl.cpp:6799 msgid "Save request" msgstr "Guardar petición" #: tqsl.cpp:6753 tqsl.cpp:6802 msgid "Request cancelled" msgstr "Solicitud cancelada" #: tqsl.cpp:6766 msgid "Error creating callsign certificate request: %hs" msgstr "Error al crear la solicitud del certificado: %hs" #: tqsl.cpp:6766 msgid "Error creating Callsign Certificate Request" msgstr "Error al crear solicitud de certificado" #: tqsl.cpp:6779 msgid "Error opening certificate request file %s: %hs" msgstr "Error al abrir el fichero de solicitud del certificado %s: %hs" #: tqsl.cpp:6789 tqsl.cpp:7376 tqsl.cpp:7520 msgid "Certificate Request" msgstr "Solicitud de certificado" #: tqsl.cpp:6793 msgid "Your certificate request did not upload properly." msgstr "Su solicitud de certificado no se subió correctamente." #: tqsl.cpp:6794 msgid "" "Your upload appears to have failed.\n" "Do you want to save this request for uploading later?" msgstr "" "Su subida aparece como fallida.\n" "¿Desea guardar esta solicitud para subirla más tarde?" #: tqsl.cpp:6812 msgid "You may now send your new certificate request (" msgstr "Ahora puede enviar su nueva solicitud de certificado (" #: tqsl.cpp:6817 msgid "to:" msgstr "para:" #: tqsl.cpp:6824 msgid "or " msgstr "o " #: tqsl.cpp:6825 msgid "see:" msgstr "ver:" #: tqsl.cpp:6863 msgid "Display a Callsign Certificate" msgstr "Mostrar un Certificado de Indicativo" #: tqsl.cpp:6911 tqsl.cpp:6913 msgid "Save the Callsign Certificate for" msgstr "Guardar el certificado para" #: tqsl.cpp:6916 tqsl.cpp:6918 msgid "Display the Callsign Certificate properties for" msgstr "Mostrar las propiedades de certificado para" #: tqsl.cpp:6922 tqsl.cpp:6924 msgid "Renew the Callsign Certificate for" msgstr "Renovar el certificado para" #: tqsl.cpp:6969 msgid "Enter the name for the new Certificate Container file" msgstr "Introduzca el nombre del nuevo fichero contenedor de certificado" #: tqsl.cpp:6970 msgid "Certificate Container files (*.p12)|*.p12|All files (*.*)|*.*" msgstr "" "Ficheros contenedores de Certificados (*.p12)|*.p12|Todos los ficheros (*.*)|" "*.*" #: tqsl.cpp:6977 msgid "Enter the passphrase for the certificate container file." msgstr "" "Introduzca la frase de contraseña para el fichero contenedor del certificado." #: tqsl.cpp:6979 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using a " "computer in a private residence, no passphrase need be specified." msgstr "" "Si comparte su ordenador con otras personas, debería especificar una frase de " "contraseña para proteger este certificado de indicativo. Si no comparte su " "ordenador con nadie, no es necesario especificarla." #: tqsl.cpp:6981 msgid "" "You will have to enter the passphrase any time you load the file into " "TrustedQSL." msgstr "" "Deberá introducir la frase de contraseña cada vez que cargue el fichero en " "TrustedQSL." #: tqsl.cpp:6985 msgid "Certificate Container Passphrase" msgstr "Frase de contraseña para el contenedor del certificado" #: tqsl.cpp:7026 msgid "Export to %s failed: %hs" msgstr "Exportar a %s falló: %hs" #: tqsl.cpp:7028 #, c-format msgid "Certificate saved in file %s" msgstr "Certificado guardado en el fichero %s" #: tqsl.cpp:7039 msgid "This will remove the selected callsign certificate from your system." msgstr "Con esto eliminará de su sistema el certificado seleccionado." #: tqsl.cpp:7041 msgid "You will NOT be able to recover it by loading a .TQ6 file." msgstr "NO podrá recuperarlo si carga un fichero .TQ6." #: tqsl.cpp:7043 msgid "You WILL be able to recover it from a container (.p12) file," msgstr "PODRÁ recuperarlo desde un fichero contenedor (. p12)," #: tqsl.cpp:7045 msgid "if you have created one via the Callsign Certificate menu's" msgstr "si ha creado uno mediante el menú de Certificado de Indicativo" #: tqsl.cpp:7047 msgid "'Save Callsign Certificate' command." msgstr "Comando 'Guardar certificado'." #: tqsl.cpp:7049 msgid "Are you sure you want to delete the certificate?" msgstr "¿Está seguro que desea eliminar el certificado?" #: tqsl.cpp:7087 msgid "There are no deleted Callsign Certificates to restore" msgstr "No hay certificados eliminados para restaurar" #: tqsl.cpp:7087 tqsl.cpp:7197 msgid "Undelete Error" msgstr "Error de no borrado" #: tqsl.cpp:7098 msgid "Choose a Callsign Certificate to restore" msgstr "Elija un certificado para restaurar" #: tqsl.cpp:7127 msgid "Select a Station Location to process" msgstr "Seleccione una ubicación de estación para procesar" #: tqsl.cpp:7147 msgid "Edit Station Location " msgstr "Editar ubicación de estación " #: tqsl.cpp:7150 msgid "Delete Station Location " msgstr "Eliminar ubicación de estación " #: tqsl.cpp:7153 msgid "Display Station Location Properties for " msgstr "Mostrar propiedades de ubicación de estación para " #: tqsl.cpp:7175 msgid "This will remove this station location from your system." msgstr "Con esto eliminará la ubicación de estación de su sistema." #: tqsl.cpp:7177 msgid "Are you sure you want to delete this station location?" msgstr "¿Está seguro que desea eliminar esta ubicación de estación?" #: tqsl.cpp:7197 msgid "There are no deleted Station Locations to restore" msgstr "No hay ubicaciones de estación eliminadas para restaurar" #: tqsl.cpp:7208 msgid "Choose a Station Location to restore" msgstr "Elija una ubicación de estación para restaurar" #: tqsl.cpp:7280 tqsl.cpp:7283 msgid "Please choose language:" msgstr "Por favor elija idioma:" #: tqsl.cpp:7351 msgid "Certificate Properties" msgstr "Propiedades de certificado" #: tqsl.cpp:7354 msgid "Begins: " msgstr "Comienza: " #: tqsl.cpp:7355 msgid "Expires: " msgstr "Expira: " #: tqsl.cpp:7356 msgid "Organization: " msgstr "Organización: " #: tqsl.cpp:7358 msgid "Serial: " msgstr "Serie: " #: tqsl.cpp:7359 msgid "Operator: " msgstr "Operador: " #: tqsl.cpp:7360 tqsl.cpp:7579 msgid "Call sign: " msgstr "Indicativo: " #: tqsl.cpp:7361 tqsl.cpp:7580 msgid "DXCC Entity: " msgstr "Entidad DXCC: " #: tqsl.cpp:7362 msgid "QSO Start Date: " msgstr "Fecha de inicio QSO: " #: tqsl.cpp:7363 msgid "QSO End Date: " msgstr "Fecha de fin QSO: " #: tqsl.cpp:7364 msgid "Passphrase: " msgstr "Frase de contraseña: " #: tqsl.cpp:7485 msgid "Missing from this computer" msgstr "No existe en este ordenador" #: tqsl.cpp:7489 tqsl.cpp:7514 msgid "Passphrase protected" msgstr "Protegido por frase de contraseña" #: tqsl.cpp:7493 msgid "Private Key not found" msgstr "Clave privada no encontrada" #: tqsl.cpp:7497 msgid "Unable to read - no permission" msgstr "No se pudo leer - no tiene permiso" #: tqsl.cpp:7505 msgid "" msgstr "" #: tqsl.cpp:7508 msgid "No Private Key" msgstr "No hay Clave Privada" #: tqsl.cpp:7511 msgid "None" msgstr "Ninguno" #: tqsl.cpp:7522 msgid "Awaiting response from ARRL" msgstr "Esperando respuesta de ARRL" #: tqsl.cpp:7536 msgid "Replaced" msgstr "Reemplazado" #: tqsl.cpp:7541 msgid "Expired" msgstr "Expirado" #: tqsl.cpp:7576 msgid "Station Location Properties" msgstr "Propiedades de ubicación de estación" #: tqsl.cpp:7581 msgid "Grid Square: " msgstr "Cuadrícula: " #: tqsl.cpp:7582 msgid "ITU Zone: " msgstr "Zona ITU: " #: tqsl.cpp:7583 msgid "CQ Zone: " msgstr "Zona CQ: " #: tqsl.cpp:7584 msgid "IOTA Locator: " msgstr "Localizador IOTA: " #: tqsl.cpp:7585 tqsl.cpp:7592 msgid "State: " msgstr "Provincia: " #: tqsl.cpp:7586 msgid "County: " msgstr "Condado: " #: tqsl.cpp:7587 tqsl.cpp:7589 tqsl.cpp:7593 msgid "Park: " msgstr "Parque: " #: tqsl.cpp:7588 tqsl.cpp:7591 msgid "Province: " msgstr "Provincia: " #: tqsl.cpp:7590 msgid "Oblast: " msgstr "Oblast: " #: tqsl.cpp:7596 msgid "Verify QTH details: " msgstr "Verifique los detalles de QTH: " #: tqsl.cpp:7657 msgid "Signing File: " msgstr "Fichero de firma: " #: tqsl.cpp:7663 msgid "" "Please verify that this is the correct Station Location for the QSOs being " "signed." msgstr "" "Por favor verifique que esta es la ubicación de estación correcta para los " "QSO a firmar." #: tqsl.cpp:7666 msgid "Click 'Cancel' if this is not the correct Station Location." msgstr "" "Haga clic en 'Cancelar' si esta no es la ubicación de estación correcta." #: tqsl.cpp:7694 msgid "Enter the Passphrase to unlock the callsign certificate" msgstr "" "Introduzca la frase de contraseña para desbloquear el certificado de " "indicativo" #: tqsl_prefs.cpp:56 msgid "Preferences" msgstr "Preferencias" #: tqsl_prefs.cpp:78 msgid "Options" msgstr "Opciones" #: tqsl_prefs.cpp:82 msgid "Log Handling" msgstr "Manejo del log" #: tqsl_prefs.cpp:85 msgid "ADIF Modes" msgstr "Modos de ADIF" #: tqsl_prefs.cpp:88 msgid "Cabrillo Specs" msgstr "Especificaciones de Cabrillo" #: tqsl_prefs.cpp:91 msgid "Network Proxy" msgstr "Proxy de la red" #: tqsl_prefs.cpp:172 msgid "Custom ADIF mode mappings:" msgstr "Asignaciones personalizadas de modos ADIF:" #: tqsl_prefs.cpp:181 tqsl_prefs.cpp:834 msgid "Add..." msgstr "Añadir..." #: tqsl_prefs.cpp:261 msgid "Add ADIF mode" msgstr "Añadir modo de ADIF" #: tqsl_prefs.cpp:270 msgid "Add ADIF mode mapping:" msgstr "Añadir asignación de modo ADIF:" #: tqsl_prefs.cpp:274 msgid "ADIF Mode:" msgstr "Modo ADIF:" #: tqsl_prefs.cpp:282 msgid "Resulting TQSL mode:" msgstr "Modo de TQSL resultante:" #: tqsl_prefs.cpp:328 #, c-format msgid "This mode definition conflicts with a standard mode definition for %s" msgstr "" "Esta definición de modo entra conflicto con una definición de modo estándar " "para %s" #: tqsl_prefs.cpp:329 msgid "Mode Conflict" msgstr "Conflicto de modo" #: tqsl_prefs.cpp:353 msgid "Allow automatic configuration backup" msgstr "Permitir copia de seguridad automática" #: tqsl_prefs.cpp:357 msgid "Backup File Folder:" msgstr "Carpeta de ficheros de copia de seguridad:" #: tqsl_prefs.cpp:363 msgid "Select a Folder" msgstr "Seleccione una carpeta" #: tqsl_prefs.cpp:370 msgid "Number of Backups to retain:" msgstr "Número de copias de seguridad para retener:" #: tqsl_prefs.cpp:381 msgid "Open ADIF files in ADIF editor" msgstr "Abrir ficheros ADIF en el editor de ADIF" #: tqsl_prefs.cpp:388 msgid "Display status messages in separate tab" msgstr "Mostrar mensajes de estado en una pestaña separada" #: tqsl_prefs.cpp:393 msgid "Enable passphrases for Callsign Certificates" msgstr "Habilitar frases de contraseña para Certificados de Indicativo" #: tqsl_prefs.cpp:399 msgid "Export P12 files compatible with Apple Keychain" msgstr "Exportar ficheros P12 compatibles con Apple Keychain" #: tqsl_prefs.cpp:448 msgid "" "Changes to the status message configuration will take affect when TQSL is " "restarted" msgstr "" "Los cambios en la configuración de mensajes de estado tendrán efecto al " "reiniciar TQSL" #: tqsl_prefs.cpp:475 msgid "Cabrillo file extensions:" msgstr "Extensiones de fichero Cabrillo:" #: tqsl_prefs.cpp:480 msgid "ADIF file extensions:" msgstr "Extensiones de fichero ADIF:" #: tqsl_prefs.cpp:486 msgid "Allow nonamateur call signs" msgstr "Permitir indicativos que no sean de radioaficionado" #: tqsl_prefs.cpp:491 msgid "Prompt for QSO Date range when signing" msgstr "Pedir el rango de fechas de QSO al firmar" #: tqsl_prefs.cpp:496 msgid "Display details of previously signed QSOs when signing a log" msgstr "Mostrar detalles de QSO firmados anteriormente al firmar un libro" #: tqsl_prefs.cpp:501 msgid "Ignore seconds in QSO times" msgstr "Ignorar los segundos en la hora del QSO" #: tqsl_prefs.cpp:506 msgid "Ignore callsigns in ADIF files" msgstr "Ignorar indicativos en ficheros ADIF" #: tqsl_prefs.cpp:517 msgid "Ignore QTH details from your log" msgstr "Ignorar los detalles de QTH en su libro" #: tqsl_prefs.cpp:517 msgid "Report on QTH differences" msgstr "Informar de diferencias de QTH" #: tqsl_prefs.cpp:517 msgid "Override Station Location with QTH details from your log" msgstr "Reemplazar ubicación de estación con los detalles de QTH de su libro" #: tqsl_prefs.cpp:519 msgid "Handle QTH information in ADIF logs with what action?" msgstr "¿Manejar información del QTH en logs ADIF con esa acción?" #: tqsl_prefs.cpp:706 msgid "" "Use these settings to configure a network proxy for Internet uploads and " "downloads. You should only enable a proxy if directed by your network " "administrator." msgstr "" "Utilice estos ajustes para configurar a un proxy de la red para subidas y " "descargas de Internet. Sólo debe habilitar un proxy si se lo indica el " "administrador de red." #: tqsl_prefs.cpp:708 msgid "" "Incorrect settings can cause TQSL to be unable to upload logs or check for " "updates." msgstr "" "Una configuración incorrecta puede causar que TQSL no pueda subir libros o " "comprobar si hay actualizaciones." #: tqsl_prefs.cpp:714 msgid "Enable a Network Proxy" msgstr "Habilitar un Proxy de red" #: tqsl_prefs.cpp:718 msgid "Proxy Address:" msgstr "Dirección de proxy:" #: tqsl_prefs.cpp:726 msgid "Port Number:" msgstr "Número de Puerto:" #: tqsl_prefs.cpp:733 msgid "Proxy Type:" msgstr "Tipo de proxy:" #: tqsl_prefs.cpp:736 msgid "ProxyType" msgstr "TipoProxy" #: tqsl_prefs.cpp:797 msgid "Cabrillo CONTEST definitions:" msgstr "Definiciones de CONCURSOS Cabrillo:" #: tqsl_prefs.cpp:809 tqsl_prefs.cpp:820 msgid "CONTEST" msgstr "CONCURSO" #: tqsl_prefs.cpp:810 tqsl_prefs.cpp:821 msgid "Type" msgstr "Tipo" #: tqsl_prefs.cpp:811 tqsl_prefs.cpp:822 msgid "Field" msgstr "Campo" #: tqsl_prefs.cpp:966 tqsl_prefs.h:272 msgid "Edit" msgstr "Editar" #: tqsl_prefs.cpp:989 msgid "Contest" msgstr "Concurso" #: tqsl_prefs.cpp:999 msgid "Cabrillo CONTEST" msgstr "CONCURSO Cabrillo" #: tqsl_prefs.cpp:1001 msgid "CONTEST Name:" msgstr "Nombre del concurso:" #: tqsl_prefs.cpp:1007 msgid "Contest type" msgstr "Tipo de concurso" #: tqsl_prefs.cpp:1012 msgid "Call-Worked Field Number:" msgstr "Número de campo indicativo trabajado:" #: tqsl_prefs.cpp:1046 msgid "Contest name cannot be blank" msgstr "El nombre del concurso no puede estar en blanco" #: tqsl_prefs.cpp:1052 #, c-format msgid "Call-worked field must be %d or greater" msgstr "El campo de indicativo trabajado debe ser %d o mayor" #. TRANSLATORS: Invalid date component, such as "Invalid Month: 15" #: tqslvalidator.cpp:76 msgid "Invalid %hs: \"%hs\"" msgstr "No válidos %hs: \"%hs\"" #: tqslwiz.cpp:168 tqslwiz.cpp:1286 #, c-format msgid "" "You have changed the following fields in this Station Location: %s\n" "Do you want to discard those changes?" msgstr "" "Ha cambiado los campos siguientes en la ubicación de estación: %s\n" "¿Desea descartar estos cambios?" #: tqslwiz.cpp:169 tqslwiz.cpp:1287 msgid "Changes have not been saved" msgstr "Los cambios no se han guardado" #: tqslwiz.cpp:334 tqslwiz.cpp:531 msgid "[None]" msgstr "[Ninguno]" #: tqslwiz.cpp:1024 tqslwiz.cpp:1193 msgid "You must select a %hs" msgstr "Debe seleccionar un %hs" #: tqslwiz.cpp:1055 #, c-format msgid "%s: Invalid Grid Field" msgstr "%s: campo de cuadrícula no válido" #: tqslwiz.cpp:1059 #, c-format msgid "%s: Invalid Grid Square" msgstr "%s: cuadrícula no válida" #: tqslwiz.cpp:1063 #, c-format msgid "%s: Invalid Grid Subsquare" msgstr "%s: subcuadrícula no válida" #: tqslwiz.cpp:1067 #, c-format msgid "%s: Invalid Grid Sub-subsquare" msgstr "%s: subcuadrícula no válida" #: tqslwiz.cpp:1071 #, c-format msgid "%s: Invalid Gridsquare Format" msgstr "%s: formato de cuadrícula no válido" #: tqslwiz.cpp:1078 #, c-format msgid "" "Grid %s is not correct for your QTH. Click 'Next' again to use it anyway." msgstr "" "La cuadrícula %s no es correcta para su QTH. Haga clic en 'Siguiente' otra " "vez para utilizarla de todos modos." #: tqslwiz.cpp:1112 #, c-format msgid "" "Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it " "anyway." msgstr "" "La cuadrícula %s no es correcta para su entidad del DXCC. Pulse 'Siguiente' " "otra vez para utilizarla de todas formas." #: tqslwiz.cpp:1115 #, c-format msgid "Grid %s is not correct for your %s. Click 'Next' again to use it anyway." msgstr "" "La cuadrícula %s no es correcta para su %s. Pulse 'Siguiente' otra vez para " "utilizarla de todas formas." #: tqslwiz.cpp:1141 #, c-format msgid "IOTA value %s is not valid." msgstr "La referencia IOTA %s no es válida." #: tqslwiz.cpp:1149 #, c-format msgid "" "IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, " "OC- or SA-" msgstr "" "La referencia IOTA %s no es correcta. Debe comenzar con AF-, AN-, AS-, EU-, " "NA-, OC- o SA-" #: tqslwiz.cpp:1156 #, c-format msgid "IOTA reference %s is not correct. Must have a number after the '-'" msgstr "" "La referencia IOTA %s no es correcta. Debe tener un número después de '-'" #: tqslwiz.cpp:1163 msgid "Invalid zone selections for state" msgstr "Selecciones de zona para el estado no válidas" #: tqslwiz.cpp:1164 msgid "Invalid zone selections for province" msgstr "Selecciones de zonas para la provincia no válidas" #: tqslwiz.cpp:1165 msgid "Invalid zone selections for oblast" msgstr "Selecciones de zona para oblast no válidas" #: tqslwiz.cpp:1166 msgid "Invalid zone selections for DXCC entity" msgstr "Selecciones de zona para entidad DXCC no válidas" #: tqslwiz.cpp:1315 msgid "Station Data input complete" msgstr "Entrada de datos de estación completada" #: tqslwiz.cpp:1319 msgid "Select or enter name of this station location" msgstr "Seleccione o escriba el nombre de esta ubicación de estación" #: tqslwiz.cpp:1342 tqslwiz.cpp:1348 msgid "Station Location Name" msgstr "Nombre de la ubicación de estación" #: tqslwiz.cpp:1386 msgid "Station name must be provided" msgstr "Debe proporcionarse el nombre de estación" #: wxutil.cpp:139 msgid "Memory allocation failure" msgstr "Fallo de asignación de memoria" #: wxutil.cpp:140 msgid "Unable to initialize random number generator" msgstr "No se pudo inicializar el generador de números aleatorios" #: wxutil.cpp:141 msgid "Invalid argument" msgstr "Argumento no válido" #: wxutil.cpp:142 msgid "Operator aborted operation" msgstr "Operación abortada" #: wxutil.cpp:143 msgid "No Certificate Request matches the selected Callsign Certificate" msgstr "" "No coincide ninguna solicitud de certificado con el certificado seleccionado" #: wxutil.cpp:144 msgid "Buffer too small" msgstr "Búfer demasiado pequeño" #: wxutil.cpp:145 msgid "Invalid date format" msgstr "Formato de fecha no válida" #: wxutil.cpp:146 msgid "Certificate not initialized for signing" msgstr "Certificado no inicializado para la firma" #: wxutil.cpp:147 msgid "Passphrase not correct" msgstr "Frase de contraseña incorrecta" #: wxutil.cpp:148 msgid "Expected name" msgstr "Nombre esperado" #: wxutil.cpp:149 msgid "Name exists" msgstr "Nombre existe" #: wxutil.cpp:150 msgid "Data for this DXCC entity could not be found" msgstr "No se encontraron datos para esta entidad DXCC" #: wxutil.cpp:151 msgid "Invalid time format" msgstr "Formato de hora no válido" #: wxutil.cpp:152 msgid "" "QSO date is not within the date range specified on your Callsign Certificate" msgstr "" "La fecha del QSO no está dentro del intervalo de fechas especificado en su " "certificado" #: wxutil.cpp:153 msgid "Certificate provider not found" msgstr "Proveedor de certificado no encontrado" #: wxutil.cpp:154 msgid "No callsign certificate for key" msgstr "Ningún certificado para la clave" #: wxutil.cpp:155 msgid "Configuration file cannot be opened" msgstr "El fichero de configuración no se puede abrir" #: wxutil.cpp:156 msgid "" "The private key for this Callsign Certificate is not present on this " "computer; you can obtain it by loading a .tbk or .p12 file" msgstr "" "La clave privada para este Certificado de indicativo no está presente en este " "ordenador. Puede obtenerla cargando un fichero .tbk o .p12" #: wxutil.cpp:157 msgid "PKCS#12 file not TQSL compatible" msgstr "Fichero PKCS #12 no es compatible con TQSL" #: wxutil.cpp:158 msgid "Callsign Certificate not TQSL compatible" msgstr "Certificado no compatible con TQSL" #: wxutil.cpp:159 msgid "Date out of range" msgstr "Fecha fuera de rango" #: wxutil.cpp:160 msgid "Previously Signed QSO detected" msgstr "Se han detectado QSO firmados anteriomente" #: wxutil.cpp:161 msgid "Database error" msgstr "Error de base de datos" #: wxutil.cpp:162 msgid "The selected station location could not be found" msgstr "No se pudo encontrar la ubicación de estación seleccionada" #: wxutil.cpp:163 msgid "The selected callsign could not be found" msgstr "El indicativo seleccionado no se pudo encontrar" #: wxutil.cpp:164 msgid "The TQSL configuration file cannot be parsed" msgstr "No se pudo analizar el fichero de configuración de TQSL" #: wxutil.cpp:165 msgid "This file can not be processed due to a system error" msgstr "Este fichero no puede ser procesado debido a un error del sistema" #: wxutil.cpp:166 msgid "The format of this file is incorrect." msgstr "El formato de este fichero es incorrecto." #: wxutil.cpp:167 msgid "Callsign certificate could not be installed" msgstr "El certificado de indicativo no pudo instalarse" #: wxutil.cpp:168 msgid "Callsign Certificate does not match QSO details" msgstr "El certificado de indicativo no coincide con los detalles del QSO" #: wxutil.cpp:169 msgid "Station Location does not match QSO details" msgstr "La ubicación de estación no coincide con los detalles del QSO" #: wxutil.cpp:170 msgid "New DB" msgstr "Nueva base de datos" #: wxutil.cpp:171 msgid "Gridsquare is inconsistent with Station Location" msgstr "La cuadrícula no es consistente con la ubicación de estación" #: wxutil.cpp:172 msgid "ADIF field has invalid contents" msgstr "El campo ADIF tiene contenido no válido" #: wxutil.cpp:173 msgid "" "This Callsign Certificate cannot be installed as the first date where it is " "valid is in the future. Check if your computer is set to the proper date.\n" "\n" msgstr "" "Este certificado no puede instalarse ya que la primera fecha de validez es en " "el futuro. Compruebe si su ordenador tiene la fecha correcta.\n" #: wxutil.cpp:174 msgid "" "This Callsign Certificate cannot be installed as it has expired. Check if " "your computer is set to the proper date and that this is the latest Callsign " "Certificate.\n" "\n" msgstr "" "Este certificado no puede instalarse porque ha expirado. Compruebe que su " "ordenador tenga la fecha correcta y que este es el último certificado.\n" #: wxutil.cpp:187 msgid "NO ERROR" msgstr "NO HAY ERROR" #: wxutil.cpp:190 msgid "Unknown custom error" msgstr "Error desconocido" #: wxutil.cpp:197 msgid "" "TQSL is unable to sign QSOs because another instance of TQSL is busy.\n" "Terminate any other copies of TQSL and try again." msgstr "" "TQSL no puede firmar QSO porque otra instancia de TQSL está ocupada.\n" "Finalice las otras copias en ejecución de TQSL e inténtelo de nuevo." #: wxutil.cpp:199 msgid "Database Error: %hs" msgstr "Error en base de datos: %hs" #: wxutil.cpp:201 msgid "Uploads database error" msgstr "Error en la base de datos de subidas" #: wxutil.cpp:207 msgid "System error: %hs : %hs" msgstr "Error del sistema: %hs : %hs" #: wxutil.cpp:211 msgid "System error: %hs" msgstr "Error del sistema: %hs" #: wxutil.cpp:219 msgid "File syntax error: %hs" msgstr "Error de sintaxis de fichero: %hs" #: wxutil.cpp:223 msgid "File syntax error" msgstr "Error de sintaxis del fichero" #: wxutil.cpp:259 msgid "" "The private key for callsign %hs serial %ld is not present on this computer; " "you can obtain it by loading a .tbk or .p12 file" msgstr "" "La clave privada para el indicativo %hs con número de serie %ld no está " "presente en este ordenador. Puede obtenerla cargando un fichero .tbk o .p12" #: wxutil.cpp:266 #, c-format msgid "Invalid error code: %d" msgstr "Código de error no válido: %d" #: wxutil.cpp:280 msgid "Station Location" msgstr "Ubicación de estación" #. TRANSLATORS: This message is for QSO details. For example, 'The Station Location GRIDSQUARE has value FM18ju while QSO has FM18jt' #: wxutil.cpp:283 msgid "The %s '%hs' has value '%hs' while QSO has '%hs'" msgstr "El %s '%hs' tiene un valor '%hs' mientras que el QSO tiene '%hs'" #: wxutil.cpp:291 msgid "This log has invalid QSO information" msgstr "Este log tiene información de QSO no válida" #. TRANSLATORS: This message is for QSO details. For example, 'The log being signed has 'US County' set to Foobar which is not valid' #: wxutil.cpp:293 msgid "The log being signed has '%hs' set to value '%hs' which is not valid" msgstr "El log que se está firmando tiene '%hs' asignado a '%hs' y no es válido" #: wxutil.cpp:302 msgid "" "There is no valid callsign certificate for %hs in entity %hs available. This " "QSO cannot be signed" msgstr "" "No hay un certificado válido disponible para %hs en la entidad %hs, Este QSO " "no puede ser firmado" #: wxutil.cpp:310 msgid "ADIF content is not valid. '%hs' is not valid for %hs" msgstr "El contenido de ADIF no es válido. '%hs' no es válido para %hs" #: getpassword.h:51 msgid "New passphrase" msgstr "Nueva frase de contraseña" #: getpassword.h:52 msgid "Enter new passphrase" msgstr "Introduzca la nueva frase de contraseña" #: qsodatadialog.h:86 msgid "QSO Data" msgstr "Datos de QSO" #: tqslvalidator.h:58 msgid "Date" msgstr "Fecha" #: tqslvalidator.h:69 msgid "Time" msgstr "Hora" #~ msgid "" #~ "TQSL must wait for other running copies of TQSL to exit before signing..." #~ msgstr "" #~ "Para firmar, TQSL debe esperar que se cierren otras copias en ejecución de " #~ "TQSL..." #~ msgid "The duplicates database is locked" #~ msgstr "La base de datos duplicada está bloqueada" #~ msgid "Already Uploaded QSOs Detected" #~ msgstr "Detectado QSO ya subidos" #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and no new QSOs." #~ msgstr "" #~ "Este libro contiene %d QSO(s) que parece ya han sido firmados para subir a " #~ "LoTW, y no hay nuevos QSOs." #~ msgid "" #~ "Click 'Re-Upload QSOs' to re-process this log while allowing already " #~ "uploaded QSOs." #~ msgstr "" #~ "Clic en \"Subir de nuevo QSOs\" para procesar de nuevo este log " #~ "permitiendo QSO ya subidos anteriormente." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and %d QSOs which are new." #~ msgstr "" #~ "Este libro contiene %d QSO (s) que parecen ya han sido firmados para subir " #~ "a LoTW, y hay %d QSOs que son nuevos." #~ msgid "" #~ "Click 'New QSOs Only' to sign normally, without the already uploaded QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Haga clic en \"Sólo Nuevos QSO\" para firmar normalmente, sin los QSO ya " #~ "subidos (Recomendado)." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and one QSO which is new." #~ msgstr "" #~ "Este libro contiene %d QSO(s) que parece que ya han sido firmados para " #~ "subir a LoTW y hay un QSO que es nuevo." #~ msgid "" #~ "The only reason to re-sign already uploaded QSOs is if a previous upload " #~ "was not processed by LoTW, either because it was never uploaded, or there " #~ "was a server failure" #~ msgstr "" #~ "La única razón para firmar de nuevo QSO previamente subidos es si una " #~ "subida anterior no ha sido procesada por LoTW, bien porque nunca fue " #~ "subida o hubo un fallo del servidor" #, c-format #~ msgid "Already Uploaded: %d" #~ msgstr "Subido anteriormente: %d" #, c-format #~ msgid "Already uploaded: %d" #~ msgstr "Subido anteriormente: %d" #~ msgid "All QSOs are already uploaded; aborted" #~ msgstr "Todos los QSO ya han sido subidos. Abortado" #, c-format #~ msgid "%d of %d QSOs are already uploaded; aborted" #~ msgstr "%d de %d QSO ya han sido subidos. Abortado" #, c-format #~ msgid "%s: %d QSO records were already uploaded" #~ msgstr "%s: %d QSO ya fueron subidos anteriormente" #~ msgid "" #~ "Resubmitting these QSOs will cause them to be reported as already uploaded." #~ msgstr "" #~ "Subir de nuevo estos QSO se le informará que ya han sido subidos " #~ "anteriormente." #~ msgid "Display details of already uploaded QSOs when signing a log" #~ msgstr "Mostrar detalles de QSO subidos anteriormente al firmar un log" #~ msgid "tQSL Certificates" #~ msgstr "Certificados tQSL" #~ msgid "My current personal callsign" #~ msgstr "Mi indicativo personal actual" #~ msgid "" #~ "My new personal callsign (I have a Callsign Certificate for my former " #~ "callsign)" #~ msgstr "" #~ "Mi nuevo indicativo personal (tengo un certificado de indicativo de mi " #~ "anterior indicativo)" #~ msgid "" #~ "My former personal callsign or a portable modifier for my current or " #~ "former callsign" #~ msgstr "" #~ "Mi antiguo indicativo personal o un modificador portable para indicativo " #~ "actual o anterior" #~ msgid "A primary club callsign" #~ msgstr "Un indicativo primario de club" #~ msgid "" #~ "A secondary club callsign (I have a Callsign Certificate for the primary " #~ "club callsign)" #~ msgstr "" #~ "Un indicativo secundario de club (tengo un Certificado de Indicativo del " #~ "indicativo primario del club)" #~ msgid "A DXpedition, Portable, or holiday operation with multiple operators" #~ msgstr "Una expedición DX, Portable u operación con múltiples operadores" #~ msgid "" #~ "A DXpedition, Portable, or holiday operation where I am the only operator" #~ msgstr "" #~ "Una expedición DX, Portable u operación donde yo soy el único operador" #~ msgid "An operator that uses me as a QSL manager" #~ msgstr "Un operador que me usa como QSL mánager" #~ msgid "A special event callsign with multiple operators" #~ msgstr "Un indicativo de evento especial con múltiples operadores" #~ msgid "A special event callsign where I am the only operator" #~ msgstr "Un indicativo de evento especial donde soy el único operador" #~ msgid "Please select a Callsign Certificate to validate your request." #~ msgstr "" #~ "Por favor, seleccione un Certificado de Indicativo para firmar su " #~ "solicitud." #~ msgid "This Callsign Certificate is for:" #~ msgstr "Este Certificado de Indicativo es para:" #~ msgid "" #~ "Please select your club's primary Callsign Certificate to validate your " #~ "request." #~ msgstr "" #~ "Por favor, seleccione el Certificado de Indicativo principal de su club " #~ "para validar su solicitud." #~ msgid "" #~ "You have already requested more than three Callsign Certificates for %s in " #~ "the past 24 hours. You should submit a request only once, then wait for " #~ "that request to processed by LoTW Staff. This may take several business " #~ "days." #~ msgstr "" #~ "Ha solicitado ya más de tres Certificados de Indicativo para %s en las " #~ "pasadas 24 horas. Debe presentar una sola solicitud y esperar a que la " #~ "petición sea procesada por el equipo de LoTW. Esto puede tardar varios " #~ "días laborables." #~ msgid "" #~ "You are saying that the requested Certificate for %s belongs to the same " #~ "person as %hs and are using the selected Certificate to prove %hs's " #~ "identity." #~ msgstr "" #~ "Está diciendo que el Certificado solicitado para %s pertenece a la misma " #~ "persona que %hs y está utilizando el Certificado seleccionado para probar " #~ "la identidad de %hs." #~ msgid "" #~ "Callsign Certificate container files (*.p12;*.P12)|*.p12;*.P12|Certificate " #~ "Request response files (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgstr "" #~ "Ficheros contenedores de certificados (*.p12;*.P12)|*.p12;*.P12|Ficheros " #~ "de respuesta de una solicitud de certificado (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgid "" #~ "Callsign Certificate container files (*.p12)|*.p12|Certificate Request " #~ "response files (*.tq6)|*.tq6" #~ msgstr "" #~ "Ficheros contenedores de certificados (*.p12)|*.p12|Ficheros de respuesta " #~ "de una solicitud de certificado (*.tq6)|*.tq6" #~ msgid "Go to the first QSO in this log" #~ msgstr "Ir al primer QSO en este libro" #~ msgid "Go to the previous QSO in this log" #~ msgstr "Ir al QSO anterior en este libro" #~ msgid "Go to the next QSO in this log" #~ msgstr "Ir al siguiente QSO en este libro" #~ msgid "Go to the last QSO in this log" #~ msgstr "Ir al último QSO en este libro" #~ msgid "No QSOs written" #~ msgstr "No se han escrito QSOs" #~ msgid "Some QSOs suppressed" #~ msgstr "Se han suprimido algunos QSOs" #~ msgid "The file (%s) will be signed using:" #~ msgstr "El fichero (%s) se firmará usando:" #~ msgid "Station Location:" #~ msgstr "Ubicación de estación:" #~ msgid "DXCC:" #~ msgstr "DXCC:" #~ msgid "Is this correct?" #~ msgstr "¿Es esto correcto?" #~ msgid "TQSL - Confirm signing" #~ msgstr "TQSL - Confirmar la firma" #~ msgid "%s: %d QSO records were outside the selected date range" #~ msgstr "" #~ "%s: %d registros de QSO que estaban fuera del rango de fechas seleccionado" #~ msgid "No records to upload" #~ msgstr "No hay registros para subir" #~ msgid "Password protected P12 files cannot be imported on the command line" #~ msgstr "" #~ "Los ficheros P12 protegidos por contraseña no pueden importarse en línea " #~ "de comandos" #~ msgid "Your certificate request did not upload properly" #~ msgstr "Su solicitud de certificado no pudo subirse correctamente" #~ msgid "Please try again." #~ msgstr "Por favor, inténtelo de nuevo." #~ msgid "Certificate Request:" #~ msgstr "Solicitud de certificado:" #~ msgid "Allow 'None' for " #~ msgstr "Permitir 'Ninguno' para " #~ msgid "%s: Invalid Grid Square Field" #~ msgstr "%s: campo de cuadrícula no válido" #~ msgid "%s: Invalid Subsquare" #~ msgstr "%s: subcuadrícula no válida" #~ msgid "Already Uploaded QSO suppressed" #~ msgstr "Suprimidos los QSO ya subidos anteriormente" #~ msgid "" #~ "There is no valid callsign certificate for %hs available. This QSO cannot " #~ "be signed" #~ msgstr "" #~ "No hay disponible un certificado de indicativo válido para %hs. Este QSO " #~ "no puede firmarse" #~ msgid "Invalid, unusable" #~ msgstr "No válido, inutilizable" #~ msgid "Certificates that are awaiting ARRL approval" #~ msgstr "Certificados a la espera de la aprobación e la ARRL" #~ msgid "" #~ "If so, choose a callsign below for the primary LoTW account. If not, " #~ "choose 'No', and a new LoTW account will be set up for these QSOs." #~ msgstr "" #~ "Si es así, escoja un indicativo más abajo para la cuenta primaria de LoTW. " #~ "Sino, escoja 'No' y se creará una nueva cuenta de LoTW para estos QSO." #~ msgid "" #~ "This is a Club call, I'm the QSL manager for this call, or this is a " #~ "DXpedition call" #~ msgstr "" #~ "Es un indicativo de Club, soy el QSL mánager para este indicativo o es un " #~ "indicativo de expedición" #~ msgid "No, Create a new LoTW account for this call" #~ msgstr "No, crear una nueva cuenta de LoTW para este indicativo" #~ msgid "Yes, Save these QSOs into an existing LoTW account" #~ msgstr "Si, guardar estos QSO a una cuenta de LoTW existente" #~ msgid "Add QSOs for the new callsign to an existing LoTW account?" #~ msgstr "" #~ "¿Desea añadir QSO para este nuevo indicativo a una cuenta de LoTW " #~ "existente?" #~ msgid "Since you have no callsign certificates, you must " #~ msgstr "Como no dispone de certificados, debe" #~ msgid "" #~ "This portable callsign request requires approval using an existing " #~ "callsign certificate" #~ msgstr "" #~ "Esta solicitud de indicativo portable requiere de aprobación utilizando un " #~ "certificado de indicativo existente" #~ msgid "" #~ "The callsign %s is not currently registered in the FCC ULS database as of " #~ "%s.\n" #~ "If this is a newly registered call, you must wait at least one business " #~ "day for it to be valid. Please enter a currently valid callsign." #~ msgstr "" #~ "El indicativo %s no está registrado actualmente en la base de datos de la " #~ "FCC ULS como %s.\n" #~ "Si es un indicativo nuevo recién registrado, debe esperar al menos un día " #~ "laborable para que sea válido. Por favor, entre un indicativo válido " #~ "actual." #~ msgid "" #~ "Please select a callsign certificate for the account where you would like " #~ "the QSOs to be stored" #~ msgstr "" #~ "Por favor, seleccione un certificado de indicativo para la cuenta donde " #~ "desea guardar los QSO" #~ msgid "To submit the signed log file to LoTW:\n" #~ msgstr "Entregar el fichero de libro firmado a LoTW:\n" #~ msgid "" #~ "Since you have no callsign certificates, you must submit an 'Unsigned' " #~ "certificate request. This will allow you to create your initial callsign " #~ "certificate for LoTW use. Click 'Finish' to complete this callsign " #~ "certificate request." #~ msgstr "" #~ "Puesto que usted no tiene certificados Indicativo, usted debe presentar " #~ "una solicitud de certificado \"sin firmar\". Esto le permitirá crear su " #~ "certificado indicativo inicial para el uso LoTW. Haga clic en " #~ "\"Finalizar\" para completar esta solicitud de certificado indicativo." #~ msgid "" #~ "My former personal callsign or a portable modifier for my current callsign" #~ msgstr "" #~ "Mi antiguo indicativo personal o un modificador de portable para mi " #~ "indicativo actual" #~ msgid "" #~ "You may protect this Callsign Certificate using a password. If you are " #~ "using a computer system that is shared with others, you should specify a " #~ "password to protect this Callsign Certificate. However, if you are using a " #~ "computer in a private residence, no password need be specified." #~ msgstr "" #~ "Puede proteger este Certificado mediante una contraseña. Si está " #~ "utilizando un sistema informático que comparte con otras personas, debe " #~ "especificar una contraseña para proteger este Certificado. Sin embargo, si " #~ "el ordenador es para uso privado no es necesario especificar ninguna " #~ "contraseña." #~ msgid "" #~ "Leave the password blank and click 'Next' unless you want to use a " #~ "password." #~ msgstr "" #~ "Deje la contraseña en blanco y haga clic en 'Siguiente' a menos que desee " #~ "utilizar una contraseña." #~ msgid "Password:" #~ msgstr "Contraseña:" #~ msgid "Enter the password again for verification:" #~ msgstr "Introduzca de nuevo la contraseña para la verificación:" #~ msgid "" #~ "DO NOT lose the password you choose! You will be unable to use the " #~ "Certificate without this password!" #~ msgstr "" #~ "¡NO PIERDA la contraseña que ha escogido! Sin esta contraseña, ¡no podrá " #~ "utilizar el Certificado!" #~ msgid "" #~ "Leave the password blank and click 'Finish' unless you want to use a " #~ "password." #~ msgstr "" #~ "Deje la contraseña en blanco y haga clic en \"Finalizar\" a menos que " #~ "desee utilizar una contraseña." #~ msgid "The two copies of the password do not match." #~ msgstr "Las dos contraseñas no coinciden." #~ msgid "New password:" #~ msgstr "Nueva contraseña:" #~ msgid "Password entries do not match" #~ msgstr "Las contraseñas no coinciden" #~ msgid "Password confirmed" #~ msgstr "Contraseña confirmada" #~ msgid "Enter a password for this callsign certificate." #~ msgstr "Introduzca una contraseña para este certificado." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence no password need be specified." #~ msgstr "" #~ "Si está utilizando un ordenador compartido con otras personas, debe " #~ "especificar una contraseña para proteger este certificado. Sin embargo, si " #~ "usa su ordenador de forma privada no es necesario especificar ninguna " #~ "contraseña." #~ msgid "" #~ "This password will have to be entered each time you use this callsign " #~ "certificate for signing or when saving the key." #~ msgstr "" #~ "Esta contraseña tendrá que teclearla cada vez que utilice este certificado " #~ "tanto para firmar o cuando guarde la clave." #~ msgid "" #~ "Leave the password blank and click 'OK' unless you want to use a password." #~ msgstr "" #~ "Deje la contraseña en blanco y haga clic en \"Aceptar\" a menos que desee " #~ "utilizar una contraseña." #~ msgid "New Password" #~ msgstr "Nueva Contraseña" #~ msgid "Enter the password to unlock the .p12 file:" #~ msgstr "Introduzca la contraseña para desbloquear el fichero .p12:" #~ msgid "Password error" #~ msgstr "Error de Contraseña" #~ msgid "" #~ "Enter the password to unlock the callsign certificate for %hs -- %hs\n" #~ "(This is the password you made up when you installed the callsign " #~ "certificate.)" #~ msgstr "" #~ "Introduzca la contraseña para desbloquear el certificado de %hs - %hs \n" #~ "(Esta es la contraseña que utilizó cuando instaló el certificado.)" #~ msgid "Enter password" #~ msgstr "Introducir contraseña" #~ msgid "Password for the signing key" #~ msgstr "Contraseña para la clave de firma" #~ msgid "Enter the password for the certificate container file." #~ msgstr "Introduzca la contraseña para el fichero contenedor de certificado." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Si está utilizando un ordenador compartido con otros usuarios, debe " #~ "especificar una contraseña para proteger esta certificado. Sin embargo, si " #~ "está usando el ordenador de forma privada, no es necesario especificar " #~ "ninguna contraseña." #~ msgid "" #~ "You will have to enter the password any time you load the file into " #~ "TrustedQSL." #~ msgstr "" #~ "Tendrá que introducir la contraseña siempre que cargue el fichero en " #~ "TrustedQSL." #~ msgid "Certificate Container Password" #~ msgstr "Contraseña del contenedor de certificado" #~ msgid "Password: " #~ msgstr "Contraseña: " #~ msgid "Password protected" #~ msgstr "Protegido por contraseña" #~ msgid "Enter the password to unlock the callsign certificate" #~ msgstr "Introduzca la contraseña para desbloquear el certificado" #~ msgid "Enable passwords for Callsign Certificates" #~ msgstr "Habilitar contraseñas para los Certificados de Indicativo" #~ msgid "Password not correct" #~ msgstr "Contraseña no correcta" #~ msgid "New password" #~ msgstr "Nueva contraseña" #~ msgid "Enter new password" #~ msgstr "Introduzca la nueva contraseña" #~ msgid "Duplicate QSOs Detected" #~ msgstr "Detectados QSOs duplicados" #~ msgid "" #~ "Click 'Allow Duplicates' to re-process this log while allowing duplicate " #~ "QSOs." #~ msgstr "" #~ "Haga clic en 'Permitir duplicados' para volver a procesar este libro " #~ "permitiendo los QSOs duplicados." #~ msgid "" #~ "Click 'Exclude duplicates' to sign normally, without the duplicate QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Haga clic en 'Excluir duplicados' para firmar normalmente, sin los QSOs " #~ "duplicados (recomendado)." #~ msgid "" #~ "Click 'Allow duplicates' to re-process this log while allowing duplicate " #~ "QSOs." #~ msgstr "" #~ "Haga clic en \"Permitir duplicados 'para volver a procesar este libro " #~ "mientras permite los QSOs duplicados." #~ msgid "" #~ "The log file you are uploading using your QSO Logging system consists " #~ "entirely of previously uploaded QSOs (duplicates) that create unnecessary " #~ "work for LoTW. There may be a more recent version of your QSO Logging " #~ "system that would prevent this. Please check with your QSO Logging " #~ "system's vendor for an updated version." #~ msgstr "" #~ "El fichero de libro que está cargando utilizando su programa de registro " #~ "de QSO, contiene enteramente QSOs previamente subidos (duplicados) que " #~ "crearán un trabajo innecesario para LoTW. Puede haber una versión más " #~ "reciente de su programa de registro que evite esto. Por favor, compruebe " #~ "si hay una versión más actualizada de su programa de registro de QSO." #~ msgid "" #~ "In the meantime, please note that some loggers may exhibit strange " #~ "behavior if an option other than 'Allow duplicates' is clicked. Choosing " #~ "'Cancel' is usually safe, but a defective logger not checking the status " #~ "messages reported by TrustedQSL may produce strange (but harmless) " #~ "behavior such as attempting to upload an empty file or marking all chosen " #~ "QSOs as 'sent'" #~ msgstr "" #~ "Mientras tanto, tenga en cuenta que algunos programas de registro pueden " #~ "comportarse de forma extraña si hace clic en una opción distinta a " #~ "'Permitir duplicados'. Escogiendo 'Cancelar' suele ser seguro, pero un " #~ "programa de registro defectuoso que no compruebe los mensajes de estado " #~ "informados por TrustedQSL puede producir comportamientos extraños (aunque " #~ "no sean peligrosos para sus datos) como el intentar subir un fichero vacío " #~ "o marcar todos los QSOs como 'enviados'" #~ msgid "" #~ "The log file you are uploading using your QSO Logging system includes some " #~ "previously uploaded QSOs (duplicates) that create unnecessary work for " #~ "LoTW. There may be a more recent version of your QSO Logging system that " #~ "would prevent this. Please check with your QSO Logging system's vendor for " #~ "an updated version." #~ msgstr "" #~ "El fichero de libro que está cargando utilizando su programa de registro " #~ "de QSO incluye algunos QSOs previamente subidos (duplicados) que crean un " #~ "trabajo innecesario en LoTW. Quizá exista una versión más reciente de su " #~ "programa de registro de QSO que evite esto. Por favor, compruebe si existe " #~ "una versión actualizada de su programa de registro de QSO." #~ msgid "" #~ "In the meantime, please note that some loggers may exhibit strange " #~ "behavior if an option other than 'Allow duplicates' is clicked. 'Exclude " #~ "duplicates' is recommended, but a logger that does its own duplicate " #~ "tracking may incorrectly set the status in this case. A logger that " #~ "doesn't track duplicates should be unaffected by choosing 'Exclude " #~ "duplicates' and if it tracks 'QSO sent' status, will correctly mark all " #~ "selected QSOs as sent - they are in your account even though they would " #~ "not be in this specific batch" #~ msgstr "" #~ "Mientras tanto, tenga en cuenta que algunos programas de registro pueden " #~ "comportarse de forma extraña si hace clic en una opción distinta a " #~ "'Permitir duplicados'. Se recomienda 'Excluir duplicados', pero un " #~ "programa de registro que haga su propio control de duplicados puede " #~ "asignar un estado incorrecto en este caso. Un programa de registro de QSO " #~ "que no lleve un control de duplicados no debe afectarle que escoja la " #~ "opción 'Excluir duplicados'. Si sigue el estado de 'QSO enviado' marcará " #~ "correctamente todos los QSO seleccionados como enviados (están en su " #~ "cuenta aunque no estarán en este lote específico)." #~ msgid "Exclude duplicates" #~ msgstr "Excluir duplicados" #~ msgid "Allow duplicates" #~ msgstr "Permitir duplicados" #~ msgid "" #~ "The only reason to re-sign duplicate QSOs is if a previous upload was not " #~ "processed by LoTW, either because it was never uploaded, or there was a " #~ "server failure" #~ msgstr "" #~ "La única razón para volver a firmar QSOs duplicados es si una carga " #~ "anterior no fue procesada por el LoTW, ya sea porque no fue nunca subida, " #~ "o hubo un fallo en el servidor" #~ msgid "Duplicates: %d" #~ msgstr "Duplicados: %d" #~ msgid "All QSOs are duplicates; aborted" #~ msgstr "Todos los QSOs son duplicados; abortado" #~ msgid "%d of %d QSOs are duplicates; aborted" #~ msgstr "%d de %d QSOs son duplicados; abortado" #~ msgid "%s: %d QSO records were duplicates" #~ msgstr "%s: %d registros de QSO que eran duplicados" #~ msgid "Resubmitting these QSOs will cause them to be reported as duplicates." #~ msgstr "Reenviar estos QSOs hará que sean reportados como duplicados." #~ msgid "TQSL must not be run 'As Administrator'. Quitting." #~ msgstr "TQSL no debe ejecutarse como administrador. El programa finalizará." #~ msgid "Display details of duplicate QSOs when signing a log" #~ msgstr "Mostrar detalles de QSOs duplicados al firmar un libro" #~ msgid "Duplicate QSO suppressed" #~ msgstr "QSO duplicado suprimido" #~ msgid "A special event (1x1) callsign" #~ msgstr "Un indicativo de evento especial (1x1)" #~ msgid "Callsign Certificate or Certificate Request not found" #~ msgstr "Certificado o solicitud de certificado no encontrado" #~ msgid "" #~ "Callsign Certificate or Certificate Request not found for callsign %hs " #~ "serial %ld" #~ msgstr "" #~ "Certificado o solicitud de certificado no encontrado para el indicativo " #~ "%hs serie %ld" #~ msgid "QSO begin date:" #~ msgstr "QSO fecha comienza:" #~ msgid "QSO end date:" #~ msgstr "QSO fecha de finalización:" #~ msgid "" #~ "If the requested certificate is for your personal callsign, then you " #~ "should select 'Signed' and choose a callsign certificate for another of " #~ "your personal callsigns from the list below to be used to sign this " #~ "request." #~ msgstr "" #~ "Si el certificado solicitado es para su indicativo de llamada personal, " #~ "entonces usted debe seleccionar 'firmado' y elegir un certificado " #~ "indicativo para otro de sus indicativos personales de la siguiente lista " #~ "para ser utilizada para firmar esta solicitud." #~ msgid "" #~ "If you don't have a Callsign Certificate for another personal callsign, or " #~ "if the requested Callsign Certificate is for a club station or for use by " #~ "a QSL manager on behalf of another operator, select 'Unsigned'." #~ msgstr "" #~ "Si usted no tiene un Certificado Indicativo para otro indicativo personal, " #~ "o si el certificado solicitado es indicativo de una estación del club o " #~ "para el uso de un gestor de QSL en nombre de otro operador, seleccione " #~ "'Sin signo'." #~ msgid "Unsigned" #~ msgstr "Sin firmar" #~ msgid "Signed" #~ msgstr "Firmado" #~ msgid "Sign Request" #~ msgstr "Solicitud sesión" #~ msgid "This request MUST be signed since DXCC Entity is set to NONE" #~ msgstr "" #~ "Esta solicitud debe ser firmada desde DXCC Entidad se establece en NONE" #~ msgid "" #~ "You have one or more callsign certificates that could be used to sign this " #~ "certificate request." #~ msgstr "" #~ "Tiene uno o más certificados de indicativos que podrían ser utilizados " #~ "para firmar esta solicitud de certificado." #~ msgid "" #~ "It is strongly recommended that you sign the request unless the callsign " #~ "certificates shown are not actually yours." #~ msgstr "" #~ "Se recomienda encarecidamente que se suscribe la solicitud a menos que los " #~ "certificados del indicativo que se muestran no son realmente los suyos." #~ msgid "Do you want to sign the certificate request?" #~ msgstr "¿Quieres firmar la solicitud de certificado?" #~ msgid "" #~ "Select \"Yes\" to sign the request, \"No\" to continue without signing." #~ msgstr "" #~ "Seleccione \"Sí\" para firmar la petición, \"No\" para continuar sin firma." #~ msgid "Can't write new configuration file %s: %hs" #~ msgstr "No se puede escribir nuevo fichero de configuración %s: %hs" #~ msgid "Checking for TQSL updates...\n" #~ msgstr "Comprobación de actualizaciones TQSL ...\n" #~ msgid "A new TrustedQSL configuration file (V%s) is available!" #~ msgstr "Un nuevo fichero de configuración TrustedQSL (V%s) está disponible!" tqsl-2.8.1/apps/lang/es/wxstd-3.2.mo0000644000175000017500000045153515003421124017011 0ustar rmurphyrmurphy== z?1?3s Ƥ Ӥ  =]y ȥ ۥ  &,1^ox    Φ٦ ߦ  !)27FNV_ev} ҧڧ  $*3;BRZ `n  Ũ٨  $/5; BOTZox} ǩ˩ԩ   ) 9 FP d nzêʪҪ ت (5;JR[dm  ëǫܫ"84V$$"լ!% , :FU\^actvz~ ʭխ ׭ +>F W d p }#/׮/315e6ү) ?`xðذ "?UmDZ۱   $/7U4k.ϲ޲  1A U`6p5³"" >:K ϴ ״ 1Kb~ ׵ *D!c"-¶10"(S| Ƿ !(< KViov   ƸѸ)C]x0 Fǹ),Vu%#"*+(V&%ƻ%6I"f?ɼ919 k$! (((Q-z%3ξ -;i %ֿ9)W )#9']" %C JW _j| B)'-!U)w+,"6Y&u#)$&6Uh | 3"5$S#x + ( 3%O$u &!&#+"O#r*!# .@IO/V N*R(e)  ("*CKPC_$ 26'i!!(7O.o'#C#.Rn(99Vg|  ",:1g0%%07!I#k    *;&Y-  ~Yi ""2 Q<2"  -8=CJ-Q)  1Rr &AXu L Z`$ +%Hn  )J0,{$ 23F$z/1*.Hw -" 0C"t9$0'"C&f"$8'GG!+/A 1O.2)"L2d/7/8%h##3; =F"(%$ 7TX*(((D$m$'"*8c!5$= ]+~.-$C"a#"+ '6 ^-'":5R'&-S%/y4&,22)e-&& +)U(t-!;0))Z323 -=k$;)*2T! **=["y(   &+HYa gr x/ J!7Y w 4 'Eek} #!3#U2y8 %3J[`i|* '#,@E Z e s2  ,1/@p" '6Vn QwZ?1$q72)+C$_j%&+L%x/35T[nt- *"((B#k66#M8q1%A![}!!!1 Jk& /-H eo th~%6Pe%2:@6E |0    #!)Eo | ? I S _ j u          & 2 < I U`r {             0 8  ?  J  V a &z           ' !0 "R Cu   ' +  8 = B J N ` x       * & 1 O a  $  %%6\w')& '.(Nw7!@ FP Ycv:06go v8(/B_v#)9Rg$%$ /$Lq$$$7$Ty$$   &1 7B0S&  #"C1f9    )3 <J P^ t ( &4=EVf w 3  )H2 { %"(,16G!O3q2'3Z0# "+DN     $-C.r  ! )4/Jz$ O!  2 >  R _ h <     !!%>! d!n!)!!#!!?!4"D"K"["t""""""'"%#;#*X########### #-$1<$+n$%$)$$ $$%#%*%2% 7%6E%|%% % %%%%%% &&&6&Q&l&&#&&&&' '' '#',6'0c'''''' (&(;(Q(ze((() )03)d)o)g*-~***'** +&$+K+[+/l++++++,,,,F,Y,t,,,,,N,#7-[-n-. .;.M.d.|..... .!/'/'7/_/*r////// 000L0l00M1\a1171a2j2OC3@3Y3#.4R4e4Bv444445 555)5 :5F5AK555555%5L6a666636*6 7@7#Z7$~7#7!7 7# 8 .83O88*8$8 8& 9!49V9t9"99 9 999,98:Q:0k:$:::$:';.;$F;'k;;;;";;#<,<J<i< <<!<<=$=#B=$f=#===!= >"&>I>f>>> >>>?,?4?+K?w??'?&??@-@@@R@m@@@+@@ @A A8A;ANA hA rA"~A AfAB&B,BHB bBBBBBBB,C CCC(CD(D .D9D JDVD ]D iDtDD"D.D-D&EAEYE&rEEEEEE"F9F!RFtF"FF,FF1G$HG%mGGG/G<G HH H#H+H 4H AH;MHH:ITI0pI=I;I>J;ZJ5JJcKyK96L,pLL.gM-M!M MMNN N&NN#N/!O0QOO-OOO*P(-P#VP'zP'P"PP Q %Q FQ!gQ$QQQ)QQQR RR%R",R ORZRaR/jRRR#RR/S:5S pS zS SSSS SS5S" T90T:jT/TTT T TTTU!U'U+FU"rU(UUU#U V0VAVHVYVkV}VVVVVVV WW2WFWXWiW|WWWWWWWWXX3XIXaXxXXXXXXX Y"Y7YPYeY~YYYYYY ZZ1ZCZUZkZ~ZZZZZZZ[[5[J[a[w[[[[[[\\0\F\\\s\\\\\\\\]&]9]N]g]]]]]]]]^^9^S^n^^^^^ ^^^ _$_ <_]_y__ ___` ` `` $`2`(;`d`k`p`w`"{` ```` `&`)a*a>a EaPa Yaeama aa-aaaabb0b@b$Rbwb {bbbbbb c(c@cZcyc cccc d*d!Idkddddde"e@e\eteeeeCef f ff$f"-fPfcfhf pf zf f f$fff fffg 5g Cg dgog wg"gg gg|h3h*hh h iii=jj/j(k:kKkckgkzkk k kkkkkkkk k! l-lKlill lll ll l lll m7mOmcm lm wmmmmmm mm mm nn2n ;n EnPnVnjn rn|nnnnnnn nn nn)n o'o ;o HoRoYoao so}o o ooooooopp p (p4p=pDpVp^pzppp ppp pp p pp qqq-q2q 9q DqQqeq{qqq qq qqqqqqrr /r =rGr Zr grtr{r rr rr rr rr rs"s +s5s=sYspsyss s s ssssss s s sttt5tOtWt^tftot&tt%t?t,u&.u&Uu(|uuu uu uu uuuuu vvvvvv"v&v*v.v2v6vGvXvivzvv#vvv$vw w&w>wSwfwzww wwww"w2wx/x@x:Bx+}xExxy'y>yOy"fyyyyyyzz:zQzqzzzzzzz{ { !{.{ 7{ D{ R{_{g{ w{#{ {@{9 |D|X|a|z|| |||||}}5)}_}y}?~}#},} ~O~ l~x~ ~~~ ~~ ~ ~~:Ri" +!C.e.'À:>&7e*ȁρՁ , BOUZ`hnu~ӂۂ " 2 ?J^goσH 8EV\/4.'G$o,76406e>@ۆ(8E;~G.41Sf#,ވG KS<:܉).A3p):׊>:Q2W,4D@y$֌)*%=P',.:+M1y(1Ԏ.L5@AÏ/=5 s#ʐ ' 0;SlQ/4&+[-2;0$0U2%3ߓ,+@+l-.Ɣ'8GH^ĕ̕*$1:4l%&ǖ&1G2g5)З-,(-U26)9)Q,{ ֙99 @JK)I/ :CA     3 '.B@)˜%%C72{6!,64#k (Bٞ:-WU7۟';8YL!ߠ*M,z!ڡ /6H`"sF=ݢ;:W3ƣݣ+-/ ]hĤӤ #5*K-v/ ԥ  ! Ǧ%Ӧ(":@Pe;(S | èɨШ٨*ߨ! , 2<+O{é#ݩ 8Ys" Ī!&*.'Y$*.ѫR2#"-Ҭ:-O}9׭#*N'W"Q:*8c'|-8үJ &V3}6"8 >D(, ٱ!.,K:x-D(&6O(.ɳ #D=)L̴(4BHwOJ7[ -8$@8X"/J#/?S'))2>BA&ù#,(;0d'y74V4:5-12_6ɼ#2/;%k/?2'45\7-ʾA@:?{)($335g0:4 <>={%-> >L'LG=H,72S5r9.-B?6E*9**dB,4I4;~J6B<::(7"V$y.1*R*>}<3-3 ;G3O5?#;Y8v) # D [em}A Y(+$[ 'f"/$:U $"&/I>yH  -B^z$%*, Wbv|<.+A mw  3 .)L*v '$* JVV~,U-lFA8#,\&2' i(-/(4N]mH!  'G4|/"5.U%%!EE8(~T:Z#z!!!3U!p % '#KRY1h wr &5\y O P?^(' %=08n'y          $ 0 < I S_ h t           #- 6@ H S ^l $$006>*M x  , P.&%  .Lf @-F+ rHC?c;;:VIl@,J`"f7 &)>@6   (>1p"!8 E%kt?}"7*Q!|*&*9Vm$&%=%\%% %+Q%p%%  (3DWjs+) %$>c$*<!,N_ hr  "(.K2_2+ > JTk    ';U dgo    &/5#L+p %<==?>_%'S:   27FM 0NVl }+,- :AYL`  'N&u&"$%% K&V7}3J^w~ %$@<`6&;%7 ] c {         ' (( 5Q <         ( 90 j q  y          "(  K l ! " 5   9  O \ e  n y ) ( #  "5 J k)e47}kz 19U+n''>)F4a !&#>b'K>%1q( 6Mg" %2Qn 1!3UTTm2goxN\w$E_h'|!   O$t%-[$x#"B?0 &p  ( 2 !%2!$X!7}!(!G! &".G"3v","&","#+#%O#u# ## ###,#F$K$:h$!$$$($*%:%(S%*|%%%%*%!&-0&"^&$&%&+&&.'#F'%j'+','+',(B(`()((,(!(#)*9)!d)-)")$)) *"*.=*.l**5*'*)+<+[+r++1+*+ ,=&,d,u,$,,,,,, - -5->---- ."!. D.N.!d....1x////(/00%060 O0Z0 b0 n0y00 0.0*0(1D1]1%v111112%2D2"]2%2,2!212&'39N3*3133353H(4q4y444444D45;55)5;6E[6I6I6J577878:9&=9d96H:2:0::3:&;.;6;"G;.j;8;!;A;P6<3<<<L<.E=Jt=,=!=;>?J>9>9><>2;?$n?-?1?,?0 @<Q@@@@@@@AA-A 3$/=K1 )p[#3YyiS}d7kaP|qb 1+G$$svWsR#@S6e Tdo@EbxK[q)^r98+X* zN`84IO>w.#{f*>y f:k*,^_.1ryBN>cBppsAh\/PdBDgd2jDx<$tL:QbU !~tQ,5)}h]ZW)zE!2$"B/MuCn0J>@])Q CHM@ Kt-Ago?x/5)2 v41K"G^ we 7&b!q8G+WO t/RlnE'?%kh-,6^ FzB'Nh7>+w  ^\K'_UtNgkRP_iv[rx)N} =?0##sT*qB=I nHEFDnm pMJdcoH4a}~`2{C oj8c6Opk.0J1M[iYIM Xt%`cV>?,OR(`S/g|P<b]DL-' -TQgmme[eLU:vM99RL\_kLw6.ge"+8zC9oT(molHA; ;`UmO(XWOsAw=AHaI+#l| ~R}SB%p]^53 ]hY;3j\Hx?RoGeA!Gn45Ff%Q*::$\>  7em Fi(u; ) GqX'g8:,96Z\v4P.L&[c"6m&1jr7;Urys6 F3G3]hw-RZ|_L"&CiU?X{\""2NU QIct~,!xnV1'=nY&.<U.IfqrgdcY VTK~<wZy<<ybD&5[d2AH#SD~ Xeh%j@ != {i Hcw S~50C^u6,]1uM<tj+Mq5]bJv#OXia'4lG F5!9Z@;  (8V*_Y|9lzWm! Q_f%l"zSWurVF {3 @}lxTVfrK}7`-~ \f lX(&([jD*EJZ0QNu77kzIKB Please send this report to the program maintainer, thank you! Thank you and we're sorry for the inconvenience! (copy %d of %d) (error %ld: %s) (in module "%s") - Preview bold extra bold extra heavy extra light heavy italic light medium semi bold strikethrough thin#10 Envelope, 4 1/8 x 9 1/2 in#11 Envelope, 4 1/2 x 10 3/8 in#12 Envelope, 4 3/4 x 11 in#14 Envelope, 5 x 11 1/2 in#9 Envelope, 3 7/8 x 8 7/8 in%%d of %lu%i of %u%ld byte%ld bytes%lu of %lu%s (%d items)%s (or %s)%s Error%s Information%s Preferences%s Warning%s did not fit the tar header for entry '%s'%s files (%s)|%s%u of %u&About&Actual Size&After a paragraph:&Alignment&Apply&Apply Style&Arrange Icons&Ascending&Back&Based on:&Before a paragraph:&Bg colour:&Blur distance:&Bold&Bottom&Bottom:&Box&Bullet style:&CD-ROM&Cancel&Cascade&Cell&Character code:&Clear&Close&Color&Colour:&Convert&Copy&Copy URL&Customize...&Debug report preview:&Delete&Delete Style...&Descending&Details&Down&Edit&Edit Style...&Execute&File&Find...&Finish&First&Floating mode:&Floppy&Font&Font family:&Font for Level...&Font:&Forward&From:&Harddisk&Height:&Help&Hide details&Home&Horizontal offset:&Indentation (tenths of a mm)&Indeterminate&Index&Info&Italic&Jump to&Justified&Last&Left&Left:&List level:&Log&Move&Move the object to:&Network&New&Next&Next >&Next Paragraph&Next Tip&Next style:&No&Notes:&Number:&OK&Open...&Outline level:&Page Break&Paste&Picture&Point size:&Position (tenths of a mm):&Position mode:&Preferences&Previous&Previous Paragraph&Print...&Properties&Quit&Redo&Redo &Rename Style...&Replace&Restart numbering&Restore&Right&Right:&Save&See details&Show tips at startup&Size&Size:&Skip&Spacing (tenths of a mm)&Spell Check&Stop&Strikethrough&Style:&Styles:&Subset:&Symbol:&Synchronize values&Table&Top&Top:&Underline&Underlining:&Undo&Undo &Unindent&Up&Vertical alignment:&Vertical offset:&View...&Weight:&Width:&Window&Yes'%s' contains invalid character(s)'%s' has extra '..', ignored.'%s' is not a correct numeric value for option '%s'.'%s' is not a valid message catalog.'%s' is not one of the valid strings'%s' is one of the invalid strings'%s' is probably a binary buffer.(*)(Help)(None)(Normal text)(bookmarks)(error %d: %s)(none)**)+, 64-bit edition-...1.11.21.31.41.51.61.71.81.910 x 11 in10 x 14 in11 x 17 in12 x 11 in15 x 11 in26 3/4 Envelope, 3 5/8 x 6 1/2 in9 x 11 in: file does not exist!: unknown charset: unknown encoding< &BackBold italic face.
bold italic underlined
Bold face. Italic face. >A debug report has been generated in the directory A debug report has been generated. It can be found inA non empty collection must consist of 'element' nodesA standard bullet name.A0 sheet, 841 x 1189 mmA1 sheet, 594 x 841 mmA2 420 x 594 mmA3 Extra 322 x 445 mmA3 Extra Transverse 322 x 445 mmA3 Rotated 420 x 297 mmA3 Transverse 297 x 420 mmA3 sheet, 297 x 420 mmA4 Extra 9.27 x 12.69 inA4 Plus 210 x 330 mmA4 Rotated 297 x 210 mmA4 Transverse 210 x 297 mmA4 sheet, 210 x 297 mmA4 small sheet, 210 x 297 mmA5 Extra 174 x 235 mmA5 Rotated 210 x 148 mmA5 Transverse 148 x 210 mmA5 sheet, 148 x 210 mmA6 105 x 148 mmA6 Rotated 148 x 105 mmABCDEFGabcdefg12345ASCIIAboutAbout %sAbsoluteActiveBorderActiveCaptionActual SizeAddAdd ColumnAdd RowAdd current page to bookmarksAdd to custom coloursAddToPropertyCollection called on a generic accessorAddToPropertyCollection called w/o valid adderAdding book %sAdvancedAfter a paragraph:Align LeftAlign RightAlignmentAllAll files (%s)|%sAll files (*)|*All files (*.*)|*.*All stylesAlphabetic ModeAlready Registered Object passed to SetObjectClassInfoAlready dialling ISP.Alt+An optional corner radius for adding rounded corners.And includes the following files: Animation file is not of type %ld.AppWorkspaceAppend log to file '%s' (choosing [No] will overwrite it)?ApplicationApplyAquaArabicArabic (ISO-8859-6)Argument %u not found.ArtistsAscendingAttributesAvailable fonts.B4 (ISO) 250 x 353 mmB4 (JIS) Rotated 364 x 257 mmB4 Envelope, 250 x 353 mmB4 sheet, 250 x 354 mmB5 (ISO) Extra 201 x 276 mmB5 (JIS) Rotated 257 x 182 mmB5 (JIS) Transverse 182 x 257 mmB5 Envelope, 176 x 250 mmB5 sheet, 182 x 257 millimeterB6 (JIS) 128 x 182 mmB6 (JIS) Rotated 182 x 128 mmB6 Envelope, 176 x 125 mmBMP: Couldn't allocate memory.BMP: Couldn't save invalid image.BMP: Couldn't write RGB color map.BMP: Couldn't write data.BMP: Couldn't write the file (Bitmap) header.BMP: Couldn't write the file (BitmapInfo) header.BMP: header has biClrUsed=%d when biBitCount=%d.BMP: wxImage doesn't have own wxPalette.BackBackgroundBackground &colour:Background colourBaltic (ISO-8859-13)Baltic (old) (ISO-8859-4)Before a paragraph:BitmapBlackBlueBlue:BoldBorderBordersBottomBottom margin (mm):Box PropertiesBox stylesBring All to FrontBrownBrowseBullet &Alignment:Bullet styleBulletsButtonFaceButtonHighlightButtonShadowButtonTextC sheet, 17 x 22 inC&learC&olour:C3 Envelope, 324 x 458 mmC4 Envelope, 229 x 324 mmC5 Envelope, 162 x 229 mmC6 Envelope, 114 x 162 mmC65 Envelope, 114 x 229 mmCD-ROMCHM handler currently supports only local files!Ca&pitalsCan't &Undo Can't automatically determine the image format for non-seekable input.Can't close registry key '%s'Can't copy values of unsupported type %d.Can't create registry key '%s'Can't create threadCan't delete key '%s'Can't delete the INI file '%s'Can't delete value '%s' from key '%s'Can't enumerate subkeys of key '%s'Can't enumerate values of key '%s'Can't export value of unsupported type %d.Can't find current position in file '%s'Can't get info about registry key '%s'Can't get the JavaScript objectCan't initialize zlib deflate stream.Can't initialize zlib inflate stream.Can't monitor non-existent directory "%s" for changes.Can't open registry key '%s'Can't read from inflate stream: %sCan't read inflate stream: unexpected EOF in underlying stream.Can't read value of '%s'Can't read value of key '%s'Can't run JavaScript script without a valid HTML documentCan't save image to file '%s': unknown extension.Can't save log contents to file.Can't set thread priorityCan't set value of '%s'Can't write to child process's stdinCan't write to deflate stream: %sCancelCannot enumerate files '%s'Cannot enumerate files in directory '%s'Cannot find active dialup connection: %sCannot find the location of address book fileCannot get an active instance of "%s"Cannot get priority range for scheduling policy %d.Cannot get the hostnameCannot get the official hostnameCannot hang up - no active dialup connection.Cannot initialize OLECannot initialize socketsCannot load icon from '%s'.Cannot load resources from '%s'.Cannot load resources from file '%s'.Cannot open HTML document: %sCannot open HTML help book: %sCannot open contents file: %sCannot open file for PostScript printing!Cannot open index file: %sCannot open resources file '%s'.Cannot print empty page.Cannot read typename from '%s'!Cannot resume thread %lxCannot retrieve thread scheduling policy.Cannot set locale to language "%s".Cannot start thread: error writing TLS.Cannot suspend thread %lxCannot wait for thread terminationCaptionTextCase sensitiveCategorized ModeCell PropertiesCeltic (ISO-8859-14)Cen&tredCenteredCentral European (ISO-8859-2)CentreCentre text.CentredCh&oose...Change List StyleChange Object StyleChange PropertiesChange StyleChanges won't be saved to avoid overwriting the existing file "%s"Changing current directory to "%s" failedCharacter stylesCheck to add a period after the bullet.Check to add a right parenthesis.Check to edit all borders simultaneously.Check to enclose the bullet in parentheses.Check to indicate right-to-left text layout.Check to make the font bold.Check to make the font italic.Check to make the font underlined.Check to restart numbering.Check to show a line through the text.Check to show the text in capitals.Check to show the text in small capitals.Check to show the text in subscript.Check to show the text in superscript.Check to suppress hyphenation.Choose ISP to dialChoose a directory:Choose a fileChoose colourChoose fontCircular dependency involving module "%s" detected.Cl&oseClass not registered.ClearClear the log contentsClick to apply the selected style.Click to browse for a symbol.Click to cancel changes to the font.Click to cancel the font selection.Click to change the font colour.Click to change the text background colour.Click to change the text colour.Click to choose the font for this level.Click to close this window.Click to confirm changes to the font.Click to confirm the font selection.Click to create a new box style.Click to create a new character style.Click to create a new list style.Click to create a new paragraph style.Click to create a new tab position.Click to delete all tab positions.Click to delete the selected style.Click to delete the selected tab position.Click to edit the selected style.Click to rename the selected style.CloseClose AllClose current documentClose this windowCollapseColorColourColour selection dialog failed with error %0lx.Colour:Column %uCommand line argument %d couldn't be converted to Unicode and will be ignored.Common dialog failed with error code %0lx.Compositing not supported by this system, please enable it in your Window Manager.Compressed HTML Help file (*.chm)|*.chm|ComputerConfig entry name cannot start with '%c'.ConfirmConnecting...ContentsControlDarkControlLightConversion to charset '%s' doesn't work.ConvertCopied to clipboard:"%s"Copies:CopyCopy selectionCopying more than one selected block to clipboard is not supported.CornerCorner &radius:Could not create temporary file '%s'Could not extract %s into %s: %sCould not find tab for idCould not locate file '%s'.Could not register custom DirectWrite font loader.Could not set current working directoryCould not start document preview.Could not start printing.Could not transfer data to windowCouldn't add an image to the image list.Couldn't create OpenGL contextCouldn't create a timerCouldn't enumerate translationsCouldn't find symbol '%s' in a dynamic libraryCouldn't get the current thread pointerCouldn't initialize GIF hash table.Couldn't load a PNG image - file is corrupted or not enough memory.Couldn't load sound data from '%s'.Couldn't obtain folder nameCouldn't open audio: %sCouldn't register clipboard format '%s'.Couldn't retrieve information about list control item %d.Couldn't save PNG image.Couldn't terminate threadCreate Parameter %s not found in declared RTTI ParametersCreate directoryCreate new directoryCreate new documentCreating %s "%s" failed.Cu&tCurrent directory:CustomCustom sizeCustomize ColumnsCutCut selectionCyrillic (ISO-8859-5)D sheet, 22 x 34 inDDE poke request failedDIB Header: Encoding doesn't match bitdepth.DIB Header: Image height > 32767 pixels for file.DIB Header: Image width > 32767 pixels for file.DIB Header: Unknown bitdepth in file.DIB Header: Unknown encoding in file.DL Envelope, 110 x 220 mmDashedDebug report "%s"Debug report couldn't be created.Debug report generation has failed.DecorativeDefault encodingDefault fontDefault printerDeleteDelete A&llDelete ColumnDelete RowDelete StyleDelete TextDelete itemDelete selectionDelete style %s?Deleted stale lock file '%s'.Deleting password for "%s" failed: %s.Dependency "%s" of module "%s" doesn't exist.DescendingDesktopDeveloped by DevelopersDial up functions are unavailable because the remote access service (RAS) is not installed on this machine. Please install it.Did you know...DirectFB error %d occurred.DirectoriesDirectory '%s' couldn't be createdDirectory '%s' couldn't be deletedDirectory does not existDirectory doesn't exist.Discard changes and reload the last saved version?Display all index items that contain given substring. Search is case insensitive.Display options dialogDisplays help as you browse the books on the left.Do you want to save changes to %s?Document:Documentation by Documentation writersDon't SaveDoneDone.DottedDoubleDouble Japanese Postcard Rotated 148 x 200 mmDoubly used id : %dDownDragE sheet, 34 x 44 inEOF while reading from inotify descriptorEditEdit itemElapsed time:Enable the height value.Enable the maximum width value.Enable the minimum height value.Enable the minimum width value.Enable the width value.Enable vertical alignment.Enables a background colour.Enables a shadow.Enables the blur distance.Enables the shadow colour.Enables the shadow opacity.Enables the shadow spread.Enter a box style nameEnter a character style nameEnter a list style nameEnter a new style nameEnter a paragraph style nameEnter command to open file "%s":Entries foundEnvelope Invite 220 x 220 mmEnvironment variables expansion failed: missing '%c' at position %u in '%s'.ErrorError closing epoll descriptorError closing kqueue instanceError copying the file '%s' to '%s'.Error creating directoryError in reading image DIB.Error in resource: %sError reading config options.Error running JavaScript: %sError saving user configuration data.Error while printing: Error: Error: %s (%d)Esperanto (ISO-8859-3)Estimated time:Executable files (*.exe)|*.exe|ExecuteExecution of command '%s' failedExecutive, 7 1/4 x 10 1/2 inExpandExporting registry key: file "%s" already exists and won't be overwritten.Extended Unix Codepage for Japanese (EUC-JP)Extraction of '%s' into '%s' failed.Face NameFailed to access lock file.Failed to add custom font "%s".Failed to add descriptor %d to epoll descriptor %dFailed to allocate %luKb of memory for bitmap data.Failed to allocate colour for OpenGLFailed to allocate memory for LZMA compression.Failed to allocate memory for LZMA decompression.Failed to change video modeFailed to check format of image file "%s".Failed to clean up debug report directory "%s"Failed to close file handleFailed to close lock file '%s'Failed to close the clipboard.Failed to close the display "%s"Failed to connect: missing username/password.Failed to connect: no ISP to dial.Failed to copy dialog contents to the clipboard.Failed to copy registry value '%s'Failed to copy the contents of registry key '%s' to '%s'.Failed to copy the file '%s' to '%s'Failed to copy the registry subkey '%s' to '%s'.Failed to create DDE stringFailed to create MDI parent frame.Failed to create a temporary file nameFailed to create an anonymous pipeFailed to create an instance of "%s"Failed to create connection to server '%s' on topic '%s'Failed to create cursor.Failed to create directory "%s"Failed to create directory '%s' (Do you have the required permissions?)Failed to create epoll descriptorFailed to create font configuration object.Failed to create registry entry for '%s' files.Failed to create the standard find/replace dialog (error code %d)Failed to create wake up pipe used by event loop.Failed to display HTML document in %s encodingFailed to empty the clipboard.Failed to enumerate video modesFailed to establish an advise loop with DDE serverFailed to establish dialup connection: %sFailed to execute '%s' Failed to execute curl, please install it in PATH.Failed to find CLSID of "%s"Failed to find match for regular expression: %sFailed to find web view emulation level in the registryFailed to get ISP names: %sFailed to get OLE automation interface for "%s"Failed to get data from the clipboardFailed to get the local system timeFailed to get the working directoryFailed to initialize GUI: no built-in themes found.Failed to initialize LZMA compression: unexpected error %u.Failed to initialize LZMA decompression: unexpected error %u.Failed to initialize MS HTML Help.Failed to initialize OpenGLFailed to initiate dialup connection: %sFailed to insert text in the control.Failed to inspect the lock file '%s'Failed to install signal handlerFailed to join a thread, potential memory leak detected - please restart the programFailed to kill process %dFailed to load bitmap "%s" from resources.Failed to load icon "%s" from resources.Failed to load icons from resource '%s'.Failed to load image %%d from file '%s'.Failed to load image %d from stream.Failed to load image from file "%s".Failed to load metafile from file "%s".Failed to load mpr.dll.Failed to load resource "%s".Failed to load shared library '%s'Failed to load sound from "%s" (error %d).Failed to lock resource "%s".Failed to lock the lock file '%s'Failed to modify descriptor %d in epoll descriptor %dFailed to modify file times for '%s'Failed to monitor I/O channelsFailed to open '%s' for readingFailed to open '%s' for writingFailed to open CHM archive '%s'.Failed to open URL "%s" in default browser.Failed to open URL "%s" in the default browserFailed to open directory "%s" for monitoring.Failed to open display "%s".Failed to open temporary file.Failed to open the clipboard.Failed to parse Plural-Forms: '%s'Failed to prepare playing "%s".Failed to put data on the clipboardFailed to read PID from lock file.Failed to read config options.Failed to read document from the file "%s".Failed to read event from DirectFB pipeFailed to read from wake-up pipeFailed to read text file "%s".Failed to redirect child process input/outputFailed to redirect the child process IOFailed to register DDE server '%s'Failed to register font configuration using private fonts.Failed to remember the encoding for the charset '%s'.Failed to remove debug report file "%s"Failed to remove lock file '%s'Failed to remove stale lock file '%s'.Failed to rename registry value '%s' to '%s'.Failed to rename the file '%s' to '%s' because the destination file already exists.Failed to rename the registry key '%s' to '%s'.Failed to reset web view to standard emulation levelFailed to retrieve file times for '%s'Failed to retrieve text of RAS error messageFailed to retrieve the supported clipboard formatsFailed to save document to the file "%s".Failed to save the bitmap image to file "%s".Failed to send DDE advise notificationFailed to set FTP transfer mode to %s.Failed to set clipboard data.Failed to set permissions on lock file '%s'Failed to set process priorityFailed to set temporary file permissionsFailed to set thread concurrency level to %luFailed to set thread priority %d.Failed to set up non-blocking pipe, the program might hang.Failed to set web view to modern emulation levelFailed to store image '%s' to memory VFS!Failed to switch DirectFB pipe to non-blocking modeFailed to switch wake up pipe to non-blocking modeFailed to terminate a thread.Failed to terminate the advise loop with DDE serverFailed to terminate the dialup connection: %sFailed to touch the file '%s'Failed to unload shared libraryFailed to unlock lock file '%s'Failed to unregister DDE server '%s'Failed to unregister descriptor %d from epoll descriptor %dFailed to update user configuration file.Failed to upload the debug report (error code %d).Failed to write to lock file '%s'FalseFamilyFatal ErrorFileFile "%s" could not be opened for reading.File "%s" could not be opened for writing.File '%s' already exists, do you really want to overwrite it?File '%s' couldn't be removedFile '%s' couldn't be renamed '%s'File couldn't be loaded.File dialog failed with error code %0lx.File errorFile name exists already.File type:FilesFiles (%s)FilterFindFind and replace in documentFind in documentFind...FirstFirst pageFixedFixed font:Fixed size face.
bold italic FloatingFloppyFolio, 8 1/2 x 13 inFontFont &weight:Font file "%s" cannot be used as it is not inside the font directory "%s".Font file "%s" couldn't be loadedFont file "%s" doesn't exist.Font size:Font st&yle:Font:Fonts index file %s disappeared while loading fonts.Fork failedForwardForward hrefs are not supportedFound %i matchesFrom:FuchsiaGIF: data stream seems to be truncated.GIF: error in GIF image format.GIF: not enough memory.GTK+ installed on this machine is too old to support screen compositing, please install GTK+ 2.12 or later.GTK+ themeGeneralGeneric PostScriptGerman Legal Fanfold, 8 1/2 x 13 inGerman Std Fanfold, 8 1/2 x 12 inGetProperty called w/o valid getterGetPropertyCollection called on a generic accessorGetPropertyCollection called w/o valid collection getterGo backGo forwardGo one level up in document hierarchyGo to home directoryGo to parent directoryGraphics art by GrayGrayTextGreek (ISO-8859-7)GreenGreen:GrooveGzip not supported by this version of zlibHTML Help Project (*.hhp)|*.hhp|HTML anchor %s does not exist.HTML files (*.html;*.htm)|*.html;*.htm|HarddiskHebrew (ISO-8859-8)HelpHelp Browser OptionsHelp IndexHelp PrintingHelp TopicsHelp books (*.htb)|*.htb|Help books (*.zip)|*.zip|Help directory "%s" not found.Help file "%s" not found.Help: %sHide this notification message.HighlightHighlightTextHomeHome directoryHow the object will float relative to the text.ICO: Error in reading mask DIB.ICO: Error writing the image file!ICO: Image too tall for an icon.ICO: Image too wide for an icon.ICO: Invalid icon index.IFF: data stream seems to be truncated.IFF: error in IFF image format.IFF: not enough memory.IFF: unknown error!!!ISO-2022-JPIf possible, try changing the layout parameters to make the printout more narrow.If you have any additional information pertaining to this bug report, please enter it here and it will be joined to it:If you wish to suppress this debug report completely, please choose the "Cancel" button, but be warned that it may hinder improving the program, so if at all possible please do continue with the report generation. Ignoring malformed extra data record, ZIP file may be corruptedIgnoring value "%s" of the key "%s".Illegal Object Class (Non-wxEvtHandler) as Event SourceIllegal Parameter Count for ConstructObject MethodIllegal Parameter Count for Create MethodIllegal directory name.Illegal file specification.Image and mask have different sizes.Image file is not of type %d.Image is not of type %s.Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dllImpossible to get child process inputImpossible to get permissions for file '%s'Impossible to overwrite the file '%s'Impossible to set permissions for the file '%s'InactiveBorderInactiveCaptionInactiveCaptionTextIncorrect GIF frame size (%u, %d) for the frame #%uIncorrect number of arguments.IndentIndents && SpacingIndexIndian (ISO-8859-12)InfoInitialization failed in post init, aborting.InsertInsert FieldInsert ImageInsert ObjectInsert TextInserts a page break before the paragraph.InsetInvalid TIFF image index.Invalid display mode specification '%s'.Invalid geometry specification '%s'Invalid inotify event for "%s"Invalid lock file '%s'.Invalid message catalog.Invalid or Null Object ID passed to GetObjectClassInfoInvalid or Null Object ID passed to HasObjectClassInfoInvalid regular expression '%s': %sInvalid value %ld for a boolean key "%s" in config file.ItalicItaly Envelope, 110 x 230 mmJPEG: Couldn't load - file is probably corrupted.JPEG: Couldn't save image.Japanese Double Postcard 200 x 148 mmJapanese Envelope Chou #3Japanese Envelope Chou #3 RotatedJapanese Envelope Chou #4Japanese Envelope Chou #4 RotatedJapanese Envelope Kaku #2Japanese Envelope Kaku #2 RotatedJapanese Envelope Kaku #3Japanese Envelope Kaku #3 RotatedJapanese Envelope You #4Japanese Envelope You #4 RotatedJapanese Postcard 100 x 148 mmJapanese Postcard Rotated 148 x 100 mmJump toJustifiedJustify text left and right.KOI8-RKOI8-UL&ine spacing:LZMA compression error when flushing output: %sLZMA compression error: %sLZMA decompression error: %sLandscapeLastLast pageLast repeated message ("%s", %u time) wasn't outputLast repeated message ("%s", %u times) wasn't outputLedger, 17 x 11 inLeftLeft (&first line):Left margin (mm):Left-align text.Legal Extra 9 1/2 x 15 inLegal, 8 1/2 x 14 inLetter Extra 9 1/2 x 12 inLetter Extra Transverse 9.275 x 12 inLetter Plus 8 1/2 x 12.69 inLetter Rotated 11 x 8 1/2 inLetter Small, 8 1/2 x 11 inLetter Transverse 8 1/2 x 11 inLetter, 8 1/2 x 11 inLicenseLightLimeLine %lu of map file "%s" has invalid syntax, skipped.Line spacing:Link contained '//', converted to absolute link.List StyleList stylesLists font sizes in points.Lists the available fonts.Load %s fileLoading : Lock file '%s' has incorrect owner.Lock file '%s' has incorrect permissions.Log saved to the file '%s'.Lower case lettersLower case roman numeralsMDI childMS HTML Help functions are unavailable because the MS HTML Help library is not installed on this machine. Please install it.Ma&ximizeMacArabicMacArmenianMacBengaliMacBurmeseMacCelticMacCentralEurRomanMacChineseSimpMacChineseTradMacCroatianMacCyrillicMacDevanagariMacDingbatsMacEthiopicMacExtArabicMacGaelicMacGeorgianMacGreekMacGujaratiMacGurmukhiMacHebrewMacIcelandicMacJapaneseMacKannadaMacKeyboardGlyphsMacKhmerMacKoreanMacLaotianMacMalayalamMacMongolianMacOriyaMacRomanMacRomanianMacSinhaleseMacSymbolMacTamilMacTeluguMacThaiMacTibetanMacTurkishMacVietnameseMake a selection:MarginsMaroonMatch caseMax height:Max width:Media playback error: %sMemory VFS already contains file '%s'!MenuMessageMetal themeMethod or property not found.Mi&nimizeMin height:Min width:MinimizeMissing a required parameter.ModernModifiedModule "%s" initialization failedMonarch Envelope, 3 7/8 x 7 1/2 inMonitoring individual files for changes is not supported currently.Move downMove upMoves the object to the next paragraph.Moves the object to the previous paragraph.Multiple Cell PropertiesNameNavyNetworkNewNew &Box Style...New &Character Style...New &List Style...New &Paragraph Style...New StyleNew itemNewNameNext pageNoNo animation handler for type %ld defined.No bitmap handler for type %d defined.No default application configured for HTML files.No entries found.No font for displaying text in encoding '%s' found, but an alternative encoding '%s' is available. Do you want to use this encoding (otherwise you will have to choose another one)?No font for displaying text in encoding '%s' found. Would you like to select a font to be used for this encoding (otherwise the text in this encoding will not be shown correctly)?No handler found for animation type.No handler found for image type.No image handler for type %d defined.No image handler for type %s defined.No matching page found yetNo soundNo unused colour in image being masked.No valid mappings found in the file "%s".NoneNordic (ISO-8859-10)NormalNormal face
and underlined. Normal font:Not %sNot available for this platformNot enough free disk space for download.Not underlinedNote, 8 1/2 x 11 inNoticeNumbered outlineOKOLE Automation error in %s: %sObject PropertiesObject implementation does not support named arguments.Objects must have an id attributeOliveOpaci&ty:Opacity:Open FileOpen HTML documentOpen an existing documentOpen file "%s"Open...OpenGL 3.0 or later is not supported by the OpenGL driver.Operation not permitted.Option '%s' can't be negatedOption '%s' requires a value.Option '%s': '%s' cannot be converted to a date.OptionsOrangeOrientationOut of window IDs. Recommend shutting down application.OutlineOutsetOverflow while coercing argument values.PCX: couldn't allocate memoryPCX: image format unsupportedPCX: invalid imagePCX: this is not a PCX file.PCX: unknown error !!!PCX: version number too lowPNM: Couldn't allocate memory.PNM: File format is not recognized.PNM: File seems truncated.PRC 16K 146 x 215 mmPRC 16K RotatedPRC 32K 97 x 151 mmPRC 32K RotatedPRC 32K(Big) 97 x 151 mmPRC 32K(Big) RotatedPRC Envelope #1 102 x 165 mmPRC Envelope #1 Rotated 165 x 102 mmPRC Envelope #10 324 x 458 mmPRC Envelope #10 Rotated 458 x 324 mmPRC Envelope #2 102 x 176 mmPRC Envelope #2 Rotated 176 x 102 mmPRC Envelope #3 125 x 176 mmPRC Envelope #3 Rotated 176 x 125 mmPRC Envelope #4 110 x 208 mmPRC Envelope #4 Rotated 208 x 110 mmPRC Envelope #5 110 x 220 mmPRC Envelope #5 Rotated 220 x 110 mmPRC Envelope #6 120 x 230 mmPRC Envelope #6 Rotated 230 x 120 mmPRC Envelope #7 160 x 230 mmPRC Envelope #7 Rotated 230 x 160 mmPRC Envelope #8 120 x 309 mmPRC Envelope #8 Rotated 309 x 120 mmPRC Envelope #9 229 x 324 mmPRC Envelope #9 Rotated 324 x 229 mmPaddingPage %dPage %d of %dPage SetupPage setupPagesPaper sizeParagraph stylesPassing a already registered object to SetObjectPassing an unknown object to GetObjectPassword:PastePaste selectionPeri&odPermissionsPicture PropertiesPipe creation failedPlease choose a valid font.Please choose an existing file.Please choose the page to display:Please choose which ISP do you want to connect toPlease select the columns to show and define their order:Please wait while printing...Point SizePortraitPositionPostScript filePreferencesPreparingPreview:Previous pagePrintPrint PreviewPrint Preview FailurePrint RangePrint SetupPrint in colourPrint operation could not be initializedPrint previe&w...Print preview creation failed.Print preview...Print spoolingPrint this pagePrint to FilePrint...PrinterPrinter command:Printer optionsPrinter options:Printer...Printer:PrintingPrinting Printing ErrorPrinting is not supported by the system web controlPrinting page %dPrinting page %d of %dPrinting page %d...Printing...PrintoutProcessing debug report has failed, leaving the files in "%s" directory.Progress:PropertiesPropertyProperty ErrorPurpleQuarto, 215 x 275 mmQuestionQuitQuit this programRead error on file '%s'Reading password for "%s" failed: %s.ReadyRedRed:RedoRedo last actionRefreshRegistry key '%s' already exists.Registry key '%s' does not exist, cannot rename it.Registry key '%s' is needed for normal system operation, deleting it will leave your system in unusable state: operation aborted.Registry value "%s" is not binary (but of type %s)Registry value "%s" is not numeric (but of type %s)Registry value "%s" is not text (but of type %s)Registry value '%s' already exists.RegularRelativeRelevant entries:Remaining time:RemoveRemove BulletRemove current page from bookmarksRenderer "%s" has incompatible version %d.%d and couldn't be loaded.Renumber ListRep&lace...ReplaceReplace &allReplace with:Replace...Required information entry is empty.Resource '%s' is not a valid message catalog.Retrieving JavaScript script output is not supported with WebKit v1Revert to SavedRidgeRig&ht-to-leftRightRight margin (mm):Right-align text.RomanRow %iRunScriptAsync not supportedS&tandard bullet name:SaveSave %s fileSave &As...Save AsSave As...Save current documentSave current document with a different filenameSave log contents to fileSaving password for "%s" failed: %s.ScriptScrollbarSearchSearch contents of help book(s) for all occurrences of the text you typed aboveSearch directionSearch for:Search in all booksSearching...SectionsSeek error on file '%s'Seek error on file '%s' (large files not supported by stdio)Select &AllSelect AllSelect a document templateSelect a document viewSelect regular or bold.Select regular or italic style.Select underlining or no underlining.SelectionSelects the list level to edit.Separator expected after the option '%s'.Set Cell StyleSetProperty called w/o valid setterSetup...Several active dialup connections found, choosing one randomly.Sh&adow spread:ShadowShadow c&olour:Show &hidden directoriesShow &hidden filesShow about dialogShow allShow all items in indexShow/hide navigation panelShows a Unicode subset.Shows a preview of the bullet settings.Shows a preview of the font settings.Shows a preview of the font.Shows a preview of the paragraph settings.Shows the font preview.SilverSimple monochrome themeSingleSizeSize:SkipSlantSmall C&apitalsSolidSorry, could not open this file.Sorry, not enough memory to create a preview.Sorry, that name is taken. Please choose another.Sorry, the format for this file is unknown.Sound data are in unsupported format.Sound file '%s' is in unsupported format.SpacingSpell CheckStandardStatement, 5 1/2 x 8 1/2 inStaticStatus:StopStrikethroughString To Colour : Incorrect colour specification : %sStyleStyle:Subscrip&tSupe&rscriptSuperA/SuperA/A4 227 x 356 mmSuperB/SuperB/A3 305 x 487 mmSuppress hyphe&nationSwissSymbolSymbol &font:SymbolsTIFF: Couldn't allocate memory.TIFF: Error loading image.TIFF: Error reading image.TIFF: Error saving image.TIFF: Error writing image.TIFF: Image size is abnormally big.Table PropertiesTabloid Extra 11.69 x 18 inTabloid, 11 x 17 inTabsTealTeletypeTemplatesThai (ISO-8859-11)The FTP server doesn't support passive mode.The FTP server doesn't support the PORT command.The available bullet styles.The available styles.The background colour.The border line style.The bottom margin size.The bottom padding size.The bottom position.The bullet character.The character code.The charset '%s' is unknown. You may select another charset to replace it with or choose [Cancel] if it cannot be replacedThe clipboard format '%d' doesn't exist.The default style for the next paragraph.The directory '%s' does not exist Create it now?The document "%s" doesn't fit on the page horizontally and will be truncated if printed. Would you like to proceed with printing it nevertheless?The file '%s' doesn't exist and couldn't be opened. It has been removed from the most recently used files list.The first line indent.The following debug report will be generated The font colour.The font family.The font from which to take the symbol.The font point size.The font size in points.The font size units, points or pixels.The font style.The font weight.The format of file '%s' couldn't be determined.The horizontal offset.The left indent.The left margin size.The left padding size.The left position.The line spacing.The list item number.The locale ID is unknown.The object height.The object maximum height.The object maximum width.The object minimum height.The object minimum width.The object width.The outline level.The previous message repeated %u time.The previous message repeated %u times.The previous message repeated once.The range to show.The report contains the files listed below. If any of these files contain private information, please uncheck them and they will be removed from the report. The required parameter '%s' was not specified.The right indent.The right margin size.The right padding size.The right position.The shadow blur distance.The shadow colour.The shadow opacity.The shadow spread.The spacing after the paragraph.The spacing before the paragraph.The style name.The style on which this style is based.The style preview.The system cannot find the file specified.The tab position.The tab positions.The text couldn't be saved.The top margin size.The top padding size.The top position.The value for the option '%s' must be specified.The value of the corner radius.The version of remote access service (RAS) installed on this machine is too old, please upgrade (the following required function is missing: %s).The vertical offset.There was a problem during page setup: you may need to set a default printer.This document doesn't fit on the page horizontally and will be truncated when it is printed.This is not a %s.This platform does not support background transparency.This program was compiled with a too old version of GTK+, please rebuild with GTK+ 2.12 or newer.This program wasn't compiled with EGL support required under Wayland, either install EGL libraries and rebuild or run it under X11 backend by setting environment variable GDK_BACKEND=x11 before starting your program.Thread module initialization failed: cannot store value in thread local storageThread module initialization failed: failed to create thread keyThread module initialization failed: impossible to allocate index in thread local storageThread priority setting is ignored.Tile &HorizontallyTile &VerticallyTimeout while waiting for FTP server to connect, try passive mode.Tip of the DayTips not available, sorry!To:Too many EndStyle calls!TooltipTooltipTextTopTop margin (mm):Translations by TranslatorsTrueTrying to remove file '%s' from memory VFS, but it is not loaded!Turkish (ISO-8859-9)TypeType a font name.Type a size in points.Type mismatch in argument %u.Type must have enum - long conversionType operation "%s" failed: Property labeled "%s" is of type "%s", NOT "%s".US Std Fanfold, 14 7/8 x 11 inUS-ASCIIUnable to add inotify watchUnable to add kqueue watchUnable to associate handle with I/O completion portUnable to close I/O completion port handleUnable to close inotify instanceUnable to close path '%s'Unable to close the handle for '%s'Unable to create I/O completion portUnable to create IOCP worker threadUnable to create inotify instanceUnable to create kqueue instanceUnable to dequeue completion packetUnable to get events from kqueueUnable to initialize GTK+, is DISPLAY set properly?Unable to open path '%s'Unable to open requested HTML document: %sUnable to play sound asynchronously.Unable to post completion statusUnable to read from inotify descriptorUnable to remove inotify watch %iUnable to remove kqueue watchUnable to set up watch for '%s'Unable to start IOCP worker threadUndeleteUnderlineUnderlinedUndoUndo last actionUnexpected characters following option '%s'.Unexpected event for "%s": no matching watch descriptor.Unexpected parameter '%s'Unexpectedly new I/O completion port was createdUngraceful worker thread terminationUnicodeUnicode 16 bit (UTF-16)Unicode 16 bit Big Endian (UTF-16BE)Unicode 16 bit Little Endian (UTF-16LE)Unicode 32 bit (UTF-32)Unicode 32 bit Big Endian (UTF-32BE)Unicode 32 bit Little Endian (UTF-32LE)Unicode 7 bit (UTF-7)Unicode 8 bit (UTF-8)UnindentUnits for the bottom border width.Units for the bottom margin.Units for the bottom outline width.Units for the bottom padding.Units for the bottom position.Units for the corner radius.Units for the left border width.Units for the left margin.Units for the left outline width.Units for the left padding.Units for the left position.Units for the maximum object height.Units for the maximum object width.Units for the minimum object height.Units for the minimum object width.Units for the object height.Units for the object width.Units for the right border width.Units for the right margin.Units for the right outline width.Units for the right padding.Units for the right position.Units for the top border width.Units for the top margin.Units for the top outline width.Units for the top padding.Units for the top position.Units for this value.UnknownUnknown DDE error %08xUnknown Object passed to GetObjectClassInfoUnknown PNG resolution unit %dUnknown Property %sUnknown TIFF resolution unit %d ignoredUnknown base %d. Base 10 will be used.Unknown dynamic library errorUnknown encoding (%d)Unknown error %08xUnknown exceptionUnknown image data format.Unknown long option '%s'Unknown name or named argument.Unknown option '%s'Unmatched '{' in an entry for mime type %s.Unnamed commandUnspecifiedUnsupported clipboard format.Unsupported theme '%s'.UpUpper case lettersUpper case roman numeralsUsage: %sUse &shadowUse the current alignment setting.Username:Using private fonts is not supported on this system: Pango library is too old, 1.38 or later required.Validation conflictValueValue must be %s or higher.Value must be %s or less.Value must be between %s and %s.Version Vertical alignment.View files as a detailed viewView files as a list viewViewsWARNING: using XIM input method is unsupported and may result in problems with input handling and flickering. Consider unsetting GTK_IM_MODULE or setting to "ibus".Waiting for IO on epoll descriptor %d failedWarning: WeightWestern European (ISO-8859-1)Western European with Euro (ISO-8859-15)Whether the font is underlined.WhiteWhole wordWhole words onlyWin32 themeWindowWindowFrameWindowTextWindows Arabic (CP 1256)Windows Baltic (CP 1257)Windows Central European (CP 1250)Windows Chinese Simplified (CP 936) or GB-2312Windows Chinese Traditional (CP 950) or Big-5Windows Cyrillic (CP 1251)Windows Greek (CP 1253)Windows Hebrew (CP 1255)Windows Japanese (CP 932) or Shift-JISWindows Johab (CP 1361)Windows Korean (CP 949)Windows Thai (CP 874)Windows Turkish (CP 1254)Windows Vietnamese (CP 1258)Windows Western European (CP 1252)Windows/DOS OEM (CP 437)Windows/DOS OEM Cyrillic (CP 866)Write error on file '%s'XML parsing error: '%s' at line %dXPM: Malformed pixel data!XPM: incorrect colour description in line %dXPM: incorrect header format!XPM: malformed colour definition '%s' at line %d!XPM: no colors left to use for mask!XPM: truncated image data at line %d!YellowYesYou cannot add a new directory to this section.You have entered invalid value. Press ESC to cancel editing.ZoomZoom &InZoom &OutZoom InZoom OutZoom to &FitZoom to Fita DDEML application has created a prolonged race condition.a DDEML function was called without first calling the DdeInitialize function, or an invalid instance identifier was passed to a DDEML function.a client's attempt to establish a conversation has failed.a memory allocation failed.a parameter failed to be validated by the DDEML.a request for a synchronous advise transaction has timed out.a request for a synchronous data transaction has timed out.a request for a synchronous execute transaction has timed out.a request for a synchronous poke transaction has timed out.a request to end an advise transaction has timed out.a server-side transaction was attempted on a conversation that was terminated by the client, or the server terminated before completing a transaction.a transaction failed.an application initialized as APPCLASS_MONITOR has attempted to perform a DDE transaction, or an application initialized as APPCMD_CLIENTONLY has attempted to perform server transactions.an internal call to the PostMessage function has failed. an internal error has occurred in the DDEML.an invalid transaction identifier was passed to a DDEML function. Once the application has returned from an XTYP_XACT_COMPLETE callback, the transaction identifier for that callback is no longer valid.assuming this is a multi-part zip concatenatedattempt to change immutable key '%s' ignored.bad arguments to library functionbad signaturebad zipfile offset to entrybinaryboldbuild %lucan't close file '%s'can't close file descriptor %dcan't commit changes to file '%s'can't create file '%s'can't delete user configuration file '%s'can't determine if the end of file is reached on descriptor %dcan't find central directory in zipcan't find length of file on file descriptor %dcan't find user's HOME, using current directory.can't flush file descriptor %dcan't get seek position on file descriptor %dcan't load any font, abortingcan't open file '%s'can't open global configuration file '%s'.can't open user configuration file '%s'.can't open user configuration file.can't re-initialize zlib deflate streamcan't re-initialize zlib inflate streamcan't read from file descriptor %dcan't remove file '%s'can't remove temporary file '%s'can't seek on file descriptor %dcan't write buffer '%s' to disk.can't write to file descriptor %dcan't write user configuration file.checkedchecksum errorchecksum failure reading tar header blockcmcompression errordatedecompression errordefaultdoubledump of the process state (binary)eighteentheightheleventhentry '%s' appears more than once in group '%s'error in data formaterror opening fileerror reading zip central directoryerror reading zip local headererror writing zip entry '%s': bad crc or lengtherror writing zip entry '%s': file too large without ZIP64extraboldextraheavyextralightfailed to evaluatefailed to flush the file '%s'falsefifteenthfifthfile '%s', line %zu: '%s' ignored after group header.file '%s', line %zu: '=' expected.file '%s', line %zu: key '%s' was first found at line %d.file '%s', line %zu: value for immutable key '%s' ignored.file '%s': unexpected character %c at line %zu.filesfirstfont sizefourteenthfourthgenerate verbose log messagesheavyimageincomplete header block in tarincorrect event handler string, missing dotincorrect size given for tar entryinput compressed using unknown XZ optioninput is corruptedinput is not in XZ formatinvalid data in extended tar headerinvalid message box return valueinvalid zip fileitalickeyboard keyAddkeyboard keyAlt+keyboard keyBackkeyboard keyBackspacekeyboard keyCancelkeyboard keyCapitalkeyboard keyClearkeyboard keyCommandkeyboard keyCtrl+keyboard keyDecimalkeyboard keyDelkeyboard keyDeletekeyboard keyDividekeyboard keyDownkeyboard keyEndkeyboard keyEnterkeyboard keyEsckeyboard keyEscapekeyboard keyExecutekeyboard keyFkeyboard keyHelpkeyboard keyHomekeyboard keyInskeyboard keyInsertkeyboard keyKP_keyboard keyKP_Addkeyboard keyKP_Beginkeyboard keyKP_Decimalkeyboard keyKP_Deletekeyboard keyKP_Dividekeyboard keyKP_Downkeyboard keyKP_Endkeyboard keyKP_Enterkeyboard keyKP_Equalkeyboard keyKP_Fkeyboard keyKP_Homekeyboard keyKP_Insertkeyboard keyKP_Leftkeyboard keyKP_Multiplykeyboard keyKP_Nextkeyboard keyKP_PageDownkeyboard keyKP_PageUpkeyboard keyKP_Priorkeyboard keyKP_Rightkeyboard keyKP_Separatorkeyboard keyKP_Spacekeyboard keyKP_Subtractkeyboard keyKP_Tabkeyboard keyKP_Upkeyboard keyLeftkeyboard keyMenukeyboard keyMultiplykeyboard keyNum *keyboard keyNum +keyboard keyNum ,keyboard keyNum -keyboard keyNum .keyboard keyNum /keyboard keyNum =keyboard keyNum Beginkeyboard keyNum Deletekeyboard keyNum Downkeyboard keyNum Endkeyboard keyNum Enterkeyboard keyNum Homekeyboard keyNum Insertkeyboard keyNum Lockkeyboard keyNum Page Downkeyboard keyNum Page Upkeyboard keyNum Rightkeyboard keyNum Spacekeyboard keyNum Tabkeyboard keyNum Upkeyboard keyNum leftkeyboard keyNum_lockkeyboard keyPage Downkeyboard keyPage Upkeyboard keyPageDownkeyboard keyPageUpkeyboard keyPausekeyboard keyPgDnkeyboard keyPgUpkeyboard keyPrintkeyboard keyRawCtrl+keyboard keyReturnkeyboard keyRightkeyboard keySPECIALkeyboard keyScroll Lockkeyboard keyScroll_lockkeyboard keySelectkeyboard keySeparatorkeyboard keyShift+keyboard keySnapshotkeyboard keySpacekeyboard keySubtractkeyboard keyTabkeyboard keyUpkeyboard keyWindows_Leftkeyboard keyWindows_Menukeyboard keyWindows_Rightkeyboard keyaltkeyboard keyctrlkeyboard keynum keyboard keyrawctrlkeyboard keyshiftlibcurl could not be initializedlightmacOS menu itemAbout %smacOS menu itemAbout...macOS menu itemHide %smacOS menu itemHide ApplicationmacOS menu itemHide OthersmacOS menu itemPreferences...macOS menu itemQuit %smacOS menu itemQuit ApplicationmacOS menu itemServicesmacOS menu itemShow Allmediummidnightnineteenthninthno DDE error.no errorno fonts found in %s, using builtin fontnonamenoonnormalnumobjects cannot have XML Text Nodesout of memoryprocess context descriptionptpxread errorreading zip stream (entry %s): bad crcreading zip stream (entry %s): bad lengthreentrancy problem.secondseek errorsemiboldseventeenthseventhshow this help messagesixteenthsixthspecify display mode to use (e.g. 640x480-16)specify the theme to usestandard Windows menu&Helpstandard/circlestandard/circle-outlinestandard/diamondstandard/squarestandard/trianglestored file length not in Zip headerstrstrikethroughsystem cursor nameArrowsystem cursor nameBlanksystem cursor nameBullseyesystem cursor nameCharactersystem cursor nameCrosssystem cursor nameDefaultsystem cursor nameHandsystem cursor nameI-Beamsystem cursor nameLeft Buttonsystem cursor nameMagnifiersystem cursor nameMiddle Buttonsystem cursor nameNo Entrysystem cursor namePaint Brushsystem cursor namePencilsystem cursor namePoint Leftsystem cursor namePoint Rightsystem cursor nameQuestion Arrowsystem cursor nameRight Arrowsystem cursor nameRight Buttonsystem cursor nameSizingsystem cursor nameSizing N-Ssystem cursor nameSizing NE-SWsystem cursor nameSizing NW-SEsystem cursor nameSizing W-Esystem cursor nameSpraycansystem cursor nameWaitsystem cursor nameWait Arrowsystem cursor nameWatchtar entry not opentenththe response to the transaction caused the DDE_FBUSY bit to be set.thinthirdthirteenthtodaytomorrowtrailing backslash ignored in '%s'translator-creditstruetwelfthtwentiethuncheckedunderlinedundeterminedunexpected " at position %d in '%s'.unexpected end of fileunknownunknown (%lu)unknown class %sunknown compression errorunknown decompression errorunknown errorunknown error (error code %08x).unknown-%dunnamedunnamed%dunsupported Zip compression methodusing catalog '%s' from '%s'.write errorwxGLCanvas is only supported on Wayland and X11 currently. You may be able to work around this by setting environment variable GDK_BACKEND=x11 before starting your program.wxGetTimeOfDay failed.wxWidgets could not open display for '%s': exiting.wxWidgets could not open display. Exiting.xxxxyesterdayzlib error %d~Project-Id-Version: wxWidgets 3.1 Report-Msgid-Bugs-To: PO-Revision-Date: 2022-06-29 09:27+0200 Last-Translator: Miguel Giménez Language-Team: wxWidgets translators Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: utf-8 X-Generator: Poedit 3.0.1 Envíe este informe al responsable del programa. ¡Gracias! Gracias. Sentimos las molestias. (copia %d de %d) (error %ld: %s) (en el módulo «%s») - Previsualización negrita negrita extra extrapesada extraligera pesada cursiva ligera media negrita media tachado finaSobre n.º 10, 4 1/8 × 9 1/2 inSobre n.º 11, 4 1/2 × 10 3/8 inSobre n.º 12, 4 3/4 × 11 inSobre n.º 14, 5 × 11 1/2 inSobre n.º 9, 3 7/8 × 8 7/8 in%%d de %lu%i de %u%ld byte%ld bytes%lu de %lu%s (%d elementos)%s (o %s)Error de %sInformación de %sPreferencias de %sAlerta de %s%s no se ajustó a la cabecera tar para la entrada '%s'archivos %s (%s)|%s%u de %u&Acerca deTamaño re&al&Después de un párrafo:&Alinear&Aplicar&Aplicar estilo&Organizar iconos&Ascendente&Atrás&Basado en:&Antes de un párrafo:Color &fondo:Distancia de &difuminado:&Negrita&Inferior&Inferior:&CajaEstilo de &viñeta:&CD-ROM&Cancelar&Cascada&Celda&Código de carácter:&Limpiar&Cerrar&Color&Color:&Convertir&Copiar&Copiar URL&Personalizar…&Vista previa del informe de depuración:&Eliminar&Eliminar estilo…&Descendente&DetallesA&bajo&Editar&Editar estilo…&Ejecutar&Archivo&Buscar...&Finalizar&PrimeroModo &flotante:&Disco flexible&Tipo de letra&Familia tipográfica:&Tipo de letra del nivel…&Tipo de letra:Adelante&Desde:&Disco duro&Altura:Ay&uda&Ocultar detalles&InicioDesplazamiento &horizontal:&Sangría (décimas de mm)&IndeterminadoÍnd&ice&InformaciónCurs&iva&Ir a&Justificado&Último&Izquierda&Izquierda:Nivel de &lista:&Registro&Mover&Mover el objeto a:&Red&Nuevo&Siguiente&Siguiente >Párrafo &siguiente&Siguiente SugerenciaEstilo &siguiente:&No&Notas:&Número:&AceptarA&brir…Nivel del c&ontorno:Salto de &página&Pegar&ImagenTamaño de &punto:&Posición (décimas de mm):&Modo de colocar:&Preferencias&AnteriorPárrafo &anterior&Imprimir…&Propiedades&Salir&Rehacer&Rehacer &Cambiar nombre de estilo…&Sustituir&Recomenzar numeración&Restaurar&Derecha&Derecha:&Guardar&Ver detalles&Mostrar sugerencias al inicio&Tamaño&Tamaño:&Saltar&Espaciado (décimas de mm)&Comprobar ortografía&Detener&TachadoE&stilo:E&stilos:&Subconjunto:&Símbolo:&Sincronizar valores&Tabla&Arriba&Arriba:Subrayar&Subrayado:&Deshacer&Deshacer &Quitar sangría&ArribaAlineación &vertical:Desplazamiento &vertical:&Ver…&Peso:&Ancho:&Ventana&Sí'%s' contiene caracteres no permitidos'%s' tiene '..' adicional, se ignora.'%s' no es un valor numérico correcto para el parámetro '%s'.'%s' no es un catálogo de mensajes válido.'%s' no es una de las cadenas válidas'%s' es una de las cadenas no válidas'%s' es probablemente un buffer binario.(*)(Ayuda)(Ninguno)(Texto normal)(favoritos)(error %d: %s)(ninguno)**)+, edición de 64 bits-…1.11.21.31.41.51.61.71.81.910 x 11 pulgadas10 x 14 pulgadas11 x 17 pulgadas12 x 11 pulgadas15 x 11 pulgadas2Sobre 6 3/4, 3 5/8 x 6 1/2 pulgadas9 x 11 pulgadas: ¡el archivo no existe!: conjunto de caracteres desconocido: codificación desconocida< &AtrásNegrita cursiva.
negrita cursiva subrayada
Negrita. Cursiva. >Se ha generado un informe de depuración en el directorio Se ha generado un informe de depuración enUna colección no vacía debe consistir en nodos del tipo «element»Un nombre de viñeta estándar.Hoja A0, 841 × 1189 mmHoja A1, 594 × 841 mmA2 420 × 594 mmA3 Extra 322 × 445 mmA3 Extra Transversal 322 × 445 mmA3 Girada 420 × 297 mmA3 Transversal 297 × 420 mmHoja A3, 297 × 420 mmA4 Extra 9.27 × 12.69 inA4 Plus 210 × 330 mmA4 Girada 297 × 210 mmA4 Transversal 210 × 297 mmHoja A4, 210 × 297 mmHoja pequeña A4, 210 × 297 mmA5 Extra 174 × 235 mmA5 Girado 210 × 148 mmA5 Transversal 148 × 210 mmHoja A5, 148 × 210 mmA6 105 × 148 mmA6 Girada 148 × 105 mmABCDEFGabcdefg12345ASCIIAcerca deAcerca de %sAbsolutoActiveBorderActiveCaptionTamaño realAñadirAñadir columnaAñadir filaAñadir página actual a MarcadoresAñadir a colores personalizadosSe llamó a AddToPropertyCollection sobre un accedente genéricoSe llamó a AddToPropertyCollection sin añadidor válidoAñadiendo libro %sAvanzadoDespués de un párrafo:Alinear a la izquierdaAlinear a la derechaAlineaciónTodoTodos los archivos (%s)|%sTodos los archivos (*)|*Todos los archivos (*.*)|*Todos los estilosModo alfabéticoSe pasó un objeto ya registrado a SetObjectClassInfoYa está llamando al ISP.Alt+Un radio de esquina opcional para añadir esquinas redondeadas.E incluye los siguientes archivos: El archivo de animación no es del tipo %ld.AppWorkspace¿Quiere añadir el registro al archivo «%s»? (elegir [No] lo sobrescribirá)AplicaciónAplicarAguamarinaArábigoArábigo (ISO-8859-6)No se encontró el argumento %u.ArtistasAscendenteAtributosTipos de letra disponibles.B4 (ISO) 250 × 353 mmB4 (JIS) Girado 364 × 257 mmSobre B4, 250 × 353 mmHoja B4, 250 × 354 mmB5 (ISO) Extra 201 × 276 mmB5 (JIS) Girado 257 × 182 mmB5 (JIS) Transversal 182 × 257 mmSobre B5, 176 × 250 mmHoja B5, 182 × 257 mmB6 (JIS) 128 × 182 mmB6 (JIS) Girado 182 × 128 mmSobre B6, 176 × 125 mmBMP: no se pudo reservar memoria.BMP: no se pudo guardar una imagen no válida.BMP: no se pudo escribir el mapa de color RGB.BMP: no se pudieron escribir los datos.BMP: no se pudo escribir la cabecera (Bitmap) del archivo.BMP: no se pudo escribir la cabecera (BitmapInfo) del archivo.BMP: la cabecera tiene biClrUsed=%d pero biBitCount=%d.BMP: wxImage no tiene su propia wxPalette.AtrásFondo&Color de fondo:Color de fondoBáltico (ISO-8859-13)Báltico (antiguo) (ISO-8859-4)Antes de un párrafo:Mapa de bitsNegroAzulAzul:NegritaBordeBordesInferiorMargen inferior (mm):Propiedades de cajaEstilos de cajaTraer todo al primer planoMarrónNavegar&Alineación de viñeta:Estilo de viñetaViñetasButtonFaceButtonHighlightButtonShadowButtonTextHoja C, 17 × 22 in&LimpiarC&olor:Sobre C3, 324 × 458 mmSobre C4, 229 × 324 mmSobre C5, 162 × 229 mmSobre C6, 114 × 162 mmSobre C65, 114 × 229 mmCD-ROM¡El manipulador de CHM actualmente admite únicamente archivos locales!Ma&yúsculasNo se puede &deshacer No se puede determinar automáticamente el formato de imagen en entradas secuenciales.No se puede cerrar la clave del Registro «%s»No se pueden copiar valores del tipo no admitido %d.No se puede crear la clave del Registro «%s»No se puede crear el hilo de ejecuciónNo se puede eliminar la clave «%s»No se puede elimininar el archivo INI «%s»No se puede eliminar el valor «%s» de la clave «%s»No se pueden enumerar las subclaves de la clave «%s»No se pueden enumerar los valores de la clave «%s»No se puede exportar el valor del tipo no admitido %d.No se puede encontrar la posición actual en el archivo «%s»No se puede obtener información de la clave del Registro «%s»No se puede obtener el objeto JavaScriptNo se puede inicializar el flujo de compresión de zlib.No se puede inicializar el flujo de descompresión de zlib.No se pueden monitorizar los cambios del directorio inexistente «%s».No se puede abrir la clave del registro «%s»No se puede leer desde el flujo de descompresión %sNo se puede leer el flujo de descompresión: EOF inesperado en el flujo subyacente.No se puede leer el valor de «%s»No se puede leer el valor de la clave «%s»No se puede ejecutar un guión JavaScript sin un documento HTML válidoNo se puede guardar la imagen en el archivo «%s»: extensión desconocida.No se puede guardar el contenido del registro en un archivo.No se puede establecer la prioridad del hilo de ejecuciónNo se puede establecer el valor de «%s»No se puede escribir en stdin del proceso hijoNo se puede escribir en el flujo de compresión: %sCancelarNo se pueden enumerar los archivos «%s»No se pueden enumerar los archivos en el directorio «%s»No se puede encontrar ninguna conexión telefónica activa: %sNo se puede encontrar el archivo de libreta de direccionesNo se puede obtener una instancia activa de «%s»No se puede obtener un intervalo de prioridades para la normativa de planificación %d.No se puede obtener el nombre de la máquinaNo se puede obtener el nombre oficial de la máquinaNo se puede colgar: no hay ninguna conexión telefónica activa.No se puede inicializar OLENo se pueden inicializar los socketsNo se puede cargar el icono desde «%s».No se pueden cargar recursos desde «%s».No se pueden cargar los recursos a partir del archivo «%s».No se puede abrir el documento HTML: %sNo se puede abrir el libro de ayuda HTML: %sNo se puede abrir el archivo de contenidos: %s¡No se puede abrir el archivo para impresión PostScript!No se puede abrir el archivo de índice: %sNo se puede cargar el archivo de recursos «%s».No se puede imprimir una página vacía.¡No se puede leer el nombre del tipo desde '%s'!No se puede reanudar el hilo de ejecución %lxNo se puede recuperar la normativa de planificación de hilos de ejecución.No se puede cambiar la configuración regional al idioma «%s».No se puede iniciar el hilo de ejecución: error al escribir TLS.No se puede suspender el hilo de ejecución %lxNo se puede esperar a la finalización del hilo de ejecuciónCaptionTextDistingue mayúsculas y minúsculasModo categorizadoPropiedades de celdaCéltico (ISO-8859-14)Cen&tradoCentradoEuropa Central (ISO-8859-2)CentrarCentrar texto.Centrado&Elegir…Cambiar estilo de listaCambiar estilo de objetoCambiar propiedadesCambiar estiloLos cambios no se guardarán para evitar sobrescribir el archivo existente «%s»Falló el cambio del directorio actual a «%s»Estilos de carácterActive para añadir un punto después de la viñeta.Active para añadir un paréntesis derecho.Active para editar todos los bordes a la vez.Active para encerrar la viñeta entre paréntesis.Active para indicar texto dispuesto de derecha a izquierda.Active para definir en negrita el tipo de letra.Active para definir en cursiva el tipo de letra.Active para definir en subrayado el tipo de letra.Active para reiniciar la numeración.Active para mostrar una línea a través del texto.Active para mostrar el texto en mayúsculas.Active para mostrar el texto en versalitas.Active para mostrar el texto en subíndice.Active para mostrar el texto en superíndice.Active para suprimir la división de palabras.Elija un ISP al que conectarElija un directorio:Elija un archivoElija un colorElija un tipo de letraSe ha detectado una dependencia circular concerniente al módulo «%s».&CerrarClase no registrada.LimpiarEliminar el contenido del logPulse para aplicar el estilo seleccionado.Pulse click para buscar un símbolo.Pulse para cancelar los cambios al tipo de letra.Pulse para cancelar la selección del tipo de letra.Pulse para cambiar el color de letra.Pulse para cambiar el color del fondo.Pulse para cambiar el color del texto.Pulse para elegir el tipo de letra de este nivel.Pulse para cerrar esta ventana.Pulse para confirmar los cambios al tipo de letra.Pulse para confirmar la selección del tipo de letra.Pulse para crear un nuevo estilo de caja.Pulse para crear un nuevo estilo de caracter.Pulse para carear una nueva lista de estilo.Pulse para crear un nuevo estilo de párrafo.Pulse para crear una nueva posición de tabulador.Pulse para borrar todas las posiciones de tabulación.Pulse para borrar el estilo seleccionado.Pulse para borrar la posición de tabulador seleccionada.Pulse para editar el estilo seleccionado.Pulse para renombrar el estilo seleccionado.CerrarCerrar TodoCerrar el documento actualCerrar esta ventanaContraerColorColorEl diálogo de selección de color falló con error %0lx.Color:Columna %uNo se pudo convertir el argumento de consola %d en Unicode y se ignorará.El diálogo común falló con error %0lx.El sistema no admite la composición. Actívela en su gestor de ventanas.Archivo de ayuda HTML comprimido (*.chm)|*.chm|EquipoUn nombre de entrada de configuración no puede empezar por «%c».ConfirmarConectando…ContenidosControlDarkControlLightConversión a juego de caracteres '%s' no funciona.ConvertirCopiado en el portapapeles:"%s"Copias:CopiarCopiar selecciónNo se puede copiar más de un bloque seleccionado al portapapeles.Esquina&Radio de la esquina:No se pudo crear el archivo temporal '%s'No se pudo extraer %s en %s: %sNo se pudo encontrar pestaña para idNo se pudo encontrar el archivo '%s'.No se pudo registrar el cargador modificado de fuentes DirectWrite.No se pudo establecer la carpeta de trabajo actualNo se pudo iniciar la previsualización del documento.No se pudo iniciar la impresión.No se pudieron transferir datos a la ventanaNo se pudo añadir una imagen a la lista de imágenes.No se pudo crear el contexto OpenGLNo se pudo crear un temporizadorNo se pudieron enumerar las traduccionesNo se pudo encontrar el símbolo «%s» en la biblioteca dinámicaNo se pudo obtener el puntero al hilo de ejecución actualNo se pudo inicializar la tabla hash del GIF.No se pudo abrir la imagen PNG: el archivo está dañado o no hay memoria suficiente.No se pudieron cargar los datos de sonido desde «%s».No se pudo obtener el nombre la carpetaNo se pudo abrir el audio: %sNo se pudo registrar el formato del portapapeles «%s».No se pudo obtener información sobre el elemento de control de la lista %d.No se pudo guardar la imagen PNG.No se pudo finalizar el hilo de ejecuciónNo se encontró el parámetro de Create %s en los parámetros RTTI declaradosCrear directorioCrear directorio nuevoCrear nuevo documentoFalló la creación de %s «%s».Cor&tarDirectorio actual:PersonalizadoTamaño personalizadoPersonalizar columnasCortarCortar selecciónCirílico (ISO-8859-14)Hoja D, 22 x 34 inFalló la petición de rastreo DDECabecera DIB: La codificación no coincide con la profundidad de bits.Cabecera DIB: Altura de la imagen > 32767 pixels por archivo.Cabecera DIB: Anchura de imagen > 32767 pixels por archivo.Cabecera DIB: Profundidad de color desconocida en archivo.Cabecera DIB: Codificación desconocida en archivo.Sobre DL, 110 x 220 mmBarradoInforme de depuración «%s»No se pudo crear el informe de depuración.No se pudo generar el informe de depuración.DecorativoCodificación predeterminadaTipo de letra predeterminadoImpresora predeterminadaEliminarEliminar &todoEliminar columnaEliminar filaEliminar estiloEliminar textoEliminar elementoBorrar selección¿Eliminar estilo %s?Archivo antiguo de bloqueo '%s' eliminado.Fallo al borrar la contraseña para "%s": %s.No existe la dependencia "%s" del módulo "%s".DescendenteEscritorioDesarrollado por DesarrolladoresLas funciones de marcado no están disponibles porque los servicios de acceso remoto (RAS) no están instalados. Por favor instálelos.¿Sabía que…Ha ocurrido un error DirectFB %d.DirectoriosNo se pudo crear el directorio «%s»No se pudo eliminar el directorio «%s»El directorio no existeLa carpeta no existe.¿Descartar los cambios y recargar la última versión guardada?Mostrar todos los elementos del índice que contengan la subcadena dada. La búsqueda es Insensitiva.Mostrar el diálogo de opcionesMuestra la ayuda mientras revisa los libros a la izquierda.¿Desea guardar los cambios hechos a %s?Documento:Documentación por Redactores de documentaciónNo guardarHechoHecho.PunteadoDobleTarjeta Japonesa Doble Girada 148 x 200 mmIdentificador usado dos veces: %dAbajoArrastrarHoja E, 34 x 44 inEOF mientras se leia del descriptor inotifyEditarEditar elementoTiempo transcurrido:Activar el valor de altura.Activar el ancho máximo.Activar el valor de altura mínima.Activar el ancho mínimo.Activar el valor de anchura.Activar la alineación vertical.Activa el color de fondo.Activa una sombra.Activa la distancia de difuminado.Activa el color de sombra.Activa la opacidad de la sombra.Activa la difusión de la sombra.Introduzca un nombre de estilo de cajaIntroduzca un nombre de estilo de caracterIntroduzca un nombre de estilo de listaIntroduzca un nuevo nombre de estiloIntroduzca un nombre de estilo de párrafoEscriba la orden para abrir el archivo «%s»:Entradas encontradasEnvelope Invite 220 x 220 mmFallo en expansión de variable de entorno: falta '%c' en la posición %u en '%s'.ErrorError al cerrar el descriptor epollError cerrando la instancia kqueueFalló la copia del archivo «%s» en «%s».Error al crear el directorioError al leer la imagen DIB.Error en recurso: %sError al leer las opciones de configuración.Error ejecutando JavaScript: %sError al guardar los datos de configuración del usuario.Error al imprimir: Error: Error: %s (%d)Esperanto (ISO-8859-3)Tiempo estimado:Archivos ejecutables (*.exe)|*.exe|EjecutarFalló la ejecución de la orden «%s»Ejecutivo, 7 1/4 x 10 1/2 pulgadasExpandirExportando clave de Registro: el archivo «%s» ya existe y no se sobrescribirá.Página de códigos extendidad Unix para japonés (EUC-JP)Falló la extracción de «%s» en «%s».Nombre del tipo de letraFallo al acceder al archivo de bloqueo.No se pudo añadir la fuente modificada "%s".Fallo al añadir el descriptor %d al descriptor epoll %dNo se pudieron reservar %lu kb de memoria para los datos del mapa de bits.Fallo al reservar un color para OpenGLFallo al reservar memoria para la compresión LZMA.Fallo al reservar memoria para la descompresión LZMA.Error al cambiar el modo de vídeoFallo comprobando el formato del archivo de imagen "%s".No se pudo vaciar el directorio de informe de depuración "%s"Error al cerrar el manejador del archivoNo se pudo cerrar el archivo de bloqueo '%s'Error al cerrar el portapapeles.No se pudo cerrar el display "%s"Fallo al conectar: faltan usuario/contraseña.Fallo al conectar: no hay ISP al que llamar.Error al copiar el contenido del diálogo al portapapeles.Falló la copia del valor del Registro «%s»Fallo al copiar los contenidos de la clave del registro '%s' a '%s'.No se pudo copiar el archivo '%s' a '%s'Error al copiar la subclave del registro '%s' en '%s'.Fallo al crear cadena DDEFalló la creación del panel MDI padre.No se pudo crear un nombre temporal de archivoFallo al crear tubería anónimaError creando una instancia de "%s"Falló la creación de la conexión con el servidor «%s» en «%s»Falló la creación del cursor.Falló la creación del directorio «%s»Falló la creación del directorio «%s» (¿Tiene los permisos necesarios?)Falló la creación del descriptor epollFallo creando el objeto de configuración de fuente.Falló la creación de la entrada del Registro para los archivos «%s».Fallo al crear el diálogo estándar de buscar/reemplazar (código de error %d)Falló la creación de la tubería de aviso usada por el bucle de sucesos.Error al mostrar el documento HTML con codificación %sFallo al vaciar el portapapeles.Falló la enumeración de los modos de vídeoFallo al establecer un lazo de aviso con el servidor DDEFallo al establecer la conexión: %sError al ejecutar '%s' Fallo al ejecutar curl, por favor instálelo en el PATH.No se encontró el CLSID de «%s»Failed to find match for regular expression: %sNo se pudo encontrar el nivel de emulación de la vista web en el registroError al obtener nombres de ISP: %sNo se pudo obtener la interfaz de automatización OLE para "%s"Error al obtener datos del portapapelesError al obtener el sistema horario localError al obtener el directorio de trabajoFallo al inicializar GUI: no se encontraron temas.Fallo al inicializar la compresión LZMA: error inesperado %u.Fallo al inicializar la descompresión LZMA: error inesperado %u.Fallo al inicializar la ayuda MS HTML.Falló la inicialización de OpenGLError al iniciar la conexión de marcado: %sNo se pudo insertar texto en el control.Error al inspeccionar el archivo de bloqueo '%s'Error instalando el manejador de señalError al sincronizar con un hilo de ejecución, pérdida potencial de memoría detectada - por favor reinicie el programaNo se pudo matar el proceso %dNo se pudo cargar la imagen "%s" desde los recursos.No se pudo cargar el icono "%s" desde los recursos.Falló la carga de los iconos a partir del recurso «%s».No se pudo abrir la imagen %%d desde el archivo '%s'.No se pudo abrir la imagen %d desde el flujo.No se pudo abrir la imagen desde el archivo "'%s".No se pudo abrir el metaarchivo desde el archivo "%s".No se pudo cargar mpr.dll.Falló la carga del recurso «%s».Falló la carga de la biblioteca compartida «%s»No se pudo cargar el sonido de "%s" (error %d).Falló el bloqueo del recurso «%s».No se pudo bloquear el bloqueo del archivo '%s'No se pudo modificar el descriptor %d en el descriptor epoll %dNo se pudo modificar la hora del archivo para '%s'Fallo al monitorizar los canales de E/SFalló la apertura del archivo «%s» para su lecturaFalló la apertura del archivo «%s» para su escrituraFalló la apertura del archivador CHM «%s».Falló la apertura del URL «%s» en el navegador predeterminado.Falló la apertura de la URL '%s' en el navegador predeterminadoFalló la apertura del directorio '%s' para su monitorización.Falló la apertura de la pantalla «%s».Falló la apertura del archivo temporal.Falló la apertura del portapapeles.No se pudieron analizar las formas plurales: «%s»Falló la preparación de la reproducción de «%s».Falló la transferencia de datos al portapapelesFalló la lectura del PID a partir del archivo de bloqueo.Falló la lectura de las opciones de configuración.Falló la lectura del documento a partir del archivo «%s».Falló la lectura del suceso a partir de la tubería DirectFBFallo leyendo de la tubería de avisoFalló la lectura del archivo de texto '%s'.Error en la redirección de la entrada/salida del proceso hijoError en la redirección de la entrada/salida del proceso hijoError al registrar el servidor DDE '%s'No se pudo registrar la configuración de la fuente usando fuentes privadas.Error al recordar la codificación para el conjunto de caracteres '%s'.No se pudo eliminar el archivo de informe de depuración '%s'No se pudo quitar el archivo de bloqueo '%s'No se pudo eliminar el antiguo archivo de bloqueo '%s'.Fallo al renombrar valor del registro '%s' a '%s'.No se pudo renombrar el archivo '%s' a '%s' porque el archivo de destino ya existe.Error al renombrar la clave del registro '%s' a '%s'.No se pudo restaurar el nivel estándar de emulación webNo se pudo obtener horas del archivo para '%s'Fallo al recuperar el mensaje de error de RASFalló la recuperación de los formatos admitidos del portapapelesFalló el guardado del documento en el archivo «%s».Falló el guardado de la imagen de mapa de bits en el archivo «%s».Fallo al enviar notificación de aviso DDEFalló la definición del modo de transferencia FTP a %s.Error al colocar datos en el portapapeles.No se pudieron establecer permisos para el archivo de bloqueo '%s'Error al establecer la prioridad del procesoNo se pudieron cambiar permisos del archivo temporalError al establecer el nivel de concurrencia del hilo de ejecución a %luError al establecer la prioridad del hilo de ejecución %d.Fallo al establecer una tubería no bloqueante, el progrma puede colgarse.No se pudo cambiar el nivel moderno de emuilación web¡Falló el almacenamiento de la imagen '%s' en el VFS de memoria!Fallo al cambiar la tubería DirectFB a modo no bloqueanteFallo al cambiar la tubería de aviso a modo no bloqueanteError al terminar un hilo de ejecución.Error al terminar el bucle de aviso con el servidor DDEError al terminar la conexión: %sNo se pudo retocar' el archivo '%s'Falló la descarga de la biblioteca compartidaNo se pudo desbloquear el archivo de bloqueo '%s'Error al desregistrar el servidor DDE '%s'Fallo durante la anulación del registro del descriptor %d del descriptor epoll %dNo se pudo actualizar el archivo de configuración de usuario.Fallo al enviar el informe de depuración (código error %d)No se pudo escribir en el archivo de bloqueo «%s»FalsoFamiliaError fatalArchivoNo se pudo abrir el archivo «%s» para su lectura.No se pudo abrir el archivo «%s» para su escritura.El archivo «%s» ya existe; ¿realmente quiere sobrescribirlo?No se pudo quitar el archivo «%s»No se pudo cambiar el nombre del archivo «%s» como «%s»No se pudo abrir el archivo.El diálogo de archivo falló con código de error %0lx.Error de archivoYa existe un archivo con el mismo nombre.Tipo de archivo:ArchivosArchivos (%s)FiltroBuscarBuscar y reemplazar en el documentoBuscar en el documentoBuscar...PrimeroPrimera páginaFijaTipo monoespaciado:Tipo de letra de tamaño fijo.
negrita cursiva FlotanteDisco flexibleFolio, 8 1/2 × 13 inTipo de letra&Peso tipográfico:No se puede usar el archivo de fuente "%s" porque no está en la carpeta de fuentes "%s".No se pudo cargar el archivo de fuente "%s"El archivo de fuente "%s" no existe.Tamaño de letra:&Estilo tipográfico:Tipo de letra:El archivo de índice tipográfico %s desapareció mientras se cargaban los tipos de letra.Error en bifurcación de proceso (fork)AdelanteNo se admiten los HREF de reenvíoSe encontraron %i coincidenciasDe:FucsiaGIF: el flujo de datos parece haberse truncado.GIF: error en formato de imagen GIF.GIF: memoria insuficiente.El GTK+ instalado en esta máquina es demasiado antiguo para admitir la composición de pantallas; instale GTK+ 2.12 o posterior.Tema de GTK+GeneralPostScript genéricoGerman Legal Fanfold, 8 1/2 × 13 inGerman Std Fanfold, 8 1/2 × 12 inSe llamó a GetProperty sin un captador válidoSe llamó a GetPropertyCollection sobre un accedente genéricoSe llamó a GetPropertyCollection sin un captador de colecciones válidoRetrocederAvanzarSubir un nivel en la jerarquía del documentoIr al directorio de usuarioIr al directorio contenedorArte gráfico por GrisGrayTextGriego (ISO-8859-7)VerdeVerde:RanuraEsta versión de zlib no admite GZIPProyecto de ayuda HTML (*.hhp)|*.hhp|El anclaje HTML %s no existe.Archivos HTML (*.html;*.htm)|*.html;*.htm|Disco duroHebreo (ISO-8859-8)AyudaOpciones del Navegador de ayudaContenido de la ayudaAyuda de impresiónTemas de ayudaLibros de ayuda (*.htb)|*.htb|Libros de ayuda (*.zip)|*.zip|No se encontró el directorio de ayuda «%s».No se encontró el archivo de ayuda «%s».Ayuda: %sOcultar esta notificación.HighlightHighlightTextInicioDirectorio de usuarioCómo flotará el objeto en relación con el texto.ICO: Error al leer máscara DIB.ICO: ¡Error al escribir el archivo de imagen!ICO: Imagen demasiado alta para un icono.ICO: Imagen demasiado ancha para un icono.ICO: Indice de icono no válido.IFF: el flujo de datos parece truncado.IFF: error en formato de imagen IFF.IFF: memoria insuficiente.IFF: ¡¡¡error desconocido!!!ISO-2022-JPSi es posible, intente cambiar los parámetros para hacer la impresión más estrecha.Si tiene alguna información adicional concerniente a este informe de error, por favor, introdúzcalo aquí y será adjuntado:Si desea eliminar este informe de depuración completamente, por favor, elija el botón "Cancelar", pero sepa que ésto no ayuda a la mejora del programa, por tanto, si es posible, por favor, continue con la generación del informe. Ignorando regiatro de datgos extra mal formado, el archivo ZIP puede estar corrompidoSe ignora el valor «%s» de la clave «%s».Clase de objeto no permitida (Non-wxEvtHandler) como origen de sucesosNúmero incorrecto de parámetros para el método ConstructObjectNúmero incorrecto de parámetros para el método CreateEl nombre del directorio no está permitido.Especificación de archivo incorrecta.La imagen y la máscara son de tamaños distintos.El archivo de imagen no es del tipo %d.La imagen no es del tipo %s.Imposible crear control 'rich edit', se usará el control de texto simple. Por favor instale riched32.dllImposible obtener la entrada del proceso hijoImposible obtener permisos para el archivo '%s'Imposible sobrescribir el archivo «%s»Imposible establecer los permisos del archivo «%s»InactiveBorderInactiveCaptionInactiveCaptionTextTamaño de fotograma incorrecto en el GIF (%u, %d) para el fotograma #%uNúmero de argumentos incorrecto.SangríaSangrías y espaciadoÍndiceIndia (ISO-8859-12)InformaciónFalló la inicialización en la fase «post init»; se ha interrumpido.InsertarInsertar campoInsertar imagenInsertar objetoInsertar textoInserta un salto de página antes del párrafo.RecuadroÍndice de imagen TIFF no válido.Especificación de modo de pantalla no válida: '%s'.Especificación de geometría no válida: '%s'Suceso inotify no válido para «%s»Archivo de bloqueo «%s» no válido.Catálogo de mensajes no válido.Identificador de objeto pasado a GetObjectClassInfo nulo o no válidoIdentificador de objeto pasado a HasObjectClassInfo nulo o no válidoExpresión regular no válida «%s»: %sValor %ld no válido para una clave booleana «%s» en el archivo de configuración.CursivaSobre Italy, 110 × 230 mmJPEG: no se pudo cargar: quizás el archivo está dañado.JPEG: No pudo guardarse imagen.Tarjeta Japonesa Doble 200 x 148 mmSobre japonés Chou n.º 3Sobre japonés Chou n.º 3 GiradoSobre japonés Chou n.º 4Sobre japonés Chou n.º 4 GiradoSobre japonés Kaku n.º 2Sobre japonés Kaku n.º 2 GiradoSobre japonés Kaku n.º 3Sobre japonés Kaku n.º 3 GiradoSobre japonés You n.º 4Sobre japonés You n.º 4 GiradoTarjeta japonesa 100 × 148 mmTarjeta japonesa Girada 148 × 100 mmIr aJustificadoJustificar texto a izquierda y derecha.KOI8-RKOI8-U&Interlineado:Error de compresión LZMA al vaciar la salida: %sError de compresión LZMA %sError de descompresión LZMA %sHorizontalÚltimoÚltima páginaNo se mostró el último mensaje repetido («%s», %u vez)No se mostró el último mensaje repetido («%s», %u veces)Libro mayor, 17 × 11 inIzquierdaIzquierda (&primer renglón):Margen izquierdo (mm):Texto alineado a la izquierda.Legal Extra 9 1/2 × 15 inLegal, 8 1/2 × 14 inCarta Extra 9 1/2 × 12 inCarta Extra Transversal 9,275 × 12 inCarta Plus 8 1/2 × 12,69 inCarta Girada 11 × 8 1/2 inCarta Pequeña, 8 1/2 × 11 inCarta Transversal 8 1/2 × 11 inCarta, 8 1/2 × 11 inLicenciaLigeraLimaEl renglón %lu del archivo de mapa «%s» tiene sintaxis no válida; se omite.Interlineado:El enlace contiene «//»; se ha convertido en enlace absoluto.Estilo de listaEstilos de listaEnumera los tamaños de letra en puntos.Muestra los tipos de letra disponibles.Cargar el archivo %sCargando: El archivo de bloqueo «%s» tiene un propietario incorrecto.El archivo de bloqueo «%s» tiene permisos incorrectos.Registro guardado en el archivo «%s».Letras minúsculasNúmeros romanos en minúsculaVentana hija MDILa funciones de Ayuda MS HTML no están disponibles porque la biblioteca de Ayuda MS HTML no está instalada. Instálela.Ma&ximizarMacArabicMacArmenianMacBengaliMacBurmeseMacCelticMacCentralEurRomanMacChineseSimpMacChineseTradMacCroatianMacCyrillicMacDevanagariMacDingbatsMacEthiopicMacExtArabicMacGaelicMacGeorgianMacGreekMacGujaratiMacGurmukhiMacHebrewMacIcelandicMacJapaneseMacKannadaMacKeyboardGlyphsMacKhmerMacKoreanMacLaotianMacMalayalamMacMongolianMacOriyaMacRomanMacRomanianMacSinhaleseMacSymbolMacTamilMacTeluguMacThaiMacTibetanMacTurkishMacVietnameseHacer una selección:MárgenesMarrónDistinguir mayúsculas y minúsculasAltura máxima:Anchura máxima:Error de reproducción del medio: %s¡El VFS en memoria ya contiene el archivo '%s'!MenúMensajeTema metálicoNo se encontró el método o la propiedad.Mi&nimizarAltura mínima:Anchura mínima:MinimizarFalta un parámetro requerido.ModernaModificadoFalló la inicialización del módulo «%s»Sobre Monarch, 3 7/8 × 7 1/2 inActualmente no se admite la monitorización de cambios en archivos individuales.BajarSubirMueve el objeto al párrafo siguiente.Mueve el objeto al párrafo anterior.Múltiples propiedades de celdaNombreAzul marinoRedNuevoEstilo de &caja nuevo…Estilo de &carácter nuevo…Estilo de &lista nuevo…Estilo de &párrafo nuevo…Estilo nuevoElemento nuevoNewNamePágina siguienteNoNo hay definido ningún manipulador de animación para tipo %ld.No hay manipulador de imagen para el tipo %d.No se ha configurado la aplicación predeterminada para archivos HTML.No se han encontrado documentos.No hay un tipo de letra para la codificación «%s», pero existe una codificación alternativa, «%s». ¿Le gustaría usar esta codificación (de otra forma deberá elegir otra)?No existe un tipo de letra para la codificación «%s». ¿Le gustaría seleccionar un tipo de letra para usarse con esta codificación (de otra forma el texto con esta codificación no se mostrará correctamente)?No se ha encontrado ningún manipulador para el tipo de animación.No se ha encontrado ningún manipulador para el tipo de imagen.No hay definido ningún manipulador de imagen para tipo %d.No hay definido ningún manipulador de imagen para tipo %s.Todavía no se ha encontrado una página con coincidenciasNo hay ningún sonidoNo hay ningún color sin utilizar en la imagen que se está enmascarando.No se han encontrado asignaciones válidas en el archivo «%s».NingunoNórdico (ISO-8859-10)NormalTipo de letra normal
y subrayado. Tipo de letra normal:No %sNo disponible para esta plataformaNo hay espacio suficiente en el disco para la descarga.No subrayadaNota, 8 1/2 × 11 inAvisoEsquema numeradoAceptarError de automatización OLE en %s: %sPropiedades del objetoLa implementación del objeto no admite argumentos con nombre.Los objetos deben tener un atributo de identificaciónAceitunaOpaci&dad:Opacidad:Abrir archivoAbrir documento HTMLAbre un documento existenteAbrir archivo «%s»Abrir…El controlador de OpenGL no admite OpenGL 3.0 o más reciente.Operación no permitida.La opción «%s» no puede negarseLa opción «%s» exige un valor.Parámetro «%s»: «%s» no puede convertirse en fecha.OpcionesNaranjaOrientaciónSe agotaron los ids. de ventana. Se recomienda cerrar la aplicación.ContornoComienzoDesbordamiento durante el forzado de los valores de argumentos.PCX: no pudo reservarse memoriaPCX: formato de imagen no admitidoPCX: imagen no válidaPCX: este no es un archivo PCX.PCX: ¡error desconocido!PCX: número de versión demasiado antiguoPNM: no se pudo reservar memoria.PNM: no se reconoce el formato de archivo.PNM: el archivo parece estar truncado.PRC 16K 146 × 215 mmPRC 16K GiradoPRC 32K 97 × 151 mmPRC 32K GiradoPRC 32K(Grande) 97 × 151 mmPRC 32K(Grande) GiradoSobre PRC n.º 1 102 × 165 mmSobre PRC n.º1 Girado 165 × 102 mmSobre PRC n.º 10 324 × 458 mmSobre PRC n.º 10 Girado 458 × 324 mmSobre PRC n.º 2 102 × 176 mmSobre PRC n.º 2 Girado 176 × 102 mmSobre PRC n.º 3 125 × 176 mmSobre PRC n.º 3 Girado 176 × 125 mmSobre PRC n.º 4 110 × 208 mmSobre PRC n.º 4 Girado 208 × 110 mmSobre PRC n.º 5 110 × 220 mmSobre PRC n.º 5 Girado 220 × 110 mmSobre PRC n.º 6 120 × 230 mmSobre PRC n.º 6 Girado 230 × 120 mmSobre PRC n.º 7 160 × 230 mmSobre PRC n.º 7 Girado 230 × 160 mmSobre PRC n.º 8 120 × 309 mmSobre PRC n.º 8 Girado 309 × 120 mmSobre PRC n.º 9 229 × 324 mmSobre PRC n.º 9 Girado 324 × 229 mmRellenoPágina %dPágina %d de %dConfigurar páginaConfigurar páginaPáginasTamaño del papelEstilos de párrafoPaso de un objeto ya registrado a SetObjectPaso de un objeto desconocido a GetObjectContraseña:PegarPegar selecciónPeri&odoPermisosPropiedades de la imagenError en la creación de la tuberíaElija un tipo de letra válido.Elija un archivo existente.Elija la página que quiera mostrar:Elija el ISP con el que se quiera conectarSeleccione las columnas que se mostrarán y defina su orden:Imprimiendo; espere un momento…Tamaño de puntoVerticalPosiciónArchivo PostScriptPreferenciasPreparandoPrevisualización:Página anteriorImprimirPrevisualización de la impresiónError en previsualización de impresiónIntervalo de impresiónConfiguración de impresiónImpresión en colorNo se pudo inicializar la operación de impresión&Vista previa de impresión...Error al crear la previsualización de impresión.Vista previa de impresión...Cola de impresiónImprimir esta páginaImprimir a archivoImprimir...ImpresoraOrden de la impresora:Opciones de impresiónOpciones de impresión:Impresora...Impresora:ImprimiendoImprimiendo Error de impresiónEl control web no soporta la impresiónImprimiendo página %dImprimiendo página %d de %dImprimiendo página %d...Imprimiendo...ImpresiónFalló el procesamiento del informe de depuración; se han dejado los archivos en el directorio «%s».Progreso:PropiedadesPropiedadError de propiedadMoradoQuarto, 215 x 275 mmPreguntaSalirSalir de este programaError de lectura en el archivo '%s'Fallo al leer la contraseña para "%s": %s.ListoRojoRojo:RehacerRehacer la última acciónRefrescarLa clave del registro '%s' ya existe.La clave del registro '%s' no existe, no se puede renombrar.La clave del registro '%s' se necesita para el funcionamiento normal del sistema, si se elimina puede dejar el sistema en un estado inestable: operación abortada.El valor del Registro «%s» no es binario (sino del tipo %s)El valor del Registro «%s» no es numérico (sino del tipo %s)El valor del Registro «%s» no es de texto (sino del tipo %s)La clave del registro '%s' ya existe.NormalRelativoEntradas relevantes:Tiempo restante:EliminarEliminar marcaEliminar la página actual de favoritosEl renderizador "%s" tiene una versión %d.%d incompatible y no se ha podido abrir.Renumerar ListaSu&stituir...SustituirSustituir &todoSustituir por:Sustituir...La entrada de información requerida está vacía.El recurso '%s' no es un catálogo de mensajes válido.No se puede obtener la salida de un guión JavaScript usando WebKit v1Recuperar versión guardadaArrugarDerec&ha a izquierdaDerechaMargen derecho (mm):Alinear texto a la derecha.RomanFila %iRunScriptAsync no soportadoNombre de viñeta es&tándar:GuardarGuardar el archivo %sG&uardar como…Guardar comoGuardar como…Guardar documento actualGuardar el documento actual con otro nombreGuardar los contenidos del log en un archivoFallo al guardar la contaseña para "%s": %s.ScriptBarra de desplazamientoBuscarBuscar en los libros de ayuda todas las apariciones del texto que ha escritoDirección de búsquedaBuscar:Buscar en todos los librosBuscando…SeccionesError de búsqueda en el archivo «%s»Error de búsqueda en el archivo «%s» (stdio no admite los archivos grandes)Seleccionar &todoSeleccionar todoSeleccionar una plantilla de documentoSeleccionar una vista de documentoSeleccionar normal o negrita.Seleccionar estilo normal o cursiva.Seleccionar subrayado o no subrayado.SelecciónSelecciona el nivel de lista a editar.Se esperaba un separador después de la opción «%s».Cambiar estilo de celdaSe llamó a SetProperty sin un establecedor válidoConfiguración…Se han encontrado varias conexiones activas, eligiendo una aleatoriamente.Difusión de la sombr&a:SombraC&olor de la sombra:Mostrar directorios &ocultosMostrar archivos &ocultosMuestra el diálogo Acerca deMostrar todoMostrar todos los datos en el índiceMostrar/ocultar panel de navegaciónMuestra un subconjunto Unicode.Muestra una previsualización de las opciones de la viñeta.Muestra una vista previa de las opciones de la fuente.Muestra una vista previa de la fuente.Muestra una previsualización de las opciones del párrafo.Muestra la vista previa de la fuente.PlataTema monocromo sencilloSencilloTamañoTamaño:SaltarCursivaM&ayúsculas pequeñasSólidaNo pudo abrirse este archivo.No se pudo abrir este archivo.Ese nombre ya está en uso. Elija otro.Se desconoce el formato de este archivo.Los datos de sonido están en un formato no admitido.El archivo de sonido «%s» está en un formato no admitido.EspaciadoComprobar ortografíaEstándarDeclaración, 5 1/2 × 8 1/2 inEstáticoEstado:DetenerTachadoString To Colour: especificación de color incorrecta: %sEstiloEstilo:Subín&diceSupe&rínidiceSuperA/SuperA/A4 227 × 356 mmSuperB/SuperB/A3 305 × 487 mmSuprimir divisió&n de palabrasSwissSímbolo&Tipo de letra de símbolos:SímbolosTIFF: no se pudo reservar memoria.TIFF: error al cargar la imagen.TIFF: error al leer la imagen.TIFF: error al guardar la imagen.TIFF: error al escribir la imagen.TIFF: el tamaño de la imagen es anormalmente grande.Propiedades de tablaTabloide Extra 11,69 × 18 inTabloide, 11 × 17 inTabulacionesTurquesaTeletipoPlantillasTailandés (ISO-8859-11)El servidor FTP no admite el modo pasivo.El servidor FTP no admite la orden PORT.Los estilos de viñeta disponibles.Los estilos disponibles.El color de fondo.El estilo del borde.El tamaño del margén inferior.El tamaño del relleno inferior.La posición inferior.El carácter de viñeta.El código de carácter.El conjunto de caracteres «%s» es desconocido. Puede seleccionar otro conjunto para reemplazarlo o elegir [Cancelar] si no puede reemplazarseEl formato %d del portapapeles no existe.El estilo predeterminado para el siguiente párrafo.El directorio «%s» no existe. ¿Quiere crearlo ahora?El documento "%s" no cabe horizontalmente en la página y será truncado si se imprime. ¿Quiere imprimirlo de todas formas?El archivo '%s' no existe y no puede abrirse. También ha sido eliminado de la lista de archivos recientes.La sangría del primer renglón.Se generará el siguiente informe de depuración El color del tipo de letra.La familia tipográfica.El tipo de letra del que tomar el símbolo.El tamaño en puntos del tipo de letra.El tamaño en puntos del tipo de letra.Las unidades, puntos o píxeles del tamaño del tipo de letra.El estilo del tipo de letra.El peso del tipo de letra.No se pudo determinar el formato del archivo «%s».El desplazamiento horizontal.La sangría izquierda.El tamaño del margen izquierdo.El tamaño del relleno izquierdo.La posición izquierda.El espaciado de línea.El número de elemento de la lista.La ID del local es desconocida.La altura del objeto.La altura máxima del objeto.La anchura máxima del objeto.La altura mínima del objeto.La anchura mínima del objeto.El ancho del objeto.El nivel del contorno.El mensaje anterior repetido %u vez.El mensaje anterior repetido %u veces.El mensaje anterior repetido una vez.El intervalo que mostrar.El informe contiene los archivos mostrados abajo. Si alguno de estos archivos contiene información privada, por favor desmárquelos y serán eliminados del informe. El parámetro requerido '%s' no fue especificado.La sangría derecha.El tamaño del margen derecho.El tamaño del relleno derecho.La posición derecha.La distancia de difuminado de la sombra.El color de la sombra.La opacidad de la sombra.La difusión de la sombra.El espaciado depués del párrafo.El espaciado antes del párrafo.El nombre del estilo.El estilo en que se basa este estilo.La vista previa del estilo.El sistema no puede encontrar el archivo indicado.La posición de tabulación.Las posiciones de tabulación.El texto no pudo guardarse.El tamaño del margen superior.El tamaño del relleno superior.La posición superior.El valor para la opción '%s' debe especificarse.El valor del radio de la esquina.La versión del servicio de acceso remoto (RAS) instalada en esta máquina es demasiado vieja, por favor actualícela (la función requerida no está disponible: %s).El desplazamiento vertical.Hubo un problema al configurar la página: se necesita una impresora predeterminada.Este documento no cabe horizontalmente en la página y será truncado al imprimirlo.Esto no es un %s.Esta plataforma no admite transparencias de fondo.Este programa se compiló con una versión muy antigua de GTK+. Recompílelo con GTK+ 2.12 o posterior.Este programa no se compiló con soporte para EGL requerido bajo Wayland, puede instalar las librerías EGL y recompilar o correrlo bajo X11 modificando la variable de entorno GDK_BACKEND=x11 antes de arrancar su programa.Error en la inicialización del módulo de hilos de ejecución: no se pudo almacenar valor en el almacén local de hilosError en la inicialización del módulo de hilos de ejecución: error al crear clave de hiloError en la inicialización del módulo de hilos de ejecución: imposible reservar índice en el almacen local de hilosLa configuración de la prioridad del hilo de ejecución es ignorada.Mosaico &horizontalMosaico &verticalTiempo de espera de la conexión del servidor FTP excedido, pruebe a establecer el modo pasivo.Sugerencia del díaSugerencias no disponibles, ¡lástima!Hasta:¡Demasiadas llamadas a EndStyle!PistaTooltipTextArribaMargen superior (mm):Traducciones por TraductoresVerdadero¡Intentando eliminar el archivo '%s' de VFS de memoria, pero no está abierto!Turco (ISO-8859-9)TipoEscriba un nombre de fuente.Escribir un tamaño en puntos.No coincide el tipo del argumento %u.El tipo debe tener conversión de enum a longLa operación de tipos "%s" falló: la propiedad etiquetada "%s" es del tipo "%s", NO "%s".US Std Fanfold, 14 7/8 x 11 pulgadasUS-ASCIINo se pudo añadir la vista inotifyNo se pudo añadir la vista kqueueNo se pudo asociar manejador con el puerto de finalización de E/SError al cerrar el manejador del puerto de finalización de E/SNo se pudo cerrar la instancia inotifyNo se pudo cerrar el camino '%s'No se pudo cerrar el manejador para '%s'No se pudo crear el puerto de finalización de E/SNo se pudo crear el hilo IOCPNo se pudo crear la instancia inotifyNo se pudo crear la instancia kqueueNo se pudo sacar de la cola el paquete de finalizaciónNo se pudieron obtener sucesos de kqueueNo se pudo inicializar GTK+, ¿está DISPLAY configurada correctamente?No se pudo abrir el caminor '%s'Incapaz de abrir el docuemento HTML pedido: %sImposible reproducir el sonido de forma asíncrona.No se pudo enviar el estado de finalizaciónNo se pudo leer del descriptor inotifyNo se pudo quitar la supervisión inotify %iNo se pudo eliminar la vista kqueueNo se pudo activar la vista para '%s'No se pudo iniciar el hilo IOCPRestaurarSubrayarSubrayadoDeshacerDeshacer la última acciónCaracteres inesperados tras la opción '%s'.Suceso inesperado para «%s»: no hay descriptor de vista coincidente.Parámetro «%s» inesperadoSe creó inesperadamente un puerto de finalización de E/STerminación del hilo inapropiadaUnicodeUnicode 16 bits (UTF-16)Unicode 16 bits Endian Grande (UTF-16BE)Unicode 16 bits Endian Pequeña (UTF-16LE)Unicode 32 bits (UTF-32)Unicode 32 bits Endian Grande (UTF-32BE)Unicode 32 bits Endian Pequeña (UTF-32LE)Unicode 7 bit (UTF-7)Unicode 8 bit (UTF-8)Quitar sangríaUnidades para el ancho del borde inferior.Unidades para el margen inferior.Unidades para el ancho del contorno inferior.Unidades para el relleno inferior.Unidades para la posición inferior.Unidades para el radio de la esquina.Unidades para el ancho del borde izquierdo.Unidades del margen izquierdo.Unidades para el ancho del contorno izquierdo.Unidades para el relleno izquierdo.Unidades para la posición izquierda.Unidades para la altura máxima del objeto.Unidades para la anchura máxima del objeto.Unidades para la altura mínima del objeto.Unidades para la anchura mínima del objeto.Unidades del alto del objeto.Unidades del ancho del objeto.Unidades para el ancho del borde derecho.Unidades del margen derecho.Unidades para el ancho del contorno derecho.Unidades para el relleno derecho.Unidades para la posición derecha.Unidades para el ancho del borde superior.Unidades para el margen superior.Unidades para el ancho del contorno superior.Unidades para el relleno superior.Unidades para la posición superior.Unidades para este valor.DesconocidoError DDE desconocido %08xObjeto desconocido pasado a GetObjectClassInfoResolución de la unidad %d de PNG desconocidaPropiedad %s desconocidaIgnorada la unidad desconocida de resolución TIFF %dBase %d desconocida, se usará base 10.Error desconocido de biblioteca dinámicaCodificación desconocida (%d)Error desconocido %08xExcepción desconocidaFormato de imagen desconocido.El parámetro '%s' de entero largo es desconocidoNombre o argumento con nombre desconocido.La opción «%s» es desconocidaLlave abierta no emparejada en una entrada para tipo mime %s.Orden sin nombreNo especificadoFormato de portapapeles no admitido.No se admite el tema '%s'.ArribaLetras mayúsculasNúmeros romanos en mayúsculasUso: %sUsar &sombraUtilizar el alineamiento actual.Usuario:El uso de fuentes privadas no está sportado en este sistema: la librería Pango es demasiado antigua, se requiere 1.38 o posterior.Conflicto de validaciónValorEl valor debe ser %s o mayor.El valor debe ser %s o inferior.El valor debe estar entre %s y %s.Versión Alineación vertical.Ver archivos como vista detalladaVer archivos como listaVistasAVISO: el uso del método de entrada XIM no está soportado y puede provocar problemas con la gestión de la entrada y parpadeos. Le recomendamos borrar el contenido de GTK_IM_MODULE o configurarlo como "ibus".Falló la espera de E/S en el descriptor epoll %dAlerta: PesoEuropa Occidental (ISO-8859-1)Europa Occidental con Euro (ISO-8859-15)Si la fuente está subrayada.BlancoPalabra completaSólo palabras completasTema Win32VentanaWindowFrameWindowTextWindows Árabe (CP 1256)Windows Báltico (CP 1257)Windows Centro Europeo (CP 1250)Windows Chino simplificado (CP 936) or GB-2312Windows Chino tradicional (CP 950) o Big-5Windows Cirílico (CP 1251)Windows Griego (CP 1253)Windows Hebreo (CP 1255)Windows Japonés (CP 932) o Shift-JISWindows Johab (CP 1361)Windows Coreano (CP 949)Windows Tailandés (CP 874)Windows Turco (CP 1254)Windows Vietnamita (CP 1258)Windows European Occidental (CP 1252)Windows/DOS OEM (CP 437)Windows/DOS OEM Cirílico (CP 866)Error de escritura en el archivo '%s'Error de parseo de XML: '%s' en la línea %dXPM: ¡Datos de píxel erróneos!XPM: definición de color incorrecta en línea %dXPM: ¡formato de cabecera incorrecto!XPM: ¡definición de color '%s' incorrecta en línea %d!XPM: ¡no quedan colores para la máscara!XPM: ¡datos de imagen truncados en la línea %d!AmarilloSíNo puede añadir un directorio nuevo a esta sección.Ha introducido un valor incorrecto. Pulse ESC para cancelar la edición.AcercarA&cercarA&lejarAcercarAlejar&Ajustar al tamañoAjustar al tamañouna aplicación DDEML ha creado una condición acelerada prolongada.una función DDEML fue llamada sin llamar primero a la función DdeInitialize, o se pasó un identificador de instancia no válido a una función DDEML.el intento de un cliente de establece conversación falló.fallo al reservar memoria.fallo al validar un parémetro por DDEML.una petición para una transación síncrona ha finalizado.una petición para una transacción de datos síncrona ha finalizado.una petición para una transación de ejecución síncrona ha finalizado.una petición para una transacción síncrona de revisión ha finalizado.una petición para una transacción síncrona de auditoría ha finalizado.se intentó una transacción de servidor en una conversación que fue finalizada por el cliente, o el servidor terminó antes de completar una transacción.fallo en la transacción.una aplicación inicializada como APPCLASS_MONITOR ha intentado llevar a cabo una transacción DDE, o una aplicación inicializada como APPCMD_CLIENTONLY ha intentado realizar transacciones de servidor.ha fallado una llamada interna a la función PostMessage. ha ocurrido un error interno en DDEML.se pasó un identificador de transacción no válido a la función DDEML. Una vez que la aplicación haya retornado desde una llamada XTYP_XACT_COMPLETE, el identificador de la transacción para esa llamada deja de ser válido.suponemos que es un archivo zip multiparte concatenadointento de cambiar clave inmutable '%s', ignorado.argumentos erróneos a la función de bibliotecafirma erróneadesplazamiento erróneo al elemento del archivo zipbinarionegritacompilación %luno se puede cerrar el archivo '%s'no se puede cerrar el descriptor de archivo %dno se pueden hacer efectivos los cambios en archivo '%s'no se puede crear el archivo '%s'no se puede eliminar el archivo de configuración de usuario '%s'no se puede determinar si el final del archivo con descriptor %d se ha alcanzadono se puede encontrar el directorio central del ZIPno se puede obtener el tamaño del archivo con descriptor %dno se encontró el directorio HOME del usuario; se usa el directorio actual.no se puede vaciar el descriptor de archivo %dno se puede alcanzar posición de búsqueda en el descriptor de archivo %dno se puede cargar ninguna fuente, abortandono se puede abrir el archivo '%s'no se puede abrir el archivo de configuración global '%s'.no se puede abrir el archivo de configuración de usuario '%s'.no puede abrirse el archivo de configuración de usuario.no se puede reinicializar el flujo de compresión de zlibno se puede reinicializar el flujo de descompresión de zlibno se puede leer desde el descriptor de archivo %dno se puede eliminar el archivo '%s'no se puede eliminar el archivo temporal '%s'no se puede buscar en el descriptor de archivo %dno se puede guardar el buffer '%s' al disco.no se puede escribir el descriptor de archivo %dno puede escribirse el archivo de configuración de usuario.activadaerror de suma de comprobaciónfallo de suma de comprobación leyendo bloque de cabecera de tarcmerror de compresiónfechaerror de descompresiónpredeterminadodoblevolcado de estado de proceso (binario)decimoctavooctavoundécimola entrada '%s' aparece más de una vez en el grupo '%s'error en formato de datoserror al abrir el archivoerror al leer el directorio central del ZIPerror al leer la cabecera local del archivo ziperror al escribir el elemento de zip '%s': crc o longitud erróneoserror escribiendo la entrada zip '%s': el archivo es demasiado grande, necesita ZIP64negrita extraextrapesadaextraligerafallo al evaluarno se pudo limpiar el archivo '%s'falsodecimoquintoquintoarchivo «%s», renglón %zu: «%s» ignorado después de cabecera de grupo.archivo «%s», renglón %zu: se esperaba «=».archivo «%s», renglón %zu: se encontró la clave «%s» por primera vez en el renglón %d.archivo «%s», renglón %zu: se ignoró el valor para la clave inmutable «%s».archivo «%s»: carácter %c inesperado en el renglón %zu.archivosprimerotamaño de fuentedecimocuartocuartogenerar mensajes de log explicativospesadaimagenbloque de cabecera incompleto en tarcadena de identificador de suceso incorrecta; falta el puntotamaño incorrecto para elemento de TARentrada comprimida usando una opción XZ desconocidala entrada está corrompidala entrada no está en formato XZdatos no válidos en la cabecera de TAR extendidavalor de retorno de bandeja de entrada no válidoarchivo ZIP no válidocursivaAñadirAlt+AtrásRetrocesoCancelarMayúsculaLimpiarOrdenCtrl+DecimalEliminarEliminarDividirAbajoFinIntroEscEscapeEjecutarFAyudaInicioInsertarInsertarKP_KP_AddKP_BeginKP_DecimalKP_DeleteKP_DivideKP_DownKP_EndKP_EnterKP_EqualKP_FKP_HomeKP_InsertKP_LeftKP_MultiplyKP_NextKP_PageDownKP_PageUpKP_PriorKP_RightKP_SeparatorKP_SpaceKP_SubtractKP_TabKP_UpIzquierdaMenúMultiplicarNum *Num +Num ,Num -Num .Num /Num =Num InicioNum EliminarNum AbajoNum FinNum IntroNum InicioNum InsNum BloqNum Av PágNum Re PágNum DerechaNum EspacioNum TabNum ArribaNum IzquierdaBloq_NumPágina abajoPágina arribaAvPágRePágPausaAvPgRePgImprimirRawCtrl+RegresarDerechaESPECIALBloq DesplBloq_desplSeleccioneSeparadorMayúsculas+InstantáneaEspacioSustraerTabuladorArribaWindows_IzquierdaWindows_MenúWindows_Derechaaltctrlnum rawctrlmayúsculasno se pudo inicializar libcurlligeraAcerca de %sAcerca de…Ocultar %sOcultar aplicaciónOcultar otrosPreferencias...Salir de %sSalir de la aplicaciónServiciosMostrar todomediamedianochedecimonovenonovenono hay error DDE.no hay errorno se han encontrado tipos de letra en %s; se usa el tipo incorporadoanónimomediodíanormalnúmlos objetos no pueden tener nodos XML de textomemoria agotadadescripción del contexto de procesoptpxerror de lecturaal leer flujo de zip (elemento %s): crc erróneoal leer flujo de zip (elemento %s): longitud erróneaproblema de reentrada.segundoerror de búsquedanegrita mediadecimoséptimoséptimomostrar este mensaje de ayudadecimosextosextoespecifique el modo de pantalla a usar (ej.: 640x480-16)especifique el tema a usarAy&udaestándar/círculoestándar/circunferenciaestándar/diamanteestándar/cuadradoestándar/triángulolongitud del archivo almacenada no está en la cabecera del ZipcadtachadoFlechaVacíoDianaCarácterCruzPredeterminadoManoI-BeamBotón izquierdoLupaBotón centralNo hay entradaBrochaLápizApuntar a la izquierdaApuntar a la derechaPregunta FlechaFlecha derechaBotón derechoDimensionadoDimensionado N-SDimensionado NE-SODimensionado NO-SEDimensionado O-EAerosolEspereEspera FlechaMirarelemento tar no abiertodécimola respuesta a la transacción causó que se activase el bit DDE_FBUSY.finatercerodecimotercerohoymañanaignorada la barra inversa al final de '%s'.Andriy Byelikov https://github.com/andriybyelikovverdaderoduodécimovigésimodesactivadasubrayadosin determinar" inesperada en la posición %d en '%s'.fin de archivo inesperadodesconocidodesconocido (%lu)clase %s desconocidaerror de compresión desconocidoerror de descompresión desconocidoerror desconocidoerror desconocido (código %08x).desconocido-%danónimoanónimo%dno se admite el método de compresión ZIPse usa el catálogo «%s» de «%s».error de escriturawxGLCanvas está soportado actualmente sólo en Wayland y X11. Puede solucionarlo modificando la variable de entorno GDK_BACKEND=x11 antes de iniciar su programa.wxGetTimeOfDay falló.wxWidgets no pudo abrir el 'display' para '%s': saliendo.wxWidgets no pudo abrir el display. Saliendo.xxxxayererror de zlib %d~tqsl-2.8.1/apps/lang/fi/0000755000175000017500000000000015003421124014755 5ustar rmurphyrmurphytqsl-2.8.1/apps/lang/fi/tqslapp.mo0000644000175000017500000024003615003421124017003 0ustar rmurphyrmurphy ,:::,::&;6;O;)l;0;;+;7<DF<<<<<<=.0=)_=V=G=(>=>X>_>;u> >>>$>? ?"?>?D?$J?o? ??<?#?%@'.@V@)h@D@$@@&A&+A7RA A A5AAA: BTGBBBB BBC C C'C/C7CC{C'C!C$CC& D3D%D0D6 EBDE EEEEE FF$FAFGFPFiaFF FF FFG"G1G KGUG oG zG GG'GGGVG?UH/H(HH+I#0I)TI~I I!I I=IJ%J9JPJ'dJJJ&JJKS*K ~KK4KK(K$L@L.M;3MAoM3M+M=NBONYNINF6OT}OOO#O'P59P oP}PP P P PPPPPPQ-3QaQ|QiQ Q Q R,RBRVReR@jR}R)S;SBSKSdS~SS(S#S(ST+;TgT<T!T'T/U(8U/aUU;UUUV!V1&VXVnV VVVVV,VW(W^%D^j^|^^^H^Q_IV_ _ _0_5_!`&&`M`U`Bd`U``a "a-aAarambccd|7ee eee(f@f^fnRh1i,iS j'tjjjj1j:k-Ak-ok-kkkk' l"2l$Ul!zll8mRAmPmNm4nKnan}nnnn nn+n'o*oDo _omosoooo o ooo ooooop@#pdpspp pppppq q;qcZqqIrPrmrprrrrs)s HsRs msxssBs8s t,t3tHthtyttt t t2tu5(uG^u_u=vcDvv"vRvT6w w wwww$wx4x&Jxqx xx xx x xxx#xyy!y3:yny6yyFyLz-fzdzxz7r|k|} }@}I}]}l}"}}}$}"}~)~$;~`~~~~~~&~I Wl>s   !'= eq#ƀ #(Cl$|*́-&F`y*.)܂&8Hfw+:(4!N#p…ޅ/K+g ÆΆֆ  (32I |(wЇ'HLpJ 0&G&n,+‰9\*+]_K\^6g%čD3',[}1(/0X.\u515)a#ɕ[awC5.y+4ԗ! +I avlu$Ew3b9DЛ8N^S=V[^1d6;͞+ 5L]]N% ,0]BzRܠC/s֡ݡ&,)KuTǣ ܣ&8Ǥ56<QƦs.EϨHhe&6_]<"0/N ~]A!?$aԮ+ :5Qp¯1 \<YDZ:! \gn ; в ڲ   +8Mg_Ǵ ˴4ٴJ.y./Ƶ;%25X=W̶"$G)c%'#۷353fiRи#$8]f< ǹϹ ). Xb'h 6ʺ",$8Q6Gһ+F%N%t7Ҽ>'5]>vX,;(Cl!  ˾־ݾ81/:%j0%,(-3C$ h%v& "$ GT\p ' 9Zq  $9@V\kA* -5c(z00 '*FR3"2UtZ8-"f)$0 ;RVBAM.j|sa[\"&<>R![} (C'U }` '.CSqc#&7Uu%M!/@%pG<T[w;#$ =H"W4z"$'&2F!y$34-R0,i>o(-2,8"e(-&=*D o!+/11@=r57:0Y:< R#Av =!>+Frg\8r  * +Kw%| BMQm v8xHyT/x%0($ .a>v9.Qp3%5M7eF;6 5W#"#*$NvsUWFQ  ;I ^k 6'- F S anuz!D0u$&(ELBgx20~ %   P0i)$9L c n-z0:G#<kS!N;L &0G0c8 # ,7Rm < 69 p6MV2>P+v 6%3Yb($&#%:`v+c=XKj &+-R.&&:S.g2-3 "=$`2& 26R8/2b9 A ?& Cf : A $' &L )s        %, R d  }  1       /-  ] (k  z 80mic ;<I /7/.P,8.e{~3$)[[wY-n#&%=McF3@z6ppzIm+0A ,V !  *  } !!"(""YW##@3$0t$B$<$ %%m0%%g'~'' 'L'P';6(:r(!((q(hX)&)1)'*LB*&*f*]+{++ ++(+ +,, ,92,%l,.,',.,%-X>--l.~.. ...8H/)/;/./"0-90g0112,X334Y5l[55/6p6D`7 7F7. 8!<8o^9d903:.d::::::.;16;Nh;;<7:=pr==7=n2>P> >>? ?7#?[? b?n?s?$? ?????@: j`8tcI%c-r~\,AVjCH9Y-'9Bm<{")?3 ^W&' +D\._s>+W58&VwgJK}@kN;(OZs0yn R9MYHX)$RrG;NU]l\|Pm$ohwIBVFq*Sz=!U^<xGFj/Fyf b2a< =d7G ota_~~2x| p %4IBn8+rYlQPS*g7'L| DeLvc K2N/7 okv@ p nK3:aMh!z#dJ{A{m}e1QzkOs[XP"puu>,g]wbMWulLC}56#E;"fqv],?Ri6Z1-_)6%OTxU$=E@`fd[`hiq^ J4b#A5:>(!Q0E TiHX&S1CZ/ e[4 D?(T.3*.0ty to %d QSO Records%d of %d QSOs are previously signed; aborted%s Uploaded with result: %s%s is ready to be emailed or uploaded.%s uploaded successfully%s uploaded with result: %s%s: %d QSO records were previously signed%s: %d QSOs were outside the selected date range%s: %s upload was rejected%s: %s upload was rejected with result "%s"%s: Couldn't upload the file: CURL returned "%hs" (%hs)%s: Got an unexpected response on %s upload! Maybe the site is down?%s: Invalid Grid Field%s: Invalid Grid Square%s: Invalid Grid Sub-subsquare%s: Invalid Grid Subsquare%s: Invalid Gridsquare Format%s: Log uploaded successfully%s: Log uploaded successfully with result: %s%s: Unable to connect to the upload site.%s: Unable to upload - either your Internet connection is down or LoTW is unreachable.%s: Unable to upload. The network is down or the LoTW site is too busy.%s: Upload cancelled%s: wrote %d records to %s&About&Add Station Location&Backup Station Locations, Certificates, and Preferences...&Contents&Delete&Delete Callsign Certificate&Display Station Location Properties&Edit&Edit Station Location&Edit existing ADIF file...&File&Help&Load Callsign Certificate from File&Preferences...&Properties&Renew Callsign Certificate&Restore Station Locations, Certificates, and Preferences...&Restore a Deleted Station Location&Save Callsign Certificate to File...&Sign and save ADIF or Cabrillo file...&Station Location&Test Signing an ADIF or Cabrillo file...'Satellite' propagation mode selected, so a Satellite must be chosen'Save Callsign Certificate' command.A new TQSL release (V%s) is available!A new TQSL release (V%s) is available.A new TrustedQSL configuration file (V%s) is available.ADIF Mode:ADIF ModesADIF content is not valid. '%hs' is not valid for %hsADIF field has invalid contentsADIF file extensions:ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*.*)|*.*Aborting due to user cancellingAboutActive, usable certificatesAdd ADIF modeAdd ADIF mode mapping:Add QSOAdd Station LocationAdd...AddressAdministrator ErrorAfter reading this message, you may close this program.AlertAll QSOs are previously signed; abortedAllow TQSL to continue this time.Allow automatic configuration backupAllow nonamateur call signsAlways allow running as Administrator.An updated TrustedQSL configuration file (V%s) is available! The configuration file installs definitions for entities, modes, etc.Another copy of TQSL is signing a logAre you sure you want to delete the certificate?Are you sure you want to delete this station location?Are you sure you want to proceed? Click 'No' to review the choicesAre you sure?Attempting to upload %d QSOsAttempting to upload %sAttempting to upload one QSOAwaiting response from ARRLBackup ErrorBackup File Folder:Backup operation failed: %hsBand:Begins: Buffer too smallCAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause issues with handling awards.CONTESTCONTEST Name:CQ ZoneCQ Zone: Cabrillo CONTESTCabrillo CONTEST definitions:Cabrillo SpecsCabrillo file extensions:Call SignCall Sign cannot be emptyCall Sign:Call sign:Call sign: Call-Worked Field Number:Call-worked field must be %d or greaterCallsign &CertificateCallsign CertificateCallsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*.tq6;*.TQ6Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6Callsign Certificate does not match QSO detailsCallsign Certificate not TQSL compatibleCallsign CertificatesCallsign certificate could not be installedCan't open TQSL update file %s: %hsCan't open new configuration file %s: %hsCancelCancelledCertificate Authority certificateCertificate Container PassphraseCertificate Container files (*.p12)|*.p12|All files (*.*)|*.*Certificate ExpiringCertificate Issuer:Certificate PropertiesCertificate RequestCertificate not initialized for signingCertificate provider not foundCertificate saved in file %sCertificates replaced with a newer oneCertificates that have expiredChanges have not been savedChanges to the status message configuration will take affect when TQSL is restartedCheck ErrorCheck for &Updates...Check for updates to tqsl and the configuration fileChecking for TQSL updates...Choose a Callsign Certificate to restoreChoose a Station Location to restoreChoosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'CityClick 'Cancel' if this is not the correct Station Location.Click 'Cancel' to abandon processing this log file (Recommended).Click 'Cancel' to abandon processing this log file.Click 'Cancel' to abandon signing this log.Click 'Finish' to complete this Callsign Certificate request.Click 'Ignore' to continue signing this log while ignoring errors.Click 'New QSOs Only' to sign normally, without the previously signed QSOs (Recommended).Click 'OK' to install the new configuration file, or Cancel to ignore it.Click 'OK' to install the new version of TQSL, or Cancel to ignore it.Click 'Re-Upload QSOs' to re-process this log while allowing previously signed QSOs.CloseCommand Syntax ErrorConfiguration file cannot be openedConfiguration file successfully updatedConfiguration files (*.tbk)|*.tbk|All files (*.*)|*.*Confirm CloseContestContest name cannot be blankContest typeContinentConverting Could not spawn upload thread!CountryCountyCounty: Create &New ADIF file...Create a new Station LocationCreate an ADIF file for signing and uploadingCustom ADIF mode mappings:DELETEDDO NOT lose the passphrase you choose! You will be unable to use the Certificate without this passphrase!DXCC EntityDXCC Entity: DXCC entity:Data for this DXCC entity could not be foundDatabase Error: %hsDatabase errorDateDate of the first QSO you made or will make using this callsign:Date of the last QSO you made or will make using this callsign: (Leave this date blank if this is still your valid callsign.)Date out of rangeDeleteDelete "Delete Station Location Delete a Station LocationDia&gnostic ModeDisplay &DocumentationDisplay Callsign Certificate &PropertiesDisplay Station Location PropertiesDisplay Station Location Properties for Display a Callsign CertificateDisplay a Callsign Certificate's PropertiesDisplay command line helpDisplay details of previously signed QSOs when signing a logDisplay or Modify &Preferences...Display status messages in separate tabDisplay the Callsign Certificate properties forDisplay the version information and exitDo you really want to keep this 'QSO end date'?Do you want to renew it now?Do you want to upload this certificate request to LoTW now?Download from:Duplicate QSO detectedE&xit TQSL Alt-XEditEdit (if used with -l) or create Station LocationEdit Station LocationEdit Station Location Edit Station Location : %hs - %sEdit a Station LocationEdit...Email: Enable a Network ProxyEnable passphrases for Callsign CertificatesEnd Date (YYYY-MM-DD)End date is invalidEnd date of %s is invalidEnter a name for this Station LocationEnter a passphrase for this callsign certificate.Enter again to confirm:Enter file to save toEnter new passphraseEnter passphraseEnter the Passphrase to unlock the callsign certificateEnter the name for the new Certificate Container fileEnter the passphrase again for verification:Enter the passphrase for the certificate container file.Enter the passphrase to unlock the .p12 file:Enter the passphrase to unlock the callsign certificate for %hs -- %hs (This is the passphrase you made up when you installed the callsign certificate.)ErrorError checking for expired callsign certificates:Error compressing before uploadError creating Callsign Certificate RequestError creating callsign certificate request: %hsError downloading new configuration file:Error downloading new file:Error downloading new version information:Error downloading update version information:Error importing station locations: %hsError opening certificate request file %s: %hsError opening diagnostic log %s: %hsError opening input fileError opening output fileError opening save file %s: %hsError parsing certificate for DXCC entityError parsing certificate for call signError parsing certificate for issuerError parsing saved configuration file: %hsError parsing station location file: %hsError performing automatic backup: %hsError renaming backup file %s: %hsError while accessing certificate storeError writing new configuration file %s: %hsError: Could not upload file (CURL Init error)Errors DetectedErrors: %dExit TQSL so I can re-run as a normal userExit after processing log (otherwise start normally)Expected nameExpiredExpires: Export P12 files compatible with Apple KeychainExport to %s failed: %hsFieldFile name for diagnostic tracking logFile syntax errorFile syntax error: %hsFinal Status: %hs (%d)Frequency (MHz):Grid %s is not correct for your %s. Click 'Next' again to use it anyway.Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it anyway.Grid %s is not correct for your QTH. Click 'Next' again to use it anyway.Grid SquareGrid Square: Gridsquare is inconsistent with Station LocationHandle QTH information in ADIF logs with what action?HelpI am the QSL manager for this callsignIOTA IDIOTA Locator: IOTA reference %s is not correct. Must have a number after the '-'IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, OC- or SA-IOTA value %s is not valid.ITU ZoneITU Zone: If so, choose a callsign below for the primary LoTW account. If not, click 'Finish', and a new LoTW account will be set up for these QSOs.If you are planning to restore from a backup, please choose 'No'.If you are sure that the earlier request is now invalid you should delete the pending Callsign Certificate for %s.If you are using a US callsign outside of the US persuant to CEPT, IARP or other Reciprocity arrangements, FCC rules require you to be a US Citizen.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence no passphrase need be specified.If you are using a computer system that is shared with others, you should specify a passphrase to protect this certificate. However, if you are using a computer in a private residence, no passphrase need be specified.If you set an end date, you will not be able to sign QSOs past that date, even if the Callsign Certificate itself is still valid.If you still hold this callsign (or if you plan to renew the license for the callsign), you should not set a 'QSO end date'.IgnoreIgnore QTH details from your logIgnore callsigns in ADIF filesIgnore seconds in QSO timesImport a certificate file (.p12 or .tq6)Import completed successfullyIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is recommended, but a logger that does its own upload tracking may incorrectly set the status in this case. A logger that doesn't track uploads should be unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, will correctly mark all selected QSOs as sent - they are in your account even though they would not be in this specific batchIn the meantime, please note that some loggers may exhibit strange behavior if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is usually safe, but a defective logger not checking the status messages reported by TrustedQSL may produce strange (but harmless) behavior such as attempting to upload an empty file or marking all chosen QSOs as 'sent'Incomplete Certificates - requires a matching TQ6Incorrect passphrase when importing P12 fileIncorrect settings can cause TQSL to be unable to upload logs or check for updates.Input ADIF or Cabrillo log file to signInstall CertificateInvalid %hs: "%hs"Invalid argumentInvalid contact - QSO does not specify a CallsignInvalid contact - QSO does not specify a band or frequencyInvalid contact - QSO does not specify a dateInvalid contact - QSO does not specify a modeInvalid contact - QSO does not specify a timeInvalid date formatInvalid error code: %dInvalid time formatInvalid zone selections for DXCC entityInvalid zone selections for oblastInvalid zone selections for provinceInvalid zone selections for stateIs this new certificate for a callsign where you already have a LoTW account, and you want the QSOs for this call to be added to an existing LoTW account? LanguageLeave the passphrase blank and click 'Finish' unless you want to use a passphrase.Leave the passphrase blank and click 'Next' unless you want to use a passphrase.Leave the passphrase blank and click 'OK' unless you want to use a passphrase.LoTW Connection FailedLoad Certificate FileLoad a Callsign CertificateLoading completeLocation data errorLog FileLog File ErrorLog HandlingLog OperationsLog files (*.log)|*.log|All files (*.*)|*.*Log in to the Logbook of the World SiteMemory allocation failureMissing from this computerMode ConflictMode:More details at:NO ERRORNONENameName existsNetwork ProxyNew DBNew PassphraseNew QSOs OnlyNew passphraseNew passphrase:New...No Callsign CertificatesNo CertificateNo Certificate Request matches the selected Callsign CertificateNo Private KeyNo QSO recordsNo QSOs to uploadNo UpdatesNo callsign certificate for keyNo logfile to sign!No records outputNo status information availableNoneNone of these applyNote: TQSL assumes that this file will be uploaded to LoTW.Note: TQSL has not recorded signing these QSOs. You can submit this log file to LoTW or discard it.Note: The e-mail address you provide here is the address to which the issued Certificate will be sent. Make sure it's the correct address!NoticeNumber of Backups to retain:OKOK to install OblastOblast: Once you supply the requested information and the request file has been created, you must send the request file to the certificate issuer.One QSO RecordOpen ADIF files in ADIF editorOpen FileOperator aborted operationOperator: OptionsOrganization: Output file name (defaults to input name minus extension plus .tq8Override Station Location with QTH details from your logPKCS#12 file not TQSL compatiblePark: Passphrase confirmedPassphrase entries do not matchPassphrase errorPassphrase for the signing keyPassphrase not correctPassphrase protectedPassphrase:Passphrase: Please choose a callsign for this Station LocationPlease choose language:Please install a callsign certificate then try again.Please review the introductory documentation before using this program.Please select a Callsign Certificate for the account where you would like the QSOs to be storedPlease select a Callsign Certificate to validate this requestPlease select the Callsign Certificate for your current personal callsign to validate your request.Please try again later.Please try uploading the %s later.Please verify that this is the correct Station Location for the QSOs being signed.Please wait until you receive an e-mail bearing your requested Callsign Certificate.Port Number:PreferencesPreviously Signed QSO detectedPreviously Signed QSOs DetectedPreviously Signed: %dPreviously signed QSOs were detectedPreviously signed: %dPrivate Key not foundPrompt for QSO Date range when signingPropagation Mode:PropertiesProvinceProvince: Proxy Address:Proxy Type:ProxyTypeQSO DataQSO Data ErrorQSO Data: Invalid Mode ignored - %sQSO Date RangeQSO End Date: QSO Frequency is invalidQSO Frequency is out of range for the selected bandQSO RX Frequency is invalidQSO RX Frequency is out of range for the selected bandQSO Start Date: QSO begin date: You must choose proper values for Year, Month and Day.QSO date is not within the date range specified on your Callsign CertificateQSO end date cannot be before QSO begin date.QSO end date: You must either choose proper values for Year, Month and Day or leave all three blank.QSO records signed using the Certificate will not be valid for DXCC award credit (but will be valid for other applicable awards). If the Certificate is to be used for signing QSOs from maritime/marine mobile, shipboard, or air mobile operations, that is the correct selection. Otherwise, you probably should use the "Back" button to return to the DXCC page after clicking "OK"QSOs for %hs will be stored in the LoTW account for %s.QSOs prior to the starting date or after the ending date will not be signed or included in the output file.QSOs: %dQuiet Mode - same behavior as -xRX Band:RX Frequency (MHz):Re-Upload QSOsRenew a Callsign CertificateRenew the Callsign Certificate forReplacedReport on QTH differencesRequest &New Callsign Certificate...Request a new Callsign CertificateRequest cancelledRestore Complete.Restore Deleted Callsign CertificateRestore operation failed: %hsRestoring Callsign CertificatesRestoring PreferencesRestoring QSO recordsRestoring Station LocationsRestoring callsign certificate for %hsResubmitting these QSOs will cause them to be reported as already signed.Resulting TQSL mode:Retry?Satellite choice requires that Propagation Mode be 'Satellite'Satellite:Save FileSave Station DataSave a Callsign CertificateSave operation complete.Save requestSave the Callsign Certificate forSaved configuration files (*.tbk)|*.tbkSaving QSOsSaving Station LocationsSaving TQSL PreferencesSaving callsign certificate for %hsSaving callsign certificatesSelect CallsignSelect Certificate FileSelect Station DataSelect Station Location for SigningSelect a Callsign Certificate to processSelect a FolderSelect a Station Location to processSelect a Station Location to process Select file to SignSelect file to write toSelect or enter name of this station locationSelect saved configuration fileSelected Station LocationSelects Station LocationSerial: Sign a log and save it for uploading laterSign a log and upload it automatically to LoTWSign and &upload ADIF or Cabrillo File...Signing File: Signing QSO DataSigning abandonedSigning abortedSigning aborted due to errorsSigning aborted.Signing cancelledSigning using Callsign %hs, DXCC Entity %hsSince you have no Callsign Certificates, you must submit an 'Unsigned' certificate request. This will allow you to create your initial Callsign Certificate for LoTW use. Click 'Finish' to complete this Callsign Certificate request.Some QSOs not processedSpecify QSO verification action - ignore, report or updateSpecify default callsign for log signingSpecify dialog action - abort, all, compliant or askSpecify end date for QSOs to signSpecify start date for QSOs to signStart Date (YYYY-MM-DD)Start date is invalidStart date of %s is invalidStateState: Station Data input completeStation LocationStation Location NameStation Location PropertiesStation Location data errorStation Location does not match QSO detailsStation LocationsStation name must be providedStatus LogSuccessSuppress date range dialogSystem error: %hsSystem error: %hs : %hsTQSL ConfirmTQSL ErrorTQSL Update AvailableTQSL Version %hs and Configuration Data Version %sTQSL WarningTQSL compressed data files (*.tq8)|*.tq8TQSL data files (*.tq7)|*.tq7TQSL is unable to sign QSOs because another instance of TQSL is busy. Terminate any other copies of TQSL and try again.TQSL must not be run 'As Administrator'TQSL must wait for other running copies of TQSL to exit before backing up...TQSL must wait for other running copies of TQSL to exit before signing ...TQSLLib ErrorThe %s '%hs' has value '%hs' while QSO has '%hs'The -a parameter %hs is not recognizedThe -f parameter %hs is not recognizedThe TQSL configuration file cannot be parsedThe TQSL upload tracking database is lockedThe callsign %s is not currently registered in the FCC ULS database. If this is a newly registered call, you must wait at least one business day for it to be valid. Please enter a currently valid callsign.The callsign certificate for callsign %hs has expired. This station location cannot be used to sign a log file until a valid callsign certificate is installed.The callsign is too long. Only %d characters are allowed.The certificate for %hs expires in %d daysThe certificate for %hs expires in %d days.The date of your first QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your first QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is after the last valid date (%hs) of the selected DXCC Entity %hsThe date of your last QSO is before the first valid date (%hs) of the selected DXCC Entity %hsThe file has not been saved. Should the QSOs be saved?The format of this file is incorrect.The invalid data was ignored.The log being signed has '%hs' set to value '%hs' which is not validThe log file you are uploading using your QSO Logging system consists entirely of previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The log file you are uploading using your QSO Logging system includes some previously uploaded QSOs that create unnecessary work for LoTW. There may be a more recent version of your QSO Logging system that would prevent this. Please check with your QSO Logging system's vendor for an updated version.The only reason to re-sign previously signed QSOs is if a previous upload was not processed by LoTW, either because it was never uploaded, or there was a server failureThe private key for callsign %hs serial %ld is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe private key for this Callsign Certificate is not present on this computer; you can obtain it by loading a .tbk or .p12 fileThe selected callsign could not be foundThe selected station location could not be foundThe two copies of the passphrase do not match.There are no callsign certificates for callsign %hs. This station location cannot be edited.There are no current callsign certificates for callsign %hs. This station location cannot be used to sign a log file.There are no deleted Callsign Certificates to restoreThere are no deleted Station Locations to restoreThere are no valid callsign certificates for callsignThere is a newer callsign certificate for callsign %hs. This station location cannot be used to sign a log file until the new certificate is installed.There is no valid callsign certificate for %hs in entity %hs available. This QSO cannot be signedThis Callsign Certificate cannot be installed as it has expired. Check if your computer is set to the proper date and that this is the latest Callsign Certificate. This Callsign Certificate cannot be installed as the first date where it is valid is in the future. Check if your computer is set to the proper date. This Callsign Certificate request requires approval using an existing Callsign Certificate.This address must match the FCC ULS database. If this address information is incorrect, please correct your FCC record.This callsign certificate is already active and cannot be restored.This callsign certificate is already installedThis callsign replaces my existing callsignThis file can not be processed due to a system errorThis file is not a valid P12 fileThis is a DXpedition callsignThis is a club callsignThis is a special event callsignThis is my former callsignThis log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and %d QSOs which are new.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and no new QSOs.This log contains %d QSO(s) which appear to have been previously signed for upload to LoTW, and one QSO which is new.This log has invalid QSO informationThis log has too many previously uploaded QSOs. Please only upload new QSOs or break the log into smaller pieces (50,000 QSOs or less).This mode definition conflicts with a standard mode definition for %sThis passphrase will have to be entered each time you use this callsign certificate for signing or when saving the key.This should be corrected before signing a log file.This will create a new Callsign Certificate request file.This will remove the selected callsign certificate from your system.This will remove this station location from your system.TimeTo import this passphrase protected P12 file, you must pass the passphrase on the command lineTo submit the signed log file to LoTW: 1. Move the signed log file to a computer with internet access 2. Log in to your LoTW Web Account 3. Select the Upload File tab 4. Click the Choose File button, and select the signed log file you created (%s) 5. Click the Upload file button Alternatively, you can attach the signed log file to an email message, and send the message to lotw-logs@arrl.orgTrusted root certificateTypeUPURL: US 1x1 callsign requests must provide an end dateUS 1x1 callsigns must end in letters A-Z excluding 'X'US 1x1 callsigns must have a number as the second characterUS 1x1 callsigns must start with W, K, or NUTC Date (YYYY-MM-DD):UTC Time (HHMM):Unable to check for updates - either your Internet connection is down or LoTW is unreachable.Unable to check for updates. The network is down or the LoTW site is too busy.Unable to connect to the update site.Unable to initialize random number generatorUnable to open %s for outputUnable to open ca-bundle.crt. Your TQSL installation is incompleteUnable to read - no permissionUnable to update - either your Internet connection is down or LoTW is unreachable.Unable to update. The network is down or the LoTW site is too busy.Undelete ErrorUnexpected LoTW ResponseUnknownUnknown custom errorUnusable: Missing Private KeyUpdateUpdate CompletedUploadUpload RejectedUpload after signing instead of savingUploading Callsign CertificateUploading Callsign Certificate Request...Uploading Signed DataUploading signed log data...Uploads database errorUse the "New" Button of the dialog you're about to see to define a Station Location.Use these settings to configure a network proxy for Internet uploads and downloads. You should only enable a proxy if directed by your network administrator.User CancelledValueVerify QTH details: WPX PrefixWarningWarning: The TQSL ADIF editor only processes a limited number of ADIF fields. Using the editor on an ADIF file can cause QSO details to be lost!What is this Callsign Certificate for?Wipe the TQSL uploads databaseWould you like to back up your callsign certificate now?Would you like to request a callsign certificate now?Wrote %d QSO records to %sYou WILL be able to recover it from a container (.p12) file,You cannot request a Callsign Certificate for a former callsign unless you hold a valid Callsign Certificate to be used to verify that request.You cannot request a certificate for a 1x1 callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot request a certificate for a portable callsign as you must sign those requests, but you have no valid Callsign Certificates that you can use to sign this request.You cannot select DXCC Entity NONE as you must sign any request for entity NONE and you have no valid Callsign Certificates that you can use to sign this request.You do not need an account on LoTW to do this.You have already requested a Callsign Certificate for %s and can not request another until that request has been processed by LoTW Staff.You have already requested more than three Callsign Certificates for %s in the past 24 hours. You should submit a request only once, then wait for that request to be processed by LoTW Staff. This may take several business days.You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: You have changed the following fields in this Station Location: %s Do you want to discard those changes?You have chosen a QSO end date for this Callsign Certificate. The 'QSO end date' should ONLY be set if that date is the date when that callsign's license expired or the license was replaced by a new callsign.You have no Station Locations defined.You have no callsign certificate installed on this computer with which to sign log submissions.You have no callsign certificates to use to sign a log file.You have selected DXCC Entity NONEYou may leave either date (or both dates) blank.You may now send your new certificate request (You may protect this Callsign Certificate using a passphrase. If you are using a computer system that is shared with others, you should specify a passphrase to protect this Callsign Certificate. However, if you are using a computer in a private residence, no passphrase need be specified.You may set the starting and/or ending QSO dates in order to select QSOs from the input file.You must define at least one Station Location to use for signing.You must enter a valid call sign.You must enter a valid email addressYou must enter your addressYou must enter your cityYou must enter your nameYou must select a %hsYou must select a DXCC entity.You must select a band or enter a frequencyYou will NOT be able to recover it by loading a .TQ6 file.You will have to enter the passphrase any time you load the file into TrustedQSL.You will not be able to use this tq6 file to recover your callsign certificate if it gets lost. For security purposes, you should back up your certificate on removable media for safe-keeping.Your QTH Details changed for this QSO. Originally these were: %s Now they are:%s Please verify that you intended to change this QSO! Your certificate request did not upload properly.Your custom mode map %s conflicts with the standard mode definition for %hs and was deleted.Your e-mail addressYour system is up to dateYour upload appears to have failed. Do you want to save this request for uploading later?Your upload appears to have failed. Should TQSL try again?Zip/Postal[None]are the newest availablecertificate?if you have created one via the Callsign Certificate menu'sin entityon line %dor see:tQSL Cert Request files (*.to TQSL formatto:|ADIF files (|All files (|All files (*.*)|*.*|Cabrillo files (Project-Id-Version: TQSL V2.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2025-02-16 18:01-0500 PO-Revision-Date: 2025-03-01 10:27+0200 Last-Translator: Juhani Tapaninen Language-Team: Language: fi_FI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 3.3.2 - %d QSO-tietoa%d %d:sta QSO:sta on jo allekirjoitettu; keskeytetty%s lähetettiin tuloksella: %s%s on valmis sähköpostitse lähetettäväksi tai ladattavaksi palveluun.%s lähetettiin onnistuneesti%s: lähetettiin onnistuneesti tuloksella: %s%s: %d QSO-tietueet oli aiemmin allekirjoitettu%s: %d QSO:a oli valitun päivämääräalueen ulkopuolella%s: %s lähetyksestä kieltäydyttiin%s: %s lähetyksestä kieltäydyttiin tuloksella "%s"%s: Ei voitu lähettää tiedostoa: CURL palautti "%hs" (%hs)%s: Vastauksena %s lähettämiseen tuli odottamaton vastaus! Ehkä palvelu on alhaalla?%s: Virheellinen lokaattorikenttä%s: Virheellinen lokaattori%s: Virheellinen lokaattorin ali-aliruutu%s: Virheellinen lokaattorin aliruutu%s: Virheellinen lokaattoriruudun muoto%s: Loki lähetettiin onnistuneesti%s: Loki lähetettiin onnistuneesti tuloksella: %s%s: Ei pystytä yhdistämään tallennuspalvelimelle.%s: Ei pystytä lähettämään - joko internet-yhteytesi on alhaalla tai LoTW:iin ei saada yhteyttä.%s: Ei voida lähettää. Verkko on alhaalla tai LoTW-palvelin on liian kiireinen.%s: Lähetys peruttu%s: kirjoitettiin %d tietoa %s:ään&Tietoja&Lisää aseman sijainti&Varmuuskopioi asemien sijainnit, varmenteet ja asetukset...&Sisältö&PoistaP&oista kutsumerkin varmenne&Näytä aseman sijaintitiedot&Muokkaa&Muokkaa aseman sijaintia&Muokkaa olemassaolevaa ADIF-tiedostoa...&Tiedosto&Ohje&Lataa kutsumerkin varmenne tiedostosta&Asetukset...&Ominaisuudet&Uudista kutsumerkin varmenne&Palauta asemien sijainnit, varmenteet ja asetukset...&Palauta poistettu aseman sijainti&Tallenna kutsumerkin varmenne tiedostoon...Allekirjoita ja tallennna ADIF- tai Cabrillo-tiedosto...&Aseman sijainti&Kokeile allekirjoittaa ADIF- tai Cabrillo-tiedosto..."Satelliitti" etenemistapa on valittuna, joten satelliitti on valittava"Tallenna kutsumerkin varmenne"-komennolla.Uusi TQSL-versio (V%s) on saatavissa!Uusi TQSL-versio (V%s) on saatavissa.Uusi TrustedQSL-kokoonpanotiedosto (V%s) on saatavilla.ADIF-lähetelaji:ADIF-lähetelajitADIF -sisältö ei ole pätevä. '%hs' ei ole pätevä %hs:lleAFIF-kentässä on virheellistä tietoaADIF-tiedostopäätteet:ADIF-tiedostot (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*ADIF-tiedostot (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files (*.*)|*.*Keskeytetään käyttäjän perumisen vuoksiTietojaAktiiviset, käyttökelpoiset varmenteetLisää ADIF-lähetelajiLisää ADIF-lähetelajin kuvaus:Lisää QSOLisää aseman sijaintiLisää...OsoiteJärjestelmävalvoja-virheVoit sulkea ohjelman tämän viestin lukemisen jälkeen.HälytysKaikki QSO:t on jo allekirjoitettu; keskeytettySalli TQSL:n suoritus tällä kertaa.Salli automaattinen kokoonpanon varmuuskopiointiSalli muut kuin radioamatöörikutsutSalli aina suoritus järjestelmänvalvojana.Päivitetty TrustedQSL-kokoonpanotiedosto (V%s) on saatavissa! Kokoonpanotiedosto asentaa määrittelyt maille, lähetelajeille jne.Toinen TQSL:n kopio allekirjoittaa lokiaHaluatko varmasti poistaa tämän varmenteen?Haluatko varmasti poistaa tämän aseman sijainnin?Haluatko varmasti jatkaa? Valitse "Ei", jotta voit valita uudelleenOletko varma?Yritetään lähettää %d QSO-tietoaYritetään lähettää %sYritetään lähettää yksi QSO-tietoOdottaa ARRL:n vastaustaVarmuuskopiovirheVarmuuskopiointihakemisto:Varmuustallennus epäonnistui: %hsTaajuusalue:Alkaa: Puskuri liian pieniHUOMAA: Toisiinsa liittymättömien kutsumerkkien QSO:jen lisääminen samalle LoTW-tilille voi aiheuttaa ongelmia awardien käsittelyssä.KILPAILUKILPAILUN nimi:CQ-zoneCQ-zone: Cabrillo KILPAILUCabrillo KILPAILU-määrittelyt:Cabrillo-määrittelytCabrillo-tiedostopäätteet:KutsumerkkiKutsumerkki ei voi olla tyhjäKutsumerkki:Kutsumerkki:Kutsumerkki: Työskennelty-kutsu -kentän numero:Työskennelty-kutsu -kenttä täytyy olla %d tai suurempi&Kutsumerkin varmenneKutsumerkin varmenneKutsumerkin varmenne -säilötiedostot (*.p12,*. P12;*.tq6;*. TQ6)|*.p12;*. P12;*.tq6;*. TQ6Kutsumerkin varmenne -säilötiedostot (*.p12,*.tq6))|*.p12;*.tq6Kutsumerkin varmenne ei vastaa QSO-tietojaKutsumerkin varmenne ei ole TQSL-yhteensopivaKutsumerkin varmenteetKutsumerkin varmennetta ei voitu asentaaEi voitu avata TQSL:n päivitystiedostoa %s: %hsEi voitu avata uutta kokoonpanotiedostoa %s: %hsPeruutaPeruttuVarmentajan varmenneVarmenteiden säilötiedoston salalauseVarmenteiden säilötiedostot (*.p12)|*.p12|Kaikki tiedostot (*.*)|*.*Varmenne vanheneeVarmenteen myöntäjä:Varmenteen tiedotVarmennepyyntöVarmennetta ei ole alustettu allekirjoitusta vartenVarmentajaa ei löytynytVarmenne tallennettu tiedostoon %sUudemmalla korvatut varmenteetVanhentuneet varmenteetMuutoksia ei ole tallennettuMuutokset tilaviestien asetuksiin tulevat käyttöön, kun TQSL on käynnistetty uudelleenTarkistusvirheTarkista &Päivitykset...Tarkista päivitykset tqsl:ään ja kokoonpanotiedostoonTarkistetaan TQSL-päivityksiä...Valitse palautettava kutsumerkin varmenneValitse palautettava aseman sijainti"Peruuta"-valinta on yleensä turvallista tehdä, mutta virheellisesti toimiva lokiohjelma, joka ei tarkista TQSL:n ilmoittamia tilaviestejä, voi tuottaa outoa (mutta harmitonta) käytöstä, kuten sitä että se yrittää lähettää tyhjää tiedostoa tai merkitsee kaikki valitut QSO:t lähetetyiksi.PostitoimipaikkaNapsauta "Peruuta" jos tämä ei ole oikea aseman sijainti.Valitse "Peruuta" hylätäksesi tämän lokitiedoston käsittelyn (suositeltavaa).Valitse "Peruuta" hylätäksesi tämän lokitiedoston käsittelyn.Valitse "Peruuta" hylätäksesi tämän lokin allekirjoittamisen.Valitse "Lopeta" saattaaksesi valmiiksi tämän kutsumerkin varmennepyynnön.Valitse "Jätä huomiotta" jatkaaksesi tämän lokin varmentamista ja jättääksesi virheet huomioimatta.Allekirjoittaaksesi normaalisti ilman aiemmin allekirjoitettuja QSO:ja napsauta "Vain uudet QSO:t" (Suositeltavaa).Valitse "OK" asentaaksesi uuden kokoonpanotiedoston tai "Peruuta" jättääksesi sen asentamatta.Valitse "OK" asentaaksesi TQSL:n uuden version tai "Peruuta" jättääksesi sen asentamatta.Napsauta "Lähetä QSO-tiedot uudestaan", jotta tämä loki ja myös aiemmin allekirjoitetut QSO-tiedot käsitellään uudelleen.SuljeKomentosyntaksivirheKokoonpanotiedostoa ei voida avataKokoonpanotiedoston päivitys onnistuiKokoonpanotiedostot (*.tbk)|*.tbk|Kaikki tiedostot (*.*)|*.*Vahvista sulkeminenKilpailuKilpailun nimi ei voi olla tyhjäKilpailun tyyppiMaanosaMuunnetaan Ei onnistuttu luomaan lähetyssäiettä!MaaKuntaKunta: Luo &uusi ADIF-tiedosto...Luo uusi aseman sijaintiMuodosta ADIF-tiedosto allekirjoittamista ja lähettämistä vartenErityiset ADIF-lähetelajien kuvaukset:POISTETTUÄLÄ hukkaa valitsemaasi salalausetta! Et voi käyttää varmennetta ilman tätä salalausetta!DXCC-maaDXCC-maa: DXCC-maa:Tietoja tälle DXCC-maalle ei löytynytTietokantavirhe: %hsTietokantavirhePäivämääräEnsimmäisen yhteyden, jonka olet pitänyt tai tulet pitämään tätä kutsumerkkia käyttäen, päivämäärä:Viimeisen yhteyden, jonka olet pitänyt tai tulet pitämään tätä kutsumerkkia käyttäen, päivämäärä: (Jätä tämä tyhjäksi, jos tämä on nykyinen voimassaoleva kutsusi.)Päivämäärä alueen ulkopuolellaPoistaPoista "Poista aseman sijainti Poista aseman sijaintiDia&gnoosimoodiNäytä &ohjeet&Näytä kutsumerkin varmenteen tiedotNäytä aseman sijaintitiedotNäytä aseman sijaintitiedot: Näytä kutsumerkin varmenneNäytä kutsumerkin varmenteen tiedotNäytä komentoriviohjeNäytä tiedot aiemmin allekirjoitetuista QSO:ista kun lokia allekirjoitetaanNäytä tai muokkaa &asetuksia...Näytä tilaviestit erillisessä välilehdessäNäytä kutsumerkin varmenne kutsulleNäytä versiotiedot ja suljeHaluatko varmasti pitää tämän QSO:jen päättymispäivän voimassa?Haluatko uudistaa sen nyt?Haluatko lähettää tämän varmennepyynnön LoTW:ille nyt?Lataa:Duplikaatti-QSO:ja havaittuSulje TQSL Alt-&XMuokkaaMuokkaa (jos käytetty -l:n kanssa) tai luo aseman sijaintiMuokkaa aseman sijaintiaMuokkaa aseman sijaintia Muokkaa aseman sijaintia : %hs - %sMuokkaa aseman sijaintiaMuokkaa...Sähköposti: Käytä välityspalvelinta (proxy)Ota käyttöön salalauseet kutsumerkin varmenteilleLoppupäivämäärä (VVVV-KK-PP):Loppupäivämäärä on virheellinenLoppupäivämäärä %s on virheellinenSyötä nimi tälle aseman sijainnilleSyötä salalause tälle kutsumerkin varmenteelle.Syötä uudelleen varmistaaksesi:Syötä tiedosto, johon tallennetaanSyötä uusi salalauseSyötä salalauseSyötä salalause avataksesi kutsumerkin varmenteenSyötä nimi uudelle varmenteiden säilötiedostolleAnna salalause uudelleen varmistuksen vuoksi:Syötä salalause varmenteen säilötiedostolle.Syötä salalause avataksesi .p12-tiedoston:Syötä salalause avataksesi varmenteen kutsumerkille %hs -- %hs (Tämä on salalause, jonka keksit, kun asensit kutsumerkin varmennetta.)VirheVirhe tarkistettaessa vanhentuneita kutsumerkkien varmenteita:Virhe kompressoinnissa ennen lähetystäVirhe luotaessa kutsumerkin varmennepyyntöäVirhe luotaessa kutsumerkin varmennepyyntöä: %hsVirhe ladattaessa uutta kokoonpanotiedostoa:Virhe ladattaessa uutta tiedostoa:Virhe ladattaessa uuden version tietoja:Virhe ladattaessa päivityksen versiotietoja:Virhe asemien sijainteja tuodessa: %hsVirhe avattaessa kutsumerkin varmennepyyntötiedostoa %s: %hsVirhe avattaessa diagnosointilokia %s: %hsVirhe avattaessa syötetiedostoaVirhe avattaessa tulostetiedostoaVirhe avattaessa tallennustiedostoa %s: %hsVirhe jäsennettäessä varmennetta DXCC-maalleVirhe jäsennettäessä varmennetta kutsumerkilleVirhe jäsennettäessä varmennetta varmentajalleVirhe jäsennettäessä tallennettua kokoonpanotiedostoa: %hsVirhe jäsennettäessä aseman sijaintitiedostoa: %hsVirhe automaattista varmuustallennusta tehtäessä: %hsVirhe uudelleennimettäessä varmuuskopiotiedostoa %s: %hsVirhe yritettäessä päästä varmennevarastoonVirhe kirjoitettaessa uutta konfiguraatiotiedostoa %s: %hsVirhe: ei voitu lähettää tiedostoa (CURL:in alustusvirhe)Virheitä havaittuVirheitä: %dPoistu TQSL:stä jotta voin käynnistää sen uudelleen tavallisena käyttäjänäPoistu lokin käsittelyn jälkeen (muuten käynnisty normaalisti)Odotettu nimiVanhentunutPäättyy: Vie P12-tiedostot Apple-avainketjuun yhteensopivassa muodossaVienti %s:ään epäonnistui: %hsKenttäTiedoston nimi diagnoosiseurantatyökalulleTiedoston syntaksivirheTiedoston syntaksivirhe: %hsLopullinen tila: %hs (%d)Taajuus (MHz):Ruutu %s ei ole oikea sinun %s:llesi. Napsauta uudestaan "Seuraava", jos haluat silti käyttää sitä.Ruutu %s ei ole oikea DXCC-maallesi. Napsauta "Seuraava", jos haluat silti käyttää sitä.Lokaattori %s ei ole oikea nykyiselle QTH:llesi. Jos haluat silti käyttää sitä, napsauta uudestaan "Seuraava".LokaattoriLokaattori: Lokaattoriruutu ei vastaa aseman sijaintiaMiten ADIF-lokien QTH-tieto käsitellään?OhjeOlen tämän kutsumerkin QSL-manageriIOTA-tunnusIOTA-lokaattori: IOTA %s ei ole oikein. Väliviivan jälkeen täytyy olla lukuarvo.IOTA %s ei ole oikein. Sen täytyy alkaa AF-, AN-, AS-, EU-, NA-, OC- tai SA-IOTA-arvo %s ei ole oikein.ITU-zoneITU-zone: Jos niin on, valitse alta kutsumerkki ensisijaista LoTW-tiliäsi varten. Jos ei, valitse "Lopeta" ja näille QSO:ille luodaan uusi LoTW-tili.Jos aiot palauttaa tiedot varmuuskopiolta, valitse "Ei".Jos olet varma, että aiempi pyyntö on nyt mitätön, sinun pitäisi poistaa vireillä oleva varmenne kutsumerkille %s.Jos käytät USA:n kutsumerkkiä USA:n ulkopuolella CEPT:in, IARP:n tai muun vastavuoroisuusjärjestelyn mukaisesti, FCC:n määräykset vaativat, että olet Yhdysvaltain kansalainen.Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä antaa salalause suojataksesi tämän varmenteen. Kuitenkin, jos käytät tietokonetta yksityistaloudessa, salasanaa ei ole tarvetta antaa.Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä antaa salalause suojataksesi tämän varmenteen. Kuitenkin, jos käytät tietokonetta yksityistaloudessa, salasanaa ei ole tarvetta antaa.Jos valitset päättymispäivän, et voi varmentaa yhteyksiä jotka on pidetty tuon päivämäärän jälkeen, et edes vaikka itse kutsumerkin varmenne olisi vielä voimassa.Jos sinulla on vielä lupa tälle kutsumerkille (tai aiot uusia luvan tälle kutsumerkille), sinun ei pitäisi asettaa "Yhteyksien päättymispäivää".Jätä huomiottaJätä huomioimatta lokisi QTH-tiedotJätä huomioimatta ADIF-tiedostojen kutsumerkitJätä huomioimatta sekunnit QSO-ajoistaTuo varmennetiedosto (.p12 tai .tq6)Tuonti onnistuiHuomaa, että jotkut lokiohjelmat voivat toimia oudosti jos et valitse vaihtoehtoa "Lähetä QSO-tiedot uudestaan". "Vain uudet QSO-tiedot" on suositeltava vaihtoehto, mutta lokiohjelma, joka itse seuraa lähetettyjä tietoja saattaa tässä tapauksessa merkit lähetettyjen tietojen tilan väärin. Lokiohjelma, joka ei seuraa lähetettyjä tietoja, toiminee oikein valinnan "Vain uudet QSO-tiedot" kanssa, ja jos se seuraa "QSO-tiedot lähetetty" -tilaa, se merkitsee oikein kaikki valitut QSO-tiedot lähetetyiksi - ne ovat tililläsi vaikka niitä ei lähetetäkään tässä nimenomaisessa lähetyksessäHuomaa, että jotkut lokiohjelmat voivat toimia oudosti jos et valitse vaihtoehtoa "Lähetä QSO-tiedot uudestaan". "Peruuta" on yleensä turvallinen vaihtoehto, mutta epätäydellinen lokiohjelma, joka ei tarkista TQSL:n tilaviestejä voi tuottaa oudon (mutta vaarattoman)tuloksen kuten yrittää lähettää tyhjää tiedostoa tai merkitä kaikki QSO-tiedot lähetetyiksi.Epätäydelliset varmenteet - tarvitsevat vastaavan TQ6:nVirheellinen salalause tuotaessa P12-tiedostoaVäärät asetukset voivat aiheuttaa, että TQSL ei pysty lähettämään lokeja tai tarkistamaan päivityksiä.Syötä ADIF- tai Cabrillotiedosto varmennettavaksiAsenna varmenneVirheellinen %hs: "%hs"Virheellinen argumenttiVirheellinen yhteys - QSO ei määrittele kutsumerkkiäVirheellinen yhteys - QSO ei määrittele taajuusaluetta tai taajuuttaVirheellinen yhteys - QSO ei määrittele päivämäärääVirheellinen yhteys - QSO ei määrittele lähetelajiaVirheellinen yhteys - QSO ei määrittele kellonaikaaVäärä päivämäärän muotoVirheellinen virhekoodi: %dVäärä kellonajan muotoVäärät zone-valinnat DXCC-maalleVäärät zone-valinnat oblastilleVäärät zone-valinnat maakunnalleVäärät zone-valinnat osavaltiolleOnko sinulla jo olemassaoleva LoTW-tili, ja haluat lisätä tämän kutsumerkin QSOt olemassaolevalle LoTW-tilillesi? KieliJätä salalause tyhjäksi ja valitse "Lopeta", jos et halua käyttää salalausetta.Jätä salalause tyhjäksi ja valitse "Seuraava", jos et halua käyttää salalausetta.Jätä salalause tyhjäksi ja valitse "OK", jos et halua käyttää salalausetta.LoTW-yhteys epäonnistuiLataa varmennetiedostoLataa kutsumerkin varmenneLataus valmisVirhe paikkatiedossaLokitiedostoVirhe lokitiedostossaLokitoiminnotLokitoiminnotLokitiedostot (*.log)|*.log|Kaikki tiedostot (*.*)|*.*Kirjaudu Logbook of the Word -palveluunMuistinvarausvirhePuuttuu tältä tietokoneeltaLähetelajien ristiriitaLähetelaji:Lisätietoja:EI VIRHETTÄTYHJÄNimiNimi on olemassaVerkkovälityspalvelin (proxy)Uusi tietokantaUusi salalauseVain uudet QSO-tiedotUusi salalauseUusi salalause:Uusi...Ei kutsumerkin varmenteitaEi varmennettaMikään varmennepyyntö ei sovi valittuun kutsumerkin varmenteeseenEi salaista avaintaEi QSO-tietojaEi QSO:ja lähetettäväksiEi päivityksiäEi kutsumerkin varmennetta avaimelleEi lokitiedostoa allekirjoitettavaksi!Ei tietoja tulosteessaTilatietoa ei ole saatavillaTyhjäMikään näistä ei pädeHuomaa: TQSL olettaa että tämä tiedosto lähetetään LoTW:iin.Huomaa: TQSL:llä ti ole tietoa näiden QSO:jen allekirjoittamisesta. Voit lähettää tämän lokitiedoston LoTW:iin tai hylätä sen.Huomaa: Myönnetty varmenne lähetetään tähän sähköpostiosoitteeseen. Varmista, että sähköpostiosoite on oikea!IlmoitusKuinka monta varmuuskopiota pidetään tallessa:OKValmis asentamaan OblastOblast: Kun olet antanut pyydetyt tiedot ja varmennepyyntötiedosto on luotu, sinun täytyy lähettää pyyntötiedosto varmentajalle.Yksi QSO-tietoAvaa ADIF-tiedostot ADIF-muokkaimessaAvaa tiedostoKäyttäjä keskeytti toiminnonOperaattori: LisävalinnatOrganisaatio: Tulostetiedoston nimi (oletusarvo syötetiedoston nimi miinus tarkenne plus .tq8Ylikirjoita aseman sijainti lokisi QTH-tiedoillaPKCS#12-tiedosto ei ole TQSL-yhteensopivaPuisto: Salalause varmistettuAnnetut salalauseet eivät täsmääVirhe salalauseessaSalalause varmennusavaimelleVäärä salalauseSuojattu salalauseellaSalalause:Salalause: Valitse kutsumerkki tälle aseman sijainnilleValitse kieli:Asenna kutsumerkin varmenne ja yritä uudelleen.Lue johdanto-ohjeet ennen tämän ohjelman käyttämistä.Valitse kutsumerkin varmenne tilille, jolle haluat QSO:t tallennettavanValitse kutsumerkin varmenne vahvistaaksesi tämän pyynnönValitse nykyisen henkilökohtaisen kutsumerkkisi varmenne vahvistaaksesi pyyntösi.Yritä uudelleen myöhemmin.Yritä lähettää %s myöhemmin.Tarkista, että tämä on oikea aseman sijainti allekirjoitettaville QSO:ille.Odota, kunnes saat sähköpostin, jossa on pyytämäsi kutsumerkin varmenne.Porttinumero:AsetuksetAiemmin allekirjoitettu QSO havaittiinAiemmin allekirjoitettuja QSO-tietoja havaittiinAiemmin allekirjoitettu: %dAiemmin allekirjoitettuja QSO-tietoja havaittiinAiemmin allekirjoitettu: %dSalaista avainta ei löytynytKysy QSO:jen päivämääräaluetta kun allekirjoitetaanEtenemismuoto:OminaisuudetMaakuntaMaakunta: Välityspalvelimen osoite:Välityspalvelimen tyyppi:Välityspalvelimen tyyppiQSO-tiedotVirhe QSO-tiedoissaQSO-tiedot: Virheellinen lähetelaji jätetty huomiotta - %sQSO-päivämääräalueYhteyksien loppumispäivä: Yhteyden taajuus on virheellinenYhteyden taajuus on valitun taajuusalueen ulkopuolellaQSO:n RX-taajuus on virheellinenQSO:n RX-taajuus on valitun taajuusalueen ulkopuolellaYhteyksien alkamispäivä: Yhteyden alkamisaika: Sinun täytyy valita oikeat vuosi, kuukausi ja päivä.QSO-päivämäärä ei ole kutsumerkin varmenteessa määritellyn ajanjakson sisälläYhteyksien loppumispäivä ei voi olla ennen alkamispäivää.Yhteyksien loppumisaika: Sinun täytyy valita oikeat vuosi, kuukausi ja päivä.QSO-tiedot, jotka on allekirjoitettu tällä varmenteella eivät kelpaa DXCC-awardia varten (mutta kelpaavat muita soveltuvia awardeja varten). Jos tätä varmennetta aiotaan käyttää allekirjoittamaan kansainvälisiltä merialueilta pidettyjä yhteyksiä, alukselta pidettyjä yhteyksiä tai ilma-aluksesta pidettyjä yhteyksiä, tämä on oikea valinta. Muussa tapauksessa on suositeltavaa OK:n valitsemisen jälkeen tehdä "Takaisin"-valinta palataksesi DXCC-sivulle%hs:n QSO:t tallennetaan %s:n LoTW-tilille.Yhteyksiä ennen alkamispäivää tai loppumispäivän jälkeen ei allekirjoiteta tai sisällytetä tulostetiedostoon.QSO:ja: %dHiljainen toimintatila - sama käyttäytyminen kuin -xRX-taajuusalue:RX-taajuus (MHz):Lähetä QSO-tiedot uudestaanUudista kutsumerkin varmenneUudista kutsumerkin varmenne kutsulleKorvattuRaportti QTH-eroavaisuuksista&Pyydä uutta kutsumerkin varmennetta...Pyydä uutta kutsumerkin varmennettaPyyntö peruttuPalautus valmis.Palauta poistettu kutsumerkin varmennePalautusoperaatio epäonnistui: %hsPalautetaan kutsumerkkien varmenteitaPalautetaan asetuksiaPalautetaan QSO-tietojaPalautetaan asemien sijaintejaPalautetaan kutsumerkin varmennetta %hs:lleNäiden QSO:jen lähettäminen uudelleen aiheuttaa sen, että ne ilmoitetaan jo allekirjoitetuiksi.Vastaava TQSL-lähetelaji:Yritä uudelleen?Satelliitti-valinta vaatii, että etenemismuodoksi on valittu "Satelliitti"Satelliitti:Tallenna tiedostoTallenna asematiedotTallenna kutsumerkin varmenneTallennus valmis.Tallenna pyyntöTallenna kutsumerkin varmenne kutsulleTallennetut kokoonpanotiedostot (*.tbk)|*.tbkTallennetaan QSO:jaTallennetaan asemien sijaintejaTallennetaan TQSL-asetuksiaTallennetaan kutsumerkkien varmenteita %hs:lleTallennetaan kutsumerkkien varmenteitaValitse kutsumerkkiValitse varmennetiedostoValitse asematiedotValitse aseman sijainti allekirjoitusta vartenValitse kutsumerkin varmenne tehdäksesi muutoksiaValitse hakemistoValitse aseman sijainti tehdäksesi muutoksiaValitse aseman sijainti tehdäksesi muutoksia Valitse allekirjoitettava tiedostoValitse tiedosto, johon kirjoitetaanValitse tai syötä nimi tälle aseman sijainnilleValitse tallennettu kokoonpanotiedostoValittu aseman sijaintiValitsee aseman sijainninSarjanumero: Allekirjoita loki, tallenna ja lähetä myöhemminAllekirjoita loki ja lähetä automaattisesti LoTW:iinAllekirjoita ja &lähetä ADIF- tai Cabrillo-tiedosto...Allekirjoittava tiedosto: Allekirjoitan QSO-tietojaAllekirjoittaminen hylättyAllekirjoittaminen keskeytettyAllekirjoittaminen keskeytetty virheiden vuoksiAllekirjoittaminen keskeytetty.Allekirjoittaminen peruttuVarmistetaan käyttäen kutsumerkkiä %hs, DXCC-maata %hsKoska sinulla ei ole kutsumerkkien varmenteita, sinun on lähetettävä "allekirjoittamaton" varmennepyyntö. Näin voit luoda ensimmäisen kutsumerkin varmenteesi LoTW:ia varten. Napsauta "Lopeta" lähettääksesi tämän varmennepyynnön.Ei QSO:ja käsiteltäväksiMäärittele QSO.vahvistustoiminto: ohita, raportoi tai päivitäMäärittele oletusarvoinen kutsumerkki lokin allekirjoitukseenMääritä valintatilanteen toiminta - abort, all, complant tai askMäärittele loppumispäivä allekirjoitettaville QSO:illeMäärittele alkamispäivämäärä allekirjoitettaville QSO:illeAlkamispäivämäärä (VVVV-KK-PP):Alkamispäivämäärä on virheellinenAlkamispäivämäärä %s on virheellinenOsavaltioOsavaltio: Aseman tietojen syöttö valmisAseman sijaintiAseman sijainnin nimiAseman paikkatiedotAseman sijaintitiedoissa virheAseman sijainti ei vastaa QSO-tietojaAsemien sijainnitAseman nimi on annettavaTilatiedotOnnistuiPiilotettavan päivämääräalueen valintaikkunaJärjestelmävirhe: %hsJärjestelmävirhe: %hs : %hsTQSL-varmistusTQSL-virheTQSL-päivitys saatavissaTQSL-versio %hs ja kokoonpanotietojen versio %sTQSL-varoitusTQSL-pakatut datatiedostot (*.tq8)|*.tq8TQSL-datatiedostot (*.tq7)|*.tq7TQSL ei voi allekirjoittaa QSO:ja koska toinen TQSL:n kopio on toiminnassa. Lopeta muut TQSL:n kopiot ja yritä uudelleen.TQSL:ää ei pidä käynnistää järjestelmänvalvojanaTQSL:n täytyy odottaa muiden ajettavien TQSL-kopioiden suorituksen päättymistä ennen varmuuskopiointia...Ennen allekirjoittamista TQSL joutuu odottamaan kunnes muut TQSL:n kopiot lopettavat toimintansa...TQSLLib-virhe%s '%hs':lla on arvo '%hs' mutta QSO-tiedoissa on arvo '%hs'-a-parametria %hs ei tunnisteta-f-parametria %hs ei tunnistettuTQSL:n kokoonpanotiedostoa ei voida jäsentääTQSL:n verkkoon latauksen seurantatietokanta on lukittuKutsumerkki %s ei ole tällä hetkellä voimassa FCC:n ULS-tietokannassa. Jos tämä kutsumerkki on rekisteröity hiljattain, sinun on odotettava vähintään yksi työpäivä jotta se olisi voimassa. Syötä tällä hetkellä voimassa oleva kutsumerkki.Kutsumerkin varmenne kutsulle %hs on vanhentunut. Tätä aseman sijaintia ei voi käyttää lokitiedoston allekirjoitukseen ennen kuin voimassa oleva kutsumerkin varmenne on asennettu.Kutsumerkki on liian pitkä. Kutsumerkki voi olla enintään %d merkkiä pitkä.Varmenne %hs:lle vanhenee %d:ssa päivässäVarmenne %hs:lle vanhenee %d:ssä päivässä.Ensimmäisen yhteytesi päivämäärä on valitun viimeisen hyväksyttävän päivämäärän (%hs) jälkeen valitulle DXCC-maalle %hsEnsimmäisen yhteytesi päivämäärä on ennen ensimmäistä hyväksyttävää päivämäärää (%hs) valitulle DXCC-maalle %hsViimeisen yhteytesi päivämäärä on viimeisen hyväksyttävän päivämäärän (%hs) jälkeen valitulle DXCC-maalle %hsViimeisen yhteytesi päivämäärä on ennen ensimmäistä hyväksyttävää päivämäärää (%hs) valitulle DXCC-maalle %hsTiedostoa ei ole tallennettu. Tallennetaanko QSO:t?Tämän tiedoston muoto on väärä.Virheelliset tiedot jätettiin huomiotta.Allekirjoitettavassa lokissa on parametri '%hs' asetettu arvoon '%hs', joka ei ole sallittuLokitiedosto, jota lähetät QSO-lokiohjelmaasi käyttäen, koostuu ainoastaan jo aiemmin lähetetyistä QSO-tiedoista (duplikaateista), jotka aiheuttavat turhaa prosessointikuormaa LoTW:lle. Lokiohjelmastasi on mahdollisesti saatavilla uudempi versio, joka estää tämän. Tarkista lokiohjelmasi valmistajalta, onko uudempaa versiota saatavilla.Lokitiedosto, jota lähetät QSO-lokiohjelmaasi käyttäen, sisältää joitakin jo aiemmin lähetettyjä QSO-tietoja (duplikaatteja), jotka aiheuttavat turhaa prosessointikuormaa LoTW:lle. Lokiohjelmastasi on mahdollisesti saatavilla uudempi versio, joka estää tämän. Tarkista lokiohjelmasi valmistajalta, onko uudempaa versiota saatavilla.Ainoa syy allekirjoittaa uudelleen aiemmin allekirjoitettuja QSO:ja on että LoTW ei käsitellyt aiempaa latausta koska latausta ei todellisuudessa tapahtunut tai tapahtui palvelinvirheKutsumerkin %hs, sarjanumeron %ld salaista avainta ei ole tällä tietokoneella. Voit lisätä sen lataamalla .tbk- tai .p12-tiedostonTämän kutsumerkin varmenteen salaista avainta ei ole tällä tietokoneella. Voit lisätä sen lataamalla .tbk- tai .p12-tiedostonValittua kutsumerkkiä ei löytynytValittua aseman sijaintia ei löytynytAnnetut salalauseet eivät täsmää.Varmenteita ei ole kutsumerkille %hs. Tätä aseman sijaintia ei voi muokata.Voimassaolevia varmenteita ei ole kutsumerkille %hs. Tätä aseman sijaintia ei voi käyttää lokitiedoston allekirjoittamiseen.Ei ole poistettuja kutsumerkin varmenteita, joita voitaisiin palauttaaEi ole poistettuja aseman sijainteja, joita voitaisiin palauttaaEi ole voimassaolevia kutsumerkin varmenteita kutsulleKutsumerkin varmenteelle %hs on voimassa uudempi kutsumerkin varmenne. Tätä aseman sijaintia voi käyttää lokin allekirjoitukseen vasta kun se on asennettu.%hs:lle kokonaisuudessa %hs ei ole voimassa olevaa kutsumerkin varmennetta. Tätä QSO:a ei voida allekirjoittaaTätä kutsumerkin varmennetta ei voi asentaa, koska se ei ole enää voimassa. Tarkista että tietokoneesi on asetettu oikeaan päivämäärään ja että tämä on viimeisin kutsumerkin varmenne. Tätä kutsumerkin varmennetta ei voi asentaa, koska sen ensimmäinen voimassaolopäivä on tulevaisuudessa. Tarkista onko tietokoneesi asetettu oikeaan päivämäärään. Tämä kutsumerkin varmenteen pyyntö on hyväksyttävä käyttämällä olemassaolevaa kutsumerkin varmennetta.Tämän osoitteen on oltava sama kuin FCC:n ULS-tietokannassa. Jos tämä osoite on väärä, ole hyvä ja korjaa tiedot FCC:lle.Tämä kutsumerkin varmenne on jo aktiivinen eikä sitä voida palauttaa.Tämä kutsumerkin varmenne on jo asennettuTämä kutsumerkki korvaa nykyisen kutsumerkkiniTätä tiedostoa ei voida käsitellä järjestelmävirheen vuoksiTämä tiedosto ei ole pätevä P12-tiedostoTämä on DX-pedition kutsumerkkiTämä on kerhon kutsumerkkiTämä on erityisen tapahtuman kutsumerkkiTämä on entinen kutsumerkkiniTämä loki sisältää %d QSO:a jotka näyttävät olevan jo aiemmin allekirjoitettu ja ladattu LoTW:iin, ja %d uutta QSO:a.Tässä lokissa on %d QSO:a, jotka näyttävät olevan jo aiemmin allekirjoitettuja LoTW:iin lähetettäväksi, eikä uusia QSO:ja.Tämä loki sisältää %d QSO:a jotka näyttävät olevan jo aiemmin allekirjoitettu ja ladattu LoTW:iin, ja yhden uuden QSO:n.Tässä lokissa on vääriä QSO-tietojaTässä lokissa on liian monta aiemmin lähettyä QSO-tietoa. Lähetä vain uusien QSO:jen tiedot tai jaa loki pienempiin palasiin (enintään 50 000 QSO:a).Tämä lähetelajimääritelmä on ristiriidassa vakiolähetelajimääritelmän %s kanssaTämä salalause on annettava joka kerta kun käytät tätä kutsumerkin varmennetta allekirjoitukseen tai kun tallennat avainta.Tämä on syytä korjata ennen lokitiedoston allekirjoittamista.Tämä luo kutsumerkille uuden varmennepyynnön.Tämä poistaa valitun kutsumerkin varmenteen järjestelmästäsi.Tämä poistaa tämän aseman sijainnin järjestelmästäsi.KellonaikaJotta voisit tuoda tämän salalauseella suojatun P12-tiedoston, sinun on annettava salalause komentorivilläLähettääksesi allekirjoitetun lokitiedoston LoTW:iin: 1. Siirrä allekirjoitettu lokitiedosto internet-yhteydelliseen tietokoneeseen 2. Kirjaudu sisään LoTW-tilillesi 3. Valitse Upload File -välilehti 4. Napsauta Choose File -painiketta ja valitse luomasi allekirjoitettu tiedosto (%s) 5. Napsauta Upload file -painiketta Voit vaihtoehtoisesti liittää allekirjoitetun tiedoston sähköpostiin ja lähettää viestin osoitteeseen lotw-logs@arrl.orgLuotettu päävarmenneTyyppiYLÖSURL-osoite: USA:n 1x1-kutsumerkkien pyyntöjen tulee sisältää loppumispäivämääräUSA:n 1x1-kutsumerkkien täytyy päättyä kirjaimeen A-Z, mutta ei X-kirjaimeenUSA:n 1x1-kutsumerkkien toisena merkkinä tulee olla numeroUSA:n 1x1-kutsumerkkien tulee alkaa kirjaimella W, K tai NUTC-päivämäärä (VVVV-KK-PP):UTC-kellonaika (TTMM):Ei voitu tarkistaa päivityksiä - joko internet-yhteytesi on poissa käytöstä tai LoTW:iin ei saada yhteyttä.Ei voida tarkistaa päivityksiä. Joko verkko on poissa käytöstä tai LoTW-sivusto on liian kiireinen.Ei saatu yhteyttä päivityssivustoon.Ei pystytty alustamaan satunnaislukugeneraattoriaEi pystytä avaamaan %s:ää ulostuloonEi voitu avata tiedostoa ca-bundle.crt. TQSL-asennuksesi on epätäydellinenEi voida avata - pääsyoikeus puuttuuEi voitu päivittää - joko internet-yhteytesi on poissa käytöstä tai LoTW:iin ei saada yhteyttä.Ei voida päivittää. Joko verkko on poissa käytöstä tai LoTW-sivusto on liian kiireinen.Poiston perumisen virheOdottamaton LoTW-vastausTuntematonTuntematon, erityinen virheKäyttökelvoton: Salainen avain puuttuuPäivitäPäivitys valmisLähetäLähetys hylättyLähetä allekirjoittamisen jälkeen tallentamisen sijaanLähetetään kutsumerkin varmennettaLähetetään kutsumerkin varmennepyyntöä...Lähetetään allekirjoitettuja tietojaLähetetään allekirjoitettuja lokitietoja...Tietokantavirhe verkkoon lataamisessaKäytä "Uusi"-valintaa seuraavassa valintaruudussa määrittääksesi aseman sijainnin.Käytä näitä asetuksia määritelläksesi verkkovälityspalvelimen (proxyn) Internet-lähetyksiä ja latauksia varten. Välityspalvelin pitäisi määritellä vain jos verkon ylläpitäjä on niin ohjeistanut.Käyttäjä peruiArvoTarkista QTH-tiedot: WPX-prefiksiVaroitusVaroitus: TQSL:n ADIF-editori käsittelee vain rajatun määrän ADIF-kenttiä Jos käytät editoria ADIF-tiedostoon, QSO-tietoja saatetaan menettää!Mitä tarkoitusta varten tämä kutsumerkin varmenne on?Tyhjennä TQSL:n verkkoonlataustietokantaHaluatko nyt tehdä kutsumerkin varmenteesta varmuuskopion?Haluatko pyytää kutsumerkin varmennetta nyt?Kirjoitettiin %d QSO-tietoa %s:iinVOIT palauttaa sen säilö(.p12)-tiedostosta,Et voi pyytää kutsumerkin varmennetta aikaisemmalle kutsumerkille jos sinulla ei ole olemassaolevaa kutsumerkin varmennetta jolla voit varmentaa pyyntösi.Et voi pyytää varmennetta 1x1-kutsulle koska sinun täytyy allekirjoittaa tämä pyyntö, mutta sinulla ei ole voimassa olevaa kutsumerkin varmennetta, jolla voisit allekirjoittaa pyynnön.Et voi pyytää varmennetta portable-kutsulle koska sinun täytyy allekirjoittaa tämä pyyntö, mutta sinulla ei ole voimassa olevaa kutsumerkin varmennetta, jolla voisit allekirjoittaa pyynnön.Et voi valita DXCC-maaksi TYHJÄ, koska sinun täytyy allekirjoittaa pyyntö maalle TYHJÄ ja sinulla ei ole voimassaolevia kutsumerkin varmenteita, joita voisit käyttää varmentaaksesi tämän pyynnön.Et tarvitse LoTW-tiliä tehdäksesi tämän.Olet jo pyytänyt varmennetta kutsumerkille %s, etkä voi pyytää uutta ennen kuin LoTW:n henkilökunta on käsitellyt pyynnön.Olet jo pyytäänyt yli kolmea kutsumerkin varmennetta %s:lle viimeisen 24 tunnin aikana. Kutsumerkin varmennetta tulisi pyytää vain kerran ja sitten odottaa että LoTW:n henkilökunta käsittelee pyynnön. Tämä voi kestää useita työpäiviä.Sinulla on päällekkäinen varmenne %s:lle (DXCC=%hs) seuraavina QSO-päivämäärinä: Olet muuttanut seuraavia kenttiä tämän aseman sijainnin tiedoissa: %s Haluatko hylätä nämä muutokset?Olet valinnut yhteyksien päättymispäivän tälle kutsumerkin varmenteelle. Viimeisen yhteyden päivämäärä pitäisi valita VAIN jos se on päivämäärä, jolloin kutsumerkin lupa päättyi tai kutsumerkki korvattiin uudella kutsumerkillä.Et ole määritellyt yhtään aseman sijaintia.Tähän tietokoneeseen ei ole asennettuna kutsumerkin varmennetta, jolla voisi allekirjoittaa lokin lähetyksen.Sinulla ei ole kutsumerkin varmenteita varmentaaksesi lokitiedoston.Olet valinnut DXCC-maaksi TYHJÄVoit jättää jommankumman (tai molemmat) päivämäärät tyhjäksi.Voit nyt lähettää uuden varmennepyyntösi (Voit suojata tämän kutsumerkin varmenteen salalauseella. Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä antaa salalause suojataksesi tämä kutsumerki varmenne. Kuitenkin, jos käytät tietokonetta yksityistaloudessa, salaslausetta ei ole tarvetta antaa.Voit asettaa yhteyksien alkamis- ja/tai loppumispäivämäärät valitaksesi tietyt yhteydet syötetiedostosta.Sinun on määriteltävä vähintään yksi aseman sijainti käyttääksesi sitä allekirjoitukseen.Sinun täytyy antaa hyväksyttävä kutsumerkki.Voimassa oleva sähköpostiosoite on annettavaOsoitteesi on annettavaKaupunkisi on annettavaNimesi on annettava%hs on valittavaSinun täytyy valita DXCC-maa.Taajuusalue on valittava tai taajuus annettavaET voi palauttaa sitä lataamalla .TQ6-tiedoston.Sinun on annettava salalause joka kerta kun lataat tiedoston TrustedQSL:ään.Et voi käyttää tätä tq6-tiedostoa palauttaaksesi kutsumerkin varmenteen, jos se menee hukkaan. Turvallisuuden vuoksi sinun olisi syytä tehdä varmuuskopio varmenteestasi irrotettavalle tallennusvälineelle ja säilyttää sitä turvallisessa paikassa.QTH-tietosi muuttuivat tälle QSO:lle. Alunperin ne olivat: %s Nyt ne ovat: %s Varmista, että halusit muuttaa tämän QSO:n! Varmennepyyntöäsi ei pystytty lähettämään oikein.Erityinen lähetelajikuvauksesi %s on ristiriidassa peruslähetelajimääritelmän %hs kanssa ja se poistettiin.SähköpostiosoitteesiJärjestelmäsi on päivitetty viimeisimpään versioonLähetyksesi näyttää epäonnistuneen. Haluatko tallentaa tämän pyynnön myöhempää lähetystä varten?Lähetyksesi näyttää epäonnistuneen. Pitäisikö TQSL:n yrittää uudelleen?Postinumero[Tyhjä]ovat ajan tasallavarmenne?jos olet luonut sellaisen Kutsumerkin varmenne -valikonmaassarivillä %dtai käy osoitteessa:tQSL-varmenteen pyyntötiedostot (*.TQSL-muotoonvastaanottaja:|ADIF-tiedostot (|Kaikki tiedostot (|Kaikki tiedostot (*.*)|*.*|Cabrillo-tiedostot (tqsl-2.8.1/apps/lang/fi/tqslapp.po0000644000175000017500000035660215003421124017015 0ustar rmurphyrmurphy# TrustedQSL # Copyright (C) 2015-2025 The American Radio Relay League # This file is distributed under the same license as the tqsl package. # Rick Murphy/K1MU. # msgid "" msgstr "" "Project-Id-Version: TQSL V2.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-16 18:01-0500\n" "PO-Revision-Date: 2025-03-01 10:27+0200\n" "Last-Translator: Juhani Tapaninen\n" "Language-Team: \n" "Language: fi_FI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.2\n" #: certtree.cpp:80 certtree.cpp:110 tqsl.cpp:1548 tqsl.cpp:7099 msgid "Callsign Certificates" msgstr "Kutsumerkin varmenteet" #: certtree.cpp:113 msgid "Error while accessing certificate store" msgstr "Virhe yritettäessä päästä varmennevarastoon" #: certtree.cpp:119 msgid "Error parsing certificate for issuer" msgstr "Virhe jäsennettäessä varmennetta varmentajalle" #: certtree.cpp:124 msgid "Error parsing certificate for call sign" msgstr "Virhe jäsennettäessä varmennetta kutsumerkille" #: certtree.cpp:131 msgid "Error parsing certificate for DXCC entity" msgstr "Virhe jäsennettäessä varmennetta DXCC-maalle" #: certtree.cpp:186 certtree.cpp:252 msgid "Active, usable certificates" msgstr "Aktiiviset, käyttökelpoiset varmenteet" #: certtree.cpp:202 msgid "Unusable: Missing Private Key" msgstr "Käyttökelvoton: Salainen avain puuttuu" #: certtree.cpp:218 msgid "Incomplete Certificates - requires a matching TQ6" msgstr "Epätäydelliset varmenteet - tarvitsevat vastaavan TQ6:n" #: certtree.cpp:232 msgid "Certificates replaced with a newer one" msgstr "Uudemmalla korvatut varmenteet" #: certtree.cpp:240 msgid "Certificates that have expired" msgstr "Vanhentuneet varmenteet" #: crqwiz.cpp:45 msgid "This callsign replaces my existing callsign" msgstr "Tämä kutsumerkki korvaa nykyisen kutsumerkkini" #: crqwiz.cpp:46 msgid "This is my former callsign" msgstr "Tämä on entinen kutsumerkkini" #: crqwiz.cpp:47 msgid "I am the QSL manager for this callsign" msgstr "Olen tämän kutsumerkin QSL-manageri" #: crqwiz.cpp:48 msgid "This is a club callsign" msgstr "Tämä on kerhon kutsumerkki" #: crqwiz.cpp:49 msgid "This is a DXpedition callsign" msgstr "Tämä on DX-pedition kutsumerkki" #: crqwiz.cpp:50 msgid "This is a special event callsign" msgstr "Tämä on erityisen tapahtuman kutsumerkki" #: crqwiz.cpp:51 msgid "None of these apply" msgstr "Mikään näistä ei päde" #: crqwiz.cpp:263 msgid "This will create a new Callsign Certificate request file." msgstr "Tämä luo kutsumerkille uuden varmennepyynnön." #: crqwiz.cpp:265 msgid "" "Once you supply the requested information and the request file has been " "created, you must send the request file to the certificate issuer." msgstr "" "Kun olet antanut pyydetyt tiedot ja varmennepyyntötiedosto on luotu, sinun " "täytyy lähettää pyyntötiedosto varmentajalle." #: crqwiz.cpp:272 msgid "Certificate Issuer:" msgstr "Varmenteen myöntäjä:" #: crqwiz.cpp:283 crqwiz.cpp:1665 crqwiz.cpp:1787 crqwiz.cpp:1841 #: crqwiz.cpp:1876 loadcertwiz.cpp:130 loadcertwiz.cpp:305 loadcertwiz.cpp:380 #: loadcertwiz.cpp:382 tqsl.cpp:3009 tqsl.cpp:3472 tqsl.cpp:3488 tqsl.cpp:3552 #: tqsl.cpp:3568 tqsl.cpp:5714 tqsl.cpp:7504 tqsl.cpp:7722 tqsl_prefs.cpp:1046 #: tqsl_prefs.cpp:1053 tqslwiz.cpp:1267 tqslwiz.cpp:1374 msgid "Error" msgstr "Virhe" #: crqwiz.cpp:318 msgid "Email: " msgstr "Sähköposti: " #: crqwiz.cpp:320 msgid "URL: " msgstr "URL-osoite: " #: crqwiz.cpp:365 msgid "DXCC entity:" msgstr "DXCC-maa:" #: crqwiz.cpp:369 msgid "Call sign:" msgstr "Kutsumerkki:" #: crqwiz.cpp:448 msgid "Date of the first QSO you made or will make using this callsign:" msgstr "" "Ensimmäisen yhteyden, jonka olet pitänyt tai tulet pitämään tätä " "kutsumerkkia käyttäen, päivämäärä:" #: crqwiz.cpp:502 msgid "" "Date of the last QSO you made or will make using this callsign:\n" "(Leave this date blank if this is still your valid callsign.)" msgstr "" "Viimeisen yhteyden, jonka olet pitänyt tai tulet pitämään tätä kutsumerkkia " "käyttäen, päivämäärä:\n" "(Jätä tämä tyhjäksi, jos tämä on nykyinen voimassaoleva kutsusi.)" #: crqwiz.cpp:582 msgid "Zip/Postal" msgstr "Postinumero" #: crqwiz.cpp:587 stationdial.cpp:70 msgid "Name" msgstr "Nimi" #: crqwiz.cpp:613 msgid "Address" msgstr "Osoite" #: crqwiz.cpp:643 msgid "City" msgstr "Postitoimipaikka" #: crqwiz.cpp:658 stationdial.cpp:362 stationdial.cpp:373 msgid "State" msgstr "Osavaltio" #: crqwiz.cpp:684 crqwiz.cpp:687 msgid "Country" msgstr "Maa" #: crqwiz.cpp:786 msgid "Your e-mail address" msgstr "Sähköpostiosoitteesi" #: crqwiz.cpp:801 msgid "" "Note: The e-mail address you provide here is the address to which the issued " "Certificate will be sent. Make sure it's the correct address!" msgstr "" "Huomaa: Myönnetty varmenne lähetetään tähän sähköpostiosoitteeseen. " "Varmista, että sähköpostiosoite on oikea!" #: crqwiz.cpp:847 msgid "" "You may protect this Callsign Certificate using a passphrase. If you are " "using a computer system that is shared with others, you should specify a " "passphrase to protect this Callsign Certificate. However, if you are using a " "computer in a private residence, no passphrase need be specified." msgstr "" "Voit suojata tämän kutsumerkin varmenteen salalauseella. Jos käytät " "tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä antaa " "salalause suojataksesi tämä kutsumerki varmenne. Kuitenkin, jos käytät " "tietokonetta yksityistaloudessa, salaslausetta ei ole tarvetta antaa." #: crqwiz.cpp:852 crqwiz.cpp:881 msgid "" "Leave the passphrase blank and click 'Next' unless you want to use a " "passphrase." msgstr "" "Jätä salalause tyhjäksi ja valitse \"Seuraava\", jos et halua käyttää " "salalausetta." #: crqwiz.cpp:856 msgid "Passphrase:" msgstr "Salalause:" #: crqwiz.cpp:862 msgid "Enter the passphrase again for verification:" msgstr "Anna salalause uudelleen varmistuksen vuoksi:" #: crqwiz.cpp:868 msgid "" "DO NOT lose the passphrase you choose! You will be unable to use the " "Certificate without this passphrase!" msgstr "" "ÄLÄ hukkaa valitsemaasi salalausetta! Et voi käyttää varmennetta ilman tätä " "salalausetta!" #: crqwiz.cpp:886 msgid "" "Leave the passphrase blank and click 'Finish' unless you want to use a " "passphrase." msgstr "" "Jätä salalause tyhjäksi ja valitse \"Lopeta\", jos et halua käyttää " "salalausetta." #: crqwiz.cpp:917 msgid "What is this Callsign Certificate for?" msgstr "Mitä tarkoitusta varten tämä kutsumerkin varmenne on?" #: crqwiz.cpp:1007 msgid "" "Since you have no Callsign Certificates, you must submit an 'Unsigned' " "certificate request. This will allow you to create your initial Callsign " "Certificate for LoTW use. Click 'Finish' to complete this Callsign " "Certificate request." msgstr "" "Koska sinulla ei ole kutsumerkkien varmenteita, sinun on lähetettävä " "\"allekirjoittamaton\" varmennepyyntö. Näin voit luoda ensimmäisen " "kutsumerkin varmenteesi LoTW:ia varten. Napsauta \"Lopeta\" lähettääksesi " "tämän varmennepyynnön." #: crqwiz.cpp:1025 msgid "" "This Callsign Certificate request requires approval using an existing " "Callsign Certificate." msgstr "" "Tämä kutsumerkin varmenteen pyyntö on hyväksyttävä käyttämällä " "olemassaolevaa kutsumerkin varmennetta." #: crqwiz.cpp:1028 msgid "" "Is this new certificate for a callsign where you already have a LoTW " "account, and you want the QSOs for this call to be added to an existing LoTW " "account? " msgstr "" "Onko sinulla jo olemassaoleva LoTW-tili, ja haluat lisätä tämän kutsumerkin " "QSOt olemassaolevalle LoTW-tilillesi? " #: crqwiz.cpp:1030 msgid "" "If so, choose a callsign below for the primary LoTW account. If not, click " "'Finish', and a new LoTW account will be set up for these QSOs." msgstr "" "Jos niin on, valitse alta kutsumerkki ensisijaista LoTW-tiliäsi varten. Jos " "ei, valitse \"Lopeta\" ja näille QSO:ille luodaan uusi LoTW-tili." #: crqwiz.cpp:1033 msgid "" "CAUTION: Mixing QSOs for unrelated callsigns into one LoTW account can cause " "issues with handling awards." msgstr "" "HUOMAA: Toisiinsa liittymättömien kutsumerkkien QSO:jen lisääminen samalle " "LoTW-tilille voi aiheuttaa ongelmia awardien käsittelyssä." #: crqwiz.cpp:1126 #, c-format msgid "The callsign is too long. Only %d characters are allowed." msgstr "" "Kutsumerkki on liian pitkä. Kutsumerkki voi olla enintään %d merkkiä pitkä." #: crqwiz.cpp:1223 msgid "You must enter a valid call sign." msgstr "Sinun täytyy antaa hyväksyttävä kutsumerkki." #: crqwiz.cpp:1326 msgid "You must select a DXCC entity." msgstr "Sinun täytyy valita DXCC-maa." #: crqwiz.cpp:1357 msgid "QSO begin date: You must choose proper values for Year, Month and Day." msgstr "" "Yhteyden alkamisaika: Sinun täytyy valita oikeat vuosi, kuukausi ja päivä." #: crqwiz.cpp:1361 msgid "" "QSO end date: You must either choose proper values for Year, Month and Day " "or leave all three blank." msgstr "" "Yhteyksien loppumisaika: Sinun täytyy valita oikeat vuosi, kuukausi ja päivä." #: crqwiz.cpp:1366 msgid "QSO end date cannot be before QSO begin date." msgstr "Yhteyksien loppumispäivä ei voi olla ennen alkamispäivää." #: crqwiz.cpp:1398 msgid "" "The date of your first QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "Ensimmäisen yhteytesi päivämäärä on ennen ensimmäistä hyväksyttävää " "päivämäärää (%hs) valitulle DXCC-maalle %hs" #: crqwiz.cpp:1402 msgid "" "The date of your first QSO is after the last valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "Ensimmäisen yhteytesi päivämäärä on valitun viimeisen hyväksyttävän " "päivämäärän (%hs) jälkeen valitulle DXCC-maalle %hs" #: crqwiz.cpp:1406 msgid "" "The date of your last QSO is before the first valid date (%hs) of the " "selected DXCC Entity %hs" msgstr "" "Viimeisen yhteytesi päivämäärä on ennen ensimmäistä hyväksyttävää " "päivämäärää (%hs) valitulle DXCC-maalle %hs" #: crqwiz.cpp:1410 msgid "" "The date of your last QSO is after the last valid date (%hs) of the selected " "DXCC Entity %hs" msgstr "" "Viimeisen yhteytesi päivämäärä on viimeisen hyväksyttävän päivämäärän (%hs) " "jälkeen valitulle DXCC-maalle %hs" #: crqwiz.cpp:1433 msgid "US 1x1 callsigns must start with W, K, or N" msgstr "USA:n 1x1-kutsumerkkien tulee alkaa kirjaimella W, K tai N" #: crqwiz.cpp:1437 msgid "US 1x1 callsigns must have a number as the second character" msgstr "USA:n 1x1-kutsumerkkien toisena merkkinä tulee olla numero" #: crqwiz.cpp:1441 msgid "US 1x1 callsigns must end in letters A-Z excluding 'X'" msgstr "" "USA:n 1x1-kutsumerkkien täytyy päättyä kirjaimeen A-Z, mutta ei X-kirjaimeen" #: crqwiz.cpp:1447 msgid "US 1x1 callsign requests must provide an end date" msgstr "USA:n 1x1-kutsumerkkien pyyntöjen tulee sisältää loppumispäivämäärä" #. TRANSLATORS: first argument is callsign (%s), second is the related DXCC entity name (%hs) #: crqwiz.cpp:1492 msgid "" "You have an overlapping Certificate for %s (DXCC=%hs) having QSO dates: " msgstr "" "Sinulla on päällekkäinen varmenne %s:lle (DXCC=%hs) seuraavina QSO-" "päivämäärinä: " #. TRANSLATORS: here "to" separates two dates in a date range #: crqwiz.cpp:1494 msgid " to " msgstr " - " #: crqwiz.cpp:1503 #, c-format msgid "" "You have already requested a Callsign Certificate for %s and can not request " "another until that request has been processed by LoTW Staff." msgstr "" "Olet jo pyytänyt varmennetta kutsumerkille %s, etkä voi pyytää uutta ennen " "kuin LoTW:n henkilökunta on käsitellyt pyynnön." #: crqwiz.cpp:1505 crqwiz.cpp:1545 msgid "" "Please wait until you receive an e-mail bearing your requested Callsign " "Certificate." msgstr "" "Odota, kunnes saat sähköpostin, jossa on pyytämäsi kutsumerkin varmenne." #: crqwiz.cpp:1507 #, c-format msgid "" "If you are sure that the earlier request is now invalid you should delete " "the pending Callsign Certificate for %s." msgstr "" "Jos olet varma, että aiempi pyyntö on nyt mitätön, sinun pitäisi poistaa " "vireillä oleva varmenne kutsumerkille %s." #: crqwiz.cpp:1543 #, c-format msgid "" "You have already requested more than three Callsign Certificates for %s in " "the past 24 hours. You should submit a request only once, then wait for that " "request to be processed by LoTW Staff. This may take several business days." msgstr "" "Olet jo pyytäänyt yli kolmea kutsumerkin varmennetta %s:lle viimeisen 24 " "tunnin aikana. Kutsumerkin varmennetta tulisi pyytää vain kerran ja sitten " "odottaa että LoTW:n henkilökunta käsittelee pyynnön. Tämä voi kestää useita " "työpäiviä." #: crqwiz.cpp:1639 msgid "" "You cannot request a Callsign Certificate for a former callsign unless you " "hold a valid Callsign Certificate to be used to verify that request." msgstr "" "Et voi pyytää kutsumerkin varmennetta aikaisemmalle kutsumerkille jos " "sinulla ei ole olemassaolevaa kutsumerkin varmennetta jolla voit varmentaa " "pyyntösi." #: crqwiz.cpp:1644 #, c-format msgid "" "The callsign %s is not currently registered in the FCC ULS database.\n" "If this is a newly registered call, you must wait at least one business day " "for it to be valid. Please enter a currently valid callsign." msgstr "" "Kutsumerkki %s ei ole tällä hetkellä voimassa FCC:n ULS-tietokannassa.\n" "Jos tämä kutsumerkki on rekisteröity hiljattain, sinun on odotettava " "vähintään yksi työpäivä jotta se olisi voimassa. Syötä tällä hetkellä " "voimassa oleva kutsumerkki." #: crqwiz.cpp:1654 msgid "" "If you are using a US callsign outside of the US persuant to CEPT, IARP or " "other Reciprocity arrangements, FCC rules require you to be a US Citizen." msgstr "" "Jos käytät USA:n kutsumerkkiä USA:n ulkopuolella CEPT:in, IARP:n tai muun " "vastavuoroisuusjärjestelyn mukaisesti, FCC:n määräykset vaativat, että olet " "Yhdysvaltain kansalainen." #: crqwiz.cpp:1654 crqwiz.cpp:1706 loadcertwiz.cpp:218 tqsl.cpp:6234 #: tqsl.cpp:7050 tqsl.cpp:7178 tqsl_prefs.cpp:448 msgid "Warning" msgstr "Varoitus" #: crqwiz.cpp:1670 msgid "" "You cannot select DXCC Entity NONE as you must sign any request for entity " "NONE and you have no valid Callsign Certificates that you can use to sign " "this request." msgstr "" "Et voi valita DXCC-maaksi TYHJÄ, koska sinun täytyy allekirjoittaa pyyntö " "maalle TYHJÄ ja sinulla ei ole voimassaolevia kutsumerkin varmenteita, joita " "voisit käyttää varmentaaksesi tämän pyynnön." #: crqwiz.cpp:1671 crqwiz.cpp:1684 crqwiz.cpp:1693 crqwiz.cpp:1890 tqsl.cpp:155 #: tqsl.cpp:193 msgid "TQSL Error" msgstr "TQSL-virhe" #: crqwiz.cpp:1676 msgid "You have selected DXCC Entity NONE" msgstr "Olet valinnut DXCC-maaksi TYHJÄ" #: crqwiz.cpp:1678 msgid "" "QSO records signed using the Certificate will not be valid for DXCC award " "credit (but will be valid for other applicable awards). If the Certificate " "is to be used for signing QSOs from maritime/marine mobile, shipboard, or " "air mobile operations, that is the correct selection. Otherwise, you " "probably should use the \"Back\" button to return to the DXCC page after " "clicking \"OK\"" msgstr "" "QSO-tiedot, jotka on allekirjoitettu tällä varmenteella eivät kelpaa DXCC-" "awardia varten (mutta kelpaavat muita soveltuvia awardeja varten). Jos tätä " "varmennetta aiotaan käyttää allekirjoittamaan kansainvälisiltä merialueilta " "pidettyjä yhteyksiä, alukselta pidettyjä yhteyksiä tai ilma-aluksesta " "pidettyjä yhteyksiä, tämä on oikea valinta. Muussa tapauksessa on " "suositeltavaa OK:n valitsemisen jälkeen tehdä \"Takaisin\"-valinta " "palataksesi DXCC-sivulle" #: crqwiz.cpp:1679 stationdial.cpp:458 msgid "TQSL Warning" msgstr "TQSL-varoitus" #: crqwiz.cpp:1683 msgid "" "You cannot request a certificate for a 1x1 callsign as you must sign those " "requests, but you have no valid Callsign Certificates that you can use to " "sign this request." msgstr "" "Et voi pyytää varmennetta 1x1-kutsulle koska sinun täytyy allekirjoittaa " "tämä pyyntö, mutta sinulla ei ole voimassa olevaa kutsumerkin varmennetta, " "jolla voisit allekirjoittaa pyynnön." #: crqwiz.cpp:1692 msgid "" "You cannot request a certificate for a portable callsign as you must sign " "those requests, but you have no valid Callsign Certificates that you can use " "to sign this request." msgstr "" "Et voi pyytää varmennetta portable-kutsulle koska sinun täytyy " "allekirjoittaa tämä pyyntö, mutta sinulla ei ole voimassa olevaa kutsumerkin " "varmennetta, jolla voisit allekirjoittaa pyynnön." #: crqwiz.cpp:1699 msgid "" "You have chosen a QSO end date for this Callsign Certificate. The 'QSO end " "date' should ONLY be set if that date is the date when that callsign's " "license expired or the license was replaced by a new callsign." msgstr "" "Olet valinnut yhteyksien päättymispäivän tälle kutsumerkin varmenteelle. " "Viimeisen yhteyden päivämäärä pitäisi valita VAIN jos se on päivämäärä, " "jolloin kutsumerkin lupa päättyi tai kutsumerkki korvattiin uudella " "kutsumerkillä." #: crqwiz.cpp:1701 msgid "" "If you set an end date, you will not be able to sign QSOs past that date, " "even if the Callsign Certificate itself is still valid." msgstr "" "Jos valitset päättymispäivän, et voi varmentaa yhteyksiä jotka on pidetty " "tuon päivämäärän jälkeen, et edes vaikka itse kutsumerkin varmenne olisi " "vielä voimassa." #: crqwiz.cpp:1703 msgid "" "If you still hold this callsign (or if you plan to renew the license for the " "callsign), you should not set a 'QSO end date'." msgstr "" "Jos sinulla on vielä lupa tälle kutsumerkille (tai aiot uusia luvan tälle " "kutsumerkille), sinun ei pitäisi asettaa \"Yhteyksien päättymispäivää\"." #: crqwiz.cpp:1705 msgid "Do you really want to keep this 'QSO end date'?" msgstr "Haluatko varmasti pitää tämän QSO:jen päättymispäivän voimassa?" #: crqwiz.cpp:1737 msgid "You must enter your name" msgstr "Nimesi on annettava" #: crqwiz.cpp:1739 msgid "You must enter your address" msgstr "Osoitteesi on annettava" #: crqwiz.cpp:1741 msgid "You must enter your city" msgstr "Kaupunkisi on annettava" #: crqwiz.cpp:1759 msgid "" "This address must match the FCC ULS database.\n" "If this address information is incorrect, please correct your FCC record." msgstr "" "Tämän osoitteen on oltava sama kuin FCC:n ULS-tietokannassa.\n" "Jos tämä osoite on väärä, ole hyvä ja korjaa tiedot FCC:lle." #: crqwiz.cpp:1828 msgid "You must enter a valid email address" msgstr "Voimassa oleva sähköpostiosoite on annettava" #: crqwiz.cpp:1863 msgid "The two copies of the passphrase do not match." msgstr "Annetut salalauseet eivät täsmää." #: crqwiz.cpp:1904 msgid "Click 'Finish' to complete this Callsign Certificate request." msgstr "" "Valitse \"Lopeta\" saattaaksesi valmiiksi tämän kutsumerkin varmennepyynnön." #: crqwiz.cpp:1910 msgid "" "Please select a Callsign Certificate for the account where you would like " "the QSOs to be stored" msgstr "" "Valitse kutsumerkin varmenne tilille, jolle haluat QSO:t tallennettavan" #: crqwiz.cpp:1913 crqwiz.cpp:1920 msgid "" "Please select the Callsign Certificate for your current personal callsign to " "validate your request." msgstr "" "Valitse nykyisen henkilökohtaisen kutsumerkkisi varmenne vahvistaaksesi " "pyyntösi." #: crqwiz.cpp:1915 crqwiz.cpp:1922 msgid "Please select a Callsign Certificate to validate this request" msgstr "Valitse kutsumerkin varmenne vahvistaaksesi tämän pyynnön" #: crqwiz.cpp:1929 msgid "QSOs for %hs will be stored in the LoTW account for %s." msgstr "%hs:n QSO:t tallennetaan %s:n LoTW-tilille." #. TRANSLATORS: This is part of an deleted DXCC entity name #: dxcc.cpp:49 msgid "DELETED" msgstr "POISTETTU" #: getpassword.cpp:48 getpassword.cpp:121 qsodatadialog.cpp:387 tqsl.cpp:452 #: tqsl_prefs.cpp:70 tqsl_prefs.cpp:289 tqsl_prefs.cpp:1019 stationdial.h:46 #: tqslapp.h:132 msgid "OK" msgstr "OK" #: getpassword.cpp:51 getpassword.cpp:124 qsodatadialog.cpp:386 #: stationdial.cpp:225 tqsl.cpp:309 tqsl.cpp:364 tqsl.cpp:453 tqsl.cpp:577 #: tqsl.cpp:637 tqsl.cpp:1987 tqsl_prefs.cpp:73 tqsl_prefs.cpp:292 #: tqsl_prefs.cpp:1022 msgid "Cancel" msgstr "Peruuta" #: getpassword.cpp:53 getpassword.cpp:126 qsodatadialog.cpp:385 #: stationdial.cpp:223 tqsl_prefs.cpp:67 msgid "Help" msgstr "Ohje" #: getpassword.cpp:111 msgid "New passphrase:" msgstr "Uusi salalause:" #: getpassword.cpp:114 msgid "Enter again to confirm:" msgstr "Syötä uudelleen varmistaaksesi:" #: getpassword.cpp:146 msgid "Passphrase entries do not match" msgstr "Annetut salalauseet eivät täsmää" #: getpassword.cpp:157 msgid "Passphrase confirmed" msgstr "Salalause varmistettu" #: loadcertwiz.cpp:41 msgid "Import completed successfully" msgstr "Tuonti onnistui" #: loadcertwiz.cpp:75 msgid "OK to install " msgstr "Valmis asentamaan " #: loadcertwiz.cpp:76 msgid "certificate?" msgstr "varmenne?" #: loadcertwiz.cpp:77 msgid "Install Certificate" msgstr "Asenna varmenne" #: loadcertwiz.cpp:109 msgid "This callsign certificate is already installed" msgstr "Tämä kutsumerkin varmenne on jo asennettu" #: loadcertwiz.cpp:118 msgid "Trusted root certificate" msgstr "Luotettu päävarmenne" #: loadcertwiz.cpp:121 msgid "Certificate Authority certificate" msgstr "Varmentajan varmenne" #: loadcertwiz.cpp:124 wxutil.cpp:278 msgid "Callsign Certificate" msgstr "Kutsumerkin varmenne" #: loadcertwiz.cpp:168 msgid "Enter a passphrase for this callsign certificate." msgstr "Syötä salalause tälle kutsumerkin varmenteelle." #: loadcertwiz.cpp:170 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using " "a computer in a private residence no passphrase need be specified." msgstr "" "Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä " "antaa salalause suojataksesi tämän varmenteen. Kuitenkin, jos käytät " "tietokonetta yksityistaloudessa, salasanaa ei ole tarvetta antaa." #: loadcertwiz.cpp:172 msgid "" "This passphrase will have to be entered each time you use this callsign " "certificate for signing or when saving the key." msgstr "" "Tämä salalause on annettava joka kerta kun käytät tätä kutsumerkin " "varmennetta allekirjoitukseen tai kun tallennat avainta." #: loadcertwiz.cpp:174 tqsl.cpp:6983 msgid "" "Leave the passphrase blank and click 'OK' unless you want to use a " "passphrase." msgstr "" "Jätä salalause tyhjäksi ja valitse \"OK\", jos et halua käyttää salalausetta." #: loadcertwiz.cpp:176 msgid "New Passphrase" msgstr "Uusi salalause" #: loadcertwiz.cpp:215 msgid "" "You will not be able to use this tq6 file to recover your callsign " "certificate if it gets lost. For security purposes, you should back up your " "certificate on removable media for safe-keeping." msgstr "" "Et voi käyttää tätä tq6-tiedostoa palauttaaksesi kutsumerkin varmenteen, jos " "se menee hukkaan. Turvallisuuden vuoksi sinun olisi syytä tehdä varmuuskopio " "varmenteestasi irrotettavalle tallennusvälineelle ja säilyttää sitä " "turvallisessa paikassa." #: loadcertwiz.cpp:217 msgid "Would you like to back up your callsign certificate now?" msgstr "Haluatko nyt tehdä kutsumerkin varmenteesta varmuuskopion?" #: loadcertwiz.cpp:253 msgid "" "Callsign Certificate container files (*.p12,*.P12;*.tq6;*.TQ6)|*.p12;*.P12;*." "tq6;*.TQ6" msgstr "" "Kutsumerkin varmenne -säilötiedostot (*.p12,*. P12;*.tq6;*. TQ6)|*.p12;*. " "P12;*.tq6;*. TQ6" #: loadcertwiz.cpp:255 msgid "Callsign Certificate container files (*.p12,*.tq6))|*.p12;*.tq6" msgstr "Kutsumerkin varmenne -säilötiedostot (*.p12,*.tq6))|*.p12;*.tq6" #: loadcertwiz.cpp:257 tqsl.cpp:4545 msgid "|All files (*.*)|*.*" msgstr "|Kaikki tiedostot (*.*)|*.*" #: loadcertwiz.cpp:261 msgid "Select Certificate File" msgstr "Valitse varmennetiedosto" #: loadcertwiz.cpp:305 loadcertwiz.cpp:380 tqsl.cpp:6202 msgid "This file is not a valid P12 file" msgstr "Tämä tiedosto ei ole pätevä P12-tiedosto" #: loadcertwiz.cpp:321 msgid "Loading complete" msgstr "Lataus valmis" #: loadcertwiz.cpp:336 msgid "No status information available" msgstr "Tilatietoa ei ole saatavilla" #: loadcertwiz.cpp:343 msgid "Enter the passphrase to unlock the .p12 file:" msgstr "Syötä salalause avataksesi .p12-tiedoston:" #: loadcertwiz.cpp:377 tqsl.cpp:2275 msgid "Passphrase error" msgstr "Virhe salalauseessa" #: loctree.cpp:93 tqsl.cpp:1441 tqsl.cpp:7209 msgid "Station Locations" msgstr "Asemien sijainnit" #: qsodatadialog.cpp:166 qsodatadialog.cpp:200 qsodatadialog.cpp:208 msgid "NONE" msgstr "TYHJÄ" #: qsodatadialog.cpp:193 msgid "UP" msgstr "YLÖS" #: qsodatadialog.cpp:255 msgid "Call Sign:" msgstr "Kutsumerkki:" #: qsodatadialog.cpp:263 msgid "UTC Date (YYYY-MM-DD):" msgstr "UTC-päivämäärä (VVVV-KK-PP):" #: qsodatadialog.cpp:271 msgid "UTC Time (HHMM):" msgstr "UTC-kellonaika (TTMM):" #: qsodatadialog.cpp:280 msgid "Mode:" msgstr "Lähetelaji:" #: qsodatadialog.cpp:289 msgid "Band:" msgstr "Taajuusalue:" #: qsodatadialog.cpp:299 msgid "RX Band:" msgstr "RX-taajuusalue:" #: qsodatadialog.cpp:308 msgid "Frequency (MHz):" msgstr "Taajuus (MHz):" #: qsodatadialog.cpp:315 msgid "RX Frequency (MHz):" msgstr "RX-taajuus (MHz):" #: qsodatadialog.cpp:323 msgid "Propagation Mode:" msgstr "Etenemismuoto:" #: qsodatadialog.cpp:332 msgid "Satellite:" msgstr "Satelliitti:" #: qsodatadialog.cpp:375 msgid "Add QSO" msgstr "Lisää QSO" #: qsodatadialog.cpp:379 stationdial.cpp:218 tqsl_prefs.cpp:182 #: tqsl_prefs.cpp:837 msgid "Delete" msgstr "Poista" #: qsodatadialog.cpp:505 msgid "QSO Frequency is invalid" msgstr "Yhteyden taajuus on virheellinen" #: qsodatadialog.cpp:505 qsodatadialog.cpp:512 qsodatadialog.cpp:521 #: qsodatadialog.cpp:528 qsodatadialog.cpp:538 qsodatadialog.cpp:543 #: qsodatadialog.cpp:548 qsodatadialog.cpp:553 tqslvalidator.cpp:77 msgid "QSO Data Error" msgstr "Virhe QSO-tiedoissa" #: qsodatadialog.cpp:512 msgid "QSO Frequency is out of range for the selected band" msgstr "Yhteyden taajuus on valitun taajuusalueen ulkopuolella" #: qsodatadialog.cpp:521 msgid "QSO RX Frequency is invalid" msgstr "QSO:n RX-taajuus on virheellinen" #: qsodatadialog.cpp:528 msgid "QSO RX Frequency is out of range for the selected band" msgstr "QSO:n RX-taajuus on valitun taajuusalueen ulkopuolella" #: qsodatadialog.cpp:538 msgid "You must select a band or enter a frequency" msgstr "Taajuusalue on valittava tai taajuus annettava" #: qsodatadialog.cpp:543 msgid "Call Sign cannot be empty" msgstr "Kutsumerkki ei voi olla tyhjä" #: qsodatadialog.cpp:548 msgid "'Satellite' propagation mode selected, so a Satellite must be chosen" msgstr "" "\"Satelliitti\" etenemistapa on valittuna, joten satelliitti on valittava" #: qsodatadialog.cpp:553 msgid "Satellite choice requires that Propagation Mode be 'Satellite'" msgstr "" "Satelliitti-valinta vaatii, että etenemismuodoksi on valittu \"Satelliitti\"" #: qsodatadialog.cpp:570 #, c-format msgid "QSO Data: Invalid Mode ignored - %s" msgstr "QSO-tiedot: Virheellinen lähetelaji jätetty huomiotta - %s" #: qsodatadialog.cpp:592 msgid "No QSO records" msgstr "Ei QSO-tietoja" #: qsodatadialog.cpp:606 msgid "Save File" msgstr "Tallenna tiedosto" #: qsodatadialog.cpp:608 tqsl.cpp:1925 msgid "" "ADIF files (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All files " "(*.*)|*.*" msgstr "" "ADIF-tiedostot (*.adi;*.adif;*.ADI;*.ADIF)|*.adi;*.adif;*.ADI;*.ADIF|All " "files (*.*)|*.*" #: qsodatadialog.cpp:610 tqsl.cpp:1927 msgid "ADIF files (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*" msgstr "ADIF-tiedostot (*.adi;*.adif)|*.adi;*.adif|All files (*.*)|*.*" #: qsodatadialog.cpp:699 #, c-format msgid "Wrote %d QSO records to %s" msgstr "Kirjoitettiin %d QSO-tietoa %s:iin" #: qsodatadialog.cpp:752 msgid "The file has not been saved. Should the QSOs be saved?" msgstr "Tiedostoa ei ole tallennettu. Tallennetaanko QSO:t?" #: qsodatadialog.cpp:752 msgid "Confirm Close" msgstr "Vahvista sulkeminen" #: qsodatadialog.cpp:876 msgid "One QSO Record" msgstr "Yksi QSO-tieto" #: qsodatadialog.cpp:878 #, c-format msgid "%d QSO Records" msgstr "%d QSO-tietoa" #: stationdial.cpp:56 tqsl.cpp:6508 msgid "&Properties" msgstr "&Ominaisuudet" #: stationdial.cpp:66 msgid "Properties" msgstr "Ominaisuudet" #: stationdial.cpp:71 msgid "Value" msgstr "Arvo" #: stationdial.cpp:182 msgid "Select Station Data" msgstr "Valitse asematiedot" #: stationdial.cpp:193 msgid "Save Station Data" msgstr "Tallenna asematiedot" #: stationdial.cpp:201 msgid "Enter a name for this Station Location" msgstr "Syötä nimi tälle aseman sijainnille" #: stationdial.cpp:201 msgid "Selected Station Location" msgstr "Valittu aseman sijainti" #: stationdial.cpp:211 msgid "New..." msgstr "Uusi..." #: stationdial.cpp:214 tqsl_prefs.cpp:835 msgid "Edit..." msgstr "Muokkaa..." #: stationdial.cpp:297 msgid "Delete \"" msgstr "Poista \"" #: stationdial.cpp:297 msgid "TQSL Confirm" msgstr "TQSL-varmistus" #: stationdial.cpp:363 msgid "Call Sign" msgstr "Kutsumerkki" #: stationdial.cpp:364 msgid "Province" msgstr "Maakunta" #: stationdial.cpp:365 msgid "Continent" msgstr "Maanosa" #: stationdial.cpp:366 msgid "CQ Zone" msgstr "CQ-zone" #: stationdial.cpp:367 msgid "DXCC Entity" msgstr "DXCC-maa" #: stationdial.cpp:368 msgid "Grid Square" msgstr "Lokaattori" #: stationdial.cpp:369 msgid "IOTA ID" msgstr "IOTA-tunnus" #: stationdial.cpp:370 msgid "ITU Zone" msgstr "ITU-zone" #: stationdial.cpp:371 msgid "Oblast" msgstr "Oblast" #: stationdial.cpp:372 msgid "County" msgstr "Kunta" #: stationdial.cpp:374 msgid "WPX Prefix" msgstr "WPX-prefiksi" #: stationdial.cpp:453 msgid "You have no Station Locations defined." msgstr "Et ole määritellyt yhtään aseman sijaintia." #: stationdial.cpp:455 msgid "You must define at least one Station Location to use for signing." msgstr "" "Sinun on määriteltävä vähintään yksi aseman sijainti käyttääksesi sitä " "allekirjoitukseen." #: stationdial.cpp:457 msgid "" "Use the \"New\" Button of the dialog you're about to see to define a Station " "Location." msgstr "" "Käytä \"Uusi\"-valintaa seuraavassa valintaruudussa määrittääksesi aseman " "sijainnin." #: tqsl.cpp:189 msgid "Success" msgstr "Onnistui" #: tqsl.cpp:190 msgid "User Cancelled" msgstr "Käyttäjä perui" #: tqsl.cpp:191 msgid "Upload Rejected" msgstr "Lähetys hylätty" #: tqsl.cpp:192 msgid "Unexpected LoTW Response" msgstr "Odottamaton LoTW-vastaus" #: tqsl.cpp:194 msgid "TQSLLib Error" msgstr "TQSLLib-virhe" #: tqsl.cpp:195 msgid "Error opening input file" msgstr "Virhe avattaessa syötetiedostoa" #: tqsl.cpp:196 msgid "Error opening output file" msgstr "Virhe avattaessa tulostetiedostoa" #: tqsl.cpp:197 tqsl.cpp:2720 msgid "No QSOs to upload" msgstr "Ei QSO:ja lähetettäväksi" #: tqsl.cpp:198 msgid "Some QSOs not processed" msgstr "Ei QSO:ja käsiteltäväksi" #: tqsl.cpp:199 msgid "Command Syntax Error" msgstr "Komentosyntaksivirhe" #: tqsl.cpp:200 msgid "LoTW Connection Failed" msgstr "LoTW-yhteys epäonnistui" #: tqsl.cpp:201 msgid "Unknown" msgstr "Tuntematon" #: tqsl.cpp:202 msgid "The TQSL upload tracking database is locked" msgstr "TQSL:n verkkoon latauksen seurantatietokanta on lukittu" #: tqsl.cpp:203 msgid "Previously signed QSOs were detected" msgstr "Aiemmin allekirjoitettuja QSO-tietoja havaittiin" #: tqsl.cpp:204 msgid "Incorrect passphrase when importing P12 file" msgstr "Virheellinen salalause tuotaessa P12-tiedostoa" #: tqsl.cpp:210 msgid "Final Status: %hs (%d)" msgstr "Lopullinen tila: %hs (%d)" #. TRANSLATORS: this is followed by the callsign and entity name #: tqsl.cpp:260 msgid "" "Enter the passphrase to unlock the callsign certificate for %hs -- %hs\n" "(This is the passphrase you made up when you installed the callsign " "certificate.)" msgstr "" "Syötä salalause avataksesi varmenteen kutsumerkille %hs -- %hs\n" "(Tämä on salalause, jonka keksit, kun asensit kutsumerkin varmennetta.)" #: tqsl.cpp:271 tqsl.cpp:7704 getpassword.h:32 getpassword.h:33 msgid "Enter passphrase" msgstr "Syötä salalause" #: tqsl.cpp:302 msgid "Signing QSO Data" msgstr "Allekirjoitan QSO-tietoja" #: tqsl.cpp:305 msgid "Converting " msgstr "Muunnetaan " #: tqsl.cpp:305 msgid "to TQSL format" msgstr "TQSL-muotoon" #: tqsl.cpp:327 msgid "Uploading Signed Data" msgstr "Lähetetään allekirjoitettuja tietoja" #: tqsl.cpp:327 msgid "Uploading signed log data..." msgstr "Lähetetään allekirjoitettuja lokitietoja..." #: tqsl.cpp:421 msgid "QSO Date Range" msgstr "QSO-päivämääräalue" #: tqsl.cpp:424 msgid "" "You may set the starting and/or ending QSO dates in order to select QSOs " "from the input file." msgstr "" "Voit asettaa yhteyksien alkamis- ja/tai loppumispäivämäärät valitaksesi " "tietyt yhteydet syötetiedostosta." #: tqsl.cpp:426 msgid "" "QSOs prior to the starting date or after the ending date will not be signed " "or included in the output file." msgstr "" "Yhteyksiä ennen alkamispäivää tai loppumispäivän jälkeen ei allekirjoiteta " "tai sisällytetä tulostetiedostoon." #: tqsl.cpp:428 msgid "You may leave either date (or both dates) blank." msgstr "Voit jättää jommankumman (tai molemmat) päivämäärät tyhjäksi." #: tqsl.cpp:436 msgid "Start Date (YYYY-MM-DD)" msgstr "Alkamispäivämäärä (VVVV-KK-PP):" #: tqsl.cpp:443 msgid "End Date (YYYY-MM-DD)" msgstr "Loppupäivämäärä (VVVV-KK-PP):" #: tqsl.cpp:470 msgid "Start date is invalid" msgstr "Alkamispäivämäärä on virheellinen" #: tqsl.cpp:478 msgid "End date is invalid" msgstr "Loppupäivämäärä on virheellinen" #: tqsl.cpp:518 msgid "Previously Signed QSOs Detected" msgstr "Aiemmin allekirjoitettuja QSO-tietoja havaittiin" #: tqsl.cpp:524 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and no new QSOs." msgstr "" "Tässä lokissa on %d QSO:a, jotka näyttävät olevan jo aiemmin " "allekirjoitettuja LoTW:iin lähetettäväksi, eikä uusia QSO:ja." #: tqsl.cpp:526 msgid "Click 'Cancel' to abandon processing this log file (Recommended)." msgstr "" "Valitse \"Peruuta\" hylätäksesi tämän lokitiedoston käsittelyn " "(suositeltavaa)." #: tqsl.cpp:528 tqsl.cpp:538 tqsl.cpp:545 msgid "" "Click 'Re-Upload QSOs' to re-process this log while allowing previously " "signed QSOs." msgstr "" "Napsauta \"Lähetä QSO-tiedot uudestaan\", jotta tämä loki ja myös aiemmin " "allekirjoitetut QSO-tiedot käsitellään uudelleen." #: tqsl.cpp:532 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and %d QSOs which are new." msgstr "" "Tämä loki sisältää %d QSO:a jotka näyttävät olevan jo aiemmin " "allekirjoitettu ja ladattu LoTW:iin, ja %d uutta QSO:a." #: tqsl.cpp:534 tqsl.cpp:541 msgid "" "Click 'New QSOs Only' to sign normally, without the previously signed QSOs " "(Recommended)." msgstr "" "Allekirjoittaaksesi normaalisti ilman aiemmin allekirjoitettuja QSO:ja " "napsauta \"Vain uudet QSO:t\" (Suositeltavaa)." #: tqsl.cpp:536 tqsl.cpp:543 msgid "Click 'Cancel' to abandon processing this log file." msgstr "Valitse \"Peruuta\" hylätäksesi tämän lokitiedoston käsittelyn." #: tqsl.cpp:539 #, c-format msgid "" "This log contains %d QSO(s) which appear to have been previously signed for " "upload to LoTW, and one QSO which is new." msgstr "" "Tämä loki sisältää %d QSO:a jotka näyttävät olevan jo aiemmin " "allekirjoitettu ja ladattu LoTW:iin, ja yhden uuden QSO:n." #: tqsl.cpp:556 msgid "" "The log file you are uploading using your QSO Logging system consists " "entirely of previously uploaded QSOs that create unnecessary work for LoTW. " "There may be a more recent version of your QSO Logging system that would " "prevent this. Please check with your QSO Logging system's vendor for an " "updated version." msgstr "" "Lokitiedosto, jota lähetät QSO-lokiohjelmaasi käyttäen, koostuu ainoastaan " "jo aiemmin lähetetyistä QSO-tiedoista (duplikaateista), jotka aiheuttavat " "turhaa prosessointikuormaa LoTW:lle. Lokiohjelmastasi on mahdollisesti " "saatavilla uudempi versio, joka estää tämän. Tarkista lokiohjelmasi " "valmistajalta, onko uudempaa versiota saatavilla." #: tqsl.cpp:558 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. Choosing 'Cancel' is " "usually safe, but a defective logger not checking the status messages " "reported by TrustedQSL may produce strange (but harmless) behavior such as " "attempting to upload an empty file or marking all chosen QSOs as 'sent'" msgstr "" "Huomaa, että jotkut lokiohjelmat voivat toimia oudosti jos et valitse " "vaihtoehtoa \"Lähetä QSO-tiedot uudestaan\". \"Peruuta\" on yleensä " "turvallinen vaihtoehto, mutta epätäydellinen lokiohjelma, joka ei tarkista " "TQSL:n tilaviestejä voi tuottaa oudon (mutta vaarattoman)tuloksen kuten " "yrittää lähettää tyhjää tiedostoa tai merkitä kaikki QSO-tiedot lähetetyiksi." #: tqsl.cpp:561 msgid "" "The log file you are uploading using your QSO Logging system includes some " "previously uploaded QSOs that create unnecessary work for LoTW. There may be " "a more recent version of your QSO Logging system that would prevent this. " "Please check with your QSO Logging system's vendor for an updated version." msgstr "" "Lokitiedosto, jota lähetät QSO-lokiohjelmaasi käyttäen, sisältää joitakin jo " "aiemmin lähetettyjä QSO-tietoja (duplikaatteja), jotka aiheuttavat turhaa " "prosessointikuormaa LoTW:lle. Lokiohjelmastasi on mahdollisesti saatavilla " "uudempi versio, joka estää tämän. Tarkista lokiohjelmasi valmistajalta, onko " "uudempaa versiota saatavilla." #: tqsl.cpp:563 msgid "" "In the meantime, please note that some loggers may exhibit strange behavior " "if an option other than 'Re-Upload QSOs' is clicked. 'New QSOs Only' is " "recommended, but a logger that does its own upload tracking may incorrectly " "set the status in this case. A logger that doesn't track uploads should be " "unaffected by choosing 'New QSOs Only' and if it tracks 'QSO sent' status, " "will correctly mark all selected QSOs as sent - they are in your account " "even though they would not be in this specific batch" msgstr "" "Huomaa, että jotkut lokiohjelmat voivat toimia oudosti jos et valitse " "vaihtoehtoa \"Lähetä QSO-tiedot uudestaan\". \"Vain uudet QSO-tiedot\" on " "suositeltava vaihtoehto, mutta lokiohjelma, joka itse seuraa lähetettyjä " "tietoja saattaa tässä tapauksessa merkit lähetettyjen tietojen tilan väärin. " "Lokiohjelma, joka ei seuraa lähetettyjä tietoja, toiminee oikein valinnan " "\"Vain uudet QSO-tiedot\" kanssa, ja jos se seuraa \"QSO-tiedot lähetetty\" -" "tilaa, se merkitsee oikein kaikki valitut QSO-tiedot lähetetyiksi - ne ovat " "tililläsi vaikka niitä ei lähetetäkään tässä nimenomaisessa lähetyksessä" #: tqsl.cpp:565 msgid "" "Choosing 'Cancel' is usually safe, but a defective logger not checking the " "status messages reported by TrustedQSL may produce strange (but harmless) " "behavior such as attempting to upload an empty file or marking all chosen " "QSOs as 'sent'" msgstr "" "\"Peruuta\"-valinta on yleensä turvallista tehdä, mutta virheellisesti " "toimiva lokiohjelma, joka ei tarkista TQSL:n ilmoittamia tilaviestejä, voi " "tuottaa outoa (mutta harmitonta) käytöstä, kuten sitä että se yrittää " "lähettää tyhjää tiedostoa tai merkitsee kaikki valitut QSO:t lähetetyiksi." #: tqsl.cpp:576 msgid "New QSOs Only" msgstr "Vain uudet QSO-tiedot" #: tqsl.cpp:578 msgid "Re-Upload QSOs" msgstr "Lähetä QSO-tiedot uudestaan" #: tqsl.cpp:603 msgid "" "The only reason to re-sign previously signed QSOs is if a previous upload " "was not processed by LoTW, either because it was never uploaded, or there " "was a server failure" msgstr "" "Ainoa syy allekirjoittaa uudelleen aiemmin allekirjoitettuja QSO:ja on että " "LoTW ei käsitellyt aiempaa latausta koska latausta ei todellisuudessa " "tapahtunut tai tapahtui palvelinvirhe" #: tqsl.cpp:605 msgid "Are you sure you want to proceed? Click 'No' to review the choices" msgstr "Haluatko varmasti jatkaa? Valitse \"Ei\", jotta voit valita uudelleen" #: tqsl.cpp:606 msgid "Are you sure?" msgstr "Oletko varma?" #: tqsl.cpp:629 msgid "Errors Detected" msgstr "Virheitä havaittu" #: tqsl.cpp:636 msgid "Ignore" msgstr "Jätä huomiotta" #: tqsl.cpp:678 msgid "" "Your custom mode map %s conflicts with the standard mode definition for %hs " "and was deleted." msgstr "" "Erityinen lähetelajikuvauksesi %s on ristiriidassa " "peruslähetelajimääritelmän %hs kanssa ja se poistettiin." #: tqsl.cpp:955 msgid "Error renaming backup file %s: %hs" msgstr "Virhe uudelleennimettäessä varmuuskopiotiedostoa %s: %hs" #: tqsl.cpp:1091 tqsl.cpp:1110 msgid "Checking for TQSL updates..." msgstr "Tarkistetaan TQSL-päivityksiä..." #: tqsl.cpp:1157 msgid "Sign and &upload ADIF or Cabrillo File..." msgstr "Allekirjoita ja &lähetä ADIF- tai Cabrillo-tiedosto..." #: tqsl.cpp:1158 msgid "&Sign and save ADIF or Cabrillo file..." msgstr "Allekirjoita ja tallennna ADIF- tai Cabrillo-tiedosto..." #: tqsl.cpp:1159 msgid "&Test Signing an ADIF or Cabrillo file..." msgstr "&Kokeile allekirjoittaa ADIF- tai Cabrillo-tiedosto..." #: tqsl.cpp:1161 msgid "&Backup Station Locations, Certificates, and Preferences..." msgstr "&Varmuuskopioi asemien sijainnit, varmenteet ja asetukset..." #: tqsl.cpp:1162 msgid "&Restore Station Locations, Certificates, and Preferences..." msgstr "&Palauta asemien sijainnit, varmenteet ja asetukset..." #: tqsl.cpp:1164 msgid "Create &New ADIF file..." msgstr "Luo &uusi ADIF-tiedosto..." #: tqsl.cpp:1165 msgid "&Edit existing ADIF file..." msgstr "&Muokkaa olemassaolevaa ADIF-tiedostoa..." #: tqsl.cpp:1168 msgid "&Preferences..." msgstr "&Asetukset..." #: tqsl.cpp:1170 msgid "Display or Modify &Preferences..." msgstr "Näytä tai muokkaa &asetuksia..." #: tqsl.cpp:1173 tqsl.cpp:7281 tqsl.cpp:7283 msgid "Language" msgstr "Kieli" #: tqsl.cpp:1175 msgid "Dia&gnostic Mode" msgstr "Dia&gnoosimoodi" #: tqsl.cpp:1180 tqslupdater.cpp:111 msgid "E&xit TQSL\tAlt-X" msgstr "Sulje TQSL\tAlt-&X" #: tqsl.cpp:1185 msgid "&Display Station Location Properties" msgstr "&Näytä aseman sijaintitiedot" #: tqsl.cpp:1187 msgid "&Edit Station Location" msgstr "&Muokkaa aseman sijaintia" #: tqsl.cpp:1188 msgid "&Add Station Location" msgstr "&Lisää aseman sijainti" #: tqsl.cpp:1194 msgid "&Restore a Deleted Station Location" msgstr "&Palauta poistettu aseman sijainti" #: tqsl.cpp:1207 msgid "&Contents" msgstr "&Sisältö" #: tqsl.cpp:1209 msgid "Display &Documentation" msgstr "Näytä &ohjeet" #: tqsl.cpp:1214 msgid "Check for &Updates..." msgstr "Tarkista &Päivitykset..." #: tqsl.cpp:1216 msgid "&About" msgstr "&Tietoja" #: tqsl.cpp:1219 tqsl_prefs.cpp:104 msgid "&File" msgstr "&Tiedosto" #: tqsl.cpp:1220 msgid "&Station Location" msgstr "&Aseman sijainti" #: tqsl.cpp:1221 msgid "Callsign &Certificate" msgstr "&Kutsumerkin varmenne" #: tqsl.cpp:1222 msgid "&Help" msgstr "&Ohje" #: tqsl.cpp:1237 tqsl.cpp:1322 msgid "Log Operations" msgstr "Lokitoiminnot" #: tqsl.cpp:1244 tqsl.cpp:1560 msgid "Status Log" msgstr "Tilatiedot" #: tqsl.cpp:1270 msgid "Sign a log and upload it automatically to LoTW" msgstr "Allekirjoita loki ja lähetä automaattisesti LoTW:iin" #: tqsl.cpp:1285 msgid "Sign a log and save it for uploading later" msgstr "Allekirjoita loki, tallenna ja lähetä myöhemmin" #: tqsl.cpp:1301 msgid "Create an ADIF file for signing and uploading" msgstr "Muodosta ADIF-tiedosto allekirjoittamista ja lähettämistä varten" #: tqsl.cpp:1316 msgid "Log in to the Logbook of the World Site" msgstr "Kirjaudu Logbook of the Word -palveluun" #: tqsl.cpp:1354 msgid "Select a Station Location to process " msgstr "Valitse aseman sijainti tehdäksesi muutoksia " #: tqsl.cpp:1387 msgid "Create a new Station Location" msgstr "Luo uusi aseman sijainti" #: tqsl.cpp:1402 tqsl.cpp:7121 msgid "Edit a Station Location" msgstr "Muokkaa aseman sijaintia" #: tqsl.cpp:1419 tqsl.cpp:7123 msgid "Delete a Station Location" msgstr "Poista aseman sijainti" #: tqsl.cpp:1436 tqsl.cpp:7125 msgid "Display Station Location Properties" msgstr "Näytä aseman sijaintitiedot" #: tqsl.cpp:1464 tqsl.cpp:6867 msgid "Select a Callsign Certificate to process" msgstr "Valitse kutsumerkin varmenne tehdäksesi muutoksia" #: tqsl.cpp:1492 msgid "Load a Callsign Certificate" msgstr "Lataa kutsumerkin varmenne" #: tqsl.cpp:1509 tqsl.cpp:6859 msgid "Save a Callsign Certificate" msgstr "Tallenna kutsumerkin varmenne" # Tässä ei käytetä verbiä "uusi", koska se voi sekoittua adjektiivin "uusi" kanssa #: tqsl.cpp:1526 tqsl.cpp:6652 tqsl.cpp:6861 tqsl.cpp:6928 msgid "Renew a Callsign Certificate" msgstr "Uudista kutsumerkin varmenne" #: tqsl.cpp:1543 msgid "Display a Callsign Certificate's Properties" msgstr "Näytä kutsumerkin varmenteen tiedot" #: tqsl.cpp:1577 tqsl.cpp:1714 tqsl.cpp:1744 msgid "Add Station Location" msgstr "Lisää aseman sijainti" #: tqsl.cpp:1663 msgid "About" msgstr "Tietoja" #: tqsl.cpp:1676 msgid "Log File" msgstr "Lokitiedosto" #: tqsl.cpp:1677 msgid "Log files (*.log)|*.log|All files (*.*)|*.*" msgstr "Lokitiedostot (*.log)|*.log|Kaikki tiedostot (*.*)|*.*" #: tqsl.cpp:1684 msgid "Error opening diagnostic log %s: %hs" msgstr "Virhe avattaessa diagnosointilokia %s: %hs" #: tqsl.cpp:1685 msgid "Log File Error" msgstr "Virhe lokitiedostossa" #. TRANSLATORS: uncommon error - error in a station location, followed by the ignore message that follows. #: tqsl.cpp:1772 tqsl.cpp:3186 tqsl.cpp:7242 msgid "The invalid data was ignored." msgstr "Virheelliset tiedot jätettiin huomiotta." #: tqsl.cpp:1773 msgid "Location data error" msgstr "Virhe paikkatiedossa" #: tqsl.cpp:1777 tqsl.cpp:1804 tqsl.cpp:3191 tqsl.cpp:7247 msgid "Edit Station Location : %hs - %s" msgstr "Muokkaa aseman sijaintia : %hs - %s" #: tqsl.cpp:1813 tqsl.cpp:6127 msgid "Edit Station Location" msgstr "Muokkaa aseman sijaintia" #: tqsl.cpp:1813 tqsl.cpp:7552 tqsl.cpp:7654 tqsl_prefs.cpp:101 msgid "Close" msgstr "Sulje" #: tqsl.cpp:1923 msgid "Open File" msgstr "Avaa tiedosto" #: tqsl.cpp:2078 msgid "Please choose a callsign for this Station Location" msgstr "Valitse kutsumerkki tälle aseman sijainnille" #: tqsl.cpp:2079 msgid "Select Callsign" msgstr "Valitse kutsumerkki" #: tqsl.cpp:2111 msgid "There are no valid callsign certificates for callsign" msgstr "Ei ole voimassaolevia kutsumerkin varmenteita kutsulle" #: tqsl.cpp:2113 msgid "in entity" msgstr "maassa" #: tqsl.cpp:2115 msgid "Signing aborted." msgstr "Allekirjoittaminen keskeytetty." #: tqsl.cpp:2126 msgid "Signing using Callsign %hs, DXCC Entity %hs" msgstr "Varmistetaan käyttäen kutsumerkkiä %hs, DXCC-maata %hs" #: tqsl.cpp:2146 msgid "Another copy of TQSL is signing a log" msgstr "Toinen TQSL:n kopio allekirjoittaa lokia" #: tqsl.cpp:2147 msgid "" "TQSL must wait for other running copies of TQSL to exit before signing ..." msgstr "" "Ennen allekirjoittamista TQSL joutuu odottamaan kunnes muut TQSL:n kopiot " "lopettavat toimintansa..." #: tqsl.cpp:2152 msgid "Aborting due to user cancelling" msgstr "Keskeytetään käyttäjän perumisen vuoksi" #: tqsl.cpp:2180 tqsl.cpp:2436 msgid "Cancelled" msgstr "Peruttu" #: tqsl.cpp:2234 tqsl.cpp:2244 #, c-format msgid "QSOs: %d" msgstr "QSO:ja: %d" #: tqsl.cpp:2236 #, c-format msgid "Previously Signed: %d" msgstr "Aiemmin allekirjoitettu: %d" #: tqsl.cpp:2238 tqsl.cpp:2248 #, c-format msgid "Errors: %d" msgstr "Virheitä: %d" #: tqsl.cpp:2246 #, c-format msgid "Previously signed: %d" msgstr "Aiemmin allekirjoitettu: %d" #: tqsl.cpp:2255 msgid "" "This log has too many previously uploaded QSOs. Please only upload new QSOs " "or break the log into smaller pieces (50,000 QSOs or less)." msgstr "" "Tässä lokissa on liian monta aiemmin lähettyä QSO-tietoa. Lähetä vain uusien " "QSO:jen tiedot tai jaa loki pienempiin palasiin (enintään 50 000 QSO:a)." #: tqsl.cpp:2327 tqsl.cpp:2411 #, c-format msgid "on line %d" msgstr "rivillä %d" #: tqsl.cpp:2337 #, c-format msgid "" "Your QTH Details changed for this QSO.\n" "\n" "Originally these were: %s\n" "Now they are:%s\n" "\n" "Please verify that you intended to change this QSO!\n" msgstr "" "QTH-tietosi muuttuivat tälle QSO:lle.\n" "\n" "Alunperin ne olivat: %s\n" "Nyt ne ovat: %s\n" "\n" "Varmista, että halusit muuttaa tämän QSO:n!\n" #: tqsl.cpp:2359 msgid "Click 'Ignore' to continue signing this log while ignoring errors." msgstr "" "Valitse \"Jätä huomiotta\" jatkaaksesi tämän lokin varmentamista ja " "jättääksesi virheet huomioimatta." #: tqsl.cpp:2361 msgid "Click 'Cancel' to abandon signing this log." msgstr "Valitse \"Peruuta\" hylätäksesi tämän lokin allekirjoittamisen." #: tqsl.cpp:2389 msgid "Signing cancelled" msgstr "Allekirjoittaminen peruttu" #: tqsl.cpp:2392 msgid "Duplicate QSO detected" msgstr "Duplikaatti-QSO:ja havaittu" #: tqsl.cpp:2395 msgid "Signing aborted" msgstr "Allekirjoittaminen keskeytetty" #: tqsl.cpp:2414 msgid "Signing aborted due to errors" msgstr "Allekirjoittaminen keskeytetty virheiden vuoksi" #: tqsl.cpp:2418 #, c-format msgid "%s: %d QSOs were outside the selected date range" msgstr "%s: %d QSO:a oli valitun päivämääräalueen ulkopuolella" #: tqsl.cpp:2455 msgid "All QSOs are previously signed; aborted" msgstr "Kaikki QSO:t on jo allekirjoitettu; keskeytetty" #: tqsl.cpp:2462 #, c-format msgid "%d of %d QSOs are previously signed; aborted" msgstr "%d %d:sta QSO:sta on jo allekirjoitettu; keskeytetty" #: tqsl.cpp:2479 #, c-format msgid "%s: %d QSO records were previously signed" msgstr "%s: %d QSO-tietueet oli aiemmin allekirjoitettu" #: tqsl.cpp:2507 msgid "Invalid contact - QSO does not specify a Callsign" msgstr "Virheellinen yhteys - QSO ei määrittele kutsumerkkiä" #: tqsl.cpp:2508 msgid "Invalid contact - QSO does not specify a band or frequency" msgstr "Virheellinen yhteys - QSO ei määrittele taajuusaluetta tai taajuutta" #: tqsl.cpp:2509 msgid "Invalid contact - QSO does not specify a mode" msgstr "Virheellinen yhteys - QSO ei määrittele lähetelajia" #: tqsl.cpp:2510 msgid "Invalid contact - QSO does not specify a date" msgstr "Virheellinen yhteys - QSO ei määrittele päivämäärää" #: tqsl.cpp:2511 msgid "Invalid contact - QSO does not specify a time" msgstr "Virheellinen yhteys - QSO ei määrittele kellonaikaa" #: tqsl.cpp:2513 msgid "This callsign certificate is already active and cannot be restored." msgstr "Tämä kutsumerkin varmenne on jo aktiivinen eikä sitä voida palauttaa." #: tqsl.cpp:2548 #, c-format msgid "Unable to open %s for output" msgstr "Ei pystytä avaamaan %s:ää ulostuloon" #: tqsl.cpp:2558 msgid "No records output" msgstr "Ei tietoja tulosteessa" #: tqsl.cpp:2621 #, c-format msgid "%s: wrote %d records to %s" msgstr "%s: kirjoitettiin %d tietoa %s:ään" #: tqsl.cpp:2624 #, c-format msgid "%s is ready to be emailed or uploaded." msgstr "%s on valmis sähköpostitse lähetettäväksi tai ladattavaksi palveluun." #: tqsl.cpp:2625 msgid "Note: TQSL assumes that this file will be uploaded to LoTW." msgstr "Huomaa: TQSL olettaa että tämä tiedosto lähetetään LoTW:iin." #: tqsl.cpp:2626 msgid "" "Resubmitting these QSOs will cause them to be reported as already signed." msgstr "" "Näiden QSO:jen lähettäminen uudelleen aiheuttaa sen, että ne ilmoitetaan jo " "allekirjoitetuiksi." #: tqsl.cpp:2628 #, c-format msgid "" "To submit the signed log file to LoTW:\n" "1. Move the signed log file to a computer with internet access\n" "2. Log in to your LoTW Web Account\n" "3. Select the Upload File tab\n" "4. Click the Choose File button, and select the signed log file you created " "(%s)\n" "5. Click the Upload file button\n" "\n" "Alternatively, you can attach the signed log file to an email message, and " "send the message to lotw-logs@arrl.org" msgstr "" "Lähettääksesi allekirjoitetun lokitiedoston LoTW:iin:\n" "1. Siirrä allekirjoitettu lokitiedosto internet-yhteydelliseen " "tietokoneeseen\n" "2. Kirjaudu sisään LoTW-tilillesi\n" "3. Valitse Upload File -välilehti\n" "4. Napsauta Choose File -painiketta ja valitse luomasi allekirjoitettu " "tiedosto (%s)\n" "5. Napsauta Upload file -painiketta\n" "\n" "Voit vaihtoehtoisesti liittää allekirjoitetun tiedoston sähköpostiin ja " "lähettää viestin osoitteeseen lotw-logs@arrl.org" #: tqsl.cpp:2630 msgid "" "Note: TQSL has not recorded signing these QSOs. You can submit this log file " "to LoTW or discard it." msgstr "" "Huomaa: TQSL:llä ti ole tietoa näiden QSO:jen allekirjoittamisesta. Voit " "lähettää tämän lokitiedoston LoTW:iin tai hylätä sen." #: tqsl.cpp:2735 msgid "Error compressing before upload" msgstr "Virhe kompressoinnissa ennen lähetystä" #: tqsl.cpp:2842 msgid "Unable to open ca-bundle.crt. Your TQSL installation is incomplete" msgstr "" "Ei voitu avata tiedostoa ca-bundle.crt. TQSL-asennuksesi on epätäydellinen" #: tqsl.cpp:2907 msgid "Error: Could not upload file (CURL Init error)" msgstr "Virhe: ei voitu lähettää tiedostoa (CURL:in alustusvirhe)" #: tqsl.cpp:2942 msgid "Attempting to upload one QSO" msgstr "Yritetään lähettää yksi QSO-tieto" #: tqsl.cpp:2944 #, c-format msgid "Attempting to upload %d QSOs" msgstr "Yritetään lähettää %d QSO-tietoa" #: tqsl.cpp:2947 #, c-format msgid "Attempting to upload %s" msgstr "Yritetään lähettää %s" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate" msgstr "Lähetetään kutsumerkin varmennetta" #: tqsl.cpp:2954 msgid "Uploading Callsign Certificate Request..." msgstr "Lähetetään kutsumerkin varmennepyyntöä..." #: tqsl.cpp:2963 msgid "Could not spawn upload thread!" msgstr "Ei onnistuttu luomaan lähetyssäiettä!" #: tqsl.cpp:2997 #, c-format msgid "" "%s: Log uploaded successfully with result:\n" "\n" "%s" msgstr "" "%s: Loki lähetettiin onnistuneesti tuloksella:\n" "\n" "%s" #: tqsl.cpp:2999 tqsl.cpp:3020 msgid "After reading this message, you may close this program." msgstr "Voit sulkea ohjelman tämän viestin lukemisen jälkeen." #: tqsl.cpp:3007 tqsl.cpp:3012 #, c-format msgid "" "%s uploaded with result:\n" "\n" "%s" msgstr "" "%s: lähetettiin onnistuneesti tuloksella:\n" "\n" "%s" #: tqsl.cpp:3009 #, c-format msgid "" "%s Uploaded with result:\n" "\n" "%s" msgstr "" "%s lähetettiin tuloksella:\n" "\n" "%s" #: tqsl.cpp:3019 #, c-format msgid "%s: Log uploaded successfully" msgstr "%s: Loki lähetettiin onnistuneesti" #: tqsl.cpp:3022 #, c-format msgid "%s uploaded successfully" msgstr "%s lähetettiin onnistuneesti" #: tqsl.cpp:3029 #, c-format msgid "%s: %s upload was rejected with result \"%s\"" msgstr "%s: %s lähetyksestä kieltäydyttiin tuloksella \"%s\"" #: tqsl.cpp:3033 #, c-format msgid "%s: %s upload was rejected" msgstr "%s: %s lähetyksestä kieltäydyttiin" #: tqsl.cpp:3039 #, c-format msgid "%s: Got an unexpected response on %s upload! Maybe the site is down?" msgstr "" "%s: Vastauksena %s lähettämiseen tuli odottamaton vastaus! Ehkä palvelu on " "alhaalla?" #: tqsl.cpp:3051 #, c-format msgid "" "%s: Unable to upload - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "%s: Ei pystytä lähettämään - joko internet-yhteytesi on alhaalla tai LoTW:" "iin ei saada yhteyttä." #: tqsl.cpp:3052 tqsl.cpp:3056 tqsl.cpp:3060 #, c-format msgid "Please try uploading the %s later." msgstr "Yritä lähettää %s myöhemmin." #: tqsl.cpp:3055 #, c-format msgid "%s: Unable to upload. The network is down or the LoTW site is too busy." msgstr "" "%s: Ei voida lähettää. Verkko on alhaalla tai LoTW-palvelin on liian " "kiireinen." #: tqsl.cpp:3059 #, c-format msgid "%s: Unable to connect to the upload site." msgstr "%s: Ei pystytä yhdistämään tallennuspalvelimelle." #: tqsl.cpp:3063 #, c-format msgid "%s: Upload cancelled" msgstr "%s: Lähetys peruttu" #: tqsl.cpp:3068 msgid "%s: Couldn't upload the file: CURL returned \"%hs\" (%hs)" msgstr "%s: Ei voitu lähettää tiedostoa: CURL palautti \"%hs\" (%hs)" #: tqsl.cpp:3081 msgid "Your upload appears to have failed. Should TQSL try again?" msgstr "" "Lähetyksesi näyttää epäonnistuneen. Pitäisikö TQSL:n yrittää uudelleen?" #: tqsl.cpp:3081 tqsl.cpp:6794 msgid "Retry?" msgstr "Yritä uudelleen?" #: tqsl.cpp:3110 msgid "" "There are no callsign certificates for callsign %hs. This station location " "cannot be edited." msgstr "" "Varmenteita ei ole kutsumerkille %hs. Tätä aseman sijaintia ei voi muokata." #: tqsl.cpp:3110 tqsl.cpp:3112 tqsl.cpp:3146 msgid "No Certificate" msgstr "Ei varmennetta" #: tqsl.cpp:3112 tqsl.cpp:3132 msgid "" "There are no current callsign certificates for callsign %hs. This station " "location cannot be used to sign a log file." msgstr "" "Voimassaolevia varmenteita ei ole kutsumerkille %hs. Tätä aseman sijaintia " "ei voi käyttää lokitiedoston allekirjoittamiseen." #: tqsl.cpp:3134 msgid "" "There is a newer callsign certificate for callsign %hs. This station " "location cannot be used to sign a log file until the new certificate is " "installed." msgstr "" "Kutsumerkin varmenteelle %hs on voimassa uudempi kutsumerkin varmenne. Tätä " "aseman sijaintia voi käyttää lokin allekirjoitukseen vasta kun se on " "asennettu." #: tqsl.cpp:3136 msgid "" "The callsign certificate for callsign %hs has expired. This station location " "cannot be used to sign a log file until a valid callsign certificate is " "installed." msgstr "" "Kutsumerkin varmenne kutsulle %hs on vanhentunut. Tätä aseman sijaintia ei " "voi käyttää lokitiedoston allekirjoitukseen ennen kuin voimassa oleva " "kutsumerkin varmenne on asennettu." #: tqsl.cpp:3187 tqsl.cpp:3207 tqsl.cpp:7243 msgid "Station Location data error" msgstr "Aseman sijaintitiedoissa virhe" #: tqsl.cpp:3206 msgid "This should be corrected before signing a log file." msgstr "Tämä on syytä korjata ennen lokitiedoston allekirjoittamista." #: tqsl.cpp:3376 msgid "TQSL Update Available" msgstr "TQSL-päivitys saatavissa" #: tqsl.cpp:3388 #, c-format msgid "A new TQSL release (V%s) is available!" msgstr "Uusi TQSL-versio (V%s) on saatavissa!" #: tqsl.cpp:3390 #, c-format msgid "" "An updated TrustedQSL configuration file (V%s) is available!\n" "The configuration file installs definitions for entities, modes, etc." msgstr "" "Päivitetty TrustedQSL-kokoonpanotiedosto (V%s) on saatavissa!\n" "Kokoonpanotiedosto asentaa määrittelyt maille, lähetelajeille jne." #: tqsl.cpp:3398 msgid "Download from:" msgstr "Lataa:" #: tqsl.cpp:3407 msgid "More details at:" msgstr "Lisätietoja:" #: tqsl.cpp:3415 msgid "Click 'OK' to install the new version of TQSL, or Cancel to ignore it." msgstr "" "Valitse \"OK\" asentaaksesi TQSL:n uuden version tai \"Peruuta\" jättääksesi " "sen asentamatta." #: tqsl.cpp:3420 msgid "" "Click 'OK' to install the new configuration file, or Cancel to ignore it." msgstr "" "Valitse \"OK\" asentaaksesi uuden kokoonpanotiedoston tai \"Peruuta\" " "jättääksesi sen asentamatta." #: tqsl.cpp:3472 msgid "Can't open new configuration file %s: %hs" msgstr "Ei voitu avata uutta kokoonpanotiedostoa %s: %hs" #: tqsl.cpp:3488 tqsl.cpp:3568 msgid "Error writing new configuration file %s: %hs" msgstr "Virhe kirjoitettaessa uutta konfiguraatiotiedostoa %s: %hs" #: tqsl.cpp:3496 msgid "Configuration file successfully updated" msgstr "Kokoonpanotiedoston päivitys onnistui" #: tqsl.cpp:3496 msgid "Update Completed" msgstr "Päivitys valmis" #: tqsl.cpp:3512 tqsl.cpp:3592 msgid "" "Unable to update - either your Internet connection is down or LoTW is " "unreachable." msgstr "" "Ei voitu päivittää - joko internet-yhteytesi on poissa käytöstä tai LoTW:iin " "ei saada yhteyttä." #: tqsl.cpp:3513 tqsl.cpp:3516 tqsl.cpp:3519 tqsl.cpp:3593 tqsl.cpp:3596 #: tqsl.cpp:3599 tqsl.cpp:4113 tqsl.cpp:4119 tqsl.cpp:4125 tqsl.cpp:4148 #: tqsl.cpp:4154 tqsl.cpp:4160 msgid "Please try again later." msgstr "Yritä uudelleen myöhemmin." #: tqsl.cpp:3515 tqsl.cpp:3595 msgid "Unable to update. The network is down or the LoTW site is too busy." msgstr "" "Ei voida päivittää. Joko verkko on poissa käytöstä tai LoTW-sivusto on liian " "kiireinen." #: tqsl.cpp:3518 tqsl.cpp:3598 tqsl.cpp:4123 tqsl.cpp:4158 msgid "Unable to connect to the update site." msgstr "Ei saatu yhteyttä päivityssivustoon." #: tqsl.cpp:3521 msgid "Error downloading new configuration file:" msgstr "Virhe ladattaessa uutta kokoonpanotiedostoa:" #: tqsl.cpp:3523 tqsl.cpp:3603 tqsl.cpp:3894 msgid "Update" msgstr "Päivitä" #: tqsl.cpp:3552 msgid "Can't open TQSL update file %s: %hs" msgstr "Ei voitu avata TQSL:n päivitystiedostoa %s: %hs" #: tqsl.cpp:3601 msgid "Error downloading new file:" msgstr "Virhe ladattaessa uutta tiedostoa:" #: tqsl.cpp:3857 msgid "Error checking for expired callsign certificates:" msgstr "Virhe tarkistettaessa vanhentuneita kutsumerkkien varmenteita:" #: tqsl.cpp:3858 msgid "Check Error" msgstr "Tarkistusvirhe" #: tqsl.cpp:3861 msgid "The certificate for %hs expires in %d days." msgstr "Varmenne %hs:lle vanhenee %d:ssä päivässä." #: tqsl.cpp:3864 msgid "The certificate for %hs expires in %d days" msgstr "Varmenne %hs:lle vanhenee %d:ssa päivässä" #: tqsl.cpp:3866 msgid "Do you want to renew it now?" msgstr "Haluatko uudistaa sen nyt?" #: tqsl.cpp:3868 msgid "Certificate Expiring" msgstr "Varmenne vanhenee" #: tqsl.cpp:3912 #, c-format msgid "A new TQSL release (V%s) is available." msgstr "Uusi TQSL-versio (V%s) on saatavissa." #: tqsl.cpp:3929 #, c-format msgid "A new TrustedQSL configuration file (V%s) is available." msgstr "Uusi TrustedQSL-kokoonpanotiedosto (V%s) on saatavilla." #: tqsl.cpp:3942 msgid "Your system is up to date" msgstr "Järjestelmäsi on päivitetty viimeisimpään versioon" #: tqsl.cpp:3944 msgid "TQSL Version %hs and Configuration Data Version %s" msgstr "TQSL-versio %hs ja kokoonpanotietojen versio %s" #: tqsl.cpp:3946 msgid "are the newest available" msgstr "ovat ajan tasalla" #: tqsl.cpp:3947 msgid "No Updates" msgstr "Ei päivityksiä" #: tqsl.cpp:4111 tqsl.cpp:4146 msgid "" "Unable to check for updates - either your Internet connection is down or " "LoTW is unreachable." msgstr "" "Ei voitu tarkistaa päivityksiä - joko internet-yhteytesi on poissa käytöstä " "tai LoTW:iin ei saada yhteyttä." #: tqsl.cpp:4117 tqsl.cpp:4152 msgid "" "Unable to check for updates. The network is down or the LoTW site is too " "busy." msgstr "" "Ei voida tarkistaa päivityksiä. Joko verkko on poissa käytöstä tai LoTW-" "sivusto on liian kiireinen." #: tqsl.cpp:4128 msgid "Error downloading new version information:" msgstr "Virhe ladattaessa uuden version tietoja:" #: tqsl.cpp:4163 msgid "Error downloading update version information:" msgstr "Virhe ladattaessa päivityksen versiotietoja:" #: tqsl.cpp:4482 msgid "You have no callsign certificates to use to sign a log file." msgstr "Sinulla ei ole kutsumerkin varmenteita varmentaaksesi lokitiedoston." #: tqsl.cpp:4484 msgid "Please install a callsign certificate then try again." msgstr "Asenna kutsumerkin varmenne ja yritä uudelleen." #: tqsl.cpp:4485 msgid "No Callsign Certificates" msgstr "Ei kutsumerkin varmenteita" #: tqsl.cpp:4510 msgid "|ADIF files (" msgstr "|ADIF-tiedostot (" #: tqsl.cpp:4522 msgid "|Cabrillo files (" msgstr "|Cabrillo-tiedostot (" #: tqsl.cpp:4525 msgid "Select file to Sign" msgstr "Valitse allekirjoitettava tiedosto" #: tqsl.cpp:4541 msgid "TQSL compressed data files (*.tq8)|*.tq8" msgstr "TQSL-pakatut datatiedostot (*.tq8)|*.tq8" #: tqsl.cpp:4542 msgid "TQSL data files (*.tq7)|*.tq7" msgstr "TQSL-datatiedostot (*.tq7)|*.tq7" #: tqsl.cpp:4544 msgid "Select file to write to" msgstr "Valitse tiedosto, johon kirjoitetaan" #: tqsl.cpp:4560 tqsl.cpp:6263 msgid "Select Station Location for Signing" msgstr "Valitse aseman sijainti allekirjoitusta varten" #: tqsl.cpp:4593 msgid "Signing abandoned" msgstr "Allekirjoittaminen hylätty" #: tqsl.cpp:4811 msgid "" "TQSL must wait for other running copies of TQSL to exit before backing up..." msgstr "" "TQSL:n täytyy odottaa muiden ajettavien TQSL-kopioiden suorituksen " "päättymistä ennen varmuuskopiointia..." #: tqsl.cpp:4828 tqsl.cpp:5384 msgid "Error opening save file %s: %hs" msgstr "Virhe avattaessa tallennustiedostoa %s: %hs" #: tqsl.cpp:4844 msgid "Saving callsign certificates" msgstr "Tallennetaan kutsumerkkien varmenteita" #: tqsl.cpp:4888 msgid "Saving callsign certificate for %hs" msgstr "Tallennetaan kutsumerkkien varmenteita %hs:lle" #: tqsl.cpp:4921 msgid "Saving Station Locations" msgstr "Tallennetaan asemien sijainteja" #: tqsl.cpp:4937 msgid "Saving TQSL Preferences" msgstr "Tallennetaan TQSL-asetuksia" #: tqsl.cpp:4951 msgid "Saving QSOs" msgstr "Tallennetaan QSO:ja" #: tqsl.cpp:4997 msgid "Save operation complete." msgstr "Tallennus valmis." #: tqsl.cpp:5006 msgid "Error performing automatic backup: %hs" msgstr "Virhe automaattista varmuustallennusta tehtäessä: %hs" #: tqsl.cpp:5007 msgid "Backup Error" msgstr "Varmuuskopiovirhe" #: tqsl.cpp:5009 tqsl.cpp:5028 msgid "Backup operation failed: %hs" msgstr "Varmuustallennus epäonnistui: %hs" #: tqsl.cpp:5019 msgid "Enter file to save to" msgstr "Syötä tiedosto, johon tallennetaan" #: tqsl.cpp:5020 msgid "Configuration files (*.tbk)|*.tbk|All files (*.*)|*.*" msgstr "Kokoonpanotiedostot (*.tbk)|*.tbk|Kaikki tiedostot (*.*)|*.*" #: tqsl.cpp:5065 msgid "Restoring callsign certificate for %hs" msgstr "Palautetaan kutsumerkin varmennetta %hs:lle" #: tqsl.cpp:5111 msgid "Restoring Preferences" msgstr "Palautetaan asetuksia" #: tqsl.cpp:5173 msgid "Restoring Station Locations" msgstr "Palautetaan asemien sijainteja" #: tqsl.cpp:5194 msgid "Restoring QSO records" msgstr "Palautetaan QSO-tietoja" #: tqsl.cpp:5252 msgid "Error importing station locations: %hs" msgstr "Virhe asemien sijainteja tuodessa: %hs" #: tqsl.cpp:5316 msgid "Restoring Callsign Certificates" msgstr "Palautetaan kutsumerkkien varmenteita" #: tqsl.cpp:5323 tqsl.cpp:5331 tqsl.cpp:5336 msgid "Error parsing saved configuration file: %hs" msgstr "Virhe jäsennettäessä tallennettua kokoonpanotiedostoa: %hs" #: tqsl.cpp:5340 msgid "Restore Complete." msgstr "Palautus valmis." #: tqsl.cpp:5354 msgid "Error parsing station location file: %hs" msgstr "Virhe jäsennettäessä aseman sijaintitiedostoa: %hs" #: tqsl.cpp:5366 msgid "Select saved configuration file" msgstr "Valitse tallennettu kokoonpanotiedosto" #: tqsl.cpp:5367 msgid "Saved configuration files (*.tbk)|*.tbk" msgstr "Tallennetut kokoonpanotiedostot (*.tbk)|*.tbk" #: tqsl.cpp:5397 msgid "Restore operation failed: %hs" msgstr "Palautusoperaatio epäonnistui: %hs" #: tqsl.cpp:5687 msgid "Exit TQSL so I can re-run as a normal user" msgstr "" "Poistu TQSL:stä jotta voin käynnistää sen uudelleen tavallisena käyttäjänä" #: tqsl.cpp:5688 msgid "Allow TQSL to continue this time." msgstr "Salli TQSL:n suoritus tällä kertaa." #: tqsl.cpp:5689 msgid "Always allow running as Administrator." msgstr "Salli aina suoritus järjestelmänvalvojana." #: tqsl.cpp:5690 msgid "TQSL must not be run 'As Administrator'" msgstr "TQSL:ää ei pidä käynnistää järjestelmänvalvojana" #: tqsl.cpp:5690 msgid "Administrator Error" msgstr "Järjestelmävalvoja-virhe" #: tqsl.cpp:5833 msgid "Specify dialog action - abort, all, compliant or ask" msgstr "Määritä valintatilanteen toiminta - abort, all, complant tai ask" #: tqsl.cpp:5834 msgid "Specify start date for QSOs to sign" msgstr "Määrittele alkamispäivämäärä allekirjoitettaville QSO:ille" #: tqsl.cpp:5835 msgid "Specify default callsign for log signing" msgstr "Määrittele oletusarvoinen kutsumerkki lokin allekirjoitukseen" #: tqsl.cpp:5836 msgid "Suppress date range dialog" msgstr "Piilotettavan päivämääräalueen valintaikkuna" #: tqsl.cpp:5837 msgid "Specify end date for QSOs to sign" msgstr "Määrittele loppumispäivä allekirjoitettaville QSO:ille" #: tqsl.cpp:5838 msgid "Specify QSO verification action - ignore, report or update" msgstr "Määrittele QSO.vahvistustoiminto: ohita, raportoi tai päivitä" #: tqsl.cpp:5840 msgid "Display command line help" msgstr "Näytä komentoriviohje" #: tqsl.cpp:5841 msgid "Import a certificate file (.p12 or .tq6)" msgstr "Tuo varmennetiedosto (.p12 tai .tq6)" #: tqsl.cpp:5843 msgid "Selects Station Location" msgstr "Valitsee aseman sijainnin" #: tqsl.cpp:5845 msgid "Check for updates to tqsl and the configuration file" msgstr "Tarkista päivitykset tqsl:ään ja kokoonpanotiedostoon" #: tqsl.cpp:5846 msgid "Output file name (defaults to input name minus extension plus .tq8" msgstr "" "Tulostetiedoston nimi (oletusarvo syötetiedoston nimi miinus tarkenne plus ." "tq8" #: tqsl.cpp:5847 msgid "Passphrase for the signing key" msgstr "Salalause varmennusavaimelle" #: tqsl.cpp:5848 msgid "Quiet Mode - same behavior as -x" msgstr "Hiljainen toimintatila - sama käyttäytyminen kuin -x" #: tqsl.cpp:5851 msgid "Edit (if used with -l) or create Station Location" msgstr "Muokkaa (jos käytetty -l:n kanssa) tai luo aseman sijainti" #: tqsl.cpp:5852 msgid "File name for diagnostic tracking log" msgstr "Tiedoston nimi diagnoosiseurantatyökalulle" #: tqsl.cpp:5853 msgid "Upload after signing instead of saving" msgstr "Lähetä allekirjoittamisen jälkeen tallentamisen sijaan" #: tqsl.cpp:5854 msgid "Display the version information and exit" msgstr "Näytä versiotiedot ja sulje" #: tqsl.cpp:5855 msgid "Wipe the TQSL uploads database" msgstr "Tyhjennä TQSL:n verkkoonlataustietokanta" #: tqsl.cpp:5856 msgid "Exit after processing log (otherwise start normally)" msgstr "Poistu lokin käsittelyn jälkeen (muuten käynnisty normaalisti)" #: tqsl.cpp:5859 msgid "Input ADIF or Cabrillo log file to sign" msgstr "Syötä ADIF- tai Cabrillotiedosto varmennettavaksi" #: tqsl.cpp:6049 tqsl.cpp:6052 #, c-format msgid "Start date of %s is invalid" msgstr "Alkamispäivämäärä %s on virheellinen" #: tqsl.cpp:6063 tqsl.cpp:6066 #, c-format msgid "End date of %s is invalid" msgstr "Loppupäivämäärä %s on virheellinen" #: tqsl.cpp:6088 msgid "The -a parameter %hs is not recognized" msgstr "-a-parametria %hs ei tunnisteta" #. TRANSLATORS: -f is the command line switch for log QTH handling #: tqsl.cpp:6109 msgid "The -f parameter %hs is not recognized" msgstr "-f-parametria %hs ei tunnistettu" #: tqsl.cpp:6190 tqsl.cpp:6196 msgid "" "To import this passphrase protected P12 file, you must pass the passphrase " "on the command line" msgstr "" "Jotta voisit tuoda tämän salalauseella suojatun P12-tiedoston, sinun on " "annettava salalause komentorivillä" #: tqsl.cpp:6218 msgid "No logfile to sign!" msgstr "Ei lokitiedostoa allekirjoitettavaksi!" #: tqsl.cpp:6234 msgid "" "Warning: The TQSL ADIF editor only processes a limited number of ADIF " "fields.\n" "\n" "Using the editor on an ADIF file can cause QSO details to be lost!" msgstr "" "Varoitus: TQSL:n ADIF-editori käsittelee vain rajatun määrän ADIF-kenttiä\n" "\n" "Jos käytät editoria ADIF-tiedostoon, QSO-tietoja saatetaan menettää!" #: tqsl.cpp:6346 msgid "Please review the introductory documentation before using this program." msgstr "Lue johdanto-ohjeet ennen tämän ohjelman käyttämistä." #: tqsl.cpp:6347 msgid "Notice" msgstr "Ilmoitus" #: tqsl.cpp:6352 msgid "" "You have no callsign certificate installed on this computer with which to " "sign log submissions." msgstr "" "Tähän tietokoneeseen ei ole asennettuna kutsumerkin varmennetta, jolla voisi " "allekirjoittaa lokin lähetyksen." #: tqsl.cpp:6354 msgid "Would you like to request a callsign certificate now?" msgstr "Haluatko pyytää kutsumerkin varmennetta nyt?" #: tqsl.cpp:6356 msgid "If you are planning to restore from a backup, please choose 'No'." msgstr "Jos aiot palauttaa tiedot varmuuskopiolta, valitse \"Ei\"." #: tqsl.cpp:6357 msgid "Alert" msgstr "Hälytys" #: tqsl.cpp:6479 msgid "Display Callsign Certificate &Properties" msgstr "&Näytä kutsumerkin varmenteen tiedot" #: tqsl.cpp:6481 msgid "&Load Callsign Certificate from File" msgstr "&Lataa kutsumerkin varmenne tiedostosta" #: tqsl.cpp:6482 msgid "&Save Callsign Certificate to File..." msgstr "&Tallenna kutsumerkin varmenne tiedostoon..." #: tqsl.cpp:6486 msgid "Request &New Callsign Certificate..." msgstr "&Pyydä uutta kutsumerkin varmennetta..." # Tässä ei käytetä verbiä "uusi", koska se voi sekoittua adjektiivin "uusi" kanssa #: tqsl.cpp:6487 msgid "&Renew Callsign Certificate" msgstr "&Uudista kutsumerkin varmenne" #: tqsl.cpp:6492 msgid "&Delete Callsign Certificate" msgstr "P&oista kutsumerkin varmenne" #: tqsl.cpp:6498 msgid "Restore Deleted Callsign Certificate" msgstr "Palauta poistettu kutsumerkin varmenne" #: tqsl.cpp:6511 msgid "&Edit" msgstr "&Muokkaa" #: tqsl.cpp:6513 msgid "&Delete" msgstr "&Poista" #: tqsl.cpp:6560 msgid "Load Certificate File" msgstr "Lataa varmennetiedosto" #: tqsl.cpp:6652 crqwiz.h:63 msgid "Request a new Callsign Certificate" msgstr "Pyydä uutta kutsumerkin varmennetta" #: tqsl.cpp:6732 msgid "Do you want to upload this certificate request to LoTW now?" msgstr "Haluatko lähettää tämän varmennepyynnön LoTW:ille nyt?" #: tqsl.cpp:6735 msgid "You do not need an account on LoTW to do this." msgstr "Et tarvitse LoTW-tiliä tehdäksesi tämän." #: tqsl.cpp:6737 msgid "Upload" msgstr "Lähetä" #: tqsl.cpp:6747 tqsl.cpp:6796 msgid "tQSL Cert Request files (*." msgstr "tQSL-varmenteen pyyntötiedostot (*." #: tqsl.cpp:6749 tqsl.cpp:6798 msgid "|All files (" msgstr "|Kaikki tiedostot (" #: tqsl.cpp:6750 tqsl.cpp:6799 msgid "Save request" msgstr "Tallenna pyyntö" #: tqsl.cpp:6753 tqsl.cpp:6802 msgid "Request cancelled" msgstr "Pyyntö peruttu" #: tqsl.cpp:6766 msgid "Error creating callsign certificate request: %hs" msgstr "Virhe luotaessa kutsumerkin varmennepyyntöä: %hs" #: tqsl.cpp:6766 msgid "Error creating Callsign Certificate Request" msgstr "Virhe luotaessa kutsumerkin varmennepyyntöä" #: tqsl.cpp:6779 msgid "Error opening certificate request file %s: %hs" msgstr "Virhe avattaessa kutsumerkin varmennepyyntötiedostoa %s: %hs" #: tqsl.cpp:6789 tqsl.cpp:7376 tqsl.cpp:7520 msgid "Certificate Request" msgstr "Varmennepyyntö" #: tqsl.cpp:6793 msgid "Your certificate request did not upload properly." msgstr "Varmennepyyntöäsi ei pystytty lähettämään oikein." #: tqsl.cpp:6794 msgid "" "Your upload appears to have failed.\n" "Do you want to save this request for uploading later?" msgstr "" "Lähetyksesi näyttää epäonnistuneen.\n" "\vHaluatko tallentaa tämän pyynnön myöhempää lähetystä varten?" #: tqsl.cpp:6812 msgid "You may now send your new certificate request (" msgstr "Voit nyt lähettää uuden varmennepyyntösi (" #: tqsl.cpp:6817 msgid "to:" msgstr "vastaanottaja:" #: tqsl.cpp:6824 msgid "or " msgstr "tai " #: tqsl.cpp:6825 msgid "see:" msgstr "käy osoitteessa:" #: tqsl.cpp:6863 msgid "Display a Callsign Certificate" msgstr "Näytä kutsumerkin varmenne" #: tqsl.cpp:6911 tqsl.cpp:6913 msgid "Save the Callsign Certificate for" msgstr "Tallenna kutsumerkin varmenne kutsulle" #: tqsl.cpp:6916 tqsl.cpp:6918 msgid "Display the Callsign Certificate properties for" msgstr "Näytä kutsumerkin varmenne kutsulle" #: tqsl.cpp:6922 tqsl.cpp:6924 msgid "Renew the Callsign Certificate for" msgstr "Uudista kutsumerkin varmenne kutsulle" #: tqsl.cpp:6969 msgid "Enter the name for the new Certificate Container file" msgstr "Syötä nimi uudelle varmenteiden säilötiedostolle" #: tqsl.cpp:6970 msgid "Certificate Container files (*.p12)|*.p12|All files (*.*)|*.*" msgstr "Varmenteiden säilötiedostot (*.p12)|*.p12|Kaikki tiedostot (*.*)|*.*" #: tqsl.cpp:6977 msgid "Enter the passphrase for the certificate container file." msgstr "Syötä salalause varmenteen säilötiedostolle." #: tqsl.cpp:6979 msgid "" "If you are using a computer system that is shared with others, you should " "specify a passphrase to protect this certificate. However, if you are using " "a computer in a private residence, no passphrase need be specified." msgstr "" "Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä " "antaa salalause suojataksesi tämän varmenteen. Kuitenkin, jos käytät " "tietokonetta yksityistaloudessa, salasanaa ei ole tarvetta antaa." #: tqsl.cpp:6981 msgid "" "You will have to enter the passphrase any time you load the file into " "TrustedQSL." msgstr "" "Sinun on annettava salalause joka kerta kun lataat tiedoston TrustedQSL:ään." #: tqsl.cpp:6985 msgid "Certificate Container Passphrase" msgstr "Varmenteiden säilötiedoston salalause" #: tqsl.cpp:7026 msgid "Export to %s failed: %hs" msgstr "Vienti %s:ään epäonnistui: %hs" #: tqsl.cpp:7028 #, c-format msgid "Certificate saved in file %s" msgstr "Varmenne tallennettu tiedostoon %s" #: tqsl.cpp:7039 msgid "This will remove the selected callsign certificate from your system." msgstr "Tämä poistaa valitun kutsumerkin varmenteen järjestelmästäsi." #: tqsl.cpp:7041 msgid "You will NOT be able to recover it by loading a .TQ6 file." msgstr "ET voi palauttaa sitä lataamalla .TQ6-tiedoston." #: tqsl.cpp:7043 msgid "You WILL be able to recover it from a container (.p12) file," msgstr "VOIT palauttaa sen säilö(.p12)-tiedostosta," #: tqsl.cpp:7045 msgid "if you have created one via the Callsign Certificate menu's" msgstr "jos olet luonut sellaisen Kutsumerkin varmenne -valikon" #: tqsl.cpp:7047 msgid "'Save Callsign Certificate' command." msgstr "\"Tallenna kutsumerkin varmenne\"-komennolla." #: tqsl.cpp:7049 msgid "Are you sure you want to delete the certificate?" msgstr "Haluatko varmasti poistaa tämän varmenteen?" #: tqsl.cpp:7087 msgid "There are no deleted Callsign Certificates to restore" msgstr "Ei ole poistettuja kutsumerkin varmenteita, joita voitaisiin palauttaa" #: tqsl.cpp:7087 tqsl.cpp:7197 msgid "Undelete Error" msgstr "Poiston perumisen virhe" #: tqsl.cpp:7098 msgid "Choose a Callsign Certificate to restore" msgstr "Valitse palautettava kutsumerkin varmenne" #: tqsl.cpp:7127 msgid "Select a Station Location to process" msgstr "Valitse aseman sijainti tehdäksesi muutoksia" #: tqsl.cpp:7147 msgid "Edit Station Location " msgstr "Muokkaa aseman sijaintia " #: tqsl.cpp:7150 msgid "Delete Station Location " msgstr "Poista aseman sijainti " #: tqsl.cpp:7153 msgid "Display Station Location Properties for " msgstr "Näytä aseman sijaintitiedot: " #: tqsl.cpp:7175 msgid "This will remove this station location from your system." msgstr "Tämä poistaa tämän aseman sijainnin järjestelmästäsi." #: tqsl.cpp:7177 msgid "Are you sure you want to delete this station location?" msgstr "Haluatko varmasti poistaa tämän aseman sijainnin?" #: tqsl.cpp:7197 msgid "There are no deleted Station Locations to restore" msgstr "Ei ole poistettuja aseman sijainteja, joita voitaisiin palauttaa" #: tqsl.cpp:7208 msgid "Choose a Station Location to restore" msgstr "Valitse palautettava aseman sijainti" #: tqsl.cpp:7280 tqsl.cpp:7283 msgid "Please choose language:" msgstr "Valitse kieli:" #: tqsl.cpp:7351 msgid "Certificate Properties" msgstr "Varmenteen tiedot" #: tqsl.cpp:7354 msgid "Begins: " msgstr "Alkaa: " #: tqsl.cpp:7355 msgid "Expires: " msgstr "Päättyy: " #: tqsl.cpp:7356 msgid "Organization: " msgstr "Organisaatio: " #: tqsl.cpp:7358 msgid "Serial: " msgstr "Sarjanumero: " #: tqsl.cpp:7359 msgid "Operator: " msgstr "Operaattori: " #: tqsl.cpp:7360 tqsl.cpp:7579 msgid "Call sign: " msgstr "Kutsumerkki: " #: tqsl.cpp:7361 tqsl.cpp:7580 msgid "DXCC Entity: " msgstr "DXCC-maa: " #: tqsl.cpp:7362 msgid "QSO Start Date: " msgstr "Yhteyksien alkamispäivä: " #: tqsl.cpp:7363 msgid "QSO End Date: " msgstr "Yhteyksien loppumispäivä: " #: tqsl.cpp:7364 msgid "Passphrase: " msgstr "Salalause: " #: tqsl.cpp:7485 msgid "Missing from this computer" msgstr "Puuttuu tältä tietokoneelta" #: tqsl.cpp:7489 tqsl.cpp:7514 msgid "Passphrase protected" msgstr "Suojattu salalauseella" #: tqsl.cpp:7493 msgid "Private Key not found" msgstr "Salaista avainta ei löytynyt" #: tqsl.cpp:7497 msgid "Unable to read - no permission" msgstr "Ei voida avata - pääsyoikeus puuttuu" #: tqsl.cpp:7505 msgid "" msgstr "" #: tqsl.cpp:7508 msgid "No Private Key" msgstr "Ei salaista avainta" #: tqsl.cpp:7511 msgid "None" msgstr "Tyhjä" #: tqsl.cpp:7522 msgid "Awaiting response from ARRL" msgstr "Odottaa ARRL:n vastausta" #: tqsl.cpp:7536 msgid "Replaced" msgstr "Korvattu" #: tqsl.cpp:7541 msgid "Expired" msgstr "Vanhentunut" #: tqsl.cpp:7576 msgid "Station Location Properties" msgstr "Aseman paikkatiedot" #: tqsl.cpp:7581 msgid "Grid Square: " msgstr "Lokaattori: " #: tqsl.cpp:7582 msgid "ITU Zone: " msgstr "ITU-zone: " #: tqsl.cpp:7583 msgid "CQ Zone: " msgstr "CQ-zone: " #: tqsl.cpp:7584 msgid "IOTA Locator: " msgstr "IOTA-lokaattori: " #: tqsl.cpp:7585 tqsl.cpp:7592 msgid "State: " msgstr "Osavaltio: " #: tqsl.cpp:7586 msgid "County: " msgstr "Kunta: " #: tqsl.cpp:7587 tqsl.cpp:7589 tqsl.cpp:7593 msgid "Park: " msgstr "Puisto: " #: tqsl.cpp:7588 tqsl.cpp:7591 msgid "Province: " msgstr "Maakunta: " #: tqsl.cpp:7590 msgid "Oblast: " msgstr "Oblast: " #: tqsl.cpp:7596 msgid "Verify QTH details: " msgstr "Tarkista QTH-tiedot: " #: tqsl.cpp:7657 msgid "Signing File: " msgstr "Allekirjoittava tiedosto: " #: tqsl.cpp:7663 msgid "" "Please verify that this is the correct Station Location for the QSOs being " "signed." msgstr "" "Tarkista, että tämä on oikea aseman sijainti allekirjoitettaville QSO:ille." #: tqsl.cpp:7666 msgid "Click 'Cancel' if this is not the correct Station Location." msgstr "Napsauta \"Peruuta\" jos tämä ei ole oikea aseman sijainti." #: tqsl.cpp:7694 msgid "Enter the Passphrase to unlock the callsign certificate" msgstr "Syötä salalause avataksesi kutsumerkin varmenteen" #: tqsl_prefs.cpp:56 msgid "Preferences" msgstr "Asetukset" #: tqsl_prefs.cpp:78 msgid "Options" msgstr "Lisävalinnat" #: tqsl_prefs.cpp:82 msgid "Log Handling" msgstr "Lokitoiminnot" #: tqsl_prefs.cpp:85 msgid "ADIF Modes" msgstr "ADIF-lähetelajit" #: tqsl_prefs.cpp:88 msgid "Cabrillo Specs" msgstr "Cabrillo-määrittelyt" #: tqsl_prefs.cpp:91 msgid "Network Proxy" msgstr "Verkkovälityspalvelin (proxy)" #: tqsl_prefs.cpp:172 msgid "Custom ADIF mode mappings:" msgstr "Erityiset ADIF-lähetelajien kuvaukset:" #: tqsl_prefs.cpp:181 tqsl_prefs.cpp:834 msgid "Add..." msgstr "Lisää..." #: tqsl_prefs.cpp:261 msgid "Add ADIF mode" msgstr "Lisää ADIF-lähetelaji" #: tqsl_prefs.cpp:270 msgid "Add ADIF mode mapping:" msgstr "Lisää ADIF-lähetelajin kuvaus:" #: tqsl_prefs.cpp:274 msgid "ADIF Mode:" msgstr "ADIF-lähetelaji:" #: tqsl_prefs.cpp:282 msgid "Resulting TQSL mode:" msgstr "Vastaava TQSL-lähetelaji:" #: tqsl_prefs.cpp:328 #, c-format msgid "This mode definition conflicts with a standard mode definition for %s" msgstr "" "Tämä lähetelajimääritelmä on ristiriidassa vakiolähetelajimääritelmän %s " "kanssa" #: tqsl_prefs.cpp:329 msgid "Mode Conflict" msgstr "Lähetelajien ristiriita" #: tqsl_prefs.cpp:353 msgid "Allow automatic configuration backup" msgstr "Salli automaattinen kokoonpanon varmuuskopiointi" #: tqsl_prefs.cpp:357 msgid "Backup File Folder:" msgstr "Varmuuskopiointihakemisto:" #: tqsl_prefs.cpp:363 msgid "Select a Folder" msgstr "Valitse hakemisto" #: tqsl_prefs.cpp:370 msgid "Number of Backups to retain:" msgstr "Kuinka monta varmuuskopiota pidetään tallessa:" #: tqsl_prefs.cpp:381 msgid "Open ADIF files in ADIF editor" msgstr "Avaa ADIF-tiedostot ADIF-muokkaimessa" #: tqsl_prefs.cpp:388 msgid "Display status messages in separate tab" msgstr "Näytä tilaviestit erillisessä välilehdessä" #: tqsl_prefs.cpp:393 msgid "Enable passphrases for Callsign Certificates" msgstr "Ota käyttöön salalauseet kutsumerkin varmenteille" #: tqsl_prefs.cpp:399 msgid "Export P12 files compatible with Apple Keychain" msgstr "Vie P12-tiedostot Apple-avainketjuun yhteensopivassa muodossa" #: tqsl_prefs.cpp:448 msgid "" "Changes to the status message configuration will take affect when TQSL is " "restarted" msgstr "" "Muutokset tilaviestien asetuksiin tulevat käyttöön, kun TQSL on käynnistetty " "uudelleen" #: tqsl_prefs.cpp:475 msgid "Cabrillo file extensions:" msgstr "Cabrillo-tiedostopäätteet:" #: tqsl_prefs.cpp:480 msgid "ADIF file extensions:" msgstr "ADIF-tiedostopäätteet:" #: tqsl_prefs.cpp:486 msgid "Allow nonamateur call signs" msgstr "Salli muut kuin radioamatöörikutsut" #: tqsl_prefs.cpp:491 msgid "Prompt for QSO Date range when signing" msgstr "Kysy QSO:jen päivämääräaluetta kun allekirjoitetaan" #: tqsl_prefs.cpp:496 msgid "Display details of previously signed QSOs when signing a log" msgstr "" "Näytä tiedot aiemmin allekirjoitetuista QSO:ista kun lokia allekirjoitetaan" #: tqsl_prefs.cpp:501 msgid "Ignore seconds in QSO times" msgstr "Jätä huomioimatta sekunnit QSO-ajoista" #: tqsl_prefs.cpp:506 msgid "Ignore callsigns in ADIF files" msgstr "Jätä huomioimatta ADIF-tiedostojen kutsumerkit" #: tqsl_prefs.cpp:517 msgid "Ignore QTH details from your log" msgstr "Jätä huomioimatta lokisi QTH-tiedot" #: tqsl_prefs.cpp:517 msgid "Report on QTH differences" msgstr "Raportti QTH-eroavaisuuksista" #: tqsl_prefs.cpp:517 msgid "Override Station Location with QTH details from your log" msgstr "Ylikirjoita aseman sijainti lokisi QTH-tiedoilla" #: tqsl_prefs.cpp:519 msgid "Handle QTH information in ADIF logs with what action?" msgstr "Miten ADIF-lokien QTH-tieto käsitellään?" #: tqsl_prefs.cpp:706 msgid "" "Use these settings to configure a network proxy for Internet uploads and " "downloads. You should only enable a proxy if directed by your network " "administrator." msgstr "" "Käytä näitä asetuksia määritelläksesi verkkovälityspalvelimen (proxyn) " "Internet-lähetyksiä ja latauksia varten. Välityspalvelin pitäisi määritellä " "vain jos verkon ylläpitäjä on niin ohjeistanut." #: tqsl_prefs.cpp:708 msgid "" "Incorrect settings can cause TQSL to be unable to upload logs or check for " "updates." msgstr "" "Väärät asetukset voivat aiheuttaa, että TQSL ei pysty lähettämään lokeja tai " "tarkistamaan päivityksiä." #: tqsl_prefs.cpp:714 msgid "Enable a Network Proxy" msgstr "Käytä välityspalvelinta (proxy)" #: tqsl_prefs.cpp:718 msgid "Proxy Address:" msgstr "Välityspalvelimen osoite:" #: tqsl_prefs.cpp:726 msgid "Port Number:" msgstr "Porttinumero:" #: tqsl_prefs.cpp:733 msgid "Proxy Type:" msgstr "Välityspalvelimen tyyppi:" #: tqsl_prefs.cpp:736 msgid "ProxyType" msgstr "Välityspalvelimen tyyppi" #: tqsl_prefs.cpp:797 msgid "Cabrillo CONTEST definitions:" msgstr "Cabrillo KILPAILU-määrittelyt:" #: tqsl_prefs.cpp:809 tqsl_prefs.cpp:820 msgid "CONTEST" msgstr "KILPAILU" #: tqsl_prefs.cpp:810 tqsl_prefs.cpp:821 msgid "Type" msgstr "Tyyppi" #: tqsl_prefs.cpp:811 tqsl_prefs.cpp:822 msgid "Field" msgstr "Kenttä" #: tqsl_prefs.cpp:966 tqsl_prefs.h:272 msgid "Edit" msgstr "Muokkaa" #: tqsl_prefs.cpp:989 msgid "Contest" msgstr "Kilpailu" #: tqsl_prefs.cpp:999 msgid "Cabrillo CONTEST" msgstr "Cabrillo KILPAILU" #: tqsl_prefs.cpp:1001 msgid "CONTEST Name:" msgstr "KILPAILUN nimi:" #: tqsl_prefs.cpp:1007 msgid "Contest type" msgstr "Kilpailun tyyppi" #: tqsl_prefs.cpp:1012 msgid "Call-Worked Field Number:" msgstr "Työskennelty-kutsu -kentän numero:" #: tqsl_prefs.cpp:1046 msgid "Contest name cannot be blank" msgstr "Kilpailun nimi ei voi olla tyhjä" #: tqsl_prefs.cpp:1052 #, c-format msgid "Call-worked field must be %d or greater" msgstr "Työskennelty-kutsu -kenttä täytyy olla %d tai suurempi" #. TRANSLATORS: Invalid date component, such as "Invalid Month: 15" #: tqslvalidator.cpp:76 msgid "Invalid %hs: \"%hs\"" msgstr "Virheellinen %hs: \"%hs\"" #: tqslwiz.cpp:168 tqslwiz.cpp:1286 #, c-format msgid "" "You have changed the following fields in this Station Location: %s\n" "Do you want to discard those changes?" msgstr "" "Olet muuttanut seuraavia kenttiä tämän aseman sijainnin tiedoissa: %s\n" "Haluatko hylätä nämä muutokset?" #: tqslwiz.cpp:169 tqslwiz.cpp:1287 msgid "Changes have not been saved" msgstr "Muutoksia ei ole tallennettu" #: tqslwiz.cpp:334 tqslwiz.cpp:531 msgid "[None]" msgstr "[Tyhjä]" #: tqslwiz.cpp:1024 tqslwiz.cpp:1193 msgid "You must select a %hs" msgstr "%hs on valittava" #: tqslwiz.cpp:1055 #, c-format msgid "%s: Invalid Grid Field" msgstr "%s: Virheellinen lokaattorikenttä" #: tqslwiz.cpp:1059 #, c-format msgid "%s: Invalid Grid Square" msgstr "%s: Virheellinen lokaattori" #: tqslwiz.cpp:1063 #, c-format msgid "%s: Invalid Grid Subsquare" msgstr "%s: Virheellinen lokaattorin aliruutu" #: tqslwiz.cpp:1067 #, c-format msgid "%s: Invalid Grid Sub-subsquare" msgstr "%s: Virheellinen lokaattorin ali-aliruutu" #: tqslwiz.cpp:1071 #, c-format msgid "%s: Invalid Gridsquare Format" msgstr "%s: Virheellinen lokaattoriruudun muoto" #: tqslwiz.cpp:1078 #, c-format msgid "" "Grid %s is not correct for your QTH. Click 'Next' again to use it anyway." msgstr "" "Lokaattori %s ei ole oikea nykyiselle QTH:llesi. Jos haluat silti käyttää " "sitä, napsauta uudestaan \"Seuraava\"." #: tqslwiz.cpp:1112 #, c-format msgid "" "Grid %s is not correct for your DXCC Entity. Click 'Next' again to use it " "anyway." msgstr "" "Ruutu %s ei ole oikea DXCC-maallesi. Napsauta \"Seuraava\", jos haluat silti " "käyttää sitä." #: tqslwiz.cpp:1115 #, c-format msgid "" "Grid %s is not correct for your %s. Click 'Next' again to use it anyway." msgstr "" "Ruutu %s ei ole oikea sinun %s:llesi. Napsauta uudestaan \"Seuraava\", jos " "haluat silti käyttää sitä." #: tqslwiz.cpp:1141 #, c-format msgid "IOTA value %s is not valid." msgstr "IOTA-arvo %s ei ole oikein." #: tqslwiz.cpp:1149 #, c-format msgid "" "IOTA reference %s is not correct. Must start with AF-, AN-, AS-, EU-, NA-, " "OC- or SA-" msgstr "" "IOTA %s ei ole oikein. Sen täytyy alkaa AF-, AN-, AS-, EU-, NA-, OC- tai SA-" #: tqslwiz.cpp:1156 #, c-format msgid "IOTA reference %s is not correct. Must have a number after the '-'" msgstr "IOTA %s ei ole oikein. Väliviivan jälkeen täytyy olla lukuarvo." #: tqslwiz.cpp:1163 msgid "Invalid zone selections for state" msgstr "Väärät zone-valinnat osavaltiolle" #: tqslwiz.cpp:1164 msgid "Invalid zone selections for province" msgstr "Väärät zone-valinnat maakunnalle" #: tqslwiz.cpp:1165 msgid "Invalid zone selections for oblast" msgstr "Väärät zone-valinnat oblastille" #: tqslwiz.cpp:1166 msgid "Invalid zone selections for DXCC entity" msgstr "Väärät zone-valinnat DXCC-maalle" #: tqslwiz.cpp:1315 msgid "Station Data input complete" msgstr "Aseman tietojen syöttö valmis" #: tqslwiz.cpp:1319 msgid "Select or enter name of this station location" msgstr "Valitse tai syötä nimi tälle aseman sijainnille" #: tqslwiz.cpp:1342 tqslwiz.cpp:1348 msgid "Station Location Name" msgstr "Aseman sijainnin nimi" #: tqslwiz.cpp:1386 msgid "Station name must be provided" msgstr "Aseman nimi on annettava" #: wxutil.cpp:139 msgid "Memory allocation failure" msgstr "Muistinvarausvirhe" #: wxutil.cpp:140 msgid "Unable to initialize random number generator" msgstr "Ei pystytty alustamaan satunnaislukugeneraattoria" #: wxutil.cpp:141 msgid "Invalid argument" msgstr "Virheellinen argumentti" #: wxutil.cpp:142 msgid "Operator aborted operation" msgstr "Käyttäjä keskeytti toiminnon" #: wxutil.cpp:143 msgid "No Certificate Request matches the selected Callsign Certificate" msgstr "Mikään varmennepyyntö ei sovi valittuun kutsumerkin varmenteeseen" #: wxutil.cpp:144 msgid "Buffer too small" msgstr "Puskuri liian pieni" #: wxutil.cpp:145 msgid "Invalid date format" msgstr "Väärä päivämäärän muoto" #: wxutil.cpp:146 msgid "Certificate not initialized for signing" msgstr "Varmennetta ei ole alustettu allekirjoitusta varten" #: wxutil.cpp:147 msgid "Passphrase not correct" msgstr "Väärä salalause" #: wxutil.cpp:148 msgid "Expected name" msgstr "Odotettu nimi" #: wxutil.cpp:149 msgid "Name exists" msgstr "Nimi on olemassa" #: wxutil.cpp:150 msgid "Data for this DXCC entity could not be found" msgstr "Tietoja tälle DXCC-maalle ei löytynyt" #: wxutil.cpp:151 msgid "Invalid time format" msgstr "Väärä kellonajan muoto" #: wxutil.cpp:152 msgid "" "QSO date is not within the date range specified on your Callsign Certificate" msgstr "" "QSO-päivämäärä ei ole kutsumerkin varmenteessa määritellyn ajanjakson sisällä" #: wxutil.cpp:153 msgid "Certificate provider not found" msgstr "Varmentajaa ei löytynyt" #: wxutil.cpp:154 msgid "No callsign certificate for key" msgstr "Ei kutsumerkin varmennetta avaimelle" #: wxutil.cpp:155 msgid "Configuration file cannot be opened" msgstr "Kokoonpanotiedostoa ei voida avata" #: wxutil.cpp:156 msgid "" "The private key for this Callsign Certificate is not present on this " "computer; you can obtain it by loading a .tbk or .p12 file" msgstr "" "Tämän kutsumerkin varmenteen salaista avainta ei ole tällä tietokoneella. " "Voit lisätä sen lataamalla .tbk- tai .p12-tiedoston" #: wxutil.cpp:157 msgid "PKCS#12 file not TQSL compatible" msgstr "PKCS#12-tiedosto ei ole TQSL-yhteensopiva" #: wxutil.cpp:158 msgid "Callsign Certificate not TQSL compatible" msgstr "Kutsumerkin varmenne ei ole TQSL-yhteensopiva" #: wxutil.cpp:159 msgid "Date out of range" msgstr "Päivämäärä alueen ulkopuolella" #: wxutil.cpp:160 msgid "Previously Signed QSO detected" msgstr "Aiemmin allekirjoitettu QSO havaittiin" #: wxutil.cpp:161 msgid "Database error" msgstr "Tietokantavirhe" #: wxutil.cpp:162 msgid "The selected station location could not be found" msgstr "Valittua aseman sijaintia ei löytynyt" #: wxutil.cpp:163 msgid "The selected callsign could not be found" msgstr "Valittua kutsumerkkiä ei löytynyt" #: wxutil.cpp:164 msgid "The TQSL configuration file cannot be parsed" msgstr "TQSL:n kokoonpanotiedostoa ei voida jäsentää" #: wxutil.cpp:165 msgid "This file can not be processed due to a system error" msgstr "Tätä tiedostoa ei voida käsitellä järjestelmävirheen vuoksi" #: wxutil.cpp:166 msgid "The format of this file is incorrect." msgstr "Tämän tiedoston muoto on väärä." #: wxutil.cpp:167 msgid "Callsign certificate could not be installed" msgstr "Kutsumerkin varmennetta ei voitu asentaa" #: wxutil.cpp:168 msgid "Callsign Certificate does not match QSO details" msgstr "Kutsumerkin varmenne ei vastaa QSO-tietoja" #: wxutil.cpp:169 msgid "Station Location does not match QSO details" msgstr "Aseman sijainti ei vastaa QSO-tietoja" #: wxutil.cpp:170 msgid "New DB" msgstr "Uusi tietokanta" #: wxutil.cpp:171 msgid "Gridsquare is inconsistent with Station Location" msgstr "Lokaattoriruutu ei vastaa aseman sijaintia" #: wxutil.cpp:172 msgid "ADIF field has invalid contents" msgstr "AFIF-kentässä on virheellistä tietoa" #: wxutil.cpp:173 msgid "" "This Callsign Certificate cannot be installed as the first date where it is " "valid is in the future. Check if your computer is set to the proper date.\n" "\n" msgstr "" "Tätä kutsumerkin varmennetta ei voi asentaa, koska sen ensimmäinen " "voimassaolopäivä on tulevaisuudessa. Tarkista onko tietokoneesi asetettu " "oikeaan päivämäärään.\n" "\n" #: wxutil.cpp:174 msgid "" "This Callsign Certificate cannot be installed as it has expired. Check if " "your computer is set to the proper date and that this is the latest Callsign " "Certificate.\n" "\n" msgstr "" "Tätä kutsumerkin varmennetta ei voi asentaa, koska se ei ole enää voimassa. " "Tarkista että tietokoneesi on asetettu oikeaan päivämäärään ja että tämä on " "viimeisin kutsumerkin varmenne.\n" #: wxutil.cpp:187 msgid "NO ERROR" msgstr "EI VIRHETTÄ" #: wxutil.cpp:190 msgid "Unknown custom error" msgstr "Tuntematon, erityinen virhe" #: wxutil.cpp:197 msgid "" "TQSL is unable to sign QSOs because another instance of TQSL is busy.\n" "Terminate any other copies of TQSL and try again." msgstr "" "TQSL ei voi allekirjoittaa QSO:ja koska toinen TQSL:n kopio on toiminnassa.\n" "Lopeta muut TQSL:n kopiot ja yritä uudelleen." #: wxutil.cpp:199 msgid "Database Error: %hs" msgstr "Tietokantavirhe: %hs" #: wxutil.cpp:201 msgid "Uploads database error" msgstr "Tietokantavirhe verkkoon lataamisessa" #: wxutil.cpp:207 msgid "System error: %hs : %hs" msgstr "Järjestelmävirhe: %hs : %hs" #: wxutil.cpp:211 msgid "System error: %hs" msgstr "Järjestelmävirhe: %hs" #: wxutil.cpp:219 msgid "File syntax error: %hs" msgstr "Tiedoston syntaksivirhe: %hs" #: wxutil.cpp:223 msgid "File syntax error" msgstr "Tiedoston syntaksivirhe" #: wxutil.cpp:259 msgid "" "The private key for callsign %hs serial %ld is not present on this computer; " "you can obtain it by loading a .tbk or .p12 file" msgstr "" "Kutsumerkin %hs, sarjanumeron %ld salaista avainta ei ole tällä " "tietokoneella. Voit lisätä sen lataamalla .tbk- tai .p12-tiedoston" #: wxutil.cpp:266 #, c-format msgid "Invalid error code: %d" msgstr "Virheellinen virhekoodi: %d" #: wxutil.cpp:280 msgid "Station Location" msgstr "Aseman sijainti" #. TRANSLATORS: This message is for QSO details. For example, 'The Station Location GRIDSQUARE has value FM18ju while QSO has FM18jt' #: wxutil.cpp:283 msgid "The %s '%hs' has value '%hs' while QSO has '%hs'" msgstr "%s '%hs':lla on arvo '%hs' mutta QSO-tiedoissa on arvo '%hs'" #: wxutil.cpp:291 msgid "This log has invalid QSO information" msgstr "Tässä lokissa on vääriä QSO-tietoja" #. TRANSLATORS: This message is for QSO details. For example, 'The log being signed has 'US County' set to Foobar which is not valid' #: wxutil.cpp:293 msgid "The log being signed has '%hs' set to value '%hs' which is not valid" msgstr "" "Allekirjoitettavassa lokissa on parametri '%hs' asetettu arvoon '%hs', joka " "ei ole sallittu" #: wxutil.cpp:302 msgid "" "There is no valid callsign certificate for %hs in entity %hs available. This " "QSO cannot be signed" msgstr "" "%hs:lle kokonaisuudessa %hs ei ole voimassa olevaa kutsumerkin varmennetta. " "Tätä QSO:a ei voida allekirjoittaa" #: wxutil.cpp:310 msgid "ADIF content is not valid. '%hs' is not valid for %hs" msgstr "ADIF -sisältö ei ole pätevä. '%hs' ei ole pätevä %hs:lle" #: getpassword.h:51 msgid "New passphrase" msgstr "Uusi salalause" #: getpassword.h:52 msgid "Enter new passphrase" msgstr "Syötä uusi salalause" #: qsodatadialog.h:86 msgid "QSO Data" msgstr "QSO-tiedot" #: tqslvalidator.h:58 msgid "Date" msgstr "Päivämäärä" #: tqslvalidator.h:69 msgid "Time" msgstr "Kellonaika" #~ msgid "" #~ "TQSL must wait for other running copies of TQSL to exit before signing..." #~ msgstr "" #~ "TQSL:n täytyy odottaa muiden ajettavien TQSL-kopioiden loppumista ennen " #~ "allekirjoittamista..." #~ msgid "The duplicates database is locked" #~ msgstr "Duplikaattitietokanta on lukittu" #~ msgid "Already Uploaded QSOs Detected" #~ msgstr "Havaittu aiemmin lähetettyjä QSO-tietoja" #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and no new QSOs." #~ msgstr "" #~ "Tämä loki sisältää %d QSO:a, jotka näyttävät siltä kuin olisivat jo " #~ "lähetetty LoTW:iin, eikä uusia QSO:ja." #~ msgid "" #~ "Click 'Re-Upload QSOs' to re-process this log while allowing already " #~ "uploaded QSOs." #~ msgstr "" #~ "Napsauta \"Lähetä QSO-tiedot uudestaan\" käsitelläksesi tämän lokin " #~ "uudestaan niin että jo aiemmin lähetetyt QSO-tiedot sallitaan." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and %d QSOs which are new." #~ msgstr "" #~ "Tämä loki sisältää %d QSO:a, jotka näyttävät siltä kuin olisivat jo " #~ "lähetetty LoTW:iin ja %d QSO:a, jotka ovat uusia." #~ msgid "" #~ "Click 'New QSOs Only' to sign normally, without the already uploaded QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Napsauta \"Vain uudet QSO-tiedot\" allekirjoittaaksesi normaalisti ilman " #~ "jo aiemmin lähetettyjä QSO-tietoja (suositeltavaa)." #, c-format #~ msgid "" #~ "This log contains %d QSO(s) which appear to have already been signed for " #~ "upload to LoTW, and one QSO which is new." #~ msgstr "" #~ "Tämä loki sisältää %d QSO:a, jotka näyttävät siltä kuin olisivat jo " #~ "lähetetty LoTW:iin, ja yhden uuden QSO:n." #~ msgid "" #~ "The only reason to re-sign already uploaded QSOs is if a previous upload " #~ "was not processed by LoTW, either because it was never uploaded, or there " #~ "was a server failure" #~ msgstr "" #~ "Ainoa syy allekirjoittaa uudelleen jo aiemmin lähetettyjä QSO-tietoja on " #~ "se , että LoTW ei käsitellyt aiempaa lähetystä sen vuoksi että tietoja ei " #~ "koskaan lähetetty tai tapahtui palvelinvirhe" #, c-format #~ msgid "Already Uploaded: %d" #~ msgstr "Jo lähetetty: %d" #, c-format #~ msgid "Already uploaded: %d" #~ msgstr "Jo lähetetty: %d" #~ msgid "All QSOs are already uploaded; aborted" #~ msgstr "Kaikki QSO-tiedot on jo aiemmin lähetetty, lähetys keskeytetty" #, c-format #~ msgid "%d of %d QSOs are already uploaded; aborted" #~ msgstr "%d kappaletta %d:stä QSO:sta on jo lähetetty, lähetys keskeytetty" #, c-format #~ msgid "%s: %d QSO records were already uploaded" #~ msgstr "%s: %d QSO-tietoa oli jo aiemmin lähetetty" #~ msgid "" #~ "Resubmitting these QSOs will cause them to be reported as already " #~ "uploaded." #~ msgstr "" #~ "Näiden QSO-tietojen uudelleenlähettäminen aiheuttaa niiden raportoimisen " #~ "aiemmin lähetettyinä." #~ msgid "Display details of already uploaded QSOs when signing a log" #~ msgstr "" #~ "Näytä tiedot aiemmin lähetetyistä QSO-tiedoista kun lokia allekrjoitetaan" #~ msgid "tQSL Certificates" #~ msgstr "Kutsumerkin varmenteet" #~ msgid "My current personal callsign" #~ msgstr "Nykyinen henkilökohtainen kutsumerkkini" #~ msgid "" #~ "My new personal callsign (I have a Callsign Certificate for my former " #~ "callsign)" #~ msgstr "" #~ "Uusi henkilökohtainen kutsumerkkini (minulla on kutsumerkin varmenne " #~ "aiemmalle kutsumerkilleni)" #~ msgid "" #~ "My former personal callsign or a portable modifier for my current or " #~ "former callsign" #~ msgstr "" #~ "Aiempi henkilökohtainen kutsumerkkini tai liikkuvan aseman lisämerkki " #~ "nykyiseen tai aiempaan kutsumerkkiini" #~ msgid "A primary club callsign" #~ msgstr "Kerhon ensisijainen kutsumerkki" #~ msgid "" #~ "A secondary club callsign (I have a Callsign Certificate for the primary " #~ "club callsign)" #~ msgstr "" #~ "Kerhon toissijainen kutsumerkki (minulla on kutsumerkin varmenne " #~ "ensisijaiselle kerhon kutsumerkille)" #~ msgid "A DXpedition, Portable, or holiday operation with multiple operators" #~ msgstr "" #~ "DX-peditio-, portable-operaatio tai lomapeditio, jossa on useita " #~ "operaattoreita" #~ msgid "" #~ "A DXpedition, Portable, or holiday operation where I am the only operator" #~ msgstr "" #~ "DX-peditio, portable-operaatio tai lomapeditio, jossa minä olen ainoa " #~ "operaattori" #~ msgid "An operator that uses me as a QSL manager" #~ msgstr "Operaattori, jonka QSL-manageri olen" #~ msgid "A special event callsign with multiple operators" #~ msgstr "Erityistapahtuman, jossa on useita operaattoreita, kutsumerkki" #~ msgid "A special event callsign where I am the only operator" #~ msgstr "Erityistapahtuman, jossa minä olen ainoa operaattori, kutsumerkki" #~ msgid "Please select a Callsign Certificate to validate your request." #~ msgstr "Valitse kutsumerkin varmenne vahvistaaksesi pyyntösi." #~ msgid "This Callsign Certificate is for:" #~ msgstr "Tämä kutsumerkin varmenne on seuraavaa varten:" #~ msgid "" #~ "Please select your club's primary Callsign Certificate to validate your " #~ "request." #~ msgstr "" #~ "Valitse kerhosi ensisijaisen kutsun varmenne vahvistaaksesi pyyntösi." #~ msgid "" #~ "You have already requested more than three Callsign Certificates for %s " #~ "in the past 24 hours. You should submit a request only once, then wait " #~ "for that request to processed by LoTW Staff. This may take several " #~ "business days." #~ msgstr "" #~ "Olet jo pyytänyt yli kolme kutsumerkin varmennetta kutsulle %s viimeisten " #~ "24 tunnin aikana. Kutsumerkin varmenne tulee pyytää vain kerran ja sen " #~ "jälkeen odottaa, että LoTW:n henkilökunta käsittelee pyynnön. Tämä voi " #~ "kestää useita työpäiviä." #~ msgid "" #~ "You are saying that the requested Certificate for %s belongs to the same " #~ "person as %hs and are using the selected Certificate to prove %hs's " #~ "identity." #~ msgstr "" #~ "Imoitat että pyydetty varmenne %s:lle kuuluu samalle henkilölle kuin %hs " #~ "ja käyttää valittua varmennetta todistaakseen %hs:n identiteetin." #~ msgid "" #~ "Callsign Certificate container files (*.p12;*.P12)|*.p12;*.P12|" #~ "Certificate Request response files (*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgstr "" #~ "Kutsumerkin varmenteiden säilötiedostot (*.p12;*.P12)|*.p12;*.P12|" #~ "Varmennepyyntöjen vastaustiedostot(*.tq6;*.TQ6)|*.tq6;*.TQ6" #~ msgid "" #~ "Callsign Certificate container files (*.p12)|*.p12|Certificate Request " #~ "response files (*.tq6)|*.tq6" #~ msgstr "" #~ "Kutsumerkin varmenteiden säilötiedostot (*.p12)|*.p12|Varmennepyyntöjen " #~ "vastaustiedostot (*.tq6)|*.tq6" #~ msgid "Go to the first QSO in this log" #~ msgstr "Siirry ensimmäiseen yhteyteen tässä lokissa" #~ msgid "Go to the previous QSO in this log" #~ msgstr "Siirry edelliseen yhteyteen tässä lokissa" #~ msgid "Go to the next QSO in this log" #~ msgstr "Siirry seuraavaan yhteyteen tässä lokissa" #~ msgid "Go to the last QSO in this log" #~ msgstr "Siirry viimeiseen yhteyteen tässä lokissa" #~ msgid "No QSOs written" #~ msgstr "QSO:ja ei ole kirjattu" #~ msgid "Some QSOs suppressed" #~ msgstr "Muutamia QSO:ja piilotettu" #~ msgid "The file (%s) will be signed using:" #~ msgstr "Tiedosto (%s) allekirjoitetaan käyttäen:" #~ msgid "Station Location:" #~ msgstr "Aseman sijainti:" #~ msgid "DXCC:" #~ msgstr "DXCC:" #~ msgid "Is this correct?" #~ msgstr "Onko tämä oikein?" #~ msgid "TQSL - Confirm signing" #~ msgstr "TQSL - vahvista allekirjoitus" #~ msgid "%s: %d QSO records were outside the selected date range" #~ msgstr "%s: %d QSO-tietoa oli valitun päivämääräalueen ulkopuolella" #~ msgid "No records to upload" #~ msgstr "Ei tietoja lähetettäväksi" #~ msgid "Password protected P12 files cannot be imported on the command line" #~ msgstr "Salasanasuojattuja P12-tiedostoja ei voi tuoda komentoriviltä" #~ msgid "Your certificate request did not upload properly" #~ msgstr "Varmennepyyntösi ei latautunut oikein palvelimelle" #~ msgid "Please try again." #~ msgstr "Yritä uudelleen." #~ msgid "Certificate Request:" #~ msgstr "Varmennepyyntö:" #~ msgid "Allow 'None' for " #~ msgstr "Salli \"Tyhjä\" kohtaan " #~ msgid "%s: Invalid Grid Square Field" #~ msgstr "%s: Virheellinen lokaattorikenttä" #~ msgid "%s: Invalid Subsquare" #~ msgstr "%s: Virheellinen alilokaattori" #~ msgid "Already Uploaded QSO suppressed" #~ msgstr "Aiemmin lähetetty QSO-tieto piilotettu" #~ msgid "" #~ "There is no valid callsign certificate for %hs available. This QSO cannot " #~ "be signed" #~ msgstr "" #~ "Kutsumerkille %hs ei ole voimassaolevaa kutsumerkin varmennetta. Tätä QSO:" #~ "a ei voida allekirjoittaa" #~ msgid "Invalid, unusable" #~ msgstr "Virheellinen, käyttökelvoton" #~ msgid "Certificates that are awaiting ARRL approval" #~ msgstr "ARRL-hyväksyntää odottavat varmenteet" #~ msgid "" #~ "If so, choose a callsign below for the primary LoTW account. If not, " #~ "choose 'No', and a new LoTW account will be set up for these QSOs." #~ msgstr "" #~ "Jos niin on, valitse alta kutsumerkki ensisijaiselle LoTW-tilillesi. Jos " #~ "ei ole, valitse \"ei\" ja näille QSO:ille luodaan uusi LoTW-tili." #~ msgid "" #~ "This is a Club call, I'm the QSL manager for this call, or this is a " #~ "DXpedition call" #~ msgstr "" #~ "Tämä on kerhon kutsumerkki ja olen sen QSL-manageri tai tämä on DX-" #~ "pedition kutsu" #~ msgid "No, Create a new LoTW account for this call" #~ msgstr "Ei, luo uusi LoTW-tili tälle kutsulle" #~ msgid "Yes, Save these QSOs into an existing LoTW account" #~ msgstr "Kyllä, tallenna nämä QSOt olemassaolevalle LoTW-tilille" #~ msgid "Add QSOs for the new callsign to an existing LoTW account?" #~ msgstr "Lisätäänkö uuden kutsumerkin QSOt olemassaolevalle LoTW-tilille?" #~ msgid "Since you have no callsign certificates, you must " #~ msgstr "Koska sinulla ei ole kutsumerkin varmenteita, sinun täytyy" #~ msgid "" #~ "This portable callsign request requires approval using an existing " #~ "callsign certificate" #~ msgstr "" #~ "Tämä portable-kutsumerkin pyyntö tarvitsee hyväksynnän käyttäen " #~ "olemassaolevaa kutsumerkin varmennetta" #~ msgid "" #~ "The callsign %s is not currently registered in the FCC ULS database as of " #~ "%s.\n" #~ "If this is a newly registered call, you must wait at least one business " #~ "day for it to be valid. Please enter a currently valid callsign." #~ msgstr "" #~ "Kutsumerkki %s ei ole tällä hetkellä rekisteröity FCC:n ULS-tietokannassa " #~ "päivämäärällä %s.\n" #~ "Jos tämä on vasta rekisteröity kutsumerkki, sinun on odotettava vähintään " #~ "yksi arkipäivä jotta se on voimassa. Ole hyvä ja syötä nykyisin voimassa " #~ "oleva kutsumerkki." #~ msgid "" #~ "Please select a callsign certificate for the account where you would like " #~ "the QSOs to be stored" #~ msgstr "" #~ "Valitse kutsumerkin varmenne tilille, jolle haluat QSO:t tallennettavan" #~ msgid "To submit the signed log file to LoTW:\n" #~ msgstr "Lähettääksesi allekirjoitetun lokin LoTW:iin:\n" #~ msgid "" #~ "My former personal callsign or a portable modifier for my current callsign" #~ msgstr "" #~ "Aiempi henkilökohtainen kutsumerkkini tai liikkuvan aseman lisämerkki " #~ "nykyiseen kutsumerkkiini" #~ msgid "" #~ "You may protect this Callsign Certificate using a password. If you are " #~ "using a computer system that is shared with others, you should specify a " #~ "password to protect this Callsign Certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Voit suojata tämän kutsumerkin varmenteen salasanalla. Jos käytät " #~ "tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä antaa " #~ "salasana suojataksesi tämän kutsumerkin varmenteen. Kuitenkin, jos käytät " #~ "tietokonettä yksityistaloudessa, salasanaa ei ole tarvetta antaa." #~ msgid "" #~ "Leave the password blank and click 'Next' unless you want to use a " #~ "password." #~ msgstr "" #~ "Jätä salasanakenttä tyhjäksi ja valitse \"Seuraava\", jos et halua " #~ "käyttää salasanaa." #~ msgid "Password:" #~ msgstr "Salasana:" #~ msgid "Enter the password again for verification:" #~ msgstr "Anna salasana uudelleen varmistuksen vuoksi:" #~ msgid "" #~ "DO NOT lose the password you choose! You will be unable to use the " #~ "Certificate without this password!" #~ msgstr "" #~ "ÄLÄ hukkaa valitsemaasi salasanaa! Et voi käyttää varmennetta ilman tätä " #~ "salasanaa!" #~ msgid "" #~ "Leave the password blank and click 'Finish' unless you want to use a " #~ "password." #~ msgstr "" #~ "Jätä salasanakenttä tyhjäksi ja valitse \"Valmis\", jos et halua käyttää " #~ "salasanaa." #~ msgid "The two copies of the password do not match." #~ msgstr "Annetut salasanat eivät täsmää." #~ msgid "New password:" #~ msgstr "Uusi salasana:" #~ msgid "Password entries do not match" #~ msgstr "Annetut salasanat eivät täsmää" #~ msgid "Password confirmed" #~ msgstr "Salasana varmistettu" #~ msgid "Enter a password for this callsign certificate." #~ msgstr "Syötä salasana tälle kutsumerkin varmenteelle." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence no password need be specified." #~ msgstr "" #~ "Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä " #~ "antaa salasana suojataksesi tämän varmenteen. Kuitenkin, jos käytät " #~ "tietokonetta yksityistaloudessa, salasanaa ei ole tarvetta antaa." #~ msgid "" #~ "This password will have to be entered each time you use this callsign " #~ "certificate for signing or when saving the key." #~ msgstr "" #~ "Tämä salasana on annettava joka kerta kun käytät tätä kutsumerkin " #~ "varmennetta allekirjoitukseen tai kun tallennat avainta." #~ msgid "" #~ "Leave the password blank and click 'OK' unless you want to use a password." #~ msgstr "" #~ "Jätä salasana tyhjäksi ja paina \"OK\", jos et halua käyttää salasanaa." #~ msgid "New Password" #~ msgstr "Uusi salasana" #~ msgid "Enter the password to unlock the .p12 file:" #~ msgstr "Syötä salasana avataksesi .p12-tiedoston:" #~ msgid "Password error" #~ msgstr "Virhe salasanassa" #~ msgid "" #~ "Enter the password to unlock the callsign certificate for %hs -- %hs\n" #~ "(This is the password you made up when you installed the callsign " #~ "certificate.)" #~ msgstr "" #~ "Syötä salasana avataksesi varmenteen kutsumerkille %hs -- %hs\n" #~ "(Tämä on salasana, jonka keksit, kun asensit kutsumerkin varmennetta.)" #~ msgid "Enter password" #~ msgstr "Syötä salasana" #~ msgid "Password for the signing key" #~ msgstr "Salasana varmennusavaimelle" #~ msgid "Enter the password for the certificate container file." #~ msgstr "Syötä salasana varmenteen säilötiedostolle." #~ msgid "" #~ "If you are using a computer system that is shared with others, you should " #~ "specify a password to protect this certificate. However, if you are using " #~ "a computer in a private residence, no password need be specified." #~ msgstr "" #~ "Jos käytät tietokonetta, jota käyttävät muutkin henkilöt, sinun on syytä " #~ "antaa salasana suojataksesi tämän varmenteen. Kuitenkin, jos käytät " #~ "tietokonetta yksityistaloudessa, salasanaa ei ole tarvetta antaa." #~ msgid "" #~ "You will have to enter the password any time you load the file into " #~ "TrustedQSL." #~ msgstr "" #~ "Sinun on annettava salasana joka kerta kun lataat tiedoston TrustedQSL:" #~ "ään." #~ msgid "Certificate Container Password" #~ msgstr "Varmennesäilön salasana" #~ msgid "Password: " #~ msgstr "Salasana: " #~ msgid "Password protected" #~ msgstr "Salasanasuojattu" #~ msgid "Enter the password to unlock the callsign certificate" #~ msgstr "Syötä salasana avataksesi kutsumerkin varmenteen" #~ msgid "Enable passwords for Callsign Certificates" #~ msgstr "Ota käyttöön salasanat kutsumerkin varmenteille" #~ msgid "Password not correct" #~ msgstr "Väärä salasana" #~ msgid "New password" #~ msgstr "Uusi salasana" #~ msgid "Enter new password" #~ msgstr "Syötä uusi salasana" #~ msgid "Duplicate QSOs Detected" #~ msgstr "Duplikaatti-QSO:ja havaittu" #~ msgid "" #~ "Click 'Allow Duplicates' to re-process this log while allowing duplicate " #~ "QSOs." #~ msgstr "" #~ "Valitse \"Salli duplikaatit\" uudelleenkäsitelläksesi tämän lokin niin " #~ "että duplikaatti-QSO:t sallitaan." #~ msgid "" #~ "Click 'Exclude duplicates' to sign normally, without the duplicate QSOs " #~ "(Recommended)." #~ msgstr "" #~ "Valitse \"Jätä pois duplikaatit\" allekirjoittaaksesi normaalisti ilman " #~ "duplikaatti-QSO:ja (suositeltavaa)." #~ msgid "" #~ "Click 'Allow duplicates' to re-process this log while allowing duplicate " #~ "QSOs." #~ msgstr "" #~ "Valitse \"Salli duplikaatit\" uudelleenkäsitelläksesi tämän lokin niin " #~ "että duplikaatti-QSO:t sallitaan." #~ msgid "" #~ "The log file you are uploading using your QSO Logging system consists " #~ "entirely of previously uploaded QSOs (duplicates) that create unnecessary " #~ "work for LoTW. There may be a more recent version of your QSO Logging " #~ "system that would prevent this. Please check with your QSO Logging " #~ "system's vendor for an updated version." #~ msgstr "" #~ "Lokitiedosto, jota lähetät QSO-lokiohjelmaasi käyttäen, kostuu pelkästään " #~ "jo aiemmin lähetetyistä QSO:ista (duplikaateista), jotka aiheuttavat " #~ "turhaa prosessointikuormaa LoTW:lle. Voi olla, että on saatavissa uudempi " #~ "versio lokiohjelmastasi, joka estäisi tämän. Tarkista lokiohjelmasi " #~ "valmistajalta, onko saatavissa uudempaa versiota." #~ msgid "" #~ "In the meantime, please note that some loggers may exhibit strange " #~ "behavior if an option other than 'Allow duplicates' is clicked. Choosing " #~ "'Cancel' is usually safe, but a defective logger not checking the status " #~ "messages reported by TrustedQSL may produce strange (but harmless) " #~ "behavior such as attempting to upload an empty file or marking all chosen " #~ "QSOs as 'sent'" #~ msgstr "" #~ "Huomaa, että jotkut lokiohjelmat saattavat käyttäytyä oudosti jos muu " #~ "valinta kuin \"salli duplikaatit\" on valittu. Valinta \"peruuta\" on " #~ "yleensä turvallinen, mutta puutteellinen lokiohjelma, joka ei tarkista " #~ "TrustedQSL:n tilaviestejä, voi aiheuttaa outoa (mutta harmitonta) " #~ "käytöstä kuten yrittää lähettää tyhjää tiedostoa tai merkitä kaikki " #~ "valitut QSO:t lähetetyiksi" #~ msgid "" #~ "The log file you are uploading using your QSO Logging system includes " #~ "some previously uploaded QSOs (duplicates) that create unnecessary work " #~ "for LoTW. There may be a more recent version of your QSO Logging system " #~ "that would prevent this. Please check with your QSO Logging system's " #~ "vendor for an updated version." #~ msgstr "" #~ "Lokitiedosto, jota lähetät QSO-lokiohjelmaasi käyttäen, kostuu pelkästään " #~ "jo aiemmin lähetetyistä QSO:ista (duplikaateista), jotka aiheuttavat " #~ "turhaa prosessointikuormaa LoTW:lle. Voi olla, että on saatavissa uudempi " #~ "versio lokiohjelmastasi, joka estäisi tämän. Tarkista lokiohjelmasi " #~ "valmistajalta, onko saatavissa uudempaa versiota." #~ msgid "" #~ "In the meantime, please note that some loggers may exhibit strange " #~ "behavior if an option other than 'Allow duplicates' is clicked. 'Exclude " #~ "duplicates' is recommended, but a logger that does its own duplicate " #~ "tracking may incorrectly set the status in this case. A logger that " #~ "doesn't track duplicates should be unaffected by choosing 'Exclude " #~ "duplicates' and if it tracks 'QSO sent' status, will correctly mark all " #~ "selected QSOs as sent - they are in your account even though they would " #~ "not be in this specific batch" #~ msgstr "" #~ "Huomaa, että jotkut lokiohjelmat saattavat käyttäytyä oudosti jos muu " #~ "valinta kuin \"salli duplikaatit\" on valittu. \"Jätä pois duplikaatit\" " #~ "on suositeltava, mutta lokiohjelma, joka tekee oman " #~ "duplikaattitarkastuksensa voi asettaa tilan väärin tässä tapauksessa. " #~ "Lokiohjelman, joka ei tarkista duplikaatteja pitäisi toimia muutoksitta " #~ "valitsemalla \"Poista duplikaatit\" ja jos se seuraa \"QSO lähetetty\" -" #~ "tilaa, se merkitsee oikein kaikki valitut QSO:t lähetetyiksi - ne ovat " #~ "tililäsi vaikka ne eivät olisi tässä nimenomaisessa erässä" #~ msgid "Exclude duplicates" #~ msgstr "Jätä pois duplikaatit" #~ msgid "Allow duplicates" #~ msgstr "Salli duplikaatit" #~ msgid "" #~ "The only reason to re-sign duplicate QSOs is if a previous upload was not " #~ "processed by LoTW, either because it was never uploaded, or there was a " #~ "server failure" #~ msgstr "" #~ "Ainoa syy uudelleenallekirjoittaa duplikaatti-QSO:ja on se jos LoTW ei " #~ "käsitellyt aiempaa lähetystä, joko koska sitä ei koskaan lähetetty tai " #~ "tapahtui palvelinvirhe" #~ msgid "Duplicates: %d" #~ msgstr "Duplikaatteja: %d" #~ msgid "All QSOs are duplicates; aborted" #~ msgstr "Kaikki QSO:t ovat duplikaatteja; keskeytetty" #~ msgid "%d of %d QSOs are duplicates; aborted" #~ msgstr "%d kappaletta %d:sta QSO:sta on duplikaatteja; keskeytetty" #~ msgid "%s: %d QSO records were duplicates" #~ msgstr "%s: %d QSO-tietoa oli duplikaatteja" #~ msgid "" #~ "Resubmitting these QSOs will cause them to be reported as duplicates." #~ msgstr "" #~ "Näiden QSO:jen uudelleenlähettäminen aiheuttaa niiden raportoimisen " #~ "duplikaatteina." #~ msgid "TQSL must not be run 'As Administrator'. Quitting." #~ msgstr "" #~ "TQSL:ää ei voi käynnistää ylläpitäjänä. Lopetetaan TQSL:n suorittaminen." #~ msgid "Display details of duplicate QSOs when signing a log" #~ msgstr "Näytä duplikaatti-QSO:jen tiedot, kun lokia allekirjoitetaan" #~ msgid "Duplicate QSO suppressed" #~ msgstr "Duplikaatti-QSO piilotettu" #~ msgid "A special event (1x1) callsign" #~ msgstr "Erityistapahtuman kutsumerkki (1x1)" #~ msgid "Callsign Certificate or Certificate Request not found" #~ msgstr "Kutsumerkin varmennetta tai varmennepyyntöä ei löytynyt" #~ msgid "" #~ "Callsign Certificate or Certificate Request not found for callsign %hs " #~ "serial %ld" #~ msgstr "" #~ "Kutsumerkin varmennetta tai varmennepyyntöä ei löytynyt kutsumerkille " #~ "%hs, sarjanumero %ld" tqsl-2.8.1/apps/lang/fi/wxstd-3.2.mo0000644000175000017500000025556515003421124017005 0ustar rmurphyrmurphy&U L`e?aee?eeeeffff%fDfdfff ff f fff g,g=gNg Ugbg vgg gg gg gg ggggghhhh/h6h=hDhMhVh \h fhthhh hhhhhhhhhhi ii)i0i9i @iJiSi Yigimiiiii iiii iiiiiijjj j *j7j;jCjLjPjYj ijuj|j jj j jj j jjjjkkk/k8k?kGk MkZkpkvk}kk kkkkkkkkkk k k ll l$l(l=lFlOlWl_ldl4l$l!llm m m m*m1m3m6m8mImKmOmSmWm[m_mcmgmkmom sm ~m m m mm m mmmnnn ,n 9n En Rn^nmnsnynn#n/nnno3o5:o6poooooo p5pMphpppppppq*qBq]qtqqqqqq qqqq4 r.>rmr|r r r rrrrr rr6stTtrtttt ttu7uMukuu!u"uu-v11v(cvv vvvvvvvvvw w$w,w@wGwPwjwwww0w x xFxbx)xxxxx%y#8y"\y*y(y&y%y% z6Fz}z"z?zz{13{ e{{{!{{{({(&|-O|3}|| |-|}.}%J}p}}})}}~)~)I~'s~"~~~~~~# * 7B TBa'!++H"g&#̀  3RY"p$#ց (<e%$&̂!&#<"`#*!҃# (?Q/XN(߄); CQ(Z$ ą!=!W(y.'C#Uy(Ӈ9'8MR eq u,1ڈ0 %=%c!#ʼn  " ) 5 B NZk| ~: J"Vy2Qދ02G"z ŌЌՌ-ی "6 ; ESlЍ 6L%jƎ֎ ގ,$,Qmď-""49W$"Ґ&"8?xG/ّA .Kz)2./K{/%Ǔ##35"i$T͔"<"T!w5ϕ .On#"Ӗ-' "H5k&-S/j,2ǘ&&!H+f(!)ݙ3%-Y$Ś)2!Gi=n śЛ  /CLa f t 4 ǜӜ' 2R ju#28ߝ %+Qf}* ̞' 4=QV k v 2ß̟" C d'Ơ  8$Tjy%+ %6/\3ߢ-G N [g(#Σ66#T8x1դ" *4QX_ nx}6¥ 0 8 COk #)¦ 5|? Ƨ ҧ ݧ ! * 4 A M Wd m x & ŨϨC AK'S+{ũͩ  ",1/a sͪ&Ԫ /27Q! ȫ00 8DLjϬ# .I^n$ݭ% F$c$ʮ$ $)N$k$ү$$1V ^ l w  °ΰ"1B9tDZ бޱ    0 @NVgw   ɲղ޲$!,3N#(0BR"Y | ôִ #+/Aq  ʵ׵< 5 ALg~% ܶ)0?9yط% 1*Ny -1+@%l) ȹѹ ٹ06 =KSsú޺ , 06g}z( )50_o('9avӽ.+ =!^'*˾07MhO@YG#B,;VZs A+*4_ hsx&:Xn+ # =G[y (  -9R"k.-&7^v"!"@,[1$%#/'W ` jw:B=^;>5M9,4a-+!Y { !) >7/v0-$B*W(#" *!K$m /4G eou{   /CWi~  5EVh{  (#"' J X&c)  -C\l|C   $?V^ o }  " 3*S~ o= KEM  #$ ( I"j  , " +7LT]n    '.5=EM `$l   (8 M Xd s $    (7=Fck q {    % > IT g s "17>%Dj   %, DPXai8q<+/CG N\p  % ANby   0:1l#,?8Tm 6Kg,H\bj $<?Ti} @![}$&G +E^g o|!! Bc!%,*?j6;)'0 7 EQ c oy 2Nj4 U)09Z+*3"+V'.-4,<,iK. C2v'G1)8b%.9)(C9l+62 </W. *>#!b#2<$8]m   Y v6!;,-E$s-1%( GU5j*. ,:(g%/#. (9'b)(04%C4i'/  "62<oTv, 25> O'Y/+$ #=a x'4%R:,2'@D -,I+v#+&,5b q   % ' 3 @{M  "N;u1,GtA!!&=EM]s8N-k/0 0G %x ! & / & >> F} , H >: y $ - $ 3 D Ld @ B .5 %d ' !  a &W<~&B%%"Kn.$'k &1'5-%c8=-&."U)x(113I)})1>fB>)00)a(4.-7F%~91'18<j2<.F:O  BS[s|  =/D ^l ::LY  "+= i!+ # 32At} $*"#A_} #) qJ-2# 0A 6r #      !8!M! U!b!q!0!,!$!K"K_"5"=" #%*#=P####$### # $$$7$N$i$r$Gx$ $A$ %%!*%-L%z% %1%3%%%$&#;& _&i& && ''2'F'W' k'u''''''''($( 9(E(-V(( ((((J( ) )+,)+X))))))) )) ) *; *I*(^*(* ** *-*+$+4+;+O+$R+1w+#++++ ,;),e,n, u,,,, ,, -%'-M-"l-------.*0.[.+{..*..*/;/*Z//*//*/0*70b0*00*00 0 11+1 11 >1L1S1b1i1r11 1111A2 Z2f2 z2222#2 22 233,353F3Z3 o3 {3 3 333333 444 54'?4Gg44(R5 {5555%55566"686A6X6o6u666666(6#7A7H7 M7X7^7 u777?77788!98"[8)~88 808 9J9Z9s999999):"::-]::!::::::#;'(;&P;w;);;;; ;;;;<;<A<I<[<!d<<< <!< ===-=&I="p== ==.@>$o>5>m>8?U?g? v? ????? ??@4&@[@k@@ @#@@2@ A6ANA0kALAPAA:BT|B2BCCP6CC CCCC C DDNDeDyDDDD*D D DDDE7E?EWEoEE EEE EE#F6F-SFF"FFFFF GG 0GQG nG xGG$G+GGG H "H.HHH!gH4H2HHI*I+DIpIII"II#I%J(>JgJ)JJ7J7K$?KdK1kK K KK~K29LlL?L7L2M@4MuMN9N$YN~N6.O)eOO O OO O%O.P$?P4dP5P1PIQ*KQ4vQ-QQ4Q7.R.fR(R!R,R. S3VHV ZVFgV V V VV)V W W/W2JW"}WW WW WW WW8W4X SX aX nXyX8XX X XXX YY Y2YY YZZ#.Z RZ`Z iZtZ*ZZZCZ.+[Z[_[ e[s[Hj'FpyMVF2A{pA{(kCNg{E Q$du 7[=a~**}gn|l7P/,D$z&R`8fy]1$<.h2xGN1I\^7"Y`M"X04_b Fj'Vv.%u8oC}SJlz(^ \XV'c|\%qd9m=a1YlOf.;MPcL@p2t3sw-Oh:5,V4; )~p EL=]:@%"Tp>)eK}-I&/E O3$OKm >mRs ,&jk?D q tbIUBg>n+|%`bH\:'J|58%yo,S EWYoq/S"?&e2:G\nc( Bwr?dZ*DTFE|~gR-m4s0sP Zx_=l}vuGkx9PkNBo<rLqz6c~i6{QZ^]ai[S uW+0w];^7GKA_Y##8Rv>[0z9!/b!N=Dm`r*`atOZw+#,.Gs!t^ xc_v@yh9  T[9xUP<8HQ/n&WuQe{rg05z.d F" 'Q3$Z5?Yw6XK#H@()@r4(6B35*# eIt}2lvbT6  i-;]_)Lo [ih1TC3djJ Df~:!>?J hS);LUCM e<Jin1-UXfR M<UyjX+C K !A+7W4HWqVaIANkfB Please send this report to the program maintainer, thank you! Thank you and we're sorry for the inconvenience! (error %ld: %s) - Preview bold italic light strikethrough#10 Envelope, 4 1/8 x 9 1/2 in#11 Envelope, 4 1/2 x 10 3/8 in#12 Envelope, 4 3/4 x 11 in#14 Envelope, 5 x 11 1/2 in#9 Envelope, 3 7/8 x 8 7/8 in%d of %lu%ld byte%ld bytes%lu of %lu%s (or %s)%s Error%s Information%s Warning%s did not fit the tar header for entry '%s'%s files (%s)|%s&About&Actual Size&After a paragraph:&Alignment&Apply&Apply Style&Arrange Icons&Ascending&Back&Based on:&Before a paragraph:&Bg colour:&Bold&Bottom&Bottom:&Bullet style:&Cancel&Cascade&Cell&Character code:&Clear&Close&Color&Colour:&Convert&Copy&Copy URL&Customize...&Debug report preview:&Delete&Delete Style...&Descending&Details&Down&Edit&Edit Style...&Execute&File&Finish&First&Floating mode:&Font&Font family:&Font for Level...&Font:&Forward&From:&Harddisk&Height:&Help&Hide details&Home&Indentation (tenths of a mm)&Index&Info&Italic&Jump to&Justified&Last&Left&Left:&List level:&Log&Move&Move the object to:&Network&New&Next&Next >&Next Paragraph&Next Tip&Next style:&No&Notes:&Number:&OK&Open...&Outline level:&Page Break&Paste&Picture&Point size:&Position (tenths of a mm):&Preferences&Previous&Previous Paragraph&Print...&Properties&Quit&Redo&Redo &Rename Style...&Replace&Restart numbering&Restore&Right&Right:&Save&See details&Show tips at startup&Size&Size:&Skip&Spacing (tenths of a mm)&Spell Check&Stop&Strikethrough&Style:&Styles:&Subset:&Symbol:&Table&Top&Top:&Underline&Underlining:&Undo&Undo &Unindent&Up&Vertical alignment:&View...&Weight:&Width:&Window&Yes'%s' has extra '..', ignored.'%s' is not a correct numeric value for option '%s'.'%s' is not a valid message catalog.'%s' is probably a binary buffer.(*)(Help)(None)(Normal text)(bookmarks)(none)**)+, 64-bit edition-...1.11.21.31.41.51.61.71.81.910 x 11 in10 x 14 in11 x 17 in12 x 11 in15 x 11 in26 3/4 Envelope, 3 5/8 x 6 1/2 in9 x 11 in: file does not exist!: unknown charset: unknown encoding< &BackBold italic face.
bold italic underlined
Bold face. Italic face. >A debug report has been generated in the directory A debug report has been generated. It can be found inA non empty collection must consist of 'element' nodesA standard bullet name.A0 sheet, 841 x 1189 mmA1 sheet, 594 x 841 mmA2 420 x 594 mmA3 Extra 322 x 445 mmA3 Extra Transverse 322 x 445 mmA3 Rotated 420 x 297 mmA3 Transverse 297 x 420 mmA3 sheet, 297 x 420 mmA4 Extra 9.27 x 12.69 inA4 Plus 210 x 330 mmA4 Rotated 297 x 210 mmA4 Transverse 210 x 297 mmA4 sheet, 210 x 297 mmA4 small sheet, 210 x 297 mmA5 Extra 174 x 235 mmA5 Rotated 210 x 148 mmA5 Transverse 148 x 210 mmA5 sheet, 148 x 210 mmA6 105 x 148 mmA6 Rotated 148 x 105 mmABCDEFGabcdefg12345ASCIIAboutAbout %sActual SizeAddAdd current page to bookmarksAdd to custom coloursAddToPropertyCollection called on a generic accessorAddToPropertyCollection called w/o valid adderAdding book %sAfter a paragraph:Align LeftAlign RightAlignmentAllAll files (%s)|%sAll files (*)|*All files (*.*)|*.*All stylesAlphabetic ModeAlready Registered Object passed to SetObjectClassInfoAlready dialling ISP.Alt+And includes the following files: Animation file is not of type %ld.Append log to file '%s' (choosing [No] will overwrite it)?ApplyArabicArabic (ISO-8859-6)Argument %u not found.ArtistsAscendingAttributesAvailable fonts.B4 (ISO) 250 x 353 mmB4 (JIS) Rotated 364 x 257 mmB4 Envelope, 250 x 353 mmB4 sheet, 250 x 354 mmB5 (ISO) Extra 201 x 276 mmB5 (JIS) Rotated 257 x 182 mmB5 (JIS) Transverse 182 x 257 mmB5 Envelope, 176 x 250 mmB5 sheet, 182 x 257 millimeterB6 (JIS) 128 x 182 mmB6 (JIS) Rotated 182 x 128 mmB6 Envelope, 176 x 125 mmBMP: Couldn't allocate memory.BMP: Couldn't save invalid image.BMP: Couldn't write RGB color map.BMP: Couldn't write data.BMP: Couldn't write the file (Bitmap) header.BMP: Couldn't write the file (BitmapInfo) header.BMP: wxImage doesn't have own wxPalette.BackBackgroundBackground &colour:Background colourBefore a paragraph:BitmapBoldBottomBottom margin (mm):BrowseBullet &Alignment:Bullet styleBulletsC sheet, 17 x 22 inC&learC&olour:C3 Envelope, 324 x 458 mmC4 Envelope, 229 x 324 mmC5 Envelope, 162 x 229 mmC6 Envelope, 114 x 162 mmC65 Envelope, 114 x 229 mmCHM handler currently supports only local files!Ca&pitalsCan't &Undo Can't automatically determine the image format for non-seekable input.Can't close registry key '%s'Can't copy values of unsupported type %d.Can't create registry key '%s'Can't create threadCan't delete key '%s'Can't delete the INI file '%s'Can't delete value '%s' from key '%s'Can't enumerate subkeys of key '%s'Can't enumerate values of key '%s'Can't export value of unsupported type %d.Can't find current position in file '%s'Can't get info about registry key '%s'Can't initialize zlib deflate stream.Can't initialize zlib inflate stream.Can't monitor non-existent directory "%s" for changes.Can't open registry key '%s'Can't read from inflate stream: %sCan't read inflate stream: unexpected EOF in underlying stream.Can't read value of '%s'Can't read value of key '%s'Can't save image to file '%s': unknown extension.Can't save log contents to file.Can't set thread priorityCan't set value of '%s'Can't write to deflate stream: %sCancelCannot enumerate files '%s'Cannot enumerate files in directory '%s'Cannot find active dialup connection: %sCannot find the location of address book fileCannot get priority range for scheduling policy %d.Cannot get the hostnameCannot get the official hostnameCannot hang up - no active dialup connection.Cannot initialize OLECannot load icon from '%s'.Cannot load resources from file '%s'.Cannot open HTML document: %sCannot open HTML help book: %sCannot open contents file: %sCannot open file for PostScript printing!Cannot open index file: %sCannot print empty page.Cannot read typename from '%s'!Cannot retrieve thread scheduling policy.Cannot start thread: error writing TLS.Cannot wait for thread terminationCase sensitiveCategorized ModeCeltic (ISO-8859-14)Cen&tredCenteredCentral European (ISO-8859-2)CentreCentre text.Ch&oose...Change List StyleChange StyleChanges won't be saved to avoid overwriting the existing file "%s"Character stylesCheck to add a period after the bullet.Check to add a right parenthesis.Check to enclose the bullet in parentheses.Check to make the font bold.Check to make the font italic.Check to make the font underlined.Check to restart numbering.Check to show a line through the text.Check to show the text in capitals.Choose ISP to dialChoose colourChoose fontCircular dependency involving module "%s" detected.Cl&oseClear the log contentsClick to apply the selected style.Click to browse for a symbol.Click to cancel changes to the font.Click to cancel the font selection.Click to change the font colour.Click to change the text colour.Click to choose the font for this level.Click to close this window.Click to confirm changes to the font.Click to confirm the font selection.Click to create a new character style.Click to create a new list style.Click to create a new paragraph style.Click to create a new tab position.Click to delete all tab positions.Click to delete the selected style.Click to delete the selected tab position.Click to edit the selected style.Click to rename the selected style.CloseClose AllClose current documentClose this windowColourColour selection dialog failed with error %0lx.Colour:Command line argument %d couldn't be converted to Unicode and will be ignored.Compressed HTML Help file (*.chm)|*.chm|ComputerConfig entry name cannot start with '%c'.ConfirmConnecting...ContentsConversion to charset '%s' doesn't work.Copies:CopyCopy selectionCould not create temporary file '%s'Could not extract %s into %s: %sCould not find tab for idCould not locate file '%s'.Could not start document preview.Could not start printing.Could not transfer data to windowCouldn't add an image to the image list.Couldn't create a timerCouldn't find symbol '%s' in a dynamic libraryCouldn't get the current thread pointerCouldn't load a PNG image - file is corrupted or not enough memory.Couldn't load sound data from '%s'.Couldn't open audio: %sCouldn't register clipboard format '%s'.Couldn't save PNG image.Couldn't terminate threadCreate Parameter %s not found in declared RTTI ParametersCreate directoryCreate new directoryCu&tCurrent directory:Custom sizeCutCut selectionCyrillic (ISO-8859-5)D sheet, 22 x 34 inDIB Header: Encoding doesn't match bitdepth.DIB Header: Image height > 32767 pixels for file.DIB Header: Image width > 32767 pixels for file.DIB Header: Unknown bitdepth in file.DIB Header: Unknown encoding in file.DL Envelope, 110 x 220 mmDebug report couldn't be created.Debug report generation has failed.DecorativeDefault encodingDefault fontDefault printerDeleteDelete A&llDelete StyleDelete TextDelete itemDelete selectionDelete style %s?Deleted stale lock file '%s'.DesktopDeveloped by DevelopersDial up functions are unavailable because the remote access service (RAS) is not installed on this machine. Please install it.Did you know...DirectoriesDirectory '%s' couldn't be createdDirectory does not existDirectory doesn't exist.Discard changes and reload the last saved version?Display all index items that contain given substring. Search is case insensitive.Display options dialogDisplays help as you browse the books on the left.Do you want to save changes to %s?Documentation by Documentation writersDon't SaveDoneDone.Double Japanese Postcard Rotated 148 x 200 mmDoubly used id : %dDownE sheet, 34 x 44 inEditEdit itemElapsed time:Enable the height value.Enable the width value.Enter a character style nameEnter a list style nameEnter a new style nameEnter a paragraph style nameEntries foundErrorError creating directoryError in reading image DIB.Error in resource: %sError reading config options.Error saving user configuration data.Error while printing: Error: Esperanto (ISO-8859-3)Estimated time:ExecuteExecution of command '%s' failedExtended Unix Codepage for Japanese (EUC-JP)Extraction of '%s' into '%s' failed.Failed to access lock file.Failed to change video modeFailed to close file handleFailed to close lock file '%s'Failed to close the clipboard.Failed to connect: missing username/password.Failed to connect: no ISP to dial.Failed to copy registry value '%s'Failed to copy the contents of registry key '%s' to '%s'.Failed to copy the file '%s' to '%s'Failed to create DDE stringFailed to create MDI parent frame.Failed to create a temporary file nameFailed to create an anonymous pipeFailed to create connection to server '%s' on topic '%s'Failed to create cursor.Failed to create directory '%s' (Do you have the required permissions?)Failed to create registry entry for '%s' files.Failed to create the standard find/replace dialog (error code %d)Failed to display HTML document in %s encodingFailed to empty the clipboard.Failed to enumerate video modesFailed to establish dialup connection: %sFailed to execute '%s' Failed to execute curl, please install it in PATH.Failed to find CLSID of "%s"Failed to find match for regular expression: %sFailed to get ISP names: %sFailed to get OLE automation interface for "%s"Failed to get data from the clipboardFailed to get the local system timeFailed to get the working directoryFailed to initialize GUI: no built-in themes found.Failed to initialize MS HTML Help.Failed to initialize OpenGLFailed to inspect the lock file '%s'Failed to join a thread, potential memory leak detected - please restart the programFailed to kill process %dFailed to load mpr.dll.Failed to load shared library '%s'Failed to lock the lock file '%s'Failed to modify descriptor %d in epoll descriptor %dFailed to monitor I/O channelsFailed to open '%s' for readingFailed to open '%s' for writingFailed to open CHM archive '%s'.Failed to open temporary file.Failed to open the clipboard.Failed to put data on the clipboardFailed to read PID from lock file.Failed to read config options.Failed to redirect child process input/outputFailed to redirect the child process IOFailed to register DDE server '%s'Failed to remember the encoding for the charset '%s'.Failed to remove lock file '%s'Failed to remove stale lock file '%s'.Failed to rename registry value '%s' to '%s'.Failed to rename the file '%s' to '%s' because the destination file already exists.Failed to rename the registry key '%s' to '%s'.Failed to retrieve text of RAS error messageFailed to retrieve the supported clipboard formatsFailed to send DDE advise notificationFailed to set FTP transfer mode to %s.Failed to set clipboard data.Failed to set permissions on lock file '%s'Failed to set temporary file permissionsFailed to set thread priority %d.Failed to store image '%s' to memory VFS!Failed to terminate a thread.Failed to terminate the advise loop with DDE serverFailed to terminate the dialup connection: %sFailed to touch the file '%s'Failed to unlock lock file '%s'Failed to unregister DDE server '%s'Failed to update user configuration file.Failed to upload the debug report (error code %d).Failed to write to lock file '%s'FileFile '%s' already exists, do you really want to overwrite it?File couldn't be loaded.File errorFile name exists already.FilesFiles (%s)FilterFindFixed font:Fixed size face.
bold italic FloatingFolio, 8 1/2 x 13 inFontFont &weight:Font size:Font st&yle:Font:Fonts index file %s disappeared while loading fonts.Fork failedForward hrefs are not supportedFound %i matchesFrom:GIF: data stream seems to be truncated.GIF: error in GIF image format.GIF: not enough memory.GTK+ themeGeneric PostScriptGetProperty called w/o valid getterGetPropertyCollection called on a generic accessorGetPropertyCollection called w/o valid collection getterGo backGo forwardGo one level up in document hierarchyGo to home directoryGo to parent directoryGraphics art by Greek (ISO-8859-7)Gzip not supported by this version of zlibHTML Help Project (*.hhp)|*.hhp|HTML anchor %s does not exist.HTML files (*.html;*.htm)|*.html;*.htm|HarddiskHebrew (ISO-8859-8)HelpHelp Browser OptionsHelp IndexHelp PrintingHelp TopicsHelp books (*.htb)|*.htb|Help books (*.zip)|*.zip|Help: %sHide this notification message.HomeHome directoryICO: Error in reading mask DIB.ICO: Error writing the image file!ICO: Image too tall for an icon.ICO: Image too wide for an icon.ICO: Invalid icon index.IFF: data stream seems to be truncated.IFF: error in IFF image format.IFF: not enough memory.IFF: unknown error!!!ISO-2022-JPIllegal directory name.Illegal file specification.Image and mask have different sizes.Impossible to create a rich edit control, using simple text control instead. Please reinstall riched32.dllImpossible to get child process inputImpossible to get permissions for file '%s'Impossible to overwrite the file '%s'Impossible to set permissions for the file '%s'Incorrect GIF frame size (%u, %d) for the frame #%uIncorrect number of arguments.IndentIndents && SpacingIndexIndian (ISO-8859-12)InfoInitialization failed in post init, aborting.InsertInsert ImageInsert TextInvalid TIFF image index.Invalid display mode specification '%s'.Invalid geometry specification '%s'Invalid lock file '%s'.Invalid or Null Object ID passed to GetObjectClassInfoInvalid or Null Object ID passed to HasObjectClassInfoInvalid regular expression '%s': %sInvalid value %ld for a boolean key "%s" in config file.ItalicItaly Envelope, 110 x 230 mmJPEG: Couldn't load - file is probably corrupted.JPEG: Couldn't save image.Jump toJustifiedJustify text left and right.KOI8-RKOI8-UL&ine spacing:LandscapeLeftLeft (&first line):Left margin (mm):Left-align text.LicenseLightLine %lu of map file "%s" has invalid syntax, skipped.Line spacing:Link contained '//', converted to absolute link.List StyleList stylesLists font sizes in points.Lists the available fonts.Load %s fileLoading : Lock file '%s' has incorrect owner.Lock file '%s' has incorrect permissions.Log saved to the file '%s'.Lower case lettersLower case roman numeralsMDI childMS HTML Help functions are unavailable because the MS HTML Help library is not installed on this machine. Please install it.Ma&ximizeMacArmenianMacBengaliMacCelticMacCroatianMacCyrillicMacEthiopicMacGaelicMacGeorgianMacGreekMacHebrewMacIcelandicMacJapaneseMacKoreanMacMongolianMacTamilMacTurkishMacVietnameseMarginsMatch caseMemory VFS already contains file '%s'!MenuMi&nimizeMissing a required parameter.ModernModifiedMonitoring individual files for changes is not supported currently.Move downMove upMoves the object to the next paragraph.Moves the object to the previous paragraph.Multiple Cell PropertiesNameNetworkNew &Character Style...New &List Style...New &Paragraph Style...New StyleNewNameNext pageNoNo default application configured for HTML files.No entries found.No handler found for image type.No matching page found yetNo soundNordic (ISO-8859-10)NormalNormal face
and underlined. Normal font:Not underlinedNoticeNumbered outlineOKOLE Automation error in %s: %sObject implementation does not support named arguments.Objects must have an id attributeOpen FileOpen HTML documentOperation not permitted.Option '%s' requires a value.Option '%s': '%s' cannot be converted to a date.OptionsOrientationOutlinePCX: couldn't allocate memoryPCX: image format unsupportedPCX: invalid imagePCX: this is not a PCX file.PCX: unknown error !!!PCX: version number too lowPNM: Couldn't allocate memory.PNM: File format is not recognized.PNM: File seems truncated.PRC 16K 146 x 215 mmPRC 16K RotatedPRC 32K 97 x 151 mmPRC 32K RotatedPRC 32K(Big) 97 x 151 mmPRC 32K(Big) RotatedPRC Envelope #1 102 x 165 mmPRC Envelope #1 Rotated 165 x 102 mmPRC Envelope #10 324 x 458 mmPRC Envelope #10 Rotated 458 x 324 mmPRC Envelope #2 102 x 176 mmPRC Envelope #2 Rotated 176 x 102 mmPRC Envelope #3 125 x 176 mmPRC Envelope #3 Rotated 176 x 125 mmPRC Envelope #4 110 x 208 mmPRC Envelope #4 Rotated 208 x 110 mmPRC Envelope #5 110 x 220 mmPRC Envelope #5 Rotated 220 x 110 mmPRC Envelope #6 120 x 230 mmPRC Envelope #6 Rotated 230 x 120 mmPRC Envelope #7 160 x 230 mmPRC Envelope #7 Rotated 230 x 160 mmPRC Envelope #8 120 x 309 mmPRC Envelope #8 Rotated 309 x 120 mmPRC Envelope #9 229 x 324 mmPRC Envelope #9 Rotated 324 x 229 mmPage %dPage %d of %dPage SetupPage setupPagesPaper sizeParagraph stylesPastePaste selectionPeri&odPermissionsPipe creation failedPlease choose a valid font.Please choose an existing file.Please choose the page to display:Please choose which ISP do you want to connect toPlease select the columns to show and define their order:PortraitPostScript filePreview:Previous pagePrintPrint PreviewPrint Preview FailurePrint RangePrint SetupPrint in colourPrint this pagePrint to FilePrinterPrinter command:Printer optionsPrinter options:Printer...Printer:Printing Printing ErrorPrinting page %d...Printing...QuestionQuit this programRead error on file '%s'ReadyRedoRedo last actionRefreshRegistry key '%s' already exists.Registry key '%s' does not exist, cannot rename it.Registry key '%s' is needed for normal system operation, deleting it will leave your system in unusable state: operation aborted.Registry value '%s' already exists.RegularRelevant entries:Remaining time:RemoveRemove current page from bookmarksRenumber ListReplaceReplace &allReplace with:Revert to SavedRightRight margin (mm):Right-align text.RomanS&tandard bullet name:SaveSave %s fileSave &As...Save AsSave current documentSave current document with a different filenameSave log contents to fileScriptSearchSearch directionSearch for:Search in all booksSearching...SectionsSeek error on file '%s'Seek error on file '%s' (large files not supported by stdio)Select &AllSelect AllSelect a document templateSelect a document viewSelect regular or bold.Select regular or italic style.Select underlining or no underlining.SelectionSelects the list level to edit.Separator expected after the option '%s'.Setup...Several active dialup connections found, choosing one randomly.Show &hidden directoriesShow &hidden filesShow about dialogShow allShow all items in indexShow/hide navigation panelShows a Unicode subset.Shows a preview of the font settings.Shows a preview of the font.Shows a preview of the paragraph settings.Shows the font preview.Simple monochrome themeSizeSize:SkipSlantSorry, could not open this file.Sorry, not enough memory to create a preview.Sorry, that name is taken. Please choose another.Sorry, the format for this file is unknown.Sound data are in unsupported format.Sound file '%s' is in unsupported format.Spell CheckStandardStatus:StrikethroughStyleStyle:SuperA/SuperA/A4 227 x 356 mmSuperB/SuperB/A3 305 x 487 mmSwissSymbolSymbol &font:SymbolsTIFF: Couldn't allocate memory.TIFF: Error loading image.TIFF: Error reading image.TIFF: Error saving image.TIFF: Error writing image.TabsTeletypeTemplatesThai (ISO-8859-11)The FTP server doesn't support passive mode.The FTP server doesn't support the PORT command.The available styles.The character code.The charset '%s' is unknown. You may select another charset to replace it with or choose [Cancel] if it cannot be replacedThe clipboard format '%d' doesn't exist.The default style for the next paragraph.The directory '%s' does not exist Create it now?The file '%s' doesn't exist and couldn't be opened. It has been removed from the most recently used files list.The first line indent.The font colour.The font family.The font from which to take the symbol.The font point size.The font size in points.The font style.The font weight.The left indent.The line spacing.The list item number.The range to show.The required parameter '%s' was not specified.The right indent.The spacing after the paragraph.The spacing before the paragraph.The style name.The style on which this style is based.The style preview.The system cannot find the file specified.The tab position.The tab positions.The text couldn't be saved.The value for the option '%s' must be specified.There was a problem during page setup: you may need to set a default printer.Thread module initialization failed: cannot store value in thread local storageThread module initialization failed: failed to create thread keyThread module initialization failed: impossible to allocate index in thread local storageThread priority setting is ignored.Tile &HorizontallyTile &VerticallyTimeout while waiting for FTP server to connect, try passive mode.Tip of the DayTips not available, sorry!To:Too many EndStyle calls!Top margin (mm):Translations by TranslatorsTrueTrying to remove file '%s' from memory VFS, but it is not loaded!Turkish (ISO-8859-9)TypeType a font name.Type a size in points.US-ASCIIUnable to open requested HTML document: %sUndeleteUnderlinedUndoUndo last actionUnexpected parameter '%s'UnicodeUnicode 16 bit (UTF-16)Unicode 32 bit (UTF-32)Unicode 7 bit (UTF-7)Unicode 8 bit (UTF-8)UnknownUnknown DDE error %08xUnknown Property %sUnknown dynamic library errorUnknown encoding (%d)Unknown long option '%s'Unknown option '%s'Unmatched '{' in an entry for mime type %s.Unnamed commandUnsupported clipboard format.Unsupported theme '%s'.UpUpper case lettersUpper case roman numeralsUsage: %sValidation conflictView files as a detailed viewView files as a list viewViewsWarning: WeightWestern European (ISO-8859-1)Western European with Euro (ISO-8859-15)Whether the font is underlined.Whole wordWhole words onlyWin32 themeWindows Arabic (CP 1256)Windows Baltic (CP 1257)Windows Central European (CP 1250)Windows Chinese Simplified (CP 936) or GB-2312Windows Chinese Traditional (CP 950) or Big-5Windows Cyrillic (CP 1251)Windows Greek (CP 1253)Windows Hebrew (CP 1255)Windows Japanese (CP 932) or Shift-JISWindows Korean (CP 949)Windows Thai (CP 874)Windows Turkish (CP 1254)Windows Western European (CP 1252)Windows/DOS OEM (CP 437)Windows/DOS OEM Cyrillic (CP 866)Write error on file '%s'XML parsing error: '%s' at line %dXPM: Malformed pixel data!XPM: incorrect colour description in line %dXPM: incorrect header format!XPM: malformed colour definition '%s' at line %d!XPM: no colors left to use for mask!XPM: truncated image data at line %d!YesYou cannot add a new directory to this section.Zoom &InZoom &OutZoom to &Fita DDEML function was called without first calling the DdeInitialize function, or an invalid instance identifier was passed to a DDEML function.a client's attempt to establish a conversation has failed.a memory allocation failed.a request for a synchronous advise transaction has timed out.a request for a synchronous data transaction has timed out.a request for a synchronous execute transaction has timed out.a request to end an advise transaction has timed out.a server-side transaction was attempted on a conversation that was terminated by the client, or the server terminated before completing a transaction.a transaction failed.an internal call to the PostMessage function has failed. an internal error has occurred in the DDEML.an invalid transaction identifier was passed to a DDEML function. Once the application has returned from an XTYP_XACT_COMPLETE callback, the transaction identifier for that callback is no longer valid.attempt to change immutable key '%s' ignored.bad arguments to library functionbad signaturebinaryboldbuild %lucan't close file '%s'can't close file descriptor %dcan't commit changes to file '%s'can't create file '%s'can't delete user configuration file '%s'can't determine if the end of file is reached on descriptor %dcan't find length of file on file descriptor %dcan't find user's HOME, using current directory.can't flush file descriptor %dcan't get seek position on file descriptor %dcan't load any font, abortingcan't open file '%s'can't open global configuration file '%s'.can't open user configuration file '%s'.can't open user configuration file.can't read from file descriptor %dcan't remove file '%s'can't remove temporary file '%s'can't write buffer '%s' to disk.can't write to file descriptor %dcan't write user configuration file.checksum errorcompression errordatedecompression errordefaulteighteentheightheleventhentry '%s' appears more than once in group '%s'error in data formaterror opening filefailed to flush the file '%s'fifteenthfifthfilesfirstfont sizefourteenthfourthgenerate verbose log messagesimageinvalid message box return valueinvalid zip fileitalickeyboard keyAddkeyboard keyAlt+keyboard keyBackkeyboard keyCancelkeyboard keyDeletekeyboard keyDownkeyboard keyExecutekeyboard keyFkeyboard keyHelpkeyboard keyHomekeyboard keyInsertkeyboard keyKP_keyboard keyLeftkeyboard keyMenukeyboard keyPrintkeyboard keyRightkeyboard keySPECIALkeyboard keyUpkeyboard keyaltkeyboard keyctrlkeyboard keyshiftlightmacOS menu itemAbout %smacOS menu itemHide Othersmidnightnineteenthninthno DDE error.no errorno fonts found in %s, using builtin fontnonamenoonnormalnumobjects cannot have XML Text Nodesout of memoryread errorreading zip stream (entry %s): bad crcreading zip stream (entry %s): bad lengthreentrancy problem.secondseek errorseventeenthseventhshow this help messagesixteenthsixthspecify display mode to use (e.g. 640x480-16)specify the theme to usestandard/circlestandard/squarestrtenththe response to the transaction caused the DDE_FBUSY bit to be set.thirdthirteenthtodaytomorrowtranslator-creditstwelfthtwentiethunderlinedunexpected " at position %d in '%s'.unexpected end of fileunknownunknown class %sunknown errorunknown error (error code %08x).unknown-%dunnamedunnamed%dunsupported Zip compression methodusing catalog '%s' from '%s'.write errorwxGetTimeOfDay failed.wxWidgets could not open display for '%s': exiting.wxWidgets could not open display. Exiting.xxxxyesterdayzlib error %d~Project-Id-Version: wxWidgets 3.1 Report-Msgid-Bugs-To: PO-Revision-Date: 2012-08-07 13:31+0200 Last-Translator: Jani Kinnunen Language-Team: Finnish Language: fi MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1) Lähetä tämä ilmoitus ohjelman ylläpitäjälle, kiitos! Kiitos, ja olemme pahoillamme kaikista hankaluuksista! (virhe %ld: %s) - Esikatselu lihavoitu kursivoitu heikko yliviivaus#10 kirjekuori, 4 1/8″ x 9 1/2″#11 kirjekuori, 4 1/2″ x 10 3/8″#12 kirjekuori, 4 3/4″ x 11″#14 kirjekuori, 5″ x 11 1/2″#9 kirjekuori, 3 7/8″ x 8 7/8″%d / %lu%ld tavu%ld tavua%lu / %lu%s (tai %s)%s-virhe%s-tiedotus%s-varoitus%s ei mahtunut kohteen '%s' tar-otsakkeeseen%s-tiedostot (%s)|%s&Tietoja&Oikea koko&Kappaleen jälkeen:&Tasaus&Käytä&Käytä tyyliä&Järjestä kuvakkeet&Nouseva&Takaisin&Pohjautuu:&Ennen kappaletta:&Taustaväri:&Lihavoitu&Alaosa&Alaosa:&Luettelomerkkityyli:&Peruuta&Limitä&Solu&Merkkikoodi:&Tyhjennä&Sulje&Väri&Väri:&MuunnaK&opioi&Kopioi URL-osoite&Mukauta...&Ohjelmavirheilmoituksen esikatselu:&Poista&Poista tyyli...&Laskeva&Yksityiskohdat&Alas&Muokkaa&Muokkaa tyyliä...&Suorita&Tiedosto&Lopeta&Ensimmäinen&Liukuva tila:&Kirjasin&Kirjasinperhe:&Kirjasin tasolle...&Kirjasin:&Eteenpäin&Lähettäjä:&Kiintolevy&Korkeus:&Ohje&Piilota tiedot&Koti&Sisennys (millimetrin kymmenyksiä)&Indeksi&Tiedot&Kursivoitu&Hyppää kohteeseenTasattu&Viimeinen&Vasemmalle&Vasemmalle:&Luettelotaso:&Loki&Siirrä&Siirrä objekti kohteeseen:&Verkko&Uusi&Seuraava&Seuraava >&Seuraava kappale&Seuraava vihje&Uusi tyyli:&Ei&Huomiot:&Numero:&OK&Avaa...&Jäsennyksen taso:&SivunvaihtoL&iitä&KuvaK&irjasinkoko:&Sijainti (millimetrin kymmenyksiä):&Asetukset&Edellinen&Edellinen kappale&Tulosta...&Ominaisuudet&Poistu&Toista&Tee uudelleen &Nimeä tyyli uudelleen&Korvaa&Aloita numerointi uudelleen&Palauta&Oikealle&Oikealle:&Tallenna&Tiedot&Näytä vihjeet käynnistyksessä&Koko&Koko:Ohita&Riviväli (millimetrin kymmenyksiä)&Oikeinkirjoituksen tarkistus&Pysäytä&Yliviivaus&Tyyli:&Tyylit:&Osajoukko:&Symbolit:&Taulukko&Yläosa&Yläosa:&Alleviivaus&Alleviivaus:&Kumoa&Kumoa &Vähennä sisennystä&Ylös&Tasaus pystysuunnassa:&Näytä...&Paino:&Leveys:&Ikkuna&Kyllä”%s” sisältää ylimääräisen ”..”, ohitettu.”%s” ei ole oikea numeerinen arvo valitsimelle ”%s”.”%s” ei ole kelvollinen viestiluettelo.”%s” on todennäköisesti binääripuskuri.(*)(Ohje)(Ei mitään)(Tavallinen teksti)(kirjanmerkit)(ei mitään)**)+, 64-bittinen versio-...1.11.21.31.41.51.61.71.81.910″ x 11″10″ x 14″11″ x 17″12″ x 11″15″ x 11″26 3/4 kirjekuori, 3 5/8″ x 6 1/2″9″ x 11″: tiedostoa ei ole!: tuntematon merkistö: tuntematon koodaus< &Takaisin
TrustedQSL Library API
adif.h File Reference
#include "tqsllib.h"
#include <stdio.h>
#include <stdlib.h>

Go to the source code of this file.

Classes

struct  tqsl_adifFieldDefinitions
 
struct  tqsl_adifFieldResults
 

Macros

#define TQSL_ADIF_FIELD_NAME_LENGTH_MAX   64
 Max length of ADIF field.
 
#define TQSL_ADIF_FIELD_SIZE_LENGTH_MAX   10
 Max length of field name.
 
#define TQSL_ADIF_FIELD_TYPE_LENGTH_MAX   1
 Max length of field type.
 

Typedefs

typedef void * tQSL_ADIF
 Opaque ADIF type.
 

Enumerations

enum  TQSL_ADIF_BOOLEAN { TQSL_FALSE , TQSL_TRUE }
 
enum  TQSL_ADIF_RANGE_TYPE { TQSL_ADIF_RANGE_TYPE_NONE , TQSL_ADIF_RANGE_TYPE_MINMAX , TQSL_ADIF_RANGE_TYPE_ENUMERATION }
 Specifies the type of range limits to apply to a field.
 
enum  TQSL_ADIF_GET_FIELD_ERROR {
  TQSL_ADIF_GET_FIELD_SUCCESS , TQSL_ADIF_GET_FIELD_NO_NAME_MATCH , TQSL_ADIF_GET_FIELD_NO_TYPE_MATCH , TQSL_ADIF_GET_FIELD_NO_RANGE_MATCH ,
  TQSL_ADIF_GET_FIELD_NO_ENUMERATION_MATCH , TQSL_ADIF_GET_FIELD_NO_RESULT_ALLOCATION , TQSL_ADIF_GET_FIELD_NAME_LENGTH_OVERFLOW , TQSL_ADIF_GET_FIELD_DATA_LENGTH_OVERFLOW ,
  TQSL_ADIF_GET_FIELD_SIZE_OVERFLOW , TQSL_ADIF_GET_FIELD_TYPE_OVERFLOW , TQSL_ADIF_GET_FIELD_ERRONEOUS_STATE , TQSL_ADIF_GET_FIELD_EOF
}
 Response values returned from tqsl_getADIFField()
 

Functions

DLLEXPORT const char *CALLCONVENTION tqsl_adifGetError (TQSL_ADIF_GET_FIELD_ERROR status)
 
DLLEXPORT int CALLCONVENTION tqsl_beginADIF (tQSL_ADIF *adifp, const char *filename)
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFField (tQSL_ADIF adif, tqsl_adifFieldResults *field, TQSL_ADIF_GET_FIELD_ERROR *status, const tqsl_adifFieldDefinitions *adifFields, const char *const *typesDefined, unsigned char *(*allocator)(size_t))
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFLine (tQSL_ADIF adif, int *lineno)
 
DLLEXPORT int CALLCONVENTION tqsl_endADIF (tQSL_ADIF *adifp)
 
DLLEXPORT int CALLCONVENTION tqsl_adifMakeField (const char *fieldname, char type, const unsigned char *value, int len, unsigned char *buf, int buflen)
 
tqsl-2.8.1/src/doxygen/html/adif_8h_source.html0000644000175000017500000010165315003421124021461 0ustar rmurphyrmurphy TrustedQSL Library API: adif.h Source File
TrustedQSL Library API
adif.h
Go to the documentation of this file.
1/***************************************************************************
2 adif.h - description
3 -------------------
4 begin : Wed May 15 2002
5 copyright : (C) 2002 by ARRL
6 email : MSimcik@localhost.localdomain
7 revision : $Id$
8 ***************************************************************************/
9
10#ifndef __ADIF_H
11#define __ADIF_H
12
13#include "tqsllib.h"
14
15#include <stdio.h>
16#include <stdlib.h>
17
28#define TQSL_ADIF_FIELD_NAME_LENGTH_MAX 64
29#define TQSL_ADIF_FIELD_SIZE_LENGTH_MAX 10
30#define TQSL_ADIF_FIELD_TYPE_LENGTH_MAX 1
31
35#ifndef TQSL_ADIF_BOOLEAN
36typedef enum {
37 TQSL_FALSE,
38 TQSL_TRUE
40#endif
41
42typedef void * tQSL_ADIF;
43
45typedef enum {
46 TQSL_ADIF_RANGE_TYPE_NONE,
47 TQSL_ADIF_RANGE_TYPE_MINMAX,
48 TQSL_ADIF_RANGE_TYPE_ENUMERATION
50
52typedef enum {
53 TQSL_ADIF_GET_FIELD_SUCCESS,
54 TQSL_ADIF_GET_FIELD_NO_NAME_MATCH,
55 TQSL_ADIF_GET_FIELD_NO_TYPE_MATCH,
56 TQSL_ADIF_GET_FIELD_NO_RANGE_MATCH,
57 TQSL_ADIF_GET_FIELD_NO_ENUMERATION_MATCH,
58 TQSL_ADIF_GET_FIELD_NO_RESULT_ALLOCATION,
59 TQSL_ADIF_GET_FIELD_NAME_LENGTH_OVERFLOW,
60 TQSL_ADIF_GET_FIELD_DATA_LENGTH_OVERFLOW,
61 TQSL_ADIF_GET_FIELD_SIZE_OVERFLOW,
62 TQSL_ADIF_GET_FIELD_TYPE_OVERFLOW,
63 TQSL_ADIF_GET_FIELD_ERRONEOUS_STATE,
64 TQSL_ADIF_GET_FIELD_EOF
66
68typedef struct {
72 unsigned int max_length;
73 long signed min_value;
74 long signed max_value;
75 const char **enumStrings;
78
80typedef struct {
84 unsigned char *data;
85 unsigned int adifNameIndex;
87 int line_no;
89
90
91/* function prototypes */
92
93#ifdef __cplusplus
94extern "C" {
95#endif
96
99
101DLLEXPORT int CALLCONVENTION tqsl_beginADIF(tQSL_ADIF *adifp, const char *filename);
102
120 const tqsl_adifFieldDefinitions *adifFields, const char * const *typesDefined,
121 unsigned char *(*allocator)(size_t) );
122
125
128
134DLLEXPORT int CALLCONVENTION tqsl_adifMakeField(const char *fieldname, char type, const unsigned char *value, int len,
135 unsigned char *buf, int buflen);
136
137#ifdef __cplusplus
138}
139#endif
140
143#endif /* __ADIF_H */
void * tQSL_ADIF
Opaque ADIF type.
Definition: adif.h:42
TQSL_ADIF_BOOLEAN
Definition: adif.h:36
DLLEXPORT int CALLCONVENTION tqsl_getADIFLine(tQSL_ADIF adif, int *lineno)
DLLEXPORT int CALLCONVENTION tqsl_getADIFField(tQSL_ADIF adif, tqsl_adifFieldResults *field, TQSL_ADIF_GET_FIELD_ERROR *status, const tqsl_adifFieldDefinitions *adifFields, const char *const *typesDefined, unsigned char *(*allocator)(size_t))
TQSL_ADIF_GET_FIELD_ERROR
Response values returned from tqsl_getADIFField()
Definition: adif.h:52
#define TQSL_ADIF_FIELD_TYPE_LENGTH_MAX
Max length of field type.
Definition: adif.h:30
DLLEXPORT int CALLCONVENTION tqsl_beginADIF(tQSL_ADIF *adifp, const char *filename)
DLLEXPORT int CALLCONVENTION tqsl_endADIF(tQSL_ADIF *adifp)
#define TQSL_ADIF_FIELD_SIZE_LENGTH_MAX
Max length of field name.
Definition: adif.h:29
DLLEXPORT const char *CALLCONVENTION tqsl_adifGetError(TQSL_ADIF_GET_FIELD_ERROR status)
TQSL_ADIF_RANGE_TYPE
Specifies the type of range limits to apply to a field.
Definition: adif.h:45
#define TQSL_ADIF_FIELD_NAME_LENGTH_MAX
Max length of ADIF field.
Definition: adif.h:28
DLLEXPORT int CALLCONVENTION tqsl_adifMakeField(const char *fieldname, char type, const unsigned char *value, int len, unsigned char *buf, int buflen)
Definition: adif.h:68
unsigned int max_length
Max length.
Definition: adif.h:72
const char ** enumStrings
Enumerated values.
Definition: adif.h:75
void * userPointer
user pointer
Definition: adif.h:76
TQSL_ADIF_RANGE_TYPE rangeType
Range type.
Definition: adif.h:71
long signed max_value
Max value.
Definition: adif.h:74
long signed min_value
Min value.
Definition: adif.h:73
Definition: adif.h:80
int line_no
Input line where the tag was found.
Definition: adif.h:87
void * userPointer
User pointer.
Definition: adif.h:86
unsigned char * data
data
Definition: adif.h:84
unsigned int adifNameIndex
Name index.
Definition: adif.h:85
#define CALLCONVENTION
Symbol exports - Windows only.
Definition: tqsllib.h:27
#define DLLEXPORT
Symbol exports - Windows only.
Definition: tqsllib.h:25
tqsl-2.8.1/src/doxygen/html/annotated.html0000644000175000017500000001032715003421124020551 0ustar rmurphyrmurphy TrustedQSL Library API: Class List
TrustedQSL Library API
Class List
Here are the classes, structs, unions and interfaces with brief descriptions:
tqsl-2.8.1/src/doxygen/html/arrowdown.png0000644000175000017500000000036615003421124020440 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATx!NA\ Um@`5i`h W7] b&ofdY4 c 3v=]\B I=BB;k WN@vy4]Y|M}]x6a }dׇY>||5?>|B"'IENDB`tqsl-2.8.1/src/doxygen/html/arrowright.png0000644000175000017500000000034515003421124020603 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATx=QFDk:FPK؃=V@ճ 8SHx0bnrr{򽿾$ TP XOd6"SOB(Q)+YĈ ҪR>Vtsm9(k-@ȧ-$ b [he Kp-l|CApRG'rͭaIENDB`tqsl-2.8.1/src/doxygen/html/bc_s.png0000644000175000017500000000124415003421124017320 0ustar rmurphyrmurphyPNG  IHDR_ kIDATxkQϝ̤I&m&156*nąܸR,4 +H(Ub1J.(EmߏhJmKS'C(х & r3g(z&_9}՟@mu ` h`ԯ &~M4%3?h)\Yi>Jb @giވkg\轭EUv+?E"pB\Y&$vM+Dn)}:Xo 3گ'.f0u9Ljf6%3Gf#sm(,k*ʒJJˢou_~ r]%%mnu]zr5[ưXeIb+J-XBP u#q7 ntV@ӂ- q#3? 7;gwXA~*gm,.7'oN<2 .#umx^Xzdis=1SryTY}ŧUKm߼ĘpHL穨`nbOMgVAr kAOopGOOE>PnN,=P+ Kch` ^ލnIENDB`tqsl-2.8.1/src/doxygen/html/cabrillo_8h.html0000644000175000017500000003344715003421124020772 0ustar rmurphyrmurphy TrustedQSL Library API: cabrillo.h File Reference
TrustedQSL Library API
cabrillo.h File Reference
#include "tqsllib.h"

Go to the source code of this file.

Classes

struct  tqsl_cabrilloField
 

Macros

#define CLIENT_STATIC   static
 Static linkage.
 
#define TQSL_CABRILLO_MAX_FIELDS   12
 Max field count.
 
#define TQSL_CABRILLO_FIELD_NAME_LENGTH_MAX   64
 Max field name length.
 
#define TQSL_CABRILLO_FIELD_VALUE_LENGTH_MAX   40
 Max field value length.
 
#define TQSL_MIN_CABRILLO_MAP_FIELD   5
 First possible call-worked field.
 
#define TQSL_DEF_CABRILLO_MAP_FIELD   8
 Default call-worked field.
 

Typedefs

typedef void * tQSL_Cabrillo
 Opaque cabrillo log type.
 

Enumerations

enum  TQSL_CABRILLO_ERROR_TYPE {
  TQSL_CABRILLO_NO_ERROR , TQSL_CABRILLO_EOF , TQSL_CABRILLO_NO_START_RECORD , TQSL_CABRILLO_NO_CONTEST_RECORD ,
  TQSL_CABRILLO_UNKNOWN_CONTEST , TQSL_CABRILLO_BAD_FIELD_DATA , TQSL_CABRILLO_EOR
}
 Cabrillo status values.
 
enum  TQSL_CABRILLO_FREQ_TYPE { TQSL_CABRILLO_HF , TQSL_CABRILLO_VHF , TQSL_CABRILLO_UNKNOWN }
 

Functions

DLLEXPORT const char *CALLCONVENTION tqsl_cabrilloGetError (TQSL_CABRILLO_ERROR_TYPE err)
 
DLLEXPORT int CALLCONVENTION tqsl_beginCabrillo (tQSL_Cabrillo *cabp, const char *filename)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloContest (tQSL_Cabrillo cab, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloFreqType (tQSL_Cabrillo cab, TQSL_CABRILLO_FREQ_TYPE *type)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloLine (tQSL_Cabrillo cab, int *lineno)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getCabrilloRecordText (tQSL_Cabrillo cab)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloField (tQSL_Cabrillo cab, tqsl_cabrilloField *field, TQSL_CABRILLO_ERROR_TYPE *err)
 
DLLEXPORT int CALLCONVENTION tqsl_endCabrillo (tQSL_Cabrillo *cabp)
 
tqsl-2.8.1/src/doxygen/html/cabrillo_8h_source.html0000644000175000017500000005723015003421124022346 0ustar rmurphyrmurphy TrustedQSL Library API: cabrillo.h Source File
TrustedQSL Library API
cabrillo.h
Go to the documentation of this file.
1/***************************************************************************
2 cabrillo.h - description
3 -------------------
4 begin : Thu Dec 5 2002
5 copyright : (C) 2002 by ARRL
6 author : Jon Bloom
7 email : jbloom@arrl.org
8 revision : $Id$
9 ***************************************************************************/
10
11#ifndef __CABRILLO_H
12#define __CABRILLO_H
13
14#include "tqsllib.h"
15
16#undef CLIENT_STATIC
17#ifndef LOTW_SERVER
18#define CLIENT_STATIC static
19#else
20#define CLIENT_STATIC
21#endif
22
35#define TQSL_CABRILLO_MAX_FIELDS 12
36#define TQSL_CABRILLO_FIELD_NAME_LENGTH_MAX 64
37#define TQSL_CABRILLO_FIELD_VALUE_LENGTH_MAX 40
38
40typedef enum {
41 TQSL_CABRILLO_NO_ERROR,
42 TQSL_CABRILLO_EOF,
43 TQSL_CABRILLO_NO_START_RECORD,
44 TQSL_CABRILLO_NO_CONTEST_RECORD,
45 TQSL_CABRILLO_UNKNOWN_CONTEST,
46 TQSL_CABRILLO_BAD_FIELD_DATA,
47 TQSL_CABRILLO_EOR,
49
53typedef enum {
54 TQSL_CABRILLO_HF,
55 TQSL_CABRILLO_VHF,
56 TQSL_CABRILLO_UNKNOWN,
58
59// Minimum field number for callsign and default field number
60// For VHF, default should be 7.
61#define TQSL_MIN_CABRILLO_MAP_FIELD 5
62#define TQSL_DEF_CABRILLO_MAP_FIELD 8
63
69typedef struct {
73
74typedef void * tQSL_Cabrillo;
75
76#ifdef __cplusplus
77extern "C" {
78#endif
79
82
85
88
91
94
97
107
110
111#ifdef __cplusplus
112}
113#endif
114
117#endif // __CABRILLO_H
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloLine(tQSL_Cabrillo cab, int *lineno)
DLLEXPORT const char *CALLCONVENTION tqsl_cabrilloGetError(TQSL_CABRILLO_ERROR_TYPE err)
TQSL_CABRILLO_ERROR_TYPE
Cabrillo status values.
Definition: cabrillo.h:40
#define TQSL_CABRILLO_FIELD_VALUE_LENGTH_MAX
Max field value length.
Definition: cabrillo.h:37
DLLEXPORT int CALLCONVENTION tqsl_beginCabrillo(tQSL_Cabrillo *cabp, const char *filename)
TQSL_CABRILLO_FREQ_TYPE
Definition: cabrillo.h:53
DLLEXPORT int CALLCONVENTION tqsl_endCabrillo(tQSL_Cabrillo *cabp)
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloFreqType(tQSL_Cabrillo cab, TQSL_CABRILLO_FREQ_TYPE *type)
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloContest(tQSL_Cabrillo cab, char *buf, int bufsiz)
#define TQSL_CABRILLO_FIELD_NAME_LENGTH_MAX
Max field name length.
Definition: cabrillo.h:36
void * tQSL_Cabrillo
Opaque cabrillo log type.
Definition: cabrillo.h:74
DLLEXPORT const char *CALLCONVENTION tqsl_getCabrilloRecordText(tQSL_Cabrillo cab)
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloField(tQSL_Cabrillo cab, tqsl_cabrilloField *field, TQSL_CABRILLO_ERROR_TYPE *err)
Definition: cabrillo.h:69
#define CALLCONVENTION
Symbol exports - Windows only.
Definition: tqsllib.h:27
#define DLLEXPORT
Symbol exports - Windows only.
Definition: tqsllib.h:25
tqsl-2.8.1/src/doxygen/html/classes.html0000644000175000017500000000524715003421124020236 0ustar rmurphyrmurphy TrustedQSL Library API: Class Index
TrustedQSL Library API
Class Index
tqsl-2.8.1/src/doxygen/html/closed.png0000644000175000017500000000020415003421124017656 0ustar rmurphyrmurphyPNG  IHDR KIDATxm @!Gk7-`&sts@k}2 P%_N .:0Dk›x" ֛)x5IENDB`tqsl-2.8.1/src/doxygen/html/doc.png0000644000175000017500000000135215003421124017157 0ustar rmurphyrmurphyPNG  IHDR}\IDATxMOS[sa?-XZ(PD4 AWbu`b 77wHFCԁ/`voAPqP@ 980 +y^Z9SW\83g3'Nçl_bpV"ֆXd]3xM[1W *PGz/Eg{ aoV:这1$RW,@56-,m/蹖 r5T*S(Vf89u գwa=<{ҡUr+dDF$`zNܮ0Q3~_^N=vpTLT}kqm<?ZhX_ݥ[) `ga_*2`'=F2EP l=8Wv%THqɿ<"GxH{#֫aJmKsVءM^ T ݛr߽m_?Wİ#uIENDB`tqsl-2.8.1/src/doxygen/html/docd.png0000644000175000017500000000136415003421124017326 0ustar rmurphyrmurphyPNG  IHDR}\IDATxMLSYB[l7 aT` $(hJXftYh4NWJq@L!A[h=玘ދ`7IN}94aK\@)6d2ǥ >FSŧ;){nv SS%t_],&qj*7/b}> SUcP6 ͡H7 ({dlڝ'"3ġd; 7Rh]gn5j*b)(6CDn,׊X;5B\729K+ f(Ém8_3x\unM W'/çyiz+߼)nȫYY<bxI!Ճ@-ws%"#]'*9RBˑ/9"|??o+L:,ΌSV@EuE[4.lj*2Tå_r8DU8Wj0ҁ|gdl2kq0BMbh4OᠼG/az;#Dϴqڪ|vBR k/gA`zrܘ\l2ctX TQ] S ̿{H?^qU#nBĥSiJi2 F88FlIENDB`tqsl-2.8.1/src/doxygen/html/doxygen.png0000644000175000017500000000730315003421124020071 0ustar rmurphyrmurphyPNG  IHDRh ;IDATx]y\պ~45%TL QPE"q11]8aw*(*" z`8 m,p$%B(8k6lk[߷;?kPx'tz3_Q4g@m ci{~4:Hc'PP7^h zbcP 3}OqNkT(?d ~z<4ǡ؞vz٦Zd,6k]Fz< Zs?sU2Sw1c`[}%ѽ.Լ6BLZ!F8[ T #g]:vu?vbR?wgb$kF~;عƕX?lNʪ,HCgAzlӺg ]jM3oҳ'=$f}GS_co.ȹ:ds:1={9?zqviDp moaEqҵw}~{j{ºFNë[OqOSXO]>muľe5{Jկ(bl}`UyacCAklysA7oJ .Be. Z'-PyF.lp&.j7rez19HG%qz׈c_k_")HJn~֘5 q5#+9T Rܸrzϴ̝ =υ{áOfwg|/$;֙ƭ]W"/< DఽB}yIEc^=[VhM$l];Kr¦* t$]M;I1!M (f<5~z mՠ>کIz;u[ie^ӳNF6B\}7+,'a -yHY,^f~?Hc{Z+4\sٷnߣFơsغD?<vkx0MlذIxdEEAMg*YE7ۙ^[uv[wG=Edn׶l'pGk+C82 dz3H BS[wŘ ~xptmţiQ歉AB1fى4uI]6% 1t.NJphz̠R1"3-"&1[:N mW0_œ 6&)ꦬ}~{m]zMP~^:eQT_*798ˍ 347E¿uSɻU_ NWeNӏ|;;d"ȉ޵ᆴ"ĴMM+bY_E]PXKНIޥoE<_(EP|m,өZߺk,kM`jzeU t36˷r}w:Χ |TܵQK_pໃYd0!a –W$$/\$ 2mLH dHV,:RZJaz*>_NT(‚^SVFU8E܈nd;8\C]=m:bDd=ߞUU5O|]Pv\]2"y[yzg{Y{Ù5;w{N3nĨwKݭ29Id y)P8ũ@mPwjl,6 hWd ump.DžtwR xBδYcxg*vo y򑕓[?V0NO난~󒯷h#Hk8kӍ^q@]ӓ,56-κUn[>]@nϜp[6# 4tn:}8T9_Y$/GK(ђM`dѺ;OB &P{qhJ+閧l2M_1ӫtlya L^y.۽[ u/]iS}N>e1qjf&iT\=kϛX-.84V5u!TE .OH4zwTr. xքHHg hT$yqzp< qrwI]I鲘s":ՖbզL69VW<;3?M3AV#ޯKUr9!qtH+6V/TS^pqgLP'5E ޺ n"2|;W"֬TwtO' +W+Z̖<&nO,I06.Z.h*INڒOegBXZ9hDSʍ A/c`A"z|ş;H#|%OOD mcƤqmu&~n πZj =_n[nN$_bE)8?6l}#bW( d-p&a"9ņ$ڛA!;{~8ޣ10`#kuN Qbh 8Mawhq(bK Z%m֍(J)@> 7% {y ohf>{p.­_%glZ\B2B #Һphݚ[<#SpA7Ht4:|gtL*($Ʃ$;b`=MM5ǾHH.HeA5}rd)T};Q5i2O00;,냔}g]79_{C>h{.II?[Kswz6u;OJa˶zvd l舊yc'rTWӰL |ʽhB T'ò]K(=Kx  L,Pʵu׈ž1ݫ;pGDxZY kf676oھH~޸ 8Up6(? K+?%ݷ/19U?B)l @=ޞkIENDB`tqsl-2.8.1/src/doxygen/html/doxygen.svg0000644000175000017500000003602615003421124020110 0ustar rmurphyrmurphy tqsl-2.8.1/src/doxygen/html/dynsections.js0000644000175000017500000001070115003421124020602 0ustar rmurphyrmurphy/* @licstart The following is the entire license notice for the JavaScript code in this file. The MIT License (MIT) Copyright (C) 1997-2020 by Dimitri van Heesch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @licend The above is the entire license notice for the JavaScript code in this file */ function toggleVisibility(linkObj) { var base = $(linkObj).attr('id'); var summary = $('#'+base+'-summary'); var content = $('#'+base+'-content'); var trigger = $('#'+base+'-trigger'); var src=$(trigger).attr('src'); if (content.is(':visible')===true) { content.hide(); summary.show(); $(linkObj).addClass('closed').removeClass('opened'); $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); } else { content.show(); summary.hide(); $(linkObj).removeClass('closed').addClass('opened'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); } return false; } function updateStripes() { $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); $('table.directory tr'). removeClass('odd').filter(':visible:odd').addClass('odd'); } function toggleLevel(level) { $('table.directory tr').each(function() { var l = this.id.split('_').length-1; var i = $('#img'+this.id.substring(3)); var a = $('#arr'+this.id.substring(3)); if (l TrustedQSL Library API: File List
TrustedQSL Library API
File List
Here is a list of all documented files with brief descriptions:
tqsl-2.8.1/src/doxygen/html/folderclosed.png0000644000175000017500000000115015003421124021053 0ustar rmurphyrmurphyPNG  IHDR}\/IDATx]MO@~uؐlp]#]PYEC\9y`xC &=qvZv3m؃vLN}}ޝZA@n ONp xKxj8s _[D'yye+ 7#rNlk* 0Ь_d_(Öz=xvhzP-䍒̪u$\DJcB4.:Ϗ-}LE #gN;B6䬜@p&h>p9EEάʑ"un$R"?{<%PNt$߶+^<"2Dqq\ҙaA"ԵP}#Ez{.8i p(ADwDE߂z;Kק8t q:uvvݛvEn{MFXgfZ֝*ߩ:jYq#3SWr'  IENDB`tqsl-2.8.1/src/doxygen/html/folderopen.png0000644000175000017500000000112515003421124020545 0ustar rmurphyrmurphyPNG  IHDR}\IDATx]?oP9i4i;iiZ7`b٬,HU'$*T]TDP6w};C; aӝߟjAInS}9Hӎ|? =_Ɗue*;YEsYBėsٌ ɫYq !Gǿv̇خ F}qb]70)d-}PfY{4@}2ԗNIǃc%UImcƝ>xt9$ OVE*Û#׈r@l$PrHaa dZrqIoT\,tj2FAxv-Lp׌p TI/ \sf; jViTo^cpb]€<a՜y9:+,E f6NEKU}^;nZuUS4 ѬbN.kjT% iV )GJ@TxIENDB`tqsl-2.8.1/src/doxygen/html/ftv2blank.png0000644000175000017500000000012615003421124020301 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`tqsl-2.8.1/src/doxygen/html/ftv2cl.png0000644000175000017500000000070515003421124017613 0ustar rmurphyrmurphyPNG  IHDR}\IDATx;H#Ao4ႇK ,m vڞJ XY B|drcvoİ 0Ò3ͤe״1X8nQ88֧3*rb-$P1@Z-#011HkK wO@!fuc;sB[EA\>]Pzf| +g5b i5mM_q,cod!,{Y,zT8H]𤕘7/8Q!F~6?Y A@Ũ.@TYr8*>?e[6xIENDB`tqsl-2.8.1/src/doxygen/html/ftv2doc.png0000644000175000017500000000135215003421124017761 0ustar rmurphyrmurphyPNG  IHDR}\IDATxMOS[sa?-XZ(PD4 AWbu`b 77wHFCԁ/`voAPqP@ 980 +y^Z9SW\83g3'Nçl_bpV"ֆXd]3xM[1W *PGz/Eg{ aoV:这1$RW,@56-,m/蹖 r5T*S(Vf89u գwa=<{ҡUr+dDF$`zNܮ0Q3~_^N=vpTLT}kqm<?ZhX_ݥ[) `ga_*2`'=F2EP l=8Wv%THqɿ<"GxH{#֫aJmKsVءM^ T ݛr߽m_?Wİ#uIENDB`tqsl-2.8.1/src/doxygen/html/ftv2folderclosed.png0000644000175000017500000000115015003421124021655 0ustar rmurphyrmurphyPNG  IHDR}\/IDATx]MO@~uؐlp]#]PYEC\9y`xC &=qvZv3m؃vLN}}ޝZA@n ONp xKxj8s _[D'yye+ 7#rNlk* 0Ь_d_(Öz=xvhzP-䍒̪u$\DJcB4.:Ϗ-}LE #gN;B6䬜@p&h>p9EEάʑ"un$R"?{<%PNt$߶+^<"2Dqq\ҙaA"ԵP}#Ez{.8i p(ADwDE߂z;Kק8t q:uvvݛvEn{MFXgfZ֝*ߩ:jYq#3SWr'  IENDB`tqsl-2.8.1/src/doxygen/html/ftv2folderopen.png0000644000175000017500000000112515003421124021347 0ustar rmurphyrmurphyPNG  IHDR}\IDATx]?oP9i4i;iiZ7`b٬,HU'$*T]TDP6w};C; aӝߟjAInS}9Hӎ|? =_Ɗue*;YEsYBėsٌ ɫYq !Gǿv̇خ F}qb]70)d-}PfY{4@}2ԗNIǃc%UImcƝ>xt9$ OVE*Û#׈r@l$PrHaa dZrqIoT\,tj2FAxv-Lp׌p TI/ \sf; jViTo^cpb]€<a՜y9:+,E f6NEKU}^;nZuUS4 ѬbN.kjT% iV )GJ@TxIENDB`tqsl-2.8.1/src/doxygen/html/ftv2lastnode.png0000644000175000017500000000012615003421124021023 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`tqsl-2.8.1/src/doxygen/html/ftv2link.png0000644000175000017500000000135215003421124020151 0ustar rmurphyrmurphyPNG  IHDR}\IDATxMOS[sa?-XZ(PD4 AWbu`b 77wHFCԁ/`voAPqP@ 980 +y^Z9SW\83g3'Nçl_bpV"ֆXd]3xM[1W *PGz/Eg{ aoV:这1$RW,@56-,m/蹖 r5T*S(Vf89u գwa=<{ҡUr+dDF$`zNܮ0Q3~_^N=vpTLT}kqm<?ZhX_ݥ[) `ga_*2`'=F2EP l=8Wv%THqɿ<"GxH{#֫aJmKsVءM^ T ݛr߽m_?Wİ#uIENDB`tqsl-2.8.1/src/doxygen/html/ftv2mlastnode.png0000644000175000017500000000036615003421124021206 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATx!NA\ Um@`5i`h W7] b&ofdY4 c 3v=]\B I=BB;k WN@vy4]Y|M}]x6a }dׇY>||5?>|B"'IENDB`tqsl-2.8.1/src/doxygen/html/ftv2mnode.png0000644000175000017500000000036615003421124020322 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATx!NA\ Um@`5i`h W7] b&ofdY4 c 3v=]\B I=BB;k WN@vy4]Y|M}]x6a }dׇY>||5?>|B"'IENDB`tqsl-2.8.1/src/doxygen/html/ftv2mo.png0000644000175000017500000000062315003421124017627 0ustar rmurphyrmurphyPNG  IHDR}\ZIDATx1K@iBҡ(h"EI'oک 8R- BTP]zB3 _㒻}]V}dIiJb+|K…,[P\ʘMƢ#F`JݤkA?Y4ck6"Z)0SHM@㋺Wmo4HJ+Qobt *~8_+3Y- PwA+^}+xhϕMAE]TD~EÞߴ^R)`A9pq-۾ۍ3tƛTH) ICxd#1 m@V?Zgo_3-\IENDB`tqsl-2.8.1/src/doxygen/html/ftv2node.png0000644000175000017500000000012615003421124020137 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`tqsl-2.8.1/src/doxygen/html/ftv2ns.png0000644000175000017500000000060415003421124017633 0ustar rmurphyrmurphyPNG  IHDR}\KIDATx1K1 G⁂n lE(nࢋMA@ tK%ܕ ]BI%uͅa,e v祫i\tun0oV\$G.&@Y=%$um6'߫9Q\b)0-ZTH`pcsm 5:>ަI F] jgo[ on Ԭvq?\ 6Tee lQ c3*dWTM\rh61F fIENDB`tqsl-2.8.1/src/doxygen/html/ftv2plastnode.png0000644000175000017500000000034515003421124021206 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATx=QFDk:FPK؃=V@ճ 8SHx0bnrr{򽿾$ TP XOd6"SOB(Q)+YĈ ҪR>Vtsm9(k-@ȧ-$ b [he Kp-l|CApRG'rͭaIENDB`tqsl-2.8.1/src/doxygen/html/ftv2pnode.png0000644000175000017500000000034515003421124020322 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATx=QFDk:FPK؃=V@ճ 8SHx0bnrr{򽿾$ TP XOd6"SOB(Q)+YĈ ҪR>Vtsm9(k-@ȧ-$ b [he Kp-l|CApRG'rͭaIENDB`tqsl-2.8.1/src/doxygen/html/ftv2splitbar.png0000644000175000017500000000047215003421124021036 0ustar rmurphyrmurphyPNG  IHDRMIDATxݡJCa( %4 bȘͶ3v^EL ,b;{Ï/aYկq:\IIIIIIIIIIIIIIIIII-l揊_t/ϻYQVYivk_ۣI@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$C[V=[fIENDB`tqsl-2.8.1/src/doxygen/html/ftv2vertline.png0000644000175000017500000000012615003421124021042 0ustar rmurphyrmurphyPNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`tqsl-2.8.1/src/doxygen/html/functions.html0000644000175000017500000003076215003421124020611 0ustar rmurphyrmurphy TrustedQSL Library API: Class Members
TrustedQSL Library API
Here is a list of all documented class members with links to the class documentation for each member:

- a -

- b -

- c -

- d -

- e -

- f -

- h -

- l -

- m -

- n -

- o -

- p -

- q -

- r -

- s -

- t -

- u -

- v -

- y -

tqsl-2.8.1/src/doxygen/html/functions_vars.html0000644000175000017500000003060215003421124021635 0ustar rmurphyrmurphy TrustedQSL Library API: Class Members - Variables
TrustedQSL Library API
 

- a -

- b -

- c -

- d -

- e -

- f -

- h -

- l -

- m -

- n -

- o -

- p -

- q -

- r -

- s -

- t -

- u -

- v -

- y -

tqsl-2.8.1/src/doxygen/html/globals.html0000644000175000017500000000421715003421124020220 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
Here is a list of all documented file members with links to the documentation:

- c -

tqsl-2.8.1/src/doxygen/html/globals_0x64.html0000644000175000017500000000603715003421124021003 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
Here is a list of all documented file members with links to the documentation:

- d -

tqsl-2.8.1/src/doxygen/html/globals_0x74.html0000644000175000017500000011175415003421124021007 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
Here is a list of all documented file members with links to the documentation:

- t -

tqsl-2.8.1/src/doxygen/html/globals_d.html0000644000175000017500000000421015003421124020514 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
Here is a list of all documented file members with links to the documentation:

- d -

tqsl-2.8.1/src/doxygen/html/globals_defs.html0000644000175000017500000004077515003421124021232 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
 

- c -

- d -

- p -

- t -

tqsl-2.8.1/src/doxygen/html/globals_enum.html0000644000175000017500000000462315003421124021245 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
 
tqsl-2.8.1/src/doxygen/html/globals_eval.html0000644000175000017500000000563715003421124021236 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
 
tqsl-2.8.1/src/doxygen/html/globals_func.html0000644000175000017500000007042215003421124021234 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
 

- t -

tqsl-2.8.1/src/doxygen/html/globals_p.html0000644000175000017500000000401715003421124020535 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
Here is a list of all documented file members with links to the documentation:

- p -

tqsl-2.8.1/src/doxygen/html/globals_t.html0000644000175000017500000013232215003421124020542 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
Here is a list of all documented file members with links to the documentation:

- t -

tqsl-2.8.1/src/doxygen/html/globals_type.html0000644000175000017500000000532215003421124021257 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
 
tqsl-2.8.1/src/doxygen/html/globals_vars.html0000644000175000017500000000611015003421124021245 0ustar rmurphyrmurphy TrustedQSL Library API: File Members
TrustedQSL Library API
 
tqsl-2.8.1/src/doxygen/html/group__ADIF.html0000644000175000017500000005511315003421124020654 0ustar rmurphyrmurphy TrustedQSL Library API: ADIF API
TrustedQSL Library API

Classes

struct  tqsl_adifFieldDefinitions
 
struct  tqsl_adifFieldResults
 

Macros

#define TQSL_ADIF_FIELD_NAME_LENGTH_MAX   64
 Max length of ADIF field.
 
#define TQSL_ADIF_FIELD_SIZE_LENGTH_MAX   10
 Max length of field name.
 
#define TQSL_ADIF_FIELD_TYPE_LENGTH_MAX   1
 Max length of field type.
 

Typedefs

typedef void * tQSL_ADIF
 Opaque ADIF type.
 

Enumerations

enum  TQSL_ADIF_BOOLEAN { TQSL_FALSE , TQSL_TRUE }
 
enum  TQSL_ADIF_RANGE_TYPE { TQSL_ADIF_RANGE_TYPE_NONE , TQSL_ADIF_RANGE_TYPE_MINMAX , TQSL_ADIF_RANGE_TYPE_ENUMERATION }
 Specifies the type of range limits to apply to a field.
 
enum  TQSL_ADIF_GET_FIELD_ERROR {
  TQSL_ADIF_GET_FIELD_SUCCESS , TQSL_ADIF_GET_FIELD_NO_NAME_MATCH , TQSL_ADIF_GET_FIELD_NO_TYPE_MATCH , TQSL_ADIF_GET_FIELD_NO_RANGE_MATCH ,
  TQSL_ADIF_GET_FIELD_NO_ENUMERATION_MATCH , TQSL_ADIF_GET_FIELD_NO_RESULT_ALLOCATION , TQSL_ADIF_GET_FIELD_NAME_LENGTH_OVERFLOW , TQSL_ADIF_GET_FIELD_DATA_LENGTH_OVERFLOW ,
  TQSL_ADIF_GET_FIELD_SIZE_OVERFLOW , TQSL_ADIF_GET_FIELD_TYPE_OVERFLOW , TQSL_ADIF_GET_FIELD_ERRONEOUS_STATE , TQSL_ADIF_GET_FIELD_EOF
}
 Response values returned from tqsl_getADIFField()
 

Functions

DLLEXPORT const char *CALLCONVENTION tqsl_adifGetError (TQSL_ADIF_GET_FIELD_ERROR status)
 
DLLEXPORT int CALLCONVENTION tqsl_beginADIF (tQSL_ADIF *adifp, const char *filename)
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFField (tQSL_ADIF adif, tqsl_adifFieldResults *field, TQSL_ADIF_GET_FIELD_ERROR *status, const tqsl_adifFieldDefinitions *adifFields, const char *const *typesDefined, unsigned char *(*allocator)(size_t))
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFLine (tQSL_ADIF adif, int *lineno)
 
DLLEXPORT int CALLCONVENTION tqsl_endADIF (tQSL_ADIF *adifp)
 
DLLEXPORT int CALLCONVENTION tqsl_adifMakeField (const char *fieldname, char type, const unsigned char *value, int len, unsigned char *buf, int buflen)
 

Detailed Description

These functions and data structures provide a means of parsing an ADIF file into its component fields, along with range-checking the field contents.

Enumeration Type Documentation

◆ TQSL_ADIF_BOOLEAN

Boolean type - TRUE/FALSE

Function Documentation

◆ tqsl_adifGetError()

DLLEXPORT const char *CALLCONVENTION tqsl_adifGetError ( TQSL_ADIF_GET_FIELD_ERROR  status)

Get the ADIF error message that corresponds to a particular error value

◆ tqsl_adifMakeField()

DLLEXPORT int CALLCONVENTION tqsl_adifMakeField ( const char *  fieldname,
char  type,
const unsigned char *  value,
int  len,
unsigned char *  buf,
int  buflen 
)

Form an ADIF field string.

N.B. On systems that distinguish text-mode files from binary-mode files, notably Windows, the text should be written in binary mode.

◆ tqsl_beginADIF()

DLLEXPORT int CALLCONVENTION tqsl_beginADIF ( tQSL_ADIF adifp,
const char *  filename 
)

Initialize an ADIF file for reading

◆ tqsl_endADIF()

DLLEXPORT int CALLCONVENTION tqsl_endADIF ( tQSL_ADIF adifp)

End and release an ADIF file

◆ tqsl_getADIFField()

DLLEXPORT int CALLCONVENTION tqsl_getADIFField ( tQSL_ADIF  adif,
tqsl_adifFieldResults field,
TQSL_ADIF_GET_FIELD_ERROR status,
const tqsl_adifFieldDefinitions adifFields,
const char *const *  typesDefined,
unsigned char *(*)(size_t)  allocator 
)

Get the next field from an ADIF file

  • adif - ADIF handle returned from tqsl_beginADIF()
  • field - pointer to struct that contains the field data and description
  • status - pointer to returned status variable
  • adifFields - pointer to an array of field-definition structures. The last item in the array should have an empty string as its name member.
  • typesDefined - pointer to an array of char pointers that define the allowed field-type strings. The last item in the array should point to an empty string.
  • allocator - pointer to a function that returns a pointer to a memory block of the specified size. This function will be called at most one time during a call to tqsl_getADIFField. The returned pointer will then be used to populate the data member of field. The caller is responsible for freeing this memory, if needed.

◆ tqsl_getADIFLine()

DLLEXPORT int CALLCONVENTION tqsl_getADIFLine ( tQSL_ADIF  adif,
int *  lineno 
)

Get the current line number (starting from 1) of the input file

tqsl-2.8.1/src/doxygen/html/group__Cabrillo.html0000644000175000017500000006021715003421124021701 0ustar rmurphyrmurphy TrustedQSL Library API: Cabrillo API
TrustedQSL Library API

Classes

struct  tqsl_cabrilloField
 

Macros

#define TQSL_CABRILLO_MAX_FIELDS   12
 Max field count.
 
#define TQSL_CABRILLO_FIELD_NAME_LENGTH_MAX   64
 Max field name length.
 
#define TQSL_CABRILLO_FIELD_VALUE_LENGTH_MAX   40
 Max field value length.
 
#define TQSL_MIN_CABRILLO_MAP_FIELD   5
 First possible call-worked field.
 
#define TQSL_DEF_CABRILLO_MAP_FIELD   8
 Default call-worked field.
 

Typedefs

typedef void * tQSL_Cabrillo
 Opaque cabrillo log type.
 

Enumerations

enum  TQSL_CABRILLO_ERROR_TYPE {
  TQSL_CABRILLO_NO_ERROR , TQSL_CABRILLO_EOF , TQSL_CABRILLO_NO_START_RECORD , TQSL_CABRILLO_NO_CONTEST_RECORD ,
  TQSL_CABRILLO_UNKNOWN_CONTEST , TQSL_CABRILLO_BAD_FIELD_DATA , TQSL_CABRILLO_EOR
}
 Cabrillo status values.
 
enum  TQSL_CABRILLO_FREQ_TYPE { TQSL_CABRILLO_HF , TQSL_CABRILLO_VHF , TQSL_CABRILLO_UNKNOWN }
 

Functions

DLLEXPORT const char *CALLCONVENTION tqsl_cabrilloGetError (TQSL_CABRILLO_ERROR_TYPE err)
 
DLLEXPORT int CALLCONVENTION tqsl_beginCabrillo (tQSL_Cabrillo *cabp, const char *filename)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloContest (tQSL_Cabrillo cab, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloFreqType (tQSL_Cabrillo cab, TQSL_CABRILLO_FREQ_TYPE *type)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloLine (tQSL_Cabrillo cab, int *lineno)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getCabrilloRecordText (tQSL_Cabrillo cab)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloField (tQSL_Cabrillo cab, tqsl_cabrilloField *field, TQSL_CABRILLO_ERROR_TYPE *err)
 
DLLEXPORT int CALLCONVENTION tqsl_endCabrillo (tQSL_Cabrillo *cabp)
 

Detailed Description

These functions and data structures provide a means of parsing a Cabrillo file into its component fields.

For convenience, the returned fields are identified using field names from the ADIF specification.

Enumeration Type Documentation

◆ TQSL_CABRILLO_FREQ_TYPE

Frequency type: HF, VHF, or UNKNOWN

Function Documentation

◆ tqsl_beginCabrillo()

DLLEXPORT int CALLCONVENTION tqsl_beginCabrillo ( tQSL_Cabrillo cabp,
const char *  filename 
)

Initialize a Cabrillo file for reading

◆ tqsl_cabrilloGetError()

DLLEXPORT const char *CALLCONVENTION tqsl_cabrilloGetError ( TQSL_CABRILLO_ERROR_TYPE  err)

Get the Cabrillo error message that corresponds to a particular error value

◆ tqsl_endCabrillo()

DLLEXPORT int CALLCONVENTION tqsl_endCabrillo ( tQSL_Cabrillo cabp)

Finish reading a Cabrillo file and release its resources

◆ tqsl_getCabrilloContest()

DLLEXPORT int CALLCONVENTION tqsl_getCabrilloContest ( tQSL_Cabrillo  cab,
char *  buf,
int  bufsiz 
)

Get the Contest name as specified in the Cabrillo CONTEST line

◆ tqsl_getCabrilloField()

DLLEXPORT int CALLCONVENTION tqsl_getCabrilloField ( tQSL_Cabrillo  cab,
tqsl_cabrilloField field,
TQSL_CABRILLO_ERROR_TYPE err 
)

Get the next field of the Cabrillo record

err is set to TQSL_CABRILLO_NO_ERROR or TQSL_CABRILLO_EOR (end-of-record) if field was populated with data. If err == TQSL_CABRILLO_EOR, this is the last field of the record.

err == TQSL_CABRILLO_EOF when there is no more data available.

◆ tqsl_getCabrilloFreqType()

DLLEXPORT int CALLCONVENTION tqsl_getCabrilloFreqType ( tQSL_Cabrillo  cab,
TQSL_CABRILLO_FREQ_TYPE type 
)

Get the Frequency type (HF or VHF) as determined by the contest

◆ tqsl_getCabrilloLine()

DLLEXPORT int CALLCONVENTION tqsl_getCabrilloLine ( tQSL_Cabrillo  cab,
int *  lineno 
)

Get the current line number (starting from 1) of the input file

◆ tqsl_getCabrilloRecordText()

DLLEXPORT const char *CALLCONVENTION tqsl_getCabrilloRecordText ( tQSL_Cabrillo  cab)

Get the text of the current Cabrillo record

tqsl-2.8.1/src/doxygen/html/group__CertStuff.html0000644000175000017500000035263315003421124022065 0ustar rmurphyrmurphy TrustedQSL Library API: Certificate Handling API
TrustedQSL Library API
Certificate Handling API

Macros

#define TQSL_SELECT_CERT_WITHKEYS   1
 Private keys only (no cert)
 
#define TQSL_SELECT_CERT_EXPIRED   2
 Include expired certs.
 
#define TQSL_SELECT_CERT_SUPERCEDED   4
 Include superseded certs.
 
#define TQSL_PK_TYPE_ERR   0
 Error retrieving private key.
 
#define TQSL_PK_TYPE_NONE   1
 No private key.
 
#define TQSL_PK_TYPE_UNENC   2
 Private key is not encrypted.
 
#define TQSL_PK_TYPE_ENC   3
 Private key is encrypted.
 
#define TQSL_CERT_STATUS_UNK   0
 Status is unknown.
 
#define TQSL_CERT_STATUS_SUP   1
 Certificate is superceded.
 
#define TQSL_CERT_STATUS_EXP   2
 Certificate is expired.
 
#define TQSL_CERT_STATUS_OK   3
 Certificate is valid.
 
#define TQSL_CERT_STATUS_INV   4
 Invalid serial number.
 

Functions

DLLEXPORT int CALLCONVENTION tqsl_selectCertificates (tQSL_Cert **certlist, int *ncerts, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flag)
 
DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates (tQSL_Cert **certlist, int *ncerts, const char *type)
 
DLLEXPORT int CALLCONVENTION tqsl_getSelectedCertificate (tQSL_Cert *cert, const tQSL_Cert **certlist, int idx)
 
DLLEXPORT int CALLCONVENTION tqsl_isCertificateExpired (tQSL_Cert cert, int *status)
 
DLLEXPORT int CALLCONVENTION tqsl_isCertificateSuperceded (tQSL_Cert cert, int *status)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateKeyOnly (tQSL_Cert cert, int *keyonly)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateEncoded (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded (const char *callsign, const char *type, const char *keybuf, const char *certbuf)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerial (tQSL_Cert cert, long *serial)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt (tQSL_Cert cert, char *serial, int serialsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialLength (tQSL_Cert cert)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuer (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganization (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganizationalUnit (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateCallSign (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateAROName (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateEmailAddress (tQSL_Cert cert, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotBeforeDate (tQSL_Cert cert, tQSL_Date *date)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotAfterDate (tQSL_Cert cert, tQSL_Date *date)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotBeforeDate (tQSL_Cert cert, tQSL_Date *date)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotAfterDate (tQSL_Cert cert, tQSL_Date *date)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateDXCCEntity (tQSL_Cert cert, int *dxcc)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress1 (tQSL_Cert cert, char *str, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress2 (tQSL_Cert cert, char *str, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCity (tQSL_Cert cert, char *str, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestState (tQSL_Cert cert, char *str, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestPostalCode (tQSL_Cert cert, char *str, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCountry (tQSL_Cert cert, char *str, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificatePrivateKeyType (tQSL_Cert cert)
 
DLLEXPORT void CALLCONVENTION tqsl_freeCertificate (tQSL_Cert cert)
 
DLLEXPORT void CALLCONVENTION tqsl_freeCertificateList (tQSL_Cert *list, int ncerts)
 
DLLEXPORT int CALLCONVENTION tqsl_getCertificateStatus (long serial)
 
DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus (long serial, const char *status)
 
DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile (const char *file, int(*cb)(int type, const char *message, void *userdata), void *user)
 
DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile (const char *file, long *serial)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumProviders (int *n)
 
DLLEXPORT int CALLCONVENTION tqsl_getProvider (int idx, TQSL_PROVIDER *provider)
 
DLLEXPORT int CALLCONVENTION tqsl_createCertRequest (const char *filename, TQSL_CERT_REQ *req, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user)
 
DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File (tQSL_Cert cert, const char *filename, const char *p12password)
 
DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto (tQSL_Cert cert, const char *filename, const char *p12password)
 
DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64 (tQSL_Cert cert, char *base64, int b64len, const char *p12password)
 
DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File (const char *filename, const char *p12password, const char *password, int(*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type, const char *message, void *userdata), void *user)
 
DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64 (const char *base64, const char *p12password, const char *password, int(*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type, const char *message, void *userdata), void *user)
 
DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates (char ***calls, int *ncall, const char *filter)
 
DLLEXPORT void CALLCONVENTION tqsl_freeDeletedCertificateList (char **list, int nloc)
 
DLLEXPORT int CALLCONVENTION tqsl_restoreCallsignCertificate (const char *callsign)
 
DLLEXPORT int CALLCONVENTION tqsl_deleteCertificate (tQSL_Cert cert)
 

Detailed Description

Certificates are managed by manipulating tQSL_Cert objects. A tQSL_Cert contains:

  • The identity of the organization that issued the certificate (the "issuer").
  • The name and call sign of the amateur radio operator (ARO).
  • The DXCC entity number for which this certificate is valid.
  • The range of QSO dates for which this certificate can be used.
  • The resources needed to digitally sign and verify QSO records.

The certificate management process consists of:

  • Applying for a certificate. Certificate requests are produced via the tqsl_createCertRequest() function, which produces a certificate-request file to send to the issuer.
  • Importing the certificate file received from the issuer into the local "certificate store," a directory managed by the tQSL library, via tqsl_importTQSLFile().
  • Selecting an appropriate certificate to use to sign a QSO record via tqsl_selectCertificates().

Function Documentation

◆ tqsl_createCertRequest()

DLLEXPORT int CALLCONVENTION tqsl_createCertRequest ( const char *  filename,
TQSL_CERT_REQ req,
int(*)(char *pwbuf, int pwsize, void *userdata)  pwcb,
void *  user 
)

Create a certificate-request Gabbi file.

The req parameter must be properly populated with the required fields.

If req->password is NULL and cb is not NULL, the callback will be called to acquire the password. Otherwise req->password will be used as the password. If the password is NULL or an empty string the generated private key will be stored unencrypted.

If req->signer is not zero and the signing certificate requires a password, the password may be in req->signer_password, else signer_pwcb is called.

◆ tqsl_deleteCertificate()

DLLEXPORT int CALLCONVENTION tqsl_deleteCertificate ( tQSL_Cert  cert)

Delete a certificate and private key

◆ tqsl_exportPKCS12Base64()

DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64 ( tQSL_Cert  cert,
char *  base64,
int  b64len,
const char *  p12password 
)

Save a key pair and certificates to a Base64 string in PKCS12 format.

The tQSL_Cert must be initialized for signing (see tqsl_beginSigning()) if the user certificate is being exported.

The supplied p12password is used to encrypt the PKCS12 data.

◆ tqsl_exportPKCS12File()

DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File ( tQSL_Cert  cert,
const char *  filename,
const char *  p12password 
)

Save a key pair and certificates to a file in PKCS12 format.

The tQSL_Cert must be initialized for signing (see tqsl_beginSigning()) if the user certificate is being exported.

The supplied p12password is used to encrypt the PKCS12 data.

◆ tqsl_exportPKCS12FileWeakCrypto()

DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto ( tQSL_Cert  cert,
const char *  filename,
const char *  p12password 
)

Save a key pair and certificates to a file in PKCS12 format. Use downgraded crypto for Apple Keyring compatibility.

The tQSL_Cert must be initialized for signing (see tqsl_beginSigning()) if the user certificate is being exported.

The supplied p12password is used to encrypt the PKCS12 data.

◆ tqsl_freeCertificate()

DLLEXPORT void CALLCONVENTION tqsl_freeCertificate ( tQSL_Cert  cert)

Free the memory used by the tQSL_Cert. Once this function is called, cert should not be used again in any way.

◆ tqsl_freeCertificateList()

DLLEXPORT void CALLCONVENTION tqsl_freeCertificateList ( tQSL_Cert list,
int  ncerts 
)

Free the memory used by a certificate list. The allocated list of tQSL_Certs are freed and the pointer array is freed. Once this function is called, the list or the cert should not be used again in any way.

◆ tqsl_freeDeletedCertificateList()

DLLEXPORT void CALLCONVENTION tqsl_freeDeletedCertificateList ( char **  list,
int  nloc 
)

Free the list of restorable Callsign Certificates.

◆ tqsl_getCertificateAROName()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateAROName ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the ARO name string from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateCallSign()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateCallSign ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the ARO call sign string from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateDXCCEntity()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateDXCCEntity ( tQSL_Cert  cert,
int *  dxcc 
)

Get the DXCC entity number from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • dxcc - Pointer to an int to hold the returned date.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateEmailAddress()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateEmailAddress ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the email address from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateEncoded()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateEncoded ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the encoded certificate for inclusion in a GABBI file.

◆ tqsl_getCertificateIssuer()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuer ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the issuer (DN) string from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateIssuerOrganization()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganization ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the issuer's organization name from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateIssuerOrganizationalUnit()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganizationalUnit ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the issuer's organizational unit name from a tQSL_Cert.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateKeyOnly()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateKeyOnly ( tQSL_Cert  cert,
int *  keyonly 
)

Find out if the "certificate" is just a key pair.

◆ tqsl_getCertificateNotAfterDate()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotAfterDate ( tQSL_Cert  cert,
tQSL_Date date 
)

Get the certificate's not-after date from a tQSL_Cert.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateNotBeforeDate()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotBeforeDate ( tQSL_Cert  cert,
tQSL_Date date 
)

Get the certificate's not-before date from a tQSL_Cert.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificatePrivateKeyType()

DLLEXPORT int CALLCONVENTION tqsl_getCertificatePrivateKeyType ( tQSL_Cert  cert)

Determine the nature of the private key associated with a certificate.

Returns one of the following values:

  • TQSL_PK_TYPE_ERR - An error occurred. Use tqsl_getErrorString() to examine.
  • TQSL_PK_TYPE_NONE - No matching private key was found.
  • TQSL_PK_TYPE_UNENC - The matching private key is unencrypted.
  • TQSL_PK_TYPE_ENC - The matching private key is encrypted (password protected).

◆ tqsl_getCertificateQSONotAfterDate()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotAfterDate ( tQSL_Cert  cert,
tQSL_Date date 
)

Get the QSO not-after date from a tQSL_Cert.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateQSONotBeforeDate()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotBeforeDate ( tQSL_Cert  cert,
tQSL_Date date 
)

Get the QSO not-before date from a tQSL_Cert.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateRequestAddress1()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress1 ( tQSL_Cert  cert,
char *  str,
int  bufsiz 
)

Get the first address line from the certificate request used in applying for a tQSL_Cert certificate.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateRequestAddress2()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress2 ( tQSL_Cert  cert,
char *  str,
int  bufsiz 
)

Get the second address line from the certificate request used in applying for a tQSL_Cert certificate.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateRequestCity()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCity ( tQSL_Cert  cert,
char *  str,
int  bufsiz 
)

Get the city from the certificate request used in applying for a tQSL_Cert certificate.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateRequestCountry()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCountry ( tQSL_Cert  cert,
char *  str,
int  bufsiz 
)

Get the country from the certificate request used in applying for a tQSL_Cert certificate.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateRequestPostalCode()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestPostalCode ( tQSL_Cert  cert,
char *  str,
int  bufsiz 
)

Get the postal (ZIP) code from the certificate request used in applying for a tQSL_Cert certificate.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateRequestState()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestState ( tQSL_Cert  cert,
char *  str,
int  bufsiz 
)

Get the state from the certificate request used in applying for a tQSL_Cert certificate.

  • cert - a tQSL_Cert object, normally one returned from tqsl_selectCertificates()
  • buf - Buffer to hold the returned string.
  • bufsiz - Size of buf.

Returns 0 on success, nonzero on failure.

◆ tqsl_getCertificateSerial()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerial ( tQSL_Cert  cert,
long *  serial 
)

Get the issuer's serial number of the certificate.

◆ tqsl_getCertificateSerialExt()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt ( tQSL_Cert  cert,
char *  serial,
int  serialsiz 
)

Get the issuer's serial number of the certificate as a hexadecimal string. Needed for certs with long serial numbers (typically root certs).

◆ tqsl_getCertificateSerialLength()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialLength ( tQSL_Cert  cert)

Get the length of the issuer's serial number of the certificate as it will be returned by tqsl_getCertificateSerialExt.

◆ tqsl_getCertificateStatus()

DLLEXPORT int CALLCONVENTION tqsl_getCertificateStatus ( long  serial)

Determine the status of a callsign certificate

  • serial - the serial number of the certificate tqsl_selectCertificates()
  • status - an integer to receive the certificate status

Returns one of the following values:

  • TQSL_CERT_STATUS_UNK - An error occurred and the status is unknown
  • TQSL_CERT_STATUS_SUP - The certificate has been superceded
  • TQSL_CERT_STATUS_EXP - The certificate has expired
  • TQSL_CERT_STATUS_OK - The certificate is valid
  • TQSL_CERT_STATUS_INV - The serial number supplied is invalid

◆ tqsl_getDeletedCallsignCertificates()

DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates ( char ***  calls,
int *  ncall,
const char *  filter 
)

Get the list of restorable station locations.

◆ tqsl_getKeyEncoded()

DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded ( tQSL_Cert  cert,
char *  buf,
int  bufsiz 
)

Get the encoded private key for inclusion in a backup file.

◆ tqsl_getNumProviders()

DLLEXPORT int CALLCONVENTION tqsl_getNumProviders ( int *  n)

Get the number of certificate providers known to tqsllib.

◆ tqsl_getProvider()

DLLEXPORT int CALLCONVENTION tqsl_getProvider ( int  idx,
TQSL_PROVIDER provider 
)

Get the information for a certificate provider.

◆ tqsl_getSelectedCertificate()

DLLEXPORT int CALLCONVENTION tqsl_getSelectedCertificate ( tQSL_Cert cert,
const tQSL_Cert **  certlist,
int  idx 
)

Get a particulat certificate from the list returnded by tqsl_selectCertificates. This function exists principally to make it easier for VB programs to access the list of certificates.

It is the caller's responsibility to ensure that 0 <= idx < ncerts (where ncerts is the value returned by tqsl_selectCertificates)

◆ tqsl_getSerialFromTQSLFile()

DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile ( const char *  file,
long *  serial 
)

Get the serial for the first user cert from a .tq6 file used to support asking the user to save their cert after import

  • file is the path to the file
  • serial is where the serial number is returned

Returns 0 on success, nonzero on failure.

◆ tqsl_importKeyPairEncoded()

DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded ( const char *  callsign,
const char *  type,
const char *  keybuf,
const char *  certbuf 
)

Import a base64 encoded certificate and private key from a backup file.

◆ tqsl_importPKCS12Base64()

DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64 ( const char *  base64,
const char *  p12password,
const char *  password,
int(*)(char *buf, int bufsiz, void *userdata)  pwcb,
int(*)(int type, const char *message, void *userdata)  cb,
void *  user 
)

Load certificates and a private key from a Base64 encoded PKCS12 string.

◆ tqsl_importPKCS12File()

DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File ( const char *  filename,
const char *  p12password,
const char *  password,
int(*)(char *buf, int bufsiz, void *userdata)  pwcb,
int(*)(int type, const char *message, void *userdata)  cb,
void *  user 
)

Load certificates and a private key from a PKCS12 file.

◆ tqsl_importTQSLFile()

DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile ( const char *  file,
int(*)(int type, const char *message, void *userdata)  cb,
void *  user 
)

Import a Gabbi cert file received from a CA

The callback, cb, will be called whenever a certificate is ready to be imported:

cb(type, message);

type has several fields that can be accessed via macros:

TQSL_CERT_CB_CALL_TYPE(type) := TQSL_CERT_CB_MILESTONE | TQSL_CERT_CB_RESULT

TQSL_CERT_CB_CERT_TYPE(type) := TQSL_CERT_CB_ROOT | TQSL_CERT_CB_CA | TQSL_CERT_CB_USER

TQSL_CERT_CB_RESULT_TYPE(type) := TQSL_CERT_CB_PROMPT | TQSL_CERT_CB_WARNING | TQSL_CERT_CB_ERROR

TQSL_CERT_CB_RESULT_TYPE() is meaningful only if TQSL_CERT_CB_CALL_TYPE() == TQSL_CERT_CB_RESULT

◆ tqsl_isCertificateExpired()

DLLEXPORT int CALLCONVENTION tqsl_isCertificateExpired ( tQSL_Cert  cert,
int *  status 
)

Find out if the "certificate" is expired

◆ tqsl_isCertificateSuperceded()

DLLEXPORT int CALLCONVENTION tqsl_isCertificateSuperceded ( tQSL_Cert  cert,
int *  status 
)

Find out if the "certificate" is superceded

◆ tqsl_restoreCallsignCertificate()

DLLEXPORT int CALLCONVENTION tqsl_restoreCallsignCertificate ( const char *  callsign)

Restore a deleted callsign certificate by callsign.

◆ tqsl_selectCACertificates()

DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates ( tQSL_Cert **  certlist,
int *  ncerts,
const char *  type 
)

Get a list of authority certificates

Selects a set of certificates from the root or authorities certificate stores The function produces a list of tQSL_Cert objects.

Each of the tQSL_Cert objects in the list should be freed by calling tqsl_freeCertificate(). tqsl_freeCertificateList() is a better function to use for that as it also frees the allocated array that holds the certificate pointers.

◆ tqsl_selectCertificates()

DLLEXPORT int CALLCONVENTION tqsl_selectCertificates ( tQSL_Cert **  certlist,
int *  ncerts,
const char *  callsign,
int  dxcc,
const tQSL_Date date,
const TQSL_PROVIDER issuer,
int  flag 
)

Get a list of certificates

Selects a set of certificates from the user's certificate store based on optional selection criteria. The function produces a list of tQSL_Cert objects.

  • certlist - Pointer to a variable that is set by the function to point to the list of tQSL_Cert objects.
  • ncerts - Pointer to an int that is set to the number of objects in the certlist list.
  • callsign - Optional call sign to match.
  • date - Optional QSO date string in ISO format. Only certs that have a QSO date range that encompasses this date will be returned.
  • issuer - Optional issuer (DN) string to match.
  • flag - OR of TQSL_SELECT_CERT_EXPIRED (include expired certs), TQSL_SELECT_CERT_SUPERCEDED and TQSL_SELECT_CERT_WITHKEYS (keys that don't have associated certs will be returned).

Returns 0 on success, nonzero on failure.

Each of the tQSL_Cert objects in the list should be freed by calling tqsl_freeCertificate(). tqsl_freeCertificateList() is a better function to use for that as it also frees the allocated array that holds the certificate pointers.

◆ tqsl_setCertificateStatus()

DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus ( long  serial,
const char *  status 
)

Store the status of a callsign certificate

  • serial - serial number of the certificate
  • status - the status value to store.
tqsl-2.8.1/src/doxygen/html/group__Convert.html0000644000175000017500000014133515003421124021573 0ustar rmurphyrmurphy TrustedQSL Library API: Converter API
TrustedQSL Library API
Converter API

Macros

#define TQSL_LOC_IGNORE   0
 Ignore MY_ ADIF fields.
 
#define TQSL_LOC_REPORT   1
 Report on MY_ ADIF fields not matching cert/location.
 
#define TQSL_LOC_UPDATE   2
 Update Cert/Loc to track MY_ ADIF fields.
 

Typedefs

typedef void * tQSL_Converter
 

Functions

DLLEXPORT int CALLCONVENTION tqsl_beginConverter (tQSL_Converter *convp)
 
DLLEXPORT int CALLCONVENTION tqsl_beginADIFConverter (tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc)
 
DLLEXPORT int CALLCONVENTION tqsl_beginCabrilloConverter (tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc)
 
DLLEXPORT int CALLCONVENTION tqsl_endConverter (tQSL_Converter *conv)
 
DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowBadCall (tQSL_Converter conv, int allow)
 
DLLEXPORT int CALLCONVENTION tqsl_setConverterQTHDetails (tQSL_Converter conv, int logverify)
 
DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowDuplicates (tQSL_Converter convp, int ignore)
 
DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreSeconds (tQSL_Converter convp, int ignore)
 
DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreCallsigns (tQSL_Converter convp, int ignore)
 
DLLEXPORT int CALLCONVENTION tqsl_setConverterAppName (tQSL_Converter convp, const char *app)
 
DLLEXPORT int CALLCONVENTION tqsl_converterRollBack (tQSL_Converter convp)
 
DLLEXPORT int CALLCONVENTION tqsl_converterCommit (tQSL_Converter convp)
 
DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecords (tQSL_Converter convp, char *key, char *data, int keylen)
 
DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecordsV2 (tQSL_Converter convp, char *key, char *data, int keylen)
 
DLLEXPORT int CALLCONVENTION tqsl_putDuplicateRecord (tQSL_Converter convp, const char *key, const char *data, int keylen)
 
DLLEXPORT int CALLCONVENTION tqsl_setADIFConverterDateFilter (tQSL_Converter conv, tQSL_Date *start, tQSL_Date *end)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getConverterGABBI (tQSL_Converter conv)
 
DLLEXPORT int CALLCONVENTION tqsl_getConverterCert (tQSL_Converter conv, tQSL_Cert *certp)
 
DLLEXPORT int CALLCONVENTION tqsl_getConverterLine (tQSL_Converter conv, int *lineno)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getConverterRecordText (tQSL_Converter conv)
 

Detailed Description

The Converter API provides the capability of converting Cabrillo and ADIF files to GABBI output.

Typedef Documentation

◆ tQSL_Converter

typedef void* tQSL_Converter

Opaque converter type used by applications to access conversion functions

Function Documentation

◆ tqsl_beginADIFConverter()

DLLEXPORT int CALLCONVENTION tqsl_beginADIFConverter ( tQSL_Converter conv,
const char *  filename,
tQSL_Cert certs,
int  ncerts,
tQSL_Location  loc 
)

Initiates the conversion process for an ADIF file.

certs and ncerts define a set of certificates that are available to the converter for signing records. Typically, this list will be obtained by calling tqsl_selectCertificates().

tqsl_endConverter() should be called to free the resources when the conversion is finished.

◆ tqsl_beginCabrilloConverter()

DLLEXPORT int CALLCONVENTION tqsl_beginCabrilloConverter ( tQSL_Converter conv,
const char *  filename,
tQSL_Cert certs,
int  ncerts,
tQSL_Location  loc 
)

Initiates the conversion process for a Cabrillo file.

certs and ncerts define a set of certificates that are available to the converter for signing records. Typically, this list will be obtained by calling tqsl_selectCertificates().

tqsl_endConverter() should be called to free the resources when the conversion is finished.

◆ tqsl_beginConverter()

DLLEXPORT int CALLCONVENTION tqsl_beginConverter ( tQSL_Converter convp)

Create a simple converter object

Allocates resources for converting logs and processing duplicate records.

◆ tqsl_converterCommit()

DLLEXPORT int CALLCONVENTION tqsl_converterCommit ( tQSL_Converter  convp)

Commits insertions into the duplicates database.

This is called when a log is created normally and without issue, and so the presumption is that we are "done" with these QSOs.

◆ tqsl_converterRollBack()

DLLEXPORT int CALLCONVENTION tqsl_converterRollBack ( tQSL_Converter  convp)

Roll back insertions into the duplicates database.

This is called when cancelling creating a log, and causes any records added to the duplicates database to be removed so re-processing that log does not cause the records to be mis-marked as duplicates.

◆ tqsl_endConverter()

DLLEXPORT int CALLCONVENTION tqsl_endConverter ( tQSL_Converter conv)

End the conversion process by freeing the used resources.

◆ tqsl_getConverterCert()

DLLEXPORT int CALLCONVENTION tqsl_getConverterCert ( tQSL_Converter  conv,
tQSL_Cert certp 
)

Get the certificate used to sign the most recent QSO record.

◆ tqsl_getConverterGABBI()

DLLEXPORT const char *CALLCONVENTION tqsl_getConverterGABBI ( tQSL_Converter  conv)

This is the main converter function. It returns a single GABBI record.

Returns the NULL pointer on error or EOF. (Test tQSL_Error to determine which.)

tQSL_Error is set to TQSL_DATE_OUT_OF_RANGE if QSO date range checking is active and the QSO date is outside the specified range. This is a non-fatal error.

tQSL_Error is set to TQSL_DUPLICATE_QSO if the QSO has already been processed on the current computer.

tQSL_Error is set to TQSL_NEW_UPLOAD_DB if a new uploads database was created. This allows TQSL to attempt to re-load the QSOs from the most recent automatic backup (if it exists).

N.B. On systems that distinguish text-mode files from binary-mode files, notably Windows, the GABBI records should be written in binary mode.

N.B. If the selected certificate has not been initialized for signing via tqsl_beginSigning(), this function will return a TQSL_SIGNINIT_ERROR. The cert that caused the error can be obtained via tqsl_getConverterCert(), initialized for signing, and then this function can be called again. No data records will be lost in this process.

◆ tqsl_getConverterLine()

DLLEXPORT int CALLCONVENTION tqsl_getConverterLine ( tQSL_Converter  conv,
int *  lineno 
)

Get the input-file line number last read by the converter, starting at line 1.

◆ tqsl_getConverterRecordText()

DLLEXPORT const char *CALLCONVENTION tqsl_getConverterRecordText ( tQSL_Converter  conv)

Get the text of the last record read by the converter.

Returns NULL on error.

◆ tqsl_getDuplicateRecords()

DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecords ( tQSL_Converter  convp,
char *  key,
char *  data,
int  keylen 
)

Bulk read the duplicate DB records

This is called to retrieve the QSO records from the dupe database. It returns the key/value pair upon each call. Return -1 for end of file, 0 for success, 1 for errors.

◆ tqsl_getDuplicateRecordsV2()

DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecordsV2 ( tQSL_Converter  convp,
char *  key,
char *  data,
int  keylen 
)

Bulk read the duplicate DB records

This is called to retrieve the QSO records from the dupe database. It returns the key/value pair upon each call. Return -1 for end of file, 0 for success, 1 for errors. V2 expects a 256 byte buffer for the "data" string.

◆ tqsl_putDuplicateRecord()

DLLEXPORT int CALLCONVENTION tqsl_putDuplicateRecord ( tQSL_Converter  convp,
const char *  key,
const char *  data,
int  keylen 
)

Bulk write duplicate DB records

This is called to store a QSO record into the dupe database.

Return -1 for duplicate insertion, 0 for success, 1 for errors.

◆ tqsl_setADIFConverterDateFilter()

DLLEXPORT int CALLCONVENTION tqsl_setADIFConverterDateFilter ( tQSL_Converter  conv,
tQSL_Date start,
tQSL_Date end 
)

Set QSO date filtering in the converter.

If start points to a valid date, QSOs prior to that date will be ignored by the converter. Similarly, if end points to a valid date, QSOs after that date will be ignored. Either or both may be NULL (or point to an invalid date) to disable date filtering for the respective range.

◆ tqsl_setConverterAllowBadCall()

DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowBadCall ( tQSL_Converter  conv,
int  allow 
)

Configure the converter to allow (allow != 0) or disallow (allow == 0) nonamateur call signs in the CALL field. (Note: the test for validity is fairly trivial and will allow some nonamateur calls to get through, but it does catch most common errors.)

allow defaults to 0 when tqsl_beginADIFConverter or tqsl_beginCabrilloConverter is called.

◆ tqsl_setConverterAllowDuplicates()

DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowDuplicates ( tQSL_Converter  convp,
int  ignore 
)

Configure the converter to allow (allow != 0) or disallow (allow == 0) duplicate QSOs in a signed log. Duplicate detection is done using QSO details, location details, and certificate serial number.

allow defaults to 1 for backwards compatibility when tqsl_beginADIFConverter or tqsl_beginCabrilloConverter is called.

◆ tqsl_setConverterAppName()

DLLEXPORT int CALLCONVENTION tqsl_setConverterAppName ( tQSL_Converter  convp,
const char *  app 
)

Specify the name of the application using the conversion library. This is output in a header record in the exported log file. Call this before calling tqsl_getConverterGABBI.

app is a c string containing the application name.

◆ tqsl_setConverterIgnoreCallsigns()

DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreCallsigns ( tQSL_Converter  convp,
int  ignore 
)

Configure the converter to ignore (ignore != 0) or include (ignore == 0) callsigns in ADIF logs,

ignore defaults to 0.

◆ tqsl_setConverterIgnoreSeconds()

DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreSeconds ( tQSL_Converter  convp,
int  ignore 
)

Configure the converter to ignore (ignore != 0) or include (ignore == 0) seconds in times when detecting duplicate QSOs in a signed log. Duplicate detection is done using QSO details, location details, and certificate serial number.

ignore defaults to 0.

◆ tqsl_setConverterQTHDetails()

DLLEXPORT int CALLCONVENTION tqsl_setConverterQTHDetails ( tQSL_Converter  conv,
int  logverify 
)

Configure the converter's handing of QTH fields in an adif input file

allow defaults to 0 when tqsl_beginADIFConverter or tqsl_beginCabrilloConverter is called.

tqsl-2.8.1/src/doxygen/html/group__Data.html0000644000175000017500000054516615003421124021036 0ustar rmurphyrmurphy TrustedQSL Library API: Data API
TrustedQSL Library API
Data API

Macros

#define TQSL_LOCATION_FIELD_TEXT   1
 Text type input field.
 
#define TQSL_LOCATION_FIELD_DDLIST   2
 Dropdown list input field.
 
#define TQSL_LOCATION_FIELD_LIST   3
 List type input field.
 
#define TQSL_LOCATION_FIELD_BADZONE   4
 Used to return zone selection errors.
 
#define TQSL_LOCATION_FIELD_CHAR   1
 Character field.
 
#define TQSL_LOCATION_FIELD_INT   2
 Integer field.
 

Functions

DLLEXPORT int CALLCONVENTION tqsl_initStationLocationCapture (tQSL_Location *locp)
 
DLLEXPORT int CALLCONVENTION tqsl_endStationLocationCapture (tQSL_Location *locp)
 
DLLEXPORT int CALLCONVENTION tqsl_updateStationLocationCapture (tQSL_Location loc)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocationCapturePages (tQSL_Location loc, int *npages)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCapturePage (tQSL_Location loc, int *page)
 
DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCapturePage (tQSL_Location loc, int page)
 
DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCertFlags (tQSL_Location loc, int flags)
 
DLLEXPORT int CALLCONVENTION tqsl_nextStationLocationCapture (tQSL_Location loc)
 
DLLEXPORT int CALLCONVENTION tqsl_getNextStationLocationCapturePage (tQSL_Location loc, int *page)
 
DLLEXPORT int CALLCONVENTION tqsl_prevStationLocationCapture (tQSL_Location loc)
 
DLLEXPORT int CALLCONVENTION tqsl_getPrevStationLocationCapturePage (tQSL_Location loc, int *page)
 
DLLEXPORT int CALLCONVENTION tqsl_getCurrentStationLocationCapturePage (tQSL_Location loc, int *page)
 
DLLEXPORT int CALLCONVENTION tqsl_hasNextStationLocationCapture (tQSL_Location loc, int *rval)
 
DLLEXPORT int CALLCONVENTION tqsl_hasPrevStationLocationCapture (tQSL_Location loc, int *rval)
 
DLLEXPORT int CALLCONVENTION tqsl_saveStationLocationCapture (tQSL_Location loc, int overwrite)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCaptureName (tQSL_Location loc, char *namebuf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCaptureName (tQSL_Location loc, const char *name)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocations (tQSL_Location loc, int *nloc)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocationName (tQSL_Location loc, int idx, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCallSign (tQSL_Location loc, int idx, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField (tQSL_Location locp, const char *name, char *namebuf, int bufsize)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocation (tQSL_Location *loc, const char *name)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationLocationErrors (tQSL_Location loc, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getStationDataEnc (tQSL_StationDataEnc *sdata)
 
DLLEXPORT int CALLCONVENTION tqsl_freeStationDataEnc (tQSL_StationDataEnc sdata)
 
DLLEXPORT int CALLCONVENTION tqsl_mergeStationLocations (const char *locdata)
 
DLLEXPORT int CALLCONVENTION tqsl_deleteStationLocation (const char *name)
 
DLLEXPORT int CALLCONVENTION tqsl_restoreStationLocation (const char *name)
 
DLLEXPORT int CALLCONVENTION tqsl_getDeletedStationLocations (char ***locp, int *nloc)
 
DLLEXPORT void CALLCONVENTION tqsl_freeDeletedLocationList (char **list, int nloc)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField (tQSL_Location loc, int *numf)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize (tQSL_Location loc, int field_num, int *rval)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel (tQSL_Location loc, int field_num, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize (tQSL_Location loc, int field_num, int *rval)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI (tQSL_Location loc, int field_num, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldInputType (tQSL_Location loc, int field_num, int *type)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataType (tQSL_Location loc, int field_num, int *type)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldFlags (tQSL_Location loc, int field_num, int *flags)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLength (tQSL_Location loc, int field_num, int *rval)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData (tQSL_Location loc, int field_num, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIntData (tQSL_Location loc, int field_num, int *dat)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIndex (tQSL_Location loc, int field_num, int *dat)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumLocationFieldListItems (tQSL_Location loc, int field_num, int *rval)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem (tQSL_Location loc, int field_num, int item_idx, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldCharData (tQSL_Location loc, int field_num, const char *buf)
 
DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIntData (tQSL_Location loc, int field_num, int dat)
 
DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIndex (tQSL_Location loc, int field_num, int dat)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldChanged (tQSL_Location loc, int field_num, int *changed)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationCallSign (tQSL_Location loc, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_setLocationCallSign (tQSL_Location loc, const char *buf, int dxcc)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationField (tQSL_Location locp, const char *field, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel (tQSL_Location locp, const char *field, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_setLocationField (tQSL_Location locp, const char *field, const char *buf)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationDXCCEntity (tQSL_Location loc, int *dxcc)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationQSODetails (tQSL_Location locp, char *buf, int buflen)
 
DLLEXPORT int CALLCONVENTION tqsl_getLocationStationDetails (tQSL_Location locp, char *buf, int buflen)
 
DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo (const char *callsign, const char *json)
 
DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo (const char *callsign, char **buf)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumDXCCEntity (int *number)
 
DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity (int index, int *number, const char **name)
 
DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName (int number, const char **name)
 
DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap (int number, const char **zonemap)
 
DLLEXPORT int CALLCONVENTION tqsl_getDXCCStartDate (int number, tQSL_Date *d)
 
DLLEXPORT int CALLCONVENTION tqsl_getDXCCEndDate (int number, tQSL_Date *d)
 
DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted (int number, int *deleted)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumBand (int *number)
 
DLLEXPORT int CALLCONVENTION tqsl_getBand (int index, const char **name, const char **spectrum, int *low, int *high)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumMode (int *number)
 
DLLEXPORT int CALLCONVENTION tqsl_getMode (int index, const char **mode, const char **group)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumADIFMode (int *number)
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry (int index, const char **mode)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumPropagationMode (int *number)
 
DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode (int index, const char **name, const char **descrip)
 
DLLEXPORT int CALLCONVENTION tqsl_getNumSatellite (int *number)
 
DLLEXPORT int CALLCONVENTION tqsl_getSatellite (int index, const char **name, const char **descrip, tQSL_Date *start, tQSL_Date *end)
 
DLLEXPORT int CALLCONVENTION tqsl_clearCabrilloMap ()
 
DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry (const char *contest, int field, int contest_type)
 
DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry (const char *contest, int *fieldnum, int *contest_type)
 
DLLEXPORT int CALLCONVENTION tqsl_clearADIFModes ()
 
DLLEXPORT int CALLCONVENTION tqsl_setADIFMode (const char *adif_item, const char *mode)
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFMode (const char *adif_item, char *mode, int nmode)
 
DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode (const char *adif_item, char *mode, char *submode, int nmode)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCERT (tQSL_Cert cert, int uid)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItSTATION (tQSL_Location loc, int uid, int certuid)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACT (tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACTData (tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid, char *signdata, int sdlen)
 

Detailed Description

The Data API is used to form data into TrustedQSL records. A TrustedQSL record consists of a station record and a QSO record. Together, the two records fully describe one station's end of the QSO – just as a paper QSL card does.

The station record contains the callsign and geographic location of the station submitting the QSO record. The library manages the station records. The tqsl_xxxStationLocationCapture functions are used to generate and save a station record. The intent is to provide an interface that makes a step-by-step system (such as a GUI "wizard") easily implemented.

The tqsl_getStationLocation() function is used to retrieve station records.

With the necessary station location available, a signed GABBI output file can be generated using the tqsl_getGABBIxxxxx functions:

The GABBI format requires that the tCERT record contain an integer identifier that is unique within the GABBI file. Similarly, each tSTATION record must contain a unique identifier. Additionally, the tSTATION record must reference the identifier of a preceding tCERT record. Finally, each tCONTACT record must reference a preceding tSTATION record. (A GABBI processor uses these identifiers and references to tie the station and contact records together and to verify their signature via the certificate.) It is the responsibility of the caller to supply these identifiers and to ensure that the supplied references match the tQSL_Cert and tQSL_Location used to create the referenced GABBI records.

Station Location Generation

The station-location generation process involves determining the values for a number of station-location parameters. Normally this will be done by prompting the user for the values. The responses given by the user may determine which later fields are required. For example, if the user indicates that the DXCC entity is UNITED STATES, a later field would ask for the US state. This field would not be required if the DXCC entity were not in the US.

To accommodate the dynamic nature of the field requirements, the fields are ordered such that dependent fields are queried after the field(s) on which they depend. To make this process acceptable in a GUI system, the fields are grouped into pages, where multiple fields may be displayed on the same page. The grouping is such that which fields are within the page is not dependent on any of the values of the fields within the page. That is, a page of fields contains the same fields no matter what value any of the fields contains. (However, the values of fields within the page can depend on the values of fields that precede them in the page.)

Here is a brief overview of the sequence of events involved in generating a station location interactively, one field at a time:

1) Call tqsl_initStationLocationCapture() (new location) or tqsl_getStationLocation() (existing location).

2) For field from 0 to tqsl_getNumLocationField():

3) If tqsl_hasNextStationLocationCapture() returns 1, call tqsl_nextStationLocationCapture() and go back to step 2.

In the case of a GUI system, you'll probably want to display the fields in pages. The sequence of events is a bit different:

1) Call tqsl_initStationLocationCapture() (new location) or tqsl_getStationLocation() (existing location).

2) For field from 0 to tqsl_getNumLocationField(),

3) Each time the user changes a field, call tqsl_updateStationLocationCapture(). This may change the allowable selection for fields that follow the field the user changed, so the control for each of those fields should be updated as in step 2.

4) Once the user has completed entries for the page, if tqsl_hasNextStationLocationCapture() returns 1, call tqsl_nextStationLocationCapture() and go back to step 2.

N.B. The first two fields in the station-location capture process are always call sign and DXCC entity, in that order. As a practical matter, these two fields must match the corresponding fields in the available certificates. The library will therefore constrain the values of these fields to match what's available in the certificate store. See Certificate Handling API.

Function Documentation

◆ tqsl_clearADIFModes()

DLLEXPORT int CALLCONVENTION tqsl_clearADIFModes ( )

Clear the map of ADIF modes

◆ tqsl_clearCabrilloMap()

DLLEXPORT int CALLCONVENTION tqsl_clearCabrilloMap ( )

Clear the map of Cabrillo contests.

◆ tqsl_deleteStationLocation()

DLLEXPORT int CALLCONVENTION tqsl_deleteStationLocation ( const char *  name)

Remove the stored station location by name.

◆ tqsl_endStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_endStationLocationCapture ( tQSL_Location locp)

Release the station-location resources. This should be called for any tQSL_Location that was initialized via tqsl_initStationLocationCapture() or tqsl_getStationLocation()

◆ tqsl_freeDeletedLocationList()

DLLEXPORT void CALLCONVENTION tqsl_freeDeletedLocationList ( char **  list,
int  nloc 
)

Free the list of restorable station locations.

◆ tqsl_freeStationDataEnc()

DLLEXPORT int CALLCONVENTION tqsl_freeStationDataEnc ( tQSL_StationDataEnc  sdata)

Free the pointer returned by tqsl_getStationDataEnc(tQSL_StationDataEnc*)

◆ tqsl_getADIFMode()

DLLEXPORT int CALLCONVENTION tqsl_getADIFMode ( const char *  adif_item,
char *  mode,
int  nmode 
)

Map an ADIF mode to its TQSL equivalent.

◆ tqsl_getADIFModeEntry()

DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry ( int  index,
const char **  mode 
)

Get an ADIF mode by its index.

mode - The ADIF mode name

◆ tqsl_getADIFSubMode()

DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode ( const char *  adif_item,
char *  mode,
char *  submode,
int  nmode 
)

Map a GABBI mode to its mode/submode pair.

◆ tqsl_getBand()

DLLEXPORT int CALLCONVENTION tqsl_getBand ( int  index,
const char **  name,
const char **  spectrum,
int *  low,
int *  high 
)

Get a band by its index.

name - The GAABI name of the band. spectrum - HF | VHF | UHF low - The low end of the band in kHz (HF) or MHz (VHF/UHF) high - The low high of the band in kHz (HF) or MHz (VHF/UHF)

Note: spectrum, low and/or high may be NULL.

◆ tqsl_getCabrilloMapEntry()

DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry ( const char *  contest,
int *  fieldnum,
int *  contest_type 
)

Get the mapping of a Cabrillo contest name (as found in the CONTEST line of a Cabrillo file) to a call-worked field number and the contest type.

fieldnum will be set to 0 if the contest name isn't in the Cabrillo map. Otherwise it is set to the QSO line field number of the call-worked field, with field counting starting at 1.

contest_type may be NULL. If not, it is set to the Cabrillo contest type (TQSL_CABRILLO_HF or TQSL_CABRILLO_VHF), defined in cabrillo.h.

◆ tqsl_getCallsignLocationInfo()

DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo ( const char *  callsign,
char **  buf 
)

Retrieve the json results for a given callsign location Detail.

◆ tqsl_getCurrentStationLocationCapturePage()

DLLEXPORT int CALLCONVENTION tqsl_getCurrentStationLocationCapturePage ( tQSL_Location  loc,
int *  page 
)

Return the current page in the page sequence.

◆ tqsl_getDeletedStationLocations()

DLLEXPORT int CALLCONVENTION tqsl_getDeletedStationLocations ( char ***  locp,
int *  nloc 
)

Get the list of restorable station locations.

◆ tqsl_getDXCCDeleted()

DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted ( int  number,
int *  deleted 
)

Get the deleted status of a DXCC Entity by its DXCC number.

◆ tqsl_getDXCCEndDate()

DLLEXPORT int CALLCONVENTION tqsl_getDXCCEndDate ( int  number,
tQSL_Date d 
)

Get the end date of a DXCC Entity by its DXCC number.

◆ tqsl_getDXCCEntity()

DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity ( int  index,
int *  number,
const char **  name 
)

Get a DXCC entity from the list of DXCC entities by its index.

◆ tqsl_getDXCCEntityName()

DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName ( int  number,
const char **  name 
)

Get the name of a DXCC Entity by its DXCC number.

◆ tqsl_getDXCCStartDate()

DLLEXPORT int CALLCONVENTION tqsl_getDXCCStartDate ( int  number,
tQSL_Date d 
)

Get the start date of a DXCC Entity by its DXCC number.

◆ tqsl_getDXCCZoneMap()

DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap ( int  number,
const char **  zonemap 
)

Get the zonemap of a DXCC Entity by its DXCC number.

◆ tqsl_getGABBItCERT()

DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCERT ( tQSL_Cert  cert,
int  uid 
)

Get a GABBI record that contains the certificate.

uid is the value for the CERT_UID field

Returns the NULL pointer on error.

N.B. On systems that distinguish text-mode files from binary-mode files, notably Windows, the GABBI records should be written in binary mode.

◆ tqsl_getGABBItCONTACT()

DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACT ( tQSL_Cert  cert,
tQSL_Location  loc,
TQSL_QSO_RECORD qso,
int  stationuid 
)

Get a GABBI record that contains the QSO data.

  • stationuid is the value of the associated STATION_UID field.

N.B.: If cert is not initialized for signing (see tqsl_beginSigning()) the function will return with a TQSL_SIGNINIT_ERROR error.

Returns the NULL pointer on error.

N.B. On systems that distinguish text-mode files from binary-mode files, notably Windows, the GABBI records should be written in binary mode.

◆ tqsl_getGABBItCONTACTData()

DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACTData ( tQSL_Cert  cert,
tQSL_Location  loc,
TQSL_QSO_RECORD qso,
int  stationuid,
char *  signdata,
int  sdlen 
)

Get a GABBI record that contains the QSO data along with the associated signdata (QSO data signed to validate the QSO).

  • stationuid is the value of the associated STATION_UID field.

N.B.: If cert is not initialized for signing (see tqsl_beginSigning()) the function will return with a TQSL_SIGNINIT_ERROR error.

Returns the NULL pointer on error.

N.B. On systems that distinguish text-mode files from binary-mode files, notably Windows, the GABBI records should be written in binary mode.

◆ tqsl_getGABBItSTATION()

DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItSTATION ( tQSL_Location  loc,
int  uid,
int  certuid 
)

Get a GABBI record that contains the Station Location data.

  • uid is the value for the STATION_UID field.
  • certuid is the value of the associated CERT_UID field.

Returns the NULL pointer on error.

N.B. On systems that distinguish text-mode files from binary-mode files, notably Windows, the GABBI records should be written in binary mode.

◆ tqsl_getLocationCallSign()

DLLEXPORT int CALLCONVENTION tqsl_getLocationCallSign ( tQSL_Location  loc,
char *  buf,
int  bufsiz 
)

Get the call sign from the station location.

◆ tqsl_getLocationDXCCEntity()

DLLEXPORT int CALLCONVENTION tqsl_getLocationDXCCEntity ( tQSL_Location  loc,
int *  dxcc 
)

Get the DXCC entity from the station location.

◆ tqsl_getLocationField()

DLLEXPORT int CALLCONVENTION tqsl_getLocationField ( tQSL_Location  locp,
const char *  field,
char *  buf,
int  bufsiz 
)

Get a field from the station location.

◆ tqsl_getLocationFieldChanged()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldChanged ( tQSL_Location  loc,
int  field_num,
int *  changed 
)

Get the changed status of a field. The changed flag is set to 1 if the field's pick list was changed during the last call to tqsl_updateStationLocationCapture or zero if the list was not changed.

◆ tqsl_getLocationFieldCharData()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData ( tQSL_Location  loc,
int  field_num,
char *  buf,
int  bufsiz 
)

Get the character data from the specified field.

If the field input type (see tqsl_getLocationFieldInputType()) is TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST, this will return the text of the selected item.

◆ tqsl_getLocationFieldDataGABBI()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI ( tQSL_Location  loc,
int  field_num,
char *  buf,
int  bufsiz 
)

Get the GABBI name of the specified field

◆ tqsl_getLocationFieldDataGABBISize()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize ( tQSL_Location  loc,
int  field_num,
int *  rval 
)

Get the size of the GABBI name of the specified field

◆ tqsl_getLocationFieldDataLabel()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel ( tQSL_Location  loc,
int  field_num,
char *  buf,
int  bufsiz 
)

Get the label for the specified field

◆ tqsl_getLocationFieldDataLabelSize()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize ( tQSL_Location  loc,
int  field_num,
int *  rval 
)

Get the number of characters in the label for the specified field

◆ tqsl_getLocationFieldDataLength()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLength ( tQSL_Location  loc,
int  field_num,
int *  rval 
)

Get the length of the input field data.

◆ tqsl_getLocationFieldDataType()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataType ( tQSL_Location  loc,
int  field_num,
int *  type 
)

Get the data type of the input field.

type will be either TQSL_LOCATION_FIELD_CHAR or TQSL_LOCATION_FIELD_INT

◆ tqsl_getLocationFieldFlags()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldFlags ( tQSL_Location  loc,
int  field_num,
int *  flags 
)

Get the flags for the input field.

flags will be either TQSL_LOCATION_FIELD_UPPER Field is to be uppercased on input TQSL_LOCATION_FIELD_MUSTSEL Value must be selected TQSL_LOCATION_FIELD_SELNXT Value must be selected to allow Next/Finish

◆ tqsl_getLocationFieldIndex()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIndex ( tQSL_Location  loc,
int  field_num,
int *  dat 
)

If the field input type (see tqsl_getLocationFieldInputType()) is TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST, gets the index of the selected list item.

◆ tqsl_getLocationFieldInputType()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldInputType ( tQSL_Location  loc,
int  field_num,
int *  type 
)

Get the input type of the input field.

type will be one of TQSL_LOCATION_FIELD_TEXT, TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST

◆ tqsl_getLocationFieldIntData()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIntData ( tQSL_Location  loc,
int  field_num,
int *  dat 
)

Get the integer data from the specified field.

This is only meaningful if the field data type (see tqsl_getLocationFieldDataType()) is TQSL_LOCATION_FIELD_INT.

◆ tqsl_getLocationFieldLabel()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel ( tQSL_Location  locp,
const char *  field,
char *  buf,
int  bufsiz 
)

Get a field label from the station location.

◆ tqsl_getLocationFieldListItem()

DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem ( tQSL_Location  loc,
int  field_num,
int  item_idx,
char *  buf,
int  bufsiz 
)

Get the text of a specified item of a specified field

◆ tqsl_getLocationQSODetails()

DLLEXPORT int CALLCONVENTION tqsl_getLocationQSODetails ( tQSL_Location  locp,
char *  buf,
int  buflen 
)

Get the QSO details in canonical form.

◆ tqsl_getLocationStationDetails()

DLLEXPORT int CALLCONVENTION tqsl_getLocationStationDetails ( tQSL_Location  locp,
char *  buf,
int  buflen 
)

Get the station location details in canonical form.

◆ tqsl_getMode()

DLLEXPORT int CALLCONVENTION tqsl_getMode ( int  index,
const char **  mode,
const char **  group 
)

Get a mode by its index.

mode - The GAABI mode name group - CW | PHONE | IMAGE | DATA

Note: group may be NULL.

◆ tqsl_getNextStationLocationCapturePage()

DLLEXPORT int CALLCONVENTION tqsl_getNextStationLocationCapturePage ( tQSL_Location  loc,
int *  page 
)

Return the next page to in the page sequence

◆ tqsl_getNumADIFMode()

DLLEXPORT int CALLCONVENTION tqsl_getNumADIFMode ( int *  number)

Get the number of ADIF Mode entries in the Mode list

◆ tqsl_getNumBand()

DLLEXPORT int CALLCONVENTION tqsl_getNumBand ( int *  number)

Get the number of Band entries in the Band list

◆ tqsl_getNumDXCCEntity()

DLLEXPORT int CALLCONVENTION tqsl_getNumDXCCEntity ( int *  number)

Get the number of DXCC entities in the primary DXCC list.

◆ tqsl_getNumLocationField()

DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField ( tQSL_Location  loc,
int *  numf 
)

Get the number of fields on the current station location page

Get the input type of the input field.

type will be one of TQSL_LOCATION_FIELD_TEXT, TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST Get the number of fields on the current station location page

◆ tqsl_getNumLocationFieldListItems()

DLLEXPORT int CALLCONVENTION tqsl_getNumLocationFieldListItems ( tQSL_Location  loc,
int  field_num,
int *  rval 
)

Get the number of items in the specified field's pick list.

◆ tqsl_getNumMode()

DLLEXPORT int CALLCONVENTION tqsl_getNumMode ( int *  number)

Get the number of Mode entries in the Mode list

◆ tqsl_getNumPropagationMode()

DLLEXPORT int CALLCONVENTION tqsl_getNumPropagationMode ( int *  number)

Get the number of Propagation Mode entries in the Propagation Mode list

◆ tqsl_getNumSatellite()

DLLEXPORT int CALLCONVENTION tqsl_getNumSatellite ( int *  number)

Get the number of Satellite entries in the Satellite list

◆ tqsl_getNumStationLocationCapturePages()

DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocationCapturePages ( tQSL_Location  loc,
int *  npages 
)

Return the number of station location capture pages.

◆ tqsl_getNumStationLocations()

DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocations ( tQSL_Location  loc,
int *  nloc 
)

Get the number of saved station locations

◆ tqsl_getPrevStationLocationCapturePage()

DLLEXPORT int CALLCONVENTION tqsl_getPrevStationLocationCapturePage ( tQSL_Location  loc,
int *  page 
)

Return the previous page in the page sequence.

◆ tqsl_getPropagationMode()

DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode ( int  index,
const char **  name,
const char **  descrip 
)

Get a propagation mode by its index.

name - The GAABI propagation mode name descrip - Text description of the propagation mode

Note: descrip may be NULL.

◆ tqsl_getSatellite()

DLLEXPORT int CALLCONVENTION tqsl_getSatellite ( int  index,
const char **  name,
const char **  descrip,
tQSL_Date start,
tQSL_Date end 
)

Get a satellite by its index.

name - The GAABI satellite name descrip - Text description of the satellite start - The date the satellite entered service end - The last date the satellite was in service

Note: descrip, start and/or end may be NULL.

◆ tqsl_getStationDataEnc()

DLLEXPORT int CALLCONVENTION tqsl_getStationDataEnc ( tQSL_StationDataEnc sdata)

Return the contents of the station data file as a byte stream. The caller is required to tqsl_freeStationDataEnc() this pointer when done with it.

◆ tqsl_getStationLocation()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocation ( tQSL_Location loc,
const char *  name 
)

Retrieve a saved station location. Once finished with the station location, tqsl_endStationLocationCapture() should be called to release resources.

◆ tqsl_getStationLocationCallSign()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCallSign ( tQSL_Location  loc,
int  idx,
char *  buf,
int  bufsiz 
)

Get the call sign from the station location

◆ tqsl_getStationLocationCaptureName()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCaptureName ( tQSL_Location  loc,
char *  namebuf,
int  bufsiz 
)

Get the name of the station location

◆ tqsl_getStationLocationCapturePage()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCapturePage ( tQSL_Location  loc,
int *  page 
)

Get the current page number

◆ tqsl_getStationLocationErrors()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocationErrors ( tQSL_Location  loc,
char *  buf,
int  bufsiz 
)

Get any errors returned from parsing the selected station location. This should be called after tqsl_getStationLocation to determine if any of the existing fields failed validation. Currently only zone data is validated here, but future validations for things like properly formatted grid squares is likely.

◆ tqsl_getStationLocationField()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField ( tQSL_Location  locp,
const char *  name,
char *  namebuf,
int  bufsize 
)

Get a named field from the station location

◆ tqsl_getStationLocationName()

DLLEXPORT int CALLCONVENTION tqsl_getStationLocationName ( tQSL_Location  loc,
int  idx,
char *  buf,
int  bufsiz 
)

Get the name of the specified (by idx) saved station location

◆ tqsl_hasNextStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_hasNextStationLocationCapture ( tQSL_Location  loc,
int *  rval 
)

Returns 1 (in rval) if there is a next page

◆ tqsl_hasPrevStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_hasPrevStationLocationCapture ( tQSL_Location  loc,
int *  rval 
)

Returns 1 (in rval) if there is a previous page

◆ tqsl_initStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_initStationLocationCapture ( tQSL_Location locp)

Begin the process of generating a station record

◆ tqsl_mergeStationLocations()

DLLEXPORT int CALLCONVENTION tqsl_mergeStationLocations ( const char *  locdata)

Merge saved location data with existing

◆ tqsl_nextStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_nextStationLocationCapture ( tQSL_Location  loc)

Advance the page to the next one in the page sequence

◆ tqsl_prevStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_prevStationLocationCapture ( tQSL_Location  loc)

Return the page to the previous one in the page sequence.

◆ tqsl_restoreStationLocation()

DLLEXPORT int CALLCONVENTION tqsl_restoreStationLocation ( const char *  name)

Restore the deleted station location by name.

◆ tqsl_saveCallsignLocationInfo()

DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo ( const char *  callsign,
const char *  json 
)

Save the json results for a given callsign location Detail.

◆ tqsl_saveStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_saveStationLocationCapture ( tQSL_Location  loc,
int  overwrite 
)

Save the station location data. Note that the name must have been set via tqsl_setStationLocationCaptureName if this is a new station location. If the overwrite parameter is zero and a station location of that name is already in existence, an error occurs with tQSL_Error set to TQSL_NAME_EXISTS.

◆ tqsl_setADIFMode()

DLLEXPORT int CALLCONVENTION tqsl_setADIFMode ( const char *  adif_item,
const char *  mode 
)

Set the mapping of an ADIF mode to a TQSL mode.

◆ tqsl_setCabrilloMapEntry()

DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry ( const char *  contest,
int  field,
int  contest_type 
)

Set the mapping of a Cabrillo contest name (as found in the CONTEST line of a Cabrillo file) to the QSO line call-worked field number and the contest type.

field can have a value of TQSL_MIN_CABRILLO_MAP_FIELD (cabrillo.h) or greater. Field number starts at 1.

contest_type must be TQSL_CABRILLO_HF or TQSL_CABRILLO_VHF, defined in cabrillo.h

◆ tqsl_setLocationCallSign()

DLLEXPORT int CALLCONVENTION tqsl_setLocationCallSign ( tQSL_Location  loc,
const char *  buf,
int  dxcc 
)

Set the call sign for the station location.

◆ tqsl_setLocationField()

DLLEXPORT int CALLCONVENTION tqsl_setLocationField ( tQSL_Location  locp,
const char *  field,
const char *  buf 
)

Set a field in a station location.

◆ tqsl_setLocationFieldCharData()

DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldCharData ( tQSL_Location  loc,
int  field_num,
const char *  buf 
)

Set the text data of a specified field.

◆ tqsl_setLocationFieldIndex()

DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIndex ( tQSL_Location  loc,
int  field_num,
int  dat 
)

If the field input type (see tqsl_getLocationFieldInputType()) is TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST, sets the index of the selected list item.

◆ tqsl_setLocationFieldIntData()

DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIntData ( tQSL_Location  loc,
int  field_num,
int  dat 
)

Set the integer data of a specified field.

◆ tqsl_setStationLocationCaptureName()

DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCaptureName ( tQSL_Location  loc,
const char *  name 
)

Set the name of the station location

◆ tqsl_setStationLocationCapturePage()

DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCapturePage ( tQSL_Location  loc,
int  page 
)

Set the current page number. Typically, the page number will be 1 (the starting page) or a value obtained from tqsl_getStationLocationCapturePage().

◆ tqsl_setStationLocationCertFlags()

DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCertFlags ( tQSL_Location  loc,
int  flags 
)

Set the certificate flags used in a location page. This is used to enable expired certs (or disable).

◆ tqsl_updateStationLocationCapture()

DLLEXPORT int CALLCONVENTION tqsl_updateStationLocationCapture ( tQSL_Location  loc)

Update the pages based on the currently selected settings.

tqsl-2.8.1/src/doxygen/html/group__Sign.html0000644000175000017500000004471715003421124021061 0ustar rmurphyrmurphy TrustedQSL Library API: Signing API
TrustedQSL Library API
Signing API

Functions

DLLEXPORT int CALLCONVENTION tqsl_beginSigning (tQSL_Cert cert, char *password, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user)
 
DLLEXPORT int CALLCONVENTION tqsl_checkSigningStatus (tQSL_Cert cert)
 
DLLEXPORT int CALLCONVENTION tqsl_getMaxSignatureSize (tQSL_Cert cert, int *sigsize)
 
DLLEXPORT int CALLCONVENTION tqsl_signDataBlock (tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int *siglen)
 
DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock (tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int siglen)
 
DLLEXPORT int CALLCONVENTION tqsl_signQSORecord (tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *rec, unsigned char *sig, int *siglen)
 
DLLEXPORT int CALLCONVENTION tqsl_endSigning (tQSL_Cert cert)
 

Detailed Description

The Signing API uses a tQSL_Cert (see Certificate Handling API) to digitally sign a block of data.

Function Documentation

◆ tqsl_beginSigning()

DLLEXPORT int CALLCONVENTION tqsl_beginSigning ( tQSL_Cert  cert,
char *  password,
int(*)(char *pwbuf, int pwsize, void *userdata)  pwcb,
void *  user 
)

Initialize the tQSL_Cert object for use in signing.

This produces an unencrypted copy of the private key in memory.

if password is not NULL, it must point to the password to use to decrypt the private key. If password is NULL and pwcb is not NULL, pwcb is called to get the password. If the private key is encrypted and both password and pwcb are NULL, or if the supplied password fails to decrypt the key, a TQSL_PASSWORD_ERROR error is returned.

pwcb parameters: pwbuf is a pointer to a buffer of pwsize chars. The buffer should be NUL-terminated.

◆ tqsl_checkSigningStatus()

DLLEXPORT int CALLCONVENTION tqsl_checkSigningStatus ( tQSL_Cert  cert)

Test whether the tQSL_Cert object is initialized for signing.

Returns 0 if initialized. Sets tQSL_Error to TQSL_SIGNINIT_ERROR if not.

◆ tqsl_endSigning()

DLLEXPORT int CALLCONVENTION tqsl_endSigning ( tQSL_Cert  cert)

Terminate signing operations for this tQSL_Cert object.

This zero-fills the unencrypted private key in memory.

◆ tqsl_getMaxSignatureSize()

DLLEXPORT int CALLCONVENTION tqsl_getMaxSignatureSize ( tQSL_Cert  cert,
int *  sigsize 
)

Get the maximum size of a signature block that will be produced when the tQSL_Cert is used to sign data. (Note that the size of the signature block is unaffected by the size of the data block being signed.)

◆ tqsl_signDataBlock()

DLLEXPORT int CALLCONVENTION tqsl_signDataBlock ( tQSL_Cert  cert,
const unsigned char *  data,
int  datalen,
unsigned char *  sig,
int *  siglen 
)

Sign a data block.

tqsl_beginSigning() must have been called for the tQSL_Cert object before calling this function.

◆ tqsl_signQSORecord()

DLLEXPORT int CALLCONVENTION tqsl_signQSORecord ( tQSL_Cert  cert,
tQSL_Location  loc,
TQSL_QSO_RECORD rec,
unsigned char *  sig,
int *  siglen 
)

Sign a single QSO record

tqsl_beginSigning() must have been called for the tQSL_Cert object before calling this function.

loc must be a valid tQSL_Location object. See Data API.

◆ tqsl_verifyDataBlock()

DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock ( tQSL_Cert  cert,
const unsigned char *  data,
int  datalen,
unsigned char *  sig,
int  siglen 
)

Verify a signed data block.

tqsl_beginSigning() need not have been called.

tqsl-2.8.1/src/doxygen/html/group__Util.html0000644000175000017500000011776515003421124021102 0ustar rmurphyrmurphy TrustedQSL Library API: Utility API
TrustedQSL Library API
Utility API

Functions

DLLEXPORT int CALLCONVENTION tqsl_init ()
 
DLLEXPORT int CALLCONVENTION tqsl_setDirectory (const char *dir)
 
DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString ()
 
DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString_v (int err)
 
DLLEXPORT int CALLCONVENTION tqsl_encodeBase64 (const unsigned char *data, int datalen, char *output, int outputlen)
 
DLLEXPORT int CALLCONVENTION tqsl_decodeBase64 (const char *input, unsigned char *data, int *datalen)
 
DLLEXPORT int CALLCONVENTION tqsl_initDate (tQSL_Date *date, const char *str)
 
DLLEXPORT int CALLCONVENTION tqsl_initTime (tQSL_Time *time, const char *str)
 
DLLEXPORT int CALLCONVENTION tqsl_compareDates (const tQSL_Date *a, const tQSL_Date *b)
 
DLLEXPORT int CALLCONVENTION tqsl_subtractDates (const tQSL_Date *a, const tQSL_Date *b, int *diff)
 
DLLEXPORT char *CALLCONVENTION tqsl_convertDateToText (const tQSL_Date *date, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_isDateValid (const tQSL_Date *d)
 
DLLEXPORT int CALLCONVENTION tqsl_isDateNull (const tQSL_Date *d)
 
DLLEXPORT int CALLCONVENTION tqsl_isTimeValid (const tQSL_Time *t)
 
DLLEXPORT char *CALLCONVENTION tqsl_convertTimeToText (const tQSL_Time *time, char *buf, int bufsiz)
 
DLLEXPORT int CALLCONVENTION tqsl_getVersion (int *major, int *minor)
 
DLLEXPORT int CALLCONVENTION tqsl_getConfigVersion (int *major, int *minor)
 

Variables

DLLEXPORTDATA int tQSL_Error
 Error code from most recent tQSL library call.
 
DLLEXPORTDATA TQSL_ADIF_GET_FIELD_ERROR tQSL_ADIF_Error
 The ADIF error code.
 
DLLEXPORTDATA TQSL_CABRILLO_ERROR_TYPE tQSL_Cabrillo_Error
 The ADIF error code.
 
DLLEXPORTDATA char tQSL_ErrorFile [TQSL_MAX_PATH_LEN]
 File name of file giving error. (May be empty.)
 
DLLEXPORTDATA char tQSL_CustomError [256]
 Custom error message string.
 
DLLEXPORTDATA int tQSL_Errno
 System errno - stored when tQSL_Error == TQSL_SYSTEM_ERROR.
 
DLLEXPORTDATA char tQSL_ImportCall [256]
 Callsign used in import - used for missing public key error.
 
DLLEXPORTDATA long tQSL_ImportSerial
 Serial number of recent certificate import.
 
DLLEXPORTDATA FILE * tQSL_DiagFile
 Diagnostic log file.
 

Detailed Description

Function Documentation

◆ tqsl_compareDates()

DLLEXPORT int CALLCONVENTION tqsl_compareDates ( const tQSL_Date a,
const tQSL_Date b 
)

Compare two tQSL_Date objects.

Returns:

  • -1 if a < b
  • 0 if a == b
  • 1 if a > b

◆ tqsl_convertDateToText()

DLLEXPORT char *CALLCONVENTION tqsl_convertDateToText ( const tQSL_Date date,
char *  buf,
int  bufsiz 
)

Converts a tQSL_Date object to a YYYY-MM-DD string.

Returns a pointer to buf or NULL on error

◆ tqsl_convertTimeToText()

DLLEXPORT char *CALLCONVENTION tqsl_convertTimeToText ( const tQSL_Time time,
char *  buf,
int  bufsiz 
)

Converts a tQSL_Time object to a HH:MM:SSZ string.

Returns a pointer to buf or NULL on error

◆ tqsl_decodeBase64()

DLLEXPORT int CALLCONVENTION tqsl_decodeBase64 ( const char *  input,
unsigned char *  data,
int *  datalen 
)

Decode Base64 text into binary data.

  • input = NUL-terminated text string of Base64-encoded data
  • data = pointer to output buffer
  • datalen = pointer to int containing the size of the output buffer in bytes

Places the number of resulting data bytes into *datalen.

◆ tqsl_encodeBase64()

DLLEXPORT int CALLCONVENTION tqsl_encodeBase64 ( const unsigned char *  data,
int  datalen,
char *  output,
int  outputlen 
)

Encode a block of data into Base64 text.

  • data = block of data to encode
  • datalen = length of data in bytes
  • output = pointer to output buffer
  • outputlen = size of output buffer in bytes

◆ tqsl_getConfigVersion()

DLLEXPORT int CALLCONVENTION tqsl_getConfigVersion ( int *  major,
int *  minor 
)

Returns the configuration-file version. major and/or minor may be NULL.

◆ tqsl_getErrorString()

DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString ( )

Gets the error string for the current tQSL library error and resets the error status. See tqsl_getErrorString_v().

◆ tqsl_getErrorString_v()

DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString_v ( int  err)

Gets the error string corresponding to the given error number. The error string is available only until the next call to tqsl_getErrorString_v or tqsl_getErrorString.

◆ tqsl_getVersion()

DLLEXPORT int CALLCONVENTION tqsl_getVersion ( int *  major,
int *  minor 
)

Returns the library version. major and/or minor may be NULL.

◆ tqsl_init()

DLLEXPORT int CALLCONVENTION tqsl_init ( )

Initialize the tQSL library

This function should be called prior to calling any other library functions.

◆ tqsl_initDate()

DLLEXPORT int CALLCONVENTION tqsl_initDate ( tQSL_Date date,
const char *  str 
)

Initialize a tQSL_Date object from a date string.

The date string must be YYYY-MM-DD or YYYYMMDD format.

Returns 0 on success, nonzero on failure

◆ tqsl_initTime()

DLLEXPORT int CALLCONVENTION tqsl_initTime ( tQSL_Time time,
const char *  str 
)

Initialize a tQSL_Time object from a time string.

The time string must be HH[:]MM[[:]SS] format.

Returns 0 on success, nonzero on failure

◆ tqsl_isDateNull()

DLLEXPORT int CALLCONVENTION tqsl_isDateNull ( const tQSL_Date d)

Test whether a tQSL_Date is empty (contains all zeroes)

Returns 1 if the date is null

◆ tqsl_isDateValid()

DLLEXPORT int CALLCONVENTION tqsl_isDateValid ( const tQSL_Date d)

Test whether a tQSL_Date contains a valid date value

Returns 1 if the date is valid

◆ tqsl_isTimeValid()

DLLEXPORT int CALLCONVENTION tqsl_isTimeValid ( const tQSL_Time t)

Test whether a tQSL_Time contains a valid time value

Returns 1 if the time is valid

◆ tqsl_setDirectory()

DLLEXPORT int CALLCONVENTION tqsl_setDirectory ( const char *  dir)

Set the directory where the TQSL files are kept. May be called either before of after tqsl_init(), but should be called before calling any other functions in the library.

Note that this is purely optional. The library will figure out an appropriate directory if tqsl_setDirectory isn't called. Unless there is some particular need to set the directory explicitly, programs should refrain from doing so.

◆ tqsl_subtractDates()

DLLEXPORT int CALLCONVENTION tqsl_subtractDates ( const tQSL_Date a,
const tQSL_Date b,
int *  diff 
)

Calculate the number of days between two tQSL_Date objects.

Returns a positive result if the first date is earlier, otherwise negative.

Variable Documentation

◆ tQSL_Error

DLLEXPORTDATA int tQSL_Error
extern

Error code from most recent tQSL library call.

The values for the error code are defined in tqslerrno.h

tqsl-2.8.1/src/doxygen/html/index.html0000644000175000017500000000762415003421124017711 0ustar rmurphyrmurphy TrustedQSL Library API: TrustedQSL Library API
TrustedQSL Library API
TrustedQSL Library API

The TrustedQSL library API is divided into several groups:

  • Certificate Handling API - Request, load and retrieve digital certificates
  • Data API - Manage station-location data and produce signed data records
  • Converter API - Convert and sign ADIF and Cabrillo log files
  • Utility API - Functions to operate on objects, set system parameters, and report errors
  • Signing API - Low-level digital signing
  • ADIF API - Low-level parsing and creation of ADIF files
  • Cabrillo API - Low-level parsing of Cabrillo files.

Most of the library functions return an integer value that is zero if there is no error and 1 if there is an error. The specific error can be determined by examining tQSL_Error and, possibly, tQSL_ADIF_Error, tQSL_Cabrillo_Error, tQSL_ErrorFile and tQSL_CustomError. The tqsl_getErrorString() and tqsl_getErrorString_v() functions can be used to get error text strings.

tqsl-2.8.1/src/doxygen/html/jquery.js0000644000175000017500000053076615003421124017601 0ustar rmurphyrmurphy/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 * http://www.smartmenus.org/ * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});tqsl-2.8.1/src/doxygen/html/menu.js0000644000175000017500000001344515003421124017214 0ustar rmurphyrmurphy/* @licstart The following is the entire license notice for the JavaScript code in this file. The MIT License (MIT) Copyright (C) 1997-2020 by Dimitri van Heesch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @licend The above is the entire license notice for the JavaScript code in this file */ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { function makeTree(data,relPath) { var result=''; if ('children' in data) { result+='
    '; for (var i in data.children) { var url; var link; link = data.children[i].url; if (link.substring(0,1)=='^') { url = link.substring(1); } else { url = relPath+link; } result+='
  • '+ data.children[i].text+''+ makeTree(data.children[i],relPath)+'
  • '; } result+='
'; } return result; } var searchBoxHtml; if (searchEnabled) { if (serverSide) { searchBoxHtml='
'+ '
'+ '
 '+ ''+ '
'+ '
'+ '
'+ '
'; } else { searchBoxHtml='
'+ ''+ ' '+ ''+ ''+ ''+ ''+ ''+ '
'; } } $('#main-nav').before('
'+ ''+ ''+ '
'); $('#main-nav').append(makeTree(menudata,relPath)); $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); if (searchBoxHtml) { $('#main-menu').append('
  • '); } var $mainMenuState = $('#main-menu-state'); var prevWidth = 0; if ($mainMenuState.length) { function initResizableIfExists() { if (typeof initResizable==='function') initResizable(); } // animate mobile menu $mainMenuState.change(function(e) { var $menu = $('#main-menu'); var options = { duration: 250, step: initResizableIfExists }; if (this.checked) { options['complete'] = function() { $menu.css('display', 'block') }; $menu.hide().slideDown(options); } else { options['complete'] = function() { $menu.css('display', 'none') }; $menu.show().slideUp(options); } }); // set default menu visibility function resetState() { var $menu = $('#main-menu'); var $mainMenuState = $('#main-menu-state'); var newWidth = $(window).outerWidth(); if (newWidth!=prevWidth) { if ($(window).outerWidth()<768) { $mainMenuState.prop('checked',false); $menu.hide(); $('#searchBoxPos1').html(searchBoxHtml); $('#searchBoxPos2').hide(); } else { $menu.show(); $('#searchBoxPos1').empty(); $('#searchBoxPos2').html(searchBoxHtml); $('#searchBoxPos2').show(); } if (typeof searchBox!=='undefined') { searchBox.CloseResultsWindow(); } prevWidth = newWidth; } } $(window).ready(function() { resetState(); initResizableIfExists(); }); $(window).resize(resetState); } $('#main-menu').smartmenus(); } /* @license-end */ tqsl-2.8.1/src/doxygen/html/menudata.js0000644000175000017500000001000315003421124020031 0ustar rmurphyrmurphy/* @licstart The following is the entire license notice for the JavaScript code in this file. The MIT License (MIT) Copyright (C) 1997-2020 by Dimitri van Heesch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @licend The above is the entire license notice for the JavaScript code in this file */ var menudata={children:[ {text:"Main Page",url:"index.html"}, {text:"Modules",url:"modules.html"}, {text:"Classes",url:"annotated.html",children:[ {text:"Class List",url:"annotated.html"}, {text:"Class Members",url:"functions.html",children:[ {text:"All",url:"functions.html",children:[ {text:"a",url:"functions.html#index_a"}, {text:"b",url:"functions.html#index_b"}, {text:"c",url:"functions.html#index_c"}, {text:"d",url:"functions.html#index_d"}, {text:"e",url:"functions.html#index_e"}, {text:"f",url:"functions.html#index_f"}, {text:"h",url:"functions.html#index_h"}, {text:"l",url:"functions.html#index_l"}, {text:"m",url:"functions.html#index_m"}, {text:"n",url:"functions.html#index_n"}, {text:"o",url:"functions.html#index_o"}, {text:"p",url:"functions.html#index_p"}, {text:"q",url:"functions.html#index_q"}, {text:"r",url:"functions.html#index_r"}, {text:"s",url:"functions.html#index_s"}, {text:"t",url:"functions.html#index_t"}, {text:"u",url:"functions.html#index_u"}, {text:"v",url:"functions.html#index_v"}, {text:"y",url:"functions.html#index_y"}]}, {text:"Variables",url:"functions_vars.html",children:[ {text:"a",url:"functions_vars.html#index_a"}, {text:"b",url:"functions_vars.html#index_b"}, {text:"c",url:"functions_vars.html#index_c"}, {text:"d",url:"functions_vars.html#index_d"}, {text:"e",url:"functions_vars.html#index_e"}, {text:"f",url:"functions_vars.html#index_f"}, {text:"h",url:"functions_vars.html#index_h"}, {text:"l",url:"functions_vars.html#index_l"}, {text:"m",url:"functions_vars.html#index_m"}, {text:"n",url:"functions_vars.html#index_n"}, {text:"o",url:"functions_vars.html#index_o"}, {text:"p",url:"functions_vars.html#index_p"}, {text:"q",url:"functions_vars.html#index_q"}, {text:"r",url:"functions_vars.html#index_r"}, {text:"s",url:"functions_vars.html#index_s"}, {text:"t",url:"functions_vars.html#index_t"}, {text:"u",url:"functions_vars.html#index_u"}, {text:"v",url:"functions_vars.html#index_v"}, {text:"y",url:"functions_vars.html#index_y"}]}]}]}, {text:"Files",url:"files.html",children:[ {text:"File List",url:"files.html"}, {text:"File Members",url:"globals.html",children:[ {text:"All",url:"globals.html",children:[ {text:"c",url:"globals.html#index_c"}, {text:"d",url:"globals_d.html#index_d"}, {text:"p",url:"globals_p.html#index_p"}, {text:"t",url:"globals_t.html#index_t"}]}, {text:"Functions",url:"globals_func.html",children:[ {text:"t",url:"globals_func.html#index_t"}]}, {text:"Variables",url:"globals_vars.html"}, {text:"Typedefs",url:"globals_type.html"}, {text:"Enumerations",url:"globals_enum.html"}, {text:"Macros",url:"globals_defs.html",children:[ {text:"c",url:"globals_defs.html#index_c"}, {text:"d",url:"globals_defs.html#index_d"}, {text:"p",url:"globals_defs.html#index_p"}, {text:"t",url:"globals_defs.html#index_t"}]}]}]}]} tqsl-2.8.1/src/doxygen/html/modules.html0000644000175000017500000000665315003421124020253 0ustar rmurphyrmurphy TrustedQSL Library API: Modules
    TrustedQSL Library API
    Modules
    tqsl-2.8.1/src/doxygen/html/nav_f.png0000644000175000017500000000023115003421124017476 0ustar rmurphyrmurphyPNG  IHDR8`IDATxK Eі[BmkHprӼ.ꎤR6Z VIE5jliIJ0/u޿6sH yIENDB`tqsl-2.8.1/src/doxygen/html/nav_fd.png0000644000175000017500000000025115003421124017644 0ustar rmurphyrmurphyPNG  IHDR8pIDATxM F ((jMM[73o@s ´K̑ y=[>P\U/gdHȢ(zNC.??;y@AKIENDB`tqsl-2.8.1/src/doxygen/html/nav_g.png0000644000175000017500000000013715003421124017504 0ustar rmurphyrmurphyPNG  IHDR1&IDATx1 OHf_ ->~M iMS<IENDB`tqsl-2.8.1/src/doxygen/html/nav_h.png0000644000175000017500000000014215003421124017501 0ustar rmurphyrmurphyPNG  IHDR ,@)IDATxA @BQۛТ) ) aܿoRlIENDB`tqsl-2.8.1/src/doxygen/html/nav_hd.png0000644000175000017500000000016215003421124017647 0ustar rmurphyrmurphyPNG  IHDR ,@9IDATxݻ Q ;r5 W v?P_E27jA v #IENDB`tqsl-2.8.1/src/doxygen/html/open.png0000644000175000017500000000017315003421124017353 0ustar rmurphyrmurphyPNG  IHDR BIDATx 0 ׬ՙ\39b!9{|I>$#ߴ8/z/>2[giU,/~\ 9ٸIENDB`tqsl-2.8.1/src/doxygen/html/splitbar.png0000644000175000017500000000047215003421124020234 0ustar rmurphyrmurphyPNG  IHDRMIDATxݡJCa( %4 bȘͶ3v^EL ,b;{Ï/aYկq:\IIIIIIIIIIIIIIIIII-l揊_t/ϻYQVYivk_ۣI@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$C[V=[fIENDB`tqsl-2.8.1/src/doxygen/html/splitbard.png0000644000175000017500000000043215003421124020374 0ustar rmurphyrmurphyPNG  IHDRMIDATx1jPFE$H3f B܀P܅ 6q_E=o^v'{/(ESa"LQ)0E(ESa"LQ)0E( r8޼~ׯ>_3gOp?/գ7W(ESa"LQ)0E(ESa"LQ)0E(E?'V+q.IENDB`tqsl-2.8.1/src/doxygen/html/structTQSL__QSO__RECORD-members.html0000644000175000017500000002216315003421124024333 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    TQSL_QSO_RECORD Member List
    tqsl-2.8.1/src/doxygen/html/structTQSL__QSO__RECORD.html0000644000175000017500000004614315003421124022707 0ustar rmurphyrmurphy TrustedQSL Library API: TQSL_QSO_RECORD Struct Reference
    TrustedQSL Library API
    TQSL_QSO_RECORD Struct Reference

    #include <tqsllib.h>

    Public Attributes

    char callsign [TQSL_CALLSIGN_MAX+1]
     QSO callsign.
     
    char band [TQSL_BAND_MAX+1]
     QSO band.
     
    char mode [TQSL_MODE_MAX+1]
     QSO mode.
     
    char submode [TQSL_MODE_MAX+1]
     QSO submode.
     
    tQSL_Date date
     QSO date.
     
    tQSL_Time time
     QSO time.
     
    char freq [TQSL_FREQ_MAX+1]
     QSO frequency.
     
    char rxfreq [TQSL_FREQ_MAX+1]
     QSO receive frequency.
     
    char rxband [TQSL_BAND_MAX+1]
     QSO RX band.
     
    char propmode [TQSL_PROPMODE_MAX+1]
     QSO prop mode.
     
    char satname [TQSL_SATNAME_MAX+1]
     QSO satellite name.
     
    bool callsign_set
     QSO specifies a call worked.
     
    bool mode_set
     QSO specifies a mode.
     
    bool band_set
     QSO specifies a band or frequency.
     
    bool date_set
     QSO specifies a date.
     
    bool time_set
     QSO specifies a time.
     
    char my_state [TQSL_STATE_MAX+1]
     QSO specifies MY_STATE.
     
    char my_gridsquare [TQSL_GRID_MAX+1]
     QSO specifies MY_GRIDSQUARE.
     
    char my_vucc_grids [TQSL_GRID_MAX+1]
     QSO specifies MY_VUCC_GRIDS.
     
    char my_county [TQSL_CNTY_MAX+1]
     QSO specifies MY_CNTY.
     
    char my_cnty_state [TQSL_STATE_MAX+1]
     QSO specifies a state with MY_CNTY.
     
    char my_country [TQSL_COUNTRY_MAX+1]
     QSO specifies MY_COUNTRY.
     
    char my_cq_zone [TQSL_ZONE_MAX+1]
     QSO specifies MY_CQ_ZONE.
     
    char my_itu_zone [TQSL_ZONE_MAX+1]
     QSO specifies MY_ITU_ZONE.
     
    int my_dxcc
     QSO specifies MY_DXCC.
     
    char my_call [TQSL_CALLSIGN_MAX+1]
     Station Callsign.
     
    char my_operator [TQSL_CALLSIGN_MAX+1]
     Operator's callsign.
     
    char my_iota [TQSL_IOTA_MAX+1]
     QSO specifies MY_IOTA_.
     

    Detailed Description

    QSO data


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtQSL__Date-members.html0000644000175000017500000000533115003421124023407 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tQSL_Date Member List

    This is the complete list of members for tQSL_Date, including all inherited members.

    daytQSL_Date
    monthtQSL_Date
    yeartQSL_Date
    tqsl-2.8.1/src/doxygen/html/structtQSL__Date.html0000644000175000017500000001015115003421124021753 0ustar rmurphyrmurphy TrustedQSL Library API: tQSL_Date Struct Reference
    TrustedQSL Library API
    tQSL_Date Struct Reference

    #include <tqsllib.h>

    Public Attributes

    int year
     Numeric year.
     
    int month
     Numeric month.
     
    int day
     Numeric day.
     

    Detailed Description

    Struct that holds y-m-d


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtQSL__Time-members.html0000644000175000017500000000533515003421124023434 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tQSL_Time Member List

    This is the complete list of members for tQSL_Time, including all inherited members.

    hourtQSL_Time
    minutetQSL_Time
    secondtQSL_Time
    tqsl-2.8.1/src/doxygen/html/structtQSL__Time.html0000644000175000017500000001017315003421124022000 0ustar rmurphyrmurphy TrustedQSL Library API: tQSL_Time Struct Reference
    TrustedQSL Library API
    tQSL_Time Struct Reference

    #include <tqsllib.h>

    Public Attributes

    int hour
     Time hour field.
     
    int minute
     Time minute field.
     
    int second
     Time seconds field.
     

    Detailed Description

    Struct that holds h-m-s


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtqsl__adifFieldDefinitions-members.html0000644000175000017500000001050015003421124026727 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tqsl_adifFieldDefinitions Member List
    tqsl-2.8.1/src/doxygen/html/structtqsl__adifFieldDefinitions.html0000644000175000017500000001621215003421124025305 0ustar rmurphyrmurphy TrustedQSL Library API: tqsl_adifFieldDefinitions Struct Reference
    TrustedQSL Library API
    tqsl_adifFieldDefinitions Struct Reference

    #include <adif.h>

    Public Attributes

    char name [TQSL_ADIF_FIELD_NAME_LENGTH_MAX+1]
     Field name.
     
    char type [TQSL_ADIF_FIELD_TYPE_LENGTH_MAX+1]
     Field type.
     
    TQSL_ADIF_RANGE_TYPE rangeType
     Range type.
     
    unsigned int max_length
     Max length.
     
    long signed min_value
     Min value.
     
    long signed max_value
     Max value.
     
    const char ** enumStrings
     Enumerated values.
     
    void * userPointer
     user pointer
     

    Detailed Description

    An ADIF field definition


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtqsl__adifFieldResults-members.html0000644000175000017500000000766615003421124026140 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tqsl_adifFieldResults Member List
    tqsl-2.8.1/src/doxygen/html/structtqsl__adifFieldResults.html0000644000175000017500000001516115003421124024475 0ustar rmurphyrmurphy TrustedQSL Library API: tqsl_adifFieldResults Struct Reference
    TrustedQSL Library API
    tqsl_adifFieldResults Struct Reference

    #include <adif.h>

    Public Attributes

    char name [TQSL_ADIF_FIELD_NAME_LENGTH_MAX+1]
     Field name.
     
    char size [TQSL_ADIF_FIELD_SIZE_LENGTH_MAX+1]
     Size.
     
    char type [TQSL_ADIF_FIELD_TYPE_LENGTH_MAX+1]
     Type.
     
    unsigned char * data
     data
     
    unsigned int adifNameIndex
     Name index.
     
    void * userPointer
     User pointer.
     
    int line_no
     Input line where the tag was found.
     

    Detailed Description

    Field returned from parsing


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtqsl__cabrilloField-members.html0000644000175000017500000000510015003421124025417 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tqsl_cabrilloField Member List

    This is the complete list of members for tqsl_cabrilloField, including all inherited members.

    nametqsl_cabrilloField
    valuetqsl_cabrilloField
    tqsl-2.8.1/src/doxygen/html/structtqsl__cabrilloField.html0000644000175000017500000001130215003421124023770 0ustar rmurphyrmurphy TrustedQSL Library API: tqsl_cabrilloField Struct Reference
    TrustedQSL Library API
    tqsl_cabrilloField Struct Reference

    #include <cabrillo.h>

    Public Attributes

    char name [TQSL_CABRILLO_FIELD_NAME_LENGTH_MAX+1]
     < Cabrillo field
     
    char value [TQSL_CABRILLO_FIELD_VALUE_LENGTH_MAX+1]
     Field value.
     

    Detailed Description

    Cabrillo field data:

    • name - ADIF field name
    • value - Field content

    Member Data Documentation

    ◆ name

    char tqsl_cabrilloField::name[TQSL_CABRILLO_FIELD_NAME_LENGTH_MAX+1]

    < Cabrillo field

    Field name


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtqsl__cert__req__st-members.html0000644000175000017500000001466615003421124025515 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tqsl_cert_req_st Member List
    tqsl-2.8.1/src/doxygen/html/structtqsl__cert__req__st.html0000644000175000017500000003245415003421124024060 0ustar rmurphyrmurphy TrustedQSL Library API: tqsl_cert_req_st Struct Reference
    TrustedQSL Library API
    tqsl_cert_req_st Struct Reference

    #include <tqsllib.h>

    Public Attributes

    char providerName [TQSL_NAME_ELEMENT_MAX+1]
     < Cert request data
     
    char providerUnit [TQSL_NAME_ELEMENT_MAX+1]
     Provider unit.
     
    char callSign [TQSL_CALLSIGN_MAX+1]
     Callsign.
     
    char name [TQSL_CRQ_NAME_MAX+1]
     Name.
     
    char address1 [TQSL_CRQ_ADDR_MAX+1]
     Address 1.
     
    char address2 [TQSL_CRQ_ADDR_MAX+1]
     Address 2.
     
    char city [TQSL_CRQ_CITY_MAX+1]
     City.
     
    char state [TQSL_CRQ_STATE_MAX+1]
     State.
     
    char postalCode [TQSL_CRQ_POSTAL_MAX+1]
     Postal Code.
     
    char country [TQSL_CRQ_COUNTRY_MAX+1]
     Country.
     
    char emailAddress [TQSL_CRQ_EMAIL_MAX+1]
     e-mail
     
    int dxccEntity
     DXCC Entity code.
     
    tQSL_Date qsoNotBefore
     QSOs not before date.
     
    tQSL_Date qsoNotAfter
     QSOs not after date.
     
    char password [TQSL_PASSWORD_MAX+1]
     Password.
     
    tQSL_Cert signer
     Signing cert.
     
    char renew
     Rewewal reference.
     

    Detailed Description

    Certificate request data

    Member Data Documentation

    ◆ providerName

    char tqsl_cert_req_st::providerName[TQSL_NAME_ELEMENT_MAX+1]

    < Cert request data

    Provider name


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/structtqsl__provider__st-members.html0000644000175000017500000000613215003421124025371 0ustar rmurphyrmurphy TrustedQSL Library API: Member List
    TrustedQSL Library API
    tqsl_provider_st Member List
    tqsl-2.8.1/src/doxygen/html/structtqsl__provider__st.html0000644000175000017500000001211415003421124023736 0ustar rmurphyrmurphy TrustedQSL Library API: tqsl_provider_st Struct Reference
    TrustedQSL Library API
    tqsl_provider_st Struct Reference

    #include <tqsllib.h>

    Public Attributes

    char organizationName [TQSL_NAME_ELEMENT_MAX+1]
     Provider name.
     
    char organizationalUnitName [TQSL_NAME_ELEMENT_MAX+1]
     Provider unit.
     
    char emailAddress [TQSL_NAME_ELEMENT_MAX+1]
     Provider e-mail.
     
    char url [TQSL_NAME_ELEMENT_MAX+1]
     Provider URL.
     

    Detailed Description

    Certificate provider data


    The documentation for this struct was generated from the following file:
    tqsl-2.8.1/src/doxygen/html/sync_off.png0000644000175000017500000000152515003421124020222 0ustar rmurphyrmurphyPNG  IHDRw=IDATxKhTW1I&38MII3b$c I1V1-(T.* t!K[čf`l(l"Y6gT}sgܹ d{8?̝;u`:!FB?Űm'y>ѝlU_?]Y(N8f1qn-etm 0}b%׌=0?1s08;_ W|%\Zð >舽lnp.a{ )t; b n652?>Oдunm`׭ZWjC~>־0+ {{fMŕټ` ݛ%uA6,]kWu]7ihu1 l Ҷ̺:\cxhRQt$ fd<4B[fd7=.M9//O a},j?.5ښm?X2#d p(?c!a1ޗةܾ7dK:)3],H+ku<|`LhC7e םt H$^2%l.aeÉ|s }D^hz~Rá]|#@חև[k<|(*ݹdtM:,]' X_n| /cfOIENDB`tqsl-2.8.1/src/doxygen/html/sync_on.png0000644000175000017500000000151515003421124020063 0ustar rmurphyrmurphyPNG  IHDRw=IDATx_HTY8i4-g6&kQ)!0URKڅ/PE>K-+K.YdEPaAZSܝ;3wgfsWK.Da'q_k DQCg 0Y:qZ)~L0HV z-C%g68%wUϿ }? ?3 K@h aaUe s~2&&B*Alji*˨,oƣT,d[3-*> LɟfkҠw#*AEjKUy>&{8m5Ki jjD*Nigw7DmzK۾M!k?o_lX#~XӑR*EՂדE;6e"Q(=Ezæ5Kؼָ_ 1zBJ X96jL^7{J1i@%8'7M_\Q#Uy Wo x8sv|Sn q_m >b[JX,4[T{Ratjjzz'ȶiIws KC^Y%6ꈺ]vhiWvh'̂|[^YrD==>bHa5IENDB`tqsl-2.8.1/src/doxygen/html/tab_b.png0000644000175000017500000000025115003421124017456 0ustar rmurphyrmurphyPNG  IHDR$[pIDATxM EǻԸu`V0}:t]Ds䮂u|x>1&m8SxLU޲iEOsnxKN~jIENDB`tqsl-2.8.1/src/doxygen/html/tab_bd.png0000644000175000017500000000025515003421124017626 0ustar rmurphyrmurphyPNG  IHDR$[tIDATx[ 0Л66)IZ_%)(.(z* u97d:.Lqwg?8LWxʐOЧVql` 1+S^Z ~dA .YBIENDB`tqsl-2.8.1/src/doxygen/html/tab_h.png0000644000175000017500000000026115003421124017465 0ustar rmurphyrmurphyPNG  IHDR$[xIDATxM@~ΒEv"!d*rGq={SݧH uO^[_Xvyұ=VCff{R%_rug(?gh\i>|sIENDB`tqsl-2.8.1/src/doxygen/html/tab_hd.png0000644000175000017500000000026415003421124017634 0ustar rmurphyrmurphyPNG  IHDR$[{IDATxK @D̀""I w1E.gABntX\?,oۺ5:=}`V5!0݇CD*Dm#JI24eVKIENDB`tqsl-2.8.1/src/doxygen/html/tab_s.png0000644000175000017500000000027015003421124017500 0ustar rmurphyrmurphyPNG  IHDR$[IDATx݁ @@ѣ?Q"%If6[HQ<]dr s?O=w'F -~rÍ[芭m֬ݯнF)Y% `n,9B!ь\<#IENDB`tqsl-2.8.1/src/doxygen/html/tab_sd.png0000644000175000017500000000027415003421124017650 0ustar rmurphyrmurphyPNG  IHDR$[IDATx{ 0/ir:'V3"t.3$?)P/LĴG_Nm2ڜQ>ٓ莤HYlKKH2C)rBM08?j HZ-IENDB`tqsl-2.8.1/src/doxygen/html/tabs.css0000644000175000017500000002545715003421124017363 0ustar rmurphyrmurphy.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}}tqsl-2.8.1/src/doxygen/html/tqslconvert_8h.html0000644000175000017500000004513615003421124021565 0ustar rmurphyrmurphy TrustedQSL Library API: tqslconvert.h File Reference
    TrustedQSL Library API
    tqslconvert.h File Reference
    #include "tqsllib.h"

    Go to the source code of this file.

    Macros

    #define TQSL_LOC_IGNORE   0
     Ignore MY_ ADIF fields.
     
    #define TQSL_LOC_REPORT   1
     Report on MY_ ADIF fields not matching cert/location.
     
    #define TQSL_LOC_UPDATE   2
     Update Cert/Loc to track MY_ ADIF fields.
     

    Typedefs

    typedef void * tQSL_Converter
     

    Functions

    DLLEXPORT int CALLCONVENTION tqsl_beginConverter (tQSL_Converter *convp)
     
    DLLEXPORT int CALLCONVENTION tqsl_beginADIFConverter (tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc)
     
    DLLEXPORT int CALLCONVENTION tqsl_beginCabrilloConverter (tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc)
     
    DLLEXPORT int CALLCONVENTION tqsl_endConverter (tQSL_Converter *conv)
     
    DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowBadCall (tQSL_Converter conv, int allow)
     
    DLLEXPORT int CALLCONVENTION tqsl_setConverterQTHDetails (tQSL_Converter conv, int logverify)
     
    DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowDuplicates (tQSL_Converter convp, int ignore)
     
    DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreSeconds (tQSL_Converter convp, int ignore)
     
    DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreCallsigns (tQSL_Converter convp, int ignore)
     
    DLLEXPORT int CALLCONVENTION tqsl_setConverterAppName (tQSL_Converter convp, const char *app)
     
    DLLEXPORT int CALLCONVENTION tqsl_converterRollBack (tQSL_Converter convp)
     
    DLLEXPORT int CALLCONVENTION tqsl_converterCommit (tQSL_Converter convp)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecords (tQSL_Converter convp, char *key, char *data, int keylen)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecordsV2 (tQSL_Converter convp, char *key, char *data, int keylen)
     
    DLLEXPORT int CALLCONVENTION tqsl_putDuplicateRecord (tQSL_Converter convp, const char *key, const char *data, int keylen)
     
    DLLEXPORT int CALLCONVENTION tqsl_setADIFConverterDateFilter (tQSL_Converter conv, tQSL_Date *start, tQSL_Date *end)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getConverterGABBI (tQSL_Converter conv)
     
    DLLEXPORT int CALLCONVENTION tqsl_getConverterCert (tQSL_Converter conv, tQSL_Cert *certp)
     
    DLLEXPORT int CALLCONVENTION tqsl_getConverterLine (tQSL_Converter conv, int *lineno)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getConverterRecordText (tQSL_Converter conv)
     

    Detailed Description

    tQSL library converter functions.

    tqsl-2.8.1/src/doxygen/html/tqslconvert_8h_source.html0000644000175000017500000007730615003421124023151 0ustar rmurphyrmurphy TrustedQSL Library API: tqslconvert.h Source File
    TrustedQSL Library API
    tqslconvert.h
    Go to the documentation of this file.
    1/***************************************************************************
    2 convert.h - description
    3 -------------------
    4 begin : Sun Nov 17 2002
    5 copyright : (C) 2002 by ARRL
    6 author : Jon Bloom
    7 email : jbloom@arrl.org
    8 revision : $Id$
    9 ***************************************************************************/
    10
    11#ifndef __tqslconvert_h
    12#define __tqslconvert_h
    13
    14#include "tqsllib.h"
    15
    27typedef void * tQSL_Converter;
    30
    31#ifdef __cplusplus
    32extern "C" {
    33#endif
    34
    42
    53 tQSL_Cert *certs, int ncerts, tQSL_Location loc);
    54
    65 tQSL_Cert *certs, int ncerts, tQSL_Location loc);
    66
    69
    79
    80#define TQSL_LOC_IGNORE 0
    81#define TQSL_LOC_REPORT 1
    82#define TQSL_LOC_UPDATE 2
    83
    90
    108
    115
    123
    131
    138
    146tqsl_getDuplicateRecords(tQSL_Converter convp, char *key, char *data, int keylen);
    147
    156tqsl_getDuplicateRecordsV2(tQSL_Converter convp, char *key, char *data, int keylen);
    157
    165tqsl_putDuplicateRecord(tQSL_Converter convp, const char *key, const char *data, int keylen);
    166
    176 tQSL_Date *end);
    177
    204
    207
    211
    217
    220#ifdef __cplusplus
    221}
    222#endif
    223
    224#endif /* __tqslconvert_h */
    225
    DLLEXPORT int CALLCONVENTION tqsl_converterCommit(tQSL_Converter convp)
    void * tQSL_Converter
    Definition: tqslconvert.h:27
    DLLEXPORT int CALLCONVENTION tqsl_setConverterQTHDetails(tQSL_Converter conv, int logverify)
    DLLEXPORT int CALLCONVENTION tqsl_converterRollBack(tQSL_Converter convp)
    DLLEXPORT int CALLCONVENTION tqsl_endConverter(tQSL_Converter *conv)
    DLLEXPORT int CALLCONVENTION tqsl_setConverterAppName(tQSL_Converter convp, const char *app)
    DLLEXPORT int CALLCONVENTION tqsl_putDuplicateRecord(tQSL_Converter convp, const char *key, const char *data, int keylen)
    DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowBadCall(tQSL_Converter conv, int allow)
    DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecords(tQSL_Converter convp, char *key, char *data, int keylen)
    DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecordsV2(tQSL_Converter convp, char *key, char *data, int keylen)
    DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreSeconds(tQSL_Converter convp, int ignore)
    DLLEXPORT int CALLCONVENTION tqsl_beginADIFConverter(tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc)
    DLLEXPORT const char *CALLCONVENTION tqsl_getConverterRecordText(tQSL_Converter conv)
    DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreCallsigns(tQSL_Converter convp, int ignore)
    DLLEXPORT int CALLCONVENTION tqsl_beginConverter(tQSL_Converter *convp)
    DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowDuplicates(tQSL_Converter convp, int ignore)
    DLLEXPORT int CALLCONVENTION tqsl_beginCabrilloConverter(tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc)
    DLLEXPORT int CALLCONVENTION tqsl_setADIFConverterDateFilter(tQSL_Converter conv, tQSL_Date *start, tQSL_Date *end)
    DLLEXPORT const char *CALLCONVENTION tqsl_getConverterGABBI(tQSL_Converter conv)
    DLLEXPORT int CALLCONVENTION tqsl_getConverterCert(tQSL_Converter conv, tQSL_Cert *certp)
    DLLEXPORT int CALLCONVENTION tqsl_getConverterLine(tQSL_Converter conv, int *lineno)
    Definition: tqsllib.h:87
    #define CALLCONVENTION
    Symbol exports - Windows only.
    Definition: tqsllib.h:27
    void * tQSL_Location
    Opaque location type.
    Definition: tqsllib.h:83
    #define DLLEXPORT
    Symbol exports - Windows only.
    Definition: tqsllib.h:25
    void * tQSL_Cert
    Opaque certificate type.
    Definition: tqsllib.h:82
    tqsl-2.8.1/src/doxygen/html/tqslerrno_8h.html0000644000175000017500000006531515003421124021233 0ustar rmurphyrmurphy TrustedQSL Library API: tqslerrno.h File Reference
    TrustedQSL Library API
    tqslerrno.h File Reference

    Go to the source code of this file.

    Macros

    #define TQSL_NO_ERROR   0
     No error.
     
    #define TQSL_SYSTEM_ERROR   1
     System Error.
     
    #define TQSL_OPENSSL_ERROR   2
     Error in OpenSSL calls.
     
    #define TQSL_ADIF_ERROR   3
     ADIF Errors.
     
    #define TQSL_CUSTOM_ERROR   4
     Custom errors - output to tQSL_CustomError.
     
    #define TQSL_CABRILLO_ERROR   5
     Cabrillo handler error.
     
    #define TQSL_OPENSSL_VERSION_ERROR   6
     OpenSSL version obsolete.
     
    #define TQSL_ERROR_ENUM_BASE   16
     Base for enumerated errors.
     
    #define TQSL_ALLOC_ERROR   16
     Memory allocation error.
     
    #define TQSL_RANDOM_ERROR   17
     Error initializing random number generator.
     
    #define TQSL_ARGUMENT_ERROR   18
     Invalid arguments.
     
    #define TQSL_OPERATOR_ABORT   19
     Aborted by operator.
     
    #define TQSL_NOKEY_ERROR   20
     No key available.
     
    #define TQSL_BUFFER_ERROR   21
     Insufficient buffer space.
     
    #define TQSL_INVALID_DATE   22
     Date string invalid.
     
    #define TQSL_SIGNINIT_ERROR   23
     Error initializing signing routine.
     
    #define TQSL_PASSWORD_ERROR   24
     Invalid password.
     
    #define TQSL_EXPECTED_NAME   25
     Name expected but not supplied.
     
    #define TQSL_NAME_EXISTS   26
     Entity name exists already.
     
    #define TQSL_NAME_NOT_FOUND   27
     Entity name does not exist.
     
    #define TQSL_INVALID_TIME   28
     Time format is invalid.
     
    #define TQSL_CERT_DATE_MISMATCH   29
     Certificate date mismatch.
     
    #define TQSL_PROVIDER_NOT_FOUND   30
     Certificate provider unknown.
     
    #define TQSL_CERT_KEY_ONLY   31
     No signed public key is installed.
     
    #define TQSL_CONFIG_ERROR   32
     There is an error in the configuration file.
     
    #define TQSL_CERT_NOT_FOUND   33
     The certificate could not be found.
     
    #define TQSL_PKCS12_ERROR   34
     There is an error parsing the .p12 file.
     
    #define TQSL_CERT_TYPE_ERROR   35
     The certificate type is invalid.
     
    #define TQSL_DATE_OUT_OF_RANGE   36
     The date is out of the valid range.
     
    #define TQSL_DUPLICATE_QSO   37
     This QSO is already uploaded.
     
    #define TQSL_DB_ERROR   38
     The dupe database could not be accessed.
     
    #define TQSL_LOCATION_NOT_FOUND   39
     The station location is invalid.
     
    #define TQSL_CALL_NOT_FOUND   40
     The callsign could not be located.
     
    #define TQSL_CONFIG_SYNTAX_ERROR   41
     The config file has a syntax error.
     
    #define TQSL_FILE_SYSTEM_ERROR   42
     There was a file system I/O error.
     
    #define TQSL_FILE_SYNTAX_ERROR   43
     The file format is invalid.
     
    #define TQSL_CERT_ERROR   44
     Callsign certificate could not be installed.
     
    #define TQSL_CERT_MISMATCH   45
     Callsign Certificate does not match QSO details.
     
    #define TQSL_LOCATION_MISMATCH   46
     Station Location does not match QSO details.
     
    #define TQSL_NEW_UPLOAD_DB   47
     New upload database created, try to re-load it.
     
    #define TQSL_CERT_NOT_FOUND_INVALID   0x10000
     Certificate is invalid.
     
    #define TQSL_CERT_NOT_FOUND_EXPIRED   0x20000
     Certificate has expired.
     
    #define TQSL_CERT_NOT_FOUND_SUPERCEDED   0x40000
     Certificate has been replaced with a newer one.
     

    Detailed Description

    tQSL_Error values

    tqsl-2.8.1/src/doxygen/html/tqslerrno_8h_source.html0000644000175000017500000003456515003421124022616 0ustar rmurphyrmurphy TrustedQSL Library API: tqslerrno.h Source File
    TrustedQSL Library API
    tqslerrno.h
    Go to the documentation of this file.
    1/***************************************************************************
    2 tqslerrno.h - description
    3 -------------------
    4 begin : Tue May 28 2002
    5 copyright : (C) 2002 by ARRL
    6 author : Jon Bloom
    7 email : jbloom@arrl.org
    8 revision : $Id$
    9 ***************************************************************************/
    10
    11#ifndef __TQSLERRNO_H
    12#define __TQSLERRNO_H
    13
    18#define TQSL_NO_ERROR 0
    19#define TQSL_SYSTEM_ERROR 1
    20#define TQSL_OPENSSL_ERROR 2
    21#define TQSL_ADIF_ERROR 3
    22#define TQSL_CUSTOM_ERROR 4
    23#define TQSL_CABRILLO_ERROR 5
    24#define TQSL_OPENSSL_VERSION_ERROR 6
    25#define TQSL_ERROR_ENUM_BASE 16
    26#define TQSL_ALLOC_ERROR 16
    27#define TQSL_RANDOM_ERROR 17
    28#define TQSL_ARGUMENT_ERROR 18
    29#define TQSL_OPERATOR_ABORT 19
    30#define TQSL_NOKEY_ERROR 20
    31#define TQSL_BUFFER_ERROR 21
    32#define TQSL_INVALID_DATE 22
    33#define TQSL_SIGNINIT_ERROR 23
    34#define TQSL_PASSWORD_ERROR 24
    35#define TQSL_EXPECTED_NAME 25
    36#define TQSL_NAME_EXISTS 26
    37#define TQSL_NAME_NOT_FOUND 27
    38#define TQSL_INVALID_TIME 28
    39#define TQSL_CERT_DATE_MISMATCH 29
    40#define TQSL_PROVIDER_NOT_FOUND 30
    41#define TQSL_CERT_KEY_ONLY 31
    42#define TQSL_CONFIG_ERROR 32
    43#define TQSL_CERT_NOT_FOUND 33
    44#define TQSL_PKCS12_ERROR 34
    45#define TQSL_CERT_TYPE_ERROR 35
    46#define TQSL_DATE_OUT_OF_RANGE 36
    47#define TQSL_DUPLICATE_QSO 37
    48#define TQSL_DB_ERROR 38
    49#define TQSL_LOCATION_NOT_FOUND 39
    50#define TQSL_CALL_NOT_FOUND 40
    51#define TQSL_CONFIG_SYNTAX_ERROR 41
    52#define TQSL_FILE_SYSTEM_ERROR 42
    53#define TQSL_FILE_SYNTAX_ERROR 43
    54#define TQSL_CERT_ERROR 44
    55#define TQSL_CERT_MISMATCH 45
    56#define TQSL_LOCATION_MISMATCH 46
    57#define TQSL_NEW_UPLOAD_DB 47
    58
    59#define TQSL_CERT_NOT_FOUND_INVALID 0x10000
    60#define TQSL_CERT_NOT_FOUND_EXPIRED 0x20000
    61#define TQSL_CERT_NOT_FOUND_SUPERCEDED 0x40000
    62
    63#endif /* __TQSLERRNO_H */
    tqsl-2.8.1/src/doxygen/html/tqsllib-doc_8h_source.html0000644000175000017500000000676315003421124023001 0ustar rmurphyrmurphy TrustedQSL Library API: tqsllib-doc.h Source File
    TrustedQSL Library API
    tqsllib-doc.h
    1/***************************************************************************
    2 tqsllib-doc.h - description
    3 -------------------
    4 begin : Tue Jun 4 2002
    5 copyright : (C) 2002 by ARRL
    6 author : Jon Bloom
    7 email : jbloom@arrl.org
    8 revision : $Id$
    9 ***************************************************************************/
    10
    tqsl-2.8.1/src/doxygen/html/tqsllib.css0000644000175000017500000000211615003421124020067 0ustar rmurphyrmurphyBODY { font-family: Helvetica,Arial,sans-serif; font-size: small } H1 { text-align: center; font-size: x-large } H2 { font-size: large } CODE { font-size: medium } A.qindex {} A.qindexRef {} A.el { text-decoration: none; font-weight: bold; } A.elRef { font-weight: bold } A.code { text-decoration: none; font-weight: normal; color: #4444ee } A.codeRef { font-weight: normal; color: #4444ee } A:link { color: #0000ff } A:visited { color: #0066cc } DL.el { margin-left: -1cm } DIV.fragment { width: 100%; border: none; background-color: #eeeeee } DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 } TD.md { background-color: #f2f2ff } DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold } DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller } FONT.keyword { color: #008000 } FONT.keywordtype { color: #604020 } FONT.keywordflow { color: #e08000 } FONT.comment { color: #800000 } FONT.preprocessor { color: #806020 } FONT.stringliteral { color: #002080 } FONT.charliteral { color: #008080 } TD { font-size: small } tqsl-2.8.1/src/doxygen/html/tqsllib_8h.html0000644000175000017500000047104615003421124020656 0ustar rmurphyrmurphy TrustedQSL Library API: tqsllib.h File Reference
    TrustedQSL Library API
    tqsllib.h File Reference
    #include <limits.h>
    #include "adif.h"
    #include "cabrillo.h"

    Go to the source code of this file.

    Classes

    struct  tQSL_Date
     
    struct  tQSL_Time
     
    struct  tqsl_provider_st
     
    struct  tqsl_cert_req_st
     
    struct  TQSL_QSO_RECORD
     

    Macros

    #define DLLEXPORT
     Symbol exports - Windows only.
     
    #define DLLEXPORTDATA
     Symbol exports - Windows only.
     
    #define CALLCONVENTION
     Symbol exports - Windows only.
     
    #define PATH_MAX   4096
     Override in case not defined in limits.h.
     
    #define TQSL_MAX_PATH_LEN   PATH_MAX
     Max length of a FS path.
     
    #define TQSL_PASSWORD_MAX   80
     Max password length.
     
    #define TQSL_NAME_ELEMENT_MAX   256
     Max Org name length.
     
    #define TQSL_CALLSIGN_MAX   20
     Max callsign length.
     
    #define TQSL_CRQ_NAME_MAX   60
     Max length of request name.
     
    #define TQSL_CRQ_ADDR_MAX   80
     Max length of request addr.
     
    #define TQSL_CRQ_CITY_MAX   80
     Max length of request city.
     
    #define TQSL_CRQ_STATE_MAX   80
     Max length of request state.
     
    #define TQSL_CRQ_POSTAL_MAX   20
     Max length of request zip.
     
    #define TQSL_CRQ_COUNTRY_MAX   80
     Max length of req entity.
     
    #define TQSL_CRQ_EMAIL_MAX   180
     Max length of req email.
     
    #define TQSL_BAND_MAX   6
     Max length of a band name.
     
    #define TQSL_MODE_MAX   16
     Max length of a mode name.
     
    #define TQSL_FREQ_MAX   20
     Max length of a frequency.
     
    #define TQSL_SATNAME_MAX   20
     Max length of a sat name.
     
    #define TQSL_PROPMODE_MAX   20
     Max length of a prop mode.
     
    #define TQSL_STATE_MAX   30
     Max length of a state name.
     
    #define TQSL_GRID_MAX   30
     Max length of a grid set.
     
    #define TQSL_CNTY_MAX   30
     Max length of a county name.
     
    #define TQSL_COUNTRY_MAX   60
     Max length of a country name.
     
    #define TQSL_ZONE_MAX   5
     Max length of a zone number.
     
    #define TQSL_IOTA_MAX   10
     Max length of a IOTA identifier.
     
    #define TQSL_CERT_CB_USER   0
     Callback is for user cert.
     
    #define TQSL_CERT_CB_CA   1
     Callback is for CA cert.
     
    #define TQSL_CERT_CB_ROOT   2
     Callback is for root cert.
     
    #define TQSL_CERT_CB_PKEY   3
     Callback is for private key.
     
    #define TQSL_CERT_CB_CONFIG   4
     Callback for config file.
     
    #define TQSL_CERT_CB_CERT_TYPE(x)   ((x) & 0xf)
     Type of the cert.
     
    #define TQSL_CERT_CB_MILESTONE   0
     New certificate.
     
    #define TQSL_CERT_CB_RESULT   0x10
     Cert import result.
     
    #define TQSL_CERT_CB_CALL_TYPE(x)   ((x) & TQSL_CERT_CB_RESULT)
     Callback type.
     
    #define TQSL_CERT_CB_PROMPT   0
     Callback prompt.
     
    #define TQSL_CERT_CB_DUPLICATE   0x100
     Dupe cert callback.
     
    #define TQSL_CERT_CB_ERROR   0x200
     Error import callback.
     
    #define TQSL_CERT_CB_LOADED   0x400
     Cert loaded callback.
     
    #define TQSL_CERT_CB_SERIAL   0x800
     User cert serial callback.
     
    #define TQSL_CERT_CB_RESULT_TYPE(x)   ((x) & 0x0f00)
     Result type mask.
     
    #define TQSL_SELECT_CERT_WITHKEYS   1
     Private keys only (no cert)
     
    #define TQSL_SELECT_CERT_EXPIRED   2
     Include expired certs.
     
    #define TQSL_SELECT_CERT_SUPERCEDED   4
     Include superseded certs.
     
    #define TQSL_PK_TYPE_ERR   0
     Error retrieving private key.
     
    #define TQSL_PK_TYPE_NONE   1
     No private key.
     
    #define TQSL_PK_TYPE_UNENC   2
     Private key is not encrypted.
     
    #define TQSL_PK_TYPE_ENC   3
     Private key is encrypted.
     
    #define TQSL_CERT_STATUS_UNK   0
     Status is unknown.
     
    #define TQSL_CERT_STATUS_SUP   1
     Certificate is superceded.
     
    #define TQSL_CERT_STATUS_EXP   2
     Certificate is expired.
     
    #define TQSL_CERT_STATUS_OK   3
     Certificate is valid.
     
    #define TQSL_CERT_STATUS_INV   4
     Invalid serial number.
     
    #define TQSL_LOCATION_FIELD_TEXT   1
     Text type input field.
     
    #define TQSL_LOCATION_FIELD_DDLIST   2
     Dropdown list input field.
     
    #define TQSL_LOCATION_FIELD_LIST   3
     List type input field.
     
    #define TQSL_LOCATION_FIELD_BADZONE   4
     Used to return zone selection errors.
     
    #define TQSL_LOCATION_FIELD_CHAR   1
     Character field.
     
    #define TQSL_LOCATION_FIELD_INT   2
     Integer field.
     
    #define TQSL_MAX_PW_LENGTH   32
     Password buffer length.
     

    Typedefs

    typedef void * tQSL_Cert
     Opaque certificate type.
     
    typedef void * tQSL_Location
     Opaque location type.
     
    typedef char * tQSL_StationDataEnc
     Opaque station data type.
     
    typedef struct tqsl_provider_st TQSL_PROVIDER
     
    typedef struct tqsl_cert_req_st TQSL_CERT_REQ
     

    Functions

    DLLEXPORT int CALLCONVENTION tqsl_init ()
     
    DLLEXPORT int CALLCONVENTION tqsl_setDirectory (const char *dir)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString ()
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString_v (int err)
     
    DLLEXPORT int CALLCONVENTION tqsl_encodeBase64 (const unsigned char *data, int datalen, char *output, int outputlen)
     
    DLLEXPORT int CALLCONVENTION tqsl_decodeBase64 (const char *input, unsigned char *data, int *datalen)
     
    DLLEXPORT int CALLCONVENTION tqsl_initDate (tQSL_Date *date, const char *str)
     
    DLLEXPORT int CALLCONVENTION tqsl_initTime (tQSL_Time *time, const char *str)
     
    DLLEXPORT int CALLCONVENTION tqsl_compareDates (const tQSL_Date *a, const tQSL_Date *b)
     
    DLLEXPORT int CALLCONVENTION tqsl_subtractDates (const tQSL_Date *a, const tQSL_Date *b, int *diff)
     
    DLLEXPORT char *CALLCONVENTION tqsl_convertDateToText (const tQSL_Date *date, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_isDateValid (const tQSL_Date *d)
     
    DLLEXPORT int CALLCONVENTION tqsl_isDateNull (const tQSL_Date *d)
     
    DLLEXPORT int CALLCONVENTION tqsl_isTimeValid (const tQSL_Time *t)
     
    DLLEXPORT char *CALLCONVENTION tqsl_convertTimeToText (const tQSL_Time *time, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getVersion (int *major, int *minor)
     
    DLLEXPORT int CALLCONVENTION tqsl_getConfigVersion (int *major, int *minor)
     
    DLLEXPORT int CALLCONVENTION tqsl_selectCertificates (tQSL_Cert **certlist, int *ncerts, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flag)
     
    DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates (tQSL_Cert **certlist, int *ncerts, const char *type)
     
    DLLEXPORT int CALLCONVENTION tqsl_getSelectedCertificate (tQSL_Cert *cert, const tQSL_Cert **certlist, int idx)
     
    DLLEXPORT int CALLCONVENTION tqsl_isCertificateExpired (tQSL_Cert cert, int *status)
     
    DLLEXPORT int CALLCONVENTION tqsl_isCertificateSuperceded (tQSL_Cert cert, int *status)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateKeyOnly (tQSL_Cert cert, int *keyonly)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateEncoded (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded (const char *callsign, const char *type, const char *keybuf, const char *certbuf)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerial (tQSL_Cert cert, long *serial)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt (tQSL_Cert cert, char *serial, int serialsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialLength (tQSL_Cert cert)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuer (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganization (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganizationalUnit (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateCallSign (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateAROName (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateEmailAddress (tQSL_Cert cert, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotBeforeDate (tQSL_Cert cert, tQSL_Date *date)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotAfterDate (tQSL_Cert cert, tQSL_Date *date)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotBeforeDate (tQSL_Cert cert, tQSL_Date *date)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotAfterDate (tQSL_Cert cert, tQSL_Date *date)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateDXCCEntity (tQSL_Cert cert, int *dxcc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress1 (tQSL_Cert cert, char *str, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress2 (tQSL_Cert cert, char *str, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCity (tQSL_Cert cert, char *str, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestState (tQSL_Cert cert, char *str, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestPostalCode (tQSL_Cert cert, char *str, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCountry (tQSL_Cert cert, char *str, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificatePrivateKeyType (tQSL_Cert cert)
     
    DLLEXPORT void CALLCONVENTION tqsl_freeCertificate (tQSL_Cert cert)
     
    DLLEXPORT void CALLCONVENTION tqsl_freeCertificateList (tQSL_Cert *list, int ncerts)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateStatus (long serial)
     
    DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus (long serial, const char *status)
     
    DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile (const char *file, int(*cb)(int type, const char *message, void *userdata), void *user)
     
    DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile (const char *file, long *serial)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumProviders (int *n)
     
    DLLEXPORT int CALLCONVENTION tqsl_getProvider (int idx, TQSL_PROVIDER *provider)
     
    DLLEXPORT int CALLCONVENTION tqsl_createCertRequest (const char *filename, TQSL_CERT_REQ *req, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user)
     
    DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File (tQSL_Cert cert, const char *filename, const char *p12password)
     
    DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto (tQSL_Cert cert, const char *filename, const char *p12password)
     
    DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64 (tQSL_Cert cert, char *base64, int b64len, const char *p12password)
     
    DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File (const char *filename, const char *p12password, const char *password, int(*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type, const char *message, void *userdata), void *user)
     
    DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64 (const char *base64, const char *p12password, const char *password, int(*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type, const char *message, void *userdata), void *user)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates (char ***calls, int *ncall, const char *filter)
     
    DLLEXPORT void CALLCONVENTION tqsl_freeDeletedCertificateList (char **list, int nloc)
     
    DLLEXPORT int CALLCONVENTION tqsl_restoreCallsignCertificate (const char *callsign)
     
    DLLEXPORT int CALLCONVENTION tqsl_deleteCertificate (tQSL_Cert cert)
     
    DLLEXPORT int CALLCONVENTION tqsl_beginSigning (tQSL_Cert cert, char *password, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user)
     
    DLLEXPORT int CALLCONVENTION tqsl_checkSigningStatus (tQSL_Cert cert)
     
    DLLEXPORT int CALLCONVENTION tqsl_getMaxSignatureSize (tQSL_Cert cert, int *sigsize)
     
    DLLEXPORT int CALLCONVENTION tqsl_signDataBlock (tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int *siglen)
     
    DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock (tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int siglen)
     
    DLLEXPORT int CALLCONVENTION tqsl_signQSORecord (tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *rec, unsigned char *sig, int *siglen)
     
    DLLEXPORT int CALLCONVENTION tqsl_endSigning (tQSL_Cert cert)
     
    DLLEXPORT int CALLCONVENTION tqsl_initStationLocationCapture (tQSL_Location *locp)
     
    DLLEXPORT int CALLCONVENTION tqsl_endStationLocationCapture (tQSL_Location *locp)
     
    DLLEXPORT int CALLCONVENTION tqsl_updateStationLocationCapture (tQSL_Location loc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocationCapturePages (tQSL_Location loc, int *npages)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCapturePage (tQSL_Location loc, int *page)
     
    DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCapturePage (tQSL_Location loc, int page)
     
    DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCertFlags (tQSL_Location loc, int flags)
     
    DLLEXPORT int CALLCONVENTION tqsl_nextStationLocationCapture (tQSL_Location loc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNextStationLocationCapturePage (tQSL_Location loc, int *page)
     
    DLLEXPORT int CALLCONVENTION tqsl_prevStationLocationCapture (tQSL_Location loc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getPrevStationLocationCapturePage (tQSL_Location loc, int *page)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCurrentStationLocationCapturePage (tQSL_Location loc, int *page)
     
    DLLEXPORT int CALLCONVENTION tqsl_hasNextStationLocationCapture (tQSL_Location loc, int *rval)
     
    DLLEXPORT int CALLCONVENTION tqsl_hasPrevStationLocationCapture (tQSL_Location loc, int *rval)
     
    DLLEXPORT int CALLCONVENTION tqsl_saveStationLocationCapture (tQSL_Location loc, int overwrite)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCaptureName (tQSL_Location loc, char *namebuf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCaptureName (tQSL_Location loc, const char *name)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocations (tQSL_Location loc, int *nloc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationName (tQSL_Location loc, int idx, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCallSign (tQSL_Location loc, int idx, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField (tQSL_Location locp, const char *name, char *namebuf, int bufsize)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocation (tQSL_Location *loc, const char *name)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationErrors (tQSL_Location loc, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getStationDataEnc (tQSL_StationDataEnc *sdata)
     
    DLLEXPORT int CALLCONVENTION tqsl_freeStationDataEnc (tQSL_StationDataEnc sdata)
     
    DLLEXPORT int CALLCONVENTION tqsl_mergeStationLocations (const char *locdata)
     
    DLLEXPORT int CALLCONVENTION tqsl_deleteStationLocation (const char *name)
     
    DLLEXPORT int CALLCONVENTION tqsl_restoreStationLocation (const char *name)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDeletedStationLocations (char ***locp, int *nloc)
     
    DLLEXPORT void CALLCONVENTION tqsl_freeDeletedLocationList (char **list, int nloc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField (tQSL_Location loc, int *numf)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize (tQSL_Location loc, int field_num, int *rval)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel (tQSL_Location loc, int field_num, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize (tQSL_Location loc, int field_num, int *rval)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI (tQSL_Location loc, int field_num, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldInputType (tQSL_Location loc, int field_num, int *type)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataType (tQSL_Location loc, int field_num, int *type)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldFlags (tQSL_Location loc, int field_num, int *flags)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLength (tQSL_Location loc, int field_num, int *rval)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData (tQSL_Location loc, int field_num, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIntData (tQSL_Location loc, int field_num, int *dat)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIndex (tQSL_Location loc, int field_num, int *dat)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumLocationFieldListItems (tQSL_Location loc, int field_num, int *rval)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem (tQSL_Location loc, int field_num, int item_idx, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldCharData (tQSL_Location loc, int field_num, const char *buf)
     
    DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIntData (tQSL_Location loc, int field_num, int dat)
     
    DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIndex (tQSL_Location loc, int field_num, int dat)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldChanged (tQSL_Location loc, int field_num, int *changed)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationCallSign (tQSL_Location loc, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_setLocationCallSign (tQSL_Location loc, const char *buf, int dxcc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationField (tQSL_Location locp, const char *field, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel (tQSL_Location locp, const char *field, char *buf, int bufsiz)
     
    DLLEXPORT int CALLCONVENTION tqsl_setLocationField (tQSL_Location locp, const char *field, const char *buf)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationDXCCEntity (tQSL_Location loc, int *dxcc)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationQSODetails (tQSL_Location locp, char *buf, int buflen)
     
    DLLEXPORT int CALLCONVENTION tqsl_getLocationStationDetails (tQSL_Location locp, char *buf, int buflen)
     
    DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo (const char *callsign, const char *json)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo (const char *callsign, char **buf)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumDXCCEntity (int *number)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity (int index, int *number, const char **name)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName (int number, const char **name)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap (int number, const char **zonemap)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCStartDate (int number, tQSL_Date *d)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCEndDate (int number, tQSL_Date *d)
     
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted (int number, int *deleted)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumBand (int *number)
     
    DLLEXPORT int CALLCONVENTION tqsl_getBand (int index, const char **name, const char **spectrum, int *low, int *high)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumMode (int *number)
     
    DLLEXPORT int CALLCONVENTION tqsl_getMode (int index, const char **mode, const char **group)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumADIFMode (int *number)
     
    DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry (int index, const char **mode)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumPropagationMode (int *number)
     
    DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode (int index, const char **name, const char **descrip)
     
    DLLEXPORT int CALLCONVENTION tqsl_getNumSatellite (int *number)
     
    DLLEXPORT int CALLCONVENTION tqsl_getSatellite (int index, const char **name, const char **descrip, tQSL_Date *start, tQSL_Date *end)
     
    DLLEXPORT int CALLCONVENTION tqsl_clearCabrilloMap ()
     
    DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry (const char *contest, int field, int contest_type)
     
    DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry (const char *contest, int *fieldnum, int *contest_type)
     
    DLLEXPORT int CALLCONVENTION tqsl_clearADIFModes ()
     
    DLLEXPORT int CALLCONVENTION tqsl_setADIFMode (const char *adif_item, const char *mode)
     
    DLLEXPORT int CALLCONVENTION tqsl_getADIFMode (const char *adif_item, char *mode, int nmode)
     
    DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode (const char *adif_item, char *mode, char *submode, int nmode)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCERT (tQSL_Cert cert, int uid)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItSTATION (tQSL_Location loc, int uid, int certuid)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACT (tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid)
     
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACTData (tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid, char *signdata, int sdlen)
     
    DLLEXPORT void CALLCONVENTION tqslTrace (const char *name, const char *format,...)
     
    DLLEXPORT void CALLCONVENTION tqsl_closeDiagFile (void)
     
    DLLEXPORT int CALLCONVENTION tqsl_diagFileOpen (void)
     
    DLLEXPORT int CALLCONVENTION tqsl_openDiagFile (const char *file)
     
    DLLEXPORT void CALLCONVENTION tqsl_removeUploadDatabase (void)
     

    Variables

    DLLEXPORTDATA const char * tQSL_BaseDir
     Base directory for tQSL library working files.
     
    DLLEXPORTDATA const char * tQSL_RsrcDir
     Directory for resources bundled with tqsl executable.
     
    DLLEXPORTDATA int tQSL_Error
     Error code from most recent tQSL library call.
     
    DLLEXPORTDATA TQSL_ADIF_GET_FIELD_ERROR tQSL_ADIF_Error
     The ADIF error code.
     
    DLLEXPORTDATA TQSL_CABRILLO_ERROR_TYPE tQSL_Cabrillo_Error
     The ADIF error code.
     
    DLLEXPORTDATA char tQSL_ErrorFile [TQSL_MAX_PATH_LEN]
     File name of file giving error. (May be empty.)
     
    DLLEXPORTDATA char tQSL_CustomError [256]
     Custom error message string.
     
    DLLEXPORTDATA int tQSL_Errno
     System errno - stored when tQSL_Error == TQSL_SYSTEM_ERROR.
     
    DLLEXPORTDATA char tQSL_ImportCall [256]
     Callsign used in import - used for missing public key error.
     
    DLLEXPORTDATA long tQSL_ImportSerial
     Serial number of recent certificate import.
     
    DLLEXPORTDATA FILE * tQSL_DiagFile
     Diagnostic log file.
     

    Detailed Description

    tQSL library functions.

    Typedef Documentation

    ◆ TQSL_CERT_REQ

    Certificate request data

    ◆ TQSL_PROVIDER

    Certificate provider data

    Function Documentation

    ◆ tqsl_closeDiagFile()

    DLLEXPORT void CALLCONVENTION tqsl_closeDiagFile ( void  )

    Close the diagnostic trace file (if it is open)

    ◆ tqsl_diagFileOpen()

    DLLEXPORT int CALLCONVENTION tqsl_diagFileOpen ( void  )

    Close the diagnostic trace file (if it is open)

    ◆ tqsl_openDiagFile()

    DLLEXPORT int CALLCONVENTION tqsl_openDiagFile ( const char *  file)

    Returns true if the log file is open

    ◆ tqsl_removeUploadDatabase()

    DLLEXPORT void CALLCONVENTION tqsl_removeUploadDatabase ( void  )

    Removes the upload database if it exists

    ◆ tqslTrace()

    DLLEXPORT void CALLCONVENTION tqslTrace ( const char *  name,
    const char *  format,
      ... 
    )

    Output to a diagnostic trace file (if one is opened.

    • name is the name of the function being executed
    tqsl-2.8.1/src/doxygen/html/tqsllib_8h_source.html0000644000175000017500000102345015003421124022227 0ustar rmurphyrmurphy TrustedQSL Library API: tqsllib.h Source File
    TrustedQSL Library API
    tqsllib.h
    Go to the documentation of this file.
    1/***************************************************************************
    2 tqsllib.h - description
    3 -------------------
    4 begin : Mon May 20 2002
    5 copyright : (C) 2002 by ARRL
    6 author : Jon Bloom
    7 email : jbloom@arrl.org
    8 revision : $Id: tqsllib.h,v 1.14 2013/03/01 13:26:44 k1mu Exp $
    9 ***************************************************************************/
    10
    11#ifndef TQSLLIB_H
    12#define TQSLLIB_H
    13
    14#if defined(_WIN32) && !defined(TQSL_NODLL)
    15 #ifdef TQSLLIB_DEF
    16 #define DLLEXPORT __declspec(dllexport)
    17 #define DLLEXPORTDATA __declspec(dllexport)
    18 #define CALLCONVENTION __stdcall
    19 #else
    20 #define DLLEXPORT __declspec(dllimport)
    21 #define DLLEXPORTDATA __declspec(dllimport)
    22 #define CALLCONVENTION __stdcall
    23 #endif
    24#else
    25 #define DLLEXPORT
    26 #define DLLEXPORTDATA
    27 #define CALLCONVENTION
    28 #include <limits.h>
    29#endif
    30
    31#include "adif.h"
    32#include "cabrillo.h"
    33
    38#ifndef PATH_MAX // Should be set by <limits.h>
    39#define PATH_MAX 4096
    40#endif
    41
    42/* Sizes */
    43#define TQSL_MAX_PATH_LEN PATH_MAX
    44#define TQSL_PASSWORD_MAX 80
    45#define TQSL_NAME_ELEMENT_MAX 256
    46#define TQSL_CALLSIGN_MAX 20
    47#define TQSL_CRQ_NAME_MAX 60
    48#define TQSL_CRQ_ADDR_MAX 80
    49#define TQSL_CRQ_CITY_MAX 80
    50#define TQSL_CRQ_STATE_MAX 80
    51#define TQSL_CRQ_POSTAL_MAX 20
    52#define TQSL_CRQ_COUNTRY_MAX 80
    53#define TQSL_CRQ_EMAIL_MAX 180
    54#define TQSL_BAND_MAX 6
    55#define TQSL_MODE_MAX 16
    56#define TQSL_FREQ_MAX 20
    57#define TQSL_SATNAME_MAX 20
    58#define TQSL_PROPMODE_MAX 20
    59#define TQSL_STATE_MAX 30
    60#define TQSL_GRID_MAX 30
    61#define TQSL_CNTY_MAX 30
    62#define TQSL_COUNTRY_MAX 60
    63#define TQSL_ZONE_MAX 5
    64#define TQSL_IOTA_MAX 10
    65
    66#define TQSL_CERT_CB_USER 0
    67#define TQSL_CERT_CB_CA 1
    68#define TQSL_CERT_CB_ROOT 2
    69#define TQSL_CERT_CB_PKEY 3
    70#define TQSL_CERT_CB_CONFIG 4
    71#define TQSL_CERT_CB_CERT_TYPE(x) ((x) & 0xf)
    72#define TQSL_CERT_CB_MILESTONE 0
    73#define TQSL_CERT_CB_RESULT 0x10
    74#define TQSL_CERT_CB_CALL_TYPE(x) ((x) & TQSL_CERT_CB_RESULT)
    75#define TQSL_CERT_CB_PROMPT 0
    76#define TQSL_CERT_CB_DUPLICATE 0x100
    77#define TQSL_CERT_CB_ERROR 0x200
    78#define TQSL_CERT_CB_LOADED 0x400
    79#define TQSL_CERT_CB_SERIAL 0x800
    80#define TQSL_CERT_CB_RESULT_TYPE(x) ((x) & 0x0f00)
    81
    82typedef void * tQSL_Cert;
    83typedef void * tQSL_Location;
    84typedef char * tQSL_StationDataEnc;
    85
    87typedef struct {
    88 int year;
    89 int month;
    90 int day;
    91} tQSL_Date;
    92
    94typedef struct {
    95 int hour;
    96 int minute;
    97 int second;
    98} tQSL_Time;
    99
    101typedef struct tqsl_provider_st {
    107
    109typedef struct tqsl_cert_req_st {
    126 char renew;
    128
    130typedef struct {
    131 char callsign[TQSL_CALLSIGN_MAX+1];
    132 char band[TQSL_BAND_MAX+1];
    133 char mode[TQSL_MODE_MAX+1];
    134 char submode[TQSL_MODE_MAX+1];
    137 char freq[TQSL_FREQ_MAX+1];
    138 char rxfreq[TQSL_FREQ_MAX+1];
    139 char rxband[TQSL_BAND_MAX+1];
    140 char propmode[TQSL_PROPMODE_MAX+1];
    141 char satname[TQSL_SATNAME_MAX+1];
    143 bool mode_set;
    144 bool band_set;
    145 bool date_set;
    146 bool time_set;
    147 char my_state[TQSL_STATE_MAX+1];
    148 char my_gridsquare[TQSL_GRID_MAX+1];
    149 char my_vucc_grids[TQSL_GRID_MAX+1];
    150 char my_county[TQSL_CNTY_MAX+1];
    151 char my_cnty_state[TQSL_STATE_MAX+1];
    152 char my_country[TQSL_COUNTRY_MAX+1];
    153 char my_cq_zone[TQSL_ZONE_MAX+1];
    154 char my_itu_zone[TQSL_ZONE_MAX+1];
    156 char my_call[TQSL_CALLSIGN_MAX+1];
    157#ifdef USE_OWNER_CALLSIGN
    158 char my_owner[TQSL_CALLSIGN_MAX+1];
    159#endif
    160 char my_operator[TQSL_CALLSIGN_MAX+1];
    161 char my_iota[TQSL_IOTA_MAX+1];
    163
    165DLLEXPORTDATA extern const char *tQSL_BaseDir;
    167DLLEXPORTDATA extern const char *tQSL_RsrcDir;
    168
    169#ifdef __cplusplus
    170extern "C" {
    171#endif
    172
    178
    180DLLEXPORTDATA extern int tQSL_Error;
    188DLLEXPORTDATA extern char tQSL_CustomError[256];
    190DLLEXPORTDATA extern int tQSL_Errno;
    192DLLEXPORTDATA extern char tQSL_ImportCall[256];
    196DLLEXPORTDATA extern FILE* tQSL_DiagFile;
    197
    203
    214
    219
    225
    233DLLEXPORT int CALLCONVENTION tqsl_encodeBase64(const unsigned char *data, int datalen, char *output, int outputlen);
    234
    243DLLEXPORT int CALLCONVENTION tqsl_decodeBase64(const char *input, unsigned char *data, int *datalen);
    244
    252
    260
    271
    278
    283DLLEXPORT char* CALLCONVENTION tqsl_convertDateToText(const tQSL_Date *date, char *buf, int bufsiz);
    284
    290
    296
    302
    307DLLEXPORT char* CALLCONVENTION tqsl_convertTimeToText(const tQSL_Time *time, char *buf, int bufsiz);
    308
    311DLLEXPORT int CALLCONVENTION tqsl_getVersion(int *major, int *minor);
    312
    316
    345#define TQSL_SELECT_CERT_WITHKEYS 1
    346#define TQSL_SELECT_CERT_EXPIRED 2
    347#define TQSL_SELECT_CERT_SUPERCEDED 4
    348
    377 const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flag);
    378
    390DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates(tQSL_Cert **certlist, int *ncerts, const char *type);
    391
    401 int idx);
    402
    406
    410
    414
    418
    421DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded(tQSL_Cert cert, char *buf, int bufsiz);
    422
    425DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded(const char *callsign, const char *type, const char *keybuf, const char *certbuf);
    426
    430
    434DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt(tQSL_Cert cert, char *serial, int serialsiz);
    435
    440
    451
    492
    503
    513
    523
    533
    543
    553
    565
    577
    589
    601
    613
    625
    626#define TQSL_PK_TYPE_ERR 0
    627#define TQSL_PK_TYPE_NONE 1
    628#define TQSL_PK_TYPE_UNENC 2
    629#define TQSL_PK_TYPE_ENC 3
    630
    646
    647
    652
    659
    660#define TQSL_CERT_STATUS_UNK 0
    661#define TQSL_CERT_STATUS_SUP 1
    662#define TQSL_CERT_STATUS_EXP 2
    663#define TQSL_CERT_STATUS_OK 3
    664#define TQSL_CERT_STATUS_INV 4
    665
    681
    686DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus(long serial, const char *status);
    687
    688/* int tqsl_checkCertificate(tQSL_Cert); */
    689
    707DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile(const char *file, int(*cb)(int type, const char *message, void *userdata), void *user);
    708
    717DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile(const char *file, long *serial);
    718
    722
    728
    742 int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user);
    743
    751DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File(tQSL_Cert cert, const char *filename, const char *p12password);
    752
    761DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto(tQSL_Cert cert, const char *filename, const char *p12password);
    762
    771DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64(tQSL_Cert cert, char *base64, int b64len, const char *p12password);
    772
    775DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File(const char *filename, const char *p12password, const char *password,
    776 int (*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type , const char *message, void *userdata), void *user);
    777
    780DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64(const char *base64, const char *p12password, const char *password,
    781 int (*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type , const char *message, void *userdata), void *user);
    782
    784DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates(char ***calls, int *ncall, const char *filter);
    785
    788
    791
    795
    818DLLEXPORT int CALLCONVENTION tqsl_beginSigning(tQSL_Cert cert, char *password, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user);
    819
    825
    831
    837DLLEXPORT int CALLCONVENTION tqsl_signDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int *siglen);
    838
    843DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int siglen);
    844
    852DLLEXPORT int CALLCONVENTION tqsl_signQSORecord(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *rec, unsigned char *sig, int *siglen);
    853
    859
    964/* Location field input types */
    965
    966#define TQSL_LOCATION_FIELD_TEXT 1
    967#define TQSL_LOCATION_FIELD_DDLIST 2
    968#define TQSL_LOCATION_FIELD_LIST 3
    969#define TQSL_LOCATION_FIELD_BADZONE 4
    970
    971/* Location field data types */
    972#define TQSL_LOCATION_FIELD_CHAR 1
    973#define TQSL_LOCATION_FIELD_INT 2
    974
    977
    983
    986
    990
    993
    999
    1004
    1007
    1010
    1013
    1016
    1019
    1022
    1025
    1033
    1036
    1039
    1042
    1045
    1048
    1050DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField(tQSL_Location locp, const char *name, char *namebuf, int bufsize);
    1051
    1057
    1065
    1070
    1074
    1077
    1080
    1083
    1086
    1089
    1092
    1095
    1097DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel(tQSL_Location loc, int field_num, char *buf, int bufsiz);
    1098
    1101
    1103DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI(tQSL_Location loc, int field_num, char *buf, int bufsiz);
    1104
    1112
    1115
    1117DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel(tQSL_Location loc, int field_num, char *buf, int bufsiz);
    1118
    1121
    1123DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI(tQSL_Location loc, int field_num, char *buf, int bufsiz);
    1124
    1131
    1137
    1147
    1150
    1157DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData(tQSL_Location loc, int field_num, char *buf, int bufsiz);
    1158
    1165
    1171
    1174
    1176DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem(tQSL_Location loc, int field_num, int item_idx, char *buf, int bufsiz);
    1177
    1180
    1184
    1190
    1196
    1199
    1202
    1204DLLEXPORT int CALLCONVENTION tqsl_getLocationField(tQSL_Location locp, const char *field, char *buf, int bufsiz);
    1205
    1207DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel(tQSL_Location locp, const char *field, char *buf, int bufsiz);
    1208
    1210DLLEXPORT int CALLCONVENTION tqsl_setLocationField(tQSL_Location locp, const char *field, const char *buf);
    1211
    1214
    1217
    1220
    1222DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo(const char *callsign, const char *json);
    1223
    1225DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo(const char *callsign, char **buf);
    1226
    1230
    1233DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity(int index, int *number, const char **name);
    1234
    1237DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName(int number, const char **name);
    1238
    1241DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap(int number, const char **zonemap);
    1242
    1246
    1250
    1253DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted(int number, int *deleted);
    1254
    1257
    1267DLLEXPORT int CALLCONVENTION tqsl_getBand(int index, const char **name, const char **spectrum, int *low, int *high);
    1268
    1271
    1279DLLEXPORT int CALLCONVENTION tqsl_getMode(int index, const char **mode, const char **group);
    1280
    1283
    1289DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry(int index, const char **mode);
    1290
    1293
    1301DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode(int index, const char **name, const char **descrip);
    1302
    1305
    1315DLLEXPORT int CALLCONVENTION tqsl_getSatellite(int index, const char **name, const char **descrip,
    1316 tQSL_Date *start, tQSL_Date *end);
    1317
    1321
    1332DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry(const char *contest, int field, int contest_type);
    1333
    1345DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry(const char *contest, int *fieldnum, int *contest_type);
    1346
    1350
    1353DLLEXPORT int CALLCONVENTION tqsl_setADIFMode(const char *adif_item, const char *mode);
    1354
    1357DLLEXPORT int CALLCONVENTION tqsl_getADIFMode(const char *adif_item, char *mode, int nmode);
    1358
    1361DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode(const char *adif_item, char *mode, char *submode, int nmode);
    1362
    1373
    1384DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItSTATION(tQSL_Location loc, int uid, int certuid);
    1385
    1399 int stationuid);
    1400
    1415 int stationuid, char *signdata, int sdlen);
    1416
    1423DLLEXPORT void CALLCONVENTION tqslTrace(const char *name, const char *format, ...);
    1438
    1439#ifdef _WIN32
    1440DLLEXPORT wchar_t* CALLCONVENTION utf8_to_wchar(const char* str);
    1441DLLEXPORT char* CALLCONVENTION wchar_to_utf8(const wchar_t* str, bool forceUTF8);
    1442DLLEXPORT void CALLCONVENTION free_wchar(wchar_t* ptr);
    1443#endif
    1444
    1445#ifdef __cplusplus
    1446}
    1447#endif
    1448
    1449/* Useful defines */
    1450#define TQSL_MAX_PW_LENGTH 32
    1451
    1452#endif /* TQSLLIB_H */
    TQSL_ADIF_GET_FIELD_ERROR
    Response values returned from tqsl_getADIFField()
    Definition: adif.h:52
    TQSL_CABRILLO_ERROR_TYPE
    Cabrillo status values.
    Definition: cabrillo.h:40
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress1(tQSL_Cert cert, char *str, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateAROName(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File(const char *filename, const char *p12password, const char *password, int(*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type, const char *message, void *userdata), void *user)
    DLLEXPORT int CALLCONVENTION tqsl_deleteCertificate(tQSL_Cert cert)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCity(tQSL_Cert cert, char *str, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File(tQSL_Cert cert, const char *filename, const char *p12password)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestState(tQSL_Cert cert, char *str, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getSelectedCertificate(tQSL_Cert *cert, const tQSL_Cert **certlist, int idx)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganizationalUnit(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_isCertificateSuperceded(tQSL_Cert cert, int *status)
    DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto(tQSL_Cert cert, const char *filename, const char *p12password)
    DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates(tQSL_Cert **certlist, int *ncerts, const char *type)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificatePrivateKeyType(tQSL_Cert cert)
    DLLEXPORT int CALLCONVENTION tqsl_restoreCallsignCertificate(const char *callsign)
    DLLEXPORT int CALLCONVENTION tqsl_createCertRequest(const char *filename, TQSL_CERT_REQ *req, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user)
    DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded(const char *callsign, const char *type, const char *keybuf, const char *certbuf)
    DLLEXPORT int CALLCONVENTION tqsl_selectCertificates(tQSL_Cert **certlist, int *ncerts, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flag)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialLength(tQSL_Cert cert)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotAfterDate(tQSL_Cert cert, tQSL_Date *date)
    DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile(const char *file, long *serial)
    DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64(const char *base64, const char *p12password, const char *password, int(*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type, const char *message, void *userdata), void *user)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerial(tQSL_Cert cert, long *serial)
    DLLEXPORT int CALLCONVENTION tqsl_getNumProviders(int *n)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganization(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotBeforeDate(tQSL_Cert cert, tQSL_Date *date)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotAfterDate(tQSL_Cert cert, tQSL_Date *date)
    DLLEXPORT int CALLCONVENTION tqsl_isCertificateExpired(tQSL_Cert cert, int *status)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateEmailAddress(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotBeforeDate(tQSL_Cert cert, tQSL_Date *date)
    DLLEXPORT int CALLCONVENTION tqsl_getProvider(int idx, TQSL_PROVIDER *provider)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestPostalCode(tQSL_Cert cert, char *str, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateCallSign(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT void CALLCONVENTION tqsl_freeCertificateList(tQSL_Cert *list, int ncerts)
    DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateStatus(long serial)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateKeyOnly(tQSL_Cert cert, int *keyonly)
    DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64(tQSL_Cert cert, char *base64, int b64len, const char *p12password)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress2(tQSL_Cert cert, char *str, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuer(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateEncoded(tQSL_Cert cert, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateDXCCEntity(tQSL_Cert cert, int *dxcc)
    DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile(const char *file, int(*cb)(int type, const char *message, void *userdata), void *user)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCountry(tQSL_Cert cert, char *str, int bufsiz)
    DLLEXPORT void CALLCONVENTION tqsl_freeCertificate(tQSL_Cert cert)
    DLLEXPORT void CALLCONVENTION tqsl_freeDeletedCertificateList(char **list, int nloc)
    DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus(long serial, const char *status)
    DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt(tQSL_Cert cert, char *serial, int serialsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates(char ***calls, int *ncall, const char *filter)
    DLLEXPORT int CALLCONVENTION tqsl_getADIFMode(const char *adif_item, char *mode, int nmode)
    DLLEXPORT int CALLCONVENTION tqsl_initStationLocationCapture(tQSL_Location *locp)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldFlags(tQSL_Location loc, int field_num, int *flags)
    DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldCharData(tQSL_Location loc, int field_num, const char *buf)
    DLLEXPORT int CALLCONVENTION tqsl_getNumSatellite(int *number)
    DLLEXPORT int CALLCONVENTION tqsl_saveStationLocationCapture(tQSL_Location loc, int overwrite)
    DLLEXPORT int CALLCONVENTION tqsl_getNumMode(int *number)
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCEndDate(int number, tQSL_Date *d)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocation(tQSL_Location *loc, const char *name)
    DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIndex(tQSL_Location loc, int field_num, int dat)
    DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocationCapturePages(tQSL_Location loc, int *npages)
    DLLEXPORT int CALLCONVENTION tqsl_getStationDataEnc(tQSL_StationDataEnc *sdata)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize(tQSL_Location loc, int field_num, int *rval)
    DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocations(tQSL_Location loc, int *nloc)
    DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIntData(tQSL_Location loc, int field_num, int dat)
    DLLEXPORT int CALLCONVENTION tqsl_setLocationField(tQSL_Location locp, const char *field, const char *buf)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataType(tQSL_Location loc, int field_num, int *type)
    DLLEXPORT int CALLCONVENTION tqsl_freeStationDataEnc(tQSL_StationDataEnc sdata)
    DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry(int index, const char **mode)
    DLLEXPORT int CALLCONVENTION tqsl_endStationLocationCapture(tQSL_Location *locp)
    DLLEXPORT int CALLCONVENTION tqsl_getPrevStationLocationCapturePage(tQSL_Location loc, int *page)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCapturePage(tQSL_Location loc, int *page)
    DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCaptureName(tQSL_Location loc, const char *name)
    DLLEXPORT int CALLCONVENTION tqsl_getNumADIFMode(int *number)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationErrors(tQSL_Location loc, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getDeletedStationLocations(char ***locp, int *nloc)
    DLLEXPORT int CALLCONVENTION tqsl_getNextStationLocationCapturePage(tQSL_Location loc, int *page)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI(tQSL_Location loc, int field_num, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName(int number, const char **name)
    DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCapturePage(tQSL_Location loc, int page)
    DLLEXPORT int CALLCONVENTION tqsl_setLocationCallSign(tQSL_Location loc, const char *buf, int dxcc)
    DLLEXPORT int CALLCONVENTION tqsl_hasNextStationLocationCapture(tQSL_Location loc, int *rval)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationField(tQSL_Location locp, const char *field, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel(tQSL_Location loc, int field_num, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity(int index, int *number, const char **name)
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCStartDate(int number, tQSL_Date *d)
    DLLEXPORT int CALLCONVENTION tqsl_getNumLocationFieldListItems(tQSL_Location loc, int field_num, int *rval)
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACTData(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid, char *signdata, int sdlen)
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCONTACT(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIntData(tQSL_Location loc, int field_num, int *dat)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem(tQSL_Location loc, int field_num, int item_idx, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getCurrentStationLocationCapturePage(tQSL_Location loc, int *page)
    DLLEXPORT int CALLCONVENTION tqsl_prevStationLocationCapture(tQSL_Location loc)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCallSign(tQSL_Location loc, int idx, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationStationDetails(tQSL_Location locp, char *buf, int buflen)
    DLLEXPORT int CALLCONVENTION tqsl_getMode(int index, const char **mode, const char **group)
    DLLEXPORT int CALLCONVENTION tqsl_updateStationLocationCapture(tQSL_Location loc)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCaptureName(tQSL_Location loc, char *namebuf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationQSODetails(tQSL_Location locp, char *buf, int buflen)
    DLLEXPORT int CALLCONVENTION tqsl_getNumBand(int *number)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldInputType(tQSL_Location loc, int field_num, int *type)
    DLLEXPORT int CALLCONVENTION tqsl_restoreStationLocation(const char *name)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData(tQSL_Location loc, int field_num, char *buf, int bufsiz)
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItSTATION(tQSL_Location loc, int uid, int certuid)
    DLLEXPORT int CALLCONVENTION tqsl_nextStationLocationCapture(tQSL_Location loc)
    DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCertFlags(tQSL_Location loc, int flags)
    DLLEXPORT int CALLCONVENTION tqsl_getBand(int index, const char **name, const char **spectrum, int *low, int *high)
    DLLEXPORT int CALLCONVENTION tqsl_deleteStationLocation(const char *name)
    DLLEXPORT int CALLCONVENTION tqsl_setADIFMode(const char *adif_item, const char *mode)
    DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo(const char *callsign, char **buf)
    DLLEXPORT int CALLCONVENTION tqsl_clearADIFModes()
    DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry(const char *contest, int field, int contest_type)
    DLLEXPORT int CALLCONVENTION tqsl_clearCabrilloMap()
    DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField(tQSL_Location loc, int *numf)
    DLLEXPORT int CALLCONVENTION tqsl_getNumDXCCEntity(int *number)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize(tQSL_Location loc, int field_num, int *rval)
    DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode(const char *adif_item, char *mode, char *submode, int nmode)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationCallSign(tQSL_Location loc, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel(tQSL_Location locp, const char *field, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldChanged(tQSL_Location loc, int field_num, int *changed)
    DLLEXPORT int CALLCONVENTION tqsl_mergeStationLocations(const char *locdata)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField(tQSL_Location locp, const char *name, char *namebuf, int bufsize)
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap(int number, const char **zonemap)
    DLLEXPORT int CALLCONVENTION tqsl_getSatellite(int index, const char **name, const char **descrip, tQSL_Date *start, tQSL_Date *end)
    DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry(const char *contest, int *fieldnum, int *contest_type)
    DLLEXPORT int CALLCONVENTION tqsl_getNumPropagationMode(int *number)
    DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo(const char *callsign, const char *json)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLength(tQSL_Location loc, int field_num, int *rval)
    DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode(int index, const char **name, const char **descrip)
    DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted(int number, int *deleted)
    DLLEXPORT int CALLCONVENTION tqsl_hasPrevStationLocationCapture(tQSL_Location loc, int *rval)
    DLLEXPORT int CALLCONVENTION tqsl_getStationLocationName(tQSL_Location loc, int idx, char *buf, int bufsiz)
    DLLEXPORT const char *CALLCONVENTION tqsl_getGABBItCERT(tQSL_Cert cert, int uid)
    DLLEXPORT void CALLCONVENTION tqsl_freeDeletedLocationList(char **list, int nloc)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationDXCCEntity(tQSL_Location loc, int *dxcc)
    DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIndex(tQSL_Location loc, int field_num, int *dat)
    DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int siglen)
    DLLEXPORT int CALLCONVENTION tqsl_getMaxSignatureSize(tQSL_Cert cert, int *sigsize)
    DLLEXPORT int CALLCONVENTION tqsl_signDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int *siglen)
    DLLEXPORT int CALLCONVENTION tqsl_beginSigning(tQSL_Cert cert, char *password, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user)
    DLLEXPORT int CALLCONVENTION tqsl_endSigning(tQSL_Cert cert)
    DLLEXPORT int CALLCONVENTION tqsl_checkSigningStatus(tQSL_Cert cert)
    DLLEXPORT int CALLCONVENTION tqsl_signQSORecord(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *rec, unsigned char *sig, int *siglen)
    DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString()
    DLLEXPORTDATA TQSL_ADIF_GET_FIELD_ERROR tQSL_ADIF_Error
    The ADIF error code.
    DLLEXPORT char *CALLCONVENTION tqsl_convertDateToText(const tQSL_Date *date, char *buf, int bufsiz)
    DLLEXPORTDATA FILE * tQSL_DiagFile
    Diagnostic log file.
    DLLEXPORT const char *CALLCONVENTION tqsl_getErrorString_v(int err)
    DLLEXPORT int CALLCONVENTION tqsl_decodeBase64(const char *input, unsigned char *data, int *datalen)
    DLLEXPORT int CALLCONVENTION tqsl_getVersion(int *major, int *minor)
    DLLEXPORT int CALLCONVENTION tqsl_compareDates(const tQSL_Date *a, const tQSL_Date *b)
    DLLEXPORT int CALLCONVENTION tqsl_init()
    DLLEXPORTDATA char tQSL_CustomError[256]
    Custom error message string.
    DLLEXPORT int CALLCONVENTION tqsl_isDateValid(const tQSL_Date *d)
    DLLEXPORT int CALLCONVENTION tqsl_subtractDates(const tQSL_Date *a, const tQSL_Date *b, int *diff)
    DLLEXPORT int CALLCONVENTION tqsl_isTimeValid(const tQSL_Time *t)
    DLLEXPORT int CALLCONVENTION tqsl_isDateNull(const tQSL_Date *d)
    DLLEXPORT int CALLCONVENTION tqsl_setDirectory(const char *dir)
    DLLEXPORT int CALLCONVENTION tqsl_encodeBase64(const unsigned char *data, int datalen, char *output, int outputlen)
    DLLEXPORT int CALLCONVENTION tqsl_initTime(tQSL_Time *time, const char *str)
    DLLEXPORT char *CALLCONVENTION tqsl_convertTimeToText(const tQSL_Time *time, char *buf, int bufsiz)
    DLLEXPORT int CALLCONVENTION tqsl_getConfigVersion(int *major, int *minor)
    DLLEXPORTDATA long tQSL_ImportSerial
    Serial number of recent certificate import.
    DLLEXPORTDATA int tQSL_Error
    Error code from most recent tQSL library call.
    DLLEXPORTDATA TQSL_CABRILLO_ERROR_TYPE tQSL_Cabrillo_Error
    The ADIF error code.
    DLLEXPORT int CALLCONVENTION tqsl_initDate(tQSL_Date *date, const char *str)
    DLLEXPORTDATA char tQSL_ErrorFile[TQSL_MAX_PATH_LEN]
    File name of file giving error. (May be empty.)
    DLLEXPORTDATA int tQSL_Errno
    System errno - stored when tQSL_Error == TQSL_SYSTEM_ERROR.
    DLLEXPORTDATA char tQSL_ImportCall[256]
    Callsign used in import - used for missing public key error.
    Definition: tqsllib.h:130
    bool time_set
    QSO specifies a time.
    Definition: tqsllib.h:146
    bool date_set
    QSO specifies a date.
    Definition: tqsllib.h:145
    bool mode_set
    QSO specifies a mode.
    Definition: tqsllib.h:143
    tQSL_Date date
    QSO date.
    Definition: tqsllib.h:135
    bool callsign_set
    QSO specifies a call worked.
    Definition: tqsllib.h:142
    bool band_set
    QSO specifies a band or frequency.
    Definition: tqsllib.h:144
    int my_dxcc
    QSO specifies MY_DXCC.
    Definition: tqsllib.h:155
    tQSL_Time time
    QSO time.
    Definition: tqsllib.h:136
    Definition: tqsllib.h:87
    int month
    Numeric month.
    Definition: tqsllib.h:89
    int year
    Numeric year.
    Definition: tqsllib.h:88
    int day
    Numeric day.
    Definition: tqsllib.h:90
    Definition: tqsllib.h:94
    int second
    Time seconds field.
    Definition: tqsllib.h:97
    int hour
    Time hour field.
    Definition: tqsllib.h:95
    int minute
    Time minute field.
    Definition: tqsllib.h:96
    Definition: tqsllib.h:109
    char password[TQSL_PASSWORD_MAX+1]
    Password.
    Definition: tqsllib.h:124
    char renew
    Rewewal reference.
    Definition: tqsllib.h:126
    char address2[TQSL_CRQ_ADDR_MAX+1]
    Address 2.
    Definition: tqsllib.h:115
    tQSL_Date qsoNotAfter
    QSOs not after date.
    Definition: tqsllib.h:123
    tQSL_Cert signer
    Signing cert.
    Definition: tqsllib.h:125
    char callSign[TQSL_CALLSIGN_MAX+1]
    Callsign.
    Definition: tqsllib.h:112
    char state[TQSL_CRQ_STATE_MAX+1]
    State.
    Definition: tqsllib.h:117
    char postalCode[TQSL_CRQ_POSTAL_MAX+1]
    Postal Code.
    Definition: tqsllib.h:118
    char providerUnit[TQSL_NAME_ELEMENT_MAX+1]
    Provider unit.
    Definition: tqsllib.h:111
    tQSL_Date qsoNotBefore
    QSOs not before date.
    Definition: tqsllib.h:122
    char name[TQSL_CRQ_NAME_MAX+1]
    Name.
    Definition: tqsllib.h:113
    char address1[TQSL_CRQ_ADDR_MAX+1]
    Address 1.
    Definition: tqsllib.h:114
    int dxccEntity
    DXCC Entity code.
    Definition: tqsllib.h:121
    char city[TQSL_CRQ_CITY_MAX+1]
    City.
    Definition: tqsllib.h:116
    char country[TQSL_CRQ_COUNTRY_MAX+1]
    Country.
    Definition: tqsllib.h:119
    char emailAddress[TQSL_CRQ_EMAIL_MAX+1]
    e-mail
    Definition: tqsllib.h:120
    char providerName[TQSL_NAME_ELEMENT_MAX+1]
    < Cert request data
    Definition: tqsllib.h:110
    Definition: tqsllib.h:101
    char emailAddress[TQSL_NAME_ELEMENT_MAX+1]
    Provider e-mail.
    Definition: tqsllib.h:104
    char url[TQSL_NAME_ELEMENT_MAX+1]
    Provider URL.
    Definition: tqsllib.h:105
    char organizationName[TQSL_NAME_ELEMENT_MAX+1]
    Provider name.
    Definition: tqsllib.h:102
    char organizationalUnitName[TQSL_NAME_ELEMENT_MAX+1]
    Provider unit.
    Definition: tqsllib.h:103
    #define CALLCONVENTION
    Symbol exports - Windows only.
    Definition: tqsllib.h:27
    void * tQSL_Location
    Opaque location type.
    Definition: tqsllib.h:83
    #define TQSL_ZONE_MAX
    Max length of a zone number.
    Definition: tqsllib.h:63
    #define TQSL_MODE_MAX
    Max length of a mode name.
    Definition: tqsllib.h:55
    #define TQSL_GRID_MAX
    Max length of a grid set.
    Definition: tqsllib.h:60
    #define TQSL_CRQ_POSTAL_MAX
    Max length of request zip.
    Definition: tqsllib.h:51
    DLLEXPORT int CALLCONVENTION tqsl_openDiagFile(const char *file)
    #define TQSL_COUNTRY_MAX
    Max length of a country name.
    Definition: tqsllib.h:62
    DLLEXPORT void CALLCONVENTION tqslTrace(const char *name, const char *format,...)
    #define TQSL_CRQ_STATE_MAX
    Max length of request state.
    Definition: tqsllib.h:50
    #define TQSL_CRQ_COUNTRY_MAX
    Max length of req entity.
    Definition: tqsllib.h:52
    DLLEXPORT void CALLCONVENTION tqsl_closeDiagFile(void)
    DLLEXPORT void CALLCONVENTION tqsl_removeUploadDatabase(void)
    #define TQSL_IOTA_MAX
    Max length of a IOTA identifier.
    Definition: tqsllib.h:64
    #define TQSL_MAX_PATH_LEN
    Max length of a FS path.
    Definition: tqsllib.h:43
    #define DLLEXPORTDATA
    Symbol exports - Windows only.
    Definition: tqsllib.h:26
    #define TQSL_PASSWORD_MAX
    Max password length.
    Definition: tqsllib.h:44
    DLLEXPORTDATA const char * tQSL_BaseDir
    Base directory for tQSL library working files.
    #define DLLEXPORT
    Symbol exports - Windows only.
    Definition: tqsllib.h:25
    DLLEXPORT int CALLCONVENTION tqsl_diagFileOpen(void)
    struct tqsl_provider_st TQSL_PROVIDER
    #define TQSL_PROPMODE_MAX
    Max length of a prop mode.
    Definition: tqsllib.h:58
    char * tQSL_StationDataEnc
    Opaque station data type.
    Definition: tqsllib.h:84
    #define TQSL_NAME_ELEMENT_MAX
    Max Org name length.
    Definition: tqsllib.h:45
    void * tQSL_Cert
    Opaque certificate type.
    Definition: tqsllib.h:82
    #define TQSL_STATE_MAX
    Max length of a state name.
    Definition: tqsllib.h:59
    #define TQSL_CALLSIGN_MAX
    Max callsign length.
    Definition: tqsllib.h:46
    #define TQSL_CNTY_MAX
    Max length of a county name.
    Definition: tqsllib.h:61
    #define TQSL_CRQ_EMAIL_MAX
    Max length of req email.
    Definition: tqsllib.h:53
    #define TQSL_SATNAME_MAX
    Max length of a sat name.
    Definition: tqsllib.h:57
    DLLEXPORTDATA const char * tQSL_RsrcDir
    Directory for resources bundled with tqsl executable.
    struct tqsl_cert_req_st TQSL_CERT_REQ
    #define TQSL_BAND_MAX
    Max length of a band name.
    Definition: tqsllib.h:54
    #define TQSL_FREQ_MAX
    Max length of a frequency.
    Definition: tqsllib.h:56
    #define TQSL_CRQ_NAME_MAX
    Max length of request name.
    Definition: tqsllib.h:47
    #define TQSL_CRQ_CITY_MAX
    Max length of request city.
    Definition: tqsllib.h:49
    #define TQSL_CRQ_ADDR_MAX
    Max length of request addr.
    Definition: tqsllib.h:48
    tqsl-2.8.1/src/dumptqsldata.cpp0000644000175000017500000000411215003421124016467 0ustar rmurphyrmurphy/*************************************************************************** dumptqsldata.c - description ------------------- begin : Mon Mar 3 2003 copyright : (C) 2003 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ /* Dumps the config data from the TQSL library */ #include #include #include #include "tqsllib.h" void errchk(int stat) { if (stat) { printf("ERROR: %s\n", tqsl_getErrorString()); exit(1); } } int main() { int count, i; const char *cp1, *cp2; tQSL_Date start, end; int low, high; char buf1[20], buf2[20]; errchk(tqsl_init()); puts("===== MODES =====\n Mode Group"); errchk(tqsl_getNumMode(&count)); for (i = 0; i < count; i++) { errchk(tqsl_getMode(i, &cp1, &cp2)); printf(" %-10.10s %s\n", cp1, cp2); } puts("\n===== BANDS =====\n Band Spectrum Low High"); errchk(tqsl_getNumBand(&count)); for (i = 0; i < count; i++) { errchk(tqsl_getBand(i, &cp1, &cp2, &low, &high)); printf(" %-10.10s %-8.8s %-8d %d\n", cp1, cp2, low, high); } puts("\n===== DXCC =====\n Entity Name"); errchk(tqsl_getNumDXCCEntity(&count)); for (i = 0; i < count; i++) { errchk(tqsl_getDXCCEntity(i, &low, &cp1)); printf(" %-6d %s\n", low, cp1); } puts("\n===== PROP_MODES =====\n Mode Descrip"); errchk(tqsl_getNumPropagationMode(&count)); for (i = 0; i < count; i++) { errchk(tqsl_getPropagationMode(i, &cp1, &cp2)); printf(" %-6s %s\n", cp1, cp2); } puts("\n===== SATELLITES =====\n Sat Start Date End Date Descrip"); errchk(tqsl_getNumSatellite(&count)); for (i = 0; i < count; i++) { errchk(tqsl_getSatellite(i, &cp1, &cp2, &start, &end)); buf1[0] = buf2[0] = '\0'; tqsl_convertDateToText(&start, buf1, sizeof buf1); tqsl_convertDateToText(&end, buf2, sizeof buf2); printf(" %-6s %-10s %-10s %s\n", cp1, buf1, buf2, cp2); } return 0; } tqsl-2.8.1/src/gen_crq.cpp0000644000175000017500000000752015003421124015410 0ustar rmurphyrmurphy/*************************************************************************** gen_crq.cpp - description ------------------- begin : Sat Dec 14 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ Generates a set of certificate-request files. ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include #include #include #include #include #include "tqsllib.h" #include "tqslexc.h" using std::cerr; using std::endl; int usage() { std::cerr << "Usage: -e email -d dxcc [-c sign_call] [-x sign_dxcc] call1 [call2 ...]" << endl; exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { string sign_call, email_addr; int dxcc = 0, sign_dxcc = 0; tQSL_Cert sign_cert = 0; try { if (tqsl_init()) throw tqslexc(); int c; while ((c = getopt(argc, argv, "c:x:e:d:")) != -1) { switch (c) { case 'c': sign_call = optarg; break; case 'x': sign_dxcc = strtol(optarg, NULL, 10); break; case 'd': dxcc = strtol(optarg, NULL, 10); break; case 'e': email_addr = optarg; break; default: usage(); } } if (optind >= argc || email_addr == "" || dxcc == 0) usage(); if (sign_call != "") { // if (sign_dxcc == 0) // usage(); tQSL_Cert *list; int ncerts; if (tqsl_selectCertificates(&list, &ncerts, sign_call.c_str(), sign_dxcc, 0, 0, 1)) throw tqslexc(); if (ncerts < 1) { string erm = "No signing certificate found for " + sign_call; if (sign_dxcc) { const char *entity; tqsl_getDXCCEntityName(sign_dxcc, &entity); erm += " with DXCC Entity="; erm += entity; } throw myexc(erm); } sign_cert = *list; } else if (sign_dxcc != 0) { usage(); } if (sign_cert) { char buf[512]; long serial; int cdxcc; if (tqsl_getCertificateIssuer(sign_cert, buf, sizeof buf)) throw tqslexc(); if (tqsl_getCertificateSerial(sign_cert, &serial)) throw tqslexc(); if (tqsl_getCertificateDXCCEntity(sign_cert, &cdxcc)) throw tqslexc(); std::cout << "Signing certificate issuer: " << buf << endl; std::cout << "Signing certificate serial: " << serial << endl; std::cout << " Signing certificate DXCC: " << cdxcc << endl; if (tqsl_beginSigning(sign_cert, const_cast(""), 0, 0)) throw tqslexc(); } TQSL_CERT_REQ crq; memset(&crq, 0, sizeof crq); strncpy(crq.name, "Ish Kabibble", sizeof crq.name); strncpy(crq.address1, "1 No Place", sizeof crq.address1); strncpy(crq.city, "City", sizeof crq.city); strncpy(crq.state, "ST", sizeof crq.state); strncpy(crq.country, "USA", sizeof crq.country); strncpy(crq.emailAddress, email_addr.c_str(), sizeof crq.emailAddress); crq.dxccEntity = dxcc; tqsl_initDate(&crq.qsoNotBefore, "1945-11-15"); crq.signer = sign_cert; for (; optind < argc; optind++) { string call = argv[optind]; strncpy(crq.callSign, call.c_str(), sizeof crq.callSign); for (char *cp = argv[optind]; *cp; cp++) { if (*cp == '/') *cp = '_'; } string filename = string(argv[optind]) + ".tq5"; std::cout << "Creating CRQ for " << crq.callSign << " DXCC=" << crq.dxccEntity << endl; if (tqsl_createCertRequest(filename.c_str(), &crq, 0, 0)) throw tqslexc(); } return EXIT_SUCCESS; } catch(exception& x) { std::cerr << "Aborting: " << x.what() << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } tqsl-2.8.1/src/load_cert.cpp0000644000175000017500000000203315003421124015720 0ustar rmurphyrmurphy/*************************************************************************** load_cert.cpp - description ------------------- begin : Sat Dec 14 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include #include #include #include "tqsllib.h" using std::string; using std::ios; using std::cerr; using std::cout; using std::endl; int cb(int, const char *msg, void *) { cout << msg << endl; return 0; } int main(int argc, char *argv[]) { if (tqsl_init()) { cerr << tqsl_getErrorString() << endl; return EXIT_FAILURE; } for (int i = 1; i < argc; i++) { if (tqsl_importTQSLFile(argv[i], cb, 0)) { cerr << tqsl_getErrorString() << endl; return EXIT_FAILURE; } } return EXIT_SUCCESS; } tqsl-2.8.1/src/location.cpp0000755000175000017500000042215715003421124015614 0ustar rmurphyrmurphy/*************************************************************************** location.cpp - description ------------------- begin : Wed Nov 6 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id: location.cpp,v 1.14 2013/03/01 13:20:30 k1mu Exp $ ***************************************************************************/ // #define DXCC_TEST #define TQSLLIB_DEF #include "location.h" #include #include #include #ifdef _WIN32 #include #endif #ifdef __APPLE__ #include #endif #include #include #include #include #include #include #include #include #include #include #include #include "tqsllib.h" #include "tqslerrno.h" #include "xml.h" #include "openssl_cert.h" #ifdef _WIN32 #include "windows.h" #endif using std::string; using std::vector; using std::map; using std::pair; using std::make_pair; using std::ofstream; using std::ios; using std::endl; using std::exception; static int init_adif_map(void); #ifdef _WIN32 #define strtok_r strtok_s #endif namespace tqsllib { class TQSL_LOCATION_ITEM { public: TQSL_LOCATION_ITEM() : ivalue(0) {} string text; string label; string zonemap; int ivalue; }; class TQSL_LOCATION_FIELD { public: TQSL_LOCATION_FIELD() {} TQSL_LOCATION_FIELD(string i_gabbi_name, const char *i_label, int i_data_type, int i_data_len, int i_input_type, int i_flags = 0); string label; string gabbi_name; int data_type; int data_len; string cdata; vector items; int idx; int idata; int input_type; int flags; bool changed; string dependency; }; TQSL_LOCATION_FIELD::TQSL_LOCATION_FIELD(string i_gabbi_name, const char *i_label, int i_data_type, int i_data_len, int i_input_type, int i_flags) : data_type(i_data_type), data_len(i_data_len), cdata(""), input_type(i_input_type), flags(i_flags) { if (!i_gabbi_name.empty()) gabbi_name = i_gabbi_name; if (i_label) label = i_label; idx = idata = 0; } typedef vector TQSL_LOCATION_FIELDLIST; class TQSL_LOCATION_PAGE { public: TQSL_LOCATION_PAGE() : complete(false), prev(0), next(0) {} bool complete; int prev, next; string dependentOn, dependency; map > hash; TQSL_LOCATION_FIELDLIST fieldlist; }; typedef vector TQSL_LOCATION_PAGELIST; class TQSL_NAME { public: explicit TQSL_NAME(string n = "", string c = "") : name(n), call(c) {} string name; string call; }; class TQSL_LOCATION { public: TQSL_LOCATION() : sentinel(0x5445), page(0), cansave(false), sign_clean(false), cert_flags(TQSL_SELECT_CERT_WITHKEYS | TQSL_SELECT_CERT_EXPIRED), newflags(false), newDXCC(-1) {} ~TQSL_LOCATION() { sentinel = 0; } int sentinel; int page; bool cansave; string name; TQSL_LOCATION_PAGELIST pagelist; vector names; string signdata; string loc_details; string qso_details; bool sign_clean; string tSTATION; string tCONTACT; string sigspec; char data_errors[512]; int cert_flags; bool newflags; int newDXCC; }; class Band { public: string name, spectrum; int low, high; }; class Mode { public: string mode, group; }; class PropMode { public: string descrip, name; }; class Satellite { public: Satellite() { start.year = start.month = start.day = 0; end.year = end.month = end.day = 0; } string descrip, name; tQSL_Date start, end; }; bool operator< (const Band& o1, const Band& o2) { static const char *suffixes[] = { "M", "CM", "MM"}; static const char *prefix_chars = "0123456789."; // get suffixes string b1_suf = o1.name.substr(o1.name.find_first_not_of(prefix_chars)); string b2_suf = o2.name.substr(o2.name.find_first_not_of(prefix_chars)); if (b1_suf != b2_suf) { // Suffixes differ -- compare suffixes int b1_idx = (sizeof suffixes / sizeof suffixes[0]); int b2_idx = b1_idx; for (int i = 0; i < static_cast(sizeof suffixes / sizeof suffixes[0]); i++) { if (b1_suf == suffixes[i]) b1_idx = i; if (b2_suf == suffixes[i]) b2_idx = i; } return b1_idx < b2_idx; } return atof(o1.name.c_str()) > atof(o2.name.c_str()); } bool operator< (const PropMode& o1, const PropMode& o2) { if (o1.descrip < o2.descrip) return true; if (o1.descrip == o2.descrip) return (o1.name < o2.name); return false; } bool operator< (const Satellite& o1, const Satellite& o2) { if (o1.descrip < o2.descrip) return true; if (o1.descrip == o2.descrip) return (o1.name < o2.name); return false; } bool operator< (const Mode& o1, const Mode& o2) { static const char *groups[] = { "CW", "PHONE", "IMAGE", "DATA" }; // m1 < m2 if m1 is a modegroup and m2 is not if (o1.mode == o1.group) { if (o2.mode != o2.group) return true; } else if (o2.mode == o2.group) { return false; } // If groups are same, compare modes if (o1.group == o2.group) return o1.mode < o2.mode; int m1_g = (sizeof groups / sizeof groups[0]); int m2_g = m1_g; for (int i = 0; i < static_cast(sizeof groups / sizeof groups[0]); i++) { if (o1.group == groups[i]) m1_g = i; if (o2.group == groups[i]) m2_g = i; } return m1_g < m2_g; } } // namespace tqsllib using tqsllib::XMLElement; using tqsllib::XMLElementList; using tqsllib::Band; using tqsllib::Mode; using tqsllib::PropMode; using tqsllib::Satellite; using tqsllib::TQSL_LOCATION; using tqsllib::TQSL_LOCATION_PAGE; using tqsllib::TQSL_LOCATION_PAGELIST; using tqsllib::TQSL_LOCATION_FIELD; using tqsllib::TQSL_LOCATION_FIELDLIST; using tqsllib::TQSL_LOCATION_ITEM; using tqsllib::TQSL_NAME; using tqsllib::ROOTCERT; using tqsllib::CACERT; using tqsllib::USERCERT; using tqsllib::tqsl_get_pem_serial; #define CAST_TQSL_LOCATION(x) (reinterpret_cast((x))) typedef map IntMap; typedef map BoolMap; typedef map DateMap; static int num_entities = 0; static bool _ent_init = false; static struct _dxcc_entity { int number; const char* name; const char *zonemap; tQSL_Date start, end; } *entity_list = 0; template struct triplet { T1 first; T2 middle; T3 last; }; template triplet make_triplet(const T1 &f, const T2 &m, const T3 &l) { triplet trip; trip.first = f; trip.middle = m; trip.last = l; return trip; } // config data static XMLElement tqsl_xml_config; static int tqsl_xml_config_major = -1; static int tqsl_xml_config_minor = 0; static IntMap DXCCMap; static BoolMap DeletedMap; static IntMap DXCCZoneMap; static DateMap DXCCStartMap; static DateMap DXCCEndMap; static vector< pair > DXCCList; static vector BandList; static vector ModeList; static vector PropModeList; static vector SatelliteList; static map tqsl_page_map; static map tqsl_field_map; static map tqsl_adif_map; static vector tqsl_adif_mode_map; static map tqsl_adif_submode_map; static map > tqsl_cabrillo_map; static map > tqsl_cabrillo_user_map; static const char* cacertpem = {"-----BEGIN CERTIFICATE-----\n" "MIIGeDCCBGCgAwIBAgIUV31ApzN0aZACaQt7FGB26Mu5t4kwDQYJKoZIhvcNAQEL\n" "BQAwgdIxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDVDESMBAGA1UEBwwJTmV3aW5n\n" "dG9uMSQwIgYDVQQKDBtBbWVyaWNhbiBSYWRpbyBSZWxheSBMZWFndWUxHTAbBgNV\n" "BAsMFExvZ2Jvb2sgb2YgdGhlIFdvcmxkMSUwIwYDVQQDDBxMb2dib29rIG9mIHRo\n" "ZSBXb3JsZCBSb290IENBMRgwFgYKCZImiZPyLGQBGRYIYXJybC5vcmcxHDAaBgkq\n" "hkiG9w0BCQEWDWxvdHdAYXJybC5vcmcwHhcNMTkwNjE5MTQxNzU4WhcNMjMwNjE5\n" "MTQxNzU4WjCB2DELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNUMRIwEAYDVQQHDAlO\n" "ZXdpbmd0b24xJDAiBgNVBAoMG0FtZXJpY2FuIFJhZGlvIFJlbGF5IExlYWd1ZTEd\n" "MBsGA1UECwwUTG9nYm9vayBvZiB0aGUgV29ybGQxKzApBgNVBAMMIkxvZ2Jvb2sg\n" "b2YgdGhlIFdvcmxkIFByb2R1Y3Rpb24gQ0ExGDAWBgoJkiaJk/IsZAEZFghhcnJs\n" "Lm9yZzEcMBoGCSqGSIb3DQEJARYNbG90d0BhcnJsLm9yZzCCASIwDQYJKoZIhvcN\n" "AQEBBQADggEPADCCAQoCggEBAM9Hf0icYR0we4cyYu/bD0mJTskM5InNxSim5Ql0\n" "OHJ2vfEY1aVZctsiW+Wj/4useYOdaO8e3NOWo80JEWpVXgQfBd1bbocHNQ1qyna7\n" "y0pVtMkvKK4ruDRCw6ZS1F5MCqVMwqR1OILukK5jlULkj+Zi1AoTD5PB1fZBlrKD\n" "xgE3XK0mGa+7bkgq694sOxR/TcCB1zfNRZBYy5g6mBVTztEJdvQvDw5rXxV4saJp\n" "MWagoknoc0sIQDsvOtP7/IWeov4Cnng+EwvKhHr2oHQ1U/DXo+ESOKt11UHqckQI\n" "cN0aFZZVLtdVoRMAkj+4AHS0nfrs9noLgwryZbaMcv1WQxUCAwEAAaOCATwwggE4\n" "MB0GA1UdDgQWBBSon29qgLN1wj/t5xz8TzNwqOwuvzCCAQcGA1UdIwSB/zCB/IAU\n" "x/zKwnPFr8tb9TpgfZqcGu/AjZOhgdikgdUwgdIxCzAJBgNVBAYTAlVTMQswCQYD\n" "VQQIDAJDVDESMBAGA1UEBwwJTmV3aW5ndG9uMSQwIgYDVQQKDBtBbWVyaWNhbiBS\n" "YWRpbyBSZWxheSBMZWFndWUxHTAbBgNVBAsMFExvZ2Jvb2sgb2YgdGhlIFdvcmxk\n" "MSUwIwYDVQQDDBxMb2dib29rIG9mIHRoZSBXb3JsZCBSb290IENBMRgwFgYKCZIm\n" "iZPyLGQBGRYIYXJybC5vcmcxHDAaBgkqhkiG9w0BCQEWDWxvdHdAYXJybC5vcmeC\n" "CQCD/w1L7eDLQzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCsar6K\n" "cW8QoKWmse7jBkEIG144eNc8+lzZY9h0rkDA473vS063Vh8SU08/e8LSreVfpJ1r\n" "fhcQBnk5kuvYI5TiCgoYL395DMP8r5OelD5ooS0r+OXRfMheJlW8L2nRvL2GYaZ8\n" "LO6laC3uZ5VpJrnA05rsL766BQByywWSLRH5EgFZ8SuVsnvKbHiM8fHAggaMZkFs\n" "f6bWg2QOETCufWhMKmkmMqJHQP4T4wtUjy4fay8kPMOYBHjealmK8lFrdEONPBh5\n" "Iviql+NzHPJmyB82Zv2WwlVUhoWnmUf1Lu7jcYTOmz9vNRpFls3DXoANv3l47l0W\n" "LXAiyDt/stS4MiAq9HS3IObGibFxYrDDa8F1IbyJXQsPUHEF7xuxI/Nj1TYZhOBW\n" "sGUyk+f/beRyMmx1y8cczmTqO+NqeWBhCqEqe9uLmEmpn1Fg1CdMW7aRchTwkcJh\n" "xc7Uh8smiW+DNSjH0HmLVHajyHHJOsCsSCy47xWSFvthCEHd3HMIMC+qmpOC2Ejj\n" "9dpGICTLFUD0fCvRq0bv9hwAKfnQqIbFEEmk2bT5Zi6lctPR04RUL4ICiFwkl5v0\n" "KWTBQFpTc/1KZcXHwWRgieaZ/epozvkjg51vkYlRHIPHiLIucbzwmz0qtkOjzfIK\n" "euRFuHg4j85bSZ3Nd+cvb09Fdr5xeJtHsCIn4g==\n" "-----END CERTIFICATE-----"}; static const char* rootcertpem = {"-----BEGIN CERTIFICATE-----\n" "MIIHZzCCBU+gAwIBAgIJAIP/DUvt4MtDMA0GCSqGSIb3DQEBDQUAMIHSMQswCQYD\n" "VQQGEwJVUzELMAkGA1UECAwCQ1QxEjAQBgNVBAcMCU5ld2luZ3RvbjEkMCIGA1UE\n" "CgwbQW1lcmljYW4gUmFkaW8gUmVsYXkgTGVhZ3VlMR0wGwYDVQQLDBRMb2dib29r\n" "IG9mIHRoZSBXb3JsZDElMCMGA1UEAwwcTG9nYm9vayBvZiB0aGUgV29ybGQgUm9v\n" "dCBDQTEYMBYGCgmSJomT8ixkARkWCGFycmwub3JnMRwwGgYJKoZIhvcNAQkBFg1s\n" "b3R3QGFycmwub3JnMB4XDTE1MDYwOTE1MzQyOFoXDTI1MDYwNjE1MzQyOFowgdIx\n" "CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDVDESMBAGA1UEBwwJTmV3aW5ndG9uMSQw\n" "IgYDVQQKDBtBbWVyaWNhbiBSYWRpbyBSZWxheSBMZWFndWUxHTAbBgNVBAsMFExv\n" "Z2Jvb2sgb2YgdGhlIFdvcmxkMSUwIwYDVQQDDBxMb2dib29rIG9mIHRoZSBXb3Js\n" "ZCBSb290IENBMRgwFgYKCZImiZPyLGQBGRYIYXJybC5vcmcxHDAaBgkqhkiG9w0B\n" "CQEWDWxvdHdAYXJybC5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\n" "AQDSV3CQz8/crg7uxPj/i3R8qs8vFqGOl3gWk4/BcKnJaYSf3I59cY3SlNxJhQmc\n" "zfAwOErOGW9C5gGInJJvpCLIkKZnHAeFhaNNn09/PaAPM0YrhTZMjUsHedhz9ObR\n" "UcZl7LEMhih9ctd3iPBf8FckG8MvgBJcMdMB1TrJfu8PekgRZtGKIG61tJc1tGYc\n" "RimmSaG3i4R0ZdiToj+tOifjbElDaLKTVnIn4YALSmA0RsB+UmPRZ/qMhI9663TM\n" "NsJfurcQL6TXg+EIHNnGlGa62y4cjNIPJdTI7Pk4rsL+WT4n7bZR+AWUVMXT6IYa\n" "ZvisOxmUM1qX9pYrcXf8OsWITE2GRRNMQZP+jVHQ3d4tl7JDNrNPziY1Oz9PLtud\n" "56ajJLf7smebsyza6e6NhZNgOhsSfbwu25fSc3b5xynI0TSwkz//J4szr8sfwkVJ\n" "whWoNG9GSONSHqnTQEaGVVarVpQUO9ZeuzOo3nZkSp7HH/aaf2akNGlwEqkqytn7\n" "HiYQKwbA54Vs+VRIX71TktF9KEdy6p03hVSfs9zqWuBLKdAX2een0IDTK9e8mdNF\n" "/9s4A5Q0mxASBrY9fe+FV347MLNctxDbaqeMcUsMBiyaihtTWmtZzC4zhBuccVW1\n" "u+YO26uodyGJ2ID7SQSyZDhiopWZLug//mhpTvvu8OZeewIDAQABo4IBPDCCATgw\n" "HQYDVR0OBBYEFMf8ysJzxa/LW/U6YH2anBrvwI2TMIIBBwYDVR0jBIH/MIH8gBTH\n" "/MrCc8Wvy1v1OmB9mpwa78CNk6GB2KSB1TCB0jELMAkGA1UEBhMCVVMxCzAJBgNV\n" "BAgMAkNUMRIwEAYDVQQHDAlOZXdpbmd0b24xJDAiBgNVBAoMG0FtZXJpY2FuIFJh\n" "ZGlvIFJlbGF5IExlYWd1ZTEdMBsGA1UECwwUTG9nYm9vayBvZiB0aGUgV29ybGQx\n" "JTAjBgNVBAMMHExvZ2Jvb2sgb2YgdGhlIFdvcmxkIFJvb3QgQ0ExGDAWBgoJkiaJ\n" "k/IsZAEZFghhcnJsLm9yZzEcMBoGCSqGSIb3DQEJARYNbG90d0BhcnJsLm9yZ4IJ\n" "AIP/DUvt4MtDMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQENBQADggIBACtCtzn8\n" "41EpI7W55nNMIBcqBrzs2fil61aOt7b6BHk+KpFWonsKMcCsnT4W6yye+lG7aKf9\n" "eGjrxaSd8vHDKiYwr5fp2ahqmDyROtYyJgSJpurQUA+pB5lrIip2IuVNu3g92x7o\n" "CeGgGNU99/2WK0JXPVIAmTY4MO8B6wZ/ZVgB+QLfFEvMBWSiosnwfgT2cGynqCpz\n" "n5Q9SOFDAd83IjaOuuEssfLaRB1o3/UAS/wXgVLm5h+VjWLQ3176YPx/j6Ik+XAg\n" "QAQKLSyGhlZzVeRwPzCXKsAdPqIG7EUSLgqv2I9XyPS6zsI+UVw3WvJO3D6pEN77\n" "l6bqqvPWLjnZV4jV9PF3lenA0kChe+y+gTTejXNWyew8y0TTl4NOJPWjXsvKTQox\n" "oLY+0MhsyGzVSb2/HFs/B8/G9Fp+fiPOE8iv7sHs1ONhiAy4E2UgbPBG6OSXKP0Q\n" "hYyOMmcrBVAtTkq6DXugr0e2VBhs2wHlX3hVhlwNIGBA3Xrlji1Hx3gQjS0JZa1D\n" "ZCnX6/oGCbS6pio5/TyI0b1vArTMY1Sk/LFF7KjgfXGcxGO0i55HBqQhM3O68q/c\n" "vbT46W7TQ5zZUgFBeMltaxc2z3UsTiM02nF4K4hmsfD8Equh2fA5msc+p5PuaOJR\n" "4vVAjEWroIfchuU2z2ynrs3ZxrkZjJ+x72jD\n" "-----END CERTIFICATE-----" }; static char char_toupper(char c) { return toupper(c); } static string string_toupper(const string& in) { string out = in; transform(out.begin(), out.end(), out.begin(), char_toupper); return out; } // isspace() called on extended chars in UTF-8 raises asserts in // the windows C++ libs. Don't call isspace() if out of range. // static inline int isspc(int c) { if (c < 0 || c > 255) return 0; return isspace(c); } // trim from start static inline std::string <rim(std::string &s) { #if __cplusplus > 199711L s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int c) {return !std::isspace(c);})); #else s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(isspc)))); #endif return s; } // trim from end static inline std::string &rtrim(std::string &s) { #if __cplusplus > 199711L s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch);}).base(), s.end()); #else s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(isspc))).base(), s.end()); #endif return s; } // trim from both ends static inline std::string &trim(std::string &s) { return ltrim(rtrim(s)); } #define TQSL_NPAGES 4 static TQSL_LOCATION * check_loc(tQSL_Location loc, bool unclean = true) { if (tqsl_init()) return 0; if (loc == 0) return 0; if (unclean) CAST_TQSL_LOCATION(loc)->sign_clean = false; return CAST_TQSL_LOCATION(loc); } static int tqsl_load_xml_config() { if (tqsl_xml_config.getElementList().size() > 0) // Already init'd return 0; XMLElement default_config; XMLElement user_config; tqslTrace("tqsl_load_xml_config", NULL); #ifdef _WIN32 string default_path = string(tQSL_RsrcDir) + "\\config.xml"; string user_path = string(tQSL_BaseDir) + "\\config.xml"; #else string default_path = string(tQSL_RsrcDir) + "/config.xml"; string user_path = string(tQSL_BaseDir) + "/config.xml"; #endif tqslTrace("tqsl_load_xml_config", "user_path=%s", user_path.c_str()); int default_status = default_config.parseFile(default_path.c_str()); int user_status = user_config.parseFile(user_path.c_str()); tqslTrace("tqsl_load_xml_config", "default_status=%d, user_status=%d", default_status, user_status); if (default_status != XML_PARSE_NO_ERROR && user_status != XML_PARSE_NO_ERROR) { if (user_status == XML_PARSE_SYSTEM_ERROR) tQSL_Error = TQSL_CONFIG_ERROR; else tQSL_Error = TQSL_CONFIG_SYNTAX_ERROR; return 1; } int default_major = -1; int default_minor = 0; int user_major = -1; int user_minor = 0; XMLElement top; if (default_config.getFirstElement("tqslconfig", top)) { default_major = strtol(top.getAttribute("majorversion").first.c_str(), NULL, 10); default_minor = strtol(top.getAttribute("minorversion").first.c_str(), NULL, 10); } if (user_config.getFirstElement("tqslconfig", top)) { user_major = strtol(top.getAttribute("majorversion").first.c_str(), NULL, 10); user_minor = strtol(top.getAttribute("minorversion").first.c_str(), NULL, 10); } if (default_major > user_major || (default_major == user_major && default_minor > user_minor)) { tqsl_xml_config = default_config; tqsl_xml_config_major = default_major; tqsl_xml_config_minor = default_minor; return 0; } if (user_major < 0) { tQSL_Error = TQSL_CONFIG_SYNTAX_ERROR; tqslTrace("tqsl_load_xml_config", "Syntax error"); return 1; } tqsl_xml_config = user_config; tqsl_xml_config_major = user_major; tqsl_xml_config_minor = user_minor; return 0; } static VUCCGridList VUCC; static bool initVUCC(void) { static bool failed = false; if (failed) return failed; if (VUCC.size() != 0) return failed; FILE *in; #ifdef _WIN32 string path = string(tQSL_RsrcDir) + "\\vuccgrids.dat"; wchar_t* wfilename = utf8_to_wchar(path.c_str()); if ((in = _wfopen(wfilename, L"rb")) == NULL) { free_wchar(wfilename); #else string path = string(tQSL_RsrcDir) + "/vuccgrids.dat"; if ((in = fopen(path.c_str(), "rb")) == NULL) { #endif failed = true; tqslTrace("initVUCC", "Unable to open vuccgrids.dat, %m"); return failed; } char buf[100]; char *cp; while ((cp = fgets(buf, sizeof buf, in)) != 0) { int l = strlen(buf); for (l--; l > 0 && isspc(buf[l]); l--) { buf[l] = '\0'; } char *state = NULL; char *dxcc = strtok_r(buf, ",", &state); if (!dxcc) { // parse error fclose(in); tqslTrace("initVUCC", "invalid input - no tokens"); failed = true; return failed; } int ent = strtol(dxcc, NULL, 10); if (ent == 0 && errno == EINVAL) { // Bad input fclose(in); tqslTrace("initVUCC", "invalid input - not an entity number %s", dxcc); failed = true; return failed; } char *thispas = strtok_r(NULL, ",", &state); if (thispas == NULL) { tqslTrace("initVUCC", "invalid input - no PAS"); failed = true; fclose(in); return failed; } char *thisgrid = strtok_r(NULL, ",", &state); if (thisgrid == NULL) { // No PAS thisgrid = thispas; thispas = NULL; } if (ent != 9999) { // Header VUCC.push_back(VUCCgrid(ent, thispas, thisgrid)); } } fclose(in); return failed; } DLLEXPORT int CALLCONVENTION tqsl_validateVUCCGrid(int entity, const char *pas, const char *grid, int *result) { *result = 0; if (initVUCC()) { // fnf or corrupt *result = TQSL_VALID_VUCC_PAS|TQSL_VALID_VUCC_ENT; return 0; } for (size_t i = 0; i < VUCC.size(); i++) { if (VUCC[i].ent() < entity) continue; if (VUCC[i].ent() > entity) break; if (!strcmp(grid, VUCC[i].grid())) { // Valid grid for this entity tqslTrace("tqsl_validateVUCCGrid", "matches entity"); *result |= TQSL_VALID_VUCC_ENT; if (pas == NULL || strlen(pas) == 0) { // and empty PAS *result |= TQSL_VALID_VUCC_PAS; break; } if (VUCC[i].pas() == NULL || strlen(VUCC[i].pas()) == 0) {// No PAS for this grid/ent *result |= TQSL_VALID_VUCC_PAS; break; } if (pas && VUCC[i].pas() && (!strcmp(pas, VUCC[i].pas()))) { // Plus valid grid for this PAS tqslTrace("tqsl_validateVUCCGrid", "matches PAS and entity"); *result |= TQSL_VALID_VUCC_PAS; break; } } } if (*result == 0) { tqslTrace("tqsl_validateVUCCGrid", "Grid not found"); } return 0; } DLLEXPORT int CALLCONVENTION tqsl_verifyGridFormat(const char *grid, int twelve, char* newGrid, int newlen) { if (grid == NULL) { return 1; } string gtest = string(grid); // Uppercase and remove whitespace gtest = string_toupper(gtest); trim(gtest); // Truncate to size limit gtest = gtest.substr(0, twelve? 12 : 6); switch (gtest.size()) { case 4: case 6: break; case 8: case 10: case 12: if (twelve) break; default: // Not long enough yet or too long. return GRID_ERROR_INVALID_FORMAT; } // Field - range A-R if (gtest[0] < 'A' || gtest[0] > 'R') return GRID_ERROR_INVALID_FIELD; if (gtest[1] < 'A' || gtest[1] > 'R') return GRID_ERROR_INVALID_FIELD; if (gtest[2] < '0' || gtest[2] > '9') return GRID_ERROR_INVALID_SQUARE; if (gtest[3] < '0' || gtest[3] > '9') return GRID_ERROR_INVALID_SUBSQUARE; if (gtest.size() > 4) { if (gtest[4] < 'A' || gtest[4] > 'X') return GRID_ERROR_INVALID_SUBSQUARE; if (gtest[5] < 'A' || gtest[5] > 'X') return GRID_ERROR_INVALID_SUBSQUARE; } if (gtest.size() > 6) { if (gtest[6] < '0' || gtest[6] > '9') return GRID_ERROR_INVALID_SUBSUBSQUARE; if (gtest[7] < '0' || gtest[7] > '9') return GRID_ERROR_INVALID_SUBSUBSQUARE; } if (gtest.size() > 8) { if (gtest[8] < 'A' || gtest[8] > 'X') return GRID_ERROR_INVALID_SUBSUBSQUARE; if (gtest[9] < 'A' || gtest[9] > 'X') return GRID_ERROR_INVALID_SUBSUBSQUARE; } if (gtest.size() > 10) { if (gtest[10] < '0' || gtest[10] > '9') return GRID_ERROR_INVALID_SUBSUBSQUARE; if (gtest[11] < '0' || gtest[11] > '9') return GRID_ERROR_INVALID_SUBSUBSQUARE; } strncpy(newGrid, gtest.c_str(), newlen); newGrid[newlen - 1] = '\0'; return 0; } static int tqsl_get_xml_config_section(const string& section, XMLElement& el) { if (tqsl_load_xml_config()) return 1; XMLElement top; if (!tqsl_xml_config.getFirstElement("tqslconfig", top)) { tqsl_xml_config.clear(); tQSL_Error = TQSL_CONFIG_SYNTAX_ERROR; return 1; } if (!top.getFirstElement(section, el)) { tQSL_Error = TQSL_CONFIG_SYNTAX_ERROR; return 1; } return 0; } static int tqsl_load_provider_list(vector &plist) { plist.clear(); XMLElement providers; if (tqsl_get_xml_config_section("providers", providers)) return 1; tqslTrace("tqsl_load_provider_list", NULL); XMLElement provider; bool gotit = providers.getFirstElement("provider", provider); while (gotit) { TQSL_PROVIDER pdata; memset(&pdata, 0, sizeof pdata); pair rval = provider.getAttribute("organizationName"); if (!rval.second) { tQSL_Error = TQSL_PROVIDER_NOT_FOUND; tqslTrace("tqsl_load_provider_list", "Providers not found"); return 1; } strncpy(pdata.organizationName, rval.first.c_str(), sizeof pdata.organizationName); XMLElement item; if (provider.getFirstElement("organizationalUnitName", item)) strncpy(pdata.organizationalUnitName, item.getText().c_str(), sizeof pdata.organizationalUnitName); if (provider.getFirstElement("emailAddress", item)) strncpy(pdata.emailAddress, item.getText().c_str(), sizeof pdata.emailAddress); if (provider.getFirstElement("url", item)) strncpy(pdata.url, item.getText().c_str(), sizeof pdata.url); plist.push_back(pdata); gotit = providers.getNextElement(provider); if (gotit && provider.getElementName() != "provider") break; } return 0; } static XMLElement tCONTACT_sign; static int make_sign_data(TQSL_LOCATION *loc) { map field_data; // Loop through the location pages, getting field data // int old_page = loc->page; tqsl_setStationLocationCapturePage(loc, 1); do { TQSL_LOCATION_PAGE& p = loc->pagelist[loc->page-1]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD& f = p.fieldlist[i]; string s; if (f.input_type == TQSL_LOCATION_FIELD_DDLIST || f.input_type == TQSL_LOCATION_FIELD_LIST) { if (f.idx < 0 || f.idx >= static_cast(f.items.size())) s = ""; else s = f.items[f.idx].text; } else if (f.data_type == TQSL_LOCATION_FIELD_INT) { char buf[20]; snprintf(buf, sizeof buf, "%d", f.idata); s = buf; } else { s = f.cdata; } field_data[f.gabbi_name] = s; } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; tqsl_nextStationLocationCapture(loc); } while (1); tqsl_setStationLocationCapturePage(loc, old_page); loc->signdata = ""; loc->loc_details = ""; loc->sign_clean = false; XMLElement sigspecs; if (tqsl_get_xml_config_section("sigspecs", sigspecs)) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - it does not have a sigspecs section", sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } XMLElement sigspec; XMLElement ss; if (!sigspecs.getFirstElement("sigspec", sigspec)) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - it does not have a sigspec section", sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } ss = sigspec; bool ok; do { if (sigspec.getAttribute("status").first == "deprecated") { ok = sigspecs.getNextElement(sigspec); continue; } double ssver = atof(ss.getAttribute("version").first.c_str()); double newver = atof(sigspec.getAttribute("version").first.c_str()); if (newver > ssver) ss = sigspec; ok = sigspecs.getNextElement(sigspec); } while (ok); sigspec = ss; loc->sigspec = "SIGN_"; loc->sigspec += sigspec.getAttribute("name").first; loc->sigspec += "_V"; loc->sigspec += sigspec.getAttribute("version").first; tCONTACT_sign.clear(); if (!sigspec.getFirstElement("tCONTACT", tCONTACT_sign)) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - missing sigspec.tCONTACT", sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } if (tCONTACT_sign.getElementList().size() == 0) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - empty sigspec.tCONTACT", sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } XMLElement tSTATION; if (!sigspec.getFirstElement("tSTATION", tSTATION)) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - missing sigspec.tSTATION", sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } XMLElement specfield; if (!(ok = tSTATION.getFirstElement(specfield))) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - missing tSTATION.specfield", sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } do { string value = field_data[specfield.getElementName()]; value = trim(value); if (value == "") { pair attr = specfield.getAttribute("required"); if (attr.second && strtol(attr.first.c_str(), NULL, 10)) { string err = specfield.getElementName() + " field required by "; attr = sigspec.getAttribute("name"); if (attr.second) err += attr.first + " "; attr = sigspec.getAttribute("version"); if (attr.second) err += "V" + attr.first + " "; err += "signature specification not found"; tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, err.c_str(), sizeof tQSL_CustomError); tqslTrace("make_sign_data", "Error %s", tQSL_CustomError); return 1; } } else { loc->signdata += value; if (loc->loc_details != "") { loc->loc_details += ", "; } loc->loc_details += specfield.getElementName() + ": " + value; } ok = tSTATION.getNextElement(specfield); } while (ok); loc->sign_clean = true; return 0; } static int init_dxcc() { if (DXCCMap.size() > 0) return 0; tqslTrace("init_dxcc", NULL); XMLElement dxcc; if (tqsl_get_xml_config_section("dxcc", dxcc)) { tqslTrace("init_dxcc", "Error %d getting dxcc config section", tQSL_Error); return 1; } XMLElement dxcc_entity; bool ok = dxcc.getFirstElement("entity", dxcc_entity); while (ok) { pair rval = dxcc_entity.getAttribute("arrlId"); pair zval = dxcc_entity.getAttribute("zonemap"); pair strdate = dxcc_entity.getAttribute("valid"); pair enddate = dxcc_entity.getAttribute("invalid"); pair deleted = dxcc_entity.getAttribute("deleted"); if (rval.second) { int num = strtol(rval.first.c_str(), NULL, 10); DXCCMap[num] = dxcc_entity.getText(); DeletedMap[num] = false; if (deleted.second) { DeletedMap[num] = (deleted.first == "1"); } if (zval.second) { DXCCZoneMap[num] = zval.first; } tQSL_Date d; d.year = 1945; d.month = 11; d.day = 15; DXCCStartMap[num] = d; if (strdate.second) { if (!tqsl_initDate(&d, strdate.first.c_str())) { DXCCStartMap[num] = d; } } d.year = 0; d.month = 0; d.day = 0; DXCCEndMap[num] = d; if (enddate.second) { if (!tqsl_initDate(&d, enddate.first.c_str())) { DXCCEndMap[num] = d; } } DXCCList.push_back(make_pair(num, dxcc_entity.getText())); } ok = dxcc.getNextElement(dxcc_entity); } return 0; } static int init_band() { if (BandList.size() > 0) return 0; tqslTrace("init_band", NULL); XMLElement bands; if (tqsl_get_xml_config_section("bands", bands)) { tqslTrace("init_band", "Error %d getting bands", tQSL_Error); return 1; } XMLElement config_band; bool ok = bands.getFirstElement("band", config_band); while (ok) { Band b; b.name = config_band.getText(); b.spectrum = config_band.getAttribute("spectrum").first; b.low = strtol(config_band.getAttribute("low").first.c_str(), NULL, 10); b.high = strtol(config_band.getAttribute("high").first.c_str(), NULL, 10); BandList.push_back(b); ok = bands.getNextElement(config_band); } sort(BandList.begin(), BandList.end()); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getConfigVersion(int *major, int *minor) { if (tqsl_init()) return 1; if (tqsl_load_xml_config()) { tqslTrace("tqsl_getConfigVersion", "Error %d from tqsl_load_xml_config", tQSL_Error); return 1; } tqslTrace("tqsl_getConfigVersion", "major=%d, minor=%d", tqsl_xml_config_major, tqsl_xml_config_minor); if (major) *major = tqsl_xml_config_major; if (minor) *minor = tqsl_xml_config_minor; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumBand(int *number) { if (number == 0) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tqslTrace("tqsl_getNumBand", NULL); if (init_band()) { tqslTrace("tqsl_getNumBand", "init_band error=%d", tQSL_Error); return 1; } *number = BandList.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getBand(int index, const char **name, const char **spectrum, int *low, int *high) { if (index < 0 || name == 0) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_band()) { tqslTrace("tqsl_getBand", "init_band error=%d", tQSL_Error); return 1; } if (index >= static_cast(BandList.size())) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_getBand", "init_band arg error - index %d", index); return 1; } *name = BandList[index].name.c_str(); if (spectrum) *spectrum = BandList[index].spectrum.c_str(); if (low) *low = BandList[index].low; if (high) *high = BandList[index].high; return 0; } static int init_mode() { if (ModeList.size() > 0) return 0; XMLElement modes; if (tqsl_get_xml_config_section("modes", modes)) { tqslTrace("init_mode", "Error from tqsl_get_xml_config_section %d", tQSL_Error); return 1; } XMLElement config_mode; bool ok = modes.getFirstElement("mode", config_mode); while (ok) { Mode m; m.mode = config_mode.getText(); m.group = config_mode.getAttribute("group").first; ModeList.push_back(m); ok = modes.getNextElement(config_mode); } sort(ModeList.begin(), ModeList.end()); return 0; } static int init_propmode() { if (PropModeList.size() > 0) return 0; XMLElement propmodes; if (tqsl_get_xml_config_section("propmodes", propmodes)) { tqslTrace("init_propmode", "Error getting config section %d", tQSL_Error); return 1; } XMLElement config_mode; bool ok = propmodes.getFirstElement("propmode", config_mode); while (ok) { PropMode p; p.descrip = config_mode.getText(); p.name = config_mode.getAttribute("name").first; PropModeList.push_back(p); ok = propmodes.getNextElement(config_mode); } sort(PropModeList.begin(), PropModeList.end()); return 0; } static int init_satellite() { if (SatelliteList.size() > 0) return 0; XMLElement satellites; if (tqsl_get_xml_config_section("satellites", satellites)) { tqslTrace("init_satellite", "Error getting config section %d", tQSL_Error); return 1; } XMLElement config_sat; bool ok = satellites.getFirstElement("satellite", config_sat); while (ok) { Satellite s; s.descrip = config_sat.getText(); s.name = config_sat.getAttribute("name").first; tQSL_Date d; if (!tqsl_initDate(&d, config_sat.getAttribute("startDate").first.c_str())) s.start = d; if (!tqsl_initDate(&d, config_sat.getAttribute("endDate").first.c_str())) s.end = d; SatelliteList.push_back(s); ok = satellites.getNextElement(config_sat); } sort(SatelliteList.begin(), SatelliteList.end()); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumMode(int *number) { if (tqsl_init()) return 1; if (number == NULL) { tqslTrace("tqsl_getNumMode", "Argument error, number = 0x%lx", number); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_mode()) { tqslTrace("tqsl_getNumMode", "init_mode error %d", tQSL_Error); return 1; } *number = ModeList.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getMode(int index, const char **mode, const char **group) { if (index < 0 || mode == NULL) { tqslTrace("tqsl_getMode", "Arg error index=%d, mode=0x%lx, group=0x%lx", index, mode, group); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_mode()) { tqslTrace("tqsl_getMode", "init_mode error %d", tQSL_Error); return 1; } if (index >= static_cast(ModeList.size())) { tqslTrace("tqsl_getMode", "Argument error: %d", index); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *mode = ModeList[index].mode.c_str(); if (group) *group = ModeList[index].group.c_str(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumADIFMode(int *number) { if (tqsl_init()) return 1; if (number == NULL) { tqslTrace("tqsl_getNumADIFMode", "Argument error, number = 0x%lx", number); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_adif_map()) { tqslTrace("tqsl_getNumADIFMode", "init_mode error %d", tQSL_Error); return 1; } *number = tqsl_adif_mode_map.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry(int index, const char **mode) { if (tqsl_init()) return 1; if (mode == NULL) { tqslTrace("tqsl_getADIFMode", "Argument error, mode = 0x%lx", mode); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_adif_map()) { tqslTrace("tqsl_getADIFMode", "init_mode error %d", tQSL_Error); return 1; } if (index < 0 || index > static_cast (tqsl_adif_mode_map.size())) { tqslTrace("tqsl_getADIFMode", "Argument error, index = %d", index); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *mode = tqsl_adif_mode_map[index].c_str(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumDXCCEntity(int *number) { if (number == NULL) { tqslTrace("tqsl_getNumDXCCEntity", "Arg error - number=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getNumDXCCEntity", "init_dxcc error %d", tQSL_Error); return 1; } *number = DXCCList.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity(int index, int *number, const char **name) { if (index < 0 || name == NULL || number == NULL) { tqslTrace("tqsl_getDXCCEntity", "arg error index=%d, number = 0x%lx, name=0x%lx", index, number, name); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getDXCCEntity", "init_dxcc error %d", tQSL_Error); return 1; } if (index >= static_cast(DXCCList.size())) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_getDXCCEntity", "index range %d", index); return 1; } *number = DXCCList[index].first; *name = DXCCList[index].second.c_str(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName(int number, const char **name) { if (name == NULL) { tqslTrace("tqsl_getDXCCEntityName", "Name=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getDXCCEntityName", "init_dxcc error %d", tQSL_Error); return 1; } IntMap::const_iterator it; it = DXCCMap.find(number); if (it == DXCCMap.end()) { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } *name = it->second.c_str(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap(int number, const char **zonemap) { if (zonemap == NULL) { tqslTrace("tqsl_getDXCCZoneMap", "zonemap ptr null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getDXCCZoneMap", "init_dxcc error %d", tQSL_Error); return 1; } IntMap::const_iterator it; it = DXCCZoneMap.find(number); if (it == DXCCZoneMap.end()) { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } const char *map = it->second.c_str(); if (!map || map[0] == '\0') { *zonemap = NULL; } else { *zonemap = map; } return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDXCCStartDate(int number, tQSL_Date *d) { if (d == NULL) { tqslTrace("tqsl_getDXCCStartDate", "date ptr null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getDXCCStartDate", "init_dxcc error %d", tQSL_Error); return 1; } DateMap::const_iterator it; it = DXCCStartMap.find(number); if (it == DXCCStartMap.end()) { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } tQSL_Date newdate = it->second; *d = newdate; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDXCCEndDate(int number, tQSL_Date *d) { if (d == NULL) { tqslTrace("tqsl_getDXCCEndDate", "date ptr null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getDXCCEndDate", "init_dxcc error %d", tQSL_Error); return 1; } DateMap::const_iterator it; it = DXCCEndMap.find(number); if (it == DXCCEndMap.end()) { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } tQSL_Date newdate = it->second; *d = newdate; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted(int number, int *deleted) { if (deleted == NULL) { tqslTrace("tqsl_getDXCCDeleted", "Name=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_dxcc()) { tqslTrace("tqsl_getDXCCDeleted", "init_dxcc error %d", tQSL_Error); return 1; } *deleted = 0; BoolMap::const_iterator it; it = DeletedMap.find(number); if (it == DeletedMap.end()) { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } *deleted = it->second; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumPropagationMode(int *number) { if (tqsl_init()) return 1; if (number == NULL) { tqslTrace("tqsl_getNumPropagationMode", "number=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_propmode()) { tqslTrace("tqsl_getNumPropagationMode", "init_propmode error %d", tQSL_Error); return 1; } *number = PropModeList.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode(int index, const char **name, const char **descrip) { if (index < 0 || name == NULL) { tqslTrace("tqsl_getPropagationMode", "arg error index=%d name=0x%lx descrip=0x%lx", index, name, descrip); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_propmode()) { tqslTrace("tqsl_getPropagationMode", "init_propmode error %d", tQSL_Error); return 1; } if (index >= static_cast(PropModeList.size())) { tqslTrace("tqsl_getPropagationMode", "index out of range: %d", index); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *name = PropModeList[index].name.c_str(); if (descrip) *descrip = PropModeList[index].descrip.c_str(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumSatellite(int *number) { if (tqsl_init()) return 1; if (number == NULL) { tqslTrace("tqsl_getNumSatellite", "arg error number = null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_satellite()) { tqslTrace("tqsl_getNumSatellite", "init_satellite error %d", tQSL_Error); return 1; } *number = SatelliteList.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getSatellite(int index, const char **name, const char **descrip, tQSL_Date *start, tQSL_Date *end) { if (index < 0 || name == NULL) { tqslTrace("tqsl_getSatellite", "arg error index=%d name=0x%lx", index, name); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_satellite()) { tqslTrace("tqsl_getSatellite", "init_satellite error %d", tQSL_Error); return 1; } if (index >= static_cast(SatelliteList.size())) { tqslTrace("tqsl_getSatellite", "index error %d", index); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *name = SatelliteList[index].name.c_str(); if (descrip) *descrip = SatelliteList[index].descrip.c_str(); if (start) *start = SatelliteList[index].start; if (end) *end = SatelliteList[index].end; return 0; } static int init_cabrillo_map() { if (tqsl_cabrillo_map.size() > 0) return 0; XMLElement cabrillo_map; if (tqsl_get_xml_config_section("cabrillomap", cabrillo_map)) { tqslTrace("init_cabrillo_map", "get_xml_config_section error %d", tQSL_Error); return 1; } XMLElement cabrillo_item; bool ok = cabrillo_map.getFirstElement("cabrillocontest", cabrillo_item); int call_field = 0; int grid_field = 0; while (ok) { if (cabrillo_item.getText() != "") { call_field = strtol(cabrillo_item.getAttribute("field").first.c_str(), NULL, 10); grid_field = strtol(cabrillo_item.getAttribute("gridsquare").first.c_str(), NULL, 10); if (call_field > TQSL_MIN_CABRILLO_MAP_FIELD) { tqsl_cabrillo_map[cabrillo_item.getText()] = make_triplet(call_field - 1, grid_field - 1, (cabrillo_item.getAttribute("type").first == "VHF") ? TQSL_CABRILLO_VHF : TQSL_CABRILLO_HF); } } ok = cabrillo_map.getNextElement(cabrillo_item); } return 0; } DLLEXPORT int CALLCONVENTION tqsl_clearCabrilloMap() { tqslTrace("tqsl_clearCabrilloMap", NULL); tqsl_cabrillo_user_map.clear(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry(const char *contest, int field, int contest_type) { if (contest == NULL || field <= TQSL_MIN_CABRILLO_MAP_FIELD || (contest_type != TQSL_CABRILLO_HF && contest_type != TQSL_CABRILLO_VHF)) { tqslTrace("tqsl_setCabrilloMapEntry", "arg error contest=0x%lx field = %d", contest, field); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tqsl_cabrillo_user_map[string_toupper(contest)] = make_pair(field-1, contest_type); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry(const char *contest, int *fieldnum, int *contest_type) { if (contest == NULL || fieldnum == NULL) { tqslTrace("tqsl_getCabrilloMapEntry", "arg error contest=0x%lx fieldnum = 0x%lx", contest, fieldnum); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_cabrillo_map()) { tqslTrace("tqsl_getCabrilloMapEntry", "init_cabrillo_map error %d", tQSL_Error); return 1; } map >::iterator it; map >::iterator uit; if ((uit = tqsl_cabrillo_user_map.find(string_toupper(contest))) == tqsl_cabrillo_user_map.end()) { if ((it = tqsl_cabrillo_map.find(string_toupper(contest))) == tqsl_cabrillo_map.end()) { *fieldnum = 0; return 0; } else { *fieldnum = it->second.first + 1 + ((it->second.middle + 1) * 1000); } if (contest_type) *contest_type = it->second.last; } else { *fieldnum = uit->second.first + 1; if (contest_type) *contest_type = uit->second.second; } return 0; } static int init_adif_map() { if (tqsl_adif_map.size() > 0) return 0; XMLElement adif_map; if (tqsl_get_xml_config_section("adifmap", adif_map)) { tqslTrace("init_adif_map", "tqsl_get_xml_config_section error %d", tQSL_Error); return 1; } XMLElement adif_item; bool ok = adif_map.getFirstElement("adifmode", adif_item); while (ok) { string adifmode = adif_item.getAttribute("adif-mode").first; string submode = adif_item.getAttribute("adif-submode").first; // Prefer the "mode=" attribute of the mode definition, else get the item value. string gabbi = adif_item.getAttribute("mode").first; string melem = adif_item.getText(); if (adifmode != "" && submode != "") { tqsl_adif_submode_map[melem] = adifmode + "%" + submode; } if (adifmode == "") { // Handle entries with just a mode element adifmode = melem; } bool found = false; for (unsigned int i = 0; i < tqsl_adif_mode_map.size(); i++) { if (tqsl_adif_mode_map[i] == melem) { found = true; } } if (!found) { tqsl_adif_mode_map.push_back(melem); } if (gabbi != "") { // There should always be one if (adifmode != "") { tqsl_adif_map[adifmode] = gabbi; } // Map this gabbi mode from submode if (submode != "" && submode != adifmode) { tqsl_adif_map[submode] = gabbi; } if (melem != "" && melem != adifmode) { tqsl_adif_map[melem] = gabbi; } // Add a mode%submode lookup too if (adifmode != "" && submode != "") { tqsl_adif_map[adifmode + "%" + submode] = gabbi; } } ok = adif_map.getNextElement(adif_item); } sort(tqsl_adif_mode_map.begin(), tqsl_adif_mode_map.end()); return 0; } DLLEXPORT int CALLCONVENTION tqsl_clearADIFModes() { tqsl_adif_map.clear(); tqsl_adif_mode_map.clear(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setADIFMode(const char *adif_item, const char *mode) { if (adif_item == NULL || mode == NULL) { tqslTrace("tqsl_setADIFMode", "arg error adif_item=0x%lx mode=0x%lx", adif_item, mode); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_adif_map()) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - ADIF map invalid", sizeof tQSL_CustomError); tqslTrace("tqslSetADIFMode", "Error %s", tQSL_CustomError); return 1; } string umode = string_toupper(mode); tqsl_adif_map[string_toupper(adif_item)] = umode; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getADIFMode(const char *adif_item, char *mode, int nmode) { if (adif_item == NULL || mode == NULL) { tqslTrace("tqsl_getADIFMode", "arg error adif_item=0x%lx, mode=0x%lx", adif_item, mode); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_adif_map()) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - ADIF map invalid", sizeof tQSL_CustomError); tqslTrace("tqsl_getADIFMode", "init_adif error %s", tQSL_CustomError); return 1; } string orig = adif_item; orig = string_toupper(orig); string amode; if (tqsl_adif_map.find(orig) != tqsl_adif_map.end()) { amode = tqsl_adif_map[orig]; } else { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } if (nmode < static_cast(amode.length())+1) { tqslTrace("tqsl_getAdifMode", "buffer error %s %s", nmode, amode.length()); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } strncpy(mode, amode.c_str(), nmode); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode(const char *adif_item, char *mode, char *submode, int nmode) { if (adif_item == NULL || mode == NULL) { tqslTrace("tqsl_getADIFSubMode", "arg error adif_item=0x%lx, mode=0x%lx", adif_item, mode); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (init_adif_map()) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - ADIF map invalid", sizeof tQSL_CustomError); tqslTrace("tqsl_getADIFSubMode", "init_adif error %s", tQSL_CustomError); return 1; } string orig = adif_item; orig = string_toupper(orig); string amode; if (tqsl_adif_submode_map.find(orig) != tqsl_adif_submode_map.end()) { amode = tqsl_adif_submode_map[orig]; } else { tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } string adifmode = amode.substr(0, amode.find("%")); string adifsubmode = amode.substr(amode.find("%")+1); if (nmode < static_cast(amode.length())+1) { tqslTrace("tqsl_getAdifSubMode", "buffer error %s %s", nmode, amode.length()); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } strncpy(mode, adifmode.c_str(), nmode); strncpy(submode, adifsubmode.c_str(), nmode); return 0; } static int init_loc_maps() { if (tqsl_field_map.size() > 0) return 0; XMLElement config_pages; if (tqsl_get_xml_config_section("locpages", config_pages)) { tqslTrace("init_loc_maps", "get_xml_config_section error %d", tQSL_Error); return 1; } XMLElement config_page; tqsl_page_map.clear(); bool ok; for (ok = config_pages.getFirstElement("page", config_page); ok; ok = config_pages.getNextElement(config_page)) { pair Id = config_page.getAttribute("Id"); int page_num = strtol(Id.first.c_str(), NULL, 10); if (!Id.second || page_num < 1) { // Must have the Id! tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - page missing ID", sizeof tQSL_CustomError); tqslTrace("init_loc_maps", "error %s", tQSL_CustomError); return 1; } tqsl_page_map[page_num] = config_page; } XMLElement config_fields; if (tqsl_get_xml_config_section("locfields", config_fields)) { tqslTrace("init_loc_maps", "get_xml_config_section locfields error %d", tQSL_Error); return 1; } XMLElement config_field; for (ok = config_fields.getFirstElement("field", config_field); ok; ok = config_fields.getNextElement(config_field)) { pair Id = config_field.getAttribute("Id"); if (!Id.second) { // Must have the Id! tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - field missing ID", sizeof tQSL_CustomError); tqslTrace("init_loc_maps", "config field error %s", tQSL_CustomError); return 1; } tqsl_field_map[Id.first] = config_field; } return 0; } static bool inMap(int cqvalue, int ituvalue, bool cqz, bool ituz, const char *map) { /* * Parse the zone map and return true if the value is a valid zone number * The maps are colon-separated number pairs, with a list of pairs comma separated. */ int cq, itu; bool result = false; // No map or empty string -> all match if (!map || map[0] == '\0') { return true; } char *mapcopy = strdup(map); char *state = NULL; char *mapPart = strtok_r(mapcopy, ",", &state); while (mapPart) { sscanf(mapPart, "%d:%d", &itu, &cq); if (cqz && ituz) { if ((cq == cqvalue || cqvalue == 0) && (itu == ituvalue || ituvalue == 0)) { result = true; break; } } else if (cqz && (cq == cqvalue || cqvalue == 0)) { result = true; break; } else if (ituz && (itu == ituvalue || ituvalue == 0)) { result = true; break; } mapPart = strtok_r(NULL, ",", &state); } free(mapcopy); return result; } static int _ent_cmp(const void *a, const void *b) { return strcasecmp(((struct _dxcc_entity *)a)->name, ((struct _dxcc_entity *)b)->name); } static TQSL_LOCATION_FIELD * get_location_field_page(const string& gabbi, TQSL_LOCATION *loc, int* page = NULL) { for (int mypage = 1; mypage > 0; mypage = loc->pagelist[mypage-1].next) { TQSL_LOCATION_FIELDLIST& fl = loc->pagelist[mypage-1].fieldlist; for (int j = 0; j < static_cast(fl.size()); j++) { if (fl[j].gabbi_name == gabbi) { if (page) { *page = mypage; } return &(fl[j]); } } } return 0; } struct sasMap { const char *gabbi; const char *errstr; }; static struct sasMap sasMapping[] = { { "US_STATE", "Invalid zone selections for state" }, { "CA_PROVINCE", "Invalid zone selections for province" }, { "RU_OBLAST", "Invalid zone selections for oblast" }, { "CN_PROVINCE", "Invalid zone selections for province" }, { "AU_STATE", "Invalid zone selections for state" }, { "JA_PREFECTURE", "Invalid zone selections for prefecture" }, { "FI_KUNTA", "Invalid zone selections for kunta" }, { NULL, NULL } }; static TQSL_LOCATION_FIELD* get_primary_sub(TQSL_LOCATION* loc, string* errstr) { for (int i = 0; sasMapping[i].gabbi; i++) { TQSL_LOCATION_FIELD* temp = get_location_field_page(sasMapping[i].gabbi, loc); if (temp) { if (errstr) *errstr = sasMapping[i].errstr; return temp; } } return NULL; } static int find_next_page(TQSL_LOCATION *loc); static int update_page(int page, TQSL_LOCATION *loc) { TQSL_LOCATION_PAGE& p = loc->pagelist[page-1]; int dxcc; int current_entity = -1; int loaded_cqz = -1; int loaded_ituz = -1; TQSL_LOCATION_FIELD *cqz = get_location_field_page("CQZ", loc); TQSL_LOCATION_FIELD *ituz = get_location_field_page("ITUZ", loc); tqslTrace("update_page", "page=%d, loc=0x%lx", page, loc); for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD& field = p.fieldlist[i]; field.changed = false; if (field.gabbi_name == "CALL") { if (field.items.size() == 0 || loc->newflags) { // Build list of call signs from available certs field.changed = true; field.items.clear(); field.idx = 0; loc->newflags = false; field.flags = TQSL_LOCATION_FIELD_SELNXT; // Must be selected p.hash.clear(); tQSL_Cert *certlist; int ncerts; tqsl_selectCertificates(&certlist, &ncerts, 0, 0, 0, 0, loc->cert_flags); for (int i = 0; i < ncerts; i++) { char callsign[40]; tqsl_getCertificateCallSign(certlist[i], callsign, sizeof callsign); tqsl_getCertificateDXCCEntity(certlist[i], &dxcc); char ibuf[10]; snprintf(ibuf, sizeof ibuf, "%d", dxcc); bool found = false; // Only add a given DXCC entity to a call once. map >::iterator call_p; for (call_p = p.hash.begin(); call_p != p.hash.end(); call_p++) { if (call_p->first == callsign && call_p->second[0] == ibuf) { found = true; break; } } if (!found) p.hash[callsign].push_back(ibuf); tqsl_freeCertificate(certlist[i]); } free(certlist); // Fill the call sign list map >::iterator call_p; field.idx = 0; TQSL_LOCATION_ITEM none; none.text = "[None]"; field.items.push_back(none); for (call_p = p.hash.begin(); call_p != p.hash.end(); call_p++) { TQSL_LOCATION_ITEM item; item.text = call_p->first; if (item.text == field.cdata) field.idx = static_cast(field.items.size()); field.items.push_back(item); } if (field.idx == 0 && field.items.size() == 2) { field.idx = 1; } if (field.idx >= 0) { field.cdata = field.items[field.idx].text; } } } else if (field.gabbi_name == "DXCC") { // Note: Expects CALL to be field 0 of this page. string call = p.fieldlist[0].cdata; if (field.items.size() == 0 || call != field.dependency) { // rebuild list field.changed = true; init_dxcc(); int olddxcc = strtol(field.cdata.c_str(), NULL, 10); if (loc->newDXCC != -1) { olddxcc = loc->newDXCC; loc->newDXCC = -1; } field.items.clear(); field.idx = 0; #ifdef DXCC_TEST const char *dxcc_test = getenv("TQSL_DXCC"); if (dxcc_test) { vector &entlist = p.hash[call]; char *parse_dxcc = strdup(dxcc_test); char *state = NULL; char *cp = strtok_r(parse_dxcc, ",", &state); while (cp) { if (find(entlist.begin(), entlist.end(), string(cp)) == entlist.end()) entlist.push_back(cp); cp = strtok_r(0, ",", &state); } free(parse_dxcc); } #endif if (call == "[None]") { int i; if (!_ent_init) { num_entities = DXCCMap.size(); entity_list = new struct _dxcc_entity[num_entities]; IntMap::const_iterator it; for (it = DXCCMap.begin(), i = 0; it != DXCCMap.end(); it++, i++) { entity_list[i].number = it->first; entity_list[i].name = it->second.c_str(); entity_list[i].zonemap = DXCCZoneMap[it->first].c_str(); entity_list[i].start = DXCCStartMap[it->first]; entity_list[i].end = DXCCEndMap[it->first]; } qsort(entity_list, num_entities, sizeof(struct _dxcc_entity), &_ent_cmp); _ent_init = true; } for (i = 0; i < num_entities; i++) { TQSL_LOCATION_ITEM item; item.ivalue = entity_list[i].number; char buf[10]; snprintf(buf, sizeof buf, "%d", item.ivalue); item.text = buf; item.label = entity_list[i].name; item.zonemap = entity_list[i].zonemap; if (item.ivalue == olddxcc) { field.idx = field.items.size(); } field.items.push_back(item); } field.idx = 0; } else { vector::iterator ip; // Always have the "-NONE-" entity. TQSL_LOCATION_ITEM item; item.label = "-NONE-"; item.zonemap = ""; // This iterator walks the list of DXCC entities associated // with this callsign field.items.push_back(item); bool setIndex = false; for (ip = p.hash[call].begin(); ip != p.hash[call].end(); ip++) { item.text = *ip; item.ivalue = strtol(ip->c_str(), NULL, 10); IntMap::iterator dxcc_it = DXCCMap.find(item.ivalue); if (dxcc_it != DXCCMap.end()) { item.label = dxcc_it->second; item.zonemap = DXCCZoneMap[item.ivalue]; } if (item.ivalue == olddxcc) { field.idx = field.items.size(); setIndex = true; } field.items.push_back(item); } if (!setIndex) { field.idx = field.items.size()-1; } } if (field.items.size() > 0) { field.cdata = field.items[field.idx].text; } field.dependency = call; } // rebuild list } else { if (tqsl_field_map.find(field.gabbi_name) == tqsl_field_map.end()) { // Shouldn't happen! tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - field map mismatch.", sizeof tQSL_CustomError); tqslTrace("update_page", "field map error %s", field.gabbi_name.c_str()); return 1; } XMLElement config_field = tqsl_field_map.find(field.gabbi_name)->second; pair attr = config_field.getAttribute("dependsOn"); if (attr.first != "") { // Items list depends on other field TQSL_LOCATION_FIELD *fp = get_location_field_page(attr.first, loc); if (fp) { // Found the dependency field. Now find the enums to use string val = fp->cdata; if (fp->items.size() > 0) val = fp->items[fp->idx].text; if (val == field.dependency) continue; field.dependency = val; field.changed = true; field.items.clear(); string oldcdata = field.cdata; field.idx = 0; XMLElement enumlist; bool ok = config_field.getFirstElement("enums", enumlist); while (ok) { pair dependency = enumlist.getAttribute("dependency"); if (dependency.second && dependency.first == val) { if (!(field.flags & TQSL_LOCATION_FIELD_MUSTSEL)) { TQSL_LOCATION_ITEM item; item.label = "[None]"; field.items.push_back(item); } XMLElement enumitem; bool iok = enumlist.getFirstElement("enum", enumitem); while (iok) { TQSL_LOCATION_ITEM item; item.text = enumitem.getAttribute("value").first; item.label = enumitem.getText(); item.zonemap = enumitem.getAttribute("zonemap").first; field.items.push_back(item); if (item.text == oldcdata) { field.idx = field.items.size() - 1; } iok = enumlist.getNextElement(enumitem); } } ok = config_field.getNextElement(enumlist); } // enum loop } else { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - dependent field not found.", sizeof tQSL_CustomError); tqslTrace("update_page", "error %s", tQSL_CustomError); return 1; } } else { // No dependencies TQSL_LOCATION_FIELD *ent = get_location_field_page("DXCC", loc); current_entity = strtol(ent->cdata.c_str(), NULL, 10); bool isCQZ = field.gabbi_name == "CQZ"; bool isITUZ = field.gabbi_name == "ITUZ"; if (field.items.size() == 0 || (isCQZ && current_entity != loaded_cqz) || (isITUZ && current_entity != loaded_ituz)) { XMLElement enumlist; if (config_field.getFirstElement("enums", enumlist)) { field.items.clear(); field.idx = 0; string oldcdata = field.cdata; field.changed = true; if (!(field.flags & TQSL_LOCATION_FIELD_MUSTSEL)) { TQSL_LOCATION_ITEM item; item.label = "[None]"; field.items.push_back(item); } XMLElement enumitem; bool iok = enumlist.getFirstElement("enum", enumitem); while (iok) { TQSL_LOCATION_ITEM item; item.text = enumitem.getAttribute("value").first; item.label = enumitem.getText(); item.zonemap = enumitem.getAttribute("zonemap").first; field.items.push_back(item); if (item.text == oldcdata) { field.idx = field.items.size() - 1; } iok = enumlist.getNextElement(enumitem); } } else { // No enums supplied int ftype = strtol(config_field.getAttribute("intype").first.c_str(), NULL, 10); if (ftype == TQSL_LOCATION_FIELD_LIST || ftype == TQSL_LOCATION_FIELD_DDLIST) { // This a list field int lower = strtol(config_field.getAttribute("lower").first.c_str(), NULL, 10); int upper = strtol(config_field.getAttribute("upper").first.c_str(), NULL, 10); const char *zoneMap; /* Get the map */ if (tqsl_getDXCCZoneMap(current_entity, &zoneMap)) { zoneMap = NULL; } // Try for a zonemap from the primary subdivision TQSL_LOCATION_FIELD* pas = NULL; if (find_next_page(loc)) { pas = get_primary_sub(loc, NULL); } if (pas != NULL && pas->items.size() > 0 && (unsigned int) pas->idx < pas->items.size() && pas->items[pas->idx].zonemap != "") zoneMap = pas->items[pas->idx].zonemap.c_str(); if (upper < lower) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - field range order incorrect.", sizeof tQSL_CustomError); tqslTrace("update_page", "error %s", tQSL_CustomError); return 1; } field.items.clear(); field.idx = 0; string oldcdata = field.cdata; field.changed = true; int currentCQ = cqz->idata; int currentITU = ituz->idata; if (isCQZ) { loaded_cqz = current_entity; if (!inMap(0, currentITU, false, true, zoneMap)) { currentITU = 0; // Not valid here, ignore } } if (isITUZ) { loaded_ituz = current_entity; if (!inMap(currentCQ, 0, true, false, zoneMap)) { currentCQ = 0; // Not valid here, ignore } } if (!(field.flags & TQSL_LOCATION_FIELD_MUSTSEL)) { TQSL_LOCATION_ITEM item; item.label = "[None]"; field.items.push_back(item); } char buf[40]; for (int j = lower; j <= upper; j++) { bool zoneOK = true; if (zoneMap) { if (isCQZ) { zoneOK = inMap(j, currentITU, true, true, zoneMap); } if (isITUZ) { zoneOK = inMap(currentCQ, j, true, true, zoneMap); } } if (zoneOK) { snprintf(buf, sizeof buf, "%d", j); TQSL_LOCATION_ITEM item; item.text = buf; item.ivalue = j; field.items.push_back(item); if (item.text == oldcdata) { field.idx = field.items.size() - 1; } } } } // intype != TEXT } // enums supplied } // itemlist not empty and current entity } // no dependencies } // field name not CALL|DXCC } // field loop /* Sanity check zones */ bool zonesok = true; string zone_error = ""; int currentCQ = cqz->idata; int currentITU = ituz->idata; // Check each division, start from entity, then division TQSL_LOCATION_FIELD *entity = get_location_field_page("DXCC", loc); if (entity) { zone_error = "Invalid zone selections for DXCC entity"; if (entity && entity->idx >=0 && entity->items.size() > 0) { string dxzm = entity->items[entity->idx].zonemap; const char* dxccZoneMap = dxzm.c_str(); if (!inMap(currentCQ, currentITU, true, true, dxccZoneMap)) { zonesok = false; } } } // Entity is OK, try for the state/province/oblast TQSL_LOCATION_FIELD *state = get_primary_sub(loc, &zone_error); if (state && state->idx >=0 && state->items.size() > 0) { string szm = state->items[state->idx].zonemap; const char* stateZoneMap = szm.c_str(); if (!inMap(currentCQ, currentITU, true, true, stateZoneMap)) { zonesok = false; } } if (zonesok) { tQSL_CustomError[0] = '\0'; } else { strncpy(tQSL_CustomError, zone_error.c_str(), sizeof tQSL_CustomError); } p.complete = true; return 0; } static int make_page(TQSL_LOCATION_PAGELIST& pagelist, int page_num) { if (init_loc_maps()) { tqslTrace("make_page", "init_loc_maps error %d", tQSL_Error); return 1; } if (tqsl_page_map.find(page_num) == tqsl_page_map.end()) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - page reference could not be found.", sizeof tQSL_CustomError); tqslTrace("make_page", "Error %d %s", page_num, tQSL_CustomError); return 1; } TQSL_LOCATION_PAGE p; pagelist.push_back(p); XMLElement& config_page = tqsl_page_map[page_num]; pagelist.back().prev = strtol(config_page.getAttribute("follows").first.c_str(), NULL, 10); XMLElement config_pageField; bool field_ok = config_page.getFirstElement("pageField", config_pageField); while (field_ok) { string field_name = config_pageField.getText(); if (field_name == "" || tqsl_field_map.find(field_name) == tqsl_field_map.end()) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "TQSL Configuration file invalid - page references undefined field.", sizeof tQSL_CustomError); tqslTrace("make_page", "Error %s", tQSL_CustomError); return 1; } XMLElement& config_field = tqsl_field_map[field_name]; TQSL_LOCATION_FIELD loc_field( field_name, config_field.getAttribute("label").first.c_str(), (config_field.getAttribute("type").first == "C") ? TQSL_LOCATION_FIELD_CHAR : TQSL_LOCATION_FIELD_INT, strtol(config_field.getAttribute("len").first.c_str(), NULL, 10), strtol(config_field.getAttribute("intype").first.c_str(), NULL, 10), strtol(config_field.getAttribute("flags").first.c_str(), NULL, 10) ); // NOLINT(whitespace/parens) pagelist.back().fieldlist.push_back(loc_field); field_ok = config_page.getNextElement(config_pageField); } return 0; } DLLEXPORT int CALLCONVENTION tqsl_initStationLocationCapture(tQSL_Location *locp) { if (tqsl_init()) return 1; if (locp == NULL) { tqslTrace("tqsl_initStationLocationCapture", "Arg error locp=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_LOCATION *loc = new TQSL_LOCATION; *locp = loc; if (init_loc_maps()) { tqslTrace("tqsl_initStationLocationCapture", "init_loc_maps error %d", tQSL_Error); return 1; } map::iterator pit; for (pit = tqsl_page_map.begin(); pit != tqsl_page_map.end(); pit++) { if (make_page(loc->pagelist, pit->first)) { tqslTrace("tqsl_initStationLocationCapture", "make_page error %d", tQSL_Error); return 1; } } loc->page = 1; if (update_page(1, loc)) { tqslTrace("tqsl_initStationLocationCapture", "updatePage error %d", tQSL_Error); return 1; } return 0; } DLLEXPORT int CALLCONVENTION tqsl_endStationLocationCapture(tQSL_Location *locp) { if (tqsl_init()) return 1; if (locp == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_endStationLocationCapture", "arg error locp=NULL"); return 1; } if (*locp == 0) return 0; if (CAST_TQSL_LOCATION(*locp)->sentinel == 0x5445) delete CAST_TQSL_LOCATION(*locp); *locp = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_updateStationLocationCapture(tQSL_Location locp) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_updateStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } // TQSL_LOCATION_PAGE &p = loc->pagelist[loc->page-1]; return update_page(loc->page, loc); } DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocationCapturePages(tQSL_Location locp, int *npages) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getNumStationLocationCapturePages", "check_loc error %d", tQSL_Error); return 1; } if (npages == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_getNumStationLocationCapturePages", "arg error npages=NULL"); return 1; } *npages = loc->pagelist.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCapturePage(tQSL_Location locp, int *page) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getStationLocationCapturePage", "check_loc error %d", tQSL_Error); return 1; } if (page == NULL) { tqslTrace("tqsl_getStationLocationCapturePage", "arg error page=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *page = loc->page; return 0; } DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCapturePage(tQSL_Location locp, int page) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_setStationLocationCapturePage", "check_loc error %d", tQSL_Error); return 1; } if (page < 1 || page > static_cast(loc->pagelist.size())) { tqslTrace("tqsl_setStationLocationCapturePage", "Page %d out of range", page); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } loc->page = page; return 0; } DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCertFlags(tQSL_Location locp, int flags) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_setStationLocationCertFlags", "check_loc error %d", tQSL_Error); return 1; } if (loc->cert_flags != flags) { loc->cert_flags = flags; loc->newflags = true; loc->page = 1; if (update_page(1, loc)) { tqslTrace("tqsl_setStationLocationCertFlags", "update_page error %d", tQSL_Error); return 1; } } return 0; } static int find_next_page(TQSL_LOCATION *loc) { // Set next page based on page dependencies TQSL_LOCATION_PAGE& p = loc->pagelist[loc->page-1]; map::iterator pit; p.next = 0; for (pit = tqsl_page_map.begin(); pit != tqsl_page_map.end(); pit++) { if (strtol(pit->second.getAttribute("follows").first.c_str(), NULL, 10) == loc->page) { string dependsOn = pit->second.getAttribute("dependsOn").first; string dependency = pit->second.getAttribute("dependency").first; if (dependsOn == "") { p.next = pit->first; return 1; // Found next page } TQSL_LOCATION_FIELD *fp = get_location_field_page(dependsOn, loc); if (static_cast(fp->items.size()) > fp->idx && fp->idx >= 0 && fp->items[fp->idx].text == dependency) { p.next = pit->first; return 1; // Found next page } } } return 0; } DLLEXPORT int CALLCONVENTION tqsl_nextStationLocationCapture(tQSL_Location locp) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_nextStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } if (!find_next_page(loc)) return 0; TQSL_LOCATION_PAGE &p = loc->pagelist[loc->page-1]; if (p.next > 0) loc->page = p.next; update_page(loc->page, loc); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNextStationLocationCapturePage(tQSL_Location locp, int *page) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp)) || page == NULL) { tqslTrace("tqsl_nextStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } if (!find_next_page(loc)) return 1; TQSL_LOCATION_PAGE &p = loc->pagelist[loc->page-1]; if (p.next > 0) { *page = p.next; return 0; } return 1; } DLLEXPORT int CALLCONVENTION tqsl_prevStationLocationCapture(tQSL_Location locp) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_prevStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_PAGE &p = loc->pagelist[loc->page-1]; if (p.prev > 0) loc->page = p.prev; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getPrevStationLocationCapturePage(tQSL_Location locp, int *page) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp)) || page == NULL) { tqslTrace("tqsl_getPrevStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_PAGE &p = loc->pagelist[loc->page-1]; if (p.prev > 0) { *page = p.prev; return 0; } return 1; } DLLEXPORT int CALLCONVENTION tqsl_getCurrentStationLocationCapturePage(tQSL_Location locp, int *page) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp)) || page == NULL) { tqslTrace("tqsl_getPrevStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } *page = loc->page; return 0; } DLLEXPORT int CALLCONVENTION tqsl_hasNextStationLocationCapture(tQSL_Location locp, int *rval) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_hasNextStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } if (rval == NULL) { tqslTrace("tqsl_hasNextStationLocationCapture", "Arg error rval=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (!find_next_page(loc)) { tqslTrace("tqsl_hasNextStationLocationCapture", "find_next_page error %d", tQSL_Error); return 1; } *rval = (loc->pagelist[loc->page-1].next > 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_hasPrevStationLocationCapture(tQSL_Location locp, int *rval) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_hasPrevStationLocationCapture", "check_loc error %d", tQSL_Error); return 1; } if (rval == NULL) { tqslTrace("tqsl_hasPrevStationLocationCapture", "arg error rval=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *rval = (loc->pagelist[loc->page-1].prev > 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField(tQSL_Location locp, int *numf) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getNumLocationField", "check_loc error %d", tQSL_Error); return 1; } if (numf == NULL) { tqslTrace("tqsl_getNumLocationField", "arg error numf=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; *numf = fl.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize(tQSL_Location locp, int field_num, int *rval) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldDataLabelSize", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (rval == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldDataLabelSize", "arg error rval=0x%lx, field_num=%d", rval, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *rval = fl[field_num].label.size()+1; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel(tQSL_Location locp, int field_num, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldDataLabel", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (buf == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldDataLabel", "arg error buf=0x%lx, field_num=%d", buf, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(buf, fl[field_num].label.c_str(), bufsiz); buf[bufsiz-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize(tQSL_Location locp, int field_num, int *rval) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldDataGABBISize", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (rval == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldDataGABBISize", "arg error rval=0x%lx, field_num=%d", rval, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *rval = fl[field_num].gabbi_name.size()+1; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI(tQSL_Location locp, int field_num, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldDataGABBI", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (buf == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldDataGABBI", "arg error buf=0x%lx, field_num=%d", buf, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(buf, fl[field_num].gabbi_name.c_str(), bufsiz); buf[bufsiz-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldInputType(tQSL_Location locp, int field_num, int *type) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldInputType", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (type == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldInputType", "arg error type=0x%lx, field_num=%d", type, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *type = fl[field_num].input_type; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldChanged(tQSL_Location locp, int field_num, int *changed) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldChanged", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (changed == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldChanged", "arg error changed=0x%lx, field_num=%d", changed, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *changed = fl[field_num].changed; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataType(tQSL_Location locp, int field_num, int *type) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldDataType", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (type == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldDataType", "arg error type=0x%lx, field_num=%d", type, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *type = fl[field_num].data_type; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldFlags(tQSL_Location locp, int field_num, int *flags) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldFlags", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (flags == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldFlags", "arg error flags=0x%lx, field_num=%d", flags, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *flags = fl[field_num].flags; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLength(tQSL_Location locp, int field_num, int *rval) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldDataLength", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (rval == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldDataLength", "arg error rval=0x%lx, field_num=%d", rval, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *rval = fl[field_num].data_len; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData(tQSL_Location locp, int field_num, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldCharData", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (buf == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldCharData", "arg error buf=0x%lx, field_num=%d", buf, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (fl[field_num].flags & TQSL_LOCATION_FIELD_UPPER) strncpy(buf, string_toupper(fl[field_num].cdata).c_str(), bufsiz); else strncpy(buf, fl[field_num].cdata.c_str(), bufsiz); buf[bufsiz-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIntData(tQSL_Location locp, int field_num, int *dat) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldIntData", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (dat == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldIntData", "arg error dat=0x%lx, field_num=%d", dat, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *dat = fl[field_num].idata; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIndex(tQSL_Location locp, int field_num, int *dat) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldIndex", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (dat == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_getLocationFieldIndex", "arg error dat=0x%lx, field_num=%d", dat, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (fl[field_num].input_type != TQSL_LOCATION_FIELD_DDLIST && fl[field_num].input_type != TQSL_LOCATION_FIELD_LIST) { tqslTrace("tqsl_getLocationFieldIndex", "arg error input type mismatch"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *dat = fl[field_num].idx; return 0; } DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldCharData(tQSL_Location locp, int field_num, const char *buf) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_setLocationFieldCharData", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (buf == NULL || field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_setLocationFieldCharData", "arg error buf=0x%lx, field_num=%d", buf, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } fl[field_num].cdata = string(buf).substr(0, fl[field_num].data_len); if (fl[field_num].flags & TQSL_LOCATION_FIELD_UPPER) fl[field_num].cdata = string_toupper(fl[field_num].cdata); if (fl[field_num].input_type == TQSL_LOCATION_FIELD_DDLIST || fl[field_num].input_type == TQSL_LOCATION_FIELD_LIST) { if (fl[field_num].cdata == "") { fl[field_num].idx = 0; fl[field_num].idata = fl[field_num].items[0].ivalue; } else { bool found = false; for (int i = 0; i < static_cast(fl[field_num].items.size()); i++) { if (fl[field_num].items[i].text == fl[field_num].cdata) { fl[field_num].idx = i; fl[field_num].idata = fl[field_num].items[i].ivalue; found = true; break; } } if (!found) { // There's no entry in the list that matches! fl[field_num].cdata = ""; fl[field_num].idx = 0; fl[field_num].idata = 0; } } } return 0; } /* Set the field's index. For pick lists, this is the index into * 'items'. In that case, also set the field's data to the picked value. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIndex(tQSL_Location locp, int field_num, int dat) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_setLocationFieldIndex", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_setLocationFieldIndex", "arg error index out of range page %d size %d - field_num=%d, dat=%d", loc->page, fl.size(), field_num, dat); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } fl[field_num].idx = dat; if (fl[field_num].input_type == TQSL_LOCATION_FIELD_DDLIST || fl[field_num].input_type == TQSL_LOCATION_FIELD_LIST) { if (dat >= 0 && dat < static_cast(fl[field_num].items.size())) { fl[field_num].idx = dat; fl[field_num].cdata = fl[field_num].items[dat].text; fl[field_num].idata = fl[field_num].items[dat].ivalue; } else { tqslTrace("tqsl_setLocationFieldIndex", "arg error page %d field_num=%d dat=%d", loc->page, field_num, dat); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } } return 0; } /* Set the field's integer data. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIntData(tQSL_Location locp, int field_num, int dat) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_setLocationFieldIntData", "check_loc error %d", tQSL_Error); return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (field_num < 0 || field_num >= static_cast(fl.size())) { tqslTrace("tqsl_setLocationFieldIntData", "arg error field_num=%d, dat=%d", field_num, dat); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } fl[field_num].idata = dat; return 0; } /* For pick lists, this is the index into * 'items'. In that case, also set the field's char data to the picked value. */ DLLEXPORT int CALLCONVENTION tqsl_getNumLocationFieldListItems(tQSL_Location locp, int field_num, int *rval) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getNumLocationFieldListItems", "check_loc error %d", tQSL_Error); return 1; } if (rval == NULL) { tqslTrace("tqsl_getNumLocationFieldListItems", "arg error rval=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; *rval = fl[field_num].items.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem(tQSL_Location locp, int field_num, int item_idx, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getLocationFieldListItem", "check_loc error %d", tQSL_Error); return 1; } bool findKey = false; if (item_idx & 0x10000) { findKey = true; item_idx &= 0xffff; } TQSL_LOCATION_FIELDLIST &fl = loc->pagelist[loc->page-1].fieldlist; if (buf == NULL || field_num < 0 || field_num >= static_cast(fl.size()) || (fl[field_num].input_type != TQSL_LOCATION_FIELD_LIST && fl[field_num].input_type != TQSL_LOCATION_FIELD_DDLIST)) { tqslTrace("tqsl_getLocationFieldListItem", "arg error buf=0x%lx, field_num=%d", buf, field_num); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (item_idx < 0 || item_idx >= static_cast(fl[field_num].items.size())) { tqslTrace("tqsl_getLocationFieldListItem", "arg error item_idx=%d", item_idx); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (findKey) { strncpy(buf, fl[field_num].items[item_idx].text.c_str(), bufsiz); } else { string& str = (fl[field_num].items[item_idx].label == "") ? fl[field_num].items[item_idx].text : fl[field_num].items[item_idx].label; strncpy(buf, str.c_str(), bufsiz); } buf[bufsiz - 1] = '\0'; return 0; } static string tqsl_station_data_filename(bool deleted = false) { const char *f; if (deleted) f = "station_data_trash"; else f = "station_data"; string s = tQSL_BaseDir; #ifdef _WIN32 s += "\\"; #else s += "/"; #endif s += f; return s; } static int tqsl_load_station_data(XMLElement &xel, bool deleted = false) { int status = xel.parseFile(tqsl_station_data_filename(deleted).c_str()); tqslTrace("tqsl_load_station_data", "file %s parse status %d", tqsl_station_data_filename(deleted).c_str(), status); if (status) { if (errno == ENOENT) { // If there's no file, no error. tqslTrace("tqsl_load_station_data", "File does not exist"); return 0; } strncpy(tQSL_ErrorFile, tqsl_station_data_filename(deleted).c_str(), sizeof tQSL_ErrorFile); if (status == XML_PARSE_SYSTEM_ERROR) { tQSL_Error = TQSL_FILE_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_load_station_data", "parse error, errno=%d", tQSL_Errno); } else { tqslTrace("tqsl_load_station_data", "syntax error"); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; } return 1; } return status; } static int tqsl_dump_station_data(XMLElement &xel, bool deleted = false) { ofstream out; string fn = tqsl_station_data_filename(deleted); out.exceptions(ios::failbit | ios::eofbit | ios::badbit); try { #ifdef _WIN32 wchar_t* wfn = utf8_to_wchar(fn.c_str()); out.open(wfn); free_wchar(wfn); #else out.open(fn.c_str()); #endif out << xel << endl; out.close(); } catch(exception& x) { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Unable to save new station location file (%s): %s/%s", fn.c_str(), x.what(), strerror(errno)); tqslTrace("tqsl_dump_station_data", "file error %s %s", fn.c_str(), tQSL_CustomError); return 1; } return 0; } static int tqsl_load_loc(TQSL_LOCATION *loc, XMLElementList::iterator ep, bool ignoreZones) { bool exists; loc->page = 1; loc->data_errors[0] = '\0'; int bad_ituz = 0; int bad_cqz = 0; tqslTrace("tqsl_load_loc", NULL); while(1) { TQSL_LOCATION_PAGE& page = loc->pagelist[loc->page-1]; for (int fidx = 0; fidx < static_cast(page.fieldlist.size()); fidx++) { TQSL_LOCATION_FIELD& field = page.fieldlist[fidx]; if (field.gabbi_name != "") { // A field that may exist XMLElement el; if (ep->second->getFirstElement(field.gabbi_name, el)) { field.cdata = el.getText(); switch (field.input_type) { case TQSL_LOCATION_FIELD_DDLIST: case TQSL_LOCATION_FIELD_LIST: exists = false; for (int i = 0; i < static_cast(field.items.size()); i++) { string cp = field.items[i].text; int q = strcasecmp(field.cdata.c_str(), cp.c_str()); if (q == 0) { field.idx = i; field.cdata = cp; field.idata = field.items[i].ivalue; exists = true; break; } } if (!exists) { if (field.gabbi_name == "CQZ") bad_cqz = strtol(field.cdata.c_str(), NULL, 10); else if (field.gabbi_name == "ITUZ") bad_ituz = strtol(field.cdata.c_str(), NULL, 10); else if (field.gabbi_name == "CALL" || field.gabbi_name == "DXCC") field.idx = -1; } break; case TQSL_LOCATION_FIELD_TEXT: field.cdata = trim(field.cdata); if (field.data_type == TQSL_LOCATION_FIELD_INT) field.idata = strtol(field.cdata.c_str(), NULL, 10); break; } } } if (update_page(loc->page, loc)) return 1; } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; tqsl_nextStationLocationCapture(loc); } if (ignoreZones) return 0; if (bad_cqz && bad_ituz) { snprintf(loc->data_errors, sizeof(loc->data_errors), "This station location is configured with invalid CQ zone %d and invalid ITU zone %d.", bad_cqz, bad_ituz); } else if (bad_cqz) { snprintf(loc->data_errors, sizeof(loc->data_errors), "This station location is configured with invalid CQ zone %d.", bad_cqz); } else if (bad_ituz) { snprintf(loc->data_errors, sizeof(loc->data_errors), "This station location is configured with invalid ITU zone %d.", bad_ituz); } tqslTrace("tqsl_load_loc", "data_errors=%s", loc->data_errors); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getStationDataEnc(tQSL_StationDataEnc *sdata) { char *dbuf = NULL; size_t dlen = 0; gzFile in = NULL; #ifdef _WIN32 wchar_t *fn = utf8_to_wchar(tqsl_station_data_filename().c_str()); int fd = _wopen(fn, _O_RDONLY|_O_BINARY); free_wchar(fn); if (fd != -1) in = gzdopen(fd, "rb"); #else in = gzopen(tqsl_station_data_filename().c_str(), "rb"); #endif if (!in) { if (errno == ENOENT) { *sdata = NULL; tqslTrace("tqsl_getStationDataEnc", "File %s does not exist", tqsl_station_data_filename().c_str()); return 0; } tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; strncpy(tQSL_ErrorFile, tqsl_station_data_filename().c_str(), sizeof tQSL_ErrorFile); tqslTrace("tqsl_getStationDataEnc", "File %s open error %s", tqsl_station_data_filename().c_str(), strerror(tQSL_Error) ); return 1; } char buf[2048]; int rcount; while ((rcount = gzread(in, buf, sizeof buf)) > 0) { dlen += rcount; } dbuf = reinterpret_cast(malloc(dlen + 2)); if (!dbuf) { tqslTrace("tqsl_getStationDataEnc", "memory allocation error %d", dlen+2); return 1; } *sdata = dbuf; gzrewind(in); while ((rcount = gzread(in, dbuf, sizeof buf)) > 0) { dbuf += rcount; } *dbuf = '\0'; gzclose(in); return 0; } DLLEXPORT int CALLCONVENTION tqsl_freeStationDataEnc(tQSL_StationDataEnc sdata) { if (sdata) free(sdata); return 0; //can never fail } DLLEXPORT int CALLCONVENTION tqsl_mergeStationLocations(const char *locdata) { XMLElement new_data; XMLElement old_data; XMLElement new_top_el; XMLElement old_top_el; vector locnames; tqslTrace("tqsl_mergeStationLocations", NULL); // Load the current station data if (tqsl_load_station_data(old_top_el)) { tqslTrace("tqsl_mergeStationLocations", "error loading station data"); return 1; } // Parse the data to be merged new_top_el.parseString(locdata); if (!new_top_el.getFirstElement(new_data)) new_data.setElementName("StationDataFile"); if (!old_top_el.getFirstElement(old_data)) old_data.setElementName("StationDataFile"); // Build a list of existing station locations XMLElementList& namelist = old_data.getElementList(); XMLElementList::iterator nameiter; XMLElement locname; for (nameiter = namelist.find("StationData"); nameiter != namelist.end(); nameiter++) { if (nameiter->first != "StationData") break; pair rval = nameiter->second->getAttribute("name"); if (rval.second) { locnames.push_back(rval.first); } } // Iterate the new locations XMLElementList& ellist = new_data.getElementList(); XMLElementList::iterator ep; old_data.setPretext(old_data.getPretext() + " "); for (ep = ellist.find("StationData"); ep != ellist.end(); ep++) { if (ep->first != "StationData") break; pair rval = ep->second->getAttribute("name"); bool found = false; if (rval.second) { for (size_t j = 0; j < locnames.size(); j++) { if (locnames[j] == rval.first) { found = true; break; } } } if (!found) { // Add this one to the station data file XMLElement *newtop = new XMLElement("StationData"); newtop->setPretext("\n "); newtop->setAttribute("name", rval.first); newtop->setText("\n "); XMLElement el; bool elok = ep->second->getFirstElement(el); while (elok) { XMLElement *sub = new XMLElement; sub->setPretext(newtop->getPretext() + " "); sub->setElementName(el.getElementName()); sub->setText(el.getText()); newtop->addElement(sub); elok = ep->second->getNextElement(el); } old_data.addElement(newtop); old_data.setText("\n"); } } return tqsl_dump_station_data(old_data); } // Move a station location to or from the trash static int tqsl_move_station_location(const char *name, bool fromtrash) { tqslTrace("tqsl_move_station_location", "name=%s, fromtrash=%d", name, fromtrash); XMLElement from_top_el; XMLElement to_top_el; if (tqsl_load_station_data(from_top_el, fromtrash)) { tqslTrace("tqsl_move_station_location", "error %d loading data", tQSL_Error); return 1; } if (tqsl_load_station_data(to_top_el, !fromtrash)) { tqslTrace("tqsl_move_station_location", "error %d loading data", tQSL_Error); return 1; } XMLElement from_sfile; XMLElement to_sfile; if (!from_top_el.getFirstElement(from_sfile)) from_sfile.setElementName("StationDataFile"); if (!to_top_el.getFirstElement(to_sfile)) to_sfile.setElementName("StationDataFile"); XMLElementList& from_ellist = from_sfile.getElementList(); XMLElementList::iterator from_ep; for (from_ep = from_ellist.find("StationData"); from_ep != from_ellist.end(); from_ep++) { if (from_ep->first != "StationData") break; pair from_rval = from_ep->second->getAttribute("name"); if (from_rval.second && !strcasecmp(from_rval.first.c_str(), name)) { // Match, move it. // First, delete any old backup for this station location XMLElementList& to_ellist = to_sfile.getElementList(); XMLElementList::iterator to_ep; for (to_ep = to_ellist.find("StationData"); to_ep != to_ellist.end(); to_ep++) { if (to_ep->first != "StationData") break; pair to_rval = to_ep->second->getAttribute("name"); if (to_rval.second && !strcasecmp(to_rval.first.c_str(), name)) { to_ellist.erase(to_ep); break; } } // Now add it to the target XMLElement *newtop = new XMLElement("StationData"); newtop->setPretext("\n "); newtop->setAttribute("name", from_rval.first); newtop->setText("\n "); XMLElement el; bool elok = from_ep->second->getFirstElement(el); while (elok) { XMLElement *sub = new XMLElement; sub->setPretext(newtop->getPretext() + " "); sub->setElementName(el.getElementName()); sub->setText(el.getText()); newtop->addElement(sub); elok = from_ep->second->getNextElement(el); } to_sfile.addElement(newtop); to_sfile.setText("\n"); tqsl_dump_station_data(to_sfile, !fromtrash); from_ellist.erase(from_ep); return tqsl_dump_station_data(from_sfile, fromtrash); } } tqslTrace("tqsl_move_station_location", "location not found"); tQSL_Error = TQSL_LOCATION_NOT_FOUND; return 1; } DLLEXPORT int CALLCONVENTION tqsl_deleteStationLocation(const char *name) { tqslTrace("tqsl_deleteStationLocation", "name=%s", name); return tqsl_move_station_location(name, false); } DLLEXPORT int CALLCONVENTION tqsl_restoreStationLocation(const char *name) { tqslTrace("tqsl_restoreStationLocation", "name=%s", name); return tqsl_move_station_location(name, true); } DLLEXPORT int CALLCONVENTION tqsl_getStationLocation(tQSL_Location *locp, const char *name) { if (tqsl_initStationLocationCapture(locp)) { tqslTrace("tqsl_getStationLocation", "name=%s error=%d", name, tQSL_Error); return 1; } TQSL_LOCATION *loc; if (!(loc = check_loc(*locp))) { tqslTrace("tqsl_getStationLocation", "loc error %d", tQSL_Error); return 1; } loc->name = name; XMLElement top_el; if (tqsl_load_station_data(top_el)) { tqslTrace("tqsl_getStationLocation", "load station data error %d", tQSL_Error); return 1; } XMLElement sfile; if (!top_el.getFirstElement(sfile)) sfile.setElementName("StationDataFile"); XMLElementList& ellist = sfile.getElementList(); bool exists = false; XMLElementList::iterator ep; for (ep = ellist.find("StationData"); ep != ellist.end(); ep++) { if (ep->first != "StationData") break; pair rval = ep->second->getAttribute("name"); if (rval.second && !strcasecmp(trim(rval.first).c_str(), trim(loc->name).c_str())) { exists = true; break; } } if (!exists) { tQSL_Error = TQSL_LOCATION_NOT_FOUND; tqslTrace("tqsl_getStationLocation", "location %s does not exist", name); return 1; } return tqsl_load_loc(loc, ep, false); } DLLEXPORT int CALLCONVENTION tqsl_getStationLocationErrors(tQSL_Location locp, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getStationLocation", "loc error %d", tQSL_Error); return 1; } if (buf == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_getStationLocation", "buf = NULL"); return 1; } strncpy(buf, loc->data_errors, bufsiz); buf[bufsiz-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocations(tQSL_Location locp, int *nloc) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getNumStationLocations", "loc error %d", tQSL_Error); return 1; } if (nloc == NULL) { tqslTrace("tqsl_getNumStationLocations", "arg error nloc=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } loc->names.clear(); XMLElement top_el; if (tqsl_load_station_data(top_el)) { tqslTrace("tqsl_getNumStationLocations", "error %d loading station data", tQSL_Error); return 1; } XMLElement sfile; if (top_el.getFirstElement(sfile)) { XMLElement sd; bool ok = sfile.getFirstElement("StationData", sd); while (ok && sd.getElementName() == "StationData") { pair name = sd.getAttribute("name"); if (name.second) { XMLElement xc; string call; if (sd.getFirstElement("CALL", xc)) call = xc.getText(); loc->names.push_back(TQSL_NAME(name.first, call)); } ok = sfile.getNextElement(sd); } } *nloc = loc->names.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getStationLocationName(tQSL_Location locp, int idx, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getStationLocationName", "loc error %d", tQSL_Error); return 1; } if (buf == NULL || idx < 0 || idx >= static_cast(loc->names.size())) { tqslTrace("tqsl_getStationLocationName", "arg error buf=0x%lx, idx=%d", buf, idx); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(buf, loc->names[idx].name.c_str(), bufsiz); buf[bufsiz-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCallSign(tQSL_Location locp, int idx, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getStationLocationCallSign", "loc error %d", tQSL_Error); return 1; } if (buf == NULL || idx < 0 || idx >= static_cast(loc->names.size())) { tqslTrace("tqsl_getStationLocationCallSign", "arg error buf=0x%lx, idx=%d", buf, idx); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(buf, loc->names[idx].call.c_str(), bufsiz); buf[bufsiz-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField(tQSL_Location locp, const char *name, char *namebuf, int bufsize) { int old_page; TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getStationLocationField", "loc error %d", tQSL_Error); return 1; } if (name == NULL || namebuf == NULL) { tqslTrace("tqsl_getStationLocationField", "arg error name=0x%lx, namebuf=0x%lx", name, namebuf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (tqsl_getStationLocationCapturePage(loc, &old_page)) { tqslTrace("tqsl_getStationLocationField", "get cap page error %d", tQSL_Error); return 1; } string find = name; tqsl_setStationLocationCapturePage(loc, 1); do { int numf; if (tqsl_getNumLocationField(loc, &numf)) { tqslTrace("tqsl_getStationLocationField", "error getting num fields %d", tQSL_Error); return 1; } for (int i = 0; i < numf; i++) { TQSL_LOCATION_FIELD& field = loc->pagelist[loc->page-1].fieldlist[i]; if (find == field.gabbi_name) { // Found it switch (field.input_type) { case TQSL_LOCATION_FIELD_DDLIST: case TQSL_LOCATION_FIELD_LIST: if (field.data_type == TQSL_LOCATION_FIELD_INT) { char numbuf[20]; if (static_cast(field.items.size()) <= field.idx) { strncpy(namebuf, field.cdata.c_str(), bufsize); } else if (field.idx == 0 && field.items[field.idx].label == "[None]") { strncpy(namebuf, "", bufsize); } else { snprintf(numbuf, sizeof numbuf, "%d", field.items[field.idx].ivalue); strncpy(namebuf, numbuf, bufsize); } } else if (field.idx < 0 || field.idx >= static_cast(field.items.size())) { // Allow CALL to not be in the items list if (field.idx == -1 && i == 0) strncpy(namebuf, field.cdata.c_str(), bufsize); else strncpy(namebuf, "", bufsize); } else { if (field.items[field.idx].label == "") { strncpy(namebuf, field.items[field.idx].text.c_str(), bufsize); } else { strncpy(namebuf, field.items[field.idx].label.c_str(), bufsize); } } break; case TQSL_LOCATION_FIELD_TEXT: field.cdata = trim(field.cdata); if (field.flags & TQSL_LOCATION_FIELD_UPPER) field.cdata = string_toupper(field.cdata); strncpy(namebuf, field.cdata.c_str(), bufsize); break; } goto done; } } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; if (tqsl_nextStationLocationCapture(loc)) { tqslTrace("tqsl_getStationLocationField", "error in nextStationLocationCapture %d", tQSL_Error); return 1; } } while (1); strncpy(namebuf, "", bufsize); // Did not find it done: tqsl_setStationLocationCapturePage(loc, old_page); return 0; } static int tqsl_location_to_xml(TQSL_LOCATION *loc, XMLElement& sd) { int old_page; if (tqsl_getStationLocationCapturePage(loc, &old_page)) { tqslTrace("tqsl_location_to_xml", "get_sta_loc_cap_page error %d", tQSL_Error); return 1; } tqsl_setStationLocationCapturePage(loc, 1); do { int numf; if (tqsl_getNumLocationField(loc, &numf)) { tqslTrace("tqsl_location_to_xml", "get num loc field error %d", tQSL_Error); return 1; } for (int i = 0; i < numf; i++) { TQSL_LOCATION_FIELD& field = loc->pagelist[loc->page-1].fieldlist[i]; XMLElement *fd = new XMLElement; fd->setPretext(sd.getPretext() + " "); fd->setElementName(field.gabbi_name); switch (field.input_type) { case TQSL_LOCATION_FIELD_DDLIST: case TQSL_LOCATION_FIELD_LIST: if (field.idx < 0 || field.idx >= static_cast(field.items.size())) { fd->setText(""); if (field.gabbi_name == "CALL") { fd->setText("NONE"); } } else if (field.data_type == TQSL_LOCATION_FIELD_INT) { char numbuf[20]; snprintf(numbuf, sizeof numbuf, "%d", field.items[field.idx].ivalue); fd->setText(numbuf); } else { fd->setText(field.items[field.idx].text); } break; case TQSL_LOCATION_FIELD_TEXT: field.cdata = trim(field.cdata); if (field.flags & TQSL_LOCATION_FIELD_UPPER) field.cdata = string_toupper(field.cdata); fd->setText(field.cdata); break; } if (strcmp(fd->getText().c_str(), "")) sd.addElement(fd); } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; if (tqsl_nextStationLocationCapture(loc)) return 1; } while (1); tqsl_setStationLocationCapturePage(loc, old_page); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCaptureName(tQSL_Location locp, const char *name) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_setStationLocationCaptureName", "loc error %d", tQSL_Error); return 1; } if (name == NULL) { tqslTrace("tqsl_setStationLocationCaptureName", "arg error name=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } loc->name = name; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCaptureName(tQSL_Location locp, char *namebuf, int bufsize) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_getStationLocationCaptureName", "loc error %d", tQSL_Error); return 1; } if (namebuf == NULL) { tqslTrace("tqsl_getStationLocationCaptureName", "arg error namebuf=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(namebuf, loc->name.c_str(), bufsize); namebuf[bufsize-1] = 0; return 0; } DLLEXPORT int CALLCONVENTION tqsl_saveStationLocationCapture(tQSL_Location locp, int overwrite) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp))) { tqslTrace("tqsl_saveStationLocationCaptureName", "loc error %d", tQSL_Error); return 1; } if (loc->name == "") { tqslTrace("tqsl_saveStationLocationCaptureName", "name empty"); tQSL_Error = TQSL_EXPECTED_NAME; return 1; } XMLElement top_el; if (tqsl_load_station_data(top_el)) { tqslTrace("tqsl_saveStationLocationCaptureName", "error %d loading station data", tQSL_Error); return 1; } XMLElement sfile; if (!top_el.getFirstElement(sfile)) sfile.setElementName("StationDataFile"); XMLElementList& ellist = sfile.getElementList(); bool exists = false; XMLElementList::iterator ep; for (ep = ellist.find("StationData"); ep != ellist.end(); ep++) { if (ep->first != "StationData") break; pair rval = ep->second->getAttribute("name"); if (rval.second && !strcasecmp(rval.first.c_str(), loc->name.c_str())) { exists = true; break; } } if (exists && !overwrite) { tqslTrace("tqsl_saveStationLocationCaptureName", "exists, no overwrite"); tQSL_Error = TQSL_NAME_EXISTS; return 1; } XMLElement *sd = new XMLElement("StationData"); sd->setPretext("\n "); if (tqsl_location_to_xml(loc, *sd)) { tqslTrace("tqsl_saveStationLocationCaptureName", "error in loc_to_xml %d", tQSL_Error); return 1; } sd->setAttribute("name", loc->name); sd->setText("\n "); // If 'exists', ep points to the existing station record if (exists) ellist.erase(ep); sfile.addElement(sd); sfile.setText("\n"); return tqsl_dump_station_data(sfile); } DLLEXPORT int CALLCONVENTION tqsl_signQSORecord(tQSL_Cert cert, tQSL_Location locp, TQSL_QSO_RECORD *rec, unsigned char *sig, int *siglen) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_signQSORecord", "loc error %d", tQSL_Error); return 1; } if (make_sign_data(loc)) { tqslTrace("tqsl_signQSORecord", "error %d making sign data", tQSL_Error); return 1; } XMLElement specfield; bool ok = tCONTACT_sign.getFirstElement(specfield); string rec_sign_data = loc->signdata; while (ok) { string eln = specfield.getElementName(); const char *elname = eln.c_str(); const char *value = 0; char buf[100]; if (!strcmp(elname, "CALL")) { value = rec->callsign; } else if (!strcmp(elname, "BAND")) { value = rec->band; } else if (!strcmp(elname, "BAND_RX")) { value = rec->rxband; } else if (!strcmp(elname, "MODE")) { value = rec->mode; } else if (!strcmp(elname, "FREQ")) { value = rec->freq; } else if (!strcmp(elname, "FREQ_RX")) { value = rec->rxfreq; } else if (!strcmp(elname, "PROP_MODE")) { value = rec->propmode; } else if (!strcmp(elname, "SAT_NAME")) { value = rec->satname; } else if (!strcmp(elname, "QSO_DATE")) { if (tqsl_isDateValid(&(rec->date))) value = tqsl_convertDateToText(&(rec->date), buf, sizeof buf); } else if (!strcmp(elname, "QSO_TIME")) { if (tqsl_isTimeValid(&(rec->time))) value = tqsl_convertTimeToText(&(rec->time), buf, sizeof buf); } else { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Unknown field in signing specification: %s", elname); tqslTrace("tqsl_signQSORecord", "field err %s", tQSL_CustomError); return 1; } if (value == 0 || value[0] == 0) { pair attr = specfield.getAttribute("required"); if (attr.second && strtol(attr.first.c_str(), NULL, 10)) { string err = specfield.getElementName() + " field required by signature specification not found"; tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, err.c_str(), sizeof tQSL_CustomError); tqslTrace("tqsl_signQSORecord", "val err %s", tQSL_CustomError); return 1; } } else { string v(value); rec_sign_data += trim(v); } ok = tCONTACT_sign.getNextElement(specfield); } return tqsl_signDataBlock(cert, (const unsigned char *)rec_sign_data.c_str(), rec_sign_data.size(), sig, siglen); } DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItCERT(tQSL_Cert cert, int uid) { static string s; s = ""; char buf[3000]; if (tqsl_getCertificateEncoded(cert, buf, sizeof buf)) return 0; char *cp = strstr(buf, "-----END CERTIFICATE-----"); if (cp) *cp = 0; if ((cp = strstr(buf, "\n"))) cp++; else cp = buf; s = "tCERT\n"; char sbuf[10], lbuf[40]; snprintf(sbuf, sizeof sbuf, "%d", uid); snprintf(lbuf, sizeof lbuf, "%s\n", static_cast(strlen(sbuf)), sbuf); s += lbuf; snprintf(lbuf, sizeof lbuf, "", static_cast(strlen(cp))); s += lbuf; s += cp; s += "\n"; return s.c_str(); //KC2YWE 1/26 - dangerous but might work since s is static } DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItSTATION(tQSL_Location locp, int uid, int certuid) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getGABBItSTATION", "loc error %d", tQSL_Error); return 0; } unsigned char *buf = 0; int bufsiz = 0; loc->tSTATION = "tSTATION\n"; char sbuf[10], lbuf[40]; snprintf(sbuf, sizeof sbuf, "%d", uid); snprintf(lbuf, sizeof lbuf, "%s\n", static_cast(strlen(sbuf)), sbuf); loc->tSTATION += lbuf; snprintf(sbuf, sizeof sbuf, "%d", certuid); snprintf(lbuf, sizeof lbuf, "%s\n", static_cast(strlen(sbuf)), sbuf); loc->tSTATION += lbuf; int old_page = loc->page; tqsl_setStationLocationCapturePage(loc, 1); do { TQSL_LOCATION_PAGE& p = loc->pagelist[loc->page-1]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD& f = p.fieldlist[i]; string s; if (f.input_type == TQSL_LOCATION_FIELD_BADZONE) // Don't output these to tSTATION continue; if (f.input_type == TQSL_LOCATION_FIELD_DDLIST || f.input_type == TQSL_LOCATION_FIELD_LIST) { if (f.idx < 0 || f.idx >= static_cast(f.items.size())) { s = ""; } else { s = f.items[f.idx].text; } } else if (f.data_type == TQSL_LOCATION_FIELD_INT) { char buf[20]; snprintf(buf, sizeof buf, "%d", f.idata); s = buf; } else { s = f.cdata; } if (s.size() == 0) continue; int wantsize = s.size() + f.gabbi_name.size() + 20; if (buf == 0 || bufsiz < wantsize) { if (buf != 0) delete[] buf; buf = new unsigned char[wantsize]; bufsiz = wantsize; } if (tqsl_adifMakeField(f.gabbi_name.c_str(), 0, (unsigned char *)s.c_str(), s.size(), buf, bufsiz)) { delete[] buf; return 0; } loc->tSTATION += (const char *)buf; loc->tSTATION += "\n"; } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; tqsl_nextStationLocationCapture(loc); } while (1); tqsl_setStationLocationCapturePage(loc, old_page); if (buf != 0) delete[] buf; loc->tSTATION += "\n"; return loc->tSTATION.c_str(); } DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItCONTACTData(tQSL_Cert cert, tQSL_Location locp, TQSL_QSO_RECORD *qso, int stationuid, char* signdata, int sdlen) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getGABBItCONTACTData", "loc error %d", tQSL_Error); return 0; } if (make_sign_data(loc)) { tqslTrace("tqsl_getGABBItCONTACTData", "make_sign_data error %d", tQSL_Error); return 0; } XMLElement specfield; bool ok = tCONTACT_sign.getFirstElement(specfield); string rec_sign_data = loc->signdata; loc->qso_details = ""; while(ok) { string en = specfield.getElementName(); const char *elname = en.c_str(); const char *value = 0; char buf[100]; if (!strcmp(elname, "CALL")) { value = qso->callsign; } else if (!strcmp(elname, "BAND")) { value = qso->band; } else if (!strcmp(elname, "BAND_RX")) { value = qso->rxband; } else if (!strcmp(elname, "MODE")) { value = qso->mode; } else if (!strcmp(elname, "FREQ")) { value = qso->freq; } else if (!strcmp(elname, "FREQ_RX")) { value = qso->rxfreq; } else if (!strcmp(elname, "PROP_MODE")) { value = qso->propmode; } else if (!strcmp(elname, "SAT_NAME")) { value = qso->satname; } else if (!strcmp(elname, "QSO_DATE")) { if (tqsl_isDateValid(&(qso->date))) value = tqsl_convertDateToText(&(qso->date), buf, sizeof buf); } else if (!strcmp(elname, "QSO_TIME")) { if (tqsl_isTimeValid(&(qso->time))) value = tqsl_convertTimeToText(&(qso->time), buf, sizeof buf); } else { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Unknown field in signing specification: %s", elname); tqslTrace("tqsl_getGABBItCONTACTData", "field err %s", tQSL_CustomError); return 0; } if (value == 0 || value[0] == 0) { pair attr = specfield.getAttribute("required"); if (attr.second && strtol(attr.first.c_str(), NULL, 10)) { string err = specfield.getElementName() + " field required by signature specification not found"; tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, err.c_str(), sizeof tQSL_CustomError); tqslTrace("tqsl_getGABBItCONTACTData", "field err %s", tQSL_CustomError); return 0; } } else { string v(value); rec_sign_data += trim(v); loc->qso_details += trim(v); } ok = tCONTACT_sign.getNextElement(specfield); } unsigned char sig[129]; int siglen = sizeof sig; rec_sign_data = string_toupper(rec_sign_data); if (tqsl_signDataBlock(cert, (const unsigned char *)rec_sign_data.c_str(), rec_sign_data.size(), sig, &siglen)) return 0; char b64[512]; if (tqsl_encodeBase64(sig, siglen, b64, sizeof b64)) return 0; loc->tCONTACT = "tCONTACT\n"; char sbuf[10], lbuf[40]; snprintf(sbuf, sizeof sbuf, "%d", stationuid); snprintf(lbuf, sizeof lbuf, "%s\n", static_cast(strlen(sbuf)), sbuf); loc->tCONTACT += lbuf; char buf[256]; tqsl_adifMakeField("CALL", 0, (const unsigned char *)qso->callsign, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; tqsl_adifMakeField("BAND", 0, (const unsigned char *)qso->band, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; tqsl_adifMakeField("MODE", 0, (const unsigned char *)qso->mode, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; // Optional fields if (qso->freq[0] != 0) { tqsl_adifMakeField("FREQ", 0, (const unsigned char *)qso->freq, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; } if (qso->rxfreq[0] != 0) { tqsl_adifMakeField("FREQ_RX", 0, (const unsigned char *)qso->rxfreq, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; } if (qso->propmode[0] != 0) { tqsl_adifMakeField("PROP_MODE", 0, (const unsigned char *)qso->propmode, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; } if (qso->satname[0] != 0) { tqsl_adifMakeField("SAT_NAME", 0, (const unsigned char *)qso->satname, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; } if (qso->rxband[0] != 0) { tqsl_adifMakeField("BAND_RX", 0, (const unsigned char *)qso->rxband, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; } // Date and Time char date_buf[40] = ""; tqsl_convertDateToText(&(qso->date), date_buf, sizeof date_buf); tqsl_adifMakeField("QSO_DATE", 0, (const unsigned char *)date_buf, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; date_buf[0] = 0; tqsl_convertTimeToText(&(qso->time), date_buf, sizeof date_buf); tqsl_adifMakeField("QSO_TIME", 0, (const unsigned char *)date_buf, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; tqsl_adifMakeField(loc->sigspec.c_str(), '6', (const unsigned char *)b64, -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; // Signature tqsl_adifMakeField("SIGNDATA", 0, (const unsigned char *)rec_sign_data.c_str(), -1, (unsigned char *)buf, sizeof buf); loc->tCONTACT += buf; loc->tCONTACT += "\n"; loc->tCONTACT += "\n"; if (signdata) strncpy(signdata, rec_sign_data.c_str(), sdlen); return loc->tCONTACT.c_str(); } DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItCONTACT(tQSL_Cert cert, tQSL_Location locp, TQSL_QSO_RECORD *qso, int stationuid) { return tqsl_getGABBItCONTACTData(cert, locp, qso, stationuid, NULL, 0); } DLLEXPORT int CALLCONVENTION tqsl_getLocationCallSign(tQSL_Location locp, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getLocationCallSign", "loc error %d", tQSL_Error); return 1; } if (buf == NULL || bufsiz <= 0) { tqslTrace("tqsl_getLocationCallSign", "arg error buf=0x%lx, bufsiz=%d", buf, bufsiz); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_LOCATION_PAGE& p = loc->pagelist[0]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD f = p.fieldlist[i]; if (f.gabbi_name == "CALL") { strncpy(buf, f.cdata.c_str(), bufsiz); buf[bufsiz-1] = 0; if (static_cast(f.cdata.size()) >= bufsiz) { tqslTrace("tqsl_getLocationCallSign", "buf error req=%d avail=%d", static_cast(f.cdata.size()), bufsiz); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } return 0; } } tQSL_Error = TQSL_CALL_NOT_FOUND; return 1; } DLLEXPORT int CALLCONVENTION tqsl_setLocationCallSign(tQSL_Location locp, const char *buf, int dxcc) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_setLocationCallSign", "loc error %d", tQSL_Error); return 1; } if (buf == NULL) { tqslTrace("tqsl_setLocationCallSign", "arg error buf=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_LOCATION_PAGE& p = loc->pagelist[0]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD f = p.fieldlist[i]; if (f.gabbi_name == "CALL") { for (int j = 0; j < static_cast(f.items.size()); j++) { if (f.items[j].text == buf) { loc->pagelist[0].fieldlist[i].idx = j; loc->pagelist[0].fieldlist[i].cdata = buf; loc->newflags = true; loc->newDXCC = dxcc; break; } } return 0; } } tQSL_Error = TQSL_CALL_NOT_FOUND; return 1; } DLLEXPORT int CALLCONVENTION tqsl_getLocationField(tQSL_Location locp, const char *field, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getLocationField", "loc error %d", tQSL_Error); return 1; } if (buf == NULL || bufsiz <= 0) { tqslTrace("tqsl_getLocationField", "arg error buf=0x%lx, bufsiz=%d", buf, bufsiz); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *buf = '\0'; int old_page = loc->page; tqsl_setStationLocationCapturePage(loc, 1); do { TQSL_LOCATION_PAGE& p = loc->pagelist[loc->page-1]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD f = p.fieldlist[i]; if (f.gabbi_name == field) { if ((f.gabbi_name == "ITUZ" || f.gabbi_name == "CQZ") && f.cdata == "0") { buf[0] = '\0'; } else { strncpy(buf, f.cdata.c_str(), bufsiz); } buf[bufsiz-1] = 0; if (static_cast(f.cdata.size()) >= bufsiz) { tqslTrace("tqsl_getLocationField", "buf error req=%d avail=%d", static_cast(f.cdata.size()), bufsiz); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } tqsl_setStationLocationCapturePage(loc, old_page); return 0; } } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; tqsl_nextStationLocationCapture(loc); } while (1); tQSL_Error = TQSL_CALL_NOT_FOUND; return 1; } DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel(tQSL_Location locp, const char *field, char *buf, int bufsiz) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getLocationFieldLabel", "loc error %d", tQSL_Error); return 1; } if (buf == NULL || bufsiz <= 0) { tqslTrace("tqsl_getLocationFieldLabel", "arg error buf=0x%lx, bufsiz=%d", buf, bufsiz); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *buf = '\0'; int old_page = loc->page; tqsl_setStationLocationCapturePage(loc, 1); do { TQSL_LOCATION_PAGE& p = loc->pagelist[loc->page-1]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD f = p.fieldlist[i]; if (f.gabbi_name == field) { if ((f.gabbi_name == "ITUZ" || f.gabbi_name == "CQZ") && f.cdata == "0") { buf[0] = '\0'; } else { if (static_cast(f.items.size()) > f.idx) strncpy(buf, f.items[f.idx].label.c_str(), bufsiz); } buf[bufsiz-1] = 0; if (static_cast(f.label.size()) >= bufsiz) { tqslTrace("tqsl_getLocationFieldLabel", "buf error req=%d avail=%d", static_cast(f.cdata.size()), bufsiz); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } tqsl_setStationLocationCapturePage(loc, old_page); return 0; } } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; tqsl_nextStationLocationCapture(loc); } while (1); tQSL_Error = TQSL_CALL_NOT_FOUND; return 1; } // Replaces all occurrences of 'from' with 'to' in string 'str' static void replaceAll(string& str, const string& from, const string& to) { if (from.empty()) { return; } size_t start_pos = 0; while((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' } } static bool fuzzy_match(string userInput, string field) { // First upcase string left = string_toupper(userInput); string right = string_toupper(field); // Strip spaces replaceAll(left, " ", ""); replaceAll(right, " ", ""); // Strip apostraphes replaceAll(left, "'", ""); replaceAll(right, "'", ""); // Strip hyphens replaceAll(left, "-", ""); replaceAll(right, "-", ""); // Alaska fixes replaceAll(left, "CITYANDBOROUGH", ""); replaceAll(right, "CITYANDBOROUGH", ""); replaceAll(left, "BOROUGH", ""); replaceAll(right, "BOROUGH", ""); replaceAll(left, "CENSUSAREA", ""); replaceAll(right, "CENSUSAREA", ""); replaceAll(left, "MUNICIPALITY", ""); replaceAll(right, "MUNICIPALITY", ""); // Normalize saints replaceAll(left, "ST.", "SAINT"); replaceAll(right, "ST.", "SAINT"); replaceAll(left, "STE.", "SAINTE"); replaceAll(right, "STE.", "SAINTE"); // One-offs replaceAll(left, "DOÑAANA", "DONAANA"); replaceAll(right, "DOÑAANA", "DONAANA"); replaceAll(left, "BRISTOLCITY", "BRISTOL"); replaceAll(right, "BRISTOLCITY", "BRISTOL"); replaceAll(left, "SALEMCITY", "SALEM"); replaceAll(right, "SALEMCITY", "SALEM"); return (left == right); } DLLEXPORT int CALLCONVENTION tqsl_setLocationField(tQSL_Location locp, const char *field, const char *buf) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_setLocationField", "loc error %d", tQSL_Error); return 1; } if (buf == NULL) { tqslTrace("tqsl_setLocationField", "arg error buf=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } int old_page = loc->page; tqsl_setStationLocationCapturePage(loc, 1); do { TQSL_LOCATION_PAGE& p = loc->pagelist[loc->page-1]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD *pf = &p.fieldlist[i]; if (pf->gabbi_name == field) { bool found = false; bool adifVal = false; pf->cdata = string(buf); if (pf->flags & TQSL_LOCATION_FIELD_UPPER) pf->cdata = string_toupper(pf->cdata); if (pf->input_type == TQSL_LOCATION_FIELD_DDLIST || pf->input_type == TQSL_LOCATION_FIELD_LIST) { if (pf->cdata == "") { pf->idx = 0; pf->idata = pf->items[0].ivalue; } else { for (int i = 0; i < static_cast(pf->items.size()); i++) { if (string_toupper(pf->items[i].text) == string_toupper(pf->cdata)) { pf->cdata = pf->items[i].text; pf->idx = i; pf->idata = pf->items[i].ivalue; found = true; break; } if (fuzzy_match(pf->items[i].label, pf->cdata)) { strncpy(tQSL_CustomError, pf->items[i].text.c_str(), sizeof tQSL_CustomError); pf->cdata = pf->items[i].text; pf->idx = i; pf->idata = pf->items[i].ivalue; found = true; adifVal = true; break; } } // This was being used to force-add fields to enumerations, but that's wrong. // Keeping it around in case it's useful later. // if (!found) { // TQSL_LOCATION_ITEM item; // item.text = buf; // item.ivalue = strtol(buf, NULL, 10); // pf->items.push_back(item); // pf->idx = pf->items.size() - 1; // pf->idata = item.ivalue; // } } } else { found = true; } if (pf->data_type == TQSL_LOCATION_FIELD_INT) { pf->idata = strtol(buf, NULL, 10); } tqsl_setStationLocationCapturePage(loc, old_page); if (adifVal) return -2; if (!found) return -1; return 0; } } int rval; if (tqsl_hasNextStationLocationCapture(loc, &rval) || !rval) break; tqsl_nextStationLocationCapture(loc); } while (1); tqsl_setStationLocationCapturePage(loc, old_page); tQSL_Error = TQSL_CALL_NOT_FOUND; return 1; } DLLEXPORT int CALLCONVENTION tqsl_getLocationDXCCEntity(tQSL_Location locp, int *dxcc) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getLocationDXCCEntity", "loc error %d", tQSL_Error); return 1; } if (dxcc == NULL) { tqslTrace("tqsl_getLocationDXCCEntity", "arg err dxcc=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_LOCATION_PAGE& p = loc->pagelist[0]; for (int i = 0; i < static_cast(p.fieldlist.size()); i++) { TQSL_LOCATION_FIELD f = p.fieldlist[i]; if (f.gabbi_name == "DXCC") { if (f.idx < 0 || f.idx >= static_cast(f.items.size())) break; // No matching DXCC entity *dxcc = f.items[f.idx].ivalue; return 0; } } tqslTrace("tqsl_getLocationDXCCEntity", "name not found"); tQSL_Error = TQSL_NAME_NOT_FOUND; return 1; } DLLEXPORT int CALLCONVENTION tqsl_getNumProviders(int *n) { if (n == NULL) { tqslTrace("tqsl_getNumProviders", "arg error n=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } vector plist; if (tqsl_load_provider_list(plist)) { tqslTrace("tqsl_getNumProviders", "error loading providers %d", tQSL_Error); return 1; } if (plist.size() == 0) { tqslTrace("tqsl_getNumProviders", "prov not found"); tQSL_Error = TQSL_PROVIDER_NOT_FOUND; return 1; } *n = plist.size(); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getProvider(int idx, TQSL_PROVIDER *provider) { if (provider == NULL || idx < 0) { tqslTrace("tqsl_getProvider", "arg error provider=0x%lx, idx=%d", provider, idx); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } vector plist; if (tqsl_load_provider_list(plist)) { tqslTrace("tqsl_getProvider", "err %d loading list", tQSL_Error); return 1; } if (idx >= static_cast(plist.size())) { tqslTrace("tqsl_getProvider", "prov not found"); tQSL_Error = TQSL_PROVIDER_NOT_FOUND; return 1; } *provider = plist[idx]; return 0; } DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile(const char *file, int(*cb)(int type, const char *, void *), void *userdata) { bool foundcerts = false; int rval = 0; if (file == NULL) { tqslTrace("tqsl_importTQSLFile", "file=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } // Import the "lost" Root and CA certs as trusted. tqsl_import_cert(rootcertpem, ROOTCERT, NULL, NULL); tqsl_import_cert(cacertpem, CACERT, NULL, NULL); tQSL_ImportCall[0] = '\0'; tQSL_ImportSerial = 0; XMLElement topel; int status = topel.parseFile(file); if (status) { strncpy(tQSL_ErrorFile, file, sizeof tQSL_ErrorFile); if (status == XML_PARSE_SYSTEM_ERROR) { tQSL_Error = TQSL_FILE_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_importTQSLFile", "system error file=%s err=%s", file, strerror(tQSL_Errno)); } else { tQSL_Error = TQSL_FILE_SYNTAX_ERROR; tqslTrace("tqsl_importTQSLFile", "file %s syntax error", file); } return 1; } XMLElement tqsldata; if (!topel.getFirstElement("tqsldata", tqsldata)) { strncpy(tQSL_ErrorFile, file, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; return 1; } XMLElement section; bool stat = tqsldata.getFirstElement("tqslcerts", section); if (stat) { XMLElement cert; bool cstat = section.getFirstElement("rootcert", cert); while (cstat) { foundcerts = true; if (tqsl_import_cert(cert.getText().c_str(), ROOTCERT, cb, userdata)) { tqslTrace("tqsl_importTQSLFile", "duplicate/expired root cert"); } cstat = section.getNextElement(cert); } cstat = section.getFirstElement("cacert", cert); while (cstat) { foundcerts = true; if (tqsl_import_cert(cert.getText().c_str(), CACERT, cb, userdata)) { tqslTrace("tqsl_importTQSLFile", "duplicate/expired ca cert"); } cstat = section.getNextElement(cert); } cstat = section.getFirstElement("usercert", cert); while (cstat) { foundcerts = true; if (tqsl_import_cert(cert.getText().c_str(), USERCERT, cb, userdata)) { tqslTrace("tqsl_importTQSLFile", "error importing user cert"); tQSL_Error = TQSL_CERT_ERROR; rval = 1; } cstat = section.getNextElement(cert); } } // If any of the user certificates failed import, return the error status. if (rval) { return rval; } stat = tqsldata.getFirstElement("tqslconfig", section); if (stat) { // Check to make sure we aren't overwriting newer version int major = strtol(section.getAttribute("majorversion").first.c_str(), NULL, 10); int minor = strtol(section.getAttribute("minorversion").first.c_str(), NULL, 10); int curmajor, curminor; if (tqsl_getConfigVersion(&curmajor, &curminor)) { tqslTrace("tqsl_importTQSLFile", "Get config ver error %d", tQSL_Error); return 1; } if (major < curmajor) { if (foundcerts) { tqslTrace("tqsl_importTQSLFile", "Suppressing update from V%d.%d to V%d.%d", curmajor, curminor, major, minor); return rval; } tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "This configuration file (V%d.%d) is older than the currently installed one (V%d.%d). It will not be installed.", major, minor, curmajor, curminor); tqslTrace("tqsl_importTQSLFile", "Config update error: %s", tQSL_CustomError); return 1; } if (major == curmajor) { if (minor == curminor) { // Same rev as already installed tqslTrace("tqsl_importTQSLFile", "Suppressing update from V%d.%d to V%d.%d", curmajor, curminor, major, minor); return rval; } if (minor < curminor) { if (foundcerts) { tqslTrace("tqsl_importTQSLFile", "Suppressing update from V%d.%d to V%d.%d", curmajor, curminor, major, minor); return rval; } tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "This configuration file (V%d.%d) is older than the currently installed one (V%d.%d). It will not be installed.", major, minor, curmajor, curminor); tqslTrace("tqsl_importTQSLFile", "Config update error: %s", tQSL_CustomError); return rval; } } // Save the configuration file ofstream out; #ifdef _WIN32 string fn = string(tQSL_BaseDir) + "\\config.xml"; #else string fn = string(tQSL_BaseDir) + "/config.xml"; #endif out.exceptions(ios::failbit | ios::eofbit | ios::badbit); try { #ifdef _WIN32 wchar_t *wfn = utf8_to_wchar(fn.c_str()); out.open(wfn); free_wchar(wfn); #else out.open(fn.c_str()); #endif out << section << endl; out.close(); } catch(exception& x) { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Error writing new configuration file (%s): %s/%s", fn.c_str(), x.what(), strerror(errno)); tqslTrace("tqsl_importTQSLFile", "I/O error: %s", tQSL_CustomError); if (cb) return (*cb)(TQSL_CERT_CB_RESULT | TQSL_CERT_CB_ERROR | TQSL_CERT_CB_CONFIG, fn.c_str(), userdata); if (tQSL_Error == 0) { tQSL_Error = TQSL_CERT_ERROR; } return 1; } // Clear stored config data to force re-reading new config DXCCMap.clear(); DXCCList.clear(); DeletedMap.clear(); DXCCZoneMap.clear(); DXCCStartMap.clear(); DXCCEndMap.clear(); BandList.clear(); ModeList.clear(); PropModeList.clear(); SatelliteList.clear(); tqsl_page_map.clear(); tqsl_field_map.clear(); tqsl_adif_map.clear(); tqsl_adif_mode_map.clear(); tqsl_adif_submode_map.clear(); tqsl_cabrillo_map.clear(); tqsl_cabrillo_user_map.clear(); tqsl_xml_config.clear(); // Now reload it all tqsl_load_xml_config(); string version = "Configuration V" + section.getAttribute("majorversion").first + "." + section.getAttribute("minorversion").first + "\n" + fn; if (cb) { int cbret = (*cb)(TQSL_CERT_CB_RESULT | TQSL_CERT_CB_LOADED | TQSL_CERT_CB_CONFIG, version.c_str(), userdata); if (cbret || rval) { if (tQSL_Error == 0) { tQSL_Error = TQSL_CERT_ERROR; } return 1; } } } if (rval && tQSL_Error == 0) { tQSL_Error = TQSL_CERT_ERROR; } return rval; } /* * Get the first user certificate from a .tq6 file */ DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile(const char *file, long *serial) { XMLElement topel; if (file == NULL || serial == NULL) { tqslTrace("tqsl_getSerialFromTQSLFile", "Arg error file=0x%lx, serial=0x%lx", file, serial); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } int status = topel.parseFile(file); if (status) { strncpy(tQSL_ErrorFile, file, sizeof tQSL_ErrorFile); if (status == XML_PARSE_SYSTEM_ERROR) { tQSL_Error = TQSL_FILE_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_getSerialFromTQSLFile", "parse error %d, error %s", tQSL_Error, strerror(tQSL_Errno)); } else { tQSL_Error = TQSL_FILE_SYNTAX_ERROR; tqslTrace("tqsl_getSerialFromTQSLFile", "parse syntax error %d", tQSL_Error); } return 1; } XMLElement tqsldata; if (!topel.getFirstElement("tqsldata", tqsldata)) { strncpy(tQSL_ErrorFile, file, sizeof tQSL_ErrorFile); tqslTrace("tqsl_getSerialFromTQSLFile", "parse syntax error %d", tQSL_Error); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; return 1; } XMLElement section; bool stat = tqsldata.getFirstElement("tqslcerts", section); if (stat) { XMLElement cert; bool cstat = section.getFirstElement("usercert", cert); if (cstat) { if (tqsl_get_pem_serial(cert.getText().c_str(), serial)) { strncpy(tQSL_ErrorFile, file, sizeof tQSL_ErrorFile); tqslTrace("tqsl_getSerialFromTQSLFile", "parse syntax error %d", tQSL_Error); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; return 1; } return 0; } } tqslTrace("tqsl_getSerialFromTQSLFile", "no usercert in file %s", file); return 1; } DLLEXPORT int CALLCONVENTION tqsl_getDeletedStationLocations(char ***locp, int *nloc) { if (locp == NULL) { tqslTrace("tqsl_getDeletedStationLocations", "arg error locp=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (nloc == NULL) { tqslTrace("tqsl_getDeletedStationLocations", "arg error nloc=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *locp = NULL; *nloc = 0; vector namelist; XMLElement top_el; if (tqsl_load_station_data(top_el, true)) { tqslTrace("tqsl_getDeletedStationLocations", "error %d loading station data", tQSL_Error); return 1; } XMLElement sfile; if (top_el.getFirstElement(sfile)) { XMLElement sd; bool ok = sfile.getFirstElement("StationData", sd); while (ok && sd.getElementName() == "StationData") { pair name = sd.getAttribute("name"); if (name.second) { namelist.push_back(name.first); } ok = sfile.getNextElement(sd); } } *nloc = namelist.size(); if (*nloc == 0) { *locp = NULL; return 0; } *locp = reinterpret_cast(calloc(*nloc, sizeof(**locp))); vector::iterator it; char **p = *locp; for (it = namelist.begin(); it != namelist.end(); it++) { *p++ = strdup((*it).c_str()); } return 0; } DLLEXPORT void CALLCONVENTION tqsl_freeDeletedLocationList(char** list, int nloc) { if (!list) return; for (int i = 0; i < nloc; i++) if (list[i]) free(list[i]); if (list) free(list); } DLLEXPORT int CALLCONVENTION tqsl_getLocationQSODetails(tQSL_Location locp, char *buf, int buflen) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getLocationQSODetails", "loc error %d", tQSL_Error); return 1; } if (buf == NULL) { tqslTrace("tqsl_getLocationQSODetails", "Argument error, buf = 0x%lx", buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(buf, loc->qso_details.c_str(), buflen); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getLocationStationDetails(tQSL_Location locp, char *buf, int buflen) { TQSL_LOCATION *loc; if (!(loc = check_loc(locp, false))) { tqslTrace("tqsl_getLocationStationDetails", "loc error %d", tQSL_Error); return 1; } if (buf == NULL) { tqslTrace("tqsl_getLocationStationDetails", "Argument error, buf = 0x%lx", buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(buf, loc->loc_details.c_str(), buflen); return 0; } tqsl-2.8.1/src/location.h0000644000175000017500000000213415003421124015243 0ustar rmurphyrmurphy/*************************************************************************** location.h - description ------------------- begin : Fri Nov 15 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __location_h #define __location_h // TQSL_LOCATION_FIELD flag bits #define TQSL_LOCATION_FIELD_UPPER 1 #define TQSL_LOCATION_FIELD_MUSTSEL 2 #define TQSL_LOCATION_FIELD_SELNXT 4 #include #include #include "winstrdefs.h" using std::vector; class VUCCgrid { public: VUCCgrid(int ent, const char * pas, const char * grid) { _ent = ent; if (pas) _pas = strdup(pas); else _pas = NULL; _grid = strdup(grid); } int ent() { return _ent; } char* pas() { return _pas; } char* grid() { return _grid; } private: int _ent; char* _pas; char* _grid; }; typedef vector VUCCGridList; #endif // __location_h tqsl-2.8.1/src/openssl_cert.cpp0000644000175000017500000055634315003421124016506 0ustar rmurphyrmurphy/*************************************************************************** openssl_cert.c - description ------------------- begin : Tue May 14 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ /* Routines to massage X.509 certs for tQSL. See openssl_cert.h for overview */ /* 2004-04-10 Fixed tqsl_add_bag_attribute error for OpenSSL > 0.96 (Thanks to Kenji, JJ1BDX for the fix) */ /* Portions liberally copied from OpenSSL's apps source code */ /* ==================================================================== * Copyright (c) 1998-2001 The OpenSSL Project. 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. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED 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 OpenSSL PROJECT OR * ITS 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. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * 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 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. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 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 licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #define OPENSSL_CERT_SOURCE #define TQSLLIB_DEF #include #include #include #include #include #include #include #ifdef _WIN32 #include #define MKDIR(x, y) _wmkdir(x) #else #define MKDIR(x, y) mkdir(x, y) #include #include #endif #define OPENSSL_SUPPRESS_DEPRECATED // Suppress warnings for deprecated functions #include #if OPENSSL_VERSION_MAJOR >= 3 #include #include #endif #include #include #undef X509_NAME //http://www.mail-archive.com/openssl-users@openssl.org/msg59116.html #include #include #include #include #include #include /* Ugly workaround for Openssl 1.0 bug per: * http://rt.openssl.org/Ticket/Display.html?user=guest&pass=guest&id=2123 */ #if (OPENSSL_VERSION_NUMBER == 0x10000003L) #define i2d_ASN1_SET i2d_ASN1_SET_buggy #define d2i_ASN1_SET d2i_ASN1_SET_buggy #define ASN1_seq_unpack ASN1_seq_unpack_buggy #define ASN1_seq_pack ASN1_seq_pack_buggy #include #undef i2d_ASN1_SET #undef d2i_ASN1_SET #undef ASN1_seq_unpack #undef ASN1_seq_pack #include #include #ifdef __cplusplus extern "C" { #endif int i2d_ASN1_SET(void *a, unsigned char **pp, i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); void *d2i_ASN1_SET(void *a, const unsigned char **pp, long length, d2i_of_void *d2i, void (*free_func)(void* p), int ex_tag, int ex_class); void *ASN1_seq_unpack(const unsigned char *buf, int len, d2i_of_void *d2i, void (*free_func)(void* dummy)); unsigned char *ASN1_seq_pack(void *safes, i2d_of_void *i2d, unsigned char **buf, int *len); #ifdef __cplusplus } #endif #endif // OpenSSL v1.0 // Work with OpenSSL 1.1.0 and later #if OPENSSL_VERSION_NUMBER >= 0x10100000L #ifndef M_PKCS12_bag_type # define M_PKCS12_bag_type PKCS12_bag_type #endif #ifndef M_PKCS12_cert_bag_type # define M_PKCS12_cert_bag_type PKCS12_cert_bag_type #endif #ifndef M_PKCS12_crl_bag_type # define M_PKCS12_crl_bag_type PKCS12_cert_bag_type #endif #ifndef M_PKCS12_certbag2x509 # define M_PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert #endif #ifndef M_PKCS12_decrypt_skey # define M_PKCS12_decrypt_skey PKCS12_decrypt_skey #endif #ifndef M_PKCS12_unpack_authsafes # define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes #endif #ifndef M_PKCS12_pack_authsafes # define M_PKCS12_pack_authsafes PKCS12_pack_authsafes #endif #ifndef PKCS12_get_attr # define PKCS12_get_attr PKCS12_SAFEBAG_get0_attr #endif #ifndef PKCS12_bag_type # define PKCS12_bag_type PKCS12_SAFEBAG_get_nid #endif #ifndef PKCS12_cert_bag_type # define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid #endif #if !defined(PKCS12_x5092certbag) && !defined(LIBRESSL_VERSION_NUMBER) # define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert #endif #ifndef PKCS12_x509crl2certbag # define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl #endif #ifndef X509_STORE_CTX_trusted_stack # define X509_STORE_CTX_trusted_stack X509_STORE_CTX_set0_trusted_stack #endif #ifndef X509_get_notAfter # define X509_get_notAfter X509_get0_notAfter #endif #ifndef X509_get_notBefore # define X509_get_notBefore X509_get0_notBefore #endif #if !defined (PKCS12_MAKE_SHKEYBAG) && !defined(LIBRESSL_VERSION_NUMBER) # define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt #endif #ifndef X509_V_FLAG_CB_ISSUER_CHECK # define X509_V_FLAG_CB_ISSUER_CHECK 0x0 #endif #else # define ASN1_STRING_get0_data ASN1_STRING_data #endif #include #include #include #include #include #include #include "tqsllib.h" #include "tqslerrno.h" #include "xml.h" #include "winstrdefs.h" #ifdef _MSC_VER //is a visual studio compiler #include "windirent.h" #endif #define tqsl_malloc malloc #define tqsl_realloc realloc #define tqsl_calloc calloc #define tqsl_free free #define TQSL_OBJ_TO_API(x) (reinterpret_cast((x))) #define TQSL_API_TO_OBJ(x, type) ((type)(x)) #define TQSL_API_TO_CERT(x) TQSL_API_TO_OBJ((x), tqsl_cert *) #include "openssl_cert.h" using std::vector; using std::map; using std::set; using std::string; using std::ofstream; using std::ios; using std::endl; using std::exception; using tqsllib::XMLElement; using tqsllib::XMLElementList; #ifdef _WIN32 #define TQSL_OPEN_READ L"rb" #define TQSL_OPEN_WRITE L"wb" #define TQSL_OPEN_APPEND L"ab" #else #define TQSL_OPEN_READ "r" #define TQSL_OPEN_WRITE "w" #define TQSL_OPEN_APPEND "a" #endif #if (OPENSSL_VERSION_NUMBER & 0xfffff000) >= 0x10000000L #define uni2asc OPENSSL_uni2asc #define asc2uni OPENSSL_asc2uni #endif static char *tqsl_trim(char *buf); static int tqsl_check_parm(const char *p, const char *parmName); static TQSL_CERT_REQ *tqsl_copy_cert_req(TQSL_CERT_REQ *userreq); static TQSL_CERT_REQ *tqsl_free_cert_req(TQSL_CERT_REQ *req, int seterr); static char *tqsl_make_key_path(const char *callsign, char *path, int size); static int tqsl_make_key_list(vector< map > & keys); static int tqsl_find_matching_key(X509 *cert, EVP_PKEY **keyp, TQSL_CERT_REQ **crq, const char *password, int (*cb)(char *, int, void *), void *); static char *tqsl_make_cert_path(const char *filename, char *path, int size); static char *tqsl_make_backup_path(const char *filename, char *path, int size); static int tqsl_get_cert_ext(X509 *cert, const char *ext, unsigned char *userbuf, int *buflen, int *crit); CLIENT_STATIC int tqsl_get_asn1_date(const ASN1_TIME *tm, tQSL_Date *date); static char *tqsl_sign_base64_data(tQSL_Cert cert, char *b64data); static int fixed_password_callback(char *buf, int bufsiz, int verify, void *userdata); static int prompted_password_callback(char *buf, int bufsiz, int verify, void *userfunc); static int tqsl_check_crq_field(tQSL_Cert cert, char *buf, int bufsiz); static bool safe_strncpy(char *dest, const char *src, int size); static int tqsl_ssl_error_is_nofile(); static int tqsl_unlock_key(const char *pem, EVP_PKEY **keyp, const char *password, int (*cb)(char *, int, void *), void *); static int tqsl_replace_key(const char *callsign, const char *path, map& newfields, int (*cb)(int, const char *, void *), void *userdata); static int tqsl_self_signed_is_ok(int ok, X509_STORE_CTX *ctx); static int tqsl_expired_is_ok(int ok, X509_STORE_CTX *ctx); static int tqsl_clear_deleted(const char *callsign, const char *path, EVP_PKEY *cert_key); static int tqsl_key_exists(const char *callsign, EVP_PKEY *cert_key); static int tqsl_open_key_file(const char *path); static int tqsl_read_key(map& fields); static void tqsl_close_key_file(void); extern const char* tqsl_openssl_error(void); /* Private data structures */ typedef struct { long id; X509 *cert; EVP_PKEY *key; TQSL_CERT_REQ *crq; char *pubkey; char *privkey; unsigned char keyonly; } tqsl_cert; typedef struct { long id; X509 *cert; } tqsl_crq; static tqsl_cert * tqsl_cert_new(); static void tqsl_cert_free(tqsl_cert *p); static int tqsl_cert_check(tqsl_cert *p, bool needcert = true); struct tqsl_loadcert_handler { int type; int (*func)(const char *pem, X509 *x, int(*cb)(int type, const char *, void *), void *); }; static int tqsl_handle_root_cert(const char *, X509 *, int (*cb)(int, const char *, void *), void *); static int tqsl_handle_ca_cert(const char *, X509 *, int (*cb)(int, const char *, void *), void *); static int tqsl_handle_user_cert(const char *, X509 *, int (*cb)(int, const char *, void *), void *); static struct tqsl_loadcert_handler tqsl_loadcert_handlers[] = { { TQSL_CERT_CB_ROOT, &tqsl_handle_root_cert }, { TQSL_CERT_CB_CA, &tqsl_handle_ca_cert }, { TQSL_CERT_CB_USER, &tqsl_handle_user_cert } }; static const char *notypes[] = { "" }; /* static tqsl_adifFieldDefinitions tqsl_cert_file_fields[] = { { "TQSL_CERT", "", TQSL_ADIF_RANGE_TYPE_NONE, 0, 0, 0, NULL, NULL }, { "TQSL_CERT_USER", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, &tqsl_load_user_cert }, { "TQSL_CERT_CA", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, &tqsl_load_ca_cert }, { "TQSL_CERT_ROOT", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, &tqsl_load_root_cert }, }; */ static unsigned char tqsl_static_buf[2001]; static char ImportCall[256]; #if !defined(__APPLE__) && !defined(_WIN32) && !defined(__clang__) #pragma GCC diagnostic ignored "-Wformat-truncation" #endif static unsigned char * tqsl_static_alloc(size_t size) { if (size > sizeof tqsl_static_buf) return NULL; strncpy(reinterpret_cast(tqsl_static_buf), "", sizeof tqsl_static_buf); return tqsl_static_buf; } namespace tqsllib { int tqsl_import_cert(const char *data, certtype type, int(*cb)(int, const char *, void *), void *userdata) { BIO *bio; X509 *cert; int stat; struct tqsl_loadcert_handler *handler = &(tqsl_loadcert_handlers[type]); /* This is a certificate, supposedly. Let's make sure */ tqslTrace("tqsl_import_cert", NULL); bio = BIO_new_mem_buf(reinterpret_cast(const_cast(data)), strlen(data)); if (bio == NULL) { tqslTrace("tqsl_import_cert", "BIO mem buf error %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } cert = PEM_read_bio_X509(bio, NULL, NULL, NULL); BIO_free(bio); if (cert == NULL) { tqslTrace("tqsl_import_cert", "BIO read error, err=%s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } /* It's a certificate. Let's try to add it. Any errors will be * reported via the callback (if any) but will not be fatal unless * the callback says so. */ ImportCall[0] = '\0'; tQSL_ImportSerial = 0; stat = (*(handler->func))(data, cert, cb, userdata); X509_free(cert); if (stat) { if (tQSL_Error == TQSL_CERT_ERROR) { return 1; } if (cb != NULL) { stat = (*cb)(handler->type | TQSL_CERT_CB_RESULT | TQSL_CERT_CB_ERROR, tqsl_getErrorString_v(tQSL_Error), userdata); if (stat) { tqslTrace("tqsl_import_cert", "import error %d", tQSL_Error); return 1; } else { tqslTrace("tqsl_import_cert", "import error. Handler suppressed."); } } else { /* No callback -- any errors are fatal */ tqslTrace("tqsl_import_cert", "import error %d", tQSL_Error); return 1; } return stat; } strncpy(tQSL_ImportCall, ImportCall, sizeof tQSL_ImportCall); return 0; } int tqsl_get_pem_serial(const char *pem, long *serial) { BIO *bio; X509 *cert; tqslTrace("tqsl_get_pem_serial", NULL); if (tqsl_init()) return 1; if (pem == NULL || serial == NULL) { tqslTrace("tqsl_get_pem_serial", "arg error pem=0x%lx, serial=0x%lx", pem, serial); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } bio = BIO_new_mem_buf(reinterpret_cast(const_cast(pem)), strlen(pem)); if (bio == NULL) { tqslTrace("tqsl_get_pem_serial", "mem buf error %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } cert = PEM_read_bio_X509(bio, NULL, NULL, NULL); BIO_free(bio); if (cert == NULL) { tqslTrace("tqsl_get_pem_serial", "cert read error %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } *serial = ASN1_INTEGER_get(X509_get_serialNumber(cert)); return 0; } } // namespace tqsllib /********** PUBLIC API FUNCTIONS ***********/ DLLEXPORT int CALLCONVENTION tqsl_createCertRequest(const char *filename, TQSL_CERT_REQ *userreq, int (*pwcb)(char *pwbuf, int pwsize, void *), void *userdata) { TQSL_CERT_REQ *req = NULL; EVP_PKEY *key = NULL; X509_REQ *xr = NULL; X509_NAME *subj = NULL; int nid, len; int rval = 1; FILE *out = NULL; BIO *bio = NULL; const EVP_MD *digest = NULL; char buf[200]; char path[TQSL_MAX_PATH_LEN]; char *cp; const EVP_CIPHER *cipher = NULL; char *password; const char *type; tqslTrace("tqsl_createCertRequest", NULL); if (tqsl_init()) return 1; if (filename == NULL || userreq == NULL) { tqslTrace("tqsl_createCertRequest", "arg error filename=0x%lx, userreq=0x%lx", filename, userreq); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (userreq->signer != NULL && (!tqsl_cert_check(TQSL_API_TO_CERT(userreq->signer)) || TQSL_API_TO_CERT(userreq->signer)->key == NULL)) { tqslTrace("tqsl_createCertRequest", "arg error signer/key"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if ((req = tqsl_copy_cert_req(userreq)) == NULL) { tqslTrace("tqsl_createCertRequest", "Error copying %d", tQSL_Error); goto end; } /* Check parameters for validity */ tqsl_trim(req->providerName); tqsl_trim(req->providerUnit); tqsl_trim(req->name); if (tqsl_check_parm(req->name, "Name")) { tqslTrace("tqsl_createCertRequest", "check_parm Name"); goto end; } tqsl_trim(req->callSign); if (tqsl_check_parm(req->callSign, "Call Sign")) { tqslTrace("tqsl_createCertRequest", "check_parm Call Sign"); goto end; } tqsl_trim(req->address1); if (tqsl_check_parm(req->address1, "Address")) { tqslTrace("tqsl_createCertRequest", "check_parm Address1"); goto end; } tqsl_trim(req->address2); tqsl_trim(req->city); if (tqsl_check_parm(req->city, "City")) { tqslTrace("tqsl_createCertRequest", "check_parm City"); goto end; } tqsl_trim(req->state); tqsl_trim(req->country); if (tqsl_check_parm(req->country, "Country")) { tqslTrace("tqsl_createCertRequest", "check_parm Country"); goto end; } tqsl_trim(req->postalCode); tqsl_trim(req->emailAddress); if (tqsl_check_parm(req->emailAddress, "Email address")) { tqslTrace("tqsl_createCertRequest", "check_parm email"); goto end; } if ((cp = strchr(req->emailAddress, '@')) == NULL || strchr(cp, '.') == NULL) { strncpy(tQSL_CustomError, "Invalid email address", sizeof tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; tqslTrace("tqsl_createCertRequest", "check_parm email: %s %s", req->emailAddress, tQSL_CustomError); goto end; } if (!tqsl_isDateValid(&(req->qsoNotBefore))) { strncpy(tQSL_CustomError, "Invalid date (qsoNotBefore)", sizeof tQSL_CustomError); tqslTrace("tqsl_createCertRequest", "check_parm not before: %s %s", req->qsoNotBefore, tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; goto end; } if (!tqsl_isDateNull(&(req->qsoNotAfter))) { if (!tqsl_isDateValid(&(req->qsoNotAfter))) { strncpy(tQSL_CustomError, "Invalid date (qsoNotAfter)", sizeof tQSL_CustomError); tqslTrace("tqsl_createCertRequest", "check_parm not after: %s %s", req->qsoNotAfter, tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; goto end; } if (tqsl_compareDates(&(req->qsoNotAfter), &(req->qsoNotBefore)) < 0) { strncpy(tQSL_CustomError, "qsoNotAfter date is earlier than qsoNotBefore", sizeof tQSL_CustomError); tqslTrace("tqsl_createCertRequest", "check_parm not after: %s %s", req->qsoNotAfter, tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; goto end; } } /* Try opening the output stream */ #ifdef _WIN32 wchar_t* wfilename = utf8_to_wchar(filename); if ((out = _wfopen(wfilename, TQSL_OPEN_WRITE)) == NULL) { free_wchar(wfilename); #else if ((out = fopen(filename, TQSL_OPEN_WRITE)) == NULL) { #endif strncpy(tQSL_ErrorFile, filename, sizeof tQSL_ErrorFile); tqslTrace("tqsl_createCertRequest", "Open file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; goto end; } #ifdef _WIN32 free_wchar(wfilename); #endif if (fputs("\ntQSL certificate request\n\n", out) == EOF) { strncpy(tQSL_ErrorFile, filename, sizeof tQSL_ErrorFile); tqslTrace("tqsl_createCertRequest", "Write request file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; goto end; } tqsl_write_adif_field(out, "eoh", 0, NULL, 0); type = (req->signer != NULL) ? (req->renew ? "TQSL_CRQ_RENEWAL" : "TQSL_CRQ_ADDITIONAL") : "TQSL_CRQ_NEW"; int libmaj, libmin, configmaj, configmin; tqsl_getVersion(&libmaj, &libmin); tqsl_getConfigVersion(&configmaj, &configmin); snprintf(buf, sizeof buf, "TQSL: %d.%d.%d, Lib: V%d.%d, Config: %d.%d", TQSL_VERSION_MAJOR, TQSL_VERSION_MINOR, TQSL_VERSION_UPDATE, libmaj, libmin, configmaj, configmin); tqsl_write_adif_field(out, "TQSL_IDENT", 0, (unsigned char *)buf, -1); tqsl_write_adif_field(out, type, 0, NULL, 0); tqsl_write_adif_field(out, "TQSL_CRQ_PROVIDER", 0, (unsigned char *)req->providerName, -1); tqsl_write_adif_field(out, "TQSL_CRQ_PROVIDER_UNIT", 0, (unsigned char *)req->providerUnit, -1); tqsl_write_adif_field(out, "TQSL_CRQ_EMAIL", 0, (unsigned char *)req->emailAddress, -1); tqsl_write_adif_field(out, "TQSL_CRQ_NAME", 0, (unsigned char *)req->name, -1); tqsl_write_adif_field(out, "TQSL_CRQ_ADDRESS1", 0, (unsigned char *)req->address1, -1); tqsl_write_adif_field(out, "TQSL_CRQ_ADDRESS2", 0, (unsigned char *)req->address2, -1); tqsl_write_adif_field(out, "TQSL_CRQ_CITY", 0, (unsigned char *)req->city, -1); tqsl_write_adif_field(out, "TQSL_CRQ_STATE", 0, (unsigned char *)req->state, -1); tqsl_write_adif_field(out, "TQSL_CRQ_POSTAL", 0, (unsigned char *)req->postalCode, -1); tqsl_write_adif_field(out, "TQSL_CRQ_COUNTRY", 0, (unsigned char *)req->country, -1); snprintf(buf, sizeof buf, "%d", req->dxccEntity); tqsl_write_adif_field(out, "TQSL_CRQ_DXCC_ENTITY", 0, (unsigned char *)buf, -1); tqsl_convertDateToText(&(req->qsoNotBefore), buf, sizeof buf); tqsl_write_adif_field(out, "TQSL_CRQ_QSO_NOT_BEFORE", 0, (unsigned char *)buf, -1); if (!tqsl_isDateNull(&(req->qsoNotAfter))) { tqsl_convertDateToText(&(req->qsoNotAfter), buf, sizeof buf); tqsl_write_adif_field(out, "TQSL_CRQ_QSO_NOT_AFTER", 0, (unsigned char *)buf, -1); } /* Generate a new key pair */ if ((key = tqsl_new_rsa_key(1024)) == NULL) { tqslTrace("tqsl_createCertRequest", "key create error %d", tQSL_Error); goto end; } /* Make the X.509 certificate request */ if ((xr = X509_REQ_new()) == NULL) { tqslTrace("tqsl_createCertRequest", "req create error %s", tqsl_openssl_error()); goto err; } if (!X509_REQ_set_version(xr, 0L)) { tqslTrace("tqsl_createCertRequest", "version set error %s", tqsl_openssl_error()); goto err; } subj = X509_REQ_get_subject_name(xr); nid = OBJ_txt2nid("AROcallsign"); if (nid != NID_undef) X509_NAME_add_entry_by_NID(subj, nid, MBSTRING_ASC, (unsigned char *)req->callSign, -1, -1, 0); nid = OBJ_txt2nid("commonName"); if (nid != NID_undef) X509_NAME_add_entry_by_NID(subj, nid, MBSTRING_ASC, (unsigned char *)req->name, -1, -1, 0); nid = OBJ_txt2nid("emailAddress"); if (nid != NID_undef) X509_NAME_add_entry_by_NID(subj, nid, MBSTRING_ASC, (unsigned char *)req->emailAddress, -1, -1, 0); X509_REQ_set_pubkey(xr, key); if ((digest = EVP_sha256()) == NULL) { tqslTrace("tqsl_createCertRequest", "evp_sha256 error %s", tqsl_openssl_error()); goto err; } if (!X509_REQ_sign(xr, key, digest)) { tqslTrace("tqsl_createCertRequest", "req_sign error %s", tqsl_openssl_error()); goto err; } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_createCertRequest", "bio_new error %s", tqsl_openssl_error()); goto err; } if (!PEM_write_bio_X509_REQ(bio, xr)) { tqslTrace("tqsl_createCertRequest", "write_bio error %s", tqsl_openssl_error()); goto err; } len = static_cast(BIO_get_mem_data(bio, &cp)); tqsl_write_adif_field(out, "TQSL_CRQ_REQUEST", 0, (unsigned char *)cp, len); if (req->signer != NULL) { char *b64; char ibuf[256]; if ((b64 = tqsl_sign_base64_data(req->signer, cp)) == NULL) { fclose(out); out = NULL; tqslTrace("tqsl_createCertRequest", "tqsl_sign_base64 error %s", tqsl_openssl_error()); goto end; } tqsl_write_adif_field(out, "TQSL_CRQ_SIGNATURE", 0, (unsigned char *)b64, -1); tqsl_getCertificateIssuer(req->signer, ibuf, sizeof ibuf); tqsl_write_adif_field(out, "TQSL_CRQ_SIGNATURE_CERT_ISSUER", 0, (unsigned char *)ibuf, -1); snprintf(ibuf, sizeof ibuf, "%ld", ASN1_INTEGER_get(X509_get_serialNumber(TQSL_API_TO_CERT(req->signer)->cert))); tqsl_write_adif_field(out, "TQSL_CRQ_SIGNATURE_CERT_SERIAL", 0, (unsigned char *)ibuf, -1); } BIO_free(bio); bio = NULL; tqsl_write_adif_field(out, "eor", 0, NULL, 0); if (fclose(out) == EOF) { strncpy(tQSL_ErrorFile, filename, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_createCertRequest", "write error %d", errno); out = NULL; goto end; } out = NULL; /* Write the key to the key store */ if (!tqsl_make_key_path(req->callSign, path, sizeof path)) { tqslTrace("tqsl_createCertRequest", "make_key_path error %d", errno); goto end; } #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); if ((out = _wfopen(wpath, TQSL_OPEN_APPEND)) == NULL) { free_wchar(wpath); #else if ((out = fopen(path, TQSL_OPEN_APPEND)) == NULL) { #endif strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_createCertRequest", "opening file error %s", strerror(errno)); goto end; } #ifdef _WIN32 free_wchar(wpath); #endif tqsl_write_adif_field(out, "TQSL_CRQ_PROVIDER", 0, (unsigned char *)req->providerName, -1); tqsl_write_adif_field(out, "TQSL_CRQ_PROVIDER_UNIT", 0, (unsigned char *)req->providerUnit, -1); tqsl_write_adif_field(out, "TQSL_CRQ_EMAIL", 0, (unsigned char *)req->emailAddress, -1); tqsl_write_adif_field(out, "TQSL_CRQ_ADDRESS1", 0, (unsigned char *)req->address1, -1); tqsl_write_adif_field(out, "TQSL_CRQ_ADDRESS2", 0, (unsigned char *)req->address2, -1); tqsl_write_adif_field(out, "TQSL_CRQ_CITY", 0, (unsigned char *)req->city, -1); tqsl_write_adif_field(out, "TQSL_CRQ_STATE", 0, (unsigned char *)req->state, -1); tqsl_write_adif_field(out, "TQSL_CRQ_POSTAL", 0, (unsigned char *)req->postalCode, -1); tqsl_write_adif_field(out, "TQSL_CRQ_COUNTRY", 0, (unsigned char *)req->country, -1); tqsl_write_adif_field(out, "CALLSIGN", 0, (unsigned char *)req->callSign, -1); snprintf(buf, sizeof buf, "%d", req->dxccEntity); tqsl_write_adif_field(out, "TQSL_CRQ_DXCC_ENTITY", 0, (unsigned char *)buf, -1); tqsl_convertDateToText(&(req->qsoNotBefore), buf, sizeof buf); tqsl_write_adif_field(out, "TQSL_CRQ_QSO_NOT_BEFORE", 0, (unsigned char *)buf, -1); if (!tqsl_isDateNull(&(req->qsoNotAfter))) { tqsl_convertDateToText(&(req->qsoNotAfter), buf, sizeof buf); tqsl_write_adif_field(out, "TQSL_CRQ_QSO_NOT_AFTER", 0, (unsigned char *)buf, -1); } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_createCertRequest", "bio_new error %s", tqsl_openssl_error()); goto err; } password = const_cast(req->password); if (password == NULL && pwcb != NULL) { if ((*pwcb)(buf, TQSL_MAX_PW_LENGTH, userdata)) { tqslTrace("tqsl_createCertRequest", "password abort"); tQSL_Error = TQSL_OPERATOR_ABORT; goto end; } password = buf; } if (password != NULL && *password != '\0') { if ((cipher = EVP_des_ede3_cbc()) == NULL) { tqslTrace("tqsl_createCertRequest", "password error"); goto err; } len = strlen(password); } else { password = NULL; len = 0; } if (!PEM_write_bio_PrivateKey(bio, key, cipher, (unsigned char *)password, len, NULL, NULL)) { tqslTrace("tqsl_createCertRequest", "write priv key error %s", tqsl_openssl_error()); goto err; } len = static_cast(BIO_get_mem_data(bio, &cp)); tqsl_write_adif_field(out, "PRIVATE_KEY", 0, (unsigned char *)cp, len); BIO_free(bio); if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_createCertRequest", "bio_new error %s", tqsl_openssl_error()); goto err; } if (!PEM_write_bio_PUBKEY(bio, key)) { tqslTrace("tqsl_createCertRequest", "write pubkey %s", tqsl_openssl_error()); goto err; } len = static_cast(BIO_get_mem_data(bio, &cp)); tqsl_write_adif_field(out, "PUBLIC_KEY", 0, (unsigned char *)cp, len); BIO_free(bio); bio = NULL; tqsl_write_adif_field(out, "eor", 0, NULL, 0); if (fclose(out) == EOF) { tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_createCertRequest", "write file error %s", strerror(tQSL_Errno)); goto end; } out = NULL; rval = 0; goto end; err: tQSL_Error = TQSL_OPENSSL_ERROR; end: if (bio != NULL) BIO_free(bio); if (out != NULL) fclose(out); if (xr != NULL) X509_REQ_free(xr); if (key != NULL) EVP_PKEY_free(key); if (req != NULL) tqsl_free_cert_req(req, 0); return rval; } DLLEXPORT int CALLCONVENTION tqsl_getSelectedCertificate(tQSL_Cert *cert, const tQSL_Cert **certlist, int idx) { tqslTrace("tqsl_getSelectedCertificate", NULL); if (tqsl_init()) return 1; if (certlist == NULL || cert == NULL || idx < 0) { tqslTrace("tqsl_getSelectedCertificate", "arg error certlist=0x%lx, cert=0x%lx, idx=%d", certlist, cert, idx); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *cert = (*certlist)[idx]; return 0; } DLLEXPORT int CALLCONVENTION tqsl_isCertificateExpired(tQSL_Cert cert, int *status) { tqslTrace("tqsl_isCertificateExpired", NULL); if (tqsl_init()) return 1; if (cert == NULL || status == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_isCertificateExpired", "arg error cert=0x%lx status=0x%lx", cert, status); tQSL_Error = TQSL_ARGUMENT_ERROR; if (status) *status = false; return 1; } int keyonly; if (tqsl_getCertificateKeyOnly(cert, &keyonly) == 0 && keyonly) { *status = false; return 0; } long serial = 0; tqsl_getCertificateSerial(cert, &serial); int sts = tqsl_getCertificateStatus(serial); if (sts == TQSL_CERT_STATUS_EXP || sts == TQSL_CERT_STATUS_INV) { *status = true; return 0; } *status = false; /* Check for expired */ struct tm *tm; #ifdef _WIN32 __time32_t t = _time32(0); tm = _gmtime32(&t); #else time_t t = time(0); struct tm tmr; tm = &tmr; tm = gmtime_r(&t, tm); #endif tQSL_Date d; d.year = tm->tm_year + 1900; d.month = tm->tm_mon + 1; d.day = tm->tm_mday; const ASN1_TIME *ctm; if ((ctm = X509_get_notAfter(TQSL_API_TO_CERT(cert)->cert)) == NULL) { *status = true; return 0; } else { tQSL_Date cert_na; tqsl_get_asn1_date(ctm, &cert_na); if (tqsl_compareDates(&cert_na, &d) < 0) { *status = true; return 0; } } return 0; } DLLEXPORT int CALLCONVENTION tqsl_isCertificateRenewable(tQSL_Cert cert, int *status) { static int window = 180; // Allow renewal out to 180 days tqslTrace("tqsl_isCertificateRenewable", NULL); if (tqsl_init()) return 1; if (cert == NULL) { window = *status; return 0; } if (cert == NULL || status == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_isCertificateRenewable", "arg error cert=0x%lx status=0x%lx", cert, status); tQSL_Error = TQSL_ARGUMENT_ERROR; if (status) *status = false; return 1; } // If there's a newer one, can't renew this int superceded; if (tqsl_isCertificateSuperceded(cert, &superceded) == 0 && superceded) { *status = false; return 0; } // Is it expired? If not, OK to renew. int expired; if (tqsl_isCertificateExpired(cert, &expired) == 0 && !expired) { *status = true; return 0; } // Also for keyonly int keyonly; if (tqsl_getCertificateKeyOnly(cert, &keyonly) == 0 && keyonly) { *status = false; return 0; } long serial = 0; tqsl_getCertificateSerial(cert, &serial); int sts = tqsl_getCertificateStatus(serial); if (sts == TQSL_CERT_STATUS_INV) { *status = true; return 0; } *status = false; /* Check for expired */ struct tm *tm; #ifdef _WIN32 __time32_t t = _time32(0); tm = _gmtime32(&t); #else time_t t = time(0); struct tm tmr; tm = &tmr; tm = gmtime_r(&t, tm); #endif tQSL_Date d; d.year = tm->tm_year + 1900; d.month = tm->tm_mon + 1; d.day = tm->tm_mday; const ASN1_TIME *ctm; if ((ctm = X509_get_notAfter(TQSL_API_TO_CERT(cert)->cert)) == NULL) { *status = true; return 0; } else { tQSL_Date cert_na; tqsl_get_asn1_date(ctm, &cert_na); int diff = 0; if (!tqsl_subtractDates(&cert_na, &d, &diff)) { if (diff < window) { *status = true; } else { *status = false; } return 0; } } return 0; } static TQSL_X509_STACK *xcerts = NULL; DLLEXPORT int CALLCONVENTION tqsl_isCertificateSuperceded(tQSL_Cert cert, int *status) { char path[TQSL_MAX_PATH_LEN]; int i; X509 *x = NULL; char *cp; vector< map > keylist; vector< map >::iterator it; set superceded_certs; int len; bool superceded = false; char buf[256]; tqslTrace("tqsl_isCertificateSuperceded", NULL); if (tqsl_init()) return 1; if (cert == NULL || status == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_isCertificateSuperceded", "arg error cert=0x%lx, status=0x%lx", cert, status); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *status = false; int keyonly; if (tqsl_getCertificateKeyOnly(cert, &keyonly) == 0 && keyonly) { return 0; } long serial = 0; tqsl_getCertificateSerial(cert, &serial); if (tqsl_getCertificateStatus(serial) == TQSL_CERT_STATUS_SUP) { *status = true; tqslTrace("tqsl_isCertificateSuperceded", "returning true"); return 0; } /* Get the certs from the cert store */ tqsl_make_cert_path("user", path, sizeof path); if (xcerts == NULL) xcerts = tqsl_ssl_load_certs_from_file(path); if (xcerts == NULL) { if (tQSL_Error == TQSL_OPENSSL_ERROR) { tqslTrace("tqsl_isCertificateSuperceded", "openssl error loading certs %d", tQSL_Error); return 1; } } /* Make a list of superceded certs */ for (i = 0; i < sk_X509_num(xcerts); i++) { x = sk_X509_value(xcerts, i); len = sizeof buf-1; if (!tqsl_get_cert_ext(x, "supercededCertificate", (unsigned char *)buf, &len, NULL)) { buf[len] = 0; string sup = buf; superceded_certs.insert(sup); /* Fix - the extension as inserted by ARRL * reads ".../Email=lotw@arrl.org", not * the expected ".../emailAddress=". * save both forms in case this gets * changed at the LoTW site */ size_t pos = sup.find("/Email"); if (pos != string::npos) { sup.replace(pos, 6, "/emailAddress"); superceded_certs.insert(sup); } } } // "supercededCertificate" extension is ; cp = X509_NAME_oneline(X509_get_issuer_name(TQSL_API_TO_CERT(cert)->cert), buf, sizeof(buf)); if (cp == NULL) { superceded = false; tqslTrace("tqsl_isCertificateSuperceded", "returning false"); } else { string sup = buf; sup += ";"; long serial = 0; tqsl_getCertificateSerial(cert, &serial); snprintf(buf, sizeof buf, "%ld", serial); sup += buf; if (superceded_certs.find(sup) != superceded_certs.end()) { tqslTrace("tqsl_isCertificateSuperceded", "returning true"); superceded = true; } } *status = superceded; return 0; } DLLEXPORT int CALLCONVENTION tqsl_selectCertificates(tQSL_Cert **certlist, int *ncerts, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flags) { int withkeys = flags & TQSL_SELECT_CERT_WITHKEYS; TQSL_X509_STACK *selcerts = NULL; char path[TQSL_MAX_PATH_LEN]; int i; X509 *x; int rval = 1; tqsl_cert *cp; TQSL_CERT_REQ *crq; BIO *bio = NULL; EVP_PKEY *pubkey = NULL; EVP_PKEY *curkey = NULL; vector< map > keylist; vector< map >::iterator it; bool keyerror = false; int savedError; int savedErrno; tqslTrace("tqsl_selectCertificates", "callsign=%s, dxcc=%d, flags=%d", callsign ? callsign : "NULL", dxcc, flags); if (tqsl_init()) return 1; if (ncerts == NULL) { tqslTrace("tqsl_selectCertificates", "arg error ncerts=0x%lx", ncerts); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *ncerts = 0; if (certlist) *certlist = NULL; /* Convert the dates to tQSL_Date objects */ if (date && !tqsl_isDateNull(date) && !tqsl_isDateValid(date)) { tqslTrace("tqsl_selectCertificates", "arg error - bad date"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } /* Get the certs from the cert store */ tqsl_make_cert_path("user", path, sizeof path); if (xcerts == NULL) xcerts = tqsl_ssl_load_certs_from_file(path); if (xcerts == NULL) { if (tQSL_Error == TQSL_OPENSSL_ERROR) { tqslTrace("tqsl_selectCertificates", "openssl error"); return 1; } else if (tQSL_Error != TQSL_SYSTEM_ERROR || tQSL_Errno != ENOENT) { // No file tqslTrace("tqsl_selectCertificates", "other error %d", tQSL_Error); return 1; } } else { selcerts = tqsl_filter_cert_list(xcerts, callsign, dxcc, date, issuer, flags); } // Get a list of keys and find any unmatched (no cert) ones if (withkeys) { if (tqsl_make_key_list(keylist)) { keyerror = true; // Remember that an error occurred savedError = tQSL_Error; // but allow the rest of the certs to load savedErrno = tQSL_Errno; tqslTrace("tqsl_selectCertificates", "make_key_list error %d %d", tQSL_Error, tQSL_Errno); } if (xcerts != NULL) { for (i = 0; i < sk_X509_num(xcerts); i++) { x = sk_X509_value(xcerts, i); if ((pubkey = X509_get_pubkey(x)) == NULL) { tqslTrace("tqsl_selectCertificates", "can't get pubkey"); goto err; } for (it = keylist.begin(); it != keylist.end(); it++) { int match = 0; /* Compare the keys */ string& keystr = (*it)["PUBLIC_KEY"]; if ((bio = BIO_new_mem_buf(static_cast(const_cast(keystr.c_str())), keystr.length())) == NULL) { tqslTrace("tqsl_selectCertifcates", "bio_new error %s", tqsl_openssl_error()); goto err; } if ((curkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { tqslTrace("tqsl_selectCertificates", "pem_read_bio err %s", tqsl_openssl_error()); goto err; } BIO_free(bio); bio = NULL; if (EVP_PKEY_cmp(curkey, pubkey) == 1) match = 1; EVP_PKEY_free(curkey); curkey = NULL; if (match) { // Remove matched key from list keylist.erase(it); break; } } EVP_PKEY_free(pubkey); pubkey = NULL; } } // Filter keylist for (it = keylist.begin(); it != keylist.end(); ) { if ((*it)["TQSL_CRQ_PROVIDER"] == "") it = keylist.erase(it); else if (callsign && (*it)["CALLSIGN"] != callsign) it = keylist.erase(it); else if (dxcc && strtol((*it)["TQSL_CRQ_DXCC_ENTITY"].c_str(), NULL, 10) != dxcc) it = keylist.erase(it); else if (issuer && (*it)["TQSL_CRQ_PROVIDER"] != issuer->organizationName) it = keylist.erase(it); else if (issuer && (*it)["TQSL_CRQ_PROVIDER_UNIT"] != issuer->organizationalUnitName) it = keylist.erase(it); else it++; } } //cerr << keylist.size() << " unmatched keys" << endl; *ncerts = (selcerts ? sk_X509_num(selcerts) : 0) + keylist.size(); tqslTrace("tqsl_selectCertificates", "ncerts=%d", *ncerts); if (certlist == NULL) { // Only want certificate count rval = 0; goto end; } *certlist = reinterpret_cast(tqsl_calloc(*ncerts, sizeof(tQSL_Cert))); if (selcerts != NULL) { for (i = 0; i < sk_X509_num(selcerts); i++) { x = sk_X509_value(selcerts, i); if ((cp = tqsl_cert_new()) == NULL) { tqslTrace("tqsl_selectCertificates", "error making new cert - %s", tqsl_openssl_error()); goto end; } cp->cert = X509_dup(x); (*certlist)[i] = TQSL_OBJ_TO_API(cp); } } else { i = 0; } for (it = keylist.begin(); it != keylist.end(); it++) { if ((cp = tqsl_cert_new()) == NULL) { tqslTrace("tqsl_selectCertificates", "error making new cert - %s", tqsl_openssl_error()); goto end; } crq = reinterpret_cast(tqsl_calloc(1, sizeof(TQSL_CERT_REQ))); if (crq != NULL) { tQSL_Error = TQSL_BUFFER_ERROR; if (!safe_strncpy(crq->providerName, (*it)["TQSL_CRQ_PROVIDER"].c_str(), sizeof crq->providerName)) goto end; if (!safe_strncpy(crq->providerUnit, (*it)["TQSL_CRQ_PROVIDER_UNIT"].c_str(), sizeof crq->providerUnit)) goto end; if (!safe_strncpy(crq->callSign, (*it)["CALLSIGN"].c_str(), sizeof crq->callSign)) goto end; if (!safe_strncpy(crq->name, (*it)["TQSL_CRQ_NAME"].c_str(), sizeof crq->name)) goto end; if (!safe_strncpy(crq->emailAddress, (*it)["TQSL_CRQ_EMAIL"].c_str(), sizeof crq->emailAddress)) goto end; if (!safe_strncpy(crq->address1, (*it)["TQSL_CRQ_ADDRESS1"].c_str(), sizeof crq->address1)) goto end; if (!safe_strncpy(crq->address2, (*it)["TQSL_CRQ_ADDRESS2"].c_str(), sizeof crq->address2)) goto end; if (!safe_strncpy(crq->city, (*it)["TQSL_CRQ_CITY"].c_str(), sizeof crq->city)) goto end; if (!safe_strncpy(crq->state, (*it)["TQSL_CRQ_STATE"].c_str(), sizeof crq->state)) goto end; if (!safe_strncpy(crq->postalCode, (*it)["TQSL_CRQ_POSTAL"].c_str(), sizeof crq->postalCode)) goto end; if (!safe_strncpy(crq->country, (*it)["TQSL_CRQ_COUNTRY"].c_str(), sizeof crq->country)) goto end; crq->dxccEntity = strtol((*it)["TQSL_CRQ_DXCC_ENTITY"].c_str(), NULL, 10); tqsl_initDate(&(crq->qsoNotBefore), (*it)["TQSL_CRQ_QSO_NOT_BEFORE"].c_str()); tqsl_initDate(&(crq->qsoNotAfter), (*it)["TQSL_CRQ_QSO_NOT_AFTER"].c_str()); tQSL_Error = 0; } cp->crq = crq; int len = strlen((*it)["PUBLIC_KEY"].c_str()); if (len) { cp->pubkey = new char[len+1]; strncpy(cp->pubkey, (*it)["PUBLIC_KEY"].c_str(), len+1); } len = strlen((*it)["PRIVATE_KEY"].c_str()); if (len) { cp->privkey = new char[len+1]; strncpy(cp->privkey, (*it)["PRIVATE_KEY"].c_str(), len+1); } cp->keyonly = 1; (*certlist)[i++] = TQSL_OBJ_TO_API(cp); } if (keyerror) { // If an error happened with private key scan tQSL_Error = savedError; // Restore the error status from that tQSL_Errno = savedErrno; rval = 1; } else { rval = 0; } goto end; err: tQSL_Error = TQSL_OPENSSL_ERROR; end: if (selcerts != NULL) sk_X509_free(selcerts); if (bio != NULL) BIO_free(bio); if (pubkey != NULL) EVP_PKEY_free(pubkey); if (curkey != NULL) EVP_PKEY_free(curkey); return rval; } DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates(tQSL_Cert **certlist, int *ncerts, const char *type) { TQSL_X509_STACK *cacerts = NULL; int rval = 1; char path[TQSL_MAX_PATH_LEN]; int i; X509 *x; tqsl_cert *cp; vector< map > keylist; vector< map >::iterator it; tqslTrace("tqsl_selectCACertificates", NULL); if (tqsl_init()) return 1; if (certlist == NULL || ncerts == NULL) { tqslTrace("tqsl_selectCACertificates", "arg error certlist=0x%lx, ncerts=0x%lx", certlist, ncerts); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } /* Get the certs from the cert store */ tqsl_make_cert_path(type, path, sizeof path); cacerts = tqsl_ssl_load_certs_from_file(path); if (cacerts == NULL) { if (tQSL_Error == TQSL_OPENSSL_ERROR) { tqslTrace("tqsl_selectCACertificates", "cacerts openssl error"); return 1; } } *ncerts = (cacerts ? sk_X509_num(cacerts) : 0) + keylist.size(); *certlist = reinterpret_cast(tqsl_calloc(*ncerts, sizeof(tQSL_Cert))); if (cacerts != NULL) { for (i = 0; i < sk_X509_num(cacerts); i++) { x = sk_X509_value(cacerts, i); if ((cp = tqsl_cert_new()) == NULL) { tqslTrace("tqsl_selectCACertificates", "cert_new error %s", tqsl_openssl_error()); goto end; } cp->cert = X509_dup(x); (*certlist)[i] = TQSL_OBJ_TO_API(cp); } } rval = 0; end: if (cacerts != NULL) sk_X509_free(cacerts); return rval; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateKeyOnly(tQSL_Cert cert, int *keyonly) { tqslTrace("tqsl_getCertificateKeyOnly", "cert=0x%lx, keyonly=0x%lx", cert, keyonly); if (tqsl_init()) return 1; if (cert == NULL || keyonly == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateKeyOnly", "arg error"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *keyonly = TQSL_API_TO_CERT(cert)->keyonly; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateEncoded(tQSL_Cert cert, char *buf, int bufsiz) { BIO *bio = NULL; int len; char *cp; int rval = 1; tqslTrace("tqsl_getCertificateEncoded", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateEncoded", "arg error cert=0x%lx, buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_getCertificateEncoded", "bio_new err %s", tqsl_openssl_error()); goto err; } if (!PEM_write_bio_X509(bio, TQSL_API_TO_CERT(cert)->cert)) { tqslTrace("tqsl_getCertificateEncoded", "pem_write_bio err %s", tqsl_openssl_error()); goto err; } len = static_cast(BIO_get_mem_data(bio, &cp)); if (len < bufsiz) { memcpy(buf, cp, len); buf[len] = 0; } else { tqslTrace("tqsl_getCertificateEncoded", "buffer error %d needed %d there", len, bufsiz); tQSL_Error = TQSL_BUFFER_ERROR; goto end; } rval = 0; goto end; err: tQSL_Error = TQSL_OPENSSL_ERROR; end: if (bio != NULL) BIO_free(bio); return rval; } DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded(tQSL_Cert cert, char *buf, int bufsiz) { BIO *b64 = NULL; BIO *bio = NULL; BIO *out = NULL; char callsign[40]; long len; char *cp; vector< map > keylist; vector< map >::iterator it; EVP_PKEY *pubkey = NULL; EVP_PKEY *curkey = NULL; tqslTrace("tqsl_getKeyEncoded", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getKeyEncoded", "arg error cert=0x%lx, buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tQSL_Error = TQSL_OPENSSL_ERROR; // If it's 'keyonly', then there's no public key - use the one in the cert. if (TQSL_API_TO_CERT(cert)->keyonly) { if (TQSL_API_TO_CERT(cert)->privkey == 0) { tqslTrace("tqsl_getKeyEncoded", "arg error no private key"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } strncpy(callsign, TQSL_API_TO_CERT(cert)->crq->callSign, sizeof callsign); b64 = BIO_new(BIO_f_base64()); out = BIO_new(BIO_s_mem()); out = BIO_push(b64, out); tQSL_Error = TQSL_SYSTEM_ERROR; if (tqsl_bio_write_adif_field(out, "CALLSIGN", 0, (const unsigned char *)callsign, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "PRIVATE_KEY", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->privkey, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "PUBLIC_KEY", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->pubkey, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } char numbuf[10]; snprintf(numbuf, sizeof numbuf, "%d", TQSL_API_TO_CERT(cert)->crq->dxccEntity); if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_DXCC_ENTITY", 0, (const unsigned char *)numbuf, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_PROVIDER", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->providerName, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_PROVIDER_UNIT", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->providerUnit, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_EMAIL", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->emailAddress, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_ADDRESS1", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->address1, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_ADDRESS2", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->address2, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_CITY", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->city, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_STATE", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->state, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_POSTAL", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->postalCode, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_COUNTRY", 0, (const unsigned char *)TQSL_API_TO_CERT(cert)->crq->country, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); return 1; } char datebuf[20]; tqsl_convertDateToText(&(TQSL_API_TO_CERT(cert)->crq->qsoNotAfter), datebuf, sizeof datebuf); if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_QSO_NOT_AFTER", 0, (const unsigned char *)datebuf, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } tqsl_convertDateToText(&(TQSL_API_TO_CERT(cert)->crq->qsoNotBefore), datebuf, sizeof datebuf); if (tqsl_bio_write_adif_field(out, "TQSL_CRQ_QSO_NOT_BEFORE", 0, (const unsigned char *)datebuf, -1)) { tqslTrace("tqsl_getKeyEncoded", "write_adif_field error %d", tQSL_Error); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } tqsl_bio_write_adif_field(out, "eor", 0, NULL, 0); if (BIO_flush(out) != 1) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "Error encoding certificate", sizeof tQSL_CustomError); BIO_free_all(out); tqslTrace("tqsl_getKeyEncoded", "BIO_flush error %s", tqsl_openssl_error()); return 1; } len = BIO_get_mem_data(out, &cp); if (len > bufsiz) { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Private key buffer size %d is too small - %ld needed", bufsiz, len); BIO_free_all(out); tqslTrace("tqsl_getKeyEncoded", "buffer size err: %s", tQSL_CustomError); return 1; } memcpy(buf, cp, len); buf[len] = '\0'; BIO_free_all(out); return 0; } if (tqsl_getCertificateCallSign(cert, callsign, sizeof callsign)) { tqslTrace("tqsl_getKeyEncoded", "Error getting callsign %d", tQSL_Error); return 1; } if (tqsl_make_key_list(keylist)) { tqslTrace("tqsl_getKeyEncoded", "Error making keylist %d", tQSL_Error); tQSL_Error = TQSL_SYSTEM_ERROR; return 1; } if ((pubkey = X509_get_pubkey(TQSL_API_TO_CERT(cert)->cert)) == 0) { tqslTrace("tqsl_getKeyEncoded", "Error getting pubkey %d", tQSL_Error); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } // Find the matching private key for (it = keylist.begin(); it != keylist.end(); it++) { string& keystr = (*it)["PUBLIC_KEY"]; if ((bio = BIO_new_mem_buf(static_cast(const_cast(keystr.c_str())), keystr.length())) == NULL) { tqslTrace("tqsl_getKeyEncoded", "Error getting buffer %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } if ((curkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { BIO_free(bio); tqslTrace("tqsl_getKeyEncoded", "Error reading PUBKEY %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } BIO_free(bio); bio = NULL; if (EVP_PKEY_cmp(curkey, pubkey) == 1) { // This is the matching private key. Let's feed it back. EVP_PKEY_free(curkey); curkey = NULL; EVP_PKEY_free(pubkey); pubkey = NULL; b64 = BIO_new(BIO_f_base64()); out = BIO_new(BIO_s_mem()); out = BIO_push(b64, out); map::iterator mit; for (mit = it->begin(); mit != it->end(); mit++) { if (tqsl_bio_write_adif_field(out, mit->first.c_str(), 0, (const unsigned char *)mit->second.c_str(), -1)) { tQSL_Error = TQSL_SYSTEM_ERROR; tqslTrace("tqsl_getKeyEncoded", "Error writing field %s", tqsl_openssl_error()); return 1; } } tqsl_bio_write_adif_field(out, "eor", 0, NULL, 0); if (BIO_flush(out) != 1) { tQSL_Error = TQSL_CUSTOM_ERROR; tqslTrace("tqsl_getKeyEncoded", "Error flushing write %s", tqsl_openssl_error()); strncpy(tQSL_CustomError, "Error encoding certificate", sizeof tQSL_CustomError); BIO_free_all(out); return 1; } len = BIO_get_mem_data(out, &cp); if (len > bufsiz) { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Private key buffer size %d is too small - %ld needed", bufsiz, len); tqslTrace("tqsl_getKeyEncoded", "Buffer err %s", tQSL_CustomError); BIO_free_all(out); return 1; } memcpy(buf, cp, len); buf[len] = '\0'; BIO_free_all(out); return 0; } else { EVP_PKEY_free(curkey); curkey = NULL; } } if (pubkey != NULL) EVP_PKEY_free(pubkey); tqslTrace("tqsl_getKeyEncoded", "private key not found"); tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Private key not found for callsign %s", callsign); return 1; // Private key not found } DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded(const char *callsign, const char *type, const char *keybuf, const char *certbuf) { BIO *in = NULL; BIO *b64 = NULL; BIO *pub = NULL; X509 *cert; char path[TQSL_MAX_PATH_LEN]; char temppath[TQSL_MAX_PATH_LEN]; char biobuf[4096]; int cb = 0; map fields; void* userdata = NULL; tqslTrace("tqsl_importKeyPairEncoded", NULL); if (tqsl_init()) return 1; if (certbuf == NULL || type == NULL) { tqslTrace("tqsl_importKeyPairEncoded", "arg error certbuf=0x%lx, type=0x%lx", certbuf, type); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (strcmp(type, "user") == 0) { if (keybuf == NULL) { tqslTrace("tqsl_importKeyPairEncoded", "arg error user cert keybuf null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } cb = TQSL_CERT_CB_USER; } else if (strcmp(type, "root") == 0) { cb = TQSL_CERT_CB_ROOT; } else if (strcmp(type, "authorities") == 0) { cb = TQSL_CERT_CB_CA; } else { tqslTrace("tqsl_importKeyPairEncoded", "arg error type unknown"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (keybuf) { if (!tqsl_make_key_path(callsign, path, sizeof path)) { goto noprv; } in = BIO_new_mem_buf(static_cast(const_cast(keybuf)), strlen(keybuf)); if (in == NULL) { goto noprv; } b64 = BIO_new(BIO_f_base64()); in = BIO_push(b64, in); size_t bloblen; bloblen = BIO_read(in, biobuf, strlen(keybuf)); biobuf[bloblen] = '\0'; strncpy(temppath, tQSL_BaseDir, sizeof temppath); FILE *temp = NULL; #ifdef _WIN32 strncat(temppath, "\\pk.tmp", sizeof temppath - strlen(temppath) -1); wchar_t* wpath = utf8_to_wchar(temppath); if ((temp = _wfopen(wpath, TQSL_OPEN_WRITE)) == NULL) { free_wchar(wpath); #else strncat(temppath, "/pk.tmp", sizeof temppath - strlen(temppath) -1); if ((temp = fopen(temppath, TQSL_OPEN_WRITE)) == NULL) { #endif strncpy(tQSL_ErrorFile, temppath, sizeof tQSL_ErrorFile); tqslTrace("tqsl_importKeyPairEncoded", "Open file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; return 1; } #ifdef _WIN32 free_wchar(wpath); #endif if (fputs(biobuf, temp) == EOF) { strncpy(tQSL_ErrorFile, temppath, sizeof tQSL_ErrorFile); tqslTrace("tqsl_importKeyPairEncoded", "Write request file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; return 1; } if (fclose(temp) == EOF) { strncpy(tQSL_ErrorFile, temppath, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_importKeyPairEncoded", "write error %d", errno); return 1; } // Now is there a private key already with this serial? char *pubkey = strstr(biobuf, "-----BEGIN PUBLIC KEY-----"); char *endpub = strstr(biobuf, "-----END PUBLIC KEY-----"); int publen = endpub - pubkey + strlen("-----END PUBLIC KEY-----"); if (pubkey) { EVP_PKEY *new_key = NULL; if ((pub = BIO_new_mem_buf(reinterpret_cast(pubkey), publen)) == NULL) { goto noprv; } if ((new_key = PEM_read_bio_PUBKEY(pub, NULL, NULL, NULL)) == NULL) { goto noprv; } BIO_free(pub); pub = 0; if (!tqsl_key_exists(callsign, new_key)) { // Populate fields from the temp file if (!tqsl_open_key_file(temppath)) { if (!tqsl_read_key(fields)) { tqsl_replace_key(callsign, path, fields, NULL, userdata); } tqsl_close_key_file(); } } BIO_free_all(in); } } // Import of private key noprv: if (strlen(certbuf) == 0) // Keyonly 'certificates' return 0; // Now process the certificate in = BIO_new_mem_buf(static_cast(const_cast(certbuf)), strlen(certbuf)); if (in == NULL) { tqslTrace("tqsl_importKeyPairEncoded", "cert new_mem_buf err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } cert = PEM_read_bio_X509(in, NULL, NULL, NULL); BIO_free(in); if (cert == NULL) { tqslTrace("tqsl_importKeyPairEncoded", "read_bio_x509 err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } int ret = tqsl_store_cert(certbuf, cert, type, cb, true, NULL, NULL); // it's OK if installing the cert gets a dupe if (ret != 0 && tQSL_Error == TQSL_CERT_ERROR) { ret = 0; } return ret; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateCallSign(tQSL_Cert cert, char *buf, int bufsiz) { char nbuf[40]; TQSL_X509_NAME_ITEM item; tqslTrace("tqsl_getCertificateCallSign", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateCallSign", "arg err cert=0x%lx buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly && TQSL_API_TO_CERT(cert)->crq) { // Handle the key-only case if (bufsiz <= static_cast(strlen(TQSL_API_TO_CERT(cert)->crq->callSign))) { tqslTrace("tqsl_getCertificateCallSign", "bufsiz=%d, needed=%d", bufsiz, static_cast(strlen(TQSL_API_TO_CERT(cert)->crq->callSign))); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } strncpy(buf, TQSL_API_TO_CERT(cert)->crq->callSign, bufsiz); tqslTrace("tqsl_getCertificateCallSign", "KeyOnly, call=%s", buf); return 0; } item.name_buf = nbuf; item.name_buf_size = sizeof nbuf; item.value_buf = buf; item.value_buf_size = bufsiz; int ret = tqsl_cert_get_subject_name_entry(TQSL_API_TO_CERT(cert)->cert, "AROcallsign", &item); tqslTrace("tqsl_getCertificateCallSign", "Result=%d, call=%s", ret, buf); return !ret; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateAROName(tQSL_Cert cert, char *buf, int bufsiz) { char nbuf[40]; TQSL_X509_NAME_ITEM item; tqslTrace("tqsl_getCertificateAROName", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateAROName", "cert=0x%lx, buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } item.name_buf = nbuf; item.name_buf_size = sizeof nbuf; item.value_buf = buf; item.value_buf_size = bufsiz; return !tqsl_cert_get_subject_name_entry(TQSL_API_TO_CERT(cert)->cert, "commonName", &item); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateEmailAddress(tQSL_Cert cert, char *buf, int bufsiz) { char nbuf[40]; TQSL_X509_NAME_ITEM item; tqslTrace("tqsl_getCertificateEmailAddress", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateEmailAddress", "arg err cert=0x%lx, buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } item.name_buf = nbuf; item.name_buf_size = sizeof nbuf; item.value_buf = buf; item.value_buf_size = bufsiz; return !tqsl_cert_get_subject_name_entry(TQSL_API_TO_CERT(cert)->cert, "emailAddress", &item); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerial(tQSL_Cert cert, long *serial) { tqslTrace("tqsl_getCertificateSerial", NULL); if (tqsl_init()) return 1; if (cert == NULL || serial == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateSerial", "arg err cert=0x%lx, serial=0x%lx", cert, serial); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *serial = ASN1_INTEGER_get(X509_get_serialNumber(TQSL_API_TO_CERT(cert)->cert)); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt(tQSL_Cert cert, char *serial, int serialsiz) { tqslTrace("tqsl_getCertificateSerialExt", NULL); if (tqsl_init()) return 1; if (cert == NULL || serial == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert)) || serialsiz < 1) { tqslTrace("tqsl_getCertificateSerialExt", "arg err cert=0x%lx, serial=0x%lx", cert, serial); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } BIGNUM *bn = BN_new(); ASN1_INTEGER_to_BN(X509_get_serialNumber(TQSL_API_TO_CERT(cert)->cert), bn); char *s = BN_bn2hex(bn); strncpy(serial, s, serialsiz); serial[serialsiz-1] = 0; OPENSSL_free(s); BN_free(bn); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialLength(tQSL_Cert cert) { int rval; tqslTrace("tqsl_getCertificateSerialLength", NULL); if (tqsl_init()) return 1; if (cert == NULL) { tqslTrace("tqsl_getCertificateSerialLength", "arg error,cert=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } BIGNUM *bn = BN_new(); ASN1_INTEGER_to_BN(X509_get_serialNumber(TQSL_API_TO_CERT(cert)->cert), bn); char *s = BN_bn2hex(bn); rval = strlen(s); OPENSSL_free(s); BN_free(bn); return rval; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuer(tQSL_Cert cert, char *buf, int bufsiz) { char *cp; tqslTrace("tqsl_getCertificateIssuer", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateIssuer", "arg err cert=0x%lx, buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } cp = X509_NAME_oneline(X509_get_issuer_name(TQSL_API_TO_CERT(cert)->cert), buf, bufsiz); if (cp == NULL) { tqslTrace("tqsl_getCertificateIssuer", "X509_NAME_oneline error %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; } return (cp == NULL); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganization(tQSL_Cert cert, char *buf, int bufsiz) { char nbuf[40]; TQSL_X509_NAME_ITEM item; X509_NAME *iss; tqslTrace("tqsl_getCertificateIssuerOrganization", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateIssuerOrganization", "arg error cert=0x%lx buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly && TQSL_API_TO_CERT(cert)->crq) { // Handle the key-only case if (bufsiz <= static_cast(strlen(TQSL_API_TO_CERT(cert)->crq->providerName))) { tqslTrace("tqsl_getCertificateIssuerOrganization", "bufsiz error have=%d need=%d", bufsiz, static_cast(strlen(TQSL_API_TO_CERT(cert)->crq->providerName))); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } strncpy(buf, TQSL_API_TO_CERT(cert)->crq->providerName, bufsiz); return 0; } item.name_buf = nbuf; item.name_buf_size = sizeof nbuf; item.value_buf = buf; item.value_buf_size = bufsiz; if ((iss = X509_get_issuer_name(TQSL_API_TO_CERT(cert)->cert)) == NULL) { tqslTrace("tqsl_getCertificateIssuerOrganization", "get_issuer_name err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } return !tqsl_get_name_entry(iss, "organizationName", &item); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganizationalUnit(tQSL_Cert cert, char *buf, int bufsiz) { char nbuf[40]; TQSL_X509_NAME_ITEM item; X509_NAME *iss; tqslTrace("tqsl_getCertificateIssuerOrganizationalUnit", NULL); if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateIssuerOrganizationalUnit", "arg err cert=0x%lx, buf=0x%lx", cert, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly && TQSL_API_TO_CERT(cert)->crq) { // Handle the key-only case if (bufsiz <= static_cast(strlen(TQSL_API_TO_CERT(cert)->crq->providerUnit))) { tqslTrace("tqsl_getCertificateIssuerOrganizationalUnit", "bufsize error have=%d need=%d", bufsiz, static_cast(strlen(TQSL_API_TO_CERT(cert)->crq->providerUnit))); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } strncpy(buf, TQSL_API_TO_CERT(cert)->crq->providerUnit, bufsiz); return 0; } item.name_buf = nbuf; item.name_buf_size = sizeof nbuf; item.value_buf = buf; item.value_buf_size = bufsiz; if ((iss = X509_get_issuer_name(TQSL_API_TO_CERT(cert)->cert)) == NULL) { tqslTrace("tqsl_getCertificateIssuerOrganizationalUnit", "get_issuer_name err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } return !tqsl_get_name_entry(iss, "organizationalUnitName", &item); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotBeforeDate(tQSL_Cert cert, tQSL_Date *date) { char datebuf[40]; int len = (sizeof datebuf) -1; tqslTrace("tqsl_getCertificateQSONotBeforeDate", NULL); if (tqsl_init()) return 1; if (cert == NULL || date == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateQSONotBeforeDate", "arg err cert=0x%lx date=0x%lx", cert, date); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly && TQSL_API_TO_CERT(cert)->crq) { // Handle the key-only case *date = TQSL_API_TO_CERT(cert)->crq->qsoNotBefore; return 0; } if (tqsl_get_cert_ext(TQSL_API_TO_CERT(cert)->cert, "QSONotBeforeDate", (unsigned char *)datebuf, &len, NULL)) return 1; datebuf[len] = 0; return tqsl_initDate(date, const_cast(datebuf)); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotAfterDate(tQSL_Cert cert, tQSL_Date *date) { char datebuf[40]; int len = (sizeof datebuf) -1; tqslTrace("tqsl_getCertificateQSONotAfterDate", NULL); if (tqsl_init()) return 1; if (cert == NULL || date == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateQSONotAfterDate", "arg err cert=0x%lx date=0x%lx", cert, date); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly && TQSL_API_TO_CERT(cert)->crq) { // Handle the key-only case *date = TQSL_API_TO_CERT(cert)->crq->qsoNotAfter; return 0; } if (tqsl_get_cert_ext(TQSL_API_TO_CERT(cert)->cert, "QSONotAfterDate", (unsigned char *)datebuf, &len, NULL)) return 1; datebuf[len] = 0; return tqsl_initDate(date, const_cast(datebuf)); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotBeforeDate(tQSL_Cert cert, tQSL_Date *date) { const ASN1_TIME *tm; tqslTrace("tqsl_getCertificateNotBeforeDate", NULL); if (tqsl_init()) return 1; if (cert == NULL || date == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateNotBeforeDate", "arg err cert=0x%lx date=0x%lx", cert, date); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly) { tqslTrace("tqsl_getCertificateNotBeforeDate", "Err:cert is keyonly"); tQSL_Error = TQSL_CERT_KEY_ONLY; return 1; } if ((tm = X509_get_notBefore(TQSL_API_TO_CERT(cert)->cert)) == NULL) { tqslTrace("tqsl_getCertificateNotBeforeDate", "get_notBefore err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } return tqsl_get_asn1_date(tm, date); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotAfterDate(tQSL_Cert cert, tQSL_Date *date) { const ASN1_TIME *tm; if (tqsl_init()) return 1; if (cert == NULL || date == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getCertificateNotAfterDate", "arg err cert=0x%lx date=0x%lx", cert, date); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly) { tqslTrace("tqsl_getCertificateNotAfterDate", "Err:cert is keyonly"); tQSL_Error = TQSL_CERT_KEY_ONLY; return 1; } if ((tm = X509_get_notAfter(TQSL_API_TO_CERT(cert)->cert)) == NULL) { tqslTrace("tqsl_getCertificateNotAfterDate", "get_notAfter err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } return tqsl_get_asn1_date(tm, date); } DLLEXPORT int CALLCONVENTION tqsl_getCertificateDXCCEntity(tQSL_Cert cert, int *dxcc) { char buf[40]; int len = sizeof buf; tqslTrace("tqsl_getCertificateDXCCEntity", NULL); if (tqsl_init()) return 1; if (cert == NULL || dxcc == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificateDXCCEntity", "arg err cert=0x%lx dxcc=0x%lx", cert, dxcc); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->keyonly && TQSL_API_TO_CERT(cert)->crq) { // Handle the key-only case *dxcc = TQSL_API_TO_CERT(cert)->crq->dxccEntity; return 0; } if (tqsl_get_cert_ext(TQSL_API_TO_CERT(cert)->cert, "dxccEntity", (unsigned char *)buf, &len, NULL)) { tqslTrace("tqsl_getCertificateDXCCEntity", "Cert does not have dxcc extension"); return 1; } *dxcc = strtol(buf, NULL, 10); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificatePrivateKeyType(tQSL_Cert cert) { tqslTrace("tqsl_getCertificatePrivateKeyType", NULL); if (tqsl_init()) return 1; if (!tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_getCertificatePrivateKeyType", "arg err, bad cert"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (tqsl_beginSigning(cert, const_cast (""), 0, 0)) { // Try to unlock the key using no password if (tQSL_Error == TQSL_PASSWORD_ERROR) { tqsl_getErrorString(); // Clear the error tqslTrace("tqsl_getCertificatePrivateKeyType", "password error - encrypted"); return TQSL_PK_TYPE_ENC; } tqslTrace("tqsl_getCertificatePrivateKeyType", "other error"); return TQSL_PK_TYPE_ERR; } tqslTrace("tqsl_getCertificatePrivateKeyType", "unencrypted"); return TQSL_PK_TYPE_UNENC; } DLLEXPORT void CALLCONVENTION tqsl_freeCertificate(tQSL_Cert cert) { if (cert == NULL) return; tqsl_cert_free(TQSL_API_TO_CERT(cert)); } DLLEXPORT void CALLCONVENTION tqsl_freeCertificateList(tQSL_Cert* list, int ncerts) { for (int i = 0; i < ncerts; i++) if (list[i]) tqsl_cert_free(TQSL_API_TO_CERT(list[i])); if (list) free(list); } DLLEXPORT int CALLCONVENTION tqsl_beginSigning(tQSL_Cert cert, char *password, int(*pwcb)(char *, int, void *), void *userdata) { tqslTrace("tqsl_beginSigning", NULL); if (tqsl_init()) return 1; if (cert == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_beginSigning", "arg err cert=0x%lx", cert); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->key != NULL) return 0; if (TQSL_API_TO_CERT(cert)->keyonly) { if (TQSL_API_TO_CERT(cert)->privkey == 0) { tqslTrace("tqsl_beginSigning", "can't sign, keyonly"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } return tqsl_unlock_key(TQSL_API_TO_CERT(cert)->privkey, &(TQSL_API_TO_CERT(cert)->key), password, pwcb, userdata); } return tqsl_find_matching_key(TQSL_API_TO_CERT(cert)->cert, &(TQSL_API_TO_CERT(cert)->key), &(TQSL_API_TO_CERT(cert)->crq), password, pwcb, userdata); } DLLEXPORT int CALLCONVENTION tqsl_getMaxSignatureSize(tQSL_Cert cert, int *sigsize) { tqslTrace("tqsl_getMaxSignatureSize", NULL); if (tqsl_init()) return 1; if (cert == NULL || sigsize == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_getMaxSignatureSize", "arg err cert=0x%lx, sigsize=0x%lx", cert, sigsize); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->key == NULL) { tqslTrace("tqsl_getMaxSignatureSize", "arg err key=null"); tQSL_Error = TQSL_SIGNINIT_ERROR; return 1; } *sigsize = EVP_PKEY_size(TQSL_API_TO_CERT(cert)->key); return 0; } DLLEXPORT int CALLCONVENTION tqsl_checkSigningStatus(tQSL_Cert cert) { tqslTrace("tqsl_checkSigningStatus", NULL); if (tqsl_init()) return 1; if (cert == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_checkSigningStatus", "arg err cert=0x%lx", cert); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->key == NULL) { tqslTrace("tqsl_checkSigningStatus", "arg err no key"); tQSL_Error = TQSL_SIGNINIT_ERROR; return 1; } return 0; } DLLEXPORT int CALLCONVENTION tqsl_signDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int *siglen) { tqslTrace("tqsl_signDataBlock", NULL); if (tqsl_init()) return 1; if (cert == NULL || data == NULL || sig == NULL || siglen == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_signDataBlock", "arg error cert=0x%lx data=0x%lx sig=0x%lx siglen=0x%lx", cert, data, sig, siglen); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } EVP_MD_CTX *ctx = EVP_MD_CTX_create(); if (ctx == NULL) return 1; unsigned int slen = *siglen; if (TQSL_API_TO_CERT(cert)->key == NULL) { tqslTrace("tqsl_signDataBlock", "can't sign, no key"); tQSL_Error = TQSL_SIGNINIT_ERROR; if (ctx) EVP_MD_CTX_destroy(ctx); return 1; } EVP_SignInit(ctx, EVP_sha1()); EVP_SignUpdate(ctx, data, datalen); if (!EVP_SignFinal(ctx, sig, &slen, TQSL_API_TO_CERT(cert)->key)) { tqslTrace("tqsl_signDataBlock", "signing failed %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; if (ctx) EVP_MD_CTX_destroy(ctx); return 1; } *siglen = slen; if (ctx) EVP_MD_CTX_destroy(ctx); return 0; } DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int siglen) { EVP_MD_CTX *ctx = EVP_MD_CTX_create(); unsigned int slen = siglen; tqslTrace("tqsl_verifyDataBlock", NULL); if (ctx == NULL) return 1; if (tqsl_init()) return 1; if (cert == NULL || data == NULL || sig == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_verifyDataBlock", "arg error cert=0x%lx data=0x%lx sig=0x%lx", cert, data, sig); tQSL_Error = TQSL_ARGUMENT_ERROR; if (ctx) EVP_MD_CTX_destroy(ctx); return 1; } if (TQSL_API_TO_CERT(cert)->key == NULL) { tqslTrace("tqsl_verifyDataBlock", "no key"); tQSL_Error = TQSL_SIGNINIT_ERROR; if (ctx) EVP_MD_CTX_destroy(ctx); return 1; } EVP_VerifyInit(ctx, EVP_sha1()); EVP_VerifyUpdate(ctx, data, datalen); if (EVP_VerifyFinal(ctx, sig, slen, TQSL_API_TO_CERT(cert)->key) <= 0) { tqslTrace("tqsl_verifyDataBlock", "verify fail %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; if (ctx) EVP_MD_CTX_destroy(ctx); return 1; } if (ctx) EVP_MD_CTX_destroy(ctx); return 0; } DLLEXPORT int CALLCONVENTION tqsl_endSigning(tQSL_Cert cert) { tqslTrace("tqsl_endSigning", NULL); if (tqsl_init()) return 1; if (cert == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_endSigning", "arg err cert=0x%lx", cert); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->key != NULL) { EVP_PKEY_free(TQSL_API_TO_CERT(cert)->key); TQSL_API_TO_CERT(cert)->key = NULL; } return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress1(tQSL_Cert cert, char *buf, int bufsiz) { tqslTrace("tqsl_getCertificateRequestAddress1", NULL); if (tqsl_check_crq_field(cert, buf, bufsiz)) { tqslTrace("tqsl_getCertificateRequestAddress1", "check fail"); return 1; } strncpy(buf, (TQSL_API_TO_CERT(cert)->crq)->address1, bufsiz); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress2(tQSL_Cert cert, char *buf, int bufsiz) { tqslTrace("tqsl_getCertificateRequestAddress2", NULL); if (tqsl_check_crq_field(cert, buf, bufsiz)) { tqslTrace("tqsl_getCertificateRequestAddress2", "check fail"); return 1; } strncpy(buf, (TQSL_API_TO_CERT(cert)->crq)->address2, bufsiz); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCity(tQSL_Cert cert, char *buf, int bufsiz) { tqslTrace("tqsl_getCertificateRequestCity", NULL); if (tqsl_check_crq_field(cert, buf, bufsiz)) { tqslTrace("tqsl_getCertificateRequestCity", "check fail"); return 1; } strncpy(buf, (TQSL_API_TO_CERT(cert)->crq)->city, bufsiz); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestState(tQSL_Cert cert, char *buf, int bufsiz) { tqslTrace("tqsl_getCertificateRequestState", NULL); if (tqsl_check_crq_field(cert, buf, bufsiz)) { tqslTrace("tqsl_getCertificateRequestState", "check fail"); return 1; } strncpy(buf, (TQSL_API_TO_CERT(cert)->crq)->state, bufsiz); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestPostalCode(tQSL_Cert cert, char *buf, int bufsiz) { tqslTrace("tqsl_getCertificateRequestPostalCode", NULL); if (tqsl_check_crq_field(cert, buf, bufsiz)) { tqslTrace("tqsl_getCertificateRequestPostalCode", "check fail"); return 1; } strncpy(buf, (TQSL_API_TO_CERT(cert)->crq)->postalCode, bufsiz); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCountry(tQSL_Cert cert, char *buf, int bufsiz) { tqslTrace("tqsl_getCertificateRequestCountry", NULL); if (tqsl_check_crq_field(cert, buf, bufsiz)) { tqslTrace("tqsl_getCertificateRequestCountry", "check fail"); return 1; } strncpy(buf, (TQSL_API_TO_CERT(cert)->crq)->country, bufsiz); return 0; } static int tqsl_add_bag_attribute(PKCS12_SAFEBAG *bag, const char *oidname, const string& value) { int nid; nid = OBJ_txt2nid(const_cast(oidname)); if (nid == NID_undef) { tqslTrace("tqsl_add_bag_attribute", "OBJ_txt2nid err %s", tqsl_openssl_error()); return 1; } unsigned char *uni; int unilen; if (asc2uni(value.c_str(), value.length(), &uni, &unilen)) { ASN1_TYPE *val; X509_ATTRIBUTE *attrib; if (!uni[unilen - 1] && !uni[unilen - 2]) unilen -= 2; if ((val = ASN1_TYPE_new()) != 0) { ASN1_TYPE_set(val, V_ASN1_BMPSTRING, uni); if ((attrib = X509_ATTRIBUTE_new()) != 0) { X509_ATTRIBUTE_set1_object(attrib, OBJ_nid2obj(nid)); if ((X509_ATTRIBUTE_set1_data(attrib, V_ASN1_BMPSTRING, uni, unilen)) != 0) { #if (OPENSSL_VERSION_NUMBER & 0xfffff000) == 0x00906000 attrib->set = 1; #else #if OPENSSL_VERSION_NUMBER < 0x10100000L #if (OPENSSL_VERSION_NUMBER & 0xfffff000) >= 0x00907000 attrib->single = 0; #else #error "Unexpected OpenSSL version; check X509_ATTRIBUTE struct compatibility" #endif #endif #endif #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) STACK_OF(X509_ATTRIBUTE) *sk; sk = (STACK_OF(X509_ATTRIBUTE)*)PKCS12_SAFEBAG_get0_attrs(bag); if (sk) { sk_X509_ATTRIBUTE_push(sk, attrib); #else if (bag->attrib) { sk_X509_ATTRIBUTE_push(bag->attrib, attrib); #endif //cerr << "Added " << oidname << endl; } else { tqslTrace("tqsl_add_bag_attribute", "no attrib"); return 1; } } else { tqslTrace("tqsl_add_bag_attribute", "no value set"); return 1; } } else { tqslTrace("tqsl_add_bag_attribute", "attrib create err %s", tqsl_openssl_error()); return 1; } } else { tqslTrace("tqsl_add_bag_attribute", "bmp->data empty"); return 1; } } else { // asc2uni ok tqslTrace("tqsl_add_bag_attribute", "asc2uni err %s", tqsl_openssl_error()); return 1; } return 0; } static int tqsl_exportPKCS12(tQSL_Cert cert, bool returnB64, const char *filename, char *base64, int b64len, const char *p12password, bool weakCrypto) { STACK_OF(X509) *root_sk = 0, *ca_sk = 0, *chain = 0; const char *cp; char rootpath[TQSL_MAX_PATH_LEN], capath[TQSL_MAX_PATH_LEN]; char buf[256]; unsigned char keyid[EVP_MAX_MD_SIZE]; unsigned int keyidlen = 0; STACK_OF(PKCS12_SAFEBAG) *bags = 0; PKCS12_SAFEBAG *bag = 0; STACK_OF(PKCS7) *safes = 0; PKCS7 *authsafe = 0; int cert_pbe = NID_aes_256_cbc; int key_pbe = NID_aes_256_cbc; PKCS8_PRIV_KEY_INFO *p8 = 0; PKCS12 *p12 = 0; const EVP_MD *md = 0; BIO *out = 0, *b64 = 0; string callSign, issuerOrganization, issuerOrganizationalUnit; tQSL_Date date; string QSONotBeforeDate, QSONotAfterDate, dxccEntity, Email, Address1, Address2, City, State, Postal, Country; int dxcc = 0; int rval = 1; tqslTrace("tqsl_exportPKCS12", NULL); if (cert == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_exportPKCS12", "arg error cert=0x%lx", cert); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if ((returnB64 && base64 == NULL) || (!returnB64 && filename == NULL)) { tqslTrace("tqsl_exportPKCS12", "arg error returnB64=%d base64=0x%lx filename=0x%lx", returnB64, base64, filename); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tqslTrace("tqsl_exportPKCS12", "weak crypto flag %d", weakCrypto); // For compatibility with Apple Keychain for Mac // They don't support anything but deprecated P12 crypto // SHA1, 3DES, RC2. if (weakCrypto) { cert_pbe = NID_pbe_WithSHA1And40BitRC2_CBC; key_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; md = reinterpret_cast (EVP_get_digestbyname("sha1")); } /* Get parameters for key bag attributes */ if (tqsl_getCertificateCallSign(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get callsign err %d", tQSL_Error); return 1; } callSign = buf; if (tqsl_getCertificateIssuerOrganization(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get org err %d", tQSL_Error); return 1; } issuerOrganization = buf; if (tqsl_getCertificateIssuerOrganizationalUnit(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get ou err %d", tQSL_Error); return 1; } issuerOrganizationalUnit = buf; if (!TQSL_API_TO_CERT(cert)->keyonly) { if (tqsl_getCertificateEmailAddress(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get email err %d", tQSL_Error); return 1; } Email = buf; if (tqsl_getCertificateRequestAddress1(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get addr1 err %d", tQSL_Error); return 1; } Address1 = buf; if (tqsl_getCertificateRequestAddress2(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get addr2 err %d", tQSL_Error); return 1; } Address2 = buf; if (tqsl_getCertificateRequestCity(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get city err %d", tQSL_Error); return 1; } City = buf; if (tqsl_getCertificateRequestState(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get state err %d", tQSL_Error); return 1; } State = buf; if (tqsl_getCertificateRequestPostalCode(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get postal err %d", tQSL_Error); return 1; } Postal = buf; if (tqsl_getCertificateRequestCountry(cert, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "get country err %d", tQSL_Error); return 1; } Country = buf; } if (tqsl_getCertificateQSONotBeforeDate(cert, &date)) { tqslTrace("tqsl_exportPKCS12", "get qso not before err %d", tQSL_Error); return 1; } if (!tqsl_convertDateToText(&date, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "qso not before err %d", tQSL_Error); return 1; } QSONotBeforeDate = buf; if (tqsl_getCertificateQSONotAfterDate(cert, &date)) { tqslTrace("tqsl_exportPKCS12", "get qso not after err %d", tQSL_Error); return 1; } if (!tqsl_isDateNull(&date)) { if (!tqsl_convertDateToText(&date, buf, sizeof buf)) { tqslTrace("tqsl_exportPKCS12", "qso not before err %d", tQSL_Error); return 1; } QSONotAfterDate = buf; } if (tqsl_getCertificateDXCCEntity(cert, &dxcc)) { tqslTrace("tqsl_exportPKCS12", "get entity err %d", tQSL_Error); return 1; } snprintf(buf, sizeof buf, "%d", dxcc); dxccEntity = buf; if (TQSL_API_TO_CERT(cert)->key == NULL) { tqslTrace("tqsl_exportPKCS12", "key is null"); tQSL_Error = TQSL_SIGNINIT_ERROR; return 1; } if (!TQSL_API_TO_CERT(cert)->keyonly) { tqslTrace("tqsl_exportPKCS12", "keyonly cert"); /* Generate local key ID to tie key to cert */ X509_digest(TQSL_API_TO_CERT(cert)->cert, EVP_sha1(), keyid, &keyidlen); /* Check the chain of authority back to a trusted root */ tqsl_make_cert_path("root", rootpath, sizeof rootpath); if ((root_sk = tqsl_ssl_load_certs_from_file(rootpath)) == NULL) { if (!tqsl_ssl_error_is_nofile()) { tqslTrace("tqsl_exportPKCS12", "can't find certs"); goto p12_end; } } tqsl_make_cert_path("authorities", capath, sizeof capath); if ((ca_sk = tqsl_ssl_load_certs_from_file(capath)) == NULL) { if (!tqsl_ssl_error_is_nofile()) { tqslTrace("tqsl_exportPKCS12", "can't find certs"); goto p12_end; } } /* tqsl_ssl_verify_cert will collect the certificates in the chain, back to the * root certificate, verify them and return a stack containing copies of just * those certificates (including the user certificate). */ cp = tqsl_ssl_verify_cert(TQSL_API_TO_CERT(cert)->cert, ca_sk, root_sk, 0, &tqsl_expired_is_ok, &chain); if (cp) { if (chain) sk_X509_free(chain); tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, cp, sizeof tQSL_CustomError); tqslTrace("tqsl_exportPKCS12", "verify fail: %s", cp); return 1; } } // !keyonly tQSL_Error = TQSL_OPENSSL_ERROR; // Assume error /* Open the output file */ if (!returnB64) { out = BIO_new_file(filename, "wb"); } else { b64 = BIO_new(BIO_f_base64()); out = BIO_new(BIO_s_mem()); out = BIO_push(b64, out); } if (!out) { tqslTrace("tqsl_exportPKCS12", "BIO_new err %s", tqsl_openssl_error()); goto p12_end; } safes = sk_PKCS7_new_null(); if (!TQSL_API_TO_CERT(cert)->keyonly) { /* Create a safebag stack and fill it with the needed certs */ bags = sk_PKCS12_SAFEBAG_new_null(); for (int i = 0; i < sk_X509_num(chain); i++) { X509 *x = sk_X509_value(chain, i); #if (OPENSSL_VERSION_NUMBER & 0xfffff000) == 0x00906000 bag = PKCS12_pack_safebag(reinterpret_cast(x), (int (*)())i2d_X509, NID_x509Certificate, NID_certBag); #else bag = PKCS12_x5092certbag(x); #endif if (!bag) { tqslTrace("tqsl_exportPKCS12", "Error creating bag: %s", tqsl_openssl_error()); goto p12_end; } if (x == TQSL_API_TO_CERT(cert)->cert) { PKCS12_add_friendlyname(bag, "TrustedQSL user certificate", -1); PKCS12_add_localkeyid(bag, keyid, keyidlen); } sk_PKCS12_SAFEBAG_push(bags, bag); } /* Convert stack of safebags into an authsafe */ unsigned char p12salt[9]; memcpy(p12salt, "lamesalt", 8); authsafe = PKCS12_pack_p7encdata(cert_pbe, p12password, -1, p12salt, 8, PKCS12_DEFAULT_ITER, bags); if (!authsafe) { tqslTrace("tqsl_exportPKCS12", "Error creating authsafe: %s", tqsl_openssl_error()); goto p12_end; } sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); bags = 0; /* Add to stack of authsafes */ sk_PKCS7_push(safes, authsafe); } // !keyonly /* Make a shrouded key bag */ p8 = EVP_PKEY2PKCS8(TQSL_API_TO_CERT(cert)->key); if (!p8) { tqslTrace("tqsl_exportPKCS12", "Error creating p8 container: %s", tqsl_openssl_error()); goto p12_end; } bag = PKCS12_MAKE_SHKEYBAG(key_pbe, p12password, -1, 0, 0, PKCS12_DEFAULT_ITER, p8); if (!bag) { tqslTrace("tqsl_exportPKCS12", "Error creating p8 keybag: %s", tqsl_openssl_error()); goto p12_end; } PKCS8_PRIV_KEY_INFO_free(p8); p8 = NULL; PKCS12_add_friendlyname(bag, "TrustedQSL user certificate", -1); if (!TQSL_API_TO_CERT(cert)->keyonly) PKCS12_add_localkeyid(bag, keyid, keyidlen); /* Add the attributes to the private key bag */ tqsl_add_bag_attribute(bag, "AROcallsign", callSign); tqsl_add_bag_attribute(bag, "QSONotBeforeDate", QSONotBeforeDate); if (QSONotAfterDate != "") tqsl_add_bag_attribute(bag, "QSONotAfterDate", QSONotAfterDate); tqsl_add_bag_attribute(bag, "tqslCRQIssuerOrganization", issuerOrganization); tqsl_add_bag_attribute(bag, "tqslCRQIssuerOrganizationalUnit", issuerOrganizationalUnit); tqsl_add_bag_attribute(bag, "dxccEntity", dxccEntity); tqsl_add_bag_attribute(bag, "tqslCRQEmail", Email); tqsl_add_bag_attribute(bag, "tqslCRQAddress1", Address1); tqsl_add_bag_attribute(bag, "tqslCRQAddress2", Address2); tqsl_add_bag_attribute(bag, "tqslCRQCity", City); tqsl_add_bag_attribute(bag, "tqslCRQState", State); tqsl_add_bag_attribute(bag, "tqslCRQPostal", Postal); tqsl_add_bag_attribute(bag, "tqslCRQCountry", Country); bags = sk_PKCS12_SAFEBAG_new_null(); if (!bags) { tqslTrace("tqsl_exportPKCS12", "Error creating safebag: %s", tqsl_openssl_error()); goto p12_end; } sk_PKCS12_SAFEBAG_push(bags, bag); /* Turn shrouded key bag into unencrypted safe bag and add to safes stack */ authsafe = PKCS12_pack_p7data(bags); sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); bags = NULL; sk_PKCS7_push(safes, authsafe); /* Form into PKCS12 data */ p12 = PKCS12_init(NID_pkcs7_data); M_PKCS12_pack_authsafes(p12, safes); sk_PKCS7_pop_free(safes, PKCS7_free); safes = NULL; PKCS12_set_mac(p12, p12password, -1, 0, 0, PKCS12_DEFAULT_ITER, md); /* Write the PKCS12 data */ i2d_PKCS12_bio(out, p12); if (BIO_flush(out) != 1) { rval = 1; tqslTrace("tqsl_exportPKCS12", "Error writing pkcs12: %s", tqsl_openssl_error()); goto p12_end; } if (returnB64) { char *encoded; int len; len = BIO_get_mem_data(out, &encoded); encoded[len - 1] = '\0'; strncpy(base64, encoded, b64len); } rval = 0; tQSL_Error = TQSL_NO_ERROR; p12_end: if (out) { BIO_free(out); if (rval && !returnB64) { #ifdef _WIN32 wchar_t* wfilename = utf8_to_wchar(filename); _wunlink(wfilename); free_wchar(wfilename); #else unlink(filename); #endif } } if (chain) sk_X509_free(chain); if (root_sk) sk_X509_free(root_sk); if (ca_sk) sk_X509_free(ca_sk); if (bags) sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); if (safes) sk_PKCS7_pop_free(safes, PKCS7_free); if (p8) PKCS8_PRIV_KEY_INFO_free(p8); return rval; } DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File(tQSL_Cert cert, const char *filename, const char *p12password) { tqslTrace("tqsl_exportPKCS12File", NULL); return tqsl_exportPKCS12(cert, false, filename, NULL, 0, p12password, false); } DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto(tQSL_Cert cert, const char *filename, const char *p12password) { tqslTrace("tqsl_exportPKCS12File", NULL); return tqsl_exportPKCS12(cert, false, filename, NULL, 0, p12password, true); } DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64(tQSL_Cert cert, char *base64, int b64len, const char *p12password) { tqslTrace("tqsl_exportPKCS12Base64", NULL); return tqsl_exportPKCS12(cert, true, NULL, base64, b64len, p12password, false); } static string tqsl_asn1_octet_string_to_hex(ASN1_OCTET_STRING *os) { string str; for (int k = 0; k < os->length; k++) { char hex[3] = " "; hex[0] = ((os->data[k] >> 4) & 0xf) + '0'; if (hex[0] > '9') hex[0] += 'A' - '9' - 1; hex[1] = (os->data[k] & 0xf) + '0'; if (hex[1] > '9') hex[1] += 'A' - '9' - 1; if (str.size()) str += " "; str += hex; } return str; } struct tqsl_imported_cert { string pem; string keyid; string callsign; }; static int tqsl_get_bag_attribute(PKCS12_SAFEBAG *bag, const char *oidname, string& str) { const ASN1_TYPE *attr; str = ""; if ((attr = PKCS12_get_attr(bag, OBJ_txt2nid(const_cast(oidname)))) != 0) { if (attr->type != V_ASN1_BMPSTRING) { tQSL_Error = TQSL_CERT_TYPE_ERROR; tqslTrace("tqsl_get_bag_attribute", "cert type error oid %s", oidname); return 1; } char *c = uni2asc(attr->value.bmpstring->data, attr->value.bmpstring->length); str = c; OPENSSL_free(c); } return 0; } static int tqsl_importPKCS12(bool importB64, const char *filename, const char *base64, const char *p12password, const char *password, int (*pwcb)(char *, int, void *), int(*cb)(int, const char *, void *), void *userdata) { PKCS12 *p12 = 0; PKCS12_SAFEBAG *bag; PKCS8_PRIV_KEY_INFO *p8 = 0; EVP_PKEY *pkey = 0; BIO *in = 0, *bio = 0 , *b64 = 0; STACK_OF(PKCS7) *safes = 0; STACK_OF(PKCS12_SAFEBAG) *bags = 0; PKCS7 *p7; X509 *x; BASIC_CONSTRAINTS *bs = 0; ASN1_OBJECT *callobj = 0, *obj = 0; const ASN1_TYPE *attr = 0; const EVP_CIPHER *cipher; unsigned char *cp; int i, j, bagnid, len; vector rootcerts; vector cacerts; vector usercerts; vector *certlist; vector::iterator it; bool is_cacert; string public_key, private_key, private_keyid, key_callsign, str; map key_attr; map newrecord; map::iterator mit; char path[TQSL_MAX_PATH_LEN], pw[256]; int rval = 1; tqslTrace("tqsl_importPKCS12", NULL); if (tqsl_init()) return 1; if ((!importB64 && filename == NULL) || (importB64 && base64 == NULL)) { tqslTrace("tqsl_importPKCS12", "arg error importB64=%d filename=0x%lx base64=0x%lx", importB64, filename, base64); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tQSL_ImportCall[0] = '\0'; tQSL_ImportSerial = 0; ImportCall[0] = '\0'; tQSL_Error = TQSL_OPENSSL_ERROR; /* Read in the PKCS#12 file */ if (importB64) { b64 = BIO_new(BIO_f_base64()); in = BIO_new_mem_buf(const_cast(base64), strlen(base64)); in = BIO_push(b64, in); } else { in = BIO_new_file(filename, "rb"); } if (in == 0) { tqslTrace("tqsl_importPKCS12", "Couldn't create bio: %s", tqsl_openssl_error()); goto imp_end; } if ((p12 = d2i_PKCS12_bio(in, 0)) == 0) { tqslTrace("tqsl_importPKCS12", "Couldn't read pkcs12: %s", tqsl_openssl_error()); goto imp_end; } BIO_free(in); in = 0; /* Verify MAC */ if (!PKCS12_verify_mac(p12, p12password, -1)) { tqslTrace("tqsl_importPKCS12", "Mac doesn't verify"); tQSL_Error = TQSL_PASSWORD_ERROR; goto imp_end; } /* Loop through the authsafes */ if ((safes = M_PKCS12_unpack_authsafes(p12)) == 0) { tqslTrace("tqsl_importPKCS12", "Can't unpack authsafe: %s", tqsl_openssl_error()); goto imp_end; } callobj = OBJ_txt2obj("AROcallsign", 0); for (i = 0; i < sk_PKCS7_num(safes); i++) { tqsl_imported_cert imported_cert; p7 = sk_PKCS7_value(safes, i); bagnid = OBJ_obj2nid(p7->type); if (bagnid == NID_pkcs7_data) { bags = PKCS12_unpack_p7data(p7); } else if (bagnid == NID_pkcs7_encrypted) { bags = PKCS12_unpack_p7encdata(p7, p12password, strlen(p12password)); } else { continue; // Not something we understand } if (!bags) { tQSL_Error = TQSL_PKCS12_ERROR; tqslTrace("tqsl_importPKCS12", "bags empty: %s", tqsl_openssl_error()); goto imp_end; } /* Loop through safebags */ for (j = 0; j < sk_PKCS12_SAFEBAG_num(bags); j++) { tqsl_imported_cert imported_cert; bag = sk_PKCS12_SAFEBAG_value(bags, j); switch (M_PKCS12_bag_type(bag)) { case NID_certBag: if (M_PKCS12_cert_bag_type(bag) != NID_x509Certificate) break; // Can't handle anything else if ((x = M_PKCS12_certbag2x509(bag)) == 0) { tqslTrace("tqsl_importPKCS12", "bag2x509: %s", tqsl_openssl_error()); goto imp_end; } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_importPKCS12", "bio_new: %s", tqsl_openssl_error()); goto imp_end; } if (!PEM_write_bio_X509(bio, x)) { tqslTrace("tqsl_importPKCS12", "write_bio: %s", tqsl_openssl_error()); goto imp_end; } len = static_cast(BIO_get_mem_data(bio, &cp)); imported_cert.pem = string((const char *)cp, len); if ((attr = PKCS12_get_attr(bag, NID_localKeyID)) != 0) { if (attr->type != V_ASN1_OCTET_STRING) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch"); tQSL_Error = TQSL_CERT_TYPE_ERROR; goto imp_end; } imported_cert.keyid = tqsl_asn1_octet_string_to_hex(attr->value.octet_string); } BIO_free(bio); bio = 0; is_cacert = false; if ((bs = reinterpret_cast(X509_get_ext_d2i(x, NID_basic_constraints, 0, 0))) != 0) { if (bs->ca) is_cacert = true; BASIC_CONSTRAINTS_free(bs); bs = 0; } certlist = &usercerts; if (is_cacert) { if (X509_check_issued(x, x) == X509_V_OK) // Self signed must be trusted certlist = &rootcerts; else certlist = &cacerts; } else { /* Make sure the cert is TQSL compatible */ TQSL_X509_NAME_ITEM item; char nbuf[40]; char callbuf[256]; item.name_buf = nbuf; item.name_buf_size = sizeof nbuf; item.value_buf = callbuf; item.value_buf_size = sizeof callbuf; if (!tqsl_cert_get_subject_name_entry(x, "AROcallsign", &item)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch"); tQSL_Error = TQSL_CERT_TYPE_ERROR; goto imp_end; } imported_cert.callsign = callbuf; } (*certlist).push_back(imported_cert); break; case NID_pkcs8ShroudedKeyBag: if ((attr = PKCS12_get_attr(bag, NID_localKeyID)) != 0) { if (attr->type != V_ASN1_OCTET_STRING) { tQSL_Error = TQSL_CERT_TYPE_ERROR; tqslTrace("tqsl_importPKCS12", "Cert type mismatch"); goto imp_end; } private_keyid = tqsl_asn1_octet_string_to_hex(attr->value.octet_string); } if (tqsl_get_bag_attribute(bag, "AROcallsign", key_callsign)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no callsign"); goto imp_end; } if (tqsl_get_bag_attribute(bag, "dxccEntity", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no dxcc"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_DXCC_ENTITY"] = str; if (tqsl_get_bag_attribute(bag, "QSONotBeforeDate", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no qsonotbefore"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_QSO_NOT_BEFORE"] = str; if (tqsl_get_bag_attribute(bag, "QSONotAfterDate", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no qsonotafter"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_QSO_NOT_AFTER"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQIssuerOrganization", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no org"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_PROVIDER"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQIssuerOrganizationalUnit", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no ou"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_PROVIDER_UNIT"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQEmail", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no email"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_EMAIL"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQAddress1", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no addr1"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_ADDRESS1"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQAddress2", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no addr2"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_ADDRESS2"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQCity", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no city"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_CITY"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQState", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no state"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_STATE"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQPostal", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no postal"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_POSTAL"] = str; if (tqsl_get_bag_attribute(bag, "tqslCRQCountry", str)) { tqslTrace("tqsl_importPKCS12", "Cert type mismatch - no country"); goto imp_end; } if (str != "") key_attr["TQSL_CRQ_COUNTRY"] = str; if ((p8 = M_PKCS12_decrypt_skey(bag, p12password, strlen(p12password))) == 0) { tqslTrace("tqsl_importPKCS12", "password error"); goto imp_end; } if ((pkey = EVP_PKCS82PKEY(p8)) == 0) { tqslTrace("tqsl_importPKCS12", "pkey error"); goto imp_end; } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_importPKCS12", "bio_new error %s", tqsl_openssl_error()); goto imp_end; } if (password == 0) { if (pwcb) { if ((*pwcb)(pw, sizeof pw -1, userdata)) { tqslTrace("tqsl_importPKCS12", "operator aborted at password prompt"); tQSL_Error = TQSL_OPERATOR_ABORT; goto imp_end; } password = pw; } else { password = NULL; } } if (password && *password != '\0') { cipher = EVP_des_ede3_cbc(); len = strlen(password); } else { cipher = 0; len = 0; } if (!PEM_write_bio_PrivateKey(bio, pkey, cipher, (unsigned char *)password, len, 0, 0)) { tqslTrace("tqsl_importPKCS12", "writing bio err: %s", tqsl_openssl_error()); goto imp_end; } len = static_cast(BIO_get_mem_data(bio, &cp)); private_key = string((const char *)cp, len); BIO_free(bio); if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_importPKCS12", "new bio err: %s", tqsl_openssl_error()); goto imp_end; } if (!PEM_write_bio_PUBKEY(bio, pkey)) { tqslTrace("tqsl_importPKCS12", "write pubkey bio err: %s", tqsl_openssl_error()); goto imp_end; } len = static_cast(BIO_get_mem_data(bio, &cp)); public_key = string((const char *)cp, len); BIO_free(bio); bio = 0; EVP_PKEY_free(pkey); pkey = 0; PKCS8_PRIV_KEY_INFO_free(p8); p8 = 0; break; case NID_keyBag: tqslTrace("tqsl_importPKCS12", "cert type err: NID_keyBag"); tQSL_Error = TQSL_CERT_TYPE_ERROR; goto imp_end; } // bag type switch } // safebags loop sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); bags = 0; } sk_PKCS7_pop_free(safes, PKCS7_free); safes = 0; /* Now we have the certificates and key pair, so add them to the local store */ tqslTrace("tqsl_importPKCS12", "have keys"); if (key_callsign == "") { /* Need to get call sign from cert. The tQSL_exportKeys function puts the * call sign in a safebag attribute that should have been read already, * but if some other software created the PKCS#12 file that may not have * happened. There should, however, be a localKeyID attribute that matches * the key to the certificate. If not, it's an error. */ if (private_keyid == "") { // No key ID, can't find cert tqslTrace("tqsl_importPKCS12", "no callsign attribute"); tQSL_Error = TQSL_CERT_TYPE_ERROR; goto imp_end; } for (it = usercerts.begin(); it != usercerts.end(); it++) { if ((*it).keyid == private_keyid) { key_callsign = (*it).callsign; break; } } if (key_callsign == "") { // Can't find cert or callsign tqslTrace("tqsl_importPKCS12", "can't find cert or callsign"); tQSL_Error = TQSL_CERT_TYPE_ERROR; goto imp_end; } } if (!tqsl_make_key_path(key_callsign.c_str(), path, sizeof path)) { tqslTrace("tqsl_importPKCS12", "keypath error %d", tQSL_Error); goto imp_end; } newrecord["PUBLIC_KEY"] = public_key; newrecord["PRIVATE_KEY"] = private_key; newrecord["CALLSIGN"] = key_callsign; for (mit = key_attr.begin(); mit != key_attr.end(); mit++) newrecord[mit->first] = mit->second; if (tqsl_replace_key(key_callsign.c_str(), path, newrecord, cb, userdata)) { tqslTrace("tqsl_importPKCS12", "replace key error %d", tQSL_Error); goto imp_end; } for (it = rootcerts.begin(); it != rootcerts.end(); it++) { if (tqsl_import_cert(it->pem.c_str(), tqsllib::ROOTCERT, cb, userdata) && tQSL_Error != TQSL_CERT_ERROR) { tqslTrace("tqsl_importPKCS12", "import root cert error %d", tQSL_Error); goto imp_end; } } for (it = cacerts.begin(); it != cacerts.end(); it++) { if (tqsl_import_cert(it->pem.c_str(), tqsllib::CACERT, cb, userdata) && tQSL_Error != TQSL_CERT_ERROR) { tqslTrace("tqsl_importPKCS12", "import ca cert error %d", tQSL_Error); goto imp_end; } } rval = 0; // Assume no errors for (it = usercerts.begin(); it != usercerts.end(); it++) { if (tqsl_import_cert(it->pem.c_str(), tqsllib::USERCERT, cb, userdata)) { if (tQSL_Error == TQSL_CERT_ERROR) { rval = 1; // Remember failure to import continue; } char savepath[TQSL_MAX_PATH_LEN], badpath[TQSL_MAX_PATH_LEN]; strncpy(badpath, path, sizeof(badpath)); strncat(badpath, ".bad", sizeof(badpath)-strlen(badpath)-1); badpath[sizeof(badpath)-1] = '\0'; #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); wchar_t* wbadpath = utf8_to_wchar(badpath); wchar_t* wsavepath = NULL; if (!_wrename(wpath, wbadpath)) { #else if (!rename(path, badpath)) { #endif strncpy(savepath, path, sizeof(savepath)); strncat(savepath, ".save", sizeof(savepath)-strlen(savepath)-1); savepath[sizeof(savepath)-1] = '\0'; #ifdef _WIN32 wsavepath = utf8_to_wchar(savepath); if (_wrename(wsavepath, wpath)) // didn't work _wrename(wbadpath, wpath); #else if (rename(savepath, path)) // didn't work rename(badpath, path); #endif else #ifdef _WIN32 { _wunlink(wbadpath); free_wchar(wpath); free_wchar(wbadpath); if (wsavepath) free_wchar(wsavepath); } #else unlink(badpath); #endif } goto imp_end; } } if (rval == 0) { tQSL_Error = TQSL_NO_ERROR; strncpy(tQSL_ImportCall, ImportCall, sizeof tQSL_ImportCall); } else { if (tQSL_Error == 0) { tQSL_Error = TQSL_CERT_ERROR; } } imp_end: if (p12) PKCS12_free(p12); if (in) BIO_free(in); if (bags) sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); if (safes) sk_PKCS7_pop_free(safes, PKCS7_free); if (obj) ASN1_OBJECT_free(obj); if (callobj) ASN1_OBJECT_free(callobj); if (bs) BASIC_CONSTRAINTS_free(bs); if (p8) PKCS8_PRIV_KEY_INFO_free(p8); if (pkey) EVP_PKEY_free(pkey); return rval; } DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File(const char *filename, const char *p12password, const char *password, int (*pwcb)(char *, int, void *), int(*cb)(int, const char *, void *), void *userdata) { tqslTrace("tqsl_importPKCS12File", NULL); return tqsl_importPKCS12(false, filename, NULL, p12password, password, pwcb, cb, userdata); } DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64(const char *base64, const char *p12password, const char *password, int (*pwcb)(char *, int, void *), int(*cb)(int, const char *, void *), void *userdata) { tqslTrace("tqsl_importPKCS12Base64", NULL); return tqsl_importPKCS12(true, NULL, base64, p12password, password, pwcb, cb, userdata); } static int tqsl_backup_cert(tQSL_Cert cert) { char callsign[64]; long serial = 0; int dxcc = 0; int keyonly; tqsl_getCertificateKeyOnly(cert, &keyonly); tqsl_getCertificateCallSign(cert, callsign, sizeof callsign); if (!keyonly) tqsl_getCertificateSerial(cert, &serial); tqsl_getCertificateDXCCEntity(cert, &dxcc); char backupPath[TQSL_MAX_PATH_LEN]; tqsl_make_backup_path(callsign, backupPath, sizeof backupPath); FILE* out = NULL; #ifdef _WIN31 wchar_t* wpath = utf8_to_wchar(backupPath); _wunlink(wpath); fd = _wfopen(lfn, L"wb"); free_wchar(wpath); #else unlink(backupPath); out = fopen(backupPath, "wb"); #endif if (!out) { tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; strncpy(tQSL_ErrorFile, backupPath, sizeof tQSL_ErrorFile); tQSL_ErrorFile[sizeof tQSL_ErrorFile-1] = 0; tqslTrace("tqsl_backup_cert", "Error %d errno %d file %s", tQSL_Error, tQSL_Errno, backupPath); return 1; } char buf[8192]; fprintf(out, "\n", callsign, dxcc, serial); if (!keyonly) { fprintf(out, "\n"); tqsl_getCertificateEncoded(cert, buf, sizeof buf); fprintf(out, "%s", buf); fprintf(out, "\n"); } fprintf(out, "\n"); tqsl_getKeyEncoded(cert, buf, sizeof buf); fprintf(out, "%s", buf); fprintf(out, "\n\n"); fclose(out); return 0; } static int tqsl_make_backup_list(const char* filter, vector& keys) { keys.clear(); string path = tQSL_BaseDir; #ifdef _WIN32 path += "\\certtrash"; wchar_t* wpath = utf8_to_wchar(path.c_str()); MKDIR(wpath, 0700); #else path += "/certtrash"; MKDIR(path.c_str(), 0700); #endif #ifdef _WIN32 WDIR *dir = wopendir(wpath); free_wchar(wpath); #else DIR *dir = opendir(path.c_str()); #endif if (dir == NULL) { tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_make_backup_list", "Opendir %s error %s", path.c_str(), strerror(errno)); return 1; } #ifdef _WIN32 struct wdirent *ent; #else struct dirent *ent; #endif int rval = 0; int savedError = 0; int savedErrno = 0; char *savedFile = NULL; #ifdef _WIN32 while ((ent = wreaddir(dir)) != NULL) { if (ent->d_name[0] == '.') continue; char dname[TQSL_MAX_PATH_LEN]; wcstombs(dname, ent->d_name, TQSL_MAX_PATH_LEN); string filename = path + "\\" + dname; struct _stat32 s; wchar_t* wfilename = utf8_to_wchar(filename.c_str()); if (_wstat32(wfilename, &s) == 0) { if (S_ISDIR(s.st_mode)) { free_wchar(wfilename); continue; // If it's a directory, skip it. } } #else while ((ent = readdir(dir)) != NULL) { if (ent->d_name[0] == '.') continue; string filename = path + "/" + ent->d_name; struct stat s; if (stat(filename.c_str(), &s) == 0) { if (S_ISDIR(s.st_mode)) continue; // If it's a directory, skip it. } #endif XMLElement xel; int status = xel.parseFile(filename.c_str()); if (status) continue; // Can't be parsed XMLElement cert; xel.getFirstElement(cert); pair atrval = cert.getAttribute("CallSign"); if (atrval.second) { // If the callsign matches, or if the filter is empty, add it. if (filter == NULL || atrval.first == filter) { keys.push_back(atrval.first); } } } #ifdef _WIN32 _wclosedir(dir); #else closedir(dir); #endif if (rval) { tQSL_Error = savedError; tQSL_Errno = savedErrno; if (savedFile) { strncpy(tQSL_ErrorFile, savedFile, sizeof tQSL_ErrorFile); free(savedFile); } tqslTrace("tqsl_make_backup_list", "error %s %s", tQSL_ErrorFile, strerror(tQSL_Errno)); } return rval; } DLLEXPORT int CALLCONVENTION tqsl_deleteCertificate(tQSL_Cert cert) { tqslTrace("tqsl_deleteCertificate", NULL); if (tqsl_init()) return 1; if (cert == NULL || !tqsl_cert_check(TQSL_API_TO_CERT(cert), false)) { tqslTrace("tqsl_deleteCertificate", "arg err cert=0x%lx", cert); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tqsl_backup_cert(cert); char callsign[256], path[TQSL_MAX_PATH_LEN], newpath[TQSL_MAX_PATH_LEN]; if (tqsl_getCertificateCallSign(cert, callsign, sizeof callsign)) { tqslTrace("tqsl_deleteCertificate", "no callsign %d", tQSL_Error); return 1; } int rval = 1; EVP_PKEY *key = 0; BIO *bio = 0; tQSL_Error = TQSL_OPENSSL_ERROR; // Delete private key map rec; if (TQSL_API_TO_CERT(cert)->pubkey) { rec["PUBLIC_KEY"] = TQSL_API_TO_CERT(cert)->pubkey; } else { // Get public key from cert if ((key = X509_get_pubkey(TQSL_API_TO_CERT(cert)->cert)) == 0) { tqslTrace("tqsl_deleteCertificate", "no public key %s", tqsl_openssl_error()); goto dc_end; } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_deleteCertificate", "bio err %s", tqsl_openssl_error()); goto dc_end; } if (!PEM_write_bio_PUBKEY(bio, key)) { tqslTrace("tqsl_deleteCertificate", "bio write err %s", tqsl_openssl_error()); goto dc_end; } char *cp; int len = static_cast(BIO_get_mem_data(bio, &cp)); rec["PUBLIC_KEY"] = string(cp, len); BIO_free(bio); bio = 0; EVP_PKEY_free(key); key = 0; } rec["CALLSIGN"] = callsign; if (!tqsl_make_key_path(callsign, path, sizeof path)) { tqslTrace("tqsl_deleteCertificate", "key path err %s", tQSL_Error); goto dc_end; } // Since there is no private key in "rec," tqsl_replace_key will just remove the // existing private key. tqsl_replace_key(callsign, path, rec, 0, 0); if (TQSL_API_TO_CERT(cert)->keyonly) { tqslTrace("tqsl_deleteCertificate", "key only"); goto dc_ok; } // Now the certificate tqsl_make_cert_path("user", path, sizeof path); tqsl_make_cert_path("user.new", newpath, sizeof newpath); if (xcerts == NULL) { if ((xcerts = tqsl_ssl_load_certs_from_file(path)) == 0) { tqslTrace("tqsl_deleteCertificate", "error reading certs %d", tQSL_Error); goto dc_end; } } if ((bio = BIO_new_file(newpath, "wb")) == 0) { tqslTrace("tqsl_deleteCertificate", "bio_new_file %s", tqsl_openssl_error()); goto dc_end; } X509 *x; while ((x = sk_X509_shift(xcerts)) != 0) { if (X509_issuer_and_serial_cmp(x, TQSL_API_TO_CERT(cert)->cert)) { if (!PEM_write_bio_X509(bio, x)) { // No match -- keep this one tqslTrace("tqsl_deleteCertificate", "pem_write_bio %s", tqsl_openssl_error()); goto dc_end; } } } BIO_free(bio); bio = 0; // Looks like the new file is okay, commit it #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); if (_wunlink(wpath) && errno != ENOENT) { free_wchar(wpath); #else if (unlink(path) && errno != ENOENT) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_deleteCertificate", "unlink err %d", errno); goto dc_end; } #ifdef _WIN32 wchar_t* wnewpath = utf8_to_wchar(newpath); if (_wrename(wnewpath, wpath)) { free_wchar(wpath); free_wchar(wnewpath); #else if (rename(newpath, path)) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_deleteCertificate", "rename err %d", errno); goto dc_end; } #ifdef _WIN32 free_wchar(wpath); free_wchar(wnewpath); #endif dc_ok: rval = 0; tQSL_Error = TQSL_NO_ERROR; dc_end: if (xcerts) { sk_X509_free(xcerts); xcerts = NULL; } if (key) EVP_PKEY_free(key); if (bio) BIO_free(bio); return rval; } /** Get the list of restorable callsign certificates. */ DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates(char ***calls, int *ncall, const char *filter) { vector callsigns; if (tqsl_make_backup_list(filter, callsigns)) { return 1; } *ncall = callsigns.size(); if (*ncall == 0) { if (calls) { *calls = NULL; } return 0; } if (calls == NULL) { return 0; } *calls = reinterpret_cast(calloc(*ncall, sizeof(**calls))); vector::iterator it; char **p = *calls; for (it = callsigns.begin(); it != callsigns.end(); it++) { *p++ = strdup((*it).c_str()); } return 0; } DLLEXPORT void CALLCONVENTION tqsl_freeDeletedCertificateList(char **list, int nloc) { if (!list) return; for (int i = 0; i < nloc; i++) if (list[i]) free(list[i]); if (list) free(list); } /** Restore a deleted callsign certificate by callsign. */ DLLEXPORT int CALLCONVENTION tqsl_restoreCallsignCertificate(const char *callsign) { tqslTrace("tqsl_restoreCallsignCertificate", "callsign = %s", callsign); char backupPath[TQSL_MAX_PATH_LEN]; tqsl_make_backup_path(callsign, backupPath, sizeof backupPath); XMLElement xel; int status = xel.parseFile(backupPath); if (status) { if (errno == ENOENT) { // No file is OK tqslTrace("tqsl_restoreCallsignCertificate", "FNF"); return 0; } strncpy(tQSL_ErrorFile, backupPath, sizeof tQSL_ErrorFile); if (status == XML_PARSE_SYSTEM_ERROR) { tQSL_Error = TQSL_FILE_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_restoreCallsignCertificate", "open error %s: %s", backupPath, strerror(tQSL_Errno)); } else { tqslTrace("tqsl_restoreCallsignCertificate", "syntax error %s", backupPath); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; } return 1; } XMLElement cert; string call; int dxcc = 0; long serial = 0; string privateKey; string publicKey; XMLElementList& ellist = xel.getElementList(); XMLElementList::iterator ep; for (ep = ellist.find("UserCert"); ep != ellist.end(); ep++) { if (ep->first != "UserCert") break; pair rval = ep->second->getAttribute("CallSign"); if (rval.second) call = rval.first; rval = ep->second->getAttribute("serial"); if (rval.second) serial = strtol(rval.first.c_str(), NULL, 10); rval = ep->second->getAttribute("dxcc"); if (rval.second) dxcc = strtol(rval.first.c_str(), NULL, 10); XMLElement el; if (ep->second->getFirstElement("SignedCert", el)) { publicKey = el.getText(); } if (ep->second->getFirstElement("PrivateKey", el)) { privateKey = el.getText(); } } // See if this certificate exists tQSL_Cert *certlist; int ncerts; tqsl_selectCertificates(&certlist, &ncerts, call.c_str(), dxcc, 0, 0, TQSL_SELECT_CERT_EXPIRED|TQSL_SELECT_CERT_SUPERCEDED|TQSL_SELECT_CERT_WITHKEYS); for (int i = 0; i < ncerts; i++) { long s = 0; int keyonly = false; tqsl_getCertificateKeyOnly(certlist[i], &keyonly); if (keyonly) { if (serial != 0) { // A full cert for this was imported continue; } } if (tqsl_getCertificateSerial(certlist[i], &s)) { continue; } if (s == serial) { // Already imported tqsl_freeCertificateList(certlist, ncerts); tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "This callsign certificate is already active and cannot be restored.", sizeof tQSL_CustomError); tqslTrace("tqsl_restoreCallsignCertificate", "certificate already exists"); return 1; } } tqsl_freeCertificateList(certlist, ncerts); int stat = tqsl_importKeyPairEncoded(call.c_str(), "user", privateKey.c_str(), publicKey.c_str()); if (!stat) { // Remove the backup file #ifdef _WIN32 wchar_t* wbpath = utf8_to_wchar(backupPath); _wunlink(wbpath); free_wchar(wbpath); #else unlink(backupPath); #endif } return stat; } /********** END OF PUBLIC API FUNCTIONS **********/ /* Utility functions to manage private data structures */ static int tqsl_check_crq_field(tQSL_Cert cert, char *buf, int bufsiz) { if (tqsl_init()) return 1; if (cert == NULL || buf == NULL || bufsiz < 0 || !tqsl_cert_check(TQSL_API_TO_CERT(cert))) { tqslTrace("tqsl_check_crq_field", "arg err cert=0x%lx buf=0x%lx bufsiz=%d", cert, buf, bufsiz); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (TQSL_API_TO_CERT(cert)->crq == NULL) { if (tqsl_find_matching_key(TQSL_API_TO_CERT(cert)->cert, NULL, &(TQSL_API_TO_CERT(cert)->crq), "", NULL, NULL) && tQSL_Error != TQSL_PASSWORD_ERROR) { tqslTrace("tqsl_check_crq_field", "can't find matching key err %d", tQSL_Error); return 1; } } return 0; } static int tqsl_cert_check(tqsl_cert *p, bool needcert) { if (p != NULL && p->id == 0xCE && (!needcert || p->cert != NULL)) return 1; tQSL_Error = TQSL_ARGUMENT_ERROR; return 0; } static tqsl_cert * tqsl_cert_new() { tqsl_cert *p; p = reinterpret_cast(tqsl_calloc(1, sizeof(tqsl_cert))); if (p != NULL) p->id = 0xCE; return p; } static void tqsl_cert_free(tqsl_cert *p) { if (p == NULL || p->id != 0xCE) return; p->id = 0; if (p->cert != NULL) X509_free(p->cert); if (p->key != NULL) EVP_PKEY_free(p->key); if (p->crq != NULL) tqsl_free_cert_req(p->crq, 0); if (p->pubkey != NULL) delete[] p->pubkey; if (p->privkey != NULL) delete[] p->privkey; tqsl_free(p); } static TQSL_CERT_REQ * tqsl_free_cert_req(TQSL_CERT_REQ *req, int seterr) { if (req == NULL) return NULL; tqsl_free(req); if (seterr) tQSL_Error = seterr; return NULL; } static TQSL_CERT_REQ * tqsl_copy_cert_req(TQSL_CERT_REQ *userreq) { TQSL_CERT_REQ *req; if ((req = reinterpret_cast(tqsl_calloc(1, sizeof(TQSL_CERT_REQ)))) == NULL) { tqslTrace("tqsl_copy_cert_req", "ENOMEM"); errno = ENOMEM; return NULL; } *req = *userreq; return req; } static int tqsl_check_parm(const char *p, const char *parmName) { if (strlen(p) == 0) { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Missing parameter: %s", parmName); tqslTrace("tqsl_check_parm", "error %s", tQSL_CustomError); return 1; } return 0; } static char * tqsl_trim(char *buf) { char lastc; char *cp, *op; /* Trim white space off end of string */ cp = buf + strlen(buf); while (cp != buf) { cp--; if (!isspace(*cp)) break; *cp = 0; } /* Skip past leading whitespace */ for (cp = buf; isspace(*cp); cp++) {} /* Fold runs of white space into single space */ lastc = 0; op = buf; for (; *cp != '\0'; cp++) { if (isspace(*cp)) *cp = ' '; if (*cp != ' ' || lastc != ' ') *op++ = *cp; lastc = *cp; } *op = '\0'; return cp; } /* Filter a list (stack) of X509 certs based on call sign, QSO date and/or * issuer. * * Returns a new stack of matching certs without altering the original stack. * * Note that you don't have to supply any of the criteria. If you supply * none, you;ll just get back an exact copy of the stack. */ CLIENT_STATIC STACK_OF(X509) * tqsl_filter_cert_list(STACK_OF(X509) *sk, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flags) { set superceded_certs; char buf[256], name_buf[256]; TQSL_X509_NAME_ITEM item; X509 *x; STACK_OF(X509) *newsk; int i, ok, len; tQSL_Date qso_date; tqslTrace("tqsl_filter_cert_list", NULL); if (tqsl_init()) return NULL; if ((newsk = sk_X509_new_null()) == NULL) { tqslTrace("tqsl_filter_cert_list", "sk_X509_new_null err %s", tqsl_openssl_error()); return NULL; } tqsl_cert* cp = tqsl_cert_new(); /* Loop through the list of certs */ for (i = 0; i < sk_X509_num(sk); i++) { ok = 1; /* Certificate is selected unless some check says otherwise */ x = sk_X509_value(sk, i); cp->cert = x; /* Check for expired unless asked not to */ if (ok && !(flags & TQSL_SELECT_CERT_EXPIRED)) { int exp = false; if (!tqsl_isCertificateExpired(TQSL_OBJ_TO_API(cp), &exp)) { if (exp) { ok = 0; } } } /* Check for superceded unless asked not to */ if (ok && !(flags & TQSL_SELECT_CERT_SUPERCEDED)) { int sup = false; if (!tqsl_isCertificateSuperceded(TQSL_OBJ_TO_API(cp), &sup)) { if (sup) { ok = 0; } } } /* Compare issuer if asked to */ if (ok && issuer != NULL) { X509_NAME *iss; if ((iss = X509_get_issuer_name(x)) == NULL) ok = 0; if (ok) { item.name_buf = name_buf; item.name_buf_size = sizeof name_buf; item.value_buf = buf; item.value_buf_size = sizeof buf; tqsl_get_name_entry(iss, "organizationName", &item); ok = !strcmp(issuer->organizationName, item.value_buf); } if (ok) { item.name_buf = name_buf; item.name_buf_size = sizeof name_buf; item.value_buf = buf; item.value_buf_size = sizeof buf; tqsl_get_name_entry(iss, "organizationalUnitName", &item); ok = !strcmp(issuer->organizationalUnitName, item.value_buf); } } /* Check call sign if asked */ if (ok && callsign != NULL) { item.name_buf = name_buf; item.name_buf_size = sizeof name_buf; item.value_buf = buf; item.value_buf_size = sizeof buf; if (!tqsl_cert_get_subject_name_entry(x, "AROcallsign", &item)) ok = 0; else ok = !strcmp(callsign, item.value_buf); } /* Check DXCC entity if asked */ if (ok && dxcc > 0) { len = sizeof buf-1; if (tqsl_get_cert_ext(x, "dxccEntity", (unsigned char *)buf, &len, NULL)) { ok = 0; } else { buf[len] = 0; if (dxcc != strtol(buf, NULL, 10)) ok = 0; } } /* Check QSO date if asked */ if (ok && date != NULL && !tqsl_isDateNull(date)) { len = sizeof buf-1; if (tqsl_get_cert_ext(x, "QSONotBeforeDate", (unsigned char *)buf, &len, NULL)) ok = 0; else if (tqsl_initDate(&qso_date, buf)) ok = 0; else if (tqsl_compareDates(date, &qso_date) < 0) ok = 0; } if (ok && date != NULL && !tqsl_isDateNull(date)) { len = sizeof buf-1; if (tqsl_get_cert_ext(x, "QSONotAfterDate", (unsigned char *)buf, &len, NULL)) ok = 0; else if (tqsl_initDate(&qso_date, buf)) ok = 0; else if (tqsl_compareDates(date, &qso_date) > 0) ok = 0; } /* If no check failed, copy this cert onto the new stack */ if (ok) sk_X509_push(newsk, X509_dup(x)); } tqsl_free(cp); return newsk; } /* Set up a read-only BIO from the given file and pass to * tqsl_ssl_load_certs_from_BIO. */ CLIENT_STATIC STACK_OF(X509) * tqsl_ssl_load_certs_from_file(const char *filename) { BIO *in; STACK_OF(X509) *sk; FILE *cfile; tqslTrace("tqsl_ssl_load_certs_from_file", "filename=%s", filename); #ifdef _WIN32 wchar_t* wfilename = utf8_to_wchar(filename); if ((cfile = _wfopen(wfilename, L"r")) == NULL) { free_wchar(wfilename); #else if ((cfile = fopen(filename, "r")) == NULL) { #endif strncpy(tQSL_ErrorFile, filename, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_ssl_load_certs_from_file", "File open error %s", strerror(errno)); return NULL; } #ifdef _WIN32 free(wfilename); #endif if ((in = BIO_new_fp(cfile, 0)) == NULL) { tQSL_Error = TQSL_OPENSSL_ERROR; tqslTrace("tqsl_ssl_load_certs_from_file", "bio_new_fp err %s", tqsl_openssl_error()); return NULL; } sk = tqsl_ssl_load_certs_from_BIO(in); BIO_free(in); fclose(cfile); return sk; } /* Load a set of certs from a file into a stack. The file may contain * other X509 objects (e.g., CRLs), but we'll ignore those. * * Return NULL if there are no certs in the file or on error. */ CLIENT_STATIC STACK_OF(X509) * tqsl_ssl_load_certs_from_BIO(BIO *in) { STACK_OF(X509_INFO) *sk = NULL; STACK_OF(X509) *stack = NULL; X509_INFO *xi; if (tqsl_init()) return NULL; if (!(stack = sk_X509_new_null())) { tqslTrace("tqsl_ssl_load_certs_from_BIO", "bio_new_fp err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } if (!(sk = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL))) { sk_X509_free(stack); tqslTrace("tqsl_ssl_load_certs_from_BIO", "PEM_X509_INFO_read_bio err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } /* Extract the certs from the X509_INFO objects and put them on a stack */ while (sk_X509_INFO_num(sk)) { xi = sk_X509_INFO_shift(sk); if (xi->x509 != NULL) { sk_X509_push(stack, xi->x509); xi->x509 = NULL; } X509_INFO_free(xi); } /* Empty file isn't really an error, is it? if(!sk_X509_num(stack)) { sk_X509_free(stack); stack = NULL; strcpy(tQSL_CustomError, "No certificates found"); tQSL_Error = TQSL_CUSTOM_ERROR; } */ sk_X509_INFO_free(sk); return stack; } /* Chain-verify a cert against a set of CA and a set of trusted root certs. * * Returns NULL if cert verifies, an error message if it does not. */ CLIENT_STATIC const char * tqsl_ssl_verify_cert(X509 *cert, STACK_OF(X509) *cacerts, STACK_OF(X509) *rootcerts, int purpose, int (*cb)(int ok, X509_STORE_CTX *ctx), STACK_OF(X509) **chain) { X509_STORE *store; X509_STORE_CTX *ctx; int rval; const char *errm; if (cert == NULL) { tqslTrace("tqsl_ssl_verify_cert", "No certificate to verify"); return "No certificate to verify"; } if (tqsl_init()) return NULL; store = X509_STORE_new(); if (store == NULL) { tqslTrace("tqsl_ssl_verify_cert", "out of memory"); return "Out of memory"; } if (cb != NULL) X509_STORE_set_verify_cb(store, cb); ctx = X509_STORE_CTX_new(); if (ctx == NULL) { X509_STORE_free(store); tqslTrace("tqsl_ssl_verify_cert", "store_ctx_new out of memory"); return "Out of memory"; } X509_STORE_CTX_init(ctx, store, cert, cacerts); if (cb != NULL) X509_STORE_CTX_set_verify_cb(ctx, cb); if (rootcerts) X509_STORE_CTX_trusted_stack(ctx, rootcerts); if (purpose >= 0) X509_STORE_CTX_set_purpose(ctx, purpose); X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_CB_ISSUER_CHECK); rval = X509_verify_cert(ctx); errm = X509_verify_cert_error_string(X509_STORE_CTX_get_error(ctx)); if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_NOT_YET_VALID) { errm = "This Callsign Certificate cannot be installed as the first date where it is valid is in the future.\nCheck if your computer is set to the proper date.\n\n"; } else if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_HAS_EXPIRED) { errm = "This Callsign Certificate cannot be installed as it has expired.\nCheck if your computer is set to the proper date.\n\n"; } else if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY) { if (cacerts != NULL) { errm = "This Callsign Certificate cannot be installed.\nThe certificate authority certificate cannot be found.\nPlease request a replacement Callsign Certificate.\n\n"; } else { errm = "This Callsign Certificate cannot be installed.\nThe trusted root certificate cannot be found.\nPlease request a replacement Callsign Certificate.\n\n"; } } #if OPENSSL_VERSION_NUMBER < 0x10100000L #define X509_STORE_CTX_get0_chain(o) ((o)->chain) #endif if (chain) { if (rval && X509_STORE_CTX_get0_chain(ctx)) *chain = sk_X509_dup(X509_STORE_CTX_get0_chain(ctx)); else *chain = 0; } X509_STORE_CTX_free(ctx); if (rval) return NULL; if (errm != NULL) { tqslTrace("tqsl_ssl_verify_cert", "err %s", errm); return errm; } return "Verification failed"; } /* [static] - Grab the data from an X509_NAME_ENTRY and put it into * a TQSL_X509_NAME_ITEM object, checking buffer sizes. * * Returns 0 on error, 1 if okay. * * It's okay for the name_buf or value_buf item of the object to * be NULL; it'll just be skipped. */ static int tqsl_get_name_stuff(X509_NAME_ENTRY *entry, TQSL_X509_NAME_ITEM *name_item) { ASN1_OBJECT *obj; ASN1_STRING *value; const char *val; unsigned int len; if (entry == NULL) { tqslTrace("tqsl_get_name_stuff", "entry=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 0; } obj = X509_NAME_ENTRY_get_object(entry); if (obj == NULL) { tqslTrace("tqsl_get_name_stuff", "get_object err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 0; } if (name_item->name_buf != NULL) { len = i2t_ASN1_OBJECT(name_item->name_buf, name_item->name_buf_size, obj); if (len <= 0 || len > strlen(name_item->name_buf)) { tqslTrace("tqsl_get_name_stuff", "len error len= %d need=%d", len, strlen(name_item->name_buf)); tQSL_Error = TQSL_OPENSSL_ERROR; return 0; } } if (name_item->value_buf != NULL) { value = X509_NAME_ENTRY_get_data(entry); val = (const char *)ASN1_STRING_get0_data(value); strncpy(name_item->value_buf, val, name_item->value_buf_size); name_item->value_buf[name_item->value_buf_size-1] = '\0'; if (strlen(val) > strlen(name_item->value_buf)) { tqslTrace("tqsl_get_name_stuff", "len error len= %d need=%d", strlen(val), strlen(name_item->value_buf)); tQSL_Error = TQSL_OPENSSL_ERROR; return 0; } } return 1; } /* Get a name entry from an X509_NAME by its name. */ CLIENT_STATIC int tqsl_get_name_entry(X509_NAME *name, const char *obj_name, TQSL_X509_NAME_ITEM *name_item) { X509_NAME_ENTRY *entry; int num_entries, i; if (tqsl_init()) return 0; num_entries = X509_NAME_entry_count(name); if (num_entries <= 0) return 0; /* Loop through the name entries */ for (i = 0; i < num_entries; i++) { entry = X509_NAME_get_entry(name, i); if (!tqsl_get_name_stuff(entry, name_item)) continue; if (name_item->name_buf != NULL && !strcmp(name_item->name_buf, obj_name)) { /* Found the wanted entry */ return 1; } } return 0; } /* Get a name entry from a cert's subject name by its name. */ CLIENT_STATIC int tqsl_cert_get_subject_name_entry(X509 *cert, const char *obj_name, TQSL_X509_NAME_ITEM *name_item) { X509_NAME *name; if (cert == NULL) return 0; if (tqsl_init()) return 0; if ((name = X509_get_subject_name(cert)) == NULL) return 0; return tqsl_get_name_entry(name, obj_name, name_item); } /* Initialize the tQSL (really OpenSSL) random number generator * Return 0 on error. */ CLIENT_STATIC int tqsl_init_random() { char fname[TQSL_MAX_PATH_LEN]; static int initialized = 0; if (initialized) return 1; if (RAND_file_name(fname, sizeof fname) != NULL) RAND_load_file(fname, -1); initialized = RAND_status(); if (!initialized) { tqslTrace("tqsl_init_random", "init error %s", tqsl_openssl_error()); tQSL_Error = TQSL_RANDOM_ERROR; } return initialized; } /* Generate an RSA key of at least 1024 bits length */ CLIENT_STATIC EVP_PKEY * tqsl_new_rsa_key(int nbits) { EVP_PKEY *pkey; if (nbits < 1024) { tqslTrace("tqsl_new_rsa_key", "nbits too small %d", nbits); tQSL_Error = TQSL_ARGUMENT_ERROR; return NULL; } if ((pkey = EVP_PKEY_new()) == NULL) { tqslTrace("tqsl_new_rsa_key", "EVP_PKEY_new err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } if (!tqsl_init_random()) /* Unable to init RN generator */ return NULL; RSA *rsa = RSA_new(); if (rsa == NULL) { EVP_PKEY_free(pkey); tqslTrace("tqsl_new_rsa_key", "RSA_new err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } BIGNUM *pubexp = BN_new(); if (pubexp == NULL) { EVP_PKEY_free(pkey); RSA_free(rsa); tqslTrace("tqsl_new_rsa_key", "BN_new err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } if (BN_set_word(pubexp, 0x10001) != 1) { EVP_PKEY_free(pkey); RSA_free(rsa); BN_free(pubexp); tqslTrace("tqsl_new_rsa_key", "BN_set_word err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } if (RSA_generate_key_ex(rsa, nbits, pubexp, NULL) != 1) { EVP_PKEY_free(pkey); RSA_free(rsa); BN_free(pubexp); tqslTrace("tqsl_new_rsa_key", "RSA_generate_key err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } if (!EVP_PKEY_assign_RSA(pkey, rsa)) { EVP_PKEY_free(pkey); RSA_free(rsa); BN_free(pubexp); tqslTrace("tqsl_new_rsa_key", "EVP_PKEY_assign_RSA err %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return NULL; } BN_free(pubexp); return pkey; } /* Output an ADIF field to a file descriptor. */ CLIENT_STATIC int tqsl_write_adif_field(FILE *fp, const char *fieldname, char type, const unsigned char *value, int len) { if (fieldname == NULL) /* Silly caller */ return 0; if (fputc('<', fp) == EOF) return 1; if (fputs(fieldname, fp) == EOF) return 1; if (type && type != ' ' && type != '\0') { if (fputc(':', fp) == EOF) return 1; if (fputc(type, fp) == EOF) return 1; } if (value != NULL && len != 0) { if (len < 0) len = strlen((const char *)value); if (fputc(':', fp) == EOF) return 1; fprintf(fp, "%d>", len); if (fwrite(value, 1, len, fp) != (unsigned int) len) return 1; } else if (fputc('>', fp) == EOF) { return 1; } if (fputs("\n\n", fp) == EOF) return 1; return 0; } /* Output an ADIF field to a BIO */ CLIENT_STATIC int tqsl_bio_write_adif_field(BIO *bio, const char *fieldname, char type, const unsigned char *value, int len) { int bret; if (fieldname == NULL) /* Silly caller */ return 0; if ((bret = BIO_write(bio, "<", 1)) <= 0) return 1; if ((bret = BIO_write(bio, fieldname, strlen(fieldname))) <= 0) return 1; if (type && type != ' ' && type != '\0') { if ((bret = BIO_write(bio, ":", 1)) <= 0) return 1; if ((bret = BIO_write(bio, &type, 1)) <= 0) return 1; } if (value != NULL && len != 0) { if (len < 0) len = strlen((const char *)value); if ((bret = BIO_write(bio, ":", 1)) <= 0) return 1; char numbuf[20]; snprintf(numbuf, sizeof numbuf, "%d>", len); if ((bret = BIO_write(bio, numbuf, strlen(numbuf))) <= 0) return 1; if ((bret = BIO_write(bio, value, len)) != len) return 1; } else if ((bret = BIO_write(bio, ">", 1)) <= 0) { return 1; } if ((bret = BIO_write(bio, "\n\n", 2)) <= 0) return 1; return 0; } static int tqsl_self_signed_is_ok(int ok, X509_STORE_CTX *ctx) { if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) return 1; if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_UNTRUSTED) return 1; // OK if root cert has expired if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_HAS_EXPIRED || X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_UNTRUSTED) return 1; return ok; } static int tqsl_expired_is_ok(int ok, X509_STORE_CTX *ctx) { if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_HAS_EXPIRED || X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_UNTRUSTED) return 1; return ok; } static char * tqsl_make_cert_path(const char *filename, char *path, int size) { strncpy(path, tQSL_BaseDir, size); #ifdef _WIN32 strncat(path, "\\certs", size - strlen(path)); wchar_t* wpath = utf8_to_wchar(path); if (MKDIR(wpath, 0700) && errno != EEXIST) { free_wchar(wpath); #else strncat(path, "/certs", size - strlen(path)); if (MKDIR(path, 0700) && errno != EEXIST) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_make_cert_path", "Making path %s failed with %s", path, strerror(errno)); return NULL; } #ifdef _WIN32 free_wchar(wpath); strncat(path, "\\", size - strlen(path)); #else strncat(path, "/", size - strlen(path)); #endif strncat(path, filename, size - strlen(path)); return path; } static int tqsl_clean_call(const char *callsign, char *buf, int size) { if ((static_cast(strlen(callsign))) > size-1) { tQSL_Error = TQSL_BUFFER_ERROR; return 1; } const char *cp; for (cp = callsign; *cp; cp++) { if (!isdigit(*cp) && !isalpha(*cp)) *buf = '_'; else *buf = *cp; ++buf; } *buf = 0; return 0; } static char * tqsl_make_key_path(const char *callsign, char *path, int size) { char fixcall[256]; tqsl_clean_call(callsign, fixcall, sizeof fixcall); strncpy(path, tQSL_BaseDir, size); #ifdef _WIN32 strncat(path, "\\keys", size - strlen(path)); wchar_t* wpath = utf8_to_wchar(path); if (MKDIR(wpath, 0700) && errno != EEXIST) { free_wchar(wpath); #else strncat(path, "/keys", size - strlen(path)); if (MKDIR(path, 0700) && errno != EEXIST) { #endif strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_make_key_path", "Making path %s failed with %s", path, strerror(errno)); return 0; } #ifdef _WIN32 free_wchar(wpath); strncat(path, "\\", size - strlen(path)); #else strncat(path, "/", size - strlen(path)); #endif strncat(path, fixcall, size - strlen(path)); return path; } static char * tqsl_make_backup_path(const char *callsign, char *path, int size) { char fixcall[256]; tqsl_clean_call(callsign, fixcall, sizeof fixcall); strncpy(path, tQSL_BaseDir, size); #ifdef _WIN32 strncat(path, "\\certtrash", size - strlen(path)); wchar_t* wpath = utf8_to_wchar(path); if (MKDIR(wpath, 0700) && errno != EEXIST) { free_wchar(wpath); #else strncat(path, "/certtrash", size - strlen(path)); if (MKDIR(path, 0700) && errno != EEXIST) { #endif strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_make_backup_path", "Making path %s failed with %s", path, strerror(errno)); return 0; } #ifdef _WIN32 free_wchar(wpath); strncat(path, "\\", size - strlen(path)); #else strncat(path, "/", size - strlen(path)); #endif strncat(path, fixcall, size - strlen(path)); return path; } static int tqsl_handle_root_cert(const char *pem, X509 *x, int (*cb)(int, const char *, void *), void *userdata) { const char *cp; /* Verify self-signature on the root certificate */ if ((cp = tqsl_ssl_verify_cert(x, NULL, NULL, 0, &tqsl_self_signed_is_ok)) != NULL) { strncpy(tQSL_CustomError, cp, sizeof tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; tqslTrace("tqsl_handle_root_cert", "sig verify err %s", tQSL_CustomError); return 1; } return tqsl_store_cert(pem, x, "root", TQSL_CERT_CB_ROOT, false, cb, userdata); } static int tqsl_ssl_error_is_nofile() { if (tQSL_Error == TQSL_SYSTEM_ERROR && tQSL_Errno == ENOENT) return 1; return 0; } static int tqsl_handle_ca_cert(const char *pem, X509 *x, int (*cb)(int, const char *, void *), void *userdata) { STACK_OF(X509) *root_sk; char rootpath[TQSL_MAX_PATH_LEN]; const char *cp; tqsl_make_cert_path("root", rootpath, sizeof rootpath); if ((root_sk = tqsl_ssl_load_certs_from_file(rootpath)) == NULL) { if (!tqsl_ssl_error_is_nofile()) { tqslTrace("tqsl_handle_ca_cert", "error not nofile - %d", errno); return 1; } } cp = tqsl_ssl_verify_cert(x, NULL, root_sk, 0, &tqsl_expired_is_ok); sk_X509_free(root_sk); if (cp) { strncpy(tQSL_CustomError, cp, sizeof tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; tqslTrace("tqsl_handle_ca_cert", "verify error %s", tQSL_CustomError); return 1; } return tqsl_store_cert(pem, x, "authorities", TQSL_CERT_CB_CA, false, cb, userdata); } static int tqsl_handle_user_cert(const char *cpem, X509 *x, int (*cb)(int, const char *, void *), void *userdata) { STACK_OF(X509) *root_sk, *ca_sk; char rootpath[TQSL_MAX_PATH_LEN], capath[TQSL_MAX_PATH_LEN]; char pem[sizeof tqsl_static_buf]; const char *cp; strncpy(pem, cpem, sizeof pem); /* Match the public key in the supplied certificate with a * private key in the key store. */ tQSL_ImportSerial = ASN1_INTEGER_get(X509_get_serialNumber(x)); if (cb != NULL) { // Update the "CRL" for this serial number (*cb)(TQSL_CERT_CB_MILESTONE | TQSL_CERT_CB_SERIAL, NULL, userdata); } if (tqsl_find_matching_key(x, NULL, NULL, "", NULL, NULL)) { if (tQSL_Error != TQSL_PASSWORD_ERROR) { tqslTrace("tqsl_handle_user_cert", "match error %s", tqsl_openssl_error()); return 1; } tQSL_Error = TQSL_NO_ERROR; /* clear error */ } /* Check the chain of authority back to a trusted root */ tqsl_make_cert_path("root", rootpath, sizeof rootpath); if ((root_sk = tqsl_ssl_load_certs_from_file(rootpath)) == NULL) { if (!tqsl_ssl_error_is_nofile()) { tqslTrace("tqsl_handle_user_cert", "Error loading certs %s", tqsl_openssl_error()); return 1; } } tqsl_make_cert_path("authorities", capath, sizeof capath); if ((ca_sk = tqsl_ssl_load_certs_from_file(capath)) == NULL) { if (!tqsl_ssl_error_is_nofile()) { sk_X509_free(root_sk); tqslTrace("tqsl_handle_user_cert", "Error loading authorities %s", tqsl_openssl_error()); return 1; } } cp = tqsl_ssl_verify_cert(x, ca_sk, root_sk, 0, &tqsl_expired_is_ok); sk_X509_free(ca_sk); sk_X509_free(root_sk); if (cp) { strncpy(tQSL_CustomError, cp, sizeof tQSL_CustomError); tQSL_Error = TQSL_CUSTOM_ERROR; tqslTrace("tqsl_handle_user_cert", "verify error %s", cp); return 1; } return tqsl_store_cert(pem, x, "user", TQSL_CERT_CB_USER, false, cb, userdata); } CLIENT_STATIC int tqsl_store_cert(const char *pem, X509 *cert, const char *certfile, int type, bool force, int (*cb)(int, const char *, void *), void *userdata) { STACK_OF(X509) *sk; char path[TQSL_MAX_PATH_LEN]; char issuer[256]; char name[256]; char value[256]; FILE *out; BIGNUM *bserial, *oldserial; string subjid, msg, callsign; TQSL_X509_NAME_ITEM item; int len, rval; tQSL_Date newExpires; string stype = "Unknown"; const ASN1_TIME *tm; if (type == TQSL_CERT_CB_ROOT) { stype = "Trusted Root Authority"; } else if (type == TQSL_CERT_CB_CA) { stype = "Certificate Authority"; } else if (type == TQSL_CERT_CB_USER) { stype = "Callsign"; // Invalidate the cached user certs if (xcerts != NULL) { sk_X509_free(xcerts); xcerts = NULL; } } tqsl_make_cert_path(certfile, path, sizeof path); item.name_buf = name; item.name_buf_size = sizeof name; item.value_buf = value; item.value_buf_size = sizeof value; if (tqsl_cert_get_subject_name_entry(cert, "AROcallsign", &item)) { // Subject contains a call sign (probably a user cert) callsign = value; strncpy(ImportCall, callsign.c_str(), sizeof(tQSL_ImportCall)); tQSL_ImportSerial = ASN1_INTEGER_get(X509_get_serialNumber(cert)); subjid = string(" ") + value; tm = X509_get_notAfter(cert); if (tm) { tqsl_get_asn1_date(tm, &newExpires); } else { newExpires.year = 9999; newExpires.month = 1; newExpires.day = 1; } if (tqsl_cert_get_subject_name_entry(cert, "commonName", &item)) subjid += string(" (") + value + ")"; len = sizeof value-1; if (!tqsl_get_cert_ext(cert, "dxccEntity", (unsigned char *)value, &len, NULL)) { value[len] = 0; subjid += string(" DXCC = ") + value; } } else if (tqsl_cert_get_subject_name_entry(cert, "organizationName", &item)) { // Subject contains an organization (probably a CA or root CA cert) subjid = string(" ") + value; if (tqsl_cert_get_subject_name_entry(cert, "organizationalUnitName", &item)) subjid += string(" ") + value; } if (subjid == "") { // If haven't found a displayable subject name we understand, use the raw DN X509_NAME_oneline(X509_get_subject_name(cert), issuer, sizeof issuer); subjid = string(" ") + issuer; } X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof issuer); /* Check for dupes */ if ((sk = tqsl_ssl_load_certs_from_file(path)) == NULL) { if (!tqsl_ssl_error_is_nofile()) { tqslTrace("tqsl_store_cert", "unexpected openssl err %s", tqsl_openssl_error()); return 1; /* Unexpected OpenSSL error */ } } /* Check each certificate */ if (sk != NULL) { int i, n; tQSL_Date expires; bserial = BN_new(); ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), bserial); n = sk_X509_num(sk); for (i = 0; i < n; i++) { char buf[256]; X509 *x; const char *cp; x = sk_X509_value(sk, i); cp = X509_NAME_oneline(X509_get_issuer_name(x), buf, sizeof buf); if (cp != NULL && !strcmp(cp, issuer)) { oldserial = BN_new(); ASN1_INTEGER_to_BN(X509_get_serialNumber(x), oldserial); int result = BN_ucmp(bserial, oldserial); BN_free(oldserial); if (result == 0) break; /* We have a match */ } if (!force && type == TQSL_CERT_CB_USER) { // Don't check for newer certs on restore item.name_buf = name; item.name_buf_size = sizeof name; item.value_buf = value; item.value_buf_size = sizeof value; if (tqsl_cert_get_subject_name_entry(x, "AROcallsign", &item)) { if (value == callsign) { /* * If it's another cert for * this call, is it older? */ tm = X509_get_notAfter(x); if (tm) { tqsl_get_asn1_date(tm, &expires); } else { expires.year = 0; expires.month = 0; expires.day = 0; } if (tqsl_compareDates(&newExpires, &expires) < 0) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "A newer certificate for this callsign is already installed", sizeof tQSL_CustomError); tqslTrace("tqsl_load_cert", tQSL_CustomError); BN_free(bserial); sk_X509_free(sk); return 1; } } } } } BN_free(bserial); sk_X509_free(sk); if (i < n) { /* Have a match -- cert is already in the file */ if (cb != NULL) { int rval; string msg = "Duplicate " + stype + " certificate: " + subjid; rval = (*cb)(TQSL_CERT_CB_RESULT | type | TQSL_CERT_CB_DUPLICATE, msg.c_str(), userdata); if (rval) { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "Duplicate Callsign certificate", sizeof tQSL_CustomError); tqslTrace("tqsl_load_cert", tQSL_CustomError); return 1; } } if (tQSL_Error == 0) { tQSL_Error = TQSL_CERT_ERROR; } return 1; } } /* Cert is not a duplicate. Append it to the certificate file */ if (cb != NULL) { msg = "Adding " + stype + " Certificate for: " + subjid; tqslTrace("tqsl_load_cert", msg.c_str()); rval = (*cb)(TQSL_CERT_CB_MILESTONE | type | TQSL_CERT_CB_PROMPT, msg.c_str(), userdata); if (rval) { tqslTrace("tqsl_load_cert", "operator aborted"); tQSL_Error = TQSL_OPERATOR_ABORT; return 1; } } #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); if ((out = _wfopen(wpath, L"a")) == NULL) { free_wchar(wpath); #else if ((out = fopen(path, "a")) == NULL) { #endif strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_load_cert", "opening file err %s", strerror(errno)); return 1; } #ifdef _WIN32 free_wchar(wpath); #endif // Make sure there's always a newline between certs size_t pemlen = strlen(pem); if (fwrite("\n", 1, 1, out) != 1 || fwrite(pem, 1, pemlen, out) != pemlen) { strncpy(tQSL_ErrorFile, certfile, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_load_cert", "writing file err %s", strerror(errno)); return 1; } if (fclose(out) == EOF) { strncpy(tQSL_ErrorFile, certfile, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_load_cert", "writing file err %s", strerror(errno)); return 1; } msg = "Loaded: " + subjid; if (cb) rval = (*cb)(TQSL_CERT_CB_RESULT | type | TQSL_CERT_CB_LOADED, msg.c_str(), userdata); else rval = 0; if (rval) { tQSL_Error = TQSL_OPERATOR_ABORT; return 1; } strncpy(tQSL_ImportCall, ImportCall, sizeof tQSL_ImportCall); return 0; } static int pw_aborted; static int fixed_password_callback(char *buf, int bufsiz, int verify, void *userdata) { pw_aborted = 0; if (userdata != NULL) strncpy(buf, reinterpret_cast(userdata), bufsiz); else buf[0] = 0; return strlen(buf); } static void *prompt_userdata; static int prompted_password_callback(char *buf, int bufsiz, int verify, void *userfunc) { pw_aborted = 0; if (userfunc != NULL) { int (*cb)(char *, int, void *) = (int (*)(char *, int, void *))userfunc; if ((*cb)(buf, bufsiz, prompt_userdata)) { pw_aborted = 1; return 0; } } else { buf[0] = 0; } return strlen(buf); } static tQSL_ADIF keyf_adif = 0; static int tqsl_open_key_file(const char *path) { if (keyf_adif) tqsl_endADIF(&keyf_adif); return tqsl_beginADIF(&keyf_adif, path); } static int tqsl_read_key(map& fields) { TQSL_ADIF_GET_FIELD_ERROR adif_status; tqsl_adifFieldResults field; static tqsl_adifFieldDefinitions adif_fields[] = { { "PUBLIC_KEY", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "PRIVATE_KEY", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "CALLSIGN", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_PROVIDER", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_PROVIDER_UNIT", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_ADDRESS1", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_ADDRESS2", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_CITY", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_STATE", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_POSTAL", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_COUNTRY", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_DXCC_ENTITY", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_QSO_NOT_BEFORE", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "TQSL_CRQ_QSO_NOT_AFTER", "", TQSL_ADIF_RANGE_TYPE_NONE, 2000, 0, 0, NULL, NULL }, { "DELETED", "", TQSL_ADIF_RANGE_TYPE_NONE, 200, 0, 0, NULL, NULL }, { "eor", "", TQSL_ADIF_RANGE_TYPE_NONE, 0, 0, 0, NULL, NULL }, { "", "", TQSL_ADIF_RANGE_TYPE_NONE, 0, 0, 0, NULL, NULL }, }; fields.clear(); do { if (tqsl_getADIFField(keyf_adif, &field, &adif_status, adif_fields, notypes, &tqsl_static_alloc)) return 1; if (adif_status == TQSL_ADIF_GET_FIELD_EOF) return 1; if (!strcasecmp(field.name, "eor")) return 0; if (adif_status == TQSL_ADIF_GET_FIELD_SUCCESS) { char *cp; for (cp = field.name; *cp; cp++) *cp = toupper(*cp); fields[field.name] = reinterpret_cast(field.data); } } while (adif_status == TQSL_ADIF_GET_FIELD_SUCCESS || adif_status == TQSL_ADIF_GET_FIELD_NO_NAME_MATCH); tQSL_Error = TQSL_ADIF_ERROR; return 1; } static void tqsl_close_key_file(void) { tqsl_endADIF(&keyf_adif); } static int tqsl_replace_key(const char *callsign, const char *path, map& newfields, int (*cb)(int, const char *, void *), void *userdata) { char newpath[TQSL_MAX_PATH_LEN]; char savepath[TQSL_MAX_PATH_LEN]; #ifdef _WIN32 wchar_t* wnewpath = NULL; #endif map fields; vector< map > records; vector< map >::iterator it; EVP_PKEY *new_key = NULL, *key = NULL; BIO *bio = 0; FILE *out = 0; int rval = 1; if ((bio = BIO_new_mem_buf(reinterpret_cast(const_cast(newfields["PUBLIC_KEY"].c_str())), newfields["PUBLIC_KEY"].length())) == NULL) { tqslTrace("tqsl_replace_key", "BIO_new_mem_buf err %s", tqsl_openssl_error()); goto trk_end; } if ((new_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { tqslTrace("tqsl_replace_key", "PEM_read_bio_PUBKEY err %s", tqsl_openssl_error()); goto trk_end; } BIO_free(bio); bio = 0; if (tqsl_open_key_file(path)) { if (tQSL_Error != TQSL_SYSTEM_ERROR || tQSL_Errno != ENOENT) { tqslTrace("tqsl_replace_key", "error opening key file %s: %s", path, strerror(tQSL_Errno)); return 1; } tQSL_Error = TQSL_NO_ERROR; } while (tqsl_read_key(fields) == 0) { vectorseen; bool match = false; for (size_t i = 0; i < seen.size(); i++) { if (seen[i] == fields["PUBLIC_KEY"]) { match = true; break; } } if (match) continue; // Drop dupes seen.push_back(fields["PUBLIC_KEY"]); if ((bio = BIO_new_mem_buf(reinterpret_cast(const_cast(fields["PUBLIC_KEY"].c_str())), fields["PUBLIC_KEY"].length())) == NULL) { tqslTrace("tqsl_replace_key", "BIO_new_mem_buf error %s", tqsl_openssl_error()); goto trk_end; } if ((key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { tqslTrace("tqsl_replace_key", "Pem_read_bio_rsa_pubkey error %s", tqsl_openssl_error()); goto trk_end; } BIO_free(bio); bio = NULL; if (EVP_PKEY_cmp(key, new_key) == 1) { fields["DELETED"] = "True"; // Mark as deleted } records.push_back(fields); } tqsl_close_key_file(); if (newfields["PRIVATE_KEY"] != "") records.push_back(newfields); strncpy(newpath, path, sizeof newpath); strncat(newpath, ".new", sizeof newpath - strlen(newpath)-1); strncpy(savepath, path, sizeof savepath); strncat(savepath, ".save", sizeof savepath - strlen(savepath)-1); #ifdef _WIN32 wnewpath = utf8_to_wchar(newpath); if ((out = _wfopen(wnewpath, TQSL_OPEN_WRITE)) == NULL) { free_wchar(wnewpath); #else if ((out = fopen(newpath, TQSL_OPEN_WRITE)) == NULL) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_replace_key", "open file %s: %s", newpath, strerror(tQSL_Errno)); goto trk_end; } for (it = records.begin(); it != records.end(); it++) { map::iterator mit; for (mit = it->begin(); mit != it->end(); mit++) { if (tqsl_write_adif_field(out, mit->first.c_str(), 0, (const unsigned char *)mit->second.c_str(), -1)) { tqslTrace("tqsl_replace_key", "error writing %s", strerror(tQSL_Errno)); #ifdef _WIN32 free_wchar(wnewpath); #endif goto trk_end; } } tqsl_write_adif_field(out, "eor", 0, NULL, 0); } if (fclose(out) == EOF) { tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_replace_key", "error closing %s", strerror(tQSL_Errno)); #ifdef _WIN32 free_wchar(wnewpath); #endif goto trk_end; } out = 0; /* Output file looks okay. Replace the old file with the new one. */ #ifdef _WIN32 wchar_t* wsavepath = utf8_to_wchar(savepath); if (_wunlink(wsavepath) && errno != ENOENT) { free_wchar(wsavepath); free_wchar(wnewpath); #else if (unlink(savepath) && errno != ENOENT) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_replace_key", "unlink file %s: %s", savepath, strerror(tQSL_Errno)); goto trk_end; } #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); if (_wrename(wpath, wsavepath) && errno != ENOENT) { free_wchar(wpath); free_wchar(wsavepath); free_wchar(wnewpath); #else if (rename(path, savepath) && errno != ENOENT) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_replace_key", "rename file %s->%s: %s", path, savepath, strerror(tQSL_Errno)); goto trk_end; } #ifdef _WIN32 if (_wrename(wnewpath, wpath)) { free_wchar(wnewpath); free_wchar(wpath); free_wchar(wsavepath); #else if (rename(newpath, path)) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_replace_key", "rename file %s->%s: %s", newpath, path, strerror(tQSL_Errno)); goto trk_end; } #ifdef _WIN32 free_wchar(wnewpath); free_wchar(wpath); free_wchar(wsavepath); #endif tqslTrace("tqsl_replace_key", "loaded private key for: %s", callsign); if (cb) { string msg = string("Loaded private key for: ") + callsign; (*cb)(TQSL_CERT_CB_RESULT + TQSL_CERT_CB_PKEY + TQSL_CERT_CB_LOADED, msg.c_str(), userdata); } rval = 0; trk_end: tqsl_close_key_file(); if (out) fclose(out); if (new_key) EVP_PKEY_free(new_key); if (key) EVP_PKEY_free(key); if (bio) BIO_free(bio); return rval; } static int tqsl_unlock_key(const char *pem, EVP_PKEY **keyp, const char *password, int (*cb)(char *, int, void *), void *userdata) { RSA *prsa = NULL; BIO *bio; int (*ssl_cb)(char *, int, int, void *) = NULL; void *cb_user = NULL; long e; int rval = 1; if ((bio = BIO_new_mem_buf(reinterpret_cast(const_cast(pem)), strlen(pem))) == NULL) { tqslTrace("tqsl_unlock_key", "BIO_new_mem_buf err %s", tqsl_openssl_error()); goto err; } if (password != NULL) { ssl_cb = &fixed_password_callback; cb_user = reinterpret_cast(const_cast(password)); } else if (cb != NULL) { prompt_userdata = userdata; ssl_cb = &prompted_password_callback; cb_user = reinterpret_cast(cb); } if ((prsa = PEM_read_bio_RSAPrivateKey(bio, NULL, ssl_cb, cb_user)) == NULL) { tqslTrace("tqsl_unlock_key", "PEM_read_bio_RSAPrivateKey err %s", tqsl_openssl_error()); goto err; } if (keyp != NULL) { if ((*keyp = EVP_PKEY_new()) == NULL) goto err; EVP_PKEY_assign_RSA(*keyp, prsa); prsa = NULL; } rval = 0; goto end; err: e = ERR_peek_error(); if ((ERR_GET_LIB(e) == ERR_LIB_EVP && ERR_GET_REASON(e) == EVP_R_BAD_DECRYPT) #if OPENSSL_VERSION_MAJOR >= 3 || (ERR_GET_LIB(e) == ERR_LIB_PROV && ERR_GET_REASON(e) == PROV_R_BAD_DECRYPT) #endif || (ERR_GET_LIB(e) == ERR_LIB_PEM && ERR_GET_REASON(e) == PEM_R_BAD_PASSWORD_READ) || (ERR_GET_LIB(e) == ERR_LIB_PKCS12 && ERR_GET_REASON(e) == PKCS12_R_PKCS12_CIPHERFINAL_ERROR)) { tqsl_getErrorString(); /* clear error */ tQSL_Error = pw_aborted ? TQSL_OPERATOR_ABORT : TQSL_PASSWORD_ERROR; ERR_clear_error(); #if OPENSSL_VERSION_MAJOR >= 3 // Handle corrupted key } else if (ERR_GET_LIB(e) == ERR_LIB_OSSL_DECODER && ERR_GET_REASON(e) == ERR_R_UNSUPPORTED) { ERR_clear_error(); strncpy(tQSL_ErrorFile, "Private key file is corrupt or the passphrase is incorrect", sizeof tQSL_ErrorFile); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; #endif } else { tQSL_Error = TQSL_OPENSSL_ERROR; } tqslTrace("tqsl_unlock_key", "Key read error %d", tQSL_Error); end: if (prsa != NULL) RSA_free(prsa); if (bio != NULL) BIO_free(bio); return rval; } static int tqsl_find_matching_key(X509 *cert, EVP_PKEY **keyp, TQSL_CERT_REQ **crq, const char *password, int (*cb)(char *, int, void *), void *userdata) { char path[TQSL_MAX_PATH_LEN]; char aro[256]; TQSL_X509_NAME_ITEM item = { path, sizeof path, aro, sizeof aro }; EVP_PKEY *cert_key = NULL; EVP_PKEY *curkey = NULL; int rval = 0; int match = 0; int deleted = 0; BIO *bio = NULL; map fields; bool finddeleted = false; if (keyp != NULL) *keyp = NULL; if (!tqsl_cert_get_subject_name_entry(cert, "AROcallsign", &item)) { tqslTrace("tqsl_find_matching_key", "get subj name err %d", tQSL_Error); return 1; } tQSL_ImportSerial = ASN1_INTEGER_get(X509_get_serialNumber(cert)); if (!tqsl_make_key_path(aro, path, sizeof path)) { tqslTrace("tqsl_find_matching_key", "key path err %d", tQSL_Error); rval = 1; goto end_nokey; } strncpy(ImportCall, aro, sizeof ImportCall); again: if (tqsl_open_key_file(path)) { /* Friendly error for file not found */ if (tQSL_Error == TQSL_SYSTEM_ERROR) { if (tQSL_Errno == ENOENT) { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "You can only open this callsign certificate by running TQSL on the computer where you created the certificate request for %s.", aro); } else { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Can't open %s: %s\nThis file is needed to open this callsign certificate.", aro, strerror(tQSL_Errno)); } tQSL_Error = TQSL_CUSTOM_ERROR; tqslTrace("tqsl_find_matching_key", "opening file path err %s", tQSL_CustomError); } return 1; } if ((cert_key = X509_get_pubkey(cert)) == NULL) { tqslTrace("tqsl_find_matching_key", "error getting public key %s", tqsl_openssl_error()); goto err; } if (crq != NULL) { if (*crq != NULL) tqsl_free_cert_req(*crq, 0); *crq = reinterpret_cast(tqsl_calloc(1, sizeof(TQSL_CERT_REQ))); } while (!tqsl_read_key(fields)) { /* Compare the keys */ if ((bio = BIO_new_mem_buf(reinterpret_cast(const_cast(fields["PUBLIC_KEY"].c_str())), fields["PUBLIC_KEY"].length())) == NULL) { tqslTrace("tqsl_find_matching_key", "BIO_new_mem_buf err %s", tqsl_openssl_error()); goto err; } if ((curkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { tqslTrace("tqsl_find_matching_key", "PEM_read_bio_RSA_PUBKEY err %s", tqsl_openssl_error()); goto err; } BIO_free(bio); bio = NULL; if (EVP_PKEY_cmp(curkey, cert_key) == 1) { if (fields["DELETED"] == "True") { if (finddeleted) { match = 1; deleted = 1; } } else { match = 1; } } if (match) { /* We have a winner */ if (tqsl_unlock_key(fields["PRIVATE_KEY"].c_str(), keyp, password, cb, userdata)) { tqslTrace("tqsl_find_matching_key", "tqsl_unlock_key err %d", tQSL_Error); rval = 1; goto end; } if (crq != NULL) { tQSL_Error = TQSL_BUFFER_ERROR; if (!safe_strncpy((*crq)->providerName, fields["TQSL_CRQ_PROVIDER"].c_str(), sizeof (*crq)->providerName)) goto end; if (!safe_strncpy((*crq)->providerUnit, fields["TQSL_CRQ_PROVIDER_UNIT"].c_str(), sizeof (*crq)->providerUnit)) goto end; if (!safe_strncpy((*crq)->address1, fields["TQSL_CRQ_ADDRESS1"].c_str(), sizeof (*crq)->address1)) goto end; if (!safe_strncpy((*crq)->address2, fields["TQSL_CRQ_ADDRESS2"].c_str(), sizeof (*crq)->address2)) goto end; if (!safe_strncpy((*crq)->city, fields["TQSL_CRQ_CITY"].c_str(), sizeof (*crq)->city)) goto end; if (!safe_strncpy((*crq)->state, fields["TQSL_CRQ_STATE"].c_str(), sizeof (*crq)->state)) goto end; if (!safe_strncpy((*crq)->postalCode, fields["TQSL_CRQ_POSTAL"].c_str(), sizeof (*crq)->postalCode)) goto end; if (!safe_strncpy((*crq)->country, fields["TQSL_CRQ_COUNTRY"].c_str(), sizeof (*crq)->country)) goto end; tQSL_Error = 0; } rval = 0; break; } } if (match) goto end; if (!finddeleted) { finddeleted = true; tqsl_close_key_file(); goto again; } tqslTrace("tqsl_find_matching_key", "No matching private key found"); rval = 1; tQSL_Error = TQSL_CERT_NOT_FOUND; int sts; sts = tqsl_getCertificateStatus(tQSL_ImportSerial); switch (sts) { case TQSL_CERT_STATUS_INV: tQSL_Error |= TQSL_CERT_NOT_FOUND_INVALID; break; case TQSL_CERT_STATUS_SUP: tQSL_Error |= TQSL_CERT_NOT_FOUND_SUPERCEDED; break; case TQSL_CERT_STATUS_EXP: tQSL_Error |= TQSL_CERT_NOT_FOUND_EXPIRED; break; } /* Check for expired */ struct tm *tm; #ifdef _WIN32 __time32_t t = _time32(0); tm = _gmtime32(&t); #else time_t t; t = time(0); struct tm tmr; tm = &tmr; tm = gmtime_r(&t, tm); #endif tQSL_Date d; d.year = tm->tm_year + 1900; d.month = tm->tm_mon + 1; d.day = tm->tm_mday; const ASN1_TIME *ctm; if ((ctm = X509_get_notAfter(cert)) != NULL) { tQSL_Date cert_na; tqsl_get_asn1_date(ctm, &cert_na); if (tqsl_compareDates(&cert_na, &d) < 0) { tQSL_Error |= TQSL_CERT_NOT_FOUND_EXPIRED; } } strncpy(tQSL_ImportCall, ImportCall, sizeof tQSL_ImportCall); goto end; err: rval = 1; tQSL_Error = TQSL_OPENSSL_ERROR; end: tqsl_close_key_file(); if (deleted) { int savedErr = tQSL_Error; tqsl_clear_deleted(aro, path, cert_key); tQSL_Error = savedErr; } end_nokey: if (curkey != NULL) EVP_PKEY_free(curkey); if (bio != NULL) BIO_free(bio); if (cert_key != NULL) EVP_PKEY_free(cert_key); // if (in != NULL) // fclose(in); if (rval == 0) { strncpy(tQSL_ImportCall, ImportCall, sizeof tQSL_ImportCall); } return rval; } static int tqsl_make_key_list(vector< map > & keys) { keys.clear(); string path = tQSL_BaseDir; #ifdef _WIN32 path += "\\keys"; wchar_t* wpath = utf8_to_wchar(path.c_str()); MKDIR(wpath, 0700); #else path += "/keys"; MKDIR(path.c_str(), 0700); #endif #ifdef _WIN32 WDIR *dir = wopendir(wpath); free_wchar(wpath); #else DIR *dir = opendir(path.c_str()); #endif if (dir == NULL) { tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_make_key_list", "Opendir %s error %s", path.c_str(), strerror(errno)); return 1; } #ifdef _WIN32 struct wdirent *ent; #else struct dirent *ent; #endif int rval = 0; int savedError = 0; int savedErrno = 0; char *savedFile = NULL; #ifdef _WIN32 while ((ent = wreaddir(dir)) != NULL) { if (ent->d_name[0] == '.') continue; if (wcsstr(ent->d_name, L".save") || wcsstr(ent->d_name, L".new")) continue; char dname[TQSL_MAX_PATH_LEN]; wcstombs(dname, ent->d_name, TQSL_MAX_PATH_LEN); string filename = path + "\\" + dname; #else while ((ent = readdir(dir)) != NULL) { if (ent->d_name[0] == '.') continue; if (strstr(ent->d_name, ".save") || strstr(ent->d_name, ".new")) continue; string filename = path + "/" + ent->d_name; #endif char fixcall[256]; #ifdef _WIN32 struct _stat32 s; wchar_t* wfilename = utf8_to_wchar(filename.c_str()); if (_wstat32(wfilename, &s) == 0) { if (S_ISDIR(s.st_mode)) { free_wchar(wfilename); continue; // If it's a directory, skip it. } } #else struct stat s; if (stat(filename.c_str(), &s) == 0) { if (S_ISDIR(s.st_mode)) continue; // If it's a directory, skip it. } #endif if (!tqsl_open_key_file(filename.c_str())) { vectorseen; map fields; while (!tqsl_read_key(fields)) { if (fields["DELETED"] == "True") continue; // Skip this one bool match = false; for (size_t i = 0; i < seen.size(); i++) { if (seen[i] == fields["PUBLIC_KEY"]) { match = true; break; } } if (match) continue; seen.push_back(fields["PUBLIC_KEY"]); if (tqsl_clean_call(fields["CALLSIGN"].c_str(), fixcall, sizeof fixcall)) { rval = 1; savedError = tQSL_Error; savedErrno = tQSL_Errno; if (savedFile) free(savedFile); savedFile = strdup(tQSL_ErrorFile); continue; // Keep looking for keys } #ifdef _WIN32 wchar_t* wfixcall = utf8_to_wchar(fixcall); if (wcscmp(wfixcall, ent->d_name)) { free_wchar(wfixcall); #else if (strcasecmp(fixcall, ent->d_name)) { #endif continue; } keys.push_back(fields); } tqsl_close_key_file(); } else { rval = 1; // Unable to open - remember that savedErrno = tQSL_Errno; savedError = tQSL_Error; if (savedFile) free(savedFile); savedFile = strdup(tQSL_ErrorFile); } } #ifdef _WIN32 _wclosedir(dir); #else closedir(dir); #endif if (rval) { tQSL_Error = savedError; tQSL_Errno = savedErrno; if (savedFile) { strncpy(tQSL_ErrorFile, savedFile, sizeof tQSL_ErrorFile); free(savedFile); } tqslTrace("tqsl_make_key_list", "error %s %s", tQSL_ErrorFile, strerror(tQSL_Errno)); } return rval; } static int tqsl_get_cert_ext(X509 *cert, const char *ext, unsigned char *userbuf, int *buflen, int *crit) { int i, n, datasiz; X509_EXTENSION *xe; char buf[256]; ASN1_OBJECT *obj; ASN1_OCTET_STRING *data; if (tqsl_init()) return 1; if (cert == NULL || ext == NULL || userbuf == NULL || buflen == NULL) { tqslTrace("tqsl_get_cert_ext", "arg error cert=0x%lx, ext=0x%lx userbuf=0x%lx, buflen=0x%lx crit=0x%lx", cert, ext, userbuf, buflen, crit); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } n = X509_get_ext_count(cert); for (i = 0; i < n; i++) { xe = X509_get_ext(cert, i); if (xe == NULL) { tqslTrace("tqsl_get_cert_ext", "X509_get_ext error %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } buf[0] = '\0'; obj = X509_EXTENSION_get_object(xe); if (obj) OBJ_obj2txt(buf, sizeof buf, obj, 0); if (strcmp(buf, ext)) continue; /* This is the desired extension */ data = X509_EXTENSION_get_data(xe); if (data != NULL) { datasiz = ASN1_STRING_length(data); if (datasiz > *buflen-1) { tqslTrace("tqsl_get_cert_ext", "buffer len %d needed %d", *buflen, datasiz); tQSL_Error = TQSL_BUFFER_ERROR; return 1; } *buflen = datasiz; if (datasiz) memcpy(userbuf, ASN1_STRING_get0_data(data), datasiz); userbuf[datasiz] = '\0'; } if (crit != NULL) *crit = X509_EXTENSION_get_critical(xe); return 0; } snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Certificate Extension not found: %s", ext); tQSL_Error = TQSL_CUSTOM_ERROR; if (strcmp(ext, "supercededCertificate")) tqslTrace("tqsl_get_cert_ext", "Err %s", tQSL_CustomError); return 1; } CLIENT_STATIC int tqsl_get_asn1_date(const ASN1_TIME *tm, tQSL_Date *date) { char *v; int i; i = tm->length; v = reinterpret_cast(tm->data); if (i >= 14) { for (i = 0; i < 12; i++) if ((v[i] > '9') || (v[i] < '0')) goto err; date->year = (v[0]-'0')*1000+(v[1]-'0')*100 + (v[2]-'0')*10+(v[3]-'0'); date->month = (v[4]-'0')*10+(v[5]-'0'); if ((date->month > 12) || (date->month < 1)) goto err; date->day = (v[6]-'0')*10+(v[7]-'0'); } else if (i < 12) { goto err; } else { for (i = 0; i < 10; i++) if ((v[i] > '9') || (v[i] < '0')) goto err; date->year = (v[0]-'0')*10+(v[1]-'0'); if (date->year < 50) date->year+=100; date->year += 1900; date->month = (v[2]-'0')*10+(v[3]-'0'); if ((date->month > 12) || (date->month < 1)) goto err; date->day = (v[4]-'0')*10+(v[5]-'0'); } return 0; err: tqslTrace("tqsl_get_asn1_date", "invalid date"); tQSL_Error = TQSL_INVALID_DATE; return 1; } static char * tqsl_sign_base64_data(tQSL_Cert cert, char *b64data) { int len; static unsigned char sig[256]; int siglen = sizeof sig; if (b64data && !strncmp(b64data, "-----", 5)) { b64data = strchr(b64data, '\n'); if (b64data == NULL) return NULL; b64data++; } len = sizeof tqsl_static_buf; if (tqsl_decodeBase64(b64data, tqsl_static_buf, &len)) return NULL; if (tqsl_signDataBlock(cert, tqsl_static_buf, len, sig, &siglen)) return NULL; if (tqsl_encodeBase64(sig, siglen, reinterpret_cast(tqsl_static_buf), sizeof tqsl_static_buf)) return NULL; return reinterpret_cast(tqsl_static_buf); } static bool safe_strncpy(char *dest, const char *src, int size) { strncpy(dest, src, size); dest[size-1] = 0; return ((static_cast((strlen(src))) < size)); } static string tqsl_cert_status_filename(const char *f = "cert_status.xml") { string s = tQSL_BaseDir; #ifdef _WIN32 s += "\\"; #else s += "/"; #endif s += f; return s; } static int tqsl_load_cert_status_data(XMLElement &xel) { int status = xel.parseFile(tqsl_cert_status_filename().c_str()); if (status) { if (errno == ENOENT) { // No file is OK tqslTrace("tqsl_load_cert_status_data", "FNF"); return 0; } strncpy(tQSL_ErrorFile, tqsl_cert_status_filename().c_str(), sizeof tQSL_ErrorFile); if (status == XML_PARSE_SYSTEM_ERROR) { tQSL_Error = TQSL_FILE_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_load_cert_status_data", "open error %s: %s", tqsl_cert_status_filename().c_str(), strerror(tQSL_Errno)); } else { tqslTrace("tqsl_load_cert_status_data", "syntax error %s", tqsl_cert_status_filename().c_str()); tQSL_Error = TQSL_FILE_SYNTAX_ERROR; } return 1; } return status; } static int tqsl_dump_cert_status_data(XMLElement &xel) { ofstream out; string fn = tqsl_cert_status_filename(); out.exceptions(std::ios::failbit | std::ios::eofbit | std::ios::badbit); try { #ifdef _WIN32 wchar_t* wfn = utf8_to_wchar(fn.c_str()); out.open(wfn); free_wchar(wfn); #else out.open(fn.c_str()); #endif out << xel << endl; out.close(); } catch(exception& x) { tQSL_Error = TQSL_CUSTOM_ERROR; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Error writing certificate status file (%s): %s/%s", fn.c_str(), x.what(), strerror(errno)); tqslTrace("tqsl_dump_cert_status_data", "write error %s", tQSL_CustomError); return 1; } return 0; } DLLEXPORT int CALLCONVENTION tqsl_getCertificateStatus(long serial) { XMLElement top_el; if (tqsl_load_cert_status_data(top_el)) return TQSL_CERT_STATUS_UNK; XMLElement sfile; if (top_el.getFirstElement(sfile)) { XMLElement cd; bool ok = sfile.getFirstElement("Cert", cd); while (ok && cd.getElementName() == "Cert") { pair s = cd.getAttribute("serial"); if (s.second && strtol(s.first.c_str(), NULL, 10) == serial) { XMLElement xs; if (cd.getFirstElement("status", xs)) { if (!strcasecmp(xs.getText().c_str(), "Bad serial")) return TQSL_CERT_STATUS_INV; else if (!strcasecmp(xs.getText().c_str(), "Superceded")) return TQSL_CERT_STATUS_SUP; else if (!strcasecmp(xs.getText().c_str(), "Expired")) return TQSL_CERT_STATUS_EXP; else if (!strcasecmp(xs.getText().c_str(), "Unrevoked")) return TQSL_CERT_STATUS_OK; else return TQSL_CERT_STATUS_UNK; } } ok = sfile.getNextElement(cd); } } return TQSL_CERT_STATUS_UNK; } DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus(long serial, const char *status) { if (status == NULL) { tqslTrace("tqsl_setCertificateStatus", "status=null"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } char sstr[32]; snprintf(sstr, sizeof sstr, "%ld", serial); XMLElement top_el; int stat = tqsl_load_cert_status_data(top_el); if (stat == TQSL_FILE_SYSTEM_ERROR) { tqslTrace("tqsl_setCertificateStatus", "error %d", tQSL_Error); return 1; } XMLElement sfile; if (!top_el.getFirstElement(sfile)) sfile.setElementName("CertStatus"); XMLElementList& ellist = sfile.getElementList(); bool exists = false; XMLElementList::iterator ep; for (ep = ellist.find("Cert"); ep != ellist.end(); ep++) { if (ep->first != "Cert") break; pair rval = ep->second->getAttribute("serial"); if (rval.second && strtol(rval.first.c_str(), NULL, 10) == serial) { exists = true; break; } } XMLElement *cs = new XMLElement("Cert"); cs->setPretext("\n "); XMLElement *se = new XMLElement; se->setPretext(cs->getPretext() + " "); se->setElementName("status"); se->setText(status); cs->addElement(se); cs->setAttribute("serial", sstr); cs->setText("\n "); if (exists) ellist.erase(ep); sfile.addElement(cs); sfile.setText("\n"); return tqsl_dump_cert_status_data(sfile); } static int tqsl_clear_deleted(const char *callsign, const char *path, EVP_PKEY *cert_key) { char newpath[TQSL_MAX_PATH_LEN]; char savepath[TQSL_MAX_PATH_LEN]; #ifdef _WIN32 wchar_t* wnewpath = NULL; #endif map fields; vector< map > records; vector< map >::iterator it; EVP_PKEY *new_key = NULL, *key = NULL; BIO *bio = 0; FILE *out = 0; int rval = 1; if (tqsl_open_key_file(path)) { if (tQSL_Error != TQSL_SYSTEM_ERROR || tQSL_Errno != ENOENT) { tqslTrace("tqsl_clear_deleted", "error opening key file %s: %s", path, strerror(tQSL_Errno)); return 1; } tQSL_Error = TQSL_NO_ERROR; } while (tqsl_read_key(fields) == 0) { if ((bio = BIO_new_mem_buf(reinterpret_cast(const_cast(fields["PUBLIC_KEY"].c_str())), fields["PUBLIC_KEY"].length())) == NULL) { tqslTrace("tqsl_clear_deleted", "BIO_new_mem_buf error %s", tqsl_openssl_error()); goto trk_end; } if ((key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { tqslTrace("tqsl_clear_deleted", "Pem_read_bio_rsa_pubkey error %s", tqsl_openssl_error()); goto trk_end; } BIO_free(bio); bio = NULL; if (EVP_PKEY_cmp(key, cert_key) == 1) { fields["DELETED"] = "False"; } records.push_back(fields); } tqsl_close_key_file(); strncpy(newpath, path, sizeof newpath); strncat(newpath, ".new", sizeof newpath - strlen(newpath)-1); strncpy(savepath, path, sizeof savepath); strncat(savepath, ".save", sizeof savepath - strlen(savepath)-1); #ifdef _WIN32 wnewpath = utf8_to_wchar(newpath); if ((out = _wfopen(wnewpath, TQSL_OPEN_WRITE)) == NULL) { free_wchar(wnewpath); #else if ((out = fopen(newpath, TQSL_OPEN_WRITE)) == NULL) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_clear_deleted", "open file %s: %s", newpath, strerror(tQSL_Errno)); goto trk_end; } for (it = records.begin(); it != records.end(); it++) { map::iterator mit; for (mit = it->begin(); mit != it->end(); mit++) { if (tqsl_write_adif_field(out, mit->first.c_str(), 0, (const unsigned char *)mit->second.c_str(), -1)) { tqslTrace("tqsl_clear_deleted", "error writing %s", strerror(tQSL_Errno)); #ifdef _WIN32 free_wchar(wnewpath); #endif goto trk_end; } } tqsl_write_adif_field(out, "eor", 0, NULL, 0); } if (fclose(out) == EOF) { tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_clear_deleted", "error closing %s", strerror(tQSL_Errno)); #ifdef _WIN32 free_wchar(wnewpath); #endif goto trk_end; } out = 0; /* Output file looks okay. Replace the old file with the new one. */ #ifdef _WIN32 wchar_t* wsavepath = utf8_to_wchar(savepath); if (_wunlink(wsavepath) && errno != ENOENT) { free_wchar(wsavepath); free_wchar(wnewpath); #else if (unlink(savepath) && errno != ENOENT) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_clear_deleted", "unlink file %s: %s", savepath, strerror(tQSL_Errno)); goto trk_end; } #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); if (_wrename(wpath, wsavepath) && errno != ENOENT) { free_wchar(wpath); free_wchar(wsavepath); free_wchar(wnewpath); #else if (rename(path, savepath) && errno != ENOENT) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_clear_deleted", "rename file %s->%s: %s", path, savepath, strerror(tQSL_Errno)); goto trk_end; } #ifdef _WIN32 if (_wrename(wnewpath, wpath)) { free_wchar(wnewpath); free_wchar(wpath); free_wchar(wsavepath); #else if (rename(newpath, path)) { #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_clear_deleted", "rename file %s->%s: %s", newpath, path, strerror(tQSL_Errno)); goto trk_end; } #ifdef _WIN32 free_wchar(wnewpath); free_wchar(wpath); free_wchar(wsavepath); #endif rval = 0; trk_end: tqsl_close_key_file(); if (out) fclose(out); if (new_key) EVP_PKEY_free(new_key); if (key) EVP_PKEY_free(key); if (bio) BIO_free(bio); return rval; } static int tqsl_key_exists(const char *callsign, EVP_PKEY *cert_key) { map fields; vector< map >::iterator it; EVP_PKEY *key = NULL; BIO *bio = 0; int rval = 0; char path[TQSL_MAX_PATH_LEN]; if (!tqsl_make_key_path(callsign, path, sizeof path)) { tqslTrace("tqsl_createCertRequest", "make_key_path error %d", errno); return 0; } if (tqsl_open_key_file(path)) { return 0; } while (tqsl_read_key(fields) == 0) { if ((bio = BIO_new_mem_buf(reinterpret_cast(const_cast(fields["PUBLIC_KEY"].c_str())), fields["PUBLIC_KEY"].length())) == NULL) { tqslTrace("tqsl_clear_deleted", "BIO_new_mem_buf error %s", tqsl_openssl_error()); goto trk_end; } if ((key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) { tqslTrace("tqsl_clear_deleted", "Pem_read_bio_rsa_pubkey error %s", tqsl_openssl_error()); goto trk_end; } BIO_free(bio); bio = NULL; if (EVP_PKEY_cmp(key, cert_key) == 1) { rval = 1; } } trk_end: tqsl_close_key_file(); if (key) EVP_PKEY_free(key); if (bio) BIO_free(bio); return rval; } /** Save the json results for a given callsign location Detail. */ DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo(const char *callsign, const char *json) { FILE *out; if (callsign == NULL) { tqslTrace("tqsl_saveCallsinLocationInfo", "arg error callsign=0x%lx, json=0x%lx", callsign, json); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } char fixcall[256]; char path[TQSL_MAX_PATH_LEN]; size_t size = sizeof path; #ifdef _WIN32 wchar_t* wfilename; #endif tqsl_clean_call(callsign, fixcall, sizeof fixcall); strncpy(path, tQSL_BaseDir, size); #ifdef _WIN32 strncat(path, "\\", size - strlen(path)); #else strncat(path, "/", size - strlen(path)); #endif strncat(path, fixcall, size - strlen(path)); strncat(path, ".json", size - strlen(path)); if (json == NULL) { // Delete the file #ifdef _WIN32 wfilename = utf8_to_wchar(path); _wunlink(wfilename); free_wchar(wfilename); #else unlink(path); #endif return 0; } /* Try opening the output stream */ #ifdef _WIN32 wfilename = utf8_to_wchar(path); if ((out = _wfopen(wfilename, TQSL_OPEN_WRITE)) == NULL) { free_wchar(wfilename); #else if ((out = fopen(path, TQSL_OPEN_WRITE)) == NULL) { #endif strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tqslTrace("tqsl_saveCallsignLocationInfo", "Open file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; return 1; } #ifdef _WIN32 free_wchar(wfilename); #endif if (fputs(json, out) == EOF) { strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tqslTrace("tqsl_createCertRequest", "Write request file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; return 1; } if (fclose(out) == EOF) { strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_saveCallsignLocationInfo", "write error %d", errno); return 1; } return 0; } /** Retrieve the json results for a given callsign location Detail. */ DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo(const char *callsign, char **buf) { FILE *in; static void* mybuf = NULL; static size_t bufsize = 0; if (bufsize == 0) { bufsize = 4096; mybuf = tqsl_malloc(bufsize); } if (callsign == NULL || buf == NULL) { tqslTrace("tqsl_getCallsinLocationInfo", "arg error callsign=0x%lx, buf=0x%lx", callsign, buf); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } char fixcall[256]; char path[TQSL_MAX_PATH_LEN]; size_t size = sizeof path; tqsl_clean_call(callsign, fixcall, sizeof fixcall); strncpy(path, tQSL_BaseDir, size); #ifdef _WIN32 strncat(path, "\\", size - strlen(path)); #else strncat(path, "/", size - strlen(path)); #endif strncat(path, fixcall, size - strlen(path)); strncat(path, ".json", size - strlen(path)); size_t buflen = bufsize; #ifdef _WIN32 struct _stat32 s; wchar_t* wfilename = utf8_to_wchar(path); if (_wstat32(wfilename, &s) == 0) { buflen = s.st_size + 512; } if ((in = _wfopen(wfilename, TQSL_OPEN_READ)) == NULL) { free_wchar(wfilename); #else struct stat s; if (stat(path, &s) == 0) { buflen = s.st_size + 512; } if ((in = fopen(path, TQSL_OPEN_READ)) == NULL) { #endif strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tqslTrace("tqsl_getCallsignLocationInfo", "Open file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; return 1; } #ifdef _WIN32 free_wchar(wfilename); #endif if (buflen > bufsize) { bufsize = buflen + 512; mybuf = tqsl_realloc(mybuf, bufsize); } *buf = reinterpret_cast(mybuf); size_t len; if ((len = fread(mybuf, 1, buflen, in)) == 0) { strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tqslTrace("tqsl_getCallsignLocationInformation", "Read file - system error %s", strerror(errno)); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; return 1; } if (fclose(in) == EOF) { strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; tqslTrace("tqsl_getCallsignLocationInformation", "read error %d", errno); return 1; } if (len < buflen) { char *t = reinterpret_cast(mybuf); t[len] = '\0'; } return 0; } tqsl-2.8.1/src/openssl_cert.h0000644000175000017500000001162215003421124016135 0ustar rmurphyrmurphy/*************************************************************************** openssl_cert.h - description ------------------- begin : Tue May 14 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef OPENSSL_CERT_H #define OPENSSL_CERT_H /** \file * OpenSSL X509 certificate interface functions. */ #include #if (OPENSSL_VERSION_NUMBER == 0x10000003L) /* broken header file - fix by override */ #define i2d_ASN1_SET i2d_ASN1_SET_buggy #define d2i_ASN1_SET d2i_ASN1_SET_buggy #define ASN1_seq_unpack ASN1_seq_unpack_buggy #define ASN1_seq_pack ASN1_seq_pack_buggy #include #undef i2d_ASN1_SET #undef d2i_ASN1_SET #undef ASN1_seq_unpack #undef ASN1_seq_pack #ifdef __cplusplus extern "C" { #endif int i2d_ASN1_SET(void *a, unsigned char **pp, i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); void *d2i_ASN1_SET(void *a, const unsigned char **pp, long length, d2i_of_void *d2i, void (*free_func)(void*), int ex_tag, // NOLINT(readability/casting) int ex_class); void *ASN1_seq_unpack(const unsigned char *buf, int len, d2i_of_void *d2i, void (*free_func)(void* dummy)); unsigned char *ASN1_seq_pack(void *safes, i2d_of_void *i2d, unsigned char **buf, int *len); #ifdef __cplusplus } #endif #endif /* buggy openssl header */ #include #include #undef CLIENT_STATIC #ifndef LOTW_SERVER #define CLIENT_STATIC static #else #define CLIENT_STATIC #endif typedef STACK_OF(X509) TQSL_X509_STACK; typedef struct { char *name_buf; int name_buf_size; char *value_buf; int value_buf_size; } TQSL_X509_NAME_ITEM; namespace tqsllib { typedef enum { ROOTCERT = 0, CACERT, USERCERT } certtype; int tqsl_import_cert(const char *cert, certtype type, int(*cb)(int, const char *, void *), void *); int tqsl_get_pem_serial(const char *pem, long *serial); } // namespace tqsllib #if defined(LOTW_SERVER) || defined(OPENSSL_CERT_SOURCE) #ifdef __cplusplus extern "C" { #endif /// Loads a stack of certificates from the caller-supplied BIO /** See the OpenSSL documentation for background on BIO operations. * * Returns a pointer to an OpenSSL X509 stack, as used by * tqsl_ssl_verify_cert() */ CLIENT_STATIC TQSL_X509_STACK *tqsl_ssl_load_certs_from_BIO(BIO *in); /// Loads a stack of certificates from a file /** See tqsl_ssl_load_certs_from_BIO() */ CLIENT_STATIC TQSL_X509_STACK *tqsl_ssl_load_certs_from_file(const char *filename); /// Verifies a certificate using stacks of certificates /** The user supplies the X509 certificate to verify (the test certificate) * along with two stacks of certificates. The \c cacerts stack is a list * of certificates, one of which was used to sign the test certificate. * The \c rootcerts are considered "trusted." One of them must have been used * to sign either the test certificate itself or the CA cert that signed * the test certificate. * * Returns NULL if the test certificate is valid, otherwise returns an error message. */ CLIENT_STATIC const char *tqsl_ssl_verify_cert(X509 *cert, TQSL_X509_STACK *cacerts, TQSL_X509_STACK *rootcerts, int purpose, int (*cb)(int ok, X509_STORE_CTX *ctx), TQSL_X509_STACK **chain = 0); /// Retrieve a name entry from an X509 name object by name CLIENT_STATIC int tqsl_get_name_entry(X509_NAME *name, const char *obj_name, TQSL_X509_NAME_ITEM *name_item); /// Retrieve a name entry from an X509 cert's subject name by name CLIENT_STATIC int tqsl_cert_get_subject_name_entry(X509 *cert, const char *obj_name, TQSL_X509_NAME_ITEM *name_item); /// Convert an ASN date CLIENT_STATIC int tqsl_get_asn1_date(const ASN1_TIME *tm, tQSL_Date *date); /// Filter a list (stack) of certs based on (optional) call sign, qso date and issuer criteria /** Returns a (possibly empty) stack of certificates that match the criteria. Returns NULL * on error. * * The returned stack contains \em copies of the certs from the input stack. The input * stack is not altered. */ CLIENT_STATIC TQSL_X509_STACK *tqsl_filter_cert_list(TQSL_X509_STACK *sk, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int isvalid); CLIENT_STATIC EVP_PKEY *tqsl_new_rsa_key(int nbits); CLIENT_STATIC int tqsl_store_cert(const char *pem, X509 *cert, const char *certfile, int type, bool force, int (*cb)(int, const char *, void *), void *); CLIENT_STATIC int tqsl_write_adif_field(FILE *fp, const char *fieldname, char type, const unsigned char *value, int len); CLIENT_STATIC int tqsl_bio_write_adif_field(BIO *bio, const char *fieldname, char type, const unsigned char *value, int len); #ifdef __cplusplus } #endif #endif /* defined(LOTW_SERVER) || defined(OPENSSL_CERT_SOURCE) */ #endif /* OPENSSL_CERT_H */ tqsl-2.8.1/src/station_loc.cpp0000644000175000017500000000552315003421124016311 0ustar rmurphyrmurphy/*************************************************************************** station_loc.cpp - description ------------------- begin : Sat Dec 14 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "sysconfig.h" #endif #include #include #include #include #include "tqsllib.h" #include "tqslexc.h" using std::string; using std::ios; using std::cerr; using std::cout; using std::endl; int usage() { cerr << "Usage: station_loc callsign [dxcc]" << endl; exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { try { string call, dxcc; if (argc < 2) usage(); call = argv[1]; if (argc > 2) dxcc = argv[2]; if (tqsl_init()) throw tqslexc(); tQSL_Location loc; if (tqsl_initStationLocationCapture(&loc)) throw tqslexc(); if (tqsl_setStationLocationCapturePage(loc, 1)) throw tqslexc(); // We know that the first field of page 1 is always call and the 2nd is DXCC int nfield; tqsl_getNumLocationFieldListItems(loc, 0, &nfield); int i; for (i = 0; i < nfield; i++) { char buf[256]; if (tqsl_getLocationFieldListItem(loc, 0, i, buf, sizeof buf)) throw tqslexc(); if (!strcasecmp(buf, call.c_str())) break; } if (i == nfield) throw myexc(string("Can't init station location for call = ") + call); if (tqsl_setLocationFieldIndex(loc, 0, i)) throw tqslexc(); if (tqsl_updateStationLocationCapture(loc)) throw tqslexc(); if (dxcc != "") { int nfield; tqsl_getNumLocationFieldListItems(loc, 1, &nfield); //cerr << nfield << endl; for (i = 0; i < nfield; i++) { char buf[256]; if (tqsl_setLocationFieldIndex(loc, 1, i)) throw tqslexc(); if (tqsl_getLocationFieldCharData(loc, 1, buf, sizeof buf)) throw tqslexc(); //cerr << buf << endl; if (!strcasecmp(buf, dxcc.c_str())) break; } if (i == nfield) throw myexc(string("Can't init location for DXCC = ") + dxcc); if (tqsl_setLocationFieldIndex(loc, 1, i)) throw tqslexc(); } int dxcc_idx; if (tqsl_getLocationFieldIndex(loc, 1, &dxcc_idx)) throw tqslexc(); char buf[256]; if (tqsl_getLocationFieldListItem(loc, 1, dxcc_idx, buf, sizeof buf)) throw tqslexc(); string lname = call + "_auto"; if (tqsl_setStationLocationCaptureName(loc, lname.c_str())) throw tqslexc(); if (tqsl_saveStationLocationCapture(loc, 1)) throw tqslexc(); tqsl_endStationLocationCapture(&loc); cout << "Wrote station location for " << call << " - " << buf << endl; } catch(exception& x) { cerr << "Aborted: " << x.what() << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } tqsl-2.8.1/src/tqslconvert.cpp0000644000175000017500000021157515003421124016365 0ustar rmurphyrmurphy/*************************************************************************** tqslconvert.cpp - description ------------------- begin : Sun Nov 17 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #define TQSLLIB_DEF #include "tqslconvert.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tqslerrno.h" #include "tqsllib.h" //#include #ifndef _WIN32 #include #include #else #include #include "windirent.h" #endif #include "winstrdefs.h" using std::set; using std::string; using std::vector; using std::sort; using std::map; static bool checkCallSign(const string& call); namespace tqsllib { class TQSL_CONVERTER { public: TQSL_CONVERTER(); ~TQSL_CONVERTER(); void clearRec(); int sentinel; // FILE *file; tQSL_ADIF adif; tQSL_Cabrillo cab; tQSL_Cert *certs; int ncerts; tQSL_Location loc; TQSL_QSO_RECORD rec; bool rec_done; int cert_idx; int next_cert_uid; int cert_uid; int loc_uid; bool need_station_rec; int *cert_uids; bool allow_bad_calls; set modes; set bands; set propmodes; set satellites; string rec_text; tQSL_Date start, end; int location_handling; bool db_open; sqlite3 *seendb; sqlite3_stmt *bulk_read; bool txn; char *dbpath; FILE* errfile; char serial[512]; char callsign[64]; bool allow_dupes; bool ignore_secs; bool ignore_calls; bool need_ident_rec; bool dupes_only; char *appName; int dxcc; bool newstation; map taglines; int err_tag_line; }; #if !defined(__APPLE__) && !defined(_WIN32) && !defined(__clang__) #pragma GCC diagnostic ignored "-Wformat-truncation" #endif inline TQSL_CONVERTER::TQSL_CONVERTER() : sentinel(0x4445) { // file = 0; adif = 0; cab = 0; cert_idx = -1; dxcc = -1; loc_uid = 0; cert_uid = 0; next_cert_uid = 1; cert_uids = NULL; need_station_rec = false; rec_done = true; allow_bad_calls = false; location_handling = TQSL_LOC_UPDATE; allow_dupes = true; //by default, don't change existing behavior (also helps with commit) ignore_secs = false; // Use full time ignore_calls = false; // Use calls in adif file dupes_only = false; // Not just writing tracking records memset(&rec, 0, sizeof rec); memset(&start, 0, sizeof start); memset(&end, 0, sizeof end); db_open = false; seendb = NULL; bulk_read = NULL; txn = false; dbpath = NULL; errfile = NULL; memset(&serial, 0, sizeof serial); memset(&callsign, 0, sizeof callsign); appName = NULL; need_ident_rec = true; err_tag_line = 0; // Init the band data const char *val; int n = 0; tqsl_getNumBand(&n); for (int i = 0; i < n; i++) { val = 0; tqsl_getBand(i, &val, 0, 0, 0); if (val) bands.insert(val); } // Init the mode data n = 0; tqsl_getNumMode(&n); for (int i = 0; i < n; i++) { val = 0; tqsl_getMode(i, &val, 0); if (val) modes.insert(val); } // Init the propagation mode data n = 0; tqsl_getNumPropagationMode(&n); for (int i = 0; i < n; i++) { val = 0; tqsl_getPropagationMode(i, &val, 0); if (val) propmodes.insert(val); } // Init the satellite data n = 0; tqsl_getNumSatellite(&n); for (int i = 0; i < n; i++) { val = 0; tqsl_getSatellite(i, &val, 0, 0, 0); if (val) satellites.insert(val); } } inline TQSL_CONVERTER::~TQSL_CONVERTER() { clearRec(); // if (file) // fclose(file); tqsl_endADIF(&adif); if (cert_uids) delete[] cert_uids; sentinel = 0; } inline void TQSL_CONVERTER::clearRec() { memset(&rec, 0, sizeof rec); rec_text = ""; err_tag_line = 0; } #define CAST_TQSL_CONVERTER(x) ((tqsllib::TQSL_CONVERTER *)(x)) } // namespace tqsllib using tqsllib::TQSL_CONVERTER; template static void add_to_container(const char *str, size_t len, void *data) { Container *cont = static_cast(data); cont->push_back(string(str, len)); } typedef void(*split_fn)(const char *, size_t, void *); static void split(const char *str, char sep, split_fn fun, void *data) { unsigned int start = 0, stop; for (stop = 0; str[stop]; stop++) { if (str[stop] == sep) { fun(str + start, stop - start, data); start = stop + 1; } } fun(str + start, stop - start, data); } template static void splitStr(const string& str, Container& cont, char delim = ' ') { split(str.c_str(), delim, static_cast(add_to_container), &cont); } static char * fix_freq(const char *in) { static char out[128]; const char *p = in; bool decimal = false; char *o = out; while (*p) { if (*p == '.') { if (decimal) { p++; continue; } decimal = true; } *o++ = *p++; } *o = '\0'; return out; } static char * tqsl_strtoupper(char *str) { for (char *cp = str; *cp != '\0'; cp++) *cp = toupper(*cp); return str; } static TQSL_CONVERTER * check_conv(tQSL_Converter conv) { if (tqsl_init()) return 0; if (conv == 0 || CAST_TQSL_CONVERTER(conv)->sentinel != 0x4445) return 0; return CAST_TQSL_CONVERTER(conv); } static tqsl_adifFieldDefinitions adif_qso_record_fields[] = { { "CALL", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_CALLSIGN_MAX, 0, 0, NULL }, { "BAND", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_BAND_MAX, 0, 0, NULL }, { "MODE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_MODE_MAX, 0, 0, NULL }, { "SUBMODE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_MODE_MAX, 0, 0, NULL }, { "QSO_DATE", "", TQSL_ADIF_RANGE_TYPE_NONE, 10, 0, 0, NULL }, { "TIME_ON", "", TQSL_ADIF_RANGE_TYPE_NONE, 10, 0, 0, NULL }, { "FREQ", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_FREQ_MAX, 0, 0, NULL }, { "FREQ_RX", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_FREQ_MAX, 0, 0, NULL }, { "BAND_RX", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_BAND_MAX, 0, 0, NULL }, { "SAT_NAME", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_SATNAME_MAX, 0, 0, NULL }, { "PROP_MODE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_PROPMODE_MAX, 0, 0, NULL }, /* Fields specifying contents of the location for a QSO */ { "MY_CNTY", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_CNTY_MAX, 0, 0, NULL }, { "MY_COUNTRY", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_COUNTRY_MAX, 0, 0, NULL }, { "MY_CQ_ZONE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_ZONE_MAX, 0, 0, NULL }, { "MY_DXCC", "", TQSL_ADIF_RANGE_TYPE_NONE, 10, 0, 0, NULL }, { "MY_GRIDSQUARE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_GRID_MAX, 0, 0, NULL }, { "MY_IOTA", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_IOTA_MAX, 0, 0, NULL }, { "MY_ITU_ZONE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_ZONE_MAX, 0, 0, NULL }, { "MY_STATE", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_STATE_MAX, 0, 0, NULL }, { "MY_VUCC_GRIDS", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_GRID_MAX, 0, 0, NULL }, // Operator - make it long as some people use it as a name { "OPERATOR", "", TQSL_ADIF_RANGE_TYPE_NONE, 100, 0, 0, NULL }, { "STATION_CALLSIGN", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_CALLSIGN_MAX, 0, 0, NULL }, #ifdef USE_OWNER_CALLSIGN { "OWNER_CALLSIGN", "", TQSL_ADIF_RANGE_TYPE_NONE, TQSL_CALLSIGN_MAX, 0, 0, NULL }, #endif { "eor", "", TQSL_ADIF_RANGE_TYPE_NONE, 0, 0, 0, NULL }, { "", "", TQSL_ADIF_RANGE_TYPE_NONE, 0, 0, 0, NULL }, // Correction from JJ1BDX }; static void tqsl_db_get_errstr(TQSL_CONVERTER *conv) { if (sqlite3_errcode(conv->seendb) == SQLITE_BUSY) { strncpy(tQSL_CustomError, "The uploads database is busy. You must exit any running copies of TQSL to be able to sign a log", sizeof tQSL_CustomError); } else { strncpy(tQSL_CustomError, sqlite3_errmsg(conv->seendb), sizeof tQSL_CustomError); } } static void close_db(TQSL_CONVERTER *conv) { tqslTrace("close_db", NULL); if (conv->txn) { if (SQLITE_OK != sqlite3_exec(conv->seendb, "END;", NULL, NULL, NULL)) { tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; tqsl_db_get_errstr(conv); tqslTrace("close_db", "Error ending transaction: %s", tQSL_CustomError); } conv->txn = false; } if (conv->db_open) { if (SQLITE_OK != sqlite3_close(conv->seendb)) { tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; tqsl_db_get_errstr(conv); tqslTrace("close_db", "Error closing database: %s", tQSL_CustomError); } // close files and clean up converters, if any if (conv->adif) tqsl_endADIF(&conv->adif); if (conv->cab) tqsl_endCabrillo(&conv->cab); if (conv->errfile) fclose(conv->errfile); conv->errfile = NULL; } conv->db_open = false; return; } DLLEXPORT int CALLCONVENTION tqsl_beginConverter(tQSL_Converter *convp) { tqslTrace("tqsl_beginConverter", NULL); if (tqsl_init()) return 0; if (!convp) { tqslTrace("tqsl_beginConverter", "convp=NULL"); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } TQSL_CONVERTER *conv = new TQSL_CONVERTER(); *convp = conv; return 0; } DLLEXPORT int CALLCONVENTION tqsl_beginADIFConverter(tQSL_Converter *convp, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc) { tqslTrace("tqsl_beginADIFConverter", NULL); if (tqsl_init()) return 0; if (!convp || !filename) { tqslTrace("tqsl_beginADIFConverter", "arg err convp=0x%lx filename=0x%lx certs=0x%lx", convp, filename, certs); tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tQSL_ADIF adif; if (tqsl_beginADIF(&adif, filename)) { tqslTrace("tqsl_beginADIFConverter", "tqsl_beginADIF fail %d", tQSL_Error); return 1; } TQSL_CONVERTER *conv = new TQSL_CONVERTER(); conv->adif = adif; conv->certs = certs; conv->ncerts = ncerts; if (ncerts > 0) { conv->cert_uids = new int[ncerts]; for (int i = 0; i < ncerts; i++) conv->cert_uids[i] = -1; } conv->loc = loc; *convp = conv; tqsl_getLocationCallSign(loc, conv->callsign, sizeof conv->callsign); tqsl_getLocationDXCCEntity(loc, &conv->dxcc); return 0; } DLLEXPORT int CALLCONVENTION tqsl_beginCabrilloConverter(tQSL_Converter *convp, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc) { tqslTrace("tqsl_beginCabrilloConverter", NULL); if (tqsl_init()) return 0; if (!convp || !filename) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_beginCabrilloConverter", "arg error convp=0x%lx, filename=0x%lx, certs=0x%lx", convp, filename, certs); return 1; } tQSL_Cabrillo cab; if (tqsl_beginCabrillo(&cab, filename)) { tqslTrace("tqsl_beginCabrilloConverter", "tqsl_beginCabrillo fail %d", tQSL_Error); return 1; } TQSL_CONVERTER *conv = new TQSL_CONVERTER(); conv->cab = cab; conv->certs = certs; conv->ncerts = ncerts; if (ncerts > 0) { conv->cert_uids = new int[ncerts]; for (int i = 0; i < ncerts; i++) conv->cert_uids[i] = -1; } conv->loc = loc; *convp = conv; tqsl_getLocationCallSign(loc, conv->callsign, sizeof conv->callsign); tqsl_getLocationDXCCEntity(loc, &conv->dxcc); return 0; } /* * Get a dupes db record by key. * Return: * 0 = Retrieved OK * 1 = No record * -1 = Error */ static int get_dbrec(sqlite3 *db, const char *key, char **result) { int rc; sqlite3_stmt *pstmt; rc = sqlite3_prepare_v2(db, "SELECT * from QSOs where tContact = ?;", 256, &pstmt, NULL); if (SQLITE_OK != rc) { return -1; } rc = sqlite3_bind_text(pstmt, 1, key, strlen(key), NULL); if (SQLITE_OK != rc) { sqlite3_finalize(pstmt); return -1; } rc = sqlite3_step(pstmt); if (SQLITE_DONE == rc) { // No record matches sqlite3_finalize(pstmt); return 1; } if (SQLITE_ROW != rc) { sqlite3_finalize(pstmt); return -1; } *result = strdup(reinterpret_cast(sqlite3_column_text(pstmt, 1))); sqlite3_finalize(pstmt); pstmt = NULL; return 0; } static int put_dbrec(sqlite3 *db, const char *key, const char *data) { int rc; sqlite3_stmt *pstmt; rc = sqlite3_prepare_v2(db, "INSERT OR IGNORE INTO QSOs VALUES(?, ?);", 256, &pstmt, NULL); if (SQLITE_OK != rc) { return -1; } rc = sqlite3_bind_text(pstmt, 1, key, strlen(key), NULL); if (SQLITE_OK != rc) { sqlite3_finalize(pstmt); return -1; } rc = sqlite3_bind_text(pstmt, 2, data, strlen(reinterpret_cast(data)), NULL); if (SQLITE_OK != rc) { return -1; } rc = sqlite3_step(pstmt); if (SQLITE_DONE == rc) { sqlite3_finalize(pstmt); return 0; } sqlite3_finalize(pstmt); return -1; } static int del_dbrec(sqlite3 *db, const char *key) { int rc; sqlite3_stmt *pstmt; rc = sqlite3_prepare_v2(db, "DELETE QSOs WHERE tContact = ?;", 256, &pstmt, NULL); if (SQLITE_OK != rc) { return -1; } rc = sqlite3_bind_text(pstmt, 1, key, strlen(key), NULL); if (SQLITE_OK != rc) { sqlite3_finalize(pstmt); return -1; } rc = sqlite3_step(pstmt); if (SQLITE_DONE == rc) { sqlite3_finalize(pstmt); return 0; } sqlite3_finalize(pstmt); return -1; } DLLEXPORT int CALLCONVENTION tqsl_endConverter(tQSL_Converter *convp) { tqslTrace("tqsl_endConverter", NULL); if (!convp || CAST_TQSL_CONVERTER(*convp) == 0) return 0; TQSL_CONVERTER* conv; if ((conv = check_conv(*convp))) { if (conv->txn) { sqlite3_exec(conv->seendb, "ROLLBACK;", NULL, NULL, NULL); conv->txn = false; } if (conv->db_open) { close_db(conv); } conv->db_open = false; // close files and clean up converters, if any if (conv->adif) tqsl_endADIF(&conv->adif); if (conv->cab) tqsl_endCabrillo(&conv->cab); if (conv->dbpath) free(conv->dbpath); if (conv->errfile) fclose(conv->errfile); conv->errfile = NULL; } if (conv->appName) free(conv->appName); if (CAST_TQSL_CONVERTER(*convp)->sentinel == 0x4445) delete CAST_TQSL_CONVERTER(*convp); *convp = 0; return 0; } static unsigned char * adif_allocate(size_t size) { return new unsigned char[size]; } static int find_matching_cert(TQSL_CONVERTER *conv, int targetdxcc, bool *anyfound) { int i; *anyfound = false; for (i = 0; i < conv->ncerts; i++) { tQSL_Date cdate; char call[256]; int dxcc; if (tqsl_getCertificateCallSign(conv->certs[i], call, sizeof call)) return -1; if (strcasecmp(conv->callsign, call)) // Not for this call continue; if (tqsl_getCertificateDXCCEntity(conv->certs[i], &dxcc)) return -1; if (dxcc != targetdxcc) continue; // Not for this call and DXCC *anyfound = true; if (tqsl_getCertificateQSONotBeforeDate(conv->certs[i], &cdate)) continue; if (tqsl_compareDates(&(conv->rec.date), &cdate) < 0) continue; if (tqsl_getCertificateQSONotAfterDate(conv->certs[i], &cdate)) continue; if (tqsl_compareDates(&(conv->rec.date), &cdate) > 0) continue; return i; } return -1; } static const char *notypes[] = { "D", "T", "M", "C", "N", "S", "B", "E", "L", "" }; // "C" is ADIF 1.0 for "S"; also "I" and "G" in ADIX static const char * tqsl_infer_band(const char* infreq) { char *oldlocale = setlocale(LC_NUMERIC, "C"); double freq = atof(infreq); setlocale(LC_NUMERIC, oldlocale); double freq_khz = freq * 1000.0; int nband = 0; tqsl_getNumBand(&nband); for (int i = 0; i < nband; i++) { const char *name; const char *spectrum; int low, high; if (tqsl_getBand(i, &name, &spectrum, &low, &high)) break; bool match = false; if (!strcmp(spectrum, "HF")) { // Allow for cases where loggers that don't log the // real frequency. if (low == 10100) low = 10000; else if (low == 18068) low = 18000; else if (low == 24890) low = 24000; if (freq_khz >= low && freq_khz <= high) { match = true; } } else { if (freq >= low && freq <= high) match = true; if (freq >= low && high == 0) match = true; } if (match) return name; } return ""; } DLLEXPORT int CALLCONVENTION tqsl_setADIFConverterDateFilter(tQSL_Converter convp, tQSL_Date *start, tQSL_Date *end) { TQSL_CONVERTER *conv; tqslTrace("tqsl_setADIFConverterDateFilter", NULL); if (!(conv = check_conv(convp))) return 1; if (start == NULL) conv->start.year = conv->start.month = conv->start.day = 0; else conv->start = *start; if (end == NULL) conv->end.year = conv->end.month = conv->end.day = 0; else conv->end = *end; return 0; } // Remove the dupes db files static void remove_db(const char *path) { tqslTrace("remove_db", "path=%s", path); #ifdef _WIN32 wchar_t* wpath = utf8_to_wchar(path); _WDIR *dir = _wopendir(wpath); free_wchar(wpath); #else DIR *dir = opendir(path); #endif if (dir != NULL) { #ifdef _WIN32 struct _wdirent *ent = NULL; while ((ent = _wreaddir(dir)) != NULL) { if (!wcscmp(ent->d_name, L"data.mdb") || !wcscmp(ent->d_name, L"lock.mdb") || !wcscmp(ent->d_name, L"uploaded.db") || !wcscmp(ent->d_name, L"uploaded.db-shm") || !wcscmp(ent->d_name, L"uploaded.db-wal")) { #else struct dirent *ent = NULL; while ((ent = readdir(dir)) != NULL) { if (!strcmp(ent->d_name, "data.mdb") || !strcmp(ent->d_name, "lock.mdb") || !strcmp(ent->d_name, "uploaded.db") || !strcmp(ent->d_name, "uploaded.db-shm") || !strcmp(ent->d_name, "uploaded.db-wal")) { #endif string fname = path; int rstat; #ifdef _WIN32 char dname[TQSL_MAX_PATH_LEN]; wcstombs(dname, ent->d_name, TQSL_MAX_PATH_LEN); fname = fname + "/" + dname; wchar_t* wfname = utf8_to_wchar(fname.c_str()); tqslTrace("remove_db", "unlinking %s", fname.c_str()); rstat = _wunlink(wfname); free_wchar(wfname); #else fname = fname + "/" + ent->d_name; tqslTrace("remove_db", "unlinking %s", fname.c_str()); rstat = unlink(fname.c_str()); #endif if (rstat < 0) { tqslTrace("remove_db", "can't unlink %s: %s", fname.c_str(), strerror(errno)); } } } #ifdef _WIN32 _wclosedir(dir); #else closedir(dir); #endif } return; } // Open the uploaded database static bool open_db(TQSL_CONVERTER *conv, bool readonly) { bool dbinit_cleanup = false; bool dblocked = false; int dbret; bool triedRemove = false; bool triedDelete = false; conv->dbpath = strdup(tQSL_BaseDir); #ifndef _WIN32 // Clean up junk in that directory DIR *dir = opendir(conv->dbpath); if (dir != NULL) { struct dirent *ent; while ((ent = readdir(dir)) != NULL) { if (ent->d_name[0] == '.') continue; struct stat s; // If it's a symlink pointing to itself, remove it. string fname = conv->dbpath; fname += "/"; fname += ent->d_name; if (stat(fname.c_str(), &s)) { if (errno == ELOOP) { #ifdef _WIN32 _wunlink(ConvertFromUtf8ToUtf16(fname.c_str())); #else unlink(fname.c_str()); #endif } } } closedir(dir); } #endif string logpath = conv->dbpath; #ifdef _WIN32 logpath += "\\dberr.log"; wchar_t* wlogpath = utf8_to_wchar(logpath.c_str()); conv->errfile = _wfopen(wlogpath, L"wb"); free_wchar(wlogpath); #else logpath += "/dberr.log"; conv->errfile = fopen(logpath.c_str(), "wb"); #endif reopen: while(1) { // Open the database string dbfilename = conv->dbpath; #ifdef _WIN32 dbfilename += "\\uploaded.db"; #else dbfilename += "/uploaded.db"; #endif tqslTrace("open_db", "Opening the database at %s", dbfilename.c_str()); if ((dbret = sqlite3_open_v2(dbfilename.c_str(), &conv->seendb, SQLITE_OPEN_READWRITE, NULL)) != SQLITE_OK) { /* // Tried looking for ENOENT here, but that's not returned. CANTOPEN doesn't have any detail provided. */ if (SQLITE_CANTOPEN == dbret) { tqslTrace("open_db", "DB not found, making a new one"); dbret = sqlite3_open_v2(dbfilename.c_str(), &conv->seendb, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, NULL); if (SQLITE_OK == dbret) { const char *sql = "DROP TABLE IF EXISTS QSOs;" "CREATE TABLE QSOs(tContact TEXT, QTH TEXT);" "CREATE UNIQUE INDEX IF NOT EXISTS tc ON QSOs(tContact);"; char *err_msg; dbret = sqlite3_exec(conv->seendb, sql, 0, 0, &err_msg); if (SQLITE_OK != dbret) { tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; tqsl_db_get_errstr(conv); tqslTrace("open_db", "Error creating table: %s", tQSL_CustomError); break; } else { close_db(conv); tQSL_Error = TQSL_NEW_UPLOAD_DB; return false; } } // Fall through so this doesn't repeat dbinit_cleanup = true; break; } // can't open the db if (!triedRemove) { tqslTrace("open_db", "can't open, removing %s errno %d", sqlite3_errmsg(conv->seendb), errno); remove_db(conv->dbpath); triedRemove = true; continue; } tqslTrace("open_db", "create failed with %s errno %d", sqlite3_errmsg(conv->seendb), errno); if (conv->errfile) fprintf(conv->errfile, "create failed with %s errno %d", sqlite3_errmsg(conv->seendb), errno); dbinit_cleanup = true; break; } else { // Opened OK. Let's make a database table just in case const char *sql = "CREATE TABLE IF NOT EXISTS QSOs(tContact TEXT, QTH TEXT);" "CREATE UNIQUE INDEX IF NOT EXISTS tc ON QSOs(tContact);"; char *err_msg; dbret = sqlite3_exec(conv->seendb, sql, 0, 0, &err_msg); if (SQLITE_OK != dbret) { if (SQLITE_BUSY == dbret) { dbinit_cleanup = true; dblocked = true; break; } // Something is just not right. if (!triedRemove) { tqslTrace("open_db", "can't create tables, error %s - %s errno %d", err_msg, sqlite3_errmsg(conv->seendb), errno); sqlite3_close(conv->seendb); remove_db(conv->dbpath); triedRemove = true; continue; } } // is it really a DB? Try an get dbret = sqlite3_exec(conv->seendb, "SELECT * FROM QSOs LIMIT 1;", NULL, NULL, NULL); if (SQLITE_OK == dbret) { sqlite3_exec(conv->seendb, "PRAGMA journal_mode=WAL;", NULL, NULL, NULL); sqlite3_exec(conv->seendb, "CREATE UNIQUE INDEX IF NOT EXISTS tc ON QSOs(tContact);", NULL, NULL, NULL); break; // All OK } if (SQLITE_BUSY == dbret) { dbinit_cleanup = true; dblocked = true; break; } // probably SQLITE_NOTADB here. Kill it. if (!triedRemove) { tqslTrace("open_db", "can't open, removing %s errno %d", sqlite3_errmsg(conv->seendb), errno); sqlite3_close(conv->seendb); remove_db(conv->dbpath); triedRemove = true; continue; } dbinit_cleanup = true; break; } } if (dbinit_cleanup) { tqslTrace("open_db", "DB open failed, triedDelete=%d", triedDelete); tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; if (dblocked) { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "dblocked"); } else { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "%s: %s", sqlite3_errmsg(conv->seendb), strerror(errno)); } tqslTrace("open_db", "Error opening db: %s", tQSL_CustomError); conv->txn = false; if (conv->db_open) { close_db(conv); } if (conv->errfile) fclose(conv->errfile); conv->errfile = NULL; // Handle case where the database is just broken if ((SQLITE_NOTADB == dbret) && !triedDelete) { tqslTrace("open_db", "Not a database file. Removing db"); remove_db(conv->dbpath); triedDelete = true; goto reopen; } conv->db_open = false; return false; } if (!readonly) { conv->txn = true; dbret = sqlite3_exec(conv->seendb, "BEGIN;", NULL, NULL, NULL); if (SQLITE_OK != dbret) { tqslTrace("open_db", "Can't start transaction!"); } } conv->db_open = true; return true; } static const char* get_ident_rec(TQSL_CONVERTER *conv) { int major = 0, minor = 0, config_major = 0, config_minor = 0; tqsl_getVersion(&major, &minor); tqsl_getConfigVersion(&config_major, &config_minor); char temp[512]; static char ident[512]; snprintf(temp, sizeof temp, "%s Lib: V%d.%d Config: V%d.%d AllowDupes: %s", conv->appName ? conv->appName : "Unknown", major, minor, config_major, config_minor, conv->allow_dupes ? "true" : "false"); temp[sizeof temp - 1] = '\0'; int len = strlen(temp); snprintf(ident, sizeof ident, "%s\n", len, temp); ident[sizeof ident - 1] = '\0'; conv->need_ident_rec = false; return ident; } static const char* get_station_rec(TQSL_CONVERTER *conv) { conv->need_station_rec = false; const char *tStation = tqsl_getGABBItSTATION(conv->loc, conv->loc_uid, conv->cert_uid); tqsl_getCertificateSerialExt(conv->certs[conv->cert_idx], conv->serial, sizeof conv->serial); tqsl_getCertificateCallSign(conv->certs[conv->cert_idx], conv->callsign, sizeof conv->callsign); tqsl_getCertificateDXCCEntity(conv->certs[conv->cert_idx], &conv->dxcc); return tStation; } static bool set_tagline(TQSL_CONVERTER *conv, const char *tag) { if (conv->taglines.find(tag) != conv->taglines.end()) { conv->err_tag_line = conv->taglines[tag]; return true; } return false; } static void parse_adif_qso(TQSL_CONVERTER *conv, int *saveErr, TQSL_ADIF_GET_FIELD_ERROR *stat) { int cstat = 0; conv->taglines.clear(); conv->err_tag_line = 0; while (1) { tqsl_adifFieldResults result; conv->taglines[result.name] = result.line_no; if (tqsl_getADIFField(conv->adif, &result, stat, adif_qso_record_fields, notypes, adif_allocate)) break; if (*stat != TQSL_ADIF_GET_FIELD_SUCCESS && *stat != TQSL_ADIF_GET_FIELD_NO_NAME_MATCH) break; if (!strcasecmp(result.name, "eor")) break; char *resdata = reinterpret_cast(result.data); // Strip leading whitespace if (resdata) { while (isspace(*resdata)) resdata++; // Strip trailing whitespace char *end = resdata + strlen(resdata) - 1; while (isspace(*end)) *end-- = '\0'; } if (!strcasecmp(result.name, "CALL") && resdata) { tqsl_strtoupper(resdata); conv->rec.callsign_set = true; strncpy(conv->rec.callsign, resdata, sizeof conv->rec.callsign); } else if (!strcasecmp(result.name, "BAND") && resdata) { conv->rec.band_set = true; strncpy(conv->rec.band, resdata, sizeof conv->rec.band); } else if (!strcasecmp(result.name, "MODE") && resdata) { tqsl_strtoupper(resdata); conv->rec.mode_set = true; strncpy(conv->rec.mode, resdata, sizeof conv->rec.mode); } else if (!strcasecmp(result.name, "SUBMODE") && resdata) { tqsl_strtoupper(resdata); strncpy(conv->rec.submode, resdata, sizeof conv->rec.submode); } else if (!strcasecmp(result.name, "FREQ") && resdata) { conv->rec.band_set = true; strncpy(conv->rec.freq, fix_freq(resdata), sizeof conv->rec.freq); if (atof(conv->rec.freq) == 0.0) conv->rec.freq[0] = '\0'; } else if (!strcasecmp(result.name, "FREQ_RX") && resdata) { strncpy(conv->rec.rxfreq, fix_freq(resdata), sizeof conv->rec.rxfreq); if (atof(conv->rec.rxfreq) == 0.0) conv->rec.rxfreq[0] = '\0'; } else if (!strcasecmp(result.name, "BAND_RX") && resdata) { strncpy(conv->rec.rxband, resdata, sizeof conv->rec.rxband); } else if (!strcasecmp(result.name, "SAT_NAME") && resdata) { tqsl_strtoupper(resdata); // Two-Line Elements (TLEs) call this AO-07, LoTW wants AO-7. if (!strcasecmp(resdata, "AO-07")) strncpy(conv->rec.satname, "AO-7", sizeof conv->rec.satname); else strncpy(conv->rec.satname, resdata, sizeof conv->rec.satname); } else if (!strcasecmp(result.name, "PROP_MODE") && resdata) { tqsl_strtoupper(resdata); strncpy(conv->rec.propmode, resdata, sizeof conv->rec.propmode); } else if (!strcasecmp(result.name, "QSO_DATE") && resdata) { conv->rec.date_set = true; cstat = tqsl_initDate(&(conv->rec.date), resdata); if (cstat) *saveErr = tQSL_Error; } else if (!strcasecmp(result.name, "TIME_ON") && resdata) { conv->rec.time_set = true; cstat = tqsl_initTime(&(conv->rec.time), resdata); if (cstat) *saveErr = tQSL_Error; if (conv->ignore_secs) conv->rec.time.second = 0; } else if (!strcasecmp(result.name, "MY_CNTY") && resdata) { tqsl_strtoupper(resdata); char *p = strstr(resdata, ","); // Find the comma in "VA,Fairfax" if (p) { char *p1 = p; *p++ = '\0'; strncpy(conv->rec.my_cnty_state, resdata, sizeof conv->rec.my_cnty_state); while (isspace(*p)) p++; // Skip spaces and comma strncpy(conv->rec.my_county, p, sizeof conv->rec.my_county); *p1 = ','; // Put the comma back } else { strncpy(conv->rec.my_county, resdata, sizeof conv->rec.my_county); } } else if (!strcasecmp(result.name, "MY_COUNTRY") && resdata) { if (strcasecmp(resdata, "United States") == 0) { strncpy(conv->rec.my_country, "UNITED STATES OF AMERICA", sizeof conv->rec.my_country); } else { strncpy(conv->rec.my_country, resdata, sizeof conv->rec.my_country); } } else if (!strcasecmp(result.name, "MY_CQ_ZONE") && resdata) { char *endptr; long zone = strtol(resdata, &endptr, 10); if (*endptr == '\0') { // If the conversion was correct snprintf(conv->rec.my_cq_zone, sizeof conv->rec.my_cq_zone, "%ld", zone); } else { // It wasn't a valid number strncpy(conv->rec.my_cq_zone, resdata, sizeof conv->rec.my_cq_zone); } } else if (!strcasecmp(result.name, "MY_DXCC") && resdata) { conv->rec.my_dxcc = strtol(resdata, NULL, 10); } else if (!strcasecmp(result.name, "MY_GRIDSQUARE") && resdata) { strncpy(conv->rec.my_gridsquare, resdata, sizeof conv->rec.my_gridsquare); } else if (!strcasecmp(result.name, "MY_IOTA") && resdata) { tqsl_strtoupper(resdata); strncpy(conv->rec.my_iota, resdata, sizeof conv->rec.my_iota); } else if (!strcasecmp(result.name, "MY_ITU_ZONE") && resdata) { char *endptr; long zone = strtol(resdata, &endptr, 10); if (*endptr == '\0') { // If the conversion was correct snprintf(conv->rec.my_itu_zone, sizeof conv->rec.my_itu_zone, "%ld", zone); } else { // It wasn't a valid number strncpy(conv->rec.my_itu_zone, resdata, sizeof conv->rec.my_itu_zone); } } else if (!strcasecmp(result.name, "MY_STATE") && resdata) { tqsl_strtoupper(resdata); strncpy(conv->rec.my_state, resdata, sizeof conv->rec.my_state); } else if (!strcasecmp(result.name, "MY_VUCC_GRIDS") && resdata) { strncpy(conv->rec.my_vucc_grids, resdata, sizeof conv->rec.my_vucc_grids); } else if (!strcasecmp(result.name, "OPERATOR") && resdata) { // Only use the OPERATOR field if it looks like a callsign tqsl_strtoupper(resdata); string op(resdata); if (!conv->ignore_calls && checkCallSign(op)) { strncpy(conv->rec.my_operator, resdata, sizeof conv->rec.my_operator); conv->rec.my_operator[TQSL_CALLSIGN_MAX] = '\0'; } #ifdef USE_OWNER_CALLSIGN } else if (!strcasecmp(result.name, "OWNER_CALLSIGN") && resdata) { // Only use the OWNER_CALLSIGN field if it looks like a callsign tqsl_strtoupper(resdata); string op(resdata); if (!conv->ignore_calls && checkCallSign(op)) { strncpy(conv->rec.my_owner, resdata, sizeof conv->rec.my_owner); } #endif } else if (!strcasecmp(result.name, "STATION_CALLSIGN") && resdata) { // Only use the STATION_CALLSIGN field if it looks like a callsign tqsl_strtoupper(resdata); string op(resdata); if (!conv->ignore_calls && checkCallSign(op)) { strncpy(conv->rec.my_call, resdata, sizeof conv->rec.my_call); } } else { tqslTrace("parse_adif_qso", "Unknown ADIF field %s", result.name); } if (*stat == TQSL_ADIF_GET_FIELD_SUCCESS) { conv->rec_text += string(reinterpret_cast(result.name)) + ": "; if (resdata) conv->rec_text += string(resdata); conv->rec_text += "\n"; } if (result.data) delete[] result.data; } return; } static int check_station(TQSL_CONVERTER *conv, const char *field, const char *my_field, char *my, size_t len, const char *errfmt, bool update) { // // UPDATE is a boolean that when a change is made, that change // is propagated to the downstream values. STATE -> COUNTY and STATE->ZONES // char val[256]; char label[256]; const char *newProvince = NULL; const char *newOblast = NULL; // CA_PROVINCE can be QC but TQSL lookup expects PQ if (!strcasecmp(field, "CA_PROVINCE") && !strcasecmp(my, "QC")) { newProvince = "PQ"; strncpy(my, "PQ", len); } // CA_PROVINCE can be NL but TQSL lookup expects NF if (!strcasecmp(field, "CA_PROVINCE") && !strcasecmp(my, "NL")) { newProvince = "NF"; strncpy(my, "NF", len); } // RU_OBLAST can be YR but TQSL lookup expects JA if (!strcasecmp(field, "RU_OBLAST") && !strcasecmp(my, "YR")) { newOblast = "JA"; strncpy(my, "JA", len); } // RU_OBLAST can be YN but TQSL lookup expects JN if (!strcasecmp(field, "RU_OBLAST") && !strcasecmp(my, "YN")) { newOblast = "JN"; strncpy(my, "JN", len); } if (my[0] && !tqsl_getLocationField(conv->loc, field, val, sizeof val) && !tqsl_getLocationFieldLabel(conv->loc, field, label, sizeof label)) { if (!strcasecmp(my, label)) { // Label is correct, ADIF is not strncpy(my, val, len); // So use the value } if (strcasecmp(my, val)) { if (conv->location_handling == TQSL_LOC_UPDATE) { int res = tqsl_setLocationField(conv->loc, field, my); // -1 means trying to set a value that is not in the enumeration if (res == -1) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, errfmt, my, val); tQSL_Error = TQSL_LOCATION_MISMATCH | TQSL_MSG_FLAGGED; set_tagline(conv, my_field); return 1; } // -2 means that the label matched, so use that if (res == -2) { strncpy(my, tQSL_CustomError, len); } if (update) tqsl_updateStationLocationCapture(conv->loc); conv->newstation = true; } else if (strlen(val) > 0) { conv->rec_done = true; if (newProvince) { strncpy(my, newProvince, len); } if (newOblast) { strncpy(my, newOblast, len); } snprintf(tQSL_CustomError, sizeof tQSL_CustomError, errfmt, val, my); tQSL_Error = TQSL_LOCATION_MISMATCH; set_tagline(conv, my_field); return 1; } else { tqsl_setLocationField(conv->loc, field, my); if (update) tqsl_updateStationLocationCapture(conv->loc); conv->newstation = true; } } } return 0; // OK } DLLEXPORT const char* CALLCONVENTION tqsl_getConverterGABBI(tQSL_Converter convp) { TQSL_CONVERTER *conv; char signdata[1024]; int cstat = 0; if (!(conv = check_conv(convp))) return 0; if (conv->need_ident_rec) { return get_ident_rec(conv); } if (!conv->allow_dupes && !conv->db_open) { if (!open_db(conv, false)) { // If can't open dupes DB return 0; } } TQSL_ADIF_GET_FIELD_ERROR stat; if (conv->rec_done) { conv->rec_done = false; conv->clearRec(); int saveErr = 0; if (conv->adif) { parse_adif_qso(conv, &saveErr, &stat); if (saveErr) { tQSL_Error = saveErr; conv->rec_done = true; return 0; } if (stat == TQSL_ADIF_GET_FIELD_EOF) { tqslTrace("tqsl_getConverterGABBI", "eof"); return 0; } if (stat != TQSL_ADIF_GET_FIELD_SUCCESS) { tqslTrace("tqsl_getConverterGABBI", "adif error %d", stat); tQSL_ADIF_Error = stat; tQSL_Error = TQSL_ADIF_ERROR; return 0; } conv->err_tag_line = 0; // ADIF record is complete. See if we need to infer the BAND fields. if (conv->rec.band[0] == 0) strncpy(conv->rec.band, tqsl_infer_band(conv->rec.freq), sizeof conv->rec.band); if (conv->rec.rxband[0] == 0) strncpy(conv->rec.rxband, tqsl_infer_band(conv->rec.rxfreq), sizeof conv->rec.rxband); // Normalize the DXCC country if (conv->rec.my_country[0] != 0) { int num_dxcc = 0; tqsl_getNumDXCCEntity(&num_dxcc); const char *entity = NULL; int ent_num; bool found = false; for (int i = 0; i < num_dxcc; i++) { tqsl_getDXCCEntity(i, &ent_num, &entity); if (entity && strcasecmp(entity, conv->rec.my_country) == 0) { found = true; // Consistent DXCC ? if (conv->rec.my_dxcc == 0) { conv->rec.my_dxcc = ent_num; } else { // MY_DXCC and MY_COUNTRY do not match. Report this. if (conv->rec.my_dxcc != ent_num) { conv->rec_done = true; const char *d1; tqsl_getDXCCEntityName(conv->rec.my_dxcc, &d1); snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "DXCC Entity|%s (%d)|%s (%d)", d1, conv->rec.my_dxcc, conv->rec.my_country, i); tqslTrace("tqsl_getConverterGABBI", "cert error: %s", tQSL_CustomError); tQSL_Error = TQSL_CERT_MISMATCH; return 0; } } break; } } if (!found) { // Country name is bogus conv->rec.my_country[0] = '\0'; } } // Normalize the grids if (conv->rec.my_vucc_grids[0] != 0) { strncpy(conv->rec.my_gridsquare, conv->rec.my_vucc_grids, TQSL_GRID_MAX); } // Normalize callsign // Priority - STATION_CALLSIGN, then OPERATOR, then OWNER_CALLSIGN // my_call has STATION_CALLSIGN already. if (!conv->ignore_calls && conv->rec.my_call[0] == '\0' && conv->rec.my_operator[0] != 0) { // OPERATOR set strncpy(conv->rec.my_call, conv->rec.my_operator, TQSL_CALLSIGN_MAX); } #ifdef USE_OWNER_CALLSIGN if (!conv->ignore_calls && conv->rec.my_call[0] == '\0' && conv->rec.my_owner[0] != 0) { // OWNER_CALLSIGN set strncpy(conv->rec.my_call, conv->rec.my_owner, TQSL_CALLSIGN_MAX); } #endif if (conv->location_handling == TQSL_LOC_UPDATE && conv->rec.my_call[0] != '\0') { // If any of these strncpy(conv->callsign, conv->rec.my_call, sizeof conv->callsign); // got a callsign } } else if (conv->cab) { TQSL_CABRILLO_ERROR_TYPE stat; do { tqsl_cabrilloField field; if (tqsl_getCabrilloField(conv->cab, &field, &stat)) return 0; if (stat == TQSL_CABRILLO_NO_ERROR || stat == TQSL_CABRILLO_EOR) { // Field found if (!strcasecmp(field.name, "CALL")) { conv->rec.callsign_set = true; strncpy(conv->rec.callsign, field.value, sizeof conv->rec.callsign); } else if (!strcasecmp(field.name, "BAND")) { conv->rec.band_set = true; strncpy(conv->rec.band, field.value, sizeof conv->rec.band); } else if (!strcasecmp(field.name, "MODE")) { conv->rec.mode_set = true; strncpy(conv->rec.mode, field.value, sizeof conv->rec.mode); } else if (!strcasecmp(field.name, "FREQ")) { conv->rec.band_set = true; strncpy(conv->rec.freq, field.value, sizeof conv->rec.freq); } else if (!strcasecmp(field.name, "QSO_DATE")) { conv->rec.date_set = true; cstat = tqsl_initDate(&(conv->rec.date), field.value); if (cstat) saveErr = tQSL_Error; } else if (!strcasecmp(field.name, "TIME_ON")) { conv->rec.time_set = true; cstat = tqsl_initTime(&(conv->rec.time), field.value); if (conv->ignore_secs) conv->rec.time.second = 0; if (cstat) saveErr = tQSL_Error; } else if (!conv->ignore_calls && !strcasecmp(field.name, "MYCALL")) { strncpy(conv->rec.my_call, field.value, sizeof conv->rec.my_call); tqsl_strtoupper(conv->rec.my_call); } if (conv->rec_text != "") conv->rec_text += "\n"; conv->rec_text += string(field.name) + ": " + field.value; } } while (stat == TQSL_CABRILLO_NO_ERROR); if (saveErr) tQSL_Error = saveErr; if (saveErr || stat != TQSL_CABRILLO_EOR) { conv->rec_done = true; return 0; } } else { tQSL_Error = TQSL_CUSTOM_ERROR; strncpy(tQSL_CustomError, "Converter not initialized", sizeof tQSL_CustomError); tqslTrace("tqsl_getConverterGABBI", "Converter not initialized"); return 0; } } // Does the QSO have the basic required elements? if (!conv->rec.callsign_set) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid contact - QSO does not specify a Callsign"); tqslTrace("tqsl_getConverterGABBI", "No callsign in QSO"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (!conv->rec.band_set) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid contact - QSO does not specify a band or frequency"); tqslTrace("tqsl_getConverterGABBI", "No band in QSO"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (!conv->rec.mode_set) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid contact - QSO does not specify a mode"); tqslTrace("tqsl_getConverterGABBI", "No mode in QSO"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (!conv->rec.date_set) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid contact - QSO does not specify a date"); tqslTrace("tqsl_getConverterGABBI", "No date in QSO"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (!conv->rec.time_set) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid contact - QSO does not specify a time"); tqslTrace("tqsl_getConverterGABBI", "No time in QSO"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } // Check QSO date against user-specified date range. if (tqsl_isDateValid(&(conv->rec.date))) { if (tqsl_isDateValid(&(conv->start)) && tqsl_compareDates(&(conv->rec.date), &(conv->start)) < 0) { conv->rec_done = true; tQSL_Error = TQSL_DATE_OUT_OF_RANGE; set_tagline(conv, "QSO_DATE"); tqslTrace("tqsl_getConverterGABBI", "QSO date out of range"); return 0; } if (tqsl_isDateValid(&(conv->end)) && tqsl_compareDates(&(conv->rec.date), &(conv->end)) > 0) { conv->rec_done = true; tQSL_Error = TQSL_DATE_OUT_OF_RANGE; tqslTrace("tqsl_getConverterGABBI", "QSO date out of range"); set_tagline(conv, "QSO_DATE"); return 0; } } // Do field value mapping tqsl_strtoupper(conv->rec.callsign); if (!conv->allow_bad_calls) { if (!checkCallSign(conv->rec.callsign)) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid amateur CALL (%s)", conv->rec.callsign); set_tagline(conv, "CALL"); tqslTrace("tqsl_getConverterGABBI", "QSO call %s invalid", conv->rec.callsign); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } } tqsl_strtoupper(conv->rec.band); tqsl_strtoupper(conv->rec.rxband); tqsl_strtoupper(conv->rec.mode); tqsl_strtoupper(conv->rec.submode); char val[256]; val[0] = '\0'; // Try to find the GABBI mode several ways. if (conv->rec.submode[0] != '\0') { char modeSub[256]; strncpy(modeSub, conv->rec.mode, sizeof modeSub); size_t left = sizeof modeSub - strlen(modeSub); strncat(modeSub, "%", left); left = sizeof modeSub - strlen(modeSub); strncat(modeSub, conv->rec.submode, left); if (tqsl_getADIFMode(modeSub, val, sizeof val)) { // mode%submode lookup failed // Try just the submode. if (tqsl_getADIFMode(conv->rec.submode, val, sizeof val)) { // bare submode failed if (tqsl_getADIFMode(conv->rec.mode, val, sizeof val)) { val[0] = '\0'; } } } } else { // Just a mode, no submode. Look that up. tqsl_getADIFMode(conv->rec.mode, val, sizeof val); } if (val[0] != '\0') strncpy(conv->rec.mode, val, sizeof conv->rec.mode); // Check field validities if (conv->modes.find(conv->rec.mode) == conv->modes.end()) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid MODE (%s)", conv->rec.mode); set_tagline(conv, "MODE"); tqslTrace("tqsl_getConverterGABBI", "QSO mode %s invalid", conv->rec.mode); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (conv->bands.find(conv->rec.band) == conv->bands.end()) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid BAND (%s)", conv->rec.band); set_tagline(conv, "BAND"); tqslTrace("tqsl_getConverterGABBI", "QSO band %s invalid", conv->rec.band); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (conv->rec.rxband[0] && (conv->bands.find(conv->rec.rxband) == conv->bands.end())) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid RX BAND (%s)", conv->rec.rxband); set_tagline(conv, "BAND_RX"); tqslTrace("tqsl_getConverterGABBI", "QSO rxband %s invalid", conv->rec.rxband); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (conv->rec.freq[0] && strcmp(conv->rec.band, "SUBMM") && strcmp(conv->rec.band, tqsl_infer_band(conv->rec.freq))) { // Have a BAND and FREQ. // Frequency is not in that band - ignore it. conv->rec.freq[0] = '\0'; } if (conv->rec.rxfreq[0] && strcmp(conv->rec.rxband, "SUBMM") && strcmp(conv->rec.rxband, tqsl_infer_band(conv->rec.rxfreq))) { // Have a RX_BAND and RX_FREQ. Frequency is not in that band - ignore it. conv->rec.rxfreq[0] = '\0'; } if (conv->rec.propmode[0] != '\0' && conv->propmodes.find(conv->rec.propmode) == conv->propmodes.end()) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid PROP_MODE (%s)", conv->rec.propmode); set_tagline(conv, "PROP_MODE"); tqslTrace("tqsl_getConverterGABBI", "QSO propmode %s invalid", conv->rec.propmode); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (conv->rec.satname[0] != '\0' && conv->satellites.find(conv->rec.satname) == conv->satellites.end()) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Invalid SAT_NAME (%s)", conv->rec.satname); set_tagline(conv, "SAT_NAME"); tqslTrace("tqsl_getConverterGABBI", "QSO sat_name %s invalid", conv->rec.satname); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (!strcmp(conv->rec.propmode, "SAT") && conv->rec.satname[0] == '\0') { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "PROP_MODE = 'SAT' but no SAT_NAME"); set_tagline(conv, "PROP_MODE"); tqslTrace("tqsl_getConverterGABBI", "QSO prop_mode sat but no sat_name"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } if (strcmp(conv->rec.propmode, "SAT") && conv->rec.satname[0] != '\0') { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "SAT_NAME set but PROP_MODE is not 'SAT'"); set_tagline(conv, "SAT_NAME"); tqslTrace("tqsl_getConverterGABBI", "QSO sat_name set but no prop_mode"); tQSL_Error = TQSL_CUSTOM_ERROR; return 0; } // Check cert if (conv->location_handling != TQSL_LOC_UPDATE && conv->ncerts <= 0) { conv->rec_done = true; tQSL_Error = TQSL_CERT_NOT_FOUND; tqslTrace("tqsl_getConverterGABBI", "Cert not found"); return 0; } if (conv->location_handling == TQSL_LOC_UPDATE) { // Is the call right? if (conv->rec.my_call[0]) { strncpy(conv->callsign, conv->rec.my_call, sizeof conv->callsign); } } // For check-only case, need to check callsign now. if (conv->location_handling == TQSL_LOC_REPORT) { // Is the call right? if (conv->rec.my_call[0]) { // Update case handled above when switching certs if (strcmp(conv->rec.my_call, conv->callsign)) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Callsign|%s|%s", conv->callsign, conv->rec.my_call); if (!set_tagline(conv, "STATION_CALLSIGN")) set_tagline(conv, "OPERATOR"); tqslTrace("tqsl_getConverterGABBI", "my_call %s", tQSL_CustomError); tQSL_Error = TQSL_CERT_MISMATCH; return 0; } } } // Lookup cert - start with conv->dxcc int targetdxcc; targetdxcc = conv->dxcc; // If we're in update mode, use the DXCC from the log if (conv->location_handling == TQSL_LOC_UPDATE) { if (conv->rec.my_dxcc != 0) { targetdxcc = conv->rec.my_dxcc; } } bool anyfound; int cidx; cidx = find_matching_cert(conv, targetdxcc, &anyfound); if (cidx < 0) { conv->rec_done = true; const char *entName = NULL; if (tqsl_getDXCCEntityName(targetdxcc, &entName) || entName == NULL) { set_tagline(conv, "MY_DXCC"); snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "MY_DXCC|%d", conv->rec.my_dxcc); conv->rec.my_dxcc = 0; tqslTrace("tqsl_getConverterGABBI", "my_dxcc %s", tQSL_CustomError); tQSL_Error = TQSL_INVALID_ADIF; return 0; } snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "%s|%s", conv->callsign, entName); tQSL_Error = TQSL_CERT_NOT_FOUND | TQSL_MSG_FLAGGED; if (anyfound) { tQSL_Error = TQSL_CERT_DATE_MISMATCH; set_tagline(conv, "QSO_DATE"); } if (conv->location_handling == TQSL_LOC_UPDATE) { if (conv->rec.my_call[0]) { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "%s|%s", conv->rec.my_call, entName); } } return 0; } if (cidx != conv->cert_idx) { // Switching certs if (conv->dxcc != -1) { conv->dxcc = targetdxcc; tqsl_setLocationCallSign(conv->loc, conv->callsign, conv->dxcc); // Set callsign and DXCC tqsl_setStationLocationCapturePage(conv->loc, 1); // Update to relevant fields tqsl_updateStationLocationCapture(conv->loc); } conv->cert_idx = cidx; if (conv->cert_uids[conv->cert_idx] == -1) { // Need to output tCERT, tSTATION conv->need_station_rec = true; // Need a new station record conv->cert_uid = conv->cert_uids[conv->cert_idx] = conv->next_cert_uid; conv->next_cert_uid++; return tqsl_getGABBItCERT(conv->certs[conv->cert_idx], conv->cert_uid); } else { conv->cert_uid = conv->cert_uids[conv->cert_idx]; } } if (conv->location_handling != TQSL_LOC_IGNORE) { // Care about MY_* fields // At this point, conv->certs[conv->cert_idx] has the certificate // conv->loc has the location. // First, refresh the certificate data tqsl_getCertificateSerialExt(conv->certs[conv->cert_idx], conv->serial, sizeof conv->serial); tqsl_getCertificateCallSign(conv->certs[conv->cert_idx], conv->callsign, sizeof conv->callsign); tqsl_getCertificateDXCCEntity(conv->certs[conv->cert_idx], &conv->dxcc); // Is the call right? if (conv->rec.my_call[0]) { // Update case handled above when switching certs if (strcmp(conv->rec.my_call, conv->callsign)) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Callsign|%s|%s", conv->callsign, conv->rec.my_call); if (!set_tagline(conv, "STATION_CALLSIGN")) set_tagline(conv, "OPERATOR"); tqslTrace("tqsl_getConverterGABBI", "operator error %s", tQSL_CustomError); tQSL_Error = TQSL_CERT_MISMATCH; return 0; } } // Is the DXCC right? if (conv->rec.my_dxcc) { if (conv->rec.my_dxcc != conv->dxcc) { if (conv->location_handling == TQSL_LOC_UPDATE) { // Care about MY_* fields tqsl_setLocationField(conv->loc, "CALL", conv->callsign); tqsl_updateStationLocationCapture(conv->loc); } else { conv->rec_done = true; const char *d1, *d2 = NULL; tqsl_getDXCCEntityName(conv->dxcc, &d1); tqsl_getDXCCEntityName(conv->rec.my_dxcc, &d2); snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "DXCC Entity|%s (%d)|%s (%d)", d1 ? d1 : "Invalid", conv->dxcc, d2 ? d2 : "Invalid", conv->rec.my_dxcc); set_tagline(conv, "MY_DXCC"); tqslTrace("tqsl_getConverterGABBI", "my_dxcc error %s", tQSL_CustomError); tQSL_Error = TQSL_CERT_MISMATCH; return 0; } } } conv->newstation = false; /* * Gridsquare handling - if the four-character grid matches the station loc * then don't complain; this is common for FT8/FT4 which have four char grids * and we don't want to reject every WSJT-X QSO just because the station * location has a higher precision grid. Similarly, if the Station Location has * a six-character grid and the log has 8, then just compare 6 for report mode. */ tqsl_getLocationField(conv->loc, "GRIDSQUARE", val, sizeof val); if (conv->rec.my_gridsquare[0] && !tqsl_getLocationField(conv->loc, "GRIDSQUARE", val, sizeof val)) { bool okgrid = true; unsigned int stnLen = strlen(val); unsigned int logLen = strlen(conv->rec.my_gridsquare); unsigned int compareLen = (stnLen < logLen ? stnLen : logLen); if (strstr(val, ",") || strstr(conv->rec.my_gridsquare, ",")) { // If it's a corner/edge vectorstngrids; vectorqsogrids; splitStr(val, stngrids, ','); splitStr(conv->rec.my_gridsquare, qsogrids, ','); size_t nstn = stngrids.size(); size_t nqso = qsogrids.size(); if (nstn != nqso) { okgrid = false; } else { sort(stngrids.begin(), stngrids.end()); sort(qsogrids.begin(), qsogrids.end()); for (size_t i = 0; i < nstn; i++) { if (stngrids[i] != qsogrids[i]) { compareLen = 99; // Doesn't match, so error out if appropriate break; } compareLen = 0; // Matches. } } } if (conv->location_handling == TQSL_LOC_UPDATE) { okgrid = (strcasecmp(conv->rec.my_gridsquare, val) == 0); } else { okgrid = (compareLen == 0 || strncasecmp(conv->rec.my_gridsquare, val, compareLen) == 0); } /* * FT8 four-char grid handling. * For station location set to AA01aa and FT8 saying AA01 * Treat that as a match */ okgrid = (compareLen == 0 || strncasecmp(conv->rec.my_gridsquare, val, compareLen) == 0); if (!okgrid) { if (conv->location_handling == TQSL_LOC_UPDATE) { tqsl_setLocationField(conv->loc, "GRIDSQUARE", conv->rec.my_gridsquare); conv->newstation = true; } else { if (val[0] == '\0') { // If station location has an empty grid tqsl_setLocationField(conv->loc, "GRIDSQUARE", conv->rec.my_gridsquare); conv->newstation = true; } else { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Gridsquare|%s|%s", val, conv->rec.my_gridsquare); set_tagline(conv, "GRIDSQUARE"); tqslTrace("tqsl_getConverterGABBI", "incorrect gridsquare error %s", tQSL_CustomError); tQSL_Error = TQSL_LOCATION_MISMATCH; return 0; } } } if (!okgrid) { if (conv->location_handling == TQSL_LOC_UPDATE) { tqsl_setLocationField(conv->loc, "GRIDSQUARE", conv->rec.my_gridsquare); conv->newstation = true; } else { if (val[0] == '\0') { // If station location has an empty grid tqsl_setLocationField(conv->loc, "GRIDSQUARE", conv->rec.my_gridsquare); conv->newstation = true; } else { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Gridsquare|%s|%s", val, conv->rec.my_gridsquare); set_tagline(conv, "GRIDSQUARE"); tQSL_Error = TQSL_LOCATION_MISMATCH; return 0; } } } } switch (conv->dxcc) { case 6: // Alaska case 110: // Hawaii case 291: // Cont US if (check_station(conv, "US_STATE", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "US State|%s|%s", true)) return 0; if (check_station(conv, "US_COUNTY", "MY_CNTY", conv->rec.my_county, sizeof conv->rec.my_county, "US County|%s|%s", false)) return 0; break; case 1: // Canada if (check_station(conv, "CA_PROVINCE", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "CA Province|%s|%s", true)) return 0; break; case 15: // Asiatic Russia case 54: // European Russia case 61: // FJL case 125: // Juan Fernandez case 151: // Malyj Vysotskij if (check_station(conv, "RU_OBLAST", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "RU Oblast|%s|%s", true)) return 0; break; case 318: // China if (check_station(conv, "CN_PROVINCE", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "CN Province|%s|%s", true)) return 0; break; case 150: // Australia if (check_station(conv, "AU_STATE", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "AU State|%s|%s", true)) return 0; break; case 339: // Japan if (check_station(conv, "JA_PREFECTURE", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "JA Prefecture|%s|%s", true)) return 0; if (check_station(conv, "JA_CITY_GUN_KU", "MY_CNTY", conv->rec.my_county, sizeof conv->rec.my_county, "JA City/Gun/Ku|%s|%s", false)) return 0; break; case 5: // Finland if (check_station(conv, "FI_KUNTA", "MY_STATE", conv->rec.my_state, sizeof conv->rec.my_state, "FI Kunta|%s|%s", true)) return 0; break; } if (check_station(conv, "ITUZ", "MY_ITU_ZONE", conv->rec.my_itu_zone, sizeof conv->rec.my_itu_zone, "ITU Zone|%s|%s", false)) return 0; if (check_station(conv, "CQZ", "MY_CQ_ZONE", conv->rec.my_cq_zone, sizeof conv->rec.my_cq_zone, "CQ Zone|%s|%s", false)) return 0; if (conv->rec.my_iota[0] != '\0') { // IOTA identifiers: AF-123 form. int num = strtol(conv->rec.my_iota + 3, NULL, 10); if ((num == 0) || (strlen(conv->rec.my_iota) != 6) || (strncmp(conv->rec.my_iota, "AF-", 3) && strncmp(conv->rec.my_iota, "AN-", 3) && strncmp(conv->rec.my_iota, "AS-", 3) && strncmp(conv->rec.my_iota, "EU-", 3) && strncmp(conv->rec.my_iota, "NA-", 3) && strncmp(conv->rec.my_iota, "OC-", 3) && strncmp(conv->rec.my_iota, "SA-", 3))) { conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "MY_IOTA|%s", conv->rec.my_iota); tQSL_Error = TQSL_INVALID_ADIF; set_tagline(conv, "MY_IOTA"); tqslTrace("tqsl_getConverterGABBI", "my_iota error %s", tQSL_CustomError); return 0; } if (check_station(conv, "IOTA", "MY_IOTA", conv->rec.my_iota, sizeof conv->rec.my_iota, "IOTA|%s|%s", false)) return 0; } char locstate[5]; locstate[0] = '\0'; if (conv->rec.my_cnty_state[0] != '\0') { tqsl_getLocationField(conv->loc, "US_STATE", locstate, sizeof locstate); if (strcasecmp(conv->rec.my_cnty_state, locstate)) { // County does not match state conv->rec_done = true; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "US County State|%s|%s", conv->rec.my_cnty_state, locstate); set_tagline(conv, "US_STATE"); tqslTrace("tqsl_getConverterGABBI", "us_state error %s", tQSL_CustomError); tQSL_Error = TQSL_LOCATION_MISMATCH | TQSL_MSG_FLAGGED; return 0; } } if (conv->newstation) { conv->newstation = false; conv->loc_uid++; return get_station_rec(conv); } } // if ignoring MY_ fields if (conv->need_station_rec) { conv->loc_uid++; return get_station_rec(conv); } const char *grec = tqsl_getGABBItCONTACTData(conv->certs[conv->cert_idx], conv->loc, &(conv->rec), conv->loc_uid, signdata, sizeof(signdata)); if (conv->dupes_only || grec) { conv->rec_done = true; if (!conv->allow_dupes) { char stnloc[128]; unsigned char qso[128]; if (tqsl_getLocationStationDetails(conv->loc, stnloc, sizeof stnloc)) { stnloc[0] = '\0'; } if (tqsl_getLocationQSODetails(conv->loc, reinterpret_cast (qso), sizeof qso)) { qso[0] = '\0'; } // Old-style Lookup uses signdata and cert serial number // append signing key serial strncat(signdata, conv->serial, sizeof(signdata) - strlen(signdata)-1); // Updated dupe database entry. Key is formed from // local callsign concatenated with the QSO details char dupekey[128]; snprintf(dupekey, sizeof dupekey, "%s%s", conv->callsign, qso); char * dupedata = NULL; int rc = get_dbrec(conv->seendb, signdata, &dupedata); if (rc == 0) { if (dupedata) free(dupedata); //lookup was successful; thus this is a duplicate. tqslTrace("tqsl_getConverterGABBI", "Duplicate QSO signdata=%s", signdata); tQSL_Error = TQSL_DUPLICATE_QSO; tQSL_CustomError[0] = '\0'; // delete the old record del_dbrec(conv->seendb, signdata); // Update this to the current format int dbput_err = put_dbrec(conv->seendb, dupekey, stnloc); if (0 != dbput_err) { strncpy(tQSL_CustomError, sqlite3_errmsg(conv->seendb), sizeof tQSL_CustomError); if (SQLITE_NOTADB == dbput_err) { close_db(conv); remove_db(conv->dbpath); free(conv->dbpath); } tqsl_db_get_errstr(conv); tQSL_Error = TQSL_DB_ERROR; return 0; } return 0; } else if (rc < 0) { //non-zero return, but not "not found" - thus error tqsl_db_get_errstr(conv); if (SQLITE_NOTADB == rc) { // This isn't a database close_db(conv); remove_db(conv->dbpath); free(conv->dbpath); } tQSL_Error = TQSL_DB_ERROR; return 0; // could be more specific but there's very little the user can do at this point anyway } rc = get_dbrec(conv->seendb, dupekey, &dupedata); if (rc == 0) { //lookup was successful; thus this is a duplicate. tqslTrace("tqsl_getConverterGABBI", "Duplicate QSO dupekey=%s", dupekey); tQSL_Error = TQSL_DUPLICATE_QSO; // Save the original and new station location details so those can be provided // with an error by the caller // here dupedata = "GRIDSQUARE: ML01OX", stnloc "GRIDSQUARE: MLO2oa". // Station loc details like "CQZ: 5, GRIDSQUARE: FM18ju, ITUZ: 8, US_COUNTY: Fairfax, US_STATE: VA" // If the same, it's just a dupe. if (!strcmp(dupedata, stnloc)) { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "%s|%s", dupedata, stnloc); free(dupedata); return 0; } // Strip spaces string olds = dupedata; size_t found = olds.find(' '); while (found != string::npos) { olds.replace(found, 1, ""); found = olds.find(' '); } string news = stnloc; found = news.find(' '); while (found != string::npos) { news.replace(found, 1, ""); found = news.find(' '); } // Iterate the previous and current station locations. vectoroldstn; vectorqsostn; splitStr(olds, oldstn, ','); splitStr(news, qsostn, ','); // What we have now is the vectors having "GRIDSQUARE:ML10X" in each entry. Look for changes. bool changed = false; for (size_t i = 0; i < oldstn.size(); i++) { size_t cp = oldstn[i].find(":"); string key = oldstn[i].substr(0, cp+1); for (size_t j = 0; j < qsostn.size(); j++) { cp = qsostn[j].find(":"); string qsokey = qsostn[j].substr(0, cp+1); // Finally - is the key the same? if (key == qsokey) { if (oldstn[i] != qsostn[j] && key != oldstn[i]) { changed = true; } break; } } if (changed) break; } if (changed) { snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "%s|%s", dupedata, stnloc); free(dupedata); return 0; } free(dupedata); // This is a valid update, delete the old one and let it update. del_dbrec(conv->seendb, dupekey); } else if (rc < 0) { //non-zero return, but not "not found" - thus error tqsl_db_get_errstr(conv); if (SQLITE_NOTADB == rc) { // Not a database close_db(conv); remove_db(conv->dbpath); free(conv->dbpath); } tQSL_Error = TQSL_DB_ERROR; return 0; // could be more specific but there's very little the user can do at this point anyway } int dbput_err; dbput_err = put_dbrec(conv->seendb, dupekey, reinterpret_cast(stnloc)); if (0 != dbput_err) { tqsl_db_get_errstr(conv); if (SQLITE_NOTADB == dbput_err) { close_db(conv); remove_db(conv->dbpath); free(conv->dbpath); } tQSL_Error = TQSL_DB_ERROR; return 0; } } } return grec; } // NOLINT(readability/fn_size) DLLEXPORT int CALLCONVENTION tqsl_getConverterCert(tQSL_Converter convp, tQSL_Cert *certp) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; if (certp == 0) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } *certp = conv->certs[conv->cert_idx]; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getConverterLine(tQSL_Converter convp, int *lineno) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; if (lineno == 0) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (conv->err_tag_line) { *lineno = conv->err_tag_line; return 0; } if (conv->cab) return tqsl_getCabrilloLine(conv->cab, lineno); else if (conv->adif) return tqsl_getADIFLine(conv->adif, lineno); *lineno = 0; return 0; } DLLEXPORT const char* CALLCONVENTION tqsl_getConverterRecordText(tQSL_Converter convp) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 0; return conv->rec_text.c_str(); } DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowBadCall(tQSL_Converter convp, int allow) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; conv->allow_bad_calls = (allow != 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowDuplicates(tQSL_Converter convp, int allow) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; conv->allow_dupes = (allow != 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreSeconds(tQSL_Converter convp, int ignore) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; conv->ignore_secs = (ignore != 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreCallsigns(tQSL_Converter convp, int ignore) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; conv->ignore_calls = (ignore != 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setConverterAppName(tQSL_Converter convp, const char *app) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; if (!app) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } conv->appName = strdup(app); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setConverterDupesOnly(tQSL_Converter convp, int dupesOnly) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; conv->dupes_only = (dupesOnly != 0); return 0; } DLLEXPORT int CALLCONVENTION tqsl_setConverterQTHDetails(tQSL_Converter convp, int logverify) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; conv->location_handling = logverify; return 0; } DLLEXPORT int CALLCONVENTION tqsl_converterRollBack(tQSL_Converter convp) { TQSL_CONVERTER *conv; tqslTrace("tqsl_converterRollBack", NULL); if (!(conv = check_conv(convp))) return 1; if (!conv->db_open) return 0; if (conv->txn) sqlite3_exec(conv->seendb, "ROLLBACK;", NULL, NULL, NULL); conv->txn = false; return 0; } DLLEXPORT int CALLCONVENTION tqsl_converterCommit(tQSL_Converter convp) { TQSL_CONVERTER *conv; tqslTrace("tqsl_converterCommit", NULL); if (!(conv = check_conv(convp))) return 1; if (!conv->db_open) return 0; if (conv->txn) sqlite3_exec(conv->seendb, "COMMIT;", NULL, NULL, NULL); conv->txn = false; return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecords(tQSL_Converter convp, char *key, char *data, int keylen) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; if (!conv->db_open) { if (!open_db(conv, true)) { // If can't open dupes DB return 1; } } // First time setup if (conv->bulk_read == NULL) { int rc = sqlite3_prepare_v2(conv->seendb, "SELECT * from QSOs;", 256, &conv->bulk_read, NULL); if (SQLITE_OK != rc) { return 1; } } // Get a record int rc = sqlite3_step(conv->bulk_read); if (SQLITE_DONE == rc) { sqlite3_finalize(conv->bulk_read); conv->bulk_read = NULL; return -1; // No more } if (SQLITE_ROW != rc) { fprintf(stderr, "SQL error in step: %s\n", sqlite3_errmsg(conv->seendb)); sqlite3_finalize(conv->bulk_read); conv->bulk_read = NULL; return 1; } const unsigned char* result = sqlite3_column_text(conv->bulk_read, 1); if (!result) { tqsl_db_get_errstr(conv); tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; return 1; } strncpy(data, reinterpret_cast(result), keylen); return 0; } DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecordsV2(tQSL_Converter convp, char *key, char *data, int keylen) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 1; if (!conv->db_open) { if (!open_db(conv, true)) { // If can't open dupes DB return 1; } } if (!conv->bulk_read) { int rc = sqlite3_prepare_v2(conv->seendb, "SELECT * from QSOs;", 256, &conv->bulk_read, NULL); if (SQLITE_OK != rc) { return 1; } } // Get a record int rc = sqlite3_step(conv->bulk_read); if (SQLITE_DONE == rc) { sqlite3_finalize(conv->bulk_read); return -1; // No more } if (SQLITE_ROW != rc) { sqlite3_finalize(conv->bulk_read); tqsl_db_get_errstr(conv); tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; return 1; } const unsigned char* rkey = sqlite3_column_text(conv->bulk_read, 0); if (!rkey) { tqsl_db_get_errstr(conv); tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; return 1; } const unsigned char* rdata = sqlite3_column_text(conv->bulk_read, 1); if (!rdata) { tqsl_db_get_errstr(conv); tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; return 1; } strncpy(key, reinterpret_cast(rkey), keylen); strncpy(data, reinterpret_cast(rdata), keylen); return 0; } DLLEXPORT int CALLCONVENTION tqsl_putDuplicateRecord(tQSL_Converter convp, const char *key, const char *data, int keylen) { TQSL_CONVERTER *conv; if (!(conv = check_conv(convp))) return 0; if (!conv->db_open) { if (!open_db(conv, false)) { // If can't open dupes DB return 0; // Head back - possibly new DB created } } if (key == NULL || data == NULL || keylen <= 0) { tQSL_Error = TQSL_ARGUMENT_ERROR; close_db(conv); // The initial probe for a good dupes database uses this return 0; } int status = put_dbrec(conv->seendb, key, data); if (0 != status) { tqsl_db_get_errstr(conv); tQSL_Error = TQSL_DB_ERROR; tQSL_Errno = errno; return 1; } return 0; } static bool hasValidCallSignChars(const string& call) { // Check for invalid characters if (call.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/") != string::npos) return false; // Need at least one letter if (call.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ") == string::npos) return false; // Need at least one number if (call.find_first_of("0123456789") == string::npos) return false; // Invalid callsign patterns // Starting with 0, Q // 1x other than 1A, 1M, 1S string first = call.substr(0, 1); string second = call.substr(1, 1); if (first == "0" || first == "Q" || #ifdef MARK_C7_4Y_INVALID (first == "C" && second == "7") || (first == "4" && second == "Y") || #endif (first == "1" && second != "A" && second != "M" && second != "S")) return false; return true; } static bool checkCallSign(const string& call) { if (!hasValidCallSignChars(call)) return false; if (call.length() < 3) return false; string::size_type idx, newidx; for (idx = 0; idx != string::npos; idx = newidx+1) { string s; newidx = call.find('/', idx); if (newidx == string::npos) s = call.substr(idx); else s = call.substr(idx, newidx - idx); if (s.length() == 0) return false; // Leading or trailing '/' is bad, bad! if (newidx == string::npos) break; } return true; } DLLEXPORT void CALLCONVENTION tqsl_removeUploadDatabase(void) { char *path = strdup(tQSL_BaseDir); remove_db(path); free(path); return; } tqsl-2.8.1/src/tqslconvert.h0000644000175000017500000002127115003421124016022 0ustar rmurphyrmurphy/*************************************************************************** convert.h - description ------------------- begin : Sun Nov 17 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __tqslconvert_h #define __tqslconvert_h #include "tqsllib.h" /** \file * tQSL library converter functions. */ /** \defgroup Convert Converter API * * The Converter API provides the capability of converting Cabrillo * and ADIF files to GABBI output. */ /** @{ */ typedef void * tQSL_Converter; //!< Opaque converter type used by applications //!< to access conversion functions //!< #ifdef __cplusplus extern "C" { #endif /** Create a simple converter object * * Allocates resources for converting logs and processing duplicate records. */ DLLEXPORT int CALLCONVENTION tqsl_beginConverter(tQSL_Converter *convp); /** Initiates the conversion process for an ADIF file. * * \c certs and \c ncerts define a set of certificates that are available to the * converter for signing records. Typically, this list will be obtained by * calling tqsl_selectCertificates(). * * tqsl_endConverter() should be called to free the resources when the conversion * is finished. */ DLLEXPORT int CALLCONVENTION tqsl_beginADIFConverter(tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc); /** Initiates the conversion process for a Cabrillo file. * * \c certs and \c ncerts define a set of certificates that are available to the * converter for signing records. Typically, this list will be obtained by * calling tqsl_selectCertificates(). * * tqsl_endConverter() should be called to free the resources when the conversion * is finished. */ DLLEXPORT int CALLCONVENTION tqsl_beginCabrilloConverter(tQSL_Converter *conv, const char *filename, tQSL_Cert *certs, int ncerts, tQSL_Location loc); /** End the conversion process by freeing the used resources. */ DLLEXPORT int CALLCONVENTION tqsl_endConverter(tQSL_Converter *conv); /** Configure the converter to allow (allow != 0) or disallow (allow == 0) * nonamateur call signs in the CALL field. (Note: the test for * validity is fairly trivial and will allow some nonamateur calls to * get through, but it does catch most common errors.) * * \c allow defaults to 0 when tqsl_beginADIFConverter or * tqsl_beginCabrilloConverter is called. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowBadCall(tQSL_Converter conv, int allow); #define TQSL_LOC_IGNORE 0 ///< Ignore MY_ ADIF fields #define TQSL_LOC_REPORT 1 ///< Report on MY_ ADIF fields not matching cert/location #define TQSL_LOC_UPDATE 2 ///< Update Cert/Loc to track MY_ ADIF fields /** Configure the converter's handing of QTH fields in an adif input file * * \c allow defaults to 0 when tqsl_beginADIFConverter or * tqsl_beginCabrilloConverter is called. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterQTHDetails(tQSL_Converter conv, int logverify); /** Configure the converter to allow (allow != 0) or disallow (allow == 0) * duplicate QSOs in a signed log. * Duplicate detection is done using QSO details, location details, and * certificate serial number. * * \c allow defaults to 1 for backwards compatibility when tqsl_beginADIFConverter or * tqsl_beginCabrilloConverter is called. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterAllowDuplicates(tQSL_Converter convp, int ignore); /** Configure the converter to ignore (ignore != 0) or include (ignore == 0) * seconds in times when detecting duplicate QSOs in a signed log. * Duplicate detection is done using QSO details, location details, and * certificate serial number. * * \c ignore defaults to 0. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreSeconds(tQSL_Converter convp, int ignore); /** Configure the converter to ignore (ignore != 0) or include (ignore == 0) * callsigns in ADIF logs, * * \c ignore defaults to 0. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterIgnoreCallsigns(tQSL_Converter convp, int ignore); /** Specify the name of the application using the conversion library. * This is output in a header record in the exported log file. * Call this before calling tqsl_getConverterGABBI. * * \c app is a c string containing the application name. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterAppName(tQSL_Converter convp, const char *app); /** Configure the converter to just write duplicate database records * No signing, etc. * * \c dupesOnly defaults to 0. */ DLLEXPORT int CALLCONVENTION tqsl_setConverterDupesOnly(tQSL_Converter convp, int dupesOnly); /** Roll back insertions into the duplicates database. * * This is called when cancelling creating a log, and causes any records * added to the duplicates database to be removed so re-processing that * log does not cause the records to be mis-marked as duplicates. */ DLLEXPORT int CALLCONVENTION tqsl_converterRollBack(tQSL_Converter convp); /** Commits insertions into the duplicates database. * * This is called when a log is created normally and without issue, and so * the presumption is that we are "done" with these QSOs. */ DLLEXPORT int CALLCONVENTION tqsl_converterCommit(tQSL_Converter convp); /** Bulk read the duplicate DB records * * This is called to retrieve the QSO records from the dupe database. * It returns the key/value pair upon each call. * Return -1 for end of file, 0 for success, 1 for errors. */ DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecords(tQSL_Converter convp, char *key, char *data, int keylen); /** Bulk read the duplicate DB records * * This is called to retrieve the QSO records from the dupe database. * It returns the key/value pair upon each call. * Return -1 for end of file, 0 for success, 1 for errors. * V2 expects a 256 byte buffer for the "data" string. */ DLLEXPORT int CALLCONVENTION tqsl_getDuplicateRecordsV2(tQSL_Converter convp, char *key, char *data, int keylen); /** Bulk write duplicate DB records * * This is called to store a QSO record into the dupe database. * * Return -1 for duplicate insertion, 0 for success, 1 for errors. */ DLLEXPORT int CALLCONVENTION tqsl_putDuplicateRecord(tQSL_Converter convp, const char *key, const char *data, int keylen); /** Set QSO date filtering in the converter. * * If \c start points to a valid date, QSOs prior to that date will be ignored * by the converter. Similarly, if \c end points to a valid date, QSOs after * that date will be ignored. Either or both may be NULL (or point to an * invalid date) to disable date filtering for the respective range. */ DLLEXPORT int CALLCONVENTION tqsl_setADIFConverterDateFilter(tQSL_Converter conv, tQSL_Date *start, tQSL_Date *end); /** This is the main converter function. It returns a single GABBI * record. * * Returns the NULL pointer on error or EOF. (Test tQSL_Error to determine which.) * * tQSL_Error is set to TQSL_DATE_OUT_OF_RANGE if QSO date range checking * is active and the QSO date is outside the specified range. * This is a non-fatal error. * * tQSL_Error is set to TQSL_DUPLICATE_QSO if the QSO has already been * processed on the current computer. * * tQSL_Error is set to TQSL_NEW_UPLOAD_DB if a new uploads database was * created. This allows TQSL to attempt to re-load the QSOs from the most recent * automatic backup (if it exists). * * N.B. On systems that distinguish text-mode files from binary-mode files, * notably Windows, the GABBI records should be written in binary mode. * * N.B. If the selected certificate has not been initialized for signing via * tqsl_beginSigning(), this function will return a TQSL_SIGNINIT_ERROR. * The cert that caused the error can be obtained via tqsl_getConverterCert(), * initialized for signing, and then this function can be called again. No * data records will be lost in this process. */ DLLEXPORT const char* CALLCONVENTION tqsl_getConverterGABBI(tQSL_Converter conv); /** Get the certificate used to sign the most recent QSO record. */ DLLEXPORT int CALLCONVENTION tqsl_getConverterCert(tQSL_Converter conv, tQSL_Cert *certp); /** Get the input-file line number last read by the converter, starting * at line 1. */ DLLEXPORT int CALLCONVENTION tqsl_getConverterLine(tQSL_Converter conv, int *lineno); /** Get the text of the last record read by the converter. * * Returns NULL on error. */ DLLEXPORT const char* CALLCONVENTION tqsl_getConverterRecordText(tQSL_Converter conv); /** @} */ #ifdef __cplusplus } #endif #endif /* __tqslconvert_h */ tqsl-2.8.1/src/tqslerrno.h0000644000175000017500000000676315003421124015500 0ustar rmurphyrmurphy/*************************************************************************** tqslerrno.h - description ------------------- begin : Tue May 28 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __TQSLERRNO_H #define __TQSLERRNO_H /** \file * #tQSL_Error values */ #define TQSL_NO_ERROR 0 ///< No error #define TQSL_SYSTEM_ERROR 1 ///< System Error #define TQSL_OPENSSL_ERROR 2 ///< Error in OpenSSL calls #define TQSL_ADIF_ERROR 3 ///< ADIF Errors #define TQSL_CUSTOM_ERROR 4 ///< Custom errors - output to tQSL_CustomError #define TQSL_CABRILLO_ERROR 5 ///< Cabrillo handler error #define TQSL_OPENSSL_VERSION_ERROR 6 ///< OpenSSL version obsolete #define TQSL_ERROR_ENUM_BASE 16 ///< Base for enumerated errors #define TQSL_ALLOC_ERROR 16 ///< Memory allocation error #define TQSL_RANDOM_ERROR 17 ///< Error initializing random number generator #define TQSL_ARGUMENT_ERROR 18 ///< Invalid arguments #define TQSL_OPERATOR_ABORT 19 ///< Aborted by operator #define TQSL_NOKEY_ERROR 20 ///< No key available #define TQSL_BUFFER_ERROR 21 ///< Insufficient buffer space #define TQSL_INVALID_DATE 22 ///< Date string invalid #define TQSL_SIGNINIT_ERROR 23 ///< Error initializing signing routine #define TQSL_PASSWORD_ERROR 24 ///< Invalid password #define TQSL_EXPECTED_NAME 25 ///< Name expected but not supplied #define TQSL_NAME_EXISTS 26 ///< Entity name exists already #define TQSL_NAME_NOT_FOUND 27 ///< Entity name does not exist #define TQSL_INVALID_TIME 28 ///< Time format is invalid #define TQSL_CERT_DATE_MISMATCH 29 ///< Certificate date mismatch #define TQSL_PROVIDER_NOT_FOUND 30 ///< Certificate provider unknown #define TQSL_CERT_KEY_ONLY 31 ///< No signed public key is installed #define TQSL_CONFIG_ERROR 32 ///< There is an error in the configuration file #define TQSL_CERT_NOT_FOUND 33 ///< The certificate could not be found #define TQSL_PKCS12_ERROR 34 ///< There is an error parsing the .p12 file #define TQSL_CERT_TYPE_ERROR 35 ///< The certificate type is invalid #define TQSL_DATE_OUT_OF_RANGE 36 ///< The date is out of the valid range #define TQSL_DUPLICATE_QSO 37 ///< This QSO is previously signed #define TQSL_DB_ERROR 38 ///< The dupe database could not be accessed #define TQSL_LOCATION_NOT_FOUND 39 ///< The station location is invalid #define TQSL_CALL_NOT_FOUND 40 ///< The callsign could not be located #define TQSL_CONFIG_SYNTAX_ERROR 41 ///< The config file has a syntax error #define TQSL_FILE_SYSTEM_ERROR 42 ///< There was a file system I/O error #define TQSL_FILE_SYNTAX_ERROR 43 ///< The file format is invalid #define TQSL_CERT_ERROR 44 ///< Callsign certificate could not be installed #define TQSL_CERT_MISMATCH 45 ///< Callsign Certificate does not match QSO details #define TQSL_LOCATION_MISMATCH 46 ///< Station Location does not match QSO details #define TQSL_NEW_UPLOAD_DB 47 ///< New upload database created, try to re-load it #define TQSL_INCONSISTENT_GRID 48 ///< Gridsquare inconsistent with location #define TQSL_INVALID_ADIF 49 ///< ADIF field value is invalid #define TQSL_CERT_NOT_FOUND_INVALID 0x10000 ///< Certificate is invalid #define TQSL_CERT_NOT_FOUND_EXPIRED 0x20000 ///< Certificate has expired #define TQSL_CERT_NOT_FOUND_SUPERCEDED 0x40000 ///< Certificate has been replaced with a newer one #endif /* __TQSLERRNO_H */ tqsl-2.8.1/src/tqslexc.h0000644000175000017500000000173115003421124015120 0ustar rmurphyrmurphy/*************************************************************************** tqslexc.h - description ------------------- begin : Sat Dec 14 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __tqslexc_h #define __tqslexc_h #include #include #include "tqsllib.h" using std::exception; using std::string; class myexc : public exception { public: explicit myexc(const string& err) : exception() { _err = err; } myexc(const myexc& x) { _err = x._err; } virtual const char *what() const throw () { return _err.c_str(); } virtual ~myexc() throw() {} private: string _err; }; class tqslexc : public myexc { public: tqslexc() : myexc(tqsl_getErrorString()) {} }; #endif // __tqslexc_h tqsl-2.8.1/src/tqsllib-doc.h0000644000175000017500000000264415003421124015656 0ustar rmurphyrmurphy/*************************************************************************** tqsllib-doc.h - description ------------------- begin : Tue Jun 4 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ /** \mainpage * * The TrustedQSL library API is divided into several groups: * * \li \ref CertStuff - Request, load and retrieve digital certificates * \li \ref Data - Manage station-location data and produce signed data records * \li \ref Convert - Convert and sign ADIF and Cabrillo log files * \li \ref Util - Functions to operate on objects, set system parameters, and report errors * \li \ref Sign - Low-level digital signing * \li \ref ADIF - Low-level parsing and creation of ADIF files * \li \ref Cabrillo - Low-level parsing of Cabrillo files. * * Most of the library functions return an integer value that is * zero if there is no error and 1 if there is an error. The specific * error can be determined by examining #tQSL_Error and, possibly, * #tQSL_ADIF_Error, #tQSL_Cabrillo_Error, #tQSL_ErrorFile and * #tQSL_CustomError. The tqsl_getErrorString() and tqsl_getErrorString_v() * functions can be used to get error text strings. * */ tqsl-2.8.1/src/tqsllib.cpp0000644000175000017500000010063715003421124015447 0ustar rmurphyrmurphy/*************************************************************************** tqsllib.c - description ------------------- begin : Mon May 20 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #define TQSLLIB_DEF #include "tqsllib.h" #include #include #include #include #include #ifdef _WIN32 #include #include #include #include #include #define strtok_r strtok_s #else #include #endif #include #include #include #if OPENSSL_VERSION_MAJOR >= 3 #include #endif #ifdef __APPLE__ #include #endif #include #include using std::string; #include "tqslerrno.h" #include "adif.h" #include "winstrdefs.h" #ifdef _WIN32 #define MKDIR(x, y) _wmkdir((x)) #else #define MKDIR(x, y) mkdir((x), (y)) #endif DLLEXPORTDATA int tQSL_Error = 0; DLLEXPORTDATA int tQSL_Errno = 0; DLLEXPORTDATA TQSL_ADIF_GET_FIELD_ERROR tQSL_ADIF_Error; DLLEXPORTDATA const char *tQSL_BaseDir = NULL; DLLEXPORTDATA const char *tQSL_RsrcDir = NULL; DLLEXPORTDATA char tQSL_ErrorFile[TQSL_MAX_PATH_LEN]; DLLEXPORTDATA char tQSL_CustomError[256]; DLLEXPORTDATA char tQSL_ImportCall[256]; DLLEXPORTDATA long tQSL_ImportSerial = 0; DLLEXPORTDATA FILE* tQSL_DiagFile = NULL; #define TQSL_OID_BASE "1.3.6.1.4.1.12348.1." #define TQSL_OID_CALLSIGN TQSL_OID_BASE "1" #define TQSL_OID_QSO_NOT_BEFORE TQSL_OID_BASE "2" #define TQSL_OID_QSO_NOT_AFTER TQSL_OID_BASE "3" #define TQSL_OID_DXCC_ENTITY TQSL_OID_BASE "4" #define TQSL_OID_SUPERCEDED_CERT TQSL_OID_BASE "5" #define TQSL_OID_CRQ_ISSUER_ORGANIZATION TQSL_OID_BASE "6" #define TQSL_OID_CRQ_ISSUER_ORGANIZATIONAL_UNIT TQSL_OID_BASE "7" #define TQSL_OID_CRQ_EMAIL TQSL_OID_BASE "8" #define TQSL_OID_CRQ_ADDRESS1 TQSL_OID_BASE "9" #define TQSL_OID_CRQ_ADDRESS2 TQSL_OID_BASE "10" #define TQSL_OID_CRQ_CITY TQSL_OID_BASE "11" #define TQSL_OID_CRQ_STATE TQSL_OID_BASE "12" #define TQSL_OID_CRQ_POSTAL TQSL_OID_BASE "13" #define TQSL_OID_CRQ_COUNTRY TQSL_OID_BASE "14" static const char *custom_objects[][3] = { { TQSL_OID_CALLSIGN, "AROcallsign", "AROcallsign" }, { TQSL_OID_QSO_NOT_BEFORE, "QSONotBeforeDate", "QSONotBeforeDate" }, { TQSL_OID_QSO_NOT_AFTER, "QSONotAfterDate", "QSONotAfterDate" }, { TQSL_OID_DXCC_ENTITY, "dxccEntity", "dxccEntity" }, { TQSL_OID_SUPERCEDED_CERT, "supercededCertificate", "supercededCertificate" }, { TQSL_OID_CRQ_ISSUER_ORGANIZATION, "tqslCRQIssuerOrganization", "tqslCRQIssuerOrganization" }, { TQSL_OID_CRQ_ISSUER_ORGANIZATIONAL_UNIT, "tqslCRQIssuerOrganizationalUnit", "tqslCRQIssuerOrganizationalUnit" }, { TQSL_OID_CRQ_EMAIL, "tqslCRQEmail", "tqslCRQEmail" }, { TQSL_OID_CRQ_ADDRESS1, "tqslCRQAddress1", "tqslCRQAddress1" }, { TQSL_OID_CRQ_ADDRESS2, "tqslCRQAddress2", "tqslCRQAddress2" }, { TQSL_OID_CRQ_CITY, "tqslCRQCity", "tqslCRQCity" }, { TQSL_OID_CRQ_STATE, "tqslCRQState", "tqslCRQState" }, { TQSL_OID_CRQ_POSTAL, "tqslCRQPostal", "tqslCRQPostal" }, { TQSL_OID_CRQ_COUNTRY, "tqslCRQCountry", "tqslCRQCountry" }, }; static const char *error_strings[] = { "Memory allocation failure", /* TQSL_ALLOC_ERROR */ "Unable to initialize random number generator", /* TQSL_RANDOM_ERROR */ "Invalid argument", /* TQSL_ARGUMENT_ERROR */ "Operator aborted operation", /* TQSL_OPERATOR_ABORT */ "No Certificate Request matches the selected Callsign Certificate",/* TQSL_NOKEY_ERROR */ "Buffer too small", /* TQSL_BUFFER_ERROR */ "Invalid date format", /* TQSL_INVALID_DATE */ "Certificate not initialized for signing", /* TQSL_SIGNINIT_ERROR */ "Passphrase not correct", /* TQSL_PASSWORD_ERROR */ "Expected name", /* TQSL_EXPECTED_NAME */ "Name exists", /* TQSL_NAME_EXISTS */ "Data for this DXCC entity could not be found", /* TQSL_NAME_NOT_FOUND */ "Invalid time format", /* TQSL_INVALID_TIME */ "QSO date is not within the date range specified on your Callsign Certificate", /* TQSL_CERT_DATE_MISMATCH */ "Certificate provider not found", /* TQSL_PROVIDER_NOT_FOUND */ "No callsign certificate for key", /* TQSL_CERT_KEY_ONLY */ "Configuration file cannot be opened", /* TQSL_CONFIG_ERROR */ "The private key for this Callsign Certificate is not present on this computer; you can obtain it by loading a .tbk or .p12 file", /* TQSL_CERT_NOT_FOUND */ "PKCS#12 file not TQSL compatible", /* TQSL_PKCS12_ERROR */ "Callsign Certificate not TQSL compatible", /* TQSL_CERT_TYPE_ERROR */ "Date out of range", /* TQSL_DATE_OUT_OF_RANGE */ "Previously Signed QSO detected", /* TQSL_DUPLICATE_QSO */ "Database error", /* TQSL_DB_ERROR */ "The selected station location could not be found", /* TQSL_LOCATION_NOT_FOUND */ "The selected callsign could not be found", /* TQSL_CALL_NOT_FOUND */ "The TQSL configuration file cannot be parsed", /* TQSL_CONFIG_SYNTAX_ERROR */ "This file can not be processed due to a system error", /* TQSL_FILE_SYSTEM_ERROR */ "The format of this file is incorrect.", /* TQSL_FILE_SYNTAX_ERROR */ "This Callsign Certificate could not be installed", /* TQSL_CERT_ERROR */ "Callsign Certificate does not match QSO details", /* TQSL_CERT_MISMATCH */ "Station Location does not match QSO details", /* TQSL_LOCATION_MISMATCH */ "Gridsquare is inconsistent with Station Location", /* TQSL_INCONSISTENT_GRID */ "ADIF field has invalid contents", /* TQSL_INVALID_ADIF */ /* note - dupe table in wxutil.cpp */ }; #if !defined(__APPLE__) && !defined(_WIN32) && !defined(__clang__) #pragma GCC diagnostic ignored "-Wformat-truncation" #endif const char* tqsl_openssl_error(void); #if defined(_WIN32) static int pmkdir(const wchar_t *path, int perm) { wchar_t dpath[TQSL_MAX_PATH_LEN]; wchar_t npath[TQSL_MAX_PATH_LEN]; wchar_t *cp; char *p = wchar_to_utf8(path, true); tqslTrace("pmkdir", "path=%s", p); free(p); int nleft = sizeof(npath) / sizeof(npath[0]) - 1; wcsncpy(dpath, path, sizeof(dpath) / sizeof(dpath[0])); cp = wcstok(dpath, L"/\\"); npath[0] = 0; while (cp) { if (wcslen(cp) > 0 && cp[wcslen(cp)-1] != ':') { wcsncat(npath, L"\\", nleft); nleft--; wcsncat(npath, cp, nleft); nleft -= wcslen(cp); if (MKDIR(npath, perm) != 0 && errno != EEXIST) { tqslTrace("pmkdir", "Error creating %s: %s", npath, strerror(errno)); return 1; } } else { wcsncat(npath, cp, nleft); nleft -= wcslen(cp); } cp = wcstok(NULL, L"/\\"); } return 0; } #else // defined(_WIN32) static int pmkdir(const char *path, int perm) { char dpath[TQSL_MAX_PATH_LEN]; char npath[TQSL_MAX_PATH_LEN]; char *cp; tqslTrace("pmkdir", "path=%s", path); int nleft = sizeof npath - 1; strncpy(dpath, path, sizeof dpath); char *state = NULL; cp = strtok_r(dpath, "/\\", &state); npath[0] = 0; while (cp) { if (strlen(cp) > 0 && cp[strlen(cp)-1] != ':') { strncat(npath, "/", nleft); nleft--; strncat(npath, cp, nleft); nleft -= strlen(cp); if (MKDIR(npath, perm) != 0 && errno != EEXIST) { tqslTrace("pmkdir", "Error creating %s: %s", npath, strerror(errno)); return 1; } } else { strncat(npath, cp, nleft); nleft -= strlen(cp); } cp = strtok_r(NULL, "/\\", &state); } return 0; } #endif // defined(_WIN32) static void tqsl_get_rsrc_dir() { tqslTrace("tqsl_get_rsrc_dir", NULL); #ifdef _WIN32 HKEY hkey; DWORD dtype; char wpath[TQSL_MAX_PATH_LEN]; DWORD bsize = sizeof wpath; int wval; if ((wval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\TrustedQSL"), 0, KEY_READ, &hkey)) == ERROR_SUCCESS) { wval = RegQueryValueEx(hkey, _T("InstallPath"), 0, &dtype, (LPBYTE)wpath, &bsize); RegCloseKey(hkey); if (wval == ERROR_SUCCESS) { string p = string(wpath); if (p[p.length() -1] == '\\') p = p.substr(0, p.length() - 1); tQSL_RsrcDir = strdup(p.c_str()); } } #elif defined(__APPLE__) // Get path to config.xml resource from bundle CFBundleRef tqslBundle = CFBundleGetMainBundle(); CFURLRef configXMLURL = CFBundleCopyResourceURL(tqslBundle, CFSTR("config"), CFSTR("xml"), NULL); if (configXMLURL) { CFStringRef pathString = CFURLCopyFileSystemPath(configXMLURL, kCFURLPOSIXPathStyle); CFRelease(configXMLURL); // Convert CFString path to config.xml to string object CFIndex maxStringLengthInBytes = CFStringGetMaximumSizeForEncoding(CFStringGetLength(pathString), kCFStringEncodingUTF8); char *pathCString = static_cast(malloc(maxStringLengthInBytes)); if (pathCString) { CFStringGetCString(pathString, pathCString, maxStringLengthInBytes, kCFStringEncodingASCII); CFRelease(pathString); size_t p; string path = string(pathCString); if ((p = path.find("/config.xml")) != string::npos) { path = path.substr(0, p); } tQSL_RsrcDir = strdup(path.c_str()); free(pathCString); } } #else // Get the base directory string p = CONFDIR; // Strip trailing "/" if (p[p.length() - 1] == '/') p = p.substr(0, p.length() - 1); // Check if running as an AppImage char *appdir = getenv("APPDIR"); if (appdir == NULL) { tQSL_RsrcDir = strdup(p.c_str()); } else { string p1 = appdir; // Strip trailing "/" if (p1[p1.length() - 1] == '/') p1 = p1.substr(0, p1.length() - 1); p1 = p1 + p; // Assume APPDIR is probably not an AppImage root tQSL_RsrcDir = strdup(p.c_str()); // See if it's likely to be an AppImage struct stat s; if (stat(p1.c_str(), &s) == 0) { if (S_ISDIR(s.st_mode)) { tQSL_RsrcDir = strdup(p1.c_str()); } } } #endif tqslTrace("tqsl_get_rsrc_dir", "rsrc_path=%s", tQSL_RsrcDir); } DLLEXPORT int CALLCONVENTION tqsl_init() { static char semaphore = 0; unsigned int i; ERR_clear_error(); tqsl_getErrorString(); /* Clear the error status */ if (semaphore) return 0; #ifdef _WIN32 static wchar_t path[TQSL_MAX_PATH_LEN]; // lets cin/out/err work in windows // AllocConsole(); // freopen("CONIN$", "r", stdin); // freopen("CONOUT$", "w", stdout); // freopen("CONOUT$", "w", stderr); // not used DWORD bsize = sizeof path; int wval; #else static char path[TQSL_MAX_PATH_LEN]; #endif #if !defined(_WIN32) && !defined(__APPLE__) // Work around ill-considered decision by Fedora to stop allowing // certificates with SHA-1 signatures setenv("OPENSSL_ENABLE_SHA1_SIGNATURES", "1", 0); #endif /* OpenSSL API tends to change between minor version numbers, so make sure * we're using the right version */ #if OPENSSL_VERSION_NUMBER >= 0x10100000L unsigned long SSLver = OpenSSL_version_num(); #else long SSLver = SSLeay(); #endif int SSLmajor = (SSLver >> 28) & 0xff; int SSLminor = (SSLver >> 20) & 0xff; int TQSLmajor = (OPENSSL_VERSION_NUMBER >> 28) & 0xff; int TQSLminor = (OPENSSL_VERSION_NUMBER >> 20) & 0xff; if (SSLmajor != TQSLmajor || (SSLminor != TQSLminor && (SSLmajor != 9 && SSLminor != 7 && TQSLminor == 6))) { tqslTrace("tqsl_init", "version error - ssl %d.%d", SSLmajor, SSLminor); tQSL_Error = TQSL_OPENSSL_VERSION_ERROR; return 1; } #if OPENSSL_VERSION_MAJOR >= 3 // // OpenSSL 3.x moved several algorithms to "legacy" status and doesn't // enable them by default. Initialize the legacy provider to enable these. // Then enable the default provider. // OSSL_PROVIDER *def; OSSL_PROVIDER *legacy; legacy = OSSL_PROVIDER_load(NULL, "legacy"); if (legacy == NULL) { tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } def = OSSL_PROVIDER_load(NULL, "default"); if (def == NULL) { tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } #endif #if OPENSSL_VERSION_NUMBER < 0x10100000L ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); #endif for (i = 0; i < (sizeof custom_objects / sizeof custom_objects[0]); i++) { if (OBJ_create(custom_objects[i][0], custom_objects[i][1], custom_objects[i][2]) == 0) { tqslTrace("tqsl_init", "Error making custom objects: %s", tqsl_openssl_error()); tQSL_Error = TQSL_OPENSSL_ERROR; return 1; } } if (tQSL_RsrcDir == NULL) { tqsl_get_rsrc_dir(); } if (tQSL_BaseDir == NULL) { #if defined(_WIN32) wchar_t *wcp; if ((wcp = _wgetenv(L"TQSLDIR")) != NULL && *wcp != '\0') { wcsncpy(path, wcp, sizeof(path) / sizeof(path[0])); #else char *cp; if ((cp = getenv("TQSLDIR")) != NULL && *cp != '\0') { strncpy(path, cp, sizeof path); #endif } else { #if defined(_WIN32) wval = SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, path); if (wval != ERROR_SUCCESS) wcsncpy(path, L"C:", sizeof(path) / sizeof(path[0])); wcsncat(path, L"\\TrustedQSL", sizeof(path) / sizeof(path[0]) - wcslen(path) - 1); #elif defined(LOTW_SERVER) strncpy(path, "/var/lotw/tqsl", sizeof path); #else // some unix flavor if (getenv("HOME") != NULL) { strncpy(path, getenv("HOME"), sizeof path); strncat(path, "/", sizeof path - strlen(path)-1); strncat(path, ".tqsl", sizeof path - strlen(path)-1); } else { strncpy(path, ".tqsl", sizeof path); } #endif } if (pmkdir(path, 0700)) { #if defined(_WIN32) char *p = wchar_to_utf8(path, false); strncpy(tQSL_ErrorFile, p, sizeof tQSL_ErrorFile); #else strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile); #endif tQSL_Error = TQSL_SYSTEM_ERROR; tQSL_Errno = errno; #if defined(_WIN32) tqslTrace("tqsl_init", "Error creating working path %s: %s", p, strerror(errno)); free(p); #else tqslTrace("tqsl_init", "Error creating working path %s: %s", path, strerror(errno)); #endif return 1; } FILE *test; #if defined(_WIN32) tQSL_BaseDir = wchar_to_utf8(path, true); wcsncat(path, L"\\tmp.tmp", sizeof(path) / sizeof(path[0]) - wcslen(path) - 1); if ((test = _wfopen(path, L"wb")) == NULL) { tQSL_Errno = errno; char *p = wchar_to_utf8(path, false); snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Unable to create files in the TQSL working directory (%s): %m", p); tQSL_Error = TQSL_CUSTOM_ERROR; return 1; } fclose(test); _wunlink(path); #else if (tQSL_BaseDir) free (const_cast(tQSL_BaseDir)); tQSL_BaseDir = strdup(path); strncat(path, "/tmp.tmp", sizeof path -strlen(path) - 1); if ((test = fopen(path, "wb")) == NULL) { tQSL_Errno = errno; snprintf(tQSL_CustomError, sizeof tQSL_CustomError, "Unable to create files in the TQSL working directory (%s): %m", tQSL_BaseDir); tQSL_Error = TQSL_CUSTOM_ERROR; return 1; } fclose(test); unlink(path); #endif } // // Ensure that tQSL_RsrcDir is set // Correction from JJ1BDX // if (!tQSL_RsrcDir) tQSL_RsrcDir = tQSL_BaseDir; semaphore = 1; return 0; } DLLEXPORT int CALLCONVENTION tqsl_setDirectory(const char *dir) { static char path[TQSL_MAX_PATH_LEN]; if (strlen(dir) >= TQSL_MAX_PATH_LEN) { tQSL_Error = TQSL_BUFFER_ERROR; return 1; } strncpy(path, dir, sizeof path); tQSL_BaseDir = path; return 0; } DLLEXPORT const char* CALLCONVENTION tqsl_getErrorString_v(int err) { static char buf[512]; unsigned long openssl_err; int adjusted_err; if (err == 0) return "NO ERROR"; if (err == TQSL_CUSTOM_ERROR) { if (tQSL_CustomError[0] == 0) { return "Unknown custom error"; } else { strncpy(buf, tQSL_CustomError, sizeof buf); return buf; } } if (err == TQSL_DB_ERROR && tQSL_CustomError[0] != 0) { snprintf(buf, sizeof buf, "Database Error: %s", tQSL_CustomError); return buf; } if (err == TQSL_SYSTEM_ERROR || err == TQSL_FILE_SYSTEM_ERROR) { if (strlen(tQSL_ErrorFile) > 0) { snprintf(buf, sizeof buf, "System error: %s : %s", tQSL_ErrorFile, strerror(tQSL_Errno)); tQSL_ErrorFile[0] = '\0'; } else { snprintf(buf, sizeof buf, "System error: %s", strerror(tQSL_Errno)); } return buf; } if (err == TQSL_FILE_SYNTAX_ERROR) { tqslTrace("SyntaxError", "File (partial) content '%s'", tQSL_CustomError); if (strlen(tQSL_ErrorFile) > 0) { snprintf(buf, sizeof buf, "File syntax error: %s", tQSL_ErrorFile); tQSL_ErrorFile[0] = '\0'; } else { strncpy(buf, "File syntax error", sizeof buf); } return buf; } if (err == TQSL_OPENSSL_ERROR) { openssl_err = ERR_get_error(); strncpy(buf, "OpenSSL error: ", sizeof buf); if (openssl_err) ERR_error_string_n(openssl_err, buf + strlen(buf), sizeof buf - strlen(buf)-1); else strncat(buf, "[error code not available]", sizeof buf - strlen(buf)-1); return buf; } if (err == TQSL_ADIF_ERROR) { buf[0] = 0; if (strlen(tQSL_ErrorFile) > 0) { snprintf(buf, sizeof buf, "%s: %s", tQSL_ErrorFile, tqsl_adifGetError(tQSL_ADIF_Error)); tQSL_ErrorFile[0] = '\0'; } else { snprintf(buf, sizeof buf, "%s", tqsl_adifGetError(tQSL_ADIF_Error)); } return buf; } if (err == TQSL_CABRILLO_ERROR) { buf[0] = 0; if (strlen(tQSL_ErrorFile) > 0) { snprintf(buf, sizeof buf, "%s: %s", tQSL_ErrorFile, tqsl_cabrilloGetError(tQSL_Cabrillo_Error)); tQSL_ErrorFile[0] = '\0'; } else { snprintf(buf, sizeof buf, "%s", tqsl_cabrilloGetError(tQSL_Cabrillo_Error)); } return buf; } if (err == TQSL_OPENSSL_VERSION_ERROR) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L unsigned long SSLver = OpenSSL_version_num(); #else long SSLver = SSLeay(); #endif snprintf(buf, sizeof buf, "Incompatible OpenSSL Library version %d.%d.%d; expected %d.%d.%d", static_cast(SSLver >> 28) & 0xff, static_cast(SSLver >> 20) & 0xff, static_cast(SSLver >> 12) & 0xff, static_cast(OPENSSL_VERSION_NUMBER >> 28) & 0xff, static_cast(OPENSSL_VERSION_NUMBER >> 20) & 0xff, static_cast(OPENSSL_VERSION_NUMBER >> 12) & 0xff); return buf; } if ((err & 0xff) == TQSL_CERT_NOT_FOUND) { if (tQSL_ImportCall[0] == '\0') strncpy(tQSL_ImportCall, "unknown", sizeof tQSL_ImportCall); if ((err & TQSL_CERT_NOT_FOUND_SUPERCEDED)) { snprintf(buf, sizeof buf, "This is not the current callsign certificate file for %s - download the latest from https://lotw.arrl.org/lotwuser/certs.tq6", tQSL_ImportCall); tQSL_ImportCall[0] = '\0'; return buf; } if ((err & TQSL_CERT_NOT_FOUND_EXPIRED)) { snprintf(buf, sizeof buf, "You cannot install this Callsign Certificate as it has expired - download the latest from https://lotw.arrl.org/lotwuser/certs.tq6"); tQSL_ImportCall[0] = '\0'; return buf; } if ((err & TQSL_CERT_NOT_FOUND_INVALID)) { snprintf(buf, sizeof buf, "This TQ6 file is corrupt and cannot be installed. Download the latest from https://lotw.arrl.org/lotwuser/certs.tq6"); tQSL_ImportCall[0] = '\0'; return buf; } snprintf(buf, sizeof buf, "This file is related to a callsign certificate request from some other computer. You can only open this on the computer system logged in as the user that requested the callsign certificate for %s.", tQSL_ImportCall); tQSL_ImportCall[0] = '\0'; return buf; } adjusted_err = ((err & 0xff) - TQSL_ERROR_ENUM_BASE); if (adjusted_err < 0 || adjusted_err >= static_cast(sizeof error_strings / sizeof error_strings[0])) { snprintf(buf, sizeof buf, "Invalid error code: %d", err); return buf; } if (err == TQSL_CERT_MISMATCH || err == TQSL_LOCATION_MISMATCH) { const char *fld, *cert, *qso; char *state = NULL; fld = strtok_r(tQSL_CustomError, "|", &state); cert = strtok_r(NULL, "|", &state); qso = strtok_r(NULL, "|", &state); if (qso == NULL) { // Nothing in the cert qso = cert; cert = "none"; } snprintf(buf, sizeof buf, "%s\nThe %s '%s' has value '%s' while QSO has '%s'", error_strings[adjusted_err], err == TQSL_LOCATION_MISMATCH ? "Station Location" : "Callsign Certificate", fld, cert, qso); return buf; } if (err == (TQSL_LOCATION_MISMATCH | TQSL_MSG_FLAGGED)) { const char *fld, *val; char *state = NULL; fld = strtok_r(tQSL_CustomError, "|", &state); val = strtok_r(NULL, "|", &state); snprintf(buf, sizeof buf, "This log has invalid QSO information.\nThe log being signed has '%s' set to value '%s' which is not valid", fld, val); return buf; } if (err == (TQSL_CERT_NOT_FOUND | TQSL_MSG_FLAGGED)) { const char *call, *ent; err = TQSL_CERT_NOT_FOUND; char *state = NULL; call = strtok_r(tQSL_CustomError, "|", &state); ent = strtok_r(NULL, "|", &state); snprintf(buf, sizeof buf, "There is no valid callsign certificate for %s in entity %s available. This QSO cannot be signed", call, ent); return buf; } return error_strings[adjusted_err]; } DLLEXPORT const char* CALLCONVENTION tqsl_getErrorString() { const char *cp; cp = tqsl_getErrorString_v(tQSL_Error); tQSL_Error = TQSL_NO_ERROR; tQSL_Errno = 0; tQSL_ErrorFile[0] = 0; tQSL_CustomError[0] = 0; return cp; } DLLEXPORT int CALLCONVENTION tqsl_encodeBase64(const unsigned char *data, int datalen, char *output, int outputlen) { BIO *bio = NULL, *bio64 = NULL; int n; char *memp; int rval = 1; if (data == NULL || output == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; tqslTrace("tqsl_encodeBase64", "arg err data=0x%lx, output=0x%lx", data, output); return rval; } if ((bio = BIO_new(BIO_s_mem())) == NULL) { tqslTrace("tqsl_encodeBase64", "BIO_new err %s", tqsl_openssl_error()); goto err; } if ((bio64 = BIO_new(BIO_f_base64())) == NULL) { tqslTrace("tqsl_encodeBase64", "BIO_new64 err %s", tqsl_openssl_error()); goto err; } bio = BIO_push(bio64, bio); if (BIO_write(bio, data, datalen) < 1) { tqslTrace("tqsl_encodeBase64", "BIO_write err %s", tqsl_openssl_error()); goto err; } if (BIO_flush(bio) != 1) { tqslTrace("tqsl_encodeBase64", "BIO_flush err %s", tqsl_openssl_error()); goto err; } n = BIO_get_mem_data(bio, &memp); if (n > outputlen-1) { tqslTrace("tqsl_encodeBase64", "buffer has %d, avail %d", n, outputlen); tQSL_Error = TQSL_BUFFER_ERROR; goto end; } memcpy(output, memp, n); output[n] = 0; BIO_free_all(bio); bio = NULL; rval = 0; goto end; err: tQSL_Error = TQSL_OPENSSL_ERROR; end: if (bio != NULL) BIO_free_all(bio); return rval; } DLLEXPORT int CALLCONVENTION tqsl_decodeBase64(const char *input, unsigned char *data, int *datalen) { BIO *bio = NULL, *bio64 = NULL; int n; int rval = 1; if (input == NULL || data == NULL || datalen == NULL) { tqslTrace("tqsl_decodeBase64", "arg error input=0x%lx, data=0x%lx, datalen=0x%lx", input, data, datalen); tQSL_Error = TQSL_ARGUMENT_ERROR; return rval; } if ((bio = BIO_new_mem_buf(const_cast(input), strlen(input))) == NULL) { tqslTrace("tqsl_decodeBase64", "BIO_new_mem_buf err %s", tqsl_openssl_error()); goto err; } BIO_set_mem_eof_return(bio, 0); if ((bio64 = BIO_new(BIO_f_base64())) == NULL) { tqslTrace("tqsl_decodeBase64", "BIO_new err %s", tqsl_openssl_error()); goto err; } bio = BIO_push(bio64, bio); // OpenSSL always adds a newline; account for cases where the base64 string isn't // newline terminated n = BIO_read(bio, data, *datalen); if (n < 0) { tqslTrace("tqsl_decodeBase64", "BIO_read error %s", tqsl_openssl_error()); goto err; } // Completely invalid input means no output. // return an appropriate error if (n == 0 && strlen(input) > 0) { tqslTrace("tqsl_decodeBase64", "Invalid input"); tQSL_Error = TQSL_ARGUMENT_ERROR; goto end; } if (BIO_ctrl_pending(bio) != 0) { tqslTrace("tqsl_decodeBase64", "ctrl_pending err %s", tqsl_openssl_error()); tQSL_Error = TQSL_BUFFER_ERROR; goto end; } *datalen = n; rval = 0; goto end; err: tQSL_Error = TQSL_OPENSSL_ERROR; end: if (bio != NULL) BIO_free_all(bio); return rval; } /* Convert a tQSL_Date field to an ISO-format date string */ DLLEXPORT char* CALLCONVENTION tqsl_convertDateToText(const tQSL_Date *date, char *buf, int bufsiz) { char lbuf[10]; int len; char *cp = buf; int bufleft = bufsiz-1; if (date == NULL || buf == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; if (buf) buf[0] = '\0'; return NULL; } if (date->year < 1 || date->year > 9999 || date->month < 1 || date->month > 12 || date->day < 1 || date->day > 31) { buf[0] = '\0'; return NULL; } len = snprintf(lbuf, sizeof lbuf, "%04d-", date->year); strncpy(cp, lbuf, bufleft); cp += len; bufleft -= len; len = snprintf(lbuf, sizeof lbuf, "%02d-", date->month); if (bufleft > 0) strncpy(cp, lbuf, bufleft); cp += len; bufleft -= len; len = snprintf(lbuf, sizeof lbuf, "%02d", date->day); if (bufleft > 0) strncpy(cp, lbuf, bufleft); bufleft -= len; if (bufleft < 0) return NULL; buf[bufsiz-1] = '\0'; return buf; } DLLEXPORT int CALLCONVENTION tqsl_isDateValid(const tQSL_Date *d) { static int mon_days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (d == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 0; } if (d->year < 1 || d->year > 9999) return 0; if (d->month < 1 || d->month > 12) return 0; if (d->day < 1 || d->day > 31) return 0; mon_days[2] = ((d->year % 4) == 0 && ((d->year % 100) != 0 || (d->year % 400) == 0)) ? 29 : 28; if (d->day > mon_days[d->month]) return 0; return 1; } DLLEXPORT int CALLCONVENTION tqsl_isDateNull(const tQSL_Date *d) { if (d == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } return (d->year == 0 && d->month == 0 && d->day == 0) ? 1 : 0; } /* Convert a tQSL_Time field to an ISO-format date string */ DLLEXPORT char* CALLCONVENTION tqsl_convertTimeToText(const tQSL_Time *time, char *buf, int bufsiz) { char lbuf[10]; int len; char *cp = buf; int bufleft = bufsiz-1; if (time == NULL || buf == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return NULL; } if (!tqsl_isTimeValid(time)) return NULL; len = snprintf(lbuf, sizeof lbuf, "%02d:", time->hour); strncpy(cp, lbuf, bufleft); cp += len; bufleft -= len; len = snprintf(lbuf, sizeof lbuf, "%02d:", time->minute); if (bufleft > 0) strncpy(cp, lbuf, bufleft); cp += len; bufleft -= len; len = snprintf(lbuf, sizeof lbuf, "%02d", time->second); if (bufleft > 0) strncpy(cp, lbuf, bufleft); cp += len; bufleft -= len; if (bufleft > 0) strncpy(cp, "Z", bufleft); bufleft -= 1; if (bufleft < 0) return NULL; buf[bufsiz-1] = '\0'; return buf; } DLLEXPORT int CALLCONVENTION tqsl_isTimeValid(const tQSL_Time *t) { if (t == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 0; } if (t->hour < 0 || t->hour > 23) return 0; if (t->minute < 0 || t->minute > 59) return 0; if (t->second < 0 || t->second > 59) return 0; return 1; } /* Compare two tQSL_Date values, returning -1, 0, 1 */ DLLEXPORT int CALLCONVENTION tqsl_compareDates(const tQSL_Date *a, const tQSL_Date *b) { if (a == NULL || b == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (a->year < b->year) return -1; if (a->year > b->year) return 1; if (a->month < b->month) return -1; if (a->month > b->month) return 1; if (a->day < b->day) return -1; if (a->day > b->day) return 1; return 0; } // Return the number of days for a given year/month (January=1) static int days_per_month(int year, int month) { switch (month) { case 2: if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) { return 29; } else { return 28; } case 4: case 6: case 9: case 11: return 30; default: return 31; } return 0; } // Return the julian day number for a given date. // One-based year/month/day static int julian_day(int year, int month, int day) { int jday = 0; for (int mon = 1; mon < month; mon ++) { jday += days_per_month(year, mon); } jday += day; return jday; } /* Calculate the difference between two tQSL_Date values */ DLLEXPORT int CALLCONVENTION tqsl_subtractDates(const tQSL_Date *a, const tQSL_Date *b, int *diff) { if (a == NULL || b == NULL || diff == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } tQSL_Date first = *a; tQSL_Date last = *b; int mult = 1; // Ensure that the first is earliest if (tqsl_compareDates(&last, &first) < 0) { first = *b; last = *a; mult = -1; } int delta = 0; for (; first.year < last.year; first.year++) { int fday = julian_day(first.year, first.month, first.day); int fend = julian_day(first.year, 12, 31); delta += (fend - fday + 1); // days until next 1 Jan first.month = 1; first.day = 1; } // Now the years are the same - calculate delta int fjulian = julian_day(first.year, first.month, first.day); int ljulian = julian_day(last.year, last.month, last.day); delta += (ljulian - fjulian); *diff = (delta * mult); // Swap sign if necessary return 0; } /* Fill a tQSL_Date struct with the date from a text string */ DLLEXPORT int CALLCONVENTION tqsl_initDate(tQSL_Date *date, const char *str) { const char *cp; if (date == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } if (str == NULL) { date->year = date->month = date->day = 0; return 0; } if ((cp = strchr(str, '-')) != NULL) { /* Parse YYYY-MM-DD */ date->year = strtol(str, NULL, 10); cp++; date->month = strtol(cp, NULL, 10); cp = strchr(cp, '-'); if (cp == NULL) goto err; cp++; date->day = strtol(cp, NULL, 10); } else if (strlen(str) == 8) { /* Parse YYYYMMDD */ char frag[10]; strncpy(frag, str, 4); frag[4] = 0; date->year = strtol(frag, NULL, 10); strncpy(frag, str+4, 2); frag[2] = 0; date->month = strtol(frag, NULL, 10); date->day = strtol(str+6, NULL, 10); } else { /* Invalid ISO date string */ goto err; } if (date->year < 1 || date->year > 9999) goto err; if (date->month < 1 || date->month > 12) goto err; if (date->day < 1 || date->day > 31) goto err; return 0; err: tQSL_Error = TQSL_INVALID_DATE; return 1; } /* Fill a tQSL_Time struct with the time from a text string */ DLLEXPORT int CALLCONVENTION tqsl_initTime(tQSL_Time *time, const char *str) { const char *cp; int parts[3]; int i; if (time == NULL) { tQSL_Error = TQSL_ARGUMENT_ERROR; return 1; } time->hour = time->minute = time->second = 0; if (str == NULL) return 0; if (strlen(str) < 3) { tQSL_Error = TQSL_INVALID_TIME; return 1; } parts[0] = parts[1] = parts[2] = 0; for (i = 0, cp = str; i < static_cast(sizeof parts / sizeof parts[0]); i++) { if (strlen(cp) < 2) break; if (!isdigit(*cp) || !isdigit(*(cp+1))) goto err; if (i == 0 && strlen(str) == 3) { // Special case: HMM -- no colons, one-digit hour parts[i] = *cp - '0'; ++cp; } else { parts[i] = (*cp - '0') * 10 + *(cp+1) - '0'; cp += 2; } if (*cp == ':') cp++; } if (parts[0] < 0 || parts[0] > 23) goto err; if (parts[1] < 0 || parts[1] > 59) goto err; if (parts[2] < 0 || parts[2] > 59) goto err; time->hour = parts[0]; time->minute = parts[1]; time->second = parts[2]; return 0; err: tQSL_Error = TQSL_INVALID_TIME; return 1; } DLLEXPORT int CALLCONVENTION tqsl_getVersion(int *major, int *minor) { if (major) *major = TQSLLIB_VERSION_MAJOR; if (minor) *minor = TQSLLIB_VERSION_MINOR; return 0; } #ifdef _WIN32 DLLEXPORT wchar_t* CALLCONVENTION utf8_to_wchar(const char* str) { wchar_t* buffer; int needed = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0); buffer = static_cast(malloc(needed*sizeof(wchar_t) + 4)); if (!buffer) return NULL; MultiByteToWideChar(CP_UTF8, 0, str, -1, &buffer[0], needed); return buffer; } DLLEXPORT char* CALLCONVENTION wchar_to_utf8(const wchar_t* str, bool forceUTF8) { char* buffer; int needed = WideCharToMultiByte(forceUTF8 ? CP_UTF8 : CP_ACP, 0, str, -1, 0, 0, NULL, NULL); buffer = static_cast(malloc(needed + 2)); if (!buffer) return NULL; WideCharToMultiByte(forceUTF8 ? CP_UTF8 : CP_ACP, 0, str, -1, &buffer[0], needed, NULL, NULL); return buffer; } DLLEXPORT void CALLCONVENTION free_wchar(wchar_t* ptr) { free(ptr); } #endif DLLEXPORT void CALLCONVENTION tqslTrace(const char *name, const char *format, ...) { va_list ap; if (!tQSL_DiagFile) return; time_t t = time(0); char timebuf[50]; strncpy(timebuf, ctime(&t), sizeof timebuf); timebuf[strlen(timebuf) - 1] = '\0'; // Strip the newline if (!format) { fprintf(tQSL_DiagFile, "%s %s\r\n", timebuf, name); fflush(tQSL_DiagFile); return; } else { if (name) { fprintf(tQSL_DiagFile, "%s %s: ", timebuf, name); } } va_start(ap, format); vfprintf(tQSL_DiagFile, format, ap); va_end(ap); fprintf(tQSL_DiagFile, "\r\n"); fflush(tQSL_DiagFile); } DLLEXPORT void CALLCONVENTION tqsl_closeDiagFile(void) { if (tQSL_DiagFile) fclose(tQSL_DiagFile); tQSL_DiagFile = NULL; } DLLEXPORT int CALLCONVENTION tqsl_diagFileOpen(void) { return tQSL_DiagFile != NULL; } DLLEXPORT int CALLCONVENTION tqsl_openDiagFile(const char *fname) { #ifdef _WIN32 wchar_t* lfn = utf8_to_wchar(fname); tQSL_DiagFile = _wfopen(lfn, L"wb"); free_wchar(lfn); #else tQSL_DiagFile = fopen(fname, "wb"); #endif return (tQSL_DiagFile == NULL); } const char* tqsl_openssl_error(void) { static char buf[256]; unsigned long openssl_err; openssl_err = ERR_peek_error(); if (openssl_err) ERR_error_string_n(openssl_err, buf, sizeof buf); else strncpy(buf, "[error code not available]", sizeof buf); return buf; } tqsl-2.8.1/src/tqsllib.css0000644000175000017500000000211615003421124015446 0ustar rmurphyrmurphyBODY { font-family: Helvetica,Arial,sans-serif; font-size: small } H1 { text-align: center; font-size: x-large } H2 { font-size: large } CODE { font-size: medium } A.qindex {} A.qindexRef {} A.el { text-decoration: none; font-weight: bold; } A.elRef { font-weight: bold } A.code { text-decoration: none; font-weight: normal; color: #4444ee } A.codeRef { font-weight: normal; color: #4444ee } A:link { color: #0000ff } A:visited { color: #0066cc } DL.el { margin-left: -1cm } DIV.fragment { width: 100%; border: none; background-color: #eeeeee } DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 } TD.md { background-color: #f2f2ff } DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold } DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller } FONT.keyword { color: #008000 } FONT.keywordtype { color: #604020 } FONT.keywordflow { color: #e08000 } FONT.comment { color: #800000 } FONT.preprocessor { color: #806020 } FONT.stringliteral { color: #002080 } FONT.charliteral { color: #008080 } TD { font-size: small } tqsl-2.8.1/src/tqsllib.h0000644000175000017500000017214615003421124015120 0ustar rmurphyrmurphy/*************************************************************************** tqsllib.h - description ------------------- begin : Mon May 20 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id: tqsllib.h,v 1.14 2013/03/01 13:26:44 k1mu Exp $ ***************************************************************************/ #ifndef TQSLLIB_H #define TQSLLIB_H #if defined(_WIN32) && !defined(TQSL_NODLL) #ifdef TQSLLIB_DEF #define DLLEXPORT __declspec(dllexport) #define DLLEXPORTDATA __declspec(dllexport) #define CALLCONVENTION __stdcall #else #define DLLEXPORT __declspec(dllimport) #define DLLEXPORTDATA __declspec(dllimport) #define CALLCONVENTION __stdcall #endif #else #define DLLEXPORT ///< Symbol exports - Windows only #define DLLEXPORTDATA ///< Symbol exports - Windows only #define CALLCONVENTION ///< Symbol exports - Windows only #include #endif #include #include "adif.h" #include "cabrillo.h" /** \file * tQSL library functions. */ #ifndef PATH_MAX // Should be set by #define PATH_MAX 4096 ///< Override in case not defined in limits.h #endif /* Sizes */ #define TQSL_MAX_PATH_LEN PATH_MAX ///< Max length of a FS path #define TQSL_PASSWORD_MAX 80 ///< Max password length #define TQSL_NAME_ELEMENT_MAX 256 ///< Max Org name length #define TQSL_CALLSIGN_MAX 20 ///< Max callsign length #define TQSL_CRQ_NAME_MAX 60 ///< Max length of request name #define TQSL_CRQ_ADDR_MAX 80 ///< Max length of request addr #define TQSL_CRQ_CITY_MAX 80 ///< Max length of request city #define TQSL_CRQ_STATE_MAX 80 ///< Max length of request state #define TQSL_CRQ_POSTAL_MAX 20 ///< Max length of request zip #define TQSL_CRQ_COUNTRY_MAX 80 ///< Max length of req entity #define TQSL_CRQ_EMAIL_MAX 180 ///< Max length of req email #define TQSL_BAND_MAX 6 ///< Max length of a band name #define TQSL_MODE_MAX 16 ///< Max length of a mode name #define TQSL_FREQ_MAX 20 ///< Max length of a frequency #define TQSL_SATNAME_MAX 20 ///< Max length of a sat name #define TQSL_PROPMODE_MAX 20 ///< Max length of a prop mode #define TQSL_STATE_MAX 30 ///< Max length of a state name #define TQSL_GRID_MAX 30 ///< Max length of a grid set #define TQSL_CNTY_MAX 30 ///< Max length of a county name #define TQSL_COUNTRY_MAX 60 ///< Max length of a country name #define TQSL_ZONE_MAX 5 ///< Max length of a zone number #define TQSL_IOTA_MAX 10 ///< Max length of a IOTA identifier #define TQSL_CERT_CB_USER 0 ///< Callback is for user cert #define TQSL_CERT_CB_CA 1 ///< Callback is for CA cert #define TQSL_CERT_CB_ROOT 2 ///< Callback is for root cert #define TQSL_CERT_CB_PKEY 3 ///< Callback is for private key #define TQSL_CERT_CB_CONFIG 4 ///< Callback for config file #define TQSL_CERT_CB_CERT_TYPE(x) ((x) & 0xf) ///< Type of the cert #define TQSL_CERT_CB_MILESTONE 0 ///< New certificate #define TQSL_CERT_CB_RESULT 0x10 ///< Cert import result #define TQSL_CERT_CB_CALL_TYPE(x) ((x) & TQSL_CERT_CB_RESULT) ///< Callback type #define TQSL_CERT_CB_PROMPT 0 ///< Callback prompt #define TQSL_CERT_CB_DUPLICATE 0x100 ///< Dupe cert callback #define TQSL_CERT_CB_ERROR 0x200 ///< Error import callback #define TQSL_CERT_CB_LOADED 0x400 ///< Cert loaded callback #define TQSL_CERT_CB_SERIAL 0x800 ///< User cert serial callback #define TQSL_CERT_CB_RESULT_TYPE(x) ((x) & 0x0f00) ///< Result type mask #define TQSL_MSG_FLAGGED 0x1000 ///< Alt message handling flag typedef void * tQSL_Cert; ///< Opaque certificate type typedef void * tQSL_Location; ///< Opaque location type typedef char * tQSL_StationDataEnc; ///< Opaque station data type /** Struct that holds y-m-d */ typedef struct { int year; ///< Numeric year int month; ///< Numeric month int day; ///< Numeric day } tQSL_Date; /** Struct that holds h-m-s */ typedef struct { int hour; ///< Time hour field int minute; ///< Time minute field int second; ///< Time seconds field } tQSL_Time; /** Certificate provider data */ typedef struct tqsl_provider_st { char organizationName[TQSL_NAME_ELEMENT_MAX+1]; ///< Provider name char organizationalUnitName[TQSL_NAME_ELEMENT_MAX+1]; ///< Provider unit char emailAddress[TQSL_NAME_ELEMENT_MAX+1]; ///< Provider e-mail char url[TQSL_NAME_ELEMENT_MAX+1]; ///< Provider URL } TQSL_PROVIDER; /** Certificate request data */ typedef struct tqsl_cert_req_st { ///< Cert request data char providerName[TQSL_NAME_ELEMENT_MAX+1]; ///< Provider name char providerUnit[TQSL_NAME_ELEMENT_MAX+1]; ///< Provider unit char callSign[TQSL_CALLSIGN_MAX+1]; ///< Callsign char name[TQSL_CRQ_NAME_MAX+1]; ///< Name char address1[TQSL_CRQ_ADDR_MAX+1]; ///< Address 1 char address2[TQSL_CRQ_ADDR_MAX+1]; ///< Address 2 char city[TQSL_CRQ_CITY_MAX+1]; ///< City char state[TQSL_CRQ_STATE_MAX+1]; ///< State char postalCode[TQSL_CRQ_POSTAL_MAX+1]; ///< Postal Code char country[TQSL_CRQ_COUNTRY_MAX+1]; ///< Country char emailAddress[TQSL_CRQ_EMAIL_MAX+1]; ///< e-mail int dxccEntity; ///< DXCC Entity code tQSL_Date qsoNotBefore; ///< QSOs not before date tQSL_Date qsoNotAfter; ///< QSOs not after date char password[TQSL_PASSWORD_MAX+1]; ///< Password tQSL_Cert signer; ///< Signing cert char renew; ///< Rewewal reference } TQSL_CERT_REQ; /** QSO data */ typedef struct { char callsign[TQSL_CALLSIGN_MAX+1]; ///< QSO callsign char band[TQSL_BAND_MAX+1]; ///< QSO band char mode[TQSL_MODE_MAX+1]; ///< QSO mode char submode[TQSL_MODE_MAX+1]; ///< QSO submode tQSL_Date date; ///< QSO date tQSL_Time time; ///< QSO time char freq[TQSL_FREQ_MAX+1]; ///< QSO frequency char rxfreq[TQSL_FREQ_MAX+1]; ///< QSO receive frequency char rxband[TQSL_BAND_MAX+1]; ///< QSO RX band char propmode[TQSL_PROPMODE_MAX+1]; ///< QSO prop mode char satname[TQSL_SATNAME_MAX+1]; ///< QSO satellite name bool callsign_set; ///< QSO specifies a call worked bool mode_set; ///< QSO specifies a mode bool band_set; ///< QSO specifies a band or frequency bool date_set; ///< QSO specifies a date bool time_set; ///< QSO specifies a time char my_state[TQSL_STATE_MAX+1]; ///< QSO specifies MY_STATE char my_gridsquare[TQSL_GRID_MAX+1]; ///< QSO specifies MY_GRIDSQUARE char my_vucc_grids[TQSL_GRID_MAX+1]; ///< QSO specifies MY_VUCC_GRIDS char my_county[TQSL_CNTY_MAX+1]; ///< QSO specifies MY_CNTY char my_cnty_state[TQSL_STATE_MAX+1]; ///< QSO specifies a state with MY_CNTY char my_country[TQSL_COUNTRY_MAX+1]; ///< QSO specifies MY_COUNTRY char my_cq_zone[TQSL_ZONE_MAX+1]; ///< QSO specifies MY_CQ_ZONE char my_itu_zone[TQSL_ZONE_MAX+1]; ///< QSO specifies MY_ITU_ZONE int my_dxcc; ///< QSO specifies MY_DXCC char my_call[TQSL_CALLSIGN_MAX+1]; ///< Station Callsign #ifdef USE_OWNER_CALLSIGN char my_owner[TQSL_CALLSIGN_MAX+1]; ///< Station Owner Callsign #endif char my_operator[TQSL_CALLSIGN_MAX+1]; ///< Operator's callsign char my_iota[TQSL_IOTA_MAX+1]; ///< QSO specifies MY_IOTA_ } TQSL_QSO_RECORD; /// Base directory for tQSL library working files. DLLEXPORTDATA extern const char *tQSL_BaseDir; /// Directory for resources bundled with tqsl executable DLLEXPORTDATA extern const char *tQSL_RsrcDir; #ifdef __cplusplus extern "C" { #endif /** \defgroup Util Utility API */ /** @{ */ /// Error code from most recent tQSL library call. /** * The values for the error code are defined in tqslerrno.h */ DLLEXPORTDATA extern int tQSL_Error; /// The ADIF error code DLLEXPORTDATA extern TQSL_ADIF_GET_FIELD_ERROR tQSL_ADIF_Error; /// The ADIF error code DLLEXPORTDATA extern TQSL_CABRILLO_ERROR_TYPE tQSL_Cabrillo_Error; /// File name of file giving error. (May be empty.) DLLEXPORTDATA extern char tQSL_ErrorFile[TQSL_MAX_PATH_LEN]; /// Custom error message string DLLEXPORTDATA extern char tQSL_CustomError[256]; /// System errno - stored when tQSL_Error == TQSL_SYSTEM_ERROR DLLEXPORTDATA extern int tQSL_Errno; /// Callsign used in import - used for missing public key error DLLEXPORTDATA extern char tQSL_ImportCall[256]; /// Serial number of recent certificate import DLLEXPORTDATA extern long tQSL_ImportSerial; /// Diagnostic log file DLLEXPORTDATA extern FILE* tQSL_DiagFile; /** Initialize the tQSL library * * This function should be called prior to calling any other library functions. */ DLLEXPORT int CALLCONVENTION tqsl_init(); /** Set the directory where the TQSL files are kept. * May be called either before of after tqsl_init(), but should be called * before calling any other functions in the library. * * Note that this is purely optional. The library will figure out an * appropriate directory if tqsl_setDirectory isn't called. Unless there is * some particular need to set the directory explicitly, programs should * refrain from doing so. */ DLLEXPORT int CALLCONVENTION tqsl_setDirectory(const char *dir); /** Gets the error string for the current tQSL library error and resets the error status. * See tqsl_getErrorString_v(). */ DLLEXPORT const char* CALLCONVENTION tqsl_getErrorString(); /** Gets the error string corresponding to the given error number. * The error string is available only until the next call to * tqsl_getErrorString_v or tqsl_getErrorString. */ DLLEXPORT const char* CALLCONVENTION tqsl_getErrorString_v(int err); /** Encode a block of data into Base64 text. * * \li \c data = block of data to encode * \li \c datalen = length of \c data in bytes * \li \c output = pointer to output buffer * \li \c outputlen = size of output buffer in bytes */ DLLEXPORT int CALLCONVENTION tqsl_encodeBase64(const unsigned char *data, int datalen, char *output, int outputlen); /** Decode Base64 text into binary data. * * \li \c input = NUL-terminated text string of Base64-encoded data * \li \c data = pointer to output buffer * \li \c datalen = pointer to int containing the size of the output buffer in bytes * * Places the number of resulting data bytes into \c *datalen. */ DLLEXPORT int CALLCONVENTION tqsl_decodeBase64(const char *input, unsigned char *data, int *datalen); /** Initialize a tQSL_Date object from a date string. * * The date string must be YYYY-MM-DD or YYYYMMDD format. * * Returns 0 on success, nonzero on failure */ DLLEXPORT int CALLCONVENTION tqsl_initDate(tQSL_Date *date, const char *str); /** Initialize a tQSL_Time object from a time string. * * The time string must be HH[:]MM[[:]SS] format. * * Returns 0 on success, nonzero on failure */ DLLEXPORT int CALLCONVENTION tqsl_initTime(tQSL_Time *time, const char *str); /** Compare two tQSL_Date objects. * * Returns: * - -1 if \c a < \c b * * - 0 if \c a == \c b * * - 1 if \c a > \c b */ DLLEXPORT int CALLCONVENTION tqsl_compareDates(const tQSL_Date *a, const tQSL_Date *b); /** Calculate the number of days between two tQSL_Date objects. * * Returns a positive result if the first date is earlier, otherwise * negative. */ DLLEXPORT int CALLCONVENTION tqsl_subtractDates(const tQSL_Date *a, const tQSL_Date *b, int *diff); /** Converts a tQSL_Date object to a YYYY-MM-DD string. * * Returns a pointer to \c buf or NULL on error */ DLLEXPORT char* CALLCONVENTION tqsl_convertDateToText(const tQSL_Date *date, char *buf, int bufsiz); /** Test whether a tQSL_Date contains a valid date value * * Returns 1 if the date is valid */ DLLEXPORT int CALLCONVENTION tqsl_isDateValid(const tQSL_Date *d); /** Test whether a tQSL_Date is empty (contains all zeroes) * * Returns 1 if the date is null */ DLLEXPORT int CALLCONVENTION tqsl_isDateNull(const tQSL_Date *d); /** Test whether a tQSL_Time contains a valid time value * * Returns 1 if the time is valid */ DLLEXPORT int CALLCONVENTION tqsl_isTimeValid(const tQSL_Time *t); /** Converts a tQSL_Time object to a HH:MM:SSZ string. * * Returns a pointer to \c buf or NULL on error */ DLLEXPORT char* CALLCONVENTION tqsl_convertTimeToText(const tQSL_Time *time, char *buf, int bufsiz); /** Returns the library version. \c major and/or \c minor may be NULL. */ DLLEXPORT int CALLCONVENTION tqsl_getVersion(int *major, int *minor); /** Returns the configuration-file version. \c major and/or \c minor may be NULL. */ DLLEXPORT int CALLCONVENTION tqsl_getConfigVersion(int *major, int *minor); /** @} */ /** \defgroup CertStuff Certificate Handling API * * Certificates are managed by manipulating \c tQSL_Cert objects. A \c tQSL_Cert * contains: * * \li The identity of the organization that issued the certificate (the "issuer"). * \li The name and call sign of the amateur radio operator (ARO). * \li The DXCC entity number for which this certificate is valid. * \li The range of QSO dates for which this certificate can be used. * \li The resources needed to digitally sign and verify QSO records. * * The certificate management process consists of: * * \li Applying for a certificate. Certificate requests are produced via the * tqsl_createCertRequest() function, which produces a certificate-request * file to send to the issuer. * \li Importing the certificate file received from the issuer into the local * "certificate store," a directory managed by the tQSL library, via * tqsl_importTQSLFile(). * \li Selecting an appropriate certificate to use to sign a QSO record via * tqsl_selectCertificates(). */ /** @{ */ #define TQSL_SELECT_CERT_WITHKEYS 1 ///< Private keys only (no cert) #define TQSL_SELECT_CERT_EXPIRED 2 ///< Include expired certs #define TQSL_SELECT_CERT_SUPERCEDED 4 ///< Include superseded certs /** Get a list of certificates * * Selects a set of certificates from the user's certificate store * based on optional selection criteria. The function produces a * list of tQSL_Cert objects. * * \li \c certlist - Pointer to a variable that is set by the * function to point to the list of tQSL_Cert objects. * \li \c ncerts - Pointer to an int that is set to the number * of objects in the \c certlist list. * \li \c callsign - Optional call sign to match. * \li \c date - Optional QSO date string in ISO format. Only certs * that have a QSO date range that encompasses this date will be * returned. * \li \c issuer - Optional issuer (DN) string to match. * \li \c flag - OR of \c TQSL_SELECT_CERT_EXPIRED (include expired * certs), \c TQSL_SELECT_CERT_SUPERCEDED and \c TQSL_SELECT_CERT_WITHKEYS * (keys that don't have associated certs will be returned). * * Returns 0 on success, nonzero on failure. * * Each of the tQSL_Cert objects in the list should be freed * by calling tqsl_freeCertificate(). tqsl_freeCertificateList() is a better * function to use for that as it also frees the allocated array that * holds the certificate pointers. * */ DLLEXPORT int CALLCONVENTION tqsl_selectCertificates(tQSL_Cert **certlist, int *ncerts, const char *callsign, int dxcc, const tQSL_Date *date, const TQSL_PROVIDER *issuer, int flag); /** Get a list of authority certificates * * Selects a set of certificates from the root or authorities certificate stores * The function produces a list of tQSL_Cert objects. * * Each of the tQSL_Cert objects in the list should be freed * by calling tqsl_freeCertificate(). tqsl_freeCertificateList() is a better * function to use for that as it also frees the allocated array that * holds the certificate pointers. * */ DLLEXPORT int CALLCONVENTION tqsl_selectCACertificates(tQSL_Cert **certlist, int *ncerts, const char *type); /** Get a particulat certificate from the list returnded by * tqsl_selectCertificates. This function exists principally * to make it easier for VB programs to access the list of * certificates. * * It is the caller's responsibility to ensure that 0 <= idx < ncerts * (where ncerts is the value returned by tqsl_selectCertificates) */ DLLEXPORT int CALLCONVENTION tqsl_getSelectedCertificate(tQSL_Cert *cert, const tQSL_Cert **certlist, int idx); /** Find out if the "certificate" is expired */ DLLEXPORT int CALLCONVENTION tqsl_isCertificateExpired(tQSL_Cert cert, int *status); /** Find out if the "certificate" is superceded */ DLLEXPORT int CALLCONVENTION tqsl_isCertificateSuperceded(tQSL_Cert cert, int *status); /** Find out if the "certificate" is just a key pair. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateKeyOnly(tQSL_Cert cert, int *keyonly); /** Find out if the "certificate" is renewable */ DLLEXPORT int CALLCONVENTION tqsl_isCertificateRenewable(tQSL_Cert cert, int *status); /** Get the encoded certificate for inclusion in a GABBI file. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateEncoded(tQSL_Cert cert, char *buf, int bufsiz); /** Get the encoded private key for inclusion in a backup file. */ DLLEXPORT int CALLCONVENTION tqsl_getKeyEncoded(tQSL_Cert cert, char *buf, int bufsiz); /** Import a base64 encoded certificate and private key from a backup file. */ DLLEXPORT int CALLCONVENTION tqsl_importKeyPairEncoded(const char *callsign, const char *type, const char *keybuf, const char *certbuf); /** Get the issuer's serial number of the certificate. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerial(tQSL_Cert cert, long *serial); /** Get the issuer's serial number of the certificate as a hexadecimal string. * Needed for certs with long serial numbers (typically root certs). */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialExt(tQSL_Cert cert, char *serial, int serialsiz); /** Get the length of the issuer's serial number of the certificate as it will be * returned by tqsl_getCertificateSerialExt. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateSerialLength(tQSL_Cert cert); /** Get the issuer (DN) string from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuer(tQSL_Cert cert, char *buf, int bufsiz); /** Get the issuer's organization name from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganization(tQSL_Cert cert, char *buf, int bufsiz); /** Get the issuer's organizational unit name from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateIssuerOrganizationalUnit(tQSL_Cert cert, char *buf, int bufsiz); /** Get the ARO call sign string from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateCallSign(tQSL_Cert cert, char *buf, int bufsiz); /** Get the ARO name string from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateAROName(tQSL_Cert cert, char *buf, int bufsiz); /** Get the email address from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateEmailAddress(tQSL_Cert cert, char *buf, int bufsiz); /** Get the QSO not-before date from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c date - Pointer to a tQSL_Date struct to hold the returned date. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotBeforeDate(tQSL_Cert cert, tQSL_Date *date); /** Get the QSO not-after date from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c date - Pointer to a tQSL_Date struct to hold the returned date. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateQSONotAfterDate(tQSL_Cert cert, tQSL_Date *date); /** Get the certificate's not-before date from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c date - Pointer to a tQSL_Date struct to hold the returned date. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotBeforeDate(tQSL_Cert cert, tQSL_Date *date); /** Get the certificate's not-after date from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c date - Pointer to a tQSL_Date struct to hold the returned date. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateNotAfterDate(tQSL_Cert cert, tQSL_Date *date); /** Get the DXCC entity number from a tQSL_Cert. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c dxcc - Pointer to an int to hold the returned date. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateDXCCEntity(tQSL_Cert cert, int *dxcc); /** Get the first address line from the certificate request used in applying * for a tQSL_Cert certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress1(tQSL_Cert cert, char *str, int bufsiz); /** Get the second address line from the certificate request used in applying * for a tQSL_Cert certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestAddress2(tQSL_Cert cert, char *str, int bufsiz); /** Get the city from the certificate request used in applying * for a tQSL_Cert certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCity(tQSL_Cert cert, char *str, int bufsiz); /** Get the state from the certificate request used in applying * for a tQSL_Cert certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestState(tQSL_Cert cert, char *str, int bufsiz); /** Get the postal (ZIP) code from the certificate request used in applying * for a tQSL_Cert certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestPostalCode(tQSL_Cert cert, char *str, int bufsiz); /** Get the country from the certificate request used in applying * for a tQSL_Cert certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * \li \c buf - Buffer to hold the returned string. * \li \c bufsiz - Size of \c buf. * * Returns 0 on success, nonzero on failure. */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateRequestCountry(tQSL_Cert cert, char *str, int bufsiz); #define TQSL_PK_TYPE_ERR 0 ///< Error retrieving private key #define TQSL_PK_TYPE_NONE 1 ///< No private key #define TQSL_PK_TYPE_UNENC 2 ///< Private key is not encrypted #define TQSL_PK_TYPE_ENC 3 ///< Private key is encrypted /** Determine the nature of the private key associated with a * certificate. * * \li \c cert - a tQSL_Cert object, normally one returned from * tqsl_selectCertificates() * * Returns one of the following values: * * \li \c TQSL_PK_TYPE_ERR - An error occurred. Use tqsl_getErrorString() to examine. * \li \c TQSL_PK_TYPE_NONE - No matching private key was found. * \li \c TQSL_PK_TYPE_UNENC - The matching private key is unencrypted. * \li \c TQSL_PK_TYPE_ENC - The matching private key is encrypted * (password protected). */ DLLEXPORT int CALLCONVENTION tqsl_getCertificatePrivateKeyType(tQSL_Cert cert); /** Free the memory used by the tQSL_Cert. Once this function is called, * \c cert should not be used again in any way. */ DLLEXPORT void CALLCONVENTION tqsl_freeCertificate(tQSL_Cert cert); /** Free the memory used by a certificate list. The allocated list * of tQSL_Certs are freed and the pointer array is freed. * Once this function is called, the \c list or the \c cert * should not be used again in any way. */ DLLEXPORT void CALLCONVENTION tqsl_freeCertificateList(tQSL_Cert* list, int ncerts); #define TQSL_CERT_STATUS_UNK 0 ///< Status is unknown #define TQSL_CERT_STATUS_SUP 1 ///< Certificate is superceded #define TQSL_CERT_STATUS_EXP 2 ///< Certificate is expired #define TQSL_CERT_STATUS_OK 3 ///< Certificate is valid #define TQSL_CERT_STATUS_INV 4 ///< Invalid serial number /** Determine the status of a callsign certificate * \li \c serial - the serial number of the certificate * tqsl_selectCertificates() * \li \c status - an integer to receive the certificate status * * Returns one of the following values: * * \li \c TQSL_CERT_STATUS_UNK - An error occurred and the status is unknown * \li \c TQSL_CERT_STATUS_SUP - The certificate has been superceded * \li \c TQSL_CERT_STATUS_EXP - The certificate has expired * \li \c TQSL_CERT_STATUS_OK - The certificate is valid * \li \c TQSL_CERT_STATUS_INV - The serial number supplied is invalid * */ DLLEXPORT int CALLCONVENTION tqsl_getCertificateStatus(long serial); /** Store the status of a callsign certificate * \li \c serial - serial number of the certificate * \li \c status - the status value to store. */ DLLEXPORT int CALLCONVENTION tqsl_setCertificateStatus(long serial, const char *status); /* int tqsl_checkCertificate(tQSL_Cert); */ /** Import a Gabbi cert file received from a CA * * The callback, \c cb, will be called whenever a certificate is ready * to be imported: * * cb(type, message); * * \c type has several fields that can be accessed via macros: * * \c TQSL_CERT_CB_CALL_TYPE(type) := \c TQSL_CERT_CB_MILESTONE | \c TQSL_CERT_CB_RESULT * * \c TQSL_CERT_CB_CERT_TYPE(type) := \c TQSL_CERT_CB_ROOT | \c TQSL_CERT_CB_CA | \c TQSL_CERT_CB_USER * * \c TQSL_CERT_CB_RESULT_TYPE(type) := \c TQSL_CERT_CB_PROMPT | \c TQSL_CERT_CB_WARNING | \c TQSL_CERT_CB_ERROR * * \c TQSL_CERT_CB_RESULT_TYPE() is meaningful only if \c TQSL_CERT_CB_CALL_TYPE() == \c TQSL_CERT_CB_RESULT */ DLLEXPORT int CALLCONVENTION tqsl_importTQSLFile(const char *file, int(*cb)(int type, const char *message, void *userdata), void *user); /** Get the serial for the first user cert from a .tq6 file * used to support asking the user to save their cert after import * \li \c file is the path to the file * \li \c serial is where the serial number is returned * * Returns 0 on success, nonzero on failure. * */ DLLEXPORT int CALLCONVENTION tqsl_getSerialFromTQSLFile(const char *file, long *serial); /** Get the number of certificate providers known to tqsllib. */ DLLEXPORT int CALLCONVENTION tqsl_getNumProviders(int *n); /** Get the information for a certificate provider. * * \li \c idx is the index, 0 <= idx < tqsl_getNumProviders() */ DLLEXPORT int CALLCONVENTION tqsl_getProvider(int idx, TQSL_PROVIDER *provider); /** Create a certificate-request Gabbi file. * * The \c req parameter must be properly populated with the required fields. * * If \c req->password is NULL and \c cb is not NULL, the callback will be * called to acquire the password. Otherwise \c req->password will be used as * the password. If the password is NULL or an empty string the generated * private key will be stored unencrypted. * * If req->signer is not zero and the signing certificate requires a password, * the password may be in req->signer_password, else signer_pwcb is called. */ DLLEXPORT int CALLCONVENTION tqsl_createCertRequest(const char *filename, TQSL_CERT_REQ *req, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user); /** Save a key pair and certificates to a file in PKCS12 format. * * The tQSL_Cert must be initialized for signing (see tqsl_beginSigning()) * if the user certificate is being exported. * * The supplied \c p12password is used to encrypt the PKCS12 data. */ DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12File(tQSL_Cert cert, const char *filename, const char *p12password); /** Save a key pair and certificates to a file in PKCS12 format. * Use downgraded crypto for Apple Keyring compatibility. * * The tQSL_Cert must be initialized for signing (see tqsl_beginSigning()) * if the user certificate is being exported. * * The supplied \c p12password is used to encrypt the PKCS12 data. */ DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12FileWeakCrypto(tQSL_Cert cert, const char *filename, const char *p12password); /** Save a key pair and certificates to a Base64 string in PKCS12 format. * * The tQSL_Cert must be initialized for signing (see tqsl_beginSigning()) * if the user certificate is being exported. * * The supplied \c p12password is used to encrypt the PKCS12 data. */ DLLEXPORT int CALLCONVENTION tqsl_exportPKCS12Base64(tQSL_Cert cert, char *base64, int b64len, const char *p12password); /** Load certificates and a private key from a PKCS12 file. */ DLLEXPORT int CALLCONVENTION tqsl_importPKCS12File(const char *filename, const char *p12password, const char *password, int (*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type , const char *message, void *userdata), void *user); /** Load certificates and a private key from a Base64 encoded PKCS12 string. */ DLLEXPORT int CALLCONVENTION tqsl_importPKCS12Base64(const char *base64, const char *p12password, const char *password, int (*pwcb)(char *buf, int bufsiz, void *userdata), int(*cb)(int type , const char *message, void *userdata), void *user); /** Get the list of restorable station locations. */ DLLEXPORT int CALLCONVENTION tqsl_getDeletedCallsignCertificates(char ***calls, int *ncall, const char *filter); /** Free the list of restorable Callsign Certificates. */ DLLEXPORT void CALLCONVENTION tqsl_freeDeletedCertificateList(char **list, int nloc); /** Restore a deleted callsign certificate by callsign. */ DLLEXPORT int CALLCONVENTION tqsl_restoreCallsignCertificate(const char *callsign); /** Delete a certificate and private key */ DLLEXPORT int CALLCONVENTION tqsl_deleteCertificate(tQSL_Cert cert); /** @} */ /** \defgroup Sign Signing API * * The Signing API uses a tQSL_Cert (see \ref CertStuff) to digitally * sign a block of data. */ /** @{ */ /** Initialize the tQSL_Cert object for use in signing. * * This produces an unencrypted copy of the private key in memory. * * if \c password is not NULL, it must point to the password to use to decrypt * the private key. If \c password is NULL and \c pwcb is not NULL, \c pwcb * is called to get the password. If the private key is encrypted and both * \c password and \c pwcb are NULL, or if the supplied password fails to * decrypt the key, a TQSL_PASSWORD_ERROR error is returned. * * \c pwcb parameters: \c pwbuf is a pointer to a buffer of \c pwsize chars. * The buffer should be NUL-terminated. */ DLLEXPORT int CALLCONVENTION tqsl_beginSigning(tQSL_Cert cert, char *password, int(*pwcb)(char *pwbuf, int pwsize, void *userdata), void *user); /** Test whether the tQSL_Cert object is initialized for signing. * * Returns 0 if initialized. Sets tQSL_Error to TQSL_SIGNINIT_ERROR if not. */ DLLEXPORT int CALLCONVENTION tqsl_checkSigningStatus(tQSL_Cert cert); /** Get the maximum size of a signature block that will be produced * when the tQSL_Cert is used to sign data. (Note that the size of the * signature block is unaffected by the size of the data block being signed.) */ DLLEXPORT int CALLCONVENTION tqsl_getMaxSignatureSize(tQSL_Cert cert, int *sigsize); /** Sign a data block. * * tqsl_beginSigning() must have been called for * the tQSL_Cert object before calling this function. */ DLLEXPORT int CALLCONVENTION tqsl_signDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int *siglen); /** Verify a signed data block. * * tqsl_beginSigning() need \em not have been called. */ DLLEXPORT int CALLCONVENTION tqsl_verifyDataBlock(tQSL_Cert cert, const unsigned char *data, int datalen, unsigned char *sig, int siglen); /** Sign a single QSO record * * tqsl_beginSigning() must have been called for * the tQSL_Cert object before calling this function. * * \c loc must be a valid tQSL_Location object. See \ref Data. */ DLLEXPORT int CALLCONVENTION tqsl_signQSORecord(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *rec, unsigned char *sig, int *siglen); /** Terminate signing operations for this tQSL_Cert object. * * This zero-fills the unencrypted private key in memory. */ DLLEXPORT int CALLCONVENTION tqsl_endSigning(tQSL_Cert cert); /** @} */ /** \defgroup Data Data API * * The Data API is used to form data into TrustedQSL records. A TrustedQSL record * consists of a station record and a QSO record. Together, the two records * fully describe one station's end of the QSO -- just as a paper QSL card does. * * The station record contains the callsign and geographic location of the * station submitting the QSO record. The library manages the station records. * The tqsl_xxxStationLocationCapture functions are used to generate and save * a station record. The intent is to provide an interface that makes a step-by-step * system (such as a GUI "wizard") easily implemented. * * The tqsl_getStationLocation() function is used to retrieve station records. * * With the necessary station location available, a signed GABBI output file can * be generated using the tqsl_getGABBIxxxxx functions: * * \li tqsl_getGABBItCERT() - Returns a GABBI tCERT record for the given tQSL_Cert * \li tqsl_getGABBItSTATION() - Returns a GABBI tSTATION record for the given * tQSL_Location * \li tqsl_getGABBItCONTACT() - Returns a GABBI tCONTACT record for the given * TQSL_QSO_RECORD, using the given tQSL_Cert and tQSL_Location. * \li tqsl_getGABBItCONTACTData() - Returns a GABBI tCONTACT record and the * SIGNDATA for the given TQSL_QSO_RECORD, using the given tQSL_Cert and * tQSL_Location. * * The GABBI format requires that the tCERT record contain an integer identifier * that is unique within the GABBI file. Similarly, each tSTATION record must * contain a unique identifier. Additionally, the tSTATION record must reference * the identifier of a preceding tCERT record. Finally, each tCONTACT record must * reference a preceding tSTATION record. (A GABBI processor uses these identifiers * and references to tie the station and contact records together and to verify * their signature via the certificate.) It is the responsibility of the caller * to supply these identifiers and to ensure that the supplied references match * the tQSL_Cert and tQSL_Location used to create the referenced GABBI records. * * Station Location Generation * * The station-location generation process involves determining the values * for a number of station-location parameters. Normally this * will be done by prompting the user for the values. The responses given * by the user may determine which later fields are required. For example, * if the user indicates that the DXCC entity is UNITED STATES, a later * field would ask for the US state. This field would not be required if the * DXCC entity were not in the US. * * To accommodate the dynamic nature of the field requirements, the fields * are ordered such that dependent fields are queried after the field(s) * on which they depend. To make this process acceptable in a GUI * system, the fields are grouped into pages, where multiple fields may * be displayed on the same page. The grouping is such that which fields * are within the page is not dependent on any of the values of the * fields within the page. That is, a page of fields contains the same * fields no matter what value any of the fields contains. (However, * the \em values of fields within the page can depend on the values * of fields that precede them in the page.) * * Here is a brief overview of the sequence of events involved in * generating a station location interactively, one field at a time: * * 1) Call tqsl_initStationLocationCapture() (new location) or tqsl_getStationLocation() * (existing location). * * 2) For \c field from 0 to tqsl_getNumLocationField(): * \li Display the field label [tqsl_getLocationFieldDataLabel()] * \li Get the field content from the user. This can be a selection * from a list, an entered integer or an entered character string, * depending on the value returned by tqsl_getLocationFieldInputType(). * * 3) If tqsl_hasNextStationLocationCapture() returns 1, call * tqsl_nextStationLocationCapture() and go back to step 2. * * In the case of a GUI system, you'll probably want to display the * fields in pages. The sequence of events is a bit different: * * 1) Call tqsl_initStationLocationCapture() (new location) or tqsl_getStationLocation() * (existing location). * * 2) For \c field from 0 to tqsl_getNumLocationField(), * \li Display the field label [tqsl_getLocationFieldDataLabel()] * \li Display the field-input control This can be a list-selection * or an entered character string or integer, depending on the value * returned by tqsl_getLocationFieldInputType(). * * 3) Each time the user changes a field, call tqsl_updateStationLocationCapture(). * This may change the allowable selection for fields that follow the field * the user changed, so the control for each of those fields should be updated * as in step 2. * * 4) Once the user has completed entries for the page, if * tqsl_hasNextStationLocationCapture() returns 1, call * tqsl_nextStationLocationCapture() and go back to step 2. * * N.B. The first two fields in the station-location capture process are * always call sign and DXCC entity, in that order. As a practical matter, these * two fields must match the corresponding fields in the available certificates. * The library will therefore constrain the values of these fields to match * what's available in the certificate store. See \ref CertStuff. */ /** @{ */ /* Location field input types */ #define TQSL_LOCATION_FIELD_TEXT 1 ///< Text type input field #define TQSL_LOCATION_FIELD_DDLIST 2 ///< Dropdown list input field #define TQSL_LOCATION_FIELD_LIST 3 ///< List type input field #define TQSL_LOCATION_FIELD_BADZONE 4 ///< Used to return zone selection errors /* Location field data types */ #define TQSL_LOCATION_FIELD_CHAR 1 ///< Character field #define TQSL_LOCATION_FIELD_INT 2 ///< Integer field /** Begin the process of generating a station record */ DLLEXPORT int CALLCONVENTION tqsl_initStationLocationCapture(tQSL_Location *locp); /** Release the station-location resources. This should be called for * any tQSL_Location that was initialized via tqsl_initStationLocationCapture() * or tqsl_getStationLocation() */ DLLEXPORT int CALLCONVENTION tqsl_endStationLocationCapture(tQSL_Location *locp); /** Update the pages based on the currently selected settings. */ DLLEXPORT int CALLCONVENTION tqsl_updateStationLocationCapture(tQSL_Location loc); /** Return the number of station location capture pages. */ DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocationCapturePages(tQSL_Location loc, int *npages); /** Get the current page number */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCapturePage(tQSL_Location loc, int *page); /** Set the current page number. * Typically, the page number will be 1 (the starting page) or a value * obtained from tqsl_getStationLocationCapturePage(). */ DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCapturePage(tQSL_Location loc, int page); /** Set the certificate flags used in a location page. * This is used to enable expired certs (or disable). */ DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCertFlags(tQSL_Location loc, int flags); /** Advance the page to the next one in the page sequence */ DLLEXPORT int CALLCONVENTION tqsl_nextStationLocationCapture(tQSL_Location loc); /** Return the next page to in the page sequence */ DLLEXPORT int CALLCONVENTION tqsl_getNextStationLocationCapturePage(tQSL_Location loc, int *page); /** Return the page to the previous one in the page sequence. */ DLLEXPORT int CALLCONVENTION tqsl_prevStationLocationCapture(tQSL_Location loc); /** Return the previous page in the page sequence. */ DLLEXPORT int CALLCONVENTION tqsl_getPrevStationLocationCapturePage(tQSL_Location loc, int *page); /** Return the current page in the page sequence. */ DLLEXPORT int CALLCONVENTION tqsl_getCurrentStationLocationCapturePage(tQSL_Location loc, int *page); /** Returns 1 (in rval) if there is a next page */ DLLEXPORT int CALLCONVENTION tqsl_hasNextStationLocationCapture(tQSL_Location loc, int *rval); /** Returns 1 (in rval) if there is a previous page */ DLLEXPORT int CALLCONVENTION tqsl_hasPrevStationLocationCapture(tQSL_Location loc, int *rval); /** Save the station location data. Note that the name must have been * set via tqsl_setStationLocationCaptureName if this is a new * station location. If the \c overwrite parameter is zero and a * station location of that name is already in existence, an error * occurs with tQSL_Error set to TQSL_NAME_EXISTS. */ DLLEXPORT int CALLCONVENTION tqsl_saveStationLocationCapture(tQSL_Location loc, int overwrite); /** Get the name of the station location */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCaptureName(tQSL_Location loc, char *namebuf, int bufsiz); /** Set the name of the station location */ DLLEXPORT int CALLCONVENTION tqsl_setStationLocationCaptureName(tQSL_Location loc, const char *name); /** Get the number of saved station locations */ DLLEXPORT int CALLCONVENTION tqsl_getNumStationLocations(tQSL_Location loc, int *nloc); /** Get the name of the specified (by \c idx) saved station location */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocationName(tQSL_Location loc, int idx, char *buf, int bufsiz); /** Get the call sign from the station location */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocationCallSign(tQSL_Location loc, int idx, char *buf, int bufsiz); /** Get a named field from the station location */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocationField(tQSL_Location locp, const char *name, char *namebuf, int bufsize); /** Retrieve a saved station location. * Once finished with the station location, tqsl_endStationLocationCapture() * should be called to release resources. */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocation(tQSL_Location *loc, const char *name); /** Get any errors returned from parsing the selected station location. * This should be called after tqsl_getStationLocation to determine if * any of the existing fields failed validation. Currently only zone * data is validated here, but future validations for things like * properly formatted grid squares is likely. */ DLLEXPORT int CALLCONVENTION tqsl_getStationLocationErrors(tQSL_Location loc, char *buf, int bufsiz); /** Return the contents of the station data file as a byte stream. * The caller is required to tqsl_freeStationDataEnc() this pointer when done with it. */ DLLEXPORT int CALLCONVENTION tqsl_getStationDataEnc(tQSL_StationDataEnc *sdata); /** Free the pointer returned by tqsl_getStationDataEnc(tQSL_StationDataEnc*) */ DLLEXPORT int CALLCONVENTION tqsl_freeStationDataEnc(tQSL_StationDataEnc sdata); /** Merge saved location data with existing */ DLLEXPORT int CALLCONVENTION tqsl_mergeStationLocations(const char *locdata); /** Remove the stored station location by name. */ DLLEXPORT int CALLCONVENTION tqsl_deleteStationLocation(const char *name); /** Restore the deleted station location by name. */ DLLEXPORT int CALLCONVENTION tqsl_restoreStationLocation(const char *name); /** Get the list of restorable station locations. */ DLLEXPORT int CALLCONVENTION tqsl_getDeletedStationLocations(char ***locp, int *nloc); /** Free the list of restorable station locations. */ DLLEXPORT void CALLCONVENTION tqsl_freeDeletedLocationList(char **list, int nloc); /** Get the number of fields on the current station location page */ DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField(tQSL_Location loc, int *numf); /** Get the number of characters in the label for the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize(tQSL_Location loc, int field_num, int *rval); /** Get the label for the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel(tQSL_Location loc, int field_num, char *buf, int bufsiz); /** Get the size of the GABBI name of the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize(tQSL_Location loc, int field_num, int *rval); /** Get the GABBI name of the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI(tQSL_Location loc, int field_num, char *buf, int bufsiz); /** Get the input type of the input field. * * \c type will be one of TQSL_LOCATION_FIELD_TEXT, TQSL_LOCATION_FIELD_DDLIST * or TQSL_LOCATION_FIELD_LIST */ /** Get the number of fields on the current station location page */ DLLEXPORT int CALLCONVENTION tqsl_getNumLocationField(tQSL_Location loc, int *numf); /** Get the number of characters in the label for the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabelSize(tQSL_Location loc, int field_num, int *rval); /** Get the label for the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLabel(tQSL_Location loc, int field_num, char *buf, int bufsiz); /** Get the size of the GABBI name of the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBISize(tQSL_Location loc, int field_num, int *rval); /** Get the GABBI name of the specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataGABBI(tQSL_Location loc, int field_num, char *buf, int bufsiz); /** Get the input type of the input field. * * \c type will be one of TQSL_LOCATION_FIELD_TEXT, TQSL_LOCATION_FIELD_DDLIST * or TQSL_LOCATION_FIELD_LIST */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldInputType(tQSL_Location loc, int field_num, int *type); /** Get the data type of the input field. * * \c type will be either TQSL_LOCATION_FIELD_CHAR or TQSL_LOCATION_FIELD_INT */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataType(tQSL_Location loc, int field_num, int *type); /** Get the flags for the input field. * * \c flags will be either * TQSL_LOCATION_FIELD_UPPER Field is to be uppercased on input * TQSL_LOCATION_FIELD_MUSTSEL Value must be selected * TQSL_LOCATION_FIELD_SELNXT Value must be selected to allow Next/Finish * */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldFlags(tQSL_Location loc, int field_num, int *flags); /** Get the length of the input field data. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldDataLength(tQSL_Location loc, int field_num, int *rval); /** Get the character data from the specified field. * * If the field input type (see tqsl_getLocationFieldInputType()) is * TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST, this will * return the text of the selected item. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldCharData(tQSL_Location loc, int field_num, char *buf, int bufsiz); /** Get the integer data from the specified field. * * This is only meaningful if the field data type (see tqsl_getLocationFieldDataType()) * is TQSL_LOCATION_FIELD_INT. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIntData(tQSL_Location loc, int field_num, int *dat); /** If the field input type (see tqsl_getLocationFieldInputType()) is * TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST, gets the * index of the selected list item. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldIndex(tQSL_Location loc, int field_num, int *dat); /** Get the number of items in the specified field's pick list. */ DLLEXPORT int CALLCONVENTION tqsl_getNumLocationFieldListItems(tQSL_Location loc, int field_num, int *rval); /** Get the text of a specified item of a specified field */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldListItem(tQSL_Location loc, int field_num, int item_idx, char *buf, int bufsiz); /** Set the text data of a specified field. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldCharData(tQSL_Location loc, int field_num, const char *buf); /** Set the integer data of a specified field. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIntData(tQSL_Location loc, int field_num, int dat); /** If the field input type (see tqsl_getLocationFieldInputType()) is * TQSL_LOCATION_FIELD_DDLIST or TQSL_LOCATION_FIELD_LIST, sets the * index of the selected list item. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationFieldIndex(tQSL_Location loc, int field_num, int dat); /** Get the \e changed status of a field. The changed flag is set to 1 if the * field's pick list was changed during the last call to tqsl_updateStationLocationCapture * or zero if the list was not changed. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldChanged(tQSL_Location loc, int field_num, int *changed); /** Get the call sign from the station location. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationCallSign(tQSL_Location loc, char *buf, int bufsiz); /** Set the call sign for the station location. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationCallSign(tQSL_Location loc, const char *buf, int dxcc); /** Get a field from the station location. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationField(tQSL_Location locp, const char *field, char *buf, int bufsiz); /** Get a field label from the station location. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationFieldLabel(tQSL_Location locp, const char *field, char *buf, int bufsiz); /** Set a field in a station location. */ DLLEXPORT int CALLCONVENTION tqsl_setLocationField(tQSL_Location locp, const char *field, const char *buf); /** Get the DXCC entity from the station location. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationDXCCEntity(tQSL_Location loc, int *dxcc); /** Get the QSO details in canonical form. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationQSODetails(tQSL_Location locp, char *buf, int buflen); /** Get the station location details in canonical form. */ DLLEXPORT int CALLCONVENTION tqsl_getLocationStationDetails(tQSL_Location locp, char *buf, int buflen); /** Save the json results for a given callsign location Detail. */ DLLEXPORT int CALLCONVENTION tqsl_saveCallsignLocationInfo(const char *callsign, const char *json); /** Retrieve the json results for a given callsign location Detail. */ DLLEXPORT int CALLCONVENTION tqsl_getCallsignLocationInfo(const char *callsign, char **buf); #define TQSL_VALID_VUCC_ENT 0x2000 ///< Grid is valid for DXCC Entity #define TQSL_VALID_VUCC_PAS 0x4000 ///< Grid is valid for Primary Administrative Subdivision (State, etc.) /** Validate that a given four-character gridsquare is acceptable for entity and primary administrative subdivision */ DLLEXPORT int CALLCONVENTION tqsl_validateVUCCGrid(int entity, const char *pas, const char *grid, int *result); /** Get the number of DXCC entities in the primary DXCC list. */ DLLEXPORT int CALLCONVENTION tqsl_getNumDXCCEntity(int *number); /** Get a DXCC entity from the list of DXCC entities by its index. */ DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntity(int index, int *number, const char **name); /** Get the name of a DXCC Entity by its DXCC number. */ DLLEXPORT int CALLCONVENTION tqsl_getDXCCEntityName(int number, const char **name); /** Get the zonemap of a DXCC Entity by its DXCC number. */ DLLEXPORT int CALLCONVENTION tqsl_getDXCCZoneMap(int number, const char **zonemap); /** Get the start date of a DXCC Entity by its DXCC number. */ DLLEXPORT int CALLCONVENTION tqsl_getDXCCStartDate(int number, tQSL_Date *d); /** Get the end date of a DXCC Entity by its DXCC number. */ DLLEXPORT int CALLCONVENTION tqsl_getDXCCEndDate(int number, tQSL_Date *d); /** Get the deleted status of a DXCC Entity by its DXCC number. */ DLLEXPORT int CALLCONVENTION tqsl_getDXCCDeleted(int number, int *deleted); /** Get the number of Band entries in the Band list */ DLLEXPORT int CALLCONVENTION tqsl_getNumBand(int *number); /** Get a band by its index. * * \c name - The GAABI name of the band. * \c spectrum - HF | VHF | UHF * \c low - The low end of the band in kHz (HF) or MHz (VHF/UHF) * \c high - The low high of the band in kHz (HF) or MHz (VHF/UHF) * * Note: \c spectrum, \c low and/or \c high may be NULL. */ DLLEXPORT int CALLCONVENTION tqsl_getBand(int index, const char **name, const char **spectrum, int *low, int *high); /** Get the number of Mode entries in the Mode list */ DLLEXPORT int CALLCONVENTION tqsl_getNumMode(int *number); /** Get a mode by its index. * * \c mode - The GAABI mode name * \c group - CW | PHONE | IMAGE | DATA * * Note: \c group may be NULL. */ DLLEXPORT int CALLCONVENTION tqsl_getMode(int index, const char **mode, const char **group); /** Get the number of ADIF Mode entries in the Mode list */ DLLEXPORT int CALLCONVENTION tqsl_getNumADIFMode(int *number); /** Get an ADIF mode by its index. * * \c mode - The ADIF mode name * */ DLLEXPORT int CALLCONVENTION tqsl_getADIFModeEntry(int index, const char **mode); /** Get the number of Propagation Mode entries in the Propagation Mode list */ DLLEXPORT int CALLCONVENTION tqsl_getNumPropagationMode(int *number); /** Get a propagation mode by its index. * * \c name - The GAABI propagation mode name * \c descrip - Text description of the propagation mode * * Note: \c descrip may be NULL. */ DLLEXPORT int CALLCONVENTION tqsl_getPropagationMode(int index, const char **name, const char **descrip); /** Get the number of Satellite entries in the Satellite list */ DLLEXPORT int CALLCONVENTION tqsl_getNumSatellite(int *number); /** Get a satellite by its index. * * \c name - The GAABI satellite name * \c descrip - Text description of the satellite * \c start - The date the satellite entered service * \c end - The last date the satellite was in service * * Note: \c descrip, start and/or end may be NULL. */ DLLEXPORT int CALLCONVENTION tqsl_getSatellite(int index, const char **name, const char **descrip, tQSL_Date *start, tQSL_Date *end); /** Clear the map of Cabrillo contests. */ DLLEXPORT int CALLCONVENTION tqsl_clearCabrilloMap(); /** Set the mapping of a Cabrillo contest name (as found in the * CONTEST line of a Cabrillo file) to the QSO line call-worked field number * and the contest type. * * \c field can have a value of TQSL_MIN_CABRILLO_MAP_FIELD (cabrillo.h) * or greater. Field number starts at 1. * * \c contest_type must be TQSL_CABRILLO_HF or TQSL_CABRILLO_VHF, * defined in cabrillo.h */ DLLEXPORT int CALLCONVENTION tqsl_setCabrilloMapEntry(const char *contest, int field, int contest_type); /** Get the mapping of a Cabrillo contest name (as found in the * CONTEST line of a Cabrillo file) to a call-worked field number * and the contest type. * * \c fieldnum will be set to 0 if the contest name isn't in the Cabrillo * map. Otherwise it is set to the QSO line field number of the call-worked * field, with field counting starting at 1. * * \c contest_type may be NULL. If not, it is set to the Cabrillo contest * type (TQSL_CABRILLO_HF or TQSL_CABRILLO_VHF), defined in cabrillo.h. */ DLLEXPORT int CALLCONVENTION tqsl_getCabrilloMapEntry(const char *contest, int *fieldnum, int *contest_type); /** Clear the map of ADIF modes */ DLLEXPORT int CALLCONVENTION tqsl_clearADIFModes(); /** Set the mapping of an ADIF mode to a TQSL mode. */ DLLEXPORT int CALLCONVENTION tqsl_setADIFMode(const char *adif_item, const char *mode); /** Map an ADIF mode to its TQSL equivalent. */ DLLEXPORT int CALLCONVENTION tqsl_getADIFMode(const char *adif_item, char *mode, int nmode); /** Map a GABBI mode to its mode/submode pair. */ DLLEXPORT int CALLCONVENTION tqsl_getADIFSubMode(const char *adif_item, char *mode, char *submode, int nmode); /** Get a GABBI record that contains the certificate. * * \c uid is the value for the CERT_UID field * * Returns the NULL pointer on error. * * N.B. On systems that distinguish text-mode files from binary-mode files, * notably Windows, the GABBI records should be written in binary mode. */ DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItCERT(tQSL_Cert cert, int uid); /** Get a GABBI record that contains the Station Location data. * * \li \c uid is the value for the STATION_UID field. * \li \c certuid is the value of the associated CERT_UID field. * * Returns the NULL pointer on error. * * N.B. On systems that distinguish text-mode files from binary-mode files, * notably Windows, the GABBI records should be written in binary mode. */ DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItSTATION(tQSL_Location loc, int uid, int certuid); /** Get a GABBI record that contains the QSO data. * * \li \c stationuid is the value of the associated STATION_UID field. * * N.B.: If \c cert is not initialized for signing (see tqsl_beginSigning()) * the function will return with a TQSL_SIGNINIT_ERROR error. * * Returns the NULL pointer on error. * * N.B. On systems that distinguish text-mode files from binary-mode files, * notably Windows, the GABBI records should be written in binary mode. */ DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItCONTACT(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid); /** Get a GABBI record that contains the QSO data along with the associated * signdata (QSO data signed to validate the QSO). * * \li \c stationuid is the value of the associated STATION_UID field. * * N.B.: If \c cert is not initialized for signing (see tqsl_beginSigning()) * the function will return with a TQSL_SIGNINIT_ERROR error. * * Returns the NULL pointer on error. * * N.B. On systems that distinguish text-mode files from binary-mode files, * notably Windows, the GABBI records should be written in binary mode. */ DLLEXPORT const char* CALLCONVENTION tqsl_getGABBItCONTACTData(tQSL_Cert cert, tQSL_Location loc, TQSL_QSO_RECORD *qso, int stationuid, char *signdata, int sdlen); #define GRID_ERROR_INVALID_FIELD 2 ///< Field - first two chars - is invalid #define GRID_ERROR_INVALID_SQUARE 3 ///< Square - second two chars - is invalid #define GRID_ERROR_INVALID_SUBSQUARE 4 ///< Subsquare - third pair - is invalid #define GRID_ERROR_INVALID_SUBSUBSQUARE 5 ///< Sub-subsquare - fourth pair etc. - is invalid #define GRID_ERROR_INVALID_FORMAT 6 ///< Format error /** Check and normalize a Maidenhead Gridsquare * \li \c grid is the input string * \li \c twelve is true if 12 character grids are allowed * \li \c newGrid gets the resulting edited grid */ DLLEXPORT int CALLCONVENTION tqsl_verifyGridFormat(const char *grid, int twelve, char* newGrid, int newlen); /** @} */ /** Output to a diagnostic trace file (if one is opened. * * \li \c name is the name of the function being executed */ DLLEXPORT void CALLCONVENTION tqslTrace(const char *name, const char *format, ...); /** Close the diagnostic trace file (if it is open) */ DLLEXPORT void CALLCONVENTION tqsl_closeDiagFile(void); /** Close the diagnostic trace file (if it is open) */ DLLEXPORT int CALLCONVENTION tqsl_diagFileOpen(void); /** Returns true if the log file is open * */ DLLEXPORT int CALLCONVENTION tqsl_openDiagFile(const char* file); /** Removes the upload database if it exists * */ DLLEXPORT void CALLCONVENTION tqsl_removeUploadDatabase(void); #ifdef _WIN32 DLLEXPORT wchar_t* CALLCONVENTION utf8_to_wchar(const char* str); DLLEXPORT char* CALLCONVENTION wchar_to_utf8(const wchar_t* str, bool forceUTF8); DLLEXPORT void CALLCONVENTION free_wchar(wchar_t* ptr); #endif #ifdef __cplusplus } #endif /* Useful defines */ #define TQSL_MAX_PW_LENGTH 32 ///< Password buffer length #endif /* TQSLLIB_H */ tqsl-2.8.1/src/tqsllib.rc.in0000644000175000017500000000210315003421124015663 0ustar rmurphyrmurphy#include 1 VERSIONINFO FILEVERSION @TQSLLIB_VERSION_MAJOR@, @TQSLLIB_VERSION_MINOR@, 0, 0 PRODUCTVERSION @TQSLLIB_VERSION_MAJOR@, @TQSLLIB_VERSION_MINOR@, 0, 0 FILEFLAGSMASK 0 FILEFLAGS VS_FFI_FILEFLAGSMASK FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL BEGIN BLOCK "StringFileInfo" BEGIN // Language type = U.S. English(0x0409) and Character Set = Windows, Multilingual(0x04e4) BLOCK "040904E4" // Matches VarFileInfo Translation hex value. BEGIN VALUE "CompanyName", "American Radio Relay League, Inc.\000" VALUE "FileDescription", "TrustedQSL Library\000" VALUE "FileVersion", "@TQSLLIB_VERSION@\000" VALUE "InternalName", "TQSLLIB\000" VALUE "LegalCopyright", "Copyright 2020 American Radio Relay League.\000" VALUE "OriginalFilename", "tqsllib@DLLVER@.dll\000" VALUE "ProductName", "TQSLLIB\000" VALUE "ProductVersion", "@TQSLLIB_VERSION@\000" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 0x04e4 // U.S. English(0x0409) & Windows Multilingual(0x04e4) 1252 END END tqsl-2.8.1/src/tqsllib.spec.in0000644000175000017500000000276415003421124016226 0ustar rmurphyrmurphySummary: The TrustedQSL library Name: tqsllib Version: @VERSION@ Release: 2 Copyright: Custom BSD-like Group: Development/Libraries Source: tqsllib-%{version}.tar.gz BuildRoot: /var/tmp/%{name}-buildroot Requires: openssl expat zlib BuildPrereq: openssl-devel expat-devel zlib-devel %package devel Summary: The TrustedQSL Library development tools Group: System/Libraries %description The TrustedQSL library is used for generating digitally signed QSO records (records of Amateur Radio contacts). This package contains the library and configuration files needed to run TrustedQSL applications. %description devel The TrustedQSL library is used for generating digitally signed QSO records (records of Amateur Radio contacts). This package contains the header files needed to build TrustedQSL applications as well as a static tqsllib library and API documentation. %prep %setup -q -n tqsllib-%{version} %build # use --disable-docs because RPM handles docs itself cmake -DCMAKE_INSTALL_PREFIX=/usr . make %install make install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc LICENSE ChangeLog /usr/lib/libtqsllib.so /usr/lib/libtqsllib.so.1 /usr/lib/libtqsllib.so.1.0.0 /usr/share/tqsl/config.xml /usr/bin/dumptqsldata %files devel %defattr(-,root,root) %doc LICENSE ChangeLog doxygen/html /usr/lib/libtqsllib.a /usr/lib/libtqsllib.la /usr/include/tqsllib.h /usr/include/tqslerrno.h /usr/include/cabrillo.h /usr/include/adif.h /usr/include/tqslconvert.h %post /sbin/ldconfig %postun /sbin/ldconfig tqsl-2.8.1/src/tqsllib2-x64.def0000644000175000017500000000727015003421124016123 0ustar rmurphyrmurphyLIBRARY tqsllib2.dll EXPORTS tqsl_getSelectedCertificate tqsl_getNumStationLocationCapturePages tqsl_adifGetError tqsl_adifMakeField tqsl_beginADIF tqsl_beginADIFConverter tqsl_beginCabrillo tqsl_beginCabrilloConverter tqsl_beginSigning tqsl_cabrilloGetError tqsl_checkSigningStatus tqsl_clearADIFModes tqsl_clearCabrilloMap tqsl_compareDates tqsl_convertDateToText tqsl_convertTimeToText tqsl_converterCommit tqsl_converterRollBack tqsl_createCertRequest tqsl_decodeBase64 tqsl_deleteCertificate tqsl_deleteStationLocation tqsl_encodeBase64 tqsl_endADIF tqsl_endCabrillo tqsl_endConverter tqsl_endSigning tqsl_endStationLocationCapture tqsl_exportPKCS12File tqsl_freeCertificate tqsl_getADIFField tqsl_getADIFLine tqsl_getADIFMode tqsl_getBand tqsl_getCabrilloContest tqsl_getCabrilloField tqsl_getCabrilloFreqType tqsl_getCabrilloLine tqsl_getCabrilloMapEntry tqsl_getCabrilloRecordText tqsl_getCertificateAROName tqsl_getCertificateCallSign tqsl_getCertificateDXCCEntity tqsl_getCertificateEmailAddress tqsl_getCertificateEncoded tqsl_getCertificateIssuer tqsl_getCertificateIssuerOrganization tqsl_getCertificateIssuerOrganizationalUnit tqsl_getCertificateKeyOnly tqsl_getCertificateNotAfterDate tqsl_getCertificateNotBeforeDate tqsl_getCertificatePrivateKeyType tqsl_getCertificateQSONotAfterDate tqsl_getCertificateQSONotBeforeDate tqsl_getCertificateRequestAddress1 tqsl_getCertificateRequestAddress2 tqsl_getCertificateRequestCity tqsl_getCertificateRequestCountry tqsl_getCertificateRequestPostalCode tqsl_getCertificateRequestState tqsl_getCertificateSerial tqsl_getCertificateSerialExt tqsl_getCertificateSerialLength tqsl_getConfigVersion tqsl_getConverterCert tqsl_getConverterGABBI tqsl_getConverterLine tqsl_getConverterRecordText tqsl_getDXCCEntity tqsl_getDXCCEntityName tqsl_getDXCCZoneMap tqsl_getErrorString tqsl_getErrorString_v tqsl_getGABBItCERT tqsl_getGABBItCONTACT tqsl_getGABBItCONTACTData tqsl_getGABBItSTATION tqsl_getLocationCallSign tqsl_getLocationDXCCEntity tqsl_getLocationFieldChanged tqsl_getLocationFieldCharData tqsl_getLocationFieldDataGABBI tqsl_getLocationFieldDataGABBISize tqsl_getLocationFieldDataLabel tqsl_getLocationFieldDataLabelSize tqsl_getLocationFieldDataLength tqsl_getLocationFieldDataType tqsl_getLocationFieldFlags tqsl_getLocationFieldIndex tqsl_getLocationFieldInputType tqsl_getLocationFieldIntData tqsl_getLocationFieldListItem tqsl_getMaxSignatureSize tqsl_getMode tqsl_getNumBand tqsl_getNumDXCCEntity tqsl_getNumLocationField tqsl_getNumLocationFieldListItems tqsl_getNumMode tqsl_getNumPropagationMode tqsl_getNumProviders tqsl_getNumSatellite tqsl_getNumStationLocations tqsl_getPropagationMode tqsl_getProvider tqsl_getSatellite tqsl_getSerialFromTQSLFile tqsl_getStationLocation tqsl_getStationLocationCallSign tqsl_getStationLocationCaptureName tqsl_getStationLocationCapturePage tqsl_getStationLocationName tqsl_getVersion tqsl_hasNextStationLocationCapture tqsl_hasPrevStationLocationCapture tqsl_importPKCS12File tqsl_importTQSLFile tqsl_init tqsl_initDate tqsl_initStationLocationCapture tqsl_initTime tqsl_isDateNull tqsl_isDateValid tqsl_isTimeValid tqsl_nextStationLocationCapture tqsl_prevStationLocationCapture tqsl_saveStationLocationCapture tqsl_selectCertificates tqsl_setADIFConverterDateFilter tqsl_setADIFMode tqsl_setCabrilloMapEntry tqsl_setConverterAllowBadCall tqsl_setConverterAllowDuplicates tqsl_setDirectory tqsl_setLocationFieldCharData tqsl_setLocationFieldIndex tqsl_setLocationFieldIntData tqsl_setStationLocationCaptureName tqsl_setStationLocationCapturePage tqsl_signDataBlock tqsl_signQSORecord tqsl_updateStationLocationCapture tqsl_verifyDataBlock tQSL_ADIF_Error DATA tQSL_Cabrillo_Error DATA tQSL_CustomError DATA tQSL_Errno DATA tQSL_Error DATA tQSL_ErrorFile DATA tqsl-2.8.1/src/tqsllib2.def0000644000175000017500000004716515003421124015513 0ustar rmurphyrmurphyLIBRARY tqsllib2.dll EXPORTS _tqsl_getSelectedCertificate@12 tqsl_getSelectedCertificate@12=_tqsl_getSelectedCertificate@12 tqsl_getSelectedCertificate=_tqsl_getSelectedCertificate@12 _tqsl_getNumStationLocationCapturePages@8 tqsl_getNumStationLocationCapturePages@8=_tqsl_getNumStationLocationCapturePages@8 tqsl_getNumStationLocationCapturePages=_tqsl_getNumStationLocationCapturePages@8 _tqsl_adifGetError@4 tqsl_adifGetError@4=_tqsl_adifGetError@4 tqsl_adifGetError=_tqsl_adifGetError@4 _tqsl_adifMakeField@24 tqsl_adifMakeField@24=_tqsl_adifMakeField@24 tqsl_adifMakeField=_tqsl_adifMakeField@24 _tqsl_beginADIF@8 tqsl_beginADIF@8=_tqsl_beginADIF@8 tqsl_beginADIF=_tqsl_beginADIF@8 _tqsl_beginADIFConverter@20 tqsl_beginADIFConverter@20=_tqsl_beginADIFConverter@20 tqsl_beginADIFConverter=_tqsl_beginADIFConverter@20 _tqsl_beginCabrillo@8 tqsl_beginCabrillo@8=_tqsl_beginCabrillo@8 tqsl_beginCabrillo=_tqsl_beginCabrillo@8 _tqsl_beginCabrilloConverter@20 tqsl_beginCabrilloConverter@20=_tqsl_beginCabrilloConverter@20 tqsl_beginCabrilloConverter=_tqsl_beginCabrilloConverter@20 _tqsl_beginSigning@16 tqsl_beginSigning@16=_tqsl_beginSigning@16 tqsl_beginSigning=_tqsl_beginSigning@16 _tqsl_cabrilloGetError@4 tqsl_cabrilloGetError@4=_tqsl_cabrilloGetError@4 tqsl_cabrilloGetError=_tqsl_cabrilloGetError@4 _tqsl_checkSigningStatus@4 tqsl_checkSigningStatus@4=_tqsl_checkSigningStatus@4 tqsl_checkSigningStatus=_tqsl_checkSigningStatus@4 _tqsl_clearADIFModes@0 tqsl_clearADIFModes@0=_tqsl_clearADIFModes@0 tqsl_clearADIFModes=_tqsl_clearADIFModes@0 _tqsl_clearCabrilloMap@0 tqsl_clearCabrilloMap@0=_tqsl_clearCabrilloMap@0 tqsl_clearCabrilloMap=_tqsl_clearCabrilloMap@0 _tqsl_compareDates@8 tqsl_compareDates@8=_tqsl_compareDates@8 tqsl_compareDates=_tqsl_compareDates@8 _tqsl_convertDateToText@12 tqsl_convertDateToText@12=_tqsl_convertDateToText@12 tqsl_convertDateToText=_tqsl_convertDateToText@12 _tqsl_convertTimeToText@12 tqsl_convertTimeToText@12=_tqsl_convertTimeToText@12 tqsl_convertTimeToText=_tqsl_convertTimeToText@12 _tqsl_converterCommit@4 tqsl_converterCommit@4=_tqsl_converterCommit@4 tqsl_converterCommit=_tqsl_converterCommit@4 _tqsl_converterRollBack@4 tqsl_converterRollBack@4=_tqsl_converterRollBack@4 tqsl_converterRollBack=_tqsl_converterRollBack@4 _tqsl_createCertRequest@16 tqsl_createCertRequest@16=_tqsl_createCertRequest@16 tqsl_createCertRequest=_tqsl_createCertRequest@16 _tqsl_decodeBase64@12 tqsl_decodeBase64@12=_tqsl_decodeBase64@12 tqsl_decodeBase64=_tqsl_decodeBase64@12 _tqsl_deleteCertificate@4 tqsl_deleteCertificate@4=_tqsl_deleteCertificate@4 tqsl_deleteCertificate=_tqsl_deleteCertificate@4 _tqsl_deleteStationLocation@4 tqsl_deleteStationLocation@4=_tqsl_deleteStationLocation@4 tqsl_deleteStationLocation=_tqsl_deleteStationLocation@4 _tqsl_encodeBase64@16 tqsl_encodeBase64@16=_tqsl_encodeBase64@16 tqsl_encodeBase64=_tqsl_encodeBase64@16 _tqsl_endADIF@4 tqsl_endADIF@4=_tqsl_endADIF@4 tqsl_endADIF=_tqsl_endADIF@4 _tqsl_endCabrillo@4 tqsl_endCabrillo@4=_tqsl_endCabrillo@4 tqsl_endCabrillo=_tqsl_endCabrillo@4 _tqsl_endConverter@4 tqsl_endConverter@4=_tqsl_endConverter@4 tqsl_endConverter=_tqsl_endConverter@4 _tqsl_endSigning@4 tqsl_endSigning@4=_tqsl_endSigning@4 tqsl_endSigning=_tqsl_endSigning@4 _tqsl_endStationLocationCapture@4 tqsl_endStationLocationCapture@4=_tqsl_endStationLocationCapture@4 tqsl_endStationLocationCapture=_tqsl_endStationLocationCapture@4 _tqsl_exportPKCS12File@12 tqsl_exportPKCS12File@12=_tqsl_exportPKCS12File@12 tqsl_exportPKCS12File=_tqsl_exportPKCS12File@12 _tqsl_freeCertificate@4 tqsl_freeCertificate@4=_tqsl_freeCertificate@4 tqsl_freeCertificate=_tqsl_freeCertificate@4 _tqsl_getADIFField@24 tqsl_getADIFField@24=_tqsl_getADIFField@24 tqsl_getADIFField=_tqsl_getADIFField@24 _tqsl_getADIFLine@8 tqsl_getADIFLine@8=_tqsl_getADIFLine@8 tqsl_getADIFLine=_tqsl_getADIFLine@8 _tqsl_getADIFMode@12 tqsl_getADIFMode@12=_tqsl_getADIFMode@12 tqsl_getADIFMode=_tqsl_getADIFMode@12 _tqsl_getBand@20 tqsl_getBand@20=_tqsl_getBand@20 tqsl_getBand=_tqsl_getBand@20 _tqsl_getCabrilloContest@12 tqsl_getCabrilloContest@12=_tqsl_getCabrilloContest@12 tqsl_getCabrilloContest=_tqsl_getCabrilloContest@12 _tqsl_getCabrilloField@12 tqsl_getCabrilloField@12=_tqsl_getCabrilloField@12 tqsl_getCabrilloField=_tqsl_getCabrilloField@12 _tqsl_getCabrilloFreqType@8 tqsl_getCabrilloFreqType@8=_tqsl_getCabrilloFreqType@8 tqsl_getCabrilloFreqType=_tqsl_getCabrilloFreqType@8 _tqsl_getCabrilloLine@8 tqsl_getCabrilloLine@8=_tqsl_getCabrilloLine@8 tqsl_getCabrilloLine=_tqsl_getCabrilloLine@8 _tqsl_getCabrilloMapEntry@12 tqsl_getCabrilloMapEntry@12=_tqsl_getCabrilloMapEntry@12 tqsl_getCabrilloMapEntry=_tqsl_getCabrilloMapEntry@12 _tqsl_getCabrilloRecordText@4 tqsl_getCabrilloRecordText@4=_tqsl_getCabrilloRecordText@4 tqsl_getCabrilloRecordText=_tqsl_getCabrilloRecordText@4 _tqsl_getCertificateAROName@12 tqsl_getCertificateAROName@12=_tqsl_getCertificateAROName@12 tqsl_getCertificateAROName=_tqsl_getCertificateAROName@12 _tqsl_getCertificateCallSign@12 tqsl_getCertificateCallSign@12=_tqsl_getCertificateCallSign@12 tqsl_getCertificateCallSign=_tqsl_getCertificateCallSign@12 _tqsl_getCertificateDXCCEntity@8 tqsl_getCertificateDXCCEntity@8=_tqsl_getCertificateDXCCEntity@8 tqsl_getCertificateDXCCEntity=_tqsl_getCertificateDXCCEntity@8 _tqsl_getCertificateEmailAddress@12 tqsl_getCertificateEmailAddress@12=_tqsl_getCertificateEmailAddress@12 tqsl_getCertificateEmailAddress=_tqsl_getCertificateEmailAddress@12 _tqsl_getCertificateEncoded@12 tqsl_getCertificateEncoded@12=_tqsl_getCertificateEncoded@12 tqsl_getCertificateEncoded=_tqsl_getCertificateEncoded@12 _tqsl_getCertificateIssuer@12 tqsl_getCertificateIssuer@12=_tqsl_getCertificateIssuer@12 tqsl_getCertificateIssuer=_tqsl_getCertificateIssuer@12 _tqsl_getCertificateIssuerOrganization@12 tqsl_getCertificateIssuerOrganization@12=_tqsl_getCertificateIssuerOrganization@12 tqsl_getCertificateIssuerOrganization=_tqsl_getCertificateIssuerOrganization@12 _tqsl_getCertificateIssuerOrganizationalUnit@12 tqsl_getCertificateIssuerOrganizationalUnit@12=_tqsl_getCertificateIssuerOrganizationalUnit@12 tqsl_getCertificateIssuerOrganizationalUnit=_tqsl_getCertificateIssuerOrganizationalUnit@12 _tqsl_getCertificateKeyOnly@8 tqsl_getCertificateKeyOnly@8=_tqsl_getCertificateKeyOnly@8 tqsl_getCertificateKeyOnly=_tqsl_getCertificateKeyOnly@8 _tqsl_getCertificateNotAfterDate@8 tqsl_getCertificateNotAfterDate@8=_tqsl_getCertificateNotAfterDate@8 tqsl_getCertificateNotAfterDate=_tqsl_getCertificateNotAfterDate@8 _tqsl_getCertificateNotBeforeDate@8 tqsl_getCertificateNotBeforeDate@8=_tqsl_getCertificateNotBeforeDate@8 tqsl_getCertificateNotBeforeDate=_tqsl_getCertificateNotBeforeDate@8 _tqsl_getCertificatePrivateKeyType@4 tqsl_getCertificatePrivateKeyType@4=_tqsl_getCertificatePrivateKeyType@4 tqsl_getCertificatePrivateKeyType=_tqsl_getCertificatePrivateKeyType@4 _tqsl_getCertificateQSONotAfterDate@8 tqsl_getCertificateQSONotAfterDate@8=_tqsl_getCertificateQSONotAfterDate@8 tqsl_getCertificateQSONotAfterDate=_tqsl_getCertificateQSONotAfterDate@8 _tqsl_getCertificateQSONotBeforeDate@8 tqsl_getCertificateQSONotBeforeDate@8=_tqsl_getCertificateQSONotBeforeDate@8 tqsl_getCertificateQSONotBeforeDate=_tqsl_getCertificateQSONotBeforeDate@8 _tqsl_getCertificateRequestAddress1@12 tqsl_getCertificateRequestAddress1@12=_tqsl_getCertificateRequestAddress1@12 tqsl_getCertificateRequestAddress1=_tqsl_getCertificateRequestAddress1@12 _tqsl_getCertificateRequestAddress2@12 tqsl_getCertificateRequestAddress2@12=_tqsl_getCertificateRequestAddress2@12 tqsl_getCertificateRequestAddress2=_tqsl_getCertificateRequestAddress2@12 _tqsl_getCertificateRequestCity@12 tqsl_getCertificateRequestCity@12=_tqsl_getCertificateRequestCity@12 tqsl_getCertificateRequestCity=_tqsl_getCertificateRequestCity@12 _tqsl_getCertificateRequestCountry@12 tqsl_getCertificateRequestCountry@12=_tqsl_getCertificateRequestCountry@12 tqsl_getCertificateRequestCountry=_tqsl_getCertificateRequestCountry@12 _tqsl_getCertificateRequestPostalCode@12 tqsl_getCertificateRequestPostalCode@12=_tqsl_getCertificateRequestPostalCode@12 tqsl_getCertificateRequestPostalCode=_tqsl_getCertificateRequestPostalCode@12 _tqsl_getCertificateRequestState@12 tqsl_getCertificateRequestState@12=_tqsl_getCertificateRequestState@12 tqsl_getCertificateRequestState=_tqsl_getCertificateRequestState@12 _tqsl_getCertificateSerial@8 tqsl_getCertificateSerial@8=_tqsl_getCertificateSerial@8 tqsl_getCertificateSerial=_tqsl_getCertificateSerial@8 _tqsl_getCertificateSerialExt@12 tqsl_getCertificateSerialExt@12=_tqsl_getCertificateSerialExt@12 tqsl_getCertificateSerialExt=_tqsl_getCertificateSerialExt@12 _tqsl_getCertificateSerialLength@4 tqsl_getCertificateSerialLength@4=_tqsl_getCertificateSerialLength@4 tqsl_getCertificateSerialLength=_tqsl_getCertificateSerialLength@4 _tqsl_getConfigVersion@8 tqsl_getConfigVersion@8=_tqsl_getConfigVersion@8 tqsl_getConfigVersion=_tqsl_getConfigVersion@8 _tqsl_getConverterCert@8 tqsl_getConverterCert@8=_tqsl_getConverterCert@8 tqsl_getConverterCert=_tqsl_getConverterCert@8 _tqsl_getConverterGABBI@4 tqsl_getConverterGABBI@4=_tqsl_getConverterGABBI@4 tqsl_getConverterGABBI=_tqsl_getConverterGABBI@4 _tqsl_getConverterLine@8 tqsl_getConverterLine@8=_tqsl_getConverterLine@8 tqsl_getConverterLine=_tqsl_getConverterLine@8 _tqsl_getConverterRecordText@4 tqsl_getConverterRecordText@4=_tqsl_getConverterRecordText@4 tqsl_getConverterRecordText=_tqsl_getConverterRecordText@4 _tqsl_getDXCCEntity@12 tqsl_getDXCCEntity@12=_tqsl_getDXCCEntity@12 tqsl_getDXCCEntity=_tqsl_getDXCCEntity@12 _tqsl_getDXCCEntityName@8 tqsl_getDXCCEntityName@8=_tqsl_getDXCCEntityName@8 tqsl_getDXCCEntityName=_tqsl_getDXCCEntityName@8 _tqsl_getDXCCZoneMap@8 tqsl_getDXCCZoneMap@8=_tqsl_getDXCCZoneMap@8 tqsl_getDXCCZoneMap=_tqsl_getDXCCZoneMap@8 _tqsl_getErrorString@0 tqsl_getErrorString@0=_tqsl_getErrorString@0 tqsl_getErrorString=_tqsl_getErrorString@0 _tqsl_getErrorString_v@4 tqsl_getErrorString_v@4=_tqsl_getErrorString_v@4 tqsl_getErrorString_v=_tqsl_getErrorString_v@4 _tqsl_getGABBItCERT@8 tqsl_getGABBItCERT@8=_tqsl_getGABBItCERT@8 tqsl_getGABBItCERT=_tqsl_getGABBItCERT@8 _tqsl_getGABBItCONTACT@16 tqsl_getGABBItCONTACT@16=_tqsl_getGABBItCONTACT@16 tqsl_getGABBItCONTACT=_tqsl_getGABBItCONTACT@16 _tqsl_getGABBItCONTACTData@24 tqsl_getGABBItCONTACTData@24=_tqsl_getGABBItCONTACTData@24 tqsl_getGABBItCONTACTData=_tqsl_getGABBItCONTACTData@24 _tqsl_getGABBItSTATION@12 tqsl_getGABBItSTATION@12=_tqsl_getGABBItSTATION@12 tqsl_getGABBItSTATION=_tqsl_getGABBItSTATION@12 _tqsl_getLocationCallSign@12 tqsl_getLocationCallSign@12=_tqsl_getLocationCallSign@12 tqsl_getLocationCallSign=_tqsl_getLocationCallSign@12 _tqsl_getLocationDXCCEntity@8 tqsl_getLocationDXCCEntity@8=_tqsl_getLocationDXCCEntity@8 tqsl_getLocationDXCCEntity=_tqsl_getLocationDXCCEntity@8 _tqsl_getLocationFieldChanged@12 tqsl_getLocationFieldChanged@12=_tqsl_getLocationFieldChanged@12 tqsl_getLocationFieldChanged=_tqsl_getLocationFieldChanged@12 _tqsl_getLocationFieldCharData@16 tqsl_getLocationFieldCharData@16=_tqsl_getLocationFieldCharData@16 tqsl_getLocationFieldCharData=_tqsl_getLocationFieldCharData@16 _tqsl_getLocationFieldDataGABBI@16 tqsl_getLocationFieldDataGABBI@16=_tqsl_getLocationFieldDataGABBI@16 tqsl_getLocationFieldDataGABBI=_tqsl_getLocationFieldDataGABBI@16 _tqsl_getLocationFieldDataGABBISize@12 tqsl_getLocationFieldDataGABBISize@12=_tqsl_getLocationFieldDataGABBISize@12 tqsl_getLocationFieldDataGABBISize=_tqsl_getLocationFieldDataGABBISize@12 _tqsl_getLocationFieldDataLabel@16 tqsl_getLocationFieldDataLabel@16=_tqsl_getLocationFieldDataLabel@16 tqsl_getLocationFieldDataLabel=_tqsl_getLocationFieldDataLabel@16 _tqsl_getLocationFieldDataLabelSize@12 tqsl_getLocationFieldDataLabelSize@12=_tqsl_getLocationFieldDataLabelSize@12 tqsl_getLocationFieldDataLabelSize=_tqsl_getLocationFieldDataLabelSize@12 _tqsl_getLocationFieldDataLength@12 tqsl_getLocationFieldDataLength@12=_tqsl_getLocationFieldDataLength@12 tqsl_getLocationFieldDataLength=_tqsl_getLocationFieldDataLength@12 _tqsl_getLocationFieldDataType@12 tqsl_getLocationFieldDataType@12=_tqsl_getLocationFieldDataType@12 tqsl_getLocationFieldDataType=_tqsl_getLocationFieldDataType@12 _tqsl_getLocationFieldFlags@12 tqsl_getLocationFieldFlags@12=_tqsl_getLocationFieldFlags@12 tqsl_getLocationFieldFlags=_tqsl_getLocationFieldFlags@12 _tqsl_getLocationFieldIndex@12 tqsl_getLocationFieldIndex@12=_tqsl_getLocationFieldIndex@12 tqsl_getLocationFieldIndex=_tqsl_getLocationFieldIndex@12 _tqsl_getLocationFieldInputType@12 tqsl_getLocationFieldInputType@12=_tqsl_getLocationFieldInputType@12 tqsl_getLocationFieldInputType=_tqsl_getLocationFieldInputType@12 _tqsl_getLocationFieldIntData@12 tqsl_getLocationFieldIntData@12=_tqsl_getLocationFieldIntData@12 tqsl_getLocationFieldIntData=_tqsl_getLocationFieldIntData@12 _tqsl_getLocationFieldListItem@20 tqsl_getLocationFieldListItem@20=_tqsl_getLocationFieldListItem@20 tqsl_getLocationFieldListItem=_tqsl_getLocationFieldListItem@20 _tqsl_getMaxSignatureSize@8 tqsl_getMaxSignatureSize@8=_tqsl_getMaxSignatureSize@8 tqsl_getMaxSignatureSize=_tqsl_getMaxSignatureSize@8 _tqsl_getMode@12 tqsl_getMode@12=_tqsl_getMode@12 tqsl_getMode=_tqsl_getMode@12 _tqsl_getNumBand@4 tqsl_getNumBand@4=_tqsl_getNumBand@4 tqsl_getNumBand=_tqsl_getNumBand@4 _tqsl_getNumDXCCEntity@4 tqsl_getNumDXCCEntity@4=_tqsl_getNumDXCCEntity@4 tqsl_getNumDXCCEntity=_tqsl_getNumDXCCEntity@4 _tqsl_getNumLocationField@8 tqsl_getNumLocationField@8=_tqsl_getNumLocationField@8 tqsl_getNumLocationField=_tqsl_getNumLocationField@8 _tqsl_getNumLocationFieldListItems@12 tqsl_getNumLocationFieldListItems@12=_tqsl_getNumLocationFieldListItems@12 tqsl_getNumLocationFieldListItems=_tqsl_getNumLocationFieldListItems@12 _tqsl_getNumMode@4 tqsl_getNumMode@4=_tqsl_getNumMode@4 tqsl_getNumMode=_tqsl_getNumMode@4 _tqsl_getNumPropagationMode@4 tqsl_getNumPropagationMode@4=_tqsl_getNumPropagationMode@4 tqsl_getNumPropagationMode=_tqsl_getNumPropagationMode@4 _tqsl_getNumProviders@4 tqsl_getNumProviders@4=_tqsl_getNumProviders@4 tqsl_getNumProviders=_tqsl_getNumProviders@4 _tqsl_getNumSatellite@4 tqsl_getNumSatellite@4=_tqsl_getNumSatellite@4 tqsl_getNumSatellite=_tqsl_getNumSatellite@4 _tqsl_getNumStationLocations@8 tqsl_getNumStationLocations@8=_tqsl_getNumStationLocations@8 tqsl_getNumStationLocations=_tqsl_getNumStationLocations@8 _tqsl_getPropagationMode@12 tqsl_getPropagationMode@12=_tqsl_getPropagationMode@12 tqsl_getPropagationMode=_tqsl_getPropagationMode@12 _tqsl_getProvider@8 tqsl_getProvider@8=_tqsl_getProvider@8 tqsl_getProvider=_tqsl_getProvider@8 _tqsl_getSatellite@20 tqsl_getSatellite@20=_tqsl_getSatellite@20 tqsl_getSatellite=_tqsl_getSatellite@20 _tqsl_getSerialFromTQSLFile@8 tqsl_getSerialFromTQSLFile@8=_tqsl_getSerialFromTQSLFile@8 tqsl_getSerialFromTQSLFile=_tqsl_getSerialFromTQSLFile@8 _tqsl_getStationLocation@8 tqsl_getStationLocation@8=_tqsl_getStationLocation@8 tqsl_getStationLocation=_tqsl_getStationLocation@8 _tqsl_getStationLocationCallSign@16 tqsl_getStationLocationCallSign@16=_tqsl_getStationLocationCallSign@16 tqsl_getStationLocationCallSign=_tqsl_getStationLocationCallSign@16 _tqsl_getStationLocationCaptureName@12 tqsl_getStationLocationCaptureName@12=_tqsl_getStationLocationCaptureName@12 tqsl_getStationLocationCaptureName=_tqsl_getStationLocationCaptureName@12 _tqsl_getStationLocationCapturePage@8 tqsl_getStationLocationCapturePage@8=_tqsl_getStationLocationCapturePage@8 tqsl_getStationLocationCapturePage=_tqsl_getStationLocationCapturePage@8 _tqsl_getStationLocationName@16 tqsl_getStationLocationName@16=_tqsl_getStationLocationName@16 tqsl_getStationLocationName=_tqsl_getStationLocationName@16 _tqsl_getVersion@8 tqsl_getVersion@8=_tqsl_getVersion@8 tqsl_getVersion=_tqsl_getVersion@8 _tqsl_hasNextStationLocationCapture@8 tqsl_hasNextStationLocationCapture@8=_tqsl_hasNextStationLocationCapture@8 tqsl_hasNextStationLocationCapture=_tqsl_hasNextStationLocationCapture@8 _tqsl_hasPrevStationLocationCapture@8 tqsl_hasPrevStationLocationCapture@8=_tqsl_hasPrevStationLocationCapture@8 tqsl_hasPrevStationLocationCapture=_tqsl_hasPrevStationLocationCapture@8 _tqsl_importPKCS12File@24 tqsl_importPKCS12File@24=_tqsl_importPKCS12File@24 tqsl_importPKCS12File=_tqsl_importPKCS12File@24 _tqsl_importTQSLFile@12 tqsl_importTQSLFile@12=_tqsl_importTQSLFile@12 tqsl_importTQSLFile=_tqsl_importTQSLFile@12 _tqsl_init@0 tqsl_init@0=_tqsl_init@0 tqsl_init=_tqsl_init@0 _tqsl_initDate@8 tqsl_initDate@8=_tqsl_initDate@8 tqsl_initDate=_tqsl_initDate@8 _tqsl_initStationLocationCapture@4 tqsl_initStationLocationCapture@4=_tqsl_initStationLocationCapture@4 tqsl_initStationLocationCapture=_tqsl_initStationLocationCapture@4 _tqsl_initTime@8 tqsl_initTime@8=_tqsl_initTime@8 tqsl_initTime=_tqsl_initTime@8 _tqsl_isDateNull@4 tqsl_isDateNull@4=_tqsl_isDateNull@4 tqsl_isDateNull=_tqsl_isDateNull@4 _tqsl_isDateValid@4 tqsl_isDateValid@4=_tqsl_isDateValid@4 tqsl_isDateValid=_tqsl_isDateValid@4 _tqsl_isTimeValid@4 tqsl_isTimeValid@4=_tqsl_isTimeValid@4 tqsl_isTimeValid=_tqsl_isTimeValid@4 _tqsl_nextStationLocationCapture@4 tqsl_nextStationLocationCapture@4=_tqsl_nextStationLocationCapture@4 tqsl_nextStationLocationCapture=_tqsl_nextStationLocationCapture@4 _tqsl_prevStationLocationCapture@4 tqsl_prevStationLocationCapture@4=_tqsl_prevStationLocationCapture@4 tqsl_prevStationLocationCapture=_tqsl_prevStationLocationCapture@4 _tqsl_saveStationLocationCapture@8 tqsl_saveStationLocationCapture@8=_tqsl_saveStationLocationCapture@8 tqsl_saveStationLocationCapture=_tqsl_saveStationLocationCapture@8 _tqsl_selectCertificates@28 tqsl_selectCertificates@28=_tqsl_selectCertificates@28 tqsl_selectCertificates=_tqsl_selectCertificates@28 _tqsl_setADIFConverterDateFilter@12 tqsl_setADIFConverterDateFilter@12=_tqsl_setADIFConverterDateFilter@12 tqsl_setADIFConverterDateFilter=_tqsl_setADIFConverterDateFilter@12 _tqsl_setADIFMode@8 tqsl_setADIFMode@8=_tqsl_setADIFMode@8 tqsl_setADIFMode=_tqsl_setADIFMode@8 _tqsl_setCabrilloMapEntry@12 tqsl_setCabrilloMapEntry@12=_tqsl_setCabrilloMapEntry@12 tqsl_setCabrilloMapEntry=_tqsl_setCabrilloMapEntry@12 _tqsl_setConverterAllowBadCall@8 tqsl_setConverterAllowBadCall@8=_tqsl_setConverterAllowBadCall@8 tqsl_setConverterAllowBadCall=_tqsl_setConverterAllowBadCall@8 _tqsl_setConverterAllowDuplicates@8 tqsl_setConverterAllowDuplicates@8=_tqsl_setConverterAllowDuplicates@8 tqsl_setConverterAllowDuplicates=_tqsl_setConverterAllowDuplicates@8 _tqsl_setDirectory@4 tqsl_setDirectory@4=_tqsl_setDirectory@4 tqsl_setDirectory=_tqsl_setDirectory@4 _tqsl_setLocationFieldCharData@12 tqsl_setLocationFieldCharData@12=_tqsl_setLocationFieldCharData@12 tqsl_setLocationFieldCharData=_tqsl_setLocationFieldCharData@12 _tqsl_setLocationFieldIndex@12 tqsl_setLocationFieldIndex@12=_tqsl_setLocationFieldIndex@12 tqsl_setLocationFieldIndex=_tqsl_setLocationFieldIndex@12 _tqsl_setLocationFieldIntData@12 tqsl_setLocationFieldIntData@12=_tqsl_setLocationFieldIntData@12 tqsl_setLocationFieldIntData=_tqsl_setLocationFieldIntData@12 _tqsl_setStationLocationCaptureName@8 tqsl_setStationLocationCaptureName@8=_tqsl_setStationLocationCaptureName@8 tqsl_setStationLocationCaptureName=_tqsl_setStationLocationCaptureName@8 _tqsl_setStationLocationCapturePage@8 tqsl_setStationLocationCapturePage@8=_tqsl_setStationLocationCapturePage@8 tqsl_setStationLocationCapturePage=_tqsl_setStationLocationCapturePage@8 _tqsl_signDataBlock@20 tqsl_signDataBlock@20=_tqsl_signDataBlock@20 tqsl_signDataBlock=_tqsl_signDataBlock@20 _tqsl_signQSORecord@20 tqsl_signQSORecord@20=_tqsl_signQSORecord@20 tqsl_signQSORecord=_tqsl_signQSORecord@20 _tqsl_updateStationLocationCapture@4 tqsl_updateStationLocationCapture@4=_tqsl_updateStationLocationCapture@4 tqsl_updateStationLocationCapture=_tqsl_updateStationLocationCapture@4 _tqsl_verifyDataBlock@20 tqsl_verifyDataBlock@20=_tqsl_verifyDataBlock@20 tqsl_verifyDataBlock=_tqsl_verifyDataBlock@20 tQSL_ADIF_Error DATA tQSL_Cabrillo_Error DATA tQSL_CustomError DATA tQSL_Errno DATA tQSL_Error DATA tQSL_ErrorFile DATA tqsl-2.8.1/src/windirent.h0000644000175000017500000006075415003421124015452 0ustar rmurphyrmurphy/* * dirent.h - dirent API for Microsoft Visual Studio * * Copyright (C) 2006-2012 Toni Ronkko * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * ``Software''), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * * Version 1.13, Dec 12 2012, Toni Ronkko * Use traditional 8+3 file name if the name cannot be represented in the * default ANSI code page. Now compiles again with MSVC 6.0. Thanks to * Konstantin Khomoutov for testing. * * Version 1.12.1, Oct 1 2012, Toni Ronkko * Bug fix: renamed wide-character DIR structure _wDIR to _WDIR (with * capital W) in order to maintain compatibility with MingW. * * Version 1.12, Sep 30 2012, Toni Ronkko * Define PATH_MAX and NAME_MAX. Added wide-character variants _wDIR, * _wdirent, _wopendir(), _wreaddir(), _wclosedir() and _wrewinddir(). * Thanks to Edgar Buerkle and Jan Nijtmans for ideas and code. * * Do not include windows.h. This allows dirent.h to be integrated more * easily into programs using winsock. Thanks to Fernando Azaldegui. * * Version 1.11, Mar 15, 2011, Toni Ronkko * Defined FILE_ATTRIBUTE_DEVICE for MSVC 6.0. * * Version 1.10, Aug 11, 2010, Toni Ronkko * Added d_type and d_namlen fields to dirent structure. The former is * especially useful for determining whether directory entry represents a * file or a directory. For more information, see * http://www.delorie.com/gnu/docs/glibc/libc_270.html * * Improved conformance to the standards. For example, errno is now set * properly on failure and assert() is never used. Thanks to Peter Brockam * for suggestions. * * Fixed a bug in rewinddir(): when using relative directory names, change * of working directory no longer causes rewinddir() to fail. * * Version 1.9, Dec 15, 2009, John Cunningham * Added rewinddir member function * * Version 1.8, Jan 18, 2008, Toni Ronkko * Using FindFirstFileA and WIN32_FIND_DATAA to avoid converting string * between multi-byte and unicode representations. This makes the * code simpler and also allows the code to be compiled under MingW. Thanks * to Azriel Fasten for the suggestion. * * Mar 4, 2007, Toni Ronkko * Bug fix: due to the strncpy_s() function this file only compiled in * Visual Studio 2005. Using the new string functions only when the * compiler version allows. * * Nov 2, 2006, Toni Ronkko * Major update: removed support for Watcom C, MS-DOS and Turbo C to * simplify the file, updated the code to compile cleanly on Visual * Studio 2005 with both unicode and multi-byte character strings, * removed rewinddir() as it had a bug. * * Aug 20, 2006, Toni Ronkko * Removed all remarks about MSVC 1.0, which is antiqued now. Simplified * comments by removing SGML tags. * * May 14 2002, Toni Ronkko * Embedded the function definitions directly to the header so that no * source modules need to be included in the Visual Studio project. Removed * all the dependencies to other projects so that this header file can be * used independently. * * May 28 1998, Toni Ronkko * First version. *****************************************************************************/ #ifndef DIRENT_H #define DIRENT_H #if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86) # define _X86_ #endif #include #include #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include /* Indicates that d_type field is available in dirent structure */ #define _DIRENT_HAVE_D_TYPE /* Indicates that d_namlen field is available in dirent structure */ #define _DIRENT_HAVE_D_NAMLEN /* Entries missing from MSVC 6.0 */ #if !defined(FILE_ATTRIBUTE_DEVICE) # define FILE_ATTRIBUTE_DEVICE 0x40 #endif /* File type and permission flags for stat() */ #if !defined(S_IFMT) # define S_IFMT _S_IFMT /* File type mask */ #endif #if !defined(S_IFDIR) # define S_IFDIR _S_IFDIR /* Directory */ #endif #if !defined(S_IFCHR) # define S_IFCHR _S_IFCHR /* Character device */ #endif #if !defined(S_IFFIFO) # define S_IFFIFO _S_IFFIFO /* Pipe */ #endif #if !defined(S_IFREG) # define S_IFREG _S_IFREG /* Regular file */ #endif #if !defined(S_IREAD) # define S_IREAD _S_IREAD /* Read permission */ #endif #if !defined(S_IWRITE) # define S_IWRITE _S_IWRITE /* Write permission */ #endif #if !defined(S_IEXEC) # define S_IEXEC _S_IEXEC /* Execute permission */ #endif #if !defined(S_IFIFO) # define S_IFIFO _S_IFIFO /* Pipe */ #endif #if !defined(S_IFBLK) # define S_IFBLK 0 /* Block device */ #endif #if !defined(S_IFLNK) # define S_IFLNK 0 /* Link */ #endif #if !defined(S_IFSOCK) # define S_IFSOCK 0 /* Socket */ #endif #if defined(_MSC_VER) # define S_IRUSR S_IREAD /* Read user */ # define S_IWUSR S_IWRITE /* Write user */ # define S_IXUSR 0 /* Execute user */ # define S_IRGRP 0 /* Read group */ # define S_IWGRP 0 /* Write group */ # define S_IXGRP 0 /* Execute group */ # define S_IROTH 0 /* Read others */ # define S_IWOTH 0 /* Write others */ # define S_IXOTH 0 /* Execute others */ #endif /* Maximum length of file name */ #if !defined(PATH_MAX) # define PATH_MAX MAX_PATH #endif #if !defined(FILENAME_MAX) # define FILENAME_MAX MAX_PATH #endif #if !defined(NAME_MAX) # define NAME_MAX FILENAME_MAX #endif /* File type flags for d_type */ #define DT_UNKNOWN 0 #define DT_REG S_IFREG #define DT_DIR S_IFDIR #define DT_FIFO S_IFIFO #define DT_SOCK S_IFSOCK #define DT_CHR S_IFCHR #define DT_BLK S_IFBLK /* Macros for converting between st_mode and d_type */ #define IFTODT(mode) ((mode) & S_IFMT) #define DTTOIF(type) (type) /* * File type macros. Note that block devices, sockets and links cannot be * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are * only defined for compatibility. These macros should always return false * on Windows. */ #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) /* Return the exact length of d_namlen without zero terminator */ #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) /* Return number of bytes needed to store d_namlen */ #define _D_ALLOC_NAMLEN(p) (PATH_MAX + 1) #ifdef __cplusplus extern "C" { #endif /* Wide-character version */ struct _wdirent { long d_ino; /* Always zero */ unsigned short d_reclen; /* Structure size */ size_t d_namlen; /* Length of name without \0 */ int d_type; /* File type */ wchar_t d_name[PATH_MAX + 1]; /* File name */ }; typedef struct _wdirent _wdirent; struct _WDIR { struct _wdirent ent; /* Current directory entry */ WIN32_FIND_DATAW data; /* Private file data */ int cached; /* True if data is valid */ HANDLE handle; /* Win32 search handle */ wchar_t *patt; /* Initial directory name */ }; typedef struct _WDIR _WDIR; static _WDIR *_wopendir(const wchar_t *dirname); static struct _wdirent *_wreaddir(_WDIR *dirp); static int _wclosedir(_WDIR *dirp); static void _wrewinddir(_WDIR* dirp); /* For compatibility with Symbian */ #define wdirent _wdirent #define WDIR _WDIR #define wopendir _wopendir #define wreaddir _wreaddir #define wclosedir _wclosedir #define wrewinddir _wrewinddir /* Multi-byte character versions */ struct dirent { long d_ino; /* Always zero */ unsigned short d_reclen; /* Structure size */ size_t d_namlen; /* Length of name without \0 */ int d_type; /* File type */ char d_name[PATH_MAX + 1]; /* File name */ }; typedef struct dirent dirent; struct DIR { struct dirent ent; struct _WDIR *wdirp; }; typedef struct DIR DIR; static DIR *opendir(const char *dirname); static struct dirent *readdir(DIR *dirp); static int closedir(DIR *dirp); static void rewinddir(DIR* dirp); /* Internal utility functions */ static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp); static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp); static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count); static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count); static void dirent_set_errno(int error); /* * Open directory stream DIRNAME for read and return a pointer to the * internal working area that is used to retrieve individual directory * entries. */ static _WDIR* _wopendir(const wchar_t *dirname) { _WDIR *dirp = NULL; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno(ENOENT); return NULL; } /* Allocate new _WDIR structure */ dirp = reinterpret_cast<_WDIR*>(malloc(sizeof(struct _WDIR))); if (dirp != NULL) { DWORD n; /* Reset _WDIR structure */ dirp->handle = INVALID_HANDLE_VALUE; dirp->patt = NULL; dirp->cached = 0; /* Compute the length of full path plus zero terminator */ n = GetFullPathNameW(dirname, 0, NULL, NULL); /* Allocate room for absolute directory name and search pattern */ dirp->patt = reinterpret_cast(malloc(sizeof(wchar_t) * n + 16)); if (dirp->patt) { /* * Convert relative directory name to an absolute one. This * allows rewinddir() to function correctly even when current * working directory is changed between opendir() and rewinddir(). */ n = GetFullPathNameW(dirname, n, dirp->patt, NULL); if (n > 0) { wchar_t *p; /* Append search pattern \* to the directory name */ p = dirp->patt + n; if (dirp->patt < p) { switch (p[-1]) { case '\\': case '/': case ':': /* Directory ends in path separator, e.g. c:\temp\ */ /*NOP*/ break; default: /* Directory name doesn't end in path separator */ *p++ = '\\'; } } *p++ = '*'; *p = '\0'; /* Open directory stream and retrieve the first entry */ if (dirent_first(dirp)) { /* Directory stream opened successfully */ error = 0; } else { /* Cannot retrieve first entry */ error = 1; dirent_set_errno(ENOENT); } } else { /* Cannot retrieve full path name */ dirent_set_errno(ENOENT); error = 1; } } else { /* Cannot allocate memory for search pattern */ error = 1; } } else { /* Cannot allocate _WDIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { _wclosedir(dirp); dirp = NULL; } return dirp; } /* * Read next directory entry. The directory entry is returned in dirent * structure in the d_name field. Individual directory entries returned by * this function include regular files, sub-directories, pseudo-directories * "." and ".." as well as volume labels, hidden files and system files. */ static struct _wdirent* _wreaddir(_WDIR *dirp) { WIN32_FIND_DATAW *datap; struct _wdirent *entp; /* Read next directory entry */ datap = dirent_next(dirp); if (datap) { size_t n; DWORD attr; /* Pointer to directory entry to return */ entp = &dirp->ent; /* * Copy file name as wide-character string. If the file name is too * long to fit in to the destination buffer, then truncate file name * to PATH_MAX characters and zero-terminate the buffer. */ n = 0; while (n < PATH_MAX && datap->cFileName[n] != 0) { entp->d_name[n] = datap->cFileName[n]; n++; } dirp->ent.d_name[n] = 0; /* Length of file name excluding zero terminator */ entp->d_namlen = n; /* File type */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entp->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entp->d_type = DT_DIR; } else { entp->d_type = DT_REG; } /* Reset dummy fields */ entp->d_ino = 0; entp->d_reclen = sizeof(struct _wdirent); } else { /* Last directory entry read */ entp = NULL; } return entp; } /* * Close directory stream opened by opendir() function. This invalidates the * DIR structure as well as any directory entry read previously by * _wreaddir(). */ static int _wclosedir(_WDIR *dirp) { int ok; if (dirp) { /* Release search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose(dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; } /* Release search pattern */ if (dirp->patt) { free(dirp->patt); dirp->patt = NULL; } /* Release directory structure */ free(dirp); ok = /*success*/0; } else { /* Invalid directory stream */ dirent_set_errno(EBADF); ok = /*failure*/-1; } return ok; } /* * Rewind directory stream such that _wreaddir() returns the very first * file name again. */ static void _wrewinddir(_WDIR* dirp) { if (dirp) { /* Release existing search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose(dirp->handle); } /* Open new search handle */ dirent_first(dirp); } } /* Get first directory entry (internal) */ static WIN32_FIND_DATAW* dirent_first(_WDIR *dirp) { WIN32_FIND_DATAW *datap; /* Open directory and retrieve the first entry */ dirp->handle = FindFirstFileW(dirp->patt, &dirp->data); if (dirp->handle != INVALID_HANDLE_VALUE) { /* a directory entry is now waiting in memory */ datap = &dirp->data; dirp->cached = 1; } else { /* Failed to re-open directory: no directory entry in memory */ dirp->cached = 0; datap = NULL; } return datap; } /* Get next directory entry (internal) */ static WIN32_FIND_DATAW* dirent_next(_WDIR *dirp) { WIN32_FIND_DATAW *p; /* Get next directory entry */ if (dirp->cached != 0) { /* A valid directory entry already in memory */ p = &dirp->data; dirp->cached = 0; } else if (dirp->handle != INVALID_HANDLE_VALUE) { /* Get the next directory entry from stream */ if (FindNextFileW(dirp->handle, &dirp->data) != FALSE) { /* Got a file */ p = &dirp->data; } else { /* The very last entry has been processed or an error occurred */ FindClose(dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; p = NULL; } } else { /* End of directory stream reached */ p = NULL; } return p; } /* * Open directory stream using plain old C-string. */ static DIR* opendir(const char *dirname) { struct DIR *dirp; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno(ENOENT); return NULL; } /* Allocate memory for DIR structure */ dirp = reinterpret_cast(malloc(sizeof(struct DIR))); if (dirp) { wchar_t wname[PATH_MAX + 1]; size_t n; /* Convert directory name to wide-character string */ error = dirent_mbstowcs_s( &n, wname, PATH_MAX + 1, dirname, PATH_MAX); if (!error) { /* Open directory stream using wide-character name */ dirp->wdirp = _wopendir(wname); if (dirp->wdirp) { /* Directory stream opened */ error = 0; } else { /* Failed to open directory stream */ error = 1; } } else { /* * Cannot convert file name to wide-character string. This * occurs if the string contains invalid multi-byte sequences or * the output buffer is too small to contain the resulting * string. */ error = 1; } } else { /* Cannot allocate DIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { free(dirp); dirp = NULL; } return dirp; } /* * Read next directory entry. * * When working with text consoles, please note that file names returned by * readdir() are represented in the default ANSI code page while any output to * console is typically formatted on another code page. Thus, non-ASCII * characters in file names will not usually display correctly on console. The * problem can be fixed in two ways: (1) change the character set of console * to 1252 using chcp utility and use Lucida Console font, or (2) use * _cprintf function when writing to console. The _cprinf() will re-encode * ANSI strings to the console code page so many non-ASCII characters will * display correctly. */ static struct dirent* readdir(DIR *dirp) { WIN32_FIND_DATAW *datap; struct dirent *entp; /* Read next directory entry */ datap = dirent_next(dirp->wdirp); if (datap) { size_t n; int error; /* Attempt to convert file name to multi-byte string */ error = dirent_wcstombs_s( &n, dirp->ent.d_name, MAX_PATH + 1, datap->cFileName, MAX_PATH); /* * If the file name cannot be represented by a multi-byte string, * then attempt to use old 8+3 file name. This allows traditional * Unix-code to access some file names despite of unicode * characters, although file names may seem unfamiliar to the user. * * Be ware that the code below cannot come up with a short file * name unless the file system provides one. At least * VirtualBox shared folders fail to do this. */ if (error && datap->cAlternateFileName[0] != '\0') { error = dirent_wcstombs_s( &n, dirp->ent.d_name, MAX_PATH + 1, datap->cAlternateFileName, sizeof(datap->cAlternateFileName) / sizeof(datap->cAlternateFileName[0])); } if (!error) { DWORD attr; /* Initialize directory entry for return */ entp = &dirp->ent; /* Length of file name excluding zero terminator */ entp->d_namlen = n - 1; /* File attributes */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entp->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entp->d_type = DT_DIR; } else { entp->d_type = DT_REG; } /* Reset dummy fields */ entp->d_ino = 0; entp->d_reclen = sizeof(struct dirent); } else { /* * Cannot convert file name to multi-byte string so construct * an erroneous directory entry and return that. Note that * we cannot return NULL as that would stop the processing * of directory entries completely. */ entp = &dirp->ent; entp->d_name[0] = '?'; entp->d_name[1] = '\0'; entp->d_namlen = 1; entp->d_type = DT_UNKNOWN; entp->d_ino = 0; entp->d_reclen = 0; } } else { /* No more directory entries */ entp = NULL; } return entp; } /* * Close directory stream. */ static int closedir(DIR *dirp) { int ok; if (dirp) { /* Close wide-character directory stream */ ok = _wclosedir(dirp->wdirp); dirp->wdirp = NULL; /* Release multi-byte character version */ free(dirp); } else { /* Invalid directory stream */ dirent_set_errno(EBADF); ok = /*failure*/-1; } return ok; } /* * Rewind directory stream to beginning. */ static void rewinddir( DIR* dirp) { /* Rewind wide-character string directory stream */ _wrewinddir(dirp->wdirp); } /* Convert multi-byte string to wide character string */ static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count) { int error; #if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 or later */ error = mbstowcs_s(pReturnValue, wcstr, sizeInWords, mbstr, count); #else /* Older Visual Studio or non-Microsoft compiler */ size_t n; /* Convert to wide-character string */ n = mbstowcs(wcstr, mbstr, count); if (n < sizeInWords) { /* Zero-terminate output buffer */ if (wcstr) { wcstr[n] = 0; } /* Length of resuting multi-byte string WITH zero terminator */ if (pReturnValue) { *pReturnValue = n + 1; } /* Success */ error = 0; } else { /* Could not convert string */ error = 1; } #endif return error; } /* Convert wide-character string to multi-byte string */ static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count) { int error; #if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 or later */ error = wcstombs_s(pReturnValue, mbstr, sizeInBytes, wcstr, count); #else /* Older Visual Studio or non-Microsoft compiler */ size_t n; /* Convert to multi-byte string */ n = wcstombs(mbstr, wcstr, count); if (n < sizeInBytes) { /* Zero-terminate output buffer */ if (mbstr) { mbstr[n] = '\0'; } /* Length of resulting multi-bytes string WITH zero-terminator */ if (pReturnValue) { *pReturnValue = n + 1; } /* Success */ error = 0; } else { /* Cannot convert string */ error = 1; } #endif return error; } /* Set errno variable */ static void dirent_set_errno(int error) { #if defined(_MSC_VER) /* Microsoft Visual Studio */ _set_errno(error); #else /* Non-Microsoft compiler */ errno = error; #endif } #ifdef __cplusplus } #endif #endif /*DIRENT_H*/ tqsl-2.8.1/src/winstrdefs.h0000644000175000017500000000054715003421124015631 0ustar rmurphyrmurphy/* Copyright (C) 2025 The TrustedQSL Developers */ #ifndef WINSTRDEFS_H #define WINSTRDEFS_H #if defined(_WIN32) || defined(_WIN64) #define snprintf _snprintf #define vsnprintf _vsnprintf #define strcasecmp _stricmp #define strncasecmp _strnicmp #define unlink _unlink #define strdup _strdup #define fileno _fileno #endif #endif//WINSTRDEFS_H tqsl-2.8.1/src/xml.cpp0000644000175000017500000001213115003421124014564 0ustar rmurphyrmurphy/*************************************************************************** xml.cpp - description ------------------- begin : Fri Aug 9 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #define TQSLLIB_DEF #include "xml.h" #include "tqsllib.h" #ifdef _WIN32 #include #endif #include #include #include #include #include #include using std::pair; using std::string; using std::ostream; using std::map; namespace tqsllib { pair XMLElement::getAttribute(const string& key) { string s; XMLElementAttributeList::iterator pos; pos = _attributes.find(key); pair rval; if (pos == _attributes.end()) { rval.second = false; } else { rval.first = pos->second; rval.second = true; } return rval; } void XMLElement::xml_start(void *data, const XML_Char *name, const XML_Char **atts) { XMLElement *el = reinterpret_cast(data); XMLElement *new_el = new XMLElement(name); //cout << "Element: " << name << endl; for (int i = 0; atts[i]; i += 2) { new_el->setAttribute(atts[i], atts[i+1]); } if (el->_parsingStack.empty()) { el->_parsingStack.push_back(el->addElement(new_el)); } else { new_el->setPretext(el->_parsingStack.back()->second->getText()); el->_parsingStack.back()->second->setText(""); el->_parsingStack.push_back(el->_parsingStack.back()->second->addElement(new_el)); } } void XMLElement::xml_end(void *data, const XML_Char *name) { XMLElement *el = reinterpret_cast(data); if (!(el->_parsingStack.empty())) el->_parsingStack.pop_back(); } void XMLElement::xml_text(void *data, const XML_Char *text, int len) { XMLElement *el = reinterpret_cast(data); el->_parsingStack.back()->second->_text.append(text, len); } int XMLElement::parseString(const char *xmlstring) { XML_Parser xp = XML_ParserCreate(0); XML_SetUserData(xp, reinterpret_cast(this)); XML_SetStartElementHandler(xp, &XMLElement::xml_start); XML_SetEndElementHandler(xp, &XMLElement::xml_end); XML_SetCharacterDataHandler(xp, &XMLElement::xml_text); _parsingStack.clear(); // Process the XML if (XML_Parse(xp, xmlstring, strlen(xmlstring), 1) == 0) { XML_ParserFree(xp); strncpy(tQSL_CustomError, xmlstring, 80); tQSL_CustomError[79] = '\0'; return XML_PARSE_SYNTAX_ERROR; } XML_ParserFree(xp); return XML_PARSE_NO_ERROR; } int XMLElement::parseFile(const char *filename) { gzFile in = NULL; #ifdef _WIN32 wchar_t* fn = utf8_to_wchar(filename); int fd = _wopen(fn, _O_RDONLY|_O_BINARY); free_wchar(fn); if (fd != -1) in = gzdopen(fd, "rb"); #else in = gzopen(filename, "rb"); #endif if (!in) return XML_PARSE_SYSTEM_ERROR; // Failed to open file char buf[256]; XML_Parser xp = XML_ParserCreate(0); XML_SetUserData(xp, reinterpret_cast(this)); XML_SetStartElementHandler(xp, &XMLElement::xml_start); XML_SetEndElementHandler(xp, &XMLElement::xml_end); XML_SetCharacterDataHandler(xp, &XMLElement::xml_text); _parsingStack.clear(); int rcount; while ((rcount = gzread(in, buf, sizeof buf)) > 0) { // Process the XML if (XML_Parse(xp, buf, rcount, 0) == 0) { gzclose(in); strncpy(tQSL_CustomError, buf, 80); tQSL_CustomError[79] = '\0'; XML_ParserFree(xp); return XML_PARSE_SYNTAX_ERROR; } } gzclose(in); bool rval = (rcount == 0); if (rval) rval = (XML_Parse(xp, "", 0, 1) != 0); XML_ParserFree(xp); return (rval ? XML_PARSE_NO_ERROR : XML_PARSE_SYNTAX_ERROR); } static struct { char c; const char *ent; } xml_entity_table[] = { { '"', """ }, { '\'', "'" }, { '>', ">" }, { '<', "<" } }; static string xml_entities(const string& s) { string ns = s; string::size_type idx = 0; while ((idx = ns.find('&', idx)) != string::npos) { ns.replace(idx, 1, "&"); idx++; } for (int i = 0; i < static_cast((sizeof xml_entity_table / sizeof xml_entity_table[0])); i++) { while ((idx = ns.find(xml_entity_table[i].c)) != string::npos) ns.replace(idx, 1, xml_entity_table[i].ent); } return ns; } /* Stream out an XMLElement as XML text */ ostream& operator<< (ostream& stream, XMLElement& el) { bool ok; XMLElement subel; if (el.getElementName() != "") { stream << "<" << el.getElementName(); string key, val; bool ok = el.getFirstAttribute(key, val); while (ok) { stream << " " << key << "=\"" << xml_entities(val) << "\""; ok = el.getNextAttribute(key, val); } if (el.getText() == "" && !el.getFirstElement(subel)) { stream << " />"; return stream; } else { stream << ">"; } } ok = el.getFirstElement(subel); while (ok) { string s = subel.getPretext(); if (s != "") stream << xml_entities(s); stream << subel; ok = el.getNextElement(subel); } if (el.getText() != "") stream << xml_entities(el.getText()); if (el.getElementName() != "") stream << ""; return stream; } } // namespace tqsllib tqsl-2.8.1/src/xml.h0000644000175000017500000001417015003421124014236 0ustar rmurphyrmurphy/*************************************************************************** xml.h - description ------------------- begin : Fri Aug 9 2002 copyright : (C) 2002 by ARRL author : Jon Bloom email : jbloom@arrl.org revision : $Id$ ***************************************************************************/ #ifndef __xml_h #define __xml_h #include #include #include #include #include using std::pair; using std::string; using std::ostream; using std::map; using std::multimap; using std::vector; namespace tqsllib { class XMLElement; typedef multimap XMLElementList; typedef map XMLElementAttributeList; /** Encapsulates an XML element * * An XMLElement comprises a name, the enclosed text, an optional set of * attributes, and an optional list of contained elements. * * Having a list of contained elements allows construction of the XML * document tree structure. In most cases, the structure will be populated * by a call to parseFile(). */ class XMLElement { public: XMLElement() : _name(""), _text(""), _pretext("") {} /// Constructor initializes element name explicit XMLElement(const string& name) : _text(""), _pretext("") { _name = name; } /// Clear the element of all data void clear(); /// Set the element name void setElementName(const string& name) { _name = name; } /// Get the element name string getElementName() const { return _name; } /// Set an attribute. /** Attributes are treated as unique key/value pairs. */ void setAttribute(const string& key, const string& value); /// Get an attribute by its key. /** Returns a pair where: * * \li \c getAttribute().first := the attribute's value * \li \c getAttribute().second := a bool, true if the attribute key exists */ pair getAttribute(const string& key); /// Add an element to the list of contained subelements XMLElementList::iterator addElement(XMLElement* element); XMLElementAttributeList& getAttributeList() { return _attributes; } XMLElementList& getElementList() { return _elements; } /// Parse an XML file and add its element tree to this element int parseFile(const char *filename); #define XML_PARSE_NO_ERROR 0 #define XML_PARSE_SYSTEM_ERROR 1 #define XML_PARSE_SYNTAX_ERROR 2 /// Parse an XML string and add its element tree to this element int parseString(const char *xmlstring); /// Get the first attribute of the element /** Provides the attribute key and value. Returns \c false if the * element contains no attributes */ bool getFirstAttribute(string& key, string& attr); /// Get the next attribute of the element /** Should be called only after calling getFirstAttribute and getting * a return value of \c true. * Provides the attribute key and value. Returns \c false if the * element contains no more attributes */ bool getNextAttribute(string& key, string& attr); /// Get the first contained element named \c name. /** Returns \c false if the element contains no elements named \c name */ bool getFirstElement(const string& name, XMLElement&); /// Get the first contained element. /** Returns \c false if the element contains no elements */ bool getFirstElement(XMLElement&); /// Get the next contained element. /** Should be called only after calling getFirstElement and getting * a return value of \c true. If the getFirstElement that takes an * element name was called, getNextElement will return \c false when there * are no more elements of that name in the element list. * * Returns \c false if the element contains no more elements */ bool getNextElement(XMLElement&); /// Set the contained text string void setText(const string& s) { _text = s; } /// Get the contained text string. /** Note that this string comprises the text contained in this * element only, not any text contained in elements on the * element list; they each have their own contained text. */ string getText() const { return _text; } void setPretext(const string& s) { _pretext = s; } string getPretext() const { return _pretext; } private: static void xml_start(void *data, const XML_Char *name, const XML_Char **atts); static void xml_end(void *data, const XML_Char *name); static void xml_text(void *data, const XML_Char *text, int len); string _name, _text, _pretext; XMLElementAttributeList _attributes; XMLElementList _elements; vector _parsingStack; XMLElementList::iterator _iter; bool _iterByName; string _iterName; XMLElementAttributeList::iterator _aiter; }; inline void XMLElement::clear() { _name = _text = _pretext = _iterName = ""; _attributes.clear(); _elements.clear(); _parsingStack.clear(); } inline void XMLElement::setAttribute(const string& key, const string& value) { _attributes[key] = value; } inline XMLElementList::iterator XMLElement::addElement(XMLElement* element) { XMLElementList::iterator it = _elements.insert(make_pair(element->getElementName(), element)); return it; } inline bool XMLElement::getFirstElement(XMLElement& element) { _iterByName = false; _iter = _elements.begin(); return getNextElement(element); } inline bool XMLElement::getFirstElement(const string& name, XMLElement& element) { _iterName = name; _iterByName = true; _iter = _elements.find(_iterName); return getNextElement(element); } inline bool XMLElement::getNextElement(XMLElement& element) { if (_iter == _elements.end()) return false; if (_iterByName && _iter->second->getElementName() != _iterName) return false; element = *_iter->second; ++_iter; return true; } inline bool XMLElement::getFirstAttribute(string& key, string& attr) { _aiter = _attributes.begin(); return getNextAttribute(key, attr); } inline bool XMLElement::getNextAttribute(string& key, string& attr) { if (_aiter == _attributes.end()) return false; key = _aiter->first; attr = _aiter->second; ++_aiter; return true; } ostream& operator<< (ostream& stream, XMLElement& el); } // namespace tqsllib #endif // __xml_h tqsl-2.8.1/toolset-to-vc08.py0000644000175000017500000000120215003421124015727 0ustar rmurphyrmurphyVCXPROJ=".vcxproj" v2012_PLATFORM_TOOLSET="v110" v2008_PLATFORM_TOOLSET="v90" from os import walk, path if __name__=="__main__": count=0 for root, dirs, files in walk("."): for file in files: if file.endswith(VCXPROJ): print "Replacing in", path.join(root, file), "...", with open(path.join(root, file), 'r') as proj: s=proj.read() s=s.replace(v2012_PLATFORM_TOOLSET, v2008_PLATFORM_TOOLSET) with open(path.join(root, file), 'w') as proj: proj.write(s) print "done" count+=1 print "Replaced toolset in", count, "project files"tqsl-2.8.1/win32-msi/0000755000175000017500000000000015003421124014223 5ustar rmurphyrmurphytqsl-2.8.1/win32-msi/tqsl-install/0000755000175000017500000000000015003421124016652 5ustar rmurphyrmurphytqsl-2.8.1/win32-msi/tqsl-install/.gitignore0000644000175000017500000000001215003421124020633 0ustar rmurphyrmurphybin/ obj/ tqsl-2.8.1/win32-msi/tqsl-install/AlertUninstall.wxs0000644000175000017500000000210215003421124022351 0ustar rmurphyrmurphy 1 1 1 tqsl-2.8.1/win32-msi/tqsl-install/MyExitDialog.wxs0000644000175000017500000000730715003421124021763 0ustar rmurphyrmurphy tqsl-2.8.1/win32-msi/tqsl-install/MyInstallDirDlg.wxs0000644000175000017500000000501415003421124022417 0ustar rmurphyrmurphy 1 tqsl-2.8.1/win32-msi/tqsl-install/MyWixUI_InstallDir.wxs0000644000175000017500000001110715003421124023055 0ustar rmurphyrmurphy 1 "1"]]> 1 NOT Installed Installed AND PATCH 1 LicenseAccepted = "1" 1 1 NOT WIXUI_DONTVALIDATEPATH "1"]]> (ISINNOINSTALLED) AND (WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1") (NOT ISINNOINSTALLED) AND (WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1") 1 1 NOT Installed Installed AND NOT PATCH Installed AND PATCH 1 1 1 1 tqsl-2.8.1/win32-msi/tqsl-install/Product.wxs0000644000175000017500000002244215003421124021041 0ustar rmurphyrmurphy NOT Version9X INSTALLDESKTOPSHORTCUT ISINNOINSTALLED NEWERFOUND notepad.exe CLONEXIT AND NOT Installed QSONEXIT AND NOT Installed tqsl-2.8.1/win32-msi/tqsl-install/helpfrag.wxs0000644000175000017500000007606515003421124021223 0ustar rmurphyrmurphy tqsl-2.8.1/win32-msi/tqsl-install/langfrags.wxs0000644000175000017500000002402615003421124021365 0ustar rmurphyrmurphy tqsl-2.8.1/win32-msi/tqsl-install/tqsl-install.sln0000644000175000017500000000151615003421124022022 0ustar rmurphyrmurphy Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "tqsl-install", "tqsl-install.wixproj", "{1DFA6E6B-1725-4FA3-81D7-64D8A82CB824}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1DFA6E6B-1725-4FA3-81D7-64D8A82CB824}.Debug|x86.ActiveCfg = Debug|x86 {1DFA6E6B-1725-4FA3-81D7-64D8A82CB824}.Debug|x86.Build.0 = Debug|x86 {1DFA6E6B-1725-4FA3-81D7-64D8A82CB824}.Release|x86.ActiveCfg = Release|x86 {1DFA6E6B-1725-4FA3-81D7-64D8A82CB824}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal tqsl-2.8.1/win32-msi/tqsl-install/tqsl-install.wixproj0000644000175000017500000000503115003421124022724 0ustar rmurphyrmurphy Debug x86 3.7 1dfa6e6b-1725-4fa3-81d7-64d8a82cb824 2.0 tqsl-2.8 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets bin\$(Configuration)\ obj\$(Configuration)\ Debug -b "..\..\bin\Release" -b "..\..\apps" -b "..\..\src" -b "..\..\src\Release" -b "..\..\apps\Release" bin\$(Configuration)\ obj\$(Configuration)\ -b "..\..\bin\Release" -b "..\..\apps" -b "..\..\src" -b "..\..\src\Release" -b "..\..\..\apps\Release" $(WixExtDir)\WixUIExtension.dll WixUIExtension tqsl-2.8.1/win32-msi/tqsl-install/update-helpfrag.cmd0000644000175000017500000000024415003421124022407 0ustar rmurphyrmurphy"C:\Program Files (x86)\WiX Toolset v3.11\bin\heat.exe" dir ..\..\apps\help -cg "HelpDir" -dr "APPLICATIONFOLDER" -indent 2 -out helpfrag.wxs -var "var.helpSrc" -ag