-
-
Save aqrit/551493929d14e7e297fb39b2f1aeca00 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stddef.h> // size_t | |
#include <stdint.h> | |
#include <smmintrin.h> // sse4.1 | |
#include <string.h> // memcpy | |
static const uint8_t dec_table[256*16] = { | |
0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, | |
0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, | |
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x03, 0x04, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x02, 0x03, 0x04, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, | |
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x07, 0x08, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0x07, 0x08, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0x07, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0x07, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x02, 0x03, 0x04, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0x06, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0x06, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0x04, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x02, 0x03, 0x04, 0xFF, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x03, 0xFF, 0xFF, 0xFF, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x02, 0x03, 0xFF, 0xFF, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x01, 0x02, 0x03, 0xFF, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F | |
}; | |
// misaligned pointers are UB | |
static inline uint64_t unaligned_load_u64 (const void *ptr) { | |
uint64_t data; | |
memcpy(&data, ptr, sizeof(data)); | |
return data; | |
} | |
// 2-bits per each rounded up to byte boundry | |
static inline uint32_t calc_key_block_length(uint32_t count) { | |
return (count >> 2) + (((count & 3) + 3) >> 2); | |
} | |
// unroll helper | |
#define DECODE(n, key) \ | |
do{ \ | |
const uint8_t* p = &dec_table[(key)*16]; \ | |
__m128i shuf = _mm_loadu_si128((__m128i*) p); \ | |
data_ptr -= *p; \ | |
__m128i data = _mm_loadu_si128((__m128i*) &data_ptr[n*16]); \ | |
data = _mm_shuffle_epi8(data, shuf); \ | |
_mm_storeu_si128((__m128i*)&out[n*4], data); \ | |
} while(0); | |
size_t streamvbyte_decodex( | |
const uint8_t *restrict in, | |
uint32_t *restrict out, | |
uint32_t count) | |
{ | |
// key block is followed by a variable length literal data block | |
uint32_t key_block_len = calc_key_block_length(count); | |
const uint8_t *restrict key_ptr = in; | |
const uint8_t *restrict data_ptr = &in[key_block_len]; | |
for(uint32_t i = 0; i < ((count >> 2) & ~15); i+=16) | |
{ | |
uint64_t keys0 = unaligned_load_u64(&key_ptr[i]); | |
DECODE(0, keys0 & 0xFF); | |
DECODE(1, (keys0 & 0xFF00) >> 8); | |
keys0 >>= 16; | |
DECODE(2, keys0 & 0xFF); | |
DECODE(3, (keys0 & 0xFF00) >> 8); | |
keys0 >>= 16; | |
DECODE(4, keys0 & 0xFF); | |
DECODE(5, (keys0 & 0xFF00) >> 8); | |
keys0 >>= 16; | |
DECODE(6, keys0 & 0xFF); | |
DECODE(7, (keys0 & 0xFF00) >> 8); | |
uint64_t keys1 = unaligned_load_u64(&key_ptr[i+8]); | |
DECODE(8, keys1 & 0xFF); | |
DECODE(9, (keys1 & 0xFF00) >> 8); | |
keys1 >>= 16; | |
DECODE(10, keys1 & 0xFF); | |
DECODE(11, (keys1 & 0xFF00) >> 8); | |
keys1 >>= 16; | |
DECODE(12, keys1 & 0xFF); | |
DECODE(13, (keys1 & 0xFF00) >> 8); | |
keys1 >>= 16; | |
DECODE(14, keys1 & 0xFF); | |
DECODE(15, (keys1 & 0xFF00) >> 8); | |
out += 4*16; | |
data_ptr += 16*16; | |
} | |
// todo: tail loop... | |
return 0; | |
} | |
#include <stdio.h> | |
#include <stdint.h> | |
#include <inttypes.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <inttypes.h> // PRIu64 | |
#define RDTSC_START(cycles) \ | |
do{ \ | |
register unsigned cyc_high, cyc_low; \ | |
__asm volatile("cpuid\n\t" \ | |
"rdtsc\n\t" \ | |
"cpuid\n\t" \ | |
"rdtsc\n\t" \ | |
"cpuid\n\t" \ | |
"rdtsc\n\t" \ | |
"mov %%edx, %0\n\t" \ | |
"mov %%eax, %1\n\t" \ | |
: "=r"(cyc_high), "=r"(cyc_low) \ | |
::"%rax", "%rbx", "%rcx", "%rdx", "memory"); \ | |
(cycles) = ((uint64_t)cyc_high << 32) | cyc_low; \ | |
}while(0) | |
#define RDTSC_FINAL(cycles) \ | |
do{ \ | |
register unsigned cyc_high, cyc_low; \ | |
__asm volatile("rdtscp\n\t" \ | |
"mov %%edx, %0\n\t" \ | |
"mov %%eax, %1\n\t" \ | |
"cpuid\n\t" \ | |
: "=r"(cyc_high), "=r"(cyc_low) \ | |
::"%rax", "%rbx", "%rcx", "%rdx", "memory"); \ | |
(cycles) = ((uint64_t)cyc_high << 32) | cyc_low; \ | |
}while(0) | |
#include "streamvbyte.h" | |
int main (void) | |
{ | |
uint8_t buf0[0x200000]; | |
uint8_t buf1[0x200000]; | |
uint8_t buf2[0x200000]; | |
// fill with all possible 16-byte 0x00/0xFF combinations | |
uint8_t* p = buf0; | |
for( int i = 0; i < 0x10000; i++ ){ | |
p[0] = (uint8_t)(((i >> 0) & 1) - 1) & rand(); | |
p[1] = (uint8_t)(((i >> 1) & 1) - 1) & rand(); | |
p[2] = (uint8_t)(((i >> 2) & 1) - 1) & rand(); | |
p[3] = (uint8_t)(((i >> 3) & 1) - 1) & rand(); | |
p[4] = (uint8_t)(((i >> 4) & 1) - 1) & rand(); | |
p[5] = (uint8_t)(((i >> 5) & 1) - 1) & rand(); | |
p[6] = (uint8_t)(((i >> 6) & 1) - 1) & rand(); | |
p[7] = (uint8_t)(((i >> 7) & 1) - 1) & rand(); | |
p[8] = (uint8_t)(((i >> 8) & 1) - 1) & rand(); | |
p[9] = (uint8_t)(((i >> 9) & 1) - 1) & rand(); | |
p[10] = (uint8_t)(((i >> 10) & 1) - 1) & rand(); | |
p[11] = (uint8_t)(((i >> 11) & 1) - 1) & rand(); | |
p[12] = (uint8_t)(((i >> 12) & 1) - 1) & rand(); | |
p[13] = (uint8_t)(((i >> 13) & 1) - 1) & rand(); | |
p[14] = (uint8_t)(((i >> 14) & 1) - 1) & rand(); | |
p[15] = (uint8_t)(((i >> 15) & 1) - 1) & rand(); | |
p += 16; | |
} | |
streamvbyte_encode((uint32_t*)buf0, 0x100000 >> 2, buf1); | |
{ | |
printf("%24s: ", "decode_new"); | |
uint64_t tm1, tm2; | |
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF; | |
for(int i = 0; i < 10000; i++){ | |
RDTSC_START(tm1); | |
streamvbyte_decodex(buf1, (uint32_t*)buf2, 0x100000 >> 2); | |
RDTSC_FINAL(tm2); | |
uint64_t tmus = tm2 - tm1; | |
if(tmus < min_diff) min_diff = tmus; | |
} | |
printf("%10" PRIu64 "\n", min_diff); | |
} | |
{ | |
printf("%24s: ", "decode_orig"); | |
uint64_t tm1, tm2; | |
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF; | |
for(int i = 0; i < 10000; i++){ | |
RDTSC_START(tm1); | |
streamvbyte_decode(buf1, (uint32_t*)buf2, 0x100000 >> 2); | |
RDTSC_FINAL(tm2); | |
uint64_t tmus = tm2 - tm1; | |
if(tmus < min_diff) min_diff = tmus; | |
} | |
printf("%10" PRIu64 "\n", min_diff); | |
} | |
{ | |
printf("%24s: ", "decode_new"); | |
uint64_t tm1, tm2; | |
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF; | |
for(int i = 0; i < 10000; i++){ | |
RDTSC_START(tm1); | |
streamvbyte_decodex(buf1, (uint32_t*)buf2, 0x100000 >> 2); | |
RDTSC_FINAL(tm2); | |
uint64_t tmus = tm2 - tm1; | |
if(tmus < min_diff) min_diff = tmus; | |
} | |
printf("%10" PRIu64 "\n", min_diff); | |
} | |
{ | |
printf("%24s: ", "decode_orig"); | |
uint64_t tm1, tm2; | |
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF; | |
for(int i = 0; i < 10000; i++){ | |
RDTSC_START(tm1); | |
streamvbyte_decode(buf1, (uint32_t*)buf2, 0x100000 >> 2); | |
RDTSC_FINAL(tm2); | |
uint64_t tmus = tm2 - tm1; | |
if(tmus < min_diff) min_diff = tmus; | |
} | |
printf("%10" PRIu64 "\n", min_diff); | |
} | |
{ | |
printf("%24s: ", "decode_new"); | |
uint64_t tm1, tm2; | |
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF; | |
for(int i = 0; i < 10000; i++){ | |
RDTSC_START(tm1); | |
streamvbyte_decodex(buf1, (uint32_t*)buf2, 0x100000 >> 2); | |
RDTSC_FINAL(tm2); | |
uint64_t tmus = tm2 - tm1; | |
if(tmus < min_diff) min_diff = tmus; | |
} | |
printf("%10" PRIu64 "\n", min_diff); | |
} | |
if(memcmp(buf0,buf2,0x100000) == 0){ | |
printf("ok\n"); | |
} else { | |
printf("fail\n"); | |
} | |
printf("\n\ndone\n"); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment