/* -----------------------------------------------
	defines for use in packJPG processing
	----------------------------------------------- */

// action defines
#define A_COMPRESS			1
#define A_SPLIT_DUMP		2
#define A_COLL_DUMP			3
#define A_FCOLL_DUMP		4
#define A_ZDST_DUMP			5
#define A_TXT_INFO			6
#define A_DIST_INFO			7
#define A_PGM_DUMP			8

// file type defines
#define F_JPG				1
#define F_PJG				2
#define F_UNK				3


/* -----------------------------------------------
	compression helper tables
	----------------------------------------------- */

// maxima for each frequency in zigzag order
// dc maximum is fixed by offset (+4/QUANT)
static const unsigned short int freqmax[] =
{
	1024,  931,  932,  985,  858,  985,  968,  884, 
	 884,  967, 1020,  841,  871,  840, 1020,  968, 
	 932,  875,  876,  932,  969, 1020,  838,  985, 
	 844,  985,  838, 1020, 1020,  854,  878,  967, 
	 967,  878,  854, 1020,  854,  871,  886, 1020, 
	 886,  871,  854,  854,  870,  969,  969,  870, 
	 854,  838, 1010,  838, 1020,  837, 1020,  969, 
	 969, 1020,  838, 1020,  838, 1020, 1020,  838
};

/*
// maxima for each frequency - IJG DCT float (not used)
static const unsigned short int freqmax_float[] =
{
	1024,  924,  942,  924, 1020,  924,  942,  924,
	 924,  837,  854,  837,  924,  837,  854,  837,
	 942,  854,  871,  854,  942,  854,  871,  854,
	 924,  837,  854,  837,  924,  837,  854,  837,
	1020,  924,  942,  924, 1020,  924,  942,  924,
	 924,  837,  854,  837,  924,  837,  854,  837,
	 942,  854,  871,  854,  942,  854,  871,  854,
	 924,  837,  854,  837,  924,  837,  854,  837
};
*/

/*
// maxima for each frequency - IJG DCT int (not used)
static const unsigned short int freqmax_int[] =
{
	1024,  924,  942,  924, 1020,  924,  942,  924,
	 924,  838,  854,  838,  924,  838,  854,  838,
	 942,  854,  871,  854,  942,  854,  871,  854,
	 924,  837,  854,  837,  924,  837,  854,  837,
	1020,  924,  942,  924, 1020,  924,  942,  924,
	 924,  838,  854,  838,  924,  838,  854,  838,
	 942,  854,  871,  854,  942,  854,  871,  854,
	 924,  838,  854,  838,  924,  838,  854,  838
};
*/

/*
// maxima for each frequency - IJG DCT fast (not used)
static const unsigned short int freqmax_fast[] =
{
	1024,  931,  985,  968, 1020,  968, 1020, 1020,
	 932,  858,  884,  840,  932,  812,  854,  854,
	 985,  884,  849,  875,  985,  878,  821,  821,
	 967,  841,  876,  844,  967,  886,  870,  726,
	1020,  932,  985,  967, 1020,  969, 1020, 1020,
	 969,  812,  878,  886,  969,  829,  969,  727,
	1020,  854,  821,  870, 1010,  969, 1020, 1020,
	1020,  854,  821,  725, 1020,  727, 1020,  510
};
*/

/*
// maxima for each frequency - IJG DCT max (not used)
static const unsigned short int freqmax_ijg[] =
{
	1024,  931,  985,  968, 1020,  968, 1020, 1020,
	 932,  858,  884,  840,  932,  838,  854,  854,
	 985,  884,  871,  875,  985,  878,  871,  854,
	 967,  841,  876,  844,  967,  886,  870,  837,
	1020,  932,  985,  967, 1020,  969, 1020, 1020,
	 969,  838,  878,  886,  969,  838,  969,  838,
	1020,  854,  871,  870, 1010,  969, 1020, 1020,
	1020,  854,  854,  838, 1020,  838, 1020,  838
};
*/

/*
// valdist 99.0% quantiles
int vdqu[ 3 ][ 64 ] =
{
	// table for statistical id 0
	{
		 206,  346,  187,  126,   91,   68,   51,   42, 
		 353,  173,  124,   87,   63,   49,   39,   33, 
		 186,  119,   93,   70,   53,   42,   34,   29, 
		 127,   84,   68,   55,   44,   35,   29,   25, 
		  88,   63,   53,   44,   36,   30,   25,   22, 
		  67,   48,   42,   36,   30,   26,   22,   20, 
		  48,   38,   33,   29,   25,   22,   20,   18, 
		  43,   32,   29,   26,   23,   20,   18,   17, 
	},
	// table for statistical id 1
	{
		  23,   86,   46,   28,   19,   14,   11,    9, 
		  93,   48,   32,   21,   15,   11,    9,    7, 
		  51,   32,   24,   18,   13,   10,    8,    7, 
		  31,   22,   18,   14,   11,    9,    7,    6, 
		  21,   16,   14,   11,    9,    7,    6,    5, 
		  15,   12,   11,    9,    7,    6,    5,    5, 
		  12,   10,    9,    7,    6,    5,    5,    4, 
		  10,    8,    7,    6,    5,    5,    4,    4, 
	},
	// table for statistical id 2
	{
		  25,   89,   45,   27,   18,   13,   10,    8, 
		  94,   48,   31,   21,   15,   11,    8,    6, 
		  49,   32,   24,   17,   13,   10,    8,    6, 
		  29,   22,   18,   14,   11,    8,    7,    5, 
		  20,   16,   13,   11,    9,    7,    6,    5, 
		  15,   12,   11,    9,    7,    6,    5,    4, 
		  11,    9,    9,    7,    6,    5,    4,    4, 
		   8,    7,    7,    6,    5,    4,    4,    3, 
	},
};
*/

// standard scan = zigzag scan
static const unsigned char stdscan[] =
{
	 0,  1,  2,  3,  4,  5,  6,  7,
	 8,  9, 10, 11, 12, 13, 14, 15,
	16,	17, 18, 19, 20, 21, 22, 23,
	24, 25, 26, 27, 28, 29, 30, 31,
	32, 33, 34, 35, 36, 37, 38, 39,
	40, 41, 42, 43, 44, 45, 46, 47,
	48, 49, 50, 51, 52, 53, 54, 55,
	56, 57, 58, 59, 60, 61, 62, 63
};

// zigzag scan conversion table
static const unsigned char zigzag[] =
{
	 0,  1,  5,  6, 14, 15, 27, 28,
	 2,  4,  7, 13, 16, 26, 29, 42,
	 3,  8, 12, 17, 25, 30, 41, 43,
	 9, 11, 18, 24, 31, 40, 44, 53,
	10, 19, 23, 32, 39, 45, 52, 54,
	20, 22, 33, 38, 46, 51, 55, 60,
	21, 34, 37, 47, 50, 56, 59, 61,
	35, 36, 48, 49, 57, 58, 62, 63
};

// zigzag scan reverse conversion table
static const unsigned char unzigzag[] =
{
	 0,  1,  8, 16,  9,  2,  3, 10,
	17, 24, 32, 25, 18, 11,  4,  5,
	12, 19, 26, 33, 40, 48, 41, 34,
	27, 20, 13,  6,  7, 14, 21, 28,
	35, 42, 49, 56, 57, 50, 43, 36,
	29, 22, 15, 23, 30, 37, 44, 51,
	58, 59, 52, 45, 38, 31, 39, 46,
	53, 60, 61, 54, 47, 55, 62, 63
};

// even/uneven zigzag scan conversion table
static const unsigned char even_zigzag[] =
{

	 0,  5, 14, 27,  1,  6, 15, 28, 
	 3, 12, 25, 41,  8, 17, 30, 43, 
	10, 23, 39, 52, 19, 32, 45, 54, 
	21, 37, 50, 59, 34, 47, 56, 61, 
	 2,  7, 16, 29,  4, 13, 26, 42, 
	 9, 18, 31, 44, 11, 24, 40, 53, 
	20, 33, 46, 55, 22, 38, 51, 60, 
	35, 48, 57, 62, 36, 49, 58, 63, 
};

// context weighting for each band (luminance) (from POTY 2006/2007)
static const signed int abs_ctx_weights_lum[ 64 ][ 3 ][ 5 ] =
{
	{ // DCT(0/0)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 11,  8,  0, },
		{  9, 13,  0,  0,  0, },
	},
	{ // DCT(1/0)
		{  0,  0,  8,  0,  0, },
		{  0,  3, 28,  7,  0, },
		{  5,  7,  0,  0,  0, },
	},
	{ // DCT(0/1)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  4,  6,  0, },
		{  8, 30,  0,  0,  0, },
	},
	{ // DCT(0/2)
		{  0,  0,  5,  0,  0, },
		{  0,  3,  5,  5,  0, },
		{ 11, 27,  0,  0,  0, },
	},
	{ // DCT(1/1)
		{  0,  0,  4,  0,  0, },
		{  0,  7, 13, 10,  0, },
		{  6, 16,  0,  0,  0, },
	},
	{ // DCT(2/0)
		{  0,  0, 10,  0,  0, },
		{  0,  2, 25,  6,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(3/0)
		{  0,  0, 10,  0,  0, },
		{  0,  1, 24,  6,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(2/1)
		{  0,  0,  5,  0,  0, },
		{  0,  7, 15, 10,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(1/2)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  8, 10,  0, },
		{  7, 18,  0,  0,  0, },
	},
	{ // DCT(0/3)
		{  0,  0,  6,  0,  0, },
		{  0,  3,  5,  5,  0, },
		{ 12, 26,  0,  0,  0, },
	},
	{ // DCT(0/4)
		{  0,  0,  6,  0,  0, },
		{  0,  3,  6,  5,  0, },
		{ 13, 25,  0,  0,  0, },
	},
	{ // DCT(1/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  8, 19,  0,  0,  0, },
	},
	{ // DCT(2/2)
		{  0,  0,  5,  0,  0, },
		{  0,  8, 11, 11,  0, },
		{  8, 14,  0,  0,  0, },
	},
	{ // DCT(3/1)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 16,  9,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(4/0)
		{  0,  0, 11,  0,  0, },
		{  0,  1, 24,  5,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(5/0)
		{  0,  0, 11,  0,  0, },
		{  0,  1, 24,  5,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(4/1)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 16,  9,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(3/2)
		{  0,  0,  5,  0,  0, },
		{  0,  8, 12, 11,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(2/3)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9, 10,  0, },
		{  8, 15,  0,  0,  0, },
	},
	{ // DCT(1/4)
		{  0,  0,  7,  0,  0, },
		{  0,  6,  8,  8,  0, },
		{  9, 19,  0,  0,  0, },
	},
	{ // DCT(0/5)
		{  0,  0,  6,  0,  0, },
		{  0,  2,  6,  5,  0, },
		{ 13, 25,  0,  0,  0, },
	},
	{ // DCT(0/6)
		{  0,  0,  5,  0,  0, },
		{  0,  2,  6,  5,  0, },
		{ 13, 24,  0,  0,  0, },
	},
	{ // DCT(1/5)
		{  0,  0,  7,  0,  0, },
		{  0,  6,  8,  7,  0, },
		{ 10, 19,  0,  0,  0, },
	},
	{ // DCT(2/4)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9,  9,  0, },
		{  8, 16,  0,  0,  0, },
	},
	{ // DCT(3/3)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 10, 11,  0, },
		{  8, 13,  0,  0,  0, },
	},
	{ // DCT(4/2)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 13, 10,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(5/1)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 15,  8,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(6/0)
		{  0,  0, 11,  0,  0, },
		{  0,  1, 23,  5,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(7/0)
		{  0,  0, 11,  0,  0, },
		{  0,  1, 23,  5,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(6/1)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 15,  8,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(5/2)
		{  0,  0,  7,  0,  0, },
		{  0,  7, 13,  9,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(4/3)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 11, 10,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(3/4)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9, 10,  0, },
		{  8, 14,  0,  0,  0, },
	},
	{ // DCT(2/5)
		{  0,  0,  7,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  9, 16,  0,  0,  0, },
	},
	{ // DCT(1/6)
		{  0,  0,  7,  0,  0, },
		{  0,  6,  7,  7,  0, },
		{ 10, 18,  0,  0,  0, },
	},
	{ // DCT(0/7)
		{  0,  0,  6,  0,  0, },
		{  0,  3,  6,  5,  0, },
		{ 13, 24,  0,  0,  0, },
	},
	{ // DCT(1/7)
		{  0,  0,  6,  0,  0, },
		{  0,  5,  7,  6,  0, },
		{ 10, 18,  0,  0,  0, },
	},
	{ // DCT(2/6)
		{  0,  0,  7,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  9, 15,  0,  0,  0, },
	},
	{ // DCT(3/5)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9,  9,  0, },
		{  8, 14,  0,  0,  0, },
	},
	{ // DCT(4/4)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 10, 10,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(5/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 11, 10,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(6/2)
		{  0,  0,  7,  0,  0, },
		{  0,  7, 13,  8,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(7/1)
		{  0,  0,  8,  0,  0, },
		{  0,  5, 15,  8,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(7/2)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 13,  8,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(6/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 11,  9,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(5/4)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 10, 10,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(4/5)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9,  9,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(3/6)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  8,  8,  0, },
		{  8, 13,  0,  0,  0, },
	},
	{ // DCT(2/7)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  7,  7,  0, },
		{  9, 16,  0,  0,  0, },
	},
	{ // DCT(3/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  7,  7,  0, },
		{  8, 14,  0,  0,  0, },
	},
	{ // DCT(4/6)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9,  9,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(5/5)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9, 10,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(6/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  9,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(7/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 12,  8,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(7/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 11,  8,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(6/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(5/6)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9,  9,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(4/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  7,  8,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(5/7)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  8,  8,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(6/6)
		{  0,  0,  8,  0,  0, },
		{  0,  6,  7,  8,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(7/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  9,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(7/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(6/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  7,  8,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(7/7)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  8,  9,  0, },
		{  7,  9,  0,  0,  0, },
	},
};

/*
// context weighting for each band (chrominance) (from POTY 2006/2007)
static const signed int abs_ctx_weights_chr[ 64 ][ 3 ][ 5 ] =
{
	{ // DCT(0/0)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 11,  8,  0, },
		{  9, 13,  0,  0,  0, },
	},
	{ // DCT(1/0)
		{  0,  0,  6,  0,  0, },
		{  0,  4, 28,  8,  0, },
		{  5,  7,  0,  0,  0, },
	},
	{ // DCT(0/1)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  5,  7,  0, },
		{  7, 29,  0,  0,  0, },
	},
	{ // DCT(0/2)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  7,  6,  0, },
		{ 10, 23,  0,  0,  0, },
	},
	{ // DCT(1/1)
		{  0,  0,  4,  0,  0, },
		{  0,  7, 13, 10,  0, },
		{  6, 16,  0,  0,  0, },
	},
	{ // DCT(2/0)
		{  0,  0,  9,  0,  0, },
		{  0,  3, 22,  7,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(3/0)
		{  0,  0, 10,  0,  0, },
		{  0,  4, 19,  7,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(2/1)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 14, 10,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(1/2)
		{  0,  0,  6,  0,  0, },
		{  0,  8,  9,  9,  0, },
		{  7, 16,  0,  0,  0, },
	},
	{ // DCT(0/3)
		{  0,  0,  6,  0,  0, },
		{  0,  4,  7,  6,  0, },
		{ 10, 20,  0,  0,  0, },
	},
	{ // DCT(0/4)
		{  0,  0,  6,  0,  0, },
		{  0,  4,  7,  6,  0, },
		{ 10, 19,  0,  0,  0, },
	},
	{ // DCT(1/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  7, 16,  0,  0,  0, },
	},
	{ // DCT(2/2)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 10, 10,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(3/1)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 14,  9,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(4/0)
		{  0,  0, 10,  0,  0, },
		{  0,  3, 19,  6,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(5/0)
		{  0,  0,  9,  0,  0, },
		{  0,  3, 18,  6,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(4/1)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 13,  8,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(3/2)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 11,  9,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(2/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(1/4)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  8,  7,  0, },
		{  7, 14,  0,  0,  0, },
	},
	{ // DCT(0/5)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  7,  5,  0, },
		{ 10, 19,  0,  0,  0, },
	},
	{ // DCT(0/6)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  7,  5,  0, },
		{ 10, 18,  0,  0,  0, },
	},
	{ // DCT(1/5)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  8,  7,  0, },
		{  7, 14,  0,  0,  0, },
	},
	{ // DCT(2/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(3/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(4/2)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 11,  9,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(5/1)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 12,  7,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(6/0)
		{  0,  0,  9,  0,  0, },
		{  0,  3, 18,  5,  0, },
		{  5,  7,  0,  0,  0, },
	},
	{ // DCT(7/0)
		{  0,  0,  9,  0,  0, },
		{  0,  3, 18,  5,  0, },
		{  5,  6,  0,  0,  0, },
	},
	{ // DCT(6/1)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 12,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(5/2)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 10,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(4/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  9,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(3/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(2/5)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  8,  7,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(1/6)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  7,  6,  0, },
		{  7, 14,  0,  0,  0, },
	},
	{ // DCT(0/7)
		{  0,  0,  5,  0,  0, },
		{  0,  3,  6,  5,  0, },
		{  9, 21,  0,  0,  0, },
	},
	{ // DCT(1/7)
		{  0,  0,  5,  0,  0, },
		{  0,  5,  7,  6,  0, },
		{  7, 14,  0,  0,  0, },
	},
	{ // DCT(2/6)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  8,  7,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(3/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(4/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(5/3)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 10,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(6/2)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 10,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(7/1)
		{  0,  0,  6,  0,  0, },
		{  0,  5, 12,  7,  0, },
		{  6,  7,  0,  0,  0, },
	},
	{ // DCT(7/2)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 11,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(6/3)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  9,  8,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(5/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(4/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(3/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  7,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(2/7)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  7,  6,  0, },
		{  6, 12,  0,  0,  0, },
	},
	{ // DCT(3/7)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  7,  6,  0, },
		{  6, 11,  0,  0,  0, },
	},
	{ // DCT(4/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(5/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(6/4)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  9,  8,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(7/3)
		{  0,  0,  6,  0,  0, },
		{  0,  6, 10,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(7/4)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  9,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(6/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(5/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(4/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  7,  7,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(5/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  7,  7,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(6/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  8,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(7/5)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  8,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(7/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  8,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(6/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  8,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(7/7)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 10,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
};
*/

// tresholds (size of component) for configuration sets
static const unsigned int conf_sets[][3] =
{
	{ 76800, 19200, 19200 }, // 2480x1920
	{ 19200,  4800,  4800 }, // 1280x960
	{ 10800,  2700,  2700 }, // 960x720
	{  4800,  1200,  1200 }, // 640x480
	{  1200,   300,   300 }, // 320x240
	{     0,     0,     0 }  // 0x0
};

// configuration sets for number of segments
static const unsigned char conf_segm[][3] =
{
	{ 10, 10, 10 },
	{ 10, 10, 10 },
	{ 10, 10, 10 },
	{ 10, 10, 10 },
	{ 10, 10, 10 },
	{ 10, 10, 10 }
};

// configuration sets for noise thresholds
static const unsigned char conf_ntrs[][3] =
{
	{  7,  7,  7 },
	{  6,  6,  6 },
	{  5,  5,  5 },
	{  5,  5,  5 },
	{  4,  4,  4 },
	{  4,  4,  4 }
};


// standard huffman tables, found in JPEG specification, Chapter K.3
static const unsigned char std_huff_tables[4][272] =
{
	{	// standard luma dc table (0/0)
		0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B
	},
	{	// standard chroma dc table (0/1)
		0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
		0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B
	},
	{	// standard luma ac table (1/0)
		0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D,
		0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
		0x22,0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,0xB1,0xC1,0x15,0x52,0xD1,0xF0,
		0x24,0x33,0x62,0x72,0x82,0x09,0x0A,0x16,0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28,
		0x29,0x2A,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
		0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
		0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
		0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,
		0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3,0xC4,0xC5,
		0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE1,0xE2,
		0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,
		0xF9,0xFA
	},
	{	// standard chroma ac table (1/1)
		0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01,0x02,0x77,
		0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
		0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,0xC1,0x09,0x23,0x33,0x52,0xF0,
		0x15,0x62,0x72,0xD1,0x0A,0x16,0x24,0x34,0xE1,0x25,0xF1,0x17,0x18,0x19,0x1A,0x26,
		0x27,0x28,0x29,0x2A,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,
		0x49,0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,
		0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x82,0x83,0x84,0x85,0x86,0x87,
		0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,
		0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3,
		0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,
		0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,
		0xF9,0xFA
	}
};

// lengths of standard huffmann tables
static const unsigned char std_huff_lengths[ 4 ] =	{ 28, 28, 178, 178 };


// precalculated bit lengths for values 0...1024
int pbitlen_0_1024[] =
{
	 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 32
	 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 64
	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 96
	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 128
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 160
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 192
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 224
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 256
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 288
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 320
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 352
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 384
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 416
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 448
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 480
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 512
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 544
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 576
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 608
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 640
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 672
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 704
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 736
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 768
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 800
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 832
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 864
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 896
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 928
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 960
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 992
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 1024
	11
};

// precalculated bit lengths for values -2048...2047
int pbitlen_n2048_2047[] =
{
	12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -2016
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1984
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1952
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1920
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1888
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1856
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1824
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1792
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1760
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1728
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1696
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1664
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1632
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1600
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1568
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1536
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1504
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1472
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1440
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1408
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1376
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1344
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1312
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1280
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1248
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1216
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1184
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1152
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1120
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1088
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1056
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1024
	11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -992
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -960
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -928
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -896
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -864
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -832
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -800
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -768
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -736
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -704
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -672
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -640
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -608
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -576
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -544
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -512
	10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -480
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -448
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -416
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -384
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -352
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -320
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -288
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -256
	 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -224
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -192
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -160
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -128
	 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // -96
	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // -64
	 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // -32
	 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, // 0
	 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 32
	 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 64
	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 96
	 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 128
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 160
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 192
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 224
	 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 256
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 288
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 320
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 352
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 384
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 416
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 448
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 480
	 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 512
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 544
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 576
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 608
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 640
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 672
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 704
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 736
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 768
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 800
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 832
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 864
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 896
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 928
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 960
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 992
	10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 1024
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1056
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1088
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1120
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1152
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1184
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1216
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1248
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1280
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1312
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1344
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1376
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1408
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1440
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1472
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1504
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1536
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1568
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1600
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1632
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1664
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1696
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1728
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1760
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1792
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1824
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1856
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1888
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1920
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1952
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1984
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 2016
	11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11  // 2048
};


// precalculated segmentation settings (the 0th setting corresponds to 1 segments)
unsigned char segm_tables[ 49 ][ 50 ] =
{
	{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
	   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, }, // s0
	{  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
	   1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, }, // s1
	{  0,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 
	   2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, }, // s2
	{  0,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 
	   3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, }, // s3
	{  0,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4, 
	   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4, }, // s4
	{  0,  1,  2,  2,  2,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5, 
	   5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, }, // s5
	{  0,  1,  2,  2,  3,  3,  3,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 
	   5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6, }, // s6
	{  0,  1,  2,  3,  3,  4,  4,  4,  4,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6, 
	   6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, }, // s7
	{  0,  1,  2,  3,  4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7, 
	   7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, }, // s8
	{  0,  1,  2,  3,  4,  4,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8, 
	   8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, }, // s9
	{  0,  1,  2,  3,  4,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9, 
	   9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, }, // s10
	{  0,  1,  2,  3,  4,  5,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9, 10, 
	  10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }, // s11
	{  0,  1,  2,  3,  4,  5,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 
	  10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, }, // s12
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 
	  11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }, // s13
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 
	  12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }, // s14
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 
	  13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, // s15
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 
	  14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }, // s16
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 
	  15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, }, // s17
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 
	  15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, }, // s18
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 
	  16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, }, // s19
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 
	  17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, }, // s20
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 
	  18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, }, // s21
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, 18, 18, 18, 18, 19, 
	  19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, }, // s22
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 19, 19, 19, 
	  20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, }, // s23
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19, 20, 20, 20, 
	  20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, }, // s24
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 21, 21, 
	  21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, }, // s25
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 22, 
	  22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, }, // s26
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 
	  23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, }, // s27
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, }, // s28
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, }, // s29
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, }, // s30
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, }, // s31
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, }, // s32
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 29, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, }, // s33
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, }, // s34
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, }, // s35
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, }, // s36
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, }, // s37
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, }, // s38
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, }, // s39
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, }, // s40
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 41, }, // s41
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, }, // s42
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 42, 43, 43, 43, 43, 43, }, // s43
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 43, 44, 44, 44, 44, 44, }, // s44
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 45, 45, 45, }, // s45
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 46, 46, }, // s46
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, }, // s47
	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
	  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, }, // s48
};


/*
// old stuff starting here - no more used, therefore commented out

// zagzig scan, can be used instead of zigzag scan
static const unsigned char zagscan[] =
{
	 0,  2,  1,  5,  4,  3,  9,  8,
	 7,  6, 14, 13, 12, 11, 10, 20,
	19,	18, 17, 16, 15, 27, 26, 25,
	24, 23, 22, 21, 35, 34, 33, 32,
	31, 30, 29, 28, 42, 41, 40, 39,
	38, 37, 36, 48, 47, 46, 45, 44,
	43, 53, 52, 51, 50, 49, 57, 56,
	55, 54, 60, 59, 58, 62, 61, 63
};

// distance scan, can be used instead of zigzag scan
static const unsigned char distscan[] =
{
	 0,  2,  1,  4,  3,  5,  7,  8,
	12,  6,  9, 11, 13, 17, 18, 10,
	14,	16, 19, 24, 25, 23, 20, 32,
	31, 15, 26, 22, 33, 30, 39, 38,
	40, 27, 21, 34, 29, 41, 37, 46,
	45, 44, 47, 35, 28, 51, 36, 42,
	52, 50, 48, 43, 53, 49, 56, 55,
	54, 57, 59, 60, 58, 62, 61, 63
};

// diagonal / horizontal / vertical scan, don't use this unless you want bad results
static const unsigned char dhvscan[] =
{
	 0,  4, 12, 24, 39, 51, 59, 63,
	 1,  5,  6,  7, 13, 14, 15, 16,
	17, 25, 26, 27, 28, 29, 30, 31,
	40, 41, 42, 43, 44, 45, 52, 53,
	54, 55, 60, 61,
	 2,  3,  8,  9, 10, 11, 18, 19,
	20, 21, 22, 23, 32, 33, 34, 35,
	36, 37, 38, 46, 47, 48, 49, 50,
	56, 57, 58, 62
};

// sign relevancy scan
static const unsigned char sgnscan[] =
{
	 0,  1,  2,  3,  5,  6,  9, 10,
	14, 15, 20, 21, 27, 28, 35,  4,
	 7, 13, 16, 26, 29, 42,  8,	12,
	17, 25, 30, 41, 43,	11, 18, 24,
	31, 40, 44, 53, 19, 23, 32, 39,
	45, 52, 54,	22, 33, 38, 46, 51,
	55, 60, 34, 37, 47, 50, 56, 59,
	61, 36, 48, 49, 57, 58, 62, 63
};

// even/uneven zigzag scan reverse conversion table
static const int even_natural_order[] =
{

	 0,  8,  9,  3,  1, 16,  2, 10, 
	12, 26, 40, 41, 19, 33, 48, 34, 
	35, 49, 57, 43, 42, 56, 50, 36, 
	58, 52, 38, 39, 59, 45, 31, 46, 
	17, 32, 18,  4, 24, 25, 11,  5, 
	27, 13,  7, 21, 20,  6, 14, 28, 
	29, 15, 30, 44, 22, 23, 37, 51, 
	53, 61, 47, 62, 60, 54, 55, 63, 
};

// scans for each frequency 
static const char freqalign[] =
{
	'm', 'v', 'v', 'v', 'v', 'v', 'v', 'v',
	'h', 'm', 'v', 'v', 'v', 'v', 'v', 'v',
	'h', 'h', 'm', 'v', 'v', 'v', 'v', 'v',
	'h', 'h', 'h', 'm', 'v', 'v', 'v', 'v',
	'h', 'h', 'h', 'h', 'm', 'v', 'v', 'v',
	'h', 'h', 'h', 'h', 'h', 'm', 'v', 'v',
	'h', 'h', 'h', 'h', 'h', 'h', 'm', 'v',
	'h', 'h', 'h', 'h', 'h', 'h', 'h', 'm'
};

// chengjie tu subband classification
static const unsigned char ctxclass[] =
{
	0, 1, 3, 3, 3, 6, 6, 6, // 0 -> DC (DC subband)
	2, 5, 5, 5, 6, 6, 6, 6, // 1 -> PV (principal vertical)
	4, 5, 5, 5, 6, 6, 6, 6, // 2 -> PH (principal horizontal)
	4, 5, 5, 6, 6, 6, 6, 6, // 3 -> LV (low-frequency vertical)
	4, 6, 6, 6, 6, 6, 6, 6, // 4 -> LH (low-frequency horizontal)
	6, 6, 6, 6, 6, 6, 6, 6, // 5 -> LD (low-frequency diagonal)
	6, 6, 6, 6, 6, 6, 6, 6, // 6 -> HP (high-pass)
	6, 6, 6, 6, 6, 6, 6, 6
};

// context weighting for subband classification
static const signed int ctx_weights[ 7 ][ 3 ][ 5 ] =
{
	{ // 0 -> DC (DC subband)
		{  0,  0,  2,  0,  0 },
		{  0,  3,  4,  3,  0 },
		{  2,  4,  0,  0,  0 }
	},
	{ // 1 -> PV (principal vertical)
		{  0,  0,  3,  0,  0 },
		{  0,  0,  6,  0,  0 },
		{  0,  0,  0,  0,  0 }
	},
	{ // 2 -> PH (principal horizontal)
		{  0,  0,  0,  0,  0 },
		{  0,  0,  0,  0,  0 },
		{  3,  6,  0,  0,  0 }
	},
	{ // 3 -> LV (low-frequency vertical)
		{  0,  0,  3,  0,  0 },
		{  0,  1,  6,  1,  0 },
		{  0,  1,  0,  0,  0 }
	},
	{ // 4 -> LH (low-frequency horizontal)
		{  0,  0,  0,  0,  0 },
		{  0,  1,  1,  1,  0 },
		{  3,  6,  0,  0,  0 }
	},
	{ // 5 -> LD (low-frequency diagonal)
		{  0,  0,  2,  0,  0 },
		{  0,  3,  4,  3,  0 },
		{  2,  4,  0,  0,  0 }
	},
	{ // 6 -> HP (high-pass)
		{  0,  0,  2,  0,  0 },
		{  0,  3,  4,  3,  0 },
		{  2,  4,  0,  0,  0 }
	}
};

// context weighting for each band (from mixedlum27 set)
static const signed int abs_ctx_weights[ 64 ][ 3 ][ 5 ] =
{
	{ // DCT(0/0)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 11,  8,  0, },
		{  9, 13,  0,  0,  0, },
	},
	{ // DCT(1/0)
		{  0,  0,  7,  0,  0, },
		{  0,  4, 30,  6,  0, },
		{  5,  6,  0,  0,  0, },
	},
	{ // DCT(0/1)
		{  0,  0,  4,  0,  0, },
		{  0,  3,  3,  6,  0, },
		{  7, 35,  0,  0,  0, },
	},
	{ // DCT(0/2)
		{  0,  0,  5,  0,  0, },
		{  0,  2,  5,  6,  0, },
		{ 10, 29,  0,  0,  0, },
	},
	{ // DCT(1/1)
		{  0,  0,  4,  0,  0, },
		{  0,  7, 13, 11,  0, },
		{  5, 16,  0,  0,  0, },
	},
	{ // DCT(2/0)
		{  0,  0, 10,  0,  0, },
		{  0,  2, 27,  6,  0, },
		{  5,  8,  0,  0,  0, },
	},
	{ // DCT(3/0)
		{  0,  0, 11,  0,  0, },
		{  0,  2, 24,  6,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(2/1)
		{  0,  0,  5,  0,  0, },
		{  0,  8, 15, 10,  0, },
		{  6, 12,  0,  0,  0, },
	},
	{ // DCT(1/2)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9, 11,  0, },
		{  7, 17,  0,  0,  0, },
	},
	{ // DCT(0/3)
		{  0,  0,  6,  0,  0, },
		{  0,  3,  6,  6,  0, },
		{ 11, 26,  0,  0,  0, },
	},
	{ // DCT(0/4)
		{  0,  0,  6,  0,  0, },
		{  0,  3,  6,  7,  0, },
		{ 11, 24,  0,  0,  0, },
	},
	{ // DCT(1/3)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  9, 10,  0, },
		{  8, 17,  0,  0,  0, },
	},
	{ // DCT(2/2)
		{  0,  0,  5,  0,  0, },
		{  0,  9, 11, 11,  0, },
		{  7, 13,  0,  0,  0, },
	},
	{ // DCT(3/1)
		{  0,  0,  6,  0,  0, },
		{  0,  7, 16, 10,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(4/0)
		{  0,  0, 11,  0,  0, },
		{  0,  3, 22,  6,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(5/0)
		{  0,  0, 11,  0,  0, },
		{  0,  3, 19,  6,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(4/1)
		{  0,  0,  7,  0,  0, },
		{  0,  7, 15,  9,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(3/2)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 13, 10,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(2/3)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 10, 11,  0, },
		{  7, 14,  0,  0,  0, },
	},
	{ // DCT(1/4)
		{  0,  0,  7,  0,  0, },
		{  0,  6,  9, 10,  0, },
		{  8, 16,  0,  0,  0, },
	},
	{ // DCT(0/5)
		{  0,  0,  5,  0,  0, },
		{  0,  3,  6,  6,  0, },
		{ 13, 24,  0,  0,  0, },
	},
	{ // DCT(0/6)
		{  0,  0,  5,  0,  0, },
		{  0,  3,  6,  6,  0, },
		{ 13, 20,  0,  0,  0, },
	},
	{ // DCT(1/5)
		{  0,  0,  7,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  8, 15,  0,  0,  0, },
	},
	{ // DCT(2/4)
		{  0,  0,  7,  0,  0, },
		{  0,  8, 10, 10,  0, },
		{  7, 13,  0,  0,  0, },
	},
	{ // DCT(3/3)
		{  0,  0,  7,  0,  0, },
		{  0,  9, 10, 11,  0, },
		{  7, 12,  0,  0,  0, },
	},
	{ // DCT(4/2)
		{  0,  0,  7,  0,  0, },
		{  0,  8, 12,  9,  0, },
		{  8, 11,  0,  0,  0, },
	},
	{ // DCT(5/1)
		{  0,  0,  7,  0,  0, },
		{  0,  7, 13,  9,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(6/0)
		{  0,  0, 12,  0,  0, },
		{  0,  3, 18,  5,  0, },
		{  5,  7,  0,  0,  0, },
	},
	{ // DCT(7/0)
		{  0,  0, 13,  0,  0, },
		{  0,  3, 19,  3,  0, },
		{  5,  6,  0,  0,  0, },
	},
	{ // DCT(6/1)
		{  0,  0,  7,  0,  0, },
		{  0,  6, 11,  8,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(5/2)
		{  0,  0,  7,  0,  0, },
		{  0,  7, 11,  8,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(4/3)
		{  0,  0,  6,  0,  0, },
		{  0,  8, 10, 10,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(3/4)
		{  0,  0,  7,  0,  0, },
		{  0,  8, 10, 10,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(2/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(1/6)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  8,  8,  0, },
		{  8, 12,  0,  0,  0, },
	},
	{ // DCT(0/7)
		{  0,  0,  3,  0,  0, },
		{  0,  1,  4,  4,  0, },
		{ 17, 24,  0,  0,  0, },
	},
	{ // DCT(1/7)
		{  0,  0,  5,  0,  0, },
		{  0,  5,  7,  7,  0, },
		{  6, 11,  0,  0,  0, },
	},
	{ // DCT(2/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  7,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(3/5)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  7, 11,  0,  0,  0, },
	},
	{ // DCT(4/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  9,  0, },
		{  7, 10,  0,  0,  0, },
	},
	{ // DCT(5/3)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  7,  9,  0,  0,  0, },
	},
	{ // DCT(6/2)
		{  0,  0,  7,  0,  0, },
		{  0,  6,  9,  7,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(7/1)
		{  0,  0,  8,  0,  0, },
		{  0,  7, 11,  8,  0, },
		{  8,  9,  0,  0,  0, },
	},
	{ // DCT(7/2)
		{  0,  0,  7,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  8, 10,  0,  0,  0, },
	},
	{ // DCT(6/3)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  9,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(5/4)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  8,  8,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(4/5)
		{  0,  0,  5,  0,  0, },
		{  0,  7,  9,  8,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(3/6)
		{  0,  0,  6,  0,  0, },
		{  0,  7,  7,  7,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(2/7)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  6,  6,  0, },
		{  6, 10,  0,  0,  0, },
	},
	{ // DCT(3/7)
		{  0,  0,  5,  0,  0, },
		{  0,  6,  6,  6,  0, },
		{  6,  9,  0,  0,  0, },
	},
	{ // DCT(4/6)
		{  0,  0,  6,  0,  0, },
		{  0,  5,  7,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(5/5)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  7,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(6/4)
		{  0,  0,  5,  0,  0, },
		{  0,  5,  7,  7,  0, },
		{  6,  8,  0,  0,  0, },
	},
	{ // DCT(7/3)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  9,  7,  0, },
		{  7,  8,  0,  0,  0, },
	},
	{ // DCT(7/4)
		{  0,  0,  6,  0,  0, },
		{  0,  5,  7,  6,  0, },
		{  7,  8,  0,  0,  0, },
	},
	{ // DCT(6/5)
		{  0,  0,  5,  0,  0, },
		{  0,  5,  6,  6,  0, },
		{  6,  6,  0,  0,  0, },
	},
	{ // DCT(5/6)
		{  0,  0,  5,  0,  0, },
		{  0,  5,  6,  6,  0, },
		{  5,  8,  0,  0,  0, },
	},
	{ // DCT(4/7)
		{  0,  0,  5,  0,  0, },
		{  0,  5,  7,  5,  0, },
		{  7,  7,  0,  0,  0, },
	},
	{ // DCT(5/7)
		{  0,  0,  7,  0,  0, },
		{  0,  3,  7,  6,  0, },
		{  6,  7,  0,  0,  0, },
	},
	{ // DCT(6/6)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  5,  6,  0, },
		{  5,  6,  0,  0,  0, },
	},
	{ // DCT(7/5)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  7,  5,  0, },
		{  7,  8,  0,  0,  0, },
	},
	{ // DCT(7/6)
		{  0,  0,  5,  0,  0, },
		{  0,  4,  7,  5,  0, },
		{  5,  6,  0,  0,  0, },
	},
	{ // DCT(6/7)
		{  0,  0,  6,  0,  0, },
		{  0,  6,  6,  6,  0, },
		{  6,  7,  0,  0,  0, },
	},
	{ // DCT(7/7)
		{  0,  0, 10,  0,  0, },
		{  0,  4,  8,  5,  0, },
		{ 11,  8,  0,  0,  0, },
	},
};
*/
