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>

View File

@ -1,8 +1,8 @@
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
2006, 2007 Free Software Foundation, Inc.
This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
@ -10,7 +10,10 @@ unlimited permission to copy, distribute and modify it.
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
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'
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
cache files.)
cache files.
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
@ -35,20 +38,17 @@ some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You only need
`configure.ac' if you want to change it or regenerate `configure' using
a newer version of `autoconf'.
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
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.
`./configure' to configure the package for your system.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
Running `configure' might take a while. While running, it prints
some messages telling which features it is checking for.
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
with the distribution.
6. Often, you can also type `make uninstall' to remove the installed
files again.
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
is an example:
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*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
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
supports the `VPATH' variable, such as GNU `make'. `cd' to the
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not support the `VPATH'
variable, you have to compile the package for one architecture at a
time in the source code directory. After you have installed the
package for one architecture, use `make distclean' before reconfiguring
for another architecture.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
Installation Names
==================
@ -190,12 +191,12 @@ them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
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
configuration-related scripts to be executed by `/bin/bash'.
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================

View File

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

View File

@ -26,6 +26,8 @@
#include <algorithm>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <sstream>
#include <utility>
@ -97,6 +99,17 @@ abstract_data_unit::snapshot() const
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) :
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
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

View File

@ -89,6 +89,13 @@ public:
*/
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:
/**
@ -133,6 +140,11 @@ protected:
*/
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
* variable-length data this should return UINT16_MAX until the

View File

@ -27,6 +27,7 @@
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
#include <deque>
#include <iosfwd>
#include <imbe_decoder.h>
#include <stdint.h>
#include <swab.h>
@ -110,6 +111,13 @@ public:
*/
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:
/**

View File

@ -22,10 +22,14 @@
*/
#include <hdu.h>
#include <iomanip>
#include <itpp/comm/egolay.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) :
abstract_data_unit(frame_body)
@ -45,8 +49,60 @@ hdu::duid_str() const
std::string
hdu::snapshot() const
{
string empty;
return empty;
ostringstream os;
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
@ -59,9 +115,10 @@ hdu::correct_errors(bit_vector& frame)
void
hdu::apply_golay_correction(bit_vector& frame)
{
#if 0
static itpp::Extended_Golay golay;
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 NOF_GOLAY_CODEWORDS = 36, GOLAY_CODEWORD_SZ = 18;
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 },
{ 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 },
@ -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 }
};
for(size_t i = 0; i < nof_golay_codewords; ++i) {
for(size_t i = 0; i < NOF_GOLAY_CODEWORDS; ++i) {
// ToDo:
}
#endif
}
void
hdu::apply_rs_correction(bit_vector& frame)
{
#if 0
static itpp::Reed_Solomon rs(6, 8, true);
#if 0
const size_t rs_codeword[][6] = {
};
const size_t nof_codeword_bits = sizeof(codeword_bits) / sizeof(codeword_bits[0]);
@ -123,3 +181,62 @@ hdu::frame_size_max() const
{
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;
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 */

View File

@ -1,12 +1,15 @@
#include <dummy_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::make_imbe_decoder()
{
// return imbe_decoder_sptr(new vc55_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()

View File

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

View File

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

View File

@ -9,7 +9,7 @@ typedef std::vector<bool> 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 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 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_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.
*
* \param in A const reference to the bit_vector.
* \param begin The offset of the first bit to copy.
* \param end The offset of the end bit (this bit is not copied).
* \param in A const reference to the source.
* \param begin The offset of the first bit to extract (the MSB).
* \param end The offset of the end bit.
* \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, 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);
for(int i = begin, j = 0; i < end; ++i, ++j) {
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 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;
}
/**
* 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

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