Kludge decoder to dump voice as text files suitable for later decoding.

git-svn-id: http://op25.osmocom.org/svn/trunk@141 65a5c917-d112-43f1-993d-58c26a4786be
This commit is contained in:
stevie 2009-05-05 05:59:19 +00:00
parent 1a96ea1b00
commit 64202f54df
16 changed files with 3970 additions and 47 deletions

View File

@ -1 +1,3 @@
Max <>
Mike Ossman <>
Steve Glass <stevie@sedition.org.au> Steve Glass <stevie@sedition.org.au>

View File

@ -1,8 +1,8 @@
Installation Instructions Installation Instructions
************************* *************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
Software Foundation, Inc. 2006, 2007 Free Software Foundation, Inc.
This file is free documentation; the Free Software Foundation gives This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it. unlimited permission to copy, distribute and modify it.
@ -10,7 +10,10 @@ unlimited permission to copy, distribute and modify it.
Basic Installation Basic Installation
================== ==================
These are generic installation instructions. Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package.
The `configure' shell script attempts to guess correct values for The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses various system-dependent variables used during compilation. It uses
@ -23,9 +26,9 @@ debugging `configure').
It can also use an optional file (typically called `config.cache' It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. (Caching is the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale disabled by default to prevent problems with accidental use of stale
cache files.) cache files.
If you need to do unusual things to compile the package, please try If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail to figure out how `configure' could check whether to do them, and mail
@ -35,20 +38,17 @@ some point `config.cache' contains results you don't want to keep, you
may remove or edit it. may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You only need `configure' by a program called `autoconf'. You need `configure.ac' if
`configure.ac' if you want to change it or regenerate `configure' using you want to change it or regenerate `configure' using a newer version
a newer version of `autoconf'. of `autoconf'.
The simplest way to compile this package is: The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type 1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're `./configure' to configure the package for your system.
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some Running `configure' might take a while. While running, it prints
messages telling which features it is checking for. some messages telling which features it is checking for.
2. Type `make' to compile the package. 2. Type `make' to compile the package.
@ -67,6 +67,9 @@ The simplest way to compile this package is:
all sorts of other programs in order to regenerate files that came all sorts of other programs in order to regenerate files that came
with the distribution. with the distribution.
6. Often, you can also type `make uninstall' to remove the installed
files again.
Compilers and Options Compilers and Options
===================== =====================
@ -78,7 +81,7 @@ details on some of the pertinent environment variables.
by setting variables in the command line or in the environment. Here by setting variables in the command line or in the environment. Here
is an example: is an example:
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details. *Note Defining Variables::, for more details.
@ -87,17 +90,15 @@ Compiling For Multiple Architectures
You can compile the package for more than one kind of computer at the You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that own directory. To do this, you can use GNU `make'. `cd' to the
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'. source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not support the `VPATH' With a non-GNU `make', it is safer to compile the package for one
variable, you have to compile the package for one architecture at a architecture at a time in the source code directory. After you have
time in the source code directory. After you have installed the installed the package for one architecture, use `make distclean' before
package for one architecture, use `make distclean' before reconfiguring reconfiguring for another architecture.
for another architecture.
Installation Names Installation Names
================== ==================
@ -190,12 +191,12 @@ them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc ./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script). Here is a another example: overridden in the site shell script).
/bin/bash ./configure CONFIG_SHELL=/bin/bash Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf bug. Until the bug is fixed you can use this workaround:
Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
configuration-related scripts to be executed by `/bin/bash'.
`configure' Invocation `configure' Invocation
====================== ======================

View File

@ -68,10 +68,12 @@ _op25_la_SOURCES = \
tdu.cc \ tdu.cc \
imbe_decoder.cc \ imbe_decoder.cc \
dummy_imbe_decoder.cc \ dummy_imbe_decoder.cc \
offline_imbe_decoder.cc \
voice_data_unit.cc \ voice_data_unit.cc \
op25.cc \ op25.cc \
op25_decoder_ff.cc \ op25_decoder_ff.cc \
vc55_imbe_decoder.cc vc55_imbe_decoder.cc \
value_string.cc
# magic flags # magic flags

View File

@ -26,6 +26,8 @@
#include <algorithm> #include <algorithm>
#include <cstring> #include <cstring>
#include <functional> #include <functional>
#include <iomanip>
#include <iostream>
#include <stdexcept> #include <stdexcept>
#include <sstream> #include <sstream>
#include <utility> #include <utility>
@ -97,6 +99,17 @@ abstract_data_unit::snapshot() const
return empty; return empty;
} }
void
abstract_data_unit::dump(ostream& os) const
{
uint32_t nbits = d_frame_body.size();
os << setw(4) << nbits << " ";
for(size_t i = 48; i < nbits; ++i) {
os << (d_frame_body[i] ? "#" : "-");
}
os << endl;
}
abstract_data_unit::abstract_data_unit(const_bit_queue& frame_body) : abstract_data_unit::abstract_data_unit(const_bit_queue& frame_body) :
d_frame_body(frame_body.size()) d_frame_body(frame_body.size())
{ {
@ -117,7 +130,13 @@ abstract_data_unit::decode_audio(const_bit_vector& frame_body, imbe_decoder& imb
size_t size_t
abstract_data_unit::decode_body(const_bit_vector& frame_body, size_t msg_sz, uint8_t *msg) abstract_data_unit::decode_body(const_bit_vector& frame_body, size_t msg_sz, uint8_t *msg)
{ {
return extract(frame_body, 0, frame_body.size(), msg); return extract(frame_body, 0, static_cast<int>(frame_body.size()), msg);
}
const_bit_vector&
abstract_data_unit::frame_body() const
{
return d_frame_body;
} }
uint16_t uint16_t

View File

@ -89,6 +89,13 @@ public:
*/ */
virtual std::string snapshot() const; virtual std::string snapshot() const;
/**
* Dump this data unit in human readable format to stream s.
*
* \param s The stream to write on
*/
virtual void dump(std::ostream& os) const;
protected: protected:
/** /**
@ -133,6 +140,11 @@ protected:
*/ */
virtual std::string duid_str() const = 0; virtual std::string duid_str() const = 0;
/**
* Return a reference to the frame body.
*/
const_bit_vector& frame_body() const;
/** /**
* Returns the expected size (in bits) of this data_unit. For * Returns the expected size (in bits) of this data_unit. For
* variable-length data this should return UINT16_MAX until the * variable-length data this should return UINT16_MAX until the

View File

@ -27,6 +27,7 @@
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <deque> #include <deque>
#include <iosfwd>
#include <imbe_decoder.h> #include <imbe_decoder.h>
#include <stdint.h> #include <stdint.h>
#include <swab.h> #include <swab.h>
@ -110,6 +111,13 @@ public:
*/ */
virtual std::string snapshot() const = 0; virtual std::string snapshot() const = 0;
/**
* Dump this data unit in human readable format to stream s.
*
* \param s The stream to write on
*/
virtual void dump(std::ostream& os) const = 0;
protected: protected:
/** /**

View File

@ -22,10 +22,14 @@
*/ */
#include <hdu.h> #include <hdu.h>
#include <iomanip>
#include <itpp/comm/egolay.h> #include <itpp/comm/egolay.h>
#include <itpp/comm/reedsolomon.h> #include <itpp/comm/reedsolomon.h>
#include <sstream>
#include <swab.h>
#include <value_string.h>
using std::string; using namespace std;
hdu::hdu(const_bit_queue& frame_body) : hdu::hdu(const_bit_queue& frame_body) :
abstract_data_unit(frame_body) abstract_data_unit(frame_body)
@ -45,8 +49,60 @@ hdu::duid_str() const
std::string std::string
hdu::snapshot() const hdu::snapshot() const
{ {
string empty; ostringstream os;
return empty; os << "(dp0" << endl;
// DUID
os << "S'duid'" << endl;
os << "p1" << endl;
os << "S'" << duid_str() << "'" << endl;
os << "p2" << endl;
// NAC
os << "S'nac'" << endl;
os << "p3" << endl;
os << "S'" << nac_str() << "'" << endl;
os << "p4" << endl;
// Source
os << "S'source'" << endl;
os << "p5" << endl;
os << "S''" << endl;
os << "p6" << endl;
// Dest
os << "S'dest'" << endl;
os << "p7" << endl;
os << "S''" << endl;
os << "p8" << endl;
// NID
os << "S'nid'" << endl;
os << "p9" << endl;
os << "S''" << endl;
os << "p10" << endl;
// MFID
os << "S'mfid'" << endl;
os << "p11" << endl;
os << "S'" << mfid_str() << "'" << endl;
os << "p12" << endl;
// ALGID
os << "S'algid'" << endl;
os << "p13" << endl;
os << "S'" << algid_str() << "'" << endl;
os << "p14" << endl;
// KID
os << "S'kid'" << endl;
os << "p15" << endl;
os << "S''" << endl;
os << "p16" << endl;
// MI
os << "S'mi'" << endl;
os << "p17" << endl;
os << "S'" << mi_str() << "'" << endl;
os << "p18" << endl;
// TGID
os << "S'tgid'" << endl;
os << "p19" << endl;
os << "S''" << endl;
os << "p20" << endl;
os << "s.";
return os.str();
} }
void void
@ -59,9 +115,10 @@ hdu::correct_errors(bit_vector& frame)
void void
hdu::apply_golay_correction(bit_vector& frame) hdu::apply_golay_correction(bit_vector& frame)
{ {
#if 0
static itpp::Extended_Golay golay; static itpp::Extended_Golay golay;
static const size_t nof_golay_codewords = 36, golay_codeword_sz = 18; static const size_t NOF_GOLAY_CODEWORDS = 36, GOLAY_CODEWORD_SZ = 18;
static const size_t golay_codewords[nof_golay_codewords][golay_codeword_sz] = { static const size_t GOLAY_CODEWORDS[nof_golay_codewords][golay_codeword_sz] = {
{ 119, 118, 117, 116, 115, 114, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120 }, { 119, 118, 117, 116, 115, 114, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120 },
{ 137, 136, 135, 134, 133, 132, 151, 150, 149, 148, 147, 146, 145, 144, 141, 140, 139, 138 }, { 137, 136, 135, 134, 133, 132, 151, 150, 149, 148, 147, 146, 145, 144, 141, 140, 139, 138 },
{ 157, 156, 155, 154, 153, 152, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158 }, { 157, 156, 155, 154, 153, 152, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158 },
@ -100,17 +157,18 @@ hdu::apply_golay_correction(bit_vector& frame)
{ 767, 766, 765, 764, 763, 762, 779, 778, 777, 776, 775, 774, 773, 772, 771, 770, 769, 768 } { 767, 766, 765, 764, 763, 762, 779, 778, 777, 776, 775, 774, 773, 772, 771, 770, 769, 768 }
}; };
for(size_t i = 0; i < nof_golay_codewords; ++i) { for(size_t i = 0; i < NOF_GOLAY_CODEWORDS; ++i) {
// ToDo: // ToDo:
} }
#endif
} }
void void
hdu::apply_rs_correction(bit_vector& frame) hdu::apply_rs_correction(bit_vector& frame)
{ {
#if 0
static itpp::Reed_Solomon rs(6, 8, true); static itpp::Reed_Solomon rs(6, 8, true);
#if 0
const size_t rs_codeword[][6] = { const size_t rs_codeword[][6] = {
}; };
const size_t nof_codeword_bits = sizeof(codeword_bits) / sizeof(codeword_bits[0]); const size_t nof_codeword_bits = sizeof(codeword_bits) / sizeof(codeword_bits[0]);
@ -123,3 +181,62 @@ hdu::frame_size_max() const
{ {
return 792; return 792;
} }
string
hdu::algid_str() const
{
const size_t ALGID_BITS[] = {
356, 357, 360, 361, 374, 375, 376, 377
};
const size_t ALGID_BITS_SZ = sizeof(ALGID_BITS) / sizeof(ALGID_BITS[0]);
uint8_t algid = extract(frame_body(), ALGID_BITS, ALGID_BITS_SZ);
return lookup(algid, ALGIDS, ALGIDS_SZ);
}
std::string
hdu::mi_str() const
{
const size_t MI_BITS[] = {
114, 115, 116, 117, 118, 119, 132, 133,
134, 135, 136, 137, 152, 153, 154, 155,
156, 157, 170, 171, 172, 173, 174, 175,
188, 189, 190, 191, 192, 193, 206, 207,
208, 209, 210, 211, 226, 227, 228, 229,
230, 231, 244, 245, 246, 247, 248, 249,
262, 263, 264, 265, 266, 267, 280, 281,
282, 283, 284, 285, 300, 301, 302, 303,
304, 305, 318, 319, 320, 321, 322, 323,
};
const size_t MI_BITS_SZ = sizeof(MI_BITS) / sizeof(MI_BITS[0]);
uint8_t mi[9];
extract(frame_body(), MI_BITS, MI_BITS_SZ, mi);
ostringstream os;
for(size_t i = 0; i < (sizeof(mi) / sizeof(mi[0])); ++i) {
uint16_t octet = mi[i];
os << hex << setfill('0') << setw(2) << octet;
}
return os.str();
}
string
hdu::mfid_str() const
{
const size_t MFID_BITS[] = {
336, 337, 338, 339, 340, 341, 354, 355,
};
const size_t MFID_BITS_SZ = sizeof(MFID_BITS) / sizeof(MFID_BITS_SZ);
uint8_t mfid = extract(frame_body(), MFID_BITS, MFID_BITS_SZ);
return lookup(mfid, MFIDS, MFIDS_SZ);
}
string
hdu::nac_str() const
{
const size_t NAC_BITS[] = {
48,49,50,51,52,53,54,55,56,57,58,59
};
const size_t NAC_BITS_SZ = sizeof(NAC_BITS) / sizeof(NAC_BITS[0]);
uint32_t nac = extract(frame_body(), NAC_BITS, NAC_BITS_SZ);
return lookup(nac, NACS, NACS_SZ);
}

View File

@ -96,6 +96,36 @@ protected:
*/ */
virtual uint16_t frame_size_max() const; virtual uint16_t frame_size_max() const;
private:
/**
* Return a string describing the encryption algorithm ID (ALGID).
*
* \return A string identifying the ALGID.
*/
std::string algid_str() const;
/**
* Returns a string describing the manufacturer ID (MFID).
*
* \return A string identifying the MFID
*/
virtual std::string mfid_str() const;
/**
* Returns a string describing the message indicator (MI).
*
* \return A string identifying the MI
*/
virtual std::string mi_str() const;
/**
* Returns a string describing the Network Access Code (NAC).
*
* \return A string identifying the NAC.
*/
virtual std::string nac_str() const;
}; };
#endif /* INCLUDED_HDU_H */ #endif /* INCLUDED_HDU_H */

View File

@ -1,12 +1,15 @@
#include <dummy_imbe_decoder.h> #include <dummy_imbe_decoder.h>
#include <imbe_decoder.h> #include <imbe_decoder.h>
#include <vc55_imbe_decoder.h> // #include <dummy_imbe_decoder.h>
#include <offline_imbe_decoder.h>
// #include <vc55_imbe_decoder.h>
imbe_decoder_sptr imbe_decoder_sptr
imbe_decoder::make_imbe_decoder() imbe_decoder::make_imbe_decoder()
{ {
// return imbe_decoder_sptr(new vc55_imbe_decoder());
return imbe_decoder_sptr(new dummy_imbe_decoder()); return imbe_decoder_sptr(new dummy_imbe_decoder());
// return imbe_decoder_sptr(new offline_imbe_decoder());
// return imbe_decoder_sptr(new vc55_imbe_decoder());
} }
imbe_decoder::~imbe_decoder() imbe_decoder::~imbe_decoder()

View File

@ -26,6 +26,7 @@
#endif #endif
#include <algorithm> #include <algorithm>
#include <fstream>
#include <gr_io_signature.h> #include <gr_io_signature.h>
#include <gr_message.h> #include <gr_message.h>
#include <iostream> #include <iostream>
@ -109,6 +110,7 @@ op25_decoder_ff::op25_decoder_ff(gr_msg_queue_sptr msgq) :
d_data_units(0), d_data_units(0),
d_frame_hdr(), d_frame_hdr(),
d_imbe(imbe_decoder::make_imbe_decoder()), d_imbe(imbe_decoder::make_imbe_decoder()),
d_logfile(new ofstream("P25DEMOD.OUT")),
d_tap(-1), d_tap(-1),
d_tap_device("not available"), d_tap_device("not available"),
d_unrecognized(0) d_unrecognized(0)
@ -210,7 +212,6 @@ op25_decoder_ff::identified()
return d_data_unit; return d_data_unit;
} }
void void
op25_decoder_ff::process_data_unit() op25_decoder_ff::process_data_unit()
{ {
@ -236,6 +237,7 @@ op25_decoder_ff::process_data_unit()
} }
} }
} }
d_data_unit->dump(*d_logfile);
} }
void void

View File

@ -24,10 +24,12 @@
#ifndef INCLUDED_OP25_DECODER_FF_H #ifndef INCLUDED_OP25_DECODER_FF_H
#define INCLUDED_OP25_DECODER_FF_H #define INCLUDED_OP25_DECODER_FF_H
#include <boost/scoped_ptr.hpp>
#include <data_unit.h> #include <data_unit.h>
#include <gr_block.h> #include <gr_block.h>
#include <gr_msg_queue.h> #include <gr_msg_queue.h>
#include <imbe_decoder.h> #include <imbe_decoder.h>
#include <iosfwd>
#include <itpp/comm/bch.h> #include <itpp/comm/bch.h>
#include <string> #include <string>
@ -129,6 +131,7 @@ private:
uint32_t d_data_units; uint32_t d_data_units;
bit_queue d_frame_hdr; bit_queue d_frame_hdr;
imbe_decoder_sptr d_imbe; imbe_decoder_sptr d_imbe;
boost::scoped_ptr<std::ostream> d_logfile;
int32_t d_tap; int32_t d_tap;
std::string d_tap_device; std::string d_tap_device;
uint32_t d_unrecognized; uint32_t d_unrecognized;

View File

@ -9,7 +9,7 @@ typedef std::vector<bool> bit_vector;
typedef const std::vector<bool> const_bit_vector; typedef const std::vector<bool> const_bit_vector;
/** /**
* Swab in[bits[0..nof_bits)) to out[where..where+nof_bits). * Swab in[bits[0)..bits[bits_sz)) to out[where..where+bits_sz).
* *
* \param in A const reference to the source. * \param in A const reference to the source.
* \param bits An array specifying the ordinals of the bits to copy. * \param bits An array specifying the ordinals of the bits to copy.
@ -26,11 +26,11 @@ void swab(const X& in, const size_t bits[], size_t bits_sz, Y& out, size_t where
} }
/** /**
* Swab from in[0..nof_bits) to out[bits[0..nof_bits)). * Swab from in[0..bits_sz) to out[bits[0)..bits[bits_sz)).
* *
* \param in A const bvec reference to the source. * \param in A const reference to the source.
* \param where The offset of the first bit to read. * \param where The offset of the first bit to read.
* \param out A bit_vector reference to the destination. * \param out A reference to the destination.
* \param bits An array specifying the ordinals of the bits to copy. * \param bits An array specifying the ordinals of the bits to copy.
* \param bits_sz The size of the bits array. * \param bits_sz The size of the bits array.
*/ */
@ -45,16 +45,16 @@ void unswab(const X& in, size_t where, Y& out, const size_t bits[], size_t bits_
/** /**
* Extract a bit_vector in[begin,end) to an octet buffer. * Extract a bit_vector in[begin,end) to an octet buffer.
* *
* \param in A const reference to the bit_vector. * \param in A const reference to the source.
* \param begin The offset of the first bit to copy. * \param begin The offset of the first bit to extract (the MSB).
* \param end The offset of the end bit (this bit is not copied). * \param end The offset of the end bit.
* \param out Address of the octet buffer to write into. * \param out Address of the octet buffer to write into.
* \return The number of octers written. * \return The number of octers written.
*/ */
template<class X> template<class X>
size_t extract(const X& in, int begin, int end, uint8_t *out) size_t extract(const X& in, int begin, int end, uint8_t *out)
{ {
const size_t out_sz = (7 + abs(end - begin)) / 8; const size_t out_sz = (7 + end - begin) / 8;
memset(out, 0, out_sz); memset(out, 0, out_sz);
for(int i = begin, j = 0; i < end; ++i, ++j) { for(int i = begin, j = 0; i < end; ++i, ++j) {
out[j / 8] ^= in[i] << (7 - (j % 8)); out[j / 8] ^= in[i] << (7 - (j % 8));
@ -63,7 +63,27 @@ size_t extract(const X& in, int begin, int end, uint8_t *out)
} }
/** /**
* Extract value of bits from in[begin,end). * Extract a bit_vector in[bits[0)..bits[bits_sz)) to an octet buffer.
*
* \param in A const reference to the source.
* \param bits An array specifying the ordinals of the bits to extract.
* \param bits_sz The size of the bits array.
* \param out Address of the octet buffer to write into.
* \return The number of octers written.
*/
template<class X>
size_t extract(const X& in, const size_t bits[], size_t bits_sz, uint8_t *out)
{
const size_t out_sz = (7 + bits_sz) / 8;
memset(out, 0, out_sz);
for(size_t i = 0; i < bits_sz; ++i) {
out[i / 8] ^= in[bits[i]] << (7 - (i % 8));
}
return out_sz;
}
/**
* Extract value of bits from in[bits[0..bits_sz)).
* *
* \param in The input const_bit_vector. * \param in The input const_bit_vector.
* \param begin The offset of the first bit to extract (the MSB). * \param begin The offset of the first bit to extract (the MSB).
@ -80,4 +100,22 @@ uint64_t extract(const X& in, int begin, int end)
return x; return x;
} }
/**
* Extract value of bits from in[bits[0..bits_sz)).
*
* \param in A const reference to the source.
* \param bits An array specifying the ordinals of the bits to extract.
* \param bits_sz The size of the bits array.
* \return A uint64_t containing the value
*/
template<class X>
uint64_t extract(const X& in, const size_t bits[], size_t bits_sz)
{
uint64_t x = 0LL;
for(size_t i = 0; i < bits_sz; ++i) {
x = (x << 1) | (in[bits[i]] ? 1 : 0);
}
return x;
}
#endif // INCLUDED_SWAB_H #endif // INCLUDED_SWAB_H

57
imbe/P25DEMOD.OUT Normal file
View File

@ -0,0 +1,57 @@
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-##-##---#----#-###-#----#-##-##-####---#-###-#-----#--##-#--#--##-##---####-##--##------######--##-#-#####---#---###-##---##---#-#-###----------#---##-##---#----#-###-#---#--#-###-####---#-###-#-----#--##-#--#--##-##---####-##--##------######-#--##-#####---#---###-##---##---#-#-###----------##---------------------#----------------------##-##---#----#-###-#----#-###-####---#-###-#-----#-#--##-#--#--##-##---####-##--##------######--##-#####---#---###-##---##-#---#-#-###----------#-------------------------------------###---##-###----#----#-###-#----#-###-####---#-###-#-----#--##-#--#--##-##---####-##-#--##------######--##-#####---#---###-##---##---#-#-###----------##---#-------------------####--####------------###-#--#-#--##-##---##--##--###-###--###-#-#--#----#-###--#-#---##-#-##--#---#-#-###-#######----##-#--#---#---##--#--#-#-##-#-####-###-#----###-----#--#-####-#----#-#--####--#-###----#--#--#-####--------##-#-#--#----##-#---#--#--###------------#-#-##-#----------#--##--###-##-#-#----#--##--##-##-#####--#-#--#-#-#######-#######---#-#-#---#---#-####-####-###-----###--#-###-#-#-##-----####-##-#-#-#-#---##-----###-#-###---##-----###-###-###-------#-###-#--#-####-#-#####-#-----#----#--##-#--#-##---#####----###-#--####-#-##--###---#---#-#-##-####-###-##-#####-####-##---#----##-----#-#--#-##--#--###---#-#--#-#--#-##--###---#---#--###-#--#-#-#---#-###-#--#-##----#--#--##-##-#####--####-#---#-##--#--###--#--###--##------#--###--#-----#---####---##-#-#-----##--##-##---##--##-#-##--#-----###-#####--##-#-#-#-##-#--#-#----###-------###--#--###-###-#-#-#--##--##-#####------#-##-------#-##-#---#--#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-####-#--#-##--##-#----######-##-#-##-#-#-#--#####----##--#-##-#----##--#######-###-#-###-#-####---##--#-##########--#-#---###---#--####-----###---#-#####-#---#-####--#---#---#-#-##-#--##----#-#--##--#-###---#-#-#-------###-#----#---#--#---#-###--#-###-#--###---#-##----#-####--#---###-#-##-##-#------------------------#---------------------#--###--#--#######--####--######-##----##--#-##--##--#--###-#----#-##-##---##-#--##-###-###--#------#-#-##--#######-##-##-#--#-##-###-#---#####---##-----------------------------------------#-####-####----#--######-#-###-#--#-#--##-######--#-#-###-####-#--####-####-##---#-#---####-#---##---#-##-#-#--#--#--##-#-#--##------##-#--###----#--#---------------------------------------#-###-----#-#---#---#-##---######----#-##-##-###-#-####-######-#---#-###--#--##-###--##-#--#-#---###-####-----##--##-###--#-#########-#-#-####-#-##-#-----###-------------------#-------------#---#---#--#######--#--#--######-##---###-##-#--------##-##-#---##-#--##---########-####--##-##-#-----##-#-######--###-------#--###-#-#----#####---##-#-###-#---#-##-#--#---#-##-##--#--#--##--##-#--#-##-#------##-#---##-#---##--#--#--#####-###-#-###--########-##-#--#---#--###--##-#-#-##-##----#--------#-----#######-#--#--#--#-#--###-###--##-#-#-#-####-#--####---#######-#-##---#-----#-----####-#--#--######-####-#--#-#-####-##--##--######---####-#-######-#--###-#-####-#--#----##-###-###-##---##-----#-#-----###-#-####-####----#-----#---####--#-----#---#####-###-##--##-###--#-----#-###--##--#----#-#-##-#-#-#-#-###--##--#--###-#-#--#-####-----#-##-#--#-##-#-#---##--##-----#-#---###-#--###--#-#--#-##-####-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-#######-#----###-###---##-#-##-#--####--#---#####--##-##-#-##--#####-#######--##----#-#-##----##-#-#-###-###---###-##-#-#----#---##----##---##-##-#----##-###--#-#-##-###--#-###-#-#--##-------##---#-#-#----###--#----#--#-##-####--###-#---###----##-#-#--###-###---#---#-#---#--##---##--#--##-##--#--##--------------------#---------------------#-#-#---###-######--##--##-#-#---###----#--###-#--#-#-#-###--#---#-##---#-##----#--#-#-###-###--#--##---#-#---#-###--#---##---###--########---#----------------------------------------###--###-###-#-----#-##---##-##-##-#-######-#--#####--#-##---#####-#-###--#-#---#--#-#-#-#---------######-##-----##-#-#-----#-###-##-#--#---#--#----#--#---#-------------------####--####----------#######---#-#---##---#-#----#####---##--####-#-###-##-##-#---#-##---#####-##-##--#-#######-#-#--#-#---###-#------#####-###--#--##--##-####-###---#-#--#--#-####-#----#-#--####--#-###----#--#-#-#---#--#-##------####--###-#-#-###-#--#-##--##-#---######----##---##--######-----##---####---##--##-#---#-#-#####-#-######----#-#----##-----##--##--#---#-####-####-###-----###--#-###-#-##-##-##-###-#-#-#-----###--##-##----#-----##-#--#-----####-##-#--###-##-#-#--####-#--##-#-#-#-##-##-------#-#####-#-####--#-#--#-##-#-##--##---#-#-####---#---#-#-##-####-###-##-#####-####-####-###---#-######---##-#--#-#--#-##---#-#-####--#--#-#-#-#-#---#-#-##-##---#-#-#-##---#-###-######--##--##---##-#-#-######---#-#--######-#####-#-##---#-----#---####--#-----#---#####-#-#------##-##--##----#-##-#--#-##---#######-#-#--#----##-####-----#----#-#-----#--#---###--#--#-###-----#-####-####---###-#-#--#--#-##-####---#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##--##-#-##-##--##-#-##-#-##--#-#--###-----#---##--------#-####--#-###-#-######-#--##-#-######----#####---##-###----###--##-#--#-#####-#-##-###-#-#-#-------##-#-#-------####-#-#---####---#--###--#-###-----###---#--#-#-#---##-###-###---##-#--##---#-#--##-#-#-#-###---####-#-##----#-#-#-#-#-#--#-##-#--------------------#----------------------------#####-##--###--#-###-##-##-#--###--###-#--##--#--##--#---#-#--##-####-----##-#-#-#-#-#--##-###--#-###-#--#--####-#-#----#####----#--##---#-#------------------------------------------#---##--##----#-#-##-#-###-####-##-####----#-#-#--##-----###-#-#-###-#-------#---####-##-###--#--#####-----##---##-#-------#####----#####---###-#-#--#----------------------------------------###------#-#--#--#----##---##--#-##--##-#-#---#--#---#---###-##-----###-#-#-###-###-###--##--##---##-###-##-########-#--######----##-#--#-###-#-##-#-----###-------------------#--------------#---##-#---#-#-#--#--####-####-#-#######-#-#-#-###-###--##--#--#-#-##-######--#--##---##-###-#---#-##--##---##-#---#--##--#-###-##-#-###--##----#--#-#-###-#---#-##-#--#---#-##-##--#--#--#------##---#--#-#-###---##---######-#-##--######----#--####-#--#--##-##---###-#--#-#--#--####---#----#-----#----###-#####-------##-#-##--#-###-####-#--##-#-#-#-####-#--####---#######-#-##----#--#--#-###-#--#---########-#-#-####---#--###--#--##-#####-####--#----##-##--#-#####-#---###-#-#--###--#####-###--#--####-###--###--#--#-##-#-###-#--#-----#---####--#-----#---####-##-#--#-##--#---###-#---#-#-#----###-#-#--#-###-----#--####-#--#-##---#-####-##--##-#-##---#-----####--#---#--###--#--#-#----###-#-#--##-###-#---###-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###--##--##-#-#--##---##-#-###-#--#--###########---#-###-##-#-#-##-#----##----##-#-#--#--##-#--#----#--#--#--#---##-#-###-#---###-##-#####---#--##--#---#--##-###---#-#--####-##--#-#-#----###-----#--#####-##-#-##---###---#-###--#-##--######--#-----#----##---##---###----#-----#--##-##--#-#-##-###--##--------------------#----------------------###-#######---#-#-----#----#-#-#-#-#-###-#--#--###-----######-#####--####-#-##-###-#-#----#-#----#--####----#####-##-#####--#-##--#---###--#-####-------------------------------------###----#####--#-#----#--#-##-#-##-###-#---######---#-####-##-###--##-#-#-#-#--#-####-#-########-#---###-#-##--####--###--#-#-##--##-----#-##-#-#--##--##---#-------------------####--####----------####--#-##----#--#--###--###----#-#--##--####-#-#-##-#--#--#-##-####-#####-#-----####-###-----#-###--#--#-#--#####-##-#--#-####------#####------##-#--#--#-####-#----#-#--####--#-###----#--#--#####-####---#----##---###-#-##--######--#-#-###-####-####-#-####--#-##-#----##-#---###-#-#-###-#--###--#-####-#---#--#-###--#####---###---#-#---##--#---#-####-####-###-----###--#-###-#-##---##---###--#-#--##--##---##--#----###-####--##-####-###-###-#--##-#-----###---###-##---####-#--##---#--#-####---#--#-#--#--#--#--##--#--#---##--####---#---#-#-##-####-###-##-#####-####-##--#----###-#--##-####---##-###-#-##--####----##--#-#--#####--#--##-#####--####--###---#---#-#--##-#--#--##-----##-###-##-###--#--#-#---###-##---#-#---#-----#---####--#-----#---####-####---#---#-#-###---#-##-#-#####---#-#---#-###-##-####-#-##--#---##--##--##-####-#-####-#--#---#-###---####----###-##---#--#-#---##---#-#-##--##--#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##--#-###-##--##-------#-#--###-----#-#-#--###---###----###-##-####-####----#-##----###---#--##-##---##-----#######--#######---#--##--##-----#--###-#---#-#------###-#--#-##--#-#-#-#-####--##-##-#-#---##--#####--#--#---##----###-----###--#---##---#--#-#--#-#####----########-##-##--#-##---###-#-##----------------------#-----------------------###-#-#####-#--####--#---##-#-#-#-##--#-####-#--#-#-####-#---#-#--##--####--####---##-#-####-----#-##-----#--#--#-#---###-#-###-#--#--##--##---###-----------------------------------------#--###-#-##--#---#-##-###-#-##-#-######------#---####-#-#-##-----##-#--##-##-#-#-#---##-#---###--#####-#-#-##-####-###-#-#######-#-#--##-#-#-#--#-#--#----------------------------------------#-####--#-##-#####---#-##---#--#--#-##-###---####-#--#####-#-----#####--##--###---##---#-###-###---#-###-----##--##-----###-#-###--#-###-#-##----#-#-----###-------------------#-----------------#----#-###-##---#--##-----#--#-##-#####-###----###-#-##-####-#----##--###--##--#---#-#-#-##--###-#-#-#-##-----#--##-#----#--###-#--#######--#---#-#-###-#---#-##-#--#---#-##-##--#--#--#---##---##--#-#---###--#-#-#####-#---###-#-#--#--#----####-##-##-#-#####--#--#--###-#-#-#----###-###-###-#-######-----##---##-####-####-###-----###-#--##-#-#-#-####-#--####---#######-#-##-------#-#-##--###-#-#--#-#---###-###-##---#-##---###-#-###-######-#-#--###--###--####-######-###--##--##-####-###-#-###-##-#--#-###--##---###-#-#-##-##------#-###-########-#-#-#####--##-#-#---######--##---#---#-####-##--###---#--###-########--#####-#-#--##--#-#####-#---###---#-#--##-######-#####-#--#--#-#-############-##--#######-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-----##--#####-###---###-##-#--------###-###-----#---##-#####-####--------#--###---##-##-####-#-##--#-#-##--##---#---##-##--#####--##--#----######---#-####-##-#-#-#-#-######-#-##-#-#----####----####--##-#-##-#-#------#-#---##--#-##-#--##---#-###--#-#--#-##-#-##-####-#----#-##-##-#-##-#-##-----#---------------------#----------------------####-----#--##---##-####-###--#-#-#-###---###--###-###########--#-###-####---####-##---#---#---##-#-##---#-#------######-#--#####-##-##---##---##-#-----------------------------------###---#-#-##---#-##--#----#---##--#---#-##--###--##--#-#-#-##-##---##---#--###-----#-##-##-----#-#-#-##--##--#-##-####-#--#-#--########-#-#--##-###-#-##---#-------------------####--####-----------#-#----####--##-#-#--###-#-##-##--###-##--#####--#-#-##-#--###-#-###-#----------#####---###-----##--#--#--#---##-#-#-##-##-####--##--#-#####-##---#--#--#-####-#----#-#--####--#-###----#--#--#---------#--#----#-#-##---#--#-##--####-####--###--######-#-###-#---##-----#--######-#-###--#---##-#-#-##--##--#--#####-##-##--##--#--##-#-###--##--#---#-####-####-###-----###--#-###-#-#-##------##---#----#-#-#-##----#####---#--####--#####-#--#-#--######--#-#---#----####-#-----###---#-##---#-###--#-######-####--#####--#-#--#-----#--###---#---#-#-##-####-###-##-#####-####-##-#--#---###---##--###--##--###-###-#----#-##-#####----####-#---#---#---##--####-#-##-#-#-##-#--#---####----#-#-##---###-##-#-####--####-#-#-#----###------#--###--#-----#---####---#-##-#---#-###-##-##-#--###-#--#--##-##--##-#-#####--##---###----#--#---####-#-#-###-----#------###-#------#--#-#-##---#-##---#-##-#----#-##--#-##--##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-####-#--#-----#-#----###-#-##-#--#---##--#-##--##-#--##-##-#------#-##-#---#-#--#####--#-#####-####-#-#--##-#-##-###-##--##-##-##--#--#--##-##-#-##-#-###-#--##--#---#-#--#####-----###----#------##--##-##---##--##----##-##-###-##-#------#-#--#-#-##-##--#-####-##---#---####---#-##-##--#----#-##-#--#--------------------#---------------------#####-#--#--###-##------#-----#---##----####-#-#-##--###-#---#---#----#---#--#-##-#-##-#-#--####-#---###--##--#--######-###----##--###-###---#----#-----------------------------------------#--#--#--####--#-###---#-#####-#-----#------###------######------#--##-####-###--#---##--#-#-##--#--#---###-####-#-#-##-#-#-#-##-#-#-#--####-#--------#----------------------------------------####--###############-#--#-#---#-##-#----#-####---########--#-----##--##-------###-#-#-#-##-#---#-##-#-#----#-#--###-###------#---##-#-##----#-#-#-#-----###-------------------#-------------#-#---#-#--##-#-----#####-#-##-##-#-----##-#-##--##----#-##-#-##-###-----###-#-###-#-#--####-#-#-##--#-##--#-#-###--###-------###-#-####--#-##-##---#-#-###-#---#-##-#--#---#-##-##--#--#--####-##--#---###---#------#---##-##-###--#-#--#####-####--###-#-###---#--#-###-##-#-####-###--###---###-##-#--#-#--#---##----##-##--#######-###----#-#--##-#-#-#-####-#--####---#######-#-##---####--##-###--#---#---#--##---##---#----#-########--##---##---###---#-##---------##-###-##-#-####-------#----#-##---##-##---#-##-#----##-##--#####----#-----#---####--#-----#---#####--##--##--##--#--#--#-#--#---#-#-#--#-#-###-###-#--####-#--#---#--#-##---#-#-#---#-#-##--#---###-#-----##--#--#-#-#-#-----------#--------------###-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-####-#-##-----##----#-#----#-#-#-#--######-##-##-##-##----#----#-#-###-##---#------#-#-#--##-##--##-#-##---##---######-##-###---#-##-##-----##---##----##--#-#--#-----##--#-#--#-##--#--##---###-#---######-#-#--##--####--#--#-#----#-##-#--#--#---####--##-###-#---#-##----###-#--##-#--###--##-###-#-###--------------------#-----------------------###-##------#--##-#-#-#------#--###-----#--##-#-#---#####-##-###-######--#--#-#---#--#---###------##-#---###-####----#-##-##--#--##--#####-#-#---------------------------------------###----##-##-###-#####-#-#-##------------####-##---#-###-#-#######-##-#-####---#####--##--###-#-##--#####-###--#-####-#####-#-#-###--#-#-#-###-#---#-####--#-------------------####--####------------#-#####--########-#--#####----#-#######-#-#-#---#-##---##-#-###-#-#---#---#-#---#--##---#-#-#--#--#-###-#--##-#---###-#-#-#---#-#-#-###-#------#-#--#--#-####-#----#-#--####--#-###----#--#--#---#-##-#-###---###--##-####--##-##-#-###-##-##-##---####-###-##--#--###--##########-#-##-##-#-###--#---##---####-##--#-#-##-#-##-----#---#-#-###---#---#-####-####-###-----###--#-###-#-##--##-#-##-#-##--#---#--#--#-##-#---#-##-#--#----#---##-------####-####--####-####-##-#-----#----#-###-##-##--##--############-##-#-##---#-----#-#-####---#---#-#-##-####-###-##-#####-####-###-####---#-#--#-#####---#----##-#-#####-#---#-###--#--#-------#--##-#-###--#-###-#--#-###-#####-###-#-##-####-#-#---#---###-#----##-###--#------###---#-----#---####--#-----#---#####--##-##--##-##--##--###--#---##-###--#-----#------######--####-#--#--####--#-##-###---#--####-#---#---###--#-##------##-#-###----#-#--#---######---#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-####-#-##--##-##----#-####-##-#-#-###--###----#-##-#-------##-#-#-##-#--##--#--#----#---##-#-###---####--##-##-#--#---###-##-#-##---#-#--#----###-###--#--#-#---#-##-----#-#--#-#-----#-#--##-##-----###-#-##---#-#-####---#-#--###-#-##-#---##-#-#-###-#--#---#--##---#-###-###--#-##-###-#--#-##--##------------------------#------------------------#-#---##-###--#-#---#######-##---##-#-------#-##-#-#-####-#-#-######-##-#-#-------##-#--##---#--#-#-##-#--#####-##-----#-####-#-#--#-#-####-#--#----------------------------------------------##--#--###-###--###----#-####-#-###-#----#-##---#----#-######--------#####--###-#---##-#-#--#--#-##-#--#-##---###------##---###-#----##-----#----#---------------------------------------#--#-#--#--##-----#-#----###-#-##--##--#-#-###-##-######-##-#####-####-#--#----#----###-#---##-##-----###--#--###-----#-#--#-#-##-###-#-##---#-#--#-#-----###-------------------#-------------#----#-####---#---#----#-#-##---#----###-###-###-###---####----##-##---##---###----#-###--#-##----#--#-##--#--##-######-#-#-##--###--#####-###--#---#-#-###-#---#-##-#--#---#-##-##--#--#--#######--###-#-#-#--###-##--#----#---#----##--#-#-##--####-##-###-##-##--###-----#-#####-##--##-###--##--####--##---##--######--##--##-#--##-##-##-#-#--##-#-#-#-####-#--####---#######-#-##------##--#####-#-###--##--###-##---#-######-#---#----#--#-###--#-####--###-#----###-##---#-##-##-###-----###---#--#-####-#-##--##-----#----#--#-###-----#-----#---####--#-----#---####----#--###-#-##-#-#-#-#--#--###--##---#--##-#--##---#-#--##--#-##-###-#---###-#####-#-##-######---#-######--####-##----###-#--###-#-------###--####-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-#--#--#-#####-#-#####-##-#-#-###--#--#-##-#-----##--#####--##-##-----#-#-##---#-#--#--#-####-##--###-#------#-##-#--##--###---#----#-#----##-####---##-##-#----##-#--##-#--#-######---#--#-#-##-------#######-#-#--#######-#####-#--------##-#-#####---#--#-----##---#-#-#--#-##------#--#---#####-###---------------------#----------------------#--############---##---##-##---######-###--#--#-##-###-###-##--#--#---##---#---#-###--#-#-###-----###-###-#--####--#--#-##--#---#-#-#####-##-#----#-----------------------------------###---#-#-##--#######-###-###--##--#-#-#--####------#-#--#--###-#######--##-#-#--#-#-##----#---#---#-#--###-##----#-###-#-#-#-##--##---#-----##--#-#-###---#-------------------####--####-----------#######-#--#---##-##--#--##-#--#-##----#-#--######------##-###-#-#-##---####--##-#-#-###-##-##--#--##--#---##---##---#-#-##-##--#-#-###-##--#--#--#--#--#-####-#----#-#--####--#-###----#--#--#-##--##-###--#-#--##-##--#-##-#----#-#---####-####---##-#-------#--#-##--#----##-#-###---##--#-#--##--##-##---#--####-##---#-#-##-#----#-#-#---##---#---#-####-####-###-----###--#-###-#-#--##-#####-##-#-#-###---##-#--#-#--#-----##--###-####---##--#---##--#---####---######-#---#--#####----###--#---######---###--#######-###-###-#-#----###---#---#-#-##-####-###-##-#####-####-##-##-#--###--##---##---#---#-#---####--#-#---##-##-#-#-#--#-#####-#-#--##---###-#-#-#----##-##-#----#--##-#-###-##------###--#--##---###-#---#-#-####--#-----#---####--#-----#---####-##-#---###-##-##-####----#-###-#--#----#-#--#--##########---#-#-###-###-####----#-#--#-##-#-#--#-#-####-#--##-----##-#-----####----#-##--####-#-#--#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-####-##---#-###---##--##--##-###-###--###---#-##-#--##--#####-----#########-##-##-##-#-#-#-#-##-##-#--#-##------##-#-----###--##-#--##--#---#-##-#----###-##-##-#-#-#-##-#-#-----#---#--#------##-----#####-###---##-#----#-##-##----####--#-##--###-##-##-##-#-#########-#-#--#-##-#-##-#-###----#---#--------------------#------------------------###-##----##---##--##-####---##---#--#--#----###--##--###-#-#--#-#--#-#--#-#--#-##---##-#-#----#--#----#---##-#-####---#-##------#-#-------#-#-##-----------------------------------------####-#-##------#--#-####-#--####--###-#-#--##--#---##--##---###-#--#########-#---------##-####--#-#-#--##-######-#-#-##--##---#------#--#---#---#-#--#-----------------------------------------######-##---###--#-###-##----##--#-#-###--##--#---#----##--#--#-###-#-#--###-###---#----##-######--#--#-##-##-##-#-##--#-#-##-#--#---#####---#--###-----###-------------------#---------------#--#-#####-----#####--#-######-#----#---###-##-#-##-##-##--#---#-########---####--#-##-#-----##-###-##-##---------####-#-#-----##-----#-###-#-#---#-#-###-#---#-##-#--#---#-##-##--#--#--#--#-#----#-##-#-###-#-#-##-#--#####----#--##-##-#--#-##--######-#####-#----#-#-#---#-##-#-#####-##-#-#-#-#-----###-#-#-#---##-##--##---########-###-#--##-#-#-#-####-#--####---#######-#-##-----##-##----##--##-#--#--#---#-##-#---#-#####---#---#--#---#-#--##--##---#-#-#-#-#--###---#-##--#--#------#--#--##--###-#----#-----#-----###--##--#-##------#-###-########-#-#-#####-#-###-##---#--#---##--##-#----#####-##--########-#---##-##-#-#-----#-###-------#-####-#-#-######-#-#####--#--##---##-#-#########-#####--#-##-----####-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-#####--###-#---#-##-#-###----###-------##---###-#-##---##-#-#-#-####-#---#-#--####--#-----###--#-------#-##--##---##-#-#-#-#-##-##---##--#######--##---#--##-#-#-#-#---#---#####----###-##--#----##-##-##-##-#-###--#--#---###---##-#-#-#-##-#-##-#-#-##--##--#-#--#----#--##-#--###--#-####---#--##----###--------------------#---------------------##-#------#-##-##---##--##----#--#---#-###-#-###-##-##-####--##--#---#-##-#--#-##-##---#--#-----#####--###----####-##-#--##---###----##-######-----------------------------------------###--#####-#-#--##-##--##--##--##------##-#----########---###-#--##--#--#--###-#--##-#-#-###----#---###-#-####----#--#-----##-###---#-#####-####--#----#---#-------------------####--####----------##---##-###-#-#----#---#-#---#--#--##--#-###-#-#---##-#--##-#--##-####---#-#---###--#--###--###--###-####---#########-####-#-##---#-##--#-##-#####-#--#--#-####-#----#-#--####--#-###----#--#--#-#-##--##------###-##-##--------##-##-######---#-#####-##-#-###-------##--#--#-#--##--#---#-##--#--#-#--##--#-#--##--#-#----##--#--###--#--#---###--#---#-####-####-###-----###--#-###-#-#--#--#-###-#--#-#---###-#-###-##-#-#---##----###-#----#-###--#-##--###-#-####--#-##---#-#--####-##-####--#-#--#------#-#--##-#--#--#-#-##--##---##-####---#---#-#-##-####-###-##-#####-####-##-----#-#####-#-#--#####-#-#######-#--##-#---###-##-###########---#-#####-######-##-#####-#-##--####-#----#---#-##-###-####---##---##----#--##---####------#--###--#-----#---####---#-#-##-##-######---#-##-###-######-####--###-####---#--##-##--#-#---#--##---##-#######-#####----#--#--####-#-##---##-#######--#-#---##--##-#-##--##-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##--#-##-##-#######-#---#--#-##-####-#-#-#--##-#-###-#-##-##-##-#---###--###-##--#-##-#---#---#-###---#-#-##---###-##--#---##---#----###---#-#--##--##-##-####-###-#----##----#-##--###-#--#-#-#-#-#####-#-----#----##-#-#-#--#####--##--#-##---##--#-#-#----##-##-#-##----#-#-#-#-#-###---###-----#-#-#----------------------#----------------------####--##--##----##--##########-#----#####-##-###-#-##---#--#--------#####--###-##-#-#####-#---##--##---##-##--########-#-#--#-##--##-##---###--####-----------------------------------------#-#--#-###---#--#-##---####--#-----#---####-###--#---#-####--#-###-##--#-###-#-#-#--#-#-##--#------##---#-#--#--###-#-#-##-###-#--#--#####-###-##----#----------------------------------------#-######-####---#-###-##---#####--#----###--#---###--#-######-#-#-#-##--##--#--######----###--##---#####-##-#--##-##--###--#-#--#-----#-#---#######---#--###-------------------#------#-#-#---#--##-#--#-#-#-##-#-#-#-###-------#-#-----##-####-#--#####--#-----####-##-####----####-####--###--####----#-###--##-###--#--####-#---####-##--#----#-#-###-#---#-##-##-#--##-##-##--#--#--#---#-#####--###-#--#--#-##-#----#--#--#-##-##-#--#----#-###-#-#-#--#---#-##-######--###--##--#--##-#-##-#----#-###---#-#-###-##---###-#######----####--##-#-#-#-####-#--####---#######-#-##----###--##--#--#--#--#--###-##-#-######-###---#-#-#-#---#--####-###-#######-##-##-####-##-###--#--#-#####---#-#---#-#-#-#--###--#----###---#-##-##------#-----#---####--#-----#---####-##-#-##-#--#--#--#####-#####--####---####-----#-##-######-#####-#-##--###--#---#--##-#-#-#-#####-##--#-#--###--###-###--##-#-#----###-#--##----#-#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-##-#-##-##----#--##-######-#-###-----#-#--##--########--#--##-#-##----#####-#--##-##-######--------#-###--###---#-#-###--##-##-###------#--###-#----#-#---##--#----#-#####-#-######-#-##-#--#-##-#-###---######-#####-#---#-#-#--#-#######---##-####-#--##-#--###--#-##----##--#---##-##---#-##--#-####--------------------#----------------------#-#--##--##-------###-#--##-#-#----####-#---#-##-#--#-#####---#---#-#-#------##-####---##-####-#--#--#-##-##-##-##-----#-#----#------#-----##-----------------------------------------###---#--#-#-#####----#--##-----##-######--##-##------#-####--##-#-#--#---#-#---##-#--##--###---###-###-##---##--#-##-#---###-#-####--##-####--##---#-###--#-------------------####--####-----------------##-##---#-#--#-#-#-###--##-#-#----#--##---#####-####----##-#--#-#---#--######-----###--#---#-##--#-#-#-###--##-#-#--------######----#--#-##----#--#-####-#----#-#--####--#-###----#--#---#-##-#-#---##-----###-###-###-#-#---#---##--#-#-#-#-###-#--#--#-#---#-##----###-###-----#--##--##----###--##--###--####---#--####--#-##-######--#---#---#-####-####-###-----###--#--##-#-#-###-###-#---##-#-#-#---##---#-##-##---#-##--#--#-#---#--##--#-#--##-##-#####--##-###-#-#-----#-##--##-#-#-#--#-#----#--####---#####--#-######--##-####---#---#-#-##-####-###-##-#####-####-##------#-#####--#-#-###--##----###----#-##--###-##-##---###--#-#--#----#-###----##-##--###-#--####-##--#---###--##--#-####--#-#-#---#----##-##-######--#-----#---####--#-----#---####-####-##-----#######-#-###-##-#-#-#-#-----####-#--##-#-#---#---#-######-##--#-#-#-####-#-#-#-#---#---#-##-#-#----###-##-#-##-##-#---###----#-#-#----#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##--#####----##----#---####--##--####--#-#--##-##---##--#-##-----###---##---#-#-#-##-----##--#-#-##-#-#-----#######-########---#--##-######-#--###-##--#-##---#-####--#-#--##-#-#-#-###-#-##-###---#-#-####--###-##-##--#---#--#--####-#-#-#--#-#####-#-###---##--#--###--#--#######---##-###-######--##----------------------#----------------------##-##---#--#-##--#---##-####-##-#-#--####-##-#-###--#--##-#-###-#-###-----#---###-##-##-#--##-###-#----#-#----------#--#-#--##-#-#-#######--#-##-#------------------------------------------##-###---#######-##---#-#-####--##--#----#--##--#--##-##---###--##-----#####-#-##-##-#-##---###--#-####-#-#--###---#--###--#-#------##--#########-#--#-----------------------------------------#-##-----#-#---####-###-##-####-##-#----##-##-#-#-----#-#-####--##-##-####-#--###-#--#--#-----##-##------#####-#--##-####--#-#-#-#--##-#####-##-###-----###-------------------#--------------#-##-#--#-####-##--##---####---#-##---###-###--##---####-#---#-#----#-####--####-#---##-####-##-##-#--#---###-#-###----####-##---#-----###-#--##--##-#-###-#---#-##-#--#---#-##-##--#--#--#-#-##-#--######--##----#---#---#---#---##--#-#-##-####-######-####-###---##-###------##-#---##---##-#-###---#--#-#-#--#--####-##-#---#-##----#-##-#-#--##-#-#-#-####-#--####---#######-#-##--------#--#-#--##----###--#-#-#--###-#----#---###-#####--#####-##--#-##-#------#---##-##-##------##-###-#--#----#-#-#-#-####--##-##-##-####-###-##---#--#-----#---####--#-----#---####-##-#-#-#-###--#----##----###--####-##--#---##--##----##-#--##-##--##---##-##-#-----##----###-#------#-##---##-#-####-#-#-#---##---########---##-##-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###---##---#----#--#####-#-----#-#-##--#--#-###-####--##-#--###---#-#-###--#-###-###---#-#-#-####-#----#-#-##---#--###-#####----##-#-###-#-#----#--##-##-###---#-###---##--#-#-#-###--##--#---##-#-##--##---#--##-#-#-##--#-###-#------#-###--#-#--###-#-#-##----####---#----###-########-###-#-##-#-----##--------------------#---------------------##-#-#----###-#####----#-##--#-#---#--#-#--#---#--#-######-#-##-####-##----#-#####----#-#-#---##--#####-#-#--######-#-###-#--#####--#----##-##-#---#-----------------------------------###--###-###----#-###-##-----##--#-#######--#-###-####--#---####-----##--#-#-----###----#----##-#-#-###-#-##-#-##-####-####-####----#######---####-----#---#-------------------####--####----------#---##-----####-##--##-#----#####--#---#--#--##------#-#-#-----##------##--#-###-##-###-####-#-###------#--#----##########-#---#--###--#---#-------#--#--#-####-#----#-#--####--#-###----#--#-#-####--###-#---#---#--#-#-#####--##--#-####-#-#---#####-##-##-##--#-####-##----##--#-##-#--###-#-#-#-##--##---#####-#---#####-#-##-#####-#####---##--#---#-####-####-###-----###--#-###-#-##-####----#-#-#-##-----##---###-#--#---####--#####--#########--#-#---##-------#-#-#-###-######---###-##---#--###-#-#-#--#--#--#--#-##-#-###-#--#-#-####---#---#-#-##-####-###-##-#####-####-#####-###-----##-#-#-###-#-##-#--#-----#--#-#-###--#-##-##-#---###-#-#--###-#-#-#-#--##--#---#-###-###-#---#-#-##-#-----##-#-##-#-#-##-#--#-#-------#---#-----#---####--#-----#---#########-##--#-#-#---#---##-#-#--######-#---#####-##----#---###----####-####-#-#-###--#---##-#-#--#--#-##---##-#-##-##-####-#--#---#-####--#--#-#---#--#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###--###--##-###-##-------##-##--##-###---#-##-#-#-#--##--###--#-##--####-##---#-##--------#--####-####-----###---------###--##--###-##--#-##-------###--####-###-#-##-#-###--#---------#-##----#-##-#---##--####--##---#--------##-##-#-#---#--##--#-#-##--####-########--#--#-##-----#-#----####-#-##-----------------------#---------------------#-###---#######-#-----#-####----##----#-##-###-#-##-#--###-###-##--#######----#-#----#--#---##-######-#--#--##--#-#--#-#-##-#####-####-#-#---###-##------------------------------------------###-##-#--#-######-#--###---#-##-#-##---#---##-#--#--#--##-#---##----#-#---###-#--#####-#---###-----##---##--#---##------##--##-#---#--#--###-##--#-##----------------------------------------####---###--##--###--##--#--##-#-##----##-#-###-#-##-##-#-#--------#----#--#-##--#-#--##-#---####--##-#--######-##---#---##-#-##--########-#--#--#-#-----###--#-#-#------------#----------------#-#-#-#-###-#--#---#####--##-#-##-##-###-####-##-#-##-##--#------#----#----##--###----###-###---#--#--#-#-##---#--#----#-#--##-#---##-#--##---#--#-#-###--#-#####-#--#---#-#--##--##-#--#---#--###----##-#--#-##-#-#####-#-##-#-----#-#-#---#-#-#-#-##---#-###-###---##-#--###-#-#-###--#--##-----#-#-##-----#-#-#--##----#-#-#-##----##--###---##-#-#---#-#--#--####---#######-#-##-----#--###-#----#---#####-#--###--####-#-##--#--###---#----##-#--###---#---##-#-##---##-##-##-##-##-----##-##--#--##----#---####-----##-#-#####-----#-###-#--#--##-########-#-#-######------#-##-###--##----#-##--#-####-#------#--##-##-##--#--###-#-----####--###-------##--###--#--##-##--#--#---#---##--#-#-##-######---#-##-##-#-#-#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###--##--##-###-#-----##---##-##-##-#--##-#-##--###-#--##-###-###-#-####-#-##--##---#--####---##--#-#--#-##-----####-#-##-###--##--##-#-----#-#----#--#-########----------#----#-##--#---#--#-#---#-#-###-##-#-##--#-#-#-#--#----###--#--########-#--#-#-##-##-##-##-#-##-----####------##---#------###--#---------------------#-----------------------#----##-##--#----###--######-#-----------###-#--#---#####-##--##---#--######---##---#-#--##-##--#-##-#-##----###---#-#-##-----#-##-####-###---##-------------------------------------###---##-#-#-####----##-###----##--#---#-##-#---#-##-##---###-#-#--#--###-###--##-##--------#####-#--#-#------###---##-####-##-##---------#-#----####--#---#-------------------####--####------------#-######--------###########--##-#-##-###-#-#-###------###---##-#-##-#-#-##-#-#-#--######---###-#-#----#---#-#------#---###-##--##----###-##-#-##----#--#-####-#----#-#--####--#-###----#--#--#####--#-#-#---###-######---##-#---#-#####------#-#--#--##--##--#--#--#----#####-##-###-#---##-#-----#-##-#-#----#-#-##---#-##-#-#-#-##-#-#-##--###--#---#-####-####-###-----###--#-###-#-##--#--#-------#---#-#-######-#--#-#####---##----#-#-#--#--#--##---##-###-#-#--#--#----#---###-##-###-##--####---#--##-##--#----#----##-#-##--#---#-####---#---#-#-##-####-###-##-#####-####-##-###-#---#--#-----#####-##-#--##-#--#---#--#--#-###--#--#---#-#-##-#-----#--#-##-####--##-#---#-#-#######-----###---###--##-##-####-#-#-#-#-####-##-------#--###--#-----#---####---##-###-##---#-#-#####-#--###---#--##-###-------#----######--#-##----#---#--#-#---#---#-####-#-#-----#-------#----#####-##-#-#---##-#-#-#--#-##-#--#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##---#---#####-#---##----##-###--#-##-#####-#-#-#-##-####-#######----#######--#-####-----###-#-#-######---####-#-##--#-###--#--#---#-##---#----###-###----####-#-##-#-##------#-----#---########----#-#-#####-##-##--#-####--####-#--##--#----#-------#---#--#--####-#---##---#-#-#---#--#######-#-##--#-#--------------------#----------------------#---####-#-#-##-#--#-#-#--#-##---###-##-##-#-----#-##-###-#-------###-######--###---##--#--#-###--#-#--#---###-#-#--######-####-##-#--#-#-#-#-##-##--------------------------------------------###-####--#--####-#--###-###-#-#-##---#-#-#-#--##--#-#---##--#-#--#-------#--##--#####-##-#-#-#--##---########-#-#-#--##-####--###-#--###-#----#--#----------------------------------------#-#-###-#--#######----###--#####-#-#-#--##-#---#----#######-----#-#-####-----#-----#-##########--##--###-#--######----------#-####-####-##-###---#-#-----###-------------------#-----------------##-##-#####-#--##--#-######--#--##--###--###--##--###-#--#-#####-#---###-#------####----#--#----##--##-###---#-#-#-------##--##-#--##-##--##----#-#-###-#---#-##-#--#---#-##-##--#--#--#-#-#---#-##-###-###-#-#--##---####-#--##-#-##-------###--#####--#-######-#--#-##-----##-###-##-#--#-##---#-----###----#-#-##-#-#--#-####-##--##--##-#--##-#-#-#-####-#--####---#######-#-##----#-##--#-#--##-####-#---####---##-##-####-##-##-#-#-#-#-###-##--##--##-##-#---##--#--###----##-#-##-####-##----##---#-#---#-#-#-#######-------##-#-#--#-----#---####--#-----#---####-#--#-#-##--#-##-###----#-#------#-##--#-##-####--####---#####-#-##-##--#-###--####-#####-#--#-#-####--#--##--##-#--##---######-#--###----#--###-##-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-###-####---#-#---#-#####---#-###-#-##--###--##--###--##-#------##--##------#-##-#-####-####---#---##---#-####-#-#----##---#-#-##--####---####--##-#-###-#-###--#-##-##-#--##-##--###-##---#-##--#-#-####--####-------##-####---#-##-##---#-#---#-#-#-#--##----#-#-#-##-#--#---#-####--##-#--#-#--#-###---------------------#-----------------------##--##-#########---#--#-#---######-###---###--###--#-#-#---#-######-####--#--##-----###-#-##---#--###-#-#####-##-#--##--#------#-##--###--#####--#-----------------------------------###--------#-##-##-#---#-###-##-#-####-#--#--##-#-###-##-########---#--#-----###--##--##-#---##-##---##--###-####---#----######-#-##-###--------#####-##---#-------------------####--####------------#-##-###-###---#-#-###--###---#--#-#-###-####---##-########-###---##-####-####--##-##--##--#--##-#-#--#-#--#-----#-##-#-#--#--##-#---#--#---##---#--#--#-####-#----#-#--####--#-###----#--#--#--#--#-##-##-#--#--#--##----#-###---##--####--##-#-#-##-#------#--#--######--####-###----##-----#----#---#-##-#--###-##-#--#---##--######--#-##-#---#---#-####-####-###-----###--#-###-#-#-########-#####---###-#-#--#----####-#--##-#-##-####-----#-#--#-#-##--###-#-#-##--#####---##--####--#---######---#--###--#-#----#----#--#--#--------###---#---#-#-##-####-###-##-#####-####-##--#--#-#-##-#--#-#---#-#######-##-#--#--#----##-#-#---##-##-#-#-###-##-###----###-##--#--###-----#######-##-#####--#---###-----##---#####-#---#-###---#-----#---####--#-----#---####----#--##-##-#-#####-#-##-####-----------#-#-#-#-#-###-#-#---##--#---##-#-#-#-######-----###--#--#---##-#-###-#--##-##---#--###-#-#---#####-##---#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-#####--##----##-########---#-#####--#----#--#--##-#--#######--###-----##--#--#-#---##-#----#-###--##-#####-##---#-###--##----#########-#-#-#--#-###------##--##--#-##-#-#-##---#--######------####----#---#-###------#-##---#############-###---#-##-#---#--##------##-###-----#-#-#-##-----#-#--##---#--------------------#-----------------------#----##-###---#---#----#--####-###--####-##-#--##--#####-#-------##-#####---####-###--#--######--#-#----######-#-#-######-#--###---#-##-##----####------------------------------------------#-###---#-----##-####-#-#--##-###--#-#--##-#####-----#####-#-##-#-#-##-----##-----#-##--#--#---##----#-##-#-##-####-#--###---###-##-###------#-#-#--#---------------------------------------###-##--##--#---##----##-#-###-##--###-##-##-###-#-#--##-#--##-###-###--#-#-#--######-#-###--###--##-#-##-#-#--------####-###-##-#########-####---###-----###-------------------#-------------#--#----###---------##---###----##-#--####-###-#--#--##--##-#-##--######--#------#-####---##--##-###########---#--#---###--###-####-###-###--##----##-#-###-#---#-##-#--#---#-##-##--#--#--###-##------####-##----######--#--#-#-#----#####----##---##-#-#--#-#-###-###--##-####-##---#-#-----#---###-##-###--#-###-#-#---#---##-#-#--#--#-##-###--##-#-#-#-####-#--####---#######-#-##---###-#----#--#---#------#--######---#--#-#-##-#-#---###---###---##-#####---##--#########-#-##-#--###----##-------#----###-######-#--##-#-##-#---#------#-----#---####--#-----#---#####-#-#-#---#-########--####--####-####--#--#--##-#------###-#---#-#--#--##---#-########-####--######--#-#--###---#-#-#-####-#---#---###-#-#-#--#---#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-####-#--#--#-#-##-##---###-#---#------#-----##--####-----##-#-##-#-###--##-#-#-##-##--#----###-#----##-#--#####-##-#--#-##--##--##------#-#####-#-#-#--#---#-#--###----###-----#-##---##--##---#-########-###-###--##-#-##---#-##-#-----#--#-#-------###--#----#--#--#---##---#---##--#---#---####--#--#-##--------------------#-----------------------###-##-##----#-#-###-#######-#-###--####-#-#-#-##-----###-###--####-#-#####-####-##-#####-###-----####--#------#----#-###--#--###--#--#####-#-#--#-----------------------------------###--#######----#-######---#-#-####--#--#---##-####-##-----#--##-#--#-#####-###--###-###--#-#-#-#---####-###----#####-----#####-###-----##-##----------#---#-------------------####--####----------####-#--#-###-###----#-#-----####-#--#--#######-#--#-#--##----##-----##------#-#-###-###-#-----#-########---##-##----##-------#-#---#-##----##-#-#-#--#--#-####-#----#-#--####--#-###----#--#-##---##--##-####-#--##-###--#-##--##-#-#####-#----##-#-##-#----#--##-#--######-###-#---#-##-#--###-#####-##-##-#-##-#-#-#--#---####-##---#-###--#-##--#---#-####-####-###-----###--#-###-#-##--##---#-#####-#-#---#--#-#-#####--#--#-###-##----###--##-#----#--#---#----#-####-####-#-#-#####----#-----###-##--##--#------##---####--#-#-#------###---#---#-#-##-####-###-##-#####-####-##---#---#--##-#---#-##-#-#-####-####-----#-#--#-###-#--#--##-#---#-#-##--#-##--#--#--#-###-------###-#--#-##-#--##--###-#--##-#---###---##--#----#-#---#-----#---####--#-----#---####---##--######--#-#---##---##-##-#---##-##--###-##----#--##--#---#-#-####-#--#---------######---#####-####-##-#---#--##------##--#--#----##--#--#-#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###---###--#-######---##-#-#-##-##-##-#----###-##-##-#######-#-#----##--#----##-##-#-####-#--#-##-#--##----###--#-##-#---###-#-#----####-#-###-###--######-#----###-####----###--#---#-#-###----####-----##--######-###---#####---#--########-####--###---#-##-#----#-###-#-#-#-##-##-----##-#-#--##-#-#-#--------------------#---------------------#--####-#-#-##-###--###-##---##-##-#-#--##-#-#----#--#-###------#-#-#-----#--##---##---##--#-###-#-#--##--##-####--#-######--#---####---#---#--#-##-----------------------------------------###-###---#--###-####-#---####-#--##----###-####-#-#-----#####-------#####--###-###--###-##----#----#--#-####----#-#-#-###-###-##--###-#-#--##-#---#--#---------------------------------------#-#-#-#-#---#-##-###-#---#---##-#-##---#--####---##--##----####--##--###-##--##---##--##-##--######-----#-##--##-##--#-#-#-##-##-####-##----#-#-#-#-#-----###-------------------#-------------##-#-##-######--##--##--##--#----###----##-###-#--#-###--##-#-##-##-#---#---##---##-#-#-#--#-#---#--#-#-###--#-##--###-##-#-#-#---#--###----##-##--##-#-###-#---#-##-#--#---#-##-##--#--#--###----#-##-####--##-#--####-###---##-#--###-###--##---##-###-#-#---#-######--#-###--#-#---###---####--#####-#--#-##--###-#-##-#-###-#####--##---###-#--##-#-#-#-####-#--####---#######-#-##---#-#-#-#-----######--#---####-#---------##-#-##-######--#--#-##-####--#-##-----####-#-##-###-------##--###-#-#--##-#-----#-#-##---###-##---#--##-#---#------#-###-########-#-#-#####--#-##-#-#-###-#---#-#-######-#-#----#--#-#--#######-#-#-##---#-#--##-#-###--#-#--##--##---#-#----#-#-#-#-#-#--#-#---###----###-#--##---##-#-##---##-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###------#-#---##-####-#--#-##-#---###--#-##---##--#-#-#-#-#----------#-#---#-#-##--####------#--#-#-###-#-#---#-#-###---####-##--###--##-########-##-#-#####-#-#------###--##-#--#-#--#-######---#----##--#-------#-#-######--#------##-###----#-#-#--#--#-#---##--##-##-####-##---##-#-#---#-##-##-##--#---------------------#----------------------###---#----#--------#--##-##-##-#-##----##-#-##--#-##-------###---##-#-###-#---#-#--#-#--##--#--##-####-#-####---##---####-------#-----##--##--##-------------------------------------###---##---#-###---##-#-----##-#--###--##-##-#--##--##-----#-##--###---#####-#---#-#-#-##-####----#-#-#----#####---#--#-##-#--#----##---#--#-#--#-#-#-##---#-------------------####--####------------###--###-##---####-#---#--#-###-##-##-##-----#-#--#--###----#-#-#-#---#---##-#-#-#--#####-#---##---####----##--####-##-#-##-#------#-##--##---##-#--#--#-####-#----#-#--####--#-###----#--#--#-#--##--#-###--####-###----##----###--#-#----##---####--#-#-####--#-#-##-##-##-##-##---##-##-##-#--####---##-##########-#-##--###-----#---#--####---#---#-####-####-###-----###--#-###-#-#------##--#####-##--###-#-##---###--#-#####-#-#--##--#----#--###--#---#-##-###-------##-###-#---##--#-###-#--#----#-#-###--#-##---#-##---#--#-------###---#---#-#-##-####-###-##-#####-####-####-##----#-#-#-##-#-#-##--#-#-------###-#--##-##--##---------###-##--####----#---#-##-##------#---#-##-#---##-###-###---#####---##--#--###-####---##------#--###--#-----#---####---##---#---#-##---#-#--#-##-#--#-#-####-##-#-#---##---###--###-##-----#####-#-##--#-#-###-#--####-##-------####-#------#--####-###--###-----#-####----##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###-##-----#---#----##-#-#--#-#-##-#-####----##-##-----#-######--#-#--##--##-###-#---##-#--#-----######--#--##----#--##-#-#---#####----###-##-----###--###-#-#----#-##--##-#-##-####-###---#---#-#-####-##-#-#-####--#-#-#-#--#-#-#--#-####--#-#-#--###-#--#-##-###-#-#-#-##-#--#####-##--#--#--###-#-------------------------#---------------------#-#-##--##--#-####----##---##-#--##-#-#-#-#--###-##---#-#-#---###-####--#--#-###-#-##--#--#-#-##---##-##--#----#--#-#--#-##-----#--##--#-##--##-#-##----------------------------------------#----##---####-------#-###---#----#-#-----#-##--#-#-##--####-----#-#-##-----#-#-##-###--##---#-##-##-#-##---#----#-#-####---#-#---######---##---##----#-----------------------------------------#-#--#--###-#-####-#-#-##-#####-#--#-#---###-##-##--####-##--#-##---##-#----#--#----###-#-###----##-#-#-####---#-#--#-#-#-###-##--#--#--####--#####-----###-------------------#-------------#-##----#--#---#---#---####--####-#--------#-##-##-#-#-#--#-#--#-#####-####--####-#-##--###--##----##-##-#####-####--#--###----####-#---#-####-#---##-#-###-#---#-##-#--#---#-##-##--#--#--##--##---#######-#-###--#-####-#-##-###-##-#--##-####---##-#-#-#-----##-###-##--##-----#-##--#-#-#-#---#--#------##--#-------#######-##-##-##-#--###-#--##-#-#-#-####-#--####---#######-#-##---###-##--####-#-##----##-----######------#-#--#-#-#####--#--#-##-##--#--#---##--#-##---#######--#-----######---#-#--##-######------#-##--#########--#--#-----#---####--#-----#---####--###-#-#----#----####---##-#-#-##-##----#-###-#####-#-----#--##-#########-##--######---#---##---#-###---#--#-#--####------#-##-#---#---#----#---####-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-####-#-###-####-#--###----#-####----##-##-#---#-#-#-##--##--#------###--#----#--##--#-----#-#-#-####--##---###--#############-#-###-##-#-#---#####-#---#######-#--#######--###-#-#-#--#--#----##-####-#---####--##-#--####--###-#-#--##--###--#-##-##-##---##---###--##--#-#--#-#-####-#-###----##---#---#---------------------#---------------------###-##----########--#-####-##-#--###-##-##-##-##-##-##-#-##--#-#---###--############-#-##-###---##-###-###--##----##-----##--#---###-#-#--------#--------------------------------------###--###--##-#--##-####-----#-###--##-#####-#-##--#-----##----###-----###-###-##-###-######-#-----##--##--#-#---###---##---#--###-#--#--##-##--##########--#-------------------####--####----------##-#-##-#-#-#-#----##-##-#-#-#--#-##------#--###----#-##-####--#-#####-###--##--##-##---####-#-##-##-#-##---#-#-##-#####--#-----###-#####--#--#-#-----#--#-####-#----#-#--####--#-###----#--#-#-####--#-#######---###-###---#--#---####-##-#-#---#-####-#-##-##----#-#-#-#-###--####----#--#-#--##-#-#-#-###--#--###--###--##--##-#--#--#-##----#---#---#-####-####-###-----###--#-###-#-###---##--#--###-#-----#########--#-#-#-#-##--#---#----#--#-#-#-----#-#--####--##-#-####---#-##--##----#-#-##-###-##-#-#-####-#-#--####-#---#-#--##--###---#---#-#-##-####-###-##-#####-####-###--#----###-##-###--#-#-#--#--#--#---#-##-####-----##-##-###--#-###-##--#-###-#---####---------##-#----###--###-#---##--#-------###--#--##-#-##--###--#-----#---####--#-----#---#####-#-#-##--#--###-###--#---#-#--#--#----##-##-####---#-####-##---#-#####-##--#-#---#-##----##-#-###-##-#---###--#-#-###-######-#--#-###---#--###----##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###-------#---#--#-#--#-##--#-#---######-##-##-#-#----######-#-#--#-##-##-#-#--###-##--##--##--#-####-#-#--##--#-#-#-##--##-###-##-####-###---#-##-##-#-#-##----#-#-###-#####-#-####--###-#--#-##--#-#------#--#---#-#-##-##--####-#-##-----########-##-#-#-#######-#-#--##-###-##--#-###--#--------##------------------------#---------------------#-#--#--#---##-##---##--##-#-----#-----###-##-#---#-####-#-##-###-#--#-#--###---#-#----#--#-#-#-#-##--#--##--###-####--##-#--#----#----#####-###-###----------------------------------------##-#--#---#-#-##--#----#--#-#--#--#------##-##-#------#-####--##-##-##-##-#-#-#------#-----#-##--#-##-####-#--###-#-#----###-##-#-------####-###------#---------------------------------------##--##--#-###-------#--#---#--#-#-----#---##-##-#--#--#--##--#--#--#-#-#--###-#####-#####----###--#-----#----#-#--#--###---##--#-###-#--##--###---#-#-----###-------------------#-------------#--#--#--####-##-#-##--#--##--#--###----#--##----##--######-##-#--#-#---#-##-#---#-###--###-####-------####--#-####--##-#####-#---#-##-----####-##--#-#-###-#---#-##-#--#---#-##-##--#--#--##-####------#-#-##----##----#-#-#-#-#--##-#--####-------##-###--######------#-###-#--##-####--#----#--##------##-###-##-#--#--###-###-#-###----#-####--##-#-#-#-####-#--####---#######-#-##----#----##-###--##---##---#---#----##--#--#--#-##-#--#-#--##-#-##-###------#-##-#-#-###-##-#-#--#---###--#--#-#---#--##-##---####--##--##-##--####-#-#--#-----#---####--#-----#---####--#-#--###--##--#-##-#-#-#-----#####---##--###-#---#-#-#-##------##--##--##-#----#-#-###--#-##-###-------##-#--#--#####-##--#-#--#-#-----#####----#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-####---#------#######---###--#-#-#-#####----##--#-###---##-######-#--##---#------#-###--##---##-#---#--#---#####--####-##-#--##-#--########-#-#-#-#----##-------#-##--##----####--##--####-##----##-#--##--#-#-###-###-#-#--####---#---###--###-#-----##-#####---#-##--#-#####-#--#--##--#-#-##--#-####-##---------------------#---------------------#-#---#-##--###--------###-##-##--##--####-#####-##---##-##-##---#---#-####---##-#-#-#-#---#---##--##--#-##--#--#---#-#-###--#-#---####--#-#-#-###-------------------------------------###--#-###-#---#--##-##----##---##-#-#-#--#---##--###----##---#---##--####-#-##--#-#--#-----##-##--##-#--#---##-#-##--##---##-----###----#####--#--##--#---#-------------------####--####----------#-##----#-#-#----#---#----#-##--#--#-#---##--#---#-###--####-#--#--#----#-##--#-#----##--###--#-#-##-####--#----####-#---##-###---#####-------##---#--#--#-####-#----#-#--####--#-###----#--#-##---###---#--###-------#--###-#---------######--##--#-#-##-----#-#--###-#-#-##-##---#-#-#---###---#-#-##--##-----##-#####---##--##---###-#-###---#---#---#-####-####-###-----###--#-###-#-######-#-##--#-#--#---####--#----#-##-#-#--#--#--#----#---###-####-##--##------##-######--##-###--##--###-####-###--####-#-#-----#--#-#-##--####-#---###---#---#-#-##-####-###-##-#####-####-###-##-##-#-#-#-#-----#-#--#-##--------#--#-#--##--#-#---####--####--#-##---#--#--#-#---#####-###-#---#--##-#-#####---#--######-#-##--#--#-#-#-#-#-###--#-----#---####--#-----#---#####-###-###--#--###-##------#--#------##--#-##-###---###--###-------#---##--###--#--#-#--#-##-#-##--#---##-#--#-###-###--#--##-#----#####-###---------#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-########----#-#-#-#---#-##--#-#-########--####-###-#--####-##--#--##---#--#-#-#-#--##--##---##-##---#-#--#--#-##-#---#-#-##--###-#---###--#-##-#----###-#-#----#--##-#-#--#####-#-###--#---#----######---#--#--#######-----#-#---#-#-#-#-##---#--###--#--#-##-#-#####-####-#-##---#####----#--#---#--##--#--------------------#---------------------#-#-#-#-#-###------####----#-##-#-#--#-##-##---#--#-##---#--#-#---##-##-#-#-#--#-#--#------##---#####---#----#-###------#-#-#---####-#-#--#########-----------------------------------------#######---#-#-#---#----###---##-##-###-##-#--#####-#-###-###-#-#-#-#####--##--#-#--#######--#--#-##-###--#---#-#----#####-#-#--######---#-##-###-#----#-----------------------------------------##----#-#------#-###-###-#--###-###--#####-#-#-#-##-#-#######--##-------#--####--#-----#####-#---###-##-#-###-#-#----#---#####-##--##----#####--#-#-----###-------------------#--------------##--#---#-#--##---#-##-##-#####--##-###--##---####-##-##-#--###--#-#-##---#--##-#--##-##-#----#####-----#--####-#---#----#-#-#-###--#######-##-----#-#-###-#---#-##-#--#---#-##-##--#--#--#--#---#--#--###--##-#-#-#---#-#--##-#--#---#-###-#-##----#-###--#--#--##--#-###-----#-#-#-#-#--####--######-##-#---#--#--###-#-#-#---#-#-##--####-###--##-#-#-#-####-#--####---#######-#-##---####----#---#--#----###-###-#--#-##--#--#----##-##--#-#-#--######-###-###--#--#--#-##-#-###-######------#--##--##-#-#---##-#-#----###-#-#--######---#------#-###-########-#-#-#####---###---###--#--####-#####---#--####-----#--##-#---###--##-##--#--###########---#-####-#--#---###----#---##-##--------#-#---###--###-#-#---#--##--###-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-##-####-##------#--#--######--####-#-------#####--#--#--#---#-#-###-#-#########--#------#--####-#-##-#----#-#--##----#---#--#-#-##-#---#-###---#----###--###-##---#------###-###---#####--#-#--##--#---##--##-###--#####---#---###---#-#--#---#-#--#--####-##--------##--#-#---#--##-#-#-##-##--#-##-##--------------------#-----------------------##-##----##--#-#-###-##-#--###-----#---###-##---#-#-#####-#--##--######-----#####-###----#-##-#####-#-#-###--##-#-#--##-#-----##-##-#----###-##--#-----------------------------------###---###-##-#-#####-#-###-##--#--#-#-----------#-####--#-###-##-##-#----#-#------##--#-###-#--#-##-##--#-##-########-###-#---##----####---#-#--#---#####--#-------------------####--####----------##-#--#-----###--#--######--#####--#-#----#-##---#-##-#--#--##---#-####--##--#####-###----###-##-#---##-#-##-#---#-#-----------###-###-#--##---##--#--#--#-####-#----#-#--####--#-###----#--#-#---#-#-#####----#-####----#--#-###--#--#--##--#-##----#--#-#-#-####-###--###---##-##--##---#-#-###-#-#-#-#-##--##-#--#-#-#-----###--#----##-#-##-##--#---#-####-####-###-----###--#-###-#-###-#-#--#####-#-####---###--##-#-##-##---######-##----#-##-#-##---#--#-##--###-#-#--###-##--#-#----####--##--##########-#-----##-#--#-##-##-##-#----###---#---#-#-##-####-###-##-#####-####-####-#-##-#-#-##-#-#--######--#####-##-#-##-######---###-#-###---#--#-########---#-###---###-#----#--###---#--##--#-#####-------#-##-##-#----#-##-####------#--###--#-----#---####---###--#-#---##-###-###---##-##-#-#---##--##-####---#---#-#-#-###-###--##--##-##---##----##-##---###--##-####-##-#----#---##--##--##--###---#--###--#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###--##-#---#-#--#----##--#--##-####--#--#--####--#--#-###-###-#--####---#----#----#-###--###---#-###-#-#---------##-#-#---##-#---#--###--#####-###-######----#--##-###---##-##---##---##-##---##-##-###--#-#-####-####-#####-#--####--####-##-##----##-###-##-#---##-##--##--###----##-#-####-#----##-#-#--------------------#---------------------#-#-##----#-#-#-------#--####-#--#----#-#-###-##--#-#-#-####---#-#--####---###-#--##--#-###----###--#-###--###-####-#--#--#--#---#-##-#-##--------##----------------------------------------#-##--#-#---###--#---###-#-##--##---##-#--####--##----#######--#-#--#--##-#-#-#----#-###-#-##--#-##--#-#--###-##---######-#-####--#-##-#-#--##-##-----#---------------------------------------##-#--####-#---####-#---##--#--##-###--##--###-----#-#-#####---####-####-#--#-#-####-#-#---#####-#--#--##----#-#-#####-#-###---###-#---####-#-----#-#-----###-------------------#-------------#--##-----#-#-##----##--###########--#--####-#---#####-####-##--###----#-----#--###--#---##-#--#-###-####----##--#----##-##-#----##-#-#-#####--##--##-#-###-#---#-##-#--#---#-##-##--#--#--#-##-#-#--##--##--#####---###----##--#---#---###-#---####-##----#-####-#-##-##-----#---#----####-##---#-###--###--#--###-#--#--##-#-##-#-###-#--#-####--##-#-#-#-####-#--####---#######-#-##---##-#-##-#---##-##---#---##-#---------#--#-#--#-###-###-###-#######-#-##---#--#--#-###-----##--###-#-#--#####--###--#------##-#-##-#--##-#-##-##-------#-----#---####--#-----#---####--###--#-###-#--##----#####-----#####--#--#--####----#-###-#---###----#-#--##-#--#--#--#--##-###-#####-#----#--#-##-###--#-##-##-#--#-#------#--#-#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###--##-#-#--##---#-#-##-#-#-###-#--##----##---###-##--####-###-#-----###-#-###--####----#---###-#---#-#--##--#-#-#-#-###-#--#--#---#-#-#--#--##-#-#--#--##-#####-##-####-##---#---##-####--#----#-####-#-##--#-#---#-##-####-#-#--##-#--#-###-###-#--##----#-##-####--#--#------##-#####-##--#-#-#--###-#---------------------#---------------------#-#####--#-----###---########-#-###-###-#----####-#--##---#--#-###-----###----##-#-#-#-#-#--#-----#-----#--#--###-##---#--#--#--#--#-#----####-#-#-------------------------------------###----##-##-------#-##----#--##----##---#-###-##--##--##----#-#---##-###-#-#-#-##-#--#-#--#######-#-##---#--#-########-#--#-##--#----#-##-#--#-#-###--##--#-------------------####--####-------------#--##---#-----##-#-##--#-#---#---###---##----#-##-#####--##-#----#-##-#--#-#--####-#-###-####--###---#---#-#######-----##-#-#-###-#--#-#-##-###-#--#--#-####-#----#-#--####--#-###----#--#---#-##-##-##-#-###-#---#--#####----##------#-##--##---##--#--####-##-###-#####--#######-#-##-#####-##--#-#--###-##--#-#----#-###-##---#-###-#----###--#---#-####-####-###-----###--#-###-#-#----####--##--#---##-#-#------##-##--##-###-##--#--#--##-#-####--#-#--##-##-###----##-#-#---#-#-#-#-------#-##-#-#-----##-##-#-#---#-----####----#-####---#---#-#-##-####-###-##-#####-####-##-###-###-#-#---###-#--#--##-#--#----###-#-####-#-#-##---##-#####-#-#-#-#-#-####-#-##--##-#-#----#-#----#####--#-#-##-###--#-#-##-###-#--#--##-#---#---#-----#---####--#-----#---####-#--#-####--------####---####-#----######-###-----##-#-#-##--####-#-##-##---#-----#--#-##-##--#---##--#####-#-##-#-##-##-#########-#####-#--#-#-#---#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##--#----#--#-###-#-#--#-#-##-#-#--#-####-#-##---#--#-###-#--#-#########-#--##-#####--#-####----##----#-##-##--###--#--#-##--------#######-#-#-#-#-###---#---#--#-----#--#----#-##-#-----#--#-#-#-#-#---##-##----####--#--#-#-##--#---#--##--###----#-#-##-#--#--###-####-###-###---#---#-#-##-###-#--#--#--------------------#----------------------###---#####----#--#----###--#--#####--#---------##--#-###--###-#-#-#-####-#--#####-#-##--##-#--#--##------#-##-##-#####--#--##---#------#-----##-##------------------------------------------#-#-#-###-----#-##-##------##--#-#-######-#--#####----###-##-#---##---###-#-#-##-#-##--##-#-##----#--#-#--###--####-#--##-#---#-#-######-#-#-###----#-----------------------------------------######---##--#-##-#-----#-###-#-#####--###--####---#-####-#-###-#---##-#######-#---#-#---##---#--####-#---#--##--##--#--##--#-####--#-#----###--###-----###-------------------#---------------#---#--##--###-#############-#----#--#-##-#--##-#-#-###-#-#-#--###--#--#----#----#-#-##----##-##---###-##----#########----###-###-#-##--###-###--##-#-###-#---#-##-#--#---#-##-##--#--#--#---------#----#-############---##-#--#--###--##---##---#-#--#-#--##----#-##-#-#---##--#--##-#--###-#-----###--#-##-####-#--#------####--###-#-##-####--##-#-#-#-####-#--####---#######-#-##----#-###---###---##-####-##--#-##-------###---###--#-##-#-####---#-------##-####---#-##-------###-#-##-####-###--##---#--#----#--#-#-###-###-####----#--#-----#---####--#-----#---####-##-#-##-----########---##-#-#--##--#--#####-#--#---#--#-#-##-#####-#------##-###-#----####-##----#-----###-#-#-#-#-##-#-#--#-####-#--####-##-#-#-#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###--#-#-#--#-##--##-#--###-####-#####---##-####--####---#---#-#-##--#####-#-#-##--#----#--##--#---##-##-------##--###-#---##-##---#--##-#-#-#-##---#---#--#---##--####-######-#---#----#-#--#--#---#-#-----#-#####--#-----###-#-#---###-#-#-##--#--#-##--##-###-----#####-#-#-#-#-##-########---##-#--###---------------------#----------------------####----####--#-###--#---##-#####--#---#--###-#--#-##-###-#--###-##-####-#-##-##-----#-----##-####----#------#-----#-###-#-#####--#####---#-##-##-#-----------------------------------###---##-###----####-##-###--##---#---#-####-----#-#####-#-##---##-##--##-#----#---#-#--#-#--######-#---##--####-####-#-#---#-#--#-#-#----#--#--##--#-###--#-------------------####--####-----------#-#-##-#---####--###-#---#--#--#--####---##---#-#######-#-##--#-#---#---#----#----###--#---##--###-#####---#--#######---####--##-#-#--##-####-----#--#--#-####-#----#-#--####--#-###----#--#---------#--##-#------########--#-#-####-#-#------##--###-##-#####-#-##-######-#--###-#---#----#-#-#-#--##--#--#####-#---##-##-#-###-#-#---##-##---##--#---#-####-####-###-----###--#-###-#-#-###-##--######-##-##-###-####--------###-----#--#--##--##--###-######--##-##--#---##-#---##--###-#---#---#-#-#-#-#---####-###-##-###--#---#####-#-####---#---#-#-##-####-###-##-#####-####-##----#----#-#####-#-----##-#####--####---#-###-##-#-------#-#--###-#----#-#####-##-####-##-##-#######---#-#------#--###-#---#---#-####--#####----#-#---#-----#---####--#-----#---####-#-##--#--#-#-##-#-----##--------#-#--###--#--##----##--###--##-#-#---####--#--#####--#-#-#-#-####-###--#-#---##-##--#-##-#---####-##-##--#-#---#---#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-##-##---#####-##----#-#-#-##---#---####-####-##---#-###-#--#-#-#--#-#-##----##-#-#####--#----#-#####-#---###--##-###-#---#----##-###-#-#-#-########-#-##-----####-#-#--###-#--###-----#-#--##---##-#######--#--#-##----##-##-##-#-#---##-##-##-----#---#--##-#--##------##--####-####-----####--#-##-----------------------#------------------------###-----#-#-##-##-####-#---##--##--###--##-#####-#-####---##-##---#--####-###-#--##-#-#-#--#--#--#--##-------##-######-#---####-#---#---###-##-#-------------------------------------------#####---#--###----#---#---##--#---##---#--#####---#-#--##---##-----##-##--###-#-###-#-#--#-###-###--#-##-#--##-###-##--#####---###-#------#---##----#----------------------------------------#----#----#-----#-###--#-##---##----#-#-----##---###-##-#-#####---##-#-------#--##-#----##-#-##--##-##-#--###--##--#-##----##-##--#-####-##--##--#-#-----###-------------------#---------------###---####-#-#--##-####---##-####---#-##-##-#-##--#--#--#-#-#-##---#######-#--###--#---#-##--##---##--#--------########--###-####----#--####--#--##-#-###-#---#-##-#--#---#-##-##--#--#--#--#-#----###-##-#---##----#####--#--##-##----#-#####---####-##-#-##------###-#######-##--#-##--#---##----#-#--#--#---##----#--#-#-#-#-##-##---#--####--##-#-#-#-####-#--####---#######-#-##----####-#-##-###-##----###---#--###----##-#--#-#-#----##-####--#####------#--###--#-###-##-#-#---#------#-#---#####-#-#--#--#-#####--#-####--###--##-##------#-###-########-#-#-#####---#-#-##---#-##-###---------######--#-----##-##-#--#-----#----#-##-#---#----#--#----##-####-#-#-#-#--######-#--#####---#---#####-###-##-#--###--###-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-#######-#-##----#-####--#####-##-----#--#---#-#-##-------#--#-##--##----##--##-#-#---####--##-#--##-####-##-#----##---##-#--#-##-##-###-#--#-##-##-----#-##-#--##--##-##--##-###-#---###---#--------#--##--####-#--#----#-##-#-#-#-#-#-###-#-###-##--#-#---#----##--##--#-#----###--##-###-#---#----###--##--------------------#---------------------##--#---###-###-----#-#####-#-###-##---###-#--#--##-####-#--###--#--###----###-#-####---#-####------#---###--###---#-#-#--#-####-##---#-###-##-###-#-----------------------------------###-------##-###--#---#-####-#-##-###-#-#-#--##--###-##-------##----##---#-###---#-#-#-##-#-##--#----####-#-#-##-#---##--##-##-#####--#-#-#---#-##---#-##--#-------------------####--####-----------#--######-###-##---#----#---#--#-#-------##-#-###-#---#-##-#-###--##-#-####--#---#-##--#---##--#-###---#-#-#--#-------#-#--#--#---#--#---#--#--#--#--#--#-####-#----#-#--####--#-###----#--#-----##-#--##--####-##-----#-#-----##--#--#-#---------#-##-#-#------##-#-###--###--#--#--###---##-#-#-#-#-##--###----###---##-#--###-#######---######--#---#-####-####-###-----###--#-###-#-#-#---###---#--#-#-#--#-#-#------##--#--##----##------#---#--------#--#-####----#-######--#---#-#-###-#-##---####----#----#-##-#-#-##-#-#-#-#-#-----####---#---#-#-##-####-###-##-#####-####-##--#--#-#--##--##---###--#####-###-#-----#--#-###-#--######---#-------#--#-#-#---#######-##----##--##--#--###---##----###-----##-#-##-####--#----####------#--###--#-----#---####---##-#-#------#-#--#----------#---##--#---#-###-#-##------#-####--###-#-----#--#-###--##----#####-#######--###-##-#---###--##-#----#-####-#-##--#-#-#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-####-#--#--##-#-#------#------#-#-#--##--#--##-#-----##-#--####-##--##-##---#####-#-##-###-#####-----##-#---#-#--##--#-#-#-####--#----#-#----#---#--###---#-#---#-######-#-#--#-##----##-#---##-#-##-##--####-##-###-#--##-#-######---#-----#---#-###-#-#-#-#---##-#####-##--##--#-##---#--#-------##--#-#--------------------#---------------------#-------#-#-##--##--##--####--#------#-##--###-#-##-#--#-##--##-##-#####--##-#----#-#---#--#---#-#####-###-#-###--###--##-#--#-##----##-#--###---###----------------------------------------#----##--##--#-#------##-#--#--#---#--#----##-##-#----###-----###--#-#-#--#-###----##-#---####-#####-########-#--#--#####--#-#--#####---#---##--#-----#---------------------------------------#---#----##-#---###--#--###-###-#--##-#-----#-##-#-#---#-#####--#-#-#-----##-#---###----#-----#--##-#---#-#--#-#-##-#####---###---##-#-#-------##-#-#-----###-------------------#--------------##-#--##--#--##-#-#-#-#----#---#--########-#---#--#-######--#-#---#####--##-##-#-#-----##----#---###----##---##----#####-###---#-#-####--#-#-##-#-##-#-###-#---#-##-#--#---#-##-##--#--#--#-#--##-###--###--##-#------##---##-#####--#--##-#-----#-###-#-####--#########-------#-#-#-##--#-##---#####--#---#######-#--#--#-#-#-#---####------###--##-#-#-#-####-#--####---#######-#-##----#-##--########-##--#---#-#--#--##-###-##---###-----##-####--#--#-#--#--#-#-#-#-###--#-#----#####--###---###---##-###-##-##-#-#-#--#----##--#---##----#-----#---####--#-----#---####-##-#---##---##---##-#---#-#--#--######-#-#-###-#--####-######--#-#-#--#-##-#-###-####-#-#--#---#--#-----#-#-#-#-#-#-----#-#-#-####-#-#-#-#-#-#-#####-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-----###-#-###-##-##-##-#####-###--##-#---#----#-###--#--##-#---##---#-##--####--##--#---##---#-----#----####-#--###-##--#-######------###----##-#--##-###--####-#-#--#---#-#----###--##--###---#-#-##---##-#-###-#----#--#-#--##-#-----#-#--#--#####---##-##-#--#---#-####-#----#----##---###--##--####--------------------#----------------------#--##-#-####-#-----####-#--##---#--#-#####---##-##--##------##-#--#-#-#-##--#-########-##-------#-#--#-######-######--####-#---##--#-#-###-####-#-------------------------------------###----#-###-##-#----#-##-##-####---#--#---#-##--#-####----#-#---#-##--#--#-##---#-#--#####---#-----#-#---##--#-##--#-#-###----###---##-###-#-#---##-###---#-------------------####--####-----------###-#-###-#-##--####-#---##-##-#--##-#-#-#---##-#-#---##----###-##----#--###-#--#-#-##--####-##-#-#-####-##-####-###--##-#-#--###-##-##-####-##---#--#--#-####-#----#-#--####--#-###----#--#---##--#---###-#-#-###--#---#---###########-----#-##--####-#-#-##-###-#-#--#--#-##-##-#-#---##--#####--#-##--##-##-#-#--##-##-###--#-#-#-##-##-#-###---#---#-####-####-###-----###--#-###-#-#-##--##-##----#-#--#-#----#---#---###-###-#-#-#-#---#-##-###-###-##---#-#---##-#--#---#--##-#--#-#-#-#-#-#---#-#--#-#-----###--####-#---##--#-#--#--###---#---#-#-##-####-###-##-#####-####-##-#--##-####------#---#--########--##-#--#-#-##----##-#-#-###---#--#####-##-#-#---##----##-##---##########---###-#---#-#-#-#---####-###-#---#-#-##-##--#-----#---####--#-----#---####----#---##---###--###----#------#-##-#-#######---#-##--#-###---####--#----###----##--###-##--##-#-##--##--##--#----#-#--#####---###--###----###-##--#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##--#--#####-----#-####-#-##--#-#-##-----###---#-----#----#-###--###-#-##--#--##-#-#-#-#-#-#-------#-##----#-###---#--##--#-#--##--#--##----#----####--##--###-##---#-#-##-#-##-#-#-#---#--####-###-#--#-#-##---#---#-#-###-#####-#######-#--#----##-##---#-------#---#--#-#--##----#-#####-######-##-##----------------------#-----------------------###--##--##-#--##--##-#-#-#----#--##-####-#######-#-#--##---#--#-----#----##-##-#---###---#-####-#-####-#-###---##-----##-###--##-###-#----###--#------------------------------------------######-##-#-####-####--##--#--#---#-##-----#-##--###-####--##---##--###----#-#---###---#--###-#--###---#---##-----##--###-#--##--#-#-##-#####--#--#--#-----------------------------------------##-#-#--####--#--#-#---####--##---####------##--##--#--#---#--#-##--#----#-#-#----###--#-##-#-#-#-#--##-##-##-##-##---##---#-####-#---#-#-#--##-#-#-----###-------------------#-----------------#--#-#--#---#-##-#------####-##-####----#-#####---###-#-#--##-#-##---###-####-----#-----#-#-----##-##--##----------##-##-####-#-##---#--###-#--##-#-###-#---#-##-#--#---#-##-##--#--#--#-####-##--###-#--#---#-###-###---###--#-##-##--##--#-########-#-#---#-#--#-###-#####--#-#--#--#-#----###-##--#-#-#----###--##-#-#----#-##--#---##-###--##-#-#-#-####-#--####---#######-#-##-----##--##----##--#--###---#-#-##-----#####--##-####-#-##-##--###-----#####--##------##-#-----##--------####----#-#----#---##-#####-#--###-----###---#--#-----#---####--#-----#---####-##-#-#--######-##--------####-#-##-#----##-##-#####---#-#----###-#-###--#-##--#----#####-###-#--##-###-##-#-#--#--#-#-#--##---#--#--####-##-###--#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###----#--#---####-###-#-#######--#--##-#---#---######-##-###--#-#-###-##-####--#-####-#-##--##-#------#-#######-####-##-#-#-###-#####--##-##--#####------#-####-#-##-#--------#-#---###--#-------#-###-##-###--#---#-----#--#---#-##-####-#-#-#####---#---#---###-#-#-##---#####--####-#-##-#-#-###-#-#-##--------------------#----------------------------##---##-#-##--##--#-----##-##--##---##--##-#--##--#-#-###----#--##-##------#--#-#-##--#---###-###-##--#-##-#-#--#--#----#-##--#--####-##----------------------------------------###----#####--##-##--#--###-##--##--#-###-#--######--#-#####--###--#--##----##----##--##-#----#-###-###---#--#-#-##-#-###--###--##-#----##-#-#----###-##---#-------------------####--####-----------####-###-----##--##---#--#--##-#--#----#--#-#--#-###-#--#####-----####-###------#####-#######-#-#--#--##-###----####--#-#----#--##-#-####-###-#-#-#--#--#-####-#----#-#--####--#-###----#--#-----##-####--#-###-##----#--#-----##------###--#-##--#-#-##--#-#-#-----####---#-----##-#----#-#--#--##--#########-####-#########-##-#-###---##--#-##--#---#-####-####-###-----###--#-###-#-#-#-#---###-#-##-#--####-###-#--#-#--##-#-----##--##-###--####--#--##--#####----##-#####-##---###--####--#-##--#-#-####-##-#-##-###---#-###-#-#-###-####---#---#-#-##-####-###-##-#####-####-##--##--##--##------#-#--##----#----#--#-##-#--###-###--###--##-#---#####-###--####-#-###-#-###---#######----#-#-##-#######-#---##---####---###---####--#-----#---####--#-----#---######-##-----######-----####--###-####-##---##--#--##-###---##-#---#--#-#-#-####-----#-#----#-#-----###-######--#--####------#-##---#---#--###--#------#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###-###-###----##-##---#--#-###-#####--#-#-#---#-#-#--###-##-#-####-#-#-#--------####-##--#-#-#-##--###--#---#-----#--##---#---#-###--##-##-#-####--####-##-----#-#---#------##--#--#-###--#-#-###-##--#-#--##-#-#-#------##-#--#--###-######-#-##-#--#--##----##----#-####-##-##-#--#---##---#-###--#-#-#--------------------#----------------------#-#-#---######-#-#--##-####-#-#-#-#-##-#-##-#---##-##--####-#--#-###-#-#########----#-#-###---#####-----#--##---#---#--#-#-##----#----##-#----#--#------------------------------------------#-####-##-####---#----##--#------###--########-----####-#-#####-##-#-##-######---#-#-##-##--#-###--###-#-#---------#--######---####--#-----#-#-##-#--#-----------------------------------------#--########--##---#-#--####--##-##-#--#-##-##-#-----##-###----##-#--#-#-#--#-#-#------#-#-##-#---#---##---###-####-####-####-###------#####---#####-----###-------------------#----------------##-##-##--###-########---#-##--##-##--####-##--#--###--#-#-##---##-##--##--#--####-#--###-#-##--##--##----#---#-----###----#---#-----#-##--#-#---#-#-###-#---#-##-#--#---#-##-##--#--#--#-#-#####------#-####-###-#--##-####----#-###-#--##-#--##-#---####--#-#-#-#-#-##-##---##--#---##-##---#--##--##--#-#----#-#-#--##--#--#-##-###-----###--##-#-#-#-####-#--####---#######-#-##-----##--##-#-#----###----#-##---##-##--#-##--####--#-#--#--#####--#-#-#-##---###-##---#####-------##---#-#-###-#-##----###--##-#-#-##-#---#---#-#-----#------#-###-########-#-#-#####--##-#----#----###-##--##-#--------###---#-####-#-#-#-##--#####--#------#-#-##-#-----#-##--#-#-#-----#-##--#-#-#-#-#-#-#---##-#--#----##-#-#--#--###-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###----##-#--#####-###------####-#--#-#-#-#-###-##-##-##-#-##-#--#-#-###-#--#--#######-----#--#---#-#-##--#-#--#--#-##-###-#--#-#--#--###-#-####--#---##-----#--###-###----#---#---#--##-#----##-#--##----#-#--###-#--#-#----#-##-####-##-###-#######-##--##--##----#-#--#####-#----#----#####---#-##-#--#---------------------#---------------------#-#--#-----#-----##------#-#-##--#-----##--#--#--##----#-#-##---#--##--#-#-####-###--#-#-#--#########--#-----#-#----------#--##-#-######--#-###----#-----------------------------------###----##--#-###--#-#-#--##----##--#--#####-#-#---#####------##--#----#-----#----###--#####-##---#-#-####--#---#--#-####-##-##--####-#--#-#---#-#----#-#---#-------------------####--####-----------#-##-##--########-#####-#####--#-##-#--#-##-#-----#-##--##--#-#---##-#-#---######--####-###-#--##----#-#---#--#--#----##----###-#-####-###---###--#--#--#-####-#----#-#--####--#-###----#--#---#-#--##--#-#-##--###---#--###--#-#--##-#-##--#--####-#-##-##-#####--#####-#-#----###--##-#---#--------##-####-###--#--#-#-#----##-#-#-#-------#-##--#---#-####-####-###-----###--#-###-#-#---##--#-#---##-#--####-#-#---###-#--#-#---#-##-#------#-###-###----##-#-##-##----#####-#-##-#--#-##-#--#-##-#-###-#--##-###---###---###-##--###-#-####---#---#-#-##-####-###-##-#####-####-##-#---###-####--###-##-##--#-#---#--#--#-#----#---##-##--##-####-#---####--#--####--#--#-#-##-###-#-###-#--####-##----#---#-#-##-####--##-##-#--####-------#--###--#-----#---####---#--###----##---##--##-####--#-###-#---#-####-##-##-##--#-##-#-#-#---###-#--###-#-#-##-#####---#-##-#-#######----####---#---#---#-##---#--###--##--#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-#-#---#---##-#-##-#-###-#-##-##--#----####-###-###-#---#####---#---######-#--#-#-#-###----#---#-#-##--#----###-#----#-##--####-#-#--##-##-----#####---###-#---####-#-#-##--#-#-#-#######-#----#--##-----#--###-#-##-###-##---#####----#-##-##-#---##---##------#-#--##-##-##-#-#-######-#####-#--####-#--------------------#----------------------#--##-##-####---##--#--###--##----##-#--##--#-#-##---#####----#-##--#######-#-###-#-##-####--#-#--#-#--#----###-###-##--##-#-##-#--####-#-###----#------------------------------------------#----#--#--#-##-------#--#-###--#-#--##------#--###-#-#-#--##---#-###-#####--#-##-#-#-###--#-#------#-###-###--#-#-#---#-##-#-########-#-#-##-----#--#----------------------------------------##-#-##-#####-###-##-##--#---#-#-#--##--#----##--###-#-####-#----#--#####-#-#-###---##--#--##--#-#----##-#-------##-#-#-#-#-###--#-#-#----#--###-###-----###-------------------#--------------##-#--###-##--##--#####--##--#--#-##-#-------#-###-#--#--#--#-##-##-#####--##-#####--##--#-###--###--#---#----#-#--##-#-----#-##-#-#--#-###----#---#-#-###-#---#-##-#--#---#-##-##--#--#--#--#--#-#----###--------#--#--########-####--#-#-####-----#---#--#----###-##------###--#-#--####-#--#-#-#--##---####-----##---###-#####--##-------##-#--##-#-#-#-####-#--####---#######-#-##-------#-#####-#-#-#-#-#-####-#-#--##-##---#---#-####-#---#####--######-#--#--##-####--#####-#-##--##----##--##-#--#-#-###-#--#--####-#-#--##--####-#-#--#-----#---####--#-----#---####--###--#-##---#-----#---#---###-#-##-###-####-#-#---#-##-#######-#--#--#--###--#---#-#---#---#--##-#--##-##-#-#-##-----#--#--#-----####-#-#---##-####-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-------###-#--###--#-#--#--##-####-##----###-###--#-###--#######---#-#-##-#---#-#--##-#--##---#-##-##-#-##--#--##-#-------###--#--###-#-#-##---------#-#-###-#-----##-##-####---##-###--#--#--##-#--#-##-#-####---###-#-##---##---##--#-#--####-##-##---#-#----####-##--##-#-###-#---#######-#---#-####---------------------#----------------------###--####-#----#--#------#-----##---#--####--#####---####-------##-#--#-#---##--##-##---##-#########-----#-#-###-####-##-#-##---##----#--#######--------------------------------------###---##---#--#-##----#-##--##-#---###--#-##-###---##-#--###-######-#--##-##-#---###--##-###--####--###-#-#--##-#-##--###-#-#-#---#-##----------#####-##---#-------------------####--####--------------#-###-----####--##-#--###-#-#--##-----####--#-#------##-##-#####--#--#--#--#--######----#--###-##---#---#-##-#---##-###-#-##-#-#--##-#####--##-#--#--#-####-#----#-#--####--#-###----#--#--#-#-##----####-##-###--##--#-##-#---##----#-##-#----#-####----####--#--#####-#-#---###-####--##-#--##---#####--#-##---###--##-##-#--####-------#-##--#---#-####-####-###-----###--#-###-#-#-#---##----####---#--#---#-#--#-##---#-####--#-#-####-#####--##--###-##--#--#-#-#--##-#--#-##-#-##-##-#-#-#---#-##-#-#-----#--#-####-#-###-#--#--#--###---#---#-#-##-####-###-##-#####-####-##-#-#--#--#-###-###-#-###---#--##-#-----##-##-####-##-----####-#-##---#####-#---------#----##---#-########--#-####----#---###----####-#-##--##---###---#-----#---####--#-----#---####----#-#----#--##--#-###-##--#--#---###--###-##-###-###---#--##--#-##--#-#---#-#------#-#-##----##--#---##----#-###-#--#----##--###-#-#-#--##---#----#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-##-#-----###-####-#--##-#--#-#-#--#-----#--###-#-#----#-##-#---########-#-##--######-------#-#--#--#-###-#-##---#####---###-##-#----##---#-####-###-####----##-#--##-##-####------#-##----###-###-#--#------##----#-#--###--##--#-#--####--####-####--##-------#--#-#-######---##-#-----#-----##--#-#----------------------#----------------------##-#-#--####---###-#####---#--#-#-------###---#--#-#-##-##-##-#--#-#####---#-#-#-#--#-#-##-#---##--#--#--#-###--###-##--##---#####---##-#--#-----#---------------------------------------------#-#-----###-----####------##-###-#-##----##--#--#-##-##------##-#-##--#-#-#--#-#####-#----#-#---##-##---#--###-#---#--##-#--##-#-#----------#--#--#------------------------------------------#-##-#--###-####--##-#----####-#-##-#--#--###-------#-#---#-####-------#####-#--##--##--##--#--#-##--#-###----#---#-##-###-#--#------###-##---##-#-----###-------------------#---------------#-#---#####-#####-#-#######-######-###-#-#-##---#-#####-#-#---###-###-#----####-##-#--##-##--###--###----#-##-#--#-###---#--#---#------#--##-#-#-##-#-###-#---#-##-#--#---#-##-##--#--#--######---###-#-#-#-###-####-#--##-#-###--#-#--#-###-#--#--##-##---#---#--#-#-#-######-##-#-####-#--#-#-#--##--#-#-###-####---####---##---##-#-#---##-#--##-#-#-#-####-#--####---#######-#-##---#--###-##-#--#---#--#-#--#-#-#-##-##--#-#---##-#-#-###-####-##--#--#--###-######-####-#--##-#-#----##-###-#-#####-##--#--#-#---###-#----##-#-#-##-----#-----#---####--#-----#---#####---#-#-#-----#----#--###-##-######-#--#--####--#---###--#-###-##-###------##-##--###--#-######--#-####--##---#-###------#-####-#--##--##--##-###-#-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-#####-###--##-######------#--#-#-##-####-----####---#-#-###-#####-#--#-#-#-#--##-##-#---##-#-#-##------#----###---##-##-###--##-#--#####--#-#-#-###---####--#--#---##-##---#---#-#-##-##--#-----##--#---#-#----####-#####---#-#--##-#---------#-------##---###-#-###-#-#-##--#--#---#####---##-####-##--##---------------------#---------------------###-#-----#-#---##---#-#----########-#########-#-##-#-##-#-###--##-####---#-#-##-#---##------#########--#--#---------#-####-##-#-####-#-#-###--#-#-------------------------------------###--#--#-##---###-##-###----##-#--#######--#--####--##-#-#-#####--#--####-##-####-#--#-##-#-#---#---#--#-#-----#-#-#---###--##--####----######--###--##---#-------------------####--####----------#-#-##-###---#-#-#---#----#----##-##-#--#---##-###---#-#-#####-###----##--#-#-#-##--#-#----#--#--#------#-#--####--#-#---#-#--######-##-######-##--#--#--#-####-#----#-#--####--#-###----#--#-#####---##-###-##---###-####--#--#---##-#####-##-----###--#-##-----#######----###-####--#-#-###-###---##-###---##--###--#-#-##-#-##-##-#--#---#--##---#---#-####-####-###-----###--#-###-#-##---------###-#--##---#-##-#--#-###-##--#---##-#-#-###-#-####-#-#-#-#####----#######--#-##--##-----##-#-#-#-----##--#-#---#--#-####---#---######---####---#---#-#-##-####-###-##-#####-####-####-##-#--#--#-------#-#-#-#-####--#--#--#-##-#-#---#--#-##---#----#---###---###-##-#-------##-#--###----------###---##--#-#-#-#--######-##-#---####---#-----#---####--#-----#---#####-###-#-#---#-#####--##---###---#####--##-#-###-#--#--####-#-#-#--##-##-#####----##--##-#-#-#####--##-#-#-##--####-##--#-##--##---#--###------#-----#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###----##--##-#-##---#-###-#--#-----##------#-####---##-#-###-#---###-##-#-#--##--##-##----##-####--###--##-#----##-####-#---#-#---#--#--###-#-#--#-#-####-------##--##----####--###---##-##---#####--##-####-##-####-###--##--------###--###-----#-###--####--##-######-###--##-#-####-#-####-----#-#-#-#--------------------#---------------------###-##---#--#---#---##-#-#--##-###-#--#-#####--#-##--##--##--#--##--##-#--##-#---##-#-#-###--####-#-----#-#-##--#--#-#-#--#-#--#---##-#-####-##---#-----------------------------------------###---#---#-#-##-###----##----##-#-##--#--#####-##--##-#-###--#---##---####-#-#---#######-##-##--###--#----###-----###---#--#--##-#-#-#-###--##----#--#---------------------------------------####-#------###--#--##-##---#--##-##-#-###########-#-###-#-#-#--#--#-#--###--#-#-##----##-###-#--#--#####--#-#---##-###--###-#-#######-#--##----#-###-----###-------------------#-------------##-#---####---##--#--###---####-#------#-###--#----#-#-#-##--#---#-#-#--###-#-----#-#-#--###-####--##-#--##-#--#--#-##-----#-#-#-##--#---##-----#---#-#-###-#---#-##-#--#---#-##-##--#--#--##---#---#---###-#--#--#-#######-##-###--######-#---####-###--#####---#-#---#---###----#------###-##------#-####-##-#-####---##-#--#--#--#---##-##-#-#--##-#-#-#-####-#--####---#######-#-##---##---#---##----#-#-##--###----###-#--####-##-##----#####-####---##-----#-####-#-##-#-#-###----#--#-#-#--####--###-#-#--#####-##--##--#--#-##--#-#---#------#-###-########-#-#-#####-##--#-###-#--------#--#-#--####--###--#-#####-###-##-#-##---#---#---##-###--#--####-###-###-#---###--####---#-##--#-----##-###--#--#--#---####--#-###-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###--##--#--###-----#-##-#---###-#--##---##---##---#-#-#--#--##-###--###-###-##-#-#--##-#---#-##----#--#--#----##---##----#-##-##-##----###----###--#----##-#---##-##--#----##-#-----##--#-#-#-##-----#-##--#-#--###---##-#-##---##-##-####-#-##-##----#-#-#--##-#-####-#---#---#--##-------#-----##-#####---------------------#----------------------#-##--#-###-#--####----#-----#----##-#---#---#---#-####-##-#---#--##-##--###-#####-#-#-#-----#-----####--##-#---#-##----##-##-#-#-####-###-#-####-------------------------------------###---#-##-#-##-------###-#-###--#-#-##-##-###--##---##-#--#####--###-#--###-----#-#-----##----###--###--#----##-###--##########-#---#-#--#-#-#----#-#-##--#-------------------####--####-----------####-###-#-#-##----###---#--#-##-#-####----#--#-###--#--#-##--###-#-----#--#-#-##-###-#-########------##--#--#---##-#-###-#-#---#-#-#-##--##---#-----#--#-####-#----#-#--####--#-###----#--#--#----###---##-#--#---#-#-------###-###-##--#----##-#--#-##--#----###-###---#-#-##--#-#-##-##-#--##-#---####---####--##------####-#-#####-####-##-#---#---#-####-####-###-----###--#-###-#-#----#####--##-#-###-------###-#-###-#-#---#----#-#--####-#---###---#-##---#####-#---###-##---##-----#-#-#----###----#--#--#-##-#####----####-#---#-####---#---#-#-##-####-###-##-#####-####-##-#----##--#-##-###--##-###--#####-#-#---#--##--#----######-###--###--#-#----###-#-#-#-#-#-#--#---##---#-#-#--##-#--#--#-##-#-###-#--###--##---#---#-------#--###--#-----#---####---#--#-#-#--#---##-#-#-####-#-##-#--------------##-#####--#-#-##-##-#---#--#####-----#-#--##-#----#---#-----#--##------##---###-#---#-#---#-#---###-#--#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-#---###-#--#####---##-##-#-#-##-#-##-#-##--#--##---#-#-##-###---#####--#---###-----######-#-#----###--#--#-#-#-##-#-##--#-#---##---####-##-###--###-####--##---#--#-##--#--#-####-#-#--##-#-###-##-#-########---###-#---##-##-###-----####-#---#---#-#####---###--####-##-###----##-##--####-##--#--#-#--------------------#-------------------------#-###--###---#--#---##---#-##--#-#-##-#####-###--##--#-##--##-#--##-#-###-#---###-###-#-##----#--##--#-#-#-###----##--#-###-#####-#-------##-##------------------------------------------######--#-#--#----#----#-#--#-######--#--####----#-#----#-#-##-#---#-##-##--##--##-#-####-##-----#--####-#-##---#--#-##----##--#-#---##-#-----#-#-#--#----------------------------------------###--##-#-###-#--#-----##-#-#-##---#--#--#-##----#-#-##-#--#---#-#--##-#-#---###---#-#---#--#--#-#---###--#--##----###---#-#---####-###--#--###-####-----###-------------------#--------------####-##-####-----#---#-###--------#-#-#-#-#-##-####--###-#-##--#---###--#--###--#---######---#--#-#-#####-----#-###-#####---#---##-###---------##--#-#-###-#---#-##-#--#---#-##-##--#--#--#-#-#--##--#####-#--##-#--##--##-#-####-####-###-###-#--###---#-#-#-##-#--##--#---##-#-#-#---#------##-##--#-###-#-----##-####-###--#--###-#-------#-#--##-#-#-#-####-#--####---#######-#-##-------####-#--#-------#-#-#-##--####---####-##-#---#-##-##-##-#-----###-----##---###--#-#-##-----#--##----#####-#-#----#--#------#-#---###---##----#----#-----#---####--#-----#---#######-#--#--#--#---#-##--#----#-----##---#-##-###-#--------#-------#-##-####--#-######-#-#--######--#-##-#--#--###-#-#--#----#--#--#######-##-##-#-##-#-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###--#-#-#---##-###----##-----##---###-##--##--##-##--###---#---#--####-##--###-##-##-##---#####-###-###--#----#-##-#------#-----##-#--##--##--##-#---#-#--#---#-#--##-#########--###-####----#-#####-------##--#-----#-###-#-#--#-#-###-##-##--##--#--#-#--#--###---###-#-#-####-#-#--#--##--##----##-####--------------------#---------------------###-#-#---#-#########-#-####---####--#-##-##-##---#---##-#-###---##-##--####-#-##---###-##-###-#--##-##--##-#######-####-##----------###----##-----#-----------------------------------###--#####-#-----#-#-#-#----###----##-#####-#-###-####--#---#-#--#-----#--#-#--#--##-###########-##-#--#####-###--###--###-##-##-##--#--##--##-##---#-##---#-------------------####--####----------##-###--#-#-#-###--##-#-####-####--###--#-#-##-##--#####-#--#-#######-##--#-##-#--#-#-#--##-#-####---#-##----##-#-##-#---#--------##-##-----#-#----#--#--#-####-#----#-#--####--#-###----#--#-######--##--#---#----#-#-#-##-######-##-##-#--##-##-#--#--#-##-#---#-###--#---##-###-##-#-#-##-##-######---#---#---#-#----#-##--###-#-#-####--##-##---#---#-####-####-###-----###--#-###-#-####-#---#-#####-####---#-#--#-#--#-----##-##-##-##---###-##--#-#-##---###--###---#-#--#-#-###-###----###-###-#-##-#---#####--#---#-##-#--###-#-----####---#---#-#-##-####-###-##-#####-####-###--#--#-#-#--###-#---#####-##-##-#-----##-#-#####-------##-##---#-#####----#-#------#-##-######-##---#-#------###----##-#-#-#-###--#--##-####-#--##---#-----#---####--#-----#---####--#-#--####-###-##--##----#--########--##-##-#-###--#--#-#-----####------####-###----#-#--#######-##---###-#-#-------####-#--#--#-###-##-###-----#-##-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-##-#-###-#-####-#-####-###-#-##-###-#--#--########---#-##-###--#-#-#--#---#--#--#####-###-###--#-#-#-##--#----#--#--####-###-----#--#######-#-##--###-----#-###-----#-----#-#-#-#--##---#--#-#####-##--#--###---###-###--#---#--#----####--###-#-#-#--#-#-##---#--#-#-###--########-##-##-#-##-#-#-####--#--------------------#----------------------##-#-#-##--##---#-###-##########-##-#-#--##--#---#-####-#---#---####---###--#-#-#-#-##--#--##------##--##-#####-##-#-###-#-##-#-#####-####---#-###-------------------------------------------#####-###--#--###--####--#####----#--#--#--###-#-----###-#-#--##-###-#-#-#-##--#-------#####----#-#--#--#----#----#-##---#--#-#--#--#--##--##-##----#----------------------------------------###---#####--#-----#####----####--##--#-##-#####--###-###-##--##--#--#-#--#-###---###-####-###-###-##--#-#-##-#-##-##---#--#-##-##-#-##-#----#-#####-----###-------------------#---------------#--#-#--##--#----##---###-##-#-##--#-##-##---#---##-###-#-#--##-#--#-##-#-##--##----#-#-#-#-#--###-----##--#-#--#-######----##-##--#-##-###---#--##-#-###-#---#-##-#--#---#-##-##--#--#--#---#--##-##--##-##-###-#--#######----#-------##--------###--#--#--#--#-###-----#--#####-#---#-##--##-------####--#--##---####----#-#--#####-###--##-#--##-#-#-#-####-#--####---#######-#-##----#####-#---#-----########-#########--####--#-###---#--#-####-###--##-##-#--#-#-#-#--#-##-###-##-######-###-##-###--#----##-##--#--#-##----###-#-##-#--#-----#---####--#-----#---####-##-#--####-##-----####---###-#---#-#---#--####-#--###--##---##--##-#-#--#--#-###-#--#-######-#-###-##------####-#---###--###-#-##---##-#--------####-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-###-#####---#---####-####--#####-#-###-#----###-#-##--#--#--##--#--#-###--##--#####----#---##----####--#-##-#--##-#--##--#--##----#-#####-##-#-####-----#######-####-#--##-#--##-##---#--#-#--#--#--#-#-#---###-#--##-#--##-###--#---##---##-#---##-##-#-#-#-###-#------#-##-###-#--#-#----#-#####----#-###--------------------#-----------------------#--###--###-###---------###--##--#-#--####-###--#-----####-#--###-#-#-###--#####---#--##--##---#-#-##------###--#####---#-#-----#--#--####----##-------------------------------------###-----##-#-##-#-#-#-#-#-#---#####-##-###-------##-----#-###-#-#---#-#-##-##--##--#-----##-###-#-###-##-#-#-#---#--########--##--##---##-###-#--#-#---##--#-------------------####--####-----------#-###-##-##----##-##-#----##-#-#---#-----#-##-#-#--##-#-##-##--##-#-#--##-##-#------#--#--##-#--#####-##---###--------##-#--#---#-#-##--#--#-###-----#--#-####-#----#-#--####--#-###----#--#--#-##---##--#--#-###-#######-#####----#-####-#-----##--#--#-##-####-#-#--##------#-####---##-#---#----####-#-#######--#-######---##-#---#---#---#-#---#---#-####-####-###-----###--#-###-#-#-#-#-##--##-#-#-#-##--#-#####-#-#---##---##-##-------#-#-#-#-----#-#-#---####--#-##-###---###--#-######-###-##--#-##--#-#-#-#-####---#-#--########--###---#---#-#-##-####-###-##-#####-####-#####-#-#####--#----#-#-#--##-##---#-#----#-##-#--#####-##--#-##-#-##--###--###--###-###---#--#-#----##------#-#-##-#--##---#--#---#######--#-##-##-#---#-----#---####--#-----#---######--#----##-#---##--#--###-#-#-####-##----#####-#-#####-#---#-#---#----#-#-##---#-#-#-#--##-#-#--###-###-#-#--#---#--##-#####--##-#-###---#######---#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-####-##-#--#--#-##-##--#---#-##--#-#-#---####-###---##--#--##--#--###-##-#-#-#-##----#--#-#-###-#-##--#--#---#-##--##-######--##-####-####-#-----#-####----#-##--#----###-#-###-#--###---#--#-#--##-##-#-#-#----####-#--#-####-#-##----##-####-----#-##-###---#------#######-#--#--#----#-##--#---#-##---#--------------------#----------------------------#-#---####-#####---#-#-###---###--##--###-##--#-----#--#--#-#---#-#-##-#-#-#--######-##-#-##-#----#-#-##-#-----##-##--#-########---#-###---#--------------------------------------------#-##--##-#-#-#-#####-#----##-##--###---##----------##-###--###--##-#--#----#--#-##-#######-#-##-#--#####-#-##---#---#---##-#--#--###-#-#--#-#------#----------------------------------------###---#-##-#-####--#-#-#-#-#--##--##-###---#-##--#-#---###-##-#--#-####-####--#-#-#--#-#--##-#-#--##-#-#-##----##-#-----#-#-####-#####-##---##--####-----###-------------------#--------------##-#--#-#-##-#####-#--##-#-##-##---##--###---###--##--####-####-##--##-----#-#-##----#--###-####---####-#-###-----###--#-##-#-##-#-#-##-#-#-###---##-#-###-#---#-##-#--#---#-##-##--#--#--#---#-#-#-####-#-#--#--###-###-####--###---###--###########---#-#--#----##----#--####--#-#-#--#----####----#--###-##-###-#---#-##--###-##--#-####--###--##-#-#-#-####-#--####---#######-#-##----#-----##-#-#---#--#####-##--#--#-#-#--##---#---#-#--#-####-##--###---#-#-##-#-#-##---##-###-#####-#--#-##-#--###-#-##-#---########-#-#-####----#---#------#-###-########-#-#-#####---###--####-#-#------##-#####-#----#-###-#-##---######-----##-#----#-#-##---#--##--#-####---####-#####---#-##---#--#-#---#-#--##--#-######-##-#######-
1728 --#-#--#--##-#-#-#-#-##--####-####--#-##---##--#-#--##-#----##-####-#-##--##----###-#-#-----#-#--###--###--#-##--#######-#--#-#-##-##--#--#-##--##--#---##-##--##-----#-#--#---#--#-##-#-#---#-#---#---##-#-----###--###--##--#----#-####-#####-#-###---#######-##----##-##-#-##---#-#--#--###-#####----##-#######-#-##--#-#-##----#----#-#--#-##-#-###-##-#-#####-##--###--------------------#---------------------#--#-------#-##-#-------#---#-#----#######--#-##-##--#--###-#--#--##-##-#####-###--####---##-#--##-###--#--#-#---#-###----#-########--########-----#-----------------------------------###----##--#-##-######---###--#--##-#-#--#-#--###--##---####-####----##----#-#-#-###----#---#####--###-#---#####-#-####--------##-##--#-###----#-#--##-##--#-------------------####--####--------------#-###---#-##-#-###----###-#-#---#------####---##-#-#-##-#--######--##-###-#-#-##-####-#----####-#-###-##--#--#-#-#-#-----##---#--#-#---#-#--##----#--#-####-#----#-#--####--#-###----#--#--#--####-#####----##---###----####-#-###--##--#-#-##-##---#-####-##-#####-#--#-###-####--##-####--#-#--#-##-##-#---###-##---------#-###--#-###-#--#---#---#-####-####-###-----###--#-###-#-#-##-#--#--###-#-##---###-###-#-#-#--##---#--##-#-######---#-#-#-##-#-#-##-#--########-#-######-##--##--###-#-------###-#--#---###-#-####---#--#--#--###---#---#-#-##-####-###-##-#####-####-##--##---####-##-####---#--##--#-----#---##--######-#-#-##--#--#---############----###-##--###-#-###--#-###---#---#--#---#----###-#-#-#--#---##-#####-------#--###--#-----#---####---######--#----#-##--#-#-#---##-#-###---#-#--#-##--###-#--#-#-#---###---##--#--#-##-#----#--##--#####--#-#-#------#-#-#----###----#-##-#--####-#-#-#---#-
1728 --#-#--#--###-#-#-###-#-#-#--#--###-#####-##----#--##-#-#---#-#-###-#-#---#-########--#--#-#--#-##-#-##--#--##-#-----#-#--#####--###--#-#----#####-##---#-###-###-##-##-#-#-###---#---#--#-----####-###-#--###-#---##-#######-#--####-##------#-####--#-#-------#--#------#-#--###---##-#--#####-####-#--#-#------#####---#####-###----####--####-#---#--###---#---###-#-#--------------------#---------------------##---#-##-#----#-#--####-#-##------#---##-##--##--#---#--#-###########-###-#--#-#-##-####-##--###---##-#-##-#-#--###--###-#-##-#--#--#--#####---#-##----------------------------------------#---###-----#-##---#--##-####-#-###--#--#-#####----##-#-####-##--##-###--#-####---##-#-------#-#--#--#-##-##--#-###-#--#----##--##--#---#-#-#--###-#--#----------------------------------------##-##---#----#-###-#----#-###-##-###---#-###-#-----#--##-#--#--##-##---####-##--##------######--##-#####-#---#---###-##---##---#-#-###----------##-#-----###-------------------#--------------##-##---#----#-###-#----#-###-####---#-###-#-----#--##-#-#--#--##-##---####-##--##------######--##-#####---#---###-##---##---#-#-#-###----------#--#-#-###-#---#-##-#--#---#-##-##--#--#--#-##-##---#----#-#-###-#----#-###-####---#-###-#-----#--##-#--#--##-##---####-##--##---#----######--##-#####---#---###-##---##---#-#-###----------##-#--##-#-#-#-####-#--####---#######-#-##----##-##---#----#-###-#----#-###-####---#-#-###-#-----#--##-#--#--##-##---####-##--##------######--##-#####---#---#-###-##---##---#-#-###----------#----#-----#---####--#-----#---####-##-#-##---#----#-###-#----#-###-####---#-###-#-----#--##-#--#--##-##---#####--##--##------######--##-#####---#---###-##---##---#-#-###----------##-#-
144 --#-#--#--##--##--###-#--#-###-###-###--#-#---##--###-##-#-##-###-----------------------------#-

2471
imbe/imbe.cc Normal file

File diff suppressed because it is too large Load Diff

128
imbe/imbe.h Normal file
View File

@ -0,0 +1,128 @@
/* -*- C++ -*- */
/*
* Copyright 2008-2009 Max H. Parke(KA1RBI) and Steve Glass(VK4SMG)
*
* This file is part of OP25.
*
* OP25 is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or(at your option)
* any later version.
*
* OP25 is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OP25; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Boston, MA
* 02110-1301, USA.
*/
#ifndef INCLUDED_IMBE_H
#define INCLUDED_IMBE_H
#define pi M_PI
#define pi2 (pi * pi)
#define pi2inv (1 / pi2)
class op25_imbe {
public:
op25_imbe(void);
~op25_imbe(void);
void imbe_frame(unsigned char*);
void init(void);
void eatrxsym(char);
private:
// define global lookup tables
//NOTE: Single-letter variable names are upper case only;
// Lower case if needed is spelled. e.g. L, ell
// global Seq ER ?
//Working arrays
int bee[58]; //Encoded Spectral Amplitudes
float M[57][2]; //Enhanced Spectral Amplitudes
float Mu[57][2]; //Unenhanced Spectral Amplitudes
int vee[57][2]; //V/UV decisions
float suv[160]; //Unvoiced samples
float sv[160]; //Voiced samples
float log2Mu[58][2];
float Olduw[256];
float psi1;
float phi[57][2];
//Variables
int Old;
int New;
int L;
int OldL;
float w0;
float Oldw0;
float Luv; //number of unvoiced spectral amplitudes
int BOT;
char sym_b[4096];
char RxData[4096];
int sym_bp;
int ErFlag;
// member functions
uint32_t extract(const uint8_t* buf, size_t begin, size_t end);
#if 0
uint32_t vfPickBits0(const uint8_t *);
uint32_t vfPickBits1(const uint8_t *);
uint32_t vfPickBits2(const uint8_t *);
uint32_t vfPickBits3(const uint8_t *);
uint32_t vfPickBits4(const uint8_t *);
uint32_t vfPickBits5(const uint8_t *);
uint32_t vfPickBits6(const uint8_t *);
uint32_t vfPickBits7(const uint8_t *);
#else
unsigned int vfPickBits0(unsigned char *);
unsigned int vfPickBits1(unsigned char *);
unsigned int vfPickBits2(unsigned char *);
unsigned int vfPickBits3(unsigned char *);
unsigned int vfPickBits4(unsigned char *);
unsigned int vfPickBits5(unsigned char *);
unsigned int vfPickBits6(unsigned char *);
unsigned int vfPickBits7(unsigned char *);
#endif
int vfHmg15113Dec (int , int ) ;
unsigned int vfPrGen15 (unsigned int& ) ;
unsigned int vfPrGen23 (unsigned int& ) ;
unsigned int gly23127Dec (unsigned int& , unsigned int& ) ;
unsigned int gly23127GetSyn (unsigned int ) ;
#if 0
void vfDec(const uint8_t*, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&);
#else
void vfDec(unsigned char*, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&, unsigned int&);
#endif
void Decode (unsigned char *);
void DecodeSpectralAmplitudes (int, int );
void DecodeVUV (int ) ;
void AdaptiveSmoothing (float, float, float ) ;
void CplxFFT (float [], float []) ;
void EnhanceSpectralAmplitudes (float&) ;
void RealIFFT (float [], float [], float []) ;
void RearrangeBits (int, int, int, int, int, int, int, int, int&) ;
void SynthUnvoiced (void) ;
void SynthVoiced (void) ;
void Synth(void) ;
void UnpackBytes (unsigned char*, int&, int&, int&, int&, int&, int&, int&, int&, int&, int& ) ;
int bchDec (char* );
void ReadNetID (unsigned int&, unsigned int&, char* );
void ProcVF (char *);
void proc_lldu (char *, int );
};
#endif /* INCLUDED_IMBE_H */

1030
imbe/imbe_data.h Normal file

File diff suppressed because it is too large Load Diff