diff options
Diffstat (limited to 'gnu/packages/radio.scm')
-rw-r--r-- | gnu/packages/radio.scm | 477 |
1 files changed, 379 insertions, 98 deletions
diff --git a/gnu/packages/radio.scm b/gnu/packages/radio.scm index 55756c5e93..afe93081b3 100644 --- a/gnu/packages/radio.scm +++ b/gnu/packages/radio.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org> ;;; Copyright © 2020 Charlie Ritter <chewzerita@posteo.net> ;;; Copyright © 2020, 2021 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2021 João Pedro Simas <jpsimas@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -28,6 +29,7 @@ #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix utils) + #:use-module (gnu packages admin) #:use-module (gnu packages algebra) #:use-module (gnu packages audio) #:use-module (gnu packages autotools) @@ -35,22 +37,31 @@ #:use-module (gnu packages bash) #:use-module (gnu packages boost) #:use-module (gnu packages check) + #:use-module (gnu packages compression) + #:use-module (gnu packages curl) + #:use-module (gnu packages databases) #:use-module (gnu packages documentation) #:use-module (gnu packages engineering) #:use-module (gnu packages fltk) #:use-module (gnu packages gcc) #:use-module (gnu packages gd) + #:use-module (gnu packages geo) #:use-module (gnu packages gettext) #:use-module (gnu packages ghostscript) #:use-module (gnu packages glib) + #:use-module (gnu packages gnome) + #:use-module (gnu packages golang) + #:use-module (gnu packages gps) #:use-module (gnu packages gstreamer) #:use-module (gnu packages gtk) #:use-module (gnu packages image) + #:use-module (gnu packages javascript) #:use-module (gnu packages libusb) #:use-module (gnu packages linux) #:use-module (gnu packages logging) #:use-module (gnu packages lua) #:use-module (gnu packages maths) + #:use-module (gnu packages mp3) #:use-module (gnu packages multiprecision) #:use-module (gnu packages ncurses) #:use-module (gnu packages networking) @@ -62,17 +73,20 @@ #:use-module (gnu packages qt) #:use-module (gnu packages readline) #:use-module (gnu packages ruby) + #:use-module (gnu packages sdl) #:use-module (gnu packages sphinx) #:use-module (gnu packages swig) #:use-module (gnu packages tcl) #:use-module (gnu packages tex) #:use-module (gnu packages texinfo) #:use-module (gnu packages video) + #:use-module (gnu packages xiph) #:use-module (gnu packages xml) #:use-module (gnu packages xorg) #:use-module (guix build-system cmake) #:use-module (guix build-system glib-or-gtk) #:use-module (guix build-system gnu) + #:use-module (guix build-system go) #:use-module (guix build-system python) #:use-module (guix build-system qt)) @@ -279,32 +293,27 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).") (define-public gnuradio (package (name "gnuradio") - (version "3.8.0.0") + (version "3.9.0.0") (source (origin (method url-fetch) (uri (string-append "https://www.gnuradio.org/releases/gnuradio/" "gnuradio-" version ".tar.xz")) (sha256 - (base32 "0aw55gf5549b0fz2qdi7vplcmaf92bj34h40s34b2ycnqasv900r")) - (modules '((guix build utils))) - (snippet - '(begin - ;; Delete bundled volk to use the shared one. - (delete-file-recursively "volk") - #t)))) + (base32 "1jvm9xd0l2pz1fww4zii6hl7ccnvy256nrf70ljb594n7j9j49ha")))) (build-system cmake-build-system) (native-inputs `(("doxygen" ,doxygen) ("ghostscript" ,ghostscript) + ("js-mathjax" ,js-mathjax) ("orc" ,orc) ("pkg-config" ,pkg-config) + ("pybind11" ,pybind11) ("python-cheetah" ,python-cheetah) ("python-mako" ,python-mako) ("python-pyzmq" ,python-pyzmq) ("python-scipy" ,python-scipy) ("python-sphinx" ,python-sphinx) - ("swig" ,swig) ("texlive" ,(texlive-union (list texlive-amsfonts texlive-latex-amsmath ;; TODO: Add newunicodechar. @@ -322,6 +331,7 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).") ("gsm" ,gsm) ("gtk+" ,gtk+) ("jack" ,jack-1) + ("libsndfile" ,libsndfile) ("log4cpp" ,log4cpp) ("pango" ,pango) ("portaudio" ,portaudio) @@ -336,6 +346,7 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).") ("python-pyyaml" ,python-pyyaml) ("qtbase" ,qtbase) ("qwt" ,qwt) + ("sdl" ,sdl) ("volk" ,volk) ("zeromq" ,zeromq))) (arguments @@ -348,7 +359,9 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).") (guix build glib-or-gtk-build-system) (guix build python-build-system)) #:configure-flags - '("-DENABLE_INTERNAL_VOLK=OFF") + (list (string-append "-DMATHJAX2_ROOT=" + (assoc-ref %build-inputs "js-mathjax") + "/share/javascript/mathjax")) #:phases (modify-phases %standard-phases (add-after 'unpack 'fix-paths @@ -364,8 +377,7 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).") (substitute* "cmake/Modules/GrPython.cmake" (("dist-packages") "site-packages")) - (substitute* '("gr-vocoder/swig/vocoder_swig.i" - "gr-vocoder/include/gnuradio/vocoder/codec2.h" + (substitute* '("gr-vocoder/include/gnuradio/vocoder/codec2.h" "gr-vocoder/include/gnuradio/vocoder/freedv_api.h") (("<codec2/") "<")) @@ -377,6 +389,19 @@ used by RDS Spy, and audio files containing @dfn{multiplex} signals (MPX).") "/bin/Xvfb :1 &")) (setenv "DISPLAY" ":1") #t)) + (replace 'check + (lambda* (#:key tests? parallel-tests? #:allow-other-keys) + (invoke "ctest" "-j" (if parallel-tests? + (number->string (parallel-job-count)) + "1") + "--output-on-failure" + ;;disable broken tests + "-E" (string-join + '(;; https://github.com/gnuradio/gnuradio/issues/3871 + "qa_header_payload_demux" + ;; https://github.com/gnuradio/gnuradio/issues/4348 + "qa_packet_headerparser_b") + "|")))) (add-after 'install 'wrap-python (assoc-ref python:%standard-phases 'wrap)) (add-after 'wrap-python 'wrap-glib-or-gtk @@ -417,40 +442,44 @@ environment.") (license license:gpl3+))) (define-public gnuradio-osmosdr - (package - (name "gnuradio-osmosdr") - (version "0.2.2") - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://git.osmocom.org/gr-osmosdr") - (commit (string-append "v" version)))) - (file-name (git-file-name name version)) - (sha256 - (base32 "1aqj5cylipmmjh1x1kb2j8262hxq6mi86dgb2zphj94wvsab2ghx")))) - (build-system cmake-build-system) - (native-inputs - `(("doxygen" ,doxygen) - ("pkg-config" ,pkg-config) - ("python" ,python) - ("python-mako" ,python-mako) - ("python-six" ,python-six) - ("swig" ,swig))) - (inputs - `(("boost" ,boost) - ("fftwf" ,fftwf) - ("gmp" ,gmp) - ("gnuradio" ,gnuradio) - ("hackrf" ,hackrf) - ("log4cpp" ,log4cpp) - ("rtl-sdr" ,rtl-sdr) - ("volk" ,volk))) - (synopsis "GNU Radio block for interfacing with various radio hardware") - (description "This is a block for GNU Radio allowing to use a common API + ;; No tag for version supporting Gnuradio 3.9; use commit. + (let ((commit "a100eb024c0210b95e4738b6efd836d48225bd03") + (revision "0")) + (package + (name "gnuradio-osmosdr") + (version (git-version "0.2.3" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://git.osmocom.org/gr-osmosdr") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1pk5gnyznfyy510lbqzg9ijcb1fnhmn547n24aiqyrxd6i6vv1ki")))) + (build-system cmake-build-system) + (native-inputs + `(("doxygen" ,doxygen) + ("pkg-config" ,pkg-config) + ("pybind11" ,pybind11) + ("python" ,python) + ("python-mako" ,python-mako) + ("python-six" ,python-six))) + (inputs + `(("boost" ,boost) + ("fftwf" ,fftwf) + ("gmp" ,gmp) + ("gnuradio" ,gnuradio) + ("hackrf" ,hackrf) + ("libsndfile" ,libsndfile) + ("log4cpp" ,log4cpp) + ("rtl-sdr" ,rtl-sdr) + ("volk" ,volk))) + (synopsis "GNU Radio block for interfacing with various radio hardware") + (description "This is a block for GNU Radio allowing to use a common API to access different radio hardware.") - (home-page "https://osmocom.org/projects/gr-osmosdr/wiki/GrOsmoSDR") - (license license:gpl3+))) + (home-page "https://osmocom.org/projects/gr-osmosdr/wiki/GrOsmoSDR") + (license license:gpl3+)))) (define-public libosmo-dsp (package @@ -497,36 +526,39 @@ primitives for SDR (Software Defined Radio).") (license license:gpl2+))) (define-public gnuradio-iqbalance - (package - (name "gnuradio-iqbalance") - (version "0.38.1") - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://git.osmocom.org/gr-iqbal") - (commit (string-append "v" version)))) - (file-name (git-file-name name version)) - (sha256 - (base32 "0ksagwz05p3b0702q7ljq7013xmp0ijp30my9z6s3p7ja8dj42s3")))) - (build-system cmake-build-system) - (native-inputs - `(("doxygen" ,doxygen) - ("pkg-config" ,pkg-config) - ("python" ,python) - ("python-numpy" ,python-numpy) - ("python-six" ,python-six) - ("swig" ,swig))) - (inputs - `(("boost" ,boost) - ("fftwf" ,fftwf) - ("gmp" ,gmp) - ("gnuradio" ,gnuradio) - ("libosmo-dsp" ,libosmo-dsp) - ("log4cpp" ,log4cpp) - ("volk" ,volk))) - (synopsis "GNU Radio block to correct IQ imbalance") - (description + ;; No tag for version supporting Gnuradio 3.9; use commit. + (let ((commit "fbee239a6fb36dd2fb564f6e6a0d393c4bc844db") + (revision "0")) + (package + (name "gnuradio-iqbalance") + (version (git-version "0.38.2" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://git.osmocom.org/gr-iqbal") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "12p193ngcs65nd3lynry119nhv40mikamqkw37wdln7lawx3nw7p")))) + (build-system cmake-build-system) + (native-inputs + `(("doxygen" ,doxygen) + ("pkg-config" ,pkg-config) + ("pybind11" ,pybind11) + ("python" ,python) + ("python-numpy" ,python-numpy) + ("python-six" ,python-six))) + (inputs + `(("boost" ,boost) + ("fftwf" ,fftwf) + ("gmp" ,gmp) + ("gnuradio" ,gnuradio) + ("libosmo-dsp" ,libosmo-dsp) + ("log4cpp" ,log4cpp) + ("volk" ,volk))) + (synopsis "GNU Radio block to correct IQ imbalance") + (description "This is a GNU Radio block to correct IQ imbalance in quadrature receivers. It's composed of two main block: @itemize @@ -534,8 +566,8 @@ receivers. It's composed of two main block: @item Optimize: Attempts to auto-detect the phase and amplitude error to feed to the fix block above. @end itemize") - (home-page "https://git.osmocom.org/gr-iqbal/") - (license license:gpl3+))) + (home-page "https://git.osmocom.org/gr-iqbal/") + (license license:gpl3+)))) (define-public gqrx (package @@ -562,6 +594,7 @@ to the fix block above. ("gnuradio-iqbalance" ,gnuradio-iqbalance) ("gnuradio-osmosdr" ,gnuradio-osmosdr) ("jack" ,jack-1) + ("libsndfile" ,libsndfile) ("log4cpp" ,log4cpp) ("portaudio" ,portaudio) ("pulseaudio" ,pulseaudio) @@ -773,7 +806,7 @@ you must extend 'udev-service-type' with this package. E.g.: (define-public hamlib (package (name "hamlib") - (version "3.3") + (version "4.1") (source (origin (method url-fetch) @@ -781,7 +814,7 @@ you must extend 'udev-service-type' with this package. E.g.: "https://github.com/Hamlib/Hamlib/releases/download/" version "/hamlib-" version ".tar.gz")) (sha256 - (base32 "10788mgrhbc57zpzakcxv5aqnr2819pcshml6fbh8zvnkja562y9")))) + (base32 "0hi3nc1k55mxff05amdv5iwryaz6r3205l24q0bg7l84f53bkm5l")))) (build-system gnu-build-system) (native-inputs `(("doxygen" ,doxygen) @@ -815,7 +848,7 @@ users.") (package (inherit hamlib) (name "wsjtx-hamlib") - (version "2.2.2") + (version "2.3.1") (source (origin (method git-fetch) @@ -824,7 +857,7 @@ users.") (commit (string-append "wsjtx-" version)))) (file-name (git-file-name name version)) (sha256 - (base32 "01h5ps0yq5vi1x9rkw742gx6a5fj02zhbpi89i412qdfbnyk35cv")))) + (base32 "0m4yzjcqs7a1w4lghyyckpkiy96jxdjijddxarqr3a37cl2rz23j")))) (native-inputs `(("autoconf" ,autoconf) ("automake" ,automake) @@ -836,20 +869,12 @@ users.") "--with-lua-binding" "--with-python-binding" "--with-tcl-binding" - "--with-xml-support") - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'fix-tests - (lambda _ - (substitute* "tests/testloc.c" - (("dmmm2dec\\(deg, mmm, nesw\\);") - "dmmm2dec(deg, mmm, 0, nesw);")) - #t))))))) + "--with-xml-support"))))) (define-public wsjtx (package (name "wsjtx") - (version "2.2.2") + (version "2.3.1") (source (origin (method git-fetch) @@ -858,13 +883,7 @@ users.") (commit (string-append "wsjtx-" version)))) (file-name (git-file-name name version)) (sha256 - (base32 "0fhws44gg05d9y2al0pcdnxwxwh4bazcfl0g5mq2ks1r7w23wi5x")) - (modules '((guix build utils))) - (snippet - '(begin - ;; Delete bundled boost to use the shared one. - (delete-file-recursively "boost") - #t)))) + (base32 "0mdr4l7zii08615yn7z91spnvnqm5i9390bra9lz3aqyxrsiim91")))) (build-system qt-build-system) (native-inputs `(("asciidoc" ,asciidoc) @@ -1246,3 +1265,265 @@ It can perform as: @item APRStt gateway @end itemize\n") (license license:gpl2+))) + +(define-public aldo + (package + (name "aldo") + (version "0.7.7") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://savannah/aldo/aldo-" version ".tar.bz2")) + (sha256 + (base32 "14lzgldqzbbzydsy1cai3wln3hpyj1yhj8ji3wygyzr616fq9f7i")))) + (build-system gnu-build-system) + (inputs + `(("ao" ,ao))) + (home-page "https://www.nongnu.org/aldo/") + (synopsis "Morse code tutor") + (description + "Aldo is a morse code learning tool providing four type of training +methods: + +@itemize +@item Classic exercice, +@item Koch method, +@item Read from file, +@item Callsign exercice. +@end itemize\n") + (license license:gpl3+))) + +(define-public unixcw + (package + (name "unixcw") + (version "3.6.0") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/unixcw/unixcw-" + version ".tar.gz")) + (sha256 + (base32 "15wriwv91583kmmyijbzam3dpclzmg4qjyfzjv5f75x9b0gqabxm")))) + (build-system gnu-build-system) + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("alsa-lib" ,alsa-lib) + ("ncurses" ,ncurses) + ("pulseaudio" ,pulseaudio) + ("qtbase" ,qtbase))) + (arguments + `(#:configure-flags '("--disable-static") + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-paths + (lambda* (#:key inputs #:allow-other-keys) + (substitute* '("configure" + "src/config.h.in" + "src/cwcp/Makefile.am" + "src/cwcp/Makefile.in") + (("-lcurses") + "-lncurses")) + (substitute* "src/libcw/libcw_pa.c" + (("libpulse-simple.so" all) + (string-append (assoc-ref inputs "pulseaudio") + "/lib/" all)))))))) + (home-page "http://unixcw.sourceforge.net/") + (synopsis "Morse code library and programs") + (description + "@code{unixcw} is a project providing the libcw library and a set of +programs using the library: cw, cwgen, cwcp and xcwcp. The programs are +intended for people who want to learn receiving and sending morse code.") + (license license:gpl2+))) + +(define-public gnuais + (package + (name "gnuais") + (version "0.3.3") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/rubund/gnuais") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1rik5fdfslszdn3yvj769jzmnv9pirzf76ki33bjjzk7nkabbnlm")))) + (build-system cmake-build-system) + (native-inputs + `(("mariadb-dev" ,mariadb "dev") + ("pkg-config" ,pkg-config))) + (inputs + `(("alsa-lib" ,alsa-lib) + ("curl" ,curl) + ("gtk+" ,gtk+) + ("libsoup" ,libsoup-minimal) + ("mariadb-lib" ,mariadb "lib") + ("osm-gps-map" ,osm-gps-map) + ("pulseaudio" ,pulseaudio))) + (arguments + `(#:tests? #f ; No test suite + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-paths + (lambda* (#:key outputs #:allow-other-keys) + (substitute* "src/cfgfile.c" + (("/usr/share/") + (string-append (assoc-ref outputs "out") "/share/")))))))) + (home-page "http://gnuais.sourceforge.net/") + (synopsis "AIS message demodulator and decoder") + (description + "This program contains algorithms to demodulate and decode AIS (Automatic +Identification System) messages sent by ships and coast stations.") + (license license:gpl2+))) + +(define-public kappanhang + (package + (name "kappanhang") + (version "1.3") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/nonoo/kappanhang") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1ycy8avq5s7zspfi0d9klqcwwkpmcaz742cigd7pmcnbbhspcicp")))) + (build-system go-build-system) + (arguments + '(#:import-path "github.com/nonoo/kappanhang" + #:install-source? #f)) + (inputs + `(("go-github-com-akosmarton-papipes",go-github-com-akosmarton-papipes) + ("go-github-com-fatih-color" ,go-github-com-fatih-color) + ("go-github-com-google-goterm" ,go-github-com-google-goterm) + ("go-github-com-mattn-go-isatty" ,go-github-com-mattn-go-isatty) + ("go-github-com-mesilliac-pulse-simple" + ,go-github-com-mesilliac-pulse-simple) + ("go-github-com-pborman-getopt" ,go-github-com-pborman-getopt) + ("go-go-uber-org-multierr" ,go-go-uber-org-multierr) + ("go-go-uber-org-zap" ,go-go-uber-org-zap))) + (home-page "https://github.com/nonoo/kappanhang") + (synopsis "Client for Icom RS-BA1 server") + (description + "Kappanhang remotely opens audio channels and a serial port to an Icom +RS-BA1 server. The application is mainly developed for connecting to the Icom +IC-705 transceiver, which has built-in WiFi and RS-BA1 server. + +Compatible hardware/software: +@itemize +@item Icom RS-BA1 server software, +@item Icom IC-705 +@item Icom IC-9700 +@end itemize\n") + (license license:expat))) + +(define-public dream + (package + (name "dream") + (version "2.1.1") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/drm/dream/" version + "/dream-" version "-svn808.tar.gz")) + (sha256 + (base32 "01dv6gvljz64zrjbr08mybr9aicvpq2c6qskww46lngdjyhk8xs1")))) + (build-system qt-build-system) + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("faad2" ,faad2) + ("fftw" ,fftw) + ("libsndfile" ,libsndfile) + ("libpcap" ,libpcap) + ("opus" ,opus) + ("pulseaudio" ,pulseaudio) + ("qtbase" ,qtbase) + ("qtsvg" ,qtsvg) + ("qtwebkit" ,qtwebkit) + ("qwt" ,qwt) + ("speexdsp" ,speexdsp) + ("zlib" ,zlib))) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-paths + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "dream.pro" + (("target\\.path = /usr/bin") + (string-append "target.path = " + (assoc-ref outputs "out") "/bin")) + (("documentation\\.path = /usr/share/man/man1") + (string-append "documentation.path = " + (assoc-ref outputs "out") + "/share/man/man1")) + (("/usr/include/pulse/") + (string-append (assoc-ref inputs "pulseaudio") + "/include/pulse/")) + (("/usr/include/sndfile\\.h") + (string-append (assoc-ref inputs "libsndfile") + "/include/sndfile.h")) + (("/usr/include/opus/") + (string-append (assoc-ref inputs "opus") + "/include/opus/")) + (("/usr/include/speex/") + (string-append (assoc-ref inputs "speexdsp") + "/include/speex/")) + (("/usr/include/qwt/") + (string-append (assoc-ref inputs "qwt") + "/include/qwt/")) + (("\\$\\$OUT_PWD/include/neaacdec\\.h") + (string-append (assoc-ref inputs "faad2") + "/include/neaacdec.h"))))) + (replace 'configure + (lambda _ + (invoke "qmake")))))) + (home-page "https://sourceforge.net/projects/drm/") + (synopsis "Digital Radio Mondiale receiver") + (description + "Dream is a software implementation of a Digital Radio Mondiale (DRM) +receiver.") + (license license:gpl2+))) + +(define-public welle-io + (package + (name "welle-io") + (version "2.2") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/albrechtl/welle.io") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "04fpm6sc431dl9i5h53xpd6k85j22sv8aawl7b6wv2fzpfsd9fwa")))) + (build-system qt-build-system) + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("alsa-lib" ,alsa-lib) + ("faad2" ,faad2) + ("fftwf" ,fftwf) + ("lame" ,lame) + ("libusb" ,libusb) + ("mpg123" ,mpg123) + ("rtl-sdr" ,rtl-sdr) + ("qtbase" ,qtbase) + ("qtcharts" ,qtcharts) + ("qtdeclarative" ,qtdeclarative) + ("qtgraphicaleffects" ,qtgraphicaleffects) + ("qtmultimedia" ,qtmultimedia) + ("qtquickcontrols2" ,qtquickcontrols2))) + (arguments + `(#:configure-flags '("-DRTLSDR=ON") + #:tests? #f)) + (home-page "https://www.welle.io/") + (synopsis "DAB and DAB+ software radio") + (description + "@code{welle.io} is a Digital Audio Broadcasting (DAB and DAB+) software +defined radio with support for rtl-sdr.") + (license license:gpl2+))) |